From: Andrew Hewus Fresh Subject: OpenBSD perl 5.38.2 - Call for Testing To: tech@openbsd.org Date: Wed, 21 Feb 2024 13:29:30 -0800 Here is a patch to bring perl in base to 5.38.2: https://cvs.afresh1.com/~andrew/perl-update/OpenBSD-perl-5.38.2.patch And one for the sets if you want to build a release: https://cvs.afresh1.com/~andrew/perl-update/OpenBSD-perl-5.38.2-sets.patch 5.38.1 was a broken release, and 5.38.2 was a security release, similar to 5.36.3. The big news in this release is the new "class" feature, which is a new object system for perl, plus as seeming always a Unicode update to 15.0. The one that is a slightly more important for folks to look at is the new PERL_RAND_SEED environment variable, as I had to adjust our patch to use srand48_determinsitic when folks don't actually want random numbers. So, additional eyes on that change would be extra nice. https://github.com/afresh1/OpenBSD-perl/blob/perl-5.38.2/patches/GOOD/use_our_drand48.patch There were a bunch of other changes that you can see in the perldelta: https://metacpan.org/release/PEVANS/perl-5.38.2/view/pod/perl5380delta.pod I had this nearly ready ~2 weeks ago before heading to South America to visit family for vacation, which is continuing for another week, at which point I will be incredibly busy with work and other catching up. So, you have some time for testing! You can see the OpenBSD changes to perl itself and get the code to run tests on different architectures in this github repo (see the README): https://github.com/afresh1/OpenBSD-perl/tree/perl-5.38.2 https://github.com/afresh1/OpenBSD-perl/archive/refs/heads/perl-5.38.2.tar.gz When I get back, I'll run more tests on any missing architectures I have, but if you do it for me, that will save some time. The upstream version of perl is available from the metacpan. https://metacpan.org/release/PEVANS/perl-5.38.2 If you wish to apply the attached patch to build a release, copy the patch into your src checkout (or adjust the paths below) # This, unfortunately, requires devel/gpatch gpatch -p0 -uNE < OpenBSD-perl-5.38.2.patch # Remove patch cruft find gnu/usr.bin/perl -name '*.orig' -delete # Add this empty file that needs to exist, but patch -E removes touch gnu/usr.bin/perl/dist/threads/threads.h # Clean up any now empty directories cd gnu/usr.bin/perl && find -d . \ \( -type d -o -path '*/CVS' -prune \) \ ! -name CVS \ -exec test -e {}/CVS \; \ -execdir sh -c 'test $( ls -1 {} | grep -v '^CVS/$' | wc -l ) -eq 0' \; \ -exec rm -r {} \; Index: gnu/usr.bin/perl/.travis.yml =================================================================== RCS file: gnu/usr.bin/perl/.travis.yml diff -N gnu/usr.bin/perl/.travis.yml --- gnu/usr.bin/perl/.travis.yml 15 Feb 2023 01:32:01 -0000 1.1.1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,69 +0,0 @@ -language: c -cache: ccache - -os: - - linux - -compiler: - - gcc - -install: - - git fetch --unshallow --tags # t/porting/cmp_version.t - # install & enable ccache on osx - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update && brew install ccache; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export PATH="/usr/local/opt/ccache/libexec:$PATH"; fi - -env: - global: - - JOBS=4 - matrix: - # exercise a variety of build options - # threads often cause build issues - - CONFIGURE_ARGS='-Uusethreads' - - CONFIGURE_ARGS='-Dusethreads' - # check long doubles - - CONFIGURE_ARGS='-Duseshrplib -Dusesitecustomize -Duselongdouble' - # exercise quadmath - - CONFIGURE_ARGS='-Duseshrplib -Dusequadmath -Dusecbacktrace -Dusethreads' - -matrix: - fast_finish: true - -script: - - ./Configure -des -Dusedevel -Uversiononly -Dcc="ccache $CC" $CONFIGURE_ARGS -Dprefix=$HOME/perl-blead -DDEBUGGING -# all script commands are always run -# rather than using one very long oneliner using '&&', just always check the build status - - if [ "x$TRAVIS_TEST_RESULT" = "x0" ]; then TEST_JOBS=$JOBS make -j$JOBS test_harness_notty; fi - - if [ "x$TRAVIS_TEST_RESULT" = "x0" ]; then make -j$JOBS install; fi - - if [ "x$TRAVIS_TEST_RESULT" = "x0" ]; then $HOME/perl-blead/bin/perlivp; fi - -addons: - apt: - packages: - - file - - cpio - - libdb-dev - - libgdbm-dev - - zlib1g-dev - - libbz2-dev - -notifications: -## use dedicated email for smoking ? -# email: -# recipients: -# - perl5-porters@perl.org -# on_success: never # default: change -# on_failure: always # default: always - irc: - nick: travisci - channels: - - "irc.perl.org#p5p-qa" -# - "irc.perl.org#bot-test" - template: - - "Report for %{repository} (%{commit}) from %{author} (%{elapsed_time})" - - "Status: %{message}" - - "Build URL: %{build_url}" - - "GitHub URL: https://github.com/%{repository_slug}/commit/%{commit}" - on_success: change # default: always - on_failure: always # default: always -# use_notice: true Index: gnu/usr.bin/perl/AUTHORS =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/AUTHORS,v diff -u -p -a -u -p -r1.11 AUTHORS --- gnu/usr.bin/perl/AUTHORS 8 Jul 2023 14:18:35 -0000 1.11 +++ gnu/usr.bin/perl/AUTHORS 21 Feb 2024 15:47:00 -0000 @@ -12,10 +12,13 @@ # is strictly forbidden. (Passive distribution with the Perl source # code kit is, of course, allowed.) # -# This should contain the preferred addresses. Alternate addresses are in -# Porting/checkAUTHORS.pl. -# -# updated_by: ./Porting/checkAUTHORS.pl --update --from=v5.30.0 +# This file contains the "canonical" or "preferred" details for our +# contributors, and is managed by the Porting/updateAUTHORS.pl script, +# along with .mailmap and Porting/exclude_contrib.txt. Generally you +# should use the script to make any changes to this file, especially if +# you wish to remove yourself. If you wish to register a new email +# against one of these names you should update the .mailmap file +# instead. -- A. C. Yardley A. Sinan Unur @@ -56,7 +59,8 @@ Albert Chin-A-Young Alberto Simões Alessandro Forghieri -Alex Davies +Alex +Alex Davies Alex Gough Alex Solovey Alex Vandiver @@ -69,6 +73,7 @@ Alexander Gernler Alexander Hartmaier Alexander Klimov +Alexander Nikolov Alexander Smishlajev Alexander Voronov Alexandr Ciornii @@ -106,6 +111,7 @@ Andrew Hamm Andrew Pimlott Andrew Rodland +Andrew Ruthven Andrew Savige Andrew Tam Andrew Vignaux @@ -128,6 +134,7 @@ Aristotle Pagaltzis Arkturuz Arne Ahrend +Arne Johannessen Arnold D. Robbins Art Green Art Haas @@ -148,6 +155,8 @@ Bah Barry Friedman Bart Kedryna +Bart Van Assche +Bartosz Jarzyna Bas van Sisseren Beau Cox Ben Carter @@ -217,6 +226,7 @@ Brian S. Cashman Brooks D. Boyd Bruce Barnett +Bruce Gray Bruce J. Keeler Bruce P. Schuck Bryan Stenson @@ -283,6 +293,7 @@ Chunhui Teng Clark Cooper Claudio Ramirez +Clemens Wasser Clinton A. Pierce Clinton Gormley Colin Kuskie @@ -331,6 +342,7 @@ Daniel P. Berrange Daniel S. Lewart Daniel Yacob +danielnachun Danny R. Faught Danny Rathjens Danny Sadinoff @@ -425,6 +437,7 @@ Earl Hood Ed Avis Ed J Ed Mooring +Ed Sabol Ed Santiago Eddy Tan Edgar Bering @@ -443,7 +456,6 @@ Eric Brine Eric Fifer Eric Herman -Eric Lindblad Eric Melville Eric Promislow Erich Rickheit @@ -459,8 +471,10 @@ Fabien Tassin Felipe Gasper Felix Gallo +Ferenc Erki Fergal Daly Fingle Nark +Firas Khalil Khana Florent Guillaume Florian Ragwitz Florian Weimer @@ -499,7 +513,6 @@ Gideon Israel Dsouza Giovanni Tataranni Gisle Aas -GitHub Glenn D. Golden Glenn Linderman Gomar @@ -721,6 +734,7 @@ John W. Krahn John Wright Johnny Lam Jon Eveland +Jon Gentle Jon Gunnip Jon Orwant Jonathan Biggar @@ -780,6 +794,7 @@ Ken Williams Kenneth Albanowski Kenneth Duda +Kenneth Ölwing Kent Fredric Keong Lim Kevin Brintnall @@ -800,6 +815,7 @@ Kragen Sitaker Kriton Kyrimis Kurt D. Starsinic +Kurt Fitzner Kyriakos Georgiou Lajos Veres Larry Parmelee @@ -822,9 +838,11 @@ Leon Brocard Les Peters Lesley Binks +Li Linjie Lincoln D. Stein Linda Walsh Lionel Cons +Loren Merritt Louis Strous Lubomir Rintel Luc St-Louis @@ -850,6 +868,7 @@ Marc Reisner Marc-Philip Werner Marcel Grünauer +Marcel Telka Marco Fontani Marco Peereboom Marcus Holland-Moritz @@ -864,7 +883,7 @@ Mark Dootson Mark Hanson Mark J. Reed -Mark Jason Dominus +Mark Jason Dominus Mark K Trettin Mark Kaehny Mark Kettenis @@ -879,6 +898,7 @@ Mark P. Lutz Mark Pizzolato Mark R. Levinson +Mark Shelor Mark Stosberg Marko Asplund Markus Jansen @@ -916,13 +936,14 @@ Matt Turner Matthew Green Matthew Horsfall +Matthew O. Persico Matthew Sachs Matthew T Harden Matthias Bethke Matthias Ulrich Neeracher Matthias Urlichs Matthijs van Duin -Mattia Barbon +Mattia Barbon Maurizio Loreti Max Baker Max Maischein @@ -972,6 +993,7 @@ Mikhail Zabaluev Milton L. Hankins Misty De Meo +Mohammad S Anwar Mohammed El-Afifi Moritz Lenz Moshe Kaminsky @@ -980,6 +1002,7 @@ Mr. Nobody Nathan Glenn Nathan Kurz +Nathan Mills <38995150+quipyowert2@users.noreply.github.com> Nathan Torkington Nathan Trapuzzano Neale Ferguson @@ -998,6 +1021,7 @@ Nick Johnston Nick Williams Nicolas Kaiser +Nicolas Mendoza Nicolas R Niels Thykier Nigel Sandever @@ -1080,6 +1104,7 @@ Peter J. Farley III Peter Jaspers-Fayer Peter John Acklam +Peter Levine Peter Liscovius Peter Martini Peter O'Gorman @@ -1246,12 +1271,12 @@ Shirakata Kentaro Shlomi Fish Shoichi Kaji +Sidney Markowitz Simon Cozens Simon Glover Simon Leinen Simon Parsons Simon Schubert -Sinan Unur Sisyphus Sizhe Zhao Slaven Rezic @@ -1370,6 +1395,7 @@ Torsten Foertsch Trevor Blackwell Tsutomu IKEGAMI +Tsuyoshi Watanabe Tuomas J. Lukka Tye McQueen Ulrich Habel @@ -1389,12 +1415,12 @@ Vincent Pit Vitali Peil vividsnow -vividsnow @vividsnow Vlad Harchev Vladimir Alexiev Vladimir Marek Vladimir Timofeev Volker Schatz +vsfos W. Geoffrey Rommel W. Phillip Moore Wallace Reis @@ -1437,3 +1463,4 @@ Zefram Ævar Arnfjörð Bjarmason Михаил Козачков +小鸡 <345865759@163.com> Index: gnu/usr.bin/perl/Configure =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Configure,v diff -u -p -a -u -p -r1.54 Configure --- gnu/usr.bin/perl/Configure 8 Jul 2023 14:18:35 -0000 1.54 +++ gnu/usr.bin/perl/Configure 21 Feb 2024 15:47:00 -0000 @@ -391,6 +391,7 @@ d_attribute_nonnull='' d_attribute_noreturn='' d_attribute_pure='' d_attribute_unused='' +d_attribute_visibility='' d_attribute_warn_unused_result='' d_printf_format_null='' d_backtrace='' @@ -761,6 +762,7 @@ d_semget='' d_semop='' d_sendmsg='' d_setegid='' +d_setenv='' d_seteuid='' d_setgrent='' d_setgrent_r='' @@ -1069,6 +1071,7 @@ i_sysselct='' i_sysstat='' i_sysstatfs='' i_sysstatvfs='' +i_syssyscall='' i_systimes='' i_systypes='' i_sysuio='' @@ -1207,6 +1210,11 @@ version_patchlevel_string='' perl5='' perladmin='' perlpath='' +i32dformat='' +u32XUformat='' +u32oformat='' +u32uformat='' +u32xformat='' d_nv_preserves_uv='' d_nv_zero_is_allbits_zero='' i16size='' @@ -1503,7 +1511,7 @@ archname='' usereentrant='undef' : List of libraries we want. : If anyone needs extra -lxxx, put those in a hint file. -libswanted="cl pthread socket bind inet nsl ndbm gdbm dbm db malloc dl ld" +libswanted="cl pthread socket bind inet ndbm gdbm dbm db malloc dl ld" libswanted="$libswanted sun m crypt sec util c cposix posix ucb bsd BSD" : We probably want to search /usr/shlib before most other libraries. : This is only used by the lib/ExtUtils/MakeMaker.pm routine extliblist. @@ -2213,6 +2221,7 @@ $startsh xxxm=\$dflt $myecho ans='!' +counter=42 case "\$fastread" in yes) case "\$dflt" in '') ;; @@ -2287,6 +2296,12 @@ while expr "X\$ans" : "X!" >/dev/null; d $myecho ;; esac + counter=\`echo \$counter | awk '{ print --\$0 }'\` + if [ \$counter = 0 ]; then + echo >&4 + echo >&4 Too many attempts asking the same question. Giving up. + exit 1 + fi done case "\$ans" in '') ans="\$xxxm";; @@ -3492,7 +3507,10 @@ EOM osvers="$3" ;; dragonfly) osname=dragonfly - osvers="$3" + case "$3" in + [0-9]*) osvers="$3" ;; + *) osvers="$2" ;; + esac ;; dynixptx*) osname=dynixptx osvers=`echo "$4"|sed 's/^v//'` @@ -3665,47 +3683,47 @@ EOM fi fi - case "$targetarch" in - '') ;; - *) hostarch=$osname - case "$targetarch" in - nto*|*-nto-*) - # Will load qnx.sh, which should change osname to nto - osname=qnx - osvers='' - ;; - *linux-android*) - # Catch arm-linux-androideabi, mipsel-linux-android, - # and i686-linux-android - osname=linux-android - osvers='' - ;; - *linux*) - # Something like arm-linux-gnueabihf is really just - # plain linux. - osname=linux - osvers='' - ;; - *solaris*|*sunos*) - osname=solaris - # XXX perhaps we should just assume - # osvers to be 2, or maybe take the value - # from targetarch. Using $run before the - # hints are run is somewhat icky. - set X `$run $uname -a 2>/dev/null` - shift - case "$3" in - 5*) osvers=`echo $3 | $sed 's/^5/2/g'` ;; - *) osvers="$3" ;; - esac - ;; - *) + case "$targetarch" in + '') ;; + *) hostarch=$osname + case "$targetarch" in + nto*|*-nto-*) + # Will load qnx.sh, which should change osname to nto + osname=qnx + osvers='' + ;; + *linux-android*) + # Catch arm-linux-androideabi, mipsel-linux-android, + # and i686-linux-android + osname=linux-android + osvers='' + ;; + *linux*) + # Something like arm-linux-gnueabihf is really just + # plain linux. + osname=linux + osvers='' + ;; + *solaris*|*sunos*) + osname=solaris + # XXX perhaps we should just assume + # osvers to be 2, or maybe take the value + # from targetarch. Using $run before the + # hints are run is somewhat icky. + set X `$run $uname -a 2>/dev/null` + shift + case "$3" in + 5*) osvers=`echo $3 | $sed 's/^5/2/g'` ;; + *) osvers="$3" ;; + esac + ;; + *) osname=`echo $targetarch|sed 's,^[^-]*-,,'` osvers='' - ;; - esac - ;; - esac + ;; + esac + ;; + esac : Now look for a hint file osname_osvers, unless one has been : specified already. @@ -5207,26 +5225,6 @@ EOM esac fi -: Check if quadmath is requested -case "$usequadmath" in -"$define"|true|[yY]*) usequadmath="$define" ;; -*) usequadmath="$undef" ;; -esac - -: Fail if both uselongdouble and usequadmath are requested -case "$usequadmath:$uselongdouble" in -define:define) - $cat <&4 - -*** You requested the use of the quadmath library and use -*** of long doubles. -*** -*** Please select one or the other. -EOM - exit 1 - ;; -esac - : Looking for optional libraries echo " " echo "Checking for optional libraries..." >&4 @@ -5243,9 +5241,6 @@ esac case "$usecbacktrace" in "$define") libswanted="$libswanted bfd" ;; esac -case "$usequadmath" in -"$define") libswanted="$libswanted quadmath" ;; -esac libsfound='' libsfiles='' libsdirs='' @@ -5265,6 +5260,16 @@ for thislib in $libswanted; do $test -f "$xxx" && libstyle=shared fi if test ! -f "$xxx"; then + xxx=$thisdir/lib$thislib.$so$_a + $test -f "$xxx" && eval $libscheck + $test -f "$xxx" && libstyle="import" + fi + if test ! -f "$xxx"; then + xxx=$thisdir/$thislib.$so$_a + $test -f "$xxx" && eval $libscheck + $test -f "$xxx" && libstyle="import" + fi + if test ! -f "$xxx"; then xxx=$thisdir/lib$thislib.$so $test -f "$xxx" && eval $libscheck $test -f "$xxx" && libstyle=shared @@ -5299,14 +5304,14 @@ for thislib in $libswanted; do case " $dflt " in *"-l$thislib "*);; *) dflt="$dflt -l$thislib" - libsfound="$libsfound $xxx" - yyy=`basename $xxx` - libsfiles="$libsfiles $yyy" - yyy=`echo $xxx|$sed -e "s%/$yyy\\$%%"` - case " $libsdirs " in - *" $yyy "*) ;; - *) libsdirs="$libsdirs $yyy" ;; - esac + libsfound="$libsfound $xxx" + yyy=`basename $xxx` + libsfiles="$libsfiles $yyy" + yyy=`echo $xxx|$sed -e "s%/$yyy\\$%%"` + case " $libsdirs " in + *" $yyy "*) ;; + *) libsdirs="$libsdirs $yyy" ;; + esac ;; esac break @@ -7141,6 +7146,26 @@ if test "${api_revision}${api_version}${ api_versionstring='5.005' fi +: Check if quadmath is requested +case "$usequadmath" in +"$define"|true|[yY]*) usequadmath="$define" ;; +*) usequadmath="$undef" ;; +esac + +: Fail if both uselongdouble and usequadmath are requested +case "$usequadmath:$uselongdouble" in +define:define) + $cat <&4 + +*** You requested the use of the quadmath library and use +*** of long doubles. +*** +*** Please select one or the other. +EOM + exit 1 + ;; +esac + : determine the architecture name echo " " if xxx=`./loc arch blurfl $pth`; $test -f "$xxx"; then @@ -7758,36 +7783,6 @@ case "$inc_version_list" in esac $rm -f getverlist -: see if malloc/malloc.h has to be included -set malloc/malloc.h i_mallocmalloc -eval $inhdr - -: see if this is a malloc.h system -: we want a real compile instead of Inhdr because some systems have a -: malloc.h that just gives a compile error saying to use stdlib.h instead -echo " " -$cat >try.c < -#include -#$i_mallocmalloc I_MALLOCMALLOC -#ifdef I_MALLOCMALLOC -# include -#endif - -int main () { return 0; } -EOCP -set try -if eval $compile; then - echo " found." >&4 - val="$define" -else - echo " NOT found." >&4 - val="$undef" -fi -$rm_try -set i_malloc -eval $setvar - : check for length of pointer echo " " case "$ptrsize" in @@ -10756,7 +10751,7 @@ while test $# -ge 2; do shift 2 done cat >> try.c <<'EOCP' -#define _(args) args +#define _(args) args EOCP echo "$foo" >> try.c echo 'int no_real_function_has_this_name _((void)) { return 0; }' >> try.c @@ -11321,6 +11316,34 @@ set d_attribute_always_inline eval $setvar $rm -f attrib* +: Look for GCC-style attribute visibility +case "$d_attribute_visibility" in +'') +echo " " +echo "Checking whether your compiler can handle __attribute__((visibility)) ..." >&4 +$cat >attrib.c <<'EOCP' +#include +__attribute__((visibility("hidden"))) int I_will_be_hidden(void); +EOCP +if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then + if $compiler_warning attrib.out >/dev/null 2>&1; then + echo "Your C compiler doesn't support __attribute__((visibility))." + val="$undef" + else + echo "Your C compiler supports __attribute__((visibility))." + val="$define" + fi +else + echo "Your C compiler doesn't seem to understand __attribute__ at all." + val="$undef" +fi +;; +*) val="$d_attribute_visibility" ;; +esac +set d_attribute_visibility +eval $setvar +$rm -f attrib* + : see if getpgrp exists set getpgrp d_getpgrp eval $inlibc @@ -16198,6 +16221,36 @@ eval $inlibc set llroundl d_llroundl eval $inlibc +: see if malloc/malloc.h has to be included +set malloc/malloc.h i_mallocmalloc +eval $inhdr + +: see if this is a malloc.h system +: we want a real compile instead of Inhdr because some systems have a +: malloc.h that just gives a compile error saying to use stdlib.h instead +echo " " +$cat >try.c < +#include +#$i_mallocmalloc I_MALLOCMALLOC +#ifdef I_MALLOCMALLOC +# include +#endif + +int main () { return 0; } +EOCP +set try +if eval $compile; then + echo " found." >&4 + val="$define" +else + echo " NOT found." >&4 + val="$undef" +fi +$rm_try +set i_malloc +eval $setvar + : see if localtime_r exists set localtime_r d_localtime_r eval $inlibc @@ -16816,17 +16869,49 @@ case "$usequadmath:$i_quadmath" in define:define) nvtype="__float128" nvsize=16 - case "$libs" in - *quadmath*) ;; - *) $cat <&4 + : libquadmath is not in the usual places, and the place + : changes if the compiler is upgraded. So ask the compiler if it + : can find it. + : We do not need to save this, if it fails we abort. + libs="$libs -lquadmath" + set try + $cat >try.c < +#include +int main(int argc, char *argv[]) { + __float128 x = 1.0; + if (fabsq(logq(x)) > 1e-6) { + fputs("quadmath is broken\n", stderr); + return 1; + } + puts("define"); + return 0; +} +EOM + yyy='' + if eval $compile_ok; then + yyy=`$run ./try` + case "$yyy" in + define) ;; + *) cat <&4 + +*** You requested the use of the quadmath library, but +*** it appears to be nonfunctional. +*** Cannot continue, aborting. + +EOM + exit 1 + ;; + esac + else + $cat <&4 *** You requested the use of the quadmath library, but you *** do not seem to have the quadmath library installed. *** Cannot continue, aborting. EOM exit 1 - ;; - esac + fi ;; define:*) $cat <&4 @@ -16983,6 +17068,10 @@ $cat <try.c #ifdef I_STDLIB #include #endif +#$i_inttypes I_INTTYPES +#ifdef I_INTTYPES +#include +#endif #include #include #ifdef SIGFPE @@ -18035,6 +18124,10 @@ eval $inlibc set setegid d_setegid eval $inlibc +: see if setenv exists +set setenv d_setenv +eval $inlibc + : see if seteuid exists set seteuid d_seteuid eval $inlibc @@ -19717,9 +19810,13 @@ eval $inlibc set syscall d_syscall eval $inlibc +: see if this is a sys/syscall.h system +set sys/syscall.h i_syssyscall +eval $inhdr + : see if prototype for syscall is available echo " " -set d_syscallproto syscall $i_unistd unistd.h +set d_syscallproto syscall $i_unistd unistd.h $i_syssyscall sys/syscall.h eval $hasproto : see if sysconf exists @@ -20077,6 +20174,10 @@ EOM #ifdef I_STDLIB #include #endif +#$i_inttypes I_INTTYPES +#ifdef I_INTTYPES +#include +#endif #include typedef $uvtype UV; int main() @@ -21585,7 +21686,7 @@ EOCP case "$yyy" in 12345678901) sPRId64=PRId64; sPRIi64=PRIi64; sPRIu64=PRIu64; - sPRIo64=PRIo64; sPRIx64=PRIx64; sPRIXU64=PRIXU64; + sPRIo64=PRIo64; sPRIx64=PRIx64; sPRIXU64=PRIX64; echo "We will use the C9X style." ;; esac @@ -21810,6 +21911,49 @@ EOM *) groupstype="$gidtype";; esac +: Check format strings for internal 32bit types +echo " " +$echo "Checking the format strings to be used for Perl's internal 32bit-types..." >&4 + +case "$i32dformat" in +'') case "$i32type" in + int) + i32dformat='"d"' + u32uformat='"u"' + u32oformat='"o"' + u32xformat='"x"' + u32XUformat='"X"' + ;; + long) + i32dformat='"ld"' + u32uformat='"lu"' + u32oformat='"lo"' + u32xformat='"lx"' + u32XUformat='"lX"' + ;; + int_least32_t) : will not happen currently + i32dformat=PRIdLEAST32 + u32uformat=PRIuLEAST32 + u32oformat=PRIoLEAST32 + u32xformat=PRIxLEAST32 + u32XUformat=PRIXLEAST32 + ;; + int32_t) + i32dformat=PRId32 + u32uformat=PRIu32 + u32oformat=PRIo32 + u32xformat=PRIx32 + u32XUformat=PRIX32 + ;; + esac ;; +esac + +case "$i32dformat" in +'') echo "$0: Fatal: failed to find format strings for 32-bit integers, cannot continue." >&4 + exit 1 + ;; +esac + : check whether make sets MAKE echo " " echo "Checking if your $make program sets \$(MAKE)..." >&4 @@ -23665,7 +23809,7 @@ EOF for i in \`$cc -v -c tmp.c 2>&1 $postprocess_cc_v\` do case "\$i" in - -D*) echo "\$i" | $sed 's/^-D//';; + -D*) echo "\$i" | $sed 's/^-D//;s/['\''\"]//g';; -A*) $test "$gccversion" && echo "\$i" | $sed 's/^-A//' | $sed 's/\(.*\)(\(.*\))/\1=\2/';; esac done @@ -24370,7 +24514,7 @@ case " $extensions" in *" Fcntl "*"_File "*" IO "*) ;; # GDBM_File *" Fcntl "*" IO "*"_File "*) ;; # NDBM_File *) echo "WARNING: Extensions DB_File or *DBM_File, Fcntl, and IO not configured." >&4 - echo "WARNING: The Perl you are building will be quite crippled." >& 4 + echo "WARNING: The Perl you are building will be quite crippled." >&4 ;; esac @@ -24585,6 +24729,7 @@ d_attribute_nonnull='$d_attribute_nonnul d_attribute_noreturn='$d_attribute_noreturn' d_attribute_pure='$d_attribute_pure' d_attribute_unused='$d_attribute_unused' +d_attribute_visibility='$d_attribute_visibility' d_attribute_warn_unused_result='$d_attribute_warn_unused_result' d_backtrace='$d_backtrace' d_bsd='$d_bsd' @@ -24953,6 +25098,7 @@ d_semget='$d_semget' d_semop='$d_semop' d_sendmsg='$d_sendmsg' d_setegid='$d_setegid' +d_setenv='$d_setenv' d_seteuid='$d_seteuid' d_setgrent='$d_setgrent' d_setgrent_r='$d_setgrent_r' @@ -25208,6 +25354,7 @@ html3dir='$html3dir' html3direxp='$html3direxp' i16size='$i16size' i16type='$i16type' +i32dformat='$i32dformat' i32size='$i32size' i32type='$i32type' i64size='$i64size' @@ -25278,6 +25425,7 @@ i_syssockio='$i_syssockio' i_sysstat='$i_sysstat' i_sysstatfs='$i_sysstatfs' i_sysstatvfs='$i_sysstatvfs' +i_syssyscall='$i_syssyscall' i_systime='$i_systime' i_systimek='$i_systimek' i_systimes='$i_systimes' @@ -25595,8 +25743,12 @@ troff='$troff' ttyname_r_proto='$ttyname_r_proto' u16size='$u16size' u16type='$u16type' +u32XUformat='$u32XUformat' +u32oformat='$u32oformat' u32size='$u32size' u32type='$u32type' +u32uformat='$u32uformat' +u32xformat='$u32xformat' u64size='$u64size' u64type='$u64type' u8size='$u8size' Index: gnu/usr.bin/perl/EXTERN.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/EXTERN.h,v diff -u -p -a -u -p -r1.14 EXTERN.h --- gnu/usr.bin/perl/EXTERN.h 15 Feb 2023 01:36:12 -0000 1.14 +++ gnu/usr.bin/perl/EXTERN.h 21 Feb 2024 15:47:00 -0000 @@ -9,10 +9,11 @@ */ /* - * EXT designates a global var which is defined in perl.h - * dEXT designates a global var which is defined in another - * file, so we can't count on finding it in perl.h - * (this practice should be avoided). + * EXT: designates a global var which is defined in perl.h + * + * dEXT: designates a global var which is defined in another + * file, so we can't count on finding it in perl.h + * (this practice should be avoided). */ #undef EXT #undef dEXT @@ -52,6 +53,6 @@ # endif #undef INIT -#define INIT(x) +#define INIT(...) #undef DOINIT Index: gnu/usr.bin/perl/INSTALL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/INSTALL,v diff -u -p -a -u -p -r1.30 INSTALL --- gnu/usr.bin/perl/INSTALL 23 Dec 2023 21:02:20 -0000 1.30 +++ gnu/usr.bin/perl/INSTALL 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see F) which is specially designed to be readable as is. @@ -90,10 +92,10 @@ to F for more detaile =head3 Compatibility with earlier versions -B This version is not binary compatible with versions of Perl -earlier than 5.36.0. If you have built extensions (i.e. modules that -include C code) using an earlier version of Perl, you will need to -rebuild and reinstall those extensions. +B This version is not binary compatible with earlier versions +of Perl. If you have built extensions (i.e. modules that include C code) +using an earlier version of Perl, you will need to rebuild and reinstall +those extensions. Pure perl modules without XS or C code should continue to work fine without reinstallation. See the discussion below on @@ -101,11 +103,18 @@ L<"Coexistence with earlier versions of The standard extensions supplied with Perl will be handled automatically. -On a related issue, old modules may possibly be affected by the changes -in the Perl language in the current release. Please see -F for a description of what's changed. See your -installed copy of the perllocal.pod file for a (possibly incomplete) -list of locally installed modules. Also see the L module's +On a related issue, old modules may possibly be affected by the changes in the +Perl language in the current release. We try hard to make new features +"opt-in", such that existing code will work unchanged, and attempt to identify +where bug fixes might expose code which was relying on incorrect interpreter +behaviour. Please see F for a description of what's +changed between this and the previous release. If you are upgrading from an +earlier release, please also check the perldeltas describing changes for the +intermediate releases, to get a full picture of what changes might affect your +installation. + +See your installed copy of the perllocal.pod file for a (possibly +incomplete) list of locally installed modules. Also see the L module's C function for one way to make a "bundle" of your currently installed modules. @@ -411,6 +420,38 @@ the compiler dependency, you may need to At C level the type is called C<__float128> (note, not "long double"), but Perl source knows it as NV. (This is not "long doubles".) +=head3 Taint Support + +Traditional perl has provided a security mechanism based on marking +input data as untrusted unless it has been validated by a regex. This +mechanism is called tainting and is enabled with the -T or -t options on +the command line. This support has a performance cost on all code +executed. It is possible to disable this support by providing the +setting C<-Accflags=-DNO_TAINT_SUPPORT> or the setting +C<-Accflags=-DSILENT_NO_TAINT_SUPPORT> to Configure. + +The former option C is more secure and disables taint +support while making the use of the C<-T> or C<-t> options which +normally enable taint support into an untrappable exception to ensure +that no-one uses them while expecting taint checks to run. With this +build mode there can be no confusion if a script supports taint or not. + +The latter option, C is less secure but more +flexible in that it silently disables taint support while ignoring the +C<-T> and C<-t> command line options entirely. In this build mode it is +possible to run a script with the C<-T> or C<-t> option and expect taint +support but not get it, so this mode is only recommended to people who +really know what they are doing. + +Both modes improve performance although the amount depends on your +workload. It is not unreasonable to expect a 5%-10% improvement in +performance by using one of these options. At this time this build mode +is supported but not recommended, and if you chose to use such a perl +you do so at your own risk. It is possible that there may be +interoperability issues with CPAN distributions as many distributions +are unaware of this build mode and will expect test scripts to pass or +to detect unvalidated data when run under the C<-T> or C<-t>. + =head3 Algorithmic Complexity Attacks on Hashes Perl 5.18 reworked the measures used to secure its hash function @@ -450,30 +491,39 @@ storage with 256 32-bit random values as for seeding the SBOX32 storage is very efficient, and populating the table required for hashing even fairly long keys is negligible as we only do it during startup. By default we build with SBOX32 enabled, but you can change -that by setting +that by setting the C in the Configure process, +with something like this + + -Accflags='-DPERL_HASH_USE_SBOX32_ALSO=0' - PERL_HASH_USE_SBOX32_ALSO +or alternatively you can use the simple define C like this: -to zero in configure. By default Perl will use SBOX32 to hash strings 24 bytes -or shorter, you can change this length by setting + -Accflags='-DPERL_HASH_NO_SBOX32' - SBOX32_MAX_LEN +By default Perl will use SBOX32 to hash strings 24 bytes +or shorter, you can change this length by setting C +to the desired length, with the maximum length being 256. For example with +this: -to the desired length, with the maximum length being 256. + -Accflags='-DSBOX_MAX_LEN=128' As of Perl 5.18 the order returned by keys(), values(), and each() is non-deterministic and distinct per hash, and the insert order for colliding keys is randomized as well, and perl allows for controlling this by the PERL_PERTURB_KEYS environment setting. You can disable this behavior -entirely with the define +entirely with the define C with - PERL_PERTURB_KEYS_DISABLED + -Accflags='-DPERL_PERTURB_KEYS_DISABLED' You can disable the environment variable checks and compile time specify -the type of key traversal randomization to be used by defining one of these: +the type of key traversal randomization to be used by defining either +C or C with + + -Accflags='-DPERL_PERTURB_KEYS_RANDOM' - PERL_PERTURB_KEYS_RANDOM - PERL_PERTURB_KEYS_DETERMINISTIC +or + + -Accflags='-DPERL_PERTURB_KEYS_DETERMINISTIC' Since Perl 5.18 the seed used for the hash function is randomly selected at process start, which can be overridden by specifying a seed by setting @@ -489,9 +539,9 @@ DETERMINISTIC in this context means "if the same results should be observed". You can change this behavior so that your perl is built with a hard coded -seed with the define +seed with the define C by providing to Configure - NO_HASH_SEED + -Accflags='-DNO_HASH_SEED' Note that if you do this you should modify the code in hv_func.h to specify your own key. In the future this define may be renamed and replaced with one @@ -519,6 +569,38 @@ C<-Accflags=-DNO_PERL_HASH_ENV>. The C environment variable can be disabled by configuring perl with C<-Accflags=-DNO_PERL_HASH_SEED_DEBUG>. +=head3 MISCELLANEOUS CONFIG + +Perl uses various defines to control defaults for its behavior. These +values are chosen to represent "sane" config, but users can override +these values in their builds if they wish. This is a list of such +settings. + +=over 2 + +=item PERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT + +This define is used to control the default maximum number of nested +eval/BEGIN statements, and in this context require should be +understood to be a special form of eval so this means require/BEGIN +and "use" statements as well. + +Currently each C block inside of an C or C +operation will use a fairly high number of frames of the perl internal +C stack, and this value is used to prevent stack overflows. Normally +it is defaulted to 1000 but the default can be configured to another +value, for instance 100, like this + + -Accflags='-DPERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT=100' + + +If you don't know what this is then it is safe to ignore it. Do not +configure this to 0 or another very low value, it will break a lot of +code. If you want to set it to a low value use the run time variable +C<${^MAX_NESTED_EVAL_BEGIN_BLOCKS}> instead. + +=back + =head3 SOCKS Perl can be configured to be 'socksified', that is, to use the SOCKS @@ -612,7 +694,7 @@ for example: 18126:./miniperl: /sbin/loader: Fatal Error: cannot map libperl.so -There is also an potential problem with the shared perl library if you +There is also a potential problem with the shared perl library if you want to have more than one "flavor" of the same version of perl (e.g. with and without -DDEBUGGING). For example, suppose you build and install a standard Perl 5.10.0 with a shared library. Then, suppose you @@ -637,21 +719,6 @@ architecture-dependent library for your You can do this by changing all the *archlib* variables in config.sh to point to your new architecture-dependent library. -=head3 Environment access - -Perl often needs to write to the program's environment, such as when -C<%ENV> is assigned to. Many implementations of the C library function -C leak memory, so where possible perl will manipulate the -environment directly to avoid these leaks. The default is now to perform -direct manipulation whenever perl is running as a stand alone interpreter, -and to call the safe but potentially leaky C function when the -perl interpreter is embedded in another application. You can force perl -to always use C by compiling with -C<-Accflags="-DPERL_USE_SAFE_PUTENV">, see section L. You can force an embedded perl -to use direct manipulation by setting C after -the C call. - =head3 External glob Before File::Glob entered core in 5.6.0 globbing was implemented by shelling @@ -683,7 +750,7 @@ The directories set up by Configure fall =item Directories for the perl distribution -By default, Configure will use the following directories for 5.36.3. +By default, Configure will use the following directories for 5.38.2. $version is the full perl version number, including subversion, e.g. 5.12.3, and $archname is a string like sun4-sunos, determined by Configure. The full definitions of all Configure @@ -826,7 +893,7 @@ separated list of directories, like this sh Configure -Accflags='-DAPPLLIB_EXP=\"/usr/libperl\"' -The directories defined by APPLLIB_EXP get added to @INC I, +The directories defined by APPLLIB_EXP get added to @INC B, ahead of any others, and so provide a way to override the standard perl modules should you, for example, want to distribute fixes without touching the perl distribution proper. And, like otherlib dirs, @@ -1258,6 +1325,13 @@ options. Try for a listing. +Unrecognized arguments with a double dash prefix produce an error. + +Any other arguments are passed through to C, so you could +build a threaded perl with: + + CC=gcc ./configure.gnu -Dusethreads + (The file is called configure.gnu to avoid problems on systems that would not distinguish the files "Configure" and "configure".) @@ -2506,8 +2580,8 @@ L Perl modules having binary parts (meaning that a C compiler is used) will have to be recompiled to be -used with 5.36.3. If you find you do need to rebuild an extension with -5.36.3, you may safely do so without disturbing the older +used with 5.38.2. If you find you do need to rebuild an extension with +5.38.2, you may safely do so without disturbing the older installations. (See L<"Coexistence with earlier versions of perl 5"> above.) @@ -2635,15 +2709,15 @@ Firstly, the bare minimum to run this sc print("$f\n"); } -in Linux with perl-5.36.3 is as follows (under $Config{prefix}): +in Linux with perl-5.38.2 is as follows (under $Config{prefix}): ./bin/perl - ./lib/perl5/5.36.3/strict.pm - ./lib/perl5/5.36.3/warnings.pm - ./lib/perl5/5.36.3/i686-linux/File/Glob.pm - ./lib/perl5/5.36.3/feature.pm - ./lib/perl5/5.36.3/XSLoader.pm - ./lib/perl5/5.36.3/i686-linux/auto/File/Glob/Glob.so + ./lib/perl5/5.38.2/strict.pm + ./lib/perl5/5.38.2/warnings.pm + ./lib/perl5/5.38.2/i686-linux/File/Glob.pm + ./lib/perl5/5.38.2/feature.pm + ./lib/perl5/5.38.2/XSLoader.pm + ./lib/perl5/5.38.2/i686-linux/auto/File/Glob/Glob.so Secondly, for perl-5.10.1, the Debian perl-base package contains 591 files, (of which 510 are for lib/unicore) totaling about 3.5MB in its @@ -2756,10 +2830,15 @@ by perl itself; for source compatibility completely removed. =head2 C<-DNO_PERL_INTERNAL_RAND_SEED> -X If you configure perl with C<-Accflags=-DNO_PERL_INTERNAL_RAND_SEED>, perl will ignore the C environment variable. + +=head2 C<-DNO_PERL_RAND_SEED> +X + +If you configure perl with C<-Accflags=-DNO_PERL_RAND_SEED>, +perl will ignore the C environment variable. =head1 DOCUMENTATION Index: gnu/usr.bin/perl/INTERN.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/INTERN.h,v diff -u -p -a -u -p -r1.11 INTERN.h --- gnu/usr.bin/perl/INTERN.h 15 Feb 2023 01:36:12 -0000 1.11 +++ gnu/usr.bin/perl/INTERN.h 21 Feb 2024 15:47:00 -0000 @@ -46,6 +46,6 @@ # endif #undef INIT -#define INIT(x) = x +#define INIT(...) = __VA_ARGS__ #define DOINIT Index: gnu/usr.bin/perl/MANIFEST =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/MANIFEST,v diff -u -p -a -u -p -r1.69 MANIFEST --- gnu/usr.bin/perl/MANIFEST 23 Dec 2023 21:02:20 -0000 1.69 +++ gnu/usr.bin/perl/MANIFEST 21 Feb 2024 15:47:00 -0000 @@ -1,146 +1,342 @@ -.dir-locals.el Emacs control file -.editorconfig EditorConfig style file -.lgtm.yml LGTM.com configuration file -.metaconf-exclusions.txt Symbols that should ignored when generating Configure -.travis.yml continuous integration on github (where enabled) -amigaos4/amigaio.c AmigaOS4 port -amigaos4/amigaio.h AmigaOS4 port -amigaos4/amigaos.c AmigaOS4 port -amigaos4/amigaos.h AmigaOS4 port -amigaos4/config.sh AmigaOS4 config -Artistic The "Artistic License" -asan_ignore Errors to skip under clang's Addresss Sanitizer -AUTHORS Contact info for contributors -autodoc.pl Creates pod/perlintern.pod and pod/perlapi.pod -av.c Array value code -av.h Array value header -builtin.c Functions in the builtin:: namespace -caretx.c C file to create $^X -cflags.SH A script that emits C compilation flags per file -Changes Describe how to peruse changes between releases -charclass_invlists.h Compiled-in inversion lists -CODE_OF_CONDUCT.md Information on where to find the Standards of Conduct -config.over Site-specific overrides for Configure defaults -config_h.SH Produces config.h -configpm Produces lib/Config.pm -Configure Portability tool -configure.com Configure-equivalent for VMS -configure.gnu Crude emulation of GNU configure -cop.h Control operator header -Copying The GNU General Public License +.dir-locals.el Emacs control file +.editorconfig EditorConfig style file +.lgtm.yml LGTM.com configuration file +.metaconf-exclusions.txt Symbols that should ignored when generating Configure +Artistic The "Artistic License" +asan_ignore Errors to skip under clang's Addresss Sanitizer +AUTHORS Contact info for contributors +autodoc.pl Creates pod/perlintern.pod and pod/perlapi.pod +av.c Array value code +av.h Array value header +builtin.c Functions in the builtin:: namespace +caretx.c C file to create $^X +cflags.SH A script that emits C compilation flags per file +Changes Describe how to peruse changes between releases +charclass_invlists.h Compiled-in inversion lists +class.c Internals of the `use feature 'class'` object system +CODE_OF_CONDUCT.md Information on where to find the Standards of Conduct +config.over Site-specific overrides for Configure defaults +config_h.SH Produces config.h +configpm Produces lib/Config.pm +Configure Portability tool +configure.com Configure-equivalent for VMS +configure.gnu Crude emulation of GNU configure +cop.h Control operator header +Copying The GNU General Public License +cv.h Code value header +deb.c Debugging routines +doio.c I/O operations +doop.c Support code for various operations +dosish.h Some defines for MS/DOSish machines +dquote.c Functions for double quotish contexts +dump.c Debugging output +ebcdic_tables.h Generated tables included in utfebcdic.h +embed.fnc Database used by embed.pl +embed.h Maps symbols to safer names +embedvar.h C namespace management +EXTERN.h Included before foreign .h files +fakesdio.h stdio in terms of PerlIO +feature.h Feature header +form.h Public declarations for formats +generate_uudmap.c Generate uudmap.h, the uuencode decoding map +git_version.h Pre-generated git_version.h for OpenBSD +globals.c File to declare global symbols (for shared library) +globvar.sym Global variables that need hiding when embedded +gv.c Glob value code +gv.h Glob value header +handy.h Handy definitions +hv.c Hash value code +hv.h Hash value header +hv_func.h Hash value static inline function header +hv_macro.h Macros used by hv_func.h +inline.h Static inline functions +INSTALL Detailed installation instructions +install_lib.pl functions shared between install* scripts +installhtml Perl script to install html files for pods +installman Perl script to install man pages for pods +installperl Perl script to do "make install" dirty work +INTERN.h Included before domestic .h files +intrpvar.h Variables held in each interpreter instance +invlist_inline.h Inline functions for handling inversion lists +iperlsys.h Perl's interface to the system +keywords.c Perl_keyword(), generated by regen/keywords.pl +keywords.h The keyword numbers +l1_char_class_tab.h 256 word bit table of character classes (for handy.h) +locale.c locale-specific utility functions +make_ext.pl Used by Makefile to execute extension Makefiles +make_patchnum.pl Script to generate git_version.h and lib/Config_git.pl files for all OS'es +makedef.pl Create symbol export lists for linking +makedepend.SH Precursor to makedepend +makedepend_file.SH Precursor to makedepend_file +Makefile.micro microperl Makefile +Makefile.SH A script that generates Makefile +malloc.c A version of malloc you might not want +malloc_ctl.h A version of malloc you might not want +MANIFEST This list of files +mathoms.c A home for binary-compatible code artifacts +META.json Distribution meta-data in JSON +META.yml Distribution meta-data in YAML +metaconfig.h Control file for the metaconfig process +metaconfig.SH Control file for the metaconfig process +mg.c Magic code +mg.h Magic header +mg_names.inc Generated magic names used by dump.c +mg_raw.h Generated magic data used by generate_uudmap.c +mg_vtable.h Generated magic vtable data +miniperlmain.c Basic perl w/o dynamic loading or extensions +mkppport A script that distributes ppport.h +mkppport.lst List of extensions that need a ppport.h +mro_core.c Method Resolution Order code +myconfig.SH Prints summary of the current configuration +mydtrace.h Support for optional DTrace probes +nostdio.h Cause compile error on stdio calls +numeric.c Miscellaneous numeric conversion routines +op.c Opcode syntax tree code +op.h Opcode syntax tree header +op_reg_common.h Common parts of op.h, regexp.h header +opcode.h Automatically generated opcode header +opnames.h Automatically generated opcode header +overload.h generated overload enum (public) +overload.inc generated overload name table (implementation) +PACKAGING notes and best practice for packaging perl 5 +packsizetables.inc The generated packprops array used in pp_pack.c +pad.c Scratchpad functions +pad.h Scratchpad headers +parser.h parser object header +patchlevel.h The current patch level of perl +peep.c The peephole optimizer and optree finalizer +perl.c main() +perl.h Global declarations +perl_inc_macro.h macro used to set \@INC using S_incpush_use_sep +perl_langinfo.h Perl's version of +perl_siphash.h Implementation of SipHash +perlapi.h Empty backwards-compat include +perldtrace.d D script for Perl probes +perlio.c C code for PerlIO abstraction +perlio.h PerlIO abstraction +perlio.sym Symbols for PerlIO abstraction +perliol.h PerlIO Layer definition +perlsdio.h Fake stdio using perlio +perlstatic.h Like inline.h, but functions not declared inline +perlvars.h Global variables +perly.act parser actions; derived from perly.y +perly.c parser code (NOT derived from perly.y) +perly.h header file for perly.c; derived from perly.y +perly.tab parser state tables; derived from perly.y +perly.y Yacc grammar for perl +Policy_sh.SH Hold site-wide preferences between Configure runs. +pp.c Push/Pop code +pp.h Push/Pop code defs +pp_ctl.c Push/Pop code for control flow +pp_hot.c Push/Pop code for heavily used opcodes +pp_pack.c Push/Pop code for pack/unpack +pp_proto.h C++ definitions for Push/Pop code +pp_sort.c Push/Pop code for sort +pp_sys.c Push/Pop code for system interaction +proto.h Prototypes +README The Instructions +README.aix Perl notes for AIX +README.amiga Perl notes for AmigaOS +README.android Perl notes for Android +README.bs2000 Perl notes for POSIX-BC BS2000 +README.cn Perl for Simplified Chinese (in UTF-8) +README.cygwin Perl notes for Cygwin +README.freebsd Perl notes for FreeBSD +README.haiku Perl notes for Haiku +README.hpux Perl notes for HP-UX +README.hurd Perl notes for Hurd +README.irix Perl notes for Irix +README.jp Perl for Japanese (in EUC-JP) +README.ko Perl for Korean (in EUC-KR) +README.linux Perl notes for Linux +README.macosx Perl notes for Mac OS X +README.micro Notes about microperl +README.openbsd Perl notes for OpenBSD +README.os2 Perl notes for OS/2 +README.os390 Perl notes for OS/390 +README.os400 Perl notes for OS/400 +README.plan9 Perl notes for Plan 9 +README.qnx Perl notes for QNX +README.riscos Perl notes for RISC OS +README.solaris Perl notes for Solaris +README.synology Perl notes for Synology +README.tru64 Perl notes for Tru64 +README.tw Perl for Traditional Chinese (in Big5) +README.vms Notes about installing the VMS port +README.vos Perl notes for Stratus VOS +README.win32 Perl notes for Windows +reentr.c Reentrant interfaces +reentr.h Reentrant interfaces +regcharclass.h Generated by regen/regcharclass.pl +regcomp.c Regular expression compiler +regcomp.h Private declarations for above +regcomp.sym Data for regnodes.h +regcomp_debug.c Regular expression compiler debug code +regcomp_internal.h Internal stuff for regex compiler +regcomp_invlist.c Invlist logic for regular expression engine +regcomp_study.c Optimizer for regular expression compiler +regcomp_trie.c Trie logic for regular expression compiler +regen.pl Run all scripts that (re)generate files +regen_perly.pl generate perly.{act,h,tab} from perly.y +regexec.c Regular expression evaluator +regexp.h Public declarations for the above +reginline.h Inline subs for the RE engine. +regnodes.h Description of nodes of the RE engine +run.c The interpreter loop +runtests.SH A script that generates runtests +sbox32_hash.h SBox hash code (32 Bit SBOX based hash function) +scope.c Scope entry and exit code +scope.h Scope entry and exit header +scope_types.h Types used to manage the save stack +SECURITY.md Add Security Policy for GitHub +sv.c Scalar value code +sv.h Scalar value header +sv_inline.h Perl_newSV_type and required defs +taint.c Tainting code +TestInit.pm Preamble library for tests +thread.h Threading header +time64.c 64 bit clean time.h (code) +time64.h 64 bit clean time.h (header) +time64_config.h 64 bit clean time.h (configuration) +toke.c The tokener +uconfig.h Configuration header for microperl +uconfig.sh Configuration script for microperl +uconfig64.sh Configuration script for microperl for LP64 +uni_keywords.h Map unicode property names to numbers +unicode_constants.h compile-time macros for Unicode code points +universal.c The default UNIVERSAL package methods +unixish.h Defines that are assumed on Unix +utf8.c Unicode routines +utf8.h Unicode header +utfebcdic.h Unicode on EBCDIC (UTF-EBCDIC, tr16) header +util.c Utility routines +util.h Dummy header +utils.lst Lists utilities bundled with Perl +vutil.c Version object C functions +vutil.h Version object headers +vxs.inc Version object XS methods +warnings.h The warning numbers +write_buildcustomize.pl Generate lib/buildcustomize.pl +XSUB.h Include file for extension subroutines +zaphod32_hash.h Zaphod32 hash code (32 bit fast hash function) +amigaos4/amigaio.c AmigaOS4 port +amigaos4/amigaio.h AmigaOS4 port +amigaos4/amigaos.c AmigaOS4 port +amigaos4/amigaos.h AmigaOS4 port +amigaos4/config.sh AmigaOS4 config cpan/.dir-locals.el Emacs control file -cpan/Archive-Tar/bin/ptar the ptar utility -cpan/Archive-Tar/bin/ptardiff the ptardiff utility -cpan/Archive-Tar/bin/ptargrep the ptardiff utility -cpan/Archive-Tar/lib/Archive/Tar.pm Archive::Tar -cpan/Archive-Tar/lib/Archive/Tar/Constant.pm Archive::Tar -cpan/Archive-Tar/lib/Archive/Tar/File.pm Archive::Tar -cpan/Archive-Tar/t/01_use.t Archive::Tar tests -cpan/Archive-Tar/t/02_methods.t Archive::Tar tests -cpan/Archive-Tar/t/03_file.t Archive::Tar tests -cpan/Archive-Tar/t/04_resolved_issues.t Archive::Tar tests -cpan/Archive-Tar/t/05_iter.t Archive::Tar tests -cpan/Archive-Tar/t/06_error.t Archive::Tar tests +cpan/Archive-Tar/bin/ptar the ptar utility +cpan/Archive-Tar/bin/ptardiff the ptardiff utility +cpan/Archive-Tar/bin/ptargrep the ptardiff utility +cpan/Archive-Tar/lib/Archive/Tar.pm Archive::Tar +cpan/Archive-Tar/lib/Archive/Tar/Constant.pm Archive::Tar +cpan/Archive-Tar/lib/Archive/Tar/File.pm Archive::Tar +cpan/Archive-Tar/t/01_use.t Archive::Tar tests +cpan/Archive-Tar/t/02_methods.t Archive::Tar tests +cpan/Archive-Tar/t/03_file.t Archive::Tar tests +cpan/Archive-Tar/t/04_resolved_issues.t Archive::Tar tests +cpan/Archive-Tar/t/05_iter.t Archive::Tar tests +cpan/Archive-Tar/t/06_error.t Archive::Tar tests cpan/Archive-Tar/t/08_ptargrep.t cpan/Archive-Tar/t/09_roundtrip.t -cpan/Archive-Tar/t/90_symlink.t Archive::Tar tests -cpan/Archive-Tar/t/99_pod.t Archive::Tar tests -cpan/Archive-Tar/t/src/header/signed.tar Archive::Tar tests +cpan/Archive-Tar/t/90_symlink.t Archive::Tar tests +cpan/Archive-Tar/t/99_pod.t Archive::Tar tests +cpan/Archive-Tar/t/src/header/signed.tar Archive::Tar tests cpan/Archive-Tar/t/src/linktest/linktest_missing_dir.tar Archive::Tar tests -cpan/Archive-Tar/t/src/linktest/linktest_with_dir.tar Archive::Tar tests -cpan/Archive-Tar/t/src/long/b Archive::Tar tests -cpan/Archive-Tar/t/src/long/bar.tar Archive::Tar tests -cpan/Archive-Tar/t/src/long/foo.tbz Archive::Tar tests -cpan/Archive-Tar/t/src/long/foo.tgz Archive::Tar tests -cpan/Archive-Tar/t/src/short/b Archive::Tar tests -cpan/Archive-Tar/t/src/short/bar.tar Archive::Tar tests -cpan/Archive-Tar/t/src/short/foo.tbz Archive::Tar tests -cpan/Archive-Tar/t/src/short/foo.tgz Archive::Tar tests -cpan/autodie/lib/autodie.pm Functions succeed or die with lexical scope -cpan/autodie/lib/autodie/exception.pm Exception class for autodie -cpan/autodie/lib/autodie/exception/system.pm Exception class for autodying system() -cpan/autodie/lib/autodie/hints.pm Hinting interface for autodie +cpan/Archive-Tar/t/src/linktest/linktest_with_dir.tar Archive::Tar tests +cpan/Archive-Tar/t/src/long/b Archive::Tar tests +cpan/Archive-Tar/t/src/long/bar.tar Archive::Tar tests +cpan/Archive-Tar/t/src/long/foo.tbz Archive::Tar tests +cpan/Archive-Tar/t/src/long/foo.tgz Archive::Tar tests +cpan/Archive-Tar/t/src/short/b Archive::Tar tests +cpan/Archive-Tar/t/src/short/bar.tar Archive::Tar tests +cpan/Archive-Tar/t/src/short/foo.tbz Archive::Tar tests +cpan/Archive-Tar/t/src/short/foo.tgz Archive::Tar tests +cpan/autodie/lib/autodie.pm Functions succeed or die with lexical scope +cpan/autodie/lib/autodie/exception.pm Exception class for autodie +cpan/autodie/lib/autodie/exception/system.pm Exception class for autodying system() +cpan/autodie/lib/autodie/hints.pm Hinting interface for autodie cpan/autodie/lib/autodie/Scope/Guard.pm cpan/autodie/lib/autodie/Scope/GuardStack.pm cpan/autodie/lib/autodie/skip.pm cpan/autodie/lib/autodie/Util.pm -cpan/autodie/lib/Fatal.pm Make errors in functions/builtins fatal -cpan/autodie/t/00-load.t autodie - basic load +cpan/autodie/lib/Fatal.pm Make errors in functions/builtins fatal +cpan/autodie/t/00-load.t autodie - basic load cpan/autodie/t/args.t -cpan/autodie/t/autodie.t autodie - Basic functionality +cpan/autodie/t/autodie.t autodie - Basic functionality cpan/autodie/t/autodie_skippy.pm -cpan/autodie/t/autodie_test_module.pm autodie - test helper -cpan/autodie/t/backcompat.t autodie - More Fatal backcompat -cpan/autodie/t/basic_exceptions.t autodie - Basic exception tests -cpan/autodie/t/binmode.t autodie - Binmode testing -cpan/autodie/t/blog_hints.t autodie - Tests fro PJF's blog -cpan/autodie/t/caller.t autodie - Caller diagnostics +cpan/autodie/t/autodie_test_module.pm autodie - test helper +cpan/autodie/t/backcompat.t autodie - More Fatal backcompat +cpan/autodie/t/basic_exceptions.t autodie - Basic exception tests +cpan/autodie/t/binmode.t autodie - Binmode testing +cpan/autodie/t/blog_hints.t autodie - Tests fro PJF's blog +cpan/autodie/t/caller.t autodie - Caller diagnostics cpan/autodie/t/chmod.t cpan/autodie/t/chown.t -cpan/autodie/t/context.t autodie - Context clobbering tests -cpan/autodie/t/context_lexical.t autodie - Context clobbering lexically +cpan/autodie/t/context.t autodie - Context clobbering tests +cpan/autodie/t/context_lexical.t autodie - Context clobbering lexically cpan/autodie/t/core-trampoline-slurp.t -cpan/autodie/t/crickey.t autodie - Like an Australian -cpan/autodie/t/dbmopen.t autodie - dbm tests +cpan/autodie/t/crickey.t autodie - Like an Australian +cpan/autodie/t/dbmopen.t autodie - dbm tests cpan/autodie/t/eval_error.t -cpan/autodie/t/exception_class.t autodie - Exception class subclasses +cpan/autodie/t/exception_class.t autodie - Exception class subclasses cpan/autodie/t/exception_nonref.t -cpan/autodie/t/exceptions.t autodie - 5.10 exception tests. -cpan/autodie/t/exec.t autodie - exec tests. -cpan/autodie/t/Fatal.t autodie - Fatal backcompatibility -cpan/autodie/t/filehandles.t autodie - filehandle tests -cpan/autodie/t/fileno.t autodie - fileno tests -cpan/autodie/t/flock.t autodie - File locking tests -cpan/autodie/t/format-clobber.t autodie - Don't clobber scalars -cpan/autodie/t/hints.t autodie - Test hints interface -cpan/autodie/t/hints_insist.t autodie - Test hints insistance -cpan/autodie/t/hints_pod_examples.t autodie - Test hints POD examples -cpan/autodie/t/hints_provider_does.t autodie - Test hints/does roles -cpan/autodie/t/hints_provider_easy_does_it.t autodie - Test easy hints/does -cpan/autodie/t/hints_provider_isa.t autodie - Test hints/inheritance +cpan/autodie/t/exceptions.t autodie - 5.10 exception tests. +cpan/autodie/t/exec.t autodie - exec tests. +cpan/autodie/t/Fatal.t autodie - Fatal backcompatibility +cpan/autodie/t/filehandles.t autodie - filehandle tests +cpan/autodie/t/fileno.t autodie - fileno tests +cpan/autodie/t/flock.t autodie - File locking tests +cpan/autodie/t/format-clobber.t autodie - Don't clobber scalars +cpan/autodie/t/hints.t autodie - Test hints interface +cpan/autodie/t/hints_insist.t autodie - Test hints insistance +cpan/autodie/t/hints_pod_examples.t autodie - Test hints POD examples +cpan/autodie/t/hints_provider_does.t autodie - Test hints/does roles +cpan/autodie/t/hints_provider_easy_does_it.t autodie - Test easy hints/does +cpan/autodie/t/hints_provider_isa.t autodie - Test hints/inheritance cpan/autodie/t/import-into.t -cpan/autodie/t/internal.t autodie - internal interface tests -cpan/autodie/t/internal-backcompat.t autodie - Back-compatibility tests +cpan/autodie/t/internal.t autodie - internal interface tests +cpan/autodie/t/internal-backcompat.t autodie - Back-compatibility tests cpan/autodie/t/kill.t -cpan/autodie/t/lethal.t autodie - lethal is the one true name -cpan/autodie/t/lib/autodie/test/au.pm autodie - Australian helper -cpan/autodie/t/lib/autodie/test/au/exception.pm autodie - Australian helper -cpan/autodie/t/lib/autodie/test/badname.pm autodie - Bad exception class -cpan/autodie/t/lib/autodie/test/missing.pm autodie - Missing exception class -cpan/autodie/t/lib/Caller_helper.pm autodie - Caller helper -cpan/autodie/t/lib/Hints_pod_examples.pm autodie - Hints/pod helper -cpan/autodie/t/lib/Hints_provider_does.pm autodie - Hints/does helper +cpan/autodie/t/lethal.t autodie - lethal is the one true name +cpan/autodie/t/lib/autodie/test/au.pm autodie - Australian helper +cpan/autodie/t/lib/autodie/test/au/exception.pm autodie - Australian helper +cpan/autodie/t/lib/autodie/test/badname.pm autodie - Bad exception class +cpan/autodie/t/lib/autodie/test/missing.pm autodie - Missing exception class +cpan/autodie/t/lib/Caller_helper.pm autodie - Caller helper +cpan/autodie/t/lib/Hints_pod_examples.pm autodie - Hints/pod helper +cpan/autodie/t/lib/Hints_provider_does.pm autodie - Hints/does helper cpan/autodie/t/lib/Hints_provider_easy_does_it.pm autodie - Hints/easy helper -cpan/autodie/t/lib/Hints_provider_isa.pm autodie - Hints/inherit helper -cpan/autodie/t/lib/Hints_test.pm autodie - Hints test helper -cpan/autodie/t/lib/lethal.pm autodie - with a better name -cpan/autodie/t/lib/my/autodie.pm autodie - blog_hints.t helper +cpan/autodie/t/lib/Hints_provider_isa.pm autodie - Hints/inherit helper +cpan/autodie/t/lib/Hints_test.pm autodie - Hints test helper +cpan/autodie/t/lib/lethal.pm autodie - with a better name +cpan/autodie/t/lib/my/autodie.pm autodie - blog_hints.t helper cpan/autodie/t/lib/my/pragma.pm -cpan/autodie/t/lib/OtherTypes.pm autodie - Format clobberer helper. -cpan/autodie/t/lib/pujHa/ghach.pm autodie - Like a Klingon -cpan/autodie/t/lib/pujHa/ghach/Dotlh.pm autodie - With Klingon honour -cpan/autodie/t/lib/Some/Module.pm autodie - blog_hints.t helper -cpan/autodie/t/mkdir.t autodie - filesystem tests +cpan/autodie/t/lib/OtherTypes.pm autodie - Format clobberer helper. +cpan/autodie/t/lib/pujHa/ghach.pm autodie - Like a Klingon +cpan/autodie/t/lib/pujHa/ghach/Dotlh.pm autodie - With Klingon honour +cpan/autodie/t/lib/Some/Module.pm autodie - blog_hints.t helper +cpan/autodie/t/mkdir.t autodie - filesystem tests cpan/autodie/t/no-default.t cpan/autodie/t/no_carp.t -cpan/autodie/t/open.t autodie - Testing open +cpan/autodie/t/open.t autodie - Testing open cpan/autodie/t/read.t -cpan/autodie/t/recv.t autodie - send/recv tests -cpan/autodie/t/repeat.t autodie - repeat autodie leak tests +cpan/autodie/t/recv.t autodie - send/recv tests +cpan/autodie/t/repeat.t autodie - repeat autodie leak tests cpan/autodie/t/rt-74246.t -cpan/autodie/t/scope_leak.t autodie - file scope leak tests +cpan/autodie/t/scope_leak.t autodie - file scope leak tests cpan/autodie/t/skip.t -cpan/autodie/t/string-eval-basic.t autodie - Basic string eval test -cpan/autodie/t/string-eval-leak.t autodie - String eval leak test -cpan/autodie/t/sysopen.t autodie - sysopen tests +cpan/autodie/t/string-eval-basic.t autodie - Basic string eval test +cpan/autodie/t/string-eval-leak.t autodie - String eval leak test +cpan/autodie/t/sysopen.t autodie - sysopen tests cpan/autodie/t/touch_me -cpan/autodie/t/truncate.t autodie - File truncation tests -cpan/autodie/t/unlink.t autodie - Unlink system tests. -cpan/autodie/t/user-context.t autodie - Context changes for usersubs -cpan/autodie/t/usersub.t autodie - user subroutine tests +cpan/autodie/t/truncate.t autodie - File truncation tests +cpan/autodie/t/unlink.t autodie - Unlink system tests. +cpan/autodie/t/user-context.t autodie - Context changes for usersubs +cpan/autodie/t/usersub.t autodie - user subroutine tests cpan/autodie/t/utf8_open.t cpan/autodie/t/utime.t -cpan/autodie/t/version.t autodie - versioning tests +cpan/autodie/t/version.t autodie - versioning tests cpan/autodie/t/version_tag.t cpan/AutoLoader/lib/AutoLoader.pm Autoloader base class cpan/AutoLoader/lib/AutoSplit.pm Split up autoload functions @@ -150,11 +346,11 @@ cpan/bignum/gentest/backend.sh cpan/bignum/gentest/scope-nested-const.sh cpan/bignum/gentest/scope-nested-hex-oct.sh cpan/bignum/lib/bigfloat.pm -cpan/bignum/lib/bigint.pm bigint -cpan/bignum/lib/bignum.pm bignum -cpan/bignum/lib/bigrat.pm bigrat -cpan/bignum/lib/Math/BigFloat/Trace.pm bignum tracing -cpan/bignum/lib/Math/BigInt/Trace.pm bignum tracing +cpan/bignum/lib/bigint.pm bigint +cpan/bignum/lib/bignum.pm bignum +cpan/bignum/lib/bigrat.pm bigrat +cpan/bignum/lib/Math/BigFloat/Trace.pm bignum tracing +cpan/bignum/lib/Math/BigInt/Trace.pm bignum tracing cpan/bignum/lib/Math/BigRat/Trace.pm cpan/bignum/t/backend-gmp-bigfloat.t cpan/bignum/t/backend-gmp-bigint.t @@ -164,11 +360,11 @@ cpan/bignum/t/backend-pari-bigfloat.t cpan/bignum/t/backend-pari-bigint.t cpan/bignum/t/backend-pari-bignum.t cpan/bignum/t/backend-pari-bigrat.t -cpan/bignum/t/bigexp.t See if bignum works +cpan/bignum/t/bigexp.t See if bignum works cpan/bignum/t/bigfloat.t -cpan/bignum/t/bigint.t See if bigint works -cpan/bignum/t/bignum.t See if bignum works -cpan/bignum/t/bigrat.t See if bigrat works +cpan/bignum/t/bigint.t See if bigint works +cpan/bignum/t/bignum.t See if bignum works +cpan/bignum/t/bigrat.t See if bigrat works cpan/bignum/t/const-bigfloat.t cpan/bignum/t/const-bigint.t cpan/bignum/t/const-bignum.t @@ -185,21 +381,22 @@ cpan/bignum/t/import-bigfloat.t cpan/bignum/t/import-bigint.t cpan/bignum/t/import-bignum.t cpan/bignum/t/import-bigrat.t -cpan/bignum/t/in_effect.t See if in_effect() works +cpan/bignum/t/in_effect.t See if in_effect() works cpan/bignum/t/infnan-bigfloat.t cpan/bignum/t/infnan-bigint.t -cpan/bignum/t/infnan-bignum.t +cpan/bignum/t/infnan-bignum-mbf.t +cpan/bignum/t/infnan-bignum-mbr.t cpan/bignum/t/infnan-bigrat.t -cpan/bignum/t/option_a.t See if bignum a => X works +cpan/bignum/t/option_a.t See if bignum a => X works cpan/bignum/t/option_a-bignum.t cpan/bignum/t/option_l-bigfloat.t cpan/bignum/t/option_l-bigint.t cpan/bignum/t/option_l-bignum.t cpan/bignum/t/option_l-bigrat.t -cpan/bignum/t/option_p.t See if bignum p => X works +cpan/bignum/t/option_p.t See if bignum p => X works cpan/bignum/t/option_p-bignum.t -cpan/bignum/t/overrides.t See if global overrides behave -cpan/bignum/t/ratopt_a.t See if bigrat a => X works +cpan/bignum/t/overrides.t See if global overrides behave +cpan/bignum/t/ratopt_a.t See if bigrat a => X works cpan/bignum/t/scope-bigfloat.t cpan/bignum/t/scope-bigint.t cpan/bignum/t/scope-bignum.t @@ -230,118 +427,123 @@ cpan/Compress-Raw-Bzip2/t/19nonpv.t cpan/Compress-Raw-Bzip2/t/99pod.t cpan/Compress-Raw-Bzip2/t/compress/CompTestUtils.pm cpan/Compress-Raw-Bzip2/typemap -cpan/Compress-Raw-Zlib/config.in Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/fallback/constants.h Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/fallback/constants.xs Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/Makefile.PL Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/private/MakeUtil.pm Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/t/01version.t Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/t/02zlib.t Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/t/07bufsize.t Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/t/09limitoutput.t Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/t/18lvalue.t Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/config.in Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/fallback/constants.h Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/fallback/constants.xs Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/Makefile.PL Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/private/MakeUtil.pm Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/t/01version.t Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/t/02zlib.t Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/t/07bufsize.t Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/t/09limitoutput.t Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/t/18lvalue.t Compress::Raw::Zlib cpan/Compress-Raw-Zlib/t/19nonpv.t cpan/Compress-Raw-Zlib/t/compress/CompTestUtils.pm -cpan/Compress-Raw-Zlib/typemap Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/Zlib.xs Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/adler32.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/compress.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/crc32.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/crc32.h Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/deflate.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/deflate.h Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/infback.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/inffast.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/inffast.h Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/inffixed.h Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/inflate.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/inflate.h Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/inftrees.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/inftrees.h Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/trees.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/trees.h Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/uncompr.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/zconf.h Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/zlib.h Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/zutil.c Compress::Raw::Zlib -cpan/Compress-Raw-Zlib/zlib-src/zutil.h Compress::Raw::Zlib -cpan/Config-Perl-V/t/10_base.t Config::Perl::V -cpan/Config-Perl-V/t/20_plv56.t Config::Perl::V -cpan/Config-Perl-V/t/21_plv58.t Config::Perl::V -cpan/Config-Perl-V/t/22_plv510.t Config::Perl::V -cpan/Config-Perl-V/t/23_plv512.t Config::Perl::V -cpan/Config-Perl-V/t/24_plv514.t Config::Perl::V -cpan/Config-Perl-V/t/25_plv516.t Config::Perl::V -cpan/Config-Perl-V/t/25_plv5162.t Config::Perl::V -cpan/Config-Perl-V/t/26_plv518.t Config::Perl::V -cpan/Config-Perl-V/t/26_plv5182.t Config::Perl::V -cpan/Config-Perl-V/t/27_plv5200.t Config::Perl::V -cpan/Config-Perl-V/t/27_plv5202.t Config::Perl::V -cpan/Config-Perl-V/t/28_plv5220.t Config::Perl::V -cpan/Config-Perl-V/t/28_plv52201w.t Config::Perl::V -cpan/Config-Perl-V/t/29_plv5235w.t Config::Perl::V -cpan/Config-Perl-V/t/30_plv5240.t Config::Perl::V -cpan/Config-Perl-V/t/31_plv52511.t Config::Perl::V -cpan/Config-Perl-V/t/32_plv5261rc1.t Config::Perl::V -cpan/Config-Perl-V/t/33_plv52711r.t Config::Perl::V -cpan/Config-Perl-V/t/34_plv5280.t Config::Perl::V -cpan/Config-Perl-V/t/35_plv52910g.t Config::Perl::V -cpan/Config-Perl-V/t/36_plv5300.t Config::Perl::V -cpan/Config-Perl-V/t/37_plv53111qm.t Config::Perl::V -cpan/Config-Perl-V/t/38_plv5320tld.t Config::Perl::V -cpan/Config-Perl-V/V.pm Config::Perl::V -cpan/CPAN/lib/App/Cpan.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN.pm Interface to Comprehensive Perl Archive Network -cpan/CPAN/lib/CPAN/API/HOWTO.pod recipe book for programming with CPAN.pm -cpan/CPAN/lib/CPAN/Author.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Bundle.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/CacheMgr.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Complete.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Debug.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/DeferredCode.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Distribution.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Distroprefs.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Distrostatus.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Exception/blocked_urllist.pm helper package for CPAN.pm +cpan/Compress-Raw-Zlib/typemap Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/Zlib.xs Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/adler32.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/compress.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/crc32.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/crc32.h Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/deflate.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/deflate.h Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/infback.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/inffast.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/inffast.h Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/inffixed.h Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/inflate.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/inflate.h Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/inftrees.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/inftrees.h Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/trees.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/trees.h Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/uncompr.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/zconf.h Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/zlib.h Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/zutil.c Compress::Raw::Zlib +cpan/Compress-Raw-Zlib/zlib-src/zutil.h Compress::Raw::Zlib +cpan/Config-Perl-V/t/10_base.t Config::Perl::V +cpan/Config-Perl-V/t/20_plv56.t Config::Perl::V +cpan/Config-Perl-V/t/21_plv58.t Config::Perl::V +cpan/Config-Perl-V/t/22_plv510.t Config::Perl::V +cpan/Config-Perl-V/t/23_plv512.t Config::Perl::V +cpan/Config-Perl-V/t/24_plv514.t Config::Perl::V +cpan/Config-Perl-V/t/25_plv516.t Config::Perl::V +cpan/Config-Perl-V/t/25_plv5162.t Config::Perl::V +cpan/Config-Perl-V/t/26_plv518.t Config::Perl::V +cpan/Config-Perl-V/t/26_plv5182.t Config::Perl::V +cpan/Config-Perl-V/t/27_plv5200.t Config::Perl::V +cpan/Config-Perl-V/t/27_plv5202.t Config::Perl::V +cpan/Config-Perl-V/t/28_plv5220.t Config::Perl::V +cpan/Config-Perl-V/t/28_plv52201w.t Config::Perl::V +cpan/Config-Perl-V/t/29_plv5235w.t Config::Perl::V +cpan/Config-Perl-V/t/30_plv5240.t Config::Perl::V +cpan/Config-Perl-V/t/31_plv52511.t Config::Perl::V +cpan/Config-Perl-V/t/32_plv5261rc1.t Config::Perl::V +cpan/Config-Perl-V/t/33_plv52711r.t Config::Perl::V +cpan/Config-Perl-V/t/34_plv5280.t Config::Perl::V +cpan/Config-Perl-V/t/35_plv52910g.t Config::Perl::V +cpan/Config-Perl-V/t/36_plv5300.t Config::Perl::V +cpan/Config-Perl-V/t/37_plv53111qm.t Config::Perl::V +cpan/Config-Perl-V/t/38_plv5320tld.t Config::Perl::V +cpan/Config-Perl-V/t/39_plv5340tqm.t Config::Perl::V +cpan/Config-Perl-V/t/40_plv5358dnqm.t Config::Perl::V +cpan/Config-Perl-V/t/41_plv5360dnqm.t Config::Perl::V +cpan/Config-Perl-V/t/42_plv5373tld.t Config::Perl::V +cpan/Config-Perl-V/t/43_plv53710rcs.t Test file related to Config::Perl::V +cpan/Config-Perl-V/V.pm Config::Perl::V +cpan/CPAN/lib/App/Cpan.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN.pm Interface to Comprehensive Perl Archive Network +cpan/CPAN/lib/CPAN/API/HOWTO.pod recipe book for programming with CPAN.pm +cpan/CPAN/lib/CPAN/Author.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Bundle.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/CacheMgr.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Complete.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Debug.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/DeferredCode.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Distribution.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Distroprefs.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Distrostatus.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Exception/blocked_urllist.pm helper package for CPAN.pm cpan/CPAN/lib/CPAN/Exception/RecursiveDependency.pm helper package for CPAN.pm cpan/CPAN/lib/CPAN/Exception/yaml_not_installed.pm helper package for CPAN.pm cpan/CPAN/lib/CPAN/Exception/yaml_process_error.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/FirstTime.pm Utility for creating CPAN config files -cpan/CPAN/lib/CPAN/FTP.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/FTP/netrc.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/HandleConfig.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/HTTP/Client.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/HTTP/Credentials.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Index.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/InfoObj.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Kwalify.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/FirstTime.pm Utility for creating CPAN config files +cpan/CPAN/lib/CPAN/FTP.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/FTP/netrc.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/HandleConfig.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/HTTP/Client.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/HTTP/Credentials.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Index.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/InfoObj.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Kwalify.pm helper package for CPAN.pm cpan/CPAN/lib/CPAN/Kwalify/distroprefs.dd helper file for validating config files -cpan/CPAN/lib/CPAN/Kwalify/distroprefs.yml helper file for validating config files -cpan/CPAN/lib/CPAN/LWP/UserAgent.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Mirrors.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Module.pm helper package for CPAN.pm -cpan/CPAN/lib/CPAN/Nox.pm Runs CPAN while avoiding compiled extensions +cpan/CPAN/lib/CPAN/Kwalify/distroprefs.yml helper file for validating config files +cpan/CPAN/lib/CPAN/LWP/UserAgent.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Mirrors.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Module.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Nox.pm Runs CPAN while avoiding compiled extensions cpan/CPAN/lib/CPAN/Plugin.pm cpan/CPAN/lib/CPAN/Plugin/Specfile.pm cpan/CPAN/lib/CPAN/Prompt.pm -cpan/CPAN/lib/CPAN/Queue.pm queueing system for CPAN.pm +cpan/CPAN/lib/CPAN/Queue.pm queueing system for CPAN.pm cpan/CPAN/lib/CPAN/Shell.pm -cpan/CPAN/lib/CPAN/Tarzip.pm helper package for CPAN.pm +cpan/CPAN/lib/CPAN/Tarzip.pm helper package for CPAN.pm cpan/CPAN/lib/CPAN/URL.pm -cpan/CPAN/lib/CPAN/Version.pm Simple math with different flavors of version strings -cpan/CPAN/PAUSE2003.pub CPAN public key -cpan/CPAN/PAUSE2005.pub CPAN public key -cpan/CPAN/PAUSE2007.pub CPAN public key -cpan/CPAN/PAUSE2009.pub CPAN public key +cpan/CPAN/lib/CPAN/Version.pm Simple math with different flavors of version strings +cpan/CPAN/PAUSE2003.pub CPAN public key +cpan/CPAN/PAUSE2005.pub CPAN public key +cpan/CPAN/PAUSE2007.pub CPAN public key +cpan/CPAN/PAUSE2009.pub CPAN public key cpan/CPAN/PAUSE2011.pub cpan/CPAN/PAUSE2022.pub -cpan/CPAN/scripts/cpan easily interact with CPAN from the command line -cpan/CPAN/t/01loadme.t See if CPAN the module works -cpan/CPAN/t/02nox.t See if CPAN::Nox works -cpan/CPAN/t/03pkgs.t See if CPAN::Version works -cpan/CPAN/t/10version.t See if CPAN the module works -cpan/CPAN/t/11mirroredby.t See if CPAN::Mirrored::By works +cpan/CPAN/scripts/cpan easily interact with CPAN from the command line +cpan/CPAN/t/01loadme.t See if CPAN the module works +cpan/CPAN/t/02nox.t See if CPAN::Nox works +cpan/CPAN/t/03pkgs.t See if CPAN::Version works +cpan/CPAN/t/10version.t See if CPAN the module works +cpan/CPAN/t/11mirroredby.t See if CPAN::Mirrored::By works cpan/CPAN/t/32pushyhttps.t cpan/CPAN-Meta/corpus/BadMETA.yml cpan/CPAN-Meta/corpus/bareyaml.meta @@ -446,14 +648,14 @@ cpan/CPAN-Meta-Requirements/t/finalize.t cpan/CPAN-Meta-Requirements/t/from-hash.t cpan/CPAN-Meta-Requirements/t/merge.t cpan/CPAN-Meta-Requirements/t/strings.t -cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm CPAN-Meta-YAML files +cpan/CPAN-Meta-YAML/lib/CPAN/Meta/YAML.pm CPAN-Meta-YAML files cpan/CPAN-Meta-YAML/t/01_api.t -cpan/CPAN-Meta-YAML/t/01_compile.t CPAN-Meta-YAML files +cpan/CPAN-Meta-YAML/t/01_compile.t CPAN-Meta-YAML files cpan/CPAN-Meta-YAML/t/10_read.t cpan/CPAN-Meta-YAML/t/11_read_string.t cpan/CPAN-Meta-YAML/t/12_write.t cpan/CPAN-Meta-YAML/t/13_write_string.t -cpan/CPAN-Meta-YAML/t/20_subclass.t CPAN-Meta-YAML files +cpan/CPAN-Meta-YAML/t/20_subclass.t CPAN-Meta-YAML files cpan/CPAN-Meta-YAML/t/21_yamlpm_compat.t cpan/CPAN-Meta-YAML/t/30_yaml_spec_tml.t cpan/CPAN-Meta-YAML/t/31_local_tml.t @@ -461,8 +663,8 @@ cpan/CPAN-Meta-YAML/t/32_world_tml.t cpan/CPAN-Meta-YAML/t/86_fail.t cpan/CPAN-Meta-YAML/t/data/ascii.yml cpan/CPAN-Meta-YAML/t/data/latin1.yml -cpan/CPAN-Meta-YAML/t/data/multibyte.yml CPAN-Meta-YAML files -cpan/CPAN-Meta-YAML/t/data/utf_16_le_bom.yml CPAN-Meta-YAML files +cpan/CPAN-Meta-YAML/t/data/multibyte.yml CPAN-Meta-YAML files +cpan/CPAN-Meta-YAML/t/data/utf_16_le_bom.yml CPAN-Meta-YAML files cpan/CPAN-Meta-YAML/t/data/utf_8_bom.yml cpan/CPAN-Meta-YAML/t/lib/SubtestCompat.pm cpan/CPAN-Meta-YAML/t/lib/TestBridge.pm @@ -497,30 +699,30 @@ cpan/CPAN-Meta-YAML/t/tml-world/toolbar. cpan/CPAN-Meta-YAML/t/tml-world/Vanilla-Perl.tml cpan/CPAN-Meta-YAML/t/tml-world/YAML-Tiny-META.tml cpan/CPAN-Meta-YAML/t/tml-world/yaml_org.tml -cpan/DB_File/config.in Part of Berkeley DB configuration -cpan/DB_File/DB_File.pm Berkeley DB extension Perl module -cpan/DB_File/DB_File.xs Berkeley DB extension external subroutines -cpan/DB_File/dbinfo Berkeley DB database version checker +cpan/DB_File/config.in Part of Berkeley DB configuration +cpan/DB_File/DB_File.pm Berkeley DB extension Perl module +cpan/DB_File/DB_File.xs Berkeley DB extension external subroutines +cpan/DB_File/dbinfo Berkeley DB database version checker cpan/DB_File/hints/bitrig.pl -cpan/DB_File/hints/dynixptx.pl Hint for DB_File for named architecture +cpan/DB_File/hints/dynixptx.pl Hint for DB_File for named architecture cpan/DB_File/hints/minix.pl cpan/DB_File/hints/netbsd.pl cpan/DB_File/hints/openbsd.pl -cpan/DB_File/hints/sco.pl Hint for DB_File for named architecture -cpan/DB_File/Makefile.PL Berkeley DB extension makefile writer -cpan/DB_File/t/db-btree.t See if DB_File works -cpan/DB_File/t/db-hash.t See if DB_File works -cpan/DB_File/t/db-recno.t See if DB_File works -cpan/DB_File/t/db-threads.t See if DB_File works -cpan/DB_File/typemap Berkeley DB extension interface types -cpan/DB_File/version.c Berkeley DB extension interface version check +cpan/DB_File/hints/sco.pl Hint for DB_File for named architecture +cpan/DB_File/Makefile.PL Berkeley DB extension makefile writer +cpan/DB_File/t/db-btree.t See if DB_File works +cpan/DB_File/t/db-hash.t See if DB_File works +cpan/DB_File/t/db-recno.t See if DB_File works +cpan/DB_File/t/db-threads.t See if DB_File works +cpan/DB_File/typemap Berkeley DB extension interface types +cpan/DB_File/version.c Berkeley DB extension interface version check cpan/Digest/lib/Digest.pm cpan/Digest/lib/Digest/base.pm cpan/Digest/lib/Digest/file.pm -cpan/Digest/t/base.t See if Digest extensions work -cpan/Digest/t/digest.t See if Digest extensions work -cpan/Digest/t/file.t See if Digest extensions work -cpan/Digest/t/lib/Digest/Dummy.pm See if Digest extensions work +cpan/Digest/t/base.t See if Digest extensions work +cpan/Digest/t/digest.t See if Digest extensions work +cpan/Digest/t/file.t See if Digest extensions work +cpan/Digest/t/lib/Digest/Dummy.pm See if Digest extensions work cpan/Digest/t/security.t See if Digest extensions work cpan/Digest-MD5/hints/dec_osf.pl Hints for named architecture cpan/Digest-MD5/hints/irix_6.pl Hints for named architecture @@ -571,225 +773,226 @@ cpan/Digest-SHA/t/state.t See if Digest cpan/Digest-SHA/t/unicode.t cpan/Digest-SHA/t/woodbury.t See if Digest::SHA works cpan/Digest-SHA/typemap Typemap for Digest::SHA -cpan/Encode/bin/enc2xs Encode module generator -cpan/Encode/bin/encguess guess character encodings of files -cpan/Encode/bin/piconv iconv by perl -cpan/Encode/bin/ucm2table Table Generator for testing -cpan/Encode/bin/ucmlint A UCM Lint utility -cpan/Encode/bin/ucmsort A UCM sort utility -cpan/Encode/bin/unidump Unicode Dump like hexdump(1) -cpan/Encode/Byte/Byte.pm Encode extension -cpan/Encode/Byte/Makefile.PL Encode extension -cpan/Encode/CN/CN.pm Encode extension -cpan/Encode/CN/Makefile.PL Encode extension -cpan/Encode/EBCDIC/EBCDIC.pm Encode extension -cpan/Encode/EBCDIC/Makefile.PL Encode extension -cpan/Encode/encengine.c Encode extension -cpan/Encode/Encode.pm Mother of all Encode extensions -cpan/Encode/Encode.xs Encode extension -cpan/Encode/Encode/_PM.e2x Skeleton file for enc2xs -cpan/Encode/Encode/_T.e2x Skeleton file for enc2xs -cpan/Encode/Encode/Changes.e2x Skeleton file for enc2xs -cpan/Encode/Encode/ConfigLocal_PM.e2x Skeleton file for enc2xs -cpan/Encode/Encode/encode.h Encode extension header file -cpan/Encode/Encode/Makefile_PL.e2x Skeleton file for enc2xs -cpan/Encode/Encode/README.e2x Skeleton file for enc2xs -cpan/Encode/encoding.pm Perl Pragmatic Module -cpan/Encode/JP/JP.pm Encode extension -cpan/Encode/JP/Makefile.PL Encode extension -cpan/Encode/KR/KR.pm Encode extension -cpan/Encode/KR/Makefile.PL Encode extension -cpan/Encode/lib/Encode/Alias.pm Encode extension -cpan/Encode/lib/Encode/CJKConstants.pm Encode extension -cpan/Encode/lib/Encode/CN/HZ.pm Encode extension -cpan/Encode/lib/Encode/Config.pm Encode configuration module -cpan/Encode/lib/Encode/Encoder.pm OO Encoder -cpan/Encode/lib/Encode/Encoding.pm Encode extension -cpan/Encode/lib/Encode/GSM0338.pm Encode extension -cpan/Encode/lib/Encode/Guess.pm Encode Extension -cpan/Encode/lib/Encode/JP/H2Z.pm Encode extension -cpan/Encode/lib/Encode/JP/JIS7.pm Encode extension -cpan/Encode/lib/Encode/KR/2022_KR.pm Encode extension -cpan/Encode/lib/Encode/MIME/Header.pm Encode extension +cpan/Encode/bin/enc2xs Encode module generator +cpan/Encode/bin/encguess guess character encodings of files +cpan/Encode/bin/piconv iconv by perl +cpan/Encode/bin/ucm2table Table Generator for testing +cpan/Encode/bin/ucmlint A UCM Lint utility +cpan/Encode/bin/ucmsort A UCM sort utility +cpan/Encode/bin/unidump Unicode Dump like hexdump(1) +cpan/Encode/Byte/Byte.pm Encode extension +cpan/Encode/Byte/Makefile.PL Encode extension +cpan/Encode/CN/CN.pm Encode extension +cpan/Encode/CN/Makefile.PL Encode extension +cpan/Encode/EBCDIC/EBCDIC.pm Encode extension +cpan/Encode/EBCDIC/Makefile.PL Encode extension +cpan/Encode/encengine.c Encode extension +cpan/Encode/Encode.pm Mother of all Encode extensions +cpan/Encode/Encode.xs Encode extension +cpan/Encode/Encode/_PM.e2x Skeleton file for enc2xs +cpan/Encode/Encode/_T.e2x Skeleton file for enc2xs +cpan/Encode/Encode/Changes.e2x Skeleton file for enc2xs +cpan/Encode/Encode/ConfigLocal_PM.e2x Skeleton file for enc2xs +cpan/Encode/Encode/encode.h Encode extension header file +cpan/Encode/Encode/Makefile_PL.e2x Skeleton file for enc2xs +cpan/Encode/Encode/README.e2x Skeleton file for enc2xs +cpan/Encode/encoding.pm Perl Pragmatic Module +cpan/Encode/JP/JP.pm Encode extension +cpan/Encode/JP/Makefile.PL Encode extension +cpan/Encode/KR/KR.pm Encode extension +cpan/Encode/KR/Makefile.PL Encode extension +cpan/Encode/lib/Encode/Alias.pm Encode extension +cpan/Encode/lib/Encode/CJKConstants.pm Encode extension +cpan/Encode/lib/Encode/CN/HZ.pm Encode extension +cpan/Encode/lib/Encode/Config.pm Encode configuration module +cpan/Encode/lib/Encode/Encoder.pm OO Encoder +cpan/Encode/lib/Encode/Encoding.pm Encode extension +cpan/Encode/lib/Encode/GSM0338.pm Encode extension +cpan/Encode/lib/Encode/Guess.pm Encode Extension +cpan/Encode/lib/Encode/JP/H2Z.pm Encode extension +cpan/Encode/lib/Encode/JP/JIS7.pm Encode extension +cpan/Encode/lib/Encode/KR/2022_KR.pm Encode extension +cpan/Encode/lib/Encode/MIME/Header.pm Encode extension cpan/Encode/lib/Encode/MIME/Header/ISO_2022_JP.pm Encode extension -cpan/Encode/lib/Encode/MIME/Name.pm Encode extension -cpan/Encode/lib/Encode/PerlIO.pod Documents for Encode & PerlIO -cpan/Encode/lib/Encode/Supported.pod Documents for supported encodings -cpan/Encode/lib/Encode/Unicode/UTF7.pm Encode extension -cpan/Encode/Makefile.PL Encode extension makefile writer -cpan/Encode/Symbol/Makefile.PL Encode extension -cpan/Encode/Symbol/Symbol.pm Encode extension -cpan/Encode/t/Aliases.t test script -cpan/Encode/t/at-cn.t test script -cpan/Encode/t/at-tw.t test script -cpan/Encode/t/big5-eten.enc test data -cpan/Encode/t/big5-eten.utf test data -cpan/Encode/t/big5-hkscs.enc test data -cpan/Encode/t/big5-hkscs.utf test data -cpan/Encode/t/CJKT.t test script +cpan/Encode/lib/Encode/MIME/Name.pm Encode extension +cpan/Encode/lib/Encode/PerlIO.pod Documents for Encode & PerlIO +cpan/Encode/lib/Encode/Supported.pod Documents for supported encodings +cpan/Encode/lib/Encode/Unicode/UTF7.pm Encode extension +cpan/Encode/Makefile.PL Encode extension makefile writer +cpan/Encode/Symbol/Makefile.PL Encode extension +cpan/Encode/Symbol/Symbol.pm Encode extension +cpan/Encode/t/Aliases.t test script +cpan/Encode/t/at-cn.t test script +cpan/Encode/t/at-tw.t test script +cpan/Encode/t/big5-eten.enc test data +cpan/Encode/t/big5-eten.utf test data +cpan/Encode/t/big5-hkscs.enc test data +cpan/Encode/t/big5-hkscs.utf test data +cpan/Encode/t/CJKT.t test script cpan/Encode/t/cow.t cpan/Encode/t/decode.t -cpan/Encode/t/enc_data.t test script for utf8 DATA -cpan/Encode/t/enc_eucjp.t test script -cpan/Encode/t/enc_module.enc test data for t/enc_module.t -cpan/Encode/t/enc_module.t test script -cpan/Encode/t/enc_utf8.t test script -cpan/Encode/t/Encode.t test script -cpan/Encode/t/Encoder.t test script -cpan/Encode/t/encoding.t test script -cpan/Encode/t/encoding-locale.t test script -cpan/Encode/t/fallback.t test script -cpan/Encode/t/from_to.t test script -cpan/Encode/t/gb2312.enc test data -cpan/Encode/t/gb2312.utf test data -cpan/Encode/t/grow.t test script -cpan/Encode/t/gsm0338.t test script -cpan/Encode/t/guess.t test script +cpan/Encode/t/enc_data.t test script for utf8 DATA +cpan/Encode/t/enc_eucjp.t test script +cpan/Encode/t/enc_module.enc test data for t/enc_module.t +cpan/Encode/t/enc_module.t test script +cpan/Encode/t/enc_utf8.t test script +cpan/Encode/t/Encode.t test script +cpan/Encode/t/Encoder.t test script +cpan/Encode/t/encoding.t test script +cpan/Encode/t/encoding-locale.t test script +cpan/Encode/t/fallback.t test script +cpan/Encode/t/from_to.t test script +cpan/Encode/t/gb2312.enc test data +cpan/Encode/t/gb2312.utf test data +cpan/Encode/t/grow.t test script +cpan/Encode/t/gsm0338.t test script +cpan/Encode/t/guess.t test script cpan/Encode/t/isa.t -cpan/Encode/t/jis7-fallback.t test script -cpan/Encode/t/jisx0201.enc test data -cpan/Encode/t/jisx0201.utf test data -cpan/Encode/t/jisx0208.enc test data -cpan/Encode/t/jisx0208.utf test data -cpan/Encode/t/jisx0212.enc test data -cpan/Encode/t/jisx0212.utf test data -cpan/Encode/t/jperl.t test script -cpan/Encode/t/ksc5601.enc test data -cpan/Encode/t/ksc5601.utf test data -cpan/Encode/t/magic.t test script -cpan/Encode/t/mime-header.t test script -cpan/Encode/t/mime-name.t test script -cpan/Encode/t/mime_header_iso2022jp.t test script -cpan/Encode/t/Mod_EUCJP.pm module that t/enc_module.enc uses -cpan/Encode/t/perlio.t test script -cpan/Encode/t/piconv.t Test for piconv.t -cpan/Encode/t/rt.pl test script -cpan/Encode/t/rt113164.t test script -cpan/Encode/t/rt65541.t test script -cpan/Encode/t/rt76824.t test script -cpan/Encode/t/rt85489.t test script -cpan/Encode/t/rt86327.t test script +cpan/Encode/t/jis7-fallback.t test script +cpan/Encode/t/jisx0201.enc test data +cpan/Encode/t/jisx0201.utf test data +cpan/Encode/t/jisx0208.enc test data +cpan/Encode/t/jisx0208.utf test data +cpan/Encode/t/jisx0212.enc test data +cpan/Encode/t/jisx0212.utf test data +cpan/Encode/t/jperl.t test script +cpan/Encode/t/ksc5601.enc test data +cpan/Encode/t/ksc5601.utf test data +cpan/Encode/t/magic.t test script +cpan/Encode/t/mime-header.t test script +cpan/Encode/t/mime-name.t test script +cpan/Encode/t/mime_header_iso2022jp.t test script +cpan/Encode/t/Mod_EUCJP.pm module that t/enc_module.enc uses +cpan/Encode/t/perlio.t test script +cpan/Encode/t/piconv.t Test for piconv.t +cpan/Encode/t/rt.pl test script +cpan/Encode/t/rt113164.t test script +cpan/Encode/t/rt65541.t test script +cpan/Encode/t/rt76824.t test script +cpan/Encode/t/rt85489.t test script +cpan/Encode/t/rt86327.t test script cpan/Encode/t/taint.t cpan/Encode/t/truncated_utf8.t cpan/Encode/t/undef.t -cpan/Encode/t/unibench.pl benchmark script -cpan/Encode/t/Unicode.t test script +cpan/Encode/t/unibench.pl benchmark script +cpan/Encode/t/Unicode.t test script cpan/Encode/t/Unicode_trailing_nul.t cpan/Encode/t/use-Encode-Alias.t cpan/Encode/t/utf32warnings.t -cpan/Encode/t/utf8ref.t test script -cpan/Encode/t/utf8strict.t test script +cpan/Encode/t/utf8ref.t test script +cpan/Encode/t/utf8strict.t test script cpan/Encode/t/utf8warnings.t cpan/Encode/t/xml.t -cpan/Encode/TW/Makefile.PL Encode extension -cpan/Encode/TW/TW.pm Encode extension -cpan/Encode/ucm/8859-1.ucm Unicode Character Map -cpan/Encode/ucm/8859-10.ucm Unicode Character Map -cpan/Encode/ucm/8859-11.ucm Unicode Character Map -cpan/Encode/ucm/8859-13.ucm Unicode Character Map -cpan/Encode/ucm/8859-14.ucm Unicode Character Map -cpan/Encode/ucm/8859-15.ucm Unicode Character Map -cpan/Encode/ucm/8859-16.ucm Unicode Character Map -cpan/Encode/ucm/8859-2.ucm Unicode Character Map -cpan/Encode/ucm/8859-3.ucm Unicode Character Map -cpan/Encode/ucm/8859-4.ucm Unicode Character Map -cpan/Encode/ucm/8859-5.ucm Unicode Character Map -cpan/Encode/ucm/8859-6.ucm Unicode Character Map -cpan/Encode/ucm/8859-7.ucm Unicode Character Map -cpan/Encode/ucm/8859-8.ucm Unicode Character Map -cpan/Encode/ucm/8859-9.ucm Unicode Character Map -cpan/Encode/ucm/adobeStdenc.ucm Unicode Character Map -cpan/Encode/ucm/adobeSymbol.ucm Unicode Character Map -cpan/Encode/ucm/adobeZdingbat.ucm Unicode Character Map -cpan/Encode/ucm/ascii.ucm Unicode Character Map -cpan/Encode/ucm/big5-eten.ucm Unicode Character Map -cpan/Encode/ucm/big5-hkscs.ucm Unicode Character Map -cpan/Encode/ucm/cp037.ucm Unicode Character Map -cpan/Encode/ucm/cp1006.ucm Unicode Character Map -cpan/Encode/ucm/cp1026.ucm Unicode Character Map -cpan/Encode/ucm/cp1047.ucm Unicode Character Map -cpan/Encode/ucm/cp1250.ucm Unicode Character Map -cpan/Encode/ucm/cp1251.ucm Unicode Character Map -cpan/Encode/ucm/cp1252.ucm Unicode Character Map -cpan/Encode/ucm/cp1253.ucm Unicode Character Map -cpan/Encode/ucm/cp1254.ucm Unicode Character Map -cpan/Encode/ucm/cp1255.ucm Unicode Character Map -cpan/Encode/ucm/cp1256.ucm Unicode Character Map -cpan/Encode/ucm/cp1257.ucm Unicode Character Map -cpan/Encode/ucm/cp1258.ucm Unicode Character Map -cpan/Encode/ucm/cp424.ucm Unicode Character Map -cpan/Encode/ucm/cp437.ucm Unicode Character Map -cpan/Encode/ucm/cp500.ucm Unicode Character Map -cpan/Encode/ucm/cp737.ucm Unicode Character Map -cpan/Encode/ucm/cp775.ucm Unicode Character Map -cpan/Encode/ucm/cp850.ucm Unicode Character Map -cpan/Encode/ucm/cp852.ucm Unicode Character Map -cpan/Encode/ucm/cp855.ucm Unicode Character Map -cpan/Encode/ucm/cp856.ucm Unicode Character Map -cpan/Encode/ucm/cp857.ucm Unicode Character Map -cpan/Encode/ucm/cp858.ucm Unicode Character Map -cpan/Encode/ucm/cp860.ucm Unicode Character Map -cpan/Encode/ucm/cp861.ucm Unicode Character Map -cpan/Encode/ucm/cp862.ucm Unicode Character Map -cpan/Encode/ucm/cp863.ucm Unicode Character Map -cpan/Encode/ucm/cp864.ucm Unicode Character Map -cpan/Encode/ucm/cp865.ucm Unicode Character Map -cpan/Encode/ucm/cp866.ucm Unicode Character Map -cpan/Encode/ucm/cp869.ucm Unicode Character Map -cpan/Encode/ucm/cp874.ucm Unicode Character Map -cpan/Encode/ucm/cp875.ucm Unicode Character Map -cpan/Encode/ucm/cp932.ucm Unicode Character Map -cpan/Encode/ucm/cp936.ucm Unicode Character Map -cpan/Encode/ucm/cp949.ucm Unicode Character Map -cpan/Encode/ucm/cp950.ucm Unicode Character Map -cpan/Encode/ucm/ctrl.ucm Unicode Character Map -cpan/Encode/ucm/dingbats.ucm Unicode Character Map -cpan/Encode/ucm/euc-cn.ucm Unicode Character Map -cpan/Encode/ucm/euc-jp.ucm Unicode Character Map -cpan/Encode/ucm/euc-kr.ucm Unicode Character Map -cpan/Encode/ucm/gb12345.ucm Unicode Character Map -cpan/Encode/ucm/gb2312.ucm Unicode Character Map -cpan/Encode/ucm/hp-roman8.ucm Unicode Character Map -cpan/Encode/ucm/ir-165.ucm Unicode Character Map -cpan/Encode/ucm/jis0201.ucm Unicode Character Map -cpan/Encode/ucm/jis0208.ucm Unicode Character Map -cpan/Encode/ucm/jis0212.ucm Unicode Character Map -cpan/Encode/ucm/johab.ucm Unicode Character Map -cpan/Encode/ucm/koi8-f.ucm Unicode Character Map -cpan/Encode/ucm/koi8-r.ucm Unicode Character Map -cpan/Encode/ucm/koi8-u.ucm Unicode Character Map -cpan/Encode/ucm/ksc5601.ucm Unicode Character Map -cpan/Encode/ucm/macArabic.ucm Unicode Character Map -cpan/Encode/ucm/macCentEuro.ucm Unicode Character Map -cpan/Encode/ucm/macChinsimp.ucm Unicode Character Map -cpan/Encode/ucm/macChintrad.ucm Unicode Character Map -cpan/Encode/ucm/macCroatian.ucm Unicode Character Map -cpan/Encode/ucm/macCyrillic.ucm Unicode Character Map -cpan/Encode/ucm/macDingbats.ucm Unicode Character Map -cpan/Encode/ucm/macFarsi.ucm Unicode Character Map -cpan/Encode/ucm/macGreek.ucm Unicode Character Map -cpan/Encode/ucm/macHebrew.ucm Unicode Character Map -cpan/Encode/ucm/macIceland.ucm Unicode Character Map -cpan/Encode/ucm/macJapanese.ucm Unicode Character Map -cpan/Encode/ucm/macKorean.ucm Unicode Character Map -cpan/Encode/ucm/macRoman.ucm Unicode Character Map -cpan/Encode/ucm/macROMnn.ucm Unicode Character Map -cpan/Encode/ucm/macRUMnn.ucm Unicode Character Map -cpan/Encode/ucm/macSami.ucm Unicode Character Map -cpan/Encode/ucm/macSymbol.ucm Unicode Character Map -cpan/Encode/ucm/macThai.ucm Unicode Character Map -cpan/Encode/ucm/macTurkish.ucm Unicode Character Map -cpan/Encode/ucm/macUkraine.ucm Unicode Character Map -cpan/Encode/ucm/nextstep.ucm Unicode Character Map -cpan/Encode/ucm/null.ucm Unicode Character Map -cpan/Encode/ucm/posix-bc.ucm Unicode Character Map -cpan/Encode/ucm/shiftjis.ucm Unicode Character Map -cpan/Encode/ucm/symbol.ucm Unicode Character Map -cpan/Encode/ucm/viscii.ucm Unicode Character Map -cpan/Encode/Unicode/Makefile.PL Encode extension -cpan/Encode/Unicode/Unicode.pm Encode extension -cpan/Encode/Unicode/Unicode.xs Encode extension +cpan/Encode/TW/Makefile.PL Encode extension +cpan/Encode/TW/TW.pm Encode extension +cpan/Encode/ucm/8859-1.ucm Unicode Character Map +cpan/Encode/ucm/8859-10.ucm Unicode Character Map +cpan/Encode/ucm/8859-11.ucm Unicode Character Map +cpan/Encode/ucm/8859-13.ucm Unicode Character Map +cpan/Encode/ucm/8859-14.ucm Unicode Character Map +cpan/Encode/ucm/8859-15.ucm Unicode Character Map +cpan/Encode/ucm/8859-16.ucm Unicode Character Map +cpan/Encode/ucm/8859-2.ucm Unicode Character Map +cpan/Encode/ucm/8859-3.ucm Unicode Character Map +cpan/Encode/ucm/8859-4.ucm Unicode Character Map +cpan/Encode/ucm/8859-5.ucm Unicode Character Map +cpan/Encode/ucm/8859-6.ucm Unicode Character Map +cpan/Encode/ucm/8859-7.ucm Unicode Character Map +cpan/Encode/ucm/8859-8.ucm Unicode Character Map +cpan/Encode/ucm/8859-9.ucm Unicode Character Map +cpan/Encode/ucm/adobeStdenc.ucm Unicode Character Map +cpan/Encode/ucm/adobeSymbol.ucm Unicode Character Map +cpan/Encode/ucm/adobeZdingbat.ucm Unicode Character Map +cpan/Encode/ucm/ascii.ucm Unicode Character Map +cpan/Encode/ucm/big5-eten.ucm Unicode Character Map +cpan/Encode/ucm/big5-hkscs.ucm Unicode Character Map +cpan/Encode/ucm/cp037.ucm Unicode Character Map +cpan/Encode/ucm/cp1006.ucm Unicode Character Map +cpan/Encode/ucm/cp1026.ucm Unicode Character Map +cpan/Encode/ucm/cp1047.ucm Unicode Character Map +cpan/Encode/ucm/cp1250.ucm Unicode Character Map +cpan/Encode/ucm/cp1251.ucm Unicode Character Map +cpan/Encode/ucm/cp1252.ucm Unicode Character Map +cpan/Encode/ucm/cp1253.ucm Unicode Character Map +cpan/Encode/ucm/cp1254.ucm Unicode Character Map +cpan/Encode/ucm/cp1255.ucm Unicode Character Map +cpan/Encode/ucm/cp1256.ucm Unicode Character Map +cpan/Encode/ucm/cp1257.ucm Unicode Character Map +cpan/Encode/ucm/cp1258.ucm Unicode Character Map +cpan/Encode/ucm/cp424.ucm Unicode Character Map +cpan/Encode/ucm/cp437.ucm Unicode Character Map +cpan/Encode/ucm/cp500.ucm Unicode Character Map +cpan/Encode/ucm/cp737.ucm Unicode Character Map +cpan/Encode/ucm/cp775.ucm Unicode Character Map +cpan/Encode/ucm/cp850.ucm Unicode Character Map +cpan/Encode/ucm/cp852.ucm Unicode Character Map +cpan/Encode/ucm/cp855.ucm Unicode Character Map +cpan/Encode/ucm/cp856.ucm Unicode Character Map +cpan/Encode/ucm/cp857.ucm Unicode Character Map +cpan/Encode/ucm/cp858.ucm Unicode Character Map +cpan/Encode/ucm/cp860.ucm Unicode Character Map +cpan/Encode/ucm/cp861.ucm Unicode Character Map +cpan/Encode/ucm/cp862.ucm Unicode Character Map +cpan/Encode/ucm/cp863.ucm Unicode Character Map +cpan/Encode/ucm/cp864.ucm Unicode Character Map +cpan/Encode/ucm/cp865.ucm Unicode Character Map +cpan/Encode/ucm/cp866.ucm Unicode Character Map +cpan/Encode/ucm/cp869.ucm Unicode Character Map +cpan/Encode/ucm/cp874.ucm Unicode Character Map +cpan/Encode/ucm/cp875.ucm Unicode Character Map +cpan/Encode/ucm/cp932.ucm Unicode Character Map +cpan/Encode/ucm/cp936.ucm Unicode Character Map +cpan/Encode/ucm/cp949.ucm Unicode Character Map +cpan/Encode/ucm/cp950.ucm Unicode Character Map +cpan/Encode/ucm/ctrl.ucm Unicode Character Map +cpan/Encode/ucm/dingbats.ucm Unicode Character Map +cpan/Encode/ucm/euc-cn.ucm Unicode Character Map +cpan/Encode/ucm/euc-jp.ucm Unicode Character Map +cpan/Encode/ucm/euc-kr.ucm Unicode Character Map +cpan/Encode/ucm/gb12345.ucm Unicode Character Map +cpan/Encode/ucm/gb2312.ucm Unicode Character Map +cpan/Encode/ucm/hp-roman8.ucm Unicode Character Map +cpan/Encode/ucm/ir-165.ucm Unicode Character Map +cpan/Encode/ucm/jis0201.ucm Unicode Character Map +cpan/Encode/ucm/jis0208.ucm Unicode Character Map +cpan/Encode/ucm/jis0212.ucm Unicode Character Map +cpan/Encode/ucm/johab.ucm Unicode Character Map +cpan/Encode/ucm/koi8-f.ucm Unicode Character Map +cpan/Encode/ucm/koi8-r.ucm Unicode Character Map +cpan/Encode/ucm/koi8-u.ucm Unicode Character Map +cpan/Encode/ucm/ksc5601.ucm Unicode Character Map +cpan/Encode/ucm/macArabic.ucm Unicode Character Map +cpan/Encode/ucm/macCentEuro.ucm Unicode Character Map +cpan/Encode/ucm/macChinsimp.ucm Unicode Character Map +cpan/Encode/ucm/macChintrad.ucm Unicode Character Map +cpan/Encode/ucm/macCroatian.ucm Unicode Character Map +cpan/Encode/ucm/macCyrillic.ucm Unicode Character Map +cpan/Encode/ucm/macDingbats.ucm Unicode Character Map +cpan/Encode/ucm/macFarsi.ucm Unicode Character Map +cpan/Encode/ucm/macGreek.ucm Unicode Character Map +cpan/Encode/ucm/macHebrew.ucm Unicode Character Map +cpan/Encode/ucm/macIceland.ucm Unicode Character Map +cpan/Encode/ucm/macJapanese.ucm Unicode Character Map +cpan/Encode/ucm/macKorean.ucm Unicode Character Map +cpan/Encode/ucm/macRoman.ucm Unicode Character Map +cpan/Encode/ucm/macROMnn.ucm Unicode Character Map +cpan/Encode/ucm/macRUMnn.ucm Unicode Character Map +cpan/Encode/ucm/macSami.ucm Unicode Character Map +cpan/Encode/ucm/macSymbol.ucm Unicode Character Map +cpan/Encode/ucm/macThai.ucm Unicode Character Map +cpan/Encode/ucm/macTurkish.ucm Unicode Character Map +cpan/Encode/ucm/macUkraine.ucm Unicode Character Map +cpan/Encode/ucm/nextstep.ucm Unicode Character Map +cpan/Encode/ucm/null.ucm Unicode Character Map +cpan/Encode/ucm/posix-bc.ucm Unicode Character Map +cpan/Encode/ucm/shiftjis.ucm Unicode Character Map +cpan/Encode/ucm/symbol.ucm Unicode Character Map +cpan/Encode/ucm/viscii.ucm Unicode Character Map +cpan/Encode/Unicode/Makefile.PL Encode extension +cpan/Encode/Unicode/Unicode.pm Encode extension +cpan/Encode/Unicode/Unicode.xs Encode extension cpan/experimental/lib/experimental.pm +cpan/experimental/lib/stable.pm cpan/experimental/t/basic.t cpan/ExtUtils-Constant/lib/ExtUtils/Constant.pm generate XS code to import C header constants cpan/ExtUtils-Constant/lib/ExtUtils/Constant/Base.pm generate XS code to import C header constants @@ -809,121 +1012,121 @@ cpan/ExtUtils-Install/t/lib/MakeMaker/Te cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Utils.pm MakeMaker test utilities cpan/ExtUtils-Install/t/lib/TieOut.pm Testing library to capture prints cpan/ExtUtils-Install/t/Packlist.t See if Packlist works -cpan/ExtUtils-MakeMaker/bin/instmodsh Give information about installed extensions -cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm -cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command/MM.pm Calling MM functions from the cmd line -cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist.pm Locates libraries -cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm Does the real work of the above -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm Write Makefiles for extensions -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Config.pm MakeMaker wrapper for Config -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/FAQ.pod MakeMaker FAQ -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Tutorial.pod Writing a module with MakeMaker -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm -cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mkbootstrap.pm Writes a bootstrap file (see MakeMaker) -cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mksymlists.pm Writes a linker options file for extensions -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM.pm MakeMaker adaptor class -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_AIX.pm MakeMaker methods for AIX -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm MakeMaker methods for Any OS -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_BeOS.pm MakeMaker methods for BeOS -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm MakeMaker methods for Cygwin -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Darwin.pm MakeMaker methods for Darwin -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_DOS.pm MakeMaker methods for DOS -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_MacOS.pm MakeMaker methods for MacOS -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_NW5.pm MakeMaker methods for NetWare -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS2.pm MakeMaker methods for OS/2 -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS390.pm MakeMaker methods for OS 390 -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_QNX.pm MakeMaker methods for QNX -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm MakeMaker methods for Unix -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_UWIN.pm MakeMaker methods for U/WIN -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VMS.pm MakeMaker methods for VMS -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VOS.pm MakeMaker methods for VOS -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win32.pm MakeMaker methods for Win32 -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win95.pm MakeMaker methods for Win95 -cpan/ExtUtils-MakeMaker/lib/ExtUtils/MY.pm MakeMaker user override class -cpan/ExtUtils-MakeMaker/lib/ExtUtils/testlib.pm Fixes up @INC to use just-built extension -cpan/ExtUtils-MakeMaker/t/00compile.t See if MakeMaker modules compile -cpan/ExtUtils-MakeMaker/t/01perl_bugs.t -cpan/ExtUtils-MakeMaker/t/02-xsdynamic.t -cpan/ExtUtils-MakeMaker/t/03-xsstatic.t -cpan/ExtUtils-MakeMaker/t/04-xs-rpath-darwin.t -cpan/ExtUtils-MakeMaker/t/arch_check.t Test MakeMaker's arch_check() -cpan/ExtUtils-MakeMaker/t/backwards.t Check MakeMaker's backwards compatibility -cpan/ExtUtils-MakeMaker/t/basic.t See if MakeMaker can build a module -cpan/ExtUtils-MakeMaker/t/build_man.t Set if MakeMaker builds manpages -cpan/ExtUtils-MakeMaker/t/cd.t Test to see cd works -cpan/ExtUtils-MakeMaker/t/config.t Test ExtUtils::MakeMaker::Config -cpan/ExtUtils-MakeMaker/t/cp.t -cpan/ExtUtils-MakeMaker/t/dir_target.t Verify if dir_target() is supported -cpan/ExtUtils-MakeMaker/t/echo.t Test for ExtUtils::MakeMaker -cpan/ExtUtils-MakeMaker/t/eu_command.t -cpan/ExtUtils-MakeMaker/t/FIRST_MAKEFILE.t See if FIRST_MAKEFILE works -cpan/ExtUtils-MakeMaker/t/fix_libs.t Test for ExtUtils::MakeMaker -cpan/ExtUtils-MakeMaker/t/fixin.t See if ExtUtils::MakeMaker works -cpan/ExtUtils-MakeMaker/t/hints.t See if hint files are honored. -cpan/ExtUtils-MakeMaker/t/INST.t Check MakeMaker INST_* macros -cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t See if MakeMaker can apply PREFIXs -cpan/ExtUtils-MakeMaker/t/INSTALL_BASE.t Test INSTALL_BASE in MakeMaker -cpan/ExtUtils-MakeMaker/t/installed_file.t Test for ExtUtils::MakeMaker -cpan/ExtUtils-MakeMaker/t/is_of_type.t Test for ExtUtils::MakeMaker -cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/NoXS.pm MakeMaker test utilities -cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm MakeMaker test utilities -cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/XS.pm MakeMaker test utilities -cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Utils.pm MakeMaker test utilities -cpan/ExtUtils-MakeMaker/t/lib/TieIn.pm Testing library for dummy input handles -cpan/ExtUtils-MakeMaker/t/lib/TieOut.pm Testing library to capture prints -cpan/ExtUtils-MakeMaker/t/Liblist.t See if ExtUtils::Liblist works -cpan/ExtUtils-MakeMaker/t/make.t See if make detection works -cpan/ExtUtils-MakeMaker/t/MakeMaker_Parameters.t test "MakeMaker Parameters" section -cpan/ExtUtils-MakeMaker/t/maketext_filter.t See if maketext_filter works -cpan/ExtUtils-MakeMaker/t/meta_convert.t See if MakeMaker works -cpan/ExtUtils-MakeMaker/t/META_for_testing.json test data for MakeMaker -cpan/ExtUtils-MakeMaker/t/META_for_testing.yml test data for MakeMaker -cpan/ExtUtils-MakeMaker/t/META_for_testing_tricky_version.yml test data for MakeMaker -cpan/ExtUtils-MakeMaker/t/metafile_data.t See if META.yml handling works -cpan/ExtUtils-MakeMaker/t/metafile_file.t See if META.yml handling works -cpan/ExtUtils-MakeMaker/t/min_perl_version.t Test the MIN_PERL_VERSION argument to WriteMakefile. -cpan/ExtUtils-MakeMaker/t/miniperl.t Test MakeMaker with miniperl -cpan/ExtUtils-MakeMaker/t/Mkbootstrap.t See if ExtUtils::Mkbootstrap works -cpan/ExtUtils-MakeMaker/t/MM_Any.t See if ExtUtils::MM_Any works -cpan/ExtUtils-MakeMaker/t/MM_BeOS.t See if ExtUtils::MM_BeOS works -cpan/ExtUtils-MakeMaker/t/MM_Cygwin.t See if ExtUtils::MM_Cygwin works -cpan/ExtUtils-MakeMaker/t/MM_NW5.t See if ExtUtils::MM_NW5 works -cpan/ExtUtils-MakeMaker/t/MM_OS2.t See if ExtUtils::MM_OS2 works -cpan/ExtUtils-MakeMaker/t/MM_Unix.t See if ExtUtils::MM_UNIX works -cpan/ExtUtils-MakeMaker/t/MM_VMS.t See if ExtUtils::MM_VMS works -cpan/ExtUtils-MakeMaker/t/MM_Win32.t See if ExtUtils::MM_Win32 works -cpan/ExtUtils-MakeMaker/t/oneliner.t See if MM can generate perl one-liners -cpan/ExtUtils-MakeMaker/t/os_unsupported.t -cpan/ExtUtils-MakeMaker/t/parse_abstract.t See if parse_abstract works -cpan/ExtUtils-MakeMaker/t/parse_version.t See if parse_version works -cpan/ExtUtils-MakeMaker/t/PL_FILES.t Test PL_FILES in MakeMaker -cpan/ExtUtils-MakeMaker/t/pm.t See if MakeMaker can handle PM -cpan/ExtUtils-MakeMaker/t/pm_to_blib.t Test for ExtUtils::MakeMaker -cpan/ExtUtils-MakeMaker/t/pod2man.t See if MakeMaker can handle no pod2man -cpan/ExtUtils-MakeMaker/t/postamble.t See if postamble works -cpan/ExtUtils-MakeMaker/t/prefixify.t See if MakeMaker can apply a PREFIX -cpan/ExtUtils-MakeMaker/t/prereq.t See if MakeMaker works -cpan/ExtUtils-MakeMaker/t/prereq_print.t See if PREREQ_PRINT works -cpan/ExtUtils-MakeMaker/t/problems.t How MakeMaker reacts to build problems -cpan/ExtUtils-MakeMaker/t/prompt.t See if E::MM::prompt() works -cpan/ExtUtils-MakeMaker/t/recurs.t See if recursive builds work -cpan/ExtUtils-MakeMaker/t/revision.t See if $Revision is correct -cpan/ExtUtils-MakeMaker/t/several_authors.t See if multiple AUTHORs work -cpan/ExtUtils-MakeMaker/t/split_command.t See if MM's xargs-like function works -cpan/ExtUtils-MakeMaker/t/test_boilerplate.t MakeMaker test +cpan/ExtUtils-MakeMaker/bin/instmodsh Give information about installed extensions +cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm Module related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command/MM.pm Calling MM functions from the cmd line +cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist.pm Locates libraries +cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm Does the real work of the above +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm Write Makefiles for extensions +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Config.pm MakeMaker wrapper for Config +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/FAQ.pod MakeMaker FAQ +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm Module related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Tutorial.pod Writing a module with MakeMaker +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm Module related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm Module related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mkbootstrap.pm Writes a bootstrap file (see MakeMaker) +cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mksymlists.pm Writes a linker options file for extensions +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM.pm MakeMaker adaptor class +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_AIX.pm MakeMaker methods for AIX +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm MakeMaker methods for Any OS +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_BeOS.pm MakeMaker methods for BeOS +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm MakeMaker methods for Cygwin +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Darwin.pm MakeMaker methods for Darwin +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_DOS.pm MakeMaker methods for DOS +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_MacOS.pm MakeMaker methods for MacOS +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_NW5.pm MakeMaker methods for NetWare +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS2.pm MakeMaker methods for OS/2 +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS390.pm MakeMaker methods for OS 390 +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_QNX.pm MakeMaker methods for QNX +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm MakeMaker methods for Unix +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_UWIN.pm MakeMaker methods for U/WIN +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VMS.pm MakeMaker methods for VMS +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VOS.pm MakeMaker methods for VOS +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win32.pm MakeMaker methods for Win32 +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win95.pm MakeMaker methods for Win95 +cpan/ExtUtils-MakeMaker/lib/ExtUtils/MY.pm MakeMaker user override class +cpan/ExtUtils-MakeMaker/lib/ExtUtils/testlib.pm Fixes up @INC to use just-built extension +cpan/ExtUtils-MakeMaker/t/00compile.t See if MakeMaker modules compile +cpan/ExtUtils-MakeMaker/t/01perl_bugs.t Test file related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/02-xsdynamic.t Test file related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/03-xsstatic.t Test file related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/04-xs-rpath-darwin.t Test file related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/arch_check.t Test MakeMaker's arch_check() +cpan/ExtUtils-MakeMaker/t/backwards.t Check MakeMaker's backwards compatibility +cpan/ExtUtils-MakeMaker/t/basic.t See if MakeMaker can build a module +cpan/ExtUtils-MakeMaker/t/build_man.t Set if MakeMaker builds manpages +cpan/ExtUtils-MakeMaker/t/cd.t Test to see cd works +cpan/ExtUtils-MakeMaker/t/config.t Test ExtUtils::MakeMaker::Config +cpan/ExtUtils-MakeMaker/t/cp.t Test file related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/dir_target.t Verify if dir_target() is supported +cpan/ExtUtils-MakeMaker/t/echo.t Test for ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/eu_command.t Test file related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/FIRST_MAKEFILE.t See if FIRST_MAKEFILE works +cpan/ExtUtils-MakeMaker/t/fix_libs.t Test for ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/fixin.t See if ExtUtils::MakeMaker works +cpan/ExtUtils-MakeMaker/t/hints.t See if hint files are honored. +cpan/ExtUtils-MakeMaker/t/INST.t Check MakeMaker INST_* macros +cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t See if MakeMaker can apply PREFIXs +cpan/ExtUtils-MakeMaker/t/INSTALL_BASE.t Test INSTALL_BASE in MakeMaker +cpan/ExtUtils-MakeMaker/t/installed_file.t Test for ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/is_of_type.t Test for ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/NoXS.pm MakeMaker test utilities +cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm MakeMaker test utilities +cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/XS.pm MakeMaker test utilities +cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Utils.pm MakeMaker test utilities +cpan/ExtUtils-MakeMaker/t/lib/TieIn.pm Testing library for dummy input handles +cpan/ExtUtils-MakeMaker/t/lib/TieOut.pm Testing library to capture prints +cpan/ExtUtils-MakeMaker/t/Liblist.t See if ExtUtils::Liblist works +cpan/ExtUtils-MakeMaker/t/make.t See if make detection works +cpan/ExtUtils-MakeMaker/t/MakeMaker_Parameters.t test "MakeMaker Parameters" section +cpan/ExtUtils-MakeMaker/t/maketext_filter.t See if maketext_filter works +cpan/ExtUtils-MakeMaker/t/meta_convert.t See if MakeMaker works +cpan/ExtUtils-MakeMaker/t/META_for_testing.json test data for MakeMaker +cpan/ExtUtils-MakeMaker/t/META_for_testing.yml test data for MakeMaker +cpan/ExtUtils-MakeMaker/t/META_for_testing_tricky_version.yml test data for MakeMaker +cpan/ExtUtils-MakeMaker/t/metafile_data.t See if META.yml handling works +cpan/ExtUtils-MakeMaker/t/metafile_file.t See if META.yml handling works +cpan/ExtUtils-MakeMaker/t/min_perl_version.t Test the MIN_PERL_VERSION argument to WriteMakefile. +cpan/ExtUtils-MakeMaker/t/miniperl.t Test MakeMaker with miniperl +cpan/ExtUtils-MakeMaker/t/Mkbootstrap.t See if ExtUtils::Mkbootstrap works +cpan/ExtUtils-MakeMaker/t/MM_Any.t See if ExtUtils::MM_Any works +cpan/ExtUtils-MakeMaker/t/MM_BeOS.t See if ExtUtils::MM_BeOS works +cpan/ExtUtils-MakeMaker/t/MM_Cygwin.t See if ExtUtils::MM_Cygwin works +cpan/ExtUtils-MakeMaker/t/MM_NW5.t See if ExtUtils::MM_NW5 works +cpan/ExtUtils-MakeMaker/t/MM_OS2.t See if ExtUtils::MM_OS2 works +cpan/ExtUtils-MakeMaker/t/MM_Unix.t See if ExtUtils::MM_UNIX works +cpan/ExtUtils-MakeMaker/t/MM_VMS.t See if ExtUtils::MM_VMS works +cpan/ExtUtils-MakeMaker/t/MM_Win32.t See if ExtUtils::MM_Win32 works +cpan/ExtUtils-MakeMaker/t/oneliner.t See if MM can generate perl one-liners +cpan/ExtUtils-MakeMaker/t/os_unsupported.t Test file related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/parse_abstract.t See if parse_abstract works +cpan/ExtUtils-MakeMaker/t/parse_version.t See if parse_version works +cpan/ExtUtils-MakeMaker/t/PL_FILES.t Test PL_FILES in MakeMaker +cpan/ExtUtils-MakeMaker/t/pm.t See if MakeMaker can handle PM +cpan/ExtUtils-MakeMaker/t/pm_to_blib.t Test for ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/pod2man.t See if MakeMaker can handle no pod2man +cpan/ExtUtils-MakeMaker/t/postamble.t See if postamble works +cpan/ExtUtils-MakeMaker/t/prefixify.t See if MakeMaker can apply a PREFIX +cpan/ExtUtils-MakeMaker/t/prereq.t See if MakeMaker works +cpan/ExtUtils-MakeMaker/t/prereq_print.t See if PREREQ_PRINT works +cpan/ExtUtils-MakeMaker/t/problems.t How MakeMaker reacts to build problems +cpan/ExtUtils-MakeMaker/t/prompt.t See if E::MM::prompt() works +cpan/ExtUtils-MakeMaker/t/recurs.t See if recursive builds work +cpan/ExtUtils-MakeMaker/t/revision.t See if $Revision is correct +cpan/ExtUtils-MakeMaker/t/several_authors.t See if multiple AUTHORs work +cpan/ExtUtils-MakeMaker/t/split_command.t See if MM's xargs-like function works +cpan/ExtUtils-MakeMaker/t/test_boilerplate.t MakeMaker test cpan/ExtUtils-MakeMaker/t/testdata/reallylongdirectoryname/arch1/Config.pm test data for MakeMaker cpan/ExtUtils-MakeMaker/t/testdata/reallylongdirectoryname/arch2/Config.pm test data for MakeMaker -cpan/ExtUtils-MakeMaker/t/testlib.t See if ExtUtils::testlib works -cpan/ExtUtils-MakeMaker/t/unicode.t -cpan/ExtUtils-MakeMaker/t/VERSION_FROM.t See if MakeMaker's VERSION_FROM works -cpan/ExtUtils-MakeMaker/t/vstrings.t -cpan/ExtUtils-MakeMaker/t/WriteEmptyMakefile.t See if WriteEmptyMakefile works -cpan/ExtUtils-MakeMaker/t/writemakefile_args.t See if WriteMakefile works -cpan/ExtUtils-Manifest/lib/ExtUtils/Manifest.pm Utilities to write MANIFEST files -cpan/ExtUtils-Manifest/lib/ExtUtils/MANIFEST.SKIP The default MANIFEST.SKIP -cpan/ExtUtils-Manifest/t/Manifest.t See if ExtUtils::Manifest works +cpan/ExtUtils-MakeMaker/t/testlib.t See if ExtUtils::testlib works +cpan/ExtUtils-MakeMaker/t/unicode.t Test file related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/VERSION_FROM.t See if MakeMaker's VERSION_FROM works +cpan/ExtUtils-MakeMaker/t/vstrings.t Test file related to ExtUtils::MakeMaker +cpan/ExtUtils-MakeMaker/t/WriteEmptyMakefile.t See if WriteEmptyMakefile works +cpan/ExtUtils-MakeMaker/t/writemakefile_args.t See if WriteMakefile works +cpan/ExtUtils-Manifest/lib/ExtUtils/Manifest.pm Utilities to write MANIFEST files +cpan/ExtUtils-Manifest/lib/ExtUtils/MANIFEST.SKIP The default MANIFEST.SKIP +cpan/ExtUtils-Manifest/t/Manifest.t See if ExtUtils::Manifest works cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm Implement pl2bat cpan/ExtUtils-PL2Bat/t/make_executable.t Tests if ExtUtils::PL2Bat makes bat files that are executable cpan/File-Fetch/lib/File/Fetch.pm File::Fetch @@ -935,21 +1138,21 @@ cpan/File-Path/t/Path.t See if File::P cpan/File-Path/t/Path_root.t See if File::Path works cpan/File-Path/t/Path_win32.t See if File::Path works cpan/File-Path/t/taint.t See if File::Path works with -T -cpan/File-Temp/lib/File/Temp.pm create safe temporary files and file handles -cpan/File-Temp/t/cmp.t See if File::Temp works -cpan/File-Temp/t/fork.t See if File::Temp works -cpan/File-Temp/t/lock.t See if File::Temp works -cpan/File-Temp/t/mktemp.t See if File::Temp works -cpan/File-Temp/t/object.t See if File::Temp works -cpan/File-Temp/t/posix.t See if File::Temp works -cpan/File-Temp/t/rmtree.t See if File::Temp works -cpan/File-Temp/t/security.t See if File::Temp works -cpan/File-Temp/t/seekable.t See if File::Temp works -cpan/File-Temp/t/tempfile.t See if File::Temp works -cpan/Filter-Util-Call/Call.pm Filter::Util::Call extension module -cpan/Filter-Util-Call/Call.xs Filter::Util::Call extension external subroutines +cpan/File-Temp/lib/File/Temp.pm create safe temporary files and file handles +cpan/File-Temp/t/cmp.t See if File::Temp works +cpan/File-Temp/t/fork.t See if File::Temp works +cpan/File-Temp/t/lock.t See if File::Temp works +cpan/File-Temp/t/mktemp.t See if File::Temp works +cpan/File-Temp/t/object.t See if File::Temp works +cpan/File-Temp/t/posix.t See if File::Temp works +cpan/File-Temp/t/rmtree.t See if File::Temp works +cpan/File-Temp/t/security.t See if File::Temp works +cpan/File-Temp/t/seekable.t See if File::Temp works +cpan/File-Temp/t/tempfile.t See if File::Temp works +cpan/Filter-Util-Call/Call.pm Filter::Util::Call extension module +cpan/Filter-Util-Call/Call.xs Filter::Util::Call extension external subroutines cpan/Filter-Util-Call/filter-util.pl See if Filter::Util::Call works -cpan/Filter-Util-Call/t/call.t See if Filter::Util::Call works +cpan/Filter-Util-Call/t/call.t See if Filter::Util::Call works cpan/Filter-Util-Call/t/rt_101033.pm cpan/Filter-Util-Call/t/rt_101033.t cpan/Filter-Util-Call/t/rt_54452-rebless.t @@ -1059,6 +1262,7 @@ cpan/HTTP-Tiny/t/160_cookies.t cpan/HTTP-Tiny/t/161_basic_auth.t cpan/HTTP-Tiny/t/162_proxy_auth.t cpan/HTTP-Tiny/t/170_keepalive.t +cpan/HTTP-Tiny/t/180_verify_SSL.t cpan/HTTP-Tiny/t/BrokenCookieJar.pm cpan/HTTP-Tiny/t/SimpleCookieJar.pm cpan/HTTP-Tiny/t/Util.pm @@ -1227,23 +1431,23 @@ cpan/IO-Socket-IP/t/22timeout.t cpan/IO-Socket-IP/t/30nonblocking-connect.t IO::Socket::IP tests cpan/IO-Socket-IP/t/31nonblocking-connect-internet.t IO::Socket::IP tests cpan/IO-Socket-IP/t/99pod.t IO::Socket::IP tests -cpan/IO-Zlib/t/basic.t Tests for IO::Zlib -cpan/IO-Zlib/t/external.t Tests for IO::Zlib -cpan/IO-Zlib/t/getc.t Tests for IO::Zlib -cpan/IO-Zlib/t/getline.t Tests for IO::Zlib -cpan/IO-Zlib/t/import.t Tests for IO::Zlib -cpan/IO-Zlib/t/large.t Tests for IO::Zlib -cpan/IO-Zlib/t/tied.t Tests for IO::Zlib -cpan/IO-Zlib/t/uncomp1.t Tests for IO::Zlib -cpan/IO-Zlib/t/uncomp2.t Tests for IO::Zlib -cpan/IO-Zlib/Zlib.pm IO::Zlib -cpan/IPC-Cmd/lib/IPC/Cmd.pm IPC::Cmd -cpan/IPC-Cmd/t/01_IPC-Cmd.t IPC::Cmd tests -cpan/IPC-Cmd/t/02_Interactive.t IPC::Cmd tests -cpan/IPC-Cmd/t/03_run-forked.t IPC::Cmd tests -cpan/IPC-Cmd/t/src/child.pl IPC::Cmd tests -cpan/IPC-Cmd/t/src/output.pl IPC::Cmd tests -cpan/IPC-Cmd/t/src/x.tgz IPC::Cmd tests +cpan/IO-Zlib/t/basic.t Tests for IO::Zlib +cpan/IO-Zlib/t/external.t Tests for IO::Zlib +cpan/IO-Zlib/t/getc.t Tests for IO::Zlib +cpan/IO-Zlib/t/getline.t Tests for IO::Zlib +cpan/IO-Zlib/t/import.t Tests for IO::Zlib +cpan/IO-Zlib/t/large.t Tests for IO::Zlib +cpan/IO-Zlib/t/tied.t Tests for IO::Zlib +cpan/IO-Zlib/t/uncomp1.t Tests for IO::Zlib +cpan/IO-Zlib/t/uncomp2.t Tests for IO::Zlib +cpan/IO-Zlib/Zlib.pm IO::Zlib +cpan/IPC-Cmd/lib/IPC/Cmd.pm IPC::Cmd +cpan/IPC-Cmd/t/01_IPC-Cmd.t IPC::Cmd tests +cpan/IPC-Cmd/t/02_Interactive.t IPC::Cmd tests +cpan/IPC-Cmd/t/03_run-forked.t IPC::Cmd tests +cpan/IPC-Cmd/t/src/child.pl IPC::Cmd tests +cpan/IPC-Cmd/t/src/output.pl IPC::Cmd tests +cpan/IPC-Cmd/t/src/x.tgz IPC::Cmd tests cpan/IPC-SysV/hints/cygwin.pl Hint for IPC::SysV for named architecture cpan/IPC-SysV/hints/next_3.pl Hint for IPC::SysV for named architecture cpan/IPC-SysV/lib/IPC/Msg.pm IPC::SysV extension Perl module @@ -1288,7 +1492,23 @@ cpan/JSON-PP/t/020_unknown.t cpan/JSON-PP/t/021_evans.t cpan/JSON-PP/t/022_comment_at_eof.t cpan/JSON-PP/t/052_object.t -cpan/JSON-PP/t/099_binary.t +cpan/JSON-PP/t/099_binary.pl +cpan/JSON-PP/t/099_binary00.t +cpan/JSON-PP/t/099_binary01.t +cpan/JSON-PP/t/099_binary02.t +cpan/JSON-PP/t/099_binary03.t +cpan/JSON-PP/t/099_binary04.t +cpan/JSON-PP/t/099_binary05.t +cpan/JSON-PP/t/099_binary06.t +cpan/JSON-PP/t/099_binary07.t +cpan/JSON-PP/t/099_binary08.t +cpan/JSON-PP/t/099_binary09.t +cpan/JSON-PP/t/099_binary10.t +cpan/JSON-PP/t/099_binary11.t +cpan/JSON-PP/t/099_binary12.t +cpan/JSON-PP/t/099_binary13.t +cpan/JSON-PP/t/099_binary14.t +cpan/JSON-PP/t/099_binary15.t cpan/JSON-PP/t/104_sortby.t cpan/JSON-PP/t/105_esc_slash.t cpan/JSON-PP/t/106_allow_barekey.t @@ -1303,42 +1523,46 @@ cpan/JSON-PP/t/115_tie_ixhash.t cpan/JSON-PP/t/116_incr_parse_fixed.t cpan/JSON-PP/t/117_numbers.t cpan/JSON-PP/t/118_boolean_values.t +cpan/JSON-PP/t/119_incr_parse_utf8.t +cpan/JSON-PP/t/120_incr_parse_truncated.t +cpan/JSON-PP/t/core_bools.t cpan/JSON-PP/t/gh_28_json_test_suite.t cpan/JSON-PP/t/gh_29_trailing_false_value.t cpan/JSON-PP/t/rt_116998_wrong_character_offset.t +cpan/JSON-PP/t/rt_122270_old_xs_boolean.t cpan/JSON-PP/t/rt_90071_incr_parse.t cpan/JSON-PP/t/zero-mojibake.t -cpan/libnet/lib/Net/Cmd.pm -cpan/libnet/lib/Net/Config.pm -cpan/libnet/lib/Net/Domain.pm -cpan/libnet/lib/Net/FTP.pm -cpan/libnet/lib/Net/FTP/A.pm -cpan/libnet/lib/Net/FTP/dataconn.pm -cpan/libnet/lib/Net/FTP/E.pm -cpan/libnet/lib/Net/FTP/I.pm -cpan/libnet/lib/Net/FTP/L.pm -cpan/libnet/lib/Net/libnetFAQ.pod -cpan/libnet/lib/Net/Netrc.pm -cpan/libnet/lib/Net/NNTP.pm -cpan/libnet/lib/Net/POP3.pm -cpan/libnet/lib/Net/SMTP.pm -cpan/libnet/lib/Net/Time.pm -cpan/libnet/Makefile.PL -cpan/libnet/t/config.t libnet -cpan/libnet/t/datasend.t libnet -cpan/libnet/t/ftp.t libnet -cpan/libnet/t/hostname.t libnet -cpan/libnet/t/netrc.t libnet -cpan/libnet/t/nntp.t libnet -cpan/libnet/t/nntp_ipv6.t -cpan/libnet/t/nntp_ssl.t -cpan/libnet/t/pop3_ipv6.t -cpan/libnet/t/pop3_ssl.t -cpan/libnet/t/require.t libnet -cpan/libnet/t/smtp.t libnet -cpan/libnet/t/smtp_ipv6.t -cpan/libnet/t/smtp_ssl.t -cpan/libnet/t/time.t libnet +cpan/libnet/lib/Net/Cmd.pm Module related to libnet +cpan/libnet/lib/Net/Config.pm Module related to libnet +cpan/libnet/lib/Net/Domain.pm Module related to libnet +cpan/libnet/lib/Net/FTP.pm Module related to libnet +cpan/libnet/lib/Net/FTP/A.pm Module related to libnet +cpan/libnet/lib/Net/FTP/dataconn.pm Module related to libnet +cpan/libnet/lib/Net/FTP/E.pm Module related to libnet +cpan/libnet/lib/Net/FTP/I.pm Module related to libnet +cpan/libnet/lib/Net/FTP/L.pm Module related to libnet +cpan/libnet/lib/Net/libnetFAQ.pod libnet +cpan/libnet/lib/Net/Netrc.pm Module related to libnet +cpan/libnet/lib/Net/NNTP.pm Module related to libnet +cpan/libnet/lib/Net/POP3.pm Module related to libnet +cpan/libnet/lib/Net/SMTP.pm Module related to libnet +cpan/libnet/lib/Net/Time.pm Module related to libnet +cpan/libnet/Makefile.PL libnet +cpan/libnet/t/config.t libnet +cpan/libnet/t/datasend.t libnet +cpan/libnet/t/ftp.t libnet +cpan/libnet/t/hostname.t libnet +cpan/libnet/t/netrc.t libnet +cpan/libnet/t/nntp.t libnet +cpan/libnet/t/nntp_ipv6.t Test file related to libnet +cpan/libnet/t/nntp_ssl.t Test file related to libnet +cpan/libnet/t/pop3_ipv6.t Test file related to libnet +cpan/libnet/t/pop3_ssl.t Test file related to libnet +cpan/libnet/t/require.t libnet +cpan/libnet/t/smtp.t libnet +cpan/libnet/t/smtp_ipv6.t Test file related to libnet +cpan/libnet/t/smtp_ssl.t Test file related to libnet +cpan/libnet/t/time.t libnet cpan/Locale-Maketext-Simple/lib/Locale/Maketext/Simple.pm Locale::Simple cpan/Locale-Maketext-Simple/t/0-signature.t Locale::Simple tests cpan/Locale-Maketext-Simple/t/1-basic.t Locale::Simple tests @@ -1350,136 +1574,80 @@ cpan/Locale-Maketext-Simple/t/po_with_i_ cpan/Locale-Maketext-Simple/t/po_without_i_default/en.po Locale::Simple tests cpan/Locale-Maketext-Simple/t/po_without_i_default/fr.po Locale::Simple tests cpan/Math-BigInt/lib/Math/BigFloat.pm An arbitrary precision floating-point arithmetic package -cpan/Math-BigInt/lib/Math/BigInt.pm An arbitrary precision integer arithmetic package +cpan/Math-BigInt/lib/Math/BigInt.pm An arbitrary precision integer arithmetic package cpan/Math-BigInt/lib/Math/BigInt/Calc.pm Pure Perl module to support Math::BigInt cpan/Math-BigInt/lib/Math/BigInt/Lib.pm -cpan/Math-BigInt/t/_bin_parts_to_lib_parts.t -cpan/Math-BigInt/t/_bin_str_to_str_parts.t -cpan/Math-BigInt/t/_dec_parts_to_lib_parts.t -cpan/Math-BigInt/t/_dec_str_to_str_parts.t -cpan/Math-BigInt/t/_e_math.t Helper routine in BigFloat for _e math -cpan/Math-BigInt/t/_hex_str_to_str_parts.t -cpan/Math-BigInt/t/_oct_str_to_str_parts.t -cpan/Math-BigInt/t/alias.inc Support for BigInt tests -cpan/Math-BigInt/t/backermann-mbi.t Test Math::BigInt -cpan/Math-BigInt/t/bare_mbf.t Test MBF under Math::BigInt::BareCalc -cpan/Math-BigInt/t/bare_mbi.t Test MBI under Math::BigInt::BareCalc -cpan/Math-BigInt/t/bare_mif.t Rounding tests under BareCalc -cpan/Math-BigInt/t/bdigitsum-mbi.t Test Math::BigInt -cpan/Math-BigInt/t/bdstr-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/bdstr-mbi.t Test Math::BigInt -cpan/Math-BigInt/t/bestr-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/bestr-mbi.t Test Math::BigInt -cpan/Math-BigInt/t/bfib-mbi.t -cpan/Math-BigInt/t/big_pi_e.t test bpi() and bexp() -cpan/Math-BigInt/t/bigfltpm.inc Shared tests for bigfltpm.t and sub_mbf.t -cpan/Math-BigInt/t/bigfltpm.t See if BigFloat.pm works -cpan/Math-BigInt/t/bigintc.t See if BigInt/Calc.pm works +cpan/Math-BigInt/t/alias.inc Support for BigInt tests +cpan/Math-BigInt/t/bare_mbf.t Test MBF under Math::BigInt::BareCalc +cpan/Math-BigInt/t/bare_mbi.t Test MBI under Math::BigInt::BareCalc +cpan/Math-BigInt/t/bare_mif.t Rounding tests under BareCalc +cpan/Math-BigInt/t/big_pi_e.t test bpi() and bexp() +cpan/Math-BigInt/t/bigfltpm.inc Shared tests for bigfltpm.t and sub_mbf.t +cpan/Math-BigInt/t/bigfltpm.t See if BigFloat.pm works +cpan/Math-BigInt/t/bigintc.t See if BigInt/Calc.pm works cpan/Math-BigInt/t/bigintc-import.t -cpan/Math-BigInt/t/bigintpm.inc Shared tests for bigintpm.t and sub_mbi.t -cpan/Math-BigInt/t/bigintpm.t See if BigInt.pm works -cpan/Math-BigInt/t/bigints.t See if BigInt.pm works -cpan/Math-BigInt/t/biglog.t Test the log function -cpan/Math-BigInt/t/bigroot.t Test the broot function -cpan/Math-BigInt/t/blucas-mbi.t -cpan/Math-BigInt/t/bnok-mbf.t -cpan/Math-BigInt/t/bnok-mbi.t -cpan/Math-BigInt/t/bnstr-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/bnstr-mbi.t Test Math::BigInt -cpan/Math-BigInt/t/bpi-mbf.t -cpan/Math-BigInt/t/bpi-mbi.t -cpan/Math-BigInt/t/bpow-mbf.t -cpan/Math-BigInt/t/bpow-mbi.t -cpan/Math-BigInt/t/bsstr-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/bsstr-mbi.t Test Math::BigInt -cpan/Math-BigInt/t/buparrow-mbi.t Test Math::BigInt +cpan/Math-BigInt/t/bigintpm.inc Shared tests for bigintpm.t and sub_mbi.t +cpan/Math-BigInt/t/bigintpm.t See if BigInt.pm works +cpan/Math-BigInt/t/bigints.t See if BigInt.pm works +cpan/Math-BigInt/t/biglog.t Test the log function +cpan/Math-BigInt/t/bigroot.t Test the broot function cpan/Math-BigInt/t/calling-class-methods.t Test Math::BigInt cpan/Math-BigInt/t/calling-constant.t cpan/Math-BigInt/t/calling-instance-methods.t Test Math::BigInt cpan/Math-BigInt/t/calling-lib1.t cpan/Math-BigInt/t/calling-lib2.t -cpan/Math-BigInt/t/config.t Test Math::BigInt->config() -cpan/Math-BigInt/t/const-mbf.t -cpan/Math-BigInt/t/const-mbi.t -cpan/Math-BigInt/t/downgrade.t Test if use Math::BigInt(); under downgrade works -cpan/Math-BigInt/t/dparts-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/dparts-mbi.t Test Math::BigInt -cpan/Math-BigInt/t/eparts-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/eparts-mbi.t Test Math::BigInt -cpan/Math-BigInt/t/fparts-mbf.t -cpan/Math-BigInt/t/fparts-mbi.t -cpan/Math-BigInt/t/from_base-mbi.t -cpan/Math-BigInt/t/from_base_num-mbi.t -cpan/Math-BigInt/t/from_bin-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/from_bin-mbi.t -cpan/Math-BigInt/t/from_hex-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/from_hex-mbi.t -cpan/Math-BigInt/t/from_ieee754-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/from_oct-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/from_oct-mbi.t -cpan/Math-BigInt/t/inf_nan.t Special tests for inf and *NaN* handling -cpan/Math-BigInt/t/isa.t Test for Math::BigInt inheritance -cpan/Math-BigInt/t/lib_load-mbf-mbi.t -cpan/Math-BigInt/t/lib_load-mbi-mbf.t +cpan/Math-BigInt/t/config.t Test Math::BigInt->config() +cpan/Math-BigInt/t/downgrade.t Test if use Math::BigInt(); under downgrade works +cpan/Math-BigInt/t/inf_nan.t Special tests for inf and *NaN* handling +cpan/Math-BigInt/t/isa.t Test for Math::BigInt inheritance cpan/Math-BigInt/t/Math/BigFloat/Subclass.pm Empty subclass of BigFloat for test cpan/Math-BigInt/t/Math/BigInt/BareCalc.pm Bigint's simulation of Calc cpan/Math-BigInt/t/Math/BigInt/Lib/Minimal.pm cpan/Math-BigInt/t/Math/BigInt/Lib/TestUtil.pm Test Math::BigInt cpan/Math-BigInt/t/Math/BigInt/Scalar.pm Pure Perl module to support Math::BigInt cpan/Math-BigInt/t/Math/BigInt/Subclass.pm Empty subclass of BigInt for test -cpan/Math-BigInt/t/mbf_ali.t Tests for BigFloat -cpan/Math-BigInt/t/mbi_ali.t Tests for BigInt -cpan/Math-BigInt/t/mbi_rand.t Test Math::BigInt randomly -cpan/Math-BigInt/t/mbimbf.inc Actual BigInt/BigFloat accuracy, precision and fallback, round_mode tests -cpan/Math-BigInt/t/mbimbf.t BigInt/BigFloat accuracy, precision and fallback, round_mode -cpan/Math-BigInt/t/nan_cmp.t overloaded comparison involving *NaN* -cpan/Math-BigInt/t/new-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/new-mbi.t -cpan/Math-BigInt/t/new_overloaded.t test overloaded numbers in BigFloat's new() -cpan/Math-BigInt/t/nparts-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/nparts-mbi.t Test Math::BigInt -cpan/Math-BigInt/t/objectify_mbf.t Math::BigInt tests -cpan/Math-BigInt/t/objectify_mbi.t Math::BigInt tests -cpan/Math-BigInt/t/req_mbf0.t test: require Math::BigFloat; ->bzero(); -cpan/Math-BigInt/t/req_mbf1.t test: require Math::BigFloat; ->bone(); -cpan/Math-BigInt/t/req_mbfa.t test: require Math::BigFloat; ->bnan(); -cpan/Math-BigInt/t/req_mbfi.t test: require Math::BigFloat; ->binf(); -cpan/Math-BigInt/t/req_mbfn.t test: require Math::BigFloat; ->new(); -cpan/Math-BigInt/t/req_mbfw.t require Math::BigFloat; import ( with => ); -cpan/Math-BigInt/t/require.t Test if require Math::BigInt works -cpan/Math-BigInt/t/round.t Test rounding with non-integer A and P -cpan/Math-BigInt/t/rt-16221.t Tests for objectify() w/foreign objs -cpan/Math-BigInt/t/sparts-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/sparts-mbi.t Test Math::BigInt -cpan/Math-BigInt/t/sub_ali.t Tests for aliases in BigInt subclasses -cpan/Math-BigInt/t/sub_mbf.t Empty subclass test of BigFloat -cpan/Math-BigInt/t/sub_mbi.t Empty subclass test of BigInt -cpan/Math-BigInt/t/sub_mif.t Test A & P with subclasses using mbimbf.inc -cpan/Math-BigInt/t/to_base-mbi.t -cpan/Math-BigInt/t/to_base_num-mbi.t -cpan/Math-BigInt/t/to_ieee754-mbf.t Test Math::BigInt -cpan/Math-BigInt/t/trap.t Test whether trap_nan and trap_inf work -cpan/Math-BigInt/t/upgrade.inc Actual tests for upgrade.t -cpan/Math-BigInt/t/upgrade.t Test if use Math::BigInt(); under upgrade works -cpan/Math-BigInt/t/upgrade2.t Test that two upgrade levels work -cpan/Math-BigInt/t/upgradef.t Test if use Math::BigFloat(); under upgrade works -cpan/Math-BigInt/t/use.t Test if use Math::BigInt(); works -cpan/Math-BigInt/t/use_lib1.t Test combinations of Math::BigInt and BigFloat -cpan/Math-BigInt/t/use_lib2.t Test combinations of Math::BigInt and BigFloat -cpan/Math-BigInt/t/use_lib3.t Test combinations of Math::BigInt and BigFloat -cpan/Math-BigInt/t/use_lib4.t Test combinations of Math::BigInt and BigFloat +cpan/Math-BigInt/t/mbf_ali.t Tests for BigFloat +cpan/Math-BigInt/t/mbi_ali.t Tests for BigInt +cpan/Math-BigInt/t/mbi_rand.t Test Math::BigInt randomly +cpan/Math-BigInt/t/mbimbf.inc Actual BigInt/BigFloat accuracy, precision and fallback, round_mode tests +cpan/Math-BigInt/t/mbimbf.t BigInt/BigFloat accuracy, precision and fallback, round_mode +cpan/Math-BigInt/t/nan_cmp.t overloaded comparison involving *NaN* +cpan/Math-BigInt/t/new_overloaded.t test overloaded numbers in BigFloat's new() +cpan/Math-BigInt/t/req_mbf0.t test: require Math::BigFloat; ->bzero(); +cpan/Math-BigInt/t/req_mbf1.t test: require Math::BigFloat; ->bone(); +cpan/Math-BigInt/t/req_mbfa.t test: require Math::BigFloat; ->bnan(); +cpan/Math-BigInt/t/req_mbfi.t test: require Math::BigFloat; ->binf(); +cpan/Math-BigInt/t/req_mbfn.t test: require Math::BigFloat; ->new(); +cpan/Math-BigInt/t/req_mbfw.t require Math::BigFloat; import ( with => ); +cpan/Math-BigInt/t/require.t Test if require Math::BigInt works +cpan/Math-BigInt/t/round.t Test rounding with non-integer A and P +cpan/Math-BigInt/t/rt-16221.t Tests for objectify() w/foreign objs +cpan/Math-BigInt/t/sub_ali.t Tests for aliases in BigInt subclasses +cpan/Math-BigInt/t/sub_mbf.t Empty subclass test of BigFloat +cpan/Math-BigInt/t/sub_mbi.t Empty subclass test of BigInt +cpan/Math-BigInt/t/sub_mif.t Test A & P with subclasses using mbimbf.inc +cpan/Math-BigInt/t/trap.t Test whether trap_nan and trap_inf work +cpan/Math-BigInt/t/upgrade.inc Actual tests for upgrade.t +cpan/Math-BigInt/t/upgrade.t Test if use Math::BigInt(); under upgrade works +cpan/Math-BigInt/t/upgrade2.t Test that two upgrade levels work +cpan/Math-BigInt/t/upgradef.t Test if use Math::BigFloat(); under upgrade works +cpan/Math-BigInt/t/use.t Test if use Math::BigInt(); works +cpan/Math-BigInt/t/use_lib1.t Test combinations of Math::BigInt and BigFloat +cpan/Math-BigInt/t/use_lib2.t Test combinations of Math::BigInt and BigFloat +cpan/Math-BigInt/t/use_lib3.t Test combinations of Math::BigInt and BigFloat +cpan/Math-BigInt/t/use_lib4.t Test combinations of Math::BigInt and BigFloat cpan/Math-BigInt/t/use_lib5.t cpan/Math-BigInt/t/use_lib6.t -cpan/Math-BigInt/t/use_mbfw.t use BigFloat w/ with and lib at the same time -cpan/Math-BigInt/t/with_sub.t Test use Math::BigFloat with => package -cpan/Math-BigInt-FastCalc/FastCalc.xs Math::BigInt::FastCalc extension +cpan/Math-BigInt/t/use_mbfw.t use BigFloat w/ with and lib at the same time +cpan/Math-BigInt/t/with_sub.t Test use Math::BigFloat with => package +cpan/Math-BigInt-FastCalc/FastCalc.xs Math::BigInt::FastCalc extension cpan/Math-BigInt-FastCalc/lib/Math/BigInt/FastCalc.pm Math::BigInt::FastCalc extension -cpan/Math-BigInt-FastCalc/t/bigintfc.t Math::BigInt::FastCalc extension +cpan/Math-BigInt-FastCalc/t/bigintfc.t Math::BigInt::FastCalc extension cpan/Math-BigInt-FastCalc/t/biglog.t cpan/Math-BigInt-FastCalc/t/bigroot.t -cpan/Math-BigInt-FastCalc/t/bootstrap.t Math::BigInt::FastCalc extension -cpan/Math-BigInt-FastCalc/t/leak.t test for memory leaks in Math::BigInt::FastCalc -cpan/Math-BigInt-FastCalc/t/mbi_rand.t Math::BigInt::FastCalc extension +cpan/Math-BigInt-FastCalc/t/bootstrap.t Math::BigInt::FastCalc extension +cpan/Math-BigInt-FastCalc/t/leak.t test for memory leaks in Math::BigInt::FastCalc +cpan/Math-BigInt-FastCalc/t/mbi_rand.t Math::BigInt::FastCalc extension cpan/Math-BigRat/lib/Math/BigRat.pm Math::BigRat cpan/Math-BigRat/t/badd-mbr.t cpan/Math-BigRat/t/big_ap.t Math::BigRat test @@ -1502,46 +1670,38 @@ cpan/Math-BigRat/t/new-mbr.t cpan/Math-BigRat/t/requirer.t see if require works properly cpan/Math-BigRat/t/rt121139.t cpan/Math-BigRat/t/trap.t see if trap_nan and trap_inf work -cpan/Math-Complex/lib/Math/Complex.pm A Complex package -cpan/Math-Complex/lib/Math/Trig.pm A simple interface to complex trigonometry -cpan/Math-Complex/t/Complex.t See if Math::Complex works -cpan/Math-Complex/t/Trig.t See if Math::Trig works -cpan/Math-Complex/t/underbar.t See if Math::Complex works cpan/Memoize/Memoize.pm Memoize cpan/Memoize/Memoize/AnyDBM_File.pm Memoize glue layer for AnyDBM_File cpan/Memoize/Memoize/Expire.pm Memoize expiry manager example -cpan/Memoize/Memoize/ExpireFile.pm Memoize expiry manager test scaffold -cpan/Memoize/Memoize/ExpireTest.pm Memoize expiry manager test scaffold cpan/Memoize/Memoize/NDBM_File.pm Memoize glue layer for NDBM_File cpan/Memoize/Memoize/SDBM_File.pm Memoize glue layer for SDBM_File cpan/Memoize/Memoize/Storable.pm Memoize glue layer for Storable -cpan/Memoize/t/array.t Memoize array context return tests -cpan/Memoize/t/array_confusion.t Memoize ambiguous array return tests +cpan/Memoize/t/basic.t +cpan/Memoize/t/cache.t cpan/Memoize/t/correctness.t Memoize basic correctness tests -cpan/Memoize/t/errors.t Memoize PEBKAC detection tests -cpan/Memoize/t/expfile.t Memoize expiry manager tests -cpan/Memoize/t/expire.t Memoize expiry manager tests -cpan/Memoize/t/expmod_n.t Memoize expiry manager tests +cpan/Memoize/t/expmod.t cpan/Memoize/t/expmod_t.t Memoize expiry manager (timed) tests cpan/Memoize/t/flush.t Memoize 'flush_cache' function tests +cpan/Memoize/t/lib/DBMTest.pm cpan/Memoize/t/normalize.t Memoize 'normalizer' feature tests -cpan/Memoize/t/prototype.t Memoize prototyped function handling tests -cpan/Memoize/t/speed.t "Makes functions faster" advertisement test +cpan/Memoize/t/st_concurrency +cpan/Memoize/t/threadsafe.t cpan/Memoize/t/tie.t Memoize tied file test +cpan/Memoize/t/tie_db.t cpan/Memoize/t/tie_gdbm.t Memoize GDBM interface test cpan/Memoize/t/tie_ndbm.t Memoize NDBM interface test +cpan/Memoize/t/tie_odbm.t cpan/Memoize/t/tie_sdbm.t Memoize SDBM interface test cpan/Memoize/t/tie_storable.t Memoize Storable interface test -cpan/Memoize/t/tiefeatures.t Memoize FAULT / MERGE / HASH options test cpan/Memoize/t/unmemoize.t Memoize 'unmemoize' function test -cpan/MIME-Base64/Base64.xs MIME::Base64 extension +cpan/MIME-Base64/Base64.xs MIME::Base64 extension cpan/MIME-Base64/lib/MIME/Base64.pm cpan/MIME-Base64/lib/MIME/QuotedPrint.pm -cpan/MIME-Base64/t/base64.t See whether MIME::Base64 works +cpan/MIME-Base64/t/base64.t See whether MIME::Base64 works cpan/MIME-Base64/t/base64url.t -cpan/MIME-Base64/t/length.t See whether MIME::QuotedPrint works -cpan/MIME-Base64/t/quoted-print.t See whether MIME::QuotedPrint works -cpan/MIME-Base64/t/unicode.t See whether MIME::Base64 works +cpan/MIME-Base64/t/length.t See whether MIME::QuotedPrint works +cpan/MIME-Base64/t/quoted-print.t See whether MIME::QuotedPrint works +cpan/MIME-Base64/t/unicode.t See whether MIME::Base64 works cpan/Module-Load/lib/Module/Load.pm Module::Load cpan/Module-Load/t/01_Module-Load.t Module::Load tests cpan/Module-Load/t/02_Module-Load.t Module::Load tests @@ -1584,23 +1744,23 @@ cpan/Module-Metadata/t/lib/GeneratePacka cpan/Module-Metadata/t/metadata.t cpan/Module-Metadata/t/taint.t cpan/Module-Metadata/t/version.t -cpan/NEXT/lib/NEXT.pm Pseudo-class NEXT for method redispatch -cpan/NEXT/t/actual.t NEXT -cpan/NEXT/t/actuns.t NEXT +cpan/NEXT/lib/NEXT.pm Pseudo-class NEXT for method redispatch +cpan/NEXT/t/actual.t NEXT +cpan/NEXT/t/actuns.t NEXT cpan/NEXT/t/dynamically_scoped_regex_vars.t NEXT -cpan/NEXT/t/next.t NEXT -cpan/NEXT/t/stringify.t NEXT -cpan/NEXT/t/unseen.t NEXT -cpan/OpenBSD-MkTemp/lib/OpenBSD/MkTemp.pm OpenBSD::MkTemp -cpan/OpenBSD-MkTemp/MkTemp.xs OpenBSD::MkTemp -cpan/OpenBSD-MkTemp/README OpenBSD::MkTemp Readme +cpan/NEXT/t/next.t NEXT +cpan/NEXT/t/stringify.t NEXT +cpan/NEXT/t/unseen.t NEXT +cpan/OpenBSD-MkTemp/lib/OpenBSD/MkTemp.pm OpenBSD::MkTemp +cpan/OpenBSD-MkTemp/MkTemp.xs OpenBSD::MkTemp +cpan/OpenBSD-MkTemp/README OpenBSD::MkTemp Readme cpan/OpenBSD-MkTemp/t/OpenBSD-MkTemp.t OpenBSD::MkTemp test file cpan/OpenBSD-Pledge/lib/OpenBSD/Pledge.pm OpenBSD::Pledge -cpan/OpenBSD-Pledge/Pledge.xs OpenBSD::Pledge -cpan/OpenBSD-Pledge/t/OpenBSD-Pledge.t OpenBSD::Pledge test file +cpan/OpenBSD-Pledge/Pledge.xs OpenBSD::Pledge +cpan/OpenBSD-Pledge/t/OpenBSD-Pledge.t OpenBSD::Pledge test file cpan/OpenBSD-Unveil/lib/OpenBSD/Unveil.pm OpenBSD::Unveil -cpan/OpenBSD-Unveil/t/OpenBSD-Unveil.t OpenBSD::Unveil test file -cpan/OpenBSD-Unveil/Unveil.xs OpenBSD::Unveil +cpan/OpenBSD-Unveil/t/OpenBSD-Unveil.t OpenBSD::Unveil test file +cpan/OpenBSD-Unveil/Unveil.xs OpenBSD::Unveil cpan/Params-Check/lib/Params/Check.pm Params::Check cpan/Params-Check/t/01_Params-Check.t Params::Check tests cpan/parent/lib/parent.pm Establish an ISA relationship with base classes at compile time @@ -1617,19 +1777,19 @@ cpan/parent/t/parent-classfromfile.t te cpan/parent/t/parent-pmc.t tests for parent.pm cpan/parent/t/parent-returns-false.t tests for parent.pm cpan/parent/t/rt62341.t.disabled test files for parent.pm -cpan/Perl-OSType/lib/Perl/OSType.pm Perl::OSType -cpan/Perl-OSType/t/OSType.t Perl::OSType -cpan/perlfaq/lib/perlfaq.pm Perl frequently asked questions -cpan/perlfaq/lib/perlfaq.pod Perl frequently asked questions +cpan/Perl-OSType/lib/Perl/OSType.pm Perl::OSType +cpan/Perl-OSType/t/OSType.t Perl::OSType +cpan/perlfaq/lib/perlfaq.pm Perl frequently asked questions +cpan/perlfaq/lib/perlfaq.pod Perl frequently asked questions cpan/perlfaq/lib/perlfaq1.pod General Questions About Perl -cpan/perlfaq/lib/perlfaq2.pod Obtaining and Learning about Perl -cpan/perlfaq/lib/perlfaq3.pod Programming Tools -cpan/perlfaq/lib/perlfaq4.pod Data Manipulation -cpan/perlfaq/lib/perlfaq5.pod Files and Formats -cpan/perlfaq/lib/perlfaq6.pod Regexes -cpan/perlfaq/lib/perlfaq7.pod Perl Language Issues -cpan/perlfaq/lib/perlfaq8.pod System Interaction -cpan/perlfaq/lib/perlfaq9.pod Networking +cpan/perlfaq/lib/perlfaq2.pod Obtaining and Learning about Perl +cpan/perlfaq/lib/perlfaq3.pod Programming Tools +cpan/perlfaq/lib/perlfaq4.pod Data Manipulation +cpan/perlfaq/lib/perlfaq5.pod Files and Formats +cpan/perlfaq/lib/perlfaq6.pod Regexes +cpan/perlfaq/lib/perlfaq7.pod Perl Language Issues +cpan/perlfaq/lib/perlfaq8.pod System Interaction +cpan/perlfaq/lib/perlfaq9.pod Networking cpan/perlfaq/lib/perlglossary.pod Perl Glossary cpan/PerlIO-via-QuotedPrint/lib/PerlIO/via/QuotedPrint.pm PerlIO::via::QuotedPrint cpan/PerlIO-via-QuotedPrint/t/changes.t @@ -1732,10 +1892,10 @@ cpan/Pod-Simple/t/corpus/8859_7.pod Po cpan/Pod-Simple/t/corpus/8859_7.xml Pod::Simple test file cpan/Pod-Simple/t/corpus/cp1256.txt Pod::Simple test file cpan/Pod-Simple/t/corpus/cp1256.xml Pod::Simple test file -cpan/Pod-Simple/t/corpus/enc_char_directive.txt Pod::Simple test file -cpan/Pod-Simple/t/corpus/enc_char_directive.xml Pod::Simple test file -cpan/Pod-Simple/t/corpus/enc_char_wrong_directive.txt Pod::Simple test file -cpan/Pod-Simple/t/corpus/enc_char_wrong_directive.xml Pod::Simple test file +cpan/Pod-Simple/t/corpus/enc_char_directive.txt Pod::Simple test file +cpan/Pod-Simple/t/corpus/enc_char_directive.xml Pod::Simple test file +cpan/Pod-Simple/t/corpus/enc_char_wrong_directive.txt Pod::Simple test file +cpan/Pod-Simple/t/corpus/enc_char_wrong_directive.xml Pod::Simple test file cpan/Pod-Simple/t/corpus/encwarn01.txt Pod::Simple test file cpan/Pod-Simple/t/corpus/encwarn01.xml Pod::Simple test file cpan/Pod-Simple/t/corpus/encwarn02.txt Pod::Simple test file @@ -1906,22 +2066,30 @@ cpan/Pod-Usage/t/pod/testcmp.pl cpan/Pod-Usage/t/pod/testp2pt.pl cpan/Pod-Usage/t/pod/usage.pod cpan/Pod-Usage/t/pod/usage2.pod -cpan/podlators/lib/Pod/Man.pm Convert POD data to *roff -cpan/podlators/lib/Pod/ParseLink.pm Perl an L<> formatting code in POD text -cpan/podlators/lib/Pod/Text.pm Pod-Parser - convert POD data to formatted ASCII text -cpan/podlators/lib/Pod/Text/Color.pm Convert POD data to color ASCII text -cpan/podlators/lib/Pod/Text/Overstrike.pm Convert POD data to formatted overstrike text -cpan/podlators/lib/Pod/Text/Termcap.pm Convert POD data to ASCII text with format escapes -cpan/podlators/Makefile.PL podlators Makefile.PL -cpan/podlators/scripts/pod2man.PL Translator to turn pod into manpage -cpan/podlators/scripts/pod2text.PL Translator to turn pod into text -cpan/podlators/t/data/basic.cap podlators test podlators test -cpan/podlators/t/data/basic.clr podlators test -cpan/podlators/t/data/basic.man podlators test -cpan/podlators/t/data/basic.ovr podlators test -cpan/podlators/t/data/basic.pod podlators test -cpan/podlators/t/data/basic.txt podlators test -cpan/podlators/t/data/perl.conf podlators test +cpan/podlators/docs/docknot.yaml +cpan/podlators/lib/Pod/Man.pm Convert POD data to *roff +cpan/podlators/lib/Pod/ParseLink.pm Perl an L<> formatting code in POD text +cpan/podlators/lib/Pod/Text.pm Pod-Parser - convert POD data to formatted ASCII text +cpan/podlators/lib/Pod/Text/Color.pm Convert POD data to color ASCII text +cpan/podlators/lib/Pod/Text/Overstrike.pm Convert POD data to formatted overstrike text +cpan/podlators/lib/Pod/Text/Termcap.pm Convert POD data to ASCII text with format escapes +cpan/podlators/Makefile.PL podlators Makefile.PL +cpan/podlators/scripts/pod2man.PL Translator to turn pod into manpage +cpan/podlators/scripts/pod2text.PL Translator to turn pod into text +cpan/podlators/t/data/basic.cap podlators test +cpan/podlators/t/data/basic.clr podlators test +cpan/podlators/t/data/basic.man podlators test +cpan/podlators/t/data/basic.ovr podlators test +cpan/podlators/t/data/basic.pod podlators test +cpan/podlators/t/data/basic.txt podlators test +cpan/podlators/t/data/man/encoding.groff +cpan/podlators/t/data/man/encoding.pod +cpan/podlators/t/data/man/encoding.roff +cpan/podlators/t/data/man/encoding.utf8 +cpan/podlators/t/data/perl.conf podlators test +cpan/podlators/t/data/perlcriticrc +cpan/podlators/t/data/perltidyrc +cpan/podlators/t/data/regenerate-data cpan/podlators/t/data/snippets/color/escape-wrapping cpan/podlators/t/data/snippets/color/tag-width cpan/podlators/t/data/snippets/color/tag-wrapping @@ -1945,9 +2113,19 @@ cpan/podlators/t/data/snippets/man/eth cpan/podlators/t/data/snippets/man/fixed-font cpan/podlators/t/data/snippets/man/fixed-font-in-item cpan/podlators/t/data/snippets/man/for-blocks +cpan/podlators/t/data/snippets/man/guesswork +cpan/podlators/t/data/snippets/man/guesswork-all +cpan/podlators/t/data/snippets/man/guesswork-no-quoting +cpan/podlators/t/data/snippets/man/guesswork-none +cpan/podlators/t/data/snippets/man/guesswork-partial +cpan/podlators/t/data/snippets/man/guesswork-quoting cpan/podlators/t/data/snippets/man/hyphen-in-s cpan/podlators/t/data/snippets/man/iso-8859-1 +cpan/podlators/t/data/snippets/man/iso-8859-1-error-die +cpan/podlators/t/data/snippets/man/iso-8859-1-error-pod +cpan/podlators/t/data/snippets/man/iso-8859-1-roff cpan/podlators/t/data/snippets/man/item-fonts +cpan/podlators/t/data/snippets/man/language cpan/podlators/t/data/snippets/man/link-quoting cpan/podlators/t/data/snippets/man/link-to-url cpan/podlators/t/data/snippets/man/long-quote @@ -1955,29 +2133,32 @@ cpan/podlators/t/data/snippets/man/lquot cpan/podlators/t/data/snippets/man/lquote-rquote cpan/podlators/t/data/snippets/man/markup-in-name cpan/podlators/t/data/snippets/man/multiline-x +cpan/podlators/t/data/snippets/man/naive +cpan/podlators/t/data/snippets/man/naive-groff cpan/podlators/t/data/snippets/man/name-guesswork +cpan/podlators/t/data/snippets/man/name-quotes +cpan/podlators/t/data/snippets/man/name-quotes-none cpan/podlators/t/data/snippets/man/nested-lists cpan/podlators/t/data/snippets/man/newlines-in-c cpan/podlators/t/data/snippets/man/non-ascii +cpan/podlators/t/data/snippets/man/nonbreaking-space-l cpan/podlators/t/data/snippets/man/not-bullet cpan/podlators/t/data/snippets/man/not-numbers cpan/podlators/t/data/snippets/man/nourls -cpan/podlators/t/data/snippets/man/paired-quotes cpan/podlators/t/data/snippets/man/periods cpan/podlators/t/data/snippets/man/quote-escaping cpan/podlators/t/data/snippets/man/rquote-none -cpan/podlators/t/data/snippets/man/small-caps-magic cpan/podlators/t/data/snippets/man/soft-hyphens cpan/podlators/t/data/snippets/man/trailing-space cpan/podlators/t/data/snippets/man/true-false -cpan/podlators/t/data/snippets/man/uppercase-license cpan/podlators/t/data/snippets/man/utf8-nonbreaking cpan/podlators/t/data/snippets/man/utf8-verbatim cpan/podlators/t/data/snippets/man/x-whitespace cpan/podlators/t/data/snippets/man/x-whitespace-entry +cpan/podlators/t/data/snippets/man/zero-width-space cpan/podlators/t/data/snippets/overstrike/tag-width cpan/podlators/t/data/snippets/overstrike/wrapping -cpan/podlators/t/data/snippets/README podlators test +cpan/podlators/t/data/snippets/README.md cpan/podlators/t/data/snippets/termcap/escape-wrapping cpan/podlators/t/data/snippets/termcap/tag-width cpan/podlators/t/data/snippets/termcap/tag-wrapping @@ -1987,7 +2168,7 @@ cpan/podlators/t/data/snippets/termcap/w cpan/podlators/t/data/snippets/text/alt cpan/podlators/t/data/snippets/text/c-with-spaces cpan/podlators/t/data/snippets/text/code -cpan/podlators/t/data/snippets/text/cpp podlators test +cpan/podlators/t/data/snippets/text/cpp podlators test cpan/podlators/t/data/snippets/text/empty cpan/podlators/t/data/snippets/text/error-die cpan/podlators/t/data/snippets/text/error-none @@ -1996,12 +2177,22 @@ cpan/podlators/t/data/snippets/text/erro cpan/podlators/t/data/snippets/text/error-stderr cpan/podlators/t/data/snippets/text/error-stderr-opt cpan/podlators/t/data/snippets/text/for +cpan/podlators/t/data/snippets/text/guesswork-no-quoting +cpan/podlators/t/data/snippets/text/guesswork-quoting cpan/podlators/t/data/snippets/text/iso-8859-1 +cpan/podlators/t/data/snippets/text/iso-8859-1-error-die +cpan/podlators/t/data/snippets/text/iso-8859-1-error-pod +cpan/podlators/t/data/snippets/text/iso-8859-1-utf8 cpan/podlators/t/data/snippets/text/late-encoding cpan/podlators/t/data/snippets/text/link-rt cpan/podlators/t/data/snippets/text/link-url cpan/podlators/t/data/snippets/text/margin +cpan/podlators/t/data/snippets/text/naive +cpan/podlators/t/data/snippets/text/name-quotes +cpan/podlators/t/data/snippets/text/name-quotes-none +cpan/podlators/t/data/snippets/text/non-latin cpan/podlators/t/data/snippets/text/nonbreaking-space +cpan/podlators/t/data/snippets/text/nonbreaking-space-l cpan/podlators/t/data/snippets/text/nourls cpan/podlators/t/data/snippets/text/periods cpan/podlators/t/data/snippets/text/quotes-opt @@ -2010,37 +2201,41 @@ cpan/podlators/t/data/snippets/text/sent cpan/podlators/t/data/snippets/text/utf8 cpan/podlators/t/data/snippets/text/utf8-iso cpan/podlators/t/data/snippets/text/verbatim -cpan/podlators/t/data/termcap podlators test -cpan/podlators/t/docs/pod.t podlators test -cpan/podlators/t/docs/pod-spelling.t podlators test -cpan/podlators/t/docs/spdx-license.t podlators test -cpan/podlators/t/docs/synopsis.t podlators test -cpan/podlators/t/general/basic.t podlators test -cpan/podlators/t/general/filehandle.t podlators test -cpan/podlators/t/general/pod-parser.t podlators test -cpan/podlators/t/lib/Test/Podlators.pm podlators test -cpan/podlators/t/lib/Test/RRA.pm podlators test -cpan/podlators/t/lib/Test/RRA/Config.pm podlators test -cpan/podlators/t/lib/Test/RRA/ModuleVersion.pm podlators test -cpan/podlators/t/man/devise-date.t podlators test -cpan/podlators/t/man/devise-title.t podlators test -cpan/podlators/t/man/empty.t podlators test -cpan/podlators/t/man/heading.t podlators test -cpan/podlators/t/man/iso-8859-1.t podlators test -cpan/podlators/t/man/no-encode.t podlators test -cpan/podlators/t/man/snippets.t podlators test -cpan/podlators/t/man/utf8-io.t podlators test -cpan/podlators/t/parselink/basic.t podlators test +cpan/podlators/t/data/termcap podlators test +cpan/podlators/t/docs/changes.t +cpan/podlators/t/docs/pod.t podlators test +cpan/podlators/t/docs/pod-spelling.t podlators test +cpan/podlators/t/docs/spdx-license.t podlators test +cpan/podlators/t/docs/synopsis.t podlators test +cpan/podlators/t/general/basic.t podlators test +cpan/podlators/t/general/filehandle.t podlators test +cpan/podlators/t/general/pod-parser.t podlators test +cpan/podlators/t/lib/Test/Podlators.pm podlators test +cpan/podlators/t/lib/Test/RRA.pm podlators test +cpan/podlators/t/lib/Test/RRA/Config.pm podlators test +cpan/podlators/t/lib/Test/RRA/ModuleVersion.pm podlators test +cpan/podlators/t/man/devise-date.t podlators test +cpan/podlators/t/man/devise-title.t podlators test +cpan/podlators/t/man/empty.t podlators test +cpan/podlators/t/man/encoding.t +cpan/podlators/t/man/heading.t podlators test +cpan/podlators/t/man/iso-8859-1.t podlators test +cpan/podlators/t/man/no-encode.t podlators test +cpan/podlators/t/man/snippets.t podlators test +cpan/podlators/t/man/utf8-io.t podlators test +cpan/podlators/t/parselink/basic.t podlators test +cpan/podlators/t/style/critic.t +cpan/podlators/t/style/kwalitee.t cpan/podlators/t/style/minimum-version.t podlators test -cpan/podlators/t/style/module-version.t podlators test +cpan/podlators/t/style/module-version.t podlators test cpan/podlators/t/style/obsolete-strings.t -cpan/podlators/t/style/strict.t podlators test -cpan/podlators/t/text/color.t podlators test +cpan/podlators/t/style/strict.t podlators test +cpan/podlators/t/text/color.t podlators test cpan/podlators/t/text/invalid.t cpan/podlators/t/text/iso-8859-1.t -cpan/podlators/t/text/overstrike.t podlators test +cpan/podlators/t/text/overstrike.t podlators test cpan/podlators/t/text/snippets.t -cpan/podlators/t/text/termcap.t podlators test +cpan/podlators/t/text/termcap.t podlators test cpan/podlators/t/text/utf8-io.t cpan/Scalar-List-Utils/lib/List/Util.pm List::Util cpan/Scalar-List-Utils/lib/List/Util/XS.pm List::Util @@ -2139,549 +2334,549 @@ cpan/Term-ReadKey/genchars.pl Term::Re cpan/Term-ReadKey/Makefile.PL Term::ReadKey cpan/Term-ReadKey/ppport.h Term::ReadKey cpan/Term-ReadKey/ReadKey.xs Term::ReadKey -cpan/Term-ReadKey/ReadKey.pm.PL Term::ReadKey +cpan/Term-ReadKey/ReadKey.pm.PL Term::ReadKey cpan/Term-ReadKey/README Term::ReadKey cpan/Term-ReadKey/t/01_basic.t Term::ReadKey cpan/Term-ReadKey/t/02_terminal_functions.t Term::ReadKey -cpan/Test-Harness/bin/prove The prove harness utility -cpan/Test-Harness/lib/App/Prove.pm Gubbins for the prove utility -cpan/Test-Harness/lib/App/Prove/State.pm Gubbins for the prove utility -cpan/Test-Harness/lib/App/Prove/State/Result.pm Gubbins for the prove utility -cpan/Test-Harness/lib/App/Prove/State/Result/Test.pm Gubbins for the prove utility -cpan/Test-Harness/lib/TAP/Base.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Formatter/Base.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Formatter/Color.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Formatter/Console.pm A parser for Test Anything Protocol +cpan/Test-Harness/bin/prove The prove harness utility +cpan/Test-Harness/lib/App/Prove.pm Gubbins for the prove utility +cpan/Test-Harness/lib/App/Prove/State.pm Gubbins for the prove utility +cpan/Test-Harness/lib/App/Prove/State/Result.pm Gubbins for the prove utility +cpan/Test-Harness/lib/App/Prove/State/Result/Test.pm Gubbins for the prove utility +cpan/Test-Harness/lib/TAP/Base.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Formatter/Base.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Formatter/Color.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Formatter/Console.pm A parser for Test Anything Protocol cpan/Test-Harness/lib/TAP/Formatter/Console/ParallelSession.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Formatter/Console/Session.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Formatter/File.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Formatter/File/Session.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Formatter/Session.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Harness.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Formatter/Console/Session.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Formatter/File.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Formatter/File/Session.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Formatter/Session.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Harness.pm A parser for Test Anything Protocol cpan/Test-Harness/lib/TAP/Harness/Beyond.pod -cpan/Test-Harness/lib/TAP/Harness/Env.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Object.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Aggregator.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Grammar.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Iterator.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Iterator/Array.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Iterator/Process.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Iterator/Stream.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/IteratorFactory.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Multiplexer.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Result.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Result/Bailout.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Result/Comment.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Result/Plan.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Result/Pragma.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Result/Test.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Result/Unknown.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Result/Version.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Result/YAML.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/ResultFactory.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Scheduler.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Scheduler/Job.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Scheduler/Spinner.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/Source.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Harness/Env.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Object.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Aggregator.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Grammar.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Iterator.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Iterator/Array.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Iterator/Process.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Iterator/Stream.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/IteratorFactory.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Multiplexer.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Result.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Result/Bailout.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Result/Comment.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Result/Plan.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Result/Pragma.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Result/Test.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Result/Unknown.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Result/Version.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Result/YAML.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/ResultFactory.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Scheduler.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Scheduler/Job.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Scheduler/Spinner.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/Source.pm A parser for Test Anything Protocol cpan/Test-Harness/lib/TAP/Parser/SourceHandler.pm A parser for Test Anything Protocol cpan/Test-Harness/lib/TAP/Parser/SourceHandler/Executable.pm cpan/Test-Harness/lib/TAP/Parser/SourceHandler/File.pm cpan/Test-Harness/lib/TAP/Parser/SourceHandler/Handle.pm cpan/Test-Harness/lib/TAP/Parser/SourceHandler/Perl.pm cpan/Test-Harness/lib/TAP/Parser/SourceHandler/RawTAP.pm -cpan/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm A parser for Test Anything Protocol -cpan/Test-Harness/lib/Test/Harness.pm A test harness -cpan/Test-Harness/t/aggregator.t Test::Harness test -cpan/Test-Harness/t/bailout.t Test::Harness test -cpan/Test-Harness/t/base.t Test::Harness test -cpan/Test-Harness/t/callbacks.t Test::Harness test -cpan/Test-Harness/t/compat/env.t Test::Harness test -cpan/Test-Harness/t/compat/env_opts.t Test::Harness test -cpan/Test-Harness/t/compat/failure.t Test::Harness test -cpan/Test-Harness/t/compat/inc-propagation.t Test::Harness test -cpan/Test-Harness/t/compat/inc_taint.t Test::Harness test -cpan/Test-Harness/t/compat/nonumbers.t Test::Harness test -cpan/Test-Harness/t/compat/regression.t Test::Harness test +cpan/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm A parser for Test Anything Protocol +cpan/Test-Harness/lib/Test/Harness.pm A test harness +cpan/Test-Harness/t/aggregator.t Test::Harness test +cpan/Test-Harness/t/bailout.t Test::Harness test +cpan/Test-Harness/t/base.t Test::Harness test +cpan/Test-Harness/t/callbacks.t Test::Harness test +cpan/Test-Harness/t/compat/env.t Test::Harness test +cpan/Test-Harness/t/compat/env_opts.t Test::Harness test +cpan/Test-Harness/t/compat/failure.t Test::Harness test +cpan/Test-Harness/t/compat/inc-propagation.t Test::Harness test +cpan/Test-Harness/t/compat/inc_taint.t Test::Harness test +cpan/Test-Harness/t/compat/nonumbers.t Test::Harness test +cpan/Test-Harness/t/compat/regression.t Test::Harness test cpan/Test-Harness/t/compat/subclass.t Test::Harness test -cpan/Test-Harness/t/compat/switches.t Test::Harness test -cpan/Test-Harness/t/compat/test-harness-compat.t Test::Harness test -cpan/Test-Harness/t/compat/version.t Test::Harness test -cpan/Test-Harness/t/console.t Test::Harness test -cpan/Test-Harness/t/data/catme.1 Test data for Test::Harness -cpan/Test-Harness/t/data/proverc Test data for Test::Harness -cpan/Test-Harness/t/data/sample.yml Test data for Test::Harness +cpan/Test-Harness/t/compat/switches.t Test::Harness test +cpan/Test-Harness/t/compat/test-harness-compat.t Test::Harness test +cpan/Test-Harness/t/compat/version.t Test::Harness test +cpan/Test-Harness/t/console.t Test::Harness test +cpan/Test-Harness/t/data/catme.1 Test data for Test::Harness +cpan/Test-Harness/t/data/proverc Test data for Test::Harness +cpan/Test-Harness/t/data/sample.yml Test data for Test::Harness cpan/Test-Harness/t/env_opts.t -cpan/Test-Harness/t/errors.t Test::Harness test -cpan/Test-Harness/t/file.t Test::Harness test -cpan/Test-Harness/t/glob-to-regexp.t Test::Harness test -cpan/Test-Harness/t/grammar.t Test::Harness test -cpan/Test-Harness/t/harness.t Test::Harness test -cpan/Test-Harness/t/harness-bailout.t Test::Harness test -cpan/Test-Harness/t/harness-subclass.t Test::Harness test +cpan/Test-Harness/t/errors.t Test::Harness test +cpan/Test-Harness/t/file.t Test::Harness test +cpan/Test-Harness/t/glob-to-regexp.t Test::Harness test +cpan/Test-Harness/t/grammar.t Test::Harness test +cpan/Test-Harness/t/harness.t Test::Harness test +cpan/Test-Harness/t/harness-bailout.t Test::Harness test +cpan/Test-Harness/t/harness-subclass.t Test::Harness test cpan/Test-Harness/t/iterator_factory.t Test::Harness test -cpan/Test-Harness/t/iterators.t Test::Harness test -cpan/Test-Harness/t/lib/App/Prove/Plugin/Dummy.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/App/Prove/Plugin/Dummy2.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/Dev/Null.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/EmptyParser.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/IO/c55Capture.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/MyCustom.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/MyFileSourceHandler.pm Test::Harness test -cpan/Test-Harness/t/lib/MyGrammar.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/MyIterator.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/MyPerlSourceHandler.pm Test::Harness test -cpan/Test-Harness/t/lib/MyResult.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/MyResultFactory.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/MySourceHandler.pm Test::Harness test -cpan/Test-Harness/t/lib/NoFork.pm Module for testing Test::Harness -cpan/Test-Harness/t/lib/NOP.pm Module for testing Test::Harness +cpan/Test-Harness/t/iterators.t Test::Harness test +cpan/Test-Harness/t/lib/App/Prove/Plugin/Dummy.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/App/Prove/Plugin/Dummy2.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/Dev/Null.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/EmptyParser.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/IO/c55Capture.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/MyCustom.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/MyFileSourceHandler.pm Test::Harness test +cpan/Test-Harness/t/lib/MyGrammar.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/MyIterator.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/MyPerlSourceHandler.pm Test::Harness test +cpan/Test-Harness/t/lib/MyResult.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/MyResultFactory.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/MySourceHandler.pm Test::Harness test +cpan/Test-Harness/t/lib/NoFork.pm Module for testing Test::Harness +cpan/Test-Harness/t/lib/NOP.pm Module for testing Test::Harness cpan/Test-Harness/t/lib/TAP/Harness/TestSubclass.pm -cpan/Test-Harness/t/lib/TAP/Parser/SubclassTest.pm Module for testing Test::Harness -cpan/Test-Harness/t/multiplexer.t Test::Harness test -cpan/Test-Harness/t/nested.t Test::Harness test -cpan/Test-Harness/t/nofork.t Test::Harness test -cpan/Test-Harness/t/nofork-mux.t Test::Harness test -cpan/Test-Harness/t/object.t Test::Harness test -cpan/Test-Harness/t/parse.t Test::Harness test -cpan/Test-Harness/t/parser-config.t Test::Harness test -cpan/Test-Harness/t/parser-subclass.t Test::Harness test -cpan/Test-Harness/t/perl5lib.t Test::Harness test -cpan/Test-Harness/t/premature-bailout.t Test::Harness test -cpan/Test-Harness/t/process.t Test::Harness test -cpan/Test-Harness/t/prove.t Test::Harness test -cpan/Test-Harness/t/proverc.t Test::Harness test -cpan/Test-Harness/t/proverc/emptyexec Test data for Test::Harness -cpan/Test-Harness/t/proverun.t Test::Harness test +cpan/Test-Harness/t/lib/TAP/Parser/SubclassTest.pm Module for testing Test::Harness +cpan/Test-Harness/t/multiplexer.t Test::Harness test +cpan/Test-Harness/t/nested.t Test::Harness test +cpan/Test-Harness/t/nofork.t Test::Harness test +cpan/Test-Harness/t/nofork-mux.t Test::Harness test +cpan/Test-Harness/t/object.t Test::Harness test +cpan/Test-Harness/t/parse.t Test::Harness test +cpan/Test-Harness/t/parser-config.t Test::Harness test +cpan/Test-Harness/t/parser-subclass.t Test::Harness test +cpan/Test-Harness/t/perl5lib.t Test::Harness test +cpan/Test-Harness/t/premature-bailout.t Test::Harness test +cpan/Test-Harness/t/process.t Test::Harness test +cpan/Test-Harness/t/prove.t Test::Harness test +cpan/Test-Harness/t/proverc.t Test::Harness test +cpan/Test-Harness/t/proverc/emptyexec Test data for Test::Harness +cpan/Test-Harness/t/proverun.t Test::Harness test cpan/Test-Harness/t/proveversion.t Test::Harness test -cpan/Test-Harness/t/regression.t Test::Harness test -cpan/Test-Harness/t/results.t Test::Harness test +cpan/Test-Harness/t/regression.t Test::Harness test +cpan/Test-Harness/t/results.t Test::Harness test cpan/Test-Harness/t/rulesfile.t -cpan/Test-Harness/t/sample-tests/bailout Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/bignum Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/bignum_many Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/combined Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/combined_compat Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/delayed Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/descriptive Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/descriptive_trailing Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/die Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/die_head_end Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/die_last_minute Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/die_unfinished Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/duplicates Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/echo Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/empty Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/escape_eol Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/escape_hash Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/head_end Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/head_fail Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/inc_taint Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/junk_before_plan Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/lone_not_bug Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/no_nums Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/no_output Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/out_err_mix Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/out_of_order Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/schwern Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/schwern-todo-quiet Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/segfault Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/sequence_misparse Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/shbang_misparse Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/simple Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/simple_fail Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/simple_yaml Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/simple_yaml_missing_version13 Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/skip Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/skip_nomsg Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/skipall Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/skipall_nomsg Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/skipall_v13 Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/space_after_plan Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/bailout Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/bignum Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/bignum_many Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/combined Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/combined_compat Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/delayed Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/descriptive Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/descriptive_trailing Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/die Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/die_head_end Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/die_last_minute Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/die_unfinished Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/duplicates Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/echo Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/empty Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/escape_eol Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/escape_hash Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/head_end Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/head_fail Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/inc_taint Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/junk_before_plan Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/lone_not_bug Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/no_nums Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/no_output Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/out_err_mix Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/out_of_order Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/schwern Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/schwern-todo-quiet Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/segfault Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/sequence_misparse Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/shbang_misparse Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/simple Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/simple_fail Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/simple_yaml Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/simple_yaml_missing_version13 Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/skip Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/skip_nomsg Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/skipall Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/skipall_nomsg Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/skipall_v13 Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/space_after_plan Test data for Test::Harness cpan/Test-Harness/t/sample-tests/space_after_plan_v13 -cpan/Test-Harness/t/sample-tests/stdout_stderr Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/strict Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/switches Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/taint Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/taint_warn Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/todo Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/todo_inline Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/todo_misparse Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/too_many Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/version_good Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/version_late Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/version_old Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/vms_nit Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/with_comments Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/yaml_late_plan Test data for Test::Harness -cpan/Test-Harness/t/sample-tests/zero_valid Test data for Test::Harness -cpan/Test-Harness/t/scheduler.t Test::Harness test -cpan/Test-Harness/t/source.t Test::Harness test +cpan/Test-Harness/t/sample-tests/stdout_stderr Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/strict Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/switches Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/taint Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/taint_warn Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/todo Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/todo_inline Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/todo_misparse Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/too_many Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/version_good Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/version_late Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/version_old Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/vms_nit Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/with_comments Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/yaml_late_plan Test data for Test::Harness +cpan/Test-Harness/t/sample-tests/zero_valid Test data for Test::Harness +cpan/Test-Harness/t/scheduler.t Test::Harness test +cpan/Test-Harness/t/source.t Test::Harness test cpan/Test-Harness/t/source_handler.t Test::Harness test -cpan/Test-Harness/t/source_tests/harness Test data for Test::Harness -cpan/Test-Harness/t/source_tests/harness_badtap Test data for Test::Harness -cpan/Test-Harness/t/source_tests/harness_complain Test data for Test::Harness -cpan/Test-Harness/t/source_tests/harness_directives Test data for Test::Harness -cpan/Test-Harness/t/source_tests/harness_failure Test data for Test::Harness -cpan/Test-Harness/t/source_tests/psql.bat Test::Harness test -cpan/Test-Harness/t/source_tests/source Test data for Test::Harness -cpan/Test-Harness/t/source_tests/source.1 Test::Harness test -cpan/Test-Harness/t/source_tests/source.bat Test::Harness test -cpan/Test-Harness/t/source_tests/source.pl Test::Harness test -cpan/Test-Harness/t/source_tests/source.sh Test::Harness test -cpan/Test-Harness/t/source_tests/source.t Test::Harness test -cpan/Test-Harness/t/source_tests/source.tap Test::Harness test -cpan/Test-Harness/t/source_tests/source_args.sh Test::Harness test +cpan/Test-Harness/t/source_tests/harness Test data for Test::Harness +cpan/Test-Harness/t/source_tests/harness_badtap Test data for Test::Harness +cpan/Test-Harness/t/source_tests/harness_complain Test data for Test::Harness +cpan/Test-Harness/t/source_tests/harness_directives Test data for Test::Harness +cpan/Test-Harness/t/source_tests/harness_failure Test data for Test::Harness +cpan/Test-Harness/t/source_tests/psql.bat Test::Harness test +cpan/Test-Harness/t/source_tests/source Test data for Test::Harness +cpan/Test-Harness/t/source_tests/source.1 Test::Harness test +cpan/Test-Harness/t/source_tests/source.bat Test::Harness test +cpan/Test-Harness/t/source_tests/source.pl Test::Harness test +cpan/Test-Harness/t/source_tests/source.sh Test::Harness test +cpan/Test-Harness/t/source_tests/source.t Test::Harness test +cpan/Test-Harness/t/source_tests/source.tap Test::Harness test +cpan/Test-Harness/t/source_tests/source_args.sh Test::Harness test cpan/Test-Harness/t/source_tests/test.tap -cpan/Test-Harness/t/spool.t Test::Harness test -cpan/Test-Harness/t/state.t Test::Harness test -cpan/Test-Harness/t/state_results.t Test::Harness test -cpan/Test-Harness/t/streams.t Test::Harness test -cpan/Test-Harness/t/subclass_tests/non_perl_source Test data for Test::Harness -cpan/Test-Harness/t/subclass_tests/perl_source Test data for Test::Harness -cpan/Test-Harness/t/taint.t Test::Harness test -cpan/Test-Harness/t/testargs.t Test::Harness test -cpan/Test-Harness/t/unicode.t Test::Harness test -cpan/Test-Harness/t/yamlish.t Test::Harness test -cpan/Test-Harness/t/yamlish-output.t Test::Harness test -cpan/Test-Harness/t/yamlish-writer.t Test::Harness test -cpan/Test-Simple/lib/ok.pm -cpan/Test-Simple/lib/Test/Builder.pm -cpan/Test-Simple/lib/Test/Builder/Formatter.pm -cpan/Test-Simple/lib/Test/Builder/IO/Scalar.pm -cpan/Test-Simple/lib/Test/Builder/Module.pm -cpan/Test-Simple/lib/Test/Builder/Tester.pm -cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm -cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm -cpan/Test-Simple/lib/Test/More.pm -cpan/Test-Simple/lib/Test/Simple.pm -cpan/Test-Simple/lib/Test/Tester.pm -cpan/Test-Simple/lib/Test/Tester/Capture.pm -cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm -cpan/Test-Simple/lib/Test/Tester/Delegate.pm -cpan/Test-Simple/lib/Test/Tutorial.pod -cpan/Test-Simple/lib/Test/use/ok.pm -cpan/Test-Simple/lib/Test2.pm -cpan/Test-Simple/lib/Test2/API.pm -cpan/Test-Simple/lib/Test2/API/Breakage.pm -cpan/Test-Simple/lib/Test2/API/Context.pm -cpan/Test-Simple/lib/Test2/API/Instance.pm -cpan/Test-Simple/lib/Test2/API/InterceptResult.pm -cpan/Test-Simple/lib/Test2/API/InterceptResult/Event.pm -cpan/Test-Simple/lib/Test2/API/InterceptResult/Facet.pm -cpan/Test-Simple/lib/Test2/API/InterceptResult/Hub.pm -cpan/Test-Simple/lib/Test2/API/InterceptResult/Squasher.pm -cpan/Test-Simple/lib/Test2/API/Stack.pm -cpan/Test-Simple/lib/Test2/Event.pm -cpan/Test-Simple/lib/Test2/Event/Bail.pm -cpan/Test-Simple/lib/Test2/Event/Diag.pm -cpan/Test-Simple/lib/Test2/Event/Encoding.pm -cpan/Test-Simple/lib/Test2/Event/Exception.pm -cpan/Test-Simple/lib/Test2/Event/Fail.pm -cpan/Test-Simple/lib/Test2/Event/Generic.pm -cpan/Test-Simple/lib/Test2/Event/Note.pm -cpan/Test-Simple/lib/Test2/Event/Ok.pm -cpan/Test-Simple/lib/Test2/Event/Pass.pm -cpan/Test-Simple/lib/Test2/Event/Plan.pm -cpan/Test-Simple/lib/Test2/Event/Skip.pm -cpan/Test-Simple/lib/Test2/Event/Subtest.pm -cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm -cpan/Test-Simple/lib/Test2/Event/V2.pm -cpan/Test-Simple/lib/Test2/Event/Waiting.pm -cpan/Test-Simple/lib/Test2/EventFacet.pm -cpan/Test-Simple/lib/Test2/EventFacet/About.pm -cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm -cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm -cpan/Test-Simple/lib/Test2/EventFacet/Control.pm -cpan/Test-Simple/lib/Test2/EventFacet/Error.pm -cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm -cpan/Test-Simple/lib/Test2/EventFacet/Info.pm -cpan/Test-Simple/lib/Test2/EventFacet/Info/Table.pm -cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm -cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm -cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm -cpan/Test-Simple/lib/Test2/EventFacet/Render.pm -cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm -cpan/Test-Simple/lib/Test2/Formatter.pm -cpan/Test-Simple/lib/Test2/Formatter/TAP.pm -cpan/Test-Simple/lib/Test2/Hub.pm -cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm -cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm -cpan/Test-Simple/lib/Test2/Hub/Subtest.pm -cpan/Test-Simple/lib/Test2/IPC.pm -cpan/Test-Simple/lib/Test2/IPC/Driver.pm -cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm -cpan/Test-Simple/lib/Test2/Tools/Tiny.pm -cpan/Test-Simple/lib/Test2/Transition.pod -cpan/Test-Simple/lib/Test2/Util.pm -cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm -cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm -cpan/Test-Simple/lib/Test2/Util/HashBase.pm -cpan/Test-Simple/lib/Test2/Util/Trace.pm -cpan/Test-Simple/t/HashBase.t -cpan/Test-Simple/t/Legacy/00test_harness_check.t -cpan/Test-Simple/t/Legacy/01-basic.t -cpan/Test-Simple/t/Legacy/478-cmp_ok_hash.t -cpan/Test-Simple/t/Legacy/auto.t -cpan/Test-Simple/t/Legacy/bad_plan.t -cpan/Test-Simple/t/Legacy/bail_out.t -cpan/Test-Simple/t/Legacy/BEGIN_require_ok.t -cpan/Test-Simple/t/Legacy/BEGIN_use_ok.t -cpan/Test-Simple/t/Legacy/buffer.t -cpan/Test-Simple/t/Legacy/Bugs/600.t -cpan/Test-Simple/t/Legacy/Bugs/629.t -cpan/Test-Simple/t/Legacy/Builder/Builder.t -cpan/Test-Simple/t/Legacy/Builder/carp.t -cpan/Test-Simple/t/Legacy/Builder/create.t -cpan/Test-Simple/t/Legacy/Builder/current_test.t -cpan/Test-Simple/t/Legacy/Builder/current_test_without_plan.t -cpan/Test-Simple/t/Legacy/Builder/details.t -cpan/Test-Simple/t/Legacy/Builder/done_testing.t -cpan/Test-Simple/t/Legacy/Builder/done_testing_double.t -cpan/Test-Simple/t/Legacy/Builder/done_testing_plan_mismatch.t -cpan/Test-Simple/t/Legacy/Builder/done_testing_with_no_plan.t -cpan/Test-Simple/t/Legacy/Builder/done_testing_with_number.t -cpan/Test-Simple/t/Legacy/Builder/done_testing_with_plan.t -cpan/Test-Simple/t/Legacy/Builder/fork_with_new_stdout.t -cpan/Test-Simple/t/Legacy/Builder/has_plan.t -cpan/Test-Simple/t/Legacy/Builder/has_plan2.t -cpan/Test-Simple/t/Legacy/Builder/is_fh.t -cpan/Test-Simple/t/Legacy/Builder/is_passing.t -cpan/Test-Simple/t/Legacy/Builder/maybe_regex.t -cpan/Test-Simple/t/Legacy/Builder/no_diag.t -cpan/Test-Simple/t/Legacy/Builder/no_ending.t -cpan/Test-Simple/t/Legacy/Builder/no_header.t -cpan/Test-Simple/t/Legacy/Builder/no_plan_at_all.t -cpan/Test-Simple/t/Legacy/Builder/ok_obj.t -cpan/Test-Simple/t/Legacy/Builder/output.t -cpan/Test-Simple/t/Legacy/Builder/reset.t -cpan/Test-Simple/t/Legacy/Builder/reset_outputs.t -cpan/Test-Simple/t/Legacy/Builder/try.t -cpan/Test-Simple/t/Legacy/c_flag.t -cpan/Test-Simple/t/Legacy/capture.t -cpan/Test-Simple/t/Legacy/check_tests.t -cpan/Test-Simple/t/Legacy/circular_data.t -cpan/Test-Simple/t/Legacy/cmp_ok.t -cpan/Test-Simple/t/Legacy/depth.t -cpan/Test-Simple/t/Legacy/diag.t -cpan/Test-Simple/t/Legacy/died.t -cpan/Test-Simple/t/Legacy/dont_overwrite_die_handler.t -cpan/Test-Simple/t/Legacy/eq_set.t -cpan/Test-Simple/t/Legacy/exit.t -cpan/Test-Simple/t/Legacy/explain.t -cpan/Test-Simple/t/Legacy/explain_err_vars.t -cpan/Test-Simple/t/Legacy/extra.t -cpan/Test-Simple/t/Legacy/extra_one.t -cpan/Test-Simple/t/Legacy/fail.t -cpan/Test-Simple/t/Legacy/fail-like.t -cpan/Test-Simple/t/Legacy/fail-more.t -cpan/Test-Simple/t/Legacy/fail_one.t -cpan/Test-Simple/t/Legacy/filehandles.t -cpan/Test-Simple/t/Legacy/fork.t -cpan/Test-Simple/t/Legacy/harness_active.t -cpan/Test-Simple/t/Legacy/import.t -cpan/Test-Simple/t/Legacy/is_deeply_dne_bug.t -cpan/Test-Simple/t/Legacy/is_deeply_fail.t -cpan/Test-Simple/t/Legacy/is_deeply_with_threads.t -cpan/Test-Simple/t/Legacy/missing.t -cpan/Test-Simple/t/Legacy/More.t -cpan/Test-Simple/t/Legacy/new_ok.t -cpan/Test-Simple/t/Legacy/no_log_results.t -cpan/Test-Simple/t/Legacy/no_plan.t -cpan/Test-Simple/t/Legacy/no_tests.t -cpan/Test-Simple/t/Legacy/note.t -cpan/Test-Simple/t/Legacy/overload.t -cpan/Test-Simple/t/Legacy/overload_threads.t -cpan/Test-Simple/t/Legacy/plan.t -cpan/Test-Simple/t/Legacy/plan_bad.t -cpan/Test-Simple/t/Legacy/plan_is_noplan.t -cpan/Test-Simple/t/Legacy/plan_no_plan.t -cpan/Test-Simple/t/Legacy/plan_shouldnt_import.t -cpan/Test-Simple/t/Legacy/plan_skip_all.t -cpan/Test-Simple/t/Legacy/Regression/637.t -cpan/Test-Simple/t/Legacy/Regression/683_thread_todo.t -cpan/Test-Simple/t/Legacy/Regression/6_cmp_ok.t -cpan/Test-Simple/t/Legacy/Regression/736_use_ok.t -cpan/Test-Simple/t/Legacy/Regression/789-read-only.t -cpan/Test-Simple/t/Legacy/Regression/870-experimental-warnings.t -cpan/Test-Simple/t/Legacy/Regression/is_capture.t -cpan/Test-Simple/t/Legacy/require_ok.t -cpan/Test-Simple/t/Legacy/run_test.t -cpan/Test-Simple/t/Legacy/simple.t -cpan/Test-Simple/t/Legacy/Simple/load.t -cpan/Test-Simple/t/Legacy/skip.t -cpan/Test-Simple/t/Legacy/skipall.t -cpan/Test-Simple/t/Legacy/strays.t -cpan/Test-Simple/t/Legacy/subtest/args.t -cpan/Test-Simple/t/Legacy/subtest/bail_out.t -cpan/Test-Simple/t/Legacy/subtest/basic.t -cpan/Test-Simple/t/Legacy/subtest/callback.t -cpan/Test-Simple/t/Legacy/subtest/die.t -cpan/Test-Simple/t/Legacy/subtest/do.t -cpan/Test-Simple/t/Legacy/subtest/events.t -cpan/Test-Simple/t/Legacy/subtest/for_do_t.test -cpan/Test-Simple/t/Legacy/subtest/fork.t -cpan/Test-Simple/t/Legacy/subtest/implicit_done.t -cpan/Test-Simple/t/Legacy/subtest/line_numbers.t -cpan/Test-Simple/t/Legacy/subtest/plan.t -cpan/Test-Simple/t/Legacy/subtest/predicate.t -cpan/Test-Simple/t/Legacy/subtest/singleton.t -cpan/Test-Simple/t/Legacy/subtest/threads.t -cpan/Test-Simple/t/Legacy/subtest/todo.t -cpan/Test-Simple/t/Legacy/subtest/wstat.t -cpan/Test-Simple/t/Legacy/tbm_doesnt_set_exported_to.t -cpan/Test-Simple/t/Legacy/Test2/Subtest.t -cpan/Test-Simple/t/Legacy/Tester/tbt_01basic.t -cpan/Test-Simple/t/Legacy/Tester/tbt_02fhrestore.t -cpan/Test-Simple/t/Legacy/Tester/tbt_03die.t -cpan/Test-Simple/t/Legacy/Tester/tbt_04line_num.t -cpan/Test-Simple/t/Legacy/Tester/tbt_05faildiag.t -cpan/Test-Simple/t/Legacy/Tester/tbt_06errormess.t -cpan/Test-Simple/t/Legacy/Tester/tbt_07args.t -cpan/Test-Simple/t/Legacy/Tester/tbt_08subtest.t -cpan/Test-Simple/t/Legacy/Tester/tbt_09do.t -cpan/Test-Simple/t/Legacy/Tester/tbt_09do_script.pl -cpan/Test-Simple/t/Legacy/thread_taint.t -cpan/Test-Simple/t/Legacy/threads.t -cpan/Test-Simple/t/Legacy/todo.t -cpan/Test-Simple/t/Legacy/undef.t -cpan/Test-Simple/t/Legacy/use_ok.t -cpan/Test-Simple/t/Legacy/useing.t -cpan/Test-Simple/t/Legacy/utf8.t -cpan/Test-Simple/t/Legacy/versions.t -cpan/Test-Simple/t/Legacy_And_Test2/builder_loaded_late.t -cpan/Test-Simple/t/Legacy_And_Test2/diag_event_on_ok.t -cpan/Test-Simple/t/Legacy_And_Test2/hidden_warnings.t -cpan/Test-Simple/t/Legacy_And_Test2/preload_diag_note.t -cpan/Test-Simple/t/Legacy_And_Test2/thread_init_warning.t -cpan/Test-Simple/t/lib/Dev/Null.pm -cpan/Test-Simple/t/lib/Dummy.pm -cpan/Test-Simple/t/lib/MyOverload.pm -cpan/Test-Simple/t/lib/MyTest.pm -cpan/Test-Simple/t/lib/NoExporter.pm -cpan/Test-Simple/t/lib/SigDie.pm -cpan/Test-Simple/t/lib/SkipAll.pm -cpan/Test-Simple/t/lib/SmallTest.pm -cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm -cpan/Test-Simple/t/lib/Test/Simple/Catch.pm -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_in_eval.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_with_handler.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/exit.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/extras.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/five_fail.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/last_minute_death.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/missing_done_testing.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail_without_plan.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/pre_plan_death.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/require.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/success.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few_fail.plx -cpan/Test-Simple/t/lib/Test/Simple/sample_tests/two_fail.plx -cpan/Test-Simple/t/lib/TieOut.pm -cpan/Test-Simple/t/regression/642_persistent_end.t -cpan/Test-Simple/t/regression/662-tbt-no-plan.t -cpan/Test-Simple/t/regression/684-nested_todo_diag.t -cpan/Test-Simple/t/regression/694_note_diag_return_values.t -cpan/Test-Simple/t/regression/696-intercept_skip_all.t -cpan/Test-Simple/t/regression/721-nested-streamed-subtest.t -cpan/Test-Simple/t/regression/757-reset_in_subtest.t -cpan/Test-Simple/t/regression/812-todo.t -cpan/Test-Simple/t/regression/817-subtest-todo.t -cpan/Test-Simple/t/regression/862-intercept_tb_todo.t -cpan/Test-Simple/t/regression/buffered_subtest_plan_buffered.t -cpan/Test-Simple/t/regression/builder_does_not_init.t -cpan/Test-Simple/t/regression/errors_facet.t -cpan/Test-Simple/t/regression/fork_first.t -cpan/Test-Simple/t/regression/inherit_trace.t -cpan/Test-Simple/t/regression/no_name_in_subtest.t -cpan/Test-Simple/t/regression/skip_reason_object_ipc.t -cpan/Test-Simple/t/regression/todo_and_facets.t -cpan/Test-Simple/t/Test2/acceptance/try_it_done_testing.t -cpan/Test-Simple/t/Test2/acceptance/try_it_fork.t -cpan/Test-Simple/t/Test2/acceptance/try_it_no_plan.t -cpan/Test-Simple/t/Test2/acceptance/try_it_plan.t -cpan/Test-Simple/t/Test2/acceptance/try_it_skip.t -cpan/Test-Simple/t/Test2/acceptance/try_it_threads.t -cpan/Test-Simple/t/Test2/acceptance/try_it_todo.t -cpan/Test-Simple/t/Test2/behavior/disable_ipc_a.t -cpan/Test-Simple/t/Test2/behavior/disable_ipc_b.t -cpan/Test-Simple/t/Test2/behavior/disable_ipc_c.t -cpan/Test-Simple/t/Test2/behavior/disable_ipc_d.t -cpan/Test-Simple/t/Test2/behavior/err_var.t -cpan/Test-Simple/t/Test2/behavior/Formatter.t -cpan/Test-Simple/t/Test2/behavior/init_croak.t -cpan/Test-Simple/t/Test2/behavior/intercept.t -cpan/Test-Simple/t/Test2/behavior/ipc_wait_timeout.t -cpan/Test-Simple/t/Test2/behavior/nested_context_exception.t -cpan/Test-Simple/t/Test2/behavior/no_load_api.t -cpan/Test-Simple/t/Test2/behavior/run_subtest_inherit.t -cpan/Test-Simple/t/Test2/behavior/special_names.t -cpan/Test-Simple/t/Test2/behavior/subtest_bailout.t -cpan/Test-Simple/t/Test2/behavior/Subtest_buffer_formatter.t -cpan/Test-Simple/t/Test2/behavior/Subtest_callback.t -cpan/Test-Simple/t/Test2/behavior/Subtest_events.t -cpan/Test-Simple/t/Test2/behavior/Subtest_plan.t -cpan/Test-Simple/t/Test2/behavior/Subtest_todo.t -cpan/Test-Simple/t/Test2/behavior/Taint.t -cpan/Test-Simple/t/Test2/behavior/trace_signature.t -cpan/Test-Simple/t/Test2/behavior/uuid.t -cpan/Test-Simple/t/Test2/legacy/TAP.t -cpan/Test-Simple/t/Test2/modules/API.t -cpan/Test-Simple/t/Test2/modules/API/Breakage.t -cpan/Test-Simple/t/Test2/modules/API/Context.t -cpan/Test-Simple/t/Test2/modules/API/Instance.t -cpan/Test-Simple/t/Test2/modules/API/InterceptResult.t -cpan/Test-Simple/t/Test2/modules/API/InterceptResult/Event.t -cpan/Test-Simple/t/Test2/modules/API/InterceptResult/Squasher.t -cpan/Test-Simple/t/Test2/modules/API/Stack.t -cpan/Test-Simple/t/Test2/modules/Event.t -cpan/Test-Simple/t/Test2/modules/Event/Bail.t -cpan/Test-Simple/t/Test2/modules/Event/Diag.t -cpan/Test-Simple/t/Test2/modules/Event/Encoding.t -cpan/Test-Simple/t/Test2/modules/Event/Exception.t -cpan/Test-Simple/t/Test2/modules/Event/Fail.t -cpan/Test-Simple/t/Test2/modules/Event/Generic.t -cpan/Test-Simple/t/Test2/modules/Event/Note.t -cpan/Test-Simple/t/Test2/modules/Event/Ok.t -cpan/Test-Simple/t/Test2/modules/Event/Pass.t -cpan/Test-Simple/t/Test2/modules/Event/Plan.t -cpan/Test-Simple/t/Test2/modules/Event/Skip.t -cpan/Test-Simple/t/Test2/modules/Event/Subtest.t -cpan/Test-Simple/t/Test2/modules/Event/TAP/Version.t -cpan/Test-Simple/t/Test2/modules/Event/V2.t -cpan/Test-Simple/t/Test2/modules/Event/Waiting.t -cpan/Test-Simple/t/Test2/modules/EventFacet.t -cpan/Test-Simple/t/Test2/modules/EventFacet/About.t -cpan/Test-Simple/t/Test2/modules/EventFacet/Amnesty.t -cpan/Test-Simple/t/Test2/modules/EventFacet/Assert.t -cpan/Test-Simple/t/Test2/modules/EventFacet/Control.t -cpan/Test-Simple/t/Test2/modules/EventFacet/Error.t -cpan/Test-Simple/t/Test2/modules/EventFacet/Info.t -cpan/Test-Simple/t/Test2/modules/EventFacet/Meta.t -cpan/Test-Simple/t/Test2/modules/EventFacet/Parent.t -cpan/Test-Simple/t/Test2/modules/EventFacet/Plan.t -cpan/Test-Simple/t/Test2/modules/EventFacet/Trace.t -cpan/Test-Simple/t/Test2/modules/Formatter/TAP.t -cpan/Test-Simple/t/Test2/modules/Hub.t -cpan/Test-Simple/t/Test2/modules/Hub/Interceptor.t -cpan/Test-Simple/t/Test2/modules/Hub/Interceptor/Terminator.t -cpan/Test-Simple/t/Test2/modules/Hub/Subtest.t -cpan/Test-Simple/t/Test2/modules/IPC.t -cpan/Test-Simple/t/Test2/modules/IPC/Driver.t -cpan/Test-Simple/t/Test2/modules/IPC/Driver/Files.t -cpan/Test-Simple/t/Test2/modules/Tools/Tiny.t -cpan/Test-Simple/t/Test2/modules/Util.t -cpan/Test-Simple/t/Test2/modules/Util/ExternalMeta.t -cpan/Test-Simple/t/Test2/modules/Util/Facets2Legacy.t -cpan/Test-Simple/t/Test2/modules/Util/Trace.t -cpan/Test-Simple/t/Test2/regression/693_ipc_ordering.t -cpan/Test-Simple/t/Test2/regression/746-forking-subtest.t -cpan/Test-Simple/t/Test2/regression/gh_16.t -cpan/Test-Simple/t/Test2/regression/ipc_files_abort_exit.t +cpan/Test-Harness/t/spool.t Test::Harness test +cpan/Test-Harness/t/state.t Test::Harness test +cpan/Test-Harness/t/state_results.t Test::Harness test +cpan/Test-Harness/t/streams.t Test::Harness test +cpan/Test-Harness/t/subclass_tests/non_perl_source Test data for Test::Harness +cpan/Test-Harness/t/subclass_tests/perl_source Test data for Test::Harness +cpan/Test-Harness/t/taint.t Test::Harness test +cpan/Test-Harness/t/testargs.t Test::Harness test +cpan/Test-Harness/t/unicode.t Test::Harness test +cpan/Test-Harness/t/yamlish.t Test::Harness test +cpan/Test-Harness/t/yamlish-output.t Test::Harness test +cpan/Test-Harness/t/yamlish-writer.t Test::Harness test +cpan/Test-Simple/lib/ok.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Builder.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Builder/Formatter.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Builder/IO/Scalar.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Builder/Module.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Builder/Tester.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/More.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Simple.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Tester.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Tester/Capture.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Tester/Delegate.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test/Tutorial.pod Test::Simple +cpan/Test-Simple/lib/Test/use/ok.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/API.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/API/Breakage.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/API/Context.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/API/Instance.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/API/InterceptResult.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/API/InterceptResult/Event.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/API/InterceptResult/Facet.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/API/InterceptResult/Hub.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/API/InterceptResult/Squasher.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/API/Stack.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Bail.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Diag.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Encoding.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Exception.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Fail.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Generic.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Note.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Ok.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Pass.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Plan.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Skip.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Subtest.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/V2.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Event/Waiting.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/About.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Control.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Error.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Info.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Info/Table.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Render.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Formatter.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Formatter/TAP.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Hub.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Hub/Subtest.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/IPC.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/IPC/Driver.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Tools/Tiny.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Transition.pod Test::Simple +cpan/Test-Simple/lib/Test2/Util.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Util/HashBase.pm Module related to Test::Simple +cpan/Test-Simple/lib/Test2/Util/Trace.pm Module related to Test::Simple +cpan/Test-Simple/t/HashBase.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/00test_harness_check.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/01-basic.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/478-cmp_ok_hash.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/auto.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/bad_plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/bail_out.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/BEGIN_require_ok.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/BEGIN_use_ok.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/buffer.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Bugs/600.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Bugs/629.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/Builder.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/carp.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/create.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/current_test.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/current_test_without_plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/details.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/done_testing.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/done_testing_double.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/done_testing_plan_mismatch.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/done_testing_with_no_plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/done_testing_with_number.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/done_testing_with_plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/fork_with_new_stdout.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/has_plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/has_plan2.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/is_fh.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/is_passing.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/maybe_regex.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/no_diag.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/no_ending.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/no_header.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/no_plan_at_all.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/ok_obj.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/output.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/reset.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/reset_outputs.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Builder/try.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/c_flag.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/capture.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/check_tests.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/circular_data.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/cmp_ok.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/depth.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/diag.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/died.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/dont_overwrite_die_handler.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/eq_set.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/exit.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/explain.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/explain_err_vars.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/extra.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/extra_one.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/fail.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/fail-like.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/fail-more.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/fail_one.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/filehandles.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/fork.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/harness_active.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/import.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/is_deeply_dne_bug.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/is_deeply_fail.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/is_deeply_with_threads.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/missing.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/More.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/new_ok.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/no_log_results.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/no_plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/no_tests.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/note.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/overload.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/overload_threads.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/plan_bad.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/plan_is_noplan.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/plan_no_plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/plan_shouldnt_import.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/plan_skip_all.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Regression/637.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Regression/683_thread_todo.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Regression/6_cmp_ok.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Regression/736_use_ok.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Regression/789-read-only.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Regression/870-experimental-warnings.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Regression/is_capture.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/require_ok.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/run_test.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/simple.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Simple/load.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/skip.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/skipall.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/strays.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/args.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/bail_out.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/basic.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/callback.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/die.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/do.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/events.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/for_do_t.test Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/fork.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/implicit_done.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/line_numbers.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/predicate.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/singleton.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/threads.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/todo.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/subtest/wstat.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/tbm_doesnt_set_exported_to.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Test2/Subtest.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Tester/tbt_01basic.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Tester/tbt_02fhrestore.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Tester/tbt_03die.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Tester/tbt_04line_num.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Tester/tbt_05faildiag.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Tester/tbt_06errormess.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Tester/tbt_07args.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Tester/tbt_08subtest.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Tester/tbt_09do.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/Tester/tbt_09do_script.pl Script related to Test::Simple +cpan/Test-Simple/t/Legacy/thread_taint.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/threads.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/todo.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/undef.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/use_ok.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/useing.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/utf8.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy/versions.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy_And_Test2/builder_loaded_late.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy_And_Test2/diag_event_on_ok.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy_And_Test2/hidden_warnings.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy_And_Test2/preload_diag_note.t Test file related to Test::Simple +cpan/Test-Simple/t/Legacy_And_Test2/thread_init_warning.t Test file related to Test::Simple +cpan/Test-Simple/t/lib/Dev/Null.pm Module related to Test::Simple +cpan/Test-Simple/t/lib/Dummy.pm Module related to Test::Simple +cpan/Test-Simple/t/lib/MyOverload.pm Module related to Test::Simple +cpan/Test-Simple/t/lib/MyTest.pm Module related to Test::Simple +cpan/Test-Simple/t/lib/NoExporter.pm Module related to Test::Simple +cpan/Test-Simple/t/lib/SigDie.pm Module related to Test::Simple +cpan/Test-Simple/t/lib/SkipAll.pm Module related to Test::Simple +cpan/Test-Simple/t/lib/SmallTest.pm Module related to Test::Simple +cpan/Test-Simple/t/lib/Test/Builder/NoOutput.pm Module related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/Catch.pm Module related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_in_eval.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/death_with_handler.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/exit.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/extras.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/five_fail.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/last_minute_death.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/missing_done_testing.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/one_fail_without_plan.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/pre_plan_death.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/require.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/success.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/too_few_fail.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/Test/Simple/sample_tests/two_fail.plx Script related to Test::Simple +cpan/Test-Simple/t/lib/TieOut.pm Module related to Test::Simple +cpan/Test-Simple/t/regression/642_persistent_end.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/662-tbt-no-plan.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/684-nested_todo_diag.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/694_note_diag_return_values.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/696-intercept_skip_all.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/721-nested-streamed-subtest.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/757-reset_in_subtest.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/812-todo.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/817-subtest-todo.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/862-intercept_tb_todo.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/buffered_subtest_plan_buffered.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/builder_does_not_init.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/errors_facet.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/fork_first.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/inherit_trace.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/no_name_in_subtest.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/skip_reason_object_ipc.t Test file related to Test::Simple +cpan/Test-Simple/t/regression/todo_and_facets.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/acceptance/try_it_done_testing.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/acceptance/try_it_fork.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/acceptance/try_it_no_plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/acceptance/try_it_plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/acceptance/try_it_skip.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/acceptance/try_it_threads.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/acceptance/try_it_todo.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/disable_ipc_a.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/disable_ipc_b.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/disable_ipc_c.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/disable_ipc_d.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/err_var.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/Formatter.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/init_croak.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/intercept.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/ipc_wait_timeout.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/nested_context_exception.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/no_load_api.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/run_subtest_inherit.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/special_names.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/subtest_bailout.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/Subtest_buffer_formatter.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/Subtest_callback.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/Subtest_events.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/Subtest_plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/Subtest_todo.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/Taint.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/trace_signature.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/behavior/uuid.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/legacy/TAP.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/API.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/API/Breakage.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/API/Context.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/API/Instance.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/API/InterceptResult.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/API/InterceptResult/Event.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/API/InterceptResult/Squasher.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/API/Stack.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Bail.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Diag.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Encoding.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Exception.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Fail.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Generic.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Note.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Ok.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Pass.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Skip.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Subtest.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/TAP/Version.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/V2.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Event/Waiting.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet/About.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet/Amnesty.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet/Assert.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet/Control.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet/Error.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet/Info.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet/Meta.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet/Parent.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet/Plan.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/EventFacet/Trace.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Formatter/TAP.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Hub.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Hub/Interceptor.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Hub/Interceptor/Terminator.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Hub/Subtest.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/IPC.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/IPC/Driver.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/IPC/Driver/Files.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Tools/Tiny.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Util.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Util/ExternalMeta.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Util/Facets2Legacy.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/modules/Util/Trace.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/regression/693_ipc_ordering.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/regression/746-forking-subtest.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/regression/gh_16.t Test file related to Test::Simple +cpan/Test-Simple/t/Test2/regression/ipc_files_abort_exit.t Test file related to Test::Simple cpan/Text-Balanced/lib/Text/Balanced.pm Text::Balanced cpan/Text-Balanced/t/01_compile.t See if Text::Balanced works cpan/Text-Balanced/t/02_extbrk.t See if Text::Balanced works @@ -2720,25 +2915,25 @@ cpan/Text-Tabs/t/undef.t cpan/Text-Tabs/t/wrap.t See if Text::Wrap::wrap works cpan/Text-Tabs/t/Wrap-JLB.t See if Text::Wrap::wrap works cpan/Text-Tabs/t/wrap_separator2.t See if Text::Wrap::wrap works -cpan/Tie-RefHash/lib/Tie/RefHash.pm Base class for tied hashes with references as keys -cpan/Tie-RefHash/t/rebless.t Test for Tie::RefHash with rebless -cpan/Tie-RefHash/t/refhash.t Test for Tie::RefHash and Tie::RefHash::Nestable -cpan/Tie-RefHash/t/storable.t Test for Tie::RefHash with storable -cpan/Tie-RefHash/t/threaded.t Test for Tie::RefHash with threads +cpan/Tie-RefHash/lib/Tie/RefHash.pm Base class for tied hashes with references as keys +cpan/Tie-RefHash/t/rebless.t Test for Tie::RefHash with rebless +cpan/Tie-RefHash/t/refhash.t Test for Tie::RefHash and Tie::RefHash::Nestable +cpan/Tie-RefHash/t/storable.t Test for Tie::RefHash with storable +cpan/Tie-RefHash/t/threaded.t Test for Tie::RefHash with threads cpan/Time-Local/lib/Time/Local.pm Reverse translation of localtime, gmtime cpan/Time-Local/t/Local.t See if Time::Local works -cpan/Time-Piece/Piece.pm Time::Piece extension -cpan/Time-Piece/Piece.xs Time::Piece extension -cpan/Time-Piece/Seconds.pm Time::Piece extension -cpan/Time-Piece/t/01base.t Test for Time::Piece -cpan/Time-Piece/t/02core.t Test for Time::Piece +cpan/Time-Piece/Piece.pm Time::Piece extension +cpan/Time-Piece/Piece.xs Time::Piece extension +cpan/Time-Piece/Seconds.pm Time::Piece extension +cpan/Time-Piece/t/01base.t Test for Time::Piece +cpan/Time-Piece/t/02core.t Test for Time::Piece cpan/Time-Piece/t/02core_dst.t -cpan/Time-Piece/t/03compare.t Test for Time::Piece -cpan/Time-Piece/t/04mjd.t Test for Time::Piece -cpan/Time-Piece/t/05overload.t Test for Time::Piece +cpan/Time-Piece/t/03compare.t Test for Time::Piece +cpan/Time-Piece/t/04mjd.t Test for Time::Piece +cpan/Time-Piece/t/05overload.t Test for Time::Piece cpan/Time-Piece/t/06large.t -cpan/Time-Piece/t/06subclass.t Test for Time::Piece -cpan/Time-Piece/t/07arith.t Test for Time::Piece +cpan/Time-Piece/t/06subclass.t Test for Time::Piece +cpan/Time-Piece/t/07arith.t Test for Time::Piece cpan/Time-Piece/t/08truncate.t cpan/Time-Piece/t/09locales.t cpan/Time-Piece/t/10overload.t @@ -2747,112 +2942,112 @@ cpan/Time-Piece/t/lib/Time/Piece/Twin.pm cpan/Unicode-Collate/Collate.pm Unicode::Collate cpan/Unicode-Collate/Collate.xs Unicode::Collate cpan/Unicode-Collate/Collate/allkeys.txt Unicode::Collate -cpan/Unicode-Collate/Collate/CJK/Big5.pm Unicode::Collate -cpan/Unicode-Collate/Collate/CJK/GB2312.pm Unicode::Collate -cpan/Unicode-Collate/Collate/CJK/JISX0208.pm Unicode::Collate -cpan/Unicode-Collate/Collate/CJK/Korean.pm Unicode::Collate -cpan/Unicode-Collate/Collate/CJK/Pinyin.pm Unicode::Collate -cpan/Unicode-Collate/Collate/CJK/Stroke.pm Unicode::Collate +cpan/Unicode-Collate/Collate/CJK/Big5.pm Unicode::Collate +cpan/Unicode-Collate/Collate/CJK/GB2312.pm Unicode::Collate +cpan/Unicode-Collate/Collate/CJK/JISX0208.pm Unicode::Collate +cpan/Unicode-Collate/Collate/CJK/Korean.pm Unicode::Collate +cpan/Unicode-Collate/Collate/CJK/Pinyin.pm Unicode::Collate +cpan/Unicode-Collate/Collate/CJK/Stroke.pm Unicode::Collate cpan/Unicode-Collate/Collate/CJK/Zhuyin.pm cpan/Unicode-Collate/Collate/keys.txt Unicode::Collate -cpan/Unicode-Collate/Collate/Locale.pm Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/af.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/ar.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale.pm Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/af.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/ar.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/as.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/az.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/az.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/be.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/bn.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/ca.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/cs.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/bn.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/ca.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/cs.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/cu.pl -cpan/Unicode-Collate/Collate/Locale/cy.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/da.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/de_at_ph.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/de_phone.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/cy.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/da.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/de_at_ph.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/de_phone.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/dsb.pl cpan/Unicode-Collate/Collate/Locale/ee.pl -cpan/Unicode-Collate/Collate/Locale/eo.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/es.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/es_trad.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/et.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/eo.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/es.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/es_trad.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/et.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/fa.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/fi.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/fi.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/fi_phone.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/fil.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/fo.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/fr_ca.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/fil.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/fo.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/fr_ca.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/gu.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/ha.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/haw.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/ha.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/haw.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/he.pl cpan/Unicode-Collate/Collate/Locale/hi.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/hr.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/hu.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/hy.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/ig.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/is.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/ja.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/kk.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/kl.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/hr.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/hu.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/hy.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/ig.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/is.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/ja.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/kk.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/kl.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/kn.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/ko.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/ko.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/kok.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/lkt.pl cpan/Unicode-Collate/Collate/Locale/ln.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/lt.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/lv.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/lt.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/lv.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/mk.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/ml.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/mr.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/mt.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/nb.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/nn.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/nso.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/om.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/mt.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/nb.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/nn.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/nso.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/om.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/or.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/pa.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/pl.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/ro.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/sa.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/se.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/pl.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/ro.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/sa.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/se.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/si.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/si_dict.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/sk.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/sl.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/sq.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/sk.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/sl.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/sq.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/sr.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/sv.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/sv.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/sv_refo.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/ta.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/te.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/th.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/tn.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/to.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/tr.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/ug_cyrl.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/uk.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/tn.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/to.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/tr.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/ug_cyrl.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/uk.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/ur.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/vi.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/vi.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/vo.pl cpan/Unicode-Collate/Collate/Locale/wae.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/wo.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/yo.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/zh.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/zh_big5.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/zh_gb.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/zh_pin.pl Unicode::Collate -cpan/Unicode-Collate/Collate/Locale/zh_strk.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/wo.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/yo.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/zh.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/zh_big5.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/zh_gb.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/zh_pin.pl Unicode::Collate +cpan/Unicode-Collate/Collate/Locale/zh_strk.pl Unicode::Collate cpan/Unicode-Collate/Collate/Locale/zh_zhu.pl -cpan/Unicode-Collate/Makefile.PL Unicode::Collate +cpan/Unicode-Collate/Makefile.PL Unicode::Collate cpan/Unicode-Collate/mkheader Unicode::Collate cpan/Unicode-Collate/t/altern.t Unicode::Collate -cpan/Unicode-Collate/t/backwds.t Unicode::Collate -cpan/Unicode-Collate/t/cjk_b5.t Unicode::Collate -cpan/Unicode-Collate/t/cjk_gb.t Unicode::Collate -cpan/Unicode-Collate/t/cjk_ja.t Unicode::Collate -cpan/Unicode-Collate/t/cjk_ko.t Unicode::Collate -cpan/Unicode-Collate/t/cjk_py.t Unicode::Collate -cpan/Unicode-Collate/t/cjk_st.t Unicode::Collate +cpan/Unicode-Collate/t/backwds.t Unicode::Collate +cpan/Unicode-Collate/t/cjk_b5.t Unicode::Collate +cpan/Unicode-Collate/t/cjk_gb.t Unicode::Collate +cpan/Unicode-Collate/t/cjk_ja.t Unicode::Collate +cpan/Unicode-Collate/t/cjk_ko.t Unicode::Collate +cpan/Unicode-Collate/t/cjk_py.t Unicode::Collate +cpan/Unicode-Collate/t/cjk_st.t Unicode::Collate cpan/Unicode-Collate/t/cjk_zy.t cpan/Unicode-Collate/t/cjkrange.t Unicode::Collate cpan/Unicode-Collate/t/compatui.t Unicode::Collate @@ -2861,7 +3056,7 @@ cpan/Unicode-Collate/t/default.t Unicod cpan/Unicode-Collate/t/hangtype.t Unicode::Collate cpan/Unicode-Collate/t/hangul.t Unicode::Collate cpan/Unicode-Collate/t/ident.t -cpan/Unicode-Collate/t/iglevel2.t Unicode::Collate +cpan/Unicode-Collate/t/iglevel2.t Unicode::Collate cpan/Unicode-Collate/t/ignor.t Unicode::Collate cpan/Unicode-Collate/t/illegal.t Unicode::Collate cpan/Unicode-Collate/t/illegalp.t Unicode::Collate @@ -2869,12 +3064,12 @@ cpan/Unicode-Collate/t/index.t Unicode cpan/Unicode-Collate/t/khitan.t Unicode::Collate cpan/Unicode-Collate/t/loc_af.t Unicode::Collate cpan/Unicode-Collate/t/loc_ar.t Unicode::Collate -cpan/Unicode-Collate/t/loc_as.t Unicode::Collate +cpan/Unicode-Collate/t/loc_as.t Unicode::Collate cpan/Unicode-Collate/t/loc_az.t Unicode::Collate cpan/Unicode-Collate/t/loc_be.t Unicode::Collate cpan/Unicode-Collate/t/loc_bg.t Unicode::Collate -cpan/Unicode-Collate/t/loc_bn.t Unicode::Collate -cpan/Unicode-Collate/t/loc_bs.t Unicode::Collate +cpan/Unicode-Collate/t/loc_bn.t Unicode::Collate +cpan/Unicode-Collate/t/loc_bs.t Unicode::Collate cpan/Unicode-Collate/t/loc_bscy.t cpan/Unicode-Collate/t/loc_ca.t Unicode::Collate cpan/Unicode-Collate/t/loc_cjk.t Unicode::Collate @@ -2882,94 +3077,94 @@ cpan/Unicode-Collate/t/loc_cjkc.t Unico cpan/Unicode-Collate/t/loc_cs.t Unicode::Collate cpan/Unicode-Collate/t/loc_cu.t cpan/Unicode-Collate/t/loc_cy.t Unicode::Collate -cpan/Unicode-Collate/t/loc_cyrl.t Unicode::Collate +cpan/Unicode-Collate/t/loc_cyrl.t Unicode::Collate cpan/Unicode-Collate/t/loc_da.t Unicode::Collate cpan/Unicode-Collate/t/loc_de.t Unicode::Collate -cpan/Unicode-Collate/t/loc_deat.t Unicode::Collate -cpan/Unicode-Collate/t/loc_deph.t Unicode::Collate +cpan/Unicode-Collate/t/loc_deat.t Unicode::Collate +cpan/Unicode-Collate/t/loc_deph.t Unicode::Collate cpan/Unicode-Collate/t/loc_dsb.t cpan/Unicode-Collate/t/loc_ee.t cpan/Unicode-Collate/t/loc_eo.t Unicode::Collate cpan/Unicode-Collate/t/loc_es.t Unicode::Collate -cpan/Unicode-Collate/t/loc_estr.t Unicode::Collate +cpan/Unicode-Collate/t/loc_estr.t Unicode::Collate cpan/Unicode-Collate/t/loc_et.t Unicode::Collate -cpan/Unicode-Collate/t/loc_fa.t Unicode::Collate +cpan/Unicode-Collate/t/loc_fa.t Unicode::Collate cpan/Unicode-Collate/t/loc_fi.t Unicode::Collate -cpan/Unicode-Collate/t/loc_fil.t Unicode::Collate -cpan/Unicode-Collate/t/loc_fiph.t Unicode::Collate +cpan/Unicode-Collate/t/loc_fil.t Unicode::Collate +cpan/Unicode-Collate/t/loc_fiph.t Unicode::Collate cpan/Unicode-Collate/t/loc_fo.t Unicode::Collate cpan/Unicode-Collate/t/loc_fr.t Unicode::Collate cpan/Unicode-Collate/t/loc_frca.t Unicode::Collate -cpan/Unicode-Collate/t/loc_gu.t Unicode::Collate +cpan/Unicode-Collate/t/loc_gu.t Unicode::Collate cpan/Unicode-Collate/t/loc_ha.t Unicode::Collate -cpan/Unicode-Collate/t/loc_haw.t Unicode::Collate +cpan/Unicode-Collate/t/loc_haw.t Unicode::Collate cpan/Unicode-Collate/t/loc_he.t -cpan/Unicode-Collate/t/loc_hi.t Unicode::Collate +cpan/Unicode-Collate/t/loc_hi.t Unicode::Collate cpan/Unicode-Collate/t/loc_hr.t Unicode::Collate cpan/Unicode-Collate/t/loc_hu.t Unicode::Collate cpan/Unicode-Collate/t/loc_hy.t Unicode::Collate cpan/Unicode-Collate/t/loc_ig.t Unicode::Collate cpan/Unicode-Collate/t/loc_is.t Unicode::Collate cpan/Unicode-Collate/t/loc_ja.t Unicode::Collate -cpan/Unicode-Collate/t/loc_jait.t Unicode::Collate -cpan/Unicode-Collate/t/loc_japr.t Unicode::Collate +cpan/Unicode-Collate/t/loc_jait.t Unicode::Collate +cpan/Unicode-Collate/t/loc_japr.t Unicode::Collate cpan/Unicode-Collate/t/loc_kk.t Unicode::Collate cpan/Unicode-Collate/t/loc_kl.t Unicode::Collate -cpan/Unicode-Collate/t/loc_kn.t Unicode::Collate +cpan/Unicode-Collate/t/loc_kn.t Unicode::Collate cpan/Unicode-Collate/t/loc_ko.t Unicode::Collate -cpan/Unicode-Collate/t/loc_kok.t Unicode::Collate +cpan/Unicode-Collate/t/loc_kok.t Unicode::Collate cpan/Unicode-Collate/t/loc_lkt.t -cpan/Unicode-Collate/t/loc_ln.t Unicode::Collate +cpan/Unicode-Collate/t/loc_ln.t Unicode::Collate cpan/Unicode-Collate/t/loc_lt.t Unicode::Collate cpan/Unicode-Collate/t/loc_lv.t Unicode::Collate cpan/Unicode-Collate/t/loc_mk.t Unicode::Collate -cpan/Unicode-Collate/t/loc_ml.t Unicode::Collate +cpan/Unicode-Collate/t/loc_ml.t Unicode::Collate cpan/Unicode-Collate/t/loc_mncy.t Unicode::Collate -cpan/Unicode-Collate/t/loc_mr.t Unicode::Collate +cpan/Unicode-Collate/t/loc_mr.t Unicode::Collate cpan/Unicode-Collate/t/loc_mt.t Unicode::Collate cpan/Unicode-Collate/t/loc_nb.t Unicode::Collate cpan/Unicode-Collate/t/loc_nn.t Unicode::Collate -cpan/Unicode-Collate/t/loc_nso.t Unicode::Collate +cpan/Unicode-Collate/t/loc_nso.t Unicode::Collate cpan/Unicode-Collate/t/loc_om.t Unicode::Collate -cpan/Unicode-Collate/t/loc_or.t Unicode::Collate -cpan/Unicode-Collate/t/loc_pa.t Unicode::Collate +cpan/Unicode-Collate/t/loc_or.t Unicode::Collate +cpan/Unicode-Collate/t/loc_pa.t Unicode::Collate cpan/Unicode-Collate/t/loc_pl.t Unicode::Collate cpan/Unicode-Collate/t/loc_ro.t Unicode::Collate cpan/Unicode-Collate/t/loc_ru.t Unicode::Collate -cpan/Unicode-Collate/t/loc_sa.t Unicode::Collate +cpan/Unicode-Collate/t/loc_sa.t Unicode::Collate cpan/Unicode-Collate/t/loc_se.t Unicode::Collate -cpan/Unicode-Collate/t/loc_si.t Unicode::Collate -cpan/Unicode-Collate/t/loc_sidt.t Unicode::Collate +cpan/Unicode-Collate/t/loc_si.t Unicode::Collate +cpan/Unicode-Collate/t/loc_sidt.t Unicode::Collate cpan/Unicode-Collate/t/loc_sk.t Unicode::Collate cpan/Unicode-Collate/t/loc_sl.t Unicode::Collate cpan/Unicode-Collate/t/loc_sq.t Unicode::Collate cpan/Unicode-Collate/t/loc_sr.t Unicode::Collate -cpan/Unicode-Collate/t/loc_srla.t Unicode::Collate +cpan/Unicode-Collate/t/loc_srla.t Unicode::Collate cpan/Unicode-Collate/t/loc_sv.t Unicode::Collate -cpan/Unicode-Collate/t/loc_svrf.t Unicode::Collate +cpan/Unicode-Collate/t/loc_svrf.t Unicode::Collate cpan/Unicode-Collate/t/loc_sw.t Unicode::Collate -cpan/Unicode-Collate/t/loc_ta.t Unicode::Collate -cpan/Unicode-Collate/t/loc_te.t Unicode::Collate -cpan/Unicode-Collate/t/loc_test.t Unicode::Collate -cpan/Unicode-Collate/t/loc_th.t Unicode::Collate +cpan/Unicode-Collate/t/loc_ta.t Unicode::Collate +cpan/Unicode-Collate/t/loc_te.t Unicode::Collate +cpan/Unicode-Collate/t/loc_test.t Unicode::Collate +cpan/Unicode-Collate/t/loc_th.t Unicode::Collate cpan/Unicode-Collate/t/loc_tn.t Unicode::Collate cpan/Unicode-Collate/t/loc_to.t Unicode::Collate cpan/Unicode-Collate/t/loc_tr.t Unicode::Collate cpan/Unicode-Collate/t/loc_ugcy.t Unicode::Collate cpan/Unicode-Collate/t/loc_uk.t Unicode::Collate -cpan/Unicode-Collate/t/loc_ur.t Unicode::Collate +cpan/Unicode-Collate/t/loc_ur.t Unicode::Collate cpan/Unicode-Collate/t/loc_vi.t Unicode::Collate cpan/Unicode-Collate/t/loc_vo.t -cpan/Unicode-Collate/t/loc_wae.t Unicode::Collate +cpan/Unicode-Collate/t/loc_wae.t Unicode::Collate cpan/Unicode-Collate/t/loc_wo.t Unicode::Collate cpan/Unicode-Collate/t/loc_yo.t Unicode::Collate cpan/Unicode-Collate/t/loc_zh.t Unicode::Collate -cpan/Unicode-Collate/t/loc_zhb5.t Unicode::Collate -cpan/Unicode-Collate/t/loc_zhgb.t Unicode::Collate -cpan/Unicode-Collate/t/loc_zhpy.t Unicode::Collate -cpan/Unicode-Collate/t/loc_zhst.t Unicode::Collate +cpan/Unicode-Collate/t/loc_zhb5.t Unicode::Collate +cpan/Unicode-Collate/t/loc_zhgb.t Unicode::Collate +cpan/Unicode-Collate/t/loc_zhpy.t Unicode::Collate +cpan/Unicode-Collate/t/loc_zhst.t Unicode::Collate cpan/Unicode-Collate/t/loc_zhzy.t -cpan/Unicode-Collate/t/nonchar.t Unicode::Collate +cpan/Unicode-Collate/t/nonchar.t Unicode::Collate cpan/Unicode-Collate/t/normal.t Unicode::Collate cpan/Unicode-Collate/t/notable.t cpan/Unicode-Collate/t/nushu.t @@ -2977,7 +3172,7 @@ cpan/Unicode-Collate/t/overcjk0.t Unico cpan/Unicode-Collate/t/overcjk1.t Unicode::Collate cpan/Unicode-Collate/t/override.t Unicode::Collate cpan/Unicode-Collate/t/rearrang.t Unicode::Collate -cpan/Unicode-Collate/t/rewrite.t Unicode::Collate +cpan/Unicode-Collate/t/rewrite.t Unicode::Collate cpan/Unicode-Collate/t/tangut.t cpan/Unicode-Collate/t/test.t Unicode::Collate cpan/Unicode-Collate/t/trailwt.t Unicode::Collate @@ -3019,34 +3214,32 @@ cpan/Win32/t/Privileges.t cpan/Win32/t/Unicode.t See if Win32 extension works cpan/Win32/Win32.pm Win32 extension Perl module cpan/Win32/Win32.xs Win32 extension external subroutines -cpan/Win32API-File/buffers.h Win32API::File extension -cpan/Win32API-File/cFile.h Win32API::File extension -cpan/Win32API-File/cFile.pc Win32API::File extension -cpan/Win32API-File/const2perl.h Win32API::File extension -cpan/Win32API-File/File.pm Win32API::File extension -cpan/Win32API-File/File.xs Win32API::File extension +cpan/Win32API-File/buffers.h Win32API::File extension +cpan/Win32API-File/cFile.h Win32API::File extension +cpan/Win32API-File/cFile.pc Win32API::File extension +cpan/Win32API-File/const2perl.h Win32API::File extension +cpan/Win32API-File/File.pm Win32API::File extension +cpan/Win32API-File/File.xs Win32API::File extension cpan/Win32API-File/inc/ExtUtils/Myconst2perl.pm Win32API::File extension -cpan/Win32API-File/Makefile.PL Win32API::File extension makefile write -cpan/Win32API-File/t/file.t See if Win32API::File extension works -cpan/Win32API-File/t/tie.t See if Win32API::File extension works -cpan/Win32API-File/typemap Win32API::File extension interface types -Cross/build-arm-n770-sh Cross-compilation -Cross/cflags-cross-arm Cross-compilation -Cross/config Cross-compilation -Cross/config.sh-arm-linux Cross-compilation -Cross/config.sh-arm-linux-n770 Cross-compilation -Cross/generate_config_sh Cross-compilation -Cross/installperl.patch Cross-compilation -Cross/Makefile Cross-compilation -Cross/Makefile-cross-SH Cross-compilation -Cross/Makefile.SH.patch Cross-compilation -Cross/README Cross-compilation -Cross/README.new Cross-compilation -Cross/TODO Cross-compilation -Cross/warp Cross-compilation -cv.h Code value header -cygwin/cygwin.c Additional code for Cygwin port -deb.c Debugging routines +cpan/Win32API-File/Makefile.PL Win32API::File extension makefile write +cpan/Win32API-File/t/file.t See if Win32API::File extension works +cpan/Win32API-File/t/tie.t See if Win32API::File extension works +cpan/Win32API-File/typemap Win32API::File extension interface types +Cross/build-arm-n770-sh Cross-compilation +Cross/cflags-cross-arm Cross-compilation +Cross/config Cross-compilation +Cross/config.sh-arm-linux Cross-compilation +Cross/config.sh-arm-linux-n770 Cross-compilation +Cross/generate_config_sh Cross-compilation +Cross/installperl.patch Cross-compilation +Cross/Makefile Cross-compilation +Cross/Makefile-cross-SH Cross-compilation +Cross/Makefile.SH.patch Cross-compilation +Cross/README Cross-compilation +Cross/README.new Cross-compilation +Cross/TODO Cross-compilation +Cross/warp Cross-compilation +cygwin/cygwin.c Additional code for Cygwin port dist/Attribute-Handlers/Changes Attribute::Handlers dist/Attribute-Handlers/demo/demo.pl Attribute::Handlers demo dist/Attribute-Handlers/demo/Demo.pm Attribute::Handlers demo @@ -3063,6 +3256,7 @@ dist/Attribute-Handlers/demo/demo_rawdat dist/Attribute-Handlers/demo/Descriptions.pm Attribute::Handlers demo dist/Attribute-Handlers/demo/MyClass.pm Attribute::Handlers demo dist/Attribute-Handlers/lib/Attribute/Handlers.pm Attribute::Handlers +dist/Attribute-Handlers/Makefile.PL Attribute::Handlers dist/Attribute-Handlers/t/caller.t See if Attribute::Handlers works dist/Attribute-Handlers/t/constants.t Test constants and Attribute::Handlers dist/Attribute-Handlers/t/data_convert.t Test attribute data conversion @@ -3072,316 +3266,318 @@ dist/autouse/lib/autouse.pm Load and ca dist/autouse/t/autouse.t See if autouse works dist/autouse/t/lib/MyTestModule.pm Test module for autouse dist/autouse/t/lib/MyTestModule2.pm Test module for autouse -dist/base/Changes base.pm changelog -dist/base/lib/base.pm Establish IS-A relationship at compile time -dist/base/lib/fields.pm Set up object field names for pseudo-hash-using classes -dist/base/Makefile.PL base.pm Makefile.PL -dist/base/t/base.t See if base works -dist/base/t/base-open-chunk.t See if base works -dist/base/t/base-open-line.t See if base works -dist/base/t/compile-time.t See if base works -dist/base/t/core-global.t See if base works around CORE::GLOBAL::require -dist/base/t/fields.t See if fields work -dist/base/t/fields-5_6_0.t See if fields work -dist/base/t/fields-5_8_0.t See if fields work -dist/base/t/fields-base.t See if fields work -dist/base/t/incdot.t Test how base.pm handles '.' in @INC -dist/base/t/isa.t See if base's behaviour doesn't change +dist/base/Changes base.pm changelog +dist/base/lib/base.pm Establish IS-A relationship at compile time +dist/base/lib/fields.pm Set up object field names for pseudo-hash-using classes +dist/base/Makefile.PL base.pm Makefile.PL +dist/base/t/base.t See if base works +dist/base/t/base-open-chunk.t See if base works +dist/base/t/base-open-line.t See if base works +dist/base/t/compile-time.t See if base works +dist/base/t/core-global.t See if base works around CORE::GLOBAL::require +dist/base/t/fields.t See if fields work +dist/base/t/fields-5_6_0.t See if fields work +dist/base/t/fields-5_8_0.t See if fields work +dist/base/t/fields-base.t See if fields work +dist/base/t/incdot.t Test how base.pm handles '.' in @INC +dist/base/t/isa.t See if base's behaviour doesn't change dist/base/t/lib/BaseIncMandatory.pm Test module for base.pm dist/base/t/lib/BaseIncOptional.pm Test module for base.pm -dist/base/t/lib/Broken.pm Test module for base.pm -dist/base/t/lib/Dummy.pm Test module for base.pm -dist/base/t/lib/HasSigDie.pm Module for testing base.pm -dist/base/t/sigdie.t See if base works with SIGDIE -dist/base/t/version.t See if base works with versions -dist/base/t/warnings.t See if base works with warnings -dist/Carp/Changes Changelog for Carp's CPAN releases -dist/Carp/lib/Carp.pm Error message extension -dist/Carp/lib/Carp/Heavy.pm Error message retired workhorse -dist/Carp/Makefile.PL makefile writer for Carp -dist/Carp/README README for Carp's CPAN releases +dist/base/t/lib/Broken.pm Test module for base.pm +dist/base/t/lib/Dummy.pm Test module for base.pm +dist/base/t/lib/HasSigDie.pm Module for testing base.pm +dist/base/t/sigdie.t See if base works with SIGDIE +dist/base/t/version.t See if base works with versions +dist/base/t/warnings.t See if base works with warnings +dist/Carp/Changes Changelog for Carp's CPAN releases +dist/Carp/lib/Carp.pm Error message extension +dist/Carp/lib/Carp/Heavy.pm Error message retired workhorse +dist/Carp/Makefile.PL makefile writer for Carp +dist/Carp/README README for Carp's CPAN releases dist/Carp/t/arg_regexp.t See if Carp formats regexp args OK in stack traces dist/Carp/t/arg_string.t See if Carp formats string args OK in stack traces -dist/Carp/t/baduni.t See if Carp handles non-char Unicode +dist/Carp/t/baduni.t See if Carp handles non-char Unicode dist/Carp/t/baduni_warnings.t See if Carp handles non-char Unicode when loaded via warnings.pm -dist/Carp/t/broken_can.t Test Carp with bad can implementations -dist/Carp/t/broken_univ_can.t Test Carp with bad UNIVERSAL::can -dist/Carp/t/Carp.t See if Carp works +dist/Carp/t/broken_can.t Test Carp with bad can implementations +dist/Carp/t/broken_univ_can.t Test Carp with bad UNIVERSAL::can +dist/Carp/t/Carp.t See if Carp works dist/Carp/t/Carp_overload.t See if Carp handles overloads dist/Carp/t/Carp_overloadless.t See if Carp handles overloads that dont use overload.pm -dist/Carp/t/errno.t See if Carp preserves $! and $^E -dist/Carp/t/heavy.t See if Carp::Heavy works +dist/Carp/t/errno.t See if Carp preserves $! and $^E +dist/Carp/t/heavy.t See if Carp::Heavy works dist/Carp/t/heavy_mismatch.t See if Carp::Heavy catches version mismatch -dist/Carp/t/stack_after_err.t Test stack traces after syntax errors +dist/Carp/t/stack_after_err.t Test stack traces after syntax errors dist/Carp/t/stash_deletion.t See if Carp handles stash deletion -dist/Carp/t/swash.t See if Carp avoids breaking swash loading -dist/Carp/t/vivify_gv.t See if Carp leaves utf8:: stuff alone +dist/Carp/t/swash.t See if Carp avoids breaking swash loading +dist/Carp/t/vivify_gv.t See if Carp leaves utf8:: stuff alone dist/Carp/t/vivify_stash.t See if Carp leaves utf8:: stash alone dist/Carp/t/with_warnings.t See if Carp plays nicely with warnings -dist/constant/lib/constant.pm For "use constant" -dist/constant/t/constant.t See if compile-time constants work -dist/constant/t/utf8.t Test Unicode constants under utf8 pragma -dist/Data-Dumper/Changes Data pretty printer, changelog -dist/Data-Dumper/Dumper.pm Data pretty printer, module -dist/Data-Dumper/Dumper.xs Data pretty printer, externals -dist/Data-Dumper/Makefile.PL Data pretty printer, makefile writer -dist/Data-Dumper/t/bless.t See if Data::Dumper works -dist/Data-Dumper/t/bless_var_method.t See if Data::Dumper::Bless works -dist/Data-Dumper/t/bugs.t See if Data::Dumper works -dist/Data-Dumper/t/deparse.t See if Data::Dumper::Deparse works -dist/Data-Dumper/t/dumper.t See if Data::Dumper works -dist/Data-Dumper/t/dumpperl.t See if Data::Dumper::Dumpperl works -dist/Data-Dumper/t/freezer.t See if Data::Dumper::Freezer works -dist/Data-Dumper/t/freezer_useperl.t See if Data::Dumper works -dist/Data-Dumper/t/huge.t See if Data::Dumper works on huge inputs -dist/Data-Dumper/t/indent.t See if Data::Dumper::Indent works -dist/Data-Dumper/t/lib/Testing.pm Functions used in testing Data-Dumper -dist/Data-Dumper/t/misc.t Miscellaneous tests for Data-Dumper -dist/Data-Dumper/t/names.t See if Data::Dumper::Names works -dist/Data-Dumper/t/overload.t See if Data::Dumper works for overloaded data -dist/Data-Dumper/t/pair.t See if Data::Dumper pair separator works -dist/Data-Dumper/t/perl-74170.t Regression test for stack reallocation +dist/constant/Changes Changes for constant.pm +dist/constant/lib/constant.pm For "use constant" +dist/constant/Makefile.PL Build constant.pm (from the cpan release) +dist/constant/t/constant.t See if compile-time constants work +dist/constant/t/utf8.t Test Unicode constants under utf8 pragma +dist/Data-Dumper/Changes Data pretty printer, changelog +dist/Data-Dumper/Dumper.pm Data pretty printer, module +dist/Data-Dumper/Dumper.xs Data pretty printer, externals +dist/Data-Dumper/Makefile.PL Data pretty printer, makefile writer +dist/Data-Dumper/t/bless.t See if Data::Dumper works +dist/Data-Dumper/t/bless_var_method.t See if Data::Dumper::Bless works +dist/Data-Dumper/t/bugs.t See if Data::Dumper works +dist/Data-Dumper/t/deparse.t See if Data::Dumper::Deparse works +dist/Data-Dumper/t/dumper.t See if Data::Dumper works +dist/Data-Dumper/t/dumpperl.t See if Data::Dumper::Dumpperl works +dist/Data-Dumper/t/freezer.t See if Data::Dumper::Freezer works +dist/Data-Dumper/t/freezer_useperl.t See if Data::Dumper works +dist/Data-Dumper/t/huge.t See if Data::Dumper works on huge inputs +dist/Data-Dumper/t/indent.t See if Data::Dumper::Indent works +dist/Data-Dumper/t/lib/Testing.pm Functions used in testing Data-Dumper +dist/Data-Dumper/t/misc.t Miscellaneous tests for Data-Dumper +dist/Data-Dumper/t/names.t See if Data::Dumper::Names works +dist/Data-Dumper/t/overload.t See if Data::Dumper works for overloaded data +dist/Data-Dumper/t/pair.t See if Data::Dumper pair separator works +dist/Data-Dumper/t/perl-74170.t Regression test for stack reallocation dist/Data-Dumper/t/purity_deepcopy_maxdepth.t See if three Data::Dumper functions work -dist/Data-Dumper/t/qr.t See if Data::Dumper works with qr|/| -dist/Data-Dumper/t/quotekeys.t See if Data::Dumper::Quotekeys works -dist/Data-Dumper/t/recurse.t See if Data::Dumper::Maxrecurse works -dist/Data-Dumper/t/seen.t See if Data::Dumper::Seen works -dist/Data-Dumper/t/sortkeys.t See if Data::Dumper::Sortkeys works -dist/Data-Dumper/t/sparseseen.t See if Data::Dumper::Sparseseen works -dist/Data-Dumper/t/terse.t See if Data::Dumper terse option works -dist/Data-Dumper/t/toaster.t See if Data::Dumper::Toaster works -dist/Data-Dumper/t/trailing_comma.t See if Data::Dumper::Trailingcomma works -dist/Data-Dumper/t/values.t See if Data::Dumper::Values works -dist/Data-Dumper/Todo Data pretty printer, futures -dist/Devel-PPPort/apicheck_c.PL Devel::PPPort apicheck generator +dist/Data-Dumper/t/qr.t See if Data::Dumper works with qr|/| +dist/Data-Dumper/t/quotekeys.t See if Data::Dumper::Quotekeys works +dist/Data-Dumper/t/recurse.t See if Data::Dumper::Maxrecurse works +dist/Data-Dumper/t/seen.t See if Data::Dumper::Seen works +dist/Data-Dumper/t/sortkeys.t See if Data::Dumper::Sortkeys works +dist/Data-Dumper/t/sparseseen.t See if Data::Dumper::Sparseseen works +dist/Data-Dumper/t/terse.t See if Data::Dumper terse option works +dist/Data-Dumper/t/toaster.t See if Data::Dumper::Toaster works +dist/Data-Dumper/t/trailing_comma.t See if Data::Dumper::Trailingcomma works +dist/Data-Dumper/t/values.t See if Data::Dumper::Values works +dist/Data-Dumper/Todo Data pretty printer, futures +dist/Devel-PPPort/apicheck_c.PL Devel::PPPort apicheck generator dist/Devel-PPPort/Changes Devel::PPPort Changes file -dist/Devel-PPPort/devel/buildperl.pl Devel::PPPort perl version builder -dist/Devel-PPPort/devel/devtools.pl Devel::PPPort development utilities -dist/Devel-PPPort/devel/mkapidoc.pl Devel::PPPort apidoc collector -dist/Devel-PPPort/devel/mkppport_fnc.pl Devel::PPPort -dist/Devel-PPPort/devel/mktodo Devel::PPPort baseline/todo generator -dist/Devel-PPPort/devel/mktodo.pl Devel::PPPort baseline/todo generator -dist/Devel-PPPort/devel/regenerate Devel::PPPort API re-generator -dist/Devel-PPPort/devel/scanprov Devel::PPPort provided API scanner +dist/Devel-PPPort/devel/buildperl.pl Devel::PPPort perl version builder +dist/Devel-PPPort/devel/devtools.pl Devel::PPPort development utilities +dist/Devel-PPPort/devel/mkapidoc.pl Devel::PPPort apidoc collector +dist/Devel-PPPort/devel/mkppport_fnc.pl Devel::PPPort +dist/Devel-PPPort/devel/mktodo Devel::PPPort baseline/todo generator +dist/Devel-PPPort/devel/mktodo.pl Devel::PPPort baseline/todo generator +dist/Devel-PPPort/devel/regenerate Devel::PPPort API re-generator +dist/Devel-PPPort/devel/scanprov Devel::PPPort provided API scanner dist/Devel-PPPort/devel/update_release_date.pl Devel::PPPort timestamp builder -dist/Devel-PPPort/HACKERS Devel::PPPort hackers documentation -dist/Devel-PPPort/Makefile.PL Devel::PPPort makefile writer -dist/Devel-PPPort/MANIFEST.SKIP Devel::PPPort manifest skip file -dist/Devel-PPPort/mktests.PL Devel::PPPort test file writer -dist/Devel-PPPort/module2.c Devel::PPPort test file -dist/Devel-PPPort/module3.c Devel::PPPort test file -dist/Devel-PPPort/parts/apicheck.pl Devel::PPPort apicheck generator -dist/Devel-PPPort/parts/apidoc.fnc Devel::PPPort Perl API listing -dist/Devel-PPPort/parts/base/5003007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5004000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5004001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5004002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5004003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5004004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5004005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5005000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5005001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5005002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5005003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5005004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5006000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5006001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5006002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5007000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5007001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5007002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5007003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5008000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5008001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5008002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5008003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5008004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5008005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5008006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5008007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5008008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5008009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5009000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5009001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5009002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5009003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5009004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5009005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5010000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5010001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5011000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5011001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5011002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5011003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5011004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5011005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5012000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5012001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5012002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5012003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5012004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5012005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5013011 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5014000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5014001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5014002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5014003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5014004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5015000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5015001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5015002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5015003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5015004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5015005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5015006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5015007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5015008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5015009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5016000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5016001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5016002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5016003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5017011 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5018000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5018001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5018002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5018003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5018004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5019011 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5020000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5020001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5020002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5020003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5021011 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5022000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5022001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5022002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5022003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5022004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5023000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5023001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5023002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5023003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5023004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5023005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5023006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5023007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5023008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5023009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5024000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5024001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5024002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5024003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5024004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025011 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5025012 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5026000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5026001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5026002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5026003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5027011 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5028000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5028001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5028002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5028003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5029010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5030000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5030001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5030002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5030003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5031000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5031001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5031002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5031003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5031004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5031005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5031006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5031007 Devel::PPPort baseline todo file +dist/Devel-PPPort/HACKERS Devel::PPPort hackers documentation +dist/Devel-PPPort/Makefile.PL Devel::PPPort makefile writer +dist/Devel-PPPort/MANIFEST.SKIP Devel::PPPort manifest skip file +dist/Devel-PPPort/mktests.PL Devel::PPPort test file writer +dist/Devel-PPPort/module2.c Devel::PPPort test file +dist/Devel-PPPort/module3.c Devel::PPPort test file +dist/Devel-PPPort/parts/apicheck.pl Devel::PPPort apicheck generator +dist/Devel-PPPort/parts/apidoc.fnc Devel::PPPort Perl API listing +dist/Devel-PPPort/parts/base/5003007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5004000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5004001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5004002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5004003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5004004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5004005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5005000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5005001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5005002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5005003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5005004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5006000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5006001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5006002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5007000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5007001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5007002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5007003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5008000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5008001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5008002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5008003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5008004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5008005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5008006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5008007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5008008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5008009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5009000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5009001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5009002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5009003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5009004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5009005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5010000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5010001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5011000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5011001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5011002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5011003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5011004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5011005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5012000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5012001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5012002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5012003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5012004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5012005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5013011 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5014000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5014001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5014002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5014003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5014004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5015000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5015001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5015002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5015003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5015004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5015005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5015006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5015007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5015008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5015009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5016000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5016001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5016002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5016003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5017011 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5018000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5018001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5018002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5018003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5018004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5019011 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5020000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5020001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5020002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5020003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5021011 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5022000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5022001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5022002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5022003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5022004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5023000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5023001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5023002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5023003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5023004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5023005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5023006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5023007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5023008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5023009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5024000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5024001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5024002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5024003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5024004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025011 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5025012 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5026000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5026001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5026002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5026003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5027011 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5028000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5028001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5028002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5028003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5029010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5030000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5030001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5030002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5030003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031007 Devel::PPPort baseline todo file dist/Devel-PPPort/parts/base/5031008 -dist/Devel-PPPort/parts/base/5031009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5031010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5031011 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5032000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5031011 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5032000 Devel::PPPort baseline todo file dist/Devel-PPPort/parts/base/5032001 -dist/Devel-PPPort/parts/base/5033000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5033001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/base/5033002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5033000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5033001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/base/5033002 Devel::PPPort baseline todo file dist/Devel-PPPort/parts/base/5033003 dist/Devel-PPPort/parts/base/5033004 dist/Devel-PPPort/parts/base/5033005 @@ -3400,262 +3596,262 @@ dist/Devel-PPPort/parts/base/5035007 dist/Devel-PPPort/parts/base/5035008 dist/Devel-PPPort/parts/base/5035009 dist/Devel-PPPort/parts/base/5035010 -dist/Devel-PPPort/parts/embed.fnc Devel::PPPort Perl API listing -dist/Devel-PPPort/parts/inc/01_test Devel::PPPort include -dist/Devel-PPPort/parts/inc/call Devel::PPPort include -dist/Devel-PPPort/parts/inc/cop Devel::PPPort include -dist/Devel-PPPort/parts/inc/exception Devel::PPPort include -dist/Devel-PPPort/parts/inc/format Devel::PPPort include -dist/Devel-PPPort/parts/inc/grok Devel::PPPort include -dist/Devel-PPPort/parts/inc/gv Devel::PPPort include -dist/Devel-PPPort/parts/inc/HvNAME Devel::PPPort include +dist/Devel-PPPort/parts/embed.fnc Devel::PPPort Perl API listing +dist/Devel-PPPort/parts/inc/01_test Devel::PPPort include +dist/Devel-PPPort/parts/inc/call Devel::PPPort include +dist/Devel-PPPort/parts/inc/cop Devel::PPPort include +dist/Devel-PPPort/parts/inc/exception Devel::PPPort include +dist/Devel-PPPort/parts/inc/format Devel::PPPort include +dist/Devel-PPPort/parts/inc/grok Devel::PPPort include +dist/Devel-PPPort/parts/inc/gv Devel::PPPort include +dist/Devel-PPPort/parts/inc/HvNAME Devel::PPPort include dist/Devel-PPPort/parts/inc/inctools -dist/Devel-PPPort/parts/inc/limits Devel::PPPort include +dist/Devel-PPPort/parts/inc/limits Devel::PPPort include dist/Devel-PPPort/parts/inc/locale -dist/Devel-PPPort/parts/inc/magic Devel::PPPort include -dist/Devel-PPPort/parts/inc/magic_defs Devel::PPPort include -dist/Devel-PPPort/parts/inc/memory Devel::PPPort include -dist/Devel-PPPort/parts/inc/mess Devel::PPPort include -dist/Devel-PPPort/parts/inc/misc Devel::PPPort include -dist/Devel-PPPort/parts/inc/mPUSH Devel::PPPort include -dist/Devel-PPPort/parts/inc/MY_CXT Devel::PPPort include -dist/Devel-PPPort/parts/inc/newCONSTSUB Devel::PPPort include -dist/Devel-PPPort/parts/inc/newRV Devel::PPPort include -dist/Devel-PPPort/parts/inc/newSV_type Devel::PPPort include -dist/Devel-PPPort/parts/inc/newSVpv Devel::PPPort include -dist/Devel-PPPort/parts/inc/podtest Devel::PPPort include -dist/Devel-PPPort/parts/inc/ppphbin Devel::PPPort include -dist/Devel-PPPort/parts/inc/ppphdoc Devel::PPPort include -dist/Devel-PPPort/parts/inc/ppphtest Devel::PPPort include -dist/Devel-PPPort/parts/inc/pv_tools Devel::PPPort include -dist/Devel-PPPort/parts/inc/pvs Devel::PPPort include -dist/Devel-PPPort/parts/inc/shared_pv Devel::PPPort include -dist/Devel-PPPort/parts/inc/snprintf Devel::PPPort include -dist/Devel-PPPort/parts/inc/sprintf Devel::PPPort include -dist/Devel-PPPort/parts/inc/strlfuncs Devel::PPPort include +dist/Devel-PPPort/parts/inc/magic Devel::PPPort include +dist/Devel-PPPort/parts/inc/magic_defs Devel::PPPort include +dist/Devel-PPPort/parts/inc/memory Devel::PPPort include +dist/Devel-PPPort/parts/inc/mess Devel::PPPort include +dist/Devel-PPPort/parts/inc/misc Devel::PPPort include +dist/Devel-PPPort/parts/inc/mPUSH Devel::PPPort include +dist/Devel-PPPort/parts/inc/MY_CXT Devel::PPPort include +dist/Devel-PPPort/parts/inc/newCONSTSUB Devel::PPPort include +dist/Devel-PPPort/parts/inc/newRV Devel::PPPort include +dist/Devel-PPPort/parts/inc/newSV_type Devel::PPPort include +dist/Devel-PPPort/parts/inc/newSVpv Devel::PPPort include +dist/Devel-PPPort/parts/inc/podtest Devel::PPPort include +dist/Devel-PPPort/parts/inc/ppphbin Devel::PPPort include +dist/Devel-PPPort/parts/inc/ppphdoc Devel::PPPort include +dist/Devel-PPPort/parts/inc/ppphtest Devel::PPPort include +dist/Devel-PPPort/parts/inc/pv_tools Devel::PPPort include +dist/Devel-PPPort/parts/inc/pvs Devel::PPPort include +dist/Devel-PPPort/parts/inc/shared_pv Devel::PPPort include +dist/Devel-PPPort/parts/inc/snprintf Devel::PPPort include +dist/Devel-PPPort/parts/inc/sprintf Devel::PPPort include +dist/Devel-PPPort/parts/inc/strlfuncs Devel::PPPort include dist/Devel-PPPort/parts/inc/subparse -dist/Devel-PPPort/parts/inc/Sv_set Devel::PPPort include -dist/Devel-PPPort/parts/inc/sv_xpvf Devel::PPPort include -dist/Devel-PPPort/parts/inc/SvPV Devel::PPPort include -dist/Devel-PPPort/parts/inc/SvREFCNT Devel::PPPort include -dist/Devel-PPPort/parts/inc/threads Devel::PPPort include +dist/Devel-PPPort/parts/inc/Sv_set Devel::PPPort include +dist/Devel-PPPort/parts/inc/sv_xpvf Devel::PPPort include +dist/Devel-PPPort/parts/inc/SvPV Devel::PPPort include +dist/Devel-PPPort/parts/inc/SvREFCNT Devel::PPPort include +dist/Devel-PPPort/parts/inc/threads Devel::PPPort include dist/Devel-PPPort/parts/inc/utf8 -dist/Devel-PPPort/parts/inc/uv Devel::PPPort include -dist/Devel-PPPort/parts/inc/variables Devel::PPPort include -dist/Devel-PPPort/parts/inc/version Devel::PPPort include -dist/Devel-PPPort/parts/inc/warn Devel::PPPort include -dist/Devel-PPPort/parts/ppport.fnc Devel::PPPort API listing -dist/Devel-PPPort/parts/ppptools.pl Devel::PPPort various utilities -dist/Devel-PPPort/parts/todo/5003007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5004000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5004001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5004002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5004003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5004004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5004005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5005000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5005001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5005002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5005003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5005004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5006000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5006001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5006002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5007000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5007001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5007002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5007003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5008000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5008001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5008002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5008003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5008004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5008005 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5008006 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5008007 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5008008 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5008009 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5009000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5009001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5009002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5009003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5009004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5009005 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5010000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5010001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5011000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5011001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5011002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5011003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5011004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5011005 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5012000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5012001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5012002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5012003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5012004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5012005 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013005 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013006 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013007 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013008 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013009 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013010 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5013011 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5014000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5014001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5014002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5014003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5014004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5015000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5015001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5015002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5015003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5015004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5015005 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5015006 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5015007 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5015008 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5015009 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5016000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5016001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5016002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5016003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017005 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017006 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017007 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017008 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017009 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017010 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5017011 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5018000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5018001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5018002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5018003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5018004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019005 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019006 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019007 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019008 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019009 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019010 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5019011 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5020000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5020001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5020002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5020003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5021004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021005 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021006 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021007 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021008 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021009 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021010 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5021011 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5022000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5022001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5022002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5022003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5022004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5023000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5023001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5023002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5023003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5023004 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5023005 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5023006 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5023007 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5023008 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5023009 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5024000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5024001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5024002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5024003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5024004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025011 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5025012 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5026000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5026001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5026002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5026003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5027011 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5028000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5028001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5028002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5028003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5029000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5029001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5029002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5029003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5029004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5029005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5029006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5029007 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5029008 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5029009 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5029010 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5030000 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5030001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5030002 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5030003 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5031000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5031001 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5031002 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5031003 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5031004 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5031005 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5031006 Devel::PPPort baseline todo file -dist/Devel-PPPort/parts/todo/5031007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/inc/uv Devel::PPPort include +dist/Devel-PPPort/parts/inc/variables Devel::PPPort include +dist/Devel-PPPort/parts/inc/version Devel::PPPort include +dist/Devel-PPPort/parts/inc/warn Devel::PPPort include +dist/Devel-PPPort/parts/ppport.fnc Devel::PPPort API listing +dist/Devel-PPPort/parts/ppptools.pl Devel::PPPort various utilities +dist/Devel-PPPort/parts/todo/5003007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5004000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5004001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5004002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5004003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5004004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5004005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5005000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5005001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5005002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5005003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5005004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5006000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5006001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5006002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5007000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5007001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5007002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5007003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5008000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5008001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5008002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5008003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5008004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5008005 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5008006 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5008007 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5008008 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5008009 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5009000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5009001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5009002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5009003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5009004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5009005 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5010000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5010001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5011000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5011001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5011002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5011003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5011004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5011005 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5012000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5012001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5012002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5012003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5012004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5012005 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013005 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013006 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013007 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013008 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013009 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013010 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5013011 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5014000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5014001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5014002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5014003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5014004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5015000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5015001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5015002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5015003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5015004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5015005 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5015006 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5015007 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5015008 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5015009 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5016000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5016001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5016002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5016003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017005 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017006 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017007 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017008 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017009 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017010 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5017011 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5018000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5018001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5018002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5018003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5018004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019005 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019006 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019007 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019008 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019009 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019010 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5019011 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5020000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5020001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5020002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5020003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5021004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021005 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021006 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021007 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021008 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021009 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021010 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5021011 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5022000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5022001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5022002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5022003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5022004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5023000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5023001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5023002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5023003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5023004 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5023005 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5023006 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5023007 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5023008 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5023009 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5024000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5024001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5024002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5024003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5024004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025011 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5025012 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5026000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5026001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5026002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5026003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5027011 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5028000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5028001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5028002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5028003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5029000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5029001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5029002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5029003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5029004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5029005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5029006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5029007 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5029008 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5029009 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5029010 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5030000 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5030001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5030002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5030003 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5031000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5031001 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5031002 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5031003 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5031004 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5031005 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5031006 Devel::PPPort baseline todo file +dist/Devel-PPPort/parts/todo/5031007 Devel::PPPort baseline todo file dist/Devel-PPPort/parts/todo/5031008 -dist/Devel-PPPort/parts/todo/5031009 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5031010 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5031011 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5032000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5031009 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5031010 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5031011 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5032000 Devel::PPPort todo file dist/Devel-PPPort/parts/todo/5032001 -dist/Devel-PPPort/parts/todo/5033000 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5033001 Devel::PPPort todo file -dist/Devel-PPPort/parts/todo/5033002 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5033000 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5033001 Devel::PPPort todo file +dist/Devel-PPPort/parts/todo/5033002 Devel::PPPort todo file dist/Devel-PPPort/parts/todo/5033003 dist/Devel-PPPort/parts/todo/5033004 dist/Devel-PPPort/parts/todo/5033005 @@ -3674,57 +3870,61 @@ dist/Devel-PPPort/parts/todo/5035007 dist/Devel-PPPort/parts/todo/5035008 dist/Devel-PPPort/parts/todo/5035009 dist/Devel-PPPort/parts/todo/5035010 -dist/Devel-PPPort/PPPort.xs Devel::PPPort dummy PPPort.xs -dist/Devel-PPPort/ppport_h.PL Devel::PPPort ppport.h writer -dist/Devel-PPPort/PPPort_pm.PL Devel::PPPort PPPort.pm writer +dist/Devel-PPPort/PPPort.xs Devel::PPPort dummy PPPort.xs +dist/Devel-PPPort/ppport_h.PL Devel::PPPort ppport.h writer +dist/Devel-PPPort/PPPort_pm.PL Devel::PPPort PPPort.pm writer dist/Devel-PPPort/RealPPPort_xs.PL Devel::PPPort RealPPPort.xs writer -dist/Devel-PPPort/soak Devel::PPPort Test Harness to run under various Perls +dist/Devel-PPPort/soak Devel::PPPort Test Harness to run under various Perls dist/Devel-PPPort/t/testutil.pl Devel::PPPort test utilities -dist/Devel-PPPort/TODO Devel::PPPort developer notes -dist/Devel-PPPort/typemap Devel::PPPort Typemap +dist/Devel-PPPort/TODO Devel::PPPort developer notes +dist/Devel-PPPort/typemap Devel::PPPort Typemap dist/Devel-SelfStubber/lib/Devel/SelfStubber.pm Generate stubs for SelfLoader.pm dist/Devel-SelfStubber/t/Devel-SelfStubber.t See if Devel::SelfStubber works -dist/Dumpvalue/lib/Dumpvalue.pm Screen dump of perl values -dist/Dumpvalue/t/Dumpvalue.t See if Dumpvalue works +dist/Dumpvalue/lib/Dumpvalue.pm Screen dump of perl values +dist/Dumpvalue/t/Dumpvalue.t See if Dumpvalue works dist/Dumpvalue/t/extend-coverage.t Extend Dumpvalue's test coverage -dist/Dumpvalue/t/lib/TieOut.pm Helper module for Dumpvalue tests +dist/Dumpvalue/t/lib/TieOut.pm Helper module for Dumpvalue tests dist/Dumpvalue/t/rt-134441-dumpvalue.t See if Dumpvalue works +dist/encoding-warnings/Changes encoding::warnings dist/encoding-warnings/lib/encoding/warnings.pm warn on implicit encoding conversions -dist/encoding-warnings/t/1-warning.t tests for encoding::warnings -dist/encoding-warnings/t/2-fatal.t tests for encoding::warnings -dist/encoding-warnings/t/3-normal.t tests for encoding::warnings -dist/encoding-warnings/t/4-lexical.t tests for encoding::warnings -dist/Env/lib/Env.pm Map environment into ordinary variables -dist/Env/t/array.t See if Env works for arrays -dist/Env/t/env.t See if Env works +dist/encoding-warnings/Makefile.PL encoding::warnings +dist/encoding-warnings/t/1-warning.t tests for encoding::warnings +dist/encoding-warnings/t/2-fatal.t tests for encoding::warnings +dist/encoding-warnings/t/3-normal.t tests for encoding::warnings +dist/encoding-warnings/t/4-lexical.t tests for encoding::warnings +dist/Env/lib/Env.pm Map environment into ordinary variables +dist/Env/t/array.t See if Env works for arrays +dist/Env/t/env.t See if Env works +dist/Exporter/Changes History of changes for Exporter dist/Exporter/lib/Exporter.pm Exporter base class dist/Exporter/lib/Exporter/Heavy.pm Complicated routines for Exporter +dist/Exporter/Makefile.PL Build Exporter dist/Exporter/t/Exporter.t See if Exporter works dist/Exporter/t/warn.t See if Exporter respects warning handlers -dist/ExtUtils-CBuilder/Changes EU-CB change log -dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder.pm Compile and link C code for Perl modules -dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm Base class for ExtUtils::CBuilder methods -dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/aix.pm CBuilder methods for AIX +dist/ExtUtils-CBuilder/Changes EU-CB change log +dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder.pm Compile and link C code for Perl modules +dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm Base class for ExtUtils::CBuilder methods +dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/aix.pm CBuilder methods for AIX dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/android.pm CBuilder methods for Android -dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/cygwin.pm CBuilder methods for cygwin -dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/darwin.pm CBuilder methods for darwin +dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/cygwin.pm CBuilder methods for cygwin +dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/darwin.pm CBuilder methods for darwin dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/dec_osf.pm CBuilder methods for OSF -dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/os2.pm CBuilder methods for OS/2 -dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Unix.pm CBuilder methods for Unix -dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/VMS.pm CBuilder methods for VMS +dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/os2.pm CBuilder methods for OS/2 +dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Unix.pm CBuilder methods for Unix +dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/VMS.pm CBuilder methods for VMS dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows.pm CBuilder methods for Windows dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm CBuilder methods for Windows dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm CBuilder methods for Windows dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm CBuilder methods for Windows -dist/ExtUtils-CBuilder/LICENSE EU-CB license -dist/ExtUtils-CBuilder/Makefile.PL EU-CB configuration script -dist/ExtUtils-CBuilder/README.patching EU-CB patching nstructions -dist/ExtUtils-CBuilder/README.release EU-CB release instructions -dist/ExtUtils-CBuilder/t/00-have-compiler.t ExtUtils::CBuilder tests -dist/ExtUtils-CBuilder/t/01-basic.t tests for ExtUtils::CBuilder -dist/ExtUtils-CBuilder/t/02-link.t tests for ExtUtils::CBuilder -dist/ExtUtils-CBuilder/t/03-cplusplus.t tests for ExtUtils::CBuilder -dist/ExtUtils-CBuilder/t/04-base.t tests for ExtUtils::CBuilder +dist/ExtUtils-CBuilder/LICENSE EU-CB license +dist/ExtUtils-CBuilder/Makefile.PL EU-CB configuration script +dist/ExtUtils-CBuilder/README.patching EU-CB patching nstructions +dist/ExtUtils-CBuilder/README.release EU-CB release instructions +dist/ExtUtils-CBuilder/t/00-have-compiler.t ExtUtils::CBuilder tests +dist/ExtUtils-CBuilder/t/01-basic.t tests for ExtUtils::CBuilder +dist/ExtUtils-CBuilder/t/02-link.t tests for ExtUtils::CBuilder +dist/ExtUtils-CBuilder/t/03-cplusplus.t tests for ExtUtils::CBuilder +dist/ExtUtils-CBuilder/t/04-base.t tests for ExtUtils::CBuilder dist/ExtUtils-ParseXS/Changes ExtUtils::ParseXS change log dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pm converts Perl XS code into C code dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS.pod ExtUtils::ParseXS documentation @@ -3782,15 +3982,22 @@ dist/ExtUtils-ParseXS/t/lib/PrimitiveCap dist/ExtUtils-ParseXS/t/lib/TypemapTest/Foo.pm ExtUtils::Typemaps tests dist/ExtUtils-ParseXS/t/pseudotypemap1 A test-typemap dist/ExtUtils-ParseXS/t/typemap Standard typemap for controlled testing +dist/ExtUtils-ParseXS/t/XSAlias.xs Test file for ExtUtils::ParseXS ALIAS tests dist/ExtUtils-ParseXS/t/XSBroken.xs Test file for ExtUtils::ParseXS tests +dist/ExtUtils-ParseXS/t/XSFalsePositive.xs Test file for ExtUtils::ParseXS tests +dist/ExtUtils-ParseXS/t/XSFalsePositive2.xs Test file for ExtUtils::ParseXS tests dist/ExtUtils-ParseXS/t/XSInclude.xsh Test file for ExtUtils::ParseXS tests dist/ExtUtils-ParseXS/t/XSMore.xs Test file for ExtUtils::ParseXS tests +dist/ExtUtils-ParseXS/t/XSNoMap.xs dist/ExtUtils-ParseXS/t/XSTest.pm Test file for ExtUtils::ParseXS tests dist/ExtUtils-ParseXS/t/XSTest.xs Test file for ExtUtils::ParseXS tests +dist/ExtUtils-ParseXS/t/XSTightDirectives.xs Test file for ExtUtils::ParseXS tests dist/ExtUtils-ParseXS/t/XSUsage.pm ExtUtils::ParseXS tests dist/ExtUtils-ParseXS/t/XSUsage.xs ExtUtils::ParseXS tests dist/ExtUtils-ParseXS/t/XSWarn.xs ExtUtils::ParseXS tests +dist/Filter-Simple/Changes History of change for Filter::Simple dist/Filter-Simple/lib/Filter/Simple.pm Simple frontend to Filter::Util::Call +dist/Filter-Simple/Makefile.PL Build Filter::Simple dist/Filter-Simple/t/code_no_comments.t See if Filter::Simple works dist/Filter-Simple/t/data.t See if Filter::Simple works dist/Filter-Simple/t/export.t See if Filter::Simple works @@ -3804,14 +4011,17 @@ dist/Filter-Simple/t/lib/Filter/Simple/F dist/Filter-Simple/t/lib/Filter/Simple/FilterTest.pm Helper file for Filter::Simple tests dist/Filter-Simple/t/lib/Filter/Simple/ImportTest.pm Helper file for Filter::Simple tests dist/Filter-Simple/t/no.t See if Filter::Simple works -dist/FindBin/lib/FindBin.pm Find name of currently executing program -dist/FindBin/t/FindBin.t See if FindBin works -dist/I18N-Collate/lib/I18N/Collate.pm Routines to do strxfrm-based collation -dist/I18N-Collate/t/I18N-Collate.t See if I18N::Collate works -dist/I18N-LangTags/ChangeLog I18N::LangTags +dist/FindBin/Changes Tracks changes made in blead +dist/FindBin/lib/FindBin.pm Find name of currently executing program +dist/FindBin/Makefile.PL Build FindBin +dist/FindBin/t/FindBin.t See if FindBin works +dist/I18N-Collate/lib/I18N/Collate.pm Routines to do strxfrm-based collation +dist/I18N-Collate/t/I18N-Collate.t See if I18N::Collate works +dist/I18N-LangTags/ChangeLog I18N::LangTags change history dist/I18N-LangTags/lib/I18N/LangTags.pm I18N::LangTags dist/I18N-LangTags/lib/I18N/LangTags/Detect.pm Detect language preferences dist/I18N-LangTags/lib/I18N/LangTags/List.pm List of tags for human languages +dist/I18N-LangTags/Makefile.PL Build I18N::LangTags dist/I18N-LangTags/README I18N::LangTags dist/I18N-LangTags/t/01_about_verbose.t See whether I18N::LangTags works dist/I18N-LangTags/t/05_main.t See whether I18N::LangTags works @@ -3821,59 +4031,60 @@ dist/I18N-LangTags/t/20_locales.t See w dist/I18N-LangTags/t/50_super.t See whether I18N::LangTags works dist/I18N-LangTags/t/55_supers_strict.t See whether I18N::LangTags works dist/I18N-LangTags/t/80_all_env.t See whether I18N::LangTags works -dist/if/Changes if perl module change log -dist/if/if.pm For "use if" -dist/if/MANIFEST MANIFEST for if.pm -dist/if/META.json META.json for if.pm -dist/if/META.yml META.json for if.pm -dist/if/t/if.t Tests for "use if" -dist/IO/ChangeLog IO perl module change log -dist/IO/hints/sco.pl Hint for IO for named architecture -dist/IO/IO.pm Top-level interface to IO::* classes -dist/IO/IO.xs IO extension external subroutines -dist/IO/lib/IO/Dir.pm IO directory reading package -dist/IO/lib/IO/File.pm IO file handle package -dist/IO/lib/IO/Handle.pm IO base handle package -dist/IO/lib/IO/Pipe.pm IO pipe package -dist/IO/lib/IO/Poll.pm IO system poll() interface -dist/IO/lib/IO/Seekable.pm IO methods for seekable handles -dist/IO/lib/IO/Select.pm IO system select() interface -dist/IO/lib/IO/Socket.pm IO socket handle package -dist/IO/lib/IO/Socket/INET.pm IO INET specific socket methods -dist/IO/lib/IO/Socket/UNIX.pm IO UNIX specific socket methods -dist/IO/Makefile.PL IO extension makefile writer -dist/IO/poll.c IO poll() emulation using select() -dist/IO/poll.h IO poll() emulation using select() -dist/IO/README IO extension maintenance notice -dist/IO/t/cachepropagate-tcp.t See if IO::Socket duplication works -dist/IO/t/cachepropagate-udp.t See if IO::Socket duplication works -dist/IO/t/cachepropagate-unix.t See if IO::Socket duplication works -dist/IO/t/gh17447.t Tests fix for #17447 -dist/IO/t/IO.t See if IO works -dist/IO/t/io_const.t See if constants from IO work -dist/IO/t/io_dir.t See if directory-related methods from IO work -dist/IO/t/io_dup.t See if dup()-related methods from IO work -dist/IO/t/io_file.t See if binmode()-related methods on IO::File work -dist/IO/t/io_file_export.t Test IO::File exports -dist/IO/t/io_getline.t Test getline and getlines -dist/IO/t/io_leak.t See if IO leaks SVs (only run in core) -dist/IO/t/io_linenum.t See if I/O line numbers are tracked correctly -dist/IO/t/io_multihomed.t See if INET sockets work with multi-homed hosts -dist/IO/t/io_pipe.t See if pipe()-related methods from IO work -dist/IO/t/io_poll.t See if poll()-related methods from IO work -dist/IO/t/io_sel.t See if select()-related methods from IO work -dist/IO/t/io_sock.t See if INET socket-related methods from IO work -dist/IO/t/io_sock_errstr.t See if socket constructors put error string in the right place -dist/IO/t/io_taint.t See if the untaint method from IO works -dist/IO/t/io_tell.t See if seek()/tell()-related methods from IO work -dist/IO/t/io_udp.t See if UDP socket-related methods from IO work -dist/IO/t/io_unix.t See if UNIX socket-related methods from IO work -dist/IO/t/io_utf8.t See if perlio opens work -dist/IO/t/io_utf8argv.t See if <> respects open pragma -dist/IO/t/io_xs.t See if XSUB methods from IO work -dist/lib/lib_pm.PL For "use lib", produces lib/lib.pm +dist/if/Changes if perl module change log +dist/if/if.pm For "use if" +dist/if/Makefile.PL Makefile.PL for if.pm +dist/if/MANIFEST MANIFEST for if.pm +dist/if/META.json META.json for if.pm +dist/if/META.yml META.json for if.pm +dist/if/t/if.t Tests for "use if" +dist/IO/ChangeLog IO perl module change log +dist/IO/hints/sco.pl Hint for IO for named architecture +dist/IO/IO.pm Top-level interface to IO::* classes +dist/IO/IO.xs IO extension external subroutines +dist/IO/lib/IO/Dir.pm IO directory reading package +dist/IO/lib/IO/File.pm IO file handle package +dist/IO/lib/IO/Handle.pm IO base handle package +dist/IO/lib/IO/Pipe.pm IO pipe package +dist/IO/lib/IO/Poll.pm IO system poll() interface +dist/IO/lib/IO/Seekable.pm IO methods for seekable handles +dist/IO/lib/IO/Select.pm IO system select() interface +dist/IO/lib/IO/Socket.pm IO socket handle package +dist/IO/lib/IO/Socket/INET.pm IO INET specific socket methods +dist/IO/lib/IO/Socket/UNIX.pm IO UNIX specific socket methods +dist/IO/Makefile.PL IO extension makefile writer +dist/IO/poll.c IO poll() emulation using select() +dist/IO/poll.h IO poll() emulation using select() +dist/IO/README IO extension maintenance notice +dist/IO/t/cachepropagate-tcp.t See if IO::Socket duplication works +dist/IO/t/cachepropagate-udp.t See if IO::Socket duplication works +dist/IO/t/cachepropagate-unix.t See if IO::Socket duplication works +dist/IO/t/gh17447.t Tests fix for #17447 +dist/IO/t/IO.t See if IO works +dist/IO/t/io_const.t See if constants from IO work +dist/IO/t/io_dir.t See if directory-related methods from IO work +dist/IO/t/io_dup.t See if dup()-related methods from IO work +dist/IO/t/io_file.t See if binmode()-related methods on IO::File work +dist/IO/t/io_file_export.t Test IO::File exports +dist/IO/t/io_getline.t Test getline and getlines +dist/IO/t/io_leak.t See if IO leaks SVs (only run in core) +dist/IO/t/io_linenum.t See if I/O line numbers are tracked correctly +dist/IO/t/io_multihomed.t See if INET sockets work with multi-homed hosts +dist/IO/t/io_pipe.t See if pipe()-related methods from IO work +dist/IO/t/io_poll.t See if poll()-related methods from IO work +dist/IO/t/io_sel.t See if select()-related methods from IO work +dist/IO/t/io_sock.t See if INET socket-related methods from IO work +dist/IO/t/io_sock_errstr.t See if socket constructors put error string in the right place +dist/IO/t/io_taint.t See if the untaint method from IO works +dist/IO/t/io_tell.t See if seek()/tell()-related methods from IO work +dist/IO/t/io_udp.t See if UDP socket-related methods from IO work +dist/IO/t/io_unix.t See if UNIX socket-related methods from IO work +dist/IO/t/io_utf8.t See if perlio opens work +dist/IO/t/io_utf8argv.t See if <> respects open pragma +dist/IO/t/io_xs.t See if XSUB methods from IO work +dist/lib/lib_pm.PL For "use lib", produces lib/lib.pm dist/lib/Makefile.PL -dist/lib/t/01lib.t For "use lib" testing +dist/lib/t/01lib.t For "use lib" testing dist/Locale-Maketext/ChangeLog Locale::Maketext dist/Locale-Maketext/lib/Locale/Maketext.pm Locale::Maketext dist/Locale-Maketext/lib/Locale/Maketext.pod Locale::Maketext documentation @@ -3881,10 +4092,11 @@ dist/Locale-Maketext/lib/Locale/Maketext dist/Locale-Maketext/lib/Locale/Maketext/Guts.pm Locale::Maketext dist/Locale-Maketext/lib/Locale/Maketext/GutsLoader.pm Locale::Maketext dist/Locale-Maketext/lib/Locale/Maketext/TPJ13.pod Locale::Maketext documentation article +dist/Locale-Maketext/Makefile.PL Build Locale::Maketext dist/Locale-Maketext/README Locale::Maketext dist/Locale-Maketext/t/01_about_verbose.t See if Locale::Maketext works dist/Locale-Maketext/t/04_use_external_lex_cache.t See if Locale::Maketext works -dist/Locale-Maketext/t/09_compile.t Test Locale::Maketext::_compile +dist/Locale-Maketext/t/09_compile.t Test Locale::Maketext::_compile dist/Locale-Maketext/t/10_make.t See if Locale::Maketext works dist/Locale-Maketext/t/20_get.t See if Locale::Maketext works dist/Locale-Maketext/t/30_eval_dollar_at.t See if Locale::Maketext works @@ -3898,24 +4110,33 @@ dist/Locale-Maketext/t/92_blacklist.t dist/Locale-Maketext/t/93_whitelist.t See if Locale::Maketext works dist/Locale-Maketext/t/94_denylist.t See if Locale::Maketext works dist/Locale-Maketext/t/95_allowlist.t See if Locale::Maketext works -dist/Module-CoreList/Changes Module::CoreList Changes -dist/Module-CoreList/corelist The corelist command-line utility -dist/Module-CoreList/identify-dependencies A usage example for Module::CoreList -dist/Module-CoreList/lib/Module/CoreList.pm Module::CoreList -dist/Module-CoreList/lib/Module/CoreList.pod Module::CoreList +dist/Math-Complex/ChangeLog History of changes for Math::Complex +dist/Math-Complex/lib/Math/Complex.pm A package for doing math with complex numbers +dist/Math-Complex/lib/Math/Trig.pm A simple interface to complex trigonometry +dist/Math-Complex/Makefile.PL Build Math::Complex +dist/Math-Complex/t/Complex.t See if Math::Complex works +dist/Math-Complex/t/Trig.t See if Math::Trig works +dist/Math-Complex/t/underbar.t See if Math::Complex works +dist/Math-Complex/TODO TODO for Math::Complex +dist/Module-CoreList/Changes Module::CoreList Changes +dist/Module-CoreList/corelist The corelist command-line utility +dist/Module-CoreList/identify-dependencies A usage example for Module::CoreList +dist/Module-CoreList/lib/Module/CoreList.pm Module::CoreList +dist/Module-CoreList/lib/Module/CoreList.pod Module::CoreList dist/Module-CoreList/lib/Module/CoreList/Utils.pm Module::CoreList guts -dist/Module-CoreList/Makefile.PL Module::CoreList -dist/Module-CoreList/MANIFEST Module::CoreList -dist/Module-CoreList/README Module::CoreList -dist/Module-CoreList/t/corelist.t Module::CoreList tests -dist/Module-CoreList/t/deprecated.t Module::CoreList tests -dist/Module-CoreList/t/find_modules.t Module::CoreList tests -dist/Module-CoreList/t/is_core.t Module::CoreList tests +dist/Module-CoreList/Makefile.PL Module::CoreList +dist/Module-CoreList/MANIFEST Module::CoreList +dist/Module-CoreList/README Module::CoreList +dist/Module-CoreList/t/corelist.t Module::CoreList tests +dist/Module-CoreList/t/deprecated.t Module::CoreList tests +dist/Module-CoreList/t/find_modules.t Module::CoreList tests +dist/Module-CoreList/t/is_core.t Module::CoreList tests dist/Module-CoreList/t/maintainer.t Module::CoreList tests -dist/Module-CoreList/t/pod.t Module::CoreList tests -dist/Module-CoreList/t/utils.t Module::CoreList tests +dist/Module-CoreList/t/pod.t Module::CoreList tests +dist/Module-CoreList/t/utils.t Module::CoreList tests dist/Net-Ping/Changes Net::Ping dist/Net-Ping/lib/Net/Ping.pm Hello, anybody home? +dist/Net-Ping/Makefile.PL Build Net::Ping dist/Net-Ping/t/000_load.t dist/Net-Ping/t/001_new.t dist/Net-Ping/t/010_pingecho.t @@ -3924,7 +4145,7 @@ dist/Net-Ping/t/120_udp_inst.t Ping Net dist/Net-Ping/t/130_tcp_inst.t Ping Net::Ping dist/Net-Ping/t/140_stream_inst.t Ping Net::Ping dist/Net-Ping/t/150_syn_inst.t Ping Net::Ping -dist/Net-Ping/t/190_alarm.t Ping Net::Ping +dist/Net-Ping/t/190_alarm.t Ping Net::Ping dist/Net-Ping/t/200_ping_tcp.t Ping Net::Ping dist/Net-Ping/t/250_ping_hires.t Ping Net::Ping dist/Net-Ping/t/300_ping_stream.t Ping Net::Ping @@ -3936,12 +4157,13 @@ dist/Net-Ping/t/500_ping_icmp.t Ping Ne dist/Net-Ping/t/501_ping_icmpv6.t Ping Net::Ping dist/Net-Ping/t/510_ping_udp.t Ping Net::Ping dist/Net-Ping/t/520_icmp_ttl.t Ping Net::Ping -dist/PathTools/Changes Changelog for PathTools dist +dist/Net-Ping/TODO TODO list for Net::Ping +dist/PathTools/Changes Changelog for PathTools dist dist/PathTools/Cwd.pm Various cwd routines (getcwd, fastcwd, chdir) dist/PathTools/Cwd.xs Cwd extension external subroutines -dist/PathTools/lib/File/Spec.pm portable operations on file names +dist/PathTools/lib/File/Spec.pm portable operations on file names dist/PathTools/lib/File/Spec/AmigaOS.pm portable operations on AmigaOS file names -dist/PathTools/lib/File/Spec/Cygwin.pm portable operations on Cygwin file names +dist/PathTools/lib/File/Spec/Cygwin.pm portable operations on Cygwin file names dist/PathTools/lib/File/Spec/Epoc.pm portable operations on EPOC file names dist/PathTools/lib/File/Spec/Functions.pm Function interface to File::Spec object methods dist/PathTools/lib/File/Spec/Mac.pm portable operations on Mac file names @@ -3950,45 +4172,47 @@ dist/PathTools/lib/File/Spec/Unix.pm po dist/PathTools/lib/File/Spec/VMS.pm portable operations on VMS file names dist/PathTools/lib/File/Spec/Win32.pm portable operations on Win32 and NetWare file names dist/PathTools/Makefile.PL makefile writer for Cwd -dist/PathTools/MANIFEST MANIFEST for PathTools -dist/PathTools/META.json META.json for PathTools -dist/PathTools/META.yml META.yml for PathTools -dist/PathTools/t/abs2rel.t See if File::Spec->abs2rel works +dist/PathTools/MANIFEST MANIFEST for PathTools +dist/PathTools/META.json META.json for PathTools +dist/PathTools/META.yml META.yml for PathTools +dist/PathTools/t/abs2rel.t See if File::Spec->abs2rel works dist/PathTools/t/crossplatform.t See if File::Spec works crossplatform -dist/PathTools/t/cwd.t See if Cwd works +dist/PathTools/t/cwd.t See if Cwd works dist/PathTools/t/cwd_enoent.t See if getcwd errors correctly dist/PathTools/t/Functions.t See if File::Spec::Functions works -dist/PathTools/t/rel2abs2rel.t See if File::Spec->rel2abs/abs2rel works -dist/PathTools/t/Spec.t See if File::Spec works +dist/PathTools/t/rel2abs2rel.t See if File::Spec->rel2abs/abs2rel works +dist/PathTools/t/Spec.t See if File::Spec works dist/PathTools/t/Spec-taint.t See if File::Spec works with taint dist/PathTools/t/taint.t See if Cwd works with taint dist/PathTools/t/tmpdir.t See if File::Spec->tmpdir() works dist/PathTools/t/win32.t See if Cwd works on Win32 -dist/Safe/Changes Changes for Safe.pm -dist/Safe/Makefile.PL Makefile.PL for Safe.pm -dist/Safe/MANIFEST MANIFEST for Safe.pm -dist/Safe/META.yml META.yml for Safe.pm -dist/Safe/README README for Safe.pm -dist/Safe/Safe.pm Safe extension Perl module -dist/Safe/t/safe1.t See if Safe works -dist/Safe/t/safe2.t See if Safe works -dist/Safe/t/safe3.t See if Safe works -dist/Safe/t/safeload.t Tests that some modules can be loaded by Safe -dist/Safe/t/safenamedcap.t Tests that Tie::Hash::NamedCapture can be loaded -dist/Safe/t/safeops.t Tests that all ops can be trapped by Safe -dist/Safe/t/saferegexp.t Tests Safe with regular expressions -dist/Safe/t/safesecurity.t Tests misc. security fixes in Safe -dist/Safe/t/safesort.t Tests Safe with sort -dist/Safe/t/safeuniversal.t Tests Safe with functions from universal.c -dist/Safe/t/safeutf8.t Tests Safe with utf8.pm -dist/Safe/t/safewrap.t Tests Safe::wrap_code_ref() +dist/Safe/Changes Changes for Safe.pm +dist/Safe/Makefile.PL Makefile.PL for Safe.pm +dist/Safe/MANIFEST MANIFEST for Safe.pm +dist/Safe/META.yml META.yml for Safe.pm +dist/Safe/README README for Safe.pm +dist/Safe/Safe.pm Safe extension Perl module +dist/Safe/t/safe1.t See if Safe works +dist/Safe/t/safe2.t See if Safe works +dist/Safe/t/safe3.t See if Safe works +dist/Safe/t/safeload.t Tests that some modules can be loaded by Safe +dist/Safe/t/safenamedcap.t Tests that Tie::Hash::NamedCapture can be loaded +dist/Safe/t/safeops.t Tests that all ops can be trapped by Safe +dist/Safe/t/saferegexp.t Tests Safe with regular expressions +dist/Safe/t/safesecurity.t Tests misc. security fixes in Safe +dist/Safe/t/safesort.t Tests Safe with sort +dist/Safe/t/safeuniversal.t Tests Safe with functions from universal.c +dist/Safe/t/safeutf8.t Tests Safe with utf8.pm +dist/Safe/t/safewrap.t Tests Safe::wrap_code_ref() dist/Search-Dict/Changes Change log dist/Search-Dict/lib/Search/Dict.pm Perform binary search on dictionaries dist/Search-Dict/Makefile.PL Makefile.PL dist/Search-Dict/README.patching Patch instructions dist/Search-Dict/README.release Release instructions dist/Search-Dict/t/Dict.t See if Search::Dict works +dist/SelfLoader/Changes History of changes for SelfLoader dist/SelfLoader/lib/SelfLoader.pm Load functions only on demand +dist/SelfLoader/Makefile.PL Build SelfLoader dist/SelfLoader/t/01SelfLoader.t See if SelfLoader works dist/SelfLoader/t/02SelfLoader-buggy.t See if SelfLoader works dist/SelfLoader/t/03taint.t See if SelfLoader works under taint @@ -4007,6 +4231,7 @@ dist/Storable/t/attach.t Check STORABLE dist/Storable/t/attach_errors.t Trigger and test STORABLE_attach errors dist/Storable/t/attach_singleton.t Test STORABLE_attach for the Singleton pattern dist/Storable/t/blessed.t See if Storable works +dist/Storable/t/boolean.t See if Storable works dist/Storable/t/canonical.t See if Storable works dist/Storable/t/circular_hook.t Test thaw hook called depth-first for circular refs dist/Storable/t/code.t See if Storable works @@ -4056,25 +4281,31 @@ dist/Storable/t/utf8hash.t See if Stora dist/Storable/t/weak.t Can Storable store weakrefs dist/Term-Complete/lib/Term/Complete.pm A command completion subroutine dist/Term-Complete/t/Complete.t See if Term::Complete works -dist/Term-ReadLine/lib/Term/ReadLine.pm Stub readline library -dist/Term-ReadLine/t/AE.t See if Term::ReadLine works -dist/Term-ReadLine/t/AETk.t See if Term::ReadLine works -dist/Term-ReadLine/t/ReadLine.t See if Term::ReadLine works -dist/Term-ReadLine/t/ReadLine-STDERR.t See if Term::ReadLine works -dist/Term-ReadLine/t/Tk.t See if Term::ReadLine works -dist/Test/lib/Test.pm A simple framework for writing test scripts -dist/Test/t/05_about_verbose.t See if Test works -dist/Test/t/fail.t See if Test works -dist/Test/t/mix.t See if Test works -dist/Test/t/multiline.t See if Test works -dist/Test/t/onfail.t See if Test works -dist/Test/t/qr.t See if Test works -dist/Test/t/skip.t See if Test works -dist/Test/t/success.t See if Test works -dist/Test/t/todo.t See if Test works -dist/Text-Abbrev/lib/Text/Abbrev.pm An abbreviation table builder +dist/Term-ReadLine/lib/Term/ReadLine.pm Stub readline library +dist/Term-ReadLine/t/AE.t See if Term::ReadLine works +dist/Term-ReadLine/t/AETk.t See if Term::ReadLine works +dist/Term-ReadLine/t/ReadLine.t See if Term::ReadLine works +dist/Term-ReadLine/t/ReadLine-STDERR.t See if Term::ReadLine works +dist/Term-ReadLine/t/Tk.t See if Term::ReadLine works +dist/Test/ChangeLog History of changes for the Test module +dist/Test/lib/Test.pm A simple framework for writing test scripts +dist/Test/Makefile.PL Build the Test module +dist/Test/t/05_about_verbose.t See if Test works +dist/Test/t/fail.t See if Test works +dist/Test/t/mix.t See if Test works +dist/Test/t/multiline.t See if Test works +dist/Test/t/onfail.t See if Test works +dist/Test/t/qr.t See if Test works +dist/Test/t/skip.t See if Test works +dist/Test/t/success.t See if Test works +dist/Test/t/todo.t See if Test works +dist/Text-Abbrev/lib/Text/Abbrev.pm An abbreviation table builder dist/Text-Abbrev/t/Abbrev.t Test Text::Abbrev +dist/Thread-Queue/Changes Thread-safe queues +dist/Thread-Queue/examples/callback.pl Thread::Queue example script +dist/Thread-Queue/examples/queue.pl Thread::Queue example script dist/Thread-Queue/lib/Thread/Queue.pm Thread-safe queues +dist/Thread-Queue/Makefile.PL Build Thread::Queue dist/Thread-Queue/t/01_basic.t Thread::Queue tests dist/Thread-Queue/t/02_refs.t Thread::Queue tests dist/Thread-Queue/t/03_peek.t Thread::Queue tests @@ -4084,68 +4315,74 @@ dist/Thread-Queue/t/06_insert.t Thread: dist/Thread-Queue/t/07_lock.t Thread::Queue tests dist/Thread-Queue/t/08_nothreads.t Thread::Queue tests dist/Thread-Queue/t/09_ended.t Thread::Queue tests -dist/Thread-Queue/t/10_timed.t Thread::Queue tests -dist/Thread-Queue/t/11_limit.t Thread::Queue tests +dist/Thread-Queue/t/10_timed.t Thread::Queue tests +dist/Thread-Queue/t/11_limit.t Thread::Queue tests +dist/Thread-Semaphore/Changes History of changes for Thread::Semaphore +dist/Thread-Semaphore/examples/semaphore.pl Thread::Semaphore example script dist/Thread-Semaphore/lib/Thread/Semaphore.pm Thread-safe semaphores +dist/Thread-Semaphore/Makefile.PL Build Thread::Semaphore dist/Thread-Semaphore/t/01_basic.t Thread::Semaphore tests dist/Thread-Semaphore/t/02_errs.t Thread::Semaphore tests dist/Thread-Semaphore/t/03_nothreads.t Thread::Semaphore tests dist/Thread-Semaphore/t/04_nonblocking.t Thread::Semaphore tests -dist/Thread-Semaphore/t/05_force.t Thread::Semaphore tests -dist/Thread-Semaphore/t/06_timed.t Thread::Semaphore tests -dist/threads/hints/hpux.pl Hint file for HPUX -dist/threads/hints/linux.pl Hint file for Linux +dist/Thread-Semaphore/t/05_force.t Thread::Semaphore tests +dist/Thread-Semaphore/t/06_timed.t Thread::Semaphore tests +dist/threads/hints/hpux.pl Hint file for HPUX +dist/threads/hints/linux.pl Hint file for Linux dist/threads/lib/threads.pm ithreads -dist/threads/t/basic.t ithreads -dist/threads/t/blocks.t Test threads in special blocks -dist/threads/t/context.t Explicit thread context -dist/threads/t/end.t Test end functions -dist/threads/t/err.t Test $thr->error() -dist/threads/t/exit.t Test exit and die in threads -dist/threads/t/free.t Test ithread destruction -dist/threads/t/free2.t More ithread destruction tests -dist/threads/t/join.t Testing the join function -dist/threads/t/kill.t Tests thread signalling -dist/threads/t/kill2.t Tests thread signalling -dist/threads/t/kill3.t Tests thread signalling -dist/threads/t/libc.t testing libc functions for threadsafety -dist/threads/t/list.t Test threads->list() -dist/threads/t/no_threads.t threads test for non-threaded Perls -dist/threads/t/problems.t Test various memory problems -dist/threads/t/stack.t Tests for stack limits -dist/threads/t/stack_env.t Tests for stack limits -dist/threads/t/state.t Tests state methods -dist/threads/t/stress_cv.t Test with multiple threads, coderef cv argument. -dist/threads/t/stress_re.t Test with multiple threads, string cv argument and regexes. -dist/threads/t/stress_string.t Test with multiple threads, string cv argument. -dist/threads/t/thread.t General ithread tests from thr5005 +dist/threads/t/basic.t ithreads +dist/threads/t/blocks.t Test threads in special blocks +dist/threads/t/context.t Explicit thread context +dist/threads/t/end.t Test end functions +dist/threads/t/err.t Test $thr->error() +dist/threads/t/exit.t Test exit and die in threads +dist/threads/t/free.t Test ithread destruction +dist/threads/t/free2.t More ithread destruction tests +dist/threads/t/join.t Testing the join function +dist/threads/t/kill.t Tests thread signalling +dist/threads/t/kill2.t Tests thread signalling +dist/threads/t/kill3.t Tests thread signalling +dist/threads/t/libc.t testing libc functions for threadsafety +dist/threads/t/list.t Test threads->list() +dist/threads/t/no_threads.t threads test for non-threaded Perls +dist/threads/t/problems.t Test various memory problems +dist/threads/t/stack.t Tests for stack limits +dist/threads/t/stack_env.t Tests for stack limits +dist/threads/t/state.t Tests state methods +dist/threads/t/stress_cv.t Test with multiple threads, coderef cv argument. +dist/threads/t/stress_re.t Test with multiple threads, string cv argument and regexes. +dist/threads/t/stress_string.t Test with multiple threads, string cv argument. +dist/threads/t/thread.t General ithread tests from thr5005 dist/threads/t/unique.t Test unique attribute with threads -dist/threads/threads.xs ithreads -dist/threads-shared/hints/linux.pl thread shared variables +dist/threads/t/version.t Test that pod version matches code version. +dist/threads/threads.h threads compatibility helper +dist/threads/threads.xs ithreads +dist/threads-shared/hints/linux.pl thread shared variables dist/threads-shared/lib/threads/shared.pm thread shared variables -dist/threads-shared/shared.xs thread shared variables -dist/threads-shared/t/0nothread.t Tests for basic shared array functionality. -dist/threads-shared/t/av_refs.t Tests for arrays containing references -dist/threads-shared/t/av_simple.t Tests for basic shared array functionality. -dist/threads-shared/t/blessed.t Test blessed shared variables -dist/threads-shared/t/clone.t Test shared cloning -dist/threads-shared/t/cond.t Test condition variables -dist/threads-shared/t/disabled.t Test threads::shared when threads are disabled. -dist/threads-shared/t/dualvar.t Test dual-valued variables -dist/threads-shared/t/hv_refs.t Test shared hashes containing references -dist/threads-shared/t/hv_simple.t Tests for basic shared hash functionality. -dist/threads-shared/t/no_share.t Tests for disabled share on variables. -dist/threads-shared/t/object.t Shared objects tests -dist/threads-shared/t/object2.t More shared objects tests -dist/threads-shared/t/shared_attr.t Test :shared attribute -dist/threads-shared/t/stress.t Stress test -dist/threads-shared/t/sv_refs.t thread shared variables -dist/threads-shared/t/sv_simple.t thread shared variables -dist/threads-shared/t/utf8.t Test UTF-8 keys in shared hashes -dist/threads-shared/t/wait.t Test cond_wait and cond_timedwait -dist/threads-shared/t/waithires.t Test sub-second cond_timedwait +dist/threads-shared/shared.xs thread shared variables +dist/threads-shared/t/0nothread.t Tests for basic shared array functionality. +dist/threads-shared/t/av_refs.t Tests for arrays containing references +dist/threads-shared/t/av_simple.t Tests for basic shared array functionality. +dist/threads-shared/t/blessed.t Test blessed shared variables +dist/threads-shared/t/clone.t Test shared cloning +dist/threads-shared/t/cond.t Test condition variables +dist/threads-shared/t/disabled.t Test threads::shared when threads are disabled. +dist/threads-shared/t/dualvar.t Test dual-valued variables +dist/threads-shared/t/hv_refs.t Test shared hashes containing references +dist/threads-shared/t/hv_simple.t Tests for basic shared hash functionality. +dist/threads-shared/t/no_share.t Tests for disabled share on variables. +dist/threads-shared/t/object.t Shared objects tests +dist/threads-shared/t/object2.t More shared objects tests +dist/threads-shared/t/shared_attr.t Test :shared attribute +dist/threads-shared/t/stress.t Stress test +dist/threads-shared/t/sv_refs.t thread shared variables +dist/threads-shared/t/sv_simple.t thread shared variables +dist/threads-shared/t/utf8.t Test UTF-8 keys in shared hashes +dist/threads-shared/t/wait.t Test cond_wait and cond_timedwait +dist/threads-shared/t/waithires.t Test sub-second cond_timedwait dist/Tie-File/ChangeLog Tie::File dist/Tie-File/lib/Tie/File.pm Files as tied arrays +dist/Tie-File/Makefile.PL Build Tie::File dist/Tie-File/t/01_gen.t Generic read/write tests for Tie::File dist/Tie-File/t/02_fetchsize.t File length fetch test for Tie::File dist/Tie-File/t/03_longfetch.t Past-the-end-of-the-array tests for Tie::File @@ -4223,255 +4460,246 @@ dist/Unicode-Normalize/t/func.t Unicode dist/Unicode-Normalize/t/illegal.t Unicode::Normalize dist/Unicode-Normalize/t/norm.t Unicode::Normalize dist/Unicode-Normalize/t/null.t Unicode::Normalize -dist/Unicode-Normalize/t/partial1.t Unicode::Normalize -dist/Unicode-Normalize/t/partial2.t Unicode::Normalize +dist/Unicode-Normalize/t/partial1.t Unicode::Normalize +dist/Unicode-Normalize/t/partial2.t Unicode::Normalize dist/Unicode-Normalize/t/proto.t Unicode::Normalize dist/Unicode-Normalize/t/split.t Unicode::Normalize dist/Unicode-Normalize/t/test.t Unicode::Normalize dist/Unicode-Normalize/t/tie.t Unicode::Normalize -dist/XSLoader/Makefile.PL Dynamic Loader makefile writer -dist/XSLoader/t/XSLoader.t See if XSLoader works -dist/XSLoader/XSLoader_pm.PL Simple XS Loader perl module -doio.c I/O operations -doop.c Support code for various operations -dosish.h Some defines for MS/DOSish machines -dquote.c Functions for double quotish contexts -dump.c Debugging output -ebcdic_tables.h Generated tables included in utfebcdic.h -embed.fnc Database used by embed.pl -embed.h Maps symbols to safer names -embedvar.h C namespace management +dist/XSLoader/Makefile.PL Dynamic Loader makefile writer +dist/XSLoader/t/XSLoader.t See if XSLoader works +dist/XSLoader/XSLoader_pm.PL Simple XS Loader perl module ext/Amiga-ARexx/__examples/simplecommand.pl Amiga::ARexx extension ext/Amiga-ARexx/__examples/simplehost.pl Amiga::ARexx extension -ext/Amiga-ARexx/ARexx.pm Amiga::ARexx extension -ext/Amiga-ARexx/ARexx.xs Amiga::ARexx extension -ext/Amiga-ARexx/Makefile.PL Amiga::ARexx extension +ext/Amiga-ARexx/ARexx.pm Amiga::ARexx extension +ext/Amiga-ARexx/ARexx.xs Amiga::ARexx extension +ext/Amiga-ARexx/Makefile.PL Amiga::ARexx extension ext/Amiga-ARexx/tagtypes.h Amiga::ARexx extension -ext/Amiga-ARexx/typemap Amiga::ARexx extension +ext/Amiga-ARexx/typemap Amiga::ARexx extension ext/Amiga-Exec/__examples/simplecommand.pl Amiga::Exec extension ext/Amiga-Exec/__examples/simplehost.pl Amiga::Exec extension -ext/Amiga-Exec/Exec.pm Amiga::Exec extension -ext/Amiga-Exec/Exec.xs Amiga::Exec extension +ext/Amiga-Exec/Exec.pm Amiga::Exec extension +ext/Amiga-Exec/Exec.xs Amiga::Exec extension ext/Amiga-Exec/Makefile.PL Amiga::Exec extension -ext/Amiga-Exec/tagtypes.h Amiga::Exec extension -ext/Amiga-Exec/typemap Amiga::Exec extension +ext/Amiga-Exec/tagtypes.h Amiga::Exec extension +ext/Amiga-Exec/typemap Amiga::Exec extension ext/attributes/attributes.pm For "sub foo : attrlist" ext/attributes/attributes.xs For "sub foo : attrlist" -ext/B/B.pm Compiler backend support functions and methods -ext/B/B.xs Compiler backend external subroutines -ext/B/B/Concise.pm Compiler Concise backend -ext/B/B/Showlex.pm Compiler Showlex backend -ext/B/B/Terse.pm Compiler Terse backend -ext/B/B/Xref.pm Compiler Xref backend -ext/B/hints/darwin.pl Hints for named architecture -ext/B/Makefile.PL Compiler backend makefile writer -ext/B/O.pm Compiler front-end module (-MO=...) -ext/B/t/b.t See if B works -ext/B/t/B/success.pm Test module for ext/B/t/o.t -ext/B/t/concise.t See whether B::Concise works -ext/B/t/concise-xs.t See whether B::Concise recognizes XS functions -ext/B/t/f_map code from perldoc -f map -ext/B/t/f_map.t converted to optreeCheck()s -ext/B/t/f_sort optree test raw material -ext/B/t/f_sort.t optree test raw material -ext/B/t/invlist.t test B::INVLIST -ext/B/t/o.t See if O works -ext/B/t/optree_check.t test OptreeCheck apparatus -ext/B/t/optree_concise.t more B::Concise tests -ext/B/t/optree_constants.t B::Concise rendering of optimized constant subs -ext/B/t/optree_for.t for loops -ext/B/t/optree_misc.t misc optree tests -ext/B/t/optree_samples.t various basic codes: if for while -ext/B/t/optree_sort.t inplace sort optimization regression -ext/B/t/optree_specials.t BEGIN, END, etc code -ext/B/t/optree_varinit.t my,our,local var init optimization -ext/B/t/OptreeCheck.pm optree comparison tool -ext/B/t/perlstring.t See if B::perlstring output roundtrips properly -ext/B/t/pragma.t See if user pragmas work. -ext/B/t/showlex.t See if B::ShowLex works -ext/B/t/strict.t See if B works with strict and warnings. -ext/B/t/sv_stash.t See if SvSTASH() works -ext/B/t/terse.t See if B::Terse works -ext/B/t/walkoptree.t See if B::walkoptree (and friends) work -ext/B/t/xref.t See if B::Xref works -ext/B/typemap Compiler backend interface types -ext/Devel-Peek/Changes Data debugging tool, changelog -ext/Devel-Peek/Peek.pm Data debugging tool, module and pod -ext/Devel-Peek/Peek.xs Data debugging tool, externals -ext/Devel-Peek/t/Peek.t See if Devel::Peek works -ext/DynaLoader/dl_aix.xs AIX implementation -ext/DynaLoader/dl_dllload.xs S/390 dllload() style implementation -ext/DynaLoader/dl_dlopen.xs BSD/SunOS4&5 dlopen() style implementation -ext/DynaLoader/dl_dyld.xs NeXT/Apple dyld implementation -ext/DynaLoader/dl_freemint.xs GNU dld style implementation for FreeMINT -ext/DynaLoader/dl_hpux.xs HP-UX implementation -ext/DynaLoader/dl_none.xs Stub implementation -ext/DynaLoader/dl_vms.xs VMS implementation -ext/DynaLoader/dl_win32.xs Win32 implementation -ext/DynaLoader/dlutils.c Dynamic loader utilities for dl_*.xs files -ext/DynaLoader/DynaLoader_pm.PL Dynamic Loader perl module -ext/DynaLoader/hints/aix.pl Hint for DynaLoader for named architecture -ext/DynaLoader/hints/android.pl Hint for DynaLoader for named architecture +ext/B/B.pm Compiler backend support functions and methods +ext/B/B.xs Compiler backend external subroutines +ext/B/B/Concise.pm Compiler Concise backend +ext/B/B/Showlex.pm Compiler Showlex backend +ext/B/B/Terse.pm Compiler Terse backend +ext/B/B/Xref.pm Compiler Xref backend +ext/B/hints/darwin.pl Hints for named architecture +ext/B/Makefile.PL Compiler backend makefile writer +ext/B/O.pm Compiler front-end module (-MO=...) +ext/B/t/b.t See if B works +ext/B/t/B/success.pm Test module for ext/B/t/o.t +ext/B/t/bool.t See if B works for bool +ext/B/t/concise.t See whether B::Concise works +ext/B/t/concise-xs.t See whether B::Concise recognizes XS functions +ext/B/t/f_map code from perldoc -f map +ext/B/t/f_map.t converted to optreeCheck()s +ext/B/t/f_sort optree test raw material +ext/B/t/f_sort.t optree test raw material +ext/B/t/invlist.t test B::INVLIST +ext/B/t/o.t See if O works +ext/B/t/optree_check.t test OptreeCheck apparatus +ext/B/t/optree_concise.t more B::Concise tests +ext/B/t/optree_constants.t B::Concise rendering of optimized constant subs +ext/B/t/optree_for.t for loops +ext/B/t/optree_misc.t misc optree tests +ext/B/t/optree_samples.t various basic codes: if for while +ext/B/t/optree_sort.t inplace sort optimization regression +ext/B/t/optree_specials.t BEGIN, END, etc code +ext/B/t/optree_varinit.t my,our,local var init optimization +ext/B/t/OptreeCheck.pm optree comparison tool +ext/B/t/perlstring.t See if B::perlstring output roundtrips properly +ext/B/t/pragma.t See if user pragmas work. +ext/B/t/showlex.t See if B::ShowLex works +ext/B/t/strict.t See if B works with strict and warnings. +ext/B/t/sv_stash.t See if SvSTASH() works +ext/B/t/terse.t See if B::Terse works +ext/B/t/walkoptree.t See if B::walkoptree (and friends) work +ext/B/t/xref.t See if B::Xref works +ext/B/typemap Compiler backend interface types +ext/Devel-Peek/Changes Data debugging tool, changelog +ext/Devel-Peek/Peek.pm Data debugging tool, module and pod +ext/Devel-Peek/Peek.xs Data debugging tool, externals +ext/Devel-Peek/t/Peek.t See if Devel::Peek works +ext/DynaLoader/dl_aix.xs AIX implementation +ext/DynaLoader/dl_dllload.xs S/390 dllload() style implementation +ext/DynaLoader/dl_dlopen.xs BSD/SunOS4&5 dlopen() style implementation +ext/DynaLoader/dl_dyld.xs NeXT/Apple dyld implementation +ext/DynaLoader/dl_freemint.xs GNU dld style implementation for FreeMINT +ext/DynaLoader/dl_hpux.xs HP-UX implementation +ext/DynaLoader/dl_none.xs Stub implementation +ext/DynaLoader/dl_vms.xs VMS implementation +ext/DynaLoader/dl_win32.xs Win32 implementation +ext/DynaLoader/dlutils.c Dynamic loader utilities for dl_*.xs files +ext/DynaLoader/DynaLoader_pm.PL Dynamic Loader perl module +ext/DynaLoader/hints/aix.pl Hint for DynaLoader for named architecture +ext/DynaLoader/hints/android.pl Hint for DynaLoader for named architecture ext/DynaLoader/hints/gnukfreebsd.pl Hint for DynaLoader for named architecture ext/DynaLoader/hints/gnuknetbsd.pl Hint for DynaLoader for named architecture -ext/DynaLoader/hints/linux.pl Hint for DynaLoader for named architecture -ext/DynaLoader/hints/netbsd.pl Hint for DynaLoader for named architecture -ext/DynaLoader/hints/openbsd.pl Hint for DynaLoader for named architecture -ext/DynaLoader/Makefile.PL Dynamic Loader makefile writer -ext/DynaLoader/README Dynamic Loader notes and intro -ext/DynaLoader/t/DynaLoader.t See if DynaLoader works -ext/Errno/ChangeLog Errno changes -ext/Errno/Errno_pm.PL Errno perl module create script -ext/Errno/Makefile.PL Errno extension makefile writer -ext/Errno/t/Errno.t See if Errno works +ext/DynaLoader/hints/linux.pl Hint for DynaLoader for named architecture +ext/DynaLoader/hints/netbsd.pl Hint for DynaLoader for named architecture +ext/DynaLoader/hints/openbsd.pl Hint for DynaLoader for named architecture +ext/DynaLoader/Makefile.PL Dynamic Loader makefile writer +ext/DynaLoader/README Dynamic Loader notes and intro +ext/DynaLoader/t/DynaLoader.t See if DynaLoader works +ext/Errno/ChangeLog Errno changes +ext/Errno/Errno_pm.PL Errno perl module create script +ext/Errno/Makefile.PL Errno extension makefile writer +ext/Errno/t/Errno.t See if Errno works ext/ExtUtils-Miniperl/lib/ExtUtils/Miniperl.pm Writes {mini,}perlmain.c -ext/Fcntl/Fcntl.pm Fcntl extension Perl module -ext/Fcntl/Fcntl.xs Fcntl extension external subroutines -ext/Fcntl/Makefile.PL Fcntl extension makefile writer -ext/Fcntl/t/autoload.t See if Fcntl AUTOLOAD error messages work -ext/Fcntl/t/fcntl.t See if Fcntl works -ext/Fcntl/t/mode.t See if S_ISREG() and S_ISDIR() work -ext/Fcntl/t/syslfs.t See if large files work for sysio +ext/Fcntl/Fcntl.pm Fcntl extension Perl module +ext/Fcntl/Fcntl.xs Fcntl extension external subroutines +ext/Fcntl/Makefile.PL Fcntl extension makefile writer +ext/Fcntl/t/autoload.t See if Fcntl AUTOLOAD error messages work +ext/Fcntl/t/fcntl.t See if Fcntl works +ext/Fcntl/t/mode.t See if S_ISREG() and S_ISDIR() work +ext/Fcntl/t/syslfs.t See if large files work for sysio ext/File-DosGlob/DosGlob.xs Win32 DOS-globbing module ext/File-DosGlob/lib/File/DosGlob.pm Win32 DOS-globbing module ext/File-DosGlob/t/DosGlob.t See if File::DosGlob works -ext/File-Find/lib/File/Find.pm Routines to do a find -ext/File-Find/t/find.t See if File::Find works -ext/File-Find/t/lib/Testing.pm Functions used in testing File-find -ext/File-Find/t/taint.t See if File::Find works with taint -ext/File-Glob/bsd_glob.c File::Glob extension run time code -ext/File-Glob/bsd_glob.h File::Glob extension header file -ext/File-Glob/Changes File::Glob extension changelog -ext/File-Glob/Glob.pm File::Glob extension module -ext/File-Glob/Glob.xs File::Glob extension external subroutines -ext/File-Glob/Makefile.PL File::Glob extension makefile writer -ext/File-Glob/t/basic.t See if File::Glob works -ext/File-Glob/t/case.t See if File::Glob works -ext/File-Glob/t/global.t See if File::Glob works -ext/File-Glob/t/rt114984.t See if File::Glob works -ext/File-Glob/t/rt131211.t See if File::Glob works -ext/File-Glob/t/taint.t See if File::Glob works -ext/File-Glob/t/threads.t See if File::Glob + threads works -ext/File-Glob/TODO File::Glob extension todo list -ext/FileCache/lib/FileCache.pm Keep more files open than the system permits -ext/FileCache/t/01open.t See if FileCache works -ext/FileCache/t/02maxopen.t See if FileCache works -ext/FileCache/t/03append.t See if FileCache works -ext/FileCache/t/04twoarg.t See if FileCache works -ext/FileCache/t/05override.t See if FileCache works -ext/FileCache/t/06export.t See if FileCache exporting works -ext/FileCache/t/07noimport.t See if FileCache works without importing -ext/GDBM_File/GDBM_File.pm GDBM extension Perl module -ext/GDBM_File/GDBM_File.xs GDBM extension external subroutines -ext/GDBM_File/hints/sco.pl Hint for GDBM_File for named architecture -ext/GDBM_File/Makefile.PL GDBM extension makefile writer -ext/GDBM_File/t/count.t Test if the count method works -ext/GDBM_File/t/dump.t Test if export/import methods work -ext/GDBM_File/t/fatal.t Test the fatal_func argument to gdbm_open -ext/GDBM_File/t/gdbm.t See if GDBM_File works -ext/GDBM_File/t/opt.t Test if gdbm_setopt and derived methods work -ext/GDBM_File/t/snapshot.t Test if the latest_snapshot method works -ext/GDBM_File/typemap GDBM extension interface types -ext/Hash-Util/Changes Change history of Hash::Util -ext/Hash-Util/lib/Hash/Util.pm Hash::Util -ext/Hash-Util/Makefile.PL Makefile for Hash::Util -ext/Hash-Util/t/builtin.t See if Hash::Util builtin exports work as expected -ext/Hash-Util/t/Util.t See if Hash::Util works -ext/Hash-Util/Util.xs XS bits of Hash::Util -ext/Hash-Util-FieldHash/Changes Changes for Hash::Util::FieldHash -ext/Hash-Util-FieldHash/FieldHash.xs XS portion +ext/File-Find/lib/File/Find.pm Routines to do a find +ext/File-Find/t/correct-absolute-path-with-follow.t +ext/File-Find/t/find.t See if File::Find works +ext/File-Find/t/lib/Testing.pm Functions used in testing File-find +ext/File-Find/t/taint.t See if File::Find works with taint +ext/File-Glob/bsd_glob.c File::Glob extension run time code +ext/File-Glob/bsd_glob.h File::Glob extension header file +ext/File-Glob/Changes File::Glob extension changelog +ext/File-Glob/Glob.pm File::Glob extension module +ext/File-Glob/Glob.xs File::Glob extension external subroutines +ext/File-Glob/Makefile.PL File::Glob extension makefile writer +ext/File-Glob/t/basic.t See if File::Glob works +ext/File-Glob/t/case.t See if File::Glob works +ext/File-Glob/t/global.t See if File::Glob works +ext/File-Glob/t/rt114984.t See if File::Glob works +ext/File-Glob/t/rt131211.t See if File::Glob works +ext/File-Glob/t/taint.t See if File::Glob works +ext/File-Glob/t/threads.t See if File::Glob + threads works +ext/File-Glob/TODO File::Glob extension todo list +ext/FileCache/lib/FileCache.pm Keep more files open than the system permits +ext/FileCache/t/01open.t See if FileCache works +ext/FileCache/t/02maxopen.t See if FileCache works +ext/FileCache/t/03append.t See if FileCache works +ext/FileCache/t/04twoarg.t See if FileCache works +ext/FileCache/t/05override.t See if FileCache works +ext/FileCache/t/06export.t See if FileCache exporting works +ext/FileCache/t/07noimport.t See if FileCache works without importing +ext/GDBM_File/GDBM_File.pm GDBM extension Perl module +ext/GDBM_File/GDBM_File.xs GDBM extension external subroutines +ext/GDBM_File/hints/sco.pl Hint for GDBM_File for named architecture +ext/GDBM_File/Makefile.PL GDBM extension makefile writer +ext/GDBM_File/t/count.t Test if the count method works +ext/GDBM_File/t/dump.t Test if export/import methods work +ext/GDBM_File/t/fatal.t Test the fatal_func argument to gdbm_open +ext/GDBM_File/t/gdbm.t See if GDBM_File works +ext/GDBM_File/t/opt.t Test if gdbm_setopt and derived methods work +ext/GDBM_File/t/snapshot.t Test if the latest_snapshot method works +ext/GDBM_File/typemap GDBM extension interface types +ext/Hash-Util/Changes Change history of Hash::Util +ext/Hash-Util/lib/Hash/Util.pm Hash::Util +ext/Hash-Util/Makefile.PL Makefile for Hash::Util +ext/Hash-Util/t/builtin.t See if Hash::Util builtin exports work as expected +ext/Hash-Util/t/Util.t See if Hash::Util works +ext/Hash-Util/Util.xs XS bits of Hash::Util +ext/Hash-Util-FieldHash/Changes Changes for Hash::Util::FieldHash +ext/Hash-Util-FieldHash/FieldHash.xs XS portion ext/Hash-Util-FieldHash/lib/Hash/Util/FieldHash.pm Perl portion and documentation -ext/Hash-Util-FieldHash/t/01_load.t Test script -ext/Hash-Util-FieldHash/t/02_function.t Test script -ext/Hash-Util-FieldHash/t/03_class.t Test script -ext/Hash-Util-FieldHash/t/04_thread.t Test script -ext/Hash-Util-FieldHash/t/05_perlhook.t Test script -ext/Hash-Util-FieldHash/t/11_hashassign.t Adapted from t/op/hashassign.t -ext/Hash-Util-FieldHash/t/12_hashwarn.t Adapted from t/op/hashwarn.t -ext/I18N-Langinfo/Langinfo.pm I18N::Langinfo -ext/I18N-Langinfo/Langinfo.xs I18N::Langinfo -ext/I18N-Langinfo/Makefile.PL I18N::Langinfo -ext/I18N-Langinfo/t/Langinfo.t See whether I18N::Langinfo works -ext/IPC-Open3/lib/IPC/Open2.pm Open a two-ended pipe -ext/IPC-Open3/lib/IPC/Open3.pm Open a three-ended pipe -ext/IPC-Open3/t/fd.t See if IPC::Open3 works w/ file descriptors -ext/IPC-Open3/t/IPC-Open2.t See if IPC::Open2 works -ext/IPC-Open3/t/IPC-Open3.t See if IPC::Open3 works -ext/mro/Changes mro extension -ext/mro/mro.pm mro extension -ext/mro/mro.xs mro extension -ext/NDBM_File/hints/cygwin.pl Hint for NDBM_File for named architecture -ext/NDBM_File/hints/dec_osf.pl Hint for NDBM_File for named architecture -ext/NDBM_File/hints/dynixptx.pl Hint for NDBM_File for named architecture -ext/NDBM_File/hints/gnu.pl Hint for NDBM_File for named architecture +ext/Hash-Util-FieldHash/t/01_load.t Test script +ext/Hash-Util-FieldHash/t/02_function.t Test script +ext/Hash-Util-FieldHash/t/03_class.t Test script +ext/Hash-Util-FieldHash/t/04_thread.t Test script +ext/Hash-Util-FieldHash/t/05_perlhook.t Test script +ext/Hash-Util-FieldHash/t/11_hashassign.t Adapted from t/op/hashassign.t +ext/Hash-Util-FieldHash/t/12_hashwarn.t Adapted from t/op/hashwarn.t +ext/I18N-Langinfo/Langinfo.pm I18N::Langinfo +ext/I18N-Langinfo/Langinfo.xs I18N::Langinfo +ext/I18N-Langinfo/Makefile.PL I18N::Langinfo +ext/I18N-Langinfo/t/Langinfo.t See whether I18N::Langinfo works +ext/IPC-Open3/lib/IPC/Open2.pm Open a two-ended pipe +ext/IPC-Open3/lib/IPC/Open3.pm Open a three-ended pipe +ext/IPC-Open3/t/fd.t See if IPC::Open3 works w/ file descriptors +ext/IPC-Open3/t/IPC-Open2.t See if IPC::Open2 works +ext/IPC-Open3/t/IPC-Open3.t See if IPC::Open3 works +ext/mro/Changes mro extension +ext/mro/mro.pm mro extension +ext/mro/mro.xs mro extension +ext/NDBM_File/hints/cygwin.pl Hint for NDBM_File for named architecture +ext/NDBM_File/hints/dec_osf.pl Hint for NDBM_File for named architecture +ext/NDBM_File/hints/dynixptx.pl Hint for NDBM_File for named architecture +ext/NDBM_File/hints/gnu.pl Hint for NDBM_File for named architecture ext/NDBM_File/hints/gnukfreebsd.pl Hint for NDBM_File for named architecture ext/NDBM_File/hints/gnuknetbsd.pl Hint for NDBM_File for named architecture -ext/NDBM_File/hints/linux.pl Hint for NDBM_File for named architecture -ext/NDBM_File/hints/MSWin32.pl Hint for NDBM_File for named architecture -ext/NDBM_File/hints/sco.pl Hint for NDBM_File for named architecture -ext/NDBM_File/hints/solaris.pl Hint for NDBM_File for named architecture -ext/NDBM_File/hints/svr4.pl Hint for NDBM_File for named architecture -ext/NDBM_File/Makefile.PL NDBM extension makefile writer -ext/NDBM_File/NDBM_File.pm NDBM extension Perl module -ext/NDBM_File/NDBM_File.xs NDBM extension external subroutines -ext/NDBM_File/t/ndbm.t See if NDBM_File works -ext/NDBM_File/typemap NDBM extension interface types -ext/ODBM_File/hints/cygwin.pl Hint for ODBM_File for named architecture -ext/ODBM_File/hints/dec_osf.pl Hint for ODBM_File for named architecture -ext/ODBM_File/hints/gnu.pl Hint for ODBM_File for named architecture +ext/NDBM_File/hints/linux.pl Hint for NDBM_File for named architecture +ext/NDBM_File/hints/MSWin32.pl Hint for NDBM_File for named architecture +ext/NDBM_File/hints/sco.pl Hint for NDBM_File for named architecture +ext/NDBM_File/hints/solaris.pl Hint for NDBM_File for named architecture +ext/NDBM_File/hints/svr4.pl Hint for NDBM_File for named architecture +ext/NDBM_File/Makefile.PL NDBM extension makefile writer +ext/NDBM_File/NDBM_File.pm NDBM extension Perl module +ext/NDBM_File/NDBM_File.xs NDBM extension external subroutines +ext/NDBM_File/t/ndbm.t See if NDBM_File works +ext/NDBM_File/typemap NDBM extension interface types +ext/ODBM_File/hints/cygwin.pl Hint for ODBM_File for named architecture +ext/ODBM_File/hints/dec_osf.pl Hint for ODBM_File for named architecture +ext/ODBM_File/hints/gnu.pl Hint for ODBM_File for named architecture ext/ODBM_File/hints/gnukfreebsd.pl Hint for NDBM_File for named architecture ext/ODBM_File/hints/gnuknetbsd.pl Hint for NDBM_File for named architecture -ext/ODBM_File/hints/hpux.pl Hint for ODBM_File for named architecture -ext/ODBM_File/hints/linux.pl Hint for ODBM_File for named architecture -ext/ODBM_File/hints/MSWin32.pl Hint for ODBM_File for named architecture -ext/ODBM_File/hints/sco.pl Hint for ODBM_File for named architecture -ext/ODBM_File/hints/solaris.pl Hint for ODBM_File for named architecture -ext/ODBM_File/hints/svr4.pl Hint for ODBM_File for named architecture -ext/ODBM_File/hints/ultrix.pl Hint for ODBM_File for named architecture -ext/ODBM_File/Makefile.PL ODBM extension makefile writer -ext/ODBM_File/ODBM_File.pm ODBM extension Perl module -ext/ODBM_File/ODBM_File.xs ODBM extension external subroutines -ext/ODBM_File/t/odbm.t See if ODBM_File works -ext/ODBM_File/typemap ODBM extension interface types -ext/Opcode/Opcode.pm Opcode extension Perl module -ext/Opcode/Opcode.xs Opcode extension external subroutines -ext/Opcode/ops.pm "Pragma" form of Opcode extension Perl module -ext/Opcode/t/Opcode.t See if Opcode works -ext/Opcode/t/ops.t See if Opcode works -ext/PerlIO-encoding/encoding.pm PerlIO::encoding -ext/PerlIO-encoding/encoding.xs PerlIO::encoding +ext/ODBM_File/hints/hpux.pl Hint for ODBM_File for named architecture +ext/ODBM_File/hints/linux.pl Hint for ODBM_File for named architecture +ext/ODBM_File/hints/MSWin32.pl Hint for ODBM_File for named architecture +ext/ODBM_File/hints/sco.pl Hint for ODBM_File for named architecture +ext/ODBM_File/hints/solaris.pl Hint for ODBM_File for named architecture +ext/ODBM_File/hints/svr4.pl Hint for ODBM_File for named architecture +ext/ODBM_File/Makefile.PL ODBM extension makefile writer +ext/ODBM_File/ODBM_File.pm ODBM extension Perl module +ext/ODBM_File/ODBM_File.xs ODBM extension external subroutines +ext/ODBM_File/t/odbm.t See if ODBM_File works +ext/ODBM_File/typemap ODBM extension interface types +ext/Opcode/Opcode.pm Opcode extension Perl module +ext/Opcode/Opcode.xs Opcode extension external subroutines +ext/Opcode/ops.pm "Pragma" form of Opcode extension Perl module +ext/Opcode/t/Opcode.t See if Opcode works +ext/Opcode/t/ops.t See if Opcode works +ext/PerlIO-encoding/encoding.pm PerlIO::encoding +ext/PerlIO-encoding/encoding.xs PerlIO::encoding ext/PerlIO-encoding/t/encoding.t See if PerlIO encoding conversion works ext/PerlIO-encoding/t/fallback.t See if PerlIO fallbacks work ext/PerlIO-encoding/t/nolooping.t Tests for PerlIO::encoding ext/PerlIO-encoding/t/threads.t Tests PerlIO::encoding and threads -ext/PerlIO-mmap/mmap.pm PerlIO layer for memory maps -ext/PerlIO-mmap/mmap.xs PerlIO layer for memory maps -ext/PerlIO-scalar/scalar.pm PerlIO layer for scalars -ext/PerlIO-scalar/scalar.xs PerlIO layer for scalars -ext/PerlIO-scalar/t/scalar.t See if PerlIO::scalar works +ext/PerlIO-mmap/mmap.pm PerlIO layer for memory maps +ext/PerlIO-mmap/mmap.xs PerlIO layer for memory maps +ext/PerlIO-scalar/scalar.pm PerlIO layer for scalars +ext/PerlIO-scalar/scalar.xs PerlIO layer for scalars +ext/PerlIO-scalar/t/scalar.t See if PerlIO::scalar works ext/PerlIO-scalar/t/scalar_ungetc.t Tests for PerlIO layer for scalars -ext/PerlIO-via/hints/aix.pl Hint for PerlIO::via for named architecture +ext/PerlIO-via/hints/aix.pl Hint for PerlIO::via for named architecture ext/PerlIO-via/t/thread.t See if PerlIO::via works with threads -ext/PerlIO-via/t/via.t See if PerlIO::via works -ext/PerlIO-via/via.pm PerlIO layer for layers in perl -ext/PerlIO-via/via.xs PerlIO layer for layers in perl +ext/PerlIO-via/t/via.t See if PerlIO::via works +ext/PerlIO-via/via.pm PerlIO layer for layers in perl +ext/PerlIO-via/via.xs PerlIO layer for layers in perl ext/Pod-Functions/Functions_pm.PL Writes Functions.pm ext/Pod-Functions/Makefile.PL Makefile writer ext/Pod-Functions/t/Functions.t See if Pod::Functions works -ext/Pod-Html/bin/pod2html Translator to turn pod into HTML +ext/Pod-Html/bin/pod2html Translator to turn pod into HTML ext/Pod-Html/corpus/perlpodspec-copy.pod ext/Pod-Html/corpus/perlvar-copy.pod -ext/Pod-Html/lib/Pod/Html.pm Convert POD data to HTML -ext/Pod-Html/lib/Pod/Html/Util.pm Helper functions for Pod-Html +ext/Pod-Html/lib/Pod/Html.pm Convert POD data to HTML +ext/Pod-Html/lib/Pod/Html/Util.pm Helper functions for Pod-Html ext/Pod-Html/t/anchorify.t -ext/Pod-Html/t/anchorify-536.t Test Pod-Html utility functions during perl-5.36 ext/Pod-Html/t/cache.pod ext/Pod-Html/t/cache.t ext/Pod-Html/t/crossref.pod ext/Pod-Html/t/crossref.t ext/Pod-Html/t/crossref2.t ext/Pod-Html/t/crossref3.t -ext/Pod-Html/t/eol.t test end of line agnosticism +ext/Pod-Html/t/eol.t test end of line agnosticism ext/Pod-Html/t/feature.pod ext/Pod-Html/t/feature.t ext/Pod-Html/t/feature2.pod @@ -4486,623 +4714,601 @@ ext/Pod-Html/t/htmldir4.pod ext/Pod-Html/t/htmldir4.t ext/Pod-Html/t/htmldir5.pod ext/Pod-Html/t/htmldir5.t -ext/Pod-Html/t/htmlescp.pod pod2html escape test input data -ext/Pod-Html/t/htmlescp.t pod2html escape test -ext/Pod-Html/t/htmllink.pod pod2html link test input data -ext/Pod-Html/t/htmllink.t pod2html link test -ext/Pod-Html/t/htmlview.pod pod2html render test input data -ext/Pod-Html/t/htmlview.t pod2html render test -ext/Pod-Html/t/lib/Testing.pm Testing functions for Pod-Html +ext/Pod-Html/t/htmlescp.pod pod2html escape test input data +ext/Pod-Html/t/htmlescp.t pod2html escape test +ext/Pod-Html/t/htmllink.pod pod2html link test input data +ext/Pod-Html/t/htmllink.t pod2html link test +ext/Pod-Html/t/htmlview.pod pod2html render test input data +ext/Pod-Html/t/htmlview.t pod2html render test +ext/Pod-Html/t/lib/Testing.pm Testing functions for Pod-Html ext/Pod-Html/t/poderr.pod ext/Pod-Html/t/poderr.t ext/Pod-Html/t/podnoerr.pod ext/Pod-Html/t/podnoerr.t -ext/POSIX/hints/bsdos.pl Hint for POSIX for named architecture -ext/POSIX/hints/dynixptx.pl Hint for POSIX for named architecture -ext/POSIX/hints/freebsd.pl Hint for POSIX for named architecture -ext/POSIX/hints/gnukfreebsd.pl Hint for POSIX for named architecture -ext/POSIX/hints/gnuknetbsd.pl Hint for POSIX for named architecture -ext/POSIX/hints/linux.pl Hint for POSIX for named architecture -ext/POSIX/hints/mint.pl Hint for POSIX for named architecture -ext/POSIX/hints/netbsd.pl Hint for POSIX for named architecture -ext/POSIX/hints/openbsd.pl Hint for POSIX for named architecture -ext/POSIX/hints/sunos_4.pl Hint for POSIX for named architecture -ext/POSIX/hints/svr4.pl Hint for POSIX for named architecture -ext/POSIX/lib/POSIX.pm POSIX extension Perl module -ext/POSIX/lib/POSIX.pod POSIX extension documentation -ext/POSIX/Makefile.PL POSIX extension makefile writer -ext/POSIX/POSIX.xs POSIX extension external subroutines -ext/POSIX/t/export.t Test @EXPORT and @EXPORT_OK -ext/POSIX/t/fenv.t Floating-point rounding mode tests for POSIX -ext/POSIX/t/iscrash See if POSIX isxxx() crashes with threads on Win32 -ext/POSIX/t/iv_const.t See if integer constants of POSIX are IV -ext/POSIX/t/math.t Basic math tests for POSIX -ext/POSIX/t/mb.t Multibyte function tests for POSIX -ext/POSIX/t/posix.t See if POSIX works -ext/POSIX/t/sigaction.t See if POSIX::sigaction works -ext/POSIX/t/sigset.t See if POSIX::SigSet works -ext/POSIX/t/strerror_errno.t See if POSIX:strerror doesn't trash $! -ext/POSIX/t/sysconf.t See if POSIX works -ext/POSIX/t/taint.t See if POSIX works with taint -ext/POSIX/t/termios.t See if POSIX works -ext/POSIX/t/time.t See if POSIX time-related functions work -ext/POSIX/t/unimplemented.t Test the diagnostics for unimplemented functions -ext/POSIX/t/usage.t Test the diagnostics for usage messages -ext/POSIX/t/waitpid.t See if waitpid works -ext/POSIX/t/wrappers.t Test the POSIX wrapper subroutines -ext/POSIX/typemap POSIX extension interface types -ext/re/Makefile.PL re extension makefile writer -ext/re/re.pm re extension Perl module -ext/re/re.xs re extension external subroutines -ext/re/re_comp.h re extension wrapper for regcomp.h -ext/re/re_top.h re extension symbol hiding header -ext/re/t/lexical_debug.pl generate debug output for lexical re 'debug' -ext/re/t/lexical_debug.t test that lexical re 'debug' works -ext/re/t/qr.t test that qr// is a Regexp -ext/re/t/re.t see if re pragma works -ext/re/t/re_funcs.t See if exportable 're' funcs in re.xs work -ext/re/t/re_funcs_u.t See if exportable 're' funcs in universal.c work -ext/re/t/reflags.t see if re '/xism' pragma works -ext/re/t/regop.pl generate debug output for various patterns -ext/re/t/regop.t test RE optimizations by scraping debug output -ext/re/t/strict.t see if re 'strict' subpragma works -ext/SDBM_File/biblio SDBM kit -ext/SDBM_File/CHANGES SDBM kit -ext/SDBM_File/dba.c SDBM kit -ext/SDBM_File/dbd.c SDBM kit -ext/SDBM_File/dbe.1 SDBM kit -ext/SDBM_File/dbe.c SDBM kit -ext/SDBM_File/dbu.c SDBM kit -ext/SDBM_File/grind SDBM kit -ext/SDBM_File/hash.c SDBM kit -ext/SDBM_File/Makefile.PL SDBM extension makefile writer -ext/SDBM_File/pair.c SDBM kit -ext/SDBM_File/pair.h SDBM kit -ext/SDBM_File/README SDBM kit -ext/SDBM_File/readme.ms SDBM kit -ext/SDBM_File/README.too SDBM kit -ext/SDBM_File/sdbm.3 SDBM kit -ext/SDBM_File/sdbm.c SDBM kit -ext/SDBM_File/sdbm.h SDBM kit -ext/SDBM_File/SDBM_File.pm SDBM extension Perl module -ext/SDBM_File/SDBM_File.xs SDBM extension external subroutines -ext/SDBM_File/t/constants.t See if SDBM_File constants work -ext/SDBM_File/t/corrupt.t See if SDBM_File handles corrupt files -ext/SDBM_File/t/prep.t See if SDBM_File with extra argument works -ext/SDBM_File/t/sdbm.t See if SDBM_File works -ext/SDBM_File/tune.h SDBM kit -ext/SDBM_File/typemap SDBM extension interface types -ext/SDBM_File/util.c SDBM kit -ext/Sys-Hostname/Hostname.pm Sys::Hostname extension Perl module -ext/Sys-Hostname/Hostname.xs Sys::Hostname extension external subroutines -ext/Sys-Hostname/t/Hostname.t See if Sys::Hostname works +ext/POSIX/hints/bsdos.pl Hint for POSIX for named architecture +ext/POSIX/hints/dynixptx.pl Hint for POSIX for named architecture +ext/POSIX/hints/freebsd.pl Hint for POSIX for named architecture +ext/POSIX/hints/gnukfreebsd.pl Hint for POSIX for named architecture +ext/POSIX/hints/gnuknetbsd.pl Hint for POSIX for named architecture +ext/POSIX/hints/linux.pl Hint for POSIX for named architecture +ext/POSIX/hints/mint.pl Hint for POSIX for named architecture +ext/POSIX/hints/netbsd.pl Hint for POSIX for named architecture +ext/POSIX/hints/openbsd.pl Hint for POSIX for named architecture +ext/POSIX/hints/sunos_4.pl Hint for POSIX for named architecture +ext/POSIX/hints/svr4.pl Hint for POSIX for named architecture +ext/POSIX/lib/POSIX.pm POSIX extension Perl module +ext/POSIX/lib/POSIX.pod POSIX extension documentation +ext/POSIX/Makefile.PL POSIX extension makefile writer +ext/POSIX/POSIX.xs POSIX extension external subroutines +ext/POSIX/t/export.t Test @EXPORT and @EXPORT_OK +ext/POSIX/t/fenv.t Floating-point rounding mode tests for POSIX +ext/POSIX/t/iscrash See if POSIX isxxx() crashes with threads on Win32 +ext/POSIX/t/iv_const.t See if integer constants of POSIX are IV +ext/POSIX/t/math.t Basic math tests for POSIX +ext/POSIX/t/mb.t Multibyte function tests for POSIX +ext/POSIX/t/posix.t See if POSIX works +ext/POSIX/t/sigaction.t See if POSIX::sigaction works +ext/POSIX/t/sigset.t See if POSIX::SigSet works +ext/POSIX/t/strerror_errno.t See if POSIX:strerror doesn't trash $! +ext/POSIX/t/sysconf.t See if POSIX works +ext/POSIX/t/taint.t See if POSIX works with taint +ext/POSIX/t/termios.t See if POSIX works +ext/POSIX/t/time.t See if POSIX time-related functions work +ext/POSIX/t/unimplemented.t Test the diagnostics for unimplemented functions +ext/POSIX/t/usage.t Test the diagnostics for usage messages +ext/POSIX/t/waitpid.t See if waitpid works +ext/POSIX/t/wrappers.t Test the POSIX wrapper subroutines +ext/POSIX/typemap POSIX extension interface types +ext/re/Makefile.PL re extension makefile writer +ext/re/re.pm re extension Perl module +ext/re/re.xs re extension external subroutines +ext/re/re_comp.h re extension wrapper for regcomp.h +ext/re/re_top.h re extension symbol hiding header +ext/re/t/intflags.pl Program used by intflags.t +ext/re/t/intflags.t Test that intflags are serialized properly +ext/re/t/lexical_debug.pl generate debug output for lexical re 'debug' +ext/re/t/lexical_debug.t test that lexical re 'debug' works +ext/re/t/qr.t test that qr// is a Regexp +ext/re/t/re.t see if re pragma works +ext/re/t/re_funcs.t See if exportable 're' funcs in re.xs work +ext/re/t/re_funcs_u.t See if exportable 're' funcs in universal.c work +ext/re/t/reflags.t see if re '/xism' pragma works +ext/re/t/regop.pl generate debug output for various patterns +ext/re/t/regop.t test RE optimizations by scraping debug output +ext/re/t/strict.t see if re 'strict' subpragma works +ext/SDBM_File/biblio SDBM kit +ext/SDBM_File/CHANGES SDBM kit +ext/SDBM_File/dba.c SDBM kit +ext/SDBM_File/dbd.c SDBM kit +ext/SDBM_File/dbe.1 SDBM kit +ext/SDBM_File/dbe.c SDBM kit +ext/SDBM_File/dbu.c SDBM kit +ext/SDBM_File/grind SDBM kit +ext/SDBM_File/hash.c SDBM kit +ext/SDBM_File/Makefile.PL SDBM extension makefile writer +ext/SDBM_File/pair.c SDBM kit +ext/SDBM_File/pair.h SDBM kit +ext/SDBM_File/README SDBM kit +ext/SDBM_File/readme.ms SDBM kit +ext/SDBM_File/README.too SDBM kit +ext/SDBM_File/sdbm.3 SDBM kit +ext/SDBM_File/sdbm.c SDBM kit +ext/SDBM_File/sdbm.h SDBM kit +ext/SDBM_File/SDBM_File.pm SDBM extension Perl module +ext/SDBM_File/SDBM_File.xs SDBM extension external subroutines +ext/SDBM_File/t/constants.t See if SDBM_File constants work +ext/SDBM_File/t/corrupt.t See if SDBM_File handles corrupt files +ext/SDBM_File/t/prep.t See if SDBM_File with extra argument works +ext/SDBM_File/t/sdbm.t See if SDBM_File works +ext/SDBM_File/tune.h SDBM kit +ext/SDBM_File/typemap SDBM extension interface types +ext/SDBM_File/util.c SDBM kit +ext/Sys-Hostname/Hostname.pm Sys::Hostname extension Perl module +ext/Sys-Hostname/Hostname.xs Sys::Hostname extension external subroutines +ext/Sys-Hostname/t/Hostname.t See if Sys::Hostname works ext/Tie-Hash-NamedCapture/NamedCapture.pm Implements %- and %+ behaviour ext/Tie-Hash-NamedCapture/t/tiehash.t Tests TIEHASH ext/Tie-Memoize/lib/Tie/Memoize.pm Base class for memoized tied hashes ext/Tie-Memoize/t/Tie-Memoize.t Test for Tie::Memoize -ext/VMS-DCLsym/0README.txt ReadMe file for VMS::DCLsym -ext/VMS-DCLsym/DCLsym.pm Perl access to CLI symbols -ext/VMS-DCLsym/DCLsym.xs Perl access to CLI symbols -ext/VMS-DCLsym/Makefile.PL MakeMaker driver for VMS::DCLsym -ext/VMS-DCLsym/t/vms_dclsym.t regression tests for VMS::DCLsym +ext/VMS-DCLsym/0README.txt ReadMe file for VMS::DCLsym +ext/VMS-DCLsym/DCLsym.pm Perl access to CLI symbols +ext/VMS-DCLsym/DCLsym.xs Perl access to CLI symbols +ext/VMS-DCLsym/Makefile.PL MakeMaker driver for VMS::DCLsym +ext/VMS-DCLsym/t/vms_dclsym.t regression tests for VMS::DCLsym ext/VMS-Filespec/lib/VMS/Filespec.pm VMS-Unix file syntax interconversion ext/VMS-Filespec/t/filespec.t See if VMS::Filespec functions work -ext/VMS-Stdio/0README.txt ReadMe file for VMS::Stdio -ext/VMS-Stdio/Makefile.PL MakeMaker driver for VMS::Stdio -ext/VMS-Stdio/Stdio.pm VMS options to stdio routines -ext/VMS-Stdio/Stdio.xs VMS options to stdio routines -ext/VMS-Stdio/t/vms_stdio.t regression tests for VMS::Stdio -ext/Win32CORE/Makefile.PL Win32CORE extension -ext/Win32CORE/t/win32core.t Win32CORE extension -ext/Win32CORE/Win32CORE.c Win32CORE extension -ext/Win32CORE/Win32CORE.pm Win32CORE extension (stubs for Win32 CORE subs) -ext/XS-APItest/APItest.pm XS::APItest extension -ext/XS-APItest/APItest.xs XS::APItest extension -ext/XS-APItest/APItest_BS autogenerate APItest.bs -ext/XS-APItest/core.c Test API functions when PERL_CORE is defined -ext/XS-APItest/core_or_not.inc Code common to core.c and notcore.c -ext/XS-APItest/exception.c XS::APItest extension -ext/XS-APItest/Makefile.PL XS::APItest extension -ext/XS-APItest/notcore.c Test API functions when PERL_CORE is not defined -ext/XS-APItest/numeric.xs XS::APItest wrappers for numeric.c -ext/XS-APItest/t/addissub.t test op check wrapping -ext/XS-APItest/t/arrayexpr.t test recursive descent expression parsing -ext/XS-APItest/t/autoload.t Test XS AUTOLOAD routines -ext/XS-APItest/t/BHK.pm Helper for ./blockhooks.t -ext/XS-APItest/t/Block.pm Helper for ./blockhooks.t -ext/XS-APItest/t/blockasexpr.t test recursive descent block parsing -ext/XS-APItest/t/blockhooks.t XS::APItest: tests for PL_blockhooks -ext/XS-APItest/t/blockhooks-csc.t XS::APItest: more tests for PL_blockhooks -ext/XS-APItest/t/boolean.t test SvIsBOOL -ext/XS-APItest/t/boolean-thr.t test SvIsBOOL on threads -ext/XS-APItest/t/bootstrap.t XS::APItest: test APItest.bs -ext/XS-APItest/t/call.t Test calling perl from C -ext/XS-APItest/t/call_checker.t test call checker plugin API -ext/XS-APItest/t/caller.t XS::APItest: tests for caller_cx -ext/XS-APItest/t/callregexec.t XS::APItest: tests for CALLREGEXEC() -ext/XS-APItest/t/check_warnings.t test scope of "Too late for CHECK" -ext/XS-APItest/t/cleanup.t test stack behaviour on unwinding -ext/XS-APItest/t/clone-with-stack.t test clone with CLONEf_COPY_STACKS works -ext/XS-APItest/t/cophh.t test COPHH API -ext/XS-APItest/t/coplabel.t test cop_*_label -ext/XS-APItest/t/copstash.t test alloccopstash -ext/XS-APItest/t/copyhints.t test hv_copy_hints_hv() API -ext/XS-APItest/t/customop.t XS::APItest: tests for custom ops -ext/XS-APItest/t/cv_name.t test cv_name -ext/XS-APItest/t/delimcpy.t test delimcpy -ext/XS-APItest/t/eval-filter.t Simple source filter/eval test -ext/XS-APItest/t/exception.t XS::APItest extension -ext/XS-APItest/t/extend.t test EXTEND() macro -ext/XS-APItest/t/fetch_pad_names.t Tests for UTF8 names in pad -ext/XS-APItest/t/get.t test get_sv et al. -ext/XS-APItest/t/gotosub.t XS::APItest: tests goto &xsub and hints -ext/XS-APItest/t/grok.t XS::APItest: tests for grok* functions -ext/XS-APItest/t/gv_autoload4.t XS::APItest: tests for gv_autoload4() and variants -ext/XS-APItest/t/gv_const_sv.t XS::APItest: test gv_const_sv() -ext/XS-APItest/t/gv_fetchmeth.t XS::APItest: tests for gv_fetchmeth() and variants +ext/VMS-Stdio/0README.txt ReadMe file for VMS::Stdio +ext/VMS-Stdio/Makefile.PL MakeMaker driver for VMS::Stdio +ext/VMS-Stdio/Stdio.pm VMS options to stdio routines +ext/VMS-Stdio/Stdio.xs VMS options to stdio routines +ext/VMS-Stdio/t/vms_stdio.t regression tests for VMS::Stdio +ext/Win32CORE/Makefile.PL Win32CORE extension +ext/Win32CORE/t/win32core.t Win32CORE extension +ext/Win32CORE/Win32CORE.c Win32CORE extension +ext/Win32CORE/Win32CORE.pm Win32CORE extension (stubs for Win32 CORE subs) +ext/XS-APItest/APItest.pm XS::APItest extension +ext/XS-APItest/APItest.xs XS::APItest extension +ext/XS-APItest/APItest_BS autogenerate APItest.bs +ext/XS-APItest/core.c Test API functions when PERL_CORE is defined +ext/XS-APItest/core_or_not.inc Code common to core.c and notcore.c +ext/XS-APItest/exception.c XS::APItest extension +ext/XS-APItest/Makefile.PL XS::APItest extension +ext/XS-APItest/notcore.c Test API functions when PERL_CORE is not defined +ext/XS-APItest/numeric.xs XS::APItest wrappers for numeric.c +ext/XS-APItest/t/addissub.t test op check wrapping +ext/XS-APItest/t/arrayexpr.t test recursive descent expression parsing +ext/XS-APItest/t/autoload.t Test XS AUTOLOAD routines +ext/XS-APItest/t/BHK.pm Helper for ./blockhooks.t +ext/XS-APItest/t/Block.pm Helper for ./blockhooks.t +ext/XS-APItest/t/blockasexpr.t test recursive descent block parsing +ext/XS-APItest/t/blockhooks.t XS::APItest: tests for PL_blockhooks +ext/XS-APItest/t/blockhooks-csc.t XS::APItest: more tests for PL_blockhooks +ext/XS-APItest/t/boolean.t test SvIsBOOL +ext/XS-APItest/t/boolean-thr.t test SvIsBOOL on threads +ext/XS-APItest/t/bootstrap.t XS::APItest: test APItest.bs +ext/XS-APItest/t/call.t Test calling perl from C +ext/XS-APItest/t/call_checker.t test call checker plugin API +ext/XS-APItest/t/caller.t XS::APItest: tests for caller_cx +ext/XS-APItest/t/callregexec.t XS::APItest: tests for CALLREGEXEC() +ext/XS-APItest/t/check_warnings.t test scope of "Too late for CHECK" +ext/XS-APItest/t/cleanup.t test stack behaviour on unwinding +ext/XS-APItest/t/clone-with-stack.t test clone with CLONEf_COPY_STACKS works +ext/XS-APItest/t/cophh.t test COPHH API +ext/XS-APItest/t/coplabel.t test cop_*_label +ext/XS-APItest/t/copstash.t test alloccopstash +ext/XS-APItest/t/copyhints.t test hv_copy_hints_hv() API +ext/XS-APItest/t/customop.t XS::APItest: tests for custom ops +ext/XS-APItest/t/cv_name.t test cv_name +ext/XS-APItest/t/cv_refcounted_anysv.t test CvREFCOUNTED_ANYSV +ext/XS-APItest/t/delimcpy.t test delimcpy +ext/XS-APItest/t/eval-filter.t Simple source filter/eval test +ext/XS-APItest/t/exception.t XS::APItest extension +ext/XS-APItest/t/extend.t test EXTEND() macro +ext/XS-APItest/t/fetch_pad_names.t Tests for UTF8 names in pad +ext/XS-APItest/t/get.t test get_sv et al. +ext/XS-APItest/t/gotosub.t XS::APItest: tests goto &xsub and hints +ext/XS-APItest/t/grok.t XS::APItest: tests for grok* functions +ext/XS-APItest/t/gv_autoload4.t XS::APItest: tests for gv_autoload4() and variants +ext/XS-APItest/t/gv_const_sv.t XS::APItest: test gv_const_sv() +ext/XS-APItest/t/gv_fetchmeth.t XS::APItest: tests for gv_fetchmeth() and variants ext/XS-APItest/t/gv_fetchmeth_autoload.t XS::APItest: tests for gv_fetchmeth_autoload() and variants -ext/XS-APItest/t/gv_fetchmethod_flags.t XS::APItest: tests for gv_fetchmethod_flags() and variants -ext/XS-APItest/t/gv_init.t XS::APItest: tests for gv_init and variants -ext/XS-APItest/t/handy00.t XS::APItest: tests for handy.h -ext/XS-APItest/t/handy01.t XS::APItest: tests for handy.h -ext/XS-APItest/t/handy02.t XS::APItest: tests for handy.h -ext/XS-APItest/t/handy03.t XS::APItest: tests for handy.h -ext/XS-APItest/t/handy04.t XS::APItest: tests for handy.h -ext/XS-APItest/t/handy05.t XS::APItest: tests for handy.h -ext/XS-APItest/t/handy06.t XS::APItest: tests for handy.h -ext/XS-APItest/t/handy07.t XS::APItest: tests for handy.h -ext/XS-APItest/t/handy08.t XS::APItest: tests for handy.h -ext/XS-APItest/t/handy09.t XS::APItest: tests for handy.h -ext/XS-APItest/t/handy_base.pl XS::APItest: tests for handy.h -ext/XS-APItest/t/hash.t XS::APItest: tests for hash related APIs -ext/XS-APItest/t/hv_macro.t XS::APItest: tests for low level macros used in hashing -ext/XS-APItest/t/join_with_space.t test op_convert_list -ext/XS-APItest/t/keyword_multiline.t test keyword plugin parsing across lines -ext/XS-APItest/t/keyword_plugin.t test keyword plugin mechanism +ext/XS-APItest/t/gv_fetchmethod_flags.t XS::APItest: tests for gv_fetchmethod_flags() and variants +ext/XS-APItest/t/gv_init.t XS::APItest: tests for gv_init and variants +ext/XS-APItest/t/handy00.t XS::APItest: tests for handy.h +ext/XS-APItest/t/handy01.t XS::APItest: tests for handy.h +ext/XS-APItest/t/handy02.t XS::APItest: tests for handy.h +ext/XS-APItest/t/handy03.t XS::APItest: tests for handy.h +ext/XS-APItest/t/handy04.t XS::APItest: tests for handy.h +ext/XS-APItest/t/handy05.t XS::APItest: tests for handy.h +ext/XS-APItest/t/handy06.t XS::APItest: tests for handy.h +ext/XS-APItest/t/handy07.t XS::APItest: tests for handy.h +ext/XS-APItest/t/handy08.t XS::APItest: tests for handy.h +ext/XS-APItest/t/handy09.t XS::APItest: tests for handy.h +ext/XS-APItest/t/handy_base.pl XS::APItest: tests for handy.h +ext/XS-APItest/t/hash.t XS::APItest: tests for hash related APIs +ext/XS-APItest/t/hv_macro.t XS::APItest: tests for low level macros used in hashing +ext/XS-APItest/t/join_with_space.t test op_convert_list +ext/XS-APItest/t/keyword_multiline.t test keyword plugin parsing across lines +ext/XS-APItest/t/keyword_plugin.t test keyword plugin mechanism ext/XS-APItest/t/keyword_plugin_threads.t test keyword plugin loading from multiple threads -ext/XS-APItest/t/labelconst.aux auxiliary file for label test -ext/XS-APItest/t/labelconst.t test recursive descent label parsing -ext/XS-APItest/t/labelconst_utf8.aux auxiliary file for label test in UTF-8 -ext/XS-APItest/t/lexsub.t Test XS registration of lexical subs -ext/XS-APItest/t/load-module.t test load_module() -ext/XS-APItest/t/locale.t test locale-related things -ext/XS-APItest/t/loopblock.t test recursive descent block parsing -ext/XS-APItest/t/looprest.t test recursive descent statement-sequence parsing -ext/XS-APItest/t/lvalue.t Test XS lvalue functions -ext/XS-APItest/t/magic.t test attaching, finding, and removing magic -ext/XS-APItest/t/magic_chain.t test low-level MAGIC chain handling -ext/XS-APItest/t/Markers.pm Helper for ./blockhooks.t -ext/XS-APItest/t/mro.t Test mro plugin api -ext/XS-APItest/t/multicall.t XS::APItest: test MULTICALL macros -ext/XS-APItest/t/my_cxt.t XS::APItest: test MY_CXT interface -ext/XS-APItest/t/my_exit.t XS::APItest: test my_exit -ext/XS-APItest/t/my_strtod.t XS::APItest: test my_strtod -ext/XS-APItest/t/newCONSTSUB.t XS::APItest: test newCONSTSUB(_flags) -ext/XS-APItest/t/newDEFSVOP.t XS::APItest: test newDEFSVOP -ext/XS-APItest/t/Null.pm Helper for ./blockhooks.t -ext/XS-APItest/t/op.t XS::APItest: tests for OP related APIs -ext/XS-APItest/t/op_contextualize.t test op_contextualize() API -ext/XS-APItest/t/op_list.t test OP list construction API -ext/XS-APItest/t/overload.t XS::APItest: tests for overload related APIs -ext/XS-APItest/t/pad_scalar.t Test pad_findmy_* functions -ext/XS-APItest/t/peep.t test PL_peepp/PL_rpeepp -ext/XS-APItest/t/pmflag.t Test removal of Perl_pmflag() -ext/XS-APItest/t/postinc.t test op_lvalue() -ext/XS-APItest/t/printf.t XS::APItest extension -ext/XS-APItest/t/ptr_table.t Test ptr_table_* APIs -ext/XS-APItest/t/push.t XS::APItest extension -ext/XS-APItest/t/refs.t Test typemap ref handling -ext/XS-APItest/t/rmagical.t XS::APItest extension -ext/XS-APItest/t/rv2cv_op_cv.t test rv2cv_op_cv() API -ext/XS-APItest/t/savehints.t test SAVEHINTS() API -ext/XS-APItest/t/scopelessblock.t test recursive descent statement-sequence parsing -ext/XS-APItest/t/sort.t Test sort(xs_cmp ...) -ext/XS-APItest/t/stmtasexpr.t test recursive descent statement parsing -ext/XS-APItest/t/stmtsasexpr.t test recursive descent statement-sequence parsing -ext/XS-APItest/t/stuff_modify_bug.t test for eval side-effecting source string -ext/XS-APItest/t/stuff_svcur_bug.t test for a bug in lex_stuff_pvn -ext/XS-APItest/t/subcall.t Test XSUB calls -ext/XS-APItest/t/subsignature.t Test parse_subsignature() -ext/XS-APItest/t/sv_numeq.t Test sv_numeq -ext/XS-APItest/t/sv_streq.t Test sv_streq -ext/XS-APItest/t/svcat.t Test sv_catpvn -ext/XS-APItest/t/svcatpvf.t Test sv_catpvf argument reordering -ext/XS-APItest/t/sviscow.t Test SvIsCOW -ext/XS-APItest/t/svpeek.t XS::APItest extension -ext/XS-APItest/t/svpv.t More generic SvPVbyte and SvPVutf8 tests -ext/XS-APItest/t/svpv_magic.t Test behaviour of SvPVbyte/utf8 & get magic -ext/XS-APItest/t/svsetsv.t Test behaviour of sv_setsv with/without PERL_CORE -ext/XS-APItest/t/swaplabel.t test recursive descent label parsing -ext/XS-APItest/t/swaptwostmts.t test recursive descent statement parsing -ext/XS-APItest/t/sym-hook.t Test rv2cv hooks for bareword lookup -ext/XS-APItest/t/synthetic_scope.t Test block_start/block_end/intro_my -ext/XS-APItest/t/temp_lv_sub.t XS::APItest: tests for lvalue subs returning temps -ext/XS-APItest/t/underscore_length.t Test find_rundefsv() -ext/XS-APItest/t/utf16_to_utf8.t Test behaviour of utf16_to_utf8{,reversed} -ext/XS-APItest/t/utf8.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_setup.pl Tests for code in utf8.c -ext/XS-APItest/t/utf8_to_bytes.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn00.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn01.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn02.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn03.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn04.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn05.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn06.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn07.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn08.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn09.t Tests for code in utf8.c -ext/XS-APItest/t/utf8_warn_base.pl Tests for code in utf8.c -ext/XS-APItest/t/weaken.t XS::APItest: tests for sv_rvweaken() and sv_get_backrefs() -ext/XS-APItest/t/whichsig.t XS::APItest: tests for whichsig() and variants -ext/XS-APItest/t/win32.t Test Win32 specific APIs -ext/XS-APItest/t/xs_special_subs.t Test that XS BEGIN/CHECK/INIT/END work +ext/XS-APItest/t/labelconst.aux auxiliary file for label test +ext/XS-APItest/t/labelconst.t test recursive descent label parsing +ext/XS-APItest/t/labelconst_utf8.aux auxiliary file for label test in UTF-8 +ext/XS-APItest/t/lexsub.t Test XS registration of lexical subs +ext/XS-APItest/t/load-module.t test load_module() +ext/XS-APItest/t/locale.t test locale-related things +ext/XS-APItest/t/loopblock.t test recursive descent block parsing +ext/XS-APItest/t/looprest.t test recursive descent statement-sequence parsing +ext/XS-APItest/t/lvalue.t Test XS lvalue functions +ext/XS-APItest/t/magic.t test attaching, finding, and removing magic +ext/XS-APItest/t/magic_chain.t test low-level MAGIC chain handling +ext/XS-APItest/t/Markers.pm Helper for ./blockhooks.t +ext/XS-APItest/t/mortal_destructor.t Test mortal_destructor api. +ext/XS-APItest/t/mro.t Test mro plugin api +ext/XS-APItest/t/multicall.t XS::APItest: test MULTICALL macros +ext/XS-APItest/t/my_cxt.t XS::APItest: test MY_CXT interface +ext/XS-APItest/t/my_exit.t XS::APItest: test my_exit +ext/XS-APItest/t/my_strtod.t XS::APItest: test my_strtod +ext/XS-APItest/t/newAV.t XS::APItest: test newAV* functions +ext/XS-APItest/t/newCONSTSUB.t XS::APItest: test newCONSTSUB(_flags) +ext/XS-APItest/t/newDEFSVOP.t XS::APItest: test newDEFSVOP +ext/XS-APItest/t/Null.pm Helper for ./blockhooks.t +ext/XS-APItest/t/op.t XS::APItest: tests for OP related APIs +ext/XS-APItest/t/op_contextualize.t test op_contextualize() API +ext/XS-APItest/t/op_list.t test OP list construction API +ext/XS-APItest/t/overload.t XS::APItest: tests for overload related APIs +ext/XS-APItest/t/pad_scalar.t Test pad_findmy_* functions +ext/XS-APItest/t/peep.t test PL_peepp/PL_rpeepp +ext/XS-APItest/t/pmflag.t Test removal of Perl_pmflag() +ext/XS-APItest/t/postinc.t test op_lvalue() +ext/XS-APItest/t/printf.t XS::APItest extension +ext/XS-APItest/t/ptr_table.t Test ptr_table_* APIs +ext/XS-APItest/t/push.t XS::APItest extension +ext/XS-APItest/t/refs.t Test typemap ref handling +ext/XS-APItest/t/rmagical.t XS::APItest extension +ext/XS-APItest/t/rv2cv_op_cv.t test rv2cv_op_cv() API +ext/XS-APItest/t/savehints.t test SAVEHINTS() API +ext/XS-APItest/t/savestack.t test savestack behavior, currently only in the regex engine +ext/XS-APItest/t/scopelessblock.t test recursive descent statement-sequence parsing +ext/XS-APItest/t/sort.t Test sort(xs_cmp ...) +ext/XS-APItest/t/stmtasexpr.t test recursive descent statement parsing +ext/XS-APItest/t/stmtsasexpr.t test recursive descent statement-sequence parsing +ext/XS-APItest/t/stuff_modify_bug.t test for eval side-effecting source string +ext/XS-APItest/t/stuff_svcur_bug.t test for a bug in lex_stuff_pvn +ext/XS-APItest/t/subcall.t Test XSUB calls +ext/XS-APItest/t/subsignature.t Test parse_subsignature() +ext/XS-APItest/t/sv_numeq.t Test sv_numeq +ext/XS-APItest/t/sv_streq.t Test sv_streq +ext/XS-APItest/t/svcat.t Test sv_catpvn +ext/XS-APItest/t/svcatpvf.t Test sv_catpvf argument reordering +ext/XS-APItest/t/sviscow.t Test SvIsCOW +ext/XS-APItest/t/svpeek.t XS::APItest extension +ext/XS-APItest/t/svpv.t More generic SvPVbyte and SvPVutf8 tests +ext/XS-APItest/t/svpv_magic.t Test behaviour of SvPVbyte/utf8 & get magic +ext/XS-APItest/t/svsetsv.t Test behaviour of sv_setsv with/without PERL_CORE +ext/XS-APItest/t/swaplabel.t test recursive descent label parsing +ext/XS-APItest/t/swaptwostmts.t test recursive descent statement parsing +ext/XS-APItest/t/sym-hook.t Test rv2cv hooks for bareword lookup +ext/XS-APItest/t/synthetic_scope.t Test block_start/block_end/intro_my +ext/XS-APItest/t/temp_lv_sub.t XS::APItest: tests for lvalue subs returning temps +ext/XS-APItest/t/underscore_length.t Test find_rundefsv() +ext/XS-APItest/t/utf16_to_utf8.t Test behaviour of utf16_to_utf8{,reversed} +ext/XS-APItest/t/utf8.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_setup.pl Tests for code in utf8.c +ext/XS-APItest/t/utf8_to_bytes.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn00.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn01.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn02.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn03.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn04.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn05.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn06.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn07.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn08.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn09.t Tests for code in utf8.c +ext/XS-APItest/t/utf8_warn_base.pl Tests for code in utf8.c +ext/XS-APItest/t/weaken.t XS::APItest: tests for sv_rvweaken() and sv_get_backrefs() +ext/XS-APItest/t/whichsig.t XS::APItest: tests for whichsig() and variants +ext/XS-APItest/t/win32.t Test Win32 specific APIs +ext/XS-APItest/t/xs_special_subs.t Test that XS BEGIN/CHECK/INIT/END work ext/XS-APItest/t/xs_special_subs_require.t for require too -ext/XS-APItest/t/xsub_h.t Tests for XSUB.h +ext/XS-APItest/t/xsub_h.t Tests for XSUB.h ext/XS-APItest/typemap -ext/XS-APItest/XSUB-redefined-macros.xs XS code needing redefined macros. -ext/XS-APItest/XSUB-undef-XS_VERSION.xs XS code needing #undef XS_VERSION -ext/XS-Typemap/Makefile.PL XS::Typemap extension -ext/XS-Typemap/README XS::Typemap extension -ext/XS-Typemap/stdio.c XS::Typemap extension -ext/XS-Typemap/t/Typemap.t test that typemaps work -ext/XS-Typemap/Typemap.pm XS::Typemap extension -ext/XS-Typemap/Typemap.xs XS::Typemap extension -EXTERN.h Included before foreign .h files -fakesdio.h stdio in terms of PerlIO -feature.h Feature header -form.h Public declarations for formats -generate_uudmap.c Generate uudmap.h, the uuencode decoding map -git_version.h Pre-generated git_version.h for OpenBSD -globals.c File to declare global symbols (for shared library) -globvar.sym Global variables that need hiding when embedded -gv.c Glob value code -gv.h Glob value header -h2pl/cbreak.pl cbreak routines using .ph -h2pl/cbreak2.pl cbreak routines using .pl -h2pl/eg/sizeof.ph Sample sizeof array initialization -h2pl/eg/sys/errno.pl Sample translated errno.pl -h2pl/eg/sys/ioctl.pl Sample translated ioctl.pl -h2pl/eg/sysexits.pl Sample translated sysexits.pl -h2pl/getioctlsizes Program to extract types from ioctl.h -h2pl/mksizes Program to make %sizeof array -h2pl/mkvars Program to make .pl from .ph files -h2pl/README How to turn .ph files into .pl files -h2pl/tcbreak cbreak test routine using .ph -h2pl/tcbreak2 cbreak test routine using .pl -haiku/Haiku/Haiku.pm Haiku extension Perl module -haiku/Haiku/Haiku.xs Haiku extension external subroutines -haiku/Haiku/Makefile.PL Haiku extension makefile writer -haiku/haikuish.h Header for the Haiku port -handy.h Handy definitions -hints/aix.sh Hints for named architecture -hints/aix_3.sh Hints for named architecture -hints/aix_4.sh Hints for named architecture -hints/altos486.sh Hints for named architecture -hints/amigaos.sh Hints for named architecture -hints/atheos.sh Hints for named architecture -hints/aux_3.sh Hints for named architecture -hints/bitrig.sh Hints for named architecture -hints/broken-db.msg Warning message for systems with broken DB library -hints/bsdos.sh Hints for named architecture -hints/catamount.sh Hints for named architecture -hints/convexos.sh Hints for named architecture -hints/cxux.sh Hints for named architecture -hints/cygwin.sh Hints for named architecture -hints/darwin.sh Hints for named architecture -hints/dcosx.sh Hints for named architecture -hints/dec_osf.sh Hints for named architecture -hints/dragonfly.sh Hints for named architecture -hints/dynix.sh Hints for named architecture -hints/dynixptx.sh Hints for named architecture -hints/epix.sh Hints for named architecture -hints/esix4.sh Hints for named architecture -hints/fps.sh Hints for named architecture -hints/freebsd.sh Hints for named architecture -hints/freemint.sh Hints for named architecture -hints/gnu.sh Hints for named architecture -hints/gnukfreebsd.sh Hints for named architecture -hints/gnuknetbsd.sh Hints for named architecture -hints/greenhills.sh Hints for named architecture -hints/haiku.sh Hints for named architecture -hints/hpux.sh Hints for named architecture -hints/i386.sh Hints for named architecture -hints/interix.sh Hints for named architecture -hints/irix_4.sh Hints for named architecture -hints/irix_5.sh Hints for named architecture -hints/irix_6.sh Hints for named architecture -hints/irix_6_0.sh Hints for named architecture -hints/irix_6_1.sh Hints for named architecture -hints/isc.sh Hints for named architecture -hints/isc_2.sh Hints for named architecture -hints/linux.sh Hints for named architecture -hints/linux-android.sh Hints for named architecture -hints/lynxos.sh Hints for named architecture -hints/midnightbsd.sh Hints for named architecture -hints/minix.sh Hints for named architecture -hints/mips.sh Hints for named architecture -hints/mirbsd.sh Hints for named architecture -hints/mpc.sh Hints for named architecture -hints/ncr_tower.sh Hints for named architecture -hints/netbsd.sh Hints for named architecture -hints/newsos4.sh Hints for named architecture -hints/nonstopux.sh Hints for named architecture -hints/openbsd.sh Hints for named architecture -hints/opus.sh Hints for named architecture -hints/os2.sh Hints for named architecture -hints/os390.sh Hints for named architecture -hints/os400.sh Hints for named architecture -hints/posix-bc.sh Hints for named architecture -hints/qnx.sh Hints for named architecture -hints/README.hints Notes about hints -hints/riscos.sh Hints for named architecture -hints/sco.sh Hints for named architecture -hints/sco_2_3_0.sh Hints for named architecture -hints/sco_2_3_1.sh Hints for named architecture -hints/sco_2_3_2.sh Hints for named architecture -hints/sco_2_3_3.sh Hints for named architecture -hints/sco_2_3_4.sh Hints for named architecture -hints/solaris_2.sh Hints for named architecture -hints/stellar.sh Hints for named architecture -hints/sunos_4_0.sh Hints for named architecture -hints/sunos_4_1.sh Hints for named architecture -hints/super-ux.sh Hints for named architecture -hints/svr4.sh Hints for named architecture -hints/svr5.sh Hints for named architecture -hints/t001.c Test case for gcc bug -hints/ti1500.sh Hints for named architecture -hints/ultrix_4.sh Hints for named architecture -hints/umips.sh Hints for named architecture -hints/unicos.sh Hints for named architecture -hints/unicosmk.sh Hints for named architecture -hints/unisysdynix.sh Hints for named architecture -hints/utekv.sh Hints for named architecture -hints/vos.sh Hints for named architecture -hv.c Hash value code -hv.h Hash value header -hv_func.h Hash value static inline function header -hv_macro.h Macros used by hv_func.h -inline.h Static inline functions -INSTALL Detailed installation instructions -install_lib.pl functions shared between install* scripts -installhtml Perl script to install html files for pods -installman Perl script to install man pages for pods -installperl Perl script to do "make install" dirty work -INTERN.h Included before domestic .h files -intrpvar.h Variables held in each interpreter instance -invlist_inline.h Inline functions for handling inversion lists -iperlsys.h Perl's interface to the system -keywords.c Perl_keyword(), generated by regen/keywords.pl -keywords.h The keyword numbers -l1_char_class_tab.h 256 word bit table of character classes (for handy.h) -lib/_charnames.pm Character names -lib/AnyDBM_File.pm Perl module to emulate dbmopen -lib/AnyDBM_File.t See if AnyDBM_File works -lib/B/Deparse.pm Compiler Deparse backend -lib/B/Deparse.t See if B::Deparse works -lib/B/Deparse-core.t See if B::Deparse knows when to use CORE:: -lib/B/Deparse-subclass.t See if B::Deparse can be subclassed -lib/B/Op_private.pm Definitions of OP op_private flags -lib/Benchmark.pm Measure execution time -lib/Benchmark.t See if Benchmark works -lib/blib.pm For "use blib" -lib/blib.t blib.pm test -lib/builtin.pm builtin function namespace -lib/builtin.t test builtin function namespace -lib/bytes.pm Pragma to enable byte operations -lib/bytes.t bytes.pm test -lib/bytes_heavy.pl Support routines for byte pragma -lib/charnames.pm Character names -lib/charnames.t See if character names work -lib/Class/Struct.pm Declare struct-like datatypes as Perl classes -lib/Class/Struct.t See if Class::Struct works -lib/Config.t See if Config works -lib/Config/Extensions.pm Convenient hash lookup for built extensions -lib/Config/Extensions.t See if Config::Extensions works -lib/Config_git.pl Pre-generated Config_git.pl for OpenBSD -lib/CORE.pod document the CORE namespace -lib/DB.pm Debugger API (draft) -lib/DB.t See if DB works -lib/DBM_Filter.pm DBM Filter module -lib/DBM_Filter/compress.pm DBM Filter to compress keys/values -lib/DBM_Filter/encode.pm DBM Filter for encoding -lib/DBM_Filter/int32.pm DBM Filter for creating int32 keys/values -lib/DBM_Filter/null.pm DBM Filter for null termination -lib/DBM_Filter/t/01error.t test DBM_Filter::null -lib/DBM_Filter/t/02core.t test DBM_Filter::null -lib/DBM_Filter/t/compress.t test DBM_Filter::compress -lib/DBM_Filter/t/encode.t test DBM_Filter::encode -lib/DBM_Filter/t/int32.t test DBM_Filter::int32 -lib/DBM_Filter/t/null.t test DBM_Filter::null -lib/DBM_Filter/t/utf8.t test DBM_Filter::utf8 -lib/DBM_Filter/utf8.pm DBM Filter for UTF-8 Encoding -lib/dbm_filter_util.pl Utility functions used by DBM Filter tests -lib/deprecate.pm A pragma for deprecating modules from the core. -lib/diagnostics.pm Print verbose diagnostics -lib/diagnostics.t See if diagnostics.pm works -lib/DirHandle.pm like FileHandle only for directories -lib/DirHandle.t See if DirHandle works -lib/dumpvar.pl A variable dumper -lib/dumpvar.t A variable dumper tester -lib/English.pm Readable aliases for short variables -lib/English.t See if English works -lib/ExtUtils/Embed.pm Utilities for embedding Perl in C programs -lib/ExtUtils/t/Embed.t See if ExtUtils::Embed and embedding works -lib/ExtUtils/typemap Extension interface types -lib/ExtUtils/XSSymSet.pm on VMS, manage linker symbols when building extensions -lib/feature.pm Pragma to enable new syntax -lib/feature.t See if features work -lib/feature/unicode_strings.t See if feature "unicode_strings" work -lib/File/Basename.pm Emulate the basename program -lib/File/Basename.t See if File::Basename works -lib/File/Compare.pm Emulation of cmp command -lib/File/Compare.t See if File::Compare works -lib/File/Copy.pm Emulation of cp command -lib/File/Copy.t See if File::Copy works -lib/File/stat.pm By-name interface to Perl's builtin stat -lib/File/stat.t See if File::stat works -lib/File/stat-7896.t A test for ID 20011110.104 -lib/FileHandle.pm Backward-compatible front end to IO extension -lib/FileHandle.t See if FileHandle works -lib/filetest.pm For "use filetest" -lib/filetest.t See if filetest works -lib/Getopt/Std.pm Fetch command options (getopt, getopts) -lib/Getopt/Std.t See if Getopt::Std and Getopt::Long work -lib/h2ph.t See if h2ph works like it should -lib/h2xs.t See if h2xs produces expected lists of files -lib/integer.pm For "use integer" -lib/integer.t For "use integer" testing -lib/Internals.pod Document the Internals namespace (implemented by universal.c) -lib/Internals.t For Internals::* testing -lib/less.pm For "use less" -lib/less.t See if less support works -lib/locale.pm For "use locale" -lib/locale.t See if locale support works -lib/locale_threads.t Tes locale and threads interactions -lib/meta_notation.pm Helper for certain /lib .pm's -lib/meta_notation.t See if meta_notation.t works -lib/Net/hostent.pm By-name interface to Perl's builtin gethost* -lib/Net/hostent.t See if Net::hostent works -lib/Net/netent.pm By-name interface to Perl's builtin getnet* -lib/Net/netent.t See if Net::netent works -lib/Net/protoent.pm By-name interface to Perl's builtin getproto* -lib/Net/protoent.t See if Net::protoent works -lib/Net/servent.pm By-name interface to Perl's builtin getserv* -lib/Net/servent.t See if Net::servtent works -lib/open.pm Pragma to specify default I/O layers -lib/open.t See if the open pragma works -lib/overload.pm Module for overloading perl operators -lib/overload.t See if operator overloading works -lib/overload/numbers.pm Helper for overloading pragma -lib/overload64.t See if operator overloading works with 64-bit ints -lib/overloading.pm Pragma to lexically control overloading -lib/overloading.t Tests for overloading.pm -lib/perl5db.pl Perl debugging routines -lib/perl5db.t Tests for the Perl debugger -lib/perl5db/t/break-on-dot Test script used by perl5db.t -lib/perl5db/t/breakpoint-bug Test script used by perl5db.t -lib/perl5db/t/disable-breakpoints-1 Test script used by perl5db.t -lib/perl5db/t/disable-breakpoints-2 Test script used by perl5db.t -lib/perl5db/t/disable-breakpoints-3 Test script used by perl5db.t -lib/perl5db/t/EnableModule.pm Tests for the Perl debugger -lib/perl5db/t/eval-line-bug Tests for the Perl debugger -lib/perl5db/t/fact Tests for the Perl debugger -lib/perl5db/t/filename-line-breakpoint Tests for the Perl debugger -lib/perl5db/t/gh-17660 Tests for the Perl debugger -lib/perl5db/t/gh-17661 Tests for the Perl debugger -lib/perl5db/t/gh-17661b Tests for the Perl debugger -lib/perl5db/t/load-modules Tests for the Perl debugger -lib/perl5db/t/lsub-n Test script used by perl5db.t -lib/perl5db/t/lvalue-bug Tests for the Perl debugger -lib/perl5db/t/MyModule.pm Tests for the Perl debugger -lib/perl5db/t/proxy-constants Tests for the Perl debugger -lib/perl5db/t/rt-104168 Tests for the Perl debugger -lib/perl5db/t/rt-120174 Tests for the Perl debugger +ext/XS-APItest/XSUB-redefined-macros.xs XS code needing redefined macros. +ext/XS-APItest/XSUB-undef-XS_VERSION.xs XS code needing #undef XS_VERSION +ext/XS-Typemap/Makefile.PL XS::Typemap extension +ext/XS-Typemap/README XS::Typemap extension +ext/XS-Typemap/stdio.c XS::Typemap extension +ext/XS-Typemap/t/Typemap.t test that typemaps work +ext/XS-Typemap/Typemap.pm XS::Typemap extension +ext/XS-Typemap/Typemap.xs XS::Typemap extension +h2pl/cbreak.pl cbreak routines using .ph +h2pl/cbreak2.pl cbreak routines using .pl +h2pl/eg/sizeof.ph Sample sizeof array initialization +h2pl/eg/sys/errno.pl Sample translated errno.pl +h2pl/eg/sys/ioctl.pl Sample translated ioctl.pl +h2pl/eg/sysexits.pl Sample translated sysexits.pl +h2pl/getioctlsizes Program to extract types from ioctl.h +h2pl/mksizes Program to make %sizeof array +h2pl/mkvars Program to make .pl from .ph files +h2pl/README How to turn .ph files into .pl files +h2pl/tcbreak cbreak test routine using .ph +h2pl/tcbreak2 cbreak test routine using .pl +haiku/Haiku/Haiku.pm Haiku extension Perl module +haiku/Haiku/Haiku.xs Haiku extension external subroutines +haiku/Haiku/Makefile.PL Haiku extension makefile writer +haiku/haikuish.h Header for the Haiku port +hints/aix.sh Hints for named architecture +hints/aix_3.sh Hints for named architecture +hints/aix_4.sh Hints for named architecture +hints/altos486.sh Hints for named architecture +hints/amigaos.sh Hints for named architecture +hints/atheos.sh Hints for named architecture +hints/aux_3.sh Hints for named architecture +hints/bitrig.sh Hints for named architecture +hints/broken-db.msg Warning message for systems with broken DB library +hints/bsdos.sh Hints for named architecture +hints/catamount.sh Hints for named architecture +hints/convexos.sh Hints for named architecture +hints/cxux.sh Hints for named architecture +hints/cygwin.sh Hints for named architecture +hints/darwin.sh Hints for named architecture +hints/dcosx.sh Hints for named architecture +hints/dec_osf.sh Hints for named architecture +hints/dragonfly.sh Hints for named architecture +hints/dynix.sh Hints for named architecture +hints/dynixptx.sh Hints for named architecture +hints/epix.sh Hints for named architecture +hints/esix4.sh Hints for named architecture +hints/fps.sh Hints for named architecture +hints/freebsd.sh Hints for named architecture +hints/freemint.sh Hints for named architecture +hints/gnu.sh Hints for named architecture +hints/gnukfreebsd.sh Hints for named architecture +hints/gnuknetbsd.sh Hints for named architecture +hints/greenhills.sh Hints for named architecture +hints/haiku.sh Hints for named architecture +hints/hpux.sh Hints for named architecture +hints/i386.sh Hints for named architecture +hints/interix.sh Hints for named architecture +hints/irix_4.sh Hints for named architecture +hints/irix_5.sh Hints for named architecture +hints/irix_6.sh Hints for named architecture +hints/irix_6_0.sh Hints for named architecture +hints/irix_6_1.sh Hints for named architecture +hints/isc.sh Hints for named architecture +hints/isc_2.sh Hints for named architecture +hints/linux.sh Hints for named architecture +hints/linux-android.sh Hints for named architecture +hints/lynxos.sh Hints for named architecture +hints/midnightbsd.sh Hints for named architecture +hints/minix.sh Hints for named architecture +hints/mips.sh Hints for named architecture +hints/mirbsd.sh Hints for named architecture +hints/mpc.sh Hints for named architecture +hints/ncr_tower.sh Hints for named architecture +hints/netbsd.sh Hints for named architecture +hints/newsos4.sh Hints for named architecture +hints/nonstopux.sh Hints for named architecture +hints/openbsd.sh Hints for named architecture +hints/opus.sh Hints for named architecture +hints/os2.sh Hints for named architecture +hints/os390.sh Hints for named architecture +hints/os400.sh Hints for named architecture +hints/posix-bc.sh Hints for named architecture +hints/qnx.sh Hints for named architecture +hints/README.hints Notes about hints +hints/riscos.sh Hints for named architecture +hints/sco.sh Hints for named architecture +hints/sco_2_3_0.sh Hints for named architecture +hints/sco_2_3_1.sh Hints for named architecture +hints/sco_2_3_2.sh Hints for named architecture +hints/sco_2_3_3.sh Hints for named architecture +hints/sco_2_3_4.sh Hints for named architecture +hints/solaris_2.sh Hints for named architecture +hints/stellar.sh Hints for named architecture +hints/sunos_4_0.sh Hints for named architecture +hints/sunos_4_1.sh Hints for named architecture +hints/super-ux.sh Hints for named architecture +hints/svr4.sh Hints for named architecture +hints/svr5.sh Hints for named architecture +hints/t001.c Test case for gcc bug +hints/ti1500.sh Hints for named architecture +hints/umips.sh Hints for named architecture +hints/unicos.sh Hints for named architecture +hints/unicosmk.sh Hints for named architecture +hints/unisysdynix.sh Hints for named architecture +hints/utekv.sh Hints for named architecture +hints/vos.sh Hints for named architecture +lib/_charnames.pm Character names +lib/AnyDBM_File.pm Perl module to emulate dbmopen +lib/AnyDBM_File.t See if AnyDBM_File works +lib/B/Deparse.pm Compiler Deparse backend +lib/B/Deparse.t See if B::Deparse works +lib/B/Deparse-core.t See if B::Deparse knows when to use CORE:: +lib/B/Deparse-subclass.t See if B::Deparse can be subclassed +lib/B/Op_private.pm Definitions of OP op_private flags +lib/Benchmark.pm Measure execution time +lib/Benchmark.t See if Benchmark works +lib/blib.pm For "use blib" +lib/blib.t blib.pm test +lib/builtin.pm builtin function namespace +lib/builtin.t test builtin function namespace +lib/bytes.pm Pragma to enable byte operations +lib/bytes.t bytes.pm test +lib/bytes_heavy.pl Support routines for byte pragma +lib/charnames.pm Character names +lib/charnames.t See if character names work +lib/Class/Struct.pm Declare struct-like datatypes as Perl classes +lib/Class/Struct.t See if Class::Struct works +lib/Config.t See if Config works +lib/Config/Extensions.pm Convenient hash lookup for built extensions +lib/Config/Extensions.t See if Config::Extensions works +lib/Config_git.pl Pre-generated Config_git.pl for OpenBSD +lib/CORE.pod document the CORE namespace +lib/DB.pm Debugger API (draft) +lib/DB.t See if DB works +lib/DBM_Filter.pm DBM Filter module +lib/DBM_Filter/compress.pm DBM Filter to compress keys/values +lib/DBM_Filter/encode.pm DBM Filter for encoding +lib/DBM_Filter/int32.pm DBM Filter for creating int32 keys/values +lib/DBM_Filter/null.pm DBM Filter for null termination +lib/DBM_Filter/t/01error.t test DBM_Filter::null +lib/DBM_Filter/t/02core.t test DBM_Filter::null +lib/DBM_Filter/t/compress.t test DBM_Filter::compress +lib/DBM_Filter/t/encode.t test DBM_Filter::encode +lib/DBM_Filter/t/int32.t test DBM_Filter::int32 +lib/DBM_Filter/t/null.t test DBM_Filter::null +lib/DBM_Filter/t/utf8.t test DBM_Filter::utf8 +lib/DBM_Filter/utf8.pm DBM Filter for UTF-8 Encoding +lib/dbm_filter_util.pl Utility functions used by DBM Filter tests +lib/deprecate.pm A pragma for deprecating modules from the core. +lib/diagnostics.pm Print verbose diagnostics +lib/diagnostics.t See if diagnostics.pm works +lib/DirHandle.pm like FileHandle only for directories +lib/DirHandle.t See if DirHandle works +lib/dumpvar.pl A variable dumper +lib/dumpvar.t A variable dumper tester +lib/English.pm Readable aliases for short variables +lib/English.t See if English works +lib/ExtUtils/Embed.pm Utilities for embedding Perl in C programs +lib/ExtUtils/t/Embed.t See if ExtUtils::Embed and embedding works +lib/ExtUtils/typemap Extension interface types +lib/ExtUtils/XSSymSet.pm on VMS, manage linker symbols when building extensions +lib/feature.pm Pragma to enable new syntax +lib/feature.t See if features work +lib/feature/unicode_strings.t See if feature "unicode_strings" work +lib/File/Basename.pm Emulate the basename program +lib/File/Basename.t See if File::Basename works +lib/File/Compare.pm Emulation of cmp command +lib/File/Compare.t See if File::Compare works +lib/File/Copy.pm Emulation of cp command +lib/File/Copy.t See if File::Copy works +lib/File/stat.pm By-name interface to Perl's builtin stat +lib/File/stat.t See if File::stat works +lib/File/stat-7896.t A test for ID 20011110.104 +lib/FileHandle.pm Backward-compatible front end to IO extension +lib/FileHandle.t See if FileHandle works +lib/filetest.pm For "use filetest" +lib/filetest.t See if filetest works +lib/Getopt/Std.pm Fetch command options (getopt, getopts) +lib/Getopt/Std.t See if Getopt::Std and Getopt::Long work +lib/h2ph.t See if h2ph works like it should +lib/h2xs.t See if h2xs produces expected lists of files +lib/integer.pm For "use integer" +lib/integer.t For "use integer" testing +lib/Internals.pod Document the Internals namespace (implemented by universal.c) +lib/Internals.t For Internals::* testing +lib/less.pm For "use less" +lib/less.t See if less support works +lib/locale.pm For "use locale" +lib/locale.t See if locale support works +lib/locale_threads.t Tes locale and threads interactions +lib/meta_notation.pm Helper for certain /lib .pm's +lib/meta_notation.t See if meta_notation.t works +lib/Net/hostent.pm By-name interface to Perl's builtin gethost* +lib/Net/hostent.t See if Net::hostent works +lib/Net/netent.pm By-name interface to Perl's builtin getnet* +lib/Net/netent.t See if Net::netent works +lib/Net/protoent.pm By-name interface to Perl's builtin getproto* +lib/Net/protoent.t See if Net::protoent works +lib/Net/servent.pm By-name interface to Perl's builtin getserv* +lib/Net/servent.t See if Net::servtent works +lib/open.pm Pragma to specify default I/O layers +lib/open.t See if the open pragma works +lib/overload.pm Module for overloading perl operators +lib/overload.t See if operator overloading works +lib/overload/numbers.pm Helper for overloading pragma +lib/overload64.t See if operator overloading works with 64-bit ints +lib/overloading.pm Pragma to lexically control overloading +lib/overloading.t Tests for overloading.pm +lib/perl5db.pl Perl debugging routines +lib/perl5db.t Tests for the Perl debugger +lib/perl5db/t/break-on-dot Test script used by perl5db.t +lib/perl5db/t/breakpoint-bug Test script used by perl5db.t +lib/perl5db/t/disable-breakpoints-1 Test script used by perl5db.t +lib/perl5db/t/disable-breakpoints-2 Test script used by perl5db.t +lib/perl5db/t/disable-breakpoints-3 Test script used by perl5db.t +lib/perl5db/t/EnableModule.pm Tests for the Perl debugger +lib/perl5db/t/eval-line-bug Tests for the Perl debugger +lib/perl5db/t/fact Tests for the Perl debugger +lib/perl5db/t/filename-line-breakpoint Tests for the Perl debugger +lib/perl5db/t/gh-17660 Tests for the Perl debugger +lib/perl5db/t/gh-17661 Tests for the Perl debugger +lib/perl5db/t/gh-17661b Tests for the Perl debugger +lib/perl5db/t/load-modules Tests for the Perl debugger +lib/perl5db/t/lsub-n Test script used by perl5db.t +lib/perl5db/t/lvalue-bug Tests for the Perl debugger +lib/perl5db/t/MyModule.pm Tests for the Perl debugger +lib/perl5db/t/proxy-constants Tests for the Perl debugger +lib/perl5db/t/rt-104168 Tests for the Perl debugger +lib/perl5db/t/rt-120174 Tests for the Perl debugger lib/perl5db/t/rt-121509-restart-after-chdir Tests for the Perl debugger -lib/perl5db/t/rt-124203 Test threads in the Perl debugger -lib/perl5db/t/rt-124203b Test threads in the Perl debugger -lib/perl5db/t/rt-61222 Tests for the Perl debugger -lib/perl5db/t/rt-66110 Tests for the Perl debugger -lib/perl5db/t/source-cmd-test.perldb Tests for the Perl debugger +lib/perl5db/t/rt-124203 Test threads in the Perl debugger +lib/perl5db/t/rt-124203b Test threads in the Perl debugger +lib/perl5db/t/rt-61222 Tests for the Perl debugger +lib/perl5db/t/rt-66110 Tests for the Perl debugger +lib/perl5db/t/source-cmd-test.perldb Tests for the Perl debugger lib/perl5db/t/source-cmd-test-no-q.perldb Tests for the Perl debugger -lib/perl5db/t/symbol-table-bug Tests for the Perl debugger -lib/perl5db/t/taint Tests for the Perl debugger -lib/perl5db/t/test-a-statement-1 Tests for the Perl debugger -lib/perl5db/t/test-a-statement-2 Tests for the Perl debugger -lib/perl5db/t/test-a-statement-3 Tests for the Perl debugger -lib/perl5db/t/test-dieLevel-option-1 Tests for the Perl debugger -lib/perl5db/t/test-frame-option-1 Tests for the Perl debugger -lib/perl5db/t/test-l-statement-1 Tests for the Perl debugger -lib/perl5db/t/test-l-statement-2 Tests for the Perl debugger -lib/perl5db/t/test-m-statement-1 Tests for the Perl debugger +lib/perl5db/t/symbol-table-bug Tests for the Perl debugger +lib/perl5db/t/taint Tests for the Perl debugger +lib/perl5db/t/test-a-statement-1 Tests for the Perl debugger +lib/perl5db/t/test-a-statement-2 Tests for the Perl debugger +lib/perl5db/t/test-a-statement-3 Tests for the Perl debugger +lib/perl5db/t/test-dieLevel-option-1 Tests for the Perl debugger +lib/perl5db/t/test-frame-option-1 Tests for the Perl debugger +lib/perl5db/t/test-l-statement-1 Tests for the Perl debugger +lib/perl5db/t/test-l-statement-2 Tests for the Perl debugger +lib/perl5db/t/test-m-statement-1 Tests for the Perl debugger lib/perl5db/t/test-passing-at-underscore-to-x-etc Tests for the Perl debugger -lib/perl5db/t/test-PrintRet-option-1 Tests for the Perl debugger -lib/perl5db/t/test-r-statement Tests for the Perl debugger -lib/perl5db/t/test-w-statement-1 Tests for the Perl debugger -lib/perl5db/t/test-warnLevel-option-1 Tests for the Perl debugger -lib/perl5db/t/uncalled-subroutine Tests for the Perl debugger -lib/perl5db/t/with-subroutine Tests for the Perl debugger -lib/perlbug.t Tests for the Perl bug reporter -lib/PerlIO.pm PerlIO support module -lib/Pod/t/Usage.t See if Pod::Usage works -lib/SelectSaver.pm Enforce proper select scoping -lib/SelectSaver.t See if SelectSaver works -lib/sigtrap.pm For trapping an abort and giving traceback -lib/sigtrap.t See if sigtrap works -lib/sort.pm For "use sort" -lib/sort.t See if "use sort" works -lib/strict.pm For "use strict" -lib/strict.t See if strictures work -lib/subs.pm Declare overriding subs -lib/subs.t See if subroutine pseudo-importation works -lib/Symbol.pm Symbol table manipulation routines -lib/Symbol.t See if Symbol works -lib/Thread.pm Thread extensions frontend -lib/Thread.t Thread extensions frontend tests -lib/Tie/Array.pm Base class for tied arrays -lib/Tie/Array/push.t Test for Tie::Array -lib/Tie/Array/splice.t Test for Tie::Array::SPLICE -lib/Tie/Array/std.t Test for Tie::StdArray -lib/Tie/Array/stdpush.t Test for Tie::StdArray -lib/Tie/ExtraHash.t Test for Tie::ExtraHash (in Tie/Hash.pm) -lib/Tie/Handle.pm Base class for tied handles -lib/Tie/Handle/stdhandle.t Test for Tie::StdHandle +lib/perl5db/t/test-PrintRet-option-1 Tests for the Perl debugger +lib/perl5db/t/test-r-statement Tests for the Perl debugger +lib/perl5db/t/test-w-statement-1 Tests for the Perl debugger +lib/perl5db/t/test-warnLevel-option-1 Tests for the Perl debugger +lib/perl5db/t/uncalled-subroutine Tests for the Perl debugger +lib/perl5db/t/with-subroutine Tests for the Perl debugger +lib/perlbug.t Tests for the Perl bug reporter +lib/PerlIO.pm PerlIO support module +lib/Pod/t/Usage.t See if Pod::Usage works +lib/SelectSaver.pm Enforce proper select scoping +lib/SelectSaver.t See if SelectSaver works +lib/sigtrap.pm For trapping an abort and giving traceback +lib/sigtrap.t See if sigtrap works +lib/sort.pm For "use sort" +lib/sort.t See if "use sort" works +lib/strict.pm For "use strict" +lib/strict.t See if strictures work +lib/subs.pm Declare overriding subs +lib/subs.t See if subroutine pseudo-importation works +lib/Symbol.pm Symbol table manipulation routines +lib/Symbol.t See if Symbol works +lib/Thread.pm Thread extensions frontend +lib/Thread.t Thread extensions frontend tests +lib/Tie/Array.pm Base class for tied arrays +lib/Tie/Array/push.t Test for Tie::Array +lib/Tie/Array/splice.t Test for Tie::Array::SPLICE +lib/Tie/Array/std.t Test for Tie::StdArray +lib/Tie/Array/stdpush.t Test for Tie::StdArray +lib/Tie/ExtraHash.t Test for Tie::ExtraHash (in Tie/Hash.pm) +lib/Tie/Handle.pm Base class for tied handles +lib/Tie/Handle/stdhandle.t Test for Tie::StdHandle lib/Tie/Handle/stdhandle_from_handle.t Test for Tie::StdHandle/Handle backwards compat -lib/Tie/Hash.pm Base class for tied hashes -lib/Tie/Hash.t See if Tie::Hash works -lib/Tie/Scalar.pm Base class for tied scalars -lib/Tie/Scalar.t See if Tie::Scalar works -lib/Tie/StdHandle.pm Tie::StdHandle -lib/Tie/SubstrHash.pm Compact hash for known key, value and table size -lib/Tie/SubstrHash.t Test for Tie::SubstrHash -lib/Time/gmtime.pm By-name interface to Perl's builtin gmtime -lib/Time/gmtime.t Test for Time::gmtime -lib/Time/localtime.pm By-name interface to Perl's builtin localtime -lib/Time/localtime.t Test for Time::localtime -lib/Time/tm.pm Internal object for Time::{gm,local}time -lib/Unicode/README Explanation what happened to lib/unicode. -lib/Unicode/UCD.pm Unicode character database -lib/Unicode/UCD.t See if Unicode character database works +lib/Tie/Hash.pm Base class for tied hashes +lib/Tie/Hash.t See if Tie::Hash works +lib/Tie/Scalar.pm Base class for tied scalars +lib/Tie/Scalar.t See if Tie::Scalar works +lib/Tie/StdHandle.pm Tie::StdHandle +lib/Tie/SubstrHash.pm Compact hash for known key, value and table size +lib/Tie/SubstrHash.t Test for Tie::SubstrHash +lib/Time/gmtime.pm By-name interface to Perl's builtin gmtime +lib/Time/gmtime.t Test for Time::gmtime +lib/Time/localtime.pm By-name interface to Perl's builtin localtime +lib/Time/localtime.t Test for Time::localtime +lib/Time/tm.pm Internal object for Time::{gm,local}time +lib/Unicode/README Explanation what happened to lib/unicode. +lib/Unicode/testnorm.t Run official Unicode Consortium's normalization tests +lib/Unicode/UCD.pm Unicode character database +lib/Unicode/UCD.t See if Unicode character database works lib/unicore/ArabicShaping.txt Unicode character database -lib/unicore/auxiliary/GCBTest.txt Unicode character database -lib/unicore/auxiliary/GraphemeBreakProperty.txt Unicode character database -lib/unicore/auxiliary/LBTest.txt Unicode character database -lib/unicore/auxiliary/SBTest.txt Unicode character database -lib/unicore/auxiliary/SentenceBreakProperty.txt Unicode character database -lib/unicore/auxiliary/WBTest.txt Unicode character database -lib/unicore/auxiliary/WordBreakProperty.txt Unicode character database +lib/unicore/auxiliary/GCBTest.txt Unicode character database +lib/unicore/auxiliary/GraphemeBreakProperty.txt Unicode character database +lib/unicore/auxiliary/LBTest.txt Unicode character database +lib/unicore/auxiliary/SBTest.txt Unicode character database +lib/unicore/auxiliary/SentenceBreakProperty.txt Unicode character database +lib/unicore/auxiliary/WBTest.txt Unicode character database +lib/unicore/auxiliary/WordBreakProperty.txt Unicode character database lib/unicore/BidiBrackets.txt Unicode character database lib/unicore/BidiMirroring.txt Unicode character database lib/unicore/Blocks.txt Unicode character database lib/unicore/CaseFolding.txt Unicode character database lib/unicore/CJKRadicals.txt Unicode character database lib/unicore/CombiningClass.pl Unicode character database -lib/unicore/CompositionExclusions.txt Unicode character database +lib/unicore/CompositionExclusions.txt Unicode character database lib/unicore/DAge.txt Unicode character database lib/unicore/DCoreProperties.txt Unicode character database lib/unicore/Decomposition.pl Unicode character database -lib/unicore/DNormalizationProps.txt Unicode character database +lib/unicore/DNormalizationProps.txt Unicode character database lib/unicore/EastAsianWidth.txt Unicode character database lib/unicore/emoji/emoji.txt Unicode character database lib/unicore/EmojiSources.txt Unicode character database -lib/unicore/EquivalentUnifiedIdeograph.txt Unicode character database -lib/unicore/extracted/DBidiClass.txt Unicode character database -lib/unicore/extracted/DBinaryProperties.txt Unicode character database -lib/unicore/extracted/DCombiningClass.txt Unicode character database -lib/unicore/extracted/DDecompositionType.txt Unicode character database -lib/unicore/extracted/DEastAsianWidth.txt Unicode character database -lib/unicore/extracted/DGeneralCategory.txt Unicode character database -lib/unicore/extracted/DJoinGroup.txt Unicode character database -lib/unicore/extracted/DJoinType.txt Unicode character database -lib/unicore/extracted/DLineBreak.txt Unicode character database -lib/unicore/extracted/DNumType.txt Unicode character database -lib/unicore/extracted/DNumValues.txt Unicode character database -lib/unicore/HangulSyllableType.txt Unicode character database +lib/unicore/EquivalentUnifiedIdeograph.txt Unicode character database +lib/unicore/extracted/DBidiClass.txt Unicode character database +lib/unicore/extracted/DBinaryProperties.txt Unicode character database +lib/unicore/extracted/DCombiningClass.txt Unicode character database +lib/unicore/extracted/DDecompositionType.txt Unicode character database +lib/unicore/extracted/DEastAsianWidth.txt Unicode character database +lib/unicore/extracted/DGeneralCategory.txt Unicode character database +lib/unicore/extracted/DJoinGroup.txt Unicode character database +lib/unicore/extracted/DJoinType.txt Unicode character database +lib/unicore/extracted/DLineBreak.txt Unicode character database +lib/unicore/extracted/DNumType.txt Unicode character database +lib/unicore/extracted/DNumValues.txt Unicode character database +lib/unicore/HangulSyllableType.txt Unicode character database lib/unicore/IdStatus.txt Unicode UTS 39 database lib/unicore/IdType.txt Unicode UTS 39 database lib/unicore/Index.txt Unicode character database -lib/unicore/IndicPositionalCategory.txt Unicode character database -lib/unicore/IndicSyllabicCategory.txt Unicode character database +lib/unicore/IndicPositionalCategory.txt Unicode character database +lib/unicore/IndicSyllabicCategory.txt Unicode character database lib/unicore/Jamo.txt Unicode character database lib/unicore/lib/Age/NA.pl Unicode character database lib/unicore/lib/Age/V100.pl Unicode character database @@ -5111,6 +5317,7 @@ lib/unicore/lib/Age/V110.pl Unicode ch lib/unicore/lib/Age/V120.pl Unicode character database lib/unicore/lib/Age/V130.pl Unicode character database lib/unicore/lib/Age/V140.pl Unicode character database +lib/unicore/lib/Age/V150.pl Unicode character database lib/unicore/lib/Age/V20.pl Unicode character database lib/unicore/lib/Age/V30.pl Unicode character database lib/unicore/lib/Age/V31.pl Unicode character database @@ -5128,16 +5335,16 @@ lib/unicore/lib/Age/V90.pl Unicode cha lib/unicore/lib/Alpha/Y.pl Unicode character database lib/unicore/lib/Bc/AL.pl Unicode character database lib/unicore/lib/Bc/AN.pl Unicode character database -lib/unicore/lib/Bc/B.pl Unicode character database +lib/unicore/lib/Bc/B.pl Unicode character database lib/unicore/lib/Bc/BN.pl Unicode character database lib/unicore/lib/Bc/CS.pl Unicode character database lib/unicore/lib/Bc/EN.pl Unicode character database lib/unicore/lib/Bc/ES.pl Unicode character database lib/unicore/lib/Bc/ET.pl Unicode character database -lib/unicore/lib/Bc/L.pl Unicode character database +lib/unicore/lib/Bc/L.pl Unicode character database lib/unicore/lib/Bc/NSM.pl Unicode character database lib/unicore/lib/Bc/ON.pl Unicode character database -lib/unicore/lib/Bc/R.pl Unicode character database +lib/unicore/lib/Bc/R.pl Unicode character database lib/unicore/lib/Bc/WS.pl Unicode character database lib/unicore/lib/BidiC/Y.pl Unicode character database lib/unicore/lib/BidiM/Y.pl Unicode character database @@ -5157,8 +5364,8 @@ lib/unicore/lib/Ccc/NK.pl Unicode char lib/unicore/lib/Ccc/NR.pl Unicode character database lib/unicore/lib/Ccc/OV.pl Unicode character database lib/unicore/lib/Ccc/VR.pl Unicode character database -lib/unicore/lib/CE/Y.pl Unicode character database -lib/unicore/lib/CI/Y.pl Unicode character database +lib/unicore/lib/CE/Y.pl Unicode character database +lib/unicore/lib/CI/Y.pl Unicode character database lib/unicore/lib/CompEx/Y.pl Unicode character database lib/unicore/lib/CWCF/Y.pl Unicode character database lib/unicore/lib/CWCM/Y.pl Unicode character database @@ -5168,7 +5375,7 @@ lib/unicore/lib/CWT/Y.pl Unicode chara lib/unicore/lib/CWU/Y.pl Unicode character database lib/unicore/lib/Dash/Y.pl Unicode character database lib/unicore/lib/Dep/Y.pl Unicode character database -lib/unicore/lib/DI/Y.pl Unicode character database +lib/unicore/lib/DI/Y.pl Unicode character database lib/unicore/lib/Dia/Y.pl Unicode character database lib/unicore/lib/Dt/Com.pl Unicode character database lib/unicore/lib/Dt/Enc.pl Unicode character database @@ -5184,35 +5391,35 @@ lib/unicore/lib/Dt/Sqr.pl Unicode char lib/unicore/lib/Dt/Sub.pl Unicode character database lib/unicore/lib/Dt/Sup.pl Unicode character database lib/unicore/lib/Dt/Vert.pl Unicode character database -lib/unicore/lib/Ea/A.pl Unicode character database -lib/unicore/lib/Ea/H.pl Unicode character database -lib/unicore/lib/Ea/N.pl Unicode character database +lib/unicore/lib/Ea/A.pl Unicode character database +lib/unicore/lib/Ea/H.pl Unicode character database +lib/unicore/lib/Ea/N.pl Unicode character database lib/unicore/lib/Ea/Na.pl Unicode character database -lib/unicore/lib/Ea/W.pl Unicode character database +lib/unicore/lib/Ea/W.pl Unicode character database lib/unicore/lib/EBase/Y.pl Unicode character database lib/unicore/lib/EComp/Y.pl Unicode character database lib/unicore/lib/Emoji/Y.pl Unicode character database lib/unicore/lib/EPres/Y.pl Unicode character database lib/unicore/lib/Ext/Y.pl Unicode character database lib/unicore/lib/ExtPict/Y.pl Unicode character database -lib/unicore/lib/Gc/C.pl Unicode character database +lib/unicore/lib/Gc/C.pl Unicode character database lib/unicore/lib/Gc/Cf.pl Unicode character database lib/unicore/lib/Gc/Cn.pl Unicode character database -lib/unicore/lib/Gc/L.pl Unicode character database +lib/unicore/lib/Gc/L.pl Unicode character database lib/unicore/lib/Gc/LC.pl Unicode character database lib/unicore/lib/Gc/Ll.pl Unicode character database lib/unicore/lib/Gc/Lm.pl Unicode character database lib/unicore/lib/Gc/Lo.pl Unicode character database lib/unicore/lib/Gc/Lu.pl Unicode character database -lib/unicore/lib/Gc/M.pl Unicode character database +lib/unicore/lib/Gc/M.pl Unicode character database lib/unicore/lib/Gc/Mc.pl Unicode character database lib/unicore/lib/Gc/Me.pl Unicode character database lib/unicore/lib/Gc/Mn.pl Unicode character database -lib/unicore/lib/Gc/N.pl Unicode character database +lib/unicore/lib/Gc/N.pl Unicode character database lib/unicore/lib/Gc/Nd.pl Unicode character database lib/unicore/lib/Gc/Nl.pl Unicode character database lib/unicore/lib/Gc/No.pl Unicode character database -lib/unicore/lib/Gc/P.pl Unicode character database +lib/unicore/lib/Gc/P.pl Unicode character database lib/unicore/lib/Gc/Pc.pl Unicode character database lib/unicore/lib/Gc/Pd.pl Unicode character database lib/unicore/lib/Gc/Pe.pl Unicode character database @@ -5220,12 +5427,12 @@ lib/unicore/lib/Gc/Pf.pl Unicode chara lib/unicore/lib/Gc/Pi.pl Unicode character database lib/unicore/lib/Gc/Po.pl Unicode character database lib/unicore/lib/Gc/Ps.pl Unicode character database -lib/unicore/lib/Gc/S.pl Unicode character database +lib/unicore/lib/Gc/S.pl Unicode character database lib/unicore/lib/Gc/Sc.pl Unicode character database lib/unicore/lib/Gc/Sk.pl Unicode character database lib/unicore/lib/Gc/Sm.pl Unicode character database lib/unicore/lib/Gc/So.pl Unicode character database -lib/unicore/lib/Gc/Z.pl Unicode character database +lib/unicore/lib/Gc/Z.pl Unicode character database lib/unicore/lib/Gc/Zs.pl Unicode character database lib/unicore/lib/GCB/CN.pl Unicode character database lib/unicore/lib/GCB/EX.pl Unicode character database @@ -5242,25 +5449,26 @@ lib/unicore/lib/Hyphen/T.pl Unicode ch lib/unicore/lib/IDC/Y.pl Unicode character database lib/unicore/lib/Ideo/Y.pl Unicode character database lib/unicore/lib/IDS/Y.pl Unicode character database -lib/unicore/lib/IdStatus/Allowed.pl Unicode character database -lib/unicore/lib/IdStatus/Restrict.pl Unicode character database -lib/unicore/lib/IdType/DefaultI.pl Unicode character database -lib/unicore/lib/IdType/Exclusio.pl Unicode character database -lib/unicore/lib/IdType/Inclusio.pl Unicode character database -lib/unicore/lib/IdType/LimitedU.pl Unicode character database -lib/unicore/lib/IdType/NotChara.pl Unicode character database -lib/unicore/lib/IdType/NotNFKC.pl Unicode character database -lib/unicore/lib/IdType/NotXID.pl Unicode character database -lib/unicore/lib/IdType/Obsolete.pl Unicode character database -lib/unicore/lib/IdType/Recommen.pl Unicode character database -lib/unicore/lib/IdType/Technica.pl Unicode character database -lib/unicore/lib/IdType/Uncommon.pl Unicode character database +lib/unicore/lib/IdStatus/Allowed.pl Unicode character database +lib/unicore/lib/IdStatus/Restrict.pl Unicode character database +lib/unicore/lib/IdType/DefaultI.pl Unicode character database +lib/unicore/lib/IdType/Exclusio.pl Unicode character database +lib/unicore/lib/IdType/Inclusio.pl Unicode character database +lib/unicore/lib/IdType/LimitedU.pl Unicode character database +lib/unicore/lib/IdType/NotChara.pl Unicode character database +lib/unicore/lib/IdType/NotNFKC.pl Unicode character database +lib/unicore/lib/IdType/NotXID.pl Unicode character database +lib/unicore/lib/IdType/Obsolete.pl Unicode character database +lib/unicore/lib/IdType/Recommen.pl Unicode character database +lib/unicore/lib/IdType/Technica.pl Unicode character database +lib/unicore/lib/IdType/Uncommon.pl Unicode character database lib/unicore/lib/In/10_0.pl Unicode character database lib/unicore/lib/In/11_0.pl Unicode character database lib/unicore/lib/In/12_0.pl Unicode character database lib/unicore/lib/In/12_1.pl Unicode character database lib/unicore/lib/In/13_0.pl Unicode character database lib/unicore/lib/In/14_0.pl Unicode character database +lib/unicore/lib/In/15_0.pl Unicode character database lib/unicore/lib/In/2_0.pl Unicode character database lib/unicore/lib/In/2_1.pl Unicode character database lib/unicore/lib/In/3_0.pl Unicode character database @@ -5279,41 +5487,43 @@ lib/unicore/lib/In/7_0.pl Unicode char lib/unicore/lib/In/8_0.pl Unicode character database lib/unicore/lib/In/9_0.pl Unicode character database lib/unicore/lib/InPC/Bottom.pl Unicode character database -lib/unicore/lib/InPC/BottomAn.pl Unicode character database +lib/unicore/lib/InPC/BottomAn.pl Unicode character database lib/unicore/lib/InPC/Left.pl Unicode character database -lib/unicore/lib/InPC/LeftAndR.pl Unicode character database +lib/unicore/lib/InPC/LeftAndR.pl Unicode character database lib/unicore/lib/InPC/NA.pl Unicode character database -lib/unicore/lib/InPC/Overstru.pl Unicode character database +lib/unicore/lib/InPC/Overstru.pl Unicode character database lib/unicore/lib/InPC/Right.pl Unicode character database lib/unicore/lib/InPC/Top.pl Unicode character database -lib/unicore/lib/InPC/TopAndBo.pl Unicode character database -lib/unicore/lib/InPC/TopAndL2.pl Unicode character database -lib/unicore/lib/InPC/TopAndLe.pl Unicode character database -lib/unicore/lib/InPC/TopAndRi.pl Unicode character database -lib/unicore/lib/InPC/VisualOr.pl Unicode character database -lib/unicore/lib/InSC/Avagraha.pl Unicode character database +lib/unicore/lib/InPC/TopAndBo.pl Unicode character database +lib/unicore/lib/InPC/TopAndL2.pl Unicode character database +lib/unicore/lib/InPC/TopAndLe.pl Unicode character database +lib/unicore/lib/InPC/TopAndRi.pl Unicode character database +lib/unicore/lib/InPC/VisualOr.pl Unicode character database +lib/unicore/lib/InSC/Avagraha.pl Unicode character database lib/unicore/lib/InSC/Bindu.pl Unicode character database -lib/unicore/lib/InSC/Cantilla.pl Unicode character database -lib/unicore/lib/InSC/Consona2.pl Unicode character database -lib/unicore/lib/InSC/Consona3.pl Unicode character database -lib/unicore/lib/InSC/Consona4.pl Unicode character database -lib/unicore/lib/InSC/Consona5.pl Unicode character database -lib/unicore/lib/InSC/Consona6.pl Unicode character database -lib/unicore/lib/InSC/Consona7.pl Unicode character database -lib/unicore/lib/InSC/Consona8.pl Unicode character database -lib/unicore/lib/InSC/Consonan.pl Unicode character database -lib/unicore/lib/InSC/Invisibl.pl Unicode character database +lib/unicore/lib/InSC/Cantilla.pl Unicode character database +lib/unicore/lib/InSC/Consona2.pl Unicode character database +lib/unicore/lib/InSC/Consona3.pl Unicode character database +lib/unicore/lib/InSC/Consona4.pl Unicode character database +lib/unicore/lib/InSC/Consona5.pl Unicode character database +lib/unicore/lib/InSC/Consona6.pl Unicode character database +lib/unicore/lib/InSC/Consona7.pl Unicode character database +lib/unicore/lib/InSC/Consona8.pl Unicode character database +lib/unicore/lib/InSC/Consona9.pl Unicode character database +lib/unicore/lib/InSC/Consonan.pl Unicode character database +lib/unicore/lib/InSC/Geminati.pl Unicode character database +lib/unicore/lib/InSC/Invisibl.pl Unicode character database lib/unicore/lib/InSC/Nukta.pl Unicode character database lib/unicore/lib/InSC/Number.pl Unicode character database lib/unicore/lib/InSC/Other.pl Unicode character database -lib/unicore/lib/InSC/PureKill.pl Unicode character database -lib/unicore/lib/InSC/Syllable.pl Unicode character database -lib/unicore/lib/InSC/ToneMark.pl Unicode character database +lib/unicore/lib/InSC/PureKill.pl Unicode character database +lib/unicore/lib/InSC/Syllable.pl Unicode character database +lib/unicore/lib/InSC/ToneMark.pl Unicode character database lib/unicore/lib/InSC/Virama.pl Unicode character database lib/unicore/lib/InSC/Visarga.pl Unicode character database lib/unicore/lib/InSC/Vowel.pl Unicode character database -lib/unicore/lib/InSC/VowelDep.pl Unicode character database -lib/unicore/lib/InSC/VowelInd.pl Unicode character database +lib/unicore/lib/InSC/VowelDep.pl Unicode character database +lib/unicore/lib/InSC/VowelInd.pl Unicode character database lib/unicore/lib/Jg/Ain.pl Unicode character database lib/unicore/lib/Jg/Alef.pl Unicode character database lib/unicore/lib/Jg/Beh.pl Unicode character database @@ -5334,12 +5544,12 @@ lib/unicore/lib/Jg/Seen.pl Unicode cha lib/unicore/lib/Jg/Tah.pl Unicode character database lib/unicore/lib/Jg/Waw.pl Unicode character database lib/unicore/lib/Jg/Yeh.pl Unicode character database -lib/unicore/lib/Jt/C.pl Unicode character database -lib/unicore/lib/Jt/D.pl Unicode character database -lib/unicore/lib/Jt/L.pl Unicode character database -lib/unicore/lib/Jt/R.pl Unicode character database -lib/unicore/lib/Jt/T.pl Unicode character database -lib/unicore/lib/Jt/U.pl Unicode character database +lib/unicore/lib/Jt/C.pl Unicode character database +lib/unicore/lib/Jt/D.pl Unicode character database +lib/unicore/lib/Jt/L.pl Unicode character database +lib/unicore/lib/Jt/R.pl Unicode character database +lib/unicore/lib/Jt/T.pl Unicode character database +lib/unicore/lib/Jt/U.pl Unicode character database lib/unicore/lib/Lb/AI.pl Unicode character database lib/unicore/lib/Lb/AL.pl Unicode character database lib/unicore/lib/Lb/BA.pl Unicode character database @@ -5373,8 +5583,8 @@ lib/unicore/lib/NFKDQC/Y.pl Unicode ch lib/unicore/lib/Nt/Di.pl Unicode character database lib/unicore/lib/Nt/None.pl Unicode character database lib/unicore/lib/Nt/Nu.pl Unicode character database -lib/unicore/lib/Nv/0.pl Unicode character database -lib/unicore/lib/Nv/1.pl Unicode character database +lib/unicore/lib/Nv/0.pl Unicode character database +lib/unicore/lib/Nv/1.pl Unicode character database lib/unicore/lib/Nv/10.pl Unicode character database lib/unicore/lib/Nv/100.pl Unicode character database lib/unicore/lib/Nv/1000.pl Unicode character database @@ -5395,74 +5605,74 @@ lib/unicore/lib/Nv/1_3.pl Unicode char lib/unicore/lib/Nv/1_4.pl Unicode character database lib/unicore/lib/Nv/1_6.pl Unicode character database lib/unicore/lib/Nv/1_8.pl Unicode character database -lib/unicore/lib/Nv/2.pl Unicode character database +lib/unicore/lib/Nv/2.pl Unicode character database lib/unicore/lib/Nv/20.pl Unicode character database lib/unicore/lib/Nv/200.pl Unicode character database lib/unicore/lib/Nv/2000.pl Unicode character database lib/unicore/lib/Nv/20000.pl Unicode character database lib/unicore/lib/Nv/2_3.pl Unicode character database -lib/unicore/lib/Nv/3.pl Unicode character database +lib/unicore/lib/Nv/3.pl Unicode character database lib/unicore/lib/Nv/30.pl Unicode character database lib/unicore/lib/Nv/300.pl Unicode character database lib/unicore/lib/Nv/3000.pl Unicode character database lib/unicore/lib/Nv/30000.pl Unicode character database lib/unicore/lib/Nv/3_16.pl Unicode character database lib/unicore/lib/Nv/3_4.pl Unicode character database -lib/unicore/lib/Nv/4.pl Unicode character database +lib/unicore/lib/Nv/4.pl Unicode character database lib/unicore/lib/Nv/40.pl Unicode character database lib/unicore/lib/Nv/400.pl Unicode character database lib/unicore/lib/Nv/4000.pl Unicode character database lib/unicore/lib/Nv/40000.pl Unicode character database -lib/unicore/lib/Nv/5.pl Unicode character database +lib/unicore/lib/Nv/5.pl Unicode character database lib/unicore/lib/Nv/50.pl Unicode character database lib/unicore/lib/Nv/500.pl Unicode character database lib/unicore/lib/Nv/5000.pl Unicode character database lib/unicore/lib/Nv/50000.pl Unicode character database -lib/unicore/lib/Nv/6.pl Unicode character database +lib/unicore/lib/Nv/6.pl Unicode character database lib/unicore/lib/Nv/60.pl Unicode character database lib/unicore/lib/Nv/600.pl Unicode character database lib/unicore/lib/Nv/6000.pl Unicode character database lib/unicore/lib/Nv/60000.pl Unicode character database -lib/unicore/lib/Nv/7.pl Unicode character database +lib/unicore/lib/Nv/7.pl Unicode character database lib/unicore/lib/Nv/70.pl Unicode character database lib/unicore/lib/Nv/700.pl Unicode character database lib/unicore/lib/Nv/7000.pl Unicode character database lib/unicore/lib/Nv/70000.pl Unicode character database -lib/unicore/lib/Nv/8.pl Unicode character database +lib/unicore/lib/Nv/8.pl Unicode character database lib/unicore/lib/Nv/80.pl Unicode character database lib/unicore/lib/Nv/800.pl Unicode character database lib/unicore/lib/Nv/8000.pl Unicode character database lib/unicore/lib/Nv/80000.pl Unicode character database -lib/unicore/lib/Nv/9.pl Unicode character database +lib/unicore/lib/Nv/9.pl Unicode character database lib/unicore/lib/Nv/90.pl Unicode character database lib/unicore/lib/Nv/900.pl Unicode character database lib/unicore/lib/Nv/9000.pl Unicode character database lib/unicore/lib/Nv/90000.pl Unicode character database lib/unicore/lib/PatSyn/Y.pl Unicode character database lib/unicore/lib/PCM/Y.pl Unicode character database -lib/unicore/lib/Perl/_PerlAny.pl Unicode character database -lib/unicore/lib/Perl/_PerlCh2.pl Unicode character database -lib/unicore/lib/Perl/_PerlCha.pl Unicode character database -lib/unicore/lib/Perl/_PerlFol.pl Unicode character database -lib/unicore/lib/Perl/_PerlIDC.pl Unicode character database -lib/unicore/lib/Perl/_PerlIDS.pl Unicode character database -lib/unicore/lib/Perl/_PerlIsI.pl Unicode character database -lib/unicore/lib/Perl/_PerlNch.pl Unicode character database -lib/unicore/lib/Perl/_PerlPat.pl Unicode character database -lib/unicore/lib/Perl/_PerlPr2.pl Unicode character database -lib/unicore/lib/Perl/_PerlPro.pl Unicode character database -lib/unicore/lib/Perl/_PerlQuo.pl Unicode character database +lib/unicore/lib/Perl/_PerlAny.pl Unicode character database +lib/unicore/lib/Perl/_PerlCh2.pl Unicode character database +lib/unicore/lib/Perl/_PerlCha.pl Unicode character database +lib/unicore/lib/Perl/_PerlFol.pl Unicode character database +lib/unicore/lib/Perl/_PerlIDC.pl Unicode character database +lib/unicore/lib/Perl/_PerlIDS.pl Unicode character database +lib/unicore/lib/Perl/_PerlIsI.pl Unicode character database +lib/unicore/lib/Perl/_PerlNch.pl Unicode character database +lib/unicore/lib/Perl/_PerlPat.pl Unicode character database +lib/unicore/lib/Perl/_PerlPr2.pl Unicode character database +lib/unicore/lib/Perl/_PerlPro.pl Unicode character database +lib/unicore/lib/Perl/_PerlQuo.pl Unicode character database lib/unicore/lib/Perl/Alnum.pl Unicode character database -lib/unicore/lib/Perl/Assigned.pl Unicode character database +lib/unicore/lib/Perl/Assigned.pl Unicode character database lib/unicore/lib/Perl/Blank.pl Unicode character database lib/unicore/lib/Perl/Graph.pl Unicode character database -lib/unicore/lib/Perl/PerlWord.pl Unicode character database -lib/unicore/lib/Perl/PosixPun.pl Unicode character database +lib/unicore/lib/Perl/PerlWord.pl Unicode character database +lib/unicore/lib/Perl/PosixPun.pl Unicode character database lib/unicore/lib/Perl/Print.pl Unicode character database -lib/unicore/lib/Perl/SpacePer.pl Unicode character database +lib/unicore/lib/Perl/SpacePer.pl Unicode character database lib/unicore/lib/Perl/Title.pl Unicode character database lib/unicore/lib/Perl/Word.pl Unicode character database -lib/unicore/lib/Perl/XPosixPu.pl Unicode character database +lib/unicore/lib/Perl/XPosixPu.pl Unicode character database lib/unicore/lib/QMark/Y.pl Unicode character database lib/unicore/lib/SB/AT.pl Unicode character database lib/unicore/lib/SB/CL.pl Unicode character database @@ -5578,16 +5788,16 @@ lib/unicore/lib/Scx/Yi.pl Unicode char lib/unicore/lib/Scx/Zinh.pl Unicode character database lib/unicore/lib/Scx/Zyyy.pl Unicode character database lib/unicore/lib/Scx/Zzzz.pl Unicode character database -lib/unicore/lib/SD/Y.pl Unicode character database +lib/unicore/lib/SD/Y.pl Unicode character database lib/unicore/lib/STerm/Y.pl Unicode character database lib/unicore/lib/Term/Y.pl Unicode character database lib/unicore/lib/UIdeo/Y.pl Unicode character database lib/unicore/lib/Upper/Y.pl Unicode character database -lib/unicore/lib/Vo/R.pl Unicode character database +lib/unicore/lib/Vo/R.pl Unicode character database lib/unicore/lib/Vo/Tr.pl Unicode character database lib/unicore/lib/Vo/Tu.pl Unicode character database -lib/unicore/lib/Vo/U.pl Unicode character database -lib/unicore/lib/VS/Y.pl Unicode character database +lib/unicore/lib/Vo/U.pl Unicode character database +lib/unicore/lib/VS/Y.pl Unicode character database lib/unicore/lib/WB/EX.pl Unicode character database lib/unicore/lib/WB/Extend.pl Unicode character database lib/unicore/lib/WB/FO.pl Unicode character database @@ -5604,1363 +5814,1250 @@ lib/unicore/lib/XIDC/Y.pl Unicode char lib/unicore/lib/XIDS/Y.pl Unicode character database lib/unicore/LineBreak.txt Unicode character database lib/unicore/Makefile Unicode character database -lib/unicore/mktables Unicode character database generator +lib/unicore/mktables Unicode character database lib/unicore/mktables.lst Unicode character database -lib/unicore/Name.pl Unicode character database -lib/unicore/Name.pm Unicode character database +lib/unicore/Name.pl Unicode character database +lib/unicore/Name.pm Unicode character database lib/unicore/NameAliases.txt Unicode character database lib/unicore/NamedSequences.txt Unicode character database lib/unicore/NamedSqProv.txt Unicode character database lib/unicore/NamesList.txt Unicode character database -lib/unicore/NormalizationCorrections.txt Unicode character database +lib/unicore/NormalizationCorrections.txt Unicode character database +lib/unicore/NormTest.txt Unicode character database lib/unicore/PropertyAliases.txt Unicode character database lib/unicore/PropList.txt Unicode character database -lib/unicore/PropValueAliases.txt Unicode character database +lib/unicore/PropValueAliases.txt Unicode character database lib/unicore/README.perl Unicode character database -lib/unicore/ReadMe.txt Unicode character database info -lib/unicore/ScriptExtensions.txt Unicode character database +lib/unicore/ReadMe.txt Unicode character database +lib/unicore/ScriptExtensions.txt Unicode character database lib/unicore/Scripts.txt Unicode character database lib/unicore/SpecialCasing.txt Unicode character database -lib/unicore/StandardizedVariants.txt Unicode character database -lib/unicore/TestProp.pl Unicode character database +lib/unicore/StandardizedVariants.txt Unicode character database +lib/unicore/TestNorm.pl Unicode character database +lib/unicore/TestProp.pl Unicode character database lib/unicore/To/_PerlLB.pl Unicode character database lib/unicore/To/_PerlSCX.pl Unicode character database -lib/unicore/To/Age.pl Unicode character database -lib/unicore/To/Bc.pl Unicode character database -lib/unicore/To/Bmg.pl Unicode character database -lib/unicore/To/Bpb.pl Unicode character database -lib/unicore/To/Bpt.pl Unicode character database -lib/unicore/To/Cf.pl Unicode character database -lib/unicore/To/Ea.pl Unicode character database +lib/unicore/To/Age.pl Unicode character database +lib/unicore/To/Bc.pl Unicode character database +lib/unicore/To/Bmg.pl Unicode character database +lib/unicore/To/Bpb.pl Unicode character database +lib/unicore/To/Bpt.pl Unicode character database +lib/unicore/To/Cf.pl Unicode character database +lib/unicore/To/Ea.pl Unicode character database lib/unicore/To/EqUIdeo.pl Unicode character database -lib/unicore/To/Gc.pl Unicode character database -lib/unicore/To/GCB.pl Unicode character database -lib/unicore/To/Hst.pl Unicode character database +lib/unicore/To/Gc.pl Unicode character database +lib/unicore/To/GCB.pl Unicode character database +lib/unicore/To/Hst.pl Unicode character database lib/unicore/To/Identif2.pl Unicode character database lib/unicore/To/Identifi.pl Unicode character database -lib/unicore/To/InPC.pl Unicode character database -lib/unicore/To/InSC.pl Unicode character database -lib/unicore/To/Isc.pl Unicode character database -lib/unicore/To/Jg.pl Unicode character database -lib/unicore/To/Jt.pl Unicode character database -lib/unicore/To/Lb.pl Unicode character database -lib/unicore/To/Lc.pl Unicode character database -lib/unicore/To/Na1.pl Unicode character database +lib/unicore/To/InPC.pl Unicode character database +lib/unicore/To/InSC.pl Unicode character database +lib/unicore/To/Isc.pl Unicode character database +lib/unicore/To/Jg.pl Unicode character database +lib/unicore/To/Jt.pl Unicode character database +lib/unicore/To/Lb.pl Unicode character database +lib/unicore/To/Lc.pl Unicode character database +lib/unicore/To/Na1.pl Unicode character database lib/unicore/To/NameAlia.pl Unicode character database -lib/unicore/To/NFCQC.pl Unicode character database -lib/unicore/To/NFDQC.pl Unicode character database +lib/unicore/To/NFCQC.pl Unicode character database +lib/unicore/To/NFDQC.pl Unicode character database lib/unicore/To/NFKCCF.pl Unicode character database lib/unicore/To/NFKCQC.pl Unicode character database lib/unicore/To/NFKDQC.pl Unicode character database -lib/unicore/To/Nt.pl Unicode character database -lib/unicore/To/Nv.pl Unicode character database +lib/unicore/To/Nt.pl Unicode character database +lib/unicore/To/Nv.pl Unicode character database lib/unicore/To/PerlDeci.pl Unicode character database -lib/unicore/To/SB.pl Unicode character database -lib/unicore/To/Sc.pl Unicode character database -lib/unicore/To/Scx.pl Unicode character database -lib/unicore/To/Tc.pl Unicode character database -lib/unicore/To/Uc.pl Unicode character database -lib/unicore/To/Vo.pl Unicode character database -lib/unicore/To/WB.pl Unicode character database -lib/unicore/UCD.pl Unicode character database +lib/unicore/To/SB.pl Unicode character database +lib/unicore/To/Sc.pl Unicode character database +lib/unicore/To/Scx.pl Unicode character database +lib/unicore/To/Tc.pl Unicode character database +lib/unicore/To/Uc.pl Unicode character database +lib/unicore/To/Vo.pl Unicode character database +lib/unicore/To/WB.pl Unicode character database +lib/unicore/UCD.pl Unicode character database lib/unicore/uni_keywords.pl Indices into array in charclass_invlists.h lib/unicore/UnicodeData.txt Unicode character database lib/unicore/version The version of the Unicode -lib/unicore/VerticalOrientation.txt Unicode character database -lib/UNIVERSAL.pm Base class for ALL classes -lib/User/grent.pm By-name interface to Perl's builtin getgr* -lib/User/grent.t See if User::grwent works -lib/User/pwent.pm By-name interface to Perl's builtin getpw* -lib/User/pwent.t See if User::pwent works -lib/utf8.pm Pragma to control Unicode support -lib/utf8.t See if utf8 operations work -lib/vars.pm Declare pseudo-imported global variables -lib/vars.t See if "use vars" works -lib/vars_carp.t See if "use vars" doesn't load Carp.pm per default -lib/vmsish.pm Control VMS-specific behavior of Perl core -lib/vmsish.t Tests for vmsish.pm -lib/warnings.pm For "use warnings" -lib/warnings.t See if warning controls work -lib/warnings/register.pm For "use warnings::register" -locale.c locale-specific utility functions -make_ext.pl Used by Makefile to execute extension Makefiles -make_patchnum.pl Script to generate git_version.h and lib/Config_git.pl files for all OS'es -makedef.pl Create symbol export lists for linking -makedepend.SH Precursor to makedepend -makedepend_file.SH Precursor to makedepend_file -Makefile.micro microperl Makefile -Makefile.SH A script that generates Makefile -malloc.c A version of malloc you might not want -malloc_ctl.h A version of malloc you might not want -MANIFEST This list of files -mathoms.c A home for binary-compatible code artifacts -META.json Distribution meta-data in JSON -META.yml Distribution meta-data in YAML -metaconfig.h Control file for the metaconfig process -metaconfig.SH Control file for the metaconfig process -mg.c Magic code -mg.h Magic header -mg_names.inc Generated magic names used by dump.c -mg_raw.h Generated magic data used by generate_uudmap.c -mg_vtable.h Generated magic vtable data -miniperlmain.c Basic perl w/o dynamic loading or extensions -mkppport A script that distributes ppport.h -mkppport.lst List of extensions that need a ppport.h -mro_core.c Method Resolution Order code -myconfig.SH Prints summary of the current configuration -mydtrace.h Support for optional DTrace probes -nostdio.h Cause compile error on stdio calls -numeric.c Miscellaneous numeric conversion routines -op.c Opcode syntax tree code -op.h Opcode syntax tree header -op_reg_common.h Common parts of op.h, regexp.h header -opcode.h Automatically generated opcode header -opnames.h Automatically generated opcode header -os2/Changes Changelog for OS/2 port -os2/diff.configure Patches to Configure -os2/dl_os2.c Addon for dl_open -os2/dlfcn.h Addon for dl_open -os2/Makefile.SHs Shared library generation for OS/2 -os2/os2.c Additional code for OS/2 -os2/os2.sym Additional symbols to export -os2/OS2/OS2-ExtAttr/Changes EA access module -os2/OS2/OS2-ExtAttr/ExtAttr.pm EA access module -os2/OS2/OS2-ExtAttr/ExtAttr.xs EA access module -os2/OS2/OS2-ExtAttr/Makefile.PL EA access module -os2/OS2/OS2-ExtAttr/MANIFEST EA access module -os2/OS2/OS2-ExtAttr/myea.h EA access module -os2/OS2/OS2-ExtAttr/t/os2_ea.t EA access module -os2/OS2/OS2-ExtAttr/typemap EA access module -os2/OS2/OS2-PrfDB/Changes System database access module -os2/OS2/OS2-PrfDB/Makefile.PL System database access module -os2/OS2/OS2-PrfDB/MANIFEST System database access module -os2/OS2/OS2-PrfDB/PrfDB.pm System database access module -os2/OS2/OS2-PrfDB/PrfDB.xs System database access module -os2/OS2/OS2-PrfDB/t/os2_prfdb.t System database access module -os2/OS2/OS2-Process/Makefile.PL system() constants in a module -os2/OS2/OS2-Process/MANIFEST system() constants in a module -os2/OS2/OS2-Process/Process.pm system() constants in a module -os2/OS2/OS2-Process/Process.xs system() constants in a module -os2/OS2/OS2-Process/t/os2_atoms.t Test for OS2::Process -os2/OS2/OS2-Process/t/os2_clipboard.t Test for OS2::Process -os2/OS2/OS2-Process/t/os2_process.t Tests -os2/OS2/OS2-Process/t/os2_process_kid.t Tests +lib/unicore/VerticalOrientation.txt Unicode character database +lib/UNIVERSAL.pm Base class for ALL classes +lib/User/grent.pm By-name interface to Perl's builtin getgr* +lib/User/grent.t See if User::grwent works +lib/User/pwent.pm By-name interface to Perl's builtin getpw* +lib/User/pwent.t See if User::pwent works +lib/utf8.pm Pragma to control Unicode support +lib/utf8.t See if utf8 operations work +lib/vars.pm Declare pseudo-imported global variables +lib/vars.t See if "use vars" works +lib/vars_carp.t See if "use vars" doesn't load Carp.pm per default +lib/vmsish.pm Control VMS-specific behavior of Perl core +lib/vmsish.t Tests for vmsish.pm +lib/warnings.pm For "use warnings" +lib/warnings.t See if warning controls work +lib/warnings/register.pm For "use warnings::register" +os2/Changes Changelog for OS/2 port +os2/diff.configure Patches to Configure +os2/dl_os2.c Addon for dl_open +os2/dlfcn.h Addon for dl_open +os2/Makefile.SHs Shared library generation for OS/2 +os2/os2.c Additional code for OS/2 +os2/os2.sym Additional symbols to export +os2/OS2/OS2-ExtAttr/Changes EA access module +os2/OS2/OS2-ExtAttr/ExtAttr.pm EA access module +os2/OS2/OS2-ExtAttr/ExtAttr.xs EA access module +os2/OS2/OS2-ExtAttr/Makefile.PL EA access module +os2/OS2/OS2-ExtAttr/MANIFEST EA access module +os2/OS2/OS2-ExtAttr/myea.h EA access module +os2/OS2/OS2-ExtAttr/t/os2_ea.t EA access module +os2/OS2/OS2-ExtAttr/typemap EA access module +os2/OS2/OS2-PrfDB/Changes System database access module +os2/OS2/OS2-PrfDB/Makefile.PL System database access module +os2/OS2/OS2-PrfDB/MANIFEST System database access module +os2/OS2/OS2-PrfDB/PrfDB.pm System database access module +os2/OS2/OS2-PrfDB/PrfDB.xs System database access module +os2/OS2/OS2-PrfDB/t/os2_prfdb.t System database access module +os2/OS2/OS2-Process/Makefile.PL system() constants in a module +os2/OS2/OS2-Process/MANIFEST system() constants in a module +os2/OS2/OS2-Process/Process.pm system() constants in a module +os2/OS2/OS2-Process/Process.xs system() constants in a module +os2/OS2/OS2-Process/t/os2_atoms.t Test for OS2::Process +os2/OS2/OS2-Process/t/os2_clipboard.t Test for OS2::Process +os2/OS2/OS2-Process/t/os2_process.t Tests +os2/OS2/OS2-Process/t/os2_process_kid.t Tests os2/OS2/OS2-Process/t/os2_process_text.t Tests -os2/OS2/OS2-REXX/Changes DLL access module -os2/OS2/OS2-REXX/DLL/Changes DLL access module -os2/OS2/OS2-REXX/DLL/DLL.pm DLL access module -os2/OS2/OS2-REXX/DLL/DLL.xs DLL access module -os2/OS2/OS2-REXX/DLL/Makefile.PL DLL access module -os2/OS2/OS2-REXX/DLL/MANIFEST DLL access module -os2/OS2/OS2-REXX/Makefile.PL DLL access module -os2/OS2/OS2-REXX/MANIFEST DLL access module -os2/OS2/OS2-REXX/REXX.pm DLL access module -os2/OS2/OS2-REXX/REXX.xs DLL access module -os2/OS2/OS2-REXX/t/rx_cmprt.t DLL access module -os2/OS2/OS2-REXX/t/rx_dllld.t DLL access module -os2/OS2/OS2-REXX/t/rx_emxrv.t DLL access module -os2/OS2/OS2-REXX/t/rx_objcall.t DLL access module -os2/OS2/OS2-REXX/t/rx_sql.test DLL access module -os2/OS2/OS2-REXX/t/rx_tiesql.test DLL access module -os2/OS2/OS2-REXX/t/rx_tievar.t DLL access module -os2/OS2/OS2-REXX/t/rx_tieydb.t DLL access module -os2/OS2/OS2-REXX/t/rx_varset.t DLL access module -os2/OS2/OS2-REXX/t/rx_vrexx.t DLL access module -os2/OS2/typemap Common typemap for OS/2 types -os2/os2_base.t Additional tests for builtin methods -os2/os2_pipe.t Tests for pipe creation logic -os2/os2add.sym Overriding symbols to export -os2/os2ish.h Header for OS/2 -os2/os2thread.h pthread-like typedefs -os2/perl2cmd.pl Corrects installed binaries under OS/2 -os2/perlrexx.c Support perl interpreter embedded in REXX -os2/perlrexx.cmd Test perl interpreter embedded in REXX -overload.h generated overload enum (public) -overload.inc generated overload name table (implementation) -PACKAGING notes and best practice for packaging perl 5 -packsizetables.inc The generated packprops array used in pp_pack.c -pad.c Scratchpad functions -pad.h Scratchpad headers -parser.h parser object header -patchlevel.h The current patch level of perl -perl.c main() -perl.h Global declarations -perl_inc_macro.h macro used to set \@INC using S_incpush_use_sep -perl_langinfo.h Perl's version of -perl_siphash.h Implementation of SipHash -perlapi.h Empty backwards-compat include -perldtrace.d D script for Perl probes -perlio.c C code for PerlIO abstraction -perlio.h PerlIO abstraction -perlio.sym Symbols for PerlIO abstraction -perliol.h PerlIO Layer definition -perlsdio.h Fake stdio using perlio -perlvars.h Global variables -perly.act parser actions; derived from perly.y -perly.c parser code (NOT derived from perly.y) -perly.h header file for perly.c; derived from perly.y -perly.tab parser state tables; derived from perly.y -perly.y Yacc grammar for perl -plan9/9front.patch Plan9 port: patch for 9front-specific flavor of Plan 9 -plan9/aperl Plan9 port: shell to make Perl error messages Acme-friendly -plan9/arpa/inet.h Plan9 port: replacement C header file -plan9/buildinfo Plan9 port: configuration information -plan9/config.plan9 Plan9 port: config.h template -plan9/config_h.sample Plan9 port: 5.32.0 sample config.h -plan9/config_sh.sample Plan9 port: 5.32.0 sample config.sh -plan9/exclude Plan9 port: tests to skip -plan9/fndvers Plan9 port: update Perl version in config.plan9 -plan9/genconfig.pl Plan9 port: generate config.sh -plan9/math.h Plan9 port: Plan9-specific math.h -plan9/mkfile Plan9 port: Mk driver for build -plan9/myconfig.plan9 Plan9 port: script to print config summary -plan9/plan9.c Plan9 port: Plan9-specific C routines -plan9/plan9ish.h Plan9 port: Plan9-specific C header file -plan9/setup.rc Plan9 port: script for easy build+install -plan9/uninstall.rc Plan9 port: uninstall script -plan9/versnum Plan9 port: script to print version number -pod/buildtoc Generate pod/perltoc.pod and pod/roffitall -pod/Makefile.SH generate Makefile which makes pods into something else -pod/perl.pod Perl overview (this section) -pod/perl5004delta.pod Perl changes in version 5.004 -pod/perl5005delta.pod Perl changes in version 5.005 -pod/perl5100delta.pod Perl changes in version 5.10.0 -pod/perl5101delta.pod Perl changes in version 5.10.1 -pod/perl5120delta.pod Perl changes in version 5.12.0 -pod/perl5121delta.pod Perl changes in version 5.12.1 -pod/perl5122delta.pod Perl changes in version 5.12.2 -pod/perl5123delta.pod Perl changes in version 5.12.3 -pod/perl5124delta.pod Perl changes in version 5.12.4 -pod/perl5125delta.pod Perl changes in version 5.12.5 -pod/perl5140delta.pod Perl changes in version 5.14.0 -pod/perl5141delta.pod Perl changes in version 5.14.1 -pod/perl5142delta.pod Perl changes in version 5.14.2 -pod/perl5143delta.pod Perl changes in version 5.14.3 -pod/perl5144delta.pod Perl changes in version 5.14.4 -pod/perl5160delta.pod Perl changes in version 5.16.0 -pod/perl5161delta.pod Perl changes in version 5.16.1 -pod/perl5162delta.pod Perl changes in version 5.16.2 -pod/perl5163delta.pod Perl changes in version 5.16.3 -pod/perl5180delta.pod Perl changes in version 5.18.0 -pod/perl5181delta.pod Perl changes in version 5.18.1 -pod/perl5182delta.pod Perl changes in version 5.18.2 -pod/perl5184delta.pod Perl changes in version 5.18.4 -pod/perl5200delta.pod Perl changes in version 5.20.0 -pod/perl5201delta.pod Perl changes in version 5.20.1 -pod/perl5202delta.pod Perl changes in version 5.20.2 -pod/perl5203delta.pod Perl changes in version 5.20.3 -pod/perl5220delta.pod Perl changes in version 5.22.0 -pod/perl5221delta.pod Perl changes in version 5.22.1 -pod/perl5222delta.pod Perl changes in version 5.22.2 -pod/perl5223delta.pod Perl changes in version 5.22.3 -pod/perl5224delta.pod Perl changes in version 5.22.4 -pod/perl5240delta.pod Perl changes in version 5.24.0 -pod/perl5241delta.pod Perl changes in version 5.24.1 -pod/perl5242delta.pod Perl changes in version 5.24.2 -pod/perl5243delta.pod Perl changes in version 5.24.3 -pod/perl5244delta.pod Perl changes in version 5.24.4 -pod/perl5260delta.pod Perl changes in version 5.26.0 -pod/perl5261delta.pod Perl changes in version 5.26.1 -pod/perl5262delta.pod Perl changes in version 5.26.2 -pod/perl5263delta.pod Perl changes in version 5.26.3 -pod/perl5280delta.pod Perl changes in version 5.28.0 -pod/perl5281delta.pod Perl changes in version 5.28.1 -pod/perl5282delta.pod Perl changes in version 5.28.2 -pod/perl5283delta.pod Perl changes in version 5.28.3 -pod/perl5300delta.pod Perl changes in version 5.30.0 -pod/perl5301delta.pod Perl changes in version 5.30.1 -pod/perl5302delta.pod Perl changes in version 5.30.2 -pod/perl5303delta.pod Perl changes in version 5.30.3 -pod/perl5320delta.pod Perl changes in version 5.32.0 -pod/perl5321delta.pod Perl changes in version 5.32.1 -pod/perl5340delta.pod Perl changes in version 5.34.0 -pod/perl5341delta.pod Perl changes in version 5.34.1 -pod/perl5342delta.pod Perl changes in version 5.34.2 -pod/perl5343delta.pod Perl changes in version 5.34.3 -pod/perl5360delta.pod Perl changes in version 5.36.0 -pod/perl5361delta.pod Perl changes in version 5.36.1 -pod/perl5362delta.pod Perl changes in version 5.36.2 -pod/perl561delta.pod Perl changes in version 5.6.1 -pod/perl56delta.pod Perl changes in version 5.6 -pod/perl581delta.pod Perl changes in version 5.8.1 -pod/perl582delta.pod Perl changes in version 5.8.2 -pod/perl583delta.pod Perl changes in version 5.8.3 -pod/perl584delta.pod Perl changes in version 5.8.4 -pod/perl585delta.pod Perl changes in version 5.8.5 -pod/perl586delta.pod Perl changes in version 5.8.6 -pod/perl587delta.pod Perl changes in version 5.8.7 -pod/perl588delta.pod Perl changes in version 5.8.8 -pod/perl589delta.pod Perl changes in version 5.8.9 -pod/perl58delta.pod Perl changes in version 5.8.0 -pod/perlapio.pod Perl internal IO abstraction interface -pod/perlartistic.pod Perl Artistic License -pod/perlbook.pod Perl book information -pod/perlboot.pod -pod/perlbot.pod -pod/perlcall.pod Perl calling conventions from C -pod/perlcheat.pod Perl cheat sheet -pod/perlclib.pod Internal replacements for standard C library functions -pod/perlcommunity.pod Perl community information -pod/perldata.pod Perl data structures -pod/perldbmfilter.pod Perl DBM filters -pod/perldebguts.pod Perl debugging guts and tips -pod/perldebtut.pod Perl debugging tutorial -pod/perldebug.pod Perl debugging -pod/perldelta.pod Perl changes since previous version -pod/perldeprecation.pod Perl deprecations -pod/perldiag.pod Perl diagnostic messages -pod/perldocstyle.pod Perl style guide for core docs -pod/perldsc.pod Perl data structures intro -pod/perldtrace.pod Perl's support for DTrace -pod/perlebcdic.pod Considerations for running Perl on EBCDIC platforms -pod/perlembed.pod Perl ways to embed perl in your C or C++ application -pod/perlexperiment.pod A listing of experimental features in Perl -pod/perlfilter.pod Perl source filters -pod/perlfork.pod Perl fork() information -pod/perlform.pod Perl formats -pod/perlfunc.pod Perl built-in functions -pod/perlgit.pod Using git with the Perl repository -pod/perlgov.pod Perl Rules of Governance -pod/perlgpl.pod GNU General Public License -pod/perlguts.pod Perl internal functions for those doing extensions -pod/perlhack.pod Perl hackers guide -pod/perlhacktips.pod Tips for Perl core C code hacking -pod/perlhacktut.pod Walk through the creation of a simple C code patch -pod/perlhist.pod Perl history records -pod/perlinterp.pod Overview of the Perl interpreter source and how it works -pod/perlintro.pod Perl introduction for beginners -pod/perliol.pod C API for Perl's implementation of IO in Layers -pod/perlipc.pod Perl interprocess communication -pod/perllexwarn.pod Perl warnings and their control -pod/perllocale.pod Perl locale support -pod/perllol.pod Perl data structures: arrays of arrays -pod/perlmod.pod Perl modules: how they work -pod/perlmodinstall.pod Perl modules: how to install from CPAN -pod/perlmodlib.PL Generate pod/perlmodlib.pod -pod/perlmodstyle.pod Perl modules: how to write modules with style -pod/perlmroapi.pod Perl method resolution plugin interface -pod/perlnewmod.pod Perl modules: preparing a new module for distribution -pod/perlnumber.pod Perl number semantics -pod/perlobj.pod Perl objects -pod/perlootut.pod Perl OO tutorial for beginners -pod/perlop.pod Perl operators and precedence -pod/perlopentut.pod Perl open() tutorial -pod/perlpacktut.pod Perl pack() and unpack() tutorial -pod/perlperf.pod Perl Performance and Optimization Techniques -pod/perlpod.pod Perl plain old documentation -pod/perlpodspec.pod Perl plain old documentation format specification -pod/perlpodstyle.pod Perl POD style guide -pod/perlpolicy.pod Perl development policies -pod/perlport.pod Perl portability guide -pod/perlpragma.pod Perl modules: writing a user pragma -pod/perlre.pod Perl regular expressions, the rest of the story -pod/perlreapi.pod Perl regular expression plugin interface -pod/perlrebackslash.pod Perl regular expression backslash sequences -pod/perlrecharclass.pod Perl regular expression character classes -pod/perlref.pod Perl references, the rest of the story -pod/perlreftut.pod Perl references short introduction -pod/perlreguts.pod Perl regular expression engine internals -pod/perlrepository.pod -pod/perlrequick.pod Perl regular expressions quick start -pod/perlreref.pod Perl regular expressions quick reference -pod/perlretut.pod Perl regular expressions tutorial -pod/perlrun.pod Perl execution and options -pod/perlsec.pod Perl security -pod/perlsecpolicy.pod Perl security report handling policy -pod/perlsource.pod Guide to the Perl source tree -pod/perlstyle.pod Perl style guide -pod/perlsub.pod Perl subroutines -pod/perlsyn.pod Perl syntax -pod/perlthrtut.pod Perl threads tutorial -pod/perltie.pod Perl objects hidden behind simple variables -pod/perltodo.pod -pod/perltooc.pod -pod/perltoot.pod -pod/perltrap.pod Perl traps for the unwary -pod/perlunicode.pod Perl Unicode support -pod/perlunicook.pod Perl Unicode cookbook -pod/perlunifaq.pod Perl Unicode FAQ -pod/perluniintro.pod Perl Unicode introduction -pod/perluniprops.pod Index of Unicode properties in Perl -pod/perlunitut.pod Perl Unicode tutorial -pod/perlutil.pod utilities packaged with the Perl distribution -pod/perlvar.pod Perl predefined variables -pod/perlvms.pod Perl notes for VMS -pod/rofftoc Generate a table of contents in troff format -pod/splitman Splits perlfunc into multiple man pages -pod/splitpod Splits perlfunc into multiple pod pages -Policy_sh.SH Hold site-wide preferences between Configure runs. -Porting/acknowledgements.pl Generate perldelta acknowledgements text -Porting/add-package.pl Add/Update CPAN modules that are part of Core -Porting/add-pod-file Utility to add new pod/*.pod file to core distribution -Porting/bench.pl Run benchmarks against t/perf/benchmarks -Porting/bisect.pl A tool to make bisecting easy -Porting/bisect-example.sh Example script to use with git bisect run -Porting/bisect-runner.pl Tool to be called by git bisect run -Porting/bump-perl-version bump the perl version in relevant files -Porting/check-cpan-pollution Check for commits that may wrongly touch CPAN distros -Porting/checkansi.pl Check source code for ANSI-C violations -Porting/checkAUTHORS.pl Check that the AUTHORS file is complete -Porting/checkcfguse.pl Check that config symbols are being used -Porting/checkcfgvar.pl Check that config scripts define all symbols -Porting/checkpodencoding.pl Check POD encoding -Porting/checkURL.pl Check whether we have working URLs -Porting/checkVERSION.pl Check whether we have $VERSIONs -Porting/cmpVERSION.pl Compare whether two trees have changed modules -Porting/config.sh Sample config.sh -Porting/config_H Sample config.h -Porting/config_h.pl Reorder config_h.SH after metaconfig -Porting/core-cpan-diff Compare core distros with their CPAN equivalents -Porting/core-team.json Membership of the Perl Core Team -Porting/corecpan.pl Reports outdated dual-lived modules -Porting/corelist.pl Generates data for Module::CoreList -Porting/corelist-diff Tool to produce corelist diffs -Porting/corelist-perldelta.pl Generates data perldelta from Module::CoreList -Porting/deparse-skips.txt List of test files to ignore/skip for deparse tests. -Porting/docs-team-charter.pod Perl Documentation Team charter -Porting/epigraphs.pod the release epigraphs used over the years -Porting/exec-bit.txt List of files that get +x in release tarball -Porting/exercise_makedef.pl Brute force testing for makedef.pl -Porting/expand-macro.pl A tool to expand C macro definitions in the Perl source -Porting/findrfuncs Find reentrant variants of functions used in an executable -Porting/git-deltatool Mark commits for perldelta in git notes -Porting/git-find-p4-change Find the change for a p4 change number -Porting/git-make-p4-refs Output git refs for each p4 change number, suitable for appending to .git/packed-refs -Porting/GitUtils.pm Generate the contents of a .patch file -Porting/Glossary Glossary of config.sh variables -Porting/harness-timer-report.pl Analyze the timings from the test harness -Porting/how_to_write_a_perldelta.pod Bluffer's guide to writing a perldelta. -Porting/leakfinder.pl Hacky script for finding memory leaks -Porting/Maintainers Program to pretty print info in Maintainers.pl -Porting/Maintainers.pl Information about maintainers -Porting/Maintainers.pm Library to pretty print info in Maintainers.pl -Porting/make-rmg-checklist Generates a checklist 4 the release manager -Porting/make_dot_patch.pl Make a .patch file from a git WD -Porting/make_snapshot.pl Make a tgz snapshot of our tree with a .patch file in it -Porting/makemeta Create the top-level META.yml -Porting/makerel Release making utility -Porting/manicheck Check against MANIFEST -Porting/manifest_lib.pl Library for checking and sorting the MANIFEST -Porting/manisort Sort the MANIFEST -Porting/mksample Generate Porting/config_H and Porting/config.sh -Porting/new-perldelta.pl Generate a new perldelta -Porting/newtests-perldelta.pl Generate Perldelta stub for newly added tests -Porting/perldelta_template.pod Template for creating new perldelta.pod files +os2/OS2/OS2-REXX/Changes DLL access module +os2/OS2/OS2-REXX/DLL/Changes DLL access module +os2/OS2/OS2-REXX/DLL/DLL.pm DLL access module +os2/OS2/OS2-REXX/DLL/DLL.xs DLL access module +os2/OS2/OS2-REXX/DLL/Makefile.PL DLL access module +os2/OS2/OS2-REXX/DLL/MANIFEST DLL access module +os2/OS2/OS2-REXX/Makefile.PL DLL access module +os2/OS2/OS2-REXX/MANIFEST DLL access module +os2/OS2/OS2-REXX/REXX.pm DLL access module +os2/OS2/OS2-REXX/REXX.xs DLL access module +os2/OS2/OS2-REXX/t/rx_cmprt.t DLL access module +os2/OS2/OS2-REXX/t/rx_dllld.t DLL access module +os2/OS2/OS2-REXX/t/rx_emxrv.t DLL access module +os2/OS2/OS2-REXX/t/rx_objcall.t DLL access module +os2/OS2/OS2-REXX/t/rx_sql.test DLL access module +os2/OS2/OS2-REXX/t/rx_tiesql.test DLL access module +os2/OS2/OS2-REXX/t/rx_tievar.t DLL access module +os2/OS2/OS2-REXX/t/rx_tieydb.t DLL access module +os2/OS2/OS2-REXX/t/rx_varset.t DLL access module +os2/OS2/OS2-REXX/t/rx_vrexx.t DLL access module +os2/OS2/typemap Common typemap for OS/2 types +os2/os2_base.t Additional tests for builtin methods +os2/os2_pipe.t Tests for pipe creation logic +os2/os2add.sym Overriding symbols to export +os2/os2ish.h Header for OS/2 +os2/os2thread.h pthread-like typedefs +os2/perl2cmd.pl Corrects installed binaries under OS/2 +os2/perlrexx.c Support perl interpreter embedded in REXX +os2/perlrexx.cmd Test perl interpreter embedded in REXX +plan9/9front.patch Plan9 port: patch for 9front-specific flavor of Plan 9 +plan9/aperl Plan9 port: shell to make Perl error messages Acme-friendly +plan9/arpa/inet.h Plan9 port: replacement C header file +plan9/buildinfo Plan9 port: configuration information +plan9/config.plan9 Plan9 port: config.h template +plan9/config_h.sample Plan9 port: 5.32.0 sample config.h +plan9/config_sh.sample Plan9 port: 5.32.0 sample config.sh +plan9/exclude Plan9 port: tests to skip +plan9/fndvers Plan9 port: update Perl version in config.plan9 +plan9/genconfig.pl Plan9 port: generate config.sh +plan9/math.h Plan9 port: Plan9-specific math.h +plan9/mkfile Plan9 port: Mk driver for build +plan9/myconfig.plan9 Plan9 port: script to print config summary +plan9/plan9.c Plan9 port: Plan9-specific C routines +plan9/plan9ish.h Plan9 port: Plan9-specific C header file +plan9/setup.rc Plan9 port: script for easy build+install +plan9/uninstall.rc Plan9 port: uninstall script +plan9/versnum Plan9 port: script to print version number +pod/buildtoc Generate pod/perltoc.pod and pod/roffitall +pod/Makefile.SH generate Makefile which makes pods into something else +pod/perl.pod Perl overview (this section) +pod/perl5004delta.pod Perl changes in version 5.004 +pod/perl5005delta.pod Perl changes in version 5.005 +pod/perl5100delta.pod Perl changes in version 5.10.0 +pod/perl5101delta.pod Perl changes in version 5.10.1 +pod/perl5120delta.pod Perl changes in version 5.12.0 +pod/perl5121delta.pod Perl changes in version 5.12.1 +pod/perl5122delta.pod Perl changes in version 5.12.2 +pod/perl5123delta.pod Perl changes in version 5.12.3 +pod/perl5124delta.pod Perl changes in version 5.12.4 +pod/perl5125delta.pod Perl changes in version 5.12.5 +pod/perl5140delta.pod Perl changes in version 5.14.0 +pod/perl5141delta.pod Perl changes in version 5.14.1 +pod/perl5142delta.pod Perl changes in version 5.14.2 +pod/perl5143delta.pod Perl changes in version 5.14.3 +pod/perl5144delta.pod Perl changes in version 5.14.4 +pod/perl5160delta.pod Perl changes in version 5.16.0 +pod/perl5161delta.pod Perl changes in version 5.16.1 +pod/perl5162delta.pod Perl changes in version 5.16.2 +pod/perl5163delta.pod Perl changes in version 5.16.3 +pod/perl5180delta.pod Perl changes in version 5.18.0 +pod/perl5181delta.pod Perl changes in version 5.18.1 +pod/perl5182delta.pod Perl changes in version 5.18.2 +pod/perl5184delta.pod Perl changes in version 5.18.4 +pod/perl5200delta.pod Perl changes in version 5.20.0 +pod/perl5201delta.pod Perl changes in version 5.20.1 +pod/perl5202delta.pod Perl changes in version 5.20.2 +pod/perl5203delta.pod Perl changes in version 5.20.3 +pod/perl5220delta.pod Perl changes in version 5.22.0 +pod/perl5221delta.pod Perl changes in version 5.22.1 +pod/perl5222delta.pod Perl changes in version 5.22.2 +pod/perl5223delta.pod Perl changes in version 5.22.3 +pod/perl5224delta.pod Perl changes in version 5.22.4 +pod/perl5240delta.pod Perl changes in version 5.24.0 +pod/perl5241delta.pod Perl changes in version 5.24.1 +pod/perl5242delta.pod Perl changes in version 5.24.2 +pod/perl5243delta.pod Perl changes in version 5.24.3 +pod/perl5244delta.pod Perl changes in version 5.24.4 +pod/perl5260delta.pod Perl changes in version 5.26.0 +pod/perl5261delta.pod Perl changes in version 5.26.1 +pod/perl5262delta.pod Perl changes in version 5.26.2 +pod/perl5263delta.pod Perl changes in version 5.26.3 +pod/perl5280delta.pod Perl changes in version 5.28.0 +pod/perl5281delta.pod Perl changes in version 5.28.1 +pod/perl5282delta.pod Perl changes in version 5.28.2 +pod/perl5283delta.pod Perl changes in version 5.28.3 +pod/perl5300delta.pod Perl changes in version 5.30.0 +pod/perl5301delta.pod Perl changes in version 5.30.1 +pod/perl5302delta.pod Perl changes in version 5.30.2 +pod/perl5303delta.pod Perl changes in version 5.30.3 +pod/perl5320delta.pod Perl changes in version 5.32.0 +pod/perl5321delta.pod Perl changes in version 5.32.1 +pod/perl5340delta.pod Perl changes in version 5.34.0 +pod/perl5341delta.pod Perl changes in version 5.34.1 +pod/perl5342delta.pod Perl changes in version 5.34.2 +pod/perl5343delta.pod Perl changes in version 5.34.3 +pod/perl5360delta.pod Perl changes in version 5.36.0 +pod/perl5361delta.pod Perl changes in version 5.36.1 +pod/perl5362delta.pod Perl changes in version 5.36.2 +pod/perl5363delta.pod Perl changes in version 5.36.3 +pod/perl5380delta.pod Perl changes in version 5.38.0 +pod/perl5381delta.pod Perl changes in version 5.38.1 +pod/perl561delta.pod Perl changes in version 5.6.1 +pod/perl56delta.pod Perl changes in version 5.6 +pod/perl581delta.pod Perl changes in version 5.8.1 +pod/perl582delta.pod Perl changes in version 5.8.2 +pod/perl583delta.pod Perl changes in version 5.8.3 +pod/perl584delta.pod Perl changes in version 5.8.4 +pod/perl585delta.pod Perl changes in version 5.8.5 +pod/perl586delta.pod Perl changes in version 5.8.6 +pod/perl587delta.pod Perl changes in version 5.8.7 +pod/perl588delta.pod Perl changes in version 5.8.8 +pod/perl589delta.pod Perl changes in version 5.8.9 +pod/perl58delta.pod Perl changes in version 5.8.0 +pod/perlapio.pod Perl internal IO abstraction interface +pod/perlartistic.pod Perl Artistic License +pod/perlbook.pod Perl book information +pod/perlboot.pod +pod/perlbot.pod +pod/perlcall.pod Perl calling conventions from C +pod/perlcheat.pod Perl cheat sheet +pod/perlclass.pod Perl class syntax +pod/perlclassguts.pod Internals of class syntax +pod/perlclib.pod Internal replacements for standard C library functions +pod/perlcommunity.pod Perl community information +pod/perldata.pod Perl data structures +pod/perldbmfilter.pod Perl DBM filters +pod/perldebguts.pod Perl debugging guts and tips +pod/perldebtut.pod Perl debugging tutorial +pod/perldebug.pod Perl debugging +pod/perldelta.pod Perl changes since previous version +pod/perldeprecation.pod Perl deprecations +pod/perldiag.pod Perl diagnostic messages +pod/perldocstyle.pod Perl style guide for core docs +pod/perldsc.pod Perl data structures intro +pod/perldtrace.pod Perl's support for DTrace +pod/perlebcdic.pod Considerations for running Perl on EBCDIC platforms +pod/perlembed.pod Perl ways to embed perl in your C or C++ application +pod/perlexperiment.pod A listing of experimental features in Perl +pod/perlfilter.pod Perl source filters +pod/perlfork.pod Perl fork() information +pod/perlform.pod Perl formats +pod/perlfunc.pod Perl built-in functions +pod/perlgit.pod Using git with the Perl repository +pod/perlgov.pod Perl Rules of Governance +pod/perlgpl.pod GNU General Public License +pod/perlguts.pod Perl internal functions for those doing extensions +pod/perlhack.pod Perl hackers guide +pod/perlhacktips.pod Tips for Perl core C code hacking +pod/perlhacktut.pod Walk through the creation of a simple C code patch +pod/perlhist.pod Perl history records +pod/perlinterp.pod Overview of the Perl interpreter source and how it works +pod/perlintro.pod Perl introduction for beginners +pod/perliol.pod C API for Perl's implementation of IO in Layers +pod/perlipc.pod Perl interprocess communication +pod/perllexwarn.pod Perl warnings and their control +pod/perllocale.pod Perl locale support +pod/perllol.pod Perl data structures: arrays of arrays +pod/perlmod.pod Perl modules: how they work +pod/perlmodinstall.pod Perl modules: how to install from CPAN +pod/perlmodlib.PL Generate pod/perlmodlib.pod +pod/perlmodstyle.pod Perl modules: how to write modules with style +pod/perlmroapi.pod Perl method resolution plugin interface +pod/perlnewmod.pod Perl modules: preparing a new module for distribution +pod/perlnumber.pod Perl number semantics +pod/perlobj.pod Perl objects +pod/perlootut.pod Perl OO tutorial for beginners +pod/perlop.pod Perl operators and precedence +pod/perlopentut.pod Perl open() tutorial +pod/perlpacktut.pod Perl pack() and unpack() tutorial +pod/perlperf.pod Perl Performance and Optimization Techniques +pod/perlpod.pod Perl plain old documentation +pod/perlpodspec.pod Perl plain old documentation format specification +pod/perlpodstyle.pod Perl POD style guide +pod/perlpolicy.pod Perl development policies +pod/perlport.pod Perl portability guide +pod/perlpragma.pod Perl modules: writing a user pragma +pod/perlre.pod Perl regular expressions, the rest of the story +pod/perlreapi.pod Perl regular expression plugin interface +pod/perlrebackslash.pod Perl regular expression backslash sequences +pod/perlrecharclass.pod Perl regular expression character classes +pod/perlref.pod Perl references, the rest of the story +pod/perlreftut.pod Perl references short introduction +pod/perlreguts.pod Perl regular expression engine internals +pod/perlrepository.pod +pod/perlrequick.pod Perl regular expressions quick start +pod/perlreref.pod Perl regular expressions quick reference +pod/perlretut.pod Perl regular expressions tutorial +pod/perlrun.pod Perl execution and options +pod/perlsec.pod Perl security +pod/perlsecpolicy.pod Perl security report handling policy +pod/perlsource.pod Guide to the Perl source tree +pod/perlstyle.pod Perl style guide +pod/perlsub.pod Perl subroutines +pod/perlsyn.pod Perl syntax +pod/perlthrtut.pod Perl threads tutorial +pod/perltie.pod Perl objects hidden behind simple variables +pod/perltodo.pod +pod/perltooc.pod +pod/perltoot.pod +pod/perltrap.pod Perl traps for the unwary +pod/perlunicode.pod Perl Unicode support +pod/perlunicook.pod Perl Unicode cookbook +pod/perlunifaq.pod Perl Unicode FAQ +pod/perluniintro.pod Perl Unicode introduction +pod/perluniprops.pod Index of Unicode properties in Perl +pod/perlunitut.pod Perl Unicode tutorial +pod/perlutil.pod utilities packaged with the Perl distribution +pod/perlvar.pod Perl predefined variables +pod/perlvms.pod Perl notes for VMS +pod/rofftoc Generate a table of contents in troff format +pod/splitman Splits perlfunc into multiple man pages +pod/splitpod Splits perlfunc into multiple pod pages +Porting/acknowledgements.pl Generate perldelta acknowledgements text +Porting/add-package.pl Add/Update CPAN modules that are part of Core +Porting/add-pod-file Utility to add new pod/*.pod file to core distribution +Porting/bench.pl Run benchmarks against t/perf/benchmarks +Porting/bisect.pl A tool to make bisecting easy +Porting/bisect-example.sh Example script to use with git bisect run +Porting/bisect-runner.pl Tool to be called by git bisect run +Porting/bump-perl-version bump the perl version in relevant files +Porting/check-cpan-pollution Check for commits that may wrongly touch CPAN distros +Porting/checkansi.pl Check source code for ANSI-C violations +Porting/checkcfguse.pl Check that config symbols are being used +Porting/checkcfgvar.pl Check that config scripts define all symbols +Porting/checkpodencoding.pl Check POD encoding +Porting/checkURL.pl Check whether we have working URLs +Porting/checkVERSION.pl Check whether we have $VERSIONs +Porting/cmpVERSION.pl Compare whether two trees have changed modules +Porting/config.sh Sample config.sh +Porting/config_H Sample config.h +Porting/config_h.pl Reorder config_h.SH after metaconfig +Porting/core-cpan-diff Compare core distros with their CPAN equivalents +Porting/core-team.json Membership of the Perl Core Team +Porting/corecpan.pl Reports outdated dual-lived modules +Porting/corelist.pl Generates data for Module::CoreList +Porting/corelist-diff Tool to produce corelist diffs +Porting/corelist-perldelta.pl Generates data perldelta from Module::CoreList +Porting/deparse-skips.txt List of test files to ignore/skip for deparse tests. +Porting/docs-team-charter.pod Perl Documentation Team charter +Porting/epigraphs.pod the release epigraphs used over the years +Porting/exclude_contrib.txt Data about contributors that do not want to be listed in AUTHORS +Porting/exec-bit.txt List of files that get +x in release tarball +Porting/exercise_makedef.pl Brute force testing for makedef.pl +Porting/expand-macro.pl A tool to expand C macro definitions in the Perl source +Porting/findrfuncs Find reentrant variants of functions used in an executable +Porting/git-deltatool Mark commits for perldelta in git notes +Porting/git-find-p4-change Find the change for a p4 change number +Porting/git-make-p4-refs Output git refs for each p4 change number, suitable for appending to .git/packed-refs +Porting/GitUtils.pm Generate the contents of a .patch file +Porting/Glossary Glossary of config.sh variables +Porting/harness-timer-report.pl Analyze the timings from the test harness +Porting/how_to_write_a_perldelta.pod Bluffer's guide to writing a perldelta. +Porting/leakfinder.pl Hacky script for finding memory leaks +Porting/Maintainers Program to pretty print info in Maintainers.pl +Porting/Maintainers.pl Information about maintainers +Porting/Maintainers.pm Library to pretty print info in Maintainers.pl +Porting/make-rmg-checklist Generates a checklist 4 the release manager +Porting/make_dot_patch.pl Make a .patch file from a git WD +Porting/make_snapshot.pl Make a tgz snapshot of our tree with a .patch file in it +Porting/makemeta Create the top-level META.yml +Porting/makerel Release making utility +Porting/manicheck Check against MANIFEST +Porting/manifest_lib.pl Library for checking and sorting the MANIFEST +Porting/manisort Sort the MANIFEST +Porting/mksample Generate Porting/config_H and Porting/config.sh +Porting/new-perldelta.pl Generate a new perldelta +Porting/newtests-perldelta.pl Generate Perldelta stub for newly added tests +Porting/perldelta_template.pod Template for creating new perldelta.pod files Porting/perlgov-team-update Tool to update perlgov from perl-core-teaml -Porting/perlhist_calculate.pl Perform calculations to update perlhist -Porting/pod_lib.pl Code for handling generated pods -Porting/pod_rules.pl generate lists of pod files for Makefiles -Porting/podtidy Reformat pod using Pod::Tidy -Porting/pumpkin.pod Guidelines and hints for Perl maintainers -Porting/README.pod Outline of contents of Porting directory -Porting/README.y2038 Perl notes for the 2038 fix +Porting/perlhist_calculate.pl Perform calculations to update perlhist +Porting/pod_lib.pl Code for handling generated pods +Porting/pod_rules.pl generate lists of pod files for Makefiles +Porting/podtidy Reformat pod using Pod::Tidy +Porting/pumpkin.pod Guidelines and hints for Perl maintainers +Porting/README.pod Outline of contents of Porting directory +Porting/README.y2038 Perl notes for the 2038 fix Porting/release_announcement_template.txt -Porting/release_managers_guide.pod Release Manager's Guide -Porting/release_schedule.pod Schedule for future releases -Porting/rt_list_patches A tool to help you apply patches from RT -Porting/security_template.pod Template for vulnerability announcements -Porting/sort_perldiag.pl Keep our diagnostics orderly -Porting/sync-with-cpan Sync with CPAN -Porting/timecheck.c Test program for the 2038 fix -Porting/timecheck2.c Test program for the 2038 fix -Porting/todo.pod Perl things to do -Porting/updateAUTHORS.pl Tool to automatically update AUTHORS and .mailmap from git log data -Porting/valgrindpp.pl Summarize valgrind reports -Porting/vote_admin_guide.pod Perlgov Vote Administrator guide -pp.c Push/Pop code -pp.h Push/Pop code defs -pp_ctl.c Push/Pop code for control flow -pp_hot.c Push/Pop code for heavily used opcodes -pp_pack.c Push/Pop code for pack/unpack -pp_proto.h C++ definitions for Push/Pop code -pp_sort.c Push/Pop code for sort -pp_sys.c Push/Pop code for system interaction -proto.h Prototypes -qnx/ar QNX implementation of "ar" utility -qnx/cpp QNX implementation of preprocessor filter -qnx/qnx.c QNX silent matherr callback -README The Instructions -README.aix Perl notes for AIX -README.amiga Perl notes for AmigaOS -README.android Perl notes for Android -README.bs2000 Perl notes for POSIX-BC BS2000 -README.cn Perl for Simplified Chinese (in UTF-8) -README.cygwin Perl notes for Cygwin -README.freebsd Perl notes for FreeBSD -README.haiku Perl notes for Haiku -README.hpux Perl notes for HP-UX -README.hurd Perl notes for Hurd -README.irix Perl notes for Irix -README.jp Perl for Japanese (in EUC-JP) -README.ko Perl for Korean (in EUC-KR) -README.linux Perl notes for Linux -README.macosx Perl notes for Mac OS X -README.micro Notes about microperl -README.openbsd Perl notes for OpenBSD -README.os2 Perl notes for OS/2 -README.os390 Perl notes for OS/390 -README.os400 Perl notes for OS/400 -README.plan9 Perl notes for Plan 9 -README.qnx Perl notes for QNX -README.riscos Perl notes for RISC OS -README.solaris Perl notes for Solaris -README.synology Perl notes for Synology -README.tru64 Perl notes for Tru64 -README.tw Perl for Traditional Chinese (in Big5) -README.vms Notes about installing the VMS port -README.vos Perl notes for Stratus VOS -README.win32 Perl notes for Windows -reentr.c Reentrant interfaces -reentr.h Reentrant interfaces -regcharclass.h Generated by regen/regcharclass.pl -regcomp.c Regular expression compiler -regcomp.h Private declarations for above -regcomp.sym Data for regnodes.h -regen.pl Run all scripts that (re)generate files -regen/charset_translations.pl Character set utilities -regen/ebcdic.pl Generates ebcdic_tables.h -regen/embed.pl Produces {embed,embedvar,proto}.h -regen/embed_lib.pl Reads embed.fnc and regen/opcodes -regen/feature.pl Generates feature.pm -regen/genpacksizetables.pl Generate the size tables for pack/unpack -regen/keywords.pl Program to write keywords.h -regen/lib_cleanup.pl Generate lib/.gitignore from MANIFEST -regen/mg_vtable.pl generate mg_vtable.h -regen/miniperlmain.pl generate miniperlmain.c -regen/mk_invlists.pl Generates charclass_invlists.h -regen/mk_PL_charclass.pl Populate the PL_charclass table -regen/mph.pl Generate perfect hashes -regen/op_private Definitions of bits in an OP's op_private field -regen/opcode.pl Opcode header generator -regen/opcodes Opcode data -regen/overload.pl generate overload.h -regen/reentr.pl Reentrant interfaces -regen/regcharclass.pl Generate regcharclass.h from inline data +Porting/release_managers_guide.pod Release Manager's Guide +Porting/release_schedule.pod Schedule for future releases +Porting/rt_list_patches A tool to help you apply patches from RT +Porting/security_template.pod Template for vulnerability announcements +Porting/sort_perldiag.pl Keep our diagnostics orderly +Porting/sync-with-cpan Sync with CPAN +Porting/test-dist-modules.pl Test dist/ modules on currently active perl (used for CI) +Porting/timecheck.c Test program for the 2038 fix +Porting/timecheck2.c Test program for the 2038 fix +Porting/todo.pod Perl things to do +Porting/updateAUTHORS.pl Tool to automatically update AUTHORS and .mailmap from git log data +Porting/updateAUTHORS.pm Brains of updateAUTHORS.pl +Porting/valgrindpp.pl Summarize valgrind reports +Porting/vote_admin_guide.pod Perlgov Vote Administrator guide +qnx/ar QNX implementation of "ar" utility +qnx/cpp QNX implementation of preprocessor filter +qnx/qnx.c QNX silent matherr callback +regen/charset_translations.pl Character set utilities +regen/ebcdic.pl Generates ebcdic_tables.h +regen/embed.pl Produces {embed,embedvar,proto}.h +regen/embed_lib.pl Reads embed.fnc and regen/opcodes +regen/feature.pl Generates feature.pm +regen/genpacksizetables.pl Generate the size tables for pack/unpack +regen/HeaderParser.pm Module used to parse header files +regen/keywords.pl Program to write keywords.h +regen/lib_cleanup.pl Generate lib/.gitignore from MANIFEST +regen/mg_vtable.pl generate mg_vtable.h +regen/miniperlmain.pl generate miniperlmain.c +regen/mk_invlists.pl Generates charclass_invlists.h +regen/mk_PL_charclass.pl Populate the PL_charclass table +regen/mph.pl Generate perfect hashes +regen/op_private Definitions of bits in an OP's op_private field +regen/opcode.pl Opcode header generator +regen/opcodes Opcode data +regen/overload.pl generate overload.h +regen/reentr.pl Reentrant interfaces +regen/regcharclass.pl Generate regcharclass.h from inline data regen/regcharclass_multi_char_folds.pl Generate input for regcharclass.pl -regen/regcomp.pl Builder of regnodes.h -regen/regen_lib.pl Common file routines for generator scripts -regen/uconfig_h.pl generate uconfig.h (requires /bin/sh) -regen/unicode_constants.pl generate unicode_constants.h -regen/warnings.pl Program to write warnings.h and lib/warnings.pm -regen_perly.pl generate perly.{act,h,tab} from perly.y -regexec.c Regular expression evaluator -regexp.h Public declarations for the above -regnodes.h Description of nodes of RE engine -run.c The interpreter loop -runtests.SH A script that generates runtests -sbox32_hash.h SBox hash code (32 Bit SBOX based hash function) -scope.c Scope entry and exit code -scope.h Scope entry and exit header -SECURITY.md Add Security Policy for GitHub -sv.c Scalar value code -sv.h Scalar value header -sv_inline.h Perl_newSV_type and required defs -t/base/cond.t See if conditionals work -t/base/if.t See if if works -t/base/lex.t See if lexical items work -t/base/num.t See if numbers work -t/base/pat.t See if pattern matching works -t/base/rs.t See if record-read works -t/base/term.t See if various terms work -t/base/translate.t See if character set translation works -t/base/while.t See if while work +regen/regcomp.pl Builder of regnodes.h +regen/regen_lib.pl Common file routines for generator scripts +regen/scope_types.pl Regenerate scope_types.h +regen/tidy_embed.pl Program to clean up embed.fnc manually +regen/uconfig_h.pl generate uconfig.h (requires /bin/sh) +regen/unicode_constants.pl generate unicode_constants.h +regen/warnings.pl Program to write warnings.h and lib/warnings.pm +t/base/cond.t See if conditionals work +t/base/if.t See if if works +t/base/lex.t See if lexical items work +t/base/num.t See if numbers work +t/base/pat.t See if pattern matching works +t/base/rs.t See if record-read works +t/base/term.t See if various terms work +t/base/translate.t See if character set translation works +t/base/while.t See if while work t/benchmark/gh7094-speed-up-keys-on-empty-hash.t Benchmark if keys on empty hashes is fast enough -t/bigmem/hash.t Check hashing too large strings throws an exception -t/bigmem/index.t Check that index() handles large offsets -t/bigmem/pos.t Check that pos() handles large offsets -t/bigmem/read.t Check read() handles large offsets -t/bigmem/regexp.t Test regular expressions with large strings -t/bigmem/subst.t Test s/// with large strings -t/bigmem/vec.t Check vec() handles large offsets -t/charset_tools.pl To aid in portable testing across platforms with different character sets -t/cmd/elsif.t See if else-if works -t/cmd/for.t See if for loops work -t/cmd/mod.t See if statement modifiers work -t/cmd/subval.t See if subroutine values work -t/cmd/switch.t See if switch optimizations work -t/comp/bproto.t See if builtins conform to their prototypes -t/comp/cmdopt.t See if command optimization works -t/comp/colon.t See if colons are parsed correctly -t/comp/decl.t See if declarations work -t/comp/filter_exception.t See if $@ survives source filters -t/comp/final_line_num.t See if line numbers are correct at EOF -t/comp/fold.t See if constant folding works -t/comp/form_scope.t See if format scoping works -t/comp/hints.aux Auxiliary file for %^H test -t/comp/hints.t See if %^H works -t/comp/line_debug.t See if @{"_<$file"} works -t/comp/line_debug_0.aux Auxiliary file for @{"_<$file"} test -t/comp/multiline.t See if multiline strings work -t/comp/opsubs.t See if q() etc. are not parsed as functions -t/comp/our.t Tests for our declaration -t/comp/package.t See if packages work -t/comp/package_block.t See if package block syntax works -t/comp/parser.t See if the parser works in edge cases +t/bigmem/hash.t Check hashing too large strings throws an exception +t/bigmem/index.t Check that index() handles large offsets +t/bigmem/pos.t Check that pos() handles large offsets +t/bigmem/read.t Check read() handles large offsets +t/bigmem/regexp.t Test regular expressions with large strings +t/bigmem/subst.t Test s/// with large strings +t/bigmem/vec.t Check vec() handles large offsets +t/charset_tools.pl To aid in portable testing across platforms with different character sets +t/class/class.t See if class declarations work +t/class/construct.t See if class constructors work +t/class/destruct.t See if class destruction works +t/class/field.t See if class field declarations work +t/class/inherit.t See if class inheritance works +t/class/method.t See if class method declarations work +t/class/phasers.t See if class phaser blocks work +t/class/threads.t See if classes work across multiple threads +t/cmd/elsif.t See if else-if works +t/cmd/for.t See if for loops work +t/cmd/mod.t See if statement modifiers work +t/cmd/subval.t See if subroutine values work +t/cmd/switch.t See if switch optimizations work +t/comp/bproto.t See if builtins conform to their prototypes +t/comp/cmdopt.t See if command optimization works +t/comp/colon.t See if colons are parsed correctly +t/comp/decl.t See if declarations work +t/comp/filter_exception.t See if $@ survives source filters +t/comp/final_line_num.t See if line numbers are correct at EOF +t/comp/fold.t See if constant folding works +t/comp/form_scope.t See if format scoping works +t/comp/hints.aux Auxiliary file for %^H test +t/comp/hints.t See if %^H works +t/comp/line_debug.t See if @{"_<$file"} works +t/comp/line_debug_0.aux Auxiliary file for @{"_<$file"} test +t/comp/multiline.t See if multiline strings work +t/comp/opsubs.t See if q() etc. are not parsed as functions +t/comp/our.t Tests for our declaration +t/comp/package.t See if packages work +t/comp/package_block.t See if package block syntax works +t/comp/parser.t See if the parser works in edge cases t/comp/parser_run.t See if parser works in additional edge case -t/comp/proto.t See if function prototypes work -t/comp/redef.t See if we get correct warnings on redefined subs -t/comp/require.t See if require works -t/comp/retainedlines.t See if the debugger can retain eval's lines -t/comp/term.t See if more terms work -t/comp/uproto.t See if the _ prototype works -t/comp/use.t See if pragmata work -t/comp/utf.t See if UTFs work -t/harness Finer diagnostics from test suite -t/io/argv.t See if ARGV stuff works -t/io/binmode.t See if binmode() works -t/io/bom.t See if scripts can start with a byte order mark -t/io/closepid.t See if close works for subprocesses -t/io/crlf.t See if :crlf works -t/io/crlf_through.t See if pipe passes data intact with :crlf -t/io/data.t See if DATA works -t/io/defout.t See if PL_defoutgv works -t/io/dup.t See if >& works right -t/io/eintr.t See if code called during EINTR is safe -t/io/eintr_print.t Test that print is not returning EINTR -t/io/errno.t See if $! is correctly set -t/io/errnosig.t Test case for restoration $! when leaving signal handlers -t/io/fflush.t See if auto-flush on fork/exec/system/qx works -t/io/fs.t See if directory manipulations work -t/io/getcwd.t See if Internals::getcwd is sane -t/io/inplace.t See if inplace editing works -t/io/iofile.t See if we can load IO::File on demand -t/io/iprefix.t See if inplace editing works with prefixes -t/io/layers.t See if PerlIO layers work -t/io/msg.t See if SysV message queues work -t/io/nargv.t See if nested ARGV stuff works -t/io/open.t See if open works -t/io/openpid.t See if open works for subprocesses +t/comp/proto.t See if function prototypes work +t/comp/redef.t See if we get correct warnings on redefined subs +t/comp/require.t See if require works +t/comp/retainedlines.t See if the debugger can retain eval's lines +t/comp/term.t See if more terms work +t/comp/uproto.t See if the _ prototype works +t/comp/use.t See if pragmata work +t/comp/utf.t See if UTFs work +t/harness Finer diagnostics from test suite +t/io/argv.t See if ARGV stuff works +t/io/binmode.t See if binmode() works +t/io/bom.t See if scripts can start with a byte order mark +t/io/closepid.t See if close works for subprocesses +t/io/crlf.t See if :crlf works +t/io/crlf_through.t See if pipe passes data intact with :crlf +t/io/data.t See if DATA works +t/io/defout.t See if PL_defoutgv works +t/io/dup.t See if >& works right +t/io/eintr.t See if code called during EINTR is safe +t/io/eintr_print.t Test that print is not returning EINTR +t/io/errno.t See if $! is correctly set +t/io/errnosig.t Test case for restoration $! when leaving signal handlers +t/io/fflush.t See if auto-flush on fork/exec/system/qx works +t/io/fs.t See if directory manipulations work +t/io/getcwd.t See if Internals::getcwd is sane +t/io/inplace.t See if inplace editing works +t/io/iofile.t See if we can load IO::File on demand +t/io/iprefix.t See if inplace editing works with prefixes +t/io/layers.t See if PerlIO layers work +t/io/msg.t See if SysV message queues work +t/io/nargv.t See if nested ARGV stuff works +t/io/open.t See if open works +t/io/openpid.t See if open works for subprocesses t/io/paragraph_mode.t See if paragraph mode works -t/io/perlio.t See if PerlIO works -t/io/perlio_fail.t See if bad layers fail -t/io/perlio_leaks.t See if PerlIO layers are leaking -t/io/perlio_open.t See if certain special forms of open work -t/io/pipe.t See if secure pipes work -t/io/print.t See if print commands work -t/io/pvbm.t See if PVBMs break IO commands -t/io/read.t See if read works -t/io/say.t See if say works -t/io/sem.t See if SysV semaphores work -t/io/semctl.t See if SysV semaphore semctl works -t/io/shm.t See if SysV shared memory works -t/io/socket.t See if socket functions work -t/io/socketpair.t See if socketpair function works -t/io/tell.t See if file seeking works -t/io/through.t See if pipe passes data intact -t/io/utf8.t See if file seeking works -t/japh/abigail.t Obscure tests -t/lib/CannotParse.pm For test case in op/require_errors.t -t/lib/charnames/alias Tests of "use charnames" with aliases. -t/lib/Cname.pm Test charnames in regexes (op/pat.t) -t/lib/common.pl Helper for lib/{warnings,feature}.t -t/lib/commonsense.t See if configuration meets basic needs -t/lib/Count.pm Helper for t/op/method.t -t/lib/croak.t Test calls to Perl_croak() in the C source. -t/lib/croak/gv Test croak calls from gv.c -t/lib/croak/mg Test croak calls from mg.c -t/lib/croak/op Test croak calls from op.c -t/lib/croak/pp Test croak calls from pp.c -t/lib/croak/pp_ctl Test croak calls from pp_ctl.c -t/lib/croak/pp_hot Test croak calls from pp_hot.c -t/lib/croak/pp_sys Test croak calls from pp_sys.c -t/lib/croak/regcomp Test croak calls from regcomp.c -t/lib/croak/toke Test croak calls from toke.c -t/lib/croak/toke_l1 Test croak calls from toke.c; file is not UTF-8 encoded -t/lib/cygwin.t Builtin cygwin function tests -t/lib/dbmt_common.pl Common functionality for ?DBM_File tests -t/lib/deprecate.t Test deprecate.pm -t/lib/deprecate/Deprecated.pm Deprecated module to test deprecate.pm -t/lib/deprecate/Optionally.pm Optionally deprecated module to test deprecate.pm -t/lib/Devel/nodb.pm Module for t/run/switchd.t -t/lib/Devel/switchd.pm Module for t/run/switchd.t -t/lib/Devel/switchd_empty.pm Module for t/run/switchd.t -t/lib/Devel/switchd_goto.pm Module for t/run/switchd.t -t/lib/feature/api Test API for checking features enabled/disabled +t/io/perlio.t See if PerlIO works +t/io/perlio_fail.t See if bad layers fail +t/io/perlio_leaks.t See if PerlIO layers are leaking +t/io/perlio_open.t See if certain special forms of open work +t/io/pipe.t See if secure pipes work +t/io/print.t See if print commands work +t/io/pvbm.t See if PVBMs break IO commands +t/io/read.t See if read works +t/io/say.t See if say works +t/io/sem.t See if SysV semaphores work +t/io/semctl.t See if SysV semaphore semctl works +t/io/shm.t See if SysV shared memory works +t/io/socket.t See if socket functions work +t/io/socketpair.t See if socketpair function works +t/io/tell.t See if file seeking works +t/io/through.t See if pipe passes data intact +t/io/utf8.t See if file seeking works +t/japh/abigail.t Obscure tests +t/lib/caller/Apack.pm test Module for caller.t and t/op/hook/require.t +t/lib/caller/Bicycle.pm test Module for t/op/hook/require.t (cyclic) +t/lib/caller/Bpack.pm test Module for caller.t and t/op/hook/require.t +t/lib/caller/Cpack.pm test Module for caller.t and t/op/hook/require.t +t/lib/caller/Cycle.pm test Module for t/op/hook/require.t (cyclic) +t/lib/caller/Foo.pm test Module for caller.t and t/op/hook/require.t +t/lib/caller/Tricycle.pm test Module for t/op/hook/require.t (cyclic) +t/lib/CannotParse.pm For test case in op/require_errors.t +t/lib/charnames/alias Tests of "use charnames" with aliases. +t/lib/Cname.pm Test charnames in regexes (op/pat.t) +t/lib/common.pl Helper for lib/{warnings,feature}.t +t/lib/commonsense.t See if configuration meets basic needs +t/lib/Count.pm Helper for t/op/method.t +t/lib/croak.t Test calls to Perl_croak() in the C source. +t/lib/croak/class Test croak calls from class.c +t/lib/croak/gv Test croak calls from gv.c +t/lib/croak/mg Test croak calls from mg.c +t/lib/croak/op Test croak calls from op.c +t/lib/croak/pp Test croak calls from pp.c +t/lib/croak/pp_ctl Test croak calls from pp_ctl.c +t/lib/croak/pp_hot Test croak calls from pp_hot.c +t/lib/croak/pp_sys Test croak calls from pp_sys.c +t/lib/croak/regcomp Test croak calls from regcomp.c +t/lib/croak/toke Test croak calls from toke.c +t/lib/croak/toke_l1 Test croak calls from toke.c; file is not UTF-8 encoded +t/lib/cygwin.t Builtin cygwin function tests +t/lib/dbmt_common.pl Common functionality for ?DBM_File tests +t/lib/deprecate.t Test deprecate.pm +t/lib/deprecate/Deprecated.pm Deprecated module to test deprecate.pm +t/lib/deprecate/Optionally.pm Optionally deprecated module to test deprecate.pm +t/lib/Devel/nodb.pm Module for t/run/switchd.t +t/lib/Devel/switchd.pm Module for t/run/switchd.t +t/lib/Devel/switchd_empty.pm Module for t/run/switchd.t +t/lib/Devel/switchd_goto.pm Module for t/run/switchd.t +t/lib/Dies.pm For test case in op/require_errors.t +t/lib/feature/api Test API for checking features enabled/disabled t/lib/feature/bareword_filehandles Tests for enabling/disabling bareword_filehandles feature -t/lib/feature/bits Tests for feature bit handling -t/lib/feature/bundle Tests for feature bundles -t/lib/feature/implicit Tests for implicit loading of feature.pm -t/lib/feature/indirect Tests for enabling/disabling indirect method calls -t/lib/feature/multidimensional Tests for enabling/disabling $foo{$x, $y} => $foo{join($;, $x, $y)} -t/lib/feature/nonesuch Tests for enabling/disabling nonexistent feature -t/lib/feature/removed Tests for enabling/disabling removed feature -t/lib/feature/say Tests for enabling/disabling say feature -t/lib/feature/switch Tests for enabling/disabling switch feature -t/lib/GH_15109/Apack.pm test Module for caller.t -t/lib/GH_15109/Bpack.pm test Module for caller.t -t/lib/GH_15109/Cpack.pm test Module for caller.t -t/lib/GH_15109/Foo.pm test Module for caller.t -t/lib/h2ph.h Test header file for h2ph -t/lib/h2ph.pht Generated output from h2ph.h by h2ph, for comparison -t/lib/locale/latin1 Part of locale.t in Latin 1 -t/lib/locale/utf8 Part of locale.t in UTF8 -t/lib/mypragma.pm An example user pragma -t/lib/mypragma.t Test the example user pragma -t/lib/no_load.t Test that some modules don't load others -t/lib/overload_fallback.t Test that using overload 2x in a scope doesn't clobber fallback -t/lib/overload_nomethod.t Test that nomethod works as expected -t/lib/proxy_constant_subs.t Test that Proxy Constant Subs behave correctly -t/lib/Sans_mypragma.pm Test module for t/lib/mypragma.t -t/lib/strict/refs Tests of "use strict 'refs'" for strict.t -t/lib/strict/subs Tests of "use strict 'subs'" for strict.t -t/lib/strict/vars Tests of "use strict 'vars'" for strict.t -t/lib/subs/subs Tests of "use subs" -t/lib/test_require.pm A test file for t/op/inccode.t -t/lib/test_use.pm A test pragma for t/comp/use.t -t/lib/test_use_14937.pm A test pragma for t/comp/use.t -t/lib/universal.t Tests for functions in universal.c -t/lib/warnings/1global Tests of global warnings for warnings.t -t/lib/warnings/2use Tests for "use warnings" for warnings.t -t/lib/warnings/3both Tests for interaction of $^W and "use warnings" -t/lib/warnings/4lint Tests for -W switch -t/lib/warnings/5nolint Tests for -X switch -t/lib/warnings/6default Tests default warnings -t/lib/warnings/7fatal Tests fatal warnings -t/lib/warnings/8signal Tests warnings + __WARN__ and __DIE__ -t/lib/warnings/9enabled Tests warnings -t/lib/warnings/9uninit Tests "Use of uninitialized" warnings -t/lib/warnings/av Tests for av.c for warnings.t -t/lib/warnings/builtin Tests for builtin.c for warnings.t -t/lib/warnings/doio Tests for doio.c for warnings.t -t/lib/warnings/gv Tests for gv.c for warnings.t -t/lib/warnings/hv Tests for hv.c for warnings.t -t/lib/warnings/malloc Tests for malloc.c for warnings.t -t/lib/warnings/mg Tests for mg.c for warnings.t -t/lib/warnings/op Tests for op.c for warnings.t -t/lib/warnings/pad Tests for pad.c for warnings.t -t/lib/warnings/perl Tests for perl.c for warnings.t -t/lib/warnings/perlio Tests for perlio.c for warnings.t -t/lib/warnings/pp Tests for pp.c for warnings.t -t/lib/warnings/pp_ctl Tests for pp_ctl.c for warnings.t -t/lib/warnings/pp_hot Tests for pp_hot.c for warnings.t -t/lib/warnings/pp_pack Tests for pp_pack.c for warnings.t -t/lib/warnings/pp_sys Tests for pp_sys.c for warnings.t -t/lib/warnings/regcomp Tests for regcomp.c for warnings.t -t/lib/warnings/regexec Tests for regexec.c for warnings.t -t/lib/warnings/run Tests for run.c for warnings.t -t/lib/warnings/sv Tests for sv.c for warnings.t -t/lib/warnings/taint Tests for taint.c for warnings.t -t/lib/warnings/toke Tests for toke.c for warnings.t -t/lib/warnings/universal Tests for universal.c for warnings.t -t/lib/warnings/utf8 Tests for utf8.c for warnings.t -t/lib/warnings/util Tests for util.c for warnings.t -t/loc_tools.pl Common functions for finding platform's locales -t/mro/basic.t mro tests -t/mro/basic_01_c3.t mro tests -t/mro/basic_01_c3_utf8.t utf8 mro tests -t/mro/basic_01_dfs.t mro tests -t/mro/basic_01_dfs_utf8.t utf8 mro tests -t/mro/basic_02_c3.t mro tests -t/mro/basic_02_c3_utf8.t utf8 mro tests -t/mro/basic_02_dfs.t mro tests -t/mro/basic_02_dfs_utf8.t utf8 mro tests -t/mro/basic_03_c3.t mro tests -t/mro/basic_03_c3_utf8.t utf8 mro tests -t/mro/basic_03_dfs.t mro tests -t/mro/basic_03_dfs_utf8.t utf8 mro tests -t/mro/basic_04_c3.t mro tests -t/mro/basic_04_c3_utf8.t utf8 mro tests -t/mro/basic_04_dfs.t mro tests -t/mro/basic_04_dfs_utf8.t utf8 mro tests -t/mro/basic_05_c3.t mro tests -t/mro/basic_05_c3_utf8.t utf8 mro tests -t/mro/basic_05_dfs.t mro tests -t/mro/basic_05_dfs_utf8.t utf8 mro tests -t/mro/basic_utf8.t utf8 mro tests -t/mro/c3_with_overload.t mro tests -t/mro/c3_with_overload_utf8.t utf8 mro tests -t/mro/complex_c3.t mro tests -t/mro/complex_c3_utf8.t utf8 mro tests -t/mro/complex_dfs.t mro tests -t/mro/complex_dfs_utf8.t utf8 mro tests -t/mro/dbic_c3.t mro tests -t/mro/dbic_c3_utf8.t utf8 mro tests -t/mro/dbic_dfs.t mro tests -t/mro/dbic_dfs_utf8.t utf8 mro tests -t/mro/inconsistent_c3.t mro tests -t/mro/inconsistent_c3_utf8.t utf8 mro tests -t/mro/isa_aliases.t tests for shared @ISA arrays -t/mro/isa_aliases_utf8.t utf8 mro tests -t/mro/isa_c3.t test for optimisatised mro_get_linear_isa_c3 -t/mro/isa_c3_utf8.t utf8 mro tests -t/mro/isa_dfs.t test for optimisatised mro_get_linear_isa_dfs -t/mro/isa_dfs_utf8.t utf8 mro tests -t/mro/isarev.t PL_isarev/mro::get_isarev tests -t/mro/isarev_utf8.t utf8 mro tests -t/mro/method_caching.t mro tests -t/mro/method_caching_utf8.t utf8 mro tests -t/mro/next_edgecases.t mro tests -t/mro/next_edgecases_utf8.t utf8 mro tests -t/mro/next_goto.t mro tests -t/mro/next_goto_utf8.t utf8 mro tests -t/mro/next_inanon.t mro tests -t/mro/next_inanon_utf8.t utf8 mro tests -t/mro/next_ineval.t mro tests -t/mro/next_ineval_utf8.t utf8 mro tests -t/mro/next_method.t mro tests -t/mro/next_method_utf8.t utf8 mro tests -t/mro/next_NEXT.t mro tests -t/mro/next_NEXT_utf8.t utf8 mro tests -t/mro/next_skip.t mro tests -t/mro/next_skip_utf8.t utf8 mro tests -t/mro/overload_c3.t mro tests -t/mro/overload_c3_utf8.t utf8 mro tests -t/mro/overload_dfs.t mro tests -t/mro/package_aliases.t mro tests -t/mro/package_aliases_utf8.t utf8 mro tests -t/mro/pkg_gen.t mro tests -t/mro/pkg_gen_utf8.t utf8 mro tests -t/mro/recursion_c3.t mro tests -t/mro/recursion_c3_utf8.t utf8 mro tests -t/mro/recursion_dfs.t mro tests -t/mro/recursion_dfs_utf8.t utf8 mro tests -t/mro/vulcan_c3.t mro tests -t/mro/vulcan_c3_utf8.t utf8 mro tests -t/mro/vulcan_dfs.t mro tests -t/mro/vulcan_dfs_utf8.t utf8 mro tests -t/op/64bitint.t See if 64 bit integers work -t/op/aassign.t test list assign -t/op/alarm.t See if alarm works -t/op/anonconst.t See if :const works -t/op/anonsub.t See if anonymous subroutines work -t/op/append.t See if . works -t/op/args.t See if operations on @_ work -t/op/arith2.t See if arithmetic works -t/op/array.t See if array operations work -t/op/assignwarn.t See if OP= operators warn correctly for undef targets -t/op/attrhand.t See if attribute handlers work -t/op/attrproto.t See if the prototype attribute works -t/op/attrs.t See if attributes on declarations work -t/op/auto.t See if autoincrement et all work -t/op/avhv.t See if pseudo-hashes work -t/op/bless.t See if bless works -t/op/blocks.t See if BEGIN and friends work -t/op/bool.t Check misc details of boolean values -t/op/bop.t See if bitops work -t/op/caller.pl Tests shared between caller.t and XS op.t -t/op/caller.t See if caller() works -t/op/catch.t See if catching exception works -t/op/chars.t See if character escapes work -t/op/chdir.t See if chdir works -t/op/chop.t See if chop works -t/op/chr.t See if chr works -t/op/closure.t See if closures work -t/op/closure_test.pl Extra file for closure.t -t/op/cmpchain.t See if comparison chaining works -t/op/concat2.t Tests too complex for concat.t -t/op/cond.t See if conditional expressions work -t/op/const-optree.t Tests for sub(){...} becoming constant -t/op/context.t See if context propagation works -t/op/coreamp.t Test &foo() calls for CORE subs -t/op/coresubs.t Generic tests for CORE subs -t/op/cproto.t Check builtin prototypes -t/op/crypt.t See if crypt works -t/op/current_sub.t __SUB__ tests -t/op/dbm.t See if dbmopen/dbmclose work -t/op/decl-refs.t See if my \$foo works -t/op/defer.t See if defer blocks work -t/op/defined.t See if defined() edge cases work -t/op/defins.t See if auto-insert of defined() works -t/op/delete.t See if delete works -t/op/die.t See if die works -t/op/die_except.t See if die/eval avoids $@ clobberage -t/op/die_exit.t See if die and exit status interaction works -t/op/die_keeperr.t See if G_KEEPERR works for destructors -t/op/die_unwind.t Check die/eval early-$@ backcompat hack -t/op/do.t See if subroutines work -t/op/dor.t See if defined-or (//) works -t/op/dump.t See if dump works. -t/op/each.t See if hash iterators work -t/op/each_array.t See if array iterators work -t/op/eval.t See if eval operator works -t/op/evalbytes.t See if evalbytes operator works -t/op/exec.t See if exec, system and qx work -t/op/exists_sub.t See if exists(&sub) works -t/op/exp.t See if math functions work -t/op/fh.t See if filehandles work -t/op/filehandle.t Tests for https://github.com/Perl/perl5/issues/10133 -t/op/filetest.t See if file tests work -t/op/filetest_stack_ok.t See if file tests leave their argument on the stack -t/op/filetest_t.t See if -t file test works -t/op/flip.t See if range operator works -t/op/for.t See if for loops work -t/op/for-many.t See if n-at-a-time for loops work -t/op/fork.t See if fork works -t/op/fresh_perl_utf8.t UTF8 tests for pads and gvs -t/op/getpid.t See if $$ and getppid work with threads -t/op/getppid.t See if getppid works -t/op/glob.t See if <*> works -t/op/gmagic.t See if GMAGIC works -t/op/goto.t See if goto works -t/op/goto_xs.t See if "goto &sub" works on XSUBs -t/op/grent.t See if getgr*() functions work -t/op/grep.t See if grep() and map() work -t/op/groups.t See if $( works -t/op/gv.t See if typeglobs work -t/op/hash.t See if the complexity attackers are repelled -t/op/hash-clear-placeholders.t Tests for corner cases in S_clear_placeholders -t/op/hash-rt85026.t See if hash iteration/deletion works -t/op/hashassign.t See if hash assignments work -t/op/hashwarn.t See if warnings for bad hash assignments work -t/op/heredoc.t See if heredoc edge and corner cases work -t/op/hexfp.t See if hexadecimal float literals work -t/op/inc.t See if inc/dec of integers near 32 bit limit work -t/op/inccode.t See if coderefs work in @INC -t/op/inccode-tie.t See if tie to @INC works -t/op/incfilter.t See if the source filters in coderef-in-@INC work -t/op/index.t See if index works -t/op/index_thr.t See if index works in another thread -t/op/infnan.t See if inf/nan work -t/op/int.t See if int works -t/op/isa.t See if isa works -t/op/join.t See if join works -t/op/kill0.t See if kill works -t/op/kill0_child Process tree script that is kill()ed -t/op/kvaslice.t See if index/value array slices work -t/op/kvhslice.t See if key/value hash slices work -t/op/lc.t See if lc, uc, lcfirst, ucfirst, quotemeta work -t/op/leaky-magic.t See whether vars' magic leaks into packages -t/op/length.t See if length works -t/op/lex.t Tests too complex for t/base/lex.t -t/op/lex_assign.t See if ops involving lexicals or pad temps work -t/op/lexsub.t See if lexical subroutines work -t/op/lfs.t See if large files work for perlio -t/op/list.t See if lists and list slices work -t/op/local.t See if local works -t/op/localref.t See if local ${deref} works -t/op/lock.t Tests for lock args & retval (no threads) -t/op/loopctl.t See if next/last/redo work -t/op/lop.t See if logical operators work -t/op/lvref.t See if aliasing via references works -t/op/magic.t See if magic variables work -t/op/magic-27839.t Test for #27839, skipped for minitest -t/op/method.t See if method calls work -t/op/mkdir.t See if mkdir works -t/op/multideref.t See if "$a[0]{foo}[$i]{$k}" etc works -t/op/my.t See if lexical scoping works -t/op/my_stash.t See if my Package works -t/op/mydef.t See if "my $_" works -t/op/negate.t See if unary minus works -t/op/not.t See if not works -t/op/numconvert.t See if accessing fields does not change numeric values -t/op/numify.t See if string-to-number conversion works -t/op/numify_chkflags.t See if string-to-number conversion behaves correctly -t/op/oct.t See if oct and hex work -t/op/or.t See if || works in weird situations -t/op/ord.t See if ord works -t/op/overload_integer.t See if overload::constant for integer works after "use". -t/op/override.t See if operator overriding works -t/op/pack.t See if pack and unpack work -t/op/packagev.t See if package VERSION work -t/op/pos.t See if pos works -t/op/postfixderef.t See if ->$* ->@[ et al work -t/op/pow.t See if ** works -t/op/print.t See if print works -t/op/protowarn.t See if the illegalproto warnings work -t/op/push.t See if push and pop work -t/op/pwent.t See if getpw*() functions work -t/op/qr.t See if qr works -t/op/quotemeta.t See if quotemeta works -t/op/rand.t See if rand works -t/op/range.t See if .. works -t/op/read.t See if read() works -t/op/readdir.t See if readdir() works -t/op/readline.t See if <> / readline / rcatline work -t/op/recurse.t See if deep recursion works -t/op/ref.t See if refs and objects work -t/op/repeat.t See if x operator works -t/op/require_37033.t See if require always closes rsfp -t/op/require_errors.t See if errors from require are reported correctly -t/op/require_override.t See if require handles no argument properly -t/op/reset.t See if reset operator works -t/op/reverse.t See if reverse operator works -t/op/rt119311.t Test bug #119311 (die/DESTROY/recursion) -t/op/runlevel.t See if die() works from perl_call_*() -t/op/select.t See if 0- and 1-argument select works -t/op/setpgrpstack.t See if setpgrp works -t/op/sigdispatch.t See if signals are always dispatched -t/op/signame_canonical.t See if duplicate signal names always use the canonical name when the handler is invoked. -t/op/signatures.t See if sub signatures work -t/op/sigsystem.t See if system and SIGCHLD handlers play together nicely -t/op/sleep.t See if sleep works -t/op/smartkve.t See if smart deref for keys/values/each works -t/op/smartmatch.t See if the ~~ operator works -t/op/sort.t See if sort works -t/op/splice.t See if splice works -t/op/split.t See if split works -t/op/split_unicode.t Test split /\s/ and Unicode -t/op/sprintf.t See if sprintf works -t/op/sprintf2.t See if sprintf works -t/op/srand.t See if srand works -t/op/sselect.t See if 4 argument select works -t/op/stash.t See if %:: stashes work -t/op/stash_parse_gv.t See if parse_gv_stash_name works -t/op/stat.t See if stat works -t/op/stat_errors.t See if stat and file tests handle threshold errors -t/op/state.t See if state variables work -t/op/study.t See if study works -t/op/studytied.t See if study works with tied scalars -t/op/sub.t See if subroutines work -t/op/sub_lval.t See if lvalue subroutines work -t/op/substr.t See if substr works -t/op/substr_thr.t See if substr works in another thread -t/op/svflags.t See if POK is set as expected. -t/op/svleak.pl Test file for svleak.t -t/op/svleak.t See if stuff leaks SVs -t/op/switch.t See if switches (given/when) work -t/op/symbolcache.t See if undef/delete works on stashes with functions -t/op/syscall_emulator.t Tests that syscall works via the emulator -t/op/sysio.t See if sysread and syswrite work -t/op/taint.t See if tainting works -t/op/threads.t Misc. tests for perl features with threads -t/op/threads-dirh.t Test interaction of threads and dir handles -t/op/threads_create.pl Ancillary file for t/op/threads.t -t/op/tie.t See if tie/untie functions work -t/op/tie_fetch_count.t See if FETCH is only called once on tied variables -t/op/tiearray.t See if tie for arrays works -t/op/tiehandle.t See if tie for handles works -t/op/tiehash.t Tests for tied hashes using test.pl -t/op/time.t See if time functions work -t/op/time_loop.t Test that very large values don't hang gmtime and localtime. -t/op/tr.t See if tr works -t/op/tr_latin1.t See if tr works, but file isn't encoded in UTF-8 -t/op/try.t See if try works -t/op/undef.t See if undef works -t/op/universal.t See if UNIVERSAL class works -t/op/unlink.t See if unlink works -t/op/unshift.t See if unshift works -t/op/upgrade.t See if upgrading and assigning scalars works -t/op/utf8cache.t Tests malfunctions of utf8 cache -t/op/utf8decode.t See if UTF-8 decoding works -t/op/utf8magic.t See if utf8:: functions handle magic variables -t/op/utfhash.t See if utf8 keys in hashes behave -t/op/utftaint.t See if utf8 and taint work together -t/op/vec.t See if vectors work -t/op/ver.t See if v-strings and the %v format flag work -t/op/waitpid.t See if waitpid works -t/op/wantarray.t See if wantarray works -t/op/warn.t See if warn works -t/op/while.t See if while loops work -t/op/write.t See if write works (formats work) -t/op/yadayada.t See if ... works +t/lib/feature/bits Tests for feature bit handling +t/lib/feature/bundle Tests for feature bundles +t/lib/feature/implicit Tests for implicit loading of feature.pm +t/lib/feature/indirect Tests for enabling/disabling indirect method calls +t/lib/feature/multidimensional Tests for enabling/disabling $foo{$x, $y} => $foo{join($;, $x, $y)} +t/lib/feature/nonesuch Tests for enabling/disabling nonexistent feature +t/lib/feature/removed Tests for enabling/disabling removed feature +t/lib/feature/say Tests for enabling/disabling say feature +t/lib/feature/switch Tests for enabling/disabling switch feature +t/lib/h2ph.h Test header file for h2ph +t/lib/h2ph.pht Generated output from h2ph.h by h2ph, for comparison +t/lib/locale/latin1 Part of locale.t in Latin 1 +t/lib/locale/utf8 Part of locale.t in UTF8 +t/lib/mypragma.pm An example user pragma +t/lib/mypragma.t Test the example user pragma +t/lib/no_load.t Test that some modules don't load others +t/lib/overload_fallback.t Test that using overload 2x in a scope doesn't clobber fallback +t/lib/overload_nomethod.t Test that nomethod works as expected +t/lib/proxy_constant_subs.t Test that Proxy Constant Subs behave correctly +t/lib/Sans_mypragma.pm Test module for t/lib/mypragma.t +t/lib/strict/refs Tests of "use strict 'refs'" for strict.t +t/lib/strict/subs Tests of "use strict 'subs'" for strict.t +t/lib/strict/vars Tests of "use strict 'vars'" for strict.t +t/lib/subs/subs Tests of "use subs" +t/lib/test_require.pm A test file for t/op/inccode.t +t/lib/test_use.pm A test pragma for t/comp/use.t +t/lib/test_use_14937.pm A test pragma for t/comp/use.t +t/lib/universal.t Tests for functions in universal.c +t/lib/warnings/1global Tests of global warnings for warnings.t +t/lib/warnings/2use Tests for "use warnings" for warnings.t +t/lib/warnings/3both Tests for interaction of $^W and "use warnings" +t/lib/warnings/4lint Tests for -W switch +t/lib/warnings/5nolint Tests for -X switch +t/lib/warnings/6default Tests default warnings +t/lib/warnings/7fatal Tests fatal warnings +t/lib/warnings/8signal Tests warnings + __WARN__ and __DIE__ +t/lib/warnings/9enabled Tests warnings +t/lib/warnings/9uninit Tests "Use of uninitialized" warnings +t/lib/warnings/av Tests for av.c for warnings.t +t/lib/warnings/builtin Tests for builtin.c for warnings.t +t/lib/warnings/class Tests for class.c for warnings.t +t/lib/warnings/doio Tests for doio.c for warnings.t +t/lib/warnings/gv Tests for gv.c for warnings.t +t/lib/warnings/hv Tests for hv.c for warnings.t +t/lib/warnings/malloc Tests for malloc.c for warnings.t +t/lib/warnings/mg Tests for mg.c for warnings.t +t/lib/warnings/op Tests for op.c for warnings.t +t/lib/warnings/pad Tests for pad.c for warnings.t +t/lib/warnings/perl Tests for perl.c for warnings.t +t/lib/warnings/perlio Tests for perlio.c for warnings.t +t/lib/warnings/pp Tests for pp.c for warnings.t +t/lib/warnings/pp_ctl Tests for pp_ctl.c for warnings.t +t/lib/warnings/pp_hot Tests for pp_hot.c for warnings.t +t/lib/warnings/pp_pack Tests for pp_pack.c for warnings.t +t/lib/warnings/pp_sys Tests for pp_sys.c for warnings.t +t/lib/warnings/regcomp Tests for regcomp.c for warnings.t +t/lib/warnings/regexec Tests for regexec.c for warnings.t +t/lib/warnings/run Tests for run.c for warnings.t +t/lib/warnings/sv Tests for sv.c for warnings.t +t/lib/warnings/taint Tests for taint.c for warnings.t +t/lib/warnings/toke Tests for toke.c for warnings.t +t/lib/warnings/universal Tests for universal.c for warnings.t +t/lib/warnings/utf8 Tests for utf8.c for warnings.t +t/lib/warnings/util Tests for util.c for warnings.t +t/loc_tools.pl Common functions for finding platform's locales +t/mro/basic.t mro tests +t/mro/basic_01_c3.t mro tests +t/mro/basic_01_c3_utf8.t utf8 mro tests +t/mro/basic_01_dfs.t mro tests +t/mro/basic_01_dfs_utf8.t utf8 mro tests +t/mro/basic_02_c3.t mro tests +t/mro/basic_02_c3_utf8.t utf8 mro tests +t/mro/basic_02_dfs.t mro tests +t/mro/basic_02_dfs_utf8.t utf8 mro tests +t/mro/basic_03_c3.t mro tests +t/mro/basic_03_c3_utf8.t utf8 mro tests +t/mro/basic_03_dfs.t mro tests +t/mro/basic_03_dfs_utf8.t utf8 mro tests +t/mro/basic_04_c3.t mro tests +t/mro/basic_04_c3_utf8.t utf8 mro tests +t/mro/basic_04_dfs.t mro tests +t/mro/basic_04_dfs_utf8.t utf8 mro tests +t/mro/basic_05_c3.t mro tests +t/mro/basic_05_c3_utf8.t utf8 mro tests +t/mro/basic_05_dfs.t mro tests +t/mro/basic_05_dfs_utf8.t utf8 mro tests +t/mro/basic_utf8.t utf8 mro tests +t/mro/c3_with_overload.t mro tests +t/mro/c3_with_overload_utf8.t utf8 mro tests +t/mro/complex_c3.t mro tests +t/mro/complex_c3_utf8.t utf8 mro tests +t/mro/complex_dfs.t mro tests +t/mro/complex_dfs_utf8.t utf8 mro tests +t/mro/dbic_c3.t mro tests +t/mro/dbic_c3_utf8.t utf8 mro tests +t/mro/dbic_dfs.t mro tests +t/mro/dbic_dfs_utf8.t utf8 mro tests +t/mro/inconsistent_c3.t mro tests +t/mro/inconsistent_c3_utf8.t utf8 mro tests +t/mro/isa_aliases.t tests for shared @ISA arrays +t/mro/isa_aliases_utf8.t utf8 mro tests +t/mro/isa_c3.t test for optimisatised mro_get_linear_isa_c3 +t/mro/isa_c3_utf8.t utf8 mro tests +t/mro/isa_dfs.t test for optimisatised mro_get_linear_isa_dfs +t/mro/isa_dfs_utf8.t utf8 mro tests +t/mro/isarev.t PL_isarev/mro::get_isarev tests +t/mro/isarev_utf8.t utf8 mro tests +t/mro/method_caching.t mro tests +t/mro/method_caching_utf8.t utf8 mro tests +t/mro/next_edgecases.t mro tests +t/mro/next_edgecases_utf8.t utf8 mro tests +t/mro/next_goto.t mro tests +t/mro/next_goto_utf8.t utf8 mro tests +t/mro/next_inanon.t mro tests +t/mro/next_inanon_utf8.t utf8 mro tests +t/mro/next_ineval.t mro tests +t/mro/next_ineval_utf8.t utf8 mro tests +t/mro/next_method.t mro tests +t/mro/next_method_utf8.t utf8 mro tests +t/mro/next_NEXT.t mro tests +t/mro/next_NEXT_utf8.t utf8 mro tests +t/mro/next_skip.t mro tests +t/mro/next_skip_utf8.t utf8 mro tests +t/mro/overload_c3.t mro tests +t/mro/overload_c3_utf8.t utf8 mro tests +t/mro/overload_dfs.t mro tests +t/mro/package_aliases.t mro tests +t/mro/package_aliases_utf8.t utf8 mro tests +t/mro/pkg_gen.t mro tests +t/mro/pkg_gen_utf8.t utf8 mro tests +t/mro/recursion_c3.t mro tests +t/mro/recursion_c3_utf8.t utf8 mro tests +t/mro/recursion_dfs.t mro tests +t/mro/recursion_dfs_utf8.t utf8 mro tests +t/mro/vulcan_c3.t mro tests +t/mro/vulcan_c3_utf8.t utf8 mro tests +t/mro/vulcan_dfs.t mro tests +t/mro/vulcan_dfs_utf8.t utf8 mro tests +t/op/64bitint.t See if 64 bit integers work +t/op/aassign.t test list assign +t/op/alarm.t See if alarm works +t/op/anonconst.t See if :const works +t/op/anonsub.t See if anonymous subroutines work +t/op/append.t See if . works +t/op/args.t See if operations on @_ work +t/op/arith2.t See if arithmetic works +t/op/array.t See if array operations work +t/op/assignwarn.t See if OP= operators warn correctly for undef targets +t/op/attrhand.t See if attribute handlers work +t/op/attrproto.t See if the prototype attribute works +t/op/attrs.t See if attributes on declarations work +t/op/auto.t See if autoincrement et all work +t/op/avhv.t See if pseudo-hashes work +t/op/bless.t See if bless works +t/op/blocks.t See if BEGIN and friends work +t/op/bool.t Check misc details of boolean values +t/op/bop.t See if bitops work +t/op/caller.pl Tests shared between caller.t and XS op.t +t/op/caller.t See if caller() works +t/op/catch.t See if catching exception works +t/op/chars.t See if character escapes work +t/op/chdir.t See if chdir works +t/op/chop.t See if chop works +t/op/chr.t See if chr works +t/op/closure.t See if closures work +t/op/closure_test.pl Extra file for closure.t +t/op/cmpchain.t See if comparison chaining works +t/op/concat2.t Tests too complex for concat.t +t/op/cond.t See if conditional expressions work +t/op/const-optree.t Tests for sub(){...} becoming constant +t/op/context.t See if context propagation works +t/op/coreamp.t Test &foo() calls for CORE subs +t/op/coresubs.t Generic tests for CORE subs +t/op/cproto.t Check builtin prototypes +t/op/crypt.t See if crypt works +t/op/current_sub.t __SUB__ tests +t/op/dbm.t See if dbmopen/dbmclose work +t/op/decl-refs.t See if my \$foo works +t/op/defer.t See if defer blocks work +t/op/defined.t See if defined() edge cases work +t/op/defins.t See if auto-insert of defined() works +t/op/delete.t See if delete works +t/op/die.t See if die works +t/op/die_except.t See if die/eval avoids $@ clobberage +t/op/die_exit.t See if die and exit status interaction works +t/op/die_keeperr.t See if G_KEEPERR works for destructors +t/op/die_unwind.t Check die/eval early-$@ backcompat hack +t/op/do.t See if subroutines work +t/op/dor.t See if defined-or (//) works +t/op/dump.t See if dump works. +t/op/each.t See if hash iterators work +t/op/each_array.t See if array iterators work +t/op/eval.t See if eval operator works +t/op/evalbytes.t See if evalbytes operator works +t/op/exec.t See if exec, system and qx work +t/op/exists_sub.t See if exists(&sub) works +t/op/exp.t See if math functions work +t/op/fh.t See if filehandles work +t/op/filehandle.t Tests for https://github.com/Perl/perl5/issues/10133 +t/op/filetest.t See if file tests work +t/op/filetest_stack_ok.t See if file tests leave their argument on the stack +t/op/filetest_t.t See if -t file test works +t/op/flip.t See if range operator works +t/op/for.t See if for loops work +t/op/for-many.t See if n-at-a-time for loops work +t/op/fork.t See if fork works +t/op/fresh_perl_utf8.t UTF8 tests for pads and gvs +t/op/getpid.t See if $$ and getppid work with threads +t/op/getppid.t See if getppid works +t/op/glob.t See if <*> works +t/op/gmagic.t See if GMAGIC works +t/op/goto.t See if goto works +t/op/goto_xs.t See if "goto &sub" works on XSUBs +t/op/grent.t See if getgr*() functions work +t/op/grep.t See if grep() and map() work +t/op/groups.t See if $( works +t/op/gv.t See if typeglobs work +t/op/hash.t See if the complexity attackers are repelled +t/op/hash-clear-placeholders.t Tests for corner cases in S_clear_placeholders +t/op/hash-rt85026.t See if hash iteration/deletion works +t/op/hashassign.t See if hash assignments work +t/op/hashwarn.t See if warnings for bad hash assignments work +t/op/heredoc.t See if heredoc edge and corner cases work +t/op/hexfp.t See if hexadecimal float literals work +t/op/hook/require.t See if require hooks work properly. +t/op/inc.t See if inc/dec of integers near 32 bit limit work +t/op/inccode.t See if coderefs work in @INC +t/op/inccode-tie.t See if tie to @INC works +t/op/incfilter.t See if the source filters in coderef-in-@INC work +t/op/index.t See if index works +t/op/index_thr.t See if index works in another thread +t/op/infnan.t See if inf/nan work +t/op/int.t See if int works +t/op/isa.t See if isa works +t/op/join.t See if join works +t/op/kill0.t See if kill works +t/op/kill0_child Process tree script that is kill()ed +t/op/kvaslice.t See if index/value array slices work +t/op/kvhslice.t See if key/value hash slices work +t/op/lc.t See if lc, uc, lcfirst, ucfirst, quotemeta work +t/op/leaky-magic.t See whether vars' magic leaks into packages +t/op/length.t See if length works +t/op/lex.t Tests too complex for t/base/lex.t +t/op/lex_assign.t See if ops involving lexicals or pad temps work +t/op/lexsub.t See if lexical subroutines work +t/op/lfs.t See if large files work for perlio +t/op/list.t See if lists and list slices work +t/op/local.t See if local works +t/op/localref.t See if local ${deref} works +t/op/lock.t Tests for lock args & retval (no threads) +t/op/loopctl.t See if next/last/redo work +t/op/lop.t See if logical operators work +t/op/lvref.t See if aliasing via references works +t/op/magic.t See if magic variables work +t/op/magic-27839.t Test for #27839, skipped for minitest +t/op/method.t See if method calls work +t/op/mkdir.t See if mkdir works +t/op/multideref.t See if "$a[0]{foo}[$i]{$k}" etc works +t/op/my.t See if lexical scoping works +t/op/my_stash.t See if my Package works +t/op/mydef.t See if "my $_" works +t/op/negate.t See if unary minus works +t/op/not.t See if not works +t/op/numconvert.t See if accessing fields does not change numeric values +t/op/numify.t See if string-to-number conversion works +t/op/numify_chkflags.t See if string-to-number conversion behaves correctly +t/op/oct.t See if oct and hex work +t/op/or.t See if || works in weird situations +t/op/ord.t See if ord works +t/op/overload_integer.t See if overload::constant for integer works after "use". +t/op/override.t See if operator overriding works +t/op/pack.t See if pack and unpack work +t/op/packagev.t See if package VERSION work +t/op/pos.t See if pos works +t/op/postfixderef.t See if ->$* ->@[ et al work +t/op/pow.t See if ** works +t/op/print.t See if print works +t/op/protowarn.t See if the illegalproto warnings work +t/op/push.t See if push and pop work +t/op/pwent.t See if getpw*() functions work +t/op/qr.t See if qr works +t/op/quotemeta.t See if quotemeta works +t/op/rand.t See if rand works +t/op/range.t See if .. works +t/op/read.t See if read() works +t/op/readdir.t See if readdir() works +t/op/readline.t See if <> / readline / rcatline work +t/op/recurse.t See if deep recursion works +t/op/ref.t See if refs and objects work +t/op/repeat.t See if x operator works +t/op/require_37033.t See if require always closes rsfp +t/op/require_errors.t See if errors from require are reported correctly +t/op/require_gh20577.t Make sure updating %INC from an INC hook doesnt break @INC +t/op/require_override.t See if require handles no argument properly +t/op/reset.t See if reset operator works +t/op/reverse.t See if reverse operator works +t/op/rt119311.t Test bug #119311 (die/DESTROY/recursion) +t/op/runlevel.t See if die() works from perl_call_*() +t/op/select.t See if 0- and 1-argument select works +t/op/setpgrpstack.t See if setpgrp works +t/op/sigdispatch.t See if signals are always dispatched +t/op/signame_canonical.t See if duplicate signal names always use the canonical name when the handler is invoked. +t/op/signatures.t See if sub signatures work +t/op/sigsystem.t See if system and SIGCHLD handlers play together nicely +t/op/sleep.t See if sleep works +t/op/smartkve.t See if smart deref for keys/values/each works +t/op/smartmatch.t See if the ~~ operator works +t/op/sort.t See if sort works +t/op/splice.t See if splice works +t/op/split.t See if split works +t/op/split_unicode.t Test split /\s/ and Unicode +t/op/sprintf.t See if sprintf works +t/op/sprintf2.t See if sprintf works +t/op/srand.t See if srand works +t/op/sselect.t See if 4 argument select works +t/op/stash.t See if %:: stashes work +t/op/stash_parse_gv.t See if parse_gv_stash_name works +t/op/stat.t See if stat works +t/op/stat_errors.t See if stat and file tests handle threshold errors +t/op/state.t See if state variables work +t/op/study.t See if study works +t/op/studytied.t See if study works with tied scalars +t/op/sub.t See if subroutines work +t/op/sub_lval.t See if lvalue subroutines work +t/op/substr.t See if substr works +t/op/substr_thr.t See if substr works in another thread +t/op/svflags.t See if POK is set as expected. +t/op/svleak.pl Test file for svleak.t +t/op/svleak.t See if stuff leaks SVs +t/op/switch.t See if switches (given/when) work +t/op/symbolcache.t See if undef/delete works on stashes with functions +t/op/syscall_emulator.t Tests that syscall works via the emulator +t/op/sysio.t See if sysread and syswrite work +t/op/taint.t See if tainting works +t/op/threads.t Misc. tests for perl features with threads +t/op/threads-dirh.t Test interaction of threads and dir handles +t/op/threads_create.pl Ancillary file for t/op/threads.t +t/op/tie.t See if tie/untie functions work +t/op/tie_fetch_count.t See if FETCH is only called once on tied variables +t/op/tiearray.t See if tie for arrays works +t/op/tiehandle.t See if tie for handles works +t/op/tiehash.t Tests for tied hashes using test.pl +t/op/time.t See if time functions work +t/op/time_loop.t Test that very large values don't hang gmtime and localtime. +t/op/tr.t See if tr works +t/op/tr_latin1.t See if tr works, but file isn't encoded in UTF-8 +t/op/try.t See if try works +t/op/undef.t See if undef works +t/op/universal.t See if UNIVERSAL class works +t/op/unlink.t See if unlink works +t/op/unshift.t See if unshift works +t/op/upgrade.t See if upgrading and assigning scalars works +t/op/utf8cache.t Tests malfunctions of utf8 cache +t/op/utf8decode.t See if UTF-8 decoding works +t/op/utf8magic.t See if utf8:: functions handle magic variables +t/op/utfhash.t See if utf8 keys in hashes behave +t/op/utftaint.t See if utf8 and taint work together +t/op/vec.t See if vectors work +t/op/ver.t See if v-strings and the %v format flag work +t/op/waitpid.t See if waitpid works +t/op/wantarray.t See if wantarray works +t/op/warn.t See if warn works +t/op/while.t See if while loops work +t/op/write.t See if write works (formats work) +t/op/yadayada.t See if ... works t/opbasic/arith.t See if arithmetic works -t/opbasic/cmp.t See if the various string and numeric compare work +t/opbasic/cmp.t See if the various string and numeric compare work t/opbasic/concat.t See if string concatenation works -t/opbasic/magic_phase.t See if ${^GLOBAL_PHASE} works -t/opbasic/qq.t See if qq works -t/perf/benchmarks snippets of benchmarking/profiling code -t/perf/benchmarks.t test t/perf/benchmarks syntax -t/perf/opcount.t See if optimised subs have the right op counts -t/perf/optree.t Test presence of some op optimisations -t/perf/speed.t See if optimisations are keeping things fast -t/perf/taint.t See if optimisations are keeping things fast (taint issues) -t/perl.supp Perl valgrind suppressions -t/porting/args_assert.t Check that all PERL_ARGS_ASSERT* macros are used -t/porting/authors.t Check that all authors have been acknowledged -t/porting/bench.t Check Porting/bench.pl runs ok -t/porting/bench/badhash a test file for t/porting/bench.t -t/porting/bench/badname a test file for t/porting/bench.t -t/porting/bench/badversion.json a test file for t/porting/bench.t -t/porting/bench/callsub.json a test file for t/porting/bench.t -t/porting/bench/callsub2.json a test file for t/porting/bench.t -t/porting/bench/oddentry a test file for t/porting/bench.t -t/porting/bench/ret0 a test file for t/porting/bench.t -t/porting/bench/synerr a test file for t/porting/bench.t -t/porting/bench_selftest.t run Porting/bench.pl's selftest facility -t/porting/bincompat.t Check that {non_,}bincompat_options are ordered -t/porting/checkcase.t Check whether we are case-insensitive-fs-friendly -t/porting/checkcfgvar.t Check that all config.sh-like files are good -t/porting/cmp_version.t Test whether all changed module files have their VERSION bumped -t/porting/copyright.t Check that copyright years match -t/porting/corelist.t Check that Module-CoreList has perl versions for the current perl +t/opbasic/magic_phase.t See if ${^GLOBAL_PHASE} works +t/opbasic/qq.t See if qq works +t/perf/benchmarks snippets of benchmarking/profiling code +t/perf/benchmarks.t test t/perf/benchmarks syntax +t/perf/opcount.t See if optimised subs have the right op counts +t/perf/optree.t Test presence of some op optimisations +t/perf/speed.t See if optimisations are keeping things fast +t/perf/taint.t See if optimisations are keeping things fast (taint issues) +t/perl.supp Perl valgrind suppressions +t/porting/args_assert.t Check that all PERL_ARGS_ASSERT* macros are used +t/porting/authors.t Check that all authors have been acknowledged +t/porting/bench.t Check Porting/bench.pl runs ok +t/porting/bench/badhash a test file for t/porting/bench.t +t/porting/bench/badname a test file for t/porting/bench.t +t/porting/bench/badversion.json a test file for t/porting/bench.t +t/porting/bench/callsub.json a test file for t/porting/bench.t +t/porting/bench/callsub2.json a test file for t/porting/bench.t +t/porting/bench/oddentry a test file for t/porting/bench.t +t/porting/bench/ret0 a test file for t/porting/bench.t +t/porting/bench/synerr a test file for t/porting/bench.t +t/porting/bench_selftest.t run Porting/bench.pl's selftest facility +t/porting/bincompat.t Check that {non_,}bincompat_options are ordered +t/porting/checkcase.t Check whether we are case-insensitive-fs-friendly +t/porting/checkcfgvar.t Check that all config.sh-like files are good +t/porting/cmp_version.t Test whether all changed module files have their VERSION bumped +t/porting/copyright.t Check that copyright years match +t/porting/corelist.t Check that Module-CoreList has perl versions for the current perl t/porting/customized.dat Data file for porting/customized.t -t/porting/customized.t Check all CUSTOMIZED files are as they should be -t/porting/diag.t Test completeness of perldiag.pod -t/porting/dual-life.t Check that dual-life bins are in utils/ -t/porting/exec-bit.t Check that exec-bit bins are identified -t/porting/extrefs.t Check perl headers don't make extern refs -t/porting/filenames.t Check the MANIFEST for filename portability. -t/porting/FindExt.t Test win32/FindExt.pm -t/porting/globvar.t Check that globvar.sym is sane -t/porting/known_pod_issues.dat Data file for porting/podcheck.t -t/porting/libperl.t Check libperl.a sanity -t/porting/maintainers.t Test that Porting/Maintainers.pl is up to date -t/porting/manifest.t Test that this MANIFEST file is well formed -t/porting/pending-author.t Check if any pending commit would break tests -t/porting/perlfunc.t Test that Functions_pm.PL can parse perlfunc.pod -t/porting/pod_rules.t Check that various pod lists are consistent -t/porting/podcheck.t Test the POD of shipped modules is well formed -t/porting/re_context.t Check assumptions made by save_re_context() -t/porting/readme.t Check that all files in Porting/ are mentioned in Porting/README.pod -t/porting/regen.t Check that regen.pl doesn't need running -t/porting/ss_dup.t Check that sv.c:ss_dup handles everything -t/porting/test_bootstrap.t Test that the instructions for test bootstrapping aren't accidentally overlooked. -t/porting/utils.t Check that utility scripts still compile -t/re/alpha_assertions.t See if things like '(*postive_lookahed:...) work properly -t/re/anyof.t See if bracketed char classes [...] compile properly -t/re/begin-once.t Checking that /o freeze a variable in a RegExp -t/re/bigfuzzy_not_utf8.t Big and ugly tests not storable as UTF-8 -t/re/charset.t See if regex modifiers like /d, /u work properly -t/re/fold_grind.pl Core file to see if regex case folding works properly -t/re/fold_grind_8.t Wrapper for fold_grind.pl for /l testing with a UTF-8 locale -t/re/fold_grind_a.t Wrapper for fold_grind.pl for /a testing -t/re/fold_grind_aa.t Wrapper for fold_grind.pl for /aa testing -t/re/fold_grind_d.t Wrapper for fold_grind.pl for /d testing -t/re/fold_grind_l.t Wrapper for fold_grind.pl for /l testing with a C locale -t/re/fold_grind_T.t Wrapper for fold_grind.pl for /l testing with a Turkic locale -t/re/fold_grind_u.t Wrapper for fold_grind.pl for /u testing -t/re/keep_tabs.t Tests where \t can't be expanded. -t/re/no_utf8_pm.t Verify utf8.pm doesn't get loaded unless required +t/porting/customized.t Check all CUSTOMIZED files are as they should be +t/porting/deprecation.t Test that deprecation warnings are handled right +t/porting/diag.t Test completeness of perldiag.pod +t/porting/dual-life.t Check that dual-life bins are in utils/ +t/porting/exec-bit.t Check that exec-bit bins are identified +t/porting/extrefs.t Check perl headers don't make extern refs +t/porting/filenames.t Check the MANIFEST for filename portability. +t/porting/FindExt.t Test win32/FindExt.pm +t/porting/globvar.t Check that globvar.sym is sane +t/porting/header_parser.t Check that regen/HeaderParser.pm works as expected +t/porting/known_pod_issues.dat Data file for porting/podcheck.t +t/porting/libperl.t Check libperl.a sanity +t/porting/maintainers.t Test that Porting/Maintainers.pl is up to date +t/porting/manifest.t Test that this MANIFEST file is well formed +t/porting/perlfunc.t Test that Functions_pm.PL can parse perlfunc.pod +t/porting/pod_rules.t Check that various pod lists are consistent +t/porting/podcheck.t Test the POD of shipped modules is well formed +t/porting/re_context.t Check assumptions made by save_re_context() +t/porting/readme.t Check that all files in Porting/ are mentioned in Porting/README.pod +t/porting/regen.t Check that regen.pl doesn't need running +t/porting/ss_dup.t Check that sv.c:ss_dup handles everything +t/porting/test_bootstrap.t Test that the instructions for test bootstrapping aren't accidentally overlooked. +t/porting/test_testlist.t Test that we t/harness and t/TEST and MANIFEST agree on our test list +t/porting/update_authors.t Tests for Porting/updateAUTHORS.pl +t/porting/utils.t Check that utility scripts still compile +t/re/alpha_assertions.t See if things like '(*postive_lookahed:...) work properly +t/re/anyof.t See if bracketed char classes [...] compile properly +t/re/begin-once.t Checking that /o freeze a variable in a RegExp +t/re/bigfuzzy_not_utf8.t Big and ugly tests not storable as UTF-8 +t/re/charset.t See if regex modifiers like /d, /u work properly +t/re/fold_grind.pl Core file to see if regex case folding works properly +t/re/fold_grind_8.t Wrapper for fold_grind.pl for /l testing with a UTF-8 locale +t/re/fold_grind_a.t Wrapper for fold_grind.pl for /a testing +t/re/fold_grind_aa.t Wrapper for fold_grind.pl for /aa testing +t/re/fold_grind_d.t Wrapper for fold_grind.pl for /d testing +t/re/fold_grind_l.t Wrapper for fold_grind.pl for /l testing with a C locale +t/re/fold_grind_T.t Wrapper for fold_grind.pl for /l testing with a Turkic locale +t/re/fold_grind_u.t Wrapper for fold_grind.pl for /u testing +t/re/keep_tabs.t Tests where \t can't be expanded. +t/re/no_utf8_pm.t Verify utf8.pm doesn't get loaded unless required t/re/opt.t Test regexp optimizations -t/re/overload.t Test against string corruption in pattern matches on overloaded objects -t/re/pat.t See if esoteric patterns work -t/re/pat_advanced.t See if advanced esoteric patterns work -t/re/pat_advanced_thr.t See if advanced esoteric patterns work in another thread -t/re/pat_psycho.t See if insane esoteric and slow patterns work -t/re/pat_psycho_thr.t See if insane esoteric and slow patterns work in another thread -t/re/pat_re_eval.t See if esoteric patterns using re 'eval' work -t/re/pat_re_eval_thr.t See if esoteric patterns using re 'eval' work in another thread -t/re/pat_rt_report.t See if esoteric patterns from rt reports work -t/re/pat_rt_report_thr.t See if esoteric patterns from rt reports work in another thread -t/re/pat_special_cc.t See if special charclasses (\s \w \d) work the same as (\s and [\s]) -t/re/pat_special_cc_thr.t See if special charclasses (\s \w \d) work the same as (\s and [\s]) under threads -t/re/pat_thr.t See if esoteric patterns work in another thread -t/re/pos.t Ensure pos() gets set properly after pre-match failures in pp_match -t/re/qr.t See if qr works -t/re/qr-72922.t Test for bug #72922 -t/re/qr_gc.t See if qr doesn't leak -t/re/qrstack.t See if qr expands the stack properly -t/re/re_tests Regular expressions for regexp.t -t/re/recompile.t See if pattern caching/recompilation works -t/re/reg_60508.t See if bug #60508 is fixed -t/re/reg_email.t See if regex recursion works by parsing email addresses -t/re/reg_email_thr.t See if regex recursion works by parsing email addresses in another thread -t/re/reg_eval.t Test again regexp state corruption in (?{ }) and (??{ }) -t/re/reg_eval_scope.t Test scoping issues with (?{ }) and (??{ }) -t/re/reg_fold.t See if case folding works properly -t/re/reg_mesg.t See if one can get regular expression errors -t/re/reg_namedcapture.t Make sure glob assignment doesn't break named capture -t/re/reg_nc_tie.t Test the tied methods of Tie::Hash::NamedCapture -t/re/reg_nocapture.t Test the /n flag for regexps -t/re/reg_pmod.t See if regexp /p modifier works as expected -t/re/reg_posixcc.t See if posix character classes behave consistently -t/re/regex_sets.t Test (?[ ]) -t/re/regex_sets_compat.t Test (?[ ]) is compatible with old [ ] -t/re/regexp.t See if regular expressions work -t/re/regexp_noamp.t See if regular expressions work with optimizations -t/re/regexp_nonull.t See if regexps work without trailing nulls -t/re/regexp_notrie.t See if regular expressions work without trie optimisation -t/re/regexp_qr.t See if regular expressions work as qr// -t/re/regexp_qr_embed.t See if regular expressions work with embedded qr// -t/re/regexp_qr_embed_thr.t See if regular expressions work with embedded qr// in another thread -t/re/regexp_trielist.t See if regular expressions work with trie optimisation -t/re/regexp_unicode_prop.t See if unicode properties work in regular expressions as expected -t/re/regexp_unicode_prop_thr.t See if unicode properties work in regular expressions as expected under threads -t/re/rt122747.t Test rt122747 assert faile (requires DEBUGGING) -t/re/rxcode.t See if /(?{ code })/ works -t/re/script_run.t See if script runs works -t/re/speed.t See if optimisations are keeping things fast -t/re/speed_thr.t ditto under threads -t/re/subst.t See if substitution works -t/re/subst_amp.t See if $&-related substitution works -t/re/subst_wamp.t See if substitution works with $& present -t/re/substT.t See if substitution works with -T -t/re/uniprops01.t Test unicode \p{} regex constructs -t/re/uniprops02.t Test unicode \p{} regex constructs -t/re/uniprops03.t Test unicode \p{} regex constructs -t/re/uniprops04.t Test unicode \p{} regex constructs -t/re/uniprops05.t Test unicode \p{} regex constructs -t/re/uniprops06.t Test unicode \p{} regex constructs -t/re/uniprops07.t Test unicode \p{} regex constructs -t/re/uniprops08.t Test unicode \p{} regex constructs -t/re/uniprops09.t Test unicode \p{} regex constructs -t/re/uniprops10.t Test unicode \p{} regex constructs -t/re/user_prop_race_thr.t Test races in user-defined \p{} under threads -t/README Instructions for regression tests -t/run/cloexec.t Test close-on-exec. -t/run/dtrace.pl For dtrace.t -t/run/dtrace.t Test for DTrace probes -t/run/exit.t Test perl's exit status. -t/run/flib/broken.pm Bad .pm file for switchM.t -t/run/flib/t2.pm Test for .pmcs with -I/dir/ -t/run/flib/t2.pmc Test for .pmcs with -I/dir/ -t/run/fresh_perl.t Tests that require a fresh perl. -t/run/locale.t Tests related to locale handling -t/run/noswitch.t Test aliasing ARGV for other switch tests -t/run/runenv.t Test if perl honors its environment variables. -t/run/runenv_hashseed.t Test if perl honors PERL_HASH_SEED. -t/run/script.t See if script invocation works -t/run/switch0.t Test the -0 switch -t/run/switcha.t Test the -a switch -t/run/switchC.t Test the -C switch -t/run/switchd.t Test the -d switch -t/run/switchd-78586.t See whether bug 78586 is fixed -t/run/switchDx.t Test the -D switch -t/run/switches.t Tests for the other switches (-0, -l, -c, -s, -M, -m, -V, -v, -h, -z, -i) -t/run/switchF.t Test the -F switch -t/run/switchF1.t Pathological tests for the -F switch -t/run/switchF2.t Pathological tests for the -F switch -t/run/switchI.t Test the -I switch -t/run/switchM.t Test the -M switch -t/run/switchn.t Test the -n switch -t/run/switchp.t Test the -p switch -t/run/switcht.t Test the -t switch -t/run/switchx.aux Data for switchx.t -t/run/switchx.t Test the -x switch -t/run/switchx2.aux Data for switchx.t -t/run/switchx3.aux Data for switchx.t -t/TEST The regression tester -t/test.pl Simple testing library -t/test_pl/_num_to_alpha.t Tests for the simple testing library -t/test_pl/can_isa_ok.t Tests for the simple testing library -t/test_pl/plan_skip_all.t Tests for the simple testing library -t/test_pl/tempfile.t Tests for the simple testing library -t/thread_it.pl Run regression tests in a new thread -t/uni/attrs.t See if Unicode attributes work -t/uni/bless.t See if Unicode bless works -t/uni/caller.t See if Unicode doesn't get mangled in caller() -t/uni/case.pl See if Unicode casing works -t/uni/chomp.t See if Unicode chomp works -t/uni/class.t See if Unicode classes work (\p) -t/uni/eval.t See if Unicode hints don't affect eval() -t/uni/fold.t See if Unicode folding works -t/uni/goto.t See if Unicode goto &sub works -t/uni/greek.t See if Unicode in greek works -t/uni/gv.t See if Unicode GVs work. -t/uni/labels.t See if Unicode labels work -t/uni/latin2.t See if Unicode in latin2 works -t/uni/lex_utf8.t See if Unicode in lexer works -t/uni/lower.t See if Unicode casing works -t/uni/method.t See if Unicode methods work -t/uni/opcroak.t See if Unicode croaks from op.c work -t/uni/overload.t See if Unicode overloading works -t/uni/package.t See if Unicode in package declarations works -t/uni/parser.t See if Unicode in the parser works in edge cases. -t/uni/readline.t See if Unicode filehandles in work -t/uni/select.t See if Unicode filehandles aren't mangled by select() -t/uni/sprintf.t See if Unicode sprintf works -t/uni/stash.t See if Unicode stashes work -t/uni/tie.t See if Unicode tie works -t/uni/title.t See if Unicode casing works -t/uni/tr_utf8.t See if Unicode tr/// in utf8 works -t/uni/universal.t See if Unicode in calls to UNIVERSAL works -t/uni/upper.t See if Unicode casing works -t/uni/variables.t See that the rules for variable names work -t/uni/write.t See if Unicode formats work -t/win32/crypt.t Test Win32 crypt for compatibility -t/win32/fs.t Test Win32 link for compatibility -t/win32/popen.t Test for stdout races in backticks, etc -t/win32/runenv.t Test if Win* perl honors its env variables -t/win32/signal.t Test Win32 signal emulation -t/win32/stat.t Test Win32 stat emulation -t/win32/symlink.t Test Win32 symlink -t/win32/system.t See if system works in Win* -t/win32/system_tests Test runner for system.t -taint.c Tainting code -TestInit.pm Preamble library for tests -thread.h Threading header -time64.c 64 bit clean time.h (code) -time64.h 64 bit clean time.h (header) -time64_config.h 64 bit clean time.h (configuration) -toke.c The tokener -uconfig.h Configuration header for microperl -uconfig.sh Configuration script for microperl -uconfig64.sh Configuration script for microperl for LP64 -uni_keywords.h Map unicode property names to numbers -unicode_constants.h compile-time macros for Unicode code points -universal.c The default UNIVERSAL package methods -unixish.h Defines that are assumed on Unix -utf8.c Unicode routines -utf8.h Unicode header -utfebcdic.h Unicode on EBCDIC (UTF-EBCDIC, tr16) header -util.c Utility routines -util.h Dummy header -utils.lst Lists utilities bundled with Perl -utils/corelist.PL Module::CoreList -utils/cpan.PL easily interact with CPAN from the command line -utils/enc2xs.PL Encode module generator +t/re/overload.t Test against string corruption in pattern matches on overloaded objects +t/re/pat.t See if esoteric patterns work +t/re/pat_advanced.t See if advanced esoteric patterns work +t/re/pat_advanced_thr.t See if advanced esoteric patterns work in another thread +t/re/pat_psycho.t See if insane esoteric and slow patterns work +t/re/pat_psycho_thr.t See if insane esoteric and slow patterns work in another thread +t/re/pat_re_eval.t See if esoteric patterns using re 'eval' work +t/re/pat_re_eval_thr.t See if esoteric patterns using re 'eval' work in another thread +t/re/pat_rt_report.t See if esoteric patterns from rt reports work +t/re/pat_rt_report_thr.t See if esoteric patterns from rt reports work in another thread +t/re/pat_special_cc.t See if special charclasses (\s \w \d) work the same as (\s and [\s]) +t/re/pat_special_cc_thr.t See if special charclasses (\s \w \d) work the same as (\s and [\s]) under threads +t/re/pat_thr.t See if esoteric patterns work in another thread +t/re/pos.t Ensure pos() gets set properly after pre-match failures in pp_match +t/re/qr.t See if qr works +t/re/qr-72922.t Test for bug #72922 +t/re/qr_gc.t See if qr doesn't leak +t/re/qrstack.t See if qr expands the stack properly +t/re/re_tests Regular expressions for regexp.t +t/re/recompile.t See if pattern caching/recompilation works +t/re/reg_60508.t See if bug #60508 is fixed +t/re/reg_email.t See if regex recursion works by parsing email addresses +t/re/reg_email_thr.t See if regex recursion works by parsing email addresses in another thread +t/re/reg_eval.t Test again regexp state corruption in (?{ }) and (??{ }) +t/re/reg_eval_scope.t Test scoping issues with (?{ }) and (??{ }) +t/re/reg_fold.t See if case folding works properly +t/re/reg_mesg.t See if one can get regular expression errors +t/re/reg_namedcapture.t Make sure glob assignment doesn't break named capture +t/re/reg_nc_tie.t Test the tied methods of Tie::Hash::NamedCapture +t/re/reg_nocapture.t Test the /n flag for regexps +t/re/reg_pmod.t See if regexp /p modifier works as expected +t/re/reg_posixcc.t See if posix character classes behave consistently +t/re/regex_sets.t Test (?[ ]) +t/re/regex_sets_compat.t Test (?[ ]) is compatible with old [ ] +t/re/regexp.t See if regular expressions work +t/re/regexp_noamp.t See if regular expressions work with optimizations +t/re/regexp_nonull.t See if regexps work without trailing nulls +t/re/regexp_normal.t See if regexps work when expressions are normalized in various ways +t/re/regexp_notrie.t See if regular expressions work without trie optimisation +t/re/regexp_qr.t See if regular expressions work as qr// +t/re/regexp_qr_embed.t See if regular expressions work with embedded qr// +t/re/regexp_qr_embed_thr.t See if regular expressions work with embedded qr// in another thread +t/re/regexp_trielist.t See if regular expressions work with trie optimisation +t/re/regexp_unicode_prop.t See if unicode properties work in regular expressions as expected +t/re/regexp_unicode_prop_thr.t See if unicode properties work in regular expressions as expected under threads +t/re/rt122747.t Test rt122747 assert faile (requires DEBUGGING) +t/re/rxcode.t See if /(?{ code })/ works +t/re/script_run.t See if script runs works +t/re/speed.t See if optimisations are keeping things fast +t/re/speed_thr.t ditto under threads +t/re/stclass_threads.t Test if stclass is preserved across threads +t/re/subst.t See if substitution works +t/re/subst_amp.t See if $&-related substitution works +t/re/subst_wamp.t See if substitution works with $& present +t/re/substT.t See if substitution works with -T +t/re/uniprops01.t Test unicode \p{} regex constructs +t/re/uniprops02.t Test unicode \p{} regex constructs +t/re/uniprops03.t Test unicode \p{} regex constructs +t/re/uniprops04.t Test unicode \p{} regex constructs +t/re/uniprops05.t Test unicode \p{} regex constructs +t/re/uniprops06.t Test unicode \p{} regex constructs +t/re/uniprops07.t Test unicode \p{} regex constructs +t/re/uniprops08.t Test unicode \p{} regex constructs +t/re/uniprops09.t Test unicode \p{} regex constructs +t/re/uniprops10.t Test unicode \p{} regex constructs +t/re/user_prop_race_thr.t Test races in user-defined \p{} under threads +t/README Instructions for regression tests +t/run/cloexec.t Test close-on-exec. +t/run/dtrace.pl For dtrace.t +t/run/dtrace.t Test for DTrace probes +t/run/exit.t Test perl's exit status. +t/run/flib/broken.pm Bad .pm file for switchM.t +t/run/flib/t2.pm Test for .pmcs with -I/dir/ +t/run/flib/t2.pmc Test for .pmcs with -I/dir/ +t/run/fresh_perl.t Tests that require a fresh perl. +t/run/locale.t Tests related to locale handling +t/run/noswitch.t Test aliasing ARGV for other switch tests +t/run/runenv.t Test if perl honors its environment variables. +t/run/runenv_hashseed.t Test if perl honors PERL_HASH_SEED. +t/run/runenv_randseed.t Test if perl honors PERL_RAND_SEED. +t/run/script.t See if script invocation works +t/run/switch0.t Test the -0 switch +t/run/switcha.t Test the -a switch +t/run/switchC.t Test the -C switch +t/run/switchd.t Test the -d switch +t/run/switchd-78586.t See whether bug 78586 is fixed +t/run/switchDx.t Test the -D switch +t/run/switches.t Tests for the other switches (-0, -l, -c, -s, -M, -m, -V, -v, -h, -z, -i) +t/run/switchF.t Test the -F switch +t/run/switchF1.t Pathological tests for the -F switch +t/run/switchF2.t Pathological tests for the -F switch +t/run/switchI.t Test the -I switch +t/run/switchM.t Test the -M switch +t/run/switchn.t Test the -n switch +t/run/switchp.t Test the -p switch +t/run/switcht.t Test the -t switch +t/run/switchx.aux Data for switchx.t +t/run/switchx.t Test the -x switch +t/run/switchx2.aux Data for switchx.t +t/run/switchx3.aux Data for switchx.t +t/TEST The regression tester +t/test.pl Simple testing library +t/test_pl/_num_to_alpha.t Tests for the simple testing library +t/test_pl/can_isa_ok.t Tests for the simple testing library +t/test_pl/plan_skip_all.t Tests for the simple testing library +t/test_pl/tempfile.t Tests for the simple testing library +t/thread_it.pl Run regression tests in a new thread +t/uni/attrs.t See if Unicode attributes work +t/uni/bless.t See if Unicode bless works +t/uni/caller.t See if Unicode doesn't get mangled in caller() +t/uni/case.pl See if Unicode casing works +t/uni/chomp.t See if Unicode chomp works +t/uni/class.t See if Unicode classes work (\p) +t/uni/eval.t See if Unicode hints don't affect eval() +t/uni/fold.t See if Unicode folding works +t/uni/goto.t See if Unicode goto &sub works +t/uni/greek.t See if Unicode in greek works +t/uni/gv.t See if Unicode GVs work. +t/uni/labels.t See if Unicode labels work +t/uni/latin2.t See if Unicode in latin2 works +t/uni/lex_utf8.t See if Unicode in lexer works +t/uni/lower.t See if Unicode casing works +t/uni/method.t See if Unicode methods work +t/uni/opcroak.t See if Unicode croaks from op.c work +t/uni/overload.t See if Unicode overloading works +t/uni/package.t See if Unicode in package declarations works +t/uni/parser.t See if Unicode in the parser works in edge cases. +t/uni/readline.t See if Unicode filehandles in work +t/uni/select.t See if Unicode filehandles aren't mangled by select() +t/uni/sprintf.t See if Unicode sprintf works +t/uni/stash.t See if Unicode stashes work +t/uni/tie.t See if Unicode tie works +t/uni/title.t See if Unicode casing works +t/uni/tr_utf8.t See if Unicode tr/// in utf8 works +t/uni/universal.t See if Unicode in calls to UNIVERSAL works +t/uni/upper.t See if Unicode casing works +t/uni/variables.t See that the rules for variable names work +t/uni/write.t See if Unicode formats work +t/win32/crypt.t Test Win32 crypt for compatibility +t/win32/fs.t Test Win32 link for compatibility +t/win32/popen.t Test for stdout races in backticks, etc +t/win32/runenv.t Test if Win* perl honors its env variables +t/win32/seekdir.t Test that seekdir/readdir are restricted to relevant memory +t/win32/signal.t Test Win32 signal emulation +t/win32/stat.t Test Win32 stat emulation +t/win32/symlink.t Test Win32 symlink +t/win32/system.t See if system works in Win* +t/win32/system_tests Test runner for system.t +utils/corelist.PL Module::CoreList +utils/cpan.PL easily interact with CPAN from the command line +utils/enc2xs.PL Encode module generator utils/encguess.PL guess character encodings of files -utils/h2ph.PL A thing to turn C .h files into perl .ph files -utils/h2xs.PL Program to make .xs files from C header files -utils/instmodsh.PL Give information about installed extensions -utils/json_pp.PL JSON::PP command line utility -utils/libnetcfg.PL libnet -utils/Makefile.PL Extract the utility scripts -utils/perlbug.PL A simple tool to submit a bug report -utils/perldoc.PL A simple tool to find & display perl's documentation -utils/perlivp.PL installation verification procedure -utils/piconv.PL iconv(1), reinvented in perl -utils/pl2pm.PL A pl to pm translator -utils/pod2html.PL Translator to turn pod into HTML -utils/prove.PL The prove harness utility -utils/ptar.PL The ptar utility -utils/ptardiff.PL The ptardiff utility -utils/ptargrep.PL The ptargrep utility -utils/shasum.PL filter for computing SHA digests (analogous to md5sum) -utils/splain.PL Stand-alone version of diagnostics.pm +utils/h2ph.PL A thing to turn C .h files into perl .ph files +utils/h2xs.PL Program to make .xs files from C header files +utils/instmodsh.PL Give information about installed extensions +utils/json_pp.PL JSON::PP command line utility +utils/libnetcfg.PL libnet +utils/Makefile.PL Extract the utility scripts +utils/perlbug.PL A simple tool to submit a bug report +utils/perldoc.PL A simple tool to find & display perl's documentation +utils/perlivp.PL installation verification procedure +utils/piconv.PL iconv(1), reinvented in perl +utils/pl2pm.PL A pl to pm translator +utils/pod2html.PL Translator to turn pod into HTML +utils/prove.PL The prove harness utility +utils/ptar.PL The ptar utility +utils/ptardiff.PL The ptardiff utility +utils/ptargrep.PL The ptargrep utility +utils/shasum.PL filter for computing SHA digests (analogous to md5sum) +utils/splain.PL Stand-alone version of diagnostics.pm utils/streamzip.PL -utils/xsubpp.PL External subroutine preprocessor +utils/xsubpp.PL External subroutine preprocessor utils/zipdetails.PL display the internal structure of zip files -vms/descrip_mms.template Template MM[SK] description file for build -vms/gen_shrfls.pl generate options files and glue for shareable image -vms/genopt.com hack to write options files in case of broken makes -vms/make_command.com record MM[SK] command used to build Perl -vms/mms2make.pl convert descrip.mms to make syntax -vms/munchconfig.c performs shell $var substitution for VMS -vms/myconfig.com record local configuration info for bug report -vms/test.com DCL driver for regression tests -vms/vms.c VMS-specific C code for Perl core -vms/vmsish.h VMS-specific C header for Perl core -vms/vmspipe.com VMS-specific piped command helper script -vos/Changes Changes made to port Perl to the VOS operating system -vos/compile_full_perl.cm VOS command macro to build "full" Perl -vos/configure_full_perl.sh VOS shell script to configure "full" perl before building -vos/make_full_perl.sh VOS shell script to build and test "full" perl -vos/vos.c VOS emulations for missing POSIX functions -vos/vosish.h VOS-specific header file -vutil.c Version object C functions -vutil.h Version object headers -vxs.inc Version object XS methods -warnings.h The warning numbers -win32/bin/exetype.pl Set executable type to CONSOLE or WINDOWS -win32/bin/perlglob.pl Win32 globbing -win32/bin/pl2bat.pl wrap perl scripts into batch files -win32/bin/runperl.pl run perl script via batch file namesake -win32/bin/search.pl Win32 port -win32/config.gc Win32 base line config.sh (MinGW build) -win32/config.vc Win32 base line config.sh (Visual C++ build) -win32/config_H.gc Win32 config header (MinGW build) -win32/config_h.PL Perl code to convert Win32 config.sh to config.h -win32/config_H.vc Win32 config header (Visual C++ build) -win32/config_sh.PL Perl code to update Win32 config.sh from Makefile -win32/create_perllibst_h.pl creates perllibst.h file for inclusion from perllib.c -win32/distclean.bat Remove _ALL_ files not listed here in MANIFEST -win32/fcrypt.c crypt() implementation -win32/FindExt.pm Scan for extensions -win32/GNUmakefile Win32 makefile for GNU make -win32/include/arpa/inet.h Win32 port -win32/include/dirent.h Win32 port -win32/include/netdb.h Win32 port -win32/include/sys/errno2.h Win32 port -win32/include/sys/socket.h Win32 port -win32/list_static_libs.pl prints libraries for static linking -win32/Makefile Win32 makefile for NMAKE (Visual C++ build) -win32/perlexe.ico perlexe.ico image file -win32/perlexe.manifest Assembly manifest file -win32/perlexe.rc associated perl binary with icon -win32/perlglob.c Win32 port -win32/perlhost.h Perl "host" implementation -win32/perllib.c Win32 port -win32/pod.mak Win32 port -win32/runperl.c Win32 port -win32/vdir.h Perl "host" virtual directory manager for Win32 -win32/vmem.h Perl "host" memory manager for Win32 -win32/win32.c Win32 port -win32/win32.h Win32 port -win32/win32iop.h Win32 port -win32/win32sck.c Win32 port -win32/win32thread.c Win32 functions for threads -win32/win32thread.h Win32 port mapping to threads -write_buildcustomize.pl Generate lib/buildcustomize.pl -XSUB.h Include file for extension subroutines -zaphod32_hash.h Zaphod32 hash code (32 bit fast hash function) +vms/descrip_mms.template Template MM[SK] description file for build +vms/gen_shrfls.pl generate options files and glue for shareable image +vms/genopt.com hack to write options files in case of broken makes +vms/make_command.com record MM[SK] command used to build Perl +vms/mms2make.pl convert descrip.mms to make syntax +vms/munchconfig.c performs shell $var substitution for VMS +vms/myconfig.com record local configuration info for bug report +vms/test.com DCL driver for regression tests +vms/vms.c VMS-specific C code for Perl core +vms/vmsish.h VMS-specific C header for Perl core +vms/vmspipe.com VMS-specific piped command helper script +vos/Changes Changes made to port Perl to the VOS operating system +vos/compile_full_perl.cm VOS command macro to build "full" Perl +vos/configure_full_perl.sh VOS shell script to configure "full" perl before building +vos/make_full_perl.sh VOS shell script to build and test "full" perl +vos/vos.c VOS emulations for missing POSIX functions +vos/vosish.h VOS-specific header file +win32/bin/exetype.pl Set executable type to CONSOLE or WINDOWS +win32/bin/perlglob.pl Win32 globbing +win32/bin/pl2bat.pl wrap perl scripts into batch files +win32/bin/runperl.pl run perl script via batch file namesake +win32/bin/search.pl Win32 port +win32/config.gc Win32 base line config.sh (MinGW build) +win32/config.vc Win32 base line config.sh (Visual C++ build) +win32/config_H.gc Win32 config header (MinGW build) +win32/config_h.PL Perl code to convert Win32 config.sh to config.h +win32/config_H.vc Win32 config header (Visual C++ build) +win32/config_sh.PL Perl code to update Win32 config.sh from Makefile +win32/create_perllibst_h.pl creates perllibst.h file for inclusion from perllib.c +win32/distclean.bat Remove _ALL_ files not listed here in MANIFEST +win32/fcrypt.c crypt() implementation +win32/FindExt.pm Scan for extensions +win32/GNUmakefile Win32 makefile for GNU make +win32/include/arpa/inet.h Win32 port +win32/include/dirent.h Win32 port +win32/include/netdb.h Win32 port +win32/include/sys/errno2.h Win32 port +win32/include/sys/socket.h Win32 port +win32/list_static_libs.pl prints libraries for static linking +win32/Makefile Win32 makefile for NMAKE (Visual C++ build) +win32/perlexe.ico perlexe.ico image file +win32/perlexe.manifest Assembly manifest file +win32/perlexe.rc associated perl binary with icon +win32/perlglob.c Win32 port +win32/perlhost.h Perl "host" implementation +win32/perllib.c Win32 port +win32/pod.mak Win32 port +win32/runperl.c Win32 port +win32/vdir.h Perl "host" virtual directory manager for Win32 +win32/vmem.h Perl "host" memory manager for Win32 +win32/win32.c Win32 port +win32/win32.h Win32 port +win32/win32iop.h Win32 port +win32/win32sck.c Win32 port +win32/win32thread.c Win32 functions for threads +win32/win32thread.h Win32 port mapping to threads Index: gnu/usr.bin/perl/META.json =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/META.json,v diff -u -p -a -u -p -r1.14 META.json --- gnu/usr.bin/perl/META.json 23 Dec 2023 21:02:20 -0000 1.14 +++ gnu/usr.bin/perl/META.json 21 Feb 2024 15:47:00 -0000 @@ -36,6 +36,7 @@ "dist/IO", "dist/lib", "dist/Locale-Maketext", + "dist/Math-Complex", "dist/Module-CoreList", "dist/Net-Ping", "dist/PathTools", @@ -118,6 +119,6 @@ "url" : "https://github.com/Perl/perl5" } }, - "version" : "5.036003", - "x_serialization_backend" : "JSON::PP version 4.07" + "version" : "5.038002", + "x_serialization_backend" : "JSON::PP version 4.16" } Index: gnu/usr.bin/perl/META.yml =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/META.yml,v diff -u -p -a -u -p -r1.14 META.yml --- gnu/usr.bin/perl/META.yml 23 Dec 2023 21:02:20 -0000 1.14 +++ gnu/usr.bin/perl/META.yml 21 Feb 2024 15:47:00 -0000 @@ -34,6 +34,7 @@ no_index: - dist/IO - dist/lib - dist/Locale-Maketext + - dist/Math-Complex - dist/Module-CoreList - dist/Net-Ping - dist/PathTools @@ -105,5 +106,5 @@ resources: homepage: https://www.perl.org/ license: https://dev.perl.org/licenses/ repository: https://github.com/Perl/perl5 -version: '5.036003' +version: '5.038002' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' Index: gnu/usr.bin/perl/Makefile.SH =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Makefile.SH,v diff -u -p -a -u -p -r1.62 Makefile.SH --- gnu/usr.bin/perl/Makefile.SH 23 Dec 2023 21:02:20 -0000 1.62 +++ gnu/usr.bin/perl/Makefile.SH 21 Feb 2024 15:47:00 -0000 @@ -73,7 +73,7 @@ true) esac ;; cygwin*) - shrpldflags="$shrpldflags -Wl,--out-implib=libperl.dll.a -Wl,--image-base,0x52000000" + shrpldflags="$shrpldflags -Wl,--out-implib=libperl.dll.a" linklibperl="-L. -lperl" ;; sunos*) @@ -531,17 +531,19 @@ unidatadirs = lib/unicore/To lib/unicore h1 = EXTERN.h INTERN.h XSUB.h av.h $(CONFIGH) cop.h cv.h dosish.h h2 = embed.h form.h gv.h handy.h hv.h hv_func.h keywords.h mg.h op.h opcode.h -h3 = pad.h patchlevel.h perl.h perlapi.h perly.h pp.h proto.h regcomp.h +h3 = pad.h patchlevel.h perl.h perlapi.h perly.h pp.h proto.h regcomp.h regcomp_internal.h h4 = regexp.h scope.h sv.h unixish.h util.h iperlsys.h thread.h h5 = utf8.h warnings.h mydtrace.h op_reg_common.h l1_char_class_tab.h h6 = charclass_invlists.h h = $(h1) $(h2) $(h3) $(h4) $(h5) $(h6) -c1 = av.c scope.c op.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro_core.c perl.c -c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c sv.c -c3 = taint.c toke.c util.c deb.c run.c builtin.c universal.c pad.c globals.c keywords.c +c1 = av.c scope.c op.c peep.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro_core.c perl.c +c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c utf8.c sv.c +c3 = taint.c toke.c util.c deb.c run.c builtin.c universal.c class.c pad.c globals.c keywords.c c4 = perlio.c numeric.c mathoms.c locale.c pp_pack.c pp_sort.c caretx.c dquote.c time64.c +c5 = regcomp.c regcomp_debug.c regcomp_invlist.c regcomp_study.c regcomp_trie.c regexec.c c5 = $(mallocsrc) syscall_emulator.c +c_base = $(c1) $(c2) $(c3) $(c4) $(c5) $(c6) !NO!SUBS! @@ -553,17 +555,24 @@ main_only_objs =$main_only_objs $spitshell >>$Makefile <<'!NO!SUBS!' -c = $(c1) $(c2) $(c3) $(c4) $(c5) miniperlmain.c $(mini_only_src) +c = $(c_base) miniperlmain.c $(mini_only_src) -obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro_core$(OBJ_EXT) keywords$(OBJ_EXT) builtin$(OBJ_EXT) -obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT) -obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT) caretx$(OBJ_EXT) dquote$(OBJ_EXT) time64$(OBJ_EXT) syscall_emulator$(OBJ_EXT) +obj1 = $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) +obj2 = regcomp$(OBJ_EXT) regcomp_debug$(OBJ_EXT) regcomp_invlist$(OBJ_EXT) regcomp_study$(OBJ_EXT) regcomp_trie$(OBJ_EXT) +obj3 = regexec$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro_core$(OBJ_EXT) +obj4 = keywords$(OBJ_EXT) builtin$(OBJ_EXT) class$(OBJ_EXT) +obj5 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) +obj6 = scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT) peep$(OBJ_EXT) +obj7 = doop$(OBJ_EXT) doio$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) +obj8 = deb$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) +obj9 = locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT) caretx$(OBJ_EXT) dquote$(OBJ_EXT) +obj10 = time64$(OBJ_EXT) syscall_emulator$(OBJ_EXT) # split the objects into 3 exclusive sets: those used by both miniperl and # perl, and those used by just one or the other. Doesn't include the # actual perl(mini)main.o, nor any dtrace objects. -common_objs = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) +common_objs = $(obj1) $(obj2) $(obj3) $(obj4) $(obj5) $(obj6) $(obj7) $(obj8) $(obj9) $(obj10) $(ARCHOBJS) miniperl_objs_nodt = $(mini_only_objs) $(common_objs) miniperlmain$(OBJ_EXT) perllib_objs_nodt = $(main_only_objs) $(common_objs) @@ -614,7 +623,7 @@ esac $spitshell >>$Makefile <<'!NO!SUBS!' -perltoc_pod_prereqs = extra.pods pod/perl5363delta.pod pod/perlapi.pod pod/perlintern.pod pod/perlmodlib.pod +perltoc_pod_prereqs = extra.pods pod/perl5382delta.pod pod/perlapi.pod pod/perlintern.pod pod/perlmodlib.pod generated_pods = pod/perltoc.pod $(perltoc_pod_prereqs) generated_headers = uudmap.h bitcount.h mg_data.h @@ -654,11 +663,11 @@ lintflags = \ @echo `$(CCCMD)` $(PLDLFLAGS) $*.c @`$(CCCMD)` $(PLDLFLAGS) $*.c -.c.i: perl.h config.h +.c.i: @echo `$(CCCMDSRC)` -E $*.c \> $*.i @`$(CCCMDSRC)` -E $*.c > $*.i -.c.s: perl.h config.h +.c.s: @echo `$(CCCMDSRC)` -S $*.c @`$(CCCMDSRC)` -S $*.c @@ -1129,9 +1138,9 @@ pod/perlintern.pod: $(MINIPERL_EXE) auto pod/perlmodlib.pod: $(MINIPERL_EXE) pod/perlmodlib.PL MANIFEST $(MINIPERL) pod/perlmodlib.PL -q -pod/perl5363delta.pod: pod/perldelta.pod - $(RMS) pod/perl5363delta.pod - $(LNS) perldelta.pod pod/perl5363delta.pod +pod/perl5382delta.pod: pod/perldelta.pod + $(RMS) pod/perl5382delta.pod + $(LNS) perldelta.pod pod/perl5382delta.pod extra.pods: $(MINIPERL_EXE) -@test ! -f extra.pods || rm -f `cat extra.pods` @@ -1632,7 +1641,7 @@ $spitshell >>$Makefile <<'!NO!SUBS!' # minitest can't depend on lib/Config.pm because that might be where miniperl # is crashing. -minitest_prep: +minitest_prep: $(MINIPERL_EXE) -@test -f lib/Config.pm || $(MAKE) lib/Config.pm $(unidatafiles) @echo " " @echo "You may see some irrelevant test failures if you have been unable" @@ -1642,10 +1651,10 @@ minitest_prep: MINITEST_TESTS = base/*.t comp/*.t cmd/*.t run/*.t io/*.t re/*.t opbasic/*.t op/*.t uni/*.t perf/*.t -minitest: $(MINIPERL_EXE) minitest_prep +minitest: minitest_prep cd t && $(RUN_PERL) TEST $(MINITEST_TESTS) <$(devtty) -minitest-notty minitest_notty: $(MINIPERL_EXE) minitest_prep +minitest-notty minitest_notty: minitest_prep cd t && PERL_SKIP_TTY_TEST=1 $(RUN_PERL) TEST $(MINITEST_TESTS) # Test via harness @@ -1657,7 +1666,7 @@ test_harness_notty: test_prep HARNESS_NOTTY=1 TESTFILE=harness $(RUN_TESTS) choose test_reonly test-reonly: test_prep_reonly - TEST_ARGS='re/*.t ext/re/t/*.t' TESTFILE=harness $(RUN_TESTS) choose + TEST_ARGS='re/*.t ../ext/re/t/*.t' PERL_TEST_HARNESS_ASAP=1 TESTFILE=harness $(RUN_TESTS) choose # Porting tests (well-formedness of pod, manifest, etc) @@ -1721,8 +1730,8 @@ distcheck: FORCE .PHONY: ctags -TAGS: $(c1) $(c2) $(c3) $(c4) $(c5) $(h) - etags $(c1) $(c2) $(c3) $(c4) $(c5) $(h) +TAGS: $(c_base) $(h) + etags $(c_base) $(h) !NO!SUBS! $spitshell >>$Makefile <EBCDIC translation worked out correctly. You can read more Index: gnu/usr.bin/perl/README.cn =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.cn,v diff -u -p -a -u -p -r1.1.1.9 README.cn --- gnu/usr.bin/perl/README.cn 15 Feb 2023 01:31:58 -0000 1.1.1.9 +++ gnu/usr.bin/perl/README.cn 21 Feb 2024 15:47:00 -0000 @@ -1,8 +1,10 @@ -=encoding utf8 +# vim: syntax=pod 如果你用一般的文字编辑器阅览这份文件, 请忽略文中奇特的注记字符. 这份文件是以 POD (简明文件格式) 写成; 这种格式是为了能让人直接阅读, 而特别设计的. 关于此格式的进一步信息, 请参考 perlpod 在线文档. + +=encoding utf8 =head1 NAME Index: gnu/usr.bin/perl/README.cygwin =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.cygwin,v diff -u -p -a -u -p -r1.4 README.cygwin --- gnu/usr.bin/perl/README.cygwin 15 Feb 2023 01:36:12 -0000 1.4 +++ gnu/usr.bin/perl/README.cygwin 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see F) which is specially designed to be readable as is. @@ -31,7 +33,7 @@ L A recent net or commercial release of Cygwin is required. -At the time this document was last updated, Cygwin 1.7.16 was current. +At the time this document was last updated, Cygwin 3.0.7 was current. =head2 Cygwin Configuration @@ -41,8 +43,8 @@ that Perl builds cleanly. These changes Perl usage. B The binaries that are built will run on all Win32 versions. -They do not depend on your host system (WinXP/Win2K/Win7) or your -Cygwin configuration (binary/text mounts, cvgserver). +They do not depend on your host system or your +Cygwin configuration (binary/text mounts, cygserver). The only dependencies come from hard-coded pathnames like F. However, your host system and Cygwin configuration will affect Perl's runtime behavior (see L). @@ -128,11 +130,10 @@ NOTE: The BerkeleyDB library only comple A port of SysV IPC is available for Cygwin. NOTE: This has B been extensively tested. In particular, -C is undefined because it fails a Configure test -and on Win9x the I functions seem to hang. It also creates -a compile time dependency because F includes F<> -and F<> (which will be required in the future when compiling -CPAN modules). CURRENTLY NOT SUPPORTED! +C is undefined because it fails a Configure test. It +also creates a compile time dependency because F includes +F<> and F<> (which will be required in the +future when compiling CPAN modules). CURRENTLY NOT SUPPORTED! =item * C<-lutil> @@ -201,47 +202,14 @@ build perl from sources. =back -=head2 Suspicious Warnings on Cygwin - -You may see some messages during Configure that seem suspicious. - -=over 4 - -=item * Win9x and C - -Win9x does not correctly report C with a non-blocking read on a -closed pipe. You will see the following messages: - - But it also returns -1 to signal EOF, so be careful! - WARNING: you can't distinguish between EOF and no data! - - *** WHOA THERE!!! *** - The recommended value for $d_eofnblk on this machine was - "define"! - Keep the recommended value? [y] - -At least for consistency with WinNT, you should keep the recommended -value. - -=item * Compiler/Preprocessor defines - -The following error occurs because of the Cygwin C<#define> of -C<_LONG_DOUBLE>: - - Guessing which symbols your C compiler and preprocessor define... - try.c:: missing binary operator - -This failure does not seem to cause any problems. With older gcc -versions, "parse error" is reported instead of "missing binary -operator". - -=back - =head1 MAKE ON CYGWIN Simply run I and wait: - make 2>&1 | tee log.make + make -jn 2>&1 | tee log.make + +where I is the maximum number of simultaneous compilations you want; +omitting this parameter is the same as specifying C<-j1>. =head1 TEST ON CYGWIN @@ -252,7 +220,12 @@ There are two steps to running the test cd t; ./perl harness 2>&1 | tee ../log.harness The same tests are run both times, but more information is provided when -running as C<./perl harness>. +running as C<./perl harness>, and you can run the tests in parallel by +instead specifying + + cd t; TEST_JOBS=n ./perl harness 2>&1 | tee ../log.harness + +where I is the maximum number of tests to run simulataneously. Test results vary depending on your host system and your Cygwin configuration. If a test can pass in some Cygwin setup, it is always @@ -329,8 +302,8 @@ to portability, more information can be =item * Pathnames Cygwin pathnames are separated by forward (F) slashes, Universal -Naming Codes (F) are also supported Since cygwin-1.7 non-POSIX -pathnames are discouraged. Names may contain all printable +Naming Codes (F) are also supported. Since cygwin-1.7 non-POSIX +pathnames should not be used. Names may contain all printable characters. File names are case insensitive, but case preserving. A pathname that @@ -419,30 +392,24 @@ or: as parent(0x6FB30000) != 0x6FE60000 46 [main] perl 3488 fork: child 3588 - died waiting for dll loading, errno11 -See L +See L It helps if not too many DLLs are loaded in memory so the available address space is larger, e.g. stopping the MS Internet Explorer might help. -Use the perlrebase or rebase utilities to resolve the conflicting dll addresses. ++Use the rebase utilities to resolve the conflicting dll addresses. The rebase package is included in the Cygwin setup. Use F from L to install it. -1. kill all perl processes and run C or - -2. kill all cygwin processes and services, start dash from cmd.exe and run C. +1. kill all perl processes and run + C< -xdev -name \*.dll | /bin/rebase -OT ->> or -=item * C - -On WinNT C can change a file's user and group IDs. On Win9x C -is a no-op, although this is appropriate since there is no security model. +2. kill all cygwin processes and services, and run setup.exe. =item * Miscellaneous File locking using the C command to C is a stub that returns C. -Win9x can not C an open file (although WinNT can). - The Cygwin C implementation has holes (it can not restrict file access by native Win32 programs). @@ -566,7 +533,7 @@ be kept as clean as possible. pod/perl573delta.pod pod/perl58delta.pod pod/perl581delta.pod pod/perl590delta.pod pod/perlhist.pod pod/perlmodlib.pod pod/perltoc.pod Porting/Glossary pod/perlgit.pod - Porting/checkAUTHORS.pl + Porting/updateAUTHORS.pl dist/Cwd/Changes ext/Compress-Raw-Zlib/Changes dist/Time-HiRes/Changes ext/Compress-Raw-Zlib/README ext/Compress-Zlib/Changes @@ -774,4 +741,4 @@ Jerry D. Hedden . =head1 HISTORY -Last updated: 2012-02-08 +Last updated: 2019-11-14 Index: gnu/usr.bin/perl/README.freebsd =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.freebsd,v diff -u -p -a -u -p -r1.2 README.freebsd --- gnu/usr.bin/perl/README.freebsd 9 Apr 2020 01:32:11 -0000 1.2 +++ gnu/usr.bin/perl/README.freebsd 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specifically designed to be readable as is. @@ -17,7 +19,7 @@ When perl is configured to use ithreads, in preference to non-re-entrant versions. There is a bug in FreeBSD's C function in versions 4.5 and earlier that can cause a SEGV when reading large directories. A patch for FreeBSD libc is available -(see L ) +(see L) which has been integrated into FreeBSD 4.6. =head2 C<$^X> doesn't always contain a full path in FreeBSD @@ -27,7 +29,7 @@ system. On FreeBSD the full path of the C with C if that is supported, else by reading the symlink F. FreeBSD 7 and earlier has a bug where either approach sometimes returns an incorrect value -(see L ). +(see L). In these cases perl will fall back to the old behaviour of using C's C value for C<$^X>. Index: gnu/usr.bin/perl/README.haiku =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.haiku,v diff -u -p -a -u -p -r1.14 README.haiku --- gnu/usr.bin/perl/README.haiku 23 Dec 2023 21:02:20 -0000 1.14 +++ gnu/usr.bin/perl/README.haiku 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. @@ -22,9 +24,9 @@ The build procedure is completely standa Make perl executable and create a symlink for libperl: chmod a+x /boot/common/bin/perl - cd /boot/common/lib; ln -s perl5/5.36.3/BePC-haiku/CORE/libperl.so . + cd /boot/common/lib; ln -s perl5/5.38.2/BePC-haiku/CORE/libperl.so . -Replace C<5.36.3> with your respective version of Perl. +Replace C<5.38.2> with your respective version of Perl. =head1 KNOWN PROBLEMS Index: gnu/usr.bin/perl/README.hpux =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.hpux,v diff -u -p -a -u -p -r1.3 README.hpux --- gnu/usr.bin/perl/README.hpux 30 Dec 2019 02:13:39 -0000 1.3 +++ gnu/usr.bin/perl/README.hpux 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. Index: gnu/usr.bin/perl/README.hurd =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.hurd,v diff -u -p -a -u -p -r1.4 README.hurd --- gnu/usr.bin/perl/README.hurd 1 Mar 2021 23:19:42 -0000 1.4 +++ gnu/usr.bin/perl/README.hurd 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. Index: gnu/usr.bin/perl/README.irix =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.irix,v diff -u -p -a -u -p -r1.4 README.irix --- gnu/usr.bin/perl/README.irix 15 Feb 2023 01:36:12 -0000 1.4 +++ gnu/usr.bin/perl/README.irix 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specifically designed to be readable as is. Index: gnu/usr.bin/perl/README.jp =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.jp,v diff -u -p -a -u -p -r1.1.1.9 README.jp --- gnu/usr.bin/perl/README.jp 15 Feb 2023 01:32:31 -0000 1.1.1.9 +++ gnu/usr.bin/perl/README.jp 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + =encoding utf8 =head1 NAME Index: gnu/usr.bin/perl/README.ko =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.ko,v diff -u -p -a -u -p -r1.1.1.8 README.ko --- gnu/usr.bin/perl/README.ko 15 Feb 2023 01:31:59 -0000 1.1.1.8 +++ gnu/usr.bin/perl/README.ko 21 Feb 2024 15:47:00 -0000 @@ -1,9 +1,10 @@ -=encoding utf8 +# vim: syntax=pod 이 파일을 내용 그대로 읽고 있다면 우스꽝스러운 문자는 무시해주세요. 이 문서는 POD로 읽을 수 있도록 POD 형식(F 문서를 확인하세요)으로 작성되어 있습니다. +=encoding utf8 =head1 NAME Index: gnu/usr.bin/perl/README.linux =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.linux,v diff -u -p -a -u -p -r1.3 README.linux --- gnu/usr.bin/perl/README.linux 1 Mar 2021 23:19:42 -0000 1.3 +++ gnu/usr.bin/perl/README.linux 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specifically designed to be readable as is. Index: gnu/usr.bin/perl/README.macosx =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.macosx,v diff -u -p -a -u -p -r1.14 README.macosx --- gnu/usr.bin/perl/README.macosx 23 Dec 2023 21:02:20 -0000 1.14 +++ gnu/usr.bin/perl/README.macosx 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. @@ -10,9 +12,9 @@ perlmacosx - Perl under Mac OS X This document briefly describes Perl under Mac OS X. - curl -O https://www.cpan.org/src/perl-5.36.3.tar.gz - tar -xzf perl-5.36.3.tar.gz - cd perl-5.36.3 + curl -O https://www.cpan.org/src/perl-5.38.2.tar.gz + tar -xzf perl-5.38.2.tar.gz + cd perl-5.38.2 ./Configure -des -Dprefix=/usr/local/ make make test @@ -20,7 +22,7 @@ This document briefly describes Perl und =head1 DESCRIPTION -The latest Perl release (5.36.3 as of this writing) builds without changes +The latest Perl release (5.38.2 as of this writing) builds without changes under all versions of Mac OS X from 10.3 "Panther" onwards. In order to build your own version of Perl you will need 'make', Index: gnu/usr.bin/perl/README.openbsd =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.openbsd,v diff -u -p -a -u -p -r1.2 README.openbsd --- gnu/usr.bin/perl/README.openbsd 9 Apr 2020 01:32:11 -0000 1.2 +++ gnu/usr.bin/perl/README.openbsd 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specifically designed to be readable as is. Index: gnu/usr.bin/perl/README.os2 =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.os2,v diff -u -p -a -u -p -r1.30 README.os2 --- gnu/usr.bin/perl/README.os2 23 Dec 2023 21:02:20 -0000 1.30 +++ gnu/usr.bin/perl/README.os2 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see perlpod manpage) which is specially designed to be readable as is. @@ -619,7 +621,7 @@ C in F, =item Additional Perl modules - unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.36.3/ + unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.38.2/ Same remark as above applies. Additionally, if this directory is not one of directories on @INC (and @INC is influenced by C), you Index: gnu/usr.bin/perl/README.os390 =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.os390,v diff -u -p -a -u -p -r1.6 README.os390 --- gnu/usr.bin/perl/README.os390 15 Feb 2023 01:36:12 -0000 1.6 +++ gnu/usr.bin/perl/README.os390 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + This document is written in pod format hence there are punctuation characters in odd places. You can read more about pod in pod/perlpod.pod or the short summary in the INSTALL file. Index: gnu/usr.bin/perl/README.os400 =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.os400,v diff -u -p -a -u -p -r1.3 README.os400 --- gnu/usr.bin/perl/README.os400 9 Apr 2020 01:32:11 -0000 1.3 +++ gnu/usr.bin/perl/README.os400 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. Index: gnu/usr.bin/perl/README.plan9 =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.plan9,v diff -u -p -a -u -p -r1.2 README.plan9 --- gnu/usr.bin/perl/README.plan9 27 Oct 2002 22:25:17 -0000 1.2 +++ gnu/usr.bin/perl/README.plan9 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. Index: gnu/usr.bin/perl/README.qnx =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.qnx,v diff -u -p -a -u -p -r1.7 README.qnx --- gnu/usr.bin/perl/README.qnx 15 Feb 2023 01:36:12 -0000 1.7 +++ gnu/usr.bin/perl/README.qnx 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. Index: gnu/usr.bin/perl/README.riscos =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.riscos,v diff -u -p -a -u -p -r1.1.1.2 README.riscos --- gnu/usr.bin/perl/README.riscos 25 Mar 2013 20:06:37 -0000 1.1.1.2 +++ gnu/usr.bin/perl/README.riscos 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specifically designed to be readable as is. Index: gnu/usr.bin/perl/README.solaris =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.solaris,v diff -u -p -a -u -p -r1.12 README.solaris --- gnu/usr.bin/perl/README.solaris 9 Apr 2020 01:32:11 -0000 1.12 +++ gnu/usr.bin/perl/README.solaris 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specifically designed to be readable as is. Index: gnu/usr.bin/perl/README.synology =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.synology,v diff -u -p -a -u -p -r1.5 README.synology --- gnu/usr.bin/perl/README.synology 15 Feb 2023 01:36:12 -0000 1.5 +++ gnu/usr.bin/perl/README.synology 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. But if you have been into Perl you @@ -23,20 +25,98 @@ L. +supported architectures are armv5, armv7, mipsel, wl500g, x86_32, and x86_64. +Check L for supported platforms. + +That github link also shows what environments should be supported. + +It was tested on DSM-7.1 by H.Merijn Brand on a DS218+ and a DS220+ (both +Intel x64). + +Entware comes with a precompiled 5.26.1 (Jan 2018) that allowes +building shared XS code. Note that this installation does B use +a site_perl folder. The available C works. If all required +development packages are installed too, also for XS. + +Installing perl from the Community package center: + +=over 4 + +=item * + +Using your favourite browser open the DSM management page and start +the Package Center. + +=item * + +In Settings, add the following Package Sources: + + Name: Community + Location: https://synopackage.com/repository/spk/All + +=item * + +Still in Settings, in Channel Update, select Beta Channel. + +=back + +To complete the development environment, install make and gcc + + ds220# opkg install make gcc + +Then, optionally, make sure you use the more recent bash and gawk. + + ds220# opkg install bash gawk + ds220# cd /usr/bin + ds220# mv bash bash.syno + ds220# ln -s /opt/bin/bash . + +In order to have Configure find the required libraries + + ds220# cd /opt/lib + ds220# ln -s libcrypt.so.? libcrypt.so + ds220# ln -s libdl.so.? libdl.so + ds220# ln -s libgdbm.so.? libgdbm.so + ds220# ln -s libgdbm_compat.so.? libgdbm_compat.so + ds220# ln -s libm.so.? libm.so + ds220# ln -s libpthread.so.? libpthread.so + ds220# ln -s libutil.so.? libutil.so + +=head3 DSM 6 + +Using iPkg has been deprecated on DSM 6, but an alternative is available +for DSM 6: entware/opkg. For instructions on how to use that, please read +L + +That sadly does not (yet) work on QorIQ. At the moment of writing, the +supported architectures are armv5, armv7, mipsel, wl500g, x86_32, and x86_64. +Check L for supported platforms. + +Entware-ng comes with a precompiled 5.24.1 (June 2017) that allowes +building shared XS code. Note that this installation does B use +a site_perl folder. The available C works. If all required +development packages are installed too, also for XS. + =head3 DSM 5 As DSM is a trimmed-down Linux system, it lacks many of the tools and @@ -62,6 +142,9 @@ In Settings, add the following Package S https://www.cphub.net http://packages.quadrat4.de +As these two are both discontinued, it is unlikely you will be able +to set up a build environment on DSM 5. + =item * Still in Settings, in Channel Update, select Beta Channel. @@ -131,21 +214,6 @@ Execute the following commands: B When you perform a system software upgrade, these links will disappear and need to be re-established. -=head3 DSM 6 - -Using iPkg has been deprecated on DSM 6, but an alternative is available -for DSM 6: entware/opkg. For instructions on how to use that, please read -L - -That sadly does not (yet) work on QorIQ. At the moment of writing, the -supported architectures are armv5, armv7, mipsel, wl500g, x86_32, and x86_64. -Check L for supported platforms. - -Entware-ng comes with a precompiled 5.24.1 (June 2017) that allowes -building shared XS code. Note that this installation does B use -a site_perl folder. The available C works. If all required -development packages are installed too, also for XS. - =head2 Compiling Perl 5 When the build environment has been set up, building and testing Perl @@ -158,16 +226,18 @@ sources as usual, and add a file Policy. # Install Perl in a tree in /opt/perl instead of /opt/bin. prefix=/opt/perl - # Select the compiler. Note that there is no 'cc' alias or link. + # Select the compiler. Note that there is no 'cc' alias or link + # on older DSM versions cc=gcc + awk=/opt/bin/gawk - # Build flags. + # Build flags. Optional ccflags="-DDEBUGGING" # Library and include paths. - libpth="/lib" locincpth="/opt/include" - loclibpth="/lib" + loclibpth="/opt/lib /usr/local/lib /usr/lib" + libpth="/opt/lib /usr/local/lib /usr/lib" You may want to create the destination directory and give it the right permissions before installing, thus eliminating the need to build Perl @@ -176,16 +246,19 @@ as a super user. In the directory where you unpacked the sources, issue the familiar commands: - ./Configure -des - make - make test - make install + $ bash ./Configure -Dusedevel -Duseshrplib -Duse64bitall -des + $ make -j2 + $ env TEST_JOBS=2 make test_harness + $ make install =head2 Known problems =head3 Configure -No known problems yet +The GNU C-compiler might spit out unexpected stuff under -v, which +causes the analysis of cppsymbols to fail because of unmatched quotes. + +You'll note if config.sh fails with a syntax error. =head3 Build @@ -216,7 +289,7 @@ some system components will start to fai =back -=head2 Smoke testing Perl 5 +=head2 Smoke testing Perl If building completes successfully, you can set up smoke testing as described in the Test::Smoke documentation. @@ -267,11 +340,11 @@ the programs are run. =head1 REVISION -June 2017, for Synology DSM 5.1.5022 and DSM 6.1-15101-4. +July 2022, for DSM 5.1.5022 and DSM 6.1-15101-4, and DSM-7.1-42661-3. =head1 AUTHOR Johan Vromans -H. Merijn Brand +H. Merijn Brand =cut Index: gnu/usr.bin/perl/README.tru64 =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.tru64,v diff -u -p -a -u -p -r1.2 README.tru64 --- gnu/usr.bin/perl/README.tru64 5 Feb 2017 00:31:52 -0000 1.2 +++ gnu/usr.bin/perl/README.tru64 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. Index: gnu/usr.bin/perl/README.tw =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.tw,v diff -u -p -a -u -p -r1.1.1.10 README.tw --- gnu/usr.bin/perl/README.tw 15 Feb 2023 01:31:57 -0000 1.1.1.10 +++ gnu/usr.bin/perl/README.tw 21 Feb 2024 15:47:00 -0000 @@ -1,8 +1,10 @@ -=encoding utf8 +# vim: syntax=pod 如果你用一般的文字編輯器閱覽這份文件, 請忽略文中奇特的註記字符. 這份文件是以 POD (簡明文件格式) 寫成; 這種格式是為了能讓人直接讀取, 而特別設計的. 關於此格式的進一步資訊, 請參考 perlpod 線上文件. + +=encoding utf8 =head1 NAME Index: gnu/usr.bin/perl/README.vms =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.vms,v diff -u -p -a -u -p -r1.31 README.vms --- gnu/usr.bin/perl/README.vms 23 Dec 2023 21:02:20 -0000 1.31 +++ gnu/usr.bin/perl/README.vms 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the equal signs on the left. This file is written in the POD format (see [.pod]perlpod.pod) which is specially designed to be readable as is. @@ -137,11 +139,11 @@ You may need to set up a foreign symbol choice. Once you have done so, use a command like the following to unpack the archive: - vmstar -xvf perl-5^.36^.3.tar + vmstar -xvf perl-5^.38^.2.tar Then set default to the top-level source directory like so: - set default [.perl-5^.36^.3] + set default [.perl-5^.38^.2] and proceed with configuration as described in the next section. Index: gnu/usr.bin/perl/README.vos =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.vos,v diff -u -p -a -u -p -r1.1.1.10 README.vos --- gnu/usr.bin/perl/README.vos 24 Mar 2014 14:58:47 -0000 1.1.1.10 +++ gnu/usr.bin/perl/README.vos 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. Index: gnu/usr.bin/perl/README.win32 =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/README.win32,v diff -u -p -a -u -p -r1.22 README.win32 --- gnu/usr.bin/perl/README.win32 15 Feb 2023 01:36:12 -0000 1.22 +++ gnu/usr.bin/perl/README.win32 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + If you read this file _as_is_, just ignore the funny characters you see. It is written in the POD format (see pod/perlpod.pod) which is specially designed to be readable as is. @@ -53,7 +55,7 @@ delivering complete gcc toolchain for MS Delivers gcc toolchain building 32-bit executables (which can be used both 32 and 64 bit Windows platforms) -=item L +=item L Delivers gcc toolchain targeting both 64-bit Windows and 32-bit Windows platforms (despite the project name "mingw-w64" they are not only 64-bit @@ -72,10 +74,10 @@ https://docs.microsoft.com/en-us/visuals and https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-sysrequirements-vs -The MinGW64 compiler is available at L. +The MinGW64 compiler is available at L. The latter is actually a cross-compiler targeting Win64. There's also a trimmed down compiler (no java, or gfortran) suitable for building perl available at: -L +L NOTE: If you're using a 32-bit compiler to build perl on a 64-bit Windows operating system, then you should set the WIN64 environment variable to "undef". @@ -133,20 +135,25 @@ These free versions of Visual C++ 2013-2 compilers and linkers that ship with the full versions, and also contain everything necessary to build Perl. -These packages can be downloaded by searching in the Download Center at -L. (Providing exact -links to these packages has proven a pointless task because the links keep on -changing so often.) +These packages can be downloaded from L. Install Visual C++ 2013-2022 Community, then setup your environment using, e.g. - C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat +F (assuming the default installation location was chosen). -Perl should now build using the win32/Makefile. You will need to edit that -file to set CCTYPE to one of MSVC120-MSVC142 first. +Perl should now build using the F. You will need to edit that +file to set C to one of C-C first. + +=item Microsoft C++ Build Tools + +There's also a standalone (IDE-less) version of the build tools mentioned +above containing the MSVC compiler available for download from +L. + +This is also referred to as I. =item GCC @@ -154,7 +161,7 @@ Perl can be compiled with gcc from MinGW MinGW64 (version 4.4.3 or later). It can be downloaded here: L -L +L You also need gmake. Usually it comes with MinGW but its executable may have a different name, such as mingw32-make.exe. @@ -167,11 +174,11 @@ or later, and with MinGW64 64-bit 6.3.0 =item Intel C++ Compiler Experimental support for using Intel C++ Compiler has been added. Edit -win32/Makefile and pick the correct CCTYPE for the Visual C that Intel C was -installed into. Also uncomment __ICC to enable Intel C on Visual C support. +F and pick the correct C for the Visual C that Intel C +was installed into. Also uncomment C<__ICC> to enable Intel C on Visual C support. To set up the build environment, from the Start Menu run IA-32 Visual Studio 20__ mode or Intel 64 Visual Studio 20__ mode as -appropriate. Then run nmake as usually in that prompt box. +appropriate. Then run C as usual in that prompt box. Only Intel C++ Compiler v12.1 has been tested. Other versions probably will work. Using Intel C++ Compiler instead of Visual C has the benefit of C99 @@ -187,65 +194,65 @@ unlike GCC. =item * -Make sure you are in the "win32" subdirectory under the perl toplevel. -This directory contains a "Makefile" that will work with -versions of nmake that come with Visual C++, and -a GNU make "GNUmakefile" that will work for all supported compilers. -The defaults in the gmake makefile are setup to build using MinGW/gcc. +Make sure you are in the F subdirectory under the perl toplevel. +This directory contains a F that will work with +versions of C that come with Visual C++, and +a GNU make F that will work for all supported compilers. +The defaults in the C makefile are set up to build with MinGW/gcc. =item * -Edit the GNUmakefile (or Makefile, if you're using nmake) and change the values -of INST_DRV and INST_TOP. You can also enable various build flags. These are -explained in the makefiles. +Edit the F (or F, if you're using F) and change +the values of I and C. You can also enable various build +flags. These are explained in the makefiles. -Note that it is generally not a good idea to try to build a perl with -INST_DRV and INST_TOP set to a path that already exists from a previous +Note that it is generally not a good idea to try to build a C with +C and C set to a path that already exists from a previous build. In particular, this may cause problems with the -lib/ExtUtils/t/Embed.t test, which attempts to build a test program and -may end up building against the installed perl's lib/CORE directory rather -than the one being tested. +F test, which attempts to build a test program and +may end up building against the installed C's F directory +rather than the one being tested. -You will have to make sure that CCTYPE is set correctly and that -CCHOME points to wherever you installed your compiler. For GCC this +You will have to make sure that C is set correctly and that +C points to wherever you installed your compiler. For GCC this should be the directory that contains the F, F and F directories. If building with the cross-compiler provided by mingw-w64.org you'll need to uncomment the line that sets -GCCCROSS in the GNUmakefile. Do this only if it's the cross-compiler - ie -only if the bin folder doesn't contain a gcc.exe. (The cross-compiler -does not provide a gcc.exe, g++.exe, ar.exe, etc. Instead, all of these -executables are prefixed with 'x86_64-w64-mingw32-'.) +C in the F. Do this only if it's the cross-compiler, +ie. only if the F folder doesn't contain a F. (The cross-compiler +does not provide a F, F, F, etc. Instead, all of these +executables are prefixed with C.) -The default value for CCHOME in the makefiles for Visual C++ +The default value for C in the makefiles for Visual C++ may not be correct for some versions. Make sure the default exists and is valid. -If you want build some core extensions statically into perl's dll, specify -them in the STATIC_EXT macro. +If you want build some core extensions statically into C's DLL, +specify them in the C macro. Be sure to read the instructions near the top of the makefiles carefully. =item * -Type "gmake" (or "nmake" if you are using that make). +Type C (or C if you are using that version of C). -This should build everything. Specifically, it will create perl.exe, -perl536.dll at the perl toplevel, and various other extension dll's -under the lib\auto directory. If the build fails for any reason, make +This should build everything. Specifically, it will create F, +F at the perl toplevel, and various other extension DLL's +under the F directory. If the build fails for any reason, make sure you have done the previous steps correctly. -To try gmake's parallel mode, type "gmake -j2", where 2, is the maximum number +To try C's parallel mode, type C where C<2> is the maximum number of parallel jobs you want to run. A number of things in the build process will run in parallel, but there are serialization points where you will see just 1 CPU maxed out. This is normal. If you are advanced enough with building C code, here is a suggestion to speed -up building perl, and the later C. Try to keep your PATH environmental +up building C, and the later C. Try to keep your C environment variable with the least number of folders possible (remember to keep your C -compiler's folders there). C or C -depending on your OS version should be first folder in PATH, since "cmd.exe" +compiler's folders there). F or F +depending on your OS version should be first folder in C, since C is the most commonly launched program during the build and later testing. =back Index: gnu/usr.bin/perl/XSUB.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/XSUB.h,v diff -u -p -a -u -p -r1.21 XSUB.h --- gnu/usr.bin/perl/XSUB.h 15 Feb 2023 01:36:12 -0000 1.21 +++ gnu/usr.bin/perl/XSUB.h 21 Feb 2024 15:47:00 -0000 @@ -74,28 +74,28 @@ Macro to declare an XSUB and its C param Macro used by C> and C> to declare a function prototype. You probably shouldn't be using this directly yourself. -=for apidoc Amns||dAX +=for apidoc Amn;||dAX Sets up the C variable. This is usually handled automatically by C by calling C. -=for apidoc Amns||dAXMARK +=for apidoc Amn;||dAXMARK Sets up the C variable and stack marker variable C. This is usually handled automatically by C by calling C. -=for apidoc Amns||dITEMS +=for apidoc Amn;||dITEMS Sets up the C variable. This is usually handled automatically by C by calling C. -=for apidoc Amns||dXSARGS +=for apidoc Amn;||dXSARGS Sets up stack and mark pointers for an XSUB, calling C and C. Sets up the C and C variables by calling C and C. This is usually handled automatically by C. -=for apidoc Amns||dXSI32 +=for apidoc Amn;||dXSI32 Sets up the C variable for an XSUB which has aliases. This is usually handled automatically by C. -=for apidoc Amns||dUNDERBAR +=for apidoc Amn;||dUNDERBAR Sets up any variable needed by the C macro. It used to define C, but it is currently a noop. However, it is strongly advised to still use it for ensuring past and future compatibility. @@ -261,16 +261,16 @@ Return a double from an XSUB immediately =for apidoc Am|void|XSRETURN_PV|char* str Return a copy of a string from an XSUB immediately. Uses C. -=for apidoc Amns||XSRETURN_NO +=for apidoc Amn;||XSRETURN_NO Return C<&PL_sv_no> from an XSUB immediately. Uses C. -=for apidoc Amns||XSRETURN_YES +=for apidoc Amn;||XSRETURN_YES Return C<&PL_sv_yes> from an XSUB immediately. Uses C. -=for apidoc Amns||XSRETURN_UNDEF +=for apidoc Amn;||XSRETURN_UNDEF Return C<&PL_sv_undef> from an XSUB immediately. Uses C. -=for apidoc Amns||XSRETURN_EMPTY +=for apidoc Amn;||XSRETURN_EMPTY Return an empty list from an XSUB immediately. =for apidoc AmU||newXSproto|char* name|XSUBADDR_t f|char* filename|const char *proto @@ -282,18 +282,18 @@ The version identifier for an XS module. handled automatically by C. See C>. -=for apidoc Amns||XS_VERSION_BOOTCHECK +=for apidoc Amn;||XS_VERSION_BOOTCHECK Macro to verify that a PM module's C<$VERSION> variable matches the XS module's C variable. This is usually handled automatically by C. See L. -=for apidoc Amns||XS_APIVERSION_BOOTCHECK +=for apidoc Amn;||XS_APIVERSION_BOOTCHECK Macro to verify that the perl api version an XS module has been compiled against matches the api version of the perl interpreter it's being loaded into. =for apidoc_section $exceptions -=for apidoc Amns||dXCPT +=for apidoc Amn;||dXCPT Set up necessary local variables for exception handling. See L. @@ -306,7 +306,7 @@ Ends a try block. See L. -=for apidoc Amns||XCPT_RETHROW +=for apidoc Amn;||XCPT_RETHROW Rethrows a previously caught exception. See L. =cut @@ -329,15 +329,15 @@ Rethrows a previously caught exception. return; \ } STMT_END -#define XSRETURN_IV(v) STMT_START { XST_mIV(0,v); XSRETURN(1); } STMT_END -#define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END -#define XSRETURN_NV(v) STMT_START { XST_mNV(0,v); XSRETURN(1); } STMT_END -#define XSRETURN_PV(v) STMT_START { XST_mPV(0,v); XSRETURN(1); } STMT_END -#define XSRETURN_PVN(v,n) STMT_START { XST_mPVN(0,v,n); XSRETURN(1); } STMT_END -#define XSRETURN_NO STMT_START { XST_mNO(0); XSRETURN(1); } STMT_END -#define XSRETURN_YES STMT_START { XST_mYES(0); XSRETURN(1); } STMT_END -#define XSRETURN_UNDEF STMT_START { XST_mUNDEF(0); XSRETURN(1); } STMT_END -#define XSRETURN_EMPTY STMT_START { XSRETURN(0); } STMT_END +#define XSRETURN_IV(v) STMT_START { XST_mIV(0,v); XSRETURN(1); } STMT_END +#define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END +#define XSRETURN_NV(v) STMT_START { XST_mNV(0,v); XSRETURN(1); } STMT_END +#define XSRETURN_PV(v) STMT_START { XST_mPV(0,v); XSRETURN(1); } STMT_END +#define XSRETURN_PVN(v,n) STMT_START { XST_mPVN(0,v,n); XSRETURN(1); } STMT_END +#define XSRETURN_NO STMT_START { XST_mNO(0); XSRETURN(1); } STMT_END +#define XSRETURN_YES STMT_START { XST_mYES(0); XSRETURN(1); } STMT_END +#define XSRETURN_UNDEF STMT_START { XST_mUNDEF(0); XSRETURN(1); } STMT_END +#define XSRETURN_EMPTY STMT_START { XSRETURN(0); } STMT_END #define newXSproto(a,b,c,d) newXS_flags(a,b,c,d,0) @@ -426,7 +426,7 @@ Rethrows a previously caught exception. } STMT_END #define DBM_ckFilter(arg,type,name) \ - STMT_START { \ + STMT_START { \ if (db->type) { \ if (db->filtering) { \ croak("recursion detected in %s", name) ; \ @@ -450,7 +450,8 @@ Rethrows a previously caught exception. if (name[7] == 's'){ \ arg = sv_2mortal(arg); \ } \ - } } STMT_END + } \ + } STMT_END #if 1 /* for compatibility */ # define VTBL_sv &PL_vtbl_sv Index: gnu/usr.bin/perl/autodoc.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/autodoc.pl,v diff -u -p -a -u -p -r1.6 autodoc.pl --- gnu/usr.bin/perl/autodoc.pl 15 Feb 2023 01:36:12 -0000 1.6 +++ gnu/usr.bin/perl/autodoc.pl 21 Feb 2024 15:47:00 -0000 @@ -33,7 +33,7 @@ my %extra_input_pods = ( 'dist/ExtUtils- # the legal section names, or an error is thrown. $section_name_variable must # be one of the legal section name variables defined below; these expand to # legal section names. This form is used so that minor wording changes in -# these titles can be confied to this file. All the names of the variables +# these titles can be confined to this file. All the names of the variables # end in '_scn'; this suffix is optional in the apidoc_section lines. # # All API elements defined between this line and the next 'apidoc_section' @@ -369,7 +369,7 @@ my $apidoc_re = qr/ ^ (\s*) # (.*?) # $7 \s* \n /x; # Only certain flags, dealing with display, are acceptable for apidoc_item -my $display_flags = "fFnDopsTx"; +my $display_flags = "fFnDopTx;"; sub check_api_doc_line ($$) { my ($file, $in) = @_; @@ -529,13 +529,19 @@ sub autodoc ($$) { # parse a file and ex } die "flag '$1' is not legal (for function $element_name (from $file))" - if $flags =~ / ( [^AabCDdEeFfGhiIMmNnTOoPpRrSsUuWXxy] ) /x; + if $flags =~ / ( [^AabCDdEeFfGhiIMmNnTOoPpRrSsUuWXxy;#] ) /x; die "'u' flag must also have 'm' or 'y' flags' for $element_name" if $flags =~ /u/ && $flags !~ /[my]/; warn ("'$element_name' not \\w+ in '$proto_in_file' in $file") if $flags !~ /N/ && $element_name !~ / ^ [_[:alpha:]] \w* $ /x; + if ($flags =~ /#/) { + die "Return type must be empty for '$element_name'" + if $ret_type; + $ret_type = '#ifdef'; + } + if (exists $seen{$element_name} && $flags !~ /h/) { die ("'$element_name' in $file was already documented in $seen{$element_name}"); } @@ -633,21 +639,23 @@ sub autodoc ($$) { # parse a file and ex if ($element_name) { # Here, we have accumulated into $text, the pod for $element_name - my $where = $flags =~ /A/ ? 'api' : 'guts'; + my $where = $flags =~ /A/ ? 'api' : 'intern'; die "No =for apidoc_section nor =head1 in $file for '$element_name'\n" unless defined $section; - if (exists $docs{$where}{$section}{$element_name}) { + my $is_link_only = ($flags =~ /h/); + if (! $is_link_only && exists $docs{$where}{$section}{$element_name}) { warn "$0: duplicate API entry for '$element_name' in" . " $where/$section\n"; next; } # Override the text with just a link if the flags call for that - my $is_link_only = ($flags =~ /h/); if ($is_link_only) { if ($file_is_C) { - die "Can't currently handle link with items to it:\n$in" if @items; + die "Can't currently handle link with items to it:\n$in" + if @items; + $docs{$where}{$section}{X_tags}{$element_name} = $file; redo; # Don't put anything if C source } @@ -664,7 +672,7 @@ sub autodoc ($$) { # parse a file and ex # Don't output a usage example for linked to documentation if # it is trivial (has no arguments) and we aren't to add a # semicolon - $flags .= 'U' if $flags =~ /n/ && $flags !~ /[Us]/; + $flags .= 'U' if $flags =~ /n/ && $flags !~ /[U;]/; # Keep track of all the pod files that we refer to. push $described_elsewhere{$podname}->@*, $podname; @@ -1313,7 +1321,9 @@ sub docout ($$$) { # output the docs for if ( ($item_flags =~ /p/ && $item_flags =~ /o/ && $item_flags !~ /M/) # Can't handle threaded varargs - || ($item_flags =~ /f/ && $item_flags !~ /T/)) + || ( $item_flags =~ /f/ + && $item_flags !~ /T/ + && $item_name !~ /strftime/)) { $item->{name} = "Perl_$item_name"; print $fh <<~"EOT"; @@ -1328,8 +1338,8 @@ sub docout ($$$) { # output the docs for if ($flags =~ /[Uy]/) { # no usage; typedefs are considered simple enough # to never warrant a usage line - warn("U and s flags are incompatible") - if $flags =~ /U/ && $flags =~ /s/; + warn("U and ; flags are incompatible") + if $flags =~ /U/ && $flags =~ /;/; # nothing } else { @@ -1361,11 +1371,12 @@ sub docout ($$$) { # output the docs for my @base_args = $items[0]->{args}->@*; my $base_thread_context = $items[0]->{flags} =~ /T/; for (my $i = 1; $i < @items; $i++) { - no warnings 'experimental::smartmatch'; my $item = $items[$i]; + my $args_are_equal = $item->{args}->@* == @base_args + && !grep $item->{args}[$_] ne $base_args[$_], keys @base_args; $need_individual_usage = 1 if $item->{ret_type} ne $base_ret_type - || ! ($item->{args}->@* ~~ @base_args) + || ! $args_are_equal || ( $item->{flags} =~ /T/ != $base_thread_context); my $ret_length = length $item->{ret_type}; @@ -1492,7 +1503,7 @@ sub docout ($$$) { # output the docs for print $fh ")"; } - print $fh ";" if $item_flags =~ /s/; # semicolon: "dTHR;" + print $fh ";" if $item_flags =~ /;/; # semicolon: "dTHR;" print $fh "\n"; # Only the first entry is normally displayed @@ -1508,44 +1519,14 @@ sub docout ($$$) { # output the docs for } sub construct_missings_section { - my ($pod_name, $missings_ref) = @_; + my ($missings_hdr, $missings_ref) = @_; my $text = ""; - return $text unless $missings_ref->@*; - - $text .= <<~EOT; + $text .= "$missings_hdr\n" . format_pod_indexes($missings_ref); - =head1 $undocumented_scn - - EOT - if ($pod_name eq 'perlapi') { - $text .= <<~'EOT'; - The following functions have been flagged as part of the public - API, but are currently undocumented. Use them at your own risk, - as the interfaces are subject to change. Functions that are not - listed in this document are not intended for public use, and - should NOT be used under any circumstances. - - If you feel you need to use one of these functions, first send - email to L. - It may be that there is a good reason for the function not being - documented, and it should be removed from this list; or it may - just be that no one has gotten around to documenting it. In the - latter case, you will be asked to submit a patch to document the - function. Once your patch is accepted, it will indicate that the - interface is stable (unless it is explicitly marked otherwise) and - usable by you. - EOT + if ($missings_ref->@* == 0) { + return $text . "\nThere are currently no items of this type\n"; } - else { - $text .= <<~'EOT'; - The following functions are currently undocumented. If you use - one of them, you may wish to consider creating and submitting - documentation for it. - EOT - } - - $text .= "\n" . format_pod_indexes($missings_ref); # Sort the elements. my @missings = sort dictionary_order $missings_ref->@*; @@ -1654,19 +1635,74 @@ sub construct_missings_section { } sub dictionary_order { - # Do a case-insensitive dictionary sort, with only alphabetics - # significant, falling back to using everything for determinancy - return (uc($a =~ s/[[:^alpha:]]//r) cmp uc($b =~ s/[[:^alpha:]]//r)) - || uc($a) cmp uc($b) - || $a cmp $b; + # Do a case-insensitive dictionary sort, falling back in stages to using + # everything for determinancy. The initial comparison ignores + # all non-word characters and non-trailing underscores and digits, with + # trailing ones collating to after any other characters. This collation + # order continues in case tie breakers are needed; sequences of digits + # that do get looked at always compare numerically. The first tie + # breaker takes all digits and underscores into account. The next tie + # breaker uses a caseless character-by-character comparison of everything + # (including non-word characters). Finally is a cased comparison. + # + # This gives intuitive results, but obviously could be tweaked. + + no warnings 'non_unicode'; + + local $a = $a; + local $b = $b; + + # Convert all digit sequences to same length with leading zeros, so for + # example, 8 will compare less than 16 (using a fill length value that + # should be longer than any sequence in the input). + $a =~ s/(\d+)/sprintf "%06d", $1/ge; + $b =~ s/(\d+)/sprintf "%06d", $1/ge; + + # Translate any underscores and digits so they compare after all Unicode + # characters + $a =~ tr[_0-9]/\x{110000}-\x{11000A}/; + $b =~ tr[_0-9]/\x{110000}-\x{11000A}/; + + use feature 'state'; + # Modify \w, \W to reflect the changes. + state $ud = '\x{110000}-\x{11000A}'; # xlated underscore, digits + state $w = "\\w$ud"; # new \w string + state $mod_w = qr/[$w]/; + state $mod_W = qr/[^$w]/; + + # Only \w for initial comparison + my $a_only_word = uc($a =~ s/$mod_W//gr); + my $b_only_word = uc($b =~ s/$mod_W//gr); + + # And not initial nor interior underscores nor digits (by squeezing them + # out) + my $a_stripped = $a_only_word =~ s/ (*atomic:[$ud]+) (*pla: $mod_w ) //grxx; + my $b_stripped = $b_only_word =~ s/ (*atomic:[$ud]+) (*pla: $mod_w ) //grxx; + + # If the stripped versions differ, use that as the comparison. + my $cmp = $a_stripped cmp $b_stripped; + return $cmp if $cmp; + + # For the first tie breaker, repeat, but consider initial and interior + # underscores and digits, again having those compare after all Unicode + # characters + $cmp = $a_only_word cmp $b_only_word; + return $cmp if $cmp; + + # Next tie breaker is just a caseless comparison + $cmp = uc($a) cmp uc($b); + return $cmp if $cmp; + + # Finally a straight comparison + return $a cmp $b; } sub output { - my ($podname, $header, $dochash, $missings_ref, $footer) = @_; + my ($podname, $header, $dochash, $footer, @missings_refs) = @_; # # strip leading '|' from each line which had been used to hide # pod from pod checkers. - s/^\|//gm for $header, $footer; + s/^\|//gm for $header, $footer, @missings_refs; my $fh = open_new("pod/$podname.pod", undef, {by => "$0 extracting documentation", @@ -1685,6 +1721,12 @@ sub output { print $fh "\n=head1 $section_name\n"; + if ($section_info->{X_tags}) { + print $fh "X<$_>" for sort keys $section_info->{X_tags}->%*; + print $fh "\n"; + delete $section_info->{X_tags}; + } + if ($podname eq 'perlapi') { print $fh "\n", $valid_sections{$section_name}{header}, "\n" if defined $valid_sections{$section_name}{header}; @@ -1703,7 +1745,9 @@ sub output { } } else { - print $fh "\nThere are only public API items currently in $section_name\n"; + my $pod_type = ($podname eq 'api') ? "public" : "internal"; + print $fh "\nThere are currently no $pod_type API items in ", + $section_name, "\n"; } print $fh "\n", $valid_sections{$section_name}{footer}, "\n" @@ -1711,7 +1755,23 @@ sub output { && defined $valid_sections{$section_name}{footer}; } - print $fh construct_missings_section($podname, $missings_ref); + + my $first_time = 1; + while (1) { + my $missings_hdr = shift @missings_refs or last; + my $missings_ref = shift @missings_refs or die "Foo"; + + if ($first_time) { + $first_time = 0; + print $fh <<~EOT; + + =head1 $undocumented_scn + + EOT + } + + print $fh construct_missings_section($missings_hdr, $missings_ref); + } print $fh "\n$footer\n=cut\n"; @@ -1719,14 +1779,16 @@ sub output { } foreach (@{(setup_embed())[0]}) { - next if @$_ < 2; - my ($flags, $ret_type, $func, @args) = @$_; - s/\b(?:NN|NULLOK)\b\s+//g for @args; + my $embed= $_->{embed} + or next; + my ($flags, $ret_type, $func, $args) = @{$embed}{qw(flags return_type name args)}; + my @munged_args= @$args; + s/\b(?:NN|NULLOK)\b\s+//g for @munged_args; $funcflags{$func} = { flags => $flags, ret_type => $ret_type, - args => \@args, + args => \@munged_args, }; } @@ -1761,11 +1823,27 @@ foreach (sort keys %missing) { # List of funcs in the public API that aren't also marked as core-only, # experimental nor deprecated. -my @missing_api = grep $funcflags{$_}{flags} =~ /A/ - && $funcflags{$_}{flags} !~ /[xD]/ - && !$docs{api}{$_}, keys %funcflags; + +my @undocumented_api = grep { $funcflags{$_}{flags} =~ /A/ + && ! $docs{api}{$_} + } keys %funcflags; +my @undocumented_intern = grep { $funcflags{$_}{flags} !~ /[AS]/ + && ! $docs{intern}{$_} + } keys %funcflags; +my @undocumented_deprecated_api = grep { $funcflags{$_}{flags} =~ /D/ } + @undocumented_api; +my @undocumented_deprecated_intern = grep { $funcflags{$_}{flags} =~ /D/ } + @undocumented_intern; +my @undocumented_experimental_api = grep { $funcflags{$_}{flags} =~ /x/ } + @undocumented_api; +my @undocumented_experimental_intern = grep { $funcflags{$_}{flags} =~ /x/ } + @undocumented_intern; +my @missing_api = grep { $funcflags{$_}{flags} !~ /[xD]/ } @undocumented_api; push @missing_api, keys %missing_macros; +my @missing_intern = grep { $funcflags{$_}{flags} !~ /[xD]/ } + @undocumented_intern; + my @other_places = ( qw(perlclib ), keys %described_elsewhere ); my $places_other_than_intern = join ", ", map { "L<$_>" } sort dictionary_order 'perlapi', @other_places; @@ -1785,7 +1863,9 @@ my $section_list = join "\n\n", map { "= sort(dictionary_order keys %valid_sections), $undocumented_scn; # Keep last -output('perlapi', <<"_EOB_", $docs{api}, \@missing_api, <<"_EOE_"); +# Leading '|' is to hide these lines from pod checkers. khw is unsure if this +# is still needed. +my $api_hdr = <<"_EOB_"; |=encoding UTF-8 | |=head1 NAME @@ -1826,7 +1906,7 @@ output('perlapi', <<"_EOB_", $docs{api}, | |Note that all Perl API global variables must be referenced with the C |prefix. Again, those not listed here are not to be used by extension writers, -|and can be changed or removed without notice; same with macros. +|and may be changed or removed without notice; same with macros. |Some macros are provided for compatibility with the older, |unadorned names, but this support may be disabled in a future release. | @@ -1870,6 +1950,8 @@ output('perlapi', <<"_EOB_", $docs{api}, | |The listing below is alphabetical, case insensitive. _EOB_ + +my $api_footer = <<"_EOE_"; |=head1 AUTHORS | |Until May 1997, this document was maintained by Jeff Okamoto @@ -1889,11 +1971,45 @@ _EOB_ |F, $places_other_than_api _EOE_ -# List of non-static internal functions -my @missing_guts = - grep $funcflags{$_}{flags} !~ /[AS]/ && !$docs{guts}{$_}, keys %funcflags; +my $api_missings_hdr = <<'_EOT_'; +|The following functions have been flagged as part of the public +|API, but are currently undocumented. Use them at your own risk, +|as the interfaces are subject to change. Functions that are not +|listed in this document are not intended for public use, and +|should NOT be used under any circumstances. +| +|If you feel you need to use one of these functions, first send +|email to L. +|It may be that there is a good reason for the function not being +|documented, and it should be removed from this list; or it may +|just be that no one has gotten around to documenting it. In the +|latter case, you will be asked to submit a patch to document the +|function. Once your patch is accepted, it will indicate that the +|interface is stable (unless it is explicitly marked otherwise) and +|usable by you. +_EOT_ + +my $api_experimental_hdr = <<"_EOT_"; +| +|Next are the API-flagged elements that are considered experimental. Using one +|of these is even more risky than plain undocumented ones. They are listed +|here because they should be listed somewhere (so their existence doesn't get +|lost) and this is the best place for them. +_EOT_ + +my $api_deprecated_hdr = <<"_EOT_"; +| +|Finally are deprecated undocumented API elements. +|Do not use any for new code; remove all occurrences of all of these from +|existing code. +_EOT_ + +output('perlapi', $api_hdr, $docs{api}, $api_footer, + $api_missings_hdr, \@missing_api, + $api_experimental_hdr, \@undocumented_experimental_api, + $api_deprecated_hdr, \@undocumented_deprecated_api); -output('perlintern', <<'_EOB_', $docs{guts}, \@missing_guts, <<"_EOE_"); +my $intern_hdr = <<"_EOB_"; |=head1 NAME | |perlintern - autogenerated documentation of purely B @@ -1910,6 +2026,8 @@ output('perlintern', <<'_EOB_', $docs{gu |It has the same sections as L, though some may be empty. | _EOB_ + +my $intern_footer = <<"_EOE_"; | |=head1 AUTHORS | @@ -1921,3 +2039,33 @@ _EOB_ | |F, $places_other_than_intern _EOE_ + +my $intern_missings_hdr = <<"_EOT_"; +| +|This section lists the elements that are otherwise undocumented. If you use +|any of them, please consider creating and submitting documentation for it. +| +|Experimental and deprecated undocumented elements are listed separately at the +|end. +| +_EOT_ + +my $intern_experimental_hdr = <<"_EOT_"; +| +|Next are the experimental undocumented elements +| +_EOT_ + +my $intern_deprecated_hdr = <<"_EOT_"; +| +|Finally are the deprecated undocumented elements. +|Do not use any for new code; remove all occurrences of all of these from +|existing code. +| +_EOT_ + +output('perlintern', $intern_hdr, $docs{intern}, $intern_footer, + $intern_missings_hdr, \@missing_intern, + $intern_experimental_hdr, \@undocumented_experimental_intern, + $intern_deprecated_hdr, \@undocumented_deprecated_intern + ); Index: gnu/usr.bin/perl/av.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/av.c,v diff -u -p -a -u -p -r1.21 av.c --- gnu/usr.bin/perl/av.c 3 Sep 2023 00:48:54 -0000 1.21 +++ gnu/usr.bin/perl/av.c 21 Feb 2024 15:47:00 -0000 @@ -193,7 +193,8 @@ Perl_av_extend_guts(pTHX_ AV *av, SSize_ PL_stack_max = PL_stack_base + newmax; } } else { /* there is no SV* array yet */ - *maxp = key < 3 ? 3 : key; + *maxp = key < PERL_ARRAY_NEW_MIN_KEY ? + PERL_ARRAY_NEW_MIN_KEY : key; { /* see comment above about newmax+1*/ MEM_WRAP_CHECK_s(*maxp, SV*, @@ -302,11 +303,11 @@ Perl_av_fetch(pTHX_ AV *av, SSize_t key, if ((Size_t)key >= (Size_t)size) { if (UNLIKELY(neg)) return NULL; - goto emptyness; + goto emptiness; } if (!AvARRAY(av)[key]) { - emptyness: + emptiness: return lval ? av_store(av,key,newSV_type(SVt_NULL)) : NULL; } @@ -388,10 +389,47 @@ Perl_av_store(pTHX_ AV *av, SSize_t key, } else if (AvREAL(av)) SvREFCNT_dec(ary[key]); + + /* store the val into the AV before we call magic so that the magic can + * "see" the new value. Especially set magic on the AV itself. */ ary[key] = val; + if (SvSMAGICAL(av)) { const MAGIC *mg = SvMAGIC(av); bool set = TRUE; + /* We have to increment the refcount on val before we call any magic, + * as it is now stored in the AV (just before this block), we will + * then call the magic handlers which might die/Perl_croak, and + * longjmp up the stack to the most recent exception trap. Which means + * the caller code that would be expected to handle the refcount + * increment likely would never be executed, leading to a double free. + * This can happen in a case like + * + * @ary = (1); + * + * or this: + * + * if (av_store(av,n,sv)) SvREFCNT_inc(sv); + * + * where @ary/av has set magic applied to it which can die. In the + * first case the sv representing 1 would be mortalized, so when the + * set magic threw an exception it would be freed as part of the + * normal stack unwind. However this leaves the av structure still + * holding a valid visible pointer to the now freed value. In practice + * the next SV created will reuse the same reference, but without the + * refcount to account for the previous ownership and we end up with + * warnings about a totally different variable being double freed in + * the form of "attempt to free unreferenced variable" + * warnings/errors. + * + * https://github.com/Perl/perl5/issues/20675 + * + * Arguably the API for av_store is broken in the face of magic. Instead + * av_store should be responsible for the refcount increment, and only + * not do it when specifically told to do so (eg, when storing an + * otherwise unreferenced scalar into an AV). + */ + SvREFCNT_inc(val); /* see comment above */ for (; mg; mg = mg->mg_moremagic) { if (!isUPPER(mg->mg_type)) continue; if (val) { @@ -404,53 +442,15 @@ Perl_av_store(pTHX_ AV *av, SSize_t key, } if (set) mg_set(MUTABLE_SV(av)); + /* And now we are done the magic, we have to decrement it back as the av_store() api + * says the caller is responsible for the refcount increment, assuming + * av_store returns true. */ + SvREFCNT_dec(val); } return &ary[key]; } /* -=for apidoc av_new_alloc - -This implements L> -and L>, which are the public API for this -functionality. - -Creates a new AV and allocates its SV* array. - -This is similar to, but more efficient than doing: - - AV *av = newAV(); - av_extend(av, key); - -The size parameter is used to pre-allocate a SV* array large enough to -hold at least elements C<0..(size-1)>. C must be at least 1. - -The C parameter controls whether or not the array is NULL -initialized. - -=cut -*/ - -AV * -Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag) -{ - AV * const av = newAV(); - SV** ary; - PERL_ARGS_ASSERT_AV_NEW_ALLOC; - assert(size > 0); - - Newx(ary, size, SV*); /* Newx performs the memwrap check */ - AvALLOC(av) = ary; - AvARRAY(av) = ary; - AvMAX(av) = size - 1; - - if (zeroflag) - Zero(ary, size, SV*); - - return av; -} - -/* =for apidoc av_make Creates a new AV and populates it with a list (C<**strp>, length C) of @@ -508,6 +508,113 @@ Perl_av_make(pTHX_ SSize_t size, SV **st } /* +=for apidoc newAVav + +Creates a new AV and populates it with values copied from an existing AV. The +new AV will have a reference count of 1, and will contain newly created SVs +copied from the original SV. The original source will remain unchanged. + +Perl equivalent: C + +=cut +*/ + +AV * +Perl_newAVav(pTHX_ AV *oav) +{ + PERL_ARGS_ASSERT_NEWAVAV; + + Size_t count = av_count(oav); + + if(UNLIKELY(!oav) || count == 0) + return newAV(); + + AV *ret = newAV_alloc_x(count); + + /* avoid ret being leaked if croak when calling magic below */ + EXTEND_MORTAL(1); + PL_tmps_stack[++PL_tmps_ix] = (SV *)ret; + SSize_t ret_at_tmps_ix = PL_tmps_ix; + + Size_t i; + if(LIKELY(!SvRMAGICAL(oav) && AvREAL(oav) && (SvTYPE(oav) == SVt_PVAV))) { + for(i = 0; i < count; i++) { + SV **svp = av_fetch_simple(oav, i, 0); + av_push_simple(ret, svp ? newSVsv(*svp) : &PL_sv_undef); + } + } else { + for(i = 0; i < count; i++) { + SV **svp = av_fetch(oav, i, 0); + av_push_simple(ret, svp ? newSVsv(*svp) : &PL_sv_undef); + } + } + + /* disarm leak guard */ + if(LIKELY(PL_tmps_ix == ret_at_tmps_ix)) + PL_tmps_ix--; + else + PL_tmps_stack[ret_at_tmps_ix] = &PL_sv_undef; + + return ret; +} + +/* +=for apidoc newAVhv + +Creates a new AV and populates it with keys and values copied from an existing +HV. The new AV will have a reference count of 1, and will contain newly +created SVs copied from the original HV. The original source will remain +unchanged. + +Perl equivalent: C + +=cut +*/ + +AV * +Perl_newAVhv(pTHX_ HV *ohv) +{ + PERL_ARGS_ASSERT_NEWAVHV; + + if(UNLIKELY(!ohv)) + return newAV(); + + bool tied = SvRMAGICAL(ohv) && mg_find(MUTABLE_SV(ohv), PERL_MAGIC_tied); + + Size_t nkeys = hv_iterinit(ohv); + /* This number isn't perfect but it doesn't matter; it only has to be + * close to make the initial allocation about the right size + */ + AV *ret = newAV_alloc_xz(nkeys ? nkeys * 2 : 2); + + /* avoid ret being leaked if croak when calling magic below */ + EXTEND_MORTAL(1); + PL_tmps_stack[++PL_tmps_ix] = (SV *)ret; + SSize_t ret_at_tmps_ix = PL_tmps_ix; + + + HE *he; + while((he = hv_iternext(ohv))) { + if(tied) { + av_push_simple(ret, newSVsv(hv_iterkeysv(he))); + av_push_simple(ret, newSVsv(hv_iterval(ohv, he))); + } + else { + av_push_simple(ret, newSVhek(HeKEY_hek(he))); + av_push_simple(ret, HeVAL(he) ? newSVsv(HeVAL(he)) : &PL_sv_undef); + } + } + + /* disarm leak guard */ + if(LIKELY(PL_tmps_ix == ret_at_tmps_ix)) + PL_tmps_ix--; + else + PL_tmps_stack[ret_at_tmps_ix] = &PL_sv_undef; + + return ret; +} + +/* =for apidoc av_clear Frees all the elements of an array, leaving it empty. @@ -605,7 +712,7 @@ void Perl_av_undef(pTHX_ AV *av) { bool real; - SSize_t orig_ix = PL_tmps_ix; /* silence bogus warning about possible unitialized use */ + SSize_t orig_ix = PL_tmps_ix; /* silence bogus warning about possible uninitialized use */ PERL_ARGS_ASSERT_AV_UNDEF; assert(SvTYPE(av) == SVt_PVAV); Index: gnu/usr.bin/perl/builtin.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/builtin.c,v diff -u -p -a -u -p -r1.1.1.1 builtin.c --- gnu/usr.bin/perl/builtin.c 15 Feb 2023 01:32:00 -0000 1.1.1.1 +++ gnu/usr.bin/perl/builtin.c 21 Feb 2024 15:47:00 -0000 @@ -32,6 +32,38 @@ static void S_warn_experimental_builtin( prefix ? "builtin::" : "", name); } +/* These three utilities might want to live elsewhere to be reused from other + * code sometime + */ +#define prepare_export_lexical() S_prepare_export_lexical(aTHX) +static void S_prepare_export_lexical(pTHX) +{ + assert(PL_compcv); + + /* We need to have PL_comppad / PL_curpad set correctly for lexical importing */ + ENTER; + SAVESPTR(PL_comppad_name); PL_comppad_name = PadlistNAMES(CvPADLIST(PL_compcv)); + SAVESPTR(PL_comppad); PL_comppad = PadlistARRAY(CvPADLIST(PL_compcv))[1]; + SAVESPTR(PL_curpad); PL_curpad = PadARRAY(PL_comppad); +} + +#define export_lexical(name, sv) S_export_lexical(aTHX_ name, sv) +static void S_export_lexical(pTHX_ SV *name, SV *sv) +{ + PADOFFSET off = pad_add_name_sv(name, padadd_STATE, 0, 0); + SvREFCNT_dec(PL_curpad[off]); + PL_curpad[off] = SvREFCNT_inc(sv); +} + +#define finish_export_lexical() S_finish_export_lexical(aTHX) +static void S_finish_export_lexical(pTHX) +{ + intro_my(); + + LEAVE; +} + + XS(XS_builtin_true); XS(XS_builtin_true) { @@ -125,6 +157,10 @@ XS(XS_builtin_func1_scalar) Perl_pp_floor(aTHX); break; + case OP_IS_TAINTED: + Perl_pp_is_tainted(aTHX); + break; + default: Perl_die(aTHX_ "panic: unhandled opcode %" IVdf " for xs_builtin_func1_scalar()", (IV) ix); @@ -227,6 +263,79 @@ XS(XS_builtin_trim) XSRETURN(1); } +XS(XS_builtin_export_lexically); +XS(XS_builtin_export_lexically) +{ + dXSARGS; + + warn_experimental_builtin("export_lexically", true); + + if(!PL_compcv) + Perl_croak(aTHX_ + "export_lexically can only be called at compile time"); + + if(items % 2) + Perl_croak(aTHX_ "Odd number of elements in export_lexically"); + + for(int i = 0; i < items; i += 2) { + SV *name = ST(i); + SV *ref = ST(i+1); + + if(!SvROK(ref)) + /* diag_listed_as: Expected %s reference in export_lexically */ + Perl_croak(aTHX_ "Expected a reference in export_lexically"); + + char sigil = SvPVX(name)[0]; + SV *rv = SvRV(ref); + + const char *bad = NULL; + switch(sigil) { + default: + /* overwrites the pointer on the stack; but this is fine, the + * caller's value isn't modified */ + ST(i) = name = sv_2mortal(Perl_newSVpvf(aTHX_ "&%" SVf, SVfARG(name))); + + /* FALLTHROUGH */ + case '&': + if(SvTYPE(rv) != SVt_PVCV) + bad = "a CODE"; + break; + + case '$': + /* Permit any of SVt_NULL to SVt_PVMG. Technically this also + * includes SVt_INVLIST but it isn't thought possible for pureperl + * code to ever manage to see one of those. */ + if(SvTYPE(rv) > SVt_PVMG) + bad = "a SCALAR"; + break; + + case '@': + if(SvTYPE(rv) != SVt_PVAV) + bad = "an ARRAY"; + break; + + case '%': + if(SvTYPE(rv) != SVt_PVHV) + bad = "a HASH"; + break; + } + + if(bad) + Perl_croak(aTHX_ "Expected %s reference in export_lexically", bad); + } + + prepare_export_lexical(); + + for(int i = 0; i < items; i += 2) { + SV *name = ST(i); + SV *ref = ST(i+1); + + export_lexical(name, SvRV(ref)); + } + + finish_export_lexical(); +} + XS(XS_builtin_func1_void); XS(XS_builtin_func1_void) { @@ -380,22 +489,24 @@ static const struct BuiltinFuncDescripto { "builtin::false", &XS_builtin_false, &ck_builtin_const, BUILTIN_CONST_FALSE }, /* unary functions */ - { "builtin::is_bool", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_IS_BOOL }, - { "builtin::weaken", &XS_builtin_func1_void, &ck_builtin_func1, OP_WEAKEN }, - { "builtin::unweaken", &XS_builtin_func1_void, &ck_builtin_func1, OP_UNWEAKEN }, - { "builtin::is_weak", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_IS_WEAK }, - { "builtin::blessed", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_BLESSED }, - { "builtin::refaddr", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_REFADDR }, - { "builtin::reftype", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_REFTYPE }, - { "builtin::ceil", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_CEIL }, - { "builtin::floor", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_FLOOR }, - { "builtin::trim", &XS_builtin_trim, NULL, 0 }, + { "builtin::is_bool", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_IS_BOOL }, + { "builtin::weaken", &XS_builtin_func1_void, &ck_builtin_func1, OP_WEAKEN }, + { "builtin::unweaken", &XS_builtin_func1_void, &ck_builtin_func1, OP_UNWEAKEN }, + { "builtin::is_weak", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_IS_WEAK }, + { "builtin::blessed", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_BLESSED }, + { "builtin::refaddr", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_REFADDR }, + { "builtin::reftype", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_REFTYPE }, + { "builtin::ceil", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_CEIL }, + { "builtin::floor", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_FLOOR }, + { "builtin::is_tainted", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_IS_TAINTED }, + { "builtin::trim", &XS_builtin_trim, &ck_builtin_func1, 0 }, { "builtin::created_as_string", &XS_builtin_created_as_string, &ck_builtin_func1, 0 }, { "builtin::created_as_number", &XS_builtin_created_as_number, &ck_builtin_func1, 0 }, /* list functions */ { "builtin::indexed", &XS_builtin_indexed, &ck_builtin_funcN, 0 }, + { "builtin::export_lexically", &XS_builtin_export_lexically, NULL, 0 }, { 0 } }; @@ -408,11 +519,7 @@ XS(XS_builtin_import) Perl_croak(aTHX_ "builtin::import can only be called at compile time"); - /* We need to have PL_comppad / PL_curpad set correctly for lexical importing */ - ENTER; - SAVESPTR(PL_comppad_name); PL_comppad_name = PadlistNAMES(CvPADLIST(PL_compcv)); - SAVESPTR(PL_comppad); PL_comppad = PadlistARRAY(CvPADLIST(PL_compcv))[1]; - SAVESPTR(PL_curpad); PL_curpad = PadARRAY(PL_comppad); + prepare_export_lexical(); for(int i = 1; i < items; i++) { SV *sym = ST(i); @@ -420,20 +527,16 @@ XS(XS_builtin_import) Perl_croak(aTHX_ builtin_not_recognised, sym); SV *ampname = sv_2mortal(Perl_newSVpvf(aTHX_ "&%" SVf, SVfARG(sym))); - SV *fqname = sv_2mortal(Perl_newSVpvf(aTHX_ "builtin::%" SVf, SVfARG(sym))); + SV *fqname = sv_2mortal(Perl_newSVpvf(aTHX_ "builtin::%" SVf, SVfARG(sym))); CV *cv = get_cv(SvPV_nolen(fqname), SvUTF8(fqname) ? SVf_UTF8 : 0); if(!cv) Perl_croak(aTHX_ builtin_not_recognised, sym); - PADOFFSET off = pad_add_name_sv(ampname, padadd_STATE, 0, 0); - SvREFCNT_dec(PL_curpad[off]); - PL_curpad[off] = SvREFCNT_inc(cv); + export_lexical(ampname, (SV *)cv); } - intro_my(); - - LEAVE; + finish_export_lexical(); } void Index: gnu/usr.bin/perl/caretx.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/caretx.c,v diff -u -p -a -u -p -r1.6 caretx.c --- gnu/usr.bin/perl/caretx.c 15 Feb 2023 01:36:12 -0000 1.6 +++ gnu/usr.bin/perl/caretx.c 21 Feb 2024 15:47:00 -0000 @@ -121,7 +121,7 @@ Perl_set_caret_X(pTHX) { returning the text "unknown" from the readlink rather than the path to the executable (or returning an error from the readlink). Any valid path has a '/' in it somewhere, so use that to validate the - result. See http://www.freebsd.org/cgi/query-pr.cgi?pr=35703 + result. See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=35703 */ if (len > 0 && memchr(buf, '/', len)) { sv_setpvn(caret_x, buf, len); Index: gnu/usr.bin/perl/cflags.SH =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cflags.SH,v diff -u -p -a -u -p -r1.19 cflags.SH --- gnu/usr.bin/perl/cflags.SH 15 Feb 2023 01:36:12 -0000 1.19 +++ gnu/usr.bin/perl/cflags.SH 21 Feb 2024 15:47:00 -0000 @@ -379,6 +379,19 @@ esac ;; esac +# gcc version 12 and 13 are overly aggressive with use-after-free warnings +# and have false positives on code that shouldn't warn, and they haven't +# sorted it out yet. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108115 +case "$gccversion" in +"1"[23]*) + for f in -Wno-use-after-free + do + echo "cflags.SH: Adding $f because of false positives in gccversion '$gccversion'" + warn="$warn $f" + done +;; +esac + echo "cflags.SH: cc = $cc" echo "cflags.SH: ccflags = $ccflags" echo "cflags.SH: stdflags = $stdflags" Index: gnu/usr.bin/perl/charclass_invlists.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/charclass_invlists.h,v diff -u -p -a -u -p -r1.6 charclass_invlists.h --- gnu/usr.bin/perl/charclass_invlists.h 15 Feb 2023 01:36:12 -0000 1.6 +++ gnu/usr.bin/perl/charclass_invlists.h 21 Feb 2024 15:47:00 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! * This file is built by regen/mk_invlists.pl from Unicode::UCD. * Any changes made here will be lost! @@ -15,10 +15,10 @@ * encompassing all of the Unicode BMP, and thus including all the economically * important world scripts. At 12 most of them are: including Arabic, * Cyrillic, Greek, Hebrew, Indian subcontinent, Latin, and Thai; but not Han, - * Japanese, nor Korean. (The regarglen structure in regnodes.h is a U8, and - * the trie types TRIEC and AHOCORASICKC are larger than U8 for shift values - * above 12.) Be sure to benchmark before changing, as larger sizes do - * significantly slow down the test suite */ + * Japanese, nor Korean. The regnode sizing data structure in regnodes.h currently + * uses a U8, and the trie types TRIEC and AHOCORASICKC are larger than U8 for + * shift values above 12.) Be sure to benchmark before changing, as larger sizes + * do significantly slow down the test suite. */ #define NUM_ANYOF_CODE_POINTS (1 << 8) @@ -18460,7 +18460,7 @@ static const I32 Lowercase_Mapping_invma #if (defined(PERL_IN_REGCOMP_C) && ! defined(PERL_IN_XSUB_RE)) static const UV _Perl_CCC_non0_non230_invlist[] = { /* for all charsets */ - 373, /* Number of elements */ + 379, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -18749,6 +18749,8 @@ static const UV _Perl_CCC_non0_non230_in 0x10A40, 0x10AE6, 0x10AE7, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F48, 0x10F4B, @@ -18819,6 +18821,8 @@ static const UV _Perl_CCC_non0_non230_in 0x11D46, 0x11D97, 0x11D98, + 0x11F41, + 0x11F43, 0x16AF0, 0x16AF5, 0x16FF0, @@ -18833,6 +18837,8 @@ static const UV _Perl_CCC_non0_non230_in 0x1D183, 0x1D18A, 0x1D18C, + 0x1E4EC, + 0x1E4EF, 0x1E8D0, 0x1E8D7, 0x1E94A, @@ -18842,7 +18848,7 @@ static const UV _Perl_CCC_non0_non230_in # if 'A' == 65 /* ASCII/Latin1 */ static const UV _Perl_GCB_invlist[] = { /* for ASCII/Latin1 */ - 1826, /* Number of elements */ + 1851, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -19063,6 +19069,8 @@ static const UV _Perl_GCB_invlist[] = { 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD02, 0xD04, @@ -19111,7 +19119,7 @@ static const UV _Perl_GCB_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -20314,6 +20322,8 @@ static const UV _Perl_GCB_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -20375,6 +20385,8 @@ static const UV _Perl_GCB_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -20538,8 +20550,23 @@ static const UV _Perl_GCB_invlist[] = { 0x11EF3, 0x11EF5, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F36, + 0x11F3B, + 0x11F3E, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -20599,12 +20626,16 @@ static const UV _Perl_GCB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -20923,6 +20954,8 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Other, GCB_Extend, GCB_Other, + GCB_SpacingMark, + GCB_Other, GCB_Extend, GCB_SpacingMark, GCB_Other, @@ -22178,6 +22211,8 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Other, GCB_Extend, GCB_Other, + GCB_Extend, + GCB_Other, GCB_SpacingMark, GCB_Extend, GCB_SpacingMark, @@ -22236,6 +22271,8 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Extend, GCB_Other, GCB_Extend, + GCB_Other, + GCB_Extend, GCB_SpacingMark, GCB_Extend, GCB_Other, @@ -22398,7 +22435,22 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Extend, GCB_SpacingMark, GCB_Other, + GCB_Extend, + GCB_Prepend, + GCB_SpacingMark, + GCB_Other, + GCB_SpacingMark, + GCB_Extend, + GCB_Other, + GCB_SpacingMark, + GCB_Extend, + GCB_SpacingMark, + GCB_Extend, + GCB_Other, GCB_Control, + GCB_Extend, + GCB_Other, + GCB_Extend, GCB_Other, GCB_Extend, GCB_Other, @@ -22469,6 +22521,10 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Other, GCB_Extend, GCB_Other, + GCB_Extend, + GCB_Other, + GCB_Extend, + GCB_Other, GCB_ExtPict_XX, GCB_Other, GCB_ExtPict_XX, @@ -22546,7 +22602,7 @@ static const GCB_enum _Perl_GCB_invmap[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV _Perl_GCB_invlist[] = { /* for EBCDIC 1047 */ - 1827, /* Number of elements */ + 1852, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -22768,6 +22824,8 @@ static const UV _Perl_GCB_invlist[] = { 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD02, 0xD04, @@ -22816,7 +22874,7 @@ static const UV _Perl_GCB_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -24019,6 +24077,8 @@ static const UV _Perl_GCB_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -24080,6 +24140,8 @@ static const UV _Perl_GCB_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -24243,8 +24305,23 @@ static const UV _Perl_GCB_invlist[] = { 0x11EF3, 0x11EF5, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F36, + 0x11F3B, + 0x11F3E, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -24304,12 +24381,16 @@ static const UV _Perl_GCB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -24632,6 +24713,8 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Other, GCB_Extend, GCB_Other, + GCB_SpacingMark, + GCB_Other, GCB_Extend, GCB_SpacingMark, GCB_Other, @@ -25887,6 +25970,8 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Other, GCB_Extend, GCB_Other, + GCB_Extend, + GCB_Other, GCB_SpacingMark, GCB_Extend, GCB_SpacingMark, @@ -25945,6 +26030,8 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Extend, GCB_Other, GCB_Extend, + GCB_Other, + GCB_Extend, GCB_SpacingMark, GCB_Extend, GCB_Other, @@ -26107,7 +26194,22 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Extend, GCB_SpacingMark, GCB_Other, + GCB_Extend, + GCB_Prepend, + GCB_SpacingMark, + GCB_Other, + GCB_SpacingMark, + GCB_Extend, + GCB_Other, + GCB_SpacingMark, + GCB_Extend, + GCB_SpacingMark, + GCB_Extend, + GCB_Other, GCB_Control, + GCB_Extend, + GCB_Other, + GCB_Extend, GCB_Other, GCB_Extend, GCB_Other, @@ -26178,6 +26280,10 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Other, GCB_Extend, GCB_Other, + GCB_Extend, + GCB_Other, + GCB_Extend, + GCB_Other, GCB_ExtPict_XX, GCB_Other, GCB_ExtPict_XX, @@ -26255,7 +26361,7 @@ static const GCB_enum _Perl_GCB_invmap[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV _Perl_GCB_invlist[] = { /* for EBCDIC 037 */ - 1827, /* Number of elements */ + 1852, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -26477,6 +26583,8 @@ static const UV _Perl_GCB_invlist[] = { 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD02, 0xD04, @@ -26525,7 +26633,7 @@ static const UV _Perl_GCB_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -27728,6 +27836,8 @@ static const UV _Perl_GCB_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -27789,6 +27899,8 @@ static const UV _Perl_GCB_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -27952,8 +28064,23 @@ static const UV _Perl_GCB_invlist[] = { 0x11EF3, 0x11EF5, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F36, + 0x11F3B, + 0x11F3E, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -28013,12 +28140,16 @@ static const UV _Perl_GCB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -28341,6 +28472,8 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Other, GCB_Extend, GCB_Other, + GCB_SpacingMark, + GCB_Other, GCB_Extend, GCB_SpacingMark, GCB_Other, @@ -29596,6 +29729,8 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Other, GCB_Extend, GCB_Other, + GCB_Extend, + GCB_Other, GCB_SpacingMark, GCB_Extend, GCB_SpacingMark, @@ -29654,6 +29789,8 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Extend, GCB_Other, GCB_Extend, + GCB_Other, + GCB_Extend, GCB_SpacingMark, GCB_Extend, GCB_Other, @@ -29816,7 +29953,22 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Extend, GCB_SpacingMark, GCB_Other, + GCB_Extend, + GCB_Prepend, + GCB_SpacingMark, + GCB_Other, + GCB_SpacingMark, + GCB_Extend, + GCB_Other, + GCB_SpacingMark, + GCB_Extend, + GCB_SpacingMark, + GCB_Extend, + GCB_Other, GCB_Control, + GCB_Extend, + GCB_Other, + GCB_Extend, GCB_Other, GCB_Extend, GCB_Other, @@ -29887,6 +30039,10 @@ static const GCB_enum _Perl_GCB_invmap[] GCB_Other, GCB_Extend, GCB_Other, + GCB_Extend, + GCB_Other, + GCB_Extend, + GCB_Other, GCB_ExtPict_XX, GCB_Other, GCB_ExtPict_XX, @@ -38855,7 +39011,7 @@ static const I32 _Perl_IVCF_invmap[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV _Perl_LB_invlist[] = { /* for ASCII/Latin1 */ - 2501, /* Number of elements */ + 2539, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -39143,6 +39299,8 @@ static const UV _Perl_LB_invlist[] = { 0xCE4, 0xCE6, 0xCF0, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -39191,7 +39349,7 @@ static const UV _Perl_LB_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xF01, @@ -39380,6 +39538,10 @@ static const UV _Perl_LB_invlist[] = { 0x1CF7, 0x1CFA, 0x1DC0, + 0x1DCD, + 0x1DCE, + 0x1DFC, + 0x1DFD, 0x1E00, 0x1FFD, 0x1FFE, @@ -40820,6 +40982,8 @@ static const UV _Perl_LB_invlist[] = { 0x10EAB, 0x10EAD, 0x10EAE, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -40879,6 +41043,8 @@ static const UV _Perl_LB_invlist[] = { 0x1123D, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112A9, 0x112AA, 0x112DF, @@ -40989,6 +41155,8 @@ static const UV _Perl_LB_invlist[] = { 0x11A9E, 0x11AA1, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C2F, 0x11C37, 0x11C38, @@ -41026,6 +41194,17 @@ static const UV _Perl_LB_invlist[] = { 0x11DAA, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F45, + 0x11F50, + 0x11F5A, 0x11FDD, 0x11FE1, 0x11FFF, @@ -41049,6 +41228,14 @@ static const UV _Perl_LB_invlist[] = { 0x13437, 0x13438, 0x13439, + 0x1343C, + 0x1343D, + 0x1343E, + 0x1343F, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x145CE, 0x145CF, 0x145D0, @@ -41089,8 +41276,12 @@ static const UV _Perl_LB_invlist[] = { 0x18D09, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -41139,6 +41330,8 @@ static const UV _Perl_LB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E140, @@ -41150,6 +41343,9 @@ static const UV _Perl_LB_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -41272,15 +41468,17 @@ static const UV _Perl_LB_invlist[] = { 0x1F6CC, 0x1F6CD, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, 0x1F774, + 0x1F777, + 0x1F77B, 0x1F780, 0x1F7D5, - 0x1F7D9, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -41327,24 +41525,20 @@ static const UV _Perl_LB_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC3, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FBF0, 0x1FBFA, @@ -41714,6 +41908,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, LB_Numeric, LB_Alphabetic, LB_Postfix_Numeric, @@ -41937,6 +42133,10 @@ static const LB_enum _Perl_LB_invmap[] = LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, + LB_Glue, + LB_Combining_Mark, + LB_Glue, + LB_Combining_Mark, LB_Alphabetic, LB_Break_Before, LB_Alphabetic, @@ -41975,7 +42175,7 @@ static const LB_enum _Perl_LB_invmap[] = LB_Nonstarter, LB_Alphabetic, LB_Break_After, - LB_Alphabetic, + LB_Postfix_Numeric, LB_Break_After, LB_Alphabetic, LB_Break_After, @@ -43384,6 +43584,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, LB_Break_After, LB_Alphabetic, LB_Numeric, @@ -43436,6 +43638,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, LB_Break_After, LB_Alphabetic, LB_Combining_Mark, @@ -43546,6 +43750,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Break_Before, LB_Break_After, LB_Alphabetic, + LB_Break_Before, + LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, @@ -43583,6 +43789,17 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, + LB_Break_After, + LB_Ideographic, + LB_Numeric, + LB_Alphabetic, LB_Postfix_Numeric, LB_Alphabetic, LB_Break_After, @@ -43605,6 +43822,14 @@ static const LB_enum _Perl_LB_invmap[] = LB_Glue, LB_Open_Punctuation, LB_Close_Punctuation, + LB_Glue, + LB_Open_Punctuation, + LB_Close_Punctuation, + LB_Open_Punctuation, + LB_Close_Punctuation, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, LB_Alphabetic, LB_Open_Punctuation, LB_Close_Punctuation, @@ -43650,6 +43875,10 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Nonstarter, LB_Alphabetic, + LB_Nonstarter, + LB_Alphabetic, + LB_Nonstarter, + LB_Alphabetic, LB_Ideographic, LB_Alphabetic, LB_Combining_Mark, @@ -43698,6 +43927,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, LB_Numeric, LB_Alphabetic, LB_Combining_Mark, @@ -43708,6 +43939,9 @@ static const LB_enum _Perl_LB_invmap[] = LB_Prefix_Numeric, LB_Alphabetic, LB_Combining_Mark, + LB_Numeric, + LB_Alphabetic, + LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, @@ -43834,7 +44068,9 @@ static const LB_enum _Perl_LB_invmap[] = LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, LB_Alphabetic, + LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, + LB_Ideographic, LB_Alphabetic, LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, @@ -43890,10 +44126,6 @@ static const LB_enum _Perl_LB_invmap[] = LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, LB_Ideographic, - LB_Unassigned_Extended_Pictographic_Ideographic, - LB_Ideographic, - LB_Unassigned_Extended_Pictographic_Ideographic, - LB_Ideographic, LB_E_Base, LB_Unassigned_Extended_Pictographic_Ideographic, LB_Ideographic, @@ -43931,7 +44163,7 @@ static const LB_enum _Perl_LB_invmap[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV _Perl_LB_invlist[] = { /* for EBCDIC 1047 */ - 2513, /* Number of elements */ + 2551, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -44231,6 +44463,8 @@ static const UV _Perl_LB_invlist[] = { 0xCE4, 0xCE6, 0xCF0, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -44279,7 +44513,7 @@ static const UV _Perl_LB_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xF01, @@ -44468,6 +44702,10 @@ static const UV _Perl_LB_invlist[] = { 0x1CF7, 0x1CFA, 0x1DC0, + 0x1DCD, + 0x1DCE, + 0x1DFC, + 0x1DFD, 0x1E00, 0x1FFD, 0x1FFE, @@ -45908,6 +46146,8 @@ static const UV _Perl_LB_invlist[] = { 0x10EAB, 0x10EAD, 0x10EAE, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -45967,6 +46207,8 @@ static const UV _Perl_LB_invlist[] = { 0x1123D, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112A9, 0x112AA, 0x112DF, @@ -46077,6 +46319,8 @@ static const UV _Perl_LB_invlist[] = { 0x11A9E, 0x11AA1, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C2F, 0x11C37, 0x11C38, @@ -46114,6 +46358,17 @@ static const UV _Perl_LB_invlist[] = { 0x11DAA, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F45, + 0x11F50, + 0x11F5A, 0x11FDD, 0x11FE1, 0x11FFF, @@ -46137,6 +46392,14 @@ static const UV _Perl_LB_invlist[] = { 0x13437, 0x13438, 0x13439, + 0x1343C, + 0x1343D, + 0x1343E, + 0x1343F, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x145CE, 0x145CF, 0x145D0, @@ -46177,8 +46440,12 @@ static const UV _Perl_LB_invlist[] = { 0x18D09, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -46227,6 +46494,8 @@ static const UV _Perl_LB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E140, @@ -46238,6 +46507,9 @@ static const UV _Perl_LB_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -46360,15 +46632,17 @@ static const UV _Perl_LB_invlist[] = { 0x1F6CC, 0x1F6CD, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, 0x1F774, + 0x1F777, + 0x1F77B, 0x1F780, 0x1F7D5, - 0x1F7D9, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -46415,24 +46689,20 @@ static const UV _Perl_LB_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC3, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FBF0, 0x1FBFA, @@ -46817,6 +47087,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, LB_Numeric, LB_Alphabetic, LB_Postfix_Numeric, @@ -47040,6 +47312,10 @@ static const LB_enum _Perl_LB_invmap[] = LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, + LB_Glue, + LB_Combining_Mark, + LB_Glue, + LB_Combining_Mark, LB_Alphabetic, LB_Break_Before, LB_Alphabetic, @@ -47078,7 +47354,7 @@ static const LB_enum _Perl_LB_invmap[] = LB_Nonstarter, LB_Alphabetic, LB_Break_After, - LB_Alphabetic, + LB_Postfix_Numeric, LB_Break_After, LB_Alphabetic, LB_Break_After, @@ -48487,6 +48763,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, LB_Break_After, LB_Alphabetic, LB_Numeric, @@ -48539,6 +48817,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, LB_Break_After, LB_Alphabetic, LB_Combining_Mark, @@ -48649,6 +48929,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Break_Before, LB_Break_After, LB_Alphabetic, + LB_Break_Before, + LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, @@ -48686,6 +48968,17 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, + LB_Break_After, + LB_Ideographic, + LB_Numeric, + LB_Alphabetic, LB_Postfix_Numeric, LB_Alphabetic, LB_Break_After, @@ -48708,6 +49001,14 @@ static const LB_enum _Perl_LB_invmap[] = LB_Glue, LB_Open_Punctuation, LB_Close_Punctuation, + LB_Glue, + LB_Open_Punctuation, + LB_Close_Punctuation, + LB_Open_Punctuation, + LB_Close_Punctuation, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, LB_Alphabetic, LB_Open_Punctuation, LB_Close_Punctuation, @@ -48753,6 +49054,10 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Nonstarter, LB_Alphabetic, + LB_Nonstarter, + LB_Alphabetic, + LB_Nonstarter, + LB_Alphabetic, LB_Ideographic, LB_Alphabetic, LB_Combining_Mark, @@ -48801,6 +49106,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, LB_Numeric, LB_Alphabetic, LB_Combining_Mark, @@ -48811,6 +49118,9 @@ static const LB_enum _Perl_LB_invmap[] = LB_Prefix_Numeric, LB_Alphabetic, LB_Combining_Mark, + LB_Numeric, + LB_Alphabetic, + LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, @@ -48937,7 +49247,9 @@ static const LB_enum _Perl_LB_invmap[] = LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, LB_Alphabetic, + LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, + LB_Ideographic, LB_Alphabetic, LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, @@ -48993,10 +49305,6 @@ static const LB_enum _Perl_LB_invmap[] = LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, LB_Ideographic, - LB_Unassigned_Extended_Pictographic_Ideographic, - LB_Ideographic, - LB_Unassigned_Extended_Pictographic_Ideographic, - LB_Ideographic, LB_E_Base, LB_Unassigned_Extended_Pictographic_Ideographic, LB_Ideographic, @@ -49034,7 +49342,7 @@ static const LB_enum _Perl_LB_invmap[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV _Perl_LB_invlist[] = { /* for EBCDIC 037 */ - 2513, /* Number of elements */ + 2551, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -49334,6 +49642,8 @@ static const UV _Perl_LB_invlist[] = { 0xCE4, 0xCE6, 0xCF0, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -49382,7 +49692,7 @@ static const UV _Perl_LB_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xF01, @@ -49571,6 +49881,10 @@ static const UV _Perl_LB_invlist[] = { 0x1CF7, 0x1CFA, 0x1DC0, + 0x1DCD, + 0x1DCE, + 0x1DFC, + 0x1DFD, 0x1E00, 0x1FFD, 0x1FFE, @@ -51011,6 +51325,8 @@ static const UV _Perl_LB_invlist[] = { 0x10EAB, 0x10EAD, 0x10EAE, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -51070,6 +51386,8 @@ static const UV _Perl_LB_invlist[] = { 0x1123D, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112A9, 0x112AA, 0x112DF, @@ -51180,6 +51498,8 @@ static const UV _Perl_LB_invlist[] = { 0x11A9E, 0x11AA1, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C2F, 0x11C37, 0x11C38, @@ -51217,6 +51537,17 @@ static const UV _Perl_LB_invlist[] = { 0x11DAA, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F45, + 0x11F50, + 0x11F5A, 0x11FDD, 0x11FE1, 0x11FFF, @@ -51240,6 +51571,14 @@ static const UV _Perl_LB_invlist[] = { 0x13437, 0x13438, 0x13439, + 0x1343C, + 0x1343D, + 0x1343E, + 0x1343F, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x145CE, 0x145CF, 0x145D0, @@ -51280,8 +51619,12 @@ static const UV _Perl_LB_invlist[] = { 0x18D09, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -51330,6 +51673,8 @@ static const UV _Perl_LB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E140, @@ -51341,6 +51686,9 @@ static const UV _Perl_LB_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -51463,15 +51811,17 @@ static const UV _Perl_LB_invlist[] = { 0x1F6CC, 0x1F6CD, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, 0x1F774, + 0x1F777, + 0x1F77B, 0x1F780, 0x1F7D5, - 0x1F7D9, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -51518,24 +51868,20 @@ static const UV _Perl_LB_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC3, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FBF0, 0x1FBFA, @@ -51920,6 +52266,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, LB_Numeric, LB_Alphabetic, LB_Postfix_Numeric, @@ -52143,6 +52491,10 @@ static const LB_enum _Perl_LB_invmap[] = LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, + LB_Glue, + LB_Combining_Mark, + LB_Glue, + LB_Combining_Mark, LB_Alphabetic, LB_Break_Before, LB_Alphabetic, @@ -52181,7 +52533,7 @@ static const LB_enum _Perl_LB_invmap[] = LB_Nonstarter, LB_Alphabetic, LB_Break_After, - LB_Alphabetic, + LB_Postfix_Numeric, LB_Break_After, LB_Alphabetic, LB_Break_After, @@ -53590,6 +53942,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, LB_Break_After, LB_Alphabetic, LB_Numeric, @@ -53642,6 +53996,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, LB_Break_After, LB_Alphabetic, LB_Combining_Mark, @@ -53752,6 +54108,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Break_Before, LB_Break_After, LB_Alphabetic, + LB_Break_Before, + LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, @@ -53789,6 +54147,17 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, + LB_Break_After, + LB_Ideographic, + LB_Numeric, + LB_Alphabetic, LB_Postfix_Numeric, LB_Alphabetic, LB_Break_After, @@ -53811,6 +54180,14 @@ static const LB_enum _Perl_LB_invmap[] = LB_Glue, LB_Open_Punctuation, LB_Close_Punctuation, + LB_Glue, + LB_Open_Punctuation, + LB_Close_Punctuation, + LB_Open_Punctuation, + LB_Close_Punctuation, + LB_Combining_Mark, + LB_Alphabetic, + LB_Combining_Mark, LB_Alphabetic, LB_Open_Punctuation, LB_Close_Punctuation, @@ -53856,6 +54233,10 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Nonstarter, LB_Alphabetic, + LB_Nonstarter, + LB_Alphabetic, + LB_Nonstarter, + LB_Alphabetic, LB_Ideographic, LB_Alphabetic, LB_Combining_Mark, @@ -53904,6 +54285,8 @@ static const LB_enum _Perl_LB_invmap[] = LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, + LB_Combining_Mark, + LB_Alphabetic, LB_Numeric, LB_Alphabetic, LB_Combining_Mark, @@ -53914,6 +54297,9 @@ static const LB_enum _Perl_LB_invmap[] = LB_Prefix_Numeric, LB_Alphabetic, LB_Combining_Mark, + LB_Numeric, + LB_Alphabetic, + LB_Combining_Mark, LB_Alphabetic, LB_Combining_Mark, LB_Alphabetic, @@ -54040,7 +54426,9 @@ static const LB_enum _Perl_LB_invmap[] = LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, LB_Alphabetic, + LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, + LB_Ideographic, LB_Alphabetic, LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, @@ -54096,10 +54484,6 @@ static const LB_enum _Perl_LB_invmap[] = LB_Ideographic, LB_Unassigned_Extended_Pictographic_Ideographic, LB_Ideographic, - LB_Unassigned_Extended_Pictographic_Ideographic, - LB_Ideographic, - LB_Unassigned_Extended_Pictographic_Ideographic, - LB_Ideographic, LB_E_Base, LB_Unassigned_Extended_Pictographic_Ideographic, LB_Ideographic, @@ -54134,7 +54518,7 @@ static const LB_enum _Perl_LB_invmap[] = # if 'A' == 65 /* ASCII/Latin1 */ static const UV _Perl_SB_invlist[] = { /* for ASCII/Latin1 */ - 3227, /* Number of elements */ + 3262, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -55100,6 +55484,7 @@ static const UV _Perl_SB_invlist[] = { 0xCF0, 0xCF1, 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD0D, @@ -55180,7 +55565,7 @@ static const UV _Perl_SB_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -55244,6 +55629,7 @@ static const UV _Perl_SB_invlist[] = { 0x10D0, 0x10FB, 0x10FC, + 0x10FD, 0x1249, 0x124A, 0x124E, @@ -56416,7 +56802,6 @@ static const UV _Perl_SB_invlist[] = { 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, 0xAB6A, 0xAB70, 0xABC0, @@ -56700,6 +57085,7 @@ static const UV _Perl_SB_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, + 0x10EFD, 0x10F00, 0x10F1D, 0x10F27, @@ -56784,6 +57170,8 @@ static const UV _Perl_SB_invlist[] = { 0x1123D, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -57001,6 +57389,19 @@ static const UV _Perl_SB_invlist[] = { 0x11EF3, 0x11EF7, 0x11EF9, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F45, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -57012,9 +57413,11 @@ static const UV _Perl_SB_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, 0x13430, - 0x13439, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -57081,8 +57484,12 @@ static const UV _Perl_SB_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -57224,6 +57631,8 @@ static const UV _Perl_SB_invlist[] = { 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -57234,6 +57643,10 @@ static const UV _Perl_SB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -57250,6 +57663,10 @@ static const UV _Perl_SB_invlist[] = { 0x1E2EC, 0x1E2F0, 0x1E2FA, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -57348,7 +57765,7 @@ static const UV _Perl_SB_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -57359,6 +57776,8 @@ static const UV _Perl_SB_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -58356,6 +58775,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Numeric, SB_Other, SB_OLetter, + SB_Extend, SB_Other, SB_Extend, SB_OLetter, @@ -58500,6 +58920,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_Lower, SB_OLetter, SB_Other, SB_OLetter, @@ -59566,7 +59987,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Upper, SB_Lower, SB_Other, - SB_OLetter, + SB_Lower, SB_Upper, SB_Lower, SB_OLetter, @@ -59673,7 +60094,6 @@ static const SB_enum _Perl_SB_invmap[] = SB_Lower, SB_Other, SB_Lower, - SB_OLetter, SB_Other, SB_Lower, SB_OLetter, @@ -59957,6 +60377,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_Extend, SB_OLetter, SB_Other, SB_OLetter, @@ -60040,6 +60461,8 @@ static const SB_enum _Perl_SB_invmap[] = SB_STerm, SB_Other, SB_Extend, + SB_OLetter, + SB_Extend, SB_Other, SB_OLetter, SB_Other, @@ -60258,7 +60681,18 @@ static const SB_enum _Perl_SB_invmap[] = SB_Extend, SB_STerm, SB_Other, + SB_Extend, + SB_OLetter, + SB_Extend, + SB_OLetter, + SB_Other, SB_OLetter, + SB_Extend, + SB_Other, + SB_Extend, + SB_STerm, + SB_Other, + SB_Numeric, SB_Other, SB_OLetter, SB_Other, @@ -60270,7 +60704,11 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_OLetter, SB_Format, + SB_Extend, + SB_OLetter, + SB_Extend, SB_Other, SB_OLetter, SB_Other, @@ -60352,6 +60790,10 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_OLetter, + SB_Other, + SB_OLetter, + SB_Other, SB_Extend, SB_STerm, SB_Format, @@ -60481,6 +60923,8 @@ static const SB_enum _Perl_SB_invmap[] = SB_OLetter, SB_Lower, SB_Other, + SB_Lower, + SB_Other, SB_Extend, SB_Other, SB_Extend, @@ -60491,6 +60935,10 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_Extend, SB_Other, + SB_Lower, + SB_Other, + SB_Extend, + SB_Other, SB_OLetter, SB_Other, SB_Extend, @@ -60508,6 +60956,10 @@ static const SB_enum _Perl_SB_invmap[] = SB_Numeric, SB_Other, SB_OLetter, + SB_Extend, + SB_Numeric, + SB_Other, + SB_OLetter, SB_Other, SB_OLetter, SB_Other, @@ -60616,6 +61068,8 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_OLetter, + SB_Other, SB_Format, SB_Other, SB_Extend, @@ -60636,7 +61090,7 @@ static const SB_enum _Perl_SB_invmap[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV _Perl_SB_invlist[] = { /* for EBCDIC 1047 */ - 3251, /* Number of elements */ + 3286, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -61626,6 +62080,7 @@ static const UV _Perl_SB_invlist[] = { 0xCF0, 0xCF1, 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD0D, @@ -61706,7 +62161,7 @@ static const UV _Perl_SB_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -61770,6 +62225,7 @@ static const UV _Perl_SB_invlist[] = { 0x10D0, 0x10FB, 0x10FC, + 0x10FD, 0x1249, 0x124A, 0x124E, @@ -62942,7 +63398,6 @@ static const UV _Perl_SB_invlist[] = { 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, 0xAB6A, 0xAB70, 0xABC0, @@ -63226,6 +63681,7 @@ static const UV _Perl_SB_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, + 0x10EFD, 0x10F00, 0x10F1D, 0x10F27, @@ -63310,6 +63766,8 @@ static const UV _Perl_SB_invlist[] = { 0x1123D, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -63527,6 +63985,19 @@ static const UV _Perl_SB_invlist[] = { 0x11EF3, 0x11EF7, 0x11EF9, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F45, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -63538,9 +64009,11 @@ static const UV _Perl_SB_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, 0x13430, - 0x13439, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -63607,8 +64080,12 @@ static const UV _Perl_SB_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -63750,6 +64227,8 @@ static const UV _Perl_SB_invlist[] = { 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -63760,6 +64239,10 @@ static const UV _Perl_SB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -63776,6 +64259,10 @@ static const UV _Perl_SB_invlist[] = { 0x1E2EC, 0x1E2F0, 0x1E2FA, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -63874,7 +64361,7 @@ static const UV _Perl_SB_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -63885,6 +64372,8 @@ static const UV _Perl_SB_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -64909,6 +65398,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Numeric, SB_Other, SB_OLetter, + SB_Extend, SB_Other, SB_Extend, SB_OLetter, @@ -65053,6 +65543,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_Lower, SB_OLetter, SB_Other, SB_OLetter, @@ -66119,7 +66610,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Upper, SB_Lower, SB_Other, - SB_OLetter, + SB_Lower, SB_Upper, SB_Lower, SB_OLetter, @@ -66226,7 +66717,6 @@ static const SB_enum _Perl_SB_invmap[] = SB_Lower, SB_Other, SB_Lower, - SB_OLetter, SB_Other, SB_Lower, SB_OLetter, @@ -66510,6 +67000,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_Extend, SB_OLetter, SB_Other, SB_OLetter, @@ -66593,6 +67084,8 @@ static const SB_enum _Perl_SB_invmap[] = SB_STerm, SB_Other, SB_Extend, + SB_OLetter, + SB_Extend, SB_Other, SB_OLetter, SB_Other, @@ -66811,7 +67304,18 @@ static const SB_enum _Perl_SB_invmap[] = SB_Extend, SB_STerm, SB_Other, + SB_Extend, + SB_OLetter, + SB_Extend, + SB_OLetter, + SB_Other, SB_OLetter, + SB_Extend, + SB_Other, + SB_Extend, + SB_STerm, + SB_Other, + SB_Numeric, SB_Other, SB_OLetter, SB_Other, @@ -66823,7 +67327,11 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_OLetter, SB_Format, + SB_Extend, + SB_OLetter, + SB_Extend, SB_Other, SB_OLetter, SB_Other, @@ -66905,6 +67413,10 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_OLetter, + SB_Other, + SB_OLetter, + SB_Other, SB_Extend, SB_STerm, SB_Format, @@ -67034,6 +67546,10 @@ static const SB_enum _Perl_SB_invmap[] = SB_OLetter, SB_Lower, SB_Other, + SB_Lower, + SB_Other, + SB_Extend, + SB_Other, SB_Extend, SB_Other, SB_Extend, @@ -67042,6 +67558,8 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_Extend, SB_Other, + SB_Lower, + SB_Other, SB_Extend, SB_Other, SB_OLetter, @@ -67061,6 +67579,10 @@ static const SB_enum _Perl_SB_invmap[] = SB_Numeric, SB_Other, SB_OLetter, + SB_Extend, + SB_Numeric, + SB_Other, + SB_OLetter, SB_Other, SB_OLetter, SB_Other, @@ -67169,6 +67691,8 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_OLetter, + SB_Other, SB_Format, SB_Other, SB_Extend, @@ -67189,7 +67713,7 @@ static const SB_enum _Perl_SB_invmap[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV _Perl_SB_invlist[] = { /* for EBCDIC 037 */ - 3247, /* Number of elements */ + 3282, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -68175,6 +68699,7 @@ static const UV _Perl_SB_invlist[] = { 0xCF0, 0xCF1, 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD0D, @@ -68255,7 +68780,7 @@ static const UV _Perl_SB_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -68319,6 +68844,7 @@ static const UV _Perl_SB_invlist[] = { 0x10D0, 0x10FB, 0x10FC, + 0x10FD, 0x1249, 0x124A, 0x124E, @@ -69491,7 +70017,6 @@ static const UV _Perl_SB_invlist[] = { 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, 0xAB6A, 0xAB70, 0xABC0, @@ -69775,6 +70300,7 @@ static const UV _Perl_SB_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, + 0x10EFD, 0x10F00, 0x10F1D, 0x10F27, @@ -69859,6 +70385,8 @@ static const UV _Perl_SB_invlist[] = { 0x1123D, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -70076,6 +70604,19 @@ static const UV _Perl_SB_invlist[] = { 0x11EF3, 0x11EF7, 0x11EF9, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F45, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -70087,9 +70628,11 @@ static const UV _Perl_SB_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, 0x13430, - 0x13439, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -70156,8 +70699,12 @@ static const UV _Perl_SB_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -70299,6 +70846,8 @@ static const UV _Perl_SB_invlist[] = { 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -70309,6 +70858,10 @@ static const UV _Perl_SB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -70325,6 +70878,10 @@ static const UV _Perl_SB_invlist[] = { 0x1E2EC, 0x1E2F0, 0x1E2FA, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -70423,7 +70980,7 @@ static const UV _Perl_SB_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -70434,6 +70991,8 @@ static const UV _Perl_SB_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -71454,6 +72013,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Numeric, SB_Other, SB_OLetter, + SB_Extend, SB_Other, SB_Extend, SB_OLetter, @@ -71598,6 +72158,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_Lower, SB_OLetter, SB_Other, SB_OLetter, @@ -72664,7 +73225,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Upper, SB_Lower, SB_Other, - SB_OLetter, + SB_Lower, SB_Upper, SB_Lower, SB_OLetter, @@ -72771,7 +73332,6 @@ static const SB_enum _Perl_SB_invmap[] = SB_Lower, SB_Other, SB_Lower, - SB_OLetter, SB_Other, SB_Lower, SB_OLetter, @@ -73055,6 +73615,7 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_Extend, SB_OLetter, SB_Other, SB_OLetter, @@ -73138,6 +73699,8 @@ static const SB_enum _Perl_SB_invmap[] = SB_STerm, SB_Other, SB_Extend, + SB_OLetter, + SB_Extend, SB_Other, SB_OLetter, SB_Other, @@ -73356,7 +73919,18 @@ static const SB_enum _Perl_SB_invmap[] = SB_Extend, SB_STerm, SB_Other, + SB_Extend, + SB_OLetter, + SB_Extend, + SB_OLetter, + SB_Other, SB_OLetter, + SB_Extend, + SB_Other, + SB_Extend, + SB_STerm, + SB_Other, + SB_Numeric, SB_Other, SB_OLetter, SB_Other, @@ -73368,7 +73942,11 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_OLetter, SB_Format, + SB_Extend, + SB_OLetter, + SB_Extend, SB_Other, SB_OLetter, SB_Other, @@ -73450,6 +74028,10 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_OLetter, + SB_Other, + SB_OLetter, + SB_Other, SB_Extend, SB_STerm, SB_Format, @@ -73579,6 +74161,10 @@ static const SB_enum _Perl_SB_invmap[] = SB_OLetter, SB_Lower, SB_Other, + SB_Lower, + SB_Other, + SB_Extend, + SB_Other, SB_Extend, SB_Other, SB_Extend, @@ -73587,6 +74173,8 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_Extend, SB_Other, + SB_Lower, + SB_Other, SB_Extend, SB_Other, SB_OLetter, @@ -73606,6 +74194,10 @@ static const SB_enum _Perl_SB_invmap[] = SB_Numeric, SB_Other, SB_OLetter, + SB_Extend, + SB_Numeric, + SB_Other, + SB_OLetter, SB_Other, SB_OLetter, SB_Other, @@ -73714,6 +74306,8 @@ static const SB_enum _Perl_SB_invmap[] = SB_Other, SB_OLetter, SB_Other, + SB_OLetter, + SB_Other, SB_Format, SB_Other, SB_Extend, @@ -73731,7 +74325,7 @@ static const SB_enum _Perl_SB_invmap[] = # if 'A' == 65 /* ASCII/Latin1 */ static const UV _Perl_SCX_invlist[] = { /* for ASCII/Latin1 */ - 1731, /* Number of elements */ + 1750, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -74061,7 +74655,7 @@ static const UV _Perl_SCX_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -74122,7 +74716,7 @@ static const UV _Perl_SCX_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -74887,6 +75481,7 @@ static const UV _Perl_SCX_invlist[] = { 0x10EAE, 0x10EB0, 0x10EB2, + 0x10EFD, 0x10F00, 0x10F28, 0x10F30, @@ -74923,7 +75518,7 @@ static const UV _Perl_SCX_invlist[] = { 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -75034,6 +75629,8 @@ static const UV _Perl_SCX_invlist[] = { 0x11AB0, 0x11AC0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -75076,6 +75673,12 @@ static const UV _Perl_SCX_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -75096,9 +75699,7 @@ static const UV _Perl_SCX_invlist[] = { 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -75158,8 +75759,12 @@ static const UV _Perl_SCX_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -75196,6 +75801,8 @@ static const UV _Perl_SCX_invlist[] = { 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -75252,6 +75859,8 @@ static const UV _Perl_SCX_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -75262,6 +75871,10 @@ static const UV _Perl_SCX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -75276,6 +75889,8 @@ static const UV _Perl_SCX_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -75394,14 +76009,14 @@ static const UV _Perl_SCX_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -75423,23 +76038,19 @@ static const UV _Perl_SCX_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -75449,7 +76060,7 @@ static const UV _Perl_SCX_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -75460,6 +76071,8 @@ static const UV _Perl_SCX_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -75545,106 +76158,108 @@ typedef enum { SCX_Kaithi = 63, SCX_Kannada = 64, SCX_Katakana = 65, - SCX_Kayah_Li = 66, - SCX_Kharoshthi = 67, - SCX_Khitan_Small_Script = 68, - SCX_Khmer = 69, - SCX_Khojki = 70, - SCX_Khudawadi = 71, - SCX_Kore = 72, - SCX_Lao = 73, - SCX_Latin = 74, - SCX_Lepcha = 75, - SCX_Limbu = 76, - SCX_Linear_A = 77, - SCX_Linear_B = 78, - SCX_Lisu = 79, - SCX_Lycian = 80, - SCX_Lydian = 81, - SCX_Mahajani = 82, - SCX_Makasar = 83, - SCX_Malayalam = 84, - SCX_Mandaic = 85, - SCX_Manichaean = 86, - SCX_Marchen = 87, - SCX_Masaram_Gondi = 88, - SCX_Medefaidrin = 89, - SCX_Meetei_Mayek = 90, - SCX_Mende_Kikakui = 91, - SCX_Meroitic_Cursive = 92, - SCX_Meroitic_Hieroglyphs = 93, - SCX_Miao = 94, - SCX_Modi = 95, - SCX_Mongolian = 96, - SCX_Mro = 97, - SCX_Multani = 98, - SCX_Myanmar = 99, - SCX_Nabataean = 100, - SCX_Nandinagari = 101, - SCX_New_Tai_Lue = 102, - SCX_Newa = 103, - SCX_Nko = 104, - SCX_Nushu = 105, - SCX_Nyiakeng_Puachue_Hmong = 106, - SCX_Ogham = 107, - SCX_Ol_Chiki = 108, - SCX_Old_Hungarian = 109, - SCX_Old_Italic = 110, - SCX_Old_North_Arabian = 111, - SCX_Old_Permic = 112, - SCX_Old_Persian = 113, - SCX_Old_Sogdian = 114, - SCX_Old_South_Arabian = 115, - SCX_Old_Turkic = 116, - SCX_Old_Uyghur = 117, - SCX_Oriya = 118, - SCX_Osage = 119, - SCX_Osmanya = 120, - SCX_Pahawh_Hmong = 121, - SCX_Palmyrene = 122, - SCX_Pau_Cin_Hau = 123, - SCX_Phags_Pa = 124, - SCX_Phoenician = 125, - SCX_Psalter_Pahlavi = 126, - SCX_Rejang = 127, - SCX_Runic = 128, - SCX_Samaritan = 129, - SCX_Saurashtra = 130, - SCX_Sharada = 131, - SCX_Shavian = 132, - SCX_Siddham = 133, - SCX_SignWriting = 134, - SCX_Sinhala = 135, - SCX_Sogdian = 136, - SCX_Sora_Sompeng = 137, - SCX_Soyombo = 138, - SCX_Sundanese = 139, - SCX_Syloti_Nagri = 140, - SCX_Syriac = 141, - SCX_Tagalog = 142, - SCX_Tagbanwa = 143, - SCX_Tai_Le = 144, - SCX_Tai_Tham = 145, - SCX_Tai_Viet = 146, - SCX_Takri = 147, - SCX_Tamil = 148, - SCX_Tangsa = 149, - SCX_Tangut = 150, - SCX_Telugu = 151, - SCX_Thaana = 152, - SCX_Thai = 153, - SCX_Tibetan = 154, - SCX_Tifinagh = 155, - SCX_Tirhuta = 156, - SCX_Toto = 157, - SCX_Ugaritic = 158, - SCX_Vai = 159, - SCX_Vithkuqi = 160, - SCX_Wancho = 161, - SCX_Warang_Citi = 162, - SCX_Yezidi = 163, - SCX_Yi = 164, - SCX_Zanabazar_Square = 165, + SCX_Kawi = 66, + SCX_Kayah_Li = 67, + SCX_Kharoshthi = 68, + SCX_Khitan_Small_Script = 69, + SCX_Khmer = 70, + SCX_Khojki = 71, + SCX_Khudawadi = 72, + SCX_Kore = 73, + SCX_Lao = 74, + SCX_Latin = 75, + SCX_Lepcha = 76, + SCX_Limbu = 77, + SCX_Linear_A = 78, + SCX_Linear_B = 79, + SCX_Lisu = 80, + SCX_Lycian = 81, + SCX_Lydian = 82, + SCX_Mahajani = 83, + SCX_Makasar = 84, + SCX_Malayalam = 85, + SCX_Mandaic = 86, + SCX_Manichaean = 87, + SCX_Marchen = 88, + SCX_Masaram_Gondi = 89, + SCX_Medefaidrin = 90, + SCX_Meetei_Mayek = 91, + SCX_Mende_Kikakui = 92, + SCX_Meroitic_Cursive = 93, + SCX_Meroitic_Hieroglyphs = 94, + SCX_Miao = 95, + SCX_Modi = 96, + SCX_Mongolian = 97, + SCX_Mro = 98, + SCX_Multani = 99, + SCX_Myanmar = 100, + SCX_Nabataean = 101, + SCX_Nag_Mundari = 102, + SCX_Nandinagari = 103, + SCX_New_Tai_Lue = 104, + SCX_Newa = 105, + SCX_Nko = 106, + SCX_Nushu = 107, + SCX_Nyiakeng_Puachue_Hmong = 108, + SCX_Ogham = 109, + SCX_Ol_Chiki = 110, + SCX_Old_Hungarian = 111, + SCX_Old_Italic = 112, + SCX_Old_North_Arabian = 113, + SCX_Old_Permic = 114, + SCX_Old_Persian = 115, + SCX_Old_Sogdian = 116, + SCX_Old_South_Arabian = 117, + SCX_Old_Turkic = 118, + SCX_Old_Uyghur = 119, + SCX_Oriya = 120, + SCX_Osage = 121, + SCX_Osmanya = 122, + SCX_Pahawh_Hmong = 123, + SCX_Palmyrene = 124, + SCX_Pau_Cin_Hau = 125, + SCX_Phags_Pa = 126, + SCX_Phoenician = 127, + SCX_Psalter_Pahlavi = 128, + SCX_Rejang = 129, + SCX_Runic = 130, + SCX_Samaritan = 131, + SCX_Saurashtra = 132, + SCX_Sharada = 133, + SCX_Shavian = 134, + SCX_Siddham = 135, + SCX_SignWriting = 136, + SCX_Sinhala = 137, + SCX_Sogdian = 138, + SCX_Sora_Sompeng = 139, + SCX_Soyombo = 140, + SCX_Sundanese = 141, + SCX_Syloti_Nagri = 142, + SCX_Syriac = 143, + SCX_Tagalog = 144, + SCX_Tagbanwa = 145, + SCX_Tai_Le = 146, + SCX_Tai_Tham = 147, + SCX_Tai_Viet = 148, + SCX_Takri = 149, + SCX_Tamil = 150, + SCX_Tangsa = 151, + SCX_Tangut = 152, + SCX_Telugu = 153, + SCX_Thaana = 154, + SCX_Thai = 155, + SCX_Tibetan = 156, + SCX_Tifinagh = 157, + SCX_Tirhuta = 158, + SCX_Toto = 159, + SCX_Ugaritic = 160, + SCX_Vai = 161, + SCX_Vithkuqi = 162, + SCX_Wancho = 163, + SCX_Warang_Citi = 164, + SCX_Yezidi = 165, + SCX_Yi = 166, + SCX_Zanabazar_Square = 167, SCX_use_AUX_TABLE_1 = -1, SCX_use_AUX_TABLE_2 = -2, SCX_use_AUX_TABLE_3 = -3, @@ -76366,6 +76981,7 @@ static const UV script_zeros[] = { 0x966, /* Kaithi */ 0xce6, /* Kannada */ '0', /* Katakana */ + 0x11f50, /* Kawi */ 0xa900, /* Kayah_Li */ '0', /* Kharoshthi */ '0', /* Khitan_Small_Script */ @@ -76401,6 +77017,7 @@ static const UV script_zeros[] = { 0xa66, /* Multani */ 0, /* Myanmar */ '0', /* Nabataean */ + 0x1e4f0, /* Nag_Mundari */ 0xce6, /* Nandinagari */ 0x19d0, /* New_Tai_Lue */ 0x11450, /* Newa */ @@ -77619,6 +78236,7 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Yezidi, SCX_Unknown, + SCX_Arabic, SCX_Old_Sogdian, SCX_Unknown, SCX_Sogdian, @@ -77766,6 +78384,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Canadian_Aboriginal, SCX_Pau_Cin_Hau, SCX_Unknown, + SCX_Devanagari, + SCX_Unknown, SCX_Bhaiksuki, SCX_Unknown, SCX_Bhaiksuki, @@ -77808,6 +78428,12 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Makasar, SCX_Unknown, + SCX_Kawi, + SCX_Unknown, + SCX_Kawi, + SCX_Unknown, + SCX_Kawi, + SCX_Unknown, SCX_Lisu, SCX_Unknown, SCX_Tamil, @@ -77829,8 +78455,6 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Egyptian_Hieroglyphs, SCX_Unknown, - SCX_Egyptian_Hieroglyphs, - SCX_Unknown, SCX_Anatolian_Hieroglyphs, SCX_Unknown, SCX_Bamum, @@ -77892,6 +78516,10 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_use_AUX_TABLE_44, SCX_Unknown, + SCX_use_AUX_TABLE_44, + SCX_Unknown, + SCX_use_AUX_TABLE_45, + SCX_Unknown, SCX_use_AUX_TABLE_45, SCX_Unknown, SCX_Nushu, @@ -77932,6 +78560,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Common, SCX_Unknown, + SCX_Common, + SCX_Unknown, SCX_use_AUX_TABLE_38, SCX_Common, SCX_Unknown, @@ -77984,6 +78614,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Latin, SCX_Unknown, + SCX_Latin, + SCX_Unknown, SCX_Glagolitic, SCX_Unknown, SCX_Glagolitic, @@ -77994,6 +78626,10 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Glagolitic, SCX_Unknown, + SCX_Cyrillic, + SCX_Unknown, + SCX_Cyrillic, + SCX_Unknown, SCX_Nyiakeng_Puachue_Hmong, SCX_Unknown, SCX_Nyiakeng_Puachue_Hmong, @@ -78008,6 +78644,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Wancho, SCX_Unknown, + SCX_Nag_Mundari, + SCX_Unknown, SCX_Ethiopic, SCX_Unknown, SCX_Ethiopic, @@ -78174,9 +78812,7 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Common, SCX_Unknown, - SCX_Common, - SCX_Unknown, - SCX_Common, + SCX_use_AUX_TABLE_38, SCX_Unknown, SCX_use_AUX_TABLE_38, SCX_Unknown, @@ -78212,7 +78848,7 @@ static const SCX_enum _Perl_SCX_invmap[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV _Perl_SCX_invlist[] = { /* for EBCDIC 1047 */ - 1757, /* Number of elements */ + 1776, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -78568,7 +79204,7 @@ static const UV _Perl_SCX_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -78629,7 +79265,7 @@ static const UV _Perl_SCX_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -79394,6 +80030,7 @@ static const UV _Perl_SCX_invlist[] = { 0x10EAE, 0x10EB0, 0x10EB2, + 0x10EFD, 0x10F00, 0x10F28, 0x10F30, @@ -79430,7 +80067,7 @@ static const UV _Perl_SCX_invlist[] = { 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -79541,6 +80178,8 @@ static const UV _Perl_SCX_invlist[] = { 0x11AB0, 0x11AC0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -79583,6 +80222,12 @@ static const UV _Perl_SCX_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -79603,9 +80248,7 @@ static const UV _Perl_SCX_invlist[] = { 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -79665,8 +80308,12 @@ static const UV _Perl_SCX_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -79703,6 +80350,8 @@ static const UV _Perl_SCX_invlist[] = { 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -79759,6 +80408,8 @@ static const UV _Perl_SCX_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -79769,6 +80420,10 @@ static const UV _Perl_SCX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -79783,6 +80438,8 @@ static const UV _Perl_SCX_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -79901,14 +80558,14 @@ static const UV _Perl_SCX_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -79930,23 +80587,19 @@ static const UV _Perl_SCX_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -79956,7 +80609,7 @@ static const UV _Perl_SCX_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -79967,6 +80620,8 @@ static const UV _Perl_SCX_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -80055,106 +80710,108 @@ typedef enum { SCX_Kaithi = 63, SCX_Kannada = 64, SCX_Katakana = 65, - SCX_Kayah_Li = 66, - SCX_Kharoshthi = 67, - SCX_Khitan_Small_Script = 68, - SCX_Khmer = 69, - SCX_Khojki = 70, - SCX_Khudawadi = 71, - SCX_Kore = 72, - SCX_Lao = 73, - SCX_Latin = 74, - SCX_Lepcha = 75, - SCX_Limbu = 76, - SCX_Linear_A = 77, - SCX_Linear_B = 78, - SCX_Lisu = 79, - SCX_Lycian = 80, - SCX_Lydian = 81, - SCX_Mahajani = 82, - SCX_Makasar = 83, - SCX_Malayalam = 84, - SCX_Mandaic = 85, - SCX_Manichaean = 86, - SCX_Marchen = 87, - SCX_Masaram_Gondi = 88, - SCX_Medefaidrin = 89, - SCX_Meetei_Mayek = 90, - SCX_Mende_Kikakui = 91, - SCX_Meroitic_Cursive = 92, - SCX_Meroitic_Hieroglyphs = 93, - SCX_Miao = 94, - SCX_Modi = 95, - SCX_Mongolian = 96, - SCX_Mro = 97, - SCX_Multani = 98, - SCX_Myanmar = 99, - SCX_Nabataean = 100, - SCX_Nandinagari = 101, - SCX_New_Tai_Lue = 102, - SCX_Newa = 103, - SCX_Nko = 104, - SCX_Nushu = 105, - SCX_Nyiakeng_Puachue_Hmong = 106, - SCX_Ogham = 107, - SCX_Ol_Chiki = 108, - SCX_Old_Hungarian = 109, - SCX_Old_Italic = 110, - SCX_Old_North_Arabian = 111, - SCX_Old_Permic = 112, - SCX_Old_Persian = 113, - SCX_Old_Sogdian = 114, - SCX_Old_South_Arabian = 115, - SCX_Old_Turkic = 116, - SCX_Old_Uyghur = 117, - SCX_Oriya = 118, - SCX_Osage = 119, - SCX_Osmanya = 120, - SCX_Pahawh_Hmong = 121, - SCX_Palmyrene = 122, - SCX_Pau_Cin_Hau = 123, - SCX_Phags_Pa = 124, - SCX_Phoenician = 125, - SCX_Psalter_Pahlavi = 126, - SCX_Rejang = 127, - SCX_Runic = 128, - SCX_Samaritan = 129, - SCX_Saurashtra = 130, - SCX_Sharada = 131, - SCX_Shavian = 132, - SCX_Siddham = 133, - SCX_SignWriting = 134, - SCX_Sinhala = 135, - SCX_Sogdian = 136, - SCX_Sora_Sompeng = 137, - SCX_Soyombo = 138, - SCX_Sundanese = 139, - SCX_Syloti_Nagri = 140, - SCX_Syriac = 141, - SCX_Tagalog = 142, - SCX_Tagbanwa = 143, - SCX_Tai_Le = 144, - SCX_Tai_Tham = 145, - SCX_Tai_Viet = 146, - SCX_Takri = 147, - SCX_Tamil = 148, - SCX_Tangsa = 149, - SCX_Tangut = 150, - SCX_Telugu = 151, - SCX_Thaana = 152, - SCX_Thai = 153, - SCX_Tibetan = 154, - SCX_Tifinagh = 155, - SCX_Tirhuta = 156, - SCX_Toto = 157, - SCX_Ugaritic = 158, - SCX_Vai = 159, - SCX_Vithkuqi = 160, - SCX_Wancho = 161, - SCX_Warang_Citi = 162, - SCX_Yezidi = 163, - SCX_Yi = 164, - SCX_Zanabazar_Square = 165, + SCX_Kawi = 66, + SCX_Kayah_Li = 67, + SCX_Kharoshthi = 68, + SCX_Khitan_Small_Script = 69, + SCX_Khmer = 70, + SCX_Khojki = 71, + SCX_Khudawadi = 72, + SCX_Kore = 73, + SCX_Lao = 74, + SCX_Latin = 75, + SCX_Lepcha = 76, + SCX_Limbu = 77, + SCX_Linear_A = 78, + SCX_Linear_B = 79, + SCX_Lisu = 80, + SCX_Lycian = 81, + SCX_Lydian = 82, + SCX_Mahajani = 83, + SCX_Makasar = 84, + SCX_Malayalam = 85, + SCX_Mandaic = 86, + SCX_Manichaean = 87, + SCX_Marchen = 88, + SCX_Masaram_Gondi = 89, + SCX_Medefaidrin = 90, + SCX_Meetei_Mayek = 91, + SCX_Mende_Kikakui = 92, + SCX_Meroitic_Cursive = 93, + SCX_Meroitic_Hieroglyphs = 94, + SCX_Miao = 95, + SCX_Modi = 96, + SCX_Mongolian = 97, + SCX_Mro = 98, + SCX_Multani = 99, + SCX_Myanmar = 100, + SCX_Nabataean = 101, + SCX_Nag_Mundari = 102, + SCX_Nandinagari = 103, + SCX_New_Tai_Lue = 104, + SCX_Newa = 105, + SCX_Nko = 106, + SCX_Nushu = 107, + SCX_Nyiakeng_Puachue_Hmong = 108, + SCX_Ogham = 109, + SCX_Ol_Chiki = 110, + SCX_Old_Hungarian = 111, + SCX_Old_Italic = 112, + SCX_Old_North_Arabian = 113, + SCX_Old_Permic = 114, + SCX_Old_Persian = 115, + SCX_Old_Sogdian = 116, + SCX_Old_South_Arabian = 117, + SCX_Old_Turkic = 118, + SCX_Old_Uyghur = 119, + SCX_Oriya = 120, + SCX_Osage = 121, + SCX_Osmanya = 122, + SCX_Pahawh_Hmong = 123, + SCX_Palmyrene = 124, + SCX_Pau_Cin_Hau = 125, + SCX_Phags_Pa = 126, + SCX_Phoenician = 127, + SCX_Psalter_Pahlavi = 128, + SCX_Rejang = 129, + SCX_Runic = 130, + SCX_Samaritan = 131, + SCX_Saurashtra = 132, + SCX_Sharada = 133, + SCX_Shavian = 134, + SCX_Siddham = 135, + SCX_SignWriting = 136, + SCX_Sinhala = 137, + SCX_Sogdian = 138, + SCX_Sora_Sompeng = 139, + SCX_Soyombo = 140, + SCX_Sundanese = 141, + SCX_Syloti_Nagri = 142, + SCX_Syriac = 143, + SCX_Tagalog = 144, + SCX_Tagbanwa = 145, + SCX_Tai_Le = 146, + SCX_Tai_Tham = 147, + SCX_Tai_Viet = 148, + SCX_Takri = 149, + SCX_Tamil = 150, + SCX_Tangsa = 151, + SCX_Tangut = 152, + SCX_Telugu = 153, + SCX_Thaana = 154, + SCX_Thai = 155, + SCX_Tibetan = 156, + SCX_Tifinagh = 157, + SCX_Tirhuta = 158, + SCX_Toto = 159, + SCX_Ugaritic = 160, + SCX_Vai = 161, + SCX_Vithkuqi = 162, + SCX_Wancho = 163, + SCX_Warang_Citi = 164, + SCX_Yezidi = 165, + SCX_Yi = 166, + SCX_Zanabazar_Square = 167, SCX_use_AUX_TABLE_1 = -1, SCX_use_AUX_TABLE_2 = -2, SCX_use_AUX_TABLE_3 = -3, @@ -80879,6 +81536,7 @@ static const UV script_zeros[] = { 0x966, /* Kaithi */ 0xce6, /* Kannada */ '0', /* Katakana */ + 0x11f50, /* Kawi */ 0xa900, /* Kayah_Li */ '0', /* Kharoshthi */ '0', /* Khitan_Small_Script */ @@ -80914,6 +81572,7 @@ static const UV script_zeros[] = { 0xa66, /* Multani */ 0, /* Myanmar */ '0', /* Nabataean */ + 0x1e4f0, /* Nag_Mundari */ 0xce6, /* Nandinagari */ 0x19d0, /* New_Tai_Lue */ 0x11450, /* Newa */ @@ -82158,6 +82817,7 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Yezidi, SCX_Unknown, + SCX_Arabic, SCX_Old_Sogdian, SCX_Unknown, SCX_Sogdian, @@ -82305,6 +82965,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Canadian_Aboriginal, SCX_Pau_Cin_Hau, SCX_Unknown, + SCX_Devanagari, + SCX_Unknown, SCX_Bhaiksuki, SCX_Unknown, SCX_Bhaiksuki, @@ -82347,6 +83009,12 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Makasar, SCX_Unknown, + SCX_Kawi, + SCX_Unknown, + SCX_Kawi, + SCX_Unknown, + SCX_Kawi, + SCX_Unknown, SCX_Lisu, SCX_Unknown, SCX_Tamil, @@ -82368,8 +83036,6 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Egyptian_Hieroglyphs, SCX_Unknown, - SCX_Egyptian_Hieroglyphs, - SCX_Unknown, SCX_Anatolian_Hieroglyphs, SCX_Unknown, SCX_Bamum, @@ -82431,6 +83097,10 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_use_AUX_TABLE_44, SCX_Unknown, + SCX_use_AUX_TABLE_44, + SCX_Unknown, + SCX_use_AUX_TABLE_45, + SCX_Unknown, SCX_use_AUX_TABLE_45, SCX_Unknown, SCX_Nushu, @@ -82471,6 +83141,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Common, SCX_Unknown, + SCX_Common, + SCX_Unknown, SCX_use_AUX_TABLE_38, SCX_Common, SCX_Unknown, @@ -82523,6 +83195,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Latin, SCX_Unknown, + SCX_Latin, + SCX_Unknown, SCX_Glagolitic, SCX_Unknown, SCX_Glagolitic, @@ -82533,6 +83207,10 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Glagolitic, SCX_Unknown, + SCX_Cyrillic, + SCX_Unknown, + SCX_Cyrillic, + SCX_Unknown, SCX_Nyiakeng_Puachue_Hmong, SCX_Unknown, SCX_Nyiakeng_Puachue_Hmong, @@ -82547,6 +83225,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Wancho, SCX_Unknown, + SCX_Nag_Mundari, + SCX_Unknown, SCX_Ethiopic, SCX_Unknown, SCX_Ethiopic, @@ -82713,9 +83393,7 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Common, SCX_Unknown, - SCX_Common, - SCX_Unknown, - SCX_Common, + SCX_use_AUX_TABLE_38, SCX_Unknown, SCX_use_AUX_TABLE_38, SCX_Unknown, @@ -82751,7 +83429,7 @@ static const SCX_enum _Perl_SCX_invmap[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV _Perl_SCX_invlist[] = { /* for EBCDIC 037 */ - 1753, /* Number of elements */ + 1772, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -83103,7 +83781,7 @@ static const UV _Perl_SCX_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -83164,7 +83842,7 @@ static const UV _Perl_SCX_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -83929,6 +84607,7 @@ static const UV _Perl_SCX_invlist[] = { 0x10EAE, 0x10EB0, 0x10EB2, + 0x10EFD, 0x10F00, 0x10F28, 0x10F30, @@ -83965,7 +84644,7 @@ static const UV _Perl_SCX_invlist[] = { 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -84076,6 +84755,8 @@ static const UV _Perl_SCX_invlist[] = { 0x11AB0, 0x11AC0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -84118,6 +84799,12 @@ static const UV _Perl_SCX_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -84138,9 +84825,7 @@ static const UV _Perl_SCX_invlist[] = { 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -84200,8 +84885,12 @@ static const UV _Perl_SCX_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -84238,6 +84927,8 @@ static const UV _Perl_SCX_invlist[] = { 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -84294,6 +84985,8 @@ static const UV _Perl_SCX_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -84304,6 +84997,10 @@ static const UV _Perl_SCX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -84318,6 +85015,8 @@ static const UV _Perl_SCX_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -84436,14 +85135,14 @@ static const UV _Perl_SCX_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -84465,23 +85164,19 @@ static const UV _Perl_SCX_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -84491,7 +85186,7 @@ static const UV _Perl_SCX_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -84502,6 +85197,8 @@ static const UV _Perl_SCX_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -84590,106 +85287,108 @@ typedef enum { SCX_Kaithi = 63, SCX_Kannada = 64, SCX_Katakana = 65, - SCX_Kayah_Li = 66, - SCX_Kharoshthi = 67, - SCX_Khitan_Small_Script = 68, - SCX_Khmer = 69, - SCX_Khojki = 70, - SCX_Khudawadi = 71, - SCX_Kore = 72, - SCX_Lao = 73, - SCX_Latin = 74, - SCX_Lepcha = 75, - SCX_Limbu = 76, - SCX_Linear_A = 77, - SCX_Linear_B = 78, - SCX_Lisu = 79, - SCX_Lycian = 80, - SCX_Lydian = 81, - SCX_Mahajani = 82, - SCX_Makasar = 83, - SCX_Malayalam = 84, - SCX_Mandaic = 85, - SCX_Manichaean = 86, - SCX_Marchen = 87, - SCX_Masaram_Gondi = 88, - SCX_Medefaidrin = 89, - SCX_Meetei_Mayek = 90, - SCX_Mende_Kikakui = 91, - SCX_Meroitic_Cursive = 92, - SCX_Meroitic_Hieroglyphs = 93, - SCX_Miao = 94, - SCX_Modi = 95, - SCX_Mongolian = 96, - SCX_Mro = 97, - SCX_Multani = 98, - SCX_Myanmar = 99, - SCX_Nabataean = 100, - SCX_Nandinagari = 101, - SCX_New_Tai_Lue = 102, - SCX_Newa = 103, - SCX_Nko = 104, - SCX_Nushu = 105, - SCX_Nyiakeng_Puachue_Hmong = 106, - SCX_Ogham = 107, - SCX_Ol_Chiki = 108, - SCX_Old_Hungarian = 109, - SCX_Old_Italic = 110, - SCX_Old_North_Arabian = 111, - SCX_Old_Permic = 112, - SCX_Old_Persian = 113, - SCX_Old_Sogdian = 114, - SCX_Old_South_Arabian = 115, - SCX_Old_Turkic = 116, - SCX_Old_Uyghur = 117, - SCX_Oriya = 118, - SCX_Osage = 119, - SCX_Osmanya = 120, - SCX_Pahawh_Hmong = 121, - SCX_Palmyrene = 122, - SCX_Pau_Cin_Hau = 123, - SCX_Phags_Pa = 124, - SCX_Phoenician = 125, - SCX_Psalter_Pahlavi = 126, - SCX_Rejang = 127, - SCX_Runic = 128, - SCX_Samaritan = 129, - SCX_Saurashtra = 130, - SCX_Sharada = 131, - SCX_Shavian = 132, - SCX_Siddham = 133, - SCX_SignWriting = 134, - SCX_Sinhala = 135, - SCX_Sogdian = 136, - SCX_Sora_Sompeng = 137, - SCX_Soyombo = 138, - SCX_Sundanese = 139, - SCX_Syloti_Nagri = 140, - SCX_Syriac = 141, - SCX_Tagalog = 142, - SCX_Tagbanwa = 143, - SCX_Tai_Le = 144, - SCX_Tai_Tham = 145, - SCX_Tai_Viet = 146, - SCX_Takri = 147, - SCX_Tamil = 148, - SCX_Tangsa = 149, - SCX_Tangut = 150, - SCX_Telugu = 151, - SCX_Thaana = 152, - SCX_Thai = 153, - SCX_Tibetan = 154, - SCX_Tifinagh = 155, - SCX_Tirhuta = 156, - SCX_Toto = 157, - SCX_Ugaritic = 158, - SCX_Vai = 159, - SCX_Vithkuqi = 160, - SCX_Wancho = 161, - SCX_Warang_Citi = 162, - SCX_Yezidi = 163, - SCX_Yi = 164, - SCX_Zanabazar_Square = 165, + SCX_Kawi = 66, + SCX_Kayah_Li = 67, + SCX_Kharoshthi = 68, + SCX_Khitan_Small_Script = 69, + SCX_Khmer = 70, + SCX_Khojki = 71, + SCX_Khudawadi = 72, + SCX_Kore = 73, + SCX_Lao = 74, + SCX_Latin = 75, + SCX_Lepcha = 76, + SCX_Limbu = 77, + SCX_Linear_A = 78, + SCX_Linear_B = 79, + SCX_Lisu = 80, + SCX_Lycian = 81, + SCX_Lydian = 82, + SCX_Mahajani = 83, + SCX_Makasar = 84, + SCX_Malayalam = 85, + SCX_Mandaic = 86, + SCX_Manichaean = 87, + SCX_Marchen = 88, + SCX_Masaram_Gondi = 89, + SCX_Medefaidrin = 90, + SCX_Meetei_Mayek = 91, + SCX_Mende_Kikakui = 92, + SCX_Meroitic_Cursive = 93, + SCX_Meroitic_Hieroglyphs = 94, + SCX_Miao = 95, + SCX_Modi = 96, + SCX_Mongolian = 97, + SCX_Mro = 98, + SCX_Multani = 99, + SCX_Myanmar = 100, + SCX_Nabataean = 101, + SCX_Nag_Mundari = 102, + SCX_Nandinagari = 103, + SCX_New_Tai_Lue = 104, + SCX_Newa = 105, + SCX_Nko = 106, + SCX_Nushu = 107, + SCX_Nyiakeng_Puachue_Hmong = 108, + SCX_Ogham = 109, + SCX_Ol_Chiki = 110, + SCX_Old_Hungarian = 111, + SCX_Old_Italic = 112, + SCX_Old_North_Arabian = 113, + SCX_Old_Permic = 114, + SCX_Old_Persian = 115, + SCX_Old_Sogdian = 116, + SCX_Old_South_Arabian = 117, + SCX_Old_Turkic = 118, + SCX_Old_Uyghur = 119, + SCX_Oriya = 120, + SCX_Osage = 121, + SCX_Osmanya = 122, + SCX_Pahawh_Hmong = 123, + SCX_Palmyrene = 124, + SCX_Pau_Cin_Hau = 125, + SCX_Phags_Pa = 126, + SCX_Phoenician = 127, + SCX_Psalter_Pahlavi = 128, + SCX_Rejang = 129, + SCX_Runic = 130, + SCX_Samaritan = 131, + SCX_Saurashtra = 132, + SCX_Sharada = 133, + SCX_Shavian = 134, + SCX_Siddham = 135, + SCX_SignWriting = 136, + SCX_Sinhala = 137, + SCX_Sogdian = 138, + SCX_Sora_Sompeng = 139, + SCX_Soyombo = 140, + SCX_Sundanese = 141, + SCX_Syloti_Nagri = 142, + SCX_Syriac = 143, + SCX_Tagalog = 144, + SCX_Tagbanwa = 145, + SCX_Tai_Le = 146, + SCX_Tai_Tham = 147, + SCX_Tai_Viet = 148, + SCX_Takri = 149, + SCX_Tamil = 150, + SCX_Tangsa = 151, + SCX_Tangut = 152, + SCX_Telugu = 153, + SCX_Thaana = 154, + SCX_Thai = 155, + SCX_Tibetan = 156, + SCX_Tifinagh = 157, + SCX_Tirhuta = 158, + SCX_Toto = 159, + SCX_Ugaritic = 160, + SCX_Vai = 161, + SCX_Vithkuqi = 162, + SCX_Wancho = 163, + SCX_Warang_Citi = 164, + SCX_Yezidi = 165, + SCX_Yi = 166, + SCX_Zanabazar_Square = 167, SCX_use_AUX_TABLE_1 = -1, SCX_use_AUX_TABLE_2 = -2, SCX_use_AUX_TABLE_3 = -3, @@ -85414,6 +86113,7 @@ static const UV script_zeros[] = { 0x966, /* Kaithi */ 0xce6, /* Kannada */ '0', /* Katakana */ + 0x11f50, /* Kawi */ 0xa900, /* Kayah_Li */ '0', /* Kharoshthi */ '0', /* Khitan_Small_Script */ @@ -85449,6 +86149,7 @@ static const UV script_zeros[] = { 0xa66, /* Multani */ 0, /* Myanmar */ '0', /* Nabataean */ + 0x1e4f0, /* Nag_Mundari */ 0xce6, /* Nandinagari */ 0x19d0, /* New_Tai_Lue */ 0x11450, /* Newa */ @@ -86689,6 +87390,7 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Yezidi, SCX_Unknown, + SCX_Arabic, SCX_Old_Sogdian, SCX_Unknown, SCX_Sogdian, @@ -86836,6 +87538,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Canadian_Aboriginal, SCX_Pau_Cin_Hau, SCX_Unknown, + SCX_Devanagari, + SCX_Unknown, SCX_Bhaiksuki, SCX_Unknown, SCX_Bhaiksuki, @@ -86878,6 +87582,12 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Makasar, SCX_Unknown, + SCX_Kawi, + SCX_Unknown, + SCX_Kawi, + SCX_Unknown, + SCX_Kawi, + SCX_Unknown, SCX_Lisu, SCX_Unknown, SCX_Tamil, @@ -86899,8 +87609,6 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Egyptian_Hieroglyphs, SCX_Unknown, - SCX_Egyptian_Hieroglyphs, - SCX_Unknown, SCX_Anatolian_Hieroglyphs, SCX_Unknown, SCX_Bamum, @@ -86962,6 +87670,10 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_use_AUX_TABLE_44, SCX_Unknown, + SCX_use_AUX_TABLE_44, + SCX_Unknown, + SCX_use_AUX_TABLE_45, + SCX_Unknown, SCX_use_AUX_TABLE_45, SCX_Unknown, SCX_Nushu, @@ -87002,6 +87714,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Common, SCX_Unknown, + SCX_Common, + SCX_Unknown, SCX_use_AUX_TABLE_38, SCX_Common, SCX_Unknown, @@ -87054,6 +87768,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Latin, SCX_Unknown, + SCX_Latin, + SCX_Unknown, SCX_Glagolitic, SCX_Unknown, SCX_Glagolitic, @@ -87064,6 +87780,10 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Glagolitic, SCX_Unknown, + SCX_Cyrillic, + SCX_Unknown, + SCX_Cyrillic, + SCX_Unknown, SCX_Nyiakeng_Puachue_Hmong, SCX_Unknown, SCX_Nyiakeng_Puachue_Hmong, @@ -87078,6 +87798,8 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Wancho, SCX_Unknown, + SCX_Nag_Mundari, + SCX_Unknown, SCX_Ethiopic, SCX_Unknown, SCX_Ethiopic, @@ -87244,9 +87966,7 @@ static const SCX_enum _Perl_SCX_invmap[] SCX_Unknown, SCX_Common, SCX_Unknown, - SCX_Common, - SCX_Unknown, - SCX_Common, + SCX_use_AUX_TABLE_38, SCX_Unknown, SCX_use_AUX_TABLE_38, SCX_Unknown, @@ -87279,7 +87999,7 @@ static const SCX_enum _Perl_SCX_invmap[] # if 'A' == 65 /* ASCII/Latin1 */ static const UV _Perl_WB_invlist[] = { /* for ASCII/Latin1 */ - 1949, /* Number of elements */ + 1979, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -87704,6 +88424,7 @@ static const UV _Perl_WB_invlist[] = { 0xCF0, 0xCF1, 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD0D, @@ -87766,7 +88487,7 @@ static const UV _Perl_WB_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xF00, @@ -88608,6 +89329,7 @@ static const UV _Perl_WB_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, + 0x10EFD, 0x10F00, 0x10F1D, 0x10F27, @@ -88681,6 +89403,8 @@ static const UV _Perl_WB_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -88877,6 +89601,18 @@ static const UV _Perl_WB_invlist[] = { 0x11EE0, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -88888,9 +89624,11 @@ static const UV _Perl_WB_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, 0x13430, - 0x13439, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -88946,6 +89684,8 @@ static const UV _Perl_WB_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1BC00, @@ -89052,6 +89792,8 @@ static const UV _Perl_WB_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -89062,6 +89804,10 @@ static const UV _Perl_WB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -89078,6 +89824,10 @@ static const UV _Perl_WB_invlist[] = { 0x1E2EC, 0x1E2F0, 0x1E2FA, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -89693,6 +90443,7 @@ static const WB_enum _Perl_WB_invmap[] = WB_Numeric, WB_Other, WB_ALetter, + WB_Extend, WB_Other, WB_Extend, WB_ALetter, @@ -90598,6 +91349,7 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_ALetter, WB_Other, + WB_Extend, WB_ALetter, WB_Other, WB_ALetter, @@ -90670,6 +91422,8 @@ static const WB_enum _Perl_WB_invmap[] = WB_Extend, WB_Other, WB_Extend, + WB_ALetter, + WB_Extend, WB_Other, WB_ALetter, WB_Other, @@ -90867,7 +91621,17 @@ static const WB_enum _Perl_WB_invmap[] = WB_ALetter, WB_Extend, WB_Other, + WB_Extend, + WB_ALetter, + WB_Extend, + WB_ALetter, + WB_Other, WB_ALetter, + WB_Extend, + WB_Other, + WB_Extend, + WB_Other, + WB_Numeric, WB_Other, WB_ALetter, WB_Other, @@ -90879,7 +91643,11 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_ALetter, WB_Other, + WB_ALetter, WB_Format, + WB_Extend, + WB_ALetter, + WB_Extend, WB_Other, WB_ALetter, WB_Other, @@ -90938,6 +91706,8 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_Katakana, WB_Other, + WB_Katakana, + WB_Other, WB_ALetter, WB_Other, WB_ALetter, @@ -91042,6 +91812,10 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_ALetter, WB_Other, + WB_ALetter, + WB_Other, + WB_Extend, + WB_Other, WB_Extend, WB_Other, WB_Extend, @@ -91050,6 +91824,8 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_Extend, WB_Other, + WB_ALetter, + WB_Other, WB_Extend, WB_Other, WB_ALetter, @@ -91069,6 +91845,10 @@ static const WB_enum _Perl_WB_invmap[] = WB_Numeric, WB_Other, WB_ALetter, + WB_Extend, + WB_Numeric, + WB_Other, + WB_ALetter, WB_Other, WB_ALetter, WB_Other, @@ -91236,7 +92016,7 @@ static const WB_enum _Perl_WB_invmap[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV _Perl_WB_invlist[] = { /* for EBCDIC 1047 */ - 1972, /* Number of elements */ + 2002, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -91684,6 +92464,7 @@ static const UV _Perl_WB_invlist[] = { 0xCF0, 0xCF1, 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD0D, @@ -91746,7 +92527,7 @@ static const UV _Perl_WB_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xF00, @@ -92588,6 +93369,7 @@ static const UV _Perl_WB_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, + 0x10EFD, 0x10F00, 0x10F1D, 0x10F27, @@ -92661,6 +93443,8 @@ static const UV _Perl_WB_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -92857,6 +93641,18 @@ static const UV _Perl_WB_invlist[] = { 0x11EE0, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -92868,9 +93664,11 @@ static const UV _Perl_WB_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, 0x13430, - 0x13439, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -92926,6 +93724,8 @@ static const UV _Perl_WB_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1BC00, @@ -93032,6 +93832,8 @@ static const UV _Perl_WB_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -93042,6 +93844,10 @@ static const UV _Perl_WB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -93058,6 +93864,10 @@ static const UV _Perl_WB_invlist[] = { 0x1E2EC, 0x1E2F0, 0x1E2FA, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -93699,6 +94509,7 @@ static const WB_enum _Perl_WB_invmap[] = WB_Numeric, WB_Other, WB_ALetter, + WB_Extend, WB_Other, WB_Extend, WB_ALetter, @@ -94604,6 +95415,7 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_ALetter, WB_Other, + WB_Extend, WB_ALetter, WB_Other, WB_ALetter, @@ -94676,6 +95488,8 @@ static const WB_enum _Perl_WB_invmap[] = WB_Extend, WB_Other, WB_Extend, + WB_ALetter, + WB_Extend, WB_Other, WB_ALetter, WB_Other, @@ -94873,7 +95687,17 @@ static const WB_enum _Perl_WB_invmap[] = WB_ALetter, WB_Extend, WB_Other, + WB_Extend, + WB_ALetter, + WB_Extend, + WB_ALetter, + WB_Other, WB_ALetter, + WB_Extend, + WB_Other, + WB_Extend, + WB_Other, + WB_Numeric, WB_Other, WB_ALetter, WB_Other, @@ -94885,7 +95709,11 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_ALetter, WB_Other, + WB_ALetter, WB_Format, + WB_Extend, + WB_ALetter, + WB_Extend, WB_Other, WB_ALetter, WB_Other, @@ -94944,6 +95772,8 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_Katakana, WB_Other, + WB_Katakana, + WB_Other, WB_ALetter, WB_Other, WB_ALetter, @@ -95048,6 +95878,10 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_ALetter, WB_Other, + WB_ALetter, + WB_Other, + WB_Extend, + WB_Other, WB_Extend, WB_Other, WB_Extend, @@ -95056,6 +95890,8 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_Extend, WB_Other, + WB_ALetter, + WB_Other, WB_Extend, WB_Other, WB_ALetter, @@ -95075,6 +95911,10 @@ static const WB_enum _Perl_WB_invmap[] = WB_Numeric, WB_Other, WB_ALetter, + WB_Extend, + WB_Numeric, + WB_Other, + WB_ALetter, WB_Other, WB_ALetter, WB_Other, @@ -95242,7 +96082,7 @@ static const WB_enum _Perl_WB_invmap[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV _Perl_WB_invlist[] = { /* for EBCDIC 037 */ - 1968, /* Number of elements */ + 1998, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -95686,6 +96526,7 @@ static const UV _Perl_WB_invlist[] = { 0xCF0, 0xCF1, 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD0D, @@ -95748,7 +96589,7 @@ static const UV _Perl_WB_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xF00, @@ -96590,6 +97431,7 @@ static const UV _Perl_WB_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, + 0x10EFD, 0x10F00, 0x10F1D, 0x10F27, @@ -96663,6 +97505,8 @@ static const UV _Perl_WB_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -96859,6 +97703,18 @@ static const UV _Perl_WB_invlist[] = { 0x11EE0, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -96870,9 +97726,11 @@ static const UV _Perl_WB_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, 0x13430, - 0x13439, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -96928,6 +97786,8 @@ static const UV _Perl_WB_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1BC00, @@ -97034,6 +97894,8 @@ static const UV _Perl_WB_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -97044,6 +97906,10 @@ static const UV _Perl_WB_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -97060,6 +97926,10 @@ static const UV _Perl_WB_invlist[] = { 0x1E2EC, 0x1E2F0, 0x1E2FA, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -97697,6 +98567,7 @@ static const WB_enum _Perl_WB_invmap[] = WB_Numeric, WB_Other, WB_ALetter, + WB_Extend, WB_Other, WB_Extend, WB_ALetter, @@ -98602,6 +99473,7 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_ALetter, WB_Other, + WB_Extend, WB_ALetter, WB_Other, WB_ALetter, @@ -98674,6 +99546,8 @@ static const WB_enum _Perl_WB_invmap[] = WB_Extend, WB_Other, WB_Extend, + WB_ALetter, + WB_Extend, WB_Other, WB_ALetter, WB_Other, @@ -98871,7 +99745,17 @@ static const WB_enum _Perl_WB_invmap[] = WB_ALetter, WB_Extend, WB_Other, + WB_Extend, + WB_ALetter, + WB_Extend, + WB_ALetter, + WB_Other, WB_ALetter, + WB_Extend, + WB_Other, + WB_Extend, + WB_Other, + WB_Numeric, WB_Other, WB_ALetter, WB_Other, @@ -98883,7 +99767,11 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_ALetter, WB_Other, + WB_ALetter, WB_Format, + WB_Extend, + WB_ALetter, + WB_Extend, WB_Other, WB_ALetter, WB_Other, @@ -98942,6 +99830,8 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_Katakana, WB_Other, + WB_Katakana, + WB_Other, WB_ALetter, WB_Other, WB_ALetter, @@ -99046,6 +99936,10 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_ALetter, WB_Other, + WB_ALetter, + WB_Other, + WB_Extend, + WB_Other, WB_Extend, WB_Other, WB_Extend, @@ -99054,6 +99948,8 @@ static const WB_enum _Perl_WB_invmap[] = WB_Other, WB_Extend, WB_Other, + WB_ALetter, + WB_Other, WB_Extend, WB_Other, WB_ALetter, @@ -99073,6 +99969,10 @@ static const WB_enum _Perl_WB_invmap[] = WB_Numeric, WB_Other, WB_ALetter, + WB_Extend, + WB_Numeric, + WB_Other, + WB_ALetter, WB_Other, WB_ALetter, WB_Other, @@ -127432,7 +128332,7 @@ static const UV UNI_ASCII_invlist[] = { # endif /* EBCDIC 037 */ static const UV UNI_ASSIGNED_invlist[] = { /* for all charsets */ - 1396, /* Number of elements */ + 1414, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -127679,7 +128579,7 @@ static const UV UNI_ASSIGNED_invlist[] = 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -127739,7 +128639,7 @@ static const UV UNI_ASSIGNED_invlist[] = 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -128280,7 +129180,7 @@ static const UV UNI_ASSIGNED_invlist[] = 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -128315,7 +129215,7 @@ static const UV UNI_ASSIGNED_invlist[] = 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -128420,6 +129320,8 @@ static const UV UNI_ASSIGNED_invlist[] = 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -128462,6 +129364,12 @@ static const UV UNI_ASSIGNED_invlist[] = 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -128477,9 +129385,7 @@ static const UV UNI_ASSIGNED_invlist[] = 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -128532,8 +129438,12 @@ static const UV UNI_ASSIGNED_invlist[] = 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -128562,6 +129472,8 @@ static const UV UNI_ASSIGNED_invlist[] = 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -128616,6 +129528,8 @@ static const UV UNI_ASSIGNED_invlist[] = 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -128626,6 +129540,10 @@ static const UV UNI_ASSIGNED_invlist[] = 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -128640,6 +129558,8 @@ static const UV UNI_ASSIGNED_invlist[] = 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -128756,14 +129676,14 @@ static const UV UNI_ASSIGNED_invlist[] = 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -128785,23 +129705,19 @@ static const UV UNI_ASSIGNED_invlist[] = 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -128811,7 +129727,7 @@ static const UV UNI_ASSIGNED_invlist[] = 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -128822,6 +129738,8 @@ static const UV UNI_ASSIGNED_invlist[] = 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -128837,7 +129755,7 @@ static const UV UNI_ASSIGNED_invlist[] = # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_CASED_invlist[] = { /* for ASCII/Latin1 */ - 311, /* Number of elements */ + 315, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -128904,7 +129822,7 @@ static const UV UNI_CASED_invlist[] = { 0x10CE, 0x10D0, 0x10FB, - 0x10FD, + 0x10FC, 0x1100, 0x13A0, 0x13F6, @@ -129024,14 +129942,14 @@ static const UV UNI_CASED_invlist[] = { 0xA7D4, 0xA7D5, 0xA7DA, - 0xA7F5, + 0xA7F2, 0xA7F7, 0xA7F8, 0xA7FB, 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, + 0xAB6A, 0xAB70, 0xABC0, 0xFB00, @@ -129144,6 +130062,10 @@ static const UV UNI_CASED_invlist[] = { 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E900, 0x1E944, 0x1F130, @@ -129162,7 +130084,7 @@ static const UV UNI_CASED_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_CASED_invlist[] = { /* for EBCDIC 1047 */ - 337, /* Number of elements */ + 341, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -129255,7 +130177,7 @@ static const UV UNI_CASED_invlist[] = { 0x10CE, 0x10D0, 0x10FB, - 0x10FD, + 0x10FC, 0x1100, 0x13A0, 0x13F6, @@ -129375,14 +130297,14 @@ static const UV UNI_CASED_invlist[] = { 0xA7D4, 0xA7D5, 0xA7DA, - 0xA7F5, + 0xA7F2, 0xA7F7, 0xA7F8, 0xA7FB, 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, + 0xAB6A, 0xAB70, 0xABC0, 0xFB00, @@ -129495,6 +130417,10 @@ static const UV UNI_CASED_invlist[] = { 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E900, 0x1E944, 0x1F130, @@ -129513,7 +130439,7 @@ static const UV UNI_CASED_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_CASED_invlist[] = { /* for EBCDIC 037 */ - 333, /* Number of elements */ + 337, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -129602,7 +130528,7 @@ static const UV UNI_CASED_invlist[] = { 0x10CE, 0x10D0, 0x10FB, - 0x10FD, + 0x10FC, 0x1100, 0x13A0, 0x13F6, @@ -129722,14 +130648,14 @@ static const UV UNI_CASED_invlist[] = { 0xA7D4, 0xA7D5, 0xA7DA, - 0xA7F5, + 0xA7F2, 0xA7F7, 0xA7F8, 0xA7FB, 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, + 0xAB6A, 0xAB70, 0xABC0, 0xFB00, @@ -129842,6 +130768,10 @@ static const UV UNI_CASED_invlist[] = { 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E900, 0x1E944, 0x1F130, @@ -129857,7 +130787,7 @@ static const UV UNI_CASED_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_CASEDLETTER_invlist[] = { /* for ASCII/Latin1 */ - 285, /* Number of elements */ + 287, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -130144,6 +131074,8 @@ static const UV UNI_CASEDLETTER_invlist[ 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E900, 0x1E944 }; @@ -130156,7 +131088,7 @@ static const UV UNI_CASEDLETTER_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_CASEDLETTER_invlist[] = { /* for EBCDIC 1047 */ - 317, /* Number of elements */ + 319, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -130475,6 +131407,8 @@ static const UV UNI_CASEDLETTER_invlist[ 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E900, 0x1E944 }; @@ -130487,7 +131421,7 @@ static const UV UNI_CASEDLETTER_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_CASEDLETTER_invlist[] = { /* for EBCDIC 037 */ - 313, /* Number of elements */ + 315, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -130802,6 +131736,8 @@ static const UV UNI_CASEDLETTER_invlist[ 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E900, 0x1E944 }; @@ -130811,7 +131747,7 @@ static const UV UNI_CASEDLETTER_invlist[ # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LOWERCASELETTER_invlist[] = { /* for ASCII/Latin1 */ - 1315, /* Number of elements */ + 1317, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -132128,6 +133064,8 @@ static const UV UNI_LOWERCASELETTER_invl 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E922, 0x1E944 }; @@ -132140,7 +133078,7 @@ static const UV UNI_LOWERCASELETTER_invl && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LOWERCASELETTER_invlist[] = { /* for EBCDIC 1047 */ - 1329, /* Number of elements */ + 1331, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -133471,6 +134409,8 @@ static const UV UNI_LOWERCASELETTER_invl 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E922, 0x1E944 }; @@ -133483,7 +134423,7 @@ static const UV UNI_LOWERCASELETTER_invl && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LOWERCASELETTER_invlist[] = { /* for EBCDIC 037 */ - 1329, /* Number of elements */ + 1331, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -134814,6 +135754,8 @@ static const UV UNI_LOWERCASELETTER_invl 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E922, 0x1E944 }; @@ -139824,7 +140766,7 @@ static const UV UNI_VERTSPACE_invlist[] # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_XPOSIXALNUM_invlist[] = { /* for ASCII/Latin1 */ - 1521, /* Number of elements */ + 1545, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -140106,8 +141048,6 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0xBE6, 0xBF0, 0xC00, - 0xC04, - 0xC05, 0xC0D, 0xC0E, 0xC11, @@ -140158,7 +141098,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -140244,7 +141184,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0xF49, 0xF6D, 0xF71, - 0xF82, + 0xF84, 0xF88, 0xF98, 0xF99, @@ -140863,7 +141803,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x11070, 0x11071, 0x11076, - 0x11082, + 0x11080, 0x110B9, 0x110C2, 0x110C3, @@ -140896,7 +141836,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x11237, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -141075,6 +142015,14 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F41, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -141086,7 +142034,9 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -141139,8 +142089,12 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -141219,6 +142173,8 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1D800, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -141229,6 +142185,10 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E137, @@ -141243,6 +142203,10 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1E2EC, 0x1E2F0, 0x1E2FA, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -141338,7 +142302,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -141348,7 +142312,9 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -141359,7 +142325,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_XPOSIXALNUM_invlist[] = { /* for EBCDIC 1047 */ - 1545, /* Number of elements */ + 1569, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -141665,8 +142631,6 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0xBE6, 0xBF0, 0xC00, - 0xC04, - 0xC05, 0xC0D, 0xC0E, 0xC11, @@ -141717,7 +142681,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -141803,7 +142767,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0xF49, 0xF6D, 0xF71, - 0xF82, + 0xF84, 0xF88, 0xF98, 0xF99, @@ -142422,7 +143386,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x11070, 0x11071, 0x11076, - 0x11082, + 0x11080, 0x110B9, 0x110C2, 0x110C3, @@ -142455,7 +143419,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x11237, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -142634,6 +143598,14 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F41, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -142645,7 +143617,9 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -142698,8 +143672,12 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -142778,6 +143756,8 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1D800, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -142788,6 +143768,10 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E137, @@ -142802,6 +143786,10 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1E2EC, 0x1E2F0, 0x1E2FA, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -142897,7 +143885,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -142907,7 +143895,9 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -142918,7 +143908,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_XPOSIXALNUM_invlist[] = { /* for EBCDIC 037 */ - 1541, /* Number of elements */ + 1565, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -143220,8 +144210,6 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0xBE6, 0xBF0, 0xC00, - 0xC04, - 0xC05, 0xC0D, 0xC0E, 0xC11, @@ -143272,7 +144260,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -143358,7 +144346,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0xF49, 0xF6D, 0xF71, - 0xF82, + 0xF84, 0xF88, 0xF98, 0xF99, @@ -143977,7 +144965,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x11070, 0x11071, 0x11076, - 0x11082, + 0x11080, 0x110B9, 0x110C2, 0x110C3, @@ -144010,7 +144998,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x11237, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -144189,6 +145177,14 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F41, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -144200,7 +145196,9 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -144253,8 +145251,12 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -144333,6 +145335,8 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1D800, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -144343,6 +145347,10 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E137, @@ -144357,6 +145365,10 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x1E2EC, 0x1E2F0, 0x1E2FA, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -144452,7 +145464,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -144462,7 +145474,9 @@ static const UV UNI_XPOSIXALNUM_invlist[ 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -144470,7 +145484,7 @@ static const UV UNI_XPOSIXALNUM_invlist[ # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_XPOSIXALPHA_invlist[] = { /* for ASCII/Latin1 */ - 1445, /* Number of elements */ + 1465, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -144744,8 +145758,6 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0xBD7, 0xBD8, 0xC00, - 0xC04, - 0xC05, 0xC0D, 0xC0E, 0xC11, @@ -144792,7 +145804,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0xCE0, 0xCE4, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -144868,7 +145880,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0xF49, 0xF6D, 0xF71, - 0xF82, + 0xF84, 0xF88, 0xF98, 0xF99, @@ -145471,7 +146483,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x11046, 0x11071, 0x11076, - 0x11082, + 0x11080, 0x110B9, 0x110C2, 0x110C3, @@ -145502,7 +146514,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x11237, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -145661,6 +146673,12 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x11D99, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F41, 0x11FB0, 0x11FB1, 0x12000, @@ -145672,7 +146690,9 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -145719,8 +146739,12 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -145797,6 +146821,8 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -145807,6 +146833,10 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E137, @@ -145817,6 +146847,8 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -145908,7 +146940,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -145918,7 +146950,9 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -145929,7 +146963,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_XPOSIXALPHA_invlist[] = { /* for EBCDIC 1047 */ - 1471, /* Number of elements */ + 1491, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -146229,8 +147263,6 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0xBD7, 0xBD8, 0xC00, - 0xC04, - 0xC05, 0xC0D, 0xC0E, 0xC11, @@ -146277,7 +147309,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0xCE0, 0xCE4, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -146353,7 +147385,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0xF49, 0xF6D, 0xF71, - 0xF82, + 0xF84, 0xF88, 0xF98, 0xF99, @@ -146956,7 +147988,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x11046, 0x11071, 0x11076, - 0x11082, + 0x11080, 0x110B9, 0x110C2, 0x110C3, @@ -146987,7 +148019,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x11237, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -147146,6 +148178,12 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x11D99, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F41, 0x11FB0, 0x11FB1, 0x12000, @@ -147157,7 +148195,9 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -147204,8 +148244,12 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -147282,6 +148326,8 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -147292,6 +148338,10 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E137, @@ -147302,6 +148352,8 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -147393,7 +148445,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -147403,7 +148455,9 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -147414,7 +148468,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_XPOSIXALPHA_invlist[] = { /* for EBCDIC 037 */ - 1467, /* Number of elements */ + 1487, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -147710,8 +148764,6 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0xBD7, 0xBD8, 0xC00, - 0xC04, - 0xC05, 0xC0D, 0xC0E, 0xC11, @@ -147758,7 +148810,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0xCE0, 0xCE4, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -147834,7 +148886,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0xF49, 0xF6D, 0xF71, - 0xF82, + 0xF84, 0xF88, 0xF98, 0xF99, @@ -148437,7 +149489,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x11046, 0x11071, 0x11076, - 0x11082, + 0x11080, 0x110B9, 0x110C2, 0x110C3, @@ -148468,7 +149520,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x11237, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -148627,6 +149679,12 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x11D99, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F41, 0x11FB0, 0x11FB1, 0x12000, @@ -148638,7 +149696,9 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -148685,8 +149745,12 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -148763,6 +149827,8 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -148773,6 +149839,10 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E137, @@ -148783,6 +149853,8 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -148874,7 +149946,7 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -148884,7 +149956,9 @@ static const UV UNI_XPOSIXALPHA_invlist[ 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -149029,7 +150103,7 @@ static const UV UNI_XPOSIXCNTRL_invlist[ # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_XPOSIXDIGIT_invlist[] = { /* for ASCII/Latin1 */ - 125, /* Number of elements */ + 129, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -149142,6 +150216,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[ 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -149154,6 +150230,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[ 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -149168,7 +150246,7 @@ static const UV UNI_XPOSIXDIGIT_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_XPOSIXDIGIT_invlist[] = { /* for EBCDIC 1047 */ - 125, /* Number of elements */ + 129, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -149281,6 +150359,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[ 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -149293,6 +150373,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[ 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -149307,7 +150389,7 @@ static const UV UNI_XPOSIXDIGIT_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_XPOSIXDIGIT_invlist[] = { /* for EBCDIC 037 */ - 125, /* Number of elements */ + 129, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -149420,6 +150502,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[ 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -149432,6 +150516,8 @@ static const UV UNI_XPOSIXDIGIT_invlist[ 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -149443,7 +150529,7 @@ static const UV UNI_XPOSIXDIGIT_invlist[ # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_XPOSIXGRAPH_invlist[] = { /* for ASCII/Latin1 */ - 1407, /* Number of elements */ + 1425, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -149693,7 +150779,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -149753,7 +150839,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -150302,7 +151388,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -150337,7 +151423,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -150442,6 +151528,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -150484,6 +151572,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -150499,9 +151593,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -150554,8 +151646,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -150584,6 +151680,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -150638,6 +151736,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -150648,6 +151748,10 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -150662,6 +151766,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -150778,14 +151884,14 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -150807,23 +151913,19 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -150833,7 +151935,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -150844,6 +151946,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -150864,7 +151968,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_XPOSIXGRAPH_invlist[] = { /* for EBCDIC 1047 */ - 1407, /* Number of elements */ + 1425, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -151114,7 +152218,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -151174,7 +152278,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -151723,7 +152827,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -151758,7 +152862,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -151863,6 +152967,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -151905,6 +153011,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -151920,9 +153032,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -151975,8 +153085,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -152005,6 +153119,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -152059,6 +153175,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -152069,6 +153187,10 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -152083,6 +153205,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -152199,14 +153323,14 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -152228,23 +153352,19 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -152254,7 +153374,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -152265,6 +153385,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -152285,7 +153407,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_XPOSIXGRAPH_invlist[] = { /* for EBCDIC 037 */ - 1407, /* Number of elements */ + 1425, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -152535,7 +153657,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -152595,7 +153717,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -153144,7 +154266,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -153179,7 +154301,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -153284,6 +154406,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -153326,6 +154450,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -153341,9 +154471,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -153396,8 +154524,12 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -153426,6 +154558,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -153480,6 +154614,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -153490,6 +154626,10 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -153504,6 +154644,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -153620,14 +154762,14 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -153649,23 +154791,19 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -153675,7 +154813,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -153686,6 +154824,8 @@ static const UV UNI_XPOSIXGRAPH_invlist[ 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -153703,7 +154843,7 @@ static const UV UNI_XPOSIXGRAPH_invlist[ # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_XPOSIXLOWER_invlist[] = { /* for ASCII/Latin1 */ - 1337, /* Number of elements */ + 1343, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -154260,7 +155400,7 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0x589, 0x10D0, 0x10FB, - 0x10FD, + 0x10FC, 0x1100, 0x13F8, 0x13FE, @@ -154940,6 +156080,8 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0xA7D8, 0xA7D9, 0xA7DA, + 0xA7F2, + 0xA7F5, 0xA7F6, 0xA7F7, 0xA7F8, @@ -154947,7 +156089,7 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, + 0xAB6A, 0xAB70, 0xABC0, 0xFB00, @@ -155042,6 +156184,10 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E922, 0x1E944 }; @@ -155054,7 +156200,7 @@ static const UV UNI_XPOSIXLOWER_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_XPOSIXLOWER_invlist[] = { /* for EBCDIC 1047 */ - 1345, /* Number of elements */ + 1351, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -155619,7 +156765,7 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0x589, 0x10D0, 0x10FB, - 0x10FD, + 0x10FC, 0x1100, 0x13F8, 0x13FE, @@ -156299,6 +157445,8 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0xA7D8, 0xA7D9, 0xA7DA, + 0xA7F2, + 0xA7F5, 0xA7F6, 0xA7F7, 0xA7F8, @@ -156306,7 +157454,7 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, + 0xAB6A, 0xAB70, 0xABC0, 0xFB00, @@ -156401,6 +157549,10 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E922, 0x1E944 }; @@ -156413,7 +157565,7 @@ static const UV UNI_XPOSIXLOWER_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_XPOSIXLOWER_invlist[] = { /* for EBCDIC 037 */ - 1345, /* Number of elements */ + 1351, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -156978,7 +158130,7 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0x589, 0x10D0, 0x10FB, - 0x10FD, + 0x10FC, 0x1100, 0x13F8, 0x13FE, @@ -157658,6 +158810,8 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0xA7D8, 0xA7D9, 0xA7DA, + 0xA7F2, + 0xA7F5, 0xA7F6, 0xA7F7, 0xA7F8, @@ -157665,7 +158819,7 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, + 0xAB6A, 0xAB70, 0xABC0, 0xFB00, @@ -157760,6 +158914,10 @@ static const UV UNI_XPOSIXLOWER_invlist[ 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E922, 0x1E944 }; @@ -157769,7 +158927,7 @@ static const UV UNI_XPOSIXLOWER_invlist[ # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_XPOSIXPRINT_invlist[] = { /* for ASCII/Latin1 */ - 1401, /* Number of elements */ + 1419, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -158019,7 +159177,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -158079,7 +159237,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -158622,7 +159780,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -158657,7 +159815,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -158762,6 +159920,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -158804,6 +159964,12 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -158819,9 +159985,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -158874,8 +160038,12 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -158904,6 +160072,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -158958,6 +160128,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -158968,6 +160140,10 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -158982,6 +160158,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -159098,14 +160276,14 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -159127,23 +160305,19 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -159153,7 +160327,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -159164,6 +160338,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -159184,7 +160360,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_XPOSIXPRINT_invlist[] = { /* for EBCDIC 1047 */ - 1401, /* Number of elements */ + 1419, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -159434,7 +160610,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -159494,7 +160670,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -160037,7 +161213,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -160072,7 +161248,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -160177,6 +161353,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -160219,6 +161397,12 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -160234,9 +161418,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -160289,8 +161471,12 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -160319,6 +161505,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -160373,6 +161561,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -160383,6 +161573,10 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -160397,6 +161591,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -160513,14 +161709,14 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -160542,23 +161738,19 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -160568,7 +161760,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -160579,6 +161771,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -160599,7 +161793,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_XPOSIXPRINT_invlist[] = { /* for EBCDIC 037 */ - 1401, /* Number of elements */ + 1419, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -160849,7 +162043,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -160909,7 +162103,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -161452,7 +162646,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -161487,7 +162681,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -161592,6 +162786,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -161634,6 +162830,12 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -161649,9 +162851,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -161704,8 +162904,12 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -161734,6 +162938,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -161788,6 +162994,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -161798,6 +163006,10 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -161812,6 +163024,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -161928,14 +163142,14 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -161957,23 +163171,19 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -161983,7 +163193,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -161994,6 +163204,8 @@ static const UV UNI_XPOSIXPRINT_invlist[ 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -162011,7 +163223,7 @@ static const UV UNI_XPOSIXPRINT_invlist[ # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_XPOSIXPUNCT_invlist[] = { /* for ASCII/Latin1 */ - 369, /* Number of elements */ + 373, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -162354,12 +163566,16 @@ static const UV UNI_XPOSIXPUNCT_invlist[ 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C70, 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FFF, 0x12000, 0x12470, @@ -162394,7 +163610,7 @@ static const UV UNI_XPOSIXPUNCT_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_XPOSIXPUNCT_invlist[] = { /* for EBCDIC 1047 */ - 377, /* Number of elements */ + 381, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -162745,12 +163961,16 @@ static const UV UNI_XPOSIXPUNCT_invlist[ 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C70, 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FFF, 0x12000, 0x12470, @@ -162785,7 +164005,7 @@ static const UV UNI_XPOSIXPUNCT_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_XPOSIXPUNCT_invlist[] = { /* for EBCDIC 037 */ - 379, /* Number of elements */ + 383, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -163138,12 +164358,16 @@ static const UV UNI_XPOSIXPUNCT_invlist[ 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C70, 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FFF, 0x12000, 0x12470, @@ -167261,7 +168485,7 @@ static const UV UNI_XPOSIXUPPER_invlist[ # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_XPOSIXWORD_invlist[] = { /* for ASCII/Latin1 */ - 1519, /* Number of elements */ + 1543, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -167581,7 +168805,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -167647,7 +168871,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -168274,7 +169498,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -168321,7 +169545,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -168482,6 +169706,14 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -168493,7 +169725,9 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -168548,8 +169782,12 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -168656,6 +169894,8 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -168666,6 +169906,10 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -168678,6 +169922,8 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -168771,7 +170017,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -168782,6 +170028,8 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -168794,7 +170042,7 @@ static const UV UNI_XPOSIXWORD_invlist[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_XPOSIXWORD_invlist[] = { /* for EBCDIC 1047 */ - 1543, /* Number of elements */ + 1567, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -169138,7 +170386,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -169204,7 +170452,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -169831,7 +171079,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -169878,7 +171126,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -170039,6 +171287,14 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -170050,7 +171306,9 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -170105,8 +171363,12 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -170213,6 +171475,8 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -170223,6 +171487,10 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -170235,6 +171503,8 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -170328,7 +171598,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -170339,6 +171609,8 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -170351,7 +171623,7 @@ static const UV UNI_XPOSIXWORD_invlist[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_XPOSIXWORD_invlist[] = { /* for EBCDIC 037 */ - 1539, /* Number of elements */ + 1563, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -170691,7 +171963,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -170757,7 +172029,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -171384,7 +172656,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -171431,7 +172703,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -171592,6 +172864,14 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -171603,7 +172883,9 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -171658,8 +172940,12 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -171766,6 +173052,8 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -171776,6 +173064,10 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -171788,6 +173080,8 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -171881,7 +173175,7 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -171892,6 +173186,8 @@ static const UV UNI_XPOSIXWORD_invlist[] 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -172927,7 +174223,7 @@ static const UV UNI__PERL_ANY_FOLDS_invl # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = { /* for ASCII/Latin1 */ - 1309, /* Number of elements */ + 1331, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -173882,6 +175178,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -174006,6 +175304,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -174015,7 +175319,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -174060,8 +175366,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -174136,6 +175446,10 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -174146,6 +175460,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -174229,7 +175545,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -174239,7 +175555,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -174250,7 +175568,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = { /* for EBCDIC 1047 */ - 1335, /* Number of elements */ + 1357, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -175231,6 +176549,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -175355,6 +176675,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -175364,7 +176690,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -175409,8 +176737,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -175485,6 +176817,10 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -175495,6 +176831,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -175578,7 +176916,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -175588,7 +176926,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -175599,7 +176939,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI__PERL_CHARNAME_BEGIN_invlist[] = { /* for EBCDIC 037 */ - 1331, /* Number of elements */ + 1353, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -176576,6 +177916,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -176700,6 +178042,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -176709,7 +178057,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -176754,8 +178104,12 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -176830,6 +178184,10 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -176840,6 +178198,8 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -176923,7 +178283,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -176933,7 +178293,9 @@ static const UV UNI__PERL_CHARNAME_BEGIN 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -176941,7 +178303,7 @@ static const UV UNI__PERL_CHARNAME_BEGIN # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = { /* for ASCII/Latin1 */ - 1533, /* Number of elements */ + 1557, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -177269,7 +178631,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -177335,7 +178697,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -177974,7 +179336,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -178021,7 +179383,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -178182,6 +179544,14 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -178193,7 +179563,9 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -178248,8 +179620,12 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -178356,6 +179732,8 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -178366,6 +179744,10 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -178378,6 +179760,8 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -178465,7 +179849,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -178476,6 +179860,8 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -178488,7 +179874,7 @@ static const UV UNI__PERL_CHARNAME_CONTI && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = { /* for EBCDIC 1047 */ - 1559, /* Number of elements */ + 1583, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -178842,7 +180228,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -178908,7 +180294,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -179547,7 +180933,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -179594,7 +180980,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -179755,6 +181141,14 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -179766,7 +181160,9 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -179821,8 +181217,12 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -179929,6 +181329,8 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -179939,6 +181341,10 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -179951,6 +181357,8 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -180038,7 +181446,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -180049,6 +181457,8 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -180061,7 +181471,7 @@ static const UV UNI__PERL_CHARNAME_CONTI && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI__PERL_CHARNAME_CONTINUE_invlist[] = { /* for EBCDIC 037 */ - 1555, /* Number of elements */ + 1579, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -180411,7 +181821,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -180477,7 +181887,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -181116,7 +182526,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -181163,7 +182573,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -181324,6 +182734,14 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -181335,7 +182753,9 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -181390,8 +182810,12 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -181498,6 +182922,8 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -181508,6 +182934,10 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -181520,6 +182950,8 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -181607,7 +183039,7 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -181618,6 +183050,8 @@ static const UV UNI__PERL_CHARNAME_CONTI 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -181843,7 +183277,7 @@ static const UV UNI__PERL_FOLDS_TO_MULTI # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI__PERL_IDCONT_invlist[] = { /* for ASCII/Latin1 */ - 1527, /* Number of elements */ + 1551, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -182165,7 +183599,7 @@ static const UV UNI__PERL_IDCONT_invlist 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -182231,7 +183665,7 @@ static const UV UNI__PERL_IDCONT_invlist 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -182870,7 +184304,7 @@ static const UV UNI__PERL_IDCONT_invlist 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -182917,7 +184351,7 @@ static const UV UNI__PERL_IDCONT_invlist 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -183078,6 +184512,14 @@ static const UV UNI__PERL_IDCONT_invlist 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -183089,7 +184531,9 @@ static const UV UNI__PERL_IDCONT_invlist 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -183144,8 +184588,12 @@ static const UV UNI__PERL_IDCONT_invlist 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -183252,6 +184700,8 @@ static const UV UNI__PERL_IDCONT_invlist 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -183262,6 +184712,10 @@ static const UV UNI__PERL_IDCONT_invlist 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -183274,6 +184728,8 @@ static const UV UNI__PERL_IDCONT_invlist 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -183361,7 +184817,7 @@ static const UV UNI__PERL_IDCONT_invlist 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -183372,6 +184828,8 @@ static const UV UNI__PERL_IDCONT_invlist 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -183384,7 +184842,7 @@ static const UV UNI__PERL_IDCONT_invlist && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI__PERL_IDCONT_invlist[] = { /* for EBCDIC 1047 */ - 1551, /* Number of elements */ + 1575, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -183730,7 +185188,7 @@ static const UV UNI__PERL_IDCONT_invlist 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -183796,7 +185254,7 @@ static const UV UNI__PERL_IDCONT_invlist 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -184435,7 +185893,7 @@ static const UV UNI__PERL_IDCONT_invlist 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -184482,7 +185940,7 @@ static const UV UNI__PERL_IDCONT_invlist 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -184643,6 +186101,14 @@ static const UV UNI__PERL_IDCONT_invlist 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -184654,7 +186120,9 @@ static const UV UNI__PERL_IDCONT_invlist 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -184709,8 +186177,12 @@ static const UV UNI__PERL_IDCONT_invlist 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -184817,6 +186289,8 @@ static const UV UNI__PERL_IDCONT_invlist 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -184827,6 +186301,10 @@ static const UV UNI__PERL_IDCONT_invlist 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -184839,6 +186317,8 @@ static const UV UNI__PERL_IDCONT_invlist 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -184926,7 +186406,7 @@ static const UV UNI__PERL_IDCONT_invlist 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -184937,6 +186417,8 @@ static const UV UNI__PERL_IDCONT_invlist 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -184949,7 +186431,7 @@ static const UV UNI__PERL_IDCONT_invlist && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI__PERL_IDCONT_invlist[] = { /* for EBCDIC 037 */ - 1547, /* Number of elements */ + 1571, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -185291,7 +186773,7 @@ static const UV UNI__PERL_IDCONT_invlist 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -185357,7 +186839,7 @@ static const UV UNI__PERL_IDCONT_invlist 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -185996,7 +187478,7 @@ static const UV UNI__PERL_IDCONT_invlist 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -186043,7 +187525,7 @@ static const UV UNI__PERL_IDCONT_invlist 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -186204,6 +187686,14 @@ static const UV UNI__PERL_IDCONT_invlist 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -186215,7 +187705,9 @@ static const UV UNI__PERL_IDCONT_invlist 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -186270,8 +187762,12 @@ static const UV UNI__PERL_IDCONT_invlist 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -186378,6 +187874,8 @@ static const UV UNI__PERL_IDCONT_invlist 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -186388,6 +187886,10 @@ static const UV UNI__PERL_IDCONT_invlist 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -186400,6 +187902,8 @@ static const UV UNI__PERL_IDCONT_invlist 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -186487,7 +187991,7 @@ static const UV UNI__PERL_IDCONT_invlist 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -186498,6 +188002,8 @@ static const UV UNI__PERL_IDCONT_invlist 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -186507,7 +188013,7 @@ static const UV UNI__PERL_IDCONT_invlist # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI__PERL_IDSTART_invlist[] = { /* for ASCII/Latin1 */ - 1315, /* Number of elements */ + 1337, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -187466,6 +188972,8 @@ static const UV UNI__PERL_IDSTART_invlis 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -187590,6 +189098,12 @@ static const UV UNI__PERL_IDSTART_invlis 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -187601,7 +189115,9 @@ static const UV UNI__PERL_IDSTART_invlis 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -187646,8 +189162,12 @@ static const UV UNI__PERL_IDSTART_invlis 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -187722,6 +189242,10 @@ static const UV UNI__PERL_IDSTART_invlis 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -187732,6 +189256,8 @@ static const UV UNI__PERL_IDSTART_invlis 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -187815,7 +189341,7 @@ static const UV UNI__PERL_IDSTART_invlis 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -187825,7 +189351,9 @@ static const UV UNI__PERL_IDSTART_invlis 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -187836,7 +189364,7 @@ static const UV UNI__PERL_IDSTART_invlis && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI__PERL_IDSTART_invlist[] = { /* for EBCDIC 1047 */ - 1341, /* Number of elements */ + 1363, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -188821,6 +190349,8 @@ static const UV UNI__PERL_IDSTART_invlis 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -188945,6 +190475,12 @@ static const UV UNI__PERL_IDSTART_invlis 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -188956,7 +190492,9 @@ static const UV UNI__PERL_IDSTART_invlis 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -189001,8 +190539,12 @@ static const UV UNI__PERL_IDSTART_invlis 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -189077,6 +190619,10 @@ static const UV UNI__PERL_IDSTART_invlis 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -189087,6 +190633,8 @@ static const UV UNI__PERL_IDSTART_invlis 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -189170,7 +190718,7 @@ static const UV UNI__PERL_IDSTART_invlis 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -189180,7 +190728,9 @@ static const UV UNI__PERL_IDSTART_invlis 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -189191,7 +190741,7 @@ static const UV UNI__PERL_IDSTART_invlis && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI__PERL_IDSTART_invlist[] = { /* for EBCDIC 037 */ - 1337, /* Number of elements */ + 1359, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -190172,6 +191722,8 @@ static const UV UNI__PERL_IDSTART_invlis 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -190296,6 +191848,12 @@ static const UV UNI__PERL_IDSTART_invlis 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -190307,7 +191865,9 @@ static const UV UNI__PERL_IDSTART_invlis 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -190352,8 +191912,12 @@ static const UV UNI__PERL_IDSTART_invlis 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -190428,6 +191992,10 @@ static const UV UNI__PERL_IDSTART_invlis 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -190438,6 +192006,8 @@ static const UV UNI__PERL_IDSTART_invlis 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -190521,7 +192091,7 @@ static const UV UNI__PERL_IDSTART_invlis 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -190531,7 +192101,9 @@ static const UV UNI__PERL_IDSTART_invlis 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -191851,6 +193423,78 @@ static const UV UNI_AGE__14_invlist[] = 0x2B739 }; +static const UV UNI_AGE__15_invlist[] = { /* for all charsets */ + 65, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0xCF3, + 0xCF4, + 0xECE, + 0xECF, + 0x10EFD, + 0x10F00, + 0x1123F, + 0x11242, + 0x11B00, + 0x11B0A, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, + 0x1342F, + 0x13430, + 0x13439, + 0x13456, + 0x1B132, + 0x1B133, + 0x1B155, + 0x1B156, + 0x1D2C0, + 0x1D2D4, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, + 0x1E4D0, + 0x1E4FA, + 0x1F6DC, + 0x1F6DD, + 0x1F774, + 0x1F777, + 0x1F77B, + 0x1F780, + 0x1F7D9, + 0x1F7DA, + 0x1FA75, + 0x1FA78, + 0x1FA87, + 0x1FA89, + 0x1FAAD, + 0x1FAB0, + 0x1FABB, + 0x1FABE, + 0x1FABF, + 0x1FAC0, + 0x1FACE, + 0x1FAD0, + 0x1FADA, + 0x1FADC, + 0x1FAE8, + 0x1FAE9, + 0x1FAF7, + 0x1FAF9, + 0x2B739, + 0x2B73A, + 0x31350, + 0x323B0 +}; + static const UV UNI_AGE__2_invlist[] = { /* for all charsets */ 59, /* Number of elements */ 148565664, /* Version and data structure type */ @@ -194229,7 +195873,7 @@ static const UV UNI_ANY_invlist[] = { / }; static const UV UNI_ARAB_invlist[] = { /* for all charsets */ - 103, /* Number of elements */ + 105, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -194268,6 +195912,8 @@ static const UV UNI_ARAB_invlist[] = { 0x102FC, 0x10E60, 0x10E7F, + 0x10EFD, + 0x10F00, 0x1EE00, 0x1EE04, 0x1EE05, @@ -194358,6 +196004,16 @@ static const UV UNI_ARABICEXTB_invlist[] 0x8A0 }; +static const UV UNI_ARABICEXTC_invlist[] = { /* for all charsets */ + 3, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0x10EC0, + 0x10F00 +}; + static const UV UNI_ARABICMATH_invlist[] = { /* for all charsets */ 3, /* Number of elements */ 148565664, /* Version and data structure type */ @@ -194507,7 +196163,7 @@ static const UV UNI_BATK_invlist[] = { }; static const UV UNI_BC__AL_invlist[] = { /* for all charsets */ - 57, /* Number of elements */ + 59, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -194556,6 +196212,8 @@ static const UV UNI_BC__AL_invlist[] = { 0x10D30, 0x10D3A, 0x10D40, + 0x10EC0, + 0x10EFD, 0x10F30, 0x10F46, 0x10F51, @@ -195464,7 +197122,7 @@ static const UV UNI_BC__FSI_invlist[] = # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_BC__L_invlist[] = { /* for ASCII/Latin1 */ - 942, /* Number of elements */ + 956, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -195649,7 +197307,7 @@ static const UV UNI_BC__L_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -196100,6 +197758,8 @@ static const UV UNI_BC__L_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -196224,8 +197884,20 @@ static const UV UNI_BC__L_invlist[] = { 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x11FD5, 0x11FF2, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -196294,6 +197966,8 @@ static const UV UNI_BC__L_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, @@ -196302,6 +197976,8 @@ static const UV UNI_BC__L_invlist[] = { 0x1E2F0, 0x1E2FF, 0x1E300, + 0x1E4EC, + 0x1E4F0, 0x1E800, 0x1F02C, 0x1F030, @@ -196326,14 +198002,14 @@ static const UV UNI_BC__L_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -196355,23 +198031,19 @@ static const UV UNI_BC__L_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -196420,7 +198092,7 @@ static const UV UNI_BC__L_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_BC__L_invlist[] = { /* for EBCDIC 1047 */ - 968, /* Number of elements */ + 982, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -196631,7 +198303,7 @@ static const UV UNI_BC__L_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -197082,6 +198754,8 @@ static const UV UNI_BC__L_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -197206,8 +198880,20 @@ static const UV UNI_BC__L_invlist[] = { 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x11FD5, 0x11FF2, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -197276,6 +198962,8 @@ static const UV UNI_BC__L_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, @@ -197284,6 +198972,8 @@ static const UV UNI_BC__L_invlist[] = { 0x1E2F0, 0x1E2FF, 0x1E300, + 0x1E4EC, + 0x1E4F0, 0x1E800, 0x1F02C, 0x1F030, @@ -197308,14 +198998,14 @@ static const UV UNI_BC__L_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -197337,23 +199027,19 @@ static const UV UNI_BC__L_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -197402,7 +199088,7 @@ static const UV UNI_BC__L_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_BC__L_invlist[] = { /* for EBCDIC 037 */ - 964, /* Number of elements */ + 978, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -197609,7 +199295,7 @@ static const UV UNI_BC__L_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -198060,6 +199746,8 @@ static const UV UNI_BC__L_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -198184,8 +199872,20 @@ static const UV UNI_BC__L_invlist[] = { 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x11FD5, 0x11FF2, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -198254,6 +199954,8 @@ static const UV UNI_BC__L_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, @@ -198262,6 +199964,8 @@ static const UV UNI_BC__L_invlist[] = { 0x1E2F0, 0x1E2FF, 0x1E300, + 0x1E4EC, + 0x1E4F0, 0x1E800, 0x1F02C, 0x1F030, @@ -198286,14 +199990,14 @@ static const UV UNI_BC__L_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -198315,23 +200019,19 @@ static const UV UNI_BC__L_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -198405,7 +200105,7 @@ static const UV UNI_BC__LRO_invlist[] = }; static const UV UNI_BC__NSM_invlist[] = { /* for all charsets */ - 663, /* Number of elements */ + 683, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -198591,7 +200291,7 @@ static const UV UNI_BC__NSM_invlist[] = 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -198846,6 +200546,8 @@ static const UV UNI_BC__NSM_invlist[] = 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -198890,6 +200592,8 @@ static const UV UNI_BC__NSM_invlist[] = 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -199012,6 +200716,18 @@ static const UV UNI_BC__NSM_invlist[] = 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -199060,12 +200776,16 @@ static const UV UNI_BC__NSM_invlist[] = 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -199077,7 +200797,7 @@ static const UV UNI_BC__NSM_invlist[] = # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_BC__ON_invlist[] = { /* for ASCII/Latin1 */ - 383, /* Number of elements */ + 379, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -199414,14 +201134,14 @@ static const UV UNI_BC__ON_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -199443,23 +201163,19 @@ static const UV UNI_BC__ON_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -199474,7 +201190,7 @@ static const UV UNI_BC__ON_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_BC__ON_invlist[] = { /* for EBCDIC 1047 */ - 391, /* Number of elements */ + 387, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -199819,14 +201535,14 @@ static const UV UNI_BC__ON_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -199848,23 +201564,19 @@ static const UV UNI_BC__ON_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -199879,7 +201591,7 @@ static const UV UNI_BC__ON_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_BC__ON_invlist[] = { /* for EBCDIC 037 */ - 387, /* Number of elements */ + 383, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -200220,14 +201932,14 @@ static const UV UNI_BC__ON_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -200249,23 +201961,19 @@ static const UV UNI_BC__ON_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -200295,7 +202003,7 @@ static const UV UNI_BC__PDI_invlist[] = }; static const UV UNI_BC__R_invlist[] = { /* for all charsets */ - 79, /* Number of elements */ + 81, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -200361,6 +202069,8 @@ static const UV UNI_BC__R_invlist[] = { 0x10E7F, 0x10EAB, 0x10EAD, + 0x10EC0, + 0x10F00, 0x10F30, 0x10F70, 0x10F82, @@ -202567,7 +204277,7 @@ static const UV UNI_BYZANTINEMUSIC_invli # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_C_invlist[] = { /* for ASCII/Latin1 */ - 1401, /* Number of elements */ + 1423, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -202823,7 +204533,7 @@ static const UV UNI_C_invlist[] = { /* 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -202883,7 +204593,7 @@ static const UV UNI_C_invlist[] = { /* 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -203428,7 +205138,7 @@ static const UV UNI_C_invlist[] = { /* 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -203463,7 +205173,7 @@ static const UV UNI_C_invlist[] = { /* 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -203568,6 +205278,8 @@ static const UV UNI_C_invlist[] = { /* 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -203610,6 +205322,12 @@ static const UV UNI_C_invlist[] = { /* 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -203625,7 +205343,9 @@ static const UV UNI_C_invlist[] = { /* 0x12F90, 0x12FF3, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -203678,8 +205398,12 @@ static const UV UNI_C_invlist[] = { /* 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -203710,6 +205434,8 @@ static const UV UNI_C_invlist[] = { /* 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -203764,6 +205490,8 @@ static const UV UNI_C_invlist[] = { /* 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -203774,6 +205502,10 @@ static const UV UNI_C_invlist[] = { /* 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -203788,6 +205520,8 @@ static const UV UNI_C_invlist[] = { /* 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -203904,14 +205638,14 @@ static const UV UNI_C_invlist[] = { /* 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -203933,23 +205667,19 @@ static const UV UNI_C_invlist[] = { /* 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -203959,7 +205689,7 @@ static const UV UNI_C_invlist[] = { /* 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -203970,6 +205700,8 @@ static const UV UNI_C_invlist[] = { /* 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -203982,7 +205714,7 @@ static const UV UNI_C_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_C_invlist[] = { /* for EBCDIC 1047 */ - 1401, /* Number of elements */ + 1423, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -204238,7 +205970,7 @@ static const UV UNI_C_invlist[] = { /* 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -204298,7 +206030,7 @@ static const UV UNI_C_invlist[] = { /* 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -204843,7 +206575,7 @@ static const UV UNI_C_invlist[] = { /* 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -204878,7 +206610,7 @@ static const UV UNI_C_invlist[] = { /* 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -204983,6 +206715,8 @@ static const UV UNI_C_invlist[] = { /* 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -205025,6 +206759,12 @@ static const UV UNI_C_invlist[] = { /* 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -205040,7 +206780,9 @@ static const UV UNI_C_invlist[] = { /* 0x12F90, 0x12FF3, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -205093,8 +206835,12 @@ static const UV UNI_C_invlist[] = { /* 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -205125,6 +206871,8 @@ static const UV UNI_C_invlist[] = { /* 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -205179,6 +206927,8 @@ static const UV UNI_C_invlist[] = { /* 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -205189,6 +206939,10 @@ static const UV UNI_C_invlist[] = { /* 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -205203,6 +206957,8 @@ static const UV UNI_C_invlist[] = { /* 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -205319,14 +207075,14 @@ static const UV UNI_C_invlist[] = { /* 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -205348,23 +207104,19 @@ static const UV UNI_C_invlist[] = { /* 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -205374,7 +207126,7 @@ static const UV UNI_C_invlist[] = { /* 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -205385,6 +207137,8 @@ static const UV UNI_C_invlist[] = { /* 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -205397,7 +207151,7 @@ static const UV UNI_C_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_C_invlist[] = { /* for EBCDIC 037 */ - 1401, /* Number of elements */ + 1423, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -205653,7 +207407,7 @@ static const UV UNI_C_invlist[] = { /* 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -205713,7 +207467,7 @@ static const UV UNI_C_invlist[] = { /* 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -206258,7 +208012,7 @@ static const UV UNI_C_invlist[] = { /* 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -206293,7 +208047,7 @@ static const UV UNI_C_invlist[] = { /* 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -206398,6 +208152,8 @@ static const UV UNI_C_invlist[] = { /* 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -206440,6 +208196,12 @@ static const UV UNI_C_invlist[] = { /* 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -206455,7 +208217,9 @@ static const UV UNI_C_invlist[] = { /* 0x12F90, 0x12FF3, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -206508,8 +208272,12 @@ static const UV UNI_C_invlist[] = { /* 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -206540,6 +208308,8 @@ static const UV UNI_C_invlist[] = { /* 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -206594,6 +208364,8 @@ static const UV UNI_C_invlist[] = { /* 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -206604,6 +208376,10 @@ static const UV UNI_C_invlist[] = { /* 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -206618,6 +208394,8 @@ static const UV UNI_C_invlist[] = { /* 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -206734,14 +208512,14 @@ static const UV UNI_C_invlist[] = { /* 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -206763,23 +208541,19 @@ static const UV UNI_C_invlist[] = { /* 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -206789,7 +208563,7 @@ static const UV UNI_C_invlist[] = { /* 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -206800,6 +208574,8 @@ static const UV UNI_C_invlist[] = { /* 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -206847,7 +208623,7 @@ static const UV UNI_CARI_invlist[] = { }; static const UV UNI_CCC__0_invlist[] = { /* for all charsets */ - 377, /* Number of elements */ + 385, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -207116,6 +208892,8 @@ static const UV UNI_CCC__0_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -207188,6 +208966,8 @@ static const UV UNI_CCC__0_invlist[] = { 0x11D46, 0x11D97, 0x11D98, + 0x11F41, + 0x11F43, 0x16AF0, 0x16AF5, 0x16B30, @@ -207218,12 +208998,16 @@ static const UV UNI_CCC__0_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -207749,7 +209533,7 @@ static const UV UNI_CCC__84_invlist[] = }; static const UV UNI_CCC__9_invlist[] = { /* for all charsets */ - 111, /* Number of elements */ + 113, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -207863,7 +209647,9 @@ static const UV UNI_CCC__9_invlist[] = { 0x11D44, 0x11D46, 0x11D97, - 0x11D98 + 0x11D98, + 0x11F41, + 0x11F43 }; static const UV UNI_CCC__91_invlist[] = { /* for all charsets */ @@ -207877,7 +209663,7 @@ static const UV UNI_CCC__91_invlist[] = }; static const UV UNI_CCC__A_invlist[] = { /* for all charsets */ - 255, /* Number of elements */ + 259, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -208128,12 +209914,16 @@ static const UV UNI_CCC__A_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EF, + 0x1E4F0, 0x1E944, 0x1E94A }; @@ -208155,7 +209945,7 @@ static const UV UNI_CCC__AL_invlist[] = }; static const UV UNI_CCC__AR_invlist[] = { /* for all charsets */ - 11, /* Number of elements */ + 13, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -208169,11 +209959,13 @@ static const UV UNI_CCC__AR_invlist[] = 0x1DF6, 0x1DF7, 0x302C, - 0x302D + 0x302D, + 0x1E4EC, + 0x1E4EE }; static const UV UNI_CCC__B_invlist[] = { /* for all charsets */ - 167, /* Number of elements */ + 171, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -208328,6 +210120,8 @@ static const UV UNI_CCC__B_invlist[] = { 0x10A3B, 0x10AE6, 0x10AE7, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F48, 0x10F4B, @@ -208342,6 +210136,8 @@ static const UV UNI_CCC__B_invlist[] = { 0x1D183, 0x1D18A, 0x1D18C, + 0x1E4EE, + 0x1E4EF, 0x1E8D0, 0x1E8D7 }; @@ -208549,7 +210345,7 @@ static const UV UNI_CF_invlist[] = { /* 0x110CD, 0x110CE, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -208606,7 +210402,7 @@ static const UV UNI_CF_invlist[] = { /* 0x110CD, 0x110CE, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -208663,7 +210459,7 @@ static const UV UNI_CF_invlist[] = { /* 0x110CD, 0x110CE, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -208739,7 +210535,7 @@ static const UV UNI_CHRS_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_CI_invlist[] = { /* for ASCII/Latin1 */ - 855, /* Number of elements */ + 875, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -208971,7 +210767,7 @@ static const UV UNI_CI_invlist[] = { /* 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -209348,6 +211144,8 @@ static const UV UNI_CI_invlist[] = { /* 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -209396,6 +211194,8 @@ static const UV UNI_CI_invlist[] = { /* 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -209518,8 +211318,18 @@ static const UV UNI_CI_invlist[] = { /* 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -209580,12 +211390,18 @@ static const UV UNI_CI_invlist[] = { /* 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E13E, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EB, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -209608,7 +211424,7 @@ static const UV UNI_CI_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_CI_invlist[] = { /* for EBCDIC 1047 */ - 853, /* Number of elements */ + 873, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -209838,7 +211654,7 @@ static const UV UNI_CI_invlist[] = { /* 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -210215,6 +212031,8 @@ static const UV UNI_CI_invlist[] = { /* 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -210263,6 +212081,8 @@ static const UV UNI_CI_invlist[] = { /* 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -210385,8 +212205,18 @@ static const UV UNI_CI_invlist[] = { /* 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -210447,12 +212277,18 @@ static const UV UNI_CI_invlist[] = { /* 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E13E, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EB, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -210475,7 +212311,7 @@ static const UV UNI_CI_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_CI_invlist[] = { /* for EBCDIC 037 */ - 851, /* Number of elements */ + 871, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -210703,7 +212539,7 @@ static const UV UNI_CI_invlist[] = { /* 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -211080,6 +212916,8 @@ static const UV UNI_CI_invlist[] = { /* 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -211128,6 +212966,8 @@ static const UV UNI_CI_invlist[] = { /* 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -211250,8 +213090,18 @@ static const UV UNI_CI_invlist[] = { /* 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -211312,12 +213162,18 @@ static const UV UNI_CI_invlist[] = { /* 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E13E, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EB, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -211454,6 +213310,16 @@ static const UV UNI_CJKEXTG_invlist[] = 0x31350 }; +static const UV UNI_CJKEXTH_invlist[] = { /* for all charsets */ + 3, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0x31350, + 0x323B0 +}; + static const UV UNI_CJKRADICALSSUP_invlist[] = { /* for all charsets */ 3, /* Number of elements */ 148565664, /* Version and data structure type */ @@ -211485,7 +213351,7 @@ static const UV UNI_CJKSYMBOLS_invlist[] }; static const UV UNI_CN_invlist[] = { /* for all charsets */ - 1396, /* Number of elements */ + 1414, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -211732,7 +213598,7 @@ static const UV UNI_CN_invlist[] = { /* 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -211792,7 +213658,7 @@ static const UV UNI_CN_invlist[] = { /* 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -212333,7 +214199,7 @@ static const UV UNI_CN_invlist[] = { /* 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -212368,7 +214234,7 @@ static const UV UNI_CN_invlist[] = { /* 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -212473,6 +214339,8 @@ static const UV UNI_CN_invlist[] = { /* 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -212515,6 +214383,12 @@ static const UV UNI_CN_invlist[] = { /* 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -212530,9 +214404,7 @@ static const UV UNI_CN_invlist[] = { /* 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -212585,8 +214457,12 @@ static const UV UNI_CN_invlist[] = { /* 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -212615,6 +214491,8 @@ static const UV UNI_CN_invlist[] = { /* 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -212669,6 +214547,8 @@ static const UV UNI_CN_invlist[] = { /* 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -212679,6 +214559,10 @@ static const UV UNI_CN_invlist[] = { /* 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -212693,6 +214577,8 @@ static const UV UNI_CN_invlist[] = { /* 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -212809,14 +214695,14 @@ static const UV UNI_CN_invlist[] = { /* 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -212838,23 +214724,19 @@ static const UV UNI_CN_invlist[] = { /* 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -212864,7 +214746,7 @@ static const UV UNI_CN_invlist[] = { /* 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -212875,6 +214757,8 @@ static const UV UNI_CN_invlist[] = { /* 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -217870,7 +219754,7 @@ static const UV UNI_CWCM_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_CWKCF_invlist[] = { /* for ASCII/Latin1 */ - 1677, /* Number of elements */ + 1679, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -219459,6 +221343,8 @@ static const UV UNI_CWKCF_invlist[] = { 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1E900, 0x1E922, 0x1EE00, @@ -219561,7 +221447,7 @@ static const UV UNI_CWKCF_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_CWKCF_invlist[] = { /* for EBCDIC 1047 */ - 1687, /* Number of elements */ + 1689, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -221160,6 +223046,8 @@ static const UV UNI_CWKCF_invlist[] = { 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1E900, 0x1E922, 0x1EE00, @@ -221262,7 +223150,7 @@ static const UV UNI_CWKCF_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_CWKCF_invlist[] = { /* for EBCDIC 037 */ - 1685, /* Number of elements */ + 1687, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -222859,6 +224747,8 @@ static const UV UNI_CWKCF_invlist[] = { 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1E900, 0x1E922, 0x1EE00, @@ -234381,6 +236271,16 @@ static const UV UNI_CYRILLICEXTC_invlist 0x1C90 }; +static const UV UNI_CYRILLICEXTD_invlist[] = { /* for all charsets */ + 3, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0x1E030, + 0x1E090 +}; + static const UV UNI_CYRILLICSUP_invlist[] = { /* for all charsets */ 3, /* Number of elements */ 148565664, /* Version and data structure type */ @@ -234392,7 +236292,7 @@ static const UV UNI_CYRILLICSUP_invlist[ }; static const UV UNI_CYRL_invlist[] = { /* for all charsets */ - 19, /* Number of elements */ + 23, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -234414,7 +236314,11 @@ static const UV UNI_CYRL_invlist[] = { 0xA640, 0xA6A0, 0xFE2E, - 0xFE30 + 0xFE30, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090 }; # if 'A' == 65 /* ASCII/Latin1 */ @@ -234622,7 +236526,7 @@ static const UV UNI_DEP_invlist[] = { / }; static const UV UNI_DEVA_invlist[] = { /* for all charsets */ - 15, /* Number of elements */ + 17, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -234640,7 +236544,9 @@ static const UV UNI_DEVA_invlist[] = { 0xA830, 0xA83A, 0xA8E0, - 0xA900 + 0xA900, + 0x11B00, + 0x11B0A }; static const UV UNI_DEVANAGARIEXT_invlist[] = { /* for all charsets */ @@ -234653,6 +236559,16 @@ static const UV UNI_DEVANAGARIEXT_invlis 0xA900 }; +static const UV UNI_DEVANAGARIEXTA_invlist[] = { /* for all charsets */ + 3, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0x11B00, + 0x11B60 +}; + # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_DI_invlist[] = { /* for ASCII/Latin1 */ @@ -234800,7 +236716,7 @@ static const UV UNI_DI_invlist[] = { /* # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_DIA_invlist[] = { /* for ASCII/Latin1 */ - 385, /* Number of elements */ + 391, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -235083,6 +236999,8 @@ static const UV UNI_DIA_invlist[] = { / 0x10AE7, 0x10D22, 0x10D28, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -235149,6 +237067,8 @@ static const UV UNI_DIA_invlist[] = { / 0x11D46, 0x11D97, 0x11D98, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -235177,6 +237097,8 @@ static const UV UNI_DIA_invlist[] = { / 0x1D18C, 0x1D1AA, 0x1D1AE, + 0x1E030, + 0x1E06E, 0x1E130, 0x1E137, 0x1E2AE, @@ -235199,7 +237121,7 @@ static const UV UNI_DIA_invlist[] = { / && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_DIA_invlist[] = { /* for EBCDIC 1047 */ - 385, /* Number of elements */ + 391, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -235482,6 +237404,8 @@ static const UV UNI_DIA_invlist[] = { / 0x10AE7, 0x10D22, 0x10D28, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -235548,6 +237472,8 @@ static const UV UNI_DIA_invlist[] = { / 0x11D46, 0x11D97, 0x11D98, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -235576,6 +237502,8 @@ static const UV UNI_DIA_invlist[] = { / 0x1D18C, 0x1D1AA, 0x1D1AE, + 0x1E030, + 0x1E06E, 0x1E130, 0x1E137, 0x1E2AE, @@ -235598,7 +237526,7 @@ static const UV UNI_DIA_invlist[] = { / && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_DIA_invlist[] = { /* for EBCDIC 037 */ - 383, /* Number of elements */ + 389, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -235879,6 +237807,8 @@ static const UV UNI_DIA_invlist[] = { / 0x10AE7, 0x10D22, 0x10D28, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -235945,6 +237875,8 @@ static const UV UNI_DIA_invlist[] = { / 0x11D46, 0x11D97, 0x11D98, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -235973,6 +237905,8 @@ static const UV UNI_DIA_invlist[] = { / 0x1D18C, 0x1D1AA, 0x1D1AE, + 0x1E030, + 0x1E06E, 0x1E130, 0x1E137, 0x1E2AE, @@ -239058,7 +240992,7 @@ static const UV UNI_DT__NB_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_DT__NONCANON_invlist[] = { /* for ASCII/Latin1 */ - 383, /* Number of elements */ + 385, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -239359,6 +241293,8 @@ static const UV UNI_DT__NONCANON_invlist 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -239455,7 +241391,7 @@ static const UV UNI_DT__NONCANON_invlist && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_DT__NONCANON_invlist[] = { /* for EBCDIC 1047 */ - 389, /* Number of elements */ + 391, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -239762,6 +241698,8 @@ static const UV UNI_DT__NONCANON_invlist 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -239858,7 +241796,7 @@ static const UV UNI_DT__NONCANON_invlist && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_DT__NONCANON_invlist[] = { /* for EBCDIC 037 */ - 387, /* Number of elements */ + 389, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -240163,6 +242101,8 @@ static const UV UNI_DT__NONCANON_invlist 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -240256,7 +242196,7 @@ static const UV UNI_DT__NONCANON_invlist # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_DT__NONE_invlist[] = { /* for ASCII/Latin1 */ - 793, /* Number of elements */ + 795, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -240965,6 +242905,8 @@ static const UV UNI_DT__NONE_invlist[] = 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -241063,7 +243005,7 @@ static const UV UNI_DT__NONE_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_DT__NONE_invlist[] = { /* for EBCDIC 1047 */ - 791, /* Number of elements */ + 793, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -241770,6 +243712,8 @@ static const UV UNI_DT__NONE_invlist[] = 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -241868,7 +243812,7 @@ static const UV UNI_DT__NONE_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_DT__NONE_invlist[] = { /* for EBCDIC 037 */ - 793, /* Number of elements */ + 795, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -242577,6 +244521,8 @@ static const UV UNI_DT__NONE_invlist[] = 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -242710,7 +244656,7 @@ static const UV UNI_DT__SQR_invlist[] = }; static const UV UNI_DT__SUB_invlist[] = { /* for all charsets */ - 9, /* Number of elements */ + 11, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -242722,13 +244668,15 @@ static const UV UNI_DT__SUB_invlist[] = 0x2090, 0x209D, 0x2C7C, - 0x2C7D + 0x2C7D, + 0x1E051, + 0x1E06B }; # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_DT__SUP_invlist[] = { /* for ASCII/Latin1 */ - 59, /* Number of elements */ + 63, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -242789,6 +244737,10 @@ static const UV UNI_DT__SUP_invlist[] = 0x107B1, 0x107B2, 0x107BB, + 0x1E030, + 0x1E051, + 0x1E06B, + 0x1E06E, 0x1F16A, 0x1F16D }; @@ -242801,7 +244753,7 @@ static const UV UNI_DT__SUP_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_DT__SUP_invlist[] = { /* for EBCDIC 1047 */ - 61, /* Number of elements */ + 65, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -242864,6 +244816,10 @@ static const UV UNI_DT__SUP_invlist[] = 0x107B1, 0x107B2, 0x107BB, + 0x1E030, + 0x1E051, + 0x1E06B, + 0x1E06E, 0x1F16A, 0x1F16D }; @@ -242876,7 +244832,7 @@ static const UV UNI_DT__SUP_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_DT__SUP_invlist[] = { /* for EBCDIC 037 */ - 61, /* Number of elements */ + 65, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -242939,6 +244895,10 @@ static const UV UNI_DT__SUP_invlist[] = 0x107B1, 0x107B2, 0x107BB, + 0x1E030, + 0x1E051, + 0x1E06B, + 0x1E06E, 0x1F16A, 0x1F16D }; @@ -244593,8 +246553,12 @@ static const UV UNI_EA__N_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -244665,7 +246629,7 @@ static const UV UNI_EA__N_invlist[] = { 0x1F6D3, 0x1F6D5, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6E0, 0x1F6EB, 0x1F6ED, @@ -244682,23 +246646,19 @@ static const UV UNI_EA__N_invlist[] = { 0x1F947, 0x1FA00, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x20000, 0x2FFFE, 0x30000, @@ -245168,8 +247128,12 @@ static const UV UNI_EA__N_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -245240,7 +247204,7 @@ static const UV UNI_EA__N_invlist[] = { 0x1F6D3, 0x1F6D5, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6E0, 0x1F6EB, 0x1F6ED, @@ -245257,23 +247221,19 @@ static const UV UNI_EA__N_invlist[] = { 0x1F947, 0x1FA00, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x20000, 0x2FFFE, 0x30000, @@ -245743,8 +247703,12 @@ static const UV UNI_EA__N_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -245815,7 +247779,7 @@ static const UV UNI_EA__N_invlist[] = { 0x1F6D3, 0x1F6D5, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6E0, 0x1F6EB, 0x1F6ED, @@ -245832,23 +247796,19 @@ static const UV UNI_EA__N_invlist[] = { 0x1F947, 0x1FA00, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x20000, 0x2FFFE, 0x30000, @@ -246127,8 +248087,12 @@ static const UV UNI_EA__W_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -246195,7 +248159,7 @@ static const UV UNI_EA__W_invlist[] = { 0x1F6D3, 0x1F6D5, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6E0, 0x1F6EB, 0x1F6ED, @@ -246212,23 +248176,19 @@ static const UV UNI_EA__W_invlist[] = { 0x1F947, 0x1FA00, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x20000, 0x2FFFE, 0x30000, @@ -246330,7 +248290,7 @@ static const UV UNI_EBASE_invlist[] = { 0x1FAC3, 0x1FAC6, 0x1FAF0, - 0x1FAF7 + 0x1FAF9 }; # if 'A' == 65 /* ASCII/Latin1 */ @@ -246436,15 +248396,13 @@ static const UV UNI_ECOMP_invlist[] = { # endif /* EBCDIC 037 */ static const UV UNI_EGYP_invlist[] = { /* for all charsets */ - 5, /* Number of elements */ + 3, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ 0x0, 0x13000, - 0x1342F, - 0x13430, - 0x13439 + 0x13456 }; static const UV UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS_invlist[] = { /* for all charsets */ @@ -246454,7 +248412,7 @@ static const UV UNI_EGYPTIANHIEROGLYPHFO 1 if it starts at the element beyond 0 */ 0x0, 0x13430, - 0x13440 + 0x13460 }; static const UV UNI_ELBA_invlist[] = { /* for all charsets */ @@ -246490,7 +248448,7 @@ static const UV UNI_EMOD_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_EMOJI_invlist[] = { /* for ASCII/Latin1 */ - 307, /* Number of elements */ + 303, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -246763,7 +248721,7 @@ static const UV UNI_EMOJI_invlist[] = { 0x1F6D3, 0x1F6D5, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6E6, 0x1F6E9, 0x1F6EA, @@ -246784,23 +248742,19 @@ static const UV UNI_EMOJI_invlist[] = { 0x1F947, 0x1FA00, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7 + 0x1FAF9 }; # endif /* ASCII/Latin1 */ @@ -246811,7 +248765,7 @@ static const UV UNI_EMOJI_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_EMOJI_invlist[] = { /* for EBCDIC 1047 */ - 307, /* Number of elements */ + 303, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -247084,7 +249038,7 @@ static const UV UNI_EMOJI_invlist[] = { 0x1F6D3, 0x1F6D5, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6E6, 0x1F6E9, 0x1F6EA, @@ -247105,23 +249059,19 @@ static const UV UNI_EMOJI_invlist[] = { 0x1F947, 0x1FA00, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7 + 0x1FAF9 }; # endif /* EBCDIC 1047 */ @@ -247132,7 +249082,7 @@ static const UV UNI_EMOJI_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_EMOJI_invlist[] = { /* for EBCDIC 037 */ - 307, /* Number of elements */ + 303, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -247405,7 +249355,7 @@ static const UV UNI_EMOJI_invlist[] = { 0x1F6D3, 0x1F6D5, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6E6, 0x1F6E9, 0x1F6EA, @@ -247426,23 +249376,19 @@ static const UV UNI_EMOJI_invlist[] = { 0x1F947, 0x1FA00, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7 + 0x1FAF9 }; # endif /* EBCDIC 037 */ @@ -247498,7 +249444,7 @@ static const UV UNI_ENCLOSEDIDEOGRAPHICS }; static const UV UNI_EPRES_invlist[] = { /* for all charsets */ - 167, /* Number of elements */ + 163, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -247635,7 +249581,7 @@ static const UV UNI_EPRES_invlist[] = { 0x1F6D3, 0x1F6D5, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6E0, 0x1F6EB, 0x1F6ED, @@ -247652,23 +249598,19 @@ static const UV UNI_EPRES_invlist[] = { 0x1F947, 0x1FA00, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7 + 0x1FAF9 }; static const UV UNI_ETHI_invlist[] = { /* for all charsets */ @@ -248575,7 +250517,7 @@ static const UV UNI_GCB__CN_invlist[] = 0xFFF0, 0xFFFC, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -248627,7 +250569,7 @@ static const UV UNI_GCB__CN_invlist[] = 0xFFF0, 0xFFFC, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -248679,7 +250621,7 @@ static const UV UNI_GCB__CN_invlist[] = 0xFFF0, 0xFFFC, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -248695,7 +250637,7 @@ static const UV UNI_GCB__CN_invlist[] = # endif /* EBCDIC 037 */ static const UV UNI_GCB__EX_invlist[] = { /* for all charsets */ - 709, /* Number of elements */ + 729, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -248905,7 +250847,7 @@ static const UV UNI_GCB__EX_invlist[] = 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -249162,6 +251104,8 @@ static const UV UNI_GCB__EX_invlist[] = 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -249206,6 +251150,8 @@ static const UV UNI_GCB__EX_invlist[] = 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -249340,6 +251286,18 @@ static const UV UNI_GCB__EX_invlist[] = 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -249392,12 +251350,16 @@ static const UV UNI_GCB__EX_invlist[] = 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -249423,7 +251385,7 @@ static const UV UNI_GCB__L_invlist[] = { }; static const UV UNI_GCB__PP_invlist[] = { /* for all charsets */ - 29, /* Number of elements */ + 31, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -249455,11 +251417,13 @@ static const UV UNI_GCB__PP_invlist[] = 0x11A84, 0x11A8A, 0x11D46, - 0x11D47 + 0x11D47, + 0x11F02, + 0x11F03 }; static const UV UNI_GCB__SM_invlist[] = { /* for all charsets */ - 321, /* Number of elements */ + 331, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -249526,6 +251490,8 @@ static const UV UNI_GCB__SM_invlist[] = 0xCC9, 0xCCA, 0xCCC, + 0xCF3, + 0xCF4, 0xD02, 0xD04, 0xD3F, @@ -249776,6 +251742,14 @@ static const UV UNI_GCB__SM_invlist[] = 0x11D97, 0x11EF5, 0x11EF7, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F36, + 0x11F3E, + 0x11F40, + 0x11F41, + 0x11F42, 0x16F51, 0x16F88, 0x16FF0, @@ -249813,7 +251787,7 @@ static const UV UNI_GCB__V_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_GCB__XX_invlist[] = { /* for ASCII/Latin1 */ - 640, /* Number of elements */ + 658, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -249989,6 +251963,8 @@ static const UV UNI_GCB__XX_invlist[] = 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -250026,7 +252002,7 @@ static const UV UNI_GCB__XX_invlist[] = 0xEB3, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -250253,6 +252229,8 @@ static const UV UNI_GCB__XX_invlist[] = 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -250297,6 +252275,8 @@ static const UV UNI_GCB__XX_invlist[] = 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112EB, 0x11300, @@ -250385,8 +252365,16 @@ static const UV UNI_GCB__XX_invlist[] = 0x11D98, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -250441,12 +252429,16 @@ static const UV UNI_GCB__XX_invlist[] = 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -250467,7 +252459,7 @@ static const UV UNI_GCB__XX_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_GCB__XX_invlist[] = { /* for EBCDIC 1047 */ - 640, /* Number of elements */ + 658, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -250643,6 +252635,8 @@ static const UV UNI_GCB__XX_invlist[] = 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -250680,7 +252674,7 @@ static const UV UNI_GCB__XX_invlist[] = 0xEB3, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -250907,6 +252901,8 @@ static const UV UNI_GCB__XX_invlist[] = 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -250951,6 +252947,8 @@ static const UV UNI_GCB__XX_invlist[] = 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112EB, 0x11300, @@ -251039,8 +253037,16 @@ static const UV UNI_GCB__XX_invlist[] = 0x11D98, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -251095,12 +253101,16 @@ static const UV UNI_GCB__XX_invlist[] = 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -251121,7 +253131,7 @@ static const UV UNI_GCB__XX_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_GCB__XX_invlist[] = { /* for EBCDIC 037 */ - 640, /* Number of elements */ + 658, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -251297,6 +253307,8 @@ static const UV UNI_GCB__XX_invlist[] = 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -251334,7 +253346,7 @@ static const UV UNI_GCB__XX_invlist[] = 0xEB3, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -251561,6 +253573,8 @@ static const UV UNI_GCB__XX_invlist[] = 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -251605,6 +253619,8 @@ static const UV UNI_GCB__XX_invlist[] = 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112EB, 0x11300, @@ -251693,8 +253709,16 @@ static const UV UNI_GCB__XX_invlist[] = 0x11D98, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -251749,12 +253773,16 @@ static const UV UNI_GCB__XX_invlist[] = 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -251990,7 +254018,7 @@ static const UV UNI_GRAN_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_GRBASE_invlist[] = { /* for ASCII/Latin1 */ - 1723, /* Number of elements */ + 1751, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -252294,7 +254322,7 @@ static const UV UNI_GRBASE_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD02, 0xD0D, 0xD0E, @@ -253131,6 +255159,8 @@ static const UV UNI_GRBASE_invlist[] = { 0x11236, 0x11238, 0x1123E, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -253303,6 +255333,8 @@ static const UV UNI_GRBASE_invlist[] = { 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -253349,6 +255381,16 @@ static const UV UNI_GRBASE_invlist[] = { 0x11EF3, 0x11EF5, 0x11EF9, + 0x11F02, + 0x11F11, + 0x11F12, + 0x11F36, + 0x11F3E, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -253364,7 +255406,9 @@ static const UV UNI_GRBASE_invlist[] = { 0x12F90, 0x12FF3, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -253419,8 +255463,12 @@ static const UV UNI_GRBASE_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -253459,6 +255507,8 @@ static const UV UNI_GRBASE_invlist[] = { 0x1D242, 0x1D245, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -253517,6 +255567,10 @@ static const UV UNI_GRBASE_invlist[] = { 0x1DA8C, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -253533,6 +255587,10 @@ static const UV UNI_GRBASE_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -253651,14 +255709,14 @@ static const UV UNI_GRBASE_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -253680,23 +255738,19 @@ static const UV UNI_GRBASE_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -253706,7 +255760,7 @@ static const UV UNI_GRBASE_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -253716,7 +255770,9 @@ static const UV UNI_GRBASE_invlist[] = { 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -253727,7 +255783,7 @@ static const UV UNI_GRBASE_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_GRBASE_invlist[] = { /* for EBCDIC 1047 */ - 1723, /* Number of elements */ + 1751, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -254031,7 +256087,7 @@ static const UV UNI_GRBASE_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD02, 0xD0D, 0xD0E, @@ -254868,6 +256924,8 @@ static const UV UNI_GRBASE_invlist[] = { 0x11236, 0x11238, 0x1123E, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -255040,6 +257098,8 @@ static const UV UNI_GRBASE_invlist[] = { 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -255086,6 +257146,16 @@ static const UV UNI_GRBASE_invlist[] = { 0x11EF3, 0x11EF5, 0x11EF9, + 0x11F02, + 0x11F11, + 0x11F12, + 0x11F36, + 0x11F3E, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -255101,7 +257171,9 @@ static const UV UNI_GRBASE_invlist[] = { 0x12F90, 0x12FF3, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -255156,8 +257228,12 @@ static const UV UNI_GRBASE_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -255196,6 +257272,8 @@ static const UV UNI_GRBASE_invlist[] = { 0x1D242, 0x1D245, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -255254,6 +257332,10 @@ static const UV UNI_GRBASE_invlist[] = { 0x1DA8C, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -255270,6 +257352,10 @@ static const UV UNI_GRBASE_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -255388,14 +257474,14 @@ static const UV UNI_GRBASE_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -255417,23 +257503,19 @@ static const UV UNI_GRBASE_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -255443,7 +257525,7 @@ static const UV UNI_GRBASE_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -255453,7 +257535,9 @@ static const UV UNI_GRBASE_invlist[] = { 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -255464,7 +257548,7 @@ static const UV UNI_GRBASE_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_GRBASE_invlist[] = { /* for EBCDIC 037 */ - 1723, /* Number of elements */ + 1751, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -255768,7 +257852,7 @@ static const UV UNI_GRBASE_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD02, 0xD0D, 0xD0E, @@ -256605,6 +258689,8 @@ static const UV UNI_GRBASE_invlist[] = { 0x11236, 0x11238, 0x1123E, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -256777,6 +258863,8 @@ static const UV UNI_GRBASE_invlist[] = { 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -256823,6 +258911,16 @@ static const UV UNI_GRBASE_invlist[] = { 0x11EF3, 0x11EF5, 0x11EF9, + 0x11F02, + 0x11F11, + 0x11F12, + 0x11F36, + 0x11F3E, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -256838,7 +258936,9 @@ static const UV UNI_GRBASE_invlist[] = { 0x12F90, 0x12FF3, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -256893,8 +258993,12 @@ static const UV UNI_GRBASE_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -256933,6 +259037,8 @@ static const UV UNI_GRBASE_invlist[] = { 0x1D242, 0x1D245, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -256991,6 +259097,10 @@ static const UV UNI_GRBASE_invlist[] = { 0x1DA8C, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -257007,6 +259117,10 @@ static const UV UNI_GRBASE_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4EC, + 0x1E4F0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -257125,14 +259239,14 @@ static const UV UNI_GRBASE_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -257154,23 +259268,19 @@ static const UV UNI_GRBASE_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -257180,7 +259290,7 @@ static const UV UNI_GRBASE_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -257190,7 +259300,9 @@ static const UV UNI_GRBASE_invlist[] = { 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -257290,7 +259402,7 @@ static const UV UNI_GREK_invlist[] = { }; static const UV UNI_GREXT_invlist[] = { /* for all charsets */ - 707, /* Number of elements */ + 727, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -257500,7 +259612,7 @@ static const UV UNI_GREXT_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -257757,6 +259869,8 @@ static const UV UNI_GREXT_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -257801,6 +259915,8 @@ static const UV UNI_GREXT_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -257935,6 +260051,18 @@ static const UV UNI_GREXT_invlist[] = { 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -257987,12 +260115,16 @@ static const UV UNI_GREXT_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -258112,7 +260244,7 @@ static const UV UNI_HALFMARKS_invlist[] }; static const UV UNI_HAN_invlist[] = { /* for all charsets */ - 75, /* Number of elements */ + 77, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -258180,7 +260312,7 @@ static const UV UNI_HAN_invlist[] = { / 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -258190,7 +260322,9 @@ static const UV UNI_HAN_invlist[] = { / 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; static const UV UNI_HANG_invlist[] = { /* for all charsets */ @@ -258314,7 +260448,7 @@ static const UV UNI_HIGHSURROGATES_invli }; static const UV UNI_HIRA_invlist[] = { /* for all charsets */ - 33, /* Number of elements */ + 35, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -258347,6 +260481,8 @@ static const UV UNI_HIRA_invlist[] = { 0xFFA0, 0x1B001, 0x1B120, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, 0x1F200, @@ -258534,7 +260670,7 @@ static const UV UNI_HYPHEN_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_IDC_invlist[] = { /* for ASCII/Latin1 */ - 1513, /* Number of elements */ + 1537, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -258856,7 +260992,7 @@ static const UV UNI_IDC_invlist[] = { / 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -258922,7 +261058,7 @@ static const UV UNI_IDC_invlist[] = { / 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -259547,7 +261683,7 @@ static const UV UNI_IDC_invlist[] = { / 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -259594,7 +261730,7 @@ static const UV UNI_IDC_invlist[] = { / 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -259755,6 +261891,14 @@ static const UV UNI_IDC_invlist[] = { / 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -259766,7 +261910,9 @@ static const UV UNI_IDC_invlist[] = { / 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -259821,8 +261967,12 @@ static const UV UNI_IDC_invlist[] = { / 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -259929,6 +262079,8 @@ static const UV UNI_IDC_invlist[] = { / 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -259939,6 +262091,10 @@ static const UV UNI_IDC_invlist[] = { / 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -259951,6 +262107,8 @@ static const UV UNI_IDC_invlist[] = { / 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -260038,7 +262196,7 @@ static const UV UNI_IDC_invlist[] = { / 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -260049,6 +262207,8 @@ static const UV UNI_IDC_invlist[] = { / 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -260061,7 +262221,7 @@ static const UV UNI_IDC_invlist[] = { / && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_IDC_invlist[] = { /* for EBCDIC 1047 */ - 1537, /* Number of elements */ + 1561, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -260407,7 +262567,7 @@ static const UV UNI_IDC_invlist[] = { / 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -260473,7 +262633,7 @@ static const UV UNI_IDC_invlist[] = { / 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -261098,7 +263258,7 @@ static const UV UNI_IDC_invlist[] = { / 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -261145,7 +263305,7 @@ static const UV UNI_IDC_invlist[] = { / 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -261306,6 +263466,14 @@ static const UV UNI_IDC_invlist[] = { / 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -261317,7 +263485,9 @@ static const UV UNI_IDC_invlist[] = { / 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -261372,8 +263542,12 @@ static const UV UNI_IDC_invlist[] = { / 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -261480,6 +263654,8 @@ static const UV UNI_IDC_invlist[] = { / 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -261490,6 +263666,10 @@ static const UV UNI_IDC_invlist[] = { / 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -261502,6 +263682,8 @@ static const UV UNI_IDC_invlist[] = { / 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -261589,7 +263771,7 @@ static const UV UNI_IDC_invlist[] = { / 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -261600,6 +263782,8 @@ static const UV UNI_IDC_invlist[] = { / 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -261612,7 +263796,7 @@ static const UV UNI_IDC_invlist[] = { / && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_IDC_invlist[] = { /* for EBCDIC 037 */ - 1533, /* Number of elements */ + 1557, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -261954,7 +264138,7 @@ static const UV UNI_IDC_invlist[] = { / 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -262020,7 +264204,7 @@ static const UV UNI_IDC_invlist[] = { / 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -262645,7 +264829,7 @@ static const UV UNI_IDC_invlist[] = { / 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -262692,7 +264876,7 @@ static const UV UNI_IDC_invlist[] = { / 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -262853,6 +265037,14 @@ static const UV UNI_IDC_invlist[] = { / 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -262864,7 +265056,9 @@ static const UV UNI_IDC_invlist[] = { / 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -262919,8 +265113,12 @@ static const UV UNI_IDC_invlist[] = { / 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -263027,6 +265225,8 @@ static const UV UNI_IDC_invlist[] = { / 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -263037,6 +265237,10 @@ static const UV UNI_IDC_invlist[] = { / 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -263049,6 +265253,8 @@ static const UV UNI_IDC_invlist[] = { / 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -263136,7 +265342,7 @@ static const UV UNI_IDC_invlist[] = { / 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -263147,6 +265353,8 @@ static const UV UNI_IDC_invlist[] = { / 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -263156,7 +265364,7 @@ static const UV UNI_IDC_invlist[] = { / # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = { /* for ASCII/Latin1 */ - 777, /* Number of elements */ + 785, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -263518,7 +265726,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD01, 0xD02, @@ -263596,7 +265804,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDE, @@ -263793,8 +266001,6 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x1FFB, 0x1FFC, 0x1FFD, - 0x200C, - 0x200E, 0x2010, 0x2011, 0x2019, @@ -263911,12 +266117,20 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x16FF2, 0x1B11F, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E08F, + 0x1E090, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -263928,7 +266142,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -263936,7 +266150,9 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x2CEB0, 0x2EBE1, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -263947,7 +266163,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = { /* for EBCDIC 1047 */ - 811, /* Number of elements */ + 819, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -264343,7 +266559,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD01, 0xD02, @@ -264421,7 +266637,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDE, @@ -264618,8 +266834,6 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x1FFB, 0x1FFC, 0x1FFD, - 0x200C, - 0x200E, 0x2010, 0x2011, 0x2019, @@ -264736,12 +266950,20 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x16FF2, 0x1B11F, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E08F, + 0x1E090, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -264753,7 +266975,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -264761,7 +266983,9 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x2CEB0, 0x2EBE1, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -264772,7 +266996,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_IDENTIFIERSTATUS__ALLOWED_invlist[] = { /* for EBCDIC 037 */ - 807, /* Number of elements */ + 815, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -265164,7 +267388,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD01, 0xD02, @@ -265242,7 +267466,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDE, @@ -265439,8 +267663,6 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x1FFB, 0x1FFC, 0x1FFD, - 0x200C, - 0x200E, 0x2010, 0x2011, 0x2019, @@ -265557,12 +267779,20 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x16FF2, 0x1B11F, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E08F, + 0x1E090, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -265574,7 +267804,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -265582,7 +267812,9 @@ static const UV UNI_IDENTIFIERSTATUS__AL 0x2CEB0, 0x2EBE1, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -265590,7 +267822,7 @@ static const UV UNI_IDENTIFIERSTATUS__AL # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = { /* for ASCII/Latin1 */ - 777, /* Number of elements */ + 785, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -265952,7 +268184,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD01, 0xD02, @@ -266030,7 +268262,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDE, @@ -266227,8 +268459,6 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x1FFB, 0x1FFC, 0x1FFD, - 0x200C, - 0x200E, 0x2010, 0x2011, 0x2019, @@ -266345,12 +268575,20 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x16FF2, 0x1B11F, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E08F, + 0x1E090, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -266362,7 +268600,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -266370,7 +268608,9 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x2CEB0, 0x2EBE1, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -266381,7 +268621,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = { /* for EBCDIC 1047 */ - 811, /* Number of elements */ + 819, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -266777,7 +269017,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD01, 0xD02, @@ -266855,7 +269095,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDE, @@ -267052,8 +269292,6 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x1FFB, 0x1FFC, 0x1FFD, - 0x200C, - 0x200E, 0x2010, 0x2011, 0x2019, @@ -267170,12 +269408,20 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x16FF2, 0x1B11F, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E08F, + 0x1E090, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -267187,7 +269433,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -267195,7 +269441,9 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x2CEB0, 0x2EBE1, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -267206,7 +269454,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_IDENTIFIERSTATUS__RESTRICTED_invlist[] = { /* for EBCDIC 037 */ - 807, /* Number of elements */ + 815, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -267598,7 +269846,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD01, 0xD02, @@ -267676,7 +269924,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDE, @@ -267873,8 +270121,6 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x1FFB, 0x1FFC, 0x1FFD, - 0x200C, - 0x200E, 0x2010, 0x2011, 0x2019, @@ -267991,12 +270237,20 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x16FF2, 0x1B11F, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E08F, + 0x1E090, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -268008,7 +270262,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -268016,7 +270270,9 @@ static const UV UNI_IDENTIFIERSTATUS__RE 0x2CEB0, 0x2EBE1, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -268024,7 +270280,7 @@ static const UV UNI_IDENTIFIERSTATUS__RE # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = { /* for ASCII/Latin1 */ - 39, /* Number of elements */ + 37, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -268042,8 +270298,6 @@ static const UV UNI_IDENTIFIERTYPE__DEFA 0x180B, 0x1810, 0x200B, - 0x200C, - 0x200E, 0x2010, 0x202A, 0x202F, @@ -268077,7 +270331,7 @@ static const UV UNI_IDENTIFIERTYPE__DEFA && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = { /* for EBCDIC 1047 */ - 39, /* Number of elements */ + 37, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -268095,8 +270349,6 @@ static const UV UNI_IDENTIFIERTYPE__DEFA 0x180B, 0x1810, 0x200B, - 0x200C, - 0x200E, 0x2010, 0x202A, 0x202F, @@ -268130,7 +270382,7 @@ static const UV UNI_IDENTIFIERTYPE__DEFA && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE_invlist[] = { /* for EBCDIC 037 */ - 39, /* Number of elements */ + 37, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -268148,8 +270400,6 @@ static const UV UNI_IDENTIFIERTYPE__DEFA 0x180B, 0x1810, 0x200B, - 0x200C, - 0x200E, 0x2010, 0x202A, 0x202F, @@ -268178,7 +270428,7 @@ static const UV UNI_IDENTIFIERTYPE__DEFA # endif /* EBCDIC 037 */ static const UV UNI_IDENTIFIERTYPE__EXCLUSION_invlist[] = { /* for all charsets */ - 443, /* Number of elements */ + 449, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -268408,7 +270658,7 @@ static const UV UNI_IDENTIFIERTYPE__EXCL 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -268541,6 +270791,12 @@ static const UV UNI_IDENTIFIERTYPE__EXCL 0x11D5A, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x12000, 0x1239A, 0x12400, @@ -268552,9 +270808,7 @@ static const UV UNI_IDENTIFIERTYPE__EXCL 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16A40, @@ -268621,6 +270875,8 @@ static const UV UNI_IDENTIFIERTYPE__EXCL 0x1E02B, 0x1E290, 0x1E2AF, + 0x1E4D0, + 0x1E4FA, 0x1E800, 0x1E8C5, 0x1E8C7, @@ -268630,7 +270886,7 @@ static const UV UNI_IDENTIFIERTYPE__EXCL # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = { /* for ASCII/Latin1 */ - 31, /* Number of elements */ + 29, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -268653,8 +270909,6 @@ static const UV UNI_IDENTIFIERTYPE__INCL 0x6FF, 0xF0B, 0xF0C, - 0x200C, - 0x200E, 0x2010, 0x2011, 0x2019, @@ -268675,7 +270929,7 @@ static const UV UNI_IDENTIFIERTYPE__INCL && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = { /* for EBCDIC 1047 */ - 33, /* Number of elements */ + 31, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -268700,8 +270954,6 @@ static const UV UNI_IDENTIFIERTYPE__INCL 0x6FF, 0xF0B, 0xF0C, - 0x200C, - 0x200E, 0x2010, 0x2011, 0x2019, @@ -268722,7 +270974,7 @@ static const UV UNI_IDENTIFIERTYPE__INCL && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_IDENTIFIERTYPE__INCLUSION_invlist[] = { /* for EBCDIC 037 */ - 33, /* Number of elements */ + 31, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -268747,8 +270999,6 @@ static const UV UNI_IDENTIFIERTYPE__INCL 0x6FF, 0xF0B, 0xF0C, - 0x200C, - 0x200E, 0x2010, 0x2011, 0x2019, @@ -268948,7 +271198,7 @@ static const UV UNI_IDENTIFIERTYPE__LIMI # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = { /* for ASCII/Latin1 */ - 1399, /* Number of elements */ + 1417, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -269202,7 +271452,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -269262,7 +271512,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -269803,7 +272053,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -269838,7 +272088,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -269943,6 +272193,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -269985,6 +272237,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -270000,9 +272258,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -270055,8 +272311,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -270085,6 +272345,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -270139,6 +272401,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -270149,6 +272413,10 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -270163,6 +272431,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -270279,14 +272549,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -270308,23 +272578,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -270334,7 +272600,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -270345,6 +272611,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -270361,7 +272629,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = { /* for EBCDIC 1047 */ - 1403, /* Number of elements */ + 1421, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -270619,7 +272887,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -270679,7 +272947,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -271220,7 +273488,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -271255,7 +273523,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -271360,6 +273628,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -271402,6 +273672,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -271417,9 +273693,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -271472,8 +273746,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -271502,6 +273780,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -271556,6 +273836,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -271566,6 +273848,10 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -271580,6 +273866,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -271696,14 +273984,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -271725,23 +274013,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -271751,7 +274035,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -271762,6 +274046,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -271778,7 +274064,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_IDENTIFIERTYPE__NOTCHARACTER_invlist[] = { /* for EBCDIC 037 */ - 1403, /* Number of elements */ + 1421, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -272036,7 +274322,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -272096,7 +274382,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -272637,7 +274923,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -272672,7 +274958,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -272777,6 +275063,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -272819,6 +275107,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -272834,9 +275128,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -272889,8 +275181,12 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -272919,6 +275215,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -272973,6 +275271,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -272983,6 +275283,10 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -272997,6 +275301,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -273113,14 +275419,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -273142,23 +275448,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -273168,7 +275470,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -273179,6 +275481,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTC 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -273192,7 +275496,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTC # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = { /* for ASCII/Latin1 */ - 511, /* Number of elements */ + 513, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -273619,6 +275923,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTN 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -273717,7 +276023,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTN && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = { /* for EBCDIC 1047 */ - 517, /* Number of elements */ + 519, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -274150,6 +276456,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTN 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -274248,7 +276556,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTN && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_IDENTIFIERTYPE__NOTNFKC_invlist[] = { /* for EBCDIC 037 */ - 515, /* Number of elements */ + 517, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -274679,6 +276987,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTN 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -274774,7 +277084,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTN # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = { /* for ASCII/Latin1 */ - 707, /* Number of elements */ + 709, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -275319,6 +277629,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C5A, @@ -275327,6 +277639,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FC0, 0x11FF2, 0x11FFF, @@ -275336,7 +277650,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x12FF1, 0x12FF3, 0x13430, - 0x13439, + 0x13440, 0x16A6E, 0x16A70, 0x16AF5, @@ -275377,6 +277691,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x1D242, 0x1D245, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -275435,14 +277751,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -275464,23 +277780,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -275495,7 +277807,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTX && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = { /* for EBCDIC 1047 */ - 721, /* Number of elements */ + 723, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -276054,6 +278366,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C5A, @@ -276062,6 +278376,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FC0, 0x11FF2, 0x11FFF, @@ -276071,7 +278387,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x12FF1, 0x12FF3, 0x13430, - 0x13439, + 0x13440, 0x16A6E, 0x16A70, 0x16AF5, @@ -276112,6 +278428,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x1D242, 0x1D245, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -276170,14 +278488,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -276199,23 +278517,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -276230,7 +278544,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTX && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_IDENTIFIERTYPE__NOTXID_invlist[] = { /* for EBCDIC 037 */ - 719, /* Number of elements */ + 721, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -276787,6 +279101,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C5A, @@ -276795,6 +279111,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FC0, 0x11FF2, 0x11FFF, @@ -276804,7 +279122,7 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x12FF1, 0x12FF3, 0x13430, - 0x13439, + 0x13440, 0x16A6E, 0x16A70, 0x16AF5, @@ -276845,6 +279163,8 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x1D242, 0x1D245, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -276903,14 +279223,14 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -276932,23 +279252,19 @@ static const UV UNI_IDENTIFIERTYPE__NOTX 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -277176,7 +279492,7 @@ static const UV UNI_IDENTIFIERTYPE__OBSO # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = { /* for ASCII/Latin1 */ - 761, /* Number of elements */ + 771, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -277530,7 +279846,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD01, 0xD02, @@ -277608,7 +279924,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDE, @@ -277915,12 +280231,20 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0x16FF2, 0x1B11F, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E08F, + 0x1E090, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -277932,7 +280256,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -277940,7 +280264,9 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0x2CEB0, 0x2EBE1, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -277951,7 +280277,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = { /* for EBCDIC 1047 */ - 791, /* Number of elements */ + 801, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -278335,7 +280661,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD01, 0xD02, @@ -278413,7 +280739,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDE, @@ -278720,12 +281046,20 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0x16FF2, 0x1B11F, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E08F, + 0x1E090, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -278737,7 +281071,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -278745,7 +281079,9 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0x2CEB0, 0x2EBE1, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -278756,7 +281092,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_IDENTIFIERTYPE__RECOMMENDED_invlist[] = { /* for EBCDIC 037 */ - 787, /* Number of elements */ + 797, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -279136,7 +281472,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD01, 0xD02, @@ -279214,7 +281550,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDE, @@ -279521,12 +281857,20 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0x16FF2, 0x1B11F, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E08F, + 0x1E090, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -279538,7 +281882,7 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -279546,7 +281890,9 @@ static const UV UNI_IDENTIFIERTYPE__RECO 0x2CEB0, 0x2EBE1, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -279758,7 +282104,7 @@ static const UV UNI_IDENTIFIERTYPE__TECH }; static const UV UNI_IDENTIFIERTYPE__UNCOMMONUSE_invlist[] = { /* for all charsets */ - 165, /* Number of elements */ + 167, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -279913,6 +282259,8 @@ static const UV UNI_IDENTIFIERTYPE__UNCO 0xFE30, 0x10780, 0x10781, + 0x10EFD, + 0x10F00, 0x16A40, 0x16A5F, 0x16A60, @@ -279930,7 +282278,7 @@ static const UV UNI_IDENTIFIERTYPE__UNCO }; static const UV UNI_IDEO_invlist[] = { /* for all charsets */ - 39, /* Number of elements */ + 41, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -279962,7 +282310,7 @@ static const UV UNI_IDEO_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -279972,7 +282320,9 @@ static const UV UNI_IDEO_invlist[] = { 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; static const UV UNI_IDEOGRAPHICSYMBOLS_invlist[] = { /* for all charsets */ @@ -279988,7 +282338,7 @@ static const UV UNI_IDEOGRAPHICSYMBOLS_i # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_IDS_invlist[] = { /* for ASCII/Latin1 */ - 1297, /* Number of elements */ + 1319, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -280929,6 +283279,8 @@ static const UV UNI_IDS_invlist[] = { / 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -281053,6 +283405,12 @@ static const UV UNI_IDS_invlist[] = { / 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -281064,7 +283422,9 @@ static const UV UNI_IDS_invlist[] = { / 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -281109,8 +283469,12 @@ static const UV UNI_IDS_invlist[] = { / 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -281185,6 +283549,10 @@ static const UV UNI_IDS_invlist[] = { / 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -281195,6 +283563,8 @@ static const UV UNI_IDS_invlist[] = { / 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -281278,7 +283648,7 @@ static const UV UNI_IDS_invlist[] = { / 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -281288,7 +283658,9 @@ static const UV UNI_IDS_invlist[] = { / 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -281299,7 +283671,7 @@ static const UV UNI_IDS_invlist[] = { / && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_IDS_invlist[] = { /* for EBCDIC 1047 */ - 1323, /* Number of elements */ + 1345, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -282266,6 +284638,8 @@ static const UV UNI_IDS_invlist[] = { / 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -282390,6 +284764,12 @@ static const UV UNI_IDS_invlist[] = { / 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -282401,7 +284781,9 @@ static const UV UNI_IDS_invlist[] = { / 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -282446,8 +284828,12 @@ static const UV UNI_IDS_invlist[] = { / 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -282522,6 +284908,10 @@ static const UV UNI_IDS_invlist[] = { / 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -282532,6 +284922,8 @@ static const UV UNI_IDS_invlist[] = { / 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -282615,7 +285007,7 @@ static const UV UNI_IDS_invlist[] = { / 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -282625,7 +285017,9 @@ static const UV UNI_IDS_invlist[] = { / 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -282636,7 +285030,7 @@ static const UV UNI_IDS_invlist[] = { / && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_IDS_invlist[] = { /* for EBCDIC 037 */ - 1319, /* Number of elements */ + 1341, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -283599,6 +285993,8 @@ static const UV UNI_IDS_invlist[] = { / 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -283723,6 +286119,12 @@ static const UV UNI_IDS_invlist[] = { / 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -283734,7 +286136,9 @@ static const UV UNI_IDS_invlist[] = { / 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -283779,8 +286183,12 @@ static const UV UNI_IDS_invlist[] = { / 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -283855,6 +286263,10 @@ static const UV UNI_IDS_invlist[] = { / 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -283865,6 +286277,8 @@ static const UV UNI_IDS_invlist[] = { / 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -283948,7 +286362,7 @@ static const UV UNI_IDS_invlist[] = { / 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -283958,7 +286372,9 @@ static const UV UNI_IDS_invlist[] = { / 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -291239,7 +293655,1424 @@ static const UV UNI_IN__13_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6E0, + 0x1F6E0, + 0x1F6ED, + 0x1F6F0, + 0x1F6FD, + 0x1F700, + 0x1F774, + 0x1F780, + 0x1F7D9, + 0x1F7E0, + 0x1F7EC, + 0x1F800, + 0x1F80C, + 0x1F810, + 0x1F848, + 0x1F850, + 0x1F85A, + 0x1F860, + 0x1F888, + 0x1F890, + 0x1F8AE, + 0x1F8B0, + 0x1F8B2, + 0x1F900, + 0x1F979, + 0x1F97A, + 0x1F9CC, + 0x1F9CD, + 0x1FA54, + 0x1FA60, + 0x1FA6E, + 0x1FA70, + 0x1FA75, + 0x1FA78, + 0x1FA7B, + 0x1FA80, + 0x1FA87, + 0x1FA90, + 0x1FAA9, + 0x1FAB0, + 0x1FAB7, + 0x1FAC0, + 0x1FAC3, + 0x1FAD0, + 0x1FAD7, + 0x1FB00, + 0x1FB93, + 0x1FB94, + 0x1FBCB, + 0x1FBF0, + 0x1FBFA, + 0x1FFFE, + 0x2A6DE, + 0x2A700, + 0x2B735, + 0x2B740, + 0x2B81E, + 0x2B820, + 0x2CEA2, + 0x2CEB0, + 0x2EBE1, + 0x2F800, + 0x2FA1E, + 0x2FFFE, + 0x3134B, + 0x3FFFE, + 0x40000, + 0x4FFFE, + 0x50000, + 0x5FFFE, + 0x60000, + 0x6FFFE, + 0x70000, + 0x7FFFE, + 0x80000, + 0x8FFFE, + 0x90000, + 0x9FFFE, + 0xA0000, + 0xAFFFE, + 0xB0000, + 0xBFFFE, + 0xC0000, + 0xCFFFE, + 0xD0000, + 0xDFFFE, + 0xE0000, + 0xE0001, + 0xE0002, + 0xE0020, + 0xE0080, + 0xE0100, + 0xE01F0, + 0xEFFFE, + 0x110000 +}; + +static const UV UNI_IN__14_invlist[] = { /* for all charsets */ + 1412, /* Number of elements */ + 148565664, /* Version and data structure type */ + 0, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0x378, + 0x37A, + 0x380, + 0x384, + 0x38B, + 0x38C, + 0x38D, + 0x38E, + 0x3A2, + 0x3A3, + 0x530, + 0x531, + 0x557, + 0x559, + 0x58B, + 0x58D, + 0x590, + 0x591, + 0x5C8, + 0x5D0, + 0x5EB, + 0x5EF, + 0x5F5, + 0x600, + 0x70E, + 0x70F, + 0x74B, + 0x74D, + 0x7B2, + 0x7C0, + 0x7FB, + 0x7FD, + 0x82E, + 0x830, + 0x83F, + 0x840, + 0x85C, + 0x85E, + 0x85F, + 0x860, + 0x86B, + 0x870, + 0x88F, + 0x890, + 0x892, + 0x898, + 0x984, + 0x985, + 0x98D, + 0x98F, + 0x991, + 0x993, + 0x9A9, + 0x9AA, + 0x9B1, + 0x9B2, + 0x9B3, + 0x9B6, + 0x9BA, + 0x9BC, + 0x9C5, + 0x9C7, + 0x9C9, + 0x9CB, + 0x9CF, + 0x9D7, + 0x9D8, + 0x9DC, + 0x9DE, + 0x9DF, + 0x9E4, + 0x9E6, + 0x9FF, + 0xA01, + 0xA04, + 0xA05, + 0xA0B, + 0xA0F, + 0xA11, + 0xA13, + 0xA29, + 0xA2A, + 0xA31, + 0xA32, + 0xA34, + 0xA35, + 0xA37, + 0xA38, + 0xA3A, + 0xA3C, + 0xA3D, + 0xA3E, + 0xA43, + 0xA47, + 0xA49, + 0xA4B, + 0xA4E, + 0xA51, + 0xA52, + 0xA59, + 0xA5D, + 0xA5E, + 0xA5F, + 0xA66, + 0xA77, + 0xA81, + 0xA84, + 0xA85, + 0xA8E, + 0xA8F, + 0xA92, + 0xA93, + 0xAA9, + 0xAAA, + 0xAB1, + 0xAB2, + 0xAB4, + 0xAB5, + 0xABA, + 0xABC, + 0xAC6, + 0xAC7, + 0xACA, + 0xACB, + 0xACE, + 0xAD0, + 0xAD1, + 0xAE0, + 0xAE4, + 0xAE6, + 0xAF2, + 0xAF9, + 0xB00, + 0xB01, + 0xB04, + 0xB05, + 0xB0D, + 0xB0F, + 0xB11, + 0xB13, + 0xB29, + 0xB2A, + 0xB31, + 0xB32, + 0xB34, + 0xB35, + 0xB3A, + 0xB3C, + 0xB45, + 0xB47, + 0xB49, + 0xB4B, + 0xB4E, + 0xB55, + 0xB58, + 0xB5C, + 0xB5E, + 0xB5F, + 0xB64, + 0xB66, + 0xB78, + 0xB82, + 0xB84, + 0xB85, + 0xB8B, + 0xB8E, + 0xB91, + 0xB92, + 0xB96, + 0xB99, + 0xB9B, + 0xB9C, + 0xB9D, + 0xB9E, + 0xBA0, + 0xBA3, + 0xBA5, + 0xBA8, + 0xBAB, + 0xBAE, + 0xBBA, + 0xBBE, + 0xBC3, + 0xBC6, + 0xBC9, + 0xBCA, + 0xBCE, + 0xBD0, + 0xBD1, + 0xBD7, + 0xBD8, + 0xBE6, + 0xBFB, + 0xC00, + 0xC0D, + 0xC0E, + 0xC11, + 0xC12, + 0xC29, + 0xC2A, + 0xC3A, + 0xC3C, + 0xC45, + 0xC46, + 0xC49, + 0xC4A, + 0xC4E, + 0xC55, + 0xC57, + 0xC58, + 0xC5B, + 0xC5D, + 0xC5E, + 0xC60, + 0xC64, + 0xC66, + 0xC70, + 0xC77, + 0xC8D, + 0xC8E, + 0xC91, + 0xC92, + 0xCA9, + 0xCAA, + 0xCB4, + 0xCB5, + 0xCBA, + 0xCBC, + 0xCC5, + 0xCC6, + 0xCC9, + 0xCCA, + 0xCCE, + 0xCD5, + 0xCD7, + 0xCDD, + 0xCDF, + 0xCE0, + 0xCE4, + 0xCE6, + 0xCF0, + 0xCF1, + 0xCF3, + 0xD00, + 0xD0D, + 0xD0E, + 0xD11, + 0xD12, + 0xD45, + 0xD46, + 0xD49, + 0xD4A, + 0xD50, + 0xD54, + 0xD64, + 0xD66, + 0xD80, + 0xD81, + 0xD84, + 0xD85, + 0xD97, + 0xD9A, + 0xDB2, + 0xDB3, + 0xDBC, + 0xDBD, + 0xDBE, + 0xDC0, + 0xDC7, + 0xDCA, + 0xDCB, + 0xDCF, + 0xDD5, + 0xDD6, + 0xDD7, + 0xDD8, + 0xDE0, + 0xDE6, + 0xDF0, + 0xDF2, + 0xDF5, + 0xE01, + 0xE3B, + 0xE3F, + 0xE5C, + 0xE81, + 0xE83, + 0xE84, + 0xE85, + 0xE86, + 0xE8B, + 0xE8C, + 0xEA4, + 0xEA5, + 0xEA6, + 0xEA7, + 0xEBE, + 0xEC0, + 0xEC5, + 0xEC6, + 0xEC7, + 0xEC8, + 0xECE, + 0xED0, + 0xEDA, + 0xEDC, + 0xEE0, + 0xF00, + 0xF48, + 0xF49, + 0xF6D, + 0xF71, + 0xF98, + 0xF99, + 0xFBD, + 0xFBE, + 0xFCD, + 0xFCE, + 0xFDB, + 0x1000, + 0x10C6, + 0x10C7, + 0x10C8, + 0x10CD, + 0x10CE, + 0x10D0, + 0x1249, + 0x124A, + 0x124E, + 0x1250, + 0x1257, + 0x1258, + 0x1259, + 0x125A, + 0x125E, + 0x1260, + 0x1289, + 0x128A, + 0x128E, + 0x1290, + 0x12B1, + 0x12B2, + 0x12B6, + 0x12B8, + 0x12BF, + 0x12C0, + 0x12C1, + 0x12C2, + 0x12C6, + 0x12C8, + 0x12D7, + 0x12D8, + 0x1311, + 0x1312, + 0x1316, + 0x1318, + 0x135B, + 0x135D, + 0x137D, + 0x1380, + 0x139A, + 0x13A0, + 0x13F6, + 0x13F8, + 0x13FE, + 0x1400, + 0x169D, + 0x16A0, + 0x16F9, + 0x1700, + 0x1716, + 0x171F, + 0x1737, + 0x1740, + 0x1754, + 0x1760, + 0x176D, + 0x176E, + 0x1771, + 0x1772, + 0x1774, + 0x1780, + 0x17DE, + 0x17E0, + 0x17EA, + 0x17F0, + 0x17FA, + 0x1800, + 0x181A, + 0x1820, + 0x1879, + 0x1880, + 0x18AB, + 0x18B0, + 0x18F6, + 0x1900, + 0x191F, + 0x1920, + 0x192C, + 0x1930, + 0x193C, + 0x1940, + 0x1941, + 0x1944, + 0x196E, + 0x1970, + 0x1975, + 0x1980, + 0x19AC, + 0x19B0, + 0x19CA, + 0x19D0, + 0x19DB, + 0x19DE, + 0x1A1C, + 0x1A1E, + 0x1A5F, + 0x1A60, + 0x1A7D, + 0x1A7F, + 0x1A8A, + 0x1A90, + 0x1A9A, + 0x1AA0, + 0x1AAE, + 0x1AB0, + 0x1ACF, + 0x1B00, + 0x1B4D, + 0x1B50, + 0x1B7F, + 0x1B80, + 0x1BF4, + 0x1BFC, + 0x1C38, + 0x1C3B, + 0x1C4A, + 0x1C4D, + 0x1C89, + 0x1C90, + 0x1CBB, + 0x1CBD, + 0x1CC8, + 0x1CD0, + 0x1CFB, + 0x1D00, + 0x1F16, + 0x1F18, + 0x1F1E, + 0x1F20, + 0x1F46, + 0x1F48, + 0x1F4E, + 0x1F50, + 0x1F58, + 0x1F59, + 0x1F5A, + 0x1F5B, + 0x1F5C, + 0x1F5D, + 0x1F5E, + 0x1F5F, + 0x1F7E, + 0x1F80, + 0x1FB5, + 0x1FB6, + 0x1FC5, + 0x1FC6, + 0x1FD4, + 0x1FD6, + 0x1FDC, + 0x1FDD, + 0x1FF0, + 0x1FF2, + 0x1FF5, + 0x1FF6, + 0x1FFF, + 0x2000, + 0x2065, + 0x2066, + 0x2072, + 0x2074, + 0x208F, + 0x2090, + 0x209D, + 0x20A0, + 0x20C1, + 0x20D0, + 0x20F1, + 0x2100, + 0x218C, + 0x2190, + 0x2427, + 0x2440, + 0x244B, + 0x2460, + 0x2B74, + 0x2B76, + 0x2B96, + 0x2B97, + 0x2CF4, + 0x2CF9, + 0x2D26, + 0x2D27, + 0x2D28, + 0x2D2D, + 0x2D2E, + 0x2D30, + 0x2D68, + 0x2D6F, + 0x2D71, + 0x2D7F, + 0x2D97, + 0x2DA0, + 0x2DA7, + 0x2DA8, + 0x2DAF, + 0x2DB0, + 0x2DB7, + 0x2DB8, + 0x2DBF, + 0x2DC0, + 0x2DC7, + 0x2DC8, + 0x2DCF, + 0x2DD0, + 0x2DD7, + 0x2DD8, + 0x2DDF, + 0x2DE0, + 0x2E5E, + 0x2E80, + 0x2E9A, + 0x2E9B, + 0x2EF4, + 0x2F00, + 0x2FD6, + 0x2FF0, + 0x2FFC, + 0x3000, + 0x3040, + 0x3041, + 0x3097, + 0x3099, + 0x3100, + 0x3105, + 0x3130, + 0x3131, + 0x318F, + 0x3190, + 0x31E4, + 0x31F0, + 0x321F, + 0x3220, + 0xA48D, + 0xA490, + 0xA4C7, + 0xA4D0, + 0xA62C, + 0xA640, + 0xA6F8, + 0xA700, + 0xA7CB, + 0xA7D0, + 0xA7D2, + 0xA7D3, + 0xA7D4, + 0xA7D5, + 0xA7DA, + 0xA7F2, + 0xA82D, + 0xA830, + 0xA83A, + 0xA840, + 0xA878, + 0xA880, + 0xA8C6, + 0xA8CE, + 0xA8DA, + 0xA8E0, + 0xA954, + 0xA95F, + 0xA97D, + 0xA980, + 0xA9CE, + 0xA9CF, + 0xA9DA, + 0xA9DE, + 0xA9FF, + 0xAA00, + 0xAA37, + 0xAA40, + 0xAA4E, + 0xAA50, + 0xAA5A, + 0xAA5C, + 0xAAC3, + 0xAADB, + 0xAAF7, + 0xAB01, + 0xAB07, + 0xAB09, + 0xAB0F, + 0xAB11, + 0xAB17, + 0xAB20, + 0xAB27, + 0xAB28, + 0xAB2F, + 0xAB30, + 0xAB6C, + 0xAB70, + 0xABEE, + 0xABF0, + 0xABFA, + 0xAC00, + 0xD7A4, + 0xD7B0, + 0xD7C7, + 0xD7CB, + 0xD7FC, + 0xD800, + 0xFA6E, + 0xFA70, + 0xFADA, + 0xFB00, + 0xFB07, + 0xFB13, + 0xFB18, + 0xFB1D, + 0xFB37, + 0xFB38, + 0xFB3D, + 0xFB3E, + 0xFB3F, + 0xFB40, + 0xFB42, + 0xFB43, + 0xFB45, + 0xFB46, + 0xFBC3, + 0xFBD3, + 0xFD90, + 0xFD92, + 0xFDC8, + 0xFDCF, + 0xFE1A, + 0xFE20, + 0xFE53, + 0xFE54, + 0xFE67, + 0xFE68, + 0xFE6C, + 0xFE70, + 0xFE75, + 0xFE76, + 0xFEFD, + 0xFEFF, + 0xFF00, + 0xFF01, + 0xFFBF, + 0xFFC2, + 0xFFC8, + 0xFFCA, + 0xFFD0, + 0xFFD2, + 0xFFD8, + 0xFFDA, + 0xFFDD, + 0xFFE0, + 0xFFE7, + 0xFFE8, + 0xFFEF, + 0xFFF9, + 0x1000C, + 0x1000D, + 0x10027, + 0x10028, + 0x1003B, + 0x1003C, + 0x1003E, + 0x1003F, + 0x1004E, + 0x10050, + 0x1005E, + 0x10080, + 0x100FB, + 0x10100, + 0x10103, + 0x10107, + 0x10134, + 0x10137, + 0x1018F, + 0x10190, + 0x1019D, + 0x101A0, + 0x101A1, + 0x101D0, + 0x101FE, + 0x10280, + 0x1029D, + 0x102A0, + 0x102D1, + 0x102E0, + 0x102FC, + 0x10300, + 0x10324, + 0x1032D, + 0x1034B, + 0x10350, + 0x1037B, + 0x10380, + 0x1039E, + 0x1039F, + 0x103C4, + 0x103C8, + 0x103D6, + 0x10400, + 0x1049E, + 0x104A0, + 0x104AA, + 0x104B0, + 0x104D4, + 0x104D8, + 0x104FC, + 0x10500, + 0x10528, + 0x10530, + 0x10564, + 0x1056F, + 0x1057B, + 0x1057C, + 0x1058B, + 0x1058C, + 0x10593, + 0x10594, + 0x10596, + 0x10597, + 0x105A2, + 0x105A3, + 0x105B2, + 0x105B3, + 0x105BA, + 0x105BB, + 0x105BD, + 0x10600, + 0x10737, + 0x10740, + 0x10756, + 0x10760, + 0x10768, + 0x10780, + 0x10786, + 0x10787, + 0x107B1, + 0x107B2, + 0x107BB, + 0x10800, + 0x10806, + 0x10808, + 0x10809, + 0x1080A, + 0x10836, + 0x10837, + 0x10839, + 0x1083C, + 0x1083D, + 0x1083F, + 0x10856, + 0x10857, + 0x1089F, + 0x108A7, + 0x108B0, + 0x108E0, + 0x108F3, + 0x108F4, + 0x108F6, + 0x108FB, + 0x1091C, + 0x1091F, + 0x1093A, + 0x1093F, + 0x10940, + 0x10980, + 0x109B8, + 0x109BC, + 0x109D0, + 0x109D2, + 0x10A04, + 0x10A05, + 0x10A07, + 0x10A0C, + 0x10A14, + 0x10A15, + 0x10A18, + 0x10A19, + 0x10A36, + 0x10A38, + 0x10A3B, + 0x10A3F, + 0x10A49, + 0x10A50, + 0x10A59, + 0x10A60, + 0x10AA0, + 0x10AC0, + 0x10AE7, + 0x10AEB, + 0x10AF7, + 0x10B00, + 0x10B36, + 0x10B39, + 0x10B56, + 0x10B58, + 0x10B73, + 0x10B78, + 0x10B92, + 0x10B99, + 0x10B9D, + 0x10BA9, + 0x10BB0, + 0x10C00, + 0x10C49, + 0x10C80, + 0x10CB3, + 0x10CC0, + 0x10CF3, + 0x10CFA, + 0x10D28, + 0x10D30, + 0x10D3A, + 0x10E60, + 0x10E7F, + 0x10E80, + 0x10EAA, + 0x10EAB, + 0x10EAE, + 0x10EB0, + 0x10EB2, + 0x10F00, + 0x10F28, + 0x10F30, + 0x10F5A, + 0x10F70, + 0x10F8A, + 0x10FB0, + 0x10FCC, + 0x10FE0, + 0x10FF7, + 0x11000, + 0x1104E, + 0x11052, + 0x11076, + 0x1107F, + 0x110C3, + 0x110CD, + 0x110CE, + 0x110D0, + 0x110E9, + 0x110F0, + 0x110FA, + 0x11100, + 0x11135, + 0x11136, + 0x11148, + 0x11150, + 0x11177, + 0x11180, + 0x111E0, + 0x111E1, + 0x111F5, + 0x11200, + 0x11212, + 0x11213, + 0x1123F, + 0x11280, + 0x11287, + 0x11288, + 0x11289, + 0x1128A, + 0x1128E, + 0x1128F, + 0x1129E, + 0x1129F, + 0x112AA, + 0x112B0, + 0x112EB, + 0x112F0, + 0x112FA, + 0x11300, + 0x11304, + 0x11305, + 0x1130D, + 0x1130F, + 0x11311, + 0x11313, + 0x11329, + 0x1132A, + 0x11331, + 0x11332, + 0x11334, + 0x11335, + 0x1133A, + 0x1133B, + 0x11345, + 0x11347, + 0x11349, + 0x1134B, + 0x1134E, + 0x11350, + 0x11351, + 0x11357, + 0x11358, + 0x1135D, + 0x11364, + 0x11366, + 0x1136D, + 0x11370, + 0x11375, + 0x11400, + 0x1145C, + 0x1145D, + 0x11462, + 0x11480, + 0x114C8, + 0x114D0, + 0x114DA, + 0x11580, + 0x115B6, + 0x115B8, + 0x115DE, + 0x11600, + 0x11645, + 0x11650, + 0x1165A, + 0x11660, + 0x1166D, + 0x11680, + 0x116BA, + 0x116C0, + 0x116CA, + 0x11700, + 0x1171B, + 0x1171D, + 0x1172C, + 0x11730, + 0x11747, + 0x11800, + 0x1183C, + 0x118A0, + 0x118F3, + 0x118FF, + 0x11907, + 0x11909, + 0x1190A, + 0x1190C, + 0x11914, + 0x11915, + 0x11917, + 0x11918, + 0x11936, + 0x11937, + 0x11939, + 0x1193B, + 0x11947, + 0x11950, + 0x1195A, + 0x119A0, + 0x119A8, + 0x119AA, + 0x119D8, + 0x119DA, + 0x119E5, + 0x11A00, + 0x11A48, + 0x11A50, + 0x11AA3, + 0x11AB0, + 0x11AF9, + 0x11C00, + 0x11C09, + 0x11C0A, + 0x11C37, + 0x11C38, + 0x11C46, + 0x11C50, + 0x11C6D, + 0x11C70, + 0x11C90, + 0x11C92, + 0x11CA8, + 0x11CA9, + 0x11CB7, + 0x11D00, + 0x11D07, + 0x11D08, + 0x11D0A, + 0x11D0B, + 0x11D37, + 0x11D3A, + 0x11D3B, + 0x11D3C, + 0x11D3E, + 0x11D3F, + 0x11D48, + 0x11D50, + 0x11D5A, + 0x11D60, + 0x11D66, + 0x11D67, + 0x11D69, + 0x11D6A, + 0x11D8F, + 0x11D90, + 0x11D92, + 0x11D93, + 0x11D99, + 0x11DA0, + 0x11DAA, + 0x11EE0, + 0x11EF9, + 0x11FB0, + 0x11FB1, + 0x11FC0, + 0x11FF2, + 0x11FFF, + 0x1239A, + 0x12400, + 0x1246F, + 0x12470, + 0x12475, + 0x12480, + 0x12544, + 0x12F90, + 0x12FF3, + 0x13000, + 0x1342F, + 0x13430, + 0x13439, + 0x14400, + 0x14647, + 0x16800, + 0x16A39, + 0x16A40, + 0x16A5F, + 0x16A60, + 0x16A6A, + 0x16A6E, + 0x16ABF, + 0x16AC0, + 0x16ACA, + 0x16AD0, + 0x16AEE, + 0x16AF0, + 0x16AF6, + 0x16B00, + 0x16B46, + 0x16B50, + 0x16B5A, + 0x16B5B, + 0x16B62, + 0x16B63, + 0x16B78, + 0x16B7D, + 0x16B90, + 0x16E40, + 0x16E9B, + 0x16F00, + 0x16F4B, + 0x16F4F, + 0x16F88, + 0x16F8F, + 0x16FA0, + 0x16FE0, + 0x16FE5, + 0x16FF0, + 0x16FF2, + 0x17000, + 0x187F8, + 0x18800, + 0x18CD6, + 0x18D00, + 0x18D09, + 0x1AFF0, + 0x1AFF4, + 0x1AFF5, + 0x1AFFC, + 0x1AFFD, + 0x1AFFF, + 0x1B000, + 0x1B123, + 0x1B150, + 0x1B153, + 0x1B164, + 0x1B168, + 0x1B170, + 0x1B2FC, + 0x1BC00, + 0x1BC6B, + 0x1BC70, + 0x1BC7D, + 0x1BC80, + 0x1BC89, + 0x1BC90, + 0x1BC9A, + 0x1BC9C, + 0x1BCA4, + 0x1CF00, + 0x1CF2E, + 0x1CF30, + 0x1CF47, + 0x1CF50, + 0x1CFC4, + 0x1D000, + 0x1D0F6, + 0x1D100, + 0x1D127, + 0x1D129, + 0x1D1EB, + 0x1D200, + 0x1D246, + 0x1D2E0, + 0x1D2F4, + 0x1D300, + 0x1D357, + 0x1D360, + 0x1D379, + 0x1D400, + 0x1D455, + 0x1D456, + 0x1D49D, + 0x1D49E, + 0x1D4A0, + 0x1D4A2, + 0x1D4A3, + 0x1D4A5, + 0x1D4A7, + 0x1D4A9, + 0x1D4AD, + 0x1D4AE, + 0x1D4BA, + 0x1D4BB, + 0x1D4BC, + 0x1D4BD, + 0x1D4C4, + 0x1D4C5, + 0x1D506, + 0x1D507, + 0x1D50B, + 0x1D50D, + 0x1D515, + 0x1D516, + 0x1D51D, + 0x1D51E, + 0x1D53A, + 0x1D53B, + 0x1D53F, + 0x1D540, + 0x1D545, + 0x1D546, + 0x1D547, + 0x1D54A, + 0x1D551, + 0x1D552, + 0x1D6A6, + 0x1D6A8, + 0x1D7CC, + 0x1D7CE, + 0x1DA8C, + 0x1DA9B, + 0x1DAA0, + 0x1DAA1, + 0x1DAB0, + 0x1DF00, + 0x1DF1F, + 0x1E000, + 0x1E007, + 0x1E008, + 0x1E019, + 0x1E01B, + 0x1E022, + 0x1E023, + 0x1E025, + 0x1E026, + 0x1E02B, + 0x1E100, + 0x1E12D, + 0x1E130, + 0x1E13E, + 0x1E140, + 0x1E14A, + 0x1E14E, + 0x1E150, + 0x1E290, + 0x1E2AF, + 0x1E2C0, + 0x1E2FA, + 0x1E2FF, + 0x1E300, + 0x1E7E0, + 0x1E7E7, + 0x1E7E8, + 0x1E7EC, + 0x1E7ED, + 0x1E7EF, + 0x1E7F0, + 0x1E7FF, + 0x1E800, + 0x1E8C5, + 0x1E8C7, + 0x1E8D7, + 0x1E900, + 0x1E94C, + 0x1E950, + 0x1E95A, + 0x1E95E, + 0x1E960, + 0x1EC71, + 0x1ECB5, + 0x1ED01, + 0x1ED3E, + 0x1EE00, + 0x1EE04, + 0x1EE05, + 0x1EE20, + 0x1EE21, + 0x1EE23, + 0x1EE24, + 0x1EE25, + 0x1EE27, + 0x1EE28, + 0x1EE29, + 0x1EE33, + 0x1EE34, + 0x1EE38, + 0x1EE39, + 0x1EE3A, + 0x1EE3B, + 0x1EE3C, + 0x1EE42, + 0x1EE43, + 0x1EE47, + 0x1EE48, + 0x1EE49, + 0x1EE4A, + 0x1EE4B, + 0x1EE4C, + 0x1EE4D, + 0x1EE50, + 0x1EE51, + 0x1EE53, + 0x1EE54, + 0x1EE55, + 0x1EE57, + 0x1EE58, + 0x1EE59, + 0x1EE5A, + 0x1EE5B, + 0x1EE5C, + 0x1EE5D, + 0x1EE5E, + 0x1EE5F, + 0x1EE60, + 0x1EE61, + 0x1EE63, + 0x1EE64, + 0x1EE65, + 0x1EE67, + 0x1EE6B, + 0x1EE6C, + 0x1EE73, + 0x1EE74, + 0x1EE78, + 0x1EE79, + 0x1EE7D, + 0x1EE7E, + 0x1EE7F, + 0x1EE80, + 0x1EE8A, + 0x1EE8B, + 0x1EE9C, + 0x1EEA1, + 0x1EEA4, + 0x1EEA5, + 0x1EEAA, + 0x1EEAB, + 0x1EEBC, + 0x1EEF0, + 0x1EEF2, + 0x1F000, + 0x1F02C, + 0x1F030, + 0x1F094, + 0x1F0A0, + 0x1F0AF, + 0x1F0B1, + 0x1F0C0, + 0x1F0C1, + 0x1F0D0, + 0x1F0D1, + 0x1F0F6, + 0x1F100, + 0x1F1AE, + 0x1F1E6, + 0x1F203, + 0x1F210, + 0x1F23C, + 0x1F240, + 0x1F249, + 0x1F250, + 0x1F252, + 0x1F260, + 0x1F266, + 0x1F300, + 0x1F6D8, + 0x1F6DD, 0x1F6ED, 0x1F6F0, 0x1F6FD, @@ -291249,6 +295082,8 @@ static const UV UNI_IN__13_invlist[] = { 0x1F7D9, 0x1F7E0, 0x1F7EC, + 0x1F7F0, + 0x1F7F1, 0x1F800, 0x1F80C, 0x1F810, @@ -291262,27 +295097,27 @@ static const UV UNI_IN__13_invlist[] = { 0x1F8B0, 0x1F8B2, 0x1F900, - 0x1F979, - 0x1F97A, - 0x1F9CC, - 0x1F9CD, 0x1FA54, 0x1FA60, 0x1FA6E, 0x1FA70, 0x1FA75, 0x1FA78, - 0x1FA7B, + 0x1FA7D, 0x1FA80, 0x1FA87, 0x1FA90, - 0x1FAA9, + 0x1FAAD, 0x1FAB0, - 0x1FAB7, + 0x1FABB, 0x1FAC0, - 0x1FAC3, + 0x1FAC6, 0x1FAD0, - 0x1FAD7, + 0x1FADA, + 0x1FAE0, + 0x1FAE8, + 0x1FAF0, + 0x1FAF7, 0x1FB00, 0x1FB93, 0x1FB94, @@ -291290,9 +295125,9 @@ static const UV UNI_IN__13_invlist[] = { 0x1FBF0, 0x1FBFA, 0x1FFFE, - 0x2A6DE, + 0x2A6E0, 0x2A700, - 0x2B735, + 0x2B739, 0x2B740, 0x2B81E, 0x2B820, @@ -291335,8 +295170,8 @@ static const UV UNI_IN__13_invlist[] = { 0x110000 }; -static const UV UNI_IN__14_invlist[] = { /* for all charsets */ - 1412, /* Number of elements */ +static const UV UNI_IN__15_invlist[] = { /* for all charsets */ + 1430, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -291583,7 +295418,7 @@ static const UV UNI_IN__14_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -291643,7 +295478,7 @@ static const UV UNI_IN__14_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -292180,7 +296015,7 @@ static const UV UNI_IN__14_invlist[] = { 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -292215,7 +296050,7 @@ static const UV UNI_IN__14_invlist[] = { 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -292320,6 +296155,8 @@ static const UV UNI_IN__14_invlist[] = { 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -292362,6 +296199,12 @@ static const UV UNI_IN__14_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -292377,9 +296220,7 @@ static const UV UNI_IN__14_invlist[] = { 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -292432,8 +296273,12 @@ static const UV UNI_IN__14_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -292462,6 +296307,8 @@ static const UV UNI_IN__14_invlist[] = { 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -292516,6 +296363,8 @@ static const UV UNI_IN__14_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -292526,6 +296375,10 @@ static const UV UNI_IN__14_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -292540,6 +296393,8 @@ static const UV UNI_IN__14_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -292656,14 +296511,14 @@ static const UV UNI_IN__14_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -292685,23 +296540,19 @@ static const UV UNI_IN__14_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -292711,7 +296562,7 @@ static const UV UNI_IN__14_invlist[] = { 0x1FFFE, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -292722,6 +296573,8 @@ static const UV UNI_IN__14_invlist[] = { 0x2FA1E, 0x2FFFE, 0x3134B, + 0x31350, + 0x323B0, 0x3FFFE, 0x40000, 0x4FFFE, @@ -309000,7 +312853,7 @@ static const UV UNI_IN__9_invlist[] = { }; static const UV UNI_IN__NA_invlist[] = { /* for all charsets */ - 1412, /* Number of elements */ + 1430, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -309247,7 +313100,7 @@ static const UV UNI_IN__NA_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -309307,7 +313160,7 @@ static const UV UNI_IN__NA_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -309844,7 +313697,7 @@ static const UV UNI_IN__NA_invlist[] = { 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -309879,7 +313732,7 @@ static const UV UNI_IN__NA_invlist[] = { 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -309984,6 +313837,8 @@ static const UV UNI_IN__NA_invlist[] = { 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -310026,6 +313881,12 @@ static const UV UNI_IN__NA_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -310041,9 +313902,7 @@ static const UV UNI_IN__NA_invlist[] = { 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -310096,8 +313955,12 @@ static const UV UNI_IN__NA_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -310126,6 +313989,8 @@ static const UV UNI_IN__NA_invlist[] = { 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -310180,6 +314045,8 @@ static const UV UNI_IN__NA_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -310190,6 +314057,10 @@ static const UV UNI_IN__NA_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -310204,6 +314075,8 @@ static const UV UNI_IN__NA_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -310320,14 +314193,14 @@ static const UV UNI_IN__NA_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -310349,23 +314222,19 @@ static const UV UNI_IN__NA_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -310375,7 +314244,7 @@ static const UV UNI_IN__NA_invlist[] = { 0x1FFFE, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -310386,6 +314255,8 @@ static const UV UNI_IN__NA_invlist[] = { 0x2FA1E, 0x2FFFE, 0x3134B, + 0x31350, + 0x323B0, 0x3FFFE, 0x40000, 0x4FFFE, @@ -310998,6 +314869,16 @@ static const UV UNI_INKATAKANA_invlist[] 0x3100 }; +static const UV UNI_INKAWI_invlist[] = { /* for all charsets */ + 3, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0x11F00, + 0x11F60 +}; + static const UV UNI_INKHAROSHTHI_invlist[] = { /* for all charsets */ 3, /* Number of elements */ 148565664, /* Version and data structure type */ @@ -311298,6 +315179,16 @@ static const UV UNI_INNABATAEAN_invlist[ 0x108B0 }; +static const UV UNI_INNAGMUNDARI_invlist[] = { /* for all charsets */ + 3, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0x1E4D0, + 0x1E500 +}; + static const UV UNI_INNANDINAGARI_invlist[] = { /* for all charsets */ 3, /* Number of elements */ 148565664, /* Version and data structure type */ @@ -311489,7 +315380,7 @@ static const UV UNI_INPAUCINHAU_invlist[ }; static const UV UNI_INPC__BOTTOM_invlist[] = { /* for all charsets */ - 291, /* Number of elements */ + 295, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -311704,6 +315595,8 @@ static const UV UNI_INPC__BOTTOM_invlist 0x111CD, 0x1122F, 0x11230, + 0x11241, + 0x11242, 0x112E3, 0x112E5, 0x112E9, @@ -311783,7 +315676,9 @@ static const UV UNI_INPC__BOTTOM_invlist 0x11D47, 0x11D48, 0x11EF4, - 0x11EF5 + 0x11EF5, + 0x11F38, + 0x11F3B }; static const UV UNI_INPC__BOTTOMANDLEFT_invlist[] = { /* for all charsets */ @@ -311813,7 +315708,7 @@ static const UV UNI_INPC__BOTTOMANDRIGHT }; static const UV UNI_INPC__LEFT_invlist[] = { /* for all charsets */ - 95, /* Number of elements */ + 97, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -311911,7 +315806,9 @@ static const UV UNI_INPC__LEFT_invlist[] 0x11CB1, 0x11CB2, 0x11EF5, - 0x11EF6 + 0x11EF6, + 0x11F3E, + 0x11F40 }; static const UV UNI_INPC__LEFTANDRIGHT_invlist[] = { /* for all charsets */ @@ -311951,7 +315848,7 @@ static const UV UNI_INPC__LEFTANDRIGHT_i }; static const UV UNI_INPC__NA_invlist[] = { /* for all charsets */ - 429, /* Number of elements */ + 441, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -311963,6 +315860,8 @@ static const UV UNI_INPC__NA_invlist[] = 0x93E, 0x950, 0x951, + 0x953, + 0x955, 0x958, 0x962, 0x964, @@ -312064,6 +315963,8 @@ static const UV UNI_INPC__NA_invlist[] = 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -312101,7 +316002,7 @@ static const UV UNI_INPC__NA_invlist[] = 0xEC0, 0xEC5, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -312220,7 +316121,7 @@ static const UV UNI_INPC__NA_invlist[] = 0xA8F2, 0xA8FF, 0xA900, - 0xA92B, + 0xA926, 0xA92E, 0xA947, 0xA954, @@ -312296,6 +316197,8 @@ static const UV UNI_INPC__NA_invlist[] = 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112EB, 0x11300, @@ -312383,7 +316286,13 @@ static const UV UNI_INPC__NA_invlist[] = 0x11D93, 0x11D97, 0x11EF3, - 0x11EF7 + 0x11EF7, + 0x11F00, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F42 }; static const UV UNI_INPC__OVERSTRUCK_invlist[] = { /* for all charsets */ @@ -312403,7 +316312,7 @@ static const UV UNI_INPC__OVERSTRUCK_inv }; static const UV UNI_INPC__RIGHT_invlist[] = { /* for all charsets */ - 333, /* Number of elements */ + 341, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -312466,6 +316375,8 @@ static const UV UNI_INPC__RIGHT_invlist[ 0xCC5, 0xCD5, 0xCD7, + 0xCF3, + 0xCF4, 0xD02, 0xD04, 0xD3E, @@ -312739,11 +316650,17 @@ static const UV UNI_INPC__RIGHT_invlist[ 0x11D96, 0x11D97, 0x11EF6, - 0x11EF7 + 0x11EF7, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F36, + 0x11F41, + 0x11F42 }; static const UV UNI_INPC__TOP_invlist[] = { /* for all charsets */ - 391, /* Number of elements */ + 399, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -312756,7 +316673,7 @@ static const UV UNI_INPC__TOP_invlist[] 0x949, 0x951, 0x952, - 0x953, + 0x955, 0x956, 0x981, 0x982, @@ -312835,7 +316752,7 @@ static const UV UNI_INPC__TOP_invlist[] 0xEBB, 0xEBC, 0xEC8, - 0xECE, + 0xECF, 0xF39, 0xF3A, 0xF72, @@ -312954,6 +316871,8 @@ static const UV UNI_INPC__TOP_invlist[] 0xA8F2, 0xA8FF, 0xA900, + 0xA926, + 0xA92B, 0xA94A, 0xA94B, 0xA94F, @@ -313137,7 +317056,13 @@ static const UV UNI_INPC__TOP_invlist[] 0x11D95, 0x11D96, 0x11EF3, - 0x11EF4 + 0x11EF4, + 0x11F00, + 0x11F03, + 0x11F36, + 0x11F38, + 0x11F40, + 0x11F41 }; static const UV UNI_INPC__TOPANDBOTTOM_invlist[] = { /* for all charsets */ @@ -313367,7 +317292,7 @@ static const UV UNI_INSC__AVAGRAHA_invli }; static const UV UNI_INSC__BINDU_invlist[] = { /* for all charsets */ - 113, /* Number of elements */ + 117, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -313394,6 +317319,8 @@ static const UV UNI_INSC__BINDU_invlist[ 0xC05, 0xC80, 0xC83, + 0xCF3, + 0xCF4, 0xD00, 0xD03, 0xD04, @@ -313483,7 +317410,9 @@ static const UV UNI_INSC__BINDU_invlist[ 0x11D40, 0x11D41, 0x11D95, - 0x11D96 + 0x11D96, + 0x11F00, + 0x11F02 }; static const UV UNI_INSC__BRAHMIJOININGNUMBER_invlist[] = { /* for all charsets */ @@ -313497,7 +317426,7 @@ static const UV UNI_INSC__BRAHMIJOININGN }; static const UV UNI_INSC__CANTILLATIONMARK_invlist[] = { /* for all charsets */ - 25, /* Number of elements */ + 27, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -313507,6 +317436,8 @@ static const UV UNI_INSC__CANTILLATIONMA 0xA51, 0xA52, 0xAFA, + 0xAFB, + 0xAFC, 0xAFD, 0x1CD0, 0x1CD3, @@ -313529,7 +317460,7 @@ static const UV UNI_INSC__CANTILLATIONMA }; static const UV UNI_INSC__CONSONANT_invlist[] = { /* for all charsets */ - 311, /* Number of elements */ + 315, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -313784,6 +317715,8 @@ static const UV UNI_INSC__CONSONANT_invl 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11240, 0x11284, 0x11287, 0x11288, @@ -313843,7 +317776,9 @@ static const UV UNI_INSC__CONSONANT_invl 0x11D6C, 0x11D8A, 0x11EE0, - 0x11EF2 + 0x11EF2, + 0x11F12, + 0x11F34 }; static const UV UNI_INSC__CONSONANTDEAD_invlist[] = { /* for all charsets */ @@ -314103,7 +318038,7 @@ static const UV UNI_INSC__CONSONANTPLACE # endif /* EBCDIC 037 */ static const UV UNI_INSC__CONSONANTPRECEDINGREPHA_invlist[] = { /* for all charsets */ - 7, /* Number of elements */ + 9, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -314113,7 +318048,9 @@ static const UV UNI_INSC__CONSONANTPRECE 0x11941, 0x11942, 0x11D46, - 0x11D47 + 0x11D47, + 0x11F02, + 0x11F03 }; static const UV UNI_INSC__CONSONANTPREFIXED_invlist[] = { /* for all charsets */ @@ -314191,13 +318128,15 @@ static const UV UNI_INSC__CONSONANTWITHS }; static const UV UNI_INSC__GEMINATIONMARK_invlist[] = { /* for all charsets */ - 7, /* Number of elements */ + 9, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ 0x0, 0xA71, 0xA72, + 0xAFB, + 0xAFC, 0x11237, 0x11238, 0x11A98, @@ -314205,7 +318144,7 @@ static const UV UNI_INSC__GEMINATIONMARK }; static const UV UNI_INSC__INVISIBLESTACKER_invlist[] = { /* for all charsets */ - 25, /* Number of elements */ + 27, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -314233,7 +318172,9 @@ static const UV UNI_INSC__INVISIBLESTACK 0x11D45, 0x11D46, 0x11D97, - 0x11D98 + 0x11D98, + 0x11F42, + 0x11F43 }; static const UV UNI_INSC__MODIFYINGLETTER_invlist[] = { /* for all charsets */ @@ -314321,7 +318262,7 @@ static const UV UNI_INSC__NUKTA_invlist[ # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_INSC__NUMBER_invlist[] = { /* for ASCII/Latin1 */ - 91, /* Number of elements */ + 93, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -314415,7 +318356,9 @@ static const UV UNI_INSC__NUMBER_invlist 0x11D50, 0x11D5A, 0x11DA0, - 0x11DAA + 0x11DAA, + 0x11F50, + 0x11F5A }; # endif /* ASCII/Latin1 */ @@ -314426,7 +318369,7 @@ static const UV UNI_INSC__NUMBER_invlist && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_INSC__NUMBER_invlist[] = { /* for EBCDIC 1047 */ - 91, /* Number of elements */ + 93, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -314520,7 +318463,9 @@ static const UV UNI_INSC__NUMBER_invlist 0x11D50, 0x11D5A, 0x11DA0, - 0x11DAA + 0x11DAA, + 0x11F50, + 0x11F5A }; # endif /* EBCDIC 1047 */ @@ -314531,7 +318476,7 @@ static const UV UNI_INSC__NUMBER_invlist && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_INSC__NUMBER_invlist[] = { /* for EBCDIC 037 */ - 91, /* Number of elements */ + 93, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -314625,7 +318570,9 @@ static const UV UNI_INSC__NUMBER_invlist 0x11D50, 0x11D5A, 0x11DA0, - 0x11DAA + 0x11DAA, + 0x11F50, + 0x11F5A }; # endif /* EBCDIC 037 */ @@ -314643,7 +318590,7 @@ static const UV UNI_INSC__NUMBERJOINER_i # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_INSC__OTHER_invlist[] = { /* for ASCII/Latin1 */ - 647, /* Number of elements */ + 655, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -314869,7 +318816,7 @@ static const UV UNI_INSC__OTHER_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -314941,7 +318888,7 @@ static const UV UNI_INSC__OTHER_invlist[ 0xEC8, 0xECC, 0xECD, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -315141,7 +319088,7 @@ static const UV UNI_INSC__OTHER_invlist[ 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -315293,7 +319240,15 @@ static const UV UNI_INSC__OTHER_invlist[ 0x11DA0, 0x11DAA, 0x11EE0, - 0x11EF7 + 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A }; # endif /* ASCII/Latin1 */ @@ -315304,7 +319259,7 @@ static const UV UNI_INSC__OTHER_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_INSC__OTHER_invlist[] = { /* for EBCDIC 1047 */ - 647, /* Number of elements */ + 655, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -315530,7 +319485,7 @@ static const UV UNI_INSC__OTHER_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -315602,7 +319557,7 @@ static const UV UNI_INSC__OTHER_invlist[ 0xEC8, 0xECC, 0xECD, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -315802,7 +319757,7 @@ static const UV UNI_INSC__OTHER_invlist[ 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -315954,7 +319909,15 @@ static const UV UNI_INSC__OTHER_invlist[ 0x11DA0, 0x11DAA, 0x11EE0, - 0x11EF7 + 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A }; # endif /* EBCDIC 1047 */ @@ -315965,7 +319928,7 @@ static const UV UNI_INSC__OTHER_invlist[ && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_INSC__OTHER_invlist[] = { /* for EBCDIC 037 */ - 647, /* Number of elements */ + 655, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -316191,7 +320154,7 @@ static const UV UNI_INSC__OTHER_invlist[ 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -316263,7 +320226,7 @@ static const UV UNI_INSC__OTHER_invlist[ 0xEC8, 0xECC, 0xECD, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -316463,7 +320426,7 @@ static const UV UNI_INSC__OTHER_invlist[ 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -316615,13 +320578,21 @@ static const UV UNI_INSC__OTHER_invlist[ 0x11DA0, 0x11DAA, 0x11EE0, - 0x11EF7 + 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A }; # endif /* EBCDIC 037 */ static const UV UNI_INSC__PUREKILLER_invlist[] = { /* for all charsets */ - 45, /* Number of elements */ + 47, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -316669,7 +320640,9 @@ static const UV UNI_INSC__PUREKILLER_inv 0x11A34, 0x11A35, 0x11D44, - 0x11D45 + 0x11D45, + 0x11F41, + 0x11F42 }; static const UV UNI_INSC__REGISTERSHIFTER_invlist[] = { /* for all charsets */ @@ -316685,7 +320658,7 @@ static const UV UNI_INSC__REGISTERSHIFTE # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = { /* for ASCII/Latin1 */ - 39, /* Number of elements */ + 41, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -316694,6 +320667,8 @@ static const UV UNI_INSC__SYLLABLEMODIFI 0xB4, 0x9FE, 0x9FF, + 0xECE, + 0xECF, 0xF35, 0xF36, 0xF37, @@ -316738,7 +320713,7 @@ static const UV UNI_INSC__SYLLABLEMODIFI && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = { /* for EBCDIC 1047 */ - 41, /* Number of elements */ + 43, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -316749,6 +320724,8 @@ static const UV UNI_INSC__SYLLABLEMODIFI 0xFB, 0x9FE, 0x9FF, + 0xECE, + 0xECF, 0xF35, 0xF36, 0xF37, @@ -316793,7 +320770,7 @@ static const UV UNI_INSC__SYLLABLEMODIFI && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_INSC__SYLLABLEMODIFIER_invlist[] = { /* for EBCDIC 037 */ - 41, /* Number of elements */ + 43, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -316804,6 +320781,8 @@ static const UV UNI_INSC__SYLLABLEMODIFI 0xFB, 0x9FE, 0x9FF, + 0xECE, + 0xECF, 0xF35, 0xF36, 0xF37, @@ -316957,7 +320936,7 @@ static const UV UNI_INSC__VIRAMA_invlist }; static const UV UNI_INSC__VISARGA_invlist[] = { /* for all charsets */ - 71, /* Number of elements */ + 73, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -317031,7 +321010,9 @@ static const UV UNI_INSC__VISARGA_invlis 0x11D41, 0x11D42, 0x11D96, - 0x11D97 + 0x11D97, + 0x11F03, + 0x11F04 }; static const UV UNI_INSC__VOWEL_invlist[] = { /* for all charsets */ @@ -317053,7 +321034,7 @@ static const UV UNI_INSC__VOWEL_invlist[ }; static const UV UNI_INSC__VOWELDEPENDENT_invlist[] = { /* for all charsets */ - 269, /* Number of elements */ + 275, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -317256,6 +321237,8 @@ static const UV UNI_INSC__VOWELDEPENDENT 0x111CF, 0x1122C, 0x11234, + 0x11241, + 0x11242, 0x112E0, 0x112E9, 0x1133E, @@ -317325,11 +321308,15 @@ static const UV UNI_INSC__VOWELDEPENDENT 0x11D93, 0x11D95, 0x11EF3, - 0x11EF7 + 0x11EF7, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F41 }; static const UV UNI_INSC__VOWELINDEPENDENT_invlist[] = { /* for all charsets */ - 177, /* Number of elements */ + 181, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -317456,6 +321443,8 @@ static const UV UNI_INSC__VOWELINDEPENDE 0x11191, 0x11200, 0x11208, + 0x11240, + 0x11241, 0x11280, 0x11284, 0x112B0, @@ -317509,7 +321498,9 @@ static const UV UNI_INSC__VOWELINDEPENDE 0x11D67, 0x11D69, 0x11D6A, - 0x11D6C + 0x11D6C, + 0x11F04, + 0x11F11 }; static const UV UNI_INSIDDHAM_invlist[] = { /* for all charsets */ @@ -319561,7 +323552,7 @@ static const UV UNI_JT__R_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_JT__T_invlist[] = { /* for ASCII/Latin1 */ - 695, /* Number of elements */ + 713, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -319757,7 +323748,7 @@ static const UV UNI_JT__T_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -320026,6 +324017,8 @@ static const UV UNI_JT__T_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -320070,6 +324063,8 @@ static const UV UNI_JT__T_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -320192,8 +324187,18 @@ static const UV UNI_JT__T_invlist[] = { 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -320244,12 +324249,16 @@ static const UV UNI_JT__T_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -320270,7 +324279,7 @@ static const UV UNI_JT__T_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_JT__T_invlist[] = { /* for EBCDIC 1047 */ - 695, /* Number of elements */ + 713, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -320466,7 +324475,7 @@ static const UV UNI_JT__T_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -320735,6 +324744,8 @@ static const UV UNI_JT__T_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -320779,6 +324790,8 @@ static const UV UNI_JT__T_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -320901,8 +324914,18 @@ static const UV UNI_JT__T_invlist[] = { 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -320953,12 +324976,16 @@ static const UV UNI_JT__T_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -320979,7 +325006,7 @@ static const UV UNI_JT__T_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_JT__T_invlist[] = { /* for EBCDIC 037 */ - 695, /* Number of elements */ + 713, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -321175,7 +325202,7 @@ static const UV UNI_JT__T_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -321444,6 +325471,8 @@ static const UV UNI_JT__T_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -321488,6 +325517,8 @@ static const UV UNI_JT__T_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -321610,8 +325641,18 @@ static const UV UNI_JT__T_invlist[] = { 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -321662,12 +325703,16 @@ static const UV UNI_JT__T_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -321685,7 +325730,7 @@ static const UV UNI_JT__T_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_JT__U_invlist[] = { /* for ASCII/Latin1 */ - 745, /* Number of elements */ + 763, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -321901,7 +325946,7 @@ static const UV UNI_JT__U_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -322188,6 +326233,8 @@ static const UV UNI_JT__U_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F30, 0x10F45, 0x10F46, @@ -322244,6 +326291,8 @@ static const UV UNI_JT__U_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -322366,8 +326415,18 @@ static const UV UNI_JT__U_invlist[] = { 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -322418,12 +326477,16 @@ static const UV UNI_JT__U_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E900, @@ -322444,7 +326507,7 @@ static const UV UNI_JT__U_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_JT__U_invlist[] = { /* for EBCDIC 1047 */ - 745, /* Number of elements */ + 763, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -322660,7 +326723,7 @@ static const UV UNI_JT__U_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -322947,6 +327010,8 @@ static const UV UNI_JT__U_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F30, 0x10F45, 0x10F46, @@ -323003,6 +327068,8 @@ static const UV UNI_JT__U_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -323125,8 +327192,18 @@ static const UV UNI_JT__U_invlist[] = { 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -323177,12 +327254,16 @@ static const UV UNI_JT__U_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E900, @@ -323203,7 +327284,7 @@ static const UV UNI_JT__U_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_JT__U_invlist[] = { /* for EBCDIC 037 */ - 745, /* Number of elements */ + 763, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -323419,7 +327500,7 @@ static const UV UNI_JT__U_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -323706,6 +327787,8 @@ static const UV UNI_JT__U_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F30, 0x10F45, 0x10F46, @@ -323762,6 +327845,8 @@ static const UV UNI_JT__U_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -323884,8 +327969,18 @@ static const UV UNI_JT__U_invlist[] = { 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, 0x13430, - 0x13439, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -323936,12 +328031,16 @@ static const UV UNI_JT__U_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E900, @@ -323956,6 +328055,16 @@ static const UV UNI_JT__U_invlist[] = { # endif /* EBCDIC 037 */ +static const UV UNI_KAKTOVIKNUMERALS_invlist[] = { /* for all charsets */ + 3, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0x1D2C0, + 0x1D2E0 +}; + static const UV UNI_KALI_invlist[] = { /* for all charsets */ 3, /* Number of elements */ 148565664, /* Version and data structure type */ @@ -323967,7 +328076,7 @@ static const UV UNI_KALI_invlist[] = { }; static const UV UNI_KANA_invlist[] = { /* for all charsets */ - 39, /* Number of elements */ + 41, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -324008,6 +328117,8 @@ static const UV UNI_KANA_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168 }; @@ -324072,6 +328183,20 @@ static const UV UNI_KATAKANAEXT_invlist[ 0x3200 }; +static const UV UNI_KAWI_invlist[] = { /* for all charsets */ + 7, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A +}; + static const UV UNI_KHAR_invlist[] = { /* for all charsets */ 17, /* Number of elements */ 148565664, /* Version and data structure type */ @@ -324135,7 +328260,7 @@ static const UV UNI_KHOJ_invlist[] = { 0x11200, 0x11212, 0x11213, - 0x1123F + 0x11242 }; static const UV UNI_KITS_invlist[] = { /* for all charsets */ @@ -324185,7 +328310,7 @@ static const UV UNI_KNDA_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0x1CD0, 0x1CD1, 0x1CD2, @@ -324219,7 +328344,7 @@ static const UV UNI_KTHI_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_L_invlist[] = { /* for ASCII/Latin1 */ - 1297, /* Number of elements */ + 1319, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -325162,6 +329287,8 @@ static const UV UNI_L_invlist[] = { /* 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -325286,6 +329413,12 @@ static const UV UNI_L_invlist[] = { /* 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -325295,7 +329428,9 @@ static const UV UNI_L_invlist[] = { /* 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -325340,8 +329475,12 @@ static const UV UNI_L_invlist[] = { /* 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -325416,6 +329555,10 @@ static const UV UNI_L_invlist[] = { /* 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -325426,6 +329569,8 @@ static const UV UNI_L_invlist[] = { /* 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -325509,7 +329654,7 @@ static const UV UNI_L_invlist[] = { /* 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -325519,7 +329664,9 @@ static const UV UNI_L_invlist[] = { /* 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -325530,7 +329677,7 @@ static const UV UNI_L_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_L_invlist[] = { /* for EBCDIC 1047 */ - 1323, /* Number of elements */ + 1345, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -326499,6 +330646,8 @@ static const UV UNI_L_invlist[] = { /* 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -326623,6 +330772,12 @@ static const UV UNI_L_invlist[] = { /* 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -326632,7 +330787,9 @@ static const UV UNI_L_invlist[] = { /* 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -326677,8 +330834,12 @@ static const UV UNI_L_invlist[] = { /* 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -326753,6 +330914,10 @@ static const UV UNI_L_invlist[] = { /* 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -326763,6 +330928,8 @@ static const UV UNI_L_invlist[] = { /* 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -326846,7 +331013,7 @@ static const UV UNI_L_invlist[] = { /* 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -326856,7 +331023,9 @@ static const UV UNI_L_invlist[] = { /* 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -326867,7 +331036,7 @@ static const UV UNI_L_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_L_invlist[] = { /* for EBCDIC 037 */ - 1319, /* Number of elements */ + 1341, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -327832,6 +332001,8 @@ static const UV UNI_L_invlist[] = { /* 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -327956,6 +332127,12 @@ static const UV UNI_L_invlist[] = { /* 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -327965,7 +332142,9 @@ static const UV UNI_L_invlist[] = { /* 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -328010,8 +332189,12 @@ static const UV UNI_L_invlist[] = { /* 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -328086,6 +332269,10 @@ static const UV UNI_L_invlist[] = { /* 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -328096,6 +332283,8 @@ static const UV UNI_L_invlist[] = { /* 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -328179,7 +332368,7 @@ static const UV UNI_L_invlist[] = { /* 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -328189,7 +332378,9 @@ static const UV UNI_L_invlist[] = { /* 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -328235,7 +332426,7 @@ static const UV UNI_LAO_invlist[] = { / 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -328479,7 +332670,7 @@ static const UV UNI_LATINEXTG_invlist[] # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LATN_invlist[] = { /* for ASCII/Latin1 */ - 93, /* Number of elements */ + 95, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -328575,7 +332766,9 @@ static const UV UNI_LATN_invlist[] = { 0x107B2, 0x107BB, 0x1DF00, - 0x1DF1F + 0x1DF1F, + 0x1DF25, + 0x1DF2B }; # endif /* ASCII/Latin1 */ @@ -328586,7 +332779,7 @@ static const UV UNI_LATN_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LATN_invlist[] = { /* for EBCDIC 1047 */ - 119, /* Number of elements */ + 121, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -328708,7 +332901,9 @@ static const UV UNI_LATN_invlist[] = { 0x107B2, 0x107BB, 0x1DF00, - 0x1DF1F + 0x1DF1F, + 0x1DF25, + 0x1DF2B }; # endif /* EBCDIC 1047 */ @@ -328719,7 +332914,7 @@ static const UV UNI_LATN_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LATN_invlist[] = { /* for EBCDIC 037 */ - 115, /* Number of elements */ + 117, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -328837,7 +333032,9 @@ static const UV UNI_LATN_invlist[] = { 0x107B2, 0x107BB, 0x1DF00, - 0x1DF1F + 0x1DF1F, + 0x1DF25, + 0x1DF2B }; # endif /* EBCDIC 037 */ @@ -329553,7 +333750,7 @@ static const UV UNI_LB__AI_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LB__AL_invlist[] = { /* for ASCII/Latin1 */ - 1597, /* Number of elements */ + 1613, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -330094,8 +334291,6 @@ static const UV UNI_LB__AL_invlist[] = { 0x2044, 0x204A, 0x2056, - 0x2057, - 0x2058, 0x205C, 0x205D, 0x2061, @@ -330704,6 +334899,8 @@ static const UV UNI_LB__AL_invlist[] = { 0x1123B, 0x1123D, 0x1123E, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -330840,6 +335037,12 @@ static const UV UNI_LB__AL_invlist[] = { 0x11EF3, 0x11EF7, 0x11EF9, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x11FC0, @@ -330863,7 +335066,9 @@ static const UV UNI_LB__AL_invlist[] = { 0x1328A, 0x13379, 0x1337C, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x145CE, 0x145D0, @@ -330936,6 +335141,8 @@ static const UV UNI_LB__AL_invlist[] = { 0x1D242, 0x1D245, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -330996,6 +335203,10 @@ static const UV UNI_LB__AL_invlist[] = { 0x1DA8C, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -331006,6 +335217,8 @@ static const UV UNI_LB__AL_invlist[] = { 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -331164,7 +335377,7 @@ static const UV UNI_LB__AL_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LB__AL_invlist[] = { /* for EBCDIC 1047 */ - 1625, /* Number of elements */ + 1641, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -331733,8 +335946,6 @@ static const UV UNI_LB__AL_invlist[] = { 0x2044, 0x204A, 0x2056, - 0x2057, - 0x2058, 0x205C, 0x205D, 0x2061, @@ -332343,6 +336554,8 @@ static const UV UNI_LB__AL_invlist[] = { 0x1123B, 0x1123D, 0x1123E, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -332479,6 +336692,12 @@ static const UV UNI_LB__AL_invlist[] = { 0x11EF3, 0x11EF7, 0x11EF9, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x11FC0, @@ -332502,7 +336721,9 @@ static const UV UNI_LB__AL_invlist[] = { 0x1328A, 0x13379, 0x1337C, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x145CE, 0x145D0, @@ -332575,6 +336796,8 @@ static const UV UNI_LB__AL_invlist[] = { 0x1D242, 0x1D245, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -332635,6 +336858,10 @@ static const UV UNI_LB__AL_invlist[] = { 0x1DA8C, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -332645,6 +336872,8 @@ static const UV UNI_LB__AL_invlist[] = { 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -332803,7 +337032,7 @@ static const UV UNI_LB__AL_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LB__AL_invlist[] = { /* for EBCDIC 037 */ - 1621, /* Number of elements */ + 1637, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -333368,8 +337597,6 @@ static const UV UNI_LB__AL_invlist[] = { 0x2044, 0x204A, 0x2056, - 0x2057, - 0x2058, 0x205C, 0x205D, 0x2061, @@ -333978,6 +338205,8 @@ static const UV UNI_LB__AL_invlist[] = { 0x1123B, 0x1123D, 0x1123E, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -334114,6 +338343,12 @@ static const UV UNI_LB__AL_invlist[] = { 0x11EF3, 0x11EF7, 0x11EF9, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x11FC0, @@ -334137,7 +338372,9 @@ static const UV UNI_LB__AL_invlist[] = { 0x1328A, 0x13379, 0x1337C, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x145CE, 0x145D0, @@ -334210,6 +338447,8 @@ static const UV UNI_LB__AL_invlist[] = { 0x1D242, 0x1D245, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -334270,6 +338509,10 @@ static const UV UNI_LB__AL_invlist[] = { 0x1DA8C, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -334280,6 +338523,8 @@ static const UV UNI_LB__AL_invlist[] = { 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -334447,7 +338692,7 @@ static const UV UNI_LB__B2_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LB__BA_invlist[] = { /* for ASCII/Latin1 */ - 201, /* Number of elements */ + 203, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -334634,6 +338879,8 @@ static const UV UNI_LB__BA_invlist[] = { 0x11AA3, 0x11C41, 0x11C46, + 0x11F43, + 0x11F45, 0x11FFF, 0x12000, 0x12470, @@ -334662,7 +338909,7 @@ static const UV UNI_LB__BA_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LB__BA_invlist[] = { /* for EBCDIC 1047 */ - 201, /* Number of elements */ + 203, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -334849,6 +339096,8 @@ static const UV UNI_LB__BA_invlist[] = { 0x11AA3, 0x11C41, 0x11C46, + 0x11F43, + 0x11F45, 0x11FFF, 0x12000, 0x12470, @@ -334877,7 +339126,7 @@ static const UV UNI_LB__BA_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LB__BA_invlist[] = { /* for EBCDIC 037 */ - 201, /* Number of elements */ + 203, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -335064,6 +339313,8 @@ static const UV UNI_LB__BA_invlist[] = { 0x11AA3, 0x11C41, 0x11C46, + 0x11F43, + 0x11F45, 0x11FFF, 0x12000, 0x12470, @@ -335089,7 +339340,7 @@ static const UV UNI_LB__BA_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LB__BB_invlist[] = { /* for ASCII/Latin1 */ - 49, /* Number of elements */ + 51, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -335140,6 +339391,8 @@ static const UV UNI_LB__BB_invlist[] = { 0x11A46, 0x11A9E, 0x11AA1, + 0x11B00, + 0x11B0A, 0x11C70, 0x11C71 }; @@ -335152,7 +339405,7 @@ static const UV UNI_LB__BB_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LB__BB_invlist[] = { /* for EBCDIC 1047 */ - 49, /* Number of elements */ + 51, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -335203,6 +339456,8 @@ static const UV UNI_LB__BB_invlist[] = { 0x11A46, 0x11A9E, 0x11AA1, + 0x11B00, + 0x11B0A, 0x11C70, 0x11C71 }; @@ -335215,7 +339470,7 @@ static const UV UNI_LB__BB_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LB__BB_invlist[] = { /* for EBCDIC 037 */ - 49, /* Number of elements */ + 51, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -335266,6 +339521,8 @@ static const UV UNI_LB__BB_invlist[] = { 0x11A46, 0x11A9E, 0x11AA1, + 0x11B00, + 0x11B0A, 0x11C70, 0x11C71 }; @@ -335337,7 +339594,7 @@ static const UV UNI_LB__CB_invlist[] = { }; static const UV UNI_LB__CJ_invlist[] = { /* for all charsets */ - 55, /* Number of elements */ + 59, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -335392,8 +339649,12 @@ static const UV UNI_LB__CJ_invlist[] = { 0x3200, 0xFF67, 0xFF71, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168 }; @@ -335401,7 +339662,7 @@ static const UV UNI_LB__CJ_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LB__CL_invlist[] = { /* for ASCII/Latin1 */ - 175, /* Number of elements */ + 179, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -335578,6 +339839,10 @@ static const UV UNI_LB__CL_invlist[] = { 0x1337C, 0x13438, 0x13439, + 0x1343D, + 0x1343E, + 0x1343F, + 0x13440, 0x145CF, 0x145D0 }; @@ -335590,7 +339855,7 @@ static const UV UNI_LB__CL_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LB__CL_invlist[] = { /* for EBCDIC 1047 */ - 175, /* Number of elements */ + 179, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -335767,6 +340032,10 @@ static const UV UNI_LB__CL_invlist[] = { 0x1337C, 0x13438, 0x13439, + 0x1343D, + 0x1343E, + 0x1343F, + 0x13440, 0x145CF, 0x145D0 }; @@ -335779,7 +340048,7 @@ static const UV UNI_LB__CL_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LB__CL_invlist[] = { /* for EBCDIC 037 */ - 175, /* Number of elements */ + 179, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -335956,6 +340225,10 @@ static const UV UNI_LB__CL_invlist[] = { 0x1337C, 0x13438, 0x13439, + 0x1343D, + 0x1343E, + 0x1343F, + 0x13440, 0x145CF, 0x145D0 }; @@ -335965,7 +340238,7 @@ static const UV UNI_LB__CL_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LB__CM_invlist[] = { /* for ASCII/Latin1 */ - 574, /* Number of elements */ + 600, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -336143,6 +340416,8 @@ static const UV UNI_LB__CM_invlist[] = { 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -336244,6 +340519,10 @@ static const UV UNI_LB__CM_invlist[] = { 0x1CF7, 0x1CFA, 0x1DC0, + 0x1DCD, + 0x1DCE, + 0x1DFC, + 0x1DFD, 0x1E00, 0x200C, 0x200D, @@ -336345,6 +340624,8 @@ static const UV UNI_LB__CM_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -336383,6 +340664,8 @@ static const UV UNI_LB__CM_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112EB, 0x11300, @@ -336475,6 +340758,18 @@ static const UV UNI_LB__CM_invlist[] = { 0x11D98, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -336527,12 +340822,16 @@ static const UV UNI_LB__CM_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -336553,7 +340852,7 @@ static const UV UNI_LB__CM_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LB__CM_invlist[] = { /* for EBCDIC 1047 */ - 578, /* Number of elements */ + 604, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -336735,6 +341034,8 @@ static const UV UNI_LB__CM_invlist[] = { 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -336836,6 +341137,10 @@ static const UV UNI_LB__CM_invlist[] = { 0x1CF7, 0x1CFA, 0x1DC0, + 0x1DCD, + 0x1DCE, + 0x1DFC, + 0x1DFD, 0x1E00, 0x200C, 0x200D, @@ -336937,6 +341242,8 @@ static const UV UNI_LB__CM_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -336975,6 +341282,8 @@ static const UV UNI_LB__CM_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112EB, 0x11300, @@ -337067,6 +341376,18 @@ static const UV UNI_LB__CM_invlist[] = { 0x11D98, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -337119,12 +341440,16 @@ static const UV UNI_LB__CM_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -337145,7 +341470,7 @@ static const UV UNI_LB__CM_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LB__CM_invlist[] = { /* for EBCDIC 037 */ - 578, /* Number of elements */ + 604, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -337327,6 +341652,8 @@ static const UV UNI_LB__CM_invlist[] = { 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -337428,6 +341755,10 @@ static const UV UNI_LB__CM_invlist[] = { 0x1CF7, 0x1CFA, 0x1DC0, + 0x1DCD, + 0x1DCE, + 0x1DFC, + 0x1DFD, 0x1E00, 0x200C, 0x200D, @@ -337529,6 +341860,8 @@ static const UV UNI_LB__CM_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -337567,6 +341900,8 @@ static const UV UNI_LB__CM_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112EB, 0x11300, @@ -337659,6 +341994,18 @@ static const UV UNI_LB__CM_invlist[] = { 0x11D98, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -337711,12 +342058,16 @@ static const UV UNI_LB__CM_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -338028,7 +342379,7 @@ static const UV UNI_LB__EX_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LB__GL_invlist[] = { /* for ASCII/Latin1 */ - 27, /* Number of elements */ + 33, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -338049,6 +342400,10 @@ static const UV UNI_LB__GL_invlist[] = { 0xFDB, 0x180E, 0x180F, + 0x1DCD, + 0x1DCE, + 0x1DFC, + 0x1DFD, 0x2007, 0x2008, 0x2011, @@ -338057,6 +342412,8 @@ static const UV UNI_LB__GL_invlist[] = { 0x2030, 0x13430, 0x13437, + 0x13439, + 0x1343C, 0x16FE4, 0x16FE5 }; @@ -338069,7 +342426,7 @@ static const UV UNI_LB__GL_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LB__GL_invlist[] = { /* for EBCDIC 1047 */ - 27, /* Number of elements */ + 33, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -338090,6 +342447,10 @@ static const UV UNI_LB__GL_invlist[] = { 0xFDB, 0x180E, 0x180F, + 0x1DCD, + 0x1DCE, + 0x1DFC, + 0x1DFD, 0x2007, 0x2008, 0x2011, @@ -338098,6 +342459,8 @@ static const UV UNI_LB__GL_invlist[] = { 0x2030, 0x13430, 0x13437, + 0x13439, + 0x1343C, 0x16FE4, 0x16FE5 }; @@ -338110,7 +342473,7 @@ static const UV UNI_LB__GL_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LB__GL_invlist[] = { /* for EBCDIC 037 */ - 27, /* Number of elements */ + 33, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -338131,6 +342494,10 @@ static const UV UNI_LB__GL_invlist[] = { 0xFDB, 0x180E, 0x180F, + 0x1DCD, + 0x1DCE, + 0x1DFC, + 0x1DFD, 0x2007, 0x2008, 0x2011, @@ -338139,6 +342506,8 @@ static const UV UNI_LB__GL_invlist[] = { 0x2030, 0x13430, 0x13437, + 0x13439, + 0x1343C, 0x16FE4, 0x16FE5 }; @@ -339834,7 +344203,7 @@ static const UV UNI_LB__HY_invlist[] = { # endif /* EBCDIC 037 */ static const UV UNI_LB__ID_invlist[] = { /* for all charsets */ - 335, /* Number of elements */ + 337, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -340029,6 +344398,8 @@ static const UV UNI_LB__ID_invlist[] = { 0xFFDD, 0xFFE2, 0xFFE5, + 0x11F45, + 0x11F50, 0x17000, 0x187F8, 0x18800, @@ -340165,7 +344536,7 @@ static const UV UNI_LB__ID_invlist[] = { 0x1FAC3, 0x1FAC6, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FC00, 0x1FFFE, @@ -340438,7 +344809,7 @@ static const UV UNI_LB__NS_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LB__NU_invlist[] = { /* for ASCII/Latin1 */ - 125, /* Number of elements */ + 129, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -340551,6 +344922,8 @@ static const UV UNI_LB__NU_invlist[] = { 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -340563,6 +344936,8 @@ static const UV UNI_LB__NU_invlist[] = { 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -340577,7 +344952,7 @@ static const UV UNI_LB__NU_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LB__NU_invlist[] = { /* for EBCDIC 1047 */ - 125, /* Number of elements */ + 129, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -340690,6 +345065,8 @@ static const UV UNI_LB__NU_invlist[] = { 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -340702,6 +345079,8 @@ static const UV UNI_LB__NU_invlist[] = { 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -340716,7 +345095,7 @@ static const UV UNI_LB__NU_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LB__NU_invlist[] = { /* for EBCDIC 037 */ - 125, /* Number of elements */ + 129, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -340829,6 +345208,8 @@ static const UV UNI_LB__NU_invlist[] = { 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -340841,6 +345222,8 @@ static const UV UNI_LB__NU_invlist[] = { 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -340852,7 +345235,7 @@ static const UV UNI_LB__NU_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LB__OP_invlist[] = { /* for ASCII/Latin1 */ - 179, /* Number of elements */ + 183, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -341031,6 +345414,10 @@ static const UV UNI_LB__OP_invlist[] = { 0x1337A, 0x13437, 0x13438, + 0x1343C, + 0x1343D, + 0x1343E, + 0x1343F, 0x145CE, 0x145CF, 0x1E95E, @@ -341045,7 +345432,7 @@ static const UV UNI_LB__OP_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LB__OP_invlist[] = { /* for EBCDIC 1047 */ - 177, /* Number of elements */ + 181, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -341222,6 +345609,10 @@ static const UV UNI_LB__OP_invlist[] = { 0x1337A, 0x13437, 0x13438, + 0x1343C, + 0x1343D, + 0x1343E, + 0x1343F, 0x145CE, 0x145CF, 0x1E95E, @@ -341236,7 +345627,7 @@ static const UV UNI_LB__OP_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LB__OP_invlist[] = { /* for EBCDIC 037 */ - 177, /* Number of elements */ + 181, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -341413,6 +345804,10 @@ static const UV UNI_LB__OP_invlist[] = { 0x1337A, 0x13437, 0x13438, + 0x1343C, + 0x1343D, + 0x1343E, + 0x1343F, 0x145CE, 0x145CF, 0x1E95E, @@ -341424,7 +345819,7 @@ static const UV UNI_LB__OP_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LB__PO_invlist[] = { /* for ASCII/Latin1 */ - 49, /* Number of elements */ + 51, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -341447,6 +345842,8 @@ static const UV UNI_LB__PO_invlist[] = { 0xD7A, 0x2030, 0x2038, + 0x2057, + 0x2058, 0x20A7, 0x20A8, 0x20B6, @@ -341487,7 +345884,7 @@ static const UV UNI_LB__PO_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LB__PO_invlist[] = { /* for EBCDIC 1047 */ - 49, /* Number of elements */ + 51, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -341510,6 +345907,8 @@ static const UV UNI_LB__PO_invlist[] = { 0xD7A, 0x2030, 0x2038, + 0x2057, + 0x2058, 0x20A7, 0x20A8, 0x20B6, @@ -341550,7 +345949,7 @@ static const UV UNI_LB__PO_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LB__PO_invlist[] = { /* for EBCDIC 037 */ - 49, /* Number of elements */ + 51, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -341573,6 +345972,8 @@ static const UV UNI_LB__PO_invlist[] = { 0xD7A, 0x2030, 0x2038, + 0x2057, + 0x2058, 0x20A7, 0x20A8, 0x20B6, @@ -341946,7 +346347,7 @@ static const UV UNI_LB__SA_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xEDC, 0xEE0, 0x1000, @@ -342116,7 +346517,7 @@ static const UV UNI_LB__WJ_invlist[] = { }; static const UV UNI_LB__XX_invlist[] = { /* for all charsets */ - 1308, /* Number of elements */ + 1328, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -342363,7 +346764,7 @@ static const UV UNI_LB__XX_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -342423,7 +346824,7 @@ static const UV UNI_LB__XX_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -342960,7 +347361,7 @@ static const UV UNI_LB__XX_invlist[] = { 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -342995,7 +347396,7 @@ static const UV UNI_LB__XX_invlist[] = { 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -343100,6 +347501,8 @@ static const UV UNI_LB__XX_invlist[] = { 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -343142,6 +347545,12 @@ static const UV UNI_LB__XX_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -343157,9 +347566,7 @@ static const UV UNI_LB__XX_invlist[] = { 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -343212,8 +347619,12 @@ static const UV UNI_LB__XX_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -343242,6 +347653,8 @@ static const UV UNI_LB__XX_invlist[] = { 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -343296,6 +347709,8 @@ static const UV UNI_LB__XX_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -343306,6 +347721,10 @@ static const UV UNI_LB__XX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -343320,6 +347739,8 @@ static const UV UNI_LB__XX_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -343581,7 +348002,7 @@ static const UV UNI_LISUSUP_invlist[] = }; static const UV UNI_LM_invlist[] = { /* for all charsets */ - 139, /* Number of elements */ + 143, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -343720,8 +348141,12 @@ static const UV UNI_LM_invlist[] = { /* 0x1AFFC, 0x1AFFD, 0x1AFFF, + 0x1E030, + 0x1E06E, 0x1E137, 0x1E13E, + 0x1E4EB, + 0x1E4EC, 0x1E94B, 0x1E94C }; @@ -343729,7 +348154,7 @@ static const UV UNI_LM_invlist[] = { /* # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_LO_invlist[] = { /* for ASCII/Latin1 */ - 1003, /* Number of elements */ + 1021, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -344462,6 +348887,8 @@ static const UV UNI_LO_invlist[] = { /* 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -344584,6 +349011,12 @@ static const UV UNI_LO_invlist[] = { /* 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -344593,7 +349026,9 @@ static const UV UNI_LO_invlist[] = { /* 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -344622,8 +349057,12 @@ static const UV UNI_LO_invlist[] = { /* 0x18D09, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -344646,6 +349085,8 @@ static const UV UNI_LO_invlist[] = { /* 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EB, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -344725,7 +349166,7 @@ static const UV UNI_LO_invlist[] = { /* 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -344735,7 +349176,9 @@ static const UV UNI_LO_invlist[] = { /* 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -344746,7 +349189,7 @@ static const UV UNI_LO_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_LO_invlist[] = { /* for EBCDIC 1047 */ - 1001, /* Number of elements */ + 1019, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -345477,6 +349920,8 @@ static const UV UNI_LO_invlist[] = { /* 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -345599,6 +350044,12 @@ static const UV UNI_LO_invlist[] = { /* 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -345608,7 +350059,9 @@ static const UV UNI_LO_invlist[] = { /* 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -345637,8 +350090,12 @@ static const UV UNI_LO_invlist[] = { /* 0x18D09, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -345661,6 +350118,8 @@ static const UV UNI_LO_invlist[] = { /* 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EB, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -345740,7 +350199,7 @@ static const UV UNI_LO_invlist[] = { /* 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -345750,7 +350209,9 @@ static const UV UNI_LO_invlist[] = { /* 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -345761,7 +350222,7 @@ static const UV UNI_LO_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_LO_invlist[] = { /* for EBCDIC 037 */ - 1001, /* Number of elements */ + 1019, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -346492,6 +350953,8 @@ static const UV UNI_LO_invlist[] = { /* 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -346614,6 +351077,12 @@ static const UV UNI_LO_invlist[] = { /* 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -346623,7 +351092,9 @@ static const UV UNI_LO_invlist[] = { /* 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -346652,8 +351123,12 @@ static const UV UNI_LO_invlist[] = { /* 0x18D09, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -346676,6 +351151,8 @@ static const UV UNI_LO_invlist[] = { /* 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EB, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -346755,7 +351232,7 @@ static const UV UNI_LO_invlist[] = { /* 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -346765,7 +351242,9 @@ static const UV UNI_LO_invlist[] = { /* 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -346825,7 +351304,7 @@ static const UV UNI_LYDI_invlist[] = { }; static const UV UNI_M_invlist[] = { /* for all charsets */ - 599, /* Number of elements */ + 621, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -346990,6 +351469,8 @@ static const UV UNI_M_invlist[] = { /* 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -347027,7 +351508,7 @@ static const UV UNI_M_invlist[] = { /* 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -347230,6 +351711,8 @@ static const UV UNI_M_invlist[] = { /* 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -347268,6 +351751,8 @@ static const UV UNI_M_invlist[] = { /* 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112EB, 0x11300, @@ -347362,6 +351847,18 @@ static const UV UNI_M_invlist[] = { /* 0x11D98, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -347416,12 +351913,16 @@ static const UV UNI_M_invlist[] = { /* 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -348411,7 +352912,7 @@ static const UV UNI_MAYANNUMERALS_invlis }; static const UV UNI_MC_invlist[] = { /* for all charsets */ - 355, /* Number of elements */ + 365, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -348486,6 +352987,8 @@ static const UV UNI_MC_invlist[] = { /* 0xCCC, 0xCD5, 0xCD7, + 0xCF3, + 0xCF4, 0xD02, 0xD04, 0xD3E, @@ -348762,6 +353265,14 @@ static const UV UNI_MC_invlist[] = { /* 0x11D97, 0x11EF5, 0x11EF7, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F36, + 0x11F3E, + 0x11F40, + 0x11F41, + 0x11F42, 0x16F51, 0x16F88, 0x16FF0, @@ -348951,7 +353462,7 @@ static const UV UNI_MLYM_invlist[] = { }; static const UV UNI_MN_invlist[] = { /* for all charsets */ - 673, /* Number of elements */ + 693, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -349141,7 +353652,7 @@ static const UV UNI_MN_invlist[] = { /* 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -349402,6 +353913,8 @@ static const UV UNI_MN_invlist[] = { /* 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -349446,6 +353959,8 @@ static const UV UNI_MN_invlist[] = { /* 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112E0, 0x112E3, @@ -349568,6 +354083,18 @@ static const UV UNI_MN_invlist[] = { /* 0x11D98, 0x11EF3, 0x11EF5, + 0x11F00, + 0x11F02, + 0x11F36, + 0x11F3B, + 0x11F40, + 0x11F41, + 0x11F42, + 0x11F43, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -349616,12 +354143,16 @@ static const UV UNI_MN_invlist[] = { /* 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -349789,7 +354320,7 @@ static const UV UNI_MYMR_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_N_invlist[] = { /* for ASCII/Latin1 */ - 269, /* Number of elements */ + 275, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -350020,6 +354551,8 @@ static const UV UNI_N_invlist[] = { /* 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x11FC0, 0x11FD5, 0x12400, @@ -350034,6 +354567,8 @@ static const UV UNI_N_invlist[] = { /* 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -350044,6 +354579,8 @@ static const UV UNI_N_invlist[] = { /* 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E8C7, 0x1E8D0, 0x1E950, @@ -350072,7 +354609,7 @@ static const UV UNI_N_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_N_invlist[] = { /* for EBCDIC 1047 */ - 269, /* Number of elements */ + 275, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -350303,6 +354840,8 @@ static const UV UNI_N_invlist[] = { /* 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x11FC0, 0x11FD5, 0x12400, @@ -350317,6 +354856,8 @@ static const UV UNI_N_invlist[] = { /* 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -350327,6 +354868,8 @@ static const UV UNI_N_invlist[] = { /* 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E8C7, 0x1E8D0, 0x1E950, @@ -350355,7 +354898,7 @@ static const UV UNI_N_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_N_invlist[] = { /* for EBCDIC 037 */ - 269, /* Number of elements */ + 275, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -350586,6 +355129,8 @@ static const UV UNI_N_invlist[] = { /* 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x11FC0, 0x11FD5, 0x12400, @@ -350600,6 +355145,8 @@ static const UV UNI_N_invlist[] = { /* 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -350610,6 +355157,8 @@ static const UV UNI_N_invlist[] = { /* 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E8C7, 0x1E8D0, 0x1E950, @@ -350632,6 +355181,16 @@ static const UV UNI_N_invlist[] = { /* # endif /* EBCDIC 037 */ +static const UV UNI_NAGM_invlist[] = { /* for all charsets */ + 3, /* Number of elements */ + 148565664, /* Version and data structure type */ + 1, /* 0 if the list starts at 0; + 1 if it starts at the element beyond 0 */ + 0x0, + 0x1E4D0, + 0x1E4FA +}; + static const UV UNI_NAND_invlist[] = { /* for all charsets */ 19, /* Number of elements */ 148565664, /* Version and data structure type */ @@ -350696,8 +355255,6 @@ static const UV UNI_NB_invlist[] = { /* 0x10C80, 0x10D40, 0x10E60, - 0x10EC0, - 0x10F00, 0x11250, 0x11280, 0x11380, @@ -350712,17 +355269,17 @@ static const UV UNI_NB_invlist[] = { /* 0x118A0, 0x11960, 0x119A0, - 0x11B00, + 0x11B60, 0x11C00, 0x11CC0, 0x11D00, 0x11DB0, 0x11EE0, - 0x11F00, + 0x11F60, 0x11FB0, 0x12550, 0x12F90, - 0x13440, + 0x13460, 0x14400, 0x14680, 0x16800, @@ -350741,16 +355298,18 @@ static const UV UNI_NB_invlist[] = { /* 0x1CFD0, 0x1D000, 0x1D250, - 0x1D2E0, + 0x1D2C0, 0x1D380, 0x1D400, 0x1DAB0, 0x1DF00, - 0x1E030, + 0x1E090, 0x1E100, 0x1E150, 0x1E290, 0x1E300, + 0x1E4D0, + 0x1E500, 0x1E7E0, 0x1E8E0, 0x1E900, @@ -350770,7 +355329,7 @@ static const UV UNI_NB_invlist[] = { /* 0x2F800, 0x2FA20, 0x30000, - 0x31350, + 0x323B0, 0xE0000, 0xE0080, 0xE0100, @@ -352572,7 +357131,7 @@ static const UV UNI_NFDQC__Y_invlist[] = # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NFKCQC__N_invlist[] = { /* for ASCII/Latin1 */ - 509, /* Number of elements */ + 511, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -352997,6 +357556,8 @@ static const UV UNI_NFKCQC__N_invlist[] 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -353095,7 +357656,7 @@ static const UV UNI_NFKCQC__N_invlist[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NFKCQC__N_invlist[] = { /* for EBCDIC 1047 */ - 515, /* Number of elements */ + 517, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -353526,6 +358087,8 @@ static const UV UNI_NFKCQC__N_invlist[] 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -353624,7 +358187,7 @@ static const UV UNI_NFKCQC__N_invlist[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NFKCQC__N_invlist[] = { /* for EBCDIC 037 */ - 513, /* Number of elements */ + 515, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -354053,6 +358616,8 @@ static const UV UNI_NFKCQC__N_invlist[] 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -354148,7 +358713,7 @@ static const UV UNI_NFKCQC__N_invlist[] # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NFKCQC__Y_invlist[] = { /* for ASCII/Latin1 */ - 585, /* Number of elements */ + 587, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -354649,6 +359214,8 @@ static const UV UNI_NFKCQC__Y_invlist[] 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -354747,7 +359314,7 @@ static const UV UNI_NFKCQC__Y_invlist[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NFKCQC__Y_invlist[] = { /* for EBCDIC 1047 */ - 591, /* Number of elements */ + 593, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -355254,6 +359821,8 @@ static const UV UNI_NFKCQC__Y_invlist[] 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -355352,7 +359921,7 @@ static const UV UNI_NFKCQC__Y_invlist[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NFKCQC__Y_invlist[] = { /* for EBCDIC 037 */ - 589, /* Number of elements */ + 591, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -355857,6 +360426,8 @@ static const UV UNI_NFKCQC__Y_invlist[] 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -355952,7 +360523,7 @@ static const UV UNI_NFKCQC__Y_invlist[] # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NFKDQC__N_invlist[] = { /* for ASCII/Latin1 */ - 793, /* Number of elements */ + 795, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -356661,6 +361232,8 @@ static const UV UNI_NFKDQC__N_invlist[] 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -356759,7 +361332,7 @@ static const UV UNI_NFKDQC__N_invlist[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NFKDQC__N_invlist[] = { /* for EBCDIC 1047 */ - 791, /* Number of elements */ + 793, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -357466,6 +362039,8 @@ static const UV UNI_NFKDQC__N_invlist[] 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -357564,7 +362139,7 @@ static const UV UNI_NFKDQC__N_invlist[] && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NFKDQC__N_invlist[] = { /* for EBCDIC 037 */ - 793, /* Number of elements */ + 795, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -358273,6 +362848,8 @@ static const UV UNI_NFKDQC__N_invlist[] 0x1D7CC, 0x1D7CE, 0x1D800, + 0x1E030, + 0x1E06E, 0x1EE00, 0x1EE04, 0x1EE05, @@ -358420,7 +362997,7 @@ static const UV UNI_NL_invlist[] = { /* # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NO_invlist[] = { /* for ASCII/Latin1 */ - 143, /* Number of elements */ + 145, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -358549,6 +363126,8 @@ static const UV UNI_NO_invlist[] = { /* 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -358577,7 +363156,7 @@ static const UV UNI_NO_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NO_invlist[] = { /* for EBCDIC 1047 */ - 145, /* Number of elements */ + 147, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -358708,6 +363287,8 @@ static const UV UNI_NO_invlist[] = { /* 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -358736,7 +363317,7 @@ static const UV UNI_NO_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NO_invlist[] = { /* for EBCDIC 037 */ - 145, /* Number of elements */ + 147, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -358867,6 +363448,8 @@ static const UV UNI_NO_invlist[] = { /* 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -359070,7 +363653,7 @@ static const UV UNI_NT__DI_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NT__NU_invlist[] = { /* for ASCII/Latin1 */ - 303, /* Number of elements */ + 305, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -359327,6 +363910,8 @@ static const UV UNI_NT__NU_invlist[] = { 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -359387,7 +363972,7 @@ static const UV UNI_NT__NU_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NT__NU_invlist[] = { /* for EBCDIC 1047 */ - 303, /* Number of elements */ + 305, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -359644,6 +364229,8 @@ static const UV UNI_NT__NU_invlist[] = { 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -359704,7 +364291,7 @@ static const UV UNI_NT__NU_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NT__NU_invlist[] = { /* for EBCDIC 037 */ - 303, /* Number of elements */ + 305, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -359961,6 +364548,8 @@ static const UV UNI_NT__NU_invlist[] = { 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -360038,7 +364627,7 @@ static const UV UNI_NV___MINUS_1_SLASH_2 # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__0_invlist[] = { /* for ASCII/Latin1 */ - 165, /* Number of elements */ + 171, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -360175,6 +364764,8 @@ static const UV UNI_NV__0_invlist[] = { 0x11D51, 0x11DA0, 0x11DA1, + 0x11F50, + 0x11F51, 0x16A60, 0x16A61, 0x16AC0, @@ -360183,6 +364774,8 @@ static const UV UNI_NV__0_invlist[] = { 0x16B51, 0x16E80, 0x16E81, + 0x1D2C0, + 0x1D2C1, 0x1D2E0, 0x1D2E1, 0x1D7CE, @@ -360199,6 +364792,8 @@ static const UV UNI_NV__0_invlist[] = { 0x1E141, 0x1E2F0, 0x1E2F1, + 0x1E4F0, + 0x1E4F1, 0x1E950, 0x1E951, 0x1F100, @@ -360217,7 +364812,7 @@ static const UV UNI_NV__0_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__0_invlist[] = { /* for EBCDIC 1047 */ - 165, /* Number of elements */ + 171, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -360354,6 +364949,8 @@ static const UV UNI_NV__0_invlist[] = { 0x11D51, 0x11DA0, 0x11DA1, + 0x11F50, + 0x11F51, 0x16A60, 0x16A61, 0x16AC0, @@ -360362,6 +364959,8 @@ static const UV UNI_NV__0_invlist[] = { 0x16B51, 0x16E80, 0x16E81, + 0x1D2C0, + 0x1D2C1, 0x1D2E0, 0x1D2E1, 0x1D7CE, @@ -360378,6 +364977,8 @@ static const UV UNI_NV__0_invlist[] = { 0x1E141, 0x1E2F0, 0x1E2F1, + 0x1E4F0, + 0x1E4F1, 0x1E950, 0x1E951, 0x1F100, @@ -360396,7 +364997,7 @@ static const UV UNI_NV__0_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__0_invlist[] = { /* for EBCDIC 037 */ - 165, /* Number of elements */ + 171, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -360533,6 +365134,8 @@ static const UV UNI_NV__0_invlist[] = { 0x11D51, 0x11DA0, 0x11DA1, + 0x11F50, + 0x11F51, 0x16A60, 0x16A61, 0x16AC0, @@ -360541,6 +365144,8 @@ static const UV UNI_NV__0_invlist[] = { 0x16B51, 0x16E80, 0x16E81, + 0x1D2C0, + 0x1D2C1, 0x1D2E0, 0x1D2E1, 0x1D7CE, @@ -360557,6 +365162,8 @@ static const UV UNI_NV__0_invlist[] = { 0x1E141, 0x1E2F0, 0x1E2F1, + 0x1E4F0, + 0x1E4F1, 0x1E950, 0x1E951, 0x1F100, @@ -360572,7 +365179,7 @@ static const UV UNI_NV__0_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__1_invlist[] = { /* for ASCII/Latin1 */ - 277, /* Number of elements */ + 283, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -360791,6 +365398,8 @@ static const UV UNI_NV__1_invlist[] = { 0x11D52, 0x11DA1, 0x11DA2, + 0x11F51, + 0x11F52, 0x12415, 0x12416, 0x1241E, @@ -360813,6 +365422,8 @@ static const UV UNI_NV__1_invlist[] = { 0x16E82, 0x16E94, 0x16E95, + 0x1D2C1, + 0x1D2C2, 0x1D2E1, 0x1D2E2, 0x1D360, @@ -360835,6 +365446,8 @@ static const UV UNI_NV__1_invlist[] = { 0x1E142, 0x1E2F1, 0x1E2F2, + 0x1E4F1, + 0x1E4F2, 0x1E8C7, 0x1E8C8, 0x1E951, @@ -360863,7 +365476,7 @@ static const UV UNI_NV__1_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__1_invlist[] = { /* for EBCDIC 1047 */ - 277, /* Number of elements */ + 283, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -361082,6 +365695,8 @@ static const UV UNI_NV__1_invlist[] = { 0x11D52, 0x11DA1, 0x11DA2, + 0x11F51, + 0x11F52, 0x12415, 0x12416, 0x1241E, @@ -361104,6 +365719,8 @@ static const UV UNI_NV__1_invlist[] = { 0x16E82, 0x16E94, 0x16E95, + 0x1D2C1, + 0x1D2C2, 0x1D2E1, 0x1D2E2, 0x1D360, @@ -361126,6 +365743,8 @@ static const UV UNI_NV__1_invlist[] = { 0x1E142, 0x1E2F1, 0x1E2F2, + 0x1E4F1, + 0x1E4F2, 0x1E8C7, 0x1E8C8, 0x1E951, @@ -361154,7 +365773,7 @@ static const UV UNI_NV__1_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__1_invlist[] = { /* for EBCDIC 037 */ - 277, /* Number of elements */ + 283, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -361373,6 +365992,8 @@ static const UV UNI_NV__1_invlist[] = { 0x11D52, 0x11DA1, 0x11DA2, + 0x11F51, + 0x11F52, 0x12415, 0x12416, 0x1241E, @@ -361395,6 +366016,8 @@ static const UV UNI_NV__1_invlist[] = { 0x16E82, 0x16E94, 0x16E95, + 0x1D2C1, + 0x1D2C2, 0x1D2E1, 0x1D2E2, 0x1D360, @@ -361417,6 +366040,8 @@ static const UV UNI_NV__1_invlist[] = { 0x1E142, 0x1E2F1, 0x1E2F2, + 0x1E4F1, + 0x1E4F2, 0x1E8C7, 0x1E8C8, 0x1E951, @@ -361916,7 +366541,7 @@ static const UV UNI_NV__1_SLASH_9_invlis }; static const UV UNI_NV__10_invlist[] = { /* for all charsets */ - 117, /* Number of elements */ + 119, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362027,6 +366652,8 @@ static const UV UNI_NV__10_invlist[] = { 0x16B5C, 0x16E8A, 0x16E8B, + 0x1D2CA, + 0x1D2CB, 0x1D2EA, 0x1D2EB, 0x1D369, @@ -362276,7 +366903,7 @@ static const UV UNI_NV__1000000000000_in }; static const UV UNI_NV__11_invlist[] = { /* for all charsets */ - 17, /* Number of elements */ + 19, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362295,6 +366922,8 @@ static const UV UNI_NV__11_invlist[] = { 0x24EC, 0x16E8B, 0x16E8C, + 0x1D2CB, + 0x1D2CC, 0x1D2EB, 0x1D2EC }; @@ -362320,7 +366949,7 @@ static const UV UNI_NV__11_SLASH_2_invli }; static const UV UNI_NV__12_invlist[] = { /* for all charsets */ - 17, /* Number of elements */ + 19, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362339,12 +366968,14 @@ static const UV UNI_NV__12_invlist[] = { 0x24ED, 0x16E8C, 0x16E8D, + 0x1D2CC, + 0x1D2CD, 0x1D2EC, 0x1D2ED }; static const UV UNI_NV__13_invlist[] = { /* for all charsets */ - 13, /* Number of elements */ + 15, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362359,6 +366990,8 @@ static const UV UNI_NV__13_invlist[] = { 0x24EE, 0x16E8D, 0x16E8E, + 0x1D2CD, + 0x1D2CE, 0x1D2ED, 0x1D2EE }; @@ -362374,7 +367007,7 @@ static const UV UNI_NV__13_SLASH_2_invli }; static const UV UNI_NV__14_invlist[] = { /* for all charsets */ - 13, /* Number of elements */ + 15, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362389,12 +367022,14 @@ static const UV UNI_NV__14_invlist[] = { 0x24EF, 0x16E8E, 0x16E8F, + 0x1D2CE, + 0x1D2CF, 0x1D2EE, 0x1D2EF }; static const UV UNI_NV__15_invlist[] = { /* for all charsets */ - 13, /* Number of elements */ + 15, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362409,6 +367044,8 @@ static const UV UNI_NV__15_invlist[] = { 0x24F0, 0x16E8F, 0x16E90, + 0x1D2CF, + 0x1D2D0, 0x1D2EF, 0x1D2F0 }; @@ -362424,7 +367061,7 @@ static const UV UNI_NV__15_SLASH_2_invli }; static const UV UNI_NV__16_invlist[] = { /* for all charsets */ - 15, /* Number of elements */ + 17, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362441,12 +367078,14 @@ static const UV UNI_NV__16_invlist[] = { 0x24F1, 0x16E90, 0x16E91, + 0x1D2D0, + 0x1D2D1, 0x1D2F0, 0x1D2F1 }; static const UV UNI_NV__17_invlist[] = { /* for all charsets */ - 15, /* Number of elements */ + 17, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362463,6 +367102,8 @@ static const UV UNI_NV__17_invlist[] = { 0x24F2, 0x16E91, 0x16E92, + 0x1D2D1, + 0x1D2D2, 0x1D2F1, 0x1D2F2 }; @@ -362478,7 +367119,7 @@ static const UV UNI_NV__17_SLASH_2_invli }; static const UV UNI_NV__18_invlist[] = { /* for all charsets */ - 15, /* Number of elements */ + 17, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362495,12 +367136,14 @@ static const UV UNI_NV__18_invlist[] = { 0x24F3, 0x16E92, 0x16E93, + 0x1D2D2, + 0x1D2D3, 0x1D2F2, 0x1D2F3 }; static const UV UNI_NV__19_invlist[] = { /* for all charsets */ - 15, /* Number of elements */ + 17, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362517,6 +367160,8 @@ static const UV UNI_NV__19_invlist[] = { 0x24F4, 0x16E93, 0x16E94, + 0x1D2D3, + 0x1D2D4, 0x1D2F3, 0x1D2F4 }; @@ -362524,7 +367169,7 @@ static const UV UNI_NV__19_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__2_invlist[] = { /* for ASCII/Latin1 */ - 275, /* Number of elements */ + 281, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -362733,6 +367378,8 @@ static const UV UNI_NV__2_invlist[] = { 0x11D53, 0x11DA2, 0x11DA3, + 0x11F52, + 0x11F53, 0x12400, 0x12401, 0x12416, @@ -362763,6 +367410,8 @@ static const UV UNI_NV__2_invlist[] = { 0x16E83, 0x16E95, 0x16E96, + 0x1D2C2, + 0x1D2C3, 0x1D2E2, 0x1D2E3, 0x1D361, @@ -362783,6 +367432,8 @@ static const UV UNI_NV__2_invlist[] = { 0x1E143, 0x1E2F2, 0x1E2F3, + 0x1E4F2, + 0x1E4F3, 0x1E8C8, 0x1E8C9, 0x1E952, @@ -362813,7 +367464,7 @@ static const UV UNI_NV__2_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__2_invlist[] = { /* for EBCDIC 1047 */ - 275, /* Number of elements */ + 281, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -363022,6 +367673,8 @@ static const UV UNI_NV__2_invlist[] = { 0x11D53, 0x11DA2, 0x11DA3, + 0x11F52, + 0x11F53, 0x12400, 0x12401, 0x12416, @@ -363052,6 +367705,8 @@ static const UV UNI_NV__2_invlist[] = { 0x16E83, 0x16E95, 0x16E96, + 0x1D2C2, + 0x1D2C3, 0x1D2E2, 0x1D2E3, 0x1D361, @@ -363072,6 +367727,8 @@ static const UV UNI_NV__2_invlist[] = { 0x1E143, 0x1E2F2, 0x1E2F3, + 0x1E4F2, + 0x1E4F3, 0x1E8C8, 0x1E8C9, 0x1E952, @@ -363102,7 +367759,7 @@ static const UV UNI_NV__2_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__2_invlist[] = { /* for EBCDIC 037 */ - 275, /* Number of elements */ + 281, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -363311,6 +367968,8 @@ static const UV UNI_NV__2_invlist[] = { 0x11D53, 0x11DA2, 0x11DA3, + 0x11F52, + 0x11F53, 0x12400, 0x12401, 0x12416, @@ -363341,6 +368000,8 @@ static const UV UNI_NV__2_invlist[] = { 0x16E83, 0x16E95, 0x16E96, + 0x1D2C2, + 0x1D2C3, 0x1D2E2, 0x1D2E3, 0x1D361, @@ -363361,6 +368022,8 @@ static const UV UNI_NV__2_invlist[] = { 0x1E143, 0x1E2F2, 0x1E2F3, + 0x1E4F2, + 0x1E4F3, 0x1E8C8, 0x1E8C9, 0x1E952, @@ -363676,7 +368339,7 @@ static const UV UNI_NV__29_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__3_invlist[] = { /* for ASCII/Latin1 */ - 269, /* Number of elements */ + 275, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -363873,6 +368536,8 @@ static const UV UNI_NV__3_invlist[] = { 0x11D54, 0x11DA3, 0x11DA4, + 0x11F53, + 0x11F54, 0x12401, 0x12402, 0x12408, @@ -363905,6 +368570,8 @@ static const UV UNI_NV__3_invlist[] = { 0x16E84, 0x16E96, 0x16E97, + 0x1D2C3, + 0x1D2C4, 0x1D2E3, 0x1D2E4, 0x1D362, @@ -363925,6 +368592,8 @@ static const UV UNI_NV__3_invlist[] = { 0x1E144, 0x1E2F3, 0x1E2F4, + 0x1E4F3, + 0x1E4F4, 0x1E8C9, 0x1E8CA, 0x1E953, @@ -363959,7 +368628,7 @@ static const UV UNI_NV__3_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__3_invlist[] = { /* for EBCDIC 1047 */ - 269, /* Number of elements */ + 275, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -364156,6 +368825,8 @@ static const UV UNI_NV__3_invlist[] = { 0x11D54, 0x11DA3, 0x11DA4, + 0x11F53, + 0x11F54, 0x12401, 0x12402, 0x12408, @@ -364188,6 +368859,8 @@ static const UV UNI_NV__3_invlist[] = { 0x16E84, 0x16E96, 0x16E97, + 0x1D2C3, + 0x1D2C4, 0x1D2E3, 0x1D2E4, 0x1D362, @@ -364208,6 +368881,8 @@ static const UV UNI_NV__3_invlist[] = { 0x1E144, 0x1E2F3, 0x1E2F4, + 0x1E4F3, + 0x1E4F4, 0x1E8C9, 0x1E8CA, 0x1E953, @@ -364242,7 +368917,7 @@ static const UV UNI_NV__3_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__3_invlist[] = { /* for EBCDIC 037 */ - 269, /* Number of elements */ + 275, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -364439,6 +369114,8 @@ static const UV UNI_NV__3_invlist[] = { 0x11D54, 0x11DA3, 0x11DA4, + 0x11F53, + 0x11F54, 0x12401, 0x12402, 0x12408, @@ -364471,6 +369148,8 @@ static const UV UNI_NV__3_invlist[] = { 0x16E84, 0x16E96, 0x16E97, + 0x1D2C3, + 0x1D2C4, 0x1D2E3, 0x1D2E4, 0x1D362, @@ -364491,6 +369170,8 @@ static const UV UNI_NV__3_invlist[] = { 0x1E144, 0x1E2F3, 0x1E2F4, + 0x1E4F3, + 0x1E4F4, 0x1E8C9, 0x1E8CA, 0x1E953, @@ -364900,7 +369581,7 @@ static const UV UNI_NV__39_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__4_invlist[] = { /* for ASCII/Latin1 */ - 255, /* Number of elements */ + 261, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -365085,6 +369766,8 @@ static const UV UNI_NV__4_invlist[] = { 0x11D55, 0x11DA4, 0x11DA5, + 0x11F54, + 0x11F55, 0x12402, 0x12403, 0x12409, @@ -365117,6 +369800,8 @@ static const UV UNI_NV__4_invlist[] = { 0x16B55, 0x16E84, 0x16E85, + 0x1D2C4, + 0x1D2C5, 0x1D2E4, 0x1D2E5, 0x1D363, @@ -365137,6 +369822,8 @@ static const UV UNI_NV__4_invlist[] = { 0x1E145, 0x1E2F4, 0x1E2F5, + 0x1E4F4, + 0x1E4F5, 0x1E8CA, 0x1E8CB, 0x1E954, @@ -365169,7 +369856,7 @@ static const UV UNI_NV__4_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__4_invlist[] = { /* for EBCDIC 1047 */ - 255, /* Number of elements */ + 261, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -365354,6 +370041,8 @@ static const UV UNI_NV__4_invlist[] = { 0x11D55, 0x11DA4, 0x11DA5, + 0x11F54, + 0x11F55, 0x12402, 0x12403, 0x12409, @@ -365386,6 +370075,8 @@ static const UV UNI_NV__4_invlist[] = { 0x16B55, 0x16E84, 0x16E85, + 0x1D2C4, + 0x1D2C5, 0x1D2E4, 0x1D2E5, 0x1D363, @@ -365406,6 +370097,8 @@ static const UV UNI_NV__4_invlist[] = { 0x1E145, 0x1E2F4, 0x1E2F5, + 0x1E4F4, + 0x1E4F5, 0x1E8CA, 0x1E8CB, 0x1E954, @@ -365438,7 +370131,7 @@ static const UV UNI_NV__4_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__4_invlist[] = { /* for EBCDIC 037 */ - 255, /* Number of elements */ + 261, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -365623,6 +370316,8 @@ static const UV UNI_NV__4_invlist[] = { 0x11D55, 0x11DA4, 0x11DA5, + 0x11F54, + 0x11F55, 0x12402, 0x12403, 0x12409, @@ -365655,6 +370350,8 @@ static const UV UNI_NV__4_invlist[] = { 0x16B55, 0x16E84, 0x16E85, + 0x1D2C4, + 0x1D2C5, 0x1D2E4, 0x1D2E5, 0x1D363, @@ -365675,6 +370372,8 @@ static const UV UNI_NV__4_invlist[] = { 0x1E145, 0x1E2F4, 0x1E2F5, + 0x1E4F4, + 0x1E4F5, 0x1E8CA, 0x1E8CB, 0x1E954, @@ -365922,7 +370621,7 @@ static const UV UNI_NV__49_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__5_invlist[] = { /* for ASCII/Latin1 */ - 259, /* Number of elements */ + 265, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -366115,6 +370814,8 @@ static const UV UNI_NV__5_invlist[] = { 0x11D56, 0x11DA5, 0x11DA6, + 0x11F55, + 0x11F56, 0x12403, 0x12404, 0x1240A, @@ -366145,6 +370846,8 @@ static const UV UNI_NV__5_invlist[] = { 0x16B56, 0x16E85, 0x16E86, + 0x1D2C5, + 0x1D2C6, 0x1D2E5, 0x1D2E6, 0x1D364, @@ -366167,6 +370870,8 @@ static const UV UNI_NV__5_invlist[] = { 0x1E146, 0x1E2F5, 0x1E2F6, + 0x1E4F5, + 0x1E4F6, 0x1E8CB, 0x1E8CC, 0x1E955, @@ -366195,7 +370900,7 @@ static const UV UNI_NV__5_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__5_invlist[] = { /* for EBCDIC 1047 */ - 259, /* Number of elements */ + 265, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -366388,6 +371093,8 @@ static const UV UNI_NV__5_invlist[] = { 0x11D56, 0x11DA5, 0x11DA6, + 0x11F55, + 0x11F56, 0x12403, 0x12404, 0x1240A, @@ -366418,6 +371125,8 @@ static const UV UNI_NV__5_invlist[] = { 0x16B56, 0x16E85, 0x16E86, + 0x1D2C5, + 0x1D2C6, 0x1D2E5, 0x1D2E6, 0x1D364, @@ -366440,6 +371149,8 @@ static const UV UNI_NV__5_invlist[] = { 0x1E146, 0x1E2F5, 0x1E2F6, + 0x1E4F5, + 0x1E4F6, 0x1E8CB, 0x1E8CC, 0x1E955, @@ -366468,7 +371179,7 @@ static const UV UNI_NV__5_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__5_invlist[] = { /* for EBCDIC 037 */ - 259, /* Number of elements */ + 265, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -366661,6 +371372,8 @@ static const UV UNI_NV__5_invlist[] = { 0x11D56, 0x11DA5, 0x11DA6, + 0x11F55, + 0x11F56, 0x12403, 0x12404, 0x1240A, @@ -366691,6 +371404,8 @@ static const UV UNI_NV__5_invlist[] = { 0x16B56, 0x16E85, 0x16E86, + 0x1D2C5, + 0x1D2C6, 0x1D2E5, 0x1D2E6, 0x1D364, @@ -366713,6 +371428,8 @@ static const UV UNI_NV__5_invlist[] = { 0x1E146, 0x1E2F5, 0x1E2F6, + 0x1E4F5, + 0x1E4F6, 0x1E8CB, 0x1E8CC, 0x1E955, @@ -366930,7 +371647,7 @@ static const UV UNI_NV__500000_invlist[] # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__6_invlist[] = { /* for ASCII/Latin1 */ - 229, /* Number of elements */ + 235, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -367103,6 +371820,8 @@ static const UV UNI_NV__6_invlist[] = { 0x11D57, 0x11DA6, 0x11DA7, + 0x11F56, + 0x11F57, 0x12404, 0x12405, 0x1240B, @@ -367127,6 +371846,8 @@ static const UV UNI_NV__6_invlist[] = { 0x16B57, 0x16E86, 0x16E87, + 0x1D2C6, + 0x1D2C7, 0x1D2E6, 0x1D2E7, 0x1D365, @@ -367145,6 +371866,8 @@ static const UV UNI_NV__6_invlist[] = { 0x1E147, 0x1E2F6, 0x1E2F7, + 0x1E4F6, + 0x1E4F7, 0x1E8CC, 0x1E8CD, 0x1E956, @@ -367173,7 +371896,7 @@ static const UV UNI_NV__6_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__6_invlist[] = { /* for EBCDIC 1047 */ - 229, /* Number of elements */ + 235, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -367346,6 +372069,8 @@ static const UV UNI_NV__6_invlist[] = { 0x11D57, 0x11DA6, 0x11DA7, + 0x11F56, + 0x11F57, 0x12404, 0x12405, 0x1240B, @@ -367370,6 +372095,8 @@ static const UV UNI_NV__6_invlist[] = { 0x16B57, 0x16E86, 0x16E87, + 0x1D2C6, + 0x1D2C7, 0x1D2E6, 0x1D2E7, 0x1D365, @@ -367388,6 +372115,8 @@ static const UV UNI_NV__6_invlist[] = { 0x1E147, 0x1E2F6, 0x1E2F7, + 0x1E4F6, + 0x1E4F7, 0x1E8CC, 0x1E8CD, 0x1E956, @@ -367416,7 +372145,7 @@ static const UV UNI_NV__6_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__6_invlist[] = { /* for EBCDIC 037 */ - 229, /* Number of elements */ + 235, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -367589,6 +372318,8 @@ static const UV UNI_NV__6_invlist[] = { 0x11D57, 0x11DA6, 0x11DA7, + 0x11F56, + 0x11F57, 0x12404, 0x12405, 0x1240B, @@ -367613,6 +372344,8 @@ static const UV UNI_NV__6_invlist[] = { 0x16B57, 0x16E86, 0x16E87, + 0x1D2C6, + 0x1D2C7, 0x1D2E6, 0x1D2E7, 0x1D365, @@ -367631,6 +372364,8 @@ static const UV UNI_NV__6_invlist[] = { 0x1E147, 0x1E2F6, 0x1E2F7, + 0x1E4F6, + 0x1E4F7, 0x1E8CC, 0x1E8CD, 0x1E956, @@ -367754,7 +372489,7 @@ static const UV UNI_NV__600000_invlist[] # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__7_invlist[] = { /* for ASCII/Latin1 */ - 223, /* Number of elements */ + 229, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -367923,6 +372658,8 @@ static const UV UNI_NV__7_invlist[] = { 0x11D58, 0x11DA7, 0x11DA8, + 0x11F57, + 0x11F58, 0x12405, 0x12406, 0x1240C, @@ -367945,6 +372682,8 @@ static const UV UNI_NV__7_invlist[] = { 0x16B58, 0x16E87, 0x16E88, + 0x1D2C7, + 0x1D2C8, 0x1D2E7, 0x1D2E8, 0x1D366, @@ -367963,6 +372702,8 @@ static const UV UNI_NV__7_invlist[] = { 0x1E148, 0x1E2F7, 0x1E2F8, + 0x1E4F7, + 0x1E4F8, 0x1E8CD, 0x1E8CE, 0x1E957, @@ -367991,7 +372732,7 @@ static const UV UNI_NV__7_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__7_invlist[] = { /* for EBCDIC 1047 */ - 223, /* Number of elements */ + 229, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -368160,6 +372901,8 @@ static const UV UNI_NV__7_invlist[] = { 0x11D58, 0x11DA7, 0x11DA8, + 0x11F57, + 0x11F58, 0x12405, 0x12406, 0x1240C, @@ -368182,6 +372925,8 @@ static const UV UNI_NV__7_invlist[] = { 0x16B58, 0x16E87, 0x16E88, + 0x1D2C7, + 0x1D2C8, 0x1D2E7, 0x1D2E8, 0x1D366, @@ -368200,6 +372945,8 @@ static const UV UNI_NV__7_invlist[] = { 0x1E148, 0x1E2F7, 0x1E2F8, + 0x1E4F7, + 0x1E4F8, 0x1E8CD, 0x1E8CE, 0x1E957, @@ -368228,7 +372975,7 @@ static const UV UNI_NV__7_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__7_invlist[] = { /* for EBCDIC 037 */ - 223, /* Number of elements */ + 229, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -368397,6 +373144,8 @@ static const UV UNI_NV__7_invlist[] = { 0x11D58, 0x11DA7, 0x11DA8, + 0x11F57, + 0x11F58, 0x12405, 0x12406, 0x1240C, @@ -368419,6 +373168,8 @@ static const UV UNI_NV__7_invlist[] = { 0x16B58, 0x16E87, 0x16E88, + 0x1D2C7, + 0x1D2C8, 0x1D2E7, 0x1D2E8, 0x1D366, @@ -368437,6 +373188,8 @@ static const UV UNI_NV__7_invlist[] = { 0x1E148, 0x1E2F7, 0x1E2F8, + 0x1E4F7, + 0x1E4F8, 0x1E8CD, 0x1E8CE, 0x1E957, @@ -368588,7 +373341,7 @@ static const UV UNI_NV__700000_invlist[] # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__8_invlist[] = { /* for ASCII/Latin1 */ - 217, /* Number of elements */ + 223, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -368753,6 +373506,8 @@ static const UV UNI_NV__8_invlist[] = { 0x11D59, 0x11DA8, 0x11DA9, + 0x11F58, + 0x11F59, 0x12406, 0x12407, 0x1240D, @@ -368775,6 +373530,8 @@ static const UV UNI_NV__8_invlist[] = { 0x16B59, 0x16E88, 0x16E89, + 0x1D2C8, + 0x1D2C9, 0x1D2E8, 0x1D2E9, 0x1D367, @@ -368793,6 +373550,8 @@ static const UV UNI_NV__8_invlist[] = { 0x1E149, 0x1E2F8, 0x1E2F9, + 0x1E4F8, + 0x1E4F9, 0x1E8CE, 0x1E8CF, 0x1E958, @@ -368819,7 +373578,7 @@ static const UV UNI_NV__8_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__8_invlist[] = { /* for EBCDIC 1047 */ - 217, /* Number of elements */ + 223, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -368984,6 +373743,8 @@ static const UV UNI_NV__8_invlist[] = { 0x11D59, 0x11DA8, 0x11DA9, + 0x11F58, + 0x11F59, 0x12406, 0x12407, 0x1240D, @@ -369006,6 +373767,8 @@ static const UV UNI_NV__8_invlist[] = { 0x16B59, 0x16E88, 0x16E89, + 0x1D2C8, + 0x1D2C9, 0x1D2E8, 0x1D2E9, 0x1D367, @@ -369024,6 +373787,8 @@ static const UV UNI_NV__8_invlist[] = { 0x1E149, 0x1E2F8, 0x1E2F9, + 0x1E4F8, + 0x1E4F9, 0x1E8CE, 0x1E8CF, 0x1E958, @@ -369050,7 +373815,7 @@ static const UV UNI_NV__8_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__8_invlist[] = { /* for EBCDIC 037 */ - 217, /* Number of elements */ + 223, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -369215,6 +373980,8 @@ static const UV UNI_NV__8_invlist[] = { 0x11D59, 0x11DA8, 0x11DA9, + 0x11F58, + 0x11F59, 0x12406, 0x12407, 0x1240D, @@ -369237,6 +374004,8 @@ static const UV UNI_NV__8_invlist[] = { 0x16B59, 0x16E88, 0x16E89, + 0x1D2C8, + 0x1D2C9, 0x1D2E8, 0x1D2E9, 0x1D367, @@ -369255,6 +374024,8 @@ static const UV UNI_NV__8_invlist[] = { 0x1E149, 0x1E2F8, 0x1E2F9, + 0x1E4F8, + 0x1E4F9, 0x1E8CE, 0x1E8CF, 0x1E958, @@ -369372,7 +374143,7 @@ static const UV UNI_NV__800000_invlist[] # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__9_invlist[] = { /* for ASCII/Latin1 */ - 221, /* Number of elements */ + 227, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -369539,6 +374310,8 @@ static const UV UNI_NV__9_invlist[] = { 0x11D5A, 0x11DA9, 0x11DAA, + 0x11F59, + 0x11F5A, 0x12407, 0x12408, 0x1240E, @@ -369561,6 +374334,8 @@ static const UV UNI_NV__9_invlist[] = { 0x16B5A, 0x16E89, 0x16E8A, + 0x1D2C9, + 0x1D2CA, 0x1D2E9, 0x1D2EA, 0x1D368, @@ -369579,6 +374354,8 @@ static const UV UNI_NV__9_invlist[] = { 0x1E14A, 0x1E2F9, 0x1E2FA, + 0x1E4F9, + 0x1E4FA, 0x1E8CF, 0x1E8D0, 0x1E959, @@ -369607,7 +374384,7 @@ static const UV UNI_NV__9_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__9_invlist[] = { /* for EBCDIC 1047 */ - 221, /* Number of elements */ + 227, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -369774,6 +374551,8 @@ static const UV UNI_NV__9_invlist[] = { 0x11D5A, 0x11DA9, 0x11DAA, + 0x11F59, + 0x11F5A, 0x12407, 0x12408, 0x1240E, @@ -369796,6 +374575,8 @@ static const UV UNI_NV__9_invlist[] = { 0x16B5A, 0x16E89, 0x16E8A, + 0x1D2C9, + 0x1D2CA, 0x1D2E9, 0x1D2EA, 0x1D368, @@ -369814,6 +374595,8 @@ static const UV UNI_NV__9_invlist[] = { 0x1E14A, 0x1E2F9, 0x1E2FA, + 0x1E4F9, + 0x1E4FA, 0x1E8CF, 0x1E8D0, 0x1E959, @@ -369842,7 +374625,7 @@ static const UV UNI_NV__9_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__9_invlist[] = { /* for EBCDIC 037 */ - 221, /* Number of elements */ + 227, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -370009,6 +374792,8 @@ static const UV UNI_NV__9_invlist[] = { 0x11D5A, 0x11DA9, 0x11DAA, + 0x11F59, + 0x11F5A, 0x12407, 0x12408, 0x1240E, @@ -370031,6 +374816,8 @@ static const UV UNI_NV__9_invlist[] = { 0x16B5A, 0x16E89, 0x16E8A, + 0x1D2C9, + 0x1D2CA, 0x1D2E9, 0x1D2EA, 0x1D368, @@ -370049,6 +374836,8 @@ static const UV UNI_NV__9_invlist[] = { 0x1E14A, 0x1E2F9, 0x1E2FA, + 0x1E4F9, + 0x1E4FA, 0x1E8CF, 0x1E8D0, 0x1E959, @@ -370180,7 +374969,7 @@ static const UV UNI_NV__900000_invlist[] # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_NV__NAN_invlist[] = { /* for ASCII/Latin1 */ - 413, /* Number of elements */ + 419, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -370523,6 +375312,8 @@ static const UV UNI_NV__NAN_invlist[] = 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x11FC0, 0x11FD5, 0x12400, @@ -370537,6 +375328,8 @@ static const UV UNI_NV__NAN_invlist[] = 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -370547,6 +375340,8 @@ static const UV UNI_NV__NAN_invlist[] = 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E8C7, 0x1E8D0, 0x1E950, @@ -370607,7 +375402,7 @@ static const UV UNI_NV__NAN_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_NV__NAN_invlist[] = { /* for EBCDIC 1047 */ - 413, /* Number of elements */ + 419, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -370950,6 +375745,8 @@ static const UV UNI_NV__NAN_invlist[] = 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x11FC0, 0x11FD5, 0x12400, @@ -370964,6 +375761,8 @@ static const UV UNI_NV__NAN_invlist[] = 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -370974,6 +375773,8 @@ static const UV UNI_NV__NAN_invlist[] = 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E8C7, 0x1E8D0, 0x1E950, @@ -371034,7 +375835,7 @@ static const UV UNI_NV__NAN_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_NV__NAN_invlist[] = { /* for EBCDIC 037 */ - 413, /* Number of elements */ + 419, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -371377,6 +376178,8 @@ static const UV UNI_NV__NAN_invlist[] = 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x11FC0, 0x11FD5, 0x12400, @@ -371391,6 +376194,8 @@ static const UV UNI_NV__NAN_invlist[] = 0x16B62, 0x16E80, 0x16E97, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D360, @@ -371401,6 +376206,8 @@ static const UV UNI_NV__NAN_invlist[] = 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E8C7, 0x1E8D0, 0x1E950, @@ -371600,7 +376407,7 @@ static const UV UNI_OUGR_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_P_invlist[] = { /* for ASCII/Latin1 */ - 379, /* Number of elements */ + 383, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -371953,12 +376760,16 @@ static const UV UNI_P_invlist[] = { /* 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C70, 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FFF, 0x12000, 0x12470, @@ -371993,7 +376804,7 @@ static const UV UNI_P_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_P_invlist[] = { /* for EBCDIC 1047 */ - 387, /* Number of elements */ + 391, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -372354,12 +377165,16 @@ static const UV UNI_P_invlist[] = { /* 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C70, 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FFF, 0x12000, 0x12470, @@ -372394,7 +377209,7 @@ static const UV UNI_P_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_P_invlist[] = { /* for EBCDIC 037 */ - 385, /* Number of elements */ + 389, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -372753,12 +377568,16 @@ static const UV UNI_P_invlist[] = { /* 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C70, 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FFF, 0x12000, 0x12470, @@ -374096,7 +378915,7 @@ static const UV UNI_PLAYINGCARDS_invlist # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_PO_invlist[] = { /* for ASCII/Latin1 */ - 371, /* Number of elements */ + 375, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -374441,12 +379260,16 @@ static const UV UNI_PO_invlist[] = { /* 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C70, 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FFF, 0x12000, 0x12470, @@ -374481,7 +379304,7 @@ static const UV UNI_PO_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_PO_invlist[] = { /* for EBCDIC 1047 */ - 375, /* Number of elements */ + 379, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -374830,12 +379653,16 @@ static const UV UNI_PO_invlist[] = { /* 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C70, 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FFF, 0x12000, 0x12470, @@ -374870,7 +379697,7 @@ static const UV UNI_PO_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_PO_invlist[] = { /* for EBCDIC 037 */ - 375, /* Number of elements */ + 379, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -375219,12 +380046,16 @@ static const UV UNI_PO_invlist[] = { /* 0x11A9D, 0x11A9E, 0x11AA3, + 0x11B00, + 0x11B0A, 0x11C41, 0x11C46, 0x11C70, 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F50, 0x11FFF, 0x12000, 0x12470, @@ -376038,7 +380869,7 @@ static const UV UNI_RUNR_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_S_invlist[] = { /* for ASCII/Latin1 */ - 469, /* Number of elements */ + 465, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -376461,14 +381292,14 @@ static const UV UNI_S_invlist[] = { /* 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -376490,23 +381321,19 @@ static const UV UNI_S_invlist[] = { /* 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -376521,7 +381348,7 @@ static const UV UNI_S_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_S_invlist[] = { /* for EBCDIC 1047 */ - 475, /* Number of elements */ + 471, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -376950,14 +381777,14 @@ static const UV UNI_S_invlist[] = { /* 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -376979,23 +381806,19 @@ static const UV UNI_S_invlist[] = { /* 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -377010,7 +381833,7 @@ static const UV UNI_S_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_S_invlist[] = { /* for EBCDIC 037 */ - 473, /* Number of elements */ + 469, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -377437,14 +382260,14 @@ static const UV UNI_S_invlist[] = { /* 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -377466,23 +382289,19 @@ static const UV UNI_S_invlist[] = { /* 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -377906,7 +382725,7 @@ static const UV UNI_SB__CL_invlist[] = { # endif /* EBCDIC 037 */ static const UV UNI_SB__EX_invlist[] = { /* for all charsets */ - 605, /* Number of elements */ + 627, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -378071,6 +382890,8 @@ static const UV UNI_SB__EX_invlist[] = { 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -378108,7 +382929,7 @@ static const UV UNI_SB__EX_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -378315,6 +383136,8 @@ static const UV UNI_SB__EX_invlist[] = { 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -378353,6 +383176,8 @@ static const UV UNI_SB__EX_invlist[] = { 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112EB, 0x11300, @@ -378447,6 +383272,18 @@ static const UV UNI_SB__EX_invlist[] = { 0x11D98, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -378501,12 +383338,16 @@ static const UV UNI_SB__EX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -378560,7 +383401,7 @@ static const UV UNI_SB__FO_invlist[] = { 0x110CD, 0x110CE, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -378617,7 +383458,7 @@ static const UV UNI_SB__FO_invlist[] = { 0x110CD, 0x110CE, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -378674,7 +383515,7 @@ static const UV UNI_SB__FO_invlist[] = { 0x110CD, 0x110CE, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -378686,7 +383527,7 @@ static const UV UNI_SB__FO_invlist[] = { # endif /* EBCDIC 037 */ static const UV UNI_SB__LE_invlist[] = { /* for all charsets */ - 1073, /* Number of elements */ + 1087, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -378995,7 +383836,7 @@ static const UV UNI_SB__LE_invlist[] = { 0x108F, 0x10D0, 0x10FB, - 0x10FC, + 0x10FD, 0x1249, 0x124A, 0x124E, @@ -379187,8 +384028,6 @@ static const UV UNI_SB__LE_invlist[] = { 0xA789, 0xA78F, 0xA790, - 0xA7F2, - 0xA7F5, 0xA7F7, 0xA7F8, 0xA7FB, @@ -379263,8 +384102,6 @@ static const UV UNI_SB__LE_invlist[] = { 0xAB27, 0xAB28, 0xAB2F, - 0xAB69, - 0xAB6A, 0xABC0, 0xABE3, 0xAC00, @@ -379469,6 +384306,8 @@ static const UV UNI_SB__LE_invlist[] = { 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -379591,6 +384430,12 @@ static const UV UNI_SB__LE_invlist[] = { 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -379602,7 +384447,9 @@ static const UV UNI_SB__LE_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -379645,8 +384492,12 @@ static const UV UNI_SB__LE_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -379671,6 +384522,8 @@ static const UV UNI_SB__LE_invlist[] = { 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -379752,7 +384605,7 @@ static const UV UNI_SB__LE_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -379762,13 +384615,15 @@ static const UV UNI_SB__LE_invlist[] = { 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_SB__LO_invlist[] = { /* for ASCII/Latin1 */ - 1331, /* Number of elements */ + 1339, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -380321,6 +385176,8 @@ static const UV UNI_SB__LO_invlist[] = { 0x530, 0x560, 0x589, + 0x10FC, + 0x10FD, 0x13F8, 0x13FE, 0x1C80, @@ -380999,6 +385856,8 @@ static const UV UNI_SB__LO_invlist[] = { 0xA7D8, 0xA7D9, 0xA7DA, + 0xA7F2, + 0xA7F5, 0xA7F6, 0xA7F7, 0xA7F8, @@ -381006,7 +385865,7 @@ static const UV UNI_SB__LO_invlist[] = { 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, + 0xAB6A, 0xAB70, 0xABC0, 0xFB00, @@ -381101,6 +385960,10 @@ static const UV UNI_SB__LO_invlist[] = { 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E922, 0x1E944 }; @@ -381113,7 +385976,7 @@ static const UV UNI_SB__LO_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_SB__LO_invlist[] = { /* for EBCDIC 1047 */ - 1339, /* Number of elements */ + 1347, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -381674,6 +386537,8 @@ static const UV UNI_SB__LO_invlist[] = { 0x530, 0x560, 0x589, + 0x10FC, + 0x10FD, 0x13F8, 0x13FE, 0x1C80, @@ -382352,6 +387217,8 @@ static const UV UNI_SB__LO_invlist[] = { 0xA7D8, 0xA7D9, 0xA7DA, + 0xA7F2, + 0xA7F5, 0xA7F6, 0xA7F7, 0xA7F8, @@ -382359,7 +387226,7 @@ static const UV UNI_SB__LO_invlist[] = { 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, + 0xAB6A, 0xAB70, 0xABC0, 0xFB00, @@ -382454,6 +387321,10 @@ static const UV UNI_SB__LO_invlist[] = { 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E922, 0x1E944 }; @@ -382466,7 +387337,7 @@ static const UV UNI_SB__LO_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_SB__LO_invlist[] = { /* for EBCDIC 037 */ - 1339, /* Number of elements */ + 1347, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -383027,6 +387898,8 @@ static const UV UNI_SB__LO_invlist[] = { 0x530, 0x560, 0x589, + 0x10FC, + 0x10FD, 0x13F8, 0x13FE, 0x1C80, @@ -383705,6 +388578,8 @@ static const UV UNI_SB__LO_invlist[] = { 0xA7D8, 0xA7D9, 0xA7DA, + 0xA7F2, + 0xA7F5, 0xA7F6, 0xA7F7, 0xA7F8, @@ -383712,7 +388587,7 @@ static const UV UNI_SB__LO_invlist[] = { 0xAB30, 0xAB5B, 0xAB5C, - 0xAB69, + 0xAB6A, 0xAB70, 0xABC0, 0xFB00, @@ -383807,6 +388682,10 @@ static const UV UNI_SB__LO_invlist[] = { 0x1DF0A, 0x1DF0B, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E922, 0x1E944 }; @@ -383816,7 +388695,7 @@ static const UV UNI_SB__LO_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_SB__NU_invlist[] = { /* for ASCII/Latin1 */ - 127, /* Number of elements */ + 131, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -383931,6 +388810,8 @@ static const UV UNI_SB__NU_invlist[] = { 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -383943,6 +388824,8 @@ static const UV UNI_SB__NU_invlist[] = { 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -383957,7 +388840,7 @@ static const UV UNI_SB__NU_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_SB__NU_invlist[] = { /* for EBCDIC 1047 */ - 127, /* Number of elements */ + 131, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -384072,6 +388955,8 @@ static const UV UNI_SB__NU_invlist[] = { 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -384084,6 +388969,8 @@ static const UV UNI_SB__NU_invlist[] = { 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -384098,7 +388985,7 @@ static const UV UNI_SB__NU_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_SB__NU_invlist[] = { /* for EBCDIC 037 */ - 127, /* Number of elements */ + 131, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -384213,6 +389100,8 @@ static const UV UNI_SB__NU_invlist[] = { 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -384225,6 +389114,8 @@ static const UV UNI_SB__NU_invlist[] = { 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -384542,7 +389433,7 @@ static const UV UNI_SB__SP_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_SB__ST_invlist[] = { /* for ASCII/Latin1 */ - 153, /* Number of elements */ + 155, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -384685,6 +389576,8 @@ static const UV UNI_SB__ST_invlist[] = { 0x11C43, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F45, 0x16A6E, 0x16A70, 0x16AF5, @@ -384709,7 +389602,7 @@ static const UV UNI_SB__ST_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_SB__ST_invlist[] = { /* for EBCDIC 1047 */ - 153, /* Number of elements */ + 155, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -384852,6 +389745,8 @@ static const UV UNI_SB__ST_invlist[] = { 0x11C43, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F45, 0x16A6E, 0x16A70, 0x16AF5, @@ -384876,7 +389771,7 @@ static const UV UNI_SB__ST_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_SB__ST_invlist[] = { /* for EBCDIC 037 */ - 153, /* Number of elements */ + 155, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -385019,6 +389914,8 @@ static const UV UNI_SB__ST_invlist[] = { 0x11C43, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F45, 0x16A6E, 0x16A70, 0x16AF5, @@ -389026,7 +393923,7 @@ static const UV UNI_SB__UP_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_SB__XX_invlist[] = { /* for ASCII/Latin1 */ - 1661, /* Number of elements */ + 1681, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -389374,7 +394271,7 @@ static const UV UNI_SB__XX_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -389440,7 +394337,7 @@ static const UV UNI_SB__XX_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -390157,7 +395054,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -390210,7 +395107,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x1123B, 0x1123D, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -390379,6 +395276,14 @@ static const UV UNI_SB__XX_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F45, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -390390,9 +395295,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -390449,8 +395352,12 @@ static const UV UNI_SB__XX_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -390557,6 +395464,8 @@ static const UV UNI_SB__XX_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -390567,6 +395476,10 @@ static const UV UNI_SB__XX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -390579,6 +395492,8 @@ static const UV UNI_SB__XX_invlist[] = { 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -390674,7 +395589,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -390685,6 +395600,8 @@ static const UV UNI_SB__XX_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -390701,7 +395618,7 @@ static const UV UNI_SB__XX_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_SB__XX_invlist[] = { /* for EBCDIC 1047 */ - 1681, /* Number of elements */ + 1701, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -391069,7 +395986,7 @@ static const UV UNI_SB__XX_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -391135,7 +396052,7 @@ static const UV UNI_SB__XX_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -391852,7 +396769,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -391905,7 +396822,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x1123B, 0x1123D, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -392074,6 +396991,14 @@ static const UV UNI_SB__XX_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F45, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -392085,9 +397010,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -392144,8 +397067,12 @@ static const UV UNI_SB__XX_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -392252,6 +397179,8 @@ static const UV UNI_SB__XX_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -392262,6 +397191,10 @@ static const UV UNI_SB__XX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -392274,6 +397207,8 @@ static const UV UNI_SB__XX_invlist[] = { 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -392369,7 +397304,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -392380,6 +397315,8 @@ static const UV UNI_SB__XX_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -392396,7 +397333,7 @@ static const UV UNI_SB__XX_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_SB__XX_invlist[] = { /* for EBCDIC 037 */ - 1679, /* Number of elements */ + 1699, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -392762,7 +397699,7 @@ static const UV UNI_SB__XX_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -392828,7 +397765,7 @@ static const UV UNI_SB__XX_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -393545,7 +398482,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -393598,7 +398535,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x1123B, 0x1123D, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -393767,6 +398704,14 @@ static const UV UNI_SB__XX_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F45, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -393778,9 +398723,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -393837,8 +398780,12 @@ static const UV UNI_SB__XX_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -393945,6 +398892,8 @@ static const UV UNI_SB__XX_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -393955,6 +398904,10 @@ static const UV UNI_SB__XX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -393967,6 +398920,8 @@ static const UV UNI_SB__XX_invlist[] = { 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -394062,7 +399017,7 @@ static const UV UNI_SB__XX_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -394073,6 +399028,8 @@ static const UV UNI_SB__XX_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -394274,7 +399231,7 @@ static const UV UNI_SC__ADLM_invlist[] = }; static const UV UNI_SC__ARAB_invlist[] = { /* for all charsets */ - 115, /* Number of elements */ + 117, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -394325,6 +399282,8 @@ static const UV UNI_SC__ARAB_invlist[] = 0xFEFD, 0x10E60, 0x10E7F, + 0x10EFD, + 0x10F00, 0x1EE00, 0x1EE04, 0x1EE05, @@ -394524,7 +399483,7 @@ static const UV UNI_SC__CPRT_invlist[] = }; static const UV UNI_SC__CYRL_invlist[] = { /* for all charsets */ - 17, /* Number of elements */ + 21, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -394544,11 +399503,15 @@ static const UV UNI_SC__CYRL_invlist[] = 0xA640, 0xA6A0, 0xFE2E, - 0xFE30 + 0xFE30, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090 }; static const UV UNI_SC__DEVA_invlist[] = { /* for all charsets */ - 9, /* Number of elements */ + 11, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -394560,7 +399523,9 @@ static const UV UNI_SC__DEVA_invlist[] = 0x966, 0x980, 0xA8E0, - 0xA900 + 0xA900, + 0x11B00, + 0x11B0A }; static const UV UNI_SC__DOGR_invlist[] = { /* for all charsets */ @@ -394876,7 +399841,7 @@ static const UV UNI_SC__GURU_invlist[] = }; static const UV UNI_SC__HAN_invlist[] = { /* for all charsets */ - 41, /* Number of elements */ + 43, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -394910,7 +399875,7 @@ static const UV UNI_SC__HAN_invlist[] = 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -394920,7 +399885,9 @@ static const UV UNI_SC__HAN_invlist[] = 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; static const UV UNI_SC__HANG_invlist[] = { /* for all charsets */ @@ -394970,7 +399937,7 @@ static const UV UNI_SC__HANO_invlist[] = }; static const UV UNI_SC__HIRA_invlist[] = { /* for all charsets */ - 11, /* Number of elements */ + 13, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -394981,6 +399948,8 @@ static const UV UNI_SC__HIRA_invlist[] = 0x30A0, 0x1B001, 0x1B120, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, 0x1F200, @@ -395014,7 +399983,7 @@ static const UV UNI_SC__KALI_invlist[] = }; static const UV UNI_SC__KANA_invlist[] = { /* for all charsets */ - 27, /* Number of elements */ + 29, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -395043,6 +400012,8 @@ static const UV UNI_SC__KANA_invlist[] = 0x1B001, 0x1B120, 0x1B123, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168 }; @@ -395056,7 +400027,7 @@ static const UV UNI_SC__KHOJ_invlist[] = 0x11200, 0x11212, 0x11213, - 0x1123F + 0x11242 }; static const UV UNI_SC__KNDA_invlist[] = { /* for all charsets */ @@ -395090,7 +400061,7 @@ static const UV UNI_SC__KNDA_invlist[] = 0xCE6, 0xCF0, 0xCF1, - 0xCF3 + 0xCF4 }; static const UV UNI_SC__KTHI_invlist[] = { /* for all charsets */ @@ -395108,7 +400079,7 @@ static const UV UNI_SC__KTHI_invlist[] = # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_SC__LATN_invlist[] = { /* for ASCII/Latin1 */ - 77, /* Number of elements */ + 79, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -395188,7 +400159,9 @@ static const UV UNI_SC__LATN_invlist[] = 0x107B2, 0x107BB, 0x1DF00, - 0x1DF1F + 0x1DF1F, + 0x1DF25, + 0x1DF2B }; # endif /* ASCII/Latin1 */ @@ -395199,7 +400172,7 @@ static const UV UNI_SC__LATN_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_SC__LATN_invlist[] = { /* for EBCDIC 1047 */ - 103, /* Number of elements */ + 105, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -395305,7 +400278,9 @@ static const UV UNI_SC__LATN_invlist[] = 0x107B2, 0x107BB, 0x1DF00, - 0x1DF1F + 0x1DF1F, + 0x1DF25, + 0x1DF2B }; # endif /* EBCDIC 1047 */ @@ -395316,7 +400291,7 @@ static const UV UNI_SC__LATN_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_SC__LATN_invlist[] = { /* for EBCDIC 037 */ - 99, /* Number of elements */ + 101, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -395418,7 +400393,9 @@ static const UV UNI_SC__LATN_invlist[] = 0x107B2, 0x107BB, 0x1DF00, - 0x1DF1F + 0x1DF1F, + 0x1DF25, + 0x1DF2B }; # endif /* EBCDIC 037 */ @@ -396052,7 +401029,7 @@ static const UV UNI_SC__YI_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_SC__ZYYY_invlist[] = { /* for ASCII/Latin1 */ - 348, /* Number of elements */ + 346, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -396268,6 +401245,8 @@ static const UV UNI_SC__ZYYY_invlist[] = 0x1D1AA, 0x1D1AE, 0x1D1EB, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -396348,14 +401327,14 @@ static const UV UNI_SC__ZYYY_invlist[] = 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -396377,23 +401356,19 @@ static const UV UNI_SC__ZYYY_invlist[] = 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -396414,7 +401389,7 @@ static const UV UNI_SC__ZYYY_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_SC__ZYYY_invlist[] = { /* for EBCDIC 1047 */ - 374, /* Number of elements */ + 372, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -396656,6 +401631,8 @@ static const UV UNI_SC__ZYYY_invlist[] = 0x1D1AA, 0x1D1AE, 0x1D1EB, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -396736,14 +401713,14 @@ static const UV UNI_SC__ZYYY_invlist[] = 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -396765,23 +401742,19 @@ static const UV UNI_SC__ZYYY_invlist[] = 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -396802,7 +401775,7 @@ static const UV UNI_SC__ZYYY_invlist[] = && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_SC__ZYYY_invlist[] = { /* for EBCDIC 037 */ - 370, /* Number of elements */ + 368, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -397040,6 +402013,8 @@ static const UV UNI_SC__ZYYY_invlist[] = 0x1D1AA, 0x1D1AE, 0x1D1EB, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -397120,14 +402095,14 @@ static const UV UNI_SC__ZYYY_invlist[] = 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -397149,23 +402124,19 @@ static const UV UNI_SC__ZYYY_invlist[] = 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -397183,7 +402154,7 @@ static const UV UNI_SC__ZYYY_invlist[] = # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_SD_invlist[] = { /* for ASCII/Latin1 */ - 65, /* Number of elements */ + 69, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -397251,7 +402222,11 @@ static const UV UNI_SD_invlist[] = { /* 0x1D692, 0x1D694, 0x1DF1A, - 0x1DF1B + 0x1DF1B, + 0x1E04C, + 0x1E04E, + 0x1E068, + 0x1E069 }; # endif /* ASCII/Latin1 */ @@ -397262,7 +402237,7 @@ static const UV UNI_SD_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_SD_invlist[] = { /* for EBCDIC 1047 */ - 67, /* Number of elements */ + 71, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -397332,7 +402307,11 @@ static const UV UNI_SD_invlist[] = { /* 0x1D692, 0x1D694, 0x1DF1A, - 0x1DF1B + 0x1DF1B, + 0x1E04C, + 0x1E04E, + 0x1E068, + 0x1E069 }; # endif /* EBCDIC 1047 */ @@ -397343,7 +402322,7 @@ static const UV UNI_SD_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_SD_invlist[] = { /* for EBCDIC 037 */ - 67, /* Number of elements */ + 71, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -397413,7 +402392,11 @@ static const UV UNI_SD_invlist[] = { /* 0x1D692, 0x1D694, 0x1DF1A, - 0x1DF1B + 0x1DF1B, + 0x1E04C, + 0x1E04E, + 0x1E068, + 0x1E069 }; # endif /* EBCDIC 037 */ @@ -398221,7 +403204,7 @@ static const UV UNI_SMALLKANAEXT_invlist # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_SO_invlist[] = { /* for ASCII/Latin1 */ - 373, /* Number of elements */ + 369, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -398548,14 +403531,14 @@ static const UV UNI_SO_invlist[] = { /* 0x1F3FB, 0x1F400, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -398577,23 +403560,19 @@ static const UV UNI_SO_invlist[] = { /* 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -398608,7 +403587,7 @@ static const UV UNI_SO_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_SO_invlist[] = { /* for EBCDIC 1047 */ - 373, /* Number of elements */ + 369, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -398935,14 +403914,14 @@ static const UV UNI_SO_invlist[] = { /* 0x1F3FB, 0x1F400, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -398964,23 +403943,19 @@ static const UV UNI_SO_invlist[] = { /* 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -398995,7 +403970,7 @@ static const UV UNI_SO_invlist[] = { /* && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_SO_invlist[] = { /* for EBCDIC 037 */ - 373, /* Number of elements */ + 369, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -399322,14 +404297,14 @@ static const UV UNI_SO_invlist[] = { /* 0x1F3FB, 0x1F400, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -399351,23 +404326,19 @@ static const UV UNI_SO_invlist[] = { /* 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -399433,7 +404404,7 @@ static const UV UNI_SPECIALS_invlist[] = # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_STERM_invlist[] = { /* for ASCII/Latin1 */ - 159, /* Number of elements */ + 161, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -399582,6 +404553,8 @@ static const UV UNI_STERM_invlist[] = { 0x11C43, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F45, 0x16A6E, 0x16A70, 0x16AF5, @@ -399606,7 +404579,7 @@ static const UV UNI_STERM_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_STERM_invlist[] = { /* for EBCDIC 1047 */ - 159, /* Number of elements */ + 161, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -399755,6 +404728,8 @@ static const UV UNI_STERM_invlist[] = { 0x11C43, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F45, 0x16A6E, 0x16A70, 0x16AF5, @@ -399779,7 +404754,7 @@ static const UV UNI_STERM_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_STERM_invlist[] = { /* for EBCDIC 037 */ - 159, /* Number of elements */ + 161, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -399928,6 +404903,8 @@ static const UV UNI_STERM_invlist[] = { 0x11C43, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F45, 0x16A6E, 0x16A70, 0x16AF5, @@ -400387,7 +405364,7 @@ static const UV UNI_TELU_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_TERM_invlist[] = { /* for ASCII/Latin1 */ - 215, /* Number of elements */ + 217, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -400590,6 +405567,8 @@ static const UV UNI_TERM_invlist[] = { 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F45, 0x12470, 0x12475, 0x16A6E, @@ -400616,7 +405595,7 @@ static const UV UNI_TERM_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_TERM_invlist[] = { /* for EBCDIC 1047 */ - 217, /* Number of elements */ + 219, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -400821,6 +405800,8 @@ static const UV UNI_TERM_invlist[] = { 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F45, 0x12470, 0x12475, 0x16A6E, @@ -400847,7 +405828,7 @@ static const UV UNI_TERM_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_TERM_invlist[] = { /* for EBCDIC 037 */ - 217, /* Number of elements */ + 219, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -401052,6 +406033,8 @@ static const UV UNI_TERM_invlist[] = { 0x11C72, 0x11EF7, 0x11EF9, + 0x11F43, + 0x11F45, 0x12470, 0x12475, 0x16A6E, @@ -401251,7 +406234,7 @@ static const UV UNI_UGAR_invlist[] = { }; static const UV UNI_UIDEO_invlist[] = { /* for all charsets */ - 31, /* Number of elements */ + 33, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -401277,7 +406260,7 @@ static const UV UNI_UIDEO_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -401285,7 +406268,9 @@ static const UV UNI_UIDEO_invlist[] = { 0x2CEB0, 0x2EBE1, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; static const UV UNI_VAI_invlist[] = { /* for all charsets */ @@ -401501,7 +406486,7 @@ static const UV UNI_VO__R_invlist[] = { 0x11A00, 0x11AC0, 0x13000, - 0x13440, + 0x13460, 0x14400, 0x14680, 0x16FE0, @@ -401692,7 +406677,7 @@ static const UV UNI_VO__R_invlist[] = { 0x11A00, 0x11AC0, 0x13000, - 0x13440, + 0x13460, 0x14400, 0x14680, 0x16FE0, @@ -401883,7 +406868,7 @@ static const UV UNI_VO__R_invlist[] = { 0x11A00, 0x11AC0, 0x13000, - 0x13440, + 0x13460, 0x14400, 0x14680, 0x16FE0, @@ -402261,7 +407246,7 @@ static const UV UNI_VO__U_invlist[] = { 0x11A00, 0x11AC0, 0x13000, - 0x13440, + 0x13460, 0x14400, 0x14680, 0x16FE0, @@ -402530,7 +407515,7 @@ static const UV UNI_VO__U_invlist[] = { 0x11A00, 0x11AC0, 0x13000, - 0x13440, + 0x13460, 0x14400, 0x14680, 0x16FE0, @@ -402799,7 +407784,7 @@ static const UV UNI_VO__U_invlist[] = { 0x11A00, 0x11AC0, 0x13000, - 0x13440, + 0x13460, 0x14400, 0x14680, 0x16FE0, @@ -403010,7 +407995,7 @@ static const UV UNI_WB__EX_invlist[] = { # endif /* EBCDIC 037 */ static const UV UNI_WB__EXTEND_invlist[] = { /* for all charsets */ - 607, /* Number of elements */ + 629, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -403175,6 +408160,8 @@ static const UV UNI_WB__EXTEND_invlist[] 0xCD7, 0xCE2, 0xCE4, + 0xCF3, + 0xCF4, 0xD00, 0xD04, 0xD3B, @@ -403212,7 +408199,7 @@ static const UV UNI_WB__EXTEND_invlist[] 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xF18, 0xF1A, 0xF35, @@ -403419,6 +408406,8 @@ static const UV UNI_WB__EXTEND_invlist[] 0x10D28, 0x10EAB, 0x10EAD, + 0x10EFD, + 0x10F00, 0x10F46, 0x10F51, 0x10F82, @@ -403457,6 +408446,8 @@ static const UV UNI_WB__EXTEND_invlist[] 0x11238, 0x1123E, 0x1123F, + 0x11241, + 0x11242, 0x112DF, 0x112EB, 0x11300, @@ -403551,6 +408542,18 @@ static const UV UNI_WB__EXTEND_invlist[] 0x11D98, 0x11EF3, 0x11EF7, + 0x11F00, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F34, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x13440, + 0x13441, + 0x13447, + 0x13456, 0x16AF0, 0x16AF5, 0x16B30, @@ -403605,12 +408608,16 @@ static const UV UNI_WB__EXTEND_invlist[] 0x1E025, 0x1E026, 0x1E02B, + 0x1E08F, + 0x1E090, 0x1E130, 0x1E137, 0x1E2AE, 0x1E2AF, 0x1E2EC, 0x1E2F0, + 0x1E4EC, + 0x1E4F0, 0x1E8D0, 0x1E8D7, 0x1E944, @@ -403664,7 +408671,7 @@ static const UV UNI_WB__FO_invlist[] = { 0x110CD, 0x110CE, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -403719,7 +408726,7 @@ static const UV UNI_WB__FO_invlist[] = { 0x110CD, 0x110CE, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -403774,7 +408781,7 @@ static const UV UNI_WB__FO_invlist[] = { 0x110CD, 0x110CE, 0x13430, - 0x13439, + 0x13440, 0x1BCA0, 0x1BCA4, 0x1D173, @@ -403786,7 +408793,7 @@ static const UV UNI_WB__FO_invlist[] = { # endif /* EBCDIC 037 */ static const UV UNI_WB__KA_invlist[] = { /* for all charsets */ - 29, /* Number of elements */ + 31, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -403817,6 +408824,8 @@ static const UV UNI_WB__KA_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168 }; @@ -403824,7 +408833,7 @@ static const UV UNI_WB__KA_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_WB__LE_invlist[] = { /* for ASCII/Latin1 */ - 1141, /* Number of elements */ + 1157, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -404641,6 +409650,8 @@ static const UV UNI_WB__LE_invlist[] = { 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -404761,6 +409772,12 @@ static const UV UNI_WB__LE_invlist[] = { 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -404772,7 +409789,9 @@ static const UV UNI_WB__LE_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -404873,6 +409892,10 @@ static const UV UNI_WB__LE_invlist[] = { 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -404883,6 +409906,8 @@ static const UV UNI_WB__LE_invlist[] = { 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -404979,7 +410004,7 @@ static const UV UNI_WB__LE_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_WB__LE_invlist[] = { /* for EBCDIC 1047 */ - 1167, /* Number of elements */ + 1183, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -405822,6 +410847,8 @@ static const UV UNI_WB__LE_invlist[] = { 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -405942,6 +410969,12 @@ static const UV UNI_WB__LE_invlist[] = { 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -405953,7 +410986,9 @@ static const UV UNI_WB__LE_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -406054,6 +411089,10 @@ static const UV UNI_WB__LE_invlist[] = { 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -406064,6 +411103,8 @@ static const UV UNI_WB__LE_invlist[] = { 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -406160,7 +411201,7 @@ static const UV UNI_WB__LE_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_WB__LE_invlist[] = { /* for EBCDIC 037 */ - 1163, /* Number of elements */ + 1179, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -406999,6 +412040,8 @@ static const UV UNI_WB__LE_invlist[] = { 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -407119,6 +412162,12 @@ static const UV UNI_WB__LE_invlist[] = { 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -407130,7 +412179,9 @@ static const UV UNI_WB__LE_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -407231,6 +412282,10 @@ static const UV UNI_WB__LE_invlist[] = { 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -407241,6 +412296,8 @@ static const UV UNI_WB__LE_invlist[] = { 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -407694,7 +412751,7 @@ static const UV UNI_WB__NL_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_WB__NU_invlist[] = { /* for ASCII/Latin1 */ - 127, /* Number of elements */ + 131, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -407809,6 +412866,8 @@ static const UV UNI_WB__NU_invlist[] = { 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -407821,6 +412880,8 @@ static const UV UNI_WB__NU_invlist[] = { 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -407835,7 +412896,7 @@ static const UV UNI_WB__NU_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_WB__NU_invlist[] = { /* for EBCDIC 1047 */ - 127, /* Number of elements */ + 131, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -407950,6 +413011,8 @@ static const UV UNI_WB__NU_invlist[] = { 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -407962,6 +413025,8 @@ static const UV UNI_WB__NU_invlist[] = { 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -407976,7 +413041,7 @@ static const UV UNI_WB__NU_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_WB__NU_invlist[] = { /* for EBCDIC 037 */ - 127, /* Number of elements */ + 131, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -408091,6 +413156,8 @@ static const UV UNI_WB__NU_invlist[] = { 0x11D5A, 0x11DA0, 0x11DAA, + 0x11F50, + 0x11F5A, 0x16A60, 0x16A6A, 0x16AC0, @@ -408103,6 +413170,8 @@ static const UV UNI_WB__NU_invlist[] = { 0x1E14A, 0x1E2F0, 0x1E2FA, + 0x1E4F0, + 0x1E4FA, 0x1E950, 0x1E95A, 0x1FBF0, @@ -408240,7 +413309,7 @@ static const UV UNI_WB__WSEGSPACE_invlis # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_WB__XX_invlist[] = { /* for ASCII/Latin1 */ - 1541, /* Number of elements */ + 1557, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -408576,7 +413645,7 @@ static const UV UNI_WB__XX_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -408632,7 +413701,7 @@ static const UV UNI_WB__XX_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xF00, @@ -409287,7 +414356,7 @@ static const UV UNI_WB__XX_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -409338,7 +414407,7 @@ static const UV UNI_WB__XX_invlist[] = { 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -409495,6 +414564,14 @@ static const UV UNI_WB__XX_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -409506,9 +414583,7 @@ static const UV UNI_WB__XX_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -409559,6 +414634,8 @@ static const UV UNI_WB__XX_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1BC00, @@ -409663,6 +414740,8 @@ static const UV UNI_WB__XX_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -409673,6 +414752,10 @@ static const UV UNI_WB__XX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -409685,6 +414768,8 @@ static const UV UNI_WB__XX_invlist[] = { 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -409795,7 +414880,7 @@ static const UV UNI_WB__XX_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_WB__XX_invlist[] = { /* for EBCDIC 1047 */ - 1565, /* Number of elements */ + 1581, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -410155,7 +415240,7 @@ static const UV UNI_WB__XX_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -410211,7 +415296,7 @@ static const UV UNI_WB__XX_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xF00, @@ -410866,7 +415951,7 @@ static const UV UNI_WB__XX_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -410917,7 +416002,7 @@ static const UV UNI_WB__XX_invlist[] = { 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -411074,6 +416159,14 @@ static const UV UNI_WB__XX_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -411085,9 +416178,7 @@ static const UV UNI_WB__XX_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -411138,6 +416229,8 @@ static const UV UNI_WB__XX_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1BC00, @@ -411242,6 +416335,8 @@ static const UV UNI_WB__XX_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -411252,6 +416347,10 @@ static const UV UNI_WB__XX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -411264,6 +416363,8 @@ static const UV UNI_WB__XX_invlist[] = { 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -411374,7 +416475,7 @@ static const UV UNI_WB__XX_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_WB__XX_invlist[] = { /* for EBCDIC 037 */ - 1561, /* Number of elements */ + 1577, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -411730,7 +416831,7 @@ static const UV UNI_WB__XX_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -411786,7 +416887,7 @@ static const UV UNI_WB__XX_invlist[] = { 0xEB4, 0xEBD, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xF00, @@ -412441,7 +417542,7 @@ static const UV UNI_WB__XX_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -412492,7 +417593,7 @@ static const UV UNI_WB__XX_invlist[] = { 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -412649,6 +417750,14 @@ static const UV UNI_WB__XX_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -412660,9 +417769,7 @@ static const UV UNI_WB__XX_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -412713,6 +417820,8 @@ static const UV UNI_WB__XX_invlist[] = { 0x1B001, 0x1B120, 0x1B123, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1BC00, @@ -412817,6 +417926,8 @@ static const UV UNI_WB__XX_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -412827,6 +417938,10 @@ static const UV UNI_WB__XX_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -412839,6 +417954,8 @@ static const UV UNI_WB__XX_invlist[] = { 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -412958,7 +418075,7 @@ static const UV UNI_WCHO_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_XIDC_invlist[] = { /* for ASCII/Latin1 */ - 1527, /* Number of elements */ + 1551, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -413280,7 +418397,7 @@ static const UV UNI_XIDC_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -413346,7 +418463,7 @@ static const UV UNI_XIDC_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -413985,7 +419102,7 @@ static const UV UNI_XIDC_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -414032,7 +419149,7 @@ static const UV UNI_XIDC_invlist[] = { 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -414193,6 +419310,14 @@ static const UV UNI_XIDC_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -414204,7 +419329,9 @@ static const UV UNI_XIDC_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -414259,8 +419386,12 @@ static const UV UNI_XIDC_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -414367,6 +419498,8 @@ static const UV UNI_XIDC_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -414377,6 +419510,10 @@ static const UV UNI_XIDC_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -414389,6 +419526,8 @@ static const UV UNI_XIDC_invlist[] = { 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -414476,7 +419615,7 @@ static const UV UNI_XIDC_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -414487,6 +419626,8 @@ static const UV UNI_XIDC_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -414499,7 +419640,7 @@ static const UV UNI_XIDC_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_XIDC_invlist[] = { /* for EBCDIC 1047 */ - 1551, /* Number of elements */ + 1575, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -414845,7 +419986,7 @@ static const UV UNI_XIDC_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -414911,7 +420052,7 @@ static const UV UNI_XIDC_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -415550,7 +420691,7 @@ static const UV UNI_XIDC_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -415597,7 +420738,7 @@ static const UV UNI_XIDC_invlist[] = { 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -415758,6 +420899,14 @@ static const UV UNI_XIDC_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -415769,7 +420918,9 @@ static const UV UNI_XIDC_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -415824,8 +420975,12 @@ static const UV UNI_XIDC_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -415932,6 +421087,8 @@ static const UV UNI_XIDC_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -415942,6 +421099,10 @@ static const UV UNI_XIDC_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -415954,6 +421115,8 @@ static const UV UNI_XIDC_invlist[] = { 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -416041,7 +421204,7 @@ static const UV UNI_XIDC_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -416052,6 +421215,8 @@ static const UV UNI_XIDC_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -416064,7 +421229,7 @@ static const UV UNI_XIDC_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_XIDC_invlist[] = { /* for EBCDIC 037 */ - 1547, /* Number of elements */ + 1571, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -416406,7 +421571,7 @@ static const UV UNI_XIDC_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -416472,7 +421637,7 @@ static const UV UNI_XIDC_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -417111,7 +422276,7 @@ static const UV UNI_XIDC_invlist[] = { 0x10EAD, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F1D, 0x10F27, 0x10F28, @@ -417158,7 +422323,7 @@ static const UV UNI_XIDC_invlist[] = { 0x11213, 0x11238, 0x1123E, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -417319,6 +422484,14 @@ static const UV UNI_XIDC_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF7, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F43, + 0x11F50, + 0x11F5A, 0x11FB0, 0x11FB1, 0x12000, @@ -417330,7 +422503,9 @@ static const UV UNI_XIDC_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13440, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -417385,8 +422560,12 @@ static const UV UNI_XIDC_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -417493,6 +422672,8 @@ static const UV UNI_XIDC_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -417503,6 +422684,10 @@ static const UV UNI_XIDC_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -417515,6 +422700,8 @@ static const UV UNI_XIDC_invlist[] = { 0x1E2AF, 0x1E2C0, 0x1E2FA, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -417602,7 +422789,7 @@ static const UV UNI_XIDC_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -417613,6 +422800,8 @@ static const UV UNI_XIDC_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0100, 0xE01F0 }; @@ -417622,7 +422811,7 @@ static const UV UNI_XIDC_invlist[] = { # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_XIDS_invlist[] = { /* for ASCII/Latin1 */ - 1311, /* Number of elements */ + 1333, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -418577,6 +423766,8 @@ static const UV UNI_XIDS_invlist[] = { 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -418701,6 +423892,12 @@ static const UV UNI_XIDS_invlist[] = { 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -418712,7 +423909,9 @@ static const UV UNI_XIDS_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -418757,8 +423956,12 @@ static const UV UNI_XIDS_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -418833,6 +424036,10 @@ static const UV UNI_XIDS_invlist[] = { 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -418843,6 +424050,8 @@ static const UV UNI_XIDS_invlist[] = { 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -418926,7 +424135,7 @@ static const UV UNI_XIDS_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -418936,7 +424145,9 @@ static const UV UNI_XIDS_invlist[] = { 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* ASCII/Latin1 */ @@ -418947,7 +424158,7 @@ static const UV UNI_XIDS_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_XIDS_invlist[] = { /* for EBCDIC 1047 */ - 1337, /* Number of elements */ + 1359, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -419928,6 +425139,8 @@ static const UV UNI_XIDS_invlist[] = { 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -420052,6 +425265,12 @@ static const UV UNI_XIDS_invlist[] = { 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -420063,7 +425282,9 @@ static const UV UNI_XIDS_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -420108,8 +425329,12 @@ static const UV UNI_XIDS_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -420184,6 +425409,10 @@ static const UV UNI_XIDS_invlist[] = { 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -420194,6 +425423,8 @@ static const UV UNI_XIDS_invlist[] = { 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -420277,7 +425508,7 @@ static const UV UNI_XIDS_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -420287,7 +425518,9 @@ static const UV UNI_XIDS_invlist[] = { 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 1047 */ @@ -420298,7 +425531,7 @@ static const UV UNI_XIDS_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_XIDS_invlist[] = { /* for EBCDIC 037 */ - 1333, /* Number of elements */ + 1355, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -421275,6 +426508,8 @@ static const UV UNI_XIDS_invlist[] = { 0x11212, 0x11213, 0x1122C, + 0x1123F, + 0x11241, 0x11280, 0x11287, 0x11288, @@ -421399,6 +426634,12 @@ static const UV UNI_XIDS_invlist[] = { 0x11D99, 0x11EE0, 0x11EF3, + 0x11F02, + 0x11F03, + 0x11F04, + 0x11F11, + 0x11F12, + 0x11F34, 0x11FB0, 0x11FB1, 0x12000, @@ -421410,7 +426651,9 @@ static const UV UNI_XIDS_invlist[] = { 0x12F90, 0x12FF1, 0x13000, - 0x1342F, + 0x13430, + 0x13441, + 0x13447, 0x14400, 0x14647, 0x16800, @@ -421455,8 +426698,12 @@ static const UV UNI_XIDS_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -421531,6 +426778,10 @@ static const UV UNI_XIDS_invlist[] = { 0x1D7CC, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, + 0x1E030, + 0x1E06E, 0x1E100, 0x1E12D, 0x1E137, @@ -421541,6 +426792,8 @@ static const UV UNI_XIDS_invlist[] = { 0x1E2AE, 0x1E2C0, 0x1E2EC, + 0x1E4D0, + 0x1E4EC, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -421624,7 +426877,7 @@ static const UV UNI_XIDS_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -421634,7 +426887,9 @@ static const UV UNI_XIDS_invlist[] = { 0x2F800, 0x2FA1E, 0x30000, - 0x3134B + 0x3134B, + 0x31350, + 0x323B0 }; # endif /* EBCDIC 037 */ @@ -421950,7 +427205,7 @@ static const UV UNI_ZS_invlist[] = { /* # if 'A' == 65 /* ASCII/Latin1 */ static const UV UNI_ZYYY_invlist[] = { /* for ASCII/Latin1 */ - 296, /* Number of elements */ + 294, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -422116,6 +427371,8 @@ static const UV UNI_ZYYY_invlist[] = { 0x1D1AA, 0x1D1AE, 0x1D1EB, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -422194,14 +427451,14 @@ static const UV UNI_ZYYY_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -422223,23 +427480,19 @@ static const UV UNI_ZYYY_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -422260,7 +427513,7 @@ static const UV UNI_ZYYY_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 21 static const UV UNI_ZYYY_invlist[] = { /* for EBCDIC 1047 */ - 322, /* Number of elements */ + 320, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -422452,6 +427705,8 @@ static const UV UNI_ZYYY_invlist[] = { 0x1D1AA, 0x1D1AE, 0x1D1EB, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -422530,14 +427785,14 @@ static const UV UNI_ZYYY_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -422559,23 +427814,19 @@ static const UV UNI_ZYYY_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -422596,7 +427847,7 @@ static const UV UNI_ZYYY_invlist[] = { && '$' == 91 && '@' == 124 && '`' == 121 && '\n' == 37 static const UV UNI_ZYYY_invlist[] = { /* for EBCDIC 037 */ - 318, /* Number of elements */ + 316, /* Number of elements */ 148565664, /* Version and data structure type */ 0, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -422784,6 +428035,8 @@ static const UV UNI_ZYYY_invlist[] = { 0x1D1AA, 0x1D1AE, 0x1D1EB, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -422862,14 +428115,14 @@ static const UV UNI_ZYYY_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -422891,23 +428144,19 @@ static const UV UNI_ZYYY_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -422923,7 +428172,7 @@ static const UV UNI_ZYYY_invlist[] = { # endif /* EBCDIC 037 */ static const UV UNI_ZZZZ_invlist[] = { /* for all charsets */ - 1392, /* Number of elements */ + 1410, /* Number of elements */ 148565664, /* Version and data structure type */ 1, /* 0 if the list starts at 0; 1 if it starts at the element beyond 0 */ @@ -423170,7 +428419,7 @@ static const UV UNI_ZZZZ_invlist[] = { 0xCE6, 0xCF0, 0xCF1, - 0xCF3, + 0xCF4, 0xD00, 0xD0D, 0xD0E, @@ -423230,7 +428479,7 @@ static const UV UNI_ZZZZ_invlist[] = { 0xEC6, 0xEC7, 0xEC8, - 0xECE, + 0xECF, 0xED0, 0xEDA, 0xEDC, @@ -423771,7 +429020,7 @@ static const UV UNI_ZZZZ_invlist[] = { 0x10EAE, 0x10EB0, 0x10EB2, - 0x10F00, + 0x10EFD, 0x10F28, 0x10F30, 0x10F5A, @@ -423806,7 +429055,7 @@ static const UV UNI_ZZZZ_invlist[] = { 0x11200, 0x11212, 0x11213, - 0x1123F, + 0x11242, 0x11280, 0x11287, 0x11288, @@ -423911,6 +429160,8 @@ static const UV UNI_ZZZZ_invlist[] = { 0x11AA3, 0x11AB0, 0x11AF9, + 0x11B00, + 0x11B0A, 0x11C00, 0x11C09, 0x11C0A, @@ -423953,6 +429204,12 @@ static const UV UNI_ZZZZ_invlist[] = { 0x11DAA, 0x11EE0, 0x11EF9, + 0x11F00, + 0x11F11, + 0x11F12, + 0x11F3B, + 0x11F3E, + 0x11F5A, 0x11FB0, 0x11FB1, 0x11FC0, @@ -423968,9 +429225,7 @@ static const UV UNI_ZZZZ_invlist[] = { 0x12F90, 0x12FF3, 0x13000, - 0x1342F, - 0x13430, - 0x13439, + 0x13456, 0x14400, 0x14647, 0x16800, @@ -424023,8 +429278,12 @@ static const UV UNI_ZZZZ_invlist[] = { 0x1AFFF, 0x1B000, 0x1B123, + 0x1B132, + 0x1B133, 0x1B150, 0x1B153, + 0x1B155, + 0x1B156, 0x1B164, 0x1B168, 0x1B170, @@ -424053,6 +429312,8 @@ static const UV UNI_ZZZZ_invlist[] = { 0x1D1EB, 0x1D200, 0x1D246, + 0x1D2C0, + 0x1D2D4, 0x1D2E0, 0x1D2F4, 0x1D300, @@ -424107,6 +429368,8 @@ static const UV UNI_ZZZZ_invlist[] = { 0x1DAB0, 0x1DF00, 0x1DF1F, + 0x1DF25, + 0x1DF2B, 0x1E000, 0x1E007, 0x1E008, @@ -424117,6 +429380,10 @@ static const UV UNI_ZZZZ_invlist[] = { 0x1E025, 0x1E026, 0x1E02B, + 0x1E030, + 0x1E06E, + 0x1E08F, + 0x1E090, 0x1E100, 0x1E12D, 0x1E130, @@ -424131,6 +429398,8 @@ static const UV UNI_ZZZZ_invlist[] = { 0x1E2FA, 0x1E2FF, 0x1E300, + 0x1E4D0, + 0x1E4FA, 0x1E7E0, 0x1E7E7, 0x1E7E8, @@ -424247,14 +429516,14 @@ static const UV UNI_ZZZZ_invlist[] = { 0x1F266, 0x1F300, 0x1F6D8, - 0x1F6DD, + 0x1F6DC, 0x1F6ED, 0x1F6F0, 0x1F6FD, 0x1F700, - 0x1F774, - 0x1F780, - 0x1F7D9, + 0x1F777, + 0x1F77B, + 0x1F7DA, 0x1F7E0, 0x1F7EC, 0x1F7F0, @@ -424276,23 +429545,19 @@ static const UV UNI_ZZZZ_invlist[] = { 0x1FA60, 0x1FA6E, 0x1FA70, - 0x1FA75, - 0x1FA78, 0x1FA7D, 0x1FA80, - 0x1FA87, + 0x1FA89, 0x1FA90, - 0x1FAAD, - 0x1FAB0, - 0x1FABB, - 0x1FAC0, + 0x1FABE, + 0x1FABF, 0x1FAC6, - 0x1FAD0, - 0x1FADA, + 0x1FACE, + 0x1FADC, 0x1FAE0, - 0x1FAE8, + 0x1FAE9, 0x1FAF0, - 0x1FAF7, + 0x1FAF9, 0x1FB00, 0x1FB93, 0x1FB94, @@ -424302,7 +429567,7 @@ static const UV UNI_ZZZZ_invlist[] = { 0x20000, 0x2A6E0, 0x2A700, - 0x2B739, + 0x2B73A, 0x2B740, 0x2B81E, 0x2B820, @@ -424313,6 +429578,8 @@ static const UV UNI_ZZZZ_invlist[] = { 0x2FA1E, 0x30000, 0x3134B, + 0x31350, + 0x323B0, 0xE0001, 0xE0002, 0xE0020, @@ -424478,6 +429745,7 @@ typedef enum { UNI_AGE__12_DOT_1, UNI_AGE__13, UNI_AGE__14, + UNI_AGE__15, UNI_AGE__2, UNI_AGE__2_DOT_1, UNI_AGE__3, @@ -424507,6 +429775,7 @@ typedef enum { UNI_ARAB, UNI_ARABICEXTA, UNI_ARABICEXTB, + UNI_ARABICEXTC, UNI_ARABICMATH, UNI_ARABICPFA, UNI_ARABICPFB, @@ -424643,6 +429912,7 @@ typedef enum { UNI_CJKEXTE, UNI_CJKEXTF, UNI_CJKEXTG, + UNI_CJKEXTH, UNI_CJKRADICALSSUP, UNI_CJKSTROKES, UNI_CJKSYMBOLS, @@ -424668,12 +429938,14 @@ typedef enum { UNI_CYRILLICEXTA, UNI_CYRILLICEXTB, UNI_CYRILLICEXTC, + UNI_CYRILLICEXTD, UNI_CYRILLICSUP, UNI_CYRL, UNI_DASH, UNI_DEP, UNI_DEVA, UNI_DEVANAGARIEXT, + UNI_DEVANAGARIEXTA, UNI_DI, UNI_DIA, UNI_DIACRITICALS, @@ -424850,6 +430122,7 @@ typedef enum { UNI_INKAITHI, UNI_INKANNADA, UNI_INKATAKANA, + UNI_INKAWI, UNI_INKHAROSHTHI, UNI_INKHITANSMALLSCRIPT, UNI_INKHMER, @@ -424880,6 +430153,7 @@ typedef enum { UNI_INMULTANI, UNI_INMYANMAR, UNI_INNABATAEAN, + UNI_INNAGMUNDARI, UNI_INNANDINAGARI, UNI_INNEWA, UNI_INNEWTAILUE, @@ -424995,6 +430269,7 @@ typedef enum { UNI_IN__12_DOT_1, UNI_IN__13, UNI_IN__14, + UNI_IN__15, UNI_IN__1_DOT_1, UNI_IN__2, UNI_IN__2_DOT_1, @@ -425131,6 +430406,7 @@ typedef enum { UNI_JT__R, UNI_JT__T, UNI_JT__U, + UNI_KAKTOVIKNUMERALS, UNI_KALI, UNI_KANA, UNI_KANAEXTA, @@ -425139,6 +430415,7 @@ typedef enum { UNI_KANBUN, UNI_KANGXI, UNI_KATAKANAEXT, + UNI_KAWI, UNI_KHAR, UNI_KHMERSYMBOLS, UNI_KHMR, @@ -425252,6 +430529,7 @@ typedef enum { UNI_MYANMAREXTB, UNI_MYMR, UNI_N, + UNI_NAGM, UNI_NAND, UNI_NARB, UNI_NB, @@ -425711,6 +430989,7 @@ static const UV * const uni_prop_ptrs[] UNI_AGE__12_DOT_1_invlist, UNI_AGE__13_invlist, UNI_AGE__14_invlist, + UNI_AGE__15_invlist, UNI_AGE__2_invlist, UNI_AGE__2_DOT_1_invlist, UNI_AGE__3_invlist, @@ -425740,6 +431019,7 @@ static const UV * const uni_prop_ptrs[] UNI_ARAB_invlist, UNI_ARABICEXTA_invlist, UNI_ARABICEXTB_invlist, + UNI_ARABICEXTC_invlist, UNI_ARABICMATH_invlist, UNI_ARABICPFA_invlist, UNI_ARABICPFB_invlist, @@ -425876,6 +431156,7 @@ static const UV * const uni_prop_ptrs[] UNI_CJKEXTE_invlist, UNI_CJKEXTF_invlist, UNI_CJKEXTG_invlist, + UNI_CJKEXTH_invlist, UNI_CJKRADICALSSUP_invlist, UNI_CJKSTROKES_invlist, UNI_CJKSYMBOLS_invlist, @@ -425901,12 +431182,14 @@ static const UV * const uni_prop_ptrs[] UNI_CYRILLICEXTA_invlist, UNI_CYRILLICEXTB_invlist, UNI_CYRILLICEXTC_invlist, + UNI_CYRILLICEXTD_invlist, UNI_CYRILLICSUP_invlist, UNI_CYRL_invlist, UNI_DASH_invlist, UNI_DEP_invlist, UNI_DEVA_invlist, UNI_DEVANAGARIEXT_invlist, + UNI_DEVANAGARIEXTA_invlist, UNI_DI_invlist, UNI_DIA_invlist, UNI_DIACRITICALS_invlist, @@ -426083,6 +431366,7 @@ static const UV * const uni_prop_ptrs[] UNI_INKAITHI_invlist, UNI_INKANNADA_invlist, UNI_INKATAKANA_invlist, + UNI_INKAWI_invlist, UNI_INKHAROSHTHI_invlist, UNI_INKHITANSMALLSCRIPT_invlist, UNI_INKHMER_invlist, @@ -426113,6 +431397,7 @@ static const UV * const uni_prop_ptrs[] UNI_INMULTANI_invlist, UNI_INMYANMAR_invlist, UNI_INNABATAEAN_invlist, + UNI_INNAGMUNDARI_invlist, UNI_INNANDINAGARI_invlist, UNI_INNEWA_invlist, UNI_INNEWTAILUE_invlist, @@ -426228,6 +431513,7 @@ static const UV * const uni_prop_ptrs[] UNI_IN__12_DOT_1_invlist, UNI_IN__13_invlist, UNI_IN__14_invlist, + UNI_IN__15_invlist, UNI_IN__1_DOT_1_invlist, UNI_IN__2_invlist, UNI_IN__2_DOT_1_invlist, @@ -426364,6 +431650,7 @@ static const UV * const uni_prop_ptrs[] UNI_JT__R_invlist, UNI_JT__T_invlist, UNI_JT__U_invlist, + UNI_KAKTOVIKNUMERALS_invlist, UNI_KALI_invlist, UNI_KANA_invlist, UNI_KANAEXTA_invlist, @@ -426372,6 +431659,7 @@ static const UV * const uni_prop_ptrs[] UNI_KANBUN_invlist, UNI_KANGXI_invlist, UNI_KATAKANAEXT_invlist, + UNI_KAWI_invlist, UNI_KHAR_invlist, UNI_KHMERSYMBOLS_invlist, UNI_KHMR_invlist, @@ -426485,6 +431773,7 @@ static const UV * const uni_prop_ptrs[] UNI_MYANMAREXTB_invlist, UNI_MYMR_invlist, UNI_N_invlist, + UNI_NAGM_invlist, UNI_NAND_invlist, UNI_NARB_invlist, UNI_NB_invlist, @@ -427004,6 +432293,7 @@ static const char * const UNI_age_values "12.1", "13.0", "14.0", + "15.0", "NA", "na", "Unassigned", @@ -427014,6 +432304,7 @@ static const char * const UNI_age_values "V12_1", "V13_0", "V14_0", + "V15_0", "V1_1", "V2_0", "V2_1", @@ -427039,6 +432330,7 @@ static const char * const UNI_age_values "v121", "v130", "v140", + "v150", "v20", "v21", "v30", @@ -427213,12 +432505,17 @@ static const char * const UNI_blk_values "arabicexta", "Arabic_Ext_B", "arabicextb", + "Arabic_Ext_C", + "arabicextc", "Arabic Extended-A", "Arabic_Extended_A", "arabicextendeda", "Arabic Extended-B", "Arabic_Extended_B", "arabicextendedb", + "Arabic Extended-C", + "Arabic_Extended_C", + "arabicextendedc", "Arabic_Math", "arabicmath", "Arabic Mathematical Alphabetic Symbols", @@ -427356,6 +432653,8 @@ static const char * const UNI_blk_values "cjkextf", "CJK_Ext_G", "cjkextg", + "CJK_Ext_H", + "cjkexth", "CJK_Radicals_Sup", "cjkradicalssup", "CJK Radicals Supplement", @@ -427393,6 +432692,9 @@ static const char * const UNI_blk_values "CJK Unified Ideographs Extension G", "CJK_Unified_Ideographs_Extension_G", "cjkunifiedideographsextensiong", + "CJK Unified Ideographs Extension H", + "CJK_Unified_Ideographs_Extension_H", + "cjkunifiedideographsextensionh", "Combining Diacritical Marks", "Combining_Diacritical_Marks", "combiningdiacriticalmarks", @@ -427452,6 +432754,8 @@ static const char * const UNI_blk_values "cyrillicextb", "Cyrillic_Ext_C", "cyrillicextc", + "Cyrillic_Ext_D", + "cyrillicextd", "Cyrillic Extended-A", "Cyrillic_Extended_A", "cyrillicextendeda", @@ -427461,6 +432765,9 @@ static const char * const UNI_blk_values "Cyrillic Extended-C", "Cyrillic_Extended_C", "cyrillicextendedc", + "Cyrillic Extended-D", + "Cyrillic_Extended_D", + "cyrillicextendedd", "Cyrillic_Sup", "cyrillicsup", "Cyrillic Supplement", @@ -427474,9 +432781,14 @@ static const char * const UNI_blk_values "devanagari", "Devanagari_Ext", "devanagariext", + "Devanagari_Ext_A", + "devanagariexta", "Devanagari Extended", "Devanagari_Extended", "devanagariextended", + "Devanagari Extended-A", + "Devanagari_Extended_A", + "devanagariextendeda", "Diacriticals", "diacriticals", "Diacriticals_Ext", @@ -427689,6 +433001,9 @@ static const char * const UNI_blk_values "javanese", "Kaithi", "kaithi", + "Kaktovik Numerals", + "Kaktovik_Numerals", + "kaktoviknumerals", "Kana_Ext_A", "kanaexta", "Kana_Ext_B", @@ -427720,6 +433035,8 @@ static const char * const UNI_blk_values "Katakana Phonetic Extensions", "Katakana_Phonetic_Extensions", "katakanaphoneticextensions", + "Kawi", + "kawi", "Kayah Li", "Kayah_Li", "kayahli", @@ -427937,6 +433254,9 @@ static const char * const UNI_blk_values "myanmarextendedb", "Nabataean", "nabataean", + "Nag Mundari", + "Nag_Mundari", + "nagmundari", "Nandinagari", "nandinagari", "NB", @@ -429935,6 +435255,8 @@ static const char * const UNI_sc_values[ "kannada", "Katakana", "katakana", + "Kawi", + "kawi", "Kayah_Li", "kayahli", "Khar", @@ -430063,6 +435385,10 @@ static const char * const UNI_sc_values[ "mymr", "Nabataean", "nabataean", + "Nagm", + "nagm", + "Nag_Mundari", + "nagmundari", "Nand", "nand", "Nandinagari", @@ -430704,56 +436030,57 @@ static const U8 WB_table[23][23] = { /* Generated from: * 688d673ec947f7ccf898b4eae9848139d4d33676b688dee54f449f8bf9d3bbd2 lib/Unicode/UCD.pm - * c7698811e9adb6cc98fb996a7de4be2b6532f2ac67e76055cc8afdbf6ee18af3 lib/unicore/ArabicShaping.txt - * 24a74555f918bbe99f5b3f1b83cf36fc0e205bb8a600a6a3aa539c710a3dcf27 lib/unicore/BidiBrackets.txt - * 7a5c74cedc1616a9af0a9d22e108ae592d86fe93649c144ae6ba49f193a44122 lib/unicore/BidiMirroring.txt - * 598870dddef7b34b5a972916528c456aff2765b79cd4f9647fb58ceb767e7f17 lib/unicore/Blocks.txt - * a566cd48687b2cd897e02501118b2413c14ae86d318f9abbbba97feb84189f0f lib/unicore/CaseFolding.txt - * 3360762fc3295cea54ab251c31df621d05ba4b94d46c60eaac29aa16d70ad1e0 lib/unicore/CompositionExclusions.txt - * 7e058dec02147098bc9c28d86209f0f251bba0538f3b5a705ad02ea3bb709fe0 lib/unicore/DAge.txt - * e3eddd7d469cd1b0feed7528defad1a1cc7c6a9ceb0ae4446a6d10921ed2e7bc lib/unicore/DCoreProperties.txt - * b2c444c20730b097787fdf50bd7d6dd3fc5256ab8084f5b35b11c8776eca674c lib/unicore/DNormalizationProps.txt - * f901ac011aa32a09224d6555da71e2532c59c1d3381322829de0e3b880507250 lib/unicore/EastAsianWidth.txt - * 5995522f01633073911dad1edb74d13aa832f42862c0392a79627b85d52f2391 lib/unicore/EquivalentUnifiedIdeograph.txt - * cd1c9367cba438afa965fcb5edc6ed3ec6e685fd5dd21c0cc20c026f04beb0e5 lib/unicore/HangulSyllableType.txt - * 3f3f368fccdb37f350ecedc20b37fa71ab31c04e847884c77780d34283539f73 lib/unicore/IdStatus.txt - * 45a150c23961b58d7784704af6c4daccd6517d97b6489e53d13bbdbf9e4f065f lib/unicore/IdType.txt - * d8704c8725568813a947ff2ef38bcf1f05e2a6fbea6876ba384890f187a8bf61 lib/unicore/IndicPositionalCategory.txt - * c7b969b653dc278fb66ab4136223d320e30ad19367eb791ae60dcc6d92071b16 lib/unicore/IndicSyllabicCategory.txt - * 39ff89e0a329e1ccce6d54fad8cf82e90926901928c0ca9b9a2ad5681f330dd9 lib/unicore/Jamo.txt - * 9e06e9f35c6959fb91dcc7993f90d58523c3079bc62c6b25f828b4cdebc5d70c lib/unicore/LineBreak.txt - * 14b3b677d33f95c51423dce6eef4a6a28b4b160451ecedee4b91edb6745cf4a3 lib/unicore/NameAliases.txt - * db5745688affcdc0c3927a1ee0667018a96a7b24513f866d5235e98fef6c2436 lib/unicore/NamedSequences.txt - * 6bddfdb850417a5bee6deff19290fd1b138589909afb50f5a049f343bf2c6722 lib/unicore/PropList.txt - * eb755757e20b72b330b2948df3cf2ff7adb0e31bb060140dc09dafb132ace2cd lib/unicore/PropValueAliases.txt - * 859d7225f2d2a460b3ccb1d61a7945f8cc219acdf5aa53b66b7a1e4bf6ebfc87 lib/unicore/PropertyAliases.txt - * d37eedf63ff9c48bac863d5f76862373d6cf5269fd21253d499e2430d638c01d lib/unicore/ScriptExtensions.txt - * 52db475c4ec445e73b0b16915448c357614946ad7062843c563e00d7535c6510 lib/unicore/Scripts.txt - * c667b45908fd269af25fd55d2fc5bbc157fb1b77675936e25c513ce32e080334 lib/unicore/SpecialCasing.txt - * 36018e68657fdcb3485f636630ffe8c8532e01c977703d2803f5b89d6c5feafb lib/unicore/UnicodeData.txt - * 869ff43dd012f924d03c89fc268c88f0e7eea72f0228b91ca30455afdb84f8fd lib/unicore/VerticalOrientation.txt - * ddc7d4d1f3838573b94fc5d83ff7217e63c47b22ae1cd40c5fe1a54efc15589b lib/unicore/auxiliary/GCBTest.txt - * 97e79f1f8d9cd76d120f2420381a01abc00a7c78a2aa583fa3f9627264a99742 lib/unicore/auxiliary/GraphemeBreakProperty.txt - * 488dbb6a7e1d0070d4aa7c175352c818ff6425172850d1b40c6177726658cb05 lib/unicore/auxiliary/LBTest.txt - * 7e42dd749dbb94aa44b13faf9df6319d9a16ce2ea09a3a094fcfbb5962168040 lib/unicore/auxiliary/SBTest.txt - * 7092ca4117cec891c25c7724132efc519e1dece01ae9fd6068035a9db04d526e lib/unicore/auxiliary/SentenceBreakProperty.txt - * 8094b544ec1580c7e41ac0187805cc1aeb330a90301ec7505563e1a59318284e lib/unicore/auxiliary/WBTest.txt - * 7716752aad296d4ab23ff4ed0a2746fc5328750ff84e9e7d6f3828ee9eaef742 lib/unicore/auxiliary/WordBreakProperty.txt - * b597836124298b8f7fa076273802840cfc3271a25f5c397a082e120954b82c3c lib/unicore/emoji/emoji.txt - * e5fe51acc74e3e83b4fb4c7b25f3c34491d6eb8095c9955d0712dafbca7b3c2b lib/unicore/extracted/DBidiClass.txt - * cd0a14176d93bf440b77a582a0d678190fc0688b15442d4cfb250bf2e27956af lib/unicore/extracted/DBinaryProperties.txt - * 12b0c3af9b600b49488d66545a3e7844ea980809627201bf9afeebe1c9f16f4e lib/unicore/extracted/DCombiningClass.txt - * f76064b298cfbd715ba542e7894f7a507d32da2f011070d1d01df95cad9817d6 lib/unicore/extracted/DDecompositionType.txt - * f9bef074cc916db57fece99d54a4505f8e7c7b17481619e3f0005211f7717d4b lib/unicore/extracted/DEastAsianWidth.txt - * cde679c8461976ed40d7edf61ae98cbb947540831f06f5bc7da7decbf91a1420 lib/unicore/extracted/DGeneralCategory.txt - * 9bb891831328713603a486a4a03df7f7987c3e1e8144a6d1ac71fd061ef3f732 lib/unicore/extracted/DJoinGroup.txt - * e97c65bbea0a69d2fae6ec4182b09e519e13232e20bd804b3004edc0f36bb0d4 lib/unicore/extracted/DJoinType.txt - * 43f6df50e4878f501b417e366b0ee097ae5ccb2d4ce942026bed3d62d78e7887 lib/unicore/extracted/DLineBreak.txt - * a04502ebb36a45d83cbe48a7d8132ea8143edb7b3d34d0aa6afe4a9685049741 lib/unicore/extracted/DNumType.txt - * 11075771b112e8e7ccf6ffa637c4c91eadc3ef3db0517b24e605df8fd3624239 lib/unicore/extracted/DNumValues.txt - * 1e514199c3fa46f5df6148d272db7bddbfd5e89c9710e39773ef9d734f344a2f lib/unicore/mktables - * c72bbdeda99714db1c8024d3311da4aef3c0db3b9b9f11455a7cfe10d5e9aba3 lib/unicore/version + * eb840f36e0a7446293578c684a54c6d83d249abde7bdd4dfa89794af1d7fe9e9 lib/unicore/ArabicShaping.txt + * 333ae1e99db0504ca8a046a07dc45b5e7aa91869c685e6bf955ebe674804827a lib/unicore/BidiBrackets.txt + * b4b9e1d87d8ea273613880de9d2b2f0b0b696244b42152bfa0a3106e7d983a20 lib/unicore/BidiMirroring.txt + * 529dc5d0f6386d52f2f56e004bbfab48ce2d587eea9d38ba546c4052491bd820 lib/unicore/Blocks.txt + * cdd49e55eae3bbf1f0a3f6580c974a0263cb86a6a08daa10fbf705b4808a56f7 lib/unicore/CaseFolding.txt + * 3b019c0a33c3140cbc920c078f4f9af2680ba4f71869c8d4de5190667c70b6a3 lib/unicore/CompositionExclusions.txt + * 7570877e0fa197c45338f7c41a02636da4e14c8dba6a3611a01cd30bf329d5ca lib/unicore/DAge.txt + * d367290bc0867e6b484c68370530bdd1a08b6b32404601b8c7accaf83e05628d lib/unicore/DCoreProperties.txt + * d5687a48c95c7d6e1ec59cb29c0f2e8b052018eb069a4371b7368d0561e12a29 lib/unicore/DNormalizationProps.txt + * 743e7bc435c04ab1a8459710b1c3cad56eedced5b806b4659b6e69b85d0adf2a lib/unicore/EastAsianWidth.txt + * f2e04bae8c856fad3a16353a99d4cc2de6c72770260379f5e4974a97548aad2a lib/unicore/EquivalentUnifiedIdeograph.txt + * 9a3ab36d36a22bdb84de7a17b17e9b9c242134f0080f0a8b4b28d209465a8fc8 lib/unicore/HangulSyllableType.txt + * 790bc9595795c0e0a3860a21a7f97157a134b61a4fc4ab03c7d315d07c9a6eb7 lib/unicore/IdStatus.txt + * 71d3ed8f15cd5d8cd00cdebe62015ff26356462774b261b4a2b83d3bf46b1639 lib/unicore/IdType.txt + * 0ce56c1294da405c0a0a0071582ac839fd229bbf97bdd260462ee571309d4ec4 lib/unicore/IndicPositionalCategory.txt + * ffae561a51b47ddbbe267fdd8505ac3776b85b2932268809127acee84200b573 lib/unicore/IndicSyllabicCategory.txt + * 14733bcb6731ae0c07485bf59a41cb3db08785a50bd2b46b836b4341eab7ee46 lib/unicore/Jamo.txt + * 012bca868e2c4e59a5a10a7546baf0c6fb1b2ef458c277f054915c8a49d292bf lib/unicore/LineBreak.txt + * 3e39509e8fae3e5d50ba73759d0b97194501d14a9c63107a6372a46b38be18e8 lib/unicore/NameAliases.txt + * 1d5202155f14841973aa540b1625f4befbde185ac77ce5aceaaaa0501a68bd66 lib/unicore/NamedSequences.txt + * fb9ac8cc154a80cad6caac9897af55a4e75176af6f4e2bb6edc2bf8b1d57f326 lib/unicore/NormTest.txt + * e05c0a2811d113dae4abd832884199a3ea8d187ee1b872d8240a788a96540bfd lib/unicore/PropList.txt + * 13a7666843abea5c6b7eb8c057c57ab9bb2ba96cfc936e204224dd67d71cafad lib/unicore/PropValueAliases.txt + * e4935149af407fa455901832b710bccb63d2453e46d09190e234d019bcfbba45 lib/unicore/PropertyAliases.txt + * 7e07313d9d0bee42220c476b64485995130ae30917bbcf7780b602d677d7e33f lib/unicore/ScriptExtensions.txt + * cca85d830f46aece2e7c1459ef1249993dca8f2e46d51e869255be140d7ea4b0 lib/unicore/Scripts.txt + * 78b29c64b5840d25c11a9f31b665ee551b8a499eca6c70d770fcad7dd710f494 lib/unicore/SpecialCasing.txt + * 806e9aed65037197f1ec85e12be6e8cd870fc5608b4de0fffd990f689f376a73 lib/unicore/UnicodeData.txt + * ca6d332f485a6f5f452b29b4a74146af0f2c17b7577aa4c821d597210f70611a lib/unicore/VerticalOrientation.txt + * 0d2080d0def294a4b7660801cc03ddfe5866ff300c789c2cc1b50fd7802b2d97 lib/unicore/auxiliary/GCBTest.txt + * 5a0f8748575432f8ff95e1dd5bfaa27bda1a844809e17d6939ee912bba6568a1 lib/unicore/auxiliary/GraphemeBreakProperty.txt + * 371bde4052aa593b108684ae292d8ea2dbb93c19990e0cdf416fa7239557aac3 lib/unicore/auxiliary/LBTest.txt + * f62279d8fd10935ba0cf0d8417a1dcbe7ab0d4e62f59c17e02cbe40f580c4162 lib/unicore/auxiliary/SBTest.txt + * 61e4ba975b0a5bc1a76ee931b94914395d7289ef624e3c0d4d6b9460ee387bea lib/unicore/auxiliary/SentenceBreakProperty.txt + * 2a676130c71194245e7c74a837e58330f202600d8ddcf4518129dd476f26e18e lib/unicore/auxiliary/WBTest.txt + * 5188a56e91593467c2e912601ebc78750e6adc9b04541b8c5becb5441e388ce2 lib/unicore/auxiliary/WordBreakProperty.txt + * 29071dba22c72c27783a73016afb8ffaeb025866740791f9c2d0b55cc45a3470 lib/unicore/emoji/emoji.txt + * 4841f2090c2dbc592d3ce43bb74c2191b3da50fb9a0d00274f1448c202851b02 lib/unicore/extracted/DBidiClass.txt + * f10a35451429137f7348825f22d624b6390c526ead3d8e756d2af9e5ed5b2b67 lib/unicore/extracted/DBinaryProperties.txt + * ca54f6360cd288ad92113415bf1f77749015abe11cbd6798d21f7fa81f04205d lib/unicore/extracted/DCombiningClass.txt + * db059ce45e3cec49bfda56e262fa658b3a5561b1648de266c818d2a08a85b78a lib/unicore/extracted/DDecompositionType.txt + * d62e6950f086e53f47c593a38342621f8838f48c49a1de070cf83d3959bd1688 lib/unicore/extracted/DEastAsianWidth.txt + * fe29a45c0882500e591140aaa5c4f5067e6a5d746806148af34400c48b9c06f9 lib/unicore/extracted/DGeneralCategory.txt + * e13ca1344b16023aa38c6ada39f9658536fc6bb7c3c24d579f0bc316a4f4f1e0 lib/unicore/extracted/DJoinGroup.txt + * c4870b11e2b8b7d0eb70b99ce85608e5c28a399efa316cca97238a58ae160e5e lib/unicore/extracted/DJoinType.txt + * 3f4f32ed2a577344a508114527e721d7a8b633d32f38945d47fe0c743650c585 lib/unicore/extracted/DLineBreak.txt + * 710abf2d581ac9c57f244c0834f9d9969d9781e0396adccd330eaae658ac7d6b lib/unicore/extracted/DNumType.txt + * 6bd30f385f3baf3ab5d5308c111a81de87bea5f494ba0ba69e8ab45263b8c34d lib/unicore/extracted/DNumValues.txt + * f7265069b38ba9a0675a18600e241b1ec6fc8c55fd806fe4c13bc5d8cb0dc508 lib/unicore/mktables + * 55d90fdc3f902e5c0b16b3378f9eaa36e970a1c09723c33de7d47d0370044012 lib/unicore/version * 0a6b5ab33bb1026531f816efe81aea1a8ffcd34a27cbea37dd6a70a63d73c844 regen/charset_translations.pl - * 5f8520d3a17ade6317fc0c423f5091470924b1ef425bca0c41ce8e4a9f8460fe regen/mk_PL_charclass.pl - * 1c73795f9150bd556573e7ae982789377289e22b6a7f3db0a05c36852e8d749f regen/mk_invlists.pl - * ex: set ro: */ + * c7ff8e0d207d3538c7feb4a1a152b159e5e902d20293b303569ea8323e84633e regen/mk_PL_charclass.pl + * cdbafee25193032242e77f2a6332b731d8392ce342fa616dbabc2c14c7b44eb6 regen/mk_invlists.pl + * ex: set ro ft=c: */ Index: gnu/usr.bin/perl/class.c =================================================================== RCS file: gnu/usr.bin/perl/class.c diff -N gnu/usr.bin/perl/class.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/class.c 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,1064 @@ +/* class.c + * + * Copyright (C) 2022 by Paul Evans and others + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the README file. + * + */ + +/* This file contains the code that implements perl's new `use feature 'class'` + * object model + */ + +#include "EXTERN.h" +#define PERL_IN_CLASS_C +#include "perl.h" + +#include "XSUB.h" + +enum { + PADIX_SELF = 1, + PADIX_PARAMS = 2, +}; + +void +Perl_croak_kw_unless_class(pTHX_ const char *kw) +{ + PERL_ARGS_ASSERT_CROAK_KW_UNLESS_CLASS; + + if(!HvSTASH_IS_CLASS(PL_curstash)) + croak("Cannot '%s' outside of a 'class'", kw); +} + +#define newSVobject(fieldcount) Perl_newSVobject(aTHX_ fieldcount) +SV * +Perl_newSVobject(pTHX_ Size_t fieldcount) +{ + SV *sv = newSV_type(SVt_PVOBJ); + + Newx(ObjectFIELDS(sv), fieldcount, SV *); + ObjectMAXFIELD(sv) = fieldcount - 1; + + Zero(ObjectFIELDS(sv), fieldcount, SV *); + + return sv; +} + +PP(pp_initfield) +{ + dSP; + UNOP_AUX_item *aux = cUNOP_AUX->op_aux; + + SV *self = PAD_SVl(PADIX_SELF); + assert(SvTYPE(SvRV(self)) == SVt_PVOBJ); + SV *instance = SvRV(self); + + SV **fields = ObjectFIELDS(instance); + + PADOFFSET fieldix = aux[0].uv; + + SV *val = NULL; + + switch(PL_op->op_private & (OPpINITFIELD_AV|OPpINITFIELD_HV)) { + case 0: + if(PL_op->op_flags & OPf_STACKED) + val = newSVsv(POPs); + else + val = newSV(0); + break; + + case OPpINITFIELD_AV: + { + AV *av; + if(PL_op->op_flags & OPf_STACKED) { + SV **svp = PL_stack_base + POPMARK + 1; + STRLEN count = SP - svp + 1; + + av = newAV_alloc_x(count); + + av_extend(av, count); + while(svp <= SP) { + av_push_simple(av, newSVsv(*svp)); + svp++; + } + } + else + av = newAV(); + val = (SV *)av; + break; + } + + case OPpINITFIELD_HV: + { + HV *hv = newHV(); + if(PL_op->op_flags & OPf_STACKED) { + SV **svp = PL_stack_base + POPMARK + 1; + STRLEN svcount = SP - svp + 1; + + if(svcount % 2) + Perl_warner(aTHX_ + packWARN(WARN_MISC), "Odd number of elements in hash field initialization"); + + while(svp <= SP) { + SV *key = *svp; svp++; + SV *val = svp <= SP ? *svp : &PL_sv_undef; svp++; + + (void)hv_store_ent(hv, key, newSVsv(val), 0); + } + } + val = (SV *)hv; + break; + } + } + + fields[fieldix] = val; + + PADOFFSET padix = PL_op->op_targ; + if(padix) { + SAVESPTR(PAD_SVl(padix)); + SV *sv = PAD_SVl(padix) = SvREFCNT_inc(val); + save_freesv(sv); + } + + RETURN; +} + +XS(injected_constructor); +XS(injected_constructor) +{ + dXSARGS; + + HV *stash = (HV *)XSANY.any_sv; + assert(HvSTASH_IS_CLASS(stash)); + + struct xpvhv_aux *aux = HvAUX(stash); + + if((items - 1) % 2) + Perl_warn(aTHX_ "Odd number of arguments passed to %" HvNAMEf_QUOTEDPREFIX " constructor", + HvNAMEfARG(stash)); + + HV *params = NULL; + { + /* Set up params HV */ + params = newHV(); + SAVEFREESV((SV *)params); + + for(I32 i = 1; i < items; i += 2) { + SV *name = ST(i); + SV *val = (i+1 < items) ? ST(i+1) : &PL_sv_undef; + + /* TODO: think about sanity-checking name for being + * defined + * not ref (but overloaded objects?? boo) + * not duplicate + * But then, %params = @_; wouldn't do that + */ + + (void)hv_store_ent(params, name, SvREFCNT_inc(val), 0); + } + } + + SV *instance = newSVobject(aux->xhv_class_next_fieldix); + SvOBJECT_on(instance); + SvSTASH_set(instance, MUTABLE_HV(SvREFCNT_inc_simple(stash))); + + SV *self = sv_2mortal(newRV_noinc(instance)); + + assert(aux->xhv_class_initfields_cv); + { + ENTER; + SAVETMPS; + + EXTEND(SP, 2); + PUSHMARK(SP); + PUSHs(self); + if(params) + PUSHs((SV *)params); // yes a raw HV + else + PUSHs(&PL_sv_undef); + PUTBACK; + + call_sv((SV *)aux->xhv_class_initfields_cv, G_VOID); + + SPAGAIN; + + FREETMPS; + LEAVE; + } + + if(aux->xhv_class_adjust_blocks) { + CV **cvp = (CV **)AvARRAY(aux->xhv_class_adjust_blocks); + U32 nblocks = av_count(aux->xhv_class_adjust_blocks); + + for(U32 i = 0; i < nblocks; i++) { + ENTER; + SAVETMPS; + SPAGAIN; + + EXTEND(SP, 2); + + PUSHMARK(SP); + PUSHs(self); /* I don't believe this needs to be an sv_mortalcopy() */ + PUTBACK; + + call_sv((SV *)cvp[i], G_VOID); + + SPAGAIN; + + FREETMPS; + LEAVE; + } + } + + if(params && hv_iterinit(params) > 0) { + /* TODO: consider sorting these into a canonical order, but that's awkward */ + HE *he = hv_iternext(params); + + SV *paramnames = newSVsv(HeSVKEY_force(he)); + SAVEFREESV(paramnames); + + while((he = hv_iternext(params))) + Perl_sv_catpvf(aTHX_ paramnames, ", %" SVf, SVfARG(HeSVKEY_force(he))); + + croak("Unrecognised parameters for %" HvNAMEf_QUOTEDPREFIX " constructor: %" SVf, + HvNAMEfARG(stash), SVfARG(paramnames)); + } + + EXTEND(SP, 1); + ST(0) = self; + XSRETURN(1); +} + +/* OP_METHSTART is an UNOP_AUX whose AUX list contains + * [0].uv = count of fieldbinding pairs + * [1].uv = maximum fieldidx found in the binding list + * [...] = pairs of (padix, fieldix) to bind in .uv fields + */ + +/* TODO: People would probably expect to find this in pp.c ;) */ +PP(pp_methstart) +{ + SV *self = av_shift(GvAV(PL_defgv)); + SV *rv = NULL; + + /* pp_methstart happens before the first OP_NEXTSTATE of the method body, + * meaning PL_curcop still points at the callsite. This is useful for + * croak() messages. However, it means we have to find our current stash + * via a different technique. + */ + CV *curcv; + if(LIKELY(CxTYPE(CX_CUR()) == CXt_SUB)) + curcv = CX_CUR()->blk_sub.cv; + else + curcv = find_runcv(NULL); + + if(!SvROK(self) || + !SvOBJECT((rv = SvRV(self))) || + SvTYPE(rv) != SVt_PVOBJ) { + HEK *namehek = CvGvNAME_HEK(curcv); + croak( + namehek ? "Cannot invoke method %" HEKf_QUOTEDPREFIX " on a non-instance" : + "Cannot invoke method on a non-instance", + namehek); + } + + if(CvSTASH(curcv) != SvSTASH(rv) && + !sv_derived_from_hv(self, CvSTASH(curcv))) + croak("Cannot invoke a method of %" HvNAMEf_QUOTEDPREFIX " on an instance of %" HvNAMEf_QUOTEDPREFIX, + HvNAMEfARG(CvSTASH(curcv)), HvNAMEfARG(SvSTASH(rv))); + + save_clearsv(&PAD_SVl(PADIX_SELF)); + sv_setsv(PAD_SVl(PADIX_SELF), self); + + UNOP_AUX_item *aux = cUNOP_AUX->op_aux; + if(aux) { + assert(SvTYPE(SvRV(self)) == SVt_PVOBJ); + SV *instance = SvRV(self); + SV **fieldp = ObjectFIELDS(instance); + + U32 fieldcount = (aux++)->uv; + U32 max_fieldix = (aux++)->uv; + + assert((U32)(ObjectMAXFIELD(instance)+1) > max_fieldix); + PERL_UNUSED_VAR(max_fieldix); + + for(Size_t i = 0; i < fieldcount; i++) { + PADOFFSET padix = (aux++)->uv; + U32 fieldix = (aux++)->uv; + + assert(fieldp[fieldix]); + + /* TODO: There isn't a convenient SAVE macro for doing both these + * steps in one go. Add one. */ + SAVESPTR(PAD_SVl(padix)); + SV *sv = PAD_SVl(padix) = SvREFCNT_inc(fieldp[fieldix]); + save_freesv(sv); + } + } + + if(PL_op->op_private & OPpINITFIELDS) { + SV *params = *av_fetch(GvAV(PL_defgv), 0, 0); + if(params && SvTYPE(params) == SVt_PVHV) { + SAVESPTR(PAD_SVl(PADIX_PARAMS)); + PAD_SVl(PADIX_PARAMS) = SvREFCNT_inc(params); + save_freesv(params); + } + } + + return NORMAL; +} + +static void +invoke_class_seal(pTHX_ void *_arg) +{ + class_seal_stash((HV *)_arg); +} + +void +Perl_class_setup_stash(pTHX_ HV *stash) +{ + PERL_ARGS_ASSERT_CLASS_SETUP_STASH; + + assert(HvHasAUX(stash)); + + if(HvSTASH_IS_CLASS(stash)) { + croak("Cannot reopen existing class %" HvNAMEf_QUOTEDPREFIX, + HvNAMEfARG(stash)); + } + + { + SV *isaname = newSVpvf("%" HEKf "::ISA", HvNAME_HEK(stash)); + sv_2mortal(isaname); + + AV *isa = get_av(SvPV_nolen(isaname), (SvFLAGS(isaname) & SVf_UTF8)); + + if(isa && av_count(isa) > 0) + croak("Cannot create class %" HEKf " as it already has a non-empty @ISA", + HvNAME_HEK(stash)); + } + + char *classname = HvNAME(stash); + U32 nameflags = HvNAMEUTF8(stash) ? SVf_UTF8 : 0; + + /* TODO: + * Set some kind of flag on the stash to point out it's a class + * Allocate storage for all the extra things a class needs + * See https://github.com/leonerd/perl5/discussions/1 + */ + + /* Inject the constructor */ + { + SV *newname = Perl_newSVpvf(aTHX_ "%s::new", classname); + SAVEFREESV(newname); + + CV *newcv = newXS_flags(SvPV_nolen(newname), injected_constructor, __FILE__, NULL, nameflags); + CvXSUBANY(newcv).any_sv = (SV *)stash; + CvREFCOUNTED_ANYSV_on(newcv); + } + + /* TODO: + * DOES method + */ + + struct xpvhv_aux *aux = HvAUX(stash); + aux->xhv_class_superclass = NULL; + aux->xhv_class_initfields_cv = NULL; + aux->xhv_class_adjust_blocks = NULL; + aux->xhv_class_fields = NULL; + aux->xhv_class_next_fieldix = 0; + aux->xhv_class_param_map = NULL; + + aux->xhv_aux_flags |= HvAUXf_IS_CLASS; + + SAVEDESTRUCTOR_X(invoke_class_seal, stash); + + /* Prepare a suspended compcv for parsing field init expressions */ + { + I32 floor_ix = start_subparse(FALSE, 0); + + CvIsMETHOD_on(PL_compcv); + + /* We don't want to make `$self` visible during the expression but we + * still need to give it a name. Make it unusable from pure perl + */ + PADOFFSET padix = pad_add_name_pvs("$(self)", 0, NULL, NULL); + assert(padix == PADIX_SELF); + + padix = pad_add_name_pvs("%(params)", 0, NULL, NULL); + assert(padix == PADIX_PARAMS); + + PERL_UNUSED_VAR(padix); + + Newx(aux->xhv_class_suspended_initfields_compcv, 1, struct suspended_compcv); + suspend_compcv(aux->xhv_class_suspended_initfields_compcv); + + LEAVE_SCOPE(floor_ix); + } +} + +#define split_package_ver(value, pkgname, pkgversion) S_split_package_ver(aTHX_ value, pkgname, pkgversion) +static const char *S_split_package_ver(pTHX_ SV *value, SV *pkgname, SV *pkgversion) +{ + const char *start = SvPVX(value), + *p = start, + *end = start + SvCUR(value); + + while(*p && !isSPACE_utf8_safe(p, end)) + p += UTF8SKIP(p); + + sv_setpvn(pkgname, start, p - start); + if(SvUTF8(value)) + SvUTF8_on(pkgname); + + while(*p && isSPACE_utf8_safe(p, end)) + p += UTF8SKIP(p); + + if(*p) { + /* scan_version() gets upset about trailing content. We need to extract + * exactly what it wants + */ + start = p; + if(*p == 'v') + p++; + while(*p && strchr("0123456789._", *p)) + p++; + SV *tmpsv = newSVpvn(start, p - start); + SAVEFREESV(tmpsv); + + scan_version(SvPVX(tmpsv), pkgversion, FALSE); + } + + while(*p && isSPACE_utf8_safe(p, end)) + p += UTF8SKIP(p); + + return p; +} + +#define ensure_module_version(module, version) S_ensure_module_version(aTHX_ module, version) +static void S_ensure_module_version(pTHX_ SV *module, SV *version) +{ + dSP; + + ENTER; + + PUSHMARK(SP); + PUSHs(module); + PUSHs(version); + PUTBACK; + + call_method("VERSION", G_VOID); + + LEAVE; +} + +#define split_attr_nameval(sv, namp, valp) S_split_attr_nameval(aTHX_ sv, namp, valp) +static void S_split_attr_nameval(pTHX_ SV *sv, SV **namp, SV **valp) +{ + STRLEN svlen = SvCUR(sv); + bool do_utf8 = SvUTF8(sv); + + const char *paren_at = (const char *)memchr(SvPVX(sv), '(', svlen); + if(paren_at) { + STRLEN namelen = paren_at - SvPVX(sv); + + if(SvPVX(sv)[svlen-1] != ')') + /* Should be impossible to reach this by parsing regular perl code + * by as class_apply_attributes() is XS-visible API it might still + * be reachable. As it's likely unreachable by normal perl code, + * don't bother listing it in perldiag. + */ + /* diag_listed_as: SKIPME */ + croak("Malformed attribute string"); + *namp = sv_2mortal(newSVpvn_utf8(SvPVX(sv), namelen, do_utf8)); + + const char *value_at = paren_at + 1; + const char *value_max = SvPVX(sv) + svlen - 2; + + /* TODO: We're only obeying ASCII whitespace here */ + + /* Trim whitespace at the start */ + while(value_at < value_max && isSPACE(*value_at)) + value_at += 1; + while(value_max > value_at && isSPACE(*value_max)) + value_max -= 1; + + if(value_max >= value_at) + *valp = sv_2mortal(newSVpvn_utf8(value_at, value_max - value_at + 1, do_utf8)); + } + else { + *namp = sv; + *valp = NULL; + } +} + +static void +apply_class_attribute_isa(pTHX_ HV *stash, SV *value) +{ + assert(HvSTASH_IS_CLASS(stash)); + struct xpvhv_aux *aux = HvAUX(stash); + + /* Parse `value` into name + version */ + SV *superclassname = sv_newmortal(), *superclassver = sv_newmortal(); + const char *end = split_package_ver(value, superclassname, superclassver); + if(*end) + croak("Unexpected characters while parsing class :isa attribute: %s", end); + + if(aux->xhv_class_superclass) + croak("Class already has a superclass, cannot add another"); + + HV *superstash = gv_stashsv(superclassname, 0); + if(!superstash) { + /* Try to `require` the module then attempt a second time */ + load_module(PERL_LOADMOD_NOIMPORT, newSVsv(superclassname), NULL, NULL); + superstash = gv_stashsv(superclassname, 0); + } + if(!superstash || !HvSTASH_IS_CLASS(superstash)) + /* TODO: This would be a useful feature addition */ + croak("Class :isa attribute requires a class but %" HvNAMEf_QUOTEDPREFIX " is not one", + HvNAMEfARG(superstash)); + + if(superclassver && SvOK(superclassver)) + ensure_module_version(superclassname, superclassver); + + /* TODO: Suuuurely there's a way to fetch this neatly with stash + "ISA" + * You'd think that GvAV() of hv_fetchs() would do it, but no, because it + * won't lazily create a proper (magical) GV if one didn't already exist. + */ + { + SV *isaname = newSVpvf("%" HEKf "::ISA", HvNAME_HEK(stash)); + sv_2mortal(isaname); + + AV *isa = get_av(SvPV_nolen(isaname), GV_ADD | (SvFLAGS(isaname) & SVf_UTF8)); + + ENTER; + + /* Temporarily remove the SVf_READONLY flag */ + SAVESETSVFLAGS((SV *)isa, SVf_READONLY|SVf_PROTECT, SVf_READONLY|SVf_PROTECT); + SvREADONLY_off((SV *)isa); + + av_push(isa, newSVsv(value)); + + LEAVE; + } + + aux->xhv_class_superclass = (HV *)SvREFCNT_inc(superstash); + + struct xpvhv_aux *superaux = HvAUX(superstash); + + aux->xhv_class_next_fieldix = superaux->xhv_class_next_fieldix; + + if(superaux->xhv_class_adjust_blocks) { + if(!aux->xhv_class_adjust_blocks) + aux->xhv_class_adjust_blocks = newAV(); + + for(SSize_t i = 0; i <= AvFILL(superaux->xhv_class_adjust_blocks); i++) + av_push(aux->xhv_class_adjust_blocks, AvARRAY(superaux->xhv_class_adjust_blocks)[i]); + } + + if(superaux->xhv_class_param_map) { + aux->xhv_class_param_map = newHVhv(superaux->xhv_class_param_map); + } +} + +static struct { + const char *name; + bool requires_value; + void (*apply)(pTHX_ HV *stash, SV *value); +} const class_attributes[] = { + { .name = "isa", + .requires_value = true, + .apply = &apply_class_attribute_isa, + }, + {0} +}; + +static void +S_class_apply_attribute(pTHX_ HV *stash, OP *attr) +{ + assert(attr->op_type == OP_CONST); + + SV *name, *value; + split_attr_nameval(cSVOPx_sv(attr), &name, &value); + + for(int i = 0; class_attributes[i].name; i++) { + /* TODO: These attribute names are not UTF-8 aware */ + if(!strEQ(SvPVX(name), class_attributes[i].name)) + continue; + + if(class_attributes[i].requires_value && !(value && SvOK(value))) + croak("Class attribute %" SVf " requires a value", SVfARG(name)); + + (*class_attributes[i].apply)(aTHX_ stash, value); + return; + } + + croak("Unrecognized class attribute %" SVf, SVfARG(name)); +} + +void +Perl_class_apply_attributes(pTHX_ HV *stash, OP *attrlist) +{ + PERL_ARGS_ASSERT_CLASS_APPLY_ATTRIBUTES; + + if(!attrlist) + return; + if(attrlist->op_type == OP_NULL) { + op_free(attrlist); + return; + } + + if(attrlist->op_type == OP_LIST) { + OP *o = cLISTOPx(attrlist)->op_first; + assert(o->op_type == OP_PUSHMARK); + o = OpSIBLING(o); + + for(; o; o = OpSIBLING(o)) + S_class_apply_attribute(aTHX_ stash, o); + } + else + S_class_apply_attribute(aTHX_ stash, attrlist); + + op_free(attrlist); +} + +static OP * +S_newCROAKOP(pTHX_ SV *message) +{ + OP *o = newLISTOP(OP_LIST, 0, + newOP(OP_PUSHMARK, 0), + newSVOP(OP_CONST, 0, message)); + return op_convert_list(OP_DIE, 0, o); +} +#define newCROAKOP(message) S_newCROAKOP(aTHX_ message) + +void +Perl_class_seal_stash(pTHX_ HV *stash) +{ + PERL_ARGS_ASSERT_CLASS_SEAL_STASH; + + assert(HvSTASH_IS_CLASS(stash)); + struct xpvhv_aux *aux = HvAUX(stash); + + /* generate initfields CV */ + { + I32 floor_ix = PL_savestack_ix; + SAVEI32(PL_subline); + save_item(PL_subname); + + resume_compcv_final(aux->xhv_class_suspended_initfields_compcv); + + /* Some OP_INITFIELD ops will need to populate the pad with their + * result because later ops will rely on it. There's no need to do + * this for every op though. Store a mapping to work out which ones + * we'll need. + */ + PADNAMELIST *pnl = PadlistNAMES(CvPADLIST(PL_compcv)); + HV *fieldix_to_padix = newHV(); + SAVEFREESV((SV *)fieldix_to_padix); + + /* padix 0 == @_; padix 1 == $self. Start at 2 */ + for(PADOFFSET padix = 2; padix <= PadnamelistMAX(pnl); padix++) { + PADNAME *pn = PadnamelistARRAY(pnl)[padix]; + if(!pn || !PadnameIsFIELD(pn)) + continue; + + U32 fieldix = PadnameFIELDINFO(pn)->fieldix; + (void)hv_store_ent(fieldix_to_padix, sv_2mortal(newSVuv(fieldix)), newSVuv(padix), 0); + } + + OP *ops = NULL; + + ops = op_append_list(OP_LINESEQ, ops, + newUNOP_AUX(OP_METHSTART, OPpINITFIELDS << 8, NULL, NULL)); + + if(aux->xhv_class_superclass) { + HV *superstash = aux->xhv_class_superclass; + assert(HvSTASH_IS_CLASS(superstash)); + struct xpvhv_aux *superaux = HvAUX(superstash); + + /* Build an OP_ENTERSUB */ + OP *o = NULL; + o = op_append_list(OP_LIST, o, + newPADxVOP(OP_PADSV, 0, PADIX_SELF)); + o = op_append_list(OP_LIST, o, + newPADxVOP(OP_PADHV, OPf_REF, PADIX_PARAMS)); + /* TODO: This won't work at all well under `use threads` because + * it embeds the CV * to the superclass initfields CV right into + * the optree. Maybe we'll have to pop it in the pad or something + */ + o = op_append_list(OP_LIST, o, + newSVOP(OP_CONST, 0, (SV *)superaux->xhv_class_initfields_cv)); + + ops = op_append_list(OP_LINESEQ, ops, + op_convert_list(OP_ENTERSUB, OPf_WANT_VOID|OPf_STACKED, o)); + } + + PADNAMELIST *fieldnames = aux->xhv_class_fields; + + for(SSize_t i = 0; fieldnames && i <= PadnamelistMAX(fieldnames); i++) { + PADNAME *pn = PadnamelistARRAY(fieldnames)[i]; + char sigil = PadnamePV(pn)[0]; + PADOFFSET fieldix = PadnameFIELDINFO(pn)->fieldix; + + /* Extract the OP_{NEXT,DB}STATE op from the defop so we can + * splice it in + */ + OP *valop = PadnameFIELDINFO(pn)->defop; + if(valop && valop->op_type == OP_LINESEQ) { + OP *o = cLISTOPx(valop)->op_first; + cLISTOPx(valop)->op_first = NULL; + cLISTOPx(valop)->op_last = NULL; + /* have to clear the OPf_KIDS flag or op_free() will get upset */ + valop->op_flags &= ~OPf_KIDS; + op_free(valop); + assert(valop->op_type == OP_FREED); + + OP *fieldcop = o; + assert(fieldcop->op_type == OP_NEXTSTATE || fieldcop->op_type == OP_DBSTATE); + o = OpSIBLING(o); + OpLASTSIB_set(fieldcop, NULL); + + valop = o; + OpLASTSIB_set(valop, NULL); + + ops = op_append_list(OP_LINESEQ, ops, fieldcop); + } + + SV *paramname = PadnameFIELDINFO(pn)->paramname; + + U8 op_priv = 0; + switch(sigil) { + case '$': + if(paramname) { + if(!valop) + valop = newCROAKOP( + newSVpvf("Required parameter '%" SVf "' is missing for %" HvNAMEf_QUOTEDPREFIX " constructor", + SVfARG(paramname), HvNAMEfARG(stash)) + ); + + OP *helemop = + newBINOP(OP_HELEM, 0, + newPADxVOP(OP_PADHV, OPf_REF, PADIX_PARAMS), + newSVOP(OP_CONST, 0, SvREFCNT_inc(paramname))); + + if(PadnameFIELDINFO(pn)->def_if_undef) { + /* delete $params{$paramname} // DEFOP */ + valop = newLOGOP(OP_DOR, 0, + newUNOP(OP_DELETE, 0, helemop), valop); + } + else if(PadnameFIELDINFO(pn)->def_if_false) { + /* delete $params{$paramname} || DEFOP */ + valop = newLOGOP(OP_OR, 0, + newUNOP(OP_DELETE, 0, helemop), valop); + } + else { + /* exists $params{$paramname} ? delete $params{$paramname} : DEFOP */ + /* more efficient with the new OP_HELEMEXISTSOR */ + valop = newLOGOP(OP_HELEMEXISTSOR, OPpHELEMEXISTSOR_DELETE << 8, + helemop, valop); + } + + valop = op_contextualize(valop, G_SCALAR); + } + break; + + case '@': + op_priv = OPpINITFIELD_AV; + break; + + case '%': + op_priv = OPpINITFIELD_HV; + break; + + default: + NOT_REACHED; + } + + UNOP_AUX_item *aux; + Newx(aux, 2, UNOP_AUX_item); + + aux[0].uv = fieldix; + + OP *fieldop = newUNOP_AUX(OP_INITFIELD, valop ? OPf_STACKED : 0, valop, aux); + fieldop->op_private = op_priv; + + HE *he; + if((he = hv_fetch_ent(fieldix_to_padix, sv_2mortal(newSVuv(fieldix)), 0, 0)) && + SvOK(HeVAL(he))) { + fieldop->op_targ = SvUV(HeVAL(he)); + } + + ops = op_append_list(OP_LINESEQ, ops, fieldop); + } + + /* initfields CV should not get class_wrap_method_body() called on its + * body. pretend it isn't a method for now */ + CvIsMETHOD_off(PL_compcv); + CV *initfields = newATTRSUB(floor_ix, NULL, NULL, NULL, ops); + CvIsMETHOD_on(initfields); + + aux->xhv_class_initfields_cv = initfields; + } +} + +void +Perl_class_prepare_initfield_parse(pTHX) +{ + PERL_ARGS_ASSERT_CLASS_PREPARE_INITFIELD_PARSE; + + assert(HvSTASH_IS_CLASS(PL_curstash)); + struct xpvhv_aux *aux = HvAUX(PL_curstash); + + resume_compcv_and_save(aux->xhv_class_suspended_initfields_compcv); + CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax; +} + +void +Perl_class_prepare_method_parse(pTHX_ CV *cv) +{ + PERL_ARGS_ASSERT_CLASS_PREPARE_METHOD_PARSE; + + assert(cv == PL_compcv); + assert(HvSTASH_IS_CLASS(PL_curstash)); + + /* We expect this to be at the start of sub parsing, so there won't be + * anything in the pad yet + */ + assert(PL_comppad_name_fill == 0); + + PADOFFSET padix; + + padix = pad_add_name_pvs("$self", 0, NULL, NULL); + assert(padix == PADIX_SELF); + PERL_UNUSED_VAR(padix); + + intro_my(); + + CvNOWARN_AMBIGUOUS_on(cv); + CvIsMETHOD_on(cv); +} + +OP * +Perl_class_wrap_method_body(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CLASS_WRAP_METHOD_BODY; + + if(!o) + return o; + + PADNAMELIST *pnl = PadlistNAMES(CvPADLIST(PL_compcv)); + + AV *fieldmap = newAV(); + UV max_fieldix = 0; + SAVEFREESV((SV *)fieldmap); + + /* padix 0 == @_; padix 1 == $self. Start at 2 */ + for(PADOFFSET padix = 2; padix <= PadnamelistMAX(pnl); padix++) { + PADNAME *pn = PadnamelistARRAY(pnl)[padix]; + if(!pn || !PadnameIsFIELD(pn)) + continue; + + U32 fieldix = PadnameFIELDINFO(pn)->fieldix; + if(fieldix > max_fieldix) + max_fieldix = fieldix; + + av_push(fieldmap, newSVuv(padix)); + av_push(fieldmap, newSVuv(fieldix)); + } + + UNOP_AUX_item *aux = NULL; + + if(av_count(fieldmap)) { + Newx(aux, 2 + av_count(fieldmap), UNOP_AUX_item); + + UNOP_AUX_item *ap = aux; + + (ap++)->uv = av_count(fieldmap) / 2; + (ap++)->uv = max_fieldix; + + for(Size_t i = 0; i < av_count(fieldmap); i++) + (ap++)->uv = SvUV(AvARRAY(fieldmap)[i]); + } + + /* If this is an empty method body then o will be an OP_STUB and not a + * list. This will confuse op_sibling_splice() */ + if(o->op_type != OP_LINESEQ) + o = newLISTOP(OP_LINESEQ, 0, o, NULL); + + op_sibling_splice(o, NULL, 0, newUNOP_AUX(OP_METHSTART, 0, NULL, aux)); + + return o; +} + +void +Perl_class_add_field(pTHX_ HV *stash, PADNAME *pn) +{ + PERL_ARGS_ASSERT_CLASS_ADD_FIELD; + + assert(HvSTASH_IS_CLASS(stash)); + struct xpvhv_aux *aux = HvAUX(stash); + + PADOFFSET fieldix = aux->xhv_class_next_fieldix; + aux->xhv_class_next_fieldix++; + + Newxz(PadnameFIELDINFO(pn), 1, struct padname_fieldinfo); + PadnameFLAGS(pn) |= PADNAMEf_FIELD; + + PadnameFIELDINFO(pn)->refcount = 1; + PadnameFIELDINFO(pn)->fieldix = fieldix; + PadnameFIELDINFO(pn)->fieldstash = (HV *)SvREFCNT_inc(stash); + + if(!aux->xhv_class_fields) + aux->xhv_class_fields = newPADNAMELIST(0); + + padnamelist_store(aux->xhv_class_fields, PadnamelistMAX(aux->xhv_class_fields)+1, pn); + PadnameREFCNT_inc(pn); +} + +static void +apply_field_attribute_param(pTHX_ PADNAME *pn, SV *value) +{ + if(!value) + /* Default to name minus the sigil */ + value = newSVpvn_utf8(PadnamePV(pn) + 1, PadnameLEN(pn) - 1, PadnameUTF8(pn)); + + if(PadnamePV(pn)[0] != '$') + croak("Only scalar fields can take a :param attribute"); + + if(PadnameFIELDINFO(pn)->paramname) + croak("Field already has a parameter name, cannot add another"); + + HV *stash = PadnameFIELDINFO(pn)->fieldstash; + assert(HvSTASH_IS_CLASS(stash)); + struct xpvhv_aux *aux = HvAUX(stash); + + if(aux->xhv_class_param_map && + hv_exists_ent(aux->xhv_class_param_map, value, 0)) + croak("Cannot assign :param(%" SVf ") to field %" SVf " because that name is already in use", + SVfARG(value), SVfARG(PadnameSV(pn))); + + PadnameFIELDINFO(pn)->paramname = SvREFCNT_inc(value); + + if(!aux->xhv_class_param_map) + aux->xhv_class_param_map = newHV(); + + (void)hv_store_ent(aux->xhv_class_param_map, value, newSVuv(PadnameFIELDINFO(pn)->fieldix), 0); +} + +static struct { + const char *name; + bool requires_value; + void (*apply)(pTHX_ PADNAME *pn, SV *value); +} const field_attributes[] = { + { .name = "param", + .requires_value = false, + .apply = &apply_field_attribute_param, + }, + {0} +}; + +static void +S_class_apply_field_attribute(pTHX_ PADNAME *pn, OP *attr) +{ + assert(attr->op_type == OP_CONST); + + SV *name, *value; + split_attr_nameval(cSVOPx_sv(attr), &name, &value); + + for(int i = 0; field_attributes[i].name; i++) { + /* TODO: These attribute names are not UTF-8 aware */ + if(!strEQ(SvPVX(name), field_attributes[i].name)) + continue; + + if(field_attributes[i].requires_value && !(value && SvOK(value))) + croak("Field attribute %" SVf " requires a value", SVfARG(name)); + + (*field_attributes[i].apply)(aTHX_ pn, value); + return; + } + + croak("Unrecognized field attribute %" SVf, SVfARG(name)); +} + +void +Perl_class_apply_field_attributes(pTHX_ PADNAME *pn, OP *attrlist) +{ + PERL_ARGS_ASSERT_CLASS_APPLY_FIELD_ATTRIBUTES; + + if(!attrlist) + return; + if(attrlist->op_type == OP_NULL) { + op_free(attrlist); + return; + } + + if(attrlist->op_type == OP_LIST) { + OP *o = cLISTOPx(attrlist)->op_first; + assert(o->op_type == OP_PUSHMARK); + o = OpSIBLING(o); + + for(; o; o = OpSIBLING(o)) + S_class_apply_field_attribute(aTHX_ pn, o); + } + else + S_class_apply_field_attribute(aTHX_ pn, attrlist); + + op_free(attrlist); +} + +void +Perl_class_set_field_defop(pTHX_ PADNAME *pn, OPCODE defmode, OP *defop) +{ + PERL_ARGS_ASSERT_CLASS_SET_FIELD_DEFOP; + + assert(defmode == 0 || defmode == OP_ORASSIGN || defmode == OP_DORASSIGN); + + assert(HvSTASH_IS_CLASS(PL_curstash)); + + forbid_outofblock_ops(defop, "field initialiser expression"); + + if(PadnameFIELDINFO(pn)->defop) + op_free(PadnameFIELDINFO(pn)->defop); + + char sigil = PadnamePV(pn)[0]; + switch(sigil) { + case '$': + defop = op_contextualize(defop, G_SCALAR); + break; + + case '@': + case '%': + defop = op_contextualize(op_force_list(defop), G_LIST); + break; + } + + PadnameFIELDINFO(pn)->defop = newLISTOP(OP_LINESEQ, 0, + newSTATEOP(0, NULL, NULL), defop); + switch(defmode) { + case OP_DORASSIGN: + PadnameFIELDINFO(pn)->def_if_undef = true; + break; + case OP_ORASSIGN: + PadnameFIELDINFO(pn)->def_if_false = true; + break; + } +} + +void +Perl_class_add_ADJUST(pTHX_ HV *stash, CV *cv) +{ + PERL_ARGS_ASSERT_CLASS_ADD_ADJUST; + + assert(HvSTASH_IS_CLASS(stash)); + struct xpvhv_aux *aux = HvAUX(stash); + + if(!aux->xhv_class_adjust_blocks) + aux->xhv_class_adjust_blocks = newAV(); + + av_push(aux->xhv_class_adjust_blocks, (SV *)cv); +} + +/* + * ex: set ts=8 sts=4 sw=4 et: + */ Index: gnu/usr.bin/perl/config_h.SH =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/config_h.SH,v diff -u -p -a -u -p -r1.24 config_h.SH --- gnu/usr.bin/perl/config_h.SH 15 Feb 2023 01:36:13 -0000 1.24 +++ gnu/usr.bin/perl/config_h.SH 21 Feb 2024 15:47:00 -0000 @@ -32,7 +32,7 @@ case "$CONFIG_H" in already-done) echo "Not re-extracting config.h" ;; *) echo "Extracting $CONFIG_H (with variable substitutions)" -sed <$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-def!#undef!' +sed <$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-def!#undef!' -e's!define\t!define !' /* This file was produced by running the config_h.SH script, which * gets its values from $CONFIG_SH, which is generally produced by * running Configure. @@ -1495,6 +1495,10 @@ sed <$CONFIG_H -e 's!^#und * Can we handle GCC attribute for functions that should always be * inlined. */ +/* HASATTRIBUTE_VISIBILITY: + * Can we handle GCC attribute for functions that should have a + * different visibility. + */ #$d_attribute_deprecated HASATTRIBUTE_DEPRECATED /**/ #$d_attribute_format HASATTRIBUTE_FORMAT /**/ #$d_printf_format_null PRINTF_FORMAT_NULL_OK /**/ @@ -1505,6 +1509,7 @@ sed <$CONFIG_H -e 's!^#und #$d_attribute_unused HASATTRIBUTE_UNUSED /**/ #$d_attribute_warn_unused_result HASATTRIBUTE_WARN_UNUSED_RESULT /**/ #$d_attribute_always_inline HASATTRIBUTE_ALWAYS_INLINE /**/ +#$d_attribute_visibility HASATTRIBUTE_VISIBILITY /**/ /* HAS_BACKTRACE: * This symbol, if defined, indicates that the backtrace() routine is @@ -2281,7 +2286,7 @@ sed <$CONFIG_H -e 's!^#und */ #ifndef USE_CROSS_COMPILE #$usecrosscompile USE_CROSS_COMPILE /**/ -#define PERL_TARGETARCH "$targetarch" /**/ +#define PERL_TARGETARCH "$targetarch" /**/ #endif /* PERL_USE_DEVEL: @@ -2434,7 +2439,7 @@ sed <$CONFIG_H -e 's!^#und #$d_dbminitproto HAS_DBMINIT_PROTO /**/ /* HAS_DIR_DD_FD: - * This symbol, if defined, indicates that the the DIR* dirstream + * This symbol, if defined, indicates that the DIR* dirstream * structure contains a member variable named dd_fd. */ #$d_dir_dd_fd HAS_DIR_DD_FD /**/ @@ -3294,6 +3299,12 @@ sed <$CONFIG_H -e 's!^#und */ #$d_sendmsg HAS_SENDMSG /**/ +/* HAS_SETENV: + * This symbol, if defined, indicates that the setenv routine is + * available for use. + */ +#$d_setenv HAS_SETENV /**/ + /* HAS_SETITIMER: * This symbol, if defined, indicates that the setitimer routine is * available to set interval timers. @@ -3618,7 +3629,7 @@ sed <$CONFIG_H -e 's!^#und /* HAS_WCSXFRM: * This symbol, if defined, indicates that the wcsxfrm routine is - * available to tranform a wide character string for wcscmp(). + * available to transform a wide character string for wcscmp(). */ #$d_wcsxfrm HAS_WCSXFRM /**/ @@ -3835,6 +3846,11 @@ sed <$CONFIG_H -e 's!^#und */ #$i_sysstatvfs I_SYS_STATVFS /**/ +/* I_SYS_SYSCALL: + * This symbol, if defined, indicates that exists. + */ +#$i_syssyscall I_SYS_SYSCALL /**/ + /* I_SYSUTSNAME: * This symbol, if defined, indicates that exists and * should be included. @@ -4015,6 +4031,32 @@ sed <$CONFIG_H -e 's!^#und */ #$need_va_copy NEED_VA_COPY /**/ +/* I32df: + * This symbol defines the format string used for printing a Perl I32 + * as a signed decimal integer. + */ +/* U32uf: + * This symbol defines the format string used for printing a Perl U32 + * as an unsigned decimal integer. + */ +/* U32of: + * This symbol defines the format string used for printing a Perl U32 + * as an unsigned octal integer. + */ +/* U32xf: + * This symbol defines the format string used for printing a Perl U32 + * as an unsigned hexadecimal integer in lowercase abcdef. + */ +/* U32Xf: + * This symbol defines the format string used for printing a Perl U32 + * as an unsigned hexadecimal integer in uppercase ABCDEF. + */ +#define I32df $i32dformat /**/ +#define U32of $u32oformat /**/ +#define U32uf $u32uformat /**/ +#define U32xf $u32xformat /**/ +#define U32Xf $u32XUformat /**/ + /* IVTYPE: * This symbol defines the C type used for Perl's IV. */ @@ -4104,35 +4146,35 @@ sed <$CONFIG_H -e 's!^#und * This symbol, if defined, indicates that a variable of type NVTYPE * stores 0.0 in memory as all bits zero. */ -#define IVTYPE $ivtype /**/ -#define UVTYPE $uvtype /**/ -#define I8TYPE $i8type /**/ -#define U8TYPE $u8type /**/ -#define I16TYPE $i16type /**/ -#define U16TYPE $u16type /**/ -#define I32TYPE $i32type /**/ -#define U32TYPE $u32type /**/ +#define IVTYPE $ivtype /**/ +#define UVTYPE $uvtype /**/ +#define I8TYPE $i8type /**/ +#define U8TYPE $u8type /**/ +#define I16TYPE $i16type /**/ +#define U16TYPE $u16type /**/ +#define I32TYPE $i32type /**/ +#define U32TYPE $u32type /**/ #ifdef HAS_QUAD -#define I64TYPE $i64type /**/ -#define U64TYPE $u64type /**/ +#define I64TYPE $i64type /**/ +#define U64TYPE $u64type /**/ #endif -#define NVTYPE $nvtype /**/ -#define IVSIZE $ivsize /**/ -#define UVSIZE $uvsize /**/ -#define I8SIZE $i8size /**/ -#define U8SIZE $u8size /**/ -#define I16SIZE $i16size /**/ -#define U16SIZE $u16size /**/ -#define I32SIZE $i32size /**/ -#define U32SIZE $u32size /**/ +#define NVTYPE $nvtype /**/ +#define IVSIZE $ivsize /**/ +#define UVSIZE $uvsize /**/ +#define I8SIZE $i8size /**/ +#define U8SIZE $u8size /**/ +#define I16SIZE $i16size /**/ +#define U16SIZE $u16size /**/ +#define I32SIZE $i32size /**/ +#define U32SIZE $u32size /**/ #ifdef HAS_QUAD -#define I64SIZE $i64size /**/ -#define U64SIZE $u64size /**/ +#define I64SIZE $i64size /**/ +#define U64SIZE $u64size /**/ #endif -#define NVSIZE $nvsize /**/ +#define NVSIZE $nvsize /**/ #$d_nv_preserves_uv NV_PRESERVES_UV -#define NV_PRESERVES_UV_BITS $nv_preserves_uv_bits -#define NV_OVERFLOWS_INTEGERS_AT ($nv_overflows_integers_at) +#define NV_PRESERVES_UV_BITS $nv_preserves_uv_bits +#define NV_OVERFLOWS_INTEGERS_AT ($nv_overflows_integers_at) #$d_nv_zero_is_allbits_zero NV_ZERO_IS_ALLBITS_ZERO #if UVSIZE == 8 # ifdef BYTEORDER @@ -4180,14 +4222,14 @@ sed <$CONFIG_H -e 's!^#und * This symbol defines the format string used for printing a Perl NV * using %g-ish floating point format. */ -#define IVdf $ivdformat /**/ -#define UVuf $uvuformat /**/ -#define UVof $uvoformat /**/ -#define UVxf $uvxformat /**/ -#define UVXf $uvXUformat /**/ -#define NVef $nveformat /**/ -#define NVff $nvfformat /**/ -#define NVgf $nvgformat /**/ +#define IVdf $ivdformat /**/ +#define UVuf $uvuformat /**/ +#define UVof $uvoformat /**/ +#define UVxf $uvxformat /**/ +#define UVXf $uvXUformat /**/ +#define NVef $nveformat /**/ +#define NVff $nvfformat /**/ +#define NVgf $nvgformat /**/ /* SELECT_MIN_BITS: * This symbol holds the minimum number of bits operated by select. @@ -5284,7 +5326,7 @@ sed <$CONFIG_H -e 's!^#und /* Gid_t_f: * This symbol defines the format string used for printing a Gid_t. */ -#define Gid_t_f $gidformat /**/ +#define Gid_t_f $gidformat /**/ /* Gid_t_sign: * This symbol holds the signedness of a Gid_t. @@ -5352,7 +5394,7 @@ sed <$CONFIG_H -e 's!^#und /* Uid_t_f: * This symbol defines the format string used for printing a Uid_t. */ -#define Uid_t_f $uidformat /**/ +#define Uid_t_f $uidformat /**/ /* Uid_t_sign: * This symbol holds the signedness of a Uid_t. Index: gnu/usr.bin/perl/configpm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/configpm,v diff -u -p -a -u -p -r1.36 configpm --- gnu/usr.bin/perl/configpm 15 Feb 2023 01:38:20 -0000 1.36 +++ gnu/usr.bin/perl/configpm 21 Feb 2024 15:47:00 -0000 @@ -1,4 +1,5 @@ #!./miniperl -w +# vim: syntax=perl # # configpm # @@ -28,10 +29,14 @@ # this case, since for example an extension makefile that has a dependency # on Config.pm should trigger even if only Config_heavy.pl has changed. -sub usage { die < 1, config_sh => 1, config_vars => 1, - config_re => 1, compile_date => 1, local_patches => 1, - bincompat_options => 1, non_bincompat_options => 1, - header_files => 1); +my $export_funcs = uncomment <<'EOT'; +# my %Export_Cache = (myconfig => 1, config_sh => 1, config_vars => 1, +# config_re => 1, compile_date => 1, local_patches => 1, +# bincompat_options => 1, non_bincompat_options => 1, +# header_files => 1); EOT my %export_ok = eval $export_funcs or die; -$config_txt .= sprintf << 'EOT', $], $export_funcs; -# This file was created by configpm when Perl was built. Any changes -# made to this file will be lost the next time perl is built. - -# for a description of the variables, please have a look at the -# Glossary file, as written in the Porting folder, or use the url: -# https://github.com/Perl/perl5/blob/blead/Porting/Glossary - -package Config; -use strict; -use warnings; -our ( %%Config, $VERSION ); - -$VERSION = "%s"; - -# Skip @Config::EXPORT because it only contains %%Config, which we special -# case below as it's not a function. @Config::EXPORT won't change in the -# lifetime of Perl 5. -%s -@Config::EXPORT = qw(%%Config); -@Config::EXPORT_OK = keys %%Export_Cache; - -# Need to stub all the functions to make code such as print Config::config_sh -# keep working - +$config_txt .= sprintf uncomment << 'EOT', $], $export_funcs; +# # This file was created by configpm when Perl was built. Any changes +# # made to this file will be lost the next time perl is built. +# +# # for a description of the variables, please have a look at the +# # Glossary file, as written in the Porting folder, or use the url: +# # https://github.com/Perl/perl5/blob/blead/Porting/Glossary +# +# package Config; +# use strict; +# use warnings; +# our ( %%Config, $VERSION ); +# +# $VERSION = "%s"; +# +# # Skip @Config::EXPORT because it only contains %%Config, which we special +# # case below as it's not a function. @Config::EXPORT won't change in the +# # lifetime of Perl 5. +# %s +# @Config::EXPORT = qw(%%Config); +# @Config::EXPORT_OK = keys %%Export_Cache; +# +# # Need to stub all the functions to make code such as print Config::config_sh +# # keep working +# EOT $config_txt .= "sub $_;\n" foreach sort keys %export_ok; my $myver = sprintf "%vd", $^V; -$config_txt .= sprintf <<'ENDOFBEG', ($myver) x 3; - -# Define our own import method to avoid pulling in the full Exporter: -sub import { - shift; - @_ = @Config::EXPORT unless @_; - - my @funcs = grep $_ ne '%%Config', @_; - my $export_Config = @funcs < @_ ? 1 : 0; - - no strict 'refs'; - my $callpkg = caller(0); - foreach my $func (@funcs) { - die qq{"$func" is not exported by the Config module\n} - unless $Export_Cache{$func}; - *{$callpkg.'::'.$func} = \&{$func}; - } - - *{"$callpkg\::Config"} = \%%Config if $export_Config; - return; -} - -die "$0: Perl lib version (%s) doesn't match executable '$^X' version ($])" - unless $^V; - -$^V eq %s - or die sprintf "%%s: Perl lib version (%s) doesn't match executable '$^X' version (%%vd)", $0, $^V; - +$config_txt .= sprintf uncomment <<'ENDOFBEG', ($myver) x 3; +# +# # Define our own import method to avoid pulling in the full Exporter: +# sub import { +# shift; +# @_ = @Config::EXPORT unless @_; +# +# my @funcs = grep $_ ne '%%Config', @_; +# my $export_Config = @funcs < @_ ? 1 : 0; +# +# no strict 'refs'; +# my $callpkg = caller(0); +# foreach my $func (@funcs) { +# die qq{"$func" is not exported by the Config module\n} +# unless $Export_Cache{$func}; +# *{$callpkg.'::'.$func} = \&{$func}; +# } +# +# *{"$callpkg\::Config"} = \%%Config if $export_Config; +# return; +# } +# +# die "$0: Perl lib version (%s) doesn't match executable '$^X' version ($])" +# unless $^V; +# +# $^V eq %s +# or die sprintf "%%s: Perl lib version (%s) doesn't match executable '$^X' version (%%vd)", $0, $^V; +# ENDOFBEG @@ -217,12 +222,12 @@ my $quote; # (at least up to version 804.034) fails to build without them. We force them # to be emitted to Config_heavy.pl for backcompat with such modules (and we may # find that this set needs to be extended in future). See RT#132347. -my @v_forced = map "$_\n", split /\n+/, <<'EOT'; -i_limits='define' -i_stdlib='define' -i_string='define' -i_time='define' -prototype='define' +my @v_forced = map "$_\n", split /\n+/, uncomment <<'EOT'; +# i_limits='define' +# i_stdlib='define' +# i_string='define' +# i_time='define' +# prototype='define' EOT @@ -282,47 +287,47 @@ my %seen_quotes; # This is somewhat grim, but I want the code for parsing config.sh here and # now so that I can expand $Config{ivsize} and $Config{ivtype} -my $fetch_string = <<'EOT'; - -# Search for it in the big string -sub fetch_string { - my($self, $key) = @_; - +my $fetch_string = uncomment <<'EOT'; +# +# # Search for it in the big string +# sub fetch_string { +# my($self, $key) = @_; +# EOT if ($seen_quotes{'"'}) { # We need the full ' and " code -$fetch_string .= <<'EOT'; - return undef unless my ($quote_type, $value) = $Config_SH_expanded =~ /\n$key=(['"])(.*?)\1\n/s; - - # If we had a double-quote, we'd better eval it so escape - # sequences and such can be interpolated. Since the incoming - # value is supposed to follow shell rules and not perl rules, - # we escape any perl variable markers - - # Historically, since " 'support' was added in change 1409, the - # interpolation was done before the undef. Stick to this arguably buggy - # behaviour as we're refactoring. - if ($quote_type eq '"') { - $value =~ s/\$/\\\$/g; - $value =~ s/\@/\\\@/g; - eval "\$value = \"$value\""; - } - - # So we can say "if $Config{'foo'}". - $self->{$key} = $value eq 'undef' ? undef : $value; # cache it -} +$fetch_string .= uncomment <<'EOT'; +# return undef unless my ($quote_type, $value) = $Config_SH_expanded =~ /\n$key=(['"])(.*?)\1\n/s; +# +# # If we had a double-quote, we'd better eval it so escape +# # sequences and such can be interpolated. Since the incoming +# # value is supposed to follow shell rules and not perl rules, +# # we escape any perl variable markers +# +# # Historically, since " 'support' was added in change 1409, the +# # interpolation was done before the undef. Stick to this arguably buggy +# # behaviour as we're refactoring. +# if ($quote_type eq '"') { +# $value =~ s/\$/\\\$/g; +# $value =~ s/\@/\\\@/g; +# eval "\$value = \"$value\""; +# } +# +# # So we can say "if $Config{'foo'}". +# $self->{$key} = $value eq 'undef' ? undef : $value; # cache it +# } EOT } else { # We only have ' delimited. -$fetch_string .= <<'EOT'; - return undef unless $Config_SH_expanded =~ /\n$key=\'(.*?)\'\n/s; - # So we can say "if $Config{'foo'}". - $self->{$key} = $1 eq 'undef' ? undef : $1; -} +$fetch_string .= uncomment <<'EOT'; +# return undef unless $Config_SH_expanded =~ /\n$key=\'(.*?)\'\n/s; +# # So we can say "if $Config{'foo'}". +# $self->{$key} = $1 eq 'undef' ? undef : $1; +# } EOT } @@ -429,32 +434,32 @@ if (fetch_string({}, 'otherlibdirs') =~ $need_relocation{otherlibdirs} = 'otherlibdirs'; } -my $relocation_code = <<'EOT'; - -sub relocate_inc { - my $libdir = shift; - return $libdir unless $libdir =~ s!^\.\.\./!!; - my $prefix = $^X; - if ($prefix =~ s!/[^/]*$!!) { - while ($libdir =~ m!^\.\./!) { - # Loop while $libdir starts "../" and $prefix still has a trailing - # directory - last unless $prefix =~ s!/([^/]+)$!!; - # but bail out if the directory we picked off the end of $prefix is . - # or .. - if ($1 eq '.' or $1 eq '..') { - # Undo! This should be rare, hence code it this way rather than a - # check each time before the s!!! above. - $prefix = "$prefix/$1"; - last; - } - # Remove that leading ../ and loop again - substr ($libdir, 0, 3, ''); - } - $libdir = "$prefix/$libdir"; - } - $libdir; -} +my $relocation_code = uncomment <<'EOT'; +# +# sub relocate_inc { +# my $libdir = shift; +# return $libdir unless $libdir =~ s!^\.\.\./!!; +# my $prefix = $^X; +# if ($prefix =~ s!/[^/]*$!!) { +# while ($libdir =~ m!^\.\./!) { +# # Loop while $libdir starts "../" and $prefix still has a trailing +# # directory +# last unless $prefix =~ s!/([^/]+)$!!; +# # but bail out if the directory we picked off the end of $prefix is . +# # or .. +# if ($1 eq '.' or $1 eq '..') { +# # Undo! This should be rare, hence code it this way rather than a +# # check each time before the s!!! above. +# $prefix = "$prefix/$1"; +# last; +# } +# # Remove that leading ../ and loop again +# substr ($libdir, 0, 3, ''); +# } +# $libdir = "$prefix/$libdir"; +# } +# $libdir; +# } EOT my $osname = fetch_string({}, 'osname'); @@ -462,66 +467,66 @@ my $from = $osname eq 'VMS' ? 'PERLSHR i my $env_cygwin = $osname eq 'cygwin' ? 'push @env, "CYGWIN=\"$ENV{CYGWIN}\"" if $ENV{CYGWIN};' . "\n" : ""; -$heavy_txt .= sprintf <<'ENDOFBEG', $osname, $osname, $from, $osname, $env_cygwin; -# This file was created by configpm when Perl was built. Any changes -# made to this file will be lost the next time perl is built. - -package Config; -use strict; -use warnings; -our %%Config; - -sub bincompat_options { - return split ' ', (Internals::V())[0]; -} - -sub non_bincompat_options { - return split ' ', (Internals::V())[1]; -} - -sub compile_date { - return (Internals::V())[2] -} - -sub local_patches { - my (undef, undef, undef, @patches) = Internals::V(); - return @patches; -} - -sub _V { - die "Perl lib was built for '%s' but is being run on '$^O'" - unless "%s" eq $^O; - - my ($bincompat, $non_bincompat, $date, @patches) = Internals::V(); - - my @opts = sort split ' ', "$bincompat $non_bincompat"; - - print Config::myconfig(); - print "\nCharacteristics of this %s: \n"; - - print " Compile-time options:\n"; - print " $_\n" for @opts; - - if (@patches) { - print " Locally applied patches:\n"; - print " $_\n" foreach @patches; - } - - print " Built under %s\n"; - - print " $date\n" if defined $date; - - my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %%ENV; -%s - if (@env) { - print " \%%ENV:\n"; - print " $_\n" foreach @env; - } - print " \@INC:\n"; - print " $_\n" foreach @INC; -} - -sub header_files { +$heavy_txt .= sprintf uncomment <<'ENDOFBEG', $osname, $osname, $from, $osname, $env_cygwin; +# # This file was created by configpm when Perl was built. Any changes +# # made to this file will be lost the next time perl is built. +# +# package Config; +# use strict; +# use warnings; +# our %%Config; +# +# sub bincompat_options { +# return split ' ', (Internals::V())[0]; +# } +# +# sub non_bincompat_options { +# return split ' ', (Internals::V())[1]; +# } +# +# sub compile_date { +# return (Internals::V())[2] +# } +# +# sub local_patches { +# my (undef, undef, undef, @patches) = Internals::V(); +# return @patches; +# } +# +# sub _V { +# die "Perl lib was built for '%s' but is being run on '$^O'" +# unless "%s" eq $^O; +# +# my ($bincompat, $non_bincompat, $date, @patches) = Internals::V(); +# +# my @opts = sort split ' ', "$bincompat $non_bincompat"; +# +# print Config::myconfig(); +# print "\nCharacteristics of this %s: \n"; +# +# print " Compile-time options:\n"; +# print " $_\n" for @opts; +# +# if (@patches) { +# print " Locally applied patches:\n"; +# print " $_\n" foreach @patches; +# } +# +# print " Built under %s\n"; +# +# print " $date\n" if defined $date; +# +# my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %%ENV; +# %s +# if (@env) { +# print " \%%ENV:\n"; +# print " $_\n" foreach @env; +# } +# print " \@INC:\n"; +# print " $_\n" foreach @INC; +# } +# +# sub header_files { ENDOFBEG $heavy_txt .= $header_files . "\n}\n\n"; @@ -548,33 +553,35 @@ open(MYCONFIG,'<','myconfig.SH') || die do { $heavy_txt .= $_ } until !defined($_ = ) || /^\s*$/; close(MYCONFIG); -$heavy_txt .= "\n!END!\n" . <<'EOT'; -my $summary_expanded; - -sub myconfig { - return $summary_expanded if $summary_expanded; - ($summary_expanded = $summary) =~ s{\$(\w+)} - { - my $c; - if ($1 eq 'git_ancestor_line') { - if ($Config::Config{git_ancestor}) { - $c= "\n Ancestor: $Config::Config{git_ancestor}"; - } else { - $c= ""; - } - } else { - $c = $Config::Config{$1}; - } - defined($c) ? $c : 'undef' - }ge; - $summary_expanded; -} - -local *_ = \my $a; -$_ = <<'!END!'; +$heavy_txt .= "\n!END!\n" . uncomment <<'EOT'; +# my $summary_expanded; +# +# sub myconfig { +# return $summary_expanded if $summary_expanded; +# ($summary_expanded = $summary) =~ s{\$(\w+)} +# { +# my $c; +# if ($1 eq 'git_ancestor_line') { +# if ($Config::Config{git_ancestor}) { +# $c= "\n Ancestor: $Config::Config{git_ancestor}"; +# } else { +# $c= ""; +# } +# } else { +# $c = $Config::Config{$1}; +# } +# defined($c) ? $c : 'undef' +# }ge; +# $summary_expanded; +# } +# +# local *_ = \my $a; +# $_ = <<'!END!'; EOT #proper lexicographical order of the keys my %seen_var; +my @v_define = ( "taint_support=''\n", + "taint_disabled=''\n" ); $heavy_txt .= join('', map { $_->[-1] } sort {$a->[0] cmp $b->[0] } @@ -582,7 +589,7 @@ $heavy_txt .= join('', map { /^([^=]+)/ ? [ $1, $_ ] : [ $_, $_ ] # shouldnt happen - } @v_others, @v_forced + } (@v_others, @v_forced, @v_define) ) . "!END!\n"; # Only need the dynamic byteorder code in Config.pm if 'byteorder' is one of @@ -593,29 +600,53 @@ if ($Common{byteorder}) { $heavy_txt .= $byteorder_code; } +$heavy_txt .= uncomment <<'EOT'; +# s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m; +# +EOT + +$heavy_txt .= uncomment <<'EOF_TAINT_INIT'; +# { +# # We have to set this up late as Win32 does not build miniperl +# # with the same defines and CC flags as it builds perl itself. +# my $defines = join " ", (Internals::V)[0,1]; +# if ( +# $defines =~ /\b(SILENT_NO_TAINT_SUPPORT)\b/ || +# $defines =~ /\b(NO_TAINT_SUPPORT)\b/ +# ){ +# my $which = $1; +# my $taint_disabled = ($which eq "SILENT_NO_TAINT_SUPPORT") +# ? "silent" : "define"; +# s/^(taint_disabled=['"])(["'])/$1$taint_disabled$2/m; +# } +# else { +# my $taint_support = 'define'; +# s/^(taint_support=['"])(["'])/$1$taint_support$2/m; +# } +# } +EOF_TAINT_INIT + if (@need_relocation) { $heavy_txt .= 'foreach my $what (qw(' . join (' ', @need_relocation) . - ")) {\n" . <<'EOT'; - s/^($what=)(['"])(.*?)\2/$1 . $2 . relocate_inc($3) . $2/me; -} + ")) {\n" . uncomment <<'EOT'; +# s/^($what=)(['"])(.*?)\2/$1 . $2 . relocate_inc($3) . $2/me; +# } EOT # Currently it only makes sense to do the ... relocation on Unix, so there's # no need to emulate the "which separator for this platform" logic in perl.c - # ':' will always be applicable if ($need_relocation{otherlibdirs}) { -$heavy_txt .= << 'EOT'; -s{^(otherlibdirs=)(['"])(.*?)\2} - {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me; +$heavy_txt .= uncomment << 'EOT'; +# s{^(otherlibdirs=)(['"])(.*?)\2} +# {$1 . $2 . join ':', map {relocate_inc($_)} split ':', $3 . $2}me; EOT } } -$heavy_txt .= <<'EOT'; -s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m; - -my $config_sh_len = length $_; - -our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL'; +$heavy_txt .= uncomment <<'EOT'; +# my $config_sh_len = length $_; +# +# our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL'; EOT foreach my $prefix (qw(ccflags ldflags)) { @@ -670,129 +701,129 @@ if (open(my $fh, '<', 'cflags')) { $heavy_txt .= "EOVIRTUAL\n"; -$heavy_txt .= <<'ENDOFGIT'; -eval { - # do not have hairy conniptions if this isnt available - require 'Config_git.pl'; - $Config_SH_expanded .= $Config::Git_Data; - 1; -} or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n"; +$heavy_txt .= uncomment <<'ENDOFGIT'; +# eval { +# # do not have hairy conniptions if this isnt available +# require 'Config_git.pl'; +# $Config_SH_expanded .= $Config::Git_Data; +# 1; +# } or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n"; ENDOFGIT $heavy_txt .= $fetch_string; -$config_txt .= <<'ENDOFEND'; - -sub FETCH { - my($self, $key) = @_; - - # check for cached value (which may be undef so we use exists not defined) - return exists $self->{$key} ? $self->{$key} : $self->fetch_string($key); -} - +$config_txt .= uncomment <<'ENDOFEND'; +# +# sub FETCH { +# my($self, $key) = @_; +# +# # check for cached value (which may be undef so we use exists not defined) +# return exists $self->{$key} ? $self->{$key} : $self->fetch_string($key); +# } +# ENDOFEND -$heavy_txt .= <<'ENDOFEND'; - -my $prevpos = 0; - -sub FIRSTKEY { - $prevpos = 0; - substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 ); -} - -sub NEXTKEY { +$heavy_txt .= uncomment <<'ENDOFEND'; +# +# my $prevpos = 0; +# +# sub FIRSTKEY { +# $prevpos = 0; +# substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 ); +# } +# +# sub NEXTKEY { ENDOFEND if ($seen_quotes{'"'}) { -$heavy_txt .= <<'ENDOFEND'; - # Find out how the current key's quoted so we can skip to its end. - my $quote = substr($Config_SH_expanded, - index($Config_SH_expanded, "=", $prevpos)+1, 1); - my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2; +$heavy_txt .= uncomment <<'ENDOFEND'; +# # Find out how the current key's quoted so we can skip to its end. +# my $quote = substr($Config_SH_expanded, +# index($Config_SH_expanded, "=", $prevpos)+1, 1); +# my $pos = index($Config_SH_expanded, qq($quote\n), $prevpos) + 2; ENDOFEND } else { # Just ' quotes, so it's much easier. -$heavy_txt .= <<'ENDOFEND'; - my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2; +$heavy_txt .= uncomment <<'ENDOFEND'; +# my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2; ENDOFEND } -$heavy_txt .= <<'ENDOFEND'; - my $len = index($Config_SH_expanded, "=", $pos) - $pos; - $prevpos = $pos; - $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef; -} - -sub EXISTS { - return 1 if exists($_[0]->{$_[1]}); - - return(index($Config_SH_expanded, "\n$_[1]='") != -1 +$heavy_txt .= uncomment <<'ENDOFEND'; +# my $len = index($Config_SH_expanded, "=", $pos) - $pos; +# $prevpos = $pos; +# $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef; +# } +# +# sub EXISTS { +# return 1 if exists($_[0]->{$_[1]}); +# +# return(index($Config_SH_expanded, "\n$_[1]='") != -1 ENDOFEND if ($seen_quotes{'"'}) { -$heavy_txt .= <<'ENDOFEND'; - or index($Config_SH_expanded, "\n$_[1]=\"") != -1 +$heavy_txt .= uncomment <<'ENDOFEND'; +# or index($Config_SH_expanded, "\n$_[1]=\"") != -1 ENDOFEND } -$heavy_txt .= <<'ENDOFEND'; - ); -} - -sub STORE { die "\%Config::Config is read-only\n" } -*DELETE = *CLEAR = \*STORE; # Typeglob aliasing uses less space - -sub config_sh { - substr $Config_SH_expanded, 1, $config_sh_len; -} - -sub config_re { - my $re = shift; - return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/, - $Config_SH_expanded; -} - -sub config_vars { - # implements -V:cfgvar option (see perlrun -V:) - foreach (@_) { - # find optional leading, trailing colons; and query-spec - my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/; # flags fore and aft, - # map colon-flags to print decorations - my $prfx = $notag ? '': "$qry="; # tag-prefix for print - my $lnend = $lncont ? ' ' : ";\n"; # line ending for print - - # all config-vars are by definition \w only, any \W means regex - if ($qry =~ /\W/) { - my @matches = config_re($qry); - print map "$_$lnend", @matches ? @matches : "$qry: not found" if !$notag; - print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found" if $notag; - } else { - my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry} - : 'UNKNOWN'; - $v = 'undef' unless defined $v; - print "${prfx}'${v}'$lnend"; - } - } -} - -# Called by the real AUTOLOAD -sub launcher { - undef &AUTOLOAD; - goto \&$Config::AUTOLOAD; -} - -1; +$heavy_txt .= uncomment <<'ENDOFEND'; +# ); +# } +# +# sub STORE { die "\%Config::Config is read-only\n" } +# *DELETE = *CLEAR = \*STORE; # Typeglob aliasing uses less space +# +# sub config_sh { +# substr $Config_SH_expanded, 1, $config_sh_len; +# } +# +# sub config_re { +# my $re = shift; +# return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/, +# $Config_SH_expanded; +# } +# +# sub config_vars { +# # implements -V:cfgvar option (see perlrun -V:) +# foreach (@_) { +# # find optional leading, trailing colons; and query-spec +# my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/; # flags fore and aft, +# # map colon-flags to print decorations +# my $prfx = $notag ? '': "$qry="; # tag-prefix for print +# my $lnend = $lncont ? ' ' : ";\n"; # line ending for print +# +# # all config-vars are by definition \w only, any \W means regex +# if ($qry =~ /\W/) { +# my @matches = config_re($qry); +# print map "$_$lnend", @matches ? @matches : "$qry: not found" if !$notag; +# print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found" if $notag; +# } else { +# my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry} +# : 'UNKNOWN'; +# $v = 'undef' unless defined $v; +# print "${prfx}'${v}'$lnend"; +# } +# } +# } +# +# # Called by the real AUTOLOAD +# sub launcher { +# undef &AUTOLOAD; +# goto \&$Config::AUTOLOAD; +# } +# +# 1; ENDOFEND if ($^O eq 'os2') { - $config_txt .= <<'ENDOFSET'; -my %preconfig; -if ($OS2::is_aout) { - my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m; - for (split ' ', $value) { - ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m; - $preconfig{$_} = $v eq 'undef' ? undef : $v; - } -} -$preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't -sub TIEHASH { bless {%preconfig} } + $config_txt .= uncomment <<'ENDOFSET'; +# my %preconfig; +# if ($OS2::is_aout) { +# my ($value, $v) = $Config_SH_expanded =~ m/^used_aout='(.*)'\s*$/m; +# for (split ' ', $value) { +# ($v) = $Config_SH_expanded =~ m/^aout_$_='(.*)'\s*$/m; +# $preconfig{$_} = $v eq 'undef' ? undef : $v; +# } +# } +# $preconfig{d_fork} = undef unless $OS2::can_fork; # Some funny cases can't +# sub TIEHASH { bless {%preconfig} } ENDOFSET # Extract the name of the DLL from the makefile to avoid duplication my ($f) = grep -r, qw(GNUMakefile Makefile); @@ -802,14 +833,14 @@ ENDOFSET $dll = $1, last if /^PERL_DLL_BASE\s*=\s*(\S*)\s*$/; } } - $config_txt .= <:raw', $Config_POD) or die "Can't open $Config_POD: $!"; -print CONFIG_POD <<'ENDOFTAIL'; -=head1 NAME - -=for comment Generated by configpm. Any changes made here will be lost! - -Config - access Perl configuration information - -=head1 SYNOPSIS - - use Config; - if ($Config{usethreads}) { - print "has thread support\n" - } - - use Config qw(myconfig config_sh config_vars config_re); - - print myconfig(); - - print config_sh(); - - print config_re(); - - config_vars(qw(osname archname)); - - -=head1 DESCRIPTION - -The Config module contains all the information that was available to -the C program at Perl build time (over 900 values). - -Shell variables from the F file (written by Configure) are -stored in the readonly-variable C<%Config>, indexed by their names. - -Values stored in config.sh as 'undef' are returned as undefined -values. The perl C function can be used to check if a -named variable exists. - -For a description of the variables, please have a look at the -Glossary file, as written in the Porting folder, or use the url: -https://github.com/Perl/perl5/blob/blead/Porting/Glossary - -=over 4 - -=item myconfig() - -Returns a textual summary of the major perl configuration values. -See also C<-V> in L. - -=item config_sh() - -Returns the entire perl configuration information in the form of the -original config.sh shell variable assignment script. - -=item config_re($regex) - -Like config_sh() but returns, as a list, only the config entries who's -names match the $regex. - -=item config_vars(@names) - -Prints to STDOUT the values of the named configuration variable. Each is -printed on a separate line in the form: - - name='value'; - -Names which are unknown are output as C. -See also C<-V:name> in L. - -=item bincompat_options() - -Returns a list of C pre-processor options used when compiling this F -binary, which affect its binary compatibility with extensions. -C and C are shown together in -the output of C as I. - -=item non_bincompat_options() - -Returns a list of C pre-processor options used when compiling this F -binary, which do not affect binary compatibility with extensions. - -=item compile_date() - -Returns the compile date (as a string), equivalent to what is shown by -C - -=item local_patches() - -Returns a list of the names of locally applied patches, equivalent to what -is shown by C. - -=item header_files() - -Returns a list of the header files that should be used as dependencies for -XS code, for this version of Perl on this platform. - -=back - -=head1 EXAMPLE - -Here's a more sophisticated example of using %Config: - - use Config; - use strict; - - my %sig_num; - my @sig_name; - unless($Config{sig_name} && $Config{sig_num}) { - die "No sigs?"; - } else { - my @names = split ' ', $Config{sig_name}; - @sig_num{@names} = split ' ', $Config{sig_num}; - foreach (@names) { - $sig_name[$sig_num{$_}] ||= $_; - } - } - - print "signal #17 = $sig_name[17]\n"; - if ($sig_num{ALRM}) { - print "SIGALRM is $sig_num{ALRM}\n"; - } - -=head1 WARNING - -Because this information is not stored within the perl executable -itself it is possible (but unlikely) that the information does not -relate to the actual perl binary which is being used to access it. - -The Config module is installed into the architecture and version -specific library directory ($Config{installarchlib}) and it checks the -perl version number when loaded. - -The values stored in config.sh may be either single-quoted or -double-quoted. Double-quoted strings are handy for those cases where you -need to include escape sequences in the strings. To avoid runtime variable -interpolation, any C<$> and C<@> characters are replaced by C<\$> and -C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$> -or C<\@> in double-quoted strings unless you're willing to deal with the -consequences. (The slashes will end up escaped and the C<$> or C<@> will -trigger variable interpolation) - -=head1 GLOSSARY - -Most C variables are determined by the C script -on platforms supported by it (which is most UNIX platforms). Some -platforms have custom-made C variables, and may thus not have -some of the variables described below, or may have extraneous variables -specific to that particular port. See the port specific documentation -in such cases. - -=cut - +print CONFIG_POD uncomment <<'ENDOFTAIL'; +# =head1 NAME +# +# =for comment Generated by configpm. Any changes made here will be lost! +# +# Config - access Perl configuration information +# +# =head1 SYNOPSIS +# +# use Config; +# if ($Config{usethreads}) { +# print "has thread support\n" +# } +# +# use Config qw(myconfig config_sh config_vars config_re); +# +# print myconfig(); +# +# print config_sh(); +# +# print config_re(); +# +# config_vars(qw(osname archname)); +# +# +# =head1 DESCRIPTION +# +# The Config module contains all the information that was available to +# the F program at Perl build time (over 900 values). +# +# Shell variables from the F file (written by Configure) are +# stored in the readonly-variable C<%Config>, indexed by their names. +# +# Values stored in config.sh as 'undef' are returned as undefined +# values. The perl C function can be used to check if a +# named variable exists. +# +# For a description of the variables, please have a look at the +# Glossary file, as written in the Porting folder, or use the url: +# https://github.com/Perl/perl5/blob/blead/Porting/Glossary +# +# =over 4 +# +# =item myconfig() +# +# Returns a textual summary of the major perl configuration values. +# See also C<-V> in L. +# +# =item config_sh() +# +# Returns the entire perl configuration information in the form of the +# original config.sh shell variable assignment script. +# +# =item config_re($regex) +# +# Like config_sh() but returns, as a list, only the config entries who's +# names match the $regex. +# +# =item config_vars(@names) +# +# Prints to STDOUT the values of the named configuration variable. Each is +# printed on a separate line in the form: +# +# name='value'; +# +# Names which are unknown are output as C. +# See also C<-V:name> in L. +# +# =item bincompat_options() +# +# Returns a list of C pre-processor options used when compiling this F +# binary, which affect its binary compatibility with extensions. +# C and C are shown together in +# the output of C as I. +# +# =item non_bincompat_options() +# +# Returns a list of C pre-processor options used when compiling this F +# binary, which do not affect binary compatibility with extensions. +# +# =item compile_date() +# +# Returns the compile date (as a string), equivalent to what is shown by +# C +# +# =item local_patches() +# +# Returns a list of the names of locally applied patches, equivalent to what +# is shown by C. +# +# =item header_files() +# +# Returns a list of the header files that should be used as dependencies for +# XS code, for this version of Perl on this platform. +# +# =back +# +# =head1 EXAMPLE +# +# Here's a more sophisticated example of using %Config: +# +# use Config; +# use strict; +# +# my %sig_num; +# my @sig_name; +# unless($Config{sig_name} && $Config{sig_num}) { +# die "No sigs?"; +# } else { +# my @names = split ' ', $Config{sig_name}; +# @sig_num{@names} = split ' ', $Config{sig_num}; +# foreach (@names) { +# $sig_name[$sig_num{$_}] ||= $_; +# } +# } +# +# print "signal #17 = $sig_name[17]\n"; +# if ($sig_num{ALRM}) { +# print "SIGALRM is $sig_num{ALRM}\n"; +# } +# +# =head1 WARNING +# +# Because this information is not stored within the perl executable +# itself it is possible (but unlikely) that the information does not +# relate to the actual perl binary which is being used to access it. +# +# The Config module is installed into the architecture and version +# specific library directory ($Config{installarchlib}) and it checks the +# perl version number when loaded. +# +# The values stored in config.sh may be either single-quoted or +# double-quoted. Double-quoted strings are handy for those cases where you +# need to include escape sequences in the strings. To avoid runtime variable +# interpolation, any C<$> and C<@> characters are replaced by C<\$> and +# C<\@>, respectively. This isn't foolproof, of course, so don't embed C<\$> +# or C<\@> in double-quoted strings unless you're willing to deal with the +# consequences. (The slashes will end up escaped and the C<$> or C<@> will +# trigger variable interpolation) +# +# =head1 GLOSSARY +# +# Most C variables are determined by the C script +# on platforms supported by it (which is most UNIX platforms). Some +# platforms have custom-made C variables, and may thus not have +# some of the variables described below, or may have extraneous variables +# specific to that particular port. See the port specific documentation +# in such cases. +# +# =cut +# ENDOFTAIL if ($Opts{glossary}) { open(GLOS, '<', $Glossary) or die "Can't open $Glossary: $!"; } -my %seen = (); my $text = 0; $/ = ''; my $errors= 0; -sub process { - if (s/\A(\w*)\s+\(([\w.]+)\):\s*\n(\t?)/=item C<$1>\n\nFrom F<$2>:\n\n/m) { - my $c = substr $1, 0, 1; - unless ($seen{$c}++) { - print CONFIG_POD <\n\nFrom F<$2>:\n\n/m) { + $item = $1; + $fc = substr $item, 0, 1; } - elsif (!$text || !/\A\t/) { + elsif (!$item || !/\A\t/) { warn "Expected a Configure variable header", ($text ? " or another paragraph of description" : () ), ", instead we got:\n$_"; @@ -1067,6 +1090,7 @@ EOF s/(?/g; # UNISTD s/(? macro/g; # FILE_cnt macro s/n[\0]t/n't/g; # undo can't, won't damage + $glossary{$fc}{$item} .= $_; } if ($Opts{glossary}) { @@ -1074,7 +1098,6 @@ if ($Opts{glossary}) { ; # Skip the preamble while () { process; - print CONFIG_POD; } if ($errors) { die "Errors encountered while processing $Glossary. ", @@ -1085,33 +1108,67 @@ if ($Opts{glossary}) { } } -print CONFIG_POD <<'ENDOFTAIL'; - -=back - -=head1 GIT DATA - -Information on the git commit from which the current perl binary was compiled -can be found in the variable C<$Config::Git_Data>. The variable is a -structured string that looks something like this: - - git_commit_id='ea0c2dbd5f5ac6845ecc7ec6696415bf8e27bd52' - git_describe='GitLive-blead-1076-gea0c2db' - git_branch='smartmatch' - git_uncommitted_changes='' - git_commit_id_title='Commit id:' - git_commit_date='2009-05-09 17:47:31 +0200' - -Its format is not guaranteed not to change over time. - -=head1 NOTE +$glossary{t}{taint_support} //= uncomment < +# +# From define: C or C +# +# If this perl is compiled with support for taint mode this variable will +# be set to 'define', if it is not it will be set to the empty string. +# Either of the above defines will result in it being empty. This property +# was added in version 5.37.11. See also L. +# +EOF_TEXT -This module contains a good example of how to use tie to implement a -cache and an example of how to make a tied variable readonly to those -outside of it. +$glossary{t}{taint_disabled} //= uncomment < +# +# From define: C or C +# +# If this perl is compiled with support for taint mode this variable will +# be set to the empty string, if it was compiled with +# C defined then it will be set to be "silent", +# and if it was compiled with C defined it will be +# 'define'. Either of the above defines will results in it being a true +# value. This property was added in 5.37.11. See also L. +# +EOF_TEXT -=cut +if ($Opts{glossary}) { + foreach my $fc (sort keys %glossary) { + print CONFIG_POD "=head2 $fc\n\n=over 4\n\n"; + foreach my $item (sort keys %{$glossary{$fc}}) { + print CONFIG_POD $glossary{$fc}{$item}; + } + print CONFIG_POD "=back\n\n"; + } +} +print CONFIG_POD uncomment <<'ENDOFTAIL'; +# +# =head1 GIT DATA +# +# Information on the git commit from which the current perl binary was compiled +# can be found in the variable C<$Config::Git_Data>. The variable is a +# structured string that looks something like this: +# +# git_commit_id='ea0c2dbd5f5ac6845ecc7ec6696415bf8e27bd52' +# git_describe='GitLive-blead-1076-gea0c2db' +# git_branch='smartmatch' +# git_uncommitted_changes='' +# git_commit_id_title='Commit id:' +# git_commit_date='2009-05-09 17:47:31 +0200' +# +# Its format is not guaranteed not to change over time. +# +# =head1 NOTE +# +# This module contains a good example of how to use tie to implement a +# cache and an example of how to make a tied variable readonly to those +# outside of it. +# +# =cut +# ENDOFTAIL close(GLOS) if $Opts{glossary}; Index: gnu/usr.bin/perl/configure.com =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/configure.com,v diff -u -p -a -u -p -r1.11 configure.com --- gnu/usr.bin/perl/configure.com 8 Jul 2023 14:18:35 -0000 1.11 +++ gnu/usr.bin/perl/configure.com 21 Feb 2024 15:47:00 -0000 @@ -36,7 +36,6 @@ $! VMS-isms we will need: $ echo = "write sys$output " $ cat = "type" $ delete := delete ! local symbol overrides globals with qualifiers -$ gcc_symbol = "gcc" $ ld = "Link/nodebug" $ ans = "" $ macros = "" @@ -1288,7 +1287,6 @@ $! $ version = revision + "_" + patchlevel + "_" + subversion $! $!: see if we need a special compiler -$! cc_list = "cc/decc|gcc" !%Config-I-VMS, compiler symbols/commands $! $ nocc = "f" $ vms_cc_dflt = "" @@ -1302,8 +1300,6 @@ $ WRITE CONFIG "#include " $ WRITE CONFIG "int main() {" $ WRITE CONFIG "#ifdef __DECC" $ WRITE CONFIG " printf(""/DECC\n"");" -$ WRITE CONFIG "#else" -$ WRITE CONFIG " printf(""/VAXC\n"");" $ WRITE CONFIG "#endif" $ WRITE CONFIG " exit(0);" $ WRITE CONFIG "}" @@ -1318,11 +1314,7 @@ $ SET ON $ IF (silent) THEN GOSUB Shut_up $ IF tmp.NE.%X10B90001 $ THEN -$ IF tmp.NE.%X10000001 -$ THEN -$ nocc = "t" !%X10000001 is return from gcc -$ GOTO Gcc_initial_check -$ ENDIF +$ GOTO Cxx_initial_check $ ENDIF $! $ GOSUB List_Parse @@ -1336,33 +1328,6 @@ $ vms_cc_dflt = "/decc" $ vms_cc_available = vms_cc_available + "cc/decc " $ ENDIF $! -$Gcc_initial_check: -$ echo "Checking for gcc" -$ OPEN/WRITE CONFIG gccvers.lis -$ SET NOON -$ DEFINE/USER_MODE SYS$ERROR CONFIG -$ DEFINE/USER_MODE SYS$OUTPUT CONFIG -$ 'gcc_symbol'/noobj/version _nla0: -$ tmp = $status -$ SET ON -$ IF (silent) THEN GOSUB Shut_up -$ CLOSE CONFIG -$ IF (tmp.NE.%X10000001).and.(tmp.ne.%X00030001) -$ THEN -$ echo "Symbol ""''gcc_symbol'"" is not defined. I guess you do not have it." -$ DELETE/NOLOG/NOCONFIRM gccvers.lis; -$ GOTO Cxx_initial_check -$ ENDIF -$ OPEN/READ CONFIG gccvers.lis -$GCC_List_Read: -$ READ/END_OF_FILE=GCC_List_End CONFIG line -$ GOTO GCC_List_Read -$GCC_List_End: -$ CLOSE CONFIG -$ echo line -$ vms_cc_available = vms_cc_available + "''gcc_symbol' " -$ DELETE/NOLOG/NOCONFIRM gccvers.lis; -$! $Cxx_initial_check: $! $! In order to build with the HP C++ compiler, invoke configure.com with "-Dusecxx" on @@ -1456,8 +1421,6 @@ $ dflt = "cxx" $ ELSE $ dflt = "cc''vms_cc_dflt'" !-> "cc" in case first compile went OK $ ENDIF -$ ELSE -$ dflt = gcc_symbol $ ENDIF $ rp = "Use which C compiler? [''dflt'] " $ GOSUB myread @@ -1506,11 +1469,6 @@ $ THEN $ ccname := DEC $ C_COMPILER_Replace = "CC=cc=''Mcc'" $ ENDIF -$ IF Mcc .EQS. "gcc" -$ THEN -$ ccname := GCC -$ C_COMPILER_Replace = "CC=cc=''Mcc'" -$ ENDIF $ ENDIF $Decc_Version_check: $ ccversion="" @@ -1562,121 +1520,7 @@ $ echo4 "adding /NOANSI_ALIAS qualifie $ ccflags = ccflags + "/NOANSI_ALIAS" $ DELETE/NOLOG/NOCONFIRM deccvers.*; $ ENDIF -$Gcc_check: -$ gccversion = "" -$ IF ccname .EQS. "GCC" -$ THEN -$ vaxcrtl_olb = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB") -$ vaxcrtl_exe = F$SEARCH("SYS$SHARE:VAXCRTL.EXE") -$ gcclib_olb = F$SEARCH("GNU_CC:[000000]GCCLIB.OLB") -$ IF gcclib_olb .EQS. "" -$ THEN -$! These objects/libs come w/ gcc 2.7.2 for AXP: -$ tmp = F$SEARCH("GNU_CC:[000000]libgcc2.olb") -$ IF tmp .NES. "" then gcclib_olb = tmp -$ tmp = F$SEARCH("GNU_CC:[000000]libgcclib.olb") -$ IF tmp .NES. "" -$ THEN -$ IF gcclib_olb .EQS. "" -$ THEN gcclib_olb = tmp -$ ELSE gcclib_olb = gcclib_olb + "/lib," + tmp -$ ENDIF -$ ENDIF -$ tmp = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB") -$ IF tmp .NES. "" -$ THEN -$ IF gcclib_olb .EQS. "" -$ THEN gcclib_olb = tmp -$ ELSE gcclib_olb = gcclib_olb + "/lib," + tmp -$ ENDIF -$ ENDIF -$ tmp = F$SEARCH("GNU_CC:[000000]crt0.obj") -$ IF tmp .NES. "" -$ THEN -$ IF gcclib_olb .EQS. "" -$ THEN gcclib_olb = tmp -$ ELSE gcclib_olb = gcclib_olb + "/lib," + tmp -$ ENDIF -$ ENDIF -$ IF gcclib_olb .EQS. vaxcrtl_olb THEN gcclib_olb = "" !goofy order of axplibs -$ ELSE -$ gcclib_olb = gcclib_olb + "/lib" -$ ENDIF -$ IF gcclib_olb .NES. "" .AND. - - (vaxcrtl_olb .NES. "" .OR. - - vaxcrtl_exe .NES. "" ) -$ THEN -$ echo "" -$ echo4 "Checking for GNU cc in disguise and/or its version number..." !>&4 -$ OPEN/WRITE CONFIG gccvers.c -$ WRITE CONFIG "#include " -$ WRITE CONFIG "int main() {" -$ WRITE CONFIG "#ifdef __GNUC__" -$ WRITE CONFIG "#ifdef __VERSION__" -$ WRITE CONFIG " printf(""%s\n"", __VERSION__);" -$ WRITE CONFIG "#else" -$ WRITE CONFIG " printf(""%s\n"", ""1"");" -$ WRITE CONFIG "#endif" -$ WRITE CONFIG "#endif" -$ WRITE CONFIG " exit(0);" -$ WRITE CONFIG "}" -$ CLOSE CONFIG -$ DEFINE SYS$ERROR _NLA0: -$ DEFINE SYS$OUTPUT _NLA0: -$ 'Mcc' gccvers.c -$ tmp = $status -$ DEASSIGN SYS$ERROR _NLA0: -$ DEASSIGN SYS$OUTPUT _NLA0: -$ IF (silent) THEN GOSUB Shut_up -$ DEFINE SYS$ERROR _NLA0: -$ DEFINE SYS$OUTPUT _NLA0: -$ IF vaxcrtl_exe .EQS. "" -$ THEN -$ IF F$LOCATE("VAXCRTL",gcclib_olb).NE.F$LENGTH(gcclib_olb) -$ THEN -$ link/nodebug gccvers.obj,'gcclib_olb',SYS$LIBRARY:VAXCRTL/Library -$ tmp = $status -$ ELSE -$ link/nodebug gccvers.obj,'gcclib_olb' -$ tmp = $status -$ ENDIF -$ ELSE -$ OPEN/WRITE CONFIG GCCVERS.OPT -$ WRITE CONFIG "SYS$SHARE:VAXCRTL/SHARE" -$ CLOSE CONFIG -$ link/nodebug gccvers.obj,GCCVERS.OPT/OPT,'gcclib_olb' -$ tmp = $status -$ ENDIF -$ DEASSIGN SYS$ERROR -$ DEASSIGN SYS$OUTPUT -$ IF (silent) THEN GOSUB Shut_up -$ OPEN/WRITE CONFIG gccvers.out -$ DEFINE SYS$ERROR CONFIG -$ DEFINE SYS$OUTPUT CONFIG -$ mcr []gccvers.exe -$ tmp = $status -$ CLOSE CONFIG -$ DEASSIGN SYS$OUTPUT -$ DEASSIGN SYS$ERROR -$ IF (silent) THEN GOSUB Shut_up -$ OPEN/READ CONFIG gccvers.out -$ READ/END_OF_FILE=Gcc_cleanup CONFIG line -$Gcc_cleanup: -$ CLOSE CONFIG -$ DELETE/NOLOG/NOCONFIRM gccvers.*; -$ IF F$LOCATE("GNU C version ",line).NE.F$LENGTH(line) -$ THEN -$ echo "You are not using GNU cc." -$ GOTO Host_name -$ ELSE -$ echo "You are using GNU cc ''line'" -$ gccversion = line -$ ccname := "GCC" -$ C_COMPILER_Replace = "CC=cc=''Mcc'" -$ GOTO Include_dirs -$ ENDIF -$ ENDIF -$ ENDIF +$! $Cxx_Version_check: $ IF ccname .EQS. "CXX" $ THEN @@ -1769,17 +1613,6 @@ $ line = F$EDIT(line,"TRIM") !bit $ DELETE/NOLOG/NOCONFIRM ccvms.lis; $ RETURN $! -$Include_dirs: -$!: What should the include directory be ? (.TLB text libraries) -$ dflt = gcclib_olb -$ rp = "Where are the include files you want to use? " -$ IF f$length( rp + "[''dflt'] " ) .GT. 76 -$ THEN rp = F$FAO("!AS!/!AS",rp,"[''dflt'] ") -$ ELSE rp = rp + "[''dflt'] " -$ ENDIF -$ GOSUB myread -$ usrinc = ans -$! $!: see if we have to deal with yellow pages, now NIS. $!: now get the host name $Host_name: @@ -2369,22 +2202,6 @@ $! $ bool_dflt = "n" $ vms_prefix = "perl_root" $ vms_prefixup = F$EDIT(vms_prefix,"UPCASE") -$ rp = "Will you be sharing your ''vms_prefixup' with ''otherarch'? [''bool_dflt'] " -$ GOSUB myread -$ IF .NOT. ans -$ THEN -$ sharedperl = "N" -$ ELSE -$ sharedperl = "Y" -$ IF (F$ELEMENT(0, "-", archname).EQS."VMS_AXP") -$ THEN -$ macros = macros + """AXE=1""," -$ ENDIF -$ IF (F$ELEMENT(0, "-", archname).EQS."VMS_IA64") -$ THEN -$ macros = macros + """IXE=1""," -$ ENDIF -$ ENDIF $! $!: is AFS running? !sfn $!: decide how portable to be. Allow command line overrides. !sfn @@ -3239,34 +3056,22 @@ $ ELSE $ uselargefiles = "undef" $ ENDIF $! +$ i32dformat="""d""" +$ u32uformat="""u""" +$ u32oformat="""o""" +$ u32xformat="""x""" +$ u32XUformat="""X""" +$! $ usemymalloc = "undef" $ if mymalloc then usemymalloc = "define" $! $ perl_cc=Mcc $! -$ IF (sharedperl .AND. F$ELEMENT(0, "-", archname) .EQS. "VMS_AXP") -$ THEN -$ obj_ext=".abj" -$ so="axe" -$ dlext="axe" -$ exe_ext=".axe" -$ lib_ext=".alb" -$ ELSE -$ IF (sharedperl .AND. F$ELEMENT(0, "-", archname) .EQS. "VMS_IA64") -$ THEN -$ obj_ext=".ibj" -$ so="ixe" -$ dlext="ixe" -$ exe_ext=".ixe" -$ lib_ext=".ilb" -$ ELSE -$ obj_ext=".obj" -$ so="exe" -$ dlext="exe" -$ exe_ext=".exe" -$ lib_ext=".olb" -$ ENDIF -$ ENDIF +$ obj_ext=".obj" +$ so="exe" +$ dlext="exe" +$ exe_ext=".exe" +$ lib_ext=".olb" $ dlobj="dl_vms''obj_ext'" $! $ cppstdin="''perl_cc'/noobj/comments=as_is/preprocess=sys$output sys$input" @@ -3434,24 +3239,13 @@ $ ENDIF $! $! Some that we need to invoke the compiler for $! -$! $! handy construction aliases/symbols $! $ OS := "open/write CONFIG []try.c" $ WS := "write CONFIG" $ CS := "close CONFIG" $ DS := "delete/nolog/noconfirm []try.*;*" -$ Needs_Opt := N $ good_compile = %X10B90001 -$ IF ccname .EQS. "GCC" -$ THEN -$ open/write OPTCHAN []try.opt -$ write OPTCHAN "Gnu_CC:[000000]gcclib.olb/library" -$ write OPTCHAN "Sys$Share:VAXCRTL/Share" -$ Close OPTCHAN -$ Needs_Opt := Y -$ good_compile = %X10000001 -$ ENDIF $ IF ccname .EQS. "CXX" $ THEN $ good_compile = %X15F60001 @@ -3550,14 +3344,8 @@ $ GOSUB compile_ok $ DEFINE/USER_MODE SYS$ERROR _NLA0: $ DEFINE/USER_MODE SYS$OUTPUT _NLA0: $ SET NOON -$ IF Needs_Opt -$ THEN -$ 'ld' try.obj,try.opt/opt -$ link_status = $status -$ ELSE -$ 'ld' try.obj -$ link_status = $status -$ ENDIF +$ 'ld' try.obj +$ link_status = $status $ SET ON $ IF F$SEARCH("try.obj") .NES. "" THEN DELETE/NOLOG/NOCONFIRM try.obj; $ RETURN @@ -4569,6 +4357,23 @@ $ tmp = "acess" $ GOSUB inlibc $ d_access = tmp $! +$! Check for mkostemp +$! +$ OS +$ WS "#if defined(__DECC) || defined(__DECCXX)" +$ WS "#include " +$ WS "#endif" +$ WS "#include " +$ WS "int main()" +$ WS "{" +$ WS "mkostemp(""foo"", 0);" +$ WS "exit(0);" +$ WS "}" +$ CS +$ tmp = "mkostemp" +$ GOSUB inlibc +$ d_mkostemp = tmp +$! $! Check for mkstemp $! $ OS @@ -5489,21 +5294,14 @@ $ ENDIF $! $! Some that are compiler or VMS version sensitive $! -$! Gnu C stuff -$ IF ccname .EQS. "GCC" +$ IF ccname .EQS. "CXX" $ THEN -$ d_attribut="define" -$ vms_cc_type="gcc" +$ vms_cc_type="cxx" $ ELSE -$ IF ccname .EQS. "CXX" -$ THEN -$ vms_cc_type="cxx" -$ ELSE -$ vms_cc_type="cc" -$ ENDIF -$ d_attribut="undef" +$ vms_cc_type="cc" $ ENDIF $! +$ d_attribut="undef" $ d_getitimer="define" $ d_gettimeod="define" $ d_mmap="define" @@ -6122,6 +5920,7 @@ $ WC "d_attribute_nonnull='undef'" $ WC "d_attribute_noreturn='undef'" $ WC "d_attribute_pure='undef'" $ WC "d_attribute_unused='undef'" +$ WC "d_attribute_visibility='undef'" $ WC "d_attribute_warn_unused_result='undef'" $ WC "d_prctl='undef'" $ WC "d_prctl_set_name='undef'" @@ -6369,6 +6168,7 @@ $ WC "d_mkdtemp='" + d_mkdtemp + "'" $ WC "d_mkfifo='undef'" $ WC "d_mknod='undef'" $ WC "d_mkostemp='undef'" +$ WC "d_mkostemp='" + d_mkostemp + "'" $ WC "d_mkstemp='" + d_mkstemp + "'" $ WC "d_mkstemps='" + d_mkstemps + "'" $ WC "d_mktime='" + d_mktime + "'" @@ -6680,7 +6480,6 @@ $ WC "freetype='void'" $ WC "full_ar='" + "'" $ WC "full_csh='" + " '" $ WC "full_sed='_NLA0:'" -$ WC "gccversion='" + gccversion + "'" $ WC "gidformat='lu'" $ WC "gidsign='1'" $ WC "gidsize='4'" @@ -6692,6 +6491,7 @@ $ WC "hint='none'" $ WC "hintfile='" + "'" $ WC "i16size='" + i16size + "'" $ WC "i16type='" + i16type + "'" +$ WC "i32dformat='" + i32dformat + "'" $ WC "i32size='" + i32size + "'" $ WC "i32type='" + i32type + "'" $ WC "i64size='" + i64size + "'" @@ -6768,6 +6568,7 @@ $ WC "i_syssockio='undef'" $ WC "i_sysstat='define'" $ WC "i_sysstatfs='undef'" $ WC "i_sysstatvfs='" + i_sysstatvfs + "'" +$ WC "i_syssyscall='undef'" $ WC "i_systime='undef'" $ WC "i_systimek='undef'" $ WC "i_systimes='undef'" @@ -6985,8 +6786,12 @@ $ WC "targetsh='MCR'" $ WC "timetype='" + timetype + "'" $ WC "u16size='" + u16size + "'" $ WC "u16type='" + u16type + "'" +$ WC "u32oformat='" + u32oformat + "'" +$ WC "u32uformat='" + u32uformat + "'" $ WC "u32size='" + u32size + "'" $ WC "u32type='" + u32type + "'" +$ WC "u32xformat='" + u32xformat + "'" +$ WC "u32XUformat='" + u32XUformat + "'" $ WC "u64size='" + u64size + "'" $ WC "u64type='" + u64type + "'" $ WC "u8size='" + u8size + "'" @@ -7188,20 +6993,7 @@ $! Okay, we've gotten here. Build munchc $ COPY/NOLOG [-.vms]munchconfig.c [] $ COPY/NOLOG [-.vms]'Makefile_SH' [] $ 'Perl_CC' 'ccflags' munchconfig.c -$ IF Needs_Opt -$ THEN -$ OPEN/WRITE CONFIG []munchconfig.opt -$ IF ccname .EQS. "GCC" -$ THEN -$ WRITE CONFIG "Gnu_CC:[000000]gcclib.olb/library" -$ ENDIF -$ WRITE CONFIG "Sys$Share:VAXCRTL/Share" -$ CLOSE CONFIG -$ 'ld'/EXE='exe_ext' munchconfig'obj_ext',munchconfig.opt/opt -$ DELETE/NOLOG/NOCONFIRM munchconfig.opt; -$ ELSE -$ 'ld'/EXE='exe_ext' munchconfig'obj_ext' -$ ENDIF +$ 'ld'/EXE='exe_ext' munchconfig'obj_ext' $ IF F$SEARCH("munchconfig''obj_ext'") .NES. "" THEN DELETE/NOLOG/NOCONFIRM munchconfig'obj_ext'; $ IF F$SEARCH("munchconfig.c") .NES. "" THEN DELETE/NOLOG/NOCONFIRM munchconfig.c; $ IF ccname .EQS. "CXX" @@ -7253,7 +7045,6 @@ $ IF use_two_pot_malloc THEN WC "#define $ IF mymalloc THEN WC "#define EMBEDMYMALLOC" $ IF use_pack_malloc THEN WC "#define PACK_MALLOC" $ IF use_debugmalloc THEN WC "#define DEBUGGING_MSTATS" -$ IF ccname .EQS. "GCC" THEN WC "#define GNUC_ATTRIBUTE_CHECK" $ IF (Has_Dec_C_Sockets) $ THEN $ WC "#define VMS_DO_SOCKETS" @@ -7313,12 +7104,6 @@ $ DECCXX_REPLACE = "DECCXX=DECCXX=1" $ ELSE $ DECCXX_REPLACE = "DECCXX=" $ ENDIF -$ IF ccname .EQS. "GCC" -$ THEN -$ GNUC_REPLACE = "GNUC=gnuc=1" -$ ELSE -$ GNUC_REPLACE = "GNUC=" -$ ENDIF $ IF Has_Dec_C_Sockets $ THEN $ SOCKET_REPLACE = "SOCKET=DECC_SOCKETS=1" @@ -7365,7 +7150,6 @@ $ WC := write CONFIG $ WC "''DECC_REPLACE'" $ WC "''DECCXX_REPLACE'" $ WC "''ARCH_TYPE'" -$ WC "''GNUC_REPLACE'" $ WC "''SOCKET_REPLACE'" $ WC "''THREAD_REPLACE'" $ WC "''C_Compiler_Replace'" @@ -7504,8 +7288,6 @@ $ echo "" $ echo4 "The perl.cld file is now being written..." $ OPEN/WRITE CONFIG 'file_2_find' $ ext = ".exe" -$ IF (sharedperl .AND. F$ELEMENT(0, "-", archname) .EQS. "VMS_AXP") THEN ext := .AXE -$ IF (sharedperl .AND. F$ELEMENT(0, "-", archname) .EQS. "VMS_IA64") THEN ext := .IXE $ IF (use_vmsdebug_perl) $ THEN $ WRITE CONFIG "define verb dbgperl" @@ -7561,11 +7343,6 @@ $ WRITE CONFIG "$ root_spec = P1" $ WRITE CONFIG "$ endif" $ WRITE CONFIG "$ define/translation=concealed ''vms_prefix' 'root_spec'" $ WRITE CONFIG "$ ext = "".exe""" -$ IF sharedperl -$ THEN -$ WRITE CONFIG "$ if f$getsyi(""ARCH_TYPE"") .eq. 2 then ext = "".AXE""" -$ WRITE CONFIG "$ if f$getsyi(""ARCH_TYPE"") .eq. 3 then ext = "".IXE""" -$ ENDIF $ IF (perl_symbol) $ THEN $ perl_setup_perl = "'" + "'perl'" ! triple quoted foreign command symbol Index: gnu/usr.bin/perl/cop.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cop.h,v diff -u -p -a -u -p -r1.22 cop.h --- gnu/usr.bin/perl/cop.h 15 Feb 2023 01:36:13 -0000 1.22 +++ gnu/usr.bin/perl/cop.h 21 Feb 2024 15:47:00 -0000 @@ -33,7 +33,7 @@ struct jmpenv { struct jmpenv * je_prev; Sigjmp_buf je_buf; /* uninit if je_prev is NULL */ int je_ret; /* last exception thrown */ - bool je_mustcatch; /* need to call longjmp()? */ + bool je_mustcatch; /* longjmp()s must be caught locally */ U16 je_old_delaymagic; /* saved PL_delaymagic */ SSize_t je_old_stack_hwm; }; @@ -110,30 +110,47 @@ typedef struct jmpenv JMPENV; #define dJMPENV JMPENV cur_env -#define JMPENV_PUSH(v) \ +#define JMPENV_PUSH(v) \ STMT_START { \ - DEBUG_l({ \ - int i = 0; JMPENV *p = PL_top_env; \ + DEBUG_l({ \ + int i = 0; \ + JMPENV *p = PL_top_env; \ while (p) { i++; p = p->je_prev; } \ - Perl_deb(aTHX_ "JUMPENV_PUSH level=%d at %s:%d\n", \ - i, __FILE__, __LINE__);}) \ + Perl_deb(aTHX_ "JMPENV_PUSH pre level=%d in %s at %s:%d\n", \ + i, SAFE_FUNCTION__, __FILE__, __LINE__); \ + }); \ cur_env.je_prev = PL_top_env; \ JE_OLD_STACK_HWM_save(cur_env); \ - cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, SCOPE_SAVES_SIGNAL_MASK); \ + /* setjmp() is callable in limited contexts which does not */ \ + /* include assignment, so switch() instead */ \ + switch (PerlProc_setjmp(cur_env.je_buf, SCOPE_SAVES_SIGNAL_MASK)) { \ + case 0: cur_env.je_ret = 0; break; \ + case 1: cur_env.je_ret = 1; break; \ + case 2: cur_env.je_ret = 2; break; \ + case 3: cur_env.je_ret = 3; break; \ + default: Perl_croak(aTHX_ "panic: unexpected setjmp() result\n"); \ + } \ JE_OLD_STACK_HWM_restore(cur_env); \ PL_top_env = &cur_env; \ cur_env.je_mustcatch = FALSE; \ cur_env.je_old_delaymagic = PL_delaymagic; \ + DEBUG_l({ \ + int i = 0; \ + JMPENV *p = PL_top_env; \ + while (p) { i++; p = p->je_prev; } \ + Perl_deb(aTHX_ "JMPENV_PUSH level=%d ret=%d in %s at %s:%d\n", \ + i, cur_env.je_ret, SAFE_FUNCTION__, __FILE__, __LINE__); \ + }); \ (v) = cur_env.je_ret; \ } STMT_END #define JMPENV_POP \ STMT_START { \ - DEBUG_l({ \ + DEBUG_l({ \ int i = -1; JMPENV *p = PL_top_env; \ while (p) { i++; p = p->je_prev; } \ - Perl_deb(aTHX_ "JUMPENV_POP level=%d at %s:%d\n", \ - i, __FILE__, __LINE__);}) \ + Perl_deb(aTHX_ "JMPENV_POP level=%d in %s at %s:%d\n", \ + i, SAFE_FUNCTION__, __FILE__, __LINE__);}) \ assert(PL_top_env == &cur_env); \ PL_delaymagic = cur_env.je_old_delaymagic; \ PL_top_env = cur_env.je_prev; \ @@ -141,27 +158,29 @@ typedef struct jmpenv JMPENV; #define JMPENV_JUMP(v) \ STMT_START { \ - DEBUG_l({ \ + DEBUG_l({ \ int i = -1; JMPENV *p = PL_top_env; \ while (p) { i++; p = p->je_prev; } \ - Perl_deb(aTHX_ "JUMPENV_JUMP(%d) level=%d at %s:%d\n", \ - (int)v, i, __FILE__, __LINE__);}) \ - if (PL_top_env->je_prev) \ + Perl_deb(aTHX_ "JMPENV_JUMP(%d) level=%d in %s at %s:%d\n", \ + (int)(v), i, SAFE_FUNCTION__, __FILE__, __LINE__);}) \ + if (PL_top_env->je_prev) { \ + assert((v) >= 0 && (v) <= 3); \ PerlProc_longjmp(PL_top_env->je_buf, (v)); \ + } \ if ((v) == 2) \ PerlProc_exit(STATUS_EXIT); \ - PerlIO_printf(PerlIO_stderr(), "panic: top_env, v=%d\n", (int)v); \ + PerlIO_printf(PerlIO_stderr(), "panic: top_env, v=%d\n", (int)(v)); \ PerlProc_exit(1); \ } STMT_END #define CATCH_GET (PL_top_env->je_mustcatch) #define CATCH_SET(v) \ STMT_START { \ - DEBUG_l( \ + DEBUG_l( \ Perl_deb(aTHX_ \ - "JUMPLEVEL set catch %d => %d (for %p) at %s:%d\n", \ - PL_top_env->je_mustcatch, v, (void*)PL_top_env, \ - __FILE__, __LINE__);) \ + "JUMPLEVEL set catch %d => %d (for %p) in %s at %s:%d\n", \ + PL_top_env->je_mustcatch, (v), (void*)PL_top_env, \ + SAFE_FUNCTION__, __FILE__, __LINE__);) \ PL_top_env->je_mustcatch = (v); \ } STMT_END @@ -175,8 +194,8 @@ typedef struct refcounted_he COPHH; #define COPHH_EXISTS REFCOUNTED_HE_EXISTS /* -=for apidoc Amx|SV *|cophh_fetch_pvn|const COPHH *cophh|const char *key|STRLEN keylen|U32 hash|U32 flags -=for apidoc_item|SV *|cophh_fetch_pv |const COPHH *cophh|const char *key |U32 hash|U32 flags +=for apidoc Amx|SV *|cophh_fetch_pv |const COPHH *cophh|const char *key |U32 hash|U32 flags +=for apidoc_item|SV *|cophh_fetch_pvn|const COPHH *cophh|const char *key|STRLEN keylen|U32 hash|U32 flags =for apidoc_item|SV *|cophh_fetch_pvs|const COPHH *cophh| "key" |U32 flags =for apidoc_item|SV *|cophh_fetch_sv |const COPHH *cophh| SV *key |U32 hash|U32 flags @@ -206,19 +225,24 @@ the octets. =for apidoc Amnh||COPHH_KEY_UTF8 =cut -*/ - -#define cophh_fetch_pvn(cophh, key, keylen, hash, flags) \ - Perl_refcounted_he_fetch_pvn(aTHX_ cophh, key, keylen, hash, flags) -#define cophh_fetch_pvs(cophh, key, flags) \ - Perl_refcounted_he_fetch_pvn(aTHX_ cophh, STR_WITH_LEN(key), 0, flags) - -#define cophh_fetch_pv(cophh, key, hash, flags) \ - Perl_refcounted_he_fetch_pv(aTHX_ cophh, key, hash, flags) +*/ -#define cophh_fetch_sv(cophh, key, hash, flags) \ - Perl_refcounted_he_fetch_sv(aTHX_ cophh, key, hash, flags) +#define cophh_fetch_pvn(cophh, key, keylen, hash, flags) \ + Perl_refcounted_he_fetch_pvn(aTHX_ cophh, key, keylen, hash, \ + (flags & COPHH_KEY_UTF8)) + +#define cophh_fetch_pvs(cophh, key, flags) \ + Perl_refcounted_he_fetch_pvn(aTHX_ cophh, STR_WITH_LEN(key), 0, \ + (flags & COPHH_KEY_UTF8)) + +#define cophh_fetch_pv(cophh, key, hash, flags) \ + Perl_refcounted_he_fetch_pv(aTHX_ cophh, key, hash, \ + (flags & COPHH_KEY_UTF8)) + +#define cophh_fetch_sv(cophh, key, hash, flags) \ + Perl_refcounted_he_fetch_sv(aTHX_ cophh, key, hash, \ + (flags & COPHH_KEY_UTF8)) /* =for apidoc Amx|bool|cophh_exists_pvn|const COPHH *cophh|const char *key|STRLEN keylen|U32 hash|U32 flags @@ -305,8 +329,8 @@ Generate and return a fresh cop hints ha #define cophh_new_empty() ((COPHH *)NULL) /* -=for apidoc Amx|COPHH *|cophh_store_pvn|COPHH *cophh|const char *key|STRLEN keylen|U32 hash|SV *value|U32 flags -=for apidoc_item|COPHH *|cophh_store_pv |COPHH *cophh|const char *key |U32 hash|SV *value|U32 flags +=for apidoc Amx|COPHH *|cophh_store_pv |COPHH *cophh|const char *key |U32 hash|SV *value|U32 flags +=for apidoc_item|COPHH *|cophh_store_pvn|COPHH *cophh|const char *key|STRLEN keylen|U32 hash|SV *value|U32 flags =for apidoc_item|COPHH *|cophh_store_pvs|COPHH *cophh| "key" |SV *value|U32 flags =for apidoc_item|COPHH *|cophh_store_sv |COPHH *cophh| SV *key |U32 hash|SV *value|U32 flags @@ -357,8 +381,8 @@ the octets. Perl_refcounted_he_new_sv(aTHX_ cophh, key, hash, value, flags) /* -=for apidoc Amx|COPHH *|cophh_delete_pvn|COPHH *cophh|const char *key|STRLEN keylen|U32 hash|U32 flags -=for apidoc_item|COPHH *|cophh_delete_pv |COPHH *cophh|const char *key |U32 hash|U32 flags +=for apidoc Amx|COPHH *|cophh_delete_pv |COPHH *cophh|const char *key |U32 hash|U32 flags +=for apidoc_item|COPHH *|cophh_delete_pvn|COPHH *cophh|const char *key|STRLEN keylen|U32 hash|U32 flags =for apidoc_item|COPHH *|cophh_delete_pvs|COPHH *cophh| "key" |U32 flags =for apidoc_item|COPHH *|cophh_delete_sv |COPHH *cophh| SV *key |U32 hash|U32 flags @@ -415,15 +439,20 @@ struct cop { #ifdef USE_ITHREADS PADOFFSET cop_stashoff; /* offset into PL_stashpad, for the package the line was compiled in */ - char * cop_file; /* name of file this command is from */ + char * cop_file; /* rcpv containing name of file this command is from */ #else HV * cop_stash; /* package line was compiled in */ GV * cop_filegv; /* name of GV file this command is from */ #endif U32 cop_hints; /* hints bits from pragmata */ U32 cop_seq; /* parse sequence number */ - /* Beware. mg.c and warnings.pl assume the type of this is STRLEN *: */ - STRLEN * cop_warnings; /* lexical warnings bitmask */ + char * cop_warnings; /* Lexical warnings bitmask vector. + Refcounted shared copy of ${^WARNING_BITS}. + This pointer either points at one of the + magic values for warnings, or it points + at a buffer constructed with rcpv_new(). + Use the RCPV_LEN() macro to get its length. + */ /* compile time state of %^H. See the comment in op.c for how this is used to recreate a hash to return from caller. */ COPHH * cop_hints_hash; @@ -439,7 +468,10 @@ struct cop { =for apidoc Am|const char *|CopFILE|const COP * c Returns the name of the file associated with the C C -=for apidoc Am|STRLEN|CopLINE|const COP * c +=for apidoc Am|const char *|CopFILE_LEN|const COP * c +Returns the length of the file associated with the C C + +=for apidoc Am|line_t|CopLINE|const COP * c Returns the line number in the source code associated with the C C =for apidoc Am|AV *|CopFILEAV|const COP * c @@ -455,6 +487,17 @@ Returns the SV associated with the C the name of the file associated with the C C +=for apidoc Am|void|CopFILE_setn|COP * c|const char * pv|STRLEN len +Makes C the name of the file associated with the C C + +=for apidoc Am|void|CopFILE_copy|COP * dst|COP * src +Efficiently copies the cop file name from one COP to another. Wraps +the required logic to do a refcounted copy under threads or not. + +=for apidoc Am|void|CopFILE_free|COP * c +Frees the file data in a cop. Under the hood this is a refcounting +operation. + =for apidoc Am|GV *|CopFILEGV|const COP * c Returns the GV associated with the C C @@ -482,14 +525,113 @@ string C

, creating the package if nec =cut */ +/* +=for apidoc Am|RCPV *|RCPVx|char *pv +Returns the RCPV structure (struct rcpv) for a refcounted +string pv created with C. +No checks are performed to ensure that C was actually allocated +with C, it is the callers responsibility to ensure that +this is the case. + +=for apidoc Am|RCPV *|RCPV_REFCOUNT|char *pv +Returns the refcount for a pv created with C. +No checks are performed to ensure that C was actually allocated +with C, it is the callers responsibility to ensure that +this is the case. + +=for apidoc Am|RCPV *|RCPV_REFCNT_inc|char *pv +Increments the refcount for a C pointer which was created +with a call to C. Same as calling rcpv_copy(). +No checks are performed to ensure that C was actually allocated +with C, it is the callers responsibility to ensure that +this is the case. + +=for apidoc Am|RCPV *|RCPV_REFCNT_dec|char *pv +Decrements the refcount for a C pointer which was created +with a call to C. Same as calling rcpv_free(). +No checks are performed to ensure that C was actually allocated +with C, it is the callers responsibility to ensure that +this is the case. + +=for apidoc Am|RCPV *|RCPV_LEN|char *pv +Returns the length of a pv created with C. +Note that this reflects the length of the string from the callers +point of view, it does not include the mandatory null which is +always injected at the end of the string by rcpv_new(). +No checks are performed to ensure that C was actually allocated +with C, it is the callers responsibility to ensure that +this is the case. + +=cut +*/ + +struct rcpv { + STRLEN refcount; /* UV would mean a 64 refcnt on + 32 bit builds with -Duse64bitint */ + STRLEN len; /* length of string including mandatory + null byte at end */ + char pv[1]; +}; +typedef struct rcpv RCPV; + +#define RCPVf_USE_STRLEN (1 << 0) +#define RCPVf_NO_COPY (1 << 1) +#define RCPVf_ALLOW_EMPTY (1 << 2) + +#define RCPVx(pv_arg) ((RCPV *)((pv_arg) - STRUCT_OFFSET(struct rcpv, pv))) +#define RCPV_REFCOUNT(pv) (RCPVx(pv)->refcount) +#define RCPV_LEN(pv) (RCPVx(pv)->len-1) /* len always includes space for a null */ +#define RCPV_REFCNT_inc(pv) rcpv_copy(pv) +#define RCPV_REFCNT_dec(pv) rcpv_free(pv) + #ifdef USE_ITHREADS -# define CopFILE(c) ((c)->cop_file) +# define CopFILE(c) ((c)->cop_file) +# define CopFILE_LEN(c) (CopFILE(c) ? RCPV_LEN(CopFILE(c)) : 0) # define CopFILEGV(c) (CopFILE(c) \ ? gv_fetchfile(CopFILE(c)) : NULL) -# define CopFILE_set(c,pv) ((c)->cop_file = savesharedpv(pv)) -# define CopFILE_setn(c,pv,l) ((c)->cop_file = savesharedpvn((pv),(l))) +# define CopFILE_set_x(c,pv) ((c)->cop_file = rcpv_new((pv),0,RCPVf_USE_STRLEN)) +# define CopFILE_setn_x(c,pv,l) ((c)->cop_file = rcpv_new((pv),(l),0)) +# define CopFILE_free_x(c) ((c)->cop_file = rcpv_free((c)->cop_file)) +# define CopFILE_copy_x(dst,src) ((dst)->cop_file = rcpv_copy((src)->cop_file)) + +/* change condition to 1 && to enable this debugging */ +# define CopFILE_debug(c,t,rk) \ + if (0 && (c)->cop_file) \ + PerlIO_printf(Perl_debug_log, \ + "%-14s THX:%p OP:%p PV:%p rc: " \ + "%6zu fn: '%.*s' at %s line %d\n", \ + (t), aTHX, (c), (c)->cop_file, \ + RCPV_REFCOUNT((c)->cop_file)-rk, \ + (int)RCPV_LEN((c)->cop_file), \ + (c)->cop_file,__FILE__,__LINE__) \ + + +# define CopFILE_set(c,pv) \ + STMT_START { \ + CopFILE_set_x(c,pv); \ + CopFILE_debug(c,"CopFILE_set", 0); \ + } STMT_END + +# define CopFILE_setn(c,pv,l) \ + STMT_START { \ + CopFILE_setn_x(c,pv,l); \ + CopFILE_debug(c,"CopFILE_setn", 0); \ + } STMT_END + +# define CopFILE_copy(dst,src) \ + STMT_START { \ + CopFILE_copy_x((dst),(src)); \ + CopFILE_debug((dst),"CopFILE_copy", 0); \ + } STMT_END + +# define CopFILE_free(c) \ + STMT_START { \ + CopFILE_debug((c),"CopFILE_free", 1); \ + CopFILE_free_x(c); \ + } STMT_END + # define CopFILESV(c) (CopFILE(c) \ ? GvSV(gv_fetchfile(CopFILE(c))) : NULL) @@ -502,13 +644,13 @@ string C

, creating the package if nec # define CopSTASH_set(c,hv) ((c)->cop_stashoff = (hv) \ ? alloccopstash(hv) \ : 0) -# define CopFILE_free(c) (PerlMemShared_free(CopFILE(c)),(CopFILE(c) = NULL)) #else /* Above: yes threads; Below no threads */ # define CopFILEGV(c) ((c)->cop_filegv) # define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) # define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) +# define CopFILE_copy(dst,src) CopFILEGV_set((dst),CopFILEGV(src)) # define CopFILE_setn(c,pv,l) CopFILEGV_set((c), gv_fetchfile_flags((pv),(l),0)) # define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : NULL) # define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : NULL) @@ -520,6 +662,8 @@ string C

, creating the package if nec # define CopFILEAVn(c) (CopFILEGV(c) ? GvAVn(CopFILEGV(c)) : NULL) # define CopFILE(c) (CopFILEGV(c) /* +2 for '_<' */ \ ? GvNAME(CopFILEGV(c))+2 : NULL) +# define CopFILE_LEN(c) (CopFILEGV(c) /* -2 for '_<' */ \ + ? GvNAMELEN(CopFILEGV(c))-2 : 0) # define CopSTASH(c) ((c)->cop_stash) # define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) # define CopFILE_free(c) (SvREFCNT_dec(CopFILEGV(c)),(CopFILEGV(c) = NULL)) @@ -534,10 +678,12 @@ string C

, creating the package if nec #define CopHINTHASH_get(c) ((COPHH*)((c)->cop_hints_hash)) #define CopHINTHASH_set(c,h) ((c)->cop_hints_hash = (h)) +#define CopFEATURES_setfrom(dst, src) ((dst)->cop_features = (src)->cop_features) + /* -=for apidoc Am|SV *|cop_hints_fetch_pvn|const COP *cop|const char *key|STRLEN keylen|U32 hash|U32 flags -=for apidoc_item|SV *|cop_hints_fetch_pv |const COP *cop|const char *key |U32 hash|U32 flags -=for apidoc_item|SV *|cop_hints_fetch_pvs|const COP *cop| "key" |U32 flags +=for apidoc Am|SV *|cop_hints_fetch_pv |const COP *cop|const char *key |U32 hash|U32 flags +=for apidoc_item|SV *|cop_hints_fetch_pvn|const COP *cop|const char *key|STRLEN keylen|U32 hash|U32 flags +=for apidoc_item|SV *|cop_hints_fetch_pvs|const COP *cop| "key" |U32 flags =for apidoc_item|SV *|cop_hints_fetch_sv |const COP *cop| SV *key |U32 hash|U32 flags These look up the hint entry in the cop C with the key specified by @@ -579,8 +725,8 @@ the octets. cophh_fetch_sv(CopHINTHASH_get(cop), key, hash, flags) /* -=for apidoc Am|bool|cop_hints_exists_pvn|const COP *cop|const char *key|STRLEN keylen|U32 hash|U32 flags -=for apidoc_item|bool|cop_hints_exists_pv |const COP *cop|const char *key |U32 hash|U32 flags +=for apidoc Am|bool|cop_hints_exists_pv |const COP *cop|const char *key|U32 hash |U32 flags +=for apidoc_item|bool|cop_hints_exists_pvn|const COP *cop|const char *key|STRLEN keylen|U32 hash|U32 flags =for apidoc_item|bool|cop_hints_exists_pvs|const COP *cop| "key" |U32 flags =for apidoc_item|bool|cop_hints_exists_sv |const COP *cop| SV *key |U32 hash|U32 flags @@ -766,7 +912,7 @@ struct block_eval { /* blk_u16 bit usage for eval contexts: */ -#define CxOLD_IN_EVAL(cx) (((cx)->blk_u16) & 0x3F) /* saved PL in_eval */ +#define CxOLD_IN_EVAL(cx) (((cx)->blk_u16) & 0x3F) /* saved PL_in_eval */ #define CxEVAL_TXT_REFCNTED(cx) (((cx)->blk_u16) & 0x40) /* cur_text rc++ */ #define CxOLD_OP_TYPE(cx) (((cx)->blk_u16) >> 7) /* type of eval op */ @@ -793,7 +939,7 @@ struct block_loop { } lazyiv; struct { /* CXt_LOOP_LAZYSV C */ SV * cur; - SV * end; /* maxiumum value (or minimum in reverse) */ + SV * end; /* maximum value (or minimum in reverse) */ } lazysv; } state_u; #ifdef USE_ITHREADS @@ -808,9 +954,9 @@ struct block_loop { ? &GvSV((c)->blk_loop.itervar_u.gv) \ : (SV **)&(c)->blk_loop.itervar_u.gv) -#define CxLABEL(c) (0 + CopLABEL((c)->blk_oldcop)) -#define CxLABEL_len(c,len) (0 + CopLABEL_len((c)->blk_oldcop, len)) -#define CxLABEL_len_flags(c,len,flags) (0 + CopLABEL_len_flags((c)->blk_oldcop, len, flags)) +#define CxLABEL(c) (CopLABEL((c)->blk_oldcop)) +#define CxLABEL_len(c,len) (CopLABEL_len((c)->blk_oldcop, len)) +#define CxLABEL_len_flags(c,len,flags) ((const char *)CopLABEL_len_flags((c)->blk_oldcop, len, flags)) #define CxHASARGS(c) (((c)->cx_type & CXp_HASARGS) == CXp_HASARGS) /* CxLVAL(): the lval flags of the call site: the relevant flag bits from @@ -875,7 +1021,7 @@ struct block { #define CX_DEBUG(cx, action) \ DEBUG_l( \ - Perl_deb(aTHX_ "CX %ld %s %s (scope %ld,%ld) (save %ld,%ld) at %s:%d\n",\ + Perl_deb(aTHX_ "CX %ld %s %s (scope %ld,%ld) (save %ld,%ld) in %s at %s:%d\n",\ (long)cxstack_ix, \ action, \ PL_block_type[CxTYPE(cx)], \ @@ -883,7 +1029,7 @@ struct block { (long)(cx->blk_oldscopesp), \ (long)PL_savestack_ix, \ (long)(cx->blk_oldsaveix), \ - __FILE__, __LINE__)); + SAFE_FUNCTION__, __FILE__, __LINE__)); @@ -1130,10 +1276,10 @@ typedef struct stackinfo PERL_SI; #define cxstack_max (PL_curstackinfo->si_cxmax) #ifdef DEBUGGING -# define SET_MARK_OFFSET \ +# define SET_MARK_OFFSET \ PL_curstackinfo->si_markoff = PL_markstack_ptr - PL_markstack #else -# define SET_MARK_OFFSET NOOP +# define SET_MARK_OFFSET NOOP #endif #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY @@ -1148,8 +1294,8 @@ typedef struct stackinfo PERL_SI; DEBUG_l({ \ int i = 0; PERL_SI *p = PL_curstackinfo; \ while (p) { i++; p = p->si_prev; } \ - Perl_deb(aTHX_ "push STACKINFO %d at %s:%d\n", \ - i, __FILE__, __LINE__);}) \ + Perl_deb(aTHX_ "push STACKINFO %d in %s at %s:%d\n", \ + i, SAFE_FUNCTION__, __FILE__, __LINE__);}) \ if (!next) { \ next = new_stackinfo(32, 2048/sizeof(PERL_CONTEXT) - 1); \ next->si_prev = PL_curstackinfo; \ @@ -1176,8 +1322,8 @@ typedef struct stackinfo PERL_SI; DEBUG_l({ \ int i = -1; PERL_SI *p = PL_curstackinfo; \ while (p) { i++; p = p->si_prev; } \ - Perl_deb(aTHX_ "pop STACKINFO %d at %s:%d\n", \ - i, __FILE__, __LINE__);}) \ + Perl_deb(aTHX_ "pop STACKINFO %d in %s at %s:%d\n", \ + i, SAFE_FUNCTION__, __FILE__, __LINE__);}) \ if (!prev) { \ Perl_croak_popstack(); \ } \ @@ -1212,17 +1358,17 @@ program; otherwise 0; /* =for apidoc_section $multicall -=for apidoc Amns||dMULTICALL +=for apidoc Amn;||dMULTICALL Declare local variables for a multicall. See L. -=for apidoc Ams||PUSH_MULTICALL|CV* the_cv +=for apidoc Am;||PUSH_MULTICALL|CV* the_cv Opening bracket for a lightweight callback. See L. -=for apidoc Amns||MULTICALL +=for apidoc Amn;||MULTICALL Make a lightweight callback. See L. -=for apidoc Amns||POP_MULTICALL +=for apidoc Amn;||POP_MULTICALL Closing bracket for a lightweight callback. See L. Index: gnu/usr.bin/perl/cv.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cv.h,v diff -u -p -a -u -p -r1.20 cv.h --- gnu/usr.bin/perl/cv.h 15 Feb 2023 01:36:13 -0000 1.20 +++ gnu/usr.bin/perl/cv.h 21 Feb 2024 15:47:01 -0000 @@ -38,7 +38,7 @@ See L. # define Nullcv Null(CV*) #endif -#define CvSTASH(sv) (0+((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash) +#define CvSTASH(sv) (MUTABLE_HV(((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash)) #define CvSTASH_set(cv,st) Perl_cvstash_set(aTHX_ cv, st) #define CvSTART(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_start #define CvROOT(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_root @@ -107,7 +107,10 @@ See L. : 0 \ ) -#define CVf_METHOD 0x0001 /* CV is explicitly marked as a method */ +/* CV has the `:method` attribute. This used to be called CVf_METHOD but is + * renamed to avoid collision with CVf_IsMETHOD */ +#define CVf_NOWARN_AMBIGUOUS 0x0001 + #define CVf_LVALUE 0x0002 /* CV return value can be used as lvalue */ #define CVf_CONST 0x0004 /* inlinable sub */ #define CVf_ISXSUB 0x0008 /* CV is an XSUB, not pure perl. */ @@ -117,7 +120,7 @@ See L. #define CVf_CLONED 0x0040 /* a clone of one of those */ #define CVf_ANON 0x0080 /* CV is not pointed to by a GV */ #define CVf_UNIQUE 0x0100 /* sub is only called once (eg PL_main_cv, - * require, eval). */ + require, eval). */ #define CVf_NODEBUG 0x0200 /* no DB::sub indirection for this CV (esp. useful for special XSUBs) */ #define CVf_CVGV_RC 0x0400 /* CvGV is reference counted */ @@ -131,9 +134,13 @@ See L. #define CVf_LEXICAL 0x10000 /* Omit package from name */ #define CVf_ANONCONST 0x20000 /* :const - create anonconst op */ #define CVf_SIGNATURE 0x40000 /* CV uses a signature */ +#define CVf_REFCOUNTED_ANYSV 0x80000 /* CvXSUBANY().any_sv is refcounted */ +#define CVf_IsMETHOD 0x100000 /* CV is a (real) method of a real class. Not + to be confused with what used to be called + CVf_METHOD; now CVf_NOWARN_AMBIGUOUS */ /* This symbol for optimised communication between toke.c and op.c: */ -#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LVALUE|CVf_ANONCONST) +#define CVf_BUILTIN_ATTRS (CVf_NOWARN_AMBIGUOUS|CVf_LVALUE|CVf_ANONCONST) #define CvCLONE(cv) (CvFLAGS(cv) & CVf_CLONE) #define CvCLONE_on(cv) (CvFLAGS(cv) |= CVf_CLONE) @@ -156,9 +163,9 @@ See L. #define CvNODEBUG_on(cv) (CvFLAGS(cv) |= CVf_NODEBUG) #define CvNODEBUG_off(cv) (CvFLAGS(cv) &= ~CVf_NODEBUG) -#define CvMETHOD(cv) (CvFLAGS(cv) & CVf_METHOD) -#define CvMETHOD_on(cv) (CvFLAGS(cv) |= CVf_METHOD) -#define CvMETHOD_off(cv) (CvFLAGS(cv) &= ~CVf_METHOD) +#define CvNOWARN_AMBIGUOUS(cv) (CvFLAGS(cv) & CVf_NOWARN_AMBIGUOUS) +#define CvNOWARN_AMBIGUOUS_on(cv) (CvFLAGS(cv) |= CVf_NOWARN_AMBIGUOUS) +#define CvNOWARN_AMBIGUOUS_off(cv) (CvFLAGS(cv) &= ~CVf_NOWARN_AMBIGUOUS) #define CvLVALUE(cv) (CvFLAGS(cv) & CVf_LVALUE) #define CvLVALUE_on(cv) (CvFLAGS(cv) |= CVf_LVALUE) @@ -223,6 +230,47 @@ See L. #define CvSIGNATURE(cv) (CvFLAGS(cv) & CVf_SIGNATURE) #define CvSIGNATURE_on(cv) (CvFLAGS(cv) |= CVf_SIGNATURE) #define CvSIGNATURE_off(cv) (CvFLAGS(cv) &= ~CVf_SIGNATURE) + +/* + +=for apidoc m|bool|CvREFCOUNTED_ANYSV|CV *cv + +If true, indicates that the C member contains an SV +pointer whose reference count should be decremented when the CV itself is +freed. In addition, C will increment the reference count, and +C will duplicate the entire pointed-to SV if this flag is set. + +Any CV that wraps an XSUB has an C union that the XSUB function is free +to use for its own purposes. It may be the case that the code wishes to store +an SV in the C member of this union. By setting this flag, this SV +reference will be properly reclaimed or duplicated when the CV itself is. + +=for apidoc m|void|CvREFCOUNTED_ANYSV_on|CV *cv + +Helper macro to turn on the C flag. + +=for apidoc m|void|CvREFCOUNTED_ANYSV_off|CV *cv + +Helper macro to turn off the C flag. + +=cut +*/ + +#define CvREFCOUNTED_ANYSV(cv) (CvFLAGS(cv) & CVf_REFCOUNTED_ANYSV) +#define CvREFCOUNTED_ANYSV_on(cv) (CvFLAGS(cv) |= CVf_REFCOUNTED_ANYSV) +#define CvREFCOUNTED_ANYSV_off(cv) (CvFLAGS(cv) &= ~CVf_REFCOUNTED_ANYSV) + +#define CvIsMETHOD(cv) (CvFLAGS(cv) & CVf_IsMETHOD) +#define CvIsMETHOD_on(cv) (CvFLAGS(cv) |= CVf_IsMETHOD) +#define CvIsMETHOD_off(cv) (CvFLAGS(cv) &= ~CVf_IsMETHOD) + +/* Back-compat */ +#ifndef PERL_CORE +# define CVf_METHOD CVf_NOWARN_AMBIGUOUS +# define CvMETHOD(cv) CvNOWARN_AMBIGUOUS(cv) +# define CvMETHOD_on(cv) CvNOWARN_AMBIGUOUS_on(cv) +# define CvMETHOD_off(cv) CvNOWARN_AMBIGUOUS_off(cv) +#endif /* Flags for newXS_flags */ #define XS_DYNAMIC_FILENAME 0x01 /* The filename isn't static */ Index: gnu/usr.bin/perl/deb.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/deb.c,v diff -u -p -a -u -p -r1.25 deb.c --- gnu/usr.bin/perl/deb.c 15 Feb 2023 01:36:13 -0000 1.25 +++ gnu/usr.bin/perl/deb.c 21 Feb 2024 15:47:01 -0000 @@ -87,15 +87,18 @@ Perl_vdeb(pTHX_ const char *pat, va_list #ifdef DEBUGGING const char* const file = PL_curcop ? OutCopFILE(PL_curcop) : ""; const char* const display_file = file ? file : ""; - const long line = PL_curcop ? (long)CopLINE(PL_curcop) : 0; + line_t line = PL_curcop ? CopLINE(PL_curcop) : NOLINE; + if (line == NOLINE) + line = 0; PERL_ARGS_ASSERT_VDEB; if (DEBUG_v_TEST) - PerlIO_printf(Perl_debug_log, "(%ld:%s:%ld)\t", + PerlIO_printf(Perl_debug_log, "(%ld:%s:%" LINE_Tf ")\t", (long)PerlProc_getpid(), display_file, line); else - PerlIO_printf(Perl_debug_log, "(%s:%ld)\t", display_file, line); + PerlIO_printf(Perl_debug_log, "(%s:%" LINE_Tf ")\t", + display_file, line); (void) PerlIO_vprintf(Perl_debug_log, pat, *args); #else PERL_UNUSED_CONTEXT; @@ -317,7 +320,10 @@ Perl_deb_stack_all(pTHX) } if (CxTYPE(&(si_n->si_cxstack[i])) == CXt_SUBST) continue; - cx_n = &(si_n->si_cxstack[i]); + if (si_n->si_cxix >= 0) + cx_n = &(si_n->si_cxstack[i]); + else + cx_n = NULL; break; } Index: gnu/usr.bin/perl/doio.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/doio.c,v diff -u -p -a -u -p -r1.25 doio.c --- gnu/usr.bin/perl/doio.c 15 Feb 2023 01:36:13 -0000 1.25 +++ gnu/usr.bin/perl/doio.c 21 Feb 2024 15:47:02 -0000 @@ -1632,7 +1632,7 @@ S_dir_unchanged(pTHX_ const char *orig_p S_dir_unchanged(aTHX_ (orig_psv), (mg)) STATIC bool -S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool not_implicit) { +S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool is_explict) { bool retval; /* ensure args are checked before we start using them */ @@ -1679,7 +1679,7 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, #endif } - retval = io_close(io, NULL, not_implicit, FALSE); + retval = io_close(io, NULL, is_explict, FALSE); if (SvIV(*pid_psv) != (IV)PerlProc_getpid()) { /* this is a child process, don't duplicate our rename() etc @@ -1724,7 +1724,7 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, PerlLIO_rename(orig_pv, SvPVX(*back_psv)) < 0 # endif ) { - if (!not_implicit) { + if (!is_explict) { # ifdef ARGV_USE_ATFUNCTIONS if (unlinkat(dfd, SvPVX_const(*temp_psv), 0) < 0 && UNLIKELY(NotSupported(errno)) && @@ -1742,7 +1742,7 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, #else (void)UNLINK(SvPVX(*back_psv)); if (link(orig_pv, SvPVX(*back_psv))) { - if (!not_implicit) { + if (!is_explict) { Perl_croak(aTHX_ "Can't rename %s to %s: %s, skipping file", SvPVX(*orig_psv), SvPVX(*back_psv), Strerror(errno)); } @@ -1771,7 +1771,7 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, PerlLIO_rename(SvPVX(*temp_psv), orig_pv) < 0 #endif ) { - if (!not_implicit) { + if (!is_explict) { #ifdef ARGV_USE_ATFUNCTIONS if (unlinkat(dfd, SvPVX_const(*temp_psv), 0) < 0 && NotSupported(errno)) @@ -1800,7 +1800,7 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, #else UNLINK(SvPVX_const(*temp_psv)); #endif - if (!not_implicit) { + if (!is_explict) { Perl_croak(aTHX_ "Failed to close in-place work file %s: %s", SvPVX(*temp_psv), Strerror(errno)); } @@ -1811,9 +1811,25 @@ S_argvout_final(pTHX_ MAGIC *mg, IO *io, return retval; } -/* explicit renamed to avoid C++ conflict -- kja */ +/* +=for apidoc do_close + +Close an I/O stream. This implements Perl L>. + +C is the glob associated with the stream. + +C is C if this is an explicit close of the stream; C +if it is part of another operation, such as closing a pipe (which involves +implicitly closing both ends). + +Returns C if successful; otherwise returns C and sets C to +indicate the cause. + +=cut +*/ + bool -Perl_do_close(pTHX_ GV *gv, bool not_implicit) +Perl_do_close(pTHX_ GV *gv, bool is_explict) { bool retval; IO *io; @@ -1822,13 +1838,13 @@ Perl_do_close(pTHX_ GV *gv, bool not_imp if (!gv) gv = PL_argvgv; if (!gv || !isGV_with_GP(gv)) { - if (not_implicit) + if (is_explict) SETERRNO(EBADF,SS_IVCHAN); return FALSE; } io = GvIO(gv); if (!io) { /* never opened */ - if (not_implicit) { + if (is_explict) { report_evil_fh(gv); SETERRNO(EBADF,SS_IVCHAN); } @@ -1836,13 +1852,13 @@ Perl_do_close(pTHX_ GV *gv, bool not_imp } if ((mg = mg_findext((SV*)io, PERL_MAGIC_uvar, &argvout_vtbl)) && mg->mg_obj) { - retval = argvout_final(mg, io, not_implicit); + retval = argvout_final(mg, io, is_explict); mg_freeext((SV*)io, PERL_MAGIC_uvar, &argvout_vtbl); } else { - retval = io_close(io, NULL, not_implicit, FALSE); + retval = io_close(io, NULL, is_explict, FALSE); } - if (not_implicit) { + if (is_explict) { IoLINES(io) = 0; IoPAGE(io) = 0; IoLINES_LEFT(io) = IoPAGE_LEN(io); @@ -1852,7 +1868,7 @@ Perl_do_close(pTHX_ GV *gv, bool not_imp } bool -Perl_io_close(pTHX_ IO *io, GV *gv, bool not_implicit, bool warn_on_fail) +Perl_io_close(pTHX_ IO *io, GV *gv, bool is_explict, bool warn_on_fail) { bool retval = FALSE; @@ -1871,7 +1887,7 @@ Perl_io_close(pTHX_ IO *io, GV *gv, bool */ IoOFP(io) = IoIFP(io) = NULL; status = PerlProc_pclose(fh); - if (not_implicit) { + if (is_explict) { STATUS_NATIVE_CHILD_SET(status); retval = (STATUS_UNIX == 0); } @@ -1916,7 +1932,7 @@ Perl_io_close(pTHX_ IO *io, GV *gv, bool SVfARG(get_sv("!",GV_ADD))); } } - else if (not_implicit) { + else if (is_explict) { SETERRNO(EBADF,SS_IVCHAN); } @@ -2778,7 +2794,7 @@ nothing in the core. { /* Under AmigaOS4 unlink only 'fails' if the filename is invalid */ /* It may not remove the file if it's Locked, so check if it's still */ - /* arround */ + /* around */ if((access(s,F_OK) != -1)) { tot--; Index: gnu/usr.bin/perl/doop.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/doop.c,v diff -u -p -a -u -p -r1.21 doop.c --- gnu/usr.bin/perl/doop.c 15 Feb 2023 01:36:13 -0000 1.21 +++ gnu/usr.bin/perl/doop.c 21 Feb 2024 15:47:02 -0000 @@ -1183,8 +1183,7 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV * values, or key-value pairs, depending on PL_op. */ -OP * -Perl_do_kv(pTHX) +PP(do_kv) { dSP; HV * const keys = MUTABLE_HV(POPs); Index: gnu/usr.bin/perl/dosish.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dosish.h,v diff -u -p -a -u -p -r1.18 dosish.h --- gnu/usr.bin/perl/dosish.h 15 Feb 2023 01:36:13 -0000 1.18 +++ gnu/usr.bin/perl/dosish.h 21 Feb 2024 15:47:02 -0000 @@ -24,12 +24,17 @@ # define BIT_BUCKET "\\dev\\nul" /* "wanna be like, umm, Newlined, or somethin?" */ #endif +/* Generally add things last-in first-terminated. IO and memory terminations + * need to be generally last + * + * BEWARE that using PerlIO in these will be using freed memory, so may appear + * to work, but must NOT be retained in production code. */ #ifndef PERL_SYS_TERM_BODY # define PERL_SYS_TERM_BODY() \ + ENV_TERM; USER_PROP_MUTEX_TERM; LOCALE_TERM; \ HINTS_REFCNT_TERM; KEYWORD_PLUGIN_MUTEX_TERM; \ - OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM; PERLIO_TERM; \ - MALLOC_TERM; LOCALE_TERM; USER_PROP_MUTEX_TERM; \ - ENV_TERM; + OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM; \ + PERLIO_TERM; MALLOC_TERM; #endif #define dXSUB_SYS dNOOP @@ -104,6 +109,10 @@ /* Don't go reading from /dev/urandom */ #define PERL_NO_DEV_RANDOM + +#ifdef WIN32 +# define NO_ENVIRON_ARRAY +#endif /* * ex: set ts=8 sts=4 sw=4 et: Index: gnu/usr.bin/perl/dquote.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dquote.c,v diff -u -p -a -u -p -r1.5 dquote.c --- gnu/usr.bin/perl/dquote.c 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/dquote.c 21 Feb 2024 15:47:02 -0000 @@ -46,7 +46,7 @@ Perl_grok_bslash_c(pTHX_ const char so const char control = toCTRL('{'); if (isPRINT_A(control)) { /* diag_listed_as: Use "%s" instead of "%s" */ - *message = Perl_form(aTHX_ "Use \"%c\" instead of \"\\c{\"", control); + *message = Perl_form(aTHX_ PERL_DIAG_DIE_SYNTAX("Use \"%c\" instead of \"\\c{\""), control); } else { *message = "Sequence \"\\c{\" invalid"; @@ -58,7 +58,7 @@ Perl_grok_bslash_c(pTHX_ const char so if (isPRINT_A(*result) && ckWARN(WARN_SYNTAX)) { U8 clearer[3]; U8 i = 0; - char format[] = "\"\\c%c\" is more clearly written simply as \"%s\""; + char format[] = PERL_DIAG_WARN_SYNTAX("\"\\c%c\" is more clearly written simply as \"%s\""); if (! isWORDCHAR(*result)) { clearer[i++] = '\\'; Index: gnu/usr.bin/perl/dump.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dump.c,v diff -u -p -a -u -p -r1.21 dump.c --- gnu/usr.bin/perl/dump.c 15 Feb 2023 01:36:13 -0000 1.21 +++ gnu/usr.bin/perl/dump.c 21 Feb 2024 15:47:02 -0000 @@ -45,7 +45,8 @@ static const char* const svtypenames[SVt "PVHV", "PVCV", "PVFM", - "PVIO" + "PVIO", + "PVOBJ", }; @@ -65,7 +66,8 @@ static const char* const svshorttypename "HV", "CV", "FM", - "IO" + "IO", + "OBJ", }; struct flag_to_name { @@ -110,28 +112,31 @@ will also be escaped. Normally the SV will be cleared before the escaped string is prepared, but when C is set this will not occur. -If C is set then the input string is treated as UTF-8 -if C is set then the input string is scanned +If C is set then the input string is treated as UTF-8. +If C is set then the input string is scanned using C to determine if it is UTF-8. If C is set then all input chars will be output -using C<\x01F1> style escapes, otherwise if C is set, only -non-ASCII chars will be escaped using this style; otherwise, only chars above -255 will be so escaped; other non printable chars will use octal or -common escaped patterns like C<\n>. -Otherwise, if C -then all chars below 255 will be treated as printable and -will be output as literals. +using C<\x01F1> style escapes, otherwise if C +is set, only non-ASCII chars will be escaped using this style; +otherwise, only chars above 255 will be so escaped; other non printable +chars will use octal or common escaped patterns like C<\n>. Otherwise, +if C then all chars below 255 will be +treated as printable and will be output as literals. The +C modifies the previous rules to cause word +chars, unicode or otherwise, to be output as literals, note this uses +the *unicode* rules for deciding on word characters. If C is set then only the first char of the -string will be escaped, regardless of max. If the output is to be in hex, -then it will be returned as a plain hex -sequence. Thus the output will either be a single char, -an octal escape sequence, a special escape like C<\n> or a hex value. - -If C is set then the escape char used will be a C<"%"> and -not a C<"\\">. This is because regexes very often contain backslashed -sequences, whereas C<"%"> is not a particularly common character in patterns. +string will be escaped, regardless of max. If the output is to be in +hex, then it will be returned as a plain hex sequence. Thus the output +will either be a single char, an octal escape sequence, a special escape +like C<\n> or a hex value. + +If C is set then the escape char used will be a +C<"%"> and not a C<"\\">. This is because regexes very often contain +backslashed sequences, whereas C<"%"> is not a particularly common +character in patterns. Returns a pointer to the escaped text as held by C. @@ -144,6 +149,7 @@ Returns a pointer to the escaped text as =for apidoc Amnh||PERL_PV_ESCAPE_RE =for apidoc Amnh||PERL_PV_ESCAPE_UNI =for apidoc Amnh||PERL_PV_ESCAPE_UNI_DETECT +=for apidoc Amnh||PERL_PV_ESCAPE_NON_WC =cut @@ -161,7 +167,7 @@ Unused or not for public use char * Perl_pv_escape( pTHX_ SV *dsv, char const * const str, - const STRLEN count, const STRLEN max, + const STRLEN count, STRLEN max, STRLEN * const escaped, U32 flags ) { @@ -173,13 +179,45 @@ Perl_pv_escape( pTHX_ SV *dsv, char cons const char esc = (flags & PERL_PV_ESCAPE_RE) ? '%' : '\\'; const char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : esc; + const char *qs; + const char *qe; + char octbuf[PV_ESCAPE_OCTBUFSIZE] = "%123456789ABCDF"; STRLEN wrote = 0; /* chars written so far */ STRLEN chsize = 0; /* size of data to be written */ STRLEN readsize = 1; /* size of data just read */ - bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this UTF-8 */ + bool isuni= (flags & PERL_PV_ESCAPE_UNI) + ? TRUE : FALSE; /* is this UTF-8 */ const char *pv = str; const char * const end = pv + count; /* end of string */ + const char *restart = NULL; + STRLEN extra_len = 0; + STRLEN tail = 0; + if ((flags & PERL_PV_ESCAPE_TRUNC_MIDDLE) && max > 3) { + if (flags & PERL_PV_ESCAPE_QUOTE) { + qs = qe = "\""; + extra_len = 5; + } else if (flags & PERL_PV_PRETTY_LTGT) { + qs = "<"; + qe = ">"; + extra_len = 5; + } else { + qs = qe = ""; + extra_len = 3; + } + tail = max / 2; + restart = isuni ? (char *)utf8_hop_back((U8*)end,-tail,(U8*)pv) : end - tail; + if (restart > pv) { + max -= tail; + } else { + tail = 0; + restart = NULL; + } + } + else { + qs = qe = ""; + } + octbuf[0] = esc; PERL_ARGS_ASSERT_PV_ESCAPE; @@ -192,9 +230,10 @@ Perl_pv_escape( pTHX_ SV *dsv, char cons if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) isuni = 1; - for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) { + for ( ; pv < end ; pv += readsize ) { const UV u= (isuni) ? utf8_to_uvchr_buf((U8*)pv, (U8*) end, &readsize) : (U8)*pv; const U8 c = (U8)u; + const char *source_buf = octbuf; if ( ( u > 255 ) || (flags & PERL_PV_ESCAPE_ALL) @@ -204,6 +243,11 @@ Perl_pv_escape( pTHX_ SV *dsv, char cons chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, "%" UVxf, u); else + if ((flags & PERL_PV_ESCAPE_NON_WC) && isWORDCHAR_uvchr(u)) { + chsize = readsize; + source_buf = pv; + } + else chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, ((flags & PERL_PV_ESCAPE_DWIM) && !isuni) ? ( use_uc_hex ? ("%c" PV_BYTE_HEX_UC) : ("%c" PV_BYTE_HEX_LC) ) @@ -251,11 +295,22 @@ Perl_pv_escape( pTHX_ SV *dsv, char cons chsize = 1; } } - if ( max && (wrote + chsize > max) ) { - break; + if (max && (wrote + chsize > max)) { + if (restart) { + /* this only happens with PERL_PV_ESCAPE_TRUNC_MIDDLE */ + if (dsv) + Perl_sv_catpvf( aTHX_ dsv,"%s...%s", qe, qs); + wrote += extra_len; + pv = restart; + max = tail; + wrote = tail = 0; + restart = NULL; + } else { + break; + } } else if (chsize > 1) { if (dsv) - sv_catpvn(dsv, octbuf, chsize); + sv_catpvn(dsv, source_buf, chsize); wrote += chsize; } else { /* If PERL_PV_ESCAPE_NOBACKSLASH is set then non-ASCII bytes @@ -481,10 +536,12 @@ Perl_sv_peek(pTHX_ SV *sv) break; } } - if (is_tmp || SvREFCNT(sv) > 1) { + if (is_tmp || SvREFCNT(sv) > 1 || SvPADTMP(sv)) { Perl_sv_catpvf(aTHX_ t, "<"); if (SvREFCNT(sv) > 1) Perl_sv_catpvf(aTHX_ t, "%" UVuf, (UV)SvREFCNT(sv)); + if (SvPADTMP(sv)) + Perl_sv_catpvf(aTHX_ t, "%s", "P"); if (is_tmp) Perl_sv_catpvf(aTHX_ t, "%s", SvTEMP(t) ? "T" : "t"); Perl_sv_catpvf(aTHX_ t, ">"); @@ -751,8 +808,7 @@ Perl_dump_sub_perl(pTHX_ const GV *gv, b PERL_ARGS_ASSERT_DUMP_SUB_PERL; - cv = isGV_with_GP(gv) ? GvCV(gv) : - (assert(SvROK((SV*)gv)), (CV*)SvRV((SV*)gv)); + cv = isGV_with_GP(gv) ? GvCV(gv) : CV_FROM_REF((SV*)gv); if (justperl && (CvISXSUB(cv) || !CvROOT(cv))) return; @@ -824,10 +880,8 @@ S_gv_display(pTHX_ GV *gv) if (isGV_with_GP(gv)) gv_fullname3(raw, gv, NULL); else { - assert(SvROK(gv)); - assert(SvTYPE(SvRV(gv)) == SVt_PVCV); Perl_sv_catpvf(aTHX_ raw, "cv ref: %s", - SvPV_nolen_const(cv_name((CV *)SvRV(gv), name, 0))); + SvPV_nolen_const(cv_name(CV_FROM_REF((SV*)gv), name, 0))); } rawpv = SvPV_const(raw, len); generic_pv_escape(name, rawpv, len, SvUTF8(raw)); @@ -1255,7 +1309,7 @@ S_do_op_dump_bar(pTHX_ I32 level, UV bar /* with ITHREADS, consts are stored in the pad, and the right pad * may not be active here, so skip */ S_opdump_indent(aTHX_ o, level, bar, file, "SV = %s\n", - SvPEEK(cMETHOPx_meth(o))); + SvPEEK(cMETHOPo_meth)); #endif break; case OP_NULL: @@ -1265,8 +1319,8 @@ S_do_op_dump_bar(pTHX_ I32 level, UV bar case OP_NEXTSTATE: case OP_DBSTATE: if (CopLINE(cCOPo)) - S_opdump_indent(aTHX_ o, level, bar, file, "LINE = %" UVuf "\n", - (UV)CopLINE(cCOPo)); + S_opdump_indent(aTHX_ o, level, bar, file, "LINE = %" LINE_Tf "\n", + CopLINE(cCOPo)); if (CopSTASHPV(cCOPo)) { SV* tmpsv = newSVpvs_flags("", SVs_TEMP); @@ -1288,6 +1342,11 @@ S_do_op_dump_bar(pTHX_ I32 level, UV bar generic_pv_escape( tmpsv, label, label_len, (label_flags & SVf_UTF8))); } + /* add hints and features if set */ + if (cCOPo->cop_hints) + S_opdump_indent(aTHX_ o, level, bar, file, "HINTS = %08x\n",cCOPo->cop_hints); + if (cCOPo->cop_features) + S_opdump_indent(aTHX_ o, level, bar, file, "FEATS = %08x\n",cCOPo->cop_features); S_opdump_indent(aTHX_ o, level, bar, file, "SEQ = %u\n", (unsigned int)cCOPo->cop_seq); @@ -1647,7 +1706,7 @@ Perl_do_gv_dump(pTHX_ I32 level, PerlIO PERL_ARGS_ASSERT_DO_GV_DUMP; Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv)); - if (sv && GvNAME(sv)) { + if (sv) { SV * const tmpsv = newSVpvs(""); PerlIO_printf(file, "\t\"%s\"\n", generic_pv_escape( tmpsv, GvNAME(sv), GvNAMELEN(sv), GvNAMEUTF8(sv) )); @@ -1662,7 +1721,7 @@ Perl_do_gvgv_dump(pTHX_ I32 level, PerlI PERL_ARGS_ASSERT_DO_GVGV_DUMP; Perl_dump_indent(aTHX_ level, file, "%s = 0x%" UVxf, name, PTR2UV(sv)); - if (sv && GvNAME(sv)) { + if (sv) { SV *tmp = newSVpvs_flags("", SVs_TEMP); const char *hvname; HV * const stash = GvSTASH(sv); @@ -1710,7 +1769,7 @@ const struct flag_to_name cv_flags_names {CVf_CONST, "CONST,"}, {CVf_NODEBUG, "NODEBUG,"}, {CVf_LVALUE, "LVALUE,"}, - {CVf_METHOD, "METHOD,"}, + {CVf_NOWARN_AMBIGUOUS, "NOWARN_AMBIGUOUS,"}, {CVf_WEAKOUTSIDE, "WEAKOUTSIDE,"}, {CVf_CVGV_RC, "CVGV_RC,"}, {CVf_DYNFILE, "DYNFILE,"}, @@ -1719,7 +1778,12 @@ const struct flag_to_name cv_flags_names {CVf_SLABBED, "SLABBED,"}, {CVf_NAMED, "NAMED,"}, {CVf_LEXICAL, "LEXICAL,"}, - {CVf_ISXSUB, "ISXSUB,"} + {CVf_ISXSUB, "ISXSUB,"}, + {CVf_ANONCONST, "ANONCONST,"}, + {CVf_SIGNATURE, "SIGNATURE,"}, + {CVf_REFCOUNTED_ANYSV, "REFCOUNTED_ANYSV,"}, + {CVf_IsMETHOD, "IsMETHOD,"} + }; const struct flag_to_name hv_flags_names[] = { @@ -1949,8 +2013,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO /* Dump general SV fields */ - if ((type >= SVt_PVIV && type != SVt_PVAV && type != SVt_PVHV - && type != SVt_PVCV && type != SVt_PVFM && type != SVt_PVIO + if ((type >= SVt_PVIV && type <= SVt_PVLV && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv)) || (type == SVt_IV && !SvROK(sv))) { if (SvIsUV(sv) @@ -1961,9 +2024,8 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO (void)PerlIO_putc(file, '\n'); } - if ((type >= SVt_PVNV && type != SVt_PVAV && type != SVt_PVHV - && type != SVt_PVCV && type != SVt_PVFM && type != SVt_REGEXP - && type != SVt_PVIO && !isGV_with_GP(sv) && !SvVALID(sv)) + if ((type >= SVt_PVNV && type <= SVt_PVLV + && type != SVt_REGEXP && !isGV_with_GP(sv) && !SvVALID(sv)) || type == SVt_NV) { DECLARATION_FOR_LC_NUMERIC_MANIPULATION; STORE_LC_NUMERIC_SET_STANDARD(); @@ -2091,7 +2153,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO break; case SVt_PVHV: { U32 totalkeys; - if (SvOOK(sv)) { + if (HvHasAUX(sv)) { struct xpvhv_aux *const aux = HvAUX(sv); Perl_dump_indent(aTHX_ level, file, " AUX_FLAGS = %" UVuf "\n", (UV)aux->xhv_aux_flags); @@ -2175,7 +2237,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO } Perl_dump_indent(aTHX_ level, file, " MAX = %" IVdf "\n", (IV)HvMAX(sv)); - if (SvOOK(sv)) { + if (HvHasAUX(sv)) { Perl_dump_indent(aTHX_ level, file, " RITER = %" IVdf "\n", (IV)HvRITER_get(sv)); Perl_dump_indent(aTHX_ level, file, " EITER = 0x%" UVxf "\n", @@ -2205,7 +2267,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO HvNAMELEN(sv), HvNAMEUTF8(sv))); } } - if (SvOOK(sv)) { + if (HvHasAUX(sv)) { AV * const backrefs = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(sv)); struct mro_meta * const meta = HvAUX(sv)->xhv_mro_meta; @@ -2470,7 +2532,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO " (%s)\n", (UV)GvGPFLAGS(sv), ""); - Perl_dump_indent(aTHX_ level, file, " LINE = %" IVdf "\n", (IV)GvLINE(sv)); + Perl_dump_indent(aTHX_ level, file, " LINE = %" LINE_Tf "\n", (line_t)GvLINE(sv)); Perl_dump_indent(aTHX_ level, file, " FILE = \"%s\"\n", GvFILE(sv)); do_gv_dump (level, file, " EGV", GvEGV(sv)); break; @@ -2548,55 +2610,128 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf " (%s)\n", (UV)(r->intflags), SvPVX_const(d)); } else { - Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf "\n", + Perl_dump_indent(aTHX_ level, file, " INTFLAGS = 0x%" UVxf "(Plug in)\n", (UV)(r->intflags)); } #undef SV_SET_STRINGIFY_REGEXP_FLAGS Perl_dump_indent(aTHX_ level, file, " NPARENS = %" UVuf "\n", (UV)(r->nparens)); + Perl_dump_indent(aTHX_ level, file, " LOGICAL_NPARENS = %" UVuf "\n", + (UV)(r->logical_nparens)); + +#define SV_SET_STRINGIFY_I32_PAREN_ARRAY(d,count,ary) \ + STMT_START { \ + U32 n; \ + sv_setpv(d,"{ "); \ + /* 0 element is irrelevant */ \ + for(n=0; n <= count; n++) \ + sv_catpvf(d,"%" IVdf "%s", \ + (IV)ary[n], \ + n == count ? "" : ", "); \ + sv_catpvs(d," }\n"); \ + } STMT_END + + Perl_dump_indent(aTHX_ level, file, " LOGICAL_TO_PARNO = 0x%" UVxf "\n", + PTR2UV(r->logical_to_parno)); + if (r->logical_to_parno) { + SV_SET_STRINGIFY_I32_PAREN_ARRAY(d, r->logical_nparens, r->logical_to_parno); + Perl_dump_indent(aTHX_ level, file, " %" SVf, d); + } + Perl_dump_indent(aTHX_ level, file, " PARNO_TO_LOGICAL = 0x%" UVxf "\n", + PTR2UV(r->parno_to_logical)); + if (r->parno_to_logical) { + SV_SET_STRINGIFY_I32_PAREN_ARRAY(d, r->nparens, r->parno_to_logical); + Perl_dump_indent(aTHX_ level, file, " %" SVf, d); + } + + Perl_dump_indent(aTHX_ level, file, " PARNO_TO_LOGICAL_NEXT = 0x%" UVxf "\n", + PTR2UV(r->parno_to_logical_next)); + if (r->parno_to_logical_next) { + SV_SET_STRINGIFY_I32_PAREN_ARRAY(d, r->nparens, r->parno_to_logical_next); + Perl_dump_indent(aTHX_ level, file, " %" SVf, d); + } +#undef SV_SET_STRINGIFY_I32_ARRAY + Perl_dump_indent(aTHX_ level, file, " LASTPAREN = %" UVuf "\n", - (UV)(r->lastparen)); + (UV)(RXp_LASTPAREN(r))); Perl_dump_indent(aTHX_ level, file, " LASTCLOSEPAREN = %" UVuf "\n", - (UV)(r->lastcloseparen)); + (UV)(RXp_LASTCLOSEPAREN(r))); Perl_dump_indent(aTHX_ level, file, " MINLEN = %" IVdf "\n", - (IV)(r->minlen)); + (IV)(RXp_MINLEN(r))); Perl_dump_indent(aTHX_ level, file, " MINLENRET = %" IVdf "\n", - (IV)(r->minlenret)); + (IV)(RXp_MINLENRET(r))); Perl_dump_indent(aTHX_ level, file, " GOFS = %" UVuf "\n", - (UV)(r->gofs)); + (UV)(RXp_GOFS(r))); Perl_dump_indent(aTHX_ level, file, " PRE_PREFIX = %" UVuf "\n", - (UV)(r->pre_prefix)); + (UV)(RXp_PRE_PREFIX(r))); Perl_dump_indent(aTHX_ level, file, " SUBLEN = %" IVdf "\n", - (IV)(r->sublen)); + (IV)(RXp_SUBLEN(r))); Perl_dump_indent(aTHX_ level, file, " SUBOFFSET = %" IVdf "\n", - (IV)(r->suboffset)); + (IV)(RXp_SUBOFFSET(r))); Perl_dump_indent(aTHX_ level, file, " SUBCOFFSET = %" IVdf "\n", - (IV)(r->subcoffset)); - if (r->subbeg) + (IV)(RXp_SUBCOFFSET(r))); + if (RXp_SUBBEG(r)) Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x%" UVxf " %s\n", - PTR2UV(r->subbeg), - pv_display(d, r->subbeg, r->sublen, 50, pvlim)); + PTR2UV(RXp_SUBBEG(r)), + pv_display(d, RXp_SUBBEG(r), RXp_SUBLEN(r), 50, pvlim)); else Perl_dump_indent(aTHX_ level, file, " SUBBEG = 0x0\n"); - Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%" UVxf "\n", - PTR2UV(r->mother_re)); - if (nest < maxnest && r->mother_re) - do_sv_dump(level+1, file, (SV *)r->mother_re, nest+1, - maxnest, dumpops, pvlim); Perl_dump_indent(aTHX_ level, file, " PAREN_NAMES = 0x%" UVxf "\n", - PTR2UV(r->paren_names)); + PTR2UV(RXp_PAREN_NAMES(r))); Perl_dump_indent(aTHX_ level, file, " SUBSTRS = 0x%" UVxf "\n", - PTR2UV(r->substrs)); + PTR2UV(RXp_SUBSTRS(r))); Perl_dump_indent(aTHX_ level, file, " PPRIVATE = 0x%" UVxf "\n", - PTR2UV(r->pprivate)); + PTR2UV(RXp_PPRIVATE(r))); Perl_dump_indent(aTHX_ level, file, " OFFS = 0x%" UVxf "\n", - PTR2UV(r->offs)); + PTR2UV(RXp_OFFSp(r))); + if (RXp_OFFSp(r)) { + U32 n; + sv_setpvs(d,"[ "); + /* note offs[0] is for the whole match, and + * the data for $1 is in offs[1]. Thus we have to + * show one more than we have nparens. */ + for(n = 0; n <= r->nparens; n++) { + sv_catpvf(d,"%" IVdf ":%" IVdf "%s", + (IV)RXp_OFFSp(r)[n].start, (IV)RXp_OFFSp(r)[n].end, + n+1 > r->nparens ? " ]\n" : ", "); + } + Perl_dump_indent(aTHX_ level, file, " %" SVf, d); + } Perl_dump_indent(aTHX_ level, file, " QR_ANONCV = 0x%" UVxf "\n", - PTR2UV(r->qr_anoncv)); + PTR2UV(RXp_QR_ANONCV(r))); #ifdef PERL_ANY_COW Perl_dump_indent(aTHX_ level, file, " SAVED_COPY = 0x%" UVxf "\n", - PTR2UV(r->saved_copy)); + PTR2UV(RXp_SAVED_COPY(r))); #endif + /* this should go LAST or the output gets really confusing */ + Perl_dump_indent(aTHX_ level, file, " MOTHER_RE = 0x%" UVxf "\n", + PTR2UV(RXp_MOTHER_RE(r))); + if (nest < maxnest && RXp_MOTHER_RE(r)) + do_sv_dump(level+1, file, (SV *)RXp_MOTHER_RE(r), nest+1, + maxnest, dumpops, pvlim); + } + break; + case SVt_PVOBJ: + Perl_dump_indent(aTHX_ level, file, " MAXFIELD = %" IVdf "\n", + (IV)ObjectMAXFIELD(sv)); + Perl_dump_indent(aTHX_ level, file, " FIELDS = 0x%" UVxf "\n", + PTR2UV(ObjectFIELDS(sv))); + if (nest < maxnest && ObjectFIELDS(sv)) { + SSize_t count; + SV **svp = ObjectFIELDS(sv); + PADNAME **pname = PadnamelistARRAY(HvAUX(SvSTASH(sv))->xhv_class_fields); + for (count = 0; + count <= ObjectMAXFIELD(sv) && count < maxnest; + count++, svp++) + { + SV *const field = *svp; + PADNAME *pn = pname[count]; + + Perl_dump_indent(aTHX_ level + 1, file, "Field No. %" IVdf " (%s)\n", + (IV)count, PadnamePV(pn)); + + do_sv_dump(level+1, file, field, nest+1, maxnest, dumpops, pvlim); + } } break; } @@ -2608,7 +2743,38 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO Dumps the contents of an SV to the C filehandle. -For an example of its output, see L. +For an example of its output, see L. If +the item is an SvROK it will dump items to a depth of 4, +otherwise it will dump only the top level item, which +means that it will not dump the contents of an AV * or +HV *. For that use C or C. + +=for apidoc sv_dump_depth + +Dumps the contents of an SV to the C filehandle +to the depth requested. This function can be used on any +SV derived type (GV, HV, AV) with an appropriate cast. +This is a more flexible variant of sv_dump(). For example + + HV *hv = ...; + sv_dump_depth((SV*)hv, 2); + +would dump the hv, its keys and values, but would not recurse +into any RV values. + +=for apidoc av_dump + +Dumps the contents of an AV to the C filehandle, +Similar to using Devel::Peek on an arrayref but does not +expect an RV wrapper. Dumps contents to a depth of 3 levels +deep. + +=for apidoc hv_dump + +Dumps the contents of an HV to the C filehandle. +Similar to using Devel::Peek on an hashref but does not +expect an RV wrapper. Dumps contents to a depth of 3 levels +deep. =cut */ @@ -2617,9 +2783,27 @@ void Perl_sv_dump(pTHX_ SV *sv) { if (sv && SvROK(sv)) - do_sv_dump(0, Perl_debug_log, sv, 0, 4, 0, 0); + sv_dump_depth(sv, 4); else - do_sv_dump(0, Perl_debug_log, sv, 0, 0, 0, 0); + sv_dump_depth(sv, 0); +} + +void +Perl_sv_dump_depth(pTHX_ SV *sv, I32 depth) +{ + do_sv_dump(0, Perl_debug_log, sv, 0, depth, 0, 0); +} + +void +Perl_av_dump(pTHX_ AV *av) +{ + sv_dump_depth((SV*)av, 3); +} + +void +Perl_hv_dump(pTHX_ HV *hv) +{ + sv_dump_depth((SV*)hv, 3); } int Index: gnu/usr.bin/perl/ebcdic_tables.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ebcdic_tables.h,v diff -u -p -a -u -p -r1.5 ebcdic_tables.h --- gnu/usr.bin/perl/ebcdic_tables.h 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/ebcdic_tables.h 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! * This file is built by regen/ebcdic.pl. * Any changes made here will be lost! @@ -258,31 +258,6 @@ SOFTWARE. }; # endif -# ifndef DOINIT - EXT U8 PL_fold_locale[256]; -# else - EXT U8 PL_fold_locale[256] = { -/* _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E _F*/ -/*0_*/0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, -/*1_*/0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, -/*2_*/0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, -/*3_*/0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, -/*4_*/0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, -/*5_*/0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, -/*6_*/0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, -/*7_*/0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, -/*8_*/0x80,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, -/*9_*/0x90,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, -/*A_*/0xA0,0xA1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, -/*B_*/0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, -/*C_*/0xC0,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, -/*D_*/0xD0,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, -/*E_*/0xE0,0xE1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, -/*F_*/0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF -/* _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E _F*/ -}; -# endif - /* Index is EBCDIC 1047 code point; value is its other fold-pair equivalent * (A => a; a => A, etc) in the 0-255 range. If no such equivalent, value is * the code point itself */ @@ -661,31 +636,6 @@ SOFTWARE. }; # endif -# ifndef DOINIT - EXT U8 PL_fold_locale[256]; -# else - EXT U8 PL_fold_locale[256] = { -/* _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E _F*/ -/*0_*/0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, -/*1_*/0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, -/*2_*/0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, -/*3_*/0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, -/*4_*/0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, -/*5_*/0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, -/*6_*/0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, -/*7_*/0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, -/*8_*/0x80,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, -/*9_*/0x90,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, -/*A_*/0xA0,0xA1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, -/*B_*/0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, -/*C_*/0xC0,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, -/*D_*/0xD0,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, -/*E_*/0xE0,0xE1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, -/*F_*/0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF -/* _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E _F*/ -}; -# endif - /* Index is EBCDIC 037 code point; value is its other fold-pair equivalent * (A => a; a => A, etc) in the 0-255 range. If no such equivalent, value is * the code point itself */ @@ -845,4 +795,4 @@ SOFTWARE. #endif /* PERL_EBCDIC_TABLES_H_ */ -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/embed.fnc =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/embed.fnc,v diff -u -p -a -u -p -r1.14 embed.fnc --- gnu/usr.bin/perl/embed.fnc 8 Jul 2023 14:18:35 -0000 1.14 +++ gnu/usr.bin/perl/embed.fnc 21 Feb 2024 15:47:02 -0000 @@ -69,50 +69,69 @@ : macros can't be generated in such situations. : : WARNING: Any macro created in a header file is visible to XS code, unless -: care is taken to wrap it within something like #ifdef PERL_CORE..#endif. -: This has had to be done with things like MAX and MIN, but nearly everything -: else has been created without regard to the namespace pollution problem. -: -: Here's what else you need to know about using this file with regards to name -: space pollution: -: -: The A flag is used to make a function and its short name visible everywhere -: on all platforms. This should be used to make it part of Perl's -: API contract with XS developers. The documentation for these is -: usually placed in perlapi. If no documentation exists, that fact -: is also noted in perlapi. -: -: The C flag is used instead for functions and their short names that need to -: be accessible everywhere, typically because they are called from a -: publicly available macro or inline function, but they are not for -: public use by themselves. The documentation for these is placed -: in perlintern. If no documentation exists, that fact is also -: noted in perlintern. -: -: These really need the 'p' flag to avoid name space collisions. -: -: Some of these have been constructed so that the wrapper macro -: names begin with an underscore to lessen the chances of a name -: collision. However, this is contrary to the C standard, and those -: should be changed. -: -: The E flag is used instead for a function and its short name that is supposed -: to be used only in the core plus extensions compiled with the -: PERL_EXT symbol defined. Again, on some platforms, the function -: will be visible everywhere, so one of the 'p' or 'S' flags is -: generally needed. Also note that an XS writer can always cheat -: and pretend to be an extension by #defining PERL_EXT. -: -: The X flag is similar to the C flag in that the function (whose entry better -: have the 'p' flag) is accessible everywhere on all platforms. -: However the short name macro that normally gets generated is -: suppressed outside the core. (Except it is also visible in -: PERL_EXT extensions if the E flag is also specified.) This flag -: is used for functions that are called from a public macro, the -: name of which isn't derived from the function name. You'll have -: to write the macro yourself, and from within it, refer to the -: function in its full 'Perl_' form with any necessary thread -: context parameter. +: care is taken to wrap it within C preprocessor guards like the following +: +: #if defined(PERL_CORE) +: ... +: #endif +: +: A common pattern is to use defines like 'PERL_IN_FILE_C' (with FILE_C being +: appropriately replaced with the real filename). Most, if not all, of the +: perl core C files define such a symbol before importing perl.h. Some groups +: of files define more generalized flags which are referenced in this file and +: the files generated from it. +: +: In general you should restrict the exposure of your exports as much as +: possible, although older code may not do so. Be aware that non-static +: exports can be "over exported" and things will likely work out fine, but +: inline and static macros will cause errors unless restricted to the specific +: file they are intended for, and the generated PERL_ARGS_ macros will only +: be available to inline functions in the appropriate context. +: +: From time to time it may be necessary to change or expand which files can +: see a function, therefore we prefer the '#if defined()' form of condition +: instead of the '#ifdef' form as the latter only works with one symbol and +: the former can be combined with more than one. It is also why you may see +: functions with an 's' or 'i' export type grouped together into a single +: conditional block separate from most of the other functions from the same +: file with 'p' in them. +: +: The 'A' flag is used to make a function and its short name visible everywhere +: on all platforms. This should be used to make it part of Perl's API +: contract with XS developers. The documentation for these is usually +: placed in perlapi. If no documentation exists, that fact is also +: noted in perlapi. +: +: The 'C' flag is used instead for functions and their short names that need to +: be accessible everywhere, typically because they are called from a +: publicly available macro or inline function, but they are not for +: public use by themselves. The documentation for these is placed in +: perlintern. If no documentation exists, that fact is also noted in +: perlintern. +: +: These really need the 'p' flag to avoid name space collisions. +: +: Some of these have been constructed so that the wrapper macro names +: begin with an underscore to lessen the chances of a name collision. +: However, this is contrary to the C standard, and those should be +: changed. +: +: The 'E' flag is used instead for a function and its short name that is +: supposed to be used only in the core plus extensions compiled with +: the PERL_EXT symbol defined. Again, on some platforms, the function +: will be visible everywhere, so one of the 'p' or 'S' flags is +: generally needed. Also note that an XS writer can always cheat and +: pretend to be an extension by #defining PERL_EXT. +: +: The 'X' flag is similar to the 'C' flag in that the function (whose entry +: better have the 'p' flag) is accessible everywhere on all platforms. +: However the short name macro that normally gets generated is +: suppressed outside the core. (Except it is also visible in PERL_EXT +: extensions if the 'E' flag is also specified.) This flag is used for +: functions that are called from a public macro, the name of which +: isn't derived from the function name. You'll have to write the macro +: yourself, and from within it, refer to the function in its full +: 'Perl_' form with any necessary thread context parameter. : : Just below is a description of the relevant parts of the automatic : documentation generation system which heavily involves this file. Below that @@ -141,7 +160,8 @@ : the same entry. This avoids needless repetition, making the pod shorter, and : makes it easier to compare and contrast the different forms, and less jumping : around the pod file for the person reading it. The apidoc_item lines must -: all come after the apidoc line and before the pod for the entry. +: all come after the apidoc line and before the pod for the entry. There need +: not be empty lines between the apidoc line and any of its apidoc_item lines. : : The entries in this file that have corresponding '=for apidoc' entries must : have the 'd' flag set in this file. @@ -236,318 +256,342 @@ : : The remainder of these introductory comments detail all the possible flags: : -: A Both long and short names are accessible fully everywhere (usually part -: of the public API). If the function is not part of the public API, -: instead use C, E, or X. -: -: add entry to the list of symbols available on all platforms -: unless e or m are also specified; -: any doc entry goes in perlapi.pod rather than perlintern.pod. If -: there isn't a doc entry, autodoc.pl lists this in perlapi as -: existing and being undocumented; unless x is also specified, in -: which case it simply isn't listed. -: makes the short name defined for everywhere, not just for -: PERL_CORE/PERL_EXT -: -: a Allocates memory a la malloc/calloc. Also implies "R". This flag -: should only be on a function which returns 'empty' memory which has no -: other pointers to it, and which does not contain any pointers to other -: things. So for example realloc() can't be 'a'. -: -: proto.h: add __attribute__malloc__ -: -: b Binary backward compatibility. This is used for functions which are -: kept only to not have to change legacy applications that call them. If -: there are no such legacy applications in a Perl installation for all -: functions flagged with this, the installation can run Configure with the -: -Accflags='-DNO_MATHOMS' parameter to not even compile them. -: -: Sometimes the function has been subsumed by a more general one (say, by -: adding a flags parameter), and a macro exists with the original short -: name API, and it calls the new function, bypassing this one, and the -: original 'Perl_' form is being deprecated. In this case also specify -: the 'M' flag. -: -: Without the M flag, these functions should be deprecated, and it is an -: error to not also specify the 'D' flag. -: -: The 'b' functions are normally moved to mathoms.c, but if circumstances -: dictate otherwise, they can be anywhere, provided the whole function is -: wrapped with +: 'A' Both long and short names are accessible fully everywhere (usually +: part of the public API). If the function is not part of the public +: API, instead use 'C', 'E', or 'X'. +: +: * adds entry to the list of symbols available on all platforms unless +: 'e' or 'm' are also specified; +: * any doc entry goes in perlapi.pod rather than perlintern.pod. If +: there isn't a doc entry, autodoc.pl lists this in perlapi as +: existing and being undocumented; unless 'x' is also specified, in +: which case it simply isn't listed. +: * makes the short name defined for everywhere, not just for PERL_CORE +: or PERL_EXT +: +: 'a' Allocates memory a la malloc/calloc. Also implies 'R'. This flag +: should only be on a function which returns "empty" memory which has no +: other pointers to it, and which does not contain any pointers to other +: things. So for example realloc() can not be 'a'. +: +: proto.h: add __attribute__malloc__ +: +: 'b' Binary backward compatibility. This is used for functions which are +: kept only to not have to change legacy applications that call them. If +: there are no such legacy applications in a Perl installation for all +: functions flagged with this, the installation can run Configure with +: the -Accflags='-DNO_MATHOMS' parameter to not even compile them. +: +: Sometimes the function has been subsumed by a more general one (say, +: by adding a flags parameter), and a macro exists with the original +: short name API, and it calls the new function, bypassing this one, and +: the original 'Perl_' form is being deprecated. In this case also +: specify the 'M' flag. +: +: Without the M flag, these functions should be deprecated, and it is an +: error to not also specify the 'D' flag. +: +: The 'b' functions are normally moved to mathoms.c, but if +: circumstances dictate otherwise, they can be anywhere, provided the +: whole function is wrapped with +: : #ifndef NO_MATHOMS : ... : #endif : -: Note that this flag no longer automatically adds a 'Perl_' prefix to the -: name. Additionally specify 'p' to do that. +: Note that this flag no longer automatically adds a 'Perl_' prefix to +: the name. Additionally specify 'p' to do that. : -: This flag effectively causes nothing to happen if the perl interpreter -: is compiled with -DNO_MATHOMS (which causes any functions with this flag -: to not be compiled); otherwise these happen: -: add entry to the list of symbols available on all platforms; -: create PERL_ARGS_ASSERT_foo; -: add embed.h entry (unless overridden by the 'M' or 'o' flags) -: -: C Intended for core use only. This indicates to XS writers that they -: shouldn't be using this function. Devel::PPPort informs them of this, -: for example. Some functions have to be accessible everywhere even if -: they are not intended for public use. An example is helper functions -: that are called from inline ones that are publicly available. -: -: add entry to the list of symbols available on all platforms -: unless e or m are also specified; -: any doc entry goes in perlintern.pod rather than perlapi.pod. If -: there isn't a doc entry, autodoc.pl lists this in perlintern as -: existing and being undocumented -: makes the short name defined for everywhere, not just for -: PERL_CORE/PERL_EXT -: -: D Function is deprecated: -: -: proto.h: add __attribute__deprecated__ -: autodoc.pl adds a note to this effect in the doc entry +: This flag effectively causes nothing to happen if the perl interpreter +: is compiled with -DNO_MATHOMS (which causes any functions with this +: flag to not be compiled); otherwise these happen: +: +: * add entry to the list of symbols available on all platforms; +: * create PERL_ARGS_ASSERT_foo; +: * add embed.h entry (unless overridden by the 'M' or 'o' flags) +: +: 'C' Intended for core use only. This indicates to XS writers that they +: shouldn't be using this function. Devel::PPPort informs them of this, +: for example. Some functions have to be accessible everywhere even if +: they are not intended for public use. An example is helper functions +: that are called from inline ones that are publicly available. +: +: * add entry to the list of symbols available on all platforms unless e +: or m are also specified; +: * any doc entry goes in perlintern.pod rather than perlapi.pod. If +: there isn't a doc entry, autodoc.pl lists this in perlintern as +: existing and being undocumented +: * makes the short name defined for everywhere, not just for PERL_CORE +: or PERL_EXT +: +: 'D' Function is deprecated: +: +: proto.h: add __attribute__deprecated__ +: autodoc.pl adds a note to this effect in the doc entry : -: d Function has documentation (somewhere) in the source: +: 'd' Function has documentation (somewhere) in the source: : -: enables 'no docs for foo" warning in autodoc.pl if the documentation -: isn't found. +: Enables 'no docs for foo" warning in autodoc.pl if the documentation +: isn't found. : -: E Visible to extensions included in the Perl core: +: 'E' Visible to extensions included in the Perl core: : : in embed.h, change "#ifdef PERL_CORE" : into "#if defined(PERL_CORE) || defined(PERL_EXT)" : -: To be usable from dynamically loaded extensions, either: -: 1) it must be static to its containing file ("i" or "S" flag); or -: 2) be combined with the "X" flag. +: To be usable from dynamically loaded extensions, either: +: 1) it must be static to its containing file ('i' or 'S' flag); or +: 2) be combined with the 'X' flag. : -: e Not exported +: 'e' Not exported : : suppress entry in the list of symbols available on all platforms : -: f Function takes a format string. If the function name =~ qr/strftime/ -: then it is assumed to take a strftime-style format string as the 1st -: arg; otherwise it's assumed to take a printf style format string, not -: necessarily the 1st arg. All the arguments following it (including -: possibly '...') are assumed to be for the format. +: 'f' Function takes a format string. If the function name =~ qr/strftime/ +: then it is assumed to take a strftime-style format string as the 1st +: arg; otherwise it's assumed to take a printf style format string, not +: necessarily the 1st arg. All the arguments following the second form +: (including possibly '...') are assumed to be for the format. : -: embed.h: any entry in here is suppressed because of varargs +: embed.h: any entry in here for the second form is suppressed because +: of varargs : proto.h: add __attribute__format__ (or ...null_ok__) : -: F Function has a '...' parameter, but don't assume it is a format. This -: is to make sure that new functions with formats can't be added without -: considering if they are format functions or not. A reason to use this -: flag even on a format function is if the format would generate -: error: format string argument is not a string type -: -: G Suppress empty PERL_ARGS_ASSERT_foo macro. Normally such a macro is -: generated for all entries for functions 'foo' in this file. If there is -: a pointer argument to 'foo', it needs to be declared in this file as -: either NN or NULLOK, and the function definition must call its -: corresponding PERL_ARGS_ASSERT_foo macro (a porting test ensures this) -: which asserts at runtime (under DEBUGGING builds) that NN arguments are -: not NULL. If there aren't NN arguments, use of this macro is optional. -: Rarely, a function will define its own PERL_ARGS_ASSERT_foo macro, and -: in those cases, adding this flag to its entry in this file will suppress -: the normal one. It is not possible to suppress the generated macro if -: it isn't optional, that is, if there is at least one NN argument. +: 'F' Function has a '...' parameter, but don't assume it is a format. This +: is to make sure that new functions with formats can't be added without +: considering if they are format functions or not. A reason to use this +: flag even on a format function is if the format would generate error: +: format string argument is not a string type +: +: 'G' Suppress empty PERL_ARGS_ASSERT_foo macro. Normally such a macro is +: generated for all entries for functions 'foo' in this file. If there +: is a pointer argument to 'foo', it needs to be declared in this file +: as either NN or NULLOK, and the function definition must call its +: corresponding PERL_ARGS_ASSERT_foo macro (a porting test ensures this) +: which asserts at runtime (under DEBUGGING builds) that NN arguments +: are not NULL. If there aren't NN arguments, use of this macro is +: optional. Rarely, a function will define its own PERL_ARGS_ASSERT_foo +: macro, and in those cases, adding this flag to its entry in this file +: will suppress the normal one. It is not possible to suppress the +: generated macro if it isn't optional, that is, if there is at least +: one NN argument. : -: proto.h: PERL_ARGS_ASSERT macro is not defined unless the function +: proto.h: PERL_ARGS_ASSERT macro is not defined unless the function : has NN arguments : -: h Hide any documentation that would normally go into perlapi or -: perlintern. This is typically used when the documentation is actually -: in another pod. If you don't use the 'h', that documentation is -: displayed in both places; with the flag, it stays in the pod, and a -: link to that pod is instead placed in perlapi or perlintern. This -: allows one to browse perlapi or perlintern and see all the potentially -: relevant elements. A good example is perlapio. It has documentation -: about PerlIO functions with other text giving context. There's no point -: in writing a second entry for perlapi, but it would be good if someone -: browsing perlapi knew about the function and where it is documented. By -: adding '=for apidoc' lines in perlapio, the appropriate text could be -: simply copied into perlapi if deemed appropriate, or just a link added -: there when the 'h' flag is specified. -: This flag is useful for symbolic names for flags. A single =for apidoc -: line can be added to the pod where the meaning is discussed, and perlapi -: will list the name, with a link to the pod. Another use would be if -: there are a bunch of macros which follow a common paradigm in their -: naming, so rather than having an entry for each slight variation, there -: is an overarching one. This flag is useful for downstream programs, -: such as Devel::PPPort. -: -: i inline static. This is used for functions that the compiler is being -: requested to inline. If the function is in a header file its -: definition will be visible (unless guarded by #if..#endif) to all -: XS code. (A typical guard will be that it is being included in a -: particular C file(s) or in the perl core.) Therefore, all -: non-guarded functions should also have the 'p' flag specified to avoid -: polluting the XS code name space. Otherwise an error is generated if -: the 'S' flag is not also specified. -: -: proto.h: function is declared as PERL_STATIC_INLINE -: -: I This flag works exactly the same as 'i' but it also adds -: __attribute__((always_inline)) or __forceinline if either of them is -: supported by the compiler. +: 'h' Hide any documentation that would normally go into perlapi or +: perlintern. This is typically used when the documentation is actually +: in another pod. If you don't use the 'h', that documentation is +: displayed in both places; with the flag, it stays in the pod, and a +: link to that pod is instead placed in perlapi or perlintern. This +: allows one to browse perlapi or perlintern and see all the potentially +: relevant elements. A good example is perlapio. It has documentation +: about PerlIO functions with other text giving context. There's no +: point in writing a second entry for perlapi, but it would be good if +: someone browsing perlapi knew about the function and where it is +: documented. By adding '=for apidoc' lines in perlapio, the appropriate +: text could be simply copied into perlapi if deemed appropriate, or +: just a link added there when the 'h' flag is specified. +: +: This flag is useful for symbolic names for flags. A single =for apidoc +: line can be added to the pod where the meaning is discussed, and +: perlapi will list the name, with a link to the pod. Another use would +: be if there are a bunch of macros which follow a common paradigm in +: their naming, so rather than having an entry for each slight +: variation, there is an overarching one. This flag is useful for +: downstream programs, such as Devel::PPPort. +: +: 'i' inline static. This is used for functions that the compiler is being +: requested to inline. If the function is in a header file its +: definition will be visible (unless guarded by #if..#endif) to all XS +: code. (A typical guard will be that it is being included in a +: particular C file(s) or in the perl core.) Therefore, all non-guarded +: functions should also have the 'p' flag specified to avoid polluting +: the XS code name space. Otherwise an error is generated if the 'S' +: flag is not also specified. +: +: proto.h: function is declared as PERL_STATIC_INLINE +: +: 'I' This flag works exactly the same as 'i' but it also adds +: __attribute__((always_inline)) or __forceinline if either of them is +: supported by the compiler. : -: proto.h: function is declared as PERL_STATIC_FORCE_INLINE and +: proto.h: function is declared as PERL_STATIC_FORCE_INLINE and : __attribute__always_inline__ is added : -: m Implemented as a macro; there is no function associated with this name, -: and hence no long Perl_ or S_ name. However, if the macro name itself -: begins with 'Perl_', autodoc.pl will show a thread context parameter -: unless the 'T' flag is specified. +: 'm' Implemented as a macro; there is no function associated with this +: name, and hence no long Perl_ or S_ name. However, if the macro name +: itself begins with 'Perl_', autodoc.pl will show a thread context +: parameter unless the 'T' flag is specified. : : suppress proto.h entry (actually, not suppressed, but commented out) : suppress entry in the list of exported symbols available on all platforms : suppress embed.h entry, as the implementation should furnish the macro : -: M The implementation is furnishing its own macro instead of relying on the -: default short name macro that simply expands to call the real name -: function. This is used if the parameters need to be cast from what the -: caller has, or if there is a macro that bypasses this function (whose -: long name is being retained for backward compatibility for those who -: call it with that name). An example is when a new function is created -: with an extra parameter and a wrapper macro is added that has the old -: API, but calls the new one with the exta parameter set to a default. +: 'M' The implementation is furnishing its own macro instead of relying on +: the automatically generated short name macro (which simply expands to +: call the real name function). One reason to do this is if the +: parameters need to be cast from what the caller has, or if there is a +: macro that bypasses this function (whose long name is being retained +: for backward compatibility for those who call it with that name). An +: example is when a new function is created with an extra parameter and +: a wrapper macro is added that has the old API, but calls the new one +: with the exta parameter set to a default. : -: This flag requires the 'p' flag to be specified, as there would be no -: need to do this if the function weren't publicly accessible before. +: This flag requires the 'p' flag to be specified, as there would be no +: need to do this if the function weren't publicly accessible before. : -: The entry is processed based on the other flags, but the: -: embed.h entry is suppressed +: The entry is processed based on the other flags, but the: +: embed.h entry is suppressed : -: N The name in the entry isn't strictly a name +: 'N' The name in the entry isn't strictly a name : -: Normally, the name of the function or macro must contain all \w -: characters, and a warning is raised otherwise. This flag suppresses -: that warning, so that weird things can be documented +: Normally, the name of the function or macro must contain all \w +: characters, and a warning is raised otherwise. This flag suppresses +: that warning, so that weird things can be documented : -: n Has no arguments. Perhaps a better name would have been '0'. (used only -: in =for apidoc entries) +: 'n' Has no arguments. Perhaps a better name would have been '0'. (used +: only in =for apidoc entries) : -: The macro (it can't be a function) is used without any parameters nor -: empty parentheses. +: The macro (it can't be a function) is used without any parameters nor +: empty parentheses. : -: Perhaps a better name for this flag would have been '0'. The reason the -: flag was not changed to that from 'n', is if D:P were to be regenerated -: on an older perl, it still would use the new embed.fnc shipped with it, -: but would be using the flags from the older perl source code. +: Perhaps a better name for this flag would have been '0'. The reason +: the flag was not changed to that from 'n', is if D:P were to be +: regenerated on an older perl, it still would use the new embed.fnc +: shipped with it, but would be using the flags from the older perl +: source code. : -: O Has a perl_ compatibility macro. +: 'O' Has a perl_ compatibility macro. : -: The really OLD name for API funcs. +: The really OLD name for API funcs. : -: autodoc.pl adds a note that the perl_ form of this function is -: deprecated. +: autodoc.pl adds a note that the perl_ form of this function is +: deprecated. : -: o Has no Perl_foo or S_foo compatibility macro: +: 'o' Has no Perl_foo or S_foo compatibility macro: : -: This is used for whatever reason to force the function to be called -: with the long name. Perhaps there is a varargs issue. Use the 'M' -: flag instead for wrapper macros, and legacy-only functions should -: also use 'b'. +: This is used for whatever reason to force the function to be called +: with the long name. Perhaps there is a varargs issue. Use the 'M' +: flag instead for wrapper macros, and legacy-only functions should +: also use 'b'. : -: embed.h: suppress "#define foo Perl_foo" +: embed.h: suppress "#define foo Perl_foo" : -: autodoc.pl adds a note that this function must be explicitly called as -: Perl_$name, and with an aTHX_ parameter unless the 'T' flag is also -: specified. - -: mnemonic: 'omit' generated macro +: autodoc.pl adds a note that this function must be explicitly called as +: Perl_$name, and with an aTHX_ parameter unless the 'T' flag is also +: specified. +: +: mnemonic: 'omit' generated macro : -: P Pure function: +: 'P' Pure function: : -: A pure function has no effects except the return value, and the return -: value depends only on params and/or globals. This is a hint to the -: compiler that it can optimize calls to this function out of common -: subexpressions. Consequently if this flag is wrongly specified, it can -: lead to subtle bugs that vary by platform, compiler, compiler version, -: and optimization level. Also, a future commit could easily change a -: currently-pure function without even noticing this flag. So it should -: be used sparingly, only for functions that are unlikely to ever become -: not pure by future commits. It should not be used for static -: functions, as the compiler already has the information needed to make -: the 'pure' determination and doesn't need any hint; so it doesn't add -: value in those cases, and could be dangerous if it causes the compiler -: to skip doing its own checks. It should not be used on functions that -: touch SVs, as those can trigger unexpected magic. Also implies "R": +: A pure function has no effects except the return value, and the return +: value depends only on params and/or globals. This is a hint to the +: compiler that it can optimize calls to this function out of common +: subexpressions. Consequently if this flag is wrongly specified, it can +: lead to subtle bugs that vary by platform, compiler, compiler version, +: and optimization level. Also, a future commit could easily change a +: currently-pure function without even noticing this flag. So it should +: be used sparingly, only for functions that are unlikely to ever become +: not pure by future commits. It should not be used for static +: functions, as the compiler already has the information needed to make +: the 'pure' determination and doesn't need any hint; so it doesn't add +: value in those cases, and could be dangerous if it causes the compiler +: to skip doing its own checks. It should not be used on functions that +: touch SVs, as those can trigger unexpected magic. Also implies "R": : -: proto.h: add __attribute__pure__ +: proto.h: add __attribute__pure__ : -: p Function in source code has a Perl_ prefix: +: 'p' Function in source code has a Perl_ prefix: : -: proto.h: function is declared as Perl_foo rather than foo -: embed.h: "#define foo Perl_foo" entries added +: proto.h: function is declared as Perl_foo rather than foo +: embed.h: "#define foo Perl_foo" entries added : -: R Return value must not be ignored (also implied by 'a' and 'P' flags): +: 'R' Return value must not be ignored (also implied by 'a' and 'P' flags): : -: gcc has a bug (which they claim is a feature) in which casting the -: result of one of these to (void) doesn't silence the warning that the -: result is ignored. (Perl has a workaround for this bug, see -: PERL_UNUSED_RESULT docs) +: gcc has a bug (which they claim is a feature) in which casting the +: result of one of these to (void) doesn't silence the warning that the +: result is ignored. (Perl has a workaround for this bug, see +: PERL_UNUSED_RESULT docs) : -: proto.h: add __attribute__warn_unused_result__ +: proto.h: add __attribute__warn_unused_result__ : -: r Function never returns: +: 'r' Function never returns: : -: proto.h: add __attribute__noreturn__ +: proto.h: add __attribute__noreturn__ : -: S Static function: function in source code has a S_ prefix: +: 'S' Static function: function in source code has a S_ prefix: : -: proto.h: function is declared as S_foo rather than foo, +: proto.h: function is declared as S_foo rather than foo, : STATIC is added to declaration; -: embed.h: "#define foo S_foo" entries added +: embed.h: "#define foo S_foo" entries added : -: s autodoc.pl adds a terminating semi-colon to the usage example in the -: documentation. +: 's' Static function, but function in source code has a Perl_ prefix: : -: T Has no implicit interpreter/thread context argument: +: This is used for functions that have always had a Perl_ prefix, but +: have been moved to a header file and declared static. : -: suppress the pTHX part of "foo(pTHX...)" in proto.h; -: In the PERL_IMPLICIT_SYS branch of embed.h, generates +: proto.h: function is declared as Perl_foo rather than foo +: STATIC is added to declaration; +: embed.h: "#define foo Perl_foo" entries added +: +: 'T' Has no implicit interpreter/thread context argument: +: +: suppress the pTHX part of "foo(pTHX...)" in proto.h; +: In the PERL_IMPLICIT_SYS branch of embed.h, generates : "#define foo Perl_foo", rather than : "#define foo(a,b,c) Perl_foo(aTHX_ a,b,c) : -: u The macro's (it has to be a macro) return value or parameters are -: unorthodox, and aren't in the list above of recognized weird ones. For -: example, they aren't C parameters, or the macro expands to something -: that isn't a symbol. +: 'u' The macro's (it has to be a macro) return value or parameters are +: unorthodox, and aren't in the list above of recognized weird ones. For +: example, they aren't C parameters, or the macro expands to something +: that isn't a symbol. +: +: For example, the expansion of STR_WITH_LEN is a comma separated pair +: of values, so would have this flag; or some macros take preprocessor +: tokens, so would have this flag. : -: For example, the expansion of STR_WITH_LEN is a comma separated pair of -: values, so would have this flag; or some macros take preprocessor -: tokens, so would have this flag. +: This also is used for entries that require processing for use, such as +: being compiled by xsubpp. This flag is an indication to downstream +: tools, such as Devel::PPPort, that this requires special handling. : -: This also is used for entries that require processing for use, such as -: being compiled by xsubpp. This flag is an indication to downstream -: tools, such as Devel::PPPort, that this requires special handling. +: 'U' autodoc.pl will not output a usage example : -: U autodoc.pl will not output a usage example +: 'W' Add a comma_pDEPTH argument to function prototypes, and a comma_aDEPTH argument +: to the function calls. This means that under DEBUGGING a depth +: argument is added to the functions, which is used for example by the +: regex engine for debugging and trace output. A non DEBUGGING build +: will not pass the unused argument. Currently restricted to functions +: with at least one argument. : -: W Add a _pDEPTH argument to function prototypes, and an _aDEPTH -: argument to the function calls. This means that under DEBUGGING -: a depth argument is added to the functions, which is used for -: example by the regex engine for debugging and trace output. -: A non DEBUGGING build will not pass the unused argument. -: Currently restricted to functions with at least one argument. +: 'X' Explicitly exported: : -: X Explicitly exported: +: add entry to the list of symbols available on all platforms, unless +: 'e' or 'm' : -: add entry to the list of symbols available on all platforms, unless e -: or m +: This is often used for private functions that are used by public +: macros. In those cases the macros must use the long form of the name +: (Perl_blah(aTHX_ ...)). : -: This is often used for private functions that are used by public -: macros. In those cases the macros must use the long form of the -: name (Perl_blah(aTHX_ ...)). +: 'x' Experimental, may change: : -: x Experimental, may change: +: Any doc entry is marked that it may change. An undocumented +: experimental function is listed in perlintern rather than perlapi, +: even if it is allegedly API. : -: Any doc entry is marked that it may change. An undocumented -: experimental function is listed in perlintern rather than perlapi, -: even if it is allegedly API. +: 'y' Typedef. The element names a type rather than being a macro : -: y Typedef. The element names a type rather than being a macro +: ';' autodoc.pl adds a terminating semi-colon to the usage example in the +: documentation. +: +: '#' The number sign flag indicates that this is a pre-processor symbol +: that is just #define'd or #undef'd. Must NOT be the first symbol on +: the line. +: +: '?' The question mark flag is used internally by Devel::PPPort to +: indicate that it does not have enough information to generate a +: proper test case. : : In this file, pointer parameters that must not be passed NULLs should be : prefixed with NN. @@ -557,3189 +601,5589 @@ : know "I have defined whether NULL is OK or not" rather than having neither : NULL or NULLOK, which is ambiguous. : -: Individual flags may be separated by non-tab whitespace. - -CipRTX |char * |mortal_getenv |NN const char * str - -#if defined(PERL_IMPLICIT_SYS) -CTo |PerlInterpreter*|perl_alloc_using \ - |NN struct IPerlMem *ipM \ - |NN struct IPerlMem *ipMS \ - |NN struct IPerlMem *ipMP \ - |NN struct IPerlEnv *ipE \ - |NN struct IPerlStdIO *ipStd \ - |NN struct IPerlLIO *ipLIO \ - |NN struct IPerlDir *ipD \ - |NN struct IPerlSock *ipS \ - |NN struct IPerlProc *ipP -#endif -ATod |PerlInterpreter* |perl_alloc -ATod |void |perl_construct |NN PerlInterpreter *my_perl -ATod |int |perl_destruct |NN PerlInterpreter *my_perl -ATod |void |perl_free |NN PerlInterpreter *my_perl -ATod |int |perl_run |NN PerlInterpreter *my_perl -ATod |int |perl_parse |NN PerlInterpreter *my_perl|XSINIT_t xsinit \ - |int argc|NULLOK char** argv|NULLOK char** env -CTpR |bool |doing_taint |int argc|NULLOK char** argv|NULLOK char** env -#if defined(USE_ITHREADS) -ATod |PerlInterpreter*|perl_clone|NN PerlInterpreter *proto_perl|UV flags -# if defined(PERL_IMPLICIT_SYS) -CTo |PerlInterpreter*|perl_clone_using \ - |NN PerlInterpreter *proto_perl \ - |UV flags \ - |NN struct IPerlMem* ipM \ - |NN struct IPerlMem* ipMS \ - |NN struct IPerlMem* ipMP \ - |NN struct IPerlEnv* ipE \ - |NN struct IPerlStdIO* ipStd \ - |NN struct IPerlLIO* ipLIO \ - |NN struct IPerlDir* ipD \ - |NN struct IPerlSock* ipS \ - |NN struct IPerlProc* ipP -# endif -#endif - -CaTopd |Malloc_t|malloc |MEM_SIZE nbytes -CaTopd |Malloc_t|calloc |MEM_SIZE elements|MEM_SIZE size -CRTopd |Malloc_t|realloc |Malloc_t where|MEM_SIZE nbytes -CTopd |Free_t |mfree |Malloc_t where -#if defined(MYMALLOC) -TpR |MEM_SIZE|malloced_size |NN void *p -TpR |MEM_SIZE|malloc_good_size |size_t nbytes -#endif -#if defined(PERL_IN_MALLOC_C) -ST |int |adjust_size_and_find_bucket |NN size_t *nbytes_p -#endif - -CTpdR |void* |get_context -CTpd |void |set_context |NN void *t +: Numeric arguments may also be prefixed with NZ, which will cause the +: appropriate asserts to be generated to validate that this is the case. +: +: Flags should be sorted asciibetically. +: +: Please keep the next line *BLANK* -XEop |bool |try_amagic_bin |int method|int flags -XEop |bool |try_amagic_un |int method|int flags -Apd |SV* |amagic_call |NN SV* left|NN SV* right|int method|int dir -Apd |SV * |amagic_deref_call|NN SV *ref|int method -p |bool |amagic_is_enabled|int method -Apd |int |Gv_AMupdate |NN HV* stash|bool destructing -CpdR |CV* |gv_handler |NULLOK HV* stash|I32 id -Apd |OP* |op_append_elem |I32 optype|NULLOK OP* first|NULLOK OP* last -Apd |OP* |op_append_list |I32 optype|NULLOK OP* first|NULLOK OP* last -Apd |OP* |op_linklist |NN OP *o -Apd |OP* |op_prepend_elem|I32 optype|NULLOK OP* first|NULLOK OP* last +pr |void |abort_execution|NULLOK SV *msg_sv \ + |NN const char * const name +px |LOGOP *|alloc_LOGOP |I32 type \ + |NULLOK OP *first \ + |NULLOK OP *other +: Used in toke.c and perly.y +p |PADOFFSET|allocmy |NN const char * const name \ + |const STRLEN len \ + |const U32 flags +Xdp |bool |amagic_applies |NN SV *sv \ + |int method \ + |int flags +Adp |SV * |amagic_call |NN SV *left \ + |NN SV *right \ + |int method \ + |int dir +Adp |SV * |amagic_deref_call \ + |NN SV *ref \ + |int method +p |bool |amagic_is_enabled \ + |int method + +ETXip |void |append_utf8_from_native_byte \ + |const U8 byte \ + |NN U8 **dest : FIXME - this is only called by pp_chown. They should be merged. -p |I32 |apply |I32 type|NN SV** mark|NN SV** sp -Apx |void |apply_attrs_string|NN const char *stashpv|NN CV *cv|NN const char *attrstr|STRLEN len -Apd |void |av_clear |NN AV *av -Apd |SV* |av_delete |NN AV *av|SSize_t key|I32 flags -ApdR |bool |av_exists |NN AV *av|SSize_t key -Apd |void |av_extend |NN AV *av|SSize_t key -p |void |av_extend_guts |NULLOK AV *av|SSize_t key \ - |NN SSize_t *maxp \ - |NN SV ***allocp|NN SV ***arrayp -ApdR |SV** |av_fetch |NN AV *av|SSize_t key|I32 lval -CipdR |SV** |av_fetch_simple|NN AV *av|SSize_t key|I32 lval -Apd |void |av_fill |NN AV *av|SSize_t fill -ApdR |SSize_t|av_len |NN AV *av -ApdR |AV* |av_make |SSize_t size|NN SV **strp -CpdR |AV* |av_new_alloc |SSize_t size|bool zeroflag -p |SV* |av_nonelem |NN AV *av|SSize_t ix -Apd |SV* |av_pop |NN AV *av -Apdoe |void |av_create_and_push|NN AV **const avp|NN SV *const val -Apd |void |av_push |NN AV *av|NN SV *val +p |I32 |apply |I32 type \ + |NN SV **mark \ + |NN SV **sp +Apx |void |apply_attrs_string \ + |NN const char *stashpv \ + |NN CV *cv \ + |NN const char *attrstr \ + |STRLEN len +Adp |OP * |apply_builtin_cv_attributes \ + |NN CV *cv \ + |NULLOK OP *attrlist +CTp |void |atfork_lock +CTp |void |atfork_unlock +Cop |SV ** |av_arylen_p |NN AV *av +Adp |void |av_clear |NN AV *av +ARdip |Size_t |av_count |NN AV *av +Adeop |void |av_create_and_push \ + |NN AV ** const avp \ + |NN SV * const val +Adeop |SV ** |av_create_and_unshift_one \ + |NN AV ** const avp \ + |NN SV * const val +Adp |SV * |av_delete |NN AV *av \ + |SSize_t key \ + |I32 flags +Adp |void |av_dump |NULLOK AV *av +ARdp |bool |av_exists |NN AV *av \ + |SSize_t key +Adp |void |av_extend |NN AV *av \ + |SSize_t key +p |void |av_extend_guts |NULLOK AV *av \ + |SSize_t key \ + |NN SSize_t *maxp \ + |NN SV ***allocp \ + |NN SV ***arrayp +ARdp |SV ** |av_fetch |NN AV *av \ + |SSize_t key \ + |I32 lval +CRdip |SV ** |av_fetch_simple|NN AV *av \ + |SSize_t key \ + |I32 lval +Adp |void |av_fill |NN AV *av \ + |SSize_t fill +Cop |IV * |av_iter_p |NN AV *av +ARdp |SSize_t|av_len |NN AV *av +ARdp |AV * |av_make |SSize_t size \ + |NN SV **strp +CRdip |AV * |av_new_alloc |SSize_t size \ + |bool zeroflag +p |SV * |av_nonelem |NN AV *av \ + |SSize_t ix +Adp |SV * |av_pop |NN AV *av +Adp |void |av_push |NN AV *av \ + |NN SV *val +Adip |void |av_push_simple |NN AV *av \ + |NN SV *val : Used in scope.c, and by Data::Alias EXp |void |av_reify |NN AV *av -ApdR |SV* |av_shift |NN AV *av -Apd |SV** |av_store |NN AV *av|SSize_t key|NULLOK SV *val -Cipd |SV** |av_store_simple|NN AV *av|SSize_t key|NULLOK SV *val -AmdR |SSize_t|av_top_index |NN AV *av -AidRp |Size_t |av_count |NN AV *av -AmdR |SSize_t|av_tindex |NN AV *av -Apd |void |av_undef |NN AV *av -Apdoe |SV** |av_create_and_unshift_one|NN AV **const avp|NN SV *const val -Apd |void |av_unshift |NN AV *av|SSize_t num -Cpo |SV** |av_arylen_p |NN AV *av -Cpo |IV* |av_iter_p |NN AV *av -#if defined(PERL_IN_AV_C) -S |MAGIC* |get_aux_mg |NN AV *av -#endif +ARdp |SV * |av_shift |NN AV *av +Adp |SV ** |av_store |NN AV *av \ + |SSize_t key \ + |NULLOK SV *val +Cdip |SV ** |av_store_simple|NN AV *av \ + |SSize_t key \ + |NULLOK SV *val +ARdm |SSize_t|av_tindex |NN AV *av +ARdm |SSize_t|av_top_index |NN AV *av +Adp |void |av_undef |NN AV *av +Adp |void |av_unshift |NN AV *av \ + |SSize_t num : Used in perly.y -pR |OP* |bind_match |I32 type|NN OP *left|NN OP *right +Rp |OP * |bind_match |I32 type \ + |NN OP *left \ + |NN OP *right : Used in perly.y -ApdR |OP* |block_end |I32 floor|NULLOK OP* seq -CpR |U8 |block_gimme +ARdp |OP * |block_end |I32 floor \ + |NULLOK OP *seq +CRp |U8 |block_gimme +Adopx |void |blockhook_register \ + |NN BHK *hk : Used in perly.y -ApdR |int |block_start |int full -Aodxp |void |blockhook_register |NN BHK *hk +ARdp |int |block_start |int full p |void |boot_core_builtin -: Used in perl.c -p |void |boot_core_UNIVERSAL +: Only used in perl.c +p |void |boot_core_mro : Used in perl.c p |void |boot_core_PerlIO -Cp |void |call_list |I32 oldscope|NN AV *paramList -Apd |const PERL_CONTEXT * |caller_cx|I32 level \ +: Used in perl.c +p |void |boot_core_UNIVERSAL +p |OP * |build_infix_plugin \ + |NN OP *lhs \ + |NN OP *rhs \ + |NN void *tokendata +EXp |char * |_byte_dump_string \ + |NN const U8 * const start \ + |const STRLEN len \ + |const bool format +Adp |int |bytes_cmp_utf8 |NN const U8 *b \ + |STRLEN blen \ + |NN const U8 *u \ + |STRLEN ulen +AMdpx |U8 * |bytes_from_utf8|NN const U8 *s \ + |NN STRLEN *lenp \ + |NN bool *is_utf8p +CTdpx |U8 * |bytes_from_utf8_loc \ + |NN const U8 *s \ + |NN STRLEN *lenp \ + |NN bool *is_utf8p \ + |NULLOK const U8 **first_unconverted +Adpx |U8 * |bytes_to_utf8 |NN const U8 *s \ + |NN STRLEN *lenp +AOdp |I32 |call_argv |NN const char *sub_name \ + |I32 flags \ + |NN char **argv + +: "Very" special - can't use the O flag for this one: +: (The rename from perl_atexit to Perl_call_atexit was in 864dbfa3ca8032ef) +Adp |void |call_atexit |ATEXIT_t fn \ + |NULLOK void *ptr +Adp |const PERL_CONTEXT *|caller_cx \ + |I32 level \ |NULLOK const PERL_CONTEXT **dbcxp +Cp |void |call_list |I32 oldscope \ + |NN AV *paramList +AOdp |I32 |call_method |NN const char *methname \ + |I32 flags +CTadop |Malloc_t|calloc |MEM_SIZE elements \ + |MEM_SIZE size +AOdp |I32 |call_pv |NN const char *sub_name \ + |I32 flags +AOdp |I32 |call_sv |NN SV *sv \ + |volatile I32 flags : Used in several source files -pR |bool |cando |Mode_t mode|bool effective|NN const Stat_t* statbufp -CpRT |U32 |cast_ulong |NV f -CpRT |I32 |cast_i32 |NV f -CpRT |IV |cast_iv |NV f -CpRT |UV |cast_uv |NV f -#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP) -ApdR |I32 |my_chsize |int fd|Off_t length -#endif -p |const COP*|closest_cop |NN const COP *cop|NULLOK const OP *o \ - |NULLOK const OP *curop|bool opnext -: Used in perly.y -ApdR |OP* |op_convert_list |I32 optype|I32 flags|NULLOK OP* o -: Used in op.c and perl.c -px |void |create_eval_scope|NULLOK OP *retop|U32 flags -Aprd |void |croak_sv |NN SV *baseex -: croak()'s first parm can be NULL. Otherwise, mod_perl breaks. -Afprd |void |croak |NULLOK const char* pat|... -Aprd |void |vcroak |NULLOK const char* pat|NULLOK va_list* args -ATprd |void |croak_no_modify -ATprd |void |croak_xs_usage |NN const CV *const cv \ - |NN const char *const params -Tpr |void |croak_no_mem -TprX |void |croak_popstack -fTrp |void |croak_caller|NULLOK const char* pat|... -fTpre |void |noperl_die|NN const char* pat|... -#if defined(WIN32) -Tore |void |win32_croak_not_implemented|NN const char * fname -#endif -#if defined(MULTIPLICITY) -AdfTrp |void |croak_nocontext|NULLOK const char* pat|... -AdfTrp |OP* |die_nocontext |NULLOK const char* pat|... -AfTpd |void |deb_nocontext |NN const char* pat|... -AdfTp |char* |form_nocontext |NN const char* pat|... -AdFTp |void |load_module_nocontext|U32 flags|NN SV* name|NULLOK SV* ver|... -AdfTp |SV* |mess_nocontext |NN const char* pat|... -AdfTp |void |warn_nocontext |NN const char* pat|... -AdfTp |void |warner_nocontext|U32 err|NN const char* pat|... -AdfTp |SV* |newSVpvf_nocontext|NN const char *const pat|... -AdfTp |void |sv_catpvf_nocontext|NN SV *const sv|NN const char *const pat|... -AdfTp |void |sv_setpvf_nocontext|NN SV *const sv|NN const char *const pat|... -AdfTp |void |sv_catpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|... -AdfTp |void |sv_setpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|... -AbfTpD |int |fprintf_nocontext|NN PerlIO *stream|NN const char *format|... -AbfTpD |int |printf_nocontext|NN const char *format|... -#endif +Rp |bool |cando |Mode_t mode \ + |bool effective \ + |NN const Stat_t *statbufp +CRTp |I32 |cast_i32 |NV f +CRTp |IV |cast_iv |NV f +CRTp |U32 |cast_ulong |NV f +CRTp |UV |cast_uv |NV f +p |bool |check_utf8_print \ + |NN const U8 *s \ + |const STRLEN len +op |OP * |ck_entersub_args_core \ + |NN OP *entersubop \ + |NN GV *namegv \ + |NN SV *protosv +Adp |OP * |ck_entersub_args_list \ + |NN OP *entersubop +Adp |OP * |ck_entersub_args_proto \ + |NN OP *entersubop \ + |NN GV *namegv \ + |NN SV *protosv +Adp |OP * |ck_entersub_args_proto_or_list \ + |NN OP *entersubop \ + |NN GV *namegv \ + |NN SV *protosv + +CPop |bool |ckwarn |U32 w +CPop |bool |ckwarn_d |U32 w +Adfp |void |ck_warner |U32 err \ + |NN const char *pat \ + |... +Adfp |void |ck_warner_d |U32 err \ + |NN const char *pat \ + |... + +: Some static inline functions need predeclaration because they are used +: inside other static inline functions. + +Cp |void |clear_defarray |NN AV *av \ + |bool abandon +p |const COP *|closest_cop|NN const COP *cop \ + |NULLOK const OP *o \ + |NULLOK const OP *curop \ + |bool opnext +Rp |OP * |cmpchain_extend|I32 type \ + |NN OP *ch \ + |NULLOK OP *right +Rp |OP * |cmpchain_finish|NN OP *ch +Rp |OP * |cmpchain_start |I32 type \ + |NULLOK OP *left \ + |NULLOK OP *right +ERTXp |const char *|cntrl_to_mnemonic \ + |const U8 c +Adpx |const char *|cop_fetch_label \ + |NN COP * const cop \ + |NULLOK STRLEN *len \ + |NULLOK U32 *flags +: Only used in op.c and the perl compiler +Adpx |void |cop_store_label|NN COP * const cop \ + |NN const char *label \ + |STRLEN len \ + |U32 flags : Used in pp.c -pd |SV * |core_prototype |NULLOK SV *sv|NN const char *name \ - |const int code|NULLOK int * const opnum +dp |SV * |core_prototype |NULLOK SV *sv \ + |NN const char *name \ + |const int code \ + |NULLOK int * const opnum : Used in gv.c -p |OP * |coresub_op |NN SV *const coreargssv|const int code \ +p |OP * |coresub_op |NN SV * const coreargssv \ + |const int code \ |const int opnum +: Used in op.c and perl.c +px |void |create_eval_scope \ + |NULLOK OP *retop \ + |U32 flags +: croak()'s first parm can be NULL. Otherwise, mod_perl breaks. +Adfpr |void |croak |NULLOK const char *pat \ + |... +Tfpr |void |croak_caller |NULLOK const char *pat \ + |... +CTrs |void |croak_memory_wrap +Tpr |void |croak_no_mem +ATdpr |void |croak_no_modify +TXpr |void |croak_popstack +Adpr |void |croak_sv |NN SV *baseex +ATdpr |void |croak_xs_usage |NN const CV * const cv \ + |NN const char * const params +CTp |Signal_t|csighandler1 |int sig +CTp |Signal_t|csighandler3 |int sig \ + |NULLOK Siginfo_t *info \ + |NULLOK void *uap +EXp |regexp_engine const *|current_re_engine +RXp |XOPRETANY|custom_op_get_field \ + |NN const OP *o \ + |const xop_flags_enum field +Adop |void |custom_op_register \ + |NN Perl_ppaddr_t ppaddr \ + |NN const XOP *xop : Used in sv.c -ExXp |void |cv_ckproto_len_flags |NN const CV* cv|NULLOK const GV* gv\ - |NULLOK const char* p|const STRLEN len \ - |const U32 flags -: Used in pp.c and pp_sys.c -ApdR |SV* |gv_const_sv |NN GV* gv -ApdRT |SV* |cv_const_sv |NULLOK const CV *const cv -pRT |SV* |cv_const_sv_or_av|NULLOK const CV *const cv -Apd |SV * |cv_name |NN CV *cv|NULLOK SV *sv|U32 flags -Apd |void |cv_undef |NN CV* cv -p |void |cv_undef_flags |NN CV* cv|U32 flags -pd |void |cv_forget_slab |NULLOK CV *cv -Cp |void |cx_dump |NN PERL_CONTEXT* cx -AiMpd |GV * |CvGV |NN CV *sv -AdiMTp |I32 * |CvDEPTH |NN const CV * const sv -Aphd |SV* |filter_add |NULLOK filter_t funcp|NULLOK SV* datasv -Apd |void |filter_del |NN filter_t funcp -ApRhd |I32 |filter_read |int idx|NN SV *buf_sv|int maxlen -ApPRx |char** |get_op_descs -ApPRx |char** |get_op_names -: FIXME discussion on p5p -pPR |const char* |get_no_modify -: FIXME discussion on p5p -pPRx |U32* |get_opargs -CpPRx |PPADDR_t*|get_ppaddr +EXpx |void |cv_ckproto_len_flags \ + |NN const CV *cv \ + |NULLOK const GV *gv \ + |NULLOK const char *p \ + |const STRLEN len \ + |const U32 flags +Adp |CV * |cv_clone |NN CV *proto +p |CV * |cv_clone_into |NN CV *proto \ + |NN CV *target +ARTdp |SV * |cv_const_sv |NULLOK const CV * const cv +RTp |SV * |cv_const_sv_or_av \ + |NULLOK const CV * const cv +AMTdip |I32 * |CvDEPTH |NN const CV * const sv +dp |void |cv_forget_slab |NULLOK CV *cv +Adp |void |cv_get_call_checker \ + |NN CV *cv \ + |NN Perl_call_checker *ckfun_p \ + |NN SV **ckobj_p +Adp |void |cv_get_call_checker_flags \ + |NN CV *cv \ + |U32 gflags \ + |NN Perl_call_checker *ckfun_p \ + |NN SV **ckobj_p \ + |NN U32 *ckflags_p +AMdip |GV * |CvGV |NN CV *sv +Xop |GV * |cvgv_from_hek |NN CV *cv +Xp |void |cvgv_set |NN CV *cv \ + |NULLOK GV *gv +Adp |SV * |cv_name |NN CV *cv \ + |NULLOK SV *sv \ + |U32 flags +Adp |void |cv_set_call_checker \ + |NN CV *cv \ + |NN Perl_call_checker ckfun \ + |NN SV *ckobj +Adp |void |cv_set_call_checker_flags \ + |NN CV *cv \ + |NN Perl_call_checker ckfun \ + |NN SV *ckobj \ + |U32 ckflags +Xp |void |cvstash_set |NN CV *cv \ + |NULLOK HV *stash +Adp |void |cv_undef |NN CV *cv +p |void |cv_undef_flags |NN CV *cv \ + |U32 flags +Cp |void |cx_dump |NN PERL_CONTEXT *cx : Used by CXINC, which appears to be in widespread use -CpR |I32 |cxinc -Afpd |void |deb |NN const char* pat|... -Apd |void |vdeb |NN const char* pat|NULLOK va_list* args -Cpd |void |debprofdump -EXp |SV* |multideref_stringify |NN const OP* o|NULLOK CV *cv -EXp |SV* |multiconcat_stringify |NN const OP* o -Cpd |I32 |debop |NN const OP* o -Apd |I32 |debstack +CRp |I32 |cxinc +Adfp |void |deb |NN const char *pat \ + |... +Cdp |I32 |debop |NN const OP *o +Cdp |void |debprofdump +Adp |I32 |debstack + +: Only used in dump.c +p |void |deb_stack_all Cp |I32 |debstackptrs -pR |SV * |defelem_target |NN SV *sv|NULLOK MAGIC *mg -ATpd |char* |delimcpy|NN char* to|NN const char* to_end \ - |NN const char* from|NN const char* from_end \ - |const int delim|NN I32* retlen -EXTpd |char* |delimcpy_no_escape|NN char* to|NN const char* to_end \ - |NN const char* from \ - |NN const char* from_end \ - |const int delim|NN I32* retlen +p |void |debug_hash_seed|bool via_debug_h +Rp |SV * |defelem_target |NN SV *sv \ + |NULLOK MAGIC *mg : Used in op.c, perl.c px |void |delete_eval_scope -Aprd |OP* |die_sv |NN SV *baseex -Afrpd |OP* |die |NULLOK const char* pat|... +ATdp |char * |delimcpy |NN char *to \ + |NN const char *to_end \ + |NN const char *from \ + |NN const char *from_end \ + |const int delim \ + |NN I32 *retlen +ETXdp |char * |delimcpy_no_escape \ + |NN char *to \ + |NN const char *to_end \ + |NN const char *from \ + |NN const char *from_end \ + |const int delim \ + |NN I32 *retlen +Cp |void |despatch_signals +Adfpr |OP * |die |NULLOK const char *pat \ + |... +Adpr |OP * |die_sv |NN SV *baseex : Used in util.c -pr |void |die_unwind |NN SV* msv -Cpdh |void |dounwind |I32 cxix +pr |void |die_unwind |NN SV *msv : FIXME -pMb |bool|do_aexec |NULLOK SV* really|NN SV** mark|NN SV** sp +Mbp |bool |do_aexec |NULLOK SV *really \ + |NN SV **mark \ + |NN SV **sp : Used in pp_sys.c -p |bool|do_aexec5 |NULLOK SV* really|NN SV** mark|NN SV** sp|int fd|int do_report -AbpD |int |do_binmode |NN PerlIO *fp|int iotype|int mode +p |bool |do_aexec5 |NULLOK SV *really \ + |NN SV **mark \ + |NN SV **sp \ + |int fd \ + |int do_report : Used in pp.c -Ap |bool |do_close |NULLOK GV* gv|bool not_implicit -: Defined in doio.c, used only in pp_sys.c -p |bool |do_eof |NN GV* gv - -#ifdef PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION -pM |bool|do_exec |NN const char* cmd -#else -p |bool|do_exec |NN const char* cmd -#endif - -#if defined(WIN32) || defined(VMS) -Cp |int |do_aspawn |NULLOK SV* really|NN SV** mark|NN SV** sp -Cp |int |do_spawn |NN char* cmd -Cp |int |do_spawn_nowait|NN char* cmd -#endif -#if !defined(WIN32) -p |bool|do_exec3 |NN const char *incmd|int fd|int do_report -#endif -#if defined(PERL_IN_DOIO_C) -S |void |exec_failed |NN const char *cmd|int fd|int do_report -S |bool |argvout_final |NN MAGIC *mg|NN IO *io|bool not_implicit -#endif -#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) +Adp |bool |do_close |NULLOK GV *gv \ + |bool is_explicit +dp |void |do_dump_pad |I32 level \ + |NN PerlIO *file \ + |NULLOK PADLIST *padlist \ + |int full : Defined in doio.c, used only in pp_sys.c -p |I32 |do_ipcctl |I32 optype|NN SV** mark|NN SV** sp -: Defined in doio.c, used only in pp_sys.c -p |I32 |do_ipcget |I32 optype|NN SV** mark|NN SV** sp -: Defined in doio.c, used only in pp_sys.c -p |I32 |do_msgrcv |NN SV** mark|NN SV** sp -: Defined in doio.c, used only in pp_sys.c -p |I32 |do_msgsnd |NN SV** mark|NN SV** sp -: Defined in doio.c, used only in pp_sys.c -p |I32 |do_semop |NN SV** mark|NN SV** sp -: Defined in doio.c, used only in pp_sys.c -p |I32 |do_shmio |I32 optype|NN SV** mark|NN SV** sp -#endif -Apd |void |do_join |NN SV *sv|NN SV *delim|NN SV **mark|NN SV **sp +p |bool |do_eof |NN GV *gv +: Used in perly.y +p |OP * |dofile |NN OP *term \ + |I32 force_builtin +Cp |void |do_gv_dump |I32 level \ + |NN PerlIO *file \ + |NN const char *name \ + |NULLOK GV *sv +Cp |void |do_gvgv_dump |I32 level \ + |NN PerlIO *file \ + |NN const char *name \ + |NULLOK GV *sv +Cp |void |do_hv_dump |I32 level \ + |NN PerlIO *file \ + |NN const char *name \ + |NULLOK HV *sv +CRTp |bool |doing_taint |int argc \ + |NULLOK char **argv \ + |NULLOK char **env + +Adp |void |do_join |NN SV *sv \ + |NN SV *delim \ + |NN SV **mark \ + |NN SV **sp +Cp |void |do_magic_dump |I32 level \ + |NN PerlIO *file \ + |NULLOK const MAGIC *mg \ + |I32 nest \ + |I32 maxnest \ + |bool dumpops \ + |STRLEN pvlim : Used in pp.c and pp_hot.c, prototype generated by regen/opcode.pl : p |OP* |do_kv : used in pp.c, pp_hot.c -pR |I32 |do_ncmp |NN SV *const left|NN SV *const right -ApMb |bool |do_open |NN GV* gv|NN const char* name|I32 len|int as_raw \ - |int rawmode|int rawperm|NULLOK PerlIO* supplied_fp -AbpD |bool |do_open9 |NN GV *gv|NN const char *name|I32 len|int as_raw \ - |int rawmode|int rawperm|NULLOK PerlIO *supplied_fp \ - |NN SV *svs|I32 num -pT |void |setfd_cloexec|int fd -pT |void |setfd_inhexec|int fd -p |void |setfd_cloexec_for_nonsysfd|int fd -p |void |setfd_inhexec_for_sysfd|int fd -p |void |setfd_cloexec_or_inhexec_by_sysfdness|int fd -pR |int |PerlLIO_dup_cloexec|int oldfd -p |int |PerlLIO_dup2_cloexec|int oldfd|int newfd -pR |int |PerlLIO_open_cloexec|NN const char *file|int flag -pR |int |PerlLIO_open3_cloexec|NN const char *file|int flag|int perm -pToR |int |my_mkstemp_cloexec|NN char *templte -pToR |int |my_mkostemp_cloexec|NN char *templte|int flags -#ifdef HAS_PIPE -pR |int |PerlProc_pipe_cloexec|NN int *pipefd -#endif -#ifdef HAS_SOCKET -pR |int |PerlSock_socket_cloexec|int domain|int type|int protocol -pR |int |PerlSock_accept_cloexec|int listenfd \ - |NULLOK struct sockaddr *addr \ - |NULLOK Sock_size_t *addrlen -#endif -#if defined (HAS_SOCKETPAIR) || \ - (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && \ - defined(AF_INET) && defined(PF_INET)) -pR |int |PerlSock_socketpair_cloexec|int domain|int type|int protocol \ - |NN int *pairfd -#endif -#if defined(PERL_IN_DOIO_C) -S |IO * |openn_setup |NN GV *gv|NN char *mode|NN PerlIO **saveifp \ - |NN PerlIO **saveofp|NN int *savefd \ - |NN char *savetype -S |bool |openn_cleanup |NN GV *gv|NN IO *io|NULLOK PerlIO *fp \ - |NN char *mode|NN const char *oname \ - |NULLOK PerlIO *saveifp|NULLOK PerlIO *saveofp \ - |int savefd|char savetype|int writing \ - |bool was_fdopen|NULLOK const char *type \ - |NULLOK Stat_t *statbufp -#endif -Ap |bool |do_openn |NN GV *gv|NN const char *oname|I32 len \ - |int as_raw|int rawmode|int rawperm \ - |NULLOK PerlIO *supplied_fp|NULLOK SV **svp \ - |I32 num -xp |bool |do_open_raw |NN GV *gv|NN const char *oname|STRLEN len \ - |int rawmode|int rawperm|NULLOK Stat_t *statbufp -xp |bool |do_open6 |NN GV *gv|NN const char *oname|STRLEN len \ - |NULLOK PerlIO *supplied_fp|NULLOK SV **svp \ +Rp |I32 |do_ncmp |NN SV * const left \ + |NN SV * const right +Cp |void |do_op_dump |I32 level \ + |NN PerlIO *file \ + |NULLOK const OP *o +AMbp |bool |do_open |NN GV *gv \ + |NN const char *name \ + |I32 len \ + |int as_raw \ + |int rawmode \ + |int rawperm \ + |NULLOK PerlIO *supplied_fp +px |bool |do_open6 |NN GV *gv \ + |NN const char *oname \ + |STRLEN len \ + |NULLOK PerlIO *supplied_fp \ + |NULLOK SV **svp \ |U32 num +Ap |bool |do_openn |NN GV *gv \ + |NN const char *oname \ + |I32 len \ + |int as_raw \ + |int rawmode \ + |int rawperm \ + |NULLOK PerlIO *supplied_fp \ + |NULLOK SV **svp \ + |I32 num +px |bool |do_open_raw |NN GV *gv \ + |NN const char *oname \ + |STRLEN len \ + |int rawmode \ + |int rawperm \ + |NULLOK Stat_t *statbufp +Cp |void |do_pmop_dump |I32 level \ + |NN PerlIO *file \ + |NULLOK const PMOP *pm : Used in pp_hot.c and pp_sys.c -p |bool |do_print |NULLOK SV* sv|NN PerlIO* fp +p |bool |do_print |NULLOK SV *sv \ + |NN PerlIO *fp : Used in pp_sys.c -pR |OP* |do_readline +Rp |OP * |do_readline +Cp |OP * |doref |NN OP *o \ + |I32 type \ + |bool set_op_ref : Defined in doio.c, used only in pp_sys.c -p |bool |do_seek |NULLOK GV* gv|Off_t pos|int whence -Apd |void |do_sprintf |NN SV* sv|SSize_t len|NN SV** sarg +p |bool |do_seek |NULLOK GV *gv \ + |Off_t pos \ + |int whence +Adp |void |do_sprintf |NN SV *sv \ + |SSize_t len \ + |NN SV **sarg +Cp |void |do_sv_dump |I32 level \ + |NN PerlIO *file \ + |NULLOK SV *sv \ + |I32 nest \ + |I32 maxnest \ + |bool dumpops \ + |STRLEN pvlim : Defined in doio.c, used only in pp_sys.c -p |Off_t |do_sysseek |NN GV* gv|Off_t pos|int whence +p |Off_t |do_sysseek |NN GV *gv \ + |Off_t pos \ + |int whence : Defined in doio.c, used only in pp_sys.c -pR |Off_t |do_tell |NN GV* gv +Rp |Off_t |do_tell |NN GV *gv : Defined in doop.c, used only in pp.c -p |Size_t |do_trans |NN SV* sv +p |Size_t |do_trans |NN SV *sv +ERTXp |I16 |do_uniprop_match \ + |NN const char * const key \ + |const U16 key_len +Cdhp |void |dounwind |I32 cxix : Used in my.c and pp.c -p |UV |do_vecget |NN SV* sv|STRLEN offset|int size +p |UV |do_vecget |NN SV *sv \ + |STRLEN offset \ + |int size : Defined in doop.c, used only in mg.c (with /* XXX slurp this routine */) -p |void |do_vecset |NN SV* sv +p |void |do_vecset |NN SV *sv : Defined in doop.c, used only in pp.c -p |void |do_vop |I32 optype|NN SV* sv|NN SV* left|NN SV* right -: Used in perly.y -p |OP* |dofile |NN OP* term|I32 force_builtin -CdpR |U8 |dowantarray +p |void |do_vop |I32 optype \ + |NN SV *sv \ + |NN SV *left \ + |NN SV *right +CDRdp |U8 |dowantarray +TXop |void |drand48_init_r |NN perl_drand48_t *random_state \ + |U32 seed +TXop |double |drand48_r |NN perl_drand48_t *random_state Adp |void |dump_all p |void |dump_all_perl |bool justperl -Apdh |void |dump_eval -Apd |void |dump_form |NN const GV* gv -Apd |void |gv_dump |NULLOK GV* gv -Apd |OPclass|op_class |NULLOK const OP *o -Apd |void |op_dump |NN const OP *o -Apd |void |pmop_dump |NULLOK PMOP* pm -Apd |void |dump_packsubs |NN const HV* stash -p |void |dump_packsubs_perl |NN const HV* stash|bool justperl -Apdh |void |dump_sub |NN const GV* gv -p |void |dump_sub_perl |NN const GV* gv|bool justperl -Apd |void |fbm_compile |NN SV* sv|U32 flags -ApdR |char* |fbm_instr |NN unsigned char* big|NN unsigned char* bigend \ - |NN SV* littlestr|U32 flags -pEXTR |const char *|cntrl_to_mnemonic|const U8 c +Adhp |void |dump_eval +Adp |void |dump_form |NN const GV *gv +Cfp |void |dump_indent |I32 level \ + |NN PerlIO *file \ + |NN const char *pat \ + |... +Adp |void |dump_packsubs |NN const HV *stash +p |void |dump_packsubs_perl \ + |NN const HV *stash \ + |bool justperl +Adhp |void |dump_sub |NN const GV *gv +p |void |dump_sub_perl |NN const GV *gv \ + |bool justperl +Cp |void |dump_vindent |I32 level \ + |NN PerlIO *file \ + |NN const char *pat \ + |NULLOK va_list *args + +EXop |char *|dup_warnings |NULLOK char *warnings + +: Used by B +EXopx |void |emulate_cop_io |NN const COP * const c \ + |NN SV * const sv +AOdp |SV * |eval_pv |NN const char *p \ + |I32 croak_on_error +AOdp |I32 |eval_sv |NN SV *sv \ + |I32 flags +Adp |void |fbm_compile |NN SV *sv \ + |U32 flags +ARdp |char * |fbm_instr |NN unsigned char *big \ + |NN unsigned char *bigend \ + |NN SV *littlestr \ + |U32 flags +Adhp |SV * |filter_add |NULLOK filter_t funcp \ + |NULLOK SV *datasv +Adp |void |filter_del |NN filter_t funcp +ARdhp |I32 |filter_read |int idx \ + |NN SV *buf_sv \ + |int maxlen p |CV * |find_lexical_cv|PADOFFSET off + +ARdp |CV * |find_runcv |NULLOK U32 *db_seqp +Rp |CV * |find_runcv_where \ + |U8 cond \ + |IV arg \ + |NULLOK U32 *db_seqp +Adp |SV * |find_rundefsv : Defined in util.c, used only in perl.c -p |char* |find_script |NN const char *scriptname|bool dosearch \ - |NULLOK const char *const *const search_ext|I32 flags -#if defined(PERL_IN_OP_C) -S |OP* |force_list |NULLOK OP* arg|bool nullit -i |OP* |op_integerize |NN OP *o -i |OP* |op_std_init |NN OP *o -#if defined(USE_ITHREADS) -i |void |op_relocate_sv |NN SV** svp|NN PADOFFSET* targp -#endif -i |OP* |newMETHOP_internal |I32 type|I32 flags|NULLOK OP* dynamic_meth \ - |NULLOK SV* const_meth -: FIXME -S |OP* |fold_constants |NN OP * const o -Sd |OP* |traverse_op_tree|NN OP* top|NN OP* o -#endif -Afpd |char* |form |NN const char* pat|... -Adp |char* |vform |NN const char* pat|NULLOK va_list* args +p |char * |find_script |NN const char *scriptname \ + |bool dosearch \ + |NULLOK const char * const * const search_ext \ + |I32 flags +Adip |I32 |foldEQ |NN const char *a \ + |NN const char *b \ + |I32 len +Cip |I32 |foldEQ_latin1 |NN const char *a \ + |NN const char *b \ + |I32 len +Adip |I32 |foldEQ_locale |NN const char *a \ + |NN const char *b \ + |I32 len +Adm |I32 |foldEQ_utf8 |NN const char *s1 \ + |NULLOK char **pe1 \ + |UV l1 \ + |bool u1 \ + |NN const char *s2 \ + |NULLOK char **pe2 \ + |UV l2 \ + |bool u2 +Cp |I32 |foldEQ_utf8_flags \ + |NN const char *s1 \ + |NULLOK char **pe1 \ + |UV l1 \ + |bool u1 \ + |NN const char *s2 \ + |NULLOK char **pe2 \ + |UV l2 \ + |bool u2 \ + |U32 flags +Adpx |void |forbid_outofblock_ops \ + |NN OP *o \ + |NN const char *blockname +Tp |void |force_locale_unlock +Cp |void |_force_out_malformed_utf8_message \ + |NN const U8 * const p \ + |NN const U8 * const e \ + |const U32 flags \ + |const bool die_here +Adfp |char * |form |NN const char *pat \ + |... +: Only used in perl.c +p |void |free_tied_hv_pool Cp |void |free_tmps -#if defined(PERL_IN_OP_C) -S |void |gen_constant_list|NULLOK OP* o -#endif -#if !defined(HAS_GETENV_LEN) -: Used in hv.c -p |char* |getenv_len |NN const char *env_elem|NN unsigned long *len -#endif +ERXp |SV * |get_and_check_backslash_N_name \ + |NN const char *s \ + |NN const char *e \ + |const bool is_utf8 \ + |NN const char **error_msg +AOdp |AV * |get_av |NN const char *name \ + |I32 flags +AOdp |CV * |get_cv |NN const char *name \ + |I32 flags +Adp |CV * |get_cvn_flags |NN const char *name \ + |STRLEN len \ + |I32 flags +Adp |int |getcwd_sv |NN SV *sv : Used in pp_ctl.c and pp_hot.c -poe |void |get_db_sub |NULLOK SV **svp|NN CV *cv -Cp |void |gp_free |NULLOK GV* gv -Cp |GP* |gp_ref |NULLOK GP* gp -Apd |GV* |gv_add_by_type |NULLOK GV *gv|svtype type -ApdMb |GV* |gv_AVadd |NULLOK GV *gv -ApdMb |GV* |gv_HVadd |NULLOK GV *gv -ApdMb |GV* |gv_IOadd |NULLOK GV* gv -AdmR |GV* |gv_autoload4 |NULLOK HV* stash|NN const char* name \ - |STRLEN len|I32 method -ApR |GV* |gv_autoload_sv |NULLOK HV* stash|NN SV* namesv|U32 flags -ApR |GV* |gv_autoload_pv |NULLOK HV* stash|NN const char* namepv \ - |U32 flags -ApR |GV* |gv_autoload_pvn |NULLOK HV* stash|NN const char* name \ - |STRLEN len|U32 flags -Cp |void |gv_check |NN HV* stash -AbpD |void |gv_efullname |NN SV* sv|NN const GV* gv -ApdMb |void |gv_efullname3 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix -Apd |void |gv_efullname4 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain -Adp |GV* |gv_fetchfile |NN const char* name -Adp |GV* |gv_fetchfile_flags|NN const char *const name|const STRLEN len\ - |const U32 flags -Amd |GV* |gv_fetchmeth |NULLOK HV* stash|NN const char* name \ - |STRLEN len|I32 level -Apd |GV* |gv_fetchmeth_sv |NULLOK HV* stash|NN SV* namesv|I32 level|U32 flags -Apd |GV* |gv_fetchmeth_pv |NULLOK HV* stash|NN const char* name \ - |I32 level|U32 flags -Apd |GV* |gv_fetchmeth_pvn |NULLOK HV* stash|NN const char* name \ - |STRLEN len|I32 level|U32 flags -Amd |GV* |gv_fetchmeth_autoload |NULLOK HV* stash \ - |NN const char* name|STRLEN len \ - |I32 level -Apd |GV* |gv_fetchmeth_sv_autoload |NULLOK HV* stash|NN SV* namesv|I32 level|U32 flags -Apd |GV* |gv_fetchmeth_pv_autoload |NULLOK HV* stash|NN const char* name \ - |I32 level|U32 flags -Apd |GV* |gv_fetchmeth_pvn_autoload |NULLOK HV* stash|NN const char* name \ - |STRLEN len|I32 level|U32 flags -ApdMb |GV* |gv_fetchmethod |NN HV* stash|NN const char* name -Apd |GV* |gv_fetchmethod_autoload|NN HV* stash|NN const char* name \ +eop |void |get_db_sub |NULLOK SV **svp \ + |NN CV *cv +ERTXp |const char *|get_deprecated_property_msg \ + |const Size_t warning_offset +: Used in mg.c +Tp |int |get_extended_os_errno +: Only used in perl.c +p |void |get_hash_seed |NN unsigned char * const seed_buffer +AOdp |HV * |get_hv |NN const char *name \ + |I32 flags +DPRp |const char *|get_no_modify +DPRp |U32 * |get_opargs +ADPRdp |char **|get_op_descs +ADPRdp |char **|get_op_names +CDPRp |PPADDR_t *|get_ppaddr +ERXp |SV * |get_prop_definition \ + |const int table_index +ERTXp |const char * const *|get_prop_values \ + |const int table_index +: Used by SvRX and SvRXOK +EXopx |REGEXP *|get_re_arg |NULLOK SV *sv +AOdp |SV * |get_sv |NN const char *name \ + |I32 flags +CRipx |MGVTBL *|get_vtbl |int vtbl_id +Cp |void |gp_free |NULLOK GV *gv +Cp |GP * |gp_ref |NULLOK GP *gp +ATdp |bool |grok_atoUV |NN const char *pv \ + |NN UV *valptr \ + |NULLOK const char **endptr +AMdp |UV |grok_bin |NN const char *start \ + |NN STRLEN *len_p \ + |NN I32 *flags \ + |NULLOK NV *result +Cp |UV |grok_bin_oct_hex \ + |NN const char *start \ + |NN STRLEN *len_p \ + |NN I32 *flags \ + |NULLOK NV *result \ + |const unsigned shift \ + |const U8 lookup_bit \ + |const char prefix +AMdp |UV |grok_hex |NN const char *start \ + |NN STRLEN *len_p \ + |NN I32 *flags \ + |NULLOK NV *result +Adp |int |grok_infnan |NN const char **sp \ + |NN const char *send +Adp |int |grok_number |NN const char *pv \ + |STRLEN len \ + |NULLOK UV *valuep +Adp |int |grok_number_flags \ + |NN const char *pv \ + |STRLEN len \ + |NULLOK UV *valuep \ + |U32 flags +ARdp |bool |grok_numeric_radix \ + |NN const char **sp \ + |NN const char *send +AMdp |UV |grok_oct |NN const char *start \ + |NN STRLEN *len_p \ + |NN I32 *flags \ + |NULLOK NV *result +Adp |GV * |gv_add_by_type |NULLOK GV *gv \ + |svtype type +Adp |int |Gv_AMupdate |NN HV *stash \ + |bool destructing +ARdm |GV * |gv_autoload4 |NULLOK HV *stash \ + |NN const char *name \ + |STRLEN len \ + |I32 method +ARdp |GV * |gv_autoload_pv |NULLOK HV *stash \ + |NN const char *namepv \ + |U32 flags +ARdp |GV * |gv_autoload_pvn|NULLOK HV *stash \ + |NN const char *name \ + |STRLEN len \ + |U32 flags +ARdp |GV * |gv_autoload_sv |NULLOK HV *stash \ + |NN SV *namesv \ + |U32 flags +AMbdp |GV * |gv_AVadd |NULLOK GV *gv +Cp |void |gv_check |NN HV *stash +: Used in pp.c and pp_sys.c +ARdp |SV * |gv_const_sv |NN GV *gv +Adp |void |gv_dump |NULLOK GV *gv +AMbdp |void |gv_efullname3 |NN SV *sv \ + |NN const GV *gv \ + |NULLOK const char *prefix +Adp |void |gv_efullname4 |NN SV *sv \ + |NN const GV *gv \ + |NULLOK const char *prefix \ + |bool keepmain +Adp |GV * |gv_fetchfile |NN const char *name +Adp |GV * |gv_fetchfile_flags \ + |NN const char * const name \ + |const STRLEN len \ + |const U32 flags +Adm |GV * |gv_fetchmeth |NULLOK HV *stash \ + |NN const char *name \ + |STRLEN len \ + |I32 level +Adm |GV * |gv_fetchmeth_autoload \ + |NULLOK HV *stash \ + |NN const char *name \ + |STRLEN len \ + |I32 level +AMbdp |GV * |gv_fetchmethod |NN HV *stash \ + |NN const char *name +Adp |GV * |gv_fetchmethod_autoload \ + |NN HV *stash \ + |NN const char *name \ |I32 autoload -Apx |GV* |gv_fetchmethod_sv_flags|NN HV* stash|NN SV* namesv|U32 flags -Apx |GV* |gv_fetchmethod_pv_flags|NN HV* stash|NN const char* name \ +Apx |GV * |gv_fetchmethod_pv_flags \ + |NN HV *stash \ + |NN const char *name \ |U32 flags -Apx |GV* |gv_fetchmethod_pvn_flags|NN HV* stash|NN const char* name \ - |const STRLEN len|U32 flags -Adp |GV* |gv_fetchpv |NN const char *nambeg|I32 flags|const svtype sv_type -AbpD |void |gv_fullname |NN SV* sv|NN const GV* gv -ApdMb |void |gv_fullname3 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix -Apd |void |gv_fullname4 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain -: Used in scope.c -pxoe |GP * |newGP |NN GV *const gv -pX |void |cvgv_set |NN CV* cv|NULLOK GV* gv -poX |GV * |cvgv_from_hek |NN CV* cv -pX |void |cvstash_set |NN CV* cv|NULLOK HV* stash -Amd |void |gv_init |NN GV* gv|NULLOK HV* stash \ - |NN const char* name|STRLEN len|int multi -Apd |void |gv_init_sv |NN GV* gv|NULLOK HV* stash|NN SV* namesv|U32 flags -Apd |void |gv_init_pv |NN GV* gv|NULLOK HV* stash|NN const char* name \ - |U32 flags -Apd |void |gv_init_pvn |NN GV* gv|NULLOK HV* stash|NN const char* name \ - |STRLEN len|U32 flags -Ap |void |gv_name_set |NN GV* gv|NN const char *name|U32 len|U32 flags -pe |GV * |gv_override |NN const char * const name \ +Apx |GV * |gv_fetchmethod_pvn_flags \ + |NN HV *stash \ + |NN const char *name \ + |const STRLEN len \ + |U32 flags +Apx |GV * |gv_fetchmethod_sv_flags \ + |NN HV *stash \ + |NN SV *namesv \ + |U32 flags +Adp |GV * |gv_fetchmeth_pv|NULLOK HV *stash \ + |NN const char *name \ + |I32 level \ + |U32 flags +Adp |GV * |gv_fetchmeth_pv_autoload \ + |NULLOK HV *stash \ + |NN const char *name \ + |I32 level \ + |U32 flags +Adp |GV * |gv_fetchmeth_pvn \ + |NULLOK HV *stash \ + |NN const char *name \ + |STRLEN len \ + |I32 level \ + |U32 flags +Adp |GV * |gv_fetchmeth_pvn_autoload \ + |NULLOK HV *stash \ + |NN const char *name \ + |STRLEN len \ + |I32 level \ + |U32 flags +Adp |GV * |gv_fetchmeth_sv|NULLOK HV *stash \ + |NN SV *namesv \ + |I32 level \ + |U32 flags +Adp |GV * |gv_fetchmeth_sv_autoload \ + |NULLOK HV *stash \ + |NN SV *namesv \ + |I32 level \ + |U32 flags +Adp |GV * |gv_fetchpv |NN const char *nambeg \ + |I32 flags \ + |const svtype sv_type + +Adp |GV * |gv_fetchpvn_flags \ + |NN const char *name \ + |STRLEN len \ + |I32 flags \ + |const svtype sv_type +Adp |GV * |gv_fetchsv |NN SV *name \ + |I32 flags \ + |const svtype sv_type +AMbdp |void |gv_fullname3 |NN SV *sv \ + |NN const GV *gv \ + |NULLOK const char *prefix +Adp |void |gv_fullname4 |NN SV *sv \ + |NN const GV *gv \ + |NULLOK const char *prefix \ + |bool keepmain +CRdp |CV * |gv_handler |NULLOK HV *stash \ + |I32 id +AMbdp |GV * |gv_HVadd |NULLOK GV *gv +Adm |void |gv_init |NN GV *gv \ + |NULLOK HV *stash \ + |NN const char *name \ + |STRLEN len \ + |int multi +Adp |void |gv_init_pv |NN GV *gv \ + |NULLOK HV *stash \ + |NN const char *name \ + |U32 flags +Adp |void |gv_init_pvn |NN GV *gv \ + |NULLOK HV *stash \ + |NN const char *name \ + |STRLEN len \ + |U32 flags +Adp |void |gv_init_sv |NN GV *gv \ + |NULLOK HV *stash \ + |NN SV *namesv \ + |U32 flags +AMbdp |GV * |gv_IOadd |NULLOK GV *gv +Adp |void |gv_name_set |NN GV *gv \ + |NN const char *name \ + |U32 len \ + |U32 flags +ep |GV * |gv_override |NN const char * const name \ |const STRLEN len -Xxpd |void |gv_try_downgrade|NN GV* gv -p |void |gv_setref |NN SV *const dsv|NN SV *const ssv -Apd |HV* |gv_stashpv |NN const char* name|I32 flags -Apd |HV* |gv_stashpvn |NN const char* name|U32 namelen|I32 flags -#if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C) -EpGd |HV* |gv_stashsvpvn_cached|SV *namesv|const char* name|U32 namelen|I32 flags -#endif -#if defined(PERL_IN_GV_C) -i |HV* |gv_stashpvn_internal |NN const char* name|U32 namelen|I32 flags -i |GV* |gv_fetchmeth_internal |NULLOK HV* stash|NULLOK SV* meth|NULLOK const char* name \ - |STRLEN len|I32 level|U32 flags -#endif -Apd |HV* |gv_stashsv |NN SV* sv|I32 flags -po |struct xpvhv_aux*|hv_auxalloc|NN HV *hv -Apd |void |hv_clear |NULLOK HV *hv +p |void |gv_setref |NN SV * const dsv \ + |NN SV * const ssv +Adp |HV * |gv_stashpv |NN const char *name \ + |I32 flags +Adp |HV * |gv_stashpvn |NN const char *name \ + |U32 namelen \ + |I32 flags +Adp |HV * |gv_stashsv |NN SV *sv \ + |I32 flags +Xdpx |void |gv_try_downgrade \ + |NN GV *gv +op |struct xpvhv_aux *|hv_auxalloc \ + |NN HV *hv +: Used in dump.c and hv.c +opx |AV ** |hv_backreferences_p \ + |NN HV *hv +ARdpx |SV * |hv_bucket_ratio|NN HV *hv +Adp |void |hv_clear |NULLOK HV *hv +Adp |void |hv_clear_placeholders \ + |NN HV *hv +Cp |void * |hv_common |NULLOK HV *hv \ + |NULLOK SV *keysv \ + |NULLOK const char *key \ + |STRLEN klen \ + |int flags \ + |int action \ + |NULLOK SV *val \ + |U32 hash +Cp |void * |hv_common_key_len \ + |NULLOK HV *hv \ + |NN const char *key \ + |I32 klen_i32 \ + |const int action \ + |NULLOK SV *val \ + |const U32 hash : used in SAVEHINTS() and op.c -ApdR |HV * |hv_copy_hints_hv|NULLOK HV *const ohv -Cp |void |hv_delayfree_ent|NULLOK HV *notused|NULLOK HE *entry -AbMdp |SV* |hv_delete |NULLOK HV *hv|NN const char *key|I32 klen \ - |I32 flags -AbMdp |SV* |hv_delete_ent |NULLOK HV *hv|NN SV *keysv|I32 flags|U32 hash -AbMdRp |bool |hv_exists |NULLOK HV *hv|NN const char *key|I32 klen -AbMdRp |bool |hv_exists_ent |NULLOK HV *hv|NN SV *keysv|U32 hash -AbMdp |SV** |hv_fetch |NULLOK HV *hv|NN const char *key|I32 klen \ +ARdp |HV * |hv_copy_hints_hv \ + |NULLOK HV * const ohv +Cp |void |hv_delayfree_ent \ + |NULLOK HV *notused \ + |NULLOK HE *entry +AMbdp |SV * |hv_delete |NULLOK HV *hv \ + |NN const char *key \ + |I32 klen \ + |I32 flags +AMbdp |SV * |hv_delete_ent |NULLOK HV *hv \ + |NN SV *keysv \ + |I32 flags \ + |U32 hash +Adp |void |hv_dump |NULLOK HV *hv +CRdop |HE ** |hv_eiter_p |NN HV *hv +Cdop |void |hv_eiter_set |NN HV *hv \ + |NULLOK HE *eiter +dp |void |hv_ename_add |NN HV *hv \ + |NN const char *name \ + |U32 len \ + |U32 flags +dp |void |hv_ename_delete|NN HV *hv \ + |NN const char *name \ + |U32 len \ + |U32 flags +AMRbdp |bool |hv_exists |NULLOK HV *hv \ + |NN const char *key \ + |I32 klen +AMRbdp |bool |hv_exists_ent |NULLOK HV *hv \ + |NN SV *keysv \ + |U32 hash +AMbdp |SV ** |hv_fetch |NULLOK HV *hv \ + |NN const char *key \ + |I32 klen \ |I32 lval -AbMdp |HE* |hv_fetch_ent |NULLOK HV *hv|NN SV *keysv|I32 lval|U32 hash -Cp |void* |hv_common |NULLOK HV *hv|NULLOK SV *keysv \ - |NULLOK const char* key|STRLEN klen|int flags \ - |int action|NULLOK SV *val|U32 hash -Cp |void* |hv_common_key_len|NULLOK HV *hv|NN const char *key \ - |I32 klen_i32|const int action|NULLOK SV *val \ - |const U32 hash -Cpod |STRLEN |hv_fill |NN HV *const hv -Ap |void |hv_free_ent |NULLOK HV *notused|NULLOK HE *entry -Apd |I32 |hv_iterinit |NN HV *hv -ApdR |char* |hv_iterkey |NN HE* entry|NN I32* retlen -ApdR |SV* |hv_iterkeysv |NN HE* entry -ApdRbM |HE* |hv_iternext |NN HV *hv -ApdR |SV* |hv_iternextsv |NN HV *hv|NN char **key|NN I32 *retlen -ApxdR |HE* |hv_iternext_flags|NN HV *hv|I32 flags -ApdR |SV* |hv_iterval |NN HV *hv|NN HE *entry -Ap |void |hv_ksplit |NN HV *hv|IV newmax -ApdbM |void |hv_magic |NN HV *hv|NULLOK GV *gv|int how -#if defined(PERL_IN_HV_C) -S |SV * |refcounted_he_value |NN const struct refcounted_he *he -#endif -Xpd |HV * |refcounted_he_chain_2hv|NULLOK const struct refcounted_he *c|U32 flags -Xpd |SV * |refcounted_he_fetch_pvn|NULLOK const struct refcounted_he *chain \ - |NN const char *keypv|STRLEN keylen|U32 hash|U32 flags -Xpd |SV * |refcounted_he_fetch_pv|NULLOK const struct refcounted_he *chain \ - |NN const char *key|U32 hash|U32 flags -Xpd |SV * |refcounted_he_fetch_sv|NULLOK const struct refcounted_he *chain \ - |NN SV *key|U32 hash|U32 flags -Xpd |struct refcounted_he *|refcounted_he_new_pvn \ - |NULLOK struct refcounted_he *parent \ - |NN const char *keypv|STRLEN keylen \ - |U32 hash|NULLOK SV *value|U32 flags -Xpd |struct refcounted_he *|refcounted_he_new_pv \ - |NULLOK struct refcounted_he *parent \ - |NN const char *key \ - |U32 hash|NULLOK SV *value|U32 flags -Xpd |struct refcounted_he *|refcounted_he_new_sv \ - |NULLOK struct refcounted_he *parent \ - |NN SV *key \ - |U32 hash|NULLOK SV *value|U32 flags -Xpd |void |refcounted_he_free|NULLOK struct refcounted_he *he -Xpd |struct refcounted_he *|refcounted_he_inc|NULLOK struct refcounted_he *he -ApbMd |SV** |hv_store |NULLOK HV *hv|NULLOK const char *key \ - |I32 klen|NULLOK SV *val|U32 hash -ApbMd |HE* |hv_store_ent |NULLOK HV *hv|NULLOK SV *key|NULLOK SV *val\ +AMbdp |HE * |hv_fetch_ent |NULLOK HV *hv \ + |NN SV *keysv \ + |I32 lval \ |U32 hash -ApbMx |SV** |hv_store_flags |NULLOK HV *hv|NULLOK const char *key \ - |I32 klen|NULLOK SV *val|U32 hash|int flags -Amd |void |hv_undef |NULLOK HV *hv -poX |void |hv_undef_flags |NULLOK HV *hv|U32 flags -AdmP |I32 |ibcmp |NN const char* a|NN const char* b|I32 len -AdiTp |I32 |foldEQ |NN const char* a|NN const char* b|I32 len -AdmP |I32 |ibcmp_locale |NN const char* a|NN const char* b|I32 len -AiTpd |I32 |foldEQ_locale |NN const char* a|NN const char* b|I32 len -Adm |I32 |ibcmp_utf8 |NN const char *s1|NULLOK char **pe1|UV l1 \ - |bool u1|NN const char *s2|NULLOK char **pe2 \ - |UV l2|bool u2 -Amd |I32 |foldEQ_utf8 |NN const char *s1|NULLOK char **pe1|UV l1 \ - |bool u1|NN const char *s2|NULLOK char **pe2 \ - |UV l2|bool u2 -Cp |I32 |foldEQ_utf8_flags |NN const char *s1|NULLOK char **pe1|UV l1 \ - |bool u1|NN const char *s2|NULLOK char **pe2 \ - |UV l2|bool u2|U32 flags -CiTp |I32 |foldEQ_latin1 |NN const char* a|NN const char* b|I32 len -#if defined(PERL_IN_DOIO_C) -SR |bool |ingroup |Gid_t testgid|bool effective -#endif +Cdop |STRLEN |hv_fill |NN HV * const hv +Cp |void |hv_free_ent |NULLOK HV *notused \ + |NULLOK HE *entry +Adp |I32 |hv_iterinit |NN HV *hv +ARdp |char * |hv_iterkey |NN HE *entry \ + |NN I32 *retlen +ARdp |SV * |hv_iterkeysv |NN HE *entry +AMRbdp |HE * |hv_iternext |NN HV *hv +ARdpx |HE * |hv_iternext_flags \ + |NN HV *hv \ + |I32 flags +ARdp |SV * |hv_iternextsv |NN HV *hv \ + |NN char **key \ + |NN I32 *retlen +ARdp |SV * |hv_iterval |NN HV *hv \ + |NN HE *entry +Adp |void |hv_ksplit |NN HV *hv \ + |IV newmax +AMbdp |void |hv_magic |NN HV *hv \ + |NULLOK GV *gv \ + |int how +Adp |void |hv_name_set |NN HV *hv \ + |NULLOK const char *name \ + |U32 len \ + |U32 flags +CRdop |I32 |hv_placeholders_get \ + |NN const HV *hv +RXop |SSize_t *|hv_placeholders_p \ + |NN HV *hv +Cdop |void |hv_placeholders_set \ + |NN HV *hv \ + |I32 ph +p |void |hv_pushkv |NN HV *hv \ + |U32 flags +Cp |void |hv_rand_set |NN HV *hv \ + |U32 new_xhv_rand +CRdop |I32 * |hv_riter_p |NN HV *hv +Cdop |void |hv_riter_set |NN HV *hv \ + |I32 riter + +ARdp |SV * |hv_scalar |NN HV *hv +AMbdp |SV ** |hv_store |NULLOK HV *hv \ + |NULLOK const char *key \ + |I32 klen \ + |NULLOK SV *val \ + |U32 hash +AMbdp |HE * |hv_store_ent |NULLOK HV *hv \ + |NULLOK SV *key \ + |NULLOK SV *val \ + |U32 hash +AMbpx |SV ** |hv_store_flags |NULLOK HV *hv \ + |NULLOK const char *key \ + |I32 klen \ + |NULLOK SV *val \ + |U32 hash \ + |int flags +Adm |SV ** |hv_stores |NULLOK HV *hv \ + |"key" \ + |NULLOK SV *val +Adm |void |hv_undef |NULLOK HV *hv +Xop |void |hv_undef_flags |NULLOK HV *hv \ + |U32 flags +APdm |I32 |ibcmp |NN const char *a \ + |NN const char *b \ + |I32 len +APdm |I32 |ibcmp_locale |NN const char *a \ + |NN const char *b \ + |I32 len +Adm |I32 |ibcmp_utf8 |NN const char *s1 \ + |NULLOK char **pe1 \ + |UV l1 \ + |bool u1 \ + |NN const char *s2 \ + |NULLOK char **pe2 \ + |UV l2 \ + |bool u2 + +eop |STRLEN |infix_plugin_standard \ + |NN char *operator_ptr \ + |STRLEN operator_len \ + |NN struct Perl_custom_infix **def : Used in toke.c -p |void |init_argv_symbols|int argc|NN char **argv +p |void |init_argv_symbols \ + |int argc \ + |NN char **argv +p |void |init_constants : Used in pp_ctl.c -po |void |init_dbargs +op |void |init_dbargs : Used in mg.c p |void |init_debugger +COp |int |init_i18nl10n |int printwarn +Xp |void |init_named_cv |NN CV *cv \ + |NN OP *nameop Cp |void |init_stacks Cp |void |init_tm |NN struct tm *ptm +p |void |init_uniprops : Used in perly.y -AbMTpPRd|char* |instr |NN const char* big|NN const char* little -: Used in sv.c -p |bool |io_close |NN IO* io|NULLOK GV *gv \ - |bool not_implicit|bool warn_on_fail +AMPRTbdp|char * |instr |NN const char *big \ + |NN const char *little +Adp |U32 |intro_my +ERXp |Size_t |_inverse_folds |const UV cp \ + |NN U32 *first_folds_to \ + |NN const U32 **remaining_folds_to : Used in perly.y -pR |OP* |invert |NULLOK OP* cmd -pR |OP* |cmpchain_start |I32 type|NULLOK OP* left \ - |NULLOK OP* right -pR |OP* |cmpchain_extend|I32 type|NN OP* ch|NULLOK OP* right -pR |OP* |cmpchain_finish|NN OP* ch -ApdR |I32 |is_lvalue_sub -: Used in cop.h -XopR |I32 |was_lvalue_sub -CpRTP |STRLEN |is_utf8_char_helper_|NN const U8 * const s|NN const U8 * e|const U32 flags -CpRTP |Size_t |is_utf8_FF_helper_|NN const U8 * const s0 \ - |NN const U8 * const e \ +Rp |OP * |invert |NULLOK OP *cmd +p |void |invmap_dump |NN SV *invlist \ + |NN UV *map +: Used in sv.c +p |bool |io_close |NN IO *io \ + |NULLOK GV *gv \ + |bool is_explicit \ + |bool warn_on_fail +APRTdm |bool |is_ascii_string|NN const U8 * const s \ + |STRLEN len +ARTdip |Size_t |isC9_STRICT_UTF8_CHAR \ + |NN const U8 * const s0 \ + |NN const U8 * const e +ARTdm |bool |is_c9strict_utf8_string \ + |NN const U8 *s \ + |STRLEN len +ATdm |bool |is_c9strict_utf8_string_loc \ + |NN const U8 *s \ + |STRLEN len \ + |NN const U8 **ep +ATdip |bool |is_c9strict_utf8_string_loclen \ + |NN const U8 *s \ + |STRLEN len \ + |NULLOK const U8 **ep \ + |NULLOK STRLEN *el + +APTdp |bool |isinfnan |NV nv +dp |bool |isinfnansv |NN SV *sv +Cp |bool |_is_in_locale_category \ + |const bool compiling \ + |const int category +APRTdm |bool |is_invariant_string \ + |NN const U8 * const s \ + |STRLEN len +ARdp |I32 |is_lvalue_sub +: used to check for NULs in pathnames and other names +ARdip |bool |is_safe_syscall|NN const char *pv \ + |STRLEN len \ + |NN const char *what \ + |NN const char *op_name +ARTdip |Size_t |isSTRICT_UTF8_CHAR \ + |NN const U8 * const s0 \ + |NN const U8 * const e +ARTdm |bool |is_strict_utf8_string \ + |NN const U8 *s \ + |STRLEN len +ATdm |bool |is_strict_utf8_string_loc \ + |NN const U8 *s \ + |STRLEN len \ + |NN const U8 **ep +ATdip |bool |is_strict_utf8_string_loclen \ + |NN const U8 *s \ + |STRLEN len \ + |NULLOK const U8 **ep \ + |NULLOK STRLEN *el +CRp |bool |_is_uni_FOO |const U8 classnum \ + |const UV c +CRp |bool |_is_uni_perl_idcont \ + |UV c +CRp |bool |_is_uni_perl_idstart \ + |UV c +ARTdip |Size_t |isUTF8_CHAR |NN const U8 * const s0 \ + |NN const U8 * const e +AMTbdp |STRLEN |is_utf8_char_buf \ + |NN const U8 *buf \ + |NN const U8 *buf_end +ARTdip |Size_t |isUTF8_CHAR_flags \ + |NN const U8 * const s0 \ + |NN const U8 * const e \ + |const U32 flags +CPRTp |STRLEN |is_utf8_char_helper_ \ + |NN const U8 * const s \ + |NN const U8 *e \ + |const U32 flags +CPRTp |Size_t |is_utf8_FF_helper_ \ + |NN const U8 * const s0 \ + |NN const U8 * const e \ |const bool require_partial -Cp |UV |to_uni_upper |UV c|NN U8 *p|NN STRLEN *lenp -Cp |UV |to_uni_title |UV c|NN U8 *p|NN STRLEN *lenp -p |void |init_uniprops -#ifdef PERL_IN_UTF8_C -STR |U8 |to_lower_latin1|const U8 c|NULLOK U8 *p|NULLOK STRLEN *lenp \ - |const char dummy -#endif -#if defined(PERL_IN_UTF8_C) || defined(PERL_IN_PP_C) -p |UV |_to_upper_title_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const char S_or_s -#endif -Cp |UV |to_uni_lower |UV c|NN U8 *p|NN STRLEN *lenp -Cm |UV |to_uni_fold |UV c|NN U8 *p|NN STRLEN *lenp -Cp |UV |_to_uni_fold_flags|UV c|NN U8 *p|NN STRLEN *lenp|U8 flags -CpR |bool |_is_uni_perl_idcont|UV c -CpR |bool |_is_uni_perl_idstart|UV c -ATdmoR |bool |is_utf8_invariant_string|NN const U8* const s \ - |STRLEN len -ATidRp |bool |is_utf8_invariant_string_loc|NN const U8* const s \ - |STRLEN len \ - |NULLOK const U8 ** ep -CTiRp |unsigned|single_1bit_pos32|U32 word -CTiRp |unsigned|lsbit_pos32|U32 word -CTiRp |unsigned|msbit_pos32|U32 word -#ifdef U64TYPE /* HAS_QUAD undefined outside of core */ -CTiRp |unsigned|single_1bit_pos64|U64 word -CTiRp |unsigned|lsbit_pos64|U64 word -CTiRp |unsigned|msbit_pos64|U64 word -#endif -#ifndef EBCDIC -CTiRp |unsigned int|variant_byte_number|PERL_UINTMAX_T word -#endif -#if defined(PERL_CORE) || defined(PERL_EXT) -EiTRd |Size_t |variant_under_utf8_count|NN const U8* const s \ - |NN const U8* const e -#endif -AmTdRP |bool |is_ascii_string|NN const U8* const s|STRLEN len -AmTdRP |bool |is_invariant_string|NN const U8* const s|STRLEN len -#if defined(PERL_CORE) || defined (PERL_EXT) -EXTidRp |bool |is_utf8_non_invariant_string|NN const U8* const s \ - |STRLEN len -#endif -AbTpdD |STRLEN |is_utf8_char |NN const U8 *s -AbMTpd |STRLEN |is_utf8_char_buf|NN const U8 *buf|NN const U8 *buf_end -ATidRp |Size_t |isUTF8_CHAR|NN const U8 * const s0 \ - |NN const U8 * const e -ATidRp |Size_t |isUTF8_CHAR_flags|NN const U8 * const s0 \ - |NN const U8 * const e \ - |const U32 flags -ATidRp |Size_t |isSTRICT_UTF8_CHAR |NN const U8 * const s0 \ - |NN const U8 * const e -ATidRp |Size_t |isC9_STRICT_UTF8_CHAR |NN const U8 * const s0 \ - |NN const U8 * const e -ATmdR |bool |is_utf8_string |NN const U8 *s|STRLEN len -ATidRp |bool |is_utf8_string_flags \ - |NN const U8 *s|STRLEN len|const U32 flags -ATmdR |bool |is_strict_utf8_string|NN const U8 *s|STRLEN len -ATmdR |bool |is_c9strict_utf8_string|NN const U8 *s|STRLEN len -ATpdMb |bool |is_utf8_string_loc \ - |NN const U8 *s|const STRLEN len|NN const U8 **ep -ATdm |bool |is_utf8_string_loc_flags \ - |NN const U8 *s|STRLEN len|NN const U8 **ep \ - |const U32 flags -ATdm |bool |is_strict_utf8_string_loc \ - |NN const U8 *s|STRLEN len|NN const U8 **ep -ATdm |bool |is_c9strict_utf8_string_loc \ - |NN const U8 *s|STRLEN len|NN const U8 **ep -ATipd |bool |is_utf8_string_loclen \ - |NN const U8 *s|STRLEN len|NULLOK const U8 **ep \ - |NULLOK STRLEN *el -ATidp |bool |is_utf8_string_loclen_flags \ - |NN const U8 *s|STRLEN len|NULLOK const U8 **ep \ - |NULLOK STRLEN *el|const U32 flags -ATidp |bool |is_strict_utf8_string_loclen \ - |NN const U8 *s|STRLEN len|NULLOK const U8 **ep \ - |NULLOK STRLEN *el -ATidp |bool |is_c9strict_utf8_string_loclen \ - |NN const U8 *s|STRLEN len|NULLOK const U8 **ep \ - |NULLOK STRLEN *el -AmTd |bool |is_utf8_fixed_width_buf_flags \ - |NN const U8 * const s|STRLEN len|const U32 flags -AmTd |bool |is_utf8_fixed_width_buf_loc_flags \ - |NN const U8 * const s|STRLEN len \ - |NULLOK const U8 **ep|const U32 flags -ATidp |bool |is_utf8_fixed_width_buf_loclen_flags \ - |NN const U8 * const s|STRLEN len \ - |NULLOK const U8 **ep|NULLOK STRLEN *el|const U32 flags -AmTdP |bool |is_utf8_valid_partial_char \ - |NN const U8 * const s0|NN const U8 * const e -ATidRp |bool |is_utf8_valid_partial_char_flags \ - |NN const U8 * const s0|NN const U8 * const e|const U32 flags -CpR |bool |_is_uni_FOO|const U8 classnum|const UV c -CpR |bool |_is_utf8_FOO|const U8 classnum|NN const U8 *p \ - |NN const U8 * const e -CpR |bool |_is_utf8_perl_idcont|NN const U8 *p|NN const U8 * const e -CpR |bool |_is_utf8_perl_idstart|NN const U8 *p|NN const U8 * const e +ATdm |bool |is_utf8_fixed_width_buf_flags \ + |NN const U8 * const s \ + |STRLEN len \ + |const U32 flags +ATdm |bool |is_utf8_fixed_width_buf_loc_flags \ + |NN const U8 * const s \ + |STRLEN len \ + |NULLOK const U8 **ep \ + |const U32 flags +ATdip |bool |is_utf8_fixed_width_buf_loclen_flags \ + |NN const U8 * const s \ + |STRLEN len \ + |NULLOK const U8 **ep \ + |NULLOK STRLEN *el \ + |const U32 flags +CRp |bool |_is_utf8_FOO |const U8 classnum \ + |NN const U8 *p \ + |NN const U8 * const e +ARTdmo |bool |is_utf8_invariant_string \ + |NN const U8 * const s \ + |STRLEN len +ARTdip |bool |is_utf8_invariant_string_loc \ + |NN const U8 * const s \ + |STRLEN len \ + |NULLOK const U8 **ep +CRp |bool |_is_utf8_perl_idcont \ + |NN const U8 *p \ + |NN const U8 * const e +CRp |bool |_is_utf8_perl_idstart \ + |NN const U8 *p \ + |NN const U8 * const e +ARTdm |bool |is_utf8_string |NN const U8 *s \ + |STRLEN len +ARTdip |bool |is_utf8_string_flags \ + |NN const U8 *s \ + |STRLEN len \ + |const U32 flags +AMTbdp |bool |is_utf8_string_loc \ + |NN const U8 *s \ + |const STRLEN len \ + |NN const U8 **ep +ATdm |bool |is_utf8_string_loc_flags \ + |NN const U8 *s \ + |STRLEN len \ + |NN const U8 **ep \ + |const U32 flags +ATdip |bool |is_utf8_string_loclen \ + |NN const U8 *s \ + |STRLEN len \ + |NULLOK const U8 **ep \ + |NULLOK STRLEN *el +ATdip |bool |is_utf8_string_loclen_flags \ + |NN const U8 *s \ + |STRLEN len \ + |NULLOK const U8 **ep \ + |NULLOK STRLEN *el \ + |const U32 flags +APTdm |bool |is_utf8_valid_partial_char \ + |NN const U8 * const s0 \ + |NN const U8 * const e +ARTdip |bool |is_utf8_valid_partial_char_flags \ + |NN const U8 * const s0 \ + |NN const U8 * const e \ + |const U32 flags -#if defined(PERL_CORE) || defined(PERL_EXT) -EXdpR |bool |isSCRIPT_RUN |NN const U8 *s|NN const U8 *send \ - |const bool utf8_target -#endif : Used in perly.y -p |OP* |jmaybe |NN OP *o +p |OP * |jmaybe |NN OP *o : Used in pp.c -pP |I32 |keyword |NN const char *name|I32 len|bool all_keywords -#if defined(PERL_IN_OP_C) -S |void |inplace_aassign |NN OP* o -#endif -Cpd |void |leave_scope |I32 base -p |void |notify_parser_that_changed_to_utf8 +Pp |I32 |keyword |NN const char *name \ + |I32 len \ + |bool all_keywords + +eop |int |keyword_plugin_standard \ + |NN char *keyword_ptr \ + |STRLEN keyword_len \ + |NN OP **op_ptr + +Apx |void |leave_adjust_stacks \ + |NN SV **from_sp \ + |NN SV **to_sp \ + |U8 gimme \ + |int filter +Cdp |void |leave_scope |I32 base +Adpx |bool |lex_bufutf8 +Adpx |void |lex_discard_to |NN char *ptr +Adpx |char * |lex_grow_linestr \ + |STRLEN len +Adpx |bool |lex_next_chunk |U32 flags +Adpx |I32 |lex_peek_unichar \ + |U32 flags +Adpx |void |lex_read_space |U32 flags +Adpx |void |lex_read_to |NN char *ptr +Adpx |I32 |lex_read_unichar \ + |U32 flags : Public lexer API -Axpd |void |lex_start |NULLOK SV* line|NULLOK PerlIO *rsfp|U32 flags -Axpd |bool |lex_bufutf8 -Axpd |char* |lex_grow_linestr|STRLEN len -Axpd |void |lex_stuff_pvn |NN const char* pv|STRLEN len|U32 flags -Axpd |void |lex_stuff_pv |NN const char* pv|U32 flags -Axpd |void |lex_stuff_sv |NN SV* sv|U32 flags -Axpd |void |lex_unstuff |NN char* ptr -Axpd |void |lex_read_to |NN char* ptr -Axpd |void |lex_discard_to |NN char* ptr -Axpd |bool |lex_next_chunk |U32 flags -Axpd |I32 |lex_peek_unichar|U32 flags -Axpd |I32 |lex_read_unichar|U32 flags -Axpd |void |lex_read_space |U32 flags -: Public parser API -Axpd |OP* |parse_arithexpr|U32 flags -Axpd |OP* |parse_termexpr |U32 flags -Axpd |OP* |parse_listexpr |U32 flags -Axpd |OP* |parse_fullexpr |U32 flags -Axpd |OP* |parse_block |U32 flags -Axpd |OP* |parse_barestmt |U32 flags -Axpd |SV* |parse_label |U32 flags -Axpd |OP* |parse_fullstmt |U32 flags -Axpd |OP* |parse_stmtseq |U32 flags -Axpd |OP* |parse_subsignature|U32 flags -: Used in various files -Apd |void |op_null |NN OP* o -: FIXME. Used by Data::Alias -EXp |void |op_clear |NN OP* o -Cpd |void |op_refcnt_lock -Cpd |void |op_refcnt_unlock -ApdT |OP* |op_sibling_splice|NULLOK OP *parent|NULLOK OP *start \ - |int del_count|NULLOK OP* insert -ApdT |OP* |op_parent|NN OP *o -#if defined(PERL_IN_OP_C) -S |OP* |listkids |NULLOK OP* o -#endif -p |OP* |list |NULLOK OP* o -AFpd |void |load_module|U32 flags|NN SV* name|NULLOK SV* ver|... -Adp |void |vload_module|U32 flags|NN SV* name|NULLOK SV* ver|NULLOK va_list* args +Adpx |void |lex_start |NULLOK SV *line \ + |NULLOK PerlIO *rsfp \ + |U32 flags +Adpx |void |lex_stuff_pv |NN const char *pv \ + |U32 flags +Adpx |void |lex_stuff_pvn |NN const char *pv \ + |STRLEN len \ + |U32 flags +Adpx |void |lex_stuff_sv |NN SV *sv \ + |U32 flags +Adpx |void |lex_unstuff |NN char *ptr +p |OP * |list |NULLOK OP *o +ERXp |HV * |load_charnames |NN SV *char_name \ + |NN const char *context \ + |const STRLEN context_len \ + |NN const char **error_msg +AFdp |void |load_module |U32 flags \ + |NN SV *name \ + |NULLOK SV *ver \ + |... +CTopr |void |locale_panic |NN const char *msg \ + |NN const char *file_name \ + |const line_t line \ + |const int errnum : Used in perly.y -p |OP* |localize |NN OP *o|I32 lex -ApdR |I32 |looks_like_number|NN SV *const sv -AMpd |UV |grok_hex |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result -Apd |int |grok_infnan |NN const char** sp|NN const char *send -Apd |int |grok_number |NN const char *pv|STRLEN len|NULLOK UV *valuep -Apd |int |grok_number_flags|NN const char *pv|STRLEN len|NULLOK UV *valuep|U32 flags -ApdR |bool |grok_numeric_radix|NN const char **sp|NN const char *send -ApMd |UV |grok_oct |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result -ApMd |UV |grok_bin |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result -Cp |UV |grok_bin_oct_hex|NN const char* start \ - |NN STRLEN* len_p \ - |NN I32* flags \ - |NULLOK NV *result \ - |const unsigned shift \ - |const U8 lookup_bit \ - |const char prefix -#ifdef PERL_IN_NUMERIC_C -S |void |output_non_portable|const U8 shift -#endif -ApdT |bool |grok_atoUV |NN const char* pv|NN UV* valptr|NULLOK const char** endptr +p |OP * |localize |NN OP *o \ + |I32 lex +ARdp |I32 |looks_like_number \ + |NN SV * const sv +CRTip |unsigned|lsbit_pos32 |U32 word +p |int |magic_clear_all_env \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_cleararylen_p \ + |NN SV *sv \ + |NN MAGIC *mg : These are all indirectly referenced by globals.c. This is somewhat annoying. -p |int |magic_clearenv |NN SV* sv|NN MAGIC* mg -p |int |magic_clear_all_env|NN SV* sv|NN MAGIC* mg -dp |int |magic_clearhint|NN SV* sv|NN MAGIC* mg -dp |int |magic_clearhints|NN SV* sv|NN MAGIC* mg -p |int |magic_clearisa |NULLOK SV* sv|NN MAGIC* mg -p |int |magic_clearpack|NN SV* sv|NN MAGIC* mg -p |int |magic_clearsig |NN SV* sv|NN MAGIC* mg -p |int |magic_copycallchecker|NN SV* sv|NN MAGIC *mg|NN SV *nsv \ - |NULLOK const char *name|I32 namlen -p |int |magic_existspack|NN SV* sv|NN const MAGIC* mg -p |int |magic_freeovrld|NN SV* sv|NN MAGIC* mg -p |int |magic_get |NN SV* sv|NN MAGIC* mg -p |int |magic_getarylen|NN SV* sv|NN const MAGIC* mg -p |int |magic_getdefelem|NN SV* sv|NN MAGIC* mg -p |int |magic_getdebugvar|NN SV* sv|NN MAGIC* mg -p |int |magic_getnkeys |NN SV* sv|NN MAGIC* mg -p |int |magic_getpack |NN SV* sv|NN MAGIC* mg -p |int |magic_getpos |NN SV* sv|NN MAGIC* mg -p |int |magic_getsig |NN SV* sv|NN MAGIC* mg -p |int |magic_getsubstr|NN SV* sv|NN MAGIC* mg -p |int |magic_gettaint |NN SV* sv|NN MAGIC* mg -p |int |magic_getuvar |NN SV* sv|NN MAGIC* mg -p |int |magic_getvec |NN SV* sv|NN MAGIC* mg -p |int |magic_nextpack |NN SV *sv|NN MAGIC *mg|NN SV *key -p |U32 |magic_regdata_cnt|NN SV* sv|NN MAGIC* mg -p |int |magic_regdatum_get|NN SV* sv|NN MAGIC* mg +p |int |magic_clearenv |NN SV *sv \ + |NN MAGIC *mg +dp |int |magic_clearhint|NN SV *sv \ + |NN MAGIC *mg +dp |int |magic_clearhints \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_clearhook|NULLOK SV *sv \ + |NN MAGIC *mg +p |int |magic_clearhookall \ + |NULLOK SV *sv \ + |NN MAGIC *mg +p |int |magic_clearisa |NULLOK SV *sv \ + |NN MAGIC *mg +p |int |magic_clearpack|NN SV *sv \ + |NN MAGIC *mg +p |int |magic_clearsig |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_copycallchecker \ + |NN SV *sv \ + |NN MAGIC *mg \ + |NN SV *nsv \ + |NULLOK const char *name \ + |I32 namlen +Adp |void |magic_dump |NULLOK const MAGIC *mg +p |int |magic_existspack \ + |NN SV *sv \ + |NN const MAGIC *mg +p |int |magic_freearylen_p \ + |NN SV *sv \ + |NN MAGIC *mg +dp |int |magic_freedestruct \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_freemglob|NN SV *sv \ + |NN MAGIC *mg +p |int |magic_freeovrld|NN SV *sv \ + |NN MAGIC *mg +p |int |magic_freeutf8 |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_get |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_getarylen|NN SV *sv \ + |NN const MAGIC *mg +p |int |magic_getdebugvar \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_getdefelem \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_getnkeys |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_getpack |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_getpos |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_getsig |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_getsubstr|NN SV *sv \ + |NN MAGIC *mg +p |int |magic_gettaint |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_getuvar |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_getvec |NN SV *sv \ + |NN MAGIC *mg +: This is indirectly referenced by globals.c. This is somewhat annoying. +p |int |magic_killbackrefs \ + |NN SV *sv \ + |NN MAGIC *mg +Fdop |SV * |magic_methcall |NN SV *sv \ + |NN const MAGIC *mg \ + |NN SV *meth \ + |U32 flags \ + |U32 argc \ + |... +p |int |magic_nextpack |NN SV *sv \ + |NN MAGIC *mg \ + |NN SV *key +p |U32 |magic_regdata_cnt \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_regdatum_get \ + |NN SV *sv \ + |NN MAGIC *mg + +: This is indirectly referenced by globals.c. This is somewhat annoying. +p |SV * |magic_scalarpack \ + |NN HV *hv \ + |NN MAGIC *mg :removing noreturn to silence a warning for this function resulted in no :change to the interpreter DLL image under VS 2003 -O1 -GL 32 bits only because :this is used in a magic vtable, do not use this on conventionally called funcs -#ifdef _MSC_VER -p |int |magic_regdatum_set|NN SV* sv|NN MAGIC* mg -#else -pr |int |magic_regdatum_set|NN SV* sv|NN MAGIC* mg -#endif -p |int |magic_set |NN SV* sv|NN MAGIC* mg -p |int |magic_setarylen|NN SV* sv|NN MAGIC* mg -p |int |magic_cleararylen_p|NN SV* sv|NN MAGIC* mg -p |int |magic_freearylen_p|NN SV* sv|NN MAGIC* mg -p |int |magic_setdbline|NN SV* sv|NN MAGIC* mg -p |int |magic_setdebugvar|NN SV* sv|NN MAGIC* mg -p |int |magic_setdefelem|NN SV* sv|NN MAGIC* mg -p |int |magic_setnonelem|NN SV* sv|NN MAGIC* mg -p |int |magic_setenv |NN SV* sv|NN MAGIC* mg -dp |int |magic_sethint |NN SV* sv|NN MAGIC* mg -p |int |magic_setisa |NN SV* sv|NN MAGIC* mg -p |int |magic_setlvref |NN SV* sv|NN MAGIC* mg -p |int |magic_setmglob |NN SV* sv|NN MAGIC* mg -p |int |magic_freemglob|NN SV* sv|NN MAGIC* mg -p |int |magic_setnkeys |NN SV* sv|NN MAGIC* mg -p |int |magic_setpack |NN SV* sv|NN MAGIC* mg -p |int |magic_setpos |NN SV* sv|NN MAGIC* mg -p |int |magic_setregexp|NN SV* sv|NN MAGIC* mg -p |int |magic_setsigall|NN SV* sv|NN MAGIC* mg -p |int |magic_setsig |NULLOK SV* sv|NN MAGIC* mg -p |int |magic_setsubstr|NN SV* sv|NN MAGIC* mg -p |int |magic_settaint |NN SV* sv|NN MAGIC* mg -p |int |magic_setuvar |NN SV* sv|NN MAGIC* mg -p |int |magic_setvec |NN SV* sv|NN MAGIC* mg -p |int |magic_setutf8 |NN SV* sv|NN MAGIC* mg -p |int |magic_freeutf8 |NN SV* sv|NN MAGIC* mg -p |int |magic_set_all_env|NN SV* sv|NN MAGIC* mg -p |U32 |magic_sizepack |NN SV* sv|NN MAGIC* mg -p |int |magic_wipepack |NN SV* sv|NN MAGIC* mg -Fpod |SV* |magic_methcall |NN SV *sv|NN const MAGIC *mg \ - |NN SV *meth|U32 flags \ - |U32 argc|... +p |int |magic_set |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_set_all_env \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setarylen|NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setdbline|NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setdebugvar \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setdefelem \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setenv |NN SV *sv \ + |NN MAGIC *mg +dp |int |magic_sethint |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_sethook |NULLOK SV *sv \ + |NN MAGIC *mg +p |int |magic_sethookall \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setisa |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setlvref |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setmglob |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setnkeys |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setnonelem \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setpack |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setpos |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setregexp|NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setsig |NULLOK SV *sv \ + |NN MAGIC *mg +p |int |magic_setsigall|NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setsubstr|NN SV *sv \ + |NN MAGIC *mg +p |int |magic_settaint |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setutf8 |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setuvar |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setvec |NN SV *sv \ + |NN MAGIC *mg +p |U32 |magic_sizepack |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_wipepack |NN SV *sv \ + |NN MAGIC *mg + +CTadop |Malloc_t|malloc |MEM_SIZE nbytes Cp |I32 * |markstack_grow -#if defined(USE_LOCALE_COLLATE) -p |int |magic_setcollxfrm|NN SV* sv|NN MAGIC* mg -p |int |magic_freecollxfrm|NN SV* sv|NN MAGIC* mg -pbD |char* |mem_collxfrm |NN const char* input_string|STRLEN len|NN STRLEN* xlen -: Defined in locale.c, used only in sv.c -# if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_MATHOMS_C) -p |char* |_mem_collxfrm |NN const char* input_string \ - |STRLEN len \ - |NN STRLEN* xlen \ - |bool utf8 -# endif -#endif -Afpd |SV* |mess |NN const char* pat|... -Apd |SV* |mess_sv |NN SV* basemsg|bool consume -Apd |SV* |vmess |NN const char* pat|NULLOK va_list* args -: FIXME - either make it public, or stop exporting it. (Data::Alias uses this) -: Used in gv.c, op.c, toke.c -EXp |void |qerror |NN SV* err -Apd |void |sortsv |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp -Apd |void |sortsv_flags |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp|U32 flags -Apd |int |mg_clear |NN SV* sv -Apd |int |mg_copy |NN SV *sv|NN SV *nsv|NULLOK const char *key \ +EXp |int |mbtowc_ |NULLOK const wchar_t *pwc \ + |NULLOK const char *s \ + |const Size_t len +Adfp |SV * |mess |NN const char *pat \ + |... +Adp |SV * |mess_sv |NN SV *basemsg \ + |bool consume +CTdop |Free_t |mfree |Malloc_t where +Adp |int |mg_clear |NN SV *sv +Adp |int |mg_copy |NN SV *sv \ + |NN SV *nsv \ + |NULLOK const char *key \ |I32 klen -: Defined in mg.c, used only in scope.c -pd |void |mg_localize |NN SV* sv|NN SV* nsv|bool setmagic -Apd |SV* |sv_string_from_errnum|int errnum|NULLOK SV* tgtsv -ApdRT |MAGIC* |mg_find |NULLOK const SV* sv|int type -ApdRT |MAGIC* |mg_findext |NULLOK const SV* sv|int type|NULLOK const MGVTBL *vtbl +ARTdp |MAGIC *|mg_find |NULLOK const SV *sv \ + |int type +ARTdp |MAGIC *|mg_findext |NULLOK const SV *sv \ + |int type \ + |NULLOK const MGVTBL *vtbl : exported for re.pm -EXpR |MAGIC* |mg_find_mglob |NN SV* sv -Apd |int |mg_free |NN SV* sv -Apd |void |mg_free_type |NN SV* sv|int how -Apd |void |mg_freeext |NN SV* sv|int how|NULLOK const MGVTBL *vtbl -Apd |int |mg_get |NN SV* sv -ApdD |U32 |mg_length |NN SV* sv -ApdT |void |mg_magical |NN SV* sv -Apd |int |mg_set |NN SV* sv -Cp |I32 |mg_size |NN SV* sv -AdpT |void |mini_mktime |NN struct tm *ptm -Axmd |OP* |op_lvalue |NULLOK OP* o|I32 type -poX |OP* |op_lvalue_flags|NULLOK OP* o|I32 type|U32 flags -pd |void |finalize_optree |NN OP* o -pd |void |optimize_optree|NN OP* o -#if defined(PERL_IN_OP_C) -S |void |optimize_op |NN OP* o -S |void |finalize_op |NN OP* o -S |void |move_proto_attr|NN OP **proto|NN OP **attrs \ - |NN const GV *name|bool curstash -#endif +ERXp |MAGIC *|mg_find_mglob |NN SV *sv +Adp |int |mg_free |NN SV *sv +Adp |void |mg_freeext |NN SV *sv \ + |int how \ + |NULLOK const MGVTBL *vtbl +Adp |void |mg_free_type |NN SV *sv \ + |int how +Adp |int |mg_get |NN SV *sv +: Defined in mg.c, used only in scope.c +dp |void |mg_localize |NN SV *sv \ + |NN SV *nsv \ + |bool setmagic +ATdp |void |mg_magical |NN SV *sv +Adp |int |mg_set |NN SV *sv +Cp |I32 |mg_size |NN SV *sv +ATdp |void |mini_mktime |NN struct tm *ptm : Used in op.c and pp_sys.c -p |int |mode_from_discipline|NULLOK const char* s|STRLEN len -Cp |const char* |moreswitches |NN const char* s -Apd |NV |my_atof |NN const char *s -ATdpR |NV |my_strtod |NN const char * const s|NULLOK char ** e -Aprd |void |my_exit |U32 status -Apr |void |my_failure_exit -Cpd |I32 |my_fflush_all -CTpd |Pid_t |my_fork -CTp |void |atfork_lock -CTp |void |atfork_unlock +p |int |mode_from_discipline \ + |NULLOK const char *s \ + |STRLEN len + +: Used in sv.c and hv.c +Cop |void * |more_bodies |const svtype sv_type \ + |const size_t body_size \ + |const size_t arena_size +Cp |const char *|moreswitches \ + |NN const char *s +Adp |void |mortal_destructor_sv \ + |NN SV *coderef \ + |NULLOK SV *args +CRTXip |char * |mortal_getenv |NN const char *str +Cdp |void |mortal_svfunc_x|SVFUNC_t f \ + |NULLOK SV *p +Adop |const struct mro_alg *|mro_get_from_name \ + |NN SV *name +Adp |AV * |mro_get_linear_isa \ + |NN HV *stash + +Chop |SV * |mro_get_private_data \ + |NN struct mro_meta * const smeta \ + |NN const struct mro_alg * const which +: Used in hv.c, mg.c, pp.c, sv.c +dp |void |mro_isa_changed_in \ + |NN HV *stash +: Used in HvMROMETA(), which is public. +Xop |struct mro_meta *|mro_meta_init \ + |NN HV *stash +Adp |void |mro_method_changed_in \ + |NN HV *stash +dep |void |mro_package_moved \ + |NULLOK HV * const stash \ + |NULLOK HV * const oldstash \ + |NN const GV * const gv \ + |U32 flags +Adop |void |mro_register |NN const struct mro_alg *mro +Adop |void |mro_set_mro |NN struct mro_meta * const meta \ + |NN SV * const name +Adhop |SV * |mro_set_private_data \ + |NN struct mro_meta * const smeta \ + |NN const struct mro_alg * const which \ + |NN SV * const data +CRTip |unsigned|msbit_pos32 |U32 word +EXp |SV * |multiconcat_stringify \ + |NN const OP *o +EXp |SV * |multideref_stringify \ + |NN const OP *o \ + |NULLOK CV *cv +Adp |NV |my_atof |NN const char *s +Cop |char * |my_atof2 |NN const char *orig \ + |NN NV *value +Cp |char * |my_atof3 |NN const char *orig \ + |NN NV *value \ + |const STRLEN len +: Used in perly.y +p |OP * |my_attrs |NN OP *o \ + |NULLOK OP *attrs + +: Used in mg.c, sv.c +ep |void |my_clearenv +ATdp |int |my_dirfd |NULLOK DIR *dir +Adpr |void |my_exit |U32 status +Adpr |void |my_failure_exit +Cdp |I32 |my_fflush_all +CTdp |Pid_t |my_fork m |I32 |my_lstat -pX |I32 |my_lstat_flags |NULLOK const U32 flags -#if ! defined(HAS_MEMRCHR) && (defined(PERL_CORE) || defined(PERL_EXT)) -EeiT |void * |my_memrchr |NN const char * s|const char c|const STRLEN len -#endif -#if !defined(PERL_IMPLICIT_SYS) -Adp |I32 |my_pclose |NULLOK PerlIO* ptr -Adp |PerlIO*|my_popen |NN const char* cmd|NN const char* mode -#endif -Cpd |PerlIO*|my_popen_list |NN const char* mode|int n|NN SV ** args -Apd |void |my_setenv |NULLOK const char* nam|NULLOK const char* val +Xp |I32 |my_lstat_flags |NULLOK const U32 flags +RTop |int |my_mkostemp_cloexec \ + |NN char *templte \ + |int flags +RTop |int |my_mkstemp_cloexec \ + |NN char *templte +Cdp |PerlIO *|my_popen_list |NN const char *mode \ + |int n \ + |NN SV **args +Adp |void |my_setenv |NULLOK const char *nam \ + |NULLOK const char *val + +AMTdfp |int |my_snprintf |NN char *buffer \ + |const Size_t len \ + |NN const char *format \ + |... +CTdp |int |my_socketpair |int family \ + |int type \ + |int protocol \ + |int fd[2] m |I32 |my_stat -pX |I32 |my_stat_flags |NULLOK const U32 flags -Adfp |char * |my_strftime |NN const char *fmt|int sec|int min|int hour|int mday|int mon|int year|int wday|int yday|int isdst +Xp |I32 |my_stat_flags |NULLOK const U32 flags +p |const char *|my_strerror \ + |const int errnum \ + |NN utf8ness_t *utf8ness +Adfp |char * |my_strftime |NN const char *fmt \ + |int sec \ + |int min \ + |int hour \ + |int mday \ + |int mon \ + |int year \ + |int wday \ + |int yday \ + |int isdst +EXfp |char * |my_strftime8_temp \ + |NN const char *fmt \ + |int sec \ + |int min \ + |int hour \ + |int mday \ + |int mon \ + |int year \ + |int wday \ + |int yday \ + |int isdst \ + |NULLOK utf8ness_t *utf8ness +ARTdp |NV |my_strtod |NN const char * const s \ + |NULLOK char **e : Used in pp_ctl.c p |void |my_unexec -CbDTPR |UV |NATIVE_TO_NEED |const UV enc|const UV ch -CbDTPR |UV |ASCII_TO_NEED |const UV enc|const UV ch -ApR |OP* |newANONLIST |NULLOK OP* o -ApR |OP* |newANONHASH |NULLOK OP* o -Ap |OP* |newANONSUB |I32 floor|NULLOK OP* proto|NULLOK OP* block -ApdR |OP* |newASSIGNOP |I32 flags|NULLOK OP* left|I32 optype|NULLOK OP* right -ApdR |OP* |newCONDOP |I32 flags|NN OP* first|NULLOK OP* trueop|NULLOK OP* falseop -Apd |CV* |newCONSTSUB |NULLOK HV* stash|NULLOK const char* name|NULLOK SV* sv -Apd |CV* |newCONSTSUB_flags|NULLOK HV* stash \ - |NULLOK const char* name|STRLEN len \ - |U32 flags|NULLOK SV* sv -Cp |void |newFORM |I32 floor|NULLOK OP* o|NULLOK OP* block -ApdR |OP* |newFOROP |I32 flags|NULLOK OP* sv|NN OP* expr|NULLOK OP* block|NULLOK OP* cont -ApdR |OP* |newGIVENOP |NN OP* cond|NN OP* block|PADOFFSET defsv_off -ApdR |OP* |newLOGOP |I32 optype|I32 flags|NN OP *first|NN OP *other -px |LOGOP* |alloc_LOGOP |I32 type|NULLOK OP *first|NULLOK OP *other -ApdR |OP* |newLOOPEX |I32 type|NN OP* label -ApdR |OP* |newLOOPOP |I32 flags|I32 debuggable|NULLOK OP* expr|NULLOK OP* block -ApdR |OP* |newNULLLIST -ApdR |OP* |newOP |I32 optype|I32 flags -Cp |void |newPROG |NN OP* o -ApdR |OP* |newRANGE |I32 flags|NN OP* left|NN OP* right -ApdR |OP* |newSLICEOP |I32 flags|NULLOK OP* subscript|NULLOK OP* listop -ApdR |OP* |newSTATEOP |I32 flags|NULLOK char* label|NULLOK OP* o -AdpbM |CV* |newSUB |I32 floor|NULLOK OP* o|NULLOK OP* proto \ - |NULLOK OP* block -ApdRx |OP* |newTRYCATCHOP |I32 flags|NN OP* tryblock|NN OP *catchvar|NN OP* catchblock -ApdRx |OP* |newDEFEROP |I32 flags|NN OP *block -pd |CV * |newXS_len_flags|NULLOK const char *name|STRLEN len \ - |NN XSUBADDR_t subaddr\ - |NULLOK const char *const filename \ - |NULLOK const char *const proto \ - |NULLOK SV **const_svp|U32 flags -pX |CV * |newXS_deffile |NN const char *name|NN XSUBADDR_t subaddr -Apx |CV * |newXS_flags |NULLOK const char *name|NN XSUBADDR_t subaddr\ - |NN const char *const filename \ - |NULLOK const char *const proto|U32 flags -ApdU |CV* |newXS |NULLOK const char *name|NN XSUBADDR_t subaddr\ - |NN const char *filename -ApMdbR |AV* |newAV -AmdR |AV* |newAV_alloc_x |SSize_t size -AmdR |AV* |newAV_alloc_xz |SSize_t size -ApR |OP* |newAVREF |NN OP* o -ApdR |OP* |newBINOP |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last -ApR |OP* |newCVREF |I32 flags|NULLOK OP* o -ApdR |OP* |newGVOP |I32 type|I32 flags|NN GV* gv -Amd |GV* |newGVgen |NN const char* pack -ApdR |GV* |newGVgen_flags |NN const char* pack|U32 flags -ApR |OP* |newGVREF |I32 type|NULLOK OP* o -ApR |OP* |newHVREF |NN OP* o -ApMdbR |HV* |newHV -ApRd |HV* |newHVhv |NULLOK HV *hv -ApRbMd |IO* |newIO -ApdR |OP* |newLISTOP |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last -AxpdRT |PADNAME *|newPADNAMEouter|NN PADNAME *outer -AxpdRT |PADNAME *|newPADNAMEpvn|NN const char *s|STRLEN len -AxpdRT |PADNAMELIST *|newPADNAMELIST|size_t max -#ifdef USE_ITHREADS -ApdR |OP* |newPADOP |I32 type|I32 flags|NN SV* sv -#endif -ApdR |OP* |newPMOP |I32 type|I32 flags -ApdR |OP* |newPVOP |I32 type|I32 flags|NULLOK char* pv -ApdR |SV* |newRV |NN SV *const sv -ApdR |SV* |newRV_noinc |NN SV *const tmpRef -ApdR |SV* |newSV |const STRLEN len -ApR |OP* |newSVREF |NN OP* o -ApdR |OP* |newSVOP |I32 type|I32 flags|NN SV* sv -ApdR |OP* |newDEFSVOP -pR |SV* |newSVavdefelem |NN AV *av|SSize_t ix|bool extendible -ApdR |SV* |newSViv |const IV i -ApdR |SV* |newSVuv |const UV u -ApdR |SV* |newSVnv |const NV n -ApdR |SV* |newSVpv |NULLOK const char *const s|const STRLEN len -ApdR |SV* |newSVpvn |NULLOK const char *const buffer|const STRLEN len -ApdR |SV* |newSVpvn_flags |NULLOK const char *const s|const STRLEN len|const U32 flags -ApdR |SV* |newSVhek |NULLOK const HEK *const hek -ApdR |SV* |newSVpvn_share |NULLOK const char* s|I32 len|U32 hash -ApdR |SV* |newSVpv_share |NULLOK const char* s|U32 hash -AfpdR |SV* |newSVpvf |NN const char *const pat|... -ApRd |SV* |vnewSVpvf |NN const char *const pat|NULLOK va_list *const args -Apd |SV* |newSVrv |NN SV *const rv|NULLOK const char *const classname -ApMbdR |SV* |newSVsv |NULLOK SV *const old -AmdR |SV* |newSVsv_nomg |NULLOK SV *const old -AdpR |SV* |newSVsv_flags |NULLOK SV *const old|I32 flags -ApdiR |SV* |newSV_type |const svtype type -ApdIR |SV* |newSV_type_mortal|const svtype type -ApdR |OP* |newUNOP |I32 type|I32 flags|NULLOK OP* first -ApdR |OP* |newUNOP_AUX |I32 type|I32 flags|NULLOK OP* first \ +AMTdp |int |my_vsnprintf |NN char *buffer \ + |const Size_t len \ + |NN const char *format \ + |va_list ap +Ap |OP * |newANONATTRSUB |I32 floor \ + |NULLOK OP *proto \ + |NULLOK OP *attrs \ + |NULLOK OP *block +ARp |OP * |newANONHASH |NULLOK OP *o +ARp |OP * |newANONLIST |NULLOK OP *o +Ap |OP * |newANONSUB |I32 floor \ + |NULLOK OP *proto \ + |NULLOK OP *block +ARdp |OP * |newARGDEFELEMOP|I32 flags \ + |NN OP *expr \ + |I32 argindex +ARdp |OP * |newASSIGNOP |I32 flags \ + |NULLOK OP *left \ + |I32 optype \ + |NULLOK OP *right +Adm |CV * |newATTRSUB |I32 floor \ + |NULLOK OP *o \ + |NULLOK OP *proto \ + |NULLOK OP *attrs \ + |NULLOK OP *block +Xdp |CV * |newATTRSUB_x |I32 floor \ + |NULLOK OP *o \ + |NULLOK OP *proto \ + |NULLOK OP *attrs \ + |NULLOK OP *block \ + |bool o_is_gv +AMRbdp |AV * |newAV +ARdm |AV * |newAV_alloc_x |SSize_t size +ARdm |AV * |newAV_alloc_xz |SSize_t size +ARdp |AV * |newAVav |NULLOK AV *oav +ARdp |AV * |newAVhv |NULLOK HV *ohv +ARp |OP * |newAVREF |NN OP *o +ARdp |OP * |newBINOP |I32 type \ + |I32 flags \ + |NULLOK OP *first \ + |NULLOK OP *last +ARdp |OP * |newCONDOP |I32 flags \ + |NN OP *first \ + |NULLOK OP *trueop \ + |NULLOK OP *falseop +Adp |CV * |newCONSTSUB |NULLOK HV *stash \ + |NULLOK const char *name \ + |NULLOK SV *sv +Adp |CV * |newCONSTSUB_flags \ + |NULLOK HV *stash \ + |NULLOK const char *name \ + |STRLEN len \ + |U32 flags \ + |NULLOK SV *sv +ARp |OP * |newCVREF |I32 flags \ + |NULLOK OP *o +ARdpx |OP * |newDEFEROP |I32 flags \ + |NN OP *block +ARdp |OP * |newDEFSVOP +Cp |void |newFORM |I32 floor \ + |NULLOK OP *o \ + |NULLOK OP *block +ARdp |OP * |newFOROP |I32 flags \ + |NULLOK OP *sv \ + |NN OP *expr \ + |NULLOK OP *block \ + |NULLOK OP *cont +ARdp |OP * |newGIVENOP |NN OP *cond \ + |NN OP *block \ + |PADOFFSET defsv_off +: Used in scope.c +eopx |GP * |newGP |NN GV * const gv +Adm |GV * |newGVgen |NN const char *pack +ARdp |GV * |newGVgen_flags |NN const char *pack \ + |U32 flags +ARdp |OP * |newGVOP |I32 type \ + |I32 flags \ + |NN GV *gv +ARp |OP * |newGVREF |I32 type \ + |NULLOK OP *o +AMRbdp |HV * |newHV +ARdp |HV * |newHVhv |NULLOK HV *hv +ARp |OP * |newHVREF |NN OP *o +AMRbdp |IO * |newIO +ARdp |OP * |newLISTOP |I32 type \ + |I32 flags \ + |NULLOK OP *first \ + |NULLOK OP *last +ARdp |OP * |newLOGOP |I32 optype \ + |I32 flags \ + |NN OP *first \ + |NN OP *other +ARdp |OP * |newLOOPEX |I32 type \ + |NN OP *label +ARdp |OP * |newLOOPOP |I32 flags \ + |I32 debuggable \ + |NN OP *expr \ + |NULLOK OP *block +ARdp |OP * |newMETHOP |I32 type \ + |I32 flags \ + |NN OP *dynamic_meth +ARdp |OP * |newMETHOP_named|I32 type \ + |I32 flags \ + |NN SV * const_meth +Cp |CV * |newMYSUB |I32 floor \ + |NN OP *o \ + |NULLOK OP *proto \ + |NULLOK OP *attrs \ + |NULLOK OP *block +ARdp |OP * |newNULLLIST +ARdp |OP * |newOP |I32 optype \ + |I32 flags +ARTdpx |PADNAMELIST *|newPADNAMELIST \ + |size_t max +ARTdpx |PADNAME *|newPADNAMEouter \ + |NN PADNAME *outer +ARTdpx |PADNAME *|newPADNAMEpvn|NN const char *s \ + |STRLEN len +ARdip |OP * |newPADxVOP |I32 type \ + |I32 flags \ + |PADOFFSET padix +ARdp |OP * |newPMOP |I32 type \ + |I32 flags +Cp |void |newPROG |NN OP *o +ARdp |OP * |newPVOP |I32 type \ + |I32 flags \ + |NULLOK char *pv +ARdp |OP * |newRANGE |I32 flags \ + |NN OP *left \ + |NN OP *right +ARdp |SV * |newRV |NN SV * const sv +ARdip |SV * |newRV_noinc |NN SV * const tmpRef +ARdp |OP * |newSLICEOP |I32 flags \ + |NULLOK OP *subscript \ + |NULLOK OP *listop +CRp |PERL_SI *|new_stackinfo|I32 stitems \ + |I32 cxitems +ARdp |OP * |newSTATEOP |I32 flags \ + |NULLOK char *label \ + |NULLOK OP *o +p |CV * |newSTUB |NN GV *gv \ + |bool fake +AMbdp |CV * |newSUB |I32 floor \ + |NULLOK OP *o \ + |NULLOK OP *proto \ + |NULLOK OP *block +ARdp |SV * |newSV |const STRLEN len +Rp |SV * |newSVavdefelem |NN AV *av \ + |SSize_t ix \ + |bool extendible +ARdp |SV * |newSVbool |const bool bool_val +ARdp |SV * |newSV_false +ARdp |SV * |newSVhek |NULLOK const HEK * const hek +ARdp |SV * |newSVhek_mortal|NULLOK const HEK * const hek +ARdp |SV * |newSViv |const IV i +ARdp |SV * |newSVnv |const NV n +ARdp |OP * |newSVOP |I32 type \ + |I32 flags \ + |NN SV *sv +ARdp |SV * |newSVpv |NULLOK const char * const s \ + |const STRLEN len +ARdfp |SV * |newSVpvf |NN const char * const pat \ + |... +ARdp |SV * |newSVpvn |NULLOK const char * const buffer \ + |const STRLEN len +ARdp |SV * |newSVpvn_flags |NULLOK const char * const s \ + |const STRLEN len \ + |const U32 flags +ARdp |SV * |newSVpvn_share |NULLOK const char *s \ + |I32 len \ + |U32 hash +ARdp |SV * |newSVpv_share |NULLOK const char *s \ + |U32 hash +ARp |OP * |newSVREF |NN OP *o +Adp |SV * |newSVrv |NN SV * const rv \ + |NULLOK const char * const classname +AMRbdp |SV * |newSVsv |NULLOK SV * const old +ARdp |SV * |newSVsv_flags |NULLOK SV * const old \ + |I32 flags +ARdm |SV * |newSVsv_nomg |NULLOK SV * const old +ARdp |SV * |newSV_true +ARdip |SV * |newSV_type |const svtype type +AIRdp |SV * |newSV_type_mortal \ + |const svtype type +ARdp |SV * |newSVuv |const UV u +ARdpx |OP * |newTRYCATCHOP |I32 flags \ + |NN OP *tryblock \ + |NN OP *catchvar \ + |NN OP *catchblock +ARdp |OP * |newUNOP |I32 type \ + |I32 flags \ + |NULLOK OP *first +ARdp |OP * |newUNOP_AUX |I32 type \ + |I32 flags \ + |NULLOK OP *first \ |NULLOK UNOP_AUX_item *aux -ApdR |OP* |newWHENOP |NULLOK OP* cond|NN OP* block -ApdR |OP* |newWHILEOP |I32 flags|I32 debuggable|NULLOK LOOP* loop \ - |NULLOK OP* expr|NULLOK OP* block|NULLOK OP* cont \ +Adp |SV * |new_version |NN SV *ver +: FIXME - exported for ByteLoader - public or private? +ERXopx |char * |new_warnings_bitfield \ + |NULLOK char *buffer \ + |NN const char * const bits \ + |STRLEN size +ARdp |OP * |newWHENOP |NULLOK OP *cond \ + |NN OP *block +ARdp |OP * |newWHILEOP |I32 flags \ + |I32 debuggable \ + |NULLOK LOOP *loop \ + |NULLOK OP *expr \ + |NULLOK OP *block \ + |NULLOK OP *cont \ |I32 has_my -ApdR |OP* |newMETHOP |I32 type|I32 flags|NN OP* dynamic_meth -ApdR |OP* |newMETHOP_named|I32 type|I32 flags|NN SV* const_meth -Apd |CV* |rv2cv_op_cv |NN OP *cvop|U32 flags -Apd |OP* |ck_entersub_args_list|NN OP *entersubop -Apd |OP* |ck_entersub_args_proto|NN OP *entersubop|NN GV *namegv|NN SV *protosv -Apd |OP* |ck_entersub_args_proto_or_list|NN OP *entersubop|NN GV *namegv|NN SV *protosv -po |OP* |ck_entersub_args_core|NN OP *entersubop|NN GV *namegv \ - |NN SV *protosv -Apd |void |cv_get_call_checker|NN CV *cv|NN Perl_call_checker *ckfun_p|NN SV **ckobj_p -Apd |void |cv_get_call_checker_flags|NN CV *cv|U32 gflags|NN Perl_call_checker *ckfun_p|NN SV **ckobj_p|NN U32 *ckflags_p -Apd |void |cv_set_call_checker|NN CV *cv|NN Perl_call_checker ckfun|NN SV *ckobj -Apd |void |cv_set_call_checker_flags|NN CV *cv \ - |NN Perl_call_checker ckfun \ - |NN SV *ckobj|U32 ckflags -Apd |void |wrap_op_checker|Optype opcode|NN Perl_check_t new_checker|NN Perl_check_t *old_checker_p -Axpd |void |wrap_keyword_plugin|NN Perl_keyword_plugin_t new_plugin|NN Perl_keyword_plugin_t *old_plugin_p -CpR |PERL_SI*|new_stackinfo|I32 stitems|I32 cxitems -Apd |char* |scan_vstring |NN const char *s|NN const char *const e \ - |NN SV *sv -Apd |const char* |scan_version |NN const char *s|NN SV *rv|bool qv -Apd |const char* |prescan_version |NN const char *s\ - |bool strict|NULLOK const char** errstr|NULLOK bool *sqv\ - |NULLOK int *ssaw_decimal|NULLOK int *swidth|NULLOK bool *salpha -Apd |SV* |new_version |NN SV *ver -Apd |SV* |upg_version |NN SV *ver|bool qv -Apd |SV* |vverify |NN SV *vs -Apd |SV* |vnumify |NN SV *vs -Apd |SV* |vnormal |NN SV *vs -Apd |SV* |vstringify |NN SV *vs -Apd |int |vcmp |NN SV *lhv|NN SV *rhv +AUdp |CV * |newXS |NULLOK const char *name \ + |NN XSUBADDR_t subaddr \ + |NN const char *filename +Xp |CV * |newXS_deffile |NN const char *name \ + |NN XSUBADDR_t subaddr +Apx |CV * |newXS_flags |NULLOK const char *name \ + |NN XSUBADDR_t subaddr \ + |NN const char * const filename \ + |NULLOK const char * const proto \ + |U32 flags +dp |CV * |newXS_len_flags|NULLOK const char *name \ + |STRLEN len \ + |NN XSUBADDR_t subaddr \ + |NULLOK const char * const filename \ + |NULLOK const char * const proto \ + |NULLOK SV ** const_svp \ + |U32 flags : Used in pp_hot.c and pp_sys.c -p |PerlIO*|nextargv |NN GV* gv|bool nomagicopen -AdMTpP |char* |ninstr |NN const char* big|NN const char* bigend \ - |NN const char* little|NN const char* lend -Apd |void |op_free |NULLOK OP* arg -xp |OP* |op_unscope |NULLOK OP* o -#ifdef PERL_CORE -p |void |opslab_free |NN OPSLAB *slab -p |void |opslab_free_nopad|NN OPSLAB *slab -p |void |opslab_force_free|NN OPSLAB *slab -#endif +p |PerlIO *|nextargv |NN GV *gv \ + |bool nomagicopen +AMPTdp |char * |ninstr |NN const char *big \ + |NN const char *bigend \ + |NN const char *little \ + |NN const char *lend + +p |void |no_bareword_filehandle \ + |NN const char *fhname +Tefpr |void |noperl_die |NN const char *pat \ + |... +Adp |int |nothreadhook +p |void |notify_parser_that_changed_to_utf8 : Used in perly.y -p |void |package |NN OP* o +Rp |OP * |oopsAV |NN OP *o : Used in perly.y -p |void |package_version|NN OP* v -: Used in toke.c and perly.y -p |PADOFFSET|allocmy |NN const char *const name|const STRLEN len\ - |const U32 flags -#ifdef USE_ITHREADS -Adxp |PADOFFSET|alloccopstash|NN HV *hv -#endif +Rp |OP * |oopsHV |NN OP *o +Adp |OP * |op_append_elem |I32 optype \ + |NULLOK OP *first \ + |NULLOK OP *last +Adp |OP * |op_append_list |I32 optype \ + |NULLOK OP *first \ + |NULLOK OP *last +Adp |OPclass|op_class |NULLOK const OP *o +: FIXME. Used by Data::Alias +EXp |void |op_clear |NN OP *o +Adp |OP * |op_contextualize \ + |NN OP *o \ + |I32 context +: Used in perly.y +ARdp |OP * |op_convert_list|I32 optype \ + |I32 flags \ + |NULLOK OP *o +Adp |void |op_dump |NN const OP *o +; Used in op.c and class.c +Adp |OP * |op_force_list |NULLOK OP *o +Adp |void |op_free |NULLOK OP *arg +Adp |OP * |op_linklist |NN OP *o +Admx |OP * |op_lvalue |NULLOK OP *o \ + |I32 type +Xop |OP * |op_lvalue_flags|NULLOK OP *o \ + |I32 type \ + |U32 flags +: Used in various files +Adp |void |op_null |NN OP *o +ATdp |OP * |op_parent |NN OP *o +Adp |OP * |op_prepend_elem|I32 optype \ + |NULLOK OP *first \ + |NULLOK OP *last +Cdp |void |op_refcnt_lock +Cdp |void |op_refcnt_unlock +Adpx |OP * |op_scope |NULLOK OP *o +ATdp |OP * |op_sibling_splice \ + |NULLOK OP *parent \ + |NULLOK OP *start \ + |int del_count \ + |NULLOK OP *insert +px |OP * |op_unscope |NULLOK OP *o +ARdpx |OP * |op_wrap_finally|NN OP *block \ + |NN OP *finally : Used in perly.y -pR |OP* |oopsAV |NN OP* o +p |void |package |NN OP *o : Used in perly.y -pR |OP* |oopsHV |NN OP* o +p |void |package_version|NN OP *v +Adp |void |packlist |NN SV *cat \ + |NN const char *pat \ + |NN const char *patend \ + |NN SV **beglist \ + |NN SV **endlist +Adp |PADOFFSET|pad_add_anon |NN CV *func \ + |I32 optype +Adp |PADOFFSET|pad_add_name_pv \ + |NN const char *name \ + |const U32 flags \ + |NULLOK HV *typestash \ + |NULLOK HV *ourstash +Adp |PADOFFSET|pad_add_name_pvn \ + |NN const char *namepv \ + |STRLEN namelen \ + |U32 flags \ + |NULLOK HV *typestash \ + |NULLOK HV *ourstash +Adp |PADOFFSET|pad_add_name_sv \ + |NN SV *name \ + |U32 flags \ + |NULLOK HV *typestash \ + |NULLOK HV *ourstash +p |void |pad_add_weakref|NN CV *func +Adpx |PADOFFSET|pad_alloc |I32 optype \ + |U32 tmptype +dp |void |pad_block_start|int full +Adp |PADOFFSET|pad_findmy_pv|NN const char *name \ + |U32 flags +Adp |PADOFFSET|pad_findmy_pvn \ + |NN const char *namepv \ + |STRLEN namelen \ + |U32 flags +Adp |PADOFFSET|pad_findmy_sv|NN SV *name \ + |U32 flags +dp |void |pad_fixup_inner_anons \ + |NN PADLIST *padlist \ + |NN CV *old_cv \ + |NN CV *new_cv +dp |void |pad_free |PADOFFSET po +dp |OP * |pad_leavemy +p |PAD ** |padlist_store |NN PADLIST *padlist \ + |I32 key \ + |NULLOK PAD *val +Xop |void |padname_free |NN PADNAME *pn +ARTdpx |PADNAME *|padnamelist_fetch \ + |NN PADNAMELIST *pnl \ + |SSize_t key +Xop |void |padnamelist_free \ + |NN PADNAMELIST *pnl +Adpx |PADNAME **|padnamelist_store \ + |NN PADNAMELIST *pnl \ + |SSize_t key \ + |NULLOK PADNAME *val + +: pad API +ARdp |PADLIST *|pad_new |int flags +Xdp |void |pad_push |NN PADLIST *padlist \ + |int depth +dp |void |pad_swipe |PADOFFSET po \ + |bool refadjust +Adpx |void |pad_tidy |padtidy_type type +: Public parser API +Adpx |OP * |parse_arithexpr|U32 flags +Adpx |OP * |parse_barestmt |U32 flags +Adpx |OP * |parse_block |U32 flags +Adpx |OP * |parse_fullexpr |U32 flags +Adpx |OP * |parse_fullstmt |U32 flags +Adpx |SV * |parse_label |U32 flags +Adpx |OP * |parse_listexpr |U32 flags +: Only used in scope.c +p |void |parser_free |NN const yy_parser *parser +Adpx |OP * |parse_stmtseq |U32 flags +Adpx |OP * |parse_subsignature \ + |U32 flags +Adpx |OP * |parse_termexpr |U32 flags +: Used in locale.c and perl.c +p |U32 |parse_unicode_opts \ + |NN const char **popt : peephole optimiser -p |void |peep |NULLOK OP* o -p |void |rpeep |NULLOK OP* o -: Defined in doio.c, used only in pp_hot.c -dopx |PerlIO*|start_glob |NN SV *tmpglob|NN IO *io +p |void |peep |NULLOK OP *o -Cp |void |reentrant_size -Cp |void |reentrant_init -Cp |void |reentrant_free -CFTp |void* |reentrant_retry|NN const char *f|... +ATdo |PerlInterpreter *|perl_alloc +ATdo |void |perl_construct |NN PerlInterpreter *my_perl -: "Very" special - can't use the O flag for this one: -: (The rename from perl_atexit to Perl_call_atexit was in 864dbfa3ca8032ef) -Apd |void |call_atexit |ATEXIT_t fn|NULLOK void *ptr -ApdO |I32 |call_argv |NN const char* sub_name|I32 flags|NN char** argv -ApdO |I32 |call_method |NN const char* methname|I32 flags -ApdO |I32 |call_pv |NN const char* sub_name|I32 flags -ApdO |I32 |call_sv |NN SV* sv|volatile I32 flags -Cp |void |despatch_signals -Cp |OP * |doref |NN OP *o|I32 type|bool set_op_ref -ApdO |SV* |eval_pv |NN const char* p|I32 croak_on_error -ApdO |I32 |eval_sv |NN SV* sv|I32 flags -ApdO |SV* |get_sv |NN const char *name|I32 flags -ApdO |AV* |get_av |NN const char *name|I32 flags -ApdO |HV* |get_hv |NN const char *name|I32 flags -ApdO |CV* |get_cv |NN const char* name|I32 flags -Apd |CV* |get_cvn_flags |NN const char* name|STRLEN len|I32 flags -ATdo |const char*|Perl_setlocale|const int category|NULLOK const char* locale -#if defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H) -ATdo |const char*|Perl_langinfo|const nl_item item -#else -ATdo |const char*|Perl_langinfo|const int item -#endif -CpO |int |init_i18nl10n |int printwarn -CbpOD |int |init_i18nl14n |int printwarn -p |char* |my_strerror |const int errnum -XpT |void |_warn_problematic_locale -Xp |void |set_numeric_underlying -Xp |void |set_numeric_standard -Cp |bool |_is_in_locale_category|const bool compiling|const int category -ApdT |void |switch_to_global_locale -ApdT |bool |sync_locale -ApxT |void |thread_locale_init -ApxT |void |thread_locale_term -ApdO |void |require_pv |NN const char* pv -AbpdD |void |pack_cat |NN SV *cat|NN const char *pat|NN const char *patend \ - |NN SV **beglist|NN SV **endlist|NN SV ***next_in_list|U32 flags -Apd |void |packlist |NN SV *cat|NN const char *pat|NN const char *patend|NN SV **beglist|NN SV **endlist -#if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C) -S |void |pidgone |Pid_t pid|int status -#endif +: The reason for the 'u' flag is that this passes "aTHX_ x" to its callee: not +: a legal C parameter +Admu |const XOP *|Perl_custom_op_xop \ + |NN const OP *o +ATdo |int |perl_destruct |NN PerlInterpreter *my_perl +ATdo |void |perl_free |NN PerlInterpreter *my_perl + +Cop |const char *|PerlIO_context_layers \ + |NULLOK const char *mode +p |int |PerlLIO_dup2_cloexec \ + |int oldfd \ + |int newfd +Rp |int |PerlLIO_dup_cloexec \ + |int oldfd +Rp |int |PerlLIO_open3_cloexec \ + |NN const char *file \ + |int flag \ + |int perm +Rp |int |PerlLIO_open_cloexec \ + |NN const char *file \ + |int flag +Ado |HV * |Perl_localeconv +ATdo |int |perl_parse |NN PerlInterpreter *my_perl \ + |XSINIT_t xsinit \ + |int argc \ + |NULLOK char **argv \ + |NULLOK char **env +ATdo |int |perl_run |NN PerlInterpreter *my_perl +ATdo |const char *|Perl_setlocale \ + |const int category \ + |NULLOK const char *locale +CTp |Signal_t|perly_sighandler \ + |int sig \ + |NULLOK Siginfo_t *info \ + |NULLOK void *uap \ + |bool safe + +Adm |const char * const|phase_name \ + |enum perl_phase +Adp |void |pmop_dump |NULLOK PMOP *pm : Used in perly.y -p |OP* |pmruntime |NN OP *o|NN OP *expr|NULLOK OP *repl \ - |UV flags|I32 floor -#if defined(PERL_IN_OP_C) -S |OP* |pmtrans |NN OP* o|NN OP* expr|NN OP* repl -#endif -p |void |invmap_dump |NN SV* invlist|NN UV * map -Cpd |void |pop_scope -Cpd |void |push_scope -#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C) -pMb |OP* |ref |NULLOK OP* o|I32 type -#endif -#if defined(PERL_IN_OP_C) -S |OP* |refkids |NULLOK OP* o|I32 type -#endif +p |OP * |pmruntime |NN OP *o \ + |NN OP *expr \ + |NULLOK OP *repl \ + |UV flags \ + |I32 floor +Xiop |I32 |POPMARK +Cdp |void |pop_scope + +: Used in perl.c and toke.c +Fop |void |populate_isa |NN const char *name \ + |STRLEN len \ + |... +Adhp |REGEXP *|pregcomp |NN SV * const pattern \ + |const U32 flags +Adhp |I32 |pregexec |NN REGEXP * const prog \ + |NN char *stringarg \ + |NN char *strend \ + |NN char *strbeg \ + |SSize_t minend \ + |NN SV *screamer \ + |U32 nosave +Cp |void |pregfree |NULLOK REGEXP *r +Cp |void |pregfree2 |NN REGEXP *rx +Adp |const char *|prescan_version \ + |NN const char *s \ + |bool strict \ + |NULLOK const char **errstr \ + |NULLOK bool *sqv \ + |NULLOK int *ssaw_decimal \ + |NULLOK int *swidth \ + |NULLOK bool *salpha +ARdp |void * |ptr_table_fetch|NN PTR_TBL_t * const tbl \ + |NULLOK const void * const sv +Adp |void |ptr_table_free |NULLOK PTR_TBL_t * const tbl +ARdp |PTR_TBL_t *|ptr_table_new +Adp |void |ptr_table_split|NN PTR_TBL_t * const tbl +Adp |void |ptr_table_store|NN PTR_TBL_t * const tbl \ + |NULLOK const void * const oldsv \ + |NN void * const newsv +Cdp |void |push_scope +Adp |char * |pv_display |NN SV *dsv \ + |NN const char *pv \ + |STRLEN cur \ + |STRLEN len \ + |STRLEN pvlim +Adp |char * |pv_escape |NULLOK SV *dsv \ + |NN char const * const str \ + |const STRLEN count \ + |STRLEN max \ + |NULLOK STRLEN * const escaped \ + |U32 flags +Adp |char * |pv_pretty |NN SV *dsv \ + |NN char const * const str \ + |const STRLEN count \ + |const STRLEN max \ + |NULLOK char const * const start_color \ + |NULLOK char const * const end_color \ + |const U32 flags +Adp |char * |pv_uni_display |NN SV *dsv \ + |NN const U8 *spv \ + |STRLEN len \ + |STRLEN pvlim \ + |UV flags +: FIXME - either make it public, or stop exporting it. (Data::Alias uses this) +: Used in gv.c, op.c, toke.c +EXp |void |qerror |NULLOK SV *err +Adp |char * |rcpv_copy |NULLOK char * const pv +Adp |char * |rcpv_free |NULLOK char * const pv +Aadp |char * |rcpv_new |NULLOK const char * const pv \ + |STRLEN len \ + |U32 flags +CRTdop |Malloc_t|realloc |Malloc_t where \ + |MEM_SIZE nbytes +CTiop |struct regexp *|ReANY |NN const REGEXP * const re +Adp |REGEXP *|re_compile |NN SV * const pattern \ + |U32 orig_rx_flags +Cp |void |reentrant_free +Cp |void |reentrant_init +CFTp |void * |reentrant_retry|NN const char *f \ + |... + +Cp |void |reentrant_size +Xdp |HV * |refcounted_he_chain_2hv \ + |NULLOK const struct refcounted_he *c \ + |U32 flags +Xdp |SV * |refcounted_he_fetch_pv \ + |NULLOK const struct refcounted_he *chain \ + |NN const char *key \ + |U32 hash \ + |U32 flags +Xdp |SV * |refcounted_he_fetch_pvn \ + |NULLOK const struct refcounted_he *chain \ + |NN const char *keypv \ + |STRLEN keylen \ + |U32 hash \ + |U32 flags +Xdp |SV * |refcounted_he_fetch_sv \ + |NULLOK const struct refcounted_he *chain \ + |NN SV *key \ + |U32 hash \ + |U32 flags +Xdp |void |refcounted_he_free \ + |NULLOK struct refcounted_he *he +Xdp |struct refcounted_he *|refcounted_he_inc \ + |NULLOK struct refcounted_he *he +Xdp |struct refcounted_he *|refcounted_he_new_pv \ + |NULLOK struct refcounted_he *parent \ + |NN const char *key \ + |U32 hash \ + |NULLOK SV *value \ + |U32 flags +Xdp |struct refcounted_he *|refcounted_he_new_pvn \ + |NULLOK struct refcounted_he *parent \ + |NN const char *keypv \ + |STRLEN keylen \ + |U32 hash \ + |NULLOK SV *value \ + |U32 flags +Xdp |struct refcounted_he *|refcounted_he_new_sv \ + |NULLOK struct refcounted_he *parent \ + |NN SV *key \ + |U32 hash \ + |NULLOK SV *value \ + |U32 flags +Cp |void |regdump |NN const regexp *r +Cp |I32 |regexec_flags |NN REGEXP * const rx \ + |NN char *stringarg \ + |NN char *strend \ + |NN char *strbeg \ + |SSize_t minend \ + |NN SV *sv \ + |NULLOK void *data \ + |U32 flags +Cp |void |regfree_internal \ + |NN REGEXP * const rx +Cp |void |reginitcolors +EXp |SV * |reg_named_buff |NN REGEXP * const rx \ + |NULLOK SV * const key \ + |NULLOK SV * const value \ + |const U32 flags +Cp |SV * |reg_named_buff_all \ + |NN REGEXP * const rx \ + |const U32 flags +Cp |bool |reg_named_buff_exists \ + |NN REGEXP * const rx \ + |NN SV * const key \ + |const U32 flags +Cp |SV * |reg_named_buff_fetch \ + |NN REGEXP * const rx \ + |NN SV * const namesv \ + |const U32 flags +Cp |SV * |reg_named_buff_firstkey \ + |NN REGEXP * const rx \ + |const U32 flags +EXp |SV * |reg_named_buff_iter \ + |NN REGEXP * const rx \ + |NULLOK const SV * const lastkey \ + |const U32 flags +Cp |SV * |reg_named_buff_nextkey \ + |NN REGEXP * const rx \ + |const U32 flags +Cp |SV * |reg_named_buff_scalar \ + |NN REGEXP * const rx \ + |const U32 flags +: FIXME - is anything in re using this now? +EXp |void |reg_numbered_buff_fetch \ + |NN REGEXP * const re \ + |const I32 paren \ + |NULLOK SV * const sv + +: FIXME - is anything in re using this now? +EXp |void |reg_numbered_buff_fetch_flags \ + |NN REGEXP * const re \ + |const I32 paren \ + |NULLOK SV * const sv \ + |U32 flags +: FIXME - is anything in re using this now? +EXp |I32 |reg_numbered_buff_length \ + |NN REGEXP * const rx \ + |NN const SV * const sv \ + |const I32 paren +: FIXME - is anything in re using this now? +EXp |void |reg_numbered_buff_store \ + |NN REGEXP * const rx \ + |const I32 paren \ + |NULLOK SV const * const value -ATpd |void |repeatcpy |NN char* to|NN const char* from|I32 len|IV count -AdTpP |char* |rninstr |NN const char* big|NN const char* bigend \ - |NN const char* little|NN const char* lend -Apd |Sighandler_t|rsignal |int i|Sighandler_t t +: FIXME - is anything in re using this now? +EXp |SV * |reg_qr_package |NN REGEXP * const rx +: FIXME - is anything in re using this now? +EXp |REGEXP *|reg_temp_copy |NULLOK REGEXP *dsv \ + |NN REGEXP *ssv +Cp |char * |re_intuit_start|NN REGEXP * const rx \ + |NULLOK SV *sv \ + |NN const char * const strbeg \ + |NN char *strpos \ + |NN char *strend \ + |const U32 flags \ + |NULLOK re_scream_pos_data *data +Cp |SV * |re_intuit_string \ + |NN REGEXP * const r +Xp |REGEXP *|re_op_compile |NULLOK SV ** const patternp \ + |int pat_count \ + |NULLOK OP *expr \ + |NN const regexp_engine *eng \ + |NULLOK REGEXP *old_re \ + |NULLOK bool *is_bare_re \ + |const U32 rx_flags \ + |const U32 pm_flags + +ATdp |void |repeatcpy |NN char *to \ + |NN const char *from \ + |I32 len \ + |IV count +: Used in doio.c, pp_hot.c, pp_sys.c +p |void |report_evil_fh |NULLOK const GV *gv +: Used in mg.c, pp.c, pp_hot.c, regcomp.c +EXdp |void |report_uninit |NULLOK const SV *uninit_sv +: Used in doio.c, pp_hot.c, pp_sys.c +p |void |report_wrongway_fh \ + |NULLOK const GV *gv \ + |const char have +AOdp |void |require_pv |NN const char *pv +AMp |void |resume_compcv |NN struct suspended_compcv *buffer \ + |bool save +dm |void |resume_compcv_and_save \ + |NN struct suspended_compcv *buffer +dm |void |resume_compcv_final \ + |NN struct suspended_compcv *buffer +APTdp |char * |rninstr |NN const char *big \ + |NN const char *bigend \ + |NN const char *little \ + |NN const char *lend +p |void |rpeep |NULLOK OP *o +Adp |Sighandler_t|rsignal |int i \ + |Sighandler_t t : Used in pp_sys.c -p |int |rsignal_restore|int i|NULLOK Sigsave_t* t +p |int |rsignal_restore|int i \ + |NULLOK Sigsave_t *t : Used in pp_sys.c -p |int |rsignal_save |int i|Sighandler_t t1|NN Sigsave_t* save -Apd |Sighandler_t|rsignal_state|int i -#if defined(PERL_IN_PP_CTL_C) -S |void |rxres_free |NN void** rsp -S |void |rxres_restore |NN void **rsp|NN REGEXP *rx -#endif +p |int |rsignal_save |int i \ + |Sighandler_t t1 \ + |NN Sigsave_t *save +Adp |Sighandler_t|rsignal_state \ + |int i +Cdhp |int |runops_debug +Cdhp |int |runops_standard +Adp |CV * |rv2cv_op_cv |NN OP *cvop \ + |U32 flags : Used in pp_hot.c -p |void |rxres_save |NN void **rsp|NN REGEXP *rx -#if !defined(HAS_RENAME) -: Used in pp_sys.c -p |I32 |same_dirent |NN const char* a|NN const char* b -#endif -Apda |char* |savepv |NULLOK const char* pv -Apda |char* |savepvn |NULLOK const char* pv|Size_t len -Apda |char* |savesharedpv |NULLOK const char* pv - -: NULLOK only to suppress a compiler warning -Apda |char* |savesharedpvn |NULLOK const char *const pv \ - |const STRLEN len -Apda |char* |savesharedsvpv |NN SV *sv -Apda |char* |savesvpv |NN SV* sv -Cp |void |savestack_grow -Cp |void |savestack_grow_cnt |I32 need -Am |void |save_aelem |NN AV* av|SSize_t idx|NN SV **sptr -Ap |void |save_aelem_flags|NN AV* av|SSize_t idx|NN SV **sptr \ - |const U32 flags -Cpd |I32 |save_alloc |I32 size|I32 pad -Apdh |void |save_aptr |NN AV** aptr -Apdh |AV* |save_ary |NN GV* gv -Cp |void |save_bool |NN bool* boolp -Cp |void |save_clearsv |NN SV** svp -Cp |void |save_delete |NN HV *hv|NN char *key|I32 klen -Cpd |void |save_hdelete |NN HV *hv|NN SV *keysv -Cpd |void |save_adelete |NN AV *av|SSize_t key -Cp |void |save_destructor|DESTRUCTORFUNC_NOCONTEXT_t f|NN void* p -Cp |void |save_destructor_x|DESTRUCTORFUNC_t f|NULLOK void* p -CpMb |void |save_freesv |NULLOK SV* sv +p |void |rxres_save |NN void **rsp \ + |NN REGEXP *rx +ATadp |Malloc_t|safesyscalloc |MEM_SIZE elements \ + |MEM_SIZE size +ATdp |Free_t |safesysfree |Malloc_t where +ATadp |Malloc_t|safesysmalloc |MEM_SIZE nbytes +ARTdp |Malloc_t|safesysrealloc|Malloc_t where \ + |MEM_SIZE nbytes +Cdp |void |save_adelete |NN AV *av \ + |SSize_t key +Adm |void |save_aelem |NN AV *av \ + |SSize_t idx \ + |NN SV **sptr +Adp |void |save_aelem_flags \ + |NN AV *av \ + |SSize_t idx \ + |NN SV **sptr \ + |const U32 flags +Cdp |SSize_t|save_alloc |SSize_t size \ + |I32 pad +Adhp |void |save_aptr |NN AV **aptr +Adhp |AV * |save_ary |NN GV *gv +Cp |void |save_bool |NN bool *boolp +Cp |void |save_clearsv |NN SV **svp +Cp |void |save_delete |NN HV *hv \ + |NN char *key \ + |I32 klen +Cp |void |save_destructor|DESTRUCTORFUNC_NOCONTEXT_t f \ + |NN void *p +Cp |void |save_destructor_x \ + |DESTRUCTORFUNC_t f \ + |NULLOK void *p : Used in SAVEFREOP(), used in op.c, pp_ctl.c -CpMb |void |save_freeop |NULLOK OP* o -CpMb |void |save_freepv |NULLOK char* pv -Cpd |void |save_generic_svref|NN SV** sptr -Cpd |void |save_generic_pvref|NN char** str -Cpd |void |save_shared_pvref|NN char** str -Adp |void |save_gp |NN GV* gv|I32 empty -Apdh |HV* |save_hash |NN GV* gv -Cpd |void |save_hints -Am |void |save_helem |NN HV *hv|NN SV *key|NN SV **sptr -Ap |void |save_helem_flags|NN HV *hv|NN SV *key|NN SV **sptr|const U32 flags -Apdh |void |save_hptr |NN HV** hptr -Cp |void |save_I16 |NN I16* intp -Cp |void |save_I32 |NN I32* intp -Cp |void |save_I8 |NN I8* bytep -Cp |void |save_int |NN int* intp -Apdh |void |save_item |NN SV* item +CMbp |void |save_freeop |NULLOK OP *o +CMbp |void |save_freepv |NULLOK char *pv +Cdp |void |save_freercpv |NN char *rcpv +CMbp |void |save_freesv |NULLOK SV *sv +Cdp |void |save_generic_pvref \ + |NN char **str +Cdp |void |save_generic_svref \ + |NN SV **sptr +Adp |void |save_gp |NN GV *gv \ + |I32 empty +Adhp |HV * |save_hash |NN GV *gv +Cdp |void |save_hdelete |NN HV *hv \ + |NN SV *keysv +Adm |void |save_helem |NN HV *hv \ + |NN SV *key \ + |NN SV **sptr +Adp |void |save_helem_flags \ + |NN HV *hv \ + |NN SV *key \ + |NN SV **sptr \ + |const U32 flags +Cdp |void |save_hints +Adhp |void |save_hptr |NN HV **hptr +Cp |void |save_I16 |NN I16 *intp +Cp |void |save_I32 |NN I32 *intp +Cp |void |save_I8 |NN I8 *bytep +Cp |void |save_int |NN int *intp +Adhp |void |save_item |NN SV *item Cp |void |save_iv |NN IV *ivp -AbpDdh |void |save_list |NN SV** sarg|I32 maxsarg -CbpD |void |save_long |NN long* longp -CpMb |void |save_mortalizesv|NN SV* sv -AbpD |void |save_nogv |NN GV* gv +CMbp |void |save_mortalizesv \ + |NN SV *sv : Used in SAVEFREOP(), used in gv.c, op.c, perl.c, pp_ctl.c, pp_sort.c -CpMbd |void |save_op -Apdh |SV* |save_scalar |NN GV* gv -Cp |void |save_pptr |NN char** pptr -Cpd |void |save_vptr |NN void *ptr -Cp |void |save_re_context -Cpd |void |save_padsv_and_mortalize|PADOFFSET off -Cp |void |save_sptr |NN SV** sptr -Xp |void |save_strlen |NN STRLEN* ptr -Apdh |SV* |save_svref |NN SV** sptr -Axpo |void |savetmps -Ap |void |save_pushptr |NULLOK void *const ptr|const int type -Ap |void |save_pushi32ptr|const I32 i|NULLOK void *const ptr|const int type +CMbdp |void |save_op +Cdp |void |save_padsv_and_mortalize \ + |PADOFFSET off +Cp |void |save_pptr |NN char **pptr +Cp |void |save_pushi32ptr|const I32 i \ + |NULLOK void * const ptr \ + |const int type +Cdp |void |save_pushptr |NULLOK void * const ptr \ + |const int type : Used by SAVESWITCHSTACK() in pp.c -Ap |void |save_pushptrptr|NULLOK void *const ptr1 \ - |NULLOK void *const ptr2|const int type -#if defined(PERL_IN_SCOPE_C) -S |void |save_pushptri32ptr|NULLOK void *const ptr1|const I32 i \ - |NULLOK void *const ptr2|const int type -#endif -Xiop |I32 |TOPMARK -Xiop |I32 |POPMARK +Cp |void |save_pushptrptr|NULLOK void * const ptr1 \ + |NULLOK void * const ptr2 \ + |const int type +Aadip |char * |savepv |NULLOK const char *pv +Aadip |char * |savepvn |NULLOK const char *pv \ + |Size_t len +Cdp |void |save_rcpv |NN char **prcpv +Cp |void |save_re_context +Adhp |SV * |save_scalar |NN GV *gv +Cdp |void |save_set_svflags \ + |NN SV *sv \ + |U32 mask \ + |U32 val +Aadp |char * |savesharedpv |NULLOK const char *pv + +: NULLOK only to suppress a compiler warning +Aadp |char * |savesharedpvn |NULLOK const char * const pv \ + |const STRLEN len +Cdp |void |save_shared_pvref \ + |NN char **str +Aadip |char * |savesharedsvpv |NN SV *sv +Cp |void |save_sptr |NN SV **sptr +Cp |void |savestack_grow +Cp |void |savestack_grow_cnt \ + |I32 need +Xp |void |save_strlen |NN STRLEN *ptr +Aadip |char * |savesvpv |NN SV *sv +Adhp |SV * |save_svref |NN SV **sptr +Aopx |void |savetmps +Cdp |void |save_vptr |NN void *ptr : Used in perly.y -p |OP* |sawparens |NULLOK OP* o -Apd |OP* |op_contextualize|NN OP* o|I32 context +p |OP * |sawparens |NULLOK OP *o : Used in perly.y -p |OP* |scalar |NULLOK OP* o -#if defined(PERL_IN_OP_C) -S |OP* |scalarkids |NULLOK OP* o -S |OP* |voidnonfinal |NULLOK OP* o -#endif +p |OP * |scalar |NULLOK OP *o : Used in pp_ctl.c -p |OP* |scalarvoid |NN OP* o -Apd |NV |scan_bin |NN const char* start|STRLEN len|NN STRLEN* retlen -Apd |NV |scan_hex |NN const char* start|STRLEN len|NN STRLEN* retlen -Cp |char* |scan_num |NN const char* s|NN YYSTYPE *lvalp -Apd |NV |scan_oct |NN const char* start|STRLEN len|NN STRLEN* retlen -Axpd |OP* |op_scope |NULLOK OP* o -ApdRx |OP* |op_wrap_finally|NN OP *block|NN OP *finally +p |OP * |scalarvoid |NN OP *o +Adp |NV |scan_bin |NN const char *start \ + |STRLEN len \ + |NN STRLEN *retlen +Adp |NV |scan_hex |NN const char *start \ + |STRLEN len \ + |NN STRLEN *retlen +Cp |char * |scan_num |NN const char *s \ + |NN YYSTYPE *lvalp +Adp |NV |scan_oct |NN const char *start \ + |STRLEN len \ + |NN STRLEN *retlen + +: For use ONLY in B::Hooks::Parser, by special dispensation +ERXpx |char * |scan_str |NN char *start \ + |int keep_quoted \ + |int keep_delims \ + |int re_reparse \ + |NULLOK char **delimp +Adp |const char *|scan_version \ + |NN const char *s \ + |NN SV *rv \ + |bool qv +Adp |char * |scan_vstring |NN const char *s \ + |NN const char * const e \ + |NN SV *sv +EXpx |char * |scan_word |NN char *s \ + |NN char *dest \ + |STRLEN destlen \ + |int allow_package \ + |NN STRLEN *slp +EXpx |char * |scan_word6 |NN char *s \ + |NN char *dest \ + |STRLEN destlen \ + |int allow_package \ + |NN STRLEN *slp \ + |bool warn_tick +Cp |U32 |seed : Only used by perl.c/miniperl.c, but defined in caretx.c -pe |void |set_caret_X -Apd |void |setdefout |NN GV* gv -Cp |HEK* |share_hek |NN const char* str|SSize_t len|U32 hash -#ifdef PERL_USE_3ARG_SIGHANDLER -: Used in perl.c -Tp |Signal_t |sighandler |int sig|NULLOK Siginfo_t *info|NULLOK void *uap -CTp |Signal_t |csighandler |int sig|NULLOK Siginfo_t *info|NULLOK void *uap -#else -Tp |Signal_t |sighandler |int sig -CTp |Signal_t |csighandler |int sig -#endif -Tp |Signal_t |sighandler1 |int sig -CTp |Signal_t |csighandler1 |int sig -Tp |Signal_t |sighandler3 |int sig|NULLOK Siginfo_t *info|NULLOK void *uap -CTp |Signal_t |csighandler3 |int sig|NULLOK Siginfo_t *info|NULLOK void *uap -CTp |Signal_t |perly_sighandler |int sig|NULLOK Siginfo_t *info|NULLOK void *uap|bool safe -Cp |SV** |stack_grow |NN SV** sp|NN SV** p|SSize_t n -Ap |I32 |start_subparse |I32 is_format|U32 flags -Xp |void |init_named_cv |NN CV *cv|NN OP *nameop +ep |void |set_caret_X +CTdp |void |set_context |NN void *t +Adp |void |setdefout |NN GV *gv +Tp |void |setfd_cloexec |int fd +p |void |setfd_cloexec_for_nonsysfd \ + |int fd +p |void |setfd_cloexec_or_inhexec_by_sysfdness \ + |int fd +Tp |void |setfd_inhexec |int fd +p |void |setfd_inhexec_for_sysfd \ + |int fd +Xp |void |set_numeric_standard +Xp |void |set_numeric_underlying +Cp |HEK * |share_hek |NN const char *str \ + |SSize_t len \ + |U32 hash +Tp |Signal_t|sighandler1 |int sig +Tp |Signal_t|sighandler3 |int sig \ + |NULLOK Siginfo_t *info \ + |NULLOK void *uap +CRTip |unsigned|single_1bit_pos32 \ + |U32 word +ERXpx |char * |skipspace_flags|NN char *s \ + |U32 flags +RXp |void * |Slab_Alloc |size_t sz +Xp |void |Slab_Free |NN void *op +Adp |void |sortsv |NULLOK SV **array \ + |size_t num_elts \ + |NN SVCOMPARE_t cmp +Adp |void |sortsv_flags |NULLOK SV **array \ + |size_t num_elts \ + |NN SVCOMPARE_t cmp \ + |U32 flags +Cp |SV ** |stack_grow |NN SV **sp \ + |NN SV **p \ + |SSize_t n +: Defined in doio.c, used only in pp_hot.c +dopx |PerlIO *|start_glob |NN SV *tmpglob \ + |NN IO *io +Adp |I32 |start_subparse |I32 is_format \ + |U32 flags +CRp |NV |str_to_version |NN SV *sv : Used in pp_ctl.c -p |void |sub_crush_depth|NN CV* cv -CpbMd |bool |sv_2bool |NN SV *const sv -Cpd |bool |sv_2bool_flags |NN SV *sv|I32 flags -Apd |CV* |sv_2cv |NULLOK SV* sv|NN HV **const st|NN GV **const gvp \ - |const I32 lref -Apd |IO* |sv_2io |NN SV *const sv -#if defined(PERL_IN_SV_C) -S |bool |glob_2number |NN GV* const gv -#endif -CpMb |IV |sv_2iv |NN SV *sv -Apd |IV |sv_2iv_flags |NN SV *const sv|const I32 flags -Apd |SV* |sv_2mortal |NULLOK SV *const sv -Apd |NV |sv_2nv_flags |NN SV *const sv|const I32 flags -: Used in pp.c, pp_hot.c, sv.c -pxd |SV* |sv_2num |NN SV *const sv -ApdMb |char* |sv_2pv |NN SV *sv|NULLOK STRLEN *lp -Apd |char* |sv_2pv_flags |NN SV *const sv|NULLOK STRLEN *const lp|const U32 flags -ApdMb |char* |sv_2pvutf8 |NN SV *sv|NULLOK STRLEN *const lp -Apd |char* |sv_2pvutf8_flags |NN SV *sv|NULLOK STRLEN *const lp|const U32 flags -ApdMb |char* |sv_2pvbyte |NN SV *sv|NULLOK STRLEN *const lp -Apd |char* |sv_2pvbyte_flags |NN SV *sv|NULLOK STRLEN *const lp|const U32 flags -AbpD |char* |sv_pvn_nomg |NN SV* sv|NULLOK STRLEN* lp -CpMb |UV |sv_2uv |NN SV *sv -Apd |UV |sv_2uv_flags |NN SV *const sv|const I32 flags -CbpdD |IV |sv_iv |NN SV* sv -CbpdD |UV |sv_uv |NN SV* sv -CbpdD |NV |sv_nv |NN SV* sv -CbpdD |char* |sv_pvn |NN SV *sv|NN STRLEN *lp -CbpdD |char* |sv_pvutf8n |NN SV *sv|NN STRLEN *lp -CbpdD |char* |sv_pvbyten |NN SV *sv|NN STRLEN *lp -Cpd |I32 |sv_true |NULLOK SV *const sv -#if defined(PERL_IN_SV_C) -Sd |void |sv_add_arena |NN char *const ptr|const U32 size \ - |const U32 flags -#endif -ApdT |void |sv_backoff |NN SV *const sv -Apd |SV* |sv_bless |NN SV *const sv|NN HV *const stash -#if defined(PERL_DEBUG_READONLY_COW) -p |void |sv_buf_to_ro |NN SV *sv -# if defined(PERL_IN_SV_C) -S |void |sv_buf_to_rw |NN SV *sv -# endif -#endif -Afpd |void |sv_catpvf |NN SV *const sv|NN const char *const pat|... -Apd |void |sv_vcatpvf |NN SV *const sv|NN const char *const pat \ - |NULLOK va_list *const args -Apd |void |sv_catpv |NN SV *const dsv|NULLOK const char* sstr -ApMdb |void |sv_catpvn |NN SV *dsv|NN const char *sstr|STRLEN len -ApMdb |void |sv_catsv |NN SV *dsv|NULLOK SV *sstr -Apd |void |sv_chop |NN SV *const sv|NULLOK const char *const ptr +p |void |sub_crush_depth|NN CV *cv +Adp |void |suspend_compcv |NN struct suspended_compcv *buffer +ATdip |void |SvAMAGIC_off |NN SV *sv +ATdip |void |SvAMAGIC_on |NN SV *sv +ATdp |void |sv_backoff |NN SV * const sv +Adp |SV * |sv_bless |NN SV * const sv \ + |NN HV * const stash +CMbdp |bool |sv_2bool |NN SV * const sv +Cdp |bool |sv_2bool_flags |NN SV *sv \ + |I32 flags +Adp |bool |sv_cat_decode |NN SV *dsv \ + |NN SV *encoding \ + |NN SV *ssv \ + |NN int *offset \ + |NN char *tstr \ + |int tlen +Adp |void |sv_catpv |NN SV * const dsv \ + |NULLOK const char *sstr +Adfp |void |sv_catpvf |NN SV * const sv \ + |NN const char * const pat \ + |... +Adp |void |sv_catpv_flags |NN SV *dsv \ + |NN const char *sstr \ + |const I32 flags +Adfp |void |sv_catpvf_mg |NN SV * const sv \ + |NN const char * const pat \ + |... +Adp |void |sv_catpv_mg |NN SV * const dsv \ + |NULLOK const char * const sstr +AMbdp |void |sv_catpvn |NN SV *dsv \ + |NN const char *sstr \ + |STRLEN len +Adp |void |sv_catpvn_flags|NN SV * const dsv \ + |NN const char *sstr \ + |const STRLEN len \ + |const I32 flags +AMbdp |void |sv_catpvn_mg |NN SV *dsv \ + |NN const char *sstr \ + |STRLEN len +AMbdp |void |sv_catsv |NN SV *dsv \ + |NULLOK SV *sstr +Adp |void |sv_catsv_flags |NN SV * const dsv \ + |NULLOK SV * const sstr \ + |const I32 flags +AMbdp |void |sv_catsv_mg |NN SV *dsv \ + |NULLOK SV *sstr +Adp |void |sv_chop |NN SV * const sv \ + |NULLOK const char * const ptr : Used only in perl.c -pd |I32 |sv_clean_all +dp |I32 |sv_clean_all : Used only in perl.c -pd |void |sv_clean_objs -Apd |void |sv_clear |NN SV *const orig_sv -#if defined(PERL_IN_SV_C) -S |bool |curse |NN SV * const sv|const bool check_refcnt -#endif -AMpd |I32 |sv_cmp |NULLOK SV *const sv1|NULLOK SV *const sv2 -Apd |I32 |sv_cmp_flags |NULLOK SV *const sv1|NULLOK SV *const sv2 \ +dp |void |sv_clean_objs +Adp |void |sv_clear |NN SV * const orig_sv +AMdp |I32 |sv_cmp |NULLOK SV * const sv1 \ + |NULLOK SV * const sv2 +Adp |I32 |sv_cmp_flags |NULLOK SV * const sv1 \ + |NULLOK SV * const sv2 \ |const U32 flags -AMpd |I32 |sv_cmp_locale |NULLOK SV *const sv1|NULLOK SV *const sv2 -Apd |I32 |sv_cmp_locale_flags |NULLOK SV *const sv1 \ - |NULLOK SV *const sv2|const U32 flags -#if defined(USE_LOCALE_COLLATE) -ApbMd |char* |sv_collxfrm |NN SV *const sv|NN STRLEN *const nxp -Apd |char* |sv_collxfrm_flags |NN SV *const sv|NN STRLEN *const nxp|I32 const flags -#endif -Apd |int |getcwd_sv |NN SV* sv -Apd |void |sv_dec |NULLOK SV *const sv -Apd |void |sv_dec_nomg |NULLOK SV *const sv -Apd |void |sv_dump |NULLOK SV* sv -ApdR |bool |sv_derived_from|NN SV* sv|NN const char *const name -ApdR |bool |sv_derived_from_sv|NN SV* sv|NN SV *namesv|U32 flags -ApdR |bool |sv_derived_from_pv|NN SV* sv|NN const char *const name|U32 flags -ApdR |bool |sv_derived_from_pvn|NN SV* sv|NN const char *const name \ - |const STRLEN len|U32 flags -ApdRx |bool |sv_isa_sv |NN SV* sv|NN SV* namesv -ApdR |bool |sv_does |NN SV* sv|NN const char *const name -ApdR |bool |sv_does_sv |NN SV* sv|NN SV* namesv|U32 flags -ApdR |bool |sv_does_pv |NN SV* sv|NN const char *const name|U32 flags -ApdR |bool |sv_does_pvn |NN SV* sv|NN const char *const name|const STRLEN len \ - |U32 flags -ApbMd |I32 |sv_eq |NULLOK SV* sv1|NULLOK SV* sv2 -Apd |I32 |sv_eq_flags |NULLOK SV* sv1|NULLOK SV* sv2|const U32 flags -Apd |void |sv_free |NULLOK SV *const sv -poxX |void |sv_free2 |NN SV *const sv|const U32 refcnt +AMdp |I32 |sv_cmp_locale |NULLOK SV * const sv1 \ + |NULLOK SV * const sv2 +Adp |I32 |sv_cmp_locale_flags \ + |NULLOK SV * const sv1 \ + |NULLOK SV * const sv2 \ + |const U32 flags +AMbdp |void |sv_copypv |NN SV * const dsv \ + |NN SV * const ssv +Adp |void |sv_copypv_flags|NN SV * const dsv \ + |NN SV * const ssv \ + |const I32 flags +Adm |void |sv_copypv_nomg |NN SV * const dsv \ + |NN SV * const ssv +Adp |CV * |sv_2cv |NULLOK SV *sv \ + |NN HV ** const st \ + |NN GV ** const gvp \ + |const I32 lref +Adp |void |sv_dec |NULLOK SV * const sv +Adp |void |sv_dec_nomg |NULLOK SV * const sv + +Xp |void |sv_del_backref |NN SV * const tsv \ + |NN SV * const sv +ARdp |bool |sv_derived_from|NN SV *sv \ + |NN const char * const name +ARdp |bool |sv_derived_from_hv \ + |NN SV *sv \ + |NN HV *hv +ARdp |bool |sv_derived_from_pv \ + |NN SV *sv \ + |NN const char * const name \ + |U32 flags +ARdp |bool |sv_derived_from_pvn \ + |NN SV *sv \ + |NN const char * const name \ + |const STRLEN len \ + |U32 flags +ARdp |bool |sv_derived_from_sv \ + |NN SV *sv \ + |NN SV *namesv \ + |U32 flags +Adp |bool |sv_destroyable |NULLOK SV *sv +ARdp |bool |sv_does |NN SV *sv \ + |NN const char * const name +ARdp |bool |sv_does_pv |NN SV *sv \ + |NN const char * const name \ + |U32 flags +ARdp |bool |sv_does_pvn |NN SV *sv \ + |NN const char * const name \ + |const STRLEN len \ + |U32 flags +ARdp |bool |sv_does_sv |NN SV *sv \ + |NN SV *namesv \ + |U32 flags +Adp |void |sv_dump |NULLOK SV *sv +Adp |void |sv_dump_depth |NULLOK SV *sv \ + |I32 depth +AMbdp |I32 |sv_eq |NULLOK SV *sv1 \ + |NULLOK SV *sv2 +Adp |I32 |sv_eq_flags |NULLOK SV *sv1 \ + |NULLOK SV *sv2 \ + |const U32 flags +AMbdp |void |sv_force_normal|NN SV *sv +Adp |void |sv_force_normal_flags \ + |NN SV * const sv \ + |const U32 flags +Adp |void |sv_free |NULLOK SV * const sv +Xopx |void |sv_free2 |NN SV * const sv \ + |const U32 refcnt : Used only in perl.c -pd |void |sv_free_arenas -Apd |char* |sv_gets |NN SV *const sv|NN PerlIO *const fp|I32 append -Cpd |char* |sv_grow |NN SV *const sv|STRLEN newlen -Cpd |char* |sv_grow_fresh |NN SV *const sv|STRLEN newlen -Apd |void |sv_inc |NULLOK SV *const sv -Apd |void |sv_inc_nomg |NULLOK SV *const sv -ApMdb |void |sv_insert |NN SV *const bigstr|const STRLEN offset \ - |const STRLEN len|NN const char *const little \ +dp |void |sv_free_arenas +ATdpx |SV * |sv_get_backrefs|NN SV * const sv +Adip |void |SvGETMAGIC |NN SV *sv +Adp |char * |sv_gets |NN SV * const sv \ + |NN PerlIO * const fp \ + |I32 append +Cdp |char * |sv_grow |NN SV * const sv \ + |STRLEN newlen +Cdp |char * |sv_grow_fresh |NN SV * const sv \ + |STRLEN newlen +Adp |void |sv_inc |NULLOK SV * const sv +Adp |void |sv_inc_nomg |NULLOK SV * const sv +AMbdp |void |sv_insert |NN SV * const bigstr \ + |const STRLEN offset \ + |const STRLEN len \ + |NN const char * const little \ |const STRLEN littlelen -Apd |void |sv_insert_flags|NN SV *const bigstr|const STRLEN offset|const STRLEN len \ - |NN const char *little|const STRLEN littlelen|const U32 flags -Apd |int |sv_isa |NULLOK SV* sv|NN const char *const name -Apd |int |sv_isobject |NULLOK SV* sv -Apd |STRLEN |sv_len |NULLOK SV *const sv -Apd |STRLEN |sv_len_utf8 |NULLOK SV *const sv -Apd |STRLEN |sv_len_utf8_nomg|NN SV *const sv -Apd |void |sv_magic |NN SV *const sv|NULLOK SV *const obj|const int how \ - |NULLOK const char *const name|const I32 namlen -Apd |MAGIC *|sv_magicext |NN SV *const sv|NULLOK SV *const obj|const int how \ - |NULLOK const MGVTBL *const vtbl|NULLOK const char *const name \ +Adp |void |sv_insert_flags|NN SV * const bigstr \ + |const STRLEN offset \ + |const STRLEN len \ + |NN const char *little \ + |const STRLEN littlelen \ + |const U32 flags +Adp |IO * |sv_2io |NN SV * const sv +Adp |int |sv_isa |NULLOK SV *sv \ + |NN const char * const name +ARdpx |bool |sv_isa_sv |NN SV *sv \ + |NN SV *namesv +Adp |int |sv_isobject |NULLOK SV *sv +Adip |IV |SvIV |NN SV *sv +CMbp |IV |sv_2iv |NN SV *sv +Adp |IV |sv_2iv_flags |NN SV * const sv \ + |const I32 flags +Adip |IV |SvIV_nomg |NN SV *sv +Adp |STRLEN |sv_len |NULLOK SV * const sv +Adp |STRLEN |sv_len_utf8 |NULLOK SV * const sv +Adp |STRLEN |sv_len_utf8_nomg \ + |NN SV * const sv +Adp |void |sv_magic |NN SV * const sv \ + |NULLOK SV * const obj \ + |const int how \ + |NULLOK const char * const name \ + |const I32 namlen +Adp |MAGIC *|sv_magicext |NN SV * const sv \ + |NULLOK SV * const obj \ + |const int how \ + |NULLOK const MGVTBL * const vtbl \ + |NULLOK const char * const name \ |const I32 namlen -EiTp |bool |sv_only_taint_gmagic|NN SV *sv : exported for re.pm -EXp |MAGIC *|sv_magicext_mglob|NN SV *sv -ApdbMR |SV* |sv_mortalcopy |NULLOK SV *const oldsv -ApdR |SV* |sv_mortalcopy_flags|NULLOK SV *const oldsv|U32 flags -ApdR |SV* |sv_newmortal -Cpd |SV* |sv_newref |NULLOK SV *const sv -Amd |bool |sv_numeq |NULLOK SV* sv1|NULLOK SV* sv2 -Apd |bool |sv_numeq_flags |NULLOK SV* sv1|NULLOK SV* sv2|const U32 flags -Cpd |char* |sv_peek |NULLOK SV* sv -Apd |void |sv_pos_u2b |NULLOK SV *const sv|NN I32 *const offsetp|NULLOK I32 *const lenp -Apd |STRLEN |sv_pos_u2b_flags|NN SV *const sv|STRLEN uoffset \ - |NULLOK STRLEN *const lenp|U32 flags -Apd |void |sv_pos_b2u |NULLOK SV *const sv|NN I32 *const offsetp -Apd |STRLEN |sv_pos_b2u_flags|NN SV *const sv|STRLEN const offset \ - |U32 flags -CpMdb |char* |sv_pvn_force |NN SV* sv|NULLOK STRLEN* lp -Cpd |char* |sv_pvutf8n_force|NN SV *const sv|NULLOK STRLEN *const lp -Cpd |char* |sv_pvbyten_force|NN SV *const sv|NULLOK STRLEN *const lp -Apd |char* |sv_recode_to_utf8 |NN SV* sv|NN SV *encoding -Apd |bool |sv_cat_decode |NN SV* dsv|NN SV *encoding|NN SV *ssv|NN int *offset \ - |NN char* tstr|int tlen -ApdR |const char* |sv_reftype |NN const SV *const sv|const int ob -Apd |SV* |sv_ref |NULLOK SV *dst|NN const SV *const sv|const int ob -Apd |void |sv_replace |NN SV *const sv|NN SV *const nsv -Apd |void |sv_report_used -Apd |void |sv_reset |NN const char* s|NULLOK HV *const stash -p |void |sv_resetpvn |NULLOK const char* s|STRLEN len \ - |NULLOK HV *const stash -Afpd |void |sv_setpvf |NN SV *const sv|NN const char *const pat|... -Apd |void |sv_vsetpvf |NN SV *const sv|NN const char *const pat|NULLOK va_list *const args -Apd |void |sv_setiv |NN SV *const sv|const IV num -ApdbD |void |sv_setpviv |NN SV *const sv|const IV num -Apd |void |sv_setuv |NN SV *const sv|const UV num -Apd |void |sv_setnv |NN SV *const sv|const NV num -Apd |SV* |sv_setref_iv |NN SV *const rv|NULLOK const char *const classname|const IV iv -Apd |SV* |sv_setref_uv |NN SV *const rv|NULLOK const char *const classname|const UV uv -Apd |SV* |sv_setref_nv |NN SV *const rv|NULLOK const char *const classname|const NV nv -Apd |SV* |sv_setref_pv |NN SV *const rv|NULLOK const char *const classname \ - |NULLOK void *const pv -Apd |SV* |sv_setref_pvn |NN SV *const rv|NULLOK const char *const classname \ - |NN const char *const pv|const STRLEN n -Apd |void |sv_setpv |NN SV *const sv|NULLOK const char *const ptr -Apd |void |sv_setpvn |NN SV *const sv|NULLOK const char *const ptr|const STRLEN len -Apd |void |sv_setpvn_fresh|NN SV *const sv|NULLOK const char *const ptr|const STRLEN len -Apd |char *|sv_setpv_bufsize|NN SV *const sv|const STRLEN cur|const STRLEN len -Xp |void |sv_sethek |NN SV *const sv|NULLOK const HEK *const hek -Apd |void |sv_setrv_noinc |NN SV *const sv|NN SV *const ref -Apd |void |sv_setrv_inc |NN SV *const sv|NN SV *const ref -Apd |void |sv_setrv_noinc_mg |NN SV *const sv|NN SV *const ref -Apd |void |sv_setrv_inc_mg |NN SV *const sv|NN SV *const ref -ApMdb |void |sv_setsv |NN SV *dsv|NULLOK SV *ssv -Amd |bool |sv_streq |NULLOK SV* sv1|NULLOK SV* sv2 -Apd |bool |sv_streq_flags |NULLOK SV* sv1|NULLOK SV* sv2|const U32 flags -CpMdb |void |sv_taint |NN SV* sv -CpdR |bool |sv_tainted |NN SV *const sv -Apd |int |sv_unmagic |NN SV *const sv|const int type -Apd |int |sv_unmagicext |NN SV *const sv|const int type|NULLOK MGVTBL *vtbl -ApdMb |void |sv_unref |NN SV* sv -Apd |void |sv_unref_flags |NN SV *const ref|const U32 flags -Cpd |void |sv_untaint |NN SV *const sv -Apd |void |sv_upgrade |NN SV *const sv|svtype new_type -ApdMb |void |sv_usepvn |NN SV* sv|NULLOK char* ptr|STRLEN len -Apd |void |sv_usepvn_flags|NN SV *const sv|NULLOK char* ptr|const STRLEN len\ - |const U32 flags -Apd |void |sv_vcatpvfn |NN SV *const sv|NN const char *const pat|const STRLEN patlen \ - |NULLOK va_list *const args|NULLOK SV **const svargs|const Size_t sv_count \ - |NULLOK bool *const maybe_tainted -Apd |void |sv_vcatpvfn_flags|NN SV *const sv|NN const char *const pat|const STRLEN patlen \ - |NULLOK va_list *const args|NULLOK SV **const svargs|const Size_t sv_count \ - |NULLOK bool *const maybe_tainted|const U32 flags -Apd |void |sv_vsetpvfn |NN SV *const sv|NN const char *const pat|const STRLEN patlen \ - |NULLOK va_list *const args|NULLOK SV **const svargs \ - |const Size_t sv_count|NULLOK bool *const maybe_tainted -CpR |NV |str_to_version |NN SV *sv -Cp |void |regdump |NN const regexp* r -CiTop |struct regexp *|ReANY |NN const REGEXP * const re -Apdh |I32 |pregexec |NN REGEXP * const prog|NN char* stringarg \ - |NN char* strend|NN char* strbeg \ - |SSize_t minend |NN SV* screamer|U32 nosave -Cp |void |pregfree |NULLOK REGEXP* r -Cp |void |pregfree2 |NN REGEXP *rx -: FIXME - is anything in re using this now? -EXp |REGEXP*|reg_temp_copy |NULLOK REGEXP* dsv|NN REGEXP* ssv -Cp |void |regfree_internal|NN REGEXP *const rx -#if defined(USE_ITHREADS) -Cp |void* |regdupe_internal|NN REGEXP * const r|NN CLONE_PARAMS* param -#endif -EXp |regexp_engine const *|current_re_engine -Apdh |REGEXP*|pregcomp |NN SV * const pattern|const U32 flags -p |REGEXP*|re_op_compile |NULLOK SV ** const patternp \ - |int pat_count|NULLOK OP *expr \ - |NN const regexp_engine* eng \ - |NULLOK REGEXP *old_re \ - |NULLOK bool *is_bare_re \ - |const U32 rx_flags|const U32 pm_flags -Apd |REGEXP*|re_compile |NN SV * const pattern|U32 orig_rx_flags -Cp |char* |re_intuit_start|NN REGEXP * const rx \ - |NULLOK SV* sv \ - |NN const char* const strbeg \ - |NN char* strpos \ - |NN char* strend \ - |const U32 flags \ - |NULLOK re_scream_pos_data *data -Cp |SV* |re_intuit_string|NN REGEXP *const r -Cp |I32 |regexec_flags |NN REGEXP *const rx|NN char *stringarg \ - |NN char *strend|NN char *strbeg \ - |SSize_t minend|NN SV *sv \ - |NULLOK void *data|U32 flags -CpR |regnode*|regnext |NULLOK regnode* p -EXp |SV*|reg_named_buff |NN REGEXP * const rx|NULLOK SV * const key \ - |NULLOK SV * const value|const U32 flags -EXp |SV*|reg_named_buff_iter |NN REGEXP * const rx|NULLOK const SV * const lastkey \ - |const U32 flags -Cp |SV*|reg_named_buff_fetch |NN REGEXP * const rx|NN SV * const namesv|const U32 flags -Cp |bool|reg_named_buff_exists |NN REGEXP * const rx|NN SV * const key|const U32 flags -Cp |SV*|reg_named_buff_firstkey |NN REGEXP * const rx|const U32 flags -Cp |SV*|reg_named_buff_nextkey |NN REGEXP * const rx|const U32 flags -Cp |SV*|reg_named_buff_scalar |NN REGEXP * const rx|const U32 flags -Cp |SV*|reg_named_buff_all |NN REGEXP * const rx|const U32 flags - -: FIXME - is anything in re using this now? -EXp |void|reg_numbered_buff_fetch|NN REGEXP * const rx|const I32 paren|NULLOK SV * const sv -: FIXME - is anything in re using this now? -EXp |void|reg_numbered_buff_store|NN REGEXP * const rx|const I32 paren|NULLOK SV const * const value -: FIXME - is anything in re using this now? -EXp |I32|reg_numbered_buff_length|NN REGEXP * const rx|NN const SV * const sv|const I32 paren +EXp |MAGIC *|sv_magicext_mglob \ + |NN SV *sv +Adp |SV * |sv_2mortal |NULLOK SV * const sv +AMRbdp |SV * |sv_mortalcopy |NULLOK SV * const oldsv +ARdp |SV * |sv_mortalcopy_flags \ + |NULLOK SV * const oldsv \ + |U32 flags +ARdp |SV * |sv_newmortal +Cdp |SV * |sv_newref |NULLOK SV * const sv +ADbdp |void |sv_nolocking |NULLOK SV *sv -: FIXME - is anything in re using this now? -EXp |SV*|reg_qr_package|NN REGEXP * const rx -EXpRT |I16 |do_uniprop_match|NN const char * const key|const U16 key_len -EXpRT |const char * const *|get_prop_values|const int table_index -EXpR |SV * |get_prop_definition|const int table_index -EXpRT |const char *|get_deprecated_property_msg|const Size_t warning_offset -#if defined(PERL_IN_REGCOMP_C) -EiRT |bool |invlist_is_iterating|NN const SV* const invlist -EiR |SV* |invlist_contents|NN SV* const invlist \ - |const bool traditional_style -EixRT |UV |invlist_lowest|NN SV* const invlist -ERS |SV* |make_exactf_invlist |NN RExC_state_t *pRExC_state \ - |NN regnode *node -ES |regnode_offset|reg_la_NOTHING |NN RExC_state_t *pRExC_state \ - |U32 flags|NN const char *type -ES |regnode_offset|reg_la_OPFAIL |NN RExC_state_t *pRExC_state \ - |U32 flags|NN const char *type -ES |regnode_offset|reg |NN RExC_state_t *pRExC_state \ - |I32 paren|NN I32 *flagp|U32 depth -ES |regnode_offset|regnode_guts|NN RExC_state_t *pRExC_state \ - |const STRLEN extra_len -#ifdef DEBUGGING -ES |regnode_offset|regnode_guts_debug|NN RExC_state_t *pRExC_state \ - |const U8 op \ - |const STRLEN extra_len -#endif -ES |void |change_engine_size|NN RExC_state_t *pRExC_state|const Ptrdiff_t size -ES |regnode_offset|reganode|NN RExC_state_t *pRExC_state|U8 op \ - |U32 arg -ES |regnode_offset|regpnode|NN RExC_state_t *pRExC_state|U8 op \ - |NN SV * arg -ES |regnode_offset|reg2Lanode|NN RExC_state_t *pRExC_state \ - |const U8 op \ - |const U32 arg1 \ - |const I32 arg2 -ES |regnode_offset|regatom |NN RExC_state_t *pRExC_state \ - |NN I32 *flagp|U32 depth -ES |regnode_offset|regbranch |NN RExC_state_t *pRExC_state \ - |NN I32 *flagp|I32 first|U32 depth -ES |void |set_ANYOF_arg |NN RExC_state_t* const pRExC_state \ - |NN regnode* const node \ - |NULLOK SV* const cp_list \ - |NULLOK SV* const runtime_defns \ - |NULLOK SV* const only_utf8_locale_list -ES |void |output_posix_warnings \ - |NN RExC_state_t *pRExC_state \ - |NN AV* posix_warnings -EiT |Size_t |find_first_differing_byte_pos|NN const U8 * s1|NN const U8 * s2| const Size_t max -ES |AV* |add_multi_match|NULLOK AV* multi_char_matches \ - |NN SV* multi_string \ - |const STRLEN cp_count -ES |regnode_offset|regclass|NN RExC_state_t *pRExC_state \ - |NN I32 *flagp|U32 depth|const bool stop_at_1 \ - |bool allow_multi_fold \ - |const bool silence_non_portable \ - |const bool strict \ - |bool optimizable \ - |NULLOK SV** ret_invlist -ES |U8|optimize_regclass |NN RExC_state_t *pRExC_state \ - |NULLOK SV* cp_list \ - |NULLOK SV* only_utf8_locale_list \ - |NULLOK SV* upper_latin1_only_utf8_matches \ - |const U32 has_runtime_dependency \ - |const U32 posixl \ - |NN U8 * anyof_flags \ - |NN bool * invert \ - |NN regnode_offset * ret \ - |NN I32 *flagp -ES |SV * |parse_uniprop_string|NN const char * const name \ - |Size_t name_len \ - |const bool is_utf8 \ - |const bool to_fold \ - |const bool runtime \ - |const bool deferrable \ - |NULLOK AV ** strings \ - |NN bool * user_defined_ptr \ - |NN SV * msg \ - |const STRLEN level -ES |SV * |handle_user_defined_property|NN const char * name \ - |const STRLEN name_len \ - |const bool is_utf8 \ - |const bool to_fold \ - |const bool runtime \ - |const bool deferrable \ - |NN SV* contents \ - |NN bool *user_defined_ptr \ - |NN SV * msg \ - |const STRLEN level -ERS |REGEXP*|compile_wildcard|NN const char * subpattern|const STRLEN len\ - |const bool ignore_case -ES |I32 |execute_wildcard|NN REGEXP * const prog|NN char* stringarg \ - |NN char* strend|NN char* strbeg \ - |SSize_t minend |NN SV* screamer|U32 nosave -ES |bool |handle_names_wildcard \ - |NN const char * wname \ - |const STRLEN wname_len \ - |NN SV ** prop_definition \ - |NN AV ** strings -ES |void|add_above_Latin1_folds|NN RExC_state_t *pRExC_state|const U8 cp \ - |NN SV** invlist -ES |regnode_offset|handle_named_backref|NN RExC_state_t *pRExC_state \ - |NN I32 *flagp \ - |NN char * backref_parse_start \ - |char ch -ESTR |unsigned int|regex_set_precedence|const U8 my_operator -ES |regnode_offset|handle_regex_sets|NN RExC_state_t *pRExC_state \ - |NULLOK SV ** return_invlist \ - |NN I32 *flagp|U32 depth -ES |void |set_regex_pv |NN RExC_state_t *pRExC_state|NN REGEXP *Rx -# if defined(DEBUGGING) && defined(ENABLE_REGEX_SETS_DEBUGGING) -ES |void |dump_regex_sets_structures \ - |NN RExC_state_t *pRExC_state \ - |NN AV * stack \ - |const IV fence|NN AV * fence_stack -# endif -ES |void|parse_lparen_question_flags|NN RExC_state_t *pRExC_state -ES |regnode_offset|reg_node|NN RExC_state_t *pRExC_state|U8 op -ES |U32 |get_quantifier_value|NN RExC_state_t *pRExC_state \ - |NN const char * start|NN const char * end -ES |regnode_offset|regpiece|NN RExC_state_t *pRExC_state \ - |NN I32 *flagp|U32 depth -ES |bool |grok_bslash_N |NN RExC_state_t *pRExC_state \ - |NULLOK regnode_offset* nodep \ - |NULLOK UV *code_point_p \ - |NULLOK int* cp_count \ - |NN I32 *flagp \ - |const bool strict \ - |const U32 depth -ES |void |reginsert |NN RExC_state_t *pRExC_state \ - |const U8 op \ - |const regnode_offset operand \ - |const U32 depth -ESR |bool |regtail |NN RExC_state_t * pRExC_state \ - |NN const regnode_offset p \ - |NN const regnode_offset val \ - |const U32 depth -ES |SV * |reg_scan_name |NN RExC_state_t *pRExC_state \ +Adp |void |sv_nosharing |NULLOK SV *sv +ADbdp |void |sv_nounlocking |NULLOK SV *sv +: Used in pp.c, pp_hot.c, sv.c +dpx |SV * |sv_2num |NN SV * const sv +Adm |bool |sv_numeq |NULLOK SV *sv1 \ + |NULLOK SV *sv2 +Adp |bool |sv_numeq_flags |NULLOK SV *sv1 \ + |NULLOK SV *sv2 \ + |const U32 flags +Adip |NV |SvNV |NN SV *sv +Adp |NV |sv_2nv_flags |NN SV * const sv \ + |const I32 flags +Adip |NV |SvNV_nomg |NN SV *sv +ETip |bool |sv_only_taint_gmagic \ + |NN SV *sv +Cdp |char * |sv_peek |NULLOK SV *sv +Adp |void |sv_pos_b2u |NULLOK SV * const sv \ + |NN I32 * const offsetp +Adp |STRLEN |sv_pos_b2u_flags \ + |NN SV * const sv \ + |STRLEN const offset \ |U32 flags -ES |U32 |join_exact |NN RExC_state_t *pRExC_state \ - |NN regnode *scan|NN UV *min_subtract \ - |NN bool *unfolded_multi_char \ - |U32 flags|NULLOK regnode *val|U32 depth -EST |U8 |compute_EXACTish|NN RExC_state_t *pRExC_state -ES |void |nextchar |NN RExC_state_t *pRExC_state -ES |void |skip_to_be_ignored_text|NN RExC_state_t *pRExC_state \ - |NN char ** p \ - |const bool force_to_xmod -EiT |char * |reg_skipcomment|NN RExC_state_t *pRExC_state|NN char * p -ES |void |scan_commit |NN const RExC_state_t *pRExC_state \ - |NN struct scan_data_t *data \ - |NN SSize_t *minlenp \ - |int is_inf -ES |void |populate_ANYOF_from_invlist|NN regnode *node|NN SV** invlist_ptr -ES |void |ssc_anything |NN regnode_ssc *ssc -ESRT |int |ssc_is_anything|NN const regnode_ssc *ssc -ES |void |ssc_init |NN const RExC_state_t *pRExC_state \ - |NN regnode_ssc *ssc -ESRT |int |ssc_is_cp_posixl_init|NN const RExC_state_t *pRExC_state \ - |NN const regnode_ssc *ssc -ES |void |ssc_and |NN const RExC_state_t *pRExC_state \ - |NN regnode_ssc *ssc \ - |NN const regnode_charclass *and_with -ES |void |ssc_or |NN const RExC_state_t *pRExC_state \ - |NN regnode_ssc *ssc \ - |NN const regnode_charclass *or_with -ES |SV* |get_ANYOF_cp_list_for_ssc \ - |NN const RExC_state_t *pRExC_state \ - |NN const regnode_charclass* const node -ES |void |ssc_intersection|NN regnode_ssc *ssc \ - |NN SV* const invlist|const bool invert_2nd -ES |void |ssc_union |NN regnode_ssc *ssc \ - |NN SV* const invlist|const bool invert_2nd -ES |void |ssc_add_range |NN regnode_ssc *ssc \ - |UV const start|UV const end -ES |void |ssc_cp_and |NN regnode_ssc *ssc \ - |UV const cp -EST |void |ssc_clear_locale|NN regnode_ssc *ssc -ETS |bool |is_ssc_worth_it|NN const RExC_state_t * pRExC_state \ - |NN const regnode_ssc * ssc -ES |void |ssc_finalize |NN RExC_state_t *pRExC_state \ - |NN regnode_ssc *ssc -ES |SSize_t|study_chunk |NN RExC_state_t *pRExC_state \ - |NN regnode **scanp|NN SSize_t *minlenp \ - |NN SSize_t *deltap|NN regnode *last \ - |NULLOK struct scan_data_t *data \ - |I32 stopparen|U32 recursed_depth \ - |NULLOK regnode_ssc *and_withp \ - |U32 flags|U32 depth|bool was_mutate_ok -ES |void |rck_elide_nothing|NN regnode *node -ESR |SV * |get_ANYOFM_contents|NN const regnode * n -ESRT |U32 |add_data |NN RExC_state_t* const pRExC_state \ - |NN const char* const s|const U32 n -frS |void |re_croak |bool utf8|NN const char* pat|... -ES |int |handle_possible_posix \ - |NN RExC_state_t *pRExC_state \ - |NN const char* const s \ - |NULLOK char ** updated_parse_ptr \ - |NULLOK AV** posix_warnings \ - |const bool check_only -ES |I32 |make_trie |NN RExC_state_t *pRExC_state \ - |NN regnode *startbranch|NN regnode *first \ - |NN regnode *last|NN regnode *tail \ - |U32 word_count|U32 flags|U32 depth -ES |regnode *|construct_ahocorasick_from_trie|NN RExC_state_t *pRExC_state \ - |NN regnode *source|U32 depth -ETSR |int |edit_distance |NN const UV *src \ - |NN const UV *tgt \ - |const STRLEN x \ - |const STRLEN y \ - |const SSize_t maxDistance -# ifdef DEBUGGING -EFp |int |re_indentf |NN const char *fmt|U32 depth|... -ES |void |regdump_intflags|NULLOK const char *lead| const U32 flags -ES |void |regdump_extflags|NULLOK const char *lead| const U32 flags -ES |const regnode*|dumpuntil|NN const regexp *r|NN const regnode *start \ - |NN const regnode *node \ - |NULLOK const regnode *last \ - |NULLOK const regnode *plast \ - |NN SV* sv|I32 indent|U32 depth -ES |void |put_code_point |NN SV* sv|UV c -ES |bool |put_charclass_bitmap_innards|NN SV* sv \ - |NULLOK char* bitmap \ - |NULLOK SV* nonbitmap_invlist \ - |NULLOK SV* only_utf8_locale_invlist\ - |NULLOK const regnode * const node \ - |const U8 flags \ - |const bool force_as_is_display -ES |SV* |put_charclass_bitmap_innards_common \ - |NN SV* invlist \ - |NULLOK SV* posixes \ - |NULLOK SV* only_utf8 \ - |NULLOK SV* not_utf8 \ - |NULLOK SV* only_utf8_locale \ - |const bool invert -ES |void |put_charclass_bitmap_innards_invlist \ - |NN SV *sv \ - |NN SV* invlist -ES |void |put_range |NN SV* sv|UV start|const UV end \ - |const bool allow_literals -ES |void |dump_trie |NN const struct _reg_trie_data *trie\ - |NULLOK HV* widecharmap|NN AV *revcharmap\ - |U32 depth -ES |void |dump_trie_interim_list|NN const struct _reg_trie_data *trie\ - |NULLOK HV* widecharmap|NN AV *revcharmap\ - |U32 next_alloc|U32 depth -ES |void |dump_trie_interim_table|NN const struct _reg_trie_data *trie\ - |NULLOK HV* widecharmap|NN AV *revcharmap\ - |U32 next_alloc|U32 depth -ESR |bool |regtail_study |NN RExC_state_t *pRExC_state \ - |NN regnode_offset p|NN const regnode_offset val|U32 depth -# endif -# ifndef PERL_EXT_RE_BUILD -EiRT |UV* |_invlist_array_init |NN SV* const invlist|const bool will_have_0 -EiRT |UV |invlist_max |NN const SV* const invlist -EiRT |IV* |get_invlist_previous_index_addr|NN SV* invlist -EiT |void |invlist_set_previous_index|NN SV* const invlist|const IV index -EiRT |IV |invlist_previous_index|NN SV* const invlist -EiT |void |invlist_trim |NN SV* invlist -Ei |void |invlist_clear |NN SV* invlist -ES |void |_append_range_to_invlist |NN SV* const invlist|const UV start|const UV end -ES |void |invlist_replace_list_destroys_src|NN SV *dest|NN SV *src -S |void |initialize_invlist_guts|NN SV* invlist|const Size_t initial_size -# endif -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) -EiR |SV* |add_cp_to_invlist |NULLOK SV* invlist|const UV cp -Ei |void |invlist_extend |NN SV* const invlist|const UV len -Ei |void |invlist_set_len|NN SV* const invlist|const UV len|const bool offset -EiRT |UV |invlist_highest|NN SV* const invlist -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_UTF8_C) -m |void |_invlist_intersection |NN SV* const a|NN SV* const b|NN SV** i -EXp |void |_invlist_intersection_maybe_complement_2nd \ - |NULLOK SV* const a|NN SV* const b \ - |const bool complement_b|NN SV** i -Cm |void |_invlist_union |NULLOK SV* const a|NN SV* const b|NN SV** output -EXp |void |_invlist_union_maybe_complement_2nd \ - |NULLOK SV* const a|NN SV* const b \ - |const bool complement_b|NN SV** output -m |void |_invlist_subtract|NN SV* const a|NN SV* const b|NN SV** result -EXp |void |_invlist_invert|NN SV* const invlist -EXpR |SV* |_new_invlist |IV initial_size -EXpR |SV* |_add_range_to_invlist |NULLOK SV* invlist|UV start|UV end -EXpR |SV* |_setup_canned_invlist|const STRLEN size|const UV element0|NN UV** other_elements_ptr -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C) -EpRX |bool |grok_bslash_x |NN char** s \ - |NN const char* const send \ - |NN UV* uv \ - |NN const char** message \ - |NULLOK U32 * packed_warn \ - |const bool strict \ - |const bool allow_UV_MAX \ - |const bool utf8 -EpRX |bool |grok_bslash_c |const char source \ - |NN U8 * result \ - |NN const char** message \ - |NULLOK U32 * packed_warn -EpRX |bool |grok_bslash_o |NN char** s \ - |NN const char* const send \ - |NN UV* uv \ - |NN const char** message \ - |NULLOK U32 * packed_warn \ - |const bool strict \ - |const bool allow_UV_MAX \ - |const bool utf8 -EpRX |const char *|form_alien_digit_msg|const U8 which \ - |const STRLEN valids_len \ - |NN const char * const first_bad\ - |NN const char * const send \ - |const bool UTF \ - |const bool braced -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) -EpRX |const char *|form_cp_too_large_msg|const U8 which \ - |NULLOK const char * string \ - |const Size_t len \ - |const UV cp -#endif -#if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C) || defined(PERL_IN_OP_C) -EXp |void |_invlist_dump |NN PerlIO *file|I32 level \ - |NN const char* const indent \ - |NN SV* const invlist -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C) -EiRT |STRLEN*|get_invlist_iter_addr |NN SV* invlist -EiT |void |invlist_iterinit|NN SV* invlist -EiRT |bool |invlist_iternext|NN SV* invlist|NN UV* start|NN UV* end -EiT |void |invlist_iterfinish|NN SV* invlist -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PERL_C) || defined(PERL_IN_UTF8_C) -EXpR |SV* |_new_invlist_C_array|NN const UV* const list -EXp |bool |_invlistEQ |NN SV* const a|NN SV* const b|const bool complement_b -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C) -EiT |const char *|get_regex_charset_name|const U32 flags|NN STRLEN* const lenp -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) \ - || defined(PERL_IN_PP_C) || defined(PERL_IN_OP_C) \ - || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) \ - || defined(PERL_IN_DOOP_C) -EiRT |UV* |invlist_array |NN SV* const invlist -EiRT |bool |is_invlist |NULLOK const SV* const invlist -EiRT |bool* |get_invlist_offset_addr|NN SV* invlist -EiRT |UV |_invlist_len |NN SV* const invlist -EiRT |bool |_invlist_contains_cp|NN SV* const invlist|const UV cp -EXpRT |SSize_t|_invlist_search |NN SV* const invlist|const UV cp -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) -# ifndef PERL_EXT_RE_BUILD -Ep |SV* |get_regclass_nonbitmap_data \ - |NULLOK const regexp *prog \ - |NN const struct regnode *node \ - |bool doinit \ - |NULLOK SV **listsvp \ - |NULLOK SV **lonly_utf8_locale \ - |NULLOK SV **output_invlist -# else -Ep |SV* |get_re_gclass_nonbitmap_data \ - |NULLOK const regexp *prog \ - |NN const struct regnode *node \ - |bool doinit \ - |NULLOK SV **listsvp \ - |NULLOK SV **lonly_utf8_locale \ - |NULLOK SV **output_invlist -#endif -Ep |void |regprop |NULLOK const regexp *prog|NN SV* sv|NN const regnode* o|NULLOK const regmatch_info *reginfo \ - |NULLOK const RExC_state_t *pRExC_state -Efp |int |re_printf |NN const char *fmt|... -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) -ERp |bool |is_grapheme |NN const U8 * strbeg|NN const U8 * s|NN const U8 *strend|const UV cp -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C) -EXTp |UV |_to_fold_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const unsigned int flags -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_SV_C) -EpX |SV* |invlist_clone |NN SV* const invlist|NULLOK SV* newlist -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) -EXpRT |bool |regcurly |NN const char *s|NN const char *e|NULLOK const char * result[5] -#endif -#if defined(PERL_IN_REGEXEC_C) -ERS |bool |isFOO_utf8_lc |const U8 classnum|NN const U8* character|NN const U8* e -ERTS |U8 * |find_next_masked|NN U8 * s \ - |NN const U8 * send \ - |const U8 byte|const U8 mask -ERTS |U8 *|find_span_end |NN U8* s|NN const U8 * send|const U8 span_byte -ERTS |U8 *|find_span_end_mask|NN U8 * s|NN const U8 * send \ - |const U8 span_byte|const U8 mask -ERS |SSize_t|regmatch |NN regmatch_info *reginfo|NN char *startpos|NN regnode *prog -WERS |I32 |regrepeat |NN regexp *prog|NN char **startposp \ - |NN const regnode *p \ - |NN char *loceol \ - |NN regmatch_info *const reginfo \ - |I32 max -ERS |bool |regtry |NN regmatch_info *reginfo|NN char **startposp -ERS |bool |reginclass |NULLOK regexp * const prog \ - |NN const regnode * const n \ - |NN const U8 * const p \ - |NN const U8 * const p_end \ - |bool const utf8_target -WES |CHECKPOINT|regcppush |NN const regexp *rex|I32 parenfloor\ - |U32 maxopenparen -WES |void |regcppop |NN regexp *rex|NN U32 *maxopenparen_p -WES |void |regcp_restore |NN regexp *rex|I32 ix|NN U32 *maxopenparen_p -ERST |U8* |reghop3 |NN U8 *s|SSize_t off|NN const U8 *lim -ERST |U8* |reghop4 |NN U8 *s|SSize_t off|NN const U8 *llim \ - |NN const U8 *rlim -ERST |U8* |reghopmaybe3 |NN U8 *s|SSize_t off|NN const U8 * const lim -ERS |char* |find_byclass |NN regexp * prog|NN const regnode *c \ - |NN char *s|NN const char *strend \ - |NULLOK regmatch_info *reginfo -ES |void |to_utf8_substr |NN regexp * prog -ES |bool |to_byte_substr |NN regexp * prog -ERST |I32 |reg_check_named_buff_matched |NN const regexp *rex \ - |NN const regnode *scan -ESR |bool |isGCB |const GCB_enum before \ - |const GCB_enum after \ - |NN const U8 * const strbeg \ - |NN const U8 * const curpos \ - |const bool utf8_target -ESR |GCB_enum|backup_one_GCB|NN const U8 * const strbeg \ - |NN U8 ** curpos \ - |const bool utf8_target -ESR |bool |isLB |LB_enum before \ - |LB_enum after \ - |NN const U8 * const strbeg \ - |NN const U8 * const curpos \ - |NN const U8 * const strend \ - |const bool utf8_target -ESR |LB_enum|advance_one_LB |NN U8 ** curpos \ - |NN const U8 * const strend \ - |const bool utf8_target -ESR |LB_enum|backup_one_LB |NN const U8 * const strbeg \ - |NN U8 ** curpos \ - |const bool utf8_target -ESR |bool |isSB |SB_enum before \ - |SB_enum after \ - |NN const U8 * const strbeg \ - |NN const U8 * const curpos \ - |NN const U8 * const strend \ - |const bool utf8_target -ESR |SB_enum|advance_one_SB |NN U8 ** curpos \ - |NN const U8 * const strend \ - |const bool utf8_target -ESR |SB_enum|backup_one_SB |NN const U8 * const strbeg \ - |NN U8 ** curpos \ - |const bool utf8_target -ESR |bool |isWB |WB_enum previous \ - |WB_enum before \ - |WB_enum after \ - |NN const U8 * const strbeg \ - |NN const U8 * const curpos \ - |NN const U8 * const strend \ - |const bool utf8_target -ESR |WB_enum|advance_one_WB |NN U8 ** curpos \ - |NN const U8 * const strend \ - |const bool utf8_target \ - |const bool skip_Extend_Format -ESR |WB_enum|backup_one_WB |NN WB_enum * previous \ - |NN const U8 * const strbeg \ - |NN U8 ** curpos \ - |const bool utf8_target -EiT |I32 |foldEQ_latin1_s2_folded|NN const char* a|NN const char* b|I32 len -# ifdef DEBUGGING -ES |void |dump_exec_pos |NN const char *locinput|NN const regnode *scan|NN const char *loc_regeol\ - |NN const char *loc_bostr|NN const char *loc_reg_starttry|const bool do_utf8|const U32 depth -ES |void |debug_start_match|NN const REGEXP *prog|const bool do_utf8\ - |NN const char *start|NN const char *end\ - |NN const char *blurb - -EFp |int |re_exec_indentf|NN const char *fmt|U32 depth|... -# endif -#endif -#if defined(PERL_IN_REGEXEC_C) -ESR |bool |isFOO_lc |const U8 classnum|const U8 character -#endif - -Cpd |void |taint_env -Cpd |void |taint_proper |NULLOK const char* f|NN const char *const s -EXp |char * |_byte_dump_string \ - |NN const U8 * const start \ - |const STRLEN len \ - |const bool format - -#if defined(PERL_IN_UTF8_C) -iTR |int |does_utf8_overflow|NN const U8 * const s \ - |NN const U8 * e \ - |const bool consider_overlongs -iTR |int |is_utf8_overlong|NN const U8 * const s \ +Adp |void |sv_pos_u2b |NULLOK SV * const sv \ + |NN I32 * const offsetp \ + |NULLOK I32 * const lenp +Adp |STRLEN |sv_pos_u2b_flags \ + |NN SV * const sv \ + |STRLEN uoffset \ + |NULLOK STRLEN * const lenp \ + |U32 flags +AMbdp |char * |sv_2pv |NN SV *sv \ + |NULLOK STRLEN *lp +CMRbdp |char * |sv_pv |NN SV *sv +AMbdp |char * |sv_2pvbyte |NN SV *sv \ + |NULLOK STRLEN * const lp +CMRbdp |char * |sv_pvbyte |NN SV *sv +Adp |char * |sv_2pvbyte_flags \ + |NN SV *sv \ + |NULLOK STRLEN * const lp \ + |const U32 flags +Cdp |char * |sv_pvbyten_force \ + |NN SV * const sv \ + |NULLOK STRLEN * const lp +ip |char * |sv_pvbyten_force_wrapper \ + |NN SV * const sv \ + |NULLOK STRLEN * const lp \ + |const U32 dummy +CMRbdp |char * |sv_2pvbyte_nolen \ + |NN SV *sv +Adp |char * |sv_2pv_flags |NN SV * const sv \ + |NULLOK STRLEN * const lp \ + |const U32 flags +CMbdp |char * |sv_pvn_force |NN SV *sv \ + |NULLOK STRLEN *lp +Adp |char * |sv_pvn_force_flags \ + |NN SV * const sv \ + |NULLOK STRLEN * const lp \ + |const U32 flags +CMRbdp |char * |sv_2pv_nolen |NN SV *sv +AMbdp |char * |sv_2pvutf8 |NN SV *sv \ + |NULLOK STRLEN * const lp +CMRbdp |char * |sv_pvutf8 |NN SV *sv +Adp |char * |sv_2pvutf8_flags \ + |NN SV *sv \ + |NULLOK STRLEN * const lp \ + |const U32 flags +Cdp |char * |sv_pvutf8n_force \ + |NN SV * const sv \ + |NULLOK STRLEN * const lp +ip |char * |sv_pvutf8n_force_wrapper \ + |NN SV * const sv \ + |NULLOK STRLEN * const lp \ + |const U32 dummy +CMRbdp |char * |sv_2pvutf8_nolen \ + |NN SV *sv +AIdp |bool |SvPVXtrue |NN SV *sv +Adp |char * |sv_recode_to_utf8 \ + |NN SV *sv \ + |NN SV *encoding +Adp |SV * |sv_ref |NULLOK SV *dst \ + |NN const SV * const sv \ + |const int ob +AMdip |void |SvREFCNT_dec |NULLOK SV *sv +AMdip |void |SvREFCNT_dec_NN|NN SV *sv +Adip |SV * |SvREFCNT_dec_ret_NULL \ + |NULLOK SV *sv +Adm |void |SvREFCNT_dec_set_NULL \ + |NULLOK SV *sv +AMTdip |SV * |SvREFCNT_inc |NULLOK SV *sv +AMTdip |SV * |SvREFCNT_inc_NN|NN SV *sv +AMTdip |void |SvREFCNT_inc_void \ + |NULLOK SV *sv +ARdp |const char *|sv_reftype|NN const SV * const sv \ + |const int ob +Adp |void |sv_replace |NN SV * const sv \ + |NN SV * const nsv +Adp |void |sv_report_used +Adp |void |sv_reset |NN const char *s \ + |NULLOK HV * const stash +p |void |sv_resetpvn |NULLOK const char *s \ + |STRLEN len \ + |NULLOK HV * const stash +Adp |SV * |sv_rvunweaken |NN SV * const sv +Adp |SV * |sv_rvweaken |NN SV * const sv +Adp |void |sv_set_bool |NN SV *sv \ + |const bool bool_val +Adp |void |sv_set_false |NN SV *sv +Xp |void |sv_sethek |NN SV * const sv \ + |NULLOK const HEK * const hek +Adp |void |sv_setiv |NN SV * const sv \ + |const IV num +Adp |void |sv_setiv_mg |NN SV * const sv \ + |const IV i +Adp |void |sv_setnv |NN SV * const sv \ + |const NV num +Adp |void |sv_setnv_mg |NN SV * const sv \ + |const NV num +Adp |void |sv_setpv |NN SV * const sv \ + |NULLOK const char * const ptr +Adp |char *|sv_setpv_bufsize \ + |NN SV * const sv \ + |const STRLEN cur \ |const STRLEN len -iTR |int |isFF_overlong |NN const U8 * const s|const STRLEN len -SR |char * |unexpected_non_continuation_text \ - |NN const U8 * const s \ - |STRLEN print_len \ - |const STRLEN non_cont_byte_pos \ - |const STRLEN expect_len -#if 0 /* Not currently used, but may be needed in the future */ -S |void |warn_on_first_deprecated_use \ - |NN const char * const name \ - |NN const char * const alternative \ - |const bool use_locale \ - |NN const char * const file \ - |const unsigned line -#endif -S |UV |to_case_cp_list|const UV original \ - |NULLOK const U32 ** const remaining_list \ - |NULLOK Size_t * remaining_count \ - |NN SV *invlist \ - |NN const I32 * const invmap \ - |NULLOK const U32 * const * const aux_tables \ - |NULLOK const U8 * const aux_table_lengths \ - |NN const char * const normal -S |UV |_to_utf8_case |const UV original \ - |NULLOK const U8 *p \ - |NN U8* ustrp \ - |NN STRLEN *lenp \ - |NN SV *invlist \ - |NN const I32 * const invmap \ - |NULLOK const U32 * const * const aux_tables \ - |NULLOK const U8 * const aux_table_lengths \ - |NN const char * const normal -S |UV |turkic_fc |NN const U8 * const p |NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp -S |UV |turkic_lc |NN const U8 * const p0|NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp -S |UV |turkic_uc |NN const U8 * const p |NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp -#endif -Cp |UV |_to_utf8_lower_flags|NN const U8 *p|NULLOK const U8* e \ - |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags -Cp |UV |_to_utf8_upper_flags |NN const U8 *p|NULLOK const U8 *e \ - |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags -Cp |UV |_to_utf8_title_flags |NN const U8 *p|NULLOK const U8* e \ - |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags -Cp |UV |_to_utf8_fold_flags|NN const U8 *p|NULLOK const U8 *e \ - |NN U8* ustrp|NULLOK STRLEN *lenp|U8 flags -#if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C) -pT |bool |translate_substr_offsets|STRLEN curlen|IV pos1_iv \ - |bool pos1_is_uv|IV len_iv \ - |bool len_is_uv|NN STRLEN *posp \ - |NN STRLEN *lenp -#endif -#if defined(UNLINK_ALL_VERSIONS) -Cp |I32 |unlnk |NN const char* f -#endif -AbpdD |SSize_t|unpack_str |NN const char *pat|NN const char *patend|NN const char *s \ - |NULLOK const char *strbeg|NN const char *strend|NULLOK char **new_s \ - |I32 ocnt|U32 flags -Apd |SSize_t|unpackstring |NN const char *pat|NN const char *patend|NN const char *s \ - |NN const char *strend|U32 flags -Cpd |void |unsharepvn |NULLOK const char* sv|I32 len|U32 hash +Adfp |void |sv_setpvf |NN SV * const sv \ + |NN const char * const pat \ + |... +Adfp |void |sv_setpvf_mg |NN SV * const sv \ + |NN const char * const pat \ + |... +Cipx |char *|sv_setpv_freshbuf \ + |NN SV * const sv +Adp |void |sv_setpv_mg |NN SV * const sv \ + |NULLOK const char * const ptr +Adp |void |sv_setpvn |NN SV * const sv \ + |NULLOK const char * const ptr \ + |const STRLEN len +Adp |void |sv_setpvn_fresh|NN SV * const sv \ + |NULLOK const char * const ptr \ + |const STRLEN len +Adp |void |sv_setpvn_mg |NN SV * const sv \ + |NN const char * const ptr \ + |const STRLEN len +Adp |SV * |sv_setref_iv |NN SV * const rv \ + |NULLOK const char * const classname \ + |const IV iv +Adp |SV * |sv_setref_nv |NN SV * const rv \ + |NULLOK const char * const classname \ + |const NV nv +Adp |SV * |sv_setref_pv |NN SV * const rv \ + |NULLOK const char * const classname \ + |NULLOK void * const pv +Adp |SV * |sv_setref_pvn |NN SV * const rv \ + |NULLOK const char * const classname \ + |NN const char * const pv \ + |const STRLEN n +Adp |SV * |sv_setref_uv |NN SV * const rv \ + |NULLOK const char * const classname \ + |const UV uv +Adp |void |sv_setrv_inc |NN SV * const sv \ + |NN SV * const ref +Adp |void |sv_setrv_inc_mg|NN SV * const sv \ + |NN SV * const ref +Adp |void |sv_setrv_noinc |NN SV * const sv \ + |NN SV * const ref +Adp |void |sv_setrv_noinc_mg \ + |NN SV * const sv \ + |NN SV * const ref +AMbdp |void |sv_setsv |NN SV *dsv \ + |NULLOK SV *ssv +Adp |void |sv_setsv_flags |NN SV *dsv \ + |NULLOK SV *ssv \ + |const I32 flags +Adp |void |sv_setsv_mg |NN SV * const dsv \ + |NULLOK SV * const ssv +Adp |void |sv_set_true |NN SV *sv + +Adp |void |sv_set_undef |NN SV *sv +Adp |void |sv_setuv |NN SV * const sv \ + |const UV num +Adp |void |sv_setuv_mg |NN SV * const sv \ + |const UV u +Adm |bool |sv_streq |NULLOK SV *sv1 \ + |NULLOK SV *sv2 +Adp |bool |sv_streq_flags |NULLOK SV *sv1 \ + |NULLOK SV *sv2 \ + |const U32 flags +Adp |SV * |sv_string_from_errnum \ + |int errnum \ + |NULLOK SV *tgtsv +CMbdp |void |sv_taint |NN SV *sv +CRdp |bool |sv_tainted |NN SV * const sv +Adip |bool |SvTRUE |NULLOK SV *sv +Cdp |I32 |sv_true |NULLOK SV * const sv +Cip |bool |SvTRUE_common |NN SV *sv \ + |const bool sv_2bool_is_fallback +Adip |bool |SvTRUE_NN |NN SV *sv +Adip |bool |SvTRUE_nomg |NULLOK SV *sv +ARdp |char * |sv_uni_display |NN SV *dsv \ + |NN SV *ssv \ + |STRLEN pvlim \ + |UV flags +Adp |int |sv_unmagic |NN SV * const sv \ + |const int type +Adp |int |sv_unmagicext |NN SV * const sv \ + |const int type \ + |NULLOK const MGVTBL *vtbl +AMbdp |void |sv_unref |NN SV *sv +Adp |void |sv_unref_flags |NN SV * const ref \ + |const U32 flags +Cdp |void |sv_untaint |NN SV * const sv +Adp |void |sv_upgrade |NN SV * const sv \ + |svtype new_type +AMbdp |void |sv_usepvn |NN SV *sv \ + |NULLOK char *ptr \ + |STRLEN len +Adp |void |sv_usepvn_flags|NN SV * const sv \ + |NULLOK char *ptr \ + |const STRLEN len \ + |const U32 flags +AMbdp |void |sv_usepvn_mg |NN SV *sv \ + |NULLOK char *ptr \ + |STRLEN len +Adp |bool |sv_utf8_decode |NN SV * const sv +AMbdp |bool |sv_utf8_downgrade \ + |NN SV * const sv \ + |const bool fail_ok +Adp |bool |sv_utf8_downgrade_flags \ + |NN SV * const sv \ + |const bool fail_ok \ + |const U32 flags +Adm |bool |sv_utf8_downgrade_nomg \ + |NN SV * const sv \ + |const bool fail_ok +Adp |void |sv_utf8_encode |NN SV * const sv +AMbdp |STRLEN |sv_utf8_upgrade|NN SV *sv +Adm |STRLEN |sv_utf8_upgrade_flags \ + |NN SV * const sv \ + |const I32 flags +Adp |STRLEN |sv_utf8_upgrade_flags_grow \ + |NN SV * const sv \ + |const I32 flags \ + |STRLEN extra +Adm |STRLEN |sv_utf8_upgrade_nomg \ + |NN SV *sv +Adip |UV |SvUV |NN SV *sv +CMbp |UV |sv_2uv |NN SV *sv +Adp |UV |sv_2uv_flags |NN SV * const sv \ + |const I32 flags +Adip |UV |SvUV_nomg |NN SV *sv +Adp |void |sv_vcatpvf |NN SV * const sv \ + |NN const char * const pat \ + |NULLOK va_list * const args +Adp |void |sv_vcatpvf_mg |NN SV * const sv \ + |NN const char * const pat \ + |NULLOK va_list * const args +Adp |void |sv_vcatpvfn |NN SV * const sv \ + |NN const char * const pat \ + |const STRLEN patlen \ + |NULLOK va_list * const args \ + |NULLOK SV ** const svargs \ + |const Size_t sv_count \ + |NULLOK bool * const maybe_tainted +Adp |void |sv_vcatpvfn_flags \ + |NN SV * const sv \ + |NN const char * const pat \ + |const STRLEN patlen \ + |NULLOK va_list * const args \ + |NULLOK SV ** const svargs \ + |const Size_t sv_count \ + |NULLOK bool * const maybe_tainted \ + |const U32 flags +Adp |void |sv_vsetpvf |NN SV * const sv \ + |NN const char * const pat \ + |NULLOK va_list * const args +Adp |void |sv_vsetpvf_mg |NN SV * const sv \ + |NN const char * const pat \ + |NULLOK va_list * const args +Adp |void |sv_vsetpvfn |NN SV * const sv \ + |NN const char * const pat \ + |const STRLEN patlen \ + |NULLOK va_list * const args \ + |NULLOK SV ** const svargs \ + |const Size_t sv_count \ + |NULLOK bool * const maybe_tainted +Adp |void |switch_to_global_locale +Adp |bool |sync_locale +CTop |void |sys_init |NN int *argc \ + |NN char ***argv +CTop |void |sys_init3 |NN int *argc \ + |NN char ***argv \ + |NN char ***env +CTop |void |sys_term + +Cdp |void |taint_env +Cdp |void |taint_proper |NULLOK const char *f \ + |NN const char * const s +Apx |void |thread_locale_init +Apx |void |thread_locale_term + +Fp |OP * |tied_method |NN SV *methname \ + |NN SV **sp \ + |NN SV * const sv \ + |NN const MAGIC * const mg \ + |const U32 flags \ + |U32 argc \ + |... +Xp |SSize_t|tmps_grow_p |SSize_t ix +Xiop |I32 |TOPMARK +Cm |UV |to_uni_fold |UV c \ + |NN U8 *p \ + |NN STRLEN *lenp +Cp |UV |_to_uni_fold_flags \ + |UV c \ + |NN U8 *p \ + |NN STRLEN *lenp \ + |U8 flags +Cp |UV |to_uni_lower |UV c \ + |NN U8 *p \ + |NN STRLEN *lenp +Cp |UV |to_uni_title |UV c \ + |NN U8 *p \ + |NN STRLEN *lenp +Cp |UV |to_uni_upper |UV c \ + |NN U8 *p \ + |NN STRLEN *lenp +Cp |UV |_to_utf8_fold_flags \ + |NN const U8 *p \ + |NULLOK const U8 *e \ + |NN U8 *ustrp \ + |NULLOK STRLEN *lenp \ + |U8 flags + +Cp |UV |_to_utf8_lower_flags \ + |NN const U8 *p \ + |NULLOK const U8 *e \ + |NN U8 *ustrp \ + |NULLOK STRLEN *lenp \ + |bool flags +Cp |UV |_to_utf8_title_flags \ + |NN const U8 *p \ + |NULLOK const U8 *e \ + |NN U8 *ustrp \ + |NULLOK STRLEN *lenp \ + |bool flags +Cp |UV |_to_utf8_upper_flags \ + |NN const U8 *p \ + |NULLOK const U8 *e \ + |NN U8 *ustrp \ + |NULLOK STRLEN *lenp \ + |bool flags + +EXop |bool |try_amagic_bin |int method \ + |int flags +EXop |bool |try_amagic_un |int method \ + |int flags +Adp |SSize_t|unpackstring |NN const char *pat \ + |NN const char *patend \ + |NN const char *s \ + |NN const char *strend \ + |U32 flags : Used in gv.c, hv.c -p |void |unshare_hek |NULLOK HEK* hek +Cp |void |unshare_hek |NULLOK HEK *hek +Cdp |void |unsharepvn |NULLOK const char *sv \ + |I32 len \ + |U32 hash +Adp |SV * |upg_version |NN SV *ver \ + |bool qv +ARdip |IV |utf8_distance |NN const U8 *a \ + |NN const U8 *b +ARTdip |U8 * |utf8_hop |NN const U8 *s \ + |SSize_t off +ARTdip |U8 * |utf8_hop_back |NN const U8 *s \ + |SSize_t off \ + |NN const U8 *start +ARTdip |U8 * |utf8_hop_forward \ + |NN const U8 *s \ + |SSize_t off \ + |NN const U8 *end +ARTdip |U8 * |utf8_hop_safe |NN const U8 *s \ + |SSize_t off \ + |NN const U8 *start \ + |NN const U8 *end +ARdp |STRLEN |utf8_length |NN const U8 *s0 \ + |NN const U8 *e + +AMTdp |UV |utf8n_to_uvchr |NN const U8 *s \ + |STRLEN curlen \ + |NULLOK STRLEN *retlen \ + |const U32 flags +AMTdp |UV |utf8n_to_uvchr_error \ + |NN const U8 *s \ + |STRLEN curlen \ + |NULLOK STRLEN *retlen \ + |const U32 flags \ + |NULLOK U32 *errors +ATdip |UV |utf8n_to_uvchr_msgs \ + |NN const U8 *s \ + |STRLEN curlen \ + |NULLOK STRLEN *retlen \ + |const U32 flags \ + |NULLOK U32 *errors \ + |NULLOK AV **msgs +CTp |UV |_utf8n_to_uvchr_msgs_helper \ + |NN const U8 *s \ + |STRLEN curlen \ + |NULLOK STRLEN *retlen \ + |const U32 flags \ + |NULLOK U32 *errors \ + |NULLOK AV **msgs +CDbdp |UV |utf8n_to_uvuni |NN const U8 *s \ + |STRLEN curlen \ + |NULLOK STRLEN *retlen \ + |U32 flags +Adpx |U8 * |utf8_to_bytes |NN U8 *s \ + |NN STRLEN *lenp +EMXp |U8 * |utf16_to_utf8 |NN U8 *p \ + |NN U8 *d \ + |Size_t bytelen \ + |NN Size_t *newlen +EXp |U8 * |utf16_to_utf8_base \ + |NN U8 *p \ + |NN U8 *d \ + |Size_t bytelen \ + |NN Size_t *newlen \ + |const bool high \ + |const bool low +EXpx |U8 * |utf8_to_utf16_base \ + |NN U8 *s \ + |NN U8 *d \ + |Size_t bytelen \ + |NN Size_t *newlen \ + |const bool high \ + |const bool low +EMXp |U8 * |utf16_to_utf8_reversed \ + |NN U8 *p \ + |NN U8 *d \ + |Size_t bytelen \ + |NN Size_t *newlen +ADbdp |UV |utf8_to_uvchr |NN const U8 *s \ + |NULLOK STRLEN *retlen +AMdp |UV |utf8_to_uvchr_buf \ + |NN const U8 *s \ + |NN const U8 *send \ + |NULLOK STRLEN *retlen +Cip |UV |utf8_to_uvchr_buf_helper \ + |NN const U8 *s \ + |NN const U8 *send \ + |NULLOK STRLEN *retlen +CDbdp |UV |utf8_to_uvuni |NN const U8 *s \ + |NULLOK STRLEN *retlen : Used in perly.y -p |void |utilize |int aver|I32 floor|NULLOK OP* version|NN OP* idop|NULLOK OP* arg -Cp |void |_force_out_malformed_utf8_message \ - |NN const U8 *const p|NN const U8 * const e|const U32 flags \ - |const bool die_here -EXp |U8* |utf16_to_utf8_base|NN U8* p|NN U8 *d|Size_t bytelen|NN Size_t *newlen \ - |const bool high|const bool low -EMXp |U8* |utf16_to_utf8 |NN U8* p|NN U8 *d|Size_t bytelen|NN Size_t *newlen -EMXp |U8* |utf16_to_utf8_reversed|NN U8* p|NN U8 *d|Size_t bytelen|NN Size_t *newlen -EXpx |U8* |utf8_to_utf16_base|NN U8* s|NN U8 *d|Size_t bytelen|NN Size_t *newlen \ - |const bool high|const bool low -AdpR |STRLEN |utf8_length |NN const U8* s|NN const U8 *e -AipdR |IV |utf8_distance |NN const U8 *a|NN const U8 *b -AipdRT |U8* |utf8_hop |NN const U8 *s|SSize_t off -AipdRT |U8* |utf8_hop_back|NN const U8 *s|SSize_t off|NN const U8 *start -AipdRT |U8* |utf8_hop_forward|NN const U8 *s|SSize_t off|NN const U8 *end -AipdRT |U8* |utf8_hop_safe |NN const U8 *s|SSize_t off|NN const U8 *start|NN const U8 *end -Apxd |U8* |utf8_to_bytes |NN U8 *s|NN STRLEN *lenp -Apd |int |bytes_cmp_utf8 |NN const U8 *b|STRLEN blen|NN const U8 *u \ - |STRLEN ulen -AMxdp |U8* |bytes_from_utf8|NN const U8 *s|NN STRLEN *lenp|NN bool *is_utf8p -CxTdp |U8* |bytes_from_utf8_loc|NN const U8 *s \ - |NN STRLEN *lenp \ - |NN bool *is_utf8p \ - |NULLOK const U8 ** first_unconverted -Apxd |U8* |bytes_to_utf8 |NN const U8 *s|NN STRLEN *lenp -ApdDb |UV |utf8_to_uvchr |NN const U8 *s|NULLOK STRLEN *retlen -CbpdD |UV |utf8_to_uvuni |NN const U8 *s|NULLOK STRLEN *retlen -CbpD |UV |valid_utf8_to_uvuni |NN const U8 *s|NULLOK STRLEN *retlen -AMpd |UV |utf8_to_uvchr_buf |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen -Cip |UV |utf8_to_uvchr_buf_helper|NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen -CpdD |UV |utf8_to_uvuni_buf |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen -p |bool |check_utf8_print |NN const U8 *s|const STRLEN len - -AdMTp |UV |utf8n_to_uvchr |NN const U8 *s \ - |STRLEN curlen \ - |NULLOK STRLEN *retlen \ - |const U32 flags -AdMTp |UV |utf8n_to_uvchr_error|NN const U8 *s \ - |STRLEN curlen \ - |NULLOK STRLEN *retlen \ - |const U32 flags \ - |NULLOK U32 * errors -ATdip |UV |utf8n_to_uvchr_msgs|NN const U8 *s \ - |STRLEN curlen \ - |NULLOK STRLEN *retlen \ - |const U32 flags \ - |NULLOK U32 * errors \ - |NULLOK AV ** msgs -CTp |UV |_utf8n_to_uvchr_msgs_helper \ - |NN const U8 *s \ - |STRLEN curlen \ - |NULLOK STRLEN *retlen \ - |const U32 flags \ - |NULLOK U32 * errors \ - |NULLOK AV ** msgs -CipTRd |UV |valid_utf8_to_uvchr |NN const U8 *s|NULLOK STRLEN *retlen -CdbDp |UV |utf8n_to_uvuni|NN const U8 *s|STRLEN curlen|NULLOK STRLEN *retlen|U32 flags - -Adm |U8* |uvchr_to_utf8 |NN U8 *d|UV uv -Cp |U8* |uvuni_to_utf8 |NN U8 *d|UV uv -Adm |U8* |uvchr_to_utf8_flags |NN U8 *d|UV uv|UV flags -Adm |U8* |uvchr_to_utf8_flags_msgs|NN U8 *d|UV uv|UV flags|NULLOK HV ** msgs -CMpd |U8* |uvoffuni_to_utf8_flags |NN U8 *d|UV uv|UV flags -Cp |U8* |uvoffuni_to_utf8_flags_msgs|NN U8 *d|UV input_uv|const UV flags|NULLOK HV** msgs -CdpbD |U8* |uvuni_to_utf8_flags |NN U8 *d|UV uv|UV flags -Apd |char* |pv_uni_display |NN SV *dsv|NN const U8 *spv|STRLEN len|STRLEN pvlim|UV flags -ApdR |char* |sv_uni_display |NN SV *dsv|NN SV *ssv|STRLEN pvlim|UV flags -EXpR |Size_t |_inverse_folds |const UV cp \ - |NN U32 * first_folds_to \ - |NN const U32 ** remaining_folds_to +p |void |utilize |int aver \ + |I32 floor \ + |NULLOK OP *version \ + |NN OP *idop \ + |NULLOK OP *arg + +Adm |U8 * |uvchr_to_utf8 |NN U8 *d \ + |UV uv +Adm |U8 * |uvchr_to_utf8_flags \ + |NN U8 *d \ + |UV uv \ + |UV flags +Adm |U8 * |uvchr_to_utf8_flags_msgs \ + |NN U8 *d \ + |UV uv \ + |UV flags \ + |NULLOK HV **msgs +CMdp |U8 * |uvoffuni_to_utf8_flags \ + |NN U8 *d \ + |UV uv \ + |UV flags +Cp |U8 * |uvoffuni_to_utf8_flags_msgs \ + |NN U8 *d \ + |UV input_uv \ + |const UV flags \ + |NULLOK HV **msgs +Cp |U8 * |uvuni_to_utf8 |NN U8 *d \ + |UV uv +EXdpx |bool |validate_proto |NN SV *name \ + |NULLOK SV *proto \ + |bool warn \ + |bool curstash +CRTdip |UV |valid_utf8_to_uvchr \ + |NN const U8 *s \ + |NULLOK STRLEN *retlen +Adp |int |vcmp |NN SV *lhv \ + |NN SV *rhv +Adpr |void |vcroak |NULLOK const char *pat \ + |NULLOK va_list *args +Adp |void |vdeb |NN const char *pat \ + |NULLOK va_list *args +Adp |char * |vform |NN const char *pat \ + |NULLOK va_list *args : Used by Data::Alias -EXp |void |vivify_defelem |NN SV* sv +EXp |void |vivify_defelem |NN SV *sv : Used in pp.c -pR |SV* |vivify_ref |NN SV* sv|U32 to_what +Rp |SV * |vivify_ref |NN SV *sv \ + |U32 to_what +Adp |void |vload_module |U32 flags \ + |NN SV *name \ + |NULLOK SV *ver \ + |NULLOK va_list *args +Adp |SV * |vmess |NN const char *pat \ + |NULLOK va_list *args +ARdp |SV * |vnewSVpvf |NN const char * const pat \ + |NULLOK va_list * const args +Adp |SV * |vnormal |NN SV *vs +Adp |SV * |vnumify |NN SV *vs +Adp |SV * |vstringify |NN SV *vs +Adp |SV * |vverify |NN SV *vs +Adp |void |vwarn |NN const char *pat \ + |NULLOK va_list *args +Adp |void |vwarner |U32 err \ + |NN const char *pat \ + |NULLOK va_list *args : Used in pp_sys.c -p |I32 |wait4pid |Pid_t pid|NN int* statusp|int flags -: Used in locale.c and perl.c -p |U32 |parse_unicode_opts|NN const char **popt -Cp |U32 |seed -XpTo |double |drand48_r |NN perl_drand48_t *random_state -XpTo |void |drand48_init_r |NN perl_drand48_t *random_state|U32 seed -: Only used in perl.c -p |void |get_hash_seed |NN unsigned char * const seed_buffer -p |void |debug_hash_seed|bool via_debug_h -: Used in doio.c, pp_hot.c, pp_sys.c -p |void |report_evil_fh |NULLOK const GV *gv -: Used in doio.c, pp_hot.c, pp_sys.c -p |void |report_wrongway_fh|NULLOK const GV *gv|const char have -: Used in mg.c, pp.c, pp_hot.c, regcomp.c -XEpd |void |report_uninit |NULLOK const SV *uninit_sv -#if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C) -p |void |report_redefined_cv|NN const SV *name \ - |NN const CV *old_cv \ - |NULLOK SV * const *new_const_svp -#endif -Apd |void |warn_sv |NN SV *baseex -Afpd |void |warn |NN const char* pat|... -Apd |void |vwarn |NN const char* pat|NULLOK va_list* args -Adfp |void |warner |U32 err|NN const char* pat|... -Adfp |void |ck_warner |U32 err|NN const char* pat|... -Adfp |void |ck_warner_d |U32 err|NN const char* pat|... -Adp |void |vwarner |U32 err|NN const char* pat|NULLOK va_list* args -#ifdef USE_C_BACKTRACE -pd |Perl_c_backtrace*|get_c_backtrace|int max_depth|int skip -dm |void |free_c_backtrace|NN Perl_c_backtrace* bt -Apd |SV* |get_c_backtrace_dump|int max_depth|int skip -Apd |bool |dump_c_backtrace|NN PerlIO* fp|int max_depth|int skip -#endif +p |I32 |wait4pid |Pid_t pid \ + |NN int *statusp \ + |int flags +Adfp |void |warn |NN const char *pat \ + |... +Adfp |void |warner |U32 err \ + |NN const char *pat \ + |... +TXp |void |_warn_problematic_locale +Adp |void |warn_sv |NN SV *baseex +: Used in cop.h +RXop |I32 |was_lvalue_sub : FIXME -p |void |watch |NN char** addr -Amd |I32 |whichsig |NN const char* sig -Apd |I32 |whichsig_sv |NN SV* sigsv -Apd |I32 |whichsig_pv |NN const char* sig -Apd |I32 |whichsig_pvn |NN const char* sig|STRLEN len -: used to check for NULs in pathnames and other names -AiRdp |bool |is_safe_syscall|NN const char *pv|STRLEN len|NN const char *what|NN const char *op_name -#ifdef PERL_CORE -iTR |bool |should_warn_nl|NN const char *pv -#endif +p |void |watch |NN char **addr +Adm |I32 |whichsig |NN const char *sig +Adp |I32 |whichsig_pv |NN const char *sig +Adp |I32 |whichsig_pvn |NN const char *sig \ + |STRLEN len +Adp |I32 |whichsig_sv |NN SV *sigsv +Adpx |void |wrap_infix_plugin \ + |NN Perl_infix_plugin_t new_plugin \ + |NN Perl_infix_plugin_t *old_plugin_p +Adpx |void |wrap_keyword_plugin \ + |NN Perl_keyword_plugin_t new_plugin \ + |NN Perl_keyword_plugin_t *old_plugin_p +Adp |void |wrap_op_checker|Optype opcode \ + |NN Perl_check_t new_checker \ + |NN Perl_check_t *old_checker_p : Used in pp_ctl.c -p |void |write_to_stderr|NN SV* msv +p |void |write_to_stderr|NN SV *msv +Xp |void |xs_boot_epilog |const I32 ax + +FTXop |I32 |xs_handshake |const U32 key \ + |NN void *v_my_perl \ + |NN const char *file \ + |... : Used in op.c -p |int |yyerror |NN const char *const s -p |void |yyquit -pr |void |abort_execution|NN const char * const msg|NN const char * const name -p |int |yyerror_pv |NN const char *const s|U32 flags -p |int |yyerror_pvn |NULLOK const char *const s|STRLEN len|U32 flags +p |int |yyerror |NN const char * const s +p |int |yyerror_pv |NN const char * const s \ + |U32 flags +p |int |yyerror_pvn |NULLOK const char * const s \ + |STRLEN len \ + |U32 flags : Used in perly.y, and by Data::Alias EXp |int |yylex -p |void |yyunlex : Used in perl.c, pp_ctl.c p |int |yyparse |int gramtype -: Only used in scope.c -p |void |parser_free |NN const yy_parser *parser -#ifdef PERL_CORE -p |void |parser_free_nexttoke_ops|NN yy_parser *parser \ - |NN OPSLAB *slab +p |void |yyquit +p |void |yyunlex +#if defined(DEBUGGING) +: Used in mg.c +Rp |int |get_debug_opts |NN const char **s \ + |bool givehelp +Adop |void |hv_assert |NN HV *hv +Cdp |void |pad_setsv |PADOFFSET po \ + |NN SV *sv +Cdp |SV * |pad_sv |PADOFFSET po +TXp |void |set_padlist |NN CV *cv \ + |NULLOK PADLIST *padlist #endif -#if defined(PERL_IN_TOKE_C) -S |int |yywarn |NN const char *const s|U32 flags +#if defined(DEBUG_LEAKING_SCALARS_FORK_DUMP) +: Used in sv.c +p |void |dump_sv_child |NN SV *sv #endif -#if defined(MYMALLOC) -Apd |void |dump_mstats |NN const char* s -Cp |int |get_mstats |NN perl_mstats_t *buf|int buflen|int level +#if !defined(EBCDIC) +CRTip |unsigned int|variant_byte_number \ + |PERL_UINTMAX_T word +#endif +#if defined(F_FREESP) && !defined(HAS_CHSIZE) && !defined(HAS_TRUNCATE) +ARdp |I32 |my_chsize |int fd \ + |Off_t length +#endif +#if !defined(HAS_GETENV_LEN) +: Used in hv.c +p |char * |getenv_len |NN const char *env_elem \ + |NN unsigned long *len +#endif +#if !defined(HAS_MKOSTEMP) +Tdop |int |my_mkostemp |NN char *templte \ + |int flags +#endif +#if !defined(HAS_MKSTEMP) +Tdop |int |my_mkstemp |NN char *templte +#endif +#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) +: Defined in doio.c, used only in pp_sys.c +p |I32 |do_ipcctl |I32 optype \ + |NN SV **mark \ + |NN SV **sp +: Defined in doio.c, used only in pp_sys.c +p |I32 |do_ipcget |I32 optype \ + |NN SV **mark \ + |NN SV **sp +: Defined in doio.c, used only in pp_sys.c +p |I32 |do_msgrcv |NN SV **mark \ + |NN SV **sp +: Defined in doio.c, used only in pp_sys.c +p |I32 |do_msgsnd |NN SV **mark \ + |NN SV **sp +: Defined in doio.c, used only in pp_sys.c +p |I32 |do_semop |NN SV **mark \ + |NN SV **sp +: Defined in doio.c, used only in pp_sys.c +p |I32 |do_shmio |I32 optype \ + |NN SV **mark \ + |NN SV **sp +#endif /* defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) */ +#if defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H) +ATdo |const char *|Perl_langinfo \ + |const nl_item item +ATdo |const char *|Perl_langinfo8 \ + |const nl_item item \ + |NULLOK utf8ness_t *utf8ness +#else +ATdo |const char *|Perl_langinfo \ + |const int item +ATdo |const char *|Perl_langinfo8 \ + |const int item \ + |NULLOK utf8ness_t *utf8ness +#endif +#if defined(HAS_PIPE) +Rp |int |PerlProc_pipe_cloexec \ + |NN int *pipefd +#endif +#if !defined(HAS_RENAME) +: Used in pp_sys.c +p |I32 |same_dirent |NN const char *a \ + |NN const char *b +#endif +#if !defined(HAS_SIGNBIT) +APTdox |int |Perl_signbit |NV f +#endif +#if defined(HAS_SOCKET) +Rp |int |PerlSock_accept_cloexec \ + |int listenfd \ + |NULLOK struct sockaddr *addr \ + |NULLOK Sock_size_t *addrlen +Rp |int |PerlSock_socket_cloexec \ + |int domain \ + |int type \ + |int protocol +#endif +#if defined(HAS_SOCKETPAIR) || \ + ( defined(AF_INET) && defined(HAS_SOCKET) && defined(PF_INET) && \ + defined(SOCK_DGRAM) ) +Rp |int |PerlSock_socketpair_cloexec \ + |int domain \ + |int type \ + |int protocol \ + |NN int *pairfd +#endif +#if !defined(HAS_STRLCAT) +ATdip |Size_t |my_strlcat |NULLOK char *dst \ + |NULLOK const char *src \ + |Size_t size +#endif +#if !defined(HAS_STRLCPY) +ATds |Size_t |my_strlcpy |NULLOK char *dst \ + |NULLOK const char *src \ + |Size_t size +#endif +#if !defined(HAS_STRNLEN) +ATdip |Size_t |my_strnlen |NN const char *str \ + |Size_t maxlen #endif -ATdpa |Malloc_t|safesysmalloc |MEM_SIZE nbytes -ATdpa |Malloc_t|safesyscalloc |MEM_SIZE elements|MEM_SIZE size -ATdpR |Malloc_t|safesysrealloc|Malloc_t where|MEM_SIZE nbytes -AdTp |Free_t |safesysfree |Malloc_t where -CrTp |void |croak_memory_wrap -Cpdh |int |runops_standard -Cpdh |int |runops_debug -Afpd |void |sv_catpvf_mg |NN SV *const sv|NN const char *const pat|... -Apd |void |sv_vcatpvf_mg |NN SV *const sv|NN const char *const pat \ - |NULLOK va_list *const args -Apd |void |sv_catpv_mg |NN SV *const dsv|NULLOK const char *const sstr -ApdbM |void |sv_catpvn_mg |NN SV *dsv|NN const char *sstr|STRLEN len -ApdbM |void |sv_catsv_mg |NN SV *dsv|NULLOK SV *sstr -Afpd |void |sv_setpvf_mg |NN SV *const sv|NN const char *const pat|... -Apd |void |sv_vsetpvf_mg |NN SV *const sv|NN const char *const pat \ - |NULLOK va_list *const args -Apd |void |sv_setiv_mg |NN SV *const sv|const IV i -ApdbD |void |sv_setpviv_mg |NN SV *const sv|const IV iv -Apd |void |sv_setuv_mg |NN SV *const sv|const UV u -Apd |void |sv_setnv_mg |NN SV *const sv|const NV num -Apd |void |sv_setpv_mg |NN SV *const sv|NULLOK const char *const ptr -Apd |void |sv_setpvn_mg |NN SV *const sv|NN const char *const ptr|const STRLEN len -Apd |void |sv_setsv_mg |NN SV *const dsv|NULLOK SV *const ssv -ApdbM |void |sv_usepvn_mg |NN SV *sv|NULLOK char *ptr|STRLEN len -CpRx |MGVTBL*|get_vtbl |int vtbl_id -Apd |char* |pv_display |NN SV *dsv|NN const char *pv|STRLEN cur|STRLEN len \ - |STRLEN pvlim -Apd |char* |pv_escape |NULLOK SV *dsv|NN char const * const str\ - |const STRLEN count|const STRLEN max\ - |NULLOK STRLEN * const escaped\ - |const U32 flags -Apd |char* |pv_pretty |NN SV *dsv|NN char const * const str\ - |const STRLEN count|const STRLEN max\ - |NULLOK char const * const start_color\ - |NULLOK char const * const end_color\ - |const U32 flags -Cfp |void |dump_indent |I32 level|NN PerlIO *file|NN const char* pat|... -Cp |void |dump_vindent |I32 level|NN PerlIO *file|NN const char* pat \ - |NULLOK va_list *args -Cp |void |do_gv_dump |I32 level|NN PerlIO *file|NN const char *name\ - |NULLOK GV *sv -Cp |void |do_gvgv_dump |I32 level|NN PerlIO *file|NN const char *name\ - |NULLOK GV *sv -Cp |void |do_hv_dump |I32 level|NN PerlIO *file|NN const char *name\ - |NULLOK HV *sv -Cp |void |do_magic_dump |I32 level|NN PerlIO *file|NULLOK const MAGIC *mg|I32 nest \ - |I32 maxnest|bool dumpops|STRLEN pvlim -Cp |void |do_op_dump |I32 level|NN PerlIO *file|NULLOK const OP *o -Cp |void |do_pmop_dump |I32 level|NN PerlIO *file|NULLOK const PMOP *pm -Cp |void |do_sv_dump |I32 level|NN PerlIO *file|NULLOK SV *sv|I32 nest \ - |I32 maxnest|bool dumpops|STRLEN pvlim -Apd |void |magic_dump |NULLOK const MAGIC *mg -Cp |void |reginitcolors -CpdRMb |char* |sv_2pv_nolen |NN SV* sv -CpdRMb |char* |sv_2pvutf8_nolen|NN SV* sv -CpdRMb |char* |sv_2pvbyte_nolen|NN SV* sv -CpMdbR |char* |sv_pv |NN SV *sv -CpMdbR |char* |sv_pvutf8 |NN SV *sv -CpMdbR |char* |sv_pvbyte |NN SV *sv -ApMdb |STRLEN |sv_utf8_upgrade|NN SV *sv -Amd |STRLEN |sv_utf8_upgrade_nomg|NN SV *sv -ApdMb |bool |sv_utf8_downgrade|NN SV *const sv|const bool fail_ok -Amd |bool |sv_utf8_downgrade_nomg|NN SV *const sv|const bool fail_ok -Apd |bool |sv_utf8_downgrade_flags|NN SV *const sv|const bool fail_ok|const U32 flags -Apd |void |sv_utf8_encode |NN SV *const sv -Apd |bool |sv_utf8_decode |NN SV *const sv -ApdMb |void |sv_force_normal|NN SV *sv -Apd |void |sv_force_normal_flags|NN SV *const sv|const U32 flags -pX |SSize_t|tmps_grow_p |SSize_t ix -Apd |SV* |sv_rvweaken |NN SV *const sv -Apd |SV* |sv_rvunweaken |NN SV *const sv -ATpxd |SV* |sv_get_backrefs|NN SV *const sv -AiTMdp |SV * |SvREFCNT_inc |NULLOK SV *sv -AiTMdp |SV * |SvREFCNT_inc_NN|NN SV *sv -AiTMdp |void |SvREFCNT_inc_void|NULLOK SV *sv -AiMdp |void |SvREFCNT_dec |NULLOK SV *sv -AiMdp |void |SvREFCNT_dec_NN|NN SV *sv -AiTpd |void |SvAMAGIC_on |NN SV *sv -AiTpd |void |SvAMAGIC_off |NN SV *sv -Aipd |bool |SvTRUE |NULLOK SV *sv -Aipd |bool |SvTRUE_nomg |NULLOK SV *sv -Aipd |bool |SvTRUE_NN |NN SV *sv -Cip |bool |SvTRUE_common |NN SV *sv|const bool sv_2bool_is_fallback -: This is indirectly referenced by globals.c. This is somewhat annoying. -p |int |magic_killbackrefs|NN SV *sv|NN MAGIC *mg -Ap |OP* |newANONATTRSUB |I32 floor|NULLOK OP *proto|NULLOK OP *attrs|NULLOK OP *block -Adm |CV* |newATTRSUB |I32 floor|NULLOK OP *o|NULLOK OP *proto|NULLOK OP *attrs|NULLOK OP *block -pdX |CV* |newATTRSUB_x |I32 floor|NULLOK OP *o|NULLOK OP *proto \ - |NULLOK OP *attrs|NULLOK OP *block \ - |bool o_is_gv -Cp |CV * |newMYSUB |I32 floor|NN OP *o|NULLOK OP *proto \ - |NULLOK OP *attrs|NULLOK OP *block -p |CV* |newSTUB |NN GV *gv|bool fake -: Used in perly.y -p |OP * |my_attrs |NN OP *o|NULLOK OP *attrs -#if defined(USE_ITHREADS) -CpR |PERL_CONTEXT*|cx_dup |NULLOK PERL_CONTEXT* cx|I32 ix|I32 max|NN CLONE_PARAMS* param -CpdR |PERL_SI*|si_dup |NULLOK PERL_SI* si|NN CLONE_PARAMS* param -CpdR |ANY* |ss_dup |NN PerlInterpreter* proto_perl|NN CLONE_PARAMS* param -CpR |void* |any_dup |NULLOK void* v|NN const PerlInterpreter* proto_perl -CpR |HE* |he_dup |NULLOK const HE* e|bool shared|NN CLONE_PARAMS* param -CpR |HEK* |hek_dup |NULLOK HEK* e|NN CLONE_PARAMS* param -Adp |void |re_dup_guts |NN const REGEXP *sstr|NN REGEXP *dstr \ - |NN CLONE_PARAMS* param -Cpd |PerlIO*|fp_dup |NULLOK PerlIO *const fp|const char type|NN CLONE_PARAMS *const param -CpdR |DIR* |dirp_dup |NULLOK DIR *const dp|NN CLONE_PARAMS *const param -CpdR |GP* |gp_dup |NULLOK GP *const gp|NN CLONE_PARAMS *const param -CpdR |MAGIC* |mg_dup |NULLOK MAGIC *mg|NN CLONE_PARAMS *const param -#if defined(PERL_IN_SV_C) -S |SV ** |sv_dup_inc_multiple|NN SV *const *source|NN SV **dest \ - |SSize_t items|NN CLONE_PARAMS *const param -SR |SV* |sv_dup_common |NN const SV *const ssv \ - |NN CLONE_PARAMS *const param -#endif -ApR |SV* |sv_dup |NULLOK const SV *const ssv|NN CLONE_PARAMS *const param -ApR |SV* |sv_dup_inc |NULLOK const SV *const ssv \ - |NN CLONE_PARAMS *const param -Cp |void |rvpv_dup |NN SV *const dsv|NN const SV *const ssv|NN CLONE_PARAMS *const param -Cp |yy_parser*|parser_dup |NULLOK const yy_parser *const proto|NN CLONE_PARAMS *const param -#endif -ApdR |PTR_TBL_t*|ptr_table_new -ApdR |void* |ptr_table_fetch|NN PTR_TBL_t *const tbl|NULLOK const void *const sv -Apd |void |ptr_table_store|NN PTR_TBL_t *const tbl|NULLOK const void *const oldsv \ - |NN void *const newsv -Apd |void |ptr_table_split|NN PTR_TBL_t *const tbl -Apd |void |ptr_table_free|NULLOK PTR_TBL_t *const tbl #if defined(HAVE_INTERP_INTERN) Cp |void |sys_intern_clear Cp |void |sys_intern_init -# if defined(USE_ITHREADS) -Cp |void |sys_intern_dup |NN struct interp_intern* src|NN struct interp_intern* dst -# endif -#endif - -: The reason for the 'u' flag is that this passes "aTHX_ x" to its callee: not -: a legal C parameter -Admu |const XOP * |Perl_custom_op_xop |NN const OP *o -AbpRdD |const char * |custom_op_name |NN const OP *o -AbpRdD |const char * |custom_op_desc |NN const OP *o -pRX |XOPRETANY |custom_op_get_field |NN const OP *o|const xop_flags_enum field -Adop |void |custom_op_register |NN Perl_ppaddr_t ppaddr \ - |NN const XOP *xop - -Adp |void |sv_nosharing |NULLOK SV *sv -AdpbD |void |sv_nolocking |NULLOK SV *sv -Adp |bool |sv_destroyable |NULLOK SV *sv -AdpbD |void |sv_nounlocking |NULLOK SV *sv -Adp |int |nothreadhook -p |void |init_constants - -#if defined(PERL_IN_DOOP_C) -SR |Size_t |do_trans_simple |NN SV * const sv|NN const OPtrans_map * const tbl -SR |Size_t |do_trans_count |NN SV * const sv|NN const OPtrans_map * const tbl -SR |Size_t |do_trans_complex |NN SV * const sv|NN const OPtrans_map * const tbl -SR |Size_t |do_trans_invmap |NN SV * const sv|NN AV * const map -SR |Size_t |do_trans_count_invmap |NN SV * const sv|NN AV * const map +# if defined(USE_ITHREADS) +Cp |void |sys_intern_dup |NN struct interp_intern *src \ + |NN struct interp_intern *dst +# endif #endif - -#if defined(PERL_IN_GV_C) -S |void |gv_init_svtype |NN GV *gv|const svtype sv_type -S |void |gv_magicalize_isa |NN GV *gv -S |bool|parse_gv_stash_name|NN HV **stash|NN GV **gv \ - |NN const char **name|NN STRLEN *len \ - |NN const char *nambeg|STRLEN full_len \ - |const U32 is_utf8|const I32 add -S |bool|find_default_stash|NN HV **stash|NN const char *name \ - |STRLEN len|const U32 is_utf8|const I32 add \ - |const svtype sv_type -S |bool|gv_magicalize|NN GV *gv|NN HV *stash|NN const char *name \ - |STRLEN len \ - |const svtype sv_type -S |void|maybe_multimagic_gv|NN GV *gv|NN const char *name|const svtype sv_type -S |bool|gv_is_in_main|NN const char *name|STRLEN len \ - |const U32 is_utf8 -S |void |require_tie_mod|NN GV *gv|NN const char varname \ - |NN const char * name|STRLEN len \ - |const U32 flags +#if defined(_MSC_VER) +p |int |magic_regdatum_set \ + |NN SV *sv \ + |NN MAGIC *mg +#else +pr |int |magic_regdatum_set \ + |NN SV *sv \ + |NN MAGIC *mg #endif - -#if defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) -po |SV* |hfree_next_entry |NN HV *hv|NN STRLEN *indexp +#if defined(MULTIPLICITY) +ATdfpr |void |croak_nocontext|NULLOK const char *pat \ + |... +ATdfp |void |deb_nocontext |NN const char *pat \ + |... +ATdfpr |OP * |die_nocontext |NULLOK const char *pat \ + |... +ATdfp |char * |form_nocontext |NN const char *pat \ + |... +AFTdp |void |load_module_nocontext \ + |U32 flags \ + |NN SV *name \ + |NULLOK SV *ver \ + |... +ATdfp |SV * |mess_nocontext |NN const char *pat \ + |... +Cdop |void * |my_cxt_init |NN int *indexp \ + |size_t size +ATdfp |SV * |newSVpvf_nocontext \ + |NN const char * const pat \ + |... +ATdfp |void |sv_catpvf_mg_nocontext \ + |NN SV * const sv \ + |NN const char * const pat \ + |... +ATdfp |void |sv_catpvf_nocontext \ + |NN SV * const sv \ + |NN const char * const pat \ + |... +ATdfp |void |sv_setpvf_mg_nocontext \ + |NN SV * const sv \ + |NN const char * const pat \ + |... +ATdfp |void |sv_setpvf_nocontext \ + |NN SV * const sv \ + |NN const char * const pat \ + |... +ATdfp |void |warner_nocontext \ + |U32 err \ + |NN const char *pat \ + |... +ATdfp |void |warn_nocontext |NN const char *pat \ + |... +#endif /* defined(MULTIPLICITY) */ +#if defined(MYMALLOC) +Adp |void |dump_mstats |NN const char *s +Cp |int |get_mstats |NN perl_mstats_t *buf \ + |int buflen \ + |int level +RTp |MEM_SIZE|malloced_size |NN void *p +RTp |MEM_SIZE|malloc_good_size \ + |size_t nbytes #endif - -#if defined(PERL_IN_HV_C) -S |void |hsplit |NN HV *hv|STRLEN const oldsize|STRLEN newsize -S |void |hv_free_entries|NN HV *hv -S |SV* |hv_free_ent_ret|NN HE *entry -#if !defined(PURIFY) -SR |HE* |new_he -#endif -SaTR |HEK* |save_hek_flags |NN const char *str|I32 len|U32 hash|int flags -ST |void |hv_magic_check |NN HV *hv|NN bool *needs_copy|NN bool *needs_store -S |void |unshare_hek_or_pvn|NULLOK const HEK* hek|NULLOK const char* str|I32 len|U32 hash -SR |HEK* |share_hek_flags|NN const char *str|STRLEN len|U32 hash|int flags -rS |void |hv_notallowed |int flags|NN const char *key|I32 klen|NN const char *msg -S |struct xpvhv_aux*|hv_auxinit|NN HV *hv -Sx |SV* |hv_delete_common|NULLOK HV *hv|NULLOK SV *keysv \ - |NULLOK const char *key|STRLEN klen|int k_flags|I32 d_flags \ - |U32 hash -Sx |void |clear_placeholders |NN HV *hv|U32 items +#if defined(PERL_ANY_COW) +: Used in regexec.c +EXpx |SV * |sv_setsv_cow |NULLOK SV *dsv \ + |NN SV *ssv #endif - -#if defined(PERL_IN_MG_C) -S |void |save_magic_flags|I32 mgs_ix|NN SV *sv|U32 flags -S |int |magic_methpack |NN SV *sv|NN const MAGIC *mg|NN SV *meth -S |SV* |magic_methcall1|NN SV *sv|NN const MAGIC *mg \ - |NN SV *meth|U32 flags \ - |int n|NULLOK SV *val -S |void |restore_magic |NULLOK const void *p -S |void |unwind_handler_stack|NULLOK const void *p -S |void |fixup_errno_string|NN SV* sv - +#if defined(PERL_CORE) +p |void |opslab_force_free \ + |NN OPSLAB *slab +p |void |opslab_free |NN OPSLAB *slab +p |void |opslab_free_nopad \ + |NN OPSLAB *slab +p |void |parser_free_nexttoke_ops \ + |NN yy_parser *parser \ + |NN OPSLAB *slab +RTi |bool |should_warn_nl |NN const char *pv +# if defined(PERL_DEBUG_READONLY_OPS) +ep |void |Slab_to_ro |NN OPSLAB *slab +ep |void |Slab_to_rw |NN OPSLAB * const slab +# endif +#endif /* defined(PERL_CORE) */ +#if defined(PERL_CORE) || defined(PERL_EXT) +ERXdp |bool |isSCRIPT_RUN |NN const U8 *s \ + |NN const U8 *send \ + |const bool utf8_target +ERTXdip |bool |is_utf8_non_invariant_string \ + |NN const U8 * const s \ + |STRLEN len +Ei |STRLEN |sv_or_pv_pos_u2b \ + |NN SV *sv \ + |NN const char *pv \ + |STRLEN pos \ + |NULLOK STRLEN *lenp +ERTdi |Size_t |variant_under_utf8_count \ + |NN const U8 * const s \ + |NN const U8 * const e +# if !defined(HAS_MEMRCHR) +ETei |void * |my_memrchr |NN const char *s \ + |const char c \ + |const STRLEN len +# endif #endif - -#if defined(USE_ITHREADS) -Cip |AV* |cop_file_avn |NN const COP *cop +#if defined(PERL_CORE) || defined(PERL_USE_VOLATILE_API) +Adp |void |finalize_optree|NN OP *o +Adp |void |optimize_optree|NN OP *o #endif - -#if defined(PERL_IN_OP_C) -SRT |bool |is_handle_constructor|NN const OP *o|I32 numargs -SR |I32 |assignment_type|NULLOK const OP *o -S |void |forget_pmop |NN PMOP *const o -S |void |find_and_forget_pmops |NN OP *o -S |void |cop_free |NN COP *cop -S |OP* |modkids |NULLOK OP *o|I32 type -S |OP* |scalarboolean |NN OP *o -SR |OP* |search_const |NN OP *o -SR |OP* |new_logop |I32 type|I32 flags|NN OP **firstp|NN OP **otherp -S |void |simplify_sort |NN OP *o -SRT |bool |scalar_mod_type|NULLOK const OP *o|I32 type -S |OP * |my_kid |NULLOK OP *o|NULLOK OP *attrs|NN OP **imopsp -S |OP * |dup_attrlist |NN OP *o -S |void |apply_attrs |NN HV *stash|NN SV *target|NULLOK OP *attrs -S |void |apply_attrs_my |NN HV *stash|NN OP *target|NULLOK OP *attrs|NN OP **imopsp -S |void |bad_type_pv |I32 n|NN const char *t|NN const OP *o|NN const OP *kid -S |void |bad_type_gv |I32 n|NN GV *gv|NN const OP *kid|NN const char *t -S |void |no_bareword_allowed|NN OP *o -SR |OP* |no_fh_allowed|NN OP *o -SR |OP* |too_few_arguments_pv|NN OP *o|NN const char* name|U32 flags -S |OP* |too_many_arguments_pv|NN OP *o|NN const char* name|U32 flags -S |bool |looks_like_bool|NN const OP* o -S |OP* |newGIVWHENOP |NULLOK OP* cond|NN OP *block \ - |I32 enter_opcode|I32 leave_opcode \ - |PADOFFSET entertarg -S |OP* |ref_array_or_hash|NULLOK OP* cond -S |bool |process_special_blocks |I32 floor \ - |NN const char *const fullname\ - |NN GV *const gv|NN CV *const cv -S |void |clear_special_blocks |NN const char *const fullname\ - |NN GV *const gv|NN CV *const cv +#if defined(PERL_DEBUG_READONLY_COW) +p |void |sv_buf_to_ro |NN SV *sv #endif -p |void |no_bareword_filehandle|NN const char *fhname -XpR |void* |Slab_Alloc |size_t sz -Xp |void |Slab_Free |NN void *op #if defined(PERL_DEBUG_READONLY_OPS) -# if defined(PERL_CORE) -pe |void |Slab_to_ro |NN OPSLAB *slab -pe |void |Slab_to_rw |NN OPSLAB *const slab -# endif -: Used in OpREFCNT_inc() in sv.c -poex |OP * |op_refcnt_inc |NULLOK OP *o : FIXME - can be static. -poex |PADOFFSET |op_refcnt_dec |NN OP *o +eopx |PADOFFSET|op_refcnt_dec|NN OP *o +: Used in OpREFCNT_inc() in sv.c +eopx |OP * |op_refcnt_inc |NULLOK OP *o #endif - -#if defined(PERL_IN_PERL_C) -S |void |find_beginning |NN SV* linestr_sv|NN PerlIO *rsfp -S |void |forbid_setid |const char flag|const bool suidscript -S |void |incpush |NN const char *const dir|STRLEN len \ - |U32 flags -S |SV* |mayberelocate |NN const char *const dir|STRLEN len \ - |U32 flags -S |void |incpush_use_sep|NN const char *p|STRLEN len|U32 flags -S |void |init_interp -S |void |init_ids -S |void |init_main_stash -S |void |init_perllib -S |void |init_postdump_symbols|int argc|NN char **argv|NULLOK char **env -S |void |init_predump_symbols -rS |void |my_exit_jump -S |void |nuke_stacks -S |PerlIO *|open_script |NN const char *scriptname|bool dosearch \ - |NN bool *suidscript -Sr |void |usage -#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW -So |void |validate_suid |NN PerlIO *rsfp +#if defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION) +Mp |bool |do_exec |NN const char *cmd +#else +p |bool |do_exec |NN const char *cmd #endif -Sr |void |minus_v - -S |void* |parse_body |NULLOK char **env|XSINIT_t xsinit -rS |void |run_body |I32 oldscope -# ifndef PERL_IS_MINIPERL -S |SV * |incpush_if_exists|NN AV *const av|NN SV *dir|NN SV *const stem -# endif +#if defined(PERL_DONT_CREATE_GVSV) +AMbdp |GV * |gv_SVadd |NULLOK GV *gv #endif - -#if defined(PERL_IN_PP_C) -S |size_t |do_chomp |NN SV *retval|NN SV *sv|bool chomping -S |OP* |do_delete_local -SR |SV* |refto |NN SV* sv +#if defined(PERL_IMPLICIT_SYS) +CTo |PerlInterpreter *|perl_alloc_using \ + |NN struct IPerlMem *ipM \ + |NN struct IPerlMem *ipMS \ + |NN struct IPerlMem *ipMP \ + |NN struct IPerlEnv *ipE \ + |NN struct IPerlStdIO *ipStd \ + |NN struct IPerlLIO *ipLIO \ + |NN struct IPerlDir *ipD \ + |NN struct IPerlSock *ipS \ + |NN struct IPerlProc *ipP +# if defined(USE_ITHREADS) +CTo |PerlInterpreter *|perl_clone_using \ + |NN PerlInterpreter *proto_perl \ + |UV flags \ + |NN struct IPerlMem *ipM \ + |NN struct IPerlMem *ipMS \ + |NN struct IPerlMem *ipMP \ + |NN struct IPerlEnv *ipE \ + |NN struct IPerlStdIO *ipStd \ + |NN struct IPerlLIO *ipLIO \ + |NN struct IPerlDir *ipD \ + |NN struct IPerlSock *ipS \ + |NN struct IPerlProc *ipP +# endif +#else +Adp |I32 |my_pclose |NULLOK PerlIO *ptr +Adp |PerlIO *|my_popen |NN const char *cmd \ + |NN const char *mode +# if defined(USE_ITHREADS) +i |bool |PerlEnv_putenv |NN char *str +# endif #endif -#if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C) -: Used in pp_hot.c -pReo |GV* |softref2xv |NN SV *const sv|NN const char *const what \ - |const svtype type|NN SV ***spp -iTR |bool |lossless_NV_to_IV|const NV nv|NN IV * ivp +#if defined(PERL_IN_AV_C) +S |MAGIC *|get_aux_mg |NN AV *av #endif -#if defined(PERL_IN_PP_HOT_C) -IR |bool |should_we_output_Debug_r|NN regexp * prog +#if defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PAD_C) || defined(PERL_IN_PERLY_C) || \ + defined(PERL_IN_TOKE_C) +; Functions in class.c that are called by the parser (perly.c, toke.c, pad.c) +Cp |void |class_add_ADJUST \ + |NN HV *stash \ + |NN CV *cv +Cp |void |class_add_field|NN HV *stash \ + |NN PADNAME *pn +Cp |void |class_apply_attributes \ + |NN HV *stash \ + |NULLOK OP *attrlist +Cp |void |class_apply_field_attributes \ + |NN PADNAME *pn \ + |NULLOK OP *attrlist +Cp |void |class_prepare_initfield_parse +Cp |void |class_prepare_method_parse \ + |NN CV *cv +Cp |void |class_seal_stash \ + |NN HV *stash +Cp |void |class_set_field_defop \ + |NN PADNAME *pn \ + |OPCODE defmode \ + |NN OP *defop +Cp |void |class_setup_stash \ + |NN HV *stash +Cp |OP * |class_wrap_method_body \ + |NULLOK OP *o +Cp |void |croak_kw_unless_class \ + |NN const char *kw +#endif /* defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C) || + defined(PERL_IN_PAD_C) || defined(PERL_IN_PERLY_C) || + defined(PERL_IN_TOKE_C) */ +#if defined(PERL_IN_DEB_C) +S |void |deb_stack_n |NN SV **stack_base \ + |I32 stack_min \ + |I32 stack_max \ + |I32 mark_min \ + |I32 mark_max #endif - -#if defined(PERL_IN_PP_PACK_C) -S |SSize_t|unpack_rec |NN struct tempsym* symptr|NN const char *s \ - |NN const char *strbeg|NN const char *strend|NULLOK const char **new_s -S |SV ** |pack_rec |NN SV *cat|NN struct tempsym* symptr|NN SV **beglist|NN SV **endlist -S |SV* |mul128 |NN SV *sv|U8 m -S |SSize_t|measure_struct |NN struct tempsym* symptr -S |bool |next_symbol |NN struct tempsym* symptr -SR |SV* |is_an_int |NN const char *s|STRLEN l -S |int |div128 |NN SV *pnum|NN bool *done -S |const char *|group_end |NN const char *patptr|NN const char *patend \ - |char ender -SR |const char *|get_num |NN const char *patptr|NN SSize_t *lenptr -TS |bool |need_utf8 |NN const char *pat|NN const char *patend -TS |char |first_symbol |NN const char *pat|NN const char *patend -SR |char * |sv_exp_grow |NN SV *sv|STRLEN needed -STR |char * |my_bytes_to_utf8|NN const U8 *start|STRLEN len|NN char *dest \ - |const bool needs_swap +#if defined(PERL_IN_DOIO_C) +S |bool |argvout_final |NN MAGIC *mg \ + |NN IO *io \ + |bool is_explicit +S |void |exec_failed |NN const char *cmd \ + |int fd \ + |int do_report +RS |bool |ingroup |Gid_t testgid \ + |bool effective +S |bool |openn_cleanup |NN GV *gv \ + |NN IO *io \ + |NULLOK PerlIO *fp \ + |NN char *mode \ + |NN const char *oname \ + |NULLOK PerlIO *saveifp \ + |NULLOK PerlIO *saveofp \ + |int savefd \ + |char savetype \ + |int writing \ + |bool was_fdopen \ + |NULLOK const char *type \ + |NULLOK Stat_t *statbufp +S |IO * |openn_setup |NN GV *gv \ + |NN char *mode \ + |NN PerlIO **saveifp \ + |NN PerlIO **saveofp \ + |NN int *savefd \ + |NN char *savetype #endif - -#if defined(PERL_IN_PP_CTL_C) -SdR |OP* |docatch |Perl_ppaddr_t firstpp -SR |OP* |dofindlabel |NN OP *o|NN const char *label|STRLEN len \ - |U32 flags|NN OP **opstack|NN OP **oplimit -S |MAGIC *|doparseform |NN SV *sv -STR |bool |num_overflow |NV value|I32 fldsize|I32 frcsize -SR |I32 |dopoptoeval |I32 startingblock -SR |I32 |dopoptogivenfor|I32 startingblock -SR |I32 |dopoptolabel |NN const char *label|STRLEN len|U32 flags -SR |I32 |dopoptoloop |I32 startingblock -SR |I32 |dopoptosub_at |NN const PERL_CONTEXT* cxstk|I32 startingblock -SR |I32 |dopoptowhen |I32 startingblock -S |void |save_lines |NULLOK AV *array|NN SV *sv -S |bool |doeval_compile |U8 gimme \ - |NULLOK CV* outside|U32 seq|NULLOK HV* hh -SR |PerlIO *|check_type_and_open|NN SV *name -#ifndef PERL_DISABLE_PMC -SR |PerlIO *|doopen_pm |NN SV *name -#endif -iRT |bool |path_is_searchable|NN const char *name -SR |I32 |run_user_filter|int idx|NN SV *buf_sv|int maxlen -SR |PMOP* |make_matcher |NN REGEXP* re -SR |bool |matcher_matches_sv|NN PMOP* matcher|NN SV* sv -S |void |destroy_matcher|NN PMOP* matcher -S |OP* |do_smartmatch |NULLOK HV* seen_this \ - |NULLOK HV* seen_other|const bool copied +#if defined(PERL_IN_DOOP_C) +RS |Size_t |do_trans_complex \ + |NN SV * const sv \ + |NN const OPtrans_map * const tbl +RS |Size_t |do_trans_count |NN SV * const sv \ + |NN const OPtrans_map * const tbl +RS |Size_t |do_trans_count_invmap \ + |NN SV * const sv \ + |NN AV * const map +RS |Size_t |do_trans_invmap|NN SV * const sv \ + |NN AV * const map +RS |Size_t |do_trans_simple|NN SV * const sv \ + |NN const OPtrans_map * const tbl +#endif +#if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || \ + defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) || \ + defined(PERL_IN_UTF8_C) +ERTi |bool * |get_invlist_offset_addr \ + |NN SV *invlist +ERTi |UV * |invlist_array |NN SV * const invlist +ERTi |bool |_invlist_contains_cp \ + |NN SV * const invlist \ + |const UV cp +ERTi |UV |_invlist_len |NN SV * const invlist +ERTXp |SSize_t|_invlist_search|NN SV * const invlist \ + |const UV cp +ERTi |bool |is_invlist |NULLOK const SV * const invlist #endif - -#if defined(PERL_IN_PP_HOT_C) -S |void |do_oddball |NN SV **oddkey|NN SV **firstkey -i |HV* |opmethod_stash |NN SV* meth +#if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_REGCOMP_ANY) +ERi |SV * |add_cp_to_invlist \ + |NULLOK SV *invlist \ + |const UV cp +Ei |void |invlist_extend |NN SV * const invlist \ + |const UV len +ERTi |UV |invlist_highest|NN SV * const invlist +Ei |void |invlist_set_len|NN SV * const invlist \ + |const UV len \ + |const bool offset +#endif +#if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C) +ERXp |SV * |_add_range_to_invlist \ + |NULLOK SV *invlist \ + |UV start \ + |UV end +m |void |_invlist_intersection \ + |NN SV * const a \ + |NN SV * const b \ + |NN SV **i +EXp |void |_invlist_intersection_maybe_complement_2nd \ + |NULLOK SV * const a \ + |NN SV * const b \ + |const bool complement_b \ + |NN SV **i +EXp |void |_invlist_invert|NN SV * const invlist +m |void |_invlist_subtract \ + |NN SV * const a \ + |NN SV * const b \ + |NN SV **result +Cm |void |_invlist_union |NULLOK SV * const a \ + |NN SV * const b \ + |NN SV **output +EXp |void |_invlist_union_maybe_complement_2nd \ + |NULLOK SV * const a \ + |NN SV * const b \ + |const bool complement_b \ + |NN SV **output +ERXp |SV * |_new_invlist |IV initial_size +ERXp |SV * |_setup_canned_invlist \ + |const STRLEN size \ + |const UV element0 \ + |NN UV **other_elements_ptr +#endif /* defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || + defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C) */ +#if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \ + defined(PERL_IN_TOKE_C) +ERXp |const char *|form_alien_digit_msg \ + |const U8 which \ + |const STRLEN valids_len \ + |NN const char * const first_bad \ + |NN const char * const send \ + |const bool UTF \ + |const bool braced +ERXp |bool |grok_bslash_c |const char source \ + |NN U8 *result \ + |NN const char **message \ + |NULLOK U32 *packed_warn +ERXp |bool |grok_bslash_o |NN char **s \ + |NN const char * const send \ + |NN UV *uv \ + |NN const char **message \ + |NULLOK U32 *packed_warn \ + |const bool strict \ + |const bool allow_UV_MAX \ + |const bool utf8 +ERXp |bool |grok_bslash_x |NN char **s \ + |NN const char * const send \ + |NN UV *uv \ + |NN const char **message \ + |NULLOK U32 *packed_warn \ + |const bool strict \ + |const bool allow_UV_MAX \ + |const bool utf8 #endif - -#if defined(PERL_IN_PP_SORT_C) -i |I32 |sv_ncmp |NN SV *const a|NN SV *const b -i |I32 |sv_ncmp_desc |NN SV *const a|NN SV *const b -i |I32 |sv_i_ncmp |NN SV *const a|NN SV *const b -i |I32 |sv_i_ncmp_desc |NN SV *const a|NN SV *const b -i |I32 |amagic_ncmp |NN SV *const a|NN SV *const b -i |I32 |amagic_ncmp_desc |NN SV *const a|NN SV *const b -i |I32 |amagic_i_ncmp |NN SV *const a|NN SV *const b -i |I32 |amagic_i_ncmp_desc |NN SV *const a|NN SV *const b -i |I32 |amagic_cmp |NN SV *const str1|NN SV *const str2 -i |I32 |amagic_cmp_desc |NN SV *const str1|NN SV *const str2 -i |I32 |cmp_desc |NN SV *const str1|NN SV *const str2 -# ifdef USE_LOCALE_COLLATE -i |I32 |amagic_cmp_locale |NN SV *const str1|NN SV *const str2 -i |I32 |amagic_cmp_locale_desc|NN SV *const str1|NN SV *const str2 -i |I32 |cmp_locale_desc|NN SV *const str1|NN SV *const str2 -# endif -S |I32 |sortcv |NN SV *const a|NN SV *const b -S |I32 |sortcv_xsub |NN SV *const a|NN SV *const b -S |I32 |sortcv_stacked |NN SV *const a|NN SV *const b -I |void |sortsv_flags_impl |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp|U32 flags +#if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \ + defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) +ERXp |const char *|form_cp_too_large_msg \ + |const U8 which \ + |NULLOK const char *string \ + |const Size_t len \ + |const UV cp #endif - -#if defined(PERL_IN_PP_SYS_C) -S |OP* |doform |NN CV *cv|NN GV *gv|NULLOK OP *retop -# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR) -SR |int |dooneliner |NN const char *cmd|NN const char *filename -# endif -S |SV * |space_join_names_mortal|NULLOK char *const *array -#endif -Fp |OP * |tied_method|NN SV *methname|NN SV **sp \ - |NN SV *const sv|NN const MAGIC *const mg \ - |const U32 flags|U32 argc|... - #if defined(PERL_IN_DUMP_C) -S |CV* |deb_curcv |I32 ix +S |CV * |deb_curcv |I32 ix Sd |void |debprof |NN const OP *o +S |SV * |pm_description |NN const PMOP *pm S |UV |sequence_num |NULLOK const OP *o -S |SV* |pm_description |NN const PMOP *pm #endif - -#if defined(PERL_IN_SCOPE_C) -S |SV* |save_scalar_at |NN SV **sptr|const U32 flags +#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || \ + defined(PERL_IN_SCOPE_C) || defined(PERL_IN_SV_C) +opx |void |hv_kill_backrefs \ + |NN HV *hv +#endif +#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_REGCOMP_ANY) +EXp |void |_invlist_dump |NN PerlIO *file \ + |I32 level \ + |NN const char * const indent \ + |NN SV * const invlist #endif - -#if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C) +#if defined(PERL_IN_GV_C) +S |bool |find_default_stash \ + |NN HV **stash \ + |NN const char *name \ + |STRLEN len \ + |const U32 is_utf8 \ + |const I32 add \ + |const svtype sv_type +i |GV * |gv_fetchmeth_internal \ + |NULLOK HV *stash \ + |NULLOK SV *meth \ + |NULLOK const char *name \ + |STRLEN len \ + |I32 level \ + |U32 flags +S |void |gv_init_svtype |NN GV *gv \ + |const svtype sv_type +S |bool |gv_is_in_main |NN const char *name \ + |STRLEN len \ + |const U32 is_utf8 +S |bool |gv_magicalize |NN GV *gv \ + |NN HV *stash \ + |NN const char *name \ + |STRLEN len \ + |const svtype sv_type +S |void |gv_magicalize_isa \ + |NN GV *gv +i |HV * |gv_stashpvn_internal \ + |NN const char *name \ + |U32 namelen \ + |I32 flags +S |void |maybe_multimagic_gv \ + |NN GV *gv \ + |NN const char *name \ + |const svtype sv_type +S |bool |parse_gv_stash_name \ + |NN HV **stash \ + |NN GV **gv \ + |NN const char **name \ + |NN STRLEN *len \ + |NN const char *nambeg \ + |STRLEN full_len \ + |const U32 is_utf8 \ + |const I32 add +S |void |require_tie_mod|NN GV *gv \ + |NN const char varname \ + |NN const char *name \ + |STRLEN len \ + |const U32 flags +#endif /* defined(PERL_IN_GV_C) */ +#if defined(PERL_IN_GV_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PAD_C) || defined(PERL_IN_SV_C) : Used in gv.c -po |void |sv_add_backref |NN SV *const tsv|NN SV *const sv +op |void |sv_add_backref |NN SV * const tsv \ + |NN SV * const sv #endif - -#if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C) -: Used in hv.c and mg.c -pox |void |sv_kill_backrefs |NN SV *const sv|NULLOK AV *const av +#if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C) +EGdp |HV * |gv_stashsvpvn_cached \ + |SV *namesv \ + |const char *name \ + |U32 namelen \ + |I32 flags #endif - -#if defined(PERL_IN_SV_C) || defined (PERL_IN_OP_C) -pR |SV * |varname |NULLOK const GV *const gv|const char gvtype \ - |PADOFFSET targ|NULLOK const SV *const keyname \ - |SSize_t aindex|int subscript_type -#endif - -pX |void |sv_del_backref |NN SV *const tsv|NN SV *const sv -#if defined(PERL_IN_SV_C) -TiR |char * |uiv_2buf |NN char *const buf|const IV iv|UV uv|const int is_uv|NN char **const peob -i |void |sv_unglob |NN SV *const sv|U32 flags -S |const char *|sv_display |NN SV *const sv|NN char *tmpbuf|STRLEN tmpbuf_size -S |void |not_a_number |NN SV *const sv -S |void |not_incrementable |NN SV *const sv -S |I32 |visit |NN SVFUNC_t f|const U32 flags|const U32 mask -# ifdef DEBUGGING -S |void |del_sv |NN SV *p -# endif -# if !defined(NV_PRESERVES_UV) -# ifdef DEBUGGING -S |int |sv_2iuv_non_preserve |NN SV *const sv|I32 numtype -# else -S |int |sv_2iuv_non_preserve |NN SV *const sv -# endif -# endif -SR |STRLEN |expect_number |NN const char **const pattern -ST |STRLEN |sv_pos_u2b_forwards|NN const U8 *const start \ - |NN const U8 *const send|NN STRLEN *const uoffset \ - |NN bool *const at_end|NN bool *canonical_position -ST |STRLEN |sv_pos_u2b_midway|NN const U8 *const start \ - |NN const U8 *send|STRLEN uoffset|const STRLEN uend -S |STRLEN |sv_pos_u2b_cached|NN SV *const sv|NN MAGIC **const mgp \ - |NN const U8 *const start|NN const U8 *const send \ - |STRLEN uoffset|STRLEN uoffset0|STRLEN boffset0 -S |void |utf8_mg_len_cache_update|NN SV *const sv|NN MAGIC **const mgp \ - |const STRLEN ulen -S |void |utf8_mg_pos_cache_update|NN SV *const sv|NN MAGIC **const mgp \ - |const STRLEN byte|const STRLEN utf8|const STRLEN blen -S |STRLEN |sv_pos_b2u_midway|NN const U8 *const s|NN const U8 *const target \ - |NN const U8 *end|STRLEN endu -S |void |assert_uft8_cache_coherent|NN const char *const func \ - |STRLEN from_cache|STRLEN real|NN SV *const sv -ST |char * |F0convert |NV nv|NN char *const endbuf|NN STRLEN *const len -Cp |SV * |more_sv -S |bool |sv_2iuv_common |NN SV *const sv -S |void |glob_assign_glob|NN SV *const dsv|NN SV *const ssv \ - |const int dtype -SRT |PTR_TBL_ENT_t *|ptr_table_find|NN PTR_TBL_t *const tbl|NULLOK const void *const sv -S |void |anonymise_cv_maybe |NN GV *gv|NN CV *cv -#endif - -: Used in sv.c and hv.c -Cpo |void * |more_bodies |const svtype sv_type|const size_t body_size \ - |const size_t arena_size -EXpR |SV* |get_and_check_backslash_N_name|NN const char* s \ - |NN const char* e \ - |const bool is_utf8 \ - |NN const char** error_msg -EXpR |HV* |load_charnames |NN SV * char_name \ - |NN const char * context \ - |const STRLEN context_len \ - |NN const char ** error_msg - -: For use ONLY in B::Hooks::Parser, by special dispensation -EXpxR |char* |scan_str |NN char *start|int keep_quoted \ - |int keep_delims|int re_reparse \ - |NULLOK char **delimp -EXpx |char* |scan_word |NN char *s|NN char *dest|STRLEN destlen \ - |int allow_package|NN STRLEN *slp -EXpxR |char* |skipspace_flags|NN char *s|U32 flags -#if defined(PERL_IN_TOKE_C) -S |void |check_uni -S |void |force_next |I32 type -S |char* |force_version |NN char *s|int guessing -S |char* |force_strict_version |NN char *s -S |char* |force_word |NN char *start|int token|int check_keyword \ - |int allow_pack -S |SV* |tokeq |NN SV *sv -SR |char* |scan_const |NN char *start -SR |SV* |get_and_check_backslash_N_name_wrapper|NN const char* s \ - |NN const char* const e -SR |char* |scan_formline |NN char *s -SR |char* |scan_heredoc |NN char *s -S |char* |scan_ident |NN char *s|NN char *dest \ - |STRLEN destlen|I32 ck_uni -SR |char* |scan_inputsymbol|NN char *start -SR |char* |scan_pat |NN char *start|I32 type -SR |char* |scan_subst |NN char *start -SR |char* |scan_trans |NN char *start -S |void |update_debugger_info|NULLOK SV *orig_sv \ - |NULLOK const char *const buf|STRLEN len -SR |char* |swallow_bom |NN U8 *s -#ifndef PERL_NO_UTF16_FILTER -S |I32 |utf16_textfilter|int idx|NN SV *sv|int maxlen -S |U8* |add_utf16_textfilter|NN U8 *const s|bool reversed -#endif -S |void |checkcomma |NN const char *s|NN const char *name \ - |NN const char *what -S |void |force_ident |NN const char *s|int kind -S |void |force_ident_maybe_lex|char pit -S |void |incline |NN const char *s|NN const char *end -S |int |intuit_method |NN char *s|NULLOK SV *ioname|NULLOK CV *cv -S |int |intuit_more |NN char *s|NN char *e -S |I32 |lop |I32 f|U8 x|NN char *s -rS |void |missingterm |NULLOK char *s|STRLEN len -S |void |no_op |NN const char *const what|NULLOK char *s -S |int |pending_ident -SR |I32 |sublex_done -SR |I32 |sublex_push -SR |I32 |sublex_start -SR |char * |filter_gets |NN SV *sv|STRLEN append -SR |HV * |find_in_my_stash|NN const char *pkgname|STRLEN len -SR |char * |tokenize_use |int is_use|NN char *s -So |SV* |new_constant |NULLOK const char *s|STRLEN len \ - |NN const char *key|STRLEN keylen|NN SV *sv \ - |NULLOK SV *pv|NULLOK const char *type \ - |STRLEN typelen \ - |NULLOK const char ** error_msg -S |int |ao |int toketype -S |void|parse_ident|NN char **s|NN char **d \ - |NN char * const e|int allow_package \ - |bool is_utf8|bool check_dollar \ - |bool tick_warn -# if defined(PERL_CR_FILTER) -S |I32 |cr_textfilter |int idx|NULLOK SV *sv|int maxlen -S |void |strip_return |NN SV *sv -# endif -# if defined(DEBUGGING) -S |int |tokereport |I32 rv|NN const YYSTYPE* lvalp -Sf |void |printbuf |NN const char *const fmt|NN const char *const s -# endif +#if defined(PERL_IN_HV_C) +Sx |void |clear_placeholders \ + |NN HV *hv \ + |U32 items +S |void |hsplit |NN HV *hv \ + |STRLEN const oldsize \ + |STRLEN newsize +S |struct xpvhv_aux *|hv_auxinit \ + |NN HV *hv +Sx |SV * |hv_delete_common \ + |NULLOK HV *hv \ + |NULLOK SV *keysv \ + |NULLOK const char *key \ + |STRLEN klen \ + |int k_flags \ + |I32 d_flags \ + |U32 hash +S |SV * |hv_free_ent_ret|NN HE *entry +S |void |hv_free_entries|NN HV *hv +ST |void |hv_magic_check |NN HV *hv \ + |NN bool *needs_copy \ + |NN bool *needs_store +Sr |void |hv_notallowed |int flags \ + |NN const char *key \ + |I32 klen \ + |NN const char *msg +S |SV * |refcounted_he_value \ + |NN const struct refcounted_he *he +RSTa |HEK * |save_hek_flags |NN const char *str \ + |I32 len \ + |U32 hash \ + |int flags +RS |HEK * |share_hek_flags|NN const char *str \ + |STRLEN len \ + |U32 hash \ + |int flags +S |void |unshare_hek_or_pvn \ + |NULLOK const HEK *hek \ + |NULLOK const char *str \ + |I32 len \ + |U32 hash +# if !defined(PURIFY) +RS |HE * |new_he +# endif +#endif /* defined(PERL_IN_HV_C) */ +#if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C) +: Used in hv.c and mg.c +opx |void |sv_kill_backrefs \ + |NN SV * const sv \ + |NULLOK AV * const av #endif -EdXxp |bool |validate_proto |NN SV *name|NULLOK SV *proto|bool warn \ - |bool curstash - -#if defined(PERL_IN_UNIVERSAL_C) -SG |bool |isa_lookup |NULLOK HV *stash|NULLOK SV *namesv|NULLOK const char * name \ - |STRLEN len|U32 flags -SG |bool |sv_derived_from_svpvn |NULLOK SV *sv \ - |NULLOK SV *namesv \ - |NULLOK const char * name \ - |const STRLEN len \ - |U32 flags +#if defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) +op |SV * |hfree_next_entry \ + |NN HV *hv \ + |NN STRLEN *indexp #endif - #if defined(PERL_IN_LOCALE_C) -# ifdef USE_LOCALE -ST |const char*|category_name |const int category -S |const char*|switch_category_locale_to_template|const int switch_category|const int template_category|NULLOK const char * template_locale -S |void |restore_switched_locale|const int category|NULLOK const char * const original_locale -# endif -# ifdef HAS_NL_LANGINFO -ST |const char*|my_nl_langinfo|const nl_item item|bool toggle -# else -ST |const char*|my_nl_langinfo|const int item|bool toggle -# endif -iTR |const char *|save_to_buffer|NULLOK const char * string \ - |NULLOK char **buf \ - |NN Size_t *buf_size \ - |const Size_t offset -# if defined(USE_LOCALE) -S |char* |stdize_locale |NN char* locs -S |void |new_collate |NULLOK const char* newcoll -S |void |new_ctype |NN const char* newctype -S |void |set_numeric_radix|const bool use_locale -S |void |new_numeric |NULLOK const char* newnum -# ifdef USE_POSIX_2008_LOCALE -ST |const char*|emulate_setlocale|const int category \ - |NULLOK const char* locale \ - |unsigned int index \ - |const bool is_index_valid -# endif -# ifdef WIN32 -S |char* |win32_setlocale|int category|NULLOK const char* locale -# endif -# ifdef DEBUGGING -S |void |print_collxfrm_input_and_return \ - |NN const char * const s \ - |NN const char * const e \ - |NULLOK const STRLEN * const xlen \ - |const bool is_utf8 -S |void |print_bytes_for_locale |NN const char * const s \ - |NN const char * const e \ - |const bool is_utf8 -STR |char * |setlocale_debug_string |const int category \ - |NULLOK const char* const locale \ - |NULLOK const char* const retval -# endif -# endif -#endif - -#if defined(USE_LOCALE) \ - && ( defined(PERL_IN_LOCALE_C) \ - || defined(PERL_IN_MG_C) \ - || defined (PERL_EXT_POSIX) \ - || defined (PERL_EXT_LANGINFO)) -Cp |bool |_is_cur_LC_category_utf8|int category +S |utf8ness_t|get_locale_string_utf8ness_i \ + |NULLOK const char *string \ + |const locale_utf8ness_t known_utf8 \ + |NULLOK const char *locale \ + |const unsigned cat_index +S |bool |is_locale_utf8 |NN const char *locale +# if defined(HAS_LOCALECONV) +S |HV * |my_localeconv |const int item +S |void |populate_hash_from_localeconv \ + |NN HV *hv \ + |NN const char *locale \ + |const U32 which_mask \ + |NN const lconv_offset_t *strings[2] \ + |NULLOK const lconv_offset_t *integers +# endif +# if defined(USE_LOCALE) +ST |unsigned int|get_category_index \ + |const int category \ + |NULLOK const char *locale +ST |int |get_category_index_nowarn \ + |const int category +Ri |const char *|mortalized_pv_copy \ + |NULLOK const char * const pv +S |void |new_LC_ALL |NULLOK const char *unused \ + |bool force +So |void |restore_toggled_locale_i \ + |const unsigned cat_index \ + |NULLOK const char *original_locale \ + |const line_t caller_line +ST |const char *|save_to_buffer \ + |NULLOK const char *string \ + |NULLOK const char **buf \ + |NULLOK Size_t *buf_size +Sr |void |setlocale_failure_panic_i \ + |const unsigned int cat_index \ + |NULLOK const char *current \ + |NN const char *failed \ + |const line_t caller_0_line \ + |const line_t caller_1_line +S |const char *|stdize_locale \ + |const int category \ + |NULLOK const char *input_locale \ + |NULLOK const char **buf \ + |NULLOK Size_t *buf_size \ + |line_t caller_line +So |const char *|toggle_locale_i \ + |const unsigned switch_cat_index \ + |NN const char *new_locale \ + |const line_t caller_line +# if defined(DEBUGGING) +RS |char * |my_setlocale_debug_string_i \ + |const unsigned cat_index \ + |NULLOK const char *locale \ + |NULLOK const char *retval \ + |const line_t line +# endif +# if defined(HAS_NL_LANGINFO) || defined(HAS_NL_LANGINFO_L) +S |const char *|my_langinfo_i \ + |const nl_item item \ + |const unsigned int cat_index \ + |NN const char *locale \ + |NN const char **retbufp \ + |NULLOK Size_t *retbuf_sizep \ + |NULLOK utf8ness_t *utf8ness +# else +S |const char *|my_langinfo_i \ + |const int item \ + |const unsigned int cat_index \ + |NN const char *locale \ + |NN const char **retbufp \ + |NULLOK Size_t *retbuf_sizep \ + |NULLOK utf8ness_t *utf8ness +# endif +# if defined(USE_LOCALE_COLLATE) +S |void |new_collate |NN const char *newcoll \ + |bool force +# if defined(DEBUGGING) +S |void |print_collxfrm_input_and_return \ + |NN const char *s \ + |NN const char *e \ + |NULLOK const char *xbuf \ + |const STRLEN xlen \ + |const bool is_utf8 +# endif +# endif +# if defined(USE_LOCALE_CTYPE) +ST |bool |is_codeset_name_UTF8 \ + |NN const char *name +S |void |new_ctype |NN const char *newctype \ + |bool force +# endif +# if defined(USE_LOCALE_NUMERIC) +S |void |new_numeric |NN const char *newnum \ + |bool force +# endif +# if defined(USE_PERL_SWITCH_LOCALE_CONTEXT) || defined(DEBUGGING) +S |const char *|get_LC_ALL_display +# endif +# if defined(USE_POSIX_2008_LOCALE) +S |const char *|emulate_setlocale_i \ + |const unsigned int index \ + |NULLOK const char *new_locale \ + |const recalc_lc_all_t recalc_LC_ALL \ + |const line_t line +S |const char *|my_querylocale_i \ + |const unsigned int index +S |const char *|setlocale_from_aggregate_LC_ALL \ + |NN const char *locale \ + |const line_t line +S |locale_t|use_curlocale_scratch +# if defined(USE_QUERYLOCALE) +S |const char *|calculate_LC_ALL \ + |const locale_t cur_obj +# else +S |const char *|update_PL_curlocales_i \ + |const unsigned int index \ + |NN const char *new_locale \ + |recalc_lc_all_t recalc_LC_ALL +# endif +# elif defined(USE_LOCALE_THREADS) && \ + !defined(USE_THREAD_SAFE_LOCALE) && \ + !defined(USE_THREAD_SAFE_LOCALE_EMULATION) /* && + !defined(USE_POSIX_2008_LOCALE) */ +S |const char *|less_dicey_setlocale_r \ + |const int category \ + |NULLOK const char *locale +: Not currently used +S |void |less_dicey_void_setlocale_i \ + |const unsigned cat_index \ + |NN const char *locale \ + |const line_t line +# if 0 +S |bool |less_dicey_bool_setlocale_r \ + |const int cat \ + |NN const char *locale +# endif +# endif +# if !( defined(USE_POSIX_2008_LOCALE) && defined(USE_QUERYLOCALE) ) && \ + ( !defined(LC_ALL) || defined(USE_POSIX_2008_LOCALE) || \ + defined(WIN32) ) +S |const char *|calculate_LC_ALL \ + |NN const char **individ_locales +# endif +# if defined(WIN32) +ST |wchar_t *|Win_byte_string_to_wstring \ + |const UINT code_page \ + |NULLOK const char *byte_string +S |const char *|win32_setlocale \ + |int category \ + |NULLOK const char *locale +ST |char * |Win_wstring_to_byte_string \ + |const UINT code_page \ + |NULLOK const wchar_t *wstring +S |const char *|wrap_wsetlocale \ + |const int category \ + |NULLOK const char *locale +# endif +# if defined(WIN32) || \ + ( defined(USE_POSIX_2008_LOCALE) && !defined(USE_QUERYLOCALE) ) +S |const char *|find_locale_from_environment \ + |const unsigned int index +# endif +# endif /* defined(USE_LOCALE) */ +# if defined(USE_POSIX_2008_LOCALE) || defined(DEBUGGING) +S |const char *|get_displayable_string \ + |NN const char * const s \ + |NN const char * const e \ + |const bool is_utf8 +# endif +#endif /* defined(PERL_IN_LOCALE_C) */ +#if defined(PERL_IN_MALLOC_C) +ST |int |adjust_size_and_find_bucket \ + |NN size_t *nbytes_p #endif - - -#if defined(PERL_IN_UTIL_C) -S |SV* |mess_alloc -S |SV * |with_queued_errors|NN SV *ex -S |bool |invoke_exception_hook|NULLOK SV *ex|bool warn -# if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL) -ST |void |mem_log_common |enum mem_log_type mlt|const UV n|const UV typesize \ - |NN const char *type_name|NULLOK const SV *sv \ - |Malloc_t oldalloc|Malloc_t newalloc \ - |NN const char *filename|const int linenumber \ - |NN const char *funcname -# endif +#if defined(PERL_IN_MATHOMS_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PERLY_C) || defined(PERL_IN_TOKE_C) +Mbp |OP * |ref |NULLOK OP *o \ + |I32 type #endif +#if defined(PERL_IN_MG_C) -#if defined(PERL_MEM_LOG) -CpT |Malloc_t |mem_log_alloc |const UV nconst|UV typesize|NN const char *type_name|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname -CpT |Malloc_t |mem_log_realloc |const UV n|const UV typesize|NN const char *type_name|Malloc_t oldalloc|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname -CpT |Malloc_t |mem_log_free |Malloc_t oldalloc|NN const char *filename|const int linenumber|NN const char *funcname -CpT |void |mem_log_new_sv|NN const SV *sv|NN const char *filename|int linenumber|NN const char *funcname -CpT |void |mem_log_del_sv|NN const SV *sv|NN const char *filename|int linenumber|NN const char *funcname +S |void |fixup_errno_string \ + |NN SV *sv +S |SV * |magic_methcall1|NN SV *sv \ + |NN const MAGIC *mg \ + |NN SV *meth \ + |U32 flags \ + |int n \ + |NULLOK SV *val +S |int |magic_methpack |NN SV *sv \ + |NN const MAGIC *mg \ + |NN SV *meth +S |void |restore_magic |NULLOK const void *p +S |void |save_magic_flags \ + |SSize_t mgs_ix \ + |NN SV *sv \ + |U32 flags +S |void |unwind_handler_stack \ + |NULLOK const void *p #endif - -#if defined(PERL_IN_UTF8_C) -SR |HV * |new_msg_hv |NN const char * const message \ - |U32 categories \ - |U32 flag -SR |UV |check_locale_boundary_crossing \ - |NN const U8* const p \ - |const UV result \ - |NN U8* const ustrp \ - |NN STRLEN *lenp -iR |bool |is_utf8_common |NN const U8 *const p \ - |NN const U8 *const e \ - |NULLOK SV* const invlist -#endif - -EXiTp |void |append_utf8_from_native_byte|const U8 byte|NN U8** dest - -Apd |void |sv_set_undef |NN SV *sv -Apd |void |sv_setsv_flags |NN SV *dsv|NULLOK SV *ssv|const I32 flags -Apd |void |sv_catpvn_flags|NN SV *const dsv|NN const char *sstr|const STRLEN len \ - |const I32 flags -Apd |void |sv_catpv_flags |NN SV *dsv|NN const char *sstr \ - |const I32 flags -Apd |void |sv_catsv_flags |NN SV *const dsv|NULLOK SV *const sstr|const I32 flags -Amd |STRLEN |sv_utf8_upgrade_flags|NN SV *const sv|const I32 flags -Adp |STRLEN |sv_utf8_upgrade_flags_grow|NN SV *const sv|const I32 flags|STRLEN extra -Apd |char* |sv_pvn_force_flags|NN SV *const sv|NULLOK STRLEN *const lp|const U32 flags -AdpMb |void |sv_copypv |NN SV *const dsv|NN SV *const ssv -Amd |void |sv_copypv_nomg |NN SV *const dsv|NN SV *const ssv -Apd |void |sv_copypv_flags |NN SV *const dsv|NN SV *const ssv|const I32 flags -Cpo |char* |my_atof2 |NN const char *orig|NN NV* value -Cp |char* |my_atof3 |NN const char *orig|NN NV* value|const STRLEN len -CpdT |int |my_socketpair |int family|int type|int protocol|int fd[2] -ApTd |int |my_dirfd |NULLOK DIR* dir -#ifdef PERL_ANY_COW -: Used in regexec.c -pxXE |SV* |sv_setsv_cow |NULLOK SV* dsv|NN SV* ssv +#if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C) +Tp |bool |translate_substr_offsets \ + |STRLEN curlen \ + |IV pos1_iv \ + |bool pos1_is_uv \ + |IV len_iv \ + |bool len_is_uv \ + |NN STRLEN *posp \ + |NN STRLEN *lenp #endif - -Cop |const char *|PerlIO_context_layers|NULLOK const char *mode - -#if defined(USE_PERLIO) -Apdh |void |PerlIO_clearerr |NULLOK PerlIO *f -Apdh |int |PerlIO_close |NULLOK PerlIO *f -Apdh |int |PerlIO_eof |NULLOK PerlIO *f -Apdh |int |PerlIO_error |NULLOK PerlIO *f -Apdh |int |PerlIO_fileno |NULLOK PerlIO *f -Apd |int |PerlIO_fill |NULLOK PerlIO *f -Apdh |int |PerlIO_flush |NULLOK PerlIO *f -Apdh |STDCHAR *|PerlIO_get_base |NULLOK PerlIO *f -ApRdh |SSize_t |PerlIO_get_bufsiz |NULLOK PerlIO *f -ApRdh |SSize_t |PerlIO_get_cnt |NULLOK PerlIO *f -Apdh |STDCHAR *|PerlIO_get_ptr |NULLOK PerlIO *f -Apdh |SSize_t|PerlIO_read |NULLOK PerlIO *f|NN void *vbuf \ - |Size_t count -Xp |void |PerlIO_restore_errno |NULLOK PerlIO *f -Xp |void |PerlIO_save_errno |NULLOK PerlIO *f -Apdh |int |PerlIO_seek |NULLOK PerlIO *f|Off_t offset|int whence -Apdh |void |PerlIO_set_cnt |NULLOK PerlIO *f|SSize_t cnt -Apdh |void |PerlIO_setlinebuf |NULLOK PerlIO *f -Apdh |void |PerlIO_set_ptrcnt |NULLOK PerlIO *f|NULLOK STDCHAR *ptr \ - |SSize_t cnt -ApRdh |PerlIO *|PerlIO_stderr -ApRdh |PerlIO *|PerlIO_stdin -ApRdh |PerlIO *|PerlIO_stdout -Apdh |Off_t |PerlIO_tell |NULLOK PerlIO *f -Apd |SSize_t|PerlIO_unread |NULLOK PerlIO *f|NN const void *vbuf \ - |Size_t count -Apdh |SSize_t|PerlIO_write |NULLOK PerlIO *f|NN const void *vbuf \ - |Size_t count -#endif /* USE_PERLIO */ - -: Only used in dump.c -p |void |deb_stack_all -#if defined(PERL_IN_DEB_C) -S |void |deb_stack_n |NN SV** stack_base|I32 stack_min \ - |I32 stack_max|I32 mark_min|I32 mark_max +#if defined(PERL_IN_MRO_C) +S |void |mro_clean_isarev \ + |NN HV * const isa \ + |NN const char * const name \ + |const STRLEN len \ + |NULLOK HV * const exceptions \ + |U32 hash \ + |U32 flags +S |void |mro_gather_and_rename \ + |NN HV * const stashes \ + |NN HV * const seen_stashes \ + |NULLOK HV *stash \ + |NULLOK HV *oldstash \ + |NN SV *namesv +Sd |AV * |mro_get_linear_isa_dfs \ + |NN HV *stash \ + |U32 level +#endif +#if defined(PERL_IN_NUMERIC_C) +S |void |output_non_portable \ + |const U8 shift #endif - -: pad API -ApdR |PADLIST*|pad_new |int flags -#ifdef DEBUGGING -pTX |void|set_padlist| NN CV * cv | NULLOK PADLIST * padlist +#if defined(PERL_IN_OP_C) +S |void |apply_attrs |NN HV *stash \ + |NN SV *target \ + |NULLOK OP *attrs +S |void |apply_attrs_my |NN HV *stash \ + |NN OP *target \ + |NULLOK OP *attrs \ + |NN OP **imopsp +RS |I32 |assignment_type|NULLOK const OP *o +S |void |bad_type_gv |I32 n \ + |NN GV *gv \ + |NN const OP *kid \ + |NN const char *t +S |void |bad_type_pv |I32 n \ + |NN const char *t \ + |NN const OP *o \ + |NN const OP *kid +S |void |clear_special_blocks \ + |NN const char * const fullname \ + |NN GV * const gv \ + |NN CV * const cv +S |void |cop_free |NN COP *cop +S |OP * |dup_attrlist |NN OP *o +S |void |find_and_forget_pmops \ + |NN OP *o +: FIXME +S |OP * |fold_constants |NN OP * const o +S |OP * |force_list |NULLOK OP *arg \ + |bool nullit +S |void |forget_pmop |NN PMOP * const o +S |void |gen_constant_list \ + |NULLOK OP *o +S |void |inplace_aassign|NN OP *o +RST |bool |is_handle_constructor \ + |NN const OP *o \ + |I32 numargs +S |OP * |listkids |NULLOK OP *o +S |bool |looks_like_bool|NN const OP *o +S |OP * |modkids |NULLOK OP *o \ + |I32 type +S |void |move_proto_attr|NN OP **proto \ + |NN OP **attrs \ + |NN const GV *name \ + |bool curstash +S |OP * |my_kid |NULLOK OP *o \ + |NULLOK OP *attrs \ + |NN OP **imopsp +S |OP * |newGIVWHENOP |NULLOK OP *cond \ + |NN OP *block \ + |I32 enter_opcode \ + |I32 leave_opcode \ + |PADOFFSET entertarg +RS |OP * |new_logop |I32 type \ + |I32 flags \ + |NN OP **firstp \ + |NN OP **otherp +i |OP * |newMETHOP_internal \ + |I32 type \ + |I32 flags \ + |NULLOK OP *dynamic_meth \ + |NULLOK SV * const_meth +RS |OP * |no_fh_allowed |NN OP *o +i |OP * |op_integerize |NN OP *o +i |OP * |op_std_init |NN OP *o +S |OP * |pmtrans |NN OP *o \ + |NN OP *expr \ + |NN OP *repl +S |bool |process_special_blocks \ + |I32 floor \ + |NN const char * const fullname \ + |NN GV * const gv \ + |NN CV * const cv +S |OP * |ref_array_or_hash \ + |NULLOK OP *cond +S |OP * |refkids |NULLOK OP *o \ + |I32 type +S |OP * |scalarboolean |NN OP *o +S |OP * |scalarkids |NULLOK OP *o +RST |bool |scalar_mod_type|NULLOK const OP *o \ + |I32 type +RS |OP * |search_const |NN OP *o +S |void |simplify_sort |NN OP *o +RS |OP * |too_few_arguments_pv \ + |NN OP *o \ + |NN const char *name \ + |U32 flags +S |OP * |too_many_arguments_pv \ + |NN OP *o \ + |NN const char *name \ + |U32 flags +S |OP * |voidnonfinal |NULLOK OP *o +#endif /* defined(PERL_IN_OP_C) */ +#if defined(PERL_IN_OP_C) || defined(PERL_IN_PAD_C) +Ti |bool |PadnameIN_SCOPE|NN const PADNAME * const pn \ + |const U32 seq +#endif +#if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C) +p |void |check_hash_fields_and_hekify \ + |NULLOK UNOP *rop \ + |NULLOK SVOP *key_op \ + |int real +p |void |no_bareword_allowed \ + |NN OP *o +Tp |void |op_prune_chain_head \ + |NN OP **op_p +p |SV * |op_varname |NN const OP *o +p |void |warn_elem_scalar_context \ + |NN const OP *o \ + |NN SV *name \ + |bool is_hash \ + |bool is_slice +#endif +#if defined(PERL_IN_OP_C) || defined(PERL_IN_REGCOMP_ANY) +ERTi |STRLEN *|get_invlist_iter_addr \ + |NN SV *invlist +ETi |void |invlist_iterfinish \ + |NN SV *invlist +ETi |void |invlist_iterinit \ + |NN SV *invlist +ERTi |bool |invlist_iternext \ + |NN SV *invlist \ + |NN UV *start \ + |NN UV *end #endif -#if defined(PERL_IN_PAD_C) -Sd |PADOFFSET|pad_alloc_name|NN PADNAME *name|U32 flags \ - |NULLOK HV *typestash|NULLOK HV *ourstash +#if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C) +p |void |report_redefined_cv \ + |NN const SV *name \ + |NN const CV *old_cv \ + |NULLOK SV * const *new_const_svp +Rp |SV * |varname |NULLOK const GV * const gv \ + |const char gvtype \ + |PADOFFSET targ \ + |NULLOK const SV * const keyname \ + |SSize_t aindex \ + |int subscript_type #endif -Apd |PADOFFSET|pad_add_name_pvn|NN const char *namepv|STRLEN namelen\ - |U32 flags|NULLOK HV *typestash\ - |NULLOK HV *ourstash -Apd |PADOFFSET|pad_add_name_pv|NN const char *name\ - |const U32 flags|NULLOK HV *typestash\ - |NULLOK HV *ourstash -Apd |PADOFFSET|pad_add_name_sv|NN SV *name\ - |U32 flags|NULLOK HV *typestash\ - |NULLOK HV *ourstash -Axpd |PADOFFSET|pad_alloc |I32 optype|U32 tmptype -Apd |PADOFFSET|pad_add_anon |NN CV* func|I32 optype -p |void |pad_add_weakref|NN CV* func #if defined(PERL_IN_PAD_C) -Sd |void |pad_check_dup |NN PADNAME *name|U32 flags \ +Sd |PADOFFSET|pad_alloc_name \ + |NN PADNAME *name \ + |U32 flags \ + |NULLOK HV *typestash \ + |NULLOK HV *ourstash +Sd |void |pad_check_dup |NN PADNAME *name \ + |U32 flags \ |NULLOK const HV *ourstash -#endif -Apd |PADOFFSET|pad_findmy_pvn|NN const char* namepv|STRLEN namelen|U32 flags -Apd |PADOFFSET|pad_findmy_pv|NN const char* name|U32 flags -Apd |PADOFFSET|pad_findmy_sv|NN SV* name|U32 flags -ApdD |PADOFFSET|find_rundefsvoffset | -Apd |SV* |find_rundefsv | -#if defined(PERL_IN_PAD_C) -Sd |PADOFFSET|pad_findlex |NN const char *namepv|STRLEN namelen|U32 flags \ - |NN const CV* cv|U32 seq|int warn \ - |NULLOK SV** out_capture \ - |NN PADNAME** out_name|NN int *out_flags -#endif -#ifdef DEBUGGING -Cpd |SV* |pad_sv |PADOFFSET po -Cpd |void |pad_setsv |PADOFFSET po|NN SV* sv -#endif -pd |void |pad_block_start|int full -Apd |U32 |intro_my -pd |OP * |pad_leavemy -pd |void |pad_swipe |PADOFFSET po|bool refadjust -#if defined(PERL_IN_PAD_C) +Sd |PADOFFSET|pad_findlex |NN const char *namepv \ + |STRLEN namelen \ + |U32 flags \ + |NN const CV *cv \ + |U32 seq \ + |int warn \ + |NULLOK SV **out_capture \ + |NN PADNAME **out_name \ + |NN int *out_flags Sd |void |pad_reset +# if defined(DEBUGGING) +Sd |void |cv_dump |NN const CV *cv \ + |NN const char *title +# endif #endif -Axpd |void |pad_tidy |padtidy_type type -pd |void |pad_free |PADOFFSET po -pd |void |do_dump_pad |I32 level|NN PerlIO *file|NULLOK PADLIST *padlist|int full -#if defined(PERL_IN_PAD_C) -# if defined(DEBUGGING) -Sd |void |cv_dump |NN const CV *cv|NN const char *title -# endif -#endif -#if defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C) -iT |bool |PadnameIN_SCOPE|NN const PADNAME * const pn|const U32 seq -#endif -Apd |CV* |cv_clone |NN CV* proto -p |CV* |cv_clone_into |NN CV* proto|NN CV *target -pd |void |pad_fixup_inner_anons|NN PADLIST *padlist|NN CV *old_cv|NN CV *new_cv -pdX |void |pad_push |NN PADLIST *padlist|int depth -ApbdDR |HV* |pad_compname_type|const PADOFFSET po -AxpdRT |PADNAME *|padnamelist_fetch|NN PADNAMELIST *pnl|SSize_t key -Xop |void |padnamelist_free|NN PADNAMELIST *pnl -Axpd |PADNAME **|padnamelist_store|NN PADNAMELIST *pnl|SSize_t key \ - |NULLOK PADNAME *val -Xop |void |padname_free |NN PADNAME *pn -#if defined(USE_ITHREADS) -pdR |PADNAME *|padname_dup |NN PADNAME *src|NN CLONE_PARAMS *param -pdR |PADNAMELIST *|padnamelist_dup|NN PADNAMELIST *srcpad \ - |NN CLONE_PARAMS *param -pdR |PADLIST *|padlist_dup |NN PADLIST *srcpad \ - |NN CLONE_PARAMS *param -#endif -p |PAD ** |padlist_store |NN PADLIST *padlist|I32 key \ - |NULLOK PAD *val - -ApdR |CV* |find_runcv |NULLOK U32 *db_seqp -pR |CV* |find_runcv_where|U8 cond|IV arg \ - |NULLOK U32 *db_seqp -: Only used in perl.c -p |void |free_tied_hv_pool -#if defined(DEBUGGING) -: Used in mg.c -pR |int |get_debug_opts |NN const char **s|bool givehelp +#if defined(PERL_IN_PEEP_C) +S |void |finalize_op |NN OP *o +S |void |optimize_op |NN OP *o +Sd |OP * |traverse_op_tree \ + |NN OP *top \ + |NN OP *o #endif -Cpd |void |save_set_svflags|NN SV *sv|U32 mask|U32 val -#ifdef DEBUGGING -Apod |void |hv_assert |NN HV *hv -#endif - -ApdR |SV* |hv_scalar |NN HV *hv -p |void |hv_pushkv |NN HV *hv|U32 flags -ApdRx |SV* |hv_bucket_ratio|NN HV *hv -CpdoR |I32* |hv_riter_p |NN HV *hv -CpdoR |HE** |hv_eiter_p |NN HV *hv -Cpdo |void |hv_riter_set |NN HV *hv|I32 riter -Cpdo |void |hv_eiter_set |NN HV *hv|NULLOK HE *eiter -Cp |void |hv_rand_set |NN HV *hv|U32 new_xhv_rand -Ap |void |hv_name_set |NN HV *hv|NULLOK const char *name|U32 len|U32 flags -pd |void |hv_ename_add |NN HV *hv|NN const char *name|U32 len \ +#if defined(PERL_IN_PERL_C) +S |void |find_beginning |NN SV *linestr_sv \ + |NN PerlIO *rsfp +S |void |forbid_setid |const char flag \ + |const bool suidscript +S |void |incpush |NN const char * const dir \ + |STRLEN len \ |U32 flags -pd |void |hv_ename_delete|NN HV *hv|NN const char *name|U32 len \ +S |void |incpush_use_sep|NN const char *p \ + |STRLEN len \ |U32 flags -: Used in dump.c and hv.c -pox |AV** |hv_backreferences_p |NN HV *hv -#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_SCOPE_C) -pox |void |hv_kill_backrefs |NN HV *hv -#endif -Apd |void |hv_clear_placeholders |NN HV *hv -XpoR |SSize_t*|hv_placeholders_p |NN HV *hv -CpdoR |I32 |hv_placeholders_get |NN const HV *hv -Cpdo |void |hv_placeholders_set |NN HV *hv|I32 ph - -: This is indirectly referenced by globals.c. This is somewhat annoying. -p |SV* |magic_scalarpack|NN HV *hv|NN MAGIC *mg +S |void |init_ids +S |void |init_interp +S |void |init_main_stash +S |void |init_perllib +S |void |init_postdump_symbols \ + |int argc \ + |NN char **argv \ + |NULLOK char **env +S |void |init_predump_symbols +S |SV * |mayberelocate |NN const char * const dir \ + |STRLEN len \ + |U32 flags +Sr |void |minus_v +Sr |void |my_exit_jump +S |void |nuke_stacks +S |PerlIO *|open_script |NN const char *scriptname \ + |bool dosearch \ + |NN bool *suidscript -#if defined(PERL_IN_SV_C) -S |SV * |find_hash_subscript|NULLOK const HV *const hv \ - |NN const SV *const val -S |SSize_t|find_array_subscript|NULLOK const AV *const av \ - |NN const SV *const val -Sxd |SV* |find_uninit_var|NULLOK const OP *const obase \ - |NULLOK const SV *const uninit_sv|bool match \ - |NN const char **desc_p +S |void * |parse_body |NULLOK char **env \ + |XSINIT_t xsinit +Sr |void |run_body |I32 oldscope +Sr |void |usage +# if !defined(PERL_IS_MINIPERL) +S |SV * |incpush_if_exists \ + |NN AV * const av \ + |NN SV *dir \ + |NN SV * const stem +# endif +# if !defined(SETUID_SCRIPTS_ARE_SECURE_NOW) +So |void |validate_suid |NN PerlIO *rsfp +# endif +#endif /* defined(PERL_IN_PERL_C) */ +#if defined(PERL_IN_PERL_C) || defined(PERL_IN_REGCOMP_ANY) || \ + defined(PERL_IN_UTF8_C) +EXp |bool |_invlistEQ |NN SV * const a \ + |NN SV * const b \ + |const bool complement_b +ERXp |SV * |_new_invlist_C_array \ + |NN const UV * const list #endif - -Adp |GV* |gv_fetchpvn_flags|NN const char* name|STRLEN len|I32 flags|const svtype sv_type -Adp |GV* |gv_fetchsv|NN SV *name|I32 flags|const svtype sv_type - -#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP -: Used in sv.c -p |void |dump_sv_child |NN SV *sv +#if defined(PERL_IN_PP_C) +S |size_t |do_chomp |NN SV *retval \ + |NN SV *sv \ + |bool chomping +S |OP * |do_delete_local +RS |SV * |refto |NN SV *sv #endif - -#ifdef PERL_DONT_CREATE_GVSV -ApdbM |GV* |gv_SVadd |NULLOK GV *gv +#if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C) +RTi |bool |lossless_NV_to_IV \ + |const NV nv \ + |NN IV *ivp +: Used in pp_hot.c +Reop |GV * |softref2xv |NN SV * const sv \ + |NN const char * const what \ + |const svtype type \ + |NN SV ***spp +#endif +#if defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || \ + defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C) +ETi |const char *|get_regex_charset_name \ + |const U32 flags \ + |NN STRLEN * const lenp +#endif +#if defined(PERL_IN_PP_C) || defined(PERL_IN_UTF8_C) +p |UV |_to_upper_title_latin1 \ + |const U8 c \ + |NN U8 *p \ + |NN STRLEN *lenp \ + |const char S_or_s #endif -#if defined(PERL_IN_UTIL_C) -S |bool |ckwarn_common |U32 w +#if defined(PERL_IN_PP_CTL_C) +RS |PerlIO *|check_type_and_open \ + |NN SV *name +S |void |destroy_matcher|NN PMOP *matcher +RSd |OP * |docatch |Perl_ppaddr_t firstpp +S |bool |doeval_compile |U8 gimme \ + |NULLOK CV *outside \ + |U32 seq \ + |NULLOK HV *hh +RS |OP * |dofindlabel |NN OP *o \ + |NN const char *label \ + |STRLEN len \ + |U32 flags \ + |NN OP **opstack \ + |NN OP **oplimit +S |MAGIC *|doparseform |NN SV *sv +RS |I32 |dopoptoeval |I32 startingblock +RS |I32 |dopoptogivenfor|I32 startingblock +RS |I32 |dopoptolabel |NN const char *label \ + |STRLEN len \ + |U32 flags +RS |I32 |dopoptoloop |I32 startingblock +RS |I32 |dopoptosub_at |NN const PERL_CONTEXT *cxstk \ + |I32 startingblock +RS |I32 |dopoptowhen |I32 startingblock +S |OP * |do_smartmatch |NULLOK HV *seen_this \ + |NULLOK HV *seen_other \ + |const bool copied +RS |PMOP * |make_matcher |NN REGEXP *re +RS |bool |matcher_matches_sv \ + |NN PMOP *matcher \ + |NN SV *sv +RST |bool |num_overflow |NV value \ + |I32 fldsize \ + |I32 frcsize +RTi |bool |path_is_searchable \ + |NN const char *name +RS |I32 |run_user_filter|int idx \ + |NN SV *buf_sv \ + |int maxlen +S |void |rxres_free |NN void **rsp +S |void |rxres_restore |NN void **rsp \ + |NN REGEXP *rx +S |void |save_lines |NULLOK AV *array \ + |NN SV *sv +# if !defined(PERL_DISABLE_PMC) +RS |PerlIO *|doopen_pm |NN SV *name +# endif +#endif /* defined(PERL_IN_PP_CTL_C) */ +#if defined(PERL_IN_PP_CTL_C) || defined(PERL_IN_UTIL_C) +p |bool |invoke_exception_hook \ + |NULLOK SV *ex \ + |bool warn #endif -CpoP |bool |ckwarn |U32 w -CpoP |bool |ckwarn_d |U32 w -: FIXME - exported for ByteLoader - public or private? -XEopxR |STRLEN *|new_warnings_bitfield|NULLOK STRLEN *buffer \ - |NN const char *const bits|STRLEN size - -AMpTdf |int |my_snprintf |NN char *buffer|const Size_t len|NN const char *format|... -AMpTd |int |my_vsnprintf |NN char *buffer|const Size_t len|NN const char *format|va_list ap -#ifdef USE_QUADMATH -pTd |bool |quadmath_format_valid|NN const char* format -pTd |bool|quadmath_format_needed|NN const char* format +#if defined(PERL_IN_PP_HOT_C) +S |void |do_oddball |NN SV **oddkey \ + |NN SV **firstkey +i |HV * |opmethod_stash |NN SV *meth +IR |bool |should_we_output_Debug_r \ + |NN regexp *prog #endif - -: Used in mg.c, sv.c -pe |void |my_clearenv - -#ifdef MULTIPLICITY -Cpod |void* |my_cxt_init |NN int *indexp|size_t size +#if defined(PERL_IN_PP_PACK_C) +S |int |div128 |NN SV *pnum \ + |NN bool *done +ST |char |first_symbol |NN const char *pat \ + |NN const char *patend +RS |const char *|get_num |NN const char *patptr \ + |NN SSize_t *lenptr +S |const char *|group_end |NN const char *patptr \ + |NN const char *patend \ + |char ender +RS |SV * |is_an_int |NN const char *s \ + |STRLEN l +S |SSize_t|measure_struct |NN struct tempsym *symptr +S |SV * |mul128 |NN SV *sv \ + |U8 m +RST |char * |my_bytes_to_utf8 \ + |NN const U8 *start \ + |STRLEN len \ + |NN char *dest \ + |const bool needs_swap +ST |bool |need_utf8 |NN const char *pat \ + |NN const char *patend +S |bool |next_symbol |NN struct tempsym *symptr +S |SV ** |pack_rec |NN SV *cat \ + |NN struct tempsym *symptr \ + |NN SV **beglist \ + |NN SV **endlist +RS |char * |sv_exp_grow |NN SV *sv \ + |STRLEN needed +S |SSize_t|unpack_rec |NN struct tempsym *symptr \ + |NN const char *s \ + |NN const char *strbeg \ + |NN const char *strend \ + |NULLOK const char **new_s +#endif /* defined(PERL_IN_PP_PACK_C) */ +#if defined(PERL_IN_PP_SORT_C) +i |I32 |amagic_cmp |NN SV * const str1 \ + |NN SV * const str2 +i |I32 |amagic_cmp_desc|NN SV * const str1 \ + |NN SV * const str2 +i |I32 |amagic_i_ncmp |NN SV * const a \ + |NN SV * const b +i |I32 |amagic_i_ncmp_desc \ + |NN SV * const a \ + |NN SV * const b +i |I32 |amagic_ncmp |NN SV * const a \ + |NN SV * const b +i |I32 |amagic_ncmp_desc \ + |NN SV * const a \ + |NN SV * const b +i |I32 |cmp_desc |NN SV * const str1 \ + |NN SV * const str2 +S |I32 |sortcv |NN SV * const a \ + |NN SV * const b +S |I32 |sortcv_stacked |NN SV * const a \ + |NN SV * const b +S |I32 |sortcv_xsub |NN SV * const a \ + |NN SV * const b +I |void |sortsv_flags_impl \ + |NULLOK SV **array \ + |size_t num_elts \ + |NN SVCOMPARE_t cmp \ + |U32 flags +i |I32 |sv_i_ncmp |NN SV * const a \ + |NN SV * const b +i |I32 |sv_i_ncmp_desc |NN SV * const a \ + |NN SV * const b +i |I32 |sv_ncmp |NN SV * const a \ + |NN SV * const b +i |I32 |sv_ncmp_desc |NN SV * const a \ + |NN SV * const b +# if defined(USE_LOCALE_COLLATE) +i |I32 |amagic_cmp_locale \ + |NN SV * const str1 \ + |NN SV * const str2 +i |I32 |amagic_cmp_locale_desc \ + |NN SV * const str1 \ + |NN SV * const str2 +i |I32 |cmp_locale_desc|NN SV * const str1 \ + |NN SV * const str2 +# endif +#endif /* defined(PERL_IN_PP_SORT_C) */ +#if defined(PERL_IN_PP_SYS_C) +S |OP * |doform |NN CV *cv \ + |NN GV *gv \ + |NULLOK OP *retop +S |SV * |space_join_names_mortal \ + |NULLOK char * const *array +# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR) +RS |int |dooneliner |NN const char *cmd \ + |NN const char *filename +# endif #endif -#if defined(PERL_IN_UTIL_C) -So |void |xs_version_bootcheck|U32 items|U32 ax|NN const char *xs_p \ - |STRLEN xs_len +#if defined(PERL_IN_REGCOMP_ANY) +Ep |void |add_above_Latin1_folds \ + |NN RExC_state_t *pRExC_state \ + |const U8 cp \ + |NN SV **invlist +Ep |regnode *|construct_ahocorasick_from_trie \ + |NN RExC_state_t *pRExC_state \ + |NN regnode *source \ + |U32 depth +ERp |SV * |get_ANYOFHbbm_contents \ + |NN const regnode *n +ERp |SV * |get_ANYOFM_contents \ + |NN const regnode *n +ERi |SV * |invlist_contents \ + |NN SV * const invlist \ + |const bool traditional_style +ERTix |UV |invlist_highest_range_start \ + |NN SV * const invlist +ERTi |bool |invlist_is_iterating \ + |NN const SV * const invlist +ERTix |UV |invlist_lowest |NN SV * const invlist +ETp |bool |is_ssc_worth_it|NN const RExC_state_t *pRExC_state \ + |NN const regnode_ssc *ssc +Ep |U32 |join_exact |NN RExC_state_t *pRExC_state \ + |NN regnode *scan \ + |NN UV *min_subtract \ + |NN bool *unfolded_multi_char \ + |U32 flags \ + |NULLOK regnode *val \ + |U32 depth +Ep |I32 |make_trie |NN RExC_state_t *pRExC_state \ + |NN regnode *startbranch \ + |NN regnode *first \ + |NN regnode *last \ + |NN regnode *tail \ + |U32 word_count \ + |U32 flags \ + |U32 depth +Ep |void |populate_anyof_bitmap_from_invlist \ + |NN regnode *node \ + |NN SV **invlist_ptr +ERTp |U32 |reg_add_data |NN RExC_state_t * const pRExC_state \ + |NN const char * const s \ + |const U32 n +Ep |void |scan_commit |NN const RExC_state_t *pRExC_state \ + |NN struct scan_data_t *data \ + |NN SSize_t *minlenp \ + |int is_inf +Ep |void |set_ANYOF_arg |NN RExC_state_t * const pRExC_state \ + |NN regnode * const node \ + |NULLOK SV * const cp_list \ + |NULLOK SV * const runtime_defns \ + |NULLOK SV * const only_utf8_locale_list +Ep |void |ssc_finalize |NN RExC_state_t *pRExC_state \ + |NN regnode_ssc *ssc +Ep |void |ssc_init |NN const RExC_state_t *pRExC_state \ + |NN regnode_ssc *ssc +Ep |SSize_t|study_chunk |NN RExC_state_t *pRExC_state \ + |NN regnode **scanp \ + |NN SSize_t *minlenp \ + |NN SSize_t *deltap \ + |NN regnode *last \ + |NULLOK struct scan_data_t *data \ + |I32 stopparen \ + |U32 recursed_depth \ + |NULLOK regnode_ssc *and_withp \ + |U32 flags \ + |U32 depth \ + |bool was_mutate_ok +# if defined(PERL_IN_REGCOMP_TRIE_C) && defined(DEBUGGING) +ES |void |dump_trie |NN const struct _reg_trie_data *trie \ + |NULLOK HV *widecharmap \ + |NN AV *revcharmap \ + |U32 depth +ES |void |dump_trie_interim_list \ + |NN const struct _reg_trie_data *trie \ + |NULLOK HV *widecharmap \ + |NN AV *revcharmap \ + |U32 next_alloc \ + |U32 depth +ES |void |dump_trie_interim_table \ + |NN const struct _reg_trie_data *trie \ + |NULLOK HV *widecharmap \ + |NN AV *revcharmap \ + |U32 next_alloc \ + |U32 depth +# endif +#endif /* defined(PERL_IN_REGCOMP_ANY) */ +#if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_SV_C) +EXp |SV * |invlist_clone |NN SV * const invlist \ + |NULLOK SV *newlist +#endif +#if defined(PERL_IN_REGCOMP_C) +ES |AV * |add_multi_match|NULLOK AV *multi_char_matches \ + |NN SV *multi_string \ + |const STRLEN cp_count +ES |void |change_engine_size \ + |NN RExC_state_t *pRExC_state \ + |const Ptrdiff_t size +ERS |REGEXP *|compile_wildcard \ + |NN const char *subpattern \ + |const STRLEN len \ + |const bool ignore_case +EST |U8 |compute_EXACTish \ + |NN RExC_state_t *pRExC_state +ERST |int |edit_distance |NN const UV *src \ + |NN const UV *tgt \ + |const STRLEN x \ + |const STRLEN y \ + |const SSize_t maxDistance +ES |I32 |execute_wildcard \ + |NN REGEXP * const prog \ + |NN char *stringarg \ + |NN char *strend \ + |NN char *strbeg \ + |SSize_t minend \ + |NN SV *screamer \ + |U32 nosave +ETi |Size_t |find_first_differing_byte_pos \ + |NN const U8 *s1 \ + |NN const U8 *s2 \ + |const Size_t max +ES |U32 |get_quantifier_value \ + |NN RExC_state_t *pRExC_state \ + |NN const char *start \ + |NN const char *end +ES |bool |grok_bslash_N |NN RExC_state_t *pRExC_state \ + |NULLOK regnode_offset *nodep \ + |NULLOK UV *code_point_p \ + |NULLOK int *cp_count \ + |NN I32 *flagp \ + |const bool strict \ + |const U32 depth +ES |regnode_offset|handle_named_backref \ + |NN RExC_state_t *pRExC_state \ + |NN I32 *flagp \ + |NN char *backref_parse_start \ + |char ch +ES |bool |handle_names_wildcard \ + |NN const char *wname \ + |const STRLEN wname_len \ + |NN SV **prop_definition \ + |NN AV **strings +ES |int |handle_possible_posix \ + |NN RExC_state_t *pRExC_state \ + |NN const char * const s \ + |NULLOK char **updated_parse_ptr \ + |NULLOK AV **posix_warnings \ + |const bool check_only +ES |regnode_offset|handle_regex_sets \ + |NN RExC_state_t *pRExC_state \ + |NULLOK SV **return_invlist \ + |NN I32 *flagp \ + |U32 depth +ES |SV * |handle_user_defined_property \ + |NN const char *name \ + |const STRLEN name_len \ + |const bool is_utf8 \ + |const bool to_fold \ + |const bool runtime \ + |const bool deferrable \ + |NN SV *contents \ + |NN bool *user_defined_ptr \ + |NN SV *msg \ + |const STRLEN level +ES |void |nextchar |NN RExC_state_t *pRExC_state +ES |U8 |optimize_regclass \ + |NN RExC_state_t *pRExC_state \ + |NULLOK SV *cp_list \ + |NULLOK SV *only_utf8_locale_list \ + |NULLOK SV *upper_latin1_only_utf8_matches \ + |const U32 has_runtime_dependency \ + |const U32 posixl \ + |NN U8 *anyof_flags \ + |NN bool *invert \ + |NN regnode_offset *ret \ + |NN I32 *flagp +ES |void |output_posix_warnings \ + |NN RExC_state_t *pRExC_state \ + |NN AV *posix_warnings +ES |void |parse_lparen_question_flags \ + |NN RExC_state_t *pRExC_state +ES |SV * |parse_uniprop_string \ + |NN const char * const name \ + |Size_t name_len \ + |const bool is_utf8 \ + |const bool to_fold \ + |const bool runtime \ + |const bool deferrable \ + |NULLOK AV **strings \ + |NN bool *user_defined_ptr \ + |NN SV *msg \ + |const STRLEN level +Sfr |void |re_croak |bool utf8 \ + |NN const char *pat \ + |... +ES |regnode_offset|reg |NN RExC_state_t *pRExC_state \ + |I32 paren \ + |NN I32 *flagp \ + |U32 depth +ES |regnode_offset|regatom |NN RExC_state_t *pRExC_state \ + |NN I32 *flagp \ + |U32 depth +ES |regnode_offset|regbranch \ + |NN RExC_state_t *pRExC_state \ + |NN I32 *flagp \ + |I32 first \ + |U32 depth +ES |regnode_offset|regclass|NN RExC_state_t *pRExC_state \ + |NN I32 *flagp \ + |U32 depth \ + |const bool stop_at_1 \ + |bool allow_multi_fold \ + |const bool silence_non_portable \ + |const bool strict \ + |bool optimizable \ + |NULLOK SV **ret_invlist +ERST |unsigned int|regex_set_precedence \ + |const U8 my_operator +ES |void |reginsert |NN RExC_state_t *pRExC_state \ + |const U8 op \ + |const regnode_offset operand \ + |const U32 depth +ES |regnode_offset|reg_la_NOTHING \ + |NN RExC_state_t *pRExC_state \ + |U32 flags \ + |NN const char *type +ES |regnode_offset|reg_la_OPFAIL \ + |NN RExC_state_t *pRExC_state \ + |U32 flags \ + |NN const char *type +ES |regnode_offset|reg1node|NN RExC_state_t *pRExC_state \ + |U8 op \ + |U32 arg +ES |regnode_offset|reg2node|NN RExC_state_t *pRExC_state \ + |const U8 op \ + |const U32 arg1 \ + |const I32 arg2 +ES |regnode_offset|reg_node|NN RExC_state_t *pRExC_state \ + |U8 op +ES |regnode_offset|regnode_guts \ + |NN RExC_state_t *pRExC_state \ + |const STRLEN extra_len +ES |regnode_offset|regpiece|NN RExC_state_t *pRExC_state \ + |NN I32 *flagp \ + |U32 depth +ES |regnode_offset|regpnode|NN RExC_state_t *pRExC_state \ + |U8 op \ + |NN SV *arg +ES |SV * |reg_scan_name |NN RExC_state_t *pRExC_state \ + |U32 flags +ETi |char * |reg_skipcomment|NN RExC_state_t *pRExC_state \ + |NN char *p +ERS |bool |regtail |NN RExC_state_t *pRExC_state \ + |NN const regnode_offset p \ + |NN const regnode_offset val \ + |const U32 depth +ES |void |set_regex_pv |NN RExC_state_t *pRExC_state \ + |NN REGEXP *Rx +ES |void |skip_to_be_ignored_text \ + |NN RExC_state_t *pRExC_state \ + |NN char **p \ + |const bool force_to_xmod +# if defined(DEBUGGING) +ES |regnode_offset|regnode_guts_debug \ + |NN RExC_state_t *pRExC_state \ + |const U8 op \ + |const STRLEN extra_len +ERS |bool |regtail_study |NN RExC_state_t *pRExC_state \ + |NN regnode_offset p \ + |NN const regnode_offset val \ + |U32 depth +# if defined(ENABLE_REGEX_SETS_DEBUGGING) +ES |void |dump_regex_sets_structures \ + |NN RExC_state_t *pRExC_state \ + |NN AV *stack \ + |const IV fence \ + |NN AV *fence_stack +# endif +# endif +#endif /* defined(PERL_IN_REGCOMP_C) */ +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGCOMP_INVLIST_C) +Ep |void |populate_bitmap_from_invlist \ + |NN SV *invlist \ + |const UV offset \ + |NN const U8 *bitmap \ + |const Size_t len +Ep |void |populate_invlist_from_bitmap \ + |NN const U8 *bitmap \ + |const Size_t bitmap_len \ + |NN SV **invlist \ + |const UV offset +#endif +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \ + defined(PERL_IN_TOKE_C) +ERp |bool |is_grapheme |NN const U8 *strbeg \ + |NN const U8 *s \ + |NN const U8 *strend \ + |const UV cp #endif -FXpoT |I32 |xs_handshake |const U32 key|NN void * v_my_perl\ - |NN const char * file| ... -Xp |void |xs_boot_epilog |const I32 ax -#ifndef HAS_STRLCAT -ApTd |Size_t |my_strlcat |NULLOK char *dst|NULLOK const char *src|Size_t size +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \ + defined(PERL_IN_UTF8_C) +ETXp |UV |_to_fold_latin1|const U8 c \ + |NN U8 *p \ + |NN STRLEN *lenp \ + |const unsigned int flags #endif - -#ifndef HAS_STRLCPY -ApTd |Size_t |my_strlcpy |NULLOK char *dst|NULLOK const char *src|Size_t size +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) +ERTXp |bool |regcurly |NN const char *s \ + |NN const char *e \ + |NULLOK const char *result[5] +#endif +#if defined(PERL_IN_REGCOMP_DEBUG_C) && defined(DEBUGGING) +ES |U8 |put_charclass_bitmap_innards \ + |NN SV *sv \ + |NULLOK char *bitmap \ + |NULLOK SV *nonbitmap_invlist \ + |NULLOK SV *only_utf8_locale_invlist \ + |NULLOK const regnode * const node \ + |const U8 flags \ + |const bool force_as_is_display +ES |SV * |put_charclass_bitmap_innards_common \ + |NN SV *invlist \ + |NULLOK SV *posixes \ + |NULLOK SV *only_utf8 \ + |NULLOK SV *not_utf8 \ + |NULLOK SV *only_utf8_locale \ + |const bool invert +ES |void |put_charclass_bitmap_innards_invlist \ + |NN SV *sv \ + |NN SV *invlist +ES |void |put_code_point |NN SV *sv \ + |UV c +ES |void |put_range |NN SV *sv \ + |UV start \ + |const UV end \ + |const bool allow_literals +ES |void |regdump_extflags \ + |NULLOK const char *lead \ + |const U32 flags +ES |void |regdump_intflags \ + |NULLOK const char *lead \ + |const U32 flags #endif +#if defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD) +ES |void |_append_range_to_invlist \ + |NN SV * const invlist \ + |const UV start \ + |const UV end +ERTi |IV * |get_invlist_previous_index_addr \ + |NN SV *invlist +S |void |initialize_invlist_guts \ + |NN SV *invlist \ + |const Size_t initial_size +ERTi |UV * |_invlist_array_init \ + |NN SV * const invlist \ + |const bool will_have_0 +Ei |void |invlist_clear |NN SV *invlist +ERTi |UV |invlist_max |NN const SV * const invlist +ERTi |IV |invlist_previous_index \ + |NN SV * const invlist +ES |void |invlist_replace_list_destroys_src \ + |NN SV *dest \ + |NN SV *src +ETi |void |invlist_set_previous_index \ + |NN SV * const invlist \ + |const IV index +ETi |void |invlist_trim |NN SV *invlist +#endif /* defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD) */ +#if defined(PERL_IN_REGCOMP_STUDY_C) +ES |SV * |get_ANYOF_cp_list_for_ssc \ + |NN const RExC_state_t *pRExC_state \ + |NN const regnode_charclass * const node +ERS |SV * |make_exactf_invlist \ + |NN RExC_state_t *pRExC_state \ + |NN regnode *node +ES |void |rck_elide_nothing \ + |NN regnode *node +ES |void |ssc_add_range |NN regnode_ssc *ssc \ + |UV const start \ + |UV const end +ES |void |ssc_and |NN const RExC_state_t *pRExC_state \ + |NN regnode_ssc *ssc \ + |NN const regnode_charclass *and_with +ES |void |ssc_anything |NN regnode_ssc *ssc +EST |void |ssc_clear_locale \ + |NN regnode_ssc *ssc +ES |void |ssc_cp_and |NN regnode_ssc *ssc \ + |UV const cp +ES |void |ssc_intersection \ + |NN regnode_ssc *ssc \ + |NN SV * const invlist \ + |const bool invert_2nd +ERST |int |ssc_is_anything|NN const regnode_ssc *ssc +ERST |int |ssc_is_cp_posixl_init \ + |NN const RExC_state_t *pRExC_state \ + |NN const regnode_ssc *ssc +ES |void |ssc_or |NN const RExC_state_t *pRExC_state \ + |NN regnode_ssc *ssc \ + |NN const regnode_charclass *or_with +ES |void |ssc_union |NN regnode_ssc *ssc \ + |NN SV * const invlist \ + |const bool invert_2nd +ES |void |unwind_scan_frames \ + |NN const void *p +#endif /* defined(PERL_IN_REGCOMP_STUDY_C) */ +#if defined(PERL_IN_REGEXEC_C) +ERS |LB_enum|advance_one_LB |NN U8 **curpos \ + |NN const U8 * const strend \ + |const bool utf8_target +ERS |SB_enum|advance_one_SB |NN U8 **curpos \ + |NN const U8 * const strend \ + |const bool utf8_target +ERS |WB_enum|advance_one_WB |NN U8 **curpos \ + |NN const U8 * const strend \ + |const bool utf8_target \ + |const bool skip_Extend_Format +ERS |GCB_enum|backup_one_GCB|NN const U8 * const strbeg \ + |NN U8 **curpos \ + |const bool utf8_target +ERS |LB_enum|backup_one_LB |NN const U8 * const strbeg \ + |NN U8 **curpos \ + |const bool utf8_target +ERS |SB_enum|backup_one_SB |NN const U8 * const strbeg \ + |NN U8 **curpos \ + |const bool utf8_target +ERS |WB_enum|backup_one_WB |NN WB_enum *previous \ + |NN const U8 * const strbeg \ + |NN U8 **curpos \ + |const bool utf8_target +EWi |void |capture_clear |NN regexp *rex \ + |U16 from_ix \ + |U16 to_ix \ + |NN const char *str +ERS |char * |find_byclass |NN regexp *prog \ + |NN const regnode *c \ + |NN char *s \ + |NN const char *strend \ + |NULLOK regmatch_info *reginfo +ERST |U8 * |find_next_masked \ + |NN U8 *s \ + |NN const U8 *send \ + |const U8 byte \ + |const U8 mask +ERST |U8 * |find_span_end |NN U8 *s \ + |NN const U8 *send \ + |const U8 span_byte +ERST |U8 * |find_span_end_mask \ + |NN U8 *s \ + |NN const U8 *send \ + |const U8 span_byte \ + |const U8 mask +Ei |I32 |foldEQ_latin1_s2_folded \ + |NN const char *a \ + |NN const char *b \ + |I32 len +ERS |bool |isFOO_lc |const U8 classnum \ + |const U8 character +ERS |bool |isFOO_utf8_lc |const U8 classnum \ + |NN const U8 *character \ + |NN const U8 *e +ERS |bool |isGCB |const GCB_enum before \ + |const GCB_enum after \ + |NN const U8 * const strbeg \ + |NN const U8 * const curpos \ + |const bool utf8_target +ERS |bool |isLB |LB_enum before \ + |LB_enum after \ + |NN const U8 * const strbeg \ + |NN const U8 * const curpos \ + |NN const U8 * const strend \ + |const bool utf8_target +ERS |bool |isSB |SB_enum before \ + |SB_enum after \ + |NN const U8 * const strbeg \ + |NN const U8 * const curpos \ + |NN const U8 * const strend \ + |const bool utf8_target +ERS |bool |isWB |WB_enum previous \ + |WB_enum before \ + |WB_enum after \ + |NN const U8 * const strbeg \ + |NN const U8 * const curpos \ + |NN const U8 * const strend \ + |const bool utf8_target +ERST |I32 |reg_check_named_buff_matched \ + |NN const regexp *rex \ + |NN const regnode *scan +ESW |void |regcppop |NN regexp *rex \ + |NN U32 *maxopenparen_p +ESW |CHECKPOINT|regcppush |NN const regexp *rex \ + |I32 parenfloor \ + |U32 maxopenparen +ESW |void |regcp_restore |NN regexp *rex \ + |I32 ix \ + |NN U32 *maxopenparen_p +ERST |U8 * |reghop3 |NN U8 *s \ + |SSize_t off \ + |NN const U8 *lim +ERST |U8 * |reghop4 |NN U8 *s \ + |SSize_t off \ + |NN const U8 *llim \ + |NN const U8 *rlim +ERST |U8 * |reghopmaybe3 |NN U8 *s \ + |SSize_t off \ + |NN const U8 * const lim +ERS |bool |reginclass |NULLOK regexp * const prog \ + |NN const regnode * const n \ + |NN const U8 * const p \ + |NN const U8 * const p_end \ + |bool const utf8_target +ERS |SSize_t|regmatch |NN regmatch_info *reginfo \ + |NN char *startpos \ + |NN regnode *prog +ERSW |I32 |regrepeat |NN regexp *prog \ + |NN char **startposp \ + |NN const regnode *p \ + |NN char *loceol \ + |NN regmatch_info * const reginfo \ + |NZ I32 max +ERS |bool |regtry |NN regmatch_info *reginfo \ + |NN char **startposp +ES |bool |to_byte_substr |NN regexp *prog +ES |void |to_utf8_substr |NN regexp *prog +EWi |void |unwind_paren |NN regexp *rex \ + |U32 lp \ + |U32 lcp +# if defined(DEBUGGING) +ES |void |debug_start_match \ + |NN const REGEXP *prog \ + |const bool do_utf8 \ + |NN const char *start \ + |NN const char *end \ + |NN const char *blurb +ES |void |dump_exec_pos |NN const char *locinput \ + |NN const regnode *scan \ + |NN const char *loc_regeol \ + |NN const char *loc_bostr \ + |NN const char *loc_reg_starttry \ + |const bool do_utf8 \ + |const U32 depth -#ifndef HAS_STRNLEN -AipTd |Size_t |my_strnlen |NN const char *str|Size_t maxlen +EFp |int |re_exec_indentf|NN const char *fmt \ + |U32 depth \ + |... +# endif +#endif /* defined(PERL_IN_REGEXEC_C) */ +#if defined(PERL_IN_REGEX_ENGINE) +CRip |bool |check_regnode_after \ + |NULLOK const regnode *p \ + |const STRLEN extra +CRip |regnode *|regnext |NULLOK const regnode *p +CRip |regnode *|regnode_after|NULLOK const regnode *p \ + |bool varies +# if defined(DEBUGGING) +Ep |void |debug_peep |NN const char *str \ + |NN const RExC_state_t *pRExC_state \ + |NULLOK regnode *scan \ + |U32 depth \ + |U32 flags +Ep |void |debug_show_study_flags \ + |U32 flags \ + |NN const char *open_str \ + |NN const char *close_str +Ep |void |debug_studydata|NN const char *where \ + |NULLOK scan_data_t *data \ + |U32 depth \ + |int is_inf \ + |SSize_t min \ + |SSize_t stopmin \ + |SSize_t delta +Ep |const regnode *|dumpuntil \ + |NN const regexp *r \ + |NN const regnode *start \ + |NN const regnode *node \ + |NULLOK const regnode *last \ + |NULLOK const regnode *plast \ + |NN SV *sv \ + |I32 indent \ + |U32 depth +Ep |void |regprop |NULLOK const regexp *prog \ + |NN SV *sv \ + |NN const regnode *o \ + |NULLOK const regmatch_info *reginfo \ + |NULLOK const RExC_state_t *pRExC_state +EFp |int |re_indentf |NN const char *fmt \ + |U32 depth \ + |... +Efp |int |re_printf |NN const char *fmt \ + |... +# endif +# if defined(PERL_EXT_RE_BUILD) +Ep |SV * |get_re_gclass_aux_data \ + |NULLOK const regexp *prog \ + |NN const struct regnode *node \ + |bool doinit \ + |NULLOK SV **listsvp \ + |NULLOK SV **lonly_utf8_locale \ + |NULLOK SV **output_invlist +# else +Ep |SV * |get_regclass_aux_data \ + |NULLOK const regexp *prog \ + |NN const struct regnode *node \ + |bool doinit \ + |NULLOK SV **listsvp \ + |NULLOK SV **lonly_utf8_locale \ + |NULLOK SV **output_invlist +# endif +#endif /* defined(PERL_IN_REGEX_ENGINE) */ +#if defined(PERL_IN_SCOPE_C) +S |void |save_pushptri32ptr \ + |NULLOK void * const ptr1 \ + |const I32 i \ + |NULLOK void * const ptr2 \ + |const int type +Sd |SV * |save_scalar_at |NN SV **sptr \ + |const U32 flags #endif - -#ifndef HAS_MKOSTEMP -pTod |int |my_mkostemp |NN char *templte|int flags +#if defined(PERL_IN_SV_C) +S |void |anonymise_cv_maybe \ + |NN GV *gv \ + |NN CV *cv +S |void |assert_uft8_cache_coherent \ + |NN const char * const func \ + |STRLEN from_cache \ + |STRLEN real \ + |NN SV * const sv +S |bool |curse |NN SV * const sv \ + |const bool check_refcnt +RS |STRLEN |expect_number |NN const char ** const pattern +ST |char * |F0convert |NV nv \ + |NN char * const endbuf \ + |NN STRLEN * const len +S |SSize_t|find_array_subscript \ + |NULLOK const AV * const av \ + |NN const SV * const val +S |SV * |find_hash_subscript \ + |NULLOK const HV * const hv \ + |NN const SV * const val +Sdx |SV * |find_uninit_var|NULLOK const OP * const obase \ + |NULLOK const SV * const uninit_sv \ + |bool match \ + |NN const char **desc_p +S |void |glob_assign_glob \ + |NN SV * const dsv \ + |NN SV * const ssv \ + |const int dtype +S |bool |glob_2number |NN GV * const gv +Cp |SV * |more_sv +S |void |not_a_number |NN SV * const sv +S |void |not_incrementable \ + |NN SV * const sv +RST |PTR_TBL_ENT_t *|ptr_table_find \ + |NN PTR_TBL_t * const tbl \ + |NULLOK const void * const sv +Sd |void |sv_add_arena |NN char * const ptr \ + |const U32 size \ + |const U32 flags +S |const char *|sv_display|NN SV * const sv \ + |NN char *tmpbuf \ + |STRLEN tmpbuf_size +S |bool |sv_2iuv_common |NN SV * const sv +S |STRLEN |sv_pos_b2u_midway \ + |NN const U8 * const s \ + |NN const U8 * const target \ + |NN const U8 *end \ + |STRLEN endu +S |STRLEN |sv_pos_u2b_cached \ + |NN SV * const sv \ + |NN MAGIC ** const mgp \ + |NN const U8 * const start \ + |NN const U8 * const send \ + |STRLEN uoffset \ + |STRLEN uoffset0 \ + |STRLEN boffset0 +ST |STRLEN |sv_pos_u2b_forwards \ + |NN const U8 * const start \ + |NN const U8 * const send \ + |NN STRLEN * const uoffset \ + |NN bool * const at_end \ + |NN bool *canonical_position +ST |STRLEN |sv_pos_u2b_midway \ + |NN const U8 * const start \ + |NN const U8 *send \ + |STRLEN uoffset \ + |const STRLEN uend +i |void |sv_unglob |NN SV * const sv \ + |U32 flags +RTi |char * |uiv_2buf |NN char * const buf \ + |const IV iv \ + |UV uv \ + |const int is_uv \ + |NN char ** const peob +S |void |utf8_mg_len_cache_update \ + |NN SV * const sv \ + |NN MAGIC ** const mgp \ + |const STRLEN ulen +S |void |utf8_mg_pos_cache_update \ + |NN SV * const sv \ + |NN MAGIC ** const mgp \ + |const STRLEN byte \ + |const STRLEN utf8 \ + |const STRLEN blen +S |I32 |visit |NN SVFUNC_t f \ + |const U32 flags \ + |const U32 mask +# if defined(DEBUGGING) +S |void |del_sv |NN SV *p +# endif +# if !defined(NV_PRESERVES_UV) +# if defined(DEBUGGING) +S |int |sv_2iuv_non_preserve \ + |NN SV * const sv \ + |I32 numtype +# else +S |int |sv_2iuv_non_preserve \ + |NN SV * const sv +# endif +# endif +# if defined(PERL_DEBUG_READONLY_COW) +S |void |sv_buf_to_rw |NN SV *sv +# endif +# if defined(USE_ITHREADS) +RS |SV * |sv_dup_common |NN const SV * const ssv \ + |NN CLONE_PARAMS * const param +S |void |sv_dup_hvaux |NN const SV * const ssv \ + |NN SV *dsv \ + |NN CLONE_PARAMS * const param +S |SV ** |sv_dup_inc_multiple \ + |NN SV * const *source \ + |NN SV **dest \ + |SSize_t items \ + |NN CLONE_PARAMS * const param +S |void |unreferenced_to_tmp_stack \ + |NN AV * const unreferenced +# endif +#endif /* defined(PERL_IN_SV_C) */ +#if defined(PERL_IN_TOKE_C) +S |int |ao |int toketype +S |void |checkcomma |NN const char *s \ + |NN const char *name \ + |NN const char *what +S |void |check_uni +RS |char * |filter_gets |NN SV *sv \ + |STRLEN append +RS |HV * |find_in_my_stash \ + |NN const char *pkgname \ + |STRLEN len +S |void |force_ident |NN const char *s \ + |int kind +S |void |force_ident_maybe_lex \ + |char pit +S |void |force_next |I32 type +S |char * |force_strict_version \ + |NN char *s +S |char * |force_version |NN char *s \ + |int guessing +S |char * |force_word |NN char *start \ + |int token \ + |int check_keyword \ + |int allow_pack +RS |SV * |get_and_check_backslash_N_name_wrapper \ + |NN const char *s \ + |NN const char * const e +S |void |incline |NN const char *s \ + |NN const char *end +S |int |intuit_method |NN char *s \ + |NULLOK SV *ioname \ + |NULLOK CV *cv +S |int |intuit_more |NN char *s \ + |NN char *e +S |I32 |lop |I32 f \ + |U8 x \ + |NN char *s +Sr |void |missingterm |NULLOK char *s \ + |STRLEN len +So |SV * |new_constant |NULLOK const char *s \ + |STRLEN len \ + |NN const char *key \ + |STRLEN keylen \ + |NN SV *sv \ + |NULLOK SV *pv \ + |NULLOK const char *type \ + |STRLEN typelen \ + |NULLOK const char **error_msg +S |void |no_op |NN const char * const what \ + |NULLOK char *s +S |void |parse_ident |NN char **s \ + |NN char **d \ + |NN char * const e \ + |int allow_package \ + |bool is_utf8 \ + |bool check_dollar \ + |bool tick_warn +S |int |pending_ident +RS |char * |scan_const |NN char *start +RS |char * |scan_formline |NN char *s +RS |char * |scan_heredoc |NN char *s +S |char * |scan_ident |NN char *s \ + |NN char *dest \ + |STRLEN destlen \ + |I32 ck_uni +RS |char * |scan_inputsymbol \ + |NN char *start +RS |char * |scan_pat |NN char *start \ + |I32 type +RS |char * |scan_subst |NN char *start +RS |char * |scan_trans |NN char *start +RS |I32 |sublex_done +RS |I32 |sublex_push +RS |I32 |sublex_start +RS |char * |swallow_bom |NN U8 *s +RS |char * |tokenize_use |int is_use \ + |NN char *s +S |SV * |tokeq |NN SV *sv +S |void |update_debugger_info \ + |NULLOK SV *orig_sv \ + |NULLOK const char * const buf \ + |STRLEN len +S |int |yywarn |NN const char * const s \ + |U32 flags +# if defined(DEBUGGING) +Sf |void |printbuf |NN const char * const fmt \ + |NN const char * const s +S |int |tokereport |I32 rv \ + |NN const YYSTYPE *lvalp +# endif +# if defined(PERL_CR_FILTER) +S |I32 |cr_textfilter |int idx \ + |NULLOK SV *sv \ + |int maxlen +S |void |strip_return |NN SV *sv +# endif +# if !defined(PERL_NO_UTF16_FILTER) +S |U8 * |add_utf16_textfilter \ + |NN U8 * const s \ + |bool reversed +S |I32 |utf16_textfilter \ + |int idx \ + |NN SV *sv \ + |int maxlen +# endif +#endif /* defined(PERL_IN_TOKE_C) */ +#if defined(PERL_IN_UNIVERSAL_C) +GS |bool |isa_lookup |NULLOK HV *stash \ + |NULLOK SV *namesv \ + |NULLOK const char *name \ + |STRLEN len \ + |U32 flags +GS |bool |sv_derived_from_svpvn \ + |NULLOK SV *sv \ + |NULLOK SV *namesv \ + |NULLOK const char *name \ + |const STRLEN len \ + |U32 flags #endif -#ifndef HAS_MKSTEMP -pTod |int |my_mkstemp |NN char *templte +#if defined(PERL_IN_UTF8_C) +RS |UV |check_locale_boundary_crossing \ + |NN const U8 * const p \ + |const UV result \ + |NN U8 * const ustrp \ + |NN STRLEN *lenp +RTi |int |does_utf8_overflow \ + |NN const U8 * const s \ + |NN const U8 *e \ + |const bool consider_overlongs +RTi |int |isFF_overlong |NN const U8 * const s \ + |const STRLEN len +Ri |bool |is_utf8_common |NN const U8 * const p \ + |NN const U8 * const e \ + |NULLOK SV * const invlist +RTi |int |is_utf8_overlong \ + |NN const U8 * const s \ + |const STRLEN len +RS |HV * |new_msg_hv |NN const char * const message \ + |U32 categories \ + |U32 flag +S |UV |to_case_cp_list|const UV original \ + |NULLOK const U32 ** const remaining_list \ + |NULLOK Size_t *remaining_count \ + |NN SV *invlist \ + |NN const I32 * const invmap \ + |NULLOK const U32 * const * const aux_tables \ + |NULLOK const U8 * const aux_table_lengths \ + |NN const char * const normal +RST |U8 |to_lower_latin1|const U8 c \ + |NULLOK U8 *p \ + |NULLOK STRLEN *lenp \ + |const char dummy +S |UV |_to_utf8_case |const UV original \ + |NULLOK const U8 *p \ + |NN U8 *ustrp \ + |NN STRLEN *lenp \ + |NN SV *invlist \ + |NN const I32 * const invmap \ + |NULLOK const U32 * const * const aux_tables \ + |NULLOK const U8 * const aux_table_lengths \ + |NN const char * const normal +S |UV |turkic_fc |NN const U8 * const p \ + |NN const U8 * const e \ + |NN U8 *ustrp \ + |NN STRLEN *lenp +S |UV |turkic_lc |NN const U8 * const p0 \ + |NN const U8 * const e \ + |NN U8 *ustrp \ + |NN STRLEN *lenp +S |UV |turkic_uc |NN const U8 * const p \ + |NN const U8 * const e \ + |NN U8 *ustrp \ + |NN STRLEN *lenp +RS |char * |unexpected_non_continuation_text \ + |NN const U8 * const s \ + |STRLEN print_len \ + |const STRLEN non_cont_byte_pos \ + |const STRLEN expect_len +# if 0 +S |void |warn_on_first_deprecated_use \ + |U32 category \ + |NN const char * const name \ + |NN const char * const alternative \ + |const bool use_locale \ + |NN const char * const file \ + |const unsigned line +# endif +#endif /* defined(PERL_IN_UTF8_C) */ +#if defined(PERL_IN_UTIL_C) +S |bool |ckwarn_common |U32 w +S |SV * |mess_alloc +Ti |U32 |ptr_hash |PTRV u +S |SV * |with_queued_errors \ + |NN SV *ex +So |void |xs_version_bootcheck \ + |U32 items \ + |U32 ax \ + |NN const char *xs_p \ + |STRLEN xs_len +# if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL) +ST |void |mem_log_common |enum mem_log_type mlt \ + |const UV n \ + |const UV typesize \ + |NN const char *type_name \ + |NULLOK const SV *sv \ + |Malloc_t oldalloc \ + |Malloc_t newalloc \ + |NN const char *filename \ + |const int linenumber \ + |NN const char *funcname +# endif +# if defined(PERL_USES_PL_PIDSTATUS) +S |void |pidgone |Pid_t pid \ + |int status +# endif +#endif /* defined(PERL_IN_UTIL_C) */ +#if defined(PERL_MEM_LOG) +CTp |Malloc_t|mem_log_alloc |const UV nconst \ + |UV typesize \ + |NN const char *type_name \ + |Malloc_t newalloc \ + |NN const char *filename \ + |const int linenumber \ + |NN const char *funcname +CTp |void |mem_log_del_sv |NN const SV *sv \ + |NN const char *filename \ + |int linenumber \ + |NN const char *funcname +CTp |Malloc_t|mem_log_free |Malloc_t oldalloc \ + |NN const char *filename \ + |const int linenumber \ + |NN const char *funcname +CTp |void |mem_log_new_sv |NN const SV *sv \ + |NN const char *filename \ + |int linenumber \ + |NN const char *funcname +CTp |Malloc_t|mem_log_realloc \ + |const UV n \ + |const UV typesize \ + |NN const char *type_name \ + |Malloc_t oldalloc \ + |Malloc_t newalloc \ + |NN const char *filename \ + |const int linenumber \ + |NN const char *funcname #endif - -APpdT |bool |isinfnan |NV nv -pd |bool |isinfnansv |NN SV *sv - -#if !defined(HAS_SIGNBIT) -AxdToP |int |Perl_signbit |NV f +#if !defined(PERL_NO_INLINE_FUNCTIONS) +Cipx |void |cx_popblock |NN PERL_CONTEXT *cx +Cipx |void |cx_popeval |NN PERL_CONTEXT *cx +Cipx |void |cx_popformat |NN PERL_CONTEXT *cx +Cipx |void |cx_popgiven |NN PERL_CONTEXT *cx +Cipx |void |cx_poploop |NN PERL_CONTEXT *cx +Cipx |void |cx_popsub |NN PERL_CONTEXT *cx +Cipx |void |cx_popsub_args |NN PERL_CONTEXT *cx +Cipx |void |cx_popsub_common \ + |NN PERL_CONTEXT *cx +Cipx |void |cx_popwhen |NN PERL_CONTEXT *cx +Cipx |PERL_CONTEXT *|cx_pushblock \ + |U8 type \ + |U8 gimme \ + |NN SV **sp \ + |I32 saveix +Cipx |void |cx_pusheval |NN PERL_CONTEXT *cx \ + |NULLOK OP *retop \ + |NULLOK SV *namesv +Cipx |void |cx_pushformat |NN PERL_CONTEXT *cx \ + |NN CV *cv \ + |NULLOK OP *retop \ + |NULLOK GV *gv +Cipx |void |cx_pushgiven |NN PERL_CONTEXT *cx \ + |NULLOK SV *orig_defsv +Cipx |void |cx_pushloop_for|NN PERL_CONTEXT *cx \ + |NN void *itervarp \ + |NULLOK SV *itersave +Cipx |void |cx_pushloop_plain \ + |NN PERL_CONTEXT *cx +Cipx |void |cx_pushsub |NN PERL_CONTEXT *cx \ + |NN CV *cv \ + |NULLOK OP *retop \ + |bool hasargs +Cipx |void |cx_pushtry |NN PERL_CONTEXT *cx \ + |NULLOK OP *retop +Cipx |void |cx_pushwhen |NN PERL_CONTEXT *cx +Cipx |void |cx_topblock |NN PERL_CONTEXT *cx +Cipx |U8 |gimme_V +#endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#if defined(PERL_USE_3ARG_SIGHANDLER) +CTp |Signal_t|csighandler |int sig \ + |NULLOK Siginfo_t *info \ + |NULLOK void *uap +: Used in perl.c +Tp |Signal_t|sighandler |int sig \ + |NULLOK Siginfo_t *info \ + |NULLOK void *uap +#else +CTp |Signal_t|csighandler |int sig +Tp |Signal_t|sighandler |int sig #endif - -: Used by B -XExop |void |emulate_cop_io |NN const COP *const c|NN SV *const sv -: Used by SvRX and SvRXOK -XExop |REGEXP *|get_re_arg|NULLOK SV *sv - -Coph |SV* |mro_get_private_data|NN struct mro_meta *const smeta \ - |NN const struct mro_alg *const which -Aopdh |SV* |mro_set_private_data|NN struct mro_meta *const smeta \ - |NN const struct mro_alg *const which \ - |NN SV *const data -Aopd |const struct mro_alg *|mro_get_from_name|NN SV *name -Aopd |void |mro_register |NN const struct mro_alg *mro -Aopd |void |mro_set_mro |NN struct mro_meta *const meta \ - |NN SV *const name -: Used in HvMROMETA(), which is public. -Xpo |struct mro_meta* |mro_meta_init |NN HV* stash -#if defined(USE_ITHREADS) -: Only used in sv.c -p |struct mro_meta* |mro_meta_dup |NN struct mro_meta* smeta|NN CLONE_PARAMS* param +#if defined(U64TYPE) +CRTip |unsigned|lsbit_pos64 |U64 word +CRTip |unsigned|msbit_pos64 |U64 word +CRTip |unsigned|single_1bit_pos64 \ + |U64 word #endif -Apd |AV* |mro_get_linear_isa|NN HV* stash -#if defined(PERL_IN_MRO_C) -Sd |AV* |mro_get_linear_isa_dfs|NN HV* stash|U32 level -S |void |mro_clean_isarev|NN HV * const isa \ - |NN const char * const name \ - |const STRLEN len \ - |NULLOK HV * const exceptions \ - |U32 hash|U32 flags -S |void |mro_gather_and_rename|NN HV * const stashes \ - |NN HV * const seen_stashes \ - |NULLOK HV *stash \ - |NULLOK HV *oldstash \ - |NN SV *namesv +#if defined(UNLINK_ALL_VERSIONS) +Cp |I32 |unlnk |NN const char *f +#endif +#if defined(USE_C_BACKTRACE) +Adp |bool |dump_c_backtrace \ + |NN PerlIO *fp \ + |int max_depth \ + |int skip +dm |void |free_c_backtrace \ + |NN Perl_c_backtrace *bt +dp |Perl_c_backtrace *|get_c_backtrace \ + |int max_depth \ + |int skip +Adp |SV * |get_c_backtrace_dump \ + |int max_depth \ + |int skip +#endif +#if defined(USE_DTRACE) +EXop |void |dtrace_probe_call \ + |NN CV *cv \ + |bool is_call +EXop |void |dtrace_probe_load \ + |NN const char *name \ + |bool is_loading +EXop |void |dtrace_probe_op|NN const OP *op +EXop |void |dtrace_probe_phase \ + |enum perl_phase phase #endif -: Used in hv.c, mg.c, pp.c, sv.c -pd |void |mro_isa_changed_in|NN HV* stash -Apd |void |mro_method_changed_in |NN HV* stash -pde |void |mro_package_moved |NULLOK HV * const stash|NULLOK HV * const oldstash|NN const GV * const gv|U32 flags -: Only used in perl.c -p |void |boot_core_mro -CpoT |void |sys_init |NN int* argc|NN char*** argv -CpoT |void |sys_init3 |NN int* argc|NN char*** argv|NN char*** env -CpoT |void |sys_term -Apxd |const char *|cop_fetch_label|NN COP *const cop \ - |NULLOK STRLEN *len|NULLOK U32 *flags -: Only used in op.c and the perl compiler -Apxd |void|cop_store_label \ - |NN COP *const cop|NN const char *label|STRLEN len|U32 flags - -epo |int |keyword_plugin_standard|NN char* keyword_ptr|STRLEN keyword_len|NN OP** op_ptr - #if defined(USE_ITHREADS) -# if defined(PERL_IN_SV_C) -S |void |unreferenced_to_tmp_stack|NN AV *const unreferenced -# endif -ARTop |CLONE_PARAMS *|clone_params_new|NN PerlInterpreter *const from \ - |NN PerlInterpreter *const to -ATop |void |clone_params_del|NN CLONE_PARAMS *param +Adpx |PADOFFSET|alloccopstash|NN HV *hv +CRp |void * |any_dup |NULLOK void *v \ + |NN const PerlInterpreter *proto_perl +ATop |void |clone_params_del \ + |NN CLONE_PARAMS *param +ARTop |CLONE_PARAMS *|clone_params_new \ + |NN PerlInterpreter * const from \ + |NN PerlInterpreter * const to +Cip |AV * |cop_file_avn |NN const COP *cop +CRp |PERL_CONTEXT *|cx_dup |NULLOK PERL_CONTEXT *cx \ + |I32 ix \ + |I32 max \ + |NN CLONE_PARAMS *param +CRdp |DIR * |dirp_dup |NULLOK DIR * const dp \ + |NN CLONE_PARAMS * const param +Cdp |PerlIO *|fp_dup |NULLOK PerlIO * const fp \ + |const char type \ + |NN CLONE_PARAMS * const param +CRdp |GP * |gp_dup |NULLOK GP * const gp \ + |NN CLONE_PARAMS * const param +CRp |HE * |he_dup |NULLOK const HE *e \ + |bool shared \ + |NN CLONE_PARAMS *param +CRp |HEK * |hek_dup |NULLOK HEK *e \ + |NN CLONE_PARAMS *param +CRdp |MAGIC *|mg_dup |NULLOK MAGIC *mg \ + |NN CLONE_PARAMS * const param +: Only used in sv.c +p |struct mro_meta *|mro_meta_dup \ + |NN struct mro_meta *smeta \ + |NN CLONE_PARAMS *param +ARdp |OP * |newPADOP |I32 type \ + |I32 flags \ + |NN SV *sv +Rdp |PADLIST *|padlist_dup |NN PADLIST *srcpad \ + |NN CLONE_PARAMS *param +Rdp |PADNAME *|padname_dup |NN PADNAME *src \ + |NN CLONE_PARAMS *param +Rdp |PADNAMELIST *|padnamelist_dup \ + |NN PADNAMELIST *srcpad \ + |NN CLONE_PARAMS *param +Cp |yy_parser *|parser_dup |NULLOK const yy_parser * const proto \ + |NN CLONE_PARAMS * const param +ATdo |PerlInterpreter *|perl_clone \ + |NN PerlInterpreter *proto_perl \ + |UV flags +Adp |void |re_dup_guts |NN const REGEXP *sstr \ + |NN REGEXP *dstr \ + |NN CLONE_PARAMS *param +Cp |void * |regdupe_internal \ + |NN REGEXP * const r \ + |NN CLONE_PARAMS *param +Cp |void |rvpv_dup |NN SV * const dsv \ + |NN const SV * const ssv \ + |NN CLONE_PARAMS * const param +CRdp |PERL_SI *|si_dup |NULLOK PERL_SI *si \ + |NN CLONE_PARAMS *param +CRdp |ANY * |ss_dup |NN PerlInterpreter *proto_perl \ + |NN CLONE_PARAMS *param +ARp |SV * |sv_dup |NULLOK const SV * const ssv \ + |NN CLONE_PARAMS * const param +ARp |SV * |sv_dup_inc |NULLOK const SV * const ssv \ + |NN CLONE_PARAMS * const param +# if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C) +p |void |op_relocate_sv |NN SV **svp \ + |NN PADOFFSET *targp +# endif +#else /* if !defined(USE_ITHREADS) */ +Adm |void |CopFILEGV_set |NN COP *c \ + |NN GV *gv #endif - -: Used in perl.c and toke.c -Fop |void |populate_isa |NN const char *name|STRLEN len|... - -: Some static inline functions need predeclaration because they are used -: inside other static inline functions. -#if defined(PERL_CORE) || defined (PERL_EXT) -Ei |STRLEN |sv_or_pv_pos_u2b|NN SV *sv|NN const char *pv|STRLEN pos \ - |NULLOK STRLEN *lenp -#endif - -Cp |void |clear_defarray |NN AV* av|bool abandon - -Apx |void |leave_adjust_stacks|NN SV **from_sp|NN SV **to_sp \ - |U8 gimme|int filter - -#ifndef PERL_NO_INLINE_FUNCTIONS -Cixp |U8 |gimme_V | -Cixp |PERL_CONTEXT * |cx_pushblock|U8 type|U8 gimme|NN SV** sp|I32 saveix -Cixp |void |cx_popblock|NN PERL_CONTEXT *cx -Cixp |void |cx_topblock|NN PERL_CONTEXT *cx -Cixp |void |cx_pushsub |NN PERL_CONTEXT *cx|NN CV *cv \ - |NULLOK OP *retop|bool hasargs -Cixp |void |cx_popsub_common|NN PERL_CONTEXT *cx -Cixp |void |cx_popsub_args |NN PERL_CONTEXT *cx -Cixp |void |cx_popsub |NN PERL_CONTEXT *cx -Cixp |void |cx_pushformat |NN PERL_CONTEXT *cx|NN CV *cv \ - |NULLOK OP *retop|NULLOK GV *gv -Cixp |void |cx_popformat |NN PERL_CONTEXT *cx -Cixp |void |cx_pusheval |NN PERL_CONTEXT *cx \ - |NULLOK OP *retop|NULLOK SV *namesv -Cixp |void |cx_pushtry |NN PERL_CONTEXT *cx|NULLOK OP *retop -Cixp |void |cx_popeval |NN PERL_CONTEXT *cx -Cixp |void |cx_pushloop_plain|NN PERL_CONTEXT *cx -Cixp |void |cx_pushloop_for |NN PERL_CONTEXT *cx \ - |NN void *itervarp|NULLOK SV *itersave -Cixp |void |cx_poploop |NN PERL_CONTEXT *cx -Cixp |void |cx_pushwhen |NN PERL_CONTEXT *cx -Cixp |void |cx_popwhen |NN PERL_CONTEXT *cx -Cixp |void |cx_pushgiven |NN PERL_CONTEXT *cx|NULLOK SV *orig_defsv -Cixp |void |cx_popgiven |NN PERL_CONTEXT *cx -#endif - -#ifdef USE_DTRACE -XEop |void |dtrace_probe_call |NN CV *cv|bool is_call -XEop |void |dtrace_probe_load |NN const char *name|bool is_loading -XEop |void |dtrace_probe_op |NN const OP *op -XEop |void |dtrace_probe_phase|enum perl_phase phase +#if defined(USE_LOCALE_COLLATE) +p |int |magic_freecollxfrm \ + |NN SV *sv \ + |NN MAGIC *mg +p |int |magic_setcollxfrm \ + |NN SV *sv \ + |NN MAGIC *mg +EXop |SV * |strxfrm |NN SV *src +: Defined in locale.c, used only in sv.c +AMbdp |char * |sv_collxfrm |NN SV * const sv \ + |NN STRLEN * const nxp +Adp |char * |sv_collxfrm_flags \ + |NN SV * const sv \ + |NN STRLEN * const nxp \ + |I32 const flags +# if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_MATHOMS_C) || \ + defined(PERL_IN_SV_C) +Ep |char * |mem_collxfrm_ |NN const char *input_string \ + |STRLEN len \ + |NN STRLEN *xlen \ + |bool utf8 +# endif +#endif /* defined(USE_LOCALE_COLLATE) */ +#if defined(USE_PERLIO) +Adhp |void |PerlIO_clearerr|NULLOK PerlIO *f +Adhp |int |PerlIO_close |NULLOK PerlIO *f +Adhp |int |PerlIO_eof |NULLOK PerlIO *f +Adhp |int |PerlIO_error |NULLOK PerlIO *f +Adhp |int |PerlIO_fileno |NULLOK PerlIO *f +Adp |int |PerlIO_fill |NULLOK PerlIO *f +Adhp |int |PerlIO_flush |NULLOK PerlIO *f +Adhp |STDCHAR *|PerlIO_get_base \ + |NULLOK PerlIO *f +ARdhp |SSize_t|PerlIO_get_bufsiz \ + |NULLOK PerlIO *f +ARdhp |SSize_t|PerlIO_get_cnt |NULLOK PerlIO *f +Adhp |STDCHAR *|PerlIO_get_ptr \ + |NULLOK PerlIO *f +Adhp |SSize_t|PerlIO_read |NULLOK PerlIO *f \ + |NN void *vbuf \ + |Size_t count +Xp |void |PerlIO_restore_errno \ + |NULLOK PerlIO *f +Xp |void |PerlIO_save_errno \ + |NULLOK PerlIO *f +Adhp |int |PerlIO_seek |NULLOK PerlIO *f \ + |Off_t offset \ + |int whence +Adhp |void |PerlIO_set_cnt |NULLOK PerlIO *f \ + |SSize_t cnt +Adhp |void |PerlIO_setlinebuf \ + |NULLOK PerlIO *f +Adhp |void |PerlIO_set_ptrcnt \ + |NULLOK PerlIO *f \ + |NULLOK STDCHAR *ptr \ + |SSize_t cnt +ARdhp |PerlIO *|PerlIO_stderr +ARdhp |PerlIO *|PerlIO_stdin +ARdhp |PerlIO *|PerlIO_stdout +Adhp |Off_t |PerlIO_tell |NULLOK PerlIO *f +Adp |SSize_t|PerlIO_unread |NULLOK PerlIO *f \ + |NN const void *vbuf \ + |Size_t count +Adhp |SSize_t|PerlIO_write |NULLOK PerlIO *f \ + |NN const void *vbuf \ + |Size_t count +#endif /* defined(USE_PERLIO) */ +#if defined(USE_PERL_SWITCH_LOCALE_CONTEXT) +CTop |void |switch_locale_context +#endif +#if defined(USE_QUADMATH) +Tdp |bool |quadmath_format_needed \ + |NN const char *format +Tdp |bool |quadmath_format_valid \ + |NN const char *format +#endif +#if defined(VMS) || defined(WIN32) +Cp |int |do_aspawn |NULLOK SV *really \ + |NN SV **mark \ + |NN SV **sp +Cp |int |do_spawn |NN char *cmd +Cp |int |do_spawn_nowait|NN char *cmd #endif - -XEop |STRLEN*|dup_warnings |NULLOK STRLEN* warnings - -#ifndef USE_ITHREADS -Amd |void |CopFILEGV_set |NN COP * c|NN GV * gv +#if defined(WIN32) +CRTdp |void * |get_context +p |bool |get_win32_message_utf8ness \ + |NULLOK const char *string +Teor |void |win32_croak_not_implemented \ + |NN const char *fname +#else +p |bool |do_exec3 |NN const char *incmd \ + |int fd \ + |int do_report +CRTdip |void * |get_context #endif - -Amd|const char *const|phase_name|enum perl_phase : ex: set ts=8 sts=4 sw=4 noet: Index: gnu/usr.bin/perl/embed.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/embed.h,v diff -u -p -a -u -p -r1.29 embed.h --- gnu/usr.bin/perl/embed.h 8 Jul 2023 14:18:35 -0000 1.29 +++ gnu/usr.bin/perl/embed.h 21 Feb 2024 15:47:02 -0000 @@ -1,16 +1,19 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * embed.h * * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - * 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall and others + * 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, + * 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 + * by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! - * This file is built by regen/embed.pl from data in embed.fnc, - * regen/embed.pl, regen/opcodes, intrpvar.h and perlvars.h. + * This file is built by regen/embed.pl from embed.fnc, intrpvar.h, + * perlvars.h, regen/opcodes, regen/embed.pl, regen/embed_lib.pl and + * regen/HeaderParser.pm. * Any changes made here will be lost! * * Edit those files and run 'make regen_headers' to effect changes. @@ -24,2065 +27,29 @@ * BEWARE that a bunch of macros don't have long names, so either must be * added or don't use them if you define this symbol */ -#ifndef PERL_NO_SHORT_NAMES - -/* Hide global symbols */ - -#define Gv_AMupdate(a,b) Perl_Gv_AMupdate(aTHX_ a,b) -#define SvAMAGIC_off Perl_SvAMAGIC_off -#define SvAMAGIC_on Perl_SvAMAGIC_on -#define SvTRUE(a) Perl_SvTRUE(aTHX_ a) -#define SvTRUE_NN(a) Perl_SvTRUE_NN(aTHX_ a) -#define SvTRUE_common(a,b) Perl_SvTRUE_common(aTHX_ a,b) -#define SvTRUE_nomg(a) Perl_SvTRUE_nomg(aTHX_ a) -#define _force_out_malformed_utf8_message(a,b,c,d) Perl__force_out_malformed_utf8_message(aTHX_ a,b,c,d) -#define _is_in_locale_category(a,b) Perl__is_in_locale_category(aTHX_ a,b) -#define _is_uni_FOO(a,b) Perl__is_uni_FOO(aTHX_ a,b) -#define _is_uni_perl_idcont(a) Perl__is_uni_perl_idcont(aTHX_ a) -#define _is_uni_perl_idstart(a) Perl__is_uni_perl_idstart(aTHX_ a) -#define _is_utf8_FOO(a,b,c) Perl__is_utf8_FOO(aTHX_ a,b,c) -#define _is_utf8_perl_idcont(a,b) Perl__is_utf8_perl_idcont(aTHX_ a,b) -#define _is_utf8_perl_idstart(a,b) Perl__is_utf8_perl_idstart(aTHX_ a,b) -#define _to_uni_fold_flags(a,b,c,d) Perl__to_uni_fold_flags(aTHX_ a,b,c,d) -#define _to_utf8_fold_flags(a,b,c,d,e) Perl__to_utf8_fold_flags(aTHX_ a,b,c,d,e) -#define _to_utf8_lower_flags(a,b,c,d,e) Perl__to_utf8_lower_flags(aTHX_ a,b,c,d,e) -#define _to_utf8_title_flags(a,b,c,d,e) Perl__to_utf8_title_flags(aTHX_ a,b,c,d,e) -#define _to_utf8_upper_flags(a,b,c,d,e) Perl__to_utf8_upper_flags(aTHX_ a,b,c,d,e) -#define _utf8n_to_uvchr_msgs_helper Perl__utf8n_to_uvchr_msgs_helper -#define amagic_call(a,b,c,d) Perl_amagic_call(aTHX_ a,b,c,d) -#define amagic_deref_call(a,b) Perl_amagic_deref_call(aTHX_ a,b) -#define apply_attrs_string(a,b,c,d) Perl_apply_attrs_string(aTHX_ a,b,c,d) -#define atfork_lock Perl_atfork_lock -#define atfork_unlock Perl_atfork_unlock -#define av_clear(a) Perl_av_clear(aTHX_ a) -#define av_count(a) Perl_av_count(aTHX_ a) -#define av_delete(a,b,c) Perl_av_delete(aTHX_ a,b,c) -#define av_exists(a,b) Perl_av_exists(aTHX_ a,b) -#define av_extend(a,b) Perl_av_extend(aTHX_ a,b) -#define av_fetch(a,b,c) Perl_av_fetch(aTHX_ a,b,c) -#define av_fetch_simple(a,b,c) Perl_av_fetch_simple(aTHX_ a,b,c) -#define av_fill(a,b) Perl_av_fill(aTHX_ a,b) -#define av_len(a) Perl_av_len(aTHX_ a) -#define av_make(a,b) Perl_av_make(aTHX_ a,b) -#define av_new_alloc(a,b) Perl_av_new_alloc(aTHX_ a,b) -#define av_pop(a) Perl_av_pop(aTHX_ a) -#define av_push(a,b) Perl_av_push(aTHX_ a,b) -#define av_shift(a) Perl_av_shift(aTHX_ a) -#define av_store(a,b,c) Perl_av_store(aTHX_ a,b,c) -#define av_store_simple(a,b,c) Perl_av_store_simple(aTHX_ a,b,c) -#define av_undef(a) Perl_av_undef(aTHX_ a) -#define av_unshift(a,b) Perl_av_unshift(aTHX_ a,b) -#define block_end(a,b) Perl_block_end(aTHX_ a,b) -#define block_gimme() Perl_block_gimme(aTHX) -#define block_start(a) Perl_block_start(aTHX_ a) -#define bytes_cmp_utf8(a,b,c,d) Perl_bytes_cmp_utf8(aTHX_ a,b,c,d) -#define bytes_from_utf8_loc Perl_bytes_from_utf8_loc -#define bytes_to_utf8(a,b) Perl_bytes_to_utf8(aTHX_ a,b) -#define call_argv(a,b,c) Perl_call_argv(aTHX_ a,b,c) -#define call_atexit(a,b) Perl_call_atexit(aTHX_ a,b) -#define call_list(a,b) Perl_call_list(aTHX_ a,b) -#define call_method(a,b) Perl_call_method(aTHX_ a,b) -#define call_pv(a,b) Perl_call_pv(aTHX_ a,b) -#define call_sv(a,b) Perl_call_sv(aTHX_ a,b) -#define caller_cx(a,b) Perl_caller_cx(aTHX_ a,b) -#define cast_i32 Perl_cast_i32 -#define cast_iv Perl_cast_iv -#define cast_ulong Perl_cast_ulong -#define cast_uv Perl_cast_uv -#define ck_entersub_args_list(a) Perl_ck_entersub_args_list(aTHX_ a) -#define ck_entersub_args_proto(a,b,c) Perl_ck_entersub_args_proto(aTHX_ a,b,c) -#define ck_entersub_args_proto_or_list(a,b,c) Perl_ck_entersub_args_proto_or_list(aTHX_ a,b,c) -#ifndef MULTIPLICITY -#define ck_warner Perl_ck_warner -#define ck_warner_d Perl_ck_warner_d -#endif -#define clear_defarray(a,b) Perl_clear_defarray(aTHX_ a,b) -#define cop_fetch_label(a,b,c) Perl_cop_fetch_label(aTHX_ a,b,c) -#define cop_store_label(a,b,c,d) Perl_cop_store_label(aTHX_ a,b,c,d) -#ifndef MULTIPLICITY -#define croak Perl_croak -#endif -#define croak_memory_wrap Perl_croak_memory_wrap -#define croak_no_modify Perl_croak_no_modify -#define croak_sv(a) Perl_croak_sv(aTHX_ a) -#define croak_xs_usage Perl_croak_xs_usage -#define csighandler1 Perl_csighandler1 -#define csighandler3 Perl_csighandler3 -#ifndef NO_MATHOMS -#define custom_op_desc(a) Perl_custom_op_desc(aTHX_ a) -#endif -#ifndef NO_MATHOMS -#define custom_op_name(a) Perl_custom_op_name(aTHX_ a) -#endif -#define cv_clone(a) Perl_cv_clone(aTHX_ a) -#define cv_const_sv Perl_cv_const_sv -#define cv_get_call_checker(a,b,c) Perl_cv_get_call_checker(aTHX_ a,b,c) -#define cv_get_call_checker_flags(a,b,c,d,e) Perl_cv_get_call_checker_flags(aTHX_ a,b,c,d,e) -#define cv_name(a,b,c) Perl_cv_name(aTHX_ a,b,c) -#define cv_set_call_checker(a,b,c) Perl_cv_set_call_checker(aTHX_ a,b,c) -#define cv_set_call_checker_flags(a,b,c,d) Perl_cv_set_call_checker_flags(aTHX_ a,b,c,d) -#define cv_undef(a) Perl_cv_undef(aTHX_ a) -#define cx_dump(a) Perl_cx_dump(aTHX_ a) -#define cxinc() Perl_cxinc(aTHX) -#ifndef MULTIPLICITY -#define deb Perl_deb -#endif -#define debop(a) Perl_debop(aTHX_ a) -#define debprofdump() Perl_debprofdump(aTHX) -#define debstack() Perl_debstack(aTHX) -#define debstackptrs() Perl_debstackptrs(aTHX) -#define delimcpy Perl_delimcpy -#define despatch_signals() Perl_despatch_signals(aTHX) -#ifndef MULTIPLICITY -#define die Perl_die -#endif -#define die_sv(a) Perl_die_sv(aTHX_ a) -#ifndef NO_MATHOMS -#define do_binmode(a,b,c) Perl_do_binmode(aTHX_ a,b,c) -#endif -#define do_close(a,b) Perl_do_close(aTHX_ a,b) -#define do_gv_dump(a,b,c,d) Perl_do_gv_dump(aTHX_ a,b,c,d) -#define do_gvgv_dump(a,b,c,d) Perl_do_gvgv_dump(aTHX_ a,b,c,d) -#define do_hv_dump(a,b,c,d) Perl_do_hv_dump(aTHX_ a,b,c,d) -#define do_join(a,b,c,d) Perl_do_join(aTHX_ a,b,c,d) -#define do_magic_dump(a,b,c,d,e,f,g) Perl_do_magic_dump(aTHX_ a,b,c,d,e,f,g) -#define do_op_dump(a,b,c) Perl_do_op_dump(aTHX_ a,b,c) -#ifndef NO_MATHOMS -#define do_open9(a,b,c,d,e,f,g,h,i) Perl_do_open9(aTHX_ a,b,c,d,e,f,g,h,i) -#endif -#define do_openn(a,b,c,d,e,f,g,h,i) Perl_do_openn(aTHX_ a,b,c,d,e,f,g,h,i) -#define do_pmop_dump(a,b,c) Perl_do_pmop_dump(aTHX_ a,b,c) -#define do_sprintf(a,b,c) Perl_do_sprintf(aTHX_ a,b,c) -#define do_sv_dump(a,b,c,d,e,f,g) Perl_do_sv_dump(aTHX_ a,b,c,d,e,f,g) -#define doing_taint Perl_doing_taint -#define doref(a,b,c) Perl_doref(aTHX_ a,b,c) -#define dounwind(a) Perl_dounwind(aTHX_ a) -#define dowantarray() Perl_dowantarray(aTHX) -#define dump_all() Perl_dump_all(aTHX) -#define dump_eval() Perl_dump_eval(aTHX) -#define dump_form(a) Perl_dump_form(aTHX_ a) -#ifndef MULTIPLICITY -#define dump_indent Perl_dump_indent -#endif -#define dump_packsubs(a) Perl_dump_packsubs(aTHX_ a) -#define dump_sub(a) Perl_dump_sub(aTHX_ a) -#define dump_vindent(a,b,c,d) Perl_dump_vindent(aTHX_ a,b,c,d) -#define eval_pv(a,b) Perl_eval_pv(aTHX_ a,b) -#define eval_sv(a,b) Perl_eval_sv(aTHX_ a,b) -#define fbm_compile(a,b) Perl_fbm_compile(aTHX_ a,b) -#define fbm_instr(a,b,c,d) Perl_fbm_instr(aTHX_ a,b,c,d) -#define filter_add(a,b) Perl_filter_add(aTHX_ a,b) -#define filter_del(a) Perl_filter_del(aTHX_ a) -#define filter_read(a,b,c) Perl_filter_read(aTHX_ a,b,c) -#define find_runcv(a) Perl_find_runcv(aTHX_ a) -#define find_rundefsv() Perl_find_rundefsv(aTHX) -#define find_rundefsvoffset() Perl_find_rundefsvoffset(aTHX) -#define foldEQ Perl_foldEQ -#define foldEQ_latin1 Perl_foldEQ_latin1 -#define foldEQ_locale Perl_foldEQ_locale -#define foldEQ_utf8_flags(a,b,c,d,e,f,g,h,i) Perl_foldEQ_utf8_flags(aTHX_ a,b,c,d,e,f,g,h,i) -#ifndef MULTIPLICITY -#define form Perl_form -#endif -#define free_tmps() Perl_free_tmps(aTHX) -#define get_av(a,b) Perl_get_av(aTHX_ a,b) -#define get_context Perl_get_context -#define get_cv(a,b) Perl_get_cv(aTHX_ a,b) -#define get_cvn_flags(a,b,c) Perl_get_cvn_flags(aTHX_ a,b,c) -#define get_hv(a,b) Perl_get_hv(aTHX_ a,b) -#define get_op_descs() Perl_get_op_descs(aTHX) -#define get_op_names() Perl_get_op_names(aTHX) -#define get_ppaddr() Perl_get_ppaddr(aTHX) -#define get_sv(a,b) Perl_get_sv(aTHX_ a,b) -#define get_vtbl(a) Perl_get_vtbl(aTHX_ a) -#define getcwd_sv(a) Perl_getcwd_sv(aTHX_ a) -#define gp_free(a) Perl_gp_free(aTHX_ a) -#define gp_ref(a) Perl_gp_ref(aTHX_ a) -#define grok_atoUV Perl_grok_atoUV -#define grok_bin_oct_hex(a,b,c,d,e,f,g) Perl_grok_bin_oct_hex(aTHX_ a,b,c,d,e,f,g) -#define grok_infnan(a,b) Perl_grok_infnan(aTHX_ a,b) -#define grok_number(a,b,c) Perl_grok_number(aTHX_ a,b,c) -#define grok_number_flags(a,b,c,d) Perl_grok_number_flags(aTHX_ a,b,c,d) -#define grok_numeric_radix(a,b) Perl_grok_numeric_radix(aTHX_ a,b) -#define gv_add_by_type(a,b) Perl_gv_add_by_type(aTHX_ a,b) -#define gv_autoload_pv(a,b,c) Perl_gv_autoload_pv(aTHX_ a,b,c) -#define gv_autoload_pvn(a,b,c,d) Perl_gv_autoload_pvn(aTHX_ a,b,c,d) -#define gv_autoload_sv(a,b,c) Perl_gv_autoload_sv(aTHX_ a,b,c) -#define gv_check(a) Perl_gv_check(aTHX_ a) -#define gv_const_sv(a) Perl_gv_const_sv(aTHX_ a) -#define gv_dump(a) Perl_gv_dump(aTHX_ a) -#ifndef NO_MATHOMS -#define gv_efullname(a,b) Perl_gv_efullname(aTHX_ a,b) -#endif -#define gv_efullname4(a,b,c,d) Perl_gv_efullname4(aTHX_ a,b,c,d) -#define gv_fetchfile(a) Perl_gv_fetchfile(aTHX_ a) -#define gv_fetchfile_flags(a,b,c) Perl_gv_fetchfile_flags(aTHX_ a,b,c) -#define gv_fetchmeth_pv(a,b,c,d) Perl_gv_fetchmeth_pv(aTHX_ a,b,c,d) -#define gv_fetchmeth_pv_autoload(a,b,c,d) Perl_gv_fetchmeth_pv_autoload(aTHX_ a,b,c,d) -#define gv_fetchmeth_pvn(a,b,c,d,e) Perl_gv_fetchmeth_pvn(aTHX_ a,b,c,d,e) -#define gv_fetchmeth_pvn_autoload(a,b,c,d,e) Perl_gv_fetchmeth_pvn_autoload(aTHX_ a,b,c,d,e) -#define gv_fetchmeth_sv(a,b,c,d) Perl_gv_fetchmeth_sv(aTHX_ a,b,c,d) -#define gv_fetchmeth_sv_autoload(a,b,c,d) Perl_gv_fetchmeth_sv_autoload(aTHX_ a,b,c,d) -#define gv_fetchmethod_autoload(a,b,c) Perl_gv_fetchmethod_autoload(aTHX_ a,b,c) -#define gv_fetchmethod_pv_flags(a,b,c) Perl_gv_fetchmethod_pv_flags(aTHX_ a,b,c) -#define gv_fetchmethod_pvn_flags(a,b,c,d) Perl_gv_fetchmethod_pvn_flags(aTHX_ a,b,c,d) -#define gv_fetchmethod_sv_flags(a,b,c) Perl_gv_fetchmethod_sv_flags(aTHX_ a,b,c) -#define gv_fetchpv(a,b,c) Perl_gv_fetchpv(aTHX_ a,b,c) -#define gv_fetchpvn_flags(a,b,c,d) Perl_gv_fetchpvn_flags(aTHX_ a,b,c,d) -#define gv_fetchsv(a,b,c) Perl_gv_fetchsv(aTHX_ a,b,c) -#ifndef NO_MATHOMS -#define gv_fullname(a,b) Perl_gv_fullname(aTHX_ a,b) -#endif -#define gv_fullname4(a,b,c,d) Perl_gv_fullname4(aTHX_ a,b,c,d) -#define gv_handler(a,b) Perl_gv_handler(aTHX_ a,b) -#define gv_init_pv(a,b,c,d) Perl_gv_init_pv(aTHX_ a,b,c,d) -#define gv_init_pvn(a,b,c,d,e) Perl_gv_init_pvn(aTHX_ a,b,c,d,e) -#define gv_init_sv(a,b,c,d) Perl_gv_init_sv(aTHX_ a,b,c,d) -#define gv_name_set(a,b,c,d) Perl_gv_name_set(aTHX_ a,b,c,d) -#define gv_stashpv(a,b) Perl_gv_stashpv(aTHX_ a,b) -#define gv_stashpvn(a,b,c) Perl_gv_stashpvn(aTHX_ a,b,c) -#define gv_stashsv(a,b) Perl_gv_stashsv(aTHX_ a,b) -#define hv_bucket_ratio(a) Perl_hv_bucket_ratio(aTHX_ a) -#define hv_clear(a) Perl_hv_clear(aTHX_ a) -#define hv_clear_placeholders(a) Perl_hv_clear_placeholders(aTHX_ a) -#define hv_common(a,b,c,d,e,f,g,h) Perl_hv_common(aTHX_ a,b,c,d,e,f,g,h) -#define hv_common_key_len(a,b,c,d,e,f) Perl_hv_common_key_len(aTHX_ a,b,c,d,e,f) -#define hv_copy_hints_hv(a) Perl_hv_copy_hints_hv(aTHX_ a) -#define hv_delayfree_ent(a,b) Perl_hv_delayfree_ent(aTHX_ a,b) -#define hv_free_ent(a,b) Perl_hv_free_ent(aTHX_ a,b) -#define hv_iterinit(a) Perl_hv_iterinit(aTHX_ a) -#define hv_iterkey(a,b) Perl_hv_iterkey(aTHX_ a,b) -#define hv_iterkeysv(a) Perl_hv_iterkeysv(aTHX_ a) -#define hv_iternext_flags(a,b) Perl_hv_iternext_flags(aTHX_ a,b) -#define hv_iternextsv(a,b,c) Perl_hv_iternextsv(aTHX_ a,b,c) -#define hv_iterval(a,b) Perl_hv_iterval(aTHX_ a,b) -#define hv_ksplit(a,b) Perl_hv_ksplit(aTHX_ a,b) -#define hv_name_set(a,b,c,d) Perl_hv_name_set(aTHX_ a,b,c,d) -#define hv_rand_set(a,b) Perl_hv_rand_set(aTHX_ a,b) -#define hv_scalar(a) Perl_hv_scalar(aTHX_ a) -#define init_i18nl10n(a) Perl_init_i18nl10n(aTHX_ a) -#ifndef NO_MATHOMS -#define init_i18nl14n(a) Perl_init_i18nl14n(aTHX_ a) -#endif -#define init_stacks() Perl_init_stacks(aTHX) -#define init_tm(a) Perl_init_tm(aTHX_ a) -#define intro_my() Perl_intro_my(aTHX) -#define isC9_STRICT_UTF8_CHAR Perl_isC9_STRICT_UTF8_CHAR -#define isSTRICT_UTF8_CHAR Perl_isSTRICT_UTF8_CHAR -#define isUTF8_CHAR Perl_isUTF8_CHAR -#define isUTF8_CHAR_flags Perl_isUTF8_CHAR_flags -#define is_c9strict_utf8_string_loclen Perl_is_c9strict_utf8_string_loclen -#define is_lvalue_sub() Perl_is_lvalue_sub(aTHX) -#define is_safe_syscall(a,b,c,d) Perl_is_safe_syscall(aTHX_ a,b,c,d) -#define is_strict_utf8_string_loclen Perl_is_strict_utf8_string_loclen -#define is_utf8_FF_helper_ Perl_is_utf8_FF_helper_ -#ifndef NO_MATHOMS -#define is_utf8_char Perl_is_utf8_char -#endif -#define is_utf8_char_helper_ Perl_is_utf8_char_helper_ -#define is_utf8_fixed_width_buf_loclen_flags Perl_is_utf8_fixed_width_buf_loclen_flags -#define is_utf8_invariant_string_loc Perl_is_utf8_invariant_string_loc -#define is_utf8_string_flags Perl_is_utf8_string_flags -#define is_utf8_string_loclen Perl_is_utf8_string_loclen -#define is_utf8_string_loclen_flags Perl_is_utf8_string_loclen_flags -#define is_utf8_valid_partial_char_flags Perl_is_utf8_valid_partial_char_flags -#define isinfnan Perl_isinfnan -#define leave_adjust_stacks(a,b,c,d) Perl_leave_adjust_stacks(aTHX_ a,b,c,d) -#define leave_scope(a) Perl_leave_scope(aTHX_ a) -#define lex_bufutf8() Perl_lex_bufutf8(aTHX) -#define lex_discard_to(a) Perl_lex_discard_to(aTHX_ a) -#define lex_grow_linestr(a) Perl_lex_grow_linestr(aTHX_ a) -#define lex_next_chunk(a) Perl_lex_next_chunk(aTHX_ a) -#define lex_peek_unichar(a) Perl_lex_peek_unichar(aTHX_ a) -#define lex_read_space(a) Perl_lex_read_space(aTHX_ a) -#define lex_read_to(a) Perl_lex_read_to(aTHX_ a) -#define lex_read_unichar(a) Perl_lex_read_unichar(aTHX_ a) -#define lex_start(a,b,c) Perl_lex_start(aTHX_ a,b,c) -#define lex_stuff_pv(a,b) Perl_lex_stuff_pv(aTHX_ a,b) -#define lex_stuff_pvn(a,b,c) Perl_lex_stuff_pvn(aTHX_ a,b,c) -#define lex_stuff_sv(a,b) Perl_lex_stuff_sv(aTHX_ a,b) -#define lex_unstuff(a) Perl_lex_unstuff(aTHX_ a) -#ifndef MULTIPLICITY -#define load_module Perl_load_module -#endif -#define looks_like_number(a) Perl_looks_like_number(aTHX_ a) -#define lsbit_pos32 Perl_lsbit_pos32 -#define magic_dump(a) Perl_magic_dump(aTHX_ a) -#define markstack_grow() Perl_markstack_grow(aTHX) -#ifndef MULTIPLICITY -#define mess Perl_mess -#endif -#define mess_sv(a,b) Perl_mess_sv(aTHX_ a,b) -#define mg_clear(a) Perl_mg_clear(aTHX_ a) -#define mg_copy(a,b,c,d) Perl_mg_copy(aTHX_ a,b,c,d) -#define mg_find Perl_mg_find -#define mg_findext Perl_mg_findext -#define mg_free(a) Perl_mg_free(aTHX_ a) -#define mg_free_type(a,b) Perl_mg_free_type(aTHX_ a,b) -#define mg_freeext(a,b,c) Perl_mg_freeext(aTHX_ a,b,c) -#define mg_get(a) Perl_mg_get(aTHX_ a) -#define mg_length(a) Perl_mg_length(aTHX_ a) -#define mg_magical Perl_mg_magical -#define mg_set(a) Perl_mg_set(aTHX_ a) -#define mg_size(a) Perl_mg_size(aTHX_ a) -#define mini_mktime Perl_mini_mktime -#define moreswitches(a) Perl_moreswitches(aTHX_ a) -#define mortal_getenv Perl_mortal_getenv -#define mro_get_linear_isa(a) Perl_mro_get_linear_isa(aTHX_ a) -#define mro_method_changed_in(a) Perl_mro_method_changed_in(aTHX_ a) -#define msbit_pos32 Perl_msbit_pos32 -#define my_atof(a) Perl_my_atof(aTHX_ a) -#define my_atof3(a,b,c) Perl_my_atof3(aTHX_ a,b,c) -#define my_dirfd Perl_my_dirfd -#define my_exit(a) Perl_my_exit(aTHX_ a) -#define my_failure_exit() Perl_my_failure_exit(aTHX) -#define my_fflush_all() Perl_my_fflush_all(aTHX) -#define my_fork Perl_my_fork -#define my_popen_list(a,b,c) Perl_my_popen_list(aTHX_ a,b,c) -#define my_setenv(a,b) Perl_my_setenv(aTHX_ a,b) -#define my_socketpair Perl_my_socketpair -#define my_strftime(a,b,c,d,e,f,g,h,i,j) Perl_my_strftime(aTHX_ a,b,c,d,e,f,g,h,i,j) -#define my_strtod Perl_my_strtod -#define newANONATTRSUB(a,b,c,d) Perl_newANONATTRSUB(aTHX_ a,b,c,d) -#define newANONHASH(a) Perl_newANONHASH(aTHX_ a) -#define newANONLIST(a) Perl_newANONLIST(aTHX_ a) -#define newANONSUB(a,b,c) Perl_newANONSUB(aTHX_ a,b,c) -#define newASSIGNOP(a,b,c,d) Perl_newASSIGNOP(aTHX_ a,b,c,d) -#define newAVREF(a) Perl_newAVREF(aTHX_ a) -#define newBINOP(a,b,c,d) Perl_newBINOP(aTHX_ a,b,c,d) -#define newCONDOP(a,b,c,d) Perl_newCONDOP(aTHX_ a,b,c,d) -#define newCONSTSUB(a,b,c) Perl_newCONSTSUB(aTHX_ a,b,c) -#define newCONSTSUB_flags(a,b,c,d,e) Perl_newCONSTSUB_flags(aTHX_ a,b,c,d,e) -#define newCVREF(a,b) Perl_newCVREF(aTHX_ a,b) -#define newDEFEROP(a,b) Perl_newDEFEROP(aTHX_ a,b) -#define newDEFSVOP() Perl_newDEFSVOP(aTHX) -#define newFORM(a,b,c) Perl_newFORM(aTHX_ a,b,c) -#define newFOROP(a,b,c,d,e) Perl_newFOROP(aTHX_ a,b,c,d,e) -#define newGIVENOP(a,b,c) Perl_newGIVENOP(aTHX_ a,b,c) -#define newGVOP(a,b,c) Perl_newGVOP(aTHX_ a,b,c) -#define newGVREF(a,b) Perl_newGVREF(aTHX_ a,b) -#define newGVgen_flags(a,b) Perl_newGVgen_flags(aTHX_ a,b) -#define newHVREF(a) Perl_newHVREF(aTHX_ a) -#define newHVhv(a) Perl_newHVhv(aTHX_ a) -#define newLISTOP(a,b,c,d) Perl_newLISTOP(aTHX_ a,b,c,d) -#define newLOGOP(a,b,c,d) Perl_newLOGOP(aTHX_ a,b,c,d) -#define newLOOPEX(a,b) Perl_newLOOPEX(aTHX_ a,b) -#define newLOOPOP(a,b,c,d) Perl_newLOOPOP(aTHX_ a,b,c,d) -#define newMETHOP(a,b,c) Perl_newMETHOP(aTHX_ a,b,c) -#define newMETHOP_named(a,b,c) Perl_newMETHOP_named(aTHX_ a,b,c) -#define newMYSUB(a,b,c,d,e) Perl_newMYSUB(aTHX_ a,b,c,d,e) -#define newNULLLIST() Perl_newNULLLIST(aTHX) -#define newOP(a,b) Perl_newOP(aTHX_ a,b) -#define newPADNAMELIST Perl_newPADNAMELIST -#define newPADNAMEouter Perl_newPADNAMEouter -#define newPADNAMEpvn Perl_newPADNAMEpvn -#define newPMOP(a,b) Perl_newPMOP(aTHX_ a,b) -#define newPROG(a) Perl_newPROG(aTHX_ a) -#define newPVOP(a,b,c) Perl_newPVOP(aTHX_ a,b,c) -#define newRANGE(a,b,c) Perl_newRANGE(aTHX_ a,b,c) -#define newRV(a) Perl_newRV(aTHX_ a) -#define newRV_noinc(a) Perl_newRV_noinc(aTHX_ a) -#define newSLICEOP(a,b,c) Perl_newSLICEOP(aTHX_ a,b,c) -#define newSTATEOP(a,b,c) Perl_newSTATEOP(aTHX_ a,b,c) -#define newSV(a) Perl_newSV(aTHX_ a) -#define newSVOP(a,b,c) Perl_newSVOP(aTHX_ a,b,c) -#define newSVREF(a) Perl_newSVREF(aTHX_ a) -#define newSV_type(a) Perl_newSV_type(aTHX_ a) -#define newSV_type_mortal(a) Perl_newSV_type_mortal(aTHX_ a) -#define newSVhek(a) Perl_newSVhek(aTHX_ a) -#define newSViv(a) Perl_newSViv(aTHX_ a) -#define newSVnv(a) Perl_newSVnv(aTHX_ a) -#define newSVpv(a,b) Perl_newSVpv(aTHX_ a,b) -#define newSVpv_share(a,b) Perl_newSVpv_share(aTHX_ a,b) -#ifndef MULTIPLICITY -#define newSVpvf Perl_newSVpvf -#endif -#define newSVpvn(a,b) Perl_newSVpvn(aTHX_ a,b) -#define newSVpvn_flags(a,b,c) Perl_newSVpvn_flags(aTHX_ a,b,c) -#define newSVpvn_share(a,b,c) Perl_newSVpvn_share(aTHX_ a,b,c) -#define newSVrv(a,b) Perl_newSVrv(aTHX_ a,b) -#define newSVsv_flags(a,b) Perl_newSVsv_flags(aTHX_ a,b) -#define newSVuv(a) Perl_newSVuv(aTHX_ a) -#define newTRYCATCHOP(a,b,c,d) Perl_newTRYCATCHOP(aTHX_ a,b,c,d) -#define newUNOP(a,b,c) Perl_newUNOP(aTHX_ a,b,c) -#define newUNOP_AUX(a,b,c,d) Perl_newUNOP_AUX(aTHX_ a,b,c,d) -#define newWHENOP(a,b) Perl_newWHENOP(aTHX_ a,b) -#define newWHILEOP(a,b,c,d,e,f,g) Perl_newWHILEOP(aTHX_ a,b,c,d,e,f,g) -#define newXS(a,b,c) Perl_newXS(aTHX_ a,b,c) -#define newXS_flags(a,b,c,d,e) Perl_newXS_flags(aTHX_ a,b,c,d,e) -#define new_stackinfo(a,b) Perl_new_stackinfo(aTHX_ a,b) -#define new_version(a) Perl_new_version(aTHX_ a) -#define nothreadhook() Perl_nothreadhook(aTHX) -#define op_append_elem(a,b,c) Perl_op_append_elem(aTHX_ a,b,c) -#define op_append_list(a,b,c) Perl_op_append_list(aTHX_ a,b,c) -#define op_class(a) Perl_op_class(aTHX_ a) -#define op_contextualize(a,b) Perl_op_contextualize(aTHX_ a,b) -#define op_convert_list(a,b,c) Perl_op_convert_list(aTHX_ a,b,c) -#define op_dump(a) Perl_op_dump(aTHX_ a) -#define op_free(a) Perl_op_free(aTHX_ a) -#define op_linklist(a) Perl_op_linklist(aTHX_ a) -#define op_null(a) Perl_op_null(aTHX_ a) -#define op_parent Perl_op_parent -#define op_prepend_elem(a,b,c) Perl_op_prepend_elem(aTHX_ a,b,c) -#define op_refcnt_lock() Perl_op_refcnt_lock(aTHX) -#define op_refcnt_unlock() Perl_op_refcnt_unlock(aTHX) -#define op_scope(a) Perl_op_scope(aTHX_ a) -#define op_sibling_splice Perl_op_sibling_splice -#define op_wrap_finally(a,b) Perl_op_wrap_finally(aTHX_ a,b) -#ifndef NO_MATHOMS -#define pack_cat(a,b,c,d,e,f,g) Perl_pack_cat(aTHX_ a,b,c,d,e,f,g) -#endif -#define packlist(a,b,c,d,e) Perl_packlist(aTHX_ a,b,c,d,e) -#define pad_add_anon(a,b) Perl_pad_add_anon(aTHX_ a,b) -#define pad_add_name_pv(a,b,c,d) Perl_pad_add_name_pv(aTHX_ a,b,c,d) -#define pad_add_name_pvn(a,b,c,d,e) Perl_pad_add_name_pvn(aTHX_ a,b,c,d,e) -#define pad_add_name_sv(a,b,c,d) Perl_pad_add_name_sv(aTHX_ a,b,c,d) -#define pad_alloc(a,b) Perl_pad_alloc(aTHX_ a,b) -#ifndef NO_MATHOMS -#define pad_compname_type(a) Perl_pad_compname_type(aTHX_ a) -#endif -#define pad_findmy_pv(a,b) Perl_pad_findmy_pv(aTHX_ a,b) -#define pad_findmy_pvn(a,b,c) Perl_pad_findmy_pvn(aTHX_ a,b,c) -#define pad_findmy_sv(a,b) Perl_pad_findmy_sv(aTHX_ a,b) -#define pad_new(a) Perl_pad_new(aTHX_ a) -#define pad_tidy(a) Perl_pad_tidy(aTHX_ a) -#define padnamelist_fetch Perl_padnamelist_fetch -#define padnamelist_store(a,b,c) Perl_padnamelist_store(aTHX_ a,b,c) -#define parse_arithexpr(a) Perl_parse_arithexpr(aTHX_ a) -#define parse_barestmt(a) Perl_parse_barestmt(aTHX_ a) -#define parse_block(a) Perl_parse_block(aTHX_ a) -#define parse_fullexpr(a) Perl_parse_fullexpr(aTHX_ a) -#define parse_fullstmt(a) Perl_parse_fullstmt(aTHX_ a) -#define parse_label(a) Perl_parse_label(aTHX_ a) -#define parse_listexpr(a) Perl_parse_listexpr(aTHX_ a) -#define parse_stmtseq(a) Perl_parse_stmtseq(aTHX_ a) -#define parse_subsignature(a) Perl_parse_subsignature(aTHX_ a) -#define parse_termexpr(a) Perl_parse_termexpr(aTHX_ a) -#define perly_sighandler Perl_perly_sighandler -#define pmop_dump(a) Perl_pmop_dump(aTHX_ a) -#define pop_scope() Perl_pop_scope(aTHX) -#define pregcomp(a,b) Perl_pregcomp(aTHX_ a,b) -#define pregexec(a,b,c,d,e,f,g) Perl_pregexec(aTHX_ a,b,c,d,e,f,g) -#define pregfree(a) Perl_pregfree(aTHX_ a) -#define pregfree2(a) Perl_pregfree2(aTHX_ a) -#define prescan_version(a,b,c,d,e,f,g) Perl_prescan_version(aTHX_ a,b,c,d,e,f,g) -#define ptr_table_fetch(a,b) Perl_ptr_table_fetch(aTHX_ a,b) -#define ptr_table_free(a) Perl_ptr_table_free(aTHX_ a) -#define ptr_table_new() Perl_ptr_table_new(aTHX) -#define ptr_table_split(a) Perl_ptr_table_split(aTHX_ a) -#define ptr_table_store(a,b,c) Perl_ptr_table_store(aTHX_ a,b,c) -#define push_scope() Perl_push_scope(aTHX) -#define pv_display(a,b,c,d,e) Perl_pv_display(aTHX_ a,b,c,d,e) -#define pv_escape(a,b,c,d,e,f) Perl_pv_escape(aTHX_ a,b,c,d,e,f) -#define pv_pretty(a,b,c,d,e,f,g) Perl_pv_pretty(aTHX_ a,b,c,d,e,f,g) -#define pv_uni_display(a,b,c,d,e) Perl_pv_uni_display(aTHX_ a,b,c,d,e) -#define re_compile(a,b) Perl_re_compile(aTHX_ a,b) -#define re_intuit_start(a,b,c,d,e,f,g) Perl_re_intuit_start(aTHX_ a,b,c,d,e,f,g) -#define re_intuit_string(a) Perl_re_intuit_string(aTHX_ a) -#define reentrant_free() Perl_reentrant_free(aTHX) -#define reentrant_init() Perl_reentrant_init(aTHX) -#define reentrant_retry Perl_reentrant_retry -#define reentrant_size() Perl_reentrant_size(aTHX) -#define reg_named_buff_all(a,b) Perl_reg_named_buff_all(aTHX_ a,b) -#define reg_named_buff_exists(a,b,c) Perl_reg_named_buff_exists(aTHX_ a,b,c) -#define reg_named_buff_fetch(a,b,c) Perl_reg_named_buff_fetch(aTHX_ a,b,c) -#define reg_named_buff_firstkey(a,b) Perl_reg_named_buff_firstkey(aTHX_ a,b) -#define reg_named_buff_nextkey(a,b) Perl_reg_named_buff_nextkey(aTHX_ a,b) -#define reg_named_buff_scalar(a,b) Perl_reg_named_buff_scalar(aTHX_ a,b) -#define regdump(a) Perl_regdump(aTHX_ a) -#define regexec_flags(a,b,c,d,e,f,g,h) Perl_regexec_flags(aTHX_ a,b,c,d,e,f,g,h) -#define regfree_internal(a) Perl_regfree_internal(aTHX_ a) -#define reginitcolors() Perl_reginitcolors(aTHX) -#define regnext(a) Perl_regnext(aTHX_ a) -#define repeatcpy Perl_repeatcpy -#define require_pv(a) Perl_require_pv(aTHX_ a) -#define rninstr Perl_rninstr -#define rsignal(a,b) Perl_rsignal(aTHX_ a,b) -#define rsignal_state(a) Perl_rsignal_state(aTHX_ a) -#define runops_debug() Perl_runops_debug(aTHX) -#define runops_standard() Perl_runops_standard(aTHX) -#define rv2cv_op_cv(a,b) Perl_rv2cv_op_cv(aTHX_ a,b) -#define safesyscalloc Perl_safesyscalloc -#define safesysfree Perl_safesysfree -#define safesysmalloc Perl_safesysmalloc -#define safesysrealloc Perl_safesysrealloc -#define save_I16(a) Perl_save_I16(aTHX_ a) -#define save_I32(a) Perl_save_I32(aTHX_ a) -#define save_I8(a) Perl_save_I8(aTHX_ a) -#define save_adelete(a,b) Perl_save_adelete(aTHX_ a,b) -#define save_aelem_flags(a,b,c,d) Perl_save_aelem_flags(aTHX_ a,b,c,d) -#define save_alloc(a,b) Perl_save_alloc(aTHX_ a,b) -#define save_aptr(a) Perl_save_aptr(aTHX_ a) -#define save_ary(a) Perl_save_ary(aTHX_ a) -#define save_bool(a) Perl_save_bool(aTHX_ a) -#define save_clearsv(a) Perl_save_clearsv(aTHX_ a) -#define save_delete(a,b,c) Perl_save_delete(aTHX_ a,b,c) -#define save_destructor(a,b) Perl_save_destructor(aTHX_ a,b) -#define save_destructor_x(a,b) Perl_save_destructor_x(aTHX_ a,b) -#define save_generic_pvref(a) Perl_save_generic_pvref(aTHX_ a) -#define save_generic_svref(a) Perl_save_generic_svref(aTHX_ a) -#define save_gp(a,b) Perl_save_gp(aTHX_ a,b) -#define save_hash(a) Perl_save_hash(aTHX_ a) -#define save_hdelete(a,b) Perl_save_hdelete(aTHX_ a,b) -#define save_helem_flags(a,b,c,d) Perl_save_helem_flags(aTHX_ a,b,c,d) -#define save_hints() Perl_save_hints(aTHX) -#define save_hptr(a) Perl_save_hptr(aTHX_ a) -#define save_int(a) Perl_save_int(aTHX_ a) -#define save_item(a) Perl_save_item(aTHX_ a) -#define save_iv(a) Perl_save_iv(aTHX_ a) -#ifndef NO_MATHOMS -#define save_list(a,b) Perl_save_list(aTHX_ a,b) -#endif -#ifndef NO_MATHOMS -#define save_long(a) Perl_save_long(aTHX_ a) -#endif -#ifndef NO_MATHOMS -#define save_nogv(a) Perl_save_nogv(aTHX_ a) -#endif -#define save_padsv_and_mortalize(a) Perl_save_padsv_and_mortalize(aTHX_ a) -#define save_pptr(a) Perl_save_pptr(aTHX_ a) -#define save_pushi32ptr(a,b,c) Perl_save_pushi32ptr(aTHX_ a,b,c) -#define save_pushptr(a,b) Perl_save_pushptr(aTHX_ a,b) -#define save_pushptrptr(a,b,c) Perl_save_pushptrptr(aTHX_ a,b,c) -#define save_re_context() Perl_save_re_context(aTHX) -#define save_scalar(a) Perl_save_scalar(aTHX_ a) -#define save_set_svflags(a,b,c) Perl_save_set_svflags(aTHX_ a,b,c) -#define save_shared_pvref(a) Perl_save_shared_pvref(aTHX_ a) -#define save_sptr(a) Perl_save_sptr(aTHX_ a) -#define save_svref(a) Perl_save_svref(aTHX_ a) -#define save_vptr(a) Perl_save_vptr(aTHX_ a) -#define savepv(a) Perl_savepv(aTHX_ a) -#define savepvn(a,b) Perl_savepvn(aTHX_ a,b) -#define savesharedpv(a) Perl_savesharedpv(aTHX_ a) -#define savesharedpvn(a,b) Perl_savesharedpvn(aTHX_ a,b) -#define savesharedsvpv(a) Perl_savesharedsvpv(aTHX_ a) -#define savestack_grow() Perl_savestack_grow(aTHX) -#define savestack_grow_cnt(a) Perl_savestack_grow_cnt(aTHX_ a) -#define savesvpv(a) Perl_savesvpv(aTHX_ a) -#define scan_bin(a,b,c) Perl_scan_bin(aTHX_ a,b,c) -#define scan_hex(a,b,c) Perl_scan_hex(aTHX_ a,b,c) -#define scan_num(a,b) Perl_scan_num(aTHX_ a,b) -#define scan_oct(a,b,c) Perl_scan_oct(aTHX_ a,b,c) -#define scan_version(a,b,c) Perl_scan_version(aTHX_ a,b,c) -#define scan_vstring(a,b,c) Perl_scan_vstring(aTHX_ a,b,c) -#define seed() Perl_seed(aTHX) -#define set_context Perl_set_context -#define setdefout(a) Perl_setdefout(aTHX_ a) -#define share_hek(a,b,c) Perl_share_hek(aTHX_ a,b,c) -#define single_1bit_pos32 Perl_single_1bit_pos32 -#define sortsv(a,b,c) Perl_sortsv(aTHX_ a,b,c) -#define sortsv_flags(a,b,c,d) Perl_sortsv_flags(aTHX_ a,b,c,d) -#define stack_grow(a,b,c) Perl_stack_grow(aTHX_ a,b,c) -#define start_subparse(a,b) Perl_start_subparse(aTHX_ a,b) -#define str_to_version(a) Perl_str_to_version(aTHX_ a) -#define sv_2bool_flags(a,b) Perl_sv_2bool_flags(aTHX_ a,b) -#define sv_2cv(a,b,c,d) Perl_sv_2cv(aTHX_ a,b,c,d) -#define sv_2io(a) Perl_sv_2io(aTHX_ a) -#define sv_2iv_flags(a,b) Perl_sv_2iv_flags(aTHX_ a,b) -#define sv_2mortal(a) Perl_sv_2mortal(aTHX_ a) -#define sv_2nv_flags(a,b) Perl_sv_2nv_flags(aTHX_ a,b) -#define sv_2pv_flags(a,b,c) Perl_sv_2pv_flags(aTHX_ a,b,c) -#define sv_2pvbyte_flags(a,b,c) Perl_sv_2pvbyte_flags(aTHX_ a,b,c) -#define sv_2pvutf8_flags(a,b,c) Perl_sv_2pvutf8_flags(aTHX_ a,b,c) -#define sv_2uv_flags(a,b) Perl_sv_2uv_flags(aTHX_ a,b) -#define sv_backoff Perl_sv_backoff -#define sv_bless(a,b) Perl_sv_bless(aTHX_ a,b) -#define sv_cat_decode(a,b,c,d,e,f) Perl_sv_cat_decode(aTHX_ a,b,c,d,e,f) -#define sv_catpv(a,b) Perl_sv_catpv(aTHX_ a,b) -#define sv_catpv_flags(a,b,c) Perl_sv_catpv_flags(aTHX_ a,b,c) -#define sv_catpv_mg(a,b) Perl_sv_catpv_mg(aTHX_ a,b) -#ifndef MULTIPLICITY -#define sv_catpvf Perl_sv_catpvf -#define sv_catpvf_mg Perl_sv_catpvf_mg -#endif -#define sv_catpvn_flags(a,b,c,d) Perl_sv_catpvn_flags(aTHX_ a,b,c,d) -#define sv_catsv_flags(a,b,c) Perl_sv_catsv_flags(aTHX_ a,b,c) -#define sv_chop(a,b) Perl_sv_chop(aTHX_ a,b) -#define sv_clear(a) Perl_sv_clear(aTHX_ a) -#define sv_cmp_flags(a,b,c) Perl_sv_cmp_flags(aTHX_ a,b,c) -#define sv_cmp_locale_flags(a,b,c) Perl_sv_cmp_locale_flags(aTHX_ a,b,c) -#define sv_copypv_flags(a,b,c) Perl_sv_copypv_flags(aTHX_ a,b,c) -#define sv_dec(a) Perl_sv_dec(aTHX_ a) -#define sv_dec_nomg(a) Perl_sv_dec_nomg(aTHX_ a) -#define sv_derived_from(a,b) Perl_sv_derived_from(aTHX_ a,b) -#define sv_derived_from_pv(a,b,c) Perl_sv_derived_from_pv(aTHX_ a,b,c) -#define sv_derived_from_pvn(a,b,c,d) Perl_sv_derived_from_pvn(aTHX_ a,b,c,d) -#define sv_derived_from_sv(a,b,c) Perl_sv_derived_from_sv(aTHX_ a,b,c) -#define sv_destroyable(a) Perl_sv_destroyable(aTHX_ a) -#define sv_does(a,b) Perl_sv_does(aTHX_ a,b) -#define sv_does_pv(a,b,c) Perl_sv_does_pv(aTHX_ a,b,c) -#define sv_does_pvn(a,b,c,d) Perl_sv_does_pvn(aTHX_ a,b,c,d) -#define sv_does_sv(a,b,c) Perl_sv_does_sv(aTHX_ a,b,c) -#define sv_dump(a) Perl_sv_dump(aTHX_ a) -#define sv_eq_flags(a,b,c) Perl_sv_eq_flags(aTHX_ a,b,c) -#define sv_force_normal_flags(a,b) Perl_sv_force_normal_flags(aTHX_ a,b) -#define sv_free(a) Perl_sv_free(aTHX_ a) -#define sv_get_backrefs Perl_sv_get_backrefs -#define sv_gets(a,b,c) Perl_sv_gets(aTHX_ a,b,c) -#define sv_grow(a,b) Perl_sv_grow(aTHX_ a,b) -#define sv_grow_fresh(a,b) Perl_sv_grow_fresh(aTHX_ a,b) -#define sv_inc(a) Perl_sv_inc(aTHX_ a) -#define sv_inc_nomg(a) Perl_sv_inc_nomg(aTHX_ a) -#define sv_insert_flags(a,b,c,d,e,f) Perl_sv_insert_flags(aTHX_ a,b,c,d,e,f) -#define sv_isa(a,b) Perl_sv_isa(aTHX_ a,b) -#define sv_isa_sv(a,b) Perl_sv_isa_sv(aTHX_ a,b) -#define sv_isobject(a) Perl_sv_isobject(aTHX_ a) -#ifndef NO_MATHOMS -#define sv_iv(a) Perl_sv_iv(aTHX_ a) -#endif -#define sv_len(a) Perl_sv_len(aTHX_ a) -#define sv_len_utf8(a) Perl_sv_len_utf8(aTHX_ a) -#define sv_len_utf8_nomg(a) Perl_sv_len_utf8_nomg(aTHX_ a) -#define sv_magic(a,b,c,d,e) Perl_sv_magic(aTHX_ a,b,c,d,e) -#define sv_magicext(a,b,c,d,e,f) Perl_sv_magicext(aTHX_ a,b,c,d,e,f) -#define sv_mortalcopy_flags(a,b) Perl_sv_mortalcopy_flags(aTHX_ a,b) -#define sv_newmortal() Perl_sv_newmortal(aTHX) -#define sv_newref(a) Perl_sv_newref(aTHX_ a) -#ifndef NO_MATHOMS -#define sv_nolocking(a) Perl_sv_nolocking(aTHX_ a) -#endif -#define sv_nosharing(a) Perl_sv_nosharing(aTHX_ a) -#ifndef NO_MATHOMS -#define sv_nounlocking(a) Perl_sv_nounlocking(aTHX_ a) -#endif -#define sv_numeq_flags(a,b,c) Perl_sv_numeq_flags(aTHX_ a,b,c) -#ifndef NO_MATHOMS -#define sv_nv(a) Perl_sv_nv(aTHX_ a) -#endif -#define sv_peek(a) Perl_sv_peek(aTHX_ a) -#define sv_pos_b2u(a,b) Perl_sv_pos_b2u(aTHX_ a,b) -#define sv_pos_b2u_flags(a,b,c) Perl_sv_pos_b2u_flags(aTHX_ a,b,c) -#define sv_pos_u2b(a,b,c) Perl_sv_pos_u2b(aTHX_ a,b,c) -#define sv_pos_u2b_flags(a,b,c,d) Perl_sv_pos_u2b_flags(aTHX_ a,b,c,d) -#ifndef NO_MATHOMS -#define sv_pvbyten(a,b) Perl_sv_pvbyten(aTHX_ a,b) -#endif -#define sv_pvbyten_force(a,b) Perl_sv_pvbyten_force(aTHX_ a,b) -#ifndef NO_MATHOMS -#define sv_pvn(a,b) Perl_sv_pvn(aTHX_ a,b) -#endif -#define sv_pvn_force_flags(a,b,c) Perl_sv_pvn_force_flags(aTHX_ a,b,c) -#ifndef NO_MATHOMS -#define sv_pvn_nomg(a,b) Perl_sv_pvn_nomg(aTHX_ a,b) -#endif -#ifndef NO_MATHOMS -#define sv_pvutf8n(a,b) Perl_sv_pvutf8n(aTHX_ a,b) -#endif -#define sv_pvutf8n_force(a,b) Perl_sv_pvutf8n_force(aTHX_ a,b) -#define sv_recode_to_utf8(a,b) Perl_sv_recode_to_utf8(aTHX_ a,b) -#define sv_ref(a,b,c) Perl_sv_ref(aTHX_ a,b,c) -#define sv_reftype(a,b) Perl_sv_reftype(aTHX_ a,b) -#define sv_replace(a,b) Perl_sv_replace(aTHX_ a,b) -#define sv_report_used() Perl_sv_report_used(aTHX) -#define sv_reset(a,b) Perl_sv_reset(aTHX_ a,b) -#define sv_rvunweaken(a) Perl_sv_rvunweaken(aTHX_ a) -#define sv_rvweaken(a) Perl_sv_rvweaken(aTHX_ a) -#define sv_set_undef(a) Perl_sv_set_undef(aTHX_ a) -#define sv_setiv(a,b) Perl_sv_setiv(aTHX_ a,b) -#define sv_setiv_mg(a,b) Perl_sv_setiv_mg(aTHX_ a,b) -#define sv_setnv(a,b) Perl_sv_setnv(aTHX_ a,b) -#define sv_setnv_mg(a,b) Perl_sv_setnv_mg(aTHX_ a,b) -#define sv_setpv(a,b) Perl_sv_setpv(aTHX_ a,b) -#define sv_setpv_bufsize(a,b,c) Perl_sv_setpv_bufsize(aTHX_ a,b,c) -#define sv_setpv_mg(a,b) Perl_sv_setpv_mg(aTHX_ a,b) -#ifndef MULTIPLICITY -#define sv_setpvf Perl_sv_setpvf -#define sv_setpvf_mg Perl_sv_setpvf_mg -#endif -#ifndef NO_MATHOMS -#define sv_setpviv(a,b) Perl_sv_setpviv(aTHX_ a,b) -#endif -#ifndef NO_MATHOMS -#define sv_setpviv_mg(a,b) Perl_sv_setpviv_mg(aTHX_ a,b) -#endif -#define sv_setpvn(a,b,c) Perl_sv_setpvn(aTHX_ a,b,c) -#define sv_setpvn_fresh(a,b,c) Perl_sv_setpvn_fresh(aTHX_ a,b,c) -#define sv_setpvn_mg(a,b,c) Perl_sv_setpvn_mg(aTHX_ a,b,c) -#define sv_setref_iv(a,b,c) Perl_sv_setref_iv(aTHX_ a,b,c) -#define sv_setref_nv(a,b,c) Perl_sv_setref_nv(aTHX_ a,b,c) -#define sv_setref_pv(a,b,c) Perl_sv_setref_pv(aTHX_ a,b,c) -#define sv_setref_pvn(a,b,c,d) Perl_sv_setref_pvn(aTHX_ a,b,c,d) -#define sv_setref_uv(a,b,c) Perl_sv_setref_uv(aTHX_ a,b,c) -#define sv_setrv_inc(a,b) Perl_sv_setrv_inc(aTHX_ a,b) -#define sv_setrv_inc_mg(a,b) Perl_sv_setrv_inc_mg(aTHX_ a,b) -#define sv_setrv_noinc(a,b) Perl_sv_setrv_noinc(aTHX_ a,b) -#define sv_setrv_noinc_mg(a,b) Perl_sv_setrv_noinc_mg(aTHX_ a,b) -#define sv_setsv_flags(a,b,c) Perl_sv_setsv_flags(aTHX_ a,b,c) -#define sv_setsv_mg(a,b) Perl_sv_setsv_mg(aTHX_ a,b) -#define sv_setuv(a,b) Perl_sv_setuv(aTHX_ a,b) -#define sv_setuv_mg(a,b) Perl_sv_setuv_mg(aTHX_ a,b) -#define sv_streq_flags(a,b,c) Perl_sv_streq_flags(aTHX_ a,b,c) -#define sv_string_from_errnum(a,b) Perl_sv_string_from_errnum(aTHX_ a,b) -#define sv_tainted(a) Perl_sv_tainted(aTHX_ a) -#define sv_true(a) Perl_sv_true(aTHX_ a) -#define sv_uni_display(a,b,c,d) Perl_sv_uni_display(aTHX_ a,b,c,d) -#define sv_unmagic(a,b) Perl_sv_unmagic(aTHX_ a,b) -#define sv_unmagicext(a,b,c) Perl_sv_unmagicext(aTHX_ a,b,c) -#define sv_unref_flags(a,b) Perl_sv_unref_flags(aTHX_ a,b) -#define sv_untaint(a) Perl_sv_untaint(aTHX_ a) -#define sv_upgrade(a,b) Perl_sv_upgrade(aTHX_ a,b) -#define sv_usepvn_flags(a,b,c,d) Perl_sv_usepvn_flags(aTHX_ a,b,c,d) -#define sv_utf8_decode(a) Perl_sv_utf8_decode(aTHX_ a) -#define sv_utf8_downgrade_flags(a,b,c) Perl_sv_utf8_downgrade_flags(aTHX_ a,b,c) -#define sv_utf8_encode(a) Perl_sv_utf8_encode(aTHX_ a) -#define sv_utf8_upgrade_flags_grow(a,b,c) Perl_sv_utf8_upgrade_flags_grow(aTHX_ a,b,c) -#ifndef NO_MATHOMS -#define sv_uv(a) Perl_sv_uv(aTHX_ a) -#endif -#define sv_vcatpvf(a,b,c) Perl_sv_vcatpvf(aTHX_ a,b,c) -#define sv_vcatpvf_mg(a,b,c) Perl_sv_vcatpvf_mg(aTHX_ a,b,c) -#define sv_vcatpvfn(a,b,c,d,e,f,g) Perl_sv_vcatpvfn(aTHX_ a,b,c,d,e,f,g) -#define sv_vcatpvfn_flags(a,b,c,d,e,f,g,h) Perl_sv_vcatpvfn_flags(aTHX_ a,b,c,d,e,f,g,h) -#define sv_vsetpvf(a,b,c) Perl_sv_vsetpvf(aTHX_ a,b,c) -#define sv_vsetpvf_mg(a,b,c) Perl_sv_vsetpvf_mg(aTHX_ a,b,c) -#define sv_vsetpvfn(a,b,c,d,e,f,g) Perl_sv_vsetpvfn(aTHX_ a,b,c,d,e,f,g) -#define switch_to_global_locale Perl_switch_to_global_locale -#define sync_locale Perl_sync_locale -#define taint_env() Perl_taint_env(aTHX) -#define taint_proper(a,b) Perl_taint_proper(aTHX_ a,b) -#define thread_locale_init Perl_thread_locale_init -#define thread_locale_term Perl_thread_locale_term -#define to_uni_lower(a,b,c) Perl_to_uni_lower(aTHX_ a,b,c) -#define to_uni_title(a,b,c) Perl_to_uni_title(aTHX_ a,b,c) -#define to_uni_upper(a,b,c) Perl_to_uni_upper(aTHX_ a,b,c) -#ifndef NO_MATHOMS -#define unpack_str(a,b,c,d,e,f,g,h) Perl_unpack_str(aTHX_ a,b,c,d,e,f,g,h) -#endif -#define unpackstring(a,b,c,d,e) Perl_unpackstring(aTHX_ a,b,c,d,e) -#define unsharepvn(a,b,c) Perl_unsharepvn(aTHX_ a,b,c) -#define upg_version(a,b) Perl_upg_version(aTHX_ a,b) -#define utf8_distance(a,b) Perl_utf8_distance(aTHX_ a,b) -#define utf8_hop Perl_utf8_hop -#define utf8_hop_back Perl_utf8_hop_back -#define utf8_hop_forward Perl_utf8_hop_forward -#define utf8_hop_safe Perl_utf8_hop_safe -#define utf8_length(a,b) Perl_utf8_length(aTHX_ a,b) -#define utf8_to_bytes(a,b) Perl_utf8_to_bytes(aTHX_ a,b) -#ifndef NO_MATHOMS -#define utf8_to_uvchr(a,b) Perl_utf8_to_uvchr(aTHX_ a,b) -#endif -#define utf8_to_uvchr_buf_helper(a,b,c) Perl_utf8_to_uvchr_buf_helper(aTHX_ a,b,c) -#ifndef NO_MATHOMS -#define utf8_to_uvuni(a,b) Perl_utf8_to_uvuni(aTHX_ a,b) -#endif -#define utf8_to_uvuni_buf(a,b,c) Perl_utf8_to_uvuni_buf(aTHX_ a,b,c) -#define utf8n_to_uvchr_msgs Perl_utf8n_to_uvchr_msgs -#ifndef NO_MATHOMS -#define utf8n_to_uvuni(a,b,c,d) Perl_utf8n_to_uvuni(aTHX_ a,b,c,d) -#endif -#define uvoffuni_to_utf8_flags_msgs(a,b,c,d) Perl_uvoffuni_to_utf8_flags_msgs(aTHX_ a,b,c,d) -#define uvuni_to_utf8(a,b) Perl_uvuni_to_utf8(aTHX_ a,b) -#ifndef NO_MATHOMS -#define uvuni_to_utf8_flags(a,b,c) Perl_uvuni_to_utf8_flags(aTHX_ a,b,c) -#endif -#define valid_utf8_to_uvchr Perl_valid_utf8_to_uvchr -#ifndef NO_MATHOMS -#define valid_utf8_to_uvuni(a,b) Perl_valid_utf8_to_uvuni(aTHX_ a,b) -#endif -#define vcmp(a,b) Perl_vcmp(aTHX_ a,b) -#define vcroak(a,b) Perl_vcroak(aTHX_ a,b) -#define vdeb(a,b) Perl_vdeb(aTHX_ a,b) -#define vform(a,b) Perl_vform(aTHX_ a,b) -#define vload_module(a,b,c,d) Perl_vload_module(aTHX_ a,b,c,d) -#define vmess(a,b) Perl_vmess(aTHX_ a,b) -#define vnewSVpvf(a,b) Perl_vnewSVpvf(aTHX_ a,b) -#define vnormal(a) Perl_vnormal(aTHX_ a) -#define vnumify(a) Perl_vnumify(aTHX_ a) -#define vstringify(a) Perl_vstringify(aTHX_ a) -#define vverify(a) Perl_vverify(aTHX_ a) -#define vwarn(a,b) Perl_vwarn(aTHX_ a,b) -#define vwarner(a,b,c) Perl_vwarner(aTHX_ a,b,c) -#ifndef MULTIPLICITY -#define warn Perl_warn -#endif -#define warn_sv(a) Perl_warn_sv(aTHX_ a) -#ifndef MULTIPLICITY -#define warner Perl_warner -#endif -#define whichsig_pv(a) Perl_whichsig_pv(aTHX_ a) -#define whichsig_pvn(a,b) Perl_whichsig_pvn(aTHX_ a,b) -#define whichsig_sv(a) Perl_whichsig_sv(aTHX_ a) -#define wrap_keyword_plugin(a,b) Perl_wrap_keyword_plugin(aTHX_ a,b) -#define wrap_op_checker(a,b,c) Perl_wrap_op_checker(aTHX_ a,b,c) -#if !(defined(PERL_USE_3ARG_SIGHANDLER)) -#define csighandler Perl_csighandler -#endif -#if !defined(EBCDIC) -#define variant_byte_number Perl_variant_byte_number -#endif -#if !defined(HAS_STRLCAT) -#define my_strlcat Perl_my_strlcat -#endif -#if !defined(HAS_STRLCPY) -#define my_strlcpy Perl_my_strlcpy -#endif -#if !defined(HAS_STRNLEN) -#define my_strnlen Perl_my_strnlen -#endif -#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP) -#define my_chsize(a,b) Perl_my_chsize(aTHX_ a,b) -#endif -#if !defined(PERL_IMPLICIT_SYS) -#define my_pclose(a) Perl_my_pclose(aTHX_ a) -#define my_popen(a,b) Perl_my_popen(aTHX_ a,b) -#endif -#if !defined(PERL_NO_INLINE_FUNCTIONS) -#define cx_popblock(a) Perl_cx_popblock(aTHX_ a) -#define cx_popeval(a) Perl_cx_popeval(aTHX_ a) -#define cx_popformat(a) Perl_cx_popformat(aTHX_ a) -#define cx_popgiven(a) Perl_cx_popgiven(aTHX_ a) -#define cx_poploop(a) Perl_cx_poploop(aTHX_ a) -#define cx_popsub(a) Perl_cx_popsub(aTHX_ a) -#define cx_popsub_args(a) Perl_cx_popsub_args(aTHX_ a) -#define cx_popsub_common(a) Perl_cx_popsub_common(aTHX_ a) -#define cx_popwhen(a) Perl_cx_popwhen(aTHX_ a) -#define cx_pushblock(a,b,c,d) Perl_cx_pushblock(aTHX_ a,b,c,d) -#define cx_pusheval(a,b,c) Perl_cx_pusheval(aTHX_ a,b,c) -#define cx_pushformat(a,b,c,d) Perl_cx_pushformat(aTHX_ a,b,c,d) -#define cx_pushgiven(a,b) Perl_cx_pushgiven(aTHX_ a,b) -#define cx_pushloop_for(a,b,c) Perl_cx_pushloop_for(aTHX_ a,b,c) -#define cx_pushloop_plain(a) Perl_cx_pushloop_plain(aTHX_ a) -#define cx_pushsub(a,b,c,d) Perl_cx_pushsub(aTHX_ a,b,c,d) -#define cx_pushtry(a,b) Perl_cx_pushtry(aTHX_ a,b) -#define cx_pushwhen(a) Perl_cx_pushwhen(aTHX_ a) -#define cx_topblock(a) Perl_cx_topblock(aTHX_ a) -#define gimme_V() Perl_gimme_V(aTHX) -#endif -#if defined(DEBUGGING) -#define pad_setsv(a,b) Perl_pad_setsv(aTHX_ a,b) -#define pad_sv(a) Perl_pad_sv(aTHX_ a) -#endif -#if defined(HAVE_INTERP_INTERN) -#define sys_intern_clear() Perl_sys_intern_clear(aTHX) -#define sys_intern_init() Perl_sys_intern_init(aTHX) -# if defined(USE_ITHREADS) -#define sys_intern_dup(a,b) Perl_sys_intern_dup(aTHX_ a,b) -# endif -#endif -#if defined(MULTIPLICITY) -#define croak_nocontext Perl_croak_nocontext -#define deb_nocontext Perl_deb_nocontext -#define die_nocontext Perl_die_nocontext -#define form_nocontext Perl_form_nocontext -#ifndef NO_MATHOMS -#define fprintf_nocontext Perl_fprintf_nocontext -#endif -#define load_module_nocontext Perl_load_module_nocontext -#define mess_nocontext Perl_mess_nocontext -#define newSVpvf_nocontext Perl_newSVpvf_nocontext -#ifndef NO_MATHOMS -#define printf_nocontext Perl_printf_nocontext -#endif -#define sv_catpvf_mg_nocontext Perl_sv_catpvf_mg_nocontext -#define sv_catpvf_nocontext Perl_sv_catpvf_nocontext -#define sv_setpvf_mg_nocontext Perl_sv_setpvf_mg_nocontext -#define sv_setpvf_nocontext Perl_sv_setpvf_nocontext -#define warn_nocontext Perl_warn_nocontext -#define warner_nocontext Perl_warner_nocontext -#endif -#if defined(MYMALLOC) -#define dump_mstats(a) Perl_dump_mstats(aTHX_ a) -#define get_mstats(a,b,c) Perl_get_mstats(aTHX_ a,b,c) -#endif -#if defined(PERL_IN_SV_C) -#define more_sv() Perl_more_sv(aTHX) -#endif -#if defined(PERL_MEM_LOG) -#define mem_log_alloc Perl_mem_log_alloc -#define mem_log_del_sv Perl_mem_log_del_sv -#define mem_log_free Perl_mem_log_free -#define mem_log_new_sv Perl_mem_log_new_sv -#define mem_log_realloc Perl_mem_log_realloc -#endif -#if defined(PERL_USE_3ARG_SIGHANDLER) -#define csighandler Perl_csighandler -#endif -#if defined(U64TYPE) /* HAS_QUAD undefined outside of core */ -#define lsbit_pos64 Perl_lsbit_pos64 -#define msbit_pos64 Perl_msbit_pos64 -#define single_1bit_pos64 Perl_single_1bit_pos64 -#endif -#if defined(UNLINK_ALL_VERSIONS) -#define unlnk(a) Perl_unlnk(aTHX_ a) -#endif -#if defined(USE_C_BACKTRACE) -#define dump_c_backtrace(a,b,c) Perl_dump_c_backtrace(aTHX_ a,b,c) -#define get_c_backtrace_dump(a,b) Perl_get_c_backtrace_dump(aTHX_ a,b) -#endif -#if defined(USE_ITHREADS) -#define alloccopstash(a) Perl_alloccopstash(aTHX_ a) -#define any_dup(a,b) Perl_any_dup(aTHX_ a,b) -#define cop_file_avn(a) Perl_cop_file_avn(aTHX_ a) -#define cx_dup(a,b,c,d) Perl_cx_dup(aTHX_ a,b,c,d) -#define dirp_dup(a,b) Perl_dirp_dup(aTHX_ a,b) -#define fp_dup(a,b,c) Perl_fp_dup(aTHX_ a,b,c) -#define gp_dup(a,b) Perl_gp_dup(aTHX_ a,b) -#define he_dup(a,b,c) Perl_he_dup(aTHX_ a,b,c) -#define hek_dup(a,b) Perl_hek_dup(aTHX_ a,b) -#define mg_dup(a,b) Perl_mg_dup(aTHX_ a,b) -#define newPADOP(a,b,c) Perl_newPADOP(aTHX_ a,b,c) -#define parser_dup(a,b) Perl_parser_dup(aTHX_ a,b) -#define re_dup_guts(a,b,c) Perl_re_dup_guts(aTHX_ a,b,c) -#define regdupe_internal(a,b) Perl_regdupe_internal(aTHX_ a,b) -#define rvpv_dup(a,b,c) Perl_rvpv_dup(aTHX_ a,b,c) -#define si_dup(a,b) Perl_si_dup(aTHX_ a,b) -#define ss_dup(a,b) Perl_ss_dup(aTHX_ a,b) -#define sv_dup(a,b) Perl_sv_dup(aTHX_ a,b) -#define sv_dup_inc(a,b) Perl_sv_dup_inc(aTHX_ a,b) -#endif -#if defined(USE_LOCALE) && ( defined(PERL_IN_LOCALE_C) || defined(PERL_IN_MG_C) || defined (PERL_EXT_POSIX) || defined (PERL_EXT_LANGINFO)) -#define _is_cur_LC_category_utf8(a) Perl__is_cur_LC_category_utf8(aTHX_ a) -#endif -#if defined(USE_LOCALE_COLLATE) -#define sv_collxfrm_flags(a,b,c) Perl_sv_collxfrm_flags(aTHX_ a,b,c) -#endif -#if defined(USE_PERLIO) -#define PerlIO_clearerr(a) Perl_PerlIO_clearerr(aTHX_ a) -#define PerlIO_close(a) Perl_PerlIO_close(aTHX_ a) -#define PerlIO_eof(a) Perl_PerlIO_eof(aTHX_ a) -#define PerlIO_error(a) Perl_PerlIO_error(aTHX_ a) -#define PerlIO_fileno(a) Perl_PerlIO_fileno(aTHX_ a) -#define PerlIO_fill(a) Perl_PerlIO_fill(aTHX_ a) -#define PerlIO_flush(a) Perl_PerlIO_flush(aTHX_ a) -#define PerlIO_get_base(a) Perl_PerlIO_get_base(aTHX_ a) -#define PerlIO_get_bufsiz(a) Perl_PerlIO_get_bufsiz(aTHX_ a) -#define PerlIO_get_cnt(a) Perl_PerlIO_get_cnt(aTHX_ a) -#define PerlIO_get_ptr(a) Perl_PerlIO_get_ptr(aTHX_ a) -#define PerlIO_read(a,b,c) Perl_PerlIO_read(aTHX_ a,b,c) -#define PerlIO_seek(a,b,c) Perl_PerlIO_seek(aTHX_ a,b,c) -#define PerlIO_set_cnt(a,b) Perl_PerlIO_set_cnt(aTHX_ a,b) -#define PerlIO_set_ptrcnt(a,b,c) Perl_PerlIO_set_ptrcnt(aTHX_ a,b,c) -#define PerlIO_setlinebuf(a) Perl_PerlIO_setlinebuf(aTHX_ a) -#define PerlIO_stderr() Perl_PerlIO_stderr(aTHX) -#define PerlIO_stdin() Perl_PerlIO_stdin(aTHX) -#define PerlIO_stdout() Perl_PerlIO_stdout(aTHX) -#define PerlIO_tell(a) Perl_PerlIO_tell(aTHX_ a) -#define PerlIO_unread(a,b,c) Perl_PerlIO_unread(aTHX_ a,b,c) -#define PerlIO_write(a,b,c) Perl_PerlIO_write(aTHX_ a,b,c) -#endif -#if defined(WIN32) || defined(VMS) -#define do_aspawn(a,b,c) Perl_do_aspawn(aTHX_ a,b,c) -#define do_spawn(a) Perl_do_spawn(aTHX_ a) -#define do_spawn_nowait(a) Perl_do_spawn_nowait(aTHX_ a) -#endif -#if defined(PERL_CORE) || defined(PERL_EXT) -#define _byte_dump_string(a,b,c) Perl__byte_dump_string(aTHX_ a,b,c) -#define _inverse_folds(a,b,c) Perl__inverse_folds(aTHX_ a,b,c) -#define append_utf8_from_native_byte Perl_append_utf8_from_native_byte -#define av_reify(a) Perl_av_reify(aTHX_ a) -#define cntrl_to_mnemonic Perl_cntrl_to_mnemonic -#define current_re_engine() Perl_current_re_engine(aTHX) -#define cv_ckproto_len_flags(a,b,c,d,e) Perl_cv_ckproto_len_flags(aTHX_ a,b,c,d,e) -#define delimcpy_no_escape Perl_delimcpy_no_escape -#define do_uniprop_match Perl_do_uniprop_match -#define get_and_check_backslash_N_name(a,b,c,d) Perl_get_and_check_backslash_N_name(aTHX_ a,b,c,d) -#define get_deprecated_property_msg Perl_get_deprecated_property_msg -#define get_prop_definition(a) Perl_get_prop_definition(aTHX_ a) -#define get_prop_values Perl_get_prop_values -#define load_charnames(a,b,c,d) Perl_load_charnames(aTHX_ a,b,c,d) -#define mg_find_mglob(a) Perl_mg_find_mglob(aTHX_ a) -#define multiconcat_stringify(a) Perl_multiconcat_stringify(aTHX_ a) -#define multideref_stringify(a,b) Perl_multideref_stringify(aTHX_ a,b) -#define op_clear(a) Perl_op_clear(aTHX_ a) -#define qerror(a) Perl_qerror(aTHX_ a) -#define reg_named_buff(a,b,c,d) Perl_reg_named_buff(aTHX_ a,b,c,d) -#define reg_named_buff_iter(a,b,c) Perl_reg_named_buff_iter(aTHX_ a,b,c) -#define reg_numbered_buff_fetch(a,b,c) Perl_reg_numbered_buff_fetch(aTHX_ a,b,c) -#define reg_numbered_buff_length(a,b,c) Perl_reg_numbered_buff_length(aTHX_ a,b,c) -#define reg_numbered_buff_store(a,b,c) Perl_reg_numbered_buff_store(aTHX_ a,b,c) -#define reg_qr_package(a) Perl_reg_qr_package(aTHX_ a) -#define reg_temp_copy(a,b) Perl_reg_temp_copy(aTHX_ a,b) -#define report_uninit(a) Perl_report_uninit(aTHX_ a) -#define scan_str(a,b,c,d,e) Perl_scan_str(aTHX_ a,b,c,d,e) -#define scan_word(a,b,c,d,e) Perl_scan_word(aTHX_ a,b,c,d,e) -#define skipspace_flags(a,b) Perl_skipspace_flags(aTHX_ a,b) -#define sv_magicext_mglob(a) Perl_sv_magicext_mglob(aTHX_ a) -#define sv_only_taint_gmagic Perl_sv_only_taint_gmagic -#define utf16_to_utf8_base(a,b,c,d,e,f) Perl_utf16_to_utf8_base(aTHX_ a,b,c,d,e,f) -#define utf8_to_utf16_base(a,b,c,d,e,f) Perl_utf8_to_utf16_base(aTHX_ a,b,c,d,e,f) -#define validate_proto(a,b,c,d) Perl_validate_proto(aTHX_ a,b,c,d) -#define vivify_defelem(a) Perl_vivify_defelem(aTHX_ a) -#define yylex() Perl_yylex(aTHX) -# if ! defined(HAS_MEMRCHR) && (defined(PERL_CORE) || defined(PERL_EXT)) -#define my_memrchr S_my_memrchr -# endif -# if !(!defined(PERL_EXT_RE_BUILD)) -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) -#define get_re_gclass_nonbitmap_data(a,b,c,d,e,f) Perl_get_re_gclass_nonbitmap_data(aTHX_ a,b,c,d,e,f) -# endif -# endif -# if !defined(PERL_EXT_RE_BUILD) -# if defined(PERL_IN_REGCOMP_C) -#define _append_range_to_invlist(a,b,c) S__append_range_to_invlist(aTHX_ a,b,c) -#define _invlist_array_init S__invlist_array_init -#define get_invlist_previous_index_addr S_get_invlist_previous_index_addr -#define invlist_clear(a) S_invlist_clear(aTHX_ a) -#define invlist_max S_invlist_max -#define invlist_previous_index S_invlist_previous_index -#define invlist_replace_list_destroys_src(a,b) S_invlist_replace_list_destroys_src(aTHX_ a,b) -#define invlist_set_previous_index S_invlist_set_previous_index -#define invlist_trim S_invlist_trim -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) -#define get_regclass_nonbitmap_data(a,b,c,d,e,f) Perl_get_regclass_nonbitmap_data(aTHX_ a,b,c,d,e,f) -# endif -# endif -# if defined(DEBUGGING) -# if defined(PERL_IN_REGCOMP_C) -#define dump_trie(a,b,c,d) S_dump_trie(aTHX_ a,b,c,d) -#define dump_trie_interim_list(a,b,c,d,e) S_dump_trie_interim_list(aTHX_ a,b,c,d,e) -#define dump_trie_interim_table(a,b,c,d,e) S_dump_trie_interim_table(aTHX_ a,b,c,d,e) -#define dumpuntil(a,b,c,d,e,f,g,h) S_dumpuntil(aTHX_ a,b,c,d,e,f,g,h) -#define put_charclass_bitmap_innards(a,b,c,d,e,f,g) S_put_charclass_bitmap_innards(aTHX_ a,b,c,d,e,f,g) -#define put_charclass_bitmap_innards_common(a,b,c,d,e,f) S_put_charclass_bitmap_innards_common(aTHX_ a,b,c,d,e,f) -#define put_charclass_bitmap_innards_invlist(a,b) S_put_charclass_bitmap_innards_invlist(aTHX_ a,b) -#define put_code_point(a,b) S_put_code_point(aTHX_ a,b) -#define put_range(a,b,c,d) S_put_range(aTHX_ a,b,c,d) -#ifndef MULTIPLICITY -#define re_indentf Perl_re_indentf -#endif -#define regdump_extflags(a,b) S_regdump_extflags(aTHX_ a,b) -#define regdump_intflags(a,b) S_regdump_intflags(aTHX_ a,b) -#define regnode_guts_debug(a,b,c) S_regnode_guts_debug(aTHX_ a,b,c) -#define regtail_study(a,b,c,d) S_regtail_study(aTHX_ a,b,c,d) -# endif -# if defined(PERL_IN_REGEXEC_C) -#define debug_start_match(a,b,c,d,e) S_debug_start_match(aTHX_ a,b,c,d,e) -#define dump_exec_pos(a,b,c,d,e,f,g) S_dump_exec_pos(aTHX_ a,b,c,d,e,f,g) -#ifndef MULTIPLICITY -#define re_exec_indentf Perl_re_exec_indentf -#endif -# endif -# endif -# if defined(DEBUGGING) && defined(ENABLE_REGEX_SETS_DEBUGGING) -# if defined(PERL_IN_REGCOMP_C) -#define dump_regex_sets_structures(a,b,c,d) S_dump_regex_sets_structures(aTHX_ a,b,c,d) -# endif -# endif -# if defined(PERL_ANY_COW) -#define sv_setsv_cow(a,b) Perl_sv_setsv_cow(aTHX_ a,b) -# endif -# if defined(PERL_CORE) || defined (PERL_EXT) -#define is_utf8_non_invariant_string Perl_is_utf8_non_invariant_string -#define sv_or_pv_pos_u2b(a,b,c,d) S_sv_or_pv_pos_u2b(aTHX_ a,b,c,d) -# endif -# if defined(PERL_CORE) || defined(PERL_EXT) -#define isSCRIPT_RUN(a,b,c) Perl_isSCRIPT_RUN(aTHX_ a,b,c) -#define variant_under_utf8_count S_variant_under_utf8_count -# endif -# if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C) -#define gv_stashsvpvn_cached(a,b,c,d) Perl_gv_stashsvpvn_cached(aTHX_ a,b,c,d) -# endif -# if defined(PERL_IN_REGCOMP_C) -#define add_above_Latin1_folds(a,b,c) S_add_above_Latin1_folds(aTHX_ a,b,c) -#define add_data S_add_data -#define add_multi_match(a,b,c) S_add_multi_match(aTHX_ a,b,c) -#define change_engine_size(a,b) S_change_engine_size(aTHX_ a,b) -#define compile_wildcard(a,b,c) S_compile_wildcard(aTHX_ a,b,c) -#define compute_EXACTish S_compute_EXACTish -#define construct_ahocorasick_from_trie(a,b,c) S_construct_ahocorasick_from_trie(aTHX_ a,b,c) -#define edit_distance S_edit_distance -#define execute_wildcard(a,b,c,d,e,f,g) S_execute_wildcard(aTHX_ a,b,c,d,e,f,g) -#define find_first_differing_byte_pos S_find_first_differing_byte_pos -#define get_ANYOFM_contents(a) S_get_ANYOFM_contents(aTHX_ a) -#define get_ANYOF_cp_list_for_ssc(a,b) S_get_ANYOF_cp_list_for_ssc(aTHX_ a,b) -#define get_quantifier_value(a,b,c) S_get_quantifier_value(aTHX_ a,b,c) -#define grok_bslash_N(a,b,c,d,e,f,g) S_grok_bslash_N(aTHX_ a,b,c,d,e,f,g) -#define handle_named_backref(a,b,c,d) S_handle_named_backref(aTHX_ a,b,c,d) -#define handle_names_wildcard(a,b,c,d) S_handle_names_wildcard(aTHX_ a,b,c,d) -#define handle_possible_posix(a,b,c,d,e) S_handle_possible_posix(aTHX_ a,b,c,d,e) -#define handle_regex_sets(a,b,c,d) S_handle_regex_sets(aTHX_ a,b,c,d) -#define handle_user_defined_property(a,b,c,d,e,f,g,h,i,j) S_handle_user_defined_property(aTHX_ a,b,c,d,e,f,g,h,i,j) -#define invlist_contents(a,b) S_invlist_contents(aTHX_ a,b) -#define invlist_is_iterating S_invlist_is_iterating -#define invlist_lowest S_invlist_lowest -#define is_ssc_worth_it S_is_ssc_worth_it -#define join_exact(a,b,c,d,e,f,g) S_join_exact(aTHX_ a,b,c,d,e,f,g) -#define make_exactf_invlist(a,b) S_make_exactf_invlist(aTHX_ a,b) -#define make_trie(a,b,c,d,e,f,g,h) S_make_trie(aTHX_ a,b,c,d,e,f,g,h) -#define nextchar(a) S_nextchar(aTHX_ a) -#define optimize_regclass(a,b,c,d,e,f,g,h,i,j) S_optimize_regclass(aTHX_ a,b,c,d,e,f,g,h,i,j) -#define output_posix_warnings(a,b) S_output_posix_warnings(aTHX_ a,b) -#define parse_lparen_question_flags(a) S_parse_lparen_question_flags(aTHX_ a) -#define parse_uniprop_string(a,b,c,d,e,f,g,h,i,j) S_parse_uniprop_string(aTHX_ a,b,c,d,e,f,g,h,i,j) -#define populate_ANYOF_from_invlist(a,b) S_populate_ANYOF_from_invlist(aTHX_ a,b) -#define rck_elide_nothing(a) S_rck_elide_nothing(aTHX_ a) -#define reg(a,b,c,d) S_reg(aTHX_ a,b,c,d) -#define reg2Lanode(a,b,c,d) S_reg2Lanode(aTHX_ a,b,c,d) -#define reg_la_NOTHING(a,b,c) S_reg_la_NOTHING(aTHX_ a,b,c) -#define reg_la_OPFAIL(a,b,c) S_reg_la_OPFAIL(aTHX_ a,b,c) -#define reg_node(a,b) S_reg_node(aTHX_ a,b) -#define reg_scan_name(a,b) S_reg_scan_name(aTHX_ a,b) -#define reg_skipcomment S_reg_skipcomment -#define reganode(a,b,c) S_reganode(aTHX_ a,b,c) -#define regatom(a,b,c) S_regatom(aTHX_ a,b,c) -#define regbranch(a,b,c,d) S_regbranch(aTHX_ a,b,c,d) -#define regclass(a,b,c,d,e,f,g,h,i) S_regclass(aTHX_ a,b,c,d,e,f,g,h,i) -#define regex_set_precedence S_regex_set_precedence -#define reginsert(a,b,c,d) S_reginsert(aTHX_ a,b,c,d) -#define regnode_guts(a,b) S_regnode_guts(aTHX_ a,b) -#define regpiece(a,b,c) S_regpiece(aTHX_ a,b,c) -#define regpnode(a,b,c) S_regpnode(aTHX_ a,b,c) -#define regtail(a,b,c,d) S_regtail(aTHX_ a,b,c,d) -#define scan_commit(a,b,c,d) S_scan_commit(aTHX_ a,b,c,d) -#define set_ANYOF_arg(a,b,c,d,e) S_set_ANYOF_arg(aTHX_ a,b,c,d,e) -#define set_regex_pv(a,b) S_set_regex_pv(aTHX_ a,b) -#define skip_to_be_ignored_text(a,b,c) S_skip_to_be_ignored_text(aTHX_ a,b,c) -#define ssc_add_range(a,b,c) S_ssc_add_range(aTHX_ a,b,c) -#define ssc_and(a,b,c) S_ssc_and(aTHX_ a,b,c) -#define ssc_anything(a) S_ssc_anything(aTHX_ a) -#define ssc_clear_locale S_ssc_clear_locale -#define ssc_cp_and(a,b) S_ssc_cp_and(aTHX_ a,b) -#define ssc_finalize(a,b) S_ssc_finalize(aTHX_ a,b) -#define ssc_init(a,b) S_ssc_init(aTHX_ a,b) -#define ssc_intersection(a,b,c) S_ssc_intersection(aTHX_ a,b,c) -#define ssc_is_anything S_ssc_is_anything -#define ssc_is_cp_posixl_init S_ssc_is_cp_posixl_init -#define ssc_or(a,b,c) S_ssc_or(aTHX_ a,b,c) -#define ssc_union(a,b,c) S_ssc_union(aTHX_ a,b,c) -#define study_chunk(a,b,c,d,e,f,g,h,i,j,k,l) S_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l) -# endif -# if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C) || defined(PERL_IN_OP_C) -#define _invlist_dump(a,b,c,d) Perl__invlist_dump(aTHX_ a,b,c,d) -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) -#define add_cp_to_invlist(a,b) S_add_cp_to_invlist(aTHX_ a,b) -#define invlist_extend(a,b) S_invlist_extend(aTHX_ a,b) -#define invlist_highest S_invlist_highest -#define invlist_set_len(a,b,c) S_invlist_set_len(aTHX_ a,b,c) -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_UTF8_C) -#define _add_range_to_invlist(a,b,c) Perl__add_range_to_invlist(aTHX_ a,b,c) -#define _invlist_intersection_maybe_complement_2nd(a,b,c,d) Perl__invlist_intersection_maybe_complement_2nd(aTHX_ a,b,c,d) -#define _invlist_invert(a) Perl__invlist_invert(aTHX_ a) -#define _invlist_union_maybe_complement_2nd(a,b,c,d) Perl__invlist_union_maybe_complement_2nd(aTHX_ a,b,c,d) -#define _new_invlist(a) Perl__new_invlist(aTHX_ a) -#define _setup_canned_invlist(a,b,c) Perl__setup_canned_invlist(aTHX_ a,b,c) -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C) -#define form_alien_digit_msg(a,b,c,d,e,f) Perl_form_alien_digit_msg(aTHX_ a,b,c,d,e,f) -#define grok_bslash_c(a,b,c,d) Perl_grok_bslash_c(aTHX_ a,b,c,d) -#define grok_bslash_o(a,b,c,d,e,f,g,h) Perl_grok_bslash_o(aTHX_ a,b,c,d,e,f,g,h) -#define grok_bslash_x(a,b,c,d,e,f,g,h) Perl_grok_bslash_x(aTHX_ a,b,c,d,e,f,g,h) -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) -#define form_cp_too_large_msg(a,b,c,d) Perl_form_cp_too_large_msg(aTHX_ a,b,c,d) -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C) -#define get_invlist_iter_addr S_get_invlist_iter_addr -#define invlist_iterfinish S_invlist_iterfinish -#define invlist_iterinit S_invlist_iterinit -#define invlist_iternext S_invlist_iternext -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PERL_C) || defined(PERL_IN_UTF8_C) -#define _invlistEQ(a,b,c) Perl__invlistEQ(aTHX_ a,b,c) -#define _new_invlist_C_array(a) Perl__new_invlist_C_array(aTHX_ a) -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C) -#define get_regex_charset_name S_get_regex_charset_name -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) -#ifndef MULTIPLICITY -#define re_printf Perl_re_printf -#endif -#define regprop(a,b,c,d,e) Perl_regprop(aTHX_ a,b,c,d,e) -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_PP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) || defined(PERL_IN_DOOP_C) -#define _invlist_contains_cp S__invlist_contains_cp -#define _invlist_len S__invlist_len -#define _invlist_search Perl__invlist_search -#define get_invlist_offset_addr S_get_invlist_offset_addr -#define invlist_array S_invlist_array -#define is_invlist S_is_invlist -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) -#define is_grapheme(a,b,c,d) Perl_is_grapheme(aTHX_ a,b,c,d) -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C) -#define _to_fold_latin1 Perl__to_fold_latin1 -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_SV_C) -#define invlist_clone(a,b) Perl_invlist_clone(aTHX_ a,b) -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) -#define regcurly Perl_regcurly -# endif -# if defined(PERL_IN_REGEXEC_C) -#define advance_one_LB(a,b,c) S_advance_one_LB(aTHX_ a,b,c) -#define advance_one_SB(a,b,c) S_advance_one_SB(aTHX_ a,b,c) -#define advance_one_WB(a,b,c,d) S_advance_one_WB(aTHX_ a,b,c,d) -#define backup_one_GCB(a,b,c) S_backup_one_GCB(aTHX_ a,b,c) -#define backup_one_LB(a,b,c) S_backup_one_LB(aTHX_ a,b,c) -#define backup_one_SB(a,b,c) S_backup_one_SB(aTHX_ a,b,c) -#define backup_one_WB(a,b,c,d) S_backup_one_WB(aTHX_ a,b,c,d) -#define find_byclass(a,b,c,d,e) S_find_byclass(aTHX_ a,b,c,d,e) -#define find_next_masked S_find_next_masked -#define find_span_end S_find_span_end -#define find_span_end_mask S_find_span_end_mask -#define foldEQ_latin1_s2_folded S_foldEQ_latin1_s2_folded -#define isFOO_lc(a,b) S_isFOO_lc(aTHX_ a,b) -#define isFOO_utf8_lc(a,b,c) S_isFOO_utf8_lc(aTHX_ a,b,c) -#define isGCB(a,b,c,d,e) S_isGCB(aTHX_ a,b,c,d,e) -#define isLB(a,b,c,d,e,f) S_isLB(aTHX_ a,b,c,d,e,f) -#define isSB(a,b,c,d,e,f) S_isSB(aTHX_ a,b,c,d,e,f) -#define isWB(a,b,c,d,e,f,g) S_isWB(aTHX_ a,b,c,d,e,f,g) -#define reg_check_named_buff_matched S_reg_check_named_buff_matched -#define regcp_restore(a,b,c) S_regcp_restore(aTHX_ a,b,c _aDEPTH) -#define regcppop(a,b) S_regcppop(aTHX_ a,b _aDEPTH) -#define regcppush(a,b,c) S_regcppush(aTHX_ a,b,c _aDEPTH) -#define reghop3 S_reghop3 -#define reghop4 S_reghop4 -#define reghopmaybe3 S_reghopmaybe3 -#define reginclass(a,b,c,d,e) S_reginclass(aTHX_ a,b,c,d,e) -#define regmatch(a,b,c) S_regmatch(aTHX_ a,b,c) -#define regrepeat(a,b,c,d,e,f) S_regrepeat(aTHX_ a,b,c,d,e,f _aDEPTH) -#define regtry(a,b) S_regtry(aTHX_ a,b) -#define to_byte_substr(a) S_to_byte_substr(aTHX_ a) -#define to_utf8_substr(a) S_to_utf8_substr(aTHX_ a) -# endif -#endif -#ifdef PERL_CORE -#define PerlLIO_dup2_cloexec(a,b) Perl_PerlLIO_dup2_cloexec(aTHX_ a,b) -#define PerlLIO_dup_cloexec(a) Perl_PerlLIO_dup_cloexec(aTHX_ a) -#define PerlLIO_open3_cloexec(a,b,c) Perl_PerlLIO_open3_cloexec(aTHX_ a,b,c) -#define PerlLIO_open_cloexec(a,b) Perl_PerlLIO_open_cloexec(aTHX_ a,b) -#define Slab_Alloc(a) Perl_Slab_Alloc(aTHX_ a) -#define Slab_Free(a) Perl_Slab_Free(aTHX_ a) -#define _warn_problematic_locale Perl__warn_problematic_locale -#define abort_execution(a,b) Perl_abort_execution(aTHX_ a,b) -#define alloc_LOGOP(a,b,c) Perl_alloc_LOGOP(aTHX_ a,b,c) -#define allocmy(a,b,c) Perl_allocmy(aTHX_ a,b,c) -#define amagic_is_enabled(a) Perl_amagic_is_enabled(aTHX_ a) -#define apply(a,b,c) Perl_apply(aTHX_ a,b,c) -#define av_extend_guts(a,b,c,d,e) Perl_av_extend_guts(aTHX_ a,b,c,d,e) -#define av_nonelem(a,b) Perl_av_nonelem(aTHX_ a,b) -#define bind_match(a,b,c) Perl_bind_match(aTHX_ a,b,c) -#define boot_core_PerlIO() Perl_boot_core_PerlIO(aTHX) -#define boot_core_UNIVERSAL() Perl_boot_core_UNIVERSAL(aTHX) -#define boot_core_builtin() Perl_boot_core_builtin(aTHX) -#define boot_core_mro() Perl_boot_core_mro(aTHX) -#define cando(a,b,c) Perl_cando(aTHX_ a,b,c) -#define check_utf8_print(a,b) Perl_check_utf8_print(aTHX_ a,b) -#define ck_anoncode(a) Perl_ck_anoncode(aTHX_ a) -#define ck_backtick(a) Perl_ck_backtick(aTHX_ a) -#define ck_bitop(a) Perl_ck_bitop(aTHX_ a) -#define ck_cmp(a) Perl_ck_cmp(aTHX_ a) -#define ck_concat(a) Perl_ck_concat(aTHX_ a) -#define ck_defined(a) Perl_ck_defined(aTHX_ a) -#define ck_delete(a) Perl_ck_delete(aTHX_ a) -#define ck_each(a) Perl_ck_each(aTHX_ a) -#define ck_eof(a) Perl_ck_eof(aTHX_ a) -#define ck_eval(a) Perl_ck_eval(aTHX_ a) -#define ck_exec(a) Perl_ck_exec(aTHX_ a) -#define ck_exists(a) Perl_ck_exists(aTHX_ a) -#define ck_ftst(a) Perl_ck_ftst(aTHX_ a) -#define ck_fun(a) Perl_ck_fun(aTHX_ a) -#define ck_glob(a) Perl_ck_glob(aTHX_ a) -#define ck_grep(a) Perl_ck_grep(aTHX_ a) -#define ck_index(a) Perl_ck_index(aTHX_ a) -#define ck_isa(a) Perl_ck_isa(aTHX_ a) -#define ck_join(a) Perl_ck_join(aTHX_ a) -#define ck_length(a) Perl_ck_length(aTHX_ a) -#define ck_lfun(a) Perl_ck_lfun(aTHX_ a) -#define ck_listiob(a) Perl_ck_listiob(aTHX_ a) -#define ck_match(a) Perl_ck_match(aTHX_ a) -#define ck_method(a) Perl_ck_method(aTHX_ a) -#define ck_null(a) Perl_ck_null(aTHX_ a) -#define ck_open(a) Perl_ck_open(aTHX_ a) -#define ck_prototype(a) Perl_ck_prototype(aTHX_ a) -#define ck_readline(a) Perl_ck_readline(aTHX_ a) -#define ck_refassign(a) Perl_ck_refassign(aTHX_ a) -#define ck_repeat(a) Perl_ck_repeat(aTHX_ a) -#define ck_require(a) Perl_ck_require(aTHX_ a) -#define ck_return(a) Perl_ck_return(aTHX_ a) -#define ck_rfun(a) Perl_ck_rfun(aTHX_ a) -#define ck_rvconst(a) Perl_ck_rvconst(aTHX_ a) -#define ck_sassign(a) Perl_ck_sassign(aTHX_ a) -#define ck_select(a) Perl_ck_select(aTHX_ a) -#define ck_shift(a) Perl_ck_shift(aTHX_ a) -#define ck_smartmatch(a) Perl_ck_smartmatch(aTHX_ a) -#define ck_sort(a) Perl_ck_sort(aTHX_ a) -#define ck_spair(a) Perl_ck_spair(aTHX_ a) -#define ck_split(a) Perl_ck_split(aTHX_ a) -#define ck_stringify(a) Perl_ck_stringify(aTHX_ a) -#define ck_subr(a) Perl_ck_subr(aTHX_ a) -#define ck_substr(a) Perl_ck_substr(aTHX_ a) -#define ck_svconst(a) Perl_ck_svconst(aTHX_ a) -#define ck_tell(a) Perl_ck_tell(aTHX_ a) -#define ck_trunc(a) Perl_ck_trunc(aTHX_ a) -#define ck_trycatch(a) Perl_ck_trycatch(aTHX_ a) -#define closest_cop(a,b,c,d) Perl_closest_cop(aTHX_ a,b,c,d) -#define cmpchain_extend(a,b,c) Perl_cmpchain_extend(aTHX_ a,b,c) -#define cmpchain_finish(a) Perl_cmpchain_finish(aTHX_ a) -#define cmpchain_start(a,b,c) Perl_cmpchain_start(aTHX_ a,b,c) -#define core_prototype(a,b,c,d) Perl_core_prototype(aTHX_ a,b,c,d) -#define coresub_op(a,b,c) Perl_coresub_op(aTHX_ a,b,c) -#define create_eval_scope(a,b) Perl_create_eval_scope(aTHX_ a,b) -#define croak_caller Perl_croak_caller -#define croak_no_mem Perl_croak_no_mem -#define croak_popstack Perl_croak_popstack -#define custom_op_get_field(a,b) Perl_custom_op_get_field(aTHX_ a,b) -#define cv_clone_into(a,b) Perl_cv_clone_into(aTHX_ a,b) -#define cv_const_sv_or_av Perl_cv_const_sv_or_av -#define cv_forget_slab(a) Perl_cv_forget_slab(aTHX_ a) -#define cv_undef_flags(a,b) Perl_cv_undef_flags(aTHX_ a,b) -#define cvgv_set(a,b) Perl_cvgv_set(aTHX_ a,b) -#define cvstash_set(a,b) Perl_cvstash_set(aTHX_ a,b) -#define deb_stack_all() Perl_deb_stack_all(aTHX) -#define debug_hash_seed(a) Perl_debug_hash_seed(aTHX_ a) -#define defelem_target(a,b) Perl_defelem_target(aTHX_ a,b) -#define delete_eval_scope() Perl_delete_eval_scope(aTHX) -#define die_unwind(a) Perl_die_unwind(aTHX_ a) -#define do_aexec5(a,b,c,d,e) Perl_do_aexec5(aTHX_ a,b,c,d,e) -#define do_dump_pad(a,b,c,d) Perl_do_dump_pad(aTHX_ a,b,c,d) -#define do_eof(a) Perl_do_eof(aTHX_ a) -#define do_ncmp(a,b) Perl_do_ncmp(aTHX_ a,b) -#define do_open6(a,b,c,d,e,f) Perl_do_open6(aTHX_ a,b,c,d,e,f) -#define do_open_raw(a,b,c,d,e,f) Perl_do_open_raw(aTHX_ a,b,c,d,e,f) -#define do_print(a,b) Perl_do_print(aTHX_ a,b) -#define do_readline() Perl_do_readline(aTHX) -#define do_seek(a,b,c) Perl_do_seek(aTHX_ a,b,c) -#define do_sysseek(a,b,c) Perl_do_sysseek(aTHX_ a,b,c) -#define do_tell(a) Perl_do_tell(aTHX_ a) -#define do_trans(a) Perl_do_trans(aTHX_ a) -#define do_vecget(a,b,c) Perl_do_vecget(aTHX_ a,b,c) -#define do_vecset(a) Perl_do_vecset(aTHX_ a) -#define do_vop(a,b,c,d) Perl_do_vop(aTHX_ a,b,c,d) -#define dofile(a,b) Perl_dofile(aTHX_ a,b) -#define dump_all_perl(a) Perl_dump_all_perl(aTHX_ a) -#define dump_packsubs_perl(a,b) Perl_dump_packsubs_perl(aTHX_ a,b) -#define dump_sub_perl(a,b) Perl_dump_sub_perl(aTHX_ a,b) -#define finalize_optree(a) Perl_finalize_optree(aTHX_ a) -#define find_lexical_cv(a) Perl_find_lexical_cv(aTHX_ a) -#define find_runcv_where(a,b,c) Perl_find_runcv_where(aTHX_ a,b,c) -#define find_script(a,b,c,d) Perl_find_script(aTHX_ a,b,c,d) -#define free_tied_hv_pool() Perl_free_tied_hv_pool(aTHX) -#define get_hash_seed(a) Perl_get_hash_seed(aTHX_ a) -#define get_no_modify() Perl_get_no_modify(aTHX) -#define get_opargs() Perl_get_opargs(aTHX) -#define gv_override(a,b) Perl_gv_override(aTHX_ a,b) -#define gv_setref(a,b) Perl_gv_setref(aTHX_ a,b) -#define gv_try_downgrade(a) Perl_gv_try_downgrade(aTHX_ a) -#define hv_ename_add(a,b,c,d) Perl_hv_ename_add(aTHX_ a,b,c,d) -#define hv_ename_delete(a,b,c,d) Perl_hv_ename_delete(aTHX_ a,b,c,d) -#define hv_pushkv(a,b) Perl_hv_pushkv(aTHX_ a,b) -#define init_argv_symbols(a,b) Perl_init_argv_symbols(aTHX_ a,b) -#define init_constants() Perl_init_constants(aTHX) -#define init_debugger() Perl_init_debugger(aTHX) -#define init_named_cv(a,b) Perl_init_named_cv(aTHX_ a,b) -#define init_uniprops() Perl_init_uniprops(aTHX) -#define invert(a) Perl_invert(aTHX_ a) -#define invmap_dump(a,b) Perl_invmap_dump(aTHX_ a,b) -#define io_close(a,b,c,d) Perl_io_close(aTHX_ a,b,c,d) -#define isinfnansv(a) Perl_isinfnansv(aTHX_ a) -#define jmaybe(a) Perl_jmaybe(aTHX_ a) -#define keyword(a,b,c) Perl_keyword(aTHX_ a,b,c) -#define list(a) Perl_list(aTHX_ a) -#define localize(a,b) Perl_localize(aTHX_ a,b) -#define magic_clear_all_env(a,b) Perl_magic_clear_all_env(aTHX_ a,b) -#define magic_cleararylen_p(a,b) Perl_magic_cleararylen_p(aTHX_ a,b) -#define magic_clearenv(a,b) Perl_magic_clearenv(aTHX_ a,b) -#define magic_clearhint(a,b) Perl_magic_clearhint(aTHX_ a,b) -#define magic_clearhints(a,b) Perl_magic_clearhints(aTHX_ a,b) -#define magic_clearisa(a,b) Perl_magic_clearisa(aTHX_ a,b) -#define magic_clearpack(a,b) Perl_magic_clearpack(aTHX_ a,b) -#define magic_clearsig(a,b) Perl_magic_clearsig(aTHX_ a,b) -#define magic_copycallchecker(a,b,c,d,e) Perl_magic_copycallchecker(aTHX_ a,b,c,d,e) -#define magic_existspack(a,b) Perl_magic_existspack(aTHX_ a,b) -#define magic_freearylen_p(a,b) Perl_magic_freearylen_p(aTHX_ a,b) -#define magic_freemglob(a,b) Perl_magic_freemglob(aTHX_ a,b) -#define magic_freeovrld(a,b) Perl_magic_freeovrld(aTHX_ a,b) -#define magic_freeutf8(a,b) Perl_magic_freeutf8(aTHX_ a,b) -#define magic_get(a,b) Perl_magic_get(aTHX_ a,b) -#define magic_getarylen(a,b) Perl_magic_getarylen(aTHX_ a,b) -#define magic_getdebugvar(a,b) Perl_magic_getdebugvar(aTHX_ a,b) -#define magic_getdefelem(a,b) Perl_magic_getdefelem(aTHX_ a,b) -#define magic_getnkeys(a,b) Perl_magic_getnkeys(aTHX_ a,b) -#define magic_getpack(a,b) Perl_magic_getpack(aTHX_ a,b) -#define magic_getpos(a,b) Perl_magic_getpos(aTHX_ a,b) -#define magic_getsig(a,b) Perl_magic_getsig(aTHX_ a,b) -#define magic_getsubstr(a,b) Perl_magic_getsubstr(aTHX_ a,b) -#define magic_gettaint(a,b) Perl_magic_gettaint(aTHX_ a,b) -#define magic_getuvar(a,b) Perl_magic_getuvar(aTHX_ a,b) -#define magic_getvec(a,b) Perl_magic_getvec(aTHX_ a,b) -#define magic_killbackrefs(a,b) Perl_magic_killbackrefs(aTHX_ a,b) -#define magic_nextpack(a,b,c) Perl_magic_nextpack(aTHX_ a,b,c) -#define magic_regdata_cnt(a,b) Perl_magic_regdata_cnt(aTHX_ a,b) -#define magic_regdatum_get(a,b) Perl_magic_regdatum_get(aTHX_ a,b) -#define magic_scalarpack(a,b) Perl_magic_scalarpack(aTHX_ a,b) -#define magic_set(a,b) Perl_magic_set(aTHX_ a,b) -#define magic_set_all_env(a,b) Perl_magic_set_all_env(aTHX_ a,b) -#define magic_setarylen(a,b) Perl_magic_setarylen(aTHX_ a,b) -#define magic_setdbline(a,b) Perl_magic_setdbline(aTHX_ a,b) -#define magic_setdebugvar(a,b) Perl_magic_setdebugvar(aTHX_ a,b) -#define magic_setdefelem(a,b) Perl_magic_setdefelem(aTHX_ a,b) -#define magic_setenv(a,b) Perl_magic_setenv(aTHX_ a,b) -#define magic_sethint(a,b) Perl_magic_sethint(aTHX_ a,b) -#define magic_setisa(a,b) Perl_magic_setisa(aTHX_ a,b) -#define magic_setlvref(a,b) Perl_magic_setlvref(aTHX_ a,b) -#define magic_setmglob(a,b) Perl_magic_setmglob(aTHX_ a,b) -#define magic_setnkeys(a,b) Perl_magic_setnkeys(aTHX_ a,b) -#define magic_setnonelem(a,b) Perl_magic_setnonelem(aTHX_ a,b) -#define magic_setpack(a,b) Perl_magic_setpack(aTHX_ a,b) -#define magic_setpos(a,b) Perl_magic_setpos(aTHX_ a,b) -#define magic_setregexp(a,b) Perl_magic_setregexp(aTHX_ a,b) -#define magic_setsig(a,b) Perl_magic_setsig(aTHX_ a,b) -#define magic_setsigall(a,b) Perl_magic_setsigall(aTHX_ a,b) -#define magic_setsubstr(a,b) Perl_magic_setsubstr(aTHX_ a,b) -#define magic_settaint(a,b) Perl_magic_settaint(aTHX_ a,b) -#define magic_setutf8(a,b) Perl_magic_setutf8(aTHX_ a,b) -#define magic_setuvar(a,b) Perl_magic_setuvar(aTHX_ a,b) -#define magic_setvec(a,b) Perl_magic_setvec(aTHX_ a,b) -#define magic_sizepack(a,b) Perl_magic_sizepack(aTHX_ a,b) -#define magic_wipepack(a,b) Perl_magic_wipepack(aTHX_ a,b) -#define mg_localize(a,b,c) Perl_mg_localize(aTHX_ a,b,c) -#define mode_from_discipline(a,b) Perl_mode_from_discipline(aTHX_ a,b) -#define mro_isa_changed_in(a) Perl_mro_isa_changed_in(aTHX_ a) -#define mro_package_moved(a,b,c,d) Perl_mro_package_moved(aTHX_ a,b,c,d) -#define my_attrs(a,b) Perl_my_attrs(aTHX_ a,b) -#define my_clearenv() Perl_my_clearenv(aTHX) -#define my_lstat_flags(a) Perl_my_lstat_flags(aTHX_ a) -#define my_stat_flags(a) Perl_my_stat_flags(aTHX_ a) -#define my_strerror(a) Perl_my_strerror(aTHX_ a) -#define my_unexec() Perl_my_unexec(aTHX) -#define newATTRSUB_x(a,b,c,d,e,f) Perl_newATTRSUB_x(aTHX_ a,b,c,d,e,f) -#define newSTUB(a,b) Perl_newSTUB(aTHX_ a,b) -#define newSVavdefelem(a,b,c) Perl_newSVavdefelem(aTHX_ a,b,c) -#define newXS_deffile(a,b) Perl_newXS_deffile(aTHX_ a,b) -#define newXS_len_flags(a,b,c,d,e,f,g) Perl_newXS_len_flags(aTHX_ a,b,c,d,e,f,g) -#define nextargv(a,b) Perl_nextargv(aTHX_ a,b) -#define no_bareword_filehandle(a) Perl_no_bareword_filehandle(aTHX_ a) -#define noperl_die Perl_noperl_die -#define notify_parser_that_changed_to_utf8() Perl_notify_parser_that_changed_to_utf8(aTHX) -#define oopsAV(a) Perl_oopsAV(aTHX_ a) -#define oopsHV(a) Perl_oopsHV(aTHX_ a) -#define op_unscope(a) Perl_op_unscope(aTHX_ a) -#define optimize_optree(a) Perl_optimize_optree(aTHX_ a) -#define package(a) Perl_package(aTHX_ a) -#define package_version(a) Perl_package_version(aTHX_ a) -#define pad_add_weakref(a) Perl_pad_add_weakref(aTHX_ a) -#define pad_block_start(a) Perl_pad_block_start(aTHX_ a) -#define pad_fixup_inner_anons(a,b,c) Perl_pad_fixup_inner_anons(aTHX_ a,b,c) -#define pad_free(a) Perl_pad_free(aTHX_ a) -#define pad_leavemy() Perl_pad_leavemy(aTHX) -#define pad_push(a,b) Perl_pad_push(aTHX_ a,b) -#define pad_swipe(a,b) Perl_pad_swipe(aTHX_ a,b) -#define padlist_store(a,b,c) Perl_padlist_store(aTHX_ a,b,c) -#define parse_unicode_opts(a) Perl_parse_unicode_opts(aTHX_ a) -#define parser_free(a) Perl_parser_free(aTHX_ a) -#define peep(a) Perl_peep(aTHX_ a) -#define pmruntime(a,b,c,d,e) Perl_pmruntime(aTHX_ a,b,c,d,e) -#define re_op_compile(a,b,c,d,e,f,g,h) Perl_re_op_compile(aTHX_ a,b,c,d,e,f,g,h) -#define refcounted_he_chain_2hv(a,b) Perl_refcounted_he_chain_2hv(aTHX_ a,b) -#define refcounted_he_fetch_pv(a,b,c,d) Perl_refcounted_he_fetch_pv(aTHX_ a,b,c,d) -#define refcounted_he_fetch_pvn(a,b,c,d,e) Perl_refcounted_he_fetch_pvn(aTHX_ a,b,c,d,e) -#define refcounted_he_fetch_sv(a,b,c,d) Perl_refcounted_he_fetch_sv(aTHX_ a,b,c,d) -#define refcounted_he_free(a) Perl_refcounted_he_free(aTHX_ a) -#define refcounted_he_inc(a) Perl_refcounted_he_inc(aTHX_ a) -#define refcounted_he_new_pv(a,b,c,d,e) Perl_refcounted_he_new_pv(aTHX_ a,b,c,d,e) -#define refcounted_he_new_pvn(a,b,c,d,e,f) Perl_refcounted_he_new_pvn(aTHX_ a,b,c,d,e,f) -#define refcounted_he_new_sv(a,b,c,d,e) Perl_refcounted_he_new_sv(aTHX_ a,b,c,d,e) -#define report_evil_fh(a) Perl_report_evil_fh(aTHX_ a) -#define report_wrongway_fh(a,b) Perl_report_wrongway_fh(aTHX_ a,b) -#define rpeep(a) Perl_rpeep(aTHX_ a) -#define rsignal_restore(a,b) Perl_rsignal_restore(aTHX_ a,b) -#define rsignal_save(a,b,c) Perl_rsignal_save(aTHX_ a,b,c) -#define rxres_save(a,b) Perl_rxres_save(aTHX_ a,b) -#define save_strlen(a) Perl_save_strlen(aTHX_ a) -#define sawparens(a) Perl_sawparens(aTHX_ a) -#define scalar(a) Perl_scalar(aTHX_ a) -#define scalarvoid(a) Perl_scalarvoid(aTHX_ a) -#define set_caret_X() Perl_set_caret_X(aTHX) -#define set_numeric_standard() Perl_set_numeric_standard(aTHX) -#define set_numeric_underlying() Perl_set_numeric_underlying(aTHX) -#define setfd_cloexec Perl_setfd_cloexec -#define setfd_cloexec_for_nonsysfd(a) Perl_setfd_cloexec_for_nonsysfd(aTHX_ a) -#define setfd_cloexec_or_inhexec_by_sysfdness(a) Perl_setfd_cloexec_or_inhexec_by_sysfdness(aTHX_ a) -#define setfd_inhexec Perl_setfd_inhexec -#define setfd_inhexec_for_sysfd(a) Perl_setfd_inhexec_for_sysfd(aTHX_ a) -#define sighandler1 Perl_sighandler1 -#define sighandler3 Perl_sighandler3 -#define sub_crush_depth(a) Perl_sub_crush_depth(aTHX_ a) -#define sv_2num(a) Perl_sv_2num(aTHX_ a) -#define sv_clean_all() Perl_sv_clean_all(aTHX) -#define sv_clean_objs() Perl_sv_clean_objs(aTHX) -#define sv_del_backref(a,b) Perl_sv_del_backref(aTHX_ a,b) -#define sv_free_arenas() Perl_sv_free_arenas(aTHX) -#define sv_resetpvn(a,b,c) Perl_sv_resetpvn(aTHX_ a,b,c) -#define sv_sethek(a,b) Perl_sv_sethek(aTHX_ a,b) -#ifndef MULTIPLICITY -#define tied_method Perl_tied_method -#endif -#define tmps_grow_p(a) Perl_tmps_grow_p(aTHX_ a) -#define unshare_hek(a) Perl_unshare_hek(aTHX_ a) -#define utilize(a,b,c,d,e) Perl_utilize(aTHX_ a,b,c,d,e) -#define vivify_ref(a,b) Perl_vivify_ref(aTHX_ a,b) -#define wait4pid(a,b,c) Perl_wait4pid(aTHX_ a,b,c) -#define watch(a) Perl_watch(aTHX_ a) -#define write_to_stderr(a) Perl_write_to_stderr(aTHX_ a) -#define xs_boot_epilog(a) Perl_xs_boot_epilog(aTHX_ a) -#define yyerror(a) Perl_yyerror(aTHX_ a) -#define yyerror_pv(a,b) Perl_yyerror_pv(aTHX_ a,b) -#define yyerror_pvn(a,b,c) Perl_yyerror_pvn(aTHX_ a,b,c) -#define yyparse(a) Perl_yyparse(aTHX_ a) -#define yyquit() Perl_yyquit(aTHX) -#define yyunlex() Perl_yyunlex(aTHX) -# if !(defined(DEBUGGING)) -# if !defined(NV_PRESERVES_UV) -# if defined(PERL_IN_SV_C) -#define sv_2iuv_non_preserve(a) S_sv_2iuv_non_preserve(aTHX_ a) -# endif -# endif -# endif -# if !(defined(HAS_NL_LANGINFO)) -# if defined(PERL_IN_LOCALE_C) -#define my_nl_langinfo S_my_nl_langinfo -# endif -# endif -# if !(defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION)) -#define do_exec(a) Perl_do_exec(aTHX_ a) -# endif -# if !(defined(PERL_USE_3ARG_SIGHANDLER)) -#define sighandler Perl_sighandler -# endif -# if !(defined(_MSC_VER)) -#define magic_regdatum_set(a,b) Perl_magic_regdatum_set(aTHX_ a,b) -# endif -# if !defined(HAS_GETENV_LEN) -#define getenv_len(a,b) Perl_getenv_len(aTHX_ a,b) -# endif -# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR) -# if defined(PERL_IN_PP_SYS_C) -#define dooneliner(a,b) S_dooneliner(aTHX_ a,b) -# endif -# endif -# if !defined(HAS_RENAME) -#define same_dirent(a,b) Perl_same_dirent(aTHX_ a,b) -# endif -# if !defined(NV_PRESERVES_UV) -# if defined(DEBUGGING) -# if defined(PERL_IN_SV_C) -#define sv_2iuv_non_preserve(a,b) S_sv_2iuv_non_preserve(aTHX_ a,b) -# endif -# endif -# endif -# if !defined(PERL_DISABLE_PMC) -# if defined(PERL_IN_PP_CTL_C) -#define doopen_pm(a) S_doopen_pm(aTHX_ a) -# endif -# endif -# if !defined(PERL_EXT_RE_BUILD) -# if defined(PERL_IN_REGCOMP_C) -#define initialize_invlist_guts(a,b) S_initialize_invlist_guts(aTHX_ a,b) -# endif -# endif -# if !defined(PERL_IS_MINIPERL) -# if defined(PERL_IN_PERL_C) -#define incpush_if_exists(a,b,c) S_incpush_if_exists(aTHX_ a,b,c) -# endif -# endif -# if !defined(PERL_NO_UTF16_FILTER) -# if defined(PERL_IN_TOKE_C) -#define add_utf16_textfilter(a,b) S_add_utf16_textfilter(aTHX_ a,b) -#define utf16_textfilter(a,b,c) S_utf16_textfilter(aTHX_ a,b,c) -# endif -# endif -# if !defined(PURIFY) -# if defined(PERL_IN_HV_C) -#define new_he() S_new_he(aTHX) -# endif -# endif -# if !defined(WIN32) -#define do_exec3(a,b,c) Perl_do_exec3(aTHX_ a,b,c) -# endif -# if 0 /* Not currently used, but may be needed in the future */ -# if defined(PERL_IN_UTF8_C) -#define warn_on_first_deprecated_use(a,b,c,d,e) S_warn_on_first_deprecated_use(aTHX_ a,b,c,d,e) -# endif -# endif -# if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET)) -#define PerlSock_socketpair_cloexec(a,b,c,d) Perl_PerlSock_socketpair_cloexec(aTHX_ a,b,c,d) -# endif -# if defined(DEBUGGING) -#define get_debug_opts(a,b) Perl_get_debug_opts(aTHX_ a,b) -#define set_padlist Perl_set_padlist -# if defined(PERL_IN_LOCALE_C) -# if defined(USE_LOCALE) -#define print_bytes_for_locale(a,b,c) S_print_bytes_for_locale(aTHX_ a,b,c) -#define print_collxfrm_input_and_return(a,b,c,d) S_print_collxfrm_input_and_return(aTHX_ a,b,c,d) -#define setlocale_debug_string S_setlocale_debug_string -# endif -# endif -# if defined(PERL_IN_PAD_C) -#define cv_dump(a,b) S_cv_dump(aTHX_ a,b) -# endif -# if defined(PERL_IN_SV_C) -#define del_sv(a) S_del_sv(aTHX_ a) -# endif -# if defined(PERL_IN_TOKE_C) -#define printbuf(a,b) S_printbuf(aTHX_ a,b) -#define tokereport(a,b) S_tokereport(aTHX_ a,b) -# endif -# endif -# if defined(DEBUG_LEAKING_SCALARS_FORK_DUMP) -#define dump_sv_child(a) Perl_dump_sv_child(aTHX_ a) -# endif -# if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) -#define do_ipcctl(a,b,c) Perl_do_ipcctl(aTHX_ a,b,c) -#define do_ipcget(a,b,c) Perl_do_ipcget(aTHX_ a,b,c) -#define do_msgrcv(a,b) Perl_do_msgrcv(aTHX_ a,b) -#define do_msgsnd(a,b) Perl_do_msgsnd(aTHX_ a,b) -#define do_semop(a,b) Perl_do_semop(aTHX_ a,b) -#define do_shmio(a,b,c) Perl_do_shmio(aTHX_ a,b,c) -# endif -# if defined(HAS_NL_LANGINFO) -# if defined(PERL_IN_LOCALE_C) -#define my_nl_langinfo S_my_nl_langinfo -# endif -# endif -# if defined(HAS_PIPE) -#define PerlProc_pipe_cloexec(a) Perl_PerlProc_pipe_cloexec(aTHX_ a) -# endif -# if defined(HAS_SOCKET) -#define PerlSock_accept_cloexec(a,b,c) Perl_PerlSock_accept_cloexec(aTHX_ a,b,c) -#define PerlSock_socket_cloexec(a,b,c) Perl_PerlSock_socket_cloexec(aTHX_ a,b,c) -# endif -# if defined(MYMALLOC) -#define malloc_good_size Perl_malloc_good_size -#define malloced_size Perl_malloced_size -# endif -# if defined(PERL_CORE) -#define opslab_force_free(a) Perl_opslab_force_free(aTHX_ a) -#define opslab_free(a) Perl_opslab_free(aTHX_ a) -#define opslab_free_nopad(a) Perl_opslab_free_nopad(aTHX_ a) -#define parser_free_nexttoke_ops(a,b) Perl_parser_free_nexttoke_ops(aTHX_ a,b) -#define should_warn_nl S_should_warn_nl -# if defined(PERL_DEBUG_READONLY_OPS) -#define Slab_to_ro(a) Perl_Slab_to_ro(aTHX_ a) -#define Slab_to_rw(a) Perl_Slab_to_rw(aTHX_ a) -# endif -# endif -# if defined(PERL_CR_FILTER) -# if defined(PERL_IN_TOKE_C) -#define cr_textfilter(a,b,c) S_cr_textfilter(aTHX_ a,b,c) -#define strip_return(a) S_strip_return(aTHX_ a) -# endif -# endif -# if defined(PERL_DEBUG_READONLY_COW) -#define sv_buf_to_ro(a) Perl_sv_buf_to_ro(aTHX_ a) -# if defined(PERL_IN_SV_C) -#define sv_buf_to_rw(a) S_sv_buf_to_rw(aTHX_ a) -# endif -# endif -# if defined(PERL_IN_AV_C) -#define get_aux_mg(a) S_get_aux_mg(aTHX_ a) -# endif -# if defined(PERL_IN_DEB_C) -#define deb_stack_n(a,b,c,d,e) S_deb_stack_n(aTHX_ a,b,c,d,e) -# endif -# if defined(PERL_IN_DOIO_C) -#define argvout_final(a,b,c) S_argvout_final(aTHX_ a,b,c) -#define exec_failed(a,b,c) S_exec_failed(aTHX_ a,b,c) -#define ingroup(a,b) S_ingroup(aTHX_ a,b) -#define openn_cleanup(a,b,c,d,e,f,g,h,i,j,k,l,m) S_openn_cleanup(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l,m) -#define openn_setup(a,b,c,d,e,f) S_openn_setup(aTHX_ a,b,c,d,e,f) -# endif -# if defined(PERL_IN_DOOP_C) -#define do_trans_complex(a,b) S_do_trans_complex(aTHX_ a,b) -#define do_trans_count(a,b) S_do_trans_count(aTHX_ a,b) -#define do_trans_count_invmap(a,b) S_do_trans_count_invmap(aTHX_ a,b) -#define do_trans_invmap(a,b) S_do_trans_invmap(aTHX_ a,b) -#define do_trans_simple(a,b) S_do_trans_simple(aTHX_ a,b) -# endif -# if defined(PERL_IN_DUMP_C) -#define deb_curcv(a) S_deb_curcv(aTHX_ a) -#define debprof(a) S_debprof(aTHX_ a) -#define pm_description(a) S_pm_description(aTHX_ a) -#define sequence_num(a) S_sequence_num(aTHX_ a) -# endif -# if defined(PERL_IN_GV_C) -#define find_default_stash(a,b,c,d,e,f) S_find_default_stash(aTHX_ a,b,c,d,e,f) -#define gv_fetchmeth_internal(a,b,c,d,e,f) S_gv_fetchmeth_internal(aTHX_ a,b,c,d,e,f) -#define gv_init_svtype(a,b) S_gv_init_svtype(aTHX_ a,b) -#define gv_is_in_main(a,b,c) S_gv_is_in_main(aTHX_ a,b,c) -#define gv_magicalize(a,b,c,d,e) S_gv_magicalize(aTHX_ a,b,c,d,e) -#define gv_magicalize_isa(a) S_gv_magicalize_isa(aTHX_ a) -#define gv_stashpvn_internal(a,b,c) S_gv_stashpvn_internal(aTHX_ a,b,c) -#define maybe_multimagic_gv(a,b,c) S_maybe_multimagic_gv(aTHX_ a,b,c) -#define parse_gv_stash_name(a,b,c,d,e,f,g,h) S_parse_gv_stash_name(aTHX_ a,b,c,d,e,f,g,h) -#define require_tie_mod(a,b,c,d,e) S_require_tie_mod(aTHX_ a,b,c,d,e) -# endif -# if defined(PERL_IN_HV_C) -#define clear_placeholders(a,b) S_clear_placeholders(aTHX_ a,b) -#define hsplit(a,b,c) S_hsplit(aTHX_ a,b,c) -#define hv_auxinit(a) S_hv_auxinit(aTHX_ a) -#define hv_delete_common(a,b,c,d,e,f,g) S_hv_delete_common(aTHX_ a,b,c,d,e,f,g) -#define hv_free_ent_ret(a) S_hv_free_ent_ret(aTHX_ a) -#define hv_free_entries(a) S_hv_free_entries(aTHX_ a) -#define hv_magic_check S_hv_magic_check -#define hv_notallowed(a,b,c,d) S_hv_notallowed(aTHX_ a,b,c,d) -#define refcounted_he_value(a) S_refcounted_he_value(aTHX_ a) -#define save_hek_flags S_save_hek_flags -#define share_hek_flags(a,b,c,d) S_share_hek_flags(aTHX_ a,b,c,d) -#define unshare_hek_or_pvn(a,b,c,d) S_unshare_hek_or_pvn(aTHX_ a,b,c,d) -# endif -# if defined(PERL_IN_LOCALE_C) -#define save_to_buffer S_save_to_buffer -# if defined(USE_LOCALE) -#define category_name S_category_name -#define new_collate(a) S_new_collate(aTHX_ a) -#define new_ctype(a) S_new_ctype(aTHX_ a) -#define new_numeric(a) S_new_numeric(aTHX_ a) -#define restore_switched_locale(a,b) S_restore_switched_locale(aTHX_ a,b) -#define set_numeric_radix(a) S_set_numeric_radix(aTHX_ a) -#define stdize_locale(a) S_stdize_locale(aTHX_ a) -#define switch_category_locale_to_template(a,b,c) S_switch_category_locale_to_template(aTHX_ a,b,c) -# if defined(USE_POSIX_2008_LOCALE) -#define emulate_setlocale S_emulate_setlocale -# endif -# if defined(WIN32) -#define win32_setlocale(a,b) S_win32_setlocale(aTHX_ a,b) -# endif -# endif -# endif -# if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_MATHOMS_C) -# if defined(USE_LOCALE_COLLATE) -#define _mem_collxfrm(a,b,c,d) Perl__mem_collxfrm(aTHX_ a,b,c,d) -# endif -# endif -# if defined(PERL_IN_MALLOC_C) -#define adjust_size_and_find_bucket S_adjust_size_and_find_bucket -# endif -# if defined(PERL_IN_MG_C) -#define fixup_errno_string(a) S_fixup_errno_string(aTHX_ a) -#define magic_methcall1(a,b,c,d,e,f) S_magic_methcall1(aTHX_ a,b,c,d,e,f) -#define magic_methpack(a,b,c) S_magic_methpack(aTHX_ a,b,c) -#define restore_magic(a) S_restore_magic(aTHX_ a) -#define save_magic_flags(a,b,c) S_save_magic_flags(aTHX_ a,b,c) -#define unwind_handler_stack(a) S_unwind_handler_stack(aTHX_ a) -# endif -# if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C) -#define translate_substr_offsets Perl_translate_substr_offsets -# endif -# if defined(PERL_IN_MRO_C) -#define mro_clean_isarev(a,b,c,d,e,f) S_mro_clean_isarev(aTHX_ a,b,c,d,e,f) -#define mro_gather_and_rename(a,b,c,d,e) S_mro_gather_and_rename(aTHX_ a,b,c,d,e) -#define mro_get_linear_isa_dfs(a,b) S_mro_get_linear_isa_dfs(aTHX_ a,b) -# endif -# if defined(PERL_IN_NUMERIC_C) -#define output_non_portable(a) S_output_non_portable(aTHX_ a) -# endif -# if defined(PERL_IN_OP_C) -#define apply_attrs(a,b,c) S_apply_attrs(aTHX_ a,b,c) -#define apply_attrs_my(a,b,c,d) S_apply_attrs_my(aTHX_ a,b,c,d) -#define assignment_type(a) S_assignment_type(aTHX_ a) -#define bad_type_gv(a,b,c,d) S_bad_type_gv(aTHX_ a,b,c,d) -#define bad_type_pv(a,b,c,d) S_bad_type_pv(aTHX_ a,b,c,d) -#define clear_special_blocks(a,b,c) S_clear_special_blocks(aTHX_ a,b,c) -#define cop_free(a) S_cop_free(aTHX_ a) -#define dup_attrlist(a) S_dup_attrlist(aTHX_ a) -#define finalize_op(a) S_finalize_op(aTHX_ a) -#define find_and_forget_pmops(a) S_find_and_forget_pmops(aTHX_ a) -#define fold_constants(a) S_fold_constants(aTHX_ a) -#define force_list(a,b) S_force_list(aTHX_ a,b) -#define forget_pmop(a) S_forget_pmop(aTHX_ a) -#define gen_constant_list(a) S_gen_constant_list(aTHX_ a) -#define inplace_aassign(a) S_inplace_aassign(aTHX_ a) -#define is_handle_constructor S_is_handle_constructor -#define listkids(a) S_listkids(aTHX_ a) -#define looks_like_bool(a) S_looks_like_bool(aTHX_ a) -#define modkids(a,b) S_modkids(aTHX_ a,b) -#define move_proto_attr(a,b,c,d) S_move_proto_attr(aTHX_ a,b,c,d) -#define my_kid(a,b,c) S_my_kid(aTHX_ a,b,c) -#define newGIVWHENOP(a,b,c,d,e) S_newGIVWHENOP(aTHX_ a,b,c,d,e) -#define newMETHOP_internal(a,b,c,d) S_newMETHOP_internal(aTHX_ a,b,c,d) -#define new_logop(a,b,c,d) S_new_logop(aTHX_ a,b,c,d) -#define no_bareword_allowed(a) S_no_bareword_allowed(aTHX_ a) -#define no_fh_allowed(a) S_no_fh_allowed(aTHX_ a) -#define op_integerize(a) S_op_integerize(aTHX_ a) -#define op_std_init(a) S_op_std_init(aTHX_ a) -#define optimize_op(a) S_optimize_op(aTHX_ a) -#define pmtrans(a,b,c) S_pmtrans(aTHX_ a,b,c) -#define process_special_blocks(a,b,c,d) S_process_special_blocks(aTHX_ a,b,c,d) -#define ref_array_or_hash(a) S_ref_array_or_hash(aTHX_ a) -#define refkids(a,b) S_refkids(aTHX_ a,b) -#define scalar_mod_type S_scalar_mod_type -#define scalarboolean(a) S_scalarboolean(aTHX_ a) -#define scalarkids(a) S_scalarkids(aTHX_ a) -#define search_const(a) S_search_const(aTHX_ a) -#define simplify_sort(a) S_simplify_sort(aTHX_ a) -#define too_few_arguments_pv(a,b,c) S_too_few_arguments_pv(aTHX_ a,b,c) -#define too_many_arguments_pv(a,b,c) S_too_many_arguments_pv(aTHX_ a,b,c) -#define traverse_op_tree(a,b) S_traverse_op_tree(aTHX_ a,b) -#define voidnonfinal(a) S_voidnonfinal(aTHX_ a) -# if defined(USE_ITHREADS) -#define op_relocate_sv(a,b) S_op_relocate_sv(aTHX_ a,b) -# endif -# endif -# if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C) -#define report_redefined_cv(a,b,c) Perl_report_redefined_cv(aTHX_ a,b,c) -# endif -# if defined(PERL_IN_PAD_C) -#define pad_alloc_name(a,b,c,d) S_pad_alloc_name(aTHX_ a,b,c,d) -#define pad_check_dup(a,b,c) S_pad_check_dup(aTHX_ a,b,c) -#define pad_findlex(a,b,c,d,e,f,g,h,i) S_pad_findlex(aTHX_ a,b,c,d,e,f,g,h,i) -#define pad_reset() S_pad_reset(aTHX) -# endif -# if defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C) -#define PadnameIN_SCOPE S_PadnameIN_SCOPE -# endif -# if defined(PERL_IN_PERL_C) -#define find_beginning(a,b) S_find_beginning(aTHX_ a,b) -#define forbid_setid(a,b) S_forbid_setid(aTHX_ a,b) -#define incpush(a,b,c) S_incpush(aTHX_ a,b,c) -#define incpush_use_sep(a,b,c) S_incpush_use_sep(aTHX_ a,b,c) -#define init_ids() S_init_ids(aTHX) -#define init_interp() S_init_interp(aTHX) -#define init_main_stash() S_init_main_stash(aTHX) -#define init_perllib() S_init_perllib(aTHX) -#define init_postdump_symbols(a,b,c) S_init_postdump_symbols(aTHX_ a,b,c) -#define init_predump_symbols() S_init_predump_symbols(aTHX) -#define mayberelocate(a,b,c) S_mayberelocate(aTHX_ a,b,c) -#define minus_v() S_minus_v(aTHX) -#define my_exit_jump() S_my_exit_jump(aTHX) -#define nuke_stacks() S_nuke_stacks(aTHX) -#define open_script(a,b,c) S_open_script(aTHX_ a,b,c) -#define parse_body(a,b) S_parse_body(aTHX_ a,b) -#define run_body(a) S_run_body(aTHX_ a) -#define usage() S_usage(aTHX) -# endif -# if defined(PERL_IN_PP_C) -#define do_chomp(a,b,c) S_do_chomp(aTHX_ a,b,c) -#define do_delete_local() S_do_delete_local(aTHX) -#define refto(a) S_refto(aTHX_ a) -# endif -# if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C) -#define lossless_NV_to_IV S_lossless_NV_to_IV -# endif -# if defined(PERL_IN_PP_CTL_C) -#define check_type_and_open(a) S_check_type_and_open(aTHX_ a) -#define destroy_matcher(a) S_destroy_matcher(aTHX_ a) -#define do_smartmatch(a,b,c) S_do_smartmatch(aTHX_ a,b,c) -#define docatch(a) S_docatch(aTHX_ a) -#define doeval_compile(a,b,c,d) S_doeval_compile(aTHX_ a,b,c,d) -#define dofindlabel(a,b,c,d,e,f) S_dofindlabel(aTHX_ a,b,c,d,e,f) -#define doparseform(a) S_doparseform(aTHX_ a) -#define dopoptoeval(a) S_dopoptoeval(aTHX_ a) -#define dopoptogivenfor(a) S_dopoptogivenfor(aTHX_ a) -#define dopoptolabel(a,b,c) S_dopoptolabel(aTHX_ a,b,c) -#define dopoptoloop(a) S_dopoptoloop(aTHX_ a) -#define dopoptosub_at(a,b) S_dopoptosub_at(aTHX_ a,b) -#define dopoptowhen(a) S_dopoptowhen(aTHX_ a) -#define make_matcher(a) S_make_matcher(aTHX_ a) -#define matcher_matches_sv(a,b) S_matcher_matches_sv(aTHX_ a,b) -#define num_overflow S_num_overflow -#define path_is_searchable S_path_is_searchable -#define run_user_filter(a,b,c) S_run_user_filter(aTHX_ a,b,c) -#define rxres_free(a) S_rxres_free(aTHX_ a) -#define rxres_restore(a,b) S_rxres_restore(aTHX_ a,b) -#define save_lines(a,b) S_save_lines(aTHX_ a,b) -# endif -# if defined(PERL_IN_PP_HOT_C) -#define do_oddball(a,b) S_do_oddball(aTHX_ a,b) -#define opmethod_stash(a) S_opmethod_stash(aTHX_ a) -#define should_we_output_Debug_r(a) S_should_we_output_Debug_r(aTHX_ a) -# endif -# if defined(PERL_IN_PP_PACK_C) -#define div128(a,b) S_div128(aTHX_ a,b) -#define first_symbol S_first_symbol -#define get_num(a,b) S_get_num(aTHX_ a,b) -#define group_end(a,b,c) S_group_end(aTHX_ a,b,c) -#define is_an_int(a,b) S_is_an_int(aTHX_ a,b) -#define measure_struct(a) S_measure_struct(aTHX_ a) -#define mul128(a,b) S_mul128(aTHX_ a,b) -#define my_bytes_to_utf8 S_my_bytes_to_utf8 -#define need_utf8 S_need_utf8 -#define next_symbol(a) S_next_symbol(aTHX_ a) -#define pack_rec(a,b,c,d) S_pack_rec(aTHX_ a,b,c,d) -#define sv_exp_grow(a,b) S_sv_exp_grow(aTHX_ a,b) -#define unpack_rec(a,b,c,d,e) S_unpack_rec(aTHX_ a,b,c,d,e) -# endif -# if defined(PERL_IN_PP_SORT_C) -#define amagic_cmp(a,b) S_amagic_cmp(aTHX_ a,b) -#define amagic_cmp_desc(a,b) S_amagic_cmp_desc(aTHX_ a,b) -#define amagic_i_ncmp(a,b) S_amagic_i_ncmp(aTHX_ a,b) -#define amagic_i_ncmp_desc(a,b) S_amagic_i_ncmp_desc(aTHX_ a,b) -#define amagic_ncmp(a,b) S_amagic_ncmp(aTHX_ a,b) -#define amagic_ncmp_desc(a,b) S_amagic_ncmp_desc(aTHX_ a,b) -#define cmp_desc(a,b) S_cmp_desc(aTHX_ a,b) -#define sortcv(a,b) S_sortcv(aTHX_ a,b) -#define sortcv_stacked(a,b) S_sortcv_stacked(aTHX_ a,b) -#define sortcv_xsub(a,b) S_sortcv_xsub(aTHX_ a,b) -#define sortsv_flags_impl(a,b,c,d) S_sortsv_flags_impl(aTHX_ a,b,c,d) -#define sv_i_ncmp(a,b) S_sv_i_ncmp(aTHX_ a,b) -#define sv_i_ncmp_desc(a,b) S_sv_i_ncmp_desc(aTHX_ a,b) -#define sv_ncmp(a,b) S_sv_ncmp(aTHX_ a,b) -#define sv_ncmp_desc(a,b) S_sv_ncmp_desc(aTHX_ a,b) -# if defined(USE_LOCALE_COLLATE) -#define amagic_cmp_locale(a,b) S_amagic_cmp_locale(aTHX_ a,b) -#define amagic_cmp_locale_desc(a,b) S_amagic_cmp_locale_desc(aTHX_ a,b) -#define cmp_locale_desc(a,b) S_cmp_locale_desc(aTHX_ a,b) -# endif -# endif -# if defined(PERL_IN_PP_SYS_C) -#define doform(a,b,c) S_doform(aTHX_ a,b,c) -#define space_join_names_mortal(a) S_space_join_names_mortal(aTHX_ a) -# endif -# if defined(PERL_IN_SCOPE_C) -#define save_pushptri32ptr(a,b,c,d) S_save_pushptri32ptr(aTHX_ a,b,c,d) -#define save_scalar_at(a,b) S_save_scalar_at(aTHX_ a,b) -# endif -# if defined(PERL_IN_SV_C) -#define F0convert S_F0convert -#define anonymise_cv_maybe(a,b) S_anonymise_cv_maybe(aTHX_ a,b) -#define assert_uft8_cache_coherent(a,b,c,d) S_assert_uft8_cache_coherent(aTHX_ a,b,c,d) -#define curse(a,b) S_curse(aTHX_ a,b) -#define expect_number(a) S_expect_number(aTHX_ a) -#define find_array_subscript(a,b) S_find_array_subscript(aTHX_ a,b) -#define find_hash_subscript(a,b) S_find_hash_subscript(aTHX_ a,b) -#define find_uninit_var(a,b,c,d) S_find_uninit_var(aTHX_ a,b,c,d) -#define glob_2number(a) S_glob_2number(aTHX_ a) -#define glob_assign_glob(a,b,c) S_glob_assign_glob(aTHX_ a,b,c) -#define not_a_number(a) S_not_a_number(aTHX_ a) -#define not_incrementable(a) S_not_incrementable(aTHX_ a) -#define ptr_table_find S_ptr_table_find -#define sv_2iuv_common(a) S_sv_2iuv_common(aTHX_ a) -#define sv_add_arena(a,b,c) S_sv_add_arena(aTHX_ a,b,c) -#define sv_display(a,b,c) S_sv_display(aTHX_ a,b,c) -#define sv_pos_b2u_midway(a,b,c,d) S_sv_pos_b2u_midway(aTHX_ a,b,c,d) -#define sv_pos_u2b_cached(a,b,c,d,e,f,g) S_sv_pos_u2b_cached(aTHX_ a,b,c,d,e,f,g) -#define sv_pos_u2b_forwards S_sv_pos_u2b_forwards -#define sv_pos_u2b_midway S_sv_pos_u2b_midway -#define sv_unglob(a,b) S_sv_unglob(aTHX_ a,b) -#define uiv_2buf S_uiv_2buf -#define utf8_mg_len_cache_update(a,b,c) S_utf8_mg_len_cache_update(aTHX_ a,b,c) -#define utf8_mg_pos_cache_update(a,b,c,d,e) S_utf8_mg_pos_cache_update(aTHX_ a,b,c,d,e) -#define visit(a,b,c) S_visit(aTHX_ a,b,c) -# if defined(USE_ITHREADS) -#define sv_dup_common(a,b) S_sv_dup_common(aTHX_ a,b) -#define sv_dup_inc_multiple(a,b,c,d) S_sv_dup_inc_multiple(aTHX_ a,b,c,d) -#define unreferenced_to_tmp_stack(a) S_unreferenced_to_tmp_stack(aTHX_ a) -# endif -# endif -# if defined(PERL_IN_SV_C) || defined (PERL_IN_OP_C) -#define varname(a,b,c,d,e,f) Perl_varname(aTHX_ a,b,c,d,e,f) -# endif -# if defined(PERL_IN_TOKE_C) -#define ao(a) S_ao(aTHX_ a) -#define check_uni() S_check_uni(aTHX) -#define checkcomma(a,b,c) S_checkcomma(aTHX_ a,b,c) -#define filter_gets(a,b) S_filter_gets(aTHX_ a,b) -#define find_in_my_stash(a,b) S_find_in_my_stash(aTHX_ a,b) -#define force_ident(a,b) S_force_ident(aTHX_ a,b) -#define force_ident_maybe_lex(a) S_force_ident_maybe_lex(aTHX_ a) -#define force_next(a) S_force_next(aTHX_ a) -#define force_strict_version(a) S_force_strict_version(aTHX_ a) -#define force_version(a,b) S_force_version(aTHX_ a,b) -#define force_word(a,b,c,d) S_force_word(aTHX_ a,b,c,d) -#define get_and_check_backslash_N_name_wrapper(a,b) S_get_and_check_backslash_N_name_wrapper(aTHX_ a,b) -#define incline(a,b) S_incline(aTHX_ a,b) -#define intuit_method(a,b,c) S_intuit_method(aTHX_ a,b,c) -#define intuit_more(a,b) S_intuit_more(aTHX_ a,b) -#define lop(a,b,c) S_lop(aTHX_ a,b,c) -#define missingterm(a,b) S_missingterm(aTHX_ a,b) -#define no_op(a,b) S_no_op(aTHX_ a,b) -#define parse_ident(a,b,c,d,e,f,g) S_parse_ident(aTHX_ a,b,c,d,e,f,g) -#define pending_ident() S_pending_ident(aTHX) -#define scan_const(a) S_scan_const(aTHX_ a) -#define scan_formline(a) S_scan_formline(aTHX_ a) -#define scan_heredoc(a) S_scan_heredoc(aTHX_ a) -#define scan_ident(a,b,c,d) S_scan_ident(aTHX_ a,b,c,d) -#define scan_inputsymbol(a) S_scan_inputsymbol(aTHX_ a) -#define scan_pat(a,b) S_scan_pat(aTHX_ a,b) -#define scan_subst(a) S_scan_subst(aTHX_ a) -#define scan_trans(a) S_scan_trans(aTHX_ a) -#define sublex_done() S_sublex_done(aTHX) -#define sublex_push() S_sublex_push(aTHX) -#define sublex_start() S_sublex_start(aTHX) -#define swallow_bom(a) S_swallow_bom(aTHX_ a) -#define tokenize_use(a,b) S_tokenize_use(aTHX_ a,b) -#define tokeq(a) S_tokeq(aTHX_ a) -#define update_debugger_info(a,b,c) S_update_debugger_info(aTHX_ a,b,c) -#define yywarn(a,b) S_yywarn(aTHX_ a,b) -# endif -# if defined(PERL_IN_UNIVERSAL_C) -#define isa_lookup(a,b,c,d,e) S_isa_lookup(aTHX_ a,b,c,d,e) -#define sv_derived_from_svpvn(a,b,c,d,e) S_sv_derived_from_svpvn(aTHX_ a,b,c,d,e) -# endif -# if defined(PERL_IN_UTF8_C) -#define _to_utf8_case(a,b,c,d,e,f,g,h,i) S__to_utf8_case(aTHX_ a,b,c,d,e,f,g,h,i) -#define check_locale_boundary_crossing(a,b,c,d) S_check_locale_boundary_crossing(aTHX_ a,b,c,d) -#define does_utf8_overflow S_does_utf8_overflow -#define isFF_overlong S_isFF_overlong -#define is_utf8_common(a,b,c) S_is_utf8_common(aTHX_ a,b,c) -#define is_utf8_overlong S_is_utf8_overlong -#define new_msg_hv(a,b,c) S_new_msg_hv(aTHX_ a,b,c) -#define to_case_cp_list(a,b,c,d,e,f,g,h) S_to_case_cp_list(aTHX_ a,b,c,d,e,f,g,h) -#define to_lower_latin1 S_to_lower_latin1 -#define turkic_fc(a,b,c,d) S_turkic_fc(aTHX_ a,b,c,d) -#define turkic_lc(a,b,c,d) S_turkic_lc(aTHX_ a,b,c,d) -#define turkic_uc(a,b,c,d) S_turkic_uc(aTHX_ a,b,c,d) -#define unexpected_non_continuation_text(a,b,c,d) S_unexpected_non_continuation_text(aTHX_ a,b,c,d) -# endif -# if defined(PERL_IN_UTF8_C) || defined(PERL_IN_PP_C) -#define _to_upper_title_latin1(a,b,c,d) Perl__to_upper_title_latin1(aTHX_ a,b,c,d) -# endif -# if defined(PERL_IN_UTIL_C) -#define ckwarn_common(a) S_ckwarn_common(aTHX_ a) -#define invoke_exception_hook(a,b) S_invoke_exception_hook(aTHX_ a,b) -#define mess_alloc() S_mess_alloc(aTHX) -#define with_queued_errors(a) S_with_queued_errors(aTHX_ a) -# if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL) -#define mem_log_common S_mem_log_common -# endif -# endif -# if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C) -#define pidgone(a,b) S_pidgone(aTHX_ a,b) -# endif -# if defined(PERL_USE_3ARG_SIGHANDLER) -#define sighandler Perl_sighandler -# endif -# if defined(USE_C_BACKTRACE) -#define get_c_backtrace(a,b) Perl_get_c_backtrace(aTHX_ a,b) -# endif -# if defined(USE_ITHREADS) -#define mro_meta_dup(a,b) Perl_mro_meta_dup(aTHX_ a,b) -#define padlist_dup(a,b) Perl_padlist_dup(aTHX_ a,b) -#define padname_dup(a,b) Perl_padname_dup(aTHX_ a,b) -#define padnamelist_dup(a,b) Perl_padnamelist_dup(aTHX_ a,b) -# endif -# if defined(USE_LOCALE_COLLATE) -#define magic_freecollxfrm(a,b) Perl_magic_freecollxfrm(aTHX_ a,b) -#define magic_setcollxfrm(a,b) Perl_magic_setcollxfrm(aTHX_ a,b) -#ifndef NO_MATHOMS -#define mem_collxfrm(a,b,c) Perl_mem_collxfrm(aTHX_ a,b,c) -#endif -# endif -# if defined(USE_PERLIO) -#define PerlIO_restore_errno(a) Perl_PerlIO_restore_errno(aTHX_ a) -#define PerlIO_save_errno(a) Perl_PerlIO_save_errno(aTHX_ a) -# endif -# if defined(USE_QUADMATH) -#define quadmath_format_needed Perl_quadmath_format_needed -#define quadmath_format_valid Perl_quadmath_format_valid -# endif -# if defined(_MSC_VER) -#define magic_regdatum_set(a,b) Perl_magic_regdatum_set(aTHX_ a,b) -# endif -#endif - -#endif /* #ifndef PERL_NO_SHORT_NAMES */ - +#if !defined(MULTIPLICITY) +/* undefined symbols, point them back at the usual ones */ +# define Perl_croak_nocontext Perl_croak +# define Perl_deb_nocontext Perl_deb +# define Perl_die_nocontext Perl_die +# define Perl_form_nocontext Perl_form +# define Perl_load_module_nocontext Perl_load_module +# define Perl_mess_nocontext Perl_mess +# define Perl_newSVpvf_nocontext Perl_newSVpvf +# define Perl_sv_catpvf_nocontext Perl_sv_catpvf +# define Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_mg +# define Perl_sv_setpvf_nocontext Perl_sv_setpvf +# define Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_mg +# define Perl_warn_nocontext Perl_warn +# define Perl_warner_nocontext Perl_warner +#endif /* !defined(MULTIPLICITY) */ +#if !defined(PERL_CORE) /* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to - disable them. + * disable them. */ - -#if !defined(PERL_CORE) -# define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr)) -# define sv_setptrref(rv,ptr) sv_setref_iv(rv,NULL,PTR2IV(ptr)) -#endif - -#if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) +# define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr)) +# define sv_setptrref(rv,ptr) sv_setref_iv(rv,NULL,PTR2IV(ptr)) +# if !defined(PERL_NOCOMPAT) /* Compatibility for various misnamed functions. All functions in the API that begin with "perl_" (not "Perl_") take an explicit @@ -2090,59 +57,2111 @@ The following are not like that, but since they had a "perl_" prefix in previous versions, we provide compatibility macros. */ -# define perl_atexit(a,b) call_atexit(a,b) -# define perl_call_argv(a,b,c) call_argv(a,b,c) -# define perl_call_method(a,b) call_method(a,b) -# define perl_call_pv(a,b) call_pv(a,b) -# define perl_call_sv(a,b) call_sv(a,b) -# define perl_eval_pv(a,b) eval_pv(a,b) -# define perl_eval_sv(a,b) eval_sv(a,b) -# define perl_get_av(a,b) get_av(a,b) -# define perl_get_cv(a,b) get_cv(a,b) -# define perl_get_hv(a,b) get_hv(a,b) -# define perl_get_sv(a,b) get_sv(a,b) -# define perl_init_i18nl10n(a) init_i18nl10n(a) -# define perl_init_i18nl14n(a) init_i18nl14n(a) -# define perl_require_pv(a) require_pv(a) +# define perl_atexit(a,b) call_atexit(a,b) +# define perl_call_argv(a,b,c) call_argv(a,b,c) +# define perl_call_method(a,b) call_method(a,b) +# define perl_call_pv(a,b) call_pv(a,b) +# define perl_call_sv(a,b) call_sv(a,b) +# define perl_eval_pv(a,b) eval_pv(a,b) +# define perl_eval_sv(a,b) eval_sv(a,b) +# define perl_get_av(a,b) get_av(a,b) +# define perl_get_cv(a,b) get_cv(a,b) +# define perl_get_hv(a,b) get_hv(a,b) +# define perl_get_sv(a,b) get_sv(a,b) +# define perl_init_i18nl10n(a) init_i18nl10n(a) +# define perl_require_pv(a) require_pv(a) /* varargs functions can't be handled with CPP macros. :-( This provides a set of compatibility functions that don't take an extra argument but grab the context pointer using the macro dTHX. */ -#if defined(MULTIPLICITY) && !defined(PERL_NO_SHORT_NAMES) -# define croak Perl_croak_nocontext -# define deb Perl_deb_nocontext -# define die Perl_die_nocontext -# define form Perl_form_nocontext -# define load_module Perl_load_module_nocontext -# define mess Perl_mess_nocontext -# define newSVpvf Perl_newSVpvf_nocontext -# define sv_catpvf Perl_sv_catpvf_nocontext -# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext -# define sv_setpvf Perl_sv_setpvf_nocontext -# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext -# define warn Perl_warn_nocontext -# define warner Perl_warner_nocontext -#endif -#endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */ +# if defined(MULTIPLICITY) && !defined(PERL_NO_SHORT_NAMES) +# define croak Perl_croak_nocontext +# define deb Perl_deb_nocontext +# define die Perl_die_nocontext +# define form Perl_form_nocontext +# define load_module Perl_load_module_nocontext +# define mess Perl_mess_nocontext +# define newSVpvf Perl_newSVpvf_nocontext +# define sv_catpvf Perl_sv_catpvf_nocontext +# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext +# define sv_setpvf Perl_sv_setpvf_nocontext +# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext +# define warn Perl_warn_nocontext +# define warner Perl_warner_nocontext +# endif /* defined(MULTIPLICITY) && !defined(PERL_NO_SHORT_NAMES) */ +# endif /* !defined(PERL_NOCOMPAT) */ +#endif /* !defined(PERL_CORE) */ +#if !defined(PERL_NO_SHORT_NAMES) -#if !defined(MULTIPLICITY) -/* undefined symbols, point them back at the usual ones */ -# define Perl_croak_nocontext Perl_croak -# define Perl_deb_nocontext Perl_deb -# define Perl_die_nocontext Perl_die -# define Perl_form_nocontext Perl_form -# define Perl_load_module_nocontext Perl_load_module -# define Perl_mess_nocontext Perl_mess -# define Perl_newSVpvf_nocontext Perl_newSVpvf -# define Perl_sv_catpvf_nocontext Perl_sv_catpvf -# define Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_mg -# define Perl_sv_setpvf_nocontext Perl_sv_setpvf -# define Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_mg -# define Perl_warn_nocontext Perl_warn -# define Perl_warner_nocontext Perl_warner -#endif +/* Hide global symbols */ + +# define Gv_AMupdate(a,b) Perl_Gv_AMupdate(aTHX_ a,b) +# define SvAMAGIC_off Perl_SvAMAGIC_off +# define SvAMAGIC_on Perl_SvAMAGIC_on +# define SvGETMAGIC(a) Perl_SvGETMAGIC(aTHX_ a) +# define SvIV(a) Perl_SvIV(aTHX_ a) +# define SvIV_nomg(a) Perl_SvIV_nomg(aTHX_ a) +# define SvNV(a) Perl_SvNV(aTHX_ a) +# define SvNV_nomg(a) Perl_SvNV_nomg(aTHX_ a) +# define SvPVXtrue(a) Perl_SvPVXtrue(aTHX_ a) +# define SvREFCNT_dec_ret_NULL(a) Perl_SvREFCNT_dec_ret_NULL(aTHX_ a) +# define SvTRUE(a) Perl_SvTRUE(aTHX_ a) +# define SvTRUE_NN(a) Perl_SvTRUE_NN(aTHX_ a) +# define SvTRUE_common(a,b) Perl_SvTRUE_common(aTHX_ a,b) +# define SvTRUE_nomg(a) Perl_SvTRUE_nomg(aTHX_ a) +# define SvUV(a) Perl_SvUV(aTHX_ a) +# define SvUV_nomg(a) Perl_SvUV_nomg(aTHX_ a) +# define _force_out_malformed_utf8_message(a,b,c,d) Perl__force_out_malformed_utf8_message(aTHX_ a,b,c,d) +# define _is_in_locale_category(a,b) Perl__is_in_locale_category(aTHX_ a,b) +# define _is_uni_FOO(a,b) Perl__is_uni_FOO(aTHX_ a,b) +# define _is_uni_perl_idcont(a) Perl__is_uni_perl_idcont(aTHX_ a) +# define _is_uni_perl_idstart(a) Perl__is_uni_perl_idstart(aTHX_ a) +# define _is_utf8_FOO(a,b,c) Perl__is_utf8_FOO(aTHX_ a,b,c) +# define _is_utf8_perl_idcont(a,b) Perl__is_utf8_perl_idcont(aTHX_ a,b) +# define _is_utf8_perl_idstart(a,b) Perl__is_utf8_perl_idstart(aTHX_ a,b) +# define _to_uni_fold_flags(a,b,c,d) Perl__to_uni_fold_flags(aTHX_ a,b,c,d) +# define _to_utf8_fold_flags(a,b,c,d,e) Perl__to_utf8_fold_flags(aTHX_ a,b,c,d,e) +# define _to_utf8_lower_flags(a,b,c,d,e) Perl__to_utf8_lower_flags(aTHX_ a,b,c,d,e) +# define _to_utf8_title_flags(a,b,c,d,e) Perl__to_utf8_title_flags(aTHX_ a,b,c,d,e) +# define _to_utf8_upper_flags(a,b,c,d,e) Perl__to_utf8_upper_flags(aTHX_ a,b,c,d,e) +# define _utf8n_to_uvchr_msgs_helper Perl__utf8n_to_uvchr_msgs_helper +# define amagic_call(a,b,c,d) Perl_amagic_call(aTHX_ a,b,c,d) +# define amagic_deref_call(a,b) Perl_amagic_deref_call(aTHX_ a,b) +# define apply_attrs_string(a,b,c,d) Perl_apply_attrs_string(aTHX_ a,b,c,d) +# define apply_builtin_cv_attributes(a,b) Perl_apply_builtin_cv_attributes(aTHX_ a,b) +# define atfork_lock Perl_atfork_lock +# define atfork_unlock Perl_atfork_unlock +# define av_clear(a) Perl_av_clear(aTHX_ a) +# define av_count(a) Perl_av_count(aTHX_ a) +# define av_delete(a,b,c) Perl_av_delete(aTHX_ a,b,c) +# define av_dump(a) Perl_av_dump(aTHX_ a) +# define av_exists(a,b) Perl_av_exists(aTHX_ a,b) +# define av_extend(a,b) Perl_av_extend(aTHX_ a,b) +# define av_fetch(a,b,c) Perl_av_fetch(aTHX_ a,b,c) +# define av_fetch_simple(a,b,c) Perl_av_fetch_simple(aTHX_ a,b,c) +# define av_fill(a,b) Perl_av_fill(aTHX_ a,b) +# define av_len(a) Perl_av_len(aTHX_ a) +# define av_make(a,b) Perl_av_make(aTHX_ a,b) +# define av_new_alloc(a,b) Perl_av_new_alloc(aTHX_ a,b) +# define av_pop(a) Perl_av_pop(aTHX_ a) +# define av_push(a,b) Perl_av_push(aTHX_ a,b) +# define av_push_simple(a,b) Perl_av_push_simple(aTHX_ a,b) +# define av_shift(a) Perl_av_shift(aTHX_ a) +# define av_store(a,b,c) Perl_av_store(aTHX_ a,b,c) +# define av_store_simple(a,b,c) Perl_av_store_simple(aTHX_ a,b,c) +# define av_undef(a) Perl_av_undef(aTHX_ a) +# define av_unshift(a,b) Perl_av_unshift(aTHX_ a,b) +# define block_end(a,b) Perl_block_end(aTHX_ a,b) +# define block_gimme() Perl_block_gimme(aTHX) +# define block_start(a) Perl_block_start(aTHX_ a) +# define bytes_cmp_utf8(a,b,c,d) Perl_bytes_cmp_utf8(aTHX_ a,b,c,d) +# define bytes_from_utf8_loc Perl_bytes_from_utf8_loc +# define bytes_to_utf8(a,b) Perl_bytes_to_utf8(aTHX_ a,b) +# define call_argv(a,b,c) Perl_call_argv(aTHX_ a,b,c) +# define call_atexit(a,b) Perl_call_atexit(aTHX_ a,b) +# define call_list(a,b) Perl_call_list(aTHX_ a,b) +# define call_method(a,b) Perl_call_method(aTHX_ a,b) +# define call_pv(a,b) Perl_call_pv(aTHX_ a,b) +# define call_sv(a,b) Perl_call_sv(aTHX_ a,b) +# define caller_cx(a,b) Perl_caller_cx(aTHX_ a,b) +# define cast_i32 Perl_cast_i32 +# define cast_iv Perl_cast_iv +# define cast_ulong Perl_cast_ulong +# define cast_uv Perl_cast_uv +# define ck_entersub_args_list(a) Perl_ck_entersub_args_list(aTHX_ a) +# define ck_entersub_args_proto(a,b,c) Perl_ck_entersub_args_proto(aTHX_ a,b,c) +# define ck_entersub_args_proto_or_list(a,b,c) Perl_ck_entersub_args_proto_or_list(aTHX_ a,b,c) +# define clear_defarray(a,b) Perl_clear_defarray(aTHX_ a,b) +# define cop_fetch_label(a,b,c) Perl_cop_fetch_label(aTHX_ a,b,c) +# define cop_store_label(a,b,c,d) Perl_cop_store_label(aTHX_ a,b,c,d) +# define croak_memory_wrap Perl_croak_memory_wrap +# define croak_no_modify Perl_croak_no_modify +# define croak_sv(a) Perl_croak_sv(aTHX_ a) +# define croak_xs_usage Perl_croak_xs_usage +# define csighandler1 Perl_csighandler1 +# define csighandler3 Perl_csighandler3 +# define cv_clone(a) Perl_cv_clone(aTHX_ a) +# define cv_const_sv Perl_cv_const_sv +# define cv_get_call_checker(a,b,c) Perl_cv_get_call_checker(aTHX_ a,b,c) +# define cv_get_call_checker_flags(a,b,c,d,e) Perl_cv_get_call_checker_flags(aTHX_ a,b,c,d,e) +# define cv_name(a,b,c) Perl_cv_name(aTHX_ a,b,c) +# define cv_set_call_checker(a,b,c) Perl_cv_set_call_checker(aTHX_ a,b,c) +# define cv_set_call_checker_flags(a,b,c,d) Perl_cv_set_call_checker_flags(aTHX_ a,b,c,d) +# define cv_undef(a) Perl_cv_undef(aTHX_ a) +# define cx_dump(a) Perl_cx_dump(aTHX_ a) +# define cxinc() Perl_cxinc(aTHX) +# define debop(a) Perl_debop(aTHX_ a) +# define debprofdump() Perl_debprofdump(aTHX) +# define debstack() Perl_debstack(aTHX) +# define debstackptrs() Perl_debstackptrs(aTHX) +# define delimcpy Perl_delimcpy +# define despatch_signals() Perl_despatch_signals(aTHX) +# define die_sv(a) Perl_die_sv(aTHX_ a) +# define do_close(a,b) Perl_do_close(aTHX_ a,b) +# define do_gv_dump(a,b,c,d) Perl_do_gv_dump(aTHX_ a,b,c,d) +# define do_gvgv_dump(a,b,c,d) Perl_do_gvgv_dump(aTHX_ a,b,c,d) +# define do_hv_dump(a,b,c,d) Perl_do_hv_dump(aTHX_ a,b,c,d) +# define do_join(a,b,c,d) Perl_do_join(aTHX_ a,b,c,d) +# define do_magic_dump(a,b,c,d,e,f,g) Perl_do_magic_dump(aTHX_ a,b,c,d,e,f,g) +# define do_op_dump(a,b,c) Perl_do_op_dump(aTHX_ a,b,c) +# define do_openn(a,b,c,d,e,f,g,h,i) Perl_do_openn(aTHX_ a,b,c,d,e,f,g,h,i) +# define do_pmop_dump(a,b,c) Perl_do_pmop_dump(aTHX_ a,b,c) +# define do_sprintf(a,b,c) Perl_do_sprintf(aTHX_ a,b,c) +# define do_sv_dump(a,b,c,d,e,f,g) Perl_do_sv_dump(aTHX_ a,b,c,d,e,f,g) +# define doing_taint Perl_doing_taint +# define doref(a,b,c) Perl_doref(aTHX_ a,b,c) +# define dounwind(a) Perl_dounwind(aTHX_ a) +# define dowantarray() Perl_dowantarray(aTHX) +# define dump_all() Perl_dump_all(aTHX) +# define dump_eval() Perl_dump_eval(aTHX) +# define dump_form(a) Perl_dump_form(aTHX_ a) +# define dump_packsubs(a) Perl_dump_packsubs(aTHX_ a) +# define dump_sub(a) Perl_dump_sub(aTHX_ a) +# define dump_vindent(a,b,c,d) Perl_dump_vindent(aTHX_ a,b,c,d) +# define eval_pv(a,b) Perl_eval_pv(aTHX_ a,b) +# define eval_sv(a,b) Perl_eval_sv(aTHX_ a,b) +# define fbm_compile(a,b) Perl_fbm_compile(aTHX_ a,b) +# define fbm_instr(a,b,c,d) Perl_fbm_instr(aTHX_ a,b,c,d) +# define filter_add(a,b) Perl_filter_add(aTHX_ a,b) +# define filter_del(a) Perl_filter_del(aTHX_ a) +# define filter_read(a,b,c) Perl_filter_read(aTHX_ a,b,c) +# define find_runcv(a) Perl_find_runcv(aTHX_ a) +# define find_rundefsv() Perl_find_rundefsv(aTHX) +# define foldEQ(a,b,c) Perl_foldEQ(aTHX_ a,b,c) +# define foldEQ_latin1(a,b,c) Perl_foldEQ_latin1(aTHX_ a,b,c) +# define foldEQ_locale(a,b,c) Perl_foldEQ_locale(aTHX_ a,b,c) +# define foldEQ_utf8_flags(a,b,c,d,e,f,g,h,i) Perl_foldEQ_utf8_flags(aTHX_ a,b,c,d,e,f,g,h,i) +# define forbid_outofblock_ops(a,b) Perl_forbid_outofblock_ops(aTHX_ a,b) +# define free_tmps() Perl_free_tmps(aTHX) +# define get_av(a,b) Perl_get_av(aTHX_ a,b) +# define get_cv(a,b) Perl_get_cv(aTHX_ a,b) +# define get_cvn_flags(a,b,c) Perl_get_cvn_flags(aTHX_ a,b,c) +# define get_hv(a,b) Perl_get_hv(aTHX_ a,b) +# define get_op_descs() Perl_get_op_descs(aTHX) +# define get_op_names() Perl_get_op_names(aTHX) +# define get_ppaddr() Perl_get_ppaddr(aTHX) +# define get_sv(a,b) Perl_get_sv(aTHX_ a,b) +# define get_vtbl(a) Perl_get_vtbl(aTHX_ a) +# define getcwd_sv(a) Perl_getcwd_sv(aTHX_ a) +# define gp_free(a) Perl_gp_free(aTHX_ a) +# define gp_ref(a) Perl_gp_ref(aTHX_ a) +# define grok_atoUV Perl_grok_atoUV +# define grok_bin_oct_hex(a,b,c,d,e,f,g) Perl_grok_bin_oct_hex(aTHX_ a,b,c,d,e,f,g) +# define grok_infnan(a,b) Perl_grok_infnan(aTHX_ a,b) +# define grok_number(a,b,c) Perl_grok_number(aTHX_ a,b,c) +# define grok_number_flags(a,b,c,d) Perl_grok_number_flags(aTHX_ a,b,c,d) +# define grok_numeric_radix(a,b) Perl_grok_numeric_radix(aTHX_ a,b) +# define gv_add_by_type(a,b) Perl_gv_add_by_type(aTHX_ a,b) +# define gv_autoload_pv(a,b,c) Perl_gv_autoload_pv(aTHX_ a,b,c) +# define gv_autoload_pvn(a,b,c,d) Perl_gv_autoload_pvn(aTHX_ a,b,c,d) +# define gv_autoload_sv(a,b,c) Perl_gv_autoload_sv(aTHX_ a,b,c) +# define gv_check(a) Perl_gv_check(aTHX_ a) +# define gv_const_sv(a) Perl_gv_const_sv(aTHX_ a) +# define gv_dump(a) Perl_gv_dump(aTHX_ a) +# define gv_efullname4(a,b,c,d) Perl_gv_efullname4(aTHX_ a,b,c,d) +# define gv_fetchfile(a) Perl_gv_fetchfile(aTHX_ a) +# define gv_fetchfile_flags(a,b,c) Perl_gv_fetchfile_flags(aTHX_ a,b,c) +# define gv_fetchmeth_pv(a,b,c,d) Perl_gv_fetchmeth_pv(aTHX_ a,b,c,d) +# define gv_fetchmeth_pv_autoload(a,b,c,d) Perl_gv_fetchmeth_pv_autoload(aTHX_ a,b,c,d) +# define gv_fetchmeth_pvn(a,b,c,d,e) Perl_gv_fetchmeth_pvn(aTHX_ a,b,c,d,e) +# define gv_fetchmeth_pvn_autoload(a,b,c,d,e) Perl_gv_fetchmeth_pvn_autoload(aTHX_ a,b,c,d,e) +# define gv_fetchmeth_sv(a,b,c,d) Perl_gv_fetchmeth_sv(aTHX_ a,b,c,d) +# define gv_fetchmeth_sv_autoload(a,b,c,d) Perl_gv_fetchmeth_sv_autoload(aTHX_ a,b,c,d) +# define gv_fetchmethod_autoload(a,b,c) Perl_gv_fetchmethod_autoload(aTHX_ a,b,c) +# define gv_fetchmethod_pv_flags(a,b,c) Perl_gv_fetchmethod_pv_flags(aTHX_ a,b,c) +# define gv_fetchmethod_pvn_flags(a,b,c,d) Perl_gv_fetchmethod_pvn_flags(aTHX_ a,b,c,d) +# define gv_fetchmethod_sv_flags(a,b,c) Perl_gv_fetchmethod_sv_flags(aTHX_ a,b,c) +# define gv_fetchpv(a,b,c) Perl_gv_fetchpv(aTHX_ a,b,c) +# define gv_fetchpvn_flags(a,b,c,d) Perl_gv_fetchpvn_flags(aTHX_ a,b,c,d) +# define gv_fetchsv(a,b,c) Perl_gv_fetchsv(aTHX_ a,b,c) +# define gv_fullname4(a,b,c,d) Perl_gv_fullname4(aTHX_ a,b,c,d) +# define gv_handler(a,b) Perl_gv_handler(aTHX_ a,b) +# define gv_init_pv(a,b,c,d) Perl_gv_init_pv(aTHX_ a,b,c,d) +# define gv_init_pvn(a,b,c,d,e) Perl_gv_init_pvn(aTHX_ a,b,c,d,e) +# define gv_init_sv(a,b,c,d) Perl_gv_init_sv(aTHX_ a,b,c,d) +# define gv_name_set(a,b,c,d) Perl_gv_name_set(aTHX_ a,b,c,d) +# define gv_stashpv(a,b) Perl_gv_stashpv(aTHX_ a,b) +# define gv_stashpvn(a,b,c) Perl_gv_stashpvn(aTHX_ a,b,c) +# define gv_stashsv(a,b) Perl_gv_stashsv(aTHX_ a,b) +# define hv_bucket_ratio(a) Perl_hv_bucket_ratio(aTHX_ a) +# define hv_clear(a) Perl_hv_clear(aTHX_ a) +# define hv_clear_placeholders(a) Perl_hv_clear_placeholders(aTHX_ a) +# define hv_common(a,b,c,d,e,f,g,h) Perl_hv_common(aTHX_ a,b,c,d,e,f,g,h) +# define hv_common_key_len(a,b,c,d,e,f) Perl_hv_common_key_len(aTHX_ a,b,c,d,e,f) +# define hv_copy_hints_hv(a) Perl_hv_copy_hints_hv(aTHX_ a) +# define hv_delayfree_ent(a,b) Perl_hv_delayfree_ent(aTHX_ a,b) +# define hv_dump(a) Perl_hv_dump(aTHX_ a) +# define hv_free_ent(a,b) Perl_hv_free_ent(aTHX_ a,b) +# define hv_iterinit(a) Perl_hv_iterinit(aTHX_ a) +# define hv_iterkey(a,b) Perl_hv_iterkey(aTHX_ a,b) +# define hv_iterkeysv(a) Perl_hv_iterkeysv(aTHX_ a) +# define hv_iternext_flags(a,b) Perl_hv_iternext_flags(aTHX_ a,b) +# define hv_iternextsv(a,b,c) Perl_hv_iternextsv(aTHX_ a,b,c) +# define hv_iterval(a,b) Perl_hv_iterval(aTHX_ a,b) +# define hv_ksplit(a,b) Perl_hv_ksplit(aTHX_ a,b) +# define hv_name_set(a,b,c,d) Perl_hv_name_set(aTHX_ a,b,c,d) +# define hv_rand_set(a,b) Perl_hv_rand_set(aTHX_ a,b) +# define hv_scalar(a) Perl_hv_scalar(aTHX_ a) +# define init_i18nl10n(a) Perl_init_i18nl10n(aTHX_ a) +# define init_stacks() Perl_init_stacks(aTHX) +# define init_tm(a) Perl_init_tm(aTHX_ a) +# define intro_my() Perl_intro_my(aTHX) +# define isC9_STRICT_UTF8_CHAR Perl_isC9_STRICT_UTF8_CHAR +# define isSTRICT_UTF8_CHAR Perl_isSTRICT_UTF8_CHAR +# define isUTF8_CHAR Perl_isUTF8_CHAR +# define isUTF8_CHAR_flags Perl_isUTF8_CHAR_flags +# define is_c9strict_utf8_string_loclen Perl_is_c9strict_utf8_string_loclen +# define is_lvalue_sub() Perl_is_lvalue_sub(aTHX) +# define is_safe_syscall(a,b,c,d) Perl_is_safe_syscall(aTHX_ a,b,c,d) +# define is_strict_utf8_string_loclen Perl_is_strict_utf8_string_loclen +# define is_utf8_FF_helper_ Perl_is_utf8_FF_helper_ +# define is_utf8_char_helper_ Perl_is_utf8_char_helper_ +# define is_utf8_fixed_width_buf_loclen_flags Perl_is_utf8_fixed_width_buf_loclen_flags +# define is_utf8_invariant_string_loc Perl_is_utf8_invariant_string_loc +# define is_utf8_string_flags Perl_is_utf8_string_flags +# define is_utf8_string_loclen Perl_is_utf8_string_loclen +# define is_utf8_string_loclen_flags Perl_is_utf8_string_loclen_flags +# define is_utf8_valid_partial_char_flags Perl_is_utf8_valid_partial_char_flags +# define isinfnan Perl_isinfnan +# define leave_adjust_stacks(a,b,c,d) Perl_leave_adjust_stacks(aTHX_ a,b,c,d) +# define leave_scope(a) Perl_leave_scope(aTHX_ a) +# define lex_bufutf8() Perl_lex_bufutf8(aTHX) +# define lex_discard_to(a) Perl_lex_discard_to(aTHX_ a) +# define lex_grow_linestr(a) Perl_lex_grow_linestr(aTHX_ a) +# define lex_next_chunk(a) Perl_lex_next_chunk(aTHX_ a) +# define lex_peek_unichar(a) Perl_lex_peek_unichar(aTHX_ a) +# define lex_read_space(a) Perl_lex_read_space(aTHX_ a) +# define lex_read_to(a) Perl_lex_read_to(aTHX_ a) +# define lex_read_unichar(a) Perl_lex_read_unichar(aTHX_ a) +# define lex_start(a,b,c) Perl_lex_start(aTHX_ a,b,c) +# define lex_stuff_pv(a,b) Perl_lex_stuff_pv(aTHX_ a,b) +# define lex_stuff_pvn(a,b,c) Perl_lex_stuff_pvn(aTHX_ a,b,c) +# define lex_stuff_sv(a,b) Perl_lex_stuff_sv(aTHX_ a,b) +# define lex_unstuff(a) Perl_lex_unstuff(aTHX_ a) +# define looks_like_number(a) Perl_looks_like_number(aTHX_ a) +# define lsbit_pos32 Perl_lsbit_pos32 +# define magic_dump(a) Perl_magic_dump(aTHX_ a) +# define markstack_grow() Perl_markstack_grow(aTHX) +# define mess_sv(a,b) Perl_mess_sv(aTHX_ a,b) +# define mg_clear(a) Perl_mg_clear(aTHX_ a) +# define mg_copy(a,b,c,d) Perl_mg_copy(aTHX_ a,b,c,d) +# define mg_find Perl_mg_find +# define mg_findext Perl_mg_findext +# define mg_free(a) Perl_mg_free(aTHX_ a) +# define mg_free_type(a,b) Perl_mg_free_type(aTHX_ a,b) +# define mg_freeext(a,b,c) Perl_mg_freeext(aTHX_ a,b,c) +# define mg_get(a) Perl_mg_get(aTHX_ a) +# define mg_magical Perl_mg_magical +# define mg_set(a) Perl_mg_set(aTHX_ a) +# define mg_size(a) Perl_mg_size(aTHX_ a) +# define mini_mktime Perl_mini_mktime +# define moreswitches(a) Perl_moreswitches(aTHX_ a) +# define mortal_destructor_sv(a,b) Perl_mortal_destructor_sv(aTHX_ a,b) +# define mortal_getenv Perl_mortal_getenv +# define mortal_svfunc_x(a,b) Perl_mortal_svfunc_x(aTHX_ a,b) +# define mro_get_linear_isa(a) Perl_mro_get_linear_isa(aTHX_ a) +# define mro_method_changed_in(a) Perl_mro_method_changed_in(aTHX_ a) +# define msbit_pos32 Perl_msbit_pos32 +# define my_atof(a) Perl_my_atof(aTHX_ a) +# define my_atof3(a,b,c) Perl_my_atof3(aTHX_ a,b,c) +# define my_dirfd Perl_my_dirfd +# define my_exit(a) Perl_my_exit(aTHX_ a) +# define my_failure_exit() Perl_my_failure_exit(aTHX) +# define my_fflush_all() Perl_my_fflush_all(aTHX) +# define my_fork Perl_my_fork +# define my_popen_list(a,b,c) Perl_my_popen_list(aTHX_ a,b,c) +# define my_setenv(a,b) Perl_my_setenv(aTHX_ a,b) +# define my_socketpair Perl_my_socketpair +# define my_strftime(a,b,c,d,e,f,g,h,i,j) Perl_my_strftime(aTHX_ a,b,c,d,e,f,g,h,i,j) +# define my_strtod Perl_my_strtod +# define newANONATTRSUB(a,b,c,d) Perl_newANONATTRSUB(aTHX_ a,b,c,d) +# define newANONHASH(a) Perl_newANONHASH(aTHX_ a) +# define newANONLIST(a) Perl_newANONLIST(aTHX_ a) +# define newANONSUB(a,b,c) Perl_newANONSUB(aTHX_ a,b,c) +# define newARGDEFELEMOP(a,b,c) Perl_newARGDEFELEMOP(aTHX_ a,b,c) +# define newASSIGNOP(a,b,c,d) Perl_newASSIGNOP(aTHX_ a,b,c,d) +# define newAVREF(a) Perl_newAVREF(aTHX_ a) +# define newAVav(a) Perl_newAVav(aTHX_ a) +# define newAVhv(a) Perl_newAVhv(aTHX_ a) +# define newBINOP(a,b,c,d) Perl_newBINOP(aTHX_ a,b,c,d) +# define newCONDOP(a,b,c,d) Perl_newCONDOP(aTHX_ a,b,c,d) +# define newCONSTSUB(a,b,c) Perl_newCONSTSUB(aTHX_ a,b,c) +# define newCONSTSUB_flags(a,b,c,d,e) Perl_newCONSTSUB_flags(aTHX_ a,b,c,d,e) +# define newCVREF(a,b) Perl_newCVREF(aTHX_ a,b) +# define newDEFEROP(a,b) Perl_newDEFEROP(aTHX_ a,b) +# define newDEFSVOP() Perl_newDEFSVOP(aTHX) +# define newFORM(a,b,c) Perl_newFORM(aTHX_ a,b,c) +# define newFOROP(a,b,c,d,e) Perl_newFOROP(aTHX_ a,b,c,d,e) +# define newGIVENOP(a,b,c) Perl_newGIVENOP(aTHX_ a,b,c) +# define newGVOP(a,b,c) Perl_newGVOP(aTHX_ a,b,c) +# define newGVREF(a,b) Perl_newGVREF(aTHX_ a,b) +# define newGVgen_flags(a,b) Perl_newGVgen_flags(aTHX_ a,b) +# define newHVREF(a) Perl_newHVREF(aTHX_ a) +# define newHVhv(a) Perl_newHVhv(aTHX_ a) +# define newLISTOP(a,b,c,d) Perl_newLISTOP(aTHX_ a,b,c,d) +# define newLOGOP(a,b,c,d) Perl_newLOGOP(aTHX_ a,b,c,d) +# define newLOOPEX(a,b) Perl_newLOOPEX(aTHX_ a,b) +# define newLOOPOP(a,b,c,d) Perl_newLOOPOP(aTHX_ a,b,c,d) +# define newMETHOP(a,b,c) Perl_newMETHOP(aTHX_ a,b,c) +# define newMETHOP_named(a,b,c) Perl_newMETHOP_named(aTHX_ a,b,c) +# define newMYSUB(a,b,c,d,e) Perl_newMYSUB(aTHX_ a,b,c,d,e) +# define newNULLLIST() Perl_newNULLLIST(aTHX) +# define newOP(a,b) Perl_newOP(aTHX_ a,b) +# define newPADNAMELIST Perl_newPADNAMELIST +# define newPADNAMEouter Perl_newPADNAMEouter +# define newPADNAMEpvn Perl_newPADNAMEpvn +# define newPADxVOP(a,b,c) Perl_newPADxVOP(aTHX_ a,b,c) +# define newPMOP(a,b) Perl_newPMOP(aTHX_ a,b) +# define newPROG(a) Perl_newPROG(aTHX_ a) +# define newPVOP(a,b,c) Perl_newPVOP(aTHX_ a,b,c) +# define newRANGE(a,b,c) Perl_newRANGE(aTHX_ a,b,c) +# define newRV(a) Perl_newRV(aTHX_ a) +# define newRV_noinc(a) Perl_newRV_noinc(aTHX_ a) +# define newSLICEOP(a,b,c) Perl_newSLICEOP(aTHX_ a,b,c) +# define newSTATEOP(a,b,c) Perl_newSTATEOP(aTHX_ a,b,c) +# define newSV(a) Perl_newSV(aTHX_ a) +# define newSVOP(a,b,c) Perl_newSVOP(aTHX_ a,b,c) +# define newSVREF(a) Perl_newSVREF(aTHX_ a) +# define newSV_false() Perl_newSV_false(aTHX) +# define newSV_true() Perl_newSV_true(aTHX) +# define newSV_type(a) Perl_newSV_type(aTHX_ a) +# define newSV_type_mortal(a) Perl_newSV_type_mortal(aTHX_ a) +# define newSVbool(a) Perl_newSVbool(aTHX_ a) +# define newSVhek(a) Perl_newSVhek(aTHX_ a) +# define newSVhek_mortal(a) Perl_newSVhek_mortal(aTHX_ a) +# define newSViv(a) Perl_newSViv(aTHX_ a) +# define newSVnv(a) Perl_newSVnv(aTHX_ a) +# define newSVpv(a,b) Perl_newSVpv(aTHX_ a,b) +# define newSVpv_share(a,b) Perl_newSVpv_share(aTHX_ a,b) +# define newSVpvn(a,b) Perl_newSVpvn(aTHX_ a,b) +# define newSVpvn_flags(a,b,c) Perl_newSVpvn_flags(aTHX_ a,b,c) +# define newSVpvn_share(a,b,c) Perl_newSVpvn_share(aTHX_ a,b,c) +# define newSVrv(a,b) Perl_newSVrv(aTHX_ a,b) +# define newSVsv_flags(a,b) Perl_newSVsv_flags(aTHX_ a,b) +# define newSVuv(a) Perl_newSVuv(aTHX_ a) +# define newTRYCATCHOP(a,b,c,d) Perl_newTRYCATCHOP(aTHX_ a,b,c,d) +# define newUNOP(a,b,c) Perl_newUNOP(aTHX_ a,b,c) +# define newUNOP_AUX(a,b,c,d) Perl_newUNOP_AUX(aTHX_ a,b,c,d) +# define newWHENOP(a,b) Perl_newWHENOP(aTHX_ a,b) +# define newWHILEOP(a,b,c,d,e,f,g) Perl_newWHILEOP(aTHX_ a,b,c,d,e,f,g) +# define newXS(a,b,c) Perl_newXS(aTHX_ a,b,c) +# define newXS_flags(a,b,c,d,e) Perl_newXS_flags(aTHX_ a,b,c,d,e) +# define new_stackinfo(a,b) Perl_new_stackinfo(aTHX_ a,b) +# define new_version(a) Perl_new_version(aTHX_ a) +# define nothreadhook() Perl_nothreadhook(aTHX) +# define op_append_elem(a,b,c) Perl_op_append_elem(aTHX_ a,b,c) +# define op_append_list(a,b,c) Perl_op_append_list(aTHX_ a,b,c) +# define op_class(a) Perl_op_class(aTHX_ a) +# define op_contextualize(a,b) Perl_op_contextualize(aTHX_ a,b) +# define op_convert_list(a,b,c) Perl_op_convert_list(aTHX_ a,b,c) +# define op_dump(a) Perl_op_dump(aTHX_ a) +# define op_force_list(a) Perl_op_force_list(aTHX_ a) +# define op_free(a) Perl_op_free(aTHX_ a) +# define op_linklist(a) Perl_op_linklist(aTHX_ a) +# define op_null(a) Perl_op_null(aTHX_ a) +# define op_parent Perl_op_parent +# define op_prepend_elem(a,b,c) Perl_op_prepend_elem(aTHX_ a,b,c) +# define op_refcnt_lock() Perl_op_refcnt_lock(aTHX) +# define op_refcnt_unlock() Perl_op_refcnt_unlock(aTHX) +# define op_scope(a) Perl_op_scope(aTHX_ a) +# define op_sibling_splice Perl_op_sibling_splice +# define op_wrap_finally(a,b) Perl_op_wrap_finally(aTHX_ a,b) +# define packlist(a,b,c,d,e) Perl_packlist(aTHX_ a,b,c,d,e) +# define pad_add_anon(a,b) Perl_pad_add_anon(aTHX_ a,b) +# define pad_add_name_pv(a,b,c,d) Perl_pad_add_name_pv(aTHX_ a,b,c,d) +# define pad_add_name_pvn(a,b,c,d,e) Perl_pad_add_name_pvn(aTHX_ a,b,c,d,e) +# define pad_add_name_sv(a,b,c,d) Perl_pad_add_name_sv(aTHX_ a,b,c,d) +# define pad_alloc(a,b) Perl_pad_alloc(aTHX_ a,b) +# define pad_findmy_pv(a,b) Perl_pad_findmy_pv(aTHX_ a,b) +# define pad_findmy_pvn(a,b,c) Perl_pad_findmy_pvn(aTHX_ a,b,c) +# define pad_findmy_sv(a,b) Perl_pad_findmy_sv(aTHX_ a,b) +# define pad_new(a) Perl_pad_new(aTHX_ a) +# define pad_tidy(a) Perl_pad_tidy(aTHX_ a) +# define padnamelist_fetch Perl_padnamelist_fetch +# define padnamelist_store(a,b,c) Perl_padnamelist_store(aTHX_ a,b,c) +# define parse_arithexpr(a) Perl_parse_arithexpr(aTHX_ a) +# define parse_barestmt(a) Perl_parse_barestmt(aTHX_ a) +# define parse_block(a) Perl_parse_block(aTHX_ a) +# define parse_fullexpr(a) Perl_parse_fullexpr(aTHX_ a) +# define parse_fullstmt(a) Perl_parse_fullstmt(aTHX_ a) +# define parse_label(a) Perl_parse_label(aTHX_ a) +# define parse_listexpr(a) Perl_parse_listexpr(aTHX_ a) +# define parse_stmtseq(a) Perl_parse_stmtseq(aTHX_ a) +# define parse_subsignature(a) Perl_parse_subsignature(aTHX_ a) +# define parse_termexpr(a) Perl_parse_termexpr(aTHX_ a) +# define perly_sighandler Perl_perly_sighandler +# define pmop_dump(a) Perl_pmop_dump(aTHX_ a) +# define pop_scope() Perl_pop_scope(aTHX) +# define pregcomp(a,b) Perl_pregcomp(aTHX_ a,b) +# define pregexec(a,b,c,d,e,f,g) Perl_pregexec(aTHX_ a,b,c,d,e,f,g) +# define pregfree(a) Perl_pregfree(aTHX_ a) +# define pregfree2(a) Perl_pregfree2(aTHX_ a) +# define prescan_version(a,b,c,d,e,f,g) Perl_prescan_version(aTHX_ a,b,c,d,e,f,g) +# define ptr_table_fetch(a,b) Perl_ptr_table_fetch(aTHX_ a,b) +# define ptr_table_free(a) Perl_ptr_table_free(aTHX_ a) +# define ptr_table_new() Perl_ptr_table_new(aTHX) +# define ptr_table_split(a) Perl_ptr_table_split(aTHX_ a) +# define ptr_table_store(a,b,c) Perl_ptr_table_store(aTHX_ a,b,c) +# define push_scope() Perl_push_scope(aTHX) +# define pv_display(a,b,c,d,e) Perl_pv_display(aTHX_ a,b,c,d,e) +# define pv_escape(a,b,c,d,e,f) Perl_pv_escape(aTHX_ a,b,c,d,e,f) +# define pv_pretty(a,b,c,d,e,f,g) Perl_pv_pretty(aTHX_ a,b,c,d,e,f,g) +# define pv_uni_display(a,b,c,d,e) Perl_pv_uni_display(aTHX_ a,b,c,d,e) +# define rcpv_copy(a) Perl_rcpv_copy(aTHX_ a) +# define rcpv_free(a) Perl_rcpv_free(aTHX_ a) +# define rcpv_new(a,b,c) Perl_rcpv_new(aTHX_ a,b,c) +# define re_compile(a,b) Perl_re_compile(aTHX_ a,b) +# define re_intuit_start(a,b,c,d,e,f,g) Perl_re_intuit_start(aTHX_ a,b,c,d,e,f,g) +# define re_intuit_string(a) Perl_re_intuit_string(aTHX_ a) +# define reentrant_free() Perl_reentrant_free(aTHX) +# define reentrant_init() Perl_reentrant_init(aTHX) +# define reentrant_retry Perl_reentrant_retry +# define reentrant_size() Perl_reentrant_size(aTHX) +# define reg_named_buff_all(a,b) Perl_reg_named_buff_all(aTHX_ a,b) +# define reg_named_buff_exists(a,b,c) Perl_reg_named_buff_exists(aTHX_ a,b,c) +# define reg_named_buff_fetch(a,b,c) Perl_reg_named_buff_fetch(aTHX_ a,b,c) +# define reg_named_buff_firstkey(a,b) Perl_reg_named_buff_firstkey(aTHX_ a,b) +# define reg_named_buff_nextkey(a,b) Perl_reg_named_buff_nextkey(aTHX_ a,b) +# define reg_named_buff_scalar(a,b) Perl_reg_named_buff_scalar(aTHX_ a,b) +# define regdump(a) Perl_regdump(aTHX_ a) +# define regexec_flags(a,b,c,d,e,f,g,h) Perl_regexec_flags(aTHX_ a,b,c,d,e,f,g,h) +# define regfree_internal(a) Perl_regfree_internal(aTHX_ a) +# define reginitcolors() Perl_reginitcolors(aTHX) +# define repeatcpy Perl_repeatcpy +# define require_pv(a) Perl_require_pv(aTHX_ a) +# define rninstr Perl_rninstr +# define rsignal(a,b) Perl_rsignal(aTHX_ a,b) +# define rsignal_state(a) Perl_rsignal_state(aTHX_ a) +# define runops_debug() Perl_runops_debug(aTHX) +# define runops_standard() Perl_runops_standard(aTHX) +# define rv2cv_op_cv(a,b) Perl_rv2cv_op_cv(aTHX_ a,b) +# define safesyscalloc Perl_safesyscalloc +# define safesysfree Perl_safesysfree +# define safesysmalloc Perl_safesysmalloc +# define safesysrealloc Perl_safesysrealloc +# define save_I16(a) Perl_save_I16(aTHX_ a) +# define save_I32(a) Perl_save_I32(aTHX_ a) +# define save_I8(a) Perl_save_I8(aTHX_ a) +# define save_adelete(a,b) Perl_save_adelete(aTHX_ a,b) +# define save_aelem_flags(a,b,c,d) Perl_save_aelem_flags(aTHX_ a,b,c,d) +# define save_alloc(a,b) Perl_save_alloc(aTHX_ a,b) +# define save_aptr(a) Perl_save_aptr(aTHX_ a) +# define save_ary(a) Perl_save_ary(aTHX_ a) +# define save_bool(a) Perl_save_bool(aTHX_ a) +# define save_clearsv(a) Perl_save_clearsv(aTHX_ a) +# define save_delete(a,b,c) Perl_save_delete(aTHX_ a,b,c) +# define save_destructor(a,b) Perl_save_destructor(aTHX_ a,b) +# define save_destructor_x(a,b) Perl_save_destructor_x(aTHX_ a,b) +# define save_freercpv(a) Perl_save_freercpv(aTHX_ a) +# define save_generic_pvref(a) Perl_save_generic_pvref(aTHX_ a) +# define save_generic_svref(a) Perl_save_generic_svref(aTHX_ a) +# define save_gp(a,b) Perl_save_gp(aTHX_ a,b) +# define save_hash(a) Perl_save_hash(aTHX_ a) +# define save_hdelete(a,b) Perl_save_hdelete(aTHX_ a,b) +# define save_helem_flags(a,b,c,d) Perl_save_helem_flags(aTHX_ a,b,c,d) +# define save_hints() Perl_save_hints(aTHX) +# define save_hptr(a) Perl_save_hptr(aTHX_ a) +# define save_int(a) Perl_save_int(aTHX_ a) +# define save_item(a) Perl_save_item(aTHX_ a) +# define save_iv(a) Perl_save_iv(aTHX_ a) +# define save_padsv_and_mortalize(a) Perl_save_padsv_and_mortalize(aTHX_ a) +# define save_pptr(a) Perl_save_pptr(aTHX_ a) +# define save_pushi32ptr(a,b,c) Perl_save_pushi32ptr(aTHX_ a,b,c) +# define save_pushptr(a,b) Perl_save_pushptr(aTHX_ a,b) +# define save_pushptrptr(a,b,c) Perl_save_pushptrptr(aTHX_ a,b,c) +# define save_rcpv(a) Perl_save_rcpv(aTHX_ a) +# define save_re_context() Perl_save_re_context(aTHX) +# define save_scalar(a) Perl_save_scalar(aTHX_ a) +# define save_set_svflags(a,b,c) Perl_save_set_svflags(aTHX_ a,b,c) +# define save_shared_pvref(a) Perl_save_shared_pvref(aTHX_ a) +# define save_sptr(a) Perl_save_sptr(aTHX_ a) +# define save_svref(a) Perl_save_svref(aTHX_ a) +# define save_vptr(a) Perl_save_vptr(aTHX_ a) +# define savepv(a) Perl_savepv(aTHX_ a) +# define savepvn(a,b) Perl_savepvn(aTHX_ a,b) +# define savesharedpv(a) Perl_savesharedpv(aTHX_ a) +# define savesharedpvn(a,b) Perl_savesharedpvn(aTHX_ a,b) +# define savesharedsvpv(a) Perl_savesharedsvpv(aTHX_ a) +# define savestack_grow() Perl_savestack_grow(aTHX) +# define savestack_grow_cnt(a) Perl_savestack_grow_cnt(aTHX_ a) +# define savesvpv(a) Perl_savesvpv(aTHX_ a) +# define scan_bin(a,b,c) Perl_scan_bin(aTHX_ a,b,c) +# define scan_hex(a,b,c) Perl_scan_hex(aTHX_ a,b,c) +# define scan_num(a,b) Perl_scan_num(aTHX_ a,b) +# define scan_oct(a,b,c) Perl_scan_oct(aTHX_ a,b,c) +# define scan_version(a,b,c) Perl_scan_version(aTHX_ a,b,c) +# define scan_vstring(a,b,c) Perl_scan_vstring(aTHX_ a,b,c) +# define seed() Perl_seed(aTHX) +# define set_context Perl_set_context +# define setdefout(a) Perl_setdefout(aTHX_ a) +# define share_hek(a,b,c) Perl_share_hek(aTHX_ a,b,c) +# define single_1bit_pos32 Perl_single_1bit_pos32 +# define sortsv(a,b,c) Perl_sortsv(aTHX_ a,b,c) +# define sortsv_flags(a,b,c,d) Perl_sortsv_flags(aTHX_ a,b,c,d) +# define stack_grow(a,b,c) Perl_stack_grow(aTHX_ a,b,c) +# define start_subparse(a,b) Perl_start_subparse(aTHX_ a,b) +# define str_to_version(a) Perl_str_to_version(aTHX_ a) +# define suspend_compcv(a) Perl_suspend_compcv(aTHX_ a) +# define sv_2bool_flags(a,b) Perl_sv_2bool_flags(aTHX_ a,b) +# define sv_2cv(a,b,c,d) Perl_sv_2cv(aTHX_ a,b,c,d) +# define sv_2io(a) Perl_sv_2io(aTHX_ a) +# define sv_2iv_flags(a,b) Perl_sv_2iv_flags(aTHX_ a,b) +# define sv_2mortal(a) Perl_sv_2mortal(aTHX_ a) +# define sv_2nv_flags(a,b) Perl_sv_2nv_flags(aTHX_ a,b) +# define sv_2pv_flags(a,b,c) Perl_sv_2pv_flags(aTHX_ a,b,c) +# define sv_2pvbyte_flags(a,b,c) Perl_sv_2pvbyte_flags(aTHX_ a,b,c) +# define sv_2pvutf8_flags(a,b,c) Perl_sv_2pvutf8_flags(aTHX_ a,b,c) +# define sv_2uv_flags(a,b) Perl_sv_2uv_flags(aTHX_ a,b) +# define sv_backoff Perl_sv_backoff +# define sv_bless(a,b) Perl_sv_bless(aTHX_ a,b) +# define sv_cat_decode(a,b,c,d,e,f) Perl_sv_cat_decode(aTHX_ a,b,c,d,e,f) +# define sv_catpv(a,b) Perl_sv_catpv(aTHX_ a,b) +# define sv_catpv_flags(a,b,c) Perl_sv_catpv_flags(aTHX_ a,b,c) +# define sv_catpv_mg(a,b) Perl_sv_catpv_mg(aTHX_ a,b) +# define sv_catpvn_flags(a,b,c,d) Perl_sv_catpvn_flags(aTHX_ a,b,c,d) +# define sv_catsv_flags(a,b,c) Perl_sv_catsv_flags(aTHX_ a,b,c) +# define sv_chop(a,b) Perl_sv_chop(aTHX_ a,b) +# define sv_clear(a) Perl_sv_clear(aTHX_ a) +# define sv_cmp_flags(a,b,c) Perl_sv_cmp_flags(aTHX_ a,b,c) +# define sv_cmp_locale_flags(a,b,c) Perl_sv_cmp_locale_flags(aTHX_ a,b,c) +# define sv_copypv_flags(a,b,c) Perl_sv_copypv_flags(aTHX_ a,b,c) +# define sv_dec(a) Perl_sv_dec(aTHX_ a) +# define sv_dec_nomg(a) Perl_sv_dec_nomg(aTHX_ a) +# define sv_derived_from(a,b) Perl_sv_derived_from(aTHX_ a,b) +# define sv_derived_from_hv(a,b) Perl_sv_derived_from_hv(aTHX_ a,b) +# define sv_derived_from_pv(a,b,c) Perl_sv_derived_from_pv(aTHX_ a,b,c) +# define sv_derived_from_pvn(a,b,c,d) Perl_sv_derived_from_pvn(aTHX_ a,b,c,d) +# define sv_derived_from_sv(a,b,c) Perl_sv_derived_from_sv(aTHX_ a,b,c) +# define sv_destroyable(a) Perl_sv_destroyable(aTHX_ a) +# define sv_does(a,b) Perl_sv_does(aTHX_ a,b) +# define sv_does_pv(a,b,c) Perl_sv_does_pv(aTHX_ a,b,c) +# define sv_does_pvn(a,b,c,d) Perl_sv_does_pvn(aTHX_ a,b,c,d) +# define sv_does_sv(a,b,c) Perl_sv_does_sv(aTHX_ a,b,c) +# define sv_dump(a) Perl_sv_dump(aTHX_ a) +# define sv_dump_depth(a,b) Perl_sv_dump_depth(aTHX_ a,b) +# define sv_eq_flags(a,b,c) Perl_sv_eq_flags(aTHX_ a,b,c) +# define sv_force_normal_flags(a,b) Perl_sv_force_normal_flags(aTHX_ a,b) +# define sv_free(a) Perl_sv_free(aTHX_ a) +# define sv_get_backrefs Perl_sv_get_backrefs +# define sv_gets(a,b,c) Perl_sv_gets(aTHX_ a,b,c) +# define sv_grow(a,b) Perl_sv_grow(aTHX_ a,b) +# define sv_grow_fresh(a,b) Perl_sv_grow_fresh(aTHX_ a,b) +# define sv_inc(a) Perl_sv_inc(aTHX_ a) +# define sv_inc_nomg(a) Perl_sv_inc_nomg(aTHX_ a) +# define sv_insert_flags(a,b,c,d,e,f) Perl_sv_insert_flags(aTHX_ a,b,c,d,e,f) +# define sv_isa(a,b) Perl_sv_isa(aTHX_ a,b) +# define sv_isa_sv(a,b) Perl_sv_isa_sv(aTHX_ a,b) +# define sv_isobject(a) Perl_sv_isobject(aTHX_ a) +# define sv_len(a) Perl_sv_len(aTHX_ a) +# define sv_len_utf8(a) Perl_sv_len_utf8(aTHX_ a) +# define sv_len_utf8_nomg(a) Perl_sv_len_utf8_nomg(aTHX_ a) +# define sv_magic(a,b,c,d,e) Perl_sv_magic(aTHX_ a,b,c,d,e) +# define sv_magicext(a,b,c,d,e,f) Perl_sv_magicext(aTHX_ a,b,c,d,e,f) +# define sv_mortalcopy_flags(a,b) Perl_sv_mortalcopy_flags(aTHX_ a,b) +# define sv_newmortal() Perl_sv_newmortal(aTHX) +# define sv_newref(a) Perl_sv_newref(aTHX_ a) +# define sv_nosharing(a) Perl_sv_nosharing(aTHX_ a) +# define sv_numeq_flags(a,b,c) Perl_sv_numeq_flags(aTHX_ a,b,c) +# define sv_peek(a) Perl_sv_peek(aTHX_ a) +# define sv_pos_b2u(a,b) Perl_sv_pos_b2u(aTHX_ a,b) +# define sv_pos_b2u_flags(a,b,c) Perl_sv_pos_b2u_flags(aTHX_ a,b,c) +# define sv_pos_u2b(a,b,c) Perl_sv_pos_u2b(aTHX_ a,b,c) +# define sv_pos_u2b_flags(a,b,c,d) Perl_sv_pos_u2b_flags(aTHX_ a,b,c,d) +# define sv_pvbyten_force(a,b) Perl_sv_pvbyten_force(aTHX_ a,b) +# define sv_pvn_force_flags(a,b,c) Perl_sv_pvn_force_flags(aTHX_ a,b,c) +# define sv_pvutf8n_force(a,b) Perl_sv_pvutf8n_force(aTHX_ a,b) +# define sv_recode_to_utf8(a,b) Perl_sv_recode_to_utf8(aTHX_ a,b) +# define sv_ref(a,b,c) Perl_sv_ref(aTHX_ a,b,c) +# define sv_reftype(a,b) Perl_sv_reftype(aTHX_ a,b) +# define sv_replace(a,b) Perl_sv_replace(aTHX_ a,b) +# define sv_report_used() Perl_sv_report_used(aTHX) +# define sv_reset(a,b) Perl_sv_reset(aTHX_ a,b) +# define sv_rvunweaken(a) Perl_sv_rvunweaken(aTHX_ a) +# define sv_rvweaken(a) Perl_sv_rvweaken(aTHX_ a) +# define sv_set_bool(a,b) Perl_sv_set_bool(aTHX_ a,b) +# define sv_set_false(a) Perl_sv_set_false(aTHX_ a) +# define sv_set_true(a) Perl_sv_set_true(aTHX_ a) +# define sv_set_undef(a) Perl_sv_set_undef(aTHX_ a) +# define sv_setiv(a,b) Perl_sv_setiv(aTHX_ a,b) +# define sv_setiv_mg(a,b) Perl_sv_setiv_mg(aTHX_ a,b) +# define sv_setnv(a,b) Perl_sv_setnv(aTHX_ a,b) +# define sv_setnv_mg(a,b) Perl_sv_setnv_mg(aTHX_ a,b) +# define sv_setpv(a,b) Perl_sv_setpv(aTHX_ a,b) +# define sv_setpv_bufsize(a,b,c) Perl_sv_setpv_bufsize(aTHX_ a,b,c) +# define sv_setpv_freshbuf(a) Perl_sv_setpv_freshbuf(aTHX_ a) +# define sv_setpv_mg(a,b) Perl_sv_setpv_mg(aTHX_ a,b) +# define sv_setpvn(a,b,c) Perl_sv_setpvn(aTHX_ a,b,c) +# define sv_setpvn_fresh(a,b,c) Perl_sv_setpvn_fresh(aTHX_ a,b,c) +# define sv_setpvn_mg(a,b,c) Perl_sv_setpvn_mg(aTHX_ a,b,c) +# define sv_setref_iv(a,b,c) Perl_sv_setref_iv(aTHX_ a,b,c) +# define sv_setref_nv(a,b,c) Perl_sv_setref_nv(aTHX_ a,b,c) +# define sv_setref_pv(a,b,c) Perl_sv_setref_pv(aTHX_ a,b,c) +# define sv_setref_pvn(a,b,c,d) Perl_sv_setref_pvn(aTHX_ a,b,c,d) +# define sv_setref_uv(a,b,c) Perl_sv_setref_uv(aTHX_ a,b,c) +# define sv_setrv_inc(a,b) Perl_sv_setrv_inc(aTHX_ a,b) +# define sv_setrv_inc_mg(a,b) Perl_sv_setrv_inc_mg(aTHX_ a,b) +# define sv_setrv_noinc(a,b) Perl_sv_setrv_noinc(aTHX_ a,b) +# define sv_setrv_noinc_mg(a,b) Perl_sv_setrv_noinc_mg(aTHX_ a,b) +# define sv_setsv_flags(a,b,c) Perl_sv_setsv_flags(aTHX_ a,b,c) +# define sv_setsv_mg(a,b) Perl_sv_setsv_mg(aTHX_ a,b) +# define sv_setuv(a,b) Perl_sv_setuv(aTHX_ a,b) +# define sv_setuv_mg(a,b) Perl_sv_setuv_mg(aTHX_ a,b) +# define sv_streq_flags(a,b,c) Perl_sv_streq_flags(aTHX_ a,b,c) +# define sv_string_from_errnum(a,b) Perl_sv_string_from_errnum(aTHX_ a,b) +# define sv_tainted(a) Perl_sv_tainted(aTHX_ a) +# define sv_true(a) Perl_sv_true(aTHX_ a) +# define sv_uni_display(a,b,c,d) Perl_sv_uni_display(aTHX_ a,b,c,d) +# define sv_unmagic(a,b) Perl_sv_unmagic(aTHX_ a,b) +# define sv_unmagicext(a,b,c) Perl_sv_unmagicext(aTHX_ a,b,c) +# define sv_unref_flags(a,b) Perl_sv_unref_flags(aTHX_ a,b) +# define sv_untaint(a) Perl_sv_untaint(aTHX_ a) +# define sv_upgrade(a,b) Perl_sv_upgrade(aTHX_ a,b) +# define sv_usepvn_flags(a,b,c,d) Perl_sv_usepvn_flags(aTHX_ a,b,c,d) +# define sv_utf8_decode(a) Perl_sv_utf8_decode(aTHX_ a) +# define sv_utf8_downgrade_flags(a,b,c) Perl_sv_utf8_downgrade_flags(aTHX_ a,b,c) +# define sv_utf8_encode(a) Perl_sv_utf8_encode(aTHX_ a) +# define sv_utf8_upgrade_flags_grow(a,b,c) Perl_sv_utf8_upgrade_flags_grow(aTHX_ a,b,c) +# define sv_vcatpvf(a,b,c) Perl_sv_vcatpvf(aTHX_ a,b,c) +# define sv_vcatpvf_mg(a,b,c) Perl_sv_vcatpvf_mg(aTHX_ a,b,c) +# define sv_vcatpvfn(a,b,c,d,e,f,g) Perl_sv_vcatpvfn(aTHX_ a,b,c,d,e,f,g) +# define sv_vcatpvfn_flags(a,b,c,d,e,f,g,h) Perl_sv_vcatpvfn_flags(aTHX_ a,b,c,d,e,f,g,h) +# define sv_vsetpvf(a,b,c) Perl_sv_vsetpvf(aTHX_ a,b,c) +# define sv_vsetpvf_mg(a,b,c) Perl_sv_vsetpvf_mg(aTHX_ a,b,c) +# define sv_vsetpvfn(a,b,c,d,e,f,g) Perl_sv_vsetpvfn(aTHX_ a,b,c,d,e,f,g) +# define switch_to_global_locale() Perl_switch_to_global_locale(aTHX) +# define sync_locale() Perl_sync_locale(aTHX) +# define taint_env() Perl_taint_env(aTHX) +# define taint_proper(a,b) Perl_taint_proper(aTHX_ a,b) +# define thread_locale_init() Perl_thread_locale_init(aTHX) +# define thread_locale_term() Perl_thread_locale_term(aTHX) +# define to_uni_lower(a,b,c) Perl_to_uni_lower(aTHX_ a,b,c) +# define to_uni_title(a,b,c) Perl_to_uni_title(aTHX_ a,b,c) +# define to_uni_upper(a,b,c) Perl_to_uni_upper(aTHX_ a,b,c) +# define unpackstring(a,b,c,d,e) Perl_unpackstring(aTHX_ a,b,c,d,e) +# define unshare_hek(a) Perl_unshare_hek(aTHX_ a) +# define unsharepvn(a,b,c) Perl_unsharepvn(aTHX_ a,b,c) +# define upg_version(a,b) Perl_upg_version(aTHX_ a,b) +# define utf8_distance(a,b) Perl_utf8_distance(aTHX_ a,b) +# define utf8_hop Perl_utf8_hop +# define utf8_hop_back Perl_utf8_hop_back +# define utf8_hop_forward Perl_utf8_hop_forward +# define utf8_hop_safe Perl_utf8_hop_safe +# define utf8_length(a,b) Perl_utf8_length(aTHX_ a,b) +# define utf8_to_bytes(a,b) Perl_utf8_to_bytes(aTHX_ a,b) +# define utf8_to_uvchr_buf_helper(a,b,c) Perl_utf8_to_uvchr_buf_helper(aTHX_ a,b,c) +# define utf8n_to_uvchr_msgs Perl_utf8n_to_uvchr_msgs +# define uvoffuni_to_utf8_flags_msgs(a,b,c,d) Perl_uvoffuni_to_utf8_flags_msgs(aTHX_ a,b,c,d) +# define uvuni_to_utf8(a,b) Perl_uvuni_to_utf8(aTHX_ a,b) +# define valid_utf8_to_uvchr Perl_valid_utf8_to_uvchr +# define vcmp(a,b) Perl_vcmp(aTHX_ a,b) +# define vcroak(a,b) Perl_vcroak(aTHX_ a,b) +# define vdeb(a,b) Perl_vdeb(aTHX_ a,b) +# define vform(a,b) Perl_vform(aTHX_ a,b) +# define vload_module(a,b,c,d) Perl_vload_module(aTHX_ a,b,c,d) +# define vmess(a,b) Perl_vmess(aTHX_ a,b) +# define vnewSVpvf(a,b) Perl_vnewSVpvf(aTHX_ a,b) +# define vnormal(a) Perl_vnormal(aTHX_ a) +# define vnumify(a) Perl_vnumify(aTHX_ a) +# define vstringify(a) Perl_vstringify(aTHX_ a) +# define vverify(a) Perl_vverify(aTHX_ a) +# define vwarn(a,b) Perl_vwarn(aTHX_ a,b) +# define vwarner(a,b,c) Perl_vwarner(aTHX_ a,b,c) +# define warn_sv(a) Perl_warn_sv(aTHX_ a) +# define whichsig_pv(a) Perl_whichsig_pv(aTHX_ a) +# define whichsig_pvn(a,b) Perl_whichsig_pvn(aTHX_ a,b) +# define whichsig_sv(a) Perl_whichsig_sv(aTHX_ a) +# define wrap_infix_plugin(a,b) Perl_wrap_infix_plugin(aTHX_ a,b) +# define wrap_keyword_plugin(a,b) Perl_wrap_keyword_plugin(aTHX_ a,b) +# define wrap_op_checker(a,b,c) Perl_wrap_op_checker(aTHX_ a,b,c) + +# if defined(DEBUGGING) +# define pad_setsv(a,b) Perl_pad_setsv(aTHX_ a,b) +# define pad_sv(a) Perl_pad_sv(aTHX_ a) +# endif +# if !defined(EBCDIC) +# define variant_byte_number Perl_variant_byte_number +# endif +# if defined(F_FREESP) && !defined(HAS_CHSIZE) && !defined(HAS_TRUNCATE) +# define my_chsize(a,b) Perl_my_chsize(aTHX_ a,b) +# endif +# if !defined(HAS_STRLCAT) +# define my_strlcat Perl_my_strlcat +# endif +# if !defined(HAS_STRLCPY) +# define my_strlcpy Perl_my_strlcpy +# endif +# if !defined(HAS_STRNLEN) +# define my_strnlen Perl_my_strnlen +# endif +# if defined(HAVE_INTERP_INTERN) +# define sys_intern_clear() Perl_sys_intern_clear(aTHX) +# define sys_intern_init() Perl_sys_intern_init(aTHX) +# if defined(USE_ITHREADS) +# define sys_intern_dup(a,b) Perl_sys_intern_dup(aTHX_ a,b) +# endif +# endif +# if defined(MULTIPLICITY) +# define croak_nocontext Perl_croak_nocontext +# define deb_nocontext Perl_deb_nocontext +# define die_nocontext Perl_die_nocontext +# define form_nocontext Perl_form_nocontext +# define load_module_nocontext Perl_load_module_nocontext +# define mess_nocontext Perl_mess_nocontext +# define newSVpvf_nocontext Perl_newSVpvf_nocontext +# define sv_catpvf_mg_nocontext Perl_sv_catpvf_mg_nocontext +# define sv_catpvf_nocontext Perl_sv_catpvf_nocontext +# define sv_setpvf_mg_nocontext Perl_sv_setpvf_mg_nocontext +# define sv_setpvf_nocontext Perl_sv_setpvf_nocontext +# define warn_nocontext Perl_warn_nocontext +# define warner_nocontext Perl_warner_nocontext +# endif /* defined(MULTIPLICITY) */ +# if !defined(MULTIPLICITY) || defined(PERL_CORE) +# define ck_warner(a,...) Perl_ck_warner(aTHX_ a,__VA_ARGS__) +# define ck_warner_d(a,...) Perl_ck_warner_d(aTHX_ a,__VA_ARGS__) +# define croak(...) Perl_croak(aTHX_ __VA_ARGS__) +# define deb(...) Perl_deb(aTHX_ __VA_ARGS__) +# define die(...) Perl_die(aTHX_ __VA_ARGS__) +# define dump_indent(a,b,...) Perl_dump_indent(aTHX_ a,b,__VA_ARGS__) +# define form(...) Perl_form(aTHX_ __VA_ARGS__) +# define load_module(a,b,...) Perl_load_module(aTHX_ a,b,__VA_ARGS__) +# define mess(...) Perl_mess(aTHX_ __VA_ARGS__) +# define newSVpvf(...) Perl_newSVpvf(aTHX_ __VA_ARGS__) +# define sv_catpvf(a,...) Perl_sv_catpvf(aTHX_ a,__VA_ARGS__) +# define sv_catpvf_mg(a,...) Perl_sv_catpvf_mg(aTHX_ a,__VA_ARGS__) +# define sv_setpvf(a,...) Perl_sv_setpvf(aTHX_ a,__VA_ARGS__) +# define sv_setpvf_mg(a,...) Perl_sv_setpvf_mg(aTHX_ a,__VA_ARGS__) +# define warn(...) Perl_warn(aTHX_ __VA_ARGS__) +# define warner(a,...) Perl_warner(aTHX_ a,__VA_ARGS__) +# endif /* !defined(MULTIPLICITY) || defined(PERL_CORE) */ +# if defined(MYMALLOC) +# define dump_mstats(a) Perl_dump_mstats(aTHX_ a) +# define get_mstats(a,b,c) Perl_get_mstats(aTHX_ a,b,c) +# if defined(PERL_CORE) +# define malloc_good_size Perl_malloc_good_size +# define malloced_size Perl_malloced_size +# endif +# endif +# if !defined(NO_MATHOMS) +# define sv_nolocking(a) Perl_sv_nolocking(aTHX_ a) +# define sv_nounlocking(a) Perl_sv_nounlocking(aTHX_ a) +# define utf8_to_uvchr(a,b) Perl_utf8_to_uvchr(aTHX_ a,b) +# define utf8_to_uvuni(a,b) Perl_utf8_to_uvuni(aTHX_ a,b) +# define utf8n_to_uvuni(a,b,c,d) Perl_utf8n_to_uvuni(aTHX_ a,b,c,d) +# endif +# if defined(PERL_CORE) +# define PerlLIO_dup2_cloexec(a,b) Perl_PerlLIO_dup2_cloexec(aTHX_ a,b) +# define PerlLIO_dup_cloexec(a) Perl_PerlLIO_dup_cloexec(aTHX_ a) +# define PerlLIO_open3_cloexec(a,b,c) Perl_PerlLIO_open3_cloexec(aTHX_ a,b,c) +# define PerlLIO_open_cloexec(a,b) Perl_PerlLIO_open_cloexec(aTHX_ a,b) +# define Slab_Alloc(a) Perl_Slab_Alloc(aTHX_ a) +# define Slab_Free(a) Perl_Slab_Free(aTHX_ a) +# define _warn_problematic_locale Perl__warn_problematic_locale +# define abort_execution(a,b) Perl_abort_execution(aTHX_ a,b) +# define alloc_LOGOP(a,b,c) Perl_alloc_LOGOP(aTHX_ a,b,c) +# define allocmy(a,b,c) Perl_allocmy(aTHX_ a,b,c) +# define amagic_applies(a,b,c) Perl_amagic_applies(aTHX_ a,b,c) +# define amagic_is_enabled(a) Perl_amagic_is_enabled(aTHX_ a) +# define apply(a,b,c) Perl_apply(aTHX_ a,b,c) +# define av_extend_guts(a,b,c,d,e) Perl_av_extend_guts(aTHX_ a,b,c,d,e) +# define av_nonelem(a,b) Perl_av_nonelem(aTHX_ a,b) +# define bind_match(a,b,c) Perl_bind_match(aTHX_ a,b,c) +# define boot_core_PerlIO() Perl_boot_core_PerlIO(aTHX) +# define boot_core_UNIVERSAL() Perl_boot_core_UNIVERSAL(aTHX) +# define boot_core_builtin() Perl_boot_core_builtin(aTHX) +# define boot_core_mro() Perl_boot_core_mro(aTHX) +# define build_infix_plugin(a,b,c) Perl_build_infix_plugin(aTHX_ a,b,c) +# define cando(a,b,c) Perl_cando(aTHX_ a,b,c) +# define check_utf8_print(a,b) Perl_check_utf8_print(aTHX_ a,b) +# define closest_cop(a,b,c,d) Perl_closest_cop(aTHX_ a,b,c,d) +# define cmpchain_extend(a,b,c) Perl_cmpchain_extend(aTHX_ a,b,c) +# define cmpchain_finish(a) Perl_cmpchain_finish(aTHX_ a) +# define cmpchain_start(a,b,c) Perl_cmpchain_start(aTHX_ a,b,c) +# define core_prototype(a,b,c,d) Perl_core_prototype(aTHX_ a,b,c,d) +# define coresub_op(a,b,c) Perl_coresub_op(aTHX_ a,b,c) +# define create_eval_scope(a,b) Perl_create_eval_scope(aTHX_ a,b) +# define croak_caller Perl_croak_caller +# define croak_no_mem Perl_croak_no_mem +# define croak_popstack Perl_croak_popstack +# define custom_op_get_field(a,b) Perl_custom_op_get_field(aTHX_ a,b) +# define cv_clone_into(a,b) Perl_cv_clone_into(aTHX_ a,b) +# define cv_const_sv_or_av Perl_cv_const_sv_or_av +# define cv_forget_slab(a) Perl_cv_forget_slab(aTHX_ a) +# define cv_undef_flags(a,b) Perl_cv_undef_flags(aTHX_ a,b) +# define cvgv_set(a,b) Perl_cvgv_set(aTHX_ a,b) +# define cvstash_set(a,b) Perl_cvstash_set(aTHX_ a,b) +# define deb_stack_all() Perl_deb_stack_all(aTHX) +# define debug_hash_seed(a) Perl_debug_hash_seed(aTHX_ a) +# define defelem_target(a,b) Perl_defelem_target(aTHX_ a,b) +# define delete_eval_scope() Perl_delete_eval_scope(aTHX) +# define die_unwind(a) Perl_die_unwind(aTHX_ a) +# define do_aexec5(a,b,c,d,e) Perl_do_aexec5(aTHX_ a,b,c,d,e) +# define do_dump_pad(a,b,c,d) Perl_do_dump_pad(aTHX_ a,b,c,d) +# define do_eof(a) Perl_do_eof(aTHX_ a) +# define do_ncmp(a,b) Perl_do_ncmp(aTHX_ a,b) +# define do_open6(a,b,c,d,e,f) Perl_do_open6(aTHX_ a,b,c,d,e,f) +# define do_open_raw(a,b,c,d,e,f) Perl_do_open_raw(aTHX_ a,b,c,d,e,f) +# define do_print(a,b) Perl_do_print(aTHX_ a,b) +# define do_readline() Perl_do_readline(aTHX) +# define do_seek(a,b,c) Perl_do_seek(aTHX_ a,b,c) +# define do_sysseek(a,b,c) Perl_do_sysseek(aTHX_ a,b,c) +# define do_tell(a) Perl_do_tell(aTHX_ a) +# define do_trans(a) Perl_do_trans(aTHX_ a) +# define do_vecget(a,b,c) Perl_do_vecget(aTHX_ a,b,c) +# define do_vecset(a) Perl_do_vecset(aTHX_ a) +# define do_vop(a,b,c,d) Perl_do_vop(aTHX_ a,b,c,d) +# define dofile(a,b) Perl_dofile(aTHX_ a,b) +# define dump_all_perl(a) Perl_dump_all_perl(aTHX_ a) +# define dump_packsubs_perl(a,b) Perl_dump_packsubs_perl(aTHX_ a,b) +# define dump_sub_perl(a,b) Perl_dump_sub_perl(aTHX_ a,b) +# define find_lexical_cv(a) Perl_find_lexical_cv(aTHX_ a) +# define find_runcv_where(a,b,c) Perl_find_runcv_where(aTHX_ a,b,c) +# define find_script(a,b,c,d) Perl_find_script(aTHX_ a,b,c,d) +# define force_locale_unlock Perl_force_locale_unlock +# define free_tied_hv_pool() Perl_free_tied_hv_pool(aTHX) +# define get_extended_os_errno Perl_get_extended_os_errno +# define get_hash_seed(a) Perl_get_hash_seed(aTHX_ a) +# define get_no_modify() Perl_get_no_modify(aTHX) +# define get_opargs() Perl_get_opargs(aTHX) +# define gv_override(a,b) Perl_gv_override(aTHX_ a,b) +# define gv_setref(a,b) Perl_gv_setref(aTHX_ a,b) +# define gv_try_downgrade(a) Perl_gv_try_downgrade(aTHX_ a) +# define hv_ename_add(a,b,c,d) Perl_hv_ename_add(aTHX_ a,b,c,d) +# define hv_ename_delete(a,b,c,d) Perl_hv_ename_delete(aTHX_ a,b,c,d) +# define hv_pushkv(a,b) Perl_hv_pushkv(aTHX_ a,b) +# define init_argv_symbols(a,b) Perl_init_argv_symbols(aTHX_ a,b) +# define init_constants() Perl_init_constants(aTHX) +# define init_debugger() Perl_init_debugger(aTHX) +# define init_named_cv(a,b) Perl_init_named_cv(aTHX_ a,b) +# define init_uniprops() Perl_init_uniprops(aTHX) +# define invert(a) Perl_invert(aTHX_ a) +# define invmap_dump(a,b) Perl_invmap_dump(aTHX_ a,b) +# define io_close(a,b,c,d) Perl_io_close(aTHX_ a,b,c,d) +# define isinfnansv(a) Perl_isinfnansv(aTHX_ a) +# define jmaybe(a) Perl_jmaybe(aTHX_ a) +# define keyword(a,b,c) Perl_keyword(aTHX_ a,b,c) +# define list(a) Perl_list(aTHX_ a) +# define localize(a,b) Perl_localize(aTHX_ a,b) +# define magic_clear_all_env(a,b) Perl_magic_clear_all_env(aTHX_ a,b) +# define magic_cleararylen_p(a,b) Perl_magic_cleararylen_p(aTHX_ a,b) +# define magic_clearenv(a,b) Perl_magic_clearenv(aTHX_ a,b) +# define magic_clearhint(a,b) Perl_magic_clearhint(aTHX_ a,b) +# define magic_clearhints(a,b) Perl_magic_clearhints(aTHX_ a,b) +# define magic_clearhook(a,b) Perl_magic_clearhook(aTHX_ a,b) +# define magic_clearhookall(a,b) Perl_magic_clearhookall(aTHX_ a,b) +# define magic_clearisa(a,b) Perl_magic_clearisa(aTHX_ a,b) +# define magic_clearpack(a,b) Perl_magic_clearpack(aTHX_ a,b) +# define magic_clearsig(a,b) Perl_magic_clearsig(aTHX_ a,b) +# define magic_copycallchecker(a,b,c,d,e) Perl_magic_copycallchecker(aTHX_ a,b,c,d,e) +# define magic_existspack(a,b) Perl_magic_existspack(aTHX_ a,b) +# define magic_freearylen_p(a,b) Perl_magic_freearylen_p(aTHX_ a,b) +# define magic_freedestruct(a,b) Perl_magic_freedestruct(aTHX_ a,b) +# define magic_freemglob(a,b) Perl_magic_freemglob(aTHX_ a,b) +# define magic_freeovrld(a,b) Perl_magic_freeovrld(aTHX_ a,b) +# define magic_freeutf8(a,b) Perl_magic_freeutf8(aTHX_ a,b) +# define magic_get(a,b) Perl_magic_get(aTHX_ a,b) +# define magic_getarylen(a,b) Perl_magic_getarylen(aTHX_ a,b) +# define magic_getdebugvar(a,b) Perl_magic_getdebugvar(aTHX_ a,b) +# define magic_getdefelem(a,b) Perl_magic_getdefelem(aTHX_ a,b) +# define magic_getnkeys(a,b) Perl_magic_getnkeys(aTHX_ a,b) +# define magic_getpack(a,b) Perl_magic_getpack(aTHX_ a,b) +# define magic_getpos(a,b) Perl_magic_getpos(aTHX_ a,b) +# define magic_getsig(a,b) Perl_magic_getsig(aTHX_ a,b) +# define magic_getsubstr(a,b) Perl_magic_getsubstr(aTHX_ a,b) +# define magic_gettaint(a,b) Perl_magic_gettaint(aTHX_ a,b) +# define magic_getuvar(a,b) Perl_magic_getuvar(aTHX_ a,b) +# define magic_getvec(a,b) Perl_magic_getvec(aTHX_ a,b) +# define magic_killbackrefs(a,b) Perl_magic_killbackrefs(aTHX_ a,b) +# define magic_nextpack(a,b,c) Perl_magic_nextpack(aTHX_ a,b,c) +# define magic_regdata_cnt(a,b) Perl_magic_regdata_cnt(aTHX_ a,b) +# define magic_regdatum_get(a,b) Perl_magic_regdatum_get(aTHX_ a,b) +# define magic_scalarpack(a,b) Perl_magic_scalarpack(aTHX_ a,b) +# define magic_set(a,b) Perl_magic_set(aTHX_ a,b) +# define magic_set_all_env(a,b) Perl_magic_set_all_env(aTHX_ a,b) +# define magic_setarylen(a,b) Perl_magic_setarylen(aTHX_ a,b) +# define magic_setdbline(a,b) Perl_magic_setdbline(aTHX_ a,b) +# define magic_setdebugvar(a,b) Perl_magic_setdebugvar(aTHX_ a,b) +# define magic_setdefelem(a,b) Perl_magic_setdefelem(aTHX_ a,b) +# define magic_setenv(a,b) Perl_magic_setenv(aTHX_ a,b) +# define magic_sethint(a,b) Perl_magic_sethint(aTHX_ a,b) +# define magic_sethook(a,b) Perl_magic_sethook(aTHX_ a,b) +# define magic_sethookall(a,b) Perl_magic_sethookall(aTHX_ a,b) +# define magic_setisa(a,b) Perl_magic_setisa(aTHX_ a,b) +# define magic_setlvref(a,b) Perl_magic_setlvref(aTHX_ a,b) +# define magic_setmglob(a,b) Perl_magic_setmglob(aTHX_ a,b) +# define magic_setnkeys(a,b) Perl_magic_setnkeys(aTHX_ a,b) +# define magic_setnonelem(a,b) Perl_magic_setnonelem(aTHX_ a,b) +# define magic_setpack(a,b) Perl_magic_setpack(aTHX_ a,b) +# define magic_setpos(a,b) Perl_magic_setpos(aTHX_ a,b) +# define magic_setregexp(a,b) Perl_magic_setregexp(aTHX_ a,b) +# define magic_setsig(a,b) Perl_magic_setsig(aTHX_ a,b) +# define magic_setsigall(a,b) Perl_magic_setsigall(aTHX_ a,b) +# define magic_setsubstr(a,b) Perl_magic_setsubstr(aTHX_ a,b) +# define magic_settaint(a,b) Perl_magic_settaint(aTHX_ a,b) +# define magic_setutf8(a,b) Perl_magic_setutf8(aTHX_ a,b) +# define magic_setuvar(a,b) Perl_magic_setuvar(aTHX_ a,b) +# define magic_setvec(a,b) Perl_magic_setvec(aTHX_ a,b) +# define magic_sizepack(a,b) Perl_magic_sizepack(aTHX_ a,b) +# define magic_wipepack(a,b) Perl_magic_wipepack(aTHX_ a,b) +# define mg_localize(a,b,c) Perl_mg_localize(aTHX_ a,b,c) +# define mode_from_discipline(a,b) Perl_mode_from_discipline(aTHX_ a,b) +# define mro_isa_changed_in(a) Perl_mro_isa_changed_in(aTHX_ a) +# define mro_package_moved(a,b,c,d) Perl_mro_package_moved(aTHX_ a,b,c,d) +# define my_attrs(a,b) Perl_my_attrs(aTHX_ a,b) +# define my_clearenv() Perl_my_clearenv(aTHX) +# define my_lstat_flags(a) Perl_my_lstat_flags(aTHX_ a) +# define my_stat_flags(a) Perl_my_stat_flags(aTHX_ a) +# define my_strerror(a,b) Perl_my_strerror(aTHX_ a,b) +# define my_unexec() Perl_my_unexec(aTHX) +# define newATTRSUB_x(a,b,c,d,e,f) Perl_newATTRSUB_x(aTHX_ a,b,c,d,e,f) +# define newSTUB(a,b) Perl_newSTUB(aTHX_ a,b) +# define newSVavdefelem(a,b,c) Perl_newSVavdefelem(aTHX_ a,b,c) +# define newXS_deffile(a,b) Perl_newXS_deffile(aTHX_ a,b) +# define newXS_len_flags(a,b,c,d,e,f,g) Perl_newXS_len_flags(aTHX_ a,b,c,d,e,f,g) +# define nextargv(a,b) Perl_nextargv(aTHX_ a,b) +# define no_bareword_filehandle(a) Perl_no_bareword_filehandle(aTHX_ a) +# define noperl_die Perl_noperl_die +# define notify_parser_that_changed_to_utf8() Perl_notify_parser_that_changed_to_utf8(aTHX) +# define oopsAV(a) Perl_oopsAV(aTHX_ a) +# define oopsHV(a) Perl_oopsHV(aTHX_ a) +# define op_unscope(a) Perl_op_unscope(aTHX_ a) +# define package(a) Perl_package(aTHX_ a) +# define package_version(a) Perl_package_version(aTHX_ a) +# define pad_add_weakref(a) Perl_pad_add_weakref(aTHX_ a) +# define pad_block_start(a) Perl_pad_block_start(aTHX_ a) +# define pad_fixup_inner_anons(a,b,c) Perl_pad_fixup_inner_anons(aTHX_ a,b,c) +# define pad_free(a) Perl_pad_free(aTHX_ a) +# define pad_leavemy() Perl_pad_leavemy(aTHX) +# define pad_push(a,b) Perl_pad_push(aTHX_ a,b) +# define pad_swipe(a,b) Perl_pad_swipe(aTHX_ a,b) +# define padlist_store(a,b,c) Perl_padlist_store(aTHX_ a,b,c) +# define parse_unicode_opts(a) Perl_parse_unicode_opts(aTHX_ a) +# define parser_free(a) Perl_parser_free(aTHX_ a) +# define peep(a) Perl_peep(aTHX_ a) +# define pmruntime(a,b,c,d,e) Perl_pmruntime(aTHX_ a,b,c,d,e) +# define re_op_compile(a,b,c,d,e,f,g,h) Perl_re_op_compile(aTHX_ a,b,c,d,e,f,g,h) +# define refcounted_he_chain_2hv(a,b) Perl_refcounted_he_chain_2hv(aTHX_ a,b) +# define refcounted_he_fetch_pv(a,b,c,d) Perl_refcounted_he_fetch_pv(aTHX_ a,b,c,d) +# define refcounted_he_fetch_pvn(a,b,c,d,e) Perl_refcounted_he_fetch_pvn(aTHX_ a,b,c,d,e) +# define refcounted_he_fetch_sv(a,b,c,d) Perl_refcounted_he_fetch_sv(aTHX_ a,b,c,d) +# define refcounted_he_free(a) Perl_refcounted_he_free(aTHX_ a) +# define refcounted_he_inc(a) Perl_refcounted_he_inc(aTHX_ a) +# define refcounted_he_new_pv(a,b,c,d,e) Perl_refcounted_he_new_pv(aTHX_ a,b,c,d,e) +# define refcounted_he_new_pvn(a,b,c,d,e,f) Perl_refcounted_he_new_pvn(aTHX_ a,b,c,d,e,f) +# define refcounted_he_new_sv(a,b,c,d,e) Perl_refcounted_he_new_sv(aTHX_ a,b,c,d,e) +# define report_evil_fh(a) Perl_report_evil_fh(aTHX_ a) +# define report_wrongway_fh(a,b) Perl_report_wrongway_fh(aTHX_ a,b) +# define rpeep(a) Perl_rpeep(aTHX_ a) +# define rsignal_restore(a,b) Perl_rsignal_restore(aTHX_ a,b) +# define rsignal_save(a,b,c) Perl_rsignal_save(aTHX_ a,b,c) +# define rxres_save(a,b) Perl_rxres_save(aTHX_ a,b) +# define save_strlen(a) Perl_save_strlen(aTHX_ a) +# define sawparens(a) Perl_sawparens(aTHX_ a) +# define scalar(a) Perl_scalar(aTHX_ a) +# define scalarvoid(a) Perl_scalarvoid(aTHX_ a) +# define set_caret_X() Perl_set_caret_X(aTHX) +# define set_numeric_standard() Perl_set_numeric_standard(aTHX) +# define set_numeric_underlying() Perl_set_numeric_underlying(aTHX) +# define setfd_cloexec Perl_setfd_cloexec +# define setfd_cloexec_for_nonsysfd(a) Perl_setfd_cloexec_for_nonsysfd(aTHX_ a) +# define setfd_cloexec_or_inhexec_by_sysfdness(a) Perl_setfd_cloexec_or_inhexec_by_sysfdness(aTHX_ a) +# define setfd_inhexec Perl_setfd_inhexec +# define setfd_inhexec_for_sysfd(a) Perl_setfd_inhexec_for_sysfd(aTHX_ a) +# define sighandler1 Perl_sighandler1 +# define sighandler3 Perl_sighandler3 +# define sub_crush_depth(a) Perl_sub_crush_depth(aTHX_ a) +# define sv_2num(a) Perl_sv_2num(aTHX_ a) +# define sv_clean_all() Perl_sv_clean_all(aTHX) +# define sv_clean_objs() Perl_sv_clean_objs(aTHX) +# define sv_del_backref(a,b) Perl_sv_del_backref(aTHX_ a,b) +# define sv_free_arenas() Perl_sv_free_arenas(aTHX) +# define sv_pvbyten_force_wrapper(a,b,c) Perl_sv_pvbyten_force_wrapper(aTHX_ a,b,c) +# define sv_pvutf8n_force_wrapper(a,b,c) Perl_sv_pvutf8n_force_wrapper(aTHX_ a,b,c) +# define sv_resetpvn(a,b,c) Perl_sv_resetpvn(aTHX_ a,b,c) +# define sv_sethek(a,b) Perl_sv_sethek(aTHX_ a,b) +# define tmps_grow_p(a) Perl_tmps_grow_p(aTHX_ a) +# define utilize(a,b,c,d,e) Perl_utilize(aTHX_ a,b,c,d,e) +# define vivify_ref(a,b) Perl_vivify_ref(aTHX_ a,b) +# define wait4pid(a,b,c) Perl_wait4pid(aTHX_ a,b,c) +# define watch(a) Perl_watch(aTHX_ a) +# define write_to_stderr(a) Perl_write_to_stderr(aTHX_ a) +# define xs_boot_epilog(a) Perl_xs_boot_epilog(aTHX_ a) +# define yyerror(a) Perl_yyerror(aTHX_ a) +# define yyerror_pv(a,b) Perl_yyerror_pv(aTHX_ a,b) +# define yyerror_pvn(a,b,c) Perl_yyerror_pvn(aTHX_ a,b,c) +# define yyparse(a) Perl_yyparse(aTHX_ a) +# define yyquit() Perl_yyquit(aTHX) +# define yyunlex() Perl_yyunlex(aTHX) +# define opslab_force_free(a) Perl_opslab_force_free(aTHX_ a) +# define opslab_free(a) Perl_opslab_free(aTHX_ a) +# define opslab_free_nopad(a) Perl_opslab_free_nopad(aTHX_ a) +# define parser_free_nexttoke_ops(a,b) Perl_parser_free_nexttoke_ops(aTHX_ a,b) +# define should_warn_nl S_should_warn_nl +# if defined(DEBUGGING) +# define get_debug_opts(a,b) Perl_get_debug_opts(aTHX_ a,b) +# define set_padlist Perl_set_padlist +# endif +# if defined(DEBUG_LEAKING_SCALARS_FORK_DUMP) +# define dump_sv_child(a) Perl_dump_sv_child(aTHX_ a) +# endif +# if !defined(HAS_GETENV_LEN) +# define getenv_len(a,b) Perl_getenv_len(aTHX_ a,b) +# endif +# if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) +# define do_ipcctl(a,b,c) Perl_do_ipcctl(aTHX_ a,b,c) +# define do_ipcget(a,b,c) Perl_do_ipcget(aTHX_ a,b,c) +# define do_msgrcv(a,b) Perl_do_msgrcv(aTHX_ a,b) +# define do_msgsnd(a,b) Perl_do_msgsnd(aTHX_ a,b) +# define do_semop(a,b) Perl_do_semop(aTHX_ a,b) +# define do_shmio(a,b,c) Perl_do_shmio(aTHX_ a,b,c) +# endif +# if defined(HAS_PIPE) +# define PerlProc_pipe_cloexec(a) Perl_PerlProc_pipe_cloexec(aTHX_ a) +# endif +# if !defined(HAS_RENAME) +# define same_dirent(a,b) Perl_same_dirent(aTHX_ a,b) +# endif +# if defined(HAS_SOCKET) +# define PerlSock_accept_cloexec(a,b,c) Perl_PerlSock_accept_cloexec(aTHX_ a,b,c) +# define PerlSock_socket_cloexec(a,b,c) Perl_PerlSock_socket_cloexec(aTHX_ a,b,c) +# endif +# if defined(HAS_SOCKETPAIR) || \ + ( defined(AF_INET) && defined(HAS_SOCKET) && defined(PF_INET) && \ + defined(SOCK_DGRAM) ) +# define PerlSock_socketpair_cloexec(a,b,c,d) Perl_PerlSock_socketpair_cloexec(aTHX_ a,b,c,d) +# endif +# if defined(_MSC_VER) +# define magic_regdatum_set(a,b) Perl_magic_regdatum_set(aTHX_ a,b) +# else +# define magic_regdatum_set(a,b) Perl_magic_regdatum_set(aTHX_ a,b) +# endif +# if !defined(MULTIPLICITY) || defined(PERL_CORE) +# define tied_method(a,b,c,d,e,...) Perl_tied_method(aTHX_ a,b,c,d,e,__VA_ARGS__) +# if defined(PERL_IN_REGCOMP_C) +# define re_croak(a,...) S_re_croak(aTHX_ a,__VA_ARGS__) +# endif +# endif +# if defined(PERL_DEBUG_READONLY_COW) +# define sv_buf_to_ro(a) Perl_sv_buf_to_ro(aTHX_ a) +# endif +# if defined(PERL_DEBUG_READONLY_OPS) +# define Slab_to_ro(a) Perl_Slab_to_ro(aTHX_ a) +# define Slab_to_rw(a) Perl_Slab_to_rw(aTHX_ a) +# endif +# if !defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION) +# define do_exec(a) Perl_do_exec(aTHX_ a) +# endif +# if defined(PERL_IN_AV_C) +# define get_aux_mg(a) S_get_aux_mg(aTHX_ a) +# endif +# if defined(PERL_IN_DEB_C) +# define deb_stack_n(a,b,c,d,e) S_deb_stack_n(aTHX_ a,b,c,d,e) +# endif +# if defined(PERL_IN_DOIO_C) +# define argvout_final(a,b,c) S_argvout_final(aTHX_ a,b,c) +# define exec_failed(a,b,c) S_exec_failed(aTHX_ a,b,c) +# define ingroup(a,b) S_ingroup(aTHX_ a,b) +# define openn_cleanup(a,b,c,d,e,f,g,h,i,j,k,l,m) S_openn_cleanup(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l,m) +# define openn_setup(a,b,c,d,e,f) S_openn_setup(aTHX_ a,b,c,d,e,f) +# endif +# if defined(PERL_IN_DOOP_C) +# define do_trans_complex(a,b) S_do_trans_complex(aTHX_ a,b) +# define do_trans_count(a,b) S_do_trans_count(aTHX_ a,b) +# define do_trans_count_invmap(a,b) S_do_trans_count_invmap(aTHX_ a,b) +# define do_trans_invmap(a,b) S_do_trans_invmap(aTHX_ a,b) +# define do_trans_simple(a,b) S_do_trans_simple(aTHX_ a,b) +# endif +# if defined(PERL_IN_DUMP_C) +# define deb_curcv(a) S_deb_curcv(aTHX_ a) +# define debprof(a) S_debprof(aTHX_ a) +# define pm_description(a) S_pm_description(aTHX_ a) +# define sequence_num(a) S_sequence_num(aTHX_ a) +# endif +# if defined(PERL_IN_GLOBALS_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PEEP_C) +# define ck_anoncode(a) Perl_ck_anoncode(aTHX_ a) +# define ck_backtick(a) Perl_ck_backtick(aTHX_ a) +# define ck_bitop(a) Perl_ck_bitop(aTHX_ a) +# define ck_cmp(a) Perl_ck_cmp(aTHX_ a) +# define ck_concat(a) Perl_ck_concat(aTHX_ a) +# define ck_defined(a) Perl_ck_defined(aTHX_ a) +# define ck_delete(a) Perl_ck_delete(aTHX_ a) +# define ck_each(a) Perl_ck_each(aTHX_ a) +# define ck_eof(a) Perl_ck_eof(aTHX_ a) +# define ck_eval(a) Perl_ck_eval(aTHX_ a) +# define ck_exec(a) Perl_ck_exec(aTHX_ a) +# define ck_exists(a) Perl_ck_exists(aTHX_ a) +# define ck_ftst(a) Perl_ck_ftst(aTHX_ a) +# define ck_fun(a) Perl_ck_fun(aTHX_ a) +# define ck_glob(a) Perl_ck_glob(aTHX_ a) +# define ck_grep(a) Perl_ck_grep(aTHX_ a) +# define ck_helemexistsor(a) Perl_ck_helemexistsor(aTHX_ a) +# define ck_index(a) Perl_ck_index(aTHX_ a) +# define ck_isa(a) Perl_ck_isa(aTHX_ a) +# define ck_join(a) Perl_ck_join(aTHX_ a) +# define ck_length(a) Perl_ck_length(aTHX_ a) +# define ck_lfun(a) Perl_ck_lfun(aTHX_ a) +# define ck_listiob(a) Perl_ck_listiob(aTHX_ a) +# define ck_match(a) Perl_ck_match(aTHX_ a) +# define ck_method(a) Perl_ck_method(aTHX_ a) +# define ck_null(a) Perl_ck_null(aTHX_ a) +# define ck_open(a) Perl_ck_open(aTHX_ a) +# define ck_prototype(a) Perl_ck_prototype(aTHX_ a) +# define ck_readline(a) Perl_ck_readline(aTHX_ a) +# define ck_refassign(a) Perl_ck_refassign(aTHX_ a) +# define ck_repeat(a) Perl_ck_repeat(aTHX_ a) +# define ck_require(a) Perl_ck_require(aTHX_ a) +# define ck_return(a) Perl_ck_return(aTHX_ a) +# define ck_rfun(a) Perl_ck_rfun(aTHX_ a) +# define ck_rvconst(a) Perl_ck_rvconst(aTHX_ a) +# define ck_sassign(a) Perl_ck_sassign(aTHX_ a) +# define ck_select(a) Perl_ck_select(aTHX_ a) +# define ck_shift(a) Perl_ck_shift(aTHX_ a) +# define ck_smartmatch(a) Perl_ck_smartmatch(aTHX_ a) +# define ck_sort(a) Perl_ck_sort(aTHX_ a) +# define ck_spair(a) Perl_ck_spair(aTHX_ a) +# define ck_split(a) Perl_ck_split(aTHX_ a) +# define ck_stringify(a) Perl_ck_stringify(aTHX_ a) +# define ck_subr(a) Perl_ck_subr(aTHX_ a) +# define ck_substr(a) Perl_ck_substr(aTHX_ a) +# define ck_svconst(a) Perl_ck_svconst(aTHX_ a) +# define ck_tell(a) Perl_ck_tell(aTHX_ a) +# define ck_trunc(a) Perl_ck_trunc(aTHX_ a) +# define ck_trycatch(a) Perl_ck_trycatch(aTHX_ a) +# endif /* defined(PERL_IN_GLOBALS_C) || defined(PERL_IN_OP_C) || + defined(PERL_IN_PEEP_C) */ +# if defined(PERL_IN_GV_C) +# define find_default_stash(a,b,c,d,e,f) S_find_default_stash(aTHX_ a,b,c,d,e,f) +# define gv_fetchmeth_internal(a,b,c,d,e,f) S_gv_fetchmeth_internal(aTHX_ a,b,c,d,e,f) +# define gv_init_svtype(a,b) S_gv_init_svtype(aTHX_ a,b) +# define gv_is_in_main(a,b,c) S_gv_is_in_main(aTHX_ a,b,c) +# define gv_magicalize(a,b,c,d,e) S_gv_magicalize(aTHX_ a,b,c,d,e) +# define gv_magicalize_isa(a) S_gv_magicalize_isa(aTHX_ a) +# define gv_stashpvn_internal(a,b,c) S_gv_stashpvn_internal(aTHX_ a,b,c) +# define maybe_multimagic_gv(a,b,c) S_maybe_multimagic_gv(aTHX_ a,b,c) +# define parse_gv_stash_name(a,b,c,d,e,f,g,h) S_parse_gv_stash_name(aTHX_ a,b,c,d,e,f,g,h) +# define require_tie_mod(a,b,c,d,e) S_require_tie_mod(aTHX_ a,b,c,d,e) +# endif /* defined(PERL_IN_GV_C) */ +# if defined(PERL_IN_HV_C) +# define clear_placeholders(a,b) S_clear_placeholders(aTHX_ a,b) +# define hsplit(a,b,c) S_hsplit(aTHX_ a,b,c) +# define hv_auxinit(a) S_hv_auxinit(aTHX_ a) +# define hv_delete_common(a,b,c,d,e,f,g) S_hv_delete_common(aTHX_ a,b,c,d,e,f,g) +# define hv_free_ent_ret(a) S_hv_free_ent_ret(aTHX_ a) +# define hv_free_entries(a) S_hv_free_entries(aTHX_ a) +# define hv_magic_check S_hv_magic_check +# define hv_notallowed(a,b,c,d) S_hv_notallowed(aTHX_ a,b,c,d) +# define refcounted_he_value(a) S_refcounted_he_value(aTHX_ a) +# define save_hek_flags S_save_hek_flags +# define share_hek_flags(a,b,c,d) S_share_hek_flags(aTHX_ a,b,c,d) +# define unshare_hek_or_pvn(a,b,c,d) S_unshare_hek_or_pvn(aTHX_ a,b,c,d) +# if !defined(PURIFY) +# define new_he() S_new_he(aTHX) +# endif +# endif /* defined(PERL_IN_HV_C) */ +# if defined(PERL_IN_LOCALE_C) +# define get_locale_string_utf8ness_i(a,b,c,d) S_get_locale_string_utf8ness_i(aTHX_ a,b,c,d) +# define is_locale_utf8(a) S_is_locale_utf8(aTHX_ a) +# if defined(HAS_LOCALECONV) +# define my_localeconv(a) S_my_localeconv(aTHX_ a) +# define populate_hash_from_localeconv(a,b,c,d,e) S_populate_hash_from_localeconv(aTHX_ a,b,c,d,e) +# endif +# if defined(USE_LOCALE) +# define get_category_index S_get_category_index +# define get_category_index_nowarn S_get_category_index_nowarn +# define mortalized_pv_copy(a) S_mortalized_pv_copy(aTHX_ a) +# define new_LC_ALL(a,b) S_new_LC_ALL(aTHX_ a,b) +# define save_to_buffer S_save_to_buffer +# define setlocale_failure_panic_i(a,b,c,d,e) S_setlocale_failure_panic_i(aTHX_ a,b,c,d,e) +# define stdize_locale(a,b,c,d,e) S_stdize_locale(aTHX_ a,b,c,d,e) +# if defined(DEBUGGING) +# define my_setlocale_debug_string_i(a,b,c,d) S_my_setlocale_debug_string_i(aTHX_ a,b,c,d) +# endif +# if defined(HAS_NL_LANGINFO) || defined(HAS_NL_LANGINFO_L) +# define my_langinfo_i(a,b,c,d,e,f) S_my_langinfo_i(aTHX_ a,b,c,d,e,f) +# else +# define my_langinfo_i(a,b,c,d,e,f) S_my_langinfo_i(aTHX_ a,b,c,d,e,f) +# endif +# if defined(USE_LOCALE_COLLATE) +# define new_collate(a,b) S_new_collate(aTHX_ a,b) +# if defined(DEBUGGING) +# define print_collxfrm_input_and_return(a,b,c,d,e) S_print_collxfrm_input_and_return(aTHX_ a,b,c,d,e) +# endif +# endif +# if defined(USE_LOCALE_CTYPE) +# define is_codeset_name_UTF8 S_is_codeset_name_UTF8 +# define new_ctype(a,b) S_new_ctype(aTHX_ a,b) +# endif +# if defined(USE_LOCALE_NUMERIC) +# define new_numeric(a,b) S_new_numeric(aTHX_ a,b) +# endif +# if defined(USE_PERL_SWITCH_LOCALE_CONTEXT) || defined(DEBUGGING) +# define get_LC_ALL_display() S_get_LC_ALL_display(aTHX) +# endif +# if defined(USE_POSIX_2008_LOCALE) +# define emulate_setlocale_i(a,b,c,d) S_emulate_setlocale_i(aTHX_ a,b,c,d) +# define my_querylocale_i(a) S_my_querylocale_i(aTHX_ a) +# define setlocale_from_aggregate_LC_ALL(a,b) S_setlocale_from_aggregate_LC_ALL(aTHX_ a,b) +# define use_curlocale_scratch() S_use_curlocale_scratch(aTHX) +# if defined(USE_QUERYLOCALE) +# define calculate_LC_ALL(a) S_calculate_LC_ALL(aTHX_ a) +# else +# define update_PL_curlocales_i(a,b,c) S_update_PL_curlocales_i(aTHX_ a,b,c) +# endif +# elif defined(USE_LOCALE_THREADS) && \ + !defined(USE_THREAD_SAFE_LOCALE) && \ + !defined(USE_THREAD_SAFE_LOCALE_EMULATION) /* && + !defined(USE_POSIX_2008_LOCALE) */ +# define less_dicey_setlocale_r(a,b) S_less_dicey_setlocale_r(aTHX_ a,b) +# define less_dicey_void_setlocale_i(a,b,c) S_less_dicey_void_setlocale_i(aTHX_ a,b,c) +# if 0 +# define less_dicey_bool_setlocale_r(a,b) S_less_dicey_bool_setlocale_r(aTHX_ a,b) +# endif +# endif +# if !( defined(USE_POSIX_2008_LOCALE) && defined(USE_QUERYLOCALE) ) && \ + ( !defined(LC_ALL) || defined(USE_POSIX_2008_LOCALE) || \ + defined(WIN32) ) +# define calculate_LC_ALL(a) S_calculate_LC_ALL(aTHX_ a) +# endif +# if defined(WIN32) +# define Win_byte_string_to_wstring S_Win_byte_string_to_wstring +# define Win_wstring_to_byte_string S_Win_wstring_to_byte_string +# define win32_setlocale(a,b) S_win32_setlocale(aTHX_ a,b) +# define wrap_wsetlocale(a,b) S_wrap_wsetlocale(aTHX_ a,b) +# endif +# if defined(WIN32) || \ + ( defined(USE_POSIX_2008_LOCALE) && !defined(USE_QUERYLOCALE) ) +# define find_locale_from_environment(a) S_find_locale_from_environment(aTHX_ a) +# endif +# endif /* defined(USE_LOCALE) */ +# if defined(USE_POSIX_2008_LOCALE) || defined(DEBUGGING) +# define get_displayable_string(a,b,c) S_get_displayable_string(aTHX_ a,b,c) +# endif +# endif /* defined(PERL_IN_LOCALE_C) */ +# if defined(PERL_IN_MALLOC_C) +# define adjust_size_and_find_bucket S_adjust_size_and_find_bucket +# endif +# if defined(PERL_IN_MG_C) +# define fixup_errno_string(a) S_fixup_errno_string(aTHX_ a) +# define magic_methcall1(a,b,c,d,e,f) S_magic_methcall1(aTHX_ a,b,c,d,e,f) +# define magic_methpack(a,b,c) S_magic_methpack(aTHX_ a,b,c) +# define restore_magic(a) S_restore_magic(aTHX_ a) +# define save_magic_flags(a,b,c) S_save_magic_flags(aTHX_ a,b,c) +# define unwind_handler_stack(a) S_unwind_handler_stack(aTHX_ a) +# endif +# if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C) +# define translate_substr_offsets Perl_translate_substr_offsets +# endif +# if defined(PERL_IN_MRO_C) +# define mro_clean_isarev(a,b,c,d,e,f) S_mro_clean_isarev(aTHX_ a,b,c,d,e,f) +# define mro_gather_and_rename(a,b,c,d,e) S_mro_gather_and_rename(aTHX_ a,b,c,d,e) +# define mro_get_linear_isa_dfs(a,b) S_mro_get_linear_isa_dfs(aTHX_ a,b) +# endif +# if defined(PERL_IN_NUMERIC_C) +# define output_non_portable(a) S_output_non_portable(aTHX_ a) +# endif +# if defined(PERL_IN_OP_C) +# define apply_attrs(a,b,c) S_apply_attrs(aTHX_ a,b,c) +# define apply_attrs_my(a,b,c,d) S_apply_attrs_my(aTHX_ a,b,c,d) +# define assignment_type(a) S_assignment_type(aTHX_ a) +# define bad_type_gv(a,b,c,d) S_bad_type_gv(aTHX_ a,b,c,d) +# define bad_type_pv(a,b,c,d) S_bad_type_pv(aTHX_ a,b,c,d) +# define clear_special_blocks(a,b,c) S_clear_special_blocks(aTHX_ a,b,c) +# define cop_free(a) S_cop_free(aTHX_ a) +# define dup_attrlist(a) S_dup_attrlist(aTHX_ a) +# define find_and_forget_pmops(a) S_find_and_forget_pmops(aTHX_ a) +# define fold_constants(a) S_fold_constants(aTHX_ a) +# define force_list(a,b) S_force_list(aTHX_ a,b) +# define forget_pmop(a) S_forget_pmop(aTHX_ a) +# define gen_constant_list(a) S_gen_constant_list(aTHX_ a) +# define inplace_aassign(a) S_inplace_aassign(aTHX_ a) +# define is_handle_constructor S_is_handle_constructor +# define listkids(a) S_listkids(aTHX_ a) +# define looks_like_bool(a) S_looks_like_bool(aTHX_ a) +# define modkids(a,b) S_modkids(aTHX_ a,b) +# define move_proto_attr(a,b,c,d) S_move_proto_attr(aTHX_ a,b,c,d) +# define my_kid(a,b,c) S_my_kid(aTHX_ a,b,c) +# define newGIVWHENOP(a,b,c,d,e) S_newGIVWHENOP(aTHX_ a,b,c,d,e) +# define newMETHOP_internal(a,b,c,d) S_newMETHOP_internal(aTHX_ a,b,c,d) +# define new_logop(a,b,c,d) S_new_logop(aTHX_ a,b,c,d) +# define no_fh_allowed(a) S_no_fh_allowed(aTHX_ a) +# define op_integerize(a) S_op_integerize(aTHX_ a) +# define op_std_init(a) S_op_std_init(aTHX_ a) +# define pmtrans(a,b,c) S_pmtrans(aTHX_ a,b,c) +# define process_special_blocks(a,b,c,d) S_process_special_blocks(aTHX_ a,b,c,d) +# define ref_array_or_hash(a) S_ref_array_or_hash(aTHX_ a) +# define refkids(a,b) S_refkids(aTHX_ a,b) +# define scalar_mod_type S_scalar_mod_type +# define scalarboolean(a) S_scalarboolean(aTHX_ a) +# define scalarkids(a) S_scalarkids(aTHX_ a) +# define search_const(a) S_search_const(aTHX_ a) +# define simplify_sort(a) S_simplify_sort(aTHX_ a) +# define too_few_arguments_pv(a,b,c) S_too_few_arguments_pv(aTHX_ a,b,c) +# define too_many_arguments_pv(a,b,c) S_too_many_arguments_pv(aTHX_ a,b,c) +# define voidnonfinal(a) S_voidnonfinal(aTHX_ a) +# endif /* defined(PERL_IN_OP_C) */ +# if defined(PERL_IN_OP_C) || defined(PERL_IN_PAD_C) +# define PadnameIN_SCOPE S_PadnameIN_SCOPE +# endif +# if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C) +# define check_hash_fields_and_hekify(a,b,c) Perl_check_hash_fields_and_hekify(aTHX_ a,b,c) +# define no_bareword_allowed(a) Perl_no_bareword_allowed(aTHX_ a) +# define op_prune_chain_head Perl_op_prune_chain_head +# define op_varname(a) Perl_op_varname(aTHX_ a) +# define warn_elem_scalar_context(a,b,c,d) Perl_warn_elem_scalar_context(aTHX_ a,b,c,d) +# endif +# if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C) +# define report_redefined_cv(a,b,c) Perl_report_redefined_cv(aTHX_ a,b,c) +# define varname(a,b,c,d,e,f) Perl_varname(aTHX_ a,b,c,d,e,f) +# endif +# if defined(PERL_IN_PAD_C) +# define pad_alloc_name(a,b,c,d) S_pad_alloc_name(aTHX_ a,b,c,d) +# define pad_check_dup(a,b,c) S_pad_check_dup(aTHX_ a,b,c) +# define pad_findlex(a,b,c,d,e,f,g,h,i) S_pad_findlex(aTHX_ a,b,c,d,e,f,g,h,i) +# define pad_reset() S_pad_reset(aTHX) +# if defined(DEBUGGING) +# define cv_dump(a,b) S_cv_dump(aTHX_ a,b) +# endif +# endif +# if defined(PERL_IN_PEEP_C) +# define finalize_op(a) S_finalize_op(aTHX_ a) +# define optimize_op(a) S_optimize_op(aTHX_ a) +# define traverse_op_tree(a,b) S_traverse_op_tree(aTHX_ a,b) +# endif +# if defined(PERL_IN_PERL_C) +# define find_beginning(a,b) S_find_beginning(aTHX_ a,b) +# define forbid_setid(a,b) S_forbid_setid(aTHX_ a,b) +# define incpush(a,b,c) S_incpush(aTHX_ a,b,c) +# define incpush_use_sep(a,b,c) S_incpush_use_sep(aTHX_ a,b,c) +# define init_ids() S_init_ids(aTHX) +# define init_interp() S_init_interp(aTHX) +# define init_main_stash() S_init_main_stash(aTHX) +# define init_perllib() S_init_perllib(aTHX) +# define init_postdump_symbols(a,b,c) S_init_postdump_symbols(aTHX_ a,b,c) +# define init_predump_symbols() S_init_predump_symbols(aTHX) +# define mayberelocate(a,b,c) S_mayberelocate(aTHX_ a,b,c) +# define minus_v() S_minus_v(aTHX) +# define my_exit_jump() S_my_exit_jump(aTHX) +# define nuke_stacks() S_nuke_stacks(aTHX) +# define open_script(a,b,c) S_open_script(aTHX_ a,b,c) +# define parse_body(a,b) S_parse_body(aTHX_ a,b) +# define run_body(a) S_run_body(aTHX_ a) +# define usage() S_usage(aTHX) +# if !defined(PERL_IS_MINIPERL) +# define incpush_if_exists(a,b,c) S_incpush_if_exists(aTHX_ a,b,c) +# endif +# endif /* defined(PERL_IN_PERL_C) */ +# if defined(PERL_IN_PP_C) +# define do_chomp(a,b,c) S_do_chomp(aTHX_ a,b,c) +# define do_delete_local() S_do_delete_local(aTHX) +# define refto(a) S_refto(aTHX_ a) +# endif +# if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C) +# define lossless_NV_to_IV S_lossless_NV_to_IV +# endif +# if defined(PERL_IN_PP_C) || defined(PERL_IN_UTF8_C) +# define _to_upper_title_latin1(a,b,c,d) Perl__to_upper_title_latin1(aTHX_ a,b,c,d) +# endif +# if defined(PERL_IN_PP_CTL_C) +# define check_type_and_open(a) S_check_type_and_open(aTHX_ a) +# define destroy_matcher(a) S_destroy_matcher(aTHX_ a) +# define do_smartmatch(a,b,c) S_do_smartmatch(aTHX_ a,b,c) +# define docatch(a) S_docatch(aTHX_ a) +# define doeval_compile(a,b,c,d) S_doeval_compile(aTHX_ a,b,c,d) +# define dofindlabel(a,b,c,d,e,f) S_dofindlabel(aTHX_ a,b,c,d,e,f) +# define doparseform(a) S_doparseform(aTHX_ a) +# define dopoptoeval(a) S_dopoptoeval(aTHX_ a) +# define dopoptogivenfor(a) S_dopoptogivenfor(aTHX_ a) +# define dopoptolabel(a,b,c) S_dopoptolabel(aTHX_ a,b,c) +# define dopoptoloop(a) S_dopoptoloop(aTHX_ a) +# define dopoptosub_at(a,b) S_dopoptosub_at(aTHX_ a,b) +# define dopoptowhen(a) S_dopoptowhen(aTHX_ a) +# define make_matcher(a) S_make_matcher(aTHX_ a) +# define matcher_matches_sv(a,b) S_matcher_matches_sv(aTHX_ a,b) +# define num_overflow S_num_overflow +# define path_is_searchable S_path_is_searchable +# define run_user_filter(a,b,c) S_run_user_filter(aTHX_ a,b,c) +# define rxres_free(a) S_rxres_free(aTHX_ a) +# define rxres_restore(a,b) S_rxres_restore(aTHX_ a,b) +# define save_lines(a,b) S_save_lines(aTHX_ a,b) +# if !defined(PERL_DISABLE_PMC) +# define doopen_pm(a) S_doopen_pm(aTHX_ a) +# endif +# endif /* defined(PERL_IN_PP_CTL_C) */ +# if defined(PERL_IN_PP_CTL_C) || defined(PERL_IN_UTIL_C) +# define invoke_exception_hook(a,b) Perl_invoke_exception_hook(aTHX_ a,b) +# endif +# if defined(PERL_IN_PP_HOT_C) +# define do_oddball(a,b) S_do_oddball(aTHX_ a,b) +# define opmethod_stash(a) S_opmethod_stash(aTHX_ a) +# define should_we_output_Debug_r(a) S_should_we_output_Debug_r(aTHX_ a) +# endif +# if defined(PERL_IN_PP_PACK_C) +# define div128(a,b) S_div128(aTHX_ a,b) +# define first_symbol S_first_symbol +# define get_num(a,b) S_get_num(aTHX_ a,b) +# define group_end(a,b,c) S_group_end(aTHX_ a,b,c) +# define is_an_int(a,b) S_is_an_int(aTHX_ a,b) +# define measure_struct(a) S_measure_struct(aTHX_ a) +# define mul128(a,b) S_mul128(aTHX_ a,b) +# define my_bytes_to_utf8 S_my_bytes_to_utf8 +# define need_utf8 S_need_utf8 +# define next_symbol(a) S_next_symbol(aTHX_ a) +# define pack_rec(a,b,c,d) S_pack_rec(aTHX_ a,b,c,d) +# define sv_exp_grow(a,b) S_sv_exp_grow(aTHX_ a,b) +# define unpack_rec(a,b,c,d,e) S_unpack_rec(aTHX_ a,b,c,d,e) +# endif /* defined(PERL_IN_PP_PACK_C) */ +# if defined(PERL_IN_PP_SORT_C) +# define amagic_cmp(a,b) S_amagic_cmp(aTHX_ a,b) +# define amagic_cmp_desc(a,b) S_amagic_cmp_desc(aTHX_ a,b) +# define amagic_i_ncmp(a,b) S_amagic_i_ncmp(aTHX_ a,b) +# define amagic_i_ncmp_desc(a,b) S_amagic_i_ncmp_desc(aTHX_ a,b) +# define amagic_ncmp(a,b) S_amagic_ncmp(aTHX_ a,b) +# define amagic_ncmp_desc(a,b) S_amagic_ncmp_desc(aTHX_ a,b) +# define cmp_desc(a,b) S_cmp_desc(aTHX_ a,b) +# define sortcv(a,b) S_sortcv(aTHX_ a,b) +# define sortcv_stacked(a,b) S_sortcv_stacked(aTHX_ a,b) +# define sortcv_xsub(a,b) S_sortcv_xsub(aTHX_ a,b) +# define sortsv_flags_impl(a,b,c,d) S_sortsv_flags_impl(aTHX_ a,b,c,d) +# define sv_i_ncmp(a,b) S_sv_i_ncmp(aTHX_ a,b) +# define sv_i_ncmp_desc(a,b) S_sv_i_ncmp_desc(aTHX_ a,b) +# define sv_ncmp(a,b) S_sv_ncmp(aTHX_ a,b) +# define sv_ncmp_desc(a,b) S_sv_ncmp_desc(aTHX_ a,b) +# if defined(USE_LOCALE_COLLATE) +# define amagic_cmp_locale(a,b) S_amagic_cmp_locale(aTHX_ a,b) +# define amagic_cmp_locale_desc(a,b) S_amagic_cmp_locale_desc(aTHX_ a,b) +# define cmp_locale_desc(a,b) S_cmp_locale_desc(aTHX_ a,b) +# endif +# endif /* defined(PERL_IN_PP_SORT_C) */ +# if defined(PERL_IN_PP_SYS_C) +# define doform(a,b,c) S_doform(aTHX_ a,b,c) +# define space_join_names_mortal(a) S_space_join_names_mortal(aTHX_ a) +# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR) +# define dooneliner(a,b) S_dooneliner(aTHX_ a,b) +# endif +# endif +# if defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD) +# define initialize_invlist_guts(a,b) S_initialize_invlist_guts(aTHX_ a,b) +# endif +# if defined(PERL_IN_SCOPE_C) +# define save_pushptri32ptr(a,b,c,d) S_save_pushptri32ptr(aTHX_ a,b,c,d) +# define save_scalar_at(a,b) S_save_scalar_at(aTHX_ a,b) +# endif +# if defined(PERL_IN_TOKE_C) +# define ao(a) S_ao(aTHX_ a) +# define check_uni() S_check_uni(aTHX) +# define checkcomma(a,b,c) S_checkcomma(aTHX_ a,b,c) +# define filter_gets(a,b) S_filter_gets(aTHX_ a,b) +# define find_in_my_stash(a,b) S_find_in_my_stash(aTHX_ a,b) +# define force_ident(a,b) S_force_ident(aTHX_ a,b) +# define force_ident_maybe_lex(a) S_force_ident_maybe_lex(aTHX_ a) +# define force_next(a) S_force_next(aTHX_ a) +# define force_strict_version(a) S_force_strict_version(aTHX_ a) +# define force_version(a,b) S_force_version(aTHX_ a,b) +# define force_word(a,b,c,d) S_force_word(aTHX_ a,b,c,d) +# define get_and_check_backslash_N_name_wrapper(a,b) S_get_and_check_backslash_N_name_wrapper(aTHX_ a,b) +# define incline(a,b) S_incline(aTHX_ a,b) +# define intuit_method(a,b,c) S_intuit_method(aTHX_ a,b,c) +# define intuit_more(a,b) S_intuit_more(aTHX_ a,b) +# define lop(a,b,c) S_lop(aTHX_ a,b,c) +# define missingterm(a,b) S_missingterm(aTHX_ a,b) +# define no_op(a,b) S_no_op(aTHX_ a,b) +# define parse_ident(a,b,c,d,e,f,g) S_parse_ident(aTHX_ a,b,c,d,e,f,g) +# define pending_ident() S_pending_ident(aTHX) +# define scan_const(a) S_scan_const(aTHX_ a) +# define scan_formline(a) S_scan_formline(aTHX_ a) +# define scan_heredoc(a) S_scan_heredoc(aTHX_ a) +# define scan_ident(a,b,c,d) S_scan_ident(aTHX_ a,b,c,d) +# define scan_inputsymbol(a) S_scan_inputsymbol(aTHX_ a) +# define scan_pat(a,b) S_scan_pat(aTHX_ a,b) +# define scan_subst(a) S_scan_subst(aTHX_ a) +# define scan_trans(a) S_scan_trans(aTHX_ a) +# define sublex_done() S_sublex_done(aTHX) +# define sublex_push() S_sublex_push(aTHX) +# define sublex_start() S_sublex_start(aTHX) +# define swallow_bom(a) S_swallow_bom(aTHX_ a) +# define tokenize_use(a,b) S_tokenize_use(aTHX_ a,b) +# define tokeq(a) S_tokeq(aTHX_ a) +# define update_debugger_info(a,b,c) S_update_debugger_info(aTHX_ a,b,c) +# define yywarn(a,b) S_yywarn(aTHX_ a,b) +# if defined(DEBUGGING) +# define printbuf(a,b) S_printbuf(aTHX_ a,b) +# define tokereport(a,b) S_tokereport(aTHX_ a,b) +# endif +# if defined(PERL_CR_FILTER) +# define cr_textfilter(a,b,c) S_cr_textfilter(aTHX_ a,b,c) +# define strip_return(a) S_strip_return(aTHX_ a) +# endif +# if !defined(PERL_NO_UTF16_FILTER) +# define add_utf16_textfilter(a,b) S_add_utf16_textfilter(aTHX_ a,b) +# define utf16_textfilter(a,b,c) S_utf16_textfilter(aTHX_ a,b,c) +# endif +# endif /* defined(PERL_IN_TOKE_C) */ +# if defined(PERL_IN_UNIVERSAL_C) +# define isa_lookup(a,b,c,d,e) S_isa_lookup(aTHX_ a,b,c,d,e) +# define sv_derived_from_svpvn(a,b,c,d,e) S_sv_derived_from_svpvn(aTHX_ a,b,c,d,e) +# endif +# if defined(PERL_IN_UTF8_C) +# define _to_utf8_case(a,b,c,d,e,f,g,h,i) S__to_utf8_case(aTHX_ a,b,c,d,e,f,g,h,i) +# define check_locale_boundary_crossing(a,b,c,d) S_check_locale_boundary_crossing(aTHX_ a,b,c,d) +# define does_utf8_overflow S_does_utf8_overflow +# define isFF_overlong S_isFF_overlong +# define is_utf8_common(a,b,c) S_is_utf8_common(aTHX_ a,b,c) +# define is_utf8_overlong S_is_utf8_overlong +# define new_msg_hv(a,b,c) S_new_msg_hv(aTHX_ a,b,c) +# define to_case_cp_list(a,b,c,d,e,f,g,h) S_to_case_cp_list(aTHX_ a,b,c,d,e,f,g,h) +# define to_lower_latin1 S_to_lower_latin1 +# define turkic_fc(a,b,c,d) S_turkic_fc(aTHX_ a,b,c,d) +# define turkic_lc(a,b,c,d) S_turkic_lc(aTHX_ a,b,c,d) +# define turkic_uc(a,b,c,d) S_turkic_uc(aTHX_ a,b,c,d) +# define unexpected_non_continuation_text(a,b,c,d) S_unexpected_non_continuation_text(aTHX_ a,b,c,d) +# if 0 +# define warn_on_first_deprecated_use(a,b,c,d,e,f) S_warn_on_first_deprecated_use(aTHX_ a,b,c,d,e,f) +# endif +# endif /* defined(PERL_IN_UTF8_C) */ +# if defined(PERL_IN_UTIL_C) +# define ckwarn_common(a) S_ckwarn_common(aTHX_ a) +# define mess_alloc() S_mess_alloc(aTHX) +# define ptr_hash S_ptr_hash +# define with_queued_errors(a) S_with_queued_errors(aTHX_ a) +# if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL) +# define mem_log_common S_mem_log_common +# endif +# if defined(PERL_USES_PL_PIDSTATUS) +# define pidgone(a,b) S_pidgone(aTHX_ a,b) +# endif +# endif /* defined(PERL_IN_UTIL_C) */ +# if defined(PERL_USE_3ARG_SIGHANDLER) +# define sighandler Perl_sighandler +# else +# define sighandler Perl_sighandler +# endif +# if defined(USE_C_BACKTRACE) +# define get_c_backtrace(a,b) Perl_get_c_backtrace(aTHX_ a,b) +# endif +# if defined(USE_ITHREADS) +# define mro_meta_dup(a,b) Perl_mro_meta_dup(aTHX_ a,b) +# define padlist_dup(a,b) Perl_padlist_dup(aTHX_ a,b) +# define padname_dup(a,b) Perl_padname_dup(aTHX_ a,b) +# define padnamelist_dup(a,b) Perl_padnamelist_dup(aTHX_ a,b) +# if !defined(PERL_IMPLICIT_SYS) +# define PerlEnv_putenv(a) S_PerlEnv_putenv(aTHX_ a) +# endif +# if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C) +# define op_relocate_sv(a,b) Perl_op_relocate_sv(aTHX_ a,b) +# endif +# endif /* defined(USE_ITHREADS) */ +# if defined(USE_LOCALE_COLLATE) +# define magic_freecollxfrm(a,b) Perl_magic_freecollxfrm(aTHX_ a,b) +# define magic_setcollxfrm(a,b) Perl_magic_setcollxfrm(aTHX_ a,b) +# endif +# if defined(USE_PERLIO) +# define PerlIO_restore_errno(a) Perl_PerlIO_restore_errno(aTHX_ a) +# define PerlIO_save_errno(a) Perl_PerlIO_save_errno(aTHX_ a) +# endif +# if defined(USE_QUADMATH) +# define quadmath_format_needed Perl_quadmath_format_needed +# define quadmath_format_valid Perl_quadmath_format_valid +# endif +# if defined(WIN32) +# define get_win32_message_utf8ness(a) Perl_get_win32_message_utf8ness(aTHX_ a) +# else +# define do_exec3(a,b,c) Perl_do_exec3(aTHX_ a,b,c) +# endif +# endif /* defined(PERL_CORE) */ +# if defined(PERL_CORE) || defined(PERL_EXT) +# define _byte_dump_string(a,b,c) Perl__byte_dump_string(aTHX_ a,b,c) +# define _inverse_folds(a,b,c) Perl__inverse_folds(aTHX_ a,b,c) +# define append_utf8_from_native_byte Perl_append_utf8_from_native_byte +# define av_reify(a) Perl_av_reify(aTHX_ a) +# define cntrl_to_mnemonic Perl_cntrl_to_mnemonic +# define current_re_engine() Perl_current_re_engine(aTHX) +# define cv_ckproto_len_flags(a,b,c,d,e) Perl_cv_ckproto_len_flags(aTHX_ a,b,c,d,e) +# define delimcpy_no_escape Perl_delimcpy_no_escape +# define do_uniprop_match Perl_do_uniprop_match +# define get_and_check_backslash_N_name(a,b,c,d) Perl_get_and_check_backslash_N_name(aTHX_ a,b,c,d) +# define get_deprecated_property_msg Perl_get_deprecated_property_msg +# define get_prop_definition(a) Perl_get_prop_definition(aTHX_ a) +# define get_prop_values Perl_get_prop_values +# define load_charnames(a,b,c,d) Perl_load_charnames(aTHX_ a,b,c,d) +# define mbtowc_(a,b,c) Perl_mbtowc_(aTHX_ a,b,c) +# define mg_find_mglob(a) Perl_mg_find_mglob(aTHX_ a) +# define multiconcat_stringify(a) Perl_multiconcat_stringify(aTHX_ a) +# define multideref_stringify(a,b) Perl_multideref_stringify(aTHX_ a,b) +# define my_strftime8_temp(a,b,c,d,e,f,g,h,i,j,k) Perl_my_strftime8_temp(aTHX_ a,b,c,d,e,f,g,h,i,j,k) +# define op_clear(a) Perl_op_clear(aTHX_ a) +# define qerror(a) Perl_qerror(aTHX_ a) +# define reg_named_buff(a,b,c,d) Perl_reg_named_buff(aTHX_ a,b,c,d) +# define reg_named_buff_iter(a,b,c) Perl_reg_named_buff_iter(aTHX_ a,b,c) +# define reg_numbered_buff_fetch(a,b,c) Perl_reg_numbered_buff_fetch(aTHX_ a,b,c) +# define reg_numbered_buff_fetch_flags(a,b,c,d) Perl_reg_numbered_buff_fetch_flags(aTHX_ a,b,c,d) +# define reg_numbered_buff_length(a,b,c) Perl_reg_numbered_buff_length(aTHX_ a,b,c) +# define reg_numbered_buff_store(a,b,c) Perl_reg_numbered_buff_store(aTHX_ a,b,c) +# define reg_qr_package(a) Perl_reg_qr_package(aTHX_ a) +# define reg_temp_copy(a,b) Perl_reg_temp_copy(aTHX_ a,b) +# define report_uninit(a) Perl_report_uninit(aTHX_ a) +# define scan_str(a,b,c,d,e) Perl_scan_str(aTHX_ a,b,c,d,e) +# define scan_word(a,b,c,d,e) Perl_scan_word(aTHX_ a,b,c,d,e) +# define scan_word6(a,b,c,d,e,f) Perl_scan_word6(aTHX_ a,b,c,d,e,f) +# define skipspace_flags(a,b) Perl_skipspace_flags(aTHX_ a,b) +# define sv_magicext_mglob(a) Perl_sv_magicext_mglob(aTHX_ a) +# define sv_only_taint_gmagic Perl_sv_only_taint_gmagic +# define utf16_to_utf8_base(a,b,c,d,e,f) Perl_utf16_to_utf8_base(aTHX_ a,b,c,d,e,f) +# define utf8_to_utf16_base(a,b,c,d,e,f) Perl_utf8_to_utf16_base(aTHX_ a,b,c,d,e,f) +# define validate_proto(a,b,c,d) Perl_validate_proto(aTHX_ a,b,c,d) +# define vivify_defelem(a) Perl_vivify_defelem(aTHX_ a) +# define yylex() Perl_yylex(aTHX) +# define isSCRIPT_RUN(a,b,c) Perl_isSCRIPT_RUN(aTHX_ a,b,c) +# define is_utf8_non_invariant_string Perl_is_utf8_non_invariant_string +# define sv_or_pv_pos_u2b(a,b,c,d) S_sv_or_pv_pos_u2b(aTHX_ a,b,c,d) +# define variant_under_utf8_count S_variant_under_utf8_count +# if !defined(HAS_MEMRCHR) +# define my_memrchr S_my_memrchr +# endif +# if defined(PERL_ANY_COW) +# define sv_setsv_cow(a,b) Perl_sv_setsv_cow(aTHX_ a,b) +# endif +# if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || \ + defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) || \ + defined(PERL_IN_UTF8_C) +# define _invlist_contains_cp S__invlist_contains_cp +# define _invlist_len S__invlist_len +# define _invlist_search Perl__invlist_search +# define get_invlist_offset_addr S_get_invlist_offset_addr +# define invlist_array S_invlist_array +# define is_invlist S_is_invlist +# endif +# if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_REGCOMP_ANY) +# define add_cp_to_invlist(a,b) S_add_cp_to_invlist(aTHX_ a,b) +# define invlist_extend(a,b) S_invlist_extend(aTHX_ a,b) +# define invlist_highest S_invlist_highest +# define invlist_set_len(a,b,c) S_invlist_set_len(aTHX_ a,b,c) +# endif +# if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C) +# define _add_range_to_invlist(a,b,c) Perl__add_range_to_invlist(aTHX_ a,b,c) +# define _invlist_intersection_maybe_complement_2nd(a,b,c,d) Perl__invlist_intersection_maybe_complement_2nd(aTHX_ a,b,c,d) +# define _invlist_invert(a) Perl__invlist_invert(aTHX_ a) +# define _invlist_union_maybe_complement_2nd(a,b,c,d) Perl__invlist_union_maybe_complement_2nd(aTHX_ a,b,c,d) +# define _new_invlist(a) Perl__new_invlist(aTHX_ a) +# define _setup_canned_invlist(a,b,c) Perl__setup_canned_invlist(aTHX_ a,b,c) +# endif +# if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \ + defined(PERL_IN_TOKE_C) +# define form_alien_digit_msg(a,b,c,d,e,f) Perl_form_alien_digit_msg(aTHX_ a,b,c,d,e,f) +# define grok_bslash_c(a,b,c,d) Perl_grok_bslash_c(aTHX_ a,b,c,d) +# define grok_bslash_o(a,b,c,d,e,f,g,h) Perl_grok_bslash_o(aTHX_ a,b,c,d,e,f,g,h) +# define grok_bslash_x(a,b,c,d,e,f,g,h) Perl_grok_bslash_x(aTHX_ a,b,c,d,e,f,g,h) +# endif +# if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \ + defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) +# define form_cp_too_large_msg(a,b,c,d) Perl_form_cp_too_large_msg(aTHX_ a,b,c,d) +# endif +# if defined(PERL_IN_DUMP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_REGCOMP_ANY) +# define _invlist_dump(a,b,c,d) Perl__invlist_dump(aTHX_ a,b,c,d) +# endif +# if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C) +# define gv_stashsvpvn_cached(a,b,c,d) Perl_gv_stashsvpvn_cached(aTHX_ a,b,c,d) +# endif +# if defined(PERL_IN_OP_C) || defined(PERL_IN_REGCOMP_ANY) +# define get_invlist_iter_addr S_get_invlist_iter_addr +# define invlist_iterfinish S_invlist_iterfinish +# define invlist_iterinit S_invlist_iterinit +# define invlist_iternext S_invlist_iternext +# endif +# if defined(PERL_IN_PERL_C) || defined(PERL_IN_REGCOMP_ANY) || \ + defined(PERL_IN_UTF8_C) +# define _invlistEQ(a,b,c) Perl__invlistEQ(aTHX_ a,b,c) +# define _new_invlist_C_array(a) Perl__new_invlist_C_array(aTHX_ a) +# endif +# if defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || \ + defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C) +# define get_regex_charset_name S_get_regex_charset_name +# endif +# if defined(PERL_IN_REGCOMP_ANY) +# define add_above_Latin1_folds(a,b,c) Perl_add_above_Latin1_folds(aTHX_ a,b,c) +# define construct_ahocorasick_from_trie(a,b,c) Perl_construct_ahocorasick_from_trie(aTHX_ a,b,c) +# define get_ANYOFHbbm_contents(a) Perl_get_ANYOFHbbm_contents(aTHX_ a) +# define get_ANYOFM_contents(a) Perl_get_ANYOFM_contents(aTHX_ a) +# define invlist_contents(a,b) S_invlist_contents(aTHX_ a,b) +# define invlist_highest_range_start S_invlist_highest_range_start +# define invlist_is_iterating S_invlist_is_iterating +# define invlist_lowest S_invlist_lowest +# define is_ssc_worth_it Perl_is_ssc_worth_it +# define join_exact(a,b,c,d,e,f,g) Perl_join_exact(aTHX_ a,b,c,d,e,f,g) +# define make_trie(a,b,c,d,e,f,g,h) Perl_make_trie(aTHX_ a,b,c,d,e,f,g,h) +# define populate_anyof_bitmap_from_invlist(a,b) Perl_populate_anyof_bitmap_from_invlist(aTHX_ a,b) +# define reg_add_data Perl_reg_add_data +# define scan_commit(a,b,c,d) Perl_scan_commit(aTHX_ a,b,c,d) +# define set_ANYOF_arg(a,b,c,d,e) Perl_set_ANYOF_arg(aTHX_ a,b,c,d,e) +# define ssc_finalize(a,b) Perl_ssc_finalize(aTHX_ a,b) +# define ssc_init(a,b) Perl_ssc_init(aTHX_ a,b) +# define study_chunk(a,b,c,d,e,f,g,h,i,j,k,l) Perl_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k,l) +# if defined(PERL_IN_REGCOMP_TRIE_C) && defined(DEBUGGING) +# define dump_trie(a,b,c,d) S_dump_trie(aTHX_ a,b,c,d) +# define dump_trie_interim_list(a,b,c,d,e) S_dump_trie_interim_list(aTHX_ a,b,c,d,e) +# define dump_trie_interim_table(a,b,c,d,e) S_dump_trie_interim_table(aTHX_ a,b,c,d,e) +# endif +# endif /* defined(PERL_IN_REGCOMP_ANY) */ +# if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_SV_C) +# define invlist_clone(a,b) Perl_invlist_clone(aTHX_ a,b) +# endif +# if defined(PERL_IN_REGCOMP_C) +# define add_multi_match(a,b,c) S_add_multi_match(aTHX_ a,b,c) +# define change_engine_size(a,b) S_change_engine_size(aTHX_ a,b) +# define compile_wildcard(a,b,c) S_compile_wildcard(aTHX_ a,b,c) +# define compute_EXACTish S_compute_EXACTish +# define edit_distance S_edit_distance +# define execute_wildcard(a,b,c,d,e,f,g) S_execute_wildcard(aTHX_ a,b,c,d,e,f,g) +# define find_first_differing_byte_pos S_find_first_differing_byte_pos +# define get_quantifier_value(a,b,c) S_get_quantifier_value(aTHX_ a,b,c) +# define grok_bslash_N(a,b,c,d,e,f,g) S_grok_bslash_N(aTHX_ a,b,c,d,e,f,g) +# define handle_named_backref(a,b,c,d) S_handle_named_backref(aTHX_ a,b,c,d) +# define handle_names_wildcard(a,b,c,d) S_handle_names_wildcard(aTHX_ a,b,c,d) +# define handle_possible_posix(a,b,c,d,e) S_handle_possible_posix(aTHX_ a,b,c,d,e) +# define handle_regex_sets(a,b,c,d) S_handle_regex_sets(aTHX_ a,b,c,d) +# define handle_user_defined_property(a,b,c,d,e,f,g,h,i,j) S_handle_user_defined_property(aTHX_ a,b,c,d,e,f,g,h,i,j) +# define nextchar(a) S_nextchar(aTHX_ a) +# define optimize_regclass(a,b,c,d,e,f,g,h,i,j) S_optimize_regclass(aTHX_ a,b,c,d,e,f,g,h,i,j) +# define output_posix_warnings(a,b) S_output_posix_warnings(aTHX_ a,b) +# define parse_lparen_question_flags(a) S_parse_lparen_question_flags(aTHX_ a) +# define parse_uniprop_string(a,b,c,d,e,f,g,h,i,j) S_parse_uniprop_string(aTHX_ a,b,c,d,e,f,g,h,i,j) +# define reg(a,b,c,d) S_reg(aTHX_ a,b,c,d) +# define reg1node(a,b,c) S_reg1node(aTHX_ a,b,c) +# define reg2node(a,b,c,d) S_reg2node(aTHX_ a,b,c,d) +# define reg_la_NOTHING(a,b,c) S_reg_la_NOTHING(aTHX_ a,b,c) +# define reg_la_OPFAIL(a,b,c) S_reg_la_OPFAIL(aTHX_ a,b,c) +# define reg_node(a,b) S_reg_node(aTHX_ a,b) +# define reg_scan_name(a,b) S_reg_scan_name(aTHX_ a,b) +# define reg_skipcomment S_reg_skipcomment +# define regatom(a,b,c) S_regatom(aTHX_ a,b,c) +# define regbranch(a,b,c,d) S_regbranch(aTHX_ a,b,c,d) +# define regclass(a,b,c,d,e,f,g,h,i) S_regclass(aTHX_ a,b,c,d,e,f,g,h,i) +# define regex_set_precedence S_regex_set_precedence +# define reginsert(a,b,c,d) S_reginsert(aTHX_ a,b,c,d) +# define regnode_guts(a,b) S_regnode_guts(aTHX_ a,b) +# define regpiece(a,b,c) S_regpiece(aTHX_ a,b,c) +# define regpnode(a,b,c) S_regpnode(aTHX_ a,b,c) +# define regtail(a,b,c,d) S_regtail(aTHX_ a,b,c,d) +# define set_regex_pv(a,b) S_set_regex_pv(aTHX_ a,b) +# define skip_to_be_ignored_text(a,b,c) S_skip_to_be_ignored_text(aTHX_ a,b,c) +# if defined(DEBUGGING) +# define regnode_guts_debug(a,b,c) S_regnode_guts_debug(aTHX_ a,b,c) +# define regtail_study(a,b,c,d) S_regtail_study(aTHX_ a,b,c,d) +# if defined(ENABLE_REGEX_SETS_DEBUGGING) +# define dump_regex_sets_structures(a,b,c,d) S_dump_regex_sets_structures(aTHX_ a,b,c,d) +# endif +# endif +# endif /* defined(PERL_IN_REGCOMP_C) */ +# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGCOMP_INVLIST_C) +# define populate_bitmap_from_invlist(a,b,c,d) Perl_populate_bitmap_from_invlist(aTHX_ a,b,c,d) +# define populate_invlist_from_bitmap(a,b,c,d) Perl_populate_invlist_from_bitmap(aTHX_ a,b,c,d) +# endif +# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \ + defined(PERL_IN_TOKE_C) +# define is_grapheme(a,b,c,d) Perl_is_grapheme(aTHX_ a,b,c,d) +# endif +# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \ + defined(PERL_IN_UTF8_C) +# define _to_fold_latin1 Perl__to_fold_latin1 +# endif +# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) +# define regcurly Perl_regcurly +# endif +# if defined(PERL_IN_REGCOMP_DEBUG_C) && defined(DEBUGGING) +# define put_charclass_bitmap_innards(a,b,c,d,e,f,g) S_put_charclass_bitmap_innards(aTHX_ a,b,c,d,e,f,g) +# define put_charclass_bitmap_innards_common(a,b,c,d,e,f) S_put_charclass_bitmap_innards_common(aTHX_ a,b,c,d,e,f) +# define put_charclass_bitmap_innards_invlist(a,b) S_put_charclass_bitmap_innards_invlist(aTHX_ a,b) +# define put_code_point(a,b) S_put_code_point(aTHX_ a,b) +# define put_range(a,b,c,d) S_put_range(aTHX_ a,b,c,d) +# define regdump_extflags(a,b) S_regdump_extflags(aTHX_ a,b) +# define regdump_intflags(a,b) S_regdump_intflags(aTHX_ a,b) +# endif +# if defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD) +# define _append_range_to_invlist(a,b,c) S__append_range_to_invlist(aTHX_ a,b,c) +# define _invlist_array_init S__invlist_array_init +# define get_invlist_previous_index_addr S_get_invlist_previous_index_addr +# define invlist_clear(a) S_invlist_clear(aTHX_ a) +# define invlist_max S_invlist_max +# define invlist_previous_index S_invlist_previous_index +# define invlist_replace_list_destroys_src(a,b) S_invlist_replace_list_destroys_src(aTHX_ a,b) +# define invlist_set_previous_index S_invlist_set_previous_index +# define invlist_trim S_invlist_trim +# endif /* defined(PERL_IN_REGCOMP_INVLIST_C) && + !defined(PERL_EXT_RE_BUILD) */ +# if defined(PERL_IN_REGCOMP_STUDY_C) +# define get_ANYOF_cp_list_for_ssc(a,b) S_get_ANYOF_cp_list_for_ssc(aTHX_ a,b) +# define make_exactf_invlist(a,b) S_make_exactf_invlist(aTHX_ a,b) +# define rck_elide_nothing(a) S_rck_elide_nothing(aTHX_ a) +# define ssc_add_range(a,b,c) S_ssc_add_range(aTHX_ a,b,c) +# define ssc_and(a,b,c) S_ssc_and(aTHX_ a,b,c) +# define ssc_anything(a) S_ssc_anything(aTHX_ a) +# define ssc_clear_locale S_ssc_clear_locale +# define ssc_cp_and(a,b) S_ssc_cp_and(aTHX_ a,b) +# define ssc_intersection(a,b,c) S_ssc_intersection(aTHX_ a,b,c) +# define ssc_is_anything S_ssc_is_anything +# define ssc_is_cp_posixl_init S_ssc_is_cp_posixl_init +# define ssc_or(a,b,c) S_ssc_or(aTHX_ a,b,c) +# define ssc_union(a,b,c) S_ssc_union(aTHX_ a,b,c) +# define unwind_scan_frames(a) S_unwind_scan_frames(aTHX_ a) +# endif /* defined(PERL_IN_REGCOMP_STUDY_C) */ +# if defined(PERL_IN_REGEXEC_C) +# define advance_one_LB(a,b,c) S_advance_one_LB(aTHX_ a,b,c) +# define advance_one_SB(a,b,c) S_advance_one_SB(aTHX_ a,b,c) +# define advance_one_WB(a,b,c,d) S_advance_one_WB(aTHX_ a,b,c,d) +# define backup_one_GCB(a,b,c) S_backup_one_GCB(aTHX_ a,b,c) +# define backup_one_LB(a,b,c) S_backup_one_LB(aTHX_ a,b,c) +# define backup_one_SB(a,b,c) S_backup_one_SB(aTHX_ a,b,c) +# define backup_one_WB(a,b,c,d) S_backup_one_WB(aTHX_ a,b,c,d) +# define capture_clear(a,b,c,d) S_capture_clear(aTHX_ a,b,c,d comma_aDEPTH) +# define find_byclass(a,b,c,d,e) S_find_byclass(aTHX_ a,b,c,d,e) +# define find_next_masked S_find_next_masked +# define find_span_end S_find_span_end +# define find_span_end_mask S_find_span_end_mask +# define foldEQ_latin1_s2_folded(a,b,c) S_foldEQ_latin1_s2_folded(aTHX_ a,b,c) +# define isFOO_lc(a,b) S_isFOO_lc(aTHX_ a,b) +# define isFOO_utf8_lc(a,b,c) S_isFOO_utf8_lc(aTHX_ a,b,c) +# define isGCB(a,b,c,d,e) S_isGCB(aTHX_ a,b,c,d,e) +# define isLB(a,b,c,d,e,f) S_isLB(aTHX_ a,b,c,d,e,f) +# define isSB(a,b,c,d,e,f) S_isSB(aTHX_ a,b,c,d,e,f) +# define isWB(a,b,c,d,e,f,g) S_isWB(aTHX_ a,b,c,d,e,f,g) +# define reg_check_named_buff_matched S_reg_check_named_buff_matched +# define regcp_restore(a,b,c) S_regcp_restore(aTHX_ a,b,c comma_aDEPTH) +# define regcppop(a,b) S_regcppop(aTHX_ a,b comma_aDEPTH) +# define regcppush(a,b,c) S_regcppush(aTHX_ a,b,c comma_aDEPTH) +# define reghop3 S_reghop3 +# define reghop4 S_reghop4 +# define reghopmaybe3 S_reghopmaybe3 +# define reginclass(a,b,c,d,e) S_reginclass(aTHX_ a,b,c,d,e) +# define regmatch(a,b,c) S_regmatch(aTHX_ a,b,c) +# define regrepeat(a,b,c,d,e,f) S_regrepeat(aTHX_ a,b,c,d,e,f comma_aDEPTH) +# define regtry(a,b) S_regtry(aTHX_ a,b) +# define to_byte_substr(a) S_to_byte_substr(aTHX_ a) +# define to_utf8_substr(a) S_to_utf8_substr(aTHX_ a) +# define unwind_paren(a,b,c) S_unwind_paren(aTHX_ a,b,c comma_aDEPTH) +# if defined(DEBUGGING) +# define debug_start_match(a,b,c,d,e) S_debug_start_match(aTHX_ a,b,c,d,e) +# define dump_exec_pos(a,b,c,d,e,f,g) S_dump_exec_pos(aTHX_ a,b,c,d,e,f,g) +# if !defined(MULTIPLICITY) || defined(PERL_CORE) +# define re_exec_indentf(a,...) Perl_re_exec_indentf(aTHX_ a,__VA_ARGS__) +# endif +# endif +# endif /* defined(PERL_IN_REGEXEC_C) */ +# endif /* defined(PERL_CORE) || defined(PERL_EXT) */ +# if defined(PERL_CORE) || defined(PERL_USE_VOLATILE_API) +# define finalize_optree(a) Perl_finalize_optree(aTHX_ a) +# define optimize_optree(a) Perl_optimize_optree(aTHX_ a) +# endif +# if !defined(PERL_IMPLICIT_SYS) +# define my_pclose(a) Perl_my_pclose(aTHX_ a) +# define my_popen(a,b) Perl_my_popen(aTHX_ a,b) +# endif +# if defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PAD_C) || defined(PERL_IN_PERLY_C) || \ + defined(PERL_IN_TOKE_C) +# define class_add_ADJUST(a,b) Perl_class_add_ADJUST(aTHX_ a,b) +# define class_add_field(a,b) Perl_class_add_field(aTHX_ a,b) +# define class_apply_attributes(a,b) Perl_class_apply_attributes(aTHX_ a,b) +# define class_apply_field_attributes(a,b) Perl_class_apply_field_attributes(aTHX_ a,b) +# define class_prepare_initfield_parse() Perl_class_prepare_initfield_parse(aTHX) +# define class_prepare_method_parse(a) Perl_class_prepare_method_parse(aTHX_ a) +# define class_seal_stash(a) Perl_class_seal_stash(aTHX_ a) +# define class_set_field_defop(a,b,c) Perl_class_set_field_defop(aTHX_ a,b,c) +# define class_setup_stash(a) Perl_class_setup_stash(aTHX_ a) +# define class_wrap_method_body(a) Perl_class_wrap_method_body(aTHX_ a) +# define croak_kw_unless_class(a) Perl_croak_kw_unless_class(aTHX_ a) +# endif /* defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C) || + defined(PERL_IN_PAD_C) || defined(PERL_IN_PERLY_C) || + defined(PERL_IN_TOKE_C) */ +# if defined(PERL_IN_REGEX_ENGINE) +# define check_regnode_after(a,b) Perl_check_regnode_after(aTHX_ a,b) +# define regnext(a) Perl_regnext(aTHX_ a) +# define regnode_after(a,b) Perl_regnode_after(aTHX_ a,b) +# if defined(DEBUGGING) +# if ( !defined(MULTIPLICITY) || defined(PERL_CORE) ) && \ + ( defined(PERL_CORE) || defined(PERL_EXT) ) +# define re_indentf(a,...) Perl_re_indentf(aTHX_ a,__VA_ARGS__) +# define re_printf(...) Perl_re_printf(aTHX_ __VA_ARGS__) +# endif +# if defined(PERL_CORE) || defined(PERL_EXT) +# define debug_peep(a,b,c,d,e) Perl_debug_peep(aTHX_ a,b,c,d,e) +# define debug_show_study_flags(a,b,c) Perl_debug_show_study_flags(aTHX_ a,b,c) +# define debug_studydata(a,b,c,d,e,f,g) Perl_debug_studydata(aTHX_ a,b,c,d,e,f,g) +# define dumpuntil(a,b,c,d,e,f,g,h) Perl_dumpuntil(aTHX_ a,b,c,d,e,f,g,h) +# define regprop(a,b,c,d,e) Perl_regprop(aTHX_ a,b,c,d,e) +# endif +# endif /* defined(DEBUGGING) */ +# if defined(PERL_EXT_RE_BUILD) +# if defined(PERL_CORE) || defined(PERL_EXT) +# define get_re_gclass_aux_data(a,b,c,d,e,f) Perl_get_re_gclass_aux_data(aTHX_ a,b,c,d,e,f) +# endif +# elif defined(PERL_CORE) || defined(PERL_EXT) +# define get_regclass_aux_data(a,b,c,d,e,f) Perl_get_regclass_aux_data(aTHX_ a,b,c,d,e,f) +# endif +# endif /* defined(PERL_IN_REGEX_ENGINE) */ +# if defined(PERL_IN_SV_C) +# define more_sv() Perl_more_sv(aTHX) +# if defined(PERL_CORE) +# define F0convert S_F0convert +# define anonymise_cv_maybe(a,b) S_anonymise_cv_maybe(aTHX_ a,b) +# define assert_uft8_cache_coherent(a,b,c,d) S_assert_uft8_cache_coherent(aTHX_ a,b,c,d) +# define curse(a,b) S_curse(aTHX_ a,b) +# define expect_number(a) S_expect_number(aTHX_ a) +# define find_array_subscript(a,b) S_find_array_subscript(aTHX_ a,b) +# define find_hash_subscript(a,b) S_find_hash_subscript(aTHX_ a,b) +# define find_uninit_var(a,b,c,d) S_find_uninit_var(aTHX_ a,b,c,d) +# define glob_2number(a) S_glob_2number(aTHX_ a) +# define glob_assign_glob(a,b,c) S_glob_assign_glob(aTHX_ a,b,c) +# define not_a_number(a) S_not_a_number(aTHX_ a) +# define not_incrementable(a) S_not_incrementable(aTHX_ a) +# define ptr_table_find S_ptr_table_find +# define sv_2iuv_common(a) S_sv_2iuv_common(aTHX_ a) +# define sv_add_arena(a,b,c) S_sv_add_arena(aTHX_ a,b,c) +# define sv_display(a,b,c) S_sv_display(aTHX_ a,b,c) +# define sv_pos_b2u_midway(a,b,c,d) S_sv_pos_b2u_midway(aTHX_ a,b,c,d) +# define sv_pos_u2b_cached(a,b,c,d,e,f,g) S_sv_pos_u2b_cached(aTHX_ a,b,c,d,e,f,g) +# define sv_pos_u2b_forwards S_sv_pos_u2b_forwards +# define sv_pos_u2b_midway S_sv_pos_u2b_midway +# define sv_unglob(a,b) S_sv_unglob(aTHX_ a,b) +# define uiv_2buf S_uiv_2buf +# define utf8_mg_len_cache_update(a,b,c) S_utf8_mg_len_cache_update(aTHX_ a,b,c) +# define utf8_mg_pos_cache_update(a,b,c,d,e) S_utf8_mg_pos_cache_update(aTHX_ a,b,c,d,e) +# define visit(a,b,c) S_visit(aTHX_ a,b,c) +# if defined(DEBUGGING) +# define del_sv(a) S_del_sv(aTHX_ a) +# endif +# if !defined(NV_PRESERVES_UV) +# if defined(DEBUGGING) +# define sv_2iuv_non_preserve(a,b) S_sv_2iuv_non_preserve(aTHX_ a,b) +# else +# define sv_2iuv_non_preserve(a) S_sv_2iuv_non_preserve(aTHX_ a) +# endif +# endif +# if defined(PERL_DEBUG_READONLY_COW) +# define sv_buf_to_rw(a) S_sv_buf_to_rw(aTHX_ a) +# endif +# if defined(USE_ITHREADS) +# define sv_dup_common(a,b) S_sv_dup_common(aTHX_ a,b) +# define sv_dup_hvaux(a,b,c) S_sv_dup_hvaux(aTHX_ a,b,c) +# define sv_dup_inc_multiple(a,b,c,d) S_sv_dup_inc_multiple(aTHX_ a,b,c,d) +# define unreferenced_to_tmp_stack(a) S_unreferenced_to_tmp_stack(aTHX_ a) +# endif +# endif /* defined(PERL_CORE) */ +# endif /* defined(PERL_IN_SV_C) */ +# if defined(PERL_MEM_LOG) +# define mem_log_alloc Perl_mem_log_alloc +# define mem_log_del_sv Perl_mem_log_del_sv +# define mem_log_free Perl_mem_log_free +# define mem_log_new_sv Perl_mem_log_new_sv +# define mem_log_realloc Perl_mem_log_realloc +# endif +# if !defined(PERL_NO_INLINE_FUNCTIONS) +# define cx_popblock(a) Perl_cx_popblock(aTHX_ a) +# define cx_popeval(a) Perl_cx_popeval(aTHX_ a) +# define cx_popformat(a) Perl_cx_popformat(aTHX_ a) +# define cx_popgiven(a) Perl_cx_popgiven(aTHX_ a) +# define cx_poploop(a) Perl_cx_poploop(aTHX_ a) +# define cx_popsub(a) Perl_cx_popsub(aTHX_ a) +# define cx_popsub_args(a) Perl_cx_popsub_args(aTHX_ a) +# define cx_popsub_common(a) Perl_cx_popsub_common(aTHX_ a) +# define cx_popwhen(a) Perl_cx_popwhen(aTHX_ a) +# define cx_pushblock(a,b,c,d) Perl_cx_pushblock(aTHX_ a,b,c,d) +# define cx_pusheval(a,b,c) Perl_cx_pusheval(aTHX_ a,b,c) +# define cx_pushformat(a,b,c,d) Perl_cx_pushformat(aTHX_ a,b,c,d) +# define cx_pushgiven(a,b) Perl_cx_pushgiven(aTHX_ a,b) +# define cx_pushloop_for(a,b,c) Perl_cx_pushloop_for(aTHX_ a,b,c) +# define cx_pushloop_plain(a) Perl_cx_pushloop_plain(aTHX_ a) +# define cx_pushsub(a,b,c,d) Perl_cx_pushsub(aTHX_ a,b,c,d) +# define cx_pushtry(a,b) Perl_cx_pushtry(aTHX_ a,b) +# define cx_pushwhen(a) Perl_cx_pushwhen(aTHX_ a) +# define cx_topblock(a) Perl_cx_topblock(aTHX_ a) +# define gimme_V() Perl_gimme_V(aTHX) +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +# if defined(PERL_USE_3ARG_SIGHANDLER) +# define csighandler Perl_csighandler +# else +# define csighandler Perl_csighandler +# endif +# if defined(U64TYPE) +# define lsbit_pos64 Perl_lsbit_pos64 +# define msbit_pos64 Perl_msbit_pos64 +# define single_1bit_pos64 Perl_single_1bit_pos64 +# endif +# if defined(UNLINK_ALL_VERSIONS) +# define unlnk(a) Perl_unlnk(aTHX_ a) +# endif +# if defined(USE_C_BACKTRACE) +# define dump_c_backtrace(a,b,c) Perl_dump_c_backtrace(aTHX_ a,b,c) +# define get_c_backtrace_dump(a,b) Perl_get_c_backtrace_dump(aTHX_ a,b) +# endif +# if defined(USE_ITHREADS) +# define alloccopstash(a) Perl_alloccopstash(aTHX_ a) +# define any_dup(a,b) Perl_any_dup(aTHX_ a,b) +# define cop_file_avn(a) Perl_cop_file_avn(aTHX_ a) +# define cx_dup(a,b,c,d) Perl_cx_dup(aTHX_ a,b,c,d) +# define dirp_dup(a,b) Perl_dirp_dup(aTHX_ a,b) +# define fp_dup(a,b,c) Perl_fp_dup(aTHX_ a,b,c) +# define gp_dup(a,b) Perl_gp_dup(aTHX_ a,b) +# define he_dup(a,b,c) Perl_he_dup(aTHX_ a,b,c) +# define hek_dup(a,b) Perl_hek_dup(aTHX_ a,b) +# define mg_dup(a,b) Perl_mg_dup(aTHX_ a,b) +# define newPADOP(a,b,c) Perl_newPADOP(aTHX_ a,b,c) +# define parser_dup(a,b) Perl_parser_dup(aTHX_ a,b) +# define re_dup_guts(a,b,c) Perl_re_dup_guts(aTHX_ a,b,c) +# define regdupe_internal(a,b) Perl_regdupe_internal(aTHX_ a,b) +# define rvpv_dup(a,b,c) Perl_rvpv_dup(aTHX_ a,b,c) +# define si_dup(a,b) Perl_si_dup(aTHX_ a,b) +# define ss_dup(a,b) Perl_ss_dup(aTHX_ a,b) +# define sv_dup(a,b) Perl_sv_dup(aTHX_ a,b) +# define sv_dup_inc(a,b) Perl_sv_dup_inc(aTHX_ a,b) +# endif /* defined(USE_ITHREADS) */ +# if defined(USE_LOCALE_COLLATE) +# define sv_collxfrm_flags(a,b,c) Perl_sv_collxfrm_flags(aTHX_ a,b,c) +# if ( defined(PERL_CORE) || defined(PERL_EXT) ) && \ + ( defined(PERL_IN_LOCALE_C) || defined(PERL_IN_MATHOMS_C) || \ + defined(PERL_IN_SV_C) ) +# define mem_collxfrm_(a,b,c,d) Perl_mem_collxfrm_(aTHX_ a,b,c,d) +# endif +# endif +# if defined(USE_PERLIO) +# define PerlIO_clearerr(a) Perl_PerlIO_clearerr(aTHX_ a) +# define PerlIO_close(a) Perl_PerlIO_close(aTHX_ a) +# define PerlIO_eof(a) Perl_PerlIO_eof(aTHX_ a) +# define PerlIO_error(a) Perl_PerlIO_error(aTHX_ a) +# define PerlIO_fileno(a) Perl_PerlIO_fileno(aTHX_ a) +# define PerlIO_fill(a) Perl_PerlIO_fill(aTHX_ a) +# define PerlIO_flush(a) Perl_PerlIO_flush(aTHX_ a) +# define PerlIO_get_base(a) Perl_PerlIO_get_base(aTHX_ a) +# define PerlIO_get_bufsiz(a) Perl_PerlIO_get_bufsiz(aTHX_ a) +# define PerlIO_get_cnt(a) Perl_PerlIO_get_cnt(aTHX_ a) +# define PerlIO_get_ptr(a) Perl_PerlIO_get_ptr(aTHX_ a) +# define PerlIO_read(a,b,c) Perl_PerlIO_read(aTHX_ a,b,c) +# define PerlIO_seek(a,b,c) Perl_PerlIO_seek(aTHX_ a,b,c) +# define PerlIO_set_cnt(a,b) Perl_PerlIO_set_cnt(aTHX_ a,b) +# define PerlIO_set_ptrcnt(a,b,c) Perl_PerlIO_set_ptrcnt(aTHX_ a,b,c) +# define PerlIO_setlinebuf(a) Perl_PerlIO_setlinebuf(aTHX_ a) +# define PerlIO_stderr() Perl_PerlIO_stderr(aTHX) +# define PerlIO_stdin() Perl_PerlIO_stdin(aTHX) +# define PerlIO_stdout() Perl_PerlIO_stdout(aTHX) +# define PerlIO_tell(a) Perl_PerlIO_tell(aTHX_ a) +# define PerlIO_unread(a,b,c) Perl_PerlIO_unread(aTHX_ a,b,c) +# define PerlIO_write(a,b,c) Perl_PerlIO_write(aTHX_ a,b,c) +# endif /* defined(USE_PERLIO) */ +# if defined(VMS) || defined(WIN32) +# define do_aspawn(a,b,c) Perl_do_aspawn(aTHX_ a,b,c) +# define do_spawn(a) Perl_do_spawn(aTHX_ a) +# define do_spawn_nowait(a) Perl_do_spawn_nowait(aTHX_ a) +# endif +# if defined(WIN32) +# define get_context Perl_get_context +# else +# define get_context Perl_get_context +# endif +#endif /* !defined(PERL_NO_SHORT_NAMES) */ -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/embedvar.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/embedvar.h,v diff -u -p -a -u -p -r1.7 embedvar.h --- gnu/usr.bin/perl/embedvar.h 15 Feb 2023 01:36:13 -0000 1.7 +++ gnu/usr.bin/perl/embedvar.h 21 Feb 2024 15:47:02 -0000 @@ -1,358 +1,371 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * embedvar.h * * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - * 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall and others + * 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, + * 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 + * by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! - * This file is built by regen/embed.pl from data in embed.fnc, - * regen/embed.pl, regen/opcodes, intrpvar.h and perlvars.h. + * This file is built by regen/embed.pl from embed.fnc, intrpvar.h, + * perlvars.h, regen/opcodes, regen/embed.pl, regen/embed_lib.pl and + * regen/HeaderParser.pm. * Any changes made here will be lost! * * Edit those files and run 'make regen_headers' to effect changes. */ #if defined(MULTIPLICITY) -# define vTHX aTHX -#define PL_AboveLatin1 (vTHX->IAboveLatin1) -#define PL_Assigned_invlist (vTHX->IAssigned_invlist) -#define PL_CCC_non0_non230 (vTHX->ICCC_non0_non230) -#define PL_DBcontrol (vTHX->IDBcontrol) -#define PL_DBcv (vTHX->IDBcv) -#define PL_DBgv (vTHX->IDBgv) -#define PL_DBline (vTHX->IDBline) -#define PL_DBsignal (vTHX->IDBsignal) -#define PL_DBsingle (vTHX->IDBsingle) -#define PL_DBsub (vTHX->IDBsub) -#define PL_DBtrace (vTHX->IDBtrace) -#define PL_Dir (vTHX->IDir) -#define PL_Env (vTHX->IEnv) -#define PL_GCB_invlist (vTHX->IGCB_invlist) -#define PL_HasMultiCharFold (vTHX->IHasMultiCharFold) -#define PL_InBitmap (vTHX->IInBitmap) -#define PL_InMultiCharFold (vTHX->IInMultiCharFold) -#define PL_LB_invlist (vTHX->ILB_invlist) -#define PL_LIO (vTHX->ILIO) -#define PL_Latin1 (vTHX->ILatin1) -#define PL_Mem (vTHX->IMem) -#define PL_MemParse (vTHX->IMemParse) -#define PL_MemShared (vTHX->IMemShared) -#define PL_Posix_ptrs (vTHX->IPosix_ptrs) -#define PL_Private_Use (vTHX->IPrivate_Use) -#define PL_Proc (vTHX->IProc) -#define PL_SB_invlist (vTHX->ISB_invlist) -#define PL_SCX_invlist (vTHX->ISCX_invlist) -#define PL_Sock (vTHX->ISock) -#define PL_StdIO (vTHX->IStdIO) -#define PL_Sv (vTHX->ISv) -#define PL_TR_SPECIAL_HANDLING_UTF8 (vTHX->ITR_SPECIAL_HANDLING_UTF8) -#define PL_UpperLatin1 (vTHX->IUpperLatin1) -#define PL_WB_invlist (vTHX->IWB_invlist) -#define PL_XPosix_ptrs (vTHX->IXPosix_ptrs) -#define PL_Xpv (vTHX->IXpv) -#define PL_an (vTHX->Ian) -#define PL_argvgv (vTHX->Iargvgv) -#define PL_argvout_stack (vTHX->Iargvout_stack) -#define PL_argvoutgv (vTHX->Iargvoutgv) -#define PL_basetime (vTHX->Ibasetime) -#define PL_beginav (vTHX->Ibeginav) -#define PL_beginav_save (vTHX->Ibeginav_save) -#define PL_blockhooks (vTHX->Iblockhooks) -#define PL_body_arenas (vTHX->Ibody_arenas) -#define PL_body_roots (vTHX->Ibody_roots) -#define PL_bodytarget (vTHX->Ibodytarget) -#define PL_breakable_sub_gen (vTHX->Ibreakable_sub_gen) -#define PL_checkav (vTHX->Icheckav) -#define PL_checkav_save (vTHX->Icheckav_save) -#define PL_chopset (vTHX->Ichopset) -#define PL_clocktick (vTHX->Iclocktick) -#define PL_collation_ix (vTHX->Icollation_ix) -#define PL_collation_name (vTHX->Icollation_name) -#define PL_collation_standard (vTHX->Icollation_standard) -#define PL_collxfrm_base (vTHX->Icollxfrm_base) -#define PL_collxfrm_mult (vTHX->Icollxfrm_mult) -#define PL_colors (vTHX->Icolors) -#define PL_colorset (vTHX->Icolorset) -#define PL_compcv (vTHX->Icompcv) -#define PL_compiling (vTHX->Icompiling) -#define PL_comppad (vTHX->Icomppad) -#define PL_comppad_name (vTHX->Icomppad_name) -#define PL_comppad_name_fill (vTHX->Icomppad_name_fill) -#define PL_comppad_name_floor (vTHX->Icomppad_name_floor) -#define PL_constpadix (vTHX->Iconstpadix) -#define PL_cop_seqmax (vTHX->Icop_seqmax) -#define PL_curcop (vTHX->Icurcop) -#define PL_curcopdb (vTHX->Icurcopdb) -#define PL_curlocales (vTHX->Icurlocales) -#define PL_curpad (vTHX->Icurpad) -#define PL_curpm (vTHX->Icurpm) -#define PL_curpm_under (vTHX->Icurpm_under) -#define PL_curstack (vTHX->Icurstack) -#define PL_curstackinfo (vTHX->Icurstackinfo) -#define PL_curstash (vTHX->Icurstash) -#define PL_curstname (vTHX->Icurstname) -#define PL_custom_op_descs (vTHX->Icustom_op_descs) -#define PL_custom_op_names (vTHX->Icustom_op_names) -#define PL_custom_ops (vTHX->Icustom_ops) -#define PL_cv_has_eval (vTHX->Icv_has_eval) -#define PL_dbargs (vTHX->Idbargs) -#define PL_debstash (vTHX->Idebstash) -#define PL_debug (vTHX->Idebug) -#define PL_debug_pad (vTHX->Idebug_pad) -#define PL_def_layerlist (vTHX->Idef_layerlist) -#define PL_defgv (vTHX->Idefgv) -#define PL_defoutgv (vTHX->Idefoutgv) -#define PL_defstash (vTHX->Idefstash) -#define PL_delaymagic (vTHX->Idelaymagic) -#define PL_delaymagic_egid (vTHX->Idelaymagic_egid) -#define PL_delaymagic_euid (vTHX->Idelaymagic_euid) -#define PL_delaymagic_gid (vTHX->Idelaymagic_gid) -#define PL_delaymagic_uid (vTHX->Idelaymagic_uid) -#define PL_destroyhook (vTHX->Idestroyhook) -#define PL_diehook (vTHX->Idiehook) -#define PL_doswitches (vTHX->Idoswitches) -#define PL_dowarn (vTHX->Idowarn) -#define PL_dump_re_max_len (vTHX->Idump_re_max_len) -#define PL_dumper_fd (vTHX->Idumper_fd) -#define PL_dumpindent (vTHX->Idumpindent) -#define PL_e_script (vTHX->Ie_script) -#define PL_efloatbuf (vTHX->Iefloatbuf) -#define PL_efloatsize (vTHX->Iefloatsize) -#define PL_endav (vTHX->Iendav) -#define PL_envgv (vTHX->Ienvgv) -#define PL_errgv (vTHX->Ierrgv) -#define PL_errors (vTHX->Ierrors) -#define PL_eval_root (vTHX->Ieval_root) -#define PL_eval_start (vTHX->Ieval_start) -#define PL_evalseq (vTHX->Ievalseq) -#define PL_exit_flags (vTHX->Iexit_flags) -#define PL_exitlist (vTHX->Iexitlist) -#define PL_exitlistlen (vTHX->Iexitlistlen) -#define PL_fdpid (vTHX->Ifdpid) -#define PL_filemode (vTHX->Ifilemode) -#define PL_firstgv (vTHX->Ifirstgv) -#define PL_forkprocess (vTHX->Iforkprocess) -#define PL_formtarget (vTHX->Iformtarget) -#define PL_generation (vTHX->Igeneration) -#define PL_gensym (vTHX->Igensym) -#define PL_globalstash (vTHX->Iglobalstash) -#define PL_globhook (vTHX->Iglobhook) -#define PL_hash_rand_bits (vTHX->Ihash_rand_bits) -#define PL_hash_rand_bits_enabled (vTHX->Ihash_rand_bits_enabled) -#define PL_hintgv (vTHX->Ihintgv) -#define PL_hv_fetch_ent_mh (vTHX->Ihv_fetch_ent_mh) -#define PL_in_clean_all (vTHX->Iin_clean_all) -#define PL_in_clean_objs (vTHX->Iin_clean_objs) -#define PL_in_eval (vTHX->Iin_eval) -#define PL_in_load_module (vTHX->Iin_load_module) -#define PL_in_some_fold (vTHX->Iin_some_fold) -#define PL_in_utf8_COLLATE_locale (vTHX->Iin_utf8_COLLATE_locale) -#define PL_in_utf8_CTYPE_locale (vTHX->Iin_utf8_CTYPE_locale) -#define PL_in_utf8_turkic_locale (vTHX->Iin_utf8_turkic_locale) -#define PL_incgv (vTHX->Iincgv) -#define PL_initav (vTHX->Iinitav) -#define PL_inplace (vTHX->Iinplace) -#define PL_internal_random_state (vTHX->Iinternal_random_state) -#define PL_isarev (vTHX->Iisarev) -#define PL_known_layers (vTHX->Iknown_layers) -#define PL_langinfo_buf (vTHX->Ilanginfo_buf) -#define PL_langinfo_bufsize (vTHX->Ilanginfo_bufsize) -#define PL_last_in_gv (vTHX->Ilast_in_gv) -#define PL_lastfd (vTHX->Ilastfd) -#define PL_lastgotoprobe (vTHX->Ilastgotoprobe) -#define PL_laststatval (vTHX->Ilaststatval) -#define PL_laststype (vTHX->Ilaststype) -#define PL_lc_numeric_mutex_depth (vTHX->Ilc_numeric_mutex_depth) -#define PL_locale_utf8ness (vTHX->Ilocale_utf8ness) -#define PL_localizing (vTHX->Ilocalizing) -#define PL_localpatches (vTHX->Ilocalpatches) -#define PL_lockhook (vTHX->Ilockhook) -#define PL_main_cv (vTHX->Imain_cv) -#define PL_main_root (vTHX->Imain_root) -#define PL_main_start (vTHX->Imain_start) -#define PL_mainstack (vTHX->Imainstack) -#define PL_markstack (vTHX->Imarkstack) -#define PL_markstack_max (vTHX->Imarkstack_max) -#define PL_markstack_ptr (vTHX->Imarkstack_ptr) -#define PL_max_intro_pending (vTHX->Imax_intro_pending) -#define PL_maxsysfd (vTHX->Imaxsysfd) -#define PL_mbrlen_ps (vTHX->Imbrlen_ps) -#define PL_mbrtowc_ps (vTHX->Imbrtowc_ps) -#define PL_mem_log (vTHX->Imem_log) -#define PL_memory_debug_header (vTHX->Imemory_debug_header) -#define PL_mess_sv (vTHX->Imess_sv) -#define PL_min_intro_pending (vTHX->Imin_intro_pending) -#define PL_minus_E (vTHX->Iminus_E) -#define PL_minus_F (vTHX->Iminus_F) -#define PL_minus_a (vTHX->Iminus_a) -#define PL_minus_c (vTHX->Iminus_c) -#define PL_minus_l (vTHX->Iminus_l) -#define PL_minus_n (vTHX->Iminus_n) -#define PL_minus_p (vTHX->Iminus_p) -#define PL_modcount (vTHX->Imodcount) -#define PL_modglobal (vTHX->Imodglobal) -#define PL_multideref_pc (vTHX->Imultideref_pc) -#define PL_my_cxt_list (vTHX->Imy_cxt_list) -#define PL_my_cxt_size (vTHX->Imy_cxt_size) -#define PL_na (vTHX->Ina) -#define PL_nomemok (vTHX->Inomemok) -#define PL_numeric_name (vTHX->Inumeric_name) -#define PL_numeric_radix_sv (vTHX->Inumeric_radix_sv) -#define PL_numeric_standard (vTHX->Inumeric_standard) -#define PL_numeric_underlying (vTHX->Inumeric_underlying) -#define PL_numeric_underlying_is_standard (vTHX->Inumeric_underlying_is_standard) -#define PL_ofsgv (vTHX->Iofsgv) -#define PL_oldname (vTHX->Ioldname) -#define PL_op (vTHX->Iop) -#define PL_op_exec_cnt (vTHX->Iop_exec_cnt) -#define PL_op_mask (vTHX->Iop_mask) -#define PL_opfreehook (vTHX->Iopfreehook) -#define PL_origalen (vTHX->Iorigalen) -#define PL_origargc (vTHX->Iorigargc) -#define PL_origargv (vTHX->Iorigargv) -#define PL_origenviron (vTHX->Iorigenviron) -#define PL_origfilename (vTHX->Iorigfilename) -#define PL_ors_sv (vTHX->Iors_sv) -#define PL_osname (vTHX->Iosname) -#define PL_pad_reset_pending (vTHX->Ipad_reset_pending) -#define PL_padix (vTHX->Ipadix) -#define PL_padix_floor (vTHX->Ipadix_floor) -#define PL_padlist_generation (vTHX->Ipadlist_generation) -#define PL_padname_const (vTHX->Ipadname_const) -#define PL_padname_undef (vTHX->Ipadname_undef) -#define PL_parser (vTHX->Iparser) -#define PL_patchlevel (vTHX->Ipatchlevel) -#define PL_peepp (vTHX->Ipeepp) -#define PL_perl_destruct_level (vTHX->Iperl_destruct_level) -#define PL_perldb (vTHX->Iperldb) -#define PL_perlio (vTHX->Iperlio) -#define PL_phase (vTHX->Iphase) -#define PL_pidstatus (vTHX->Ipidstatus) -#define PL_preambleav (vTHX->Ipreambleav) -#define PL_prevailing_version (vTHX->Iprevailing_version) -#define PL_profiledata (vTHX->Iprofiledata) -#define PL_psig_name (vTHX->Ipsig_name) -#define PL_psig_pend (vTHX->Ipsig_pend) -#define PL_psig_ptr (vTHX->Ipsig_ptr) -#define PL_ptr_table (vTHX->Iptr_table) -#define PL_random_state (vTHX->Irandom_state) -#define PL_reentrant_buffer (vTHX->Ireentrant_buffer) -#define PL_reentrant_retint (vTHX->Ireentrant_retint) -#define PL_reg_curpm (vTHX->Ireg_curpm) -#define PL_regex_pad (vTHX->Iregex_pad) -#define PL_regex_padav (vTHX->Iregex_padav) -#define PL_registered_mros (vTHX->Iregistered_mros) -#define PL_regmatch_slab (vTHX->Iregmatch_slab) -#define PL_regmatch_state (vTHX->Iregmatch_state) -#define PL_replgv (vTHX->Ireplgv) -#define PL_restartjmpenv (vTHX->Irestartjmpenv) -#define PL_restartop (vTHX->Irestartop) -#define PL_rpeepp (vTHX->Irpeepp) -#define PL_rs (vTHX->Irs) -#define PL_runops (vTHX->Irunops) -#define PL_savebegin (vTHX->Isavebegin) -#define PL_savestack (vTHX->Isavestack) -#define PL_savestack_ix (vTHX->Isavestack_ix) -#define PL_savestack_max (vTHX->Isavestack_max) -#ifndef PL_sawampersand -#define PL_sawampersand (vTHX->Isawampersand) -#endif -#define PL_scopestack (vTHX->Iscopestack) -#define PL_scopestack_ix (vTHX->Iscopestack_ix) -#define PL_scopestack_max (vTHX->Iscopestack_max) -#define PL_scopestack_name (vTHX->Iscopestack_name) -#define PL_secondgv (vTHX->Isecondgv) -#define PL_setlocale_buf (vTHX->Isetlocale_buf) -#define PL_setlocale_bufsize (vTHX->Isetlocale_bufsize) -#define PL_sharehook (vTHX->Isharehook) -#define PL_sig_pending (vTHX->Isig_pending) -#define PL_sighandler1p (vTHX->Isighandler1p) -#define PL_sighandler3p (vTHX->Isighandler3p) -#define PL_sighandlerp (vTHX->Isighandlerp) -#define PL_signalhook (vTHX->Isignalhook) -#define PL_signals (vTHX->Isignals) -#define PL_sortcop (vTHX->Isortcop) -#define PL_sortstash (vTHX->Isortstash) -#define PL_splitstr (vTHX->Isplitstr) -#define PL_srand_called (vTHX->Isrand_called) -#define PL_stack_base (vTHX->Istack_base) -#define PL_stack_max (vTHX->Istack_max) -#define PL_stack_sp (vTHX->Istack_sp) -#define PL_start_env (vTHX->Istart_env) -#define PL_stashcache (vTHX->Istashcache) -#define PL_stashpad (vTHX->Istashpad) -#define PL_stashpadix (vTHX->Istashpadix) -#define PL_stashpadmax (vTHX->Istashpadmax) -#define PL_statcache (vTHX->Istatcache) -#define PL_statgv (vTHX->Istatgv) -#define PL_statname (vTHX->Istatname) -#define PL_statusvalue (vTHX->Istatusvalue) -#define PL_statusvalue_posix (vTHX->Istatusvalue_posix) -#define PL_statusvalue_vms (vTHX->Istatusvalue_vms) -#define PL_stderrgv (vTHX->Istderrgv) -#define PL_stdingv (vTHX->Istdingv) -#define PL_strtab (vTHX->Istrtab) -#define PL_strxfrm_NUL_replacement (vTHX->Istrxfrm_NUL_replacement) -#define PL_strxfrm_is_behaved (vTHX->Istrxfrm_is_behaved) -#define PL_strxfrm_max_cp (vTHX->Istrxfrm_max_cp) -#define PL_sub_generation (vTHX->Isub_generation) -#define PL_subline (vTHX->Isubline) -#define PL_subname (vTHX->Isubname) -#define PL_sv_arenaroot (vTHX->Isv_arenaroot) -#define PL_sv_consts (vTHX->Isv_consts) -#define PL_sv_count (vTHX->Isv_count) -#define PL_sv_immortals (vTHX->Isv_immortals) -#define PL_sv_no (vTHX->Isv_no) -#define PL_sv_root (vTHX->Isv_root) -#define PL_sv_serial (vTHX->Isv_serial) -#define PL_sv_undef (vTHX->Isv_undef) -#define PL_sv_yes (vTHX->Isv_yes) -#define PL_sv_zero (vTHX->Isv_zero) -#define PL_sys_intern (vTHX->Isys_intern) -#define PL_taint_warn (vTHX->Itaint_warn) -#define PL_tainted (vTHX->Itainted) -#define PL_tainting (vTHX->Itainting) -#define PL_threadhook (vTHX->Ithreadhook) -#define PL_tmps_floor (vTHX->Itmps_floor) -#define PL_tmps_ix (vTHX->Itmps_ix) -#define PL_tmps_max (vTHX->Itmps_max) -#define PL_tmps_stack (vTHX->Itmps_stack) -#define PL_top_env (vTHX->Itop_env) -#define PL_toptarget (vTHX->Itoptarget) -#define PL_underlying_numeric_obj (vTHX->Iunderlying_numeric_obj) -#define PL_unicode (vTHX->Iunicode) -#define PL_unitcheckav (vTHX->Iunitcheckav) -#define PL_unitcheckav_save (vTHX->Iunitcheckav_save) -#define PL_unlockhook (vTHX->Iunlockhook) -#define PL_unsafe (vTHX->Iunsafe) -#define PL_utf8_charname_begin (vTHX->Iutf8_charname_begin) -#define PL_utf8_charname_continue (vTHX->Iutf8_charname_continue) -#define PL_utf8_foldclosures (vTHX->Iutf8_foldclosures) -#define PL_utf8_idcont (vTHX->Iutf8_idcont) -#define PL_utf8_idstart (vTHX->Iutf8_idstart) -#define PL_utf8_mark (vTHX->Iutf8_mark) -#define PL_utf8_perl_idcont (vTHX->Iutf8_perl_idcont) -#define PL_utf8_perl_idstart (vTHX->Iutf8_perl_idstart) -#define PL_utf8_tofold (vTHX->Iutf8_tofold) -#define PL_utf8_tolower (vTHX->Iutf8_tolower) -#define PL_utf8_tosimplefold (vTHX->Iutf8_tosimplefold) -#define PL_utf8_totitle (vTHX->Iutf8_totitle) -#define PL_utf8_toupper (vTHX->Iutf8_toupper) -#define PL_utf8_xidcont (vTHX->Iutf8_xidcont) -#define PL_utf8_xidstart (vTHX->Iutf8_xidstart) -#define PL_utf8cache (vTHX->Iutf8cache) -#define PL_utf8locale (vTHX->Iutf8locale) -#define PL_warn_locale (vTHX->Iwarn_locale) -#define PL_warnhook (vTHX->Iwarnhook) -#define PL_watchaddr (vTHX->Iwatchaddr) -#define PL_watchok (vTHX->Iwatchok) -#define PL_wcrtomb_ps (vTHX->Iwcrtomb_ps) -#define PL_xsubfilename (vTHX->Ixsubfilename) +# define vTHX aTHX +# define PL_AboveLatin1 (vTHX->IAboveLatin1) +# define PL_an (vTHX->Ian) +# define PL_argvgv (vTHX->Iargvgv) +# define PL_argvout_stack (vTHX->Iargvout_stack) +# define PL_argvoutgv (vTHX->Iargvoutgv) +# define PL_Assigned_invlist (vTHX->IAssigned_invlist) +# define PL_basetime (vTHX->Ibasetime) +# define PL_beginav (vTHX->Ibeginav) +# define PL_beginav_save (vTHX->Ibeginav_save) +# define PL_blockhooks (vTHX->Iblockhooks) +# define PL_body_arenas (vTHX->Ibody_arenas) +# define PL_body_roots (vTHX->Ibody_roots) +# define PL_bodytarget (vTHX->Ibodytarget) +# define PL_breakable_sub_gen (vTHX->Ibreakable_sub_gen) +# define PL_CCC_non0_non230 (vTHX->ICCC_non0_non230) +# define PL_checkav (vTHX->Icheckav) +# define PL_checkav_save (vTHX->Icheckav_save) +# define PL_chopset (vTHX->Ichopset) +# define PL_clocktick (vTHX->Iclocktick) +# define PL_collation_ix (vTHX->Icollation_ix) +# define PL_collation_name (vTHX->Icollation_name) +# define PL_collation_standard (vTHX->Icollation_standard) +# define PL_collxfrm_base (vTHX->Icollxfrm_base) +# define PL_collxfrm_mult (vTHX->Icollxfrm_mult) +# define PL_colors (vTHX->Icolors) +# define PL_colorset (vTHX->Icolorset) +# define PL_compcv (vTHX->Icompcv) +# define PL_compiling (vTHX->Icompiling) +# define PL_comppad (vTHX->Icomppad) +# define PL_comppad_name (vTHX->Icomppad_name) +# define PL_comppad_name_fill (vTHX->Icomppad_name_fill) +# define PL_comppad_name_floor (vTHX->Icomppad_name_floor) +# define PL_constpadix (vTHX->Iconstpadix) +# define PL_cop_seqmax (vTHX->Icop_seqmax) +# define PL_ctype_name (vTHX->Ictype_name) +# define PL_cur_LC_ALL (vTHX->Icur_LC_ALL) +# define PL_cur_locale_obj (vTHX->Icur_locale_obj) +# define PL_curcop (vTHX->Icurcop) +# define PL_curcopdb (vTHX->Icurcopdb) +# define PL_curlocales (vTHX->Icurlocales) +# define PL_curpad (vTHX->Icurpad) +# define PL_curpm (vTHX->Icurpm) +# define PL_curpm_under (vTHX->Icurpm_under) +# define PL_curstack (vTHX->Icurstack) +# define PL_curstackinfo (vTHX->Icurstackinfo) +# define PL_curstash (vTHX->Icurstash) +# define PL_curstname (vTHX->Icurstname) +# define PL_custom_op_descs (vTHX->Icustom_op_descs) +# define PL_custom_op_names (vTHX->Icustom_op_names) +# define PL_custom_ops (vTHX->Icustom_ops) +# define PL_cv_has_eval (vTHX->Icv_has_eval) +# define PL_dbargs (vTHX->Idbargs) +# define PL_DBcontrol (vTHX->IDBcontrol) +# define PL_DBcv (vTHX->IDBcv) +# define PL_DBgv (vTHX->IDBgv) +# define PL_DBline (vTHX->IDBline) +# define PL_DBsignal (vTHX->IDBsignal) +# define PL_DBsingle (vTHX->IDBsingle) +# define PL_DBsub (vTHX->IDBsub) +# define PL_DBtrace (vTHX->IDBtrace) +# define PL_debstash (vTHX->Idebstash) +# define PL_debug (vTHX->Idebug) +# define PL_debug_pad (vTHX->Idebug_pad) +# define PL_def_layerlist (vTHX->Idef_layerlist) +# define PL_defgv (vTHX->Idefgv) +# define PL_defoutgv (vTHX->Idefoutgv) +# define PL_defstash (vTHX->Idefstash) +# define PL_delaymagic (vTHX->Idelaymagic) +# define PL_delaymagic_egid (vTHX->Idelaymagic_egid) +# define PL_delaymagic_euid (vTHX->Idelaymagic_euid) +# define PL_delaymagic_gid (vTHX->Idelaymagic_gid) +# define PL_delaymagic_uid (vTHX->Idelaymagic_uid) +# define PL_destroyhook (vTHX->Idestroyhook) +# define PL_diehook (vTHX->Idiehook) +# define PL_Dir (vTHX->IDir) +# define PL_doswitches (vTHX->Idoswitches) +# define PL_dowarn (vTHX->Idowarn) +# define PL_dump_re_max_len (vTHX->Idump_re_max_len) +# define PL_dumper_fd (vTHX->Idumper_fd) +# define PL_dumpindent (vTHX->Idumpindent) +# define PL_e_script (vTHX->Ie_script) +# define PL_efloatbuf (vTHX->Iefloatbuf) +# define PL_efloatsize (vTHX->Iefloatsize) +# define PL_endav (vTHX->Iendav) +# define PL_Env (vTHX->IEnv) +# define PL_envgv (vTHX->Ienvgv) +# define PL_errgv (vTHX->Ierrgv) +# define PL_errors (vTHX->Ierrors) +# define PL_eval_begin_nest_depth (vTHX->Ieval_begin_nest_depth) +# define PL_eval_root (vTHX->Ieval_root) +# define PL_eval_start (vTHX->Ieval_start) +# define PL_evalseq (vTHX->Ievalseq) +# define PL_exit_flags (vTHX->Iexit_flags) +# define PL_exitlist (vTHX->Iexitlist) +# define PL_exitlistlen (vTHX->Iexitlistlen) +# define PL_fdpid (vTHX->Ifdpid) +# define PL_filemode (vTHX->Ifilemode) +# define PL_firstgv (vTHX->Ifirstgv) +# define PL_fold_locale (vTHX->Ifold_locale) +# define PL_forkprocess (vTHX->Iforkprocess) +# define PL_formtarget (vTHX->Iformtarget) +# define PL_GCB_invlist (vTHX->IGCB_invlist) +# define PL_generation (vTHX->Igeneration) +# define PL_gensym (vTHX->Igensym) +# define PL_globalstash (vTHX->Iglobalstash) +# define PL_globhook (vTHX->Iglobhook) +# define PL_hash_rand_bits (vTHX->Ihash_rand_bits) +# define PL_hash_rand_bits_enabled (vTHX->Ihash_rand_bits_enabled) +# define PL_HasMultiCharFold (vTHX->IHasMultiCharFold) +# define PL_hintgv (vTHX->Ihintgv) +# define PL_hook__require__after (vTHX->Ihook__require__after) +# define PL_hook__require__before (vTHX->Ihook__require__before) +# define PL_hv_fetch_ent_mh (vTHX->Ihv_fetch_ent_mh) +# define PL_in_clean_all (vTHX->Iin_clean_all) +# define PL_in_clean_objs (vTHX->Iin_clean_objs) +# define PL_in_eval (vTHX->Iin_eval) +# define PL_in_load_module (vTHX->Iin_load_module) +# define PL_in_some_fold (vTHX->Iin_some_fold) +# define PL_in_utf8_COLLATE_locale (vTHX->Iin_utf8_COLLATE_locale) +# define PL_in_utf8_CTYPE_locale (vTHX->Iin_utf8_CTYPE_locale) +# define PL_in_utf8_turkic_locale (vTHX->Iin_utf8_turkic_locale) +# define PL_InBitmap (vTHX->IInBitmap) +# define PL_incgv (vTHX->Iincgv) +# define PL_initav (vTHX->Iinitav) +# define PL_InMultiCharFold (vTHX->IInMultiCharFold) +# define PL_inplace (vTHX->Iinplace) +# define PL_internal_random_state (vTHX->Iinternal_random_state) +# define PL_isarev (vTHX->Iisarev) +# define PL_known_layers (vTHX->Iknown_layers) +# define PL_langinfo_buf (vTHX->Ilanginfo_buf) +# define PL_langinfo_bufsize (vTHX->Ilanginfo_bufsize) +# define PL_last_in_gv (vTHX->Ilast_in_gv) +# define PL_lastfd (vTHX->Ilastfd) +# define PL_lastgotoprobe (vTHX->Ilastgotoprobe) +# define PL_laststatval (vTHX->Ilaststatval) +# define PL_laststype (vTHX->Ilaststype) +# define PL_Latin1 (vTHX->ILatin1) +# define PL_LB_invlist (vTHX->ILB_invlist) +# define PL_LIO (vTHX->ILIO) +# define PL_locale_mutex_depth (vTHX->Ilocale_mutex_depth) +# define PL_localizing (vTHX->Ilocalizing) +# define PL_localpatches (vTHX->Ilocalpatches) +# define PL_lockhook (vTHX->Ilockhook) +# define PL_main_cv (vTHX->Imain_cv) +# define PL_main_root (vTHX->Imain_root) +# define PL_main_start (vTHX->Imain_start) +# define PL_mainstack (vTHX->Imainstack) +# define PL_markstack (vTHX->Imarkstack) +# define PL_markstack_max (vTHX->Imarkstack_max) +# define PL_markstack_ptr (vTHX->Imarkstack_ptr) +# define PL_max_intro_pending (vTHX->Imax_intro_pending) +# define PL_maxsysfd (vTHX->Imaxsysfd) +# define PL_mbrlen_ps (vTHX->Imbrlen_ps) +# define PL_mbrtowc_ps (vTHX->Imbrtowc_ps) +# define PL_Mem (vTHX->IMem) +# define PL_mem_log (vTHX->Imem_log) +# define PL_memory_debug_header (vTHX->Imemory_debug_header) +# define PL_MemParse (vTHX->IMemParse) +# define PL_MemShared (vTHX->IMemShared) +# define PL_mess_sv (vTHX->Imess_sv) +# define PL_min_intro_pending (vTHX->Imin_intro_pending) +# define PL_minus_a (vTHX->Iminus_a) +# define PL_minus_c (vTHX->Iminus_c) +# define PL_minus_E (vTHX->Iminus_E) +# define PL_minus_F (vTHX->Iminus_F) +# define PL_minus_l (vTHX->Iminus_l) +# define PL_minus_n (vTHX->Iminus_n) +# define PL_minus_p (vTHX->Iminus_p) +# define PL_modcount (vTHX->Imodcount) +# define PL_modglobal (vTHX->Imodglobal) +# define PL_multideref_pc (vTHX->Imultideref_pc) +# define PL_my_cxt_list (vTHX->Imy_cxt_list) +# define PL_my_cxt_size (vTHX->Imy_cxt_size) +# define PL_na (vTHX->Ina) +# define PL_nomemok (vTHX->Inomemok) +# define PL_numeric_name (vTHX->Inumeric_name) +# define PL_numeric_radix_sv (vTHX->Inumeric_radix_sv) +# define PL_numeric_standard (vTHX->Inumeric_standard) +# define PL_numeric_underlying (vTHX->Inumeric_underlying) +# define PL_numeric_underlying_is_standard (vTHX->Inumeric_underlying_is_standard) +# define PL_ofsgv (vTHX->Iofsgv) +# define PL_oldname (vTHX->Ioldname) +# define PL_op (vTHX->Iop) +# define PL_op_exec_cnt (vTHX->Iop_exec_cnt) +# define PL_op_mask (vTHX->Iop_mask) +# define PL_opfreehook (vTHX->Iopfreehook) +# define PL_origalen (vTHX->Iorigalen) +# define PL_origargc (vTHX->Iorigargc) +# define PL_origargv (vTHX->Iorigargv) +# define PL_origfilename (vTHX->Iorigfilename) +# define PL_ors_sv (vTHX->Iors_sv) +# define PL_osname (vTHX->Iosname) +# define PL_pad_reset_pending (vTHX->Ipad_reset_pending) +# define PL_padix (vTHX->Ipadix) +# define PL_padix_floor (vTHX->Ipadix_floor) +# define PL_padlist_generation (vTHX->Ipadlist_generation) +# define PL_padname_const (vTHX->Ipadname_const) +# define PL_padname_undef (vTHX->Ipadname_undef) +# define PL_parser (vTHX->Iparser) +# define PL_patchlevel (vTHX->Ipatchlevel) +# define PL_peepp (vTHX->Ipeepp) +# define PL_perl_destruct_level (vTHX->Iperl_destruct_level) +# define PL_perldb (vTHX->Iperldb) +# define PL_perlio (vTHX->Iperlio) +# define PL_phase (vTHX->Iphase) +# define PL_pidstatus (vTHX->Ipidstatus) +# define PL_Posix_ptrs (vTHX->IPosix_ptrs) +# define PL_preambleav (vTHX->Ipreambleav) +# define PL_prevailing_version (vTHX->Iprevailing_version) +# define PL_Private_Use (vTHX->IPrivate_Use) +# define PL_Proc (vTHX->IProc) +# define PL_profiledata (vTHX->Iprofiledata) +# define PL_psig_name (vTHX->Ipsig_name) +# define PL_psig_pend (vTHX->Ipsig_pend) +# define PL_psig_ptr (vTHX->Ipsig_ptr) +# define PL_ptr_table (vTHX->Iptr_table) +# define PL_random_state (vTHX->Irandom_state) +# define PL_reentrant_buffer (vTHX->Ireentrant_buffer) +# define PL_reentrant_retint (vTHX->Ireentrant_retint) +# define PL_reg_curpm (vTHX->Ireg_curpm) +# define PL_regex_pad (vTHX->Iregex_pad) +# define PL_regex_padav (vTHX->Iregex_padav) +# define PL_registered_mros (vTHX->Iregistered_mros) +# define PL_regmatch_slab (vTHX->Iregmatch_slab) +# define PL_regmatch_state (vTHX->Iregmatch_state) +# define PL_replgv (vTHX->Ireplgv) +# define PL_restartjmpenv (vTHX->Irestartjmpenv) +# define PL_restartop (vTHX->Irestartop) +# define PL_rpeepp (vTHX->Irpeepp) +# define PL_rs (vTHX->Irs) +# define PL_runops (vTHX->Irunops) +# define PL_savebegin (vTHX->Isavebegin) +# define PL_savestack (vTHX->Isavestack) +# define PL_savestack_ix (vTHX->Isavestack_ix) +# define PL_savestack_max (vTHX->Isavestack_max) +# define PL_SB_invlist (vTHX->ISB_invlist) +# define PL_scopestack (vTHX->Iscopestack) +# define PL_scopestack_ix (vTHX->Iscopestack_ix) +# define PL_scopestack_max (vTHX->Iscopestack_max) +# define PL_scopestack_name (vTHX->Iscopestack_name) +# define PL_scratch_locale_obj (vTHX->Iscratch_locale_obj) +# define PL_SCX_invlist (vTHX->ISCX_invlist) +# define PL_secondgv (vTHX->Isecondgv) +# define PL_setlocale_buf (vTHX->Isetlocale_buf) +# define PL_setlocale_bufsize (vTHX->Isetlocale_bufsize) +# define PL_sharehook (vTHX->Isharehook) +# define PL_sig_pending (vTHX->Isig_pending) +# define PL_sighandler1p (vTHX->Isighandler1p) +# define PL_sighandler3p (vTHX->Isighandler3p) +# define PL_sighandlerp (vTHX->Isighandlerp) +# define PL_signalhook (vTHX->Isignalhook) +# define PL_signals (vTHX->Isignals) +# define PL_Sock (vTHX->ISock) +# define PL_sortcop (vTHX->Isortcop) +# define PL_sortstash (vTHX->Isortstash) +# define PL_splitstr (vTHX->Isplitstr) +# define PL_srand_called (vTHX->Isrand_called) +# define PL_srand_override (vTHX->Isrand_override) +# define PL_srand_override_next (vTHX->Isrand_override_next) +# define PL_stack_base (vTHX->Istack_base) +# define PL_stack_max (vTHX->Istack_max) +# define PL_stack_sp (vTHX->Istack_sp) +# define PL_start_env (vTHX->Istart_env) +# define PL_stashcache (vTHX->Istashcache) +# define PL_stashpad (vTHX->Istashpad) +# define PL_stashpadix (vTHX->Istashpadix) +# define PL_stashpadmax (vTHX->Istashpadmax) +# define PL_statcache (vTHX->Istatcache) +# define PL_statgv (vTHX->Istatgv) +# define PL_statname (vTHX->Istatname) +# define PL_statusvalue (vTHX->Istatusvalue) +# define PL_statusvalue_posix (vTHX->Istatusvalue_posix) +# define PL_statusvalue_vms (vTHX->Istatusvalue_vms) +# define PL_stderrgv (vTHX->Istderrgv) +# define PL_stdingv (vTHX->Istdingv) +# define PL_StdIO (vTHX->IStdIO) +# define PL_stdize_locale_buf (vTHX->Istdize_locale_buf) +# define PL_stdize_locale_bufsize (vTHX->Istdize_locale_bufsize) +# define PL_strtab (vTHX->Istrtab) +# define PL_strxfrm_is_behaved (vTHX->Istrxfrm_is_behaved) +# define PL_strxfrm_max_cp (vTHX->Istrxfrm_max_cp) +# define PL_strxfrm_NUL_replacement (vTHX->Istrxfrm_NUL_replacement) +# define PL_sub_generation (vTHX->Isub_generation) +# define PL_subline (vTHX->Isubline) +# define PL_subname (vTHX->Isubname) +# define PL_Sv (vTHX->ISv) +# define PL_sv_arenaroot (vTHX->Isv_arenaroot) +# define PL_sv_consts (vTHX->Isv_consts) +# define PL_sv_count (vTHX->Isv_count) +# define PL_sv_immortals (vTHX->Isv_immortals) +# define PL_sv_no (vTHX->Isv_no) +# define PL_sv_root (vTHX->Isv_root) +# define PL_sv_serial (vTHX->Isv_serial) +# define PL_sv_undef (vTHX->Isv_undef) +# define PL_sv_yes (vTHX->Isv_yes) +# define PL_sv_zero (vTHX->Isv_zero) +# define PL_sys_intern (vTHX->Isys_intern) +# define PL_taint_warn (vTHX->Itaint_warn) +# define PL_tainted (vTHX->Itainted) +# define PL_tainting (vTHX->Itainting) +# define PL_threadhook (vTHX->Ithreadhook) +# define PL_tmps_floor (vTHX->Itmps_floor) +# define PL_tmps_ix (vTHX->Itmps_ix) +# define PL_tmps_max (vTHX->Itmps_max) +# define PL_tmps_stack (vTHX->Itmps_stack) +# define PL_top_env (vTHX->Itop_env) +# define PL_toptarget (vTHX->Itoptarget) +# define PL_TR_SPECIAL_HANDLING_UTF8 (vTHX->ITR_SPECIAL_HANDLING_UTF8) +# define PL_underlying_numeric_obj (vTHX->Iunderlying_numeric_obj) +# define PL_underlying_radix_sv (vTHX->Iunderlying_radix_sv) +# define PL_unicode (vTHX->Iunicode) +# define PL_unitcheckav (vTHX->Iunitcheckav) +# define PL_unitcheckav_save (vTHX->Iunitcheckav_save) +# define PL_unlockhook (vTHX->Iunlockhook) +# define PL_unsafe (vTHX->Iunsafe) +# define PL_UpperLatin1 (vTHX->IUpperLatin1) +# define PL_utf8_charname_begin (vTHX->Iutf8_charname_begin) +# define PL_utf8_charname_continue (vTHX->Iutf8_charname_continue) +# define PL_utf8_foldclosures (vTHX->Iutf8_foldclosures) +# define PL_utf8_idcont (vTHX->Iutf8_idcont) +# define PL_utf8_idstart (vTHX->Iutf8_idstart) +# define PL_utf8_mark (vTHX->Iutf8_mark) +# define PL_utf8_perl_idcont (vTHX->Iutf8_perl_idcont) +# define PL_utf8_perl_idstart (vTHX->Iutf8_perl_idstart) +# define PL_utf8_tofold (vTHX->Iutf8_tofold) +# define PL_utf8_tolower (vTHX->Iutf8_tolower) +# define PL_utf8_tosimplefold (vTHX->Iutf8_tosimplefold) +# define PL_utf8_totitle (vTHX->Iutf8_totitle) +# define PL_utf8_toupper (vTHX->Iutf8_toupper) +# define PL_utf8_xidcont (vTHX->Iutf8_xidcont) +# define PL_utf8_xidstart (vTHX->Iutf8_xidstart) +# define PL_utf8cache (vTHX->Iutf8cache) +# define PL_utf8locale (vTHX->Iutf8locale) +# define PL_warn_locale (vTHX->Iwarn_locale) +# define PL_warnhook (vTHX->Iwarnhook) +# define PL_watchaddr (vTHX->Iwatchaddr) +# define PL_watchok (vTHX->Iwatchok) +# define PL_WB_invlist (vTHX->IWB_invlist) +# define PL_wcrtomb_ps (vTHX->Iwcrtomb_ps) +# define PL_XPosix_ptrs (vTHX->IXPosix_ptrs) +# define PL_Xpv (vTHX->IXpv) +# define PL_xsubfilename (vTHX->Ixsubfilename) +# if !defined(PL_sawampersand) +# define PL_sawampersand (vTHX->Isawampersand) +# endif +#endif /* defined(MULTIPLICITY) */ -#endif /* MULTIPLICITY */ - -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/feature.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/feature.h,v diff -u -p -a -u -p -r1.6 feature.h --- gnu/usr.bin/perl/feature.h 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/feature.h 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by regen/feature.pl. Any changes made here will be lost! @@ -14,24 +14,26 @@ #define FEATURE_BAREWORD_FILEHANDLES_BIT 0x0001 #define FEATURE_BITWISE_BIT 0x0002 -#define FEATURE___SUB___BIT 0x0004 -#define FEATURE_MYREF_BIT 0x0008 -#define FEATURE_DEFER_BIT 0x0010 -#define FEATURE_EVALBYTES_BIT 0x0020 -#define FEATURE_MORE_DELIMS_BIT 0x0040 -#define FEATURE_FC_BIT 0x0080 -#define FEATURE_INDIRECT_BIT 0x0100 -#define FEATURE_ISA_BIT 0x0200 -#define FEATURE_MULTIDIMENSIONAL_BIT 0x0400 -#define FEATURE_POSTDEREF_QQ_BIT 0x0800 -#define FEATURE_REFALIASING_BIT 0x1000 -#define FEATURE_SAY_BIT 0x2000 -#define FEATURE_SIGNATURES_BIT 0x4000 -#define FEATURE_STATE_BIT 0x8000 -#define FEATURE_SWITCH_BIT 0x10000 -#define FEATURE_TRY_BIT 0x20000 -#define FEATURE_UNIEVAL_BIT 0x40000 -#define FEATURE_UNICODE_BIT 0x80000 +#define FEATURE_CLASS_BIT 0x0004 +#define FEATURE___SUB___BIT 0x0008 +#define FEATURE_MYREF_BIT 0x0010 +#define FEATURE_DEFER_BIT 0x0020 +#define FEATURE_EVALBYTES_BIT 0x0040 +#define FEATURE_MORE_DELIMS_BIT 0x0080 +#define FEATURE_FC_BIT 0x0100 +#define FEATURE_INDIRECT_BIT 0x0200 +#define FEATURE_ISA_BIT 0x0400 +#define FEATURE_MODULE_TRUE_BIT 0x0800 +#define FEATURE_MULTIDIMENSIONAL_BIT 0x1000 +#define FEATURE_POSTDEREF_QQ_BIT 0x2000 +#define FEATURE_REFALIASING_BIT 0x4000 +#define FEATURE_SAY_BIT 0x8000 +#define FEATURE_SIGNATURES_BIT 0x10000 +#define FEATURE_STATE_BIT 0x20000 +#define FEATURE_SWITCH_BIT 0x40000 +#define FEATURE_TRY_BIT 0x80000 +#define FEATURE_UNIEVAL_BIT 0x100000 +#define FEATURE_UNICODE_BIT 0x200000 #define FEATURE_BUNDLE_DEFAULT 0 #define FEATURE_BUNDLE_510 1 @@ -40,10 +42,16 @@ #define FEATURE_BUNDLE_523 4 #define FEATURE_BUNDLE_527 5 #define FEATURE_BUNDLE_535 6 +#define FEATURE_BUNDLE_537 7 #define FEATURE_BUNDLE_CUSTOM (HINT_FEATURE_MASK >> HINT_FEATURE_SHIFT) -#define CURRENT_HINTS \ +/* this is preserved for testing and asserts */ +#define OLD_CURRENT_HINTS \ (PL_curcop == &PL_compiling ? PL_hints : PL_curcop->cop_hints) +/* this is the same thing, but simpler (no if) as PL_hints expands + to PL_compiling.cop_hints */ +#define CURRENT_HINTS \ + PL_curcop->cop_hints #define CURRENT_FEATURE_BUNDLE \ ((CURRENT_HINTS & HINT_FEATURE_MASK) >> HINT_FEATURE_SHIFT) @@ -57,14 +65,15 @@ #define FEATURE_FC_IS_ENABLED \ ( \ (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \ - CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE_FC_BIT)) \ ) #define FEATURE_ISA_IS_ENABLED \ ( \ - CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_535 \ + (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_535 && \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE_ISA_BIT)) \ ) @@ -72,7 +81,7 @@ #define FEATURE_SAY_IS_ENABLED \ ( \ (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \ - CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE_SAY_BIT)) \ ) @@ -83,6 +92,12 @@ FEATURE_IS_ENABLED_MASK(FEATURE_TRY_BIT) \ ) +#define FEATURE_CLASS_IS_ENABLED \ + ( \ + CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ + FEATURE_IS_ENABLED_MASK(FEATURE_CLASS_BIT) \ + ) + #define FEATURE_DEFER_IS_ENABLED \ ( \ CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ @@ -92,7 +107,7 @@ #define FEATURE_STATE_IS_ENABLED \ ( \ (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \ - CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE_STATE_BIT)) \ ) @@ -108,7 +123,7 @@ #define FEATURE_BITWISE_IS_ENABLED \ ( \ (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_527 && \ - CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE_BITWISE_BIT)) \ ) @@ -123,14 +138,15 @@ #define FEATURE_EVALBYTES_IS_ENABLED \ ( \ (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \ - CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE_EVALBYTES_BIT)) \ ) #define FEATURE_SIGNATURES_IS_ENABLED \ ( \ - CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_535 \ + (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_535 && \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE_SIGNATURES_BIT)) \ ) @@ -138,11 +154,18 @@ #define FEATURE___SUB___IS_ENABLED \ ( \ (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \ - CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE___SUB___BIT)) \ ) +#define FEATURE_MODULE_TRUE_IS_ENABLED \ + ( \ + CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_537 \ + || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ + FEATURE_IS_ENABLED_MASK(FEATURE_MODULE_TRUE_BIT)) \ + ) + #define FEATURE_REFALIASING_IS_ENABLED \ ( \ CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ @@ -152,7 +175,7 @@ #define FEATURE_POSTDEREF_QQ_IS_ENABLED \ ( \ (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_523 && \ - CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE_POSTDEREF_QQ_BIT)) \ ) @@ -160,7 +183,7 @@ #define FEATURE_UNIEVAL_IS_ENABLED \ ( \ (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_515 && \ - CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE_UNIEVAL_BIT)) \ ) @@ -174,7 +197,7 @@ #define FEATURE_UNICODE_IS_ENABLED \ ( \ (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_511 && \ - CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_535) \ + CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_537) \ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ FEATURE_IS_ENABLED_MASK(FEATURE_UNICODE_BIT)) \ ) @@ -222,6 +245,9 @@ S_enable_feature_bundle(pTHX_ SV *ver) SV *comp_ver = sv_newmortal(); PL_hints = (PL_hints &~ HINT_FEATURE_MASK) | ( + (sv_setnv(comp_ver, 5.037), + vcmp(ver, upg_version(comp_ver, FALSE)) >= 0) + ? FEATURE_BUNDLE_537 : (sv_setnv(comp_ver, 5.035), vcmp(ver, upg_version(comp_ver, FALSE)) >= 0) ? FEATURE_BUNDLE_535 : @@ -284,6 +310,14 @@ S_magic_sethint_feature(pTHX_ SV *keysv, } return; + case 'c': + if (keylen == sizeof("feature_class")-1 + && memcmp(subf+1, "lass", keylen - sizeof("feature_")) == 0) { + mask = FEATURE_CLASS_BIT; + break; + } + return; + case 'd': if (keylen == sizeof("feature_defer")-1 && memcmp(subf+1, "efer", keylen - sizeof("feature_")) == 0) { @@ -322,7 +356,12 @@ S_magic_sethint_feature(pTHX_ SV *keysv, return; case 'm': - if (keylen == sizeof("feature_more_delims")-1 + if (keylen == sizeof("feature_module_true")-1 + && memcmp(subf+1, "odule_true", keylen - sizeof("feature_")) == 0) { + mask = FEATURE_MODULE_TRUE_BIT; + break; + } + else if (keylen == sizeof("feature_more_delims")-1 && memcmp(subf+1, "ore_delims", keylen - sizeof("feature_")) == 0) { mask = FEATURE_MORE_DELIMS_BIT; break; @@ -412,4 +451,4 @@ S_magic_sethint_feature(pTHX_ SV *keysv, #endif /* PERL_FEATURE_H_ */ -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/globvar.sym =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/globvar.sym,v diff -u -p -a -u -p -r1.14 globvar.sym --- gnu/usr.bin/perl/globvar.sym 15 Feb 2023 01:36:13 -0000 1.14 +++ gnu/usr.bin/perl/globvar.sym 21 Feb 2024 15:47:02 -0000 @@ -19,7 +19,6 @@ PL_EXACT_REQ8_bitmask PL_extended_utf8_dfa_tab PL_fold PL_fold_latin1 -PL_fold_locale PL_hexdigit PL_inf PL_interp_size @@ -58,8 +57,8 @@ PL_phase_names PL_ppaddr PL_reg_extflags_name PL_reg_intflags_name -PL_reg_name -PL_regkind +PL_regnode_info +PL_regnode_name PL_revision PL_runops_dbg PL_runops_std Index: gnu/usr.bin/perl/gv.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/gv.c,v diff -u -p -a -u -p -r1.24 gv.c --- gnu/usr.bin/perl/gv.c 8 Jul 2023 14:18:35 -0000 1.24 +++ gnu/usr.bin/perl/gv.c 21 Feb 2024 15:47:02 -0000 @@ -79,7 +79,6 @@ Perl_gv_add_by_type(pTHX_ GV *gv, svtype } else { what = type == SVt_PVAV ? "array" : "scalar"; } - /* diag_listed_as: Bad symbol for filehandle */ Perl_croak(aTHX_ "Bad symbol for %s", what); } @@ -207,9 +206,6 @@ Perl_newGP(pTHX_ GV *const gv) U32 hash; const char *file; STRLEN len; -#ifndef USE_ITHREADS - GV *filegv; -#endif PERL_ARGS_ASSERT_NEWGP; Newxz(gp, 1, GP); @@ -223,19 +219,13 @@ Perl_newGP(pTHX_ GV *const gv) frees INIT before looking up DESTROY (and creating *DESTROY) */ if (PL_curcop) { + char *tmp= CopFILE(PL_curcop); gp->gp_line = CopLINE(PL_curcop); /* 0 otherwise Newxz */ -#ifdef USE_ITHREADS - if (CopFILE(PL_curcop)) { - file = CopFILE(PL_curcop); - len = strlen(file); - } -#else - filegv = CopFILEGV(PL_curcop); - if (filegv) { - file = GvNAME(filegv)+2; - len = GvNAMELEN(filegv)-2; + + if (tmp) { + file = tmp; + len = CopFILE_LEN(PL_curcop); } -#endif else goto no_file; } else { @@ -311,7 +301,7 @@ Perl_cvgv_from_hek(pTHX_ CV *cv) if (!isGV(gv)) gv_init_pvn(gv, CvSTASH(cv), HEK_KEY(CvNAME_HEK(cv)), HEK_LEN(CvNAME_HEK(cv)), - SVf_UTF8 * !!HEK_UTF8(CvNAME_HEK(cv))); + SVf_UTF8 * cBOOL(HEK_UTF8(CvNAME_HEK(cv)))); if (!CvNAMED(cv)) { /* gv_init took care of it */ assert (SvANY(cv)->xcv_gv_u.xcv_gv == gv); return gv; @@ -615,23 +605,28 @@ S_maybe_add_coresub(pTHX_ HV * const sta switch (code < 0 ? -code : code) { /* no support for \&CORE::infix; no support for funcs that do not parse like funcs */ - case KEY___DATA__: case KEY___END__: case KEY_and: case KEY_AUTOLOAD: - case KEY_BEGIN : case KEY_CHECK : case KEY_catch : case KEY_cmp: - case KEY_default : case KEY_defer : case KEY_DESTROY: + case KEY___DATA__: case KEY___END__ : + case KEY_ADJUST : case KEY_AUTOLOAD: case KEY_BEGIN : case KEY_CHECK : + case KEY_DESTROY : case KEY_END : case KEY_INIT : case KEY_UNITCHECK: + case KEY_and : case KEY_catch : case KEY_class : + case KEY_cmp : case KEY_default: case KEY_defer : case KEY_do : case KEY_dump : case KEY_else : case KEY_elsif : - case KEY_END : case KEY_eq : case KEY_eval : case KEY_finally: + case KEY_eq : case KEY_eval : case KEY_field : + case KEY_finally: case KEY_for : case KEY_foreach: case KEY_format: case KEY_ge : case KEY_given : case KEY_goto : case KEY_grep : case KEY_gt : - case KEY_if : case KEY_isa : case KEY_INIT : case KEY_last : + case KEY_if : case KEY_isa : + case KEY_last : case KEY_le : case KEY_local : case KEY_lt : case KEY_m : - case KEY_map : case KEY_my: + case KEY_map : case KEY_method : case KEY_my : case KEY_ne : case KEY_next : case KEY_no: case KEY_or: case KEY_our: case KEY_package: case KEY_print: case KEY_printf: case KEY_q : case KEY_qq : case KEY_qr : case KEY_qw : case KEY_qx : case KEY_redo : case KEY_require: case KEY_return: case KEY_s : case KEY_say : case KEY_sort : case KEY_state: case KEY_sub : - case KEY_tr : case KEY_try : case KEY_UNITCHECK: case KEY_unless: + case KEY_tr : case KEY_try : + case KEY_unless: case KEY_until: case KEY_use : case KEY_when : case KEY_while : case KEY_x : case KEY_xor : case KEY_y : return NULL; @@ -725,14 +720,56 @@ S_maybe_add_coresub(pTHX_ HV * const sta } /* -=for apidoc gv_fetchmeth - -Like L, but lacks a flags parameter. +=for apidoc gv_fetchmeth +=for apidoc_item gv_fetchmeth_pv +=for apidoc_item gv_fetchmeth_pvn +=for apidoc_item gv_fetchmeth_sv + +These each look for a glob with name C, containing a defined subroutine, +returning the GV of that glob if found, or C if not. + +C is always searched (first), unless it is C. + +If C is NULL, or was searched but nothing was found in it, and the +C bit is set in C, stashes accessible via C<@ISA> are searched +next. Searching is conducted according to L order|perlmroapi>. + +Finally, if no matches were found so far, and the C flag in +C is not set, C is searched. + +The argument C should be either 0 or -1. If -1, the function will +return without any side effects or caching. If 0, the function makes sure +there is a glob named C in C, creating one if necessary. +The subroutine slot in the glob will be set to any subroutine found in the +C and C search, hence caching any C result. Note that +subroutines found in C are not cached. + +The GV returned from these may be a method cache entry, which is not visible to +Perl code. So when calling C, you should not use the GV directly; +instead, you should use the method's CV, which can be obtained from the GV with +the C macro. + +The only other significant value for C is C, indicating that +C is to be treated as being encoded in UTF-8. + +Plain C lacks a C parameter, hence always searches in +C, then C, and C is never UTF-8. Otherwise it is +exactly like C. + +The other forms do have a C parameter, and differ only in how the glob +name is specified. + +In C, C is a C language NUL-terminated string. + +In C, C points to the first byte of the name, and an +additional parameter, C, specifies its length in bytes. Hence, the name +may contain embedded-NUL characters. + +In C, C<*name> is an SV, and the name is the PV extracted from +that, using L>. If the SV is marked as being in UTF-8, the extracted +PV will also be. -=for apidoc gv_fetchmeth_sv - -Exactly like L, but takes the name string in the form -of an SV instead of a string/length pair. +=for apidoc Amnh||GV_SUPER =cut */ @@ -751,14 +788,6 @@ Perl_gv_fetchmeth_sv(pTHX_ HV *stash, SV return gv_fetchmeth_pvn(stash, namepv, namelen, level, flags); } -/* -=for apidoc gv_fetchmeth_pv - -Exactly like L, but takes a nul-terminated string -instead of a string/length pair. - -=cut -*/ GV * Perl_gv_fetchmeth_pv(pTHX_ HV *stash, const char *name, I32 level, U32 flags) @@ -767,38 +796,6 @@ Perl_gv_fetchmeth_pv(pTHX_ HV *stash, co return gv_fetchmeth_internal(stash, NULL, name, strlen(name), level, flags); } -/* -=for apidoc gv_fetchmeth_pvn - -Returns the glob with the given C and a defined subroutine or -C. The glob lives in the given C, or in the stashes -accessible via C<@ISA> and C. - -The argument C should be either 0 or -1. If C, as a -side-effect creates a glob with the given C in the given C -which in the case of success contains an alias for the subroutine, and sets -up caching info for this glob. - -The only significant values for C are C, C, and -C. - -C indicates that we want to look up the method in the superclasses -of the C. - -C indicates that we do not want to look up the method in -the stash accessible by C. - -The -GV returned from C may be a method cache entry, which is not -visible to Perl code. So when calling C, you should not use -the GV directly; instead, you should use the method's CV, which can be -obtained from the GV with the C macro. - -=for apidoc Amnh||GV_SUPER - -=cut -*/ - /* NOTE: No support for tied ISA */ PERL_STATIC_INLINE GV* @@ -915,8 +912,8 @@ S_gv_fetchmeth_internal(pTHX_ HV* stash, } else { Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), "While trying to resolve method call %.*s->%.*s()" - " can not locate package \"%" SVf "\" yet it is mentioned in @%.*s::ISA" - " (perhaps you forgot to load \"%" SVf "\"?)", + " can not locate package %" SVf_QUOTEDPREFIX " yet it is mentioned in @%.*s::ISA" + " (perhaps you forgot to load %" SVf_QUOTEDPREFIX "?)", (int) hvnamelen, hvname, (int) len, name, SVfARG(linear_sv), @@ -1202,12 +1199,12 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV * } else if ( sep_len >= 7 && strBEGINs(last_separator - 7, "::SUPER")) { - /* don't autovifify if ->NoSuchStash::SUPER::method */ + /* don't autovivify if ->NoSuchStash::SUPER::method */ stash = gv_stashpvn(origname, sep_len - 7, is_utf8); if (stash) flags |= GV_SUPER; } else { - /* don't autovifify if ->NoSuchStash::method */ + /* don't autovivify if ->NoSuchStash::method */ stash = gv_stashpvn(origname, sep_len, is_utf8); } ostash = stash; @@ -1244,8 +1241,8 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV * return gv; } Perl_croak(aTHX_ - "Can't locate object method \"%" UTF8f - "\" via package \"%" HEKf "\"", + "Can't locate object method %" UTF8f_QUOTEDPREFIX "" + " via package %" HEKf_QUOTEDPREFIX, UTF8fARG(is_utf8, name_end - name, name), HEKfARG(HvNAME_HEK(stash))); } @@ -1260,9 +1257,9 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV * } Perl_croak(aTHX_ - "Can't locate object method \"%" UTF8f - "\" via package \"%" SVf "\"" - " (perhaps you forgot to load \"%" SVf "\"?)", + "Can't locate object method %" UTF8f_QUOTEDPREFIX "" + " via package %" SVf_QUOTEDPREFIX "" + " (perhaps you forgot to load %" SVf_QUOTEDPREFIX "?)", UTF8fARG(is_utf8, name_end - name, name), SVfARG(packnamesv), SVfARG(packnamesv)); } @@ -1293,6 +1290,36 @@ Perl_gv_fetchmethod_pvn_flags(pTHX_ HV * return gv; } + +/* +=for apidoc gv_autoload_pv +=for apidoc_item gv_autoload_pvn +=for apidoc_item gv_autoload_sv + +These each search for an C method, returning NULL if not found, or +else returning a pointer to its GV, while setting the package +L|perlobj/AUTOLOAD> variable to C (fully qualified). Also, +if found and the GV's CV is an XSUB, the CV's PV will be set to C, and +its stash will be set to the stash of the GV. + +Searching is done in L order|perlmroapi>, as specified in +L>, beginning with C if it isn't NULL. + +The forms differ only in how C is specified. + +In C, C is a C language NUL-terminated string. + +In C, C points to the first byte of the name, and an +additional parameter, C, specifies its length in bytes. Hence, C<*name> +may contain embedded-NUL characters. + +In C, C<*namesv> is an SV, and the name is the PV extracted +from that using L>. If the SV is marked as being in UTF-8, the +extracted PV will also be. + +=cut +*/ + GV* Perl_gv_autoload_sv(pTHX_ HV *stash, SV* namesv, U32 flags) { @@ -1336,7 +1363,7 @@ Perl_gv_autoload_pvn(pTHX_ HV *stash, co stash = NULL; } else - packname = sv_2mortal(newSVhek(HvNAME_HEK(stash))); + packname = newSVhek_mortal(HvNAME_HEK(stash)); if (flags & GV_SUPER) sv_catpvs(packname, "::SUPER"); } if (!(gv = gv_fetchmeth_pvn(stash, S_autoload, S_autolen, FALSE, @@ -1360,15 +1387,15 @@ Perl_gv_autoload_pvn(pTHX_ HV *stash, co UTF8fARG(is_utf8, len, name)); if (CvISXSUB(cv)) { - /* Instead of forcing the XSUB do another lookup for $AUTOLOAD + /* Instead of forcing the XSUB to do another lookup for $AUTOLOAD * and split that value on the last '::', pass along the same data * via the SvPVX field in the CV, and the stash in CvSTASH. * * Due to an unfortunate accident of history, the SvPVX field - * serves two purposes. It is also used for the subroutine's pro- - * type. Since SvPVX has been documented as returning the sub name - * for a long time, but not as returning the prototype, we have - * to preserve the SvPVX AUTOLOAD behaviour and put the prototype + * serves two purposes. It is also used for the subroutine's + * prototype. Since SvPVX has been documented as returning the sub + * name for a long time, but not as returning the prototype, we have to + * preserve the SvPVX AUTOLOAD behaviour and put the prototype * elsewhere. * * We put the prototype in the same allocated buffer, but after @@ -1606,7 +1633,7 @@ S_gv_stashpvn_internal(pTHX_ const char stash = GvHV(tmpgv); if (!(flags & ~GV_NOADD_MASK) && !stash) return NULL; assert(stash); - if (!HvNAME_get(stash)) { + if (!HvHasNAME(stash)) { hv_name_set(stash, name, namelen, flags & SVf_UTF8 ? SVf_UTF8 : 0 ); /* FIXME: This is a repeat of logic in gv_fetchpvn_flags */ @@ -1736,6 +1763,14 @@ S_gv_magicalize_isa(pTHX_ GV *gv) GvMULTI_on(gv); sv_magic(MUTABLE_SV(av), MUTABLE_SV(gv), PERL_MAGIC_isa, NULL, 0); + + if(HvSTASH_IS_CLASS(GvSTASH(gv))) { + /* Don't permit modification of @ISA outside of the class management + * code. This is temporarily undone by class.c when fiddling with the + * array, so it knows it can be done safely. + */ + SvREADONLY_on((SV *)av); + } } /* This function grabs name and tries to split a stash and glob @@ -1812,7 +1847,7 @@ S_parse_gv_stash_name(pTHX_ HV **stash, if (!(*stash = GvHV(*gv))) { *stash = GvHV(*gv) = newHV(); - if (!HvNAME_get(*stash)) { + if (!HvHasNAME(*stash)) { if (GvSTASH(*gv) == PL_defstash && *len == 6 && strBEGINs(*name, "CORE")) hv_name_sets(*stash, "CORE", 0); @@ -1826,7 +1861,7 @@ S_parse_gv_stash_name(pTHX_ HV **stash, mro_package_moved(*stash, NULL, *gv, 1); } } - else if (!HvNAME_get(*stash)) + else if (!HvHasNAME(*stash)) hv_name_set(*stash, nambeg, name_cursor - nambeg, is_utf8); } @@ -2176,29 +2211,37 @@ S_gv_magicalize(pTHX_ GV *gv, HV *stash, require_tie_mod_s(gv, '-', "Tie::Hash::NamedCapture",0); } break; - case '\005': /* $^ENCODING */ + case '\005': /* ${^ENCODING} */ if (memEQs(name, len, "\005NCODING")) goto magicalize; break; - case '\007': /* $^GLOBAL_PHASE */ + case '\007': /* ${^GLOBAL_PHASE} */ if (memEQs(name, len, "\007LOBAL_PHASE")) goto ro_magicalize; break; - case '\014': /* $^LAST_FH */ - if (memEQs(name, len, "\014AST_FH")) + case '\010': /* %{^HOOK} */ + if (memEQs(name, len, "\010OOK")) { + GvMULTI_on(gv); + HV *hv = GvHVn(gv); + hv_magic(hv, NULL, PERL_MAGIC_hook); + } + break; + case '\014': + if ( memEQs(name, len, "\014AST_FH") || /* ${^LAST_FH} */ + memEQs(name, len, "\014AST_SUCCESSFUL_PATTERN")) /* ${^LAST_SUCCESSFUL_PATTERN} */ goto ro_magicalize; break; - case '\015': /* $^MATCH */ + case '\015': /* ${^MATCH} */ if (memEQs(name, len, "\015ATCH")) { paren = RX_BUFF_IDX_CARET_FULLMATCH; goto storeparen; } break; - case '\017': /* $^OPEN */ + case '\017': /* ${^OPEN} */ if (memEQs(name, len, "\017PEN")) goto magicalize; break; - case '\020': /* $^PREMATCH $^POSTMATCH */ + case '\020': /* ${^PREMATCH} ${^POSTMATCH} */ if (memEQs(name, len, "\020REMATCH")) { paren = RX_BUFF_IDX_CARET_PREMATCH; goto storeparen; @@ -2532,8 +2575,8 @@ to C makes it behave identic =for apidoc Amnh||GV_ADDMG =for apidoc Amnh||GV_ADDMULTI =for apidoc Amnh||GV_ADDWARN -=for apidoc Amnh||GV_NOADD_NOINIT =for apidoc Amnh||GV_NOINIT +=for apidoc Amnh||GV_NOADD_NOINIT =for apidoc Amnh||GV_NOTQUAL =for apidoc Amnh||GV_NO_SVGMAGIC =for apidoc Amnh||SVf_UTF8 @@ -2677,10 +2720,10 @@ Perl_gv_fetchpvn_flags(pTHX_ const char } /* -=for apidoc gv_fullname3 -=for apidoc_item gv_fullname4 -=for apidoc_item gv_efullname3 +=for apidoc gv_efullname3 =for apidoc_item gv_efullname4 +=for apidoc_item gv_fullname3 +=for apidoc_item gv_fullname4 Place the full package name of C into C. The C forms return instead the effective package name (see L). @@ -2713,7 +2756,7 @@ Perl_gv_fullname4(pTHX_ SV *sv, const GV } } else sv_catpvs(sv,"__ANON__::"); - sv_catsv(sv,sv_2mortal(newSVhek(GvNAME_HEK(gv)))); + sv_catsv(sv,newSVhek_mortal(GvNAME_HEK(gv))); } void @@ -2738,7 +2781,7 @@ Perl_gv_check(pTHX_ HV *stash) PERL_ARGS_ASSERT_GV_CHECK; - if (!SvOOK(stash)) + if (!HvHasAUX(stash)) return; assert(HvARRAY(stash)); @@ -2757,7 +2800,7 @@ Perl_gv_check(pTHX_ HV *stash) (gv = MUTABLE_GV(HeVAL(entry))) && isGV(gv) && (hv = GvHV(gv))) { if (hv != PL_defstash && hv != stash - && !(SvOOK(hv) + && !(HvHasAUX(hv) && (HvAUX(hv)->xhv_aux_flags & HvAUXf_SCAN_STASH)) ) gv_check(hv); /* nested package */ @@ -2773,9 +2816,11 @@ Perl_gv_check(pTHX_ HV *stash) if (SvTYPE(gv) != SVt_PVGV || GvMULTI(gv)) continue; file = GvFILE(gv); + assert(PL_curcop == &PL_compiling); CopLINE_set(PL_curcop, GvLINE(gv)); #ifdef USE_ITHREADS - CopFILE(PL_curcop) = (char *)file; /* set for warning */ + SAVECOPFILE_FREE(PL_curcop); + CopFILE_set(PL_curcop, (char *)file); /* set for warning */ #else CopFILEGV(PL_curcop) = gv_fetchfile_flags(file, HEK_LEN(GvFILE_HEK(gv)), 0); @@ -2915,12 +2960,12 @@ Perl_gp_free(pTHX_ GV *gv) simple problems likely found by fuzzers but never written by humans, whilst leaving working code unchanged. */ if (sv) { - SV *referant; + SV *referent; if (SvREFCNT(sv) > 1 || SvOBJECT(sv) || UNLIKELY(in_global_destruction)) { SvREFCNT_dec_NN(sv); sv = NULL; - } else if (SvROK(sv) && (referant = SvRV(sv)) - && (SvREFCNT(referant) > 1 || SvOBJECT(referant))) { + } else if (SvROK(sv) && (referent = SvRV(sv)) + && (SvREFCNT(referent) > 1 || SvOBJECT(referent))) { SvREFCNT_dec_NN(sv); sv = NULL; } else { @@ -3110,7 +3155,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash, bool d sv_unmagic(MUTABLE_SV(stash), PERL_MAGIC_overload_table); } - DEBUG_o( Perl_deb(aTHX_ "Recalcing overload magic in package %s\n",HvNAME_get(stash)) ); + DEBUG_o( Perl_deb(aTHX_ "Recalculating overload magic in package %s\n",HvNAME_get(stash)) ); Zero(&amt,1,AMT); amt.was_ok_sub = newgen; @@ -3152,7 +3197,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash, bool d filled = 1; } - assert(SvOOK(stash)); + assert(HvHasAUX(stash)); /* initially assume the worst */ HvAUX(stash)->xhv_aux_flags &= ~HvAUXf_NO_DEREF; @@ -3274,7 +3319,7 @@ Perl_gv_handler(pTHX_ HV *stash, I32 id) U32 newgen; struct mro_meta* stash_meta; - if (!stash || !HvNAME_get(stash)) + if (!stash || !HvHasNAME(stash)) return NULL; stash_meta = HvMROMETA(stash); @@ -3353,6 +3398,153 @@ Perl_try_amagic_un(pTHX_ int method, int } +/* +=for apidoc amagic_applies + +Check C to see if the overloaded (active magic) operation C +applies to it. If the sv is not SvROK or it is not an object then returns +false, otherwise checks if the object is blessed into a class supporting +overloaded operations, and returns true if a call to amagic_call() with +this SV and the given method would trigger an amagic operation, including +via the overload fallback rules or via nomethod. Thus a call like: + + amagic_applies(sv, string_amg, AMG_unary) + +would return true for an object with overloading set up in any of the +following ways: + + use overload q("") => sub { ... }; + use overload q(0+) => sub { ... }, fallback => 1; + +and could be used to tell if a given object would stringify to something +other than the normal default ref stringification. + +Note that the fact that this function returns TRUE does not mean you +can succesfully perform the operation with amagic_call(), for instance +any overloaded method might throw a fatal exception, however if this +function returns FALSE you can be confident that it will NOT perform +the given overload operation. + +C is an integer enum, one of the values found in F, +for instance C. + +C should be set to AMG_unary for unary operations. + +=cut +*/ +bool +Perl_amagic_applies(pTHX_ SV *sv, int method, int flags) +{ + PERL_ARGS_ASSERT_AMAGIC_APPLIES; + PERL_UNUSED_VAR(flags); + + assert(method >= 0 && method < NofAMmeth); + + if (!SvAMAGIC(sv)) + return FALSE; + + HV *stash = SvSTASH(SvRV(sv)); + if (!Gv_AMG(stash)) + return FALSE; + + MAGIC *mg = mg_find((const SV *)stash, PERL_MAGIC_overload_table); + if (!mg) + return FALSE; + + CV **cvp = NULL; + AMT *amtp = NULL; + if (AMT_AMAGIC((AMT *)mg->mg_ptr)) { + amtp = (AMT *)mg->mg_ptr; + cvp = amtp->table; + } + if (!cvp) + return FALSE; + + if (cvp[method]) + return TRUE; + + /* Note this logic should be kept in sync with amagic_call() */ + if (amtp->fallback > AMGfallNEVER && flags & AMGf_unary) { + CV *cv; /* This makes it easier to kee ... */ + int off,off1; /* ... in sync with amagic_call() */ + + /* look for substituted methods */ + /* In all the covered cases we should be called with assign==0. */ + switch (method) { + case inc_amg: + if ((cv = cvp[off=add_ass_amg]) || ((cv = cvp[off = add_amg]))) + return TRUE; + break; + case dec_amg: + if((cv = cvp[off = subtr_ass_amg]) || ((cv = cvp[off = subtr_amg]))) + return TRUE; + break; + case bool__amg: + if ((cv = cvp[off=numer_amg]) || (cv = cvp[off=string_amg])) + return TRUE; + break; + case numer_amg: + if((cv = cvp[off=string_amg]) || (cv = cvp[off=bool__amg])) + return TRUE; + break; + case string_amg: + if((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg])) + return TRUE; + break; + case not_amg: + if((cv = cvp[off=bool__amg]) + || (cv = cvp[off=numer_amg]) + || (cv = cvp[off=string_amg])) + return TRUE; + break; + case abs_amg: + if((cvp[off1=lt_amg] || cvp[off1=ncmp_amg]) + && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) + return TRUE; + break; + case neg_amg: + if ((cv = cvp[off=subtr_amg])) + return TRUE; + break; + } + } else if (((cvp && amtp->fallback > AMGfallNEVER)) + && !(flags & AMGf_unary)) { + /* We look for substitution for + * comparison operations and + * concatenation */ + if (method==concat_amg || method==concat_ass_amg + || method==repeat_amg || method==repeat_ass_amg) { + return FALSE; /* Delegate operation to string conversion */ + } + switch (method) { + case lt_amg: + case le_amg: + case gt_amg: + case ge_amg: + case eq_amg: + case ne_amg: + if (cvp[ncmp_amg]) + return TRUE; + break; + case slt_amg: + case sle_amg: + case sgt_amg: + case sge_amg: + case seq_amg: + case sne_amg: + if (cvp[scmp_amg]) + return TRUE; + break; + } + } + + if (cvp[nomethod_amg]) + return TRUE; + + return FALSE; +} + + /* Implement tryAMAGICbin_MG macro. Do get magic, then see if the two stack args are overloaded and if so call it. @@ -3448,7 +3640,7 @@ Perl_amagic_deref_call(pTHX_ SV *ref, in return ref; /* return quickly if none of the deref ops are overloaded */ stash = SvSTASH(SvRV(ref)); - assert(SvOOK(stash)); + assert(HvHasAUX(stash)); if (HvAUX(stash)->xhv_aux_flags & HvAUXf_NO_DEREF) return ref; @@ -3560,9 +3752,11 @@ Perl_amagic_call(pTHX_ SV *left, SV *rig #ifdef DEBUGGING fl = 1, #endif - cv = cvp[off=method])))) { + cv = cvp[off=method])))) + { lr = -1; /* Call method for left argument */ } else { + /* Note this logic should be kept in sync with amagic_applies() */ if (cvp && amtp->fallback > AMGfallNEVER && flags & AMGf_unary) { int logic; @@ -3756,7 +3950,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *rig "in overloaded package ": "has no overloaded magic", SvAMAGIC(left)? - SVfARG(sv_2mortal(newSVhek(HvNAME_HEK(SvSTASH(SvRV(left)))))): + SVfARG(newSVhek_mortal(HvNAME_HEK(SvSTASH(SvRV(left))))): SVfARG(&PL_sv_no), SvAMAGIC(right)? ",\n\tright argument in overloaded package ": @@ -3764,7 +3958,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *rig ? "" : ",\n\tright argument has no overloaded magic"), SvAMAGIC(right)? - SVfARG(sv_2mortal(newSVhek(HvNAME_HEK(SvSTASH(SvRV(right)))))): + SVfARG(newSVhek_mortal(HvNAME_HEK(SvSTASH(SvRV(right))))): SVfARG(&PL_sv_no))); if (use_default_op) { DEBUG_o( Perl_deb(aTHX_ "%" SVf, SVfARG(msg)) ); @@ -3850,12 +4044,12 @@ Perl_amagic_call(pTHX_ SV *left, SV *rig flags & AMGf_unary? "" : lr==1 ? " for right argument": " for left argument", flags & AMGf_unary? " for argument" : "", - stash ? SVfARG(sv_2mortal(newSVhek(HvNAME_HEK(stash)))) : SVfARG(newSVpvs_flags("null", SVs_TEMP)), + stash ? SVfARG(newSVhek_mortal(HvNAME_HEK(stash))) : SVfARG(newSVpvs_flags("null", SVs_TEMP)), fl? ",\n\tassignment variant used": "") ); } #endif /* Since we use shallow copy during assignment, we need - * to dublicate the contents, probably calling user-supplied + * to duplicate the contents, probably calling user-supplied * version of copy operator */ /* We need to copy in following cases: @@ -3893,7 +4087,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *rig { dSP; - BINOP myop; + UNOP myop; SV* res; const bool oldcatch = CATCH_GET; I32 oldmark, nret; @@ -3905,10 +4099,11 @@ Perl_amagic_call(pTHX_ SV *left, SV *rig ? G_SCALAR : GIMME_V; CATCH_SET(TRUE); - Zero(&myop, 1, BINOP); - myop.op_last = (OP *) &myop; - myop.op_next = NULL; + Zero(&myop, 1, UNOP); myop.op_flags = OPf_STACKED; + myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB]; + myop.op_type = OP_ENTERSUB; + switch (gimme) { case G_VOID: @@ -3948,9 +4143,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *rig PUSHs(MUTABLE_SV(cv)); PUTBACK; oldmark = TOPMARK; - - if ((PL_op = PL_ppaddr[OP_ENTERSUB](aTHX))) - CALLRUNOPS(aTHX); + CALLRUNOPS(aTHX); LEAVE; SPAGAIN; nret = SP - (PL_stack_base + oldmark); @@ -4022,6 +4215,18 @@ Perl_amagic_call(pTHX_ SV *left, SV *rig } } +/* +=for apidoc gv_name_set + +Set the name for GV C to C which is C bytes long. Thus it may +contain embedded NUL characters. + +If C contains C, the name is treated as being encoded in +UTF-8; otherwise not. + +=cut +*/ + void Perl_gv_name_set(pTHX_ GV *gv, const char *name, U32 len, U32 flags) { @@ -4099,13 +4304,13 @@ Perl_gv_try_downgrade(pTHX_ GV *gv) } else if (GvMULTI(gv) && cv && SvREFCNT(cv) == 1 && !SvOBJECT(cv) && !SvMAGICAL(cv) && !SvREADONLY(cv) && CvSTASH(cv) == stash && !CvNAMED(cv) && CvGV(cv) == gv && - CvCONST(cv) && !CvMETHOD(cv) && !CvLVALUE(cv) && !CvUNIQUE(cv) && + CvCONST(cv) && !CvNOWARN_AMBIGUOUS(cv) && !CvLVALUE(cv) && !CvUNIQUE(cv) && !CvNODEBUG(cv) && !CvCLONE(cv) && !CvCLONED(cv) && !CvANON(cv) && (namehek = GvNAME_HEK(gv)) && (gvp = hv_fetchhek(stash, namehek, 0)) && *gvp == (SV*)gv) { SV *value = SvREFCNT_inc(CvXSUBANY(cv).any_ptr); - const bool imported = !!GvIMPORTED_CV(gv); + const bool imported = cBOOL(GvIMPORTED_CV(gv)); SvREFCNT(gv) = 0; sv_clear((SV*)gv); SvREFCNT(gv) = 1; Index: gnu/usr.bin/perl/gv.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/gv.h,v diff -u -p -a -u -p -r1.17 gv.h --- gnu/usr.bin/perl/gv.h 15 Feb 2023 01:36:13 -0000 1.17 +++ gnu/usr.bin/perl/gv.h 21 Feb 2024 15:47:02 -0000 @@ -28,7 +28,7 @@ struct gp { #if defined (DEBUGGING) && defined(PERL_USE_GCC_BRACE_GROUPS) && !defined(__INTEL_COMPILER) # define GvGP(gv) \ - (0+(*({GV *const _gvgp = (GV *) (gv); \ + ((GP *)(*({GV *const _gvgp = (GV *) (gv); \ assert(SvTYPE(_gvgp) == SVt_PVGV || SvTYPE(_gvgp) == SVt_PVLV); \ assert(isGV_with_GP(_gvgp)); \ &((_gvgp)->sv_u.svu_gp);}))) @@ -134,7 +134,7 @@ Return the CV from the GV. GvGP(gv)->gp_hv : \ GvGP(gv_HVadd(gv))->gp_hv) -#define GvCV(gv) (0+GvGP(gv)->gp_cv) +#define GvCV(gv) ((CV*)GvGP(gv)->gp_cv) #define GvCV_set(gv,cv) (GvGP(gv)->gp_cv = (cv)) #define GvCVGEN(gv) (GvGP(gv)->gp_cvgen) #define GvCVu(gv) (GvGP(gv)->gp_cvgen ? NULL : GvGP(gv)->gp_cv) @@ -162,7 +162,7 @@ Return the CV from the GV. #define GVf_INTRO 0x01 #define GVf_MULTI 0x02 #define GVf_ASSUMECV 0x04 -/* UNUSED 0x08 */ +#define GVf_RESERVED 0x08 /* unused */ #define GVf_IMPORTED 0xF0 #define GVf_IMPORTED_SV 0x10 #define GVf_IMPORTED_AV 0x20 @@ -269,7 +269,7 @@ Return the CV from the GV. #define gv_fetchmethod(stash, name) gv_fetchmethod_autoload(stash, name, TRUE) #define gv_fetchsv_nomg(n,f,t) gv_fetchsv(n,(f)|GV_NO_SVGMAGIC,t) #define gv_init(gv,stash,name,len,multi) \ - gv_init_pvn(gv,stash,name,len,GV_ADDMULTI*!!(multi)) + gv_init_pvn(gv,stash,name,len,GV_ADDMULTI*cBOOL(multi)) #define gv_fetchmeth(stash,name,len,level) gv_fetchmeth_pvn(stash, name, len, level, 0) #define gv_fetchmeth_autoload(stash,name,len,level) gv_fetchmeth_pvn_autoload(stash, name, len, level, 0) #define gv_fetchmethod_flags(stash,name,flags) gv_fetchmethod_pv_flags(stash, name, flags) @@ -281,7 +281,7 @@ Equivalent to C>. =cut */ #define gv_autoload4(stash, name, len, autoload) \ - gv_autoload_pvn(stash, name, len, !!(autoload)) + gv_autoload_pvn(stash, name, len, cBOOL(autoload)) #define newGVgen(pack) newGVgen_flags(pack, 0) #define gv_method_changed(gv) \ ( \ Index: gnu/usr.bin/perl/handy.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/handy.h,v diff -u -p -a -u -p -r1.22 handy.h --- gnu/usr.bin/perl/handy.h 8 Jul 2023 14:18:35 -0000 1.22 +++ gnu/usr.bin/perl/handy.h 21 Feb 2024 15:47:02 -0000 @@ -70,13 +70,13 @@ from it, and are very unlikely to change /* =for apidoc_section $SV -=for apidoc Am|void *|MUTABLE_PTR|void * p -=for apidoc_item |AV *|MUTABLE_AV|AV * p -=for apidoc_item |CV *|MUTABLE_CV|CV * p -=for apidoc_item |GV *|MUTABLE_GV|GV * p -=for apidoc_item |HV *|MUTABLE_HV|HV * p -=for apidoc_item |IO *|MUTABLE_IO|IO * p -=for apidoc_item |SV *|MUTABLE_SV|SV * p +=for apidoc Am |AV * |MUTABLE_AV |AV * p +=for apidoc_item |CV * |MUTABLE_CV |CV * p +=for apidoc_item |GV * |MUTABLE_GV |GV * p +=for apidoc_item |HV * |MUTABLE_HV |HV * p +=for apidoc_item |IO * |MUTABLE_IO |IO * p +=for apidoc_item |void *|MUTABLE_PTR|void * p +=for apidoc_item |SV * |MUTABLE_SV |SV * p The C>() macros cast pointers to the types shown, in such a way (compiler permitting) that casting away const-ness will give a warning; @@ -91,8 +91,10 @@ C is the base macro used to already-built-in ones return pointers to what their names indicate. =cut - */ +The brace group version will raise a diagnostic if 'p' is const; the other +blindly casts away const. + */ #if defined(PERL_USE_GCC_BRACE_GROUPS) # define MUTABLE_PTR(p) ({ void *p_ = (p); p_; }) #else @@ -106,6 +108,34 @@ already-built-in ones return pointers to #define MUTABLE_IO(p) ((IO *)MUTABLE_PTR(p)) #define MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p)) +/* +=for apidoc_section $SV +=for apidoc Am |AV *|AV_FROM_REF|SV * ref +=for apidoc_item |CV *|CV_FROM_REF|SV * ref +=for apidoc_item |HV *|HV_FROM_REF|SV * ref + +The CV_FROM_REF> macros extract the C from a given reference SV +and return a suitably-cast to pointer to the referenced SV. When running +under C<-DDEBUGGING>, assertions are also applied that check that I is +definitely a reference SV that refers to an SV of the right type. + +=cut +*/ + +#if defined(DEBUGGING) && defined(PERL_USE_GCC_BRACE_GROUPS) +# define xV_FROM_REF(XV, ref) \ + ({ SV *_ref = ref; \ + assert(SvROK(_ref)); \ + assert(SvTYPE(SvRV(_ref)) == SVt_PV ## XV); \ + (XV *)(SvRV(_ref)); }) +#else +# define xV_FROM_REF(XV, ref) ((XV *)(SvRV(ref))) +#endif + +#define AV_FROM_REF(ref) xV_FROM_REF(AV, ref) +#define CV_FROM_REF(ref) xV_FROM_REF(CV, ref) +#define HV_FROM_REF(ref) xV_FROM_REF(HV, ref) + #ifndef __cplusplus # include #endif @@ -130,10 +160,13 @@ required, but is kept for backwards comp * XXX Similarly, a Configure probe for __FILE__ and __LINE__ is needed. */ #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__SUNPRO_C)) /* C99 or close enough. */ # define FUNCTION__ __func__ -#elif (defined(__DECC_VER)) /* Tru64 or VMS, and strict C89 being used, but not modern enough cc (in Tur64, -c99 not known, only -std1). */ -# define FUNCTION__ "" +# define SAFE_FUNCTION__ __func__ +#elif (defined(__DECC_VER)) /* Tru64 or VMS, and strict C89 being used, but not modern enough cc (in Tru64, -c99 not known, only -std1). */ +# define FUNCTION__ ("") +# define SAFE_FUNCTION__ ("UNKNOWN") #else # define FUNCTION__ __FUNCTION__ /* Common extension. */ +# define SAFE_FUNCTION__ __FUNCTION__ /* Common extension. */ #endif /* XXX A note on the perl source internal type system. The @@ -270,17 +303,17 @@ don't, so that you can portably take adv =cut */ -# ifdef I_STDINT +#ifdef I_STDINT typedef int_fast8_t PERL_INT_FAST8_T; typedef uint_fast8_t PERL_UINT_FAST8_T; typedef int_fast16_t PERL_INT_FAST16_T; typedef uint_fast16_t PERL_UINT_FAST16_T; -# else +#else typedef int PERL_INT_FAST8_T; typedef unsigned int PERL_UINT_FAST8_T; typedef int PERL_INT_FAST16_T; typedef unsigned int PERL_UINT_FAST16_T; -# endif +#endif /* log(2) (i.e., log base 10 of 2) is pretty close to 0.30103, just in case * anyone is grepping for it. So BIT_DIGITS gives the number of decimal digits @@ -395,12 +428,6 @@ string/length pair. =for apidoc Am|SV**|hv_fetchs|HV* tb|"key"|I32 lval Like C, but takes a literal string instead of a string/length pair. - -=for apidoc Am|SV**|hv_stores|HV* tb|"key"|SV* val -Like C, but takes a literal string instead of a -string/length pair -and omits the hash parameter. - =for apidoc_section $lexer =for apidoc Amx|void|lex_stuff_pvs|"pv"|U32 flags @@ -454,8 +481,6 @@ Perl_xxx(aTHX_ ...) form for any API cal #define gv_fetchpvs(namebeg, flags, sv_type) \ Perl_gv_fetchpvn_flags(aTHX_ STR_WITH_LEN(namebeg), flags, sv_type) #define gv_fetchpvn gv_fetchpvn_flags -#define sv_catxmlpvs(dsv, str, utf8) \ - Perl_sv_catxmlpvn(aTHX_ dsv, STR_WITH_LEN(str), utf8) #define lex_stuff_pvs(pv,flags) Perl_lex_stuff_pvn(aTHX_ STR_WITH_LEN(pv), flags) @@ -491,11 +516,11 @@ Perl_xxx(aTHX_ ...) form for any API cal /* =for apidoc_section $versioning =for apidoc AmR|bool|PERL_VERSION_EQ|const U8 major|const U8 minor|const U8 patch -=for apidoc_item PERL_VERSION_NE -=for apidoc_item PERL_VERSION_LT -=for apidoc_item PERL_VERSION_LE -=for apidoc_item PERL_VERSION_GT =for apidoc_item PERL_VERSION_GE +=for apidoc_item PERL_VERSION_GT +=for apidoc_item PERL_VERSION_LE +=for apidoc_item PERL_VERSION_LT +=for apidoc_item PERL_VERSION_NE Returns whether or not the perl currently being compiled has the specified relationship to the perl given by the parameters. For example, @@ -618,7 +643,7 @@ C gives the number of bytes in C Returns true or false. =for apidoc Am|bool|memCHRs|"list"|char c -Returns the position of the first occurence of the byte C in the literal +Returns the position of the first occurrence of the byte C in the literal string C<"list">, or NULL if C doesn't appear in C<"list">. All bytes are treated as unsigned char. Thus this macro can be used to determine if C is in a set of particular characters. Unlike L, it works even if C @@ -725,12 +750,12 @@ based on the underlying C library functi * it comes to /\w+/ with tainting enabled, we *must* be able * to trust our character classes. * - * Therefore, the default tests in the text of Perl will be - * independent of locale. Any code that wants to depend on - * the current locale will use the tests that begin with "lc". + * Therefore, the default tests in the text of Perl will be independent of + * locale. Any code that wants to depend on the current locale will use the + * macros that contain _LC in their names */ -#ifdef USE_LOCALE +#ifdef USE_LOCALE_CTYPE # ifndef CTYPE256 # define CTYPE256 # endif @@ -814,13 +839,13 @@ future releases. =for apidoc Am|bool|isALPHA|UV ch =for apidoc_item ||isALPHA_A|UV ch -=for apidoc_item ||isALPHA_L1|UV ch -=for apidoc_item ||isALPHA_uvchr|UV ch -=for apidoc_item ||isALPHA_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isALPHA_utf8|U8 * s|U8 * end =for apidoc_item ||isALPHA_LC|UV ch -=for apidoc_item ||isALPHA_LC_uvchr|UV ch =for apidoc_item ||isALPHA_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isALPHA_LC_uvchr|UV ch +=for apidoc_item ||isALPHA_L1|UV ch +=for apidoc_item ||isALPHA_utf8|U8 * s|U8 * end +=for apidoc_item ||isALPHA_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isALPHA_uvchr|UV ch Returns a boolean indicating whether the specified input is one of C<[A-Za-z]>, analogous to C. See the L for an explanation of @@ -833,38 +858,39 @@ that would be interested in them, such a =for apidoc Am|bool|isALPHANUMERIC|UV ch =for apidoc_item ||isALPHANUMERIC_A|UV ch -=for apidoc_item ||isALPHANUMERIC_L1|UV ch -=for apidoc_item ||isALPHANUMERIC_uvchr|UV ch -=for apidoc_item ||isALPHANUMERIC_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isALPHANUMERIC_utf8|U8 * s|U8 * end =for apidoc_item ||isALPHANUMERIC_LC|UV ch -=for apidoc_item ||isALPHANUMERIC_LC_uvchr|UV ch =for apidoc_item ||isALPHANUMERIC_LC_utf8_safe|U8 * s| U8 *end -=for apidoc_item ||isALNUMC|UV ch -=for apidoc_item ||isALNUMC_A|UV ch -=for apidoc_item ||isALNUMC_L1|UV ch -=for apidoc_item ||isALNUMC_LC|UV ch -=for apidoc_item ||isALNUMC_LC_uvchr|UV ch +=for apidoc_item ||isALPHANUMERIC_LC_uvchr|UV ch +=for apidoc_item ||isALPHANUMERIC_L1|UV ch +=for apidoc_item ||isALPHANUMERIC_utf8|U8 * s|U8 * end +=for apidoc_item ||isALPHANUMERIC_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isALPHANUMERIC_uvchr|UV ch Returns a boolean indicating whether the specified character is one of C<[A-Za-z0-9]>, analogous to C. See the L for an explanation of the variants. -A (discouraged from use) synonym is C (where the C suffix means -this corresponds to the C language alphanumeric definition). Also -there are the variants -C, C -C, and C. +=for apidoc Am|bool|isALNUMC|UV ch +=for apidoc_item ||isALNUMC_A|UV ch +=for apidoc_item ||isALNUMC_LC|UV ch +=for apidoc_item ||isALNUMC_LC_uvchr|UV ch +=for apidoc_item ||isALNUMC_L1|UV ch +These are discouraged, backward compatibility macros for L>. +That is, each returns a boolean indicating whether the specified character is +one of C<[A-Za-z0-9]>, analogous to C. + +The C suffix in the names was meant to indicate that they correspond to the +C language L>. =for apidoc Am|bool|isASCII|UV ch =for apidoc_item ||isASCII_A|UV ch -=for apidoc_item ||isASCII_L1|UV ch -=for apidoc_item ||isASCII_uvchr|UV ch -=for apidoc_item ||isASCII_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isASCII_utf8|U8 * s|U8 * end =for apidoc_item ||isASCII_LC|UV ch -=for apidoc_item ||isASCII_LC_uvchr|UV ch =for apidoc_item ||isASCII_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isASCII_LC_uvchr|UV ch +=for apidoc_item ||isASCII_L1|UV ch +=for apidoc_item ||isASCII_utf8|U8 * s|U8 * end +=for apidoc_item ||isASCII_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isASCII_uvchr|UV ch Returns a boolean indicating whether the specified character is one of the 128 characters in the ASCII character set, analogous to C. On non-ASCII platforms, it returns TRUE iff this @@ -884,13 +910,13 @@ C will work properly =for apidoc Am|bool|isBLANK|UV ch =for apidoc_item ||isBLANK_A|UV ch -=for apidoc_item ||isBLANK_L1|UV ch -=for apidoc_item ||isBLANK_uvchr|UV ch -=for apidoc_item ||isBLANK_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isBLANK_utf8|U8 * s|U8 * end =for apidoc_item ||isBLANK_LC|UV ch -=for apidoc_item ||isBLANK_LC_uvchr|UV ch =for apidoc_item ||isBLANK_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isBLANK_LC_uvchr|UV ch +=for apidoc_item ||isBLANK_L1|UV ch +=for apidoc_item ||isBLANK_utf8|U8 * s|U8 * end +=for apidoc_item ||isBLANK_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isBLANK_uvchr|UV ch Returns a boolean indicating whether the specified character is a character considered to be a blank, analogous to C. See the L for an explanation of @@ -902,13 +928,13 @@ the same as the corresponding ones witho =for apidoc Am|bool|isCNTRL|UV ch =for apidoc_item ||isCNTRL_A|UV ch -=for apidoc_item ||isCNTRL_L1|UV ch -=for apidoc_item ||isCNTRL_uvchr|UV ch -=for apidoc_item ||isCNTRL_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isCNTRL_utf8|U8 * s|U8 * end =for apidoc_item ||isCNTRL_LC|UV ch -=for apidoc_item ||isCNTRL_LC_uvchr|UV ch =for apidoc_item ||isCNTRL_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isCNTRL_LC_uvchr|UV ch +=for apidoc_item ||isCNTRL_L1|UV ch +=for apidoc_item ||isCNTRL_utf8|U8 * s|U8 * end +=for apidoc_item ||isCNTRL_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isCNTRL_uvchr|UV ch Returns a boolean indicating whether the specified character is a control character, analogous to C. @@ -918,13 +944,13 @@ On EBCDIC platforms, you almost always w =for apidoc Am|bool|isDIGIT|UV ch =for apidoc_item ||isDIGIT_A|UV ch -=for apidoc_item ||isDIGIT_L1|UV ch -=for apidoc_item ||isDIGIT_uvchr|UV ch -=for apidoc_item ||isDIGIT_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isDIGIT_utf8|U8 * s|U8 * end =for apidoc_item ||isDIGIT_LC|UV ch -=for apidoc_item ||isDIGIT_LC_uvchr|UV ch =for apidoc_item ||isDIGIT_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isDIGIT_LC_uvchr|UV ch +=for apidoc_item ||isDIGIT_L1|UV ch +=for apidoc_item ||isDIGIT_utf8|U8 * s|U8 * end +=for apidoc_item ||isDIGIT_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isDIGIT_uvchr|UV ch Returns a boolean indicating whether the specified character is a digit, analogous to C. @@ -934,13 +960,13 @@ the variants. =for apidoc Am|bool|isGRAPH|UV ch =for apidoc_item ||isGRAPH_A|UV ch -=for apidoc_item ||isGRAPH_L1|UV ch -=for apidoc_item ||isGRAPH_uvchr|UV ch -=for apidoc_item ||isGRAPH_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isGRAPH_utf8|U8 * s|U8 * end =for apidoc_item ||isGRAPH_LC|UV ch -=for apidoc_item ||isGRAPH_LC_uvchr|UV ch =for apidoc_item ||isGRAPH_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isGRAPH_LC_uvchr|UV ch +=for apidoc_item ||isGRAPH_L1|UV ch +=for apidoc_item ||isGRAPH_utf8|U8 * s|U8 * end +=for apidoc_item ||isGRAPH_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isGRAPH_uvchr|UV ch Returns a boolean indicating whether the specified character is a graphic character, analogous to C. See the L for an explanation of @@ -948,13 +974,13 @@ the variants. =for apidoc Am|bool|isLOWER|UV ch =for apidoc_item ||isLOWER_A|UV ch -=for apidoc_item ||isLOWER_L1|UV ch -=for apidoc_item ||isLOWER_uvchr|UV ch -=for apidoc_item ||isLOWER_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isLOWER_utf8|U8 * s|U8 * end =for apidoc_item ||isLOWER_LC|UV ch -=for apidoc_item ||isLOWER_LC_uvchr|UV ch =for apidoc_item ||isLOWER_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isLOWER_LC_uvchr|UV ch +=for apidoc_item ||isLOWER_L1|UV ch +=for apidoc_item ||isLOWER_utf8|U8 * s|U8 * end +=for apidoc_item ||isLOWER_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isLOWER_uvchr|UV ch Returns a boolean indicating whether the specified character is a lowercase character, analogous to C. See the L for an explanation of @@ -970,13 +996,13 @@ C. =for apidoc Am|bool|isPUNCT|UV ch =for apidoc_item ||isPUNCT_A|UV ch -=for apidoc_item ||isPUNCT_L1|UV ch -=for apidoc_item ||isPUNCT_uvchr|UV ch -=for apidoc_item ||isPUNCT_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isPUNCT_utf8|U8 * s|U8 * end =for apidoc_item ||isPUNCT_LC|UV ch -=for apidoc_item ||isPUNCT_LC_uvchr|UV ch =for apidoc_item ||isPUNCT_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isPUNCT_LC_uvchr|UV ch +=for apidoc_item ||isPUNCT_L1|UV ch +=for apidoc_item ||isPUNCT_utf8|U8 * s|U8 * end +=for apidoc_item ||isPUNCT_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isPUNCT_uvchr|UV ch Returns a boolean indicating whether the specified character is a punctuation character, analogous to C. Note that the definition of what is punctuation isn't as @@ -987,13 +1013,13 @@ the variants. =for apidoc Am|bool|isSPACE|UV ch =for apidoc_item ||isSPACE_A|UV ch -=for apidoc_item ||isSPACE_L1|UV ch -=for apidoc_item ||isSPACE_uvchr|UV ch -=for apidoc_item ||isSPACE_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isSPACE_utf8|U8 * s|U8 * end =for apidoc_item ||isSPACE_LC|UV ch -=for apidoc_item ||isSPACE_LC_uvchr|UV ch =for apidoc_item ||isSPACE_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isSPACE_LC_uvchr|UV ch +=for apidoc_item ||isSPACE_L1|UV ch +=for apidoc_item ||isSPACE_utf8|U8 * s|U8 * end +=for apidoc_item ||isSPACE_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isSPACE_uvchr|UV ch Returns a boolean indicating whether the specified character is a whitespace character. This is analogous to what C matches in a regular expression. Starting in Perl 5.18 @@ -1007,13 +1033,13 @@ the variants. =for apidoc Am|bool|isPSXSPC|UV ch =for apidoc_item ||isPSXSPC_A|UV ch -=for apidoc_item ||isPSXSPC_L1|UV ch -=for apidoc_item ||isPSXSPC_uvchr|UV ch -=for apidoc_item ||isPSXSPC_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isPSXSPC_utf8|U8 * s|U8 * end =for apidoc_item ||isPSXSPC_LC|UV ch -=for apidoc_item ||isPSXSPC_LC_uvchr|UV ch =for apidoc_item ||isPSXSPC_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isPSXSPC_LC_uvchr|UV ch +=for apidoc_item ||isPSXSPC_L1|UV ch +=for apidoc_item ||isPSXSPC_utf8|U8 * s|U8 * end +=for apidoc_item ||isPSXSPC_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isPSXSPC_uvchr|UV ch (short for Posix Space) Starting in 5.18, this is identical in all its forms to the corresponding C macros. @@ -1028,13 +1054,13 @@ the variants. =for apidoc Am|bool|isUPPER|UV ch =for apidoc_item ||isUPPER_A|UV ch -=for apidoc_item ||isUPPER_L1|UV ch -=for apidoc_item ||isUPPER_uvchr|UV ch -=for apidoc_item ||isUPPER_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isUPPER_utf8|U8 * s|U8 * end =for apidoc_item ||isUPPER_LC|UV ch -=for apidoc_item ||isUPPER_LC_uvchr|UV ch =for apidoc_item ||isUPPER_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isUPPER_LC_uvchr|UV ch +=for apidoc_item ||isUPPER_L1|UV ch +=for apidoc_item ||isUPPER_utf8|U8 * s|U8 * end +=for apidoc_item ||isUPPER_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isUPPER_uvchr|UV ch Returns a boolean indicating whether the specified character is an uppercase character, analogous to C. See the L for an explanation of @@ -1042,13 +1068,13 @@ the variants. =for apidoc Am|bool|isPRINT|UV ch =for apidoc_item ||isPRINT_A|UV ch -=for apidoc_item ||isPRINT_L1|UV ch -=for apidoc_item ||isPRINT_uvchr|UV ch -=for apidoc_item ||isPRINT_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isPRINT_utf8|U8 * s|U8 * end =for apidoc_item ||isPRINT_LC|UV ch -=for apidoc_item ||isPRINT_LC_uvchr|UV ch =for apidoc_item ||isPRINT_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isPRINT_LC_uvchr|UV ch +=for apidoc_item ||isPRINT_L1|UV ch +=for apidoc_item ||isPRINT_utf8|U8 * s|U8 * end +=for apidoc_item ||isPRINT_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isPRINT_uvchr|UV ch Returns a boolean indicating whether the specified character is a printable character, analogous to C. See the L for an explanation of @@ -1056,41 +1082,48 @@ the variants. =for apidoc Am|bool|isWORDCHAR|UV ch =for apidoc_item ||isWORDCHAR_A|UV ch -=for apidoc_item ||isWORDCHAR_L1|UV ch -=for apidoc_item ||isWORDCHAR_uvchr|UV ch -=for apidoc_item ||isWORDCHAR_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isWORDCHAR_utf8|U8 * s|U8 * end =for apidoc_item ||isWORDCHAR_LC|UV ch -=for apidoc_item ||isWORDCHAR_LC_uvchr|UV ch =for apidoc_item ||isWORDCHAR_LC_utf8_safe|U8 * s| U8 *end -=for apidoc_item ||isALNUM|UV ch -=for apidoc_item ||isALNUM_A|UV ch -=for apidoc_item ||isALNUM_LC|UV ch -=for apidoc_item ||isALNUM_LC_uvchr|UV ch +=for apidoc_item ||isWORDCHAR_LC_uvchr|UV ch +=for apidoc_item ||isWORDCHAR_L1|UV ch +=for apidoc_item ||isWORDCHAR_utf8|U8 * s|U8 * end +=for apidoc_item ||isWORDCHAR_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isWORDCHAR_uvchr|UV ch Returns a boolean indicating whether the specified character is a character that is a word character, analogous to what C and C match in a regular expression. A word character is an alphabetic character, a decimal digit, a connecting punctuation character (such as an underscore), or a "mark" character that attaches to one of those (like some sort of accent). -C is a synonym provided for backward compatibility, even though a -word character includes more than the standard C language meaning of -alphanumeric. + See the L for an explanation of the variants. + C, C, C, C, C, C, and C are also as described there, but additionally include the platform's native underscore. +=for apidoc Am|bool|isALNUM |UV ch +=for apidoc_item ||isALNUM_A |UV ch +=for apidoc_item ||isALNUM_LC |UV ch +=for apidoc_item ||isALNUM_LC_uvchr|UV ch +These are each a synonym for their respectively named L> +variant. + +They are provided for backward compatibility, even though a word character +includes more than the standard C language meaning of alphanumeric. +To get the C language definition, use the corresponding L> +variant. + =for apidoc Am|bool|isXDIGIT|UV ch =for apidoc_item ||isXDIGIT_A|UV ch -=for apidoc_item ||isXDIGIT_L1|UV ch -=for apidoc_item ||isXDIGIT_uvchr|UV ch -=for apidoc_item ||isXDIGIT_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isXDIGIT_utf8|U8 * s|U8 * end =for apidoc_item ||isXDIGIT_LC|UV ch -=for apidoc_item ||isXDIGIT_LC_uvchr|UV ch =for apidoc_item ||isXDIGIT_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isXDIGIT_LC_uvchr|UV ch +=for apidoc_item ||isXDIGIT_L1|UV ch +=for apidoc_item ||isXDIGIT_utf8|U8 * s|U8 * end +=for apidoc_item ||isXDIGIT_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isXDIGIT_uvchr|UV ch Returns a boolean indicating whether the specified character is a hexadecimal digit. In the ASCII range these are C<[0-9A-Fa-f]>. Variants C and C are identical to C. @@ -1099,13 +1132,13 @@ the variants. =for apidoc Am|bool|isIDFIRST|UV ch =for apidoc_item ||isIDFIRST_A|UV ch -=for apidoc_item ||isIDFIRST_L1|UV ch -=for apidoc_item ||isIDFIRST_uvchr|UV ch -=for apidoc_item ||isIDFIRST_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isIDFIRST_utf8|U8 * s|U8 * end =for apidoc_item ||isIDFIRST_LC|UV ch -=for apidoc_item ||isIDFIRST_LC_uvchr|UV ch =for apidoc_item ||isIDFIRST_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isIDFIRST_LC_uvchr|UV ch +=for apidoc_item ||isIDFIRST_L1|UV ch +=for apidoc_item ||isIDFIRST_utf8|U8 * s|U8 * end +=for apidoc_item ||isIDFIRST_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isIDFIRST_uvchr|UV ch Returns a boolean indicating whether the specified character can be the first character of an identifier. This is very close to, but not quite the same as the official Unicode property C. The difference is that this @@ -1115,13 +1148,13 @@ the variants. =for apidoc Am|bool|isIDCONT|UV ch =for apidoc_item ||isIDCONT_A|UV ch -=for apidoc_item ||isIDCONT_L1|UV ch -=for apidoc_item ||isIDCONT_uvchr|UV ch -=for apidoc_item ||isIDCONT_utf8_safe|U8 * s|U8 * end -=for apidoc_item ||isIDCONT_utf8|U8 * s|U8 * end =for apidoc_item ||isIDCONT_LC|UV ch -=for apidoc_item ||isIDCONT_LC_uvchr|UV ch =for apidoc_item ||isIDCONT_LC_utf8_safe|U8 * s| U8 *end +=for apidoc_item ||isIDCONT_LC_uvchr|UV ch +=for apidoc_item ||isIDCONT_L1|UV ch +=for apidoc_item ||isIDCONT_utf8|U8 * s|U8 * end +=for apidoc_item ||isIDCONT_utf8_safe|U8 * s|U8 * end +=for apidoc_item ||isIDCONT_uvchr|UV ch Returns a boolean indicating whether the specified character can be the second or succeeding character of an identifier. This is very close to, but not quite the same as the official Unicode property C. The @@ -1149,9 +1182,9 @@ results for the full range of possible i =for apidoc Am|UV|toUPPER|UV cp =for apidoc_item |UV|toUPPER_A|UV cp -=for apidoc_item |UV|toUPPER_uvchr|UV cp|U8* s|STRLEN* lenp =for apidoc_item |UV|toUPPER_utf8|U8* p|U8* e|U8* s|STRLEN* lenp =for apidoc_item |UV|toUPPER_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp +=for apidoc_item |UV|toUPPER_uvchr|UV cp|U8* s|STRLEN* lenp These all return the uppercase of a character. The differences are what domain they operate on, and whether the input is specified as a code point (those @@ -1198,9 +1231,9 @@ change in future releases. =for apidoc Am|UV|toFOLD|UV cp =for apidoc_item |UV|toFOLD_A|UV cp -=for apidoc_item |UV|toFOLD_uvchr|UV cp|U8* s|STRLEN* lenp =for apidoc_item |UV|toFOLD_utf8|U8* p|U8* e|U8* s|STRLEN* lenp =for apidoc_item |UV|toFOLD_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp +=for apidoc_item |UV|toFOLD_uvchr|UV cp|U8* s|STRLEN* lenp These all return the foldcase of a character. "foldcase" is an internal case for C pattern matching. If the foldcase of character A and the foldcase of @@ -1252,12 +1285,12 @@ change in future releases. =for apidoc Am|UV|toLOWER|UV cp =for apidoc_item |UV|toLOWER_A|UV cp -=for apidoc_item |UV|toLOWER_L1|UV cp =for apidoc_item |UV|toLOWER_LATIN1|UV cp =for apidoc_item |UV|toLOWER_LC|UV cp -=for apidoc_item |UV|toLOWER_uvchr|UV cp|U8* s|STRLEN* lenp +=for apidoc_item |UV|toLOWER_L1|UV cp =for apidoc_item |UV|toLOWER_utf8|U8* p|U8* e|U8* s|STRLEN* lenp =for apidoc_item |UV|toLOWER_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp +=for apidoc_item |UV|toLOWER_uvchr|UV cp|U8* s|STRLEN* lenp These all return the lowercase of a character. The differences are what domain they operate on, and whether the input is specified as a code point (those @@ -1309,9 +1342,9 @@ change in future releases. =for apidoc Am|UV|toTITLE|UV cp =for apidoc_item |UV|toTITLE_A|UV cp -=for apidoc_item |UV|toTITLE_uvchr|UV cp|U8* s|STRLEN* lenp =for apidoc_item |UV|toTITLE_utf8|U8* p|U8* e|U8* s|STRLEN* lenp =for apidoc_item |UV|toTITLE_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp +=for apidoc_item |UV|toTITLE_uvchr|UV cp|U8* s|STRLEN* lenp These all return the titlecase of a character. The differences are what domain they operate on, and whether the input is specified as a code point (those @@ -1362,6 +1395,7 @@ change in future releases. XXX Still undocumented isVERTWS_uvchr and _utf8; it's unclear what their names really should be. Also toUPPER_LC and toFOLD_LC, which are subject to change, and aren't general purpose as they don't work on U+DF, and assert against that. +and isCASED_LC, as it really is more of an internal thing. Note that these macros are repeated in Devel::PPPort, so should also be patched there. The file as of this writing is cpan/Devel-PPPort/parts/inc/misc @@ -1385,11 +1419,7 @@ or casts =cut */ -#ifdef QUADKIND -# define WIDEST_UTYPE U64 -#else -# define WIDEST_UTYPE U32 -#endif +#define WIDEST_UTYPE PERL_UINTMAX_T /* Where there could be some confusion, use this as a static assert in macros * to make sure that a parameter isn't a pointer. But some compilers can't @@ -1403,7 +1433,10 @@ or casts #endif /* Likewise, this is effectively a static assert to be used to guarantee the - * parameter is a pointer */ + * parameter is a pointer + * + * NOT suitable for void* + */ #define ASSERT_IS_PTR(x) (__ASSERT_(sizeof(*(x))) (x)) /* FITS_IN_8_BITS(c) returns true if c doesn't have a bit set other than in @@ -1489,7 +1522,7 @@ or casts /* Character class numbers. For internal core Perl use only. The ones less * than 32 are used in PL_charclass[] and the ones up through the one that - * corresponds to <_HIGHEST_REGCOMP_DOT_H_SYNC> are used by regcomp.h and + * corresponds to are used by regcomp.h and * related files. PL_charclass ones use names used in l1_char_class_tab.h but * their actual definitions are here. If that file has a name not used here, * it won't compile. @@ -1503,37 +1536,37 @@ or casts * to group these which have no members that match above Latin1, (or above * ASCII in the latter case) */ -# define _CC_WORDCHAR 0 /* \w and [:word:] */ -# define _CC_DIGIT 1 /* \d and [:digit:] */ -# define _CC_ALPHA 2 /* [:alpha:] */ -# define _CC_LOWER 3 /* [:lower:] */ -# define _CC_UPPER 4 /* [:upper:] */ -# define _CC_PUNCT 5 /* [:punct:] */ -# define _CC_PRINT 6 /* [:print:] */ -# define _CC_ALPHANUMERIC 7 /* [:alnum:] */ -# define _CC_GRAPH 8 /* [:graph:] */ -# define _CC_CASED 9 /* [:lower:] or [:upper:] under /i */ -# define _CC_SPACE 10 /* \s, [:space:] */ -# define _CC_BLANK 11 /* [:blank:] */ -# define _CC_XDIGIT 12 /* [:xdigit:] */ -# define _CC_CNTRL 13 /* [:cntrl:] */ -# define _CC_ASCII 14 /* [:ascii:] */ -# define _CC_VERTSPACE 15 /* \v */ +# define CC_WORDCHAR_ 0 /* \w and [:word:] */ +# define CC_DIGIT_ 1 /* \d and [:digit:] */ +# define CC_ALPHA_ 2 /* [:alpha:] */ +# define CC_LOWER_ 3 /* [:lower:] */ +# define CC_UPPER_ 4 /* [:upper:] */ +# define CC_PUNCT_ 5 /* [:punct:] */ +# define CC_PRINT_ 6 /* [:print:] */ +# define CC_ALPHANUMERIC_ 7 /* [:alnum:] */ +# define CC_GRAPH_ 8 /* [:graph:] */ +# define CC_CASED_ 9 /* [:lower:] or [:upper:] under /i */ +# define CC_SPACE_ 10 /* \s, [:space:] */ +# define CC_BLANK_ 11 /* [:blank:] */ +# define CC_XDIGIT_ 12 /* [:xdigit:] */ +# define CC_CNTRL_ 13 /* [:cntrl:] */ +# define CC_ASCII_ 14 /* [:ascii:] */ +# define CC_VERTSPACE_ 15 /* \v */ -# define _HIGHEST_REGCOMP_DOT_H_SYNC _CC_VERTSPACE +# define HIGHEST_REGCOMP_DOT_H_SYNC_ CC_VERTSPACE_ /* The members of the third group below do not need to be coordinated with data * structures in regcomp.[ch] and regexec.c. */ -# define _CC_IDFIRST 16 -# define _CC_CHARNAME_CONT 17 -# define _CC_NONLATIN1_FOLD 18 -# define _CC_NONLATIN1_SIMPLE_FOLD 19 -# define _CC_QUOTEMETA 20 -# define _CC_NON_FINAL_FOLD 21 -# define _CC_IS_IN_SOME_FOLD 22 -# define _CC_BINDIGIT 23 -# define _CC_OCTDIGIT 24 -# define _CC_MNEMONIC_CNTRL 25 +# define CC_IDFIRST_ 16 +# define CC_CHARNAME_CONT_ 17 +# define CC_NONLATIN1_FOLD_ 18 +# define CC_NONLATIN1_SIMPLE_FOLD_ 19 +# define CC_QUOTEMETA_ 20 +# define CC_NON_FINAL_FOLD_ 21 +# define CC_IS_IN_SOME_FOLD_ 22 +# define CC_BINDIGIT_ 23 +# define CC_OCTDIGIT_ 24 +# define CC_MNEMONIC_CNTRL_ 25 /* Unused: 26-31 * If more bits are needed, one could add a second word for non-64bit @@ -1550,26 +1583,26 @@ or casts /* An enum version of the character class numbers, to help compilers * optimize */ typedef enum { - _CC_ENUM_ALPHA = _CC_ALPHA, - _CC_ENUM_ALPHANUMERIC = _CC_ALPHANUMERIC, - _CC_ENUM_ASCII = _CC_ASCII, - _CC_ENUM_BLANK = _CC_BLANK, - _CC_ENUM_CASED = _CC_CASED, - _CC_ENUM_CNTRL = _CC_CNTRL, - _CC_ENUM_DIGIT = _CC_DIGIT, - _CC_ENUM_GRAPH = _CC_GRAPH, - _CC_ENUM_LOWER = _CC_LOWER, - _CC_ENUM_PRINT = _CC_PRINT, - _CC_ENUM_PUNCT = _CC_PUNCT, - _CC_ENUM_SPACE = _CC_SPACE, - _CC_ENUM_UPPER = _CC_UPPER, - _CC_ENUM_VERTSPACE = _CC_VERTSPACE, - _CC_ENUM_WORDCHAR = _CC_WORDCHAR, - _CC_ENUM_XDIGIT = _CC_XDIGIT -} _char_class_number; + CC_ENUM_ALPHA_ = CC_ALPHA_, + CC_ENUM_ALPHANUMERIC_ = CC_ALPHANUMERIC_, + CC_ENUM_ASCII_ = CC_ASCII_, + CC_ENUM_BLANK_ = CC_BLANK_, + CC_ENUM_CASED_ = CC_CASED_, + CC_ENUM_CNTRL_ = CC_CNTRL_, + CC_ENUM_DIGIT_ = CC_DIGIT_, + CC_ENUM_GRAPH_ = CC_GRAPH_, + CC_ENUM_LOWER_ = CC_LOWER_, + CC_ENUM_PRINT_ = CC_PRINT_, + CC_ENUM_PUNCT_ = CC_PUNCT_, + CC_ENUM_SPACE_ = CC_SPACE_, + CC_ENUM_UPPER_ = CC_UPPER_, + CC_ENUM_VERTSPACE_ = CC_VERTSPACE_, + CC_ENUM_WORDCHAR_ = CC_WORDCHAR_, + CC_ENUM_XDIGIT_ = CC_XDIGIT_ +} char_class_number_; #endif -#define POSIX_CC_COUNT (_HIGHEST_REGCOMP_DOT_H_SYNC + 1) +#define POSIX_CC_COUNT (HIGHEST_REGCOMP_DOT_H_SYNC_ + 1) START_EXTERN_C # ifdef DOINIT @@ -1583,32 +1616,32 @@ EXTCONST U32 PL_charclass[]; END_EXTERN_C /* The 1U keeps Solaris from griping when shifting sets the uppermost bit */ -# define _CC_mask(classnum) (1U << (classnum)) +# define CC_mask_(classnum) (1U << (classnum)) /* For internal core Perl use only: the base macro for defining macros like * isALPHA */ -# define _generic_isCC(c, classnum) cBOOL(FITS_IN_8_BITS(c) \ - && (PL_charclass[(U8) (c)] & _CC_mask(classnum))) +# define generic_isCC_(c, classnum) cBOOL(FITS_IN_8_BITS(c) \ + && (PL_charclass[(U8) (c)] & CC_mask_(classnum))) /* The mask for the _A versions of the macros; it just adds in the bit for * ASCII. */ -# define _CC_mask_A(classnum) (_CC_mask(classnum) | _CC_mask(_CC_ASCII)) +# define CC_mask_A_(classnum) (CC_mask_(classnum) | CC_mask_(CC_ASCII_)) /* For internal core Perl use only: the base macro for defining macros like * isALPHA_A. The foo_A version makes sure that both the desired bit and * the ASCII bit are present */ -# define _generic_isCC_A(c, classnum) (FITS_IN_8_BITS(c) \ - && ((PL_charclass[(U8) (c)] & _CC_mask_A(classnum)) \ - == _CC_mask_A(classnum))) +# define generic_isCC_A_(c, classnum) (FITS_IN_8_BITS(c) \ + && ((PL_charclass[(U8) (c)] & CC_mask_A_(classnum)) \ + == CC_mask_A_(classnum))) /* On ASCII platforms certain classes form a single range. It's faster to * special case these. isDIGIT is a single range on all platforms */ # ifdef EBCDIC -# define isALPHA_A(c) _generic_isCC_A(c, _CC_ALPHA) -# define isGRAPH_A(c) _generic_isCC_A(c, _CC_GRAPH) -# define isLOWER_A(c) _generic_isCC_A(c, _CC_LOWER) -# define isPRINT_A(c) _generic_isCC_A(c, _CC_PRINT) -# define isUPPER_A(c) _generic_isCC_A(c, _CC_UPPER) +# define isALPHA_A(c) generic_isCC_A_(c, CC_ALPHA_) +# define isGRAPH_A(c) generic_isCC_A_(c, CC_GRAPH_) +# define isLOWER_A(c) generic_isCC_A_(c, CC_LOWER_) +# define isPRINT_A(c) generic_isCC_A_(c, CC_PRINT_) +# define isUPPER_A(c) generic_isCC_A_(c, CC_UPPER_) # else /* By folding the upper and lowercase, we can use a single range */ # define isALPHA_A(c) inRANGE((~('A' ^ 'a') & (c)), 'A', 'Z') @@ -1617,58 +1650,57 @@ END_EXTERN_C # define isPRINT_A(c) inRANGE(c, ' ', 0x7e) # define isUPPER_A(c) inRANGE(c, 'A', 'Z') # endif -# define isALPHANUMERIC_A(c) _generic_isCC_A(c, _CC_ALPHANUMERIC) -# define isBLANK_A(c) _generic_isCC_A(c, _CC_BLANK) -# define isCNTRL_A(c) _generic_isCC_A(c, _CC_CNTRL) +# define isALPHANUMERIC_A(c) generic_isCC_A_(c, CC_ALPHANUMERIC_) +# define isBLANK_A(c) generic_isCC_A_(c, CC_BLANK_) +# define isCNTRL_A(c) generic_isCC_A_(c, CC_CNTRL_) # define isDIGIT_A(c) inRANGE(c, '0', '9') -# define isPUNCT_A(c) _generic_isCC_A(c, _CC_PUNCT) -# define isSPACE_A(c) _generic_isCC_A(c, _CC_SPACE) -# define isWORDCHAR_A(c) _generic_isCC_A(c, _CC_WORDCHAR) -# define isXDIGIT_A(c) _generic_isCC(c, _CC_XDIGIT) /* No non-ASCII xdigits - */ -# define isIDFIRST_A(c) _generic_isCC_A(c, _CC_IDFIRST) -# define isALPHA_L1(c) _generic_isCC(c, _CC_ALPHA) -# define isALPHANUMERIC_L1(c) _generic_isCC(c, _CC_ALPHANUMERIC) -# define isBLANK_L1(c) _generic_isCC(c, _CC_BLANK) +# define isPUNCT_A(c) generic_isCC_A_(c, CC_PUNCT_) +# define isSPACE_A(c) generic_isCC_A_(c, CC_SPACE_) +# define isWORDCHAR_A(c) generic_isCC_A_(c, CC_WORDCHAR_) +# define isXDIGIT_A(c) generic_isCC_(c, CC_XDIGIT_) /* No non-ASCII xdigits */ +# define isIDFIRST_A(c) generic_isCC_A_(c, CC_IDFIRST_) +# define isALPHA_L1(c) generic_isCC_(c, CC_ALPHA_) +# define isALPHANUMERIC_L1(c) generic_isCC_(c, CC_ALPHANUMERIC_) +# define isBLANK_L1(c) generic_isCC_(c, CC_BLANK_) /* continuation character for legal NAME in \N{NAME} */ -# define isCHARNAME_CONT(c) _generic_isCC(c, _CC_CHARNAME_CONT) +# define isCHARNAME_CONT(c) generic_isCC_(c, CC_CHARNAME_CONT_) -# define isCNTRL_L1(c) _generic_isCC(c, _CC_CNTRL) -# define isGRAPH_L1(c) _generic_isCC(c, _CC_GRAPH) -# define isLOWER_L1(c) _generic_isCC(c, _CC_LOWER) -# define isPRINT_L1(c) _generic_isCC(c, _CC_PRINT) +# define isCNTRL_L1(c) generic_isCC_(c, CC_CNTRL_) +# define isGRAPH_L1(c) generic_isCC_(c, CC_GRAPH_) +# define isLOWER_L1(c) generic_isCC_(c, CC_LOWER_) +# define isPRINT_L1(c) generic_isCC_(c, CC_PRINT_) # define isPSXSPC_L1(c) isSPACE_L1(c) -# define isPUNCT_L1(c) _generic_isCC(c, _CC_PUNCT) -# define isSPACE_L1(c) _generic_isCC(c, _CC_SPACE) -# define isUPPER_L1(c) _generic_isCC(c, _CC_UPPER) -# define isWORDCHAR_L1(c) _generic_isCC(c, _CC_WORDCHAR) -# define isIDFIRST_L1(c) _generic_isCC(c, _CC_IDFIRST) +# define isPUNCT_L1(c) generic_isCC_(c, CC_PUNCT_) +# define isSPACE_L1(c) generic_isCC_(c, CC_SPACE_) +# define isUPPER_L1(c) generic_isCC_(c, CC_UPPER_) +# define isWORDCHAR_L1(c) generic_isCC_(c, CC_WORDCHAR_) +# define isIDFIRST_L1(c) generic_isCC_(c, CC_IDFIRST_) # ifdef EBCDIC -# define isASCII(c) _generic_isCC(c, _CC_ASCII) +# define isASCII(c) generic_isCC_(c, CC_ASCII_) # endif /* Participates in a single-character fold with a character above 255 */ -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) -# define HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(c) \ +# if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_REGEXEC_C) +# define HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(c) \ (( ! cBOOL(FITS_IN_8_BITS(c))) \ - || (PL_charclass[(U8) (c)] & _CC_mask(_CC_NONLATIN1_SIMPLE_FOLD))) + || (PL_charclass[(U8) (c)] & CC_mask_(CC_NONLATIN1_SIMPLE_FOLD_))) -# define IS_NON_FINAL_FOLD(c) _generic_isCC(c, _CC_NON_FINAL_FOLD) -# define IS_IN_SOME_FOLD_L1(c) _generic_isCC(c, _CC_IS_IN_SOME_FOLD) +# define IS_NON_FINAL_FOLD(c) generic_isCC_(c, CC_NON_FINAL_FOLD_) +# define IS_IN_SOME_FOLD_L1(c) generic_isCC_(c, CC_IS_IN_SOME_FOLD_) # endif /* Like the above, but also can be part of a multi-char fold */ # define HAS_NONLATIN1_FOLD_CLOSURE(c) \ ( (! cBOOL(FITS_IN_8_BITS(c))) \ - || (PL_charclass[(U8) (c)] & _CC_mask(_CC_NONLATIN1_FOLD))) + || (PL_charclass[(U8) (c)] & CC_mask_(CC_NONLATIN1_FOLD_))) -# define _isQUOTEMETA(c) _generic_isCC(c, _CC_QUOTEMETA) +# define _isQUOTEMETA(c) generic_isCC_(c, CC_QUOTEMETA_) /* is c a control character for which we have a mnemonic? */ # if defined(PERL_CORE) || defined(PERL_EXT) -# define isMNEMONIC_CNTRL(c) _generic_isCC(c, _CC_MNEMONIC_CNTRL) +# define isMNEMONIC_CNTRL(c) generic_isCC_(c, CC_MNEMONIC_CNTRL_) # endif #else /* else we don't have perl.h H_PERL */ @@ -1795,14 +1827,7 @@ END_EXTERN_C /* The following are not fully accurate in the above-ASCII range. I (khw) * don't think it's necessary to be so for the purposes where this gets * compiled */ -# define _isQUOTEMETA(c) (FITS_IN_8_BITS(c) && ! isWORDCHAR_L1(c)) -# define _IS_IN_SOME_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c) isALPHA_L1(c) - - /* And these aren't accurate at all. They are useful only for above - * Latin1, which utilities and bootstrapping don't deal with */ -# define _IS_NON_FINAL_FOLD_ONLY_FOR_USE_BY_REGCOMP_DOT_C(c) 0 -# define _HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(c) 0 -# define _HAS_NONLATIN1_FOLD_CLOSURE_ONLY_FOR_USE_BY_REGCOMP_DOT_C_AND_REGEXEC_DOT_C(c) 0 +# define isQUOTEMETA_(c) (FITS_IN_8_BITS(c) && ! isWORDCHAR_L1(c)) /* Many of the macros later in this file are defined in terms of these. By * implementing them with a function, which converts the class number into @@ -1811,9 +1836,9 @@ END_EXTERN_C * perl.h), and so a compiler error will be generated if one is attempted * to be used. And the above-Latin1 code points require Unicode tables to * be present, something unlikely to be the case when bootstrapping */ -# define _generic_isCC(c, classnum) \ +# define generic_isCC_(c, classnum) \ (FITS_IN_8_BITS(c) && S_bootstrap_ctype((U8) (c), (classnum), TRUE)) -# define _generic_isCC_A(c, classnum) \ +# define generic_isCC_A_(c, classnum) \ (FITS_IN_8_BITS(c) && S_bootstrap_ctype((U8) (c), (classnum), FALSE)) #endif /* End of no perl.h H_PERL */ @@ -1873,181 +1898,242 @@ END_EXTERN_C #define toUPPER_LATIN1_MOD(c) ((! FITS_IN_8_BITS(c)) \ ? (c) \ : PL_mod_latin1_uc[ (U8) (c) ]) -#define IN_UTF8_CTYPE_LOCALE PL_in_utf8_CTYPE_locale +#ifdef USE_LOCALE_CTYPE +# define IN_UTF8_CTYPE_LOCALE PL_in_utf8_CTYPE_locale +# define IN_UTF8_TURKIC_LOCALE PL_in_utf8_turkic_locale +#else +# define IN_UTF8_CTYPE_LOCALE false +# define IN_UTF8_TURKIC_LOCALE false +#endif /* Use foo_LC_uvchr() instead of these for beyond the Latin1 range */ /* For internal core Perl use only: the base macro for defining macros like * isALPHA_LC, which uses the current LC_CTYPE locale. 'c' is the code point * (0-255) to check. In a UTF-8 locale, the result is the same as calling - * isFOO_L1(); the 'utf8_locale_classnum' parameter is something like - * _CC_UPPER, which gives the class number for doing this. For non-UTF-8 - * locales, the code to actually do the test this is passed in 'non_utf8'. If - * 'c' is above 255, 0 is returned. For accessing the full range of possible - * code points under locale rules, use the macros based on _generic_LC_uvchr - * instead of this. */ -#define _generic_LC_base(c, utf8_locale_classnum, non_utf8) \ - (! FITS_IN_8_BITS(c) \ - ? 0 \ - : IN_UTF8_CTYPE_LOCALE \ - ? cBOOL(PL_charclass[(U8) (c)] & _CC_mask(utf8_locale_classnum)) \ - : cBOOL(non_utf8)) - -/* For internal core Perl use only: a helper macro for defining macros like - * isALPHA_LC. 'c' is the code point (0-255) to check. The function name to - * actually do this test is passed in 'non_utf8_func', which is called on 'c', - * casting 'c' to the macro _LC_CAST, which should not be parenthesized. See - * _generic_LC_base for more info */ -#define _generic_LC(c, utf8_locale_classnum, non_utf8_func) \ - _generic_LC_base(c,utf8_locale_classnum, \ - non_utf8_func( (_LC_CAST) (c))) - -/* For internal core Perl use only: like _generic_LC, but also returns TRUE if - * 'c' is the platform's native underscore character */ -#define _generic_LC_underscore(c,utf8_locale_classnum,non_utf8_func) \ - _generic_LC_base(c, utf8_locale_classnum, \ - (non_utf8_func( (_LC_CAST) (c)) \ - || (char)(c) == '_')) - -/* These next three are also for internal core Perl use only: case-change - * helper macros. The reason for using the PL_latin arrays is in case the - * system function is defective; it ensures uniform results that conform to the - * Unicod standard. It does not handle the anomalies in UTF-8 Turkic locales */ -#define _generic_toLOWER_LC(c, function, cast) (! FITS_IN_8_BITS(c) \ - ? (c) \ - : (IN_UTF8_CTYPE_LOCALE) \ - ? PL_latin1_lc[ (U8) (c) ] \ - : (cast)function((cast)(c))) - -/* Note that the result can be larger than a byte in a UTF-8 locale. It - * returns a single value, so can't adequately return the upper case of LATIN - * SMALL LETTER SHARP S in a UTF-8 locale (which should be a string of two - * values "SS"); instead it asserts against that under DEBUGGING, and - * otherwise returns its input. It does not handle the anomalies in UTF-8 - * Turkic locales. */ -#define _generic_toUPPER_LC(c, function, cast) \ - (! FITS_IN_8_BITS(c) \ - ? (c) \ - : ((! IN_UTF8_CTYPE_LOCALE) \ - ? (cast)function((cast)(c)) \ - : ((((U8)(c)) == MICRO_SIGN) \ - ? GREEK_CAPITAL_LETTER_MU \ - : ((((U8)(c)) == LATIN_SMALL_LETTER_Y_WITH_DIAERESIS) \ - ? LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS \ - : ((((U8)(c)) == LATIN_SMALL_LETTER_SHARP_S) \ - ? (__ASSERT_(0) (c)) \ - : PL_mod_latin1_uc[ (U8) (c) ]))))) - -/* Note that the result can be larger than a byte in a UTF-8 locale. It - * returns a single value, so can't adequately return the fold case of LATIN - * SMALL LETTER SHARP S in a UTF-8 locale (which should be a string of two - * values "ss"); instead it asserts against that under DEBUGGING, and - * otherwise returns its input. It does not handle the anomalies in UTF-8 - * Turkic locales */ -#define _generic_toFOLD_LC(c, function, cast) \ - ((UNLIKELY((c) == MICRO_SIGN) && IN_UTF8_CTYPE_LOCALE) \ - ? GREEK_SMALL_LETTER_MU \ - : (__ASSERT_(! IN_UTF8_CTYPE_LOCALE \ - || (c) != LATIN_SMALL_LETTER_SHARP_S) \ - _generic_toLOWER_LC(c, function, cast))) - -/* Use the libc versions for these if available. */ + * isFOO_L1(); 'classnum' is something like CC_UPPER_, which gives the class + * number for doing this. For non-UTF-8 locales, the code to actually do the + * test this is passed in 'non_utf8'. If 'c' is above 255, 0 is returned. For + * accessing the full range of possible code points under locale rules, use the + * macros based on generic_LC_uvchr_ instead of this. */ +#define generic_LC_base_(c, classnum, non_utf8_func) \ + (! FITS_IN_8_BITS(c) \ + ? 0 \ + : IN_UTF8_CTYPE_LOCALE \ + ? cBOOL(PL_charclass[(U8) (c)] & CC_mask_(classnum)) \ + : cBOOL(non_utf8_func(c))) + +/* A helper macro for defining macros like isALPHA_LC. On systems without + * proper locales, these reduce to, e.g., isALPHA_A */ +#ifdef CTYPE256 +# define generic_LC_(c, classnum, non_utf8_func) \ + generic_LC_base_(c, classnum, non_utf8_func) +#else +# define generic_LC_(c, classnum, non_utf8_func) \ + generic_isCC_A_(c, classnum) +#endif + +/* Below are the definitions for the locale-sensitive character classification + * macros whose input domain is a byte, and the locale isn't UTF-8. These are + * as close as possible to the bare versions on the platform and still yield + * POSIX Standard-compliant results. + * + * There is currently only one place these definitions should be used, in + * certain function calls like Perl_iswordchar_() in inline.h. + * + * Most likely you want to use the macros a ways below with names like + * isALPHA_LC(). Rarely, you may want isU8_ALPHA_LC(), somewhat below. + * + * The first two aren't in C89, so the fallback is to use the non-locale + * sensitive versions; these are the same for all platforms */ #if defined(HAS_ISASCII) -# define isASCII_LC(c) (FITS_IN_8_BITS(c) && isascii( (U8) (c))) +# define is_posix_ASCII(c) isascii((U8) (c)) #else -# define isASCII_LC(c) isASCII(c) +# define is_posix_ASCII(c) isASCII(c) #endif #if defined(HAS_ISBLANK) -# define isBLANK_LC(c) _generic_LC(c, _CC_BLANK, isblank) -#else /* Unlike isASCII, varies if in a UTF-8 locale */ -# define isBLANK_LC(c) ((IN_UTF8_CTYPE_LOCALE) ? isBLANK_L1(c) : isBLANK(c)) +# define is_posix_BLANK(c) isblank((U8) (c)) +#else +# define is_posix_BLANK(c) isBLANK(c) #endif -#define _LC_CAST U8 +/* The next few are the same in all platforms. */ +#define is_posix_CNTRL(c) iscntrl((U8) (c)) +#define is_posix_IDFIRST(c) (UNLIKELY((c) == '_') || is_posix_ALPHA(c)) +#define is_posix_SPACE(c) isspace((U8) (c)) +#define is_posix_WORDCHAR(c) (UNLIKELY((c) == '_') || is_posix_ALPHANUMERIC(c)) + +/* The base-level case changing macros are also the same in all platforms */ +#define to_posix_LOWER(c) tolower((U8) (c)) +#define to_posix_UPPER(c) toupper((U8) (c)) +#define to_posix_FOLD(c) to_posix_LOWER(c) #ifdef WIN32 - /* The Windows functions don't bother to follow the POSIX standard, which - * for example says that something can't both be a printable and a control. - * But Windows treats the \t control as a printable, and does such things - * as making superscripts into both digits and punctuation. This tames - * these flaws by assuming that the definitions of both controls and space - * are correct, and then making sure that other definitions don't have - * weirdnesses, by making sure that isalnum() isn't also ispunct(), etc. - * Not all possible weirdnesses are checked for, just the ones that were - * detected on actual Microsoft code pages */ - -# define isCNTRL_LC(c) _generic_LC(c, _CC_CNTRL, iscntrl) -# define isSPACE_LC(c) _generic_LC(c, _CC_SPACE, isspace) - -# define isALPHA_LC(c) (_generic_LC(c, _CC_ALPHA, isalpha) \ - && isALPHANUMERIC_LC(c)) -# define isALPHANUMERIC_LC(c) (_generic_LC(c, _CC_ALPHANUMERIC, isalnum) && \ - ! isPUNCT_LC(c)) -# define isDIGIT_LC(c) (_generic_LC(c, _CC_DIGIT, isdigit) && \ - isALPHANUMERIC_LC(c)) -# define isGRAPH_LC(c) (_generic_LC(c, _CC_GRAPH, isgraph) && isPRINT_LC(c)) -# define isIDFIRST_LC(c) (((c) == '_') \ - || (_generic_LC(c, _CC_IDFIRST, isalpha) && ! isPUNCT_LC(c))) -# define isLOWER_LC(c) (_generic_LC(c, _CC_LOWER, islower) && isALPHA_LC(c)) -# define isPRINT_LC(c) (_generic_LC(c, _CC_PRINT, isprint) && ! isCNTRL_LC(c)) -# define isPUNCT_LC(c) (_generic_LC(c, _CC_PUNCT, ispunct) && ! isCNTRL_LC(c)) -# define isUPPER_LC(c) (_generic_LC(c, _CC_UPPER, isupper) && isALPHA_LC(c)) -# define isWORDCHAR_LC(c) (((c) == '_') || isALPHANUMERIC_LC(c)) -# define isXDIGIT_LC(c) (_generic_LC(c, _CC_XDIGIT, isxdigit) \ - && isALPHANUMERIC_LC(c)) - -# define toLOWER_LC(c) _generic_toLOWER_LC((c), tolower, U8) -# define toUPPER_LC(c) _generic_toUPPER_LC((c), toupper, U8) -# define toFOLD_LC(c) _generic_toFOLD_LC((c), tolower, U8) - -#elif defined(CTYPE256) || (!defined(isascii) && !defined(HAS_ISASCII)) - /* For most other platforms */ - -# define isALPHA_LC(c) _generic_LC(c, _CC_ALPHA, isalpha) -# define isALPHANUMERIC_LC(c) _generic_LC(c, _CC_ALPHANUMERIC, isalnum) -# define isCNTRL_LC(c) _generic_LC(c, _CC_CNTRL, iscntrl) -# define isDIGIT_LC(c) _generic_LC(c, _CC_DIGIT, isdigit) -# ifdef OS390 /* This system considers NBSP to be a graph */ -# define isGRAPH_LC(c) _generic_LC(c, _CC_GRAPH, isgraph) \ - && ! isSPACE_LC(c) + +/* The Windows functions don't bother to follow the POSIX standard, which for + * example says that something can't both be a printable and a control. But + * Windows treats \t as both a control and a printable, and does such things as + * making superscripts into both digits and punctuation. These #defines tame + * these flaws by assuming that the definitions of controls (and the other few + * ones defined above) are correct, and then making sure that other definitions + * don't have weirdnesses, by adding a check that \w and its subsets aren't + * ispunct(), and things that are \W, like ispunct(), arent't controls. Not + * all possible weirdnesses are checked for, just ones that were detected on + * actual Microsoft code pages */ +# define is_posix_ALPHA(c) \ + (isalpha((U8) (c)) && ! is_posix_PUNCT(c)) +# define is_posix_ALPHANUMERIC(c) \ + (isalnum((U8) (c)) && ! is_posix_PUNCT(c)) +# define is_posix_CASED(c) \ + ((isupper((U8) (c)) || islower((U8) (c))) && ! is_posix_PUNCT(c)) +# define is_posix_DIGIT(c) \ + (isdigit((U8) (c)) && ! is_posix_PUNCT(c)) +# define is_posix_GRAPH(c) \ + (isgraph((U8) (c)) && ! is_posix_CNTRL(c)) +# define is_posix_LOWER(c) \ + (islower((U8) (c)) && ! is_posix_PUNCT(c)) +# define is_posix_PRINT(c) \ + (isprint((U8) (c)) && ! is_posix_CNTRL(c)) +# define is_posix_PUNCT(c) \ + (ispunct((U8) (c)) && ! is_posix_CNTRL(c)) +# define is_posix_UPPER(c) \ + (isupper((U8) (c)) && ! is_posix_PUNCT(c)) +# define is_posix_XDIGIT(c) \ + (isxdigit((U8) (c)) && ! is_posix_PUNCT(c)) +#else + +/* For all other platforms, as far as we know, isdigit(), etc. work sanely + * enough */ +# define is_posix_ALPHA(c) isalpha((U8) (c)) +# define is_posix_ALPHANUMERIC(c) isalnum((U8) (c)) +# define is_posix_CASED(c) (islower((U8) (c)) || isupper((U8) (c))) +# define is_posix_DIGIT(c) isdigit((U8) (c)) + + /* ... But it seems that IBM products treat NBSP as both a space and a + * graphic; these are the two platforms that we have active test beds for. + */ +# if defined(OS390) || defined(_AIX) +# define is_posix_GRAPH(c) (isgraph((U8) (c)) && ! isspace((U8) (c))) # else -# define isGRAPH_LC(c) _generic_LC(c, _CC_GRAPH, isgraph) +# define is_posix_GRAPH(c) isgraph((U8) (c)) # endif -# define isIDFIRST_LC(c) _generic_LC_underscore(c, _CC_IDFIRST, isalpha) -# define isLOWER_LC(c) _generic_LC(c, _CC_LOWER, islower) -# define isPRINT_LC(c) _generic_LC(c, _CC_PRINT, isprint) -# define isPUNCT_LC(c) _generic_LC(c, _CC_PUNCT, ispunct) -# define isSPACE_LC(c) _generic_LC(c, _CC_SPACE, isspace) -# define isUPPER_LC(c) _generic_LC(c, _CC_UPPER, isupper) -# define isWORDCHAR_LC(c) _generic_LC_underscore(c, _CC_WORDCHAR, isalnum) -# define isXDIGIT_LC(c) _generic_LC(c, _CC_XDIGIT, isxdigit) - - -# define toLOWER_LC(c) _generic_toLOWER_LC((c), tolower, U8) -# define toUPPER_LC(c) _generic_toUPPER_LC((c), toupper, U8) -# define toFOLD_LC(c) _generic_toFOLD_LC((c), tolower, U8) - -#else /* The final fallback position */ - -# define isALPHA_LC(c) (isascii(c) && isalpha(c)) -# define isALPHANUMERIC_LC(c) (isascii(c) && isalnum(c)) -# define isCNTRL_LC(c) (isascii(c) && iscntrl(c)) -# define isDIGIT_LC(c) (isascii(c) && isdigit(c)) -# define isGRAPH_LC(c) (isascii(c) && isgraph(c)) -# define isIDFIRST_LC(c) (isascii(c) && (isalpha(c) || (c) == '_')) -# define isLOWER_LC(c) (isascii(c) && islower(c)) -# define isPRINT_LC(c) (isascii(c) && isprint(c)) -# define isPUNCT_LC(c) (isascii(c) && ispunct(c)) -# define isSPACE_LC(c) (isascii(c) && isspace(c)) -# define isUPPER_LC(c) (isascii(c) && isupper(c)) -# define isWORDCHAR_LC(c) (isascii(c) && (isalnum(c) || (c) == '_')) -# define isXDIGIT_LC(c) (isascii(c) && isxdigit(c)) - -# define toLOWER_LC(c) (isascii(c) ? tolower(c) : (c)) -# define toUPPER_LC(c) (isascii(c) ? toupper(c) : (c)) -# define toFOLD_LC(c) (isascii(c) ? tolower(c) : (c)) +# define is_posix_LOWER(c) islower((U8) (c)) +# define is_posix_PRINT(c) isprint((U8) (c)) +# define is_posix_PUNCT(c) ispunct((U8) (c)) +# define is_posix_UPPER(c) isupper((U8) (c)) +# define is_posix_XDIGIT(c) isxdigit((U8) (c)) +#endif + +/* Below is the next level up, which currently expands to nothing more + * than the previous layer. These are the macros to use if you really need + * something whose input domain is a byte, and the locale isn't UTF-8; that is, + * where you normally would have to use things like bare isalnum(). + * + * But most likely you should instead use the layer defined further below which + * has names like isALPHA_LC. They deal with larger-than-byte inputs, and + * UTF-8 locales. + * + * (Note, proper general operation of the bare libc functions requires you to + * cast to U8. These do that for you automatically.) */ +# define WRAP_U8_LC_(c, classnum, posix) posix(c) + +#define isU8_ALPHANUMERIC_LC(c) \ + WRAP_U8_LC_((c), CC_ALPHANUMERIC_, is_posix_ALPHANUMERIC) +#define isU8_ALPHA_LC(c) WRAP_U8_LC_((c), CC_ALPHA_, is_posix_ALPHA) +#define isU8_ASCII_LC(c) WRAP_U8_LC_((c), CC_ASCII_, is_posix_ASCII) +#define isU8_BLANK_LC(c) WRAP_U8_LC_((c), CC_BLANK_, is_posix_BLANK) +#define isU8_CASED_LC(c) WRAP_U8_LC_((c), CC_CASED_, is_posix_CASED) +#define isU8_CNTRL_LC(c) WRAP_U8_LC_((c), CC_CNTRL_, is_posix_CNTRL) +#define isU8_DIGIT_LC(c) WRAP_U8_LC_((c), CC_DIGIT_, is_posix_DIGIT) +#define isU8_GRAPH_LC(c) WRAP_U8_LC_((c), CC_GRAPH_, is_posix_GRAPH) +#define isU8_IDFIRST_LC(c) WRAP_U8_LC_((c), CC_IDFIRST_, is_posix_IDFIRST) +#define isU8_LOWER_LC(c) WRAP_U8_LC_((c), CC_LOWER_, is_posix_LOWER) +#define isU8_PRINT_LC(c) WRAP_U8_LC_((c), CC_PRINT_, is_posix_PRINT) +#define isU8_PUNCT_LC(c) WRAP_U8_LC_((c), CC_PUNCT_, is_posix_PUNCT) +#define isU8_SPACE_LC(c) WRAP_U8_LC_((c), CC_SPACE_, is_posix_SPACE) +#define isU8_UPPER_LC(c) WRAP_U8_LC_((c), CC_UPPER_, is_posix_UPPER) +#define isU8_WORDCHAR_LC(c) WRAP_U8_LC_((c), CC_WORDCHAR_, is_posix_WORDCHAR) +#define isU8_XDIGIT_LC(c) WRAP_U8_LC_((c), CC_XDIGIT_, is_posix_XDIGIT) + +#define toU8_LOWER_LC(c) WRAP_U8_LC_((c), CC_TOLOWER_, to_posix_LOWER) +#define toU8_UPPER_LC(c) WRAP_U8_LC_((c), CC_TOUPPER_, to_posix_UPPER) +#define toU8_FOLD_LC(c) toU8_LOWER_LC(c) + +/* The definitions below use the ones above to create versions in which the + * input domain isn't restricted to bytes (though always returning false if the + * input doesn't fit in a byte), and to behave properly should the locale be + * UTF-8. These are the documented ones, suitable for general use (though + * toUPPER_LC and toFOLD_LC aren't documented because they need special + * handling to deal with SHARP S expanding to two characters). */ + +#define isASCII_LC(c) (FITS_IN_8_BITS(c) && isU8_ASCII_LC(c)) +#define isALPHA_LC(c) generic_LC_(c, CC_ALPHA_, isU8_ALPHA_LC) +#define isALPHANUMERIC_LC(c) \ + generic_LC_(c, CC_ALPHANUMERIC_, isU8_ALPHANUMERIC_LC) +#define isBLANK_LC(c) generic_LC_(c, CC_BLANK_, isU8_BLANK_LC) +#define isCASED_LC(c) generic_LC_(c, CC_CASED_, isU8_CASED_LC) +#define isCNTRL_LC(c) generic_LC_(c, CC_CNTRL_, isU8_CNTRL_LC) +#define isDIGIT_LC(c) generic_LC_(c, CC_DIGIT_, isU8_DIGIT_LC) +#define isGRAPH_LC(c) generic_LC_(c, CC_GRAPH_, isU8_GRAPH_LC) +#define isIDFIRST_LC(c) generic_LC_(c, CC_IDFIRST_, isU8_IDFIRST_LC) +#define isLOWER_LC(c) generic_LC_(c, CC_LOWER_, isU8_LOWER_LC) +#define isPRINT_LC(c) generic_LC_(c, CC_PRINT_, isU8_PRINT_LC) +#define isPUNCT_LC(c) generic_LC_(c, CC_PUNCT_, isU8_PUNCT_LC) +#define isSPACE_LC(c) generic_LC_(c, CC_SPACE_, isU8_SPACE_LC) +#define isUPPER_LC(c) generic_LC_(c, CC_UPPER_, isU8_UPPER_LC) +#define isWORDCHAR_LC(c) generic_LC_(c, CC_WORDCHAR_, isU8_WORDCHAR_LC) +#define isXDIGIT_LC(c) generic_LC_(c, CC_XDIGIT_, isU8_XDIGIT_LC) + +#ifndef CTYPE256 +# define toLOWER_LC(c) toLOWER_A(c) +# define toUPPER_LC(c) toUPPER_A(c) +# define toFOLD_LC(c) toFOLD_A(c) +#else + +/* In the next three macros, the reason for using the PL_latin arrays is in + * case the system function is defective; it ensures uniform results that + * conform to the Unicode standard. */ + +/* This does not handle the anomalies in UTF-8 Turkic locales. */ +# define toLOWER_LC(c) ((! FITS_IN_8_BITS(c)) \ + ? (c) \ + : ((IN_UTF8_CTYPE_LOCALE) \ + ? PL_latin1_lc[ (U8) (c) ] \ + : ((U8) toU8_LOWER_LC(c)))) + +/* In this macro, note that the result can be larger than a byte in a UTF-8 + * locale. It returns a single value, so can't adequately return the upper + * case of LATIN SMALL LETTER SHARP S in a UTF-8 locale (which should be a + * string of two values "SS"); instead it asserts against that under + * DEBUGGING, and otherwise returns its input. It does not handle the + * anomalies in UTF-8 Turkic locales. */ +# define toUPPER_LC(c) \ + ((! FITS_IN_8_BITS(c)) \ + ? (c) \ + : ((! IN_UTF8_CTYPE_LOCALE) \ + ? ((U8) toU8_UPPER_LC(c)) \ + : (UNLIKELY(((U8)(c)) == MICRO_SIGN) \ + ? GREEK_CAPITAL_LETTER_MU \ + : ((UNLIKELY(((U8) (c)) == LATIN_SMALL_LETTER_Y_WITH_DIAERESIS) \ + ? LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS \ + : (UNLIKELY(((U8)(c)) == LATIN_SMALL_LETTER_SHARP_S) \ + ? (__ASSERT_(0) (c)) /* Fail on Sharp S in DEBUGGING */ \ + : PL_mod_latin1_uc[ (U8) (c) ])))))) + +/* In this macro, note that the result can be larger than a byte in a UTF-8 + * locale. It returns a single value, so can't adequately return the fold case + * of LATIN SMALL LETTER SHARP S in a UTF-8 locale (which should be a string of + * two values "ss"); instead it asserts against that under DEBUGGING, and + * otherwise returns its input. It does not handle the anomalies in UTF-8 + * Turkic locales */ +# define toFOLD_LC(c) \ + ((UNLIKELY((c) == MICRO_SIGN) && IN_UTF8_CTYPE_LOCALE) \ + ? GREEK_SMALL_LETTER_MU \ + : (__ASSERT_( ! IN_UTF8_CTYPE_LOCALE \ + || LIKELY((c) != LATIN_SMALL_LETTER_SHARP_S)) \ + toLOWER_LC(c))) #endif #define isIDCONT(c) isWORDCHAR(c) @@ -2058,46 +2144,46 @@ END_EXTERN_C /* For internal core Perl use only: the base macros for defining macros like * isALPHA_uvchr. 'c' is the code point to check. 'classnum' is the POSIX class - * number defined earlier in this file. _generic_uvchr() is used for POSIX + * number defined earlier in this file. generic_uvchr_() is used for POSIX * classes where there is a macro or function 'above_latin1' that takes the * single argument 'c' and returns the desired value. These exist for those * classes which have simple definitions, avoiding the overhead of an inversion - * list binary search. _generic_invlist_uvchr() can be used + * list binary search. generic_invlist_uvchr_() can be used * for classes where that overhead is faster than a direct lookup. - * _generic_uvchr() won't compile if 'c' isn't unsigned, as it won't match the - * 'above_latin1' prototype. _generic_isCC() macro does bounds checking, so + * generic_uvchr_() won't compile if 'c' isn't unsigned, as it won't match the + * 'above_latin1' prototype. generic_isCC_() macro does bounds checking, so * have duplicate checks here, so could create versions of the macros that * don't, but experiments show that gcc optimizes them out anyway. */ /* Note that all ignore 'use bytes' */ -#define _generic_uvchr(classnum, above_latin1, c) ((c) < 256 \ - ? _generic_isCC(c, classnum) \ +#define generic_uvchr_(classnum, above_latin1, c) ((c) < 256 \ + ? generic_isCC_(c, classnum) \ : above_latin1(c)) -#define _generic_invlist_uvchr(classnum, c) ((c) < 256 \ - ? _generic_isCC(c, classnum) \ +#define generic_invlist_uvchr_(classnum, c) ((c) < 256 \ + ? generic_isCC_(c, classnum) \ : _is_uni_FOO(classnum, c)) -#define isALPHA_uvchr(c) _generic_invlist_uvchr(_CC_ALPHA, c) -#define isALPHANUMERIC_uvchr(c) _generic_invlist_uvchr(_CC_ALPHANUMERIC, c) +#define isALPHA_uvchr(c) generic_invlist_uvchr_(CC_ALPHA_, c) +#define isALPHANUMERIC_uvchr(c) generic_invlist_uvchr_(CC_ALPHANUMERIC_, c) #define isASCII_uvchr(c) isASCII(c) -#define isBLANK_uvchr(c) _generic_uvchr(_CC_BLANK, is_HORIZWS_cp_high, c) +#define isBLANK_uvchr(c) generic_uvchr_(CC_BLANK_, is_HORIZWS_cp_high, c) #define isCNTRL_uvchr(c) isCNTRL_L1(c) /* All controls are in Latin1 */ -#define isDIGIT_uvchr(c) _generic_invlist_uvchr(_CC_DIGIT, c) -#define isGRAPH_uvchr(c) _generic_invlist_uvchr(_CC_GRAPH, c) +#define isDIGIT_uvchr(c) generic_invlist_uvchr_(CC_DIGIT_, c) +#define isGRAPH_uvchr(c) generic_invlist_uvchr_(CC_GRAPH_, c) #define isIDCONT_uvchr(c) \ - _generic_uvchr(_CC_WORDCHAR, _is_uni_perl_idcont, c) + generic_uvchr_(CC_WORDCHAR_, _is_uni_perl_idcont, c) #define isIDFIRST_uvchr(c) \ - _generic_uvchr(_CC_IDFIRST, _is_uni_perl_idstart, c) -#define isLOWER_uvchr(c) _generic_invlist_uvchr(_CC_LOWER, c) -#define isPRINT_uvchr(c) _generic_invlist_uvchr(_CC_PRINT, c) + generic_uvchr_(CC_IDFIRST_, _is_uni_perl_idstart, c) +#define isLOWER_uvchr(c) generic_invlist_uvchr_(CC_LOWER_, c) +#define isPRINT_uvchr(c) generic_invlist_uvchr_(CC_PRINT_, c) -#define isPUNCT_uvchr(c) _generic_invlist_uvchr(_CC_PUNCT, c) -#define isSPACE_uvchr(c) _generic_uvchr(_CC_SPACE, is_XPERLSPACE_cp_high, c) +#define isPUNCT_uvchr(c) generic_invlist_uvchr_(CC_PUNCT_, c) +#define isSPACE_uvchr(c) generic_uvchr_(CC_SPACE_, is_XPERLSPACE_cp_high, c) #define isPSXSPC_uvchr(c) isSPACE_uvchr(c) -#define isUPPER_uvchr(c) _generic_invlist_uvchr(_CC_UPPER, c) -#define isVERTWS_uvchr(c) _generic_uvchr(_CC_VERTSPACE, is_VERTWS_cp_high, c) -#define isWORDCHAR_uvchr(c) _generic_invlist_uvchr(_CC_WORDCHAR, c) -#define isXDIGIT_uvchr(c) _generic_uvchr(_CC_XDIGIT, is_XDIGIT_cp_high, c) +#define isUPPER_uvchr(c) generic_invlist_uvchr_(CC_UPPER_, c) +#define isVERTWS_uvchr(c) generic_uvchr_(CC_VERTSPACE_, is_VERTWS_cp_high, c) +#define isWORDCHAR_uvchr(c) generic_invlist_uvchr_(CC_WORDCHAR_, c) +#define isXDIGIT_uvchr(c) generic_uvchr_(CC_XDIGIT_, is_XDIGIT_cp_high, c) #define toFOLD_uvchr(c,s,l) to_uni_fold(c,s,l) #define toLOWER_uvchr(c,s,l) to_uni_lower(c,s,l) @@ -2131,37 +2217,37 @@ END_EXTERN_C /* For internal core Perl use only: the base macros for defining macros like * isALPHA_LC_uvchr. These are like isALPHA_LC, but the input can be any code - * point, not just 0-255. Like _generic_uvchr, there are two versions, one for + * point, not just 0-255. Like generic_uvchr_, there are two versions, one for * simple class definitions; the other for more complex. These are like - * _generic_uvchr, so see it for more info. */ -#define _generic_LC_uvchr(latin1, above_latin1, c) \ + * generic_uvchr_, so see it for more info. */ +#define generic_LC_uvchr_(latin1, above_latin1, c) \ (c < 256 ? latin1(c) : above_latin1(c)) -#define _generic_LC_invlist_uvchr(latin1, classnum, c) \ +#define generic_LC_invlist_uvchr_(latin1, classnum, c) \ (c < 256 ? latin1(c) : _is_uni_FOO(classnum, c)) -#define isALPHA_LC_uvchr(c) _generic_LC_invlist_uvchr(isALPHA_LC, _CC_ALPHA, c) -#define isALPHANUMERIC_LC_uvchr(c) _generic_LC_invlist_uvchr(isALPHANUMERIC_LC, \ - _CC_ALPHANUMERIC, c) +#define isALPHA_LC_uvchr(c) generic_LC_invlist_uvchr_(isALPHA_LC, CC_ALPHA_, c) +#define isALPHANUMERIC_LC_uvchr(c) generic_LC_invlist_uvchr_(isALPHANUMERIC_LC, \ + CC_ALPHANUMERIC_, c) #define isASCII_LC_uvchr(c) isASCII_LC(c) -#define isBLANK_LC_uvchr(c) _generic_LC_uvchr(isBLANK_LC, \ +#define isBLANK_LC_uvchr(c) generic_LC_uvchr_(isBLANK_LC, \ is_HORIZWS_cp_high, c) #define isCNTRL_LC_uvchr(c) (c < 256 ? isCNTRL_LC(c) : 0) -#define isDIGIT_LC_uvchr(c) _generic_LC_invlist_uvchr(isDIGIT_LC, _CC_DIGIT, c) -#define isGRAPH_LC_uvchr(c) _generic_LC_invlist_uvchr(isGRAPH_LC, _CC_GRAPH, c) -#define isIDCONT_LC_uvchr(c) _generic_LC_uvchr(isIDCONT_LC, \ +#define isDIGIT_LC_uvchr(c) generic_LC_invlist_uvchr_(isDIGIT_LC, CC_DIGIT_, c) +#define isGRAPH_LC_uvchr(c) generic_LC_invlist_uvchr_(isGRAPH_LC, CC_GRAPH_, c) +#define isIDCONT_LC_uvchr(c) generic_LC_uvchr_(isIDCONT_LC, \ _is_uni_perl_idcont, c) -#define isIDFIRST_LC_uvchr(c) _generic_LC_uvchr(isIDFIRST_LC, \ +#define isIDFIRST_LC_uvchr(c) generic_LC_uvchr_(isIDFIRST_LC, \ _is_uni_perl_idstart, c) -#define isLOWER_LC_uvchr(c) _generic_LC_invlist_uvchr(isLOWER_LC, _CC_LOWER, c) -#define isPRINT_LC_uvchr(c) _generic_LC_invlist_uvchr(isPRINT_LC, _CC_PRINT, c) +#define isLOWER_LC_uvchr(c) generic_LC_invlist_uvchr_(isLOWER_LC, CC_LOWER_, c) +#define isPRINT_LC_uvchr(c) generic_LC_invlist_uvchr_(isPRINT_LC, CC_PRINT_, c) #define isPSXSPC_LC_uvchr(c) isSPACE_LC_uvchr(c) -#define isPUNCT_LC_uvchr(c) _generic_LC_invlist_uvchr(isPUNCT_LC, _CC_PUNCT, c) -#define isSPACE_LC_uvchr(c) _generic_LC_uvchr(isSPACE_LC, \ +#define isPUNCT_LC_uvchr(c) generic_LC_invlist_uvchr_(isPUNCT_LC, CC_PUNCT_, c) +#define isSPACE_LC_uvchr(c) generic_LC_uvchr_(isSPACE_LC, \ is_XPERLSPACE_cp_high, c) -#define isUPPER_LC_uvchr(c) _generic_LC_invlist_uvchr(isUPPER_LC, _CC_UPPER, c) -#define isWORDCHAR_LC_uvchr(c) _generic_LC_invlist_uvchr(isWORDCHAR_LC, \ - _CC_WORDCHAR, c) -#define isXDIGIT_LC_uvchr(c) _generic_LC_uvchr(isXDIGIT_LC, \ +#define isUPPER_LC_uvchr(c) generic_LC_invlist_uvchr_(isUPPER_LC, CC_UPPER_, c) +#define isWORDCHAR_LC_uvchr(c) generic_LC_invlist_uvchr_(isWORDCHAR_LC, \ + CC_WORDCHAR_, c) +#define isXDIGIT_LC_uvchr(c) generic_LC_uvchr_(isXDIGIT_LC, \ is_XDIGIT_cp_high, c) #define isBLANK_LC_uni(c) isBLANK_LC_uvchr(UNI_TO_NATIVE(c)) @@ -2189,41 +2275,41 @@ END_EXTERN_C # define _utf8_safe_assert(p,e) ((e) > (p)) #endif -#define _generic_utf8_safe(classnum, p, e, above_latin1) \ +#define generic_utf8_safe_(classnum, p, e, above_latin1) \ ((! _utf8_safe_assert(p, e)) \ ? (_force_out_malformed_utf8_message((U8 *) (p), (U8 *) (e), 0, 1), 0)\ : (UTF8_IS_INVARIANT(*(p))) \ - ? _generic_isCC(*(p), classnum) \ + ? generic_isCC_(*(p), classnum) \ : (UTF8_IS_DOWNGRADEABLE_START(*(p)) \ ? ((LIKELY((e) - (p) > 1 && UTF8_IS_CONTINUATION(*((p)+1)))) \ - ? _generic_isCC(EIGHT_BIT_UTF8_TO_NATIVE(*(p), *((p)+1 )), \ + ? generic_isCC_(EIGHT_BIT_UTF8_TO_NATIVE(*(p), *((p)+1 )), \ classnum) \ : (_force_out_malformed_utf8_message( \ (U8 *) (p), (U8 *) (e), 0, 1), 0)) \ : above_latin1)) /* Like the above, but calls 'above_latin1(p)' to get the utf8 value. * 'above_latin1' can be a macro */ -#define _generic_func_utf8_safe(classnum, above_latin1, p, e) \ - _generic_utf8_safe(classnum, p, e, above_latin1(p, e)) -#define _generic_non_invlist_utf8_safe(classnum, above_latin1, p, e) \ - _generic_utf8_safe(classnum, p, e, \ +#define generic_func_utf8_safe_(classnum, above_latin1, p, e) \ + generic_utf8_safe_(classnum, p, e, above_latin1(p, e)) +#define generic_non_invlist_utf8_safe_(classnum, above_latin1, p, e) \ + generic_utf8_safe_(classnum, p, e, \ (UNLIKELY((e) - (p) < UTF8SKIP(p)) \ ? (_force_out_malformed_utf8_message( \ (U8 *) (p), (U8 *) (e), 0, 1), 0) \ : above_latin1(p))) /* Like the above, but passes classnum to _isFOO_utf8(), instead of having an * 'above_latin1' parameter */ -#define _generic_invlist_utf8_safe(classnum, p, e) \ - _generic_utf8_safe(classnum, p, e, _is_utf8_FOO(classnum, p, e)) +#define generic_invlist_utf8_safe_(classnum, p, e) \ + generic_utf8_safe_(classnum, p, e, _is_utf8_FOO(classnum, p, e)) /* Like the above, but should be used only when it is known that there are no * characters in the upper-Latin1 range (128-255 on ASCII platforms) which the * class is TRUE for. Hence it can skip the tests for this range. * 'above_latin1' should include its arguments */ -#define _generic_utf8_safe_no_upper_latin1(classnum, p, e, above_latin1) \ +#define generic_utf8_safe_no_upper_latin1_(classnum, p, e, above_latin1) \ (__ASSERT_(_utf8_safe_assert(p, e)) \ (isASCII(*(p))) \ - ? _generic_isCC(*(p), classnum) \ + ? generic_isCC_(*(p), classnum) \ : (UTF8_IS_DOWNGRADEABLE_START(*(p))) \ ? 0 /* Note that doesn't check validity for latin1 */ \ : above_latin1) @@ -2248,15 +2334,15 @@ END_EXTERN_C #define isWORDCHAR_utf8(p, e) isWORDCHAR_utf8_safe(p, e) #define isXDIGIT_utf8(p, e) isXDIGIT_utf8_safe(p, e) -#define isALPHA_utf8_safe(p, e) _generic_invlist_utf8_safe(_CC_ALPHA, p, e) +#define isALPHA_utf8_safe(p, e) generic_invlist_utf8_safe_(CC_ALPHA_, p, e) #define isALPHANUMERIC_utf8_safe(p, e) \ - _generic_invlist_utf8_safe(_CC_ALPHANUMERIC, p, e) + generic_invlist_utf8_safe_(CC_ALPHANUMERIC_, p, e) #define isASCII_utf8_safe(p, e) \ /* Because ASCII is invariant under utf8, the non-utf8 macro \ * works */ \ (__ASSERT_(_utf8_safe_assert(p, e)) isASCII(*(p))) #define isBLANK_utf8_safe(p, e) \ - _generic_non_invlist_utf8_safe(_CC_BLANK, is_HORIZWS_high, p, e) + generic_non_invlist_utf8_safe_(CC_BLANK_, is_HORIZWS_high, p, e) #ifdef EBCDIC /* Because all controls are UTF-8 invariants in EBCDIC, we can use this @@ -2264,14 +2350,14 @@ END_EXTERN_C # define isCNTRL_utf8_safe(p, e) \ (__ASSERT_(_utf8_safe_assert(p, e)) isCNTRL_L1(*(p))) #else -# define isCNTRL_utf8_safe(p, e) _generic_utf8_safe(_CC_CNTRL, p, e, 0) +# define isCNTRL_utf8_safe(p, e) generic_utf8_safe_(CC_CNTRL_, p, e, 0) #endif #define isDIGIT_utf8_safe(p, e) \ - _generic_utf8_safe_no_upper_latin1(_CC_DIGIT, p, e, \ - _is_utf8_FOO(_CC_DIGIT, p, e)) -#define isGRAPH_utf8_safe(p, e) _generic_invlist_utf8_safe(_CC_GRAPH, p, e) -#define isIDCONT_utf8_safe(p, e) _generic_func_utf8_safe(_CC_WORDCHAR, \ + generic_utf8_safe_no_upper_latin1_(CC_DIGIT_, p, e, \ + _is_utf8_FOO(CC_DIGIT_, p, e)) +#define isGRAPH_utf8_safe(p, e) generic_invlist_utf8_safe_(CC_GRAPH_, p, e) +#define isIDCONT_utf8_safe(p, e) generic_func_utf8_safe_(CC_WORDCHAR_, \ _is_utf8_perl_idcont, p, e) /* To prevent S_scan_word in toke.c from hanging, we have to make sure that @@ -2281,22 +2367,22 @@ END_EXTERN_C * This used to be not the XID version, but we decided to go with the more * modern Unicode definition */ #define isIDFIRST_utf8_safe(p, e) \ - _generic_func_utf8_safe(_CC_IDFIRST, \ + generic_func_utf8_safe_(CC_IDFIRST_, \ _is_utf8_perl_idstart, (U8 *) (p), (U8 *) (e)) -#define isLOWER_utf8_safe(p, e) _generic_invlist_utf8_safe(_CC_LOWER, p, e) -#define isPRINT_utf8_safe(p, e) _generic_invlist_utf8_safe(_CC_PRINT, p, e) +#define isLOWER_utf8_safe(p, e) generic_invlist_utf8_safe_(CC_LOWER_, p, e) +#define isPRINT_utf8_safe(p, e) generic_invlist_utf8_safe_(CC_PRINT_, p, e) #define isPSXSPC_utf8_safe(p, e) isSPACE_utf8_safe(p, e) -#define isPUNCT_utf8_safe(p, e) _generic_invlist_utf8_safe(_CC_PUNCT, p, e) +#define isPUNCT_utf8_safe(p, e) generic_invlist_utf8_safe_(CC_PUNCT_, p, e) #define isSPACE_utf8_safe(p, e) \ - _generic_non_invlist_utf8_safe(_CC_SPACE, is_XPERLSPACE_high, p, e) -#define isUPPER_utf8_safe(p, e) _generic_invlist_utf8_safe(_CC_UPPER, p, e) + generic_non_invlist_utf8_safe_(CC_SPACE_, is_XPERLSPACE_high, p, e) +#define isUPPER_utf8_safe(p, e) generic_invlist_utf8_safe_(CC_UPPER_, p, e) #define isVERTWS_utf8_safe(p, e) \ - _generic_non_invlist_utf8_safe(_CC_VERTSPACE, is_VERTWS_high, p, e) + generic_non_invlist_utf8_safe_(CC_VERTSPACE_, is_VERTWS_high, p, e) #define isWORDCHAR_utf8_safe(p, e) \ - _generic_invlist_utf8_safe(_CC_WORDCHAR, p, e) + generic_invlist_utf8_safe_(CC_WORDCHAR_, p, e) #define isXDIGIT_utf8_safe(p, e) \ - _generic_utf8_safe_no_upper_latin1(_CC_XDIGIT, p, e, \ + generic_utf8_safe_no_upper_latin1_(CC_XDIGIT_, p, e, \ (UNLIKELY((e) - (p) < UTF8SKIP(p)) \ ? (_force_out_malformed_utf8_message( \ (U8 *) (p), (U8 *) (e), 0, 1), 0) \ @@ -2337,10 +2423,10 @@ END_EXTERN_C #define isXDIGIT_LC_utf8(p, e) isXDIGIT_LC_utf8_safe(p, e) /* For internal core Perl use only: the base macros for defining macros like - * isALPHA_LC_utf8_safe. These are like _generic_utf8, but if the first code + * isALPHA_LC_utf8_safe. These are like generic_utf8_, but if the first code * point in 'p' is within the 0-255 range, it uses locale rules from the * passed-in 'macro' parameter */ -#define _generic_LC_utf8_safe(macro, p, e, above_latin1) \ +#define generic_LC_utf8_safe_(macro, p, e, above_latin1) \ (__ASSERT_(_utf8_safe_assert(p, e)) \ (UTF8_IS_INVARIANT(*(p))) \ ? macro(*(p)) \ @@ -2351,56 +2437,56 @@ END_EXTERN_C (U8 *) (p), (U8 *) (e), 0, 1), 0)) \ : above_latin1)) -#define _generic_LC_invlist_utf8_safe(macro, classnum, p, e) \ - _generic_LC_utf8_safe(macro, p, e, \ +#define generic_LC_invlist_utf8_safe_(macro, classnum, p, e) \ + generic_LC_utf8_safe_(macro, p, e, \ _is_utf8_FOO(classnum, p, e)) -#define _generic_LC_func_utf8_safe(macro, above_latin1, p, e) \ - _generic_LC_utf8_safe(macro, p, e, above_latin1(p, e)) +#define generic_LC_func_utf8_safe_(macro, above_latin1, p, e) \ + generic_LC_utf8_safe_(macro, p, e, above_latin1(p, e)) -#define _generic_LC_non_invlist_utf8_safe(classnum, above_latin1, p, e) \ - _generic_LC_utf8_safe(classnum, p, e, \ +#define generic_LC_non_invlist_utf8_safe_(classnum, above_latin1, p, e) \ + generic_LC_utf8_safe_(classnum, p, e, \ (UNLIKELY((e) - (p) < UTF8SKIP(p)) \ ? (_force_out_malformed_utf8_message( \ (U8 *) (p), (U8 *) (e), 0, 1), 0) \ : above_latin1(p))) #define isALPHANUMERIC_LC_utf8_safe(p, e) \ - _generic_LC_invlist_utf8_safe(isALPHANUMERIC_LC, \ - _CC_ALPHANUMERIC, p, e) + generic_LC_invlist_utf8_safe_(isALPHANUMERIC_LC, \ + CC_ALPHANUMERIC_, p, e) #define isALPHA_LC_utf8_safe(p, e) \ - _generic_LC_invlist_utf8_safe(isALPHA_LC, _CC_ALPHA, p, e) + generic_LC_invlist_utf8_safe_(isALPHA_LC, CC_ALPHA_, p, e) #define isASCII_LC_utf8_safe(p, e) \ (__ASSERT_(_utf8_safe_assert(p, e)) isASCII_LC(*(p))) #define isBLANK_LC_utf8_safe(p, e) \ - _generic_LC_non_invlist_utf8_safe(isBLANK_LC, is_HORIZWS_high, p, e) + generic_LC_non_invlist_utf8_safe_(isBLANK_LC, is_HORIZWS_high, p, e) #define isCNTRL_LC_utf8_safe(p, e) \ - _generic_LC_utf8_safe(isCNTRL_LC, p, e, 0) + generic_LC_utf8_safe_(isCNTRL_LC, p, e, 0) #define isDIGIT_LC_utf8_safe(p, e) \ - _generic_LC_invlist_utf8_safe(isDIGIT_LC, _CC_DIGIT, p, e) + generic_LC_invlist_utf8_safe_(isDIGIT_LC, CC_DIGIT_, p, e) #define isGRAPH_LC_utf8_safe(p, e) \ - _generic_LC_invlist_utf8_safe(isGRAPH_LC, _CC_GRAPH, p, e) + generic_LC_invlist_utf8_safe_(isGRAPH_LC, CC_GRAPH_, p, e) #define isIDCONT_LC_utf8_safe(p, e) \ - _generic_LC_func_utf8_safe(isIDCONT_LC, \ + generic_LC_func_utf8_safe_(isIDCONT_LC, \ _is_utf8_perl_idcont, p, e) #define isIDFIRST_LC_utf8_safe(p, e) \ - _generic_LC_func_utf8_safe(isIDFIRST_LC, \ + generic_LC_func_utf8_safe_(isIDFIRST_LC, \ _is_utf8_perl_idstart, p, e) #define isLOWER_LC_utf8_safe(p, e) \ - _generic_LC_invlist_utf8_safe(isLOWER_LC, _CC_LOWER, p, e) + generic_LC_invlist_utf8_safe_(isLOWER_LC, CC_LOWER_, p, e) #define isPRINT_LC_utf8_safe(p, e) \ - _generic_LC_invlist_utf8_safe(isPRINT_LC, _CC_PRINT, p, e) + generic_LC_invlist_utf8_safe_(isPRINT_LC, CC_PRINT_, p, e) #define isPSXSPC_LC_utf8_safe(p, e) isSPACE_LC_utf8_safe(p, e) #define isPUNCT_LC_utf8_safe(p, e) \ - _generic_LC_invlist_utf8_safe(isPUNCT_LC, _CC_PUNCT, p, e) + generic_LC_invlist_utf8_safe_(isPUNCT_LC, CC_PUNCT_, p, e) #define isSPACE_LC_utf8_safe(p, e) \ - _generic_LC_non_invlist_utf8_safe(isSPACE_LC, is_XPERLSPACE_high, p, e) + generic_LC_non_invlist_utf8_safe_(isSPACE_LC, is_XPERLSPACE_high, p, e) #define isUPPER_LC_utf8_safe(p, e) \ - _generic_LC_invlist_utf8_safe(isUPPER_LC, _CC_UPPER, p, e) + generic_LC_invlist_utf8_safe_(isUPPER_LC, CC_UPPER_, p, e) #define isWORDCHAR_LC_utf8_safe(p, e) \ - _generic_LC_invlist_utf8_safe(isWORDCHAR_LC, _CC_WORDCHAR, p, e) + generic_LC_invlist_utf8_safe_(isWORDCHAR_LC, CC_WORDCHAR_, p, e) #define isXDIGIT_LC_utf8_safe(p, e) \ - _generic_LC_non_invlist_utf8_safe(isXDIGIT_LC, is_XDIGIT_high, p, e) + generic_LC_non_invlist_utf8_safe_(isXDIGIT_LC, is_XDIGIT_high, p, e) /* Macros for backwards compatibility and for completeness when the ASCII and * Latin1 values are identical */ @@ -2460,6 +2546,7 @@ The typedef to use to declare variables Line numbers are unsigned, 32 bits. */ typedef U32 line_t; +#define LINE_Tf U32uf #define NOLINE ((line_t) 4294967295UL) /* = FFFFFFFF */ /* Helpful alias for version prescan */ @@ -2585,6 +2672,10 @@ C is like C but returns C MEM_SIZE_MAX */ + # define _MEM_WRAP_NEEDS_RUNTIME_CHECK(n,t) \ ( sizeof(MEM_SIZE) < sizeof(n) \ || sizeof(t) > ((MEM_SIZE)1 << 8*(sizeof(MEM_SIZE) - sizeof(n)))) @@ -2677,17 +2769,17 @@ PoisonWith(0xEF) for catching access to ( (void) (UNLIKELY(_MEM_WRAP_WILL_WRAP(n,t)) \ && (Perl_croak_nocontext(ASSERT_IS_LITERAL(a)), 0))) -#define MEM_WRAP_CHECK_(n,t) MEM_WRAP_CHECK(n,t), +# define MEM_WRAP_CHECK_(n,t) MEM_WRAP_CHECK(n,t), -#define PERL_STRLEN_ROUNDUP(n) ((void)(((n) > MEM_SIZE_MAX - 2 * PERL_STRLEN_ROUNDUP_QUANTUM) ? (croak_memory_wrap(),0) : 0), _PERL_STRLEN_ROUNDUP_UNCHECKED(n)) +# define PERL_STRLEN_ROUNDUP(n) ((void)(((n) > MEM_SIZE_MAX - 2 * PERL_STRLEN_ROUNDUP_QUANTUM) ? (croak_memory_wrap(),0) : 0), _PERL_STRLEN_ROUNDUP_UNCHECKED(n)) #else -#define MEM_WRAP_CHECK(n,t) -#define MEM_WRAP_CHECK_1(n,t,a) -#define MEM_WRAP_CHECK_s(n,t,a) -#define MEM_WRAP_CHECK_(n,t) +# define MEM_WRAP_CHECK(n,t) +# define MEM_WRAP_CHECK_1(n,t,a) +# define MEM_WRAP_CHECK_s(n,t,a) +# define MEM_WRAP_CHECK_(n,t) -#define PERL_STRLEN_ROUNDUP(n) _PERL_STRLEN_ROUNDUP_UNCHECKED(n) +# define PERL_STRLEN_ROUNDUP(n) _PERL_STRLEN_ROUNDUP_UNCHECKED(n) #endif @@ -2792,6 +2884,11 @@ enum mem_log_type { #define CopyD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), perl_assert_ptr(s), memcpy((char*)(d),(const char*)(s), (n) * sizeof(t))) #define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) perl_assert_ptr(d), memzero((char*)(d), (n) * sizeof(t))) +#define NewCopy(s,d,n,t) STMT_START { \ + Newx(d,n,t); \ + Copy(s,d,n,t); \ +} STMT_END + #define PoisonWith(d,n,t,b) (MEM_WRAP_CHECK_(n,t) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))) #define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) #define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) @@ -2826,6 +2923,12 @@ last-inclusive range. #define C_ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0])) #define C_ARRAY_END(a) ((a) + C_ARRAY_LENGTH(a)) +#if defined(PERL_CORE) || defined(PERL_EXT_RE_BUILD) +/* strlen() of a literal string constant. Restricting this to core, in part + * because it can generate compiler warnings about comparing unlike signs */ +# define STRLENs(s) (sizeof("" s "") - 1) +#endif + #ifdef NEED_VA_COPY # ifdef va_copy # define Perl_va_copy(s, d) va_copy(d, s) @@ -2853,18 +2956,53 @@ last-inclusive range. #define pTHX__VALUE #endif /* USE_ITHREADS */ -/* Perl_deprecate was not part of the public API, and did not have a deprecate() - shortcut macro defined without -DPERL_CORE. Neither codesearch.google.com nor - CPAN::Unpack show any users outside the core. */ +/* + Perl_deprecate was not part of the public API, and did not have a deprecate() + shortcut macro defined without -DPERL_CORE. Neither codesearch.google.com nor + CPAN::Unpack show any users outside the core. + +=for apidoc_section $warning +=for apidoc Cdm||deprecate|U32 category|"message" +Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the +given category with an appropriate message. The C argument must +be a C string. The string " is deprecated" will automatically be added +to the end of the C. + +=for apidoc Cdm||deprecate_disappears_in|U32 category|"when"|"message" +Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the +given category with an appropriate message that the construct referred +to by the message will disappear in a specific release. The C and +C arguments must be a C string. The C string is expected +to be of the form "5.40", with no minor element in the version. The actual +message output will be the result of the following expression C which is why C +and C must be literal C strings. + +=for apidoc Cdm||deprecate_fatal_in|U32 category|"when"|"message" +Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the +given category with an appropriate message that the construct referred +to by the message will become fatal in a specific release. The C +and C arguments must be a C string. The C string is expected +to be of the form "5.40", with no minor element in the version. The actual +message output will be the result of the following expression C which is why C +and C must be literal C strings. + +=cut +*/ + #ifdef PERL_CORE -# define deprecate(s) Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), \ - "Use of " s " is deprecated") -# define deprecate_disappears_in(when,message) \ - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), \ - message " is deprecated, and will disappear in Perl " when) -# define deprecate_fatal_in(when,message) \ - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), \ - message " is deprecated, and will become fatal in Perl " when) +# define deprecate(category,message) \ + Perl_ck_warner_d(aTHX_ packWARN(category), \ + message " is deprecated") + +# define deprecate_disappears_in(category,when,message) \ + Perl_ck_warner_d(aTHX_ packWARN(category), \ + message " is deprecated, and will disappear in Perl " when) + +# define deprecate_fatal_in(category,when,message) \ + Perl_ck_warner_d(aTHX_ packWARN(category), \ + message " is deprecated, and will become fatal in Perl " when) #endif /* Internal macros to deal with gids and uids */ @@ -2893,6 +3031,85 @@ last-inclusive range. # endif /* Gid_t_size */ #endif + +/* These are simple Marsaglia XOR-SHIFT RNG's for 64 and 32 bits. These + * RNG's are of reasonable quality, very fast, and have the interesting + * property that provided 'x' is non-zero they create a cycle of 2^32-1 + * or 2^64-1 "random" like numbers, with the exception of 0. Thus they + * are very useful when you want an integer to "dance" in a random way, + * but you also never want it to become 0 and thus false. + * + * Obviously they leave x unchanged if it starts out as 0. + * + * We have two variants just because that can be helpful in certain + * places. There is no advantage to either, they are equally bad as each + * other as far RNG's go. Sufficiently random for many purposes, but + * insufficiently random for serious use as they fail important tests in + * the Test01 BigCrush RNG test suite by L’Ecuyer and Simard. (Note + * that Drand48 also fails BigCrush). The main point is they produce + * different sequences and in places where we want some randomlike + * behavior they are cheap and easy. + * + * Marsaglia was one of the early researchers into RNG testing and wrote + * the Diehard RNG test suite, which after his death become the + * Dieharder RNG suite, and was generally supplanted by the Test01 suite + * by L'Ecruyer and associates. + * + * There are dozens of shift parameters that create a pseudo random ring + * of integers 1..2^N-1, if you need a different sequence just read the + * paper and select a set of parameters. In fact, simply reversing the + * shift order from L/R/L to R/L/R should result in another valid + * example, but read the paper before you do that. + * + * PDF of the original paper: + * https://www.jstatsoft.org/article/download/v008i14/916 + * Wikipedia: + * https://en.wikipedia.org/wiki/Xorshift + * Criticism: + * https://www.iro.umontreal.ca/~lecuyer/myftp/papers/xorshift.pdf + * Test01: + * http://simul.iro.umontreal.ca/testu01/tu01.html + * Diehard: + * https://en.wikipedia.org/wiki/Diehard_tests + * Dieharder: + * https://webhome.phy.duke.edu/~rgb/General/rand_rate/rand_rate.abs + * + */ + +/* 32 bit version */ +#define PERL_XORSHIFT32_A(x) \ +STMT_START { \ + (x) ^= ((x) << 13); \ + (x) ^= ((x) >> 17); \ + (x) ^= ((x) << 5); \ +} STMT_END + +/* 64 bit version */ +#define PERL_XORSHIFT64_A(x) \ +STMT_START { \ + (x) ^= ((x) << 13); \ + (x) ^= ((x) >> 7); \ + (x) ^= ((x) << 17); \ +} STMT_END + +/* 32 bit version */ +#define PERL_XORSHIFT32_B(x) \ +STMT_START { \ + (x) ^= ((x) << 5); \ + (x) ^= ((x) >> 27); \ + (x) ^= ((x) << 8); \ +} STMT_END + +/* 64 bit version - currently this is unused, + * it is provided here to complement the 32 bit _B + * variant which IS used. */ +#define PERL_XORSHIFT64_B(x) \ +STMT_START { \ + (x) ^= ((x) << 15); \ + (x) ^= ((x) >> 49); \ + (x) ^= ((x) << 26); \ +} STMT_END + #endif /* PERL_HANDY_H_ */ Index: gnu/usr.bin/perl/hv.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hv.c,v diff -u -p -a -u -p -r1.26 hv.c --- gnu/usr.bin/perl/hv.c 15 Feb 2023 01:36:13 -0000 1.26 +++ gnu/usr.bin/perl/hv.c 21 Feb 2024 15:47:02 -0000 @@ -56,20 +56,10 @@ static const char S_strtab_error[] */ #if IVSIZE == 8 /* 64 bit version */ -#define XORSHIFT_RAND_BITS(x) \ -STMT_START { \ - (x) ^= (x) << 13; \ - (x) ^= (x) >> 17; \ - (x) ^= (x) << 5; \ -} STMT_END +#define XORSHIFT_RAND_BITS(x) PERL_XORSHIFT64_A(x) #else /* 32 bit version */ -#define XORSHIFT_RAND_BITS(x) \ -STMT_START { \ - (x) ^= (x) << 13; \ - (x) ^= (x) >> 7; \ - (x) ^= (x) << 17; \ -} STMT_END +#define XORSHIFT_RAND_BITS(x) PERL_XORSHIFT32_A(x) #endif #define UPDATE_HASH_RAND_BITS_KEY(key,klen) \ @@ -337,28 +327,44 @@ S_hv_notallowed(pTHX_ int flags, const c * contains an SV* */ /* -=for apidoc hv_store +=for apidoc hv_store +=for apidoc_item hv_stores -Stores an SV in a hash. The hash key is specified as C and the -absolute value of C is the length of the key. If C is -negative the key is assumed to be in UTF-8-encoded Unicode. The -C parameter is the precomputed hash value; if it is zero then -Perl will compute it. +These each store SV C with the specified key in hash C, returning NULL +if the operation failed or if the value did not need to be actually stored +within the hash (as in the case of tied hashes). Otherwise it can be +dereferenced to get the original C. -The return value will be -C if the operation failed or if the value did not need to be actually -stored within the hash (as in the case of tied hashes). Otherwise it can -be dereferenced to get the original C. Note that the caller is +They differ only in how the hash key is specified. + +In C, the key is a C language string literal, enclosed in double +quotes. It is never treated as being in UTF-8. + +In C, C is either NULL or points to the first byte of the string +specifying the key, and its length in bytes is given by the absolute value of +an additional parameter, C. A NULL key indicates the key is to be +treated as C, and C is ignored; otherwise the key string may +contain embedded-NUL bytes. If C is negative, the string is treated as +being encoded in UTF-8; otherwise not. + +C has another extra parameter, C, a precomputed hash of the key +string, or zero if it has not been precomputed. This parameter is omitted from +C, as it is computed automatically at compile time. + +If is NULL, NULL is returned and no action is taken. + +If C is NULL, it is treated as being C; otherwise the caller is responsible for suitably incrementing the reference count of C before the call, and decrementing it if the function returned C. Effectively a successful C takes ownership of one reference to C. This is usually what you want; a newly created SV has a reference count of one, so if all your code does is create SVs then store them in a hash, C will own the only reference to the new SV, and your code doesn't need to do -anything further to tidy up. C is not implemented as a call to -C, and does not create a temporary SV for the key, so if your -key data is not already in SV form then use C in preference to -C. +anything further to tidy up. + +C is not implemented as a call to L>, and does not +create a temporary SV for the key, so if your key data is not already in SV +form then use C in preference to C. See L for more information on how to use this function on tied hashes. @@ -474,7 +480,7 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, if (!hv) return NULL; - if (SvTYPE(hv) == (svtype)SVTYPEMASK) + if (SvIS_FREED(hv)) return NULL; assert(SvTYPE(hv) == SVt_PVHV); @@ -587,7 +593,7 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, for (i = 0; i < klen; ++i) if (isLOWER(key[i])) { /* Would be nice if we had a routine to do the - copy and upercase in a single pass through. */ + copy and uppercase in a single pass through. */ const char * const nkey = strupr(savepvn(key,klen)); /* Note that this fetch is for nkey (the uppercased key) whereas the store is for key (the original) */ @@ -1000,7 +1006,7 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, *oentry = entry; } #ifdef PERL_HASH_RANDOMIZE_KEYS - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { /* Currently this makes various tests warn in annoying ways. * So Silenced for now. - Yves | bogus end of comment =>* / if (HvAUX(hv)->xhv_riter != -1) { @@ -1416,11 +1422,11 @@ S_hv_delete_common(pTHX_ HV *hv, SV *key else { HeVAL(entry) = NULL; *oentry = HeNEXT(entry); - if (SvOOK(hv) && entry == HvAUX(hv)->xhv_eiter /* HvEITER(hv) */) { + if (HvHasAUX(hv) && entry == HvAUX(hv)->xhv_eiter /* HvEITER(hv) */) { HvLAZYDEL_on(hv); } else { - if (SvOOK(hv) && HvLAZYDEL(hv) && + if (HvHasAUX(hv) && HvLAZYDEL(hv) && entry == HeNEXT(HvAUX(hv)->xhv_eiter)) HeNEXT(HvAUX(hv)->xhv_eiter) = HeNEXT(entry); hv_free_ent(NULL, entry); @@ -1433,7 +1439,7 @@ S_hv_delete_common(pTHX_ HV *hv, SV *key /* If this is a stash and the key ends with ::, then someone is * deleting a package. */ - if (sv && SvTYPE(sv) == SVt_PVGV && HvENAME_get(hv)) { + if (sv && SvTYPE(sv) == SVt_PVGV && HvHasENAME(hv)) { gv = (GV *)sv; if (( (klen > 1 && key[klen-2] == ':' && key[klen-1] == ':') @@ -1442,7 +1448,7 @@ S_hv_delete_common(pTHX_ HV *hv, SV *key ) && (klen != 6 || hv!=PL_defstash || memNE(key,"main::",6)) && (stash = GvHV((GV *)gv)) - && HvENAME_get(stash)) { + && HvHasENAME(stash)) { /* A previous version of this code checked that the * GV was still in the symbol table by fetching the * GV with its name. That is not necessary (and @@ -1470,11 +1476,13 @@ S_hv_delete_common(pTHX_ HV *hv, SV *key SV **svp, **end; strip_magic: svp = AvARRAY(isa); - end = svp + (AvFILLp(isa)+1); - while (svp < end) { - if (*svp) - mg_free_type(*svp, PERL_MAGIC_isaelem); - ++svp; + if (svp) { + end = svp + (AvFILLp(isa)+1); + while (svp < end) { + if (*svp) + mg_free_type(*svp, PERL_MAGIC_isaelem); + ++svp; + } } mg_free_type((SV*)GvAV(gv), PERL_MAGIC_isa); } @@ -1529,7 +1537,7 @@ S_hv_delete_common(pTHX_ HV *hv, SV *key if (sv) { /* deletion of method from stash */ if (isGV(sv) && isGV_with_GP(sv) && GvCVu(sv) - && HvENAME_get(hv)) + && HvHasENAME(hv)) mro_method_changed_in(hv); if (d_flags & G_DISCARD) { @@ -1586,7 +1594,7 @@ static bool S_large_hash_heuristic(pTHX_ HV *hv, STRLEN size) { if (size > 42 && !SvOBJECT(hv) - && !(SvOOK(hv) && HvENAME_get(hv))) { + && !(HvHasAUX(hv) && HvENAME_get(hv))) { /* This hash appears to be growing quite large. We gamble that it is not sharing keys with other hashes. */ return TRUE; @@ -1679,6 +1687,19 @@ S_hsplit(pTHX_ HV *hv, STRLEN const olds } while (i++ < oldsize); } +/* +=for apidoc hv_ksplit + +Attempt to grow the hash C so it has at least C buckets available. +Perl chooses the actual number for its convenience. + +This is the same as doing the following in Perl code: + + keys %hv = newmax; + +=cut +*/ + void Perl_hv_ksplit(pTHX_ HV *hv, IV newmax) { @@ -1716,11 +1737,11 @@ Perl_hv_ksplit(pTHX_ HV *hv, IV newmax) a = (char *) HvARRAY(hv); if (a) { #ifdef PERL_HASH_RANDOMIZE_KEYS - U32 was_ook = SvOOK(hv); + U32 was_ook = HvHasAUX(hv); #endif hsplit(hv, oldsize, newsize); #ifdef PERL_HASH_RANDOMIZE_KEYS - if (was_ook && SvOOK(hv) && HvTOTALKEYS(hv)) { + if (was_ook && HvHasAUX(hv) && HvTOTALKEYS(hv)) { MAYBE_UPDATE_HASH_RAND_BITS(); HvAUX(hv)->xhv_rand = (U32)PL_hash_rand_bits; } @@ -2018,7 +2039,7 @@ Perl_hv_clear(pTHX_ HV *hv) HvHASKFLAGS_off(hv); } - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { if(HvENAME_get(hv)) mro_isa_changed_in(hv); HvEITER_set(hv, NULL); @@ -2079,7 +2100,7 @@ S_clear_placeholders(pTHX_ HV *hv, const if (entry == HvEITER_get(hv)) HvLAZYDEL_on(hv); else { - if (SvOOK(hv) && HvLAZYDEL(hv) && + if (HvHasAUX(hv) && HvLAZYDEL(hv) && entry == HeNEXT(HvAUX(hv)->xhv_eiter)) HeNEXT(HvAUX(hv)->xhv_eiter) = HeNEXT(entry); hv_free_ent(NULL, entry); @@ -2138,7 +2159,7 @@ Perl_hfree_next_entry(pTHX_ HV *hv, STRL PERL_ARGS_ASSERT_HFREE_NEXT_ENTRY; - if (SvOOK(hv) && ((iter = HvAUX(hv)))) { + if (HvHasAUX(hv) && ((iter = HvAUX(hv)))) { if ((entry = iter->xhv_eiter)) { /* the iterator may get resurrected after each * destructor call, so check each time */ @@ -2169,9 +2190,9 @@ Perl_hfree_next_entry(pTHX_ HV *hv, STRL array[*indexp] = HeNEXT(entry); ((XPVHV*) SvANY(hv))->xhv_keys--; - if ( PL_phase != PERL_PHASE_DESTRUCT && HvENAME(hv) + if ( PL_phase != PERL_PHASE_DESTRUCT && HvHasENAME(hv) && HeVAL(entry) && isGV(HeVAL(entry)) - && GvHV(HeVAL(entry)) && HvENAME(GvHV(HeVAL(entry))) + && GvHV(HeVAL(entry)) && HvHasENAME(GvHV(HeVAL(entry))) ) { STRLEN klen; const char * const key = HePV(entry,klen); @@ -2205,7 +2226,7 @@ void Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags) { bool save; - SSize_t orig_ix = PL_tmps_ix; /* silence compiler warning about unitialized vars */ + SSize_t orig_ix = PL_tmps_ix; /* silence compiler warning about uninitialized vars */ if (!hv) return; @@ -2222,7 +2243,7 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 fl if they will be freed anyway. */ /* note that the code following prior to hv_free_entries is duplicated * in sv_clear(), and changes here should be done there too */ - if (PL_phase != PERL_PHASE_DESTRUCT && HvNAME(hv)) { + if (PL_phase != PERL_PHASE_DESTRUCT && HvHasNAME(hv)) { if (PL_stashcache) { DEBUG_o(Perl_deb(aTHX_ "hv_undef_flags clearing PL_stashcache for '%" HEKf "'\n", HEKfARG(HvNAME_HEK(hv)))); @@ -2243,7 +2264,7 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 fl HE* that needs to be explicitly freed. */ hv_free_entries(hv); - /* SvOOK() is true for a hash if it has struct xpvhv_aux allocated. That + /* HvHasAUX() is true for a hash if it has struct xpvhv_aux allocated. That structure has several other pieces of allocated memory - hence those must be freed before the structure itself can be freed. Some can be freed when a hash is "undefined" (this function), but some must persist until it is @@ -2256,32 +2277,36 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 fl must remain consistent, because this code can no longer clear SVf_OOK, meaning that this structure might be read again at any point in the future without further checks or reinitialisation. */ - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { + struct xpvhv_aux *aux = HvAUX(hv); struct mro_meta *meta; const char *name; - if (HvENAME_get(hv)) { + if (HvHasENAME(hv)) { if (PL_phase != PERL_PHASE_DESTRUCT) mro_isa_changed_in(hv); if (PL_stashcache) { DEBUG_o(Perl_deb(aTHX_ "hv_undef_flags clearing PL_stashcache for effective name '%" - HEKf "'\n", HEKfARG(HvENAME_HEK(hv)))); - (void)hv_deletehek(PL_stashcache, HvENAME_HEK(hv), G_DISCARD); + HEKf "'\n", HEKfARG(HvENAME_HEK_NN(hv)))); + (void)hv_deletehek(PL_stashcache, HvENAME_HEK_NN(hv), G_DISCARD); } } /* If this call originated from sv_clear, then we must check for * effective names that need freeing, as well as the usual name. */ name = HvNAME(hv); - if (flags & HV_NAME_SETALL ? !!HvAUX(hv)->xhv_name_u.xhvnameu_name : !!name) { + if (flags & HV_NAME_SETALL + ? cBOOL(aux->xhv_name_u.xhvnameu_name) + : cBOOL(name)) + { if (name && PL_stashcache) { DEBUG_o(Perl_deb(aTHX_ "hv_undef_flags clearing PL_stashcache for name '%" - HEKf "'\n", HEKfARG(HvNAME_HEK(hv)))); - (void)hv_deletehek(PL_stashcache, HvNAME_HEK(hv), G_DISCARD); + HEKf "'\n", HEKfARG(HvNAME_HEK_NN(hv)))); + (void)hv_deletehek(PL_stashcache, HvNAME_HEK_NN(hv), G_DISCARD); } hv_name_set(hv, NULL, 0, flags); } - if((meta = HvAUX(hv)->xhv_mro_meta)) { + if((meta = aux->xhv_mro_meta)) { if (meta->mro_linear_all) { SvREFCNT_dec_NN(meta->mro_linear_all); /* mro_linear_current is just acting as a shortcut pointer, @@ -2295,7 +2320,20 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 fl SvREFCNT_dec(meta->isa); SvREFCNT_dec(meta->super); Safefree(meta); - HvAUX(hv)->xhv_mro_meta = NULL; + aux->xhv_mro_meta = NULL; + } + + if(HvSTASH_IS_CLASS(hv)) { + SvREFCNT_dec(aux->xhv_class_superclass); + SvREFCNT_dec(aux->xhv_class_initfields_cv); + SvREFCNT_dec(aux->xhv_class_adjust_blocks); + if(aux->xhv_class_fields) + PadnamelistREFCNT_dec(aux->xhv_class_fields); + SvREFCNT_dec(aux->xhv_class_param_map); + Safefree(aux->xhv_class_suspended_initfields_compcv); + aux->xhv_class_suspended_initfields_compcv = NULL; + + aux->xhv_aux_flags &= ~HvAUXf_IS_CLASS; } } @@ -2375,7 +2413,7 @@ S_hv_auxinit(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_AUXINIT; - if (!SvOOK(hv)) { + if (!HvHasAUX(hv)) { char *array = (char *) HvARRAY(hv); if (!array) { Newxz(array, PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv) + 1), char); @@ -2423,7 +2461,7 @@ Perl_hv_iterinit(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_ITERINIT; - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { struct xpvhv_aux * iter = HvAUX(hv); HE * const entry = iter->xhv_eiter; /* HvEITER(hv) */ if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */ @@ -2457,7 +2495,7 @@ Perl_hv_riter_p(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_RITER_P; - iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv); + iter = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv); return &(iter->xhv_riter); } @@ -2475,7 +2513,7 @@ Perl_hv_eiter_p(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_EITER_P; - iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv); + iter = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv); return &(iter->xhv_eiter); } @@ -2493,7 +2531,7 @@ Perl_hv_riter_set(pTHX_ HV *hv, I32 rite PERL_ARGS_ASSERT_HV_RITER_SET; - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { iter = HvAUX(hv); } else { if (riter == -1) @@ -2511,7 +2549,7 @@ Perl_hv_rand_set(pTHX_ HV *hv, U32 new_x PERL_ARGS_ASSERT_HV_RAND_SET; #ifdef PERL_HASH_RANDOMIZE_KEYS - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { iter = HvAUX(hv); } else { iter = hv_auxinit(hv); @@ -2536,7 +2574,7 @@ Perl_hv_eiter_set(pTHX_ HV *hv, HE *eite PERL_ARGS_ASSERT_HV_EITER_SET; - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { iter = HvAUX(hv); } else { /* 0 is the default so don't go malloc()ing a new structure just to @@ -2549,6 +2587,31 @@ Perl_hv_eiter_set(pTHX_ HV *hv, HE *eite iter->xhv_eiter = eiter; } +/* +=for apidoc hv_name_set +=for apidoc_item ||hv_name_sets|HV *hv|"name"|U32 flags + +These each set the name of stash C to the specified name. + +They differ only in how the name is specified. + +In C, the name is a literal C string, enclosed in double quotes. + +In C, C points to the first byte of the name, and an +additional parameter, C, specifies its length in bytes. Hence, the name +may contain embedded-NUL characters. + +If C is set in C, the name is treated as being in UTF-8; +otherwise not. + +If C is set in C, both the name and the effective name +are set. + +=for apidoc Amnh||HV_NAME_SETALL + +=cut +*/ + void Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags) { @@ -2561,7 +2624,7 @@ Perl_hv_name_set(pTHX_ HV *hv, const cha if (len > I32_MAX) Perl_croak(aTHX_ "panic: hv name too long (%" UVuf ")", (UV) len); - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { iter = HvAUX(hv); if (iter->xhv_name_u.xhvnameu_name) { if(iter->xhv_name_count) { @@ -2657,7 +2720,7 @@ table. void Perl_hv_ename_add(pTHX_ HV *hv, const char *name, U32 len, U32 flags) { - struct xpvhv_aux *aux = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv); + struct xpvhv_aux *aux = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv); U32 hash; PERL_ARGS_ASSERT_HV_ENAME_ADD; @@ -2727,7 +2790,7 @@ Perl_hv_ename_delete(pTHX_ HV *hv, const if (len > I32_MAX) Perl_croak(aTHX_ "panic: hv name too long (%" UVuf ")", (UV) len); - if (!SvOOK(hv)) return; + if (!HvHasAUX(hv)) return; aux = HvAUX(hv); if (!aux->xhv_name_u.xhvnameu_name) return; @@ -2787,7 +2850,7 @@ Perl_hv_backreferences_p(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_BACKREFERENCES_P; /* See also Perl_sv_get_backrefs in sv.c where this logic is unrolled */ { - struct xpvhv_aux * const iter = SvOOK(hv) ? HvAUX(hv) : hv_auxinit(hv); + struct xpvhv_aux * const iter = HvHasAUX(hv) ? HvAUX(hv) : hv_auxinit(hv); return &(iter->xhv_backreferences); } } @@ -2798,7 +2861,7 @@ Perl_hv_kill_backrefs(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_KILL_BACKREFS; - if (!SvOOK(hv)) + if (!HvHasAUX(hv)) return; av = HvAUX(hv)->xhv_backreferences; @@ -2853,7 +2916,7 @@ Perl_hv_iternext_flags(pTHX_ HV *hv, I32 PERL_ARGS_ASSERT_HV_ITERNEXT_FLAGS; - if (!SvOOK(hv)) { + if (!HvHasAUX(hv)) { /* Too many things (well, pp_each at least) merrily assume that you can call hv_iternext without calling hv_iterinit, so we'll have to deal with it. */ @@ -3068,7 +3131,7 @@ Perl_hv_iterkeysv(pTHX_ HE *entry) { PERL_ARGS_ASSERT_HV_ITERKEYSV; - return sv_2mortal(newSVhek(HeKEY_hek(entry))); + return newSVhek_mortal(HeKEY_hek(entry)); } /* @@ -3316,7 +3379,7 @@ S_share_hek_flags(pTHX_ const char *str, if (!entry) { /* What used to be head of the list. If this is NULL, then we're the first entry for this slot, which - means we need to increate fill. */ + means we need to increase fill. */ struct shared_he *new_entry; HEK *hek; char *k; @@ -3521,8 +3584,8 @@ Perl_refcounted_he_chain_2hv(pTHX_ const const STRLEN klen = HeKLEN(entry); const char *const key = HeKEY(entry); if (klen == chain->refcounted_he_keylen - && (!!HeKUTF8(entry) - == !!(chain->refcounted_he_data[0] & HVhek_UTF8)) + && (cBOOL(HeKUTF8(entry)) + == cBOOL((chain->refcounted_he_data[0] & HVhek_UTF8))) && memEQ(key, REF_HE_KEY(chain), klen)) goto next_please; #else @@ -3967,7 +4030,7 @@ Upon return, C<*flags> will be set to ei Alternatively, use the macro C>; or if you don't need to know if the label is UTF-8 or not, the macro C>; -or if you additionally dont need to know the length, C>. +or if you additionally don't need to know the length, C>. =cut */ Index: gnu/usr.bin/perl/hv.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hv.h,v diff -u -p -a -u -p -r1.18 hv.h --- gnu/usr.bin/perl/hv.h 15 Feb 2023 01:36:13 -0000 1.18 +++ gnu/usr.bin/perl/hv.h 21 Feb 2024 15:47:02 -0000 @@ -112,6 +112,9 @@ union _xhvnameu { HEK **xhvnameu_names; /* When xhv_name_count is non-0 */ }; +/* A struct defined by pad.h and used within class.c */ +struct suspended_compcv; + struct xpvhv_aux { union _xhvnameu xhv_name_u; /* name, if a symbol table */ AV *xhv_backreferences; /* back references for weak references */ @@ -132,10 +135,25 @@ struct xpvhv_aux { used to detect each() after insert for warnings */ #endif U32 xhv_aux_flags; /* assorted extra flags */ + + /* The following fields are only valid if we have the flag HvAUXf_IS_CLASS */ + HV *xhv_class_superclass; /* STASH of the :isa() base class */ + CV *xhv_class_initfields_cv; /* CV for running initfields */ + AV *xhv_class_adjust_blocks; /* CVs containing the ADJUST blocks */ + PADNAMELIST *xhv_class_fields; /* PADNAMEs with PadnameIsFIELD() */ + PADOFFSET xhv_class_next_fieldix; + HV *xhv_class_param_map; /* Maps param names to field index stored in UV */ + + struct suspended_compcv + *xhv_class_suspended_initfields_compcv; }; #define HvAUXf_SCAN_STASH 0x1 /* stash is being scanned by gv_check */ #define HvAUXf_NO_DEREF 0x2 /* @{}, %{} etc (and nomethod) not present */ +#define HvAUXf_IS_CLASS 0x4 /* the package is a 'class' */ + +#define HvSTASH_IS_CLASS(hv) \ + (HvHasAUX(hv) && HvAUX(hv)->xhv_aux_flags & HvAUXf_IS_CLASS) /* hash structure: */ /* This structure must match the beginning of struct xpvmg in sv.h. */ @@ -280,19 +298,33 @@ hash. =cut */ + #define HvFILL(hv) Perl_hv_fill(aTHX_ MUTABLE_HV(hv)) #define HvMAX(hv) ((XPVHV*) SvANY(hv))->xhv_max + +/* + +=for apidoc Am|bool|HvHasAUX|HV *const hv + +Returns true if the HV has a C extension. Use this to check +whether it is valid to call C. + +=cut + +*/ +#define HvHasAUX(hv) (SvFLAGS(hv) & SVphv_HasAUX) + /* This quite intentionally does no flag checking first. That's your - responsibility. */ + responsibility. Use HvHasAUX() first */ #define HvAUX(hv) (&(((struct xpvhv_with_aux*) SvANY(hv))->xhv_aux)) #define HvRITER(hv) (*Perl_hv_riter_p(aTHX_ MUTABLE_HV(hv))) #define HvEITER(hv) (*Perl_hv_eiter_p(aTHX_ MUTABLE_HV(hv))) #define HvRITER_set(hv,r) Perl_hv_riter_set(aTHX_ MUTABLE_HV(hv), r) #define HvEITER_set(hv,e) Perl_hv_eiter_set(aTHX_ MUTABLE_HV(hv), e) -#define HvRITER_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_riter : -1) -#define HvEITER_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_eiter : NULL) -#define HvRAND_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_rand : 0) -#define HvLASTRAND_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_last_rand : 0) +#define HvRITER_get(hv) (HvHasAUX(hv) ? HvAUX(hv)->xhv_riter : -1) +#define HvEITER_get(hv) (HvHasAUX(hv) ? HvAUX(hv)->xhv_eiter : NULL) +#define HvRAND_get(hv) (HvHasAUX(hv) ? HvAUX(hv)->xhv_rand : 0) +#define HvLASTRAND_get(hv) (HvHasAUX(hv) ? HvAUX(hv)->xhv_last_rand : 0) #define HvNAME(hv) HvNAME_get(hv) #define HvNAMELEN(hv) HvNAMELEN_get(hv) @@ -313,15 +345,16 @@ hash. ) /* This macro may go away without notice. */ #define HvNAME_HEK(hv) \ - (SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name ? HvNAME_HEK_NN(hv) : NULL) + (HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name ? HvNAME_HEK_NN(hv) : NULL) +#define HvHasNAME(hv) \ + (HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) #define HvNAME_get(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ - ? HEK_KEY(HvNAME_HEK_NN(hv)) : NULL) + (HvHasNAME(hv) ? HEK_KEY(HvNAME_HEK_NN(hv)) : NULL) #define HvNAMELEN_get(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ + ((HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ ? HEK_LEN(HvNAME_HEK_NN(hv)) : 0) #define HvNAMEUTF8(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ + ((HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvNAME_HEK_NN(hv)) \ ? HEK_UTF8(HvNAME_HEK_NN(hv)) : 0) #define HvENAME_HEK_NN(hv) \ ( \ @@ -330,17 +363,18 @@ hash. HvAUX(hv)->xhv_name_count == -1 ? NULL : \ HvAUX(hv)->xhv_name_u.xhvnameu_name \ ) +#define HvHasENAME_HEK(hv) \ + (HvHasAUX(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name) #define HvENAME_HEK(hv) \ - (SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name ? HvENAME_HEK_NN(hv) : NULL) + (HvHasENAME_HEK(hv) ? HvENAME_HEK_NN(hv) : NULL) +#define HvHasENAME(hv) \ + (HvHasENAME_HEK(hv) && HvAUX(hv)->xhv_name_count != -1) #define HvENAME_get(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \ - ? HEK_KEY(HvENAME_HEK_NN(hv)) : NULL) + (HvHasENAME(hv) ? HEK_KEY(HvENAME_HEK_NN(hv)) : NULL) #define HvENAMELEN_get(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \ - ? HEK_LEN(HvENAME_HEK_NN(hv)) : 0) + (HvHasENAME(hv) ? HEK_LEN(HvENAME_HEK_NN(hv)) : 0) #define HvENAMEUTF8(hv) \ - ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \ - ? HEK_UTF8(HvENAME_HEK_NN(hv)) : 0) + (HvHasENAME(hv) ? HEK_UTF8(HvENAME_HEK_NN(hv)) : 0) /* * HvKEYS gets the number of keys that actually exist(), and is provided Index: gnu/usr.bin/perl/hv_func.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hv_func.h,v diff -u -p -a -u -p -r1.12 hv_func.h --- gnu/usr.bin/perl/hv_func.h 15 Feb 2023 01:36:13 -0000 1.12 +++ gnu/usr.bin/perl/hv_func.h 21 Feb 2024 15:47:02 -0000 @@ -23,7 +23,19 @@ #endif #ifndef PERL_HASH_USE_SBOX32_ALSO -#define PERL_HASH_USE_SBOX32_ALSO 1 +# if defined(PERL_HASH_USE_SBOX32) || !defined(PERL_HASH_NO_SBOX32) +# define PERL_HASH_USE_SBOX32_ALSO 1 +# else +# define PERL_HASH_USE_SBOX32_ALSO 0 +# endif +#endif + +#undef PERL_HASH_USE_SBOX32 +#undef PERL_HASH_NO_SBOX32 +#if PERL_HASH_USE_SBOX32_ALSO != 0 +# define PERL_HASH_USE_SBOX32 +#else +# define PERL_HASH_NO_SBOX32 #endif #ifndef SBOX32_MAX_LEN @@ -34,40 +46,43 @@ #include "sbox32_hash.h" #if defined(PERL_HASH_FUNC_SIPHASH) -# define __PERL_HASH_FUNC "SIPHASH_2_4" -# define __PERL_HASH_WORD_TYPE U64 -# define __PERL_HASH_WORD_SIZE sizeof(__PERL_HASH_WORD_TYPE) -# define __PERL_HASH_SEED_BYTES (__PERL_HASH_WORD_SIZE * 2) -# define __PERL_HASH_STATE_BYTES (__PERL_HASH_WORD_SIZE * 4) -# define __PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state) -# define __PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_2_4_with_state((state),(U8*)(str),(len)) +# define PERL_HASH_FUNC_DEFINE "PERL_HASH_FUNC_SIPHASH" +# define PVT__PERL_HASH_FUNC "SIPHASH_2_4" +# define PVT__PERL_HASH_WORD_TYPE U64 +# define PVT__PERL_HASH_WORD_SIZE sizeof(PVT__PERL_HASH_WORD_TYPE) +# define PVT__PERL_HASH_SEED_BYTES (PVT__PERL_HASH_WORD_SIZE * 2) +# define PVT__PERL_HASH_STATE_BYTES (PVT__PERL_HASH_WORD_SIZE * 4) +# define PVT__PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state) +# define PVT__PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_2_4_with_state((state),(U8*)(str),(len)) #elif defined(PERL_HASH_FUNC_SIPHASH13) -# define __PERL_HASH_FUNC "SIPHASH_1_3" -# define __PERL_HASH_WORD_TYPE U64 -# define __PERL_HASH_WORD_SIZE sizeof(__PERL_HASH_WORD_TYPE) -# define __PERL_HASH_SEED_BYTES (__PERL_HASH_WORD_SIZE * 2) -# define __PERL_HASH_STATE_BYTES (__PERL_HASH_WORD_SIZE * 4) -# define __PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state) -# define __PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_1_3_with_state((state),(U8*)(str),(len)) +# define PERL_HASH_FUNC_DEFINE "PERL_HASH_FUNC_SIPHASH13" +# define PVT__PERL_HASH_FUNC "SIPHASH_1_3" +# define PVT__PERL_HASH_WORD_TYPE U64 +# define PVT__PERL_HASH_WORD_SIZE sizeof(PVT__PERL_HASH_WORD_TYPE) +# define PVT__PERL_HASH_SEED_BYTES (PVT__PERL_HASH_WORD_SIZE * 2) +# define PVT__PERL_HASH_STATE_BYTES (PVT__PERL_HASH_WORD_SIZE * 4) +# define PVT__PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state) +# define PVT__PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_1_3_with_state((state),(const U8*)(str),(len)) #elif defined(PERL_HASH_FUNC_ZAPHOD32) -# define __PERL_HASH_FUNC "ZAPHOD32" -# define __PERL_HASH_WORD_TYPE U32 -# define __PERL_HASH_WORD_SIZE sizeof(__PERL_HASH_WORD_TYPE) -# define __PERL_HASH_SEED_BYTES (__PERL_HASH_WORD_SIZE * 3) -# define __PERL_HASH_STATE_BYTES (__PERL_HASH_WORD_SIZE * 3) -# define __PERL_HASH_SEED_STATE(seed,state) zaphod32_seed_state(seed,state) -# define __PERL_HASH_WITH_STATE(state,str,len) (U32)zaphod32_hash_with_state((state),(U8*)(str),(len)) +# define PERL_HASH_FUNC_DEFINE "PERL_HASH_FUNC_ZAPHOD32" +# define PVT__PERL_HASH_FUNC "ZAPHOD32" +# define PVT__PERL_HASH_WORD_TYPE U32 +# define PVT__PERL_HASH_WORD_SIZE sizeof(PVT__PERL_HASH_WORD_TYPE) +# define PVT__PERL_HASH_SEED_BYTES (PVT__PERL_HASH_WORD_SIZE * 3) +# define PVT__PERL_HASH_STATE_BYTES (PVT__PERL_HASH_WORD_SIZE * 3) +# define PVT__PERL_HASH_SEED_STATE(seed,state) zaphod32_seed_state(seed,state) +# define PVT__PERL_HASH_WITH_STATE(state,str,len) (U32)zaphod32_hash_with_state((state),(U8*)(str),(len)) # include "zaphod32_hash.h" #endif -#ifndef __PERL_HASH_WITH_STATE +#ifndef PVT__PERL_HASH_WITH_STATE #error "No hash function defined!" #endif -#ifndef __PERL_HASH_SEED_BYTES -#error "__PERL_HASH_SEED_BYTES not defined" +#ifndef PVT__PERL_HASH_SEED_BYTES +#error "PVT__PERL_HASH_SEED_BYTES not defined" #endif -#ifndef __PERL_HASH_FUNC -#error "__PERL_HASH_FUNC not defined" +#ifndef PVT__PERL_HASH_FUNC +#error "PVT__PERL_HASH_FUNC not defined" #endif /* Some siphash static functions are needed by XS::APItest even when @@ -76,56 +91,56 @@ */ #include "perl_siphash.h" -#define __PERL_HASH_SEED_roundup(x, y) ( ( ( (x) + ( (y) - 1 ) ) / (y) ) * (y) ) -#define _PERL_HASH_SEED_roundup(x) __PERL_HASH_SEED_roundup(x,__PERL_HASH_WORD_SIZE) +#define PVT__PERL_HASH_SEED_roundup(x, y) ( ( ( (x) + ( (y) - 1 ) ) / (y) ) * (y) ) +#define PVT_PERL_HASH_SEED_roundup(x) PVT__PERL_HASH_SEED_roundup(x,PVT__PERL_HASH_WORD_SIZE) #define PL_hash_seed ((U8 *)PL_hash_seed_w) #define PL_hash_state ((U8 *)PL_hash_state_w) -#if PERL_HASH_USE_SBOX32_ALSO != 1 -# define _PERL_HASH_FUNC __PERL_HASH_FUNC -# define _PERL_HASH_SEED_BYTES __PERL_HASH_SEED_BYTES -# define _PERL_HASH_STATE_BYTES __PERL_HASH_STATE_BYTES -# define _PERL_HASH_SEED_STATE(seed,state) __PERL_HASH_SEED_STATE(seed,state) -# define _PERL_HASH_WITH_STATE(state,str,len) __PERL_HASH_WITH_STATE(state,str,len) +#if PERL_HASH_USE_SBOX32_ALSO == 0 +# define PVT_PERL_HASH_FUNC PVT__PERL_HASH_FUNC +# define PVT_PERL_HASH_SEED_BYTES PVT__PERL_HASH_SEED_BYTES +# define PVT_PERL_HASH_STATE_BYTES PVT__PERL_HASH_STATE_BYTES +# define PVT_PERL_HASH_SEED_STATE(seed,state) PVT__PERL_HASH_SEED_STATE(seed,state) +# define PVT_PERL_HASH_WITH_STATE(state,str,len) PVT__PERL_HASH_WITH_STATE(state,str,len) #else -#define _PERL_HASH_FUNC "SBOX32_WITH_" __PERL_HASH_FUNC +#define PVT_PERL_HASH_FUNC "SBOX32_WITH_" PVT__PERL_HASH_FUNC /* note the 4 in the below code comes from the fact the seed to initialize the SBOX is 128 bits */ -#define _PERL_HASH_SEED_BYTES ( __PERL_HASH_SEED_BYTES + (int)( 4 * sizeof(U32)) ) +#define PVT_PERL_HASH_SEED_BYTES ( PVT__PERL_HASH_SEED_BYTES + (int)( 4 * sizeof(U32)) ) -#define _PERL_HASH_STATE_BYTES \ - ( __PERL_HASH_STATE_BYTES + ( ( 1 + ( 256 * SBOX32_MAX_LEN ) ) * sizeof(U32) ) ) +#define PVT_PERL_HASH_STATE_BYTES \ + ( PVT__PERL_HASH_STATE_BYTES + ( ( 1 + ( 256 * SBOX32_MAX_LEN ) ) * sizeof(U32) ) ) -#define _PERL_HASH_SEED_STATE(seed,state) STMT_START { \ - __PERL_HASH_SEED_STATE(seed,state); \ - sbox32_seed_state128(seed + __PERL_HASH_SEED_BYTES, state + __PERL_HASH_STATE_BYTES); \ +#define PVT_PERL_HASH_SEED_STATE(seed,state) STMT_START { \ + PVT__PERL_HASH_SEED_STATE(seed,state); \ + sbox32_seed_state128(seed + PVT__PERL_HASH_SEED_BYTES, state + PVT__PERL_HASH_STATE_BYTES); \ } STMT_END -#define _PERL_HASH_WITH_STATE(state,str,len) \ +#define PVT_PERL_HASH_WITH_STATE(state,str,len) \ (LIKELY(len <= SBOX32_MAX_LEN) \ - ? sbox32_hash_with_state((state + __PERL_HASH_STATE_BYTES),(U8*)(str),(len)) \ - : __PERL_HASH_WITH_STATE((state),(str),(len))) + ? sbox32_hash_with_state((state + PVT__PERL_HASH_STATE_BYTES),(const U8*)(str),(len)) \ + : PVT__PERL_HASH_WITH_STATE((state),(str),(len))) #endif #define PERL_HASH_WITH_SEED(seed,hash,str,len) \ (hash) = S_perl_hash_with_seed((const U8 *) seed, (const U8 *) str,len) #define PERL_HASH_WITH_STATE(state,hash,str,len) \ - (hash) = _PERL_HASH_WITH_STATE((state),(U8*)(str),(len)) + (hash) = PVT_PERL_HASH_WITH_STATE((state),(const U8*)(str),(len)) -#define PERL_HASH_SEED_STATE(seed,state) _PERL_HASH_SEED_STATE(seed,state) -#define PERL_HASH_SEED_BYTES _PERL_HASH_SEED_roundup(_PERL_HASH_SEED_BYTES) -#define PERL_HASH_STATE_BYTES _PERL_HASH_SEED_roundup(_PERL_HASH_STATE_BYTES) -#define PERL_HASH_FUNC _PERL_HASH_FUNC +#define PERL_HASH_SEED_STATE(seed,state) PVT_PERL_HASH_SEED_STATE(seed,state) +#define PERL_HASH_SEED_BYTES PVT_PERL_HASH_SEED_roundup(PVT_PERL_HASH_SEED_BYTES) +#define PERL_HASH_STATE_BYTES PVT_PERL_HASH_SEED_roundup(PVT_PERL_HASH_STATE_BYTES) +#define PERL_HASH_FUNC PVT_PERL_HASH_FUNC -#define PERL_HASH_SEED_WORDS (PERL_HASH_SEED_BYTES/__PERL_HASH_WORD_SIZE) -#define PERL_HASH_STATE_WORDS (PERL_HASH_STATE_BYTES/__PERL_HASH_WORD_SIZE) +#define PERL_HASH_SEED_WORDS (PERL_HASH_SEED_BYTES/PVT__PERL_HASH_WORD_SIZE) +#define PERL_HASH_STATE_WORDS (PERL_HASH_STATE_BYTES/PVT__PERL_HASH_WORD_SIZE) #ifdef PERL_USE_SINGLE_CHAR_HASH_CACHE #define PERL_HASH(state,str,len) \ (hash) = ((len) < 2 ? ( (len) == 0 ? PL_hash_chars[256] : PL_hash_chars[(U8)(str)[0]] ) \ - : _PERL_HASH_WITH_STATE(PL_hash_state,(U8*)(str),(len))) + : PVT_PERL_HASH_WITH_STATE(PL_hash_state,(U8*)(str),(len))) #else #define PERL_HASH(hash,str,len) \ PERL_HASH_WITH_STATE(PL_hash_state,hash,(U8*)(str),(len)) @@ -162,9 +177,9 @@ PERL_STATIC_INLINE U32 S_perl_hash_with_seed(const U8 * seed, const U8 *str, STRLEN len) { - __PERL_HASH_WORD_TYPE state[PERL_HASH_STATE_WORDS]; - _PERL_HASH_SEED_STATE(seed,(U8*)state); - return _PERL_HASH_WITH_STATE((U8*)state,str,len); + PVT__PERL_HASH_WORD_TYPE state[PERL_HASH_STATE_WORDS]; + PVT_PERL_HASH_SEED_STATE(seed,(U8*)state); + return PVT_PERL_HASH_WITH_STATE((U8*)state,str,len); } #endif /*compile once*/ Index: gnu/usr.bin/perl/hv_macro.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hv_macro.h,v diff -u -p -a -u -p -r1.1.1.3 hv_macro.h --- gnu/usr.bin/perl/hv_macro.h 15 Feb 2023 01:31:52 -0000 1.1.1.3 +++ gnu/usr.bin/perl/hv_macro.h 21 Feb 2024 15:47:02 -0000 @@ -20,9 +20,9 @@ * The following 3 macros are defined in this section. The other macros defined * are only needed to help derive these 3. * - * U8TO16_LE(x) Read a little endian unsigned 32-bit int + * U8TO16_LE(x) Read a little endian unsigned 16-bit int * U8TO32_LE(x) Read a little endian unsigned 32-bit int - * U8TO28_LE(x) Read a little endian unsigned 32-bit int + * U8TO64_LE(x) Read a little endian unsigned 64-bit int * ROTL32(x,r) Rotate x left by r bits * ROTL64(x,r) Rotate x left by r bits * ROTR32(x,r) Rotate x right by r bits @@ -30,7 +30,7 @@ */ #ifndef U8TO16_LE - #define _shifted_octet(type,ptr,idx,shift) (((type)(((U8*)(ptr))[(idx)]))<<(shift)) + #define _shifted_octet(type,ptr,idx,shift) (((type)(((const U8*)(ptr))[(idx)]))<<(shift)) #if defined(USE_UNALIGNED_PTR_DEREF) && (BYTEORDER == 0x1234 || BYTEORDER == 0x12345678) #define U8TO16_LE(ptr) (*((const U16*)(ptr))) #define U8TO32_LE(ptr) (*((const U32*)(ptr))) Index: gnu/usr.bin/perl/inline.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/inline.h,v diff -u -p -a -u -p -r1.7 inline.h --- gnu/usr.bin/perl/inline.h 15 Feb 2023 01:36:13 -0000 1.7 +++ gnu/usr.bin/perl/inline.h 21 Feb 2024 15:47:02 -0000 @@ -34,6 +34,10 @@ SOFTWARE. * header files, because they depend on proto.h (included after most other * headers) or struct definitions. * + * Note also perlstatic.h for functions that can't or shouldn't be inlined, but + * whose details should be exposed to the compiler, for such things as tail + * call optimization. + * * Each section names the header file that the functions "belong" to. */ @@ -140,6 +144,78 @@ Perl_av_fetch_simple(pTHX_ AV *av, SSize } } +/* +=for apidoc av_push_simple + +This is a cut-down version of av_push that assumes that the array is very +straightforward - no magic, not readonly, and AvREAL - and that C is +not less than -1. This function MUST NOT be used in situations where any +of those assumptions may not hold. + +Pushes an SV (transferring control of one reference count) onto the end of the +array. The array will grow automatically to accommodate the addition. + +Perl equivalent: C. + +=cut +*/ + +PERL_STATIC_INLINE void +Perl_av_push_simple(pTHX_ AV *av, SV *val) +{ + PERL_ARGS_ASSERT_AV_PUSH_SIMPLE; + assert(SvTYPE(av) == SVt_PVAV); + assert(!SvMAGICAL(av)); + assert(!SvREADONLY(av)); + assert(AvREAL(av)); + assert(AvFILLp(av) > -2); + + (void)av_store_simple(av,AvFILLp(av)+1,val); +} + +/* +=for apidoc av_new_alloc + +This implements L> +and L>, which are the public API for this +functionality. + +Creates a new AV and allocates its SV* array. + +This is similar to, but more efficient than doing: + + AV *av = newAV(); + av_extend(av, key); + +The size parameter is used to pre-allocate a SV* array large enough to +hold at least elements C<0..(size-1)>. C must be at least 1. + +The C parameter controls whether or not the array is NULL +initialized. + +=cut +*/ + +PERL_STATIC_INLINE AV * +Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag) +{ + AV * const av = newAV(); + SV** ary; + PERL_ARGS_ASSERT_AV_NEW_ALLOC; + assert(size > 0); + + Newx(ary, size, SV*); /* Newx performs the memwrap check */ + AvALLOC(av) = ary; + AvARRAY(av) = ary; + AvMAX(av) = size - 1; + + if (zeroflag) + Zero(ary, size, SV*); + + return av; +} + + /* ------------------------------- cv.h ------------------------------- */ /* @@ -205,6 +281,25 @@ S_strip_spaces(pTHX_ const char * orig, } #endif +/* ------------------------------- iperlsys.h ------------------------------- */ +#if ! defined(PERL_IMPLICIT_SYS) && defined(USE_ITHREADS) + +/* Otherwise this function is implemented as macros in iperlsys.h */ + +PERL_STATIC_INLINE bool +S_PerlEnv_putenv(pTHX_ char * str) +{ + PERL_ARGS_ASSERT_PERLENV_PUTENV; + + ENV_LOCK; + bool retval = putenv(str); + ENV_UNLOCK; + + return retval; +} + +#endif + /* ------------------------------- mg.h ------------------------------- */ #if defined(PERL_CORE) || defined(PERL_EXT) @@ -314,171 +409,6 @@ Perl_ReANY(const REGEXP * const re) : (struct regexp *)p; } -/* ------------------------------- sv.h ------------------------------- */ - -PERL_STATIC_INLINE bool -Perl_SvTRUE(pTHX_ SV *sv) -{ - PERL_ARGS_ASSERT_SVTRUE; - - if (UNLIKELY(sv == NULL)) - return FALSE; - SvGETMAGIC(sv); - return SvTRUE_nomg_NN(sv); -} - -PERL_STATIC_INLINE bool -Perl_SvTRUE_nomg(pTHX_ SV *sv) -{ - PERL_ARGS_ASSERT_SVTRUE_NOMG; - - if (UNLIKELY(sv == NULL)) - return FALSE; - return SvTRUE_nomg_NN(sv); -} - -PERL_STATIC_INLINE bool -Perl_SvTRUE_NN(pTHX_ SV *sv) -{ - PERL_ARGS_ASSERT_SVTRUE_NN; - - SvGETMAGIC(sv); - return SvTRUE_nomg_NN(sv); -} - -PERL_STATIC_INLINE bool -Perl_SvTRUE_common(pTHX_ SV * sv, const bool sv_2bool_is_fallback) -{ - PERL_ARGS_ASSERT_SVTRUE_COMMON; - - if (UNLIKELY(SvIMMORTAL_INTERP(sv))) - return SvIMMORTAL_TRUE(sv); - - if (! SvOK(sv)) - return FALSE; - - if (SvPOK(sv)) - return SvPVXtrue(sv); - - if (SvIOK(sv)) - return SvIVX(sv) != 0; /* casts to bool */ - - if (SvROK(sv) && !(SvOBJECT(SvRV(sv)) && HvAMAGIC(SvSTASH(SvRV(sv))))) - return TRUE; - - if (sv_2bool_is_fallback) - return sv_2bool_nomg(sv); - - return isGV_with_GP(sv); -} - - -PERL_STATIC_INLINE SV * -Perl_SvREFCNT_inc(SV *sv) -{ - if (LIKELY(sv != NULL)) - SvREFCNT(sv)++; - return sv; -} -PERL_STATIC_INLINE SV * -Perl_SvREFCNT_inc_NN(SV *sv) -{ - PERL_ARGS_ASSERT_SVREFCNT_INC_NN; - - SvREFCNT(sv)++; - return sv; -} -PERL_STATIC_INLINE void -Perl_SvREFCNT_inc_void(SV *sv) -{ - if (LIKELY(sv != NULL)) - SvREFCNT(sv)++; -} -PERL_STATIC_INLINE void -Perl_SvREFCNT_dec(pTHX_ SV *sv) -{ - if (LIKELY(sv != NULL)) { - U32 rc = SvREFCNT(sv); - if (LIKELY(rc > 1)) - SvREFCNT(sv) = rc - 1; - else - Perl_sv_free2(aTHX_ sv, rc); - } -} - -PERL_STATIC_INLINE void -Perl_SvREFCNT_dec_NN(pTHX_ SV *sv) -{ - U32 rc = SvREFCNT(sv); - - PERL_ARGS_ASSERT_SVREFCNT_DEC_NN; - - if (LIKELY(rc > 1)) - SvREFCNT(sv) = rc - 1; - else - Perl_sv_free2(aTHX_ sv, rc); -} - -/* -=for apidoc SvAMAGIC_on - -Indicate that C has overloading (active magic) enabled. - -=cut -*/ - -PERL_STATIC_INLINE void -Perl_SvAMAGIC_on(SV *sv) -{ - PERL_ARGS_ASSERT_SVAMAGIC_ON; - assert(SvROK(sv)); - - if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv))); -} - -/* -=for apidoc SvAMAGIC_off - -Indicate that C has overloading (active magic) disabled. - -=cut -*/ - -PERL_STATIC_INLINE void -Perl_SvAMAGIC_off(SV *sv) -{ - PERL_ARGS_ASSERT_SVAMAGIC_OFF; - - if (SvROK(sv) && SvOBJECT(SvRV(sv))) - HvAMAGIC_off(SvSTASH(SvRV(sv))); -} - -PERL_STATIC_INLINE U32 -Perl_SvPADSTALE_on(SV *sv) -{ - assert(!(SvFLAGS(sv) & SVs_PADTMP)); - return SvFLAGS(sv) |= SVs_PADSTALE; -} -PERL_STATIC_INLINE U32 -Perl_SvPADSTALE_off(SV *sv) -{ - assert(!(SvFLAGS(sv) & SVs_PADTMP)); - return SvFLAGS(sv) &= ~SVs_PADSTALE; -} -#if defined(PERL_CORE) || defined (PERL_EXT) -PERL_STATIC_INLINE STRLEN -S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp) -{ - PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B; - if (SvGAMAGIC(sv)) { - U8 *hopped = utf8_hop((U8 *)pv, pos); - if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped); - return (STRLEN)(hopped - (U8 *)pv); - } - return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN); -} -#endif - /* ------------------------------- utf8.h ------------------------------- */ /* @@ -657,7 +587,7 @@ Perl_is_utf8_invariant_string_loc(const /* Here, we know we have at least one full word to process. Process * per-word as long as we have at least a full word left */ do { - if ((* (PERL_UINTMAX_T *) x) & PERL_VARIANTS_WORD_MASK) { + if ((* (const PERL_UINTMAX_T *) x) & PERL_VARIANTS_WORD_MASK) { /* Found a variant. Just return if caller doesn't want its * exact position */ @@ -668,7 +598,7 @@ Perl_is_utf8_invariant_string_loc(const # if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 \ || BYTEORDER == 0x4321 || BYTEORDER == 0x87654321 - *ep = x + variant_byte_number(* (PERL_UINTMAX_T *) x); + *ep = x + variant_byte_number(* (const PERL_UINTMAX_T *) x); assert(*ep >= s && *ep < send); return FALSE; @@ -1200,7 +1130,8 @@ S_variant_under_utf8_count(const U8* con #endif -#ifndef PERL_IN_REGEXEC_C /* Keep these around for that file */ + /* Keep these around for these files */ +#if ! defined(PERL_IN_REGEXEC_C) && ! defined(PERL_IN_UTF8_C) # undef PERL_WORDSIZE # undef PERL_COUNT_MULTIPLIER # undef PERL_WORD_BOUNDARY_MASK @@ -1542,7 +1473,7 @@ Perl_is_utf8_string_loclen(const U8 *s, * This uses adaptations of the table and algorithm given in * https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which provides comprehensive * documentation of the original version. A copyright notice for the original - * version is given at the beginning of this file. The Perl adapations are + * version is given at the beginning of this file. The Perl adaptations are * documented at the definition of PL_extended_utf8_dfa_tab[]. * * This dfa is fast. There are three exit conditions: @@ -1599,9 +1530,10 @@ Perl_is_utf8_string_loclen(const U8 *s, incomplete_char_action) \ STMT_START { \ const U8 * s = s0; \ + const U8 * e_ = e; \ UV state = 0; \ \ - PERL_NON_CORE_CHECK_EMPTY(s,e); \ + PERL_NON_CORE_CHECK_EMPTY(s, e_); \ \ do { \ state = dfa_tab[256 + state + dfa_tab[*s]]; \ @@ -1614,7 +1546,7 @@ Perl_is_utf8_string_loclen(const U8 *s, if (UNLIKELY(state == 1)) { /* Rejecting state */ \ reject_action; \ } \ - } while (s < e); \ + } while (s < e_); \ \ /* Here, dropped out of loop before end-of-char */ \ incomplete_char_action; \ @@ -1654,7 +1586,7 @@ machines) is a valid UTF-8 character. This uses an adaptation of the table and algorithm given in https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which provides comprehensive documentation of the original version. A copyright notice for the original -version is given at the beginning of this file. The Perl adapation is +version is given at the beginning of this file. The Perl adaptation is documented at the definition of PL_extended_utf8_dfa_tab[]. */ @@ -1723,7 +1655,7 @@ C> to c This uses an adaptation of the tables and algorithm given in https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which provides comprehensive documentation of the original version. A copyright notice for the original -version is given at the beginning of this file. The Perl adapation is +version is given at the beginning of this file. The Perl adaptation is documented at the definition of strict_extended_utf8_dfa_tab[]. */ @@ -1778,7 +1710,7 @@ C> to This uses an adaptation of the tables and algorithm given in https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which provides comprehensive documentation of the original version. A copyright notice for the original -version is given at the beginning of this file. The Perl adapation is +version is given at the beginning of this file. The Perl adaptation is documented at the definition of PL_c9_utf8_dfa_tab[]. */ @@ -2072,11 +2004,16 @@ Perl_utf8_distance(pTHX_ const U8 *a, co =for apidoc utf8_hop Return the UTF-8 pointer C displaced by C characters, either -forward or backward. - -WARNING: do not use the following unless you *know* C is within -the UTF-8 data pointed to by C *and* that on entry C is aligned -on the first byte of character or just after the last byte of a character. +forward (if C is positive) or backward (if negative). C does not need +to be pointing to the starting byte of a character. If it isn't, one count of +C will be used up to get to the start of the next character for forward +hops, and to the start of the current character for negative ones. + +WARNING: Prefer L to this one. + +Do NOT use this function unless you B C is within +the UTF-8 data pointed to by C B that on entry C is aligned +on the first byte of a character or just after the last byte of a character. =cut */ @@ -2087,10 +2024,20 @@ Perl_utf8_hop(const U8 *s, SSize_t off) PERL_ARGS_ASSERT_UTF8_HOP; /* Note: cannot use UTF8_IS_...() too eagerly here since e.g - * the bitops (especially ~) can create illegal UTF-8. + * the XXX bitops (especially ~) can create illegal UTF-8. * In other words: in Perl UTF-8 is not just for Unicode. */ - if (off >= 0) { + if (off > 0) { + + /* Get to next non-continuation byte */ + if (UNLIKELY(UTF8_IS_CONTINUATION(*s))) { + do { + s++; + } + while (UTF8_IS_CONTINUATION(*s)); + off--; + } + while (off--) s += UTF8SKIP(s); } @@ -2101,6 +2048,7 @@ Perl_utf8_hop(const U8 *s, SSize_t off) s--; } } + GCC_DIAG_IGNORE(-Wcast-qual) return (U8 *)s; GCC_DIAG_RESTORE @@ -2110,7 +2058,9 @@ Perl_utf8_hop(const U8 *s, SSize_t off) =for apidoc utf8_hop_forward Return the UTF-8 pointer C displaced by up to C characters, -forward. +forward. C does not need to be pointing to the starting byte of a +character. If it isn't, one count of C will be used up to get to the +start of the next character. C must be non-negative. @@ -2135,6 +2085,15 @@ Perl_utf8_hop_forward(const U8 *s, SSize assert(s <= end); assert(off >= 0); + if (off && UNLIKELY(UTF8_IS_CONTINUATION(*s))) { + /* Get to next non-continuation byte */ + do { + s++; + } + while (UTF8_IS_CONTINUATION(*s)); + off--; + } + while (off--) { STRLEN skip = UTF8SKIP(s); if ((STRLEN)(end - s) <= skip) { @@ -2154,7 +2113,9 @@ Perl_utf8_hop_forward(const U8 *s, SSize =for apidoc utf8_hop_back Return the UTF-8 pointer C displaced by up to C characters, -backward. +backward. C does not need to be pointing to the starting byte of a +character. If it isn't, one count of C will be used up to get to that +start. C must be non-positive. @@ -2179,6 +2140,13 @@ Perl_utf8_hop_back(const U8 *s, SSize_t assert(start <= s); assert(off <= 0); + /* Note: if we know that the input is well-formed, we can do per-word + * hop-back. Commit d6ad3b72778369a84a215b498d8d60d5b03aa1af implemented + * that. But it was reverted because doing per-word has some + * start-up/tear-down overhead, so only makes sense if the distance to be + * moved is large, and core perl doesn't currently move more than a few + * characters at a time. You can reinstate it if it does become + * advantageous. */ while (off++ && s > start) { do { s--; @@ -2194,7 +2162,10 @@ Perl_utf8_hop_back(const U8 *s, SSize_t =for apidoc utf8_hop_safe Return the UTF-8 pointer C displaced by up to C characters, -either forward or backward. +either forward or backward. C does not need to be pointing to the starting +byte of a character. If it isn't, one count of C will be used up to get +to the start of the next character for forward hops, and to the start of the +current character for negative ones. When moving backward it will not move before C. @@ -2460,11 +2431,11 @@ Perl_is_utf8_fixed_width_buf_loclen_flag PERL_STATIC_INLINE UV Perl_utf8n_to_uvchr_msgs(const U8 *s, - STRLEN curlen, - STRLEN *retlen, - const U32 flags, - U32 * errors, - AV ** msgs) + STRLEN curlen, + STRLEN *retlen, + const U32 flags, + U32 * errors, + AV ** msgs) { /* This is the inlined portion of utf8n_to_uvchr_msgs. It handles the * simple cases, and, if necessary calls a helper function to deal with the @@ -2476,7 +2447,7 @@ Perl_utf8n_to_uvchr_msgs(const U8 *s, * https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which provides * comprehensive documentation of the original version. A copyright notice * for the original version is given at the beginning of this file. The - * Perl adapation is documented at the definition of PL_strict_utf8_dfa_tab[]. + * Perl adaptation is documented at the definition of PL_strict_utf8_dfa_tab[]. */ const U8 * const s0 = s; @@ -2687,7 +2658,7 @@ S_lossless_NV_to_IV(const NV nv, IV *ivp /* ------------------ pp.c, regcomp.c, toke.c, universal.c ------------ */ -#if defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C) +#if defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C) #define MAX_CHARSET_NAME_LENGTH 2 @@ -3086,6 +3057,8 @@ Perl_cx_poploop(pTHX_ PERL_CONTEXT *cx) cx->blk_loop.itersave = NULL; SvREFCNT_dec(cursv); } + if (cx->cx_type & (CXp_FOR_GV|CXp_FOR_LVREF)) + SvREFCNT_dec(cx->blk_loop.itervar_u.svp); } @@ -3134,6 +3107,36 @@ Perl_cx_popgiven(pTHX_ PERL_CONTEXT *cx) SvREFCNT_dec(sv); } +/* +=for apidoc newPADxVOP + +Constructs, checks and returns an op containing a pad offset. C is +the opcode, which should be one of C, C, C +or C. The returned op will have the C field set by +the C argument. + +This is convenient when constructing a large optree in nested function +calls, as it avoids needing to store the pad op directly to set the +C field as a side-effect. For example + + o = op_append_elem(OP_LINESEQ, o, + newPADxVOP(OP_PADSV, 0, padix)); + +=cut +*/ + +PERL_STATIC_INLINE OP * +Perl_newPADxVOP(pTHX_ I32 type, I32 flags, PADOFFSET padix) +{ + PERL_ARGS_ASSERT_NEWPADXVOP; + + assert(type == OP_PADSV || type == OP_PADAV || type == OP_PADHV + || type == OP_PADCV); + OP *o = newOP(type, flags); + o->op_targ = padix; + return o; +} + /* ------------------ util.h ------------------------------------------- */ /* @@ -3151,7 +3154,7 @@ range bytes match only themselves. */ PERL_STATIC_INLINE I32 -Perl_foldEQ(const char *s1, const char *s2, I32 len) +Perl_foldEQ(pTHX_ const char *s1, const char *s2, I32 len) { const U8 *a = (const U8 *)s1; const U8 *b = (const U8 *)s2; @@ -3169,7 +3172,7 @@ Perl_foldEQ(const char *s1, const char * } PERL_STATIC_INLINE I32 -Perl_foldEQ_latin1(const char *s1, const char *s2, I32 len) +Perl_foldEQ_latin1(pTHX_ const char *s1, const char *s2, I32 len) { /* Compare non-UTF-8 using Unicode (Latin1) semantics. Works on all folds * representable without UTF-8, except for LATIN_SMALL_LETTER_SHARP_S, and @@ -3203,7 +3206,7 @@ same case-insensitively in the current l */ PERL_STATIC_INLINE I32 -Perl_foldEQ_locale(const char *s1, const char *s2, I32 len) +Perl_foldEQ_locale(pTHX_ const char *s1, const char *s2, I32 len) { const U8 *a = (const U8 *)s1; const U8 *b = (const U8 *)s2; @@ -3213,8 +3216,14 @@ Perl_foldEQ_locale(const char *s1, const assert(len >= 0); while (len--) { - if (*a != *b && *a != PL_fold_locale[*b]) + if (*a != *b && *a != PL_fold_locale[*b]) { + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "%s:%d: Our records indicate %02x is not a fold of %02x" + " or its mate %02x\n", + __FILE__, __LINE__, *a, *b, PL_fold_locale[*b])); + return 0; + } a++,b++; } return 1; @@ -3341,7 +3350,7 @@ Perl_mortal_getenv(const char * str) * the recursive calls and calls from the logger, and treat them specially. * Let's say we want to do getenv("foo"). We first find * getenv(PERL_MEM_LOG) and save it to a fixed-length per-interpreter - * variable, so no temporary is required. Then we do getenv(foo}, and in + * variable, so no temporary is required. Then we do getenv(foo), and in * the process of creating a temporary to save it, this function will be * called recursively to do a getenv(PERL_MEM_LOG). On the recursed call, * we detect that it is such a call and return our saved value instead of @@ -3421,7 +3430,7 @@ Perl_mortal_getenv(const char * str) } } - /* Then each of the three significant characters */ + /* Then each of the four significant characters */ if (strchr(ret, 'm')) { *mem_log_meat++ = 'm'; } @@ -3431,6 +3440,9 @@ Perl_mortal_getenv(const char * str) if (strchr(ret, 't')) { *mem_log_meat++ = 't'; } + if (strchr(ret, 'c')) { + *mem_log_meat++ = 'c'; + } *mem_log_meat = '\0'; assert(mem_log_meat < PL_mem_log + sizeof(PL_mem_log)); @@ -3475,8 +3487,7 @@ Perl_mortal_getenv(const char * str) PERL_STATIC_INLINE bool Perl_sv_isbool(pTHX_ const SV *sv) { - return SvIOK(sv) && SvPOK(sv) && SvIsCOW_static(sv) && - (SvPVX_const(sv) == PL_Yes || SvPVX_const(sv) == PL_No); + return SvBoolFlagsOK(sv) && BOOL_INTERNALS_sv_isbool(sv); } #ifdef USE_ITHREADS @@ -3499,6 +3510,254 @@ Perl_cop_file_avn(pTHX_ const COP *cop) return NULL; } +#endif + +PERL_STATIC_INLINE PADNAME * +Perl_padname_refcnt_inc(PADNAME *pn) +{ + PadnameREFCNT(pn)++; + return pn; +} + +PERL_STATIC_INLINE PADNAMELIST * +Perl_padnamelist_refcnt_inc(PADNAMELIST *pnl) +{ + PadnamelistREFCNT(pnl)++; + return pnl; +} + +/* copy a string to a safe spot */ + +/* +=for apidoc_section $string +=for apidoc savepv + +Perl's version of C. Returns a pointer to a newly allocated +string which is a duplicate of C. The size of the string is +determined by C, which means it may not contain embedded C +characters and must have a trailing C. To prevent memory leaks, the +memory allocated for the new string needs to be freed when no longer needed. +This can be done with the C> function, or +L|perlguts/SAVEFREEPV(p)>. + +On some platforms, Windows for example, all allocated memory owned by a thread +is deallocated when that thread ends. So if you need that not to happen, you +need to use the shared memory functions, such as C>. + +=cut +*/ + +PERL_STATIC_INLINE char * +Perl_savepv(pTHX_ const char *pv) +{ + PERL_UNUSED_CONTEXT; + if (!pv) + return NULL; + else { + char *newaddr; + const STRLEN pvlen = strlen(pv)+1; + Newx(newaddr, pvlen, char); + return (char*)memcpy(newaddr, pv, pvlen); + } +} + +/* same thing but with a known length */ + +/* +=for apidoc savepvn + +Perl's version of what C would be if it existed. Returns a +pointer to a newly allocated string which is a duplicate of the first +C bytes from C, plus a trailing +C byte. The memory allocated for +the new string can be freed with the C function. + +On some platforms, Windows for example, all allocated memory owned by a thread +is deallocated when that thread ends. So if you need that not to happen, you +need to use the shared memory functions, such as C>. + +=cut +*/ + +PERL_STATIC_INLINE char * +Perl_savepvn(pTHX_ const char *pv, Size_t len) +{ + char *newaddr; + PERL_UNUSED_CONTEXT; + + Newx(newaddr,len+1,char); + /* Give a meaning to NULL pointer mainly for the use in sv_magic() */ + if (pv) { + /* might not be null terminated */ + newaddr[len] = '\0'; + return (char *) CopyD(pv,newaddr,len,char); + } + else { + return (char *) ZeroD(newaddr,len+1,char); + } +} + +/* +=for apidoc savesvpv + +A version of C/C which gets the string to duplicate from +the passed in SV using C + +On some platforms, Windows for example, all allocated memory owned by a thread +is deallocated when that thread ends. So if you need that not to happen, you +need to use the shared memory functions, such as C>. + +=cut +*/ + +PERL_STATIC_INLINE char * +Perl_savesvpv(pTHX_ SV *sv) +{ + STRLEN len; + const char * const pv = SvPV_const(sv, len); + char *newaddr; + + PERL_ARGS_ASSERT_SAVESVPV; + + ++len; + Newx(newaddr,len,char); + return (char *) CopyD(pv,newaddr,len,char); +} + +/* +=for apidoc savesharedsvpv + +A version of C which allocates the duplicate string in +memory which is shared between threads. + +=cut +*/ + +PERL_STATIC_INLINE char * +Perl_savesharedsvpv(pTHX_ SV *sv) +{ + STRLEN len; + const char * const pv = SvPV_const(sv, len); + + PERL_ARGS_ASSERT_SAVESHAREDSVPV; + + return savesharedpvn(pv, len); +} + +#ifndef PERL_GET_CONTEXT_DEFINED + +/* +=for apidoc_section $embedding +=for apidoc get_context + +Implements L>, which you should use instead. + +=cut +*/ + +PERL_STATIC_INLINE void * +Perl_get_context(void) +{ +# if defined(USE_ITHREADS) +# ifdef OLD_PTHREADS_API + pthread_addr_t t; + int error = pthread_getspecific(PL_thr_key, &t); + if (error) + Perl_croak_nocontext("panic: pthread_getspecific, error=%d", error); + return (void*)t; +# elif defined(I_MACH_CTHREADS) + return (void*)cthread_data(cthread_self()); +# else + return (void*)PTHREAD_GETSPECIFIC(PL_thr_key); +# endif +# else + return (void*)NULL; +# endif +} + +#endif + +PERL_STATIC_INLINE MGVTBL* +Perl_get_vtbl(pTHX_ int vtbl_id) +{ + PERL_UNUSED_CONTEXT; + + return (vtbl_id < 0 || vtbl_id >= magic_vtable_max) + ? NULL : (MGVTBL*)PL_magic_vtables + vtbl_id; +} + +/* +=for apidoc my_strlcat + +The C library C if available, or a Perl implementation of it. +This operates on C C-terminated strings. + +C appends string C to the end of C. It will append at +most S> characters. It will then C-terminate, +unless C is 0 or the original C string was longer than C (in +practice this should not happen as it means that either C is incorrect or +that C is not a proper C-terminated string). + +Note that C is the full size of the destination buffer and +the result is guaranteed to be C-terminated if there is room. Note that +room for the C should be included in C. + +The return value is the total length that C would have if C is +sufficiently large. Thus it is the initial length of C plus the length of +C. If C is smaller than the return, the excess was not appended. + +=cut + +Description stolen from http://man.openbsd.org/strlcat.3 +*/ +#ifndef HAS_STRLCAT +PERL_STATIC_INLINE Size_t +Perl_my_strlcat(char *dst, const char *src, Size_t size) +{ + Size_t used, length, copy; + + used = strlen(dst); + length = strlen(src); + if (size > 0 && used < size - 1) { + copy = (length >= size - used) ? size - used - 1 : length; + memcpy(dst + used, src, copy); + dst[used + copy] = '\0'; + } + return used + length; +} +#endif + + +/* +=for apidoc my_strlcpy + +The C library C if available, or a Perl implementation of it. +This operates on C C-terminated strings. + +C copies up to S> characters from the string C +to C, C-terminating the result if C is not 0. + +The return value is the total length C would be if the copy completely +succeeded. If it is larger than C, the excess was not copied. + +=cut + +Description stolen from http://man.openbsd.org/strlcpy.3 +*/ +#ifndef HAS_STRLCPY +PERL_STATIC_INLINE Size_t +Perl_my_strlcpy(char *dst, const char *src, Size_t size) +{ + Size_t length, copy; + + length = strlen(src); + if (size > 0) { + copy = (length >= size) ? size - 1 : length; + memcpy(dst, src, copy); + dst[copy] = '\0'; + } + return length; +} #endif /* Index: gnu/usr.bin/perl/intrpvar.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/intrpvar.h,v diff -u -p -a -u -p -r1.7 intrpvar.h --- gnu/usr.bin/perl/intrpvar.h 15 Feb 2023 01:36:13 -0000 1.7 +++ gnu/usr.bin/perl/intrpvar.h 21 Feb 2024 15:47:02 -0000 @@ -58,7 +58,10 @@ PERLVARI(I, sub_generation, U32, 1) /* i #ifdef PERL_HASH_RANDOMIZE_KEYS #ifdef USE_PERL_PERTURB_KEYS -PERLVARI(I, hash_rand_bits_enabled, U8, 1) /* used to randomize hash stuff 0 == no-random, 1 == random, 2 == determinsitic */ +PERLVARI(I, hash_rand_bits_enabled, U8, 1) /* used to randomize hash stuff + 0. no-random + 1. random + 2. deterministic */ #endif PERLVARI(I, hash_rand_bits, UV, 0) /* used to randomize hash stuff */ #endif @@ -83,7 +86,7 @@ PERLVARI(I, tainted, bool, FALSE) /* usi * control returns to pp_push or whatever, it sees if any of those flags * have been set, and if so finally calls mg_set(). * - * NB: PL_delaymagic is automatically saved and restored by JUMPENV_PUSH + * NB: PL_delaymagic is automatically saved and restored by JMPENV_PUSH * / POP. This removes the need to do ENTER/SAVEI16(PL_delaymagic)/LEAVE * in hot code like pp_push. */ @@ -127,7 +130,8 @@ thread's copy. =cut */ -PERLVAR(I, localizing, U8) /* are we processing a local() list? */ +PERLVAR(I, localizing, U8) /* are we processing a local() list? + 0 = no, 1 = localizing, 2 = delocalizing */ PERLVAR(I, in_eval, U8) /* trap "fatal" errors? */ PERLVAR(I, defgv, GV *) /* the *_ glob */ @@ -232,6 +236,10 @@ fallback by macros on platforms where L< unavailable, and which would otherwise evaluate their SV parameter more than once. +B, if this is used in a situation where something that is using it +is in a call stack with something else that is using it, this variable would +get zapped, leading to hard-to-diagnose errors. + =cut */ PERLVAR(I, Sv, SV *) @@ -252,6 +260,10 @@ It is is typically used with C whe the returned length, (hence the length is "Not Applicable", which is how this variable got its name). +B, if this is used in a situation where something that is using it +is in a call stack with something else that is using it, this variable would +get zapped, leading to hard-to-diagnose errors. + It is usually more efficient to either declare a local variable and use that instead, or to use the C macro. @@ -376,16 +388,15 @@ thread's copy. PERLVAR(I, exit_flags, U8) /* was exit() unexpected, etc. */ PERLVAR(I, utf8locale, bool) /* utf8 locale detected */ -PERLVAR(I, in_utf8_CTYPE_locale, bool) -PERLVAR(I, in_utf8_COLLATE_locale, bool) -PERLVAR(I, in_utf8_turkic_locale, bool) -#if defined(USE_ITHREADS) && ! defined(USE_THREAD_SAFE_LOCALE) -PERLVARI(I, lc_numeric_mutex_depth, int, 0) /* Emulate general semaphore */ + +#if defined(USE_LOCALE) && defined(USE_LOCALE_THREADS) +PERLVARI(I, locale_mutex_depth, int, 0) /* Emulate general semaphore */ #endif -PERLVARA(I, locale_utf8ness, 256, char) #ifdef USE_LOCALE_CTYPE - PERLVAR(I, warn_locale, SV *) +PERLVAR(I, warn_locale, SV *) +PERLVAR(I, in_utf8_CTYPE_locale, bool) +PERLVAR(I, in_utf8_turkic_locale, bool) #endif PERLVARA(I, colors,6, char *) /* values from PERL_RE_COLORS env var */ @@ -485,11 +496,14 @@ PERLVAR(I, origfilename, char *) PERLVARI(I, xsubfilename, const char *, NULL) PERLVAR(I, diehook, SV *) PERLVAR(I, warnhook, SV *) +/* keyword hooks*/ +PERLVARI(I, hook__require__before, SV *,NULL) +PERLVARI(I, hook__require__after, SV *,NULL) /* switches */ PERLVAR(I, patchlevel, SV *) PERLVAR(I, localpatches, const char * const *) -PERLVARI(I, splitstr, const char *, " ") +PERLVARI(I, splitstr, char *, NULL) PERLVAR(I, minus_c, bool) PERLVAR(I, minus_n, bool) @@ -700,7 +714,6 @@ PERLVARI(I, cop_seqmax, U32, PERL_COP_SE PERLVARI(I, evalseq, U32, 0) /* eval sequence number */ PERLVAR(I, origalen, U32) -PERLVAR(I, origenviron, char **) #ifdef PERL_USES_PL_PIDSTATUS PERLVAR(I, pidstatus, HV *) /* pid-to-status mappings for waitpid */ #endif @@ -732,20 +745,33 @@ PERLVAR(I, constpadix, PADOFFSET) /* low PERLVAR(I, padix_floor, PADOFFSET) /* how low may inner block reset padix */ -#if defined(USE_POSIX_2008_LOCALE) \ - && defined(USE_THREAD_SAFE_LOCALE) \ - && ! defined(HAS_QUERYLOCALE) +#if defined(USE_POSIX_2008_LOCALE) && defined(MULTIPLICITY) +PERLVARI(I, cur_locale_obj, locale_t, NULL) +#endif +#ifdef USE_PL_CURLOCALES /* This is the most number of categories we've encountered so far on any - * platform */ -PERLVARA(I, curlocales, 12, char *) + * platform, doesn't include LC_ALL */ +PERLVARA(I, curlocales, 12, const char *) + +#endif +#ifdef USE_PL_CUR_LC_ALL + +PERLVARI(I, cur_LC_ALL, const char *, NULL) #endif #ifdef USE_LOCALE_COLLATE +/* The emory needed to store the collxfrm transformation of a string with + * length 'x' is predicted by the linear equation mx+b; m=mult, b=base */ +PERLVARI(I, collxfrm_mult,Size_t, 0) /* Expansion factor in *xfrm(); + 0 => unknown or bad, depending on + base */ +PERLVAR(I, collxfrm_base, Size_t) /* Basic overhead in *xfrm(); + mult == 0, base == 0 => need to compute + mult == 0, base != 0 => ill-formed; + */ PERLVAR(I, collation_name, char *) /* Name of current collation */ -PERLVAR(I, collxfrm_base, Size_t) /* Basic overhead in *xfrm() */ -PERLVARI(I, collxfrm_mult,Size_t, 2) /* Expansion factor in *xfrm() */ PERLVARI(I, collation_ix, U32, 0) /* Collation generation index */ PERLVARI(I, strxfrm_NUL_replacement, U8, 0) /* Code point to replace NULs */ PERLVARI(I, strxfrm_is_behaved, bool, TRUE) @@ -753,12 +779,15 @@ PERLVARI(I, strxfrm_is_behaved, bool, TR PERLVARI(I, strxfrm_max_cp, U8, 0) /* Highest collating cp in locale */ PERLVARI(I, collation_standard, bool, TRUE) /* Assume simple collation */ +PERLVAR(I, in_utf8_COLLATE_locale, bool) #endif /* USE_LOCALE_COLLATE */ -PERLVARI(I, langinfo_buf, char *, NULL) +PERLVARI(I, langinfo_buf, const char *, NULL) PERLVARI(I, langinfo_bufsize, Size_t, 0) -PERLVARI(I, setlocale_buf, char *, NULL) +PERLVARI(I, setlocale_buf, const char *, NULL) PERLVARI(I, setlocale_bufsize, Size_t, 0) +PERLVARI(I, stdize_locale_buf, const char *, NULL) +PERLVARI(I, stdize_locale_bufsize, Size_t, 0) #ifdef PERL_SAWAMPERSAND PERLVAR(I, sawampersand, U8) /* must save all match strings */ @@ -771,6 +800,8 @@ PERLVARI(I, phase, enum perl_phase, PERL PERLVARI(I, in_load_module, bool, FALSE) /* to prevent recursions in PerlIO_find_layer */ +PERLVARI(I, eval_begin_nest_depth, U32, 0) + PERLVAR(I, unsafe, bool) PERLVAR(I, colorset, bool) /* PERL_RE_COLORS env var is in use */ @@ -806,25 +837,33 @@ PERLVARI(I, perl_destruct_level, signed PERLVAR(I, pad_reset_pending, bool) /* reset pad on next attempted alloc */ -PERLVAR(I, srand_called, bool) - -#ifdef USE_LOCALE_NUMERIC +PERLVARI(I, srand_called, bool, false) /* has random_state been initialized yet? */ +PERLVARI(I, srand_override, U32, 0) /* Should we use a deterministic sequence? */ +PERLVARI(I, srand_override_next, U32, 0) /* Next item in the sequence */ PERLVARI(I, numeric_underlying, bool, TRUE) /* Assume underlying locale numerics */ PERLVARI(I, numeric_underlying_is_standard, bool, TRUE) -PERLVARI(I, numeric_standard, int, TRUE) - /* Assume C locale numerics */ -PERLVAR(I, numeric_name, char *) /* Name of current numeric locale */ -PERLVAR(I, numeric_radix_sv, SV *) /* The radix separator if not '.' */ +PERLVARI(I, numeric_standard, int, TRUE) /* Assume C locale numerics */ +PERLVAR(I, numeric_name, char *) /* Name of current numeric locale */ +PERLVAR(I, numeric_radix_sv, SV *) /* The radix separator */ +PERLVAR(I, underlying_radix_sv, SV *) /* The radix in the program's current underlying locale */ -# ifdef HAS_POSIX_2008_LOCALE +#if defined(USE_LOCALE_NUMERIC) && defined(USE_POSIX_2008_LOCALE) PERLVARI(I, underlying_numeric_obj, locale_t, NULL) +#endif +#ifdef USE_POSIX_2008_LOCALE +PERLVARI(I, scratch_locale_obj, locale_t, 0) +#endif + +#ifdef USE_LOCALE_CTYPE + +PERLVARI(I, ctype_name, const char *, NULL) /* Name of current ctype locale */ + # endif -#endif /* !USE_LOCALE_NUMERIC */ /* Array of signal handlers, indexed by signal number, through which the C signal handler dispatches. */ @@ -888,7 +927,12 @@ PERLVARI(I, clocktick, long, 0) /* this PERLVARI(I, sharehook, share_proc_t, Perl_sv_nosharing) PERLVARI(I, lockhook, share_proc_t, Perl_sv_nosharing) +#if defined(__HP_cc) || defined(__HP_aCC) +#pragma diag_suppress 3215 +#endif GCC_DIAG_IGNORE(-Wdeprecated-declarations) +MSVC_DIAG_IGNORE(4996) + #ifdef NO_MATHOMS # define PERL_UNLOCK_HOOK Perl_sv_nosharing #else @@ -897,7 +941,11 @@ GCC_DIAG_IGNORE(-Wdeprecated-declaration #endif PERLVARI(I, unlockhook, share_proc_t, PERL_UNLOCK_HOOK) +MSVC_DIAG_RESTORE GCC_DIAG_RESTORE +#if defined(__HP_cc) || defined(__HP_aCC) +#pragma diag_default 3215 +#endif PERLVARI(I, threadhook, thrhook_proc_t, Perl_nothreadhook) @@ -925,7 +973,7 @@ PERLVAR(I, Xpv, XPV *) /* (unused) hel /* name of the scopes we've ENTERed. Only used with -DDEBUGGING, but needs to be present always, as -DDEBUGGING must be binary compatible with non. */ -PERLVARI(I, scopestack_name, const char * *, NULL) +PERLVARI(I, scopestack_name, const char **, NULL) PERLVAR(I, debug_pad, struct perl_debug_pad) /* always needed because of the re extension */ @@ -966,12 +1014,11 @@ PERLVARI(I, sv_serial, U32, 0) /* SV ser PERLVARA(I, sv_consts, SV_CONSTS_COUNT, SV*) /* constant SVs with precomputed hash value */ #ifdef PERL_TRACE_OPS -PERLVARA(I, op_exec_cnt, OP_max+2, UV) /* Counts of executed OPs of the given type. +PERLVARA(I, op_exec_cnt, OP_max+2, UV) /* Counts of executed OPs of the given type. If PERL_TRACE_OPS is enabled, we'll dump a summary count of all ops executed in the - program at perl_destruct time. For - profiling/debugging only. Works only if - DEBUGGING is enabled, too. */ + program at perl_destruct time. Used only + for profiling in DEBUGGING mode. */ #endif PERLVAR(I, random_state, PL_RANDOM_STATE_TYPE) @@ -999,6 +1046,8 @@ PERLVAR(I, SB_invlist, SV *) PERLVAR(I, SCX_invlist, SV *) PERLVAR(I, UpperLatin1, SV *) /* Code points 128 - 255 */ +PERLVARA(I, fold_locale, 256, U8) + /* List of characters that participate in any fold defined by Unicode */ PERLVAR(I, in_some_fold, SV *) @@ -1040,7 +1089,8 @@ PERLVAR(I, wcrtomb_ps, mbstate_t) /* Enough space for the reserved byte, 1 for a potential leading 0, then enough * for the longest representable integer plus an extra, the 3 flag characters, * and NUL */ -PERLVARA(I, mem_log, 1 + 1 + TYPE_DIGITS(UV) + 1 + 3 + 1, char) +#define PERL_MEM_LOG_ARYLEN (1 + 1 + TYPE_DIGITS(UV) + 1 + 3 + 1) +PERLVARA(I, mem_log, PERL_MEM_LOG_ARYLEN, char) #endif /* The most recently seen `use VERSION` declaration, encoded in a single Index: gnu/usr.bin/perl/invlist_inline.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/invlist_inline.h,v diff -u -p -a -u -p -r1.5 invlist_inline.h --- gnu/usr.bin/perl/invlist_inline.h 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/invlist_inline.h 21 Feb 2024 15:47:02 -0000 @@ -10,7 +10,7 @@ #define PERL_INVLIST_INLINE_H_ #if defined(PERL_IN_UTF8_C) \ - || defined(PERL_IN_REGCOMP_C) \ + || defined(PERL_IN_REGCOMP_ANY) \ || defined(PERL_IN_REGEXEC_C) \ || defined(PERL_IN_TOKE_C) \ || defined(PERL_IN_PP_C) \ @@ -93,7 +93,7 @@ S_invlist_array(SV* const invlist) } #endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_DOOP_C) +#if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_OP_C) || defined(PERL_IN_DOOP_C) PERL_STATIC_INLINE void S_invlist_extend(pTHX_ SV* const invlist, const UV new_max) @@ -161,8 +161,45 @@ S_invlist_highest(SV* const invlist) : array[len - 1] - 1; } +# if defined(PERL_IN_REGCOMP_ANY) + +PERL_STATIC_INLINE UV +S_invlist_highest_range_start(SV* const invlist) +{ + /* Returns the lowest code point of the highest range in the inversion + * list parameter. This API has an ambiguity: it returns 0 either when + * the lowest such point is actually 0 or when the list is empty. If this + * distinction matters to you, check for emptiness before calling this + * function. */ + + UV len = _invlist_len(invlist); + UV *array; + + PERL_ARGS_ASSERT_INVLIST_HIGHEST_RANGE_START; + + if (len == 0) { + return 0; + } + + array = invlist_array(invlist); + + /* The last element in the array in the inversion list always starts a + * range that goes to infinity. That range may be for code points that are + * matched in the inversion list, or it may be for ones that aren't + * matched. In the first case, the lowest code point in the matching range + * is that the one that started the range. If the other case, the final + * matching range begins at the next element down (which may be 0 in the + * edge case). */ + return (ELEMENT_RANGE_MATCHES_INVLIST(len - 1)) + ? array[len - 1] + : len == 1 + ? 0 + : array[len - 2]; +} + +# endif #endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C) +#if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_OP_C) PERL_STATIC_INLINE STRLEN* S_get_invlist_iter_addr(SV* invlist) @@ -238,11 +275,101 @@ S_invlist_iternext(SV* invlist, UV* star #endif -#ifndef PERL_IN_REGCOMP_C +#ifndef PERL_IN_REGCOMP_ANY /* These symbols are only needed later in regcomp.c */ # undef TO_INTERNAL_SIZE # undef FROM_INTERNAL_SIZE +#endif + +#ifdef PERL_IN_REGCOMP_ANY +PERL_STATIC_INLINE +bool +S_invlist_is_iterating(const SV* const invlist) +{ + PERL_ARGS_ASSERT_INVLIST_IS_ITERATING; + + /* get_invlist_iter_addr()'s sv is non-const only because it returns a + * value that can be used to modify the invlist, it doesn't modify the + * invlist itself */ + return *(get_invlist_iter_addr((SV*)invlist)) < (STRLEN) UV_MAX; +} + +PERL_STATIC_INLINE +SV * +S_invlist_contents(pTHX_ SV* const invlist, const bool traditional_style) +{ + /* Get the contents of an inversion list into a string SV so that they can + * be printed out. If 'traditional_style' is TRUE, it uses the format + * traditionally done for debug tracing; otherwise it uses a format + * suitable for just copying to the output, with blanks between ranges and + * a dash between range components */ + + UV start, end; + SV* output; + const char intra_range_delimiter = (traditional_style ? '\t' : '-'); + const char inter_range_delimiter = (traditional_style ? '\n' : ' '); + + if (traditional_style) { + output = newSVpvs("\n"); + } + else { + output = newSVpvs(""); + } + + PERL_ARGS_ASSERT_INVLIST_CONTENTS; + + assert(! invlist_is_iterating(invlist)); + + invlist_iterinit(invlist); + while (invlist_iternext(invlist, &start, &end)) { + if (end == UV_MAX) { + Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%cINFTY%c", + start, intra_range_delimiter, + inter_range_delimiter); + } + else if (end != start) { + Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%c%04" UVXf "%c", + start, + intra_range_delimiter, + end, inter_range_delimiter); + } + else { + Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%c", + start, inter_range_delimiter); + } + } + + if (SvCUR(output) && ! traditional_style) {/* Get rid of trailing blank */ + SvCUR_set(output, SvCUR(output) - 1); + } + + return output; +} + +PERL_STATIC_INLINE +UV +S_invlist_lowest(SV* const invlist) +{ + /* Returns the lowest code point that matches an inversion list. This API + * has an ambiguity, as it returns 0 under either the lowest is actually + * 0, or if the list is empty. If this distinction matters to you, check + * for emptiness before calling this function */ + + UV len = _invlist_len(invlist); + UV *array; + + PERL_ARGS_ASSERT_INVLIST_LOWEST; + + if (len == 0) { + return 0; + } + + array = invlist_array(invlist); + + return array[0]; +} + #endif #endif /* PERL_INVLIST_INLINE_H_ */ Index: gnu/usr.bin/perl/iperlsys.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/iperlsys.h,v diff -u -p -a -u -p -r1.5 iperlsys.h --- gnu/usr.bin/perl/iperlsys.h 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/iperlsys.h 21 Feb 2024 15:47:02 -0000 @@ -559,14 +559,7 @@ struct IPerlEnvInfo # endif #else /* below is ! PERL_IMPLICIT_SYS */ -# ifdef USE_ITHREADS - - /* Use the comma operator to return 0/non-zero, while avoiding putting - * this in an inline function */ -# define PerlEnv_putenv(str) (ENV_LOCK, (putenv(str) \ - ? (ENV_UNLOCK, 1) \ - : (ENV_UNLOCK, 0))) -# else +# ifndef USE_ITHREADS /* Threaded is an inline function in inline.h */ # define PerlEnv_putenv(str) putenv(str) # endif # define PerlEnv_getenv(str) mortal_getenv(str) Index: gnu/usr.bin/perl/keywords.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/keywords.c,v diff -u -p -a -u -p -r1.5 keywords.c --- gnu/usr.bin/perl/keywords.c 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/keywords.c 21 Feb 2024 15:47:02 -0000 @@ -978,7 +978,7 @@ Perl_keyword (pTHX_ const char *name, I3 goto unknown; } - case 5: /* 41 tokens of length 5 */ + case 5: /* 43 tokens of length 5 */ switch (name[0]) { case 'B': @@ -1119,14 +1119,29 @@ Perl_keyword (pTHX_ const char *name, I3 } case 'l': - if (name[2] == 'o' && - name[3] == 's' && - name[4] == 'e') - { /* close */ - return -KEY_close; - } + switch (name[2]) + { + case 'a': + if (name[3] == 's' && + name[4] == 's') + { /* class */ + return (all_keywords || FEATURE_CLASS_IS_ENABLED ? -KEY_class : 0); + } - goto unknown; + goto unknown; + + case 'o': + if (name[3] == 's' && + name[4] == 'e') + { /* close */ + return -KEY_close; + } + + goto unknown; + + default: + goto unknown; + } case 'r': if (name[2] == 'y' && @@ -1177,6 +1192,16 @@ Perl_keyword (pTHX_ const char *name, I3 goto unknown; + case 'i': + if (name[2] == 'e' && + name[3] == 'l' && + name[4] == 'd') + { /* field */ + return (all_keywords || FEATURE_CLASS_IS_ENABLED ? -KEY_field : 0); + } + + goto unknown; + case 'l': if (name[2] == 'o' && name[3] == 'c' && @@ -1494,9 +1519,21 @@ Perl_keyword (pTHX_ const char *name, I3 goto unknown; } - case 6: /* 33 tokens of length 6 */ + case 6: /* 35 tokens of length 6 */ switch (name[0]) { + case 'A': + if (name[1] == 'D' && + name[2] == 'J' && + name[3] == 'U' && + name[4] == 'S' && + name[5] == 'T') + { /* ADJUST */ + return (all_keywords || FEATURE_CLASS_IS_ENABLED ? KEY_ADJUST : 0); + } + + goto unknown; + case 'a': if (name[1] == 'c' && name[2] == 'c' && @@ -1650,54 +1687,71 @@ Perl_keyword (pTHX_ const char *name, I3 } case 'm': - if (name[1] == 's' && - name[2] == 'g') + switch (name[1]) { - switch (name[3]) - { - case 'c': - if (name[4] == 't' && - name[5] == 'l') - { /* msgctl */ - return -KEY_msgctl; - } + case 'e': + if (name[2] == 't' && + name[3] == 'h' && + name[4] == 'o' && + name[5] == 'd') + { /* method */ + return (all_keywords || FEATURE_CLASS_IS_ENABLED ? -KEY_method : 0); + } - goto unknown; + goto unknown; - case 'g': - if (name[4] == 'e' && - name[5] == 't') - { /* msgget */ - return -KEY_msgget; - } + case 's': + if (name[2] == 'g') + { + switch (name[3]) + { + case 'c': + if (name[4] == 't' && + name[5] == 'l') + { /* msgctl */ + return -KEY_msgctl; + } - goto unknown; + goto unknown; - case 'r': - if (name[4] == 'c' && - name[5] == 'v') - { /* msgrcv */ - return -KEY_msgrcv; - } + case 'g': + if (name[4] == 'e' && + name[5] == 't') + { /* msgget */ + return -KEY_msgget; + } - goto unknown; + goto unknown; - case 's': - if (name[4] == 'n' && - name[5] == 'd') - { /* msgsnd */ - return -KEY_msgsnd; + case 'r': + if (name[4] == 'c' && + name[5] == 'v') + { /* msgrcv */ + return -KEY_msgrcv; + } + + goto unknown; + + case 's': + if (name[4] == 'n' && + name[5] == 'd') + { /* msgsnd */ + return -KEY_msgsnd; + } + + goto unknown; + + default: + goto unknown; } + } - goto unknown; + goto unknown; - default: - goto unknown; - } + default: + goto unknown; } - goto unknown; - case 'p': if (name[1] == 'r' && name[2] == 'i' && @@ -3504,5 +3558,5 @@ unknown: } /* Generated from: - * b680fb3a27b173b65d9c4e534ad92897c925e336476879a6be1da18ac55cbe8b regen/keywords.pl + * eb67e851da14ede1aad67aec4a387fa250c1345407fad0a02988d2d8d3cc27f2 regen/keywords.pl * ex: set ro: */ Index: gnu/usr.bin/perl/keywords.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/keywords.h,v diff -u -p -a -u -p -r1.14 keywords.h --- gnu/usr.bin/perl/keywords.h 15 Feb 2023 01:36:13 -0000 1.14 +++ gnu/usr.bin/perl/keywords.h 21 Feb 2024 15:47:02 -0000 @@ -20,260 +20,264 @@ #define KEY___DATA__ 4 #define KEY___END__ 5 #define KEY___SUB__ 6 -#define KEY_AUTOLOAD 7 -#define KEY_BEGIN 8 -#define KEY_UNITCHECK 9 -#define KEY_DESTROY 10 -#define KEY_END 11 -#define KEY_INIT 12 -#define KEY_CHECK 13 -#define KEY_abs 14 -#define KEY_accept 15 -#define KEY_alarm 16 -#define KEY_and 17 -#define KEY_atan2 18 -#define KEY_bind 19 -#define KEY_binmode 20 -#define KEY_bless 21 -#define KEY_break 22 -#define KEY_caller 23 -#define KEY_catch 24 -#define KEY_chdir 25 -#define KEY_chmod 26 -#define KEY_chomp 27 -#define KEY_chop 28 -#define KEY_chown 29 -#define KEY_chr 30 -#define KEY_chroot 31 -#define KEY_close 32 -#define KEY_closedir 33 -#define KEY_cmp 34 -#define KEY_connect 35 -#define KEY_continue 36 -#define KEY_cos 37 -#define KEY_crypt 38 -#define KEY_dbmclose 39 -#define KEY_dbmopen 40 -#define KEY_default 41 -#define KEY_defer 42 -#define KEY_defined 43 -#define KEY_delete 44 -#define KEY_die 45 -#define KEY_do 46 -#define KEY_dump 47 -#define KEY_each 48 -#define KEY_else 49 -#define KEY_elsif 50 -#define KEY_endgrent 51 -#define KEY_endhostent 52 -#define KEY_endnetent 53 -#define KEY_endprotoent 54 -#define KEY_endpwent 55 -#define KEY_endservent 56 -#define KEY_eof 57 -#define KEY_eq 58 -#define KEY_eval 59 -#define KEY_evalbytes 60 -#define KEY_exec 61 -#define KEY_exists 62 -#define KEY_exit 63 -#define KEY_exp 64 -#define KEY_fc 65 -#define KEY_fcntl 66 -#define KEY_fileno 67 -#define KEY_finally 68 -#define KEY_flock 69 -#define KEY_for 70 -#define KEY_foreach 71 -#define KEY_fork 72 -#define KEY_format 73 -#define KEY_formline 74 -#define KEY_ge 75 -#define KEY_getc 76 -#define KEY_getgrent 77 -#define KEY_getgrgid 78 -#define KEY_getgrnam 79 -#define KEY_gethostbyaddr 80 -#define KEY_gethostbyname 81 -#define KEY_gethostent 82 -#define KEY_getlogin 83 -#define KEY_getnetbyaddr 84 -#define KEY_getnetbyname 85 -#define KEY_getnetent 86 -#define KEY_getpeername 87 -#define KEY_getpgrp 88 -#define KEY_getppid 89 -#define KEY_getpriority 90 -#define KEY_getprotobyname 91 -#define KEY_getprotobynumber 92 -#define KEY_getprotoent 93 -#define KEY_getpwent 94 -#define KEY_getpwnam 95 -#define KEY_getpwuid 96 -#define KEY_getservbyname 97 -#define KEY_getservbyport 98 -#define KEY_getservent 99 -#define KEY_getsockname 100 -#define KEY_getsockopt 101 -#define KEY_given 102 -#define KEY_glob 103 -#define KEY_gmtime 104 -#define KEY_goto 105 -#define KEY_grep 106 -#define KEY_gt 107 -#define KEY_hex 108 -#define KEY_if 109 -#define KEY_index 110 -#define KEY_int 111 -#define KEY_ioctl 112 -#define KEY_isa 113 -#define KEY_join 114 -#define KEY_keys 115 -#define KEY_kill 116 -#define KEY_last 117 -#define KEY_lc 118 -#define KEY_lcfirst 119 -#define KEY_le 120 -#define KEY_length 121 -#define KEY_link 122 -#define KEY_listen 123 -#define KEY_local 124 -#define KEY_localtime 125 -#define KEY_lock 126 -#define KEY_log 127 -#define KEY_lstat 128 -#define KEY_lt 129 -#define KEY_m 130 -#define KEY_map 131 -#define KEY_mkdir 132 -#define KEY_msgctl 133 -#define KEY_msgget 134 -#define KEY_msgrcv 135 -#define KEY_msgsnd 136 -#define KEY_my 137 -#define KEY_ne 138 -#define KEY_next 139 -#define KEY_no 140 -#define KEY_not 141 -#define KEY_oct 142 -#define KEY_open 143 -#define KEY_opendir 144 -#define KEY_or 145 -#define KEY_ord 146 -#define KEY_our 147 -#define KEY_pack 148 -#define KEY_package 149 -#define KEY_pipe 150 -#define KEY_pop 151 -#define KEY_pos 152 -#define KEY_print 153 -#define KEY_printf 154 -#define KEY_prototype 155 -#define KEY_push 156 -#define KEY_q 157 -#define KEY_qq 158 -#define KEY_qr 159 -#define KEY_quotemeta 160 -#define KEY_qw 161 -#define KEY_qx 162 -#define KEY_rand 163 -#define KEY_read 164 -#define KEY_readdir 165 -#define KEY_readline 166 -#define KEY_readlink 167 -#define KEY_readpipe 168 -#define KEY_recv 169 -#define KEY_redo 170 -#define KEY_ref 171 -#define KEY_rename 172 -#define KEY_require 173 -#define KEY_reset 174 -#define KEY_return 175 -#define KEY_reverse 176 -#define KEY_rewinddir 177 -#define KEY_rindex 178 -#define KEY_rmdir 179 -#define KEY_s 180 -#define KEY_say 181 -#define KEY_scalar 182 -#define KEY_seek 183 -#define KEY_seekdir 184 -#define KEY_select 185 -#define KEY_semctl 186 -#define KEY_semget 187 -#define KEY_semop 188 -#define KEY_send 189 -#define KEY_setgrent 190 -#define KEY_sethostent 191 -#define KEY_setnetent 192 -#define KEY_setpgrp 193 -#define KEY_setpriority 194 -#define KEY_setprotoent 195 -#define KEY_setpwent 196 -#define KEY_setservent 197 -#define KEY_setsockopt 198 -#define KEY_shift 199 -#define KEY_shmctl 200 -#define KEY_shmget 201 -#define KEY_shmread 202 -#define KEY_shmwrite 203 -#define KEY_shutdown 204 -#define KEY_sin 205 -#define KEY_sleep 206 -#define KEY_socket 207 -#define KEY_socketpair 208 -#define KEY_sort 209 -#define KEY_splice 210 -#define KEY_split 211 -#define KEY_sprintf 212 -#define KEY_sqrt 213 -#define KEY_srand 214 -#define KEY_stat 215 -#define KEY_state 216 -#define KEY_study 217 -#define KEY_sub 218 -#define KEY_substr 219 -#define KEY_symlink 220 -#define KEY_syscall 221 -#define KEY_sysopen 222 -#define KEY_sysread 223 -#define KEY_sysseek 224 -#define KEY_system 225 -#define KEY_syswrite 226 -#define KEY_tell 227 -#define KEY_telldir 228 -#define KEY_tie 229 -#define KEY_tied 230 -#define KEY_time 231 -#define KEY_times 232 -#define KEY_tr 233 -#define KEY_try 234 -#define KEY_truncate 235 -#define KEY_uc 236 -#define KEY_ucfirst 237 -#define KEY_umask 238 -#define KEY_undef 239 -#define KEY_unless 240 -#define KEY_unlink 241 -#define KEY_unpack 242 -#define KEY_unshift 243 -#define KEY_untie 244 -#define KEY_until 245 -#define KEY_use 246 -#define KEY_utime 247 -#define KEY_values 248 -#define KEY_vec 249 -#define KEY_wait 250 -#define KEY_waitpid 251 -#define KEY_wantarray 252 -#define KEY_warn 253 -#define KEY_when 254 -#define KEY_while 255 -#define KEY_write 256 -#define KEY_x 257 -#define KEY_xor 258 -#define KEY_y 259 +#define KEY_ADJUST 7 +#define KEY_AUTOLOAD 8 +#define KEY_BEGIN 9 +#define KEY_UNITCHECK 10 +#define KEY_DESTROY 11 +#define KEY_END 12 +#define KEY_INIT 13 +#define KEY_CHECK 14 +#define KEY_abs 15 +#define KEY_accept 16 +#define KEY_alarm 17 +#define KEY_and 18 +#define KEY_atan2 19 +#define KEY_bind 20 +#define KEY_binmode 21 +#define KEY_bless 22 +#define KEY_break 23 +#define KEY_caller 24 +#define KEY_catch 25 +#define KEY_chdir 26 +#define KEY_chmod 27 +#define KEY_chomp 28 +#define KEY_chop 29 +#define KEY_chown 30 +#define KEY_chr 31 +#define KEY_chroot 32 +#define KEY_class 33 +#define KEY_close 34 +#define KEY_closedir 35 +#define KEY_cmp 36 +#define KEY_connect 37 +#define KEY_continue 38 +#define KEY_cos 39 +#define KEY_crypt 40 +#define KEY_dbmclose 41 +#define KEY_dbmopen 42 +#define KEY_default 43 +#define KEY_defer 44 +#define KEY_defined 45 +#define KEY_delete 46 +#define KEY_die 47 +#define KEY_do 48 +#define KEY_dump 49 +#define KEY_each 50 +#define KEY_else 51 +#define KEY_elsif 52 +#define KEY_endgrent 53 +#define KEY_endhostent 54 +#define KEY_endnetent 55 +#define KEY_endprotoent 56 +#define KEY_endpwent 57 +#define KEY_endservent 58 +#define KEY_eof 59 +#define KEY_eq 60 +#define KEY_eval 61 +#define KEY_evalbytes 62 +#define KEY_exec 63 +#define KEY_exists 64 +#define KEY_exit 65 +#define KEY_exp 66 +#define KEY_fc 67 +#define KEY_fcntl 68 +#define KEY_field 69 +#define KEY_fileno 70 +#define KEY_finally 71 +#define KEY_flock 72 +#define KEY_for 73 +#define KEY_foreach 74 +#define KEY_fork 75 +#define KEY_format 76 +#define KEY_formline 77 +#define KEY_ge 78 +#define KEY_getc 79 +#define KEY_getgrent 80 +#define KEY_getgrgid 81 +#define KEY_getgrnam 82 +#define KEY_gethostbyaddr 83 +#define KEY_gethostbyname 84 +#define KEY_gethostent 85 +#define KEY_getlogin 86 +#define KEY_getnetbyaddr 87 +#define KEY_getnetbyname 88 +#define KEY_getnetent 89 +#define KEY_getpeername 90 +#define KEY_getpgrp 91 +#define KEY_getppid 92 +#define KEY_getpriority 93 +#define KEY_getprotobyname 94 +#define KEY_getprotobynumber 95 +#define KEY_getprotoent 96 +#define KEY_getpwent 97 +#define KEY_getpwnam 98 +#define KEY_getpwuid 99 +#define KEY_getservbyname 100 +#define KEY_getservbyport 101 +#define KEY_getservent 102 +#define KEY_getsockname 103 +#define KEY_getsockopt 104 +#define KEY_given 105 +#define KEY_glob 106 +#define KEY_gmtime 107 +#define KEY_goto 108 +#define KEY_grep 109 +#define KEY_gt 110 +#define KEY_hex 111 +#define KEY_if 112 +#define KEY_index 113 +#define KEY_int 114 +#define KEY_ioctl 115 +#define KEY_isa 116 +#define KEY_join 117 +#define KEY_keys 118 +#define KEY_kill 119 +#define KEY_last 120 +#define KEY_lc 121 +#define KEY_lcfirst 122 +#define KEY_le 123 +#define KEY_length 124 +#define KEY_link 125 +#define KEY_listen 126 +#define KEY_local 127 +#define KEY_localtime 128 +#define KEY_lock 129 +#define KEY_log 130 +#define KEY_lstat 131 +#define KEY_lt 132 +#define KEY_m 133 +#define KEY_map 134 +#define KEY_method 135 +#define KEY_mkdir 136 +#define KEY_msgctl 137 +#define KEY_msgget 138 +#define KEY_msgrcv 139 +#define KEY_msgsnd 140 +#define KEY_my 141 +#define KEY_ne 142 +#define KEY_next 143 +#define KEY_no 144 +#define KEY_not 145 +#define KEY_oct 146 +#define KEY_open 147 +#define KEY_opendir 148 +#define KEY_or 149 +#define KEY_ord 150 +#define KEY_our 151 +#define KEY_pack 152 +#define KEY_package 153 +#define KEY_pipe 154 +#define KEY_pop 155 +#define KEY_pos 156 +#define KEY_print 157 +#define KEY_printf 158 +#define KEY_prototype 159 +#define KEY_push 160 +#define KEY_q 161 +#define KEY_qq 162 +#define KEY_qr 163 +#define KEY_quotemeta 164 +#define KEY_qw 165 +#define KEY_qx 166 +#define KEY_rand 167 +#define KEY_read 168 +#define KEY_readdir 169 +#define KEY_readline 170 +#define KEY_readlink 171 +#define KEY_readpipe 172 +#define KEY_recv 173 +#define KEY_redo 174 +#define KEY_ref 175 +#define KEY_rename 176 +#define KEY_require 177 +#define KEY_reset 178 +#define KEY_return 179 +#define KEY_reverse 180 +#define KEY_rewinddir 181 +#define KEY_rindex 182 +#define KEY_rmdir 183 +#define KEY_s 184 +#define KEY_say 185 +#define KEY_scalar 186 +#define KEY_seek 187 +#define KEY_seekdir 188 +#define KEY_select 189 +#define KEY_semctl 190 +#define KEY_semget 191 +#define KEY_semop 192 +#define KEY_send 193 +#define KEY_setgrent 194 +#define KEY_sethostent 195 +#define KEY_setnetent 196 +#define KEY_setpgrp 197 +#define KEY_setpriority 198 +#define KEY_setprotoent 199 +#define KEY_setpwent 200 +#define KEY_setservent 201 +#define KEY_setsockopt 202 +#define KEY_shift 203 +#define KEY_shmctl 204 +#define KEY_shmget 205 +#define KEY_shmread 206 +#define KEY_shmwrite 207 +#define KEY_shutdown 208 +#define KEY_sin 209 +#define KEY_sleep 210 +#define KEY_socket 211 +#define KEY_socketpair 212 +#define KEY_sort 213 +#define KEY_splice 214 +#define KEY_split 215 +#define KEY_sprintf 216 +#define KEY_sqrt 217 +#define KEY_srand 218 +#define KEY_stat 219 +#define KEY_state 220 +#define KEY_study 221 +#define KEY_sub 222 +#define KEY_substr 223 +#define KEY_symlink 224 +#define KEY_syscall 225 +#define KEY_sysopen 226 +#define KEY_sysread 227 +#define KEY_sysseek 228 +#define KEY_system 229 +#define KEY_syswrite 230 +#define KEY_tell 231 +#define KEY_telldir 232 +#define KEY_tie 233 +#define KEY_tied 234 +#define KEY_time 235 +#define KEY_times 236 +#define KEY_tr 237 +#define KEY_try 238 +#define KEY_truncate 239 +#define KEY_uc 240 +#define KEY_ucfirst 241 +#define KEY_umask 242 +#define KEY_undef 243 +#define KEY_unless 244 +#define KEY_unlink 245 +#define KEY_unpack 246 +#define KEY_unshift 247 +#define KEY_untie 248 +#define KEY_until 249 +#define KEY_use 250 +#define KEY_utime 251 +#define KEY_values 252 +#define KEY_vec 253 +#define KEY_wait 254 +#define KEY_waitpid 255 +#define KEY_wantarray 256 +#define KEY_warn 257 +#define KEY_when 258 +#define KEY_while 259 +#define KEY_write 260 +#define KEY_x 261 +#define KEY_xor 262 +#define KEY_y 263 /* Generated from: - * b680fb3a27b173b65d9c4e534ad92897c925e336476879a6be1da18ac55cbe8b regen/keywords.pl + * eb67e851da14ede1aad67aec4a387fa250c1345407fad0a02988d2d8d3cc27f2 regen/keywords.pl * ex: set ro: */ Index: gnu/usr.bin/perl/l1_char_class_tab.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/l1_char_class_tab.h,v diff -u -p -a -u -p -r1.6 l1_char_class_tab.h --- gnu/usr.bin/perl/l1_char_class_tab.h 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/l1_char_class_tab.h 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! * This file is built by regen/mk_PL_charclass.pl from Unicode::UCD. * Any changes made here will be lost! @@ -8,262 +8,262 @@ * in the comment*/ #if 'A' == 65 /* ASCII/Latin1 */ -/* U+00 NUL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+01 SOH */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+02 STX */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+03 ETX */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+04 EOT */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+05 ENQ */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+06 ACK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+07 BEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+08 BS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+09 HT */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE), -/* U+0A LF */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE), -/* U+0B VT */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE), -/* U+0C FF */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE), -/* U+0D CR */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE), -/* U+0E SO */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+0F SI */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+10 DLE */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+11 DC1 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+12 DC2 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+13 DC3 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+14 DC4 */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+15 NAK */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+16 SYN */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+17 ETB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+18 CAN */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+19 EOM */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+1A SUB */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+1B ESC */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_MNEMONIC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+1C FS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+1D GS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+1E RS */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+1F US */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+20 SP */ (1U<<_CC_ASCII)|(1U<<_CC_BLANK)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE), -/* U+21 '!' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+22 '"' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+23 '#' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+24 '$' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+25 '%' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+26 '&' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+27 "'" */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+28 '(' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+29 ')' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+2A '*' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+2B '+' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+2C ',' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+2D '-' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+2E '.' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+2F '/' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+30 '0' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+31 '1' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+32 '2' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+33 '3' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+34 '4' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+35 '5' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+36 '6' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+37 '7' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+38 '8' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+39 '9' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+3A ':' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+3B ';' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+3C '<' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+3D '=' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+3E '>' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+3F '?' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+40 '@' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+41 'A' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+42 'B' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+43 'C' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+44 'D' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+45 'E' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+46 'F' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+47 'G' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+48 'H' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+49 'I' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+4A 'J' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+4B 'K' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+4C 'L' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+4D 'M' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+4E 'N' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+4F 'O' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+50 'P' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+51 'Q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+52 'R' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+53 'S' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+54 'T' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+55 'U' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+56 'V' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+57 'W' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+58 'X' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+59 'Y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+5A 'Z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+5B '[' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+5C '\' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+5D ']' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+5E '^' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+5F '_' */ (1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_WORDCHAR), -/* U+60 '`' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+61 'a' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+62 'b' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+63 'c' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+64 'd' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+65 'e' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+66 'f' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* U+67 'g' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+68 'h' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+69 'i' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+6A 'j' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+6B 'k' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+6C 'l' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+6D 'm' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+6E 'n' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+6F 'o' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+70 'p' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+71 'q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+72 'r' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+73 's' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+74 't' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+75 'u' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+76 'v' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+77 'w' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+78 'x' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+79 'y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+7A 'z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+7B '{' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+7C '|' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+7D '}' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+7E '~' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+7F DEL */ (1U<<_CC_ASCII)|(1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+80 PAD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+81 HOP */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+82 BPH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+83 NBH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+84 IND */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+85 NEL */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE)|(1U<<_CC_VERTSPACE), -/* U+86 SSA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+87 ESA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+88 HTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+89 HTJ */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+8A VTS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+8B PLD */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+8C PLU */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+8D RI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+8E SS2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+8F SS3 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+90 DCS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+91 PU1 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+92 PU2 */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+93 STS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+94 CCH */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+95 MW */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+96 SPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+97 EPA */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+98 SOS */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+99 SGC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+9A SCI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+9B CSI */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+9C ST */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+9D OSC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+9E PM */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+9F APC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA), -/* U+A0 NBSP */ (1U<<_CC_BLANK)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA)|(1U<<_CC_SPACE), -/* U+A1 INVERTED '!' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+A2 CENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+A3 POUND */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+A4 CURRENCY */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+A5 YEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+A6 BROKEN BAR */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+A7 SECTION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+A8 DIAERESIS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* U+A9 COPYRIGHT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+AA FEMININE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+AB LEFT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+AC NOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+AD SOFT HYPHEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+AE REGISTERED */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+AF MACRON */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* U+B0 DEGREE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+B1 PLUS-MINUS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+B2 SUPERSCRIPT 2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* U+B3 SUPERSCRIPT 3 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* U+B4 ACUTE ACCENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* U+B5 MICRO */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+B6 PILCROW */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+B7 MIDDLE DOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT), -/* U+B8 CEDILLA */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* U+B9 SUPERSCRIPT 1 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* U+BA MASCULINE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+BB RIGHT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+BC 1/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* U+BD 1/2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* U+BE 3/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* U+BF INVERTED '?' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+C0 A with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+C1 A with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+C2 A with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+C3 A with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+C4 A with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+C5 A with RING */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+C6 AE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+C7 C with CEDILLA */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+C8 E with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+C9 E with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+CA E with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+CB E with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+CC I with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+CD I with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+CE I with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+CF I with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+D0 ETH */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+D1 N with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+D2 O with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+D3 O with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+D4 O with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+D5 O with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+D6 O with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+D7 MULTIPLICATION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+D8 O with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+D9 U with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+DA U with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+DB U with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+DC U with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+DD Y with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+DE THORN */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* U+DF sharp s */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+E0 a with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+E1 a with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+E2 a with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+E3 a with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+E4 a with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+E5 a with ring */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+E6 ae */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+E7 c with cedilla */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+E8 e with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+E9 e with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+EA e with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+EB e with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+EC i with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+ED i with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+EE i with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+EF i with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+F0 eth */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+F1 n with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+F2 o with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+F3 o with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+F4 o with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+F5 o with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+F6 o with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+F7 DIVISION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* U+F8 o with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+F9 u with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+FA u with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+FB u with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+FC u with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+FD y with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+FE thorn */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* U+FF y with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR) +/* U+00 NUL */ (1U<' */ (1U<' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x6F U+3F '?' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x70 U+F8 I8=BC o with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x71 U+C9 I8=BD E with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x72 U+CA I8=BE E with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x73 U+CB I8=BF E with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x74 U+C8 I8=C0 E with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x75 U+CD I8=C1 I with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x76 U+CE I8=C2 I with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x77 U+CF I8=C3 I with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x78 U+CC I8=C4 I with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x79 U+60 '`' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7A U+3A ':' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7B U+23 '#' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7C U+40 '@' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7D U+27 "'" */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7E U+3D '=' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7F U+22 '"' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x80 U+D8 I8=C5 O with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x81 U+61 'a' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x82 U+62 'b' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x83 U+63 'c' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x84 U+64 'd' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x85 U+65 'e' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x86 U+66 'f' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x87 U+67 'g' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x88 U+68 'h' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x89 U+69 'i' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x8A U+AB I8=C6 LEFT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x8B U+BB I8=C7 RIGHT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x8C U+F0 I8=C8 eth */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x8D U+FD I8=C9 y with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x8E U+FE I8=CA thorn */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x8F U+B1 I8=CB PLUS-MINUS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0x90 U+B0 I8=CC DEGREE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0x91 U+6A 'j' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x92 U+6B 'k' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x93 U+6C 'l' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x94 U+6D 'm' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x95 U+6E 'n' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x96 U+6F 'o' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x97 U+70 'p' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x98 U+71 'q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x99 U+72 'r' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x9A U+AA I8=CD FEMININE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x9B U+BA I8=CE MASCULINE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x9C U+E6 I8=CF ae */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x9D U+B8 I8=D0 CEDILLA */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0x9E U+C6 I8=D1 AE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x9F U+A4 I8=D2 CURRENCY */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xA0 U+B5 I8=D3 MICRO */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA1 U+7E '~' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xA2 U+73 's' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA3 U+74 't' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA4 U+75 'u' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA5 U+76 'v' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA6 U+77 'w' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA7 U+78 'x' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA8 U+79 'y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA9 U+7A 'z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xAA U+A1 I8=D4 INVERTED '!' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xAB U+BF I8=D5 INVERTED '?' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xAC U+D0 I8=D6 ETH */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xAD U+5B '[' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xAE U+DE I8=D7 THORN */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xAF U+AE I8=D8 REGISTERED */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xB0 U+AC I8=D9 NOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xB1 U+A3 I8=DA POUND */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xB2 U+A5 I8=DB YEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xB3 U+B7 I8=DC MIDDLE DOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT), -/* 0xB4 U+A9 I8=DD COPYRIGHT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xB5 U+A7 I8=DE SECTION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+B6 I8=DF PILCROW */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xB7 U+BC I8=E0 1/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xB8 U+BD I8=E1 1/2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xB9 U+BE I8=E2 3/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xBA U+DD I8=E3 Y with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xBB U+A8 I8=E4 DIAERESIS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xBC U+AF I8=E5 MACRON */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xBD U+5D ']' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xBE U+B4 I8=E6 ACUTE ACCENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xBF U+D7 I8=E7 MULTIPLICATION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xC0 U+7B '{' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xC1 U+41 'A' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC2 U+42 'B' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC3 U+43 'C' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC4 U+44 'D' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC5 U+45 'E' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC6 U+46 'F' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC7 U+47 'G' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xC8 U+48 'H' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xC9 U+49 'I' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xCA U+AD I8=E8 SOFT HYPHEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xCB U+F4 I8=E9 o with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xCC U+F6 I8=EA o with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xCD U+F2 I8=EB o with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xCE U+F3 I8=EC o with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xCF U+F5 I8=ED o with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xD0 U+7D '}' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xD1 U+4A 'J' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD2 U+4B 'K' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD3 U+4C 'L' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD4 U+4D 'M' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD5 U+4E 'N' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD6 U+4F 'O' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD7 U+50 'P' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD8 U+51 'Q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD9 U+52 'R' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xDA U+B9 I8=EE SUPERSCRIPT 1 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xDB U+FB I8=EF u with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xDC U+FC I8=F0 u with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xDD U+F9 I8=F1 u with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xDE U+FA I8=F2 u with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xDF U+FF I8=F3 y with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xE0 U+5C '\' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xE1 U+F7 I8=F4 DIVISION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xE2 U+53 'S' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE3 U+54 'T' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE4 U+55 'U' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE5 U+56 'V' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE6 U+57 'W' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE7 U+58 'X' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE8 U+59 'Y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE9 U+5A 'Z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xEA U+B2 I8=F5 SUPERSCRIPT 2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xEB U+D4 I8=F6 O with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xEC U+D6 I8=F7 O with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xED U+D2 I8=F8 O with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xEE U+D3 I8=F9 O with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xEF U+D5 I8=FA O with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xF0 U+30 '0' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF1 U+31 '1' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF2 U+32 '2' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF3 U+33 '3' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF4 U+34 '4' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF5 U+35 '5' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF6 U+36 '6' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF7 U+37 '7' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF8 U+38 '8' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF9 U+39 '9' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xFA U+B3 I8=FB SUPERSCRIPT 3 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xFB U+DB I8=FC U with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xFC U+DC I8=FD U with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xFD U+D9 I8=FE U with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xFE U+DA I8=FF U with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xFF U+9F APC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA) +/* U+00 NUL */ (1U<' */ (1U<' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x6F U+3F '?' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x70 U+F8 I8=BD o with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x71 U+C9 I8=BE E with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x72 U+CA I8=BF E with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x73 U+CB I8=C0 E with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x74 U+C8 I8=C1 E with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x75 U+CD I8=C2 I with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x76 U+CE I8=C3 I with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x77 U+CF I8=C4 I with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x78 U+CC I8=C5 I with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x79 U+60 '`' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7A U+3A ':' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7B U+23 '#' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7C U+40 '@' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7D U+27 "'" */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7E U+3D '=' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x7F U+22 '"' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x80 U+D8 I8=C6 O with '/' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x81 U+61 'a' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x82 U+62 'b' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x83 U+63 'c' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x84 U+64 'd' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x85 U+65 'e' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x86 U+66 'f' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0x87 U+67 'g' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x88 U+68 'h' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x89 U+69 'i' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x8A U+AB I8=C7 LEFT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x8B U+BB I8=C8 RIGHT-POINTING DOUBLE ANGLE QUOTE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0x8C U+F0 I8=C9 eth */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x8D U+FD I8=CA y with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x8E U+FE I8=CB thorn */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x8F U+B1 I8=CC PLUS-MINUS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0x90 U+B0 I8=CD DEGREE */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0x91 U+6A 'j' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x92 U+6B 'k' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x93 U+6C 'l' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x94 U+6D 'm' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x95 U+6E 'n' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x96 U+6F 'o' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x97 U+70 'p' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x98 U+71 'q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x99 U+72 'r' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x9A U+AA I8=CE FEMININE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x9B U+BA I8=CF MASCULINE ORDINAL */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x9C U+E6 I8=D0 ae */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0x9D U+B8 I8=D1 CEDILLA */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0x9E U+C6 I8=D2 AE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0x9F U+A4 I8=D3 CURRENCY */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xA0 U+B5 I8=D4 MICRO */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA1 U+7E '~' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xA2 U+73 's' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA3 U+74 't' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA4 U+75 'u' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA5 U+76 'v' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA6 U+77 'w' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA7 U+78 'x' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA8 U+79 'y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xA9 U+7A 'z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xAA U+A1 I8=D5 INVERTED '!' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xAB U+BF I8=D6 INVERTED '?' */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xAC U+D0 I8=D7 ETH */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xAD U+DD I8=D8 Y with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xAE U+DE I8=D9 THORN */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xAF U+AE I8=DA REGISTERED */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xB0 U+5E '^' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xB1 U+A3 I8=DB POUND */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xB2 U+A5 I8=DC YEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xB3 U+B7 I8=DD MIDDLE DOT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT), -/* 0xB4 U+A9 I8=DE COPYRIGHT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xB5 U+A7 I8=DF SECTION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* U+B6 I8=E0 PILCROW */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xB7 U+BC I8=E1 1/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xB8 U+BD I8=E2 1/2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xB9 U+BE I8=E3 3/4 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xBA U+5B '[' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xBB U+5D ']' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xBC U+AF I8=E4 MACRON */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xBD U+A8 I8=E5 DIAERESIS */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xBE U+B4 I8=E6 ACUTE ACCENT */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xBF U+D7 I8=E7 MULTIPLICATION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xC0 U+7B '{' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xC1 U+41 'A' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC2 U+42 'B' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC3 U+43 'C' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC4 U+44 'D' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC5 U+45 'E' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC6 U+46 'F' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xC7 U+47 'G' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xC8 U+48 'H' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xC9 U+49 'I' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xCA U+AD I8=E8 SOFT HYPHEN */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xCB U+F4 I8=E9 o with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xCC U+F6 I8=EA o with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xCD U+F2 I8=EB o with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xCE U+F3 I8=EC o with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xCF U+F5 I8=ED o with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xD0 U+7D '}' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xD1 U+4A 'J' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD2 U+4B 'K' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD3 U+4C 'L' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD4 U+4D 'M' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD5 U+4E 'N' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD6 U+4F 'O' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD7 U+50 'P' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD8 U+51 'Q' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xD9 U+52 'R' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xDA U+B9 I8=EE SUPERSCRIPT 1 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xDB U+FB I8=EF u with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xDC U+FC I8=F0 u with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xDD U+F9 I8=F1 u with grave */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xDE U+FA I8=F2 u with acute */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xDF U+FF I8=F3 y with diaeresis */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_LOWER)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR), -/* 0xE0 U+5C '\' */ (1U<<_CC_ASCII)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_PUNCT)|(1U<<_CC_QUOTEMETA), -/* 0xE1 U+F7 I8=F4 DIVISION */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_QUOTEMETA), -/* 0xE2 U+53 'S' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NONLATIN1_SIMPLE_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE3 U+54 'T' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE4 U+55 'U' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE5 U+56 'V' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE6 U+57 'W' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE7 U+58 'X' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE8 U+59 'Y' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_NONLATIN1_FOLD)|(1U<<_CC_NON_FINAL_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xE9 U+5A 'Z' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xEA U+B2 I8=F5 SUPERSCRIPT 2 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xEB U+D4 I8=F6 O with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xEC U+D6 I8=F7 O with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xED U+D2 I8=F8 O with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xEE U+D3 I8=F9 O with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xEF U+D5 I8=FA O with '~' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xF0 U+30 '0' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF1 U+31 '1' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_BINDIGIT)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF2 U+32 '2' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF3 U+33 '3' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF4 U+34 '4' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF5 U+35 '5' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF6 U+36 '6' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF7 U+37 '7' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_OCTDIGIT)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF8 U+38 '8' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xF9 U+39 '9' */ (1U<<_CC_ALPHANUMERIC)|(1U<<_CC_ASCII)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_DIGIT)|(1U<<_CC_GRAPH)|(1U<<_CC_PRINT)|(1U<<_CC_WORDCHAR)|(1U<<_CC_XDIGIT), -/* 0xFA U+B3 I8=FB SUPERSCRIPT 3 */ (1U<<_CC_GRAPH)|(1U<<_CC_PRINT), -/* 0xFB U+DB I8=FC U with '^' */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xFC U+DC I8=FD U with DIAERESIS */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xFD U+D9 I8=FE U with GRAVE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xFE U+DA I8=FF U with ACUTE */ (1U<<_CC_ALPHA)|(1U<<_CC_ALPHANUMERIC)|(1U<<_CC_CASED)|(1U<<_CC_CHARNAME_CONT)|(1U<<_CC_GRAPH)|(1U<<_CC_IDFIRST)|(1U<<_CC_IS_IN_SOME_FOLD)|(1U<<_CC_PRINT)|(1U<<_CC_UPPER)|(1U<<_CC_WORDCHAR), -/* 0xFF U+9F APC */ (1U<<_CC_CNTRL)|(1U<<_CC_QUOTEMETA) +/* U+00 NUL */ (1U<' */ (1U< #endif -/* If the environment says to, we can output debugging information during - * initialization. This is done before option parsing, and before any thread - * creation, so can be a file-level static */ -#if ! defined(DEBUGGING) -# define debug_initialization 0 -# define DEBUG_INITIALIZATION_set(v) + /* The main errno that gets used is this one, on platforms that support it */ +#ifdef EINVAL +# define SET_EINVAL SETERRNO(EINVAL, LIB_INVARG) #else -static bool debug_initialization = FALSE; -# define DEBUG_INITIALIZATION_set(v) (debug_initialization = v) +# define SET_EINVAL +#endif + +/* If we have any of these library functions, we can reliably determine is a + * locale is a UTF-8 one or not. And if we aren't using locales at all, we act + * as if everything is the C locale, so the answer there is always "No, it + * isn't UTF-8"; this too is reliably accurate */ +#if defined(HAS_SOME_LANGINFO) || defined(HAS_MBTOWC) || defined(HAS_MBRTOWC) \ + || ! defined(USE_LOCALE) +# define HAS_RELIABLE_UTF8NESS_DETERMINATION #endif +#ifdef USE_LOCALE + +PERL_STATIC_INLINE const char * +S_mortalized_pv_copy(pTHX_ const char * const pv) +{ + PERL_ARGS_ASSERT_MORTALIZED_PV_COPY; + + /* Copies the input pv, and arranges for it to be freed at an unspecified + * later time. */ + + if (pv == NULL) { + return NULL; + } + + const char * copy = savepv(pv); + SAVEFREEPV(copy); + return copy; +} + +#endif /* Returns the Unix errno portion; ignoring any others. This is a macro here * instead of putting it into perl.h, because unclear to khw what should be * done generally. */ #define GET_ERRNO saved_errno -/* strlen() of a literal string constant. We might want this more general, - * but using it in just this file for now. A problem with more generality is - * the compiler warnings about comparing unlike signs */ -#define STRLENs(s) (sizeof("" s "") - 1) +/* Default values come from the C locale */ +#define C_codeset "ANSI_X3.4-1968" /* Only in some Configurations, and usually + a single instance, so is a #define */ +static const char C_decimal_point[] = "."; +static const char C_thousands_sep[] = ""; /* Is the C string input 'name' "C" or "POSIX"? If so, and 'name' is the * return of setlocale(), then this is extremely likely to be the C or POSIX @@ -94,85 +219,47 @@ static bool debug_initialization = FALSE && (( *(name) == 'C' && (*(name + 1)) == '\0') \ || strEQ((name), "POSIX"))) -#ifdef USE_LOCALE - -/* This code keeps a LRU cache of the UTF-8ness of the locales it has so-far - * looked up. This is in the form of a C string: */ - -#define UTF8NESS_SEP "\v" -#define UTF8NESS_PREFIX "\f" - -/* So, the string looks like: - * - * \vC\a0\vPOSIX\a0\vam_ET\a0\vaf_ZA.utf8\a1\ven_US.UTF-8\a1\0 - * - * where the digit 0 after the \a indicates that the locale starting just - * after the preceding \v is not UTF-8, and the digit 1 mean it is. */ - -STATIC_ASSERT_DECL(STRLENs(UTF8NESS_SEP) == 1); -STATIC_ASSERT_DECL(STRLENs(UTF8NESS_PREFIX) == 1); - -#define C_and_POSIX_utf8ness UTF8NESS_SEP "C" UTF8NESS_PREFIX "0" \ - UTF8NESS_SEP "POSIX" UTF8NESS_PREFIX "0" - -/* The cache is initialized to C_and_POSIX_utf8ness at start up. These are - * kept there always. The remining portion of the cache is LRU, with the - * oldest looked-up locale at the tail end */ - -STATIC char * -S_stdize_locale(pTHX_ char *locs) -{ - /* Standardize the locale name from a string returned by 'setlocale', - * possibly modifying that string. - * - * The typical return value of setlocale() is either - * (1) "xx_YY" if the first argument of setlocale() is not LC_ALL - * (2) "xa_YY xb_YY ..." if the first argument of setlocale() is LC_ALL - * (the space-separated values represent the various sublocales, - * in some unspecified order). This is not handled by this function. - * - * In some platforms it has a form like "LC_SOMETHING=Lang_Country.866\n", - * which is harmful for further use of the string in setlocale(). This - * function removes the trailing new line and everything up through the '=' - * */ - - const char * const s = strchr(locs, '='); - bool okay = TRUE; - - PERL_ARGS_ASSERT_STDIZE_LOCALE; - - if (s) { - const char * const t = strchr(s, '.'); - okay = FALSE; - if (t) { - const char * const u = strchr(t, '\n'); - if (u && (u[1] == 0)) { - const STRLEN len = u - s; - Move(s + 1, locs, len, char); - locs[len] = 0; - okay = TRUE; - } - } - } +#if defined(HAS_NL_LANGINFO_L) || defined(HAS_NL_LANGINFO) +# define HAS_SOME_LANGINFO +#endif - if (!okay) - Perl_croak(aTHX_ "Can't fix broken locale name \"%s\"", locs); +#define my_langinfo_c(item, category, locale, retbufp, retbuf_sizep, utf8ness) \ + my_langinfo_i(item, category##_INDEX_, locale, retbufp, \ + retbuf_sizep, utf8ness) - return locs; -} +#ifdef USE_LOCALE -/* Two parallel arrays; first the locale categories Perl uses on this system; - * the second array is their names. These arrays are in mostly arbitrary - * order. */ +# ifdef DEBUGGING +# define setlocale_debug_string_i(index, locale, result) \ + my_setlocale_debug_string_i(index, locale, result, __LINE__) +# define setlocale_debug_string_c(category, locale, result) \ + setlocale_debug_string_i(category##_INDEX_, locale, result) +# define setlocale_debug_string_r(category, locale, result) \ + setlocale_debug_string_i(get_category_index(category, locale), \ + locale, result) +# endif + +# define toggle_locale_i(index, locale) \ + S_toggle_locale_i(aTHX_ index, locale, __LINE__) +# define toggle_locale_c(cat, locale) toggle_locale_i(cat##_INDEX_, locale) +# define restore_toggled_locale_i(index, locale) \ + S_restore_toggled_locale_i(aTHX_ index, locale, __LINE__) +# define restore_toggled_locale_c(cat, locale) \ + restore_toggled_locale_i(cat##_INDEX_, locale) + +/* Two parallel arrays indexed by our mapping of category numbers into small + * non-negative indexes; first the locale categories Perl uses on this system, + * used to do the inverse mapping. The second array is their names. These + * arrays are in mostly arbitrary order. */ -const int categories[] = { +STATIC const int categories[] = { -# ifdef USE_LOCALE_NUMERIC - LC_NUMERIC, -# endif # ifdef USE_LOCALE_CTYPE LC_CTYPE, # endif +# ifdef USE_LOCALE_NUMERIC + LC_NUMERIC, +# endif # ifdef USE_LOCALE_COLLATE LC_COLLATE, # endif @@ -200,6 +287,9 @@ const int categories[] = { # ifdef USE_LOCALE_TELEPHONE LC_TELEPHONE, # endif +# ifdef USE_LOCALE_NAME + LC_NAME, +# endif # ifdef USE_LOCALE_SYNTAX LC_SYNTAX, # endif @@ -209,21 +299,22 @@ const int categories[] = { # ifdef LC_ALL LC_ALL, # endif - -1 /* Placeholder because C doesn't allow a - trailing comma, and it would get complicated - with all the #ifdef's */ + + /* Placeholder as a precaution if code fails to check the return of + * get_category_index(), which returns this element to indicate an error */ + -1 }; /* The top-most real element is LC_ALL */ -const char * const category_names[] = { +STATIC const char * const category_names[] = { -# ifdef USE_LOCALE_NUMERIC - "LC_NUMERIC", -# endif # ifdef USE_LOCALE_CTYPE "LC_CTYPE", # endif +# ifdef USE_LOCALE_NUMERIC + "LC_NUMERIC", +# endif # ifdef USE_LOCALE_COLLATE "LC_COLLATE", # endif @@ -251,6 +342,9 @@ const char * const category_names[] = { # ifdef USE_LOCALE_TELEPHONE "LC_TELEPHONE", # endif +# ifdef USE_LOCALE_NAME + "LC_NAME", +# endif # ifdef USE_LOCALE_SYNTAX "LC_SYNTAX", # endif @@ -260,1024 +354,1511 @@ const char * const category_names[] = { # ifdef LC_ALL "LC_ALL", # endif - NULL /* Placeholder */ - }; + + /* Placeholder as a precaution if code fails to check the return of + * get_category_index(), which returns this element to indicate an error */ + NULL +}; + +/* A few categories require additional setup when they are changed. This table + * points to the functions that do that setup */ +STATIC void (*update_functions[]) (pTHX_ const char *, bool force) = { +# ifdef USE_LOCALE_CTYPE + S_new_ctype, +# endif +# ifdef USE_LOCALE_NUMERIC + S_new_numeric, +# endif +# ifdef USE_LOCALE_COLLATE + S_new_collate, +# endif +# ifdef USE_LOCALE_TIME + NULL, +# endif +# ifdef USE_LOCALE_MESSAGES + NULL, +# endif +# ifdef USE_LOCALE_MONETARY + NULL, +# endif +# ifdef USE_LOCALE_ADDRESS + NULL, +# endif +# ifdef USE_LOCALE_IDENTIFICATION + NULL, +# endif +# ifdef USE_LOCALE_MEASUREMENT + NULL, +# endif +# ifdef USE_LOCALE_PAPER + NULL, +# endif +# ifdef USE_LOCALE_TELEPHONE + NULL, +# endif +# ifdef USE_LOCALE_NAME + NULL, +# endif +# ifdef USE_LOCALE_SYNTAX + NULL, +# endif +# ifdef USE_LOCALE_TOD + NULL, +# endif + /* No harm done to have this even without an LC_ALL */ + S_new_LC_ALL, + + /* Placeholder as a precaution if code fails to check the return of + * get_category_index(), which returns this element to indicate an error */ + NULL +}; # ifdef LC_ALL /* On systems with LC_ALL, it is kept in the highest index position. (-2 * to account for the final unused placeholder element.) */ # define NOMINAL_LC_ALL_INDEX (C_ARRAY_LENGTH(categories) - 2) - # else /* On systems without LC_ALL, we pretend it is there, one beyond the real * top element, hence in the unused placeholder element. */ # define NOMINAL_LC_ALL_INDEX (C_ARRAY_LENGTH(categories) - 1) - # endif /* Pretending there is an LC_ALL element just above allows us to avoid most * special cases. Most loops through these arrays in the code below are * written like 'for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++)'. They will work * on either type of system. But the code must be written to not access the - * element at 'LC_ALL_INDEX' except on platforms that have it. This can be - * checked for at compile time by using the #define LC_ALL_INDEX which is only + * element at 'LC_ALL_INDEX_' except on platforms that have it. This can be + * checked for at compile time by using the #define LC_ALL_INDEX_ which is only * defined if we do have LC_ALL. */ -STATIC const char * -S_category_name(const int category) +STATIC int +S_get_category_index_nowarn(const int category) { + /* Given a category, return the equivalent internal index we generally use + * instead, or negative if not found. + * + * Some sort of hash could be used instead of this loop, but the number of + * elements is so far at most 12 */ + unsigned int i; -#ifdef LC_ALL + PERL_ARGS_ASSERT_GET_CATEGORY_INDEX; - if (category == LC_ALL) { - return "LC_ALL"; +# ifdef LC_ALL + for (i = 0; i <= LC_ALL_INDEX_; i++) +# else + for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) +# endif + { + if (category == categories[i]) { + dTHX_DEBUGGING; + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "index of category %d (%s) is %d\n", + category, category_names[i], i)); + return i; + } + } + + return -1; +} + +STATIC unsigned int +S_get_category_index(const int category, const char * locale) +{ + /* Given a category, return the equivalent internal index we generally use + * instead. + * + * 'locale' is for use in any generated diagnostics, and may be NULL + */ + + const char * conditional_warn_text = "; can't set it to "; + const int index = get_category_index_nowarn(category); + + if (index >= 0) { + return index; + } + + /* Here, we don't know about this category, so can't handle it. */ + + if (! locale) { + locale = ""; + conditional_warn_text = ""; + } + + /* diag_listed_as: Unknown locale category %d; can't set it to %s */ + Perl_warner_nocontext(packWARN(WARN_LOCALE), + "Unknown locale category %d%s%s", + category, conditional_warn_text, locale); + + SET_EINVAL; + + /* Return an out-of-bounds value */ + return NOMINAL_LC_ALL_INDEX + 1; +} + +#endif /* ifdef USE_LOCALE */ + +void +Perl_force_locale_unlock() +{ + +#if defined(USE_LOCALE_THREADS) + + dTHX; + + /* If recursively locked, clear all at once */ + if (PL_locale_mutex_depth > 1) { + PL_locale_mutex_depth = 1; + } + + if (PL_locale_mutex_depth > 0) { + LOCALE_UNLOCK_; } #endif - for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { - if (category == categories[i]) { - return category_names[i]; - } +} + +#ifdef USE_POSIX_2008_LOCALE + +STATIC locale_t +S_use_curlocale_scratch(pTHX) +{ + /* This function is used to hide from the caller the case where the current + * locale_t object in POSIX 2008 is the global one, which is illegal in + * many of the P2008 API calls. This checks for that and, if necessary + * creates a proper P2008 object. Any prior object is deleted, as is any + * remaining object during global destruction. */ + + locale_t cur = uselocale((locale_t) 0); + + if (cur != LC_GLOBAL_LOCALE) { + return cur; } - { - const char suffix[] = " (unknown)"; - int temp = category; - Size_t length = sizeof(suffix) + 1; - char * unknown; - dTHX; + if (PL_scratch_locale_obj) { + freelocale(PL_scratch_locale_obj); + } - if (temp < 0) { - length++; - temp = - temp; - } + PL_scratch_locale_obj = duplocale(LC_GLOBAL_LOCALE); + return PL_scratch_locale_obj; +} - /* Calculate the number of digits */ - while (temp >= 10) { - temp /= 10; - length++; - } +#endif + +void +Perl_locale_panic(const char * msg, + const char * file_name, + const line_t line, + const int errnum) +{ + dTHX; + + PERL_ARGS_ASSERT_LOCALE_PANIC; + + force_locale_unlock(); + +#ifdef USE_C_BACKTRACE + dump_c_backtrace(Perl_debug_log, 20, 1); +#endif + + /* diag_listed_as: panic: %s */ + Perl_croak(aTHX_ "%s: %" LINE_Tf ": panic: %s; errno=%d\n", + file_name, line, msg, errnum); +} + +#define setlocale_failure_panic_c( \ + cat, current, failed, caller_0_line, caller_1_line) \ + setlocale_failure_panic_i(cat##_INDEX_, current, failed, \ + caller_0_line, caller_1_line) + +/* posix_setlocale() presents a consistent POSIX-compliant interface to + * setlocale(). Windows requres a customized base-level setlocale(). Any + * necessary mutex locking needs to be done at a higher level */ +#ifdef WIN32 +# define posix_setlocale(cat, locale) win32_setlocale(cat, locale) +#else +# define posix_setlocale(cat, locale) ((const char *) setlocale(cat, locale)) +#endif + +/* The next layer up is to catch vagaries and bugs in the libc setlocale return + * value. Again, any necessary mutex locking needs to be done at a higher + * level */ +#ifdef stdize_locale +# define stdized_setlocale(cat, locale) \ + stdize_locale(cat, posix_setlocale(cat, locale), \ + &PL_stdize_locale_buf, &PL_stdize_locale_bufsize, __LINE__) +#else +# define stdized_setlocale(cat, locale) posix_setlocale(cat, locale) +#endif + +/* The next many lines form a layer above the close-to-the-metal 'posix' + * and 'stdized' macros. They are used to present a uniform API to the rest of + * the code in this file in spite of the disparate underlying implementations. + * */ + +#if (! defined(USE_LOCALE_THREADS) && ! defined(USE_POSIX_2008_LOCALE)) \ + || ( defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE)) + +/* For non-threaded perls, the added layer just expands to the base-level + * functions, except if we are supposed to use the POSIX 2008 interface anyway. + * On perls where threading is invisible to us, the base-level functions are + * used regardless of threading. Currently this is only on later Windows + * versions. + * + * See the introductory comments in this file for the meaning of the suffixes + * '_c', '_r', '_i'. */ + +# define setlocale_r(cat, locale) stdized_setlocale(cat, locale) +# define setlocale_i(i, locale) setlocale_r(categories[i], locale) +# define setlocale_c(cat, locale) setlocale_r(cat, locale) + +# define void_setlocale_i(i, locale) \ + STMT_START { \ + if (! posix_setlocale(categories[i], locale)) { \ + setlocale_failure_panic_i(i, NULL, locale, __LINE__, 0); \ + NOT_REACHED; /* NOTREACHED */ \ + } \ + } STMT_END +# define void_setlocale_c(cat, locale) \ + void_setlocale_i(cat##_INDEX_, locale) +# define void_setlocale_r(cat, locale) \ + void_setlocale_i(get_category_index(cat, locale), locale) + +# define bool_setlocale_r(cat, locale) cBOOL(posix_setlocale(cat, locale)) +# define bool_setlocale_i(i, locale) \ + bool_setlocale_c(categories[i], locale) +# define bool_setlocale_c(cat, locale) bool_setlocale_r(cat, locale) + +/* All the querylocale...() forms return a mortalized copy. If you need + * something stable across calls, you need to savepv() the result yourself */ + +# define querylocale_r(cat) mortalized_pv_copy(setlocale_r(cat, NULL)) +# define querylocale_c(cat) querylocale_r(cat) +# define querylocale_i(i) querylocale_c(categories[i]) + +#elif defined(USE_LOCALE_THREADS) \ + && ! defined(USE_THREAD_SAFE_LOCALE) + + /* Here, there are threads, and there is no support for thread-safe + * operation. This is a dangerous situation, which perl is documented as + * not supporting, but it arises in practice. We can do a modicum of + * automatic mitigation by making sure there is a per-thread return from + * setlocale(), and that a mutex protects it from races */ +STATIC const char * +S_less_dicey_setlocale_r(pTHX_ const int category, const char * locale) +{ + const char * retval; - Newx(unknown, length, char); - my_snprintf(unknown, length, "%d%s", category, suffix); - SAVEFREEPV(unknown); - return unknown; + PERL_ARGS_ASSERT_LESS_DICEY_SETLOCALE_R; + + POSIX_SETLOCALE_LOCK; + + retval = stdized_setlocale(category, locale); + + /* We reuse PL_stdize_locale_buf as it doesn't conflict, but the call may + * already have used it, in which case we don't have to do anything further + * */ + retval = save_to_buffer(retval, + &PL_stdize_locale_buf, &PL_stdize_locale_bufsize); + + POSIX_SETLOCALE_UNLOCK; + + return retval; +} + +# define setlocale_r(cat, locale) less_dicey_setlocale_r(cat, locale) +# define setlocale_c(cat, locale) setlocale_r(cat, locale) +# define setlocale_i(i, locale) setlocale_r(categories[i], locale) + +# define querylocale_r(cat) mortalized_pv_copy(setlocale_r(cat, NULL)) +# define querylocale_c(cat) querylocale_r(cat) +# define querylocale_i(i) querylocale_r(categories[i]) + +STATIC void +S_less_dicey_void_setlocale_i(pTHX_ const unsigned cat_index, + const char * locale, + const line_t line) +{ + PERL_ARGS_ASSERT_LESS_DICEY_VOID_SETLOCALE_I; + + POSIX_SETLOCALE_LOCK; + if (! posix_setlocale(categories[cat_index], locale)) { + POSIX_SETLOCALE_UNLOCK; + setlocale_failure_panic_i(cat_index, NULL, locale, __LINE__, line); } + POSIX_SETLOCALE_UNLOCK; +} + +# define void_setlocale_i(i, locale) \ + less_dicey_void_setlocale_i(i, locale, __LINE__) +# define void_setlocale_c(cat, locale) \ + void_setlocale_i(cat##_INDEX_, locale) +# define void_setlocale_r(cat, locale) \ + void_setlocale_i(get_category_index(cat, locale), locale) + +# if 0 /* Not currently used */ + +STATIC bool +S_less_dicey_bool_setlocale_r(pTHX_ const int cat, const char * locale) +{ + bool retval; + + PERL_ARGS_ASSERT_LESS_DICEY_BOOL_SETLOCALE_R; + + POSIX_SETLOCALE_LOCK; + retval = cBOOL(posix_setlocale(cat, locale)); + POSIX_SETLOCALE_UNLOCK; + + return retval; } -/* Now create LC_foo_INDEX #defines for just those categories on this system */ -# ifdef USE_LOCALE_NUMERIC -# define LC_NUMERIC_INDEX 0 -# define _DUMMY_NUMERIC LC_NUMERIC_INDEX -# else -# define _DUMMY_NUMERIC -1 # endif +# define bool_setlocale_r(cat, locale) \ + less_dicey_bool_setlocale_r(cat, locale) +# define bool_setlocale_i(i, locale) \ + bool_setlocale_r(categories[i], locale) +# define bool_setlocale_c(cat, locale) bool_setlocale_r(cat, locale) +#else + +/* Here, there is a completely different API to get thread-safe locales. We + * emulate the setlocale() API with our own function(s). setlocale categories, + * like LC_NUMERIC, are not valid here for the POSIX 2008 API. Instead, there + * are equivalents, like LC_NUMERIC_MASK, which we use instead, converting to + * by using get_category_index() followed by table lookup. */ + +# define emulate_setlocale_c(cat, locale, recalc_LC_ALL, line) \ + emulate_setlocale_i(cat##_INDEX_, locale, recalc_LC_ALL, line) + + /* A wrapper for the macros below. */ +# define common_emulate_setlocale(i, locale) \ + emulate_setlocale_i(i, locale, YES_RECALC_LC_ALL, __LINE__) + +# define setlocale_i(i, locale) \ + save_to_buffer(common_emulate_setlocale(i, locale), \ + &PL_stdize_locale_buf, \ + &PL_stdize_locale_bufsize) +# define setlocale_c(cat, locale) setlocale_i(cat##_INDEX_, locale) +# define setlocale_r(cat, locale) \ + setlocale_i(get_category_index(cat, locale), locale) + +# define void_setlocale_i(i, locale) \ + ((void) common_emulate_setlocale(i, locale)) +# define void_setlocale_c(cat, locale) \ + void_setlocale_i(cat##_INDEX_, locale) +# define void_setlocale_r(cat, locale) ((void) setlocale_r(cat, locale)) + +# define bool_setlocale_i(i, locale) \ + cBOOL(common_emulate_setlocale(i, locale)) +# define bool_setlocale_c(cat, locale) \ + bool_setlocale_i(cat##_INDEX_, locale) +# define bool_setlocale_r(cat, locale) cBOOL(setlocale_r(cat, locale)) + +# define querylocale_i(i) mortalized_pv_copy(my_querylocale_i(i)) +# define querylocale_c(cat) querylocale_i(cat##_INDEX_) +# define querylocale_r(cat) querylocale_i(get_category_index(cat,NULL)) + +# ifdef USE_QUERYLOCALE +# define isSINGLE_BIT_SET(mask) isPOWER_OF_2(mask) + + /* This code used to think querylocale() was valid on LC_ALL. Make sure + * all instances of that have been removed */ +# define QUERYLOCALE_ASSERT(index) \ + __ASSERT_(isSINGLE_BIT_SET(category_masks[index])) +# if ! defined(HAS_QUERYLOCALE) && ( defined(_NL_LOCALE_NAME) \ + && defined(HAS_NL_LANGINFO_L)) +# define querylocale_l(index, locale_obj) \ + (QUERYLOCALE_ASSERT(index) \ + mortalized_pv_copy(nl_langinfo_l( \ + _NL_LOCALE_NAME(categories[index]), locale_obj))) +# else +# define querylocale_l(index, locale_obj) \ + (QUERYLOCALE_ASSERT(index) \ + mortalized_pv_copy(querylocale(category_masks[index], locale_obj))) +# endif +# endif +# if defined(__GLIBC__) && defined(USE_LOCALE_MESSAGES) +# define HAS_GLIBC_LC_MESSAGES_BUG +# include +# endif + +/* A fourth array, parallel to the ones above to map from category to its + * equivalent mask */ +STATIC const int category_masks[] = { # ifdef USE_LOCALE_CTYPE -# define LC_CTYPE_INDEX _DUMMY_NUMERIC + 1 -# define _DUMMY_CTYPE LC_CTYPE_INDEX -# else -# define _DUMMY_CTYPE _DUMMY_NUMERIC + LC_CTYPE_MASK, +# endif +# ifdef USE_LOCALE_NUMERIC + LC_NUMERIC_MASK, # endif # ifdef USE_LOCALE_COLLATE -# define LC_COLLATE_INDEX _DUMMY_CTYPE + 1 -# define _DUMMY_COLLATE LC_COLLATE_INDEX -# else -# define _DUMMY_COLLATE _DUMMY_CTYPE + LC_COLLATE_MASK, # endif # ifdef USE_LOCALE_TIME -# define LC_TIME_INDEX _DUMMY_COLLATE + 1 -# define _DUMMY_TIME LC_TIME_INDEX -# else -# define _DUMMY_TIME _DUMMY_COLLATE + LC_TIME_MASK, # endif # ifdef USE_LOCALE_MESSAGES -# define LC_MESSAGES_INDEX _DUMMY_TIME + 1 -# define _DUMMY_MESSAGES LC_MESSAGES_INDEX -# else -# define _DUMMY_MESSAGES _DUMMY_TIME + LC_MESSAGES_MASK, # endif # ifdef USE_LOCALE_MONETARY -# define LC_MONETARY_INDEX _DUMMY_MESSAGES + 1 -# define _DUMMY_MONETARY LC_MONETARY_INDEX -# else -# define _DUMMY_MONETARY _DUMMY_MESSAGES + LC_MONETARY_MASK, # endif # ifdef USE_LOCALE_ADDRESS -# define LC_ADDRESS_INDEX _DUMMY_MONETARY + 1 -# define _DUMMY_ADDRESS LC_ADDRESS_INDEX -# else -# define _DUMMY_ADDRESS _DUMMY_MONETARY + LC_ADDRESS_MASK, # endif # ifdef USE_LOCALE_IDENTIFICATION -# define LC_IDENTIFICATION_INDEX _DUMMY_ADDRESS + 1 -# define _DUMMY_IDENTIFICATION LC_IDENTIFICATION_INDEX -# else -# define _DUMMY_IDENTIFICATION _DUMMY_ADDRESS + LC_IDENTIFICATION_MASK, # endif # ifdef USE_LOCALE_MEASUREMENT -# define LC_MEASUREMENT_INDEX _DUMMY_IDENTIFICATION + 1 -# define _DUMMY_MEASUREMENT LC_MEASUREMENT_INDEX -# else -# define _DUMMY_MEASUREMENT _DUMMY_IDENTIFICATION + LC_MEASUREMENT_MASK, # endif # ifdef USE_LOCALE_PAPER -# define LC_PAPER_INDEX _DUMMY_MEASUREMENT + 1 -# define _DUMMY_PAPER LC_PAPER_INDEX -# else -# define _DUMMY_PAPER _DUMMY_MEASUREMENT + LC_PAPER_MASK, # endif # ifdef USE_LOCALE_TELEPHONE -# define LC_TELEPHONE_INDEX _DUMMY_PAPER + 1 -# define _DUMMY_TELEPHONE LC_TELEPHONE_INDEX -# else -# define _DUMMY_TELEPHONE _DUMMY_PAPER + LC_TELEPHONE_MASK, +# endif +# ifdef USE_LOCALE_NAME + LC_NAME_MASK, # endif # ifdef USE_LOCALE_SYNTAX -# define LC_SYNTAX_INDEX _DUMMY_TELEPHONE + 1 -# define _DUMMY_SYNTAX LC_SYNTAX_INDEX -# else -# define _DUMMY_SYNTAX _DUMMY_TELEPHONE + LC_SYNTAX_MASK, # endif # ifdef USE_LOCALE_TOD -# define LC_TOD_INDEX _DUMMY_SYNTAX + 1 -# define _DUMMY_TOD LC_TOD_INDEX -# else -# define _DUMMY_TOD _DUMMY_SYNTAX -# endif -# ifdef LC_ALL -# define LC_ALL_INDEX _DUMMY_TOD + 1 -# endif -#endif /* ifdef USE_LOCALE */ - -/* Windows requres a customized base-level setlocale() */ -#ifdef WIN32 -# define my_setlocale(cat, locale) win32_setlocale(cat, locale) -#else -# define my_setlocale(cat, locale) setlocale(cat, locale) -#endif - -#ifndef USE_POSIX_2008_LOCALE - -/* "do_setlocale_c" is intended to be called when the category is a constant - * known at compile time; "do_setlocale_r", not known until run time */ -# define do_setlocale_c(cat, locale) my_setlocale(cat, locale) -# define do_setlocale_r(cat, locale) my_setlocale(cat, locale) -# define FIX_GLIBC_LC_MESSAGES_BUG(i) - -#else /* Below uses POSIX 2008 */ - -/* We emulate setlocale with our own function. LC_foo is not valid for the - * POSIX 2008 functions. Instead LC_foo_MASK is used, which we use an array - * lookup to convert to. At compile time we have defined LC_foo_INDEX as the - * proper offset into the array 'category_masks[]'. At runtime, we have to - * search through the array (as the actual numbers may not be small contiguous - * positive integers which would lend themselves to array lookup). */ -# define do_setlocale_c(cat, locale) \ - emulate_setlocale(cat, locale, cat ## _INDEX, TRUE) -# define do_setlocale_r(cat, locale) emulate_setlocale(cat, locale, 0, FALSE) - -# if ! defined(__GLIBC__) || ! defined(USE_LOCALE_MESSAGES) - -# define FIX_GLIBC_LC_MESSAGES_BUG(i) - -# else /* Invalidate glibc cache of loaded translations, see [perl #134264] */ - -# include -# define FIX_GLIBC_LC_MESSAGES_BUG(i) \ - STMT_START { \ - if ((i) == LC_MESSAGES_INDEX) { \ - textdomain(textdomain(NULL)); \ - } \ - } STMT_END - -# endif - -/* A third array, parallel to the ones above to map from category to its - * equivalent mask */ -const int category_masks[] = { -# ifdef USE_LOCALE_NUMERIC - LC_NUMERIC_MASK, -# endif -# ifdef USE_LOCALE_CTYPE - LC_CTYPE_MASK, -# endif -# ifdef USE_LOCALE_COLLATE - LC_COLLATE_MASK, -# endif -# ifdef USE_LOCALE_TIME - LC_TIME_MASK, -# endif -# ifdef USE_LOCALE_MESSAGES - LC_MESSAGES_MASK, -# endif -# ifdef USE_LOCALE_MONETARY - LC_MONETARY_MASK, -# endif -# ifdef USE_LOCALE_ADDRESS - LC_ADDRESS_MASK, -# endif -# ifdef USE_LOCALE_IDENTIFICATION - LC_IDENTIFICATION_MASK, -# endif -# ifdef USE_LOCALE_MEASUREMENT - LC_MEASUREMENT_MASK, -# endif -# ifdef USE_LOCALE_PAPER - LC_PAPER_MASK, -# endif -# ifdef USE_LOCALE_TELEPHONE - LC_TELEPHONE_MASK, -# endif -# ifdef USE_LOCALE_SYNTAX - LC_SYNTAX_MASK, -# endif -# ifdef USE_LOCALE_TOD - LC_TOD_MASK, + LC_TOD_MASK, # endif /* LC_ALL can't be turned off by a Configure * option, and in Posix 2008, should always be * here, so compile it in unconditionally. * This could catch some glitches at compile * time */ - LC_ALL_MASK - }; + LC_ALL_MASK, + + /* Placeholder as a precaution if code fails to check the return of + * get_category_index(), which returns this element to indicate an error */ + 0 +}; + +# define my_querylocale_c(cat) my_querylocale_i(cat##_INDEX_) STATIC const char * -S_emulate_setlocale(const int category, - const char * locale, - unsigned int index, - const bool is_index_valid - ) +S_my_querylocale_i(pTHX_ const unsigned int index) { - /* This function effectively performs a setlocale() on just the current - * thread; thus it is thread-safe. It does this by using the POSIX 2008 - * locale functions to emulate the behavior of setlocale(). Similar to - * regular setlocale(), the return from this function points to memory that - * can be overwritten by other system calls, so needs to be copied - * immediately if you need to retain it. The difference here is that - * system calls besides another setlocale() can overwrite it. - * - * By doing this, most locale-sensitive functions become thread-safe. The - * exceptions are mostly those that return a pointer to static memory. - * - * This function takes the same parameters, 'category' and 'locale', that - * the regular setlocale() function does, but it also takes two additional - * ones. This is because the 2008 functions don't use a category; instead - * they use a corresponding mask. Because this function operates in both - * worlds, it may need one or the other or both. This function can - * calculate the mask from the input category, but to avoid this - * calculation, if the caller knows at compile time what the mask is, it - * can pass it, setting 'is_index_valid' to TRUE; otherwise the mask - * parameter is ignored. + /* This function returns the name of the locale category given by the input + * index into our parallel tables of them. * * POSIX 2008, for some sick reason, chose not to provide a method to find - * the category name of a locale. Some vendors have created a - * querylocale() function to do just that. This function is a lot simpler - * to implement on systems that have this. Otherwise, we have to keep - * track of what the locale has been set to, so that we can return its - * name to emulate setlocale(). It's also possible for C code in some - * library to change the locale without us knowing it, though as of + * the category name of a locale, discarding a basic linguistic tenet that + * for any object, people will create a name for it. Some vendors have + * created a querylocale() function to do just that. This function is a + * lot simpler to implement on systems that have this. Otherwise, we have + * to keep track of what the locale has been set to, so that we can return + * its name so as to emulate setlocale(). It's also possible for C code in + * some library to change the locale without us knowing it, though as of * September 2017, there are no occurrences in CPAN of uselocale(). Some * libraries do use setlocale(), but that changes the global locale, and - * threads using per-thread locales will just ignore those changes. - * Another problem is that without querylocale(), we have to guess at what - * was meant by setting a locale of "". We handle this by not actually - * ever setting to "" (unless querylocale exists), but to emulate what we - * think should happen for "". - */ - - int mask; - locale_t old_obj; - locale_t new_obj; - const char * safelocale = locale ? locale : "(null)"; - dTHX; + * threads using per-thread locales will just ignore those changes. */ -# ifdef DEBUGGING + int category; + const locale_t cur_obj = uselocale((locale_t) 0); + const char * retval; - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale input=%d (%s), \"%s\", %d, %d\n", __FILE__, __LINE__, category, category_name(category), safelocale, index, is_index_valid); - } + PERL_ARGS_ASSERT_MY_QUERYLOCALE_I; + assert(index <= NOMINAL_LC_ALL_INDEX); -# endif + category = categories[index]; - /* If the input mask might be incorrect, calculate the correct one */ - if (! is_index_valid) { - unsigned int i; + DEBUG_Lv(PerlIO_printf(Perl_debug_log, "my_querylocale_i(%s) on %p\n", + category_names[index], cur_obj)); + if (cur_obj == LC_GLOBAL_LOCALE) { + POSIX_SETLOCALE_LOCK; + retval = posix_setlocale(category, NULL); + POSIX_SETLOCALE_UNLOCK; + } + else { -# ifdef DEBUGGING +# ifdef USE_QUERYLOCALE - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: finding index of category %d (%s)\n", __FILE__, __LINE__, category, category_name(category)); - } + /* We don't currently keep records when there is querylocale(), so have + * to get it anew each time */ + retval = (index == LC_ALL_INDEX_) + ? calculate_LC_ALL(cur_obj) + : querylocale_l(index, cur_obj); -# endif +# else - for (i = 0; i <= LC_ALL_INDEX; i++) { - if (category == categories[i]) { - index = i; - goto found_index; - } + /* But we do have up-to-date values when we keep our own records + * (except some times in initialization, where we get the value from + * the system. */ + const char ** which = (index == LC_ALL_INDEX_) + ? &PL_cur_LC_ALL + : &PL_curlocales[index]; + if (*which == NULL) { + retval = stdized_setlocale(category, NULL); + *which = savepv(retval); } - - /* Here, we don't know about this category, so can't handle it. - * Fallback to the early POSIX usages */ - Perl_warner(aTHX_ packWARN(WARN_LOCALE), - "Unknown locale category %d; can't set it to %s\n", - category, safelocale); - return NULL; - - found_index: ; - -# ifdef DEBUGGING - - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: index is %d for %s\n", __FILE__, __LINE__, index, category_name(category)); + else { + retval = *which; } # endif } - mask = category_masks[index]; - -# ifdef DEBUGGING - - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: category name is %s; mask is 0x%x\n", __FILE__, __LINE__, category_names[index], mask); - } - -# endif + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "my_querylocale_i(%s) returning '%s'\n", + category_names[index], retval)); + assert(strNE(retval, "")); + return retval; +} - /* If just querying what the existing locale is ... */ - if (locale == NULL) { - locale_t cur_obj = uselocale((locale_t) 0); +# ifdef USE_PL_CURLOCALES -# ifdef DEBUGGING +STATIC const char * +S_update_PL_curlocales_i(pTHX_ + const unsigned int index, + const char * new_locale, + recalc_lc_all_t recalc_LC_ALL) +{ + /* This is a helper function for emulate_setlocale_i(), mostly used to + * make that function easier to read. */ - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale querying %p\n", __FILE__, __LINE__, cur_obj); - } + PERL_ARGS_ASSERT_UPDATE_PL_CURLOCALES_I; + assert(index <= NOMINAL_LC_ALL_INDEX); -# endif + if (index == LC_ALL_INDEX_) { + unsigned int i; - if (cur_obj == LC_GLOBAL_LOCALE) { - return my_setlocale(category, NULL); + /* For LC_ALL, we change all individual categories to correspond */ + /* PL_curlocales is a parallel array, so has same + * length as 'categories' */ + for (i = 0; i < LC_ALL_INDEX_; i++) { + Safefree(PL_curlocales[i]); + PL_curlocales[i] = savepv(new_locale); } -# ifdef HAS_QUERYLOCALE - - return (char *) querylocale(mask, cur_obj); + Safefree(PL_cur_LC_ALL); + PL_cur_LC_ALL = savepv(calculate_LC_ALL(PL_curlocales)); + return PL_cur_LC_ALL; + } -# else + /* Update the single category's record */ + Safefree(PL_curlocales[index]); + PL_curlocales[index] = savepv(new_locale); - /* If this assert fails, adjust the size of curlocales in intrpvar.h */ - STATIC_ASSERT_STMT(C_ARRAY_LENGTH(PL_curlocales) > LC_ALL_INDEX); + /* And also LC_ALL if the input says to, including if this is the final + * iteration of a loop updating all sub-categories */ + if ( recalc_LC_ALL == YES_RECALC_LC_ALL + || ( recalc_LC_ALL == RECALCULATE_LC_ALL_ON_FINAL_INTERATION + && index == NOMINAL_LC_ALL_INDEX - 1)) + { + Safefree(PL_cur_LC_ALL); + PL_cur_LC_ALL = savepv(calculate_LC_ALL(PL_curlocales)); + } -# if defined(_NL_LOCALE_NAME) \ - && defined(DEBUGGING) \ - /* On systems that accept any locale name, the real underlying \ - * locale is often returned by this internal function, so we \ - * can't use it */ \ - && ! defined(SETLOCALE_ACCEPTS_ANY_LOCALE_NAME) - { - /* Internal glibc for querylocale(), but doesn't handle - * empty-string ("") locale properly; who knows what other - * glitches. Check for it now, under debug. */ - - char * temp_name = nl_langinfo_l(_NL_LOCALE_NAME(category), - uselocale((locale_t) 0)); - /* - PerlIO_printf(Perl_debug_log, "%s:%d: temp_name=%s\n", __FILE__, __LINE__, temp_name ? temp_name : "NULL"); - PerlIO_printf(Perl_debug_log, "%s:%d: index=%d\n", __FILE__, __LINE__, index); - PerlIO_printf(Perl_debug_log, "%s:%d: PL_curlocales[index]=%s\n", __FILE__, __LINE__, PL_curlocales[index]); - */ - if (temp_name && PL_curlocales[index] && strNE(temp_name, "")) { - if ( strNE(PL_curlocales[index], temp_name) - && ! ( isNAME_C_OR_POSIX(temp_name) - && isNAME_C_OR_POSIX(PL_curlocales[index]))) { + return PL_curlocales[index]; +} -# ifdef USE_C_BACKTRACE +# endif /* Need PL_curlocales[] */ - dump_c_backtrace(Perl_debug_log, 20, 1); +STATIC const char * +S_setlocale_from_aggregate_LC_ALL(pTHX_ const char * locale, const line_t line) +{ + /* This function parses the value of the LC_ALL locale, assuming glibc + * syntax, and sets each individual category on the system to the proper + * value. + * + * This is likely to only ever be called from one place, so exists to make + * the calling function easier to read by moving this ancillary code out of + * the main line. + * + * The locale for each category is independent of the other categories. + * Often, they are all the same, but certainly not always. Perl, in fact, + * usually keeps LC_NUMERIC in the C locale, regardless of the underlying + * locale. LC_ALL has to be able to represent the case of when there are + * varying locales. Platforms have differing ways of representing this. + * Because of this, the code in this file goes to lengths to avoid the + * issue, generally looping over the component categories instead of + * referring to them in the aggregate, wherever possible. However, there + * are cases where we have to parse our own constructed aggregates, which use + * the glibc syntax. */ + + const char * locale_on_entry = querylocale_c(LC_ALL); + + PERL_ARGS_ASSERT_SETLOCALE_FROM_AGGREGATE_LC_ALL; + + /* If the string that gives what to set doesn't include all categories, + * the omitted ones get set to "C". To get this behavior, first set + * all the individual categories to "C", and override the furnished + * ones below. FALSE => No need to recalculate LC_ALL, as this is a + * temporary state */ + if (! emulate_setlocale_c(LC_ALL, "C", DONT_RECALC_LC_ALL, line)) { + setlocale_failure_panic_c(LC_ALL, locale_on_entry, + "C", __LINE__, line); + NOT_REACHED; /* NOTREACHED */ + } + + const char * s = locale; + const char * e = locale + strlen(locale); + while (s < e) { + const char * p = s; -# endif + /* Parse through the category */ + while (isWORDCHAR(*p)) { + p++; + } - Perl_croak(aTHX_ "panic: Mismatch between what Perl thinks %s is" - " (%s) and what internal glibc thinks" - " (%s)\n", category_names[index], - PL_curlocales[index], temp_name); - } + const char * category_end = p; - return temp_name; - } + if (*p++ != '=') { + locale_panic_(Perl_form(aTHX_ + "Unexpected character in locale category name '%s" + "<-- HERE", + get_displayable_string(s, p - 1, 0))); } -# endif + /* Parse through the locale name */ + const char * name_start = p; + while (p < e && *p != ';') { + p++; + } + if (UNLIKELY( p < e && *p != ';')) { + locale_panic_(Perl_form(aTHX_ + "Unexpected character in locale name '%s<-- HERE", + get_displayable_string(s, p, 0))); + } - /* Without querylocale(), we have to use our record-keeping we've - * done. */ + const char * name_end = p; - if (category != LC_ALL) { + /* Space past the semi-colon */ + if (p < e) { + p++; + } -# ifdef DEBUGGING + /* Find the index of the category name in our lists */ + for (PERL_UINT_FAST8_T i = 0; i < LC_ALL_INDEX_; i++) { - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale returning %s\n", __FILE__, __LINE__, PL_curlocales[index]); + /* Keep going if this index doesn't point to the category being + * parsed. The strnNE() avoids a Perl_form(), but would fail if + * ever a category name could be a substring of another one, e.g., + * if there were a "LC_TIME_DATE" */ + if strnNE(s, category_names[i], category_end - s) { + continue; } -# endif - - return PL_curlocales[index]; - } - else { /* For LC_ALL */ - unsigned int i; - Size_t names_len = 0; - char * all_string; - bool are_all_categories_the_same_locale = TRUE; - - /* If we have a valid LC_ALL value, just return it */ - if (PL_curlocales[LC_ALL_INDEX]) { + /* Here i points to the category being parsed. Now isolate the + * locale it is being changed to */ + const char * individ_locale = Perl_form(aTHX_ "%.*s", + (int) (name_end - name_start), name_start); -# ifdef DEBUGGING + /* And do the change. Don't recalculate LC_ALL; we'll do it + * ourselves after the loop */ + if (! emulate_setlocale_i(i, individ_locale, + DONT_RECALC_LC_ALL, line)) + { - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale returning %s\n", __FILE__, __LINE__, PL_curlocales[LC_ALL_INDEX]); + /* But if we have to back out, do fix up LC_ALL */ + if (! emulate_setlocale_c(LC_ALL, locale_on_entry, + YES_RECALC_LC_ALL, line)) + { + setlocale_failure_panic_i(i, individ_locale, + locale, __LINE__, line); + NOT_REACHED; /* NOTREACHED */ } -# endif - - return PL_curlocales[LC_ALL_INDEX]; + /* Reverting to the entry value succeeded, but the operation + * failed to go to the requested locale. */ + return NULL; } - /* Otherwise, we need to construct a string of name=value pairs. - * We use the glibc syntax, like - * LC_NUMERIC=C;LC_TIME=en_US.UTF-8;... - * First calculate the needed size. Along the way, check if all - * the locale names are the same */ - for (i = 0; i < LC_ALL_INDEX; i++) { - -# ifdef DEBUGGING - - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale i=%d, name=%s, locale=%s\n", __FILE__, __LINE__, i, category_names[i], PL_curlocales[i]); - } + /* Found and handled the desired category. Quit the inner loop to + * try the next category */ + break; + } -# endif + /* Finished with this category; iterate to the next one in the input */ + s = p; + } - names_len += strlen(category_names[i]) - + 1 /* '=' */ - + strlen(PL_curlocales[i]) - + 1; /* ';' */ +# ifdef USE_PL_CURLOCALES - if (i > 0 && strNE(PL_curlocales[i], PL_curlocales[i-1])) { - are_all_categories_the_same_locale = FALSE; - } - } + /* Here we have set all the individual categories. Update the LC_ALL entry + * as well. We can't just use the input 'locale' as the value may omit + * categories whose locale is 'C'. khw thinks it's better to store a + * complete LC_ALL. So calculate it. */ + const char * retval = savepv(calculate_LC_ALL(PL_curlocales)); + Safefree(PL_cur_LC_ALL); + PL_cur_LC_ALL = retval; - /* If they are the same, we don't actually have to construct the - * string; we just make the entry in LC_ALL_INDEX valid, and be - * that single name */ - if (are_all_categories_the_same_locale) { - PL_curlocales[LC_ALL_INDEX] = savepv(PL_curlocales[0]); - return PL_curlocales[LC_ALL_INDEX]; - } +# else - names_len++; /* Trailing '\0' */ - SAVEFREEPV(Newx(all_string, names_len, char)); - *all_string = '\0'; + const char * retval = querylocale_c(LC_ALL); - /* Then fill in the string */ - for (i = 0; i < LC_ALL_INDEX; i++) { +# endif -# ifdef DEBUGGING + return retval; +} - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale i=%d, name=%s, locale=%s\n", __FILE__, __LINE__, i, category_names[i], PL_curlocales[i]); - } +STATIC const char * +S_emulate_setlocale_i(pTHX_ -# endif + /* Our internal index of the 'category' setlocale is called with */ + const unsigned int index, - my_strlcat(all_string, category_names[i], names_len); - my_strlcat(all_string, "=", names_len); - my_strlcat(all_string, PL_curlocales[i], names_len); - my_strlcat(all_string, ";", names_len); - } + const char * new_locale, /* The locale to set the category to */ + const recalc_lc_all_t recalc_LC_ALL, /* Explained below */ + const line_t line /* Called from this line number */ + ) +{ + PERL_ARGS_ASSERT_EMULATE_SETLOCALE_I; + assert(index <= NOMINAL_LC_ALL_INDEX); -# ifdef DEBUGGING + /* Otherwise could have undefined behavior, as the return of this function + * may be copied to this buffer, which this function could change in the + * middle of its work */ + assert(new_locale != PL_stdize_locale_buf); - if (DEBUG_L_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale returning %s\n", __FILE__, __LINE__, all_string); - } + /* This function effectively performs a setlocale() on just the current + * thread; thus it is thread-safe. It does this by using the POSIX 2008 + * locale functions to emulate the behavior of setlocale(). Similar to + * regular setlocale(), the return from this function points to memory that + * can be overwritten by other system calls, so needs to be copied + * immediately if you need to retain it. The difference here is that + * system calls besides another setlocale() can overwrite it. + * + * By doing this, most locale-sensitive functions become thread-safe. The + * exceptions are mostly those that return a pointer to static memory. + * + * This function may be called in a tight loop that iterates over all + * categories. Because LC_ALL is not a "real" category, but merely the sum + * of all the other ones, such loops don't include LC_ALL. On systems that + * have querylocale() or similar, the current LC_ALL value is immediately + * retrievable; on systems lacking that feature, we have to keep track of + * LC_ALL ourselves. We could do that on each iteration, only to throw it + * away on the next, but the calculation is more than a trivial amount of + * work. Instead, the 'recalc_LC_ALL' parameter is set to + * RECALCULATE_LC_ALL_ON_FINAL_INTERATION to only do the calculation once. + * This function calls itself recursively in such a loop. + * + * When not in such a loop, the parameter is set to the other enum values + * DONT_RECALC_LC_ALL or YES_RECALC_LC_ALL. */ - #endif + int mask = category_masks[index]; + const locale_t entry_obj = uselocale((locale_t) 0); + const char * locale_on_entry = querylocale_i(index); - return all_string; + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "emulate_setlocale_i input=%d (%s), mask=0x%x," + " new locale=\"%s\", current locale=\"%s\"," + "index=%d, object=%p\n", + categories[index], category_names[index], mask, + ((new_locale == NULL) ? "(nil)" : new_locale), + locale_on_entry, index, entry_obj)); + + /* Return the already-calculated info if just querying what the existing + * locale is */ + if (new_locale == NULL) { + return locale_on_entry; + } + + /* Here, trying to change the locale, but it is a no-op if the new boss is + * the same as the old boss. Except this routine is called when converting + * from the global locale, so in that case we will create a per-thread + * locale below (with the current values). It also seemed that newlocale() + * could free up the basis locale memory if we called it with the new and + * old being the same, but khw now thinks that this was due to some other + * bug, since fixed, as there are other places where newlocale() gets + * similarly called without problems. */ + if ( entry_obj != LC_GLOBAL_LOCALE + && locale_on_entry + && strEQ(new_locale, locale_on_entry)) + { + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "(%" LINE_Tf "): emulate_setlocale_i" + " no-op to change to what it already was\n", + line)); + +# ifdef USE_PL_CURLOCALES + + /* On the final iteration of a loop that needs to recalculate LC_ALL, do + * so. If no iteration changed anything, LC_ALL also doesn't change, + * but khw believes the complexity needed to keep track of that isn't + * worth it. */ + if (UNLIKELY( recalc_LC_ALL == RECALCULATE_LC_ALL_ON_FINAL_INTERATION + && index == NOMINAL_LC_ALL_INDEX - 1)) + { + Safefree(PL_cur_LC_ALL); + PL_cur_LC_ALL = savepv(calculate_LC_ALL(PL_curlocales)); } -# ifdef EINVAL +# endif - SETERRNO(EINVAL, LIB_INVARG); + return locale_on_entry; + } -# endif +# ifndef USE_QUERYLOCALE - return NULL; + /* Without a querylocale() mechanism, we have to figure out ourselves what + * happens with setting a locale to "" */ + if (strEQ(new_locale, "")) { + new_locale = find_locale_from_environment(index); + } # endif - } /* End of this being setlocale(LC_foo, NULL) */ - - /* Here, we are switching locales. */ + /* So far, it has worked that a semi-colon in the locale name means that + * the category is LC_ALL and it subsumes categories which don't all have + * the same locale. This is the glibc syntax. */ + if (strchr(new_locale, ';')) { + assert(index == LC_ALL_INDEX_); + return setlocale_from_aggregate_LC_ALL(new_locale, line); + } -# ifndef HAS_QUERYLOCALE +# ifdef HAS_GLIBC_LC_MESSAGES_BUG - if (strEQ(locale, "")) { + /* For this bug, if the LC_MESSAGES locale changes, we have to do an + * expensive workaround. Save the current value so we can later determine + * if it changed. */ + const char * old_messages_locale = NULL; + if ( (index == LC_MESSAGES_INDEX_ || index == LC_ALL_INDEX_) + && LIKELY(PL_phase != PERL_PHASE_CONSTRUCT)) + { + old_messages_locale = querylocale_c(LC_MESSAGES); + } - /* For non-querylocale() systems, we do the setting of "" ourselves to - * be sure that we really know what's going on. We follow the Linux - * documented behavior (but if that differs from the actual behavior, - * this won't work exactly as the OS implements). We go out and - * examine the environment based on our understanding of how the system - * works, and use that to figure things out */ - - const char * const lc_all = PerlEnv_getenv("LC_ALL"); - - /* Use any "LC_ALL" environment variable, as it overrides everything - * else. */ - if (lc_all && strNE(lc_all, "")) { - locale = lc_all; - } - else { +# endif - /* Otherwise, we need to dig deeper. Unless overridden, the - * default is the LANG environment variable; if it doesn't exist, - * then "C" */ + assert(PL_C_locale_obj); - const char * default_name; + /* Now ready to switch to the input 'new_locale' */ - default_name = PerlEnv_getenv("LANG"); + /* Switching locales generally entails freeing the current one's space (at + * the C library's discretion), hence we can't be using that locale at the + * time of the switch (this wasn't obvious to khw from the man pages). So + * switch to a known locale object that we don't otherwise mess with. */ + if (! uselocale(PL_C_locale_obj)) { + + /* Not being able to change to the C locale is severe; don't keep + * going. */ + setlocale_failure_panic_i(index, locale_on_entry, "C", __LINE__, line); + NOT_REACHED; /* NOTREACHED */ + } - if (! default_name || strEQ(default_name, "")) { - default_name = "C"; - } + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "(%" LINE_Tf "): emulate_setlocale_i now using C" + " object=%p\n", line, PL_C_locale_obj)); - if (category != LC_ALL) { - const char * const name = PerlEnv_getenv(category_names[index]); + locale_t new_obj; - /* Here we are setting a single category. Assume will have the - * default name */ - locale = default_name; + /* We created a (never changing) object at start-up for LC_ALL being in the + * C locale. If this call is to switch to LC_ALL=>C, simply use that + * object. But in fact, we already have switched to it just above, in + * preparation for the general case. Since we're already there, no need to + * do further switching. */ + if (mask == LC_ALL_MASK && isNAME_C_OR_POSIX(new_locale)) { + DEBUG_Lv(PerlIO_printf(Perl_debug_log, "(%" LINE_Tf "):" + " emulate_setlocale_i will stay" + " in C object\n", line)); + new_obj = PL_C_locale_obj; - /* But then look for an overriding environment variable */ - if (name && strNE(name, "")) { - locale = name; - } + /* And free the old object if it isn't a special one */ + if (entry_obj != LC_GLOBAL_LOCALE && entry_obj != PL_C_locale_obj) { + freelocale(entry_obj); + } + } + else { /* Here is the general case, not to LC_ALL=>C */ + locale_t basis_obj = entry_obj; + + /* Specially handle two objects */ + if (basis_obj == LC_GLOBAL_LOCALE || basis_obj == PL_C_locale_obj) { + + /* For these two objects, we make duplicates to hand to newlocale() + * below. For LC_GLOBAL_LOCALE, this is because newlocale() + * doesn't necessarily accept it as input (the results are + * undefined). For PL_C_locale_obj, it is so that it never gets + * modified, as otherwise newlocale() is free to do so */ + basis_obj = duplocale(basis_obj); + if (! basis_obj) { + locale_panic_(Perl_form(aTHX_ "(%" LINE_Tf "): duplocale failed", + line)); + NOT_REACHED; /* NOTREACHED */ } - else { - bool did_override = FALSE; - unsigned int i; - - /* Here, we are getting LC_ALL. Any categories that don't have - * a corresponding environment variable set should be set to - * LANG, or to "C" if there is no LANG. If no individual - * categories differ from this, we can just set LC_ALL. This - * is buggy on systems that have extra categories that we don't - * know about. If there is an environment variable that sets - * that category, we won't know to look for it, and so our use - * of LANG or "C" improperly overrides it. On the other hand, - * if we don't do what is done here, and there is no - * environment variable, the category's locale should be set to - * LANG or "C". So there is no good solution. khw thinks the - * best is to look at systems to see what categories they have, - * and include them, and then to assume that we know the - * complete set */ - - for (i = 0; i < LC_ALL_INDEX; i++) { - const char * const env_override - = PerlEnv_getenv(category_names[i]); - const char * this_locale = ( env_override - && strNE(env_override, "")) - ? env_override - : default_name; - if (! emulate_setlocale(categories[i], this_locale, i, TRUE)) - { - return NULL; - } - if (strNE(this_locale, default_name)) { - did_override = TRUE; - } - } + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "(%" LINE_Tf "): emulate_setlocale_i" + " created %p by duping the input\n", + line, basis_obj)); + } - /* If all the categories are the same, we can set LC_ALL to - * that */ - if (! did_override) { - locale = default_name; - } - else { + /* Ready to create a new locale by modification of the existing one. + * + * NOTE: This code may incorrectly show up as a leak under the address + * sanitizer. We do not free this object under normal teardown, however + * you can set PERL_DESTRUCT_LEVEL=2 to cause it to be freed. + */ + new_obj = newlocale(mask, new_locale, basis_obj); - /* Here, LC_ALL is no longer valid, as some individual - * categories don't match it. We call ourselves - * recursively, as that will execute the code that - * generates the proper locale string for this situation. - * We don't do the remainder of this function, as that is - * to update our records, and we've just done that for the - * individual categories in the loop above, and doing so - * would cause LC_ALL to be done as well */ - return emulate_setlocale(LC_ALL, NULL, LC_ALL_INDEX, TRUE); + if (! new_obj) { + DEBUG_L(PerlIO_printf(Perl_debug_log, + " (%" LINE_Tf "): emulate_setlocale_i" + " creating new object from %p failed:" + " errno=%d\n", + line, basis_obj, GET_ERRNO)); + + /* Failed. Likely this is because the proposed new locale isn't + * valid on this system. But we earlier switched to the LC_ALL=>C + * locale in anticipation of it succeeding, Now have to switch + * back to the state upon entry */ + if (! uselocale(entry_obj)) { + setlocale_failure_panic_i(index, "switching back to", + locale_on_entry, __LINE__, line); + NOT_REACHED; /* NOTREACHED */ + } + +# ifdef USE_PL_CURLOCALES + + if (entry_obj == LC_GLOBAL_LOCALE) { + + /* Here, we are back in the global locale. We may never have + * set PL_curlocales. If the locale change had succeeded, the + * code would have then set them up, but since it didn't, do so + * here. khw isn't sure if this prevents some issues or not, + * This will calculate LC_ALL's entry only on the final + * iteration */ + POSIX_SETLOCALE_LOCK; + for (PERL_UINT_FAST8_T i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + update_PL_curlocales_i(i, + posix_setlocale(categories[i], NULL), + RECALCULATE_LC_ALL_ON_FINAL_INTERATION); } + POSIX_SETLOCALE_UNLOCK; } +# endif + + return NULL; } - } /* End of this being setlocale(LC_foo, "") */ - else if (strchr(locale, ';')) { - - /* LC_ALL may actually incude a conglomeration of various categories. - * Without querylocale, this code uses the glibc (as of this writing) - * syntax for representing that, but that is not a stable API, and - * other platforms do it differently, so we have to handle all cases - * ourselves */ - unsigned int i; - const char * s = locale; - const char * e = locale + strlen(locale); - const char * p = s; - const char * category_end; - const char * name_start; - const char * name_end; - - /* If the string that gives what to set doesn't include all categories, - * the omitted ones get set to "C". To get this behavior, first set - * all the individual categories to "C", and override the furnished - * ones below */ - for (i = 0; i < LC_ALL_INDEX; i++) { - if (! emulate_setlocale(categories[i], "C", i, TRUE)) { - return NULL; - } + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "(%" LINE_Tf "): emulate_setlocale_i created %p" + " while freeing %p\n", line, new_obj, basis_obj)); + + /* Here, successfully created an object representing the desired + * locale; now switch into it */ + if (! uselocale(new_obj)) { + freelocale(new_obj); + locale_panic_(Perl_form(aTHX_ "(%" LINE_Tf "): emulate_setlocale_i" + " switching into new locale failed", + line)); } + } - while (s < e) { + /* Here, we are using 'new_obj' which matches the input 'new_locale'. */ + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "(%" LINE_Tf "): emulate_setlocale_i now using %p\n", + line, new_obj)); - /* Parse through the category */ - while (isWORDCHAR(*p)) { - p++; - } - category_end = p; +#ifdef MULTIPLICITY + PL_cur_locale_obj = new_obj; +#endif - if (*p++ != '=') { - Perl_croak(aTHX_ - "panic: %s: %d: Unexpected character in locale name '%02X", - __FILE__, __LINE__, *(p-1)); - } + /* We are done, except for updating our records (if the system doesn't keep + * them) and in the case of locale "", we don't actually know what the + * locale that got switched to is, as it came from the environment. So + * have to find it */ - /* Parse through the locale name */ - name_start = p; - while (p < e && *p != ';') { - if (! isGRAPH(*p)) { - Perl_croak(aTHX_ - "panic: %s: %d: Unexpected character in locale name '%02X", - __FILE__, __LINE__, *(p-1)); - } - p++; - } - name_end = p; +# ifdef USE_QUERYLOCALE - /* Space past the semi-colon */ - if (p < e) { - p++; - } + if (strEQ(new_locale, "")) { + new_locale = querylocale_i(index); + } - /* Find the index of the category name in our lists */ - for (i = 0; i < LC_ALL_INDEX; i++) { - char * individ_locale; + PERL_UNUSED_ARG(recalc_LC_ALL); - /* Keep going if this isn't the index. The strnNE() avoids a - * Perl_form(), but would fail if ever a category name could be - * a substring of another one, like if there were a - * "LC_TIME_DATE" */ - if strnNE(s, category_names[i], category_end - s) { - continue; - } +# else - /* If this index is for the single category we're changing, we - * have found the locale to set it to. */ - if (category == categories[i]) { - locale = Perl_form(aTHX_ "%.*s", - (int) (name_end - name_start), - name_start); - goto ready_to_set; - } + new_locale = update_PL_curlocales_i(index, new_locale, recalc_LC_ALL); - assert(category == LC_ALL); - individ_locale = Perl_form(aTHX_ "%.*s", - (int) (name_end - name_start), name_start); - if (! emulate_setlocale(categories[i], individ_locale, i, TRUE)) - { - return NULL; - } - } +# endif +# ifdef HAS_GLIBC_LC_MESSAGES_BUG - s = p; + /* Invalidate the glibc cache of loaded translations if the locale has + * changed, see [perl #134264] */ + if (old_messages_locale) { + if (strNE(old_messages_locale, my_querylocale_c(LC_MESSAGES))) { + textdomain(textdomain(NULL)); } + } - /* Here we have set all the individual categories by recursive calls. - * These collectively should have fixed up LC_ALL, so can just query - * what that now is */ - assert(category == LC_ALL); - - return do_setlocale_c(LC_ALL, NULL); - } /* End of this being setlocale(LC_ALL, - "LC_CTYPE=foo;LC_NUMERIC=bar;...") */ +# endif - ready_to_set: ; + return new_locale; +} - /* Here at the end of having to deal with the absence of querylocale(). - * Some cases have already been fully handled by recursive calls to this - * function. But at this point, we haven't dealt with those, but are now - * prepared to, knowing what the locale name to set this category to is. - * This would have come for free if this system had had querylocale() */ +#endif /* End of the various implementations of the setlocale and + querylocale macros used in the remainder of this program */ -# endif /* end of ! querylocale */ +#ifdef USE_LOCALE - assert(PL_C_locale_obj); +/* So far, the locale strings returned by modern 2008-compliant systems have + * been fine */ - /* Switching locales generally entails freeing the current one's space (at - * the C library's discretion). We need to stop using that locale before - * the switch. So switch to a known locale object that we don't otherwise - * mess with. This returns the locale object in effect at the time of the - * switch. */ - old_obj = uselocale(PL_C_locale_obj); +STATIC const char * +S_stdize_locale(pTHX_ const int category, + const char *input_locale, + const char **buf, + Size_t *buf_size, + const line_t caller_line) +{ + /* The return value of setlocale() is opaque, but is required to be usable + * as input to a future setlocale() to create the same state. + * Unfortunately not all systems are compliant. But most often they are of + * a very restricted set of forms that this file has been coded to expect. + * + * There are some outliers, though, that this function tries to tame: + * + * 1) A new-line. This function chomps any \n characters + * 2) foo=bar. 'bar' is what is generally meant, and the foo= part is + * stripped. This form is legal for LC_ALL. When found in + * that category group, the function calls itself + * recursively on each possible component category to make + * sure the individual categories are ok. + * + * If no changes to the input were made, it is returned; otherwise the + * changed version is stored into memory at *buf, with *buf_size set to its + * new value, and *buf is returned. + */ -# ifdef DEBUGGING + const char * first_bad; + const char * retval; + + PERL_ARGS_ASSERT_STDIZE_LOCALE; - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale was using %p\n", __FILE__, __LINE__, old_obj); + if (input_locale == NULL) { + return NULL; } -# endif + first_bad = strpbrk(input_locale, "=\n"); - if (! old_obj) { + /* Most likely, there isn't a problem with the input */ + if (LIKELY(! first_bad)) { + return input_locale; + } -# ifdef DEBUGGING +# ifdef LC_ALL - if (DEBUG_L_TEST || debug_initialization) { - dSAVE_ERRNO; - PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale switching to C failed: %d\n", __FILE__, __LINE__, GET_ERRNO); - RESTORE_ERRNO; - } + /* But if there is, and the category is LC_ALL, we have to look at each + * component category */ + if (category == LC_ALL) { + const char * individ_locales[LC_ALL_INDEX_]; + bool made_changes = FALSE; + unsigned int i; -# endif + for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + Size_t this_size = 0; + individ_locales[i] = stdize_locale(categories[i], + posix_setlocale(categories[i], + NULL), + &individ_locales[i], + &this_size, + caller_line); + + /* If the size didn't change, it means this category did not have + * to be adjusted, and individ_locales[i] points to the buffer + * returned by posix_setlocale(); we have to copy that before + * it's called again in the next iteration */ + if (this_size == 0) { + individ_locales[i] = savepv(individ_locales[i]); + } + else { + made_changes = TRUE; + } + } - return NULL; - } + /* If all the individual categories were ok as-is, this was a false + * alarm. We must have seen an '=' which was a legal occurrence in + * this combination locale */ + if (! made_changes) { + retval = input_locale; /* The input can be returned unchanged */ + } + else { + retval = save_to_buffer(querylocale_c(LC_ALL), buf, buf_size); + } -# ifdef DEBUGGING + for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + Safefree(individ_locales[i]); + } - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "%s:%d: emulate_setlocale now using %p\n", - __FILE__, __LINE__, PL_C_locale_obj); + return retval; } -# endif - - /* If this call is to switch to the LC_ALL C locale, it already exists, and - * in fact, we already have switched to it (in preparation for what - * normally is to come). But since we're already there, continue to use - * it instead of trying to create a new locale */ - if (mask == LC_ALL_MASK && isNAME_C_OR_POSIX(locale)) { +# else /* else no LC_ALL */ -# ifdef DEBUGGING + PERL_UNUSED_ARG(category); + PERL_UNUSED_ARG(caller_line); - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "%s:%d: will stay in C object\n", __FILE__, __LINE__); - } +# endif -# endif + /* Here, there was a problem in an individual category. This means that at + * least one adjustment will be necessary. Create a modifiable copy */ + retval = save_to_buffer(input_locale, buf, buf_size); - new_obj = PL_C_locale_obj; + if (*first_bad != '=') { - /* We already had switched to the C locale in preparation for freeing - * 'old_obj' */ - if (old_obj != LC_GLOBAL_LOCALE && old_obj != PL_C_locale_obj) { - freelocale(old_obj); - } + /* Translate the found position into terms of the copy */ + first_bad = retval + (first_bad - input_locale); } - else { - /* If we weren't in a thread safe locale, set so that newlocale() below - * which uses 'old_obj', uses an empty one. Same for our reserved C - * object. The latter is defensive coding, so that, even if there is - * some bug, we will never end up trying to modify either of these, as - * if passed to newlocale(), they can be. */ - if (old_obj == LC_GLOBAL_LOCALE || old_obj == PL_C_locale_obj) { - old_obj = (locale_t) 0; - } + else { /* An '=' */ - /* Ready to create a new locale by modification of the exising one */ - new_obj = newlocale(mask, locale, old_obj); + /* It is unlikely that the return is so screwed-up that it contains + * multiple equals signs, but handle that case by stripping all of + * them. */ + const char * final_equals = strrchr(retval, '='); - if (! new_obj) { - dSAVE_ERRNO; + /* The length passed here causes the move to include the terminating + * NUL */ + Move(final_equals + 1, retval, strlen(final_equals), char); -# ifdef DEBUGGING + /* See if there are additional problems; if not, we're good to return. + * */ + first_bad = strpbrk(retval, "\n"); - if (DEBUG_L_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "%s:%d: emulate_setlocale creating new object" - " failed: %d\n", __FILE__, __LINE__, GET_ERRNO); - } + if (! first_bad) { + return retval; + } + } -# endif + /* Here, the problem must be a \n. Get rid of it and what follows. + * (Originally, only a trailing \n was stripped. Unsure what to do if not + * trailing) */ + *((char *) first_bad) = '\0'; + return retval; +} - if (! uselocale(old_obj)) { +#if defined(WIN32) || ( defined(USE_POSIX_2008_LOCALE) \ + && ! defined(USE_QUERYLOCALE)) -# ifdef DEBUGGING +STATIC const char * +S_find_locale_from_environment(pTHX_ const unsigned int index) +{ + /* NB: This function may actually change the locale on Windows. + * + * On Windows systems, the concept of the POSIX ordering of environment + * variables is missing. To increase portability of programs across + * platforms, the POSIX ordering is emulated on Windows. + * + * And on POSIX 2008 systems without querylocale(), it is problematic + * getting the results of the POSIX 2008 equivalent of + * setlocale(category, "") + * (which gets the locale from the environment). + * + * To ensure that we know exactly what those values are, we do the setting + * ourselves, using the documented algorithm (assuming the documentation is + * correct) rather than use "" as the locale. This will lead to results + * that differ from native behavior if the native behavior differs from the + * standard documented value, but khw believes it is better to know what's + * going on, even if different from native, than to just guess. + * + * Another option for the POSIX 2008 case would be, in a critical section, + * to save the global locale's current value, and do a straight + * setlocale(LC_ALL, ""). That would return our desired values, destroying + * the global locale's, which we would then restore. But that could cause + * races with any other thread that is using the global locale and isn't + * using the mutex. And, the only reason someone would have done that is + * because they are calling a library function, like in gtk, that calls + * setlocale(), and which can't be changed to use the mutex. That wouldn't + * be a problem if this were to be done before any threads had switched, + * say during perl construction time. But this code would still be needed + * for the general case. + * + * The Windows and POSIX 2008 differ in that the ultimate fallback is "C" + * in POSIX, and is the system default locale in Windows. To get that + * system default value, we actually have to call setlocale() on Windows. + */ - if (DEBUG_L_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "%s:%d: switching back failed: %d\n", - __FILE__, __LINE__, GET_ERRNO); - } + /* We rely on PerlEnv_getenv() returning a mortalized copy */ + const char * const lc_all = PerlEnv_getenv("LC_ALL"); -# endif + /* Use any "LC_ALL" environment variable, as it overrides everything + * else. */ + if (lc_all && strNE(lc_all, "")) { + return lc_all; + } - } - RESTORE_ERRNO; - return NULL; - } + /* If setting an individual category, use its corresponding value found in + * the environment, if any */ + if (index != LC_ALL_INDEX_) { + const char * const new_value = PerlEnv_getenv(category_names[index]); -# ifdef DEBUGGING + if (new_value && strNE(new_value, "")) { + return new_value; + } - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "%s:%d: emulate_setlocale created %p", - __FILE__, __LINE__, new_obj); - if (old_obj) { - PerlIO_printf(Perl_debug_log, - "; should have freed %p", old_obj); - } - PerlIO_printf(Perl_debug_log, "\n"); + /* If no corresponding environment variable, see if LANG exists. If + * so, use it. */ + const char * default_name = PerlEnv_getenv("LANG"); + if (default_name && strNE(default_name, "")) { + return default_name; } + /* If no LANG, use "C" on POSIX 2008, the system default on Windows */ +# ifndef WIN32 + return "C"; +# else + return wrap_wsetlocale(categories[index], ""); # endif - /* And switch into it */ - if (! uselocale(new_obj)) { - dSAVE_ERRNO; - -# ifdef DEBUGGING - - if (DEBUG_L_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "%s:%d: emulate_setlocale switching to new object" - " failed\n", __FILE__, __LINE__); - } + } -# endif + /* Here is LC_ALL, and no LC_ALL environment variable. LANG is used as a + * default, but overridden for individual categories that have + * corresponding environment variables. If no LANG exists, the default is + * "C" on POSIX 2008, or the system default for the category on Windows. */ + const char * default_name = PerlEnv_getenv("LANG"); - if (! uselocale(old_obj)) { + /* Convert "" to NULL to save conditionals in the loop below */ + if (default_name != NULL && strEQ(default_name, "")) { + default_name = NULL; + } -# ifdef DEBUGGING + /* Loop through all the individual categories, setting each to any + * corresponding environment variable; or to the default if none exists for + * the category */ + const char * locale_names[LC_ALL_INDEX_]; + for (unsigned i = 0; i < LC_ALL_INDEX_; i++) { + const char * const env_override = PerlEnv_getenv(category_names[i]); - if (DEBUG_L_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "%s:%d: switching back failed: %d\n", - __FILE__, __LINE__, GET_ERRNO); - } + if (env_override && strNE(env_override, "")) { + locale_names[i] = env_override; + } + else if (default_name) { + locale_names[i] = default_name; + } + else { +# ifndef WIN32 + locale_names[i] = "C"; +# else + locale_names[i] = wrap_wsetlocale(categories[index], ""); # endif - } - freelocale(new_obj); - RESTORE_ERRNO; - return NULL; } + + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "find_locale_from_environment i=%d, name=%s, locale=%s\n", + i, category_names[i], locale_names[i])); } -# ifdef DEBUGGING + return calculate_LC_ALL(locale_names); +} - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "%s:%d: emulate_setlocale now using %p\n", - __FILE__, __LINE__, new_obj); - } +#endif +#if defined(WIN32) || defined(USE_POSIX_2008_LOCALE) || ! defined(LC_ALL) +STATIC +const char * + +# ifdef USE_QUERYLOCALE +S_calculate_LC_ALL(pTHX_ const locale_t cur_obj) +# else +S_calculate_LC_ALL(pTHX_ const char ** individ_locales) # endif - /* We are done, except for updating our records (if the system doesn't keep - * them) and in the case of locale "", we don't actually know what the - * locale that got switched to is, as it came from the environment. So - * have to find it */ +{ + /* For POSIX 2008, we have to figure out LC_ALL ourselves when needed. + * querylocale(), on systems that have it, doesn't tend to work for LC_ALL. + * So we have to construct the answer ourselves based on the passed in + * data, which is either a locale_t object, for systems with querylocale(), + * or an array we keep updated to the proper values, otherwise. + * + * For Windows, we also may need to construct an LC_ALL when setting the + * locale to the system default. + * + * This function returns a mortalized string containing the locale name(s) + * of LC_ALL. + * + * If all individual categories are the same locale, we can just set LC_ALL + * to that locale. But if not, we have to create an aggregation of all the + * categories on the system. Platforms differ as to the syntax they use + * for these non-uniform locales for LC_ALL. Some use a '/' or other + * delimiter of the locales with a predetermined order of categories; a + * Configure probe would be needed to tell us how to decipher those. glibc + * and Windows use a series of name=value pairs, like + * LC_NUMERIC=C;LC_TIME=en_US.UTF-8;... + * This function returns that syntax, which is suitable for input to the + * Windows setlocale(). It could also be suitable for glibc, but because + * the non-Windows code is common to systems that use a different syntax, + * we don't depend on it for glibc. Instead we take care not to use the + * native setlocale() function on whatever non-Windows style is chosen. + * But, it would be possible for someone to call Perl_setlocale() using a + * native style we don't understand. So far no one has complained. + * + * For systems that have categories we don't know about, the algorithm + * below won't know about those missing categories, leading to potential + * bugs for code that looks at them. If there is an environment variable + * that sets that category, we won't know to look for it, and so our use of + * LANG or "C" improperly overrides it. On the other hand, if we don't do + * what is done here, and there is no environment variable, the category's + * locale should be set to LANG or "C". So there is no good solution. khw + * thinks the best is to make sure we have a complete list of possible + * categories, adding new ones as they show up on obscure platforms. + */ -# ifdef HAS_QUERYLOCALE + unsigned int i; + Size_t names_len = 0; + bool are_all_categories_the_same_locale = TRUE; + char * aggregate_locale; + char * previous_start = NULL; + char * this_start = NULL; + Size_t entry_len = 0; - if (strEQ(locale, "")) { - locale = querylocale(mask, new_obj); - } + PERL_ARGS_ASSERT_CALCULATE_LC_ALL; -# else + /* First calculate the needed size for the string listing the categories + * and their locales. */ + for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { - /* Here, 'locale' is the return value */ +# ifdef USE_QUERYLOCALE + const char * entry = querylocale_l(i, cur_obj); +# else + const char * entry = individ_locales[i]; +# endif - /* Without querylocale(), we have to update our records */ + names_len += strlen(category_names[i]) + + 1 /* '=' */ + + strlen(entry) + + 1; /* ';' */ + } - if (category == LC_ALL) { - unsigned int i; + names_len++; /* Trailing '\0' */ - /* For LC_ALL, we change all individual categories to correspond */ - /* PL_curlocales is a parallel array, so has same - * length as 'categories' */ - for (i = 0; i <= LC_ALL_INDEX; i++) { - Safefree(PL_curlocales[i]); - PL_curlocales[i] = savepv(locale); - } + /* Allocate enough space for the aggregated string */ + Newxz(aggregate_locale, names_len, char); + SAVEFREEPV(aggregate_locale); - FIX_GLIBC_LC_MESSAGES_BUG(LC_MESSAGES_INDEX); - } - else { + /* Then fill it in */ + for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + Size_t new_len; - /* For a single category, if it's not the same as the one in LC_ALL, we - * nullify LC_ALL */ +# ifdef USE_QUERYLOCALE + const char * entry = querylocale_l(i, cur_obj); +# else + const char * entry = individ_locales[i]; +# endif - if (PL_curlocales[LC_ALL_INDEX] && strNE(PL_curlocales[LC_ALL_INDEX], locale)) { - Safefree(PL_curlocales[LC_ALL_INDEX]); - PL_curlocales[LC_ALL_INDEX] = NULL; + new_len = my_strlcat(aggregate_locale, category_names[i], names_len); + assert(new_len <= names_len); + new_len = my_strlcat(aggregate_locale, "=", names_len); + assert(new_len <= names_len); + + this_start = aggregate_locale + strlen(aggregate_locale); + entry_len = strlen(entry); + + new_len = my_strlcat(aggregate_locale, entry, names_len); + assert(new_len <= names_len); + new_len = my_strlcat(aggregate_locale, ";", names_len); + assert(new_len <= names_len); + PERL_UNUSED_VAR(new_len); /* Only used in DEBUGGING */ + + if ( i > 0 + && are_all_categories_the_same_locale + && memNE(previous_start, this_start, entry_len + 1)) + { + are_all_categories_the_same_locale = FALSE; } + else { + previous_start = this_start; + } + } - /* Then update the category's record */ - Safefree(PL_curlocales[index]); - PL_curlocales[index] = savepv(locale); - - FIX_GLIBC_LC_MESSAGES_BUG(index); + /* If they are all the same, just return any one of them */ + if (are_all_categories_the_same_locale) { + aggregate_locale = this_start; + aggregate_locale[entry_len] = '\0'; } -# endif + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "calculate_LC_ALL returning '%s'\n", + aggregate_locale)); - return locale; + return aggregate_locale; } -#endif /* USE_POSIX_2008_LOCALE */ - -#ifdef USE_LOCALE +#endif +#if defined(USE_LOCALE) && ( defined(DEBUGGING) \ + || defined(USE_PERL_SWITCH_LOCALE_CONTEXT)) -STATIC void -S_set_numeric_radix(pTHX_ const bool use_locale) +STATIC const char * +S_get_LC_ALL_display(pTHX) { - /* If 'use_locale' is FALSE, set to use a dot for the radix character. If - * TRUE, use the radix character derived from the current locale */ -#if defined(USE_LOCALE_NUMERIC) && ( defined(HAS_LOCALECONV) \ - || defined(HAS_NL_LANGINFO)) +# ifdef LC_ALL - const char * radix = (use_locale) - ? my_nl_langinfo(RADIXCHAR, FALSE) - /* FALSE => already in dest locale */ - : "."; - - sv_setpv(PL_numeric_radix_sv, radix); - - /* If this is valid UTF-8 that isn't totally ASCII, and we are in - * a UTF-8 locale, then mark the radix as being in UTF-8 */ - if (is_utf8_non_invariant_string((U8 *) SvPVX(PL_numeric_radix_sv), - SvCUR(PL_numeric_radix_sv)) - && _is_cur_LC_category_utf8(LC_NUMERIC)) - { - SvUTF8_on(PL_numeric_radix_sv); - } + return querylocale_c(LC_ALL); -# ifdef DEBUGGING +# else - if (DEBUG_L_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "Locale radix is '%s', ?UTF-8=%d\n", - SvPVX(PL_numeric_radix_sv), - cBOOL(SvUTF8(PL_numeric_radix_sv))); - } + const char * curlocales[NOMINAL_LC_ALL_INDEX]; -# endif -#else + for (unsigned i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + curlocales[i] = querylocale_i(i); + } - PERL_UNUSED_ARG(use_locale); + return calculate_LC_ALL(curlocales); -#endif /* USE_LOCALE_NUMERIC and can find the radix char */ +# endif } +#endif + STATIC void -S_new_numeric(pTHX_ const char *newnum) +S_setlocale_failure_panic_i(pTHX_ + const unsigned int cat_index, + const char * current, + const char * failed, + const line_t caller_0_line, + const line_t caller_1_line) { + dSAVE_ERRNO; + const int cat = categories[cat_index]; + const char * name = category_names[cat_index]; + + PERL_ARGS_ASSERT_SETLOCALE_FAILURE_PANIC_I; + + if (current == NULL) { + current = querylocale_i(cat_index); + } + + Perl_locale_panic(Perl_form(aTHX_ "(%" LINE_Tf + "): Can't change locale for %s(%d)" + " from '%s' to '%s'", + caller_1_line, name, cat, + current, failed), + __FILE__, caller_0_line, GET_ERRNO); + NOT_REACHED; /* NOTREACHED */ +} -#ifndef USE_LOCALE_NUMERIC - - PERL_UNUSED_ARG(newnum); +/* Any of these will allow us to find the RADIX */ +# if defined(USE_LOCALE_NUMERIC) && ( defined(HAS_SOME_LANGINFO) \ + || defined(HAS_LOCALECONV) \ + || defined(HAS_SNPRINTF)) +# define CAN_CALCULATE_RADIX +# endif +# ifdef USE_LOCALE_NUMERIC -#else +STATIC void +S_new_numeric(pTHX_ const char *newnum, bool force) +{ + PERL_ARGS_ASSERT_NEW_NUMERIC; /* Called after each libc setlocale() call affecting LC_NUMERIC, to tell - * core Perl this and that 'newnum' is the name of the new locale. - * It installs this locale as the current underlying default. + * core Perl this and that 'newnum' is the name of the new locale, and we + * are switched into it. It installs this locale as the current underlying + * default, and then switches to the C locale, if necessary, so that the + * code that has traditionally expected the radix character to be a dot may + * continue to do so. * * The default locale and the C locale can be toggled between by use of the * set_numeric_underlying() and set_numeric_standard() functions, which @@ -1285,8 +1866,8 @@ S_new_numeric(pTHX_ const char *newnum) * SET_NUMERIC_STANDARD() in perl.h. * * The toggling is necessary mainly so that a non-dot radix decimal point - * character can be output, while allowing internal calculations to use a - * dot. + * character can be input and output, while allowing internal calculations + * to use a dot. * * This sets several interpreter-level variables: * PL_numeric_name The underlying locale's name: a copy of 'newnum' @@ -1305,101 +1886,155 @@ S_new_numeric(pTHX_ const char *newnum) * variables are true at the same time. (Toggling is a * no-op under these circumstances.) This variable is * used to avoid having to recalculate. + * PL_numeric_radix_sv Contains the string that code should use for the + * decimal point. It is set to either a dot or the + * program's underlying locale's radix character string, + * depending on the situation. + * PL_underlying_radix_sv Contains the program's underlying locale's radix + * character string. This is copied into + * PL_numeric_radix_sv when the situation warrants. It + * exists to avoid having to recalculate it when toggling. + * PL_underlying_numeric_obj = (only on POSIX 2008 platforms) An object + * with everything set up properly so as to avoid work on + * such platforms. */ - char *save_newnum; + DEBUG_L( PerlIO_printf(Perl_debug_log, + "Called new_numeric with %s, PL_numeric_name=%s\n", + newnum, PL_numeric_name)); + + /* If not forcing this procedure, and there isn't actually a change from + * our records, do nothing. (Our records can be wrong when sync'ing to the + * locale set up by an external library, hence the 'force' parameter) */ + if (! force && strEQ(PL_numeric_name, newnum)) { + return; + } + + Safefree(PL_numeric_name); + PL_numeric_name = savepv(newnum); - if (! newnum) { - Safefree(PL_numeric_name); - PL_numeric_name = NULL; + /* Handle the trivial case. Since this is called at process + * initialization, be aware that this bit can't rely on much being + * available. */ + if (isNAME_C_OR_POSIX(PL_numeric_name)) { PL_numeric_standard = TRUE; - PL_numeric_underlying = TRUE; PL_numeric_underlying_is_standard = TRUE; + PL_numeric_underlying = TRUE; + sv_setpv(PL_numeric_radix_sv, C_decimal_point); + sv_setpv(PL_underlying_radix_sv, C_decimal_point); return; } - save_newnum = stdize_locale(savepv(newnum)); + /* We are in the underlying locale until changed at the end of this + * function */ PL_numeric_underlying = TRUE; - PL_numeric_standard = isNAME_C_OR_POSIX(save_newnum); - -#ifndef TS_W32_BROKEN_LOCALECONV - - /* If its name isn't C nor POSIX, it could still be indistinguishable from - * them. But on broken Windows systems calling my_nl_langinfo() for - * THOUSEP can currently (but rarely) cause a race, so avoid doing that, - * and just always change the locale if not C nor POSIX on those systems */ - if (! PL_numeric_standard) { - PL_numeric_standard = cBOOL(strEQ(".", my_nl_langinfo(RADIXCHAR, - FALSE /* Don't toggle locale */ )) - && strEQ("", my_nl_langinfo(THOUSEP, FALSE))); - } -#endif - - /* Save the new name if it isn't the same as the previous one, if any */ - if (! PL_numeric_name || strNE(PL_numeric_name, save_newnum)) { - Safefree(PL_numeric_name); - PL_numeric_name = save_newnum; - } - else { - Safefree(save_newnum); - } - - PL_numeric_underlying_is_standard = PL_numeric_standard; - -# ifdef HAS_POSIX_2008_LOCALE +# ifdef USE_POSIX_2008_LOCALE + /* We keep a special object for easy switching to. + * + * NOTE: This code may incorrectly show up as a leak under the address + * sanitizer. We do not free this object under normal teardown, however + * you can set PERL_DESTRUCT_LEVEL=2 to cause it to be freed. + */ PL_underlying_numeric_obj = newlocale(LC_NUMERIC_MASK, PL_numeric_name, PL_underlying_numeric_obj); -#endif +# endif - if (DEBUG_L_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "Called new_numeric with %s, PL_numeric_name=%s\n", newnum, PL_numeric_name); + const char * radix = NULL; + utf8ness_t utf8ness = UTF8NESS_IMMATERIAL; + + /* Find and save this locale's radix character. */ + my_langinfo_c(RADIXCHAR, LC_NUMERIC, PL_numeric_name, + &radix, NULL, &utf8ness); + sv_setpv(PL_underlying_radix_sv, radix); + + if (utf8ness == UTF8NESS_YES) { + SvUTF8_on(PL_underlying_radix_sv); } - /* Keep LC_NUMERIC in the C locale. This is for XS modules, so they don't - * have to worry about the radix being a non-dot. (Core operations that - * need the underlying locale change to it temporarily). */ - if (PL_numeric_standard) { - set_numeric_radix(0); + DEBUG_L(PerlIO_printf(Perl_debug_log, + "Locale radix is '%s', ?UTF-8=%d\n", + SvPVX(PL_underlying_radix_sv), + cBOOL(SvUTF8(PL_underlying_radix_sv)))); + + /* This locale is indistinguishable from C (for numeric purposes) if both + * the radix character and the thousands separator are the same as C's. + * Start with the radix. */ + PL_numeric_underlying_is_standard = strEQ(C_decimal_point, radix); + Safefree(radix); + +# ifndef TS_W32_BROKEN_LOCALECONV + + /* If the radix isn't the same as C's, we know it is distinguishable from + * C; otherwise check the thousands separator too. Only if both are the + * same as C's is the locale indistinguishable from C. + * + * But on earlier Windows versions, there is a potential race. This code + * knows that localeconv() (elsewhere in this file) will be used to extract + * the needed value, and localeconv() was buggy for quite a while, and that + * code in this file hence uses a workaround. And that workaround may have + * an (unlikely) race. Gathering the radix uses a different workaround on + * Windows that doesn't involve a race. It might be possible to do the + * same for this (patches welcome). + * + * Until then khw doesn't think it's worth even the small risk of a race to + * get this value, which doesn't appear to be used in any of the Microsoft + * library routines anyway. */ + + const char * scratch_buffer = NULL; + if (PL_numeric_underlying_is_standard) { + PL_numeric_underlying_is_standard = strEQ(C_thousands_sep, + my_langinfo_c(THOUSEP, LC_NUMERIC, + PL_numeric_name, + &scratch_buffer, + NULL, NULL)); } - else { + Safefree(scratch_buffer); + +# else + PERL_UNUSED_VAR(C_thousands_sep); +# endif + + PL_numeric_standard = PL_numeric_underlying_is_standard; + + /* Keep LC_NUMERIC so that it has the C locale radix and thousands + * separator. This is for XS modules, so they don't have to worry about + * the radix being a non-dot. (Core operations that need the underlying + * locale change to it temporarily). */ + if (! PL_numeric_standard) { set_numeric_standard(); } -#endif /* USE_LOCALE_NUMERIC */ - } +# endif + void Perl_set_numeric_standard(pTHX) { -#ifdef USE_LOCALE_NUMERIC - - /* Toggle the LC_NUMERIC locale to C. Most code should use the macros like - * SET_NUMERIC_STANDARD() in perl.h instead of calling this directly. The - * macro avoids calling this routine if toggling isn't necessary according - * to our records (which could be wrong if some XS code has changed the - * locale behind our back) */ - -# ifdef DEBUGGING +# ifdef USE_LOCALE_NUMERIC - if (DEBUG_L_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "Setting LC_NUMERIC locale to standard C\n"); - } + /* Unconditionally toggle the LC_NUMERIC locale to the C locale + * + * Most code should use the macro SET_NUMERIC_STANDARD() in perl.h + * instead of calling this directly. The macro avoids calling this routine + * if toggling isn't necessary according to our records (which could be + * wrong if some XS code has changed the locale behind our back) */ -# endif + DEBUG_L(PerlIO_printf(Perl_debug_log, + "Setting LC_NUMERIC locale to standard C\n")); - do_setlocale_c(LC_NUMERIC, "C"); + void_setlocale_c(LC_NUMERIC, "C"); PL_numeric_standard = TRUE; + sv_setpv(PL_numeric_radix_sv, C_decimal_point); + PL_numeric_underlying = PL_numeric_underlying_is_standard; - set_numeric_radix(0); -#endif /* USE_LOCALE_NUMERIC */ +# endif /* USE_LOCALE_NUMERIC */ } @@ -1407,65 +2042,50 @@ void Perl_set_numeric_underlying(pTHX) { -#ifdef USE_LOCALE_NUMERIC +# ifdef USE_LOCALE_NUMERIC - /* Toggle the LC_NUMERIC locale to the current underlying default. Most - * code should use the macros like SET_NUMERIC_UNDERLYING() in perl.h + /* Unconditionally toggle the LC_NUMERIC locale to the current underlying + * default. + * + * Most code should use the macro SET_NUMERIC_UNDERLYING() in perl.h * instead of calling this directly. The macro avoids calling this routine * if toggling isn't necessary according to our records (which could be * wrong if some XS code has changed the locale behind our back) */ -# ifdef DEBUGGING - - if (DEBUG_L_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "Setting LC_NUMERIC locale to %s\n", - PL_numeric_name); - } + DEBUG_L(PerlIO_printf(Perl_debug_log, "Setting LC_NUMERIC locale to %s\n", + PL_numeric_name)); -# endif + void_setlocale_c(LC_NUMERIC, PL_numeric_name); + PL_numeric_underlying = TRUE; + sv_setsv_nomg(PL_numeric_radix_sv, PL_underlying_radix_sv); - do_setlocale_c(LC_NUMERIC, PL_numeric_name); PL_numeric_standard = PL_numeric_underlying_is_standard; - PL_numeric_underlying = TRUE; - set_numeric_radix(! PL_numeric_standard); -#endif /* USE_LOCALE_NUMERIC */ +# endif /* USE_LOCALE_NUMERIC */ } -/* - * Set up for a new ctype locale. - */ +# ifdef USE_LOCALE_CTYPE + STATIC void -S_new_ctype(pTHX_ const char *newctype) +S_new_ctype(pTHX_ const char *newctype, bool force) { - -#ifndef USE_LOCALE_CTYPE - - PERL_UNUSED_ARG(newctype); - PERL_UNUSED_CONTEXT; - -#else + PERL_ARGS_ASSERT_NEW_CTYPE; + PERL_UNUSED_ARG(force); /* Called after each libc setlocale() call affecting LC_CTYPE, to tell * core Perl this and that 'newctype' is the name of the new locale. * * This function sets up the folding arrays for all 256 bytes, assuming * that tofold() is tolc() since fold case is not a concept in POSIX, - * - * Any code changing the locale (outside this file) should use - * Perl_setlocale or POSIX::setlocale, which call this function. Therefore - * this function should be called directly only from this file and from - * POSIX::setlocale() */ - - unsigned int i; + */ - /* Don't check for problems if we are suppressing the warnings */ - bool check_for_problems = ckWARN_d(WARN_LOCALE) || UNLIKELY(DEBUG_L_TEST); - bool maybe_utf8_turkic = FALSE; + DEBUG_L(PerlIO_printf(Perl_debug_log, "Entering new_ctype(%s)\n", newctype)); - PERL_ARGS_ASSERT_NEW_CTYPE; + /* No change means no-op */ + if (strEQ(PL_ctype_name, newctype)) { + return; + } /* We will replace any bad locale warning with 1) nothing if the new one is * ok; or 2) a new warning for the bad new locale */ @@ -1474,52 +2094,196 @@ S_new_ctype(pTHX_ const char *newctype) PL_warn_locale = NULL; } - PL_in_utf8_CTYPE_locale = _is_cur_LC_category_utf8(LC_CTYPE); + /* Clear cache */ + Safefree(PL_ctype_name); + PL_ctype_name = ""; + + PL_in_utf8_turkic_locale = FALSE; + + /* For the C locale, just use the standard folds, and we know there are no + * glitches possible, so return early. Since this is called at process + * initialization, be aware that this bit can't rely on much being + * available. */ + if (isNAME_C_OR_POSIX(newctype)) { + Copy(PL_fold, PL_fold_locale, 256, U8); + PL_ctype_name = savepv(newctype); + PL_in_utf8_CTYPE_locale = FALSE; + return; + } + + /* The cache being cleared signals this function to compute a new value */ + PL_in_utf8_CTYPE_locale = is_locale_utf8(newctype); + + PL_ctype_name = savepv(newctype); + bool maybe_utf8_turkic = FALSE; + + /* Don't check for problems if we are suppressing the warnings */ + bool check_for_problems = ckWARN_d(WARN_LOCALE) || UNLIKELY(DEBUG_L_TEST); - /* A UTF-8 locale gets standard rules. But note that code still has to - * handle this specially because of the three problematic code points */ if (PL_in_utf8_CTYPE_locale) { + + /* A UTF-8 locale gets standard rules. But note that code still has to + * handle this specially because of the three problematic code points + * */ Copy(PL_fold_latin1, PL_fold_locale, 256, U8); /* UTF-8 locales can have special handling for 'I' and 'i' if they are - * Turkic. Make sure these two are the only anomalies. (We don't use - * towupper and towlower because they aren't in C89.) */ + * Turkic. Make sure these two are the only anomalies. (We don't + * require towupper and towlower because they aren't in C89.) */ -#if defined(HAS_TOWUPPER) && defined (HAS_TOWLOWER) +# if defined(HAS_TOWUPPER) && defined (HAS_TOWLOWER) - if (towupper('i') == 0x130 && towlower('I') == 0x131) { + if (towupper('i') == 0x130 && towlower('I') == 0x131) -#else +# else - if (toupper('i') == 'i' && tolower('I') == 'I') { + if (toU8_UPPER_LC('i') == 'i' && toU8_LOWER_LC('I') == 'I') -#endif +# endif + + { + /* This is how we determine it really is Turkic */ check_for_problems = TRUE; maybe_utf8_turkic = TRUE; } } + else { /* Not a canned locale we know the values for. Compute them */ - /* We don't populate the other lists if a UTF-8 locale, but do check that - * everything works as expected, unless checking turned off */ - if (check_for_problems || ! PL_in_utf8_CTYPE_locale) { - /* Assume enough space for every character being bad. 4 spaces each - * for the 94 printable characters that are output like "'x' "; and 5 +# ifdef DEBUGGING + + bool has_non_ascii_fold = FALSE; + bool found_unexpected = FALSE; + + /* Under -DLv, see if there are any folds outside the ASCII range. + * This factoid is used below */ + if (DEBUG_Lv_TEST) { + for (unsigned i = 128; i < 256; i++) { + int j = LATIN1_TO_NATIVE(i); + if (toU8_LOWER_LC(j) != j || toU8_UPPER_LC(j) != j) { + has_non_ascii_fold = TRUE; + break; + } + } + } + +# endif + + for (unsigned i = 0; i < 256; i++) { + if (isU8_UPPER_LC(i)) + PL_fold_locale[i] = (U8) toU8_LOWER_LC(i); + else if (isU8_LOWER_LC(i)) + PL_fold_locale[i] = (U8) toU8_UPPER_LC(i); + else + PL_fold_locale[i] = (U8) i; + +# ifdef DEBUGGING + + /* Most locales these days are supersets of ASCII. When debugging + * with -DLv, it is helpful to know what the exceptions to that are + * in this locale */ + if (DEBUG_Lv_TEST) { + bool unexpected = FALSE; + + if (isUPPER_L1(i)) { + if (isUPPER_A(i)) { + if (PL_fold_locale[i] != toLOWER_A(i)) { + unexpected = TRUE; + } + } + else if (has_non_ascii_fold) { + if (PL_fold_locale[i] != toLOWER_L1(i)) { + unexpected = TRUE; + } + } + else if (PL_fold_locale[i] != i) { + unexpected = TRUE; + } + } + else if ( isLOWER_L1(i) + && i != LATIN_SMALL_LETTER_SHARP_S + && i != MICRO_SIGN) + { + if (isLOWER_A(i)) { + if (PL_fold_locale[i] != toUPPER_A(i)) { + unexpected = TRUE; + } + } + else if (has_non_ascii_fold) { + if (PL_fold_locale[i] != toUPPER_LATIN1_MOD(i)) { + unexpected = TRUE; + } + } + else if (PL_fold_locale[i] != i) { + unexpected = TRUE; + } + } + else if (PL_fold_locale[i] != i) { + unexpected = TRUE; + } + + if (unexpected) { + found_unexpected = TRUE; + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "For %s, fold of %02x is %02x\n", + newctype, i, PL_fold_locale[i])); + } + } + } + + if (found_unexpected) { + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "All bytes not mentioned above either fold to" + " themselves or are the expected ASCII or" + " Latin1 ones\n")); + } + else { + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "No nonstandard folds were found\n")); +# endif + + } + } + +# ifdef MB_CUR_MAX + + /* We only handle single-byte locales (outside of UTF-8 ones); so if this + * locale requires more than one byte, there are going to be BIG problems. + * */ + + if (MB_CUR_MAX > 1 && ! PL_in_utf8_CTYPE_locale + + /* Some platforms return MB_CUR_MAX > 1 for even the "C" locale. + * Just assume that the implementation for them (plus for POSIX) is + * correct and the > 1 value is spurious. (Since these are + * specially handled to never be considered UTF-8 locales, as long + * as this is the only problem, everything should work fine */ + && ! isNAME_C_OR_POSIX(newctype)) + { + DEBUG_L(PerlIO_printf(Perl_debug_log, + "Unsupported, MB_CUR_MAX=%d\n", (int) MB_CUR_MAX)); + + Perl_ck_warner_d(aTHX_ packWARN(WARN_LOCALE), + "Locale '%s' is unsupported, and may crash the" + " interpreter.\n", + newctype); + } + +# endif + + DEBUG_Lv(PerlIO_printf(Perl_debug_log, "check_for_problems=%d\n", + check_for_problems)); + + /* We don't populate the other lists if a UTF-8 locale, but do check that + * everything works as expected, unless checking turned off */ + if (check_for_problems) { + /* Assume enough space for every character being bad. 4 spaces each + * for the 94 printable characters that are output like "'x' "; and 5 * spaces each for "'\\' ", "'\t' ", and "'\n' "; plus a terminating * NUL */ char bad_chars_list[ (94 * 4) + (3 * 5) + 1 ] = { '\0' }; - bool multi_byte_locale = FALSE; /* Assume is a single-byte locale - to start */ unsigned int bad_count = 0; /* Count of bad characters */ - for (i = 0; i < 256; i++) { - if (! PL_in_utf8_CTYPE_locale) { - if (isupper(i)) - PL_fold_locale[i] = (U8) tolower(i); - else if (islower(i)) - PL_fold_locale[i] = (U8) toupper(i); - else - PL_fold_locale[i] = (U8) i; - } + for (unsigned i = 0; i < 256; i++) { /* If checking for locale problems, see if the native ASCII-range * printables plus \n and \t are in their expected categories in @@ -1530,9 +2294,7 @@ S_new_ctype(pTHX_ const char *newctype) * nowadays. It isn't a problem for most controls to be changed * into something else; we check only \n and \t, though perhaps \r * could be an issue as well. */ - if ( check_for_problems - && (isGRAPH_A(i) || isBLANK_A(i) || i == '\n')) - { + if (isGRAPH_A(i) || isBLANK_A(i) || i == '\n') { bool is_bad = FALSE; char name[4] = { '\0' }; @@ -1553,77 +2315,79 @@ S_new_ctype(pTHX_ const char *newctype) } /* Check each possibe class */ - if (UNLIKELY(cBOOL(isalnum(i)) != cBOOL(isALPHANUMERIC_A(i)))) { + if (UNLIKELY(cBOOL(isU8_ALPHANUMERIC_LC(i)) != + cBOOL(isALPHANUMERIC_A(i)))) + { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, - "isalnum('%s') unexpectedly is %d\n", - name, cBOOL(isalnum(i)))); + "isalnum('%s') unexpectedly is %x\n", + name, cBOOL(isU8_ALPHANUMERIC_LC(i)))); } - if (UNLIKELY(cBOOL(isalpha(i)) != cBOOL(isALPHA_A(i)))) { + if (UNLIKELY(cBOOL(isU8_ALPHA_LC(i)) != cBOOL(isALPHA_A(i)))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, - "isalpha('%s') unexpectedly is %d\n", - name, cBOOL(isalpha(i)))); + "isalpha('%s') unexpectedly is %x\n", + name, cBOOL(isU8_ALPHA_LC(i)))); } - if (UNLIKELY(cBOOL(isdigit(i)) != cBOOL(isDIGIT_A(i)))) { + if (UNLIKELY(cBOOL(isU8_DIGIT_LC(i)) != cBOOL(isDIGIT_A(i)))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, - "isdigit('%s') unexpectedly is %d\n", - name, cBOOL(isdigit(i)))); + "isdigit('%s') unexpectedly is %x\n", + name, cBOOL(isU8_DIGIT_LC(i)))); } - if (UNLIKELY(cBOOL(isgraph(i)) != cBOOL(isGRAPH_A(i)))) { + if (UNLIKELY(cBOOL(isU8_GRAPH_LC(i)) != cBOOL(isGRAPH_A(i)))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, - "isgraph('%s') unexpectedly is %d\n", - name, cBOOL(isgraph(i)))); + "isgraph('%s') unexpectedly is %x\n", + name, cBOOL(isU8_GRAPH_LC(i)))); } - if (UNLIKELY(cBOOL(islower(i)) != cBOOL(isLOWER_A(i)))) { + if (UNLIKELY(cBOOL(isU8_LOWER_LC(i)) != cBOOL(isLOWER_A(i)))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, - "islower('%s') unexpectedly is %d\n", - name, cBOOL(islower(i)))); + "islower('%s') unexpectedly is %x\n", + name, cBOOL(isU8_LOWER_LC(i)))); } - if (UNLIKELY(cBOOL(isprint(i)) != cBOOL(isPRINT_A(i)))) { + if (UNLIKELY(cBOOL(isU8_PRINT_LC(i)) != cBOOL(isPRINT_A(i)))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, - "isprint('%s') unexpectedly is %d\n", - name, cBOOL(isprint(i)))); + "isprint('%s') unexpectedly is %x\n", + name, cBOOL(isU8_PRINT_LC(i)))); } - if (UNLIKELY(cBOOL(ispunct(i)) != cBOOL(isPUNCT_A(i)))) { + if (UNLIKELY(cBOOL(isU8_PUNCT_LC(i)) != cBOOL(isPUNCT_A(i)))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, - "ispunct('%s') unexpectedly is %d\n", - name, cBOOL(ispunct(i)))); + "ispunct('%s') unexpectedly is %x\n", + name, cBOOL(isU8_PUNCT_LC(i)))); } - if (UNLIKELY(cBOOL(isspace(i)) != cBOOL(isSPACE_A(i)))) { + if (UNLIKELY(cBOOL(isU8_SPACE_LC(i)) != cBOOL(isSPACE_A(i)))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, - "isspace('%s') unexpectedly is %d\n", - name, cBOOL(isspace(i)))); + "isspace('%s') unexpectedly is %x\n", + name, cBOOL(isU8_SPACE_LC(i)))); } - if (UNLIKELY(cBOOL(isupper(i)) != cBOOL(isUPPER_A(i)))) { + if (UNLIKELY(cBOOL(isU8_UPPER_LC(i)) != cBOOL(isUPPER_A(i)))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, - "isupper('%s') unexpectedly is %d\n", - name, cBOOL(isupper(i)))); + "isupper('%s') unexpectedly is %x\n", + name, cBOOL(isU8_UPPER_LC(i)))); } - if (UNLIKELY(cBOOL(isxdigit(i))!= cBOOL(isXDIGIT_A(i)))) { + if (UNLIKELY(cBOOL(isU8_XDIGIT_LC(i))!= cBOOL(isXDIGIT_A(i)))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, - "isxdigit('%s') unexpectedly is %d\n", - name, cBOOL(isxdigit(i)))); + "isxdigit('%s') unexpectedly is %x\n", + name, cBOOL(isU8_XDIGIT_LC(i)))); } - if (UNLIKELY(tolower(i) != (int) toLOWER_A(i))) { + if (UNLIKELY(toU8_LOWER_LC(i) != (int) toLOWER_A(i))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, "tolower('%s')=0x%x instead of the expected 0x%x\n", - name, tolower(i), (int) toLOWER_A(i))); + name, toU8_LOWER_LC(i), (int) toLOWER_A(i))); } - if (UNLIKELY(toupper(i) != (int) toUPPER_A(i))) { + if (UNLIKELY(toU8_UPPER_LC(i) != (int) toUPPER_A(i))) { is_bad = TRUE; DEBUG_L(PerlIO_printf(Perl_debug_log, "toupper('%s')=0x%x instead of the expected 0x%x\n", - name, toupper(i), (int) toUPPER_A(i))); + name, toU8_UPPER_LC(i), (int) toUPPER_A(i))); } if (UNLIKELY((i == '\n' && ! isCNTRL_LC(i)))) { is_bad = TRUE; @@ -1645,46 +2409,25 @@ S_new_ctype(pTHX_ const char *newctype) if (bad_count == 2 && maybe_utf8_turkic) { bad_count = 0; *bad_chars_list = '\0'; - PL_fold_locale['I'] = 'I'; - PL_fold_locale['i'] = 'i'; - PL_in_utf8_turkic_locale = TRUE; - DEBUG_L(PerlIO_printf(Perl_debug_log, "%s:%d: %s is turkic\n", - __FILE__, __LINE__, newctype)); - } - else { - PL_in_utf8_turkic_locale = FALSE; - } - -# ifdef MB_CUR_MAX - - /* We only handle single-byte locales (outside of UTF-8 ones; so if - * this locale requires more than one byte, there are going to be - * problems. */ - DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "%s:%d: check_for_problems=%d, MB_CUR_MAX=%d\n", - __FILE__, __LINE__, check_for_problems, (int) MB_CUR_MAX)); - - if ( check_for_problems && MB_CUR_MAX > 1 - && ! PL_in_utf8_CTYPE_locale - /* Some platforms return MB_CUR_MAX > 1 for even the "C" - * locale. Just assume that the implementation for them (plus - * for POSIX) is correct and the > 1 value is spurious. (Since - * these are specially handled to never be considered UTF-8 - * locales, as long as this is the only problem, everything - * should work fine */ - && strNE(newctype, "C") && strNE(newctype, "POSIX")) - { - multi_byte_locale = TRUE; + /* The casts are because otherwise some compilers warn: + gcc.gnu.org/bugzilla/show_bug.cgi?id=99950 + gcc.gnu.org/bugzilla/show_bug.cgi?id=94182 + */ + PL_fold_locale[ (U8) 'I' ] = 'I'; + PL_fold_locale[ (U8) 'i' ] = 'i'; + PL_in_utf8_turkic_locale = TRUE; + DEBUG_L(PerlIO_printf(Perl_debug_log, "%s is turkic\n", newctype)); } -# endif - /* If we found problems and we want them output, do so */ - if ( (UNLIKELY(bad_count) || UNLIKELY(multi_byte_locale)) + if ( (UNLIKELY(bad_count)) && (LIKELY(ckWARN_d(WARN_LOCALE)) || UNLIKELY(DEBUG_L_TEST))) { - if (UNLIKELY(bad_count) && PL_in_utf8_CTYPE_locale) { + /* WARNING. If you change the wording of these; be sure to update + * t/loc_tools.pl correspondingly */ + + if (PL_in_utf8_CTYPE_locale) { PL_warn_locale = Perl_newSVpvf(aTHX_ "Locale '%s' contains (at least) the following characters" " which have\nunexpected meanings: %s\nThe Perl program" @@ -1692,29 +2435,24 @@ S_new_ctype(pTHX_ const char *newctype) newctype, bad_chars_list); } else { - PL_warn_locale = Perl_newSVpvf(aTHX_ - "Locale '%s' may not work well.%s%s%s\n", - newctype, - (multi_byte_locale) - ? " Some characters in it are not recognized by" - " Perl." - : "", - (bad_count) - ? "\nThe following characters (and maybe others)" - " may not have the same meaning as the Perl" - " program expects:\n" - : "", - (bad_count) - ? bad_chars_list - : "" + PL_warn_locale = + Perl_newSVpvf(aTHX_ + "\nThe following characters (and maybe" + " others) may not have the same meaning as" + " the Perl program expects: %s\n", + bad_chars_list ); } -# ifdef HAS_NL_LANGINFO +# ifdef HAS_SOME_LANGINFO + const char * scratch_buffer = NULL; Perl_sv_catpvf(aTHX_ PL_warn_locale, "; codeset=%s", - /* parameter FALSE is a don't care here */ - my_nl_langinfo(CODESET, FALSE)); + my_langinfo_c(CODESET, LC_CTYPE, + newctype, + &scratch_buffer, NULL, + NULL)); + Safefree(scratch_buffer); # endif @@ -1728,7 +2466,8 @@ S_new_ctype(pTHX_ const char *newctype) if (IN_LC(LC_CTYPE) || UNLIKELY(DEBUG_L_TEST)) { /* The '0' below suppresses a bogus gcc compiler warning */ - Perl_warner(aTHX_ packWARN(WARN_LOCALE), SvPVX(PL_warn_locale), 0); + Perl_warner(aTHX_ packWARN(WARN_LOCALE), SvPVX(PL_warn_locale), + 0); if (IN_LC(LC_CTYPE)) { SvREFCNT_dec_NN(PL_warn_locale); @@ -1737,22 +2476,21 @@ S_new_ctype(pTHX_ const char *newctype) } } } - -#endif /* USE_LOCALE_CTYPE */ - } +# endif /* USE_LOCALE_CTYPE */ + void Perl__warn_problematic_locale() { -#ifdef USE_LOCALE_CTYPE +# ifdef USE_LOCALE_CTYPE dTHX; /* Internal-to-core function that outputs the message in PL_warn_locale, * and then NULLS it. Should be called only through the macro - * _CHECK_AND_WARN_PROBLEMATIC_LOCALE */ + * CHECK_AND_WARN_PROBLEMATIC_LOCALE_ */ if (PL_warn_locale) { Perl_ck_warner(aTHX_ packWARN(WARN_LOCALE), @@ -1762,26 +2500,39 @@ Perl__warn_problematic_locale() PL_warn_locale = NULL; } -#endif +# endif } STATIC void -S_new_collate(pTHX_ const char *newcoll) +S_new_LC_ALL(pTHX_ const char *unused, bool force) { + PERL_ARGS_ASSERT_NEW_LC_ALL; + PERL_UNUSED_ARG(unused); -#ifndef USE_LOCALE_COLLATE + /* LC_ALL updates all the things we care about. */ - PERL_UNUSED_ARG(newcoll); - PERL_UNUSED_CONTEXT; + for (unsigned int i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + if (update_functions[i]) { + const char * this_locale = querylocale_i(i); + update_functions[i](aTHX_ this_locale, force); + } + } +} -#else +# ifdef USE_LOCALE_COLLATE + +STATIC void +S_new_collate(pTHX_ const char *newcoll, bool force) +{ + PERL_ARGS_ASSERT_NEW_COLLATE; + PERL_UNUSED_ARG(force); /* Called after each libc setlocale() call affecting LC_COLLATE, to tell * core Perl this and that 'newcoll' is the name of the new locale. * * The design of locale collation is that every locale change is given an - * index 'PL_collation_ix'. The first time a string particpates in an + * index 'PL_collation_ix'. The first time a string participates in an * operation that requires collation while locale collation is active, it * is given PERL_MAGIC_collxfrm magic (via sv_collxfrm_flags()). That * magic includes the collation index, and the transformation of the string @@ -1794,14 +2545,23 @@ S_new_collate(pTHX_ const char *newcoll) * that a transformation would improperly be considered valid, leading to * an unlikely bug */ - if (! newcoll) { - if (PL_collation_name) { - ++PL_collation_ix; - Safefree(PL_collation_name); - PL_collation_name = NULL; - } - PL_collation_standard = TRUE; - is_standard_collation: + /* Return if the locale isn't changing */ + if (strEQ(PL_collation_name, newcoll)) { + return; + } + + Safefree(PL_collation_name); + PL_collation_name = savepv(newcoll); + ++PL_collation_ix; + + /* Set the new one up if trivial. Since this is called at process + * initialization, be aware that this bit can't rely on much being + * available. */ + PL_collation_standard = isNAME_C_OR_POSIX(newcoll); + if (PL_collation_standard) { + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "Setting PL_collation name='%s'\n", + PL_collation_name)); PL_collxfrm_base = 0; PL_collxfrm_mult = 2; PL_in_utf8_COLLATE_locale = FALSE; @@ -1810,240 +2570,105 @@ S_new_collate(pTHX_ const char *newcoll) return; } - /* If this is not the same locale as currently, set the new one up */ - if (! PL_collation_name || strNE(PL_collation_name, newcoll)) { - ++PL_collation_ix; - Safefree(PL_collation_name); - PL_collation_name = stdize_locale(savepv(newcoll)); - PL_collation_standard = isNAME_C_OR_POSIX(newcoll); - if (PL_collation_standard) { - goto is_standard_collation; - } + /* Flag that the remainder of the set up is being deferred until first + * need. */ + PL_collxfrm_mult = 0; + PL_collxfrm_base = 0; - PL_in_utf8_COLLATE_locale = _is_cur_LC_category_utf8(LC_COLLATE); - PL_strxfrm_NUL_replacement = '\0'; - PL_strxfrm_max_cp = 0; +} - /* A locale collation definition includes primary, secondary, tertiary, - * etc. weights for each character. To sort, the primary weights are - * used, and only if they compare equal, then the secondary weights are - * used, and only if they compare equal, then the tertiary, etc. - * - * strxfrm() works by taking the input string, say ABC, and creating an - * output transformed string consisting of first the primary weights, - * A¹B¹C¹ followed by the secondary ones, A²B²C²; and then the - * tertiary, etc, yielding A¹B¹C¹ A²B²C² A³B³C³ .... Some characters - * may not have weights at every level. In our example, let's say B - * doesn't have a tertiary weight, and A doesn't have a secondary - * weight. The constructed string is then going to be - * A¹B¹C¹ B²C² A³C³ .... - * This has the desired effect that strcmp() will look at the secondary - * or tertiary weights only if the strings compare equal at all higher - * priority weights. The spaces shown here, like in - * "A¹B¹C¹ A²B²C² " - * are not just for readability. In the general case, these must - * actually be bytes, which we will call here 'separator weights'; and - * they must be smaller than any other weight value, but since these - * are C strings, only the terminating one can be a NUL (some - * implementations may include a non-NUL separator weight just before - * the NUL). Implementations tend to reserve 01 for the separator - * weights. They are needed so that a shorter string's secondary - * weights won't be misconstrued as primary weights of a longer string, - * etc. By making them smaller than any other weight, the shorter - * string will sort first. (Actually, if all secondary weights are - * smaller than all primary ones, there is no need for a separator - * weight between those two levels, etc.) - * - * The length of the transformed string is roughly a linear function of - * the input string. It's not exactly linear because some characters - * don't have weights at all levels. When we call strxfrm() we have to - * allocate some memory to hold the transformed string. The - * calculations below try to find coefficients 'm' and 'b' for this - * locale so that m*x + b equals how much space we need, given the size - * of the input string in 'x'. If we calculate too small, we increase - * the size as needed, and call strxfrm() again, but it is better to - * get it right the first time to avoid wasted expensive string - * transformations. */ +# endif /* USE_LOCALE_COLLATE */ +#endif /* USE_LOCALE */ - { - /* We use the string below to find how long the tranformation of it - * is. Almost all locales are supersets of ASCII, or at least the - * ASCII letters. We use all of them, half upper half lower, - * because if we used fewer, we might hit just the ones that are - * outliers in a particular locale. Most of the strings being - * collated will contain a preponderance of letters, and even if - * they are above-ASCII, they are likely to have the same number of - * weight levels as the ASCII ones. It turns out that digits tend - * to have fewer levels, and some punctuation has more, but those - * are relatively sparse in text, and khw believes this gives a - * reasonable result, but it could be changed if experience so - * dictates. */ - const char longer[] = "ABCDEFGHIJKLMnopqrstuvwxyz"; - char * x_longer; /* Transformed 'longer' */ - Size_t x_len_longer; /* Length of 'x_longer' */ - - char * x_shorter; /* We also transform a substring of 'longer' */ - Size_t x_len_shorter; - - /* _mem_collxfrm() is used get the transformation (though here we - * are interested only in its length). It is used because it has - * the intelligence to handle all cases, but to work, it needs some - * values of 'm' and 'b' to get it started. For the purposes of - * this calculation we use a very conservative estimate of 'm' and - * 'b'. This assumes a weight can be multiple bytes, enough to - * hold any UV on the platform, and there are 5 levels, 4 weight - * bytes, and a trailing NUL. */ - PL_collxfrm_base = 5; - PL_collxfrm_mult = 5 * sizeof(UV); - - /* Find out how long the transformation really is */ - x_longer = _mem_collxfrm(longer, - sizeof(longer) - 1, - &x_len_longer, - - /* We avoid converting to UTF-8 in the - * called function by telling it the - * string is in UTF-8 if the locale is a - * UTF-8 one. Since the string passed - * here is invariant under UTF-8, we can - * claim it's UTF-8 even though it isn't. - * */ - PL_in_utf8_COLLATE_locale); - Safefree(x_longer); - - /* Find out how long the transformation of a substring of 'longer' - * is. Together the lengths of these transformations are - * sufficient to calculate 'm' and 'b'. The substring is all of - * 'longer' except the first character. This minimizes the chances - * of being swayed by outliers */ - x_shorter = _mem_collxfrm(longer + 1, - sizeof(longer) - 2, - &x_len_shorter, - PL_in_utf8_COLLATE_locale); - Safefree(x_shorter); - - /* If the results are nonsensical for this simple test, the whole - * locale definition is suspect. Mark it so that locale collation - * is not active at all for it. XXX Should we warn? */ - if ( x_len_shorter == 0 - || x_len_longer == 0 - || x_len_shorter >= x_len_longer) - { - PL_collxfrm_mult = 0; - PL_collxfrm_base = 0; - } - else { - SSize_t base; /* Temporary */ +#ifdef WIN32 - /* We have both: m * strlen(longer) + b = x_len_longer - * m * strlen(shorter) + b = x_len_shorter; - * subtracting yields: - * m * (strlen(longer) - strlen(shorter)) - * = x_len_longer - x_len_shorter - * But we have set things up so that 'shorter' is 1 byte smaller - * than 'longer'. Hence: - * m = x_len_longer - x_len_shorter - * - * But if something went wrong, make sure the multiplier is at - * least 1. - */ - if (x_len_longer > x_len_shorter) { - PL_collxfrm_mult = (STRLEN) x_len_longer - x_len_shorter; - } - else { - PL_collxfrm_mult = 1; - } +wchar_t * +S_Win_byte_string_to_wstring(const UINT code_page, const char * byte_string) +{ + /* Caller must arrange to free the returned string */ - /* mx + b = len - * so: b = len - mx - * but in case something has gone wrong, make sure it is - * non-negative */ - base = x_len_longer - PL_collxfrm_mult * (sizeof(longer) - 1); - if (base < 0) { - base = 0; - } + int req_size = MultiByteToWideChar(code_page, 0, byte_string, -1, NULL, 0); + if (! req_size) { + SET_EINVAL; + return NULL; + } - /* Add 1 for the trailing NUL */ - PL_collxfrm_base = base + 1; - } + wchar_t *wstring; + Newx(wstring, req_size, wchar_t); -# ifdef DEBUGGING + if (! MultiByteToWideChar(code_page, 0, byte_string, -1, wstring, req_size)) + { + Safefree(wstring); + SET_EINVAL; + return NULL; + } - if (DEBUG_L_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "%s:%d: ?UTF-8 locale=%d; x_len_shorter=%zu, " - "x_len_longer=%zu," - " collate multipler=%zu, collate base=%zu\n", - __FILE__, __LINE__, - PL_in_utf8_COLLATE_locale, - x_len_shorter, x_len_longer, - PL_collxfrm_mult, PL_collxfrm_base); - } -# endif + return wstring; +} - } - } +#define Win_utf8_string_to_wstring(s) Win_byte_string_to_wstring(CP_UTF8, (s)) -#endif /* USE_LOCALE_COLLATE */ +char * +S_Win_wstring_to_byte_string(const UINT code_page, const wchar_t * wstring) +{ + /* Caller must arrange to free the returned string */ -} + int req_size = + WideCharToMultiByte(code_page, 0, wstring, -1, NULL, 0, NULL, NULL); -#endif + char *byte_string; + Newx(byte_string, req_size, char); -#ifdef WIN32 + if (! WideCharToMultiByte(code_page, 0, wstring, -1, byte_string, + req_size, NULL, NULL)) + { + Safefree(byte_string); + SET_EINVAL; + return NULL; + } -#define USE_WSETLOCALE + return byte_string; +} -#ifdef USE_WSETLOCALE +#define Win_wstring_to_utf8_string(ws) Win_wstring_to_byte_string(CP_UTF8, (ws)) -STATIC char * -S_wrap_wsetlocale(pTHX_ int category, const char *locale) { - wchar_t *wlocale; - wchar_t *wresult; - char *result; +STATIC const char * +S_wrap_wsetlocale(pTHX_ const int category, const char *locale) +{ + PERL_ARGS_ASSERT_WRAP_WSETLOCALE; - if (locale) { - int req_size = - MultiByteToWideChar(CP_UTF8, 0, locale, -1, NULL, 0); + /* Calls _wsetlocale(), converting the parameters/return to/from + * Perl-expected forms as if plain setlocale() were being called instead. + */ - if (!req_size) { - errno = EINVAL; - return NULL; - } + const wchar_t * wlocale = NULL; - Newx(wlocale, req_size, wchar_t); - if (!MultiByteToWideChar(CP_UTF8, 0, locale, -1, wlocale, req_size)) { - Safefree(wlocale); - errno = EINVAL; + if (locale) { + wlocale = Win_utf8_string_to_wstring(locale); + if (! wlocale) { return NULL; } } - else { - wlocale = NULL; - } - wresult = _wsetlocale(category, wlocale); + + WSETLOCALE_LOCK; + const wchar_t * wresult = _wsetlocale(category, wlocale); Safefree(wlocale); - if (wresult) { - int req_size = - WideCharToMultiByte(CP_UTF8, 0, wresult, -1, NULL, 0, NULL, NULL); - Newx(result, req_size, char); - SAVEFREEPV(result); /* is there something better we can do here? */ - if (!WideCharToMultiByte(CP_UTF8, 0, wresult, -1, - result, req_size, NULL, NULL)) { - errno = EINVAL; - return NULL; - } - } - else { - result = NULL; + + if (! wresult) { + WSETLOCALE_UNLOCK; + return NULL; } + const char * result = Win_wstring_to_utf8_string(wresult); + WSETLOCALE_UNLOCK; + + SAVEFREEPV(result); /* is there something better we can do here? Answer: + Without restructuring, returning a unique value each + call is required. See GH #20434 */ return result; } -#endif - -STATIC char * +STATIC const char * S_win32_setlocale(pTHX_ int category, const char* locale) { /* This, for Windows, emulates POSIX setlocale() behavior. There is no @@ -2060,90 +2685,32 @@ S_win32_setlocale(pTHX_ int category, co * use the particular category's variable if set; otherwise to use the LANG * variable. */ - bool override_LC_ALL = FALSE; - char * result; - unsigned int i; - - if (locale && strEQ(locale, "")) { - -# ifdef LC_ALL - - locale = PerlEnv_getenv("LC_ALL"); - if (! locale) { - if (category == LC_ALL) { - override_LC_ALL = TRUE; - } - else { - -# endif - - for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { - if (category == categories[i]) { - locale = PerlEnv_getenv(category_names[i]); - goto found_locale; - } - } - - locale = PerlEnv_getenv("LANG"); - if (! locale) { - locale = ""; - } - - found_locale: ; + if (locale == NULL) { + return wrap_wsetlocale(category, NULL); + } -# ifdef LC_ALL + if (strEQ(locale, "")) { + /* Note this function may change the locale, but that's ok because we + * are about to change it anyway */ + locale = find_locale_from_environment(get_category_index(category, "")); + } - } - } + const char * result = wrap_wsetlocale(category, locale); + DEBUG_L(PerlIO_printf(Perl_debug_log, "%s\n", + setlocale_debug_string_r(category, locale, result))); -# endif +# ifdef USE_PL_CUR_LC_ALL + /* If we need to keep track of LC_ALL, update it to the new value. */ + Safefree(PL_cur_LC_ALL); + if (category == LC_ALL) { + PL_cur_LC_ALL = savepv(result); } - -#ifdef USE_WSETLOCALE - result = S_wrap_wsetlocale(aTHX_ category, locale); -#else - result = setlocale(category, locale); -#endif - DEBUG_L(STMT_START { - dSAVE_ERRNO; - PerlIO_printf(Perl_debug_log, "%s:%d: %s\n", __FILE__, __LINE__, - setlocale_debug_string(category, locale, result)); - RESTORE_ERRNO; - } STMT_END); - - if (! override_LC_ALL) { - return result; - } - - /* Here the input category was LC_ALL, and we have set it to what is in the - * LANG variable or the system default if there is no LANG. But these have - * lower priority than the other LC_foo variables, so override it for each - * one that is set. (If they are set to "", it means to use the same thing - * we just set LC_ALL to, so can skip) */ - - for (i = 0; i < LC_ALL_INDEX; i++) { - result = PerlEnv_getenv(category_names[i]); - if (result && strNE(result, "")) { -#ifdef USE_WSETLOCALE - S_wrap_wsetlocale(aTHX_ categories[i], result); -#else - setlocale(categories[i], result); -#endif - DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s:%d: %s\n", - __FILE__, __LINE__, - setlocale_debug_string(categories[i], result, "not captured"))); - } + else { + PL_cur_LC_ALL = savepv(wrap_wsetlocale(LC_ALL, NULL)); } - result = setlocale(LC_ALL, NULL); - DEBUG_L(STMT_START { - dSAVE_ERRNO; - PerlIO_printf(Perl_debug_log, "%s:%d: %s\n", - __FILE__, __LINE__, - setlocale_debug_string(LC_ALL, NULL, result)); - RESTORE_ERRNO; - } STMT_END); +# endif return result; } @@ -2169,219 +2736,1156 @@ C (presumably because its API was updated; it is illegal to change the information C returns; doing so leads to segfaults.) -Finally, C works under all circumstances, whereas plain -C can be completely ineffective on some platforms under some -configurations. +Finally, C works under all circumstances, whereas plain +C can be completely ineffective on some platforms under some +configurations. + +Changing the locale is not a good idea when more than one thread is running, +except on systems where the predefined variable C<${^SAFE_LOCALES}> is 1. +This is because on such systems the locale is global to the whole process and +not local to just the thread calling the function. So changing it in one +thread instantaneously changes it in all. On some such systems, the system +C is ineffective, returning the wrong information, and failing to +actually change the locale. z/OS refuses to try to change the locale once a +second thread is created. C, should give you accurate results +of what actually happened on these problematic platforms, returning NULL if the +system forbade the locale change. + +The return points to a per-thread static buffer, which is overwritten the next +time C is called from the same thread. + +=cut + +*/ + +#ifndef USE_LOCALE_NUMERIC +# define affects_LC_NUMERIC(cat) 0 +#elif defined(LC_ALL) +# define affects_LC_NUMERIC(cat) (cat == LC_NUMERIC || cat == LC_ALL) +#else +# define affects_LC_NUMERIC(cat) (cat == LC_NUMERIC) +#endif + +const char * +Perl_setlocale(const int category, const char * locale) +{ + /* This wraps POSIX::setlocale() */ + +#ifndef USE_LOCALE + + PERL_UNUSED_ARG(category); + PERL_UNUSED_ARG(locale); + + return "C"; + +#else + + const char * retval; + dTHX; + + DEBUG_L(PerlIO_printf(Perl_debug_log, + "Entering Perl_setlocale(%d, \"%s\")\n", + category, locale)); + + /* A NULL locale means only query what the current one is. */ + if (locale == NULL) { + +# ifndef USE_LOCALE_NUMERIC + + /* Without LC_NUMERIC, it's trivial; we just return the value */ + return save_to_buffer(querylocale_r(category), + &PL_setlocale_buf, &PL_setlocale_bufsize); +# else + + /* We have the LC_NUMERIC name saved, because we are normally switched + * into the C locale (or equivalent) for it. */ + if (category == LC_NUMERIC) { + DEBUG_L(PerlIO_printf(Perl_debug_log, + "Perl_setlocale(LC_NUMERIC, NULL) returning stashed '%s'\n", + PL_numeric_name)); + + /* We don't have to copy this return value, as it is a per-thread + * variable, and won't change until a future setlocale */ + return PL_numeric_name; + } + +# ifndef LC_ALL + + /* Without LC_ALL, just return the value */ + return save_to_buffer(querylocale_r(category), + &PL_setlocale_buf, &PL_setlocale_bufsize); + +# else + + /* Here, LC_ALL is available on this platform. It's the one + * complicating category (because it can contain a toggled LC_NUMERIC + * value), for all the remaining ones (we took care of LC_NUMERIC + * above), just return the value */ + if (category != LC_ALL) { + return save_to_buffer(querylocale_r(category), + &PL_setlocale_buf, &PL_setlocale_bufsize); + } + + bool toggled = FALSE; + + /* For an LC_ALL query, switch back to the underlying numeric locale + * (if we aren't there already) so as to get the correct results. Our + * records for all the other categories are valid without switching */ + if (! PL_numeric_underlying) { + set_numeric_underlying(); + toggled = TRUE; + } + + retval = querylocale_c(LC_ALL); + + if (toggled) { + set_numeric_standard(); + } + + DEBUG_L(PerlIO_printf(Perl_debug_log, "%s\n", + setlocale_debug_string_r(category, locale, retval))); + + return save_to_buffer(retval, &PL_setlocale_buf, &PL_setlocale_bufsize); + +# endif /* Has LC_ALL */ +# endif /* Has LC_NUMERIC */ + + } /* End of querying the current locale */ + + + unsigned int cat_index = get_category_index(category, NULL); + retval = querylocale_i(cat_index); + + /* If the new locale is the same as the current one, nothing is actually + * being changed, so do nothing. */ + if ( strEQ(retval, locale) + && ( ! affects_LC_NUMERIC(category) + +# ifdef USE_LOCALE_NUMERIC + + || strEQ(locale, PL_numeric_name) + +# endif + + )) { + DEBUG_L(PerlIO_printf(Perl_debug_log, + "Already in requested locale: no action taken\n")); + return save_to_buffer(retval, &PL_setlocale_buf, &PL_setlocale_bufsize); + } + + /* Here, an actual change is being requested. Do it */ + retval = setlocale_i(cat_index, locale); + + if (! retval) { + DEBUG_L(PerlIO_printf(Perl_debug_log, "%s\n", + setlocale_debug_string_i(cat_index, locale, "NULL"))); + return NULL; + } + + assert(strNE(retval, "")); + retval = save_to_buffer(retval, &PL_setlocale_buf, &PL_setlocale_bufsize); + + /* Now that have changed locales, we have to update our records to + * correspond. Only certain categories have extra work to update. */ + if (update_functions[cat_index]) { + update_functions[cat_index](aTHX_ retval, false); + } + + DEBUG_L(PerlIO_printf(Perl_debug_log, "returning '%s'\n", retval)); + + return retval; + +#endif + +} + +STATIC utf8ness_t +S_get_locale_string_utf8ness_i(pTHX_ const char * string, + const locale_utf8ness_t known_utf8, + const char * locale, + const unsigned cat_index) +{ + PERL_ARGS_ASSERT_GET_LOCALE_STRING_UTF8NESS_I; + +#ifndef USE_LOCALE + + return UTF8NESS_NO; + PERL_UNUSED_ARG(string); + PERL_UNUSED_ARG(known_utf8); + PERL_UNUSED_ARG(locale); + PERL_UNUSED_ARG(cat_index); + +#else + + assert(cat_index <= NOMINAL_LC_ALL_INDEX); + + /* Return to indicate if 'string' in the locale given by the input + * arguments should be considered UTF-8 or not. + * + * If the input 'locale' is not NULL, use that for the locale; otherwise + * use the current locale for the category specified by 'cat_index'. + */ + + if (string == NULL) { + return UTF8NESS_NO; + } + + if (IN_BYTES) { /* respect 'use bytes' */ + return UTF8NESS_NO; + } + + Size_t len = strlen(string); + + /* UTF8ness is immaterial if the representation doesn't vary */ + const U8 * first_variant = NULL; + if (is_utf8_invariant_string_loc((U8 *) string, len, &first_variant)) { + return UTF8NESS_IMMATERIAL; + } + + /* Can't be UTF-8 if invalid */ + if (! is_utf8_string((U8 *) first_variant, + len - ((char *) first_variant - string))) + { + return UTF8NESS_NO; + } + + /* Here and below, we know the string is legal UTF-8, containing at least + * one character requiring a sequence of two or more bytes. It is quite + * likely to be UTF-8. But it pays to be paranoid and do further checking. + * + * If we already know the UTF-8ness of the locale, then we immediately know + * what the string is */ + if (UNLIKELY(known_utf8 != LOCALE_UTF8NESS_UNKNOWN)) { + if (known_utf8 == LOCALE_IS_UTF8) { + return UTF8NESS_YES; + } + else { + return UTF8NESS_NO; + } + } + +# ifdef HAS_RELIABLE_UTF8NESS_DETERMINATION + + /* Here, we have available the libc functions that can be used to + * accurately determine the UTF8ness of the underlying locale. If it is a + * UTF-8 locale, the string is UTF-8; otherwise it was coincidental that + * the string is legal UTF-8 + * + * However, if the perl is compiled to not pay attention to the category + * being passed in, you might think that that locale is essentially always + * the C locale, so it would make sense to say it isn't UTF-8. But to get + * here, the string has to contain characters unknown in the C locale. And + * in fact, Windows boxes are compiled without LC_MESSAGES, as their + * message catalog isn't really a part of the locale system. But those + * messages really could be UTF-8, and given that the odds are rather small + * of something not being UTF-8 but being syntactically valid UTF-8, khw + * has decided to call such strings as UTF-8. */ + + if (locale == NULL) { + locale = querylocale_i(cat_index); + } + if (is_locale_utf8(locale)) { + return UTF8NESS_YES; + } + + return UTF8NESS_NO; + +# else + + /* Here, we have a valid UTF-8 string containing non-ASCII characters, and + * don't have access to functions to check if the locale is UTF-8 or not. + * Assume that it is. khw tried adding a check that the string is entirely + * in a single Unicode script, but discovered the strftime() timezone is + * user-settable through the environment, which may be in a different + * script than the locale-expected value. */ + PERL_UNUSED_ARG(locale); + PERL_UNUSED_ARG(cat_index); + + return UTF8NESS_YES; + +# endif +#endif + +} + +STATIC bool +S_is_locale_utf8(pTHX_ const char * locale) +{ + /* Returns TRUE if the locale 'locale' is UTF-8; FALSE otherwise. It uses + * my_langinfo(), which employs various methods to get this information + * if nl_langinfo() isn't available, using heuristics as a last resort, in + * which case, the result will very likely be correct for locales for + * languages that have commonly used non-ASCII characters, but for notably + * English, it comes down to if the locale's name ends in something like + * "UTF-8". It errs on the side of not being a UTF-8 locale. */ + +# if ! defined(USE_LOCALE) \ + || ! defined(USE_LOCALE_CTYPE) \ + || defined(EBCDIC) /* There aren't any real UTF-8 locales at this time */ + + PERL_UNUSED_ARG(locale); + + return FALSE; + +# else + + const char * scratch_buffer = NULL; + const char * codeset; + bool retval; + + PERL_ARGS_ASSERT_IS_LOCALE_UTF8; + + if (strEQ(locale, PL_ctype_name)) { + return PL_in_utf8_CTYPE_locale; + } + + codeset = my_langinfo_c(CODESET, LC_CTYPE, locale, + &scratch_buffer, NULL, NULL); + retval = is_codeset_name_UTF8(codeset); + + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "found codeset=%s, is_utf8=%d\n", codeset, retval)); + + Safefree(scratch_buffer); + return retval; + +# endif + +} + +#ifdef USE_LOCALE + +STATIC const char * +S_save_to_buffer(const char * string, const char **buf, Size_t *buf_size) +{ + /* Copy the NUL-terminated 'string' to a buffer whose address before this + * call began at *buf, and whose available length before this call was + * *buf_size. + * + * If the length of 'string' is greater than the space available, the + * buffer is grown accordingly, which may mean that it gets relocated. + * *buf and *buf_size will be updated to reflect this. + * + * Regardless, the function returns a pointer to where 'string' is now + * stored. + * + * 'string' may be NULL, which means no action gets taken, and NULL is + * returned. + * + * If *buf or 'buf_size' are NULL or *buf_size is 0, the buffer is assumed + * empty, and memory is malloc'd. 'buf-size' being NULL is to be used + * when this is a single use buffer, which will shortly be freed by the + * caller. + */ + + Size_t string_size; + + PERL_ARGS_ASSERT_SAVE_TO_BUFFER; + + if (! string) { + return NULL; + } + + /* No-op to copy over oneself */ + if (string == *buf) { + return string; + } + + string_size = strlen(string) + 1; + + if (buf_size == NULL) { + Newx(*buf, string_size, char); + } + else if (*buf_size == 0) { + Newx(*buf, string_size, char); + *buf_size = string_size; + } + else if (string_size > *buf_size) { + Renew(*buf, string_size, char); + *buf_size = string_size; + } + + { + dTHX_DEBUGGING; + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "Copying '%s' to %p\n", + ((is_utf8_string((U8 *) string, 0)) + ? string + :_byte_dump_string((U8 *) string, strlen(string), 0)), + *buf)); + } + +# ifdef DEBUGGING + + /* Catch glitches. Usually this is because LC_CTYPE needs to be the same + * locale as whatever is being worked on */ + if (UNLIKELY(instr(string, REPLACEMENT_CHARACTER_UTF8))) { + dTHX_DEBUGGING; + + locale_panic_(Perl_form(aTHX_ + "Unexpected REPLACEMENT_CHARACTER in '%s'\n%s", + string, get_LC_ALL_display())); + } + +# endif + + Copy(string, *buf, string_size, char); + return *buf; +} + +# ifdef WIN32 + +bool +Perl_get_win32_message_utf8ness(pTHX_ const char * string) +{ + /* NULL => locale irrelevant, 0 => category irrelevant + * so returns based on the UTF-8 legality of the input string, ignoring the + * locale and category completely. + * + * This is because Windows doesn't have LC_MESSAGES */ + return get_locale_string_utf8ness_i(string, LOCALE_IS_UTF8, NULL, 0); +} + +# endif +#endif /* USE_LOCALE */ + + +int +Perl_mbtowc_(pTHX_ const wchar_t * pwc, const char * s, const Size_t len) +{ + +#if ! defined(HAS_MBRTOWC) && ! defined(HAS_MBTOWC) + + PERL_UNUSED_ARG(pwc); + PERL_UNUSED_ARG(s); + PERL_UNUSED_ARG(len); + return -1; + +#else /* Below we have some form of mbtowc() */ +# if defined(HAS_MBRTOWC) \ + && (defined(USE_LOCALE_THREADS) || ! defined(HAS_MBTOWC)) +# define USE_MBRTOWC +# else +# undef USE_MBRTOWC +# endif + + int retval = -1; + + if (s == NULL) { /* Initialize the shift state to all zeros in + PL_mbrtowc_ps. */ + +# if defined(USE_MBRTOWC) + + memzero(&PL_mbrtowc_ps, sizeof(PL_mbrtowc_ps)); + return 0; + +# else + + MBTOWC_LOCK_; + SETERRNO(0, 0); + retval = mbtowc(NULL, NULL, 0); + MBTOWC_UNLOCK_; + return retval; + +# endif + + } + +# if defined(USE_MBRTOWC) + + SETERRNO(0, 0); + retval = (SSize_t) mbrtowc((wchar_t *) pwc, s, len, &PL_mbrtowc_ps); + +# else + + /* Locking prevents races, but locales can be switched out without locking, + * so this isn't a cure all */ + MBTOWC_LOCK_; + SETERRNO(0, 0); + retval = mbtowc((wchar_t *) pwc, s, len); + MBTOWC_UNLOCK_; + +# endif + + return retval; + +#endif + +} + +/* +=for apidoc Perl_localeconv + +This is a thread-safe version of the libc L. It is the same as +L (returning a hash of the C +fields), but directly callable from XS code. + +=cut +*/ + +HV * +Perl_localeconv(pTHX) +{ + +#if ! defined(HAS_LOCALECONV) + + return newHV(); + +#else + + return my_localeconv(0); + +#endif + +} + +#if defined(HAS_LOCALECONV) + +HV * +S_my_localeconv(pTHX_ const int item) +{ + PERL_ARGS_ASSERT_MY_LOCALECONV; + + /* This returns a mortalized hash containing all or one of the elements + * returned by localeconv(). It is used by Perl_localeconv() and + * POSIX::localeconv() and is thread-safe. + * + * There are two use cases: + * 1) Called from POSIX::locale_conv(). This returns the lconv structure + * copied to a hash, based on the current underlying locales for + * LC_NUMERIC and LC_MONETARY. An input item==0 signifies this case, or + * on many platforms it is the only use case compiled. + * 2) Certain items that nl_langinfo() provides are also derivable from + * the return of localeconv(). Windows notably doesn't have + * nl_langinfo(), so on that, and actually any platform lacking it, + * my_localeconv() is used also to emulate it for those particular + * items. The code to do this is compiled only on such platforms. + * Rather than going to the expense of creating a full hash when only + * one item is needed, the returned hash has just the desired item in + * it. + * + * To access all the localeconv() struct lconv fields, there is a data + * structure that contains every commonly documented field in it. (Maybe + * some minority platforms have extra fields. Those could be added here + * without harm; they would just be ignored on platforms lacking them.) + * + * Our structure is compiled to make looping through the fields easier by + * pointing each name to its value's offset within lconv, e.g., + { "thousands_sep", STRUCT_OFFSET(struct lconv, thousands_sep) } + */ +# define LCONV_ENTRY(name) \ + {STRINGIFY(name), STRUCT_OFFSET(struct lconv, name)} + + /* These synonyms are just for clarity, and to make it easier in case + * something needs to change in the future */ +# define LCONV_NUMERIC_ENTRY(name) LCONV_ENTRY(name) +# define LCONV_MONETARY_ENTRY(name) LCONV_ENTRY(name) + + /* There are just a few fields for NUMERIC strings */ + const lconv_offset_t lconv_numeric_strings[] = { +# ifndef NO_LOCALECONV_GROUPING + LCONV_NUMERIC_ENTRY(grouping), +# endif + LCONV_NUMERIC_ENTRY(thousands_sep), + LCONV_NUMERIC_ENTRY(decimal_point), + {NULL, 0} + }; + + /* When used to implement nl_langinfo(), we save time by only populating + * the hash with the field(s) needed. Thus we would need a data structure + * of just: + * LCONV_NUMERIC_ENTRY(decimal_point), + * {NULL, 0} + * + * By placing the decimal_point field last in the full structure, we can + * use just the tail for this bit of it, saving space. This macro yields + * the address of the sub structure. */ +# define DECIMAL_POINT_ADDRESS \ + &lconv_numeric_strings[(C_ARRAY_LENGTH(lconv_numeric_strings) - 2)] + + /* And the MONETARY string fields */ + const lconv_offset_t lconv_monetary_strings[] = { + LCONV_MONETARY_ENTRY(int_curr_symbol), + LCONV_MONETARY_ENTRY(mon_decimal_point), +# ifndef NO_LOCALECONV_MON_THOUSANDS_SEP + LCONV_MONETARY_ENTRY(mon_thousands_sep), +# endif +# ifndef NO_LOCALECONV_MON_GROUPING + LCONV_MONETARY_ENTRY(mon_grouping), +# endif + LCONV_MONETARY_ENTRY(positive_sign), + LCONV_MONETARY_ENTRY(negative_sign), + LCONV_MONETARY_ENTRY(currency_symbol), + {NULL, 0} + }; + + /* Like above, this field being last can be used as a sub structure */ +# define CURRENCY_SYMBOL_ADDRESS \ + &lconv_monetary_strings[(C_ARRAY_LENGTH(lconv_monetary_strings) - 2)] + + /* Finally there are integer fields, all are for monetary purposes */ + const lconv_offset_t lconv_integers[] = { + LCONV_ENTRY(int_frac_digits), + LCONV_ENTRY(frac_digits), + LCONV_ENTRY(p_sep_by_space), + LCONV_ENTRY(n_cs_precedes), + LCONV_ENTRY(n_sep_by_space), + LCONV_ENTRY(p_sign_posn), + LCONV_ENTRY(n_sign_posn), +# ifdef HAS_LC_MONETARY_2008 + LCONV_ENTRY(int_p_cs_precedes), + LCONV_ENTRY(int_p_sep_by_space), + LCONV_ENTRY(int_n_cs_precedes), + LCONV_ENTRY(int_n_sep_by_space), + LCONV_ENTRY(int_p_sign_posn), + LCONV_ENTRY(int_n_sign_posn), +# endif + LCONV_ENTRY(p_cs_precedes), + {NULL, 0} + }; + + /* Like above, this field being last can be used as a sub structure */ +# define P_CS_PRECEDES_ADDRESS \ + &lconv_integers[(C_ARRAY_LENGTH(lconv_integers) - 2)] + + /* If we aren't paying attention to a given category, use LC_CTYPE instead; + * If not paying attention to that either, the code below should end up not + * using this. Make sure that things blow up if that avoidance gets lost, + * by setting the category to -1 */ + unsigned int numeric_index; + unsigned int monetary_index; + +# ifdef USE_LOCALE_NUMERIC + numeric_index = LC_NUMERIC_INDEX_; +# elif defined(USE_LOCALE_CTYPE) + numeric_index = LC_CTYPE_INDEX_; +# else + numeric_index = (unsigned) -1; +# endif +# ifdef USE_LOCALE_MONETARY + monetary_index = LC_MONETARY_INDEX_; +# elif defined(USE_LOCALE_CTYPE) + monetary_index = LC_CTYPE_INDEX_; +# else + monetary_index = (unsigned) -1; +# endif + + /* Some platforms, for correct non-mojibake results, require LC_CTYPE's + * locale to match LC_NUMERIC's for the numeric fields, and LC_MONETARY's + * for the monetary ones. What happens if LC_NUMERIC and LC_MONETARY + * aren't compatible? Wrong results. To avoid that, we call localeconv() + * twice, once for each locale, setting LC_CTYPE to match the category. + * But if the locales of both categories are the same, there is no need for + * a second call. Assume this is the case unless overridden below */ + bool requires_2nd_localeconv = false; + + /* The actual hash populating is done by S_populate_hash_from_localeconv(). + * It gets passed an array of length two containing the data structure it + * is supposed to use to get the key names to fill the hash with. One + * element is alwasy for the NUMERIC strings (or NULL if none to use), and + * the other element similarly for the MONETARY ones. */ +# define NUMERIC_STRING_OFFSET 0 +# define MONETARY_STRING_OFFSET 1 + const lconv_offset_t * strings[2] = { NULL, NULL }; + + /* This is a mask, with one bit to tell S_populate_hash_from_localeconv to + * populate the NUMERIC items; another bit for the MONETARY ones. This way + * it can choose which (or both) to populate from */ + U32 index_bits = 0; + + /* This converts from a locale index to its bit position in the above mask. + * */ +# define INDEX_TO_BIT(i) (1 << (i)) + + /* The two categories can have disparate locales. Initialize them to C and + * override later whichever one(s) we pay attention to */ + const char * numeric_locale = "C"; + const char * monetary_locale = "C"; + + /* This will be either 'numeric_locale' or 'monetary_locale' depending on + * what we are working on at the moment */ + const char * locale; + + /* The LC_MONETARY category also has some integer-valued fields, whose + * information is kept in a separate list */ + const lconv_offset_t * integers; + +# ifdef HAS_SOME_LANGINFO + + /* If the only use-case for this is the full localeconv(), the 'item' + * parameter is ignored. */ + PERL_UNUSED_ARG(item); + +# else + + /* This only gets compiled for the use-case of using localeconv() to + * emulate an nl_langinfo() missing from the platform. + * + * We need this substructure to only return this field for the THOUSEP + * item. The other items also need substructures, but they were handled + * above by placing the substructure's item at the end of the full one, so + * the data structure could do double duty. However, both this and + * RADIXCHAR would need to be in the final position of the same full + * structure; an impossibility. So make this into a separate structure */ + const lconv_offset_t thousands_sep_string[] = { + LCONV_NUMERIC_ENTRY(thousands_sep), + {NULL, 0} + }; + + /* End of all the initialization of datastructures. Now for actual code. + * + * Without nl_langinfo(), the call to my_localeconv() could be for just one + * of the following 3 items to emulate nl_langinfo(). This is compiled + * only when using perl_langinfo.h, which we control, and it has been + * constructed so that no item is numbered 0. + * + * For each, setup the appropriate parameters for the call below to + * S_populate_hash_from_localeconv() */ + if (item != 0) switch (item) { + default: + locale_panic_(Perl_form(aTHX_ + "Unexpected item passed to my_localeconv: %d", item)); + break; + +# ifdef USE_LOCALE_NUMERIC + + case RADIXCHAR: + locale = numeric_locale = PL_numeric_name; + index_bits = INDEX_TO_BIT(LC_NUMERIC_INDEX_); + strings[NUMERIC_STRING_OFFSET] = DECIMAL_POINT_ADDRESS; + integers = NULL; + break; + + case THOUSEP: + index_bits = INDEX_TO_BIT(LC_NUMERIC_INDEX_); + locale = numeric_locale = PL_numeric_name; + strings[NUMERIC_STRING_OFFSET] = thousands_sep_string; + integers = NULL; + break; + +# endif +# ifdef USE_LOCALE_MONETARY + + case CRNCYSTR: + index_bits = INDEX_TO_BIT(LC_MONETARY_INDEX_); + locale = monetary_locale = querylocale_i(LC_MONETARY_INDEX_); + + /* This item needs the values for both the currency symbol, and another + * one used to construct the nl_langino()-compatible return */ + strings[MONETARY_STRING_OFFSET] = CURRENCY_SYMBOL_ADDRESS; + integers = P_CS_PRECEDES_ADDRESS; + break; -C should not be used to change the locale except on systems -where the predefined variable C<${^SAFE_LOCALES}> is 1. On some such systems, -the system C is ineffective, returning the wrong information, and -failing to actually change the locale. C, however works -properly in all circumstances. +# endif -The return points to a per-thread static buffer, which is overwritten the next -time C is called from the same thread. + } /* End of switch() */ -=cut + else /* End of for just one item to emulate nl_langinfo() */ -*/ +# endif -const char * -Perl_setlocale(const int category, const char * locale) -{ - /* This wraps POSIX::setlocale() */ + { /* Here, the call is for all of localeconv(). It has a bunch of + * items. As in the individual item case, set up the parameters for + * S_populate_hash_from_localeconv(); */ -#ifndef USE_LOCALE +# ifdef USE_LOCALE_NUMERIC + numeric_locale = PL_numeric_name; +# elif defined(USE_LOCALE_CTYPE) + numeric_locale = querylocale_i(numeric_index); +# endif +# if defined(USE_LOCALE_MONETARY) || defined(USE_LOCALE_CTYPE) + monetary_locale = querylocale_i(monetary_index); +# endif + + /* The first call to S_populate_hash_from_localeconv() will be for the + * MONETARY values */ + index_bits = INDEX_TO_BIT(monetary_index); + locale = monetary_locale; + + /* And if the locales for the two categories are the same, we can also + * do the NUMERIC values in the same call */ + if (strEQ(numeric_locale, monetary_locale)) { + index_bits |= INDEX_TO_BIT(numeric_index); + } + else { + requires_2nd_localeconv = true; + } - PERL_UNUSED_ARG(category); - PERL_UNUSED_ARG(locale); + /* We always pass both sets of strings. 'index_bits' tells + * S_populate_hash_from_localeconv which to actually look at */ + strings[NUMERIC_STRING_OFFSET] = lconv_numeric_strings; + strings[MONETARY_STRING_OFFSET] = lconv_monetary_strings; + + /* And pass the integer values to populate; again 'index_bits' will + * say to use them or not */ + integers = lconv_integers; + + } /* End of call is for localeconv() */ + + /* The code above has determined the parameters to + S_populate_hash_from_localeconv() for both cases of an individual item + and for the entire structure. Below is code common to both */ + + HV * hv = newHV(); /* The returned hash, initially empty */ + sv_2mortal((SV*)hv); + + /* Call localeconv() and copy its results into the hash. All the + * parameters have been initialized above */ + populate_hash_from_localeconv(hv, + locale, + index_bits, + strings, + integers + ); + + /* The above call may have done all the hash fields, but not always, as + * already explained. If we need a second call it is always for the + * NUMERIC fields */ + if (requires_2nd_localeconv) { + populate_hash_from_localeconv(hv, + numeric_locale, + INDEX_TO_BIT(numeric_index), + strings, + NULL /* There are No NUMERIC integer + fields */ + ); + } - return "C"; + /* Here, the hash has been completely populated. + * + * Now go through all the items and: + * a) For string items, see if they should be marked as UTF-8 or not. + * This would have been more convenient and faster to do while + * populating the hash in the first place, but that operation has to be + * done within a critical section, keeping other threads from + * executing, so only the minimal amount of work necessary is done at + * that time. + * b) For integer items, convert the C CHAR_MAX value into -1. Again, + * this could have been done in the critical section, but was deferred + * to here to keep to the bare minimum amount the time spent owning the + * processor. CHAR_MAX is a C concept for an 8-bit character type. + * Perl has no such type; the closest fit is a -1. + * + * XXX On unthreaded perls, this code could be #ifdef'd out, and the + * corrections determined at hash population time, at an extra maintenance + * cost which khw doesn't think is worth it + */ + for (unsigned int i = 0; i < 2; i++) { /* Try both types of strings */ + if (! strings[i]) { /* Skip if no strings of this type */ + continue; + } -#else + locale = (i == NUMERIC_STRING_OFFSET) + ? numeric_locale + : monetary_locale; - const char * retval; - const char * newlocale; - dSAVEDERRNO; - dTHX; - DECLARATION_FOR_LC_NUMERIC_MANIPULATION; + locale_utf8ness_t locale_is_utf8 = LOCALE_UTF8NESS_UNKNOWN; -#ifdef USE_LOCALE_NUMERIC +# ifdef HAS_RELIABLE_UTF8NESS_DETERMINATION - /* A NULL locale means only query what the current one is. We have the - * LC_NUMERIC name saved, because we are normally switched into the C - * (or equivalent) locale for it. For an LC_ALL query, switch back to get - * the correct results. All other categories don't require special - * handling */ - if (locale == NULL) { - if (category == LC_NUMERIC) { + /* It saves time in the loop below to have predetermined the UTF8ness + * of the locale. But only do so if the platform reliably has this + * information; otherwise to do it, this could recurse indefinitely. + * + * When we don't do it here, it will be done on a per-element basis in + * the loop. The per-element check is intelligent enough to not + * recurse */ - /* We don't have to copy this return value, as it is a per-thread - * variable, and won't change until a future setlocale */ - return PL_numeric_name; + locale_is_utf8 = (is_locale_utf8(locale)) + ? LOCALE_IS_UTF8 + : LOCALE_NOT_UTF8; + + if (locale_is_utf8 == LOCALE_NOT_UTF8) { + continue; /* No string can be UTF-8 if the locale isn't */ } -# ifdef LC_ALL +# endif + + /* Examine each string */ + while (1) { + const char * name = strings[i]->name; + + if (! name) { /* Reached the end */ + break; + } + + /* 'value' will contain the string that may need to be marked as + * UTF-8 */ + SV ** value = hv_fetch(hv, name, strlen(name), true); + if (! value) { + continue; + } - else if (category == LC_ALL) { - STORE_LC_NUMERIC_FORCE_TO_UNDERLYING(); + /* Determine if the string should be marked as UTF-8. */ + if (UTF8NESS_YES == (get_locale_string_utf8ness_i(SvPVX(*value), + locale_is_utf8, + NULL, 0))) + { + SvUTF8_on(*value); + } + + strings[i]++; /* Iterate */ } + } /* End of fixing up UTF8ness */ -# endif - } + /* Examine each integer */ + if (integers) while (1) { + const char * name = integers->name; -#endif + if (! name) { /* Reached the end */ + break; + } - retval = save_to_buffer(do_setlocale_r(category, locale), - &PL_setlocale_buf, &PL_setlocale_bufsize, 0); - SAVE_ERRNO; + SV ** value = hv_fetch(hv, name, strlen(name), true); + if (! value) { + continue; + } -#if defined(USE_LOCALE_NUMERIC) && defined(LC_ALL) + /* Change CHAR_MAX to -1 */ + if (SvIV(*value) == CHAR_MAX) { + sv_setiv(*value, -1); + } - if (locale == NULL && category == LC_ALL) { - RESTORE_LC_NUMERIC(); + integers++; /* Iterate */ } -#endif + return hv; +} - DEBUG_L(PerlIO_printf(Perl_debug_log, - "%s:%d: %s\n", __FILE__, __LINE__, - setlocale_debug_string(category, locale, retval))); +STATIC void +S_populate_hash_from_localeconv(pTHX_ HV * hv, - RESTORE_ERRNO; + /* Switch to this locale to run + * localeconv() from */ + const char * locale, + + /* bit mask of which categories to + * populate */ + const U32 which_mask, + + /* strings[0] points the numeric + * string fields; [1] to the monetary */ + const lconv_offset_t * strings[2], - if (! retval) { - return NULL; - } + /* And to the monetary integer fields */ + const lconv_offset_t * integers) +{ + PERL_ARGS_ASSERT_POPULATE_HASH_FROM_LOCALECONV; + PERL_UNUSED_ARG(which_mask); /* Some configurations don't use this; + complicated to figure out which */ + + /* Run localeconv() and copy some or all of its results to the input 'hv' + * hash. Most localeconv() implementations return the values in a global + * static buffer, so the operation must be performed in a critical section, + * ending only after the copy is completed. There are so many locks + * because localeconv() deals with two categories, and returns in a single + * global static buffer. Some locks might be no-ops on this platform, but + * not others. We need to lock if any one isn't a no-op. */ - /* If locale == NULL, we are just querying the state */ - if (locale == NULL) { - return retval; - } +# ifdef USE_LOCALE_CTYPE - /* Now that have switched locales, we have to update our records to - * correspond. */ + /* Some platforms require LC_CTYPE to be congruent with the category we are + * looking for */ + const char * orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, locale); - switch (category) { +# endif +# ifdef USE_LOCALE_NUMERIC -#ifdef USE_LOCALE_CTYPE + /* We need to toggle to the underlying NUMERIC locale if we are getting + * NUMERIC strings */ + const char * orig_NUMERIC_locale = NULL; + if (which_mask & INDEX_TO_BIT(LC_NUMERIC_INDEX_)) { + LC_NUMERIC_LOCK(0); + orig_NUMERIC_locale = toggle_locale_i(LC_NUMERIC_INDEX_, locale); + } - case LC_CTYPE: - new_ctype(retval); - break; +# endif -#endif -#ifdef USE_LOCALE_COLLATE + /* Finally ready to do the actual localeconv(). Lock to prevent other + * accesses until we have made a copy of its returned static buffer */ + gwLOCALE_LOCK; - case LC_COLLATE: - new_collate(retval); - break; +# ifdef TS_W32_BROKEN_LOCALECONV -#endif -#ifdef USE_LOCALE_NUMERIC + /* This is a workaround for another bug in Windows. localeconv() was + * broken with thread-safe locales prior to VS 15. It looks at the global + * locale instead of the thread one. As a work-around, we toggle to the + * global locale; populate the return; then toggle back. We have to use + * LC_ALL instead of the individual categories because of yet another bug + * in Windows. And this all has to be done in a critical section. + * + * This introduces a potential race with any other thread that has also + * converted to use the global locale, and doesn't protect its locale calls + * with mutexes. khw can't think of any reason for a thread to do so on + * Windows, as the locale API is the same regardless of thread-safety, except + * if the code is ported from working on another platform where there might + * be some reason to do this. But this is typically due to some + * alien-to-Perl library that thinks it owns locale setting. Such a + * library isn't likely to exist on Windows, so such an application is + * unlikely to be run on Windows + */ + bool restore_per_thread = FALSE; - case LC_NUMERIC: - new_numeric(retval); - break; + /* Save the per-thread locale state */ + const char * save_thread = querylocale_c(LC_ALL); -#endif -#ifdef LC_ALL + /* Change to the global locale, and note if we already were there */ + if (_configthreadlocale(_DISABLE_PER_THREAD_LOCALE) + != _DISABLE_PER_THREAD_LOCALE) + { + restore_per_thread = TRUE; + } - case LC_ALL: + /* Save the state of the global locale; then convert to our desired + * state. */ + const char * save_global = querylocale_c(LC_ALL); + void_setlocale_c(LC_ALL, save_thread); - /* LC_ALL updates all the things we care about. The values may not - * be the same as 'retval', as the locale "" may have set things - * individually */ +# endif /* TS_W32_BROKEN_LOCALECONV */ -# ifdef USE_LOCALE_CTYPE + /* Finally, do the actual localeconv */ + const char *lcbuf_as_string = (const char *) localeconv(); - newlocale = savepv(do_setlocale_c(LC_CTYPE, NULL)); - new_ctype(newlocale); - Safefree(newlocale); + /* Fill in the string fields of the HV* */ + for (unsigned int i = 0; i < 2; i++) { -# endif /* USE_LOCALE_CTYPE */ -# ifdef USE_LOCALE_COLLATE +# ifdef USE_LOCALE_NUMERIC - newlocale = savepv(do_setlocale_c(LC_COLLATE, NULL)); - new_collate(newlocale); - Safefree(newlocale); + /* One iteration is only for the numeric string fields */ + if ( i == NUMERIC_STRING_OFFSET + && (which_mask & INDEX_TO_BIT(LC_NUMERIC_INDEX_)) == 0) + { + continue; + } # endif -# ifdef USE_LOCALE_NUMERIC +# ifdef USE_LOCALE_MONETARY - newlocale = savepv(do_setlocale_c(LC_NUMERIC, NULL)); - new_numeric(newlocale); - Safefree(newlocale); + /* The other iteration is only for the monetary string fields */ + if ( i == MONETARY_STRING_OFFSET + && (which_mask & INDEX_TO_BIT(LC_MONETARY_INDEX_)) == 0) + { + continue; + } -# endif /* USE_LOCALE_NUMERIC */ -#endif /* LC_ALL */ +# endif - default: - break; - } + /* For each field for the given category ... */ + const lconv_offset_t * category_strings = strings[i]; + while (1) { + const char * name = category_strings->name; + if (! name) { /* Quit at the end */ + break; + } - return retval; + /* we have set things up so that we know where in the returned + * structure, when viewed as a string, the corresponding value is. + * */ + const char *value = *((const char **)( lcbuf_as_string + + category_strings->offset)); -#endif + /* Set to get next string on next iteration */ + category_strings++; -} + /* Skip if this platform doesn't have this field. */ + if (! value) { + continue; + } -PERL_STATIC_INLINE const char * -S_save_to_buffer(const char * string, char **buf, Size_t *buf_size, const Size_t offset) -{ - /* Copy the NUL-terminated 'string' to 'buf' + 'offset'. 'buf' has size 'buf_size', - * growing it if necessary */ + /* Copy to the hash */ + (void) hv_store(hv, + name, strlen(name), + newSVpv(value, strlen(value)), + 0); + } - Size_t string_size; + /* Add any int fields to the HV* */ + if (i == MONETARY_STRING_OFFSET && integers) { + while (integers->name) { + const char value = *((const char *)( lcbuf_as_string + + integers->offset)); + (void) hv_store(hv, integers->name, + strlen(integers->name), newSViv(value), 0); + integers++; + } + } + } /* End of loop through the fields */ - PERL_ARGS_ASSERT_SAVE_TO_BUFFER; + /* Done with copying to the hash. Can unwind the critical section locks */ - if (! string) { - return NULL; - } +# ifdef TS_W32_BROKEN_LOCALECONV - string_size = strlen(string) + offset + 1; + /* Restore the global locale's prior state */ + void_setlocale_c(LC_ALL, save_global); - if (*buf_size == 0) { - Newx(*buf, string_size, char); - *buf_size = string_size; + /* And back to per-thread locales */ + if (restore_per_thread) { + _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); } - else if (string_size > *buf_size) { - Renew(*buf, string_size, char); - *buf_size = string_size; + + /* Restore the per-thread locale state */ + void_setlocale_c(LC_ALL, save_thread); + +# endif /* TS_W32_BROKEN_LOCALECONV */ + + gwLOCALE_UNLOCK; /* Finished with the critical section of a + globally-accessible buffer */ + +# ifdef USE_LOCALE_NUMERIC + + restore_toggled_locale_i(LC_NUMERIC_INDEX_, orig_NUMERIC_locale); + if (which_mask & INDEX_TO_BIT(LC_NUMERIC_INDEX_)) { + LC_NUMERIC_UNLOCK; } - Copy(string, *buf + offset, string_size - offset, char); - return *buf; +# endif +# ifdef USE_LOCALE_CTYPE + + restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale); + +# endif + } +#endif /* defined(HAS_LOCALECONV) */ +#ifndef HAS_SOME_LANGINFO + +typedef int nl_item; /* Substitute 'int' for emulated nl_langinfo() */ + +#endif + /* -=for apidoc Perl_langinfo +=for apidoc Perl_langinfo +=for apidoc_item Perl_langinfo8 -This is an (almost) drop-in replacement for the system C>, -taking the same C parameter values, and returning the same information. -But it is more thread-safe than regular C, and hides the quirks -of Perl's locale handling from your code, and can be used on systems that lack -a native C. +C is an (almost) drop-in replacement for the system +C>, taking the same C parameter values, and returning +the same information. But it is more thread-safe than regular +C, and hides the quirks of Perl's locale handling from your +code, and can be used on systems that lack a native C. + +However, you should instead use the improved version of this: +L, which behaves identically except for an additional +parameter, a pointer to a variable declared as L>, into which it +returns to you how you should treat the returned string with regards to it +being encoded in UTF-8 or not. -Expanding on these: +Concerning the differences between these and plain C: =over -=item * +=item a. -The reason it isn't quite a drop-in replacement is actually an advantage. The -only difference is that it returns S>, whereas plain -C returns S>, but you are (only by documentation) -forbidden to write into the buffer. By declaring this C, the compiler -enforces this restriction, so if it is violated, you know at compilation time, -rather than getting segfaults at runtime. +C has an extra parameter, described above. Besides this, the +other reason they aren't quite a drop-in replacement is actually an advantage. +The Cness of the return allows the compiler to catch attempts to write +into the returned buffer, which is illegal and could cause run-time crashes. -=item * +=item b. -It delivers the correct results for the C and C items, +They deliver the correct results for the C and C items, without you having to write extra code. The reason for the extra code would be because these are from the C locale category, which is normally kept set by Perl so that the radix is a dot, and the separator is the empty @@ -2393,737 +3897,1094 @@ the other advantages of C, -C, or other locale change. The returned buffer of this function is -not changed until the next call to it, so the buffer is never in a trashed -state. +C, or other locale change. The returned buffer of these functions +is not changed until the next call to one or the other, so the buffer is never +in a trashed state. -=item * +=item d. -Its return buffer is per-thread, so it also is never overwritten by a call to -this function from another thread; unlike the function it replaces. +The return buffer is per-thread, so it also is never overwritten by a call to +these functions from another thread; unlike the function it replaces. -=item * +=item e. -But most importantly, it works on systems that don't have C, such -as Windows, hence makes your code more portable. Of the fifty-some possible +But most importantly, they work on systems that don't have C, such +as Windows, hence making your code more portable. Of the fifty-some possible items specified by the POSIX 2008 standard, L, only one is completely unimplemented, though on non-Windows platforms, another -significant one is also not implemented). It uses various techniques to +significant one is not fully implemented). They use various techniques to recover the other items, including calling C>, and C>, both of which are specified in C89, so should be always be -available. Later C versions have additional capabilities; C<""> is -returned for those not available on your system. +available. Later C versions have additional capabilities; What the +C locale yields or C<""> is returned for any item not available on your system. -It is important to note that when called with an item that is recovered by +It is important to note that, when called with an item that is recovered by using C, the buffer from any previous explicit call to -C will be overwritten. This means you must save that buffer's -contents if you need to access them after a call to this function. (But note -that you might not want to be using C directly anyway, because of -issues like the ones listed in the second item of this list (above) for -C and C. You can use the methods given in L to -call L and avoid all the issues, but then you have a hash to -unpack). +C> will be overwritten. But you shouldn't be using +C anyway because it is is very much not thread-safe, and suffers +from the same problems outlined in item 'b.' above for the fields it returns that +are controlled by the LC_NUMERIC locale category. Instead, avoid all of those +problems by calling L, which is thread-safe; or by using the +methods given in L to call +L|POSIX/localeconv>, which is also thread-safe. + +=back The details for those items which may deviate from what this emulation returns and what a native C would return are specified in L. -=back - -When using C on systems that don't have a native -C, you must +When using C (or plain C) on systems that don't +have a native C, you must #include "perl_langinfo.h" -before the C C<#include>. You can replace your C +before the C C<#include>. You can replace your F C<#include> with this one. (Doing it this way keeps out the symbols that plain -C would try to import into the namespace for code that doesn't need +F would try to import into the namespace for code that doesn't need it.) -The original impetus for C was so that code that needs to -find out the current currency symbol, floating point radix character, or digit -grouping separator can use, on all systems, the simpler and more -thread-friendly C API instead of C> which is a -pain to make thread-friendly. For other fields returned by C, it -is better to use the methods given in L to call -L|POSIX/localeconv>, which is thread-friendly. - =cut */ const char * -#ifdef HAS_NL_LANGINFO Perl_langinfo(const nl_item item) -#else -Perl_langinfo(const int item) -#endif { - return my_nl_langinfo(item, TRUE); + return Perl_langinfo8(item, NULL); } -STATIC const char * -#ifdef HAS_NL_LANGINFO -S_my_nl_langinfo(const nl_item item, bool toggle) -#else -S_my_nl_langinfo(const int item, bool toggle) -#endif +const char * +Perl_langinfo8(const nl_item item, utf8ness_t * utf8ness) { dTHX; - const char * retval; + unsigned cat_index; -#ifdef USE_LOCALE_NUMERIC + PERL_ARGS_ASSERT_PERL_LANGINFO8; - /* We only need to toggle into the underlying LC_NUMERIC locale for these - * two items, and only if not already there */ - if (toggle && (( item != RADIXCHAR && item != THOUSEP) - || PL_numeric_underlying)) + if (utf8ness) { /* Assume for now */ + *utf8ness = UTF8NESS_IMMATERIAL; + } -#endif /* No toggling needed if not using LC_NUMERIC */ + /* Find the locale category that controls the input 'item'. If we are not + * paying attention to that category, instead return a default value. Also + * return the default value if there is no way for us to figure out the + * correct value. If we have some form of nl_langinfo(), we can always + * figure it out, but lacking that, there may be alternative methods that + * can be used to recover most of the possible items. Some of those + * methods need libc functions, which may or may not be available. If + * unavailable, we can't compute the correct value, so must here return the + * default. */ + switch (item) { - toggle = FALSE; + case CODESET: -#if defined(HAS_NL_LANGINFO) /* nl_langinfo() is available. */ -# if ! defined(HAS_THREAD_SAFE_NL_LANGINFO_L) \ - || ! defined(HAS_POSIX_2008_LOCALE) +#ifdef USE_LOCALE_CTYPE - /* Here, use plain nl_langinfo(), switching to the underlying LC_NUMERIC - * for those items dependent on it. This must be copied to a buffer before - * switching back, as some systems destroy the buffer when setlocale() is - * called */ + cat_index = LC_CTYPE_INDEX_; + break; - { - DECLARATION_FOR_LC_NUMERIC_MANIPULATION; +#else + return C_codeset; +#endif +#if defined(USE_LOCALE_MESSAGES) && defined(HAS_SOME_LANGINFO) - if (toggle) { - STORE_LC_NUMERIC_FORCE_TO_UNDERLYING(); - } + case YESEXPR: case YESSTR: case NOEXPR: case NOSTR: + cat_index = LC_MESSAGES_INDEX_; + break; +#else + case YESEXPR: return "^[+1yY]"; + case YESSTR: return "yes"; + case NOEXPR: return "^[-0nN]"; + case NOSTR: return "no"; +#endif - /* Prevent interference from another thread executing this code - * section. */ - NL_LANGINFO_LOCK; + case CRNCYSTR: - /* Copy to a per-thread buffer, which is also one that won't be - * destroyed by a subsequent setlocale(), such as the - * RESTORE_LC_NUMERIC may do just below. */ - retval = save_to_buffer(nl_langinfo(item), - &PL_langinfo_buf, &PL_langinfo_bufsize, 0); - NL_LANGINFO_UNLOCK; +#if defined(USE_LOCALE_MONETARY) \ + && (defined(HAS_SOME_LANGINFO) || defined(HAS_LOCALECONV)) - if (toggle) { - RESTORE_LC_NUMERIC(); - } + cat_index = LC_MONETARY_INDEX_; + break; +#else + return "-"; +#endif + + case RADIXCHAR: + +#ifdef CAN_CALCULATE_RADIX + + cat_index = LC_NUMERIC_INDEX_; + break; +#else + return C_decimal_point; +#endif + + case THOUSEP: + +#if defined(USE_LOCALE_NUMERIC) \ + && (defined(HAS_SOME_LANGINFO) || defined(HAS_LOCALECONV)) + + cat_index = LC_NUMERIC_INDEX_; + break; +#else + return C_thousands_sep; +#endif + +/* The other possible items are all in LC_TIME. */ +#ifdef USE_LOCALE_TIME + + default: + cat_index = LC_TIME_INDEX_; + break; + +#endif +#if ! defined(USE_LOCALE_TIME) || ! defined(HAS_SOME_LANGINFO) + + /* If not using LC_TIME, hard code the rest. Or, if there is no + * nl_langinfo(), we use strftime() as an alternative, and it is missing + * functionality to get every single one, so hard-code those */ + + case ERA: return ""; /* Unimplemented; for use with strftime() %E + modifier */ + + /* These formats are defined by C89, so we assume that strftime supports + * them, and so are returned unconditionally; they may not be what the + * locale actually says, but should give good enough results for someone + * using them as formats (as opposed to trying to parse them to figure + * out what the locale says). The other format items are actually tested + * to verify they work on the platform */ + case D_FMT: return "%x"; + case T_FMT: return "%X"; + case D_T_FMT: return "%c"; + +# if defined(WIN32) || ! defined(USE_LOCALE_TIME) + + /* strftime() on Windows doesn't have the POSIX (beyond C89) extensions + * that would allow it to recover these */ + case ERA_D_FMT: return "%x"; + case ERA_T_FMT: return "%X"; + case ERA_D_T_FMT: return "%c"; + case ALT_DIGITS: return "0"; + +# endif +# ifndef USE_LOCALE_TIME + + case T_FMT_AMPM: return "%r"; + case ABDAY_1: return "Sun"; + case ABDAY_2: return "Mon"; + case ABDAY_3: return "Tue"; + case ABDAY_4: return "Wed"; + case ABDAY_5: return "Thu"; + case ABDAY_6: return "Fri"; + case ABDAY_7: return "Sat"; + case AM_STR: return "AM"; + case PM_STR: return "PM"; + case ABMON_1: return "Jan"; + case ABMON_2: return "Feb"; + case ABMON_3: return "Mar"; + case ABMON_4: return "Apr"; + case ABMON_5: return "May"; + case ABMON_6: return "Jun"; + case ABMON_7: return "Jul"; + case ABMON_8: return "Aug"; + case ABMON_9: return "Sep"; + case ABMON_10: return "Oct"; + case ABMON_11: return "Nov"; + case ABMON_12: return "Dec"; + case DAY_1: return "Sunday"; + case DAY_2: return "Monday"; + case DAY_3: return "Tuesday"; + case DAY_4: return "Wednesday"; + case DAY_5: return "Thursday"; + case DAY_6: return "Friday"; + case DAY_7: return "Saturday"; + case MON_1: return "January"; + case MON_2: return "February"; + case MON_3: return "March"; + case MON_4: return "April"; + case MON_5: return "May"; + case MON_6: return "June"; + case MON_7: return "July"; + case MON_8: return "August"; + case MON_9: return "September"; + case MON_10: return "October"; + case MON_11: return "November"; + case MON_12: return "December"; + +# endif +#endif + + } /* End of switch on item */ + +#ifndef USE_LOCALE + + Perl_croak_nocontext("panic: Unexpected nl_langinfo() item %d", item); + NOT_REACHED; /* NOTREACHED */ + PERL_UNUSED_VAR(cat_index); + +#else +# ifdef USE_LOCALE_NUMERIC + + /* Use either the underlying numeric, or the other underlying categories */ + if (cat_index == LC_NUMERIC_INDEX_) { + return my_langinfo_c(item, LC_NUMERIC, PL_numeric_name, + &PL_langinfo_buf, &PL_langinfo_bufsize, utf8ness); } + else -# else /* Use nl_langinfo_l(), avoiding both a mutex and changing the locale */ +# endif { - bool do_free = FALSE; - locale_t cur = uselocale((locale_t) 0); + return my_langinfo_i(item, cat_index, querylocale_i(cat_index), + &PL_langinfo_buf, &PL_langinfo_bufsize, utf8ness); + } - if (cur == LC_GLOBAL_LOCALE) { - cur = duplocale(LC_GLOBAL_LOCALE); - do_free = TRUE; - } +#endif -# ifdef USE_LOCALE_NUMERIC +} - if (toggle) { - if (PL_underlying_numeric_obj) { - cur = PL_underlying_numeric_obj; - } - else { - cur = newlocale(LC_NUMERIC_MASK, PL_numeric_name, cur); - do_free = TRUE; - } - } +#ifdef USE_LOCALE + +/* There are several implementations of my_langinfo, depending on the + * Configuration. They all share the same beginning of the function */ +STATIC const char * +S_my_langinfo_i(pTHX_ + const nl_item item, /* The item to look up */ + const unsigned int cat_index, /* The locale category that + controls it */ + /* The locale to look up 'item' in. */ + const char * locale, + + /* Where to store the result, and where the size of that buffer + * is stored, updated on exit. retbuf_sizep may be NULL for an + * empty-on-entry, single use buffer whose size we don't need + * to keep track of */ + const char ** retbufp, + Size_t * retbuf_sizep, + + /* If not NULL, the location to store the UTF8-ness of 'item's + * value, as documented */ + utf8ness_t * utf8ness) +{ + const char * retval = NULL; + + PERL_ARGS_ASSERT_MY_LANGINFO_I; + assert(cat_index < NOMINAL_LC_ALL_INDEX); + + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "Entering my_langinfo item=%ld, using locale %s\n", + (long) item, locale)); +/*--------------------------------------------------------------------------*/ +/* Above is the common beginning to all the implementations of my_langinfo(). + * Below are the various completions. + * + * Some platforms don't deal well with non-ASCII strings in locale X when + * LC_CTYPE is not in X. (Actually it is probably when X is UTF-8 and LC_CTYPE + * isn't, or vice versa). There is explicit code to bring the categories into + * sync. This doesn't seem to be a problem with nl_langinfo(), so that + * implementation doesn't currently worry about it. But it is a problem on + * Windows boxes, which don't have nl_langinfo(). */ + +/*--------------------------------------------------------------------------*/ +# if defined(HAS_NL_LANGINFO) /* nl_langinfo() is available. */ +# ifdef USE_LOCALE_CTYPE + + /* Ths function sorts out if things actually have to be switched or not, + * for both calls. */ + const char * orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, locale); # endif - /* We have to save it to a buffer, because the freelocale() just below - * can invalidate the internal one */ - retval = save_to_buffer(nl_langinfo_l(item, cur), - &PL_langinfo_buf, &PL_langinfo_bufsize, 0); + const char * orig_switched_locale = toggle_locale_i(cat_index, locale); - if (do_free) { - freelocale(cur); - } + gwLOCALE_LOCK; + retval = save_to_buffer(nl_langinfo(item), retbufp, retbuf_sizep); + gwLOCALE_UNLOCK; + + if (utf8ness) { + *utf8ness = get_locale_string_utf8ness_i(retval, + LOCALE_UTF8NESS_UNKNOWN, + locale, cat_index); } -# endif + restore_toggled_locale_i(cat_index, orig_switched_locale); - if (strEQ(retval, "")) { - if (item == YESSTR) { - return "yes"; - } - if (item == NOSTR) { - return "no"; - } - } +# ifdef USE_LOCALE_CTYPE + restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale); +# endif return retval; +/*--------------------------------------------------------------------------*/ +# else /* Below, emulate nl_langinfo as best we can */ -#else /* Below, emulate nl_langinfo as best we can */ + /* And the third and final completion is where we have to emulate + * nl_langinfo(). There are various possibilities depending on the + * Configuration */ - { +# ifdef USE_LOCALE_CTYPE -# ifdef HAS_LOCALECONV + const char * orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, locale); - const struct lconv* lc; - const char * temp; - DECLARATION_FOR_LC_NUMERIC_MANIPULATION; +# endif -# ifdef TS_W32_BROKEN_LOCALECONV + const char * orig_switched_locale = toggle_locale_i(cat_index, locale); - const char * save_global; - const char * save_thread; - int needed_size; - char * ptr; - char * e; - char * item_start; + /* Here, we are in the locale we want information about */ -# endif -# endif -# ifdef HAS_STRFTIME + /* Almost all the items will have ASCII return values. Set that here, and + * override if necessary */ + utf8ness_t is_utf8 = UTF8NESS_IMMATERIAL; - struct tm tm; - bool return_format = FALSE; /* Return the %format, not the value */ - const char * format; + switch (item) { + default: + assert(item < 0); /* Make sure using perl_langinfo.h */ + retval = ""; + break; -# endif + case RADIXCHAR: + +# if defined(HAS_SNPRINTF) \ + && (! defined(HAS_LOCALECONV) || defined(TS_W32_BROKEN_LOCALECONV)) + + { + /* snprintf() can be used to find the radix character by outputting + * a known simple floating point number to a buffer, and parsing + * it, inferring the radix as the bytes separating the integer and + * fractional parts. But localeconv() is more direct, not + * requiring inference, so use it instead of the code just below, + * if (likely) it is available and works ok */ + + char * floatbuf = NULL; + const Size_t initial_size = 10; + + Newx(floatbuf, initial_size, char); + + /* 1.5 is exactly representable on binary computers */ + Size_t needed_size = snprintf(floatbuf, initial_size, "%.1f", 1.5); - /* We copy the results to a per-thread buffer, even if not - * multi-threaded. This is in part to simplify this code, and partly - * because we need a buffer anyway for strftime(), and partly because a - * call of localeconv() could otherwise wipe out the buffer, and the - * programmer would not be expecting this, as this is a nl_langinfo() - * substitute after all, so s/he might be thinking their localeconv() - * is safe until another localeconv() call. */ + /* If our guess wasn't big enough, increase and try again, based on + * the real number that snprintf() is supposed to return */ + if (UNLIKELY(needed_size >= initial_size)) { + needed_size++; /* insurance */ + Renew(floatbuf, needed_size, char); + Size_t new_needed = snprintf(floatbuf, needed_size, "%.1f", 1.5); + assert(new_needed <= needed_size); + needed_size = new_needed; + } + + char * s = floatbuf; + char * e = floatbuf + needed_size; + + /* Find the '1' */ + while (s < e && *s != '1') { + s++; + } + + if (LIKELY(s < e)) { + s++; + } + + /* Find the '5' */ + char * item_start = s; + while (s < e && *s != '5') { + s++; + } + + /* Everything in between is the radix string */ + if (LIKELY(s < e)) { + *s = '\0'; + retval = save_to_buffer(item_start, retbufp, retbuf_sizep); + Safefree(floatbuf); + + if (utf8ness) { + is_utf8 = get_locale_string_utf8ness_i(retval, + LOCALE_UTF8NESS_UNKNOWN, + locale, cat_index); + } + + break; + } + + Safefree(floatbuf); + } - switch (item) { - Size_t len; +# ifdef HAS_LOCALECONV /* snprintf() failed; drop down to use + localeconv() */ - /* This is unimplemented */ - case ERA: /* For use with strftime() %E modifier */ + /* FALLTHROUGH */ + +# else /* snprintf() failed and no localeconv() */ + + retval = C_decimal_point; + break; + +# endif +# endif +# ifdef HAS_LOCALECONV + + /* These items are available from localeconv(). (To avoid using + * TS_W32_BROKEN_LOCALECONV, one could use GetNumberFormat and + * GetCurrencyFormat; patches welcome) */ + +# define P_CS_PRECEDES "p_cs_precedes" +# define CURRENCY_SYMBOL "currency_symbol" + + /* case RADIXCHAR: // May drop down to here in some configurations */ + case THOUSEP: + case CRNCYSTR: + { + + /* The hash gets populated with just the field(s) related to 'item'. */ + HV * result_hv = my_localeconv(item); + + SV* string; + if (item != CRNCYSTR) { + + /* These items have been populated with just one key => value */ + (void) hv_iterinit(result_hv); + HE * entry = hv_iternext(result_hv); + string = hv_iterval(result_hv, entry); + } + else { + + /* But CRNCYSTR localeconv() returns a slightly different value + * than the nl_langinfo() API calls for, so have to modify this one + * to conform. We need another value from localeconv() to know + * what to change it to. my_localeconv() has populated the hash + * with exactly both fields. Delete this one, leaving just the + * CRNCYSTR one in the hash */ + SV* precedes = hv_delete(result_hv, + P_CS_PRECEDES, STRLENs(P_CS_PRECEDES), + 0); + if (! precedes) { + locale_panic_("my_localeconv() unexpectedly didn't return" + " a value for " P_CS_PRECEDES); + } + + /* The modification is to prefix the localeconv() return with a + * single byte, calculated as follows: */ + char prefix = (LIKELY(SvIV(precedes) != -1)) + ? ((precedes != 0) ? '-' : '+') + + /* khw couldn't find any documentation that + * CHAR_MAX (which we modify to -1) is the signal, + * but cygwin uses it thusly, and it makes sense + * given that CHAR_MAX indicates the value isn't + * used, so it neither precedes nor succeeds */ + : '.'; + + /* Now get CRNCYSTR */ + (void) hv_iterinit(result_hv); + HE * entry = hv_iternext(result_hv); + string = hv_iterval(result_hv, entry); + + /* And perform the modification */ + Perl_sv_setpvf(aTHX_ string, "%c%s", prefix, SvPV_nolen(string)); + } + + /* Here, 'string' contains the value we want to return */ + retval = save_to_buffer(SvPV_nolen(string), retbufp, retbuf_sizep); + + if (utf8ness) { + is_utf8 = (SvUTF8(string)) + ? UTF8NESS_YES + : (is_utf8_invariant_string( (U8 *) retval, + strlen(retval))) + ? UTF8NESS_IMMATERIAL + : UTF8NESS_NO; + } + + break; + + } + +# endif /* Some form of localeconv */ +# ifdef HAS_STRFTIME + + /* These formats are only available in later strftime's */ + case ERA_D_FMT: case ERA_T_FMT: case ERA_D_T_FMT: case T_FMT_AMPM: + + /* The rest can be gotten from most versions of strftime(). */ + case ABDAY_1: case ABDAY_2: case ABDAY_3: + case ABDAY_4: case ABDAY_5: case ABDAY_6: case ABDAY_7: + case ALT_DIGITS: + case AM_STR: case PM_STR: + case ABMON_1: case ABMON_2: case ABMON_3: case ABMON_4: + case ABMON_5: case ABMON_6: case ABMON_7: case ABMON_8: + case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12: + case DAY_1: case DAY_2: case DAY_3: case DAY_4: + case DAY_5: case DAY_6: case DAY_7: + case MON_1: case MON_2: case MON_3: case MON_4: + case MON_5: case MON_6: case MON_7: case MON_8: + case MON_9: case MON_10: case MON_11: case MON_12: + { + const char * format; + bool return_format = FALSE; + int mon = 0; + int mday = 1; + int hour = 6; + + GCC_DIAG_IGNORE_STMT(-Wimplicit-fallthrough); + + switch (item) { + default: + locale_panic_(Perl_form(aTHX_ "switch case: %d problem", item)); + NOT_REACHED; /* NOTREACHED */ + + case PM_STR: hour = 18; + case AM_STR: + format = "%p"; + break; + case ABDAY_7: mday++; + case ABDAY_6: mday++; + case ABDAY_5: mday++; + case ABDAY_4: mday++; + case ABDAY_3: mday++; + case ABDAY_2: mday++; + case ABDAY_1: + format = "%a"; + break; + case DAY_7: mday++; + case DAY_6: mday++; + case DAY_5: mday++; + case DAY_4: mday++; + case DAY_3: mday++; + case DAY_2: mday++; + case DAY_1: + format = "%A"; + break; + case ABMON_12: mon++; + case ABMON_11: mon++; + case ABMON_10: mon++; + case ABMON_9: mon++; + case ABMON_8: mon++; + case ABMON_7: mon++; + case ABMON_6: mon++; + case ABMON_5: mon++; + case ABMON_4: mon++; + case ABMON_3: mon++; + case ABMON_2: mon++; + case ABMON_1: + format = "%b"; + break; + case MON_12: mon++; + case MON_11: mon++; + case MON_10: mon++; + case MON_9: mon++; + case MON_8: mon++; + case MON_7: mon++; + case MON_6: mon++; + case MON_5: mon++; + case MON_4: mon++; + case MON_3: mon++; + case MON_2: mon++; + case MON_1: + format = "%B"; + break; + case T_FMT_AMPM: + format = "%r"; + return_format = TRUE; + break; + case ERA_D_FMT: + format = "%Ex"; + return_format = TRUE; + break; + case ERA_T_FMT: + format = "%EX"; + return_format = TRUE; + break; + case ERA_D_T_FMT: + format = "%Ec"; + return_format = TRUE; + break; + case ALT_DIGITS: + format = "%Ow"; /* Find the alternate digit for 0 */ + break; + } - default: - return ""; + GCC_DIAG_RESTORE_STMT; - /* We use only an English set, since we don't know any more */ - case YESEXPR: return "^[+1yY]"; - case YESSTR: return "yes"; - case NOEXPR: return "^[-0nN]"; - case NOSTR: return "no"; + /* The year was deliberately chosen so that January 1 is on the + * first day of the week. Since we're only getting one thing at a + * time, it all works */ + const char * temp = my_strftime8_temp(format, 30, 30, hour, mday, mon, + 2011, 0, 0, 0, &is_utf8); + retval = save_to_buffer(temp, retbufp, retbuf_sizep); + Safefree(temp); + + /* If the item is 'ALT_DIGITS', '*retbuf' contains the alternate + * format for wday 0. If the value is the same as the normal 0, + * there isn't an alternate, so clear the buffer. + * + * (wday was chosen because its range is all a single digit. + * Things like tm_sec have two digits as the minimum: '00'.) */ + if (item == ALT_DIGITS && strEQ(*retbufp, "0")) { + retval = ""; + break; + } - case CODESET: + /* ALT_DIGITS is problematic. Experiments on it showed that + * strftime() did not always work properly when going from alt-9 to + * alt-10. Only a few locales have this item defined, and in all + * of them on Linux that khw was able to find, nl_langinfo() merely + * returned the alt-0 character, possibly doubled. Most Unicode + * digits are in blocks of 10 consecutive code points, so that is + * sufficient information for such scripts, as we can infer alt-1, + * alt-2, .... But for a Japanese locale, a CJK ideographic 0 is + * returned, and the CJK digits are not in code point order, so you + * can't really infer anything. The localedef for this locale did + * specify the succeeding digits, so that strftime() works properly + * on them, without needing to infer anything. But the + * nl_langinfo() return did not give sufficient information for the + * caller to understand what's going on. So until there is + * evidence that it should work differently, this returns the alt-0 + * string for ALT_DIGITS. */ -# ifndef WIN32 + if (return_format) { - /* On non-windows, this is unimplemented, in part because of - * inconsistencies between vendors. The Darwin native - * nl_langinfo() implementation simply looks at everything past - * any dot in the name, but that doesn't work for other - * vendors. Many Linux locales that don't have UTF-8 in their - * names really are UTF-8, for example; z/OS locales that do - * have UTF-8 in their names, aren't really UTF-8 */ - return ""; + /* If to return the format, not the value, overwrite the buffer + * with it. But some strftime()s will keep the original format + * if illegal, so change those to "" */ + if (strEQ(*retbufp, format)) { + retval = ""; + } + else { + retval = format; + } -# else + /* A format is always in ASCII */ + is_utf8 = UTF8NESS_IMMATERIAL; + } - { /* But on Windows, the name does seem to be consistent, so - use that. */ - const char * p; - const char * first; - Size_t offset = 0; - const char * name = my_setlocale(LC_CTYPE, NULL); + break; + } - if (isNAME_C_OR_POSIX(name)) { - return "ANSI_X3.4-1968"; - } +# endif - /* Find the dot in the locale name */ - first = (const char *) strchr(name, '.'); - if (! first) { - first = name; - goto has_nondigit; - } + case CODESET: - /* Look at everything past the dot */ - first++; - p = first; - - while (*p) { - if (! isDIGIT(*p)) { - goto has_nondigit; - } + /* The trivial case */ + if (isNAME_C_OR_POSIX(locale)) { + retval = C_codeset; + break; + } - p++; - } +# ifdef WIN32 - /* Here everything past the dot is a digit. Treat it as a - * code page */ - retval = save_to_buffer("CP", &PL_langinfo_buf, - &PL_langinfo_bufsize, 0); - offset = STRLENs("CP"); + /* This function retrieves the code page. It is subject to change, but + * is documented and has been stable for many releases */ + UINT ___lc_codepage_func(void); + + retval = save_to_buffer(Perl_form(aTHX_ "%d", ___lc_codepage_func()), + retbufp, retbuf_sizep); + DEBUG_Lv(PerlIO_printf(Perl_debug_log, "locale='%s' cp=%s\n", + locale, retval)); + break; - has_nondigit: +# else - retval = save_to_buffer(first, &PL_langinfo_buf, - &PL_langinfo_bufsize, offset); - } + /* The codeset is important, but khw did not figure out a way for it to + * be retrieved on non-Windows boxes without nl_langinfo(). But even + * if we can't get it directly, we can usually determine if it is a + * UTF-8 locale or not. If it is UTF-8, we (correctly) use that for + * the code set. */ + +# if defined(HAS_MBTOWC) || defined(HAS_MBRTOWC) + + /* If libc mbtowc() evaluates the bytes that form the REPLACEMENT + * CHARACTER as that Unicode code point, this has to be a UTF-8 locale. + * */ + wchar_t wc = 0; + (void) Perl_mbtowc_(aTHX_ NULL, NULL, 0);/* Reset shift state */ + int mbtowc_ret = Perl_mbtowc_(aTHX_ &wc, + STR_WITH_LEN(REPLACEMENT_CHARACTER_UTF8)); + if (mbtowc_ret >= 0 && wc == UNICODE_REPLACEMENT) { + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "mbtowc returned REPLACEMENT\n")); + retval = "UTF-8"; + break; + } - break; + /* Here, it isn't a UTF-8 locale. */ -# endif -# ifdef HAS_LOCALECONV +# else /* mbtowc() is not available. */ - case CRNCYSTR: + /* Sling together several possibilities, depending on platform + * capabilities and what we found. + * + * For non-English locales or non-dollar currency locales, we likely + * will find out whether a locale is UTF-8 or not */ - /* We don't bother with localeconv_l() because any system that - * has it is likely to also have nl_langinfo() */ + utf8ness_t is_utf8 = UTF8NESS_UNKNOWN; + const char * scratch_buf = NULL; - LOCALECONV_LOCK; /* Prevent interference with other threads - using localeconv() */ +# if defined(USE_LOCALE_MONETARY) && defined(HAS_LOCALECONV) -# ifdef TS_W32_BROKEN_LOCALECONV + /* Can't use this method unless localeconv() is available, as that's + * the way we find out the currency symbol. */ + + /* First try looking at the currency symbol (via a recursive call) to + * see if it disambiguates things. Often that will be in the native + * script, and if the symbol isn't legal UTF-8, we know that the locale + * isn't either. */ + (void) my_langinfo_c(CRNCYSTR, LC_MONETARY, locale, &scratch_buf, NULL, + &is_utf8); + Safefree(scratch_buf); - /* This is a workaround for a Windows bug prior to VS 15. - * What we do here is, while locked, switch to the global - * locale so localeconv() works; then switch back just before - * the unlock. This can screw things up if some thread is - * already using the global locale while assuming no other is. - * A different workaround would be to call GetCurrencyFormat on - * a known value, and parse it; patches welcome - * - * We have to use LC_ALL instead of LC_MONETARY because of - * another bug in Windows */ +# endif +# ifdef USE_LOCALE_TIME - save_thread = savepv(my_setlocale(LC_ALL, NULL)); - _configthreadlocale(_DISABLE_PER_THREAD_LOCALE); - save_global= savepv(my_setlocale(LC_ALL, NULL)); - my_setlocale(LC_ALL, save_thread); + /* If we have ruled out being UTF-8, no point in checking further. */ + if (is_utf8 != UTF8NESS_NO) { -# endif + /* But otherwise do check more. This is done even if the currency + * symbol looks to be UTF-8, just in case that's a false positive. + * + * Look at the LC_TIME entries, like the names of the months or + * weekdays. We quit at the first one that is illegal UTF-8 */ - lc = localeconv(); - if ( ! lc - || ! lc->currency_symbol - || strEQ("", lc->currency_symbol)) - { - LOCALECONV_UNLOCK; - return ""; + utf8ness_t this_is_utf8 = UTF8NESS_UNKNOWN; + const int times[] = { + DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7, + MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7, MON_8, + MON_9, MON_10, MON_11, MON_12, + ALT_DIGITS, AM_STR, PM_STR, + ABDAY_1, ABDAY_2, ABDAY_3, ABDAY_4, ABDAY_5, ABDAY_6, + ABDAY_7, + ABMON_1, ABMON_2, ABMON_3, ABMON_4, ABMON_5, ABMON_6, + ABMON_7, ABMON_8, ABMON_9, ABMON_10, ABMON_11, ABMON_12 + }; + + /* The code in the recursive call can handle switching the locales, + * but by doing it here, we avoid switching each iteration of the + * loop */ + const char * orig_TIME_locale = toggle_locale_c(LC_TIME, locale); + + for (PERL_UINT_FAST8_T i = 0; i < C_ARRAY_LENGTH(times); i++) { + scratch_buf = NULL; + (void) my_langinfo_c(times[i], LC_TIME, locale, &scratch_buf, + NULL, &this_is_utf8); + Safefree(scratch_buf); + if (this_is_utf8 == UTF8NESS_NO) { + is_utf8 = UTF8NESS_NO; + break; } - /* Leave the first spot empty to be filled in below */ - retval = save_to_buffer(lc->currency_symbol, &PL_langinfo_buf, - &PL_langinfo_bufsize, 1); - if (lc->mon_decimal_point && strEQ(lc->mon_decimal_point, "")) - { /* khw couldn't figure out how the localedef specifications - would show that the $ should replace the radix; this is - just a guess as to how it might work.*/ - PL_langinfo_buf[0] = '.'; - } - else if (lc->p_cs_precedes) { - PL_langinfo_buf[0] = '-'; - } - else { - PL_langinfo_buf[0] = '+'; + if (this_is_utf8 == UTF8NESS_YES) { + is_utf8 = UTF8NESS_YES; } + } -# ifdef TS_W32_BROKEN_LOCALECONV - - my_setlocale(LC_ALL, save_global); - _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); - my_setlocale(LC_ALL, save_thread); - Safefree(save_global); - Safefree(save_thread); - -# endif - - LOCALECONV_UNLOCK; - break; + /* Here we have gone through all the LC_TIME elements. is_utf8 has + * been set as follows: + * UTF8NESS_NO If at least one is't legal UTF-8 + * UTF8NESS_IMMMATERIAL If all are ASCII + * UTF8NESS_YES If all are legal UTF-8 (including + * ASCIIi), and at least one isn't + * ASCII. */ -# ifdef TS_W32_BROKEN_LOCALECONV + restore_toggled_locale_c(LC_TIME, orig_TIME_locale); + } - case RADIXCHAR: +# endif /* LC_TIME */ - /* For this, we output a known simple floating point number to - * a buffer, and parse it, looking for the radix */ + /* If nothing examined above rules out it being UTF-8, and at least one + * thing fits as UTF-8 (and not plain ASCII), assume the codeset is + * UTF-8. */ + if (is_utf8 == UTF8NESS_YES) { + retval = "UTF-8"; + break; + } - if (toggle) { - STORE_LC_NUMERIC_FORCE_TO_UNDERLYING(); - } + /* Here, nothing examined indicates that the codeset is UTF-8. But + * what is it? The other locale categories are not likely to be of + * further help: + * + * LC_NUMERIC Only a few locales in the world have a non-ASCII radix + * or group separator. + * LC_CTYPE This code wouldn't be compiled if mbtowc() existed and + * was reliable. This is unlikely in C99. There are + * other functions that could be used instead, but are + * they going to exist, and be able to distinguish between + * UTF-8 and 8859-1? Deal with this only if it becomes + * necessary. + * LC_MESSAGES The strings returned from strerror() would seem likely + * candidates, but experience has shown that many systems + * don't actually have translations installed for them. + * They are instead always in English, so everything in + * them is ASCII, which is of no help to us. A Configure + * probe could possibly be written to see if this platform + * has non-ASCII error messages. But again, wait until it + * turns out to be an actual problem. */ - if (PL_langinfo_bufsize < 10) { - PL_langinfo_bufsize = 10; - Renew(PL_langinfo_buf, PL_langinfo_bufsize, char); - } +# endif /* ! mbtowc() */ - needed_size = my_snprintf(PL_langinfo_buf, PL_langinfo_bufsize, - "%.1f", 1.5); - if (needed_size >= (int) PL_langinfo_bufsize) { - PL_langinfo_bufsize = needed_size + 1; - Renew(PL_langinfo_buf, PL_langinfo_bufsize, char); - needed_size = my_snprintf(PL_langinfo_buf, PL_langinfo_bufsize, - "%.1f", 1.5); - assert(needed_size < (int) PL_langinfo_bufsize); - } + /* Rejoin the mbtowc available/not-available cases. + * + * We got here only because we haven't been able to find the codeset. + * The only other option khw could think of is to see if the codeset is + * part of the locale name. This is very less than ideal; often there + * is no code set in the name; and at other times they even lie. + * + * But there is an XPG standard syntax, which many locales follow: + * + * language[_territory[.codeset]][@modifier] + * + * So we take the part between the dot and any '@' */ + retval = (const char *) strchr(locale, '.'); + if (! retval) { + retval = ""; /* Alas, no dot */ + break; + } - ptr = PL_langinfo_buf; - e = PL_langinfo_buf + PL_langinfo_bufsize; + /* Don't include the dot */ + retval++; - /* Find the '1' */ - while (ptr < e && *ptr != '1') { - ptr++; - } - ptr++; + /* And stop before any '@' */ + const char * modifier = strchr(retval, '@'); + if (modifier) { + char * code_set_name; + const Size_t name_len = modifier - retval; + Newx(code_set_name, name_len + 1, char); /* +1 for NUL */ + my_strlcpy(code_set_name, retval, name_len + 1); + SAVEFREEPV(code_set_name); + retval = code_set_name; + } + +# if defined(HAS_MBTOWC) || defined(HAS_MBRTOWC) + + /* When these functions, are available, they were tried earlier and + * indicated that the locale did not act like a proper UTF-8 one. So + * if it claims to be UTF-8, it is a lie */ + if (is_codeset_name_UTF8(retval)) { + retval = ""; + break; + } - /* Find the '5' */ - item_start = ptr; - while (ptr < e && *ptr != '5') { - ptr++; - } +# endif - /* Everything in between is the radix string */ - if (ptr >= e) { - PL_langinfo_buf[0] = '?'; - PL_langinfo_buf[1] = '\0'; - } - else { - *ptr = '\0'; - Move(item_start, PL_langinfo_buf, ptr - PL_langinfo_buf, char); - } + /* Otherwise the code set name is considered to be everything between + * the dot and the '@' */ + retval = save_to_buffer(retval, retbufp, retbuf_sizep); - if (toggle) { - RESTORE_LC_NUMERIC(); - } + break; - retval = PL_langinfo_buf; - break; +# endif -# else + } /* Giant switch() of nl_langinfo() items */ - case RADIXCHAR: /* No special handling needed */ + restore_toggled_locale_i(cat_index, orig_switched_locale); +# ifdef USE_LOCALE_CTYPE + restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale); # endif - case THOUSEP: + if (utf8ness) { + *utf8ness = is_utf8; + } - if (toggle) { - STORE_LC_NUMERIC_FORCE_TO_UNDERLYING(); - } + return retval; - LOCALECONV_LOCK; /* Prevent interference with other threads - using localeconv() */ +# endif /* All the implementations of my_langinfo() */ -# ifdef TS_W32_BROKEN_LOCALECONV +/*--------------------------------------------------------------------------*/ - /* This should only be for the thousands separator. A - * different work around would be to use GetNumberFormat on a - * known value and parse the result to find the separator */ - save_thread = savepv(my_setlocale(LC_ALL, NULL)); - _configthreadlocale(_DISABLE_PER_THREAD_LOCALE); - save_global = savepv(my_setlocale(LC_ALL, NULL)); - my_setlocale(LC_ALL, save_thread); -# if 0 - /* This is the start of code that for broken Windows replaces - * the above and below code, and instead calls - * GetNumberFormat() and then would parse that to find the - * thousands separator. It needs to handle UTF-16 vs -8 - * issues. */ +} /* my_langinfo() */ - needed_size = GetNumberFormatEx(PL_numeric_name, 0, "1234.5", NULL, PL_langinfo_buf, PL_langinfo_bufsize); - DEBUG_L(PerlIO_printf(Perl_debug_log, - "%s: %d: return from GetNumber, count=%d, val=%s\n", - __FILE__, __LINE__, needed_size, PL_langinfo_buf)); +#endif /* USE_LOCALE */ -# endif -# endif +char * +Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst) +{ +#ifdef HAS_STRFTIME - lc = localeconv(); - if (! lc) { - temp = ""; - } - else { - temp = (item == RADIXCHAR) - ? lc->decimal_point - : lc->thousands_sep; - if (! temp) { - temp = ""; - } - } +/* +=for apidoc_section $time +=for apidoc my_strftime - retval = save_to_buffer(temp, &PL_langinfo_buf, - &PL_langinfo_bufsize, 0); +strftime(), but with a different API so that the return value is a pointer +to the formatted result (which MUST be arranged to be FREED BY THE +CALLER). This allows this function to increase the buffer size as needed, +so that the caller doesn't have to worry about that. -# ifdef TS_W32_BROKEN_LOCALECONV +On failure it returns NULL. - my_setlocale(LC_ALL, save_global); - _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); - my_setlocale(LC_ALL, save_thread); - Safefree(save_global); - Safefree(save_thread); +Note that yday and wday effectively are ignored by this function, as +mini_mktime() overwrites them. -# endif +Also note that it is always executed in the underlying C locale of +the program, giving results based on that locale. - LOCALECONV_UNLOCK; +=cut + */ + PERL_ARGS_ASSERT_MY_STRFTIME; - if (toggle) { - RESTORE_LC_NUMERIC(); - } + /* An empty format yields an empty result */ + const int fmtlen = strlen(fmt); + if (fmtlen == 0) { + char *ret; + Newxz (ret, 1, char); + return ret; + } + + /* Set mytm to now */ + struct tm mytm; + init_tm(&mytm); /* XXX workaround - see Perl_init_tm() */ + + /* Override with the passed-in values */ + mytm.tm_sec = sec; + mytm.tm_min = min; + mytm.tm_hour = hour; + mytm.tm_mday = mday; + mytm.tm_mon = mon; + mytm.tm_year = year; + mytm.tm_wday = wday; + mytm.tm_yday = yday; + mytm.tm_isdst = isdst; + mini_mktime(&mytm); + + /* use libc to get the values for tm_gmtoff and tm_zone on platforms that + * have them [perl #18238] */ +#if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE)) + struct tm mytm2; + mytm2 = mytm; + MKTIME_LOCK; + mktime(&mytm2); + MKTIME_UNLOCK; +# ifdef HAS_TM_TM_GMTOFF + mytm.tm_gmtoff = mytm2.tm_gmtoff; +# endif +# ifdef HAS_TM_TM_ZONE + mytm.tm_zone = mytm2.tm_zone; +# endif +#endif +#if defined(USE_LOCALE_CTYPE) && defined(USE_LOCALE_TIME) - break; + const char * orig_CTYPE_LOCALE = toggle_locale_c(LC_CTYPE, + querylocale_c(LC_TIME)); +#endif -# endif -# ifdef HAS_STRFTIME + /* Guess an initial size for the returned string based on an expansion + * factor of the input format, but with a minimum that should handle most + * common cases. If this guess is too small, we will try again with a + * larger one */ + int bufsize = MAX(fmtlen * 2, 64); + + char *buf = NULL; /* Makes Renew() act as Newx() on the first iteration */ + do { + Renew(buf, bufsize, char); + + GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); /* fmt checked by caller */ + + STRFTIME_LOCK; + int len = strftime(buf, bufsize, fmt, &mytm); + STRFTIME_UNLOCK; + + GCC_DIAG_RESTORE_STMT; + + /* A non-zero return indicates success. But to make sure we're not + * dealing with some rogue strftime that returns how much space it + * needs instead of 0 when there isn't enough, check that the return + * indicates we have at least one byte of spare space (which will be + * used for the terminating NUL). */ + if (inRANGE(len, 1, bufsize - 1)) { + goto strftime_success; + } + + /* There are several possible reasons for a 0 return code for a + * non-empty format, and they are not trivial to tease apart. This + * issue is a known bug in the strftime() API. What we do to cope is + * to assume that the reason is not enough space in the buffer, so + * increase it and try again. */ + bufsize *= 2; + + /* But don't just keep increasing the size indefinitely. Stop when it + * becomes obvious that the reason for failure is something besides not + * enough space. The most likely largest expanding format is %c. On + * khw's Linux box, the maximum result of this is 67 characters, in the + * km_KH locale. If a new script comes along that uses 4 UTF-8 bytes + * per character, and with a similar expansion factor, that would be a + * 268:2 byte ratio, or a bit more than 128:1 = 2**7:1. Some strftime + * implementations allow you to say %1000c to pad to 1000 bytes. This + * shows that it is impossible to implement this without a heuristic + * (that can fail). But it indicates we need to be generous in the + * upper limit before failing. The previous heuristic used was too + * stingy. Since the size doubles per iteration, it doesn't take many + * to reach the limit */ + } while (bufsize < ((1 << 11) + 1) * fmtlen); - /* These are defined by C89, so we assume that strftime supports - * them, and so are returned unconditionally; they may not be what - * the locale actually says, but should give good enough results - * for someone using them as formats (as opposed to trying to parse - * them to figure out what the locale says). The other format - * items are actually tested to verify they work on the platform */ - case D_FMT: return "%x"; - case T_FMT: return "%X"; - case D_T_FMT: return "%c"; - - /* These formats are only available in later strfmtime's */ - case ERA_D_FMT: case ERA_T_FMT: case ERA_D_T_FMT: case T_FMT_AMPM: - - /* The rest can be gotten from most versions of strftime(). */ - case ABDAY_1: case ABDAY_2: case ABDAY_3: - case ABDAY_4: case ABDAY_5: case ABDAY_6: case ABDAY_7: - case ALT_DIGITS: - case AM_STR: case PM_STR: - case ABMON_1: case ABMON_2: case ABMON_3: case ABMON_4: - case ABMON_5: case ABMON_6: case ABMON_7: case ABMON_8: - case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12: - case DAY_1: case DAY_2: case DAY_3: case DAY_4: - case DAY_5: case DAY_6: case DAY_7: - case MON_1: case MON_2: case MON_3: case MON_4: - case MON_5: case MON_6: case MON_7: case MON_8: - case MON_9: case MON_10: case MON_11: case MON_12: - - init_tm(&tm); /* Precaution against core dumps */ - tm.tm_sec = 30; - tm.tm_min = 30; - tm.tm_hour = 6; - tm.tm_year = 2017 - 1900; - tm.tm_wday = 0; - tm.tm_mon = 0; - - GCC_DIAG_IGNORE_STMT(-Wimplicit-fallthrough); - - switch (item) { - default: - Perl_croak(aTHX_ - "panic: %s: %d: switch case: %d problem", - __FILE__, __LINE__, item); - NOT_REACHED; /* NOTREACHED */ - - case PM_STR: tm.tm_hour = 18; - case AM_STR: - format = "%p"; - break; - - case ABDAY_7: tm.tm_wday++; - case ABDAY_6: tm.tm_wday++; - case ABDAY_5: tm.tm_wday++; - case ABDAY_4: tm.tm_wday++; - case ABDAY_3: tm.tm_wday++; - case ABDAY_2: tm.tm_wday++; - case ABDAY_1: - format = "%a"; - break; - - case DAY_7: tm.tm_wday++; - case DAY_6: tm.tm_wday++; - case DAY_5: tm.tm_wday++; - case DAY_4: tm.tm_wday++; - case DAY_3: tm.tm_wday++; - case DAY_2: tm.tm_wday++; - case DAY_1: - format = "%A"; - break; - - case ABMON_12: tm.tm_mon++; - case ABMON_11: tm.tm_mon++; - case ABMON_10: tm.tm_mon++; - case ABMON_9: tm.tm_mon++; - case ABMON_8: tm.tm_mon++; - case ABMON_7: tm.tm_mon++; - case ABMON_6: tm.tm_mon++; - case ABMON_5: tm.tm_mon++; - case ABMON_4: tm.tm_mon++; - case ABMON_3: tm.tm_mon++; - case ABMON_2: tm.tm_mon++; - case ABMON_1: - format = "%b"; - break; - - case MON_12: tm.tm_mon++; - case MON_11: tm.tm_mon++; - case MON_10: tm.tm_mon++; - case MON_9: tm.tm_mon++; - case MON_8: tm.tm_mon++; - case MON_7: tm.tm_mon++; - case MON_6: tm.tm_mon++; - case MON_5: tm.tm_mon++; - case MON_4: tm.tm_mon++; - case MON_3: tm.tm_mon++; - case MON_2: tm.tm_mon++; - case MON_1: - format = "%B"; - break; - - case T_FMT_AMPM: - format = "%r"; - return_format = TRUE; - break; - - case ERA_D_FMT: - format = "%Ex"; - return_format = TRUE; - break; - - case ERA_T_FMT: - format = "%EX"; - return_format = TRUE; - break; - - case ERA_D_T_FMT: - format = "%Ec"; - return_format = TRUE; - break; - - case ALT_DIGITS: - tm.tm_wday = 0; - format = "%Ow"; /* Find the alternate digit for 0 */ - break; - } - - GCC_DIAG_RESTORE_STMT; - - /* We can't use my_strftime() because it doesn't look at - * tm_wday */ - while (0 == strftime(PL_langinfo_buf, PL_langinfo_bufsize, - format, &tm)) - { - /* A zero return means one of: - * a) there wasn't enough space in PL_langinfo_buf - * b) the format, like a plain %p, returns empty - * c) it was an illegal format, though some - * implementations of strftime will just return the - * illegal format as a plain character sequence. - * - * To quickly test for case 'b)', try again but precede - * the format with a plain character. If that result is - * still empty, the problem is either 'a)' or 'c)' */ - - Size_t format_size = strlen(format) + 1; - Size_t mod_size = format_size + 1; - char * mod_format; - char * temp_result; - - Newx(mod_format, mod_size, char); - Newx(temp_result, PL_langinfo_bufsize, char); - *mod_format = ' '; - my_strlcpy(mod_format + 1, format, mod_size); - len = strftime(temp_result, - PL_langinfo_bufsize, - mod_format, &tm); - Safefree(mod_format); - Safefree(temp_result); - - /* If 'len' is non-zero, it means that we had a case like - * %p which means the current locale doesn't use a.m. or - * p.m., and that is valid */ - if (len == 0) { - - /* Here, still didn't work. If we get well beyond a - * reasonable size, bail out to prevent an infinite - * loop. */ + /* Here, strftime() returned 0, and it likely wasn't for lack of space. + * There are two possible reasons: + * + * First is that the result is legitimately 0 length. This can happen + * when the format is precisely "%p". That is the only documented format + * that can have an empty result. */ + if (strEQ(fmt, "%p")) { + Renew(buf, 1, char); + *buf = '\0'; + goto strftime_success; + } - if (PL_langinfo_bufsize > 100 * format_size) { - *PL_langinfo_buf = '\0'; - } - else { - /* Double the buffer size to retry; Add 1 in case - * original was 0, so we aren't stuck at 0. */ - PL_langinfo_bufsize *= 2; - PL_langinfo_bufsize++; - Renew(PL_langinfo_buf, PL_langinfo_bufsize, char); - continue; - } - } + /* The other reason is that the format string is malformed. Probably it is + * an illegal conversion specifier.) */ + Safefree(buf); + return NULL; - break; - } + strftime_success: - /* Here, we got a result. - * - * If the item is 'ALT_DIGITS', PL_langinfo_buf contains the - * alternate format for wday 0. If the value is the same as - * the normal 0, there isn't an alternate, so clear the buffer. - * */ - if ( item == ALT_DIGITS - && strEQ(PL_langinfo_buf, "0")) - { - *PL_langinfo_buf = '\0'; - } +#if defined(USE_LOCALE_CTYPE) && defined(USE_LOCALE_TIME) - /* ALT_DIGITS is problematic. Experiments on it showed that - * strftime() did not always work properly when going from - * alt-9 to alt-10. Only a few locales have this item defined, - * and in all of them on Linux that khw was able to find, - * nl_langinfo() merely returned the alt-0 character, possibly - * doubled. Most Unicode digits are in blocks of 10 - * consecutive code points, so that is sufficient information - * for those scripts, as we can infer alt-1, alt-2, .... But - * for a Japanese locale, a CJK ideographic 0 is returned, and - * the CJK digits are not in code point order, so you can't - * really infer anything. The localedef for this locale did - * specify the succeeding digits, so that strftime() works - * properly on them, without needing to infer anything. But - * the nl_langinfo() return did not give sufficient information - * for the caller to understand what's going on. So until - * there is evidence that it should work differently, this - * returns the alt-0 string for ALT_DIGITS. - * - * wday was chosen because its range is all a single digit. - * Things like tm_sec have two digits as the minimum: '00' */ + restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_LOCALE); - retval = PL_langinfo_buf; +#endif + return buf; - /* If to return the format, not the value, overwrite the buffer - * with it. But some strftime()s will keep the original format - * if illegal, so change those to "" */ - if (return_format) { - if (strEQ(PL_langinfo_buf, format)) { - *PL_langinfo_buf = '\0'; - } - else { - retval = save_to_buffer(format, &PL_langinfo_buf, - &PL_langinfo_bufsize, 0); - } - } +#else + Perl_croak(aTHX_ "panic: no strftime"); + return NULL; +#endif - break; +} -# endif +char * +Perl_my_strftime8_temp(pTHX_ const char *fmt, int sec, int min, int hour, int mday, + int mon, int year, int wday, int yday, int isdst, + utf8ness_t * utf8ness) +{ /* Documented above */ + char * retval = my_strftime(fmt, sec, min, hour, mday, mon, year, wday, + yday, isdst); + + PERL_ARGS_ASSERT_MY_STRFTIME8_TEMP; + + if (utf8ness) { + +#ifdef USE_LOCALE_TIME + *utf8ness = get_locale_string_utf8ness_i(retval, + LOCALE_UTF8NESS_UNKNOWN, + NULL, LC_TIME_INDEX_); +#else + *utf8ness = UTF8NESS_IMMATERIAL; +#endif - } } - return retval; - -#endif + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "fmt=%s, retval=%s", fmt, + ((is_utf8_string((U8 *) retval, 0)) + ? retval + :_byte_dump_string((U8 *) retval, strlen(retval), 0))); + if (utf8ness) PerlIO_printf(Perl_debug_log, "; utf8ness=%d", + (int) *utf8ness); + PerlIO_printf(Perl_debug_log, "\n"); + ); + return retval; } /* @@ -3150,53 +5011,79 @@ Perl_init_i18nl10n(pTHX_ int printwarn) * error handling. * * Besides some asserts, data structure initialization, and specific - * platform complications, this routine is effectively just two things. - * - * a) setlocale(LC_ALL, ""); + * platform complications, this routine is effectively represented by this + * pseudo-code: * - * which sets LC_ALL to the values in the current environment. + * setlocale(LC_ALL, ""); x + * foreach (subcategory) { x + * curlocales[f(subcategory)] = setlocale(subcategory, NULL); x + * } x + * if (platform_so_requires) { + * foreach (subcategory) { + * PL_curlocales[f(subcategory)] = curlocales[f(subcategory)] + * } + * } + * foreach (subcategory) { + * if (needs_special_handling[f(subcategory)] &this_subcat_handler + * } * - * And for each individual category 'foo' whose value we care about: + * This sets all the categories to the values in the current environment, + * saves them temporarily in curlocales[] until they can be handled and/or + * on some platforms saved in a per-thread array PL_curlocales[]. * - * b) save_foo = setlocale(LC_foo, NULL); handle_foo(save_foo); + * f(foo) is a mapping from the opaque system category numbers to small + * non-negative integers used most everywhere in this file as indices into + * arrays (such as curlocales[]) so the program doesn't have to otherwise + * deal with the opaqueness. * - * (We don't tend to care about categories like LC_PAPER, for example.) + * If the platform doesn't have LC_ALL, the lines marked 'x' above are + * effectively replaced by: + * foreach (subcategory) { y + * curlocales[f(subcategory)] = setlocale(subcategory, ""); y + * } y * - * But there are complications. On systems without LC_ALL, it emulates - * step a) by looping through all the categories, and doing + * The only differences being the lack of an LC_ALL call, and using "" + * instead of NULL in the setlocale calls. * - * setlocale(LC_foo, ""); + * But there are, of course, complications. * - * on each. + * it has to deal with if this is an embedded perl, whose locale doesn't + * come from the environment, but has been set up by the caller. This is + * pretty simply handled: the "" in the setlocale calls is not a string + * constant, but a variable which is set to NULL in the embedded case. * - * And it has to deal with if this is an embedded perl, whose locale - * doesn't come from the environment, but has been set up by the caller. - * This is pretty simply handled: the "" in the setlocale calls is not a - * string constant, but a variable which is set to NULL in the embedded - * case. + * But the major complication is handling failure and doing fallback. All + * the code marked 'x' or 'y' above is actually enclosed in an outer loop, + * using the array trial_locales[]. On entry, trial_locales[] is + * initialized to just one entry, containing the NULL or "" locale argument + * shown above. If, as is almost always the case, everything works, it + * exits after just the one iteration, going on to the next step. * - * But the major complication is handling failure and doing fallback. - * There is an array, trial_locales, the elements of which are looped over - * until the locale is successfully set. The array is initialized with - * just one element, for - * setlocale(LC_ALL, $NULL_or_empty) - * If that works, as it almost always does, there's no more elements and - * the loop iterates just the once. Otherwise elements are added for each - * of the environment variables that POSIX dictates should control the - * program, in priority order, with a final one being "C". The loop is - * repeated until the first one succeeds. If all fail, we limp along with - * whatever state we got to. If there is no LC_ALL, an inner loop is run - * through all categories (making things look complex). + * But if there is a failure, the code tries its best to honor the + * environment as much as possible. It self-modifies trial_locales[] to + * have more elements, one for each of the POSIX-specified settings from + * the environment, such as LANG, ending in the ultimate fallback, the C + * locale. Thus if there is something bogus with a higher priority + * environment variable, it will try with the next highest, until something + * works. If everything fails, it limps along with whatever state it got + * to. * * A further complication is that Windows has an additional fallback, the * user-default ANSI code page obtained from the operating system. This is * added as yet another loop iteration, just before the final "C" * - * On Ultrix, the locale MUST come from the environment, so there is - * preliminary code to set it. I (khw) am not sure that it is necessary, - * and that this couldn't be folded into the loop, but barring any real - * platforms to test on, it's staying as-is - */ + * A slight complication is that in embedded Perls, the locale may already + * be set-up, and we don't want to get it from the normal environment + * variables. This is handled by having a special environment variable + * indicate we're in this situation. We simply set setlocale's 2nd + * parameter to be a NULL instead of "". That indicates to setlocale that + * it is not to change anything, but to return the current value, + * effectively initializing perl's db to what the locale already is. + * + * We play the same trick with NULL if a LC_ALL succeeds. We call + * setlocale() on the individual categories with NULL to get their existing + * values for our db, instead of trying to change them. + * */ int ok = 1; @@ -3215,7 +5102,13 @@ Perl_init_i18nl10n(pTHX_ int printwarn) const char * const setlocale_init = (PerlEnv_getenv("PERL_SKIP_LOCALE_INIT")) ? NULL : ""; - const char* trial_locales[5]; /* 5 = 1 each for "", LC_ALL, LANG, "", C */ + typedef struct trial_locales_struct_s { + const char* trial_locale; + const char* fallback_desc; + const char* fallback_name; + } trial_locales_struct; + /* 5 = 1 each for "", LC_ALL, LANG, (Win32) system default locale, C */ + trial_locales_struct trial_locales[5]; unsigned int trial_locales_count; const char * const lc_all = PerlEnv_getenv("LC_ALL"); const char * const lang = PerlEnv_getenv("LANG"); @@ -3233,165 +5126,140 @@ Perl_init_i18nl10n(pTHX_ int printwarn) *bad_lang_use_once && strNE("0", bad_lang_use_once))))); - /* setlocale() return vals; not copied so must be looked at immediately */ - const char * sl_result[NOMINAL_LC_ALL_INDEX + 1]; - /* current locale for given category; should have been copied so aren't * volatile */ const char * curlocales[NOMINAL_LC_ALL_INDEX + 1]; -# ifdef WIN32 - - /* In some systems you can find out the system default locale - * and use that as the fallback locale. */ -# define SYSTEM_DEFAULT_LOCALE -# endif -# ifdef SYSTEM_DEFAULT_LOCALE - - const char *system_default_locale = NULL; - -# endif - # ifndef DEBUGGING # define DEBUG_LOCALE_INIT(a,b,c) # else DEBUG_INITIALIZATION_set(cBOOL(PerlEnv_getenv("PERL_DEBUG_LOCALE_INIT"))); -# define DEBUG_LOCALE_INIT(category, locale, result) \ - STMT_START { \ - if (debug_initialization) { \ - PerlIO_printf(Perl_debug_log, \ - "%s:%d: %s\n", \ - __FILE__, __LINE__, \ - setlocale_debug_string(category, \ - locale, \ - result)); \ - } \ - } STMT_END +# define DEBUG_LOCALE_INIT(cat_index, locale, result) \ + DEBUG_L(PerlIO_printf(Perl_debug_log, "%s\n", \ + setlocale_debug_string_i(cat_index, locale, result))); /* Make sure the parallel arrays are properly set up */ # ifdef USE_LOCALE_NUMERIC - assert(categories[LC_NUMERIC_INDEX] == LC_NUMERIC); - assert(strEQ(category_names[LC_NUMERIC_INDEX], "LC_NUMERIC")); + assert(categories[LC_NUMERIC_INDEX_] == LC_NUMERIC); + assert(strEQ(category_names[LC_NUMERIC_INDEX_], "LC_NUMERIC")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_NUMERIC_INDEX] == LC_NUMERIC_MASK); + assert(category_masks[LC_NUMERIC_INDEX_] == LC_NUMERIC_MASK); # endif # endif # ifdef USE_LOCALE_CTYPE - assert(categories[LC_CTYPE_INDEX] == LC_CTYPE); - assert(strEQ(category_names[LC_CTYPE_INDEX], "LC_CTYPE")); + assert(categories[LC_CTYPE_INDEX_] == LC_CTYPE); + assert(strEQ(category_names[LC_CTYPE_INDEX_], "LC_CTYPE")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_CTYPE_INDEX] == LC_CTYPE_MASK); + assert(category_masks[LC_CTYPE_INDEX_] == LC_CTYPE_MASK); # endif # endif # ifdef USE_LOCALE_COLLATE - assert(categories[LC_COLLATE_INDEX] == LC_COLLATE); - assert(strEQ(category_names[LC_COLLATE_INDEX], "LC_COLLATE")); + assert(categories[LC_COLLATE_INDEX_] == LC_COLLATE); + assert(strEQ(category_names[LC_COLLATE_INDEX_], "LC_COLLATE")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_COLLATE_INDEX] == LC_COLLATE_MASK); + assert(category_masks[LC_COLLATE_INDEX_] == LC_COLLATE_MASK); # endif # endif # ifdef USE_LOCALE_TIME - assert(categories[LC_TIME_INDEX] == LC_TIME); - assert(strEQ(category_names[LC_TIME_INDEX], "LC_TIME")); + assert(categories[LC_TIME_INDEX_] == LC_TIME); + assert(strEQ(category_names[LC_TIME_INDEX_], "LC_TIME")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_TIME_INDEX] == LC_TIME_MASK); + assert(category_masks[LC_TIME_INDEX_] == LC_TIME_MASK); # endif # endif # ifdef USE_LOCALE_MESSAGES - assert(categories[LC_MESSAGES_INDEX] == LC_MESSAGES); - assert(strEQ(category_names[LC_MESSAGES_INDEX], "LC_MESSAGES")); + assert(categories[LC_MESSAGES_INDEX_] == LC_MESSAGES); + assert(strEQ(category_names[LC_MESSAGES_INDEX_], "LC_MESSAGES")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_MESSAGES_INDEX] == LC_MESSAGES_MASK); + assert(category_masks[LC_MESSAGES_INDEX_] == LC_MESSAGES_MASK); # endif # endif # ifdef USE_LOCALE_MONETARY - assert(categories[LC_MONETARY_INDEX] == LC_MONETARY); - assert(strEQ(category_names[LC_MONETARY_INDEX], "LC_MONETARY")); + assert(categories[LC_MONETARY_INDEX_] == LC_MONETARY); + assert(strEQ(category_names[LC_MONETARY_INDEX_], "LC_MONETARY")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_MONETARY_INDEX] == LC_MONETARY_MASK); + assert(category_masks[LC_MONETARY_INDEX_] == LC_MONETARY_MASK); # endif # endif # ifdef USE_LOCALE_ADDRESS - assert(categories[LC_ADDRESS_INDEX] == LC_ADDRESS); - assert(strEQ(category_names[LC_ADDRESS_INDEX], "LC_ADDRESS")); + assert(categories[LC_ADDRESS_INDEX_] == LC_ADDRESS); + assert(strEQ(category_names[LC_ADDRESS_INDEX_], "LC_ADDRESS")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_ADDRESS_INDEX] == LC_ADDRESS_MASK); + assert(category_masks[LC_ADDRESS_INDEX_] == LC_ADDRESS_MASK); # endif # endif # ifdef USE_LOCALE_IDENTIFICATION - assert(categories[LC_IDENTIFICATION_INDEX] == LC_IDENTIFICATION); - assert(strEQ(category_names[LC_IDENTIFICATION_INDEX], "LC_IDENTIFICATION")); + assert(categories[LC_IDENTIFICATION_INDEX_] == LC_IDENTIFICATION); + assert(strEQ(category_names[LC_IDENTIFICATION_INDEX_], "LC_IDENTIFICATION")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_IDENTIFICATION_INDEX] == LC_IDENTIFICATION_MASK); + assert(category_masks[LC_IDENTIFICATION_INDEX_] == LC_IDENTIFICATION_MASK); # endif # endif # ifdef USE_LOCALE_MEASUREMENT - assert(categories[LC_MEASUREMENT_INDEX] == LC_MEASUREMENT); - assert(strEQ(category_names[LC_MEASUREMENT_INDEX], "LC_MEASUREMENT")); + assert(categories[LC_MEASUREMENT_INDEX_] == LC_MEASUREMENT); + assert(strEQ(category_names[LC_MEASUREMENT_INDEX_], "LC_MEASUREMENT")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_MEASUREMENT_INDEX] == LC_MEASUREMENT_MASK); + assert(category_masks[LC_MEASUREMENT_INDEX_] == LC_MEASUREMENT_MASK); # endif # endif # ifdef USE_LOCALE_PAPER - assert(categories[LC_PAPER_INDEX] == LC_PAPER); - assert(strEQ(category_names[LC_PAPER_INDEX], "LC_PAPER")); + assert(categories[LC_PAPER_INDEX_] == LC_PAPER); + assert(strEQ(category_names[LC_PAPER_INDEX_], "LC_PAPER")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_PAPER_INDEX] == LC_PAPER_MASK); + assert(category_masks[LC_PAPER_INDEX_] == LC_PAPER_MASK); # endif # endif # ifdef USE_LOCALE_TELEPHONE - assert(categories[LC_TELEPHONE_INDEX] == LC_TELEPHONE); - assert(strEQ(category_names[LC_TELEPHONE_INDEX], "LC_TELEPHONE")); + assert(categories[LC_TELEPHONE_INDEX_] == LC_TELEPHONE); + assert(strEQ(category_names[LC_TELEPHONE_INDEX_], "LC_TELEPHONE")); +# ifdef USE_POSIX_2008_LOCALE + assert(category_masks[LC_TELEPHONE_INDEX_] == LC_TELEPHONE_MASK); +# endif +# endif +# ifdef USE_LOCALE_NAME + assert(categories[LC_NAME_INDEX_] == LC_NAME); + assert(strEQ(category_names[LC_NAME_INDEX_], "LC_NAME")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_TELEPHONE_INDEX] == LC_TELEPHONE_MASK); + assert(category_masks[LC_NAME_INDEX_] == LC_NAME_MASK); # endif # endif # ifdef USE_LOCALE_SYNTAX - assert(categories[LC_SYNTAX_INDEX] == LC_SYNTAX); - assert(strEQ(category_names[LC_SYNTAX_INDEX], "LC_SYNTAX")); + assert(categories[LC_SYNTAX_INDEX_] == LC_SYNTAX); + assert(strEQ(category_names[LC_SYNTAX_INDEX_], "LC_SYNTAX")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_SYNTAX_INDEX] == LC_SYNTAX_MASK); + assert(category_masks[LC_SYNTAX_INDEX_] == LC_SYNTAX_MASK); # endif # endif # ifdef USE_LOCALE_TOD - assert(categories[LC_TOD_INDEX] == LC_TOD); - assert(strEQ(category_names[LC_TOD_INDEX], "LC_TOD")); + assert(categories[LC_TOD_INDEX_] == LC_TOD); + assert(strEQ(category_names[LC_TOD_INDEX_], "LC_TOD")); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_TOD_INDEX] == LC_TOD_MASK); + assert(category_masks[LC_TOD_INDEX_] == LC_TOD_MASK); # endif # endif # ifdef LC_ALL - assert(categories[LC_ALL_INDEX] == LC_ALL); - assert(strEQ(category_names[LC_ALL_INDEX], "LC_ALL")); - assert(NOMINAL_LC_ALL_INDEX == LC_ALL_INDEX); + assert(categories[LC_ALL_INDEX_] == LC_ALL); + assert(strEQ(category_names[LC_ALL_INDEX_], "LC_ALL")); + STATIC_ASSERT_STMT(NOMINAL_LC_ALL_INDEX == LC_ALL_INDEX_); # ifdef USE_POSIX_2008_LOCALE - assert(category_masks[LC_ALL_INDEX] == LC_ALL_MASK); + assert(category_masks[LC_ALL_INDEX_] == LC_ALL_MASK); # endif # endif # endif /* DEBUGGING */ /* Initialize the per-thread mbrFOO() state variables. See POSIX.xs for * why these particular incantations are used. */ -#ifdef HAS_MBRLEN +# ifdef HAS_MBRLEN memzero(&PL_mbrlen_ps, sizeof(PL_mbrlen_ps)); -#endif -#ifdef HAS_MBRTOWC +# endif +# ifdef HAS_MBRTOWC memzero(&PL_mbrtowc_ps, sizeof(PL_mbrtowc_ps)); -#endif -#ifdef HAS_WCTOMBR +# endif +# ifdef HAS_WCTOMBR wcrtomb(NULL, L'\0', &PL_wcrtomb_ps); -#endif - - /* Initialize the cache of the program's UTF-8ness for the always known - * locales C and POSIX */ - my_strlcpy(PL_locale_utf8ness, C_and_POSIX_utf8ness, - sizeof(PL_locale_utf8ness)); - - /* See https://github.com/Perl/perl5/issues/17824 */ - Zero(curlocales, NOMINAL_LC_ALL_INDEX, char *); - +# endif # ifdef USE_THREAD_SAFE_LOCALE # ifdef WIN32 @@ -3401,123 +5269,87 @@ Perl_init_i18nl10n(pTHX_ int printwarn) # endif # ifdef USE_POSIX_2008_LOCALE - PL_C_locale_obj = newlocale(LC_ALL_MASK, "C", (locale_t) 0); if (! PL_C_locale_obj) { - Perl_croak_nocontext( - "panic: Cannot create POSIX 2008 C locale object; errno=%d", errno); + PL_C_locale_obj = newlocale(LC_ALL_MASK, "C", (locale_t) 0); } - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "%s:%d: created C object %p\n", __FILE__, __LINE__, PL_C_locale_obj); + if (! PL_C_locale_obj) { + locale_panic_(Perl_form(aTHX_ + "Cannot create POSIX 2008 C locale object")); } -# endif + DEBUG_Lv(PerlIO_printf(Perl_debug_log, "created C object %p\n", + PL_C_locale_obj)); -# ifdef USE_LOCALE_NUMERIC + /* Switch to using the POSIX 2008 interface now. This would happen below + * anyway, but deferring it can lead to leaks of memory that would also get + * malloc'd in the interim */ + uselocale(PL_C_locale_obj); + +# ifdef USE_LOCALE_NUMERIC - PL_numeric_radix_sv = newSVpvs("."); + PL_underlying_numeric_obj = duplocale(PL_C_locale_obj); +# endif # endif +# ifdef USE_LOCALE_NUMERIC + + PL_numeric_radix_sv = newSV(1); + PL_underlying_radix_sv = newSV(1); + Newxz(PL_numeric_name, 1, char); /* Single NUL character */ + new_numeric("C", false); -# if defined(USE_POSIX_2008_LOCALE) && ! defined(HAS_QUERYLOCALE) +# endif +# ifdef USE_LOCALE_COLLATE - /* Initialize our records. If we have POSIX 2008, we have LC_ALL */ - do_setlocale_c(LC_ALL, my_setlocale(LC_ALL, NULL)); + Newxz(PL_collation_name, 1, char); + new_collate("C", false); # endif -# ifdef LOCALE_ENVIRON_REQUIRED +# ifdef USE_LOCALE_CTYPE - /* - * Ultrix setlocale(..., "") fails if there are no environment - * variables from which to get a locale name. - */ + Newxz(PL_ctype_name, 1, char); + new_ctype("C", false); -# ifndef LC_ALL -# error Ultrix without LC_ALL not implemented -# else +# endif +# ifdef USE_PL_CURLOCALES - { - bool done = FALSE; - if (lang) { - sl_result[LC_ALL_INDEX] = do_setlocale_c(LC_ALL, setlocale_init); - DEBUG_LOCALE_INIT(LC_ALL, setlocale_init, sl_result[LC_ALL_INDEX]); - if (sl_result[LC_ALL_INDEX]) - done = TRUE; - else - setlocale_failure = TRUE; - } - if (! setlocale_failure) { - const char * locale_param; - for (i = 0; i < LC_ALL_INDEX; i++) { - locale_param = (! done && (lang || PerlEnv_getenv(category_names[i]))) - ? setlocale_init - : NULL; - sl_result[i] = do_setlocale_r(categories[i], locale_param); - if (! sl_result[i]) { - setlocale_failure = TRUE; - } - DEBUG_LOCALE_INIT(categories[i], locale_param, sl_result[i]); - } - } + /* Initialize our records. */ + for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + (void) emulate_setlocale_i(i, posix_setlocale(categories[i], NULL), + RECALCULATE_LC_ALL_ON_FINAL_INTERATION, + __LINE__); } -# endif /* LC_ALL */ -# endif /* LOCALE_ENVIRON_REQUIRED */ +# endif /* We try each locale in the list until we get one that works, or exhaust * the list. Normally the loop is executed just once. But if setting the * locale fails, inside the loop we add fallback trials to the array and so * will execute the loop multiple times */ - trial_locales[0] = setlocale_init; + trial_locales_struct ts = { + .trial_locale = setlocale_init, + .fallback_desc = NULL, + .fallback_name = NULL, + }; + trial_locales[0] = ts; trial_locales_count = 1; - for (i= 0; i < trial_locales_count; i++) { - const char * trial_locale = trial_locales[i]; - - if (i > 0) { - - /* XXX This is to preserve old behavior for LOCALE_ENVIRON_REQUIRED - * when i==0, but I (khw) don't think that behavior makes much - * sense */ - setlocale_failure = FALSE; - -# ifdef SYSTEM_DEFAULT_LOCALE -# ifdef WIN32 /* Note that assumes Win32 has LC_ALL */ - - /* On Windows machines, an entry of "" after the 0th means to use - * the system default locale, which we now proceed to get. */ - if (strEQ(trial_locale, "")) { - unsigned int j; - - /* Note that this may change the locale, but we are going to do - * that anyway just below */ - system_default_locale = do_setlocale_c(LC_ALL, ""); - DEBUG_LOCALE_INIT(LC_ALL, "", system_default_locale); - - /* Skip if invalid or if it's already on the list of locales to - * try */ - if (! system_default_locale) { - goto next_iteration; - } - for (j = 0; j < trial_locales_count; j++) { - if (strEQ(system_default_locale, trial_locales[j])) { - goto next_iteration; - } - } - - trial_locale = system_default_locale; - } -# else -# error SYSTEM_DEFAULT_LOCALE only implemented for Win32 -# endif -# endif /* SYSTEM_DEFAULT_LOCALE */ + for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + curlocales[i] = NULL; + } - } /* For i > 0 */ + for (i= 0; i < trial_locales_count; i++) { + const char * trial_locale = trial_locales[i].trial_locale; + setlocale_failure = FALSE; # ifdef LC_ALL - sl_result[LC_ALL_INDEX] = do_setlocale_c(LC_ALL, trial_locale); - DEBUG_LOCALE_INIT(LC_ALL, trial_locale, sl_result[LC_ALL_INDEX]); - if (! sl_result[LC_ALL_INDEX]) { + /* setlocale() return vals; not copied so must be looked at + * immediately. */ + const char * sl_result[NOMINAL_LC_ALL_INDEX + 1]; + sl_result[LC_ALL_INDEX_] = stdized_setlocale(LC_ALL, trial_locale); + DEBUG_LOCALE_INIT(LC_ALL_INDEX_, trial_locale, sl_result[LC_ALL_INDEX_]); + if (! sl_result[LC_ALL_INDEX_]) { setlocale_failure = TRUE; } else { @@ -3536,12 +5368,12 @@ Perl_init_i18nl10n(pTHX_ int printwarn) if (! setlocale_failure) { unsigned int j; for (j = 0; j < NOMINAL_LC_ALL_INDEX; j++) { - curlocales[j] - = savepv(do_setlocale_r(categories[j], trial_locale)); + curlocales[j] = stdized_setlocale(categories[j], trial_locale); if (! curlocales[j]) { setlocale_failure = TRUE; } - DEBUG_LOCALE_INIT(categories[j], trial_locale, curlocales[j]); + curlocales[j] = savepv(curlocales[j]); + DEBUG_LOCALE_INIT(j, trial_locale, curlocales[j]); } if (LIKELY(! setlocale_failure)) { /* All succeeded */ @@ -3565,14 +5397,11 @@ Perl_init_i18nl10n(pTHX_ int printwarn) # else /* !LC_ALL */ PerlIO_printf(Perl_error_log, - "perl: warning: Setting locale failed for the categories:\n\t"); + "perl: warning: Setting locale failed for the categories:\n"); for (j = 0; j < NOMINAL_LC_ALL_INDEX; j++) { if (! curlocales[j]) { - PerlIO_printf(Perl_error_log, category_names[j]); - } - else { - Safefree(curlocales[j]); + PerlIO_printf(Perl_error_log, "\t%s\n", category_names[j]); } } @@ -3656,21 +5485,35 @@ Perl_init_i18nl10n(pTHX_ int printwarn) * to change the behavior. */ if (lc_all) { for (j = 0; j < trial_locales_count; j++) { - if (strEQ(lc_all, trial_locales[j])) { + if (strEQ(lc_all, trial_locales[j].trial_locale)) { goto done_lc_all; } } - trial_locales[trial_locales_count++] = lc_all; + trial_locales_struct ts = { + .trial_locale = lc_all, + .fallback_desc = (strEQ(lc_all, "C") + ? "the standard locale" + : "a fallback locale"), + .fallback_name = lc_all, + }; + trial_locales[trial_locales_count++] = ts; } done_lc_all: if (lang) { for (j = 0; j < trial_locales_count; j++) { - if (strEQ(lang, trial_locales[j])) { + if (strEQ(lang, trial_locales[j].trial_locale)) { goto done_lang; } } - trial_locales[trial_locales_count++] = lang; + trial_locales_struct ts = { + .trial_locale = lang, + .fallback_desc = (strEQ(lang, "C") + ? "the standard locale" + : "a fallback locale"), + .fallback_name = lang, + }; + trial_locales[trial_locales_count++] = ts; } done_lang: @@ -3679,29 +5522,65 @@ Perl_init_i18nl10n(pTHX_ int printwarn) /* For Windows, we also try the system default locale before "C". * (If there exists a Windows without LC_ALL we skip this because * it gets too complicated. For those, the "C" is the next - * fallback possibility). The "" is the same as the 0th element of - * the array, but the code at the loop above knows to treat it - * differently when not the 0th */ - trial_locales[trial_locales_count++] = ""; + * fallback possibility). */ + { + /* Note that this may change the locale, but we are going to do + * that anyway. + * + * Our normal Windows setlocale() implementation ignores the + * system default locale to make things work like POSIX. This + * is the only place where we want to consider it, so have to + * use wrap_wsetlocale(). */ + const char *system_default_locale = + stdize_locale(LC_ALL, + wrap_wsetlocale(LC_ALL, ""), + &PL_stdize_locale_buf, + &PL_stdize_locale_bufsize, + __LINE__); + DEBUG_LOCALE_INIT(LC_ALL_INDEX_, "", system_default_locale); + + /* Skip if invalid or if it's already on the list of locales to + * try */ + if (! system_default_locale) { + goto done_system_default; + } + for (j = 0; j < trial_locales_count; j++) { + if (strEQ(system_default_locale, trial_locales[j].trial_locale)) { + goto done_system_default; + } + } + + trial_locales_struct ts = { + .trial_locale = system_default_locale, + .fallback_desc = (strEQ(system_default_locale, "C") + ? "the standard locale" + : "the system default locale"), + .fallback_name = system_default_locale, + }; + trial_locales[trial_locales_count++] = ts; + } + done_system_default: # endif for (j = 0; j < trial_locales_count; j++) { - if (strEQ("C", trial_locales[j])) { + if (strEQ("C", trial_locales[j].trial_locale)) { goto done_C; } } - trial_locales[trial_locales_count++] = "C"; - + { + /* new scope to avoid C++ complaining about + initialization being bypassed by goto. + */ + trial_locales_struct ts = { + .trial_locale = "C", + .fallback_desc = "the standard locale", + .fallback_name = "C", + }; + trial_locales[trial_locales_count++] = ts; + } done_C: ; } /* end of first time through the loop */ - -# ifdef WIN32 - - next_iteration: ; - -# endif - } /* end of looping through the trial locales */ if (ok < 1) { /* If we tried to fallback */ @@ -3723,34 +5602,15 @@ Perl_init_i18nl10n(pTHX_ int printwarn) for (j = 0; j < NOMINAL_LC_ALL_INDEX; j++) { Safefree(curlocales[j]); - curlocales[j] = savepv(do_setlocale_r(categories[j], NULL)); - DEBUG_LOCALE_INIT(categories[j], NULL, curlocales[j]); + curlocales[j] = savepv(stdized_setlocale(categories[j], NULL)); + DEBUG_LOCALE_INIT(j, NULL, curlocales[j]); } } if (locwarn) { - const char * description; - const char * name = ""; - if (strEQ(trial_locales[i], "C")) { - description = "the standard locale"; - name = "C"; - } + const char * description = trial_locales[i].fallback_desc; + const char * name = trial_locales[i].fallback_name; -# ifdef SYSTEM_DEFAULT_LOCALE - - else if (strEQ(trial_locales[i], "")) { - description = "the system default locale"; - if (system_default_locale) { - name = system_default_locale; - } - } - -# endif /* SYSTEM_DEFAULT_LOCALE */ - - else { - description = "a fallback locale"; - name = trial_locales[i]; - } if (name && strNE(name, "")) { PerlIO_printf(Perl_error_log, "perl: warning: %s %s (\"%s\").\n", msg, description, name); @@ -3762,43 +5622,23 @@ Perl_init_i18nl10n(pTHX_ int printwarn) } } /* End of tried to fallback */ - /* Done with finding the locales; update our records */ - -# ifdef USE_LOCALE_CTYPE - - new_ctype(curlocales[LC_CTYPE_INDEX]); - -# endif -# ifdef USE_LOCALE_COLLATE - - new_collate(curlocales[LC_COLLATE_INDEX]); - -# endif -# ifdef USE_LOCALE_NUMERIC - - new_numeric(curlocales[LC_NUMERIC_INDEX]); - -# endif - - for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { - -# if defined(USE_ITHREADS) && ! defined(USE_THREAD_SAFE_LOCALE) +# ifdef USE_POSIX_2008_LOCALE - /* This caches whether each category's locale is UTF-8 or not. This - * may involve changing the locale. It is ok to do this at - * initialization time before any threads have started, but not later - * unless thread-safe operations are used. - * Caching means that if the program heeds our dictate not to change - * locales in threaded applications, this data will remain valid, and - * it may get queried without having to change locales. If the - * environment is such that all categories have the same locale, this - * isn't needed, as the code will not change the locale; but this - * handles the uncommon case where the environment has disparate - * locales for the categories */ - (void) _is_cur_LC_category_utf8(categories[i]); + /* The stdized setlocales haven't affected the P2008 locales. Initialize + * them now, calculating LC_ALL only on the final go round, when all have + * been set. */ + for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + (void) emulate_setlocale_i(i, curlocales[i], + RECALCULATE_LC_ALL_ON_FINAL_INTERATION, + __LINE__); + } # endif + /* Done with finding the locales; update the auxiliary records */ + new_LC_ALL(NULL, false); + + for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { Safefree(curlocales[i]); } @@ -3824,20 +5664,174 @@ Perl_init_i18nl10n(pTHX_ int printwarn) # endif #endif /* USE_LOCALE */ -#ifdef DEBUGGING /* So won't continue to output stuff */ DEBUG_INITIALIZATION_set(FALSE); -#endif - return ok; } #ifdef USE_LOCALE_COLLATE +STATIC void +S_compute_collxfrm_coefficients(pTHX) +{ + + /* A locale collation definition includes primary, secondary, tertiary, + * etc. weights for each character. To sort, the primary weights are used, + * and only if they compare equal, then the secondary weights are used, and + * only if they compare equal, then the tertiary, etc. + * + * strxfrm() works by taking the input string, say ABC, and creating an + * output transformed string consisting of first the primary weights, + * A¹B¹C¹ followed by the secondary ones, A²B²C²; and then the tertiary, + * etc, yielding A¹B¹C¹ A²B²C² A³B³C³ .... Some characters may not have + * weights at every level. In our example, let's say B doesn't have a + * tertiary weight, and A doesn't have a secondary weight. The constructed + * string is then going to be + * A¹B¹C¹ B²C² A³C³ .... + * This has the desired effect that strcmp() will look at the secondary or + * tertiary weights only if the strings compare equal at all higher + * priority weights. The spaces shown here, like in + * "A¹B¹C¹ A²B²C² " + * are not just for readability. In the general case, these must actually + * be bytes, which we will call here 'separator weights'; and they must be + * smaller than any other weight value, but since these are C strings, only + * the terminating one can be a NUL (some implementations may include a + * non-NUL separator weight just before the NUL). Implementations tend to + * reserve 01 for the separator weights. They are needed so that a shorter + * string's secondary weights won't be misconstrued as primary weights of a + * longer string, etc. By making them smaller than any other weight, the + * shorter string will sort first. (Actually, if all secondary weights are + * smaller than all primary ones, there is no need for a separator weight + * between those two levels, etc.) + * + * The length of the transformed string is roughly a linear function of the + * input string. It's not exactly linear because some characters don't + * have weights at all levels. When we call strxfrm() we have to allocate + * some memory to hold the transformed string. The calculations below try + * to find coefficients 'm' and 'b' for this locale so that m*x + b equals + * how much space we need, given the size of the input string in 'x'. If + * we calculate too small, we increase the size as needed, and call + * strxfrm() again, but it is better to get it right the first time to + * avoid wasted expensive string transformations. + * + * We use the string below to find how long the transformation of it is. + * Almost all locales are supersets of ASCII, or at least the ASCII + * letters. We use all of them, half upper half lower, because if we used + * fewer, we might hit just the ones that are outliers in a particular + * locale. Most of the strings being collated will contain a preponderance + * of letters, and even if they are above-ASCII, they are likely to have + * the same number of weight levels as the ASCII ones. It turns out that + * digits tend to have fewer levels, and some punctuation has more, but + * those are relatively sparse in text, and khw believes this gives a + * reasonable result, but it could be changed if experience so dictates. */ + const char longer[] = "ABCDEFGHIJKLMnopqrstuvwxyz"; + char * x_longer; /* Transformed 'longer' */ + Size_t x_len_longer; /* Length of 'x_longer' */ + + char * x_shorter; /* We also transform a substring of 'longer' */ + Size_t x_len_shorter; + + PL_in_utf8_COLLATE_locale = (PL_collation_standard) + ? 0 + : is_locale_utf8(PL_collation_name); + PL_strxfrm_NUL_replacement = '\0'; + PL_strxfrm_max_cp = 0; + + /* mem_collxfrm_() is used get the transformation (though here we are + * interested only in its length). It is used because it has the + * intelligence to handle all cases, but to work, it needs some values of + * 'm' and 'b' to get it started. For the purposes of this calculation we + * use a very conservative estimate of 'm' and 'b'. This assumes a weight + * can be multiple bytes, enough to hold any UV on the platform, and there + * are 5 levels, 4 weight bytes, and a trailing NUL. */ + PL_collxfrm_base = 5; + PL_collxfrm_mult = 5 * sizeof(UV); + + /* Find out how long the transformation really is */ + x_longer = mem_collxfrm_(longer, + sizeof(longer) - 1, + &x_len_longer, + + /* We avoid converting to UTF-8 in the called + * function by telling it the string is in UTF-8 + * if the locale is a UTF-8 one. Since the string + * passed here is invariant under UTF-8, we can + * claim it's UTF-8 even though it isn't. */ + PL_in_utf8_COLLATE_locale); + Safefree(x_longer); + + /* Find out how long the transformation of a substring of 'longer' is. + * Together the lengths of these transformations are sufficient to + * calculate 'm' and 'b'. The substring is all of 'longer' except the + * first character. This minimizes the chances of being swayed by outliers + * */ + x_shorter = mem_collxfrm_(longer + 1, + sizeof(longer) - 2, + &x_len_shorter, + PL_in_utf8_COLLATE_locale); + Safefree(x_shorter); + + /* If the results are nonsensical for this simple test, the whole locale + * definition is suspect. Mark it so that locale collation is not active + * at all for it. XXX Should we warn? */ + if ( x_len_shorter == 0 + || x_len_longer == 0 + || x_len_shorter >= x_len_longer) + { + PL_collxfrm_mult = 0; + PL_collxfrm_base = 1; + DEBUG_L(PerlIO_printf(Perl_debug_log, + "Disabling locale collation for LC_COLLATE='%s';" + " length for shorter sample=%zu; longer=%zu\n", + PL_collation_name, x_len_shorter, x_len_longer)); + } + else { + SSize_t base; /* Temporary */ + + /* We have both: m * strlen(longer) + b = x_len_longer + * m * strlen(shorter) + b = x_len_shorter; + * subtracting yields: + * m * (strlen(longer) - strlen(shorter)) + * = x_len_longer - x_len_shorter + * But we have set things up so that 'shorter' is 1 byte smaller than + * 'longer'. Hence: + * m = x_len_longer - x_len_shorter + * + * But if something went wrong, make sure the multiplier is at least 1. + */ + if (x_len_longer > x_len_shorter) { + PL_collxfrm_mult = (STRLEN) x_len_longer - x_len_shorter; + } + else { + PL_collxfrm_mult = 1; + } + + /* mx + b = len + * so: b = len - mx + * but in case something has gone wrong, make sure it is non-negative + * */ + base = x_len_longer - PL_collxfrm_mult * (sizeof(longer) - 1); + if (base < 0) { + base = 0; + } + + /* Add 1 for the trailing NUL */ + PL_collxfrm_base = base + 1; + } + + DEBUG_L(PerlIO_printf(Perl_debug_log, + "?UTF-8 locale=%d; x_len_shorter=%zu, " + "x_len_longer=%zu," + " collate multipler=%zu, collate base=%zu\n", + PL_in_utf8_COLLATE_locale, + x_len_shorter, x_len_longer, + PL_collxfrm_mult, PL_collxfrm_base)); +} + char * -Perl__mem_collxfrm(pTHX_ const char *input_string, +Perl_mem_collxfrm_(pTHX_ const char *input_string, STRLEN len, /* Length of 'input_string' */ STRLEN *xlen, /* Set to length of returned string (not including the collation index @@ -3845,15 +5839,18 @@ Perl__mem_collxfrm(pTHX_ const char *inp bool utf8 /* Is the input in UTF-8? */ ) { - - /* _mem_collxfrm() is a bit like strxfrm() but with two important - * differences. First, it handles embedded NULs. Second, it allocates a bit - * more memory than needed for the transformed data itself. The real - * transformed data begins at offset COLLXFRM_HDR_LEN. *xlen is set to - * the length of that, and doesn't include the collation index size. + /* mem_collxfrm_() is like strxfrm() but with two important differences. + * First, it handles embedded NULs. Second, it allocates a bit more memory + * than needed for the transformed data itself. The real transformed data + * begins at offset COLLXFRM_HDR_LEN. *xlen is set to the length of that, + * and doesn't include the collation index size. + * + * It is the caller's responsibility to eventually free the memory returned + * by this function. + * * Please see sv_collxfrm() to see how this is used. */ -#define COLLXFRM_HDR_LEN sizeof(PL_collation_ix) +# define COLLXFRM_HDR_LEN sizeof(PL_collation_ix) char * s = (char *) input_string; STRLEN s_strlen = strlen(input_string); @@ -3862,16 +5859,29 @@ Perl__mem_collxfrm(pTHX_ const char *inp STRLEN length_in_chars; bool first_time = TRUE; /* Cleared after first loop iteration */ - PERL_ARGS_ASSERT__MEM_COLLXFRM; +# ifdef USE_LOCALE_CTYPE + const char * orig_CTYPE_locale = NULL; +# endif + +# if defined(USE_POSIX_2008_LOCALE) && defined HAS_STRXFRM_L + locale_t constructed_locale = (locale_t) 0; +# endif + + PERL_ARGS_ASSERT_MEM_COLLXFRM_; /* Must be NUL-terminated */ assert(*(input_string + len) == '\0'); - /* If this locale has defective collation, skip */ - if (PL_collxfrm_base == 0 && PL_collxfrm_mult == 0) { - DEBUG_L(PerlIO_printf(Perl_debug_log, - "_mem_collxfrm: locale's collation is defective\n")); - goto bad; + if (PL_collxfrm_mult == 0) { /* unknown or bad */ + if (PL_collxfrm_base != 0) { /* bad collation => skip */ + DEBUG_L(PerlIO_printf(Perl_debug_log, + "mem_collxfrm_: locale's collation is defective\n")); + goto bad; + } + + /* (mult, base) == (0,0) means we need to calculate mult and base + * before proceeding */ + S_compute_collxfrm_coefficients(aTHX); } /* Replace any embedded NULs with the control that sorts before any others. @@ -3912,6 +5922,16 @@ Perl__mem_collxfrm(pTHX_ const char *inp try_non_controls < 2; try_non_controls++) { + +# ifdef USE_LOCALE_CTYPE + + /* In this case we use isCNTRL_LC() below, which relies on + * LC_CTYPE, so that must be switched to correspond with the + * LC_COLLATE locale */ + if (! try_non_controls && ! PL_in_utf8_COLLATE_locale) { + orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, PL_collation_name); + } +# endif /* Look through all legal code points (NUL isn't) */ for (j = 1; j < 256; j++) { char * x; /* j's xfrm plus collation index */ @@ -3932,7 +5952,7 @@ Perl__mem_collxfrm(pTHX_ const char *inp cur_source[0] = (char) j; /* Then transform it */ - x = _mem_collxfrm(cur_source, trial_len, &x_len, + x = mem_collxfrm_(cur_source, trial_len, &x_len, 0 /* The string is not in UTF-8 */); /* Ignore any character that didn't successfully transform. @@ -3956,6 +5976,10 @@ Perl__mem_collxfrm(pTHX_ const char *inp } } /* end of loop through all 255 characters */ +# ifdef USE_LOCALE_CTYPE + restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale); +# endif + /* Stop looking if found */ if (cur_min_x) { break; @@ -3965,18 +5989,18 @@ Perl__mem_collxfrm(pTHX_ const char *inp * work in the locale, repeat the loop, looking for any * character that works */ DEBUG_L(PerlIO_printf(Perl_debug_log, - "_mem_collxfrm: No control worked. Trying non-controls\n")); + "mem_collxfrm_: No control worked. Trying non-controls\n")); } /* End of loop to try first the controls, then any char */ if (! cur_min_x) { DEBUG_L(PerlIO_printf(Perl_debug_log, - "_mem_collxfrm: Couldn't find any character to replace" + "mem_collxfrm_: Couldn't find any character to replace" " embedded NULs in locale %s with", PL_collation_name)); goto bad; } DEBUG_L(PerlIO_printf(Perl_debug_log, - "_mem_collxfrm: Replacing embedded NULs in locale %s with " + "mem_collxfrm_: Replacing embedded NULs in locale %s with " "0x%02X\n", PL_collation_name, PL_strxfrm_NUL_replacement)); Safefree(cur_min_x); @@ -4089,7 +6113,7 @@ Perl__mem_collxfrm(pTHX_ const char *inp cur_source[0] = (char) j; /* Then transform it */ - x = _mem_collxfrm(cur_source, 1, &x_len, FALSE); + x = mem_collxfrm_(cur_source, 1, &x_len, FALSE); /* If something went wrong (which it shouldn't), just * ignore this code point */ @@ -4114,14 +6138,14 @@ Perl__mem_collxfrm(pTHX_ const char *inp if (! cur_max_x) { DEBUG_L(PerlIO_printf(Perl_debug_log, - "_mem_collxfrm: Couldn't find any character to" + "mem_collxfrm_: Couldn't find any character to" " replace above-Latin1 chars in locale %s with", PL_collation_name)); goto bad; } DEBUG_L(PerlIO_printf(Perl_debug_log, - "_mem_collxfrm: highest 1-byte collating character" + "mem_collxfrm_: highest 1-byte collating character" " in locale %s is 0x%02X\n", PL_collation_name, PL_strxfrm_max_cp)); @@ -4181,27 +6205,66 @@ Perl__mem_collxfrm(pTHX_ const char *inp Newx(xbuf, xAlloc, char); if (UNLIKELY(! xbuf)) { DEBUG_L(PerlIO_printf(Perl_debug_log, - "_mem_collxfrm: Couldn't malloc %zu bytes\n", xAlloc)); + "mem_collxfrm_: Couldn't malloc %zu bytes\n", xAlloc)); goto bad; } /* Store the collation id */ *(U32*)xbuf = PL_collation_ix; +# if defined(USE_POSIX_2008_LOCALE) && defined HAS_STRXFRM_L +# ifdef USE_LOCALE_CTYPE + + constructed_locale = newlocale(LC_CTYPE_MASK, PL_collation_name, + duplocale(use_curlocale_scratch())); +# else + + constructed_locale = duplocale(use_curlocale_scratch()); + +# endif +# define my_strxfrm(dest, src, n) strxfrm_l(dest, src, n, \ + constructed_locale) +# define CLEANUP_STRXFRM \ + STMT_START { \ + if (constructed_locale != (locale_t) 0) \ + freelocale(constructed_locale); \ + } STMT_END +# else +# define my_strxfrm(dest, src, n) strxfrm(dest, src, n) +# ifdef USE_LOCALE_CTYPE + + orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, PL_collation_name); + +# define CLEANUP_STRXFRM \ + restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale) +# else +# define CLEANUP_STRXFRM NOOP +# endif +# endif + /* Then the transformation of the input. We loop until successful, or we * give up */ for (;;) { - *xlen = strxfrm(xbuf + COLLXFRM_HDR_LEN, s, xAlloc - COLLXFRM_HDR_LEN); + errno = 0; + *xlen = my_strxfrm(xbuf + COLLXFRM_HDR_LEN, s, xAlloc - COLLXFRM_HDR_LEN); /* If the transformed string occupies less space than we told strxfrm() - * was available, it means it successfully transformed the whole - * string. */ + * was available, it means it transformed the whole string. */ if (*xlen < xAlloc - COLLXFRM_HDR_LEN) { - /* Some systems include a trailing NUL in the returned length. - * Ignore it, using a loop in case multiple trailing NULs are - * returned. */ + /* But there still could have been a problem */ + if (errno != 0) { + DEBUG_L(PerlIO_printf(Perl_debug_log, + "strxfrm failed for LC_COLLATE=%s; errno=%d, input=%s\n", + PL_collation_name, errno, + _byte_dump_string((U8 *) s, len, 0))); + goto bad; + } + + /* Here, the transformation was successful. Some systems include a + * trailing NUL in the returned length. Ignore it, using a loop in + * case multiple trailing NULs are returned. */ while ( (*xlen) > 0 && *(xbuf + COLLXFRM_HDR_LEN + (*xlen) - 1) == '\0') { @@ -4223,9 +6286,8 @@ Perl__mem_collxfrm(pTHX_ const char *inp : PL_collxfrm_mult; DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "%s: %d: initial size of %zu bytes for a length " + "initial size of %zu bytes for a length " "%zu string was insufficient, %zu needed\n", - __FILE__, __LINE__, computed_guess, length_in_chars, needed)); /* If slope increased, use it, but discard this result for @@ -4249,9 +6311,8 @@ Perl__mem_collxfrm(pTHX_ const char *inp } DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "%s: %d: slope is now %zu; was %zu, base " + "slope is now %zu; was %zu, base " "is now %zu; was %zu\n", - __FILE__, __LINE__, PL_collxfrm_mult, old_m, PL_collxfrm_base, old_b)); } @@ -4260,9 +6321,7 @@ Perl__mem_collxfrm(pTHX_ const char *inp - computed_guess + PL_collxfrm_base; DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "%s: %d: base is now %zu; was %zu\n", - __FILE__, __LINE__, - new_b, PL_collxfrm_base)); + "base is now %zu; was %zu\n", new_b, PL_collxfrm_base)); PL_collxfrm_base = new_b; } } @@ -4272,7 +6331,7 @@ Perl__mem_collxfrm(pTHX_ const char *inp if (UNLIKELY(*xlen >= PERL_INT_MAX)) { DEBUG_L(PerlIO_printf(Perl_debug_log, - "_mem_collxfrm: Needed %zu bytes, max permissible is %u\n", + "mem_collxfrm_: Needed %zu bytes, max permissible is %u\n", *xlen, PERL_INT_MAX)); goto bad; } @@ -4298,45 +6357,29 @@ Perl__mem_collxfrm(pTHX_ const char *inp xAlloc += (xAlloc / 4) + 1; PL_strxfrm_is_behaved = FALSE; -# ifdef DEBUGGING - - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, - "_mem_collxfrm required more space than previously calculated" - " for locale %s, trying again with new guess=%zu+%zu\n", + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "mem_collxfrm_ required more space than previously" + " calculated for locale %s, trying again with new" + " guess=%zu+%zu\n", PL_collation_name, COLLXFRM_HDR_LEN, - xAlloc - COLLXFRM_HDR_LEN); - } - -# endif - + xAlloc - COLLXFRM_HDR_LEN)); } Renew(xbuf, xAlloc, char); if (UNLIKELY(! xbuf)) { DEBUG_L(PerlIO_printf(Perl_debug_log, - "_mem_collxfrm: Couldn't realloc %zu bytes\n", xAlloc)); + "mem_collxfrm_: Couldn't realloc %zu bytes\n", xAlloc)); goto bad; } first_time = FALSE; } + CLEANUP_STRXFRM; -# ifdef DEBUGGING - - if (DEBUG_Lv_TEST || debug_initialization) { - - print_collxfrm_input_and_return(s, s + len, xlen, utf8); - PerlIO_printf(Perl_debug_log, "Its xfrm is:"); - PerlIO_printf(Perl_debug_log, "%s\n", - _byte_dump_string((U8 *) xbuf + COLLXFRM_HDR_LEN, - *xlen, 1)); - } - -# endif + DEBUG_L(print_collxfrm_input_and_return(s, s + len, xbuf, *xlen, utf8)); - /* Free up unneeded space; retain ehough for trailing NUL */ + /* Free up unneeded space; retain enough for trailing NUL */ Renew(xbuf, COLLXFRM_HDR_LEN + *xlen + 1, char); if (s != input_string) { @@ -4347,13 +6390,8 @@ Perl__mem_collxfrm(pTHX_ const char *inp bad: -# ifdef DEBUGGING - - if (DEBUG_Lv_TEST || debug_initialization) { - print_collxfrm_input_and_return(s, s + len, NULL, utf8); - } - -# endif + CLEANUP_STRXFRM; + DEBUG_L(print_collxfrm_input_and_return(s, s + len, NULL, 0, utf8)); Safefree(xbuf); if (s != input_string) { @@ -4368,45 +6406,96 @@ Perl__mem_collxfrm(pTHX_ const char *inp STATIC void S_print_collxfrm_input_and_return(pTHX_ - const char * const s, - const char * const e, - const STRLEN * const xlen, + const char * s, + const char * e, + const char * xbuf, + const STRLEN xlen, const bool is_utf8) { PERL_ARGS_ASSERT_PRINT_COLLXFRM_INPUT_AND_RETURN; - PerlIO_printf(Perl_debug_log, "_mem_collxfrm[%" UVuf "]: returning ", - (UV)PL_collation_ix); - if (xlen) { - PerlIO_printf(Perl_debug_log, "%zu", *xlen); - } - else { - PerlIO_printf(Perl_debug_log, "NULL"); + PerlIO_printf(Perl_debug_log, + "mem_collxfrm_[ix %" UVuf "] for locale '%s':\n" + " input=%s\n return=%s\n return len=%zu\n", + (UV) PL_collation_ix, PL_collation_name, + get_displayable_string(s, e, is_utf8), + ((xbuf == NULL) + ? "(null)" + : _byte_dump_string((U8 *) xbuf + COLLXFRM_HDR_LEN, xlen, 0)), + xlen); +} + +# endif /* DEBUGGING */ + +SV * +Perl_strxfrm(pTHX_ SV * src) +{ + PERL_ARGS_ASSERT_STRXFRM; + + /* For use by POSIX::strxfrm(). If they differ, toggle LC_CTYPE to + * LC_COLLATE to avoid potential mojibake. + * + * If we can't calculate a collation, 'src' is instead returned, so that + * future comparisons will be by code point order */ + +# ifdef USE_LOCALE_CTYPE + + const char * orig_ctype = toggle_locale_c(LC_CTYPE, + querylocale_c(LC_COLLATE)); +# endif + + SV * dst = src; + STRLEN dstlen; + STRLEN srclen; + const char *p = SvPV_const(src,srclen); + const U32 utf8_flag = SvUTF8(src); + char *d = mem_collxfrm_(p, srclen, &dstlen, cBOOL(utf8_flag)); + + assert(utf8_flag == 0 || utf8_flag == SVf_UTF8); + + if (d != NULL) { + assert(dstlen > 0); + dst =newSVpvn_flags(d + COLLXFRM_HDR_LEN, + dstlen, SVs_TEMP|utf8_flag); + Safefree(d); } - PerlIO_printf(Perl_debug_log, " for locale '%s', string='", - PL_collation_name); - print_bytes_for_locale(s, e, is_utf8); - PerlIO_printf(Perl_debug_log, "'\n"); +# ifdef USE_LOCALE_CTYPE + + restore_toggled_locale_c(LC_CTYPE, orig_ctype); + +# endif + + return dst; } -# endif /* DEBUGGING */ #endif /* USE_LOCALE_COLLATE */ -#ifdef USE_LOCALE -# ifdef DEBUGGING +#if defined(DEBUGGING) || defined(USE_POSIX_2008_LOCALE) -STATIC void -S_print_bytes_for_locale(pTHX_ - const char * const s, - const char * const e, - const bool is_utf8) +STATIC const char * +S_get_displayable_string(pTHX_ + const char * const s, + const char * const e, + const bool is_utf8) { + PERL_ARGS_ASSERT_GET_DISPLAYABLE_STRING; + const char * t = s; bool prev_was_printable = TRUE; bool first_time = TRUE; + char * ret; + + if (e <= s) { + return ""; + } - PERL_ARGS_ASSERT_PRINT_BYTES_FOR_LOCALE; + /* Worst case scenario: All are non-printable so have a blank between each. + * If UTF-8, all are the largest possible code point; otherwise all are a + * single byte. '(2 + 1)' is from each byte takes 2 characters to + * display, and a blank (or NUL for the final one) after it */ + Newxz(ret, (e - s) * (2 + 1) * ((is_utf8) ? UVSIZE : 1), char); + SAVEFREEPV(ret); while (t < e) { UV cp = (is_utf8) @@ -4414,720 +6503,153 @@ S_print_bytes_for_locale(pTHX_ : * (U8 *) t; if (isPRINT(cp)) { if (! prev_was_printable) { - PerlIO_printf(Perl_debug_log, " "); + my_strlcat(ret, " ", sizeof(ret)); + } + + /* Escape these to avoid any ambiguity */ + if (cp == ' ' || cp == '\\') { + my_strlcat(ret, "\\", sizeof(ret)); } - PerlIO_printf(Perl_debug_log, "%c", (U8) cp); + my_strlcat(ret, Perl_form(aTHX_ "%c", (U8) cp), sizeof(ret)); prev_was_printable = TRUE; } else { if (! first_time) { - PerlIO_printf(Perl_debug_log, " "); + my_strlcat(ret, " ", sizeof(ret)); } - PerlIO_printf(Perl_debug_log, "%02" UVXf, cp); + my_strlcat(ret, Perl_form(aTHX_ "%02" UVXf, cp), sizeof(ret)); prev_was_printable = FALSE; } t += (is_utf8) ? UTF8SKIP(t) : 1; first_time = FALSE; } + + return ret; } -# endif /* #ifdef DEBUGGING */ +#endif +#ifdef USE_LOCALE STATIC const char * -S_switch_category_locale_to_template(pTHX_ const int switch_category, const int template_category, const char * template_locale) +S_toggle_locale_i(pTHX_ const unsigned cat_index, + const char * new_locale, + const line_t caller_line) { - /* Changes the locale for LC_'switch_category" to that of - * LC_'template_category', if they aren't already the same. If not NULL, - * 'template_locale' is the locale that 'template_category' is in. + /* Changes the locale for the category specified by 'index' to 'new_locale, + * if they aren't already the same. * - * Returns a copy of the name of the original locale for 'switch_category' + * Returns a copy of the name of the original locale for 'cat_index' * so can be switched back to with the companion function - * restore_switched_locale(), (NULL if no restoral is necessary.) */ - - char * restore_to_locale = NULL; - - if (switch_category == template_category) { /* No changes needed */ - return NULL; - } - - /* Find the original locale of the category we may need to change, so that - * it can be restored to later */ - restore_to_locale = stdize_locale(savepv(do_setlocale_r(switch_category, - NULL))); - if (! restore_to_locale) { - Perl_croak(aTHX_ - "panic: %s: %d: Could not find current %s locale, errno=%d\n", - __FILE__, __LINE__, category_name(switch_category), errno); - } - - /* If the locale of the template category wasn't passed in, find it now */ - if (template_locale == NULL) { - template_locale = do_setlocale_r(template_category, NULL); - if (! template_locale) { - Perl_croak(aTHX_ - "panic: %s: %d: Could not find current %s locale, errno=%d\n", - __FILE__, __LINE__, category_name(template_category), errno); - } - } - - /* It the locales are the same, there's nothing to do */ - if (strEQ(restore_to_locale, template_locale)) { - Safefree(restore_to_locale); - - DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s locale unchanged as %s\n", - category_name(switch_category), template_locale)); - - return NULL; - } - - /* Finally, change the locale to the template one */ - if (! do_setlocale_r(switch_category, template_locale)) { - Perl_croak(aTHX_ - "panic: %s: %d: Could not change %s locale to %s, errno=%d\n", - __FILE__, __LINE__, category_name(switch_category), - template_locale, errno); - } - - DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s locale switched to %s\n", - category_name(switch_category), template_locale)); - - return restore_to_locale; -} - -STATIC void -S_restore_switched_locale(pTHX_ const int category, const char * const original_locale) -{ - /* Restores the locale for LC_'category' to 'original_locale' (which is a - * copy that will be freed by this function), or do nothing if the latter - * parameter is NULL */ - - if (original_locale == NULL) { - return; - } - - if (! do_setlocale_r(category, original_locale)) { - Perl_croak(aTHX_ - "panic: %s: %d: setlocale %s restore to %s failed, errno=%d\n", - __FILE__, __LINE__, - category_name(category), original_locale, errno); - } - - Safefree(original_locale); -} - -/* is_cur_LC_category_utf8 uses a small char buffer to avoid malloc/free */ -#define CUR_LC_BUFFER_SIZE 64 - -bool -Perl__is_cur_LC_category_utf8(pTHX_ int category) -{ - /* Returns TRUE if the current locale for 'category' is UTF-8; FALSE - * otherwise. 'category' may not be LC_ALL. If the platform doesn't have - * nl_langinfo(), nor MB_CUR_MAX, this employs a heuristic, which hence - * could give the wrong result. The result will very likely be correct for - * languages that have commonly used non-ASCII characters, but for notably - * English, it comes down to if the locale's name ends in something like - * "UTF-8". It errs on the side of not being a UTF-8 locale. - * - * If the platform is early C89, not containing mbtowc(), or we are - * compiled to not pay attention to LC_CTYPE, this employs heuristics. - * These work very well for non-Latin locales or those whose currency - * symbol isn't a '$' nor plain ASCII text. But without LC_CTYPE and at - * least MB_CUR_MAX, English locales with an ASCII currency symbol depend - * on the name containing UTF-8 or not. */ - - /* Name of current locale corresponding to the input category */ - const char *save_input_locale = NULL; - - bool is_utf8 = FALSE; /* The return value */ - - /* The variables below are for the cache of previous lookups using this - * function. The cache is a C string, described at the definition for - * 'C_and_POSIX_utf8ness'. - * - * The first part of the cache is fixed, for the C and POSIX locales. The - * varying part starts just after them. */ - char * utf8ness_cache = PL_locale_utf8ness + STRLENs(C_and_POSIX_utf8ness); - - Size_t utf8ness_cache_size; /* Size of the varying portion */ - Size_t input_name_len; /* Length in bytes of save_input_locale */ - Size_t input_name_len_with_overhead; /* plus extra chars used to store - the name in the cache */ - char * delimited; /* The name plus the delimiters used to store - it in the cache */ - char buffer[CUR_LC_BUFFER_SIZE]; /* small buffer */ - char * name_pos; /* position of 'delimited' in the cache, or 0 - if not there */ - - -# ifdef LC_ALL - - assert(category != LC_ALL); - -# endif - - /* Get the desired category's locale */ - save_input_locale = stdize_locale(savepv(do_setlocale_r(category, NULL))); - if (! save_input_locale) { - Perl_croak(aTHX_ - "panic: %s: %d: Could not find current %s locale, errno=%d\n", - __FILE__, __LINE__, category_name(category), errno); - } - - DEBUG_L(PerlIO_printf(Perl_debug_log, - "Current locale for %s is %s\n", - category_name(category), save_input_locale)); - - input_name_len = strlen(save_input_locale); - - /* In our cache, each name is accompanied by two delimiters and a single - * utf8ness digit */ - input_name_len_with_overhead = input_name_len + 3; - - if ( input_name_len_with_overhead <= CUR_LC_BUFFER_SIZE ) { - /* we can use the buffer, avoid a malloc */ - delimited = buffer; - } else { /* need a malloc */ - /* Allocate and populate space for a copy of the name surrounded by the - * delimiters */ - Newx(delimited, input_name_len_with_overhead, char); - } - - delimited[0] = UTF8NESS_SEP[0]; - Copy(save_input_locale, delimited + 1, input_name_len, char); - delimited[input_name_len+1] = UTF8NESS_PREFIX[0]; - delimited[input_name_len+2] = '\0'; - - /* And see if that is in the cache */ - name_pos = instr(PL_locale_utf8ness, delimited); - if (name_pos) { - is_utf8 = *(name_pos + input_name_len_with_overhead - 1) - '0'; - -# ifdef DEBUGGING - - if (DEBUG_Lv_TEST || debug_initialization) { - PerlIO_printf(Perl_debug_log, "UTF8ness for locale %s=%d, \n", - save_input_locale, is_utf8); - } - -# endif - - /* And, if not already in that position, move it to the beginning of - * the non-constant portion of the list, since it is the most recently - * used. (We don't have to worry about overflow, since just moving - * existing names around) */ - if (name_pos > utf8ness_cache) { - Move(utf8ness_cache, - utf8ness_cache + input_name_len_with_overhead, - name_pos - utf8ness_cache, char); - Copy(delimited, - utf8ness_cache, - input_name_len_with_overhead - 1, char); - utf8ness_cache[input_name_len_with_overhead - 1] = is_utf8 + '0'; - } - - /* free only when not using the buffer */ - if ( delimited != buffer ) Safefree(delimited); - Safefree(save_input_locale); - return is_utf8; - } - - /* Here we don't have stored the utf8ness for the input locale. We have to - * calculate it */ - -# if defined(USE_LOCALE_CTYPE) \ - && ( defined(HAS_NL_LANGINFO) \ - || (defined(HAS_MBTOWC) || defined(HAS_MBRTOWC))) - - { - const char *original_ctype_locale - = switch_category_locale_to_template(LC_CTYPE, - category, - save_input_locale); - - /* Here the current LC_CTYPE is set to the locale of the category whose - * information is desired. This means that nl_langinfo() and mbtowc() - * should give the correct results */ - -# ifdef MB_CUR_MAX /* But we can potentially rule out UTF-8ness, avoiding - calling the functions if we have this */ - - /* Standard UTF-8 needs at least 4 bytes to represent the maximum - * Unicode code point. */ - - DEBUG_L(PerlIO_printf(Perl_debug_log, "%s: %d: MB_CUR_MAX=%d\n", - __FILE__, __LINE__, (int) MB_CUR_MAX)); - if ((unsigned) MB_CUR_MAX < STRLENs(MAX_UNICODE_UTF8)) { - is_utf8 = FALSE; - restore_switched_locale(LC_CTYPE, original_ctype_locale); - goto finish_and_return; - } - -# endif -# if defined(HAS_NL_LANGINFO) - - { /* The task is easiest if the platform has this POSIX 2001 function. - Except on some platforms it can wrongly return "", so have to have - a fallback. And it can return that it's UTF-8, even if there are - variances from that. For example, Turkish locales may use the - alternate dotted I rules, and sometimes it appears to be a - defective locale definition. XXX We should probably check for - these in the Latin1 range and warn (but on glibc, requires - iswalnum() etc. due to their not handling 80-FF correctly */ - const char *codeset = my_nl_langinfo(CODESET, FALSE); - /* FALSE => already in dest locale */ - - DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "\tnllanginfo returned CODESET '%s'\n", codeset)); - - if (codeset && strNE(codeset, "")) { - - /* If the implementation of foldEQ() somehow were - * to change to not go byte-by-byte, this could - * read past end of string, as only one length is - * checked. But currently, a premature NUL will - * compare false, and it will stop there */ - is_utf8 = cBOOL( foldEQ(codeset, STR_WITH_LEN("UTF-8")) - || foldEQ(codeset, STR_WITH_LEN("UTF8"))); - - DEBUG_L(PerlIO_printf(Perl_debug_log, - "\tnllanginfo returned CODESET '%s'; ?UTF8 locale=%d\n", - codeset, is_utf8)); - restore_switched_locale(LC_CTYPE, original_ctype_locale); - goto finish_and_return; - } - } - -# endif -# if defined(HAS_MBTOWC) || defined(HAS_MBRTOWC) - /* We can see if this is a UTF-8-like locale if have mbtowc(). It was a - * late adder to C89, so very likely to have it. However, testing has - * shown that, like nl_langinfo() above, there are locales that are not - * strictly UTF-8 that this will return that they are */ - - { - wchar_t wc; - int len; - dSAVEDERRNO; - -# if defined(HAS_MBRTOWC) && defined(USE_ITHREADS) - - mbstate_t ps; - -# endif - - /* mbrtowc() and mbtowc() convert a byte string to a wide - * character. Feed a byte string to one of them and check that the - * result is the expected Unicode code point */ - -# if defined(HAS_MBRTOWC) && defined(USE_ITHREADS) - /* Prefer this function if available, as it's reentrant */ - - memzero(&ps, sizeof(ps));; - PERL_UNUSED_RESULT(mbrtowc(&wc, NULL, 0, &ps)); /* Reset any shift - state */ - SETERRNO(0, 0); - len = mbrtowc(&wc, STR_WITH_LEN(REPLACEMENT_CHARACTER_UTF8), &ps); - SAVE_ERRNO; - -# else - - MBTOWC_LOCK; - PERL_UNUSED_RESULT(mbtowc(&wc, NULL, 0));/* Reset any shift state */ - SETERRNO(0, 0); - len = mbtowc(&wc, STR_WITH_LEN(REPLACEMENT_CHARACTER_UTF8)); - SAVE_ERRNO; - MBTOWC_UNLOCK; - -# endif - - RESTORE_ERRNO; - DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "\treturn from mbtowc; len=%d; code_point=%x; errno=%d\n", - len, (unsigned int) wc, GET_ERRNO)); - - is_utf8 = cBOOL( len == STRLENs(REPLACEMENT_CHARACTER_UTF8) - && wc == (wchar_t) UNICODE_REPLACEMENT); - } - -# endif - - restore_switched_locale(LC_CTYPE, original_ctype_locale); - goto finish_and_return; - } - -# else - - /* Here, we must have a C89 compiler that doesn't have mbtowc(). Next - * try looking at the currency symbol to see if it disambiguates - * things. Often that will be in the native script, and if the symbol - * isn't in UTF-8, we know that the locale isn't. If it is non-ASCII - * UTF-8, we infer that the locale is too, as the odds of a non-UTF8 - * string being valid UTF-8 are quite small */ - -# ifdef USE_LOCALE_MONETARY - - /* If have LC_MONETARY, we can look at the currency symbol. Often that - * will be in the native script. We do this one first because there is - * just one string to examine, so potentially avoids work */ - - { - const char *original_monetary_locale - = switch_category_locale_to_template(LC_MONETARY, - category, - save_input_locale); - bool only_ascii = FALSE; - const U8 * currency_string - = (const U8 *) my_nl_langinfo(CRNCYSTR, FALSE); - /* 2nd param not relevant for this item */ - const U8 * first_variant; - - assert( *currency_string == '-' - || *currency_string == '+' - || *currency_string == '.'); - - currency_string++; - - if (is_utf8_invariant_string_loc(currency_string, 0, &first_variant)) - { - DEBUG_L(PerlIO_printf(Perl_debug_log, "Couldn't get currency symbol for %s, or contains only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale)); - only_ascii = TRUE; - } - else { - is_utf8 = is_strict_utf8_string(first_variant, 0); - } - - restore_switched_locale(LC_MONETARY, original_monetary_locale); - - if (! only_ascii) { - - /* It isn't a UTF-8 locale if the symbol is not legal UTF-8; - * otherwise assume the locale is UTF-8 if and only if the symbol - * is non-ascii UTF-8. */ - DEBUG_Lv(PerlIO_printf(Perl_debug_log, "\t?Currency symbol for %s is UTF-8=%d\n", - save_input_locale, is_utf8)); - goto finish_and_return; - } - } - -# endif /* USE_LOCALE_MONETARY */ -# if defined(HAS_STRFTIME) && defined(USE_LOCALE_TIME) - - /* Still haven't found a non-ASCII string to disambiguate UTF-8 or not. Try - * the names of the months and weekdays, timezone, and am/pm indicator */ - { - const char *original_time_locale - = switch_category_locale_to_template(LC_TIME, - category, - save_input_locale); - int hour = 10; - bool is_dst = FALSE; - int dom = 1; - int month = 0; - int i; - char * formatted_time; - - /* Here the current LC_TIME is set to the locale of the category - * whose information is desired. Look at all the days of the week and - * month names, and the timezone and am/pm indicator for UTF-8 variant - * characters. The first such a one found will tell us if the locale - * is UTF-8 or not */ - - for (i = 0; i < 7 + 12; i++) { /* 7 days; 12 months */ - formatted_time = my_strftime("%A %B %Z %p", - 0, 0, hour, dom, month, 2012 - 1900, 0, 0, is_dst); - if ( ! formatted_time - || is_utf8_invariant_string((U8 *) formatted_time, 0)) - { - - /* Here, we didn't find a non-ASCII. Try the next time through - * with the complemented dst and am/pm, and try with the next - * weekday. After we have gotten all weekdays, try the next - * month */ - is_dst = ! is_dst; - hour = (hour + 12) % 24; - dom++; - if (i > 6) { - month++; - } - continue; - } - - /* Here, we have a non-ASCII. Return TRUE is it is valid UTF8; - * false otherwise. But first, restore LC_TIME to its original - * locale if we changed it */ - restore_switched_locale(LC_TIME, original_time_locale); - - DEBUG_Lv(PerlIO_printf(Perl_debug_log, "\t?time-related strings for %s are UTF-8=%d\n", - save_input_locale, - is_utf8_string((U8 *) formatted_time, 0))); - is_utf8 = is_utf8_string((U8 *) formatted_time, 0); - goto finish_and_return; - } - - /* Falling off the end of the loop indicates all the names were just - * ASCII. Go on to the next test. If we changed it, restore LC_TIME - * to its original locale */ - restore_switched_locale(LC_TIME, original_time_locale); - DEBUG_Lv(PerlIO_printf(Perl_debug_log, "All time-related words for %s contain only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale)); - } - -# endif - -# if 0 && defined(USE_LOCALE_MESSAGES) && defined(HAS_SYS_ERRLIST) - - /* This code is ifdefd out because it was found to not be necessary in testing - * on our dromedary test machine, which has over 700 locales. There, this - * added no value to looking at the currency symbol and the time strings. I - * left it in so as to avoid rewriting it if real-world experience indicates - * that dromedary is an outlier. Essentially, instead of returning abpve if we - * haven't found illegal utf8, we continue on and examine all the strerror() - * messages on the platform for utf8ness. If all are ASCII, we still don't - * know the answer; but otherwise we have a pretty good indication of the - * utf8ness. The reason this doesn't help much is that the messages may not - * have been translated into the locale. The currency symbol and time strings - * are much more likely to have been translated. */ - { - int e; - bool non_ascii = FALSE; - const char *original_messages_locale - = switch_category_locale_to_template(LC_MESSAGES, - category, - save_input_locale); - const char * errmsg = NULL; - - /* Here the current LC_MESSAGES is set to the locale of the category - * whose information is desired. Look through all the messages. We - * can't use Strerror() here because it may expand to code that - * segfaults in miniperl */ - - for (e = 0; e <= sys_nerr; e++) { - errno = 0; - errmsg = sys_errlist[e]; - if (errno || !errmsg) { - break; - } - errmsg = savepv(errmsg); - if (! is_utf8_invariant_string((U8 *) errmsg, 0)) { - non_ascii = TRUE; - is_utf8 = is_utf8_string((U8 *) errmsg, 0); - break; - } - } - Safefree(errmsg); + * restore_toggled_locale_i(), (NULL if no restoral is necessary.) */ - restore_switched_locale(LC_MESSAGES, original_messages_locale); + const char * locale_to_restore_to = NULL; - if (non_ascii) { + PERL_ARGS_ASSERT_TOGGLE_LOCALE_I; + assert(cat_index <= NOMINAL_LC_ALL_INDEX); - /* Any non-UTF-8 message means not a UTF-8 locale; if all are valid, - * any non-ascii means it is one; otherwise we assume it isn't */ - DEBUG_Lv(PerlIO_printf(Perl_debug_log, "\t?error messages for %s are UTF-8=%d\n", - save_input_locale, - is_utf8)); - goto finish_and_return; - } + /* Find the original locale of the category we may need to change, so that + * it can be restored to later */ - DEBUG_L(PerlIO_printf(Perl_debug_log, "All error messages for %s contain only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale)); - } + locale_to_restore_to = querylocale_i(cat_index); -# endif -# ifndef EBCDIC /* On os390, even if the name ends with "UTF-8', it isn't a - UTF-8 locale */ + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "(%" LINE_Tf "): toggle_locale_i: index=%d(%s), wanted=%s," + " actual=%s\n", + caller_line, cat_index, category_names[cat_index], + new_locale, locale_to_restore_to)); + + if (! locale_to_restore_to) { + locale_panic_(Perl_form(aTHX_ + "Could not find current %s locale, errno=%d", + category_names[cat_index], errno)); + } - /* As a last resort, look at the locale name to see if it matches - * qr/UTF -? * 8 /ix, or some other common locale names. This "name", the - * return of setlocale(), is actually defined to be opaque, so we can't - * really rely on the absence of various substrings in the name to indicate - * its UTF-8ness, but if it has UTF8 in the name, it is extremely likely to - * be a UTF-8 locale. Similarly for the other common names */ + /* If the locales are the same, there's nothing to do */ + if (strEQ(locale_to_restore_to, new_locale)) { + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "(%" LINE_Tf "): %s locale unchanged as %s\n", + caller_line, category_names[cat_index], + new_locale)); - { - const Size_t final_pos = strlen(save_input_locale) - 1; + return NULL; + } - if (final_pos >= 3) { - const char *name = save_input_locale; + /* Finally, change the locale to the new one */ + void_setlocale_i(cat_index, new_locale); - /* Find next 'U' or 'u' and look from there */ - while ((name += strcspn(name, "Uu") + 1) - <= save_input_locale + final_pos - 2) - { - if ( isALPHA_FOLD_NE(*name, 't') - || isALPHA_FOLD_NE(*(name + 1), 'f')) - { - continue; - } - name += 2; - if (*(name) == '-') { - if ((name > save_input_locale + final_pos - 1)) { - break; - } - name++; - } - if (*(name) == '8') { - DEBUG_L(PerlIO_printf(Perl_debug_log, - "Locale %s ends with UTF-8 in name\n", - save_input_locale)); - is_utf8 = TRUE; - goto finish_and_return; - } - } - DEBUG_L(PerlIO_printf(Perl_debug_log, - "Locale %s doesn't end with UTF-8 in name\n", - save_input_locale)); - } + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "(%" LINE_Tf "): %s locale switched to %s\n", + caller_line, category_names[cat_index], new_locale)); -# ifdef WIN32 + return locale_to_restore_to; - /* http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756.aspx */ - if (memENDs(save_input_locale, final_pos, "65001")) { - DEBUG_L(PerlIO_printf(Perl_debug_log, - "Locale %s ends with 65001 in name, is UTF-8 locale\n", - save_input_locale)); - is_utf8 = TRUE; - goto finish_and_return; - } +# ifndef DEBUGGING + PERL_UNUSED_ARG(caller_line); +# endif -# endif - } -# endif +} + +STATIC void +S_restore_toggled_locale_i(pTHX_ const unsigned int cat_index, + const char * restore_locale, + const line_t caller_line) +{ + /* Restores the locale for LC_category corresponding to cat_indes to + * 'restore_locale' (which is a copy that will be freed by this function), + * or do nothing if the latter parameter is NULL */ - /* Other common encodings are the ISO 8859 series, which aren't UTF-8. But - * since we are about to return FALSE anyway, there is no point in doing - * this extra work */ + PERL_ARGS_ASSERT_RESTORE_TOGGLED_LOCALE_I; + assert(cat_index <= NOMINAL_LC_ALL_INDEX); -# if 0 - if (instr(save_input_locale, "8859")) { - DEBUG_L(PerlIO_printf(Perl_debug_log, - "Locale %s has 8859 in name, not UTF-8 locale\n", - save_input_locale)); - is_utf8 = FALSE; - goto finish_and_return; + if (restore_locale == NULL) { + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "(%" LINE_Tf "): No need to restore %s\n", + caller_line, category_names[cat_index])); + return; } -# endif - DEBUG_L(PerlIO_printf(Perl_debug_log, - "Assuming locale %s is not a UTF-8 locale\n", - save_input_locale)); - is_utf8 = FALSE; - -# endif /* the code that is compiled when no modern LC_CTYPE */ - - finish_and_return: - - /* Cache this result so we don't have to go through all this next time. */ - utf8ness_cache_size = sizeof(PL_locale_utf8ness) - - (utf8ness_cache - PL_locale_utf8ness); - - /* But we can't save it if it is too large for the total space available */ - if (LIKELY(input_name_len_with_overhead < utf8ness_cache_size)) { - Size_t utf8ness_cache_len = strlen(utf8ness_cache); - - /* Here it can fit, but we may need to clear out the oldest cached - * result(s) to do so. Check */ - if (utf8ness_cache_len + input_name_len_with_overhead - >= utf8ness_cache_size) - { - /* Here we have to clear something out to make room for this. - * Start looking at the rightmost place where it could fit and find - * the beginning of the entry that extends past that. */ - char * cutoff = (char *) my_memrchr(utf8ness_cache, - UTF8NESS_SEP[0], - utf8ness_cache_size - - input_name_len_with_overhead); - - assert(cutoff); - assert(cutoff >= utf8ness_cache); - - /* This and all subsequent entries must be removed */ - *cutoff = '\0'; - utf8ness_cache_len = strlen(utf8ness_cache); - } - - /* Make space for the new entry */ - Move(utf8ness_cache, - utf8ness_cache + input_name_len_with_overhead, - utf8ness_cache_len + 1 /* Incl. trailing NUL */, char); - - /* And insert it */ - Copy(delimited, utf8ness_cache, input_name_len_with_overhead - 1, char); - utf8ness_cache[input_name_len_with_overhead - 1] = is_utf8 + '0'; - - if ((PL_locale_utf8ness[strlen(PL_locale_utf8ness)-1] & ~1) != '0') { - Perl_croak(aTHX_ - "panic: %s: %d: Corrupt utf8ness_cache=%s\nlen=%zu," - " inserted_name=%s, its_len=%zu\n", - __FILE__, __LINE__, - PL_locale_utf8ness, strlen(PL_locale_utf8ness), - delimited, input_name_len_with_overhead); - } - } + DEBUG_Lv(PerlIO_printf(Perl_debug_log, + "(%" LINE_Tf "): %s restoring locale to %s\n", + caller_line, category_names[cat_index], + restore_locale)); -# ifdef DEBUGGING + void_setlocale_i(cat_index, restore_locale); - if (DEBUG_Lv_TEST) { - const char * s = PL_locale_utf8ness; +# ifndef DEBUGGING + PERL_UNUSED_ARG(caller_line); +# endif - /* Audit the structure */ - while (s < PL_locale_utf8ness + strlen(PL_locale_utf8ness)) { - const char *e; - - if (*s != UTF8NESS_SEP[0]) { - Perl_croak(aTHX_ - "panic: %s: %d: Corrupt utf8ness_cache: missing" - " separator %.*s<-- HERE %s\n", - __FILE__, __LINE__, - (int) (s - PL_locale_utf8ness), PL_locale_utf8ness, - s); - } - s++; - e = strchr(s, UTF8NESS_PREFIX[0]); - if (! e) { - e = PL_locale_utf8ness + strlen(PL_locale_utf8ness); - Perl_croak(aTHX_ - "panic: %s: %d: Corrupt utf8ness_cache: missing" - " separator %.*s<-- HERE %s\n", - __FILE__, __LINE__, - (int) (e - PL_locale_utf8ness), PL_locale_utf8ness, - e); - } - e++; - if (*e != '0' && *e != '1') { - Perl_croak(aTHX_ - "panic: %s: %d: Corrupt utf8ness_cache: utf8ness" - " must be [01] %.*s<-- HERE %s\n", - __FILE__, __LINE__, - (int) (e + 1 - PL_locale_utf8ness), - PL_locale_utf8ness, e + 1); - } - if (ninstr(PL_locale_utf8ness, s, s-1, e)) { - Perl_croak(aTHX_ - "panic: %s: %d: Corrupt utf8ness_cache: entry" - " has duplicate %.*s<-- HERE %s\n", - __FILE__, __LINE__, - (int) (e - PL_locale_utf8ness), PL_locale_utf8ness, - e); - } - s = e + 1; - } - } +} - if (DEBUG_Lv_TEST || debug_initialization) { - - PerlIO_printf(Perl_debug_log, - "PL_locale_utf8ness is now %s; returning %d\n", - PL_locale_utf8ness, is_utf8); - } +# ifdef USE_LOCALE_CTYPE -# endif +STATIC bool +S_is_codeset_name_UTF8(const char * name) +{ + /* Return a boolean as to if the passed-in name indicates it is a UTF-8 + * code set. Several variants are possible */ + const Size_t len = strlen(name); + + PERL_ARGS_ASSERT_IS_CODESET_NAME_UTF8; + +# ifdef WIN32 + + /* http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756.aspx */ + if (memENDs(name, len, "65001")) { + return TRUE; + } - /* free only when not using the buffer */ - if ( delimited != buffer ) Safefree(delimited); - Safefree(save_input_locale); - return is_utf8; +# endif + /* 'UTF8' or 'UTF-8' */ + return ( inRANGE(len, 4, 5) + && name[len-1] == '8' + && ( memBEGINs(name, len, "UTF") + || memBEGINs(name, len, "utf")) + && (len == 4 || name[3] == '-')); } -#endif +# endif +#endif /* USE_LOCALE */ bool Perl__is_in_locale_category(pTHX_ const bool compiling, const int category) @@ -5149,197 +6671,285 @@ Perl__is_in_locale_category(pTHX_ const return cBOOL(SvUV(these_categories) & (1U << (category + 1))); } -char * -Perl_my_strerror(pTHX_ const int errnum) +/* my_strerror() returns a mortalized copy of the text of the error message + * associated with 'errnum'. + * + * If not called from within the scope of 'use locale', it uses the text from + * the C locale. If Perl is compiled to not pay attention to LC_CTYPE nor + * LC_MESSAGES, it uses whatever strerror() returns. Otherwise the text is + * derived from the locale, LC_MESSAGES if we have that; LC_CTYPE if not. + * + * It returns in *utf8ness the result's UTF-8ness + * + * The function just calls strerror(), but temporarily switches locales, if + * needed. Many platforms require LC_CTYPE and LC_MESSAGES to be in the same + * CODESET in order for the return from strerror() to not contain '?' symbols, + * or worse, mojibaked. It's cheaper to just use the stricter criteria of + * being in the same locale. So the code below uses a common locale for both + * categories. Again, that is C if not within 'use locale' scope; or the + * LC_MESSAGES locale if in scope and we have that category; and LC_CTYPE if we + * don't have LC_MESSAGES; and whatever strerror returns if we don't have + * either category. + * + * There are two sets of implementations. The first below is if we have + * strerror_l(). This is the simpler. We just use the already-built C locale + * object if not in locale scope, or build up a custom one otherwise. + * + * When strerror_l() is not available, we may have to swap locales temporarily + * to bring the two categories into sync with each other, and possibly to the C + * locale. + * + * Because the prepropessing directives to conditionally compile this function + * would greatly obscure the logic of the various implementations, the whole + * function is repeated for each configuration, with some common macros. */ + +/* Used to shorten the definitions of the following implementations of + * my_strerror() */ +#define DEBUG_STRERROR_ENTER(errnum, in_locale) \ + DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ + "my_strerror called with errnum %d;" \ + " Within locale scope=%d\n", \ + errnum, in_locale)) +#define DEBUG_STRERROR_RETURN(errstr, utf8ness) \ + DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ + "Strerror returned; saving a copy: '%s';" \ + " utf8ness=%d\n", \ + get_displayable_string(errstr, \ + errstr + strlen(errstr), \ + *utf8ness), \ + (int) *utf8ness)) + +/* On platforms that have precisely one of these categories (Windows + * qualifies), these yield the correct one */ +#if defined(USE_LOCALE_CTYPE) +# define WHICH_LC_INDEX LC_CTYPE_INDEX_ +#elif defined(USE_LOCALE_MESSAGES) +# define WHICH_LC_INDEX LC_MESSAGES_INDEX_ +#endif + +/*==========================================================================*/ +/* First set of implementations, when have strerror_l() */ + +#if defined(USE_POSIX_2008_LOCALE) && defined(HAS_STRERROR_L) + +# if ! defined(USE_LOCALE_CTYPE) && ! defined(USE_LOCALE_MESSAGES) + +/* Here, neither category is defined: use the C locale */ +const char * +Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness) { - /* Returns a mortalized copy of the text of the error message associated - * with 'errnum'. It uses the current locale's text unless the platform - * doesn't have the LC_MESSAGES category or we are not being called from - * within the scope of 'use locale'. In the former case, it uses whatever - * strerror returns; in the latter case it uses the text from the C locale. - * - * The function just calls strerror(), but temporarily switches, if needed, - * to the C locale */ + PERL_ARGS_ASSERT_MY_STRERROR; + + DEBUG_STRERROR_ENTER(errnum, 0); + + const char *errstr = savepv(strerror_l(errnum, PL_C_locale_obj)); + *utf8ness = UTF8NESS_IMMATERIAL; + + DEBUG_STRERROR_RETURN(errstr, utf8ness); + + SAVEFREEPV(errstr); + return errstr; +} + +# elif ! defined(USE_LOCALE_CTYPE) || ! defined(USE_LOCALE_MESSAGES) + +/*--------------------------------------------------------------------------*/ + +/* Here one or the other of CTYPE or MESSAGES is defined, but not both. If we + * are not within 'use locale' scope of the only one defined, we use the C + * locale; otherwise use the current locale object */ - char *errstr; +const char * +Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness) +{ + PERL_ARGS_ASSERT_MY_STRERROR; -#ifndef USE_LOCALE_MESSAGES + DEBUG_STRERROR_ENTER(errnum, IN_LC(categories[WHICH_LC_INDEX])); - /* If platform doesn't have messages category, we don't do any switching to - * the C locale; we just use whatever strerror() returns */ + /* Use C if not within locale scope; Otherwise, use current locale */ + const locale_t which_obj = (IN_LC(categories[WHICH_LC_INDEX])) + ? PL_C_locale_obj + : use_curlocale_scratch(); + + const char *errstr = savepv(strerror_l(errnum, which_obj)); + *utf8ness = get_locale_string_utf8ness_i(errstr, LOCALE_UTF8NESS_UNKNOWN, + NULL, WHICH_LC_INDEX); + DEBUG_STRERROR_RETURN(errstr, utf8ness); - errstr = savepv(Strerror(errnum)); + SAVEFREEPV(errstr); + return errstr; +} -#else /* Has locale messages */ +/*--------------------------------------------------------------------------*/ +# else /* Are using both categories. Place them in the same CODESET, + * either C or the LC_MESSAGES locale */ - const bool within_locale_scope = IN_LC(LC_MESSAGES); +const char * +Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness) +{ + PERL_ARGS_ASSERT_MY_STRERROR; -# ifndef USE_ITHREADS + DEBUG_STRERROR_ENTER(errnum, IN_LC(LC_MESSAGES)); - /* This function is trivial without threads. */ - if (within_locale_scope) { - errstr = savepv(strerror(errnum)); + const char *errstr; + if (! IN_LC(LC_MESSAGES)) { /* Use C if not within locale scope */ + errstr = savepv(strerror_l(errnum, PL_C_locale_obj)); + *utf8ness = UTF8NESS_IMMATERIAL; } - else { - const char * save_locale = savepv(do_setlocale_c(LC_MESSAGES, NULL)); + else { /* Otherwise, use the LC_MESSAGES locale, making sure LC_CTYPE + matches */ + locale_t cur = duplocale(use_curlocale_scratch()); - do_setlocale_c(LC_MESSAGES, "C"); - errstr = savepv(strerror(errnum)); - do_setlocale_c(LC_MESSAGES, save_locale); - Safefree(save_locale); + cur = newlocale(LC_CTYPE_MASK, querylocale_c(LC_MESSAGES), cur); + errstr = savepv(strerror_l(errnum, cur)); + *utf8ness = get_locale_string_utf8ness_i(errstr, + LOCALE_UTF8NESS_UNKNOWN, + NULL, LC_MESSAGES_INDEX_); + freelocale(cur); } -# elif defined(USE_POSIX_2008_LOCALE) \ - && defined(HAS_STRERROR_L) + DEBUG_STRERROR_RETURN(errstr, utf8ness); + + SAVEFREEPV(errstr); + return errstr; +} +# endif /* Above is using strerror_l */ +/*==========================================================================*/ +#else /* Below is not using strerror_l */ +# if ! defined(USE_LOCALE_CTYPE) && ! defined(USE_LOCALE_MESSAGES) + +/* If not using using either of the categories, return plain, unadorned + * strerror */ + +const char * +Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness) +{ + PERL_ARGS_ASSERT_MY_STRERROR; + + DEBUG_STRERROR_ENTER(errnum, 0); + + const char *errstr = savepv(Strerror(errnum)); + *utf8ness = UTF8NESS_IMMATERIAL; + + DEBUG_STRERROR_RETURN(errstr, utf8ness); - /* This function is also trivial if we don't have to worry about thread - * safety and have strerror_l(), as it handles the switch of locales so we - * don't have to deal with that. We don't have to worry about thread - * safety if strerror_r() is also available. Both it and strerror_l() are - * thread-safe. Plain strerror() isn't thread safe. But on threaded - * builds when strerror_r() is available, the apparent call to strerror() - * below is actually a macro that behind-the-scenes calls strerror_r(). */ + SAVEFREEPV(errstr); + return errstr; +} + +/*--------------------------------------------------------------------------*/ +# elif ! defined(USE_LOCALE_CTYPE) || ! defined(USE_LOCALE_MESSAGES) + +/* Here one or the other of CTYPE or MESSAGES is defined, but not both. If we + * are not within 'use locale' scope of the only one defined, we use the C + * locale; otherwise use the current locale */ + +const char * +Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness) +{ + PERL_ARGS_ASSERT_MY_STRERROR; -# ifdef HAS_STRERROR_R + DEBUG_STRERROR_ENTER(errnum, IN_LC(categories[WHICH_LC_INDEX])); - if (within_locale_scope) { - errstr = savepv(strerror(errnum)); + const char *errstr; + if (IN_LC(categories[WHICH_LC_INDEX])) { + errstr = savepv(Strerror(errnum)); + *utf8ness = get_locale_string_utf8ness_i(errstr, + LOCALE_UTF8NESS_UNKNOWN, + NULL, WHICH_LC_INDEX); } else { - errstr = savepv(strerror_l(errnum, PL_C_locale_obj)); - } -# else + SETLOCALE_LOCK; - /* Here we have strerror_l(), but not strerror_r() and we are on a - * threaded-build. We use strerror_l() for everything, constructing a - * locale to pass to it if necessary */ + const char * orig_locale = toggle_locale_i(WHICH_LC_INDEX, "C"); - bool do_free = FALSE; - locale_t locale_to_use; + errstr = savepv(Strerror(errnum)); - if (within_locale_scope) { - locale_to_use = uselocale((locale_t) 0); - if (locale_to_use == LC_GLOBAL_LOCALE) { - locale_to_use = duplocale(LC_GLOBAL_LOCALE); - do_free = TRUE; - } - } - else { /* Use C locale if not within 'use locale' scope */ - locale_to_use = PL_C_locale_obj; - } + restore_toggled_locale_i(WHICH_LC_INDEX, orig_locale); - errstr = savepv(strerror_l(errnum, locale_to_use)); + SETLOCALE_UNLOCK; + + *utf8ness = UTF8NESS_IMMATERIAL; - if (do_free) { - freelocale(locale_to_use); } -# endif -# else /* Doesn't have strerror_l() */ + DEBUG_STRERROR_RETURN(errstr, utf8ness); - const char * save_locale = NULL; - bool locale_is_C = FALSE; + SAVEFREEPV(errstr); + return errstr; +} - /* We have a critical section to prevent another thread from executing this - * same code at the same time. (On thread-safe perls, the LOCK is a - * no-op.) Since this is the only place in core that changes LC_MESSAGES - * (unless the user has called setlocale(), this works to prevent races. */ - SETLOCALE_LOCK; +/*--------------------------------------------------------------------------*/ +# else - DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "my_strerror called with errnum %d\n", errnum)); - if (! within_locale_scope) { - save_locale = do_setlocale_c(LC_MESSAGES, NULL); - if (! save_locale) { - SETLOCALE_UNLOCK; - Perl_croak(aTHX_ - "panic: %s: %d: Could not find current LC_MESSAGES locale," - " errno=%d\n", __FILE__, __LINE__, errno); - } - else { - locale_is_C = isNAME_C_OR_POSIX(save_locale); +/* Below, have both LC_CTYPE and LC_MESSAGES. Place them in the same CODESET, + * either C or the LC_MESSAGES locale */ - /* Switch to the C locale if not already in it */ - if (! locale_is_C) { +const char * +Perl_my_strerror(pTHX_ const int errnum, utf8ness_t * utf8ness) +{ + PERL_ARGS_ASSERT_MY_STRERROR; - /* The setlocale() just below likely will zap 'save_locale', so - * create a copy. */ - save_locale = savepv(save_locale); - if (! do_setlocale_c(LC_MESSAGES, "C")) { - - /* If, for some reason, the locale change failed, we - * soldier on as best as possible under the circumstances, - * using the current locale, and clear save_locale, so we - * don't try to change back. On z/0S, all setlocale() - * calls fail after you've created a thread. This is their - * way of making sure the entire process is always a single - * locale. This means that 'use locale' is always in place - * for messages under these circumstances. */ - Safefree(save_locale); - save_locale = NULL; - } - } - } - } /* end of ! within_locale_scope */ - else { - DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s: %d: WITHIN locale scope\n", - __FILE__, __LINE__)); - } + DEBUG_STRERROR_ENTER(errnum, IN_LC(LC_MESSAGES)); - DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "Any locale change has been done; about to call Strerror\n")); - errstr = savepv(Strerror(errnum)); + const char * desired_locale = (IN_LC(LC_MESSAGES)) + ? querylocale_c(LC_MESSAGES) + : "C"; + /* XXX Can fail on z/OS */ - if (! within_locale_scope) { - if (save_locale && ! locale_is_C) { - if (! do_setlocale_c(LC_MESSAGES, save_locale)) { - SETLOCALE_UNLOCK; - Perl_croak(aTHX_ - "panic: %s: %d: setlocale restore to '%s' failed, errno=%d\n", - __FILE__, __LINE__, save_locale, errno); - } - Safefree(save_locale); - } - } + SETLOCALE_LOCK; - SETLOCALE_UNLOCK; + const char* orig_CTYPE_locale = toggle_locale_c(LC_CTYPE, desired_locale); + const char* orig_MESSAGES_locale = toggle_locale_c(LC_MESSAGES, + desired_locale); + const char *errstr = savepv(Strerror(errnum)); -# endif /* End of doesn't have strerror_l */ -# ifdef DEBUGGING + restore_toggled_locale_c(LC_MESSAGES, orig_MESSAGES_locale); + restore_toggled_locale_c(LC_CTYPE, orig_CTYPE_locale); - if (DEBUG_Lv_TEST) { - PerlIO_printf(Perl_debug_log, "Strerror returned; saving a copy: '"); - print_bytes_for_locale(errstr, errstr + strlen(errstr), 0); - PerlIO_printf(Perl_debug_log, "'\n"); - } + SETLOCALE_UNLOCK; -# endif -#endif /* End of does have locale messages */ + *utf8ness = get_locale_string_utf8ness_i(errstr, LOCALE_UTF8NESS_UNKNOWN, + NULL, LC_MESSAGES_INDEX_); + DEBUG_STRERROR_RETURN(errstr, utf8ness); SAVEFREEPV(errstr); return errstr; } +/*--------------------------------------------------------------------------*/ +# endif /* end of not using strerror_l() */ +#endif /* end of all the my_strerror() implementations */ + /* =for apidoc switch_to_global_locale -On systems without locale support, or on typical single-threaded builds, or on -platforms that do not support per-thread locale operations, this function does -nothing. On such systems that do have locale support, only a locale global to -the whole program is available. - -On multi-threaded builds on systems that do have per-thread locale operations, -this function converts the thread it is running in to use the global locale. -This is for code that has not yet or cannot be updated to handle multi-threaded -locale operation. As long as only a single thread is so-converted, everything -works fine, as all the other threads continue to ignore the global one, so only -this thread looks at it. - -However, on Windows systems this isn't quite true prior to Visual Studio 15, -at which point Microsoft fixed a bug. A race can occur if you use the -following operations on earlier Windows platforms: +This function copies the locale state of the calling thread into the program's +global locale, and converts the thread to use that global locale. + +It is intended so that Perl can safely be used with C libraries that access the +global locale and which can't be converted to not access it. Effectively, this +means libraries that call C> on non-Windows systems. (For +portability, it is a good idea to use it on Windows as well.) + +A downside of using it is that it disables the services that Perl provides to +hide locale gotchas from your code. The service you most likely will miss +regards the radix character (decimal point) in floating point numbers. Code +executed after this function is called can no longer just assume that this +character is correct for the current circumstances. + +To return to Perl control, and restart the gotcha prevention services, call +C>. Behavior is undefined for any pure Perl code that executes +while the switch is in effect. + +The global locale and the per-thread locales are independent. As long as just +one thread converts to the global locale, everything works smoothly. But if +more than one does, they can easily interfere with each other, and races are +likely. On Windows systems prior to Visual Studio 15 (at which point Microsoft +fixed a bug), races can occur (even if only one thread has been converted to +the global locale), but only if you use the following operations: =over @@ -5352,59 +6962,98 @@ following operations on earlier Windows =back The first item is not fixable (except by upgrading to a later Visual Studio -release), but it would be possible to work around the latter two items by using -the Windows API functions C and C; patches +release), but it would be possible to work around the latter two items by +having Perl change its algorithm for calculating these to use Windows API +functions (likely C and C); patches welcome. -Without this function call, threads that use the L> system -function will not work properly, as all the locale-sensitive functions will -look at the per-thread locale, and C will have no effect on this -thread. - -Perl code should convert to either call -L|perlapi/Perl_setlocale> (which is a drop-in for the system -C) or use the methods given in L to call +XS code should never call plain C, but should instead be converted +to either call L|perlapi/Perl_setlocale> (which is a drop-in +for the system C) or use the methods given in L to call L|POSIX/setlocale>. Either one will transparently properly handle all cases of single- vs multi-thread, POSIX 2008-supported or not. -Non-Perl libraries, such as C, that call the system C can -continue to work if this function is called before transferring control to the -library. - -Upon return from the code that needs to use the global locale, -L|perlapi/sync_locale> should be called to restore the safe -multi-thread operation. - =cut */ void -Perl_switch_to_global_locale() +Perl_switch_to_global_locale(pTHX) { -#ifdef USE_THREAD_SAFE_LOCALE -# ifdef WIN32 +#ifdef USE_LOCALE - _configthreadlocale(_DISABLE_PER_THREAD_LOCALE); + DEBUG_L(PerlIO_printf(Perl_debug_log, "Entering switch_to_global; %s\n", + get_LC_ALL_display())); + bool perl_controls = false; -# else -# ifdef HAS_QUERYLOCALE +# ifdef USE_THREAD_SAFE_LOCALE + + /* In these cases, we use the system state to determine if we are in the + * global locale or not. */ + +# ifdef USE_POSIX_2008_LOCALE - setlocale(LC_ALL, querylocale(LC_ALL_MASK, uselocale((locale_t) 0))); + perl_controls = (LC_GLOBAL_LOCALE != uselocale((locale_t) 0)); + +# elif defined(WIN32) + + perl_controls = (_configthreadlocale(0) == _ENABLE_PER_THREAD_LOCALE); # else +# error Unexpected Configuration +# endif +# endif - { - unsigned int i; + /* No-op if already in global */ + if (! perl_controls) { + return; + } - for (i = 0; i < LC_ALL_INDEX; i++) { - setlocale(categories[i], do_setlocale_r(categories[i], NULL)); - } +# ifdef USE_THREAD_SAFE_LOCALE +# if defined(WIN32) + + const char * thread_locale = posix_setlocale(LC_ALL, NULL); + _configthreadlocale(_DISABLE_PER_THREAD_LOCALE); + posix_setlocale(LC_ALL, thread_locale); + +# else /* Must be USE_POSIX_2008_LOCALE) */ + + const char * cur_thread_locales[NOMINAL_LC_ALL_INDEX + 1]; + + /* Save each category's current per-thread state */ + for (unsigned i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + cur_thread_locales[i] = querylocale_i(i); + } + + /* Now switch to global */ + DEBUG_Lv(PerlIO_printf(Perl_debug_log, "Switching to global locale\n")); + + locale_t old_locale = uselocale(LC_GLOBAL_LOCALE); + if (! old_locale) { + locale_panic_("Could not change to global locale"); + } + + /* Free the per-thread memory */ + if (old_locale != LC_GLOBAL_LOCALE && old_locale != PL_C_locale_obj) { + freelocale(old_locale); } + /* Set the global to what was our per-thread state */ + POSIX_SETLOCALE_LOCK; + for (unsigned int i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + posix_setlocale(categories[i], cur_thread_locales[i]); + } + POSIX_SETLOCALE_UNLOCK; + # endif +# endif +# ifdef USE_LOCALE_NUMERIC - uselocale(LC_GLOBAL_LOCALE); + /* Switch to the underlying C numeric locale; the application is on its + * own. */ + POSIX_SETLOCALE_LOCK; + posix_setlocale(LC_NUMERIC, PL_numeric_name); + POSIX_SETLOCALE_UNLOCK; # endif #endif @@ -5415,27 +7064,45 @@ Perl_switch_to_global_locale() =for apidoc sync_locale +This function copies the state of the program global locale into the calling +thread, and converts that thread to using per-thread locales, if it wasn't +already, and the platform supports them. The LC_NUMERIC locale is toggled into +the standard state (using the C locale's conventions), if not within the +lexical scope of S>. + +Perl will now consider itself to have control of the locale. + +Since unthreaded perls have only a global locale, this function is a no-op +without threads. + +This function is intended for use with C libraries that do locale manipulation. +It allows Perl to accommodate the use of them. Call this function before +transferring back to Perl space so that it knows what state the C code has left +things in. + +XS code should not manipulate the locale on its own. Instead, L|perlapi/Perl_setlocale> can be used at any time to query or change the locale (though changing the locale is antisocial and dangerous on multi-threaded systems that don't have multi-thread safe locale operations. -(See L). Using the system -L> should be avoided. Nevertheless, certain non-Perl libraries -called from XS, such as C do so, and this can't be changed. When the -locale is changed by XS code that didn't use -L|perlapi/Perl_setlocale>, Perl needs to be told that the -locale has changed. Use this function to do so, before returning to Perl. +(See L). + +Using the libc L> function should be avoided. Nevertheless, +certain non-Perl libraries called from XS, do call it, and their behavior may +not be able to be changed. This function, along with +C>, can be used to get seamless behavior in these +circumstances, as long as only one thread is involved. + +If the library has an option to turn off its locale manipulation, doing that is +preferable to using this mechanism. C is such a library. The return value is a boolean: TRUE if the global locale at the time of call -was in effect; and FALSE if a per-thread locale was in effect. This can be -used by the caller that needs to restore things as-they-were to decide whether -or not to call -L|perlapi/switch_to_global_locale>. +was in effect for the caller; and FALSE if a per-thread locale was in effect. =cut */ bool -Perl_sync_locale() +Perl_sync_locale(pTHX) { #ifndef USE_LOCALE @@ -5444,77 +7111,52 @@ Perl_sync_locale() #else - const char * newlocale; - dTHX; - -# ifdef USE_POSIX_2008_LOCALE + bool was_in_global = TRUE; - bool was_in_global_locale = FALSE; - locale_t cur_obj = uselocale((locale_t) 0); +# ifdef USE_THREAD_SAFE_LOCALE +# if defined(WIN32) - /* On Windows, unless the foreign code has turned off the thread-safe - * locale setting, any plain setlocale() will have affected what we see, so - * no need to worry. Otherwise, If the foreign code has done a plain - * setlocale(), it will only affect the global locale on POSIX systems, but - * will affect the */ - if (cur_obj == LC_GLOBAL_LOCALE) { + was_in_global = _configthreadlocale(_DISABLE_PER_THREAD_LOCALE) + == _DISABLE_PER_THREAD_LOCALE; -# ifdef HAS_QUERY_LOCALE +# elif defined(USE_POSIX_2008_LOCALE) - do_setlocale_c(LC_ALL, setlocale(LC_ALL, NULL)); + was_in_global = (LC_GLOBAL_LOCALE == uselocale((locale_t) 0)); # else - - unsigned int i; - - /* We can't trust that we can read the LC_ALL format on the - * platform, so do them individually */ - for (i = 0; i < LC_ALL_INDEX; i++) { - do_setlocale_r(categories[i], setlocale(categories[i], NULL)); - } - +# error Unexpected Configuration # endif +# endif /* USE_THREAD_SAFE_LOCALE */ - was_in_global_locale = TRUE; + /* Here, we are in the global locale. Get and save the values for each + * category. */ + const char * current_globals[NOMINAL_LC_ALL_INDEX]; + for (unsigned i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + POSIX_SETLOCALE_LOCK; + current_globals[i] = savepv(stdized_setlocale(categories[i], NULL)); + POSIX_SETLOCALE_UNLOCK; } -# else - - bool was_in_global_locale = TRUE; - -# endif -# ifdef USE_LOCALE_CTYPE - - newlocale = savepv(do_setlocale_c(LC_CTYPE, NULL)); - DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "%s:%d: %s\n", __FILE__, __LINE__, - setlocale_debug_string(LC_CTYPE, NULL, newlocale))); - new_ctype(newlocale); - Safefree(newlocale); + /* Now we have to convert the current thread to use them */ -# endif /* USE_LOCALE_CTYPE */ -# ifdef USE_LOCALE_COLLATE +# if defined(WIN32) - newlocale = savepv(do_setlocale_c(LC_COLLATE, NULL)); - DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "%s:%d: %s\n", __FILE__, __LINE__, - setlocale_debug_string(LC_COLLATE, NULL, newlocale))); - new_collate(newlocale); - Safefree(newlocale); + /* On Windows, convert to per-thread behavior. This isn't necessary in + * POSIX 2008, as the conversion gets done automatically in the loop below. + * */ + _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); # endif -# ifdef USE_LOCALE_NUMERIC - newlocale = savepv(do_setlocale_c(LC_NUMERIC, NULL)); - DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "%s:%d: %s\n", __FILE__, __LINE__, - setlocale_debug_string(LC_NUMERIC, NULL, newlocale))); - new_numeric(newlocale); - Safefree(newlocale); + for (unsigned i = 0; i < NOMINAL_LC_ALL_INDEX; i++) { + setlocale_i(i, current_globals[i]); + Safefree(current_globals[i]); + } -# endif /* USE_LOCALE_NUMERIC */ + /* And update our remaining records. 'true' => force recalculation */ + new_LC_ALL(NULL, true); - return was_in_global_locale; + return was_in_global; #endif @@ -5523,75 +7165,127 @@ Perl_sync_locale() #if defined(DEBUGGING) && defined(USE_LOCALE) STATIC char * -S_setlocale_debug_string(const int category, /* category number, - like LC_ALL */ - const char* const locale, /* locale name */ - - /* return value from setlocale() when attempting to - * set 'category' to 'locale' */ - const char* const retval) +S_my_setlocale_debug_string_i(pTHX_ + const unsigned cat_index, + const char* locale, /* Optional locale name */ + + /* return value from setlocale() when attempting + * to set 'category' to 'locale' */ + const char* retval, + + const line_t line) { /* Returns a pointer to a NUL-terminated string in static storage with * added text about the info passed in. This is not thread safe and will * be overwritten by the next call, so this should be used just to * formulate a string to immediately print or savepv() on. */ - static char ret[256]; + const char * locale_quote; + const char * retval_quote; - my_strlcpy(ret, "setlocale(", sizeof(ret)); - my_strlcat(ret, category_name(category), sizeof(ret)); - my_strlcat(ret, ", ", sizeof(ret)); + assert(cat_index <= NOMINAL_LC_ALL_INDEX); - if (locale) { - my_strlcat(ret, "\"", sizeof(ret)); - my_strlcat(ret, locale, sizeof(ret)); - my_strlcat(ret, "\"", sizeof(ret)); + if (locale == NULL) { + locale_quote = ""; + locale = "NULL"; } else { - my_strlcat(ret, "NULL", sizeof(ret)); + locale_quote = "\""; } - my_strlcat(ret, ") returned ", sizeof(ret)); - - if (retval) { - my_strlcat(ret, "\"", sizeof(ret)); - my_strlcat(ret, retval, sizeof(ret)); - my_strlcat(ret, "\"", sizeof(ret)); + if (retval == NULL) { + retval_quote = ""; + retval = "NULL"; } else { - my_strlcat(ret, "NULL", sizeof(ret)); + retval_quote = "\""; } - assert(strlen(ret) < sizeof(ret)); +# ifdef USE_LOCALE_THREADS +# define THREAD_FORMAT "%p:" +# define THREAD_ARGUMENT aTHX_ +# else +# define THREAD_FORMAT +# define THREAD_ARGUMENT +# endif - return ret; + return Perl_form(aTHX_ + "%s:%" LINE_Tf ": " THREAD_FORMAT + " setlocale(%s[%d], %s%s%s) returned %s%s%s\n", + + __FILE__, line, THREAD_ARGUMENT + category_names[cat_index], categories[cat_index], + locale_quote, locale, locale_quote, + retval_quote, retval, retval_quote); } #endif +#ifdef USE_PERL_SWITCH_LOCALE_CONTEXT void -Perl_thread_locale_init() +Perl_switch_locale_context() { - /* Called from a thread on startup*/ + /* libc keeps per-thread locale status information in some configurations. + * So, we can't just switch out aTHX to switch to a new thread. libc has + * to follow along. This routine does that based on per-interpreter + * variables we keep just for this purpose */ -#ifdef USE_THREAD_SAFE_LOCALE + /* Can't use pTHX, because we may be called from a place where that + * isn't available */ + dTHX; - dTHX_DEBUGGING; + if (UNLIKELY( aTHX == NULL + || PL_veto_switch_non_tTHX_context + || PL_phase == PERL_PHASE_CONSTRUCT)) + { + return; + } - /* C starts the new thread in the global C locale. If we are thread-safe, - * we want to not be in the global locale */ +# ifdef USE_POSIX_2008_LOCALE - DEBUG_L(PerlIO_printf(Perl_debug_log, - "%s:%d: new thread, initial locale is %s; calling setlocale\n", - __FILE__, __LINE__, setlocale(LC_ALL, NULL))); + if (! uselocale(PL_cur_locale_obj)) { + locale_panic_(Perl_form(aTHX_ + "Can't uselocale(%p), LC_ALL supposed to be '%s", + PL_cur_locale_obj, get_LC_ALL_display())); + } -# ifdef WIN32 +# elif defined(WIN32) - _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); + if (! bool_setlocale_c(LC_ALL, PL_cur_LC_ALL)) { + locale_panic_(Perl_form(aTHX_ "Can't setlocale(%s)", PL_cur_LC_ALL)); + } -# else +# endif + +} + +#endif + +void +Perl_thread_locale_init(pTHX) +{ + +#ifdef USE_THREAD_SAFE_LOCALE +# ifdef USE_POSIX_2008_LOCALE + + /* Called from a thread on startup. + * + * The operations here have to be done from within the calling thread, as + * they affect libc's knowledge of the thread; libc has no knowledge of + * aTHX */ + + DEBUG_L(PerlIO_printf(Perl_debug_log, + "new thread, initial locale is %s;" + " calling setlocale(LC_ALL, \"C\")\n", + get_LC_ALL_display())); + + uselocale(PL_C_locale_obj); - Perl_setlocale(LC_ALL, "C"); +# elif defined(WIN32) + + /* On Windows, make sure new thread has per-thread locales enabled */ + _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); + void_setlocale_c(LC_ALL, "C"); # endif #endif @@ -5599,25 +7293,36 @@ Perl_thread_locale_init() } void -Perl_thread_locale_term() +Perl_thread_locale_term(pTHX) { - /* Called from a thread as it gets ready to terminate */ + /* Called from a thread as it gets ready to terminate. + * + * The operations here have to be done from within the calling thread, as + * they affect libc's knowledge of the thread; libc has no knowledge of + * aTHX */ -#ifdef USE_THREAD_SAFE_LOCALE +#ifdef USE_POSIX_2008_LOCALE /* C starts the new thread in the global C locale. If we are thread-safe, * we want to not be in the global locale */ -# ifndef WIN32 + /* Free up */ + locale_t actual_obj = uselocale(LC_GLOBAL_LOCALE); + if (actual_obj != LC_GLOBAL_LOCALE && actual_obj != PL_C_locale_obj) { + freelocale(actual_obj); + } - { /* Free up */ - locale_t cur_obj = uselocale(LC_GLOBAL_LOCALE); - if (cur_obj != LC_GLOBAL_LOCALE && cur_obj != PL_C_locale_obj) { - freelocale(cur_obj); - } + /* Prevent leaks even if something has gone wrong */ + locale_t expected_obj = PL_cur_locale_obj; + if (UNLIKELY( expected_obj != actual_obj + && expected_obj != LC_GLOBAL_LOCALE + && expected_obj != PL_C_locale_obj)) + { + freelocale(expected_obj); } -# endif + PL_cur_locale_obj = LC_GLOBAL_LOCALE; + #endif } Index: gnu/usr.bin/perl/make_patchnum.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/make_patchnum.pl,v diff -u -p -a -u -p -r1.3 make_patchnum.pl --- gnu/usr.bin/perl/make_patchnum.pl 1 Mar 2021 23:19:43 -0000 1.3 +++ gnu/usr.bin/perl/make_patchnum.pl 21 Feb 2024 15:47:02 -0000 @@ -51,14 +51,6 @@ our $opt_v = scalar grep $_ eq '-v', @AR BEGIN { my $root="."; - # test 1st to see if we're a -Dmksymlinks target dir - $subcd = ''; - $srcdir = $root; - if (-l "./Configure") { - $srcdir = readlink("./Configure"); - $srcdir =~ s/Configure//; - $subcd = "cd $srcdir &&"; # activate backtick fragment - } while (!-e "$root/perl.c" and length($root)<100) { if ($root eq '.') { $root=".."; @@ -68,6 +60,15 @@ BEGIN { } die "Can't find toplevel" if !-e "$root/perl.c"; sub path_to { "$root/$_[0]" } # use $_[0] if this'd be placed in toplevel. + + # test to see if we're a -Dmksymlinks target dir + $subcd = ''; + $srcdir = $root; + if (-l "$root/Configure") { + $srcdir = readlink("$root/Configure"); + $srcdir =~ s/Configure//; + $subcd = "cd $srcdir &&"; # activate backtick fragment + } } sub read_file { @@ -161,8 +162,7 @@ elsif ($git_patch_file = read_file(".git $commit_title = "Snapshot of:"; } elsif (-d "$srcdir/.git") { - # git branch | awk 'BEGIN{ORS=""} /\*/ { print $2 }' - ($branch) = map { /\* ([^(]\S*)/ ? $1 : () } backtick("git branch"); + ($branch) = backtick("git symbolic-ref -q HEAD") =~ m#^refs/heads/(.+)$#; $branch //= ""; my ($remote,$merge); if (length $branch) { Index: gnu/usr.bin/perl/makedef.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/makedef.pl,v diff -u -p -a -u -p -r1.17 makedef.pl --- gnu/usr.bin/perl/makedef.pl 8 Jul 2023 14:18:35 -0000 1.17 +++ gnu/usr.bin/perl/makedef.pl 21 Feb 2024 15:47:02 -0000 @@ -33,6 +33,7 @@ use strict; use Config; +use warnings; my $fold; my %ARGS; @@ -66,14 +67,19 @@ BEGIN { die "PLATFORM must be one of: @PLATFORM\n" unless exists $PLATFORM{$ARGS{PLATFORM}}; } + use constant PLATFORM => $ARGS{PLATFORM}; +# This makes us able to use, e.g., $define{WIN32}, so you don't have to +# remember what things came from %ARGS. +$define{uc $ARGS{'PLATFORM'}} = 1; + require "./$ARGS{TARG_DIR}regen/embed_lib.pl"; # Is the following guard strictly necessary? Added during refactoring # to keep the same behaviour when merging other code into here. process_cc_flags(@Config{qw(ccflags optimize)}) - if $ARGS{PLATFORM} ne 'win32'; + if PLATFORM ne 'win32'; # Add the compile-time options that miniperl was built with to %define. # On Win32 these are not the same options as perl itself will be built @@ -85,7 +91,7 @@ process_cc_flags(@Config{qw(ccflags opti # minimal configs that don't include any of those options. my @options = sort(Config::bincompat_options(), Config::non_bincompat_options()); -print STDERR "Options: (@options)\n" unless $ARGS{PLATFORM} eq 'test'; +print STDERR "Options: (@options)\n" unless PLATFORM eq 'test'; $define{$_} = 1 foreach @options; my %exportperlmalloc = @@ -96,7 +102,7 @@ my %exportperlmalloc = Perl_calloc => "calloc", ); -my $exportperlmalloc = $ARGS{PLATFORM} eq 'os2'; +my $exportperlmalloc = PLATFORM eq 'os2'; my $config_h = 'config.h'; open(CFG, '<', $config_h) || die "Cannot open $config_h: $!\n"; @@ -107,8 +113,10 @@ while () { } close(CFG); +#========================================================================== # perl.h logic duplication begins + if ($define{USE_ITHREADS}) { if (!$define{MULTIPLICITY}) { $define{MULTIPLICITY} = 1; @@ -119,7 +127,7 @@ $define{MULTIPLICITY} ||= $define{USE_ITHREADS} || $define{PERL_IMPLICIT_CONTEXT} ; -if ($define{USE_ITHREADS} && $ARGS{PLATFORM} ne 'win32') { +if ($define{USE_ITHREADS} && ! $define{WIN32}) { $define{USE_REENTRANT_API} = 1; } @@ -140,36 +148,66 @@ if (! $define{NO_LOCALE}) { # https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering my $cctype = $ARGS{CCTYPE} =~ s/MSVC//r; -if (! $define{HAS_SETLOCALE} && $define{HAS_POSIX_2008_LOCALE}) { +if ($define{USE_ITHREADS} && ! $define{NO_LOCALE_THREADS}) { + $define{USE_LOCALE_THREADS} = 1; +} + +if ( $define{HAS_POSIX_2008_LOCALE} + && ( ! $define{HAS_SETLOCALE} || ( $define{USE_LOCALE_THREADS} + && ! $define{NO_POSIX_2008_LOCALE}))) +{ $define{USE_POSIX_2008_LOCALE} = 1; - $define{USE_THREAD_SAFE_LOCALE} = 1; } -elsif ( ($define{USE_ITHREADS} || $define{USE_THREAD_SAFE_LOCALE}) - && ( $define{HAS_POSIX_2008_LOCALE} - || ($ARGS{PLATFORM} eq 'win32' && ( $cctype !~ /\D/ - && $cctype >= 80))) - && ! $define{NO_THREAD_SAFE_LOCALE}) + +if ($define{USE_LOCALE_THREADS} && ! $define{NO_THREAD_SAFE_LOCALE}) { - $define{USE_THREAD_SAFE_LOCALE} = 1 unless $define{USE_THREAD_SAFE_LOCALE}; - $define{USE_POSIX_2008_LOCALE} = 1 if $define{HAS_POSIX_2008_LOCALE}; + if ( $define{USE_POSIX_2008_LOCALE} + || ($define{WIN32} && ( $cctype !~ /\D/ + && $cctype >= 80))) + { + $define{USE_THREAD_SAFE_LOCALE} = 1; + } +} + +if ($define{USE_POSIX_2008_LOCALE} && $define{HAS_QUERYLOCALE}) +{ + $define{USE_QUERYLOCALE} = 1; + + # Don't need glibc only code from perl.h +} + +if ($define{USE_POSIX_2008_LOCALE} && ! $define{USE_QUERYLOCALE}) +{ + $define{USE_PL_CURLOCALES} = 1; + $define{USE_PL_CUR_LC_ALL} = 1; +} + +if ($define{WIN32} && $define{USE_THREAD_SAFE_LOCALE}) +{ + $define{USE_PL_CUR_LC_ALL} = 1; + + if ($cctype < 140) { + $define{TS_W32_BROKEN_LOCALECONV} = 1; + } } -if ( $ARGS{PLATFORM} eq 'win32' - && $define{USE_THREAD_SAFE_LOCALE} - && $cctype < 140) +if ($define{MULTIPLICITY} && ( $define{USE_POSIX_2008_LOCALE} + || ( $define{WIN32} + && $define{USE_THREAD_SAFE_LOCALE}))) { - $define{TS_W32_BROKEN_LOCALECONV} = 1; + $define{USE_PERL_SWITCH_LOCALE_CONTEXT} = 1; } # perl.h logic duplication ends +#========================================================================== print STDERR "Defines: (" . join(' ', sort keys %define) . ")\n" - unless $ARGS{PLATFORM} eq 'test'; + unless PLATFORM eq 'test'; my $sym_ord = 0; my %ordinal; -if ($ARGS{PLATFORM} eq 'os2') { +if (PLATFORM eq 'os2') { if (open my $fh, '<', 'perl5.def') { while (<$fh>) { last if /^\s*EXPORTS\b/; @@ -219,7 +257,7 @@ sub readvar { } } -if ($ARGS{PLATFORM} ne 'os2') { +if (PLATFORM ne 'os2') { ++$skip{$_} foreach qw( PL_opsave Perl_dump_fds @@ -232,7 +270,7 @@ if ($ARGS{PLATFORM} ne 'os2') { Perl_my_ntohl Perl_my_swap ); - if ($ARGS{PLATFORM} eq 'vms') { + if (PLATFORM eq 'vms') { ++$skip{PL_statusvalue_posix}; # This is a wrapper if we have symlink, not a replacement # if we don't. @@ -240,7 +278,7 @@ if ($ARGS{PLATFORM} ne 'os2') { } else { ++$skip{PL_statusvalue_vms}; ++$skip{PL_perllib_sep}; - if ($ARGS{PLATFORM} ne 'aix') { + if (PLATFORM ne 'aix') { ++$skip{$_} foreach qw( PL_DBcv PL_generation @@ -252,14 +290,14 @@ if ($ARGS{PLATFORM} ne 'os2') { } } -if ($ARGS{PLATFORM} ne 'vms') { +if (PLATFORM ne 'vms') { # VMS does its own thing for these symbols. ++$skip{$_} foreach qw( PL_sig_handlers_initted PL_sig_ignoring PL_sig_defaulting ); - if ($ARGS{PLATFORM} ne 'win32') { + if (PLATFORM ne 'win32') { ++$skip{$_} foreach qw( Perl_do_spawn Perl_do_spawn_nowait @@ -268,9 +306,12 @@ if ($ARGS{PLATFORM} ne 'vms') { } } -if ($ARGS{PLATFORM} ne 'win32') { +if (PLATFORM ne 'win32') { ++$skip{$_} foreach qw( - Perl_my_setlocale + Perl_get_context + Perl_get_win32_message_utf8ness + Perl_Win_utf8_string_to_wstring + Perl_Win_wstring_to_utf8_string ); } @@ -286,7 +327,6 @@ unless ($define{'DEBUGGING'}) { Perl_debstackptrs Perl_pad_sv Perl_pad_setsv - Perl__setlocale_debug_string Perl_set_padlist Perl_hv_assert PL_watchaddr @@ -353,10 +393,6 @@ else { ); } -if ($define{'PERL_USE_SAFE_PUTENV'}) { - ++$skip{PL_use_safe_putenv}; -} - unless ($define{'USE_ITHREADS'}) { ++$skip{PL_thr_key}; ++$skip{PL_user_prop_mutex}; @@ -367,6 +403,7 @@ unless ($define{'USE_ITHREADS'}) { ++$skip{$_} foreach qw( PL_keyword_plugin_mutex PL_check_mutex + PL_cur_locale_obj PL_op_mutex PL_regex_pad PL_regex_padav @@ -374,13 +411,13 @@ unless ($define{'USE_ITHREADS'}) { PL_env_mutex PL_hints_mutex PL_locale_mutex - PL_lc_numeric_mutex - PL_lc_numeric_mutex_depth + PL_locale_mutex_depth PL_my_ctx_mutex PL_perlio_mutex PL_stashpad PL_stashpadix PL_stashpadmax + PL_veto_switch_non_tTHX_context Perl_alloccopstash Perl_allocfilegv Perl_clone_params_del @@ -409,23 +446,32 @@ unless ($define{'USE_ITHREADS'}) { ); } -if ( $define{NO_LOCALE} - || (! $define{USE_ITHREADS} && ! $define{USE_THREAD_SAFE_LOCALE})) +unless ($define{USE_POSIX_2008_LOCALE}) { ++$skip{$_} foreach qw( PL_C_locale_obj + PL_scratch_locale_obj + PL_underlying_numeric_obj + ); +} +unless ($define{USE_PL_CURLOCALES}) +{ + ++$skip{$_} foreach qw( PL_curlocales ); } -unless ( $define{'HAS_NEWLOCALE'} - && $define{'HAS_FREELOCALE'} - && $define{'HAS_USELOCALE'} - && ! $define{'NO_POSIX_2008_LOCALE'}) +unless ($define{USE_PL_CUR_LC_ALL}) { ++$skip{$_} foreach qw( - PL_C_locale_obj - PL_underlying_numeric_obj + PL_cur_LC_ALL + ); +} + +unless ($define{USE_PERL_SWITCH_LOCALE_CONTEXT}) +{ + ++$skip{$_} foreach qw( + Perl_switch_locale_context ); } @@ -454,11 +500,6 @@ unless ($define{'MULTIPLICITY'}) { ); } -if ($define{USE_THREAD_SAFE_LOCALE}) { - ++$skip{PL_lc_numeric_mutex}; - ++$skip{PL_lc_numeric_mutex_depth}; -} - unless ($define{'USE_DTRACE'}) { ++$skip{$_} foreach qw( Perl_dtrace_probe_call @@ -517,14 +558,14 @@ unless ($define{HAS_MMAP}) { if ($define{HAS_SIGACTION}) { ++$skip{PL_sig_trapped}; - if ($ARGS{PLATFORM} eq 'vms') { + if (PLATFORM eq 'vms') { # FAKE_PERSISTENT_SIGNAL_HANDLERS defined as !defined(HAS_SIGACTION) ++$skip{PL_sig_ignoring}; ++$skip{PL_sig_handlers_initted} unless $define{KILL_BY_SIGPRC}; } } -if ($ARGS{PLATFORM} eq 'vms' && !$define{KILL_BY_SIGPRC}) { +if (PLATFORM eq 'vms' && !$define{KILL_BY_SIGPRC}) { # FAKE_DEFAULT_SIGNAL_HANDLERS defined as KILL_BY_SIGPRC ++$skip{Perl_csighandler_init}; ++$skip{Perl_my_kill}; @@ -550,21 +591,24 @@ unless ($define{USE_LOCALE_COLLATE}) { PL_strxfrm_NUL_replacement PL_strxfrm_is_behaved PL_strxfrm_max_cp + PL_in_utf8_COLLATE_locale ); } unless ($define{USE_LOCALE_NUMERIC}) { ++$skip{$_} foreach qw( - PL_numeric_local - PL_numeric_name - PL_numeric_radix_sv - PL_numeric_standard - PL_numeric_underlying - PL_numeric_underlying_is_standard PL_underlying_numeric_obj ); } +unless ($define{USE_LOCALE_CTYPE}) { + ++$skip{$_} foreach qw( + PL_ctype_name + PL_in_utf8_CTYPE_locale + PL_in_utf8_turkic_locale + ); +} + unless ($define{'USE_C_BACKTRACE'}) { ++$skip{Perl_get_c_backtrace_dump}; ++$skip{Perl_dump_c_backtrace}; @@ -706,11 +750,13 @@ unless ($Config{d_wcrtomb}) { { my %seen; - my ($embed) = setup_embed($ARGS{TARG_DIR}); - my $excludedre = $define{'NO_MATHOMS'} ? qr/[emiIb]/ : qr/[emiI]/; + my ($embed_array) = setup_embed($ARGS{TARG_DIR}); + my $excludedre = $define{'NO_MATHOMS'} ? qr/[emiIsb]/ : qr/[emiIs]/; - foreach (@$embed) { - my ($flags, $retval, $func, @args) = @$_; + foreach (@$embed_array) { + my $embed= $_->{embed} + or next; + my ($flags, $retval, $func, $args) = @{$embed}{qw(flags return_type name args)}; next unless $func; if (($flags =~ /[AXC]/ && $flags !~ $excludedre) || (!$define{'NO_MATHOMS'} && $flags =~ /b/)) @@ -723,7 +769,7 @@ unless ($Config{d_wcrtomb}) { # mean "don't export" next if $seen{$func}++; # Should we also skip adding the Perl_ prefix if $flags =~ /o/ ? - $func = "Perl_$func" if ($flags =~ /[pX]/ && $func !~ /^Perl_/); + $func = "Perl_$func" if ($flags =~ /[psX]/ && $func !~ /^Perl_/); ++$export{$func} unless exists $skip{$func}; } } @@ -757,7 +803,7 @@ try_symbols(qw( PerlIO_tmpfile )); -if ($ARGS{PLATFORM} eq 'win32') { +if (PLATFORM eq 'win32') { try_symbols(qw( win32_free_childdir win32_free_childenv @@ -922,7 +968,7 @@ if ($ARGS{PLATFORM} eq 'win32') { win32_readlink )); } -elsif ($ARGS{PLATFORM} eq 'vms') { +elsif (PLATFORM eq 'vms') { try_symbols(qw( Perl_cando Perl_cando_by_name @@ -1007,7 +1053,7 @@ elsif ($ARGS{PLATFORM} eq 'vms') { PerlIO_openn )); } -elsif ($ARGS{PLATFORM} eq 'os2') { +elsif (PLATFORM eq 'os2') { try_symbols(qw( ctermid get_sysinfo @@ -1083,7 +1129,7 @@ elsif ($ARGS{PLATFORM} eq 'os2') { # static extensions with -fPIC, but links them to perl, not libperl.so # The VMS build scripts don't yet implement static extensions at all. -if ($ARGS{PLATFORM} eq 'win32') { +if (PLATFORM eq 'win32') { # records of type boot_module for statically linked modules (except Dynaloader) my $static_ext = $Config{static_ext} // ""; $static_ext =~ s/\//__/g; @@ -1092,7 +1138,7 @@ if ($ARGS{PLATFORM} eq 'win32') { try_symbols("init_Win32CORE") if $static_ext =~ /\bWin32CORE\b/; } -if ($ARGS{PLATFORM} eq 'os2') { +if (PLATFORM eq 'os2') { my (%mapped, @missing); open MAP, '<', 'miniperl.map' or die 'Cannot read miniperl.map'; /^\s*[\da-f:]+\s+(\w+)/i and $mapped{$1}++ foreach ; @@ -1110,7 +1156,7 @@ if ($ARGS{PLATFORM} eq 'os2') { # Start with platform specific headers: -if ($ARGS{PLATFORM} eq 'win32') { +if (PLATFORM eq 'win32') { my $dll = $define{PERL_DLL} ? $define{PERL_DLL} =~ s/\.dll$//ir : "perl$Config{api_revision}$Config{api_version}"; print "LIBRARY $dll\n"; @@ -1121,7 +1167,7 @@ if ($ARGS{PLATFORM} eq 'win32') { } print "EXPORTS\n"; } -elsif ($ARGS{PLATFORM} eq 'os2') { +elsif (PLATFORM eq 'os2') { (my $v = $]) =~ s/(\d\.\d\d\d)(\d\d)$/$1_$2/; $v .= '-thread' if $Config{archname} =~ /-thread/; (my $dll = $define{PERL_DLL}) =~ s/\.dll$//i; @@ -1137,7 +1183,7 @@ DATA LOADONCALL NONSHARED MULTIPLE EXPORTS ---EOP--- } -elsif ($ARGS{PLATFORM} eq 'aix') { +elsif (PLATFORM eq 'aix') { my $OSVER = `uname -v`; chop $OSVER; my $OSREL = `uname -r`; @@ -1176,7 +1222,7 @@ foreach my $symbol (@symbols) { # Then platform specific footers. -if ($ARGS{PLATFORM} eq 'os2') { +if (PLATFORM eq 'os2') { print <=7 for ALIGN==4, and k>=8 if ALIGN=8. @@ -812,7 +812,7 @@ static int getpages_adjacent(MEM_SIZE re * smallest allocatable block is 8 bytes. The overhead information * precedes the data area returned to the user. */ -#define NBUCKETS (BITS_IN_PTR*BUCKETS_PER_POW2 + 1) +#define NBUCKETS (BITS_IN_PTR*BUCKETS_PER_POW2 + 1) static union overhead *nextf[NBUCKETS]; #if defined(PURIFY) && !defined(USE_PERL_SBRK) @@ -1059,7 +1059,7 @@ emergency_sbrk(MEM_SIZE size) #ifdef DEBUGGING #undef ASSERT -#define ASSERT(p,diag) if (!(p)) botch(diag,STRINGIFY(p),__FILE__,__LINE__); +#define ASSERT(p,diag) if (!(p)) botch(diag,STRINGIFY(p),__FILE__,__LINE__); static void botch(const char *diag, const char *s, const char *file, int line) @@ -1095,7 +1095,7 @@ botch(const char *diag, const char *s, c } } #else -#define ASSERT(p, diag) +#define ASSERT(p, diag) #endif #ifdef MALLOC_FILL Index: gnu/usr.bin/perl/mathoms.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/mathoms.c,v diff -u -p -a -u -p -r1.6 mathoms.c --- gnu/usr.bin/perl/mathoms.c 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/mathoms.c 21 Feb 2024 15:47:02 -0000 @@ -301,110 +301,13 @@ Perl_sv_catsv_mg(pTHX_ SV *dsv, SV *sstr /* =for apidoc_section $SV -=for apidoc sv_iv - -A private implementation of the C macro for compilers which can't -cope with complex macro expressions. Always use the macro instead. - -=cut -*/ - -IV -Perl_sv_iv(pTHX_ SV *sv) -{ - PERL_ARGS_ASSERT_SV_IV; - - if (SvIOK(sv)) { - if (SvIsUV(sv)) - return (IV)SvUVX(sv); - return SvIVX(sv); - } - return sv_2iv(sv); -} - -/* -=for apidoc_section $SV -=for apidoc sv_uv - -A private implementation of the C macro for compilers which can't -cope with complex macro expressions. Always use the macro instead. - -=cut -*/ - -UV -Perl_sv_uv(pTHX_ SV *sv) -{ - PERL_ARGS_ASSERT_SV_UV; - - if (SvIOK(sv)) { - if (SvIsUV(sv)) - return SvUVX(sv); - return (UV)SvIVX(sv); - } - return sv_2uv(sv); -} - -/* -=for apidoc_section $SV -=for apidoc sv_nv - -A private implementation of the C macro for compilers which can't -cope with complex macro expressions. Always use the macro instead. - -=cut -*/ - -NV -Perl_sv_nv(pTHX_ SV *sv) -{ - PERL_ARGS_ASSERT_SV_NV; - - if (SvNOK(sv)) - return SvNVX(sv); - return sv_2nv(sv); -} - -/* -=for apidoc_section $SV =for apidoc sv_pv Use the C macro instead -=for apidoc_section $SV -=for apidoc sv_pvn - -A private implementation of the C macro for compilers which can't -cope with complex macro expressions. Always use the macro instead. - =cut */ -char * -Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp) -{ - PERL_ARGS_ASSERT_SV_PVN; - - if (SvPOK(sv)) { - *lp = SvCUR(sv); - return SvPVX(sv); - } - return sv_2pv(sv, lp); -} - - -char * -Perl_sv_pvn_nomg(pTHX_ SV *sv, STRLEN *lp) -{ - PERL_ARGS_ASSERT_SV_PVN_NOMG; - - if (SvPOK(sv)) { - *lp = SvCUR(sv); - return SvPVX(sv); - } - return sv_2pv_flags(sv, lp, 0); -} - /* sv_pv() is now a macro using SvPV_nolen(); * this function provided for binary compatibility only */ @@ -441,7 +344,7 @@ Perl_sv_pvbyte(pTHX_ SV *sv) { PERL_ARGS_ASSERT_SV_PVBYTE; - sv_utf8_downgrade(sv, FALSE); + (void)sv_utf8_downgrade(sv, FALSE); return sv_pv(sv); } @@ -451,59 +354,26 @@ Perl_sv_pvbyte(pTHX_ SV *sv) Use C instead. -=for apidoc sv_pvbyten - -A private implementation of the C macro for compilers -which can't cope with complex macro expressions. Always use the macro -instead. - =cut */ -char * -Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp) -{ - PERL_ARGS_ASSERT_SV_PVBYTEN; - - sv_utf8_downgrade(sv, FALSE); - return sv_pvn(sv,lp); -} - -/* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags(); - * this function provided for binary compatibility only - */ - -char * -Perl_sv_pvutf8(pTHX_ SV *sv) -{ - PERL_ARGS_ASSERT_SV_PVUTF8; - - sv_utf8_upgrade(sv); - return sv_pv(sv); -} - /* =for apidoc_section $SV =for apidoc sv_pvutf8 Use the C macro instead -=for apidoc sv_pvutf8n - -A private implementation of the C macro for compilers -which can't cope with complex macro expressions. Always use the macro -instead. - =cut */ + char * -Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp) +Perl_sv_pvutf8(pTHX_ SV *sv) { - PERL_ARGS_ASSERT_SV_PVUTF8N; + PERL_ARGS_ASSERT_SV_PVUTF8; sv_utf8_upgrade(sv); - return sv_pvn(sv,lp); + return sv_pv(sv); } /* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags(); @@ -518,41 +388,6 @@ Perl_sv_utf8_upgrade(pTHX_ SV *sv) return sv_utf8_upgrade_flags(sv, SV_GMAGIC); } -int -Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...) -{ - int ret = 0; - va_list arglist; - - /* Easier to special case this here than in embed.pl. (Look at what it - generates for proto.h) */ -#ifdef MULTIPLICITY - PERL_ARGS_ASSERT_FPRINTF_NOCONTEXT; -#endif - - va_start(arglist, format); - ret = PerlIO_vprintf(stream, format, arglist); - va_end(arglist); - return ret; -} - -int -Perl_printf_nocontext(const char *format, ...) -{ - dTHX; - va_list arglist; - int ret = 0; - -#ifdef MULTIPLICITY - PERL_ARGS_ASSERT_PRINTF_NOCONTEXT; -#endif - - va_start(arglist, format); - ret = PerlIO_vprintf(PerlIO_stdout(), format, arglist); - va_end(arglist); - return ret; -} - #if defined(HUGE_VAL) || (defined(USE_LONG_DOUBLE) && defined(HUGE_VALL)) /* * This hack is to force load of "huge" support from libm.a @@ -570,24 +405,6 @@ Perl_huge(void) } #endif -/* compatibility with versions <= 5.003. */ -void -Perl_gv_fullname(pTHX_ SV *sv, const GV *gv) -{ - PERL_ARGS_ASSERT_GV_FULLNAME; - - gv_fullname3(sv, gv, sv == (const SV*)gv ? "*" : ""); -} - -/* compatibility with versions <= 5.003. */ -void -Perl_gv_efullname(pTHX_ SV *sv, const GV *gv) -{ - PERL_ARGS_ASSERT_GV_EFULLNAME; - - gv_efullname3(sv, gv, sv == (const SV*)gv ? "*" : ""); -} - void Perl_gv_fullname3(pTHX_ SV *sv, const GV *gv, const char *prefix) { @@ -647,36 +464,6 @@ Perl_do_open(pTHX_ GV *gv, const char *n supplied_fp, (SV **) NULL, 0); } -bool -Perl_do_open9(pTHX_ GV *gv, const char *name, I32 len, int -as_raw, - int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs, - I32 num_svs) -{ - PERL_ARGS_ASSERT_DO_OPEN9; - - PERL_UNUSED_ARG(num_svs); - return do_openn(gv, name, len, as_raw, rawmode, rawperm, - supplied_fp, &svs, 1); -} - -int -Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode) -{ - /* The old body of this is now in non-LAYER part of perlio.c - * This is a stub for any XS code which might have been calling it. - */ - const char *name = ":raw"; - - PERL_ARGS_ASSERT_DO_BINMODE; - -#ifdef PERLIO_USING_CRLF - if (!(mode & O_BINARY)) - name = ":crlf"; -#endif - return PerlIO_binmode(aTHX_ fp, iotype, mode, name); -} - #ifndef OS2 bool Perl_do_aexec(pTHX_ SV *really, SV **mark, SV **sp) @@ -687,13 +474,6 @@ Perl_do_aexec(pTHX_ SV *really, SV **mar } #endif -/* Backwards compatibility. */ -int -Perl_init_i18nl14n(pTHX_ int printwarn) -{ - return init_i18nl10n(printwarn); -} - bool Perl_is_utf8_string_loc(const U8 *s, const STRLEN len, const U8 **ep) { @@ -748,46 +528,6 @@ Perl_sv_nounlocking(pTHX_ SV *sv) } void -Perl_save_long(pTHX_ long int *longp) -{ - PERL_ARGS_ASSERT_SAVE_LONG; - - SSCHECK(3); - SSPUSHLONG(*longp); - SSPUSHPTR(longp); - SSPUSHUV(SAVEt_LONG); -} - -void -Perl_save_nogv(pTHX_ GV *gv) -{ - PERL_ARGS_ASSERT_SAVE_NOGV; - - SSCHECK(2); - SSPUSHPTR(gv); - SSPUSHUV(SAVEt_NSTAB); -} - -void -Perl_save_list(pTHX_ SV **sarg, I32 maxsarg) -{ - I32 i; - - PERL_ARGS_ASSERT_SAVE_LIST; - - for (i = 1; i <= maxsarg; i++) { - SV *sv; - SvGETMAGIC(sarg[i]); - sv = newSV(0); - sv_setsv_nomg(sv,sarg[i]); - SSCHECK(3); - SSPUSHPTR(sarg[i]); /* remember the pointer */ - SSPUSHPTR(sv); /* remember the value */ - SSPUSHUV(SAVEt_ITEM); - } -} - -void Perl_sv_usepvn_mg(pTHX_ SV *sv, char *ptr, STRLEN len) { PERL_ARGS_ASSERT_SV_USEPVN_MG; @@ -804,52 +544,6 @@ Perl_sv_usepvn(pTHX_ SV *sv, char *ptr, sv_usepvn_flags(sv,ptr,len, 0); } -/* -=for apidoc_section $pack -=for apidoc unpack_str - -The engine implementing C Perl function. Note: parameters C, -C and C are not used. This call should not be used, use -C instead. - -=cut */ - -SSize_t -Perl_unpack_str(pTHX_ const char *pat, const char *patend, const char *s, - const char *strbeg, const char *strend, char **new_s, I32 ocnt, - U32 flags) -{ - PERL_ARGS_ASSERT_UNPACK_STR; - - PERL_UNUSED_ARG(strbeg); - PERL_UNUSED_ARG(new_s); - PERL_UNUSED_ARG(ocnt); - - return unpackstring(pat, patend, s, strend, flags); -} - -/* -=for apidoc_section $pack -=for apidoc pack_cat - -The engine implementing C Perl function. Note: parameters -C and C are not used. This call should not be used; use -C> instead. - -=cut -*/ - -void -Perl_pack_cat(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist, SV ***next_in_list, U32 flags) -{ - PERL_ARGS_ASSERT_PACK_CAT; - - PERL_UNUSED_ARG(next_in_list); - PERL_UNUSED_ARG(flags); - - packlist(cat, pat, patend, beglist, endlist); -} - HE * Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, U32 hash) { @@ -1081,17 +775,6 @@ Perl_sv_collxfrm(pTHX_ SV *const sv, STR return sv_collxfrm_flags(sv, nxp, SV_GMAGIC); } -char * -Perl_mem_collxfrm(pTHX_ const char *input_string, STRLEN len, STRLEN *xlen) -{ - /* This function is retained for compatibility in case someone outside core - * is using this (but it is undocumented) */ - - PERL_ARGS_ASSERT_MEM_COLLXFRM; - - return _mem_collxfrm(input_string, len, xlen, FALSE); -} - #endif bool @@ -1101,36 +784,6 @@ Perl_sv_2bool(pTHX_ SV *const sv) return sv_2bool_flags(sv, SV_GMAGIC); } - -/* -=for apidoc_section $custom -=for apidoc custom_op_name -Return the name for a given custom op. This was once used by the C -macro, but is no longer: it has only been kept for compatibility, and -should not be used. - -=for apidoc custom_op_desc -Return the description of a given custom op. This was once used by the -C macro, but is no longer: it has only been kept for -compatibility, and should not be used. - -=cut -*/ - -const char* -Perl_custom_op_name(pTHX_ const OP* o) -{ - PERL_ARGS_ASSERT_CUSTOM_OP_NAME; - return XopENTRYCUSTOM(o, xop_name); -} - -const char* -Perl_custom_op_desc(pTHX_ const OP* o) -{ - PERL_ARGS_ASSERT_CUSTOM_OP_DESC; - return XopENTRYCUSTOM(o, xop_desc); -} - CV * Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block) { @@ -1151,46 +804,6 @@ Perl_sv_copypv(pTHX_ SV *const dsv, SV * sv_copypv_flags(dsv, ssv, SV_GMAGIC); } -UV /* Made into a function, so can be deprecated */ -NATIVE_TO_NEED(const UV enc, const UV ch) -{ - PERL_UNUSED_ARG(enc); - return ch; -} - -UV /* Made into a function, so can be deprecated */ -ASCII_TO_NEED(const UV enc, const UV ch) -{ - PERL_UNUSED_ARG(enc); - return ch; -} - -/* -=for apidoc_section $unicode -=for apidoc is_utf8_char - -Tests if some arbitrary number of bytes begins in a valid UTF-8 -character. Note that an INVARIANT (i.e. ASCII on non-EBCDIC machines) -character is a valid UTF-8 character. The actual number of bytes in the UTF-8 -character will be returned if it is valid, otherwise 0. - -This function is deprecated due to the possibility that malformed input could -cause reading beyond the end of the input buffer. Use L -instead. - -=cut */ - -STRLEN -Perl_is_utf8_char(const U8 *s) -{ - PERL_ARGS_ASSERT_IS_UTF8_CHAR; - - /* Assumes we have enough space, which is why this is deprecated. But the - * UTF8_CHK_SKIP(s)) makes it safe for the common case of NUL-terminated - * strings */ - return isUTF8_CHAR(s, s + UTF8_CHK_SKIP(s)); -} - /* =for apidoc_section $unicode =for apidoc is_utf8_char_buf @@ -1208,20 +821,6 @@ Perl_is_utf8_char_buf(const U8 *buf, con return isUTF8_CHAR(buf, buf_end); } -/* DEPRECATED! - * Like L(), but should only be called when it is known that - * there are no malformations in the input UTF-8 string C. Surrogates, - * non-character code points, and non-Unicode code points are allowed */ - -UV -Perl_valid_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen) -{ - PERL_UNUSED_CONTEXT; - PERL_ARGS_ASSERT_VALID_UTF8_TO_UVUNI; - - return NATIVE_TO_UNI(valid_utf8_to_uvchr(s, retlen)); -} - /* =for apidoc_section $unicode =for apidoc utf8_to_uvuni @@ -1234,7 +833,7 @@ Some, but not all, UTF-8 malformations a malformed input could cause reading beyond the end of the input buffer, which is one reason why this function is deprecated. The other is that only in extremely limited circumstances should the Unicode versus native code point be -of any interest to you. See L for alternatives. +of any interest to you. If C points to one of the detected malformations, and UTF8 warnings are enabled, zero is returned and C<*retlen> is set (if C doesn't point to @@ -1256,25 +855,6 @@ Perl_utf8_to_uvuni(pTHX_ const U8 *s, ST return NATIVE_TO_UNI(valid_utf8_to_uvchr(s, retlen)); } -/* -=for apidoc_section $pad -=for apidoc pad_compname_type - -Looks up the type of the lexical variable at position C in the -currently-compiling pad. If the variable is typed, the stash of the -class to which it is typed is returned. If not, C is returned. - -Use L> instead. - -=cut -*/ - -HV * -Perl_pad_compname_type(pTHX_ const PADOFFSET po) -{ - return PAD_COMPNAME_TYPE(po); -} - /* return ptr to little string in big string, NULL if not found */ /* The original version of this routine was donated by Corey Satten. */ @@ -1347,31 +927,6 @@ Perl_utf8n_to_uvuni(pTHX_ const U8 *s, S PERL_ARGS_ASSERT_UTF8N_TO_UVUNI; return NATIVE_TO_UNI(utf8n_to_uvchr(s, curlen, retlen, flags)); -} - -/* -=for apidoc_section $unicode -=for apidoc uvuni_to_utf8_flags - -Instead you almost certainly want to use L or -L. - -This function is a deprecated synonym for L, -which itself, while not deprecated, should be used only in isolated -circumstances. These functions were useful for code that wanted to handle -both EBCDIC and ASCII platforms with Unicode properties, but starting in Perl -v5.20, the distinctions between the platforms have mostly been made invisible -to most code, so this function is quite unlikely to be what you want. - -=cut -*/ - -U8 * -Perl_uvuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags) -{ - PERL_ARGS_ASSERT_UVUNI_TO_UTF8_FLAGS; - - return uvoffuni_to_utf8_flags(d, uv, flags); } /* Index: gnu/usr.bin/perl/metaconfig.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/metaconfig.h,v diff -u -p -a -u -p -r1.6 metaconfig.h --- gnu/usr.bin/perl/metaconfig.h 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/metaconfig.h 21 Feb 2024 15:47:02 -0000 @@ -14,9 +14,5 @@ * they should be removed from here. * * HAS_NON_INT_BITFIELDS - * HAS_STRXFRM_L - * HAS_NL_LANGINFO_L - * HAS_FFS - * HAS_FFSL * */ Index: gnu/usr.bin/perl/mg.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/mg.c,v diff -u -p -a -u -p -r1.28 mg.c --- gnu/usr.bin/perl/mg.c 8 Jul 2023 14:18:35 -0000 1.28 +++ gnu/usr.bin/perl/mg.c 21 Feb 2024 15:47:02 -0000 @@ -87,7 +87,7 @@ struct magic_state { /* MGS is typedef'ed to struct magic_state in perl.h */ STATIC void -S_save_magic_flags(pTHX_ I32 mgs_ix, SV *sv, U32 flags) +S_save_magic_flags(pTHX_ SSize_t mgs_ix, SV *sv, U32 flags) { MGS* mgs; bool bumped = FALSE; @@ -165,7 +165,7 @@ be >= C. See C>. int Perl_mg_get(pTHX_ SV *sv) { - const I32 mgs_ix = SSNEW(sizeof(MGS)); + const SSize_t mgs_ix = SSNEW(sizeof(MGS)); bool saved = FALSE; bool have_new = 0; bool taint_only = TRUE; /* the only get method seen is taint */ @@ -269,7 +269,7 @@ Do magic after a value is assigned to th int Perl_mg_set(pTHX_ SV *sv) { - const I32 mgs_ix = SSNEW(sizeof(MGS)); + const SSize_t mgs_ix = SSNEW(sizeof(MGS)); MAGIC* mg; MAGIC* nextmg; @@ -297,42 +297,6 @@ Perl_mg_set(pTHX_ SV *sv) return 0; } -/* -=for apidoc mg_length - -Reports on the SV's length in bytes, calling length magic if available, -but does not set the UTF8 flag on C. It will fall back to 'get' -magic if there is no 'length' magic, but with no indication as to -whether it called 'get' magic. It assumes C is a C or -higher. Use C instead. - -=cut -*/ - -U32 -Perl_mg_length(pTHX_ SV *sv) -{ - MAGIC* mg; - STRLEN len; - - PERL_ARGS_ASSERT_MG_LENGTH; - - for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) { - const MGVTBL * const vtbl = mg->mg_virtual; - if (vtbl && vtbl->svt_len) { - const I32 mgs_ix = SSNEW(sizeof(MGS)); - save_magic(mgs_ix, sv); - /* omit MGf_GSKIP -- not changed here */ - len = vtbl->svt_len(aTHX_ sv, mg); - restore_magic(INT2PTR(void*, (IV)mgs_ix)); - return len; - } - } - - (void)SvPV_const(sv, len); - return len; -} - I32 Perl_mg_size(pTHX_ SV *sv) { @@ -343,7 +307,7 @@ Perl_mg_size(pTHX_ SV *sv) for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) { const MGVTBL* const vtbl = mg->mg_virtual; if (vtbl && vtbl->svt_len) { - const I32 mgs_ix = SSNEW(sizeof(MGS)); + const SSize_t mgs_ix = SSNEW(sizeof(MGS)); I32 len; save_magic(mgs_ix, sv); /* omit MGf_GSKIP -- not changed here */ @@ -376,7 +340,7 @@ Clear something magical that the SV repr int Perl_mg_clear(pTHX_ SV *sv) { - const I32 mgs_ix = SSNEW(sizeof(MGS)); + const SSize_t mgs_ix = SSNEW(sizeof(MGS)); MAGIC* mg; MAGIC *nextmg; @@ -674,15 +638,15 @@ Perl_magic_regdata_cnt(pTHX_ SV *sv, MAG const SSize_t n = (SSize_t)mg->mg_obj; if (n == '+') { /* @+ */ /* return the number possible */ - return RX_NPARENS(rx); + return RX_LOGICAL_NPARENS(rx) ? RX_LOGICAL_NPARENS(rx) : RX_NPARENS(rx); } else { /* @- @^CAPTURE @{^CAPTURE} */ I32 paren = RX_LASTPAREN(rx); /* return the last filled */ - while ( paren >= 0 - && (RX_OFFS(rx)[paren].start == -1 - || RX_OFFS(rx)[paren].end == -1) ) + while ( paren >= 0 && !RX_OFFS_VALID(rx,paren) ) paren--; + if (paren && RX_PARNO_TO_LOGICAL(rx)) + paren = RX_PARNO_TO_LOGICAL(rx)[paren]; if (n == '-') { /* @- */ return (U32)paren; @@ -703,32 +667,42 @@ int Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg) { PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET; + REGEXP * const rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL; - if (PL_curpm) { - REGEXP * const rx = PM_GETRE(PL_curpm); - if (rx) { - const SSize_t n = (SSize_t)mg->mg_obj; - /* @{^CAPTURE} does not contain $&, so we need to increment by 1 */ - const I32 paren = mg->mg_len - + (n == '\003' ? 1 : 0); - SSize_t s; - SSize_t t; - if (paren < 0) - return 0; - if (paren <= (I32)RX_NPARENS(rx) && - (s = RX_OFFS(rx)[paren].start) != -1 && - (t = RX_OFFS(rx)[paren].end) != -1) + if (rx) { + const SSize_t n = (SSize_t)mg->mg_obj; + /* @{^CAPTURE} does not contain $&, so we need to increment by 1 */ + const I32 paren = mg->mg_len + + (n == '\003' ? 1 : 0); + + if (paren < 0) + return 0; + + SSize_t s; + SSize_t t; + I32 logical_nparens = (I32)RX_LOGICAL_NPARENS(rx); + + if (!logical_nparens) + logical_nparens = (I32)RX_NPARENS(rx); + + if (n != '+' && n != '-') { + CALLREG_NUMBUF_FETCH(rx,paren,sv); + return 0; + } + if (paren <= (I32)logical_nparens) { + I32 true_paren = RX_LOGICAL_TO_PARNO(rx) + ? RX_LOGICAL_TO_PARNO(rx)[paren] + : paren; + do { + if (((s = RX_OFFS_START(rx,true_paren)) != -1) && + ((t = RX_OFFS_END(rx,true_paren)) != -1)) { SSize_t i; - if (n == '+') /* @+ */ + if (n == '+') /* @+ */ i = t; - else if (n == '-') /* @- */ + else /* @- */ i = s; - else { /* @^CAPTURE @{^CAPTURE} */ - CALLREG_NUMBUF_FETCH(rx,paren,sv); - return 0; - } if (RX_MATCH_UTF8(rx)) { const char * const b = RX_SUBBEG(rx); @@ -741,6 +715,11 @@ Perl_magic_regdatum_get(pTHX_ SV *sv, MA sv_setuv(sv, i); return 0; } + if (RX_PARNO_TO_LOGICAL_NEXT(rx)) + true_paren = RX_PARNO_TO_LOGICAL_NEXT(rx)[true_paren]; + else + break; + } while (true_paren); } } sv_set_undef(sv); @@ -760,15 +739,16 @@ Perl_magic_regdatum_set(pTHX_ SV *sv, MA NORETURN_FUNCTION_END; } -#define SvRTRIM(sv) STMT_START { \ - if (SvPOK(sv)) { \ - STRLEN len = SvCUR(sv); \ - char * const p = SvPVX(sv); \ - while (len > 0 && isSPACE(p[len-1])) \ - --len; \ - SvCUR_set(sv, len); \ - p[len] = '\0'; \ - } \ +#define SvRTRIM(sv) STMT_START { \ + SV * sv_ = sv; \ + if (SvPOK(sv_)) { \ + STRLEN len = SvCUR(sv_); \ + char * const p = SvPVX(sv_); \ + while (len > 0 && isSPACE(p[len-1])) \ + --len; \ + SvCUR_set(sv_, len); \ + p[len] = '\0'; \ + } \ } STMT_END void @@ -795,6 +775,39 @@ Perl_emulate_cop_io(pTHX_ const COP *con } } +int +Perl_get_extended_os_errno(void) +{ + +#if defined(VMS) + + return (int) vaxc$errno; + +#elif defined(OS2) + + if (! (_emx_env & 0x200)) { /* Under DOS */ + return (int) errno; + } + + if (errno != errno_isOS2) { + const int tmp = _syserrno(); + if (tmp) /* 2nd call to _syserrno() makes it 0 */ + Perl_rc = tmp; + } + return (int) Perl_rc; + +#elif defined(WIN32) + + return (int) GetLastError(); + +#else + + return (int) errno; + +#endif + +} + STATIC void S_fixup_errno_string(pTHX_ SV* sv) { @@ -808,37 +821,6 @@ S_fixup_errno_string(pTHX_ SV* sv) if(strEQ(SvPVX(sv), "")) { sv_catpv(sv, UNKNOWN_ERRNO_MSG); } - else { - - /* In some locales the error string may come back as UTF-8, in which - * case we should turn on that flag. This didn't use to happen, and to - * avoid as many possible backward compatibility issues as possible, we - * don't turn on the flag unless we have to. So the flag stays off for - * an entirely invariant string. We assume that if the string looks - * like UTF-8 in a single script, it really is UTF-8: "text in any - * other encoding that uses bytes with the high bit set is extremely - * unlikely to pass a UTF-8 validity test" - * (http://en.wikipedia.org/wiki/Charset_detection). There is a - * potential that we will get it wrong however, especially on short - * error message text, so do an additional check. */ - if ( ! IN_BYTES /* respect 'use bytes' */ - && is_utf8_non_invariant_string((U8*) SvPVX_const(sv), SvCUR(sv)) - -#ifdef USE_LOCALE_MESSAGES - - && _is_cur_LC_category_utf8(LC_MESSAGES) - -#else /* If can't check directly, at least can see if script is consistent, - under UTF-8, which gives us an extra measure of confidence. */ - - && isSCRIPT_RUN((const U8 *) SvPVX_const(sv), (U8 *) SvEND(sv), - TRUE) /* Means assume UTF-8 */ -#endif - - ) { - SvUTF8_on(sv); - } - } } /* @@ -876,11 +858,16 @@ SV * Perl_sv_string_from_errnum(pTHX_ int errnum, SV *tgtsv) { char const *errstr; + utf8ness_t utf8ness; + if(!tgtsv) tgtsv = newSV_type_mortal(SVt_PV); - errstr = my_strerror(errnum); + errstr = my_strerror(errnum, &utf8ness); if(errstr) { sv_setpv(tgtsv, errstr); + if (utf8ness == UTF8NESS_YES) { + SvUTF8_on(tgtsv); + } fixup_errno_string(tgtsv); } else { SvPVCLEAR(tgtsv); @@ -899,11 +886,14 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) I32 paren; const char *s = NULL; REGEXP *rx; - const char * const remaining = mg->mg_ptr + 1; char nextchar; PERL_ARGS_ASSERT_MAGIC_GET; + const char * const remaining = (mg->mg_ptr) + ? mg->mg_ptr + 1 + : NULL; + if (!mg->mg_ptr) { paren = mg->mg_len; if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { @@ -937,51 +927,73 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK)); break; case '\005': /* ^E */ - if (nextchar != '\0') { - if (strEQ(remaining, "NCODING")) - sv_set_undef(sv); - break; - } + { + if (nextchar != '\0') { + if (strEQ(remaining, "NCODING")) + sv_set_undef(sv); + break; + } #if defined(VMS) || defined(OS2) || defined(WIN32) + + int extended_errno = get_extended_os_errno(); + # if defined(VMS) - { char msg[255]; $DESCRIPTOR(msgdsc,msg); - sv_setnv(sv,(NV) vaxc$errno); - if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1) + + sv_setnv(sv, (NV) extended_errno); + if (sys$getmsg(extended_errno, + &msgdsc.dsc$w_length, + &msgdsc, + 0, 0) + & 1) sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length); else SvPVCLEAR(sv); - } + #elif defined(OS2) - if (!(_emx_env & 0x200)) { /* Under DOS */ - sv_setnv(sv, (NV)errno); - sv_setpv(sv, errno ? my_strerror(errno) : ""); - } else { - if (errno != errno_isOS2) { - const int tmp = _syserrno(); - if (tmp) /* 2nd call to _syserrno() makes it 0 */ - Perl_rc = tmp; + if (!(_emx_env & 0x200)) { /* Under DOS */ + sv_setnv(sv, (NV) extended_errno); + if (extended_errno) { + utf8ness_t utf8ness; + const char * errstr = my_strerror(extended_errno, &utf8ness); + + sv_setpv(sv, errstr); + + if (utf8ness == UTF8NESS_YES) { + SvUTF8_on(sv); + } + } + else { + SvPVCLEAR(sv); + } + } else { + sv_setnv(sv, (NV) extended_errno); + sv_setpv(sv, os2error(extended_errno)); } - sv_setnv(sv, (NV)Perl_rc); - sv_setpv(sv, os2error(Perl_rc)); - } - if (SvOK(sv) && strNE(SvPVX(sv), "")) { - fixup_errno_string(sv); - } + if (SvOK(sv) && strNE(SvPVX(sv), "")) { + fixup_errno_string(sv); + } + # elif defined(WIN32) - { - const DWORD dwErr = GetLastError(); - sv_setnv(sv, (NV)dwErr); + const DWORD dwErr = (DWORD) extended_errno; + sv_setnv(sv, (NV) dwErr); if (dwErr) { PerlProc_GetOSError(sv, dwErr); fixup_errno_string(sv); + +# ifdef USE_LOCALE + if ( IN_LOCALE + && get_win32_message_utf8ness(SvPV_nomg_const_nolen(sv))) + { + SvUTF8_on(sv); + } +# endif } else SvPVCLEAR(sv); SetLastError(dwErr); - } # else # error Missing code for platform # endif @@ -990,6 +1002,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) break; #endif /* End of platforms with special handling for $^E; others just fall through to $! */ + } /* FALLTHROUGH */ case '!': @@ -1050,6 +1063,14 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) else sv_set_undef(sv); } + else if (strEQ(remaining, "AST_SUCCESSFUL_PATTERN")) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { + sv_setrv_inc(sv, MUTABLE_SV(rx)); + sv_rvweaken(sv); + } + else + sv_set_undef(sv); + } break; case '\017': /* ^O & ^OPEN */ if (nextchar == '\0') { @@ -1120,23 +1141,31 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) sv_setpvn(sv, WARN_ALLstring, WARNsize); } else { - sv_setpvn(sv, (char *) (PL_compiling.cop_warnings + 1), - *PL_compiling.cop_warnings); + sv_setpvn(sv, PL_compiling.cop_warnings, + RCPV_LEN(PL_compiling.cop_warnings)); } } break; - case '+': + case '+': /* $+ */ if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { paren = RX_LASTPAREN(rx); - if (paren) + if (paren) { + I32 *parno_to_logical = RX_PARNO_TO_LOGICAL(rx); + if (parno_to_logical) + paren = parno_to_logical[paren]; goto do_numbuf_fetch; + } } goto set_undef; - case '\016': /* ^N */ + case '\016': /* $^N */ if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { paren = RX_LASTCLOSEPAREN(rx); - if (paren) + if (paren) { + I32 *parno_to_logical = RX_PARNO_TO_LOGICAL(rx); + if (parno_to_logical) + paren = parno_to_logical[paren]; goto do_numbuf_fetch; + } } goto set_undef; case '.': @@ -1296,7 +1325,7 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *m /* defined environment variables are byte strings; unfortunately there is no SvPVbyte_force_nomg(), so we must do this piecewise */ (void)SvPV_force_nomg_nolen(sv); - sv_utf8_downgrade(sv, /* fail_ok */ TRUE); + (void)sv_utf8_downgrade(sv, /* fail_ok */ TRUE); if (SvUTF8(sv)) { Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "Wide character in %s", "setenv"); SvUTF8_off(sv); @@ -1356,6 +1385,15 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *m const char path_sep = ':'; #endif +#ifndef __VMS + /* Does this apply for VMS? + * Empty PATH on linux is treated same as ".", which is forbidden + * under taint. So check if the PATH variable is empty. */ + if (!len) { + MgTAINTEDDIR_on(mg); + return 0; + } +#endif /* set MGf_TAINTEDDIR if any component of the new path is * relative or world-writeable */ while (s < strend) { @@ -1372,7 +1410,8 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *m /* Using Unix separator, e.g. under bash, so act line Unix */ || (PL_perllib_sep == ':' && *tmpbuf != '/') #else - || *tmpbuf != '/' /* no starting slash -- assume relative path */ + || *tmpbuf != '/' /* no starting slash -- assume relative path */ + || s == strend /* trailing empty component -- same as "." */ #endif || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) { MgTAINTEDDIR_on(mg); @@ -1706,7 +1745,8 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *m For magic_clearsig, we don't change the warnings handler if it's set to the &PL_warnhook. */ svp = &PL_warnhook; - } else if (sv) { + } + else if (sv) { SV *tmp = sv_newmortal(); Perl_croak(aTHX_ "No such hook: %s", pv_pretty(tmp, s, len, 0, NULL, NULL, 0)); @@ -1778,8 +1818,9 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *m if (i) { (void)rsignal(i, PL_csighandlerp); } - else + else { *svp = SvREFCNT_inc_simple_NN(sv); + } } else { if (sv && SvOK(sv)) { s = SvPV_force(sv, len); @@ -1850,6 +1891,92 @@ Perl_magic_setsigall(pTHX_ SV* sv, MAGIC } int +Perl_magic_clearhook(pTHX_ SV *sv, MAGIC *mg) +{ + PERL_ARGS_ASSERT_MAGIC_CLEARHOOK; + + magic_sethook(NULL, mg); + return sv_unmagic(sv, mg->mg_type); +} + +/* sv of NULL signifies that we're acting as magic_clearhook. */ +int +Perl_magic_sethook(pTHX_ SV *sv, MAGIC *mg) +{ + SV** svp = NULL; + STRLEN len; + const char *s = MgPV_const(mg,len); + + PERL_ARGS_ASSERT_MAGIC_SETHOOK; + + if (memEQs(s, len, "require__before")) { + svp = &PL_hook__require__before; + } + else if (memEQs(s, len, "require__after")) { + svp = &PL_hook__require__after; + } + else { + SV *tmp = sv_newmortal(); + Perl_croak(aTHX_ "Attempt to set unknown hook '%s' in %%{^HOOK}", + pv_pretty(tmp, s, len, 0, NULL, NULL, 0)); + } + if (sv && SvOK(sv) && (!SvROK(sv) || SvTYPE(SvRV(sv))!= SVt_PVCV)) + croak("${^HOOK}{%.*s} may only be a CODE reference or undef", (int)len, s); + + if (svp) { + if (*svp) + SvREFCNT_dec(*svp); + + if (sv) + *svp = SvREFCNT_inc_simple_NN(sv); + else + *svp = NULL; + } + + return 0; +} + +int +Perl_magic_sethookall(pTHX_ SV* sv, MAGIC* mg) +{ + PERL_ARGS_ASSERT_MAGIC_SETHOOKALL; + PERL_UNUSED_ARG(mg); + + if (PL_localizing == 1) { + SAVEGENERICSV(PL_hook__require__before); + PL_hook__require__before = NULL; + SAVEGENERICSV(PL_hook__require__after); + PL_hook__require__after = NULL; + } + else + if (PL_localizing == 2) { + HV* hv = (HV*)sv; + HE* current; + hv_iterinit(hv); + while ((current = hv_iternext(hv))) { + SV* hookelem = hv_iterval(hv, current); + mg_set(hookelem); + } + } + return 0; +} + +int +Perl_magic_clearhookall(pTHX_ SV* sv, MAGIC* mg) +{ + PERL_ARGS_ASSERT_MAGIC_CLEARHOOKALL; + PERL_UNUSED_ARG(mg); + PERL_UNUSED_ARG(sv); + + SvREFCNT_dec_set_NULL(PL_hook__require__before); + + SvREFCNT_dec_set_NULL(PL_hook__require__after); + + return 0; +} + + +int Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg) { PERL_ARGS_ASSERT_MAGIC_SETISA; @@ -1886,7 +2013,7 @@ Perl_magic_clearisa(pTHX_ SV *sv, MAGIC I32 items = AvFILLp((AV *)mg->mg_obj) + 1; while (items--) { stash = GvSTASH((GV *)*svp++); - if (stash && HvENAME(stash)) mro_isa_changed_in(stash); + if (stash && HvHasENAME(stash)) mro_isa_changed_in(stash); } return 0; @@ -1898,7 +2025,7 @@ Perl_magic_clearisa(pTHX_ SV *sv, MAGIC /* The stash may have been detached from the symbol table, so check its name before doing anything. */ - if (stash && HvENAME_get(stash)) + if (stash && HvHasENAME(stash)) mro_isa_changed_in(stash); return 0; @@ -3040,7 +3167,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) { if ( ! (PL_dowarn & G_WARN_ALL_MASK)) { if (!SvPOK(sv)) { - free_and_set_cop_warnings(&PL_compiling, pWARN_STD); + free_and_set_cop_warnings(&PL_compiling, pWARN_STD); break; } { @@ -3052,23 +3179,24 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) not_all |= ptr[i] ^ 0x55; } if (!not_none) { - free_and_set_cop_warnings(&PL_compiling, pWARN_NONE); + free_and_set_cop_warnings(&PL_compiling, pWARN_NONE); } else if (len >= WARNsize && !not_all) { - free_and_set_cop_warnings(&PL_compiling, pWARN_ALL); - PL_dowarn |= G_WARN_ONCE ; - } - else { - STRLEN len; - const char *const p = SvPV_const(sv, len); - - PL_compiling.cop_warnings - = Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings, - p, len); + free_and_set_cop_warnings(&PL_compiling, pWARN_ALL); + PL_dowarn |= G_WARN_ONCE ; + } + else { + STRLEN len; + const char *const p = SvPV_const(sv, len); + + free_and_set_cop_warnings( + &PL_compiling, + Perl_new_warnings_bitfield(aTHX_ PL_compiling.cop_warnings, + p, len) + ); - if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE)) + if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE)) PL_dowarn |= G_WARN_ONCE ; - } - + } } } } Index: gnu/usr.bin/perl/mg_names.inc =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/mg_names.inc,v diff -u -p -a -u -p -r1.2 mg_names.inc --- gnu/usr.bin/perl/mg_names.inc 13 Feb 2019 21:15:03 -0000 1.2 +++ gnu/usr.bin/perl/mg_names.inc 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * mg_names.inc * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! @@ -44,11 +44,15 @@ { PERL_MAGIC_vstring, "vstring(V)" }, { PERL_MAGIC_vec, "vec(v)" }, { PERL_MAGIC_utf8, "utf8(w)" }, + { PERL_MAGIC_destruct, "destruct(X)" }, { PERL_MAGIC_substr, "substr(x)" }, { PERL_MAGIC_nonelem, "nonelem(Y)" }, { PERL_MAGIC_defelem, "defelem(y)" }, + { PERL_MAGIC_hook, "hook(Z)" }, + { PERL_MAGIC_hookelem, "hookelem(z)" }, { PERL_MAGIC_lvref, "lvref(\\)" }, { PERL_MAGIC_checkcall, "checkcall(])" }, + { PERL_MAGIC_extvalue, "extvalue(^)" }, { PERL_MAGIC_ext, "ext(~)" }, -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/mg_raw.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/mg_raw.h,v diff -u -p -a -u -p -r1.4 mg_raw.h --- gnu/usr.bin/perl/mg_raw.h 15 Feb 2023 01:36:13 -0000 1.4 +++ gnu/usr.bin/perl/mg_raw.h 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * mg_raw.h * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! @@ -76,17 +76,25 @@ "/* vec 'v' vec() lvalue */" }, { 'w', "want_vtbl_utf8 | PERL_MAGIC_VALUE_MAGIC", "/* utf8 'w' Cached UTF-8 information */" }, + { 'X', "want_vtbl_destruct | PERL_MAGIC_VALUE_MAGIC", + "/* destruct 'X' destruct callback */" }, { 'x', "want_vtbl_substr | PERL_MAGIC_VALUE_MAGIC", "/* substr 'x' substr() lvalue */" }, { 'Y', "want_vtbl_nonelem | PERL_MAGIC_VALUE_MAGIC", "/* nonelem 'Y' Array element that does not exist */" }, { 'y', "want_vtbl_defelem | PERL_MAGIC_VALUE_MAGIC", "/* defelem 'y' Shadow \"foreach\" iterator variable / smart parameter vivification */" }, + { 'Z', "want_vtbl_hook", + "/* hook 'Z' %{^HOOK} hash */" }, + { 'z', "want_vtbl_hookelem", + "/* hookelem 'z' %{^HOOK} hash element */" }, { '\\', "want_vtbl_lvref", "/* lvref '\\' Lvalue reference constructor */" }, { ']', "want_vtbl_checkcall | PERL_MAGIC_VALUE_MAGIC", "/* checkcall ']' Inlining/mutation of call to this CV */" }, + { '^', "magic_vtable_max | PERL_MAGIC_READONLY_ACCEPTABLE | PERL_MAGIC_VALUE_MAGIC", + "/* extvalue '^' Value magic available for use by extensions */" }, { '~', "magic_vtable_max | PERL_MAGIC_READONLY_ACCEPTABLE", - "/* ext '~' Available for use by extensions */" }, + "/* ext '~' Variable magic available for use by extensions */" }, -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/mg_vtable.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/mg_vtable.h,v diff -u -p -a -u -p -r1.4 mg_vtable.h --- gnu/usr.bin/perl/mg_vtable.h 15 Feb 2023 01:36:13 -0000 1.4 +++ gnu/usr.bin/perl/mg_vtable.h 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * mg_vtable.h * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! @@ -51,13 +51,17 @@ #define PERL_MAGIC_vstring 'V' /* SV was vstring literal */ #define PERL_MAGIC_vec 'v' /* vec() lvalue */ #define PERL_MAGIC_utf8 'w' /* Cached UTF-8 information */ +#define PERL_MAGIC_destruct 'X' /* destruct callback */ #define PERL_MAGIC_substr 'x' /* substr() lvalue */ #define PERL_MAGIC_nonelem 'Y' /* Array element that does not exist */ #define PERL_MAGIC_defelem 'y' /* Shadow "foreach" iterator variable / smart parameter vivification */ +#define PERL_MAGIC_hook 'Z' /* %{^HOOK} hash */ +#define PERL_MAGIC_hookelem 'z' /* %{^HOOK} hash element */ #define PERL_MAGIC_lvref '\\' /* Lvalue reference constructor */ #define PERL_MAGIC_checkcall ']' /* Inlining/mutation of call to this CV */ -#define PERL_MAGIC_ext '~' /* Available for use by extensions */ +#define PERL_MAGIC_extvalue '^' /* Value magic available for use by extensions */ +#define PERL_MAGIC_ext '~' /* Variable magic available for use by extensions */ enum { /* pass one of these to get_vtbl */ want_vtbl_arylen, @@ -68,10 +72,13 @@ enum { /* pass one of these to get_vtbl want_vtbl_dbline, want_vtbl_debugvar, want_vtbl_defelem, + want_vtbl_destruct, want_vtbl_env, want_vtbl_envelem, want_vtbl_hints, want_vtbl_hintselem, + want_vtbl_hook, + want_vtbl_hookelem, want_vtbl_isa, want_vtbl_isaelem, want_vtbl_lvref, @@ -106,10 +113,13 @@ EXTCONST char * const PL_magic_vtable_na "dbline", "debugvar", "defelem", + "destruct", "env", "envelem", "hints", "hintselem", + "hook", + "hookelem", "isa", "isaelem", "lvref", @@ -167,10 +177,13 @@ EXT_MGVTBL PL_magic_vtables[magic_vtable { 0, Perl_magic_setdbline, 0, 0, 0, 0, 0, 0 }, { Perl_magic_getdebugvar, Perl_magic_setdebugvar, 0, 0, 0, 0, 0, 0 }, { Perl_magic_getdefelem, Perl_magic_setdefelem, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, Perl_magic_freedestruct, 0, 0, 0 }, { 0, Perl_magic_set_all_env, 0, Perl_magic_clear_all_env, 0, 0, 0, 0 }, { 0, Perl_magic_setenv, 0, Perl_magic_clearenv, 0, 0, 0, 0 }, { 0, 0, 0, Perl_magic_clearhints, 0, 0, 0, 0 }, { 0, Perl_magic_sethint, 0, Perl_magic_clearhint, 0, 0, 0, 0 }, + { 0, Perl_magic_sethookall, 0, Perl_magic_clearhookall, 0, 0, 0, 0 }, + { 0, Perl_magic_sethook, 0, Perl_magic_clearhook, 0, 0, 0, 0 }, { 0, Perl_magic_setisa, 0, Perl_magic_clearisa, 0, 0, 0, 0 }, { 0, Perl_magic_setisa, 0, 0, 0, 0, 0, 0 }, { 0, Perl_magic_setlvref, 0, 0, 0, 0, 0, 0 }, @@ -213,11 +226,14 @@ EXT_MGVTBL PL_magic_vtables[magic_vtable #define PL_vtbl_dbline PL_magic_vtables[want_vtbl_dbline] #define PL_vtbl_debugvar PL_magic_vtables[want_vtbl_debugvar] #define PL_vtbl_defelem PL_magic_vtables[want_vtbl_defelem] +#define PL_vtbl_destruct PL_magic_vtables[want_vtbl_destruct] #define PL_vtbl_env PL_magic_vtables[want_vtbl_env] #define PL_vtbl_envelem PL_magic_vtables[want_vtbl_envelem] #define PL_vtbl_fm PL_magic_vtables[want_vtbl_fm] #define PL_vtbl_hints PL_magic_vtables[want_vtbl_hints] #define PL_vtbl_hintselem PL_magic_vtables[want_vtbl_hintselem] +#define PL_vtbl_hook PL_magic_vtables[want_vtbl_hook] +#define PL_vtbl_hookelem PL_magic_vtables[want_vtbl_hookelem] #define PL_vtbl_isa PL_magic_vtables[want_vtbl_isa] #define PL_vtbl_isaelem PL_magic_vtables[want_vtbl_isaelem] #define PL_vtbl_lvref PL_magic_vtables[want_vtbl_lvref] @@ -240,4 +256,4 @@ EXT_MGVTBL PL_magic_vtables[magic_vtable #define PL_vtbl_uvar PL_magic_vtables[want_vtbl_uvar] #define PL_vtbl_vec PL_magic_vtables[want_vtbl_vec] -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/miniperlmain.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/miniperlmain.c,v diff -u -p -a -u -p -r1.18 miniperlmain.c --- gnu/usr.bin/perl/miniperlmain.c 15 Feb 2023 01:36:13 -0000 1.18 +++ gnu/usr.bin/perl/miniperlmain.c 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by regen/miniperlmain.pl and ExtUtils::Miniperl. Any changes made here will be lost! @@ -73,9 +73,6 @@ main(int argc, char **argv, char **env) #ifndef NO_ENV_ARRAY_IN_MAIN PERL_UNUSED_ARG(env); #endif -#ifndef PERL_USE_SAFE_PUTENV - PL_use_safe_putenv = FALSE; -#endif /* PERL_USE_SAFE_PUTENV */ /* if user wants control of gprof profiling off by default */ /* noop unless Configure is given -Accflags=-DPERL_GPROF_CONTROL */ @@ -112,8 +109,29 @@ main(int argc, char **argv, char **env) PL_perl_destruct_level = 0; } PL_exit_flags |= PERL_EXIT_DESTRUCT_END; - if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL)) + if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL)) { + + /* perl_parse() may end up starting its own run loops, which + * might end up "leaking" PL_restartop from the parse phase into + * the run phase which then ends up confusing run_body(). This + * leakage shouldn't happen and if it does its a bug. + * + * Note we do not do this assert in perl_run() or perl_parse() + * as there are modules out there which explicitly set + * PL_restartop before calling perl_run() directly from XS code + * (Coro), and it is conceivable PL_restartop could be set prior + * to calling perl_parse() by XS code as well. + * + * What we want to check is that the top level perl_parse(), + * perl_run() pairing does not allow a leaking PL_restartop, as + * that indicates a bug in perl. By putting the assert here we + * can validate that Perl itself is operating correctly without + * risking breakage to XS code under DEBUGGING. - Yves + */ + assert(!PL_restartop); + perl_run(my_perl); + } #ifndef PERL_MICRO /* Unregister our signal handler before destroying my_perl */ @@ -128,19 +146,6 @@ main(int argc, char **argv, char **env) perl_free(my_perl); -#if defined(USE_ENVIRON_ARRAY) && defined(PERL_TRACK_MEMPOOL) && !defined(NO_ENV_ARRAY_IN_MAIN) - /* - * The old environment may have been freed by perl_free() - * when PERL_TRACK_MEMPOOL is defined, but without having - * been restored by perl_destruct() before (this is only - * done if destruct_level > 0). - * - * It is important to have a valid environment for atexit() - * routines that are eventually called. - */ - environ = env; -#endif - PERL_SYS_TERM(); exit(exitstatus); @@ -156,4 +161,4 @@ xs_init(pTHX) PERL_UNUSED_CONTEXT; } -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/mkppport =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/mkppport,v diff -u -p -a -u -p -r1.5 mkppport --- gnu/usr.bin/perl/mkppport 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/mkppport 21 Feb 2024 15:47:02 -0000 @@ -1,3 +1,5 @@ +#!perl + use strict; use warnings; Index: gnu/usr.bin/perl/mro_core.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/mro_core.c,v diff -u -p -a -u -p -r1.5 mro_core.c --- gnu/usr.bin/perl/mro_core.c 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/mro_core.c 21 Feb 2024 15:47:02 -0000 @@ -28,6 +28,7 @@ Also see L. #include "EXTERN.h" #define PERL_IN_MRO_C +#define PERL_IN_MRO_CORE_C #include "perl.h" static const struct mro_alg dfs_alg = @@ -215,7 +216,8 @@ Perl_mro_meta_dup(pTHX_ struct mro_meta* =for apidoc mro_get_linear_isa_dfs Returns the Depth-First Search linearization of C<@ISA> -the given stash. The return value is a read-only AV*. +the given stash. The return value is a read-only AV* +whose elements are string SVs giving class names. C should be 0 (it is used internally in this function's recursion). @@ -268,7 +270,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash /* We use this later in this function, but don't need a reference to it beyond the end of this function, so reference count is fine. */ our_name = newSVhek(stashhek); - av_push(retval, our_name); /* add ourselves at the top */ + av_push_simple(retval, our_name); /* add ourselves at the top */ /* fetch our @ISA */ gvp = (GV**)hv_fetchs(stash, "ISA", FALSE); @@ -326,7 +328,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash HeVAL(he) = &PL_sv_undef; sv_sethek(val, key); - av_push(retval, val); + av_push_simple(retval, val); } } } else { @@ -358,7 +360,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash as if we'd copied it from what theirs should be. */ stored = MUTABLE_HV(newSV_type_mortal(SVt_PVHV)); (void) hv_stores(stored, "UNIVERSAL", &PL_sv_undef); - av_push(retval, + av_push_simple(retval, newSVhek(HeKEY_hek(hv_store_ent(stored, sv, &PL_sv_undef, 0)))); } @@ -398,7 +400,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash Returns the mro linearisation for the given stash. By default, this will be whatever C returns unless some other MRO is in effect for the stash. The return value is a -read-only AV*. +read-only AV* whose values are string SVs giving class names. You are responsible for C on the return value if you plan to store it anywhere @@ -415,7 +417,7 @@ Perl_mro_get_linear_isa(pTHX_ HV *stash) AV *isa; PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA; - if(!SvOOK(stash)) + if(!HvHasAUX(stash)) Perl_croak(aTHX_ "Can't linearize anonymous symbol table"); meta = HvMROMETA(stash); @@ -425,8 +427,8 @@ Perl_mro_get_linear_isa(pTHX_ HV *stash) if (meta->mro_which != &dfs_alg) { /* skip for dfs, for speed */ SV * const namesv = - (HvENAME(stash)||HvNAME(stash)) - ? newSVhek(HvENAME_HEK(stash) + (HvHasENAME_HEK(stash) || HvHasNAME(stash)) + ? newSVhek(HvHasENAME_HEK(stash) ? HvENAME_HEK(stash) : HvNAME_HEK(stash)) : NULL; @@ -787,12 +789,12 @@ Perl_mro_package_moved(pTHX_ HV * const if(!(flags & 1)) { SV **svp; if( - !GvSTASH(gv) || !HvENAME(GvSTASH(gv)) || + !GvSTASH(gv) || !HvHasENAME(GvSTASH(gv)) || !(svp = hv_fetchhek(GvSTASH(gv), GvNAME_HEK(gv), 0)) || *svp != (SV *)gv ) return; } - assert(SvOOK(GvSTASH(gv))); + assert(HvHasAUX(GvSTASH(gv))); assert(GvNAMELEN(gv)); assert(GvNAME(gv)[GvNAMELEN(gv) - 1] == ':'); assert(GvNAMELEN(gv) == 1 || GvNAME(gv)[GvNAMELEN(gv) - 2] == ':'); @@ -812,7 +814,7 @@ Perl_mro_package_moved(pTHX_ HV * const : newSVpvs_flags("", SVs_TEMP); } else { - namesv = sv_2mortal(newSVhek(*namep)); + namesv = newSVhek_mortal(*namep); if (GvNAMELEN(gv) == 1) sv_catpvs(namesv, ":"); else sv_catpvs(namesv, "::"); } @@ -846,7 +848,7 @@ Perl_mro_package_moved(pTHX_ HV * const GvNAMEUTF8(gv) ? SV_CATUTF8 : SV_CATBYTES ); } - av_push((AV *)namesv, aname); + av_push_simple((AV *)namesv, aname); } } @@ -903,7 +905,7 @@ S_mro_gather_and_rename(pTHX_ HV * const HE *entry; I32 riter = -1; I32 items = 0; - const bool stash_had_name = stash && HvENAME(stash); + const bool stash_had_name = stash && HvHasENAME(stash); bool fetched_isarev = FALSE; HV *seen = NULL; HV *isarev = NULL; @@ -1163,7 +1165,7 @@ S_mro_gather_and_rename(pTHX_ HV * const stashentry && *stashentry && isGV(*stashentry) && (substash = GvHV(*stashentry)) ) - || (oldsubstash && HvENAME_get(oldsubstash)) + || (oldsubstash && HvHasENAME(oldsubstash)) ) { /* Add :: and the key (minus the trailing ::) @@ -1186,7 +1188,7 @@ S_mro_gather_and_rename(pTHX_ HV * const ? SV_CATUTF8 : SV_CATBYTES ); } - av_push((AV *)subname, aname); + av_push_simple((AV *)subname, aname); } } else { @@ -1269,7 +1271,7 @@ S_mro_gather_and_rename(pTHX_ HV * const ? SV_CATUTF8 : SV_CATBYTES ); } - av_push((AV *)subname, aname); + av_push_simple((AV *)subname, aname); } } else { @@ -1327,16 +1329,17 @@ via, Cpkg_gen++; Index: gnu/usr.bin/perl/numeric.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/numeric.c,v diff -u -p -a -u -p -r1.11 numeric.c --- gnu/usr.bin/perl/numeric.c 15 Feb 2023 01:38:21 -0000 1.11 +++ gnu/usr.bin/perl/numeric.c 21 Feb 2024 15:47:02 -0000 @@ -426,42 +426,42 @@ Perl_grok_bin_oct_hex(pTHX_ const char * case 0: return 0; default: - if (UNLIKELY(! _generic_isCC(*s, class_bit))) break; + if (UNLIKELY(! generic_isCC_(*s, class_bit))) break; value = (value << shift) | XDIGIT_VALUE(*s); s++; /* FALLTHROUGH */ case 7: - if (UNLIKELY(! _generic_isCC(*s, class_bit))) break; + if (UNLIKELY(! generic_isCC_(*s, class_bit))) break; value = (value << shift) | XDIGIT_VALUE(*s); s++; /* FALLTHROUGH */ case 6: - if (UNLIKELY(! _generic_isCC(*s, class_bit))) break; + if (UNLIKELY(! generic_isCC_(*s, class_bit))) break; value = (value << shift) | XDIGIT_VALUE(*s); s++; /* FALLTHROUGH */ case 5: - if (UNLIKELY(! _generic_isCC(*s, class_bit))) break; + if (UNLIKELY(! generic_isCC_(*s, class_bit))) break; value = (value << shift) | XDIGIT_VALUE(*s); s++; /* FALLTHROUGH */ case 4: - if (UNLIKELY(! _generic_isCC(*s, class_bit))) break; + if (UNLIKELY(! generic_isCC_(*s, class_bit))) break; value = (value << shift) | XDIGIT_VALUE(*s); s++; /* FALLTHROUGH */ case 3: - if (UNLIKELY(! _generic_isCC(*s, class_bit))) break; + if (UNLIKELY(! generic_isCC_(*s, class_bit))) break; value = (value << shift) | XDIGIT_VALUE(*s); s++; /* FALLTHROUGH */ case 2: - if (UNLIKELY(! _generic_isCC(*s, class_bit))) break; + if (UNLIKELY(! generic_isCC_(*s, class_bit))) break; value = (value << shift) | XDIGIT_VALUE(*s); s++; /* FALLTHROUGH */ case 1: - if (UNLIKELY(! _generic_isCC(*s, class_bit))) break; + if (UNLIKELY(! generic_isCC_(*s, class_bit))) break; value = (value << shift) | XDIGIT_VALUE(*s); if (LIKELY(len <= 8)) { @@ -477,7 +477,7 @@ Perl_grok_bin_oct_hex(pTHX_ const char * len -= bytes_so_far; for (; len--; s++) { - if (_generic_isCC(*s, class_bit)) { + if (generic_isCC_(*s, class_bit)) { /* Write it in this wonky order with a goto to attempt to get the compiler to make the common case integer-only loop pretty tight. With gcc seems to be much straighter code than old scan_hex. @@ -527,7 +527,7 @@ Perl_grok_bin_oct_hex(pTHX_ const char * if ( *s == '_' && len && allow_underscores - && _generic_isCC(s[1], class_bit) + && generic_isCC_(s[1], class_bit) /* Don't allow a leading underscore if the only-medial bit is * set */ @@ -924,7 +924,7 @@ Perl_grok_infnan(pTHX_ const char** sp, * of UVs and NVs can be different. */ if ((nantype & IS_NUMBER_NOT_INT) || - !(nantype && IS_NUMBER_IN_UV)) { + !(nantype & IS_NUMBER_IN_UV)) { /* treat "NaN(invalid)" the same as "NaNgarbage" */ return trail; } @@ -1277,7 +1277,7 @@ no leading zeros). Otherwise it returns value. If you constrain the portion of C that is looked at by this function (by -passing a non-NULL C), and if the intial bytes of that portion form a +passing a non-NULL C), and if the initial bytes of that portion form a valid value, it will return TRUE, setting C<*endptr> to the byte following the final digit of the value. But if there is no constraint at what's looked at, all of C must be valid in order for TRUE to be returned. C<*endptr> is @@ -1492,7 +1492,7 @@ N.B. C must be NUL terminated. { DECLARATION_FOR_LC_NUMERIC_MANIPULATION; STORE_LC_NUMERIC_SET_TO_NEEDED(); - if (! (PL_numeric_radix_sv && IN_LC(LC_NUMERIC))) { + if (! IN_LC(LC_NUMERIC)) { ATOF(s,x); } else { Index: gnu/usr.bin/perl/op.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/op.c,v diff -u -p -a -u -p -r1.27 op.c --- gnu/usr.bin/perl/op.c 8 Jul 2023 14:18:35 -0000 1.27 +++ gnu/usr.bin/perl/op.c 21 Feb 2024 15:47:02 -0000 @@ -19,8 +19,8 @@ * [p.23 of _The Lord of the Rings_, I/i: "A Long-Expected Party"] */ -/* This file contains the functions that create, manipulate and optimize - * the OP structures that hold a compiled perl program. +/* This file contains the functions that create and manipulate the OP + * structures that hold a compiled perl program. * * Note that during the build of miniperl, a temporary copy of this file * is made, called opmini.c. @@ -167,7 +167,6 @@ recursive, but it's recursive on basic b #include "invlist_inline.h" #define CALL_PEEP(o) PL_peepp(aTHX_ o) -#define CALL_RPEEP(o) PL_rpeepp(aTHX_ o) #define CALL_OPFREEHOOK(o) if (PL_opfreehook) PL_opfreehook(aTHX_ o) static const char array_passed_to_stat[] = "Array passed to stat will be coerced to a scalar"; @@ -177,9 +176,11 @@ static const char array_passed_to_stat[] * first node in op_p. */ -STATIC void -S_prune_chain_head(OP** op_p) +void +Perl_op_prune_chain_head(OP** op_p) { + PERL_ARGS_ASSERT_OP_PRUNE_CHAIN_HEAD; + while (*op_p && ( (*op_p)->op_type == OP_NULL || (*op_p)->op_type == OP_SCOPE @@ -512,7 +513,7 @@ Perl_Slab_Free(pTHX_ void *op) void Perl_opslab_free_nopad(pTHX_ OPSLAB *slab) { - const bool havepad = !!PL_comppad; + const bool havepad = cBOOL(PL_comppad); PERL_ARGS_ASSERT_OPSLAB_FREE_NOPAD; if (havepad) { ENTER; @@ -654,12 +655,6 @@ Perl_op_refcnt_dec(pTHX_ OP *o) #define RETURN_UNLIMITED_NUMBER (PERL_INT_MAX / 2) -#define OpTYPE_set(o,type) \ - STMT_START { \ - o->op_type = (OPCODE)type; \ - o->op_ppaddr = PL_ppaddr[type]; \ - } STMT_END - STATIC OP * S_no_fh_allowed(pTHX_ OP *o) { @@ -706,8 +701,8 @@ S_bad_type_gv(pTHX_ I32 n, GV *gv, const (int)n, SVfARG(namesv), t, OP_DESC(kid)), SvUTF8(namesv)); } -STATIC void -S_no_bareword_allowed(pTHX_ OP *o) +void +Perl_no_bareword_allowed(pTHX_ OP *o) { PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED; @@ -777,9 +772,15 @@ Perl_allocmy(pTHX_ const char *const nam /* allocate a spare slot and store the name in that slot */ - off = pad_add_name_pvn(name, len, - (is_our ? padadd_OUR : - PL_parser->in_my == KEY_state ? padadd_STATE : 0), + U32 addflags = 0; + if(is_our) + addflags |= padadd_OUR; + else if(PL_parser->in_my == KEY_state) + addflags |= padadd_STATE; + else if(PL_parser->in_my == KEY_field) + addflags |= padadd_FIELD; + + off = pad_add_name_pvn(name, len, addflags, PL_parser->in_my_stash, (is_our /* $_ is always in main::, even with our */ @@ -854,6 +855,15 @@ S_op_destroy(pTHX_ OP *o) Free an op and its children. Only use this when an op is no longer linked to from any optree. +Remember that any op with C set is expected to have a valid +C pointer. If you are attempting to free an op but preserve its +child op, make sure to clear that flag before calling C. For +example: + + OP *kid = o->op_first; o->op_first = NULL; + o->op_flags &= ~OPf_KIDS; + op_free(o); + =cut */ @@ -903,6 +913,12 @@ Perl_op_free(pTHX_ OP *o) /* free child ops before ourself, (then free ourself "on the * way back up") */ + /* Ensure the caller maintains the relationship between OPf_KIDS and + * op_first != NULL when restructuring the tree + * https://github.com/Perl/perl5/issues/20764 + */ + assert(!(o->op_flags & OPf_KIDS) || cUNOPo->op_first); + if (!went_up && o->op_flags & OPf_KIDS) { next_op = cUNOPo->op_first; continue; @@ -1064,19 +1080,19 @@ Perl_op_clear(pTHX_ OP *o) case OP_METHOD_REDIR: case OP_METHOD_REDIR_SUPER: #ifdef USE_ITHREADS - if (cMETHOPx(o)->op_rclass_targ) { - pad_swipe(cMETHOPx(o)->op_rclass_targ, 1); - cMETHOPx(o)->op_rclass_targ = 0; + if (cMETHOPo->op_rclass_targ) { + pad_swipe(cMETHOPo->op_rclass_targ, 1); + cMETHOPo->op_rclass_targ = 0; } #else - SvREFCNT_dec(cMETHOPx(o)->op_rclass_sv); - cMETHOPx(o)->op_rclass_sv = NULL; + SvREFCNT_dec(cMETHOPo->op_rclass_sv); + cMETHOPo->op_rclass_sv = NULL; #endif /* FALLTHROUGH */ case OP_METHOD_NAMED: case OP_METHOD_SUPER: - SvREFCNT_dec(cMETHOPx(o)->op_u.op_meth_sv); - cMETHOPx(o)->op_u.op_meth_sv = NULL; + SvREFCNT_dec(cMETHOPo->op_u.op_meth_sv); + cMETHOPo->op_u.op_meth_sv = NULL; #ifdef USE_ITHREADS if (o->op_targ) { pad_swipe(o->op_targ, 1); @@ -1303,6 +1319,22 @@ Perl_op_clear(pTHX_ OP *o) PerlMemShared_free(cUNOP_AUXo->op_aux - 1); } break; + + case OP_METHSTART: + { + UNOP_AUX_item *aux = cUNOP_AUXo->op_aux; + /* Every item in aux is a UV, so nothing in it to free */ + Safefree(aux); + } + break; + + case OP_INITFIELD: + { + UNOP_AUX_item *aux = cUNOP_AUXo->op_aux; + /* Every item in aux is a UV, so nothing in it to free */ + Safefree(aux); + } + break; } if (o->op_targ > 0) { @@ -1336,7 +1368,8 @@ S_cop_free(pTHX_ COP* cop) } CopFILE_free(cop); if (! specialWARN(cop->cop_warnings)) - PerlMemShared_free(cop->cop_warnings); + cop->cop_warnings = rcpv_free(cop->cop_warnings); + cophh_free(CopHINTHASH_get(cop)); if (PL_curcop == cop) PL_curcop = NULL; @@ -1391,7 +1424,7 @@ S_find_and_forget_pmops(pTHX_ OP *o) case OP_SPLIT: case OP_MATCH: case OP_QR: - forget_pmop((PMOP*)o); + forget_pmop(cPMOPo); } if (o->op_flags & OPf_KIDS) { @@ -1833,105 +1866,80 @@ S_op_varname_subscript(pTHX_ const OP *o } } -static SV * -S_op_varname(pTHX_ const OP *o) +SV * +Perl_op_varname(pTHX_ const OP *o) { + PERL_ARGS_ASSERT_OP_VARNAME; + return S_op_varname_subscript(aTHX_ o, 1); } -static void -S_op_pretty(pTHX_ const OP *o, SV **retsv, const char **retpv) -{ /* or not so pretty :-) */ - if (o->op_type == OP_CONST) { - *retsv = cSVOPo_sv; - if (SvPOK(*retsv)) { - SV *sv = *retsv; - *retsv = sv_newmortal(); - pv_pretty(*retsv, SvPVX_const(sv), SvCUR(sv), 32, NULL, NULL, - PERL_PV_PRETTY_DUMP |PERL_PV_ESCAPE_UNI_DETECT); - } - else if (!SvOK(*retsv)) - *retpv = "undef"; - } - else *retpv = "..."; -} +/* -static void -S_scalar_slice_warning(pTHX_ const OP *o) +Warns that an access of a single element from a named container variable in +scalar context might not be what the programmer wanted. The container +variable's (sigiled, full) name is given by C, and the key to access +it is given by the C of the C op given by C. +C selects whether it prints using {KEY} or [KEY] brackets. + +C selects between two different messages used in different places. + */ +void +Perl_warn_elem_scalar_context(pTHX_ const OP *o, SV *name, bool is_hash, bool is_slice) { - OP *kid; - const bool h = o->op_type == OP_HSLICE - || (o->op_type == OP_NULL && o->op_targ == OP_HSLICE); - const char lbrack = - h ? '{' : '['; - const char rbrack = - h ? '}' : ']'; - SV *name; - SV *keysv = NULL; /* just to silence compiler warnings */ - const char *key = NULL; + PERL_ARGS_ASSERT_WARN_ELEM_SCALAR_CONTEXT; - if (!(o->op_private & OPpSLICEWARNING)) - return; - if (PL_parser && PL_parser->error_count) - /* This warning can be nonsensical when there is a syntax error. */ - return; + SV *keysv = NULL; + const char *keypv = NULL; - kid = cLISTOPo->op_first; - kid = OpSIBLING(kid); /* get past pushmark */ - /* weed out false positives: any ops that can return lists */ - switch (kid->op_type) { - case OP_BACKTICK: - case OP_GLOB: - case OP_READLINE: - case OP_MATCH: - case OP_RV2AV: - case OP_EACH: - case OP_VALUES: - case OP_KEYS: - case OP_SPLIT: - case OP_LIST: - case OP_SORT: - case OP_REVERSE: - case OP_ENTERSUB: - case OP_CALLER: - case OP_LSTAT: - case OP_STAT: - case OP_READDIR: - case OP_SYSTEM: - case OP_TMS: - case OP_LOCALTIME: - case OP_GMTIME: - case OP_ENTEREVAL: - return; - } + const char lbrack = is_hash ? '{' : '['; + const char rbrack = is_hash ? '}' : ']'; - /* Don't warn if we have a nulled list either. */ - if (kid->op_type == OP_NULL && kid->op_targ == OP_LIST) - return; + if (o->op_type == OP_CONST) { + keysv = cSVOPo_sv; + if (SvPOK(keysv)) { + SV *sv = keysv; + keysv = sv_newmortal(); + pv_pretty(keysv, SvPVX_const(sv), SvCUR(sv), 32, NULL, NULL, + PERL_PV_PRETTY_DUMP |PERL_PV_ESCAPE_UNI_DETECT); + } + else if (!SvOK(keysv)) + keypv = "undef"; + } + else keypv = "..."; - assert(OpSIBLING(kid)); - name = S_op_varname(aTHX_ OpSIBLING(kid)); - if (!name) /* XS module fiddling with the op tree */ - return; - S_op_pretty(aTHX_ kid, &keysv, &key); assert(SvPOK(name)); sv_chop(name,SvPVX(name)+1); - if (key) - /* diag_listed_as: Scalar value @%s[%s] better written as $%s[%s] */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "Scalar value @%" SVf "%c%s%c better written as $%" SVf - "%c%s%c", - SVfARG(name), lbrack, key, rbrack, SVfARG(name), - lbrack, key, rbrack); - else - /* diag_listed_as: Scalar value @%s[%s] better written as $%s[%s] */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "Scalar value @%" SVf "%c%" SVf "%c better written as $%" - SVf "%c%" SVf "%c", - SVfARG(name), lbrack, SVfARG(keysv), rbrack, - SVfARG(name), lbrack, SVfARG(keysv), rbrack); -} + const char *msg; + + if (keypv) { + msg = is_slice ? + /* diag_listed_as: Scalar value @%s[%s] better written as $%s[%s] */ + PERL_DIAG_WARN_SYNTAX( + "Scalar value @%" SVf "%c%s%c better written as $%" SVf "%c%s%c") : + /* diag_listed_as: %%s[%s] in scalar context better written as $%s[%s] */ + PERL_DIAG_WARN_SYNTAX( + "%%%" SVf "%c%s%c in scalar context better written as $%" SVf "%c%s%c"); + + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), msg, + SVfARG(name), lbrack, keypv, rbrack, + SVfARG(name), lbrack, keypv, rbrack); + } + else { + msg = is_slice ? + /* diag_listed_as: Scalar value @%s[%s] better written as $%s[%s] */ + PERL_DIAG_WARN_SYNTAX( + "Scalar value @%" SVf "%c%" SVf "%c better written as $%" SVf "%c%" SVf "%c") : + /* diag_listed_as: %%s[%s] in scalar context better written as $%s[%s] */ + PERL_DIAG_WARN_SYNTAX( + "%%%" SVf "%c%" SVf "%c in scalar context better written as $%" SVf "%c%" SVf "%c"); + + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), msg, + SVfARG(name), lbrack, SVfARG(keysv), rbrack, + SVfARG(name), lbrack, SVfARG(keysv), rbrack); + } +} /* apply scalar context to the o subtree */ @@ -2039,11 +2047,7 @@ Perl_scalar(pTHX_ OP *o) case OP_KVASLICE: { /* Warn about scalar context */ - const char lbrack = o->op_type == OP_KVHSLICE ? '{' : '['; - const char rbrack = o->op_type == OP_KVHSLICE ? '}' : ']'; SV *name; - SV *keysv; - const char *key = NULL; /* This warning can be nonsensical when there is a syntax error. */ if (PL_parser && PL_parser->error_count) @@ -2054,26 +2058,10 @@ Perl_scalar(pTHX_ OP *o) kid = cLISTOPo->op_first; kid = OpSIBLING(kid); /* get past pushmark */ assert(OpSIBLING(kid)); - name = S_op_varname(aTHX_ OpSIBLING(kid)); + name = op_varname(OpSIBLING(kid)); if (!name) /* XS module fiddling with the op tree */ break; - S_op_pretty(aTHX_ kid, &keysv, &key); - assert(SvPOK(name)); - sv_chop(name,SvPVX(name)+1); - if (key) - /* diag_listed_as: %%s[%s] in scalar context better written as $%s[%s] */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "%%%" SVf "%c%s%c in scalar context better written " - "as $%" SVf "%c%s%c", - SVfARG(name), lbrack, key, rbrack, SVfARG(name), - lbrack, key, rbrack); - else - /* diag_listed_as: %%s[%s] in scalar context better written as $%s[%s] */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "%%%" SVf "%c%" SVf "%c in scalar context better " - "written as $%" SVf "%c%" SVf "%c", - SVfARG(name), lbrack, SVfARG(keysv), rbrack, - SVfARG(name), lbrack, SVfARG(keysv), rbrack); + warn_elem_scalar_context(kid, name, o->op_type == OP_KVHSLICE, false); } } /* switch */ @@ -2174,6 +2162,7 @@ Perl_scalarvoid(pTHX_ OP *arg) case OP_REF: case OP_REFGEN: case OP_SREFGEN: + case OP_ANONCODE: case OP_DEFINED: case OP_HEX: case OP_OCT: @@ -2343,17 +2332,17 @@ Perl_scalarvoid(pTHX_ OP *arg) if ((o->op_private & ~OPpASSIGN_BACKWARDS) != 2) break; - rv2gv = ((BINOP *)o)->op_last; + rv2gv = cBINOPo->op_last; if (!rv2gv || rv2gv->op_type != OP_RV2GV) break; - refgen = (UNOP *)((BINOP *)o)->op_first; + refgen = cUNOPx(cBINOPo->op_first); if (!refgen || (refgen->op_type != OP_REFGEN && refgen->op_type != OP_SREFGEN)) break; - exlist = (LISTOP *)refgen->op_first; + exlist = cLISTOPx(refgen->op_first); if (!exlist || exlist->op_type != OP_NULL || exlist->op_targ != OP_LIST) break; @@ -2362,7 +2351,7 @@ Perl_scalarvoid(pTHX_ OP *arg) && exlist->op_first != exlist->op_last) break; - rv2cv = (UNOP*)exlist->op_last; + rv2cv = cUNOPx(exlist->op_last); if (rv2cv->op_type != OP_RV2CV) break; @@ -2480,8 +2469,7 @@ Perl_scalarvoid(pTHX_ OP *arg) } o = next_kid; } - - return arg; + NOT_REACHED; } @@ -2698,8 +2686,8 @@ S_modkids(pTHX_ OP *o, I32 type) * real if false, only check (and possibly croak); don't update op */ -STATIC void -S_check_hash_fields_and_hekify(pTHX_ UNOP *rop, SVOP *key_op, int real) +void +Perl_check_hash_fields_and_hekify(pTHX_ UNOP *rop, SVOP *key_op, int real) { PADNAME *lexname; GV **fields; @@ -2709,13 +2697,13 @@ S_check_hash_fields_and_hekify(pTHX_ UNO if (rop) { if (rop->op_first->op_type == OP_PADSV) /* @$hash{qw(keys here)} */ - rop = (UNOP*)rop->op_first; + rop = cUNOPx(rop->op_first); else { /* @{$hash}{qw(keys here)} */ if (rop->op_first->op_type == OP_SCOPE && cLISTOPx(rop->op_first)->op_last->op_type == OP_PADSV) { - rop = (UNOP*)cLISTOPx(rop->op_first)->op_last; + rop = cUNOPx(cLISTOPx(rop->op_first)->op_last); } else rop = NULL; @@ -2728,11 +2716,11 @@ S_check_hash_fields_and_hekify(pTHX_ UNO check_fields = rop && (lexname = padnamelist_fetch(PL_comppad_name, rop->op_targ), - SvPAD_TYPED(lexname)) + PadnameHasTYPE(lexname)) && (fields = (GV**)hv_fetchs(PadnameTYPE(lexname), "FIELDS", FALSE)) && isGV(*fields) && GvHV(*fields); - for (; key_op; key_op = (SVOP*)OpSIBLING(key_op)) { + for (; key_op; key_op = cSVOPx(OpSIBLING(key_op))) { SV **svp, *sv; if (key_op->op_type != OP_CONST) continue; @@ -2770,6337 +2758,5272 @@ S_check_hash_fields_and_hekify(pTHX_ UNO } } -/* info returned by S_sprintf_is_multiconcatable() */ - -struct sprintf_ismc_info { - SSize_t nargs; /* num of args to sprintf (not including the format) */ - char *start; /* start of raw format string */ - char *end; /* bytes after end of raw format string */ - STRLEN total_len; /* total length (in bytes) of format string, not - including '%s' and half of '%%' */ - STRLEN variant; /* number of bytes by which total_len_p would grow - if upgraded to utf8 */ - bool utf8; /* whether the format is utf8 */ -}; - -/* is the OP_SPRINTF o suitable for converting into a multiconcat op? - * i.e. its format argument is a const string with only '%s' and '%%' - * formats, and the number of args is known, e.g. - * sprintf "a=%s f=%s", $a[0], scalar(f()); - * but not - * sprintf "i=%d a=%s f=%s", $i, @a, f(); - * - * If successful, the sprintf_ismc_info struct pointed to by info will be - * populated. +/* do all the final processing on an optree (e.g. running the peephole + * optimiser on it), then attach it to cv (if cv is non-null) */ -STATIC bool -S_sprintf_is_multiconcatable(pTHX_ OP *o,struct sprintf_ismc_info *info) +static void +S_process_optree(pTHX_ CV *cv, OP *optree, OP* start) { - OP *pm, *constop, *kid; - SV *sv; - char *s, *e, *p; - SSize_t nargs, nformats; - STRLEN cur, total_len, variant; - bool utf8; - - /* if sprintf's behaviour changes, die here so that someone - * can decide whether to enhance this function or skip optimising - * under those new circumstances */ - assert(!(o->op_flags & OPf_STACKED)); - assert(!(PL_opargs[OP_SPRINTF] & OA_TARGLEX)); - assert(!(o->op_private & ~OPpARG4_MASK)); - - pm = cUNOPo->op_first; - if (pm->op_type != OP_PUSHMARK) /* weird coreargs stuff */ - return FALSE; - constop = OpSIBLING(pm); - if (!constop || constop->op_type != OP_CONST) - return FALSE; - sv = cSVOPx_sv(constop); - if (SvMAGICAL(sv) || !SvPOK(sv)) - return FALSE; + OP **startp; - s = SvPV(sv, cur); - e = s + cur; + /* XXX for some reason, evals, require and main optrees are + * never attached to their CV; instead they just hang off + * PL_main_root + PL_main_start or PL_eval_root + PL_eval_start + * and get manually freed when appropriate */ + if (cv) + startp = &CvSTART(cv); + else + startp = PL_in_eval? &PL_eval_start : &PL_main_start; - /* Scan format for %% and %s and work out how many %s there are. - * Abandon if other format types are found. - */ + *startp = start; + optree->op_private |= OPpREFCOUNTED; + OpREFCNT_set(optree, 1); + optimize_optree(optree); + CALL_PEEP(*startp); + finalize_optree(optree); + op_prune_chain_head(startp); - nformats = 0; - total_len = 0; - variant = 0; - - for (p = s; p < e; p++) { - if (*p != '%') { - total_len++; - if (!UTF8_IS_INVARIANT(*p)) - variant++; - continue; - } - p++; - if (p >= e) - return FALSE; /* lone % at end gives "Invalid conversion" */ - if (*p == '%') - total_len++; - else if (*p == 's') - nformats++; - else - return FALSE; + if (cv) { + /* now that optimizer has done its work, adjust pad values */ + pad_tidy(optree->op_type == OP_LEAVEWRITE ? padtidy_FORMAT + : CvCLONE(cv) ? padtidy_SUBCLONE : padtidy_SUB); } +} - if (!nformats || nformats > PERL_MULTICONCAT_MAXARG) - return FALSE; - - utf8 = cBOOL(SvUTF8(sv)); - if (utf8) - variant = 0; - - /* scan args; they must all be in scalar cxt */ - - nargs = 0; - kid = OpSIBLING(constop); +#ifdef USE_ITHREADS +/* Relocate sv to the pad for thread safety. + * Despite being a "constant", the SV is written to, + * for reference counts, sv_upgrade() etc. */ +void +Perl_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp) +{ + PADOFFSET ix; + PERL_ARGS_ASSERT_OP_RELOCATE_SV; + if (!*svp) return; + ix = pad_alloc(OP_CONST, SVf_READONLY); + SvREFCNT_dec(PAD_SVl(ix)); + PAD_SETSV(ix, *svp); + /* XXX I don't know how this isn't readonly already. */ + if (!SvIsCOW(PAD_SVl(ix))) SvREADONLY_on(PAD_SVl(ix)); + *svp = NULL; + *targp = ix; +} +#endif - while (kid) { - if ((kid->op_flags & OPf_WANT) != OPf_WANT_SCALAR) - return FALSE; - nargs++; - kid = OpSIBLING(kid); +static void +S_mark_padname_lvalue(pTHX_ PADNAME *pn) +{ + CV *cv = PL_compcv; + PadnameLVALUE_on(pn); + while (PadnameOUTER(pn) && PARENT_PAD_INDEX(pn)) { + cv = CvOUTSIDE(cv); + /* RT #127786: cv can be NULL due to an eval within the DB package + * called from an anon sub - anon subs don't have CvOUTSIDE() set + * unless they contain an eval, but calling eval within DB + * pretends the eval was done in the caller's scope. + */ + if (!cv) + break; + assert(CvPADLIST(cv)); + pn = + PadlistNAMESARRAY(CvPADLIST(cv))[PARENT_PAD_INDEX(pn)]; + assert(PadnameLEN(pn)); + PadnameLVALUE_on(pn); } - - if (nargs != nformats) - return FALSE; /* e.g. sprintf("%s%s", $a); */ - - - info->nargs = nargs; - info->start = s; - info->end = e; - info->total_len = total_len; - info->variant = variant; - info->utf8 = utf8; - - return TRUE; } +static bool +S_vivifies(const OPCODE type) +{ + switch(type) { + case OP_RV2AV: case OP_ASLICE: + case OP_RV2HV: case OP_KVASLICE: + case OP_RV2SV: case OP_HSLICE: + case OP_AELEMFAST: case OP_KVHSLICE: + case OP_HELEM: + case OP_AELEM: + return 1; + } + return 0; +} -/* S_maybe_multiconcat(): - * - * given an OP_STRINGIFY, OP_SASSIGN, OP_CONCAT or OP_SPRINTF op, possibly - * convert it (and its children) into an OP_MULTICONCAT. See the code - * comments just before pp_multiconcat() for the full details of what - * OP_MULTICONCAT supports. - * - * Basically we're looking for an optree with a chain of OP_CONCATS down - * the LHS (or an OP_SPRINTF), with possibly an OP_SASSIGN, and/or - * OP_STRINGIFY, and/or OP_CONCAT acting as '.=' at its head, e.g. - * - * $x = "$a$b-$c" - * - * looks like - * - * SASSIGN - * | - * STRINGIFY -- PADSV[$x] - * | - * | - * ex-PUSHMARK -- CONCAT/S - * | - * CONCAT/S -- PADSV[$d] - * | - * CONCAT -- CONST["-"] - * | - * PADSV[$a] -- PADSV[$b] - * - * Note that at this stage the OP_SASSIGN may have already been optimised - * away with OPpTARGET_MY set on the OP_STRINGIFY or OP_CONCAT. +/* apply lvalue reference (aliasing) context to the optree o. + * E.g. in + * \($x,$y) = (...) + * o would be the list ($x,$y) and type would be OP_AASSIGN. + * It may descend and apply this to children too, for example in + * \( $cond ? $x, $y) = (...) */ -STATIC void -S_maybe_multiconcat(pTHX_ OP *o) +static void +S_lvref(pTHX_ OP *o, I32 type) { - OP *lastkidop; /* the right-most of any kids unshifted onto o */ - OP *topop; /* the top-most op in the concat tree (often equals o, - unless there are assign/stringify ops above it */ - OP *parentop; /* the parent op of topop (or itself if no parent) */ - OP *targmyop; /* the op (if any) with the OPpTARGET_MY flag */ - OP *targetop; /* the op corresponding to target=... or target.=... */ - OP *stringop; /* the OP_STRINGIFY op, if any */ - OP *nextop; /* used for recreating the op_next chain without consts */ - OP *kid; /* general-purpose op pointer */ - UNOP_AUX_item *aux; - UNOP_AUX_item *lenp; - char *const_str, *p; - struct sprintf_ismc_info sprintf_info; - - /* store info about each arg in args[]; - * toparg is the highest used slot; argp is a general - * pointer to args[] slots */ - struct { - void *p; /* initially points to const sv (or null for op); - later, set to SvPV(constsv), with ... */ - STRLEN len; /* ... len set to SvPV(..., len) */ - } *argp, *toparg, args[PERL_MULTICONCAT_MAXARG*2 + 1]; - - SSize_t nargs = 0; - SSize_t nconst = 0; - SSize_t nadjconst = 0; /* adjacent consts - may be demoted to args */ - STRLEN variant; - bool utf8 = FALSE; - bool kid_is_last = FALSE; /* most args will be the RHS kid of a concat op; - the last-processed arg will the LHS of one, - as args are processed in reverse order */ - U8 stacked_last = 0; /* whether the last seen concat op was STACKED */ - STRLEN total_len = 0; /* sum of the lengths of the const segments */ - U8 flags = 0; /* what will become the op_flags and ... */ - U8 private_flags = 0; /* ... op_private of the multiconcat op */ - bool is_sprintf = FALSE; /* we're optimising an sprintf */ - bool is_targable = FALSE; /* targetop is an OPpTARGET_MY candidate */ - bool prev_was_const = FALSE; /* previous arg was a const */ + OP *kid; + OP * top_op = o; - /* ----------------------------------------------------------------- - * Phase 1: - * - * Examine the optree non-destructively to determine whether it's - * suitable to be converted into an OP_MULTICONCAT. Accumulate - * information about the optree in args[]. - */ + while (1) { + switch (o->op_type) { + case OP_COND_EXPR: + o = OpSIBLING(cUNOPo->op_first); + continue; - argp = args; - targmyop = NULL; - targetop = NULL; - stringop = NULL; - topop = o; - parentop = o; - - assert( o->op_type == OP_SASSIGN - || o->op_type == OP_CONCAT - || o->op_type == OP_SPRINTF - || o->op_type == OP_STRINGIFY); - - Zero(&sprintf_info, 1, struct sprintf_ismc_info); - - /* first see if, at the top of the tree, there is an assign, - * append and/or stringify */ - - if (topop->op_type == OP_SASSIGN) { - /* expr = ..... */ - if (o->op_ppaddr != PL_ppaddr[OP_SASSIGN]) - return; - if (o->op_private & (OPpASSIGN_BACKWARDS|OPpASSIGN_CV_TO_GV)) - return; - assert(!(o->op_private & ~OPpARG2_MASK)); /* barf on unknown flags */ + case OP_PUSHMARK: + goto do_next; - parentop = topop; - topop = cBINOPo->op_first; - targetop = OpSIBLING(topop); - if (!targetop) /* probably some sort of syntax error */ - return; + case OP_RV2AV: + if (cUNOPo->op_first->op_type != OP_GV) goto badref; + o->op_flags |= OPf_STACKED; + if (o->op_flags & OPf_PARENS) { + if (o->op_private & OPpLVAL_INTRO) { + yyerror(Perl_form(aTHX_ "Can't modify reference to " + "localized parenthesized array in list assignment")); + goto do_next; + } + slurpy: + OpTYPE_set(o, OP_LVAVREF); + o->op_private &= OPpLVAL_INTRO|OPpPAD_STATE; + o->op_flags |= OPf_MOD|OPf_REF; + goto do_next; + } + o->op_private |= OPpLVREF_AV; + goto checkgv; - /* don't optimise away assign in 'local $foo = ....' */ - if ( (targetop->op_private & OPpLVAL_INTRO) - /* these are the common ops which do 'local', but - * not all */ - && ( targetop->op_type == OP_GVSV - || targetop->op_type == OP_RV2SV - || targetop->op_type == OP_AELEM - || targetop->op_type == OP_HELEM - ) - ) - return; - } - else if ( topop->op_type == OP_CONCAT - && (topop->op_flags & OPf_STACKED) - && (!(topop->op_private & OPpCONCAT_NESTED)) - ) - { - /* expr .= ..... */ + case OP_RV2CV: + kid = cUNOPo->op_first; + if (kid->op_type == OP_NULL) + kid = cUNOPx(OpSIBLING(kUNOP->op_first)) + ->op_first; + o->op_private = OPpLVREF_CV; + if (kid->op_type == OP_GV) + o->op_flags |= OPf_STACKED; + else if (kid->op_type == OP_PADCV) { + o->op_targ = kid->op_targ; + kid->op_targ = 0; + op_free(cUNOPo->op_first); + cUNOPo->op_first = NULL; + o->op_flags &=~ OPf_KIDS; + } + else goto badref; + break; - /* OPpTARGET_MY shouldn't be able to be set here. If it is, - * decide what to do about it */ - assert(!(o->op_private & OPpTARGET_MY)); - - /* barf on unknown flags */ - assert(!(o->op_private & ~(OPpARG2_MASK|OPpTARGET_MY))); - private_flags |= OPpMULTICONCAT_APPEND; - targetop = cBINOPo->op_first; - parentop = topop; - topop = OpSIBLING(targetop); + case OP_RV2HV: + if (o->op_flags & OPf_PARENS) { + parenhash: + yyerror(Perl_form(aTHX_ "Can't modify reference to " + "parenthesized hash in list assignment")); + goto do_next; + } + o->op_private |= OPpLVREF_HV; + /* FALLTHROUGH */ + case OP_RV2SV: + checkgv: + if (cUNOPo->op_first->op_type != OP_GV) goto badref; + o->op_flags |= OPf_STACKED; + break; - /* $x .= gets optimised to rcatline instead */ - if (topop->op_type == OP_READLINE) - return; - } - - if (targetop) { - /* Can targetop (the LHS) if it's a padsv, be optimised - * away and use OPpTARGET_MY instead? - */ - if ( (targetop->op_type == OP_PADSV) - && !(targetop->op_private & OPpDEREF) - && !(targetop->op_private & OPpPAD_STATE) - /* we don't support 'my $x .= ...' */ - && ( o->op_type == OP_SASSIGN - || !(targetop->op_private & OPpLVAL_INTRO)) - ) - is_targable = TRUE; - } - - if (topop->op_type == OP_STRINGIFY) { - if (topop->op_ppaddr != PL_ppaddr[OP_STRINGIFY]) - return; - stringop = topop; - - /* barf on unknown flags */ - assert(!(o->op_private & ~(OPpARG4_MASK|OPpTARGET_MY))); - - if ((topop->op_private & OPpTARGET_MY)) { - if (o->op_type == OP_SASSIGN) - return; /* can't have two assigns */ - targmyop = topop; - } - - private_flags |= OPpMULTICONCAT_STRINGIFY; - parentop = topop; - topop = cBINOPx(topop)->op_first; - assert(OP_TYPE_IS_OR_WAS_NN(topop, OP_PUSHMARK)); - topop = OpSIBLING(topop); - } - - if (topop->op_type == OP_SPRINTF) { - if (topop->op_ppaddr != PL_ppaddr[OP_SPRINTF]) - return; - if (S_sprintf_is_multiconcatable(aTHX_ topop, &sprintf_info)) { - nargs = sprintf_info.nargs; - total_len = sprintf_info.total_len; - variant = sprintf_info.variant; - utf8 = sprintf_info.utf8; - is_sprintf = TRUE; - private_flags |= OPpMULTICONCAT_FAKE; - toparg = argp; - /* we have an sprintf op rather than a concat optree. - * Skip most of the code below which is associated with - * processing that optree. We also skip phase 2, determining - * whether its cost effective to optimise, since for sprintf, - * multiconcat is *always* faster */ - goto create_aux; - } - /* note that even if the sprintf itself isn't multiconcatable, - * the expression as a whole may be, e.g. in - * $x .= sprintf("%d",...) - * the sprintf op will be left as-is, but the concat/S op may - * be upgraded to multiconcat - */ - } - else if (topop->op_type == OP_CONCAT) { - if (topop->op_ppaddr != PL_ppaddr[OP_CONCAT]) - return; - - if ((topop->op_private & OPpTARGET_MY)) { - if (o->op_type == OP_SASSIGN || targmyop) - return; /* can't have two assigns */ - targmyop = topop; - } - } - - /* Is it safe to convert a sassign/stringify/concat op into - * a multiconcat? */ - assert((PL_opargs[OP_SASSIGN] & OA_CLASS_MASK) == OA_BINOP); - assert((PL_opargs[OP_CONCAT] & OA_CLASS_MASK) == OA_BINOP); - assert((PL_opargs[OP_STRINGIFY] & OA_CLASS_MASK) == OA_LISTOP); - assert((PL_opargs[OP_SPRINTF] & OA_CLASS_MASK) == OA_LISTOP); - STATIC_ASSERT_STMT( STRUCT_OFFSET(BINOP, op_last) - == STRUCT_OFFSET(UNOP_AUX, op_aux)); - STATIC_ASSERT_STMT( STRUCT_OFFSET(LISTOP, op_last) - == STRUCT_OFFSET(UNOP_AUX, op_aux)); - - /* Now scan the down the tree looking for a series of - * CONCAT/OPf_STACKED ops on the LHS (with the last one not - * stacked). For example this tree: - * - * | - * CONCAT/STACKED - * | - * CONCAT/STACKED -- EXPR5 - * | - * CONCAT/STACKED -- EXPR4 - * | - * CONCAT -- EXPR3 - * | - * EXPR1 -- EXPR2 - * - * corresponds to an expression like - * - * (EXPR1 . EXPR2 . EXPR3 . EXPR4 . EXPR5) - * - * Record info about each EXPR in args[]: in particular, whether it is - * a stringifiable OP_CONST and if so what the const sv is. - * - * The reason why the last concat can't be STACKED is the difference - * between - * - * ((($a .= $a) .= $a) .= $a) .= $a - * - * and - * $a . $a . $a . $a . $a - * - * The main difference between the optrees for those two constructs - * is the presence of the last STACKED. As well as modifying $a, - * the former sees the changed $a between each concat, so if $s is - * initially 'a', the first returns 'a' x 16, while the latter returns - * 'a' x 5. And pp_multiconcat can't handle that kind of thing. - */ + case OP_PADHV: + if (o->op_flags & OPf_PARENS) goto parenhash; + o->op_private |= OPpLVREF_HV; + /* FALLTHROUGH */ + case OP_PADSV: + PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX); + break; - kid = topop; + case OP_PADAV: + PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX); + if (o->op_flags & OPf_PARENS) goto slurpy; + o->op_private |= OPpLVREF_AV; + break; - for (;;) { - OP *argop; - SV *sv; - bool last = FALSE; + case OP_AELEM: + case OP_HELEM: + o->op_private |= OPpLVREF_ELEM; + o->op_flags |= OPf_STACKED; + break; - if ( kid->op_type == OP_CONCAT - && !kid_is_last - ) { - OP *k1, *k2; - k1 = cUNOPx(kid)->op_first; - k2 = OpSIBLING(k1); - /* shouldn't happen except maybe after compile err? */ - if (!k2) - return; + case OP_ASLICE: + case OP_HSLICE: + OpTYPE_set(o, OP_LVREFSLICE); + o->op_private &= OPpLVAL_INTRO; + goto do_next; - /* avoid turning (A . B . ($lex = C) ...) into (A . B . C ...) */ - if (kid->op_private & OPpTARGET_MY) - kid_is_last = TRUE; - - stacked_last = (kid->op_flags & OPf_STACKED); - if (!stacked_last) - kid_is_last = TRUE; + case OP_NULL: + if (o->op_flags & OPf_SPECIAL) /* do BLOCK */ + goto badref; + else if (!(o->op_flags & OPf_KIDS)) + goto do_next; - kid = k1; - argop = k2; - } - else { - argop = kid; - last = TRUE; - } + /* the code formerly only recursed into the first child of + * a non ex-list OP_NULL. if we ever encounter such a null op with + * more than one child, need to decide whether its ok to process + * *all* its kids or not */ + assert(o->op_targ == OP_LIST + || !(OpHAS_SIBLING(cBINOPo->op_first))); + /* FALLTHROUGH */ + case OP_LIST: + o = cLISTOPo->op_first; + continue; - if ( nargs + nadjconst > PERL_MULTICONCAT_MAXARG - 2 - || (argp - args + 1) > (PERL_MULTICONCAT_MAXARG*2 + 1) - 2) - { - /* At least two spare slots are needed to decompose both - * concat args. If there are no slots left, continue to - * examine the rest of the optree, but don't push new values - * on args[]. If the optree as a whole is legal for conversion - * (in particular that the last concat isn't STACKED), then - * the first PERL_MULTICONCAT_MAXARG elements of the optree - * can be converted into an OP_MULTICONCAT now, with the first - * child of that op being the remainder of the optree - - * which may itself later be converted to a multiconcat op - * too. - */ - if (last) { - /* the last arg is the rest of the optree */ - argp++->p = NULL; - nargs++; - } - } - else if ( argop->op_type == OP_CONST - && ((sv = cSVOPx_sv(argop))) - /* defer stringification until runtime of 'constant' - * things that might stringify variantly, e.g. the radix - * point of NVs, or overloaded RVs */ - && (SvPOK(sv) || SvIOK(sv)) - && (!SvGMAGICAL(sv)) - ) { - if (argop->op_private & OPpCONST_STRICT) - no_bareword_allowed(argop); - argp++->p = sv; - utf8 |= cBOOL(SvUTF8(sv)); - nconst++; - if (prev_was_const) - /* this const may be demoted back to a plain arg later; - * make sure we have enough arg slots left */ - nadjconst++; - prev_was_const = !prev_was_const; - } - else { - argp++->p = NULL; - nargs++; - prev_was_const = FALSE; + case OP_STUB: + if (o->op_flags & OPf_PARENS) + goto do_next; + /* FALLTHROUGH */ + default: + badref: + /* diag_listed_as: Can't modify reference to %s in %s assignment */ + yyerror(Perl_form(aTHX_ "Can't modify reference to %s in %s", + o->op_type == OP_NULL && o->op_flags & OPf_SPECIAL + ? "do block" + : OP_DESC(o), + PL_op_desc[type])); + goto do_next; } - if (last) - break; - } - - toparg = argp - 1; - - if (stacked_last) - return; /* we don't support ((A.=B).=C)...) */ + OpTYPE_set(o, OP_LVREF); + o->op_private &= + OPpLVAL_INTRO|OPpLVREF_ELEM|OPpLVREF_TYPE|OPpPAD_STATE; + if (type == OP_ENTERLOOP) + o->op_private |= OPpLVREF_ITER; - /* look for two adjacent consts and don't fold them together: - * $o . "a" . "b" - * should do - * $o->concat("a")->concat("b") - * rather than - * $o->concat("ab") - * (but $o .= "a" . "b" should still fold) - */ - { - bool seen_nonconst = FALSE; - for (argp = toparg; argp >= args; argp--) { - if (argp->p == NULL) { - seen_nonconst = TRUE; - continue; - } - if (!seen_nonconst) - continue; - if (argp[1].p) { - /* both previous and current arg were constants; - * leave the current OP_CONST as-is */ - argp->p = NULL; - nconst--; - nargs++; + do_next: + while (1) { + if (o == top_op) + return; /* at top; no parents/siblings to try */ + if (OpHAS_SIBLING(o)) { + o = o->op_sibparent; + break; } + o = o->op_sibparent; /*try parent's next sibling */ } - } - - /* ----------------------------------------------------------------- - * Phase 2: - * - * At this point we have determined that the optree *can* be converted - * into a multiconcat. Having gathered all the evidence, we now decide - * whether it *should*. - */ + } /* while */ +} - /* we need at least one concat action, e.g.: - * - * Y . Z - * X = Y . Z - * X .= Y - * - * otherwise we could be doing something like $x = "foo", which - * if treated as a concat, would fail to COW. - */ - if (nargs + nconst + cBOOL(private_flags & OPpMULTICONCAT_APPEND) < 2) - return; +PERL_STATIC_INLINE bool +S_potential_mod_type(I32 type) +{ + /* Types that only potentially result in modification. */ + return type == OP_GREPSTART || type == OP_ENTERSUB + || type == OP_REFGEN || type == OP_LEAVESUBLV; +} - /* Benchmarking seems to indicate that we gain if: - * * we optimise at least two actions into a single multiconcat - * (e.g concat+concat, sassign+concat); - * * or if we can eliminate at least 1 OP_CONST; - * * or if we can eliminate a padsv via OPpTARGET_MY - */ - if ( - /* eliminated at least one OP_CONST */ - nconst >= 1 - /* eliminated an OP_SASSIGN */ - || o->op_type == OP_SASSIGN - /* eliminated an OP_PADSV */ - || (!targmyop && is_targable) - ) - /* definitely a net gain to optimise */ - goto optimise; +/* +=for apidoc op_lvalue - /* ... if not, what else? */ +Propagate lvalue ("modifiable") context to an op and its children. +C represents the context type, roughly based on the type of op that +would do the modifying, although C is represented by C, +because it has no op type of its own (it is signalled by a flag on +the lvalue op). - /* special-case '$lex1 = expr . $lex1' (where expr isn't lex1): - * multiconcat is faster (due to not creating a temporary copy of - * $lex1), whereas for a general $lex1 = $lex2 . $lex3, concat is - * faster. - */ - if ( nconst == 0 - && nargs == 2 - && targmyop - && topop->op_type == OP_CONCAT - ) { - PADOFFSET t = targmyop->op_targ; - OP *k1 = cBINOPx(topop)->op_first; - OP *k2 = cBINOPx(topop)->op_last; - if ( k2->op_type == OP_PADSV - && k2->op_targ == t - && ( k1->op_type != OP_PADSV - || k1->op_targ != t) - ) - goto optimise; - } +This function detects things that can't be modified, such as C<$x+1>, and +generates errors for them. For example, C<$x+1 = 2> would cause it to be +called with an op of type C and a C argument of C. - /* need at least two concats */ - if (nargs + nconst + cBOOL(private_flags & OPpMULTICONCAT_APPEND) < 3) - return; +It also flags things that need to behave specially in an lvalue context, +such as C<$$x = 5> which might have to vivify a reference in C<$x>. +=cut +Perl_op_lvalue_flags() is a non-API lower-level interface to +op_lvalue(). The flags param has these bits: + OP_LVALUE_NO_CROAK: return rather than croaking on error - /* ----------------------------------------------------------------- - * Phase 3: - * - * At this point the optree has been verified as ok to be optimised - * into an OP_MULTICONCAT. Now start changing things. - */ +*/ - optimise: +OP * +Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags) +{ + OP *top_op = o; - /* stringify all const args and determine utf8ness */ + if (!o || (PL_parser && PL_parser->error_count)) + return o; - variant = 0; - for (argp = args; argp <= toparg; argp++) { - SV *sv = (SV*)argp->p; - if (!sv) - continue; /* not a const op */ - if (utf8 && !SvUTF8(sv)) - sv_utf8_upgrade_nomg(sv); - argp->p = SvPV_nomg(sv, argp->len); - total_len += argp->len; + while (1) { + OP *kid; + /* -1 = error on localize, 0 = ignore localize, 1 = ok to localize */ + int localize = -1; + OP *next_kid = NULL; - /* see if any strings would grow if converted to utf8 */ - if (!utf8) { - variant += variant_under_utf8_count((U8 *) argp->p, - (U8 *) argp->p + argp->len); - } + if ((o->op_private & OPpTARGET_MY) + && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */ + { + goto do_next; } - /* create and populate aux struct */ - - create_aux: - - aux = (UNOP_AUX_item*)PerlMemShared_malloc( - sizeof(UNOP_AUX_item) - * ( - PERL_MULTICONCAT_HEADER_SIZE - + ((nargs + 1) * (variant ? 2 : 1)) - ) - ); - const_str = (char *)PerlMemShared_malloc(total_len ? total_len : 1); + /* elements of a list might be in void context because the list is + in scalar context or because they are attribute sub calls */ + if ((o->op_flags & OPf_WANT) == OPf_WANT_VOID) + goto do_next; - /* Extract all the non-const expressions from the concat tree then - * dispose of the old tree, e.g. convert the tree from this: - * - * o => SASSIGN - * | - * STRINGIFY -- TARGET - * | - * ex-PUSHMARK -- CONCAT - * | - * CONCAT -- EXPR5 - * | - * CONCAT -- EXPR4 - * | - * CONCAT -- EXPR3 - * | - * EXPR1 -- EXPR2 - * - * - * to: - * - * o => MULTICONCAT - * | - * ex-PUSHMARK -- EXPR1 -- EXPR2 -- EXPR3 -- EXPR4 -- EXPR5 -- TARGET - * - * except that if EXPRi is an OP_CONST, it's discarded. - * - * During the conversion process, EXPR ops are stripped from the tree - * and unshifted onto o. Finally, any of o's remaining original - * childen are discarded and o is converted into an OP_MULTICONCAT. - * - * In this middle of this, o may contain both: unshifted args on the - * left, and some remaining original args on the right. lastkidop - * is set to point to the right-most unshifted arg to delineate - * between the two sets. - */ + if (type == OP_PRTF || type == OP_SPRINTF) type = OP_ENTERSUB; + switch (o->op_type) { + case OP_UNDEF: + if (type == OP_SASSIGN) + goto nomod; + PL_modcount++; + goto do_next; - if (is_sprintf) { - /* create a copy of the format with the %'s removed, and record - * the sizes of the const string segments in the aux struct */ - char *q, *oldq; - lenp = aux + PERL_MULTICONCAT_IX_LENGTHS; - - p = sprintf_info.start; - q = const_str; - oldq = q; - for (; p < sprintf_info.end; p++) { - if (*p == '%') { - p++; - if (*p != '%') { - (lenp++)->ssize = q - oldq; - oldq = q; - continue; - } - } - *q++ = *p; - } - lenp->ssize = q - oldq; - assert((STRLEN)(q - const_str) == total_len); + case OP_STUB: + if ((o->op_flags & OPf_PARENS)) + break; + goto nomod; - /* Attach all the args (i.e. the kids of the sprintf) to o (which - * may or may not be topop) The pushmark and const ops need to be - * kept in case they're an op_next entry point. - */ - lastkidop = cLISTOPx(topop)->op_last; - kid = cUNOPx(topop)->op_first; /* pushmark */ - op_null(kid); - op_null(OpSIBLING(kid)); /* const */ - if (o != topop) { - kid = op_sibling_splice(topop, NULL, -1, NULL); /* cut all args */ - op_sibling_splice(o, NULL, 0, kid); /* and attach to o */ - lastkidop->op_next = o; + case OP_ENTERSUB: + if ((type == OP_UNDEF || type == OP_REFGEN || type == OP_LOCK) && + !(o->op_flags & OPf_STACKED)) { + OpTYPE_set(o, OP_RV2CV); /* entersub => rv2cv */ + assert(cUNOPo->op_first->op_type == OP_NULL); + op_null(cLISTOPx(cUNOPo->op_first)->op_first);/* disable pushmark */ + break; } - } - else { - p = const_str; - lenp = aux + PERL_MULTICONCAT_IX_LENGTHS; - - lenp->ssize = -1; - - /* Concatenate all const strings into const_str. - * Note that args[] contains the RHS args in reverse order, so - * we scan args[] from top to bottom to get constant strings - * in L-R order - */ - for (argp = toparg; argp >= args; argp--) { - if (!argp->p) - /* not a const op */ - (++lenp)->ssize = -1; - else { - STRLEN l = argp->len; - Copy(argp->p, p, l, char); - p += l; - if (lenp->ssize == -1) - lenp->ssize = l; - else - lenp->ssize += l; + else { /* lvalue subroutine call */ + o->op_private |= OPpLVAL_INTRO; + PL_modcount = RETURN_UNLIMITED_NUMBER; + if (S_potential_mod_type(type)) { + o->op_private |= OPpENTERSUB_INARGS; + break; } - } - - kid = topop; - nextop = o; - lastkidop = NULL; - - for (argp = args; argp <= toparg; argp++) { - /* only keep non-const args, except keep the first-in-next-chain - * arg no matter what it is (but nulled if OP_CONST), because it - * may be the entry point to this subtree from the previous - * op_next. - */ - bool last = (argp == toparg); - OP *prev; + else { /* Compile-time error message: */ + OP *kid = cUNOPo->op_first; + CV *cv; + GV *gv; + SV *namesv; - /* set prev to the sibling *before* the arg to be cut out, - * e.g. when cutting EXPR: - * - * | - * kid= CONCAT - * | - * prev= CONCAT -- EXPR - * | - */ - if (argp == args && kid->op_type != OP_CONCAT) { - /* in e.g. '$x .= f(1)' there's no RHS concat tree - * so the expression to be cut isn't kid->op_last but - * kid itself */ - OP *o1, *o2; - /* find the op before kid */ - o1 = NULL; - o2 = cUNOPx(parentop)->op_first; - while (o2 && o2 != kid) { - o1 = o2; - o2 = OpSIBLING(o2); + if (kid->op_type != OP_PUSHMARK) { + if (kid->op_type != OP_NULL || kid->op_targ != OP_LIST) + Perl_croak(aTHX_ + "panic: unexpected lvalue entersub " + "args: type/targ %ld:%" UVuf, + (long)kid->op_type, (UV)kid->op_targ); + kid = kLISTOP->op_first; } - assert(o2 == kid); - prev = o1; - kid = parentop; - } - else if (kid == o && lastkidop) - prev = last ? lastkidop : OpSIBLING(lastkidop); - else - prev = last ? NULL : cUNOPx(kid)->op_first; - - if (!argp->p || last) { - /* cut RH op */ - OP *aop = op_sibling_splice(kid, prev, 1, NULL); - /* and unshift to front of o */ - op_sibling_splice(o, NULL, 0, aop); - /* record the right-most op added to o: later we will - * free anything to the right of it */ - if (!lastkidop) - lastkidop = aop; - aop->op_next = nextop; - if (last) { - if (argp->p) - /* null the const at start of op_next chain */ - op_null(aop); + while (OpHAS_SIBLING(kid)) + kid = OpSIBLING(kid); + if (!(kid->op_type == OP_NULL && kid->op_targ == OP_RV2CV)) { + break; /* Postpone until runtime */ } - else if (prev) - nextop = prev->op_next; - } - - /* the last two arguments are both attached to the same concat op */ - if (argp < toparg - 1) - kid = prev; - } - } - /* Populate the aux struct */ - - aux[PERL_MULTICONCAT_IX_NARGS].ssize = nargs; - aux[PERL_MULTICONCAT_IX_PLAIN_PV].pv = utf8 ? NULL : const_str; - aux[PERL_MULTICONCAT_IX_PLAIN_LEN].ssize = utf8 ? 0 : total_len; - aux[PERL_MULTICONCAT_IX_UTF8_PV].pv = const_str; - aux[PERL_MULTICONCAT_IX_UTF8_LEN].ssize = total_len; - - /* if variant > 0, calculate a variant const string and lengths where - * the utf8 version of the string will take 'variant' more bytes than - * the plain one. */ - - if (variant) { - char *p = const_str; - STRLEN ulen = total_len + variant; - UNOP_AUX_item *lens = aux + PERL_MULTICONCAT_IX_LENGTHS; - UNOP_AUX_item *ulens = lens + (nargs + 1); - char *up = (char*)PerlMemShared_malloc(ulen); - SSize_t n; + kid = kUNOP->op_first; + if (kid->op_type == OP_NULL && kid->op_targ == OP_RV2SV) + kid = kUNOP->op_first; + if (kid->op_type == OP_NULL) + Perl_croak(aTHX_ + "panic: unexpected constant lvalue entersub " + "entry via type/targ %ld:%" UVuf, + (long)kid->op_type, (UV)kid->op_targ); + if (kid->op_type != OP_GV) { + break; + } - aux[PERL_MULTICONCAT_IX_UTF8_PV].pv = up; - aux[PERL_MULTICONCAT_IX_UTF8_LEN].ssize = ulen; + gv = kGVOP_gv; + cv = isGV(gv) + ? GvCV(gv) + : SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV + ? MUTABLE_CV(SvRV(gv)) + : NULL; + if (!cv) + break; + if (CvLVALUE(cv)) + break; + if (flags & OP_LVALUE_NO_CROAK) + return NULL; - for (n = 0; n < (nargs + 1); n++) { - SSize_t i; - char * orig_up = up; - for (i = (lens++)->ssize; i > 0; i--) { - U8 c = *p++; - append_utf8_from_native_byte(c, (U8**)&up); + namesv = cv_name(cv, NULL, 0); + yyerror_pv(Perl_form(aTHX_ "Can't modify non-lvalue " + "subroutine call of &%" SVf " in %s", + SVfARG(namesv), PL_op_desc[type]), + SvUTF8(namesv)); + goto do_next; } - (ulens++)->ssize = (i < 0) ? i : up - orig_up; } - } - - if (stringop) { - /* if there was a top(ish)-level OP_STRINGIFY, we need to keep - * that op's first child - an ex-PUSHMARK - because the op_next of - * the previous op may point to it (i.e. it's the entry point for - * the o optree) - */ - OP *pmop = - (stringop == o) - ? op_sibling_splice(o, lastkidop, 1, NULL) - : op_sibling_splice(stringop, NULL, 1, NULL); - assert(OP_TYPE_IS_OR_WAS_NN(pmop, OP_PUSHMARK)); - op_sibling_splice(o, NULL, 0, pmop); - if (!lastkidop) - lastkidop = pmop; - } - - /* Optimise - * target = A.B.C... - * target .= A.B.C... - */ + /* FALLTHROUGH */ + default: + nomod: + if (flags & OP_LVALUE_NO_CROAK) return NULL; + /* grep, foreach, subcalls, refgen */ + if (S_potential_mod_type(type)) + break; + yyerror(Perl_form(aTHX_ "Can't modify %s in %s", + (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL) + ? "do block" + : OP_DESC(o)), + type ? PL_op_desc[type] : "local")); + goto do_next; - if (targetop) { - assert(!targmyop); + case OP_PREINC: + case OP_PREDEC: + case OP_POW: + case OP_MULTIPLY: + case OP_DIVIDE: + case OP_MODULO: + case OP_ADD: + case OP_SUBTRACT: + case OP_CONCAT: + case OP_LEFT_SHIFT: + case OP_RIGHT_SHIFT: + case OP_BIT_AND: + case OP_BIT_XOR: + case OP_BIT_OR: + case OP_I_MULTIPLY: + case OP_I_DIVIDE: + case OP_I_MODULO: + case OP_I_ADD: + case OP_I_SUBTRACT: + if (!(o->op_flags & OPf_STACKED)) + goto nomod; + PL_modcount++; + break; - if (o->op_type == OP_SASSIGN) { - /* Move the target subtree from being the last of o's children - * to being the last of o's preserved children. - * Note the difference between 'target = ...' and 'target .= ...': - * for the former, target is executed last; for the latter, - * first. - */ - kid = OpSIBLING(lastkidop); - op_sibling_splice(o, kid, 1, NULL); /* cut target op */ - op_sibling_splice(o, lastkidop, 0, targetop); /* and paste */ - lastkidop->op_next = kid->op_next; - lastkidop = targetop; + case OP_REPEAT: + if (o->op_flags & OPf_STACKED) { + PL_modcount++; + break; } + if (!(o->op_private & OPpREPEAT_DOLIST)) + goto nomod; else { - /* Move the target subtree from being the first of o's - * original children to being the first of *all* o's children. + const I32 mods = PL_modcount; + /* we recurse rather than iterate here because we need to + * calculate and use the delta applied to PL_modcount by the + * first child. So in something like + * ($x, ($y) x 3) = split; + * split knows that 4 elements are wanted */ - if (lastkidop) { - op_sibling_splice(o, lastkidop, 1, NULL); /* cut target op */ - op_sibling_splice(o, NULL, 0, targetop); /* and paste*/ - } - else { - /* if the RHS of .= doesn't contain a concat (e.g. - * $x .= "foo"), it gets missed by the "strip ops from the - * tree and add to o" loop earlier */ - assert(topop->op_type != OP_CONCAT); - if (stringop) { - /* in e.g. $x .= "$y", move the $y expression - * from being a child of OP_STRINGIFY to being the - * second child of the OP_CONCAT - */ - assert(cUNOPx(stringop)->op_first == topop); - op_sibling_splice(stringop, NULL, 1, NULL); - op_sibling_splice(o, cUNOPo->op_first, 0, topop); - } - assert(topop == OpSIBLING(cBINOPo->op_first)); - if (toparg->p) - op_null(topop); - lastkidop = topop; + modkids(cBINOPo->op_first, type); + if (type != OP_AASSIGN) + goto nomod; + kid = cBINOPo->op_last; + if (kid->op_type == OP_CONST && SvIOK(kSVOP_sv)) { + const IV iv = SvIV(kSVOP_sv); + if (PL_modcount != RETURN_UNLIMITED_NUMBER) + PL_modcount = + mods + (PL_modcount - mods) * (iv < 0 ? 0 : iv); } + else + PL_modcount = RETURN_UNLIMITED_NUMBER; } + break; - if (is_targable) { - /* optimise - * my $lex = A.B.C... - * $lex = A.B.C... - * $lex .= A.B.C... - * The original padsv op is kept but nulled in case it's the - * entry point for the optree (which it will be for - * '$lex .= ... ' - */ - private_flags |= OPpTARGET_MY; - private_flags |= (targetop->op_private & OPpLVAL_INTRO); - o->op_targ = targetop->op_targ; - targetop->op_targ = 0; - op_null(targetop); - } - else - flags |= OPf_STACKED; - } - else if (targmyop) { - private_flags |= OPpTARGET_MY; - if (o != targmyop) { - o->op_targ = targmyop->op_targ; - targmyop->op_targ = 0; - } - } - - /* detach the emaciated husk of the sprintf/concat optree and free it */ - for (;;) { - kid = op_sibling_splice(o, lastkidop, 1, NULL); - if (!kid) - break; - op_free(kid); - } + case OP_COND_EXPR: + localize = 1; + next_kid = OpSIBLING(cUNOPo->op_first); + break; - /* and convert o into a multiconcat */ + case OP_RV2AV: + case OP_RV2HV: + if (type == OP_REFGEN && o->op_flags & OPf_PARENS) { + PL_modcount = RETURN_UNLIMITED_NUMBER; + /* Treat \(@foo) like ordinary list, but still mark it as modi- + fiable since some contexts need to know. */ + o->op_flags |= OPf_MOD; + goto do_next; + } + /* FALLTHROUGH */ + case OP_RV2GV: + if (scalar_mod_type(o, type)) + goto nomod; + ref(cUNOPo->op_first, o->op_type); + /* FALLTHROUGH */ + case OP_ASLICE: + case OP_HSLICE: + localize = 1; + /* FALLTHROUGH */ + case OP_AASSIGN: + /* Do not apply the lvsub flag for rv2[ah]v in scalar context. */ + if (type == OP_LEAVESUBLV && ( + (o->op_type != OP_RV2AV && o->op_type != OP_RV2HV) + || (o->op_flags & OPf_WANT) != OPf_WANT_SCALAR + )) + o->op_private |= OPpMAYBE_LVSUB; + /* FALLTHROUGH */ + case OP_NEXTSTATE: + case OP_DBSTATE: + PL_modcount = RETURN_UNLIMITED_NUMBER; + break; - o->op_flags = (flags|OPf_KIDS|stacked_last - |(o->op_flags & (OPf_WANT|OPf_PARENS))); - o->op_private = private_flags; - o->op_type = OP_MULTICONCAT; - o->op_ppaddr = PL_ppaddr[OP_MULTICONCAT]; - cUNOP_AUXo->op_aux = aux; -} + case OP_KVHSLICE: + case OP_KVASLICE: + case OP_AKEYS: + if (type == OP_LEAVESUBLV) + o->op_private |= OPpMAYBE_LVSUB; + goto nomod; + case OP_AVHVSWITCH: + if (type == OP_LEAVESUBLV + && (o->op_private & OPpAVHVSWITCH_MASK) + OP_EACH == OP_KEYS) + o->op_private |= OPpMAYBE_LVSUB; + goto nomod; -/* do all the final processing on an optree (e.g. running the peephole - * optimiser on it), then attach it to cv (if cv is non-null) - */ + case OP_AV2ARYLEN: + PL_hints |= HINT_BLOCK_SCOPE; + if (type == OP_LEAVESUBLV) + o->op_private |= OPpMAYBE_LVSUB; + PL_modcount++; + break; -static void -S_process_optree(pTHX_ CV *cv, OP *optree, OP* start) -{ - OP **startp; + case OP_RV2SV: + ref(cUNOPo->op_first, o->op_type); + localize = 1; + /* FALLTHROUGH */ + case OP_GV: + PL_hints |= HINT_BLOCK_SCOPE; + /* FALLTHROUGH */ + case OP_SASSIGN: + case OP_ANDASSIGN: + case OP_ORASSIGN: + case OP_DORASSIGN: + PL_modcount++; + break; - /* XXX for some reason, evals, require and main optrees are - * never attached to their CV; instead they just hang off - * PL_main_root + PL_main_start or PL_eval_root + PL_eval_start - * and get manually freed when appropriate */ - if (cv) - startp = &CvSTART(cv); - else - startp = PL_in_eval? &PL_eval_start : &PL_main_start; + case OP_AELEMFAST: + case OP_AELEMFAST_LEX: + localize = -1; + PL_modcount++; + break; - *startp = start; - optree->op_private |= OPpREFCOUNTED; - OpREFCNT_set(optree, 1); - optimize_optree(optree); - CALL_PEEP(*startp); - finalize_optree(optree); - S_prune_chain_head(startp); + case OP_PADAV: + case OP_PADHV: + PL_modcount = RETURN_UNLIMITED_NUMBER; + if (type == OP_REFGEN && o->op_flags & OPf_PARENS) + { + /* Treat \(@foo) like ordinary list, but still mark it as modi- + fiable since some contexts need to know. */ + o->op_flags |= OPf_MOD; + goto do_next; + } + if (scalar_mod_type(o, type)) + goto nomod; + if ((o->op_flags & OPf_WANT) != OPf_WANT_SCALAR + && type == OP_LEAVESUBLV) + o->op_private |= OPpMAYBE_LVSUB; + /* FALLTHROUGH */ + case OP_PADSV: + PL_modcount++; + if (!type) /* local() */ + Perl_croak(aTHX_ "Can't localize lexical variable %" PNf, + PNfARG(PAD_COMPNAME(o->op_targ))); + if (!(o->op_private & OPpLVAL_INTRO) + || ( type != OP_SASSIGN && type != OP_AASSIGN + && PadnameIsSTATE(PAD_COMPNAME_SV(o->op_targ)) )) + S_mark_padname_lvalue(aTHX_ PAD_COMPNAME_SV(o->op_targ)); + break; - if (cv) { - /* now that optimizer has done its work, adjust pad values */ - pad_tidy(optree->op_type == OP_LEAVEWRITE ? padtidy_FORMAT - : CvCLONE(cv) ? padtidy_SUBCLONE : padtidy_SUB); - } -} + case OP_PUSHMARK: + localize = 0; + break; + case OP_KEYS: + if (type != OP_LEAVESUBLV && !scalar_mod_type(NULL, type)) + goto nomod; + goto lvalue_func; + case OP_SUBSTR: + if (o->op_private == 4) /* don't allow 4 arg substr as lvalue */ + goto nomod; + /* FALLTHROUGH */ + case OP_POS: + case OP_VEC: + lvalue_func: + if (type == OP_LEAVESUBLV) + o->op_private |= OPpMAYBE_LVSUB; + if (o->op_flags & OPf_KIDS && OpHAS_SIBLING(cBINOPo->op_first)) { + /* we recurse rather than iterate here because the child + * needs to be processed with a different 'type' parameter */ -/* -=for apidoc optimize_optree - -This function applies some optimisations to the optree in top-down order. -It is called before the peephole optimizer, which processes ops in -execution order. Note that finalize_optree() also does a top-down scan, -but is called *after* the peephole optimizer. - -=cut -*/ - -void -Perl_optimize_optree(pTHX_ OP* o) -{ - PERL_ARGS_ASSERT_OPTIMIZE_OPTREE; - - ENTER; - SAVEVPTR(PL_curcop); - - optimize_op(o); - - LEAVE; -} - - -#define warn_implicit_snail_cvsig(o) S_warn_implicit_snail_cvsig(aTHX_ o) -static void -S_warn_implicit_snail_cvsig(pTHX_ OP *o) -{ - CV *cv = PL_compcv; - while(cv && CvEVAL(cv)) - cv = CvOUTSIDE(cv); - - if(cv && CvSIGNATURE(cv)) - Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES), - "Implicit use of @_ in %s with signatured subroutine is experimental", OP_DESC(o)); -} - -#define OP_ZOOM(o) (OP_TYPE_IS(o, OP_NULL) ? cUNOPx(o)->op_first : (o)) - -/* helper for optimize_optree() which optimises one op then recurses - * to optimise any children. - */ - -STATIC void -S_optimize_op(pTHX_ OP* o) -{ - OP *top_op = o; - - PERL_ARGS_ASSERT_OPTIMIZE_OP; - - while (1) { - OP * next_kid = NULL; - - assert(o->op_type != OP_FREED); - - switch (o->op_type) { - case OP_NEXTSTATE: - case OP_DBSTATE: - PL_curcop = ((COP*)o); /* for warnings */ - break; + /* substr and vec */ + /* If this op is in merely potential (non-fatal) modifiable + context, then apply OP_ENTERSUB context to + the kid op (to avoid croaking). Other- + wise pass this op’s own type so the correct op is mentioned + in error messages. */ + op_lvalue(OpSIBLING(cBINOPo->op_first), + S_potential_mod_type(type) + ? (I32)OP_ENTERSUB + : o->op_type); + } + break; + case OP_AELEM: + case OP_HELEM: + ref(cBINOPo->op_first, o->op_type); + if (type == OP_ENTERSUB && + !(o->op_private & (OPpLVAL_INTRO | OPpDEREF))) + o->op_private |= OPpLVAL_DEFER; + if (type == OP_LEAVESUBLV) + o->op_private |= OPpMAYBE_LVSUB; + localize = 1; + PL_modcount++; + break; - case OP_CONCAT: - case OP_SASSIGN: - case OP_STRINGIFY: - case OP_SPRINTF: - S_maybe_multiconcat(aTHX_ o); - break; + case OP_LEAVE: + case OP_LEAVELOOP: + o->op_private |= OPpLVALUE; + /* FALLTHROUGH */ + case OP_SCOPE: + case OP_ENTER: + case OP_LINESEQ: + localize = 0; + if (o->op_flags & OPf_KIDS) + next_kid = cLISTOPo->op_last; + break; - case OP_SUBST: - if (cPMOPo->op_pmreplrootu.op_pmreplroot) { - /* we can't assume that op_pmreplroot->op_sibparent == o - * and that it is thus possible to walk back up the tree - * past op_pmreplroot. So, although we try to avoid - * recursing through op trees, do it here. After all, - * there are unlikely to be many nested s///e's within - * the replacement part of a s///e. - */ - optimize_op(cPMOPo->op_pmreplrootu.op_pmreplroot); - } + case OP_NULL: + localize = 0; + if (o->op_flags & OPf_SPECIAL) /* do BLOCK */ + goto nomod; + else if (!(o->op_flags & OPf_KIDS)) break; - case OP_RV2AV: - { - OP *first = (o->op_flags & OPf_KIDS) ? cUNOPo->op_first : NULL; - CV *cv = PL_compcv; - while(cv && CvEVAL(cv)) - cv = CvOUTSIDE(cv); - - if(cv && CvSIGNATURE(cv) && - OP_TYPE_IS(first, OP_GV) && cGVOPx_gv(first) == PL_defgv) { - OP *parent = op_parent(o); - while(OP_TYPE_IS(parent, OP_NULL)) - parent = op_parent(parent); + if (o->op_targ != OP_LIST) { + OP *sib = OpSIBLING(cLISTOPo->op_first); + /* OP_TRANS and OP_TRANSR with argument have a weird optree + * that looks like + * + * null + * arg + * trans + * + * compared with things like OP_MATCH which have the argument + * as a child: + * + * match + * arg + * + * so handle specially to correctly get "Can't modify" croaks etc + */ - Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES), - "Use of @_ in %s with signatured subroutine is experimental", OP_DESC(parent)); + if (sib && (sib->op_type == OP_TRANS || sib->op_type == OP_TRANSR)) + { + /* this should trigger a "Can't modify transliteration" err */ + op_lvalue(sib, type); } + next_kid = cBINOPo->op_first; + /* we assume OP_NULLs which aren't ex-list have no more than 2 + * children. If this assumption is wrong, increase the scan + * limit below */ + assert( !OpHAS_SIBLING(next_kid) + || !OpHAS_SIBLING(OpSIBLING(next_kid))); break; } + /* FALLTHROUGH */ + case OP_LIST: + localize = 0; + next_kid = cLISTOPo->op_first; + break; - case OP_SHIFT: - case OP_POP: - if(!CvUNIQUE(PL_compcv) && !(o->op_flags & OPf_KIDS)) - warn_implicit_snail_cvsig(o); - break; + case OP_COREARGS: + goto do_next; - case OP_ENTERSUB: - if(!(o->op_flags & OPf_STACKED)) - warn_implicit_snail_cvsig(o); - break; + case OP_AND: + case OP_OR: + if (type == OP_LEAVESUBLV + || !S_vivifies(cLOGOPo->op_first->op_type)) + next_kid = cLOGOPo->op_first; + else if (type == OP_LEAVESUBLV + || !S_vivifies(OpSIBLING(cLOGOPo->op_first)->op_type)) + next_kid = OpSIBLING(cLOGOPo->op_first); + goto nomod; - case OP_GOTO: + case OP_SREFGEN: + if (type == OP_NULL) { /* local */ + local_refgen: + if (!FEATURE_MYREF_IS_ENABLED) + Perl_croak(aTHX_ "The experimental declared_refs " + "feature is not enabled"); + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__DECLARED_REFS), + "Declaring references is experimental"); + next_kid = cUNOPo->op_first; + goto do_next; + } + if (type != OP_AASSIGN && type != OP_SASSIGN + && type != OP_ENTERLOOP) + goto nomod; + /* Don’t bother applying lvalue context to the ex-list. */ + kid = cUNOPx(cUNOPo->op_first)->op_first; + assert (!OpHAS_SIBLING(kid)); + goto kid_2lvref; + case OP_REFGEN: + if (type == OP_NULL) /* local */ + goto local_refgen; + if (type != OP_AASSIGN) goto nomod; + kid = cUNOPo->op_first; + kid_2lvref: { - OP *first = (o->op_flags & OPf_KIDS) ? cUNOPo->op_first : NULL; - OP *ffirst; - if(OP_TYPE_IS(first, OP_SREFGEN) && - (ffirst = OP_ZOOM(cUNOPx(first)->op_first)) && - OP_TYPE_IS(ffirst, OP_RV2CV)) - warn_implicit_snail_cvsig(o); - break; + const U8 ec = PL_parser ? PL_parser->error_count : 0; + S_lvref(aTHX_ kid, type); + if (!PL_parser || PL_parser->error_count == ec) { + if (!FEATURE_REFALIASING_IS_ENABLED) + Perl_croak(aTHX_ + "Experimental aliasing via reference not enabled"); + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__REFALIASING), + "Aliasing via reference is experimental"); + } } + if (o->op_type == OP_REFGEN) + op_null(cUNOPx(cUNOPo->op_first)->op_first); /* pushmark */ + op_null(o); + goto do_next; - default: + case OP_SPLIT: + if ((o->op_private & OPpSPLIT_ASSIGN)) { + /* This is actually @array = split. */ + PL_modcount = RETURN_UNLIMITED_NUMBER; break; } + goto nomod; - if (o->op_flags & OPf_KIDS) - next_kid = cUNOPo->op_first; + case OP_SCALAR: + op_lvalue(cUNOPo->op_first, OP_ENTERSUB); + goto nomod; - /* if a kid hasn't been nominated to process, continue with the - * next sibling, or if no siblings left, go back to the parent's - * siblings and so on + case OP_ANONCODE: + /* If we were to set OPf_REF on this and it was constructed by XS + * code as a child of an OP_REFGEN then we'd end up generating a + * double-ref when executed. We don't want to do that, so don't + * set flag here. + * See also https://github.com/Perl/perl5/issues/20384 */ - while (!next_kid) { - if (o == top_op) - return; /* at top; no parents/siblings to try */ - if (OpHAS_SIBLING(o)) - next_kid = o->op_sibparent; - else - o = o->op_sibparent; /*try parent's next sibling */ - } - /* this label not yet used. Goto here if any code above sets - * next-kid - get_next_op: - */ - o = next_kid; + // Perl always sets OPf_REF as of 5.37.5. + // + if (LIKELY(o->op_flags & OPf_REF)) goto nomod; + + // If we got here, then our op came from an XS module that predates + // 5.37.5’s change to the op tree, which we have to handle a bit + // diffrently to preserve backward compatibility. + // + goto do_next; } -} - -/* -=for apidoc finalize_optree + /* [20011101.069 (#7861)] File test operators interpret OPf_REF to mean that + their argument is a filehandle; thus \stat(".") should not set + it. AMS 20011102 */ + if (type == OP_REFGEN && OP_IS_STAT(o->op_type)) + goto do_next; -This function finalizes the optree. Should be called directly after -the complete optree is built. It does some additional -checking which can't be done in the normal Cxxx functions and makes -the tree thread-safe. + if (type != OP_LEAVESUBLV) + o->op_flags |= OPf_MOD; -=cut -*/ -void -Perl_finalize_optree(pTHX_ OP* o) -{ - PERL_ARGS_ASSERT_FINALIZE_OPTREE; + if (type == OP_AASSIGN || type == OP_SASSIGN) + o->op_flags |= o->op_type == OP_ENTERSUB ? 0 : OPf_SPECIAL|OPf_REF; + else if (!type) { /* local() */ + switch (localize) { + case 1: + o->op_private |= OPpLVAL_INTRO; + o->op_flags &= ~OPf_SPECIAL; + PL_hints |= HINT_BLOCK_SCOPE; + break; + case 0: + break; + case -1: + Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), + "Useless localization of %s", OP_DESC(o)); + } + } + else if (type != OP_GREPSTART && type != OP_ENTERSUB + && type != OP_LEAVESUBLV && o->op_type != OP_ENTERSUB) + o->op_flags |= OPf_REF; - ENTER; - SAVEVPTR(PL_curcop); + do_next: + while (!next_kid) { + if (o == top_op) + return top_op; /* at top; no parents/siblings to try */ + if (OpHAS_SIBLING(o)) { + next_kid = o->op_sibparent; + if (!OpHAS_SIBLING(next_kid)) { + /* a few node types don't recurse into their second child */ + OP *parent = next_kid->op_sibparent; + I32 ptype = parent->op_type; + if ( (ptype == OP_NULL && parent->op_targ != OP_LIST) + || ( (ptype == OP_AND || ptype == OP_OR) + && (type != OP_LEAVESUBLV + && S_vivifies(next_kid->op_type)) + ) + ) { + /*try parent's next sibling */ + o = parent; + next_kid = NULL; + } + } + } + else + o = o->op_sibparent; /*try parent's next sibling */ - finalize_op(o); + } + o = next_kid; - LEAVE; -} + } /* while */ -#ifdef USE_ITHREADS -/* Relocate sv to the pad for thread safety. - * Despite being a "constant", the SV is written to, - * for reference counts, sv_upgrade() etc. */ -PERL_STATIC_INLINE void -S_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp) -{ - PADOFFSET ix; - PERL_ARGS_ASSERT_OP_RELOCATE_SV; - if (!*svp) return; - ix = pad_alloc(OP_CONST, SVf_READONLY); - SvREFCNT_dec(PAD_SVl(ix)); - PAD_SETSV(ix, *svp); - /* XXX I don't know how this isn't readonly already. */ - if (!SvIsCOW(PAD_SVl(ix))) SvREADONLY_on(PAD_SVl(ix)); - *svp = NULL; - *targp = ix; } -#endif - -/* -=for apidoc traverse_op_tree - -Return the next op in a depth-first traversal of the op tree, -returning NULL when the traversal is complete. -The initial call must supply the root of the tree as both top and o. -For now it's static, but it may be exposed to the API in the future. - -=cut -*/ - -STATIC OP* -S_traverse_op_tree(pTHX_ OP *top, OP *o) { - OP *sib; +STATIC bool +S_scalar_mod_type(const OP *o, I32 type) +{ + switch (type) { + case OP_POS: + case OP_SASSIGN: + if (o && o->op_type == OP_RV2GV) + return FALSE; + /* FALLTHROUGH */ + case OP_PREINC: + case OP_PREDEC: + case OP_POSTINC: + case OP_POSTDEC: + case OP_I_PREINC: + case OP_I_PREDEC: + case OP_I_POSTINC: + case OP_I_POSTDEC: + case OP_POW: + case OP_MULTIPLY: + case OP_DIVIDE: + case OP_MODULO: + case OP_REPEAT: + case OP_ADD: + case OP_SUBTRACT: + case OP_I_MULTIPLY: + case OP_I_DIVIDE: + case OP_I_MODULO: + case OP_I_ADD: + case OP_I_SUBTRACT: + case OP_LEFT_SHIFT: + case OP_RIGHT_SHIFT: + case OP_BIT_AND: + case OP_BIT_XOR: + case OP_BIT_OR: + case OP_NBIT_AND: + case OP_NBIT_XOR: + case OP_NBIT_OR: + case OP_SBIT_AND: + case OP_SBIT_XOR: + case OP_SBIT_OR: + case OP_CONCAT: + case OP_SUBST: + case OP_TRANS: + case OP_TRANSR: + case OP_READ: + case OP_SYSREAD: + case OP_RECV: + case OP_ANDASSIGN: + case OP_ORASSIGN: + case OP_DORASSIGN: + case OP_VEC: + case OP_SUBSTR: + return TRUE; + default: + return FALSE; + } +} - PERL_ARGS_ASSERT_TRAVERSE_OP_TREE; +STATIC bool +S_is_handle_constructor(const OP *o, I32 numargs) +{ + PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR; - if ((o->op_flags & OPf_KIDS) && cUNOPo->op_first) { - return cUNOPo->op_first; - } - else if ((sib = OpSIBLING(o))) { - return sib; + switch (o->op_type) { + case OP_PIPE_OP: + case OP_SOCKPAIR: + if (numargs == 2) + return TRUE; + /* FALLTHROUGH */ + case OP_SYSOPEN: + case OP_OPEN: + case OP_SELECT: /* XXX c.f. SelectSaver.pm */ + case OP_SOCKET: + case OP_OPEN_DIR: + case OP_ACCEPT: + if (numargs == 1) + return TRUE; + /* FALLTHROUGH */ + default: + return FALSE; } - else { - OP *parent = o->op_sibparent; - assert(!(o->op_moresib)); - while (parent && parent != top) { - OP *sib = OpSIBLING(parent); - if (sib) - return sib; - parent = parent->op_sibparent; - } +} - return NULL; +static OP * +S_refkids(pTHX_ OP *o, I32 type) +{ + if (o && o->op_flags & OPf_KIDS) { + OP *kid; + for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid)) + ref(kid, type); } + return o; } -STATIC void -S_finalize_op(pTHX_ OP* o) + +/* Apply reference (autovivification) context to the subtree at o. + * For example in + * push @{expression}, ....; + * o will be the head of 'expression' and type will be OP_RV2AV. + * It marks the op o (or a suitable child) as autovivifying, e.g. by + * setting OPf_MOD. + * For OP_RV2AV/OP_PADAV and OP_RV2HV/OP_PADHV sets OPf_REF too if + * set_op_ref is true. + * + * Also calls scalar(o). + */ + +OP * +Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref) { - OP * const top = o; - PERL_ARGS_ASSERT_FINALIZE_OP; + OP * top_op = o; - do { - assert(o->op_type != OP_FREED); + PERL_ARGS_ASSERT_DOREF; + + if (PL_parser && PL_parser->error_count) + return o; + while (1) { switch (o->op_type) { - case OP_NEXTSTATE: - case OP_DBSTATE: - PL_curcop = ((COP*)o); /* for warnings */ - break; - case OP_EXEC: - if (OpHAS_SIBLING(o)) { - OP *sib = OpSIBLING(o); - if (( sib->op_type == OP_NEXTSTATE || sib->op_type == OP_DBSTATE) - && ckWARN(WARN_EXEC) - && OpHAS_SIBLING(sib)) - { - const OPCODE type = OpSIBLING(sib)->op_type; - if (type != OP_EXIT && type != OP_WARN && type != OP_DIE) { - const line_t oldline = CopLINE(PL_curcop); - CopLINE_set(PL_curcop, CopLINE((COP*)sib)); - Perl_warner(aTHX_ packWARN(WARN_EXEC), - "Statement unlikely to be reached"); - Perl_warner(aTHX_ packWARN(WARN_EXEC), - "\t(Maybe you meant system() when you said exec()?)\n"); - CopLINE_set(PL_curcop, oldline); - } - } + case OP_ENTERSUB: + if ((type == OP_EXISTS || type == OP_DEFINED) && + !(o->op_flags & OPf_STACKED)) { + OpTYPE_set(o, OP_RV2CV); /* entersub => rv2cv */ + assert(cUNOPo->op_first->op_type == OP_NULL); + /* disable pushmark */ + op_null(cLISTOPx(cUNOPo->op_first)->op_first); + o->op_flags |= OPf_SPECIAL; + } + else if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV){ + o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV + : type == OP_RV2HV ? OPpDEREF_HV + : OPpDEREF_SV); + o->op_flags |= OPf_MOD; } + break; - case OP_GV: - if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) { - GV * const gv = cGVOPo_gv; - if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX_const(GvCV(gv))) { - /* XXX could check prototype here instead of just carping */ - SV * const sv = sv_newmortal(); - gv_efullname3(sv, gv, NULL); - Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE), - "%" SVf "() called too early to check prototype", - SVfARG(sv)); - } + case OP_COND_EXPR: + o = OpSIBLING(cUNOPo->op_first); + continue; + + case OP_RV2SV: + if (type == OP_DEFINED) + o->op_flags |= OPf_SPECIAL; /* don't create GV */ + /* FALLTHROUGH */ + case OP_PADSV: + if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) { + o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV + : type == OP_RV2HV ? OPpDEREF_HV + : OPpDEREF_SV); + o->op_flags |= OPf_MOD; + } + if (o->op_flags & OPf_KIDS) { + type = o->op_type; + o = cUNOPo->op_first; + continue; } break; - case OP_CONST: - if (cSVOPo->op_private & OPpCONST_STRICT) - no_bareword_allowed(o); -#ifdef USE_ITHREADS + case OP_RV2AV: + case OP_RV2HV: + if (set_op_ref) + o->op_flags |= OPf_REF; /* FALLTHROUGH */ - case OP_HINTSEVAL: - op_relocate_sv(&cSVOPo->op_sv, &o->op_targ); -#endif - break; + case OP_RV2GV: + if (type == OP_DEFINED) + o->op_flags |= OPf_SPECIAL; /* don't create GV */ + type = o->op_type; + o = cUNOPo->op_first; + continue; -#ifdef USE_ITHREADS - /* Relocate all the METHOP's SVs to the pad for thread safety. */ - case OP_METHOD_NAMED: - case OP_METHOD_SUPER: - case OP_METHOD_REDIR: - case OP_METHOD_REDIR_SUPER: - op_relocate_sv(&cMETHOPx(o)->op_u.op_meth_sv, &o->op_targ); + case OP_PADAV: + case OP_PADHV: + if (set_op_ref) + o->op_flags |= OPf_REF; break; -#endif - - case OP_HELEM: { - UNOP *rop; - SVOP *key_op; - OP *kid; - if ((key_op = cSVOPx(((BINOP*)o)->op_last))->op_type != OP_CONST) + case OP_SCALAR: + case OP_NULL: + if (!(o->op_flags & OPf_KIDS) || type == OP_DEFINED) break; + o = cBINOPo->op_first; + continue; - rop = (UNOP*)((BINOP*)o)->op_first; - - goto check_keys; - - case OP_HSLICE: - S_scalar_slice_warning(aTHX_ o); - /* FALLTHROUGH */ - - case OP_KVHSLICE: - kid = OpSIBLING(cLISTOPo->op_first); - if (/* I bet there's always a pushmark... */ - OP_TYPE_ISNT_AND_WASNT_NN(kid, OP_LIST) - && OP_TYPE_ISNT_NN(kid, OP_CONST)) - { - break; + case OP_AELEM: + case OP_HELEM: + if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) { + o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV + : type == OP_RV2HV ? OPpDEREF_HV + : OPpDEREF_SV); + o->op_flags |= OPf_MOD; } + type = o->op_type; + o = cBINOPo->op_first; + continue;; - key_op = (SVOP*)(kid->op_type == OP_CONST - ? kid - : OpSIBLING(kLISTOP->op_first)); - - rop = (UNOP*)((LISTOP*)o)->op_last; - - check_keys: - if (o->op_private & OPpLVAL_INTRO || rop->op_type != OP_RV2HV) - rop = NULL; - S_check_hash_fields_and_hekify(aTHX_ rop, key_op, 1); - break; - } - case OP_NULL: - if (o->op_targ != OP_HSLICE && o->op_targ != OP_ASLICE) - break; + case OP_SCOPE: + case OP_LEAVE: + set_op_ref = FALSE; /* FALLTHROUGH */ - case OP_ASLICE: - S_scalar_slice_warning(aTHX_ o); - break; + case OP_ENTER: + case OP_LIST: + if (!(o->op_flags & OPf_KIDS)) + break; + o = cLISTOPo->op_last; + continue; - case OP_SUBST: { - if (cPMOPo->op_pmreplrootu.op_pmreplroot) - finalize_op(cPMOPo->op_pmreplrootu.op_pmreplroot); - break; - } default: break; - } + } /* switch */ -#ifdef DEBUGGING - if (o->op_flags & OPf_KIDS) { - OP *kid; - - /* check that op_last points to the last sibling, and that - * the last op_sibling/op_sibparent field points back to the - * parent, and that the only ops with KIDS are those which are - * entitled to them */ - U32 type = o->op_type; - U32 family; - bool has_last; - - if (type == OP_NULL) { - type = o->op_targ; - /* ck_glob creates a null UNOP with ex-type GLOB - * (which is a list op. So pretend it wasn't a listop */ - if (type == OP_GLOB) - type = OP_NULL; - } - family = PL_opargs[type] & OA_CLASS_MASK; - - has_last = ( family == OA_BINOP - || family == OA_LISTOP - || family == OA_PMOP - || family == OA_LOOP - ); - assert( has_last /* has op_first and op_last, or ... - ... has (or may have) op_first: */ - || family == OA_UNOP - || family == OA_UNOP_AUX - || family == OA_LOGOP - || family == OA_BASEOP_OR_UNOP - || family == OA_FILESTATOP - || family == OA_LOOPEXOP - || family == OA_METHOP - || type == OP_CUSTOM - || type == OP_NULL /* new_logop does this */ - ); - - for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) { - if (!OpHAS_SIBLING(kid)) { - if (has_last) - assert(kid == cLISTOPo->op_last); - assert(kid->op_sibparent == o); - } + while (1) { + if (o == top_op) + return scalar(top_op); /* at top; no parents/siblings to try */ + if (OpHAS_SIBLING(o)) { + o = o->op_sibparent; + /* Normally skip all siblings and go straight to the parent; + * the only op that requires two children to be processed + * is OP_COND_EXPR */ + if (!OpHAS_SIBLING(o) + && o->op_sibparent->op_type == OP_COND_EXPR) + break; + continue; } + o = o->op_sibparent; /*try parent's next sibling */ } -#endif - } while (( o = traverse_op_tree(top, o)) != NULL); + } /* while */ } -static void -S_mark_padname_lvalue(pTHX_ PADNAME *pn) + +STATIC OP * +S_dup_attrlist(pTHX_ OP *o) { - CV *cv = PL_compcv; - PadnameLVALUE_on(pn); - while (PadnameOUTER(pn) && PARENT_PAD_INDEX(pn)) { - cv = CvOUTSIDE(cv); - /* RT #127786: cv can be NULL due to an eval within the DB package - * called from an anon sub - anon subs don't have CvOUTSIDE() set - * unless they contain an eval, but calling eval within DB - * pretends the eval was done in the caller's scope. - */ - if (!cv) - break; - assert(CvPADLIST(cv)); - pn = - PadlistNAMESARRAY(CvPADLIST(cv))[PARENT_PAD_INDEX(pn)]; - assert(PadnameLEN(pn)); - PadnameLVALUE_on(pn); + OP *rop; + + PERL_ARGS_ASSERT_DUP_ATTRLIST; + + /* An attrlist is either a simple OP_CONST or an OP_LIST with kids, + * where the first kid is OP_PUSHMARK and the remaining ones + * are OP_CONST. We need to push the OP_CONST values. + */ + if (o->op_type == OP_CONST) + rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc_NN(cSVOPo->op_sv)); + else { + assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS)); + rop = NULL; + for (o = cLISTOPo->op_first; o; o = OpSIBLING(o)) { + if (o->op_type == OP_CONST) + rop = op_append_elem(OP_LIST, rop, + newSVOP(OP_CONST, o->op_flags, + SvREFCNT_inc_NN(cSVOPo->op_sv))); + } } + return rop; } -static bool -S_vivifies(const OPCODE type) +STATIC void +S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs) { - switch(type) { - case OP_RV2AV: case OP_ASLICE: - case OP_RV2HV: case OP_KVASLICE: - case OP_RV2SV: case OP_HSLICE: - case OP_AELEMFAST: case OP_KVHSLICE: - case OP_HELEM: - case OP_AELEM: - return 1; + PERL_ARGS_ASSERT_APPLY_ATTRS; + { + SV * const stashsv = newSVhek(HvNAME_HEK(stash)); + + /* fake up C */ + +#define ATTRSMODULE "attributes" +#define ATTRSMODULE_PM "attributes.pm" + + Perl_load_module( + aTHX_ PERL_LOADMOD_IMPORT_OPS, + newSVpvs(ATTRSMODULE), + NULL, + op_prepend_elem(OP_LIST, + newSVOP(OP_CONST, 0, stashsv), + op_prepend_elem(OP_LIST, + newSVOP(OP_CONST, 0, + newRV(target)), + dup_attrlist(attrs)))); } - return 0; } +STATIC void +S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp) +{ + OP *pack, *imop, *arg; + SV *meth, *stashsv, **svp; -/* apply lvalue reference (aliasing) context to the optree o. - * E.g. in - * \($x,$y) = (...) - * o would be the list ($x,$y) and type would be OP_AASSIGN. - * It may descend and apply this to children too, for example in - * \( $cond ? $x, $y) = (...) - */ + PERL_ARGS_ASSERT_APPLY_ATTRS_MY; -static void -S_lvref(pTHX_ OP *o, I32 type) -{ - OP *kid; - OP * top_op = o; + if (!attrs) + return; - while (1) { - switch (o->op_type) { - case OP_COND_EXPR: - o = OpSIBLING(cUNOPo->op_first); - continue; + assert(target->op_type == OP_PADSV || + target->op_type == OP_PADHV || + target->op_type == OP_PADAV); - case OP_PUSHMARK: - goto do_next; + /* Ensure that attributes.pm is loaded. */ + /* Don't force the C if we don't need it. */ + svp = hv_fetchs(GvHVn(PL_incgv), ATTRSMODULE_PM, FALSE); + if (svp && *svp != &PL_sv_undef) + NOOP; /* already in %INC */ + else + Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, + newSVpvs(ATTRSMODULE), NULL); - case OP_RV2AV: - if (cUNOPo->op_first->op_type != OP_GV) goto badref; - o->op_flags |= OPf_STACKED; - if (o->op_flags & OPf_PARENS) { - if (o->op_private & OPpLVAL_INTRO) { - yyerror(Perl_form(aTHX_ "Can't modify reference to " - "localized parenthesized array in list assignment")); - goto do_next; - } - slurpy: - OpTYPE_set(o, OP_LVAVREF); - o->op_private &= OPpLVAL_INTRO|OPpPAD_STATE; - o->op_flags |= OPf_MOD|OPf_REF; - goto do_next; - } - o->op_private |= OPpLVREF_AV; - goto checkgv; + /* Need package name for method call. */ + pack = newSVOP(OP_CONST, 0, newSVpvs(ATTRSMODULE)); - case OP_RV2CV: - kid = cUNOPo->op_first; - if (kid->op_type == OP_NULL) - kid = cUNOPx(OpSIBLING(kUNOP->op_first)) - ->op_first; - o->op_private = OPpLVREF_CV; - if (kid->op_type == OP_GV) - o->op_flags |= OPf_STACKED; - else if (kid->op_type == OP_PADCV) { - o->op_targ = kid->op_targ; - kid->op_targ = 0; - op_free(cUNOPo->op_first); - cUNOPo->op_first = NULL; - o->op_flags &=~ OPf_KIDS; - } - else goto badref; - break; + /* Build up the real arg-list. */ + stashsv = newSVhek(HvNAME_HEK(stash)); - case OP_RV2HV: - if (o->op_flags & OPf_PARENS) { - parenhash: - yyerror(Perl_form(aTHX_ "Can't modify reference to " - "parenthesized hash in list assignment")); - goto do_next; - } - o->op_private |= OPpLVREF_HV; - /* FALLTHROUGH */ - case OP_RV2SV: - checkgv: - if (cUNOPo->op_first->op_type != OP_GV) goto badref; - o->op_flags |= OPf_STACKED; - break; + arg = newPADxVOP(OP_PADSV, 0, target->op_targ); + arg = op_prepend_elem(OP_LIST, + newSVOP(OP_CONST, 0, stashsv), + op_prepend_elem(OP_LIST, + newUNOP(OP_REFGEN, 0, + arg), + dup_attrlist(attrs))); - case OP_PADHV: - if (o->op_flags & OPf_PARENS) goto parenhash; - o->op_private |= OPpLVREF_HV; - /* FALLTHROUGH */ - case OP_PADSV: - PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX); - break; + /* Fake up a method call to import */ + meth = newSVpvs_share("import"); + imop = op_convert_list(OP_ENTERSUB, OPf_STACKED|OPf_WANT_VOID, + op_append_elem(OP_LIST, + op_prepend_elem(OP_LIST, pack, arg), + newMETHOP_named(OP_METHOD_NAMED, 0, meth))); - case OP_PADAV: - PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX); - if (o->op_flags & OPf_PARENS) goto slurpy; - o->op_private |= OPpLVREF_AV; - break; + /* Combine the ops. */ + *imopsp = op_append_elem(OP_LIST, *imopsp, imop); +} - case OP_AELEM: - case OP_HELEM: - o->op_private |= OPpLVREF_ELEM; - o->op_flags |= OPf_STACKED; - break; +/* +=notfor apidoc apply_attrs_string - case OP_ASLICE: - case OP_HSLICE: - OpTYPE_set(o, OP_LVREFSLICE); - o->op_private &= OPpLVAL_INTRO; - goto do_next; +Attempts to apply a list of attributes specified by the C and +C arguments to the subroutine identified by the C argument which +is expected to be associated with the package identified by the C +argument (see L). It gets this wrong, though, in that it +does not correctly identify the boundaries of the individual attribute +specifications within C. This is not really intended for the +public API, but has to be listed here for systems such as AIX which +need an explicit export list for symbols. (It's called from XS code +in support of the C keyword from F.) Patches to fix it +to respect attribute syntax properly would be welcome. - case OP_NULL: - if (o->op_flags & OPf_SPECIAL) /* do BLOCK */ - goto badref; - else if (!(o->op_flags & OPf_KIDS)) - goto do_next; +=cut +*/ - /* the code formerly only recursed into the first child of - * a non ex-list OP_NULL. if we ever encounter such a null op with - * more than one child, need to decide whether its ok to process - * *all* its kids or not */ - assert(o->op_targ == OP_LIST - || !(OpHAS_SIBLING(cBINOPo->op_first))); - /* FALLTHROUGH */ - case OP_LIST: - o = cLISTOPo->op_first; - continue; +void +Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv, + const char *attrstr, STRLEN len) +{ + OP *attrs = NULL; - case OP_STUB: - if (o->op_flags & OPf_PARENS) - goto do_next; - /* FALLTHROUGH */ - default: - badref: - /* diag_listed_as: Can't modify reference to %s in %s assignment */ - yyerror(Perl_form(aTHX_ "Can't modify reference to %s in %s", - o->op_type == OP_NULL && o->op_flags & OPf_SPECIAL - ? "do block" - : OP_DESC(o), - PL_op_desc[type])); - goto do_next; - } + PERL_ARGS_ASSERT_APPLY_ATTRS_STRING; - OpTYPE_set(o, OP_LVREF); - o->op_private &= - OPpLVAL_INTRO|OPpLVREF_ELEM|OPpLVREF_TYPE|OPpPAD_STATE; - if (type == OP_ENTERLOOP) - o->op_private |= OPpLVREF_ITER; + if (!len) { + len = strlen(attrstr); + } - do_next: - while (1) { - if (o == top_op) - return; /* at top; no parents/siblings to try */ - if (OpHAS_SIBLING(o)) { - o = o->op_sibparent; - break; - } - o = o->op_sibparent; /*try parent's next sibling */ + while (len) { + for (; isSPACE(*attrstr) && len; --len, ++attrstr) ; + if (len) { + const char * const sstr = attrstr; + for (; !isSPACE(*attrstr) && len; --len, ++attrstr) ; + attrs = op_append_elem(OP_LIST, attrs, + newSVOP(OP_CONST, 0, + newSVpvn(sstr, attrstr-sstr))); } - } /* while */ -} - + } -PERL_STATIC_INLINE bool -S_potential_mod_type(I32 type) -{ - /* Types that only potentially result in modification. */ - return type == OP_GREPSTART || type == OP_ENTERSUB - || type == OP_REFGEN || type == OP_LEAVESUBLV; + Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS, + newSVpvs(ATTRSMODULE), + NULL, op_prepend_elem(OP_LIST, + newSVOP(OP_CONST, 0, newSVpv(stashpv,0)), + op_prepend_elem(OP_LIST, + newSVOP(OP_CONST, 0, + newRV(MUTABLE_SV(cv))), + attrs))); } +STATIC void +S_move_proto_attr(pTHX_ OP **proto, OP **attrs, const GV * name, + bool curstash) +{ + OP *new_proto = NULL; + STRLEN pvlen; + char *pv; + OP *o; -/* -=for apidoc op_lvalue + PERL_ARGS_ASSERT_MOVE_PROTO_ATTR; -Propagate lvalue ("modifiable") context to an op and its children. -C represents the context type, roughly based on the type of op that -would do the modifying, although C is represented by C, -because it has no op type of its own (it is signalled by a flag on -the lvalue op). + if (!*attrs) + return; -This function detects things that can't be modified, such as C<$x+1>, and -generates errors for them. For example, C<$x+1 = 2> would cause it to be -called with an op of type C and a C argument of C. + o = *attrs; + if (o->op_type == OP_CONST) { + pv = SvPV(cSVOPo_sv, pvlen); + if (memBEGINs(pv, pvlen, "prototype(")) { + SV * const tmpsv = newSVpvn_flags(pv + 10, pvlen - 11, SvUTF8(cSVOPo_sv)); + SV ** const tmpo = cSVOPx_svp(o); + SvREFCNT_dec(cSVOPo_sv); + *tmpo = tmpsv; + new_proto = o; + *attrs = NULL; + } + } else if (o->op_type == OP_LIST) { + OP * lasto; + assert(o->op_flags & OPf_KIDS); + lasto = cLISTOPo->op_first; + assert(lasto->op_type == OP_PUSHMARK); + for (o = OpSIBLING(lasto); o; o = OpSIBLING(o)) { + if (o->op_type == OP_CONST) { + pv = SvPV(cSVOPo_sv, pvlen); + if (memBEGINs(pv, pvlen, "prototype(")) { + SV * const tmpsv = newSVpvn_flags(pv + 10, pvlen - 11, SvUTF8(cSVOPo_sv)); + SV ** const tmpo = cSVOPx_svp(o); + SvREFCNT_dec(cSVOPo_sv); + *tmpo = tmpsv; + if (new_proto && ckWARN(WARN_MISC)) { + STRLEN new_len; + const char * newp = SvPV(cSVOPo_sv, new_len); + Perl_warner(aTHX_ packWARN(WARN_MISC), + "Attribute prototype(%" UTF8f ") discards earlier prototype attribute in same sub", + UTF8fARG(SvUTF8(cSVOPo_sv), new_len, newp)); + op_free(new_proto); + } + else if (new_proto) + op_free(new_proto); + new_proto = o; + /* excise new_proto from the list */ + op_sibling_splice(*attrs, lasto, 1, NULL); + o = lasto; + continue; + } + } + lasto = o; + } + /* If the list is now just the PUSHMARK, scrap the whole thing; otherwise attributes.xs + would get pulled in with no real need */ + if (!OpHAS_SIBLING(cLISTOPx(*attrs)->op_first)) { + op_free(*attrs); + *attrs = NULL; + } + } -It also flags things that need to behave specially in an lvalue context, -such as C<$$x = 5> which might have to vivify a reference in C<$x>. + if (new_proto) { + SV *svname; + if (isGV(name)) { + svname = sv_newmortal(); + gv_efullname3(svname, name, NULL); + } + else if (SvPOK(name) && *SvPVX((SV *)name) == '&') + svname = newSVpvn_flags(SvPVX((SV *)name)+1, SvCUR(name)-1, SvUTF8(name)|SVs_TEMP); + else + svname = (SV *)name; + if (ckWARN(WARN_ILLEGALPROTO)) + (void)validate_proto(svname, cSVOPx_sv(new_proto), TRUE, + curstash); + if (*proto && ckWARN(WARN_PROTOTYPE)) { + STRLEN old_len, new_len; + const char * oldp = SvPV(cSVOPx_sv(*proto), old_len); + const char * newp = SvPV(cSVOPx_sv(new_proto), new_len); -=cut + if (curstash && svname == (SV *)name + && !memchr(SvPVX(svname), ':', SvCUR(svname))) { + svname = sv_2mortal(newSVsv(PL_curstname)); + sv_catpvs(svname, "::"); + sv_catsv(svname, (SV *)name); + } -Perl_op_lvalue_flags() is a non-API lower-level interface to -op_lvalue(). The flags param has these bits: - OP_LVALUE_NO_CROAK: return rather than croaking on error + Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE), + "Prototype '%" UTF8f "' overridden by attribute 'prototype(%" UTF8f ")'" + " in %" SVf, + UTF8fARG(SvUTF8(cSVOPx_sv(*proto)), old_len, oldp), + UTF8fARG(SvUTF8(cSVOPx_sv(new_proto)), new_len, newp), + SVfARG(svname)); + } + if (*proto) + op_free(*proto); + *proto = new_proto; + } +} -*/ +static void +S_cant_declare(pTHX_ OP *o) +{ + if (o->op_type == OP_NULL + && (o->op_flags & (OPf_SPECIAL|OPf_KIDS)) == OPf_KIDS) + o = cUNOPo->op_first; + yyerror(Perl_form(aTHX_ "Can't declare %s in \"%s\"", + o->op_type == OP_NULL + && o->op_flags & OPf_SPECIAL + ? "do block" + : OP_DESC(o), + PL_parser->in_my == KEY_our ? "our" : + PL_parser->in_my == KEY_state ? "state" : + "my")); +} -OP * -Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags) +STATIC OP * +S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp) { - OP *top_op = o; + I32 type; + const bool stately = PL_parser && PL_parser->in_my == KEY_state; + + PERL_ARGS_ASSERT_MY_KID; if (!o || (PL_parser && PL_parser->error_count)) return o; - while (1) { - OP *kid; - /* -1 = error on localize, 0 = ignore localize, 1 = ok to localize */ - int localize = -1; - OP *next_kid = NULL; + type = o->op_type; - if ((o->op_private & OPpTARGET_MY) - && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */ + if (OP_TYPE_IS_OR_WAS(o, OP_LIST)) { + OP *kid; + for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid)) + my_kid(kid, attrs, imopsp); + return o; + } else if (type == OP_UNDEF || type == OP_STUB) { + return o; + } else if (type == OP_RV2SV || /* "our" declaration */ + type == OP_RV2AV || + type == OP_RV2HV) { + if (cUNOPo->op_first->op_type != OP_GV) { /* MJD 20011224 */ + S_cant_declare(aTHX_ o); + } else if (attrs) { + GV * const gv = cGVOPx_gv(cUNOPo->op_first); + assert(PL_parser); + PL_parser->in_my = FALSE; + PL_parser->in_my_stash = NULL; + apply_attrs(GvSTASH(gv), + (type == OP_RV2SV ? GvSVn(gv) : + type == OP_RV2AV ? MUTABLE_SV(GvAVn(gv)) : + type == OP_RV2HV ? MUTABLE_SV(GvHVn(gv)) : MUTABLE_SV(gv)), + attrs); + } + o->op_private |= OPpOUR_INTRO; + return o; + } + else if (type == OP_REFGEN || type == OP_SREFGEN) { + if (!FEATURE_MYREF_IS_ENABLED) + Perl_croak(aTHX_ "The experimental declared_refs " + "feature is not enabled"); + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__DECLARED_REFS), + "Declaring references is experimental"); + /* Kid is a nulled OP_LIST, handled above. */ + my_kid(cUNOPo->op_first, attrs, imopsp); + return o; + } + else if (type != OP_PADSV && + type != OP_PADAV && + type != OP_PADHV && + type != OP_PUSHMARK) { - goto do_next; + S_cant_declare(aTHX_ o); + return o; } + else if (attrs && type != OP_PUSHMARK) { + HV *stash; - /* elements of a list might be in void context because the list is - in scalar context or because they are attribute sub calls */ - if ((o->op_flags & OPf_WANT) == OPf_WANT_VOID) - goto do_next; - - if (type == OP_PRTF || type == OP_SPRINTF) type = OP_ENTERSUB; + assert(PL_parser); + PL_parser->in_my = FALSE; + PL_parser->in_my_stash = NULL; - switch (o->op_type) { - case OP_UNDEF: - if (type == OP_SASSIGN) - goto nomod; - PL_modcount++; - goto do_next; + /* check for C when deciding package */ + stash = PAD_COMPNAME_TYPE(o->op_targ); + if (!stash) + stash = PL_curstash; + apply_attrs_my(stash, o, attrs, imopsp); + } + o->op_flags |= OPf_MOD; + o->op_private |= OPpLVAL_INTRO; + if (stately) + o->op_private |= OPpPAD_STATE; + return o; +} - case OP_STUB: - if ((o->op_flags & OPf_PARENS)) - break; - goto nomod; +OP * +Perl_my_attrs(pTHX_ OP *o, OP *attrs) +{ + OP *rops; + int maybe_scalar = 0; - case OP_ENTERSUB: - if ((type == OP_UNDEF || type == OP_REFGEN || type == OP_LOCK) && - !(o->op_flags & OPf_STACKED)) { - OpTYPE_set(o, OP_RV2CV); /* entersub => rv2cv */ - assert(cUNOPo->op_first->op_type == OP_NULL); - op_null(((LISTOP*)cUNOPo->op_first)->op_first);/* disable pushmark */ - break; - } - else { /* lvalue subroutine call */ + PERL_ARGS_ASSERT_MY_ATTRS; + +/* [perl #17376]: this appears to be premature, and results in code such as + C< our(%x); > executing in list mode rather than void mode */ +#if 0 + if (o->op_flags & OPf_PARENS) + list(o); + else + maybe_scalar = 1; +#else + maybe_scalar = 1; +#endif + if (attrs) + SAVEFREEOP(attrs); + rops = NULL; + o = my_kid(o, attrs, &rops); + if (rops) { + if (maybe_scalar && o->op_type == OP_PADSV) { + o = scalar(op_append_list(OP_LIST, rops, o)); o->op_private |= OPpLVAL_INTRO; - PL_modcount = RETURN_UNLIMITED_NUMBER; - if (S_potential_mod_type(type)) { - o->op_private |= OPpENTERSUB_INARGS; - break; + } + else { + /* The listop in rops might have a pushmark at the beginning, + which will mess up list assignment. */ + LISTOP * const lrops = cLISTOPx(rops); /* for brevity */ + if (rops->op_type == OP_LIST && + lrops->op_first && lrops->op_first->op_type == OP_PUSHMARK) + { + OP * const pushmark = lrops->op_first; + /* excise pushmark */ + op_sibling_splice(rops, NULL, 1, NULL); + op_free(pushmark); } - else { /* Compile-time error message: */ - OP *kid = cUNOPo->op_first; - CV *cv; - GV *gv; - SV *namesv; + o = op_append_list(OP_LIST, o, rops); + } + } + PL_parser->in_my = FALSE; + PL_parser->in_my_stash = NULL; + return o; +} - if (kid->op_type != OP_PUSHMARK) { - if (kid->op_type != OP_NULL || kid->op_targ != OP_LIST) - Perl_croak(aTHX_ - "panic: unexpected lvalue entersub " - "args: type/targ %ld:%" UVuf, - (long)kid->op_type, (UV)kid->op_targ); - kid = kLISTOP->op_first; - } - while (OpHAS_SIBLING(kid)) - kid = OpSIBLING(kid); - if (!(kid->op_type == OP_NULL && kid->op_targ == OP_RV2CV)) { - break; /* Postpone until runtime */ - } +OP * +Perl_sawparens(pTHX_ OP *o) +{ + PERL_UNUSED_CONTEXT; + if (o) + o->op_flags |= OPf_PARENS; + return o; +} - kid = kUNOP->op_first; - if (kid->op_type == OP_NULL && kid->op_targ == OP_RV2SV) - kid = kUNOP->op_first; - if (kid->op_type == OP_NULL) - Perl_croak(aTHX_ - "panic: unexpected constant lvalue entersub " - "entry via type/targ %ld:%" UVuf, - (long)kid->op_type, (UV)kid->op_targ); - if (kid->op_type != OP_GV) { - break; - } +OP * +Perl_bind_match(pTHX_ I32 type, OP *left, OP *right) +{ + OP *o; + bool ismatchop = 0; + const OPCODE ltype = left->op_type; + const OPCODE rtype = right->op_type; - gv = kGVOP_gv; - cv = isGV(gv) - ? GvCV(gv) - : SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV - ? MUTABLE_CV(SvRV(gv)) - : NULL; - if (!cv) - break; - if (CvLVALUE(cv)) - break; - if (flags & OP_LVALUE_NO_CROAK) - return NULL; + PERL_ARGS_ASSERT_BIND_MATCH; - namesv = cv_name(cv, NULL, 0); - yyerror_pv(Perl_form(aTHX_ "Can't modify non-lvalue " - "subroutine call of &%" SVf " in %s", - SVfARG(namesv), PL_op_desc[type]), - SvUTF8(namesv)); - goto do_next; - } - } - /* FALLTHROUGH */ - default: - nomod: - if (flags & OP_LVALUE_NO_CROAK) return NULL; - /* grep, foreach, subcalls, refgen */ - if (S_potential_mod_type(type)) - break; - yyerror(Perl_form(aTHX_ "Can't modify %s in %s", - (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL) - ? "do block" - : OP_DESC(o)), - type ? PL_op_desc[type] : "local")); - goto do_next; + if ( (ltype == OP_RV2AV || ltype == OP_RV2HV || ltype == OP_PADAV + || ltype == OP_PADHV) && ckWARN(WARN_MISC)) + { + const char * const desc + = PL_op_desc[( + rtype == OP_SUBST || rtype == OP_TRANS + || rtype == OP_TRANSR + ) + ? (int)rtype : OP_MATCH]; + const bool isary = ltype == OP_RV2AV || ltype == OP_PADAV; + SV * const name = op_varname(left); + if (name) + Perl_warner(aTHX_ packWARN(WARN_MISC), + "Applying %s to %" SVf " will act on scalar(%" SVf ")", + desc, SVfARG(name), SVfARG(name)); + else { + const char * const sample = (isary + ? "@array" : "%hash"); + Perl_warner(aTHX_ packWARN(WARN_MISC), + "Applying %s to %s will act on scalar(%s)", + desc, sample, sample); + } + } - case OP_PREINC: - case OP_PREDEC: - case OP_POW: - case OP_MULTIPLY: - case OP_DIVIDE: - case OP_MODULO: - case OP_ADD: - case OP_SUBTRACT: - case OP_CONCAT: - case OP_LEFT_SHIFT: - case OP_RIGHT_SHIFT: - case OP_BIT_AND: - case OP_BIT_XOR: - case OP_BIT_OR: - case OP_I_MULTIPLY: - case OP_I_DIVIDE: - case OP_I_MODULO: - case OP_I_ADD: - case OP_I_SUBTRACT: - if (!(o->op_flags & OPf_STACKED)) - goto nomod; - PL_modcount++; - break; + if (rtype == OP_CONST && + cSVOPx(right)->op_private & OPpCONST_BARE && + cSVOPx(right)->op_private & OPpCONST_STRICT) + { + no_bareword_allowed(right); + } - case OP_REPEAT: - if (o->op_flags & OPf_STACKED) { - PL_modcount++; - break; + /* !~ doesn't make sense with /r, so error on it for now */ + if (rtype == OP_SUBST && (cPMOPx(right)->op_pmflags & PMf_NONDESTRUCT) && + type == OP_NOT) + /* diag_listed_as: Using !~ with %s doesn't make sense */ + yyerror("Using !~ with s///r doesn't make sense"); + if (rtype == OP_TRANSR && type == OP_NOT) + /* diag_listed_as: Using !~ with %s doesn't make sense */ + yyerror("Using !~ with tr///r doesn't make sense"); + + ismatchop = (rtype == OP_MATCH || + rtype == OP_SUBST || + rtype == OP_TRANS || rtype == OP_TRANSR) + && !(right->op_flags & OPf_SPECIAL); + if (ismatchop && right->op_private & OPpTARGET_MY) { + right->op_targ = 0; + right->op_private &= ~OPpTARGET_MY; + } + if (!(right->op_flags & OPf_STACKED) && !right->op_targ && ismatchop) { + if (left->op_type == OP_PADSV + && !(left->op_private & OPpLVAL_INTRO)) + { + right->op_targ = left->op_targ; + op_free(left); + o = right; } - if (!(o->op_private & OPpREPEAT_DOLIST)) - goto nomod; else { - const I32 mods = PL_modcount; - /* we recurse rather than iterate here because we need to - * calculate and use the delta applied to PL_modcount by the - * first child. So in something like - * ($x, ($y) x 3) = split; - * split knows that 4 elements are wanted - */ - modkids(cBINOPo->op_first, type); - if (type != OP_AASSIGN) - goto nomod; - kid = cBINOPo->op_last; - if (kid->op_type == OP_CONST && SvIOK(kSVOP_sv)) { - const IV iv = SvIV(kSVOP_sv); - if (PL_modcount != RETURN_UNLIMITED_NUMBER) - PL_modcount = - mods + (PL_modcount - mods) * (iv < 0 ? 0 : iv); - } - else - PL_modcount = RETURN_UNLIMITED_NUMBER; - } - break; - - case OP_COND_EXPR: - localize = 1; - next_kid = OpSIBLING(cUNOPo->op_first); - break; - - case OP_RV2AV: - case OP_RV2HV: - if (type == OP_REFGEN && o->op_flags & OPf_PARENS) { - PL_modcount = RETURN_UNLIMITED_NUMBER; - /* Treat \(@foo) like ordinary list, but still mark it as modi- - fiable since some contexts need to know. */ - o->op_flags |= OPf_MOD; - goto do_next; + right->op_flags |= OPf_STACKED; + if (rtype != OP_MATCH && rtype != OP_TRANSR && + ! (rtype == OP_TRANS && + right->op_private & OPpTRANS_IDENTICAL) && + ! (rtype == OP_SUBST && + (cPMOPx(right)->op_pmflags & PMf_NONDESTRUCT))) + left = op_lvalue(left, rtype); + if (right->op_type == OP_TRANS || right->op_type == OP_TRANSR) + o = newBINOP(OP_NULL, OPf_STACKED, scalar(left), right); + else + o = op_prepend_elem(rtype, scalar(left), right); } - /* FALLTHROUGH */ - case OP_RV2GV: - if (scalar_mod_type(o, type)) - goto nomod; - ref(cUNOPo->op_first, o->op_type); - /* FALLTHROUGH */ - case OP_ASLICE: - case OP_HSLICE: - localize = 1; - /* FALLTHROUGH */ - case OP_AASSIGN: - /* Do not apply the lvsub flag for rv2[ah]v in scalar context. */ - if (type == OP_LEAVESUBLV && ( - (o->op_type != OP_RV2AV && o->op_type != OP_RV2HV) - || (o->op_flags & OPf_WANT) != OPf_WANT_SCALAR - )) - o->op_private |= OPpMAYBE_LVSUB; - /* FALLTHROUGH */ - case OP_NEXTSTATE: - case OP_DBSTATE: - PL_modcount = RETURN_UNLIMITED_NUMBER; - break; + if (type == OP_NOT) + return newUNOP(OP_NOT, 0, scalar(o)); + return o; + } + else + return bind_match(type, left, + pmruntime(newPMOP(OP_MATCH, 0), right, NULL, 0, 0)); +} - case OP_KVHSLICE: - case OP_KVASLICE: - case OP_AKEYS: - if (type == OP_LEAVESUBLV) - o->op_private |= OPpMAYBE_LVSUB; - goto nomod; +OP * +Perl_invert(pTHX_ OP *o) +{ + if (!o) + return NULL; + return newUNOP(OP_NOT, OPf_SPECIAL, scalar(o)); +} - case OP_AVHVSWITCH: - if (type == OP_LEAVESUBLV - && (o->op_private & OPpAVHVSWITCH_MASK) + OP_EACH == OP_KEYS) - o->op_private |= OPpMAYBE_LVSUB; - goto nomod; +OP * +Perl_cmpchain_start(pTHX_ I32 type, OP *left, OP *right) +{ + BINOP *bop; + OP *op; - case OP_AV2ARYLEN: - PL_hints |= HINT_BLOCK_SCOPE; - if (type == OP_LEAVESUBLV) - o->op_private |= OPpMAYBE_LVSUB; - PL_modcount++; - break; + if (!left) + left = newOP(OP_NULL, 0); + if (!right) + right = newOP(OP_NULL, 0); + scalar(left); + scalar(right); + NewOp(0, bop, 1, BINOP); + op = (OP*)bop; + ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP); + OpTYPE_set(op, type); + cBINOPx(op)->op_flags = OPf_KIDS; + cBINOPx(op)->op_private = 2; + cBINOPx(op)->op_first = left; + cBINOPx(op)->op_last = right; + OpMORESIB_set(left, right); + OpLASTSIB_set(right, op); + return op; +} - case OP_RV2SV: - ref(cUNOPo->op_first, o->op_type); - localize = 1; - /* FALLTHROUGH */ - case OP_GV: - PL_hints |= HINT_BLOCK_SCOPE; - /* FALLTHROUGH */ - case OP_SASSIGN: - case OP_ANDASSIGN: - case OP_ORASSIGN: - case OP_DORASSIGN: - PL_modcount++; - break; +OP * +Perl_cmpchain_extend(pTHX_ I32 type, OP *ch, OP *right) +{ + BINOP *bop; + OP *op; - case OP_AELEMFAST: - case OP_AELEMFAST_LEX: - localize = -1; - PL_modcount++; - break; + PERL_ARGS_ASSERT_CMPCHAIN_EXTEND; + if (!right) + right = newOP(OP_NULL, 0); + scalar(right); + NewOp(0, bop, 1, BINOP); + op = (OP*)bop; + ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP); + OpTYPE_set(op, type); + if (ch->op_type != OP_NULL) { + UNOP *lch; + OP *nch, *cleft, *cright; + NewOp(0, lch, 1, UNOP); + nch = (OP*)lch; + OpTYPE_set(nch, OP_NULL); + nch->op_flags = OPf_KIDS; + cleft = cBINOPx(ch)->op_first; + cright = cBINOPx(ch)->op_last; + cBINOPx(ch)->op_first = NULL; + cBINOPx(ch)->op_last = NULL; + cBINOPx(ch)->op_private = 0; + cBINOPx(ch)->op_flags = 0; + cUNOPx(nch)->op_first = cright; + OpMORESIB_set(cright, ch); + OpMORESIB_set(ch, cleft); + OpLASTSIB_set(cleft, nch); + ch = nch; + } + OpMORESIB_set(right, op); + OpMORESIB_set(op, cUNOPx(ch)->op_first); + cUNOPx(ch)->op_first = right; + return ch; +} - case OP_PADAV: - case OP_PADHV: - PL_modcount = RETURN_UNLIMITED_NUMBER; - if (type == OP_REFGEN && o->op_flags & OPf_PARENS) - { - /* Treat \(@foo) like ordinary list, but still mark it as modi- - fiable since some contexts need to know. */ - o->op_flags |= OPf_MOD; - goto do_next; - } - if (scalar_mod_type(o, type)) - goto nomod; - if ((o->op_flags & OPf_WANT) != OPf_WANT_SCALAR - && type == OP_LEAVESUBLV) - o->op_private |= OPpMAYBE_LVSUB; - /* FALLTHROUGH */ - case OP_PADSV: - PL_modcount++; - if (!type) /* local() */ - Perl_croak(aTHX_ "Can't localize lexical variable %" PNf, - PNfARG(PAD_COMPNAME(o->op_targ))); - if (!(o->op_private & OPpLVAL_INTRO) - || ( type != OP_SASSIGN && type != OP_AASSIGN - && PadnameIsSTATE(PAD_COMPNAME_SV(o->op_targ)) )) - S_mark_padname_lvalue(aTHX_ PAD_COMPNAME_SV(o->op_targ)); - break; +OP * +Perl_cmpchain_finish(pTHX_ OP *ch) +{ - case OP_PUSHMARK: - localize = 0; - break; + PERL_ARGS_ASSERT_CMPCHAIN_FINISH; + if (ch->op_type != OP_NULL) { + OPCODE cmpoptype = ch->op_type; + ch = CHECKOP(cmpoptype, ch); + if(!ch->op_next && ch->op_type == cmpoptype) + ch = fold_constants(op_integerize(op_std_init(ch))); + return ch; + } else { + OP *condop = NULL; + OP *rightarg = cUNOPx(ch)->op_first; + cUNOPx(ch)->op_first = OpSIBLING(rightarg); + OpLASTSIB_set(rightarg, NULL); + while (1) { + OP *cmpop = cUNOPx(ch)->op_first; + OP *leftarg = OpSIBLING(cmpop); + OPCODE cmpoptype = cmpop->op_type; + OP *nextrightarg; + bool is_last; + is_last = !(cUNOPx(ch)->op_first = OpSIBLING(leftarg)); + OpLASTSIB_set(cmpop, NULL); + OpLASTSIB_set(leftarg, NULL); + if (is_last) { + ch->op_flags = 0; + op_free(ch); + nextrightarg = NULL; + } else { + nextrightarg = newUNOP(OP_CMPCHAIN_DUP, 0, leftarg); + leftarg = newOP(OP_NULL, 0); + } + cBINOPx(cmpop)->op_first = leftarg; + cBINOPx(cmpop)->op_last = rightarg; + OpMORESIB_set(leftarg, rightarg); + OpLASTSIB_set(rightarg, cmpop); + cmpop->op_flags = OPf_KIDS; + cmpop->op_private = 2; + cmpop = CHECKOP(cmpoptype, cmpop); + if(!cmpop->op_next && cmpop->op_type == cmpoptype) + cmpop = op_integerize(op_std_init(cmpop)); + condop = condop ? newLOGOP(OP_CMPCHAIN_AND, 0, cmpop, condop) : + cmpop; + if (!nextrightarg) + return condop; + rightarg = nextrightarg; + } + } +} - case OP_KEYS: - if (type != OP_LEAVESUBLV && !scalar_mod_type(NULL, type)) - goto nomod; - goto lvalue_func; - case OP_SUBSTR: - if (o->op_private == 4) /* don't allow 4 arg substr as lvalue */ - goto nomod; - /* FALLTHROUGH */ - case OP_POS: - case OP_VEC: - lvalue_func: - if (type == OP_LEAVESUBLV) - o->op_private |= OPpMAYBE_LVSUB; - if (o->op_flags & OPf_KIDS && OpHAS_SIBLING(cBINOPo->op_first)) { - /* we recurse rather than iterate here because the child - * needs to be processed with a different 'type' parameter */ +/* +=for apidoc op_scope - /* substr and vec */ - /* If this op is in merely potential (non-fatal) modifiable - context, then apply OP_ENTERSUB context to - the kid op (to avoid croaking). Other- - wise pass this op’s own type so the correct op is mentioned - in error messages. */ - op_lvalue(OpSIBLING(cBINOPo->op_first), - S_potential_mod_type(type) - ? (I32)OP_ENTERSUB - : o->op_type); - } - break; - - case OP_AELEM: - case OP_HELEM: - ref(cBINOPo->op_first, o->op_type); - if (type == OP_ENTERSUB && - !(o->op_private & (OPpLVAL_INTRO | OPpDEREF))) - o->op_private |= OPpLVAL_DEFER; - if (type == OP_LEAVESUBLV) - o->op_private |= OPpMAYBE_LVSUB; - localize = 1; - PL_modcount++; - break; - - case OP_LEAVE: - case OP_LEAVELOOP: - o->op_private |= OPpLVALUE; - /* FALLTHROUGH */ - case OP_SCOPE: - case OP_ENTER: - case OP_LINESEQ: - localize = 0; - if (o->op_flags & OPf_KIDS) - next_kid = cLISTOPo->op_last; - break; - - case OP_NULL: - localize = 0; - if (o->op_flags & OPf_SPECIAL) /* do BLOCK */ - goto nomod; - else if (!(o->op_flags & OPf_KIDS)) - break; +Wraps up an op tree with some additional ops so that at runtime a dynamic +scope will be created. The original ops run in the new dynamic scope, +and then, provided that they exit normally, the scope will be unwound. +The additional ops used to create and unwind the dynamic scope will +normally be an C/C pair, but a C op may be used +instead if the ops are simple enough to not need the full dynamic scope +structure. - if (o->op_targ != OP_LIST) { - OP *sib = OpSIBLING(cLISTOPo->op_first); - /* OP_TRANS and OP_TRANSR with argument have a weird optree - * that looks like - * - * null - * arg - * trans - * - * compared with things like OP_MATCH which have the argument - * as a child: - * - * match - * arg - * - * so handle specially to correctly get "Can't modify" croaks etc - */ +=cut +*/ - if (sib && (sib->op_type == OP_TRANS || sib->op_type == OP_TRANSR)) - { - /* this should trigger a "Can't modify transliteration" err */ - op_lvalue(sib, type); - } - next_kid = cBINOPo->op_first; - /* we assume OP_NULLs which aren't ex-list have no more than 2 - * children. If this assumption is wrong, increase the scan - * limit below */ - assert( !OpHAS_SIBLING(next_kid) - || !OpHAS_SIBLING(OpSIBLING(next_kid))); - break; +OP * +Perl_op_scope(pTHX_ OP *o) +{ + if (o) { + if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || TAINTING_get) { + o = op_prepend_elem(OP_LINESEQ, + newOP(OP_ENTER, (o->op_flags & OPf_WANT)), o); + OpTYPE_set(o, OP_LEAVE); } - /* FALLTHROUGH */ - case OP_LIST: - localize = 0; - next_kid = cLISTOPo->op_first; - break; - - case OP_COREARGS: - goto do_next; - - case OP_AND: - case OP_OR: - if (type == OP_LEAVESUBLV - || !S_vivifies(cLOGOPo->op_first->op_type)) - next_kid = cLOGOPo->op_first; - else if (type == OP_LEAVESUBLV - || !S_vivifies(OpSIBLING(cLOGOPo->op_first)->op_type)) - next_kid = OpSIBLING(cLOGOPo->op_first); - goto nomod; + else if (o->op_type == OP_LINESEQ) { + OP *kid; + OpTYPE_set(o, OP_SCOPE); + kid = cLISTOPo->op_first; + if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) { + op_null(kid); - case OP_SREFGEN: - if (type == OP_NULL) { /* local */ - local_refgen: - if (!FEATURE_MYREF_IS_ENABLED) - Perl_croak(aTHX_ "The experimental declared_refs " - "feature is not enabled"); - Perl_ck_warner_d(aTHX_ - packWARN(WARN_EXPERIMENTAL__DECLARED_REFS), - "Declaring references is experimental"); - next_kid = cUNOPo->op_first; - goto do_next; - } - if (type != OP_AASSIGN && type != OP_SASSIGN - && type != OP_ENTERLOOP) - goto nomod; - /* Don’t bother applying lvalue context to the ex-list. */ - kid = cUNOPx(cUNOPo->op_first)->op_first; - assert (!OpHAS_SIBLING(kid)); - goto kid_2lvref; - case OP_REFGEN: - if (type == OP_NULL) /* local */ - goto local_refgen; - if (type != OP_AASSIGN) goto nomod; - kid = cUNOPo->op_first; - kid_2lvref: - { - const U8 ec = PL_parser ? PL_parser->error_count : 0; - S_lvref(aTHX_ kid, type); - if (!PL_parser || PL_parser->error_count == ec) { - if (!FEATURE_REFALIASING_IS_ENABLED) - Perl_croak(aTHX_ - "Experimental aliasing via reference not enabled"); - Perl_ck_warner_d(aTHX_ - packWARN(WARN_EXPERIMENTAL__REFALIASING), - "Aliasing via reference is experimental"); + /* The following deals with things like 'do {1 for 1}' */ + kid = OpSIBLING(kid); + if (kid && + (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE)) + op_null(kid); } } - if (o->op_type == OP_REFGEN) - op_null(cUNOPx(cUNOPo->op_first)->op_first); /* pushmark */ - op_null(o); - goto do_next; - - case OP_SPLIT: - if ((o->op_private & OPpSPLIT_ASSIGN)) { - /* This is actually @array = split. */ - PL_modcount = RETURN_UNLIMITED_NUMBER; - break; - } - goto nomod; + else + o = newLISTOP(OP_SCOPE, 0, o, NULL); + } + return o; +} - case OP_SCALAR: - op_lvalue(cUNOPo->op_first, OP_ENTERSUB); - goto nomod; +OP * +Perl_op_unscope(pTHX_ OP *o) +{ + if (o && o->op_type == OP_LINESEQ) { + OP *kid = cLISTOPo->op_first; + for(; kid; kid = OpSIBLING(kid)) + if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) + op_null(kid); } + return o; +} - /* [20011101.069 (#7861)] File test operators interpret OPf_REF to mean that - their argument is a filehandle; thus \stat(".") should not set - it. AMS 20011102 */ - if (type == OP_REFGEN && OP_IS_STAT(o->op_type)) - goto do_next; +/* +=for apidoc block_start - if (type != OP_LEAVESUBLV) - o->op_flags |= OPf_MOD; +Handles compile-time scope entry. +Arranges for hints to be restored on block +exit and also handles pad sequence numbers to make lexical variables scope +right. Returns a savestack index for use with C. - if (type == OP_AASSIGN || type == OP_SASSIGN) - o->op_flags |= OPf_SPECIAL - |(o->op_type == OP_ENTERSUB ? 0 : OPf_REF); - else if (!type) { /* local() */ - switch (localize) { - case 1: - o->op_private |= OPpLVAL_INTRO; - o->op_flags &= ~OPf_SPECIAL; - PL_hints |= HINT_BLOCK_SCOPE; - break; - case 0: - break; - case -1: - Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), - "Useless localization of %s", OP_DESC(o)); - } - } - else if (type != OP_GREPSTART && type != OP_ENTERSUB - && type != OP_LEAVESUBLV && o->op_type != OP_ENTERSUB) - o->op_flags |= OPf_REF; +=cut +*/ - do_next: - while (!next_kid) { - if (o == top_op) - return top_op; /* at top; no parents/siblings to try */ - if (OpHAS_SIBLING(o)) { - next_kid = o->op_sibparent; - if (!OpHAS_SIBLING(next_kid)) { - /* a few node types don't recurse into their second child */ - OP *parent = next_kid->op_sibparent; - I32 ptype = parent->op_type; - if ( (ptype == OP_NULL && parent->op_targ != OP_LIST) - || ( (ptype == OP_AND || ptype == OP_OR) - && (type != OP_LEAVESUBLV - && S_vivifies(next_kid->op_type)) - ) - ) { - /*try parent's next sibling */ - o = parent; - next_kid = NULL; - } - } - } - else - o = o->op_sibparent; /*try parent's next sibling */ +int +Perl_block_start(pTHX_ int full) +{ + const int retval = PL_savestack_ix; - } - o = next_kid; + PL_compiling.cop_seq = PL_cop_seqmax; + COP_SEQMAX_INC; + pad_block_start(full); + SAVEHINTS(); + PL_hints &= ~HINT_BLOCK_SCOPE; + SAVECOMPILEWARNINGS(); + PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings); + SAVEI32(PL_compiling.cop_seq); + PL_compiling.cop_seq = 0; - } /* while */ + CALL_BLOCK_HOOKS(bhk_start, full); + return retval; } +/* +=for apidoc block_end -STATIC bool -S_scalar_mod_type(const OP *o, I32 type) -{ - switch (type) { - case OP_POS: - case OP_SASSIGN: - if (o && o->op_type == OP_RV2GV) - return FALSE; - /* FALLTHROUGH */ - case OP_PREINC: - case OP_PREDEC: - case OP_POSTINC: - case OP_POSTDEC: - case OP_I_PREINC: - case OP_I_PREDEC: - case OP_I_POSTINC: - case OP_I_POSTDEC: - case OP_POW: - case OP_MULTIPLY: - case OP_DIVIDE: - case OP_MODULO: - case OP_REPEAT: - case OP_ADD: - case OP_SUBTRACT: - case OP_I_MULTIPLY: - case OP_I_DIVIDE: - case OP_I_MODULO: - case OP_I_ADD: - case OP_I_SUBTRACT: - case OP_LEFT_SHIFT: - case OP_RIGHT_SHIFT: - case OP_BIT_AND: - case OP_BIT_XOR: - case OP_BIT_OR: - case OP_NBIT_AND: - case OP_NBIT_XOR: - case OP_NBIT_OR: - case OP_SBIT_AND: - case OP_SBIT_XOR: - case OP_SBIT_OR: - case OP_CONCAT: - case OP_SUBST: - case OP_TRANS: - case OP_TRANSR: - case OP_READ: - case OP_SYSREAD: - case OP_RECV: - case OP_ANDASSIGN: - case OP_ORASSIGN: - case OP_DORASSIGN: - case OP_VEC: - case OP_SUBSTR: - return TRUE; - default: - return FALSE; - } -} +Handles compile-time scope exit. C +is the savestack index returned by +C, and C is the body of the block. Returns the block, +possibly modified. -STATIC bool -S_is_handle_constructor(const OP *o, I32 numargs) +=cut +*/ + +OP* +Perl_block_end(pTHX_ I32 floor, OP *seq) { - PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR; + const int needblockscope = PL_hints & HINT_BLOCK_SCOPE; + OP* retval = voidnonfinal(seq); + OP *o; - switch (o->op_type) { - case OP_PIPE_OP: - case OP_SOCKPAIR: - if (numargs == 2) - return TRUE; - /* FALLTHROUGH */ - case OP_SYSOPEN: - case OP_OPEN: - case OP_SELECT: /* XXX c.f. SelectSaver.pm */ - case OP_SOCKET: - case OP_OPEN_DIR: - case OP_ACCEPT: - if (numargs == 1) - return TRUE; - /* FALLTHROUGH */ - default: - return FALSE; + /* XXX Is the null PL_parser check necessary here? */ + assert(PL_parser); /* Let’s find out under debugging builds. */ + if (PL_parser && PL_parser->parsed_sub) { + o = newSTATEOP(0, NULL, NULL); + op_null(o); + retval = op_append_elem(OP_LINESEQ, retval, o); } -} -static OP * -S_refkids(pTHX_ OP *o, I32 type) -{ - if (o && o->op_flags & OPf_KIDS) { - OP *kid; - for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid)) - ref(kid, type); - } - return o; -} + CALL_BLOCK_HOOKS(bhk_pre_end, &retval); + LEAVE_SCOPE(floor); + if (needblockscope) + PL_hints |= HINT_BLOCK_SCOPE; /* propagate out */ + o = pad_leavemy(); -/* Apply reference (autovivification) context to the subtree at o. - * For example in - * push @{expression}, ....; - * o will be the head of 'expression' and type will be OP_RV2AV. - * It marks the op o (or a suitable child) as autovivifying, e.g. by - * setting OPf_MOD. - * For OP_RV2AV/OP_PADAV and OP_RV2HV/OP_PADHV sets OPf_REF too if - * set_op_ref is true. - * - * Also calls scalar(o). - */ + if (o) { + /* pad_leavemy has created a sequence of introcv ops for all my + subs declared in the block. We have to replicate that list with + clonecv ops, to deal with this situation: -OP * -Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref) -{ - OP * top_op = o; + sub { + my sub s1; + my sub s2; + sub s1 { state sub foo { \&s2 } } + }->() - PERL_ARGS_ASSERT_DOREF; + Originally, I was going to have introcv clone the CV and turn + off the stale flag. Since &s1 is declared before &s2, the + introcv op for &s1 is executed (on sub entry) before the one for + &s2. But the &foo sub inside &s1 (which is cloned when &s1 is + cloned, since it is a state sub) closes over &s2 and expects + to see it in its outer CV’s pad. If the introcv op clones &s1, + then &s2 is still marked stale. Since &s1 is not active, and + &foo closes over &s1’s implicit entry for &s2, we get a ‘Varia- + ble will not stay shared’ warning. Because it is the same stub + that will be used when the introcv op for &s2 is executed, clos- + ing over it is safe. Hence, we have to turn off the stale flag + on all lexical subs in the block before we clone any of them. + Hence, having introcv clone the sub cannot work. So we create a + list of ops like this: - if (PL_parser && PL_parser->error_count) - return o; + lineseq + | + +-- introcv + | + +-- introcv + | + +-- introcv + | + . + . + . + | + +-- clonecv + | + +-- clonecv + | + +-- clonecv + | + . + . + . + */ + OP *kid = o->op_flags & OPf_KIDS ? cLISTOPo->op_first : o; + OP * const last = o->op_flags & OPf_KIDS ? cLISTOPo->op_last : o; + for (;; kid = OpSIBLING(kid)) { + OP *newkid = newOP(OP_CLONECV, 0); + newkid->op_targ = kid->op_targ; + o = op_append_elem(OP_LINESEQ, o, newkid); + if (kid == last) break; + } + retval = op_prepend_elem(OP_LINESEQ, o, retval); + } - while (1) { - switch (o->op_type) { - case OP_ENTERSUB: - if ((type == OP_EXISTS || type == OP_DEFINED) && - !(o->op_flags & OPf_STACKED)) { - OpTYPE_set(o, OP_RV2CV); /* entersub => rv2cv */ - assert(cUNOPo->op_first->op_type == OP_NULL); - /* disable pushmark */ - op_null(((LISTOP*)cUNOPo->op_first)->op_first); - o->op_flags |= OPf_SPECIAL; - } - else if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV){ - o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV - : type == OP_RV2HV ? OPpDEREF_HV - : OPpDEREF_SV); - o->op_flags |= OPf_MOD; - } + CALL_BLOCK_HOOKS(bhk_post_end, &retval); - break; + return retval; +} - case OP_COND_EXPR: - o = OpSIBLING(cUNOPo->op_first); - continue; +/* +=for apidoc_section $scope - case OP_RV2SV: - if (type == OP_DEFINED) - o->op_flags |= OPf_SPECIAL; /* don't create GV */ - /* FALLTHROUGH */ - case OP_PADSV: - if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) { - o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV - : type == OP_RV2HV ? OPpDEREF_HV - : OPpDEREF_SV); - o->op_flags |= OPf_MOD; - } - if (o->op_flags & OPf_KIDS) { - type = o->op_type; - o = cUNOPo->op_first; - continue; - } - break; +=for apidoc blockhook_register - case OP_RV2AV: - case OP_RV2HV: - if (set_op_ref) - o->op_flags |= OPf_REF; - /* FALLTHROUGH */ - case OP_RV2GV: - if (type == OP_DEFINED) - o->op_flags |= OPf_SPECIAL; /* don't create GV */ - type = o->op_type; - o = cUNOPo->op_first; - continue; +Register a set of hooks to be called when the Perl lexical scope changes +at compile time. See L. - case OP_PADAV: - case OP_PADHV: - if (set_op_ref) - o->op_flags |= OPf_REF; - break; +=cut +*/ - case OP_SCALAR: - case OP_NULL: - if (!(o->op_flags & OPf_KIDS) || type == OP_DEFINED) - break; - o = cBINOPo->op_first; - continue; +void +Perl_blockhook_register(pTHX_ BHK *hk) +{ + PERL_ARGS_ASSERT_BLOCKHOOK_REGISTER; - case OP_AELEM: - case OP_HELEM: - if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) { - o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV - : type == OP_RV2HV ? OPpDEREF_HV - : OPpDEREF_SV); - o->op_flags |= OPf_MOD; - } - type = o->op_type; - o = cBINOPo->op_first; - continue;; - - case OP_SCOPE: - case OP_LEAVE: - set_op_ref = FALSE; - /* FALLTHROUGH */ - case OP_ENTER: - case OP_LIST: - if (!(o->op_flags & OPf_KIDS)) - break; - o = cLISTOPo->op_last; - continue; + Perl_av_create_and_push(aTHX_ &PL_blockhooks, newSViv(PTR2IV(hk))); +} - default: - break; - } /* switch */ +void +Perl_newPROG(pTHX_ OP *o) +{ + OP *start; - while (1) { - if (o == top_op) - return scalar(top_op); /* at top; no parents/siblings to try */ - if (OpHAS_SIBLING(o)) { - o = o->op_sibparent; - /* Normally skip all siblings and go straight to the parent; - * the only op that requires two children to be processed - * is OP_COND_EXPR */ - if (!OpHAS_SIBLING(o) - && o->op_sibparent->op_type == OP_COND_EXPR) - break; - continue; - } - o = o->op_sibparent; /*try parent's next sibling */ - } - } /* while */ -} + PERL_ARGS_ASSERT_NEWPROG; + if (PL_in_eval) { + PERL_CONTEXT *cx; + I32 i; + if (PL_eval_root) + return; + PL_eval_root = newUNOP(OP_LEAVEEVAL, + ((PL_in_eval & EVAL_KEEPERR) + ? OPf_SPECIAL : 0), o); -STATIC OP * -S_dup_attrlist(pTHX_ OP *o) -{ - OP *rop; + cx = CX_CUR(); + assert(CxTYPE(cx) == CXt_EVAL); - PERL_ARGS_ASSERT_DUP_ATTRLIST; + if ((cx->blk_gimme & G_WANT) == G_VOID) + scalarvoid(PL_eval_root); + else if ((cx->blk_gimme & G_WANT) == G_LIST) + list(PL_eval_root); + else + scalar(PL_eval_root); - /* An attrlist is either a simple OP_CONST or an OP_LIST with kids, - * where the first kid is OP_PUSHMARK and the remaining ones - * are OP_CONST. We need to push the OP_CONST values. - */ - if (o->op_type == OP_CONST) - rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc_NN(cSVOPo->op_sv)); + start = op_linklist(PL_eval_root); + PL_eval_root->op_next = 0; + i = PL_savestack_ix; + SAVEFREEOP(o); + ENTER; + S_process_optree(aTHX_ NULL, PL_eval_root, start); + LEAVE; + PL_savestack_ix = i; + } else { - assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS)); - rop = NULL; - for (o = cLISTOPo->op_first; o; o = OpSIBLING(o)) { - if (o->op_type == OP_CONST) - rop = op_append_elem(OP_LIST, rop, - newSVOP(OP_CONST, o->op_flags, - SvREFCNT_inc_NN(cSVOPo->op_sv))); + if (o->op_type == OP_STUB) { + /* This block is entered if nothing is compiled for the main + program. This will be the case for an genuinely empty main + program, or one which only has BEGIN blocks etc, so already + run and freed. + + Historically (5.000) the guard above was !o. However, commit + f8a08f7b8bd67b28 (Jun 2001), integrated to blead as + c71fccf11fde0068, changed perly.y so that newPROG() is now + called with the output of block_end(), which returns a new + OP_STUB for the case of an empty optree. ByteLoader (and + maybe other things) also take this path, because they set up + PL_main_start and PL_main_root directly, without generating an + optree. + + If the parsing the main program aborts (due to parse errors, + or due to BEGIN or similar calling exit), then newPROG() + isn't even called, and hence this code path and its cleanups + are skipped. This shouldn't make a make a difference: + * a non-zero return from perl_parse is a failure, and + perl_destruct() should be called immediately. + * however, if exit(0) is called during the parse, then + perl_parse() returns 0, and perl_run() is called. As + PL_main_start will be NULL, perl_run() will return + promptly, and the exit code will remain 0. + */ + + PL_comppad_name = 0; + PL_compcv = 0; + S_op_destroy(aTHX_ o); + return; + } + PL_main_root = op_scope(sawparens(scalarvoid(o))); + PL_curcop = &PL_compiling; + start = LINKLIST(PL_main_root); + PL_main_root->op_next = 0; + S_process_optree(aTHX_ NULL, PL_main_root, start); + if (!PL_parser->error_count) + /* on error, leave CV slabbed so that ops left lying around + * will eb cleaned up. Else unslab */ + cv_forget_slab(PL_compcv); + PL_compcv = 0; + + /* Register with debugger */ + if (PERLDB_INTER) { + CV * const cv = get_cvs("DB::postponed", 0); + if (cv) { + dSP; + PUSHMARK(SP); + XPUSHs(MUTABLE_SV(CopFILEGV(&PL_compiling))); + PUTBACK; + call_sv(MUTABLE_SV(cv), G_DISCARD); + } } } - return rop; } -STATIC void -S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs) +OP * +Perl_localize(pTHX_ OP *o, I32 lex) { - PERL_ARGS_ASSERT_APPLY_ATTRS; - { - SV * const stashsv = newSVhek(HvNAME_HEK(stash)); + PERL_ARGS_ASSERT_LOCALIZE; - /* fake up C */ + if (o->op_flags & OPf_PARENS) +/* [perl #17376]: this appears to be premature, and results in code such as + C< our(%x); > executing in list mode rather than void mode */ +#if 0 + list(o); +#else + NOOP; +#endif + else { + if ( PL_parser->bufptr > PL_parser->oldbufptr + && PL_parser->bufptr[-1] == ',' + && ckWARN(WARN_PARENTHESIS)) + { + char *s = PL_parser->bufptr; + bool sigil = FALSE; -#define ATTRSMODULE "attributes" -#define ATTRSMODULE_PM "attributes.pm" + /* some heuristics to detect a potential error */ + while (*s && (memCHRs(", \t\n", *s))) + s++; - Perl_load_module( - aTHX_ PERL_LOADMOD_IMPORT_OPS, - newSVpvs(ATTRSMODULE), - NULL, - op_prepend_elem(OP_LIST, - newSVOP(OP_CONST, 0, stashsv), - op_prepend_elem(OP_LIST, - newSVOP(OP_CONST, 0, - newRV(target)), - dup_attrlist(attrs)))); + while (1) { + if (*s && (memCHRs("@$%", *s) || (!lex && *s == '*')) + && *++s + && (isWORDCHAR(*s) || UTF8_IS_CONTINUED(*s))) { + s++; + sigil = TRUE; + while (*s && (isWORDCHAR(*s) || UTF8_IS_CONTINUED(*s))) + s++; + while (*s && (memCHRs(", \t\n", *s))) + s++; + } + else + break; + } + if (sigil && (*s == ';' || *s == '=')) { + Perl_warner(aTHX_ packWARN(WARN_PARENTHESIS), + "Parentheses missing around \"%s\" list", + lex + ? (PL_parser->in_my == KEY_our + ? "our" + : PL_parser->in_my == KEY_state + ? "state" + : "my") + : "local"); + } + } } + if (lex) + o = my(o); + else + o = op_lvalue(o, OP_NULL); /* a bit kludgey */ + PL_parser->in_my = FALSE; + PL_parser->in_my_stash = NULL; + return o; } -STATIC void -S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp) +OP * +Perl_jmaybe(pTHX_ OP *o) { - OP *pack, *imop, *arg; - SV *meth, *stashsv, **svp; + PERL_ARGS_ASSERT_JMAYBE; - PERL_ARGS_ASSERT_APPLY_ATTRS_MY; + if (o->op_type == OP_LIST) { + if (FEATURE_MULTIDIMENSIONAL_IS_ENABLED) { + OP * const o2 + = newSVREF(newGVOP(OP_GV, 0, gv_fetchpvs(";", GV_ADD|GV_NOTQUAL, SVt_PV))); + o = op_convert_list(OP_JOIN, 0, op_prepend_elem(OP_LIST, o2, o)); + } + else { + /* If the user disables this, then a warning might not be enough to alert + them to a possible change of behaviour here, so throw an exception. + */ + yyerror("Multidimensional hash lookup is disabled"); + } + } + return o; +} - if (!attrs) - return; +PERL_STATIC_INLINE OP * +S_op_std_init(pTHX_ OP *o) +{ + I32 type = o->op_type; - assert(target->op_type == OP_PADSV || - target->op_type == OP_PADHV || - target->op_type == OP_PADAV); + PERL_ARGS_ASSERT_OP_STD_INIT; - /* Ensure that attributes.pm is loaded. */ - /* Don't force the C if we don't need it. */ - svp = hv_fetchs(GvHVn(PL_incgv), ATTRSMODULE_PM, FALSE); - if (svp && *svp != &PL_sv_undef) - NOOP; /* already in %INC */ - else - Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, - newSVpvs(ATTRSMODULE), NULL); - - /* Need package name for method call. */ - pack = newSVOP(OP_CONST, 0, newSVpvs(ATTRSMODULE)); - - /* Build up the real arg-list. */ - stashsv = newSVhek(HvNAME_HEK(stash)); + if (PL_opargs[type] & OA_RETSCALAR) + scalar(o); + if (PL_opargs[type] & OA_TARGET && !o->op_targ) + o->op_targ = pad_alloc(type, SVs_PADTMP); - arg = newOP(OP_PADSV, 0); - arg->op_targ = target->op_targ; - arg = op_prepend_elem(OP_LIST, - newSVOP(OP_CONST, 0, stashsv), - op_prepend_elem(OP_LIST, - newUNOP(OP_REFGEN, 0, - arg), - dup_attrlist(attrs))); + return o; +} - /* Fake up a method call to import */ - meth = newSVpvs_share("import"); - imop = op_convert_list(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL|OPf_WANT_VOID, - op_append_elem(OP_LIST, - op_prepend_elem(OP_LIST, pack, arg), - newMETHOP_named(OP_METHOD_NAMED, 0, meth))); +PERL_STATIC_INLINE OP * +S_op_integerize(pTHX_ OP *o) +{ + I32 type = o->op_type; - /* Combine the ops. */ - *imopsp = op_append_elem(OP_LIST, *imopsp, imop); -} + PERL_ARGS_ASSERT_OP_INTEGERIZE; -/* -=notfor apidoc apply_attrs_string + /* integerize op. */ + if ((PL_opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER)) + { + o->op_ppaddr = PL_ppaddr[++(o->op_type)]; + } -Attempts to apply a list of attributes specified by the C and -C arguments to the subroutine identified by the C argument which -is expected to be associated with the package identified by the C -argument (see L). It gets this wrong, though, in that it -does not correctly identify the boundaries of the individual attribute -specifications within C. This is not really intended for the -public API, but has to be listed here for systems such as AIX which -need an explicit export list for symbols. (It's called from XS code -in support of the C keyword from F.) Patches to fix it -to respect attribute syntax properly would be welcome. + if (type == OP_NEGATE) + /* XXX might want a ck_negate() for this */ + cUNOPo->op_first->op_private &= ~OPpCONST_STRICT; -=cut -*/ + return o; +} -void -Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv, - const char *attrstr, STRLEN len) -{ - OP *attrs = NULL; +/* This function exists solely to provide a scope to limit + setjmp/longjmp() messing with auto variables. It cannot be inlined because + it uses setjmp + */ +STATIC int +S_fold_constants_eval(pTHX) { + int ret = 0; + dJMPENV; - PERL_ARGS_ASSERT_APPLY_ATTRS_STRING; + JMPENV_PUSH(ret); - if (!len) { - len = strlen(attrstr); + if (ret == 0) { + CALLRUNOPS(aTHX); } - while (len) { - for (; isSPACE(*attrstr) && len; --len, ++attrstr) ; - if (len) { - const char * const sstr = attrstr; - for (; !isSPACE(*attrstr) && len; --len, ++attrstr) ; - attrs = op_append_elem(OP_LIST, attrs, - newSVOP(OP_CONST, 0, - newSVpvn(sstr, attrstr-sstr))); - } - } + JMPENV_POP; - Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS, - newSVpvs(ATTRSMODULE), - NULL, op_prepend_elem(OP_LIST, - newSVOP(OP_CONST, 0, newSVpv(stashpv,0)), - op_prepend_elem(OP_LIST, - newSVOP(OP_CONST, 0, - newRV(MUTABLE_SV(cv))), - attrs))); + return ret; } -STATIC void -S_move_proto_attr(pTHX_ OP **proto, OP **attrs, const GV * name, - bool curstash) +static OP * +S_fold_constants(pTHX_ OP *const o) { - OP *new_proto = NULL; - STRLEN pvlen; - char *pv; - OP *o; + OP *curop; + OP *newop; + I32 type = o->op_type; + bool is_stringify; + SV *sv = NULL; + int ret = 0; + OP *old_next; + SV * const oldwarnhook = PL_warnhook; + SV * const olddiehook = PL_diehook; + COP not_compiling; + U8 oldwarn = PL_dowarn; + I32 old_cxix; - PERL_ARGS_ASSERT_MOVE_PROTO_ATTR; + PERL_ARGS_ASSERT_FOLD_CONSTANTS; - if (!*attrs) - return; + if (!(PL_opargs[type] & OA_FOLDCONST)) + goto nope; - o = *attrs; - if (o->op_type == OP_CONST) { - pv = SvPV(cSVOPo_sv, pvlen); - if (memBEGINs(pv, pvlen, "prototype(")) { - SV * const tmpsv = newSVpvn_flags(pv + 10, pvlen - 11, SvUTF8(cSVOPo_sv)); - SV ** const tmpo = cSVOPx_svp(o); - SvREFCNT_dec(cSVOPo_sv); - *tmpo = tmpsv; - new_proto = o; - *attrs = NULL; - } - } else if (o->op_type == OP_LIST) { - OP * lasto; - assert(o->op_flags & OPf_KIDS); - lasto = cLISTOPo->op_first; - assert(lasto->op_type == OP_PUSHMARK); - for (o = OpSIBLING(lasto); o; o = OpSIBLING(o)) { - if (o->op_type == OP_CONST) { - pv = SvPV(cSVOPo_sv, pvlen); - if (memBEGINs(pv, pvlen, "prototype(")) { - SV * const tmpsv = newSVpvn_flags(pv + 10, pvlen - 11, SvUTF8(cSVOPo_sv)); - SV ** const tmpo = cSVOPx_svp(o); - SvREFCNT_dec(cSVOPo_sv); - *tmpo = tmpsv; - if (new_proto && ckWARN(WARN_MISC)) { - STRLEN new_len; - const char * newp = SvPV(cSVOPo_sv, new_len); - Perl_warner(aTHX_ packWARN(WARN_MISC), - "Attribute prototype(%" UTF8f ") discards earlier prototype attribute in same sub", - UTF8fARG(SvUTF8(cSVOPo_sv), new_len, newp)); - op_free(new_proto); - } - else if (new_proto) - op_free(new_proto); - new_proto = o; - /* excise new_proto from the list */ - op_sibling_splice(*attrs, lasto, 1, NULL); - o = lasto; - continue; + switch (type) { + case OP_UCFIRST: + case OP_LCFIRST: + case OP_UC: + case OP_LC: + case OP_FC: +#ifdef USE_LOCALE_CTYPE + if (IN_LC_COMPILETIME(LC_CTYPE)) + goto nope; +#endif + break; + case OP_SLT: + case OP_SGT: + case OP_SLE: + case OP_SGE: + case OP_SCMP: +#ifdef USE_LOCALE_COLLATE + if (IN_LC_COMPILETIME(LC_COLLATE)) + goto nope; +#endif + break; + case OP_SPRINTF: + /* XXX what about the numeric ops? */ +#ifdef USE_LOCALE_NUMERIC + if (IN_LC_COMPILETIME(LC_NUMERIC)) + goto nope; +#endif + break; + case OP_PACK: + if (!OpHAS_SIBLING(cLISTOPo->op_first) + || OpSIBLING(cLISTOPo->op_first)->op_type != OP_CONST) + goto nope; + { + SV * const sv = cSVOPx_sv(OpSIBLING(cLISTOPo->op_first)); + if (!SvPOK(sv) || SvGMAGICAL(sv)) goto nope; + { + const char *s = SvPVX_const(sv); + while (s < SvEND(sv)) { + if (isALPHA_FOLD_EQ(*s, 'p')) goto nope; + s++; } } - lasto = o; - } - /* If the list is now just the PUSHMARK, scrap the whole thing; otherwise attributes.xs - would get pulled in with no real need */ - if (!OpHAS_SIBLING(cLISTOPx(*attrs)->op_first)) { - op_free(*attrs); - *attrs = NULL; } + break; + case OP_REPEAT: + if (o->op_private & OPpREPEAT_DOLIST) goto nope; + break; + case OP_SREFGEN: + if (cUNOPx(cUNOPo->op_first)->op_first->op_type != OP_CONST + || SvPADTMP(cSVOPx_sv(cUNOPx(cUNOPo->op_first)->op_first))) + goto nope; } - if (new_proto) { - SV *svname; - if (isGV(name)) { - svname = sv_newmortal(); - gv_efullname3(svname, name, NULL); - } - else if (SvPOK(name) && *SvPVX((SV *)name) == '&') - svname = newSVpvn_flags(SvPVX((SV *)name)+1, SvCUR(name)-1, SvUTF8(name)|SVs_TEMP); - else - svname = (SV *)name; - if (ckWARN(WARN_ILLEGALPROTO)) - (void)validate_proto(svname, cSVOPx_sv(new_proto), TRUE, - curstash); - if (*proto && ckWARN(WARN_PROTOTYPE)) { - STRLEN old_len, new_len; - const char * oldp = SvPV(cSVOPx_sv(*proto), old_len); - const char * newp = SvPV(cSVOPx_sv(new_proto), new_len); + if (PL_parser && PL_parser->error_count) + goto nope; /* Don't try to run w/ errors */ - if (curstash && svname == (SV *)name - && !memchr(SvPVX(svname), ':', SvCUR(svname))) { - svname = sv_2mortal(newSVsv(PL_curstname)); - sv_catpvs(svname, "::"); - sv_catsv(svname, (SV *)name); + for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) { + switch (curop->op_type) { + case OP_CONST: + if ( (curop->op_private & OPpCONST_BARE) + && (curop->op_private & OPpCONST_STRICT)) { + no_bareword_allowed(curop); + goto nope; } + /* FALLTHROUGH */ + case OP_LIST: + case OP_SCALAR: + case OP_NULL: + case OP_PUSHMARK: + /* Foldable; move to next op in list */ + break; - Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE), - "Prototype '%" UTF8f "' overridden by attribute 'prototype(%" UTF8f ")'" - " in %" SVf, - UTF8fARG(SvUTF8(cSVOPx_sv(*proto)), old_len, oldp), - UTF8fARG(SvUTF8(cSVOPx_sv(new_proto)), new_len, newp), - SVfARG(svname)); + default: + /* No other op types are considered foldable */ + goto nope; } - if (*proto) - op_free(*proto); - *proto = new_proto; } -} -static void -S_cant_declare(pTHX_ OP *o) -{ - if (o->op_type == OP_NULL - && (o->op_flags & (OPf_SPECIAL|OPf_KIDS)) == OPf_KIDS) - o = cUNOPo->op_first; - yyerror(Perl_form(aTHX_ "Can't declare %s in \"%s\"", - o->op_type == OP_NULL - && o->op_flags & OPf_SPECIAL - ? "do block" - : OP_DESC(o), - PL_parser->in_my == KEY_our ? "our" : - PL_parser->in_my == KEY_state ? "state" : - "my")); -} + curop = LINKLIST(o); + old_next = o->op_next; + o->op_next = 0; + PL_op = curop; -STATIC OP * -S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp) -{ - I32 type; - const bool stately = PL_parser && PL_parser->in_my == KEY_state; + old_cxix = cxstack_ix; + create_eval_scope(NULL, G_FAKINGEVAL); - PERL_ARGS_ASSERT_MY_KID; + /* Verify that we don't need to save it: */ + assert(PL_curcop == &PL_compiling); + StructCopy(&PL_compiling, ¬_compiling, COP); + PL_curcop = ¬_compiling; + /* The above ensures that we run with all the correct hints of the + currently compiling COP, but that IN_PERL_RUNTIME is true. */ + assert(IN_PERL_RUNTIME); + PL_warnhook = PERL_WARNHOOK_FATAL; + PL_diehook = NULL; - if (!o || (PL_parser && PL_parser->error_count)) - return o; + /* Effective $^W=1. */ + if ( ! (PL_dowarn & G_WARN_ALL_MASK)) + PL_dowarn |= G_WARN_ON; - type = o->op_type; + ret = S_fold_constants_eval(aTHX); - if (OP_TYPE_IS_OR_WAS(o, OP_LIST)) { - OP *kid; - for (kid = cLISTOPo->op_first; kid; kid = OpSIBLING(kid)) - my_kid(kid, attrs, imopsp); - return o; - } else if (type == OP_UNDEF || type == OP_STUB) { - return o; - } else if (type == OP_RV2SV || /* "our" declaration */ - type == OP_RV2AV || - type == OP_RV2HV) { - if (cUNOPo->op_first->op_type != OP_GV) { /* MJD 20011224 */ - S_cant_declare(aTHX_ o); - } else if (attrs) { - GV * const gv = cGVOPx_gv(cUNOPo->op_first); - assert(PL_parser); - PL_parser->in_my = FALSE; - PL_parser->in_my_stash = NULL; - apply_attrs(GvSTASH(gv), - (type == OP_RV2SV ? GvSVn(gv) : - type == OP_RV2AV ? MUTABLE_SV(GvAVn(gv)) : - type == OP_RV2HV ? MUTABLE_SV(GvHVn(gv)) : MUTABLE_SV(gv)), - attrs); + switch (ret) { + case 0: + sv = *(PL_stack_sp--); + if (o->op_targ && sv == PAD_SV(o->op_targ)) { /* grab pad temp? */ + pad_swipe(o->op_targ, FALSE); } - o->op_private |= OPpOUR_INTRO; - return o; - } - else if (type == OP_REFGEN || type == OP_SREFGEN) { - if (!FEATURE_MYREF_IS_ENABLED) - Perl_croak(aTHX_ "The experimental declared_refs " - "feature is not enabled"); - Perl_ck_warner_d(aTHX_ - packWARN(WARN_EXPERIMENTAL__DECLARED_REFS), - "Declaring references is experimental"); - /* Kid is a nulled OP_LIST, handled above. */ - my_kid(cUNOPo->op_first, attrs, imopsp); - return o; - } - else if (type != OP_PADSV && - type != OP_PADAV && - type != OP_PADHV && - type != OP_PUSHMARK) - { - S_cant_declare(aTHX_ o); - return o; + else if (SvTEMP(sv)) { /* grab mortal temp? */ + SvREFCNT_inc_simple_void(sv); + SvTEMP_off(sv); + } + else { assert(SvIMMORTAL(sv)); } + break; + case 3: + /* Something tried to die. Abandon constant folding. */ + /* Pretend the error never happened. */ + CLEAR_ERRSV(); + o->op_next = old_next; + break; + default: + /* Don't expect 1 (setjmp failed) or 2 (something called my_exit) */ + PL_warnhook = oldwarnhook; + PL_diehook = olddiehook; + /* XXX note that this croak may fail as we've already blown away + * the stack - eg any nested evals */ + Perl_croak(aTHX_ "panic: fold_constants JMPENV_PUSH returned %d", ret); } - else if (attrs && type != OP_PUSHMARK) { - HV *stash; - - assert(PL_parser); - PL_parser->in_my = FALSE; - PL_parser->in_my_stash = NULL; + PL_dowarn = oldwarn; + PL_warnhook = oldwarnhook; + PL_diehook = olddiehook; + PL_curcop = &PL_compiling; - /* check for C when deciding package */ - stash = PAD_COMPNAME_TYPE(o->op_targ); - if (!stash) - stash = PL_curstash; - apply_attrs_my(stash, o, attrs, imopsp); + /* if we croaked, depending on how we croaked the eval scope + * may or may not have already been popped */ + if (cxstack_ix > old_cxix) { + assert(cxstack_ix == old_cxix + 1); + assert(CxTYPE(CX_CUR()) == CXt_EVAL); + delete_eval_scope(); } - o->op_flags |= OPf_MOD; - o->op_private |= OPpLVAL_INTRO; - if (stately) - o->op_private |= OPpPAD_STATE; - return o; -} - -OP * -Perl_my_attrs(pTHX_ OP *o, OP *attrs) -{ - OP *rops; - int maybe_scalar = 0; - - PERL_ARGS_ASSERT_MY_ATTRS; + if (ret) + goto nope; -/* [perl #17376]: this appears to be premature, and results in code such as - C< our(%x); > executing in list mode rather than void mode */ -#if 0 - if (o->op_flags & OPf_PARENS) - list(o); - else - maybe_scalar = 1; -#else - maybe_scalar = 1; -#endif - if (attrs) - SAVEFREEOP(attrs); - rops = NULL; - o = my_kid(o, attrs, &rops); - if (rops) { - if (maybe_scalar && o->op_type == OP_PADSV) { - o = scalar(op_append_list(OP_LIST, rops, o)); - o->op_private |= OPpLVAL_INTRO; - } - else { - /* The listop in rops might have a pushmark at the beginning, - which will mess up list assignment. */ - LISTOP * const lrops = (LISTOP *)rops; /* for brevity */ - if (rops->op_type == OP_LIST && - lrops->op_first && lrops->op_first->op_type == OP_PUSHMARK) - { - OP * const pushmark = lrops->op_first; - /* excise pushmark */ - op_sibling_splice(rops, NULL, 1, NULL); - op_free(pushmark); - } - o = op_append_list(OP_LIST, o, rops); - } + /* OP_STRINGIFY and constant folding are used to implement qq. + Here the constant folding is an implementation detail that we + want to hide. If the stringify op is itself already marked + folded, however, then it is actually a folded join. */ + is_stringify = type == OP_STRINGIFY && !o->op_folded; + op_free(o); + assert(sv); + if (is_stringify) + SvPADTMP_off(sv); + else if (!SvIMMORTAL(sv)) { + SvPADTMP_on(sv); + SvREADONLY_on(sv); } - PL_parser->in_my = FALSE; - PL_parser->in_my_stash = NULL; - return o; -} + newop = newSVOP(OP_CONST, 0, MUTABLE_SV(sv)); + if (!is_stringify) newop->op_folded = 1; + return newop; -OP * -Perl_sawparens(pTHX_ OP *o) -{ - PERL_UNUSED_CONTEXT; - if (o) - o->op_flags |= OPf_PARENS; + nope: return o; } -OP * -Perl_bind_match(pTHX_ I32 type, OP *left, OP *right) +/* convert a constant range in list context into an OP_RV2AV, OP_CONST pair; + * the constant value being an AV holding the flattened range. + */ + +static void +S_gen_constant_list(pTHX_ OP *o) { - OP *o; - bool ismatchop = 0; - const OPCODE ltype = left->op_type; - const OPCODE rtype = right->op_type; + OP *curop, *old_next; + SV * const oldwarnhook = PL_warnhook; + SV * const olddiehook = PL_diehook; + COP *old_curcop; + U8 oldwarn = PL_dowarn; + SV **svp; + AV *av; + I32 old_cxix; + COP not_compiling; + int ret = 0; + dJMPENV; + bool op_was_null; - PERL_ARGS_ASSERT_BIND_MATCH; + list(o); + if (PL_parser && PL_parser->error_count) + return; /* Don't attempt to run with errors */ - if ( (ltype == OP_RV2AV || ltype == OP_RV2HV || ltype == OP_PADAV - || ltype == OP_PADHV) && ckWARN(WARN_MISC)) - { - const char * const desc - = PL_op_desc[( - rtype == OP_SUBST || rtype == OP_TRANS - || rtype == OP_TRANSR - ) - ? (int)rtype : OP_MATCH]; - const bool isary = ltype == OP_RV2AV || ltype == OP_PADAV; - SV * const name = - S_op_varname(aTHX_ left); - if (name) - Perl_warner(aTHX_ packWARN(WARN_MISC), - "Applying %s to %" SVf " will act on scalar(%" SVf ")", - desc, SVfARG(name), SVfARG(name)); - else { - const char * const sample = (isary - ? "@array" : "%hash"); - Perl_warner(aTHX_ packWARN(WARN_MISC), - "Applying %s to %s will act on scalar(%s)", - desc, sample, sample); - } - } + curop = LINKLIST(o); + old_next = o->op_next; + o->op_next = 0; + op_was_null = o->op_type == OP_NULL; + if (op_was_null) /* b3698342565fb462291fba4b432cfcd05b6eb4e1 */ + o->op_type = OP_CUSTOM; + CALL_PEEP(curop); + if (op_was_null) + o->op_type = OP_NULL; + op_prune_chain_head(&curop); + PL_op = curop; - if (rtype == OP_CONST && - cSVOPx(right)->op_private & OPpCONST_BARE && - cSVOPx(right)->op_private & OPpCONST_STRICT) - { - no_bareword_allowed(right); + old_cxix = cxstack_ix; + create_eval_scope(NULL, G_FAKINGEVAL); + + old_curcop = PL_curcop; + StructCopy(old_curcop, ¬_compiling, COP); + PL_curcop = ¬_compiling; + /* The above ensures that we run with all the correct hints of the + current COP, but that IN_PERL_RUNTIME is true. */ + assert(IN_PERL_RUNTIME); + PL_warnhook = PERL_WARNHOOK_FATAL; + PL_diehook = NULL; + JMPENV_PUSH(ret); + + /* Effective $^W=1. */ + if ( ! (PL_dowarn & G_WARN_ALL_MASK)) + PL_dowarn |= G_WARN_ON; + + switch (ret) { + case 0: +#if defined DEBUGGING && !defined DEBUGGING_RE_ONLY + PL_curstackinfo->si_stack_hwm = 0; /* stop valgrind complaining */ +#endif + Perl_pp_pushmark(aTHX); + CALLRUNOPS(aTHX); + PL_op = curop; + assert (!(curop->op_flags & OPf_SPECIAL)); + assert(curop->op_type == OP_RANGE); + Perl_pp_anonlist(aTHX); + break; + case 3: + CLEAR_ERRSV(); + o->op_next = old_next; + break; + default: + JMPENV_POP; + PL_warnhook = oldwarnhook; + PL_diehook = olddiehook; + Perl_croak(aTHX_ "panic: gen_constant_list JMPENV_PUSH returned %d", + ret); } - /* !~ doesn't make sense with /r, so error on it for now */ - if (rtype == OP_SUBST && (cPMOPx(right)->op_pmflags & PMf_NONDESTRUCT) && - type == OP_NOT) - /* diag_listed_as: Using !~ with %s doesn't make sense */ - yyerror("Using !~ with s///r doesn't make sense"); - if (rtype == OP_TRANSR && type == OP_NOT) - /* diag_listed_as: Using !~ with %s doesn't make sense */ - yyerror("Using !~ with tr///r doesn't make sense"); + JMPENV_POP; + PL_dowarn = oldwarn; + PL_warnhook = oldwarnhook; + PL_diehook = olddiehook; + PL_curcop = old_curcop; - ismatchop = (rtype == OP_MATCH || - rtype == OP_SUBST || - rtype == OP_TRANS || rtype == OP_TRANSR) - && !(right->op_flags & OPf_SPECIAL); - if (ismatchop && right->op_private & OPpTARGET_MY) { - right->op_targ = 0; - right->op_private &= ~OPpTARGET_MY; + if (cxstack_ix > old_cxix) { + assert(cxstack_ix == old_cxix + 1); + assert(CxTYPE(CX_CUR()) == CXt_EVAL); + delete_eval_scope(); } - if (!(right->op_flags & OPf_STACKED) && !right->op_targ && ismatchop) { - if (left->op_type == OP_PADSV - && !(left->op_private & OPpLVAL_INTRO)) + if (ret) + return; + + OpTYPE_set(o, OP_RV2AV); + o->op_flags &= ~OPf_REF; /* treat \(1..2) like an ordinary list */ + o->op_flags |= OPf_PARENS; /* and flatten \(1..2,3) */ + o->op_opt = 0; /* needs to be revisited in rpeep() */ + av = (AV *)SvREFCNT_inc_NN(*PL_stack_sp--); + + /* replace subtree with an OP_CONST */ + curop = cUNOPo->op_first; + op_sibling_splice(o, NULL, -1, newSVOP(OP_CONST, 0, (SV *)av)); + op_free(curop); + + if (AvFILLp(av) != -1) + for (svp = AvARRAY(av) + AvFILLp(av); svp >= AvARRAY(av); --svp) { - right->op_targ = left->op_targ; - op_free(left); - o = right; - } - else { - right->op_flags |= OPf_STACKED; - if (rtype != OP_MATCH && rtype != OP_TRANSR && - ! (rtype == OP_TRANS && - right->op_private & OPpTRANS_IDENTICAL) && - ! (rtype == OP_SUBST && - (cPMOPx(right)->op_pmflags & PMf_NONDESTRUCT))) - left = op_lvalue(left, rtype); - if (right->op_type == OP_TRANS || right->op_type == OP_TRANSR) - o = newBINOP(OP_NULL, OPf_STACKED, scalar(left), right); - else - o = op_prepend_elem(rtype, scalar(left), right); + SvPADTMP_on(*svp); + SvREADONLY_on(*svp); } - if (type == OP_NOT) - return newUNOP(OP_NOT, 0, scalar(o)); - return o; - } - else - return bind_match(type, left, - pmruntime(newPMOP(OP_MATCH, 0), right, NULL, 0, 0)); + LINKLIST(o); + list(o); + return; } -OP * -Perl_invert(pTHX_ OP *o) -{ - if (!o) - return NULL; - return newUNOP(OP_NOT, OPf_SPECIAL, scalar(o)); -} +/* +=for apidoc_section $optree_manipulation +*/ -OP * -Perl_cmpchain_start(pTHX_ I32 type, OP *left, OP *right) +enum { + FORBID_LOOPEX_DEFAULT = (1<<0), +}; + +static void walk_ops_find_labels(pTHX_ OP *o, HV *gotolabels) { - BINOP *bop; - OP *op; + switch(o->op_type) { + case OP_NEXTSTATE: + case OP_DBSTATE: + { + STRLEN label_len; + U32 label_flags; + const char *label_pv = CopLABEL_len_flags((COP *)o, &label_len, &label_flags); + if(!label_pv) + break; - if (!left) - left = newOP(OP_NULL, 0); - if (!right) - right = newOP(OP_NULL, 0); - scalar(left); - scalar(right); - NewOp(0, bop, 1, BINOP); - op = (OP*)bop; - ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP); - OpTYPE_set(op, type); - cBINOPx(op)->op_flags = OPf_KIDS; - cBINOPx(op)->op_private = 2; - cBINOPx(op)->op_first = left; - cBINOPx(op)->op_last = right; - OpMORESIB_set(left, right); - OpLASTSIB_set(right, op); - return op; -} + SV *labelsv = newSVpvn_flags(label_pv, label_len, label_flags); + SAVEFREESV(labelsv); -OP * -Perl_cmpchain_extend(pTHX_ I32 type, OP *ch, OP *right) -{ - BINOP *bop; - OP *op; + sv_inc(HeVAL(hv_fetch_ent(gotolabels, labelsv, TRUE, 0))); + break; + } + } - PERL_ARGS_ASSERT_CMPCHAIN_EXTEND; - if (!right) - right = newOP(OP_NULL, 0); - scalar(right); - NewOp(0, bop, 1, BINOP); - op = (OP*)bop; - ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP); - OpTYPE_set(op, type); - if (ch->op_type != OP_NULL) { - UNOP *lch; - OP *nch, *cleft, *cright; - NewOp(0, lch, 1, UNOP); - nch = (OP*)lch; - OpTYPE_set(nch, OP_NULL); - nch->op_flags = OPf_KIDS; - cleft = cBINOPx(ch)->op_first; - cright = cBINOPx(ch)->op_last; - cBINOPx(ch)->op_first = NULL; - cBINOPx(ch)->op_last = NULL; - cBINOPx(ch)->op_private = 0; - cBINOPx(ch)->op_flags = 0; - cUNOPx(nch)->op_first = cright; - OpMORESIB_set(cright, ch); - OpMORESIB_set(ch, cleft); - OpLASTSIB_set(cleft, nch); - ch = nch; + if(!(o->op_flags & OPf_KIDS)) + return; + + OP *kid = cUNOPo->op_first; + while(kid) { + walk_ops_find_labels(aTHX_ kid, gotolabels); + kid = OpSIBLING(kid); } - OpMORESIB_set(right, op); - OpMORESIB_set(op, cUNOPx(ch)->op_first); - cUNOPx(ch)->op_first = right; - return ch; } -OP * -Perl_cmpchain_finish(pTHX_ OP *ch) +static void walk_ops_forbid(pTHX_ OP *o, U32 flags, HV *permittedloops, HV *permittedgotos, const char *blockname) { + bool is_loop = FALSE; + SV *labelsv = NULL; - PERL_ARGS_ASSERT_CMPCHAIN_FINISH; - if (ch->op_type != OP_NULL) { - OPCODE cmpoptype = ch->op_type; - ch = CHECKOP(cmpoptype, ch); - if(!ch->op_next && ch->op_type == cmpoptype) - ch = fold_constants(op_integerize(op_std_init(ch))); - return ch; - } else { - OP *condop = NULL; - OP *rightarg = cUNOPx(ch)->op_first; - cUNOPx(ch)->op_first = OpSIBLING(rightarg); - OpLASTSIB_set(rightarg, NULL); - while (1) { - OP *cmpop = cUNOPx(ch)->op_first; - OP *leftarg = OpSIBLING(cmpop); - OPCODE cmpoptype = cmpop->op_type; - OP *nextrightarg; - bool is_last; - is_last = !(cUNOPx(ch)->op_first = OpSIBLING(leftarg)); - OpLASTSIB_set(cmpop, NULL); - OpLASTSIB_set(leftarg, NULL); - if (is_last) { - ch->op_flags = 0; - op_free(ch); - nextrightarg = NULL; - } else { - nextrightarg = newUNOP(OP_CMPCHAIN_DUP, 0, leftarg); - leftarg = newOP(OP_NULL, 0); - } - cBINOPx(cmpop)->op_first = leftarg; - cBINOPx(cmpop)->op_last = rightarg; - OpMORESIB_set(leftarg, rightarg); - OpLASTSIB_set(rightarg, cmpop); - cmpop->op_flags = OPf_KIDS; - cmpop->op_private = 2; - cmpop = CHECKOP(cmpoptype, cmpop); - if(!cmpop->op_next && cmpop->op_type == cmpoptype) - cmpop = op_integerize(op_std_init(cmpop)); - condop = condop ? newLOGOP(OP_CMPCHAIN_AND, 0, cmpop, condop) : - cmpop; - if (!nextrightarg) - return condop; - rightarg = nextrightarg; - } - } -} + switch(o->op_type) { + case OP_NEXTSTATE: + case OP_DBSTATE: + PL_curcop = (COP *)o; + return; -/* -=for apidoc op_scope + case OP_RETURN: + goto forbid; -Wraps up an op tree with some additional ops so that at runtime a dynamic -scope will be created. The original ops run in the new dynamic scope, -and then, provided that they exit normally, the scope will be unwound. -The additional ops used to create and unwind the dynamic scope will -normally be an C/C pair, but a C op may be used -instead if the ops are simple enough to not need the full dynamic scope -structure. + case OP_GOTO: + { + /* OPf_STACKED means either dynamically computed label or `goto &sub` */ + if(o->op_flags & OPf_STACKED) + goto forbid; -=cut -*/ + SV *target = newSVpvn_utf8(cPVOPo->op_pv, strlen(cPVOPo->op_pv), + cPVOPo->op_private & OPpPV_IS_UTF8); + SAVEFREESV(target); -OP * -Perl_op_scope(pTHX_ OP *o) -{ - if (o) { - if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || TAINTING_get) { - o = op_prepend_elem(OP_LINESEQ, - newOP(OP_ENTER, (o->op_flags & OPf_WANT)), o); - OpTYPE_set(o, OP_LEAVE); - } - else if (o->op_type == OP_LINESEQ) { - OP *kid; - OpTYPE_set(o, OP_SCOPE); - kid = ((LISTOP*)o)->op_first; - if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) { - op_null(kid); + if(hv_fetch_ent(permittedgotos, target, FALSE, 0)) + break; - /* The following deals with things like 'do {1 for 1}' */ - kid = OpSIBLING(kid); - if (kid && - (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE)) - op_null(kid); + goto forbid; + } + + case OP_NEXT: + case OP_LAST: + case OP_REDO: + { + /* OPf_SPECIAL means this is a default loopex */ + if(o->op_flags & OPf_SPECIAL) { + if(flags & FORBID_LOOPEX_DEFAULT) + goto forbid; + + break; + } + /* OPf_STACKED means it's a dynamically computed label */ + if(o->op_flags & OPf_STACKED) + goto forbid; + + SV *target = newSVpv(cPVOPo->op_pv, strlen(cPVOPo->op_pv)); + if(cPVOPo->op_private & OPpPV_IS_UTF8) + SvUTF8_on(target); + SAVEFREESV(target); + + if(hv_fetch_ent(permittedloops, target, FALSE, 0)) + break; + + goto forbid; + } + + case OP_LEAVELOOP: + { + STRLEN label_len; + U32 label_flags; + const char *label_pv = CopLABEL_len_flags(PL_curcop, &label_len, &label_flags); + + if(label_pv) { + labelsv = newSVpvn(label_pv, label_len); + if(label_flags & SVf_UTF8) + SvUTF8_on(labelsv); + SAVEFREESV(labelsv); + + sv_inc(HeVAL(hv_fetch_ent(permittedloops, labelsv, TRUE, 0))); + } + + is_loop = TRUE; + break; } + +forbid: + /* diag_listed_as: Can't "%s" out of a "defer" block */ + /* diag_listed_as: Can't "%s" out of a "finally" block */ + croak("Can't \"%s\" out of %s", PL_op_name[o->op_type], blockname); + + default: + break; + } + + if(!(o->op_flags & OPf_KIDS)) + return; + + OP *kid = cUNOPo->op_first; + while(kid) { + walk_ops_forbid(aTHX_ kid, flags, permittedloops, permittedgotos, blockname); + kid = OpSIBLING(kid); + + if(is_loop) { + /* Now in the body of the loop; we can permit loopex default */ + flags &= ~FORBID_LOOPEX_DEFAULT; } - else - o = newLISTOP(OP_SCOPE, 0, o, NULL); } - return o; -} -OP * -Perl_op_unscope(pTHX_ OP *o) -{ - if (o && o->op_type == OP_LINESEQ) { - OP *kid = cLISTOPo->op_first; - for(; kid; kid = OpSIBLING(kid)) - if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) - op_null(kid); + if(is_loop && labelsv) { + HE *he = hv_fetch_ent(permittedloops, labelsv, FALSE, 0); + if(SvIV(HeVAL(he)) > 1) + sv_dec(HeVAL(he)); + else + hv_delete_ent(permittedloops, labelsv, 0, 0); } - return o; } /* -=for apidoc block_start +=for apidoc forbid_outofblock_ops -Handles compile-time scope entry. -Arranges for hints to be restored on block -exit and also handles pad sequence numbers to make lexical variables scope -right. Returns a savestack index for use with C. +Checks an optree that implements a block, to ensure there are no control-flow +ops that attempt to leave the block. Any C is forbidden, as is any +C. Loops are analysed, so any LOOPEX op (C, C or +C) that affects a loop that contains it within the block are +permitted, but those that do not are forbidden. + +If any of these forbidden constructions are detected, an exception is thrown +by using the op name and the blockname argument to construct a suitable +message. + +This function alone is not sufficient to ensure the optree does not perform +any of these forbidden activities during runtime, as it might call a different +function that performs a non-local LOOPEX, or a string-eval() that performs a +C, or various other things. It is intended purely as a compile-time +check for those that could be detected statically. Additional runtime checks +may be required depending on the circumstance it is used for. + +Note currently that I C ops are forbidden, even in cases where +they might otherwise be safe to execute. This may be permitted in a later +version. =cut */ -int -Perl_block_start(pTHX_ int full) +void +Perl_forbid_outofblock_ops(pTHX_ OP *o, const char *blockname) { - const int retval = PL_savestack_ix; + PERL_ARGS_ASSERT_FORBID_OUTOFBLOCK_OPS; - PL_compiling.cop_seq = PL_cop_seqmax; - COP_SEQMAX_INC; - pad_block_start(full); - SAVEHINTS(); - PL_hints &= ~HINT_BLOCK_SCOPE; - SAVECOMPILEWARNINGS(); - PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings); - SAVEI32(PL_compiling.cop_seq); - PL_compiling.cop_seq = 0; + ENTER; + SAVEVPTR(PL_curcop); - CALL_BLOCK_HOOKS(bhk_start, full); + HV *looplabels = newHV(); + SAVEFREESV((SV *)looplabels); - return retval; + HV *gotolabels = newHV(); + SAVEFREESV((SV *)gotolabels); + + walk_ops_find_labels(aTHX_ o, gotolabels); + + walk_ops_forbid(aTHX_ o, FORBID_LOOPEX_DEFAULT, looplabels, gotolabels, blockname); + + LEAVE; } +/* List constructors */ + /* -=for apidoc block_end +=for apidoc op_append_elem -Handles compile-time scope exit. C -is the savestack index returned by -C, and C is the body of the block. Returns the block, -possibly modified. +Append an item to the list of ops contained directly within a list-type +op, returning the lengthened list. C is the list-type op, +and C is the op to append to the list. C specifies the +intended opcode for the list. If C is not already a list of the +right type, it will be upgraded into one. If either C or C +is null, the other is returned unchanged. =cut */ -OP* -Perl_block_end(pTHX_ I32 floor, OP *seq) +OP * +Perl_op_append_elem(pTHX_ I32 type, OP *first, OP *last) { - const int needblockscope = PL_hints & HINT_BLOCK_SCOPE; - OP* retval = voidnonfinal(seq); - OP *o; - - /* XXX Is the null PL_parser check necessary here? */ - assert(PL_parser); /* Let’s find out under debugging builds. */ - if (PL_parser && PL_parser->parsed_sub) { - o = newSTATEOP(0, NULL, NULL); - op_null(o); - retval = op_append_elem(OP_LINESEQ, retval, o); - } - - CALL_BLOCK_HOOKS(bhk_pre_end, &retval); - - LEAVE_SCOPE(floor); - if (needblockscope) - PL_hints |= HINT_BLOCK_SCOPE; /* propagate out */ - o = pad_leavemy(); - - if (o) { - /* pad_leavemy has created a sequence of introcv ops for all my - subs declared in the block. We have to replicate that list with - clonecv ops, to deal with this situation: - - sub { - my sub s1; - my sub s2; - sub s1 { state sub foo { \&s2 } } - }->() + if (!first) + return last; - Originally, I was going to have introcv clone the CV and turn - off the stale flag. Since &s1 is declared before &s2, the - introcv op for &s1 is executed (on sub entry) before the one for - &s2. But the &foo sub inside &s1 (which is cloned when &s1 is - cloned, since it is a state sub) closes over &s2 and expects - to see it in its outer CV’s pad. If the introcv op clones &s1, - then &s2 is still marked stale. Since &s1 is not active, and - &foo closes over &s1’s implicit entry for &s2, we get a ‘Varia- - ble will not stay shared’ warning. Because it is the same stub - that will be used when the introcv op for &s2 is executed, clos- - ing over it is safe. Hence, we have to turn off the stale flag - on all lexical subs in the block before we clone any of them. - Hence, having introcv clone the sub cannot work. So we create a - list of ops like this: + if (!last) + return first; - lineseq - | - +-- introcv - | - +-- introcv - | - +-- introcv - | - . - . - . - | - +-- clonecv - | - +-- clonecv - | - +-- clonecv - | - . - . - . - */ - OP *kid = o->op_flags & OPf_KIDS ? cLISTOPo->op_first : o; - OP * const last = o->op_flags & OPf_KIDS ? cLISTOPo->op_last : o; - for (;; kid = OpSIBLING(kid)) { - OP *newkid = newOP(OP_CLONECV, 0); - newkid->op_targ = kid->op_targ; - o = op_append_elem(OP_LINESEQ, o, newkid); - if (kid == last) break; - } - retval = op_prepend_elem(OP_LINESEQ, o, retval); + if (first->op_type != (unsigned)type + || (type == OP_LIST && (first->op_flags & OPf_PARENS))) + { + return newLISTOP(type, 0, first, last); } - CALL_BLOCK_HOOKS(bhk_post_end, &retval); - - return retval; + op_sibling_splice(first, cLISTOPx(first)->op_last, 0, last); + first->op_flags |= OPf_KIDS; + return first; } /* -=for apidoc_section $scope - -=for apidoc blockhook_register +=for apidoc op_append_list -Register a set of hooks to be called when the Perl lexical scope changes -at compile time. See L. +Concatenate the lists of ops contained directly within two list-type ops, +returning the combined list. C and C are the list-type ops +to concatenate. C specifies the intended opcode for the list. +If either C or C is not already a list of the right type, +it will be upgraded into one. If either C or C is null, +the other is returned unchanged. =cut */ -void -Perl_blockhook_register(pTHX_ BHK *hk) +OP * +Perl_op_append_list(pTHX_ I32 type, OP *first, OP *last) { - PERL_ARGS_ASSERT_BLOCKHOOK_REGISTER; + if (!first) + return last; - Perl_av_create_and_push(aTHX_ &PL_blockhooks, newSViv(PTR2IV(hk))); -} + if (!last) + return first; -void -Perl_newPROG(pTHX_ OP *o) -{ - OP *start; + if (first->op_type != (unsigned)type) + return op_prepend_elem(type, first, last); - PERL_ARGS_ASSERT_NEWPROG; + if (last->op_type != (unsigned)type) + return op_append_elem(type, first, last); - if (PL_in_eval) { - PERL_CONTEXT *cx; - I32 i; - if (PL_eval_root) - return; - PL_eval_root = newUNOP(OP_LEAVEEVAL, - ((PL_in_eval & EVAL_KEEPERR) - ? OPf_SPECIAL : 0), o); + OpMORESIB_set(cLISTOPx(first)->op_last, cLISTOPx(last)->op_first); + cLISTOPx(first)->op_last = cLISTOPx(last)->op_last; + OpLASTSIB_set(cLISTOPx(first)->op_last, first); + first->op_flags |= (last->op_flags & OPf_KIDS); - cx = CX_CUR(); - assert(CxTYPE(cx) == CXt_EVAL); + S_op_destroy(aTHX_ last); - if ((cx->blk_gimme & G_WANT) == G_VOID) - scalarvoid(PL_eval_root); - else if ((cx->blk_gimme & G_WANT) == G_LIST) - list(PL_eval_root); - else - scalar(PL_eval_root); + return first; +} - start = op_linklist(PL_eval_root); - PL_eval_root->op_next = 0; - i = PL_savestack_ix; - SAVEFREEOP(o); - ENTER; - S_process_optree(aTHX_ NULL, PL_eval_root, start); - LEAVE; - PL_savestack_ix = i; - } - else { - if (o->op_type == OP_STUB) { - /* This block is entered if nothing is compiled for the main - program. This will be the case for an genuinely empty main - program, or one which only has BEGIN blocks etc, so already - run and freed. +/* +=for apidoc op_prepend_elem - Historically (5.000) the guard above was !o. However, commit - f8a08f7b8bd67b28 (Jun 2001), integrated to blead as - c71fccf11fde0068, changed perly.y so that newPROG() is now - called with the output of block_end(), which returns a new - OP_STUB for the case of an empty optree. ByteLoader (and - maybe other things) also take this path, because they set up - PL_main_start and PL_main_root directly, without generating an - optree. +Prepend an item to the list of ops contained directly within a list-type +op, returning the lengthened list. C is the op to prepend to the +list, and C is the list-type op. C specifies the intended +opcode for the list. If C is not already a list of the right type, +it will be upgraded into one. If either C or C is null, +the other is returned unchanged. - If the parsing the main program aborts (due to parse errors, - or due to BEGIN or similar calling exit), then newPROG() - isn't even called, and hence this code path and its cleanups - are skipped. This shouldn't make a make a difference: - * a non-zero return from perl_parse is a failure, and - perl_destruct() should be called immediately. - * however, if exit(0) is called during the parse, then - perl_parse() returns 0, and perl_run() is called. As - PL_main_start will be NULL, perl_run() will return - promptly, and the exit code will remain 0. - */ +=cut +*/ - PL_comppad_name = 0; - PL_compcv = 0; - S_op_destroy(aTHX_ o); - return; - } - PL_main_root = op_scope(sawparens(scalarvoid(o))); - PL_curcop = &PL_compiling; - start = LINKLIST(PL_main_root); - PL_main_root->op_next = 0; - S_process_optree(aTHX_ NULL, PL_main_root, start); - if (!PL_parser->error_count) - /* on error, leave CV slabbed so that ops left lying around - * will eb cleaned up. Else unslab */ - cv_forget_slab(PL_compcv); - PL_compcv = 0; +OP * +Perl_op_prepend_elem(pTHX_ I32 type, OP *first, OP *last) +{ + if (!first) + return last; - /* Register with debugger */ - if (PERLDB_INTER) { - CV * const cv = get_cvs("DB::postponed", 0); - if (cv) { - dSP; - PUSHMARK(SP); - XPUSHs(MUTABLE_SV(CopFILEGV(&PL_compiling))); - PUTBACK; - call_sv(MUTABLE_SV(cv), G_DISCARD); - } + if (!last) + return first; + + if (last->op_type == (unsigned)type) { + if (type == OP_LIST) { /* already a PUSHMARK there */ + /* insert 'first' after pushmark */ + op_sibling_splice(last, cLISTOPx(last)->op_first, 0, first); + if (!(first->op_flags & OPf_PARENS)) + last->op_flags &= ~OPf_PARENS; } + else + op_sibling_splice(last, NULL, 0, first); + last->op_flags |= OPf_KIDS; + return last; } + + return newLISTOP(type, 0, first, last); } -OP * -Perl_localize(pTHX_ OP *o, I32 lex) -{ - PERL_ARGS_ASSERT_LOCALIZE; +/* +=for apidoc op_convert_list - if (o->op_flags & OPf_PARENS) -/* [perl #17376]: this appears to be premature, and results in code such as - C< our(%x); > executing in list mode rather than void mode */ -#if 0 - list(o); -#else - NOOP; -#endif - else { - if ( PL_parser->bufptr > PL_parser->oldbufptr - && PL_parser->bufptr[-1] == ',' - && ckWARN(WARN_PARENTHESIS)) - { - char *s = PL_parser->bufptr; - bool sigil = FALSE; +Converts C into a list op if it is not one already, and then converts it +into the specified C, calling its check function, allocating a target if +it needs one, and folding constants. - /* some heuristics to detect a potential error */ - while (*s && (memCHRs(", \t\n", *s))) - s++; +A list-type op is usually constructed one kid at a time via C, +C and C. Then finally it is passed to +C to make it the right type. - while (1) { - if (*s && (memCHRs("@$%", *s) || (!lex && *s == '*')) - && *++s - && (isWORDCHAR(*s) || UTF8_IS_CONTINUED(*s))) { - s++; - sigil = TRUE; - while (*s && (isWORDCHAR(*s) || UTF8_IS_CONTINUED(*s))) - s++; - while (*s && (memCHRs(", \t\n", *s))) - s++; - } - else - break; - } - if (sigil && (*s == ';' || *s == '=')) { - Perl_warner(aTHX_ packWARN(WARN_PARENTHESIS), - "Parentheses missing around \"%s\" list", - lex - ? (PL_parser->in_my == KEY_our - ? "our" - : PL_parser->in_my == KEY_state - ? "state" - : "my") - : "local"); - } - } - } - if (lex) - o = my(o); - else - o = op_lvalue(o, OP_NULL); /* a bit kludgey */ - PL_parser->in_my = FALSE; - PL_parser->in_my_stash = NULL; - return o; -} +=cut +*/ OP * -Perl_jmaybe(pTHX_ OP *o) +Perl_op_convert_list(pTHX_ I32 type, I32 flags, OP *o) { - PERL_ARGS_ASSERT_JMAYBE; + if (type < 0) type = -type, flags |= OPf_SPECIAL; + if (type == OP_RETURN) { + if (FEATURE_MODULE_TRUE_IS_ENABLED) + flags |= OPf_SPECIAL; + } + if (!o || o->op_type != OP_LIST) + o = force_list(o, FALSE); + else + { + o->op_flags &= ~OPf_WANT; + o->op_private &= ~OPpLVAL_INTRO; + } - if (o->op_type == OP_LIST) { - if (FEATURE_MULTIDIMENSIONAL_IS_ENABLED) { - OP * const o2 - = newSVREF(newGVOP(OP_GV, 0, gv_fetchpvs(";", GV_ADD|GV_NOTQUAL, SVt_PV))); - o = op_convert_list(OP_JOIN, 0, op_prepend_elem(OP_LIST, o2, o)); - } - else { - /* If the user disables this, then a warning might not be enough to alert - them to a possible change of behaviour here, so throw an exception. - */ - yyerror("Multidimensional hash lookup is disabled"); + if (!(PL_opargs[type] & OA_MARK)) + op_null(cLISTOPo->op_first); + else { + OP * const kid2 = OpSIBLING(cLISTOPo->op_first); + if (kid2 && kid2->op_type == OP_COREARGS) { + op_null(cLISTOPo->op_first); + kid2->op_private |= OPpCOREARGS_PUSHMARK; } } - return o; -} -PERL_STATIC_INLINE OP * -S_op_std_init(pTHX_ OP *o) -{ - I32 type = o->op_type; + if (type != OP_SPLIT) + /* At this point o is a LISTOP, but OP_SPLIT is a PMOP; let + * ck_split() create a real PMOP and leave the op's type as listop + * for now. Otherwise op_free() etc will crash. + */ + OpTYPE_set(o, type); - PERL_ARGS_ASSERT_OP_STD_INIT; + o->op_flags |= flags; + if (flags & OPf_FOLDED) + o->op_folded = 1; - if (PL_opargs[type] & OA_RETSCALAR) - scalar(o); - if (PL_opargs[type] & OA_TARGET && !o->op_targ) - o->op_targ = pad_alloc(type, SVs_PADTMP); + o = CHECKOP(type, o); + if (o->op_type != (unsigned)type) + return o; - return o; + return fold_constants(op_integerize(op_std_init(o))); } -PERL_STATIC_INLINE OP * -S_op_integerize(pTHX_ OP *o) -{ - I32 type = o->op_type; +/* Constructors */ - PERL_ARGS_ASSERT_OP_INTEGERIZE; - /* integerize op. */ - if ((PL_opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER)) - { - o->op_ppaddr = PL_ppaddr[++(o->op_type)]; - } +/* +=for apidoc_section $optree_construction - if (type == OP_NEGATE) - /* XXX might want a ck_negate() for this */ - cUNOPo->op_first->op_private &= ~OPpCONST_STRICT; +=for apidoc newNULLLIST - return o; -} +Constructs, checks, and returns a new C op, which represents an +empty list expression. -/* This function exists solely to provide a scope to limit - setjmp/longjmp() messing with auto variables. It cannot be inlined because - it uses setjmp - */ -STATIC int -S_fold_constants_eval(pTHX) { - int ret = 0; - dJMPENV; +=cut +*/ - JMPENV_PUSH(ret); +OP * +Perl_newNULLLIST(pTHX) +{ + return newOP(OP_STUB, 0); +} - if (ret == 0) { - CALLRUNOPS(aTHX); +/* promote o and any siblings to be a list if its not already; i.e. + * + * o - A - B + * + * becomes + * + * list + * | + * pushmark - o - A - B + * + * If nullit it true, the list op is nulled. + */ + +static OP * +S_force_list(pTHX_ OP *o, bool nullit) +{ + if (!o || o->op_type != OP_LIST) { + OP *rest = NULL; + if (o) { + /* manually detach any siblings then add them back later */ + rest = OpSIBLING(o); + OpLASTSIB_set(o, NULL); + } + o = newLISTOP(OP_LIST, 0, o, NULL); + if (rest) + op_sibling_splice(o, cLISTOPo->op_last, 0, rest); } + if (nullit) + op_null(o); + return o; +} - JMPENV_POP; +/* +=for apidoc op_force_list - return ret; +Promotes o and any siblings to be an C if it is not already. If +a new C op was created, its first child will be C. +The returned node itself will be nulled, leaving only its children. + +This is often what you want to do before putting the optree into list +context; as + + o = op_contextualize(op_force_list(o), G_LIST); + +=cut +*/ + +OP * +Perl_op_force_list(pTHX_ OP *o) +{ + return force_list(o, TRUE); } -static OP * -S_fold_constants(pTHX_ OP *const o) +/* +=for apidoc newLISTOP + +Constructs, checks, and returns an op of any list type. C is +the opcode. C gives the eight bits of C, except that +C will be set automatically if required. C and C +supply up to two ops to be direct children of the list op; they are +consumed by this function and become part of the constructed op tree. + +For most list operators, the check function expects all the kid ops to be +present already, so calling C (e.g.) is not +appropriate. What you want to do in that case is create an op of type +C, append more children to it, and then call L. +See L for more information. + +=cut +*/ + +OP * +Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last) { - OP *curop; - OP *newop; - I32 type = o->op_type; - bool is_stringify; - SV *sv = NULL; - int ret = 0; - OP *old_next; - SV * const oldwarnhook = PL_warnhook; - SV * const olddiehook = PL_diehook; - COP not_compiling; - U8 oldwarn = PL_dowarn; - I32 old_cxix; + LISTOP *listop; + /* Note that allocating an OP_PUSHMARK can die under Safe.pm if + * pushmark is banned. So do it now while existing ops are in a + * consistent state, in case they suddenly get freed */ + OP* const pushop = type == OP_LIST ? newOP(OP_PUSHMARK, 0) : NULL; - PERL_ARGS_ASSERT_FOLD_CONSTANTS; + assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LISTOP + || type == OP_CUSTOM); - if (!(PL_opargs[type] & OA_FOLDCONST)) - goto nope; + NewOp(1101, listop, 1, LISTOP); + OpTYPE_set(listop, type); + if (first || last) + flags |= OPf_KIDS; + listop->op_flags = (U8)flags; - switch (type) { - case OP_UCFIRST: - case OP_LCFIRST: - case OP_UC: - case OP_LC: - case OP_FC: -#ifdef USE_LOCALE_CTYPE - if (IN_LC_COMPILETIME(LC_CTYPE)) - goto nope; -#endif - break; - case OP_SLT: - case OP_SGT: - case OP_SLE: - case OP_SGE: - case OP_SCMP: -#ifdef USE_LOCALE_COLLATE - if (IN_LC_COMPILETIME(LC_COLLATE)) - goto nope; -#endif - break; - case OP_SPRINTF: - /* XXX what about the numeric ops? */ -#ifdef USE_LOCALE_NUMERIC - if (IN_LC_COMPILETIME(LC_NUMERIC)) - goto nope; -#endif - break; - case OP_PACK: - if (!OpHAS_SIBLING(cLISTOPo->op_first) - || OpSIBLING(cLISTOPo->op_first)->op_type != OP_CONST) - goto nope; - { - SV * const sv = cSVOPx_sv(OpSIBLING(cLISTOPo->op_first)); - if (!SvPOK(sv) || SvGMAGICAL(sv)) goto nope; - { - const char *s = SvPVX_const(sv); - while (s < SvEND(sv)) { - if (isALPHA_FOLD_EQ(*s, 'p')) goto nope; - s++; - } - } - } - break; - case OP_REPEAT: - if (o->op_private & OPpREPEAT_DOLIST) goto nope; - break; - case OP_SREFGEN: - if (cUNOPx(cUNOPo->op_first)->op_first->op_type != OP_CONST - || SvPADTMP(cSVOPx_sv(cUNOPx(cUNOPo->op_first)->op_first))) - goto nope; + if (!last && first) + last = first; + else if (!first && last) + first = last; + else if (first) + OpMORESIB_set(first, last); + listop->op_first = first; + listop->op_last = last; + + if (pushop) { + OpMORESIB_set(pushop, first); + listop->op_first = pushop; + listop->op_flags |= OPf_KIDS; + if (!last) + listop->op_last = pushop; } + if (listop->op_last) + OpLASTSIB_set(listop->op_last, (OP*)listop); - if (PL_parser && PL_parser->error_count) - goto nope; /* Don't try to run w/ errors */ + return CHECKOP(type, listop); +} - for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) { - switch (curop->op_type) { - case OP_CONST: - if ( (curop->op_private & OPpCONST_BARE) - && (curop->op_private & OPpCONST_STRICT)) { - no_bareword_allowed(curop); - goto nope; - } - /* FALLTHROUGH */ - case OP_LIST: - case OP_SCALAR: - case OP_NULL: - case OP_PUSHMARK: - /* Foldable; move to next op in list */ - break; +/* +=for apidoc newOP - default: - /* No other op types are considered foldable */ - goto nope; - } +Constructs, checks, and returns an op of any base type (any type that +has no extra fields). C is the opcode. C gives the +eight bits of C, and, shifted up eight bits, the eight bits +of C. + +=cut +*/ + +OP * +Perl_newOP(pTHX_ I32 type, I32 flags) +{ + OP *o; + + if (type == -OP_ENTEREVAL) { + type = OP_ENTEREVAL; + flags |= OPpEVAL_BYTES<<8; } - curop = LINKLIST(o); - old_next = o->op_next; - o->op_next = 0; - PL_op = curop; + assert((PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP + || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP + || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP + || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP); - old_cxix = cxstack_ix; - create_eval_scope(NULL, G_FAKINGEVAL); + NewOp(1101, o, 1, OP); + OpTYPE_set(o, type); + o->op_flags = (U8)flags; - /* Verify that we don't need to save it: */ - assert(PL_curcop == &PL_compiling); - StructCopy(&PL_compiling, ¬_compiling, COP); - PL_curcop = ¬_compiling; - /* The above ensures that we run with all the correct hints of the - currently compiling COP, but that IN_PERL_RUNTIME is true. */ - assert(IN_PERL_RUNTIME); - PL_warnhook = PERL_WARNHOOK_FATAL; - PL_diehook = NULL; + o->op_next = o; + o->op_private = (U8)(0 | (flags >> 8)); + if (PL_opargs[type] & OA_RETSCALAR) + scalar(o); + if (PL_opargs[type] & OA_TARGET) + o->op_targ = pad_alloc(type, SVs_PADTMP); + return CHECKOP(type, o); +} - /* Effective $^W=1. */ - if ( ! (PL_dowarn & G_WARN_ALL_MASK)) - PL_dowarn |= G_WARN_ON; +/* +=for apidoc newUNOP - ret = S_fold_constants_eval(aTHX); +Constructs, checks, and returns an op of any unary type. C is +the opcode. C gives the eight bits of C, except that +C will be set automatically if required, and, shifted up eight +bits, the eight bits of C, except that the bit with value 1 +is automatically set. C supplies an optional op to be the direct +child of the unary op; it is consumed by this function and become part +of the constructed op tree. - switch (ret) { - case 0: - sv = *(PL_stack_sp--); - if (o->op_targ && sv == PAD_SV(o->op_targ)) { /* grab pad temp? */ - pad_swipe(o->op_targ, FALSE); - } - else if (SvTEMP(sv)) { /* grab mortal temp? */ - SvREFCNT_inc_simple_void(sv); - SvTEMP_off(sv); - } - else { assert(SvIMMORTAL(sv)); } - break; - case 3: - /* Something tried to die. Abandon constant folding. */ - /* Pretend the error never happened. */ - CLEAR_ERRSV(); - o->op_next = old_next; - break; - default: - /* Don't expect 1 (setjmp failed) or 2 (something called my_exit) */ - PL_warnhook = oldwarnhook; - PL_diehook = olddiehook; - /* XXX note that this croak may fail as we've already blown away - * the stack - eg any nested evals */ - Perl_croak(aTHX_ "panic: fold_constants JMPENV_PUSH returned %d", ret); - } - PL_dowarn = oldwarn; - PL_warnhook = oldwarnhook; - PL_diehook = olddiehook; - PL_curcop = &PL_compiling; - - /* if we croaked, depending on how we croaked the eval scope - * may or may not have already been popped */ - if (cxstack_ix > old_cxix) { - assert(cxstack_ix == old_cxix + 1); - assert(CxTYPE(CX_CUR()) == CXt_EVAL); - delete_eval_scope(); - } - if (ret) - goto nope; - - /* OP_STRINGIFY and constant folding are used to implement qq. - Here the constant folding is an implementation detail that we - want to hide. If the stringify op is itself already marked - folded, however, then it is actually a folded join. */ - is_stringify = type == OP_STRINGIFY && !o->op_folded; - op_free(o); - assert(sv); - if (is_stringify) - SvPADTMP_off(sv); - else if (!SvIMMORTAL(sv)) { - SvPADTMP_on(sv); - SvREADONLY_on(sv); - } - newop = newSVOP(OP_CONST, 0, MUTABLE_SV(sv)); - if (!is_stringify) newop->op_folded = 1; - return newop; - - nope: - return o; -} +=for apidoc Amnh||OPf_KIDS -/* convert a constant range in list context into an OP_RV2AV, OP_CONST pair; - * the constant value being an AV holding the flattened range. - */ +=cut +*/ -static void -S_gen_constant_list(pTHX_ OP *o) +OP * +Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first) { - OP *curop, *old_next; - SV * const oldwarnhook = PL_warnhook; - SV * const olddiehook = PL_diehook; - COP *old_curcop; - U8 oldwarn = PL_dowarn; - SV **svp; - AV *av; - I32 old_cxix; - COP not_compiling; - int ret = 0; - dJMPENV; - bool op_was_null; - - list(o); - if (PL_parser && PL_parser->error_count) - return; /* Don't attempt to run with errors */ - - curop = LINKLIST(o); - old_next = o->op_next; - o->op_next = 0; - op_was_null = o->op_type == OP_NULL; - if (op_was_null) /* b3698342565fb462291fba4b432cfcd05b6eb4e1 */ - o->op_type = OP_CUSTOM; - CALL_PEEP(curop); - if (op_was_null) - o->op_type = OP_NULL; - S_prune_chain_head(&curop); - PL_op = curop; - - old_cxix = cxstack_ix; - create_eval_scope(NULL, G_FAKINGEVAL); - - old_curcop = PL_curcop; - StructCopy(old_curcop, ¬_compiling, COP); - PL_curcop = ¬_compiling; - /* The above ensures that we run with all the correct hints of the - current COP, but that IN_PERL_RUNTIME is true. */ - assert(IN_PERL_RUNTIME); - PL_warnhook = PERL_WARNHOOK_FATAL; - PL_diehook = NULL; - JMPENV_PUSH(ret); - - /* Effective $^W=1. */ - if ( ! (PL_dowarn & G_WARN_ALL_MASK)) - PL_dowarn |= G_WARN_ON; + UNOP *unop; - switch (ret) { - case 0: -#if defined DEBUGGING && !defined DEBUGGING_RE_ONLY - PL_curstackinfo->si_stack_hwm = 0; /* stop valgrind complaining */ -#endif - Perl_pp_pushmark(aTHX); - CALLRUNOPS(aTHX); - PL_op = curop; - assert (!(curop->op_flags & OPf_SPECIAL)); - assert(curop->op_type == OP_RANGE); - Perl_pp_anonlist(aTHX); - break; - case 3: - CLEAR_ERRSV(); - o->op_next = old_next; - break; - default: - JMPENV_POP; - PL_warnhook = oldwarnhook; - PL_diehook = olddiehook; - Perl_croak(aTHX_ "panic: gen_constant_list JMPENV_PUSH returned %d", - ret); + if (type == -OP_ENTEREVAL) { + type = OP_ENTEREVAL; + flags |= OPpEVAL_BYTES<<8; } - JMPENV_POP; - PL_dowarn = oldwarn; - PL_warnhook = oldwarnhook; - PL_diehook = olddiehook; - PL_curcop = old_curcop; - - if (cxstack_ix > old_cxix) { - assert(cxstack_ix == old_cxix + 1); - assert(CxTYPE(CX_CUR()) == CXt_EVAL); - delete_eval_scope(); - } - if (ret) - return; + assert((PL_opargs[type] & OA_CLASS_MASK) == OA_UNOP + || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP + || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP + || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP + || type == OP_SASSIGN + || type == OP_ENTERTRY + || type == OP_ENTERTRYCATCH + || type == OP_CUSTOM + || type == OP_NULL ); - OpTYPE_set(o, OP_RV2AV); - o->op_flags &= ~OPf_REF; /* treat \(1..2) like an ordinary list */ - o->op_flags |= OPf_PARENS; /* and flatten \(1..2,3) */ - o->op_opt = 0; /* needs to be revisited in rpeep() */ - av = (AV *)SvREFCNT_inc_NN(*PL_stack_sp--); + if (!first) + first = newOP(OP_STUB, 0); + if (PL_opargs[type] & OA_MARK) + first = op_force_list(first); - /* replace subtree with an OP_CONST */ - curop = ((UNOP*)o)->op_first; - op_sibling_splice(o, NULL, -1, newSVOP(OP_CONST, 0, (SV *)av)); - op_free(curop); + NewOp(1101, unop, 1, UNOP); + OpTYPE_set(unop, type); + unop->op_first = first; + unop->op_flags = (U8)(flags | OPf_KIDS); + unop->op_private = (U8)(1 | (flags >> 8)); - if (AvFILLp(av) != -1) - for (svp = AvARRAY(av) + AvFILLp(av); svp >= AvARRAY(av); --svp) - { - SvPADTMP_on(*svp); - SvREADONLY_on(*svp); - } - LINKLIST(o); - list(o); - return; -} + if (!OpHAS_SIBLING(first)) /* true unless weird syntax error */ + OpLASTSIB_set(first, (OP*)unop); -/* -=for apidoc_section $optree_manipulation -*/ + unop = (UNOP*) CHECKOP(type, unop); + if (unop->op_next) + return (OP*)unop; -/* List constructors */ + return fold_constants(op_integerize(op_std_init((OP *) unop))); +} /* -=for apidoc op_append_elem +=for apidoc newUNOP_AUX -Append an item to the list of ops contained directly within a list-type -op, returning the lengthened list. C is the list-type op, -and C is the op to append to the list. C specifies the -intended opcode for the list. If C is not already a list of the -right type, it will be upgraded into one. If either C or C -is null, the other is returned unchanged. +Similar to C, but creates an C struct instead, with C +initialised to C =cut */ OP * -Perl_op_append_elem(pTHX_ I32 type, OP *first, OP *last) +Perl_newUNOP_AUX(pTHX_ I32 type, I32 flags, OP *first, UNOP_AUX_item *aux) { - if (!first) - return last; + UNOP_AUX *unop; - if (!last) - return first; + assert((PL_opargs[type] & OA_CLASS_MASK) == OA_UNOP_AUX + || type == OP_CUSTOM); - if (first->op_type != (unsigned)type - || (type == OP_LIST && (first->op_flags & OPf_PARENS))) - { - return newLISTOP(type, 0, first, last); - } + NewOp(1101, unop, 1, UNOP_AUX); + unop->op_type = (OPCODE)type; + unop->op_ppaddr = PL_ppaddr[type]; + unop->op_first = first; + unop->op_flags = (U8)(flags | (first ? OPf_KIDS : 0)); + unop->op_private = (U8)((first ? 1 : 0) | (flags >> 8)); + unop->op_aux = aux; - op_sibling_splice(first, ((LISTOP*)first)->op_last, 0, last); - first->op_flags |= OPf_KIDS; - return first; + if (first && !OpHAS_SIBLING(first)) /* true unless weird syntax error */ + OpLASTSIB_set(first, (OP*)unop); + + unop = (UNOP_AUX*) CHECKOP(type, unop); + + return op_std_init((OP *) unop); } /* -=for apidoc op_append_list +=for apidoc newMETHOP -Concatenate the lists of ops contained directly within two list-type ops, -returning the combined list. C and C are the list-type ops -to concatenate. C specifies the intended opcode for the list. -If either C or C is not already a list of the right type, -it will be upgraded into one. If either C or C is null, -the other is returned unchanged. +Constructs, checks, and returns an op of method type with a method name +evaluated at runtime. C is the opcode. C gives the eight +bits of C, except that C will be set automatically, +and, shifted up eight bits, the eight bits of C, except that +the bit with value 1 is automatically set. C supplies an +op which evaluates method name; it is consumed by this function and +become part of the constructed op tree. +Supported optypes: C. =cut */ -OP * -Perl_op_append_list(pTHX_ I32 type, OP *first, OP *last) -{ - if (!first) - return last; +static OP* +S_newMETHOP_internal(pTHX_ I32 type, I32 flags, OP* dynamic_meth, SV* const_meth) { + METHOP *methop; - if (!last) - return first; + assert((PL_opargs[type] & OA_CLASS_MASK) == OA_METHOP + || type == OP_CUSTOM); - if (first->op_type != (unsigned)type) - return op_prepend_elem(type, first, last); + NewOp(1101, methop, 1, METHOP); + if (dynamic_meth) { + if (PL_opargs[type] & OA_MARK) dynamic_meth = op_force_list(dynamic_meth); + methop->op_flags = (U8)(flags | OPf_KIDS); + methop->op_u.op_first = dynamic_meth; + methop->op_private = (U8)(1 | (flags >> 8)); - if (last->op_type != (unsigned)type) - return op_append_elem(type, first, last); + if (!OpHAS_SIBLING(dynamic_meth)) + OpLASTSIB_set(dynamic_meth, (OP*)methop); + } + else { + assert(const_meth); + methop->op_flags = (U8)(flags & ~OPf_KIDS); + methop->op_u.op_meth_sv = const_meth; + methop->op_private = (U8)(0 | (flags >> 8)); + methop->op_next = (OP*)methop; + } - OpMORESIB_set(((LISTOP*)first)->op_last, ((LISTOP*)last)->op_first); - ((LISTOP*)first)->op_last = ((LISTOP*)last)->op_last; - OpLASTSIB_set(((LISTOP*)first)->op_last, first); - first->op_flags |= (last->op_flags & OPf_KIDS); +#ifdef USE_ITHREADS + methop->op_rclass_targ = 0; +#else + methop->op_rclass_sv = NULL; +#endif - S_op_destroy(aTHX_ last); + OpTYPE_set(methop, type); + return CHECKOP(type, methop); +} - return first; +OP * +Perl_newMETHOP (pTHX_ I32 type, I32 flags, OP* dynamic_meth) { + PERL_ARGS_ASSERT_NEWMETHOP; + return newMETHOP_internal(type, flags, dynamic_meth, NULL); } /* -=for apidoc op_prepend_elem +=for apidoc newMETHOP_named -Prepend an item to the list of ops contained directly within a list-type -op, returning the lengthened list. C is the op to prepend to the -list, and C is the list-type op. C specifies the intended -opcode for the list. If C is not already a list of the right type, -it will be upgraded into one. If either C or C is null, -the other is returned unchanged. +Constructs, checks, and returns an op of method type with a constant +method name. C is the opcode. C gives the eight bits of +C, and, shifted up eight bits, the eight bits of +C. C supplies a constant method name; +it must be a shared COW string. +Supported optypes: C. =cut */ OP * -Perl_op_prepend_elem(pTHX_ I32 type, OP *first, OP *last) -{ - if (!first) - return last; - - if (!last) - return first; - - if (last->op_type == (unsigned)type) { - if (type == OP_LIST) { /* already a PUSHMARK there */ - /* insert 'first' after pushmark */ - op_sibling_splice(last, cLISTOPx(last)->op_first, 0, first); - if (!(first->op_flags & OPf_PARENS)) - last->op_flags &= ~OPf_PARENS; - } - else - op_sibling_splice(last, NULL, 0, first); - last->op_flags |= OPf_KIDS; - return last; - } - - return newLISTOP(type, 0, first, last); +Perl_newMETHOP_named (pTHX_ I32 type, I32 flags, SV* const_meth) { + PERL_ARGS_ASSERT_NEWMETHOP_NAMED; + return newMETHOP_internal(type, flags, NULL, const_meth); } /* -=for apidoc op_convert_list - -Converts C into a list op if it is not one already, and then converts it -into the specified C, calling its check function, allocating a target if -it needs one, and folding constants. +=for apidoc newBINOP -A list-type op is usually constructed one kid at a time via C, -C and C. Then finally it is passed to -C to make it the right type. +Constructs, checks, and returns an op of any binary type. C +is the opcode. C gives the eight bits of C, except +that C will be set automatically, and, shifted up eight bits, +the eight bits of C, except that the bit with value 1 or +2 is automatically set as required. C and C supply up to +two ops to be the direct children of the binary op; they are consumed +by this function and become part of the constructed op tree. =cut */ OP * -Perl_op_convert_list(pTHX_ I32 type, I32 flags, OP *o) +Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last) { - if (type < 0) type = -type, flags |= OPf_SPECIAL; - if (!o || o->op_type != OP_LIST) - o = force_list(o, FALSE); - else - { - o->op_flags &= ~OPf_WANT; - o->op_private &= ~OPpLVAL_INTRO; - } + BINOP *binop; - if (!(PL_opargs[type] & OA_MARK)) - op_null(cLISTOPo->op_first); + ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP + || type == OP_NULL || type == OP_CUSTOM); + + NewOp(1101, binop, 1, BINOP); + + if (!first) + first = newOP(OP_NULL, 0); + + OpTYPE_set(binop, type); + binop->op_first = first; + binop->op_flags = (U8)(flags | OPf_KIDS); + if (!last) { + last = first; + binop->op_private = (U8)(1 | (flags >> 8)); + } else { - OP * const kid2 = OpSIBLING(cLISTOPo->op_first); - if (kid2 && kid2->op_type == OP_COREARGS) { - op_null(cLISTOPo->op_first); - kid2->op_private |= OPpCOREARGS_PUSHMARK; - } + binop->op_private = (U8)(2 | (flags >> 8)); + OpMORESIB_set(first, last); } - if (type != OP_SPLIT) - /* At this point o is a LISTOP, but OP_SPLIT is a PMOP; let - * ck_split() create a real PMOP and leave the op's type as listop - * for now. Otherwise op_free() etc will crash. - */ - OpTYPE_set(o, type); + if (!OpHAS_SIBLING(last)) /* true unless weird syntax error */ + OpLASTSIB_set(last, (OP*)binop); - o->op_flags |= flags; - if (flags & OPf_FOLDED) - o->op_folded = 1; + binop->op_last = OpSIBLING(binop->op_first); + if (binop->op_last) + OpLASTSIB_set(binop->op_last, (OP*)binop); - o = CHECKOP(type, o); - if (o->op_type != (unsigned)type) - return o; + binop = (BINOP*) CHECKOP(type, binop); + if (binop->op_next || binop->op_type != (OPCODE)type) + return (OP*)binop; - return fold_constants(op_integerize(op_std_init(o))); + return fold_constants(op_integerize(op_std_init((OP *)binop))); } -/* Constructors */ +void +Perl_invmap_dump(pTHX_ SV* invlist, UV *map) +{ + const char indent[] = " "; + UV len = _invlist_len(invlist); + UV * array = invlist_array(invlist); + UV i; -/* -=for apidoc_section $optree_construction + PERL_ARGS_ASSERT_INVMAP_DUMP; -=for apidoc newNULLLIST + for (i = 0; i < len; i++) { + UV start = array[i]; + UV end = (i + 1 < len) ? array[i+1] - 1 : IV_MAX; -Constructs, checks, and returns a new C op, which represents an -empty list expression. + PerlIO_printf(Perl_debug_log, "%s[%" UVuf "] 0x%04" UVXf, indent, i, start); + if (end == IV_MAX) { + PerlIO_printf(Perl_debug_log, " .. INFTY"); + } + else if (end != start) { + PerlIO_printf(Perl_debug_log, " .. 0x%04" UVXf, end); + } + else { + PerlIO_printf(Perl_debug_log, " "); + } -=cut -*/ + PerlIO_printf(Perl_debug_log, "\t"); -OP * -Perl_newNULLLIST(pTHX) -{ - return newOP(OP_STUB, 0); + if (map[i] == TR_UNLISTED) { + PerlIO_printf(Perl_debug_log, "TR_UNLISTED\n"); + } + else if (map[i] == TR_SPECIAL_HANDLING) { + PerlIO_printf(Perl_debug_log, "TR_SPECIAL_HANDLING\n"); + } + else { + PerlIO_printf(Perl_debug_log, "0x%04" UVXf "\n", map[i]); + } + } } -/* promote o and any siblings to be a list if its not already; i.e. - * - * o - A - B - * - * becomes - * - * list - * | - * pushmark - o - A - B - * - * If nullit it true, the list op is nulled. +/* Given an OP_TRANS / OP_TRANSR op o, plus OP_CONST ops expr and repl + * containing the search and replacement strings, assemble into + * a translation table attached as o->op_pv. + * Free expr and repl. + * It expects the toker to have already set the + * OPpTRANS_COMPLEMENT + * OPpTRANS_SQUASH + * OPpTRANS_DELETE + * flags as appropriate; this function may add + * OPpTRANS_USE_SVOP + * OPpTRANS_CAN_FORCE_UTF8 + * OPpTRANS_IDENTICAL + * OPpTRANS_GROWS + * flags */ static OP * -S_force_list(pTHX_ OP *o, bool nullit) +S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl) { - if (!o || o->op_type != OP_LIST) { - OP *rest = NULL; - if (o) { - /* manually detach any siblings then add them back later */ - rest = OpSIBLING(o); - OpLASTSIB_set(o, NULL); - } - o = newLISTOP(OP_LIST, 0, o, NULL); - if (rest) - op_sibling_splice(o, cLISTOPo->op_last, 0, rest); - } - if (nullit) - op_null(o); - return o; -} - -/* -=for apidoc newLISTOP - -Constructs, checks, and returns an op of any list type. C is -the opcode. C gives the eight bits of C, except that -C will be set automatically if required. C and C -supply up to two ops to be direct children of the list op; they are -consumed by this function and become part of the constructed op tree. - -For most list operators, the check function expects all the kid ops to be -present already, so calling C (e.g.) is not -appropriate. What you want to do in that case is create an op of type -C, append more children to it, and then call L. -See L for more information. - + /* This function compiles a tr///, from data gathered from toke.c, into a + * form suitable for use by do_trans() in doop.c at runtime. + * + * It first normalizes the data, while discarding extraneous inputs; then + * writes out the compiled data. The normalization allows for complete + * analysis, and avoids some false negatives and positives earlier versions + * of this code had. + * + * The normalization form is an inversion map (described below in detail). + * This is essentially the compiled form for tr///'s that require UTF-8, + * and its easy to use it to write the 257-byte table for tr///'s that + * don't need UTF-8. That table is identical to what's been in use for + * many perl versions, except that it doesn't handle some edge cases that + * it used to, involving code points above 255. The UTF-8 form now handles + * these. (This could be changed with extra coding should it shown to be + * desirable.) + * + * If the complement (/c) option is specified, the lhs string (tstr) is + * parsed into an inversion list. Complementing these is trivial. Then a + * complemented tstr is built from that, and used thenceforth. This hides + * the fact that it was complemented from almost all successive code. + * + * One of the important characteristics to know about the input is whether + * the transliteration may be done in place, or does a temporary need to be + * allocated, then copied. If the replacement for every character in every + * possible string takes up no more bytes than the character it + * replaces, then it can be edited in place. Otherwise the replacement + * could overwrite a byte we are about to read, depending on the strings + * being processed. The comments and variable names here refer to this as + * "growing". Some inputs won't grow, and might even shrink under /d, but + * some inputs could grow, so we have to assume any given one might grow. + * On very long inputs, the temporary could eat up a lot of memory, so we + * want to avoid it if possible. For non-UTF-8 inputs, everything is + * single-byte, so can be edited in place, unless there is something in the + * pattern that could force it into UTF-8. The inversion map makes it + * feasible to determine this. Previous versions of this code pretty much + * punted on determining if UTF-8 could be edited in place. Now, this code + * is rigorous in making that determination. + * + * Another characteristic we need to know is whether the lhs and rhs are + * identical. If so, and no other flags are present, the only effect of + * the tr/// is to count the characters present in the input that are + * mentioned in the lhs string. The implementation of that is easier and + * runs faster than the more general case. Normalizing here allows for + * accurate determination of this. Previously there were false negatives + * possible. + * + * Instead of 'transliterated', the comments here use 'unmapped' for the + * characters that are left unchanged by the operation; otherwise they are + * 'mapped' + * + * The lhs of the tr/// is here referred to as the t side. + * The rhs of the tr/// is here referred to as the r side. + */ -=cut -*/ + SV * const tstr = cSVOPx(expr)->op_sv; + SV * const rstr = cSVOPx(repl)->op_sv; + STRLEN tlen; + STRLEN rlen; + const U8 * t0 = (U8*)SvPV_const(tstr, tlen); + const U8 * r0 = (U8*)SvPV_const(rstr, rlen); + const U8 * t = t0; + const U8 * r = r0; + UV t_count = 0, r_count = 0; /* Number of characters in search and + replacement lists */ -OP * -Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last) -{ - LISTOP *listop; - /* Note that allocating an OP_PUSHMARK can die under Safe.pm if - * pushmark is banned. So do it now while existing ops are in a - * consistent state, in case they suddenly get freed */ - OP* const pushop = type == OP_LIST ? newOP(OP_PUSHMARK, 0) : NULL; + /* khw thinks some of the private flags for this op are quaintly named. + * OPpTRANS_GROWS for example is TRUE if the replacement for some lhs + * character when represented in UTF-8 is longer than the original + * character's UTF-8 representation */ + const bool complement = cBOOL(o->op_private & OPpTRANS_COMPLEMENT); + const bool squash = cBOOL(o->op_private & OPpTRANS_SQUASH); + const bool del = cBOOL(o->op_private & OPpTRANS_DELETE); - assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LISTOP - || type == OP_CUSTOM); + /* Set to true if there is some character < 256 in the lhs that maps to + * above 255. If so, a non-UTF-8 match string can be forced into being in + * UTF-8 by a tr/// operation. */ + bool can_force_utf8 = FALSE; - NewOp(1101, listop, 1, LISTOP); - OpTYPE_set(listop, type); - if (first || last) - flags |= OPf_KIDS; - listop->op_flags = (U8)flags; + /* What is the maximum expansion factor in UTF-8 transliterations. If a + * 2-byte UTF-8 encoded character is to be replaced by a 3-byte one, its + * expansion factor is 1.5. This number is used at runtime to calculate + * how much space to allocate for non-inplace transliterations. Without + * this number, the worst case is 14, which is extremely unlikely to happen + * in real life, and could require significant memory overhead. */ + NV max_expansion = 1.; - if (!last && first) - last = first; - else if (!first && last) - first = last; - else if (first) - OpMORESIB_set(first, last); - listop->op_first = first; - listop->op_last = last; + UV t_range_count, r_range_count, min_range_count; + UV* t_array; + SV* t_invlist; + UV* r_map; + UV r_cp = 0, t_cp = 0; + UV t_cp_end = (UV) -1; + UV r_cp_end; + Size_t len; + AV* invmap; + UV final_map = TR_UNLISTED; /* The final character in the replacement + list, updated as we go along. Initialize + to something illegal */ - if (pushop) { - OpMORESIB_set(pushop, first); - listop->op_first = pushop; - listop->op_flags |= OPf_KIDS; - if (!last) - listop->op_last = pushop; - } - if (listop->op_last) - OpLASTSIB_set(listop->op_last, (OP*)listop); + bool rstr_utf8 = cBOOL(SvUTF8(rstr)); + bool tstr_utf8 = cBOOL(SvUTF8(tstr)); - return CHECKOP(type, listop); -} + const U8* tend = t + tlen; + const U8* rend = r + rlen; -/* -=for apidoc newOP + SV * inverted_tstr = NULL; -Constructs, checks, and returns an op of any base type (any type that -has no extra fields). C is the opcode. C gives the -eight bits of C, and, shifted up eight bits, the eight bits -of C. + Size_t i; + unsigned int pass2; -=cut -*/ + /* This routine implements detection of a transliteration having a longer + * UTF-8 representation than its source, by partitioning all the possible + * code points of the platform into equivalence classes of the same UTF-8 + * byte length in the first pass. As it constructs the mappings, it carves + * these up into smaller chunks, but doesn't merge any together. This + * makes it easy to find the instances it's looking for. A second pass is + * done after this has been determined which merges things together to + * shrink the table for runtime. The table below is used for both ASCII + * and EBCDIC platforms. On EBCDIC, the byte length is not monotonically + * increasing for code points below 256. To correct for that, the macro + * CP_ADJUST defined below converts those code points to ASCII in the first + * pass, and we use the ASCII partition values. That works because the + * growth factor will be unaffected, which is all that is calculated during + * the first pass. */ + UV PL_partition_by_byte_length[] = { + 0, + 0x80, /* Below this is 1 byte representations */ + (32 * (1UL << ( UTF_ACCUMULATION_SHIFT))), /* 2 bytes below this */ + (16 * (1UL << (2 * UTF_ACCUMULATION_SHIFT))), /* 3 bytes below this */ + ( 8 * (1UL << (3 * UTF_ACCUMULATION_SHIFT))), /* 4 bytes below this */ + ( 4 * (1UL << (4 * UTF_ACCUMULATION_SHIFT))), /* 5 bytes below this */ + ( 2 * (1UL << (5 * UTF_ACCUMULATION_SHIFT))) /* 6 bytes below this */ -OP * -Perl_newOP(pTHX_ I32 type, I32 flags) -{ - OP *o; +# ifdef UV_IS_QUAD + , + ( ((UV) 1U << (6 * UTF_ACCUMULATION_SHIFT))) /* 7 bytes below this */ +# endif - if (type == -OP_ENTEREVAL) { - type = OP_ENTEREVAL; - flags |= OPpEVAL_BYTES<<8; - } + }; - assert((PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP - || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP - || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP - || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP); + PERL_ARGS_ASSERT_PMTRANS; - NewOp(1101, o, 1, OP); - OpTYPE_set(o, type); - o->op_flags = (U8)flags; + PL_hints |= HINT_BLOCK_SCOPE; - o->op_next = o; - o->op_private = (U8)(0 | (flags >> 8)); - if (PL_opargs[type] & OA_RETSCALAR) - scalar(o); - if (PL_opargs[type] & OA_TARGET) - o->op_targ = pad_alloc(type, SVs_PADTMP); - return CHECKOP(type, o); -} + /* If /c, the search list is sorted and complemented. This is now done by + * creating an inversion list from it, and then trivially inverting that. + * The previous implementation used qsort, but creating the list + * automatically keeps it sorted as we go along */ + if (complement) { + UV start, end; + SV * inverted_tlist = _new_invlist(tlen); + Size_t temp_len; -/* -=for apidoc newUNOP + DEBUG_y(PerlIO_printf(Perl_debug_log, + "%s: %d: tstr before inversion=\n%s\n", + __FILE__, __LINE__, _byte_dump_string(t, tend - t, 0))); -Constructs, checks, and returns an op of any unary type. C is -the opcode. C gives the eight bits of C, except that -C will be set automatically if required, and, shifted up eight -bits, the eight bits of C, except that the bit with value 1 -is automatically set. C supplies an optional op to be the direct -child of the unary op; it is consumed by this function and become part -of the constructed op tree. + while (t < tend) { -=for apidoc Amnh||OPf_KIDS + /* Non-utf8 strings don't have ranges, so each character is listed + * out */ + if (! tstr_utf8) { + inverted_tlist = add_cp_to_invlist(inverted_tlist, *t); + t++; + } + else { /* But UTF-8 strings have been parsed in toke.c to have + * ranges if appropriate. */ + UV t_cp; + Size_t t_char_len; -=cut -*/ + /* Get the first character */ + t_cp = valid_utf8_to_uvchr(t, &t_char_len); + t += t_char_len; -OP * -Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first) -{ - UNOP *unop; + /* If the next byte indicates that this wasn't the first + * element of a range, the range is just this one */ + if (t >= tend || *t != RANGE_INDICATOR) { + inverted_tlist = add_cp_to_invlist(inverted_tlist, t_cp); + } + else { /* Otherwise, ignore the indicator byte, and get the + final element, and add the whole range */ + t++; + t_cp_end = valid_utf8_to_uvchr(t, &t_char_len); + t += t_char_len; - if (type == -OP_ENTEREVAL) { - type = OP_ENTEREVAL; - flags |= OPpEVAL_BYTES<<8; - } + inverted_tlist = _add_range_to_invlist(inverted_tlist, + t_cp, t_cp_end); + } + } + } /* End of parse through tstr */ - assert((PL_opargs[type] & OA_CLASS_MASK) == OA_UNOP - || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP - || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP - || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP - || type == OP_SASSIGN - || type == OP_ENTERTRY - || type == OP_ENTERTRYCATCH - || type == OP_CUSTOM - || type == OP_NULL ); - - if (!first) - first = newOP(OP_STUB, 0); - if (PL_opargs[type] & OA_MARK) - first = force_list(first, TRUE); + /* The inversion list is done; now invert it */ + _invlist_invert(inverted_tlist); - NewOp(1101, unop, 1, UNOP); - OpTYPE_set(unop, type); - unop->op_first = first; - unop->op_flags = (U8)(flags | OPf_KIDS); - unop->op_private = (U8)(1 | (flags >> 8)); + /* Now go through the inverted list and create a new tstr for the rest + * of the routine to use. Since the UTF-8 version can have ranges, and + * can be much more compact than the non-UTF-8 version, we create the + * string in UTF-8 even if not necessary. (This is just an intermediate + * value that gets thrown away anyway.) */ + invlist_iterinit(inverted_tlist); + inverted_tstr = newSVpvs(""); + while (invlist_iternext(inverted_tlist, &start, &end)) { + U8 temp[UTF8_MAXBYTES]; + U8 * temp_end_pos; - if (!OpHAS_SIBLING(first)) /* true unless weird syntax error */ - OpLASTSIB_set(first, (OP*)unop); + /* IV_MAX keeps things from going out of bounds */ + start = MIN(IV_MAX, start); + end = MIN(IV_MAX, end); - unop = (UNOP*) CHECKOP(type, unop); - if (unop->op_next) - return (OP*)unop; + temp_end_pos = uvchr_to_utf8(temp, start); + sv_catpvn(inverted_tstr, (char *) temp, temp_end_pos - temp); - return fold_constants(op_integerize(op_std_init((OP *) unop))); -} + if (start != end) { + Perl_sv_catpvf(aTHX_ inverted_tstr, "%c", RANGE_INDICATOR); + temp_end_pos = uvchr_to_utf8(temp, end); + sv_catpvn(inverted_tstr, (char *) temp, temp_end_pos - temp); + } + } -/* -=for apidoc newUNOP_AUX + /* Set up so the remainder of the routine uses this complement, instead + * of the actual input */ + t0 = t = (U8*)SvPV_const(inverted_tstr, temp_len); + tend = t0 + temp_len; + tstr_utf8 = TRUE; -Similar to C, but creates an C struct instead, with C -initialised to C + SvREFCNT_dec_NN(inverted_tlist); + } -=cut -*/ + /* For non-/d, an empty rhs means to use the lhs */ + if (rlen == 0 && ! del) { + r0 = t0; + rend = tend; + rstr_utf8 = tstr_utf8; + } -OP * -Perl_newUNOP_AUX(pTHX_ I32 type, I32 flags, OP *first, UNOP_AUX_item *aux) -{ - UNOP_AUX *unop; + t_invlist = _new_invlist(1); - assert((PL_opargs[type] & OA_CLASS_MASK) == OA_UNOP_AUX - || type == OP_CUSTOM); + /* Initialize to a single range */ + t_invlist = _add_range_to_invlist(t_invlist, 0, UV_MAX); - NewOp(1101, unop, 1, UNOP_AUX); - unop->op_type = (OPCODE)type; - unop->op_ppaddr = PL_ppaddr[type]; - unop->op_first = first; - unop->op_flags = (U8)(flags | (first ? OPf_KIDS : 0)); - unop->op_private = (U8)((first ? 1 : 0) | (flags >> 8)); - unop->op_aux = aux; + /* Below, we parse the (potentially adjusted) input, creating the inversion + * map. This is done in two passes. The first pass is just to determine + * if the transliteration can be done in-place. It can be done in place if + * no possible inputs result in the replacement taking up more bytes than + * the input. To figure that out, in the first pass we start with all the + * possible code points partitioned into ranges so that every code point in + * a range occupies the same number of UTF-8 bytes as every other code + * point in the range. Constructing the inversion map doesn't merge ranges + * together, but can split them into multiple ones. Given the starting + * partition, the ending state will also have the same characteristic, + * namely that each code point in each partition requires the same number + * of UTF-8 bytes to represent as every other code point in the same + * partition. + * + * This partitioning has been pre-compiled. Copy it to initialize */ + len = C_ARRAY_LENGTH(PL_partition_by_byte_length); + invlist_extend(t_invlist, len); + t_array = invlist_array(t_invlist); + Copy(PL_partition_by_byte_length, t_array, len, UV); + invlist_set_len(t_invlist, len, *(get_invlist_offset_addr(t_invlist))); + Newx(r_map, len + 1, UV); - if (first && !OpHAS_SIBLING(first)) /* true unless weird syntax error */ - OpLASTSIB_set(first, (OP*)unop); + /* The inversion map the first pass creates could be used as-is, but + * generally would be larger and slower to run than the output of the + * second pass. */ - unop = (UNOP_AUX*) CHECKOP(type, unop); + for (pass2 = 0; pass2 < 2; pass2++) { + if (pass2) { + /* In the second pass, we start with a single range */ + t_invlist = _add_range_to_invlist(t_invlist, 0, UV_MAX); + len = 1; + t_array = invlist_array(t_invlist); + } - return op_std_init((OP *) unop); -} +/* As noted earlier, we convert EBCDIC code points to Unicode in the first pass + * so as to get the well-behaved length 1 vs length 2 boundary. Only code + * points below 256 differ between the two character sets in this regard. For + * these, we also can't have any ranges, as they have to be individually + * converted. */ +#ifdef EBCDIC +# define CP_ADJUST(x) ((pass2) ? (x) : NATIVE_TO_UNI(x)) +# define FORCE_RANGE_LEN_1(x) ((pass2) ? 0 : ((x) < 256)) +# define CP_SKIP(x) ((pass2) ? UVCHR_SKIP(x) : OFFUNISKIP(x)) +#else +# define CP_ADJUST(x) (x) +# define FORCE_RANGE_LEN_1(x) 0 +# define CP_SKIP(x) UVCHR_SKIP(x) +#endif -/* -=for apidoc newMETHOP + /* And the mapping of each of the ranges is initialized. Initially, + * everything is TR_UNLISTED. */ + for (i = 0; i < len; i++) { + r_map[i] = TR_UNLISTED; + } -Constructs, checks, and returns an op of method type with a method name -evaluated at runtime. C is the opcode. C gives the eight -bits of C, except that C will be set automatically, -and, shifted up eight bits, the eight bits of C, except that -the bit with value 1 is automatically set. C supplies an -op which evaluates method name; it is consumed by this function and -become part of the constructed op tree. -Supported optypes: C. + t = t0; + t_count = 0; + r = r0; + r_count = 0; + t_range_count = r_range_count = 0; -=cut -*/ + DEBUG_y(PerlIO_printf(Perl_debug_log, "%s: %d:\ntstr=%s\n", + __FILE__, __LINE__, _byte_dump_string(t, tend - t, 0))); + DEBUG_y(PerlIO_printf(Perl_debug_log, "rstr=%s\n", + _byte_dump_string(r, rend - r, 0))); + DEBUG_y(PerlIO_printf(Perl_debug_log, "/c=%d; /s=%d; /d=%d\n", + complement, squash, del)); + DEBUG_y(invmap_dump(t_invlist, r_map)); -static OP* -S_newMETHOP_internal(pTHX_ I32 type, I32 flags, OP* dynamic_meth, SV* const_meth) { - METHOP *methop; + /* Now go through the search list constructing an inversion map. The + * input is not necessarily in any particular order. Making it an + * inversion map orders it, potentially simplifying, and makes it easy + * to deal with at run time. This is the only place in core that + * generates an inversion map; if others were introduced, it might be + * better to create general purpose routines to handle them. + * (Inversion maps are created in perl in other places.) + * + * An inversion map consists of two parallel arrays. One is + * essentially an inversion list: an ordered list of code points such + * that each element gives the first code point of a range of + * consecutive code points that map to the element in the other array + * that has the same index as this one (in other words, the + * corresponding element). Thus the range extends up to (but not + * including) the code point given by the next higher element. In a + * true inversion map, the corresponding element in the other array + * gives the mapping of the first code point in the range, with the + * understanding that the next higher code point in the inversion + * list's range will map to the next higher code point in the map. + * + * So if at element [i], let's say we have: + * + * t_invlist r_map + * [i] A a + * + * This means that A => a, B => b, C => c.... Let's say that the + * situation is such that: + * + * [i+1] L -1 + * + * This means the sequence that started at [i] stops at K => k. This + * illustrates that you need to look at the next element to find where + * a sequence stops. Except, the highest element in the inversion list + * begins a range that is understood to extend to the platform's + * infinity. + * + * This routine modifies traditional inversion maps to reserve two + * mappings: + * + * TR_UNLISTED (or -1) indicates that no code point in the range + * is listed in the tr/// searchlist. At runtime, these are + * always passed through unchanged. In the inversion map, all + * points in the range are mapped to -1, instead of increasing, + * like the 'L' in the example above. + * + * We start the parse with every code point mapped to this, and as + * we parse and find ones that are listed in the search list, we + * carve out ranges as we go along that override that. + * + * TR_SPECIAL_HANDLING (or -2) indicates that every code point in the + * range needs special handling. Again, all code points in the + * range are mapped to -2, instead of increasing. + * + * Under /d this value means the code point should be deleted from + * the transliteration when encountered. + * + * Otherwise, it marks that every code point in the range is to + * map to the final character in the replacement list. This + * happens only when the replacement list is shorter than the + * search one, so there are things in the search list that have no + * correspondence in the replacement list. For example, in + * tr/a-z/A/, 'A' is the final value, and the inversion map + * generated for this would be like this: + * \0 => -1 + * a => A + * b-z => -2 + * z+1 => -1 + * 'A' appears once, then the remainder of the range maps to -2. + * The use of -2 isn't strictly necessary, as an inversion map is + * capable of representing this situation, but not nearly so + * compactly, and this is actually quite commonly encountered. + * Indeed, the original design of this code used a full inversion + * map for this. But things like + * tr/\0-\x{FFFF}/A/ + * generated huge data structures, slowly, and the execution was + * also slow. So the current scheme was implemented. + * + * So, if the next element in our example is: + * + * [i+2] Q q + * + * Then all of L, M, N, O, and P map to TR_UNLISTED. If the next + * elements are + * + * [i+3] R z + * [i+4] S TR_UNLISTED + * + * Then Q => q; R => z; and S => TR_UNLISTED. If [i+4] (the 'S') is + * the final element in the arrays, every code point from S to infinity + * maps to TR_UNLISTED. + * + */ + /* Finish up range started in what otherwise would + * have been the final iteration */ + while (t < tend || t_range_count > 0) { + bool adjacent_to_range_above = FALSE; + bool adjacent_to_range_below = FALSE; - assert((PL_opargs[type] & OA_CLASS_MASK) == OA_METHOP - || type == OP_CUSTOM); + bool merge_with_range_above = FALSE; + bool merge_with_range_below = FALSE; - NewOp(1101, methop, 1, METHOP); - if (dynamic_meth) { - if (PL_opargs[type] & OA_MARK) dynamic_meth = force_list(dynamic_meth, TRUE); - methop->op_flags = (U8)(flags | OPf_KIDS); - methop->op_u.op_first = dynamic_meth; - methop->op_private = (U8)(1 | (flags >> 8)); + UV span, invmap_range_length_remaining; + SSize_t j; + Size_t i; - if (!OpHAS_SIBLING(dynamic_meth)) - OpLASTSIB_set(dynamic_meth, (OP*)methop); - } - else { - assert(const_meth); - methop->op_flags = (U8)(flags & ~OPf_KIDS); - methop->op_u.op_meth_sv = const_meth; - methop->op_private = (U8)(0 | (flags >> 8)); - methop->op_next = (OP*)methop; - } - -#ifdef USE_ITHREADS - methop->op_rclass_targ = 0; -#else - methop->op_rclass_sv = NULL; -#endif - - OpTYPE_set(methop, type); - return CHECKOP(type, methop); -} - -OP * -Perl_newMETHOP (pTHX_ I32 type, I32 flags, OP* dynamic_meth) { - PERL_ARGS_ASSERT_NEWMETHOP; - return newMETHOP_internal(type, flags, dynamic_meth, NULL); -} - -/* -=for apidoc newMETHOP_named - -Constructs, checks, and returns an op of method type with a constant -method name. C is the opcode. C gives the eight bits of -C, and, shifted up eight bits, the eight bits of -C. C supplies a constant method name; -it must be a shared COW string. -Supported optypes: C. + /* If we are in the middle of processing a range in the 'target' + * side, the previous iteration has set us up. Otherwise, look at + * the next character in the search list */ + if (t_range_count <= 0) { + if (! tstr_utf8) { -=cut -*/ + /* Here, not in the middle of a range, and not UTF-8. The + * next code point is the single byte where we're at */ + t_cp = CP_ADJUST(*t); + t_range_count = 1; + t++; + } + else { + Size_t t_char_len; -OP * -Perl_newMETHOP_named (pTHX_ I32 type, I32 flags, SV* const_meth) { - PERL_ARGS_ASSERT_NEWMETHOP_NAMED; - return newMETHOP_internal(type, flags, NULL, const_meth); -} + /* Here, not in the middle of a range, and is UTF-8. The + * next code point is the next UTF-8 char in the input. We + * know the input is valid, because the toker constructed + * it */ + t_cp = CP_ADJUST(valid_utf8_to_uvchr(t, &t_char_len)); + t += t_char_len; -/* -=for apidoc newBINOP + /* UTF-8 strings (only) have been parsed in toke.c to have + * ranges. See if the next byte indicates that this was + * the first element of a range. If so, get the final + * element and calculate the range size. If not, the range + * size is 1 */ + if ( t < tend && *t == RANGE_INDICATOR + && ! FORCE_RANGE_LEN_1(t_cp)) + { + t++; + t_range_count = valid_utf8_to_uvchr(t, &t_char_len) + - t_cp + 1; + t += t_char_len; + } + else { + t_range_count = 1; + } + } -Constructs, checks, and returns an op of any binary type. C -is the opcode. C gives the eight bits of C, except -that C will be set automatically, and, shifted up eight bits, -the eight bits of C, except that the bit with value 1 or -2 is automatically set as required. C and C supply up to -two ops to be the direct children of the binary op; they are consumed -by this function and become part of the constructed op tree. + /* Count the total number of listed code points * */ + t_count += t_range_count; + } -=cut -*/ + /* Similarly, get the next character in the replacement list */ + if (r_range_count <= 0) { + if (r >= rend) { -OP * -Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last) -{ - BINOP *binop; + /* But if we've exhausted the rhs, there is nothing to map + * to, except the special handling one, and we make the + * range the same size as the lhs one. */ + r_cp = TR_SPECIAL_HANDLING; + r_range_count = t_range_count; - ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP - || type == OP_NULL || type == OP_CUSTOM); + if (! del) { + DEBUG_yv(PerlIO_printf(Perl_debug_log, + "final_map =%" UVXf "\n", final_map)); + } + } + else { + if (! rstr_utf8) { + r_cp = CP_ADJUST(*r); + r_range_count = 1; + r++; + } + else { + Size_t r_char_len; - NewOp(1101, binop, 1, BINOP); + r_cp = CP_ADJUST(valid_utf8_to_uvchr(r, &r_char_len)); + r += r_char_len; + if ( r < rend && *r == RANGE_INDICATOR + && ! FORCE_RANGE_LEN_1(r_cp)) + { + r++; + r_range_count = valid_utf8_to_uvchr(r, + &r_char_len) - r_cp + 1; + r += r_char_len; + } + else { + r_range_count = 1; + } + } - if (!first) - first = newOP(OP_NULL, 0); + if (r_cp == TR_SPECIAL_HANDLING) { + r_range_count = t_range_count; + } - OpTYPE_set(binop, type); - binop->op_first = first; - binop->op_flags = (U8)(flags | OPf_KIDS); - if (!last) { - last = first; - binop->op_private = (U8)(1 | (flags >> 8)); - } - else { - binop->op_private = (U8)(2 | (flags >> 8)); - OpMORESIB_set(first, last); - } + /* This is the final character so far */ + final_map = r_cp + r_range_count - 1; - if (!OpHAS_SIBLING(last)) /* true unless weird syntax error */ - OpLASTSIB_set(last, (OP*)binop); + r_count += r_range_count; + } + } - binop->op_last = OpSIBLING(binop->op_first); - if (binop->op_last) - OpLASTSIB_set(binop->op_last, (OP*)binop); + /* Here, we have the next things ready in both sides. They are + * potentially ranges. We try to process as big a chunk as + * possible at once, but the lhs and rhs must be synchronized, so + * things like tr/A-Z/a-ij-z/ will need to be processed in 2 chunks + * */ + min_range_count = MIN(t_range_count, r_range_count); - binop = (BINOP*)CHECKOP(type, binop); - if (binop->op_next || binop->op_type != (OPCODE)type) - return (OP*)binop; + /* Search the inversion list for the entry that contains the input + * code point . The inversion map was initialized to cover the + * entire range of possible inputs, so this should not fail. So + * the return value is the index into the list's array of the range + * that contains , that is, 'i' such that array[i] <= cp < + * array[i+1] */ + j = _invlist_search(t_invlist, t_cp); + assert(j >= 0); + i = j; - return fold_constants(op_integerize(op_std_init((OP *)binop))); -} + /* Here, the data structure might look like: + * + * index t r Meaning + * [i-1] J j # J-L => j-l + * [i] M -1 # M => default; as do N, O, P, Q + * [i+1] R x # R => x, S => x+1, T => x+2 + * [i+2] U y # U => y, V => y+1, ... + * ... + * [-1] Z -1 # Z => default; as do Z+1, ... infinity + * + * where 'x' and 'y' above are not to be taken literally. + * + * The maximum chunk we can handle in this loop iteration, is the + * smallest of the three components: the lhs 't_', the rhs 'r_', + * and the remainder of the range in element [i]. (In pass 1, that + * range will have everything in it be of the same class; we can't + * cross into another class.) 'min_range_count' already contains + * the smallest of the first two values. The final one is + * irrelevant if the map is to the special indicator */ -void -Perl_invmap_dump(pTHX_ SV* invlist, UV *map) -{ - const char indent[] = " "; + invmap_range_length_remaining = (i + 1 < len) + ? t_array[i+1] - t_cp + : IV_MAX - t_cp; + span = MAX(1, MIN(min_range_count, invmap_range_length_remaining)); - UV len = _invlist_len(invlist); - UV * array = invlist_array(invlist); - UV i; + /* The end point of this chunk is where we are, plus the span, but + * never larger than the platform's infinity */ + t_cp_end = MIN(IV_MAX, t_cp + span - 1); - PERL_ARGS_ASSERT_INVMAP_DUMP; + if (r_cp == TR_SPECIAL_HANDLING) { - for (i = 0; i < len; i++) { - UV start = array[i]; - UV end = (i + 1 < len) ? array[i+1] - 1 : IV_MAX; + /* If unmatched lhs code points map to the final map, use that + * value. This being set to TR_SPECIAL_HANDLING indicates that + * we don't have a final map: unmatched lhs code points are + * simply deleted */ + r_cp_end = (del) ? TR_SPECIAL_HANDLING : final_map; + } + else { + r_cp_end = MIN(IV_MAX, r_cp + span - 1); - PerlIO_printf(Perl_debug_log, "%s[%" UVuf "] 0x%04" UVXf, indent, i, start); - if (end == IV_MAX) { - PerlIO_printf(Perl_debug_log, " .. INFTY"); - } - else if (end != start) { - PerlIO_printf(Perl_debug_log, " .. 0x%04" UVXf, end); - } - else { - PerlIO_printf(Perl_debug_log, " "); - } + /* If something on the lhs is below 256, and something on the + * rhs is above, there is a potential mapping here across that + * boundary. Indeed the only way there isn't is if both sides + * start at the same point. That means they both cross at the + * same time. But otherwise one crosses before the other */ + if (t_cp < 256 && r_cp_end > 255 && r_cp != t_cp) { + can_force_utf8 = TRUE; + } + } - PerlIO_printf(Perl_debug_log, "\t"); + /* If a character appears in the search list more than once, the + * 2nd and succeeding occurrences are ignored, so only do this + * range if haven't already processed this character. (The range + * has been set up so that all members in it will be of the same + * ilk) */ + if (r_map[i] == TR_UNLISTED) { + DEBUG_yv(PerlIO_printf(Perl_debug_log, + "Processing %" UVxf "-%" UVxf " => %" UVxf "-%" UVxf "\n", + t_cp, t_cp_end, r_cp, r_cp_end)); - if (map[i] == TR_UNLISTED) { - PerlIO_printf(Perl_debug_log, "TR_UNLISTED\n"); - } - else if (map[i] == TR_SPECIAL_HANDLING) { - PerlIO_printf(Perl_debug_log, "TR_SPECIAL_HANDLING\n"); - } - else { - PerlIO_printf(Perl_debug_log, "0x%04" UVXf "\n", map[i]); - } - } -} + /* This is the first definition for this chunk, hence is valid + * and needs to be processed. Here and in the comments below, + * we use the above sample data. The t_cp chunk must be any + * contiguous subset of M, N, O, P, and/or Q. + * + * In the first pass, calculate if there is any possible input + * string that has a character whose transliteration will be + * longer than it. If none, the transliteration may be done + * in-place, as it can't write over a so-far unread byte. + * Otherwise, a copy must first be made. This could be + * expensive for long inputs. + * + * In the first pass, the t_invlist has been partitioned so + * that all elements in any single range have the same number + * of bytes in their UTF-8 representations. And the r space is + * either a single byte, or a range of strictly monotonically + * increasing code points. So the final element in the range + * will be represented by no fewer bytes than the initial one. + * That means that if the final code point in the t range has + * at least as many bytes as the final code point in the r, + * then all code points in the t range have at least as many + * bytes as their corresponding r range element. But if that's + * not true, the transliteration of at least the final code + * point grows in length. As an example, suppose we had + * tr/\x{fff0}-\x{fff1}/\x{ffff}-\x{10000}/ + * The UTF-8 for all but 10000 occupies 3 bytes on ASCII + * platforms. We have deliberately set up the data structure + * so that any range in the lhs gets split into chunks for + * processing, such that every code point in a chunk has the + * same number of UTF-8 bytes. We only have to check the final + * code point in the rhs against any code point in the lhs. */ + if ( ! pass2 + && r_cp_end != TR_SPECIAL_HANDLING + && CP_SKIP(t_cp_end) < CP_SKIP(r_cp_end)) + { + /* Here, we will need to make a copy of the input string + * before doing the transliteration. The worst possible + * case is an expansion ratio of 14:1. This is rare, and + * we'd rather allocate only the necessary amount of extra + * memory for that copy. We can calculate the worst case + * for this particular transliteration is by keeping track + * of the expansion factor for each range. + * + * Consider tr/\xCB/\X{E000}/. The maximum expansion + * factor is 1 byte going to 3 if the target string is not + * UTF-8, but 2 bytes going to 3 if it is in UTF-8. We + * could pass two different values so doop could choose + * based on the UTF-8ness of the target. But khw thinks + * (perhaps wrongly) that is overkill. It is used only to + * make sure we malloc enough space. + * + * If no target string can force the result to be UTF-8, + * then we don't have to worry about the case of the target + * string not being UTF-8 */ + NV t_size = (can_force_utf8 && t_cp < 256) + ? 1 + : CP_SKIP(t_cp_end); + NV ratio = CP_SKIP(r_cp_end) / t_size; -/* Given an OP_TRANS / OP_TRANSR op o, plus OP_CONST ops expr and repl - * containing the search and replacement strings, assemble into - * a translation table attached as o->op_pv. - * Free expr and repl. - * It expects the toker to have already set the - * OPpTRANS_COMPLEMENT - * OPpTRANS_SQUASH - * OPpTRANS_DELETE - * flags as appropriate; this function may add - * OPpTRANS_USE_SVOP - * OPpTRANS_CAN_FORCE_UTF8 - * OPpTRANS_IDENTICAL - * OPpTRANS_GROWS - * flags - */ + o->op_private |= OPpTRANS_GROWS; -static OP * -S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl) -{ - /* This function compiles a tr///, from data gathered from toke.c, into a - * form suitable for use by do_trans() in doop.c at runtime. - * - * It first normalizes the data, while discarding extraneous inputs; then - * writes out the compiled data. The normalization allows for complete - * analysis, and avoids some false negatives and positives earlier versions - * of this code had. - * - * The normalization form is an inversion map (described below in detail). - * This is essentially the compiled form for tr///'s that require UTF-8, - * and its easy to use it to write the 257-byte table for tr///'s that - * don't need UTF-8. That table is identical to what's been in use for - * many perl versions, except that it doesn't handle some edge cases that - * it used to, involving code points above 255. The UTF-8 form now handles - * these. (This could be changed with extra coding should it shown to be - * desirable.) - * - * If the complement (/c) option is specified, the lhs string (tstr) is - * parsed into an inversion list. Complementing these is trivial. Then a - * complemented tstr is built from that, and used thenceforth. This hides - * the fact that it was complemented from almost all successive code. - * - * One of the important characteristics to know about the input is whether - * the transliteration may be done in place, or does a temporary need to be - * allocated, then copied. If the replacement for every character in every - * possible string takes up no more bytes than the character it - * replaces, then it can be edited in place. Otherwise the replacement - * could overwrite a byte we are about to read, depending on the strings - * being processed. The comments and variable names here refer to this as - * "growing". Some inputs won't grow, and might even shrink under /d, but - * some inputs could grow, so we have to assume any given one might grow. - * On very long inputs, the temporary could eat up a lot of memory, so we - * want to avoid it if possible. For non-UTF-8 inputs, everything is - * single-byte, so can be edited in place, unless there is something in the - * pattern that could force it into UTF-8. The inversion map makes it - * feasible to determine this. Previous versions of this code pretty much - * punted on determining if UTF-8 could be edited in place. Now, this code - * is rigorous in making that determination. - * - * Another characteristic we need to know is whether the lhs and rhs are - * identical. If so, and no other flags are present, the only effect of - * the tr/// is to count the characters present in the input that are - * mentioned in the lhs string. The implementation of that is easier and - * runs faster than the more general case. Normalizing here allows for - * accurate determination of this. Previously there were false negatives - * possible. - * - * Instead of 'transliterated', the comments here use 'unmapped' for the - * characters that are left unchanged by the operation; otherwise they are - * 'mapped' - * - * The lhs of the tr/// is here referred to as the t side. - * The rhs of the tr/// is here referred to as the r side. - */ + /* Now that we know it grows, we can keep track of the + * largest ratio */ + if (ratio > max_expansion) { + max_expansion = ratio; + DEBUG_y(PerlIO_printf(Perl_debug_log, + "New expansion factor: %" NVgf "\n", + max_expansion)); + } + } - SV * const tstr = ((SVOP*)expr)->op_sv; - SV * const rstr = ((SVOP*)repl)->op_sv; - STRLEN tlen; - STRLEN rlen; - const U8 * t0 = (U8*)SvPV_const(tstr, tlen); - const U8 * r0 = (U8*)SvPV_const(rstr, rlen); - const U8 * t = t0; - const U8 * r = r0; - UV t_count = 0, r_count = 0; /* Number of characters in search and - replacement lists */ + /* The very first range is marked as adjacent to the + * non-existent range below it, as it causes things to "just + * work" (TradeMark) + * + * If the lowest code point in this chunk is M, it adjoins the + * J-L range */ + if (t_cp == t_array[i]) { + adjacent_to_range_below = TRUE; - /* khw thinks some of the private flags for this op are quaintly named. - * OPpTRANS_GROWS for example is TRUE if the replacement for some lhs - * character when represented in UTF-8 is longer than the original - * character's UTF-8 representation */ - const bool complement = cBOOL(o->op_private & OPpTRANS_COMPLEMENT); - const bool squash = cBOOL(o->op_private & OPpTRANS_SQUASH); - const bool del = cBOOL(o->op_private & OPpTRANS_DELETE); + /* And if the map has the same offset from the beginning of + * the range as does this new code point (or both are for + * TR_SPECIAL_HANDLING), this chunk can be completely + * merged with the range below. EXCEPT, in the first pass, + * we don't merge ranges whose UTF-8 byte representations + * have different lengths, so that we can more easily + * detect if a replacement is longer than the source, that + * is if it 'grows'. But in the 2nd pass, there's no + * reason to not merge */ + if ( (i > 0 && ( pass2 + || CP_SKIP(t_array[i-1]) + == CP_SKIP(t_cp))) + && ( ( r_cp == TR_SPECIAL_HANDLING + && r_map[i-1] == TR_SPECIAL_HANDLING) + || ( r_cp != TR_SPECIAL_HANDLING + && r_cp - r_map[i-1] == t_cp - t_array[i-1]))) + { + merge_with_range_below = TRUE; + } + } - /* Set to true if there is some character < 256 in the lhs that maps to - * above 255. If so, a non-UTF-8 match string can be forced into being in - * UTF-8 by a tr/// operation. */ - bool can_force_utf8 = FALSE; + /* Similarly, if the highest code point in this chunk is 'Q', + * it adjoins the range above, and if the map is suitable, can + * be merged with it */ + if ( t_cp_end >= IV_MAX - 1 + || ( i + 1 < len + && t_cp_end + 1 == t_array[i+1])) + { + adjacent_to_range_above = TRUE; + if (i + 1 < len) + if ( ( pass2 + || CP_SKIP(t_cp) == CP_SKIP(t_array[i+1])) + && ( ( r_cp == TR_SPECIAL_HANDLING + && r_map[i+1] == (UV) TR_SPECIAL_HANDLING) + || ( r_cp != TR_SPECIAL_HANDLING + && r_cp_end == r_map[i+1] - 1))) + { + merge_with_range_above = TRUE; + } + } - /* What is the maximum expansion factor in UTF-8 transliterations. If a - * 2-byte UTF-8 encoded character is to be replaced by a 3-byte one, its - * expansion factor is 1.5. This number is used at runtime to calculate - * how much space to allocate for non-inplace transliterations. Without - * this number, the worst case is 14, which is extremely unlikely to happen - * in real life, and could require significant memory overhead. */ - NV max_expansion = 1.; + if (merge_with_range_below && merge_with_range_above) { - UV t_range_count, r_range_count, min_range_count; - UV* t_array; - SV* t_invlist; - UV* r_map; - UV r_cp = 0, t_cp = 0; - UV t_cp_end = (UV) -1; - UV r_cp_end; - Size_t len; - AV* invmap; - UV final_map = TR_UNLISTED; /* The final character in the replacement - list, updated as we go along. Initialize - to something illegal */ + /* Here the new chunk looks like M => m, ... Q => q; and + * the range above is like R => r, .... Thus, the [i-1] + * and [i+1] ranges should be seamlessly melded so the + * result looks like + * + * [i-1] J j # J-T => j-t + * [i] U y # U => y, V => y+1, ... + * ... + * [-1] Z -1 # Z => default; as do Z+1, ... infinity + */ + Move(t_array + i + 2, t_array + i, len - i - 2, UV); + Move(r_map + i + 2, r_map + i, len - i - 2, UV); + len -= 2; + invlist_set_len(t_invlist, + len, + *(get_invlist_offset_addr(t_invlist))); + } + else if (merge_with_range_below) { - bool rstr_utf8 = cBOOL(SvUTF8(rstr)); - bool tstr_utf8 = cBOOL(SvUTF8(tstr)); - - const U8* tend = t + tlen; - const U8* rend = r + rlen; - - SV * inverted_tstr = NULL; + /* Here the new chunk looks like M => m, .... But either + * (or both) it doesn't extend all the way up through Q; or + * the range above doesn't start with R => r. */ + if (! adjacent_to_range_above) { - Size_t i; - unsigned int pass2; + /* In the first case, let's say the new chunk extends + * through O. We then want: + * + * [i-1] J j # J-O => j-o + * [i] P -1 # P => -1, Q => -1 + * [i+1] R x # R => x, S => x+1, T => x+2 + * [i+2] U y # U => y, V => y+1, ... + * ... + * [-1] Z -1 # Z => default; as do Z+1, ... + * infinity + */ + t_array[i] = t_cp_end + 1; + r_map[i] = TR_UNLISTED; + } + else { /* Adjoins the range above, but can't merge with it + (because 'x' is not the next map after q) */ + /* + * [i-1] J j # J-Q => j-q + * [i] R x # R => x, S => x+1, T => x+2 + * [i+1] U y # U => y, V => y+1, ... + * ... + * [-1] Z -1 # Z => default; as do Z+1, ... + * infinity + */ - /* This routine implements detection of a transliteration having a longer - * UTF-8 representation than its source, by partitioning all the possible - * code points of the platform into equivalence classes of the same UTF-8 - * byte length in the first pass. As it constructs the mappings, it carves - * these up into smaller chunks, but doesn't merge any together. This - * makes it easy to find the instances it's looking for. A second pass is - * done after this has been determined which merges things together to - * shrink the table for runtime. The table below is used for both ASCII - * and EBCDIC platforms. On EBCDIC, the byte length is not monotonically - * increasing for code points below 256. To correct for that, the macro - * CP_ADJUST defined below converts those code points to ASCII in the first - * pass, and we use the ASCII partition values. That works because the - * growth factor will be unaffected, which is all that is calculated during - * the first pass. */ - UV PL_partition_by_byte_length[] = { - 0, - 0x80, /* Below this is 1 byte representations */ - (32 * (1UL << ( UTF_ACCUMULATION_SHIFT))), /* 2 bytes below this */ - (16 * (1UL << (2 * UTF_ACCUMULATION_SHIFT))), /* 3 bytes below this */ - ( 8 * (1UL << (3 * UTF_ACCUMULATION_SHIFT))), /* 4 bytes below this */ - ( 4 * (1UL << (4 * UTF_ACCUMULATION_SHIFT))), /* 5 bytes below this */ - ( 2 * (1UL << (5 * UTF_ACCUMULATION_SHIFT))) /* 6 bytes below this */ + Move(t_array + i + 1, t_array + i, len - i - 1, UV); + Move(r_map + i + 1, r_map + i, len - i - 1, UV); + len--; + invlist_set_len(t_invlist, len, + *(get_invlist_offset_addr(t_invlist))); + } + } + else if (merge_with_range_above) { -# ifdef UV_IS_QUAD - , - ( ((UV) 1U << (6 * UTF_ACCUMULATION_SHIFT))) /* 7 bytes below this */ -# endif + /* Here the new chunk ends with Q => q, and the range above + * must start with R => r, so the two can be merged. But + * either (or both) the new chunk doesn't extend all the + * way down to M; or the mapping of the final code point + * range below isn't m */ + if (! adjacent_to_range_below) { - }; + /* In the first case, let's assume the new chunk starts + * with P => p. Then, because it's merge-able with the + * range above, that range must be R => r. We want: + * + * [i-1] J j # J-L => j-l + * [i] M -1 # M => -1, N => -1 + * [i+1] P p # P-T => p-t + * [i+2] U y # U => y, V => y+1, ... + * ... + * [-1] Z -1 # Z => default; as do Z+1, ... + * infinity + */ + t_array[i+1] = t_cp; + r_map[i+1] = r_cp; + } + else { /* Adjoins the range below, but can't merge with it + */ + /* + * [i-1] J j # J-L => j-l + * [i] M x # M-T => x-5 .. x+2 + * [i+1] U y # U => y, V => y+1, ... + * ... + * [-1] Z -1 # Z => default; as do Z+1, ... + * infinity + */ + Move(t_array + i + 1, t_array + i, len - i - 1, UV); + Move(r_map + i + 1, r_map + i, len - i - 1, UV); + len--; + t_array[i] = t_cp; + r_map[i] = r_cp; + invlist_set_len(t_invlist, len, + *(get_invlist_offset_addr(t_invlist))); + } + } + else if (adjacent_to_range_below && adjacent_to_range_above) { + /* The new chunk completely fills the gap between the + * ranges on either side, but can't merge with either of + * them. + * + * [i-1] J j # J-L => j-l + * [i] M z # M => z, N => z+1 ... Q => z+4 + * [i+1] R x # R => x, S => x+1, T => x+2 + * [i+2] U y # U => y, V => y+1, ... + * ... + * [-1] Z -1 # Z => default; as do Z+1, ... infinity + */ + r_map[i] = r_cp; + } + else if (adjacent_to_range_below) { + /* The new chunk adjoins the range below, but not the range + * above, and can't merge. Let's assume the chunk ends at + * O. + * + * [i-1] J j # J-L => j-l + * [i] M z # M => z, N => z+1, O => z+2 + * [i+1] P -1 # P => -1, Q => -1 + * [i+2] R x # R => x, S => x+1, T => x+2 + * [i+3] U y # U => y, V => y+1, ... + * ... + * [-w] Z -1 # Z => default; as do Z+1, ... infinity + */ + invlist_extend(t_invlist, len + 1); + t_array = invlist_array(t_invlist); + Renew(r_map, len + 1, UV); - PERL_ARGS_ASSERT_PMTRANS; + Move(t_array + i + 1, t_array + i + 2, len - i - 1, UV); + Move(r_map + i + 1, r_map + i + 2, len - i - 1, UV); + r_map[i] = r_cp; + t_array[i+1] = t_cp_end + 1; + r_map[i+1] = TR_UNLISTED; + len++; + invlist_set_len(t_invlist, len, + *(get_invlist_offset_addr(t_invlist))); + } + else if (adjacent_to_range_above) { + /* The new chunk adjoins the range above, but not the range + * below, and can't merge. Let's assume the new chunk + * starts at O + * + * [i-1] J j # J-L => j-l + * [i] M -1 # M => default, N => default + * [i+1] O z # O => z, P => z+1, Q => z+2 + * [i+2] R x # R => x, S => x+1, T => x+2 + * [i+3] U y # U => y, V => y+1, ... + * ... + * [-1] Z -1 # Z => default; as do Z+1, ... infinity + */ + invlist_extend(t_invlist, len + 1); + t_array = invlist_array(t_invlist); + Renew(r_map, len + 1, UV); - PL_hints |= HINT_BLOCK_SCOPE; + Move(t_array + i + 1, t_array + i + 2, len - i - 1, UV); + Move(r_map + i + 1, r_map + i + 2, len - i - 1, UV); + t_array[i+1] = t_cp; + r_map[i+1] = r_cp; + len++; + invlist_set_len(t_invlist, len, + *(get_invlist_offset_addr(t_invlist))); + } + else { + /* The new chunk adjoins neither the range above, nor the + * range below. Lets assume it is N..P => n..p + * + * [i-1] J j # J-L => j-l + * [i] M -1 # M => default + * [i+1] N n # N..P => n..p + * [i+2] Q -1 # Q => default + * [i+3] R x # R => x, S => x+1, T => x+2 + * [i+4] U y # U => y, V => y+1, ... + * ... + * [-1] Z -1 # Z => default; as do Z+1, ... infinity + */ - /* If /c, the search list is sorted and complemented. This is now done by - * creating an inversion list from it, and then trivially inverting that. - * The previous implementation used qsort, but creating the list - * automatically keeps it sorted as we go along */ - if (complement) { - UV start, end; - SV * inverted_tlist = _new_invlist(tlen); - Size_t temp_len; + DEBUG_yv(PerlIO_printf(Perl_debug_log, + "Before fixing up: len=%d, i=%d\n", + (int) len, (int) i)); + DEBUG_yv(invmap_dump(t_invlist, r_map)); - DEBUG_y(PerlIO_printf(Perl_debug_log, - "%s: %d: tstr before inversion=\n%s\n", - __FILE__, __LINE__, _byte_dump_string(t, tend - t, 0))); + invlist_extend(t_invlist, len + 2); + t_array = invlist_array(t_invlist); + Renew(r_map, len + 2, UV); - while (t < tend) { + Move(t_array + i + 1, + t_array + i + 2 + 1, len - i - (2 - 1), UV); + Move(r_map + i + 1, + r_map + i + 2 + 1, len - i - (2 - 1), UV); - /* Non-utf8 strings don't have ranges, so each character is listed - * out */ - if (! tstr_utf8) { - inverted_tlist = add_cp_to_invlist(inverted_tlist, *t); - t++; - } - else { /* But UTF-8 strings have been parsed in toke.c to have - * ranges if appropriate. */ - UV t_cp; - Size_t t_char_len; + len += 2; + invlist_set_len(t_invlist, len, + *(get_invlist_offset_addr(t_invlist))); - /* Get the first character */ - t_cp = valid_utf8_to_uvchr(t, &t_char_len); - t += t_char_len; + t_array[i+1] = t_cp; + r_map[i+1] = r_cp; - /* If the next byte indicates that this wasn't the first - * element of a range, the range is just this one */ - if (t >= tend || *t != RANGE_INDICATOR) { - inverted_tlist = add_cp_to_invlist(inverted_tlist, t_cp); + t_array[i+2] = t_cp_end + 1; + r_map[i+2] = TR_UNLISTED; } - else { /* Otherwise, ignore the indicator byte, and get the - final element, and add the whole range */ - t++; - t_cp_end = valid_utf8_to_uvchr(t, &t_char_len); - t += t_char_len; + DEBUG_yv(PerlIO_printf(Perl_debug_log, + "After iteration: span=%" UVuf ", t_range_count=%" + UVuf " r_range_count=%" UVuf "\n", + span, t_range_count, r_range_count)); + DEBUG_yv(invmap_dump(t_invlist, r_map)); + } /* End of this chunk needs to be processed */ - inverted_tlist = _add_range_to_invlist(inverted_tlist, - t_cp, t_cp_end); - } + /* Done with this chunk. */ + t_cp += span; + if (t_cp >= IV_MAX) { + break; + } + t_range_count -= span; + if (r_cp != TR_SPECIAL_HANDLING) { + r_cp += span; + r_range_count -= span; + } + else { + r_range_count = 0; } - } /* End of parse through tstr */ - - /* The inversion list is done; now invert it */ - _invlist_invert(inverted_tlist); - /* Now go through the inverted list and create a new tstr for the rest - * of the routine to use. Since the UTF-8 version can have ranges, and - * can be much more compact than the non-UTF-8 version, we create the - * string in UTF-8 even if not necessary. (This is just an intermediate - * value that gets thrown away anyway.) */ - invlist_iterinit(inverted_tlist); - inverted_tstr = newSVpvs(""); - while (invlist_iternext(inverted_tlist, &start, &end)) { - U8 temp[UTF8_MAXBYTES]; - U8 * temp_end_pos; + } /* End of loop through the search list */ - /* IV_MAX keeps things from going out of bounds */ - start = MIN(IV_MAX, start); - end = MIN(IV_MAX, end); + /* We don't need an exact count, but we do need to know if there is + * anything left over in the replacement list. So, just assume it's + * one byte per character */ + if (rend > r) { + r_count++; + } + } /* End of passes */ - temp_end_pos = uvchr_to_utf8(temp, start); - sv_catpvn(inverted_tstr, (char *) temp, temp_end_pos - temp); + SvREFCNT_dec(inverted_tstr); - if (start != end) { - Perl_sv_catpvf(aTHX_ inverted_tstr, "%c", RANGE_INDICATOR); - temp_end_pos = uvchr_to_utf8(temp, end); - sv_catpvn(inverted_tstr, (char *) temp, temp_end_pos - temp); + DEBUG_y(PerlIO_printf(Perl_debug_log, "After everything: \n")); + DEBUG_y(invmap_dump(t_invlist, r_map)); + + /* We now have normalized the input into an inversion map. + * + * See if the lhs and rhs are equivalent. If so, this tr/// is a no-op + * except for the count, and streamlined runtime code can be used */ + if (!del && !squash) { + + /* They are identical if they point to the same address, or if + * everything maps to UNLISTED or to itself. This catches things that + * not looking at the normalized inversion map doesn't catch, like + * tr/aa/ab/ or tr/\x{100}-\x{104}/\x{100}-\x{102}\x{103}-\x{104} */ + if (r0 != t0) { + for (i = 0; i < len; i++) { + if (r_map[i] != TR_UNLISTED && r_map[i] != t_array[i]) { + goto done_identical_check; + } } } - /* Set up so the remainder of the routine uses this complement, instead - * of the actual input */ - t0 = t = (U8*)SvPV_const(inverted_tstr, temp_len); - tend = t0 + temp_len; - tstr_utf8 = TRUE; + /* Here have gone through entire list, and didn't find any + * non-identical mappings */ + o->op_private |= OPpTRANS_IDENTICAL; - SvREFCNT_dec_NN(inverted_tlist); + done_identical_check: ; } - /* For non-/d, an empty rhs means to use the lhs */ - if (rlen == 0 && ! del) { - r0 = t0; - rend = tend; - rstr_utf8 = tstr_utf8; - } + t_array = invlist_array(t_invlist); - t_invlist = _new_invlist(1); + /* If has components above 255, we generally need to use the inversion map + * implementation */ + if ( can_force_utf8 + || ( len > 0 + && t_array[len-1] > 255 + /* If the final range is 0x100-INFINITY and is a special + * mapping, the table implementation can handle it */ + && ! ( t_array[len-1] == 256 + && ( r_map[len-1] == TR_UNLISTED + || r_map[len-1] == TR_SPECIAL_HANDLING)))) + { + SV* r_map_sv; + SV* temp_sv; - /* Initialize to a single range */ - t_invlist = _add_range_to_invlist(t_invlist, 0, UV_MAX); + /* A UTF-8 op is generated, indicated by this flag. This op is an + * sv_op */ + o->op_private |= OPpTRANS_USE_SVOP; - /* For the first pass, the lhs is partitioned such that the - * number of UTF-8 bytes required to represent a code point in each - * partition is the same as the number for any other code point in - * that partion. We copy the pre-compiled partion. */ - len = C_ARRAY_LENGTH(PL_partition_by_byte_length); - invlist_extend(t_invlist, len); - t_array = invlist_array(t_invlist); - Copy(PL_partition_by_byte_length, t_array, len, UV); - invlist_set_len(t_invlist, len, *(get_invlist_offset_addr(t_invlist))); - Newx(r_map, len + 1, UV); + if (can_force_utf8) { + o->op_private |= OPpTRANS_CAN_FORCE_UTF8; + } - /* Parse the (potentially adjusted) input, creating the inversion map. - * This is done in two passes. The first pass is to determine if the - * transliteration can be done in place. The inversion map it creates - * could be used, but generally would be larger and slower to run than the - * output of the second pass, which starts with a more compact table and - * allows more ranges to be merged */ - for (pass2 = 0; pass2 < 2; pass2++) { - if (pass2) { - /* Initialize to a single range */ - t_invlist = _add_range_to_invlist(t_invlist, 0, UV_MAX); + /* The inversion map is pushed; first the list. */ + invmap = MUTABLE_AV(newAV()); - /* In the second pass, we just have the single range */ - len = 1; - t_array = invlist_array(t_invlist); + SvREADONLY_on(t_invlist); + av_push(invmap, t_invlist); + + /* 2nd is the mapping */ + r_map_sv = newSVpvn((char *) r_map, len * sizeof(UV)); + SvREADONLY_on(r_map_sv); + av_push(invmap, r_map_sv); + + /* 3rd is the max possible expansion factor */ + temp_sv = newSVnv(max_expansion); + SvREADONLY_on(temp_sv); + av_push(invmap, temp_sv); + + /* Characters that are in the search list, but not in the replacement + * list are mapped to the final character in the replacement list */ + if (! del && r_count < t_count) { + temp_sv = newSVuv(final_map); + SvREADONLY_on(temp_sv); + av_push(invmap, temp_sv); } -/* As noted earlier, we convert EBCDIC code points to Unicode in the first pass - * so as to get the well-behaved length 1 vs length 2 boundary. Only code - * points below 256 differ between the two character sets in this regard. For - * these, we also can't have any ranges, as they have to be individually - * converted. */ -#ifdef EBCDIC -# define CP_ADJUST(x) ((pass2) ? (x) : NATIVE_TO_UNI(x)) -# define FORCE_RANGE_LEN_1(x) ((pass2) ? 0 : ((x) < 256)) -# define CP_SKIP(x) ((pass2) ? UVCHR_SKIP(x) : OFFUNISKIP(x)) +#ifdef USE_ITHREADS + cPADOPo->op_padix = pad_alloc(OP_TRANS, SVf_READONLY); + SvREFCNT_dec(PAD_SVl(cPADOPo->op_padix)); + PAD_SETSV(cPADOPo->op_padix, (SV *) invmap); + SvPADTMP_on(invmap); + SvREADONLY_on(invmap); #else -# define CP_ADJUST(x) (x) -# define FORCE_RANGE_LEN_1(x) 0 -# define CP_SKIP(x) UVCHR_SKIP(x) + cSVOPo->op_sv = (SV *) invmap; #endif - /* And the mapping of each of the ranges is initialized. Initially, - * everything is TR_UNLISTED. */ + } + else { + OPtrans_map *tbl; + unsigned short i; + + /* The OPtrans_map struct already contains one slot; hence the -1. */ + SSize_t struct_size = sizeof(OPtrans_map) + + (256 - 1 + 1)*sizeof(short); + + /* Non-utf8 case: set o->op_pv to point to a simple 256+ entry lookup + * table. Entries with the value TR_UNMAPPED indicate chars not to be + * translated, while TR_DELETE indicates a search char without a + * corresponding replacement char under /d. + * + * In addition, an extra slot at the end is used to store the final + * repeating char, or TR_R_EMPTY under an empty replacement list, or + * TR_DELETE under /d; which makes the runtime code easier. */ + + /* Indicate this is an op_pv */ + o->op_private &= ~OPpTRANS_USE_SVOP; + + tbl = (OPtrans_map*)PerlMemShared_calloc(struct_size, 1); + tbl->size = 256; + cPVOPo->op_pv = (char*)tbl; + for (i = 0; i < len; i++) { - r_map[i] = TR_UNLISTED; + STATIC_ASSERT_DECL(TR_SPECIAL_HANDLING == TR_DELETE); + short upper = i >= len - 1 ? 256 : (short) t_array[i+1]; + short to = (short) r_map[i]; + short j; + bool do_increment = TRUE; + + /* Any code points above our limit should be irrelevant */ + if (t_array[i] >= tbl->size) break; + + /* Set up the map */ + if (to == (short) TR_SPECIAL_HANDLING && ! del) { + to = (short) final_map; + do_increment = FALSE; + } + else if (to < 0) { + do_increment = FALSE; + } + + /* Create a map for everything in this range. The value increases + * except for the special cases */ + for (j = (short) t_array[i]; j < upper; j++) { + tbl->map[j] = to; + if (do_increment) to++; + } } - t = t0; - t_count = 0; - r = r0; - r_count = 0; - t_range_count = r_range_count = 0; + tbl->map[tbl->size] = del + ? (short) TR_DELETE + : (short) rlen + ? (short) final_map + : (short) TR_R_EMPTY; + DEBUG_y(PerlIO_printf(Perl_debug_log,"%s: %d\n", __FILE__, __LINE__)); + for (i = 0; i < tbl->size; i++) { + if (tbl->map[i] < 0) { + DEBUG_y(PerlIO_printf(Perl_debug_log," %02x=>%d", + (unsigned) i, tbl->map[i])); + } + else { + DEBUG_y(PerlIO_printf(Perl_debug_log," %02x=>%02x", + (unsigned) i, tbl->map[i])); + } + if ((i+1) % 8 == 0 || i + 1 == (short) tbl->size) { + DEBUG_y(PerlIO_printf(Perl_debug_log,"\n")); + } + } + DEBUG_y(PerlIO_printf(Perl_debug_log,"Final map 0x%x=>%02x\n", + (unsigned) tbl->size, tbl->map[tbl->size])); - DEBUG_y(PerlIO_printf(Perl_debug_log, "%s: %d:\ntstr=%s\n", - __FILE__, __LINE__, _byte_dump_string(t, tend - t, 0))); - DEBUG_y(PerlIO_printf(Perl_debug_log, "rstr=%s\n", - _byte_dump_string(r, rend - r, 0))); - DEBUG_y(PerlIO_printf(Perl_debug_log, "/c=%d; /s=%d; /d=%d\n", - complement, squash, del)); - DEBUG_y(invmap_dump(t_invlist, r_map)); + SvREFCNT_dec(t_invlist); - /* Now go through the search list constructing an inversion map. The - * input is not necessarily in any particular order. Making it an - * inversion map orders it, potentially simplifying, and makes it easy - * to deal with at run time. This is the only place in core that - * generates an inversion map; if others were introduced, it might be - * better to create general purpose routines to handle them. - * (Inversion maps are created in perl in other places.) - * - * An inversion map consists of two parallel arrays. One is - * essentially an inversion list: an ordered list of code points such - * that each element gives the first code point of a range of - * consecutive code points that map to the element in the other array - * that has the same index as this one (in other words, the - * corresponding element). Thus the range extends up to (but not - * including) the code point given by the next higher element. In a - * true inversion map, the corresponding element in the other array - * gives the mapping of the first code point in the range, with the - * understanding that the next higher code point in the inversion - * list's range will map to the next higher code point in the map. - * - * So if at element [i], let's say we have: - * - * t_invlist r_map - * [i] A a - * - * This means that A => a, B => b, C => c.... Let's say that the - * situation is such that: - * - * [i+1] L -1 - * - * This means the sequence that started at [i] stops at K => k. This - * illustrates that you need to look at the next element to find where - * a sequence stops. Except, the highest element in the inversion list - * begins a range that is understood to extend to the platform's - * infinity. - * - * This routine modifies traditional inversion maps to reserve two - * mappings: - * - * TR_UNLISTED (or -1) indicates that no code point in the range - * is listed in the tr/// searchlist. At runtime, these are - * always passed through unchanged. In the inversion map, all - * points in the range are mapped to -1, instead of increasing, - * like the 'L' in the example above. - * - * We start the parse with every code point mapped to this, and as - * we parse and find ones that are listed in the search list, we - * carve out ranges as we go along that override that. - * - * TR_SPECIAL_HANDLING (or -2) indicates that every code point in the - * range needs special handling. Again, all code points in the - * range are mapped to -2, instead of increasing. - * - * Under /d this value means the code point should be deleted from - * the transliteration when encountered. - * - * Otherwise, it marks that every code point in the range is to - * map to the final character in the replacement list. This - * happens only when the replacement list is shorter than the - * search one, so there are things in the search list that have no - * correspondence in the replacement list. For example, in - * tr/a-z/A/, 'A' is the final value, and the inversion map - * generated for this would be like this: - * \0 => -1 - * a => A - * b-z => -2 - * z+1 => -1 - * 'A' appears once, then the remainder of the range maps to -2. - * The use of -2 isn't strictly necessary, as an inversion map is - * capable of representing this situation, but not nearly so - * compactly, and this is actually quite commonly encountered. - * Indeed, the original design of this code used a full inversion - * map for this. But things like - * tr/\0-\x{FFFF}/A/ - * generated huge data structures, slowly, and the execution was - * also slow. So the current scheme was implemented. - * - * So, if the next element in our example is: - * - * [i+2] Q q - * - * Then all of L, M, N, O, and P map to TR_UNLISTED. If the next - * elements are - * - * [i+3] R z - * [i+4] S TR_UNLISTED - * - * Then Q => q; R => z; and S => TR_UNLISTED. If [i+4] (the 'S') is - * the final element in the arrays, every code point from S to infinity - * maps to TR_UNLISTED. - * - */ - /* Finish up range started in what otherwise would - * have been the final iteration */ - while (t < tend || t_range_count > 0) { - bool adjacent_to_range_above = FALSE; - bool adjacent_to_range_below = FALSE; - - bool merge_with_range_above = FALSE; - bool merge_with_range_below = FALSE; - - UV span, invmap_range_length_remaining; - SSize_t j; - Size_t i; - - /* If we are in the middle of processing a range in the 'target' - * side, the previous iteration has set us up. Otherwise, look at - * the next character in the search list */ - if (t_range_count <= 0) { - if (! tstr_utf8) { - - /* Here, not in the middle of a range, and not UTF-8. The - * next code point is the single byte where we're at */ - t_cp = CP_ADJUST(*t); - t_range_count = 1; - t++; - } - else { - Size_t t_char_len; +#if 0 /* code that added excess above-255 chars at the end of the table, in + case we ever want to not use the inversion map implementation for + this */ - /* Here, not in the middle of a range, and is UTF-8. The - * next code point is the next UTF-8 char in the input. We - * know the input is valid, because the toker constructed - * it */ - t_cp = CP_ADJUST(valid_utf8_to_uvchr(t, &t_char_len)); - t += t_char_len; + ASSUME(j <= rlen); + excess = rlen - j; - /* UTF-8 strings (only) have been parsed in toke.c to have - * ranges. See if the next byte indicates that this was - * the first element of a range. If so, get the final - * element and calculate the range size. If not, the range - * size is 1 */ - if ( t < tend && *t == RANGE_INDICATOR - && ! FORCE_RANGE_LEN_1(t_cp)) - { - t++; - t_range_count = valid_utf8_to_uvchr(t, &t_char_len) - - t_cp + 1; - t += t_char_len; - } - else { - t_range_count = 1; - } - } + if (excess) { + /* More replacement chars than search chars: + * store excess replacement chars at end of main table. + */ - /* Count the total number of listed code points * */ - t_count += t_range_count; - } + struct_size += excess; + tbl = (OPtrans_map*)PerlMemShared_realloc(tbl, + struct_size + excess * sizeof(short)); + tbl->size += excess; + cPVOPo->op_pv = (char*)tbl; - /* Similarly, get the next character in the replacement list */ - if (r_range_count <= 0) { - if (r >= rend) { + for (i = 0; i < excess; i++) + tbl->map[i + 256] = r[j+i]; + } + else { + /* no more replacement chars than search chars */ + } +#endif - /* But if we've exhausted the rhs, there is nothing to map - * to, except the special handling one, and we make the - * range the same size as the lhs one. */ - r_cp = TR_SPECIAL_HANDLING; - r_range_count = t_range_count; + } - if (! del) { - DEBUG_yv(PerlIO_printf(Perl_debug_log, - "final_map =%" UVXf "\n", final_map)); - } - } - else { - if (! rstr_utf8) { - r_cp = CP_ADJUST(*r); - r_range_count = 1; - r++; - } - else { - Size_t r_char_len; + DEBUG_y(PerlIO_printf(Perl_debug_log, + "/d=%d, /s=%d, /c=%d, identical=%d, grows=%d," + " use_svop=%d, can_force_utf8=%d,\nexpansion=%" NVgf "\n", + del, squash, complement, + cBOOL(o->op_private & OPpTRANS_IDENTICAL), + cBOOL(o->op_private & OPpTRANS_USE_SVOP), + cBOOL(o->op_private & OPpTRANS_GROWS), + cBOOL(o->op_private & OPpTRANS_CAN_FORCE_UTF8), + max_expansion)); - r_cp = CP_ADJUST(valid_utf8_to_uvchr(r, &r_char_len)); - r += r_char_len; - if ( r < rend && *r == RANGE_INDICATOR - && ! FORCE_RANGE_LEN_1(r_cp)) - { - r++; - r_range_count = valid_utf8_to_uvchr(r, - &r_char_len) - r_cp + 1; - r += r_char_len; - } - else { - r_range_count = 1; - } - } + Safefree(r_map); - if (r_cp == TR_SPECIAL_HANDLING) { - r_range_count = t_range_count; - } + if(del && rlen != 0 && r_count == t_count) { + Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Useless use of /d modifier in transliteration operator"); + } else if(r_count > t_count) { + Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Replacement list is longer than search list"); + } - /* This is the final character so far */ - final_map = r_cp + r_range_count - 1; + op_free(expr); + op_free(repl); - r_count += r_range_count; - } - } + return o; +} - /* Here, we have the next things ready in both sides. They are - * potentially ranges. We try to process as big a chunk as - * possible at once, but the lhs and rhs must be synchronized, so - * things like tr/A-Z/a-ij-z/ will need to be processed in 2 chunks - * */ - min_range_count = MIN(t_range_count, r_range_count); - /* Search the inversion list for the entry that contains the input - * code point . The inversion map was initialized to cover the - * entire range of possible inputs, so this should not fail. So - * the return value is the index into the list's array of the range - * that contains , that is, 'i' such that array[i] <= cp < - * array[i+1] */ - j = _invlist_search(t_invlist, t_cp); - assert(j >= 0); - i = j; +/* +=for apidoc newPMOP - /* Here, the data structure might look like: - * - * index t r Meaning - * [i-1] J j # J-L => j-l - * [i] M -1 # M => default; as do N, O, P, Q - * [i+1] R x # R => x, S => x+1, T => x+2 - * [i+2] U y # U => y, V => y+1, ... - * ... - * [-1] Z -1 # Z => default; as do Z+1, ... infinity - * - * where 'x' and 'y' above are not to be taken literally. - * - * The maximum chunk we can handle in this loop iteration, is the - * smallest of the three components: the lhs 't_', the rhs 'r_', - * and the remainder of the range in element [i]. (In pass 1, that - * range will have everything in it be of the same class; we can't - * cross into another class.) 'min_range_count' already contains - * the smallest of the first two values. The final one is - * irrelevant if the map is to the special indicator */ +Constructs, checks, and returns an op of any pattern matching type. +C is the opcode. C gives the eight bits of C +and, shifted up eight bits, the eight bits of C. - invmap_range_length_remaining = (i + 1 < len) - ? t_array[i+1] - t_cp - : IV_MAX - t_cp; - span = MAX(1, MIN(min_range_count, invmap_range_length_remaining)); +=cut +*/ - /* The end point of this chunk is where we are, plus the span, but - * never larger than the platform's infinity */ - t_cp_end = MIN(IV_MAX, t_cp + span - 1); +OP * +Perl_newPMOP(pTHX_ I32 type, I32 flags) +{ + PMOP *pmop; - if (r_cp == TR_SPECIAL_HANDLING) { + assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PMOP + || type == OP_CUSTOM); - /* If unmatched lhs code points map to the final map, use that - * value. This being set to TR_SPECIAL_HANDLING indicates that - * we don't have a final map: unmatched lhs code points are - * simply deleted */ - r_cp_end = (del) ? TR_SPECIAL_HANDLING : final_map; - } - else { - r_cp_end = MIN(IV_MAX, r_cp + span - 1); + NewOp(1101, pmop, 1, PMOP); + OpTYPE_set(pmop, type); + pmop->op_flags = (U8)flags; + pmop->op_private = (U8)(0 | (flags >> 8)); + if (PL_opargs[type] & OA_RETSCALAR) + scalar((OP *)pmop); - /* If something on the lhs is below 256, and something on the - * rhs is above, there is a potential mapping here across that - * boundary. Indeed the only way there isn't is if both sides - * start at the same point. That means they both cross at the - * same time. But otherwise one crosses before the other */ - if (t_cp < 256 && r_cp_end > 255 && r_cp != t_cp) { - can_force_utf8 = TRUE; - } - } + if (PL_hints & HINT_RE_TAINT) + pmop->op_pmflags |= PMf_RETAINT; +#ifdef USE_LOCALE_CTYPE + if (IN_LC_COMPILETIME(LC_CTYPE)) { + set_regex_charset(&(pmop->op_pmflags), REGEX_LOCALE_CHARSET); + } + else +#endif + if (IN_UNI_8_BIT) { + set_regex_charset(&(pmop->op_pmflags), REGEX_UNICODE_CHARSET); + } + if (PL_hints & HINT_RE_FLAGS) { + SV *reflags = Perl_refcounted_he_fetch_pvn(aTHX_ + PL_compiling.cop_hints_hash, STR_WITH_LEN("reflags"), 0, 0 + ); + if (reflags && SvOK(reflags)) pmop->op_pmflags |= SvIV(reflags); + reflags = Perl_refcounted_he_fetch_pvn(aTHX_ + PL_compiling.cop_hints_hash, STR_WITH_LEN("reflags_charset"), 0, 0 + ); + if (reflags && SvOK(reflags)) { + set_regex_charset(&(pmop->op_pmflags), (regex_charset)SvIV(reflags)); + } + } - /* If a character appears in the search list more than once, the - * 2nd and succeeding occurrences are ignored, so only do this - * range if haven't already processed this character. (The range - * has been set up so that all members in it will be of the same - * ilk) */ - if (r_map[i] == TR_UNLISTED) { - DEBUG_yv(PerlIO_printf(Perl_debug_log, - "Processing %" UVxf "-%" UVxf " => %" UVxf "-%" UVxf "\n", - t_cp, t_cp_end, r_cp, r_cp_end)); - /* This is the first definition for this chunk, hence is valid - * and needs to be processed. Here and in the comments below, - * we use the above sample data. The t_cp chunk must be any - * contiguous subset of M, N, O, P, and/or Q. - * - * In the first pass, calculate if there is any possible input - * string that has a character whose transliteration will be - * longer than it. If none, the transliteration may be done - * in-place, as it can't write over a so-far unread byte. - * Otherwise, a copy must first be made. This could be - * expensive for long inputs. - * - * In the first pass, the t_invlist has been partitioned so - * that all elements in any single range have the same number - * of bytes in their UTF-8 representations. And the r space is - * either a single byte, or a range of strictly monotonically - * increasing code points. So the final element in the range - * will be represented by no fewer bytes than the initial one. - * That means that if the final code point in the t range has - * at least as many bytes as the final code point in the r, - * then all code points in the t range have at least as many - * bytes as their corresponding r range element. But if that's - * not true, the transliteration of at least the final code - * point grows in length. As an example, suppose we had - * tr/\x{fff0}-\x{fff1}/\x{ffff}-\x{10000}/ - * The UTF-8 for all but 10000 occupies 3 bytes on ASCII - * platforms. We have deliberately set up the data structure - * so that any range in the lhs gets split into chunks for - * processing, such that every code point in a chunk has the - * same number of UTF-8 bytes. We only have to check the final - * code point in the rhs against any code point in the lhs. */ - if ( ! pass2 - && r_cp_end != TR_SPECIAL_HANDLING - && CP_SKIP(t_cp_end) < CP_SKIP(r_cp_end)) - { - /* Here, we will need to make a copy of the input string - * before doing the transliteration. The worst possible - * case is an expansion ratio of 14:1. This is rare, and - * we'd rather allocate only the necessary amount of extra - * memory for that copy. We can calculate the worst case - * for this particular transliteration is by keeping track - * of the expansion factor for each range. - * - * Consider tr/\xCB/\X{E000}/. The maximum expansion - * factor is 1 byte going to 3 if the target string is not - * UTF-8, but 2 bytes going to 3 if it is in UTF-8. We - * could pass two different values so doop could choose - * based on the UTF-8ness of the target. But khw thinks - * (perhaps wrongly) that is overkill. It is used only to - * make sure we malloc enough space. - * - * If no target string can force the result to be UTF-8, - * then we don't have to worry about the case of the target - * string not being UTF-8 */ - NV t_size = (can_force_utf8 && t_cp < 256) - ? 1 - : CP_SKIP(t_cp_end); - NV ratio = CP_SKIP(r_cp_end) / t_size; +#ifdef USE_ITHREADS + assert(SvPOK(PL_regex_pad[0])); + if (SvCUR(PL_regex_pad[0])) { + /* Pop off the "packed" IV from the end. */ + SV *const repointer_list = PL_regex_pad[0]; + const char *p = SvEND(repointer_list) - sizeof(IV); + const IV offset = *((IV*)p); - o->op_private |= OPpTRANS_GROWS; + assert(SvCUR(repointer_list) % sizeof(IV) == 0); - /* Now that we know it grows, we can keep track of the - * largest ratio */ - if (ratio > max_expansion) { - max_expansion = ratio; - DEBUG_y(PerlIO_printf(Perl_debug_log, - "New expansion factor: %" NVgf "\n", - max_expansion)); - } - } + SvEND_set(repointer_list, p); - /* The very first range is marked as adjacent to the - * non-existent range below it, as it causes things to "just - * work" (TradeMark) - * - * If the lowest code point in this chunk is M, it adjoins the - * J-L range */ - if (t_cp == t_array[i]) { - adjacent_to_range_below = TRUE; + pmop->op_pmoffset = offset; + /* This slot should be free, so assert this: */ + assert(PL_regex_pad[offset] == &PL_sv_undef); + } else { + SV * const repointer = &PL_sv_undef; + av_push(PL_regex_padav, repointer); + pmop->op_pmoffset = av_top_index(PL_regex_padav); + PL_regex_pad = AvARRAY(PL_regex_padav); + } +#endif - /* And if the map has the same offset from the beginning of - * the range as does this new code point (or both are for - * TR_SPECIAL_HANDLING), this chunk can be completely - * merged with the range below. EXCEPT, in the first pass, - * we don't merge ranges whose UTF-8 byte representations - * have different lengths, so that we can more easily - * detect if a replacement is longer than the source, that - * is if it 'grows'. But in the 2nd pass, there's no - * reason to not merge */ - if ( (i > 0 && ( pass2 - || CP_SKIP(t_array[i-1]) - == CP_SKIP(t_cp))) - && ( ( r_cp == TR_SPECIAL_HANDLING - && r_map[i-1] == TR_SPECIAL_HANDLING) - || ( r_cp != TR_SPECIAL_HANDLING - && r_cp - r_map[i-1] == t_cp - t_array[i-1]))) - { - merge_with_range_below = TRUE; - } - } + return CHECKOP(type, pmop); +} - /* Similarly, if the highest code point in this chunk is 'Q', - * it adjoins the range above, and if the map is suitable, can - * be merged with it */ - if ( t_cp_end >= IV_MAX - 1 - || ( i + 1 < len - && t_cp_end + 1 == t_array[i+1])) - { - adjacent_to_range_above = TRUE; - if (i + 1 < len) - if ( ( pass2 - || CP_SKIP(t_cp) == CP_SKIP(t_array[i+1])) - && ( ( r_cp == TR_SPECIAL_HANDLING - && r_map[i+1] == (UV) TR_SPECIAL_HANDLING) - || ( r_cp != TR_SPECIAL_HANDLING - && r_cp_end == r_map[i+1] - 1))) - { - merge_with_range_above = TRUE; - } - } +static void +S_set_haseval(pTHX) +{ + PADOFFSET i = 1; + PL_cv_has_eval = 1; + /* Any pad names in scope are potentially lvalues. */ + for (; i < PadnamelistMAXNAMED(PL_comppad_name); i++) { + PADNAME *pn = PAD_COMPNAME_SV(i); + if (!pn || !PadnameLEN(pn)) + continue; + if (PadnameOUTER(pn) || PadnameIN_SCOPE(pn, PL_cop_seqmax)) + S_mark_padname_lvalue(aTHX_ pn); + } +} - if (merge_with_range_below && merge_with_range_above) { +/* Given some sort of match op o, and an expression expr containing a + * pattern, either compile expr into a regex and attach it to o (if it's + * constant), or convert expr into a runtime regcomp op sequence (if it's + * not) + * + * Flags currently has 2 bits of meaning: + * 1: isreg indicates that the pattern is part of a regex construct, eg + * $x =~ /pattern/ or split /pattern/, as opposed to $x =~ $pattern or + * split "pattern", which aren't. In the former case, expr will be a list + * if the pattern contains more than one term (eg /a$b/). + * 2: The pattern is for a split. + * + * When the pattern has been compiled within a new anon CV (for + * qr/(?{...})/ ), then floor indicates the savestack level just before + * the new sub was created + * + * tr/// is also handled. + */ - /* Here the new chunk looks like M => m, ... Q => q; and - * the range above is like R => r, .... Thus, the [i-1] - * and [i+1] ranges should be seamlessly melded so the - * result looks like - * - * [i-1] J j # J-T => j-t - * [i] U y # U => y, V => y+1, ... - * ... - * [-1] Z -1 # Z => default; as do Z+1, ... infinity - */ - Move(t_array + i + 2, t_array + i, len - i - 2, UV); - Move(r_map + i + 2, r_map + i, len - i - 2, UV); - len -= 2; - invlist_set_len(t_invlist, - len, - *(get_invlist_offset_addr(t_invlist))); - } - else if (merge_with_range_below) { +OP * +Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl, UV flags, I32 floor) +{ + PMOP *pm; + LOGOP *rcop; + I32 repl_has_vars = 0; + bool is_trans = (o->op_type == OP_TRANS || o->op_type == OP_TRANSR); + bool is_compiletime; + bool has_code; + bool isreg = cBOOL(flags & 1); + bool is_split = cBOOL(flags & 2); - /* Here the new chunk looks like M => m, .... But either - * (or both) it doesn't extend all the way up through Q; or - * the range above doesn't start with R => r. */ - if (! adjacent_to_range_above) { + PERL_ARGS_ASSERT_PMRUNTIME; - /* In the first case, let's say the new chunk extends - * through O. We then want: - * - * [i-1] J j # J-O => j-o - * [i] P -1 # P => -1, Q => -1 - * [i+1] R x # R => x, S => x+1, T => x+2 - * [i+2] U y # U => y, V => y+1, ... - * ... - * [-1] Z -1 # Z => default; as do Z+1, ... - * infinity - */ - t_array[i] = t_cp_end + 1; - r_map[i] = TR_UNLISTED; - } - else { /* Adjoins the range above, but can't merge with it - (because 'x' is not the next map after q) */ - /* - * [i-1] J j # J-Q => j-q - * [i] R x # R => x, S => x+1, T => x+2 - * [i+1] U y # U => y, V => y+1, ... - * ... - * [-1] Z -1 # Z => default; as do Z+1, ... - * infinity - */ - - Move(t_array + i + 1, t_array + i, len - i - 1, UV); - Move(r_map + i + 1, r_map + i, len - i - 1, UV); - len--; - invlist_set_len(t_invlist, len, - *(get_invlist_offset_addr(t_invlist))); - } - } - else if (merge_with_range_above) { - - /* Here the new chunk ends with Q => q, and the range above - * must start with R => r, so the two can be merged. But - * either (or both) the new chunk doesn't extend all the - * way down to M; or the mapping of the final code point - * range below isn't m */ - if (! adjacent_to_range_below) { - - /* In the first case, let's assume the new chunk starts - * with P => p. Then, because it's merge-able with the - * range above, that range must be R => r. We want: - * - * [i-1] J j # J-L => j-l - * [i] M -1 # M => -1, N => -1 - * [i+1] P p # P-T => p-t - * [i+2] U y # U => y, V => y+1, ... - * ... - * [-1] Z -1 # Z => default; as do Z+1, ... - * infinity - */ - t_array[i+1] = t_cp; - r_map[i+1] = r_cp; - } - else { /* Adjoins the range below, but can't merge with it - */ - /* - * [i-1] J j # J-L => j-l - * [i] M x # M-T => x-5 .. x+2 - * [i+1] U y # U => y, V => y+1, ... - * ... - * [-1] Z -1 # Z => default; as do Z+1, ... - * infinity - */ - Move(t_array + i + 1, t_array + i, len - i - 1, UV); - Move(r_map + i + 1, r_map + i, len - i - 1, UV); - len--; - t_array[i] = t_cp; - r_map[i] = r_cp; - invlist_set_len(t_invlist, len, - *(get_invlist_offset_addr(t_invlist))); - } - } - else if (adjacent_to_range_below && adjacent_to_range_above) { - /* The new chunk completely fills the gap between the - * ranges on either side, but can't merge with either of - * them. - * - * [i-1] J j # J-L => j-l - * [i] M z # M => z, N => z+1 ... Q => z+4 - * [i+1] R x # R => x, S => x+1, T => x+2 - * [i+2] U y # U => y, V => y+1, ... - * ... - * [-1] Z -1 # Z => default; as do Z+1, ... infinity - */ - r_map[i] = r_cp; - } - else if (adjacent_to_range_below) { - /* The new chunk adjoins the range below, but not the range - * above, and can't merge. Let's assume the chunk ends at - * O. - * - * [i-1] J j # J-L => j-l - * [i] M z # M => z, N => z+1, O => z+2 - * [i+1] P -1 # P => -1, Q => -1 - * [i+2] R x # R => x, S => x+1, T => x+2 - * [i+3] U y # U => y, V => y+1, ... - * ... - * [-w] Z -1 # Z => default; as do Z+1, ... infinity - */ - invlist_extend(t_invlist, len + 1); - t_array = invlist_array(t_invlist); - Renew(r_map, len + 1, UV); + if (is_trans) { + return pmtrans(o, expr, repl); + } - Move(t_array + i + 1, t_array + i + 2, len - i - 1, UV); - Move(r_map + i + 1, r_map + i + 2, len - i - 1, UV); - r_map[i] = r_cp; - t_array[i+1] = t_cp_end + 1; - r_map[i+1] = TR_UNLISTED; - len++; - invlist_set_len(t_invlist, len, - *(get_invlist_offset_addr(t_invlist))); - } - else if (adjacent_to_range_above) { - /* The new chunk adjoins the range above, but not the range - * below, and can't merge. Let's assume the new chunk - * starts at O - * - * [i-1] J j # J-L => j-l - * [i] M -1 # M => default, N => default - * [i+1] O z # O => z, P => z+1, Q => z+2 - * [i+2] R x # R => x, S => x+1, T => x+2 - * [i+3] U y # U => y, V => y+1, ... - * ... - * [-1] Z -1 # Z => default; as do Z+1, ... infinity - */ - invlist_extend(t_invlist, len + 1); - t_array = invlist_array(t_invlist); - Renew(r_map, len + 1, UV); + /* find whether we have any runtime or code elements; + * at the same time, temporarily set the op_next of each DO block; + * then when we LINKLIST, this will cause the DO blocks to be excluded + * from the op_next chain (and from having LINKLIST recursively + * applied to them). We fix up the DOs specially later */ - Move(t_array + i + 1, t_array + i + 2, len - i - 1, UV); - Move(r_map + i + 1, r_map + i + 2, len - i - 1, UV); - t_array[i+1] = t_cp; - r_map[i+1] = r_cp; - len++; - invlist_set_len(t_invlist, len, - *(get_invlist_offset_addr(t_invlist))); + is_compiletime = 1; + has_code = 0; + if (expr->op_type == OP_LIST) { + OP *child; + for (child = cLISTOPx(expr)->op_first; child; child = OpSIBLING(child)) { + if (child->op_type == OP_NULL && (child->op_flags & OPf_SPECIAL)) { + has_code = 1; + assert(!child->op_next); + if (UNLIKELY(!OpHAS_SIBLING(child))) { + assert(PL_parser && PL_parser->error_count); + /* This can happen with qr/ (?{(^{})/. Just fake up + the op we were expecting to see, to avoid crashing + elsewhere. */ + op_sibling_splice(expr, child, 0, + newSVOP(OP_CONST, 0, &PL_sv_no)); } - else { - /* The new chunk adjoins neither the range above, nor the - * range below. Lets assume it is N..P => n..p - * - * [i-1] J j # J-L => j-l - * [i] M -1 # M => default - * [i+1] N n # N..P => n..p - * [i+2] Q -1 # Q => default - * [i+3] R x # R => x, S => x+1, T => x+2 - * [i+4] U y # U => y, V => y+1, ... - * ... - * [-1] Z -1 # Z => default; as do Z+1, ... infinity - */ - - DEBUG_yv(PerlIO_printf(Perl_debug_log, - "Before fixing up: len=%d, i=%d\n", - (int) len, (int) i)); - DEBUG_yv(invmap_dump(t_invlist, r_map)); - - invlist_extend(t_invlist, len + 2); - t_array = invlist_array(t_invlist); - Renew(r_map, len + 2, UV); - - Move(t_array + i + 1, - t_array + i + 2 + 1, len - i - (2 - 1), UV); - Move(r_map + i + 1, - r_map + i + 2 + 1, len - i - (2 - 1), UV); + child->op_next = OpSIBLING(child); + } + else if (child->op_type != OP_CONST && child->op_type != OP_PUSHMARK) + is_compiletime = 0; + } + } + else if (expr->op_type != OP_CONST) + is_compiletime = 0; - len += 2; - invlist_set_len(t_invlist, len, - *(get_invlist_offset_addr(t_invlist))); + LINKLIST(expr); - t_array[i+1] = t_cp; - r_map[i+1] = r_cp; + /* fix up DO blocks; treat each one as a separate little sub; + * also, mark any arrays as LIST/REF */ - t_array[i+2] = t_cp_end + 1; - r_map[i+2] = TR_UNLISTED; - } - DEBUG_yv(PerlIO_printf(Perl_debug_log, - "After iteration: span=%" UVuf ", t_range_count=%" - UVuf " r_range_count=%" UVuf "\n", - span, t_range_count, r_range_count)); - DEBUG_yv(invmap_dump(t_invlist, r_map)); - } /* End of this chunk needs to be processed */ + if (expr->op_type == OP_LIST) { + OP *child; + for (child = cLISTOPx(expr)->op_first; child; child = OpSIBLING(child)) { - /* Done with this chunk. */ - t_cp += span; - if (t_cp >= IV_MAX) { - break; + if (child->op_type == OP_PADAV || child->op_type == OP_RV2AV) { + assert( !(child->op_flags & OPf_WANT)); + /* push the array rather than its contents. The regex + * engine will retrieve and join the elements later */ + child->op_flags |= (OPf_WANT_LIST | OPf_REF); + continue; } - t_range_count -= span; - if (r_cp != TR_SPECIAL_HANDLING) { - r_cp += span; - r_range_count -= span; + + if (!(child->op_type == OP_NULL && (child->op_flags & OPf_SPECIAL))) + continue; + child->op_next = NULL; /* undo temporary hack from above */ + scalar(child); + LINKLIST(child); + if (cLISTOPx(child)->op_first->op_type == OP_LEAVE) { + LISTOP *leaveop = cLISTOPx(cLISTOPx(child)->op_first); + /* skip ENTER */ + assert(leaveop->op_first->op_type == OP_ENTER); + assert(OpHAS_SIBLING(leaveop->op_first)); + child->op_next = OpSIBLING(leaveop->op_first); + /* skip leave */ + assert(leaveop->op_flags & OPf_KIDS); + assert(leaveop->op_last->op_next == (OP*)leaveop); + leaveop->op_next = NULL; /* stop on last op */ + op_null((OP*)leaveop); } else { - r_range_count = 0; + /* skip SCOPE */ + OP *scope = cLISTOPx(child)->op_first; + assert(scope->op_type == OP_SCOPE); + assert(scope->op_flags & OPf_KIDS); + scope->op_next = NULL; /* stop on last op */ + op_null(scope); } - } /* End of loop through the search list */ + /* XXX optimize_optree() must be called on o before + * CALL_PEEP(), as currently S_maybe_multiconcat() can't + * currently cope with a peephole-optimised optree. + * Calling optimize_optree() here ensures that condition + * is met, but may mean optimize_optree() is applied + * to the same optree later (where hopefully it won't do any + * harm as it can't convert an op to multiconcat if it's + * already been converted */ + optimize_optree(child); - /* We don't need an exact count, but we do need to know if there is - * anything left over in the replacement list. So, just assume it's - * one byte per character */ - if (rend > r) { - r_count++; - } - } /* End of passes */ - - SvREFCNT_dec(inverted_tstr); - - DEBUG_y(PerlIO_printf(Perl_debug_log, "After everything: \n")); - DEBUG_y(invmap_dump(t_invlist, r_map)); - - /* We now have normalized the input into an inversion map. - * - * See if the lhs and rhs are equivalent. If so, this tr/// is a no-op - * except for the count, and streamlined runtime code can be used */ - if (!del && !squash) { - - /* They are identical if they point to same address, or if everything - * maps to UNLISTED or to itself. This catches things that not looking - * at the normalized inversion map doesn't catch, like tr/aa/ab/ or - * tr/\x{100}-\x{104}/\x{100}-\x{102}\x{103}-\x{104} */ - if (r0 != t0) { - for (i = 0; i < len; i++) { - if (r_map[i] != TR_UNLISTED && r_map[i] != t_array[i]) { - goto done_identical_check; - } - } + /* have to peep the DOs individually as we've removed it from + * the op_next chain */ + CALL_PEEP(child); + op_prune_chain_head(&(child->op_next)); + if (is_compiletime) + /* runtime finalizes as part of finalizing whole tree */ + finalize_optree(child); } - - /* Here have gone through entire list, and didn't find any - * non-identical mappings */ - o->op_private |= OPpTRANS_IDENTICAL; - - done_identical_check: ; + } + else if (expr->op_type == OP_PADAV || expr->op_type == OP_RV2AV) { + assert( !(expr->op_flags & OPf_WANT)); + /* push the array rather than its contents. The regex + * engine will retrieve and join the elements later */ + expr->op_flags |= (OPf_WANT_LIST | OPf_REF); } - t_array = invlist_array(t_invlist); - - /* If has components above 255, we generally need to use the inversion map - * implementation */ - if ( can_force_utf8 - || ( len > 0 - && t_array[len-1] > 255 - /* If the final range is 0x100-INFINITY and is a special - * mapping, the table implementation can handle it */ - && ! ( t_array[len-1] == 256 - && ( r_map[len-1] == TR_UNLISTED - || r_map[len-1] == TR_SPECIAL_HANDLING)))) - { - SV* r_map_sv; + PL_hints |= HINT_BLOCK_SCOPE; + pm = cPMOPo; + assert(floor==0 || (pm->op_pmflags & PMf_HAS_CV)); - /* A UTF-8 op is generated, indicated by this flag. This op is an - * sv_op */ - o->op_private |= OPpTRANS_USE_SVOP; + if (is_compiletime) { + U32 rx_flags = pm->op_pmflags & RXf_PMf_COMPILETIME; + regexp_engine const *eng = current_re_engine(); - if (can_force_utf8) { - o->op_private |= OPpTRANS_CAN_FORCE_UTF8; + if (is_split) { + /* make engine handle split ' ' specially */ + pm->op_pmflags |= PMf_SPLIT; + rx_flags |= RXf_SPLIT; } - /* The inversion map is pushed; first the list. */ - invmap = MUTABLE_AV(newAV()); - av_push(invmap, t_invlist); - - /* 2nd is the mapping */ - r_map_sv = newSVpvn((char *) r_map, len * sizeof(UV)); - av_push(invmap, r_map_sv); - - /* 3rd is the max possible expansion factor */ - av_push(invmap, newSVnv(max_expansion)); - - /* Characters that are in the search list, but not in the replacement - * list are mapped to the final character in the replacement list */ - if (! del && r_count < t_count) { - av_push(invmap, newSVuv(final_map)); - } + if (!has_code || !eng->op_comp) { + /* compile-time simple constant pattern */ -#ifdef USE_ITHREADS - cPADOPo->op_padix = pad_alloc(OP_TRANS, SVf_READONLY); - SvREFCNT_dec(PAD_SVl(cPADOPo->op_padix)); - PAD_SETSV(cPADOPo->op_padix, (SV *) invmap); - SvPADTMP_on(invmap); - SvREADONLY_on(invmap); -#else - cSVOPo->op_sv = (SV *) invmap; + if ((pm->op_pmflags & PMf_HAS_CV) && !has_code) { + /* whoops! we guessed that a qr// had a code block, but we + * were wrong (e.g. /[(?{}]/ ). Throw away the PL_compcv + * that isn't required now. Note that we have to be pretty + * confident that nothing used that CV's pad while the + * regex was parsed, except maybe op targets for \Q etc. + * If there were any op targets, though, they should have + * been stolen by constant folding. + */ +#ifdef DEBUGGING + SSize_t i = 0; + assert(PadnamelistMAXNAMED(PL_comppad_name) == 0); + while (++i <= AvFILLp(PL_comppad)) { +# ifdef USE_PAD_RESET + /* under USE_PAD_RESET, pad swipe replaces a swiped + * folded constant with a fresh padtmp */ + assert(!PL_curpad[i] || SvPADTMP(PL_curpad[i])); +# else + assert(!PL_curpad[i]); +# endif + } #endif + /* This LEAVE_SCOPE will restore PL_compcv to point to the + * outer CV (the one whose slab holds the pm op). The + * inner CV (which holds expr) will be freed later, once + * all the entries on the parse stack have been popped on + * return from this function. Which is why its safe to + * call op_free(expr) below. + */ + LEAVE_SCOPE(floor); + pm->op_pmflags &= ~PMf_HAS_CV; + } - } - else { - OPtrans_map *tbl; - unsigned short i; - - /* The OPtrans_map struct already contains one slot; hence the -1. */ - SSize_t struct_size = sizeof(OPtrans_map) - + (256 - 1 + 1)*sizeof(short); - - /* Non-utf8 case: set o->op_pv to point to a simple 256+ entry lookup - * table. Entries with the value TR_UNMAPPED indicate chars not to be - * translated, while TR_DELETE indicates a search char without a - * corresponding replacement char under /d. - * - * In addition, an extra slot at the end is used to store the final - * repeating char, or TR_R_EMPTY under an empty replacement list, or - * TR_DELETE under /d; which makes the runtime code easier. - */ - - /* Indicate this is an op_pv */ - o->op_private &= ~OPpTRANS_USE_SVOP; - - tbl = (OPtrans_map*)PerlMemShared_calloc(struct_size, 1); - tbl->size = 256; - cPVOPo->op_pv = (char*)tbl; + /* Skip compiling if parser found an error for this pattern */ + if (pm->op_pmflags & PMf_HAS_ERROR) { + return o; + } - for (i = 0; i < len; i++) { - STATIC_ASSERT_DECL(TR_SPECIAL_HANDLING == TR_DELETE); - short upper = i >= len - 1 ? 256 : (short) t_array[i+1]; - short to = (short) r_map[i]; - short j; - bool do_increment = TRUE; + PM_SETRE(pm, + eng->op_comp + ? eng->op_comp(aTHX_ NULL, 0, expr, eng, NULL, NULL, + rx_flags, pm->op_pmflags) + : Perl_re_op_compile(aTHX_ NULL, 0, expr, eng, NULL, NULL, + rx_flags, pm->op_pmflags) + ); + op_free(expr); + } + else { + /* compile-time pattern that includes literal code blocks */ - /* Any code points above our limit should be irrelevant */ - if (t_array[i] >= tbl->size) break; + REGEXP* re; - /* Set up the map */ - if (to == (short) TR_SPECIAL_HANDLING && ! del) { - to = (short) final_map; - do_increment = FALSE; - } - else if (to < 0) { - do_increment = FALSE; + /* Skip compiling if parser found an error for this pattern */ + if (pm->op_pmflags & PMf_HAS_ERROR) { + return o; } - /* Create a map for everything in this range. The value increases - * except for the special cases */ - for (j = (short) t_array[i]; j < upper; j++) { - tbl->map[j] = to; - if (do_increment) to++; - } - } + re = eng->op_comp(aTHX_ NULL, 0, expr, eng, NULL, NULL, + rx_flags, + (pm->op_pmflags | + ((PL_hints & HINT_RE_EVAL) ? PMf_USE_RE_EVAL : 0)) + ); + PM_SETRE(pm, re); + if (pm->op_pmflags & PMf_HAS_CV) { + CV *cv; + /* this QR op (and the anon sub we embed it in) is never + * actually executed. It's just a placeholder where we can + * squirrel away expr in op_code_list without the peephole + * optimiser etc processing it for a second time */ + OP *qr = newPMOP(OP_QR, 0); + cPMOPx(qr)->op_code_list = expr; - tbl->map[tbl->size] = del - ? (short) TR_DELETE - : (short) rlen - ? (short) final_map - : (short) TR_R_EMPTY; - DEBUG_y(PerlIO_printf(Perl_debug_log,"%s: %d\n", __FILE__, __LINE__)); - for (i = 0; i < tbl->size; i++) { - if (tbl->map[i] < 0) { - DEBUG_y(PerlIO_printf(Perl_debug_log," %02x=>%d", - (unsigned) i, tbl->map[i])); + /* handle the implicit sub{} wrapped round the qr/(?{..})/ */ + SvREFCNT_inc_simple_void(PL_compcv); + cv = newATTRSUB(floor, 0, NULL, NULL, qr); + ReANY(re)->qr_anoncv = cv; + + /* attach the anon CV to the pad so that + * pad_fixup_inner_anons() can find it */ + (void)pad_add_anon(cv, o->op_type); + SvREFCNT_inc_simple_void(cv); } else { - DEBUG_y(PerlIO_printf(Perl_debug_log," %02x=>%02x", - (unsigned) i, tbl->map[i])); - } - if ((i+1) % 8 == 0 || i + 1 == (short) tbl->size) { - DEBUG_y(PerlIO_printf(Perl_debug_log,"\n")); + pm->op_code_list = expr; } } - DEBUG_y(PerlIO_printf(Perl_debug_log,"Final map 0x%x=>%02x\n", - (unsigned) tbl->size, tbl->map[tbl->size])); + } + else { + /* runtime pattern: build chain of regcomp etc ops */ + bool reglist; + PADOFFSET cv_targ = 0; - SvREFCNT_dec(t_invlist); + reglist = isreg && expr->op_type == OP_LIST; + if (reglist) + op_null(expr); -#if 0 /* code that added excess above-255 chars at the end of the table, in - case we ever want to not use the inversion map implementation for - this */ + if (has_code) { + pm->op_code_list = expr; + /* don't free op_code_list; its ops are embedded elsewhere too */ + pm->op_pmflags |= PMf_CODELIST_PRIVATE; + } - ASSUME(j <= rlen); - excess = rlen - j; + if (is_split) + /* make engine handle split ' ' specially */ + pm->op_pmflags |= PMf_SPLIT; - if (excess) { - /* More replacement chars than search chars: - * store excess replacement chars at end of main table. - */ + /* the OP_REGCMAYBE is a placeholder in the non-threaded case + * to allow its op_next to be pointed past the regcomp and + * preceding stacking ops; + * OP_REGCRESET is there to reset taint before executing the + * stacking ops */ + if (pm->op_pmflags & PMf_KEEP || TAINTING_get) + expr = newUNOP((TAINTING_get ? OP_REGCRESET : OP_REGCMAYBE),0,expr); - struct_size += excess; - tbl = (OPtrans_map*)PerlMemShared_realloc(tbl, - struct_size + excess * sizeof(short)); - tbl->size += excess; - cPVOPo->op_pv = (char*)tbl; + if (pm->op_pmflags & PMf_HAS_CV) { + /* we have a runtime qr with literal code. This means + * that the qr// has been wrapped in a new CV, which + * means that runtime consts, vars etc will have been compiled + * against a new pad. So... we need to execute those ops + * within the environment of the new CV. So wrap them in a call + * to a new anon sub. i.e. for + * + * qr/a$b(?{...})/, + * + * we build an anon sub that looks like + * + * sub { "a", $b, '(?{...})' } + * + * and call it, passing the returned list to regcomp. + * Or to put it another way, the list of ops that get executed + * are: + * + * normal PMf_HAS_CV + * ------ ------------------- + * pushmark (for regcomp) + * pushmark (for entersub) + * anoncode + * entersub + * regcreset regcreset + * pushmark pushmark + * const("a") const("a") + * gvsv(b) gvsv(b) + * const("(?{...})") const("(?{...})") + * leavesub + * regcomp regcomp + */ - for (i = 0; i < excess; i++) - tbl->map[i + 256] = r[j+i]; + SvREFCNT_inc_simple_void(PL_compcv); + CvLVALUE_on(PL_compcv); + /* these lines are just an unrolled newANONATTRSUB */ + expr = newSVOP(OP_ANONCODE, OPf_REF, + MUTABLE_SV(newATTRSUB(floor, 0, NULL, NULL, expr))); + cv_targ = expr->op_targ; + + expr = list(op_force_list(newUNOP(OP_ENTERSUB, 0, scalar(expr)))); + } + + rcop = alloc_LOGOP(OP_REGCOMP, scalar(expr), o); + rcop->op_flags |= ((PL_hints & HINT_RE_EVAL) ? OPf_SPECIAL : 0) + | (reglist ? OPf_STACKED : 0); + rcop->op_targ = cv_targ; + + /* /$x/ may cause an eval, since $x might be qr/(?{..})/ */ + if (PL_hints & HINT_RE_EVAL) + S_set_haseval(aTHX); + + /* establish postfix order */ + if (expr->op_type == OP_REGCRESET || expr->op_type == OP_REGCMAYBE) { + LINKLIST(expr); + rcop->op_next = expr; + cUNOPx(expr)->op_first->op_next = (OP*)rcop; } else { - /* no more replacement chars than search chars */ + rcop->op_next = LINKLIST(expr); + expr->op_next = (OP*)rcop; } -#endif + op_prepend_elem(o->op_type, scalar((OP*)rcop), o); } - DEBUG_y(PerlIO_printf(Perl_debug_log, - "/d=%d, /s=%d, /c=%d, identical=%d, grows=%d," - " use_svop=%d, can_force_utf8=%d,\nexpansion=%" NVgf "\n", - del, squash, complement, - cBOOL(o->op_private & OPpTRANS_IDENTICAL), - cBOOL(o->op_private & OPpTRANS_USE_SVOP), - cBOOL(o->op_private & OPpTRANS_GROWS), - cBOOL(o->op_private & OPpTRANS_CAN_FORCE_UTF8), - max_expansion)); + if (repl) { + OP *curop = repl; + bool konst; + /* If we are looking at s//.../e with a single statement, get past + the implicit do{}. */ + if (curop->op_type == OP_NULL && curop->op_flags & OPf_KIDS + && cUNOPx(curop)->op_first->op_type == OP_SCOPE + && cUNOPx(curop)->op_first->op_flags & OPf_KIDS) + { + OP *sib; + OP *kid = cUNOPx(cUNOPx(curop)->op_first)->op_first; + if (kid->op_type == OP_NULL && (sib = OpSIBLING(kid)) + && !OpHAS_SIBLING(sib)) + curop = sib; + } + if (curop->op_type == OP_CONST) + konst = TRUE; + else if (( (curop->op_type == OP_RV2SV || + curop->op_type == OP_RV2AV || + curop->op_type == OP_RV2HV || + curop->op_type == OP_RV2GV) + && cUNOPx(curop)->op_first + && cUNOPx(curop)->op_first->op_type == OP_GV ) + || curop->op_type == OP_PADSV + || curop->op_type == OP_PADAV + || curop->op_type == OP_PADHV + || curop->op_type == OP_PADANY) { + repl_has_vars = 1; + konst = TRUE; + } + else konst = FALSE; + if (konst + && !(repl_has_vars + && (!PM_GETRE(pm) + || !RX_PRELEN(PM_GETRE(pm)) + || RX_EXTFLAGS(PM_GETRE(pm)) & RXf_EVAL_SEEN))) + { + pm->op_pmflags |= PMf_CONST; /* const for long enough */ + op_prepend_elem(o->op_type, scalar(repl), o); + } + else { + rcop = alloc_LOGOP(OP_SUBSTCONT, scalar(repl), o); + rcop->op_private = 1; - Safefree(r_map); + /* establish postfix order */ + rcop->op_next = LINKLIST(repl); + repl->op_next = (OP*)rcop; - if(del && rlen != 0 && r_count == t_count) { - Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Useless use of /d modifier in transliteration operator"); - } else if(r_count > t_count) { - Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Replacement list is longer than search list"); + pm->op_pmreplrootu.op_pmreplroot = scalar((OP*)rcop); + assert(!(pm->op_pmflags & PMf_ONCE)); + pm->op_pmstashstartu.op_pmreplstart = LINKLIST(rcop); + rcop->op_next = 0; + } } - op_free(expr); - op_free(repl); - - return o; + return (OP*)pm; } - /* -=for apidoc newPMOP +=for apidoc newSVOP -Constructs, checks, and returns an op of any pattern matching type. -C is the opcode. C gives the eight bits of C -and, shifted up eight bits, the eight bits of C. +Constructs, checks, and returns an op of any type that involves an +embedded SV. C is the opcode. C gives the eight bits +of C. C gives the SV to embed in the op; this function +takes ownership of one reference to it. =cut */ OP * -Perl_newPMOP(pTHX_ I32 type, I32 flags) +Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv) { - PMOP *pmop; + SVOP *svop; - assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PMOP + PERL_ARGS_ASSERT_NEWSVOP; + + /* OP_RUNCV is allowed specially so rpeep has room to convert it into an + * OP_CONST */ + assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP + || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP + || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP + || type == OP_RUNCV || type == OP_CUSTOM); - NewOp(1101, pmop, 1, PMOP); - OpTYPE_set(pmop, type); - pmop->op_flags = (U8)flags; - pmop->op_private = (U8)(0 | (flags >> 8)); + NewOp(1101, svop, 1, SVOP); + OpTYPE_set(svop, type); + svop->op_sv = sv; + svop->op_next = (OP*)svop; + svop->op_flags = (U8)flags; + svop->op_private = (U8)(0 | (flags >> 8)); if (PL_opargs[type] & OA_RETSCALAR) - scalar((OP *)pmop); + scalar((OP*)svop); + if (PL_opargs[type] & OA_TARGET) + svop->op_targ = pad_alloc(type, SVs_PADTMP); + return CHECKOP(type, svop); +} - if (PL_hints & HINT_RE_TAINT) - pmop->op_pmflags |= PMf_RETAINT; -#ifdef USE_LOCALE_CTYPE - if (IN_LC_COMPILETIME(LC_CTYPE)) { - set_regex_charset(&(pmop->op_pmflags), REGEX_LOCALE_CHARSET); - } - else -#endif - if (IN_UNI_8_BIT) { - set_regex_charset(&(pmop->op_pmflags), REGEX_UNICODE_CHARSET); - } - if (PL_hints & HINT_RE_FLAGS) { - SV *reflags = Perl_refcounted_he_fetch_pvn(aTHX_ - PL_compiling.cop_hints_hash, STR_WITH_LEN("reflags"), 0, 0 - ); - if (reflags && SvOK(reflags)) pmop->op_pmflags |= SvIV(reflags); - reflags = Perl_refcounted_he_fetch_pvn(aTHX_ - PL_compiling.cop_hints_hash, STR_WITH_LEN("reflags_charset"), 0, 0 - ); - if (reflags && SvOK(reflags)) { - set_regex_charset(&(pmop->op_pmflags), (regex_charset)SvIV(reflags)); - } - } +/* +=for apidoc newDEFSVOP + +Constructs and returns an op to access C<$_>. + +=cut +*/ +OP * +Perl_newDEFSVOP(pTHX) +{ + return newSVREF(newGVOP(OP_GV, 0, PL_defgv)); +} #ifdef USE_ITHREADS - assert(SvPOK(PL_regex_pad[0])); - if (SvCUR(PL_regex_pad[0])) { - /* Pop off the "packed" IV from the end. */ - SV *const repointer_list = PL_regex_pad[0]; - const char *p = SvEND(repointer_list) - sizeof(IV); - const IV offset = *((IV*)p); - assert(SvCUR(repointer_list) % sizeof(IV) == 0); +/* +=for apidoc newPADOP - SvEND_set(repointer_list, p); +Constructs, checks, and returns an op of any type that involves a +reference to a pad element. C is the opcode. C gives the +eight bits of C. A pad slot is automatically allocated, and +is populated with C; this function takes ownership of one reference +to it. - pmop->op_pmoffset = offset; - /* This slot should be free, so assert this: */ - assert(PL_regex_pad[offset] == &PL_sv_undef); - } else { - SV * const repointer = &PL_sv_undef; - av_push(PL_regex_padav, repointer); - pmop->op_pmoffset = av_top_index(PL_regex_padav); - PL_regex_pad = AvARRAY(PL_regex_padav); - } -#endif +This function only exists if Perl has been compiled to use ithreads. - return CHECKOP(type, pmop); -} +=cut +*/ -static void -S_set_haseval(pTHX) +OP * +Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv) { - PADOFFSET i = 1; - PL_cv_has_eval = 1; - /* Any pad names in scope are potentially lvalues. */ - for (; i < PadnamelistMAXNAMED(PL_comppad_name); i++) { - PADNAME *pn = PAD_COMPNAME_SV(i); - if (!pn || !PadnameLEN(pn)) - continue; - if (PadnameOUTER(pn) || PadnameIN_SCOPE(pn, PL_cop_seqmax)) - S_mark_padname_lvalue(aTHX_ pn); - } -} + PADOP *padop; -/* Given some sort of match op o, and an expression expr containing a - * pattern, either compile expr into a regex and attach it to o (if it's - * constant), or convert expr into a runtime regcomp op sequence (if it's - * not) - * - * Flags currently has 2 bits of meaning: - * 1: isreg indicates that the pattern is part of a regex construct, eg - * $x =~ /pattern/ or split /pattern/, as opposed to $x =~ $pattern or - * split "pattern", which aren't. In the former case, expr will be a list - * if the pattern contains more than one term (eg /a$b/). - * 2: The pattern is for a split. - * - * When the pattern has been compiled within a new anon CV (for - * qr/(?{...})/ ), then floor indicates the savestack level just before - * the new sub was created - * - * tr/// is also handled. - */ + PERL_ARGS_ASSERT_NEWPADOP; -OP * -Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl, UV flags, I32 floor) -{ - PMOP *pm; - LOGOP *rcop; - I32 repl_has_vars = 0; - bool is_trans = (o->op_type == OP_TRANS || o->op_type == OP_TRANSR); - bool is_compiletime; - bool has_code; - bool isreg = cBOOL(flags & 1); - bool is_split = cBOOL(flags & 2); + assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP + || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP + || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP + || type == OP_CUSTOM); - PERL_ARGS_ASSERT_PMRUNTIME; + NewOp(1101, padop, 1, PADOP); + OpTYPE_set(padop, type); + padop->op_padix = + pad_alloc(type, isGV(sv) ? SVf_READONLY : SVs_PADTMP); + SvREFCNT_dec(PAD_SVl(padop->op_padix)); + PAD_SETSV(padop->op_padix, sv); + assert(sv); + padop->op_next = (OP*)padop; + padop->op_flags = (U8)flags; + if (PL_opargs[type] & OA_RETSCALAR) + scalar((OP*)padop); + if (PL_opargs[type] & OA_TARGET) + padop->op_targ = pad_alloc(type, SVs_PADTMP); + return CHECKOP(type, padop); +} - if (is_trans) { - return pmtrans(o, expr, repl); - } +#endif /* USE_ITHREADS */ - /* find whether we have any runtime or code elements; - * at the same time, temporarily set the op_next of each DO block; - * then when we LINKLIST, this will cause the DO blocks to be excluded - * from the op_next chain (and from having LINKLIST recursively - * applied to them). We fix up the DOs specially later */ +/* +=for apidoc newGVOP - is_compiletime = 1; - has_code = 0; - if (expr->op_type == OP_LIST) { - OP *child; - for (child = cLISTOPx(expr)->op_first; child; child = OpSIBLING(child)) { - if (child->op_type == OP_NULL && (child->op_flags & OPf_SPECIAL)) { - has_code = 1; - assert(!child->op_next); - if (UNLIKELY(!OpHAS_SIBLING(child))) { - assert(PL_parser && PL_parser->error_count); - /* This can happen with qr/ (?{(^{})/. Just fake up - the op we were expecting to see, to avoid crashing - elsewhere. */ - op_sibling_splice(expr, child, 0, - newSVOP(OP_CONST, 0, &PL_sv_no)); - } - child->op_next = OpSIBLING(child); - } - else if (child->op_type != OP_CONST && child->op_type != OP_PUSHMARK) - is_compiletime = 0; - } - } - else if (expr->op_type != OP_CONST) - is_compiletime = 0; +Constructs, checks, and returns an op of any type that involves an +embedded reference to a GV. C is the opcode. C gives the +eight bits of C. C identifies the GV that the op should +reference; calling this function does not transfer ownership of any +reference to it. - LINKLIST(expr); +=cut +*/ - /* fix up DO blocks; treat each one as a separate little sub; - * also, mark any arrays as LIST/REF */ +OP * +Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv) +{ + PERL_ARGS_ASSERT_NEWGVOP; - if (expr->op_type == OP_LIST) { - OP *child; - for (child = cLISTOPx(expr)->op_first; child; child = OpSIBLING(child)) { +#ifdef USE_ITHREADS + return newPADOP(type, flags, SvREFCNT_inc_simple_NN(gv)); +#else + return newSVOP(type, flags, SvREFCNT_inc_simple_NN(gv)); +#endif +} - if (child->op_type == OP_PADAV || child->op_type == OP_RV2AV) { - assert( !(child->op_flags & OPf_WANT)); - /* push the array rather than its contents. The regex - * engine will retrieve and join the elements later */ - child->op_flags |= (OPf_WANT_LIST | OPf_REF); - continue; - } +/* +=for apidoc newPVOP - if (!(child->op_type == OP_NULL && (child->op_flags & OPf_SPECIAL))) - continue; - child->op_next = NULL; /* undo temporary hack from above */ - scalar(child); - LINKLIST(child); - if (cLISTOPx(child)->op_first->op_type == OP_LEAVE) { - LISTOP *leaveop = cLISTOPx(cLISTOPx(child)->op_first); - /* skip ENTER */ - assert(leaveop->op_first->op_type == OP_ENTER); - assert(OpHAS_SIBLING(leaveop->op_first)); - child->op_next = OpSIBLING(leaveop->op_first); - /* skip leave */ - assert(leaveop->op_flags & OPf_KIDS); - assert(leaveop->op_last->op_next == (OP*)leaveop); - leaveop->op_next = NULL; /* stop on last op */ - op_null((OP*)leaveop); - } - else { - /* skip SCOPE */ - OP *scope = cLISTOPx(child)->op_first; - assert(scope->op_type == OP_SCOPE); - assert(scope->op_flags & OPf_KIDS); - scope->op_next = NULL; /* stop on last op */ - op_null(scope); - } +Constructs, checks, and returns an op of any type that involves an +embedded C-level pointer (PV). C is the opcode. C gives +the eight bits of C. C supplies the C-level pointer. +Depending on the op type, the memory referenced by C may be freed +when the op is destroyed. If the op is of a freeing type, C must +have been allocated using C. - /* XXX optimize_optree() must be called on o before - * CALL_PEEP(), as currently S_maybe_multiconcat() can't - * currently cope with a peephole-optimised optree. - * Calling optimize_optree() here ensures that condition - * is met, but may mean optimize_optree() is applied - * to the same optree later (where hopefully it won't do any - * harm as it can't convert an op to multiconcat if it's - * already been converted */ - optimize_optree(child); +=cut +*/ - /* have to peep the DOs individually as we've removed it from - * the op_next chain */ - CALL_PEEP(child); - S_prune_chain_head(&(child->op_next)); - if (is_compiletime) - /* runtime finalizes as part of finalizing whole tree */ - finalize_optree(child); - } - } - else if (expr->op_type == OP_PADAV || expr->op_type == OP_RV2AV) { - assert( !(expr->op_flags & OPf_WANT)); - /* push the array rather than its contents. The regex - * engine will retrieve and join the elements later */ - expr->op_flags |= (OPf_WANT_LIST | OPf_REF); - } +OP * +Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv) +{ + const bool utf8 = cBOOL(flags & SVf_UTF8); + PVOP *pvop; - PL_hints |= HINT_BLOCK_SCOPE; - pm = (PMOP*)o; - assert(floor==0 || (pm->op_pmflags & PMf_HAS_CV)); + flags &= ~SVf_UTF8; - if (is_compiletime) { - U32 rx_flags = pm->op_pmflags & RXf_PMf_COMPILETIME; - regexp_engine const *eng = current_re_engine(); + assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP + || type == OP_CUSTOM + || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP); - if (is_split) { - /* make engine handle split ' ' specially */ - pm->op_pmflags |= PMf_SPLIT; - rx_flags |= RXf_SPLIT; - } + NewOp(1101, pvop, 1, PVOP); + OpTYPE_set(pvop, type); + pvop->op_pv = pv; + pvop->op_next = (OP*)pvop; + pvop->op_flags = (U8)flags; + pvop->op_private = utf8 ? OPpPV_IS_UTF8 : 0; + if (PL_opargs[type] & OA_RETSCALAR) + scalar((OP*)pvop); + if (PL_opargs[type] & OA_TARGET) + pvop->op_targ = pad_alloc(type, SVs_PADTMP); + return CHECKOP(type, pvop); +} - if (!has_code || !eng->op_comp) { - /* compile-time simple constant pattern */ +void +Perl_package(pTHX_ OP *o) +{ + SV *const sv = cSVOPo->op_sv; - if ((pm->op_pmflags & PMf_HAS_CV) && !has_code) { - /* whoops! we guessed that a qr// had a code block, but we - * were wrong (e.g. /[(?{}]/ ). Throw away the PL_compcv - * that isn't required now. Note that we have to be pretty - * confident that nothing used that CV's pad while the - * regex was parsed, except maybe op targets for \Q etc. - * If there were any op targets, though, they should have - * been stolen by constant folding. - */ -#ifdef DEBUGGING - SSize_t i = 0; - assert(PadnamelistMAXNAMED(PL_comppad_name) == 0); - while (++i <= AvFILLp(PL_comppad)) { -# ifdef USE_PAD_RESET - /* under USE_PAD_RESET, pad swipe replaces a swiped - * folded constant with a fresh padtmp */ - assert(!PL_curpad[i] || SvPADTMP(PL_curpad[i])); -# else - assert(!PL_curpad[i]); -# endif - } -#endif - /* This LEAVE_SCOPE will restore PL_compcv to point to the - * outer CV (the one whose slab holds the pm op). The - * inner CV (which holds expr) will be freed later, once - * all the entries on the parse stack have been popped on - * return from this function. Which is why its safe to - * call op_free(expr) below. - */ - LEAVE_SCOPE(floor); - pm->op_pmflags &= ~PMf_HAS_CV; - } + PERL_ARGS_ASSERT_PACKAGE; - /* Skip compiling if parser found an error for this pattern */ - if (pm->op_pmflags & PMf_HAS_ERROR) { - return o; - } + SAVEGENERICSV(PL_curstash); + save_item(PL_curstname); - PM_SETRE(pm, - eng->op_comp - ? eng->op_comp(aTHX_ NULL, 0, expr, eng, NULL, NULL, - rx_flags, pm->op_pmflags) - : Perl_re_op_compile(aTHX_ NULL, 0, expr, eng, NULL, NULL, - rx_flags, pm->op_pmflags) - ); - op_free(expr); - } - else { - /* compile-time pattern that includes literal code blocks */ + PL_curstash = (HV *)SvREFCNT_inc(gv_stashsv(sv, GV_ADD)); - REGEXP* re; + sv_setsv(PL_curstname, sv); - /* Skip compiling if parser found an error for this pattern */ - if (pm->op_pmflags & PMf_HAS_ERROR) { - return o; - } - - re = eng->op_comp(aTHX_ NULL, 0, expr, eng, NULL, NULL, - rx_flags, - (pm->op_pmflags | - ((PL_hints & HINT_RE_EVAL) ? PMf_USE_RE_EVAL : 0)) - ); - PM_SETRE(pm, re); - if (pm->op_pmflags & PMf_HAS_CV) { - CV *cv; - /* this QR op (and the anon sub we embed it in) is never - * actually executed. It's just a placeholder where we can - * squirrel away expr in op_code_list without the peephole - * optimiser etc processing it for a second time */ - OP *qr = newPMOP(OP_QR, 0); - ((PMOP*)qr)->op_code_list = expr; + PL_hints |= HINT_BLOCK_SCOPE; + PL_parser->copline = NOLINE; - /* handle the implicit sub{} wrapped round the qr/(?{..})/ */ - SvREFCNT_inc_simple_void(PL_compcv); - cv = newATTRSUB(floor, 0, NULL, NULL, qr); - ReANY(re)->qr_anoncv = cv; + op_free(o); +} - /* attach the anon CV to the pad so that - * pad_fixup_inner_anons() can find it */ - (void)pad_add_anon(cv, o->op_type); - SvREFCNT_inc_simple_void(cv); - } - else { - pm->op_code_list = expr; - } - } - } - else { - /* runtime pattern: build chain of regcomp etc ops */ - bool reglist; - PADOFFSET cv_targ = 0; +void +Perl_package_version( pTHX_ OP *v ) +{ + U32 savehints = PL_hints; + PERL_ARGS_ASSERT_PACKAGE_VERSION; + PL_hints &= ~HINT_STRICT_VARS; + sv_setsv( GvSV(gv_fetchpvs("VERSION", GV_ADDMULTI, SVt_PV)), cSVOPx(v)->op_sv ); + PL_hints = savehints; + op_free(v); +} - reglist = isreg && expr->op_type == OP_LIST; - if (reglist) - op_null(expr); +/* Extract the first two components of a "version" object as two 8bit integers + * and return them packed into a single U16 in the format of PL_prevailing_version. + * This function only ever has to cope with version objects already known + * bounded by the current perl version, so we know its components will fit + * (Up until we reach perl version 5.256 anyway) */ +static U16 S_extract_shortver(pTHX_ SV *sv) +{ + SV *rv; + if(!SvRV(sv) || !SvOBJECT(rv = SvRV(sv)) || !sv_derived_from(sv, "version")) + return 0; - if (has_code) { - pm->op_code_list = expr; - /* don't free op_code_list; its ops are embedded elsewhere too */ - pm->op_pmflags |= PMf_CODELIST_PRIVATE; - } + AV *av = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(rv), "version", 0))); - if (is_split) - /* make engine handle split ' ' specially */ - pm->op_pmflags |= PMf_SPLIT; + U16 shortver = 0; - /* the OP_REGCMAYBE is a placeholder in the non-threaded case - * to allow its op_next to be pointed past the regcomp and - * preceding stacking ops; - * OP_REGCRESET is there to reset taint before executing the - * stacking ops */ - if (pm->op_pmflags & PMf_KEEP || TAINTING_get) - expr = newUNOP((TAINTING_get ? OP_REGCRESET : OP_REGCMAYBE),0,expr); + IV major = av_count(av) > 0 ? SvIV(*av_fetch(av, 0, false)) : 0; + if(major > 255) + shortver |= 255 << 8; + else + shortver |= major << 8; - if (pm->op_pmflags & PMf_HAS_CV) { - /* we have a runtime qr with literal code. This means - * that the qr// has been wrapped in a new CV, which - * means that runtime consts, vars etc will have been compiled - * against a new pad. So... we need to execute those ops - * within the environment of the new CV. So wrap them in a call - * to a new anon sub. i.e. for - * - * qr/a$b(?{...})/, - * - * we build an anon sub that looks like - * - * sub { "a", $b, '(?{...})' } - * - * and call it, passing the returned list to regcomp. - * Or to put it another way, the list of ops that get executed - * are: - * - * normal PMf_HAS_CV - * ------ ------------------- - * pushmark (for regcomp) - * pushmark (for entersub) - * anoncode - * srefgen - * entersub - * regcreset regcreset - * pushmark pushmark - * const("a") const("a") - * gvsv(b) gvsv(b) - * const("(?{...})") const("(?{...})") - * leavesub - * regcomp regcomp - */ + IV minor = av_count(av) > 1 ? SvIV(*av_fetch(av, 1, false)) : 0; + if(minor > 255) + shortver |= 255; + else + shortver |= minor; - SvREFCNT_inc_simple_void(PL_compcv); - CvLVALUE_on(PL_compcv); - /* these lines are just an unrolled newANONATTRSUB */ - expr = newSVOP(OP_ANONCODE, 0, - MUTABLE_SV(newATTRSUB(floor, 0, NULL, NULL, expr))); - cv_targ = expr->op_targ; - expr = newUNOP(OP_REFGEN, 0, expr); + return shortver; +} +#define SHORTVER(maj,min) ((maj << 8) | min) - expr = list(force_list(newUNOP(OP_ENTERSUB, 0, scalar(expr)), TRUE)); - } +void +Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg) +{ + OP *pack; + OP *imop; + OP *veop; + SV *use_version = NULL; - rcop = alloc_LOGOP(OP_REGCOMP, scalar(expr), o); - rcop->op_flags |= ((PL_hints & HINT_RE_EVAL) ? OPf_SPECIAL : 0) - | (reglist ? OPf_STACKED : 0); - rcop->op_targ = cv_targ; + PERL_ARGS_ASSERT_UTILIZE; - /* /$x/ may cause an eval, since $x might be qr/(?{..})/ */ - if (PL_hints & HINT_RE_EVAL) - S_set_haseval(aTHX); + if (idop->op_type != OP_CONST) + Perl_croak(aTHX_ "Module name must be constant"); - /* establish postfix order */ - if (expr->op_type == OP_REGCRESET || expr->op_type == OP_REGCMAYBE) { - LINKLIST(expr); - rcop->op_next = expr; - ((UNOP*)expr)->op_first->op_next = (OP*)rcop; - } - else { - rcop->op_next = LINKLIST(expr); - expr->op_next = (OP*)rcop; - } + veop = NULL; - op_prepend_elem(o->op_type, scalar((OP*)rcop), o); - } + if (version) { + SV * const vesv = cSVOPx(version)->op_sv; - if (repl) { - OP *curop = repl; - bool konst; - /* If we are looking at s//.../e with a single statement, get past - the implicit do{}. */ - if (curop->op_type == OP_NULL && curop->op_flags & OPf_KIDS - && cUNOPx(curop)->op_first->op_type == OP_SCOPE - && cUNOPx(curop)->op_first->op_flags & OPf_KIDS) - { - OP *sib; - OP *kid = cUNOPx(cUNOPx(curop)->op_first)->op_first; - if (kid->op_type == OP_NULL && (sib = OpSIBLING(kid)) - && !OpHAS_SIBLING(sib)) - curop = sib; - } - if (curop->op_type == OP_CONST) - konst = TRUE; - else if (( (curop->op_type == OP_RV2SV || - curop->op_type == OP_RV2AV || - curop->op_type == OP_RV2HV || - curop->op_type == OP_RV2GV) - && cUNOPx(curop)->op_first - && cUNOPx(curop)->op_first->op_type == OP_GV ) - || curop->op_type == OP_PADSV - || curop->op_type == OP_PADAV - || curop->op_type == OP_PADHV - || curop->op_type == OP_PADANY) { - repl_has_vars = 1; - konst = TRUE; - } - else konst = FALSE; - if (konst - && !(repl_has_vars - && (!PM_GETRE(pm) - || !RX_PRELEN(PM_GETRE(pm)) - || RX_EXTFLAGS(PM_GETRE(pm)) & RXf_EVAL_SEEN))) - { - pm->op_pmflags |= PMf_CONST; /* const for long enough */ - op_prepend_elem(o->op_type, scalar(repl), o); + if (!arg && !SvNIOKp(vesv)) { + arg = version; } else { - rcop = alloc_LOGOP(OP_SUBSTCONT, scalar(repl), o); - rcop->op_private = 1; + OP *pack; + SV *meth; - /* establish postfix order */ - rcop->op_next = LINKLIST(repl); - repl->op_next = (OP*)rcop; + if (version->op_type != OP_CONST || !SvNIOKp(vesv)) + Perl_croak(aTHX_ "Version number must be a constant number"); - pm->op_pmreplrootu.op_pmreplroot = scalar((OP*)rcop); - assert(!(pm->op_pmflags & PMf_ONCE)); - pm->op_pmstashstartu.op_pmreplstart = LINKLIST(rcop); - rcop->op_next = 0; + /* Make copy of idop so we don't free it twice */ + pack = newSVOP(OP_CONST, 0, newSVsv(cSVOPx(idop)->op_sv)); + + /* Fake up a method call to VERSION */ + meth = newSVpvs_share("VERSION"); + veop = op_convert_list(OP_ENTERSUB, OPf_STACKED, + op_append_elem(OP_LIST, + op_prepend_elem(OP_LIST, pack, version), + newMETHOP_named(OP_METHOD_NAMED, 0, meth))); } } - return (OP*)pm; -} - -/* -=for apidoc newSVOP - -Constructs, checks, and returns an op of any type that involves an -embedded SV. C is the opcode. C gives the eight bits -of C. C gives the SV to embed in the op; this function -takes ownership of one reference to it. + /* Fake up an import/unimport */ + if (arg && arg->op_type == OP_STUB) { + imop = arg; /* no import on explicit () */ + } + else if (SvNIOKp(cSVOPx(idop)->op_sv)) { + imop = NULL; /* use 5.0; */ + if (aver) + use_version = cSVOPx(idop)->op_sv; + else + idop->op_private |= OPpCONST_NOVER; + } + else { + SV *meth; -=cut -*/ + /* Make copy of idop so we don't free it twice */ + pack = newSVOP(OP_CONST, 0, newSVsv(cSVOPx(idop)->op_sv)); -OP * -Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv) -{ - SVOP *svop; + /* Fake up a method call to import/unimport */ + meth = aver + ? newSVpvs_share("import") : newSVpvs_share("unimport"); + imop = op_convert_list(OP_ENTERSUB, OPf_STACKED, + op_append_elem(OP_LIST, + op_prepend_elem(OP_LIST, pack, arg), + newMETHOP_named(OP_METHOD_NAMED, 0, meth) + )); + } - PERL_ARGS_ASSERT_NEWSVOP; - - assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP - || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP - || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP - || type == OP_CUSTOM); - - NewOp(1101, svop, 1, SVOP); - OpTYPE_set(svop, type); - svop->op_sv = sv; - svop->op_next = (OP*)svop; - svop->op_flags = (U8)flags; - svop->op_private = (U8)(0 | (flags >> 8)); - if (PL_opargs[type] & OA_RETSCALAR) - scalar((OP*)svop); - if (PL_opargs[type] & OA_TARGET) - svop->op_targ = pad_alloc(type, SVs_PADTMP); - return CHECKOP(type, svop); -} - -/* -=for apidoc newDEFSVOP - -Constructs and returns an op to access C<$_>. - -=cut -*/ - -OP * -Perl_newDEFSVOP(pTHX) -{ - return newSVREF(newGVOP(OP_GV, 0, PL_defgv)); -} - -#ifdef USE_ITHREADS + /* Fake up the BEGIN {}, which does its thing immediately. */ + newATTRSUB(floor, + newSVOP(OP_CONST, 0, newSVpvs_share("BEGIN")), + NULL, + NULL, + op_append_elem(OP_LINESEQ, + op_append_elem(OP_LINESEQ, + newSTATEOP(0, NULL, newUNOP(OP_REQUIRE, 0, idop)), + newSTATEOP(0, NULL, veop)), + newSTATEOP(0, NULL, imop) )); -/* -=for apidoc newPADOP + if (use_version) { + /* Enable the + * feature bundle that corresponds to the required version. */ + use_version = sv_2mortal(new_version(use_version)); + S_enable_feature_bundle(aTHX_ use_version); -Constructs, checks, and returns an op of any type that involves a -reference to a pad element. C is the opcode. C gives the -eight bits of C. A pad slot is automatically allocated, and -is populated with C; this function takes ownership of one reference -to it. + U16 shortver = S_extract_shortver(aTHX_ use_version); -This function only exists if Perl has been compiled to use ithreads. + /* If a version >= 5.11.0 is requested, strictures are on by default! */ + if (shortver >= SHORTVER(5, 11)) { + if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS)) + PL_hints |= HINT_STRICT_REFS; + if (!(PL_hints & HINT_EXPLICIT_STRICT_SUBS)) + PL_hints |= HINT_STRICT_SUBS; + if (!(PL_hints & HINT_EXPLICIT_STRICT_VARS)) + PL_hints |= HINT_STRICT_VARS; -=cut -*/ + if (shortver >= SHORTVER(5, 35)) + free_and_set_cop_warnings(&PL_compiling, pWARN_ALL); + } + /* otherwise they are off */ + else { + if(PL_prevailing_version >= SHORTVER(5, 11)) + deprecate_fatal_in(WARN_DEPRECATED__VERSION_DOWNGRADE, "5.40", + "Downgrading a use VERSION declaration to below v5.11"); -OP * -Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv) -{ - PADOP *padop; + if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS)) + PL_hints &= ~HINT_STRICT_REFS; + if (!(PL_hints & HINT_EXPLICIT_STRICT_SUBS)) + PL_hints &= ~HINT_STRICT_SUBS; + if (!(PL_hints & HINT_EXPLICIT_STRICT_VARS)) + PL_hints &= ~HINT_STRICT_VARS; + } - PERL_ARGS_ASSERT_NEWPADOP; + PL_prevailing_version = shortver; + } - assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP - || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP - || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP - || type == OP_CUSTOM); + /* The "did you use incorrect case?" warning used to be here. + * The problem is that on case-insensitive filesystems one + * might get false positives for "use" (and "require"): + * "use Strict" or "require CARP" will work. This causes + * portability problems for the script: in case-strict + * filesystems the script will stop working. + * + * The "incorrect case" warning checked whether "use Foo" + * imported "Foo" to your namespace, but that is wrong, too: + * there is no requirement nor promise in the language that + * a Foo.pm should or would contain anything in package "Foo". + * + * There is very little Configure-wise that can be done, either: + * the case-sensitivity of the build filesystem of Perl does not + * help in guessing the case-sensitivity of the runtime environment. + */ - NewOp(1101, padop, 1, PADOP); - OpTYPE_set(padop, type); - padop->op_padix = - pad_alloc(type, isGV(sv) ? SVf_READONLY : SVs_PADTMP); - SvREFCNT_dec(PAD_SVl(padop->op_padix)); - PAD_SETSV(padop->op_padix, sv); - assert(sv); - padop->op_next = (OP*)padop; - padop->op_flags = (U8)flags; - if (PL_opargs[type] & OA_RETSCALAR) - scalar((OP*)padop); - if (PL_opargs[type] & OA_TARGET) - padop->op_targ = pad_alloc(type, SVs_PADTMP); - return CHECKOP(type, padop); + PL_hints |= HINT_BLOCK_SCOPE; + PL_parser->copline = NOLINE; + COP_SEQMAX_INC; /* Purely for B::*'s benefit */ } -#endif /* USE_ITHREADS */ - /* -=for apidoc newGVOP +=for apidoc_section $embedding -Constructs, checks, and returns an op of any type that involves an -embedded reference to a GV. C is the opcode. C gives the -eight bits of C. C identifies the GV that the op should -reference; calling this function does not transfer ownership of any -reference to it. +=for apidoc load_module +=for apidoc_item load_module_nocontext -=cut -*/ +These load the module whose name is pointed to by the string part of C. +Note that the actual module name, not its filename, should be given. +Eg, "Foo::Bar" instead of "Foo/Bar.pm". ver, if specified and not NULL, +provides version semantics similar to C. The optional +trailing arguments can be used to specify arguments to the module's C +method, similar to C; their precise handling depends +on the flags. The flags argument is a bitwise-ORed collection of any of +C, C, or C +(or 0 for no flags). -OP * -Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv) -{ - PERL_ARGS_ASSERT_NEWGVOP; +If C is set, the module is loaded as if with an empty +import list, as in C; this is the only circumstance in which +the trailing optional arguments may be omitted entirely. Otherwise, if +C is set, the trailing arguments must consist of +exactly one C, containing the op tree that produces the relevant import +arguments. Otherwise, the trailing arguments must all be C values that +will be used as import arguments; and the list must be terminated with C<(SV*) +NULL>. If neither C nor C is +set, the trailing C pointer is needed even if no import arguments are +desired. The reference count for each specified C argument is +decremented. In addition, the C argument is modified. -#ifdef USE_ITHREADS - return newPADOP(type, flags, SvREFCNT_inc_simple_NN(gv)); -#else - return newSVOP(type, flags, SvREFCNT_inc_simple_NN(gv)); -#endif -} +If C is set, the module is loaded as if with C rather +than C. -/* -=for apidoc newPVOP +C and C have the same apparent signature, +but the former hides the fact that it is accessing a thread context parameter. +So use the latter when you get a compilation error about C. -Constructs, checks, and returns an op of any type that involves an -embedded C-level pointer (PV). C is the opcode. C gives -the eight bits of C. C supplies the C-level pointer. -Depending on the op type, the memory referenced by C may be freed -when the op is destroyed. If the op is of a freeing type, C must -have been allocated using C. +=for apidoc Amnh||PERL_LOADMOD_DENY +=for apidoc Amnh||PERL_LOADMOD_NOIMPORT +=for apidoc Amnh||PERL_LOADMOD_IMPORT_OPS -=cut -*/ +=for apidoc vload_module +Like C> but the arguments are an encapsulated argument list. -OP * -Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv) -{ - const bool utf8 = cBOOL(flags & SVf_UTF8); - PVOP *pvop; +=cut */ - flags &= ~SVf_UTF8; +void +Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...) +{ + va_list args; - assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP - || type == OP_RUNCV || type == OP_CUSTOM - || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP); + PERL_ARGS_ASSERT_LOAD_MODULE; - NewOp(1101, pvop, 1, PVOP); - OpTYPE_set(pvop, type); - pvop->op_pv = pv; - pvop->op_next = (OP*)pvop; - pvop->op_flags = (U8)flags; - pvop->op_private = utf8 ? OPpPV_IS_UTF8 : 0; - if (PL_opargs[type] & OA_RETSCALAR) - scalar((OP*)pvop); - if (PL_opargs[type] & OA_TARGET) - pvop->op_targ = pad_alloc(type, SVs_PADTMP); - return CHECKOP(type, pvop); + va_start(args, ver); + vload_module(flags, name, ver, &args); + va_end(args); } +#ifdef MULTIPLICITY void -Perl_package(pTHX_ OP *o) +Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...) { - SV *const sv = cSVOPo->op_sv; - - PERL_ARGS_ASSERT_PACKAGE; - - SAVEGENERICSV(PL_curstash); - save_item(PL_curstname); - - PL_curstash = (HV *)SvREFCNT_inc(gv_stashsv(sv, GV_ADD)); - - sv_setsv(PL_curstname, sv); - - PL_hints |= HINT_BLOCK_SCOPE; - PL_parser->copline = NOLINE; - - op_free(o); + dTHX; + va_list args; + PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT; + va_start(args, ver); + vload_module(flags, name, ver, &args); + va_end(args); } +#endif void -Perl_package_version( pTHX_ OP *v ) +Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args) { - U32 savehints = PL_hints; - PERL_ARGS_ASSERT_PACKAGE_VERSION; - PL_hints &= ~HINT_STRICT_VARS; - sv_setsv( GvSV(gv_fetchpvs("VERSION", GV_ADDMULTI, SVt_PV)), cSVOPx(v)->op_sv ); - PL_hints = savehints; - op_free(v); -} - -/* Extract the first two components of a "version" object as two 8bit integers - * and return them packed into a single U16 in the format of PL_prevailing_version. - * This function only ever has to cope with version objects already known - * bounded by the current perl version, so we know its components will fit - * (Up until we reach perl version 5.256 anyway) */ -static U16 S_extract_shortver(pTHX_ SV *sv) -{ - SV *rv; - if(!SvRV(sv) || !SvOBJECT(rv = SvRV(sv)) || !sv_derived_from(sv, "version")) - return 0; - - AV *av = MUTABLE_AV(SvRV(*hv_fetchs(MUTABLE_HV(rv), "version", 0))); - - U16 shortver = 0; - - IV major = av_count(av) > 0 ? SvIV(*av_fetch(av, 0, false)) : 0; - if(major > 255) - shortver |= 255 << 8; - else - shortver |= major << 8; - - IV minor = av_count(av) > 1 ? SvIV(*av_fetch(av, 1, false)) : 0; - if(minor > 255) - shortver |= 255; - else - shortver |= minor; - - return shortver; -} -#define SHORTVER(maj,min) ((maj << 8) | min) - -void -Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg) -{ - OP *pack; - OP *imop; - OP *veop; - SV *use_version = NULL; - - PERL_ARGS_ASSERT_UTILIZE; - - if (idop->op_type != OP_CONST) - Perl_croak(aTHX_ "Module name must be constant"); - - veop = NULL; - - if (version) { - SV * const vesv = ((SVOP*)version)->op_sv; - - if (!arg && !SvNIOKp(vesv)) { - arg = version; - } - else { - OP *pack; - SV *meth; - - if (version->op_type != OP_CONST || !SvNIOKp(vesv)) - Perl_croak(aTHX_ "Version number must be a constant number"); - - /* Make copy of idop so we don't free it twice */ - pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv)); - - /* Fake up a method call to VERSION */ - meth = newSVpvs_share("VERSION"); - veop = op_convert_list(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL, - op_append_elem(OP_LIST, - op_prepend_elem(OP_LIST, pack, version), - newMETHOP_named(OP_METHOD_NAMED, 0, meth))); - } - } - - /* Fake up an import/unimport */ - if (arg && arg->op_type == OP_STUB) { - imop = arg; /* no import on explicit () */ - } - else if (SvNIOKp(((SVOP*)idop)->op_sv)) { - imop = NULL; /* use 5.0; */ - if (aver) - use_version = ((SVOP*)idop)->op_sv; - else - idop->op_private |= OPpCONST_NOVER; - } - else { - SV *meth; - - /* Make copy of idop so we don't free it twice */ - pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv)); - - /* Fake up a method call to import/unimport */ - meth = aver - ? newSVpvs_share("import") : newSVpvs_share("unimport"); - imop = op_convert_list(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL, - op_append_elem(OP_LIST, - op_prepend_elem(OP_LIST, pack, arg), - newMETHOP_named(OP_METHOD_NAMED, 0, meth) - )); - } - - /* Fake up the BEGIN {}, which does its thing immediately. */ - newATTRSUB(floor, - newSVOP(OP_CONST, 0, newSVpvs_share("BEGIN")), - NULL, - NULL, - op_append_elem(OP_LINESEQ, - op_append_elem(OP_LINESEQ, - newSTATEOP(0, NULL, newUNOP(OP_REQUIRE, 0, idop)), - newSTATEOP(0, NULL, veop)), - newSTATEOP(0, NULL, imop) )); - - if (use_version) { - /* Enable the - * feature bundle that corresponds to the required version. */ - use_version = sv_2mortal(new_version(use_version)); - S_enable_feature_bundle(aTHX_ use_version); - - U16 shortver = S_extract_shortver(aTHX_ use_version); - - /* If a version >= 5.11.0 is requested, strictures are on by default! */ - if (shortver >= SHORTVER(5, 11)) { - if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS)) - PL_hints |= HINT_STRICT_REFS; - if (!(PL_hints & HINT_EXPLICIT_STRICT_SUBS)) - PL_hints |= HINT_STRICT_SUBS; - if (!(PL_hints & HINT_EXPLICIT_STRICT_VARS)) - PL_hints |= HINT_STRICT_VARS; - - if (shortver >= SHORTVER(5, 35)) - free_and_set_cop_warnings(&PL_compiling, pWARN_ALL); - } - /* otherwise they are off */ - else { - if(PL_prevailing_version >= SHORTVER(5, 11)) - deprecate_fatal_in("5.40", - "Downgrading a use VERSION declaration to below v5.11"); - - if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS)) - PL_hints &= ~HINT_STRICT_REFS; - if (!(PL_hints & HINT_EXPLICIT_STRICT_SUBS)) - PL_hints &= ~HINT_STRICT_SUBS; - if (!(PL_hints & HINT_EXPLICIT_STRICT_VARS)) - PL_hints &= ~HINT_STRICT_VARS; - } - - PL_prevailing_version = shortver; - } - - /* The "did you use incorrect case?" warning used to be here. - * The problem is that on case-insensitive filesystems one - * might get false positives for "use" (and "require"): - * "use Strict" or "require CARP" will work. This causes - * portability problems for the script: in case-strict - * filesystems the script will stop working. - * - * The "incorrect case" warning checked whether "use Foo" - * imported "Foo" to your namespace, but that is wrong, too: - * there is no requirement nor promise in the language that - * a Foo.pm should or would contain anything in package "Foo". - * - * There is very little Configure-wise that can be done, either: - * the case-sensitivity of the build filesystem of Perl does not - * help in guessing the case-sensitivity of the runtime environment. - */ - - PL_hints |= HINT_BLOCK_SCOPE; - PL_parser->copline = NOLINE; - COP_SEQMAX_INC; /* Purely for B::*'s benefit */ -} - -/* -=for apidoc_section $embedding - -=for apidoc load_module -=for apidoc_item load_module_nocontext - -These load the module whose name is pointed to by the string part of C. -Note that the actual module name, not its filename, should be given. -Eg, "Foo::Bar" instead of "Foo/Bar.pm". ver, if specified and not NULL, -provides version semantics similar to C. The optional -trailing arguments can be used to specify arguments to the module's C -method, similar to C; their precise handling depends -on the flags. The flags argument is a bitwise-ORed collection of any of -C, C, or C -(or 0 for no flags). - -If C is set, the module is loaded as if with an empty -import list, as in C; this is the only circumstance in which -the trailing optional arguments may be omitted entirely. Otherwise, if -C is set, the trailing arguments must consist of -exactly one C, containing the op tree that produces the relevant import -arguments. Otherwise, the trailing arguments must all be C values that -will be used as import arguments; and the list must be terminated with C<(SV*) -NULL>. If neither C nor C is -set, the trailing C pointer is needed even if no import arguments are -desired. The reference count for each specified C argument is -decremented. In addition, the C argument is modified. - -If C is set, the module is loaded as if with C rather -than C. - -C and C have the same apparent signature, -but the former hides the fact that it is accessing a thread context parameter. -So use the latter when you get a compilation error about C. - -=for apidoc Amnh||PERL_LOADMOD_DENY -=for apidoc Amnh||PERL_LOADMOD_NOIMPORT -=for apidoc Amnh||PERL_LOADMOD_IMPORT_OPS - -=for apidoc vload_module -Like C> but the arguments are an encapsulated argument list. - -=cut */ - -void -Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...) -{ - va_list args; - - PERL_ARGS_ASSERT_LOAD_MODULE; - - va_start(args, ver); - vload_module(flags, name, ver, &args); - va_end(args); -} - -#ifdef MULTIPLICITY -void -Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...) -{ - dTHX; - va_list args; - PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT; - va_start(args, ver); - vload_module(flags, name, ver, &args); - va_end(args); -} -#endif - -void -Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args) -{ - OP *veop, *imop; - OP * modname; - I32 floor; + OP *veop, *imop; + OP * modname; + I32 floor; PERL_ARGS_ASSERT_VLOAD_MODULE; @@ -9194,8 +8117,8 @@ OP * Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listval) { return newBINOP(OP_LSLICE, flags, - list(force_list(subscript, TRUE)), - list(force_list(listval, TRUE))); + list(op_force_list(subscript)), + list(op_force_list(listval))); } #define ASSIGN_SCALAR 0 @@ -9297,6 +8220,32 @@ S_newONCEOP(pTHX_ OP *initop, OP *padop) } /* +=for apidoc newARGDEFELEMOP + +Constructs and returns a new C op which provides a defaulting +expression given by C for the signature parameter at the index given +by C. The expression optree is consumed by this function and +becomes part of the returned optree. + +=cut +*/ + +OP * +Perl_newARGDEFELEMOP(pTHX_ I32 flags, OP *expr, I32 argindex) +{ + PERL_ARGS_ASSERT_NEWARGDEFELEMOP; + + OP *o = (OP *)alloc_LOGOP(OP_ARGDEFELEM, expr, LINKLIST(expr)); + o->op_flags |= (U8)(flags); + o->op_private = 1 | (U8)(flags >> 8); + + /* re-purpose op_targ to hold @_ index */ + o->op_targ = (PADOFFSET)(argindex); + + return o; +} + +/* =for apidoc newASSIGNOP Constructs, checks, and returns an assignment op. C and C @@ -9350,13 +8299,13 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *le PL_modcount = 0; left = op_lvalue(left, OP_AASSIGN); - curop = list(force_list(left, TRUE)); - o = newBINOP(OP_AASSIGN, flags, list(force_list(right, TRUE)), curop); + curop = list(op_force_list(left)); + o = newBINOP(OP_AASSIGN, flags, list(op_force_list(right)), curop); o->op_private = (U8)(0 | (flags >> 8)); if (OP_TYPE_IS_OR_WAS(left, OP_LIST)) { - OP *lop = ((LISTOP*)left)->op_first, *vop, *eop; + OP *lop = cLISTOPx(left)->op_first, *vop, *eop; if (!(left->op_flags & OPf_PARENS) && lop->op_type == OP_PUSHMARK && (vop = OpSIBLING(lop)) && @@ -9418,18 +8367,18 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *le OP *gvop = NULL; if ( ( left->op_type == OP_RV2AV - && (gvop=((UNOP*)left)->op_first)->op_type==OP_GV) + && (gvop=cUNOPx(left)->op_first)->op_type==OP_GV) || left->op_type == OP_PADAV) { /* @pkg or @lex or local @pkg' or 'my @lex' */ OP *tmpop; if (gvop) { #ifdef USE_ITHREADS - ((PMOP*)right)->op_pmreplrootu.op_pmtargetoff + cPMOPx(right)->op_pmreplrootu.op_pmtargetoff = cPADOPx(gvop)->op_padix; cPADOPx(gvop)->op_padix = 0; /* steal it */ #else - ((PMOP*)right)->op_pmreplrootu.op_pmtargetgv + cPMOPx(right)->op_pmreplrootu.op_pmtargetgv = MUTABLE_GV(cSVOPx(gvop)->op_sv); cSVOPx(gvop)->op_sv = NULL; /* steal it */ #endif @@ -9437,7 +8386,7 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *le left->op_private & OPpOUR_INTRO; } else { - ((PMOP*)right)->op_pmreplrootu.op_pmtargetoff = left->op_targ; + cPMOPx(right)->op_pmreplrootu.op_pmtargetoff = left->op_targ; left->op_targ = 0; /* steal it */ right->op_private |= OPpSPLIT_LEX; } @@ -9445,7 +8394,7 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *le detach_split: tmpop = cUNOPo->op_first; /* to list (nulled) */ - tmpop = ((UNOP*)tmpop)->op_first; /* to pushmark */ + tmpop = cUNOPx(tmpop)->op_first; /* to pushmark */ assert(OpSIBLING(tmpop) == right); assert(!OpHAS_SIBLING(right)); /* detach the split subtreee from the o tree, @@ -9472,11 +8421,11 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *le goto detach_split; } else if (PL_modcount < RETURN_UNLIMITED_NUMBER && - ((LISTOP*)right)->op_last->op_type == OP_CONST) + cLISTOPx(right)->op_last->op_type == OP_CONST) { /* convert split(...,0) to split(..., PL_modcount+1) */ SV ** const svp = - &((SVOP*)((LISTOP*)right)->op_last)->op_sv; + &cSVOPx(cLISTOPx(right)->op_last)->op_sv; SV * const sv = *svp; if (SvIOK(sv) && SvIVX(sv) == 0) { @@ -9561,6 +8510,7 @@ Perl_newSTATEOP(pTHX_ I32 flags, char *l cop->cop_seq = seq; cop->cop_warnings = DUP_WARNINGS(PL_curcop->cop_warnings); CopHINTHASH_set(cop, cophh_copy(CopHINTHASH_get(PL_curcop))); + CopFEATURES_setfrom(cop, PL_curcop); if (label) { Perl_cop_store_label(aTHX_ cop, label, strlen(label), utf8); @@ -9582,7 +8532,7 @@ Perl_newSTATEOP(pTHX_ I32 flags, char *l PL_parser->copline = NOLINE; } #ifdef USE_ITHREADS - CopFILE_set(cop, CopFILE(PL_curcop)); /* XXX share in a pvtable? */ + CopFILE_copy(cop, PL_curcop); #else CopFILEGV_set(cop, CopFILEGV(PL_curcop)); #endif @@ -9750,9 +8700,9 @@ S_new_logop(pTHX_ I32 type, I32 flags, O no_bareword_allowed(cstop); else if ((cstop->op_private & OPpCONST_BARE)) Perl_ck_warner(aTHX_ packWARN(WARN_BAREWORD), "Bareword found in conditional"); - if ((type == OP_AND && SvTRUE(((SVOP*)cstop)->op_sv)) || - (type == OP_OR && !SvTRUE(((SVOP*)cstop)->op_sv)) || - (type == OP_DOR && !SvOK(((SVOP*)cstop)->op_sv))) { + if ((type == OP_AND && SvTRUE(cSVOPx(cstop)->op_sv)) || + (type == OP_OR && !SvTRUE(cSVOPx(cstop)->op_sv)) || + (type == OP_DOR && !SvOK(cSVOPx(cstop)->op_sv))) { /* Elide the (constant) lhs, since it can't affect the outcome */ *firstp = NULL; if (other->op_type == OP_CONST) @@ -9801,7 +8751,7 @@ S_new_logop(pTHX_ I32 type, I32 flags, O else if ((first->op_flags & OPf_KIDS) && type != OP_DOR && ckWARN(WARN_MISC)) /* [#24076] Don't warn for err FOO. */ { - const OP * const k1 = ((UNOP*)first)->op_first; + const OP * const k1 = cUNOPx(first)->op_first; const OP * const k2 = OpSIBLING(k1); OPCODE warnop = 0; switch (first->op_type) @@ -9912,7 +8862,7 @@ Perl_newCONDOP(pTHX_ I32 flags, OP *firs scalarboolean(first); if ((cstop = search_const(first))) { /* Left or right arm of the conditional? */ - const bool left = SvTRUE(((SVOP*)cstop)->op_sv); + const bool left = SvTRUE(cSVOPx(cstop)->op_sv); OP *live = left ? trueop : falseop; OP *const dead = left ? falseop : trueop; if (cstop->op_private & OPpCONST_BARE && @@ -10065,7 +9015,7 @@ Perl_newRANGE(pTHX_ I32 flags, OP *left, flip->op_private = left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0; flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0; - /* check barewords before they might be optimized aways */ + /* check barewords before they might be optimized away */ if (flip->op_private && cSVOPx(left)->op_private & OPpCONST_STRICT) no_bareword_allowed(left); if (flop->op_private && cSVOPx(right)->op_private & OPpCONST_STRICT) @@ -10097,6 +9047,8 @@ unused and should always be 1. OP * Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block) { + PERL_ARGS_ASSERT_NEWLOOPOP; + OP* listop; OP* o; const bool once = block && block->op_flags & OPf_SPECIAL && @@ -10104,48 +9056,46 @@ Perl_newLOOPOP(pTHX_ I32 flags, I32 debu PERL_UNUSED_ARG(debuggable); - if (expr) { - if (once && ( - (expr->op_type == OP_CONST && !SvTRUE(((SVOP*)expr)->op_sv)) - || ( expr->op_type == OP_NOT - && cUNOPx(expr)->op_first->op_type == OP_CONST - && SvTRUE(cSVOPx_sv(cUNOPx(expr)->op_first)) - ) - )) - /* Return the block now, so that S_new_logop does not try to - fold it away. */ - { - op_free(expr); - return block; /* do {} while 0 does once */ - } + if (once && ( + (expr->op_type == OP_CONST && !SvTRUE(cSVOPx(expr)->op_sv)) + || ( expr->op_type == OP_NOT + && cUNOPx(expr)->op_first->op_type == OP_CONST + && SvTRUE(cSVOPx_sv(cUNOPx(expr)->op_first)) + ) + )) + /* Return the block now, so that S_new_logop does not try to + fold it away. */ + { + op_free(expr); + return block; /* do {} while 0 does once */ + } - if (expr->op_type == OP_READLINE - || expr->op_type == OP_READDIR - || expr->op_type == OP_GLOB - || expr->op_type == OP_EACH || expr->op_type == OP_AEACH - || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) { - expr = newUNOP(OP_DEFINED, 0, - newASSIGNOP(0, newDEFSVOP(), 0, expr) ); - } else if (expr->op_flags & OPf_KIDS) { - const OP * const k1 = ((UNOP*)expr)->op_first; - const OP * const k2 = k1 ? OpSIBLING(k1) : NULL; - switch (expr->op_type) { - case OP_NULL: - if (k2 && (k2->op_type == OP_READLINE || k2->op_type == OP_READDIR) - && (k2->op_flags & OPf_STACKED) - && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR)) - expr = newUNOP(OP_DEFINED, 0, expr); - break; + if (expr->op_type == OP_READLINE + || expr->op_type == OP_READDIR + || expr->op_type == OP_GLOB + || expr->op_type == OP_EACH || expr->op_type == OP_AEACH + || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) { + expr = newUNOP(OP_DEFINED, 0, + newASSIGNOP(0, newDEFSVOP(), 0, expr) ); + } else if (expr->op_flags & OPf_KIDS) { + const OP * const k1 = cUNOPx(expr)->op_first; + const OP * const k2 = k1 ? OpSIBLING(k1) : NULL; + switch (expr->op_type) { + case OP_NULL: + if (k2 && (k2->op_type == OP_READLINE || k2->op_type == OP_READDIR) + && (k2->op_flags & OPf_STACKED) + && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR)) + expr = newUNOP(OP_DEFINED, 0, expr); + break; - case OP_SASSIGN: - if (k1 && (k1->op_type == OP_READDIR - || k1->op_type == OP_GLOB - || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB) - || k1->op_type == OP_EACH - || k1->op_type == OP_AEACH)) - expr = newUNOP(OP_DEFINED, 0, expr); - break; - } + case OP_SASSIGN: + if (k1 && (k1->op_type == OP_READDIR + || k1->op_type == OP_GLOB + || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB) + || k1->op_type == OP_EACH + || k1->op_type == OP_AEACH)) + expr = newUNOP(OP_DEFINED, 0, expr); + break; } } @@ -10161,13 +9111,13 @@ Perl_newLOOPOP(pTHX_ I32 flags, I32 debu } if (listop) - ((LISTOP*)listop)->op_last->op_next = LINKLIST(o); + cLISTOPx(listop)->op_last->op_next = LINKLIST(o); if (once && o != listop) { assert(cUNOPo->op_first->op_type == OP_AND || cUNOPo->op_first->op_type == OP_OR); - o->op_next = ((LOGOP*)cUNOPo->op_first)->op_other; + o->op_next = cLOGOPx(cUNOPo->op_first)->op_other; } if (o == listop) @@ -10224,7 +9174,7 @@ Perl_newWHILEOP(pTHX_ I32 flags, I32 deb expr = newUNOP(OP_DEFINED, 0, newASSIGNOP(0, newDEFSVOP(), 0, expr) ); } else if (expr->op_flags & OPf_KIDS) { - const OP * const k1 = ((UNOP*)expr)->op_first; + const OP * const k1 = cUNOPx(expr)->op_first; const OP * const k2 = (k1) ? OpSIBLING(k1) : NULL; switch (expr->op_type) { case OP_NULL: @@ -10275,7 +9225,7 @@ Perl_newWHILEOP(pTHX_ I32 flags, I32 deb return expr; /* listop already freed by new_logop */ } if (listop) - ((LISTOP*)listop)->op_last->op_next = + cLISTOPx(listop)->op_last->op_next = (o == listop ? redo : LINKLIST(o)); } else @@ -10371,7 +9321,7 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, O else if (sv->op_type == OP_NULL && sv->op_targ == OP_SREFGEN) NOOP; else if (sv->op_type == OP_LIST) { - LISTOP *list = (LISTOP *) sv; + LISTOP *list = cLISTOPx(sv); OP *pushmark = list->op_first; OP *first_padsv; UNOP *padsv; @@ -10393,7 +9343,7 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, O /* There should be at least one more PADSV to find, and the ops should have consecutive values in targ: */ - padsv = (UNOP *) OpSIBLING(first_padsv); + padsv = cUNOPx(OpSIBLING(first_padsv)); do { if (!padsv || padsv->op_type != OP_PADSV) { Perl_croak(aTHX_ "panic: newFORLOOP, found %s at %zd, expecting padsv", @@ -10406,7 +9356,7 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, O how_many_more, padsv->op_targ, padoff + how_many_more); } - padsv = (UNOP *) OpSIBLING(padsv); + padsv = cUNOPx(OpSIBLING(padsv)); } while (padsv); /* OK, this optree has the shape that we expected. So now *we* @@ -10416,13 +9366,13 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, O i = padoff; - padsv = (UNOP *) OpSIBLING(first_padsv); + padsv = cUNOPx(OpSIBLING(first_padsv)); do { ++i; padsv->op_targ = 0; PAD_COMPNAME_GEN_set(i, PERL_INT_MAX); - padsv = (UNOP *) OpSIBLING(padsv); + padsv = cUNOPx(OpSIBLING(padsv)); } while (padsv); op_free(sv); @@ -10444,19 +9394,19 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, O } if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) { - expr = op_lvalue(force_list(scalar(ref(expr, OP_ITER)), TRUE), OP_GREPSTART); + expr = op_lvalue(op_force_list(scalar(ref(expr, OP_ITER))), OP_GREPSTART); iterflags |= OPf_STACKED; } else if (expr->op_type == OP_NULL && (expr->op_flags & OPf_KIDS) && - ((BINOP*)expr)->op_first->op_type == OP_FLOP) + cBINOPx(expr)->op_first->op_type == OP_FLOP) { /* Basically turn for($x..$y) into the same as for($x,$y), but we * set the STACKED flag to indicate that these values are to be * treated as min/max values by 'pp_enteriter'. */ - const UNOP* const flip = (UNOP*)((UNOP*)((BINOP*)expr)->op_first)->op_first; - LOGOP* const range = (LOGOP*) flip->op_first; + const UNOP* const flip = cUNOPx(cUNOPx(cBINOPx(expr)->op_first)->op_first); + LOGOP* const range = cLOGOPx(flip->op_first); OP* const left = range->op_first; OP* const right = OpSIBLING(left); LISTOP* listop; @@ -10465,7 +9415,7 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, O /* detach range's children */ op_sibling_splice((OP*)range, NULL, -1, NULL); - listop = (LISTOP*)newLISTOP(OP_LIST, 0, left, right); + listop = cLISTOPx(newLISTOP(OP_LIST, 0, left, right)); listop->op_first->op_next = range->op_next; left->op_next = range->op_other; right->op_next = (OP*)listop; @@ -10477,7 +9427,7 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, O iterflags |= OPf_STACKED; } else { - expr = op_lvalue(force_list(expr, TRUE), OP_GREPSTART); + expr = op_lvalue(op_force_list(expr), OP_GREPSTART); } loop = (LOOP*)op_convert_list(OP_ENTERITER, iterflags, @@ -10554,14 +9504,14 @@ Perl_newLOOPEX(pTHX_ I32 type, OP *label /* Check for a constant argument */ if (label->op_type == OP_CONST) { - SV * const sv = ((SVOP *)label)->op_sv; + SV * const sv = cSVOPx(label)->op_sv; STRLEN l; const char *s = SvPV_const(sv,l); if (l == strlen(s)) { o = newPVOP(type, - SvUTF8(((SVOP*)label)->op_sv), + SvUTF8(cSVOPx(label)->op_sv), savesharedpv( - SvPV_nolen_const(((SVOP*)label)->op_sv))); + SvPV_nolen_const(cSVOPx(label)->op_sv))); } } @@ -10828,9 +9778,12 @@ Perl_newDEFEROP(pTHX_ I32 flags, OP *blo PERL_ARGS_ASSERT_NEWDEFEROP; + forbid_outofblock_ops(block, + (flags & (OPpDEFER_FINALLY << 8)) ? "a \"finally\" block" : "a \"defer\" block"); + start = LINKLIST(block); - /* Hide the block inside an OP_NULL with no exection */ + /* Hide the block inside an OP_NULL with no execution */ block = newUNOP(OP_NULL, 0, block); block->op_next = block; @@ -10923,7 +9876,7 @@ Perl_cv_ckproto_len_flags(pTHX_ const CV else if (SvPOK(gv) && *SvPVX((SV *)gv) == '&') name = newSVpvn_flags(SvPVX((SV *)gv)+1, SvCUR(gv)-1, SvUTF8(gv)|SVs_TEMP); else if (flags & CV_CKPROTO_CURSTASH || SvROK(gv)) { - name = sv_2mortal(newSVhek(HvNAME_HEK(PL_curstash))); + name = newSVhek_mortal(HvNAME_HEK(PL_curstash)); sv_catpvs(name, "::"); if (SvROK(gv)) { assert (SvTYPE(SvRV_const(gv)) == SVt_PVCV); @@ -11034,7 +9987,7 @@ S_op_const_sv(pTHX_ const OP *o, CV *cv, SAVEFREESV(sv); } else if (allow_lex && type == OP_PADSV) { - if (PAD_COMPNAME_FLAGS(o->op_targ) & PADNAMEt_OUTER) + if (PAD_COMPNAME_FLAGS(o->op_targ) & PADNAMEf_OUTER) { sv = &PL_sv_undef; /* an arbitrary non-null value */ padsv = TRUE; @@ -11152,8 +10105,8 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP if (proto) { assert(proto->op_type == OP_CONST); - ps = SvPV_const(((SVOP*)proto)->op_sv, ps_len); - ps_utf8 = SvUTF8(((SVOP*)proto)->op_sv); + ps = SvPV_const(cSVOPx(proto)->op_sv, ps_len); + ps_utf8 = SvUTF8(cSVOPx(proto)->op_sv); } else ps = NULL; @@ -11267,7 +10220,7 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP CvCONST_on(cv); CvISXSUB_on(cv); PoisonPADLIST(cv); - CvFLAGS(cv) |= CvMETHOD(compcv); + CvFLAGS(cv) |= CvNOWARN_AMBIGUOUS(compcv); op_free(block); SvREFCNT_dec(compcv); PL_compcv = NULL; @@ -11393,10 +10346,10 @@ Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP GV * const db_postponed = gv_fetchpvs("DB::postponed", GV_ADDMULTI, SVt_PVHV); HV *hv; - SV * const sv = Perl_newSVpvf(aTHX_ "%s:%ld-%ld", + SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" LINE_Tf "-%" LINE_Tf, CopFILE(PL_curcop), - (long)PL_subline, - (long)CopLINE(PL_curcop)); + (line_t)PL_subline, + CopLINE(PL_curcop)); if (HvNAME_HEK(PL_curstash)) { sv_sethek(tmpstr, HvNAME_HEK(PL_curstash)); sv_catpvs(tmpstr, "::"); @@ -11574,6 +10527,7 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o bool has_name; bool name_is_utf8 = o && !o_is_gv && SvUTF8(cSVOPo->op_sv); bool evanescent = FALSE; + bool isBEGIN = FALSE; OP *start = NULL; #ifdef PERL_DEBUG_READONLY_OPS OPSLAB *slab = NULL; @@ -11604,9 +10558,9 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o has_name = TRUE; } else if (PERLDB_NAMEANON && CopLINE(PL_curcop)) { SV * const sv = sv_newmortal(); - Perl_sv_setpvf(aTHX_ sv, "%s[%s:%" IVdf "]", + Perl_sv_setpvf(aTHX_ sv, "%s[%s:%" LINE_Tf "]", PL_curstash ? "__ANON__" : "__ANON__::__ANON__", - CopFILE(PL_curcop), (IV)CopLINE(PL_curcop)); + CopFILE(PL_curcop), CopLINE(PL_curcop)); gv = gv_fetchsv(sv, gv_fetch_flags, SVt_PVCV); has_name = TRUE; } else if (PL_curstash) { @@ -11626,14 +10580,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o } } - if (proto) { - assert(proto->op_type == OP_CONST); - ps = SvPV_const(((SVOP*)proto)->op_sv, ps_len); - ps_utf8 = SvUTF8(((SVOP*)proto)->op_sv); - } - else - ps = NULL; - if (o) SAVEFREEOP(o); if (proto) @@ -11641,6 +10587,37 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o if (attrs) SAVEFREEOP(attrs); + /* we need this in two places later on, so set it up here */ + if (name && block) { + const char *s = (char *) my_memrchr(name, ':', namlen); + s = s ? s+1 : name; + isBEGIN = strEQ(s,"BEGIN"); + } + + if (isBEGIN) { + /* Make sure that we do not have any prototypes or + * attributes associated with this BEGIN block, as the block + * is already done and dusted, and we will assert or worse + * if we try to attach the prototype to the now essentially + * nonexistent sub. */ + if (proto) + /* diag_listed_as: %s on BEGIN block ignored */ + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Prototype on BEGIN block ignored"); + if (attrs) + /* diag_listed_as: %s on BEGIN block ignored */ + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Attribute on BEGIN block ignored"); + proto = NULL; + attrs = NULL; + } + + if (proto) { + assert(proto->op_type == OP_CONST); + ps = SvPV_const(cSVOPx(proto)->op_sv, ps_len); + ps_utf8 = SvUTF8(cSVOPx(proto)->op_sv); + } + else + ps = NULL; + if (ec) { op_free(block); @@ -11650,18 +10627,14 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o cv = PL_compcv; PL_compcv = 0; - if (name && block) { - const char *s = (char *) my_memrchr(name, ':', namlen); - s = s ? s+1 : name; - if (strEQ(s, "BEGIN")) { - if (PL_in_eval & EVAL_KEEPERR) - Perl_croak_nocontext("BEGIN not safe after errors--compilation aborted"); - else { - SV * const errsv = ERRSV; - /* force display of errors found but not reported */ - sv_catpvs(errsv, "BEGIN not safe after errors--compilation aborted"); - Perl_croak_nocontext("%" SVf, SVfARG(errsv)); - } + if (isBEGIN) { + if (PL_in_eval & EVAL_KEEPERR) + Perl_croak_nocontext("BEGIN not safe after errors--compilation aborted"); + else { + SV * const errsv = ERRSV; + /* force display of errors found but not reported */ + sv_catpvs(errsv, "BEGIN not safe after errors--compilation aborted"); + Perl_croak_nocontext("%" SVf, SVfARG(errsv)); } } goto done; @@ -11711,6 +10684,8 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o if (block) { assert(PL_parser); + if (CvIsMETHOD(PL_compcv)) + block = class_wrap_method_body(block); /* This makes sub {}; work as expected. */ if (block->op_type == OP_STUB) { const line_t l = PL_parser->copline; @@ -11756,7 +10731,9 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o if (ckWARN(WARN_REDEFINE) || ( ckWARN_d(WARN_REDEFINE) && ( !const_sv || SvRV(gv) == const_sv - || sv_cmp(SvRV(gv), const_sv) ))) { + || SvTYPE(const_sv) == SVt_PVAV + || SvTYPE(SvRV(gv)) == SVt_PVAV + || sv_cmp(SvRV(gv), const_sv) ))) { assert(cSVOPo); Perl_warner(aTHX_ packWARN(WARN_REDEFINE), "Constant subroutine %" SVf " redefined", @@ -11805,10 +10782,10 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o CvCONST_on(cv); CvISXSUB_on(cv); PoisonPADLIST(cv); - CvFLAGS(cv) |= CvMETHOD(PL_compcv); + CvFLAGS(cv) |= CvNOWARN_AMBIGUOUS(PL_compcv); } else { - if (isGV(gv) || CvMETHOD(PL_compcv)) { + if (isGV(gv) || CvNOWARN_AMBIGUOUS(PL_compcv)) { if (name && isGV(gv)) GvCV_set(gv, NULL); cv = newCONSTSUB_flags( @@ -11817,7 +10794,7 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o ); assert(cv); assert(SvREFCNT((SV*)cv) != 0); - CvFLAGS(cv) |= CvMETHOD(PL_compcv); + CvFLAGS(cv) |= CvNOWARN_AMBIGUOUS(PL_compcv); } else { if (!SvROK(gv)) { @@ -11981,10 +10958,10 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o GV * const db_postponed = gv_fetchpvs("DB::postponed", GV_ADDMULTI, SVt_PVHV); HV *hv; - SV * const sv = Perl_newSVpvf(aTHX_ "%s:%ld-%ld", + SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" LINE_Tf "-%" LINE_Tf, CopFILE(PL_curcop), - (long)PL_subline, - (long)CopLINE(PL_curcop)); + (line_t)PL_subline, + CopLINE(PL_curcop)); (void)hv_store_ent(GvHV(PL_DBsub), tmpstr, sv, 0); hv = GvHVn(db_postponed); if (HvTOTALKEYS(hv) > 0 && hv_exists_ent(hv, tmpstr, 0)) { @@ -12065,12 +11042,80 @@ S_process_special_blocks(pTHX_ I32 floor if (*name == 'B') { if (strEQ(name, "BEGIN")) { + /* can't goto a declaration, but a null statement is fine */ + module_install_hack: ; const I32 oldscope = PL_scopestack_ix; + SV *max_nest_sv = NULL; + IV max_nest_iv; dSP; (void)CvGV(cv); if (floor) LEAVE_SCOPE(floor); ENTER; + /* Make sure we don't recurse too deeply into BEGIN blocks, + * but let the user control it via the new control variable + * + * ${^MAX_NESTED_EVAL_BEGIN_BLOCKS} + * + * Note that this code (when max_nest_iv is 1) *looks* like + * it would block the following code: + * + * BEGIN { $n |= 1; BEGIN { $n |= 2; BEGIN { $n |= 4 } } } + * + * but it does *not*; this code will happily execute when + * the nest limit is 1. The reason is revealed in the + * execution order. If we could watch $n in this code, we + * would see the following order of modifications: + * + * $n |= 4; + * $n |= 2; + * $n |= 1; + * + * This is because nested BEGIN blocks execute in FILO + * order; this is because BEGIN blocks are defined to + * execute immediately once they are closed. So the + * innermost block is closed first, and it executes, which + * increments the eval_begin_nest_depth by 1, and then it + * finishes, which drops eval_begin_nest_depth back to its + * previous value. This happens in turn as each BEGIN is + * completed. + * + * The *only* place these counts matter is when BEGIN is + * inside of some kind of string eval, either a require or a + * true eval. Only in that case would there be any nesting + * and would perl try to execute a BEGIN before another had + * completed. + * + * Thus this logic puts an upper limit on module nesting. + * Hence the reason we let the user control it, although it + * is hard to imagine a 1000-level-deep module use + * dependency even in a very large codebase. The real + * objective is to prevent code like this: + * + * perl -e'sub f { eval "BEGIN { f() }" } f()' + * + * from segfaulting due to stack exhaustion. + * + */ + max_nest_sv = get_sv(PERL_VAR_MAX_NESTED_EVAL_BEGIN_BLOCKS, GV_ADD); + if (!SvOK(max_nest_sv)) + sv_setiv(max_nest_sv, PERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT); + max_nest_iv = SvIV(max_nest_sv); + if (max_nest_iv < 0) { + max_nest_iv = PERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT; + sv_setiv(max_nest_sv, max_nest_iv); + } + + /* (UV) below is just to silence a compiler warning, and should be + * effectively a no-op, as max_nest_iv will never be negative here. + */ + if (PL_eval_begin_nest_depth >= (UV)max_nest_iv) { + Perl_croak(aTHX_ "Too many nested BEGIN blocks, maximum of %" IVdf " allowed", + max_nest_iv); + } + SAVEINT(PL_eval_begin_nest_depth); + PL_eval_begin_nest_depth++; + SAVEVPTR(PL_curcop); if (PL_curcop == &PL_compiling) { /* Avoid pushing the "global" &PL_compiling onto the @@ -12133,6 +11178,28 @@ S_process_special_blocks(pTHX_ I32 floor return FALSE; } else if (*name == 'I') { if (strEQ(name, "INIT")) { +#ifdef MI_INIT_WORKAROUND_PACK + { + HV *hv = CvSTASH(cv); + STRLEN len = hv ? HvNAMELEN(hv) : 0; + char *pv = (len == sizeof(MI_INIT_WORKAROUND_PACK)-1) + ? HvNAME_get(hv) : NULL; + if ( pv && strEQ(pv, MI_INIT_WORKAROUND_PACK) ) { + /* old versions of Module::Install::DSL contain code + * that creates an INIT in eval, which expects to run + * after an exit(0) in BEGIN. This unfortunately + * breaks a lot of code in the CPAN river. So we magically + * convert INIT blocks from Module::Install::DSL to + * be BEGIN blocks. Which works out, since the INIT + * blocks it creates are eval'ed and so are late. + */ + Perl_warn(aTHX_ "Treating %s::INIT block as BEGIN block as workaround", + MI_INIT_WORKAROUND_PACK); + goto module_install_hack; + } + + } +#endif if (PL_main_start) /* diag_listed_as: Too late to run %s block */ Perl_ck_warner(aTHX_ packWARN(WARN_VOID), @@ -12599,15 +11666,21 @@ OP * Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block) { SV * const cv = MUTABLE_SV(newATTRSUB(floor, 0, proto, attrs, block)); + + bool is_const = CvANONCONST(cv); + OP * anoncode = - newSVOP(OP_ANONCODE, 0, + newSVOP(OP_ANONCODE, is_const ? 0 : OPf_REF, cv); - if (CvANONCONST(cv)) - anoncode = newUNOP(OP_ANONCONST, 0, + + if (is_const) { + anoncode = newUNOP(OP_ANONCONST, OPf_REF, op_convert_list(OP_ENTERSUB, OPf_STACKED|OPf_WANT_SCALAR, anoncode)); - return newUNOP(OP_REFGEN, 0, anoncode); + } + + return anoncode; } OP * @@ -12683,6 +11756,13 @@ Perl_newGVREF(pTHX_ I32 type, OP *o) { if (type == OP_MAPSTART || type == OP_GREPSTART || type == OP_SORT) return newUNOP(OP_NULL, 0, o); + + if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED && + ((PL_opargs[type] >> OASHIFT) & 7) == OA_FILEREF && + o->op_type == OP_CONST && (o->op_private & OPpCONST_BARE)) { + no_bareword_filehandle(SvPVX(cSVOPo_sv)); + } + return ref(newUNOP(OP_RV2GV, OPf_REF, o), type); } @@ -12856,5671 +11936,3091 @@ is_dollar_bracket(pTHX_ const OP * const OP * Perl_ck_cmp(pTHX_ OP *o) -{ - bool is_eq; - bool neg; - bool reverse; - bool iv0; - OP *indexop, *constop, *start; - SV *sv; - IV iv; - - PERL_ARGS_ASSERT_CK_CMP; - - is_eq = ( o->op_type == OP_EQ - || o->op_type == OP_NE - || o->op_type == OP_I_EQ - || o->op_type == OP_I_NE); - - if (!is_eq && ckWARN(WARN_SYNTAX)) { - const OP *kid = cUNOPo->op_first; - if (kid && - ( - ( is_dollar_bracket(aTHX_ kid) - && OpSIBLING(kid) && OpSIBLING(kid)->op_type == OP_CONST - ) - || ( kid->op_type == OP_CONST - && (kid = OpSIBLING(kid)) && is_dollar_bracket(aTHX_ kid) - ) - ) - ) - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "$[ used in %s (did you mean $] ?)", OP_DESC(o)); - } - - /* convert (index(...) == -1) and variations into - * (r)index/BOOL(,NEG) - */ - - reverse = FALSE; - - indexop = cUNOPo->op_first; - constop = OpSIBLING(indexop); - start = NULL; - if (indexop->op_type == OP_CONST) { - constop = indexop; - indexop = OpSIBLING(constop); - start = constop; - reverse = TRUE; - } - - if (indexop->op_type != OP_INDEX && indexop->op_type != OP_RINDEX) - return o; - - /* ($lex = index(....)) == -1 */ - if (indexop->op_private & OPpTARGET_MY) - return o; - - if (constop->op_type != OP_CONST) - return o; - - sv = cSVOPx_sv(constop); - if (!(sv && SvIOK_notUV(sv))) - return o; - - iv = SvIVX(sv); - if (iv != -1 && iv != 0) - return o; - iv0 = (iv == 0); - - if (o->op_type == OP_LT || o->op_type == OP_I_LT) { - if (!(iv0 ^ reverse)) - return o; - neg = iv0; - } - else if (o->op_type == OP_LE || o->op_type == OP_I_LE) { - if (iv0 ^ reverse) - return o; - neg = !iv0; - } - else if (o->op_type == OP_GE || o->op_type == OP_I_GE) { - if (!(iv0 ^ reverse)) - return o; - neg = !iv0; - } - else if (o->op_type == OP_GT || o->op_type == OP_I_GT) { - if (iv0 ^ reverse) - return o; - neg = iv0; - } - else if (o->op_type == OP_EQ || o->op_type == OP_I_EQ) { - if (iv0) - return o; - neg = TRUE; - } - else { - assert(o->op_type == OP_NE || o->op_type == OP_I_NE); - if (iv0) - return o; - neg = FALSE; - } - - indexop->op_flags &= ~OPf_PARENS; - indexop->op_flags |= (o->op_flags & OPf_PARENS); - indexop->op_private |= OPpTRUEBOOL; - if (neg) - indexop->op_private |= OPpINDEX_BOOLNEG; - /* cut out the index op and free the eq,const ops */ - (void)op_sibling_splice(o, start, 1, NULL); - op_free(o); - - return indexop; -} - - -OP * -Perl_ck_concat(pTHX_ OP *o) -{ - const OP * const kid = cUNOPo->op_first; - - PERL_ARGS_ASSERT_CK_CONCAT; - PERL_UNUSED_CONTEXT; - - /* reuse the padtmp returned by the concat child */ - if (kid->op_type == OP_CONCAT && !(kid->op_private & OPpTARGET_MY) && - !(kUNOP->op_first->op_flags & OPf_MOD)) - { - o->op_flags |= OPf_STACKED; - o->op_private |= OPpCONCAT_NESTED; - } - return o; -} - -OP * -Perl_ck_spair(pTHX_ OP *o) -{ - - PERL_ARGS_ASSERT_CK_SPAIR; - - if (o->op_flags & OPf_KIDS) { - OP* newop; - OP* kid; - OP* kidkid; - const OPCODE type = o->op_type; - o = modkids(ck_fun(o), type); - kid = cUNOPo->op_first; - kidkid = kUNOP->op_first; - newop = OpSIBLING(kidkid); - if (newop) { - const OPCODE type = newop->op_type; - if (OpHAS_SIBLING(newop)) - return o; - if (o->op_type == OP_REFGEN - && ( type == OP_RV2CV - || ( !(newop->op_flags & OPf_PARENS) - && ( type == OP_RV2AV || type == OP_PADAV - || type == OP_RV2HV || type == OP_PADHV)))) - NOOP; /* OK (allow srefgen for \@a and \%h) */ - else if (OP_GIMME(newop,0) != G_SCALAR) - return o; - } - /* excise first sibling */ - op_sibling_splice(kid, NULL, 1, NULL); - op_free(kidkid); - } - /* transforms OP_REFGEN into OP_SREFGEN, OP_CHOP into OP_SCHOP, - * and OP_CHOMP into OP_SCHOMP */ - o->op_ppaddr = PL_ppaddr[++o->op_type]; - return ck_fun(o); -} - -OP * -Perl_ck_delete(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_DELETE; - - o = ck_fun(o); - o->op_private = 0; - if (o->op_flags & OPf_KIDS) { - OP * const kid = cUNOPo->op_first; - switch (kid->op_type) { - case OP_ASLICE: - o->op_flags |= OPf_SPECIAL; - /* FALLTHROUGH */ - case OP_HSLICE: - o->op_private |= OPpSLICE; - break; - case OP_AELEM: - o->op_flags |= OPf_SPECIAL; - /* FALLTHROUGH */ - case OP_HELEM: - break; - case OP_KVASLICE: - o->op_flags |= OPf_SPECIAL; - /* FALLTHROUGH */ - case OP_KVHSLICE: - o->op_private |= OPpKVSLICE; - break; - default: - Perl_croak(aTHX_ "delete argument is not a HASH or ARRAY " - "element or slice"); - } - if (kid->op_private & OPpLVAL_INTRO) - o->op_private |= OPpLVAL_INTRO; - op_null(kid); - } - return o; -} - -OP * -Perl_ck_eof(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_EOF; - - if (o->op_flags & OPf_KIDS) { - OP *kid; - if (cLISTOPo->op_first->op_type == OP_STUB) { - OP * const newop - = newUNOP(o->op_type, OPf_SPECIAL, newGVOP(OP_GV, 0, PL_argvgv)); - op_free(o); - o = newop; - } - o = ck_fun(o); - kid = cLISTOPo->op_first; - if (kid->op_type == OP_RV2GV) - kid->op_private |= OPpALLOW_FAKE; - } - return o; -} - - -OP * -Perl_ck_eval(pTHX_ OP *o) -{ - - PERL_ARGS_ASSERT_CK_EVAL; - - PL_hints |= HINT_BLOCK_SCOPE; - if (o->op_flags & OPf_KIDS) { - SVOP * const kid = (SVOP*)cUNOPo->op_first; - assert(kid); - - if (o->op_type == OP_ENTERTRY) { - LOGOP *enter; - - /* cut whole sibling chain free from o */ - op_sibling_splice(o, NULL, -1, NULL); - op_free(o); - - enter = alloc_LOGOP(OP_ENTERTRY, NULL, NULL); - - /* establish postfix order */ - enter->op_next = (OP*)enter; - - o = op_prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid); - OpTYPE_set(o, OP_LEAVETRY); - enter->op_other = o; - return o; - } - else { - scalar((OP*)kid); - S_set_haseval(aTHX); - } - } - else { - const U8 priv = o->op_private; - op_free(o); - /* the newUNOP will recursively call ck_eval(), which will handle - * all the stuff at the end of this function, like adding - * OP_HINTSEVAL - */ - return newUNOP(OP_ENTEREVAL, priv <<8, newDEFSVOP()); - } - o->op_targ = (PADOFFSET)PL_hints; - if (o->op_private & OPpEVAL_BYTES) o->op_targ &= ~HINT_UTF8; - if ((PL_hints & HINT_LOCALIZE_HH) != 0 - && !(o->op_private & OPpEVAL_COPHH) && GvHV(PL_hintgv)) { - /* Store a copy of %^H that pp_entereval can pick up. */ - HV *hh = hv_copy_hints_hv(GvHV(PL_hintgv)); - OP *hhop; - STOREFEATUREBITSHH(hh); - hhop = newSVOP(OP_HINTSEVAL, 0, MUTABLE_SV(hh)); - /* append hhop to only child */ - op_sibling_splice(o, cUNOPo->op_first, 0, hhop); - - o->op_private |= OPpEVAL_HAS_HH; - } - if (!(o->op_private & OPpEVAL_BYTES) - && FEATURE_UNIEVAL_IS_ENABLED) - o->op_private |= OPpEVAL_UNICODE; - return o; -} - -OP * -Perl_ck_trycatch(pTHX_ OP *o) -{ - LOGOP *enter; - OP *to_free = NULL; - OP *trykid, *catchkid; - OP *catchroot, *catchstart; - - PERL_ARGS_ASSERT_CK_TRYCATCH; - - trykid = cUNOPo->op_first; - if(trykid->op_type == OP_NULL || trykid->op_type == OP_PUSHMARK) { - to_free = trykid; - trykid = OpSIBLING(trykid); - } - catchkid = OpSIBLING(trykid); - - assert(trykid->op_type == OP_POPTRY); - assert(catchkid->op_type == OP_CATCH); - - /* cut whole sibling chain free from o */ - op_sibling_splice(o, NULL, -1, NULL); - if(to_free) - op_free(to_free); - op_free(o); - - enter = alloc_LOGOP(OP_ENTERTRYCATCH, NULL, NULL); - - /* establish postfix order */ - enter->op_next = (OP*)enter; - - o = op_prepend_elem(OP_LINESEQ, (OP*)enter, trykid); - op_append_elem(OP_LINESEQ, (OP*)o, catchkid); - - OpTYPE_set(o, OP_LEAVETRYCATCH); - - /* The returned optree is actually threaded up slightly nonobviously in - * terms of its ->op_next pointers. - * - * This way, if the tryblock dies, its retop points at the OP_CATCH, but - * if it does not then its leavetry skips over that and continues - * execution past it. - */ - - /* First, link up the actual body of the catch block */ - catchroot = OpSIBLING(cUNOPx(catchkid)->op_first); - catchstart = LINKLIST(catchroot); - cLOGOPx(catchkid)->op_other = catchstart; - - o->op_next = LINKLIST(o); - - /* die within try block should jump to the catch */ - enter->op_other = catchkid; - - /* after try block that doesn't die, just skip straight to leavetrycatch */ - trykid->op_next = o; - - /* after catch block, skip back up to the leavetrycatch */ - catchroot->op_next = o; - - return o; -} - -OP * -Perl_ck_exec(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_EXEC; - - if (o->op_flags & OPf_STACKED) { - OP *kid; - o = ck_fun(o); - kid = OpSIBLING(cUNOPo->op_first); - if (kid->op_type == OP_RV2GV) - op_null(kid); - } - else - o = listkids(o); - return o; -} - -OP * -Perl_ck_exists(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_EXISTS; - - o = ck_fun(o); - if (o->op_flags & OPf_KIDS) { - OP * const kid = cUNOPo->op_first; - if (kid->op_type == OP_ENTERSUB) { - (void) ref(kid, o->op_type); - if (kid->op_type != OP_RV2CV - && !(PL_parser && PL_parser->error_count)) - Perl_croak(aTHX_ - "exists argument is not a subroutine name"); - o->op_private |= OPpEXISTS_SUB; - } - else if (kid->op_type == OP_AELEM) - o->op_flags |= OPf_SPECIAL; - else if (kid->op_type != OP_HELEM) - Perl_croak(aTHX_ "exists argument is not a HASH or ARRAY " - "element or a subroutine"); - op_null(kid); - } - return o; -} - -OP * -Perl_ck_rvconst(pTHX_ OP *o) -{ - SVOP * const kid = (SVOP*)cUNOPo->op_first; - - PERL_ARGS_ASSERT_CK_RVCONST; - - if (o->op_type == OP_RV2HV) - /* rv2hv steals the bottom bit for its own uses */ - o->op_private &= ~OPpARG1_MASK; - - o->op_private |= (PL_hints & HINT_STRICT_REFS); - - if (kid->op_type == OP_CONST) { - int iscv; - GV *gv; - SV * const kidsv = kid->op_sv; - - /* Is it a constant from cv_const_sv()? */ - if ((SvROK(kidsv) || isGV_with_GP(kidsv)) && SvREADONLY(kidsv)) { - return o; - } - if (SvTYPE(kidsv) == SVt_PVAV) return o; - if ((o->op_private & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) { - const char *badthing; - switch (o->op_type) { - case OP_RV2SV: - badthing = "a SCALAR"; - break; - case OP_RV2AV: - badthing = "an ARRAY"; - break; - case OP_RV2HV: - badthing = "a HASH"; - break; - default: - badthing = NULL; - break; - } - if (badthing) - Perl_croak(aTHX_ - "Can't use bareword (\"%" SVf "\") as %s ref while \"strict refs\" in use", - SVfARG(kidsv), badthing); - } - /* - * This is a little tricky. We only want to add the symbol if we - * didn't add it in the lexer. Otherwise we get duplicate strict - * warnings. But if we didn't add it in the lexer, we must at - * least pretend like we wanted to add it even if it existed before, - * or we get possible typo warnings. OPpCONST_ENTERED says - * whether the lexer already added THIS instance of this symbol. - */ - iscv = o->op_type == OP_RV2CV ? GV_NOEXPAND|GV_ADDMULTI : 0; - gv = gv_fetchsv(kidsv, - o->op_type == OP_RV2CV - && o->op_private & OPpMAY_RETURN_CONSTANT - ? GV_NOEXPAND - : iscv | !(kid->op_private & OPpCONST_ENTERED), - iscv - ? SVt_PVCV - : o->op_type == OP_RV2SV - ? SVt_PV - : o->op_type == OP_RV2AV - ? SVt_PVAV - : o->op_type == OP_RV2HV - ? SVt_PVHV - : SVt_PVGV); - if (gv) { - if (!isGV(gv)) { - assert(iscv); - assert(SvROK(gv)); - if (!(o->op_private & OPpMAY_RETURN_CONSTANT) - && SvTYPE(SvRV(gv)) != SVt_PVCV) - gv_fetchsv(kidsv, GV_ADDMULTI, SVt_PVCV); - } - OpTYPE_set(kid, OP_GV); - SvREFCNT_dec(kid->op_sv); -#ifdef USE_ITHREADS - /* XXX hack: dependence on sizeof(PADOP) <= sizeof(SVOP) */ - STATIC_ASSERT_STMT(sizeof(PADOP) <= sizeof(SVOP)); - kPADOP->op_padix = pad_alloc(OP_GV, SVf_READONLY); - SvREFCNT_dec(PAD_SVl(kPADOP->op_padix)); - PAD_SETSV(kPADOP->op_padix, MUTABLE_SV(SvREFCNT_inc_simple_NN(gv))); -#else - kid->op_sv = SvREFCNT_inc_simple_NN(gv); -#endif - kid->op_private = 0; - /* FAKE globs in the symbol table cause weird bugs (#77810) */ - SvFAKE_off(gv); - } - } - return o; -} - -OP * -Perl_ck_ftst(pTHX_ OP *o) -{ - const I32 type = o->op_type; - - PERL_ARGS_ASSERT_CK_FTST; - - if (o->op_flags & OPf_REF) { - NOOP; - } - else if (o->op_flags & OPf_KIDS && cUNOPo->op_first->op_type != OP_STUB) { - SVOP * const kid = (SVOP*)cUNOPo->op_first; - const OPCODE kidtype = kid->op_type; - - if (kidtype == OP_CONST && (kid->op_private & OPpCONST_BARE) - && !kid->op_folded) { - OP * const newop = newGVOP(type, OPf_REF, - gv_fetchsv(kid->op_sv, GV_ADD, SVt_PVIO)); - op_free(o); - return newop; - } - - if ((kidtype == OP_RV2AV || kidtype == OP_PADAV) && ckWARN(WARN_SYNTAX)) { - SV *name = S_op_varname_subscript(aTHX_ (OP*)kid, 2); - if (name) { - /* diag_listed_as: Array passed to stat will be coerced to a scalar%s */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%s (did you want stat %" SVf "?)", - array_passed_to_stat, name); - } - else { - /* diag_listed_as: Array passed to stat will be coerced to a scalar%s */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%s", array_passed_to_stat); - } - } - scalar((OP *) kid); - if ((PL_hints & HINT_FILETEST_ACCESS) && OP_IS_FILETEST_ACCESS(o->op_type)) - o->op_private |= OPpFT_ACCESS; - if (OP_IS_FILETEST(type) - && OP_IS_FILETEST(kidtype) - ) { - o->op_private |= OPpFT_STACKED; - kid->op_private |= OPpFT_STACKING; - if (kidtype == OP_FTTTY && ( - !(kid->op_private & OPpFT_STACKED) - || kid->op_private & OPpFT_AFTER_t - )) - o->op_private |= OPpFT_AFTER_t; - } - } - else { - op_free(o); - if (type == OP_FTTTY) - o = newGVOP(type, OPf_REF, PL_stdingv); - else - o = newUNOP(type, 0, newDEFSVOP()); - } - return o; -} - -OP * -Perl_ck_fun(pTHX_ OP *o) -{ - const int type = o->op_type; - I32 oa = PL_opargs[type] >> OASHIFT; - - PERL_ARGS_ASSERT_CK_FUN; - - if (o->op_flags & OPf_STACKED) { - if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL)) - oa &= ~OA_OPTIONAL; - else - return no_fh_allowed(o); - } - - if (o->op_flags & OPf_KIDS) { - OP *prev_kid = NULL; - OP *kid = cLISTOPo->op_first; - I32 numargs = 0; - bool seen_optional = FALSE; - - if (kid->op_type == OP_PUSHMARK || - (kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK)) - { - prev_kid = kid; - kid = OpSIBLING(kid); - } - if (kid && kid->op_type == OP_COREARGS) { - bool optional = FALSE; - while (oa) { - numargs++; - if (oa & OA_OPTIONAL) optional = TRUE; - oa = oa >> 4; - } - if (optional) o->op_private |= numargs; - return o; - } - - while (oa) { - if (oa & OA_OPTIONAL || (oa & 7) == OA_LIST) { - if (!kid && !seen_optional && PL_opargs[type] & OA_DEFGV) { - kid = newDEFSVOP(); - /* append kid to chain */ - op_sibling_splice(o, prev_kid, 0, kid); - } - seen_optional = TRUE; - } - if (!kid) break; - - numargs++; - switch (oa & 7) { - case OA_SCALAR: - /* list seen where single (scalar) arg expected? */ - if (numargs == 1 && !(oa >> 4) - && kid->op_type == OP_LIST && type != OP_SCALAR) - { - return too_many_arguments_pv(o,PL_op_desc[type], 0); - } - if (type != OP_DELETE) scalar(kid); - break; - case OA_LIST: - if (oa < 16) { - kid = 0; - continue; - } - else - list(kid); - break; - case OA_AVREF: - if ((type == OP_PUSH || type == OP_UNSHIFT) - && !OpHAS_SIBLING(kid)) - Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), - "Useless use of %s with no values", - PL_op_desc[type]); - - if (kid->op_type == OP_CONST - && ( !SvROK(cSVOPx_sv(kid)) - || SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVAV ) - ) - bad_type_pv(numargs, "array", o, kid); - else if (kid->op_type == OP_RV2HV || kid->op_type == OP_PADHV - || kid->op_type == OP_RV2GV) { - bad_type_pv(1, "array", o, kid); - } - else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV) { - yyerror_pv(Perl_form(aTHX_ "Experimental %s on scalar is now forbidden", - PL_op_desc[type]), 0); - } - else { - op_lvalue(kid, type); - } - break; - case OA_HVREF: - if (kid->op_type != OP_RV2HV && kid->op_type != OP_PADHV) - bad_type_pv(numargs, "hash", o, kid); - op_lvalue(kid, type); - break; - case OA_CVREF: - { - /* replace kid with newop in chain */ - OP * const newop = - S_op_sibling_newUNOP(aTHX_ o, prev_kid, OP_NULL, 0); - newop->op_next = newop; - kid = newop; - } - break; - case OA_FILEREF: - if (kid->op_type != OP_GV && kid->op_type != OP_RV2GV) { - if (kid->op_type == OP_CONST && - (kid->op_private & OPpCONST_BARE)) - { - OP * const newop = newGVOP(OP_GV, 0, - gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVIO)); - /* a first argument is handled by toke.c, ideally we'd - just check here but several ops don't use ck_fun() */ - if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED && numargs > 1) { - no_bareword_filehandle(SvPVX(cSVOPx_sv((SVOP*)kid))); - } - /* replace kid with newop in chain */ - op_sibling_splice(o, prev_kid, 1, newop); - op_free(kid); - kid = newop; - } - else if (kid->op_type == OP_READLINE) { - /* neophyte patrol: open(), close() etc. */ - bad_type_pv(numargs, "HANDLE", o, kid); - } - else { - I32 flags = OPf_SPECIAL; - I32 priv = 0; - PADOFFSET targ = 0; - - /* is this op a FH constructor? */ - if (is_handle_constructor(o,numargs)) { - const char *name = NULL; - STRLEN len = 0; - U32 name_utf8 = 0; - bool want_dollar = TRUE; - - flags = 0; - /* Set a flag to tell rv2gv to vivify - * need to "prove" flag does not mean something - * else already - NI-S 1999/05/07 - */ - priv = OPpDEREF; - if (kid->op_type == OP_PADSV) { - PADNAME * const pn - = PAD_COMPNAME_SV(kid->op_targ); - name = PadnamePV (pn); - len = PadnameLEN(pn); - name_utf8 = PadnameUTF8(pn); - } - else if (kid->op_type == OP_RV2SV - && kUNOP->op_first->op_type == OP_GV) - { - GV * const gv = cGVOPx_gv(kUNOP->op_first); - name = GvNAME(gv); - len = GvNAMELEN(gv); - name_utf8 = GvNAMEUTF8(gv) ? SVf_UTF8 : 0; - } - else if (kid->op_type == OP_AELEM - || kid->op_type == OP_HELEM) - { - OP *firstop; - OP *op = ((BINOP*)kid)->op_first; - name = NULL; - if (op) { - SV *tmpstr = NULL; - const char * const a = - kid->op_type == OP_AELEM ? - "[]" : "{}"; - if (((op->op_type == OP_RV2AV) || - (op->op_type == OP_RV2HV)) && - (firstop = ((UNOP*)op)->op_first) && - (firstop->op_type == OP_GV)) { - /* packagevar $a[] or $h{} */ - GV * const gv = cGVOPx_gv(firstop); - if (gv) - tmpstr = - Perl_newSVpvf(aTHX_ - "%s%c...%c", - GvNAME(gv), - a[0], a[1]); - } - else if (op->op_type == OP_PADAV - || op->op_type == OP_PADHV) { - /* lexicalvar $a[] or $h{} */ - const char * const padname = - PAD_COMPNAME_PV(op->op_targ); - if (padname) - tmpstr = - Perl_newSVpvf(aTHX_ - "%s%c...%c", - padname + 1, - a[0], a[1]); - } - if (tmpstr) { - name = SvPV_const(tmpstr, len); - name_utf8 = SvUTF8(tmpstr); - sv_2mortal(tmpstr); - } - } - if (!name) { - name = "__ANONIO__"; - len = 10; - want_dollar = FALSE; - } - op_lvalue(kid, type); - } - if (name) { - SV *namesv; - targ = pad_alloc(OP_RV2GV, SVf_READONLY); - namesv = PAD_SVl(targ); - if (want_dollar && *name != '$') - sv_setpvs(namesv, "$"); - else - SvPVCLEAR(namesv); - sv_catpvn(namesv, name, len); - if ( name_utf8 ) SvUTF8_on(namesv); - } - } - scalar(kid); - kid = S_op_sibling_newUNOP(aTHX_ o, prev_kid, - OP_RV2GV, flags); - kid->op_targ = targ; - kid->op_private |= priv; - } - } - scalar(kid); - break; - case OA_SCALARREF: - if ((type == OP_UNDEF || type == OP_POS) - && numargs == 1 && !(oa >> 4) - && kid->op_type == OP_LIST) - return too_many_arguments_pv(o,PL_op_desc[type], 0); - op_lvalue(scalar(kid), type); - break; - } - oa >>= 4; - prev_kid = kid; - kid = OpSIBLING(kid); - } - /* FIXME - should the numargs or-ing move after the too many - * arguments check? */ - o->op_private |= numargs; - if (kid) - return too_many_arguments_pv(o,OP_DESC(o), 0); - listkids(o); - } - else if (PL_opargs[type] & OA_DEFGV) { - /* Ordering of these two is important to keep f_map.t passing. */ - op_free(o); - return newUNOP(type, 0, newDEFSVOP()); - } - - if (oa) { - while (oa & OA_OPTIONAL) - oa >>= 4; - if (oa && oa != OA_LIST) - return too_few_arguments_pv(o,OP_DESC(o), 0); - } - return o; -} - -OP * -Perl_ck_glob(pTHX_ OP *o) -{ - GV *gv; - - PERL_ARGS_ASSERT_CK_GLOB; - - o = ck_fun(o); - if ((o->op_flags & OPf_KIDS) && !OpHAS_SIBLING(cLISTOPo->op_first)) - op_append_elem(OP_GLOB, o, newDEFSVOP()); /* glob() => glob($_) */ - - if (!(o->op_flags & OPf_SPECIAL) && (gv = gv_override("glob", 4))) - { - /* convert - * glob - * \ null - const(wildcard) - * into - * null - * \ enter - * \ list - * \ mark - glob - rv2cv - * | \ gv(CORE::GLOBAL::glob) - * | - * \ null - const(wildcard) - */ - o->op_flags |= OPf_SPECIAL; - o->op_targ = pad_alloc(OP_GLOB, SVs_PADTMP); - o = S_new_entersubop(aTHX_ gv, o); - o = newUNOP(OP_NULL, 0, o); - o->op_targ = OP_GLOB; /* hint at what it used to be: eg in newWHILEOP */ - return o; - } - else o->op_flags &= ~OPf_SPECIAL; -#if !defined(PERL_EXTERNAL_GLOB) - if (!PL_globhook) { - ENTER; - Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, - newSVpvs("File::Glob"), NULL, NULL, NULL); - LEAVE; - } -#endif /* !PERL_EXTERNAL_GLOB */ - gv = (GV *)newSV_type(SVt_NULL); - gv_init(gv, 0, "", 0, 0); - gv_IOadd(gv); - op_append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv)); - SvREFCNT_dec_NN(gv); /* newGVOP increased it */ - scalarkids(o); - return o; -} - -OP * -Perl_ck_grep(pTHX_ OP *o) -{ - LOGOP *gwop; - OP *kid; - const OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE; - - PERL_ARGS_ASSERT_CK_GREP; - - /* don't allocate gwop here, as we may leak it if PL_parser->error_count > 0 */ - - if (o->op_flags & OPf_STACKED) { - kid = cUNOPx(OpSIBLING(cLISTOPo->op_first))->op_first; - if (kid->op_type != OP_SCOPE && kid->op_type != OP_LEAVE) - return no_fh_allowed(o); - o->op_flags &= ~OPf_STACKED; - } - kid = OpSIBLING(cLISTOPo->op_first); - if (type == OP_MAPWHILE) - list(kid); - else - scalar(kid); - o = ck_fun(o); - if (PL_parser && PL_parser->error_count) - return o; - kid = OpSIBLING(cLISTOPo->op_first); - if (kid->op_type != OP_NULL) - Perl_croak(aTHX_ "panic: ck_grep, type=%u", (unsigned) kid->op_type); - kid = kUNOP->op_first; - - gwop = alloc_LOGOP(type, o, LINKLIST(kid)); - kid->op_next = (OP*)gwop; - o->op_private = gwop->op_private = 0; - gwop->op_targ = pad_alloc(type, SVs_PADTMP); - - kid = OpSIBLING(cLISTOPo->op_first); - for (kid = OpSIBLING(kid); kid; kid = OpSIBLING(kid)) - op_lvalue(kid, OP_GREPSTART); - - return (OP*)gwop; -} - -OP * -Perl_ck_index(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_INDEX; - - if (o->op_flags & OPf_KIDS) { - OP *kid = OpSIBLING(cLISTOPo->op_first); /* get past pushmark */ - if (kid) - kid = OpSIBLING(kid); /* get past "big" */ - if (kid && kid->op_type == OP_CONST) { - const bool save_taint = TAINT_get; - SV *sv = kSVOP->op_sv; - if ( (!SvPOK(sv) || SvNIOKp(sv) || isREGEXP(sv)) - && SvOK(sv) && !SvROK(sv)) - { - sv = newSV_type(SVt_NULL); - sv_copypv(sv, kSVOP->op_sv); - SvREFCNT_dec_NN(kSVOP->op_sv); - kSVOP->op_sv = sv; - } - if (SvOK(sv)) fbm_compile(sv, 0); - TAINT_set(save_taint); -#ifdef NO_TAINT_SUPPORT - PERL_UNUSED_VAR(save_taint); -#endif - } - } - return ck_fun(o); -} - -OP * -Perl_ck_lfun(pTHX_ OP *o) -{ - const OPCODE type = o->op_type; - - PERL_ARGS_ASSERT_CK_LFUN; - - return modkids(ck_fun(o), type); -} - -OP * -Perl_ck_defined(pTHX_ OP *o) /* 19990527 MJD */ -{ - PERL_ARGS_ASSERT_CK_DEFINED; - - if ((o->op_flags & OPf_KIDS)) { - switch (cUNOPo->op_first->op_type) { - case OP_RV2AV: - case OP_PADAV: - Perl_croak(aTHX_ "Can't use 'defined(@array)'" - " (Maybe you should just omit the defined()?)"); - NOT_REACHED; /* NOTREACHED */ - break; - case OP_RV2HV: - case OP_PADHV: - Perl_croak(aTHX_ "Can't use 'defined(%%hash)'" - " (Maybe you should just omit the defined()?)"); - NOT_REACHED; /* NOTREACHED */ - break; - default: - /* no warning */ - break; - } - } - return ck_rfun(o); -} - -OP * -Perl_ck_readline(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_READLINE; - - if (o->op_flags & OPf_KIDS) { - OP *kid = cLISTOPo->op_first; - if (kid->op_type == OP_RV2GV) kid->op_private |= OPpALLOW_FAKE; - scalar(kid); - } - else { - OP * const newop - = newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, PL_argvgv)); - op_free(o); - return newop; - } - return o; -} - -OP * -Perl_ck_rfun(pTHX_ OP *o) -{ - const OPCODE type = o->op_type; - - PERL_ARGS_ASSERT_CK_RFUN; - - return refkids(ck_fun(o), type); -} - -OP * -Perl_ck_listiob(pTHX_ OP *o) -{ - OP *kid; - - PERL_ARGS_ASSERT_CK_LISTIOB; - - kid = cLISTOPo->op_first; - if (!kid) { - o = force_list(o, TRUE); - kid = cLISTOPo->op_first; - } - if (kid->op_type == OP_PUSHMARK) - kid = OpSIBLING(kid); - if (kid && o->op_flags & OPf_STACKED) - kid = OpSIBLING(kid); - else if (kid && !OpHAS_SIBLING(kid)) { /* print HANDLE; */ - if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE - && !kid->op_folded) { - o->op_flags |= OPf_STACKED; /* make it a filehandle */ - scalar(kid); - /* replace old const op with new OP_RV2GV parent */ - kid = S_op_sibling_newUNOP(aTHX_ o, cLISTOPo->op_first, - OP_RV2GV, OPf_REF); - kid = OpSIBLING(kid); - } - } - - if (!kid) - op_append_elem(o->op_type, o, newDEFSVOP()); - - if (o->op_type == OP_PRTF) return modkids(listkids(o), OP_PRTF); - return listkids(o); -} - -OP * -Perl_ck_smartmatch(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_SMARTMATCH; - if (0 == (o->op_flags & OPf_SPECIAL)) { - OP *first = cBINOPo->op_first; - OP *second = OpSIBLING(first); - - /* Implicitly take a reference to an array or hash */ - - /* remove the original two siblings, then add back the - * (possibly different) first and second sibs. - */ - op_sibling_splice(o, NULL, 1, NULL); - op_sibling_splice(o, NULL, 1, NULL); - first = ref_array_or_hash(first); - second = ref_array_or_hash(second); - op_sibling_splice(o, NULL, 0, second); - op_sibling_splice(o, NULL, 0, first); - - /* Implicitly take a reference to a regular expression */ - if (first->op_type == OP_MATCH && !(first->op_flags & OPf_STACKED)) { - OpTYPE_set(first, OP_QR); - } - if (second->op_type == OP_MATCH && !(second->op_flags & OPf_STACKED)) { - OpTYPE_set(second, OP_QR); - } - } - - return o; -} - - -static OP * -S_maybe_targlex(pTHX_ OP *o) -{ - OP * const kid = cLISTOPo->op_first; - /* has a disposable target? */ - if ((PL_opargs[kid->op_type] & OA_TARGLEX) - && !(kid->op_flags & OPf_STACKED) - /* Cannot steal the second time! */ - && !(kid->op_private & OPpTARGET_MY) - ) - { - OP * const kkid = OpSIBLING(kid); - - /* Can just relocate the target. */ - if (kkid && kkid->op_type == OP_PADSV - && (!(kkid->op_private & OPpLVAL_INTRO) - || kkid->op_private & OPpPAD_STATE)) - { - kid->op_targ = kkid->op_targ; - kkid->op_targ = 0; - /* Now we do not need PADSV and SASSIGN. - * Detach kid and free the rest. */ - op_sibling_splice(o, NULL, 1, NULL); - op_free(o); - kid->op_private |= OPpTARGET_MY; /* Used for context settings */ - return kid; - } - } - return o; -} - -OP * -Perl_ck_sassign(pTHX_ OP *o) -{ - OP * const kid = cBINOPo->op_first; - - PERL_ARGS_ASSERT_CK_SASSIGN; - - if (OpHAS_SIBLING(kid)) { - OP *kkid = OpSIBLING(kid); - /* For state variable assignment with attributes, kkid is a list op - whose op_last is a padsv. */ - if ((kkid->op_type == OP_PADSV || - (OP_TYPE_IS_OR_WAS(kkid, OP_LIST) && - (kkid = cLISTOPx(kkid)->op_last)->op_type == OP_PADSV - ) - ) - && (kkid->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)) - == (OPpLVAL_INTRO|OPpPAD_STATE)) { - return S_newONCEOP(aTHX_ o, kkid); - } - } - return S_maybe_targlex(aTHX_ o); -} - - -OP * -Perl_ck_match(pTHX_ OP *o) -{ - PERL_UNUSED_CONTEXT; - PERL_ARGS_ASSERT_CK_MATCH; - - return o; -} - -OP * -Perl_ck_method(pTHX_ OP *o) -{ - SV *sv, *methsv, *rclass; - const char* method; - char* compatptr; - int utf8; - STRLEN len, nsplit = 0, i; - OP* new_op; - OP * const kid = cUNOPo->op_first; - - PERL_ARGS_ASSERT_CK_METHOD; - if (kid->op_type != OP_CONST) return o; - - sv = kSVOP->op_sv; - - /* replace ' with :: */ - while ((compatptr = (char *) memchr(SvPVX(sv), '\'', - SvEND(sv) - SvPVX(sv) ))) - { - *compatptr = ':'; - sv_insert(sv, compatptr - SvPVX_const(sv), 0, ":", 1); - } - - method = SvPVX_const(sv); - len = SvCUR(sv); - utf8 = SvUTF8(sv) ? -1 : 1; - - for (i = len - 1; i > 0; --i) if (method[i] == ':') { - nsplit = i+1; - break; - } - - methsv = newSVpvn_share(method+nsplit, utf8*(len - nsplit), 0); - - if (!nsplit) { /* $proto->method() */ - op_free(o); - return newMETHOP_named(OP_METHOD_NAMED, 0, methsv); - } - - if (memEQs(method, nsplit, "SUPER::")) { /* $proto->SUPER::method() */ - op_free(o); - return newMETHOP_named(OP_METHOD_SUPER, 0, methsv); - } - - /* $proto->MyClass::method() and $proto->MyClass::SUPER::method() */ - if (nsplit >= 9 && strBEGINs(method+nsplit-9, "::SUPER::")) { - rclass = newSVpvn_share(method, utf8*(nsplit-9), 0); - new_op = newMETHOP_named(OP_METHOD_REDIR_SUPER, 0, methsv); - } else { - rclass = newSVpvn_share(method, utf8*(nsplit-2), 0); - new_op = newMETHOP_named(OP_METHOD_REDIR, 0, methsv); - } -#ifdef USE_ITHREADS - op_relocate_sv(&rclass, &cMETHOPx(new_op)->op_rclass_targ); -#else - cMETHOPx(new_op)->op_rclass_sv = rclass; -#endif - op_free(o); - return new_op; -} - -OP * -Perl_ck_null(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_NULL; - PERL_UNUSED_CONTEXT; - return o; -} - -OP * -Perl_ck_open(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_OPEN; - - S_io_hints(aTHX_ o); - { - /* In case of three-arg dup open remove strictness - * from the last arg if it is a bareword. */ - OP * const first = cLISTOPx(o)->op_first; /* The pushmark. */ - OP * const last = cLISTOPx(o)->op_last; /* The bareword. */ - OP *oa; - const char *mode; - - if ((last->op_type == OP_CONST) && /* The bareword. */ - (last->op_private & OPpCONST_BARE) && - (last->op_private & OPpCONST_STRICT) && - (oa = OpSIBLING(first)) && /* The fh. */ - (oa = OpSIBLING(oa)) && /* The mode. */ - (oa->op_type == OP_CONST) && - SvPOK(((SVOP*)oa)->op_sv) && - (mode = SvPVX_const(((SVOP*)oa)->op_sv)) && - mode[0] == '>' && mode[1] == '&' && /* A dup open. */ - (last == OpSIBLING(oa))) /* The bareword. */ - last->op_private &= ~OPpCONST_STRICT; - } - return ck_fun(o); -} - -OP * -Perl_ck_prototype(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_PROTOTYPE; - if (!(o->op_flags & OPf_KIDS)) { - op_free(o); - return newUNOP(OP_PROTOTYPE, 0, newDEFSVOP()); - } - return o; -} - -OP * -Perl_ck_refassign(pTHX_ OP *o) -{ - OP * const right = cLISTOPo->op_first; - OP * const left = OpSIBLING(right); - OP *varop = cUNOPx(cUNOPx(left)->op_first)->op_first; - bool stacked = 0; - - PERL_ARGS_ASSERT_CK_REFASSIGN; - assert (left); - assert (left->op_type == OP_SREFGEN); - - o->op_private = 0; - /* we use OPpPAD_STATE in refassign to mean either of those things, - * and the code assumes the two flags occupy the same bit position - * in the various ops below */ - assert(OPpPAD_STATE == OPpOUR_INTRO); - - switch (varop->op_type) { - case OP_PADAV: - o->op_private |= OPpLVREF_AV; - goto settarg; - case OP_PADHV: - o->op_private |= OPpLVREF_HV; - /* FALLTHROUGH */ - case OP_PADSV: - settarg: - o->op_private |= (varop->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)); - o->op_targ = varop->op_targ; - varop->op_targ = 0; - PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX); - break; - - case OP_RV2AV: - o->op_private |= OPpLVREF_AV; - goto checkgv; - NOT_REACHED; /* NOTREACHED */ - case OP_RV2HV: - o->op_private |= OPpLVREF_HV; - /* FALLTHROUGH */ - case OP_RV2SV: - checkgv: - o->op_private |= (varop->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)); - if (cUNOPx(varop)->op_first->op_type != OP_GV) goto bad; - detach_and_stack: - /* Point varop to its GV kid, detached. */ - varop = op_sibling_splice(varop, NULL, -1, NULL); - stacked = TRUE; - break; - case OP_RV2CV: { - OP * const kidparent = - OpSIBLING(cUNOPx(cUNOPx(varop)->op_first)->op_first); - OP * const kid = cUNOPx(kidparent)->op_first; - o->op_private |= OPpLVREF_CV; - if (kid->op_type == OP_GV) { - SV *sv = (SV*)cGVOPx_gv(kid); - varop = kidparent; - if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) { - /* a CVREF here confuses pp_refassign, so make sure - it gets a GV */ - CV *const cv = (CV*)SvRV(sv); - SV *name_sv = sv_2mortal(newSVhek(CvNAME_HEK(cv))); - (void)gv_init_sv((GV*)sv, CvSTASH(cv), name_sv, 0); - assert(SvTYPE(sv) == SVt_PVGV); - } - goto detach_and_stack; - } - if (kid->op_type != OP_PADCV) goto bad; - o->op_targ = kid->op_targ; - kid->op_targ = 0; - break; - } - case OP_AELEM: - case OP_HELEM: - o->op_private |= (varop->op_private & OPpLVAL_INTRO); - o->op_private |= OPpLVREF_ELEM; - op_null(varop); - stacked = TRUE; - /* Detach varop. */ - op_sibling_splice(cUNOPx(left)->op_first, NULL, -1, NULL); - break; - default: - bad: - /* diag_listed_as: Can't modify reference to %s in %s assignment */ - yyerror(Perl_form(aTHX_ "Can't modify reference to %s in scalar " - "assignment", - OP_DESC(varop))); - return o; - } - if (!FEATURE_REFALIASING_IS_ENABLED) - Perl_croak(aTHX_ - "Experimental aliasing via reference not enabled"); - Perl_ck_warner_d(aTHX_ - packWARN(WARN_EXPERIMENTAL__REFALIASING), - "Aliasing via reference is experimental"); - if (stacked) { - o->op_flags |= OPf_STACKED; - op_sibling_splice(o, right, 1, varop); - } - else { - o->op_flags &=~ OPf_STACKED; - op_sibling_splice(o, right, 1, NULL); - } - op_free(left); - return o; -} - -OP * -Perl_ck_repeat(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_REPEAT; - - if (cBINOPo->op_first->op_flags & OPf_PARENS) { - OP* kids; - o->op_private |= OPpREPEAT_DOLIST; - kids = op_sibling_splice(o, NULL, 1, NULL); /* detach first kid */ - kids = force_list(kids, TRUE); /* promote it to a list */ - op_sibling_splice(o, NULL, 0, kids); /* and add back */ - } - else - scalar(o); - return o; -} - -OP * -Perl_ck_require(pTHX_ OP *o) -{ - GV* gv; - - PERL_ARGS_ASSERT_CK_REQUIRE; - - if (o->op_flags & OPf_KIDS) { /* Shall we supply missing .pm? */ - SVOP * const kid = (SVOP*)cUNOPo->op_first; - U32 hash; - char *s; - STRLEN len; - if (kid->op_type == OP_CONST) { - SV * const sv = kid->op_sv; - U32 const was_readonly = SvREADONLY(sv); - if (kid->op_private & OPpCONST_BARE) { - const char *end; - HEK *hek; - - if (was_readonly) { - SvREADONLY_off(sv); - } - - if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0); - - s = SvPVX(sv); - len = SvCUR(sv); - end = s + len; - /* treat ::foo::bar as foo::bar */ - if (len >= 2 && s[0] == ':' && s[1] == ':') - DIE(aTHX_ "Bareword in require must not start with a double-colon: \"%s\"\n", s); - if (s == end) - DIE(aTHX_ "Bareword in require maps to empty filename"); - - for (; s < end; s++) { - if (*s == ':' && s[1] == ':') { - *s = '/'; - Move(s+2, s+1, end - s - 1, char); - --end; - } - } - SvEND_set(sv, end); - sv_catpvs(sv, ".pm"); - PERL_HASH(hash, SvPVX(sv), SvCUR(sv)); - hek = share_hek(SvPVX(sv), - (SSize_t)SvCUR(sv) * (SvUTF8(sv) ? -1 : 1), - hash); - sv_sethek(sv, hek); - unshare_hek(hek); - SvFLAGS(sv) |= was_readonly; - } - else if (SvPOK(sv) && !SvNIOK(sv) && !SvGMAGICAL(sv) - && !SvVOK(sv)) { - s = SvPV(sv, len); - if (SvREFCNT(sv) > 1) { - kid->op_sv = newSVpvn_share( - s, SvUTF8(sv) ? -(SSize_t)len : (SSize_t)len, 0); - SvREFCNT_dec_NN(sv); - } - else { - HEK *hek; - if (was_readonly) SvREADONLY_off(sv); - PERL_HASH(hash, s, len); - hek = share_hek(s, - SvUTF8(sv) ? -(SSize_t)len : (SSize_t)len, - hash); - sv_sethek(sv, hek); - unshare_hek(hek); - SvFLAGS(sv) |= was_readonly; - } - } - } - } - - if (!(o->op_flags & OPf_SPECIAL) /* Wasn't written as CORE::require */ - /* handle override, if any */ - && (gv = gv_override("require", 7))) { - OP *kid, *newop; - if (o->op_flags & OPf_KIDS) { - kid = cUNOPo->op_first; - op_sibling_splice(o, NULL, -1, NULL); - } - else { - kid = newDEFSVOP(); - } - op_free(o); - newop = S_new_entersubop(aTHX_ gv, kid); - return newop; - } - - return ck_fun(o); -} - -OP * -Perl_ck_return(pTHX_ OP *o) -{ - OP *kid; - - PERL_ARGS_ASSERT_CK_RETURN; - - kid = OpSIBLING(cLISTOPo->op_first); - if (PL_compcv && CvLVALUE(PL_compcv)) { - for (; kid; kid = OpSIBLING(kid)) - op_lvalue(kid, OP_LEAVESUBLV); - } - - return o; -} - -OP * -Perl_ck_select(pTHX_ OP *o) -{ - OP* kid; - - PERL_ARGS_ASSERT_CK_SELECT; - - if (o->op_flags & OPf_KIDS) { - kid = OpSIBLING(cLISTOPo->op_first); /* get past pushmark */ - if (kid && OpHAS_SIBLING(kid)) { - OpTYPE_set(o, OP_SSELECT); - o = ck_fun(o); - return fold_constants(op_integerize(op_std_init(o))); - } - } - o = ck_fun(o); - kid = OpSIBLING(cLISTOPo->op_first); /* get past pushmark */ - if (kid && kid->op_type == OP_RV2GV) - kid->op_private &= ~HINT_STRICT_REFS; - return o; -} - -OP * -Perl_ck_shift(pTHX_ OP *o) -{ - const I32 type = o->op_type; - - PERL_ARGS_ASSERT_CK_SHIFT; - - if (!(o->op_flags & OPf_KIDS)) { - OP *argop; - - if (!CvUNIQUE(PL_compcv)) { - o->op_flags |= OPf_SPECIAL; - return o; - } - - argop = newUNOP(OP_RV2AV, 0, scalar(newGVOP(OP_GV, 0, PL_argvgv))); - op_free(o); - return newUNOP(type, 0, scalar(argop)); - } - return scalar(ck_fun(o)); -} - -OP * -Perl_ck_sort(pTHX_ OP *o) -{ - OP *firstkid; - OP *kid; - U8 stacked; - - PERL_ARGS_ASSERT_CK_SORT; - - if (o->op_flags & OPf_STACKED) - simplify_sort(o); - firstkid = OpSIBLING(cLISTOPo->op_first); /* get past pushmark */ - - if (!firstkid) - return too_few_arguments_pv(o,OP_DESC(o), 0); - - if ((stacked = o->op_flags & OPf_STACKED)) { /* may have been cleared */ - OP *kid = cUNOPx(firstkid)->op_first; /* get past null */ - - /* if the first arg is a code block, process it and mark sort as - * OPf_SPECIAL */ - if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) { - LINKLIST(kid); - if (kid->op_type == OP_LEAVE) - op_null(kid); /* wipe out leave */ - /* Prevent execution from escaping out of the sort block. */ - kid->op_next = 0; - - /* provide scalar context for comparison function/block */ - kid = scalar(firstkid); - kid->op_next = kid; - o->op_flags |= OPf_SPECIAL; - } - else if (kid->op_type == OP_CONST - && kid->op_private & OPpCONST_BARE) { - char tmpbuf[256]; - STRLEN len; - PADOFFSET off; - const char * const name = SvPV(kSVOP_sv, len); - *tmpbuf = '&'; - assert (len < 256); - Copy(name, tmpbuf+1, len, char); - off = pad_findmy_pvn(tmpbuf, len+1, 0); - if (off != NOT_IN_PAD) { - if (PAD_COMPNAME_FLAGS_isOUR(off)) { - SV * const fq = - newSVhek(HvNAME_HEK(PAD_COMPNAME_OURSTASH(off))); - sv_catpvs(fq, "::"); - sv_catsv(fq, kSVOP_sv); - SvREFCNT_dec_NN(kSVOP_sv); - kSVOP->op_sv = fq; - } - else { - OP * const padop = newOP(OP_PADCV, 0); - padop->op_targ = off; - /* replace the const op with the pad op */ - op_sibling_splice(firstkid, NULL, 1, padop); - op_free(kid); - } - } - } - - firstkid = OpSIBLING(firstkid); - } - - for (kid = firstkid; kid; kid = OpSIBLING(kid)) { - /* provide list context for arguments */ - list(kid); - if (stacked) - op_lvalue(kid, OP_GREPSTART); - } - - return o; -} - -/* for sort { X } ..., where X is one of - * $a <=> $b, $b <=> $a, $a cmp $b, $b cmp $a - * elide the second child of the sort (the one containing X), - * and set these flags as appropriate - OPpSORT_NUMERIC; - OPpSORT_INTEGER; - OPpSORT_DESCEND; - * Also, check and warn on lexical $a, $b. - */ - -STATIC void -S_simplify_sort(pTHX_ OP *o) -{ - OP *kid = OpSIBLING(cLISTOPo->op_first); /* get past pushmark */ - OP *k; - int descending; - GV *gv; - const char *gvname; - bool have_scopeop; - - PERL_ARGS_ASSERT_SIMPLIFY_SORT; - - kid = kUNOP->op_first; /* get past null */ - if (!(have_scopeop = kid->op_type == OP_SCOPE) - && kid->op_type != OP_LEAVE) - return; - kid = kLISTOP->op_last; /* get past scope */ - switch(kid->op_type) { - case OP_NCMP: - case OP_I_NCMP: - case OP_SCMP: - if (!have_scopeop) goto padkids; - break; - default: - return; - } - k = kid; /* remember this node*/ - if (kBINOP->op_first->op_type != OP_RV2SV - || kBINOP->op_last ->op_type != OP_RV2SV) - { - /* - Warn about my($a) or my($b) in a sort block, *if* $a or $b is - then used in a comparison. This catches most, but not - all cases. For instance, it catches - sort { my($a); $a <=> $b } - but not - sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; } - (although why you'd do that is anyone's guess). - */ - - padkids: - if (!ckWARN(WARN_SYNTAX)) return; - kid = kBINOP->op_first; - do { - if (kid->op_type == OP_PADSV) { - PADNAME * const name = PAD_COMPNAME(kid->op_targ); - if (PadnameLEN(name) == 2 && *PadnamePV(name) == '$' - && ( PadnamePV(name)[1] == 'a' - || PadnamePV(name)[1] == 'b' )) - /* diag_listed_as: "my %s" used in sort comparison */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "\"%s %s\" used in sort comparison", - PadnameIsSTATE(name) - ? "state" - : "my", - PadnamePV(name)); - } - } while ((kid = OpSIBLING(kid))); - return; - } - kid = kBINOP->op_first; /* get past cmp */ - if (kUNOP->op_first->op_type != OP_GV) - return; - kid = kUNOP->op_first; /* get past rv2sv */ - gv = kGVOP_gv; - if (GvSTASH(gv) != PL_curstash) - return; - gvname = GvNAME(gv); - if (*gvname == 'a' && gvname[1] == '\0') - descending = 0; - else if (*gvname == 'b' && gvname[1] == '\0') - descending = 1; - else - return; - - kid = k; /* back to cmp */ - /* already checked above that it is rv2sv */ - kid = kBINOP->op_last; /* down to 2nd arg */ - if (kUNOP->op_first->op_type != OP_GV) - return; - kid = kUNOP->op_first; /* get past rv2sv */ - gv = kGVOP_gv; - if (GvSTASH(gv) != PL_curstash) - return; - gvname = GvNAME(gv); - if ( descending - ? !(*gvname == 'a' && gvname[1] == '\0') - : !(*gvname == 'b' && gvname[1] == '\0')) - return; - o->op_flags &= ~(OPf_STACKED | OPf_SPECIAL); - if (descending) - o->op_private |= OPpSORT_DESCEND; - if (k->op_type == OP_NCMP) - o->op_private |= OPpSORT_NUMERIC; - if (k->op_type == OP_I_NCMP) - o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER; - kid = OpSIBLING(cLISTOPo->op_first); - /* cut out and delete old block (second sibling) */ - op_sibling_splice(o, cLISTOPo->op_first, 1, NULL); - op_free(kid); -} - -OP * -Perl_ck_split(pTHX_ OP *o) -{ - OP *kid; - OP *sibs; - - PERL_ARGS_ASSERT_CK_SPLIT; - - assert(o->op_type == OP_LIST); - - if (o->op_flags & OPf_STACKED) - return no_fh_allowed(o); - - kid = cLISTOPo->op_first; - /* delete leading NULL node, then add a CONST if no other nodes */ - assert(kid->op_type == OP_NULL); - op_sibling_splice(o, NULL, 1, - OpHAS_SIBLING(kid) ? NULL : newSVOP(OP_CONST, 0, newSVpvs(" "))); - op_free(kid); - kid = cLISTOPo->op_first; - - if (kid->op_type != OP_MATCH || kid->op_flags & OPf_STACKED) { - /* remove match expression, and replace with new optree with - * a match op at its head */ - op_sibling_splice(o, NULL, 1, NULL); - /* pmruntime will handle split " " behavior with flag==2 */ - kid = pmruntime(newPMOP(OP_MATCH, 0), kid, NULL, 2, 0); - op_sibling_splice(o, NULL, 0, kid); - } - - assert(kid->op_type == OP_MATCH || kid->op_type == OP_SPLIT); - - if (((PMOP *)kid)->op_pmflags & PMf_GLOBAL) { - Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), - "Use of /g modifier is meaningless in split"); - } - - /* eliminate the split op, and move the match op (plus any children) - * into its place, then convert the match op into a split op. i.e. - * - * SPLIT MATCH SPLIT(ex-MATCH) - * | | | - * MATCH - A - B - C => R - A - B - C => R - A - B - C - * | | | - * R X - Y X - Y - * | - * X - Y - * - * (R, if it exists, will be a regcomp op) - */ - - op_sibling_splice(o, NULL, 1, NULL); /* detach match op from o */ - sibs = op_sibling_splice(o, NULL, -1, NULL); /* detach any other sibs */ - op_sibling_splice(kid, cLISTOPx(kid)->op_last, 0, sibs); /* and reattach */ - OpTYPE_set(kid, OP_SPLIT); - kid->op_flags = (o->op_flags | (kid->op_flags & OPf_KIDS)); - kid->op_private = o->op_private; - op_free(o); - o = kid; - kid = sibs; /* kid is now the string arg of the split */ - - if (!kid) { - kid = newDEFSVOP(); - op_append_elem(OP_SPLIT, o, kid); - } - scalar(kid); - - kid = OpSIBLING(kid); - if (!kid) { - kid = newSVOP(OP_CONST, 0, newSViv(0)); - op_append_elem(OP_SPLIT, o, kid); - o->op_private |= OPpSPLIT_IMPLIM; - } - scalar(kid); - - if (OpHAS_SIBLING(kid)) - return too_many_arguments_pv(o,OP_DESC(o), 0); - - return o; -} - -OP * -Perl_ck_stringify(pTHX_ OP *o) -{ - OP * const kid = OpSIBLING(cUNOPo->op_first); - PERL_ARGS_ASSERT_CK_STRINGIFY; - if (( kid->op_type == OP_JOIN || kid->op_type == OP_QUOTEMETA - || kid->op_type == OP_LC || kid->op_type == OP_LCFIRST - || kid->op_type == OP_UC || kid->op_type == OP_UCFIRST) - && !OpHAS_SIBLING(kid)) /* syntax errs can leave extra children */ - { - op_sibling_splice(o, cUNOPo->op_first, -1, NULL); - op_free(o); - return kid; - } - return ck_fun(o); -} - -OP * -Perl_ck_join(pTHX_ OP *o) -{ - OP * const kid = OpSIBLING(cLISTOPo->op_first); - - PERL_ARGS_ASSERT_CK_JOIN; - - if (kid && kid->op_type == OP_MATCH) { - if (ckWARN(WARN_SYNTAX)) { - const REGEXP *re = PM_GETRE(kPMOP); - const SV *msg = re - ? newSVpvn_flags( RX_PRECOMP_const(re), RX_PRELEN(re), - SVs_TEMP | ( RX_UTF8(re) ? SVf_UTF8 : 0 ) ) - : newSVpvs_flags( "STRING", SVs_TEMP ); - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "/%" SVf "/ should probably be written as \"%" SVf "\"", - SVfARG(msg), SVfARG(msg)); - } - } - if (kid - && (kid->op_type == OP_CONST /* an innocent, unsuspicious separator */ - || (kid->op_type == OP_PADSV && !(kid->op_private & OPpLVAL_INTRO)) - || ( kid->op_type==OP_RV2SV && kUNOP->op_first->op_type == OP_GV - && !(kid->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO))))) - { - const OP * const bairn = OpSIBLING(kid); /* the list */ - if (bairn && !OpHAS_SIBLING(bairn) /* single-item list */ - && OP_GIMME(bairn,0) == G_SCALAR) - { - OP * const ret = op_convert_list(OP_STRINGIFY, OPf_FOLDED, - op_sibling_splice(o, kid, 1, NULL)); - op_free(o); - return ret; - } - } - - return ck_fun(o); -} - -/* -=for apidoc rv2cv_op_cv - -Examines an op, which is expected to identify a subroutine at runtime, -and attempts to determine at compile time which subroutine it identifies. -This is normally used during Perl compilation to determine whether -a prototype can be applied to a function call. C is the op -being considered, normally an C op. A pointer to the identified -subroutine is returned, if it could be determined statically, and a null -pointer is returned if it was not possible to determine statically. - -Currently, the subroutine can be identified statically if the RV that the -C is to operate on is provided by a suitable C or C op. -A C op is suitable if the GV's CV slot is populated. A C op is -suitable if the constant value must be an RV pointing to a CV. Details of -this process may change in future versions of Perl. If the C op -has the C flag set then no attempt is made to identify -the subroutine statically: this flag is used to suppress compile-time -magic on a subroutine call, forcing it to use default runtime behaviour. - -If C has the bit C set, then the handling -of a GV reference is modified. If a GV was examined and its CV slot was -found to be empty, then the C op has the C flag set. -If the op is not optimised away, and the CV slot is later populated with -a subroutine having a prototype, that flag eventually triggers the warning -"called too early to check prototype". - -If C has the bit C set, then instead -of returning a pointer to the subroutine it returns a pointer to the -GV giving the most appropriate name for the subroutine in this context. -Normally this is just the C of the subroutine, but for an anonymous -(C) subroutine that is referenced through a GV it will be the -referencing GV. The resulting C is cast to C to be returned. -A null pointer is returned as usual if there is no statically-determinable -subroutine. - -=for apidoc Amnh||OPpEARLY_CV -=for apidoc Amnh||OPpENTERSUB_AMPER -=for apidoc Amnh||RV2CVOPCV_MARK_EARLY -=for apidoc Amnh||RV2CVOPCV_RETURN_NAME_GV - -=cut -*/ - -/* shared by toke.c:yylex */ -CV * -Perl_find_lexical_cv(pTHX_ PADOFFSET off) -{ - const PADNAME *name = PAD_COMPNAME(off); - CV *compcv = PL_compcv; - while (PadnameOUTER(name)) { - compcv = CvOUTSIDE(compcv); - if (LIKELY(PARENT_PAD_INDEX(name))) { - name = PadlistNAMESARRAY(CvPADLIST(compcv)) - [off = PARENT_PAD_INDEX(name)]; - } - else { - /* In an eval() in an inner scope like a function, the - intermediate pad in the sub might not be populated with the - sub. So search harder. - - It is possible we won't find the name in this - particular scope, but that's fine, if we don't we'll - find it in some outer scope. Finding it here will let us - go back to following the PARENT_PAD_INDEX() chain. - */ - const PADNAMELIST * const names = PadlistNAMES(CvPADLIST(compcv)); - PADNAME * const * const name_p = PadnamelistARRAY(names); - int offset; - for (offset = PadnamelistMAXNAMED(names); offset > 0; offset--) { - const PADNAME * const thisname = name_p[offset]; - /* The pv is copied from the outer PADNAME to the - inner PADNAMEs so we don't need to compare the - string contents - */ - if (thisname && PadnameLEN(thisname) == PadnameLEN(name) - && PadnamePV(thisname) == PadnamePV(name)) { - name = thisname; - break; - } - } - } - } - assert(!PadnameIsOUR(name)); - if (!PadnameIsSTATE(name) && PadnamePROTOCV(name)) { - return PadnamePROTOCV(name); - } - return (CV *)AvARRAY(PadlistARRAY(CvPADLIST(compcv))[1])[off]; -} - -CV * -Perl_rv2cv_op_cv(pTHX_ OP *cvop, U32 flags) -{ - OP *rvop; - CV *cv; - GV *gv; - PERL_ARGS_ASSERT_RV2CV_OP_CV; - if (flags & ~RV2CVOPCV_FLAG_MASK) - Perl_croak(aTHX_ "panic: rv2cv_op_cv bad flags %x", (unsigned)flags); - if (cvop->op_type != OP_RV2CV) - return NULL; - if (cvop->op_private & OPpENTERSUB_AMPER) - return NULL; - if (!(cvop->op_flags & OPf_KIDS)) - return NULL; - rvop = cUNOPx(cvop)->op_first; - switch (rvop->op_type) { - case OP_GV: { - gv = cGVOPx_gv(rvop); - if (!isGV(gv)) { - if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV) { - cv = MUTABLE_CV(SvRV(gv)); - gv = NULL; - break; - } - if (flags & RV2CVOPCV_RETURN_STUB) - return (CV *)gv; - else return NULL; - } - cv = GvCVu(gv); - if (!cv) { - if (flags & RV2CVOPCV_MARK_EARLY) - rvop->op_private |= OPpEARLY_CV; - return NULL; - } - } break; - case OP_CONST: { - SV *rv = cSVOPx_sv(rvop); - if (!SvROK(rv)) - return NULL; - cv = (CV*)SvRV(rv); - gv = NULL; - } break; - case OP_PADCV: { - cv = find_lexical_cv(rvop->op_targ); - gv = NULL; - } break; - default: { - return NULL; - } NOT_REACHED; /* NOTREACHED */ - } - if (SvTYPE((SV*)cv) != SVt_PVCV) - return NULL; - if (flags & RV2CVOPCV_RETURN_NAME_GV) { - if ((!CvANON(cv) && !CvLEXICAL(cv)) || !gv) - gv = CvGV(cv); - return (CV*)gv; - } - else if (flags & RV2CVOPCV_MAYBE_NAME_GV) { - if (CvLEXICAL(cv) || CvNAMED(cv)) - return NULL; - if (!CvANON(cv) || !gv) - gv = CvGV(cv); - return (CV*)gv; - - } else { - return cv; - } -} - -/* -=for apidoc ck_entersub_args_list - -Performs the default fixup of the arguments part of an C -op tree. This consists of applying list context to each of the -argument ops. This is the standard treatment used on a call marked -with C<&>, or a method call, or a call through a subroutine reference, -or any other call where the callee can't be identified at compile time, -or a call where the callee has no prototype. - -=cut -*/ - -OP * -Perl_ck_entersub_args_list(pTHX_ OP *entersubop) -{ - OP *aop; - - PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_LIST; - - aop = cUNOPx(entersubop)->op_first; - if (!OpHAS_SIBLING(aop)) - aop = cUNOPx(aop)->op_first; - for (aop = OpSIBLING(aop); OpHAS_SIBLING(aop); aop = OpSIBLING(aop)) { - /* skip the extra attributes->import() call implicitly added in - * something like foo(my $x : bar) - */ - if ( aop->op_type == OP_ENTERSUB - && (aop->op_flags & OPf_WANT) == OPf_WANT_VOID - ) - continue; - list(aop); - op_lvalue(aop, OP_ENTERSUB); - } - return entersubop; -} - -/* -=for apidoc ck_entersub_args_proto - -Performs the fixup of the arguments part of an C op tree -based on a subroutine prototype. This makes various modifications to -the argument ops, from applying context up to inserting C ops, -and checking the number and syntactic types of arguments, as directed by -the prototype. This is the standard treatment used on a subroutine call, -not marked with C<&>, where the callee can be identified at compile time -and has a prototype. - -C supplies the subroutine prototype to be applied to the call. -It may be a normal defined scalar, of which the string value will be used. -Alternatively, for convenience, it may be a subroutine object (a C -that has been cast to C) which has a prototype. The prototype -supplied, in whichever form, does not need to match the actual callee -referenced by the op tree. - -If the argument ops disagree with the prototype, for example by having -an unacceptable number of arguments, a valid op tree is returned anyway. -The error is reflected in the parser state, normally resulting in a single -exception at the top level of parsing which covers all the compilation -errors that occurred. In the error message, the callee is referred to -by the name defined by the C parameter. - -=cut -*/ - -OP * -Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv) -{ - STRLEN proto_len; - const char *proto, *proto_end; - OP *aop, *prev, *cvop, *parent; - int optional = 0; - I32 arg = 0; - I32 contextclass = 0; - const char *e = NULL; - PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO; - if (SvTYPE(protosv) == SVt_PVCV ? !SvPOK(protosv) : !SvOK(protosv)) - Perl_croak(aTHX_ "panic: ck_entersub_args_proto CV with no proto, " - "flags=%lx", (unsigned long) SvFLAGS(protosv)); - if (SvTYPE(protosv) == SVt_PVCV) - proto = CvPROTO(protosv), proto_len = CvPROTOLEN(protosv); - else proto = SvPV(protosv, proto_len); - proto = S_strip_spaces(aTHX_ proto, &proto_len); - proto_end = proto + proto_len; - parent = entersubop; - aop = cUNOPx(entersubop)->op_first; - if (!OpHAS_SIBLING(aop)) { - parent = aop; - aop = cUNOPx(aop)->op_first; - } - prev = aop; - aop = OpSIBLING(aop); - for (cvop = aop; OpHAS_SIBLING(cvop); cvop = OpSIBLING(cvop)) ; - while (aop != cvop) { - OP* o3 = aop; - - if (proto >= proto_end) - { - SV * const namesv = cv_name((CV *)namegv, NULL, 0); - yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf, - SVfARG(namesv)), SvUTF8(namesv)); - return entersubop; - } - - switch (*proto) { - case ';': - optional = 1; - proto++; - continue; - case '_': - /* _ must be at the end */ - if (proto[1] && !memCHRs(";@%", proto[1])) - goto oops; - /* FALLTHROUGH */ - case '$': - proto++; - arg++; - scalar(aop); - break; - case '%': - case '@': - list(aop); - arg++; - break; - case '&': - proto++; - arg++; - if ( o3->op_type != OP_UNDEF - && (o3->op_type != OP_SREFGEN - || ( cUNOPx(cUNOPx(o3)->op_first)->op_first->op_type - != OP_ANONCODE - && cUNOPx(cUNOPx(o3)->op_first)->op_first->op_type - != OP_RV2CV))) - bad_type_gv(arg, namegv, o3, - arg == 1 ? "block or sub {}" : "sub {}"); - break; - case '*': - /* '*' allows any scalar type, including bareword */ - proto++; - arg++; - if (o3->op_type == OP_RV2GV) - goto wrapref; /* autoconvert GLOB -> GLOBref */ - else if (o3->op_type == OP_CONST) - o3->op_private &= ~OPpCONST_STRICT; - scalar(aop); - break; - case '+': - proto++; - arg++; - if (o3->op_type == OP_RV2AV || - o3->op_type == OP_PADAV || - o3->op_type == OP_RV2HV || - o3->op_type == OP_PADHV - ) { - goto wrapref; - } - scalar(aop); - break; - case '[': case ']': - goto oops; - - case '\\': - proto++; - arg++; - again: - switch (*proto++) { - case '[': - if (contextclass++ == 0) { - e = (char *) memchr(proto, ']', proto_end - proto); - if (!e || e == proto) - goto oops; - } - else - goto oops; - goto again; - - case ']': - if (contextclass) { - const char *p = proto; - const char *const end = proto; - contextclass = 0; - while (*--p != '[') - /* \[$] accepts any scalar lvalue */ - if (*p == '$' - && Perl_op_lvalue_flags(aTHX_ - scalar(o3), - OP_READ, /* not entersub */ - OP_LVALUE_NO_CROAK - )) goto wrapref; - bad_type_gv(arg, namegv, o3, - Perl_form(aTHX_ "one of %.*s",(int)(end - p), p)); - } else - goto oops; - break; - case '*': - if (o3->op_type == OP_RV2GV) - goto wrapref; - if (!contextclass) - bad_type_gv(arg, namegv, o3, "symbol"); - break; - case '&': - if (o3->op_type == OP_ENTERSUB - && !(o3->op_flags & OPf_STACKED)) - goto wrapref; - if (!contextclass) - bad_type_gv(arg, namegv, o3, "subroutine"); - break; - case '$': - if (o3->op_type == OP_RV2SV || - o3->op_type == OP_PADSV || - o3->op_type == OP_HELEM || - o3->op_type == OP_AELEM) - goto wrapref; - if (!contextclass) { - /* \$ accepts any scalar lvalue */ - if (Perl_op_lvalue_flags(aTHX_ - scalar(o3), - OP_READ, /* not entersub */ - OP_LVALUE_NO_CROAK - )) goto wrapref; - bad_type_gv(arg, namegv, o3, "scalar"); - } - break; - case '@': - if (o3->op_type == OP_RV2AV || - o3->op_type == OP_PADAV) - { - o3->op_flags &=~ OPf_PARENS; - goto wrapref; - } - if (!contextclass) - bad_type_gv(arg, namegv, o3, "array"); - break; - case '%': - if (o3->op_type == OP_RV2HV || - o3->op_type == OP_PADHV) - { - o3->op_flags &=~ OPf_PARENS; - goto wrapref; - } - if (!contextclass) - bad_type_gv(arg, namegv, o3, "hash"); - break; - wrapref: - aop = S_op_sibling_newUNOP(aTHX_ parent, prev, - OP_REFGEN, 0); - if (contextclass && e) { - proto = e + 1; - contextclass = 0; - } - break; - default: goto oops; - } - if (contextclass) - goto again; - break; - case ' ': - proto++; - continue; - default: - oops: { - Perl_croak(aTHX_ "Malformed prototype for %" SVf ": %" SVf, - SVfARG(cv_name((CV *)namegv, NULL, 0)), - SVfARG(protosv)); - } - } +{ + bool is_eq; + bool neg; + bool reverse; + bool iv0; + OP *indexop, *constop, *start; + SV *sv; + IV iv; - op_lvalue(aop, OP_ENTERSUB); - prev = aop; - aop = OpSIBLING(aop); - } - if (aop == cvop && *proto == '_') { - /* generate an access to $_ */ - op_sibling_splice(parent, prev, 0, newDEFSVOP()); + PERL_ARGS_ASSERT_CK_CMP; + + is_eq = ( o->op_type == OP_EQ + || o->op_type == OP_NE + || o->op_type == OP_I_EQ + || o->op_type == OP_I_NE); + + if (!is_eq && ckWARN(WARN_SYNTAX)) { + const OP *kid = cUNOPo->op_first; + if (kid && + ( + ( is_dollar_bracket(aTHX_ kid) + && OpSIBLING(kid) && OpSIBLING(kid)->op_type == OP_CONST + ) + || ( kid->op_type == OP_CONST + && (kid = OpSIBLING(kid)) && is_dollar_bracket(aTHX_ kid) + ) + ) + ) + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), + "$[ used in %s (did you mean $] ?)", OP_DESC(o)); } - if (!optional && proto_end > proto && - (*proto != '@' && *proto != '%' && *proto != ';' && *proto != '_')) - { - SV * const namesv = cv_name((CV *)namegv, NULL, 0); - yyerror_pv(Perl_form(aTHX_ "Not enough arguments for %" SVf, - SVfARG(namesv)), SvUTF8(namesv)); + + /* convert (index(...) == -1) and variations into + * (r)index/BOOL(,NEG) + */ + + reverse = FALSE; + + indexop = cUNOPo->op_first; + constop = OpSIBLING(indexop); + start = NULL; + if (indexop->op_type == OP_CONST) { + constop = indexop; + indexop = OpSIBLING(constop); + start = constop; + reverse = TRUE; } - return entersubop; -} -/* -=for apidoc ck_entersub_args_proto_or_list + if (indexop->op_type != OP_INDEX && indexop->op_type != OP_RINDEX) + return o; -Performs the fixup of the arguments part of an C op tree either -based on a subroutine prototype or using default list-context processing. -This is the standard treatment used on a subroutine call, not marked -with C<&>, where the callee can be identified at compile time. + /* ($lex = index(....)) == -1 */ + if (indexop->op_private & OPpTARGET_MY) + return o; -C supplies the subroutine prototype to be applied to the call, -or indicates that there is no prototype. It may be a normal scalar, -in which case if it is defined then the string value will be used -as a prototype, and if it is undefined then there is no prototype. -Alternatively, for convenience, it may be a subroutine object (a C -that has been cast to C), of which the prototype will be used if it -has one. The prototype (or lack thereof) supplied, in whichever form, -does not need to match the actual callee referenced by the op tree. + if (constop->op_type != OP_CONST) + return o; -If the argument ops disagree with the prototype, for example by having -an unacceptable number of arguments, a valid op tree is returned anyway. -The error is reflected in the parser state, normally resulting in a single -exception at the top level of parsing which covers all the compilation -errors that occurred. In the error message, the callee is referred to -by the name defined by the C parameter. + sv = cSVOPx_sv(constop); + if (!(sv && SvIOK_notUV(sv))) + return o; -=cut -*/ + iv = SvIVX(sv); + if (iv != -1 && iv != 0) + return o; + iv0 = (iv == 0); -OP * -Perl_ck_entersub_args_proto_or_list(pTHX_ OP *entersubop, - GV *namegv, SV *protosv) -{ - PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO_OR_LIST; - if (SvTYPE(protosv) == SVt_PVCV ? SvPOK(protosv) : SvOK(protosv)) - return ck_entersub_args_proto(entersubop, namegv, protosv); - else - return ck_entersub_args_list(entersubop); + if (o->op_type == OP_LT || o->op_type == OP_I_LT) { + if (!(iv0 ^ reverse)) + return o; + neg = iv0; + } + else if (o->op_type == OP_LE || o->op_type == OP_I_LE) { + if (iv0 ^ reverse) + return o; + neg = !iv0; + } + else if (o->op_type == OP_GE || o->op_type == OP_I_GE) { + if (!(iv0 ^ reverse)) + return o; + neg = !iv0; + } + else if (o->op_type == OP_GT || o->op_type == OP_I_GT) { + if (iv0 ^ reverse) + return o; + neg = iv0; + } + else if (o->op_type == OP_EQ || o->op_type == OP_I_EQ) { + if (iv0) + return o; + neg = TRUE; + } + else { + assert(o->op_type == OP_NE || o->op_type == OP_I_NE); + if (iv0) + return o; + neg = FALSE; + } + + indexop->op_flags &= ~OPf_PARENS; + indexop->op_flags |= (o->op_flags & OPf_PARENS); + indexop->op_private |= OPpTRUEBOOL; + if (neg) + indexop->op_private |= OPpINDEX_BOOLNEG; + /* cut out the index op and free the eq,const ops */ + (void)op_sibling_splice(o, start, 1, NULL); + op_free(o); + + return indexop; } + OP * -Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv) +Perl_ck_concat(pTHX_ OP *o) { - IV cvflags = SvIVX(protosv); - int opnum = cvflags & 0xffff; - OP *aop = cUNOPx(entersubop)->op_first; - - PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_CORE; + const OP * const kid = cUNOPo->op_first; - if (!opnum) { - OP *cvop; - if (!OpHAS_SIBLING(aop)) - aop = cUNOPx(aop)->op_first; - aop = OpSIBLING(aop); - for (cvop = aop; OpSIBLING(cvop); cvop = OpSIBLING(cvop)) ; - if (aop != cvop) { - SV *namesv = cv_name((CV *)namegv, NULL, CV_NAME_NOTQUAL); - yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf, - SVfARG(namesv)), SvUTF8(namesv)); - } + PERL_ARGS_ASSERT_CK_CONCAT; + PERL_UNUSED_CONTEXT; - op_free(entersubop); - switch(cvflags >> 16) { - case 'F': return newSVOP(OP_CONST, 0, - newSVpv(CopFILE(PL_curcop),0)); - case 'L': return newSVOP( - OP_CONST, 0, - Perl_newSVpvf(aTHX_ - "%" IVdf, (IV)CopLINE(PL_curcop) - ) - ); - case 'P': return newSVOP(OP_CONST, 0, - (PL_curstash - ? newSVhek(HvNAME_HEK(PL_curstash)) - : &PL_sv_undef - ) - ); - } - NOT_REACHED; /* NOTREACHED */ + /* reuse the padtmp returned by the concat child */ + if (kid->op_type == OP_CONCAT && !(kid->op_private & OPpTARGET_MY) && + !(kUNOP->op_first->op_flags & OPf_MOD)) + { + o->op_flags |= OPf_STACKED; + o->op_private |= OPpCONCAT_NESTED; } - else { - OP *prev, *cvop, *first, *parent; - U32 flags = 0; - - parent = entersubop; - if (!OpHAS_SIBLING(aop)) { - parent = aop; - aop = cUNOPx(aop)->op_first; - } + return o; +} - first = prev = aop; - aop = OpSIBLING(aop); - /* find last sibling */ - for (cvop = aop; - OpHAS_SIBLING(cvop); - prev = cvop, cvop = OpSIBLING(cvop)) - ; - if (!(cvop->op_private & OPpENTERSUB_NOPAREN) - /* Usually, OPf_SPECIAL on an op with no args means that it had - * parens, but these have their own meaning for that flag: */ - && opnum != OP_VALUES && opnum != OP_KEYS && opnum != OP_EACH - && opnum != OP_DELETE && opnum != OP_EXISTS) - flags |= OPf_SPECIAL; - /* excise cvop from end of sibling chain */ - op_sibling_splice(parent, prev, 1, NULL); - op_free(cvop); - if (aop == cvop) aop = NULL; +OP * +Perl_ck_spair(pTHX_ OP *o) +{ - /* detach remaining siblings from the first sibling, then - * dispose of original optree */ + PERL_ARGS_ASSERT_CK_SPAIR; - if (aop) - op_sibling_splice(parent, first, -1, NULL); - op_free(entersubop); + if (o->op_flags & OPf_KIDS) { + OP* newop; + OP* kid; + OP* kidkid; + const OPCODE type = o->op_type; + o = modkids(ck_fun(o), type); + kid = cUNOPo->op_first; + kidkid = kUNOP->op_first; + newop = OpSIBLING(kidkid); + if (newop) { + const OPCODE type = newop->op_type; + if (OpHAS_SIBLING(newop)) + return o; + if (o->op_type == OP_REFGEN + && ( type == OP_RV2CV + || ( !(newop->op_flags & OPf_PARENS) + && ( type == OP_RV2AV || type == OP_PADAV + || type == OP_RV2HV || type == OP_PADHV)))) + NOOP; /* OK (allow srefgen for \@a and \%h) */ + else if (OP_GIMME(newop,0) != G_SCALAR) + return o; + } + /* excise first sibling */ + op_sibling_splice(kid, NULL, 1, NULL); + op_free(kidkid); + } + /* transforms OP_REFGEN into OP_SREFGEN, OP_CHOP into OP_SCHOP, + * and OP_CHOMP into OP_SCHOMP */ + o->op_ppaddr = PL_ppaddr[++o->op_type]; + return ck_fun(o); +} - if (cvflags == (OP_ENTEREVAL | (1<<16))) - flags |= OPpEVAL_BYTES <<8; +OP * +Perl_ck_delete(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_DELETE; - switch (PL_opargs[opnum] & OA_CLASS_MASK) { - case OA_UNOP: - case OA_BASEOP_OR_UNOP: - case OA_FILESTATOP: - if (!aop) - return newOP(opnum,flags); /* zero args */ - if (aop == prev) - return newUNOP(opnum,flags,aop); /* one arg */ - /* too many args */ + o = ck_fun(o); + o->op_private = 0; + if (o->op_flags & OPf_KIDS) { + OP * const kid = cUNOPo->op_first; + switch (kid->op_type) { + case OP_ASLICE: + o->op_flags |= OPf_SPECIAL; /* FALLTHROUGH */ - case OA_BASEOP: - if (aop) { - SV *namesv; - OP *nextop; - - namesv = cv_name((CV *)namegv, NULL, CV_NAME_NOTQUAL); - yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf, - SVfARG(namesv)), SvUTF8(namesv)); - while (aop) { - nextop = OpSIBLING(aop); - op_free(aop); - aop = nextop; - } - - } - return opnum == OP_RUNCV - ? newPVOP(OP_RUNCV,0,NULL) - : newOP(opnum,0); + case OP_HSLICE: + o->op_private |= OPpSLICE; + break; + case OP_AELEM: + o->op_flags |= OPf_SPECIAL; + /* FALLTHROUGH */ + case OP_HELEM: + break; + case OP_KVASLICE: + o->op_flags |= OPf_SPECIAL; + /* FALLTHROUGH */ + case OP_KVHSLICE: + o->op_private |= OPpKVSLICE; + break; default: - return op_convert_list(opnum,0,aop); + Perl_croak(aTHX_ "delete argument is not a HASH or ARRAY " + "element or slice"); } + if (kid->op_private & OPpLVAL_INTRO) + o->op_private |= OPpLVAL_INTRO; + op_null(kid); } - NOT_REACHED; /* NOTREACHED */ - return entersubop; + return o; } -/* -=for apidoc cv_get_call_checker_flags - -Retrieves the function that will be used to fix up a call to C. -Specifically, the function is applied to an C op tree for a -subroutine call, not marked with C<&>, where the callee can be identified -at compile time as C. - -The C-level function pointer is returned in C<*ckfun_p>, an SV argument -for it is returned in C<*ckobj_p>, and control flags are returned in -C<*ckflags_p>. The function is intended to be called in this manner: +OP * +Perl_ck_eof(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_EOF; - entersubop = (*ckfun_p)(aTHX_ entersubop, namegv, (*ckobj_p)); + if (o->op_flags & OPf_KIDS) { + OP *kid; + if (cLISTOPo->op_first->op_type == OP_STUB) { + OP * const newop + = newUNOP(o->op_type, OPf_SPECIAL, newGVOP(OP_GV, 0, PL_argvgv)); + op_free(o); + o = newop; + } + o = ck_fun(o); + kid = cLISTOPo->op_first; + if (kid->op_type == OP_RV2GV) + kid->op_private |= OPpALLOW_FAKE; + } + return o; +} -In this call, C is a pointer to the C op, -which may be replaced by the check function, and C supplies -the name that should be used by the check function to refer -to the callee of the C op if it needs to emit any diagnostics. -It is permitted to apply the check function in non-standard situations, -such as to a call to a different subroutine or to a method call. -C may not actually be a GV. If the C -bit is clear in C<*ckflags_p>, it is permitted to pass a CV or other SV -instead, anything that can be used as the first argument to L. -If the C bit is set in C<*ckflags_p> then the -check function requires C to be a genuine GV. +OP * +Perl_ck_eval(pTHX_ OP *o) +{ -By default, the check function is -L, -the SV parameter is C itself, and the C -flag is clear. This implements standard prototype processing. It can -be changed, for a particular subroutine, by L. + PERL_ARGS_ASSERT_CK_EVAL; -If the C bit is set in C then it -indicates that the caller only knows about the genuine GV version of -C, and accordingly the corresponding bit will always be set in -C<*ckflags_p>, regardless of the check function's recorded requirements. -If the C bit is clear in C then it -indicates the caller knows about the possibility of passing something -other than a GV as C, and accordingly the corresponding bit may -be either set or clear in C<*ckflags_p>, indicating the check function's -recorded requirements. + PL_hints |= HINT_BLOCK_SCOPE; + if (o->op_flags & OPf_KIDS) { + SVOP * const kid = cSVOPx(cUNOPo->op_first); + assert(kid); -C is a bitset passed into C, in which -only the C bit currently has a defined meaning -(for which see above). All other bits should be clear. + if (o->op_type == OP_ENTERTRY) { + LOGOP *enter; -=for apidoc Amnh||CALL_CHECKER_REQUIRE_GV + /* cut whole sibling chain free from o */ + op_sibling_splice(o, NULL, -1, NULL); + op_free(o); -=for apidoc cv_get_call_checker + enter = alloc_LOGOP(OP_ENTERTRY, NULL, NULL); -The original form of L, which does not return -checker flags. When using a checker function returned by this function, -it is only safe to call it with a genuine GV as its C argument. + /* establish postfix order */ + enter->op_next = (OP*)enter; -=cut -*/ + o = op_prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid); + OpTYPE_set(o, OP_LEAVETRY); + enter->op_other = o; + return o; + } + else { + scalar((OP*)kid); + S_set_haseval(aTHX); + } + } + else { + const U8 priv = o->op_private; + op_free(o); + /* the newUNOP will recursively call ck_eval(), which will handle + * all the stuff at the end of this function, like adding + * OP_HINTSEVAL + */ + return newUNOP(OP_ENTEREVAL, priv <<8, newDEFSVOP()); + } + o->op_targ = (PADOFFSET)PL_hints; + if (o->op_private & OPpEVAL_BYTES) o->op_targ &= ~HINT_UTF8; + if ((PL_hints & HINT_LOCALIZE_HH) != 0 + && !(o->op_private & OPpEVAL_COPHH) && GvHV(PL_hintgv)) { + /* Store a copy of %^H that pp_entereval can pick up. */ + HV *hh = hv_copy_hints_hv(GvHV(PL_hintgv)); + OP *hhop; + STOREFEATUREBITSHH(hh); + hhop = newSVOP(OP_HINTSEVAL, 0, MUTABLE_SV(hh)); + /* append hhop to only child */ + op_sibling_splice(o, cUNOPo->op_first, 0, hhop); -void -Perl_cv_get_call_checker_flags(pTHX_ CV *cv, U32 gflags, - Perl_call_checker *ckfun_p, SV **ckobj_p, U32 *ckflags_p) -{ - MAGIC *callmg; - PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER_FLAGS; - PERL_UNUSED_CONTEXT; - callmg = SvMAGICAL((SV*)cv) ? mg_find((SV*)cv, PERL_MAGIC_checkcall) : NULL; - if (callmg) { - *ckfun_p = DPTR2FPTR(Perl_call_checker, callmg->mg_ptr); - *ckobj_p = callmg->mg_obj; - *ckflags_p = (callmg->mg_flags | gflags) & MGf_REQUIRE_GV; - } else { - *ckfun_p = Perl_ck_entersub_args_proto_or_list; - *ckobj_p = (SV*)cv; - *ckflags_p = gflags & MGf_REQUIRE_GV; + o->op_private |= OPpEVAL_HAS_HH; } + if (!(o->op_private & OPpEVAL_BYTES) + && FEATURE_UNIEVAL_IS_ENABLED) + o->op_private |= OPpEVAL_UNICODE; + return o; } -void -Perl_cv_get_call_checker(pTHX_ CV *cv, Perl_call_checker *ckfun_p, SV **ckobj_p) +OP * +Perl_ck_trycatch(pTHX_ OP *o) { - U32 ckflags; - PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER; - PERL_UNUSED_CONTEXT; - cv_get_call_checker_flags(cv, CALL_CHECKER_REQUIRE_GV, ckfun_p, ckobj_p, - &ckflags); -} + LOGOP *enter; + OP *to_free = NULL; + OP *trykid, *catchkid; + OP *catchroot, *catchstart; -/* -=for apidoc cv_set_call_checker_flags + PERL_ARGS_ASSERT_CK_TRYCATCH; -Sets the function that will be used to fix up a call to C. -Specifically, the function is applied to an C op tree for a -subroutine call, not marked with C<&>, where the callee can be identified -at compile time as C. + trykid = cUNOPo->op_first; + if(trykid->op_type == OP_NULL || trykid->op_type == OP_PUSHMARK) { + to_free = trykid; + trykid = OpSIBLING(trykid); + } + catchkid = OpSIBLING(trykid); -The C-level function pointer is supplied in C, an SV argument for -it is supplied in C, and control flags are supplied in C. -The function should be defined like this: + assert(trykid->op_type == OP_POPTRY); + assert(catchkid->op_type == OP_CATCH); - STATIC OP * ckfun(pTHX_ OP *op, GV *namegv, SV *ckobj) + /* cut whole sibling chain free from o */ + op_sibling_splice(o, NULL, -1, NULL); + if(to_free) + op_free(to_free); + op_free(o); -It is intended to be called in this manner: + enter = alloc_LOGOP(OP_ENTERTRYCATCH, NULL, NULL); - entersubop = ckfun(aTHX_ entersubop, namegv, ckobj); + /* establish postfix order */ + enter->op_next = (OP*)enter; -In this call, C is a pointer to the C op, -which may be replaced by the check function, and C supplies -the name that should be used by the check function to refer -to the callee of the C op if it needs to emit any diagnostics. -It is permitted to apply the check function in non-standard situations, -such as to a call to a different subroutine or to a method call. + o = op_prepend_elem(OP_LINESEQ, (OP*)enter, trykid); + op_append_elem(OP_LINESEQ, (OP*)o, catchkid); + + OpTYPE_set(o, OP_LEAVETRYCATCH); + + /* The returned optree is actually threaded up slightly nonobviously in + * terms of its ->op_next pointers. + * + * This way, if the tryblock dies, its retop points at the OP_CATCH, but + * if it does not then its leavetry skips over that and continues + * execution past it. + */ -C may not actually be a GV. For efficiency, perl may pass a -CV or other SV instead. Whatever is passed can be used as the first -argument to L. You can force perl to pass a GV by including -C in the C. + /* First, link up the actual body of the catch block */ + catchroot = OpSIBLING(cUNOPx(catchkid)->op_first); + catchstart = LINKLIST(catchroot); + cLOGOPx(catchkid)->op_other = catchstart; -C is a bitset, in which only the C -bit currently has a defined meaning (for which see above). All other -bits should be clear. + o->op_next = LINKLIST(o); -The current setting for a particular CV can be retrieved by -L. + /* die within try block should jump to the catch */ + enter->op_other = catchkid; -=for apidoc cv_set_call_checker + /* after try block that doesn't die, just skip straight to leavetrycatch */ + trykid->op_next = o; -The original form of L, which passes it the -C flag for backward-compatibility. The effect -of that flag setting is that the check function is guaranteed to get a -genuine GV as its C argument. + /* after catch block, skip back up to the leavetrycatch */ + catchroot->op_next = o; -=cut -*/ + return o; +} -void -Perl_cv_set_call_checker(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj) +OP * +Perl_ck_exec(pTHX_ OP *o) { - PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER; - cv_set_call_checker_flags(cv, ckfun, ckobj, CALL_CHECKER_REQUIRE_GV); + PERL_ARGS_ASSERT_CK_EXEC; + + if (o->op_flags & OPf_STACKED) { + OP *kid; + o = ck_fun(o); + kid = OpSIBLING(cUNOPo->op_first); + if (kid->op_type == OP_RV2GV) + op_null(kid); + } + else + o = listkids(o); + return o; } -void -Perl_cv_set_call_checker_flags(pTHX_ CV *cv, Perl_call_checker ckfun, - SV *ckobj, U32 ckflags) +OP * +Perl_ck_exists(pTHX_ OP *o) { - PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER_FLAGS; - if (ckfun == Perl_ck_entersub_args_proto_or_list && ckobj == (SV*)cv) { - if (SvMAGICAL((SV*)cv)) - mg_free_type((SV*)cv, PERL_MAGIC_checkcall); - } else { - MAGIC *callmg; - sv_magic((SV*)cv, &PL_sv_undef, PERL_MAGIC_checkcall, NULL, 0); - callmg = mg_find((SV*)cv, PERL_MAGIC_checkcall); - assert(callmg); - if (callmg->mg_flags & MGf_REFCOUNTED) { - SvREFCNT_dec(callmg->mg_obj); - callmg->mg_flags &= ~MGf_REFCOUNTED; - } - callmg->mg_ptr = FPTR2DPTR(char *, ckfun); - callmg->mg_obj = ckobj; - if (ckobj != (SV*)cv) { - SvREFCNT_inc_simple_void_NN(ckobj); - callmg->mg_flags |= MGf_REFCOUNTED; + PERL_ARGS_ASSERT_CK_EXISTS; + + o = ck_fun(o); + if (o->op_flags & OPf_KIDS) { + OP * const kid = cUNOPo->op_first; + if (kid->op_type == OP_ENTERSUB) { + (void) ref(kid, o->op_type); + if (kid->op_type != OP_RV2CV + && !(PL_parser && PL_parser->error_count)) + Perl_croak(aTHX_ + "exists argument is not a subroutine name"); + o->op_private |= OPpEXISTS_SUB; } - callmg->mg_flags = (callmg->mg_flags &~ MGf_REQUIRE_GV) - | (U8)(ckflags & MGf_REQUIRE_GV) | MGf_COPY; + else if (kid->op_type == OP_AELEM) + o->op_flags |= OPf_SPECIAL; + else if (kid->op_type != OP_HELEM) + Perl_croak(aTHX_ "exists argument is not a HASH or ARRAY " + "element or a subroutine"); + op_null(kid); } + return o; } -static void -S_entersub_alloc_targ(pTHX_ OP * const o) +OP * +Perl_ck_helemexistsor(pTHX_ OP *o) { - o->op_targ = pad_alloc(OP_ENTERSUB, SVs_PADTMP); - o->op_private |= OPpENTERSUB_HASTARG; + PERL_ARGS_ASSERT_CK_HELEMEXISTSOR; + + o = ck_fun(o); + + OP *first; + if(!(o->op_flags & OPf_KIDS) || + !(first = cLOGOPo->op_first) || + first->op_type != OP_HELEM) + /* As this opcode isn't currently exposed to pure-perl, only core or XS + * authors are ever going to see this message. We don't need to list it + * in perldiag as to do so would require documenting OP_HELEMEXISTSOR + * itself + */ + /* diag_listed_as: SKIPME */ + croak("OP_HELEMEXISTSOR argument is not a HASH element"); + + OP *hvop = cBINOPx(first)->op_first; + OP *keyop = OpSIBLING(hvop); + assert(!OpSIBLING(keyop)); + + op_null(first); // null out the OP_HELEM + + keyop->op_next = o; + + return o; } OP * -Perl_ck_subr(pTHX_ OP *o) +Perl_ck_rvconst(pTHX_ OP *o) { - OP *aop, *cvop; - CV *cv; - GV *namegv; - SV **const_class = NULL; + SVOP * const kid = cSVOPx(cUNOPo->op_first); - PERL_ARGS_ASSERT_CK_SUBR; + PERL_ARGS_ASSERT_CK_RVCONST; - aop = cUNOPx(o)->op_first; - if (!OpHAS_SIBLING(aop)) - aop = cUNOPx(aop)->op_first; - aop = OpSIBLING(aop); - for (cvop = aop; OpHAS_SIBLING(cvop); cvop = OpSIBLING(cvop)) ; - cv = rv2cv_op_cv(cvop, RV2CVOPCV_MARK_EARLY); - namegv = cv ? (GV*)rv2cv_op_cv(cvop, RV2CVOPCV_MAYBE_NAME_GV) : NULL; + if (o->op_type == OP_RV2HV) + /* rv2hv steals the bottom bit for its own uses */ + o->op_private &= ~OPpARG1_MASK; - o->op_private &= ~1; o->op_private |= (PL_hints & HINT_STRICT_REFS); - if (PERLDB_SUB && PL_curstash != PL_debstash) - o->op_private |= OPpENTERSUB_DB; - switch (cvop->op_type) { - case OP_RV2CV: - o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER); - op_null(cvop); - break; - case OP_METHOD: - case OP_METHOD_NAMED: - case OP_METHOD_SUPER: - case OP_METHOD_REDIR: - case OP_METHOD_REDIR_SUPER: - o->op_flags |= OPf_REF; - if (aop->op_type == OP_CONST) { - aop->op_private &= ~OPpCONST_STRICT; - const_class = &cSVOPx(aop)->op_sv; - } - else if (aop->op_type == OP_LIST) { - OP * const sib = OpSIBLING(((UNOP*)aop)->op_first); - if (sib && sib->op_type == OP_CONST) { - sib->op_private &= ~OPpCONST_STRICT; - const_class = &cSVOPx(sib)->op_sv; - } - } - /* make class name a shared cow string to speedup method calls */ - /* constant string might be replaced with object, f.e. bigint */ - if (const_class && SvPOK(*const_class)) { - STRLEN len; - const char* str = SvPV(*const_class, len); - if (len) { - SV* const shared = newSVpvn_share( - str, SvUTF8(*const_class) - ? -(SSize_t)len : (SSize_t)len, - 0 - ); - if (SvREADONLY(*const_class)) - SvREADONLY_on(shared); - SvREFCNT_dec(*const_class); - *const_class = shared; - } - } - break; - } - if (!cv) { - S_entersub_alloc_targ(aTHX_ o); - return ck_entersub_args_list(o); - } else { - Perl_call_checker ckfun; - SV *ckobj; - U32 ckflags; - cv_get_call_checker_flags(cv, 0, &ckfun, &ckobj, &ckflags); - if (CvISXSUB(cv) || !CvROOT(cv)) - S_entersub_alloc_targ(aTHX_ o); - if (!namegv) { - /* The original call checker API guarantees that a GV will - be provided with the right name. So, if the old API was - used (or the REQUIRE_GV flag was passed), we have to reify - the CV’s GV, unless this is an anonymous sub. This is not - ideal for lexical subs, as its stringification will include - the package. But it is the best we can do. */ - if (ckflags & CALL_CHECKER_REQUIRE_GV) { - if (!CvANON(cv) && (!CvNAMED(cv) || CvNAME_HEK(cv))) - namegv = CvGV(cv); - } - else namegv = MUTABLE_GV(cv); - /* After a syntax error in a lexical sub, the cv that - rv2cv_op_cv returns may be a nameless stub. */ - if (!namegv) return ck_entersub_args_list(o); + if (kid->op_type == OP_CONST) { + int iscv; + GV *gv; + SV * const kidsv = kid->op_sv; + /* Is it a constant from cv_const_sv()? */ + if ((SvROK(kidsv) || isGV_with_GP(kidsv)) && SvREADONLY(kidsv)) { + return o; + } + if (SvTYPE(kidsv) == SVt_PVAV) return o; + if ((o->op_private & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) { + const char *badthing; + switch (o->op_type) { + case OP_RV2SV: + badthing = "a SCALAR"; + break; + case OP_RV2AV: + badthing = "an ARRAY"; + break; + case OP_RV2HV: + badthing = "a HASH"; + break; + default: + badthing = NULL; + break; + } + if (badthing) + Perl_croak(aTHX_ + "Can't use bareword (\"%" SVf "\") as %s ref while \"strict refs\" in use", + SVfARG(kidsv), badthing); + } + /* + * This is a little tricky. We only want to add the symbol if we + * didn't add it in the lexer. Otherwise we get duplicate strict + * warnings. But if we didn't add it in the lexer, we must at + * least pretend like we wanted to add it even if it existed before, + * or we get possible typo warnings. OPpCONST_ENTERED says + * whether the lexer already added THIS instance of this symbol. + */ + iscv = o->op_type == OP_RV2CV ? GV_NOEXPAND|GV_ADDMULTI : 0; + gv = gv_fetchsv(kidsv, + o->op_type == OP_RV2CV + && o->op_private & OPpMAY_RETURN_CONSTANT + ? GV_NOEXPAND + : iscv | !(kid->op_private & OPpCONST_ENTERED), + iscv + ? SVt_PVCV + : o->op_type == OP_RV2SV + ? SVt_PV + : o->op_type == OP_RV2AV + ? SVt_PVAV + : o->op_type == OP_RV2HV + ? SVt_PVHV + : SVt_PVGV); + if (gv) { + if (!isGV(gv)) { + assert(iscv); + assert(SvROK(gv)); + if (!(o->op_private & OPpMAY_RETURN_CONSTANT) + && SvTYPE(SvRV(gv)) != SVt_PVCV) + gv_fetchsv(kidsv, GV_ADDMULTI, SVt_PVCV); + } + OpTYPE_set(kid, OP_GV); + SvREFCNT_dec(kid->op_sv); +#ifdef USE_ITHREADS + /* XXX hack: dependence on sizeof(PADOP) <= sizeof(SVOP) */ + STATIC_ASSERT_STMT(sizeof(PADOP) <= sizeof(SVOP)); + kPADOP->op_padix = pad_alloc(OP_GV, SVf_READONLY); + SvREFCNT_dec(PAD_SVl(kPADOP->op_padix)); + PAD_SETSV(kPADOP->op_padix, MUTABLE_SV(SvREFCNT_inc_simple_NN(gv))); +#else + kid->op_sv = SvREFCNT_inc_simple_NN(gv); +#endif + kid->op_private = 0; + /* FAKE globs in the symbol table cause weird bugs (#77810) */ + SvFAKE_off(gv); } - return ckfun(aTHX_ o, namegv, ckobj); - } -} - -OP * -Perl_ck_svconst(pTHX_ OP *o) -{ - SV * const sv = cSVOPo->op_sv; - PERL_ARGS_ASSERT_CK_SVCONST; - PERL_UNUSED_CONTEXT; -#ifdef PERL_COPY_ON_WRITE - /* Since the read-only flag may be used to protect a string buffer, we - cannot do copy-on-write with existing read-only scalars that are not - already copy-on-write scalars. To allow $_ = "hello" to do COW with - that constant, mark the constant as COWable here, if it is not - already read-only. */ - if (!SvREADONLY(sv) && !SvIsCOW(sv) && SvCANCOW(sv)) { - SvIsCOW_on(sv); - CowREFCNT(sv) = 0; -# ifdef PERL_DEBUG_READONLY_COW - sv_buf_to_ro(sv); -# endif } -#endif - SvREADONLY_on(sv); return o; } OP * -Perl_ck_trunc(pTHX_ OP *o) +Perl_ck_ftst(pTHX_ OP *o) { - PERL_ARGS_ASSERT_CK_TRUNC; + const I32 type = o->op_type; - if (o->op_flags & OPf_KIDS) { - SVOP *kid = (SVOP*)cUNOPo->op_first; + PERL_ARGS_ASSERT_CK_FTST; - if (kid->op_type == OP_NULL) - kid = (SVOP*)OpSIBLING(kid); - if (kid && kid->op_type == OP_CONST && - (kid->op_private & OPpCONST_BARE) && - !kid->op_folded) - { - o->op_flags |= OPf_SPECIAL; - kid->op_private &= ~OPpCONST_STRICT; + if (o->op_flags & OPf_REF) { + NOOP; + } + else if (o->op_flags & OPf_KIDS && cUNOPo->op_first->op_type != OP_STUB) { + SVOP * const kid = cSVOPx(cUNOPo->op_first); + const OPCODE kidtype = kid->op_type; + + if (kidtype == OP_CONST && (kid->op_private & OPpCONST_BARE) + && !kid->op_folded) { if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) { - no_bareword_filehandle(SvPVX(cSVOPx_sv(kid))); + no_bareword_filehandle(SvPVX(kSVOP_sv)); + } + OP * const newop = newGVOP(type, OPf_REF, + gv_fetchsv(kid->op_sv, GV_ADD, SVt_PVIO)); + op_free(o); + return newop; + } + + if ((kidtype == OP_RV2AV || kidtype == OP_PADAV) && ckWARN(WARN_SYNTAX)) { + SV *name = S_op_varname_subscript(aTHX_ (OP*)kid, 2); + if (name) { + /* diag_listed_as: Array passed to stat will be coerced to a scalar%s */ + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%s (did you want stat %" SVf "?)", + array_passed_to_stat, name); } + else { + /* diag_listed_as: Array passed to stat will be coerced to a scalar%s */ + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%s", array_passed_to_stat); + } + } + scalar((OP *) kid); + if ((PL_hints & HINT_FILETEST_ACCESS) && OP_IS_FILETEST_ACCESS(o->op_type)) + o->op_private |= OPpFT_ACCESS; + if (OP_IS_FILETEST(type) + && OP_IS_FILETEST(kidtype) + ) { + o->op_private |= OPpFT_STACKED; + kid->op_private |= OPpFT_STACKING; + if (kidtype == OP_FTTTY && ( + !(kid->op_private & OPpFT_STACKED) + || kid->op_private & OPpFT_AFTER_t + )) + o->op_private |= OPpFT_AFTER_t; } } - return ck_fun(o); + else { + op_free(o); + if (type == OP_FTTTY) + o = newGVOP(type, OPf_REF, PL_stdingv); + else + o = newUNOP(type, 0, newDEFSVOP()); + } + return o; } OP * -Perl_ck_substr(pTHX_ OP *o) +Perl_ck_fun(pTHX_ OP *o) { - PERL_ARGS_ASSERT_CK_SUBSTR; - - o = ck_fun(o); - if ((o->op_flags & OPf_KIDS) && (o->op_private == 4)) { - OP *kid = cLISTOPo->op_first; + const int type = o->op_type; + I32 oa = PL_opargs[type] >> OASHIFT; - if (kid->op_type == OP_NULL) - kid = OpSIBLING(kid); - if (kid) - /* Historically, substr(delete $foo{bar},...) has been allowed - with 4-arg substr. Keep it working by applying entersub - lvalue context. */ - op_lvalue(kid, OP_ENTERSUB); + PERL_ARGS_ASSERT_CK_FUN; + if (o->op_flags & OPf_STACKED) { + if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL)) + oa &= ~OA_OPTIONAL; + else + return no_fh_allowed(o); } - return o; -} -OP * -Perl_ck_tell(pTHX_ OP *o) -{ - PERL_ARGS_ASSERT_CK_TELL; - o = ck_fun(o); if (o->op_flags & OPf_KIDS) { - OP *kid = cLISTOPo->op_first; - if (kid->op_type == OP_NULL && OpHAS_SIBLING(kid)) kid = OpSIBLING(kid); - if (kid->op_type == OP_RV2GV) kid->op_private |= OPpALLOW_FAKE; - } - return o; -} + OP *prev_kid = NULL; + OP *kid = cLISTOPo->op_first; + I32 numargs = 0; + bool seen_optional = FALSE; -PERL_STATIC_INLINE OP * -S_last_non_null_kid(OP *o) { - OP *last = NULL; - if (cUNOPo->op_flags & OPf_KIDS) { - OP *k = cLISTOPo->op_first; - while (k) { - if (k->op_type != OP_NULL) { - last = k; + if (kid->op_type == OP_PUSHMARK || + (kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK)) + { + prev_kid = kid; + kid = OpSIBLING(kid); + } + if (kid && kid->op_type == OP_COREARGS) { + bool optional = FALSE; + while (oa) { + numargs++; + if (oa & OA_OPTIONAL) optional = TRUE; + oa = oa >> 4; } - k = OpSIBLING(k); + if (optional) o->op_private |= numargs; + return o; } - } - return last; -} + while (oa) { + if (oa & OA_OPTIONAL || (oa & 7) == OA_LIST) { + if (!kid && !seen_optional && PL_opargs[type] & OA_DEFGV) { + kid = newDEFSVOP(); + /* append kid to chain */ + op_sibling_splice(o, prev_kid, 0, kid); + } + seen_optional = TRUE; + } + if (!kid) break; -OP * -Perl_ck_each(pTHX_ OP *o) -{ - OP *kid = o->op_flags & OPf_KIDS ? cUNOPo->op_first : NULL; - const unsigned orig_type = o->op_type; + numargs++; + switch (oa & 7) { + case OA_SCALAR: + /* list seen where single (scalar) arg expected? */ + if (numargs == 1 && !(oa >> 4) + && kid->op_type == OP_LIST && type != OP_SCALAR) + { + return too_many_arguments_pv(o,PL_op_desc[type], 0); + } + if (type != OP_DELETE) scalar(kid); + break; + case OA_LIST: + if (oa < 16) { + kid = 0; + continue; + } + else + list(kid); + break; + case OA_AVREF: + if ((type == OP_PUSH || type == OP_UNSHIFT) + && !OpHAS_SIBLING(kid)) + Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX), + "Useless use of %s with no values", + PL_op_desc[type]); - PERL_ARGS_ASSERT_CK_EACH; + if (kid->op_type == OP_CONST + && ( !SvROK(cSVOPx_sv(kid)) + || SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVAV ) + ) + bad_type_pv(numargs, "array", o, kid); + else if (kid->op_type == OP_RV2HV || kid->op_type == OP_PADHV + || kid->op_type == OP_RV2GV) { + bad_type_pv(1, "array", o, kid); + } + else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV) { + yyerror_pv(Perl_form(aTHX_ "Experimental %s on scalar is now forbidden", + PL_op_desc[type]), 0); + } + else { + op_lvalue(kid, type); + } + break; + case OA_HVREF: + if (kid->op_type != OP_RV2HV && kid->op_type != OP_PADHV) + bad_type_pv(numargs, "hash", o, kid); + op_lvalue(kid, type); + break; + case OA_CVREF: + { + /* replace kid with newop in chain */ + OP * const newop = + S_op_sibling_newUNOP(aTHX_ o, prev_kid, OP_NULL, 0); + newop->op_next = newop; + kid = newop; + } + break; + case OA_FILEREF: + if (kid->op_type != OP_GV && kid->op_type != OP_RV2GV) { + if (kid->op_type == OP_CONST && + (kid->op_private & OPpCONST_BARE)) + { + OP * const newop = newGVOP(OP_GV, 0, + gv_fetchsv(kSVOP->op_sv, GV_ADD, SVt_PVIO)); + /* a first argument is handled by toke.c, ideally we'd + just check here but several ops don't use ck_fun() */ + if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) { + no_bareword_filehandle(SvPVX(kSVOP_sv)); + } + /* replace kid with newop in chain */ + op_sibling_splice(o, prev_kid, 1, newop); + op_free(kid); + kid = newop; + } + else if (kid->op_type == OP_READLINE) { + /* neophyte patrol: open(), close() etc. */ + bad_type_pv(numargs, "HANDLE", o, kid); + } + else { + I32 flags = OPf_SPECIAL; + I32 priv = 0; + PADOFFSET targ = 0; - if (kid) { - switch (kid->op_type) { - case OP_PADHV: - break; + /* is this op a FH constructor? */ + if (is_handle_constructor(o,numargs)) { + const char *name = NULL; + STRLEN len = 0; + U32 name_utf8 = 0; + bool want_dollar = TRUE; - case OP_RV2HV: - /* Catch out an anonhash here, since the behaviour might be - * confusing. - * - * The typical tree is: - * - * rv2hv - * scope - * null - * anonhash - * - * If the contents of the block is more complex you might get: - * - * rv2hv - * leave - * enter - * ... - * anonhash - * - * Similarly for the anonlist version below. - */ - if (orig_type == OP_EACH && - ckWARN(WARN_SYNTAX) && - (cUNOPx(kid)->op_flags & OPf_KIDS) && - ( cUNOPx(kid)->op_first->op_type == OP_SCOPE || - cUNOPx(kid)->op_first->op_type == OP_LEAVE) && - (cUNOPx(kid)->op_first->op_flags & OPf_KIDS)) { - /* look for last non-null kid, since we might have: - each %{ some code ; +{ anon hash } } - */ - OP *k = S_last_non_null_kid(cUNOPx(kid)->op_first); - if (k && k->op_type == OP_ANONHASH) { - /* diag_listed_as: each on anonymous %s will always start from the beginning */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "each on anonymous hash will always start from the beginning"); + flags = 0; + /* Set a flag to tell rv2gv to vivify + * need to "prove" flag does not mean something + * else already - NI-S 1999/05/07 + */ + priv = OPpDEREF; + if (kid->op_type == OP_PADSV) { + PADNAME * const pn + = PAD_COMPNAME_SV(kid->op_targ); + name = PadnamePV (pn); + len = PadnameLEN(pn); + name_utf8 = PadnameUTF8(pn); + } + else if (kid->op_type == OP_RV2SV + && kUNOP->op_first->op_type == OP_GV) + { + GV * const gv = cGVOPx_gv(kUNOP->op_first); + name = GvNAME(gv); + len = GvNAMELEN(gv); + name_utf8 = GvNAMEUTF8(gv) ? SVf_UTF8 : 0; + } + else if (kid->op_type == OP_AELEM + || kid->op_type == OP_HELEM) + { + OP *firstop; + OP *op = kBINOP->op_first; + name = NULL; + if (op) { + SV *tmpstr = NULL; + const char * const a = + kid->op_type == OP_AELEM ? + "[]" : "{}"; + if (((op->op_type == OP_RV2AV) || + (op->op_type == OP_RV2HV)) && + (firstop = cUNOPx(op)->op_first) && + (firstop->op_type == OP_GV)) { + /* packagevar $a[] or $h{} */ + GV * const gv = cGVOPx_gv(firstop); + if (gv) + tmpstr = + Perl_newSVpvf(aTHX_ + "%s%c...%c", + GvNAME(gv), + a[0], a[1]); + } + else if (op->op_type == OP_PADAV + || op->op_type == OP_PADHV) { + /* lexicalvar $a[] or $h{} */ + const char * const padname = + PAD_COMPNAME_PV(op->op_targ); + if (padname) + tmpstr = + Perl_newSVpvf(aTHX_ + "%s%c...%c", + padname + 1, + a[0], a[1]); + } + if (tmpstr) { + name = SvPV_const(tmpstr, len); + name_utf8 = SvUTF8(tmpstr); + sv_2mortal(tmpstr); + } + } + if (!name) { + name = "__ANONIO__"; + len = 10; + want_dollar = FALSE; + } + op_lvalue(kid, type); + } + if (name) { + SV *namesv; + targ = pad_alloc(OP_RV2GV, SVf_READONLY); + namesv = PAD_SVl(targ); + if (want_dollar && *name != '$') + sv_setpvs(namesv, "$"); + else + SvPVCLEAR(namesv); + sv_catpvn(namesv, name, len); + if ( name_utf8 ) SvUTF8_on(namesv); + } + } + scalar(kid); + kid = S_op_sibling_newUNOP(aTHX_ o, prev_kid, + OP_RV2GV, flags); + kid->op_targ = targ; + kid->op_private |= priv; } } + scalar(kid); break; - case OP_RV2AV: - if (orig_type == OP_EACH && - ckWARN(WARN_SYNTAX) && - (cUNOPx(kid)->op_flags & OPf_KIDS) && - (cUNOPx(kid)->op_first->op_type == OP_SCOPE || - cUNOPx(kid)->op_first->op_type == OP_LEAVE) && - (cUNOPx(kid)->op_first->op_flags & OPf_KIDS)) { - OP *k = S_last_non_null_kid(cUNOPx(kid)->op_first); - if (k && k->op_type == OP_ANONLIST) { - /* diag_listed_as: each on anonymous %s will always start from the beginning */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "each on anonymous array will always start from the beginning"); - } - } - /* FALLTHROUGH */ - case OP_PADAV: - OpTYPE_set(o, orig_type == OP_EACH ? OP_AEACH - : orig_type == OP_KEYS ? OP_AKEYS - : OP_AVALUES); + case OA_SCALARREF: + if ((type == OP_UNDEF || type == OP_POS) + && numargs == 1 && !(oa >> 4) + && kid->op_type == OP_LIST) + return too_many_arguments_pv(o,PL_op_desc[type], 0); + op_lvalue(scalar(kid), type); break; - case OP_CONST: - if (kid->op_private == OPpCONST_BARE - || !SvROK(cSVOPx_sv(kid)) - || ( SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVAV - && SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVHV ) - ) - goto bad; - /* FALLTHROUGH */ - default: - qerror(Perl_mess(aTHX_ - "Experimental %s on scalar is now forbidden", - PL_op_desc[orig_type])); - bad: - bad_type_pv(1, "hash or array", o, kid); - return o; + } + oa >>= 4; + prev_kid = kid; + kid = OpSIBLING(kid); } + /* FIXME - should the numargs or-ing move after the too many + * arguments check? */ + o->op_private |= numargs; + if (kid) + return too_many_arguments_pv(o,OP_DESC(o), 0); + listkids(o); } - return ck_fun(o); + else if (PL_opargs[type] & OA_DEFGV) { + /* Ordering of these two is important to keep f_map.t passing. */ + op_free(o); + return newUNOP(type, 0, newDEFSVOP()); + } + + if (oa) { + while (oa & OA_OPTIONAL) + oa >>= 4; + if (oa && oa != OA_LIST) + return too_few_arguments_pv(o,OP_DESC(o), 0); + } + return o; } OP * -Perl_ck_length(pTHX_ OP *o) +Perl_ck_glob(pTHX_ OP *o) { - PERL_ARGS_ASSERT_CK_LENGTH; + GV *gv; - o = ck_fun(o); + PERL_ARGS_ASSERT_CK_GLOB; - if (ckWARN(WARN_SYNTAX)) { - const OP *kid = o->op_flags & OPf_KIDS ? cLISTOPo->op_first : NULL; + o = ck_fun(o); + if ((o->op_flags & OPf_KIDS) && !OpHAS_SIBLING(cLISTOPo->op_first)) + op_append_elem(OP_GLOB, o, newDEFSVOP()); /* glob() => glob($_) */ - if (kid) { - SV *name = NULL; - const bool hash = kid->op_type == OP_PADHV - || kid->op_type == OP_RV2HV; - switch (kid->op_type) { - case OP_PADHV: - case OP_PADAV: - case OP_RV2HV: - case OP_RV2AV: - name = S_op_varname(aTHX_ kid); - break; - default: - return o; - } - if (name) - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "length() used on %" SVf " (did you mean \"scalar(%s%" SVf - ")\"?)", - SVfARG(name), hash ? "keys " : "", SVfARG(name) - ); - else if (hash) - /* diag_listed_as: length() used on %s (did you mean "scalar(%s)"?) */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "length() used on %%hash (did you mean \"scalar(keys %%hash)\"?)"); - else - /* diag_listed_as: length() used on %s (did you mean "scalar(%s)"?) */ - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "length() used on @array (did you mean \"scalar(@array)\"?)"); - } + if (!(o->op_flags & OPf_SPECIAL) && (gv = gv_override("glob", 4))) + { + /* convert + * glob + * \ null - const(wildcard) + * into + * null + * \ enter + * \ list + * \ mark - glob - rv2cv + * | \ gv(CORE::GLOBAL::glob) + * | + * \ null - const(wildcard) + */ + o->op_flags |= OPf_SPECIAL; + o->op_targ = pad_alloc(OP_GLOB, SVs_PADTMP); + o = S_new_entersubop(aTHX_ gv, o); + o = newUNOP(OP_NULL, 0, o); + o->op_targ = OP_GLOB; /* hint at what it used to be: eg in newWHILEOP */ + return o; + } + else o->op_flags &= ~OPf_SPECIAL; +#if !defined(PERL_EXTERNAL_GLOB) + if (!PL_globhook) { + ENTER; + Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, + newSVpvs("File::Glob"), NULL, NULL, NULL); + LEAVE; } - +#endif /* !PERL_EXTERNAL_GLOB */ + gv = (GV *)newSV_type(SVt_NULL); + gv_init(gv, 0, "", 0, 0); + gv_IOadd(gv); + op_append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv)); + SvREFCNT_dec_NN(gv); /* newGVOP increased it */ + scalarkids(o); return o; } - OP * -Perl_ck_isa(pTHX_ OP *o) +Perl_ck_grep(pTHX_ OP *o) { - OP *classop = cBINOPo->op_last; - - PERL_ARGS_ASSERT_CK_ISA; - - /* Convert barename into PV */ - if(classop->op_type == OP_CONST && classop->op_private & OPpCONST_BARE) { - /* TODO: Optionally convert package to raw HV here */ - classop->op_private &= ~(OPpCONST_BARE|OPpCONST_STRICT); - } - - return o; -} - - -/* - --------------------------------------------------------- - - Common vars in list assignment - - There now follows some enums and static functions for detecting - common variables in list assignments. Here is a little essay I wrote - for myself when trying to get my head around this. DAPM. - - ---- - - First some random observations: - - * If a lexical var is an alias of something else, e.g. - for my $x ($lex, $pkg, $a[0]) {...} - then the act of aliasing will increase the reference count of the SV - - * If a package var is an alias of something else, it may still have a - reference count of 1, depending on how the alias was created, e.g. - in *a = *b, $a may have a refcount of 1 since the GP is shared - with a single GvSV pointer to the SV. So If it's an alias of another - package var, then RC may be 1; if it's an alias of another scalar, e.g. - a lexical var or an array element, then it will have RC > 1. - - * There are many ways to create a package alias; ultimately, XS code - may quite legally do GvSV(gv) = SvREFCNT_inc(sv) for example, so - run-time tracing mechanisms are unlikely to be able to catch all cases. - - * When the LHS is all my declarations, the same vars can't appear directly - on the RHS, but they can indirectly via closures, aliasing and lvalue - subs. But those techniques all involve an increase in the lexical - scalar's ref count. - - * When the LHS is all lexical vars (but not necessarily my declarations), - it is possible for the same lexicals to appear directly on the RHS, and - without an increased ref count, since the stack isn't refcounted. - This case can be detected at compile time by scanning for common lex - vars with PL_generation. - - * lvalue subs defeat common var detection, but they do at least - return vars with a temporary ref count increment. Also, you can't - tell at compile time whether a sub call is lvalue. - - - So... - - A: There are a few circumstances where there definitely can't be any - commonality: - - LHS empty: () = (...); - RHS empty: (....) = (); - RHS contains only constants or other 'can't possibly be shared' - elements (e.g. ops that return PADTMPs): (...) = (1,2, length) - i.e. they only contain ops not marked as dangerous, whose children - are also not dangerous; - LHS ditto; - LHS contains a single scalar element: e.g. ($x) = (....); because - after $x has been modified, it won't be used again on the RHS; - RHS contains a single element with no aggregate on LHS: e.g. - ($a,$b,$c) = ($x); again, once $a has been modified, its value - won't be used again. - - B: If LHS are all 'my' lexical var declarations (or safe ops, which - we can ignore): - - my ($a, $b, @c) = ...; - - Due to closure and goto tricks, these vars may already have content. - For the same reason, an element on the RHS may be a lexical or package - alias of one of the vars on the left, or share common elements, for - example: - - my ($x,$y) = f(); # $x and $y on both sides - sub f : lvalue { ($x,$y) = (1,2); $y, $x } - - and - - my $ra = f(); - my @a = @$ra; # elements of @a on both sides - sub f { @a = 1..4; \@a } - - - First, just consider scalar vars on LHS: - - RHS is safe only if (A), or in addition, - * contains only lexical *scalar* vars, where neither side's - lexicals have been flagged as aliases - - If RHS is not safe, then it's always legal to check LHS vars for - RC==1, since the only RHS aliases will always be associated - with an RC bump. + LOGOP *gwop; + OP *kid; + const OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE; - Note that in particular, RHS is not safe if: + PERL_ARGS_ASSERT_CK_GREP; - * it contains package scalar vars; e.g.: + /* don't allocate gwop here, as we may leak it if PL_parser->error_count > 0 */ - f(); - my ($x, $y) = (2, $x_alias); - sub f { $x = 1; *x_alias = \$x; } + if (o->op_flags & OPf_STACKED) { + kid = cUNOPx(OpSIBLING(cLISTOPo->op_first))->op_first; + if (kid->op_type != OP_SCOPE && kid->op_type != OP_LEAVE) + return no_fh_allowed(o); + o->op_flags &= ~OPf_STACKED; + } + kid = OpSIBLING(cLISTOPo->op_first); + if (type == OP_MAPWHILE) + list(kid); + else + scalar(kid); + o = ck_fun(o); + if (PL_parser && PL_parser->error_count) + return o; + kid = OpSIBLING(cLISTOPo->op_first); + if (kid->op_type != OP_NULL) + Perl_croak(aTHX_ "panic: ck_grep, type=%u", (unsigned) kid->op_type); + kid = kUNOP->op_first; - * It contains other general elements, such as flattened or - * spliced or single array or hash elements, e.g. + gwop = alloc_LOGOP(type, o, LINKLIST(kid)); + kid->op_next = (OP*)gwop; + o->op_private = gwop->op_private = 0; + gwop->op_targ = pad_alloc(type, SVs_PADTMP); - f(); - my ($x,$y) = @a; # or $a[0] or @a{@b} etc + kid = OpSIBLING(cLISTOPo->op_first); + for (kid = OpSIBLING(kid); kid; kid = OpSIBLING(kid)) + op_lvalue(kid, OP_GREPSTART); - sub f { - ($x, $y) = (1,2); - use feature 'refaliasing'; - \($a[0], $a[1]) = \($y,$x); - } + return (OP*)gwop; +} - It doesn't matter if the array/hash is lexical or package. +OP * +Perl_ck_index(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_INDEX; - * it contains a function call that happens to be an lvalue - sub which returns one or more of the above, e.g. + if (o->op_flags & OPf_KIDS) { + OP *kid = OpSIBLING(cLISTOPo->op_first); /* get past pushmark */ + if (kid) + kid = OpSIBLING(kid); /* get past "big" */ + if (kid && kid->op_type == OP_CONST) { + const bool save_taint = TAINT_get; + SV *sv = kSVOP->op_sv; + if ( (!SvPOK(sv) || SvNIOKp(sv) || isREGEXP(sv)) + && SvOK(sv) && !SvROK(sv)) + { + sv = newSV_type(SVt_NULL); + sv_copypv(sv, kSVOP->op_sv); + SvREFCNT_dec_NN(kSVOP->op_sv); + kSVOP->op_sv = sv; + } + if (SvOK(sv)) fbm_compile(sv, 0); + TAINT_set(save_taint); +#ifdef NO_TAINT_SUPPORT + PERL_UNUSED_VAR(save_taint); +#endif + } + } + return ck_fun(o); +} - f(); - my ($x,$y) = f(); +OP * +Perl_ck_lfun(pTHX_ OP *o) +{ + const OPCODE type = o->op_type; - sub f : lvalue { - ($x, $y) = (1,2); - *x1 = \$x; - $y, $x1; - } + PERL_ARGS_ASSERT_CK_LFUN; - (so a sub call on the RHS should be treated the same - as having a package var on the RHS). + return modkids(ck_fun(o), type); +} - * any other "dangerous" thing, such an op or built-in that - returns one of the above, e.g. pp_preinc +OP * +Perl_ck_defined(pTHX_ OP *o) /* 19990527 MJD */ +{ + PERL_ARGS_ASSERT_CK_DEFINED; + if ((o->op_flags & OPf_KIDS)) { + switch (cUNOPo->op_first->op_type) { + case OP_RV2AV: + case OP_PADAV: + Perl_croak(aTHX_ "Can't use 'defined(@array)'" + " (Maybe you should just omit the defined()?)"); + NOT_REACHED; /* NOTREACHED */ + break; + case OP_RV2HV: + case OP_PADHV: + Perl_croak(aTHX_ "Can't use 'defined(%%hash)'" + " (Maybe you should just omit the defined()?)"); + NOT_REACHED; /* NOTREACHED */ + break; + default: + /* no warning */ + break; + } + } + return ck_rfun(o); +} - If RHS is not safe, what we can do however is at compile time flag - that the LHS are all my declarations, and at run time check whether - all the LHS have RC == 1, and if so skip the full scan. +OP * +Perl_ck_readline(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_READLINE; - Now consider array and hash vars on LHS: e.g. my (...,@a) = ...; + if (o->op_flags & OPf_KIDS) { + OP *kid = cLISTOPo->op_first; + if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED + && kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) { + no_bareword_filehandle(SvPVX(kSVOP_sv)); + } + if (kid->op_type == OP_RV2GV) kid->op_private |= OPpALLOW_FAKE; + scalar(kid); + } + else { + OP * const newop + = newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, PL_argvgv)); + op_free(o); + return newop; + } + return o; +} - Here the issue is whether there can be elements of @a on the RHS - which will get prematurely freed when @a is cleared prior to - assignment. This is only a problem if the aliasing mechanism - is one which doesn't increase the refcount - only if RC == 1 - will the RHS element be prematurely freed. +OP * +Perl_ck_rfun(pTHX_ OP *o) +{ + const OPCODE type = o->op_type; - Because the array/hash is being INTROed, it or its elements - can't directly appear on the RHS: + PERL_ARGS_ASSERT_CK_RFUN; - my (@a) = ($a[0], @a, etc) # NOT POSSIBLE + return refkids(ck_fun(o), type); +} - but can indirectly, e.g.: +OP * +Perl_ck_listiob(pTHX_ OP *o) +{ + OP *kid; - my $r = f(); - my (@a) = @$r; - sub f { @a = 1..3; \@a } + PERL_ARGS_ASSERT_CK_LISTIOB; - So if the RHS isn't safe as defined by (A), we must always - mortalise and bump the ref count of any remaining RHS elements - when assigning to a non-empty LHS aggregate. + kid = cLISTOPo->op_first; + if (!kid) { + o = op_force_list(o); + kid = cLISTOPo->op_first; + } + if (kid->op_type == OP_PUSHMARK) + kid = OpSIBLING(kid); + if (kid && o->op_flags & OPf_STACKED) + kid = OpSIBLING(kid); + else if (kid && !OpHAS_SIBLING(kid)) { /* print HANDLE; */ + if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE + && !kid->op_folded) { + if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) { + no_bareword_filehandle(SvPVX(kSVOP_sv)); + } + o->op_flags |= OPf_STACKED; /* make it a filehandle */ + scalar(kid); + /* replace old const op with new OP_RV2GV parent */ + kid = S_op_sibling_newUNOP(aTHX_ o, cLISTOPo->op_first, + OP_RV2GV, OPf_REF); + kid = OpSIBLING(kid); + } + } - Lexical scalars on the RHS aren't safe if they've been involved in - aliasing, e.g. + if (!kid) + op_append_elem(o->op_type, o, newDEFSVOP()); - use feature 'refaliasing'; + if (o->op_type == OP_PRTF) return modkids(listkids(o), OP_PRTF); + return listkids(o); +} - f(); - \(my $lex) = \$pkg; - my @a = ($lex,3); # equivalent to ($a[0],3) +OP * +Perl_ck_smartmatch(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_SMARTMATCH; + if (0 == (o->op_flags & OPf_SPECIAL)) { + OP *first = cBINOPo->op_first; + OP *second = OpSIBLING(first); - sub f { - @a = (1,2); - \$pkg = \$a[0]; - } + /* Implicitly take a reference to an array or hash */ - Similarly with lexical arrays and hashes on the RHS: + /* remove the original two siblings, then add back the + * (possibly different) first and second sibs. + */ + op_sibling_splice(o, NULL, 1, NULL); + op_sibling_splice(o, NULL, 1, NULL); + first = ref_array_or_hash(first); + second = ref_array_or_hash(second); + op_sibling_splice(o, NULL, 0, second); + op_sibling_splice(o, NULL, 0, first); - f(); - my @b; - my @a = (@b); + /* Implicitly take a reference to a regular expression */ + if (first->op_type == OP_MATCH && !(first->op_flags & OPf_STACKED)) { + OpTYPE_set(first, OP_QR); + } + if (second->op_type == OP_MATCH && !(second->op_flags & OPf_STACKED)) { + OpTYPE_set(second, OP_QR); + } + } - sub f { - @a = (1,2); - \$b[0] = \$a[1]; - \$b[1] = \$a[0]; - } + return o; +} +static OP * +S_maybe_targlex(pTHX_ OP *o) +{ + OP * const kid = cLISTOPo->op_first; + /* has a disposable target? */ + if ((PL_opargs[kid->op_type] & OA_TARGLEX) + && !(kid->op_flags & OPf_STACKED) + /* Cannot steal the second time! */ + && !(kid->op_private & OPpTARGET_MY) + ) + { + OP * const kkid = OpSIBLING(kid); - C: As (B), but in addition the LHS may contain non-intro lexicals, e.g. - my $a; ($a, my $b) = (....); + /* Can just relocate the target. */ + if (kkid && kkid->op_type == OP_PADSV + && (!(kkid->op_private & OPpLVAL_INTRO) + || kkid->op_private & OPpPAD_STATE)) + { + kid->op_targ = kkid->op_targ; + kkid->op_targ = 0; + /* Now we do not need PADSV and SASSIGN. + * Detach kid and free the rest. */ + op_sibling_splice(o, NULL, 1, NULL); + op_free(o); + kid->op_private |= OPpTARGET_MY; /* Used for context settings */ + return kid; + } + } + return o; +} - The difference between (B) and (C) is that it is now physically - possible for the LHS vars to appear on the RHS too, where they - are not reference counted; but in this case, the compile-time - PL_generation sweep will detect such common vars. +OP * +Perl_ck_sassign(pTHX_ OP *o) +{ + OP * const kid = cBINOPo->op_first; - So the rules for (C) differ from (B) in that if common vars are - detected, the runtime "test RC==1" optimisation can no longer be used, - and a full mark and sweep is required + PERL_ARGS_ASSERT_CK_SASSIGN; - D: As (C), but in addition the LHS may contain package vars. + if (OpHAS_SIBLING(kid)) { + OP *kkid = OpSIBLING(kid); + /* For state variable assignment with attributes, kkid is a list op + whose op_last is a padsv. */ + if ((kkid->op_type == OP_PADSV || + (OP_TYPE_IS_OR_WAS(kkid, OP_LIST) && + (kkid = cLISTOPx(kkid)->op_last)->op_type == OP_PADSV + ) + ) + && (kkid->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)) + == (OPpLVAL_INTRO|OPpPAD_STATE)) { + return S_newONCEOP(aTHX_ o, kkid); + } + } + return S_maybe_targlex(aTHX_ o); +} - Since package vars can be aliased without a corresponding refcount - increase, all bets are off. It's only safe if (A). E.g. - my ($x, $y) = (1,2); +OP * +Perl_ck_match(pTHX_ OP *o) +{ + PERL_UNUSED_CONTEXT; + PERL_ARGS_ASSERT_CK_MATCH; - for $x_alias ($x) { - ($x_alias, $y) = (3, $x); # whoops - } + return o; +} - Ditto for LHS aggregate package vars. +OP * +Perl_ck_method(pTHX_ OP *o) +{ + SV *sv, *methsv, *rclass; + const char* method; + char* compatptr; + int utf8; + STRLEN len, nsplit = 0, i; + OP* new_op; + OP * const kid = cUNOPo->op_first; - E: Any other dangerous ops on LHS, e.g. - (f(), $a[0], @$r) = (...); + PERL_ARGS_ASSERT_CK_METHOD; + if (kid->op_type != OP_CONST) return o; - this is similar to (E) in that all bets are off. In addition, it's - impossible to determine at compile time whether the LHS - contains a scalar or an aggregate, e.g. + sv = kSVOP->op_sv; - sub f : lvalue { @a } - (f()) = 1..3; + /* replace ' with :: */ + while ((compatptr = (char *) memchr(SvPVX(sv), '\'', + SvEND(sv) - SvPVX(sv) ))) + { + *compatptr = ':'; + sv_insert(sv, compatptr - SvPVX_const(sv), 0, ":", 1); + } -* --------------------------------------------------------- -*/ + method = SvPVX_const(sv); + len = SvCUR(sv); + utf8 = SvUTF8(sv) ? -1 : 1; + for (i = len - 1; i > 0; --i) if (method[i] == ':') { + nsplit = i+1; + break; + } -/* A set of bit flags returned by S_aassign_scan(). Each flag indicates - * that at least one of the things flagged was seen. - */ + methsv = newSVpvn_share(method+nsplit, utf8*(len - nsplit), 0); -enum { - AAS_MY_SCALAR = 0x001, /* my $scalar */ - AAS_MY_AGG = 0x002, /* aggregate: my @array or my %hash */ - AAS_LEX_SCALAR = 0x004, /* $lexical */ - AAS_LEX_AGG = 0x008, /* @lexical or %lexical aggregate */ - AAS_LEX_SCALAR_COMM = 0x010, /* $lexical seen on both sides */ - AAS_PKG_SCALAR = 0x020, /* $scalar (where $scalar is pkg var) */ - AAS_PKG_AGG = 0x040, /* package @array or %hash aggregate */ - AAS_DANGEROUS = 0x080, /* an op (other than the above) - that's flagged OA_DANGEROUS */ - AAS_SAFE_SCALAR = 0x100, /* produces at least one scalar SV that's - not in any of the categories above */ - AAS_DEFAV = 0x200 /* contains just a single '@_' on RHS */ -}; + if (!nsplit) { /* $proto->method() */ + op_free(o); + return newMETHOP_named(OP_METHOD_NAMED, 0, methsv); + } + if (memEQs(method, nsplit, "SUPER::")) { /* $proto->SUPER::method() */ + op_free(o); + return newMETHOP_named(OP_METHOD_SUPER, 0, methsv); + } + /* $proto->MyClass::method() and $proto->MyClass::SUPER::method() */ + if (nsplit >= 9 && strBEGINs(method+nsplit-9, "::SUPER::")) { + rclass = newSVpvn_share(method, utf8*(nsplit-9), 0); + new_op = newMETHOP_named(OP_METHOD_REDIR_SUPER, 0, methsv); + } else { + rclass = newSVpvn_share(method, utf8*(nsplit-2), 0); + new_op = newMETHOP_named(OP_METHOD_REDIR, 0, methsv); + } +#ifdef USE_ITHREADS + op_relocate_sv(&rclass, &cMETHOPx(new_op)->op_rclass_targ); +#else + cMETHOPx(new_op)->op_rclass_sv = rclass; +#endif + op_free(o); + return new_op; +} -/* helper function for S_aassign_scan(). - * check a PAD-related op for commonality and/or set its generation number. - * Returns a boolean indicating whether its shared */ +OP * +Perl_ck_null(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_NULL; + PERL_UNUSED_CONTEXT; + return o; +} -static bool -S_aassign_padcheck(pTHX_ OP* o, bool rhs) +OP * +Perl_ck_open(pTHX_ OP *o) { - if (PAD_COMPNAME_GEN(o->op_targ) == PERL_INT_MAX) - /* lexical used in aliasing */ - return TRUE; + PERL_ARGS_ASSERT_CK_OPEN; - if (rhs) - return cBOOL(PAD_COMPNAME_GEN(o->op_targ) == (STRLEN)PL_generation); - else - PAD_COMPNAME_GEN_set(o->op_targ, PL_generation); + S_io_hints(aTHX_ o); + { + /* In case of three-arg dup open remove strictness + * from the last arg if it is a bareword. */ + OP * const first = cLISTOPx(o)->op_first; /* The pushmark. */ + OP * const last = cLISTOPx(o)->op_last; /* The bareword. */ + OP *oa; + const char *mode; - return FALSE; + if ((last->op_type == OP_CONST) && /* The bareword. */ + (last->op_private & OPpCONST_BARE) && + (last->op_private & OPpCONST_STRICT) && + (oa = OpSIBLING(first)) && /* The fh. */ + (oa = OpSIBLING(oa)) && /* The mode. */ + (oa->op_type == OP_CONST) && + SvPOK(cSVOPx(oa)->op_sv) && + (mode = SvPVX_const(cSVOPx(oa)->op_sv)) && + mode[0] == '>' && mode[1] == '&' && /* A dup open. */ + (last == OpSIBLING(oa))) /* The bareword. */ + last->op_private &= ~OPpCONST_STRICT; + } + return ck_fun(o); } +OP * +Perl_ck_prototype(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_PROTOTYPE; + if (!(o->op_flags & OPf_KIDS)) { + op_free(o); + return newUNOP(OP_PROTOTYPE, 0, newDEFSVOP()); + } + return o; +} -/* - Helper function for OPpASSIGN_COMMON* detection in rpeep(). - It scans the left or right hand subtree of the aassign op, and returns a - set of flags indicating what sorts of things it found there. - 'rhs' indicates whether we're scanning the LHS or RHS. If the former, we - set PL_generation on lexical vars; if the latter, we see if - PL_generation matches. - 'scalars_p' is a pointer to a counter of the number of scalar SVs seen. - This fn will increment it by the number seen. It's not intended to - be an accurate count (especially as many ops can push a variable - number of SVs onto the stack); rather it's used as to test whether there - can be at most 1 SV pushed; so it's only meanings are "0, 1, many". -*/ - -static int -S_aassign_scan(pTHX_ OP* o, bool rhs, int *scalars_p) +OP * +Perl_ck_refassign(pTHX_ OP *o) { - OP *top_op = o; - OP *effective_top_op = o; - int all_flags = 0; + OP * const right = cLISTOPo->op_first; + OP * const left = OpSIBLING(right); + OP *varop = cUNOPx(cUNOPx(left)->op_first)->op_first; + bool stacked = 0; - while (1) { - bool top = o == effective_top_op; - int flags = 0; - OP* next_kid = NULL; - - /* first, look for a solitary @_ on the RHS */ - if ( rhs - && top - && (o->op_flags & OPf_KIDS) - && OP_TYPE_IS_OR_WAS(o, OP_LIST) - ) { - OP *kid = cUNOPo->op_first; - if ( ( kid->op_type == OP_PUSHMARK - || kid->op_type == OP_PADRANGE) /* ex-pushmark */ - && ((kid = OpSIBLING(kid))) - && !OpHAS_SIBLING(kid) - && kid->op_type == OP_RV2AV - && !(kid->op_flags & OPf_REF) - && !(kid->op_private & (OPpLVAL_INTRO|OPpMAYBE_LVSUB)) - && ((kid->op_flags & OPf_WANT) == OPf_WANT_LIST) - && ((kid = cUNOPx(kid)->op_first)) - && kid->op_type == OP_GV - && cGVOPx_gv(kid) == PL_defgv - ) - flags = AAS_DEFAV; - } + PERL_ARGS_ASSERT_CK_REFASSIGN; + assert (left); + assert (left->op_type == OP_SREFGEN); - switch (o->op_type) { - case OP_GVSV: - (*scalars_p)++; - all_flags |= AAS_PKG_SCALAR; - goto do_next; + o->op_private = 0; + /* we use OPpPAD_STATE in refassign to mean either of those things, + * and the code assumes the two flags occupy the same bit position + * in the various ops below */ + assert(OPpPAD_STATE == OPpOUR_INTRO); + switch (varop->op_type) { case OP_PADAV: + o->op_private |= OPpLVREF_AV; + goto settarg; case OP_PADHV: - (*scalars_p) += 2; - /* if !top, could be e.g. @a[0,1] */ - all_flags |= (top && (o->op_flags & OPf_REF)) - ? ((o->op_private & OPpLVAL_INTRO) - ? AAS_MY_AGG : AAS_LEX_AGG) - : AAS_DANGEROUS; - goto do_next; - + o->op_private |= OPpLVREF_HV; + /* FALLTHROUGH */ case OP_PADSV: - { - int comm = S_aassign_padcheck(aTHX_ o, rhs) - ? AAS_LEX_SCALAR_COMM : 0; - (*scalars_p)++; - all_flags |= (o->op_private & OPpLVAL_INTRO) - ? (AAS_MY_SCALAR|comm) : (AAS_LEX_SCALAR|comm); - goto do_next; - - } + settarg: + o->op_private |= (varop->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)); + o->op_targ = varop->op_targ; + varop->op_targ = 0; + PAD_COMPNAME_GEN_set(o->op_targ, PERL_INT_MAX); + break; case OP_RV2AV: + o->op_private |= OPpLVREF_AV; + goto checkgv; + NOT_REACHED; /* NOTREACHED */ case OP_RV2HV: - (*scalars_p) += 2; - if (cUNOPx(o)->op_first->op_type != OP_GV) - all_flags |= AAS_DANGEROUS; /* @{expr}, %{expr} */ - /* @pkg, %pkg */ - /* if !top, could be e.g. @a[0,1] */ - else if (top && (o->op_flags & OPf_REF)) - all_flags |= AAS_PKG_AGG; - else - all_flags |= AAS_DANGEROUS; - goto do_next; - + o->op_private |= OPpLVREF_HV; + /* FALLTHROUGH */ case OP_RV2SV: - (*scalars_p)++; - if (cUNOPx(o)->op_first->op_type != OP_GV) { - (*scalars_p) += 2; - all_flags |= AAS_DANGEROUS; /* ${expr} */ + checkgv: + o->op_private |= (varop->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)); + if (cUNOPx(varop)->op_first->op_type != OP_GV) goto bad; + detach_and_stack: + /* Point varop to its GV kid, detached. */ + varop = op_sibling_splice(varop, NULL, -1, NULL); + stacked = TRUE; + break; + case OP_RV2CV: { + OP * const kidparent = + OpSIBLING(cUNOPx(cUNOPx(varop)->op_first)->op_first); + OP * const kid = cUNOPx(kidparent)->op_first; + o->op_private |= OPpLVREF_CV; + if (kid->op_type == OP_GV) { + SV *sv = (SV*)cGVOPx_gv(kid); + varop = kidparent; + if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV) { + /* a CVREF here confuses pp_refassign, so make sure + it gets a GV */ + CV *const cv = (CV*)SvRV(sv); + SV *name_sv = newSVhek_mortal(CvNAME_HEK(cv)); + (void)gv_init_sv((GV*)sv, CvSTASH(cv), name_sv, 0); + assert(SvTYPE(sv) == SVt_PVGV); + } + goto detach_and_stack; } - else - all_flags |= AAS_PKG_SCALAR; /* $pkg */ - goto do_next; + if (kid->op_type != OP_PADCV) goto bad; + o->op_targ = kid->op_targ; + kid->op_targ = 0; + break; + } + case OP_AELEM: + case OP_HELEM: + o->op_private |= (varop->op_private & OPpLVAL_INTRO); + o->op_private |= OPpLVREF_ELEM; + op_null(varop); + stacked = TRUE; + /* Detach varop. */ + op_sibling_splice(cUNOPx(left)->op_first, NULL, -1, NULL); + break; + default: + bad: + /* diag_listed_as: Can't modify reference to %s in %s assignment */ + yyerror(Perl_form(aTHX_ "Can't modify reference to %s in scalar " + "assignment", + OP_DESC(varop))); + return o; + } + if (!FEATURE_REFALIASING_IS_ENABLED) + Perl_croak(aTHX_ + "Experimental aliasing via reference not enabled"); + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__REFALIASING), + "Aliasing via reference is experimental"); + if (stacked) { + o->op_flags |= OPf_STACKED; + op_sibling_splice(o, right, 1, varop); + } + else { + o->op_flags &=~ OPf_STACKED; + op_sibling_splice(o, right, 1, NULL); + } + op_free(left); + return o; +} - case OP_SPLIT: - if (o->op_private & OPpSPLIT_ASSIGN) { - /* the assign in @a = split() has been optimised away - * and the @a attached directly to the split op - * Treat the array as appearing on the RHS, i.e. - * ... = (@a = split) - * is treated like - * ... = @a; - */ +OP * +Perl_ck_repeat(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_REPEAT; + + if (cBINOPo->op_first->op_flags & OPf_PARENS) { + OP* kids; + o->op_private |= OPpREPEAT_DOLIST; + kids = op_sibling_splice(o, NULL, 1, NULL); /* detach first kid */ + kids = op_force_list(kids); /* promote it to a list */ + op_sibling_splice(o, NULL, 0, kids); /* and add back */ + } + else + scalar(o); + return o; +} - if (o->op_flags & OPf_STACKED) { - /* @{expr} = split() - the array expression is tacked - * on as an extra child to split - process kid */ - next_kid = cLISTOPo->op_last; - goto do_next; - } +OP * +Perl_ck_require(pTHX_ OP *o) +{ + GV* gv; - /* ... else array is directly attached to split op */ - (*scalars_p) += 2; - all_flags |= (PL_op->op_private & OPpSPLIT_LEX) - ? ((o->op_private & OPpLVAL_INTRO) - ? AAS_MY_AGG : AAS_LEX_AGG) - : AAS_PKG_AGG; - goto do_next; - } - (*scalars_p)++; - /* other args of split can't be returned */ - all_flags |= AAS_SAFE_SCALAR; - goto do_next; + PERL_ARGS_ASSERT_CK_REQUIRE; - case OP_UNDEF: - /* undef on LHS following a var is significant, e.g. - * my $x = 1; - * @a = (($x, undef) = (2 => $x)); - * # @a shoul be (2,1) not (2,2) - * - * undef on RHS counts as a scalar: - * ($x, $y) = (undef, $x); # 2 scalars on RHS: unsafe - */ - if ((!rhs && *scalars_p) || rhs) - (*scalars_p)++; - flags = AAS_SAFE_SCALAR; - break; + if (o->op_flags & OPf_KIDS) { /* Shall we supply missing .pm? */ + SVOP * const kid = cSVOPx(cUNOPo->op_first); + U32 hash; + char *s; + STRLEN len; + if (kid->op_type == OP_CONST) { + SV * const sv = kid->op_sv; + U32 const was_readonly = SvREADONLY(sv); + if (kid->op_private & OPpCONST_BARE) { + const char *end; + HEK *hek; - case OP_PUSHMARK: - case OP_STUB: - /* these are all no-ops; they don't push a potentially common SV - * onto the stack, so they are neither AAS_DANGEROUS nor - * AAS_SAFE_SCALAR */ - goto do_next; + if (was_readonly) { + SvREADONLY_off(sv); + } - case OP_PADRANGE: /* Ignore padrange; checking its siblings is enough */ - break; + if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0); - case OP_NULL: - case OP_LIST: - /* these do nothing, but may have children */ - break; + s = SvPVX(sv); + len = SvCUR(sv); + end = s + len; + /* treat ::foo::bar as foo::bar */ + if (len >= 2 && s[0] == ':' && s[1] == ':') + DIE(aTHX_ "Bareword in require must not start with a double-colon: \"%s\"\n", s); + if (s == end) + DIE(aTHX_ "Bareword in require maps to empty filename"); - default: - if (PL_opargs[o->op_type] & OA_DANGEROUS) { - (*scalars_p) += 2; - flags = AAS_DANGEROUS; - break; + for (; s < end; s++) { + if (*s == ':' && s[1] == ':') { + *s = '/'; + Move(s+2, s+1, end - s - 1, char); + --end; + } + } + SvEND_set(sv, end); + sv_catpvs(sv, ".pm"); + PERL_HASH(hash, SvPVX(sv), SvCUR(sv)); + hek = share_hek(SvPVX(sv), + (SSize_t)SvCUR(sv) * (SvUTF8(sv) ? -1 : 1), + hash); + sv_sethek(sv, hek); + unshare_hek(hek); + SvFLAGS(sv) |= was_readonly; + } + else if (SvPOK(sv) && !SvNIOK(sv) && !SvGMAGICAL(sv) + && !SvVOK(sv)) { + s = SvPV(sv, len); + if (SvREFCNT(sv) > 1) { + kid->op_sv = newSVpvn_share( + s, SvUTF8(sv) ? -(SSize_t)len : (SSize_t)len, 0); + SvREFCNT_dec_NN(sv); + } + else { + HEK *hek; + if (was_readonly) SvREADONLY_off(sv); + PERL_HASH(hash, s, len); + hek = share_hek(s, + SvUTF8(sv) ? -(SSize_t)len : (SSize_t)len, + hash); + sv_sethek(sv, hek); + unshare_hek(hek); + SvFLAGS(sv) |= was_readonly; + } + } } + } - if ( (PL_opargs[o->op_type] & OA_TARGLEX) - && (o->op_private & OPpTARGET_MY)) - { - (*scalars_p)++; - all_flags |= S_aassign_padcheck(aTHX_ o, rhs) - ? AAS_LEX_SCALAR_COMM : AAS_LEX_SCALAR; - goto do_next; + if (!(o->op_flags & OPf_SPECIAL) /* Wasn't written as CORE::require */ + /* handle override, if any */ + && (gv = gv_override("require", 7))) { + OP *kid, *newop; + if (o->op_flags & OPf_KIDS) { + kid = cUNOPo->op_first; + op_sibling_splice(o, NULL, -1, NULL); } - - /* if its an unrecognised, non-dangerous op, assume that it - * is the cause of at least one safe scalar */ - (*scalars_p)++; - flags = AAS_SAFE_SCALAR; - break; + else { + kid = newDEFSVOP(); + } + op_free(o); + newop = S_new_entersubop(aTHX_ gv, kid); + return newop; } - all_flags |= flags; - - /* by default, process all kids next - * XXX this assumes that all other ops are "transparent" - i.e. that - * they can return some of their children. While this true for e.g. - * sort and grep, it's not true for e.g. map. We really need a - * 'transparent' flag added to regen/opcodes - */ - if (o->op_flags & OPf_KIDS) { - next_kid = cUNOPo->op_first; - /* these ops do nothing but may have children; but their - * children should also be treated as top-level */ - if ( o == effective_top_op - && (o->op_type == OP_NULL || o->op_type == OP_LIST) - ) - effective_top_op = next_kid; - } + return ck_fun(o); +} +OP * +Perl_ck_return(pTHX_ OP *o) +{ + OP *kid; - /* If next_kid is set, someone in the code above wanted us to process - * that kid and all its remaining siblings. Otherwise, work our way - * back up the tree */ - do_next: - while (!next_kid) { - if (o == top_op) - return all_flags; /* at top; no parents/siblings to try */ - if (OpHAS_SIBLING(o)) { - next_kid = o->op_sibparent; - if (o == effective_top_op) - effective_top_op = next_kid; - } - else - if (o == effective_top_op) - effective_top_op = o->op_sibparent; - o = o->op_sibparent; /* try parent's next sibling */ + PERL_ARGS_ASSERT_CK_RETURN; + kid = OpSIBLING(cLISTOPo->op_first); + if (PL_compcv && CvLVALUE(PL_compcv)) { + for (; kid; kid = OpSIBLING(kid)) + op_lvalue(kid, OP_LEAVESUBLV); } - o = next_kid; - } /* while */ + return o; } +OP * +Perl_ck_select(pTHX_ OP *o) +{ + OP* kid; -/* Check for in place reverse and sort assignments like "@a = reverse @a" - and modify the optree to make them work inplace */ + PERL_ARGS_ASSERT_CK_SELECT; -STATIC void -S_inplace_aassign(pTHX_ OP *o) { + if (o->op_flags & OPf_KIDS) { + kid = OpSIBLING(cLISTOPo->op_first); /* get past pushmark */ + if (kid && OpHAS_SIBLING(kid)) { + OpTYPE_set(o, OP_SSELECT); + o = ck_fun(o); + return fold_constants(op_integerize(op_std_init(o))); + } + } + o = ck_fun(o); + kid = OpSIBLING(cLISTOPo->op_first); /* get past pushmark */ + if (kid && kid->op_type == OP_RV2GV) + kid->op_private &= ~HINT_STRICT_REFS; + return o; +} - OP *modop, *modop_pushmark; - OP *oright; - OP *oleft, *oleft_pushmark; +OP * +Perl_ck_shift(pTHX_ OP *o) +{ + const I32 type = o->op_type; - PERL_ARGS_ASSERT_INPLACE_AASSIGN; + PERL_ARGS_ASSERT_CK_SHIFT; - assert((o->op_flags & OPf_WANT) == OPf_WANT_VOID); + if (!(o->op_flags & OPf_KIDS)) { + OP *argop; - assert(cUNOPo->op_first->op_type == OP_NULL); - modop_pushmark = cUNOPx(cUNOPo->op_first)->op_first; - assert(modop_pushmark->op_type == OP_PUSHMARK); - modop = OpSIBLING(modop_pushmark); + if (!CvUNIQUE(PL_compcv)) { + o->op_flags |= OPf_SPECIAL; + return o; + } - if (modop->op_type != OP_SORT && modop->op_type != OP_REVERSE) - return; + argop = newUNOP(OP_RV2AV, 0, scalar(newGVOP(OP_GV, 0, PL_argvgv))); + op_free(o); + return newUNOP(type, 0, scalar(argop)); + } + return scalar(ck_fun(o)); +} - /* no other operation except sort/reverse */ - if (OpHAS_SIBLING(modop)) - return; +OP * +Perl_ck_sort(pTHX_ OP *o) +{ + OP *firstkid; + OP *kid; + U8 stacked; - assert(cUNOPx(modop)->op_first->op_type == OP_PUSHMARK); - if (!(oright = OpSIBLING(cUNOPx(modop)->op_first))) return; + PERL_ARGS_ASSERT_CK_SORT; - if (modop->op_flags & OPf_STACKED) { - /* skip sort subroutine/block */ - assert(oright->op_type == OP_NULL); - oright = OpSIBLING(oright); - } + if (o->op_flags & OPf_STACKED) + simplify_sort(o); + firstkid = OpSIBLING(cLISTOPo->op_first); /* get past pushmark */ - assert(OpSIBLING(cUNOPo->op_first)->op_type == OP_NULL); - oleft_pushmark = cUNOPx(OpSIBLING(cUNOPo->op_first))->op_first; - assert(oleft_pushmark->op_type == OP_PUSHMARK); - oleft = OpSIBLING(oleft_pushmark); + if (!firstkid) + return too_few_arguments_pv(o,OP_DESC(o), 0); - /* Check the lhs is an array */ - if (!oleft || - (oleft->op_type != OP_RV2AV && oleft->op_type != OP_PADAV) - || OpHAS_SIBLING(oleft) - || (oleft->op_private & OPpLVAL_INTRO) - ) - return; + if ((stacked = o->op_flags & OPf_STACKED)) { /* may have been cleared */ + OP *kid = cUNOPx(firstkid)->op_first; /* get past null */ - /* Only one thing on the rhs */ - if (OpHAS_SIBLING(oright)) - return; + /* if the first arg is a code block, process it and mark sort as + * OPf_SPECIAL */ + if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) { + LINKLIST(kid); + if (kid->op_type == OP_LEAVE) + op_null(kid); /* wipe out leave */ + /* Prevent execution from escaping out of the sort block. */ + kid->op_next = 0; + + /* provide scalar context for comparison function/block */ + kid = scalar(firstkid); + kid->op_next = kid; + o->op_flags |= OPf_SPECIAL; + } + else if (kid->op_type == OP_CONST + && kid->op_private & OPpCONST_BARE) { + char tmpbuf[256]; + STRLEN len; + PADOFFSET off; + const char * const name = SvPV(kSVOP_sv, len); + *tmpbuf = '&'; + assert (len < 256); + Copy(name, tmpbuf+1, len, char); + off = pad_findmy_pvn(tmpbuf, len+1, 0); + if (off != NOT_IN_PAD) { + if (PAD_COMPNAME_FLAGS_isOUR(off)) { + SV * const fq = + newSVhek(HvNAME_HEK(PAD_COMPNAME_OURSTASH(off))); + sv_catpvs(fq, "::"); + sv_catsv(fq, kSVOP_sv); + SvREFCNT_dec_NN(kSVOP_sv); + kSVOP->op_sv = fq; + } + else { + /* replace the const op with the pad op */ + op_sibling_splice(firstkid, NULL, 1, + newPADxVOP(OP_PADCV, 0, off)); + op_free(kid); + } + } + } - /* check the array is the same on both sides */ - if (oleft->op_type == OP_RV2AV) { - if (oright->op_type != OP_RV2AV - || !cUNOPx(oright)->op_first - || cUNOPx(oright)->op_first->op_type != OP_GV - || cUNOPx(oleft )->op_first->op_type != OP_GV - || cGVOPx_gv(cUNOPx(oleft)->op_first) != - cGVOPx_gv(cUNOPx(oright)->op_first) - ) - return; + firstkid = OpSIBLING(firstkid); } - else if (oright->op_type != OP_PADAV - || oright->op_targ != oleft->op_targ - ) - return; - - /* This actually is an inplace assignment */ - modop->op_private |= OPpSORT_INPLACE; - - /* transfer MODishness etc from LHS arg to RHS arg */ - oright->op_flags = oleft->op_flags; + for (kid = firstkid; kid; kid = OpSIBLING(kid)) { + /* provide list context for arguments */ + list(kid); + if (stacked) + op_lvalue(kid, OP_GREPSTART); + } - /* remove the aassign op and the lhs */ - op_null(o); - op_null(oleft_pushmark); - if (oleft->op_type == OP_RV2AV && cUNOPx(oleft)->op_first) - op_null(cUNOPx(oleft)->op_first); - op_null(oleft); + return o; } - - -/* S_maybe_multideref(): given an op_next chain of ops beginning at 'start' - * that potentially represent a series of one or more aggregate derefs - * (such as $a->[1]{$key}), examine the chain, and if appropriate, convert - * the whole chain to a single OP_MULTIDEREF op (maybe with a few - * additional ops left in too). - * - * The caller will have already verified that the first few ops in the - * chain following 'start' indicate a multideref candidate, and will have - * set 'orig_o' to the point further on in the chain where the first index - * expression (if any) begins. 'orig_action' specifies what type of - * beginning has already been determined by the ops between start..orig_o - * (e.g. $lex_ary[], $pkg_ary->{}, expr->[], etc). - * - * 'hints' contains any hints flags that need adding (currently just - * OPpHINT_STRICT_REFS) as found in any rv2av/hv skipped by the caller. +/* for sort { X } ..., where X is one of + * $a <=> $b, $b <=> $a, $a cmp $b, $b cmp $a + * elide the second child of the sort (the one containing X), + * and set these flags as appropriate + OPpSORT_NUMERIC; + OPpSORT_INTEGER; + OPpSORT_DESCEND; + * Also, check and warn on lexical $a, $b. */ STATIC void -S_maybe_multideref(pTHX_ OP *start, OP *orig_o, UV orig_action, U8 hints) +S_simplify_sort(pTHX_ OP *o) { - int pass; - UNOP_AUX_item *arg_buf = NULL; - bool reset_start_targ = FALSE; /* start->op_targ needs zeroing */ - int index_skip = -1; /* don't output index arg on this action */ - - /* similar to regex compiling, do two passes; the first pass - * determines whether the op chain is convertible and calculates the - * buffer size; the second pass populates the buffer and makes any - * changes necessary to ops (such as moving consts to the pad on - * threaded builds). - * - * NB: for things like Coverity, note that both passes take the same - * path through the logic tree (except for 'if (pass)' bits), since - * both passes are following the same op_next chain; and in - * particular, if it would return early on the second pass, it would - * already have returned early on the first pass. - */ - for (pass = 0; pass < 2; pass++) { - OP *o = orig_o; - UV action = orig_action; - OP *first_elem_op = NULL; /* first seen aelem/helem */ - OP *top_op = NULL; /* highest [ah]elem/exists/del/rv2[ah]v */ - int action_count = 0; /* number of actions seen so far */ - int action_ix = 0; /* action_count % (actions per IV) */ - bool next_is_hash = FALSE; /* is the next lookup to be a hash? */ - bool is_last = FALSE; /* no more derefs to follow */ - bool maybe_aelemfast = FALSE; /* we can replace with aelemfast? */ - UV action_word = 0; /* all actions so far */ - UNOP_AUX_item *arg = arg_buf; - UNOP_AUX_item *action_ptr = arg_buf; - - arg++; /* reserve slot for first action word */ - - switch (action) { - case MDEREF_HV_gvsv_vivify_rv2hv_helem: - case MDEREF_HV_gvhv_helem: - next_is_hash = TRUE; - /* FALLTHROUGH */ - case MDEREF_AV_gvsv_vivify_rv2av_aelem: - case MDEREF_AV_gvav_aelem: - if (pass) { -#ifdef USE_ITHREADS - arg->pad_offset = cPADOPx(start)->op_padix; - /* stop it being swiped when nulled */ - cPADOPx(start)->op_padix = 0; -#else - arg->sv = cSVOPx(start)->op_sv; - cSVOPx(start)->op_sv = NULL; -#endif - } - arg++; - break; + OP *kid = OpSIBLING(cLISTOPo->op_first); /* get past pushmark */ + OP *k; + int descending; + GV *gv; + const char *gvname; + bool have_scopeop; - case MDEREF_HV_padhv_helem: - case MDEREF_HV_padsv_vivify_rv2hv_helem: - next_is_hash = TRUE; - /* FALLTHROUGH */ - case MDEREF_AV_padav_aelem: - case MDEREF_AV_padsv_vivify_rv2av_aelem: - if (pass) { - arg->pad_offset = start->op_targ; - /* we skip setting op_targ = 0 for now, since the intact - * OP_PADXV is needed by S_check_hash_fields_and_hekify */ - reset_start_targ = TRUE; - } - arg++; - break; + PERL_ARGS_ASSERT_SIMPLIFY_SORT; - case MDEREF_HV_pop_rv2hv_helem: - next_is_hash = TRUE; - /* FALLTHROUGH */ - case MDEREF_AV_pop_rv2av_aelem: + kid = kUNOP->op_first; /* get past null */ + if (!(have_scopeop = kid->op_type == OP_SCOPE) + && kid->op_type != OP_LEAVE) + return; + kid = kLISTOP->op_last; /* get past scope */ + switch(kid->op_type) { + case OP_NCMP: + case OP_I_NCMP: + case OP_SCMP: + if (!have_scopeop) goto padkids; break; - default: - NOT_REACHED; /* NOTREACHED */ return; - } - - while (!is_last) { - /* look for another (rv2av/hv; get index; - * aelem/helem/exists/delele) sequence */ + } + k = kid; /* remember this node*/ + if (kBINOP->op_first->op_type != OP_RV2SV + || kBINOP->op_last ->op_type != OP_RV2SV) + { + /* + Warn about my($a) or my($b) in a sort block, *if* $a or $b is + then used in a comparison. This catches most, but not + all cases. For instance, it catches + sort { my($a); $a <=> $b } + but not + sort { my($a); $a < $b ? -1 : $a == $b ? 0 : 1; } + (although why you'd do that is anyone's guess). + */ - OP *kid; - bool is_deref; - bool ok; - UV index_type = MDEREF_INDEX_none; - - if (action_count) { - /* if this is not the first lookup, consume the rv2av/hv */ - - /* for N levels of aggregate lookup, we normally expect - * that the first N-1 [ah]elem ops will be flagged as - * /DEREF (so they autovivifiy if necessary), and the last - * lookup op not to be. - * For other things (like @{$h{k1}{k2}}) extra scope or - * leave ops can appear, so abandon the effort in that - * case */ - if (o->op_type != OP_RV2AV && o->op_type != OP_RV2HV) - return; + padkids: + if (!ckWARN(WARN_SYNTAX)) return; + kid = kBINOP->op_first; + do { + if (kid->op_type == OP_PADSV) { + PADNAME * const name = PAD_COMPNAME(kid->op_targ); + if (PadnameLEN(name) == 2 && *PadnamePV(name) == '$' + && ( PadnamePV(name)[1] == 'a' + || PadnamePV(name)[1] == 'b' )) + /* diag_listed_as: "my %s" used in sort comparison */ + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), + "\"%s %s\" used in sort comparison", + PadnameIsSTATE(name) + ? "state" + : "my", + PadnamePV(name)); + } + } while ((kid = OpSIBLING(kid))); + return; + } + kid = kBINOP->op_first; /* get past cmp */ + if (kUNOP->op_first->op_type != OP_GV) + return; + kid = kUNOP->op_first; /* get past rv2sv */ + gv = kGVOP_gv; + if (GvSTASH(gv) != PL_curstash) + return; + gvname = GvNAME(gv); + if (*gvname == 'a' && gvname[1] == '\0') + descending = 0; + else if (*gvname == 'b' && gvname[1] == '\0') + descending = 1; + else + return; - /* rv2av or rv2hv sKR/1 */ + kid = k; /* back to cmp */ + /* already checked above that it is rv2sv */ + kid = kBINOP->op_last; /* down to 2nd arg */ + if (kUNOP->op_first->op_type != OP_GV) + return; + kid = kUNOP->op_first; /* get past rv2sv */ + gv = kGVOP_gv; + if (GvSTASH(gv) != PL_curstash) + return; + gvname = GvNAME(gv); + if ( descending + ? !(*gvname == 'a' && gvname[1] == '\0') + : !(*gvname == 'b' && gvname[1] == '\0')) + return; + o->op_flags &= ~(OPf_STACKED | OPf_SPECIAL); + if (descending) + o->op_private |= OPpSORT_DESCEND; + if (k->op_type == OP_NCMP) + o->op_private |= OPpSORT_NUMERIC; + if (k->op_type == OP_I_NCMP) + o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER; + kid = OpSIBLING(cLISTOPo->op_first); + /* cut out and delete old block (second sibling) */ + op_sibling_splice(o, cLISTOPo->op_first, 1, NULL); + op_free(kid); +} - ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS - |OPf_REF|OPf_MOD|OPf_SPECIAL))); - if (o->op_flags != (OPf_WANT_SCALAR|OPf_KIDS|OPf_REF)) - return; +OP * +Perl_ck_split(pTHX_ OP *o) +{ + OP *kid; + OP *sibs; - /* at this point, we wouldn't expect any of these - * possible private flags: - * OPpMAYBE_LVSUB, OPpOUR_INTRO, OPpLVAL_INTRO - * OPpTRUEBOOL, OPpMAYBE_TRUEBOOL (rv2hv only) - */ - ASSUME(!(o->op_private & - ~(OPpHINT_STRICT_REFS|OPpARG1_MASK|OPpSLICEWARNING))); + PERL_ARGS_ASSERT_CK_SPLIT; - hints = (o->op_private & OPpHINT_STRICT_REFS); + assert(o->op_type == OP_LIST); - /* make sure the type of the previous /DEREF matches the - * type of the next lookup */ - ASSUME(o->op_type == (next_is_hash ? OP_RV2HV : OP_RV2AV)); - top_op = o; + if (o->op_flags & OPf_STACKED) + return no_fh_allowed(o); - action = next_is_hash - ? MDEREF_HV_vivify_rv2hv_helem - : MDEREF_AV_vivify_rv2av_aelem; - o = o->op_next; - } + kid = cLISTOPo->op_first; + /* delete leading NULL node, then add a CONST if no other nodes */ + assert(kid->op_type == OP_NULL); + op_sibling_splice(o, NULL, 1, + OpHAS_SIBLING(kid) ? NULL : newSVOP(OP_CONST, 0, newSVpvs(" "))); + op_free(kid); + kid = cLISTOPo->op_first; - /* if this is the second pass, and we're at the depth where - * previously we encountered a non-simple index expression, - * stop processing the index at this point */ - if (action_count != index_skip) { + if (kid->op_type != OP_MATCH || kid->op_flags & OPf_STACKED) { + /* remove match expression, and replace with new optree with + * a match op at its head */ + op_sibling_splice(o, NULL, 1, NULL); + /* pmruntime will handle split " " behavior with flag==2 */ + kid = pmruntime(newPMOP(OP_MATCH, 0), kid, NULL, 2, 0); + op_sibling_splice(o, NULL, 0, kid); + } - /* look for one or more simple ops that return an array - * index or hash key */ + assert(kid->op_type == OP_MATCH || kid->op_type == OP_SPLIT); - switch (o->op_type) { - case OP_PADSV: - /* it may be a lexical var index */ - ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_PARENS - |OPf_REF|OPf_MOD|OPf_SPECIAL))); - ASSUME(!(o->op_private & - ~(OPpPAD_STATE|OPpDEREF|OPpLVAL_INTRO))); - - if ( OP_GIMME(o,0) == G_SCALAR - && !(o->op_flags & (OPf_REF|OPf_MOD)) - && o->op_private == 0) - { - if (pass) - arg->pad_offset = o->op_targ; - arg++; - index_type = MDEREF_INDEX_padsv; - o = o->op_next; - } - break; + if (kPMOP->op_pmflags & PMf_GLOBAL) { + Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), + "Use of /g modifier is meaningless in split"); + } - case OP_CONST: - if (next_is_hash) { - /* it's a constant hash index */ - if (!(SvFLAGS(cSVOPo_sv) & (SVf_IOK|SVf_NOK|SVf_POK))) - /* "use constant foo => FOO; $h{+foo}" for - * some weird FOO, can leave you with constants - * that aren't simple strings. It's not worth - * the extra hassle for those edge cases */ - break; + /* eliminate the split op, and move the match op (plus any children) + * into its place, then convert the match op into a split op. i.e. + * + * SPLIT MATCH SPLIT(ex-MATCH) + * | | | + * MATCH - A - B - C => R - A - B - C => R - A - B - C + * | | | + * R X - Y X - Y + * | + * X - Y + * + * (R, if it exists, will be a regcomp op) + */ - { - UNOP *rop = NULL; - OP * helem_op = o->op_next; + op_sibling_splice(o, NULL, 1, NULL); /* detach match op from o */ + sibs = op_sibling_splice(o, NULL, -1, NULL); /* detach any other sibs */ + op_sibling_splice(kid, cLISTOPx(kid)->op_last, 0, sibs); /* and reattach */ + OpTYPE_set(kid, OP_SPLIT); + kid->op_flags = (o->op_flags | (kid->op_flags & OPf_KIDS)); + kid->op_private = o->op_private; + op_free(o); + o = kid; + kid = sibs; /* kid is now the string arg of the split */ - ASSUME( helem_op->op_type == OP_HELEM - || helem_op->op_type == OP_NULL - || pass == 0); - if (helem_op->op_type == OP_HELEM) { - rop = (UNOP*)(((BINOP*)helem_op)->op_first); - if ( helem_op->op_private & OPpLVAL_INTRO - || rop->op_type != OP_RV2HV - ) - rop = NULL; - } - /* on first pass just check; on second pass - * hekify */ - S_check_hash_fields_and_hekify(aTHX_ rop, cSVOPo, - pass); - } + if (!kid) { + kid = newDEFSVOP(); + op_append_elem(OP_SPLIT, o, kid); + } + scalar(kid); - if (pass) { -#ifdef USE_ITHREADS - /* Relocate sv to the pad for thread safety */ - op_relocate_sv(&cSVOPo->op_sv, &o->op_targ); - arg->pad_offset = o->op_targ; - o->op_targ = 0; -#else - arg->sv = cSVOPx_sv(o); -#endif - } - } - else { - /* it's a constant array index */ - IV iv; - SV *ix_sv = cSVOPo->op_sv; - if (!SvIOK(ix_sv)) - break; - iv = SvIV(ix_sv); - - if ( action_count == 0 - && iv >= -128 - && iv <= 127 - && ( action == MDEREF_AV_padav_aelem - || action == MDEREF_AV_gvav_aelem) - ) - maybe_aelemfast = TRUE; + kid = OpSIBLING(kid); + if (!kid) { + kid = newSVOP(OP_CONST, 0, newSViv(0)); + op_append_elem(OP_SPLIT, o, kid); + o->op_private |= OPpSPLIT_IMPLIM; + } + scalar(kid); - if (pass) { - arg->iv = iv; - SvREFCNT_dec_NN(cSVOPo->op_sv); - } - } - if (pass) - /* we've taken ownership of the SV */ - cSVOPo->op_sv = NULL; - arg++; - index_type = MDEREF_INDEX_const; - o = o->op_next; - break; + if (OpHAS_SIBLING(kid)) + return too_many_arguments_pv(o,OP_DESC(o), 0); - case OP_GV: - /* it may be a package var index */ + return o; +} - ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_PARENS|OPf_SPECIAL))); - ASSUME(!(o->op_private & ~(OPpEARLY_CV))); - if ( (o->op_flags & ~(OPf_PARENS|OPf_SPECIAL)) != OPf_WANT_SCALAR - || o->op_private != 0 - ) - break; +OP * +Perl_ck_stringify(pTHX_ OP *o) +{ + OP * const kid = OpSIBLING(cUNOPo->op_first); + PERL_ARGS_ASSERT_CK_STRINGIFY; + if (( kid->op_type == OP_JOIN || kid->op_type == OP_QUOTEMETA + || kid->op_type == OP_LC || kid->op_type == OP_LCFIRST + || kid->op_type == OP_UC || kid->op_type == OP_UCFIRST) + && !OpHAS_SIBLING(kid)) /* syntax errs can leave extra children */ + { + op_sibling_splice(o, cUNOPo->op_first, -1, NULL); + op_free(o); + return kid; + } + return ck_fun(o); +} - kid = o->op_next; - if (kid->op_type != OP_RV2SV) - break; +OP * +Perl_ck_join(pTHX_ OP *o) +{ + OP * const kid = OpSIBLING(cLISTOPo->op_first); - ASSUME(!(kid->op_flags & - ~(OPf_WANT|OPf_KIDS|OPf_MOD|OPf_REF - |OPf_SPECIAL|OPf_PARENS))); - ASSUME(!(kid->op_private & - ~(OPpARG1_MASK - |OPpHINT_STRICT_REFS|OPpOUR_INTRO - |OPpDEREF|OPpLVAL_INTRO))); - if( (kid->op_flags &~ OPf_PARENS) - != (OPf_WANT_SCALAR|OPf_KIDS) - || (kid->op_private & ~(OPpARG1_MASK|HINT_STRICT_REFS)) - ) - break; + PERL_ARGS_ASSERT_CK_JOIN; - if (pass) { -#ifdef USE_ITHREADS - arg->pad_offset = cPADOPx(o)->op_padix; - /* stop it being swiped when nulled */ - cPADOPx(o)->op_padix = 0; -#else - arg->sv = cSVOPx(o)->op_sv; - cSVOPo->op_sv = NULL; -#endif - } - arg++; - index_type = MDEREF_INDEX_gvsv; - o = kid->op_next; - break; + if (kid && kid->op_type == OP_MATCH) { + if (ckWARN(WARN_SYNTAX)) { + const REGEXP *re = PM_GETRE(kPMOP); + const SV *msg = re + ? newSVpvn_flags( RX_PRECOMP_const(re), RX_PRELEN(re), + SVs_TEMP | ( RX_UTF8(re) ? SVf_UTF8 : 0 ) ) + : newSVpvs_flags( "STRING", SVs_TEMP ); + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), + "/%" SVf "/ should probably be written as \"%" SVf "\"", + SVfARG(msg), SVfARG(msg)); + } + } + if (kid + && (kid->op_type == OP_CONST /* an innocent, unsuspicious separator */ + || (kid->op_type == OP_PADSV && !(kid->op_private & OPpLVAL_INTRO)) + || ( kid->op_type==OP_RV2SV && kUNOP->op_first->op_type == OP_GV + && !(kid->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO))))) + { + const OP * const bairn = OpSIBLING(kid); /* the list */ + if (bairn && !OpHAS_SIBLING(bairn) /* single-item list */ + && OP_GIMME(bairn,0) == G_SCALAR) + { + OP * const ret = op_convert_list(OP_STRINGIFY, OPf_FOLDED, + op_sibling_splice(o, kid, 1, NULL)); + op_free(o); + return ret; + } + } - } /* switch */ - } /* action_count != index_skip */ + return ck_fun(o); +} - action |= index_type; +/* +=for apidoc rv2cv_op_cv +Examines an op, which is expected to identify a subroutine at runtime, +and attempts to determine at compile time which subroutine it identifies. +This is normally used during Perl compilation to determine whether +a prototype can be applied to a function call. C is the op +being considered, normally an C op. A pointer to the identified +subroutine is returned, if it could be determined statically, and a null +pointer is returned if it was not possible to determine statically. - /* at this point we have either: - * * detected what looks like a simple index expression, - * and expect the next op to be an [ah]elem, or - * an nulled [ah]elem followed by a delete or exists; - * * found a more complex expression, so something other - * than the above follows. - */ +Currently, the subroutine can be identified statically if the RV that the +C is to operate on is provided by a suitable C or C op. +A C op is suitable if the GV's CV slot is populated. A C op is +suitable if the constant value must be an RV pointing to a CV. Details of +this process may change in future versions of Perl. If the C op +has the C flag set then no attempt is made to identify +the subroutine statically: this flag is used to suppress compile-time +magic on a subroutine call, forcing it to use default runtime behaviour. - /* possibly an optimised away [ah]elem (where op_next is - * exists or delete) */ - if (o->op_type == OP_NULL) - o = o->op_next; - - /* at this point we're looking for an OP_AELEM, OP_HELEM, - * OP_EXISTS or OP_DELETE */ - - /* if a custom array/hash access checker is in scope, - * abandon optimisation attempt */ - if ( (o->op_type == OP_AELEM || o->op_type == OP_HELEM) - && PL_check[o->op_type] != Perl_ck_null) - return; - /* similarly for customised exists and delete */ - if ( (o->op_type == OP_EXISTS) - && PL_check[o->op_type] != Perl_ck_exists) - return; - if ( (o->op_type == OP_DELETE) - && PL_check[o->op_type] != Perl_ck_delete) - return; +If C has the bit C set, then the handling +of a GV reference is modified. If a GV was examined and its CV slot was +found to be empty, then the C op has the C flag set. +If the op is not optimised away, and the CV slot is later populated with +a subroutine having a prototype, that flag eventually triggers the warning +"called too early to check prototype". - if ( o->op_type != OP_AELEM - || (o->op_private & - (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF|OPpMAYBE_LVSUB)) - ) - maybe_aelemfast = FALSE; +If C has the bit C set, then instead +of returning a pointer to the subroutine it returns a pointer to the +GV giving the most appropriate name for the subroutine in this context. +Normally this is just the C of the subroutine, but for an anonymous +(C) subroutine that is referenced through a GV it will be the +referencing GV. The resulting C is cast to C to be returned. +A null pointer is returned as usual if there is no statically-determinable +subroutine. - /* look for aelem/helem/exists/delete. If it's not the last elem - * lookup, it *must* have OPpDEREF_AV/HV, but not many other - * flags; if it's the last, then it mustn't have - * OPpDEREF_AV/HV, but may have lots of other flags, like - * OPpLVAL_INTRO etc - */ +=for apidoc Amnh||OPpEARLY_CV +=for apidoc Amnh||OPpENTERSUB_AMPER +=for apidoc Amnh||RV2CVOPCV_MARK_EARLY +=for apidoc Amnh||RV2CVOPCV_RETURN_NAME_GV - if ( index_type == MDEREF_INDEX_none - || ( o->op_type != OP_AELEM && o->op_type != OP_HELEM - && o->op_type != OP_EXISTS && o->op_type != OP_DELETE) - ) - ok = FALSE; - else { - /* we have aelem/helem/exists/delete with valid simple index */ +=cut +*/ - is_deref = (o->op_type == OP_AELEM || o->op_type == OP_HELEM) - && ( (o->op_private & OPpDEREF) == OPpDEREF_AV - || (o->op_private & OPpDEREF) == OPpDEREF_HV); - - /* This doesn't make much sense but is legal: - * @{ local $x[0][0] } = 1 - * Since scope exit will undo the autovivification, - * don't bother in the first place. The OP_LEAVE - * assertion is in case there are other cases of both - * OPpLVAL_INTRO and OPpDEREF which don't include a scope - * exit that would undo the local - in which case this - * block of code would need rethinking. - */ - if (is_deref && (o->op_private & OPpLVAL_INTRO)) { -#ifdef DEBUGGING - OP *n = o->op_next; - while (n && ( n->op_type == OP_NULL - || n->op_type == OP_LIST - || n->op_type == OP_SCALAR)) - n = n->op_next; - assert(n && n->op_type == OP_LEAVE); -#endif - o->op_private &= ~OPpDEREF; - is_deref = FALSE; - } +/* shared by toke.c:yylex */ +CV * +Perl_find_lexical_cv(pTHX_ PADOFFSET off) +{ + const PADNAME *name = PAD_COMPNAME(off); + CV *compcv = PL_compcv; + while (PadnameOUTER(name)) { + compcv = CvOUTSIDE(compcv); + if (LIKELY(PARENT_PAD_INDEX(name))) { + name = PadlistNAMESARRAY(CvPADLIST(compcv)) + [off = PARENT_PAD_INDEX(name)]; + } + else { + /* In an eval() in an inner scope like a function, the + intermediate pad in the sub might not be populated with the + sub. So search harder. - if (is_deref) { - ASSUME(!(o->op_flags & - ~(OPf_WANT|OPf_KIDS|OPf_MOD|OPf_PARENS))); - ASSUME(!(o->op_private & ~(OPpARG2_MASK|OPpDEREF))); - - ok = (o->op_flags &~ OPf_PARENS) - == (OPf_WANT_SCALAR|OPf_KIDS|OPf_MOD) - && !(o->op_private & ~(OPpDEREF|OPpARG2_MASK)); - } - else if (o->op_type == OP_EXISTS) { - ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS - |OPf_REF|OPf_MOD|OPf_SPECIAL))); - ASSUME(!(o->op_private & ~(OPpARG1_MASK|OPpEXISTS_SUB))); - ok = !(o->op_private & ~OPpARG1_MASK); - } - else if (o->op_type == OP_DELETE) { - ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS - |OPf_REF|OPf_MOD|OPf_SPECIAL))); - ASSUME(!(o->op_private & - ~(OPpARG1_MASK|OPpSLICE|OPpLVAL_INTRO))); - /* don't handle slices or 'local delete'; the latter - * is fairly rare, and has a complex runtime */ - ok = !(o->op_private & ~OPpARG1_MASK); - if (OP_TYPE_IS_OR_WAS(cUNOPo->op_first, OP_AELEM)) - /* skip handling run-tome error */ - ok = (ok && cBOOL(o->op_flags & OPf_SPECIAL)); - } - else { - ASSUME(o->op_type == OP_AELEM || o->op_type == OP_HELEM); - ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_MOD - |OPf_PARENS|OPf_REF|OPf_SPECIAL))); - ASSUME(!(o->op_private & ~(OPpARG2_MASK|OPpMAYBE_LVSUB - |OPpLVAL_DEFER|OPpDEREF|OPpLVAL_INTRO))); - ok = (o->op_private & OPpDEREF) != OPpDEREF_SV; + It is possible we won't find the name in this + particular scope, but that's fine, if we don't we'll + find it in some outer scope. Finding it here will let us + go back to following the PARENT_PAD_INDEX() chain. + */ + const PADNAMELIST * const names = PadlistNAMES(CvPADLIST(compcv)); + PADNAME * const * const name_p = PadnamelistARRAY(names); + int offset; + for (offset = PadnamelistMAXNAMED(names); offset > 0; offset--) { + const PADNAME * const thisname = name_p[offset]; + /* The pv is copied from the outer PADNAME to the + inner PADNAMEs so we don't need to compare the + string contents + */ + if (thisname && PadnameLEN(thisname) == PadnameLEN(name) + && PadnamePV(thisname) == PadnamePV(name)) { + name = thisname; + break; } } + } + } + assert(!PadnameIsOUR(name)); + if (!PadnameIsSTATE(name) && PadnamePROTOCV(name)) { + return PadnamePROTOCV(name); + } + return (CV *)AvARRAY(PadlistARRAY(CvPADLIST(compcv))[1])[off]; +} - if (ok) { - if (!first_elem_op) - first_elem_op = o; - top_op = o; - if (is_deref) { - next_is_hash = cBOOL((o->op_private & OPpDEREF) == OPpDEREF_HV); - o = o->op_next; - } - else { - is_last = TRUE; - action |= MDEREF_FLAG_last; +CV * +Perl_rv2cv_op_cv(pTHX_ OP *cvop, U32 flags) +{ + OP *rvop; + CV *cv; + GV *gv; + PERL_ARGS_ASSERT_RV2CV_OP_CV; + if (flags & ~RV2CVOPCV_FLAG_MASK) + Perl_croak(aTHX_ "panic: rv2cv_op_cv bad flags %x", (unsigned)flags); + if (cvop->op_type != OP_RV2CV) + return NULL; + if (cvop->op_private & OPpENTERSUB_AMPER) + return NULL; + if (!(cvop->op_flags & OPf_KIDS)) + return NULL; + rvop = cUNOPx(cvop)->op_first; + switch (rvop->op_type) { + case OP_GV: { + gv = cGVOPx_gv(rvop); + if (!isGV(gv)) { + if (SvROK(gv) && SvTYPE(SvRV(gv)) == SVt_PVCV) { + cv = MUTABLE_CV(SvRV(gv)); + gv = NULL; + break; } + if (flags & RV2CVOPCV_RETURN_STUB) + return (CV *)gv; + else return NULL; } - else { - /* at this point we have something that started - * promisingly enough (with rv2av or whatever), but failed - * to find a simple index followed by an - * aelem/helem/exists/delete. If this is the first action, - * give up; but if we've already seen at least one - * aelem/helem, then keep them and add a new action with - * MDEREF_INDEX_none, which causes it to do the vivify - * from the end of the previous lookup, and do the deref, - * but stop at that point. So $a[0][expr] will do one - * av_fetch, vivify and deref, then continue executing at - * expr */ - if (!action_count) - return; - is_last = TRUE; - index_skip = action_count; - action |= MDEREF_FLAG_last; - if (index_type != MDEREF_INDEX_none) - arg--; - } - - action_word |= (action << (action_ix * MDEREF_SHIFT)); - action_ix++; - action_count++; - /* if there's no space for the next action, reserve a new slot - * for it *before* we start adding args for that action */ - if ((action_ix + 1) * MDEREF_SHIFT > UVSIZE*8) { - if (pass) - action_ptr->uv = action_word; - action_word = 0; - action_ptr = arg; - arg++; - action_ix = 0; - } - } /* while !is_last */ - - /* success! */ - - if (!action_ix) - /* slot reserved for next action word not now needed */ - arg--; - else if (pass) - action_ptr->uv = action_word; - - if (pass) { - OP *mderef; - OP *p, *q; - - mderef = newUNOP_AUX(OP_MULTIDEREF, 0, NULL, arg_buf); - if (index_skip == -1) { - mderef->op_flags = o->op_flags - & (OPf_WANT|OPf_MOD|(next_is_hash ? OPf_SPECIAL : 0)); - if (o->op_type == OP_EXISTS) - mderef->op_private = OPpMULTIDEREF_EXISTS; - else if (o->op_type == OP_DELETE) - mderef->op_private = OPpMULTIDEREF_DELETE; - else - mderef->op_private = o->op_private - & (OPpMAYBE_LVSUB|OPpLVAL_DEFER|OPpLVAL_INTRO); + cv = GvCVu(gv); + if (!cv) { + if (flags & RV2CVOPCV_MARK_EARLY) + rvop->op_private |= OPpEARLY_CV; + return NULL; } - /* accumulate strictness from every level (although I don't think - * they can actually vary) */ - mderef->op_private |= hints; - - /* integrate the new multideref op into the optree and the - * op_next chain. - * - * In general an op like aelem or helem has two child - * sub-trees: the aggregate expression (a_expr) and the - * index expression (i_expr): - * - * aelem - * | - * a_expr - i_expr - * - * The a_expr returns an AV or HV, while the i-expr returns an - * index. In general a multideref replaces most or all of a - * multi-level tree, e.g. - * - * exists - * | - * ex-aelem - * | - * rv2av - i_expr1 - * | - * helem - * | - * rv2hv - i_expr2 - * | - * aelem - * | - * a_expr - i_expr3 - * - * With multideref, all the i_exprs will be simple vars or - * constants, except that i_expr1 may be arbitrary in the case - * of MDEREF_INDEX_none. - * - * The bottom-most a_expr will be either: - * 1) a simple var (so padXv or gv+rv2Xv); - * 2) a simple scalar var dereferenced (e.g. $r->[0]): - * so a simple var with an extra rv2Xv; - * 3) or an arbitrary expression. - * - * 'start', the first op in the execution chain, will point to - * 1),2): the padXv or gv op; - * 3): the rv2Xv which forms the last op in the a_expr - * execution chain, and the top-most op in the a_expr - * subtree. - * - * For all cases, the 'start' node is no longer required, - * but we can't free it since one or more external nodes - * may point to it. E.g. consider - * $h{foo} = $a ? $b : $c - * Here, both the op_next and op_other branches of the - * cond_expr point to the gv[*h] of the hash expression, so - * we can't free the 'start' op. - * - * For expr->[...], we need to save the subtree containing the - * expression; for the other cases, we just need to save the - * start node. - * So in all cases, we null the start op and keep it around by - * making it the child of the multideref op; for the expr-> - * case, the expr will be a subtree of the start node. - * - * So in the simple 1,2 case the optree above changes to - * - * ex-exists - * | - * multideref - * | - * ex-gv (or ex-padxv) - * - * with the op_next chain being - * - * -> ex-gv -> multideref -> op-following-ex-exists -> - * - * In the 3 case, we have - * - * ex-exists - * | - * multideref - * | - * ex-rv2xv - * | - * rest-of-a_expr - * subtree - * - * and - * - * -> rest-of-a_expr subtree -> - * ex-rv2xv -> multideref -> op-following-ex-exists -> - * - * - * Where the last i_expr is non-simple (i.e. MDEREF_INDEX_none, - * e.g. $a[0]{foo}[$x+1], the next rv2xv is nulled and the - * multideref attached as the child, e.g. - * - * exists - * | - * ex-aelem - * | - * ex-rv2av - i_expr1 - * | - * multideref - * | - * ex-whatever - * - */ - - /* if we free this op, don't free the pad entry */ - if (reset_start_targ) - start->op_targ = 0; - + } break; + case OP_CONST: { + SV *rv = cSVOPx_sv(rvop); + if (!SvROK(rv)) + return NULL; + cv = (CV*)SvRV(rv); + gv = NULL; + } break; + case OP_PADCV: { + cv = find_lexical_cv(rvop->op_targ); + gv = NULL; + } break; + default: { + return NULL; + } NOT_REACHED; /* NOTREACHED */ + } + if (SvTYPE((SV*)cv) != SVt_PVCV) + return NULL; + if (flags & RV2CVOPCV_RETURN_NAME_GV) { + if ((!CvANON(cv) && !CvLEXICAL(cv)) || !gv) + gv = CvGV(cv); + return (CV*)gv; + } + else if (flags & RV2CVOPCV_MAYBE_NAME_GV) { + if (CvLEXICAL(cv) || CvNAMED(cv)) + return NULL; + if (!CvANON(cv) || !gv) + gv = CvGV(cv); + return (CV*)gv; - /* Cut the bit we need to save out of the tree and attach to - * the multideref op, then free the rest of the tree */ - - /* find parent of node to be detached (for use by splice) */ - p = first_elem_op; - if ( orig_action == MDEREF_AV_pop_rv2av_aelem - || orig_action == MDEREF_HV_pop_rv2hv_helem) - { - /* there is an arbitrary expression preceding us, e.g. - * expr->[..]? so we need to save the 'expr' subtree */ - if (p->op_type == OP_EXISTS || p->op_type == OP_DELETE) - p = cUNOPx(p)->op_first; - ASSUME( start->op_type == OP_RV2AV - || start->op_type == OP_RV2HV); - } - else { - /* either a padXv or rv2Xv+gv, maybe with an ex-Xelem - * above for exists/delete. */ - while ( (p->op_flags & OPf_KIDS) - && cUNOPx(p)->op_first != start - ) - p = cUNOPx(p)->op_first; - } - ASSUME(cUNOPx(p)->op_first == start); + } else { + return cv; + } +} - /* detach from main tree, and re-attach under the multideref */ - op_sibling_splice(mderef, NULL, 0, - op_sibling_splice(p, NULL, 1, NULL)); - op_null(start); +/* +=for apidoc ck_entersub_args_list - start->op_next = mderef; +Performs the default fixup of the arguments part of an C +op tree. This consists of applying list context to each of the +argument ops. This is the standard treatment used on a call marked +with C<&>, or a method call, or a call through a subroutine reference, +or any other call where the callee can't be identified at compile time, +or a call where the callee has no prototype. - mderef->op_next = index_skip == -1 ? o->op_next : o; +=cut +*/ - /* excise and free the original tree, and replace with - * the multideref op */ - p = op_sibling_splice(top_op, NULL, -1, mderef); - while (p) { - q = OpSIBLING(p); - op_free(p); - p = q; - } - op_null(top_op); - } - else { - Size_t size = arg - arg_buf; +OP * +Perl_ck_entersub_args_list(pTHX_ OP *entersubop) +{ + OP *aop; - if (maybe_aelemfast && action_count == 1) - return; + PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_LIST; - arg_buf = (UNOP_AUX_item*)PerlMemShared_malloc( - sizeof(UNOP_AUX_item) * (size + 1)); - /* for dumping etc: store the length in a hidden first slot; - * we set the op_aux pointer to the second slot */ - arg_buf->uv = size; - arg_buf++; - } - } /* for (pass = ...) */ + aop = cUNOPx(entersubop)->op_first; + if (!OpHAS_SIBLING(aop)) + aop = cUNOPx(aop)->op_first; + for (aop = OpSIBLING(aop); OpHAS_SIBLING(aop); aop = OpSIBLING(aop)) { + /* skip the extra attributes->import() call implicitly added in + * something like foo(my $x : bar) + */ + if ( aop->op_type == OP_ENTERSUB + && (aop->op_flags & OPf_WANT) == OPf_WANT_VOID + ) + continue; + list(aop); + op_lvalue(aop, OP_ENTERSUB); + } + return entersubop; } -/* See if the ops following o are such that o will always be executed in - * boolean context: that is, the SV which o pushes onto the stack will - * only ever be consumed by later ops via SvTRUE(sv) or similar. - * If so, set a suitable private flag on o. Normally this will be - * bool_flag; but see below why maybe_flag is needed too. - * - * Typically the two flags you pass will be the generic OPpTRUEBOOL and - * OPpMAYBE_TRUEBOOL, buts it's possible that for some ops those bits may - * already be taken, so you'll have to give that op two different flags. - * - * More explanation of 'maybe_flag' and 'safe_and' parameters. - * The binary logical ops &&, ||, // (plus 'if' and 'unless' which use - * those underlying ops) short-circuit, which means that rather than - * necessarily returning a truth value, they may return the LH argument, - * which may not be boolean. For example in $x = (keys %h || -1), keys - * should return a key count rather than a boolean, even though its - * sort-of being used in boolean context. - * - * So we only consider such logical ops to provide boolean context to - * their LH argument if they themselves are in void or boolean context. - * However, sometimes the context isn't known until run-time. In this - * case the op is marked with the maybe_flag flag it. - * - * Consider the following. - * - * sub f { ....; if (%h) { .... } } - * - * This is actually compiled as - * - * sub f { ....; %h && do { .... } } - * - * Here we won't know until runtime whether the final statement (and hence - * the &&) is in void context and so is safe to return a boolean value. - * So mark o with maybe_flag rather than the bool_flag. - * Note that there is cost associated with determining context at runtime - * (e.g. a call to block_gimme()), so it may not be worth setting (at - * compile time) and testing (at runtime) maybe_flag if the scalar verses - * boolean costs savings are marginal. - * - * However, we can do slightly better with && (compared to || and //): - * this op only returns its LH argument when that argument is false. In - * this case, as long as the op promises to return a false value which is - * valid in both boolean and scalar contexts, we can mark an op consumed - * by && with bool_flag rather than maybe_flag. - * For example as long as pp_padhv and pp_rv2hv return &PL_sv_zero rather - * than &PL_sv_no for a false result in boolean context, then it's safe. An - * op which promises to handle this case is indicated by setting safe_and - * to true. - */ +/* +=for apidoc ck_entersub_args_proto -static void -S_check_for_bool_cxt(OP*o, bool safe_and, U8 bool_flag, U8 maybe_flag) -{ - OP *lop; - U8 flag = 0; +Performs the fixup of the arguments part of an C op tree +based on a subroutine prototype. This makes various modifications to +the argument ops, from applying context up to inserting C ops, +and checking the number and syntactic types of arguments, as directed by +the prototype. This is the standard treatment used on a subroutine call, +not marked with C<&>, where the callee can be identified at compile time +and has a prototype. - assert((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR); +C supplies the subroutine prototype to be applied to the call. +It may be a normal defined scalar, of which the string value will be used. +Alternatively, for convenience, it may be a subroutine object (a C +that has been cast to C) which has a prototype. The prototype +supplied, in whichever form, does not need to match the actual callee +referenced by the op tree. - /* OPpTARGET_MY and boolean context probably don't mix well. - * If someone finds a valid use case, maybe add an extra flag to this - * function which indicates its safe to do so for this op? */ - assert(!( (PL_opargs[o->op_type] & OA_TARGLEX) - && (o->op_private & OPpTARGET_MY))); +If the argument ops disagree with the prototype, for example by having +an unacceptable number of arguments, a valid op tree is returned anyway. +The error is reflected in the parser state, normally resulting in a single +exception at the top level of parsing which covers all the compilation +errors that occurred. In the error message, the callee is referred to +by the name defined by the C parameter. - lop = o->op_next; +=cut +*/ - while (lop) { - switch (lop->op_type) { - case OP_NULL: - case OP_SCALAR: - break; +OP * +Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv) +{ + STRLEN proto_len; + const char *proto, *proto_end; + OP *aop, *prev, *cvop, *parent; + int optional = 0; + I32 arg = 0; + I32 contextclass = 0; + const char *e = NULL; + PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO; + if (SvTYPE(protosv) == SVt_PVCV ? !SvPOK(protosv) : !SvOK(protosv)) + Perl_croak(aTHX_ "panic: ck_entersub_args_proto CV with no proto, " + "flags=%lx", (unsigned long) SvFLAGS(protosv)); + if (SvTYPE(protosv) == SVt_PVCV) + proto = CvPROTO(protosv), proto_len = CvPROTOLEN(protosv); + else proto = SvPV(protosv, proto_len); + proto = S_strip_spaces(aTHX_ proto, &proto_len); + proto_end = proto + proto_len; + parent = entersubop; + aop = cUNOPx(entersubop)->op_first; + if (!OpHAS_SIBLING(aop)) { + parent = aop; + aop = cUNOPx(aop)->op_first; + } + prev = aop; + aop = OpSIBLING(aop); + for (cvop = aop; OpHAS_SIBLING(cvop); cvop = OpSIBLING(cvop)) ; + while (aop != cvop) { + OP* o3 = aop; - /* these two consume the stack argument in the scalar case, - * and treat it as a boolean in the non linenumber case */ - case OP_FLIP: - case OP_FLOP: - if ( ((lop->op_flags & OPf_WANT) == OPf_WANT_LIST) - || (lop->op_private & OPpFLIP_LINENUM)) - { - lop = NULL; + if (proto >= proto_end) + { + SV * const namesv = cv_name((CV *)namegv, NULL, 0); + yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf, + SVfARG(namesv)), SvUTF8(namesv)); + return entersubop; + } + + switch (*proto) { + case ';': + optional = 1; + proto++; + continue; + case '_': + /* _ must be at the end */ + if (proto[1] && !memCHRs(";@%", proto[1])) + goto oops; + /* FALLTHROUGH */ + case '$': + proto++; + arg++; + scalar(aop); break; - } - /* FALLTHROUGH */ - /* these never leave the original value on the stack */ - case OP_NOT: - case OP_XOR: - case OP_COND_EXPR: - case OP_GREPWHILE: - flag = bool_flag; - lop = NULL; - break; + case '%': + case '@': + list(aop); + arg++; + break; + case '&': + proto++; + arg++; + if ( o3->op_type != OP_UNDEF + && o3->op_type != OP_ANONCODE + && (o3->op_type != OP_SREFGEN + || ( cUNOPx(cUNOPx(o3)->op_first)->op_first->op_type + != OP_ANONCODE + && cUNOPx(cUNOPx(o3)->op_first)->op_first->op_type + != OP_RV2CV))) + bad_type_gv(arg, namegv, o3, + arg == 1 ? "block or sub {}" : "sub {}"); + break; + case '*': + /* '*' allows any scalar type, including bareword */ + proto++; + arg++; + if (o3->op_type == OP_RV2GV) + goto wrapref; /* autoconvert GLOB -> GLOBref */ + else if (o3->op_type == OP_CONST) + o3->op_private &= ~OPpCONST_STRICT; + scalar(aop); + break; + case '+': + proto++; + arg++; + if (o3->op_type == OP_RV2AV || + o3->op_type == OP_PADAV || + o3->op_type == OP_RV2HV || + o3->op_type == OP_PADHV + ) { + goto wrapref; + } + scalar(aop); + break; + case '[': case ']': + goto oops; - /* OR DOR and AND evaluate their arg as a boolean, but then may - * leave the original scalar value on the stack when following the - * op_next route. If not in void context, we need to ensure - * that whatever follows consumes the arg only in boolean context - * too. - */ - case OP_AND: - if (safe_and) { - flag = bool_flag; - lop = NULL; + case '\\': + proto++; + arg++; + again: + switch (*proto++) { + case '[': + if (contextclass++ == 0) { + e = (char *) memchr(proto, ']', proto_end - proto); + if (!e || e == proto) + goto oops; + } + else + goto oops; + goto again; + + case ']': + if (contextclass) { + const char *p = proto; + const char *const end = proto; + contextclass = 0; + while (*--p != '[') + /* \[$] accepts any scalar lvalue */ + if (*p == '$' + && Perl_op_lvalue_flags(aTHX_ + scalar(o3), + OP_READ, /* not entersub */ + OP_LVALUE_NO_CROAK + )) goto wrapref; + bad_type_gv(arg, namegv, o3, + Perl_form(aTHX_ "one of %.*s",(int)(end - p), p)); + } else + goto oops; + break; + case '*': + if (o3->op_type == OP_RV2GV) + goto wrapref; + if (!contextclass) + bad_type_gv(arg, namegv, o3, "symbol"); + break; + case '&': + if (o3->op_type == OP_ENTERSUB + && !(o3->op_flags & OPf_STACKED)) + goto wrapref; + if (!contextclass) + bad_type_gv(arg, namegv, o3, "subroutine"); + break; + case '$': + if (o3->op_type == OP_RV2SV || + o3->op_type == OP_PADSV || + o3->op_type == OP_HELEM || + o3->op_type == OP_AELEM) + goto wrapref; + if (!contextclass) { + /* \$ accepts any scalar lvalue */ + if (Perl_op_lvalue_flags(aTHX_ + scalar(o3), + OP_READ, /* not entersub */ + OP_LVALUE_NO_CROAK + )) goto wrapref; + bad_type_gv(arg, namegv, o3, "scalar"); + } + break; + case '@': + if (o3->op_type == OP_RV2AV || + o3->op_type == OP_PADAV) + { + o3->op_flags &=~ OPf_PARENS; + goto wrapref; + } + if (!contextclass) + bad_type_gv(arg, namegv, o3, "array"); + break; + case '%': + if (o3->op_type == OP_RV2HV || + o3->op_type == OP_PADHV) + { + o3->op_flags &=~ OPf_PARENS; + goto wrapref; + } + if (!contextclass) + bad_type_gv(arg, namegv, o3, "hash"); + break; + wrapref: + aop = S_op_sibling_newUNOP(aTHX_ parent, prev, + OP_REFGEN, 0); + if (contextclass && e) { + proto = e + 1; + contextclass = 0; + } + break; + default: goto oops; + } + if (contextclass) + goto again; break; + case ' ': + proto++; + continue; + default: + oops: { + Perl_croak(aTHX_ "Malformed prototype for %" SVf ": %" SVf, + SVfARG(cv_name((CV *)namegv, NULL, 0)), + SVfARG(protosv)); } - /* FALLTHROUGH */ - case OP_OR: - case OP_DOR: - if ((lop->op_flags & OPf_WANT) == OPf_WANT_VOID) { - flag = bool_flag; - lop = NULL; - } - else if (!(lop->op_flags & OPf_WANT)) { - /* unknown context - decide at runtime */ - flag = maybe_flag; - lop = NULL; - } - break; - - default: - lop = NULL; - break; } - if (lop) - lop = lop->op_next; + op_lvalue(aop, OP_ENTERSUB); + prev = aop; + aop = OpSIBLING(aop); } - - o->op_private |= flag; + if (aop == cvop && *proto == '_') { + /* generate an access to $_ */ + op_sibling_splice(parent, prev, 0, newDEFSVOP()); + } + if (!optional && proto_end > proto && + (*proto != '@' && *proto != '%' && *proto != ';' && *proto != '_')) + { + SV * const namesv = cv_name((CV *)namegv, NULL, 0); + yyerror_pv(Perl_form(aTHX_ "Not enough arguments for %" SVf, + SVfARG(namesv)), SvUTF8(namesv)); + } + return entersubop; } +/* +=for apidoc ck_entersub_args_proto_or_list +Performs the fixup of the arguments part of an C op tree either +based on a subroutine prototype or using default list-context processing. +This is the standard treatment used on a subroutine call, not marked +with C<&>, where the callee can be identified at compile time. -/* mechanism for deferring recursion in rpeep() */ - -#define MAX_DEFERRED 4 - -#define DEFER(o) \ - STMT_START { \ - if (defer_ix == (MAX_DEFERRED-1)) { \ - OP **defer = defer_queue[defer_base]; \ - CALL_RPEEP(*defer); \ - S_prune_chain_head(defer); \ - defer_base = (defer_base + 1) % MAX_DEFERRED; \ - defer_ix--; \ - } \ - defer_queue[(defer_base + ++defer_ix) % MAX_DEFERRED] = &(o); \ - } STMT_END - -#define IS_AND_OP(o) (o->op_type == OP_AND) -#define IS_OR_OP(o) (o->op_type == OP_OR) +C supplies the subroutine prototype to be applied to the call, +or indicates that there is no prototype. It may be a normal scalar, +in which case if it is defined then the string value will be used +as a prototype, and if it is undefined then there is no prototype. +Alternatively, for convenience, it may be a subroutine object (a C +that has been cast to C), of which the prototype will be used if it +has one. The prototype (or lack thereof) supplied, in whichever form, +does not need to match the actual callee referenced by the op tree. +If the argument ops disagree with the prototype, for example by having +an unacceptable number of arguments, a valid op tree is returned anyway. +The error is reflected in the parser state, normally resulting in a single +exception at the top level of parsing which covers all the compilation +errors that occurred. In the error message, the callee is referred to +by the name defined by the C parameter. -/* A peephole optimizer. We visit the ops in the order they're to execute. - * See the comments at the top of this file for more details about when - * peep() is called */ +=cut +*/ -void -Perl_rpeep(pTHX_ OP *o) +OP * +Perl_ck_entersub_args_proto_or_list(pTHX_ OP *entersubop, + GV *namegv, SV *protosv) { - OP* oldop = NULL; - OP* oldoldop = NULL; - OP** defer_queue[MAX_DEFERRED]; /* small queue of deferred branches */ - int defer_base = 0; - int defer_ix = -1; + PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO_OR_LIST; + if (SvTYPE(protosv) == SVt_PVCV ? SvPOK(protosv) : SvOK(protosv)) + return ck_entersub_args_proto(entersubop, namegv, protosv); + else + return ck_entersub_args_list(entersubop); +} - if (!o || o->op_opt) - return; +OP * +Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv) +{ + IV cvflags = SvIVX(protosv); + int opnum = cvflags & 0xffff; + OP *aop = cUNOPx(entersubop)->op_first; - assert(o->op_type != OP_FREED); + PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_CORE; - ENTER; - SAVEOP(); - SAVEVPTR(PL_curcop); - for (;; o = o->op_next) { - if (o && o->op_opt) - o = NULL; - if (!o) { - while (defer_ix >= 0) { - OP **defer = - defer_queue[(defer_base + defer_ix--) % MAX_DEFERRED]; - CALL_RPEEP(*defer); - S_prune_chain_head(defer); - } - break; + if (!opnum) { + OP *cvop; + if (!OpHAS_SIBLING(aop)) + aop = cUNOPx(aop)->op_first; + aop = OpSIBLING(aop); + for (cvop = aop; OpSIBLING(cvop); cvop = OpSIBLING(cvop)) ; + if (aop != cvop) { + SV *namesv = cv_name((CV *)namegv, NULL, CV_NAME_NOTQUAL); + yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf, + SVfARG(namesv)), SvUTF8(namesv)); } - redo: - - /* oldoldop -> oldop -> o should be a chain of 3 adjacent ops */ - assert(!oldoldop || oldoldop->op_next == oldop); - assert(!oldop || oldop->op_next == o); - - /* By default, this op has now been optimised. A couple of cases below - clear this again. */ - o->op_opt = 1; - PL_op = o; - - /* look for a series of 1 or more aggregate derefs, e.g. - * $a[1]{foo}[$i]{$k} - * and replace with a single OP_MULTIDEREF op. - * Each index must be either a const, or a simple variable, - * - * First, look for likely combinations of starting ops, - * corresponding to (global and lexical variants of) - * $a[...] $h{...} - * $r->[...] $r->{...} - * (preceding expression)->[...] - * (preceding expression)->{...} - * and if so, call maybe_multideref() to do a full inspection - * of the op chain and if appropriate, replace with an - * OP_MULTIDEREF - */ - { - UV action; - OP *o2 = o; - U8 hints = 0; - - switch (o2->op_type) { - case OP_GV: - /* $pkg[..] : gv[*pkg] - * $pkg->[...]: gv[*pkg]; rv2sv sKM/DREFAV */ - - /* Fail if there are new op flag combinations that we're - * not aware of, rather than: - * * silently failing to optimise, or - * * silently optimising the flag away. - * If this ASSUME starts failing, examine what new flag - * has been added to the op, and decide whether the - * optimisation should still occur with that flag, then - * update the code accordingly. This applies to all the - * other ASSUMEs in the block of code too. - */ - ASSUME(!(o2->op_flags & - ~(OPf_WANT|OPf_MOD|OPf_PARENS|OPf_SPECIAL))); - ASSUME(!(o2->op_private & ~OPpEARLY_CV)); - - o2 = o2->op_next; - - if (o2->op_type == OP_RV2AV) { - action = MDEREF_AV_gvav_aelem; - goto do_deref; - } - - if (o2->op_type == OP_RV2HV) { - action = MDEREF_HV_gvhv_helem; - goto do_deref; - } - - if (o2->op_type != OP_RV2SV) - break; - - /* at this point we've seen gv,rv2sv, so the only valid - * construct left is $pkg->[] or $pkg->{} */ + op_free(entersubop); + switch(cvflags >> 16) { + case 'F': return newSVOP(OP_CONST, 0, + newSVpv(CopFILE(PL_curcop),0)); + case 'L': return newSVOP( + OP_CONST, 0, + Perl_newSVpvf(aTHX_ + "%" LINE_Tf, CopLINE(PL_curcop) + ) + ); + case 'P': return newSVOP(OP_CONST, 0, + (PL_curstash + ? newSVhek(HvNAME_HEK(PL_curstash)) + : &PL_sv_undef + ) + ); + } + NOT_REACHED; /* NOTREACHED */ + } + else { + OP *prev, *cvop, *first, *parent; + U32 flags = 0; - ASSUME(!(o2->op_flags & OPf_STACKED)); - if ((o2->op_flags & (OPf_WANT|OPf_REF|OPf_MOD|OPf_SPECIAL)) - != (OPf_WANT_SCALAR|OPf_MOD)) - break; + parent = entersubop; + if (!OpHAS_SIBLING(aop)) { + parent = aop; + aop = cUNOPx(aop)->op_first; + } - ASSUME(!(o2->op_private & ~(OPpARG1_MASK|HINT_STRICT_REFS - |OPpOUR_INTRO|OPpDEREF|OPpLVAL_INTRO))); - if (o2->op_private & (OPpOUR_INTRO|OPpLVAL_INTRO)) - break; - if ( (o2->op_private & OPpDEREF) != OPpDEREF_AV - && (o2->op_private & OPpDEREF) != OPpDEREF_HV) - break; + first = prev = aop; + aop = OpSIBLING(aop); + /* find last sibling */ + for (cvop = aop; + OpHAS_SIBLING(cvop); + prev = cvop, cvop = OpSIBLING(cvop)) + ; + if (!(cvop->op_private & OPpENTERSUB_NOPAREN) + /* Usually, OPf_SPECIAL on an op with no args means that it had + * parens, but these have their own meaning for that flag: */ + && opnum != OP_VALUES && opnum != OP_KEYS && opnum != OP_EACH + && opnum != OP_DELETE && opnum != OP_EXISTS) + flags |= OPf_SPECIAL; + /* excise cvop from end of sibling chain */ + op_sibling_splice(parent, prev, 1, NULL); + op_free(cvop); + if (aop == cvop) aop = NULL; - o2 = o2->op_next; - if (o2->op_type == OP_RV2AV) { - action = MDEREF_AV_gvsv_vivify_rv2av_aelem; - goto do_deref; - } - if (o2->op_type == OP_RV2HV) { - action = MDEREF_HV_gvsv_vivify_rv2hv_helem; - goto do_deref; - } - break; + /* detach remaining siblings from the first sibling, then + * dispose of original optree */ - case OP_PADSV: - /* $lex->[...]: padsv[$lex] sM/DREFAV */ + if (aop) + op_sibling_splice(parent, first, -1, NULL); + op_free(entersubop); - ASSUME(!(o2->op_flags & - ~(OPf_WANT|OPf_PARENS|OPf_REF|OPf_MOD|OPf_SPECIAL))); - if ((o2->op_flags & - (OPf_WANT|OPf_REF|OPf_MOD|OPf_SPECIAL)) - != (OPf_WANT_SCALAR|OPf_MOD)) - break; + if (cvflags == (OP_ENTEREVAL | (1<<16))) + flags |= OPpEVAL_BYTES <<8; - ASSUME(!(o2->op_private & - ~(OPpPAD_STATE|OPpDEREF|OPpLVAL_INTRO))); - /* skip if state or intro, or not a deref */ - if ( o2->op_private != OPpDEREF_AV - && o2->op_private != OPpDEREF_HV) - break; + switch (PL_opargs[opnum] & OA_CLASS_MASK) { + case OA_UNOP: + case OA_BASEOP_OR_UNOP: + case OA_FILESTATOP: + if (!aop) + return newOP(opnum,flags); /* zero args */ + if (aop == prev) + return newUNOP(opnum,flags,aop); /* one arg */ + /* too many args */ + /* FALLTHROUGH */ + case OA_BASEOP: + if (aop) { + SV *namesv; + OP *nextop; - o2 = o2->op_next; - if (o2->op_type == OP_RV2AV) { - action = MDEREF_AV_padsv_vivify_rv2av_aelem; - goto do_deref; - } - if (o2->op_type == OP_RV2HV) { - action = MDEREF_HV_padsv_vivify_rv2hv_helem; - goto do_deref; + namesv = cv_name((CV *)namegv, NULL, CV_NAME_NOTQUAL); + yyerror_pv(Perl_form(aTHX_ "Too many arguments for %" SVf, + SVfARG(namesv)), SvUTF8(namesv)); + while (aop) { + nextop = OpSIBLING(aop); + op_free(aop); + aop = nextop; } - break; - - case OP_PADAV: - case OP_PADHV: - /* $lex[..]: padav[@lex:1,2] sR * - * or $lex{..}: padhv[%lex:1,2] sR */ - ASSUME(!(o2->op_flags & ~(OPf_WANT|OPf_MOD|OPf_PARENS| - OPf_REF|OPf_SPECIAL))); - if ((o2->op_flags & - (OPf_WANT|OPf_REF|OPf_MOD|OPf_SPECIAL)) - != (OPf_WANT_SCALAR|OPf_REF)) - break; - if (o2->op_flags != (OPf_WANT_SCALAR|OPf_REF)) - break; - /* OPf_PARENS isn't currently used in this case; - * if that changes, let us know! */ - ASSUME(!(o2->op_flags & OPf_PARENS)); - - /* at this point, we wouldn't expect any of the remaining - * possible private flags: - * OPpPAD_STATE, OPpLVAL_INTRO, OPpTRUEBOOL, - * OPpMAYBE_TRUEBOOL, OPpMAYBE_LVSUB - * - * OPpSLICEWARNING shouldn't affect runtime - */ - ASSUME(!(o2->op_private & ~(OPpSLICEWARNING))); - action = o2->op_type == OP_PADAV - ? MDEREF_AV_padav_aelem - : MDEREF_HV_padhv_helem; - o2 = o2->op_next; - S_maybe_multideref(aTHX_ o, o2, action, 0); - break; + } + return opnum == OP_RUNCV + ? newSVOP(OP_RUNCV, 0, &PL_sv_undef) + : newOP(opnum,0); + default: + return op_convert_list(opnum,0,aop); + } + } + NOT_REACHED; /* NOTREACHED */ + return entersubop; +} +/* +=for apidoc cv_get_call_checker_flags - case OP_RV2AV: - case OP_RV2HV: - action = o2->op_type == OP_RV2AV - ? MDEREF_AV_pop_rv2av_aelem - : MDEREF_HV_pop_rv2hv_helem; - /* FALLTHROUGH */ - do_deref: - /* (expr)->[...]: rv2av sKR/1; - * (expr)->{...}: rv2hv sKR/1; */ - - ASSUME(o2->op_type == OP_RV2AV || o2->op_type == OP_RV2HV); - - ASSUME(!(o2->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS - |OPf_REF|OPf_MOD|OPf_STACKED|OPf_SPECIAL))); - if (o2->op_flags != (OPf_WANT_SCALAR|OPf_KIDS|OPf_REF)) - break; +Retrieves the function that will be used to fix up a call to C. +Specifically, the function is applied to an C op tree for a +subroutine call, not marked with C<&>, where the callee can be identified +at compile time as C. - /* at this point, we wouldn't expect any of these - * possible private flags: - * OPpMAYBE_LVSUB, OPpLVAL_INTRO - * OPpTRUEBOOL, OPpMAYBE_TRUEBOOL, (rv2hv only) - */ - ASSUME(!(o2->op_private & - ~(OPpHINT_STRICT_REFS|OPpARG1_MASK|OPpSLICEWARNING - |OPpOUR_INTRO))); - hints |= (o2->op_private & OPpHINT_STRICT_REFS); +The C-level function pointer is returned in C<*ckfun_p>, an SV argument +for it is returned in C<*ckobj_p>, and control flags are returned in +C<*ckflags_p>. The function is intended to be called in this manner: - o2 = o2->op_next; + entersubop = (*ckfun_p)(aTHX_ entersubop, namegv, (*ckobj_p)); - S_maybe_multideref(aTHX_ o, o2, action, hints); - break; +In this call, C is a pointer to the C op, +which may be replaced by the check function, and C supplies +the name that should be used by the check function to refer +to the callee of the C op if it needs to emit any diagnostics. +It is permitted to apply the check function in non-standard situations, +such as to a call to a different subroutine or to a method call. - default: - break; - } - } +C may not actually be a GV. If the C +bit is clear in C<*ckflags_p>, it is permitted to pass a CV or other SV +instead, anything that can be used as the first argument to L. +If the C bit is set in C<*ckflags_p> then the +check function requires C to be a genuine GV. +By default, the check function is +L, +the SV parameter is C itself, and the C +flag is clear. This implements standard prototype processing. It can +be changed, for a particular subroutine, by L. - switch (o->op_type) { - case OP_DBSTATE: - PL_curcop = ((COP*)o); /* for warnings */ - break; - case OP_NEXTSTATE: - PL_curcop = ((COP*)o); /* for warnings */ +If the C bit is set in C then it +indicates that the caller only knows about the genuine GV version of +C, and accordingly the corresponding bit will always be set in +C<*ckflags_p>, regardless of the check function's recorded requirements. +If the C bit is clear in C then it +indicates the caller knows about the possibility of passing something +other than a GV as C, and accordingly the corresponding bit may +be either set or clear in C<*ckflags_p>, indicating the check function's +recorded requirements. - /* Optimise a "return ..." at the end of a sub to just be "...". - * This saves 2 ops. Before: - * 1 <;> nextstate(main 1 -e:1) v ->2 - * 4 <@> return K ->5 - * 2 <0> pushmark s ->3 - * - <1> ex-rv2sv sK/1 ->4 - * 3 <#> gvsv[*cat] s ->4 - * - * After: - * - <@> return K ->- - * - <0> pushmark s ->2 - * - <1> ex-rv2sv sK/1 ->- - * 2 <$> gvsv(*cat) s ->3 - */ - { - OP *next = o->op_next; - OP *sibling = OpSIBLING(o); - if ( OP_TYPE_IS(next, OP_PUSHMARK) - && OP_TYPE_IS(sibling, OP_RETURN) - && OP_TYPE_IS(sibling->op_next, OP_LINESEQ) - && ( OP_TYPE_IS(sibling->op_next->op_next, OP_LEAVESUB) - ||OP_TYPE_IS(sibling->op_next->op_next, - OP_LEAVESUBLV)) - && cUNOPx(sibling)->op_first == next - && OpHAS_SIBLING(next) && OpSIBLING(next)->op_next - && next->op_next - ) { - /* Look through the PUSHMARK's siblings for one that - * points to the RETURN */ - OP *top = OpSIBLING(next); - while (top && top->op_next) { - if (top->op_next == sibling) { - top->op_next = sibling->op_next; - o->op_next = next->op_next; - break; - } - top = OpSIBLING(top); - } - } - } +C is a bitset passed into C, in which +only the C bit currently has a defined meaning +(for which see above). All other bits should be clear. - /* Optimise 'my $x; my $y;' into 'my ($x, $y);' - * - * This latter form is then suitable for conversion into padrange - * later on. Convert: - * - * nextstate1 -> padop1 -> nextstate2 -> padop2 -> nextstate3 - * - * into: - * - * nextstate1 -> listop -> nextstate3 - * / \ - * pushmark -> padop1 -> padop2 - */ - if (o->op_next && ( - o->op_next->op_type == OP_PADSV - || o->op_next->op_type == OP_PADAV - || o->op_next->op_type == OP_PADHV - ) - && !(o->op_next->op_private & ~OPpLVAL_INTRO) - && o->op_next->op_next && o->op_next->op_next->op_type == OP_NEXTSTATE - && o->op_next->op_next->op_next && ( - o->op_next->op_next->op_next->op_type == OP_PADSV - || o->op_next->op_next->op_next->op_type == OP_PADAV - || o->op_next->op_next->op_next->op_type == OP_PADHV - ) - && !(o->op_next->op_next->op_next->op_private & ~OPpLVAL_INTRO) - && o->op_next->op_next->op_next->op_next && o->op_next->op_next->op_next->op_next->op_type == OP_NEXTSTATE - && (!CopLABEL((COP*)o)) /* Don't mess with labels */ - && (!CopLABEL((COP*)o->op_next->op_next)) /* ... */ - ) { - OP *pad1, *ns2, *pad2, *ns3, *newop, *newpm; +=for apidoc Amnh||CALL_CHECKER_REQUIRE_GV - pad1 = o->op_next; - ns2 = pad1->op_next; - pad2 = ns2->op_next; - ns3 = pad2->op_next; - - /* we assume here that the op_next chain is the same as - * the op_sibling chain */ - assert(OpSIBLING(o) == pad1); - assert(OpSIBLING(pad1) == ns2); - assert(OpSIBLING(ns2) == pad2); - assert(OpSIBLING(pad2) == ns3); - - /* excise and delete ns2 */ - op_sibling_splice(NULL, pad1, 1, NULL); - op_free(ns2); - - /* excise pad1 and pad2 */ - op_sibling_splice(NULL, o, 2, NULL); - - /* create new listop, with children consisting of: - * a new pushmark, pad1, pad2. */ - newop = newLISTOP(OP_LIST, 0, pad1, pad2); - newop->op_flags |= OPf_PARENS; - newop->op_flags = (newop->op_flags & ~OPf_WANT) | OPf_WANT_VOID; - - /* insert newop between o and ns3 */ - op_sibling_splice(NULL, o, 0, newop); - - /*fixup op_next chain */ - newpm = cUNOPx(newop)->op_first; /* pushmark */ - o ->op_next = newpm; - newpm->op_next = pad1; - pad1 ->op_next = pad2; - pad2 ->op_next = newop; /* listop */ - newop->op_next = ns3; - - /* Ensure pushmark has this flag if padops do */ - if (pad1->op_flags & OPf_MOD && pad2->op_flags & OPf_MOD) { - newpm->op_flags |= OPf_MOD; - } +=for apidoc cv_get_call_checker - break; - } +The original form of L, which does not return +checker flags. When using a checker function returned by this function, +it is only safe to call it with a genuine GV as its C argument. - /* Two NEXTSTATEs in a row serve no purpose. Except if they happen - to carry two labels. For now, take the easier option, and skip - this optimisation if the first NEXTSTATE has a label. */ - if (!CopLABEL((COP*)o) && !PERLDB_NOOPT) { - OP *nextop = o->op_next; - while (nextop) { - switch (nextop->op_type) { - case OP_NULL: - case OP_SCALAR: - case OP_LINESEQ: - case OP_SCOPE: - nextop = nextop->op_next; - continue; - } - break; - } +=cut +*/ - if (nextop && (nextop->op_type == OP_NEXTSTATE)) { - op_null(o); - if (oldop) - oldop->op_next = nextop; - o = nextop; - /* Skip (old)oldop assignment since the current oldop's - op_next already points to the next op. */ - goto redo; - } - } - break; +void +Perl_cv_get_call_checker_flags(pTHX_ CV *cv, U32 gflags, + Perl_call_checker *ckfun_p, SV **ckobj_p, U32 *ckflags_p) +{ + MAGIC *callmg; + PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER_FLAGS; + PERL_UNUSED_CONTEXT; + callmg = SvMAGICAL((SV*)cv) ? mg_find((SV*)cv, PERL_MAGIC_checkcall) : NULL; + if (callmg) { + *ckfun_p = DPTR2FPTR(Perl_call_checker, callmg->mg_ptr); + *ckobj_p = callmg->mg_obj; + *ckflags_p = (callmg->mg_flags | gflags) & MGf_REQUIRE_GV; + } else { + *ckfun_p = Perl_ck_entersub_args_proto_or_list; + *ckobj_p = (SV*)cv; + *ckflags_p = gflags & MGf_REQUIRE_GV; + } +} - case OP_CONCAT: - if (o->op_next && o->op_next->op_type == OP_STRINGIFY) { - if (o->op_next->op_private & OPpTARGET_MY) { - if (o->op_flags & OPf_STACKED) /* chained concats */ - break; /* ignore_optimization */ - else { - /* assert(PL_opargs[o->op_type] & OA_TARGLEX); */ - o->op_targ = o->op_next->op_targ; - o->op_next->op_targ = 0; - o->op_private |= OPpTARGET_MY; - } - } - op_null(o->op_next); - } - break; - case OP_STUB: - if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) { - break; /* Scalar stub must produce undef. List stub is noop */ - } - goto nothin; - case OP_NULL: - if (o->op_targ == OP_NEXTSTATE - || o->op_targ == OP_DBSTATE) - { - PL_curcop = ((COP*)o); - } - /* XXX: We avoid setting op_seq here to prevent later calls - to rpeep() from mistakenly concluding that optimisation - has already occurred. This doesn't fix the real problem, - though (See 20010220.007 (#5874)). AMS 20010719 */ - /* op_seq functionality is now replaced by op_opt */ - o->op_opt = 0; - /* FALLTHROUGH */ - case OP_SCALAR: - case OP_LINESEQ: - case OP_SCOPE: - nothin: - if (oldop) { - oldop->op_next = o->op_next; - o->op_opt = 0; - continue; - } - break; +void +Perl_cv_get_call_checker(pTHX_ CV *cv, Perl_call_checker *ckfun_p, SV **ckobj_p) +{ + U32 ckflags; + PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER; + PERL_UNUSED_CONTEXT; + cv_get_call_checker_flags(cv, CALL_CHECKER_REQUIRE_GV, ckfun_p, ckobj_p, + &ckflags); +} - case OP_PUSHMARK: +/* +=for apidoc cv_set_call_checker_flags - /* Given - 5 repeat/DOLIST - 3 ex-list - 1 pushmark - 2 scalar or const - 4 const[0] - convert repeat into a stub with no kids. - */ - if (o->op_next->op_type == OP_CONST - || ( o->op_next->op_type == OP_PADSV - && !(o->op_next->op_private & OPpLVAL_INTRO)) - || ( o->op_next->op_type == OP_GV - && o->op_next->op_next->op_type == OP_RV2SV - && !(o->op_next->op_next->op_private - & (OPpLVAL_INTRO|OPpOUR_INTRO)))) - { - const OP *kid = o->op_next->op_next; - if (o->op_next->op_type == OP_GV) - kid = kid->op_next; - /* kid is now the ex-list. */ - if (kid->op_type == OP_NULL - && (kid = kid->op_next)->op_type == OP_CONST - /* kid is now the repeat count. */ - && kid->op_next->op_type == OP_REPEAT - && kid->op_next->op_private & OPpREPEAT_DOLIST - && (kid->op_next->op_flags & OPf_WANT) == OPf_WANT_LIST - && SvIOK(kSVOP_sv) && SvIVX(kSVOP_sv) == 0 - && oldop) - { - o = kid->op_next; /* repeat */ - oldop->op_next = o; - op_free(cBINOPo->op_first); - op_free(cBINOPo->op_last ); - o->op_flags &=~ OPf_KIDS; - /* stub is a baseop; repeat is a binop */ - STATIC_ASSERT_STMT(sizeof(OP) <= sizeof(BINOP)); - OpTYPE_set(o, OP_STUB); - o->op_private = 0; - break; - } - } +Sets the function that will be used to fix up a call to C. +Specifically, the function is applied to an C op tree for a +subroutine call, not marked with C<&>, where the callee can be identified +at compile time as C. - /* Convert a series of PAD ops for my vars plus support into a - * single padrange op. Basically - * - * pushmark -> pad[ahs]v -> pad[ahs]?v -> ... -> (list) -> rest - * - * becomes, depending on circumstances, one of - * - * padrange ----------------------------------> (list) -> rest - * padrange --------------------------------------------> rest - * - * where all the pad indexes are sequential and of the same type - * (INTRO or not). - * We convert the pushmark into a padrange op, then skip - * any other pad ops, and possibly some trailing ops. - * Note that we don't null() the skipped ops, to make it - * easier for Deparse to undo this optimisation (and none of - * the skipped ops are holding any resourses). It also makes - * it easier for find_uninit_var(), as it can just ignore - * padrange, and examine the original pad ops. - */ - { - OP *p; - OP *followop = NULL; /* the op that will follow the padrange op */ - U8 count = 0; - U8 intro = 0; - PADOFFSET base = 0; /* init only to stop compiler whining */ - bool gvoid = 0; /* init only to stop compiler whining */ - bool defav = 0; /* seen (...) = @_ */ - bool reuse = 0; /* reuse an existing padrange op */ +The C-level function pointer is supplied in C, an SV argument for +it is supplied in C, and control flags are supplied in C. +The function should be defined like this: - /* look for a pushmark -> gv[_] -> rv2av */ + STATIC OP * ckfun(pTHX_ OP *op, GV *namegv, SV *ckobj) - { - OP *rv2av, *q; - p = o->op_next; - if ( p->op_type == OP_GV - && cGVOPx_gv(p) == PL_defgv - && (rv2av = p->op_next) - && rv2av->op_type == OP_RV2AV - && !(rv2av->op_flags & OPf_REF) - && !(rv2av->op_private & (OPpLVAL_INTRO|OPpMAYBE_LVSUB)) - && ((rv2av->op_flags & OPf_WANT) == OPf_WANT_LIST) - ) { - q = rv2av->op_next; - if (q->op_type == OP_NULL) - q = q->op_next; - if (q->op_type == OP_PUSHMARK) { - defav = 1; - p = q; - } - } - } - if (!defav) { - p = o; - } +It is intended to be called in this manner: - /* scan for PAD ops */ + entersubop = ckfun(aTHX_ entersubop, namegv, ckobj); - for (p = p->op_next; p; p = p->op_next) { - if (p->op_type == OP_NULL) - continue; +In this call, C is a pointer to the C op, +which may be replaced by the check function, and C supplies +the name that should be used by the check function to refer +to the callee of the C op if it needs to emit any diagnostics. +It is permitted to apply the check function in non-standard situations, +such as to a call to a different subroutine or to a method call. - if (( p->op_type != OP_PADSV - && p->op_type != OP_PADAV - && p->op_type != OP_PADHV - ) - /* any private flag other than INTRO? e.g. STATE */ - || (p->op_private & ~OPpLVAL_INTRO) - ) - break; +C may not actually be a GV. For efficiency, perl may pass a +CV or other SV instead. Whatever is passed can be used as the first +argument to L. You can force perl to pass a GV by including +C in the C. - /* let $a[N] potentially be optimised into AELEMFAST_LEX - * instead */ - if ( p->op_type == OP_PADAV - && p->op_next - && p->op_next->op_type == OP_CONST - && p->op_next->op_next - && p->op_next->op_next->op_type == OP_AELEM - ) - break; +C is a bitset, in which only the C +bit currently has a defined meaning (for which see above). All other +bits should be clear. - /* for 1st padop, note what type it is and the range - * start; for the others, check that it's the same type - * and that the targs are contiguous */ - if (count == 0) { - intro = (p->op_private & OPpLVAL_INTRO); - base = p->op_targ; - gvoid = OP_GIMME(p,0) == G_VOID; - } - else { - if ((p->op_private & OPpLVAL_INTRO) != intro) - break; - /* Note that you'd normally expect targs to be - * contiguous in my($a,$b,$c), but that's not the case - * when external modules start doing things, e.g. - * Function::Parameters */ - if (p->op_targ != base + count) - break; - assert(p->op_targ == base + count); - /* Either all the padops or none of the padops should - be in void context. Since we only do the optimisa- - tion for av/hv when the aggregate itself is pushed - on to the stack (one item), there is no need to dis- - tinguish list from scalar context. */ - if (gvoid != (OP_GIMME(p,0) == G_VOID)) - break; - } +The current setting for a particular CV can be retrieved by +L. - /* for AV, HV, only when we're not flattening */ - if ( p->op_type != OP_PADSV - && !gvoid - && !(p->op_flags & OPf_REF) - ) - break; +=for apidoc cv_set_call_checker - if (count >= OPpPADRANGE_COUNTMASK) - break; +The original form of L, which passes it the +C flag for backward-compatibility. The effect +of that flag setting is that the check function is guaranteed to get a +genuine GV as its C argument. - /* there's a biggest base we can fit into a - * SAVEt_CLEARPADRANGE in pp_padrange. - * (The sizeof() stuff will be constant-folded, and is - * intended to avoid getting "comparison is always false" - * compiler warnings. See the comments above - * MEM_WRAP_CHECK for more explanation on why we do this - * in a weird way to avoid compiler warnings.) - */ - if ( intro - && (8*sizeof(base) > - 8*sizeof(UV)-OPpPADRANGE_COUNTSHIFT-SAVE_TIGHT_SHIFT - ? (Size_t)base - : (UV_MAX >> (OPpPADRANGE_COUNTSHIFT+SAVE_TIGHT_SHIFT)) - ) > - (UV_MAX >> (OPpPADRANGE_COUNTSHIFT+SAVE_TIGHT_SHIFT)) - ) - break; +=cut +*/ - /* Success! We've got another valid pad op to optimise away */ - count++; - followop = p->op_next; - } +void +Perl_cv_set_call_checker(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj) +{ + PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER; + cv_set_call_checker_flags(cv, ckfun, ckobj, CALL_CHECKER_REQUIRE_GV); +} - if (count < 1 || (count == 1 && !defav)) - break; +void +Perl_cv_set_call_checker_flags(pTHX_ CV *cv, Perl_call_checker ckfun, + SV *ckobj, U32 ckflags) +{ + PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER_FLAGS; + if (ckfun == Perl_ck_entersub_args_proto_or_list && ckobj == (SV*)cv) { + if (SvMAGICAL((SV*)cv)) + mg_free_type((SV*)cv, PERL_MAGIC_checkcall); + } else { + MAGIC *callmg; + sv_magic((SV*)cv, &PL_sv_undef, PERL_MAGIC_checkcall, NULL, 0); + callmg = mg_find((SV*)cv, PERL_MAGIC_checkcall); + assert(callmg); + if (callmg->mg_flags & MGf_REFCOUNTED) { + SvREFCNT_dec(callmg->mg_obj); + callmg->mg_flags &= ~MGf_REFCOUNTED; + } + callmg->mg_ptr = FPTR2DPTR(char *, ckfun); + callmg->mg_obj = ckobj; + if (ckobj != (SV*)cv) { + SvREFCNT_inc_simple_void_NN(ckobj); + callmg->mg_flags |= MGf_REFCOUNTED; + } + callmg->mg_flags = (callmg->mg_flags &~ MGf_REQUIRE_GV) + | (U8)(ckflags & MGf_REQUIRE_GV) | MGf_COPY; + } +} - /* pp_padrange in specifically compile-time void context - * skips pushing a mark and lexicals; in all other contexts - * (including unknown till runtime) it pushes a mark and the - * lexicals. We must be very careful then, that the ops we - * optimise away would have exactly the same effect as the - * padrange. - * In particular in void context, we can only optimise to - * a padrange if we see the complete sequence - * pushmark, pad*v, ...., list - * which has the net effect of leaving the markstack as it - * was. Not pushing onto the stack (whereas padsv does touch - * the stack) makes no difference in void context. - */ - assert(followop); - if (gvoid) { - if (followop->op_type == OP_LIST - && OP_GIMME(followop,0) == G_VOID - ) - { - followop = followop->op_next; /* skip OP_LIST */ +static void +S_entersub_alloc_targ(pTHX_ OP * const o) +{ + o->op_targ = pad_alloc(OP_ENTERSUB, SVs_PADTMP); + o->op_private |= OPpENTERSUB_HASTARG; +} - /* consolidate two successive my(...);'s */ +OP * +Perl_ck_subr(pTHX_ OP *o) +{ + OP *aop, *cvop; + CV *cv; + GV *namegv; + SV **const_class = NULL; - if ( oldoldop - && oldoldop->op_type == OP_PADRANGE - && (oldoldop->op_flags & OPf_WANT) == OPf_WANT_VOID - && (oldoldop->op_private & OPpLVAL_INTRO) == intro - && !(oldoldop->op_flags & OPf_SPECIAL) - ) { - U8 old_count; - assert(oldoldop->op_next == oldop); - assert( oldop->op_type == OP_NEXTSTATE - || oldop->op_type == OP_DBSTATE); - assert(oldop->op_next == o); - - old_count - = (oldoldop->op_private & OPpPADRANGE_COUNTMASK); - - /* Do not assume pad offsets for $c and $d are con- - tiguous in - my ($a,$b,$c); - my ($d,$e,$f); - */ - if ( oldoldop->op_targ + old_count == base - && old_count < OPpPADRANGE_COUNTMASK - count) { - base = oldoldop->op_targ; - count += old_count; - reuse = 1; - } - } + PERL_ARGS_ASSERT_CK_SUBR; - /* if there's any immediately following singleton - * my var's; then swallow them and the associated - * nextstates; i.e. - * my ($a,$b); my $c; my $d; - * is treated as - * my ($a,$b,$c,$d); - */ + aop = cUNOPx(o)->op_first; + if (!OpHAS_SIBLING(aop)) + aop = cUNOPx(aop)->op_first; + aop = OpSIBLING(aop); + for (cvop = aop; OpHAS_SIBLING(cvop); cvop = OpSIBLING(cvop)) ; + cv = rv2cv_op_cv(cvop, RV2CVOPCV_MARK_EARLY); + namegv = cv ? (GV*)rv2cv_op_cv(cvop, RV2CVOPCV_MAYBE_NAME_GV) : NULL; - while ( ((p = followop->op_next)) - && ( p->op_type == OP_PADSV - || p->op_type == OP_PADAV - || p->op_type == OP_PADHV) - && (p->op_flags & OPf_WANT) == OPf_WANT_VOID - && (p->op_private & OPpLVAL_INTRO) == intro - && !(p->op_private & ~OPpLVAL_INTRO) - && p->op_next - && ( p->op_next->op_type == OP_NEXTSTATE - || p->op_next->op_type == OP_DBSTATE) - && count < OPpPADRANGE_COUNTMASK - && base + count == p->op_targ - ) { - count++; - followop = p->op_next; - } - } - else - break; + o->op_private &= ~1; + o->op_private |= (PL_hints & HINT_STRICT_REFS); + if (PERLDB_SUB && PL_curstash != PL_debstash) + o->op_private |= OPpENTERSUB_DB; + switch (cvop->op_type) { + case OP_RV2CV: + o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER); + op_null(cvop); + break; + case OP_METHOD: + case OP_METHOD_NAMED: + case OP_METHOD_SUPER: + case OP_METHOD_REDIR: + case OP_METHOD_REDIR_SUPER: + o->op_flags |= OPf_REF; + if (aop->op_type == OP_CONST) { + aop->op_private &= ~OPpCONST_STRICT; + const_class = &cSVOPx(aop)->op_sv; } - - if (reuse) { - assert(oldoldop->op_type == OP_PADRANGE); - oldoldop->op_next = followop; - oldoldop->op_private = (intro | count); - o = oldoldop; - oldop = NULL; - oldoldop = NULL; + else if (aop->op_type == OP_LIST) { + OP * const sib = OpSIBLING(cUNOPx(aop)->op_first); + if (sib && sib->op_type == OP_CONST) { + sib->op_private &= ~OPpCONST_STRICT; + const_class = &cSVOPx(sib)->op_sv; + } } - else { - /* Convert the pushmark into a padrange. - * To make Deparse easier, we guarantee that a padrange was - * *always* formerly a pushmark */ - assert(o->op_type == OP_PUSHMARK); - o->op_next = followop; - OpTYPE_set(o, OP_PADRANGE); - o->op_targ = base; - /* bit 7: INTRO; bit 6..0: count */ - o->op_private = (intro | count); - o->op_flags = ((o->op_flags & ~(OPf_WANT|OPf_SPECIAL)) - | gvoid * OPf_WANT_VOID - | (defav ? OPf_SPECIAL : 0)); + /* make class name a shared cow string to speedup method calls */ + /* constant string might be replaced with object, f.e. bigint */ + if (const_class && SvPOK(*const_class)) { + STRLEN len; + const char* str = SvPV(*const_class, len); + if (len) { + SV* const shared = newSVpvn_share( + str, SvUTF8(*const_class) + ? -(SSize_t)len : (SSize_t)len, + 0 + ); + if (SvREADONLY(*const_class)) + SvREADONLY_on(shared); + SvREFCNT_dec(*const_class); + *const_class = shared; + } } break; - } - - case OP_RV2AV: - if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) - S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); - break; + } - case OP_RV2HV: - case OP_PADHV: - /*'keys %h' in void or scalar context: skip the OP_KEYS - * and perform the functionality directly in the RV2HV/PADHV - * op - */ - if (o->op_flags & OPf_REF) { - OP *k = o->op_next; - U8 want = (k->op_flags & OPf_WANT); - if ( k - && k->op_type == OP_KEYS - && ( want == OPf_WANT_VOID - || want == OPf_WANT_SCALAR) - && !(k->op_private & OPpMAYBE_LVSUB) - && !(k->op_flags & OPf_MOD) - ) { - o->op_next = k->op_next; - o->op_flags &= ~(OPf_REF|OPf_WANT); - o->op_flags |= want; - o->op_private |= (o->op_type == OP_PADHV ? - OPpPADHV_ISKEYS : OPpRV2HV_ISKEYS); - /* for keys(%lex), hold onto the OP_KEYS's targ - * since padhv doesn't have its own targ to return - * an int with */ - if (!(o->op_type ==OP_PADHV && want == OPf_WANT_SCALAR)) - op_null(k); - } + if (!cv) { + S_entersub_alloc_targ(aTHX_ o); + return ck_entersub_args_list(o); + } else { + Perl_call_checker ckfun; + SV *ckobj; + U32 ckflags; + cv_get_call_checker_flags(cv, 0, &ckfun, &ckobj, &ckflags); + if (CvISXSUB(cv) || !CvROOT(cv)) + S_entersub_alloc_targ(aTHX_ o); + if (!namegv) { + /* The original call checker API guarantees that a GV will + be provided with the right name. So, if the old API was + used (or the REQUIRE_GV flag was passed), we have to reify + the CV’s GV, unless this is an anonymous sub. This is not + ideal for lexical subs, as its stringification will include + the package. But it is the best we can do. */ + if (ckflags & CALL_CHECKER_REQUIRE_GV) { + if (!CvANON(cv) && (!CvNAMED(cv) || CvNAME_HEK(cv))) + namegv = CvGV(cv); } + else namegv = MUTABLE_GV(cv); + /* After a syntax error in a lexical sub, the cv that + rv2cv_op_cv returns may be a nameless stub. */ + if (!namegv) return ck_entersub_args_list(o); - /* see if %h is used in boolean context */ - if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) - S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, OPpMAYBE_TRUEBOOL); + } + return ckfun(aTHX_ o, namegv, ckobj); + } +} +OP * +Perl_ck_svconst(pTHX_ OP *o) +{ + SV * const sv = cSVOPo->op_sv; + PERL_ARGS_ASSERT_CK_SVCONST; + PERL_UNUSED_CONTEXT; +#ifdef PERL_COPY_ON_WRITE + /* Since the read-only flag may be used to protect a string buffer, we + cannot do copy-on-write with existing read-only scalars that are not + already copy-on-write scalars. To allow $_ = "hello" to do COW with + that constant, mark the constant as COWable here, if it is not + already read-only. */ + if (!SvREADONLY(sv) && !SvIsCOW(sv) && SvCANCOW(sv)) { + SvIsCOW_on(sv); + CowREFCNT(sv) = 0; +# ifdef PERL_DEBUG_READONLY_COW + sv_buf_to_ro(sv); +# endif + } +#endif + SvREADONLY_on(sv); + return o; +} - if (o->op_type != OP_PADHV) - break; - /* FALLTHROUGH */ - case OP_PADAV: - if ( o->op_type == OP_PADAV - && (o->op_flags & OPf_WANT) == OPf_WANT_SCALAR - ) - S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); - /* FALLTHROUGH */ - case OP_PADSV: - /* Skip over state($x) in void context. */ - if (oldop && o->op_private == (OPpPAD_STATE|OPpLVAL_INTRO) - && (o->op_flags & OPf_WANT) == OPf_WANT_VOID) - { - oldop->op_next = o->op_next; - goto redo_nextstate; - } - if (o->op_type != OP_PADAV) - break; - /* FALLTHROUGH */ - case OP_GV: - if (o->op_type == OP_PADAV || o->op_next->op_type == OP_RV2AV) { - OP* const pop = (o->op_type == OP_PADAV) ? - o->op_next : o->op_next->op_next; - IV i; - if (pop && pop->op_type == OP_CONST && - ((PL_op = pop->op_next)) && - pop->op_next->op_type == OP_AELEM && - !(pop->op_next->op_private & - (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF|OPpMAYBE_LVSUB)) && - (i = SvIV(((SVOP*)pop)->op_sv)) >= -128 && i <= 127) - { - GV *gv; - if (cSVOPx(pop)->op_private & OPpCONST_STRICT) - no_bareword_allowed(pop); - if (o->op_type == OP_GV) - op_null(o->op_next); - op_null(pop->op_next); - op_null(pop); - o->op_flags |= pop->op_next->op_flags & OPf_MOD; - o->op_next = pop->op_next->op_next; - o->op_ppaddr = PL_ppaddr[OP_AELEMFAST]; - o->op_private = (U8)i; - if (o->op_type == OP_GV) { - gv = cGVOPo_gv; - GvAVn(gv); - o->op_type = OP_AELEMFAST; - } - else - o->op_type = OP_AELEMFAST_LEX; - } - if (o->op_type != OP_GV) - break; - } +OP * +Perl_ck_trunc(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_TRUNC; - /* Remove $foo from the op_next chain in void context. */ - if (oldop - && ( o->op_next->op_type == OP_RV2SV - || o->op_next->op_type == OP_RV2AV - || o->op_next->op_type == OP_RV2HV ) - && (o->op_next->op_flags & OPf_WANT) == OPf_WANT_VOID - && !(o->op_next->op_private & OPpLVAL_INTRO)) - { - oldop->op_next = o->op_next->op_next; - /* Reprocess the previous op if it is a nextstate, to - allow double-nextstate optimisation. */ - redo_nextstate: - if (oldop->op_type == OP_NEXTSTATE) { - oldop->op_opt = 0; - o = oldop; - oldop = oldoldop; - oldoldop = NULL; - goto redo; - } - o = oldop->op_next; - goto redo; - } - else if (o->op_next->op_type == OP_RV2SV) { - if (!(o->op_next->op_private & OPpDEREF)) { - op_null(o->op_next); - o->op_private |= o->op_next->op_private & (OPpLVAL_INTRO - | OPpOUR_INTRO); - o->op_next = o->op_next->op_next; - OpTYPE_set(o, OP_GVSV); - } - } - else if (o->op_next->op_type == OP_READLINE - && o->op_next->op_next->op_type == OP_CONCAT - && (o->op_next->op_next->op_flags & OPf_STACKED)) - { - /* Turn "$a .= " into an OP_RCATLINE. AMS 20010917 */ - OpTYPE_set(o, OP_RCATLINE); - o->op_flags |= OPf_STACKED; - op_null(o->op_next->op_next); - op_null(o->op_next); + if (o->op_flags & OPf_KIDS) { + SVOP *kid = cSVOPx(cUNOPo->op_first); + + if (kid->op_type == OP_NULL) + kid = cSVOPx(OpSIBLING(kid)); + if (kid && kid->op_type == OP_CONST && + (kid->op_private & OPpCONST_BARE) && + !kid->op_folded) + { + o->op_flags |= OPf_SPECIAL; + kid->op_private &= ~OPpCONST_STRICT; + if (!FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) { + no_bareword_filehandle(SvPVX(cSVOPx_sv(kid))); } + } + } + return ck_fun(o); +} - break; +OP * +Perl_ck_substr(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_SUBSTR; - case OP_NOT: - break; + o = ck_fun(o); + if ((o->op_flags & OPf_KIDS) && (o->op_private == 4)) { + OP *kid = cLISTOPo->op_first; - case OP_AND: - case OP_OR: - case OP_DOR: - case OP_CMPCHAIN_AND: - case OP_PUSHDEFER: - while (cLOGOP->op_other->op_type == OP_NULL) - cLOGOP->op_other = cLOGOP->op_other->op_next; - while (o->op_next && ( o->op_type == o->op_next->op_type - || o->op_next->op_type == OP_NULL)) - o->op_next = o->op_next->op_next; - - /* If we're an OR and our next is an AND in void context, we'll - follow its op_other on short circuit, same for reverse. - We can't do this with OP_DOR since if it's true, its return - value is the underlying value which must be evaluated - by the next op. */ - if (o->op_next && - ( - (IS_AND_OP(o) && IS_OR_OP(o->op_next)) - || (IS_OR_OP(o) && IS_AND_OP(o->op_next)) - ) - && (o->op_next->op_flags & OPf_WANT) == OPf_WANT_VOID - ) { - o->op_next = ((LOGOP*)o->op_next)->op_other; - } - DEFER(cLOGOP->op_other); - o->op_opt = 1; - break; + if (kid->op_type == OP_NULL) + kid = OpSIBLING(kid); + if (kid) + /* Historically, substr(delete $foo{bar},...) has been allowed + with 4-arg substr. Keep it working by applying entersub + lvalue context. */ + op_lvalue(kid, OP_ENTERSUB); - case OP_GREPWHILE: - if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) - S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); - /* FALLTHROUGH */ - case OP_COND_EXPR: - case OP_MAPWHILE: - case OP_ANDASSIGN: - case OP_ORASSIGN: - case OP_DORASSIGN: - case OP_RANGE: - case OP_ONCE: - case OP_ARGDEFELEM: - while (cLOGOP->op_other->op_type == OP_NULL) - cLOGOP->op_other = cLOGOP->op_other->op_next; - DEFER(cLOGOP->op_other); - break; + } + return o; +} - case OP_ENTERLOOP: - case OP_ENTERITER: - while (cLOOP->op_redoop->op_type == OP_NULL) - cLOOP->op_redoop = cLOOP->op_redoop->op_next; - while (cLOOP->op_nextop->op_type == OP_NULL) - cLOOP->op_nextop = cLOOP->op_nextop->op_next; - while (cLOOP->op_lastop->op_type == OP_NULL) - cLOOP->op_lastop = cLOOP->op_lastop->op_next; - /* a while(1) loop doesn't have an op_next that escapes the - * loop, so we have to explicitly follow the op_lastop to - * process the rest of the code */ - DEFER(cLOOP->op_lastop); - break; +OP * +Perl_ck_tell(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_TELL; + o = ck_fun(o); + if (o->op_flags & OPf_KIDS) { + OP *kid = cLISTOPo->op_first; + if (kid->op_type == OP_NULL && OpHAS_SIBLING(kid)) kid = OpSIBLING(kid); + if (kid->op_type == OP_RV2GV) kid->op_private |= OPpALLOW_FAKE; + } + return o; +} - case OP_ENTERTRY: - assert(cLOGOPo->op_other->op_type == OP_LEAVETRY); - DEFER(cLOGOPo->op_other); - break; +PERL_STATIC_INLINE OP * +S_last_non_null_kid(OP *o) { + OP *last = NULL; + if (cUNOPo->op_flags & OPf_KIDS) { + OP *k = cLISTOPo->op_first; + while (k) { + if (k->op_type != OP_NULL) { + last = k; + } + k = OpSIBLING(k); + } + } - case OP_ENTERTRYCATCH: - assert(cLOGOPo->op_other->op_type == OP_CATCH); - /* catch body is the ->op_other of the OP_CATCH */ - DEFER(cLOGOPx(cLOGOPo->op_other)->op_other); - break; + return last; +} - case OP_SUBST: - if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) - S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); - assert(!(cPMOP->op_pmflags & PMf_ONCE)); - while (cPMOP->op_pmstashstartu.op_pmreplstart && - cPMOP->op_pmstashstartu.op_pmreplstart->op_type == OP_NULL) - cPMOP->op_pmstashstartu.op_pmreplstart - = cPMOP->op_pmstashstartu.op_pmreplstart->op_next; - DEFER(cPMOP->op_pmstashstartu.op_pmreplstart); - break; +OP * +Perl_ck_each(pTHX_ OP *o) +{ + OP *kid = o->op_flags & OPf_KIDS ? cUNOPo->op_first : NULL; + const unsigned orig_type = o->op_type; - case OP_SORT: { - OP *oright; + PERL_ARGS_ASSERT_CK_EACH; - if (o->op_flags & OPf_SPECIAL) { - /* first arg is a code block */ - OP * const nullop = OpSIBLING(cLISTOP->op_first); - OP * kid = cUNOPx(nullop)->op_first; - - assert(nullop->op_type == OP_NULL); - assert(kid->op_type == OP_SCOPE - || (kid->op_type == OP_NULL && kid->op_targ == OP_LEAVE)); - /* since OP_SORT doesn't have a handy op_other-style - * field that can point directly to the start of the code - * block, store it in the otherwise-unused op_next field - * of the top-level OP_NULL. This will be quicker at - * run-time, and it will also allow us to remove leading - * OP_NULLs by just messing with op_nexts without - * altering the basic op_first/op_sibling layout. */ - kid = kLISTOP->op_first; - assert( - (kid->op_type == OP_NULL - && ( kid->op_targ == OP_NEXTSTATE - || kid->op_targ == OP_DBSTATE )) - || kid->op_type == OP_STUB - || kid->op_type == OP_ENTER - || (PL_parser && PL_parser->error_count)); - nullop->op_next = kid->op_next; - DEFER(nullop->op_next); - } - - /* check that RHS of sort is a single plain array */ - oright = cUNOPo->op_first; - if (!oright || oright->op_type != OP_PUSHMARK) + if (kid) { + switch (kid->op_type) { + case OP_PADHV: break; - if (o->op_private & OPpSORT_INPLACE) + case OP_RV2HV: + /* Catch out an anonhash here, since the behaviour might be + * confusing. + * + * The typical tree is: + * + * rv2hv + * scope + * null + * anonhash + * + * If the contents of the block is more complex you might get: + * + * rv2hv + * leave + * enter + * ... + * anonhash + * + * Similarly for the anonlist version below. + */ + if (orig_type == OP_EACH && + ckWARN(WARN_SYNTAX) && + (cUNOPx(kid)->op_flags & OPf_KIDS) && + ( cUNOPx(kid)->op_first->op_type == OP_SCOPE || + cUNOPx(kid)->op_first->op_type == OP_LEAVE) && + (cUNOPx(kid)->op_first->op_flags & OPf_KIDS)) { + /* look for last non-null kid, since we might have: + each %{ some code ; +{ anon hash } } + */ + OP *k = S_last_non_null_kid(cUNOPx(kid)->op_first); + if (k && k->op_type == OP_ANONHASH) { + /* diag_listed_as: each on anonymous %s will always start from the beginning */ + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "each on anonymous hash will always start from the beginning"); + } + } break; - - /* reverse sort ... can be optimised. */ - if (!OpHAS_SIBLING(cUNOPo)) { - /* Nothing follows us on the list. */ - OP * const reverse = o->op_next; - - if (reverse->op_type == OP_REVERSE && - (reverse->op_flags & OPf_WANT) == OPf_WANT_LIST) { - OP * const pushmark = cUNOPx(reverse)->op_first; - if (pushmark && (pushmark->op_type == OP_PUSHMARK) - && (OpSIBLING(cUNOPx(pushmark)) == o)) { - /* reverse -> pushmark -> sort */ - o->op_private |= OPpSORT_REVERSE; - op_null(reverse); - pushmark->op_next = oright->op_next; - op_null(oright); + case OP_RV2AV: + if (orig_type == OP_EACH && + ckWARN(WARN_SYNTAX) && + (cUNOPx(kid)->op_flags & OPf_KIDS) && + (cUNOPx(kid)->op_first->op_type == OP_SCOPE || + cUNOPx(kid)->op_first->op_type == OP_LEAVE) && + (cUNOPx(kid)->op_first->op_flags & OPf_KIDS)) { + OP *k = S_last_non_null_kid(cUNOPx(kid)->op_first); + if (k && k->op_type == OP_ANONLIST) { + /* diag_listed_as: each on anonymous %s will always start from the beginning */ + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "each on anonymous array will always start from the beginning"); } } - } + /* FALLTHROUGH */ + case OP_PADAV: + OpTYPE_set(o, orig_type == OP_EACH ? OP_AEACH + : orig_type == OP_KEYS ? OP_AKEYS + : OP_AVALUES); + break; + case OP_CONST: + if (kid->op_private == OPpCONST_BARE + || !SvROK(cSVOPx_sv(kid)) + || ( SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVAV + && SvTYPE(SvRV(cSVOPx_sv(kid))) != SVt_PVHV ) + ) + goto bad; + /* FALLTHROUGH */ + default: + qerror(Perl_mess(aTHX_ + "Experimental %s on scalar is now forbidden", + PL_op_desc[orig_type])); + bad: + bad_type_pv(1, "hash or array", o, kid); + return o; + } + } + return ck_fun(o); +} - break; - } +OP * +Perl_ck_length(pTHX_ OP *o) +{ + PERL_ARGS_ASSERT_CK_LENGTH; - case OP_REVERSE: { - OP *ourmark, *theirmark, *ourlast, *iter, *expushmark, *rv2av; - OP *gvop = NULL; - LISTOP *enter, *exlist; + o = ck_fun(o); - if (o->op_private & OPpSORT_INPLACE) - break; + if (ckWARN(WARN_SYNTAX)) { + const OP *kid = o->op_flags & OPf_KIDS ? cLISTOPo->op_first : NULL; - enter = (LISTOP *) o->op_next; - if (!enter) - break; - if (enter->op_type == OP_NULL) { - enter = (LISTOP *) enter->op_next; - if (!enter) - break; - } - /* for $a (...) will have OP_GV then OP_RV2GV here. - for (...) just has an OP_GV. */ - if (enter->op_type == OP_GV) { - gvop = (OP *) enter; - enter = (LISTOP *) enter->op_next; - if (!enter) - break; - if (enter->op_type == OP_RV2GV) { - enter = (LISTOP *) enter->op_next; - if (!enter) + if (kid) { + SV *name = NULL; + const bool hash = kid->op_type == OP_PADHV + || kid->op_type == OP_RV2HV; + switch (kid->op_type) { + case OP_PADHV: + case OP_PADAV: + case OP_RV2HV: + case OP_RV2AV: + name = op_varname(kid); break; - } + default: + return o; } + if (name) + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), + "length() used on %" SVf " (did you mean \"scalar(%s%" SVf + ")\"?)", + SVfARG(name), hash ? "keys " : "", SVfARG(name) + ); + else if (hash) + /* diag_listed_as: length() used on %s (did you mean "scalar(%s)"?) */ + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), + "length() used on %%hash (did you mean \"scalar(keys %%hash)\"?)"); + else + /* diag_listed_as: length() used on %s (did you mean "scalar(%s)"?) */ + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), + "length() used on @array (did you mean \"scalar(@array)\"?)"); + } + } - if (enter->op_type != OP_ENTERITER) - break; + return o; +} - iter = enter->op_next; - if (!iter || iter->op_type != OP_ITER) - break; - expushmark = enter->op_first; - if (!expushmark || expushmark->op_type != OP_NULL - || expushmark->op_targ != OP_PUSHMARK) - break; +OP * +Perl_ck_isa(pTHX_ OP *o) +{ + OP *classop = cBINOPo->op_last; - exlist = (LISTOP *) OpSIBLING(expushmark); - if (!exlist || exlist->op_type != OP_NULL - || exlist->op_targ != OP_LIST) - break; + PERL_ARGS_ASSERT_CK_ISA; - if (exlist->op_last != o) { - /* Mmm. Was expecting to point back to this op. */ - break; - } - theirmark = exlist->op_first; - if (!theirmark || theirmark->op_type != OP_PUSHMARK) - break; + /* Convert barename into PV */ + if(classop->op_type == OP_CONST && classop->op_private & OPpCONST_BARE) { + /* TODO: Optionally convert package to raw HV here */ + classop->op_private &= ~(OPpCONST_BARE|OPpCONST_STRICT); + } - if (OpSIBLING(theirmark) != o) { - /* There's something between the mark and the reverse, eg - for (1, reverse (...)) - so no go. */ - break; - } + return o; +} - ourmark = ((LISTOP *)o)->op_first; - if (!ourmark || ourmark->op_type != OP_PUSHMARK) - break; - ourlast = ((LISTOP *)o)->op_last; - if (!ourlast || ourlast->op_next != o) - break; +/* Check for in place reverse and sort assignments like "@a = reverse @a" + and modify the optree to make them work inplace */ - rv2av = OpSIBLING(ourmark); - if (rv2av && rv2av->op_type == OP_RV2AV && !OpHAS_SIBLING(rv2av) - && rv2av->op_flags == (OPf_WANT_LIST | OPf_KIDS)) { - /* We're just reversing a single array. */ - rv2av->op_flags = OPf_WANT_SCALAR | OPf_KIDS | OPf_REF; - enter->op_flags |= OPf_STACKED; - } - - /* We don't have control over who points to theirmark, so sacrifice - ours. */ - theirmark->op_next = ourmark->op_next; - theirmark->op_flags = ourmark->op_flags; - ourlast->op_next = gvop ? gvop : (OP *) enter; - op_null(ourmark); - op_null(o); - enter->op_private |= OPpITER_REVERSED; - iter->op_private |= OPpITER_REVERSED; - - oldoldop = NULL; - oldop = ourlast; - o = oldop->op_next; - goto redo; - NOT_REACHED; /* NOTREACHED */ - break; - } +STATIC void +S_inplace_aassign(pTHX_ OP *o) { - case OP_QR: - case OP_MATCH: - if (!(cPMOP->op_pmflags & PMf_ONCE)) { - assert (!cPMOP->op_pmstashstartu.op_pmreplstart); - } - break; + OP *modop, *modop_pushmark; + OP *oright; + OP *oleft, *oleft_pushmark; - case OP_RUNCV: - if (!(o->op_private & OPpOFFBYONE) && !CvCLONE(PL_compcv) - && (!CvANON(PL_compcv) || (!PL_cv_has_eval && !PL_perldb))) - { - SV *sv; - if (CvEVAL(PL_compcv)) sv = &PL_sv_undef; - else { - sv = newRV((SV *)PL_compcv); - sv_rvweaken(sv); - SvREADONLY_on(sv); - } - OpTYPE_set(o, OP_CONST); - o->op_flags |= OPf_SPECIAL; - cSVOPo->op_sv = sv; - } - break; + PERL_ARGS_ASSERT_INPLACE_AASSIGN; - case OP_SASSIGN: - if (OP_GIMME(o,0) == G_VOID - || ( o->op_next->op_type == OP_LINESEQ - && ( o->op_next->op_next->op_type == OP_LEAVESUB - || ( o->op_next->op_next->op_type == OP_RETURN - && !CvLVALUE(PL_compcv))))) - { - OP *right = cBINOP->op_first; - if (right) { - /* sassign - * RIGHT - * substr - * pushmark - * arg1 - * arg2 - * ... - * becomes - * - * ex-sassign - * substr - * pushmark - * RIGHT - * arg1 - * arg2 - * ... - */ - OP *left = OpSIBLING(right); - if (left->op_type == OP_SUBSTR - && (left->op_private & 7) < 4) { - op_null(o); - /* cut out right */ - op_sibling_splice(o, NULL, 1, NULL); - /* and insert it as second child of OP_SUBSTR */ - op_sibling_splice(left, cBINOPx(left)->op_first, 0, - right); - left->op_private |= OPpSUBSTR_REPL_FIRST; - left->op_flags = - (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID; - } - } - } - break; + assert((o->op_flags & OPf_WANT) == OPf_WANT_VOID); - case OP_AASSIGN: { - int l, r, lr, lscalars, rscalars; + assert(cUNOPo->op_first->op_type == OP_NULL); + modop_pushmark = cUNOPx(cUNOPo->op_first)->op_first; + assert(modop_pushmark->op_type == OP_PUSHMARK); + modop = OpSIBLING(modop_pushmark); - /* handle common vars detection, e.g. ($a,$b) = ($b,$a). - Note that we do this now rather than in newASSIGNOP(), - since only by now are aliased lexicals flagged as such - - See the essay "Common vars in list assignment" above for - the full details of the rationale behind all the conditions - below. - - PL_generation sorcery: - To detect whether there are common vars, the global var - PL_generation is incremented for each assign op we scan. - Then we run through all the lexical variables on the LHS, - of the assignment, setting a spare slot in each of them to - PL_generation. Then we scan the RHS, and if any lexicals - already have that value, we know we've got commonality. - Also, if the generation number is already set to - PERL_INT_MAX, then the variable is involved in aliasing, so - we also have potential commonality in that case. - */ + if (modop->op_type != OP_SORT && modop->op_type != OP_REVERSE) + return; - PL_generation++; - /* scan LHS */ - lscalars = 0; - l = S_aassign_scan(aTHX_ cLISTOPo->op_last, FALSE, &lscalars); - /* scan RHS */ - rscalars = 0; - r = S_aassign_scan(aTHX_ cLISTOPo->op_first, TRUE, &rscalars); - lr = (l|r); - - - /* After looking for things which are *always* safe, this main - * if/else chain selects primarily based on the type of the - * LHS, gradually working its way down from the more dangerous - * to the more restrictive and thus safer cases */ - - if ( !l /* () = ....; */ - || !r /* .... = (); */ - || !(l & ~AAS_SAFE_SCALAR) /* (undef, pos()) = ...; */ - || !(r & ~AAS_SAFE_SCALAR) /* ... = (1,2,length,undef); */ - || (lscalars < 2) /* (undef, $x) = ... */ - ) { - NOOP; /* always safe */ - } - else if (l & AAS_DANGEROUS) { - /* always dangerous */ - o->op_private |= OPpASSIGN_COMMON_SCALAR; - o->op_private |= OPpASSIGN_COMMON_AGG; - } - else if (l & (AAS_PKG_SCALAR|AAS_PKG_AGG)) { - /* package vars are always dangerous - too many - * aliasing possibilities */ - if (l & AAS_PKG_SCALAR) - o->op_private |= OPpASSIGN_COMMON_SCALAR; - if (l & AAS_PKG_AGG) - o->op_private |= OPpASSIGN_COMMON_AGG; - } - else if (l & ( AAS_MY_SCALAR|AAS_MY_AGG - |AAS_LEX_SCALAR|AAS_LEX_AGG)) - { - /* LHS contains only lexicals and safe ops */ + /* no other operation except sort/reverse */ + if (OpHAS_SIBLING(modop)) + return; - if (l & (AAS_MY_AGG|AAS_LEX_AGG)) - o->op_private |= OPpASSIGN_COMMON_AGG; + assert(cUNOPx(modop)->op_first->op_type == OP_PUSHMARK); + if (!(oright = OpSIBLING(cUNOPx(modop)->op_first))) return; - if (l & (AAS_MY_SCALAR|AAS_LEX_SCALAR)) { - if (lr & AAS_LEX_SCALAR_COMM) - o->op_private |= OPpASSIGN_COMMON_SCALAR; - else if ( !(l & AAS_LEX_SCALAR) - && (r & AAS_DEFAV)) - { - /* falsely mark - * my (...) = @_ - * as scalar-safe for performance reasons. - * (it will still have been marked _AGG if necessary */ - NOOP; - } - else if (r & (AAS_PKG_SCALAR|AAS_PKG_AGG|AAS_DANGEROUS)) - /* if there are only lexicals on the LHS and no - * common ones on the RHS, then we assume that the - * only way those lexicals could also get - * on the RHS is via some sort of dereffing or - * closure, e.g. - * $r = \$lex; - * ($lex, $x) = (1, $$r) - * and in this case we assume the var must have - * a bumped ref count. So if its ref count is 1, - * it must only be on the LHS. - */ - o->op_private |= OPpASSIGN_COMMON_RC1; - } - } + if (modop->op_flags & OPf_STACKED) { + /* skip sort subroutine/block */ + assert(oright->op_type == OP_NULL); + oright = OpSIBLING(oright); + } + + assert(OpSIBLING(cUNOPo->op_first)->op_type == OP_NULL); + oleft_pushmark = cUNOPx(OpSIBLING(cUNOPo->op_first))->op_first; + assert(oleft_pushmark->op_type == OP_PUSHMARK); + oleft = OpSIBLING(oleft_pushmark); - /* ... = ($x) - * may have to handle aggregate on LHS, but we can't - * have common scalars. */ - if (rscalars < 2) - o->op_private &= - ~(OPpASSIGN_COMMON_SCALAR|OPpASSIGN_COMMON_RC1); + /* Check the lhs is an array */ + if (!oleft || + (oleft->op_type != OP_RV2AV && oleft->op_type != OP_PADAV) + || OpHAS_SIBLING(oleft) + || (oleft->op_private & OPpLVAL_INTRO) + ) + return; - if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) - S_check_for_bool_cxt(o, 1, OPpASSIGN_TRUEBOOL, 0); - break; - } + /* Only one thing on the rhs */ + if (OpHAS_SIBLING(oright)) + return; - case OP_REF: - case OP_BLESSED: - /* if the op is used in boolean context, set the TRUEBOOL flag - * which enables an optimisation at runtime which avoids creating - * a stack temporary for known-true package names */ - if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) - S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, OPpMAYBE_TRUEBOOL); - break; + /* check the array is the same on both sides */ + if (oleft->op_type == OP_RV2AV) { + if (oright->op_type != OP_RV2AV + || !cUNOPx(oright)->op_first + || cUNOPx(oright)->op_first->op_type != OP_GV + || cUNOPx(oleft )->op_first->op_type != OP_GV + || cGVOPx_gv(cUNOPx(oleft)->op_first) != + cGVOPx_gv(cUNOPx(oright)->op_first) + ) + return; + } + else if (oright->op_type != OP_PADAV + || oright->op_targ != oleft->op_targ + ) + return; - case OP_LENGTH: - /* see if the op is used in known boolean context, - * but not if OA_TARGLEX optimisation is enabled */ - if ( (o->op_flags & OPf_WANT) == OPf_WANT_SCALAR - && !(o->op_private & OPpTARGET_MY) - ) - S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); - break; + /* This actually is an inplace assignment */ - case OP_POS: - /* see if the op is used in known boolean context */ - if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) - S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); - break; + modop->op_private |= OPpSORT_INPLACE; - case OP_CUSTOM: { - Perl_cpeep_t cpeep = - XopENTRYCUSTOM(o, xop_peep); - if (cpeep) - cpeep(aTHX_ o, oldop); - break; - } + /* transfer MODishness etc from LHS arg to RHS arg */ + oright->op_flags = oleft->op_flags; - } - /* did we just null the current op? If so, re-process it to handle - * eliding "empty" ops from the chain */ - if (o->op_type == OP_NULL && oldop && oldop->op_next == o) { - o->op_opt = 0; - o = oldop; - } - else { - oldoldop = oldop; - oldop = o; - } - } - LEAVE; + /* remove the aassign op and the lhs */ + op_null(o); + op_null(oleft_pushmark); + if (oleft->op_type == OP_RV2AV && cUNOPx(oleft)->op_first) + op_null(cUNOPx(oleft)->op_first); + op_null(oleft); } -void -Perl_peep(pTHX_ OP *o) -{ - CALL_RPEEP(o); -} /* =for apidoc_section $custom @@ -18890,8 +15390,8 @@ Perl_report_redefined_cv(pTHX_ const SV SV * const *new_const_svp) { const char *hvname; - bool is_const = !!CvCONST(old_cv); - SV *old_const_sv = is_const ? cv_const_sv(old_cv) : NULL; + bool is_const = cBOOL(CvCONST(old_cv)); + SV *old_const_sv = is_const ? cv_const_sv_or_av(old_cv) : NULL; PERL_ARGS_ASSERT_REPORT_REDEFINED_CV; @@ -18914,14 +15414,22 @@ Perl_report_redefined_cv(pTHX_ const SV ) || (is_const && ckWARN_d(WARN_REDEFINE) - && (!new_const_svp || sv_cmp(old_const_sv, *new_const_svp)) + && (!new_const_svp || + !*new_const_svp || + !old_const_sv || + SvTYPE(old_const_sv) == SVt_PVAV || + SvTYPE(*new_const_svp) == SVt_PVAV || + sv_cmp(old_const_sv, *new_const_svp)) ) - ) + ) { Perl_warner(aTHX_ packWARN(WARN_REDEFINE), is_const ? "Constant subroutine %" SVf " redefined" - : "Subroutine %" SVf " redefined", + : CvIsMETHOD(old_cv) + ? "Method %" SVf " redefined" + : "Subroutine %" SVf " redefined", SVfARG(name)); + } } /* @@ -19048,20 +15556,155 @@ const_av_xsub(pTHX_ CV* cv) * This is the e implementation for the DUP_WARNINGS() macro */ -STRLEN* -Perl_dup_warnings(pTHX_ STRLEN* warnings) +char * +Perl_dup_warnings(pTHX_ char* warnings) { - Size_t size; - STRLEN *new_warnings; - if (warnings == NULL || specialWARN(warnings)) return warnings; - size = sizeof(*warnings) + *warnings; + return rcpv_copy(warnings); +} + +/* +=for apidoc rcpv_new + +Create a new shared memory refcounted string with the requested size, and +with the requested initialization and a refcount of 1. The actual space +allocated will be 1 byte more than requested and rcpv_new() will ensure that +the extra byte is a null regardless of any flags settings. + +If the RCPVf_NO_COPY flag is set then the pv argument will be +ignored, otherwise the contents of the pv pointer will be copied into +the new buffer or if it is NULL the function will do nothing and return NULL. + +If the RCPVf_USE_STRLEN flag is set then the len argument is ignored and +recomputed using C. It is an error to combine RCPVf_USE_STRLEN +and RCPVf_NO_COPY at the same time. + +Under DEBUGGING rcpv_new() will assert() if it is asked to create a 0 length +shared string unless the RCPVf_ALLOW_EMPTY flag is set. + +The return value from the function is suitable for passing into rcpv_copy() and +rcpv_free(). To access the RCPV * from the returned value use the RCPVx() macro. +The 'len' member of the RCPV struct stores the allocated length (including the +extra byte), but the RCPV_LEN() macro returns the requested length (not +including the extra byte). + +Note that rcpv_new() does NOT use a hash table or anything like that to +dedupe inputs given the same text content. Each call with a non-null pv +parameter will produce a distinct pointer with its own refcount regardless of +the input content. + +=cut +*/ + +char * +Perl_rcpv_new(pTHX_ const char *pv, STRLEN len, U32 flags) { + RCPV *rcpv; + + PERL_ARGS_ASSERT_RCPV_NEW; + + PERL_UNUSED_CONTEXT; + + /* Musn't use both at the same time */ + assert((flags & (RCPVf_NO_COPY|RCPVf_USE_STRLEN))!= + (RCPVf_NO_COPY|RCPVf_USE_STRLEN)); + + if (!pv && (flags & RCPVf_NO_COPY) == 0) + return NULL; + + if (flags & RCPVf_USE_STRLEN) + len = strlen(pv); + + assert(len || (flags & RCPVf_ALLOW_EMPTY)); + + len++; /* add one for the null we will add to the end */ + + rcpv = (RCPV *)PerlMemShared_malloc(sizeof(struct rcpv) + len); + if (!rcpv) + croak_no_mem(); + + rcpv->len = len; /* store length including null, + RCPV_LEN() subtracts 1 to account for this */ + rcpv->refcount = 1; + + if ((flags & RCPVf_NO_COPY) == 0) { + (void)memcpy(rcpv->pv, pv, len-1); + } + rcpv->pv[len-1]= '\0'; /* the last byte should always be null */ + return rcpv->pv; +} + +/* +=for apidoc rcpv_free + +refcount decrement a shared memory refcounted string, and when +the refcount goes to 0 free it using perlmemshared_free(). + +it is the callers responsibility to ensure that the pv is the +result of a rcpv_new() call. + +Always returns NULL so it can be used like this: + + thing = rcpv_free(thing); + +=cut +*/ + +char * +Perl_rcpv_free(pTHX_ char *pv) { + + PERL_ARGS_ASSERT_RCPV_FREE; + + PERL_UNUSED_CONTEXT; + + if (!pv) + return NULL; + RCPV *rcpv = RCPVx(pv); + + assert(rcpv->refcount); + assert(rcpv->len); + + OP_REFCNT_LOCK; + if (--rcpv->refcount == 0) { + rcpv->len = 0; + PerlMemShared_free(rcpv); + } + OP_REFCNT_UNLOCK; + return NULL; +} + +/* +=for apidoc rcpv_copy + +refcount increment a shared memory refcounted string, and when +the refcount goes to 0 free it using PerlMemShared_free(). + +It is the callers responsibility to ensure that the pv is the +result of a rcpv_new() call. + +Returns the same pointer that was passed in. + + new = rcpv_copy(pv); + +=cut +*/ - new_warnings = (STRLEN*)PerlMemShared_malloc(size); - Copy(warnings, new_warnings, size, char); - return new_warnings; + +char * +Perl_rcpv_copy(pTHX_ char *pv) { + + PERL_ARGS_ASSERT_RCPV_COPY; + + PERL_UNUSED_CONTEXT; + + if (!pv) + return NULL; + RCPV *rcpv = RCPVx(pv); + OP_REFCNT_LOCK; + rcpv->refcount++; + OP_REFCNT_UNLOCK; + return pv; } /* Index: gnu/usr.bin/perl/op.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/op.h,v diff -u -p -a -u -p -r1.23 op.h --- gnu/usr.bin/perl/op.h 15 Feb 2023 01:36:13 -0000 1.23 +++ gnu/usr.bin/perl/op.h 21 Feb 2024 15:47:02 -0000 @@ -64,6 +64,14 @@ typedef PERL_BITFIELD16 Optype; U8 op_private; #endif +#define OpTYPE_set(o,type) \ + STMT_START { \ + OP *o_ = (OP *)o; \ + OPCODE type_ = type; \ + o_->op_type = type_; \ + o_->op_ppaddr = PL_ppaddr[type_]; \ + } STMT_END + /* If op_type:9 is changed to :10, also change cx_pusheval() Also, if the type of op_type is ever changed (e.g. to PERL_BITFIELD32) then all the other bit-fields before/after it should change their @@ -153,6 +161,9 @@ Deprecated. Use C instead. /* On OP_DUMP, has no label */ /* On OP_UNSTACK, in a C-style for loop */ /* On OP_READLINE, it's for <<>>, not <> */ + /* On OP_RETURN, module_true is in effect */ + /* On OP_NEXT/OP_LAST/OP_REDO, there is no + * loop label */ /* There is no room in op_flags for this one, so it has its own bit- field member (op_folded) instead. The flag is only used to tell op_convert_list to set op_folded. */ @@ -248,8 +259,7 @@ struct methop { BASEOP union { /* op_u.op_first *must* be aligned the same as the op_first - * field of the other op types, and op_u.op_meth_sv *must* - * be aligned with op_sv */ + * field of the other op types */ OP* op_first; /* optree for method name */ SV* op_meth_sv; /* static method name */ } op_u; @@ -469,6 +479,7 @@ struct loop { #define cPVOP cPVOPx(PL_op) #define cCOP cCOPx(PL_op) #define cLOOP cLOOPx(PL_op) +#define cMETHOP cMETHOPx(PL_op) #define cUNOPo cUNOPx(o) #define cUNOP_AUXo cUNOP_AUXx(o) @@ -481,6 +492,7 @@ struct loop { #define cPVOPo cPVOPx(o) #define cCOPo cCOPx(o) #define cLOOPo cLOOPx(o) +#define cMETHOPo cMETHOPx(o) #define kUNOP cUNOPx(kid) #define kUNOP_AUX cUNOP_AUXx(kid) @@ -493,6 +505,7 @@ struct loop { #define kPVOP cPVOPx(kid) #define kCOP cCOPx(kid) #define kLOOP cLOOPx(kid) +#define kMETHOP cMETHOPx(kid) typedef enum { @@ -514,33 +527,40 @@ typedef enum { #ifdef USE_ITHREADS -# define cGVOPx_gv(o) ((GV*)PAD_SVl(cPADOPx(o)->op_padix)) +# define cGVOPx_gv(o) ((GV*)PAD_SVl(cPADOPx(o)->op_padix)) # ifndef PERL_CORE -# define IS_PADGV(v) (v && isGV(v)) -# define IS_PADCONST(v) \ +# define IS_PADGV(v) (v && isGV(v)) +# define IS_PADCONST(v) \ (v && (SvREADONLY(v) || (SvIsCOW(v) && !SvLEN(v)))) # endif -# define cSVOPx_sv(v) (cSVOPx(v)->op_sv \ +# define cSVOPx_sv(v) (cSVOPx(v)->op_sv \ ? cSVOPx(v)->op_sv : PAD_SVl((v)->op_targ)) -# define cSVOPx_svp(v) (cSVOPx(v)->op_sv \ +# define cSVOPx_svp(v) (cSVOPx(v)->op_sv \ ? &cSVOPx(v)->op_sv : &PAD_SVl((v)->op_targ)) -# define cMETHOPx_rclass(v) PAD_SVl(cMETHOPx(v)->op_rclass_targ) +# define cMETHOPx_meth(v) (cMETHOPx(v)->op_u.op_meth_sv \ + ? cMETHOPx(v)->op_u.op_meth_sv : PAD_SVl((v)->op_targ)) +# define cMETHOPx_rclass(v) PAD_SVl(cMETHOPx(v)->op_rclass_targ) #else -# define cGVOPx_gv(o) ((GV*)cSVOPx(o)->op_sv) +# define cGVOPx_gv(o) ((GV*)cSVOPx(o)->op_sv) # ifndef PERL_CORE -# define IS_PADGV(v) FALSE -# define IS_PADCONST(v) FALSE +# define IS_PADGV(v) FALSE +# define IS_PADCONST(v) FALSE # endif -# define cSVOPx_sv(v) (cSVOPx(v)->op_sv) -# define cSVOPx_svp(v) (&cSVOPx(v)->op_sv) -# define cMETHOPx_rclass(v) (cMETHOPx(v)->op_rclass_sv) +# define cSVOPx_sv(v) (cSVOPx(v)->op_sv) +# define cSVOPx_svp(v) (&cSVOPx(v)->op_sv) +# define cMETHOPx_meth(v) (cMETHOPx(v)->op_u.op_meth_sv) +# define cMETHOPx_rclass(v) (cMETHOPx(v)->op_rclass_sv) #endif -#define cMETHOPx_meth(v) cSVOPx_sv(v) +#define cMETHOP_meth cMETHOPx_meth(PL_op) +#define cMETHOP_rclass cMETHOPx_rclass(PL_op) -#define cGVOP_gv cGVOPx_gv(PL_op) -#define cGVOPo_gv cGVOPx_gv(o) -#define kGVOP_gv cGVOPx_gv(kid) +#define cMETHOPo_meth cMETHOPx_meth(o) +#define cMETHOPo_rclass cMETHOPx_rclass(o) + +#define cGVOP_gv cGVOPx_gv(PL_op) +#define cGVOPo_gv cGVOPx_gv(o) +#define kGVOP_gv cGVOPx_gv(kid) #define cSVOP_sv cSVOPx_sv(PL_op) #define cSVOPo_sv cSVOPx_sv(o) #define kSVOP_sv cSVOPx_sv(kid) @@ -601,6 +621,7 @@ typedef enum { * The same mutex is used to protect the refcounts of the reg_trie_data * and reg_ac_data structures, which are shared between duplicated * regexes. + * The same mutex is used to protect the refcounts for RCPV objects. */ #ifdef USE_ITHREADS @@ -768,29 +789,29 @@ struct block_hooks { =for apidoc mx|U32|BhkFLAGS|BHK *hk Return the BHK's flags. -=for apidoc mxu|void *|BhkENTRY|BHK *hk|which +=for apidoc mxu|void *|BhkENTRY|BHK *hk|token which Return an entry from the BHK structure. C is a preprocessor token indicating which entry to return. If the appropriate flag is not set this will return C. The type of the return value depends on which entry you ask for. -=for apidoc Amxu|void|BhkENTRY_set|BHK *hk|which|void *ptr +=for apidoc Amxu|void|BhkENTRY_set|BHK *hk|token which|void *ptr Set an entry in the BHK structure, and set the flags to indicate it is valid. C is a preprocessing token indicating which entry to set. The type of C depends on the entry. -=for apidoc Amxu|void|BhkDISABLE|BHK *hk|which +=for apidoc Amxu|void|BhkDISABLE|BHK *hk|token which Temporarily disable an entry in this BHK structure, by clearing the appropriate flag. C is a preprocessor token indicating which entry to disable. -=for apidoc Amxu|void|BhkENABLE|BHK *hk|which +=for apidoc Amxu|void|BhkENABLE|BHK *hk|token which Re-enable an entry in this BHK structure, by setting the appropriate flag. C is a preprocessor token indicating which entry to enable. This will assert (under -DDEBUGGING) if the entry doesn't contain a valid pointer. -=for apidoc mxu|void|CALL_BLOCK_HOOKS|which|arg +=for apidoc mxu|void|CALL_BLOCK_HOOKS|token which|arg Call all the registered block hooks for type C. C is a preprocessing token; the type of C depends on C. @@ -866,7 +887,7 @@ preprocessing token; the type of C =for apidoc Am|U32|XopFLAGS|XOP *xop Return the XOP's flags. -=for apidoc Am||XopENTRY|XOP *xop|which +=for apidoc Amu||XopENTRY|XOP *xop|token which Return a member of the XOP structure. C is a cpp token indicating which entry to return. If the member is not set this will return a default value. The return type depends @@ -874,21 +895,21 @@ on C. This macro evaluates its a once. If you are using C to retrieve a C from a C, use the more efficient L instead. -=for apidoc Am||XopENTRYCUSTOM|const OP *o|which +=for apidoc Amu||XopENTRYCUSTOM|const OP *o|token which Exactly like C but more efficient. The C parameter is identical to L. -=for apidoc Am|void|XopENTRY_set|XOP *xop|which|value +=for apidoc Amu|void|XopENTRY_set|XOP *xop|token which|value Set a member of the XOP structure. C is a cpp token indicating which entry to set. See L for details about the available members and how they are used. This macro evaluates its argument more than once. -=for apidoc Am|void|XopDISABLE|XOP *xop|which +=for apidoc Amu|void|XopDISABLE|XOP *xop|token which Temporarily disable a member of the XOP, by clearing the appropriate flag. -=for apidoc Am|void|XopENABLE|XOP *xop|which +=for apidoc Amu|void|XopENABLE|XOP *xop|token which Reenable a member of the XOP which has been disabled. =cut @@ -1148,6 +1169,8 @@ struct op_argcheck_aux { UV opt_params; /* number of optional positional parameters */ char slurpy; /* presence of slurpy: may be '\0', '@' or '%' */ }; + +#define MI_INIT_WORKAROUND_PACK "Module::Install::DSL" /* Index: gnu/usr.bin/perl/op_reg_common.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/op_reg_common.h,v diff -u -p -a -u -p -r1.3 op_reg_common.h --- gnu/usr.bin/perl/op_reg_common.h 15 Feb 2023 01:36:13 -0000 1.3 +++ gnu/usr.bin/perl/op_reg_common.h 21 Feb 2024 15:47:02 -0000 @@ -101,8 +101,20 @@ get_regex_charset(const U32 flags) /* Mask of the above bits. These need to be transferred from op_pmflags to * re->extflags during compilation */ -#define RXf_PMf_COMPILETIME (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_EXTENDED_MORE|RXf_PMf_KEEPCOPY|RXf_PMf_NOCAPTURE|RXf_PMf_CHARSET|RXf_PMf_STRICT) -#define RXf_PMf_FLAGCOPYMASK (RXf_PMf_COMPILETIME|RXf_PMf_SPLIT) +#define RXf_PMf_COMPILETIME \ + ( RXf_PMf_MULTILINE \ + | RXf_PMf_SINGLELINE \ + | RXf_PMf_FOLD \ + | RXf_PMf_EXTENDED \ + | RXf_PMf_EXTENDED_MORE \ + | RXf_PMf_KEEPCOPY \ + | RXf_PMf_NOCAPTURE \ + | RXf_PMf_CHARSET \ + | RXf_PMf_STRICT ) + +#define RXf_PMf_FLAGCOPYMASK \ + ( RXf_PMf_COMPILETIME \ + | RXf_PMf_SPLIT ) /* Temporary to get Jenkins happy again * See thread starting at http://nntp.perl.org/group/perl.perl5.porters/220710 Index: gnu/usr.bin/perl/opcode.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/opcode.h,v diff -u -p -a -u -p -r1.21 opcode.h --- gnu/usr.bin/perl/opcode.h 15 Feb 2023 01:36:13 -0000 1.21 +++ gnu/usr.bin/perl/opcode.h 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * opcode.h * @@ -145,10 +145,7 @@ START_EXTERN_C -#ifndef DOINIT -EXTCONST char* const PL_op_name[]; -#else -EXTCONST char* const PL_op_name[] = { +EXTCONST char* const PL_op_name[] INIT({ "null", "stub", "scalar", @@ -159,6 +156,7 @@ EXTCONST char* const PL_op_name[] = { "gv", "gelem", "padsv", + "padsv_store", "padav", "padhv", "padany", @@ -287,6 +285,7 @@ EXTCONST char* const PL_op_name[] = { "rv2av", "aelemfast", "aelemfast_lex", + "aelemfastlex_store", "aelem", "aslice", "kvaslice", @@ -311,6 +310,7 @@ EXTCONST char* const PL_op_name[] = { "lslice", "anonlist", "anonhash", + "emptyavhv", "splice", "push", "pop", @@ -563,14 +563,14 @@ EXTCONST char* const PL_op_name[] = { "reftype", "ceil", "floor", + "is_tainted", + "helemexistsor", + "methstart", + "initfield", "freed", -}; -#endif +}); -#ifndef DOINIT -EXTCONST char* const PL_op_desc[]; -#else -EXTCONST char* const PL_op_desc[] = { +EXTCONST char* const PL_op_desc[] INIT({ "null operation", "stub", "scalar", @@ -581,6 +581,7 @@ EXTCONST char* const PL_op_desc[] = { "glob value", "glob elem", "private variable", + "padsv scalar assignment", "private array", "private hash", "private value", @@ -709,6 +710,7 @@ EXTCONST char* const PL_op_desc[] = { "array dereference", "constant array element", "constant lexical array element", + "const lexical array element store", "array element", "array slice", "index/value array slice", @@ -733,6 +735,7 @@ EXTCONST char* const PL_op_desc[] = { "list slice", "anonymous array ([])", "anonymous hash ({})", + "empty anon hash/array", "splice", "push", "pop", @@ -985,17 +988,19 @@ EXTCONST char* const PL_op_desc[] = { "reftype", "ceil", "floor", - "freed op", -}; -#endif + "is_tainted", + "hash element exists or", + "method start", + "initialise field", + "freed op", +}); END_EXTERN_C START_EXTERN_C EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */ -#if defined(DOINIT) -= { +INIT({ Perl_pp_null, Perl_pp_stub, Perl_pp_scalar, /* implemented by Perl_pp_null */ @@ -1006,6 +1011,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perl Perl_pp_gv, Perl_pp_gelem, Perl_pp_padsv, + Perl_pp_padsv_store, Perl_pp_padav, Perl_pp_padhv, Perl_pp_padany, /* implemented by Perl_unimplemented_op */ @@ -1134,6 +1140,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perl Perl_pp_rv2av, Perl_pp_aelemfast, Perl_pp_aelemfast_lex, /* implemented by Perl_pp_aelemfast */ + Perl_pp_aelemfastlex_store, Perl_pp_aelem, Perl_pp_aslice, Perl_pp_kvaslice, @@ -1158,6 +1165,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perl Perl_pp_lslice, Perl_pp_anonlist, Perl_pp_anonhash, + Perl_pp_emptyavhv, Perl_pp_splice, Perl_pp_push, Perl_pp_pop, /* implemented by Perl_pp_shift */ @@ -1410,13 +1418,14 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perl Perl_pp_reftype, Perl_pp_ceil, Perl_pp_floor, -} -#endif -; + Perl_pp_is_tainted, + Perl_pp_helemexistsor, + Perl_pp_methstart, + Perl_pp_initfield, +}); EXT Perl_check_t PL_check[] /* or perlvars.h */ -#if defined(DOINIT) -= { +INIT({ Perl_ck_null, /* null */ Perl_ck_null, /* stub */ Perl_ck_fun, /* scalar */ @@ -1427,6 +1436,7 @@ EXT Perl_check_t PL_check[] /* or perlva Perl_ck_null, /* gv */ Perl_ck_null, /* gelem */ Perl_ck_null, /* padsv */ + Perl_ck_sassign, /* padsv_store */ Perl_ck_null, /* padav */ Perl_ck_null, /* padhv */ Perl_ck_null, /* padany */ @@ -1555,6 +1565,7 @@ EXT Perl_check_t PL_check[] /* or perlva Perl_ck_rvconst, /* rv2av */ Perl_ck_null, /* aelemfast */ Perl_ck_null, /* aelemfast_lex */ + Perl_ck_null, /* aelemfastlex_store */ Perl_ck_null, /* aelem */ Perl_ck_null, /* aslice */ Perl_ck_null, /* kvaslice */ @@ -1579,6 +1590,7 @@ EXT Perl_check_t PL_check[] /* or perlva Perl_ck_null, /* lslice */ Perl_ck_fun, /* anonlist */ Perl_ck_fun, /* anonhash */ + Perl_ck_fun, /* emptyavhv */ Perl_ck_fun, /* splice */ Perl_ck_fun, /* push */ Perl_ck_shift, /* pop */ @@ -1831,14 +1843,13 @@ EXT Perl_check_t PL_check[] /* or perlva Perl_ck_null, /* reftype */ Perl_ck_null, /* ceil */ Perl_ck_null, /* floor */ -} -#endif -; + Perl_ck_null, /* is_tainted */ + Perl_ck_helemexistsor, /* helemexistsor */ + Perl_ck_null, /* methstart */ + Perl_ck_null, /* initfield */ +}); -#ifndef DOINIT -EXTCONST U32 PL_opargs[]; -#else -EXTCONST U32 PL_opargs[] = { +EXTCONST U32 PL_opargs[] INIT({ 0x00000000, /* null */ 0x00000000, /* stub */ 0x00001b04, /* scalar */ @@ -1849,6 +1860,7 @@ EXTCONST U32 PL_opargs[] = { 0x00000644, /* gv */ 0x00011244, /* gelem */ 0x00000044, /* padsv */ + 0x00011104, /* padsv_store */ 0x00000040, /* padav */ 0x00000040, /* padhv */ 0x00000040, /* padany */ @@ -1977,6 +1989,7 @@ EXTCONST U32 PL_opargs[] = { 0x00000148, /* rv2av */ 0x00013644, /* aelemfast */ 0x00013040, /* aelemfast_lex */ + 0x00013140, /* aelemfastlex_store */ 0x00013204, /* aelem */ 0x00023401, /* aslice */ 0x00023401, /* kvaslice */ @@ -2001,6 +2014,7 @@ EXTCONST U32 PL_opargs[] = { 0x00224200, /* lslice */ 0x00002405, /* anonlist */ 0x00002405, /* anonhash */ + 0x0000241c, /* emptyavhv */ 0x02993401, /* splice */ 0x0002341d, /* push */ 0x0000bb04, /* pop */ @@ -2244,8 +2258,8 @@ EXTCONST U32 PL_opargs[] = { 0x00000400, /* poptry */ 0x00000300, /* catch */ 0x00000300, /* pushdefer */ - 0x0000011e, /* is_bool */ - 0x0000011e, /* is_weak */ + 0x00000106, /* is_bool */ + 0x00000106, /* is_weak */ 0x00000100, /* weaken */ 0x00000100, /* unweaken */ 0x00000106, /* blessed */ @@ -2253,8 +2267,11 @@ EXTCONST U32 PL_opargs[] = { 0x0000011e, /* reftype */ 0x0000011e, /* ceil */ 0x0000011e, /* floor */ -}; -#endif + 0x00000106, /* is_tainted */ + 0x00011300, /* helemexistsor */ + 0x00000f00, /* methstart */ + 0x00000f00, /* initfield */ +}); END_EXTERN_C @@ -2274,6 +2291,7 @@ END_EXTERN_C #define OPpEVAL_HAS_HH 0x02 #define OPpFT_ACCESS 0x02 #define OPpHINT_STRICT_REFS 0x02 +#define OPpINITFIELD_AV 0x02 #define OPpITER_REVERSED 0x02 #define OPpSORT_INTEGER 0x02 #define OPpTRANS_USE_SVOP 0x02 @@ -2286,6 +2304,7 @@ END_EXTERN_C #define OPpENTERSUB_HASTARG 0x04 #define OPpEVAL_UNICODE 0x04 #define OPpFT_STACKED 0x04 +#define OPpINITFIELD_HV 0x04 #define OPpLVREF_ELEM 0x04 #define OPpSLICEWARNING 0x04 #define OPpSORT_REVERSE 0x04 @@ -2324,6 +2343,7 @@ END_EXTERN_C #define OPpASSIGN_COMMON_RC1 0x20 #define OPpDEREF_HV 0x20 #define OPpEARLY_CV 0x20 +#define OPpEMPTYAVHV_IS_HV 0x20 #define OPpEVAL_RE_REPARSING 0x20 #define OPpHUSH_VMSISH 0x20 #define OPpKVSLICE 0x20 @@ -2334,17 +2354,20 @@ END_EXTERN_C #define OPpOPEN_IN_CRLF 0x20 #define OPpTRANS_COMPLEMENT 0x20 #define OPpTRUEBOOL 0x20 +#define OPpUNDEF_KEEP_PV 0x20 #define OPpDEREF 0x30 #define OPpDEREF_SV 0x30 #define OPpLVREF_CV 0x30 #define OPpLVREF_TYPE 0x30 #define OPpALLOW_FAKE 0x40 +#define OPpARG_IF_FALSE 0x40 #define OPpASSIGN_BACKWARDS 0x40 #define OPpASSIGN_COMMON_SCALAR 0x40 #define OPpCONCAT_NESTED 0x40 #define OPpCONST_BARE 0x40 #define OPpCOREARGS_SCALARMOD 0x40 #define OPpENTERSUB_DB 0x40 +#define OPpEVAL_EVALSV 0x40 #define OPpEXISTS_SUB 0x40 #define OPpFLIP_LINENUM 0x40 #define OPpINDEX_BOOLNEG 0x40 @@ -2359,10 +2382,13 @@ END_EXTERN_C #define OPpSLICE 0x40 #define OPpTRANS_GROWS 0x40 #define OPpPADRANGE_COUNTMASK 0x7f +#define OPpARG_IF_UNDEF 0x80 #define OPpASSIGN_CV_TO_GV 0x80 #define OPpCOREARGS_PUSHMARK 0x80 #define OPpDEFER_FINALLY 0x80 #define OPpENTERSUB_NOPAREN 0x80 +#define OPpHELEMEXISTSOR_DELETE 0x80 +#define OPpINITFIELDS 0x80 #define OPpLVALUE 0x80 #define OPpLVAL_INTRO 0x80 #define OPpOFFBYONE 0x80 @@ -2394,6 +2420,7 @@ EXTCONST char PL_op_private_labels[] = { '+','1','\0', '-','\0', 'A','M','P','E','R','\0', + 'A','N','O','N','H','A','S','H','\0', 'A','P','P','E','N','D','\0', 'A','S','S','I','G','N','\0', 'A','V','\0', @@ -2425,6 +2452,7 @@ EXTCONST char PL_op_private_labels[] = { 'E','A','R','L','Y','C','V','\0', 'E','L','E','M','\0', 'E','N','T','E','R','E','D','\0', + 'E','V','A','L','S','V','\0', 'E','X','I','S','T','S','\0', 'F','A','K','E','\0', 'F','I','N','A','L','L','Y','\0', @@ -2438,13 +2466,19 @@ EXTCONST char PL_op_private_labels[] = { 'H','U','S','H','\0', 'H','V','\0', 'I','D','E','N','T','\0', + 'I','F','_','F','A','L','S','E','\0', + 'I','F','_','U','N','D','E','F','\0', 'I','M','P','L','I','M','\0', 'I','N','A','R','G','S','\0', 'I','N','B','I','N','\0', 'I','N','C','R','\0', + 'I','N','I','T','F','I','E','L','D','S','\0', + 'I','N','I','T','F','I','E','L','D','_','A','V','\0', + 'I','N','I','T','F','I','E','L','D','_','H','V','\0', 'I','N','P','L','A','C','E','\0', 'I','N','T','\0', 'I','T','E','R','\0', + 'K','E','E','P','_','P','V','\0', 'K','E','Y','S','\0', 'K','V','S','L','I','C','E','\0', 'L','E','X','\0', @@ -2504,14 +2538,14 @@ EXTCONST char PL_op_private_labels[] = { EXTCONST I16 PL_op_private_bitfields[] = { 0, 8, -1, 0, 8, -1, - 0, 596, -1, + 0, 675, -1, 0, 8, -1, 0, 8, -1, - 0, 603, -1, - 0, 592, -1, - 1, -1, 0, 553, 1, 30, 2, 303, -1, - 4, -1, 1, 176, 2, 183, 3, 190, -1, - 4, -1, 0, 553, 1, 30, 2, 303, 3, 122, -1, + 0, 682, -1, + 0, 671, -1, + 1, -1, 0, 632, 1, 39, 2, 319, -1, + 4, -1, 1, 185, 2, 192, 3, 199, -1, + 4, -1, 0, 632, 1, 39, 2, 319, 3, 131, -1, }; @@ -2530,21 +2564,22 @@ EXTCONST I16 PL_op_private_bitdef_ix[] 11, /* gv */ 12, /* gelem */ 13, /* padsv */ - 16, /* padav */ - 21, /* padhv */ + 16, /* padsv_store */ + 19, /* padav */ + 24, /* padhv */ -1, /* padany */ - 28, /* rv2gv */ - 35, /* rv2sv */ - 40, /* av2arylen */ - 42, /* rv2cv */ + 31, /* rv2gv */ + 38, /* rv2sv */ + 43, /* av2arylen */ + 45, /* rv2cv */ -1, /* anoncode */ 0, /* prototype */ 0, /* refgen */ 0, /* srefgen */ - 49, /* ref */ - 52, /* bless */ - 53, /* backtick */ - 52, /* glob */ + 52, /* ref */ + 55, /* bless */ + 56, /* backtick */ + 55, /* glob */ 0, /* readline */ -1, /* rcatline */ 0, /* regcmaybe */ @@ -2552,20 +2587,20 @@ EXTCONST I16 PL_op_private_bitdef_ix[] 0, /* regcomp */ -1, /* match */ -1, /* qr */ - 58, /* subst */ + 61, /* subst */ 0, /* substcont */ - 59, /* trans */ - 59, /* transr */ - 66, /* sassign */ - 69, /* aassign */ + 62, /* trans */ + 62, /* transr */ + 69, /* sassign */ + 72, /* aassign */ 0, /* chop */ 0, /* schop */ - 75, /* chomp */ - 75, /* schomp */ + 78, /* chomp */ + 78, /* schomp */ 0, /* defined */ - 0, /* undef */ + 80, /* undef */ 0, /* study */ - 77, /* pos */ + 85, /* pos */ 0, /* preinc */ 0, /* i_preinc */ 0, /* predec */ @@ -2574,23 +2609,23 @@ EXTCONST I16 PL_op_private_bitdef_ix[] 0, /* i_postinc */ 0, /* postdec */ 0, /* i_postdec */ - 80, /* pow */ - 80, /* multiply */ - 80, /* i_multiply */ - 80, /* divide */ - 80, /* i_divide */ - 80, /* modulo */ - 80, /* i_modulo */ - 82, /* repeat */ - 80, /* add */ - 80, /* i_add */ - 80, /* subtract */ - 80, /* i_subtract */ - 84, /* concat */ - 87, /* multiconcat */ - 93, /* stringify */ - 95, /* left_shift */ - 95, /* right_shift */ + 88, /* pow */ + 88, /* multiply */ + 88, /* i_multiply */ + 88, /* divide */ + 88, /* i_divide */ + 88, /* modulo */ + 88, /* i_modulo */ + 90, /* repeat */ + 88, /* add */ + 88, /* i_add */ + 88, /* subtract */ + 88, /* i_subtract */ + 92, /* concat */ + 95, /* multiconcat */ + 101, /* stringify */ + 103, /* left_shift */ + 103, /* right_shift */ 12, /* lt */ 12, /* i_lt */ 12, /* gt */ @@ -2612,126 +2647,128 @@ EXTCONST I16 PL_op_private_bitdef_ix[] 12, /* seq */ 12, /* sne */ 12, /* scmp */ - 97, /* bit_and */ - 97, /* bit_xor */ - 97, /* bit_or */ - 95, /* nbit_and */ - 95, /* nbit_xor */ - 95, /* nbit_or */ - 97, /* sbit_and */ - 97, /* sbit_xor */ - 97, /* sbit_or */ + 105, /* bit_and */ + 105, /* bit_xor */ + 105, /* bit_or */ + 103, /* nbit_and */ + 103, /* nbit_xor */ + 103, /* nbit_or */ + 105, /* sbit_and */ + 105, /* sbit_xor */ + 105, /* sbit_or */ 0, /* negate */ 0, /* i_negate */ 0, /* not */ - 97, /* complement */ - 95, /* ncomplement */ - 75, /* scomplement */ + 105, /* complement */ + 103, /* ncomplement */ + 78, /* scomplement */ 12, /* smartmatch */ - 93, /* atan2 */ - 75, /* sin */ - 75, /* cos */ - 93, /* rand */ - 93, /* srand */ - 75, /* exp */ - 75, /* log */ - 75, /* sqrt */ - 75, /* int */ - 75, /* hex */ - 75, /* oct */ - 75, /* abs */ - 98, /* length */ - 101, /* substr */ - 104, /* vec */ - 106, /* index */ - 106, /* rindex */ - 52, /* sprintf */ - 52, /* formline */ - 75, /* ord */ - 75, /* chr */ - 93, /* crypt */ + 101, /* atan2 */ + 78, /* sin */ + 78, /* cos */ + 101, /* rand */ + 101, /* srand */ + 78, /* exp */ + 78, /* log */ + 78, /* sqrt */ + 78, /* int */ + 78, /* hex */ + 78, /* oct */ + 78, /* abs */ + 106, /* length */ + 109, /* substr */ + 112, /* vec */ + 114, /* index */ + 114, /* rindex */ + 55, /* sprintf */ + 55, /* formline */ + 78, /* ord */ + 78, /* chr */ + 101, /* crypt */ 0, /* ucfirst */ 0, /* lcfirst */ 0, /* uc */ 0, /* lc */ 0, /* quotemeta */ - 110, /* rv2av */ - 117, /* aelemfast */ - 117, /* aelemfast_lex */ - 118, /* aelem */ - 123, /* aslice */ - 126, /* kvaslice */ + 118, /* rv2av */ + 125, /* aelemfast */ + 125, /* aelemfast_lex */ + 125, /* aelemfastlex_store */ + 126, /* aelem */ + 131, /* aslice */ + 134, /* kvaslice */ 0, /* aeach */ 0, /* avalues */ - 40, /* akeys */ + 43, /* akeys */ 0, /* each */ - 40, /* values */ - 40, /* keys */ - 127, /* delete */ - 131, /* exists */ - 133, /* rv2hv */ - 118, /* helem */ - 123, /* hslice */ - 126, /* kvhslice */ - 141, /* multideref */ - 52, /* unpack */ - 52, /* pack */ - 148, /* split */ - 52, /* join */ - 153, /* list */ + 43, /* values */ + 43, /* keys */ + 135, /* delete */ + 139, /* exists */ + 141, /* rv2hv */ + 126, /* helem */ + 131, /* hslice */ + 134, /* kvhslice */ + 149, /* multideref */ + 55, /* unpack */ + 55, /* pack */ + 156, /* split */ + 55, /* join */ + 161, /* list */ 12, /* lslice */ - 52, /* anonlist */ - 52, /* anonhash */ - 52, /* splice */ - 93, /* push */ + 55, /* anonlist */ + 55, /* anonhash */ + 163, /* emptyavhv */ + 55, /* splice */ + 101, /* push */ 0, /* pop */ 0, /* shift */ - 93, /* unshift */ - 155, /* sort */ - 160, /* reverse */ + 101, /* unshift */ + 168, /* sort */ + 173, /* reverse */ 0, /* grepstart */ - 162, /* grepwhile */ + 175, /* grepwhile */ 0, /* mapstart */ 0, /* mapwhile */ 0, /* range */ - 164, /* flip */ - 164, /* flop */ + 177, /* flip */ + 177, /* flop */ 0, /* and */ 0, /* or */ 12, /* xor */ 0, /* dor */ - 166, /* cond_expr */ + 179, /* cond_expr */ 0, /* andassign */ 0, /* orassign */ 0, /* dorassign */ - 168, /* entersub */ - 175, /* leavesub */ - 175, /* leavesublv */ + 181, /* entersub */ + 188, /* leavesub */ + 188, /* leavesublv */ 0, /* argcheck */ - 177, /* argelem */ - 0, /* argdefelem */ - 179, /* caller */ - 52, /* warn */ - 52, /* die */ - 52, /* reset */ + 190, /* argelem */ + 192, /* argdefelem */ + 195, /* caller */ + 55, /* warn */ + 55, /* die */ + 55, /* reset */ -1, /* lineseq */ - 181, /* nextstate */ - 181, /* dbstate */ + 197, /* nextstate */ + 197, /* dbstate */ -1, /* unstack */ -1, /* enter */ - 182, /* leave */ + 198, /* leave */ -1, /* scope */ - 184, /* enteriter */ - 188, /* iter */ + 200, /* enteriter */ + 204, /* iter */ -1, /* enterloop */ - 189, /* leaveloop */ + 205, /* leaveloop */ -1, /* return */ - 191, /* last */ - 191, /* next */ - 191, /* redo */ - 191, /* dump */ - 191, /* goto */ - 52, /* exit */ + 207, /* last */ + 207, /* next */ + 207, /* redo */ + 207, /* dump */ + 207, /* goto */ + 55, /* exit */ 0, /* method */ 0, /* method_named */ 0, /* method_super */ @@ -2743,143 +2780,143 @@ EXTCONST I16 PL_op_private_bitdef_ix[] 0, /* leavewhen */ -1, /* break */ -1, /* continue */ - 193, /* open */ - 52, /* close */ - 52, /* pipe_op */ - 52, /* fileno */ - 52, /* umask */ - 52, /* binmode */ - 52, /* tie */ + 209, /* open */ + 55, /* close */ + 55, /* pipe_op */ + 55, /* fileno */ + 55, /* umask */ + 55, /* binmode */ + 55, /* tie */ 0, /* untie */ 0, /* tied */ - 52, /* dbmopen */ + 55, /* dbmopen */ 0, /* dbmclose */ - 52, /* sselect */ - 52, /* select */ - 52, /* getc */ - 52, /* read */ - 52, /* enterwrite */ - 175, /* leavewrite */ + 55, /* sselect */ + 55, /* select */ + 55, /* getc */ + 55, /* read */ + 55, /* enterwrite */ + 188, /* leavewrite */ -1, /* prtf */ -1, /* print */ -1, /* say */ - 52, /* sysopen */ - 52, /* sysseek */ - 52, /* sysread */ - 52, /* syswrite */ - 52, /* eof */ - 52, /* tell */ - 52, /* seek */ - 52, /* truncate */ - 52, /* fcntl */ - 52, /* ioctl */ - 93, /* flock */ - 52, /* send */ - 52, /* recv */ - 52, /* socket */ - 52, /* sockpair */ - 52, /* bind */ - 52, /* connect */ - 52, /* listen */ - 52, /* accept */ - 52, /* shutdown */ - 52, /* gsockopt */ - 52, /* ssockopt */ + 55, /* sysopen */ + 55, /* sysseek */ + 55, /* sysread */ + 55, /* syswrite */ + 55, /* eof */ + 55, /* tell */ + 55, /* seek */ + 55, /* truncate */ + 55, /* fcntl */ + 55, /* ioctl */ + 101, /* flock */ + 55, /* send */ + 55, /* recv */ + 55, /* socket */ + 55, /* sockpair */ + 55, /* bind */ + 55, /* connect */ + 55, /* listen */ + 55, /* accept */ + 55, /* shutdown */ + 55, /* gsockopt */ + 55, /* ssockopt */ 0, /* getsockname */ 0, /* getpeername */ 0, /* lstat */ 0, /* stat */ - 198, /* ftrread */ - 198, /* ftrwrite */ - 198, /* ftrexec */ - 198, /* fteread */ - 198, /* ftewrite */ - 198, /* fteexec */ - 203, /* ftis */ - 203, /* ftsize */ - 203, /* ftmtime */ - 203, /* ftatime */ - 203, /* ftctime */ - 203, /* ftrowned */ - 203, /* fteowned */ - 203, /* ftzero */ - 203, /* ftsock */ - 203, /* ftchr */ - 203, /* ftblk */ - 203, /* ftfile */ - 203, /* ftdir */ - 203, /* ftpipe */ - 203, /* ftsuid */ - 203, /* ftsgid */ - 203, /* ftsvtx */ - 203, /* ftlink */ - 203, /* fttty */ - 203, /* fttext */ - 203, /* ftbinary */ - 93, /* chdir */ - 93, /* chown */ - 75, /* chroot */ - 93, /* unlink */ - 93, /* chmod */ - 93, /* utime */ - 93, /* rename */ - 93, /* link */ - 93, /* symlink */ + 214, /* ftrread */ + 214, /* ftrwrite */ + 214, /* ftrexec */ + 214, /* fteread */ + 214, /* ftewrite */ + 214, /* fteexec */ + 219, /* ftis */ + 219, /* ftsize */ + 219, /* ftmtime */ + 219, /* ftatime */ + 219, /* ftctime */ + 219, /* ftrowned */ + 219, /* fteowned */ + 219, /* ftzero */ + 219, /* ftsock */ + 219, /* ftchr */ + 219, /* ftblk */ + 219, /* ftfile */ + 219, /* ftdir */ + 219, /* ftpipe */ + 219, /* ftsuid */ + 219, /* ftsgid */ + 219, /* ftsvtx */ + 219, /* ftlink */ + 219, /* fttty */ + 219, /* fttext */ + 219, /* ftbinary */ + 101, /* chdir */ + 101, /* chown */ + 78, /* chroot */ + 101, /* unlink */ + 101, /* chmod */ + 101, /* utime */ + 101, /* rename */ + 101, /* link */ + 101, /* symlink */ 0, /* readlink */ - 93, /* mkdir */ - 75, /* rmdir */ - 52, /* open_dir */ + 101, /* mkdir */ + 78, /* rmdir */ + 55, /* open_dir */ 0, /* readdir */ 0, /* telldir */ - 52, /* seekdir */ + 55, /* seekdir */ 0, /* rewinddir */ 0, /* closedir */ -1, /* fork */ - 207, /* wait */ - 93, /* waitpid */ - 93, /* system */ - 93, /* exec */ - 93, /* kill */ - 207, /* getppid */ - 93, /* getpgrp */ - 93, /* setpgrp */ - 93, /* getpriority */ - 93, /* setpriority */ - 207, /* time */ + 223, /* wait */ + 101, /* waitpid */ + 101, /* system */ + 101, /* exec */ + 101, /* kill */ + 223, /* getppid */ + 101, /* getpgrp */ + 101, /* setpgrp */ + 101, /* getpriority */ + 101, /* setpriority */ + 223, /* time */ -1, /* tms */ 0, /* localtime */ - 52, /* gmtime */ + 55, /* gmtime */ 0, /* alarm */ - 93, /* sleep */ - 52, /* shmget */ - 52, /* shmctl */ - 52, /* shmread */ - 52, /* shmwrite */ - 52, /* msgget */ - 52, /* msgctl */ - 52, /* msgsnd */ - 52, /* msgrcv */ - 52, /* semop */ - 52, /* semget */ - 52, /* semctl */ + 101, /* sleep */ + 55, /* shmget */ + 55, /* shmctl */ + 55, /* shmread */ + 55, /* shmwrite */ + 55, /* msgget */ + 55, /* msgctl */ + 55, /* msgsnd */ + 55, /* msgrcv */ + 55, /* semop */ + 55, /* semget */ + 55, /* semctl */ 0, /* require */ 0, /* dofile */ -1, /* hintseval */ - 208, /* entereval */ - 175, /* leaveeval */ + 224, /* entereval */ + 188, /* leaveeval */ 0, /* entertry */ -1, /* leavetry */ 0, /* ghbyname */ - 52, /* ghbyaddr */ + 55, /* ghbyaddr */ -1, /* ghostent */ 0, /* gnbyname */ - 52, /* gnbyaddr */ + 55, /* gnbyaddr */ -1, /* gnetent */ 0, /* gpbyname */ - 52, /* gpbynumber */ + 55, /* gpbynumber */ -1, /* gprotoent */ - 52, /* gsbyname */ - 52, /* gsbyport */ + 55, /* gsbyname */ + 55, /* gsbyport */ -1, /* gservent */ 0, /* shostent */ 0, /* snetent */ @@ -2900,22 +2937,22 @@ EXTCONST I16 PL_op_private_bitdef_ix[] -1, /* sgrent */ -1, /* egrent */ -1, /* getlogin */ - 52, /* syscall */ + 55, /* syscall */ 0, /* lock */ 0, /* once */ -1, /* custom */ - 214, /* coreargs */ - 218, /* avhvswitch */ + 231, /* coreargs */ + 235, /* avhvswitch */ 3, /* runcv */ 0, /* fc */ -1, /* padcv */ -1, /* introcv */ -1, /* clonecv */ - 220, /* padrange */ - 222, /* refassign */ - 228, /* lvref */ - 234, /* lvrefslice */ - 235, /* lvavref */ + 237, /* padrange */ + 239, /* refassign */ + 245, /* lvref */ + 251, /* lvrefslice */ + 16, /* lvavref */ 0, /* anonconst */ 12, /* isa */ 0, /* cmpchain_and */ @@ -2924,16 +2961,20 @@ EXTCONST I16 PL_op_private_bitdef_ix[] -1, /* leavetrycatch */ -1, /* poptry */ 0, /* catch */ - 238, /* pushdefer */ - 75, /* is_bool */ - 75, /* is_weak */ + 252, /* pushdefer */ + 0, /* is_bool */ + 0, /* is_weak */ 0, /* weaken */ 0, /* unweaken */ - 49, /* blessed */ - 75, /* refaddr */ - 75, /* reftype */ - 75, /* ceil */ - 75, /* floor */ + 52, /* blessed */ + 78, /* refaddr */ + 78, /* reftype */ + 78, /* ceil */ + 78, /* floor */ + 0, /* is_tainted */ + 254, /* helemexistsor */ + 256, /* methstart */ + 258, /* initfield */ }; @@ -2952,79 +2993,85 @@ EXTCONST I16 PL_op_private_bitdef_ix[] */ EXTCONST U16 PL_op_private_bitdefs[] = { - 0x0003, /* scalar, prototype, refgen, srefgen, readline, regcmaybe, regcreset, regcomp, substcont, chop, schop, defined, undef, study, preinc, i_preinc, predec, i_predec, postinc, i_postinc, postdec, i_postdec, negate, i_negate, not, ucfirst, lcfirst, uc, lc, quotemeta, aeach, avalues, each, pop, shift, grepstart, mapstart, mapwhile, range, and, or, dor, andassign, orassign, dorassign, argcheck, argdefelem, method, method_named, method_super, method_redir, method_redir_super, entergiven, leavegiven, enterwhen, leavewhen, untie, tied, dbmclose, getsockname, getpeername, lstat, stat, readlink, readdir, telldir, rewinddir, closedir, localtime, alarm, require, dofile, entertry, ghbyname, gnbyname, gpbyname, shostent, snetent, sprotoent, sservent, gpwnam, gpwuid, ggrnam, ggrgid, lock, once, fc, anonconst, cmpchain_and, cmpchain_dup, entertrycatch, catch, weaken, unweaken */ - 0x30dc, 0x41d9, /* pushmark */ + 0x0003, /* scalar, prototype, refgen, srefgen, readline, regcmaybe, regcreset, regcomp, substcont, chop, schop, defined, study, preinc, i_preinc, predec, i_predec, postinc, i_postinc, postdec, i_postdec, negate, i_negate, not, ucfirst, lcfirst, uc, lc, quotemeta, aeach, avalues, each, pop, shift, grepstart, mapstart, mapwhile, range, and, or, dor, andassign, orassign, dorassign, argcheck, method, method_named, method_super, method_redir, method_redir_super, entergiven, leavegiven, enterwhen, leavewhen, untie, tied, dbmclose, getsockname, getpeername, lstat, stat, readlink, readdir, telldir, rewinddir, closedir, localtime, alarm, require, dofile, entertry, ghbyname, gnbyname, gpbyname, shostent, snetent, sprotoent, sservent, gpwnam, gpwuid, ggrnam, ggrgid, lock, once, fc, anonconst, cmpchain_and, cmpchain_dup, entertrycatch, catch, is_bool, is_weak, weaken, unweaken, is_tainted */ + 0x3abc, 0x4bb9, /* pushmark */ 0x00bd, /* wantarray, runcv */ - 0x0438, 0x1a50, 0x428c, 0x3e28, 0x3605, /* const */ - 0x30dc, 0x3759, /* gvsv */ - 0x18b5, /* gv */ + 0x0558, 0x1b70, 0x4c6c, 0x4808, 0x3fe5, /* const */ + 0x3abc, 0x4139, /* gvsv */ + 0x19d5, /* gv */ 0x0067, /* gelem, lt, i_lt, gt, i_gt, le, i_le, ge, i_ge, eq, i_eq, ne, i_ne, ncmp, i_ncmp, slt, sgt, sle, sge, seq, sne, scmp, smartmatch, lslice, xor, isa */ - 0x30dc, 0x41d8, 0x03d7, /* padsv */ - 0x30dc, 0x41d8, 0x05b4, 0x31cc, 0x3fa9, /* padav */ - 0x30dc, 0x41d8, 0x05b4, 0x0650, 0x31cc, 0x3fa8, 0x2c41, /* padhv */ - 0x30dc, 0x1c38, 0x03d6, 0x31cc, 0x3528, 0x4284, 0x0003, /* rv2gv */ - 0x30dc, 0x3758, 0x03d6, 0x4284, 0x0003, /* rv2sv */ - 0x31cc, 0x0003, /* av2arylen, akeys, values, keys */ - 0x349c, 0x1078, 0x0dd4, 0x014c, 0x4588, 0x4284, 0x0003, /* rv2cv */ - 0x05b4, 0x0650, 0x0003, /* ref, blessed */ + 0x3abc, 0x4bb8, 0x03d7, /* padsv */ + 0x3abc, 0x4bb8, 0x0003, /* padsv_store, lvavref */ + 0x3abc, 0x4bb8, 0x06d4, 0x3bac, 0x4989, /* padav */ + 0x3abc, 0x4bb8, 0x06d4, 0x0770, 0x3bac, 0x4988, 0x3621, /* padhv */ + 0x3abc, 0x1e38, 0x03d6, 0x3bac, 0x3f08, 0x4c64, 0x0003, /* rv2gv */ + 0x3abc, 0x4138, 0x03d6, 0x4c64, 0x0003, /* rv2sv */ + 0x3bac, 0x0003, /* av2arylen, akeys, values, keys */ + 0x3e7c, 0x1198, 0x0ef4, 0x014c, 0x4f68, 0x4c64, 0x0003, /* rv2cv */ + 0x06d4, 0x0770, 0x0003, /* ref, blessed */ 0x018f, /* bless, glob, sprintf, formline, unpack, pack, join, anonlist, anonhash, splice, warn, die, reset, exit, close, pipe_op, fileno, umask, binmode, tie, dbmopen, sselect, select, getc, read, enterwrite, sysopen, sysseek, sysread, syswrite, eof, tell, seek, truncate, fcntl, ioctl, send, recv, socket, sockpair, bind, connect, listen, accept, shutdown, gsockopt, ssockopt, open_dir, seekdir, gmtime, shmget, shmctl, shmread, shmwrite, msgget, msgctl, msgsnd, msgrcv, semop, semget, semctl, ghbyaddr, gnbyaddr, gpbynumber, gsbyname, gsbyport, syscall */ - 0x393c, 0x3858, 0x2994, 0x28d0, 0x0003, /* backtick */ - 0x05b5, /* subst */ - 0x117c, 0x22b8, 0x09b4, 0x40ec, 0x2648, 0x4864, 0x07c1, /* trans, transr */ - 0x0fbc, 0x04d8, 0x0067, /* sassign */ - 0x0c78, 0x0b74, 0x0a70, 0x31cc, 0x05a8, 0x0067, /* aassign */ - 0x4630, 0x0003, /* chomp, schomp, scomplement, sin, cos, exp, log, sqrt, int, hex, oct, abs, ord, chr, chroot, rmdir, is_bool, is_weak, refaddr, reftype, ceil, floor */ - 0x05b4, 0x31cc, 0x0003, /* pos */ - 0x4630, 0x0067, /* pow, multiply, i_multiply, divide, i_divide, modulo, i_modulo, add, i_add, subtract, i_subtract */ - 0x1538, 0x0067, /* repeat */ - 0x33b8, 0x4630, 0x0067, /* concat */ - 0x30dc, 0x0218, 0x1c34, 0x4630, 0x436c, 0x0003, /* multiconcat */ - 0x4630, 0x018f, /* stringify, atan2, rand, srand, crypt, push, unshift, flock, chdir, chown, unlink, chmod, utime, rename, link, symlink, mkdir, waitpid, system, exec, kill, getpgrp, setpgrp, getpriority, setpriority, sleep */ - 0x4630, 0x4789, /* left_shift, right_shift, nbit_and, nbit_xor, nbit_or, ncomplement */ - 0x4789, /* bit_and, bit_xor, bit_or, sbit_and, sbit_xor, sbit_or, complement */ - 0x05b4, 0x4630, 0x0003, /* length */ - 0x3b90, 0x31cc, 0x012b, /* substr */ - 0x31cc, 0x0067, /* vec */ - 0x3338, 0x05b4, 0x4630, 0x018f, /* index, rindex */ - 0x30dc, 0x3758, 0x05b4, 0x31cc, 0x3fa8, 0x4284, 0x0003, /* rv2av */ - 0x025f, /* aelemfast, aelemfast_lex */ - 0x30dc, 0x2fd8, 0x03d6, 0x31cc, 0x0067, /* aelem, helem */ - 0x30dc, 0x31cc, 0x3fa9, /* aslice, hslice */ - 0x31cd, /* kvaslice, kvhslice */ - 0x30dc, 0x3ef8, 0x2cf4, 0x0003, /* delete */ - 0x44b8, 0x0003, /* exists */ - 0x30dc, 0x3758, 0x05b4, 0x0650, 0x31cc, 0x3fa8, 0x4284, 0x2c41, /* rv2hv */ - 0x30dc, 0x2fd8, 0x11f4, 0x1b50, 0x31cc, 0x4284, 0x0003, /* multideref */ - 0x30dc, 0x3758, 0x02f0, 0x2dec, 0x2709, /* split */ - 0x30dc, 0x2379, /* list */ - 0x1490, 0x2a2c, 0x3c88, 0x2b24, 0x36c1, /* sort */ - 0x2a2c, 0x0003, /* reverse */ - 0x05b4, 0x0003, /* grepwhile */ - 0x2e78, 0x0003, /* flip, flop */ - 0x30dc, 0x0003, /* cond_expr */ - 0x30dc, 0x1078, 0x03d6, 0x014c, 0x4588, 0x4284, 0x27e1, /* entersub */ - 0x39f8, 0x0003, /* leavesub, leavesublv, leavewrite, leaveeval */ + 0x431c, 0x4238, 0x2dd4, 0x2d10, 0x0003, /* backtick */ + 0x06d5, /* subst */ + 0x129c, 0x24b8, 0x0ad4, 0x4acc, 0x2848, 0x5244, 0x08e1, /* trans, transr */ + 0x10dc, 0x05f8, 0x0067, /* sassign */ + 0x0d98, 0x0c94, 0x0b90, 0x3bac, 0x06c8, 0x0067, /* aassign */ + 0x5010, 0x0003, /* chomp, schomp, scomplement, sin, cos, exp, log, sqrt, int, hex, oct, abs, ord, chr, chroot, rmdir, refaddr, reftype, ceil, floor */ + 0x3abc, 0x4bb8, 0x3534, 0x5010, 0x0003, /* undef */ + 0x06d4, 0x3bac, 0x0003, /* pos */ + 0x5010, 0x0067, /* pow, multiply, i_multiply, divide, i_divide, modulo, i_modulo, add, i_add, subtract, i_subtract */ + 0x1658, 0x0067, /* repeat */ + 0x3d98, 0x5010, 0x0067, /* concat */ + 0x3abc, 0x0338, 0x1e34, 0x5010, 0x4d4c, 0x0003, /* multiconcat */ + 0x5010, 0x018f, /* stringify, atan2, rand, srand, crypt, push, unshift, flock, chdir, chown, unlink, chmod, utime, rename, link, symlink, mkdir, waitpid, system, exec, kill, getpgrp, setpgrp, getpriority, setpriority, sleep */ + 0x5010, 0x5169, /* left_shift, right_shift, nbit_and, nbit_xor, nbit_or, ncomplement */ + 0x5169, /* bit_and, bit_xor, bit_or, sbit_and, sbit_xor, sbit_or, complement */ + 0x06d4, 0x5010, 0x0003, /* length */ + 0x4570, 0x3bac, 0x012b, /* substr */ + 0x3bac, 0x0067, /* vec */ + 0x3d18, 0x06d4, 0x5010, 0x018f, /* index, rindex */ + 0x3abc, 0x4138, 0x06d4, 0x3bac, 0x4988, 0x4c64, 0x0003, /* rv2av */ + 0x025f, /* aelemfast, aelemfast_lex, aelemfastlex_store */ + 0x3abc, 0x39b8, 0x03d6, 0x3bac, 0x0067, /* aelem, helem */ + 0x3abc, 0x3bac, 0x4989, /* aslice, hslice */ + 0x3bad, /* kvaslice, kvhslice */ + 0x3abc, 0x48d8, 0x36d4, 0x0003, /* delete */ + 0x4e98, 0x0003, /* exists */ + 0x3abc, 0x4138, 0x06d4, 0x0770, 0x3bac, 0x4988, 0x4c64, 0x3621, /* rv2hv */ + 0x3abc, 0x39b8, 0x1314, 0x1d50, 0x3bac, 0x4c64, 0x0003, /* multideref */ + 0x3abc, 0x4138, 0x0410, 0x37cc, 0x2b49, /* split */ + 0x3abc, 0x2579, /* list */ + 0x3abc, 0x4bb8, 0x0214, 0x5010, 0x018f, /* emptyavhv */ + 0x15b0, 0x330c, 0x4668, 0x3404, 0x40a1, /* sort */ + 0x330c, 0x0003, /* reverse */ + 0x06d4, 0x0003, /* grepwhile */ + 0x3858, 0x0003, /* flip, flop */ + 0x3abc, 0x0003, /* cond_expr */ + 0x3abc, 0x1198, 0x03d6, 0x014c, 0x4f68, 0x4c64, 0x2c21, /* entersub */ + 0x43d8, 0x0003, /* leavesub, leavesublv, leavewrite, leaveeval */ 0x02aa, 0x0003, /* argelem */ + 0x2a3c, 0x2918, 0x0003, /* argdefelem */ 0x00bc, 0x018f, /* caller */ - 0x2555, /* nextstate, dbstate */ - 0x2f7c, 0x39f9, /* leave */ - 0x30dc, 0x3758, 0x10ec, 0x3d05, /* enteriter */ - 0x3d05, /* iter */ - 0x2f7c, 0x0067, /* leaveloop */ - 0x499c, 0x0003, /* last, next, redo, dump, goto */ - 0x393c, 0x3858, 0x2994, 0x28d0, 0x018f, /* open */ - 0x1ef0, 0x214c, 0x2008, 0x1dc4, 0x0003, /* ftrread, ftrwrite, ftrexec, fteread, ftewrite, fteexec */ - 0x1ef0, 0x214c, 0x2008, 0x0003, /* ftis, ftsize, ftmtime, ftatime, ftctime, ftrowned, fteowned, ftzero, ftsock, ftchr, ftblk, ftfile, ftdir, ftpipe, ftsuid, ftsgid, ftsvtx, ftlink, fttty, fttext, ftbinary */ - 0x4631, /* wait, getppid, time */ - 0x3a94, 0x0e90, 0x070c, 0x4708, 0x2464, 0x0003, /* entereval */ - 0x329c, 0x0018, 0x13a4, 0x12c1, /* coreargs */ - 0x31cc, 0x00c7, /* avhvswitch */ - 0x30dc, 0x01fb, /* padrange */ - 0x30dc, 0x41d8, 0x04f6, 0x2bac, 0x19a8, 0x0067, /* refassign */ - 0x30dc, 0x41d8, 0x04f6, 0x2bac, 0x19a8, 0x0003, /* lvref */ - 0x30dd, /* lvrefslice */ - 0x30dc, 0x41d8, 0x0003, /* lvavref */ - 0x1cdc, 0x0003, /* pushdefer */ + 0x2755, /* nextstate, dbstate */ + 0x395c, 0x43d9, /* leave */ + 0x3abc, 0x4138, 0x120c, 0x46e5, /* enteriter */ + 0x46e5, /* iter */ + 0x395c, 0x0067, /* leaveloop */ + 0x537c, 0x0003, /* last, next, redo, dump, goto */ + 0x431c, 0x4238, 0x2dd4, 0x2d10, 0x018f, /* open */ + 0x20f0, 0x234c, 0x2208, 0x1fc4, 0x0003, /* ftrread, ftrwrite, ftrexec, fteread, ftewrite, fteexec */ + 0x20f0, 0x234c, 0x2208, 0x0003, /* ftis, ftsize, ftmtime, ftatime, ftctime, ftrowned, fteowned, ftzero, ftsock, ftchr, ftblk, ftfile, ftdir, ftpipe, ftsuid, ftsgid, ftsvtx, ftlink, fttty, fttext, ftbinary */ + 0x5011, /* wait, getppid, time */ + 0x1c78, 0x4474, 0x0fb0, 0x082c, 0x50e8, 0x2664, 0x0003, /* entereval */ + 0x3c7c, 0x0018, 0x14c4, 0x13e1, /* coreargs */ + 0x3bac, 0x00c7, /* avhvswitch */ + 0x3abc, 0x01fb, /* padrange */ + 0x3abc, 0x4bb8, 0x04f6, 0x348c, 0x1ac8, 0x0067, /* refassign */ + 0x3abc, 0x4bb8, 0x04f6, 0x348c, 0x1ac8, 0x0003, /* lvref */ + 0x3abd, /* lvrefslice */ + 0x1edc, 0x0003, /* pushdefer */ + 0x131c, 0x0003, /* helemexistsor */ + 0x2e7c, 0x0003, /* methstart */ + 0x3168, 0x2fc4, 0x0003, /* initfield */ }; @@ -3043,6 +3090,7 @@ EXTCONST U8 PL_op_private_valid[] = { /* GV */ (OPpEARLY_CV), /* GELEM */ (OPpARG2_MASK), /* PADSV */ (OPpDEREF|OPpPAD_STATE|OPpLVAL_INTRO), + /* PADSV_STORE */ (OPpARG1_MASK|OPpPAD_STATE|OPpLVAL_INTRO), /* PADAV */ (OPpSLICEWARNING|OPpMAYBE_LVSUB|OPpTRUEBOOL|OPpPAD_STATE|OPpLVAL_INTRO), /* PADHV */ (OPpPADHV_ISKEYS|OPpSLICEWARNING|OPpMAYBE_LVSUB|OPpMAYBE_TRUEBOOL|OPpTRUEBOOL|OPpPAD_STATE|OPpLVAL_INTRO), /* PADANY */ (0), @@ -3076,7 +3124,7 @@ EXTCONST U8 PL_op_private_valid[] = { /* CHOMP */ (OPpARG1_MASK|OPpTARGET_MY), /* SCHOMP */ (OPpARG1_MASK|OPpTARGET_MY), /* DEFINED */ (OPpARG1_MASK), - /* UNDEF */ (OPpARG1_MASK), + /* UNDEF */ (OPpARG1_MASK|OPpTARGET_MY|OPpUNDEF_KEEP_PV|OPpPAD_STATE|OPpLVAL_INTRO), /* STUDY */ (OPpARG1_MASK), /* POS */ (OPpARG1_MASK|OPpMAYBE_LVSUB|OPpTRUEBOOL), /* PREINC */ (OPpARG1_MASK), @@ -3171,6 +3219,7 @@ EXTCONST U8 PL_op_private_valid[] = { /* RV2AV */ (OPpARG1_MASK|OPpHINT_STRICT_REFS|OPpSLICEWARNING|OPpMAYBE_LVSUB|OPpTRUEBOOL|OPpOUR_INTRO|OPpLVAL_INTRO), /* AELEMFAST */ (255), /* AELEMFAST_LEX */ (255), + /* AELEMFASTLEX_STORE */ (255), /* AELEM */ (OPpARG2_MASK|OPpMAYBE_LVSUB|OPpDEREF|OPpLVAL_DEFER|OPpLVAL_INTRO), /* ASLICE */ (OPpSLICEWARNING|OPpMAYBE_LVSUB|OPpLVAL_INTRO), /* KVASLICE */ (OPpMAYBE_LVSUB), @@ -3195,6 +3244,7 @@ EXTCONST U8 PL_op_private_valid[] = { /* LSLICE */ (OPpARG2_MASK), /* ANONLIST */ (OPpARG4_MASK), /* ANONHASH */ (OPpARG4_MASK), + /* EMPTYAVHV */ (OPpARG4_MASK|OPpTARGET_MY|OPpEMPTYAVHV_IS_HV|OPpPAD_STATE|OPpLVAL_INTRO), /* SPLICE */ (OPpARG4_MASK), /* PUSH */ (OPpARG4_MASK|OPpTARGET_MY), /* POP */ (OPpARG1_MASK), @@ -3222,7 +3272,7 @@ EXTCONST U8 PL_op_private_valid[] = { /* LEAVESUBLV */ (OPpARG1_MASK|OPpREFCOUNTED), /* ARGCHECK */ (OPpARG1_MASK), /* ARGELEM */ (OPpARG1_MASK|OPpARGELEM_MASK), - /* ARGDEFELEM */ (OPpARG1_MASK), + /* ARGDEFELEM */ (OPpARG1_MASK|OPpARG_IF_FALSE|OPpARG_IF_UNDEF), /* CALLER */ (OPpARG4_MASK|OPpOFFBYONE), /* WARN */ (OPpARG4_MASK), /* DIE */ (OPpARG4_MASK), @@ -3378,7 +3428,7 @@ EXTCONST U8 PL_op_private_valid[] = { /* REQUIRE */ (OPpARG1_MASK), /* DOFILE */ (OPpARG1_MASK), /* HINTSEVAL */ (0), - /* ENTEREVAL */ (OPpARG1_MASK|OPpEVAL_HAS_HH|OPpEVAL_UNICODE|OPpEVAL_BYTES|OPpEVAL_COPHH|OPpEVAL_RE_REPARSING), + /* ENTEREVAL */ (OPpARG1_MASK|OPpEVAL_HAS_HH|OPpEVAL_UNICODE|OPpEVAL_BYTES|OPpEVAL_COPHH|OPpEVAL_RE_REPARSING|OPpEVAL_EVALSV), /* LEAVEEVAL */ (OPpARG1_MASK|OPpREFCOUNTED), /* ENTERTRY */ (OPpARG1_MASK), /* LEAVETRY */ (0), @@ -3438,8 +3488,8 @@ EXTCONST U8 PL_op_private_valid[] = { /* POPTRY */ (0), /* CATCH */ (OPpARG1_MASK), /* PUSHDEFER */ (OPpARG1_MASK|OPpDEFER_FINALLY), - /* IS_BOOL */ (OPpARG1_MASK|OPpTARGET_MY), - /* IS_WEAK */ (OPpARG1_MASK|OPpTARGET_MY), + /* IS_BOOL */ (OPpARG1_MASK), + /* IS_WEAK */ (OPpARG1_MASK), /* WEAKEN */ (OPpARG1_MASK), /* UNWEAKEN */ (OPpARG1_MASK), /* BLESSED */ (OPpARG1_MASK|OPpMAYBE_TRUEBOOL|OPpTRUEBOOL), @@ -3447,6 +3497,10 @@ EXTCONST U8 PL_op_private_valid[] = { /* REFTYPE */ (OPpARG1_MASK|OPpTARGET_MY), /* CEIL */ (OPpARG1_MASK|OPpTARGET_MY), /* FLOOR */ (OPpARG1_MASK|OPpTARGET_MY), + /* IS_TAINTED */ (OPpARG1_MASK), + /* HELEMEXISTSOR */ (OPpARG1_MASK|OPpHELEMEXISTSOR_DELETE), + /* METHSTART */ (OPpARG1_MASK|OPpINITFIELDS), + /* INITFIELD */ (OPpARG1_MASK|OPpINITFIELD_AV|OPpINITFIELD_HV), }; @@ -3456,4 +3510,4 @@ END_EXTERN_C -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/opnames.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/opnames.h,v diff -u -p -a -u -p -r1.5 opnames.h --- gnu/usr.bin/perl/opnames.h 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/opnames.h 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * opnames.h * @@ -24,414 +24,421 @@ typedef enum opcode { OP_GV = 7, OP_GELEM = 8, OP_PADSV = 9, - OP_PADAV = 10, - OP_PADHV = 11, - OP_PADANY = 12, - OP_RV2GV = 13, - OP_RV2SV = 14, - OP_AV2ARYLEN = 15, - OP_RV2CV = 16, - OP_ANONCODE = 17, - OP_PROTOTYPE = 18, - OP_REFGEN = 19, - OP_SREFGEN = 20, - OP_REF = 21, - OP_BLESS = 22, - OP_BACKTICK = 23, - OP_GLOB = 24, - OP_READLINE = 25, - OP_RCATLINE = 26, - OP_REGCMAYBE = 27, - OP_REGCRESET = 28, - OP_REGCOMP = 29, - OP_MATCH = 30, - OP_QR = 31, - OP_SUBST = 32, - OP_SUBSTCONT = 33, - OP_TRANS = 34, - OP_TRANSR = 35, - OP_SASSIGN = 36, - OP_AASSIGN = 37, - OP_CHOP = 38, - OP_SCHOP = 39, - OP_CHOMP = 40, - OP_SCHOMP = 41, - OP_DEFINED = 42, - OP_UNDEF = 43, - OP_STUDY = 44, - OP_POS = 45, - OP_PREINC = 46, - OP_I_PREINC = 47, - OP_PREDEC = 48, - OP_I_PREDEC = 49, - OP_POSTINC = 50, - OP_I_POSTINC = 51, - OP_POSTDEC = 52, - OP_I_POSTDEC = 53, - OP_POW = 54, - OP_MULTIPLY = 55, - OP_I_MULTIPLY = 56, - OP_DIVIDE = 57, - OP_I_DIVIDE = 58, - OP_MODULO = 59, - OP_I_MODULO = 60, - OP_REPEAT = 61, - OP_ADD = 62, - OP_I_ADD = 63, - OP_SUBTRACT = 64, - OP_I_SUBTRACT = 65, - OP_CONCAT = 66, - OP_MULTICONCAT = 67, - OP_STRINGIFY = 68, - OP_LEFT_SHIFT = 69, - OP_RIGHT_SHIFT = 70, - OP_LT = 71, - OP_I_LT = 72, - OP_GT = 73, - OP_I_GT = 74, - OP_LE = 75, - OP_I_LE = 76, - OP_GE = 77, - OP_I_GE = 78, - OP_EQ = 79, - OP_I_EQ = 80, - OP_NE = 81, - OP_I_NE = 82, - OP_NCMP = 83, - OP_I_NCMP = 84, - OP_SLT = 85, - OP_SGT = 86, - OP_SLE = 87, - OP_SGE = 88, - OP_SEQ = 89, - OP_SNE = 90, - OP_SCMP = 91, - OP_BIT_AND = 92, - OP_BIT_XOR = 93, - OP_BIT_OR = 94, - OP_NBIT_AND = 95, - OP_NBIT_XOR = 96, - OP_NBIT_OR = 97, - OP_SBIT_AND = 98, - OP_SBIT_XOR = 99, - OP_SBIT_OR = 100, - OP_NEGATE = 101, - OP_I_NEGATE = 102, - OP_NOT = 103, - OP_COMPLEMENT = 104, - OP_NCOMPLEMENT = 105, - OP_SCOMPLEMENT = 106, - OP_SMARTMATCH = 107, - OP_ATAN2 = 108, - OP_SIN = 109, - OP_COS = 110, - OP_RAND = 111, - OP_SRAND = 112, - OP_EXP = 113, - OP_LOG = 114, - OP_SQRT = 115, - OP_INT = 116, - OP_HEX = 117, - OP_OCT = 118, - OP_ABS = 119, - OP_LENGTH = 120, - OP_SUBSTR = 121, - OP_VEC = 122, - OP_INDEX = 123, - OP_RINDEX = 124, - OP_SPRINTF = 125, - OP_FORMLINE = 126, - OP_ORD = 127, - OP_CHR = 128, - OP_CRYPT = 129, - OP_UCFIRST = 130, - OP_LCFIRST = 131, - OP_UC = 132, - OP_LC = 133, - OP_QUOTEMETA = 134, - OP_RV2AV = 135, - OP_AELEMFAST = 136, - OP_AELEMFAST_LEX = 137, - OP_AELEM = 138, - OP_ASLICE = 139, - OP_KVASLICE = 140, - OP_AEACH = 141, - OP_AVALUES = 142, - OP_AKEYS = 143, - OP_EACH = 144, - OP_VALUES = 145, - OP_KEYS = 146, - OP_DELETE = 147, - OP_EXISTS = 148, - OP_RV2HV = 149, - OP_HELEM = 150, - OP_HSLICE = 151, - OP_KVHSLICE = 152, - OP_MULTIDEREF = 153, - OP_UNPACK = 154, - OP_PACK = 155, - OP_SPLIT = 156, - OP_JOIN = 157, - OP_LIST = 158, - OP_LSLICE = 159, - OP_ANONLIST = 160, - OP_ANONHASH = 161, - OP_SPLICE = 162, - OP_PUSH = 163, - OP_POP = 164, - OP_SHIFT = 165, - OP_UNSHIFT = 166, - OP_SORT = 167, - OP_REVERSE = 168, - OP_GREPSTART = 169, - OP_GREPWHILE = 170, - OP_MAPSTART = 171, - OP_MAPWHILE = 172, - OP_RANGE = 173, - OP_FLIP = 174, - OP_FLOP = 175, - OP_AND = 176, - OP_OR = 177, - OP_XOR = 178, - OP_DOR = 179, - OP_COND_EXPR = 180, - OP_ANDASSIGN = 181, - OP_ORASSIGN = 182, - OP_DORASSIGN = 183, - OP_ENTERSUB = 184, - OP_LEAVESUB = 185, - OP_LEAVESUBLV = 186, - OP_ARGCHECK = 187, - OP_ARGELEM = 188, - OP_ARGDEFELEM = 189, - OP_CALLER = 190, - OP_WARN = 191, - OP_DIE = 192, - OP_RESET = 193, - OP_LINESEQ = 194, - OP_NEXTSTATE = 195, - OP_DBSTATE = 196, - OP_UNSTACK = 197, - OP_ENTER = 198, - OP_LEAVE = 199, - OP_SCOPE = 200, - OP_ENTERITER = 201, - OP_ITER = 202, - OP_ENTERLOOP = 203, - OP_LEAVELOOP = 204, - OP_RETURN = 205, - OP_LAST = 206, - OP_NEXT = 207, - OP_REDO = 208, - OP_DUMP = 209, - OP_GOTO = 210, - OP_EXIT = 211, - OP_METHOD = 212, - OP_METHOD_NAMED = 213, - OP_METHOD_SUPER = 214, - OP_METHOD_REDIR = 215, - OP_METHOD_REDIR_SUPER = 216, - OP_ENTERGIVEN = 217, - OP_LEAVEGIVEN = 218, - OP_ENTERWHEN = 219, - OP_LEAVEWHEN = 220, - OP_BREAK = 221, - OP_CONTINUE = 222, - OP_OPEN = 223, - OP_CLOSE = 224, - OP_PIPE_OP = 225, - OP_FILENO = 226, - OP_UMASK = 227, - OP_BINMODE = 228, - OP_TIE = 229, - OP_UNTIE = 230, - OP_TIED = 231, - OP_DBMOPEN = 232, - OP_DBMCLOSE = 233, - OP_SSELECT = 234, - OP_SELECT = 235, - OP_GETC = 236, - OP_READ = 237, - OP_ENTERWRITE = 238, - OP_LEAVEWRITE = 239, - OP_PRTF = 240, - OP_PRINT = 241, - OP_SAY = 242, - OP_SYSOPEN = 243, - OP_SYSSEEK = 244, - OP_SYSREAD = 245, - OP_SYSWRITE = 246, - OP_EOF = 247, - OP_TELL = 248, - OP_SEEK = 249, - OP_TRUNCATE = 250, - OP_FCNTL = 251, - OP_IOCTL = 252, - OP_FLOCK = 253, - OP_SEND = 254, - OP_RECV = 255, - OP_SOCKET = 256, - OP_SOCKPAIR = 257, - OP_BIND = 258, - OP_CONNECT = 259, - OP_LISTEN = 260, - OP_ACCEPT = 261, - OP_SHUTDOWN = 262, - OP_GSOCKOPT = 263, - OP_SSOCKOPT = 264, - OP_GETSOCKNAME = 265, - OP_GETPEERNAME = 266, - OP_LSTAT = 267, - OP_STAT = 268, - OP_FTRREAD = 269, - OP_FTRWRITE = 270, - OP_FTREXEC = 271, - OP_FTEREAD = 272, - OP_FTEWRITE = 273, - OP_FTEEXEC = 274, - OP_FTIS = 275, - OP_FTSIZE = 276, - OP_FTMTIME = 277, - OP_FTATIME = 278, - OP_FTCTIME = 279, - OP_FTROWNED = 280, - OP_FTEOWNED = 281, - OP_FTZERO = 282, - OP_FTSOCK = 283, - OP_FTCHR = 284, - OP_FTBLK = 285, - OP_FTFILE = 286, - OP_FTDIR = 287, - OP_FTPIPE = 288, - OP_FTSUID = 289, - OP_FTSGID = 290, - OP_FTSVTX = 291, - OP_FTLINK = 292, - OP_FTTTY = 293, - OP_FTTEXT = 294, - OP_FTBINARY = 295, - OP_CHDIR = 296, - OP_CHOWN = 297, - OP_CHROOT = 298, - OP_UNLINK = 299, - OP_CHMOD = 300, - OP_UTIME = 301, - OP_RENAME = 302, - OP_LINK = 303, - OP_SYMLINK = 304, - OP_READLINK = 305, - OP_MKDIR = 306, - OP_RMDIR = 307, - OP_OPEN_DIR = 308, - OP_READDIR = 309, - OP_TELLDIR = 310, - OP_SEEKDIR = 311, - OP_REWINDDIR = 312, - OP_CLOSEDIR = 313, - OP_FORK = 314, - OP_WAIT = 315, - OP_WAITPID = 316, - OP_SYSTEM = 317, - OP_EXEC = 318, - OP_KILL = 319, - OP_GETPPID = 320, - OP_GETPGRP = 321, - OP_SETPGRP = 322, - OP_GETPRIORITY = 323, - OP_SETPRIORITY = 324, - OP_TIME = 325, - OP_TMS = 326, - OP_LOCALTIME = 327, - OP_GMTIME = 328, - OP_ALARM = 329, - OP_SLEEP = 330, - OP_SHMGET = 331, - OP_SHMCTL = 332, - OP_SHMREAD = 333, - OP_SHMWRITE = 334, - OP_MSGGET = 335, - OP_MSGCTL = 336, - OP_MSGSND = 337, - OP_MSGRCV = 338, - OP_SEMOP = 339, - OP_SEMGET = 340, - OP_SEMCTL = 341, - OP_REQUIRE = 342, - OP_DOFILE = 343, - OP_HINTSEVAL = 344, - OP_ENTEREVAL = 345, - OP_LEAVEEVAL = 346, - OP_ENTERTRY = 347, - OP_LEAVETRY = 348, - OP_GHBYNAME = 349, - OP_GHBYADDR = 350, - OP_GHOSTENT = 351, - OP_GNBYNAME = 352, - OP_GNBYADDR = 353, - OP_GNETENT = 354, - OP_GPBYNAME = 355, - OP_GPBYNUMBER = 356, - OP_GPROTOENT = 357, - OP_GSBYNAME = 358, - OP_GSBYPORT = 359, - OP_GSERVENT = 360, - OP_SHOSTENT = 361, - OP_SNETENT = 362, - OP_SPROTOENT = 363, - OP_SSERVENT = 364, - OP_EHOSTENT = 365, - OP_ENETENT = 366, - OP_EPROTOENT = 367, - OP_ESERVENT = 368, - OP_GPWNAM = 369, - OP_GPWUID = 370, - OP_GPWENT = 371, - OP_SPWENT = 372, - OP_EPWENT = 373, - OP_GGRNAM = 374, - OP_GGRGID = 375, - OP_GGRENT = 376, - OP_SGRENT = 377, - OP_EGRENT = 378, - OP_GETLOGIN = 379, - OP_SYSCALL = 380, - OP_LOCK = 381, - OP_ONCE = 382, - OP_CUSTOM = 383, - OP_COREARGS = 384, - OP_AVHVSWITCH = 385, - OP_RUNCV = 386, - OP_FC = 387, - OP_PADCV = 388, - OP_INTROCV = 389, - OP_CLONECV = 390, - OP_PADRANGE = 391, - OP_REFASSIGN = 392, - OP_LVREF = 393, - OP_LVREFSLICE = 394, - OP_LVAVREF = 395, - OP_ANONCONST = 396, - OP_ISA = 397, - OP_CMPCHAIN_AND = 398, - OP_CMPCHAIN_DUP = 399, - OP_ENTERTRYCATCH = 400, - OP_LEAVETRYCATCH = 401, - OP_POPTRY = 402, - OP_CATCH = 403, - OP_PUSHDEFER = 404, - OP_IS_BOOL = 405, - OP_IS_WEAK = 406, - OP_WEAKEN = 407, - OP_UNWEAKEN = 408, - OP_BLESSED = 409, - OP_REFADDR = 410, - OP_REFTYPE = 411, - OP_CEIL = 412, - OP_FLOOR = 413, + OP_PADSV_STORE = 10, + OP_PADAV = 11, + OP_PADHV = 12, + OP_PADANY = 13, + OP_RV2GV = 14, + OP_RV2SV = 15, + OP_AV2ARYLEN = 16, + OP_RV2CV = 17, + OP_ANONCODE = 18, + OP_PROTOTYPE = 19, + OP_REFGEN = 20, + OP_SREFGEN = 21, + OP_REF = 22, + OP_BLESS = 23, + OP_BACKTICK = 24, + OP_GLOB = 25, + OP_READLINE = 26, + OP_RCATLINE = 27, + OP_REGCMAYBE = 28, + OP_REGCRESET = 29, + OP_REGCOMP = 30, + OP_MATCH = 31, + OP_QR = 32, + OP_SUBST = 33, + OP_SUBSTCONT = 34, + OP_TRANS = 35, + OP_TRANSR = 36, + OP_SASSIGN = 37, + OP_AASSIGN = 38, + OP_CHOP = 39, + OP_SCHOP = 40, + OP_CHOMP = 41, + OP_SCHOMP = 42, + OP_DEFINED = 43, + OP_UNDEF = 44, + OP_STUDY = 45, + OP_POS = 46, + OP_PREINC = 47, + OP_I_PREINC = 48, + OP_PREDEC = 49, + OP_I_PREDEC = 50, + OP_POSTINC = 51, + OP_I_POSTINC = 52, + OP_POSTDEC = 53, + OP_I_POSTDEC = 54, + OP_POW = 55, + OP_MULTIPLY = 56, + OP_I_MULTIPLY = 57, + OP_DIVIDE = 58, + OP_I_DIVIDE = 59, + OP_MODULO = 60, + OP_I_MODULO = 61, + OP_REPEAT = 62, + OP_ADD = 63, + OP_I_ADD = 64, + OP_SUBTRACT = 65, + OP_I_SUBTRACT = 66, + OP_CONCAT = 67, + OP_MULTICONCAT = 68, + OP_STRINGIFY = 69, + OP_LEFT_SHIFT = 70, + OP_RIGHT_SHIFT = 71, + OP_LT = 72, + OP_I_LT = 73, + OP_GT = 74, + OP_I_GT = 75, + OP_LE = 76, + OP_I_LE = 77, + OP_GE = 78, + OP_I_GE = 79, + OP_EQ = 80, + OP_I_EQ = 81, + OP_NE = 82, + OP_I_NE = 83, + OP_NCMP = 84, + OP_I_NCMP = 85, + OP_SLT = 86, + OP_SGT = 87, + OP_SLE = 88, + OP_SGE = 89, + OP_SEQ = 90, + OP_SNE = 91, + OP_SCMP = 92, + OP_BIT_AND = 93, + OP_BIT_XOR = 94, + OP_BIT_OR = 95, + OP_NBIT_AND = 96, + OP_NBIT_XOR = 97, + OP_NBIT_OR = 98, + OP_SBIT_AND = 99, + OP_SBIT_XOR = 100, + OP_SBIT_OR = 101, + OP_NEGATE = 102, + OP_I_NEGATE = 103, + OP_NOT = 104, + OP_COMPLEMENT = 105, + OP_NCOMPLEMENT = 106, + OP_SCOMPLEMENT = 107, + OP_SMARTMATCH = 108, + OP_ATAN2 = 109, + OP_SIN = 110, + OP_COS = 111, + OP_RAND = 112, + OP_SRAND = 113, + OP_EXP = 114, + OP_LOG = 115, + OP_SQRT = 116, + OP_INT = 117, + OP_HEX = 118, + OP_OCT = 119, + OP_ABS = 120, + OP_LENGTH = 121, + OP_SUBSTR = 122, + OP_VEC = 123, + OP_INDEX = 124, + OP_RINDEX = 125, + OP_SPRINTF = 126, + OP_FORMLINE = 127, + OP_ORD = 128, + OP_CHR = 129, + OP_CRYPT = 130, + OP_UCFIRST = 131, + OP_LCFIRST = 132, + OP_UC = 133, + OP_LC = 134, + OP_QUOTEMETA = 135, + OP_RV2AV = 136, + OP_AELEMFAST = 137, + OP_AELEMFAST_LEX = 138, + OP_AELEMFASTLEX_STORE = 139, + OP_AELEM = 140, + OP_ASLICE = 141, + OP_KVASLICE = 142, + OP_AEACH = 143, + OP_AVALUES = 144, + OP_AKEYS = 145, + OP_EACH = 146, + OP_VALUES = 147, + OP_KEYS = 148, + OP_DELETE = 149, + OP_EXISTS = 150, + OP_RV2HV = 151, + OP_HELEM = 152, + OP_HSLICE = 153, + OP_KVHSLICE = 154, + OP_MULTIDEREF = 155, + OP_UNPACK = 156, + OP_PACK = 157, + OP_SPLIT = 158, + OP_JOIN = 159, + OP_LIST = 160, + OP_LSLICE = 161, + OP_ANONLIST = 162, + OP_ANONHASH = 163, + OP_EMPTYAVHV = 164, + OP_SPLICE = 165, + OP_PUSH = 166, + OP_POP = 167, + OP_SHIFT = 168, + OP_UNSHIFT = 169, + OP_SORT = 170, + OP_REVERSE = 171, + OP_GREPSTART = 172, + OP_GREPWHILE = 173, + OP_MAPSTART = 174, + OP_MAPWHILE = 175, + OP_RANGE = 176, + OP_FLIP = 177, + OP_FLOP = 178, + OP_AND = 179, + OP_OR = 180, + OP_XOR = 181, + OP_DOR = 182, + OP_COND_EXPR = 183, + OP_ANDASSIGN = 184, + OP_ORASSIGN = 185, + OP_DORASSIGN = 186, + OP_ENTERSUB = 187, + OP_LEAVESUB = 188, + OP_LEAVESUBLV = 189, + OP_ARGCHECK = 190, + OP_ARGELEM = 191, + OP_ARGDEFELEM = 192, + OP_CALLER = 193, + OP_WARN = 194, + OP_DIE = 195, + OP_RESET = 196, + OP_LINESEQ = 197, + OP_NEXTSTATE = 198, + OP_DBSTATE = 199, + OP_UNSTACK = 200, + OP_ENTER = 201, + OP_LEAVE = 202, + OP_SCOPE = 203, + OP_ENTERITER = 204, + OP_ITER = 205, + OP_ENTERLOOP = 206, + OP_LEAVELOOP = 207, + OP_RETURN = 208, + OP_LAST = 209, + OP_NEXT = 210, + OP_REDO = 211, + OP_DUMP = 212, + OP_GOTO = 213, + OP_EXIT = 214, + OP_METHOD = 215, + OP_METHOD_NAMED = 216, + OP_METHOD_SUPER = 217, + OP_METHOD_REDIR = 218, + OP_METHOD_REDIR_SUPER = 219, + OP_ENTERGIVEN = 220, + OP_LEAVEGIVEN = 221, + OP_ENTERWHEN = 222, + OP_LEAVEWHEN = 223, + OP_BREAK = 224, + OP_CONTINUE = 225, + OP_OPEN = 226, + OP_CLOSE = 227, + OP_PIPE_OP = 228, + OP_FILENO = 229, + OP_UMASK = 230, + OP_BINMODE = 231, + OP_TIE = 232, + OP_UNTIE = 233, + OP_TIED = 234, + OP_DBMOPEN = 235, + OP_DBMCLOSE = 236, + OP_SSELECT = 237, + OP_SELECT = 238, + OP_GETC = 239, + OP_READ = 240, + OP_ENTERWRITE = 241, + OP_LEAVEWRITE = 242, + OP_PRTF = 243, + OP_PRINT = 244, + OP_SAY = 245, + OP_SYSOPEN = 246, + OP_SYSSEEK = 247, + OP_SYSREAD = 248, + OP_SYSWRITE = 249, + OP_EOF = 250, + OP_TELL = 251, + OP_SEEK = 252, + OP_TRUNCATE = 253, + OP_FCNTL = 254, + OP_IOCTL = 255, + OP_FLOCK = 256, + OP_SEND = 257, + OP_RECV = 258, + OP_SOCKET = 259, + OP_SOCKPAIR = 260, + OP_BIND = 261, + OP_CONNECT = 262, + OP_LISTEN = 263, + OP_ACCEPT = 264, + OP_SHUTDOWN = 265, + OP_GSOCKOPT = 266, + OP_SSOCKOPT = 267, + OP_GETSOCKNAME = 268, + OP_GETPEERNAME = 269, + OP_LSTAT = 270, + OP_STAT = 271, + OP_FTRREAD = 272, + OP_FTRWRITE = 273, + OP_FTREXEC = 274, + OP_FTEREAD = 275, + OP_FTEWRITE = 276, + OP_FTEEXEC = 277, + OP_FTIS = 278, + OP_FTSIZE = 279, + OP_FTMTIME = 280, + OP_FTATIME = 281, + OP_FTCTIME = 282, + OP_FTROWNED = 283, + OP_FTEOWNED = 284, + OP_FTZERO = 285, + OP_FTSOCK = 286, + OP_FTCHR = 287, + OP_FTBLK = 288, + OP_FTFILE = 289, + OP_FTDIR = 290, + OP_FTPIPE = 291, + OP_FTSUID = 292, + OP_FTSGID = 293, + OP_FTSVTX = 294, + OP_FTLINK = 295, + OP_FTTTY = 296, + OP_FTTEXT = 297, + OP_FTBINARY = 298, + OP_CHDIR = 299, + OP_CHOWN = 300, + OP_CHROOT = 301, + OP_UNLINK = 302, + OP_CHMOD = 303, + OP_UTIME = 304, + OP_RENAME = 305, + OP_LINK = 306, + OP_SYMLINK = 307, + OP_READLINK = 308, + OP_MKDIR = 309, + OP_RMDIR = 310, + OP_OPEN_DIR = 311, + OP_READDIR = 312, + OP_TELLDIR = 313, + OP_SEEKDIR = 314, + OP_REWINDDIR = 315, + OP_CLOSEDIR = 316, + OP_FORK = 317, + OP_WAIT = 318, + OP_WAITPID = 319, + OP_SYSTEM = 320, + OP_EXEC = 321, + OP_KILL = 322, + OP_GETPPID = 323, + OP_GETPGRP = 324, + OP_SETPGRP = 325, + OP_GETPRIORITY = 326, + OP_SETPRIORITY = 327, + OP_TIME = 328, + OP_TMS = 329, + OP_LOCALTIME = 330, + OP_GMTIME = 331, + OP_ALARM = 332, + OP_SLEEP = 333, + OP_SHMGET = 334, + OP_SHMCTL = 335, + OP_SHMREAD = 336, + OP_SHMWRITE = 337, + OP_MSGGET = 338, + OP_MSGCTL = 339, + OP_MSGSND = 340, + OP_MSGRCV = 341, + OP_SEMOP = 342, + OP_SEMGET = 343, + OP_SEMCTL = 344, + OP_REQUIRE = 345, + OP_DOFILE = 346, + OP_HINTSEVAL = 347, + OP_ENTEREVAL = 348, + OP_LEAVEEVAL = 349, + OP_ENTERTRY = 350, + OP_LEAVETRY = 351, + OP_GHBYNAME = 352, + OP_GHBYADDR = 353, + OP_GHOSTENT = 354, + OP_GNBYNAME = 355, + OP_GNBYADDR = 356, + OP_GNETENT = 357, + OP_GPBYNAME = 358, + OP_GPBYNUMBER = 359, + OP_GPROTOENT = 360, + OP_GSBYNAME = 361, + OP_GSBYPORT = 362, + OP_GSERVENT = 363, + OP_SHOSTENT = 364, + OP_SNETENT = 365, + OP_SPROTOENT = 366, + OP_SSERVENT = 367, + OP_EHOSTENT = 368, + OP_ENETENT = 369, + OP_EPROTOENT = 370, + OP_ESERVENT = 371, + OP_GPWNAM = 372, + OP_GPWUID = 373, + OP_GPWENT = 374, + OP_SPWENT = 375, + OP_EPWENT = 376, + OP_GGRNAM = 377, + OP_GGRGID = 378, + OP_GGRENT = 379, + OP_SGRENT = 380, + OP_EGRENT = 381, + OP_GETLOGIN = 382, + OP_SYSCALL = 383, + OP_LOCK = 384, + OP_ONCE = 385, + OP_CUSTOM = 386, + OP_COREARGS = 387, + OP_AVHVSWITCH = 388, + OP_RUNCV = 389, + OP_FC = 390, + OP_PADCV = 391, + OP_INTROCV = 392, + OP_CLONECV = 393, + OP_PADRANGE = 394, + OP_REFASSIGN = 395, + OP_LVREF = 396, + OP_LVREFSLICE = 397, + OP_LVAVREF = 398, + OP_ANONCONST = 399, + OP_ISA = 400, + OP_CMPCHAIN_AND = 401, + OP_CMPCHAIN_DUP = 402, + OP_ENTERTRYCATCH = 403, + OP_LEAVETRYCATCH = 404, + OP_POPTRY = 405, + OP_CATCH = 406, + OP_PUSHDEFER = 407, + OP_IS_BOOL = 408, + OP_IS_WEAK = 409, + OP_WEAKEN = 410, + OP_UNWEAKEN = 411, + OP_BLESSED = 412, + OP_REFADDR = 413, + OP_REFTYPE = 414, + OP_CEIL = 415, + OP_FLOOR = 416, + OP_IS_TAINTED = 417, + OP_HELEMEXISTSOR = 418, + OP_METHSTART = 419, + OP_INITFIELD = 420, OP_max } opcode; -#define MAXO 414 +#define MAXO 421 #define OP_FREED MAXO /* the OP_IS_* macros are optimized to a simple range check because @@ -439,22 +446,22 @@ typedef enum opcode { opcode.pl verifies the range contiguity, or generates an OR-equals expression */ -#define OP_IS_SOCKET(op) \ +#define OP_IS_SOCKET(op) \ ((op) >= OP_SEND && (op) <= OP_GETPEERNAME) -#define OP_IS_FILETEST(op) \ +#define OP_IS_FILETEST(op) \ ((op) >= OP_FTRREAD && (op) <= OP_FTBINARY) -#define OP_IS_FILETEST_ACCESS(op) \ +#define OP_IS_FILETEST_ACCESS(op) \ ((op) >= OP_FTRREAD && (op) <= OP_FTEEXEC) -#define OP_IS_NUMCOMPARE(op) \ +#define OP_IS_NUMCOMPARE(op) \ ((op) >= OP_LT && (op) <= OP_I_NCMP) -#define OP_IS_DIRHOP(op) \ +#define OP_IS_DIRHOP(op) \ ((op) >= OP_READDIR && (op) <= OP_CLOSEDIR) -#define OP_IS_INFIX_BIT(op) \ +#define OP_IS_INFIX_BIT(op) \ ((op) >= OP_BIT_AND && (op) <= OP_SBIT_OR) -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/overload.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/overload.h,v diff -u -p -a -u -p -r1.2 overload.h --- gnu/usr.bin/perl/overload.h 5 Feb 2017 00:31:53 -0000 1.2 +++ gnu/usr.bin/perl/overload.h 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * overload.h * @@ -95,4 +95,4 @@ enum { #define NofAMmeth max_amg_code -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/overload.inc =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/overload.inc,v diff -u -p -a -u -p -r1.1 overload.inc --- gnu/usr.bin/perl/overload.inc 5 Feb 2017 00:31:53 -0000 1.1 +++ gnu/usr.bin/perl/overload.inc 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * overload.inc * @@ -177,4 +177,4 @@ static const char * const PL_AMG_names[N "(qr" }; -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/packsizetables.inc =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/packsizetables.inc,v diff -u -p -a -u -p -r1.2 packsizetables.inc --- gnu/usr.bin/perl/packsizetables.inc 15 Feb 2023 01:36:13 -0000 1.2 +++ gnu/usr.bin/perl/packsizetables.inc 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by regen/genpacksizetables.pl from its data. Any changes made here will be lost! @@ -219,4 +219,4 @@ STATIC const packprops_t packprops[512] }; #endif -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/pad.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/pad.c,v diff -u -p -a -u -p -r1.6 pad.c --- gnu/usr.bin/perl/pad.c 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/pad.c 21 Feb 2024 15:47:02 -0000 @@ -302,7 +302,7 @@ void Perl_cv_undef_flags(pTHX_ CV *cv, U32 flags) { CV cvbody;/*CV body will never be realloced inside this func, - so dont read it more than once, use fake CV so existing macros + so don't read it more than once, use fake CV so existing macros will work, the indirection and CV head struct optimized away*/ SvANY(&cvbody) = SvANY(cv); @@ -357,7 +357,7 @@ Perl_cv_undef_flags(pTHX_ CV *cv, U32 fl #endif } } - else { /* dont bother checking if CvXSUB(cv) is true, less branching */ + else { /* don't bother checking if CvXSUB(cv) is true, less branching */ CvXSUB(&cvbody) = NULL; } SvPOK_off(MUTABLE_SV(cv)); /* forget prototype */ @@ -457,8 +457,11 @@ Perl_cv_undef_flags(pTHX_ CV *cv, U32 fl Safefree(padlist); CvPADLIST_set(&cvbody, NULL); } - else if (CvISXSUB(&cvbody)) + else if (CvISXSUB(&cvbody)) { + if (CvREFCOUNTED_ANYSV(&cvbody)) + SvREFCNT_dec(CvXSUBANY(&cvbody).any_sv); CvHSCXT(&cvbody) = NULL; + } /* else is (!CvISXSUB(&cvbody) && !CvPADLIST(&cvbody)) {do nothing;} */ @@ -550,17 +553,21 @@ S_pad_alloc_name(pTHX_ PADNAME *name, U3 ASSERT_CURPAD_ACTIVE("pad_alloc_name"); if (typestash) { - SvPAD_TYPED_on(name); + PadnameFLAGS(name) |= PADNAMEf_TYPED; PadnameTYPE(name) = MUTABLE_HV(SvREFCNT_inc_simple_NN(MUTABLE_SV(typestash))); } if (ourstash) { - SvPAD_OUR_on(name); - SvOURSTASH_set(name, ourstash); + PadnameFLAGS(name) |= PADNAMEf_OUR; + PadnameOURSTASH_set(name, ourstash); SvREFCNT_inc_simple_void_NN(ourstash); } else if (flags & padadd_STATE) { - SvPAD_STATE_on(name); + PadnameFLAGS(name) |= PADNAMEf_STATE; + } + if (flags & padadd_FIELD) { + assert(HvSTASH_IS_CLASS(PL_curstash)); + class_add_field(PL_curstash, name); } padnamelist_store(PL_comppad_name, offset, name); @@ -586,6 +593,7 @@ flags can be OR'ed together: padadd_OUR redundantly specifies if it's a package var padadd_STATE variable will retain value persistently padadd_NO_DUP_CHECK skip check for lexical shadowing + padadd_FIELD specifies that the lexical is a field for a class =cut */ @@ -599,7 +607,7 @@ Perl_pad_add_name_pvn(pTHX_ const char * PERL_ARGS_ASSERT_PAD_ADD_NAME_PVN; - if (flags & ~(padadd_OUR|padadd_STATE|padadd_NO_DUP_CHECK)) + if (flags & ~(padadd_OUR|padadd_STATE|padadd_NO_DUP_CHECK|padadd_FIELD)) Perl_croak(aTHX_ "panic: pad_add_name_pvn illegal flag bits 0x%" UVxf, (UV)flags); @@ -609,8 +617,8 @@ Perl_pad_add_name_pvn(pTHX_ const char * ENTER; SAVEFREEPADNAME(name); /* in case of fatal warnings */ /* check for duplicate declaration */ - pad_check_dup(name, flags & padadd_OUR, ourstash); - PadnameREFCNT(name)++; + pad_check_dup(name, flags & (padadd_OUR|padadd_FIELD), ourstash); + PadnameREFCNT_inc(name); LEAVE; } @@ -861,12 +869,13 @@ S_pad_check_dup(pTHX_ PADNAME *name, U32 PADNAME **svp; PADOFFSET top, off; const U32 is_our = flags & padadd_OUR; + bool is_field = flags & padadd_FIELD; PERL_ARGS_ASSERT_PAD_CHECK_DUP; ASSERT_CURPAD_ACTIVE("pad_check_dup"); - assert((flags & ~padadd_OUR) == 0); + assert((flags & ~(padadd_OUR|padadd_FIELD)) == 0); if (PadnamelistMAX(PL_comppad_name) < 0 || !ckWARN(WARN_SHADOW)) return; /* nothing to check */ @@ -875,26 +884,30 @@ S_pad_check_dup(pTHX_ PADNAME *name, U32 top = PadnamelistMAX(PL_comppad_name); /* check the current scope */ for (off = top; off > PL_comppad_name_floor; off--) { - PADNAME * const sv = svp[off]; - if (sv - && PadnameLEN(sv) == PadnameLEN(name) - && !PadnameOUTER(sv) - && ( COP_SEQ_RANGE_LOW(sv) == PERL_PADSEQ_INTRO - || COP_SEQ_RANGE_HIGH(sv) == PERL_PADSEQ_INTRO) - && memEQ(PadnamePV(sv), PadnamePV(name), PadnameLEN(name))) + PADNAME * const pn = svp[off]; + if (pn + && PadnameLEN(pn) == PadnameLEN(name) + && !PadnameOUTER(pn) + && ( COP_SEQ_RANGE_LOW(pn) == PERL_PADSEQ_INTRO + || COP_SEQ_RANGE_HIGH(pn) == PERL_PADSEQ_INTRO) + && memEQ(PadnamePV(pn), PadnamePV(name), PadnameLEN(name))) { - if (is_our && (SvPAD_OUR(sv))) + if (is_our && (PadnameIsOUR(pn))) break; /* "our" masking "our" */ + if (is_field && PadnameIsFIELD(pn) && + PadnameFIELDINFO(pn)->fieldstash != PL_curstash) + break; /* field of a different class */ /* diag_listed_as: "%s" variable %s masks earlier declaration in same %s */ Perl_warner(aTHX_ packWARN(WARN_SHADOW), "\"%s\" %s %" PNf " masks earlier declaration in same %s", ( is_our ? "our" : PL_parser->in_my == KEY_my ? "my" : PL_parser->in_my == KEY_sigvar ? "my" : + PL_parser->in_my == KEY_field ? "field" : "state" ), - *PadnamePV(sv) == '&' ? "subroutine" : "variable", - PNfARG(sv), - (COP_SEQ_RANGE_HIGH(sv) == PERL_PADSEQ_INTRO + *PadnamePV(pn) == '&' ? "subroutine" : "variable", + PNfARG(pn), + (COP_SEQ_RANGE_HIGH(pn) == PERL_PADSEQ_INTRO ? "scope" : "statement")); --off; break; @@ -903,17 +916,17 @@ S_pad_check_dup(pTHX_ PADNAME *name, U32 /* check the rest of the pad */ if (is_our) { while (off > 0) { - PADNAME * const sv = svp[off]; - if (sv - && PadnameLEN(sv) == PadnameLEN(name) - && !PadnameOUTER(sv) - && ( COP_SEQ_RANGE_LOW(sv) == PERL_PADSEQ_INTRO - || COP_SEQ_RANGE_HIGH(sv) == PERL_PADSEQ_INTRO) - && SvOURSTASH(sv) == ourstash - && memEQ(PadnamePV(sv), PadnamePV(name), PadnameLEN(name))) + PADNAME * const pn = svp[off]; + if (pn + && PadnameLEN(pn) == PadnameLEN(name) + && !PadnameOUTER(pn) + && ( COP_SEQ_RANGE_LOW(pn) == PERL_PADSEQ_INTRO + || COP_SEQ_RANGE_HIGH(pn) == PERL_PADSEQ_INTRO) + && PadnameOURSTASH(pn) == ourstash + && memEQ(PadnamePV(pn), PadnamePV(name), PadnameLEN(name))) { Perl_warner(aTHX_ packWARN(WARN_SHADOW), - "\"our\" variable %" PNf " redeclared", PNfARG(sv)); + "\"our\" variable %" PNf " redeclared", PNfARG(pn)); if (off <= PL_comppad_name_floor) Perl_warner(aTHX_ packWARN(WARN_SHADOW), "\t(Did you mean \"local\" instead of \"our\"?)\n"); @@ -1026,26 +1039,6 @@ Perl_pad_findmy_sv(pTHX_ SV *name, U32 f } /* -=for apidoc find_rundefsvoffset - -Until the lexical C<$_> feature was removed, this function would -find the position of the lexical C<$_> in the pad of the -currently-executing function and return the offset in the current pad, -or C. - -Now it always returns C. - -=cut -*/ - -PADOFFSET -Perl_find_rundefsvoffset(pTHX) -{ - PERL_UNUSED_CONTEXT; /* Can we just remove the pTHX from the sig? */ - return NOT_IN_PAD; -} - -/* =for apidoc find_rundefsv Returns the global variable C<$_>. @@ -1110,11 +1103,12 @@ S_pad_findlex(pTHX_ const char *namepv, SV *new_capture; SV **new_capturep; const PADLIST * const padlist = CvPADLIST(cv); - const bool staleok = !!(flags & padadd_STALEOK); + const bool staleok = cBOOL(flags & padadd_STALEOK); + const bool fieldok = cBOOL(flags & padfind_FIELD_OK); PERL_ARGS_ASSERT_PAD_FINDLEX; - flags &= ~ padadd_STALEOK; /* one-shot flag */ + flags &= ~(padadd_STALEOK|padfind_FIELD_OK); /* one-shot flags */ if (flags) Perl_croak(aTHX_ "panic: pad_findlex illegal flag bits 0x%" UVxf, (UV)flags); @@ -1153,6 +1147,10 @@ S_pad_findlex(pTHX_ const char *namepv, fake_offset = 0; *out_name = name_p[offset]; /* return the name */ + if (PadnameIsFIELD(*out_name) && !fieldok) + croak("Field %" SVf " is not accessible outside a method", + SVfARG(PadnameSV(*out_name))); + /* set PAD_FAKELEX_MULTI if this lex can have multiple * instances. For now, we just test !CvUNIQUE(cv), but * ideally, we should detect my's declared within loops @@ -1276,13 +1274,27 @@ S_pad_findlex(pTHX_ const char *namepv, new_capturep = out_capture ? out_capture : CvLATE(cv) ? NULL : &new_capture; - offset = pad_findlex(namepv, namelen, - flags | padadd_STALEOK*(new_capturep == &new_capture), + U32 recurse_flags = flags; + if(new_capturep == &new_capture) + recurse_flags |= padadd_STALEOK; + if(CvIsMETHOD(cv)) + recurse_flags |= padfind_FIELD_OK; + + offset = pad_findlex(namepv, namelen, recurse_flags, CvOUTSIDE(cv), CvOUTSIDE_SEQ(cv), 1, new_capturep, out_name, out_flags); if (offset == NOT_IN_PAD) return NOT_IN_PAD; + if (PadnameIsFIELD(*out_name)) { + HV *fieldstash = PadnameFIELDINFO(*out_name)->fieldstash; + + /* fields are only visible to the class that declared them */ + if(fieldstash != PL_curstash) + croak("Field %" SVf " of %" HvNAMEf_QUOTEDPREFIX " is not accessible in a method of %" HvNAMEf_QUOTEDPREFIX, + SVfARG(PadnameSV(*out_name)), HvNAMEfARG(fieldstash), HvNAMEfARG(PL_curstash)); + } + /* found in an outer CV. Add appropriate fake entry to this pad */ /* don't add new fake entries (via eval) to CVs that we have already @@ -1986,7 +1998,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, /* formats may have an inactive, or even undefined, parent; but state vars are always available. */ if (!outpad || !(sv = outpad[PARENT_PAD_INDEX(namesv)]) - || ( SvPADSTALE(sv) && !SvPAD_STATE(namesv) + || ( SvPADSTALE(sv) && !PadnameIsSTATE(namesv) && (!outside || !CvDEPTH(outside))) ) { S_unavailable(aTHX_ namesv); sv = NULL; @@ -2004,7 +2016,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, ing over other state subs’ entries, so we have to put a stub here and then clone into it on the second pass. */ - if (SvPAD_STATE(namesv) && !CvCLONED(ppad[ix])) { + if (PadnameIsSTATE(namesv) && !CvCLONED(ppad[ix])) { assert(SvTYPE(ppad[ix]) == SVt_PVCV); subclones ++; if (CvOUTSIDE(ppad[ix]) != proto) @@ -2037,7 +2049,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, else sv = newSV_type(SVt_NULL); /* reset the 'assign only once' flag on each state var */ - if (sigil != '&' && SvPAD_STATE(namesv)) + if (sigil != '&' && PadnameIsSTATE(namesv)) SvPADSTALE_on(sv); } } @@ -2123,7 +2135,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, if (CvCONST(cv)) { /* Constant sub () { $x } closing over $x: - * The prototype was marked as a candiate for const-ization, + * The prototype was marked as a candidate for const-ization, * so try to grab the current const value, and if successful, * turn into a const sub: */ @@ -2138,7 +2150,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, /* the candidate should have 1 ref from this pad and 1 ref * from the parent */ if (const_sv && SvREFCNT(const_sv) == 2) { - const bool was_method = cBOOL(CvMETHOD(cv)); + const bool was_method = cBOOL(CvNOWARN_AMBIGUOUS(cv)); if (outside) { PADNAME * const pn = PadlistNAMESARRAY(CvPADLIST(outside)) @@ -2184,7 +2196,7 @@ S_cv_clone_pad(pTHX_ CV *proto, CV *cv, SvREFCNT_dec_NN(cv); cv = newCONSTSUB(CvSTASH(proto), NULL, const_sv); if (was_method) - CvMETHOD_on(cv); + CvNOWARN_AMBIGUOUS_on(cv); } else { constoff: @@ -2221,6 +2233,8 @@ S_cv_clone(pTHX_ CV *proto, CV *cv, CV * if (UNLIKELY(CvISXSUB(proto))) { CvXSUB(cv) = CvXSUB(proto); CvXSUBANY(cv) = CvXSUBANY(proto); + if (CvREFCOUNTED_ANYSV(cv)) + SvREFCNT_inc(CvXSUBANY(cv).any_sv); } else { OP_REFCNT_LOCK; @@ -2463,8 +2477,6 @@ Perl_pad_push(pTHX_ PADLIST *padlist, in #if defined(USE_ITHREADS) -# define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t)) - /* =for apidoc padlist_dup @@ -2492,9 +2504,7 @@ Perl_padlist_dup(pTHX_ PADLIST *srcpad, PadlistMAX(dstpad) = max; Newx(PadlistARRAY(dstpad), max + 1, PAD *); - PadlistARRAY(dstpad)[0] = (PAD *) - padnamelist_dup(PadlistNAMES(srcpad), param); - PadnamelistREFCNT(PadlistNAMES(dstpad))++; + PadlistARRAY(dstpad)[0] = (PAD *)padnamelist_dup_inc(PadlistNAMES(srcpad), param); if (cloneall) { PADOFFSET depth; for (depth = 1; depth <= max; ++depth) @@ -2728,8 +2738,7 @@ Perl_padnamelist_dup(pTHX_ PADNAMELIST * for (; max >= 0; max--) if (PadnamelistARRAY(srcpad)[max]) { PadnamelistARRAY(dstpad)[max] = - padname_dup(PadnamelistARRAY(srcpad)[max], param); - PadnameREFCNT(PadnamelistARRAY(dstpad)[max])++; + padname_dup_inc(PadnamelistARRAY(srcpad)[max], param); } return dstpad; @@ -2773,9 +2782,9 @@ Perl_newPADNAMEpvn(const char *s, STRLEN Constructs and returns a new pad name. Only use this function for names that refer to outer lexicals. (See also L.) C is the outer pad name that this one mirrors. The returned pad name has the -C flag already set. +C flag already set. -=for apidoc Amnh||PADNAMEt_OUTER +=for apidoc Amnh||PADNAMEf_OUTER =cut */ @@ -2790,8 +2799,13 @@ Perl_newPADNAMEouter(PADNAME *outer) PadnamePV(pn) = PadnamePV(outer); /* Not PadnameREFCNT(outer), because ‘outer’ may itself close over another entry. The original pad name owns the buffer. */ - PadnameREFCNT(PADNAME_FROM_PV(PadnamePV(outer)))++; - PadnameFLAGS(pn) = PADNAMEt_OUTER; + PadnameREFCNT_inc(PADNAME_FROM_PV(PadnamePV(outer))); + PadnameFLAGS(pn) = PADNAMEf_OUTER; + if(PadnameIsFIELD(outer)) { + PadnameFIELDINFO(pn) = PadnameFIELDINFO(outer); + PadnameFIELDINFO(pn)->refcount++; + PadnameFLAGS(pn) |= PADNAMEf_FIELD; + } PadnameLEN(pn) = PadnameLEN(outer); return pn; } @@ -2809,6 +2823,16 @@ Perl_padname_free(pTHX_ PADNAME *pn) SvREFCNT_dec(PadnameOURSTASH(pn)); if (PadnameOUTER(pn)) PadnameREFCNT_dec(PADNAME_FROM_PV(PadnamePV(pn))); + if (PadnameIsFIELD(pn)) { + struct padname_fieldinfo *info = PadnameFIELDINFO(pn); + if(!--info->refcount) { + SvREFCNT_dec(info->fieldstash); + /* todo: something about defop */ + SvREFCNT_dec(info->paramname); + + Safefree(info); + } + } Safefree(pn); } } @@ -2851,6 +2875,18 @@ Perl_padname_dup(pTHX_ PADNAME *src, CLO PadnameTYPE (dst) = (HV *)sv_dup_inc((SV *)PadnameTYPE(src), param); PadnameOURSTASH(dst) = (HV *)sv_dup_inc((SV *)PadnameOURSTASH(src), param); + if(PadnameIsFIELD(src) && !PadnameOUTER(src)) { + struct padname_fieldinfo *sinfo = PadnameFIELDINFO(src); + struct padname_fieldinfo *dinfo; + Newxz(dinfo, 1, struct padname_fieldinfo); + + dinfo->refcount = 1; + dinfo->fieldix = sinfo->fieldix; + dinfo->fieldstash = hv_dup_inc(sinfo->fieldstash, param); + dinfo->paramname = sv_dup_inc(sinfo->paramname, param); + + PadnameFIELDINFO(dst) = dinfo; + } dst->xpadn_low = src->xpadn_low; dst->xpadn_high = src->xpadn_high; dst->xpadn_gen = src->xpadn_gen; @@ -2858,6 +2894,91 @@ Perl_padname_dup(pTHX_ PADNAME *src, CLO } #endif /* USE_ITHREADS */ + +/* +=for apidoc_section $lexer +=for apidoc suspend_compcv + +Implements part of the concept of a "suspended compilation CV", which can be +used to pause the parser and compiler during parsing a CV in order to come +back to it later on. + +This function saves the current state of the subroutine under compilation +(C) into the supplied buffer. This should be used initially to +create the state in the buffer, as the final thing before a C within a +block. + + ENTER; + start_subparse(0); + ... + + suspend_compcv(&buffer); + LEAVE; + +Once suspended, the C or C function can +later be used to continue the parsing from the point this stopped. + +=cut +*/ + +void +Perl_suspend_compcv(pTHX_ struct suspended_compcv *buffer) +{ + PERL_ARGS_ASSERT_SUSPEND_COMPCV; + + buffer->compcv = PL_compcv; + + buffer->padix = PL_padix; + buffer->constpadix = PL_constpadix; + + buffer->comppad_name_fill = PL_comppad_name_fill; + buffer->min_intro_pending = PL_min_intro_pending; + buffer->max_intro_pending = PL_max_intro_pending; + + buffer->cv_has_eval = PL_cv_has_eval; + buffer->pad_reset_pending = PL_pad_reset_pending; +} + +/* +=for apidoc resume_compcv_final + +Resumes the parser state previously saved using the C function +for a final time before being compiled into a full CV. This should be used +within an C/C scoped pair. + +=for apidoc resume_compcv_and_save + +Resumes a buffer previously suspended by the C function, in a +way that will be re-suspended at the end of the scope so it can be used again +later. This should be used within an C/C scoped pair. + +=cut +*/ + +void +Perl_resume_compcv(pTHX_ struct suspended_compcv *buffer, bool save) +{ + PERL_ARGS_ASSERT_RESUME_COMPCV; + + SAVESPTR(PL_compcv); + PL_compcv = buffer->compcv; + PAD_SET_CUR(CvPADLIST(PL_compcv), 1); + + SAVESPTR(PL_comppad_name); + PL_comppad_name = PadlistNAMES(CvPADLIST(PL_compcv)); + + SAVESTRLEN(PL_padix); PL_padix = buffer->padix; + SAVESTRLEN(PL_constpadix); PL_constpadix = buffer->constpadix; + SAVESTRLEN(PL_comppad_name_fill); PL_comppad_name_fill = buffer->comppad_name_fill; + SAVESTRLEN(PL_min_intro_pending); PL_min_intro_pending = buffer->min_intro_pending; + SAVESTRLEN(PL_max_intro_pending); PL_max_intro_pending = buffer->max_intro_pending; + + SAVEBOOL(PL_cv_has_eval); PL_cv_has_eval = buffer->cv_has_eval; + SAVEBOOL(PL_pad_reset_pending); PL_pad_reset_pending = buffer->pad_reset_pending; + + if(save) + SAVEDESTRUCTOR_X(&Perl_suspend_compcv, buffer); +} /* * ex: set ts=8 sts=4 sw=4 et: Index: gnu/usr.bin/perl/pad.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/pad.h,v diff -u -p -a -u -p -r1.5 pad.h --- gnu/usr.bin/perl/pad.h 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/pad.h 21 Feb 2024 15:47:02 -0000 @@ -23,8 +23,9 @@ typedef SSize_t PADOFFSET; /* signed so struct padlist { SSize_t xpadl_max; /* max index for which array has space */ union { - PAD ** xpadlarr_alloc; /* Pointer to beginning of array of AVs. - index 0 is a padnamelist * */ + PAD ** xpadlarr_alloc; /* Pointer to beginning of array of AVs. + Note that a 'padnamelist *' is stored + in the 0 index of the AV. */ struct { PADNAMELIST * padnl; PAD * pad_1; /* this slice of PAD * array always alloced */ @@ -54,6 +55,8 @@ struct padnamelist { # define PERL_PADNAME_MINIMAL #endif +struct padname_fieldinfo; + #define _PADNAME_BASE \ char * xpadn_pv; \ HV * xpadn_ourstash; \ @@ -61,6 +64,7 @@ struct padnamelist { HV * xpadn_typestash; \ CV * xpadn_protocv; \ } xpadn_type_u; \ + struct padname_fieldinfo *xpadn_fieldinfo; \ U32 xpadn_low; \ U32 xpadn_high; \ U32 xpadn_refcnt; \ @@ -86,6 +90,19 @@ struct padname_with_str { #define PADNAME_FROM_PV(s) \ ((PADNAME *)((s) - STRUCT_OFFSET(struct padname_with_str, xpadn_str))) +/* Most padnames are not field names. Keep all the field-related info in its + * own substructure, stored in ->xpadn_fieldinfo. + */ +struct padname_fieldinfo { + U32 refcount; + PADOFFSET fieldix; /* index of this field within ObjectFIELDS() array */ + HV *fieldstash; /* original class package which added this field */ + OP *defop; /* optree fragment for defaulting expression */ + SV *paramname; /* name of the :param to look for in constructor */ + int def_if_undef : 1; /* default op uses //= */ + int def_if_false : 1; /* default op uses ||= */ +}; + /* a value that PL_cop_seqmax is guaranteed never to be, * flagging that a lexical is being introduced, or has not yet left scope @@ -131,6 +148,8 @@ typedef enum { #define padadd_NO_DUP_CHECK 0x04 /* skip warning on dups. */ #define padadd_STALEOK 0x08 /* allow stale lexical in active * sub, but only one level up */ +#define padadd_FIELD 0x10 /* set PADNAMEt_FIELD */ +#define padfind_FIELD_OK 0x20 /* pad_findlex is permitted to see fields */ /* ASSERT_CURPAD_LEGAL and ASSERT_CURPAD_ACTIVE respectively determine * whether PL_comppad and PL_curpad are consistent and whether they have @@ -160,8 +179,9 @@ typedef enum { /* Note: the following three macros are actually defined in scope.h, but * they are documented here for completeness, since they directly or - * indirectly affect pads. + * indirectly affect pads. */ +/* =for apidoc m|void|SAVEPADSV |PADOFFSET po Save a pad slot (used to restore after an iteration) @@ -242,6 +262,10 @@ are often referred to as 'fake'. =for apidoc m|bool|PadnameIsSTATE|PADNAME * pn Whether this is a "state" variable. +=for apidoc m|bool|PadnameIsFIELD|PADNAME * pn +Whether this is a "field" variable. PADNAMEs where this is true will +have additional information available via C. + =for apidoc m|HV *|PadnameTYPE|PADNAME * pn The stash associated with a typed lexical. This returns the C<%Foo::> hash for C. @@ -249,6 +273,9 @@ for C. =for apidoc Amx|SSize_t|PadnameREFCNT|PADNAME * pn The reference count of the pad name. +=for apidoc Amx|PADNAME *|PadnameREFCNT_inc|PADNAME * pn +Increases the reference count of the pad name. Returns the pad name itself. + =for apidoc Amx|void|PadnameREFCNT_dec|PADNAME * pn Lowers the reference count of the pad name. @@ -304,6 +331,7 @@ Restore the old pad saved into the local #define PadnamelistMAX(pnl) (pnl)->xpadnl_fill #define PadnamelistMAXNAMED(pnl) (pnl)->xpadnl_max_named #define PadnamelistREFCNT(pnl) (pnl)->xpadnl_refcnt +#define PadnamelistREFCNT_inc(pnl) Perl_padnamelist_refcnt_inc(pnl) #define PadnamelistREFCNT_dec(pnl) Perl_padnamelist_free(aTHX_ pnl) #define PadARRAY(pad) AvARRAY(pad) @@ -315,39 +343,56 @@ Restore the old pad saved into the local #define PadnameSV(pn) \ newSVpvn_flags(PadnamePV(pn), PadnameLEN(pn), SVs_TEMP|SVf_UTF8) #define PadnameFLAGS(pn) (pn)->xpadn_flags -#define PadnameIsOUR(pn) (!!(pn)->xpadn_ourstash) +#define PadnameIsOUR(pn) cBOOL((pn)->xpadn_ourstash) #define PadnameOURSTASH(pn) (pn)->xpadn_ourstash #define PadnameTYPE(pn) (pn)->xpadn_type_u.xpadn_typestash +#define PadnameHasTYPE(pn) cBOOL(PadnameTYPE(pn)) #define PadnamePROTOCV(pn) (pn)->xpadn_type_u.xpadn_protocv #define PadnameREFCNT(pn) (pn)->xpadn_refcnt +#define PadnameREFCNT_inc(pn) Perl_padname_refcnt_inc(pn) #define PadnameREFCNT_dec(pn) Perl_padname_free(aTHX_ pn) #define PadnameOURSTASH_set(pn,s) (PadnameOURSTASH(pn) = (s)) #define PadnameTYPE_set(pn,s) (PadnameTYPE(pn) = (s)) -#define PadnameOUTER(pn) (PadnameFLAGS(pn) & PADNAMEt_OUTER) -#define PadnameIsSTATE(pn) (PadnameFLAGS(pn) & PADNAMEt_STATE) -#define PadnameLVALUE(pn) (PadnameFLAGS(pn) & PADNAMEt_LVALUE) - -#define PadnameLVALUE_on(pn) (PadnameFLAGS(pn) |= PADNAMEt_LVALUE) -#define PadnameIsSTATE_on(pn) (PadnameFLAGS(pn) |= PADNAMEt_STATE) - -#define PADNAMEt_OUTER 1 /* outer lexical var */ -#define PADNAMEt_STATE 2 /* state var */ -#define PADNAMEt_LVALUE 4 /* used as lvalue */ -#define PADNAMEt_TYPED 8 /* for B; unused by core */ -#define PADNAMEt_OUR 16 /* for B; unused by core */ +#define PadnameFIELDINFO(pn) (pn)->xpadn_fieldinfo +#define PadnameOUTER(pn) (PadnameFLAGS(pn) & PADNAMEf_OUTER) +#define PadnameIsSTATE(pn) (PadnameFLAGS(pn) & PADNAMEf_STATE) +#define PadnameLVALUE(pn) (PadnameFLAGS(pn) & PADNAMEf_LVALUE) +#define PadnameIsFIELD(pn) (PadnameFLAGS(pn) & PADNAMEf_FIELD) + +#define PadnameLVALUE_on(pn) (PadnameFLAGS(pn) |= PADNAMEf_LVALUE) +#define PadnameIsSTATE_on(pn) (PadnameFLAGS(pn) |= PADNAMEf_STATE) + +#define PADNAMEf_OUTER 0x01 /* outer lexical var */ +#define PADNAMEf_STATE 0x02 /* state var */ +#define PADNAMEf_LVALUE 0x04 /* used as lvalue */ +#define PADNAMEf_TYPED 0x08 /* for B; unused by core */ +#define PADNAMEf_OUR 0x10 /* for B; unused by core */ +#define PADNAMEf_FIELD 0x20 /* field var */ /* backward compatibility */ -#define SvPAD_STATE PadnameIsSTATE -#define SvPAD_TYPED(pn) (!!PadnameTYPE(pn)) -#define SvPAD_OUR(pn) (!!PadnameOURSTASH(pn)) -#define SvPAD_STATE_on PadnameIsSTATE_on -#define SvPAD_TYPED_on(pn) (PadnameFLAGS(pn) |= PADNAMEt_TYPED) -#define SvPAD_OUR_on(pn) (PadnameFLAGS(pn) |= PADNAMEt_OUR) -#define SvOURSTASH PadnameOURSTASH -#define SvOURSTASH_set PadnameOURSTASH_set -#define SVpad_STATE PADNAMEt_STATE -#define SVpad_TYPED PADNAMEt_TYPED -#define SVpad_OUR PADNAMEt_OUR +#ifndef PERL_CORE +# define SvPAD_STATE PadnameIsSTATE +# define SvPAD_TYPED PadnameHasTYPE +# define SvPAD_OUR(pn) cBOOL(PadnameOURSTASH(pn)) +# define SvPAD_STATE_on PadnameIsSTATE_on +# define SvPAD_TYPED_on(pn) (PadnameFLAGS(pn) |= PADNAMEf_TYPED) +# define SvPAD_OUR_on(pn) (PadnameFLAGS(pn) |= PADNAMEf_OUR) +# define SvOURSTASH PadnameOURSTASH +# define SvOURSTASH_set PadnameOURSTASH_set +# define SVpad_STATE PADNAMEf_STATE +# define SVpad_TYPED PADNAMEf_TYPED +# define SVpad_OUR PADNAMEf_OUR +# define PADNAMEt_OUTER PADNAMEf_OUTER +# define PADNAMEt_STATE PADNAMEf_STATE +# define PADNAMEt_LVALUE PADNAMEf_LVALUE +# define PADNAMEt_TYPED PADNAMEf_TYPED +# define PADNAMEt_OUR PADNAMEf_OUR +#endif + +#ifdef USE_ITHREADS +# define padnamelist_dup_inc(pnl,param) PadnamelistREFCNT_inc(padnamelist_dup(pnl,param)) +# define padname_dup_inc(pn,param) PadnameREFCNT_inc(padname_dup(pn,param)) +#endif #ifdef DEBUGGING # define PAD_SV(po) pad_sv(po) @@ -445,13 +490,12 @@ ling pad (lvalue) to C. #define PAD_COMPNAME(po) PAD_COMPNAME_SV(po) #define PAD_COMPNAME_SV(po) (PadnamelistARRAY(PL_comppad_name)[(po)]) #define PAD_COMPNAME_FLAGS(po) PadnameFLAGS(PAD_COMPNAME(po)) -#define PAD_COMPNAME_FLAGS_isOUR(po) SvPAD_OUR(PAD_COMPNAME_SV(po)) +#define PAD_COMPNAME_FLAGS_isOUR(po) PadnameIsOUR(PAD_COMPNAME_SV(po)) #define PAD_COMPNAME_PV(po) PadnamePV(PAD_COMPNAME(po)) #define PAD_COMPNAME_TYPE(po) PadnameTYPE(PAD_COMPNAME(po)) -#define PAD_COMPNAME_OURSTASH(po) \ - (SvOURSTASH(PAD_COMPNAME_SV(po))) +#define PAD_COMPNAME_OURSTASH(po) (PadnameOURSTASH(PAD_COMPNAME_SV(po))) #define PAD_COMPNAME_GEN(po) \ ((STRLEN)PadnamelistARRAY(PL_comppad_name)[po]->xpadn_gen) @@ -512,6 +556,18 @@ instead of a string/length pair. #define pad_findmy_pvs(name,flags) \ Perl_pad_findmy_pvn(aTHX_ STR_WITH_LEN(name), flags) + +struct suspended_compcv +{ + CV *compcv; + STRLEN padix, constpadix; + STRLEN comppad_name_fill; + STRLEN min_intro_pending, max_intro_pending; + bool cv_has_eval, pad_reset_pending; +}; + +#define resume_compcv_final(buffer) Perl_resume_compcv(aTHX_ buffer, false) +#define resume_compcv_and_save(buffer) Perl_resume_compcv(aTHX_ buffer, true) /* * ex: set ts=8 sts=4 sw=4 et: Index: gnu/usr.bin/perl/patchlevel.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/patchlevel.h,v diff -u -p -a -u -p -r1.54 patchlevel.h --- gnu/usr.bin/perl/patchlevel.h 23 Dec 2023 21:02:20 -0000 1.54 +++ gnu/usr.bin/perl/patchlevel.h 21 Feb 2024 15:47:02 -0000 @@ -38,8 +38,8 @@ Instead use one of the version compariso * exactly on the third column */ #define PERL_REVISION 5 /* age */ -#define PERL_VERSION 36 /* epoch */ -#define PERL_SUBVERSION 3 /* generation */ +#define PERL_VERSION 38 /* epoch */ +#define PERL_SUBVERSION 2 /* generation */ /* The following numbers describe the earliest compatible version of Perl ("compatibility" here being defined as sufficient binary/API @@ -59,7 +59,7 @@ Instead use one of the version compariso changing them should not be necessary. */ #define PERL_API_REVISION 5 -#define PERL_API_VERSION 36 +#define PERL_API_VERSION 38 #define PERL_API_SUBVERSION 0 /* XXX Note: The selection of non-default Configure options, such @@ -118,11 +118,12 @@ open PLIN, "<", "patchlevel.h" or die "C open PLOUT, ">", "patchlevel.new" or die "Couldn't write on patchlevel.new : $!"; my $seen=0; while () { - if (/\t,NULL/ and $seen) { + if (/^(\s+),NULL/ and $seen) { + my $pre = $1; while (my $c = shift @ARGV){ $c =~ s|\\|\\\\|g; $c =~ s|"|\\"|g; - print PLOUT qq{\t,"$c"\n}; + print PLOUT qq{$pre,"$c"\n}; } } $seen++ if /local_patches\[\]/; @@ -153,7 +154,7 @@ hunk. # define PERL_PATCHNUM "UNKNOWN-microperl" # define PERL_GIT_UNPUSHED_COMMITS /*leave-this-comment*/ # else -#include "git_version.h" +# include "git_version.h" # endif static const char * const local_patches[] = { NULL @@ -167,7 +168,7 @@ static const char * const local_patches[ /* Initial space prevents this variable from being inserted in config.sh */ -# define LOCAL_PATCH_COUNT \ +# define LOCAL_PATCH_COUNT \ ((int)(C_ARRAY_LENGTH(local_patches)-2)) /* the old terms of reference, add them only when explicitly included */ Index: gnu/usr.bin/perl/peep.c =================================================================== RCS file: gnu/usr.bin/perl/peep.c diff -N gnu/usr.bin/perl/peep.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/peep.c 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,4227 @@ +/* peep.c + * + * Copyright (C) 1991-2022 by Larry Wall and others + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the README file. + * + */ + +/* + * Aragorn sped on up the hill. Every now and again he bent to the ground. + * Hobbits go light, and their footprints are not easy even for a Ranger to + * read, but not far from the top a spring crossed the path, and in the wet + * earth he saw what he was seeking. + * 'I read the signs aright,' he said to himself. 'Frodo ran to the hill-top. + * I wonder what he saw there? But he returned by the same way, and went down + * the hill again.' + */ + +/* This file contains functions for optimizing and finalizing the OP + * structures that hold a compiled perl program + */ + +#include "EXTERN.h" +#define PERL_IN_PEEP_C +#include "perl.h" + + +#define CALL_RPEEP(o) PL_rpeepp(aTHX_ o) + + +static void +S_scalar_slice_warning(pTHX_ const OP *o) +{ + OP *kid; + const bool is_hash = o->op_type == OP_HSLICE + || (o->op_type == OP_NULL && o->op_targ == OP_HSLICE); + SV *name; + + if (!(o->op_private & OPpSLICEWARNING)) + return; + if (PL_parser && PL_parser->error_count) + /* This warning can be nonsensical when there is a syntax error. */ + return; + + kid = cLISTOPo->op_first; + kid = OpSIBLING(kid); /* get past pushmark */ + /* weed out false positives: any ops that can return lists */ + switch (kid->op_type) { + case OP_BACKTICK: + case OP_GLOB: + case OP_READLINE: + case OP_MATCH: + case OP_RV2AV: + case OP_EACH: + case OP_VALUES: + case OP_KEYS: + case OP_SPLIT: + case OP_LIST: + case OP_SORT: + case OP_REVERSE: + case OP_ENTERSUB: + case OP_CALLER: + case OP_LSTAT: + case OP_STAT: + case OP_READDIR: + case OP_SYSTEM: + case OP_TMS: + case OP_LOCALTIME: + case OP_GMTIME: + case OP_ENTEREVAL: + return; + } + + /* Don't warn if we have a nulled list either. */ + if (kid->op_type == OP_NULL && kid->op_targ == OP_LIST) + return; + + assert(OpSIBLING(kid)); + name = op_varname(OpSIBLING(kid)); + if (!name) /* XS module fiddling with the op tree */ + return; + warn_elem_scalar_context(kid, name, is_hash, true); +} + + +/* info returned by S_sprintf_is_multiconcatable() */ + +struct sprintf_ismc_info { + SSize_t nargs; /* num of args to sprintf (not including the format) */ + char *start; /* start of raw format string */ + char *end; /* bytes after end of raw format string */ + STRLEN total_len; /* total length (in bytes) of format string, not + including '%s' and half of '%%' */ + STRLEN variant; /* number of bytes by which total_len_p would grow + if upgraded to utf8 */ + bool utf8; /* whether the format is utf8 */ +}; + +/* is the OP_SPRINTF o suitable for converting into a multiconcat op? + * i.e. its format argument is a const string with only '%s' and '%%' + * formats, and the number of args is known, e.g. + * sprintf "a=%s f=%s", $a[0], scalar(f()); + * but not + * sprintf "i=%d a=%s f=%s", $i, @a, f(); + * + * If successful, the sprintf_ismc_info struct pointed to by info will be + * populated. + */ + +STATIC bool +S_sprintf_is_multiconcatable(pTHX_ OP *o,struct sprintf_ismc_info *info) +{ + OP *pm, *constop, *kid; + SV *sv; + char *s, *e, *p; + SSize_t nargs, nformats; + STRLEN cur, total_len, variant; + bool utf8; + + /* if sprintf's behaviour changes, die here so that someone + * can decide whether to enhance this function or skip optimising + * under those new circumstances */ + assert(!(o->op_flags & OPf_STACKED)); + assert(!(PL_opargs[OP_SPRINTF] & OA_TARGLEX)); + assert(!(o->op_private & ~OPpARG4_MASK)); + + pm = cUNOPo->op_first; + if (pm->op_type != OP_PUSHMARK) /* weird coreargs stuff */ + return FALSE; + constop = OpSIBLING(pm); + if (!constop || constop->op_type != OP_CONST) + return FALSE; + sv = cSVOPx_sv(constop); + if (SvMAGICAL(sv) || !SvPOK(sv)) + return FALSE; + + s = SvPV(sv, cur); + e = s + cur; + + /* Scan format for %% and %s and work out how many %s there are. + * Abandon if other format types are found. + */ + + nformats = 0; + total_len = 0; + variant = 0; + + for (p = s; p < e; p++) { + if (*p != '%') { + total_len++; + if (!UTF8_IS_INVARIANT(*p)) + variant++; + continue; + } + p++; + if (p >= e) + return FALSE; /* lone % at end gives "Invalid conversion" */ + if (*p == '%') + total_len++; + else if (*p == 's') + nformats++; + else + return FALSE; + } + + if (!nformats || nformats > PERL_MULTICONCAT_MAXARG) + return FALSE; + + utf8 = cBOOL(SvUTF8(sv)); + if (utf8) + variant = 0; + + /* scan args; they must all be in scalar cxt */ + + nargs = 0; + kid = OpSIBLING(constop); + + while (kid) { + if ((kid->op_flags & OPf_WANT) != OPf_WANT_SCALAR) + return FALSE; + nargs++; + kid = OpSIBLING(kid); + } + + if (nargs != nformats) + return FALSE; /* e.g. sprintf("%s%s", $a); */ + + + info->nargs = nargs; + info->start = s; + info->end = e; + info->total_len = total_len; + info->variant = variant; + info->utf8 = utf8; + + return TRUE; +} + +/* S_maybe_multiconcat(): + * + * given an OP_STRINGIFY, OP_SASSIGN, OP_CONCAT or OP_SPRINTF op, possibly + * convert it (and its children) into an OP_MULTICONCAT. See the code + * comments just before pp_multiconcat() for the full details of what + * OP_MULTICONCAT supports. + * + * Basically we're looking for an optree with a chain of OP_CONCATS down + * the LHS (or an OP_SPRINTF), with possibly an OP_SASSIGN, and/or + * OP_STRINGIFY, and/or OP_CONCAT acting as '.=' at its head, e.g. + * + * $x = "$a$b-$c" + * + * looks like + * + * SASSIGN + * | + * STRINGIFY -- PADSV[$x] + * | + * | + * ex-PUSHMARK -- CONCAT/S + * | + * CONCAT/S -- PADSV[$d] + * | + * CONCAT -- CONST["-"] + * | + * PADSV[$a] -- PADSV[$b] + * + * Note that at this stage the OP_SASSIGN may have already been optimised + * away with OPpTARGET_MY set on the OP_STRINGIFY or OP_CONCAT. + */ + +STATIC void +S_maybe_multiconcat(pTHX_ OP *o) +{ + OP *lastkidop; /* the right-most of any kids unshifted onto o */ + OP *topop; /* the top-most op in the concat tree (often equals o, + unless there are assign/stringify ops above it */ + OP *parentop; /* the parent op of topop (or itself if no parent) */ + OP *targmyop; /* the op (if any) with the OPpTARGET_MY flag */ + OP *targetop; /* the op corresponding to target=... or target.=... */ + OP *stringop; /* the OP_STRINGIFY op, if any */ + OP *nextop; /* used for recreating the op_next chain without consts */ + OP *kid; /* general-purpose op pointer */ + UNOP_AUX_item *aux; + UNOP_AUX_item *lenp; + char *const_str, *p; + struct sprintf_ismc_info sprintf_info; + + /* store info about each arg in args[]; + * toparg is the highest used slot; argp is a general + * pointer to args[] slots */ + struct { + void *p; /* initially points to const sv (or null for op); + later, set to SvPV(constsv), with ... */ + STRLEN len; /* ... len set to SvPV(..., len) */ + } *argp, *toparg, args[PERL_MULTICONCAT_MAXARG*2 + 1]; + + SSize_t nargs = 0; + SSize_t nconst = 0; + SSize_t nadjconst = 0; /* adjacent consts - may be demoted to args */ + STRLEN variant; + bool utf8 = FALSE; + bool kid_is_last = FALSE; /* most args will be the RHS kid of a concat op; + the last-processed arg will the LHS of one, + as args are processed in reverse order */ + U8 stacked_last = 0; /* whether the last seen concat op was STACKED */ + STRLEN total_len = 0; /* sum of the lengths of the const segments */ + U8 flags = 0; /* what will become the op_flags and ... */ + U8 private_flags = 0; /* ... op_private of the multiconcat op */ + bool is_sprintf = FALSE; /* we're optimising an sprintf */ + bool is_targable = FALSE; /* targetop is an OPpTARGET_MY candidate */ + bool prev_was_const = FALSE; /* previous arg was a const */ + + /* ----------------------------------------------------------------- + * Phase 1: + * + * Examine the optree non-destructively to determine whether it's + * suitable to be converted into an OP_MULTICONCAT. Accumulate + * information about the optree in args[]. + */ + + argp = args; + targmyop = NULL; + targetop = NULL; + stringop = NULL; + topop = o; + parentop = o; + + assert( o->op_type == OP_SASSIGN + || o->op_type == OP_CONCAT + || o->op_type == OP_SPRINTF + || o->op_type == OP_STRINGIFY); + + Zero(&sprintf_info, 1, struct sprintf_ismc_info); + + /* first see if, at the top of the tree, there is an assign, + * append and/or stringify */ + + if (topop->op_type == OP_SASSIGN) { + /* expr = ..... */ + if (o->op_ppaddr != PL_ppaddr[OP_SASSIGN]) + return; + if (o->op_private & (OPpASSIGN_BACKWARDS|OPpASSIGN_CV_TO_GV)) + return; + assert(!(o->op_private & ~OPpARG2_MASK)); /* barf on unknown flags */ + + parentop = topop; + topop = cBINOPo->op_first; + targetop = OpSIBLING(topop); + if (!targetop) /* probably some sort of syntax error */ + return; + + /* don't optimise away assign in 'local $foo = ....' */ + if ( (targetop->op_private & OPpLVAL_INTRO) + /* these are the common ops which do 'local', but + * not all */ + && ( targetop->op_type == OP_GVSV + || targetop->op_type == OP_RV2SV + || targetop->op_type == OP_AELEM + || targetop->op_type == OP_HELEM + ) + ) + return; + } + else if ( topop->op_type == OP_CONCAT + && (topop->op_flags & OPf_STACKED) + && (!(topop->op_private & OPpCONCAT_NESTED)) + ) + { + /* expr .= ..... */ + + /* OPpTARGET_MY shouldn't be able to be set here. If it is, + * decide what to do about it */ + assert(!(o->op_private & OPpTARGET_MY)); + + /* barf on unknown flags */ + assert(!(o->op_private & ~(OPpARG2_MASK|OPpTARGET_MY))); + private_flags |= OPpMULTICONCAT_APPEND; + targetop = cBINOPo->op_first; + parentop = topop; + topop = OpSIBLING(targetop); + + /* $x .= gets optimised to rcatline instead */ + if (topop->op_type == OP_READLINE) + return; + } + + if (targetop) { + /* Can targetop (the LHS) if it's a padsv, be optimised + * away and use OPpTARGET_MY instead? + */ + if ( (targetop->op_type == OP_PADSV) + && !(targetop->op_private & OPpDEREF) + && !(targetop->op_private & OPpPAD_STATE) + /* we don't support 'my $x .= ...' */ + && ( o->op_type == OP_SASSIGN + || !(targetop->op_private & OPpLVAL_INTRO)) + ) + is_targable = TRUE; + } + + if (topop->op_type == OP_STRINGIFY) { + if (topop->op_ppaddr != PL_ppaddr[OP_STRINGIFY]) + return; + stringop = topop; + + /* barf on unknown flags */ + assert(!(o->op_private & ~(OPpARG4_MASK|OPpTARGET_MY))); + + if ((topop->op_private & OPpTARGET_MY)) { + if (o->op_type == OP_SASSIGN) + return; /* can't have two assigns */ + targmyop = topop; + } + + private_flags |= OPpMULTICONCAT_STRINGIFY; + parentop = topop; + topop = cBINOPx(topop)->op_first; + assert(OP_TYPE_IS_OR_WAS_NN(topop, OP_PUSHMARK)); + topop = OpSIBLING(topop); + } + + if (topop->op_type == OP_SPRINTF) { + if (topop->op_ppaddr != PL_ppaddr[OP_SPRINTF]) + return; + if (S_sprintf_is_multiconcatable(aTHX_ topop, &sprintf_info)) { + nargs = sprintf_info.nargs; + total_len = sprintf_info.total_len; + variant = sprintf_info.variant; + utf8 = sprintf_info.utf8; + is_sprintf = TRUE; + private_flags |= OPpMULTICONCAT_FAKE; + toparg = argp; + /* we have an sprintf op rather than a concat optree. + * Skip most of the code below which is associated with + * processing that optree. We also skip phase 2, determining + * whether its cost effective to optimise, since for sprintf, + * multiconcat is *always* faster */ + goto create_aux; + } + /* note that even if the sprintf itself isn't multiconcatable, + * the expression as a whole may be, e.g. in + * $x .= sprintf("%d",...) + * the sprintf op will be left as-is, but the concat/S op may + * be upgraded to multiconcat + */ + } + else if (topop->op_type == OP_CONCAT) { + if (topop->op_ppaddr != PL_ppaddr[OP_CONCAT]) + return; + + if ((topop->op_private & OPpTARGET_MY)) { + if (o->op_type == OP_SASSIGN || targmyop) + return; /* can't have two assigns */ + targmyop = topop; + } + } + + /* Is it safe to convert a sassign/stringify/concat op into + * a multiconcat? */ + assert((PL_opargs[OP_SASSIGN] & OA_CLASS_MASK) == OA_BINOP); + assert((PL_opargs[OP_CONCAT] & OA_CLASS_MASK) == OA_BINOP); + assert((PL_opargs[OP_STRINGIFY] & OA_CLASS_MASK) == OA_LISTOP); + assert((PL_opargs[OP_SPRINTF] & OA_CLASS_MASK) == OA_LISTOP); + STATIC_ASSERT_STMT( STRUCT_OFFSET(BINOP, op_last) + == STRUCT_OFFSET(UNOP_AUX, op_aux)); + STATIC_ASSERT_STMT( STRUCT_OFFSET(LISTOP, op_last) + == STRUCT_OFFSET(UNOP_AUX, op_aux)); + + /* Now scan the down the tree looking for a series of + * CONCAT/OPf_STACKED ops on the LHS (with the last one not + * stacked). For example this tree: + * + * | + * CONCAT/STACKED + * | + * CONCAT/STACKED -- EXPR5 + * | + * CONCAT/STACKED -- EXPR4 + * | + * CONCAT -- EXPR3 + * | + * EXPR1 -- EXPR2 + * + * corresponds to an expression like + * + * (EXPR1 . EXPR2 . EXPR3 . EXPR4 . EXPR5) + * + * Record info about each EXPR in args[]: in particular, whether it is + * a stringifiable OP_CONST and if so what the const sv is. + * + * The reason why the last concat can't be STACKED is the difference + * between + * + * ((($a .= $a) .= $a) .= $a) .= $a + * + * and + * $a . $a . $a . $a . $a + * + * The main difference between the optrees for those two constructs + * is the presence of the last STACKED. As well as modifying $a, + * the former sees the changed $a between each concat, so if $s is + * initially 'a', the first returns 'a' x 16, while the latter returns + * 'a' x 5. And pp_multiconcat can't handle that kind of thing. + */ + + kid = topop; + + for (;;) { + OP *argop; + SV *sv; + bool last = FALSE; + + if ( kid->op_type == OP_CONCAT + && !kid_is_last + ) { + OP *k1, *k2; + k1 = cUNOPx(kid)->op_first; + k2 = OpSIBLING(k1); + /* shouldn't happen except maybe after compile err? */ + if (!k2) + return; + + /* avoid turning (A . B . ($lex = C) ...) into (A . B . C ...) */ + if (kid->op_private & OPpTARGET_MY) + kid_is_last = TRUE; + + stacked_last = (kid->op_flags & OPf_STACKED); + if (!stacked_last) + kid_is_last = TRUE; + + kid = k1; + argop = k2; + } + else { + argop = kid; + last = TRUE; + } + + if ( nargs + nadjconst > PERL_MULTICONCAT_MAXARG - 2 + || (argp - args + 1) > (PERL_MULTICONCAT_MAXARG*2 + 1) - 2) + { + /* At least two spare slots are needed to decompose both + * concat args. If there are no slots left, continue to + * examine the rest of the optree, but don't push new values + * on args[]. If the optree as a whole is legal for conversion + * (in particular that the last concat isn't STACKED), then + * the first PERL_MULTICONCAT_MAXARG elements of the optree + * can be converted into an OP_MULTICONCAT now, with the first + * child of that op being the remainder of the optree - + * which may itself later be converted to a multiconcat op + * too. + */ + if (last) { + /* the last arg is the rest of the optree */ + argp++->p = NULL; + nargs++; + } + } + else if ( argop->op_type == OP_CONST + && ((sv = cSVOPx_sv(argop))) + /* defer stringification until runtime of 'constant' + * things that might stringify variantly, e.g. the radix + * point of NVs, or overloaded RVs */ + && (SvPOK(sv) || SvIOK(sv)) + && (!SvGMAGICAL(sv)) + ) { + if (argop->op_private & OPpCONST_STRICT) + no_bareword_allowed(argop); + argp++->p = sv; + utf8 |= cBOOL(SvUTF8(sv)); + nconst++; + if (prev_was_const) + /* this const may be demoted back to a plain arg later; + * make sure we have enough arg slots left */ + nadjconst++; + prev_was_const = !prev_was_const; + } + else { + argp++->p = NULL; + nargs++; + prev_was_const = FALSE; + } + + if (last) + break; + } + + toparg = argp - 1; + + if (stacked_last) + return; /* we don't support ((A.=B).=C)...) */ + + /* look for two adjacent consts and don't fold them together: + * $o . "a" . "b" + * should do + * $o->concat("a")->concat("b") + * rather than + * $o->concat("ab") + * (but $o .= "a" . "b" should still fold) + */ + { + bool seen_nonconst = FALSE; + for (argp = toparg; argp >= args; argp--) { + if (argp->p == NULL) { + seen_nonconst = TRUE; + continue; + } + if (!seen_nonconst) + continue; + if (argp[1].p) { + /* both previous and current arg were constants; + * leave the current OP_CONST as-is */ + argp->p = NULL; + nconst--; + nargs++; + } + } + } + + /* ----------------------------------------------------------------- + * Phase 2: + * + * At this point we have determined that the optree *can* be converted + * into a multiconcat. Having gathered all the evidence, we now decide + * whether it *should*. + */ + + + /* we need at least one concat action, e.g.: + * + * Y . Z + * X = Y . Z + * X .= Y + * + * otherwise we could be doing something like $x = "foo", which + * if treated as a concat, would fail to COW. + */ + if (nargs + nconst + cBOOL(private_flags & OPpMULTICONCAT_APPEND) < 2) + return; + + /* Benchmarking seems to indicate that we gain if: + * * we optimise at least two actions into a single multiconcat + * (e.g concat+concat, sassign+concat); + * * or if we can eliminate at least 1 OP_CONST; + * * or if we can eliminate a padsv via OPpTARGET_MY + */ + + if ( + /* eliminated at least one OP_CONST */ + nconst >= 1 + /* eliminated an OP_SASSIGN */ + || o->op_type == OP_SASSIGN + /* eliminated an OP_PADSV */ + || (!targmyop && is_targable) + ) + /* definitely a net gain to optimise */ + goto optimise; + + /* ... if not, what else? */ + + /* special-case '$lex1 = expr . $lex1' (where expr isn't lex1): + * multiconcat is faster (due to not creating a temporary copy of + * $lex1), whereas for a general $lex1 = $lex2 . $lex3, concat is + * faster. + */ + if ( nconst == 0 + && nargs == 2 + && targmyop + && topop->op_type == OP_CONCAT + ) { + PADOFFSET t = targmyop->op_targ; + OP *k1 = cBINOPx(topop)->op_first; + OP *k2 = cBINOPx(topop)->op_last; + if ( k2->op_type == OP_PADSV + && k2->op_targ == t + && ( k1->op_type != OP_PADSV + || k1->op_targ != t) + ) + goto optimise; + } + + /* need at least two concats */ + if (nargs + nconst + cBOOL(private_flags & OPpMULTICONCAT_APPEND) < 3) + return; + + + + /* ----------------------------------------------------------------- + * Phase 3: + * + * At this point the optree has been verified as ok to be optimised + * into an OP_MULTICONCAT. Now start changing things. + */ + + optimise: + + /* stringify all const args and determine utf8ness */ + + variant = 0; + for (argp = args; argp <= toparg; argp++) { + SV *sv = (SV*)argp->p; + if (!sv) + continue; /* not a const op */ + if (utf8 && !SvUTF8(sv)) + sv_utf8_upgrade_nomg(sv); + argp->p = SvPV_nomg(sv, argp->len); + total_len += argp->len; + + /* see if any strings would grow if converted to utf8 */ + if (!utf8) { + variant += variant_under_utf8_count((U8 *) argp->p, + (U8 *) argp->p + argp->len); + } + } + + /* create and populate aux struct */ + + create_aux: + + aux = (UNOP_AUX_item*)PerlMemShared_malloc( + sizeof(UNOP_AUX_item) + * ( + PERL_MULTICONCAT_HEADER_SIZE + + ((nargs + 1) * (variant ? 2 : 1)) + ) + ); + const_str = (char *)PerlMemShared_malloc(total_len ? total_len : 1); + + /* Extract all the non-const expressions from the concat tree then + * dispose of the old tree, e.g. convert the tree from this: + * + * o => SASSIGN + * | + * STRINGIFY -- TARGET + * | + * ex-PUSHMARK -- CONCAT + * | + * CONCAT -- EXPR5 + * | + * CONCAT -- EXPR4 + * | + * CONCAT -- EXPR3 + * | + * EXPR1 -- EXPR2 + * + * + * to: + * + * o => MULTICONCAT + * | + * ex-PUSHMARK -- EXPR1 -- EXPR2 -- EXPR3 -- EXPR4 -- EXPR5 -- TARGET + * + * except that if EXPRi is an OP_CONST, it's discarded. + * + * During the conversion process, EXPR ops are stripped from the tree + * and unshifted onto o. Finally, any of o's remaining original + * children are discarded and o is converted into an OP_MULTICONCAT. + * + * In this middle of this, o may contain both: unshifted args on the + * left, and some remaining original args on the right. lastkidop + * is set to point to the right-most unshifted arg to delineate + * between the two sets. + */ + + + if (is_sprintf) { + /* create a copy of the format with the %'s removed, and record + * the sizes of the const string segments in the aux struct */ + char *q, *oldq; + lenp = aux + PERL_MULTICONCAT_IX_LENGTHS; + + p = sprintf_info.start; + q = const_str; + oldq = q; + for (; p < sprintf_info.end; p++) { + if (*p == '%') { + p++; + if (*p != '%') { + (lenp++)->ssize = q - oldq; + oldq = q; + continue; + } + } + *q++ = *p; + } + lenp->ssize = q - oldq; + assert((STRLEN)(q - const_str) == total_len); + + /* Attach all the args (i.e. the kids of the sprintf) to o (which + * may or may not be topop) The pushmark and const ops need to be + * kept in case they're an op_next entry point. + */ + lastkidop = cLISTOPx(topop)->op_last; + kid = cUNOPx(topop)->op_first; /* pushmark */ + op_null(kid); + op_null(OpSIBLING(kid)); /* const */ + if (o != topop) { + kid = op_sibling_splice(topop, NULL, -1, NULL); /* cut all args */ + op_sibling_splice(o, NULL, 0, kid); /* and attach to o */ + lastkidop->op_next = o; + } + } + else { + p = const_str; + lenp = aux + PERL_MULTICONCAT_IX_LENGTHS; + + lenp->ssize = -1; + + /* Concatenate all const strings into const_str. + * Note that args[] contains the RHS args in reverse order, so + * we scan args[] from top to bottom to get constant strings + * in L-R order + */ + for (argp = toparg; argp >= args; argp--) { + if (!argp->p) + /* not a const op */ + (++lenp)->ssize = -1; + else { + STRLEN l = argp->len; + Copy(argp->p, p, l, char); + p += l; + if (lenp->ssize == -1) + lenp->ssize = l; + else + lenp->ssize += l; + } + } + + kid = topop; + nextop = o; + lastkidop = NULL; + + for (argp = args; argp <= toparg; argp++) { + /* only keep non-const args, except keep the first-in-next-chain + * arg no matter what it is (but nulled if OP_CONST), because it + * may be the entry point to this subtree from the previous + * op_next. + */ + bool last = (argp == toparg); + OP *prev; + + /* set prev to the sibling *before* the arg to be cut out, + * e.g. when cutting EXPR: + * + * | + * kid= CONCAT + * | + * prev= CONCAT -- EXPR + * | + */ + if (argp == args && kid->op_type != OP_CONCAT) { + /* in e.g. '$x .= f(1)' there's no RHS concat tree + * so the expression to be cut isn't kid->op_last but + * kid itself */ + OP *o1, *o2; + /* find the op before kid */ + o1 = NULL; + o2 = cUNOPx(parentop)->op_first; + while (o2 && o2 != kid) { + o1 = o2; + o2 = OpSIBLING(o2); + } + assert(o2 == kid); + prev = o1; + kid = parentop; + } + else if (kid == o && lastkidop) + prev = last ? lastkidop : OpSIBLING(lastkidop); + else + prev = last ? NULL : cUNOPx(kid)->op_first; + + if (!argp->p || last) { + /* cut RH op */ + OP *aop = op_sibling_splice(kid, prev, 1, NULL); + /* and unshift to front of o */ + op_sibling_splice(o, NULL, 0, aop); + /* record the right-most op added to o: later we will + * free anything to the right of it */ + if (!lastkidop) + lastkidop = aop; + aop->op_next = nextop; + if (last) { + if (argp->p) + /* null the const at start of op_next chain */ + op_null(aop); + } + else if (prev) + nextop = prev->op_next; + } + + /* the last two arguments are both attached to the same concat op */ + if (argp < toparg - 1) + kid = prev; + } + } + + /* Populate the aux struct */ + + aux[PERL_MULTICONCAT_IX_NARGS].ssize = nargs; + aux[PERL_MULTICONCAT_IX_PLAIN_PV].pv = utf8 ? NULL : const_str; + aux[PERL_MULTICONCAT_IX_PLAIN_LEN].ssize = utf8 ? 0 : total_len; + aux[PERL_MULTICONCAT_IX_UTF8_PV].pv = const_str; + aux[PERL_MULTICONCAT_IX_UTF8_LEN].ssize = total_len; + + /* if variant > 0, calculate a variant const string and lengths where + * the utf8 version of the string will take 'variant' more bytes than + * the plain one. */ + + if (variant) { + char *p = const_str; + STRLEN ulen = total_len + variant; + UNOP_AUX_item *lens = aux + PERL_MULTICONCAT_IX_LENGTHS; + UNOP_AUX_item *ulens = lens + (nargs + 1); + char *up = (char*)PerlMemShared_malloc(ulen); + SSize_t n; + + aux[PERL_MULTICONCAT_IX_UTF8_PV].pv = up; + aux[PERL_MULTICONCAT_IX_UTF8_LEN].ssize = ulen; + + for (n = 0; n < (nargs + 1); n++) { + SSize_t i; + char * orig_up = up; + for (i = (lens++)->ssize; i > 0; i--) { + U8 c = *p++; + append_utf8_from_native_byte(c, (U8**)&up); + } + (ulens++)->ssize = (i < 0) ? i : up - orig_up; + } + } + + if (stringop) { + /* if there was a top(ish)-level OP_STRINGIFY, we need to keep + * that op's first child - an ex-PUSHMARK - because the op_next of + * the previous op may point to it (i.e. it's the entry point for + * the o optree) + */ + OP *pmop = + (stringop == o) + ? op_sibling_splice(o, lastkidop, 1, NULL) + : op_sibling_splice(stringop, NULL, 1, NULL); + assert(OP_TYPE_IS_OR_WAS_NN(pmop, OP_PUSHMARK)); + op_sibling_splice(o, NULL, 0, pmop); + if (!lastkidop) + lastkidop = pmop; + } + + /* Optimise + * target = A.B.C... + * target .= A.B.C... + */ + + if (targetop) { + assert(!targmyop); + + if (o->op_type == OP_SASSIGN) { + /* Move the target subtree from being the last of o's children + * to being the last of o's preserved children. + * Note the difference between 'target = ...' and 'target .= ...': + * for the former, target is executed last; for the latter, + * first. + */ + kid = OpSIBLING(lastkidop); + op_sibling_splice(o, kid, 1, NULL); /* cut target op */ + op_sibling_splice(o, lastkidop, 0, targetop); /* and paste */ + lastkidop->op_next = kid->op_next; + lastkidop = targetop; + } + else { + /* Move the target subtree from being the first of o's + * original children to being the first of *all* o's children. + */ + if (lastkidop) { + op_sibling_splice(o, lastkidop, 1, NULL); /* cut target op */ + op_sibling_splice(o, NULL, 0, targetop); /* and paste*/ + } + else { + /* if the RHS of .= doesn't contain a concat (e.g. + * $x .= "foo"), it gets missed by the "strip ops from the + * tree and add to o" loop earlier */ + assert(topop->op_type != OP_CONCAT); + if (stringop) { + /* in e.g. $x .= "$y", move the $y expression + * from being a child of OP_STRINGIFY to being the + * second child of the OP_CONCAT + */ + assert(cUNOPx(stringop)->op_first == topop); + op_sibling_splice(stringop, NULL, 1, NULL); + op_sibling_splice(o, cUNOPo->op_first, 0, topop); + } + assert(topop == OpSIBLING(cBINOPo->op_first)); + if (toparg->p) + op_null(topop); + lastkidop = topop; + } + } + + if (is_targable) { + /* optimise + * my $lex = A.B.C... + * $lex = A.B.C... + * $lex .= A.B.C... + * The original padsv op is kept but nulled in case it's the + * entry point for the optree (which it will be for + * '$lex .= ... ' + */ + private_flags |= OPpTARGET_MY; + private_flags |= (targetop->op_private & OPpLVAL_INTRO); + o->op_targ = targetop->op_targ; + targetop->op_targ = 0; + op_null(targetop); + } + else + flags |= OPf_STACKED; + } + else if (targmyop) { + private_flags |= OPpTARGET_MY; + if (o != targmyop) { + o->op_targ = targmyop->op_targ; + targmyop->op_targ = 0; + } + } + + /* detach the emaciated husk of the sprintf/concat optree and free it */ + for (;;) { + kid = op_sibling_splice(o, lastkidop, 1, NULL); + if (!kid) + break; + op_free(kid); + } + + /* and convert o into a multiconcat */ + + o->op_flags = (flags|OPf_KIDS|stacked_last + |(o->op_flags & (OPf_WANT|OPf_PARENS))); + o->op_private = private_flags; + o->op_type = OP_MULTICONCAT; + o->op_ppaddr = PL_ppaddr[OP_MULTICONCAT]; + cUNOP_AUXo->op_aux = aux; +} + + +/* +=for apidoc_section $optree_manipulation + +=for apidoc optimize_optree + +This function applies some optimisations to the optree in top-down order. +It is called before the peephole optimizer, which processes ops in +execution order. Note that finalize_optree() also does a top-down scan, +but is called *after* the peephole optimizer. + +=cut +*/ + +void +Perl_optimize_optree(pTHX_ OP* o) +{ + PERL_ARGS_ASSERT_OPTIMIZE_OPTREE; + + ENTER; + SAVEVPTR(PL_curcop); + + optimize_op(o); + + LEAVE; +} + + +#define warn_implicit_snail_cvsig(o) S_warn_implicit_snail_cvsig(aTHX_ o) +static void +S_warn_implicit_snail_cvsig(pTHX_ OP *o) +{ + CV *cv = PL_compcv; + while(cv && CvEVAL(cv)) + cv = CvOUTSIDE(cv); + + if(cv && CvSIGNATURE(cv)) + Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES), + "Implicit use of @_ in %s with signatured subroutine is experimental", OP_DESC(o)); +} + + +#define OP_ZOOM(o) (OP_TYPE_IS(o, OP_NULL) ? cUNOPx(o)->op_first : (o)) + +/* helper for optimize_optree() which optimises one op then recurses + * to optimise any children. + */ + +STATIC void +S_optimize_op(pTHX_ OP* o) +{ + OP *top_op = o; + + PERL_ARGS_ASSERT_OPTIMIZE_OP; + + while (1) { + OP * next_kid = NULL; + + assert(o->op_type != OP_FREED); + + switch (o->op_type) { + case OP_NEXTSTATE: + case OP_DBSTATE: + PL_curcop = ((COP*)o); /* for warnings */ + break; + + + case OP_CONCAT: + case OP_SASSIGN: + case OP_STRINGIFY: + case OP_SPRINTF: + S_maybe_multiconcat(aTHX_ o); + break; + + case OP_SUBST: + if (cPMOPo->op_pmreplrootu.op_pmreplroot) { + /* we can't assume that op_pmreplroot->op_sibparent == o + * and that it is thus possible to walk back up the tree + * past op_pmreplroot. So, although we try to avoid + * recursing through op trees, do it here. After all, + * there are unlikely to be many nested s///e's within + * the replacement part of a s///e. + */ + optimize_op(cPMOPo->op_pmreplrootu.op_pmreplroot); + } + break; + + case OP_RV2AV: + { + OP *first = (o->op_flags & OPf_KIDS) ? cUNOPo->op_first : NULL; + CV *cv = PL_compcv; + while(cv && CvEVAL(cv)) + cv = CvOUTSIDE(cv); + + if(cv && CvSIGNATURE(cv) && + OP_TYPE_IS(first, OP_GV) && cGVOPx_gv(first) == PL_defgv) { + OP *parent = op_parent(o); + while(OP_TYPE_IS(parent, OP_NULL)) + parent = op_parent(parent); + + Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES), + "Use of @_ in %s with signatured subroutine is experimental", OP_DESC(parent)); + } + break; + } + + case OP_SHIFT: + case OP_POP: + if(!CvUNIQUE(PL_compcv) && !(o->op_flags & OPf_KIDS)) + warn_implicit_snail_cvsig(o); + break; + + case OP_ENTERSUB: + if(!(o->op_flags & OPf_STACKED)) + warn_implicit_snail_cvsig(o); + break; + + case OP_GOTO: + { + OP *first = (o->op_flags & OPf_KIDS) ? cUNOPo->op_first : NULL; + OP *ffirst; + if(OP_TYPE_IS(first, OP_SREFGEN) && + (ffirst = OP_ZOOM(cUNOPx(first)->op_first)) && + OP_TYPE_IS(ffirst, OP_RV2CV)) + warn_implicit_snail_cvsig(o); + break; + } + + default: + break; + } + + if (o->op_flags & OPf_KIDS) + next_kid = cUNOPo->op_first; + + /* if a kid hasn't been nominated to process, continue with the + * next sibling, or if no siblings left, go back to the parent's + * siblings and so on + */ + while (!next_kid) { + if (o == top_op) + return; /* at top; no parents/siblings to try */ + if (OpHAS_SIBLING(o)) + next_kid = o->op_sibparent; + else + o = o->op_sibparent; /*try parent's next sibling */ + } + + /* this label not yet used. Goto here if any code above sets + * next-kid + get_next_op: + */ + o = next_kid; + } +} + +/* +=for apidoc finalize_optree + +This function finalizes the optree. Should be called directly after +the complete optree is built. It does some additional +checking which can't be done in the normal Cxxx functions and makes +the tree thread-safe. + +=cut +*/ + +void +Perl_finalize_optree(pTHX_ OP* o) +{ + PERL_ARGS_ASSERT_FINALIZE_OPTREE; + + ENTER; + SAVEVPTR(PL_curcop); + + finalize_op(o); + + LEAVE; +} + + +/* +=for apidoc traverse_op_tree + +Return the next op in a depth-first traversal of the op tree, +returning NULL when the traversal is complete. + +The initial call must supply the root of the tree as both top and o. + +For now it's static, but it may be exposed to the API in the future. + +=cut +*/ + +STATIC OP* +S_traverse_op_tree(pTHX_ OP *top, OP *o) { + OP *sib; + + PERL_ARGS_ASSERT_TRAVERSE_OP_TREE; + + if ((o->op_flags & OPf_KIDS) && cUNOPo->op_first) { + return cUNOPo->op_first; + } + else if ((sib = OpSIBLING(o))) { + return sib; + } + else { + OP *parent = o->op_sibparent; + assert(!(o->op_moresib)); + while (parent && parent != top) { + OP *sib = OpSIBLING(parent); + if (sib) + return sib; + parent = parent->op_sibparent; + } + + return NULL; + } +} + +STATIC void +S_finalize_op(pTHX_ OP* o) +{ + OP * const top = o; + PERL_ARGS_ASSERT_FINALIZE_OP; + + do { + assert(o->op_type != OP_FREED); + + switch (o->op_type) { + case OP_NEXTSTATE: + case OP_DBSTATE: + PL_curcop = ((COP*)o); /* for warnings */ + break; + case OP_EXEC: + if (OpHAS_SIBLING(o)) { + OP *sib = OpSIBLING(o); + if (( sib->op_type == OP_NEXTSTATE || sib->op_type == OP_DBSTATE) + && ckWARN(WARN_EXEC) + && OpHAS_SIBLING(sib)) + { + const OPCODE type = OpSIBLING(sib)->op_type; + if (type != OP_EXIT && type != OP_WARN && type != OP_DIE) { + const line_t oldline = CopLINE(PL_curcop); + CopLINE_set(PL_curcop, CopLINE((COP*)sib)); + Perl_warner(aTHX_ packWARN(WARN_EXEC), + "Statement unlikely to be reached"); + Perl_warner(aTHX_ packWARN(WARN_EXEC), + "\t(Maybe you meant system() when you said exec()?)\n"); + CopLINE_set(PL_curcop, oldline); + } + } + } + break; + + case OP_GV: + if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) { + GV * const gv = cGVOPo_gv; + if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX_const(GvCV(gv))) { + /* XXX could check prototype here instead of just carping */ + SV * const sv = sv_newmortal(); + gv_efullname3(sv, gv, NULL); + Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE), + "%" SVf "() called too early to check prototype", + SVfARG(sv)); + } + } + break; + + case OP_CONST: + if (cSVOPo->op_private & OPpCONST_STRICT) + no_bareword_allowed(o); +#ifdef USE_ITHREADS + /* FALLTHROUGH */ + case OP_HINTSEVAL: + op_relocate_sv(&cSVOPo->op_sv, &o->op_targ); +#endif + break; + +#ifdef USE_ITHREADS + /* Relocate all the METHOP's SVs to the pad for thread safety. */ + case OP_METHOD_NAMED: + case OP_METHOD_SUPER: + case OP_METHOD_REDIR: + case OP_METHOD_REDIR_SUPER: + op_relocate_sv(&cMETHOPo->op_u.op_meth_sv, &o->op_targ); + break; +#endif + + case OP_HELEM: { + UNOP *rop; + SVOP *key_op; + OP *kid; + + if ((key_op = cSVOPx(cBINOPo->op_last))->op_type != OP_CONST) + break; + + rop = cUNOPx(cBINOPo->op_first); + + goto check_keys; + + case OP_HSLICE: + S_scalar_slice_warning(aTHX_ o); + /* FALLTHROUGH */ + + case OP_KVHSLICE: + kid = OpSIBLING(cLISTOPo->op_first); + if (/* I bet there's always a pushmark... */ + OP_TYPE_ISNT_AND_WASNT_NN(kid, OP_LIST) + && OP_TYPE_ISNT_NN(kid, OP_CONST)) + { + break; + } + + key_op = cSVOPx(kid->op_type == OP_CONST + ? kid + : OpSIBLING(kLISTOP->op_first)); + + rop = cUNOPx(cLISTOPo->op_last); + + check_keys: + if (o->op_private & OPpLVAL_INTRO || rop->op_type != OP_RV2HV) + rop = NULL; + check_hash_fields_and_hekify(rop, key_op, 1); + break; + } + case OP_NULL: + if (o->op_targ != OP_HSLICE && o->op_targ != OP_ASLICE) + break; + /* FALLTHROUGH */ + case OP_ASLICE: + S_scalar_slice_warning(aTHX_ o); + break; + + case OP_SUBST: { + if (cPMOPo->op_pmreplrootu.op_pmreplroot) + finalize_op(cPMOPo->op_pmreplrootu.op_pmreplroot); + break; + } + default: + break; + } + +#ifdef DEBUGGING + if (o->op_flags & OPf_KIDS) { + OP *kid; + + /* check that op_last points to the last sibling, and that + * the last op_sibling/op_sibparent field points back to the + * parent, and that the only ops with KIDS are those which are + * entitled to them */ + U32 type = o->op_type; + U32 family; + bool has_last; + + if (type == OP_NULL) { + type = o->op_targ; + /* ck_glob creates a null UNOP with ex-type GLOB + * (which is a list op. So pretend it wasn't a listop */ + if (type == OP_GLOB) + type = OP_NULL; + } + family = PL_opargs[type] & OA_CLASS_MASK; + + has_last = ( family == OA_BINOP + || family == OA_LISTOP + || family == OA_PMOP + || family == OA_LOOP + ); + assert( has_last /* has op_first and op_last, or ... + ... has (or may have) op_first: */ + || family == OA_UNOP + || family == OA_UNOP_AUX + || family == OA_LOGOP + || family == OA_BASEOP_OR_UNOP + || family == OA_FILESTATOP + || family == OA_LOOPEXOP + || family == OA_METHOP + || type == OP_CUSTOM + || type == OP_NULL /* new_logop does this */ + ); + + for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) { + if (!OpHAS_SIBLING(kid)) { + if (has_last) + assert(kid == cLISTOPo->op_last); + assert(kid->op_sibparent == o); + } + } + } +#endif + } while (( o = traverse_op_tree(top, o)) != NULL); +} + + +/* + --------------------------------------------------------- + + Common vars in list assignment + + There now follows some enums and static functions for detecting + common variables in list assignments. Here is a little essay I wrote + for myself when trying to get my head around this. DAPM. + + ---- + + First some random observations: + + * If a lexical var is an alias of something else, e.g. + for my $x ($lex, $pkg, $a[0]) {...} + then the act of aliasing will increase the reference count of the SV + + * If a package var is an alias of something else, it may still have a + reference count of 1, depending on how the alias was created, e.g. + in *a = *b, $a may have a refcount of 1 since the GP is shared + with a single GvSV pointer to the SV. So If it's an alias of another + package var, then RC may be 1; if it's an alias of another scalar, e.g. + a lexical var or an array element, then it will have RC > 1. + + * There are many ways to create a package alias; ultimately, XS code + may quite legally do GvSV(gv) = SvREFCNT_inc(sv) for example, so + run-time tracing mechanisms are unlikely to be able to catch all cases. + + * When the LHS is all my declarations, the same vars can't appear directly + on the RHS, but they can indirectly via closures, aliasing and lvalue + subs. But those techniques all involve an increase in the lexical + scalar's ref count. + + * When the LHS is all lexical vars (but not necessarily my declarations), + it is possible for the same lexicals to appear directly on the RHS, and + without an increased ref count, since the stack isn't refcounted. + This case can be detected at compile time by scanning for common lex + vars with PL_generation. + + * lvalue subs defeat common var detection, but they do at least + return vars with a temporary ref count increment. Also, you can't + tell at compile time whether a sub call is lvalue. + + + So... + + A: There are a few circumstances where there definitely can't be any + commonality: + + LHS empty: () = (...); + RHS empty: (....) = (); + RHS contains only constants or other 'can't possibly be shared' + elements (e.g. ops that return PADTMPs): (...) = (1,2, length) + i.e. they only contain ops not marked as dangerous, whose children + are also not dangerous; + LHS ditto; + LHS contains a single scalar element: e.g. ($x) = (....); because + after $x has been modified, it won't be used again on the RHS; + RHS contains a single element with no aggregate on LHS: e.g. + ($a,$b,$c) = ($x); again, once $a has been modified, its value + won't be used again. + + B: If LHS are all 'my' lexical var declarations (or safe ops, which + we can ignore): + + my ($a, $b, @c) = ...; + + Due to closure and goto tricks, these vars may already have content. + For the same reason, an element on the RHS may be a lexical or package + alias of one of the vars on the left, or share common elements, for + example: + + my ($x,$y) = f(); # $x and $y on both sides + sub f : lvalue { ($x,$y) = (1,2); $y, $x } + + and + + my $ra = f(); + my @a = @$ra; # elements of @a on both sides + sub f { @a = 1..4; \@a } + + + First, just consider scalar vars on LHS: + + RHS is safe only if (A), or in addition, + * contains only lexical *scalar* vars, where neither side's + lexicals have been flagged as aliases + + If RHS is not safe, then it's always legal to check LHS vars for + RC==1, since the only RHS aliases will always be associated + with an RC bump. + + Note that in particular, RHS is not safe if: + + * it contains package scalar vars; e.g.: + + f(); + my ($x, $y) = (2, $x_alias); + sub f { $x = 1; *x_alias = \$x; } + + * It contains other general elements, such as flattened or + * spliced or single array or hash elements, e.g. + + f(); + my ($x,$y) = @a; # or $a[0] or @a{@b} etc + + sub f { + ($x, $y) = (1,2); + use feature 'refaliasing'; + \($a[0], $a[1]) = \($y,$x); + } + + It doesn't matter if the array/hash is lexical or package. + + * it contains a function call that happens to be an lvalue + sub which returns one or more of the above, e.g. + + f(); + my ($x,$y) = f(); + + sub f : lvalue { + ($x, $y) = (1,2); + *x1 = \$x; + $y, $x1; + } + + (so a sub call on the RHS should be treated the same + as having a package var on the RHS). + + * any other "dangerous" thing, such an op or built-in that + returns one of the above, e.g. pp_preinc + + + If RHS is not safe, what we can do however is at compile time flag + that the LHS are all my declarations, and at run time check whether + all the LHS have RC == 1, and if so skip the full scan. + + Now consider array and hash vars on LHS: e.g. my (...,@a) = ...; + + Here the issue is whether there can be elements of @a on the RHS + which will get prematurely freed when @a is cleared prior to + assignment. This is only a problem if the aliasing mechanism + is one which doesn't increase the refcount - only if RC == 1 + will the RHS element be prematurely freed. + + Because the array/hash is being INTROed, it or its elements + can't directly appear on the RHS: + + my (@a) = ($a[0], @a, etc) # NOT POSSIBLE + + but can indirectly, e.g.: + + my $r = f(); + my (@a) = @$r; + sub f { @a = 1..3; \@a } + + So if the RHS isn't safe as defined by (A), we must always + mortalise and bump the ref count of any remaining RHS elements + when assigning to a non-empty LHS aggregate. + + Lexical scalars on the RHS aren't safe if they've been involved in + aliasing, e.g. + + use feature 'refaliasing'; + + f(); + \(my $lex) = \$pkg; + my @a = ($lex,3); # equivalent to ($a[0],3) + + sub f { + @a = (1,2); + \$pkg = \$a[0]; + } + + Similarly with lexical arrays and hashes on the RHS: + + f(); + my @b; + my @a = (@b); + + sub f { + @a = (1,2); + \$b[0] = \$a[1]; + \$b[1] = \$a[0]; + } + + + + C: As (B), but in addition the LHS may contain non-intro lexicals, e.g. + my $a; ($a, my $b) = (....); + + The difference between (B) and (C) is that it is now physically + possible for the LHS vars to appear on the RHS too, where they + are not reference counted; but in this case, the compile-time + PL_generation sweep will detect such common vars. + + So the rules for (C) differ from (B) in that if common vars are + detected, the runtime "test RC==1" optimisation can no longer be used, + and a full mark and sweep is required + + D: As (C), but in addition the LHS may contain package vars. + + Since package vars can be aliased without a corresponding refcount + increase, all bets are off. It's only safe if (A). E.g. + + my ($x, $y) = (1,2); + + for $x_alias ($x) { + ($x_alias, $y) = (3, $x); # whoops + } + + Ditto for LHS aggregate package vars. + + E: Any other dangerous ops on LHS, e.g. + (f(), $a[0], @$r) = (...); + + this is similar to (E) in that all bets are off. In addition, it's + impossible to determine at compile time whether the LHS + contains a scalar or an aggregate, e.g. + + sub f : lvalue { @a } + (f()) = 1..3; + +* --------------------------------------------------------- +*/ + +/* A set of bit flags returned by S_aassign_scan(). Each flag indicates + * that at least one of the things flagged was seen. + */ + +enum { + AAS_MY_SCALAR = 0x001, /* my $scalar */ + AAS_MY_AGG = 0x002, /* aggregate: my @array or my %hash */ + AAS_LEX_SCALAR = 0x004, /* $lexical */ + AAS_LEX_AGG = 0x008, /* @lexical or %lexical aggregate */ + AAS_LEX_SCALAR_COMM = 0x010, /* $lexical seen on both sides */ + AAS_PKG_SCALAR = 0x020, /* $scalar (where $scalar is pkg var) */ + AAS_PKG_AGG = 0x040, /* package @array or %hash aggregate */ + AAS_DANGEROUS = 0x080, /* an op (other than the above) + that's flagged OA_DANGEROUS */ + AAS_SAFE_SCALAR = 0x100, /* produces at least one scalar SV that's + not in any of the categories above */ + AAS_DEFAV = 0x200 /* contains just a single '@_' on RHS */ +}; + +/* helper function for S_aassign_scan(). + * check a PAD-related op for commonality and/or set its generation number. + * Returns a boolean indicating whether its shared */ + +static bool +S_aassign_padcheck(pTHX_ OP* o, bool rhs) +{ + if (PAD_COMPNAME_GEN(o->op_targ) == PERL_INT_MAX) + /* lexical used in aliasing */ + return TRUE; + + if (rhs) + return cBOOL(PAD_COMPNAME_GEN(o->op_targ) == (STRLEN)PL_generation); + else + PAD_COMPNAME_GEN_set(o->op_targ, PL_generation); + + return FALSE; +} + +/* + Helper function for OPpASSIGN_COMMON* detection in rpeep(). + It scans the left or right hand subtree of the aassign op, and returns a + set of flags indicating what sorts of things it found there. + 'rhs' indicates whether we're scanning the LHS or RHS. If the former, we + set PL_generation on lexical vars; if the latter, we see if + PL_generation matches. + 'scalars_p' is a pointer to a counter of the number of scalar SVs seen. + This fn will increment it by the number seen. It's not intended to + be an accurate count (especially as many ops can push a variable + number of SVs onto the stack); rather it's used as to test whether there + can be at most 1 SV pushed; so it's only meanings are "0, 1, many". +*/ + +static int +S_aassign_scan(pTHX_ OP* o, bool rhs, int *scalars_p) +{ + OP *top_op = o; + OP *effective_top_op = o; + int all_flags = 0; + + while (1) { + bool top = o == effective_top_op; + int flags = 0; + OP* next_kid = NULL; + + /* first, look for a solitary @_ on the RHS */ + if ( rhs + && top + && (o->op_flags & OPf_KIDS) + && OP_TYPE_IS_OR_WAS(o, OP_LIST) + ) { + OP *kid = cUNOPo->op_first; + if ( ( kid->op_type == OP_PUSHMARK + || kid->op_type == OP_PADRANGE) /* ex-pushmark */ + && ((kid = OpSIBLING(kid))) + && !OpHAS_SIBLING(kid) + && kid->op_type == OP_RV2AV + && !(kid->op_flags & OPf_REF) + && !(kid->op_private & (OPpLVAL_INTRO|OPpMAYBE_LVSUB)) + && ((kid->op_flags & OPf_WANT) == OPf_WANT_LIST) + && ((kid = cUNOPx(kid)->op_first)) + && kid->op_type == OP_GV + && cGVOPx_gv(kid) == PL_defgv + ) + flags = AAS_DEFAV; + } + + switch (o->op_type) { + case OP_GVSV: + (*scalars_p)++; + all_flags |= AAS_PKG_SCALAR; + goto do_next; + + case OP_PADAV: + case OP_PADHV: + (*scalars_p) += 2; + /* if !top, could be e.g. @a[0,1] */ + all_flags |= (top && (o->op_flags & OPf_REF)) + ? ((o->op_private & OPpLVAL_INTRO) + ? AAS_MY_AGG : AAS_LEX_AGG) + : AAS_DANGEROUS; + goto do_next; + + case OP_PADSV: + { + int comm = S_aassign_padcheck(aTHX_ o, rhs) + ? AAS_LEX_SCALAR_COMM : 0; + (*scalars_p)++; + all_flags |= (o->op_private & OPpLVAL_INTRO) + ? (AAS_MY_SCALAR|comm) : (AAS_LEX_SCALAR|comm); + goto do_next; + + } + + case OP_RV2AV: + case OP_RV2HV: + (*scalars_p) += 2; + if (cUNOPx(o)->op_first->op_type != OP_GV) + all_flags |= AAS_DANGEROUS; /* @{expr}, %{expr} */ + /* @pkg, %pkg */ + /* if !top, could be e.g. @a[0,1] */ + else if (top && (o->op_flags & OPf_REF)) + all_flags |= AAS_PKG_AGG; + else + all_flags |= AAS_DANGEROUS; + goto do_next; + + case OP_RV2SV: + (*scalars_p)++; + if (cUNOPx(o)->op_first->op_type != OP_GV) { + (*scalars_p) += 2; + all_flags |= AAS_DANGEROUS; /* ${expr} */ + } + else + all_flags |= AAS_PKG_SCALAR; /* $pkg */ + goto do_next; + + case OP_SPLIT: + if (o->op_private & OPpSPLIT_ASSIGN) { + /* the assign in @a = split() has been optimised away + * and the @a attached directly to the split op + * Treat the array as appearing on the RHS, i.e. + * ... = (@a = split) + * is treated like + * ... = @a; + */ + + if (o->op_flags & OPf_STACKED) { + /* @{expr} = split() - the array expression is tacked + * on as an extra child to split - process kid */ + next_kid = cLISTOPo->op_last; + goto do_next; + } + + /* ... else array is directly attached to split op */ + (*scalars_p) += 2; + all_flags |= (PL_op->op_private & OPpSPLIT_LEX) + ? ((o->op_private & OPpLVAL_INTRO) + ? AAS_MY_AGG : AAS_LEX_AGG) + : AAS_PKG_AGG; + goto do_next; + } + (*scalars_p)++; + /* other args of split can't be returned */ + all_flags |= AAS_SAFE_SCALAR; + goto do_next; + + case OP_UNDEF: + /* undef on LHS following a var is significant, e.g. + * my $x = 1; + * @a = (($x, undef) = (2 => $x)); + * # @a shoul be (2,1) not (2,2) + * + * undef on RHS counts as a scalar: + * ($x, $y) = (undef, $x); # 2 scalars on RHS: unsafe + */ + if ((!rhs && *scalars_p) || rhs) + (*scalars_p)++; + flags = AAS_SAFE_SCALAR; + break; + + case OP_PUSHMARK: + case OP_STUB: + /* these are all no-ops; they don't push a potentially common SV + * onto the stack, so they are neither AAS_DANGEROUS nor + * AAS_SAFE_SCALAR */ + goto do_next; + + case OP_PADRANGE: /* Ignore padrange; checking its siblings is enough */ + break; + + case OP_NULL: + case OP_LIST: + /* these do nothing, but may have children */ + break; + + default: + if (PL_opargs[o->op_type] & OA_DANGEROUS) { + (*scalars_p) += 2; + flags = AAS_DANGEROUS; + break; + } + + if ( (PL_opargs[o->op_type] & OA_TARGLEX) + && (o->op_private & OPpTARGET_MY)) + { + (*scalars_p)++; + all_flags |= S_aassign_padcheck(aTHX_ o, rhs) + ? AAS_LEX_SCALAR_COMM : AAS_LEX_SCALAR; + goto do_next; + } + + /* if its an unrecognised, non-dangerous op, assume that it + * is the cause of at least one safe scalar */ + (*scalars_p)++; + flags = AAS_SAFE_SCALAR; + break; + } + + all_flags |= flags; + + /* by default, process all kids next + * XXX this assumes that all other ops are "transparent" - i.e. that + * they can return some of their children. While this true for e.g. + * sort and grep, it's not true for e.g. map. We really need a + * 'transparent' flag added to regen/opcodes + */ + if (o->op_flags & OPf_KIDS) { + next_kid = cUNOPo->op_first; + /* these ops do nothing but may have children; but their + * children should also be treated as top-level */ + if ( o == effective_top_op + && (o->op_type == OP_NULL || o->op_type == OP_LIST) + ) + effective_top_op = next_kid; + } + + + /* If next_kid is set, someone in the code above wanted us to process + * that kid and all its remaining siblings. Otherwise, work our way + * back up the tree */ + do_next: + while (!next_kid) { + if (o == top_op) + return all_flags; /* at top; no parents/siblings to try */ + if (OpHAS_SIBLING(o)) { + next_kid = o->op_sibparent; + if (o == effective_top_op) + effective_top_op = next_kid; + } + else if (o == effective_top_op) + effective_top_op = o->op_sibparent; + o = o->op_sibparent; /* try parent's next sibling */ + } + o = next_kid; + } /* while */ +} + +/* S_maybe_multideref(): given an op_next chain of ops beginning at 'start' + * that potentially represent a series of one or more aggregate derefs + * (such as $a->[1]{$key}), examine the chain, and if appropriate, convert + * the whole chain to a single OP_MULTIDEREF op (maybe with a few + * additional ops left in too). + * + * The caller will have already verified that the first few ops in the + * chain following 'start' indicate a multideref candidate, and will have + * set 'orig_o' to the point further on in the chain where the first index + * expression (if any) begins. 'orig_action' specifies what type of + * beginning has already been determined by the ops between start..orig_o + * (e.g. $lex_ary[], $pkg_ary->{}, expr->[], etc). + * + * 'hints' contains any hints flags that need adding (currently just + * OPpHINT_STRICT_REFS) as found in any rv2av/hv skipped by the caller. + */ + +STATIC void +S_maybe_multideref(pTHX_ OP *start, OP *orig_o, UV orig_action, U8 hints) +{ + int pass; + UNOP_AUX_item *arg_buf = NULL; + bool reset_start_targ = FALSE; /* start->op_targ needs zeroing */ + int index_skip = -1; /* don't output index arg on this action */ + + /* similar to regex compiling, do two passes; the first pass + * determines whether the op chain is convertible and calculates the + * buffer size; the second pass populates the buffer and makes any + * changes necessary to ops (such as moving consts to the pad on + * threaded builds). + * + * NB: for things like Coverity, note that both passes take the same + * path through the logic tree (except for 'if (pass)' bits), since + * both passes are following the same op_next chain; and in + * particular, if it would return early on the second pass, it would + * already have returned early on the first pass. + */ + for (pass = 0; pass < 2; pass++) { + OP *o = orig_o; + UV action = orig_action; + OP *first_elem_op = NULL; /* first seen aelem/helem */ + OP *top_op = NULL; /* highest [ah]elem/exists/del/rv2[ah]v */ + int action_count = 0; /* number of actions seen so far */ + int action_ix = 0; /* action_count % (actions per IV) */ + bool next_is_hash = FALSE; /* is the next lookup to be a hash? */ + bool is_last = FALSE; /* no more derefs to follow */ + bool maybe_aelemfast = FALSE; /* we can replace with aelemfast? */ + UV action_word = 0; /* all actions so far */ + size_t argi = 0; + UNOP_AUX_item *action_ptr = arg_buf; + + argi++; /* reserve slot for first action word */ + + switch (action) { + case MDEREF_HV_gvsv_vivify_rv2hv_helem: + case MDEREF_HV_gvhv_helem: + next_is_hash = TRUE; + /* FALLTHROUGH */ + case MDEREF_AV_gvsv_vivify_rv2av_aelem: + case MDEREF_AV_gvav_aelem: + if (pass) { +#ifdef USE_ITHREADS + arg_buf[argi].pad_offset = cPADOPx(start)->op_padix; + /* stop it being swiped when nulled */ + cPADOPx(start)->op_padix = 0; +#else + arg_buf[argi].sv = cSVOPx(start)->op_sv; + cSVOPx(start)->op_sv = NULL; +#endif + } + argi++; + break; + + case MDEREF_HV_padhv_helem: + case MDEREF_HV_padsv_vivify_rv2hv_helem: + next_is_hash = TRUE; + /* FALLTHROUGH */ + case MDEREF_AV_padav_aelem: + case MDEREF_AV_padsv_vivify_rv2av_aelem: + if (pass) { + arg_buf[argi].pad_offset = start->op_targ; + /* we skip setting op_targ = 0 for now, since the intact + * OP_PADXV is needed by check_hash_fields_and_hekify */ + reset_start_targ = TRUE; + } + argi++; + break; + + case MDEREF_HV_pop_rv2hv_helem: + next_is_hash = TRUE; + /* FALLTHROUGH */ + case MDEREF_AV_pop_rv2av_aelem: + break; + + default: + NOT_REACHED; /* NOTREACHED */ + return; + } + + while (!is_last) { + /* look for another (rv2av/hv; get index; + * aelem/helem/exists/delele) sequence */ + + OP *kid; + bool is_deref; + bool ok; + UV index_type = MDEREF_INDEX_none; + + if (action_count) { + /* if this is not the first lookup, consume the rv2av/hv */ + + /* for N levels of aggregate lookup, we normally expect + * that the first N-1 [ah]elem ops will be flagged as + * /DEREF (so they autovivify if necessary), and the last + * lookup op not to be. + * For other things (like @{$h{k1}{k2}}) extra scope or + * leave ops can appear, so abandon the effort in that + * case */ + if (o->op_type != OP_RV2AV && o->op_type != OP_RV2HV) + return; + + /* rv2av or rv2hv sKR/1 */ + + ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS + |OPf_REF|OPf_MOD|OPf_SPECIAL))); + if (o->op_flags != (OPf_WANT_SCALAR|OPf_KIDS|OPf_REF)) + return; + + /* at this point, we wouldn't expect any of these + * possible private flags: + * OPpMAYBE_LVSUB, OPpOUR_INTRO, OPpLVAL_INTRO + * OPpTRUEBOOL, OPpMAYBE_TRUEBOOL (rv2hv only) + */ + ASSUME(!(o->op_private & + ~(OPpHINT_STRICT_REFS|OPpARG1_MASK|OPpSLICEWARNING))); + + hints = (o->op_private & OPpHINT_STRICT_REFS); + + /* make sure the type of the previous /DEREF matches the + * type of the next lookup */ + ASSUME(o->op_type == (next_is_hash ? OP_RV2HV : OP_RV2AV)); + top_op = o; + + action = next_is_hash + ? MDEREF_HV_vivify_rv2hv_helem + : MDEREF_AV_vivify_rv2av_aelem; + o = o->op_next; + } + + /* if this is the second pass, and we're at the depth where + * previously we encountered a non-simple index expression, + * stop processing the index at this point */ + if (action_count != index_skip) { + + /* look for one or more simple ops that return an array + * index or hash key */ + + switch (o->op_type) { + case OP_PADSV: + /* it may be a lexical var index */ + ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_PARENS + |OPf_REF|OPf_MOD|OPf_SPECIAL))); + ASSUME(!(o->op_private & + ~(OPpPAD_STATE|OPpDEREF|OPpLVAL_INTRO))); + + if ( OP_GIMME(o,0) == G_SCALAR + && !(o->op_flags & (OPf_REF|OPf_MOD)) + && o->op_private == 0) + { + if (pass) + arg_buf[argi].pad_offset = o->op_targ; + argi++; + index_type = MDEREF_INDEX_padsv; + o = o->op_next; + } + break; + + case OP_CONST: + if (next_is_hash) { + /* it's a constant hash index */ + if (!(SvFLAGS(cSVOPo_sv) & (SVf_IOK|SVf_NOK|SVf_POK))) + /* "use constant foo => FOO; $h{+foo}" for + * some weird FOO, can leave you with constants + * that aren't simple strings. It's not worth + * the extra hassle for those edge cases */ + break; + + { + UNOP *rop = NULL; + OP * helem_op = o->op_next; + + ASSUME( helem_op->op_type == OP_HELEM + || helem_op->op_type == OP_NULL + || pass == 0); + if (helem_op->op_type == OP_HELEM) { + rop = cUNOPx(cBINOPx(helem_op)->op_first); + if ( helem_op->op_private & OPpLVAL_INTRO + || rop->op_type != OP_RV2HV + ) + rop = NULL; + } + /* on first pass just check; on second pass + * hekify */ + check_hash_fields_and_hekify(rop, cSVOPo, pass); + } + + if (pass) { +#ifdef USE_ITHREADS + /* Relocate sv to the pad for thread safety */ + op_relocate_sv(&cSVOPo->op_sv, &o->op_targ); + arg_buf[argi].pad_offset = o->op_targ; + o->op_targ = 0; +#else + arg_buf[argi].sv = cSVOPx_sv(o); +#endif + } + } + else { + /* it's a constant array index */ + IV iv; + SV *ix_sv = cSVOPo->op_sv; + if (!SvIOK(ix_sv)) + break; + iv = SvIV(ix_sv); + + if ( action_count == 0 + && iv >= -128 + && iv <= 127 + && ( action == MDEREF_AV_padav_aelem + || action == MDEREF_AV_gvav_aelem) + ) + maybe_aelemfast = TRUE; + + if (pass) { + arg_buf[argi].iv = iv; + SvREFCNT_dec_NN(cSVOPo->op_sv); + } + } + if (pass) + /* we've taken ownership of the SV */ + cSVOPo->op_sv = NULL; + argi++; + index_type = MDEREF_INDEX_const; + o = o->op_next; + break; + + case OP_GV: + /* it may be a package var index */ + + ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_PARENS|OPf_SPECIAL))); + ASSUME(!(o->op_private & ~(OPpEARLY_CV))); + if ( (o->op_flags & ~(OPf_PARENS|OPf_SPECIAL)) != OPf_WANT_SCALAR + || o->op_private != 0 + ) + break; + + kid = o->op_next; + if (kid->op_type != OP_RV2SV) + break; + + ASSUME(!(kid->op_flags & + ~(OPf_WANT|OPf_KIDS|OPf_MOD|OPf_REF + |OPf_SPECIAL|OPf_PARENS))); + ASSUME(!(kid->op_private & + ~(OPpARG1_MASK + |OPpHINT_STRICT_REFS|OPpOUR_INTRO + |OPpDEREF|OPpLVAL_INTRO))); + if( (kid->op_flags &~ OPf_PARENS) + != (OPf_WANT_SCALAR|OPf_KIDS) + || (kid->op_private & ~(OPpARG1_MASK|HINT_STRICT_REFS)) + ) + break; + + if (pass) { +#ifdef USE_ITHREADS + arg_buf[argi].pad_offset = cPADOPx(o)->op_padix; + /* stop it being swiped when nulled */ + cPADOPx(o)->op_padix = 0; +#else + arg_buf[argi].sv = cSVOPx(o)->op_sv; + cSVOPo->op_sv = NULL; +#endif + } + argi++; + index_type = MDEREF_INDEX_gvsv; + o = kid->op_next; + break; + + } /* switch */ + } /* action_count != index_skip */ + + action |= index_type; + + + /* at this point we have either: + * * detected what looks like a simple index expression, + * and expect the next op to be an [ah]elem, or + * an nulled [ah]elem followed by a delete or exists; + * * found a more complex expression, so something other + * than the above follows. + */ + + /* possibly an optimised away [ah]elem (where op_next is + * exists or delete) */ + if (o->op_type == OP_NULL) + o = o->op_next; + + /* at this point we're looking for an OP_AELEM, OP_HELEM, + * OP_EXISTS or OP_DELETE */ + + /* if a custom array/hash access checker is in scope, + * abandon optimisation attempt */ + if ( (o->op_type == OP_AELEM || o->op_type == OP_HELEM) + && PL_check[o->op_type] != Perl_ck_null) + return; + /* similarly for customised exists and delete */ + if ( (o->op_type == OP_EXISTS) + && PL_check[o->op_type] != Perl_ck_exists) + return; + if ( (o->op_type == OP_DELETE) + && PL_check[o->op_type] != Perl_ck_delete) + return; + + if ( o->op_type != OP_AELEM + || (o->op_private & + (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF|OPpMAYBE_LVSUB)) + ) + maybe_aelemfast = FALSE; + + /* look for aelem/helem/exists/delete. If it's not the last elem + * lookup, it *must* have OPpDEREF_AV/HV, but not many other + * flags; if it's the last, then it mustn't have + * OPpDEREF_AV/HV, but may have lots of other flags, like + * OPpLVAL_INTRO etc + */ + + if ( index_type == MDEREF_INDEX_none + || ( o->op_type != OP_AELEM && o->op_type != OP_HELEM + && o->op_type != OP_EXISTS && o->op_type != OP_DELETE) + ) + ok = FALSE; + else { + /* we have aelem/helem/exists/delete with valid simple index */ + + is_deref = (o->op_type == OP_AELEM || o->op_type == OP_HELEM) + && ( (o->op_private & OPpDEREF) == OPpDEREF_AV + || (o->op_private & OPpDEREF) == OPpDEREF_HV); + + /* This doesn't make much sense but is legal: + * @{ local $x[0][0] } = 1 + * Since scope exit will undo the autovivification, + * don't bother in the first place. The OP_LEAVE + * assertion is in case there are other cases of both + * OPpLVAL_INTRO and OPpDEREF which don't include a scope + * exit that would undo the local - in which case this + * block of code would need rethinking. + */ + if (is_deref && (o->op_private & OPpLVAL_INTRO)) { +#ifdef DEBUGGING + OP *n = o->op_next; + while (n && ( n->op_type == OP_NULL + || n->op_type == OP_LIST + || n->op_type == OP_SCALAR)) + n = n->op_next; + assert(n && n->op_type == OP_LEAVE); +#endif + o->op_private &= ~OPpDEREF; + is_deref = FALSE; + } + + if (is_deref) { + ASSUME(!(o->op_flags & + ~(OPf_WANT|OPf_KIDS|OPf_MOD|OPf_PARENS))); + ASSUME(!(o->op_private & ~(OPpARG2_MASK|OPpDEREF))); + + ok = (o->op_flags &~ OPf_PARENS) + == (OPf_WANT_SCALAR|OPf_KIDS|OPf_MOD) + && !(o->op_private & ~(OPpDEREF|OPpARG2_MASK)); + } + else if (o->op_type == OP_EXISTS) { + ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS + |OPf_REF|OPf_MOD|OPf_SPECIAL))); + ASSUME(!(o->op_private & ~(OPpARG1_MASK|OPpEXISTS_SUB))); + ok = !(o->op_private & ~OPpARG1_MASK); + } + else if (o->op_type == OP_DELETE) { + ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS + |OPf_REF|OPf_MOD|OPf_SPECIAL))); + ASSUME(!(o->op_private & + ~(OPpARG1_MASK|OPpSLICE|OPpLVAL_INTRO))); + /* don't handle slices or 'local delete'; the latter + * is fairly rare, and has a complex runtime */ + ok = !(o->op_private & ~OPpARG1_MASK); + if (OP_TYPE_IS_OR_WAS(cUNOPo->op_first, OP_AELEM)) + /* skip handling run-tome error */ + ok = (ok && cBOOL(o->op_flags & OPf_SPECIAL)); + } + else { + ASSUME(o->op_type == OP_AELEM || o->op_type == OP_HELEM); + ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_MOD + |OPf_PARENS|OPf_REF|OPf_SPECIAL))); + ASSUME(!(o->op_private & ~(OPpARG2_MASK|OPpMAYBE_LVSUB + |OPpLVAL_DEFER|OPpDEREF|OPpLVAL_INTRO))); + ok = (o->op_private & OPpDEREF) != OPpDEREF_SV; + } + } + + if (ok) { + if (!first_elem_op) + first_elem_op = o; + top_op = o; + if (is_deref) { + next_is_hash = cBOOL((o->op_private & OPpDEREF) == OPpDEREF_HV); + o = o->op_next; + } + else { + is_last = TRUE; + action |= MDEREF_FLAG_last; + } + } + else { + /* at this point we have something that started + * promisingly enough (with rv2av or whatever), but failed + * to find a simple index followed by an + * aelem/helem/exists/delete. If this is the first action, + * give up; but if we've already seen at least one + * aelem/helem, then keep them and add a new action with + * MDEREF_INDEX_none, which causes it to do the vivify + * from the end of the previous lookup, and do the deref, + * but stop at that point. So $a[0][expr] will do one + * av_fetch, vivify and deref, then continue executing at + * expr */ + if (!action_count) + return; + is_last = TRUE; + index_skip = action_count; + action |= MDEREF_FLAG_last; + if (index_type != MDEREF_INDEX_none) + argi--; + } + + action_word |= (action << (action_ix * MDEREF_SHIFT)); + action_ix++; + action_count++; + /* if there's no space for the next action, reserve a new slot + * for it *before* we start adding args for that action */ + if ((action_ix + 1) * MDEREF_SHIFT > UVSIZE*8) { + if (pass) { + action_ptr->uv = action_word; + action_ptr = arg_buf + argi; + } + action_word = 0; + argi++; + action_ix = 0; + } + } /* while !is_last */ + + /* success! */ + + if (!action_ix) + /* slot reserved for next action word not now needed */ + argi--; + else if (pass) + action_ptr->uv = action_word; + + if (pass) { + OP *mderef; + OP *p, *q; + + mderef = newUNOP_AUX(OP_MULTIDEREF, 0, NULL, arg_buf); + if (index_skip == -1) { + mderef->op_flags = o->op_flags + & (OPf_WANT|OPf_MOD|(next_is_hash ? OPf_SPECIAL : 0)); + if (o->op_type == OP_EXISTS) + mderef->op_private = OPpMULTIDEREF_EXISTS; + else if (o->op_type == OP_DELETE) + mderef->op_private = OPpMULTIDEREF_DELETE; + else + mderef->op_private = o->op_private + & (OPpMAYBE_LVSUB|OPpLVAL_DEFER|OPpLVAL_INTRO); + } + /* accumulate strictness from every level (although I don't think + * they can actually vary) */ + mderef->op_private |= hints; + + /* integrate the new multideref op into the optree and the + * op_next chain. + * + * In general an op like aelem or helem has two child + * sub-trees: the aggregate expression (a_expr) and the + * index expression (i_expr): + * + * aelem + * | + * a_expr - i_expr + * + * The a_expr returns an AV or HV, while the i-expr returns an + * index. In general a multideref replaces most or all of a + * multi-level tree, e.g. + * + * exists + * | + * ex-aelem + * | + * rv2av - i_expr1 + * | + * helem + * | + * rv2hv - i_expr2 + * | + * aelem + * | + * a_expr - i_expr3 + * + * With multideref, all the i_exprs will be simple vars or + * constants, except that i_expr1 may be arbitrary in the case + * of MDEREF_INDEX_none. + * + * The bottom-most a_expr will be either: + * 1) a simple var (so padXv or gv+rv2Xv); + * 2) a simple scalar var dereferenced (e.g. $r->[0]): + * so a simple var with an extra rv2Xv; + * 3) or an arbitrary expression. + * + * 'start', the first op in the execution chain, will point to + * 1),2): the padXv or gv op; + * 3): the rv2Xv which forms the last op in the a_expr + * execution chain, and the top-most op in the a_expr + * subtree. + * + * For all cases, the 'start' node is no longer required, + * but we can't free it since one or more external nodes + * may point to it. E.g. consider + * $h{foo} = $a ? $b : $c + * Here, both the op_next and op_other branches of the + * cond_expr point to the gv[*h] of the hash expression, so + * we can't free the 'start' op. + * + * For expr->[...], we need to save the subtree containing the + * expression; for the other cases, we just need to save the + * start node. + * So in all cases, we null the start op and keep it around by + * making it the child of the multideref op; for the expr-> + * case, the expr will be a subtree of the start node. + * + * So in the simple 1,2 case the optree above changes to + * + * ex-exists + * | + * multideref + * | + * ex-gv (or ex-padxv) + * + * with the op_next chain being + * + * -> ex-gv -> multideref -> op-following-ex-exists -> + * + * In the 3 case, we have + * + * ex-exists + * | + * multideref + * | + * ex-rv2xv + * | + * rest-of-a_expr + * subtree + * + * and + * + * -> rest-of-a_expr subtree -> + * ex-rv2xv -> multideref -> op-following-ex-exists -> + * + * + * Where the last i_expr is non-simple (i.e. MDEREF_INDEX_none, + * e.g. $a[0]{foo}[$x+1], the next rv2xv is nulled and the + * multideref attached as the child, e.g. + * + * exists + * | + * ex-aelem + * | + * ex-rv2av - i_expr1 + * | + * multideref + * | + * ex-whatever + * + */ + + /* if we free this op, don't free the pad entry */ + if (reset_start_targ) + start->op_targ = 0; + + + /* Cut the bit we need to save out of the tree and attach to + * the multideref op, then free the rest of the tree */ + + /* find parent of node to be detached (for use by splice) */ + p = first_elem_op; + if ( orig_action == MDEREF_AV_pop_rv2av_aelem + || orig_action == MDEREF_HV_pop_rv2hv_helem) + { + /* there is an arbitrary expression preceding us, e.g. + * expr->[..]? so we need to save the 'expr' subtree */ + if (p->op_type == OP_EXISTS || p->op_type == OP_DELETE) + p = cUNOPx(p)->op_first; + ASSUME( start->op_type == OP_RV2AV + || start->op_type == OP_RV2HV); + } + else { + /* either a padXv or rv2Xv+gv, maybe with an ex-Xelem + * above for exists/delete. */ + while ( (p->op_flags & OPf_KIDS) + && cUNOPx(p)->op_first != start + ) + p = cUNOPx(p)->op_first; + } + ASSUME(cUNOPx(p)->op_first == start); + + /* detach from main tree, and re-attach under the multideref */ + op_sibling_splice(mderef, NULL, 0, + op_sibling_splice(p, NULL, 1, NULL)); + op_null(start); + + start->op_next = mderef; + + mderef->op_next = index_skip == -1 ? o->op_next : o; + + /* excise and free the original tree, and replace with + * the multideref op */ + p = op_sibling_splice(top_op, NULL, -1, mderef); + while (p) { + q = OpSIBLING(p); + op_free(p); + p = q; + } + op_null(top_op); + } + else { + Size_t size = argi; + + if (maybe_aelemfast && action_count == 1) + return; + + arg_buf = (UNOP_AUX_item*)PerlMemShared_malloc( + sizeof(UNOP_AUX_item) * (size + 1)); + /* for dumping etc: store the length in a hidden first slot; + * we set the op_aux pointer to the second slot */ + arg_buf->uv = size; + arg_buf++; + } + } /* for (pass = ...) */ +} + +/* See if the ops following o are such that o will always be executed in + * boolean context: that is, the SV which o pushes onto the stack will + * only ever be consumed by later ops via SvTRUE(sv) or similar. + * If so, set a suitable private flag on o. Normally this will be + * bool_flag; but see below why maybe_flag is needed too. + * + * Typically the two flags you pass will be the generic OPpTRUEBOOL and + * OPpMAYBE_TRUEBOOL, buts it's possible that for some ops those bits may + * already be taken, so you'll have to give that op two different flags. + * + * More explanation of 'maybe_flag' and 'safe_and' parameters. + * The binary logical ops &&, ||, // (plus 'if' and 'unless' which use + * those underlying ops) short-circuit, which means that rather than + * necessarily returning a truth value, they may return the LH argument, + * which may not be boolean. For example in $x = (keys %h || -1), keys + * should return a key count rather than a boolean, even though its + * sort-of being used in boolean context. + * + * So we only consider such logical ops to provide boolean context to + * their LH argument if they themselves are in void or boolean context. + * However, sometimes the context isn't known until run-time. In this + * case the op is marked with the maybe_flag flag it. + * + * Consider the following. + * + * sub f { ....; if (%h) { .... } } + * + * This is actually compiled as + * + * sub f { ....; %h && do { .... } } + * + * Here we won't know until runtime whether the final statement (and hence + * the &&) is in void context and so is safe to return a boolean value. + * So mark o with maybe_flag rather than the bool_flag. + * Note that there is cost associated with determining context at runtime + * (e.g. a call to block_gimme()), so it may not be worth setting (at + * compile time) and testing (at runtime) maybe_flag if the scalar verses + * boolean costs savings are marginal. + * + * However, we can do slightly better with && (compared to || and //): + * this op only returns its LH argument when that argument is false. In + * this case, as long as the op promises to return a false value which is + * valid in both boolean and scalar contexts, we can mark an op consumed + * by && with bool_flag rather than maybe_flag. + * For example as long as pp_padhv and pp_rv2hv return &PL_sv_zero rather + * than &PL_sv_no for a false result in boolean context, then it's safe. An + * op which promises to handle this case is indicated by setting safe_and + * to true. + */ + +static void +S_check_for_bool_cxt(OP*o, bool safe_and, U8 bool_flag, U8 maybe_flag) +{ + OP *lop; + U8 flag = 0; + + assert((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR); + + /* OPpTARGET_MY and boolean context probably don't mix well. + * If someone finds a valid use case, maybe add an extra flag to this + * function which indicates its safe to do so for this op? */ + assert(!( (PL_opargs[o->op_type] & OA_TARGLEX) + && (o->op_private & OPpTARGET_MY))); + + lop = o->op_next; + + while (lop) { + switch (lop->op_type) { + case OP_NULL: + case OP_SCALAR: + break; + + /* these two consume the stack argument in the scalar case, + * and treat it as a boolean in the non linenumber case */ + case OP_FLIP: + case OP_FLOP: + if ( ((lop->op_flags & OPf_WANT) == OPf_WANT_LIST) + || (lop->op_private & OPpFLIP_LINENUM)) + { + lop = NULL; + break; + } + /* FALLTHROUGH */ + /* these never leave the original value on the stack */ + case OP_NOT: + case OP_XOR: + case OP_COND_EXPR: + case OP_GREPWHILE: + flag = bool_flag; + lop = NULL; + break; + + /* OR DOR and AND evaluate their arg as a boolean, but then may + * leave the original scalar value on the stack when following the + * op_next route. If not in void context, we need to ensure + * that whatever follows consumes the arg only in boolean context + * too. + */ + case OP_AND: + if (safe_and) { + flag = bool_flag; + lop = NULL; + break; + } + /* FALLTHROUGH */ + case OP_OR: + case OP_DOR: + if ((lop->op_flags & OPf_WANT) == OPf_WANT_VOID) { + flag = bool_flag; + lop = NULL; + } + else if (!(lop->op_flags & OPf_WANT)) { + /* unknown context - decide at runtime */ + flag = maybe_flag; + lop = NULL; + } + break; + + default: + lop = NULL; + break; + } + + if (lop) + lop = lop->op_next; + } + + o->op_private |= flag; +} + +/* mechanism for deferring recursion in rpeep() */ + +#define MAX_DEFERRED 4 + +#define DEFER(o) \ + STMT_START { \ + if (defer_ix == (MAX_DEFERRED-1)) { \ + OP **defer = defer_queue[defer_base]; \ + CALL_RPEEP(*defer); \ + op_prune_chain_head(defer); \ + defer_base = (defer_base + 1) % MAX_DEFERRED; \ + defer_ix--; \ + } \ + defer_queue[(defer_base + ++defer_ix) % MAX_DEFERRED] = &(o); \ + } STMT_END + +#define IS_AND_OP(o) (o->op_type == OP_AND) +#define IS_OR_OP(o) (o->op_type == OP_OR) + +/* A peephole optimizer. We visit the ops in the order they're to execute. + * See the comments at the top of this file for more details about when + * peep() is called */ + +void +Perl_rpeep(pTHX_ OP *o) +{ + OP* oldop = NULL; + OP* oldoldop = NULL; + OP** defer_queue[MAX_DEFERRED] = { NULL }; /* small queue of deferred branches */ + int defer_base = 0; + int defer_ix = -1; + + if (!o || o->op_opt) + return; + + assert(o->op_type != OP_FREED); + + ENTER; + SAVEOP(); + SAVEVPTR(PL_curcop); + for (;; o = o->op_next) { + if (o && o->op_opt) + o = NULL; + if (!o) { + while (defer_ix >= 0) { + OP **defer = + defer_queue[(defer_base + defer_ix--) % MAX_DEFERRED]; + CALL_RPEEP(*defer); + op_prune_chain_head(defer); + } + break; + } + + redo: + + /* oldoldop -> oldop -> o should be a chain of 3 adjacent ops */ + assert(!oldoldop || oldoldop->op_next == oldop); + assert(!oldop || oldop->op_next == o); + + /* By default, this op has now been optimised. A couple of cases below + clear this again. */ + o->op_opt = 1; + PL_op = o; + + /* look for a series of 1 or more aggregate derefs, e.g. + * $a[1]{foo}[$i]{$k} + * and replace with a single OP_MULTIDEREF op. + * Each index must be either a const, or a simple variable, + * + * First, look for likely combinations of starting ops, + * corresponding to (global and lexical variants of) + * $a[...] $h{...} + * $r->[...] $r->{...} + * (preceding expression)->[...] + * (preceding expression)->{...} + * and if so, call maybe_multideref() to do a full inspection + * of the op chain and if appropriate, replace with an + * OP_MULTIDEREF + */ + { + UV action; + OP *o2 = o; + U8 hints = 0; + + switch (o2->op_type) { + case OP_GV: + /* $pkg[..] : gv[*pkg] + * $pkg->[...]: gv[*pkg]; rv2sv sKM/DREFAV */ + + /* Fail if there are new op flag combinations that we're + * not aware of, rather than: + * * silently failing to optimise, or + * * silently optimising the flag away. + * If this ASSUME starts failing, examine what new flag + * has been added to the op, and decide whether the + * optimisation should still occur with that flag, then + * update the code accordingly. This applies to all the + * other ASSUMEs in the block of code too. + */ + ASSUME(!(o2->op_flags & + ~(OPf_WANT|OPf_MOD|OPf_PARENS|OPf_SPECIAL))); + ASSUME(!(o2->op_private & ~OPpEARLY_CV)); + + o2 = o2->op_next; + + if (o2->op_type == OP_RV2AV) { + action = MDEREF_AV_gvav_aelem; + goto do_deref; + } + + if (o2->op_type == OP_RV2HV) { + action = MDEREF_HV_gvhv_helem; + goto do_deref; + } + + if (o2->op_type != OP_RV2SV) + break; + + /* at this point we've seen gv,rv2sv, so the only valid + * construct left is $pkg->[] or $pkg->{} */ + + ASSUME(!(o2->op_flags & OPf_STACKED)); + if ((o2->op_flags & (OPf_WANT|OPf_REF|OPf_MOD|OPf_SPECIAL)) + != (OPf_WANT_SCALAR|OPf_MOD)) + break; + + ASSUME(!(o2->op_private & ~(OPpARG1_MASK|HINT_STRICT_REFS + |OPpOUR_INTRO|OPpDEREF|OPpLVAL_INTRO))); + if (o2->op_private & (OPpOUR_INTRO|OPpLVAL_INTRO)) + break; + if ( (o2->op_private & OPpDEREF) != OPpDEREF_AV + && (o2->op_private & OPpDEREF) != OPpDEREF_HV) + break; + + o2 = o2->op_next; + if (o2->op_type == OP_RV2AV) { + action = MDEREF_AV_gvsv_vivify_rv2av_aelem; + goto do_deref; + } + if (o2->op_type == OP_RV2HV) { + action = MDEREF_HV_gvsv_vivify_rv2hv_helem; + goto do_deref; + } + break; + + case OP_PADSV: + /* $lex->[...]: padsv[$lex] sM/DREFAV */ + + ASSUME(!(o2->op_flags & + ~(OPf_WANT|OPf_PARENS|OPf_REF|OPf_MOD|OPf_SPECIAL))); + if ((o2->op_flags & + (OPf_WANT|OPf_REF|OPf_MOD|OPf_SPECIAL)) + != (OPf_WANT_SCALAR|OPf_MOD)) + break; + + ASSUME(!(o2->op_private & + ~(OPpPAD_STATE|OPpDEREF|OPpLVAL_INTRO))); + /* skip if state or intro, or not a deref */ + if ( o2->op_private != OPpDEREF_AV + && o2->op_private != OPpDEREF_HV) + break; + + o2 = o2->op_next; + if (o2->op_type == OP_RV2AV) { + action = MDEREF_AV_padsv_vivify_rv2av_aelem; + goto do_deref; + } + if (o2->op_type == OP_RV2HV) { + action = MDEREF_HV_padsv_vivify_rv2hv_helem; + goto do_deref; + } + break; + + case OP_PADAV: + case OP_PADHV: + /* $lex[..]: padav[@lex:1,2] sR * + * or $lex{..}: padhv[%lex:1,2] sR */ + ASSUME(!(o2->op_flags & ~(OPf_WANT|OPf_MOD|OPf_PARENS| + OPf_REF|OPf_SPECIAL))); + if ((o2->op_flags & + (OPf_WANT|OPf_REF|OPf_MOD|OPf_SPECIAL)) + != (OPf_WANT_SCALAR|OPf_REF)) + break; + if (o2->op_flags != (OPf_WANT_SCALAR|OPf_REF)) + break; + /* OPf_PARENS isn't currently used in this case; + * if that changes, let us know! */ + ASSUME(!(o2->op_flags & OPf_PARENS)); + + /* at this point, we wouldn't expect any of the remaining + * possible private flags: + * OPpPAD_STATE, OPpLVAL_INTRO, OPpTRUEBOOL, + * OPpMAYBE_TRUEBOOL, OPpMAYBE_LVSUB + * + * OPpSLICEWARNING shouldn't affect runtime + */ + ASSUME(!(o2->op_private & ~(OPpSLICEWARNING))); + + action = o2->op_type == OP_PADAV + ? MDEREF_AV_padav_aelem + : MDEREF_HV_padhv_helem; + o2 = o2->op_next; + S_maybe_multideref(aTHX_ o, o2, action, 0); + break; + + + case OP_RV2AV: + case OP_RV2HV: + action = o2->op_type == OP_RV2AV + ? MDEREF_AV_pop_rv2av_aelem + : MDEREF_HV_pop_rv2hv_helem; + /* FALLTHROUGH */ + do_deref: + /* (expr)->[...]: rv2av sKR/1; + * (expr)->{...}: rv2hv sKR/1; */ + + ASSUME(o2->op_type == OP_RV2AV || o2->op_type == OP_RV2HV); + + ASSUME(!(o2->op_flags & ~(OPf_WANT|OPf_KIDS|OPf_PARENS + |OPf_REF|OPf_MOD|OPf_STACKED|OPf_SPECIAL))); + if (o2->op_flags != (OPf_WANT_SCALAR|OPf_KIDS|OPf_REF)) + break; + + /* at this point, we wouldn't expect any of these + * possible private flags: + * OPpMAYBE_LVSUB, OPpLVAL_INTRO + * OPpTRUEBOOL, OPpMAYBE_TRUEBOOL, (rv2hv only) + */ + ASSUME(!(o2->op_private & + ~(OPpHINT_STRICT_REFS|OPpARG1_MASK|OPpSLICEWARNING + |OPpOUR_INTRO))); + hints |= (o2->op_private & OPpHINT_STRICT_REFS); + + o2 = o2->op_next; + + S_maybe_multideref(aTHX_ o, o2, action, hints); + break; + + default: + break; + } + } + + + switch (o->op_type) { + case OP_DBSTATE: + PL_curcop = ((COP*)o); /* for warnings */ + break; + case OP_NEXTSTATE: + PL_curcop = ((COP*)o); /* for warnings */ + + /* Optimise a "return ..." at the end of a sub to just be "...". + * This saves 2 ops. Before: + * 1 <;> nextstate(main 1 -e:1) v ->2 + * 4 <@> return K ->5 + * 2 <0> pushmark s ->3 + * - <1> ex-rv2sv sK/1 ->4 + * 3 <#> gvsv[*cat] s ->4 + * + * After: + * - <@> return K ->- + * - <0> pushmark s ->2 + * - <1> ex-rv2sv sK/1 ->- + * 2 <$> gvsv(*cat) s ->3 + */ + { + OP *next = o->op_next; + OP *sibling = OpSIBLING(o); + if ( OP_TYPE_IS(next, OP_PUSHMARK) + && OP_TYPE_IS(sibling, OP_RETURN) + && OP_TYPE_IS(sibling->op_next, OP_LINESEQ) + && ( OP_TYPE_IS(sibling->op_next->op_next, OP_LEAVESUB) + ||OP_TYPE_IS(sibling->op_next->op_next, + OP_LEAVESUBLV)) + && cUNOPx(sibling)->op_first == next + && OpHAS_SIBLING(next) && OpSIBLING(next)->op_next + && next->op_next + ) { + /* Look through the PUSHMARK's siblings for one that + * points to the RETURN */ + OP *top = OpSIBLING(next); + while (top && top->op_next) { + if (top->op_next == sibling) { + top->op_next = sibling->op_next; + o->op_next = next->op_next; + break; + } + top = OpSIBLING(top); + } + } + } + + /* Optimise 'my $x; my $y;' into 'my ($x, $y);' + * + * This latter form is then suitable for conversion into padrange + * later on. Convert: + * + * nextstate1 -> padop1 -> nextstate2 -> padop2 -> nextstate3 + * + * into: + * + * nextstate1 -> listop -> nextstate3 + * / \ + * pushmark -> padop1 -> padop2 + */ + if (o->op_next && ( + o->op_next->op_type == OP_PADSV + || o->op_next->op_type == OP_PADAV + || o->op_next->op_type == OP_PADHV + ) + && !(o->op_next->op_private & ~OPpLVAL_INTRO) + && o->op_next->op_next && o->op_next->op_next->op_type == OP_NEXTSTATE + && o->op_next->op_next->op_next && ( + o->op_next->op_next->op_next->op_type == OP_PADSV + || o->op_next->op_next->op_next->op_type == OP_PADAV + || o->op_next->op_next->op_next->op_type == OP_PADHV + ) + && !(o->op_next->op_next->op_next->op_private & ~OPpLVAL_INTRO) + && o->op_next->op_next->op_next->op_next && o->op_next->op_next->op_next->op_next->op_type == OP_NEXTSTATE + && (!CopLABEL((COP*)o)) /* Don't mess with labels */ + && (!CopLABEL((COP*)o->op_next->op_next)) /* ... */ + ) { + OP *pad1, *ns2, *pad2, *ns3, *newop, *newpm; + + pad1 = o->op_next; + ns2 = pad1->op_next; + pad2 = ns2->op_next; + ns3 = pad2->op_next; + + /* we assume here that the op_next chain is the same as + * the op_sibling chain */ + assert(OpSIBLING(o) == pad1); + assert(OpSIBLING(pad1) == ns2); + assert(OpSIBLING(ns2) == pad2); + assert(OpSIBLING(pad2) == ns3); + + /* excise and delete ns2 */ + op_sibling_splice(NULL, pad1, 1, NULL); + op_free(ns2); + + /* excise pad1 and pad2 */ + op_sibling_splice(NULL, o, 2, NULL); + + /* create new listop, with children consisting of: + * a new pushmark, pad1, pad2. */ + newop = newLISTOP(OP_LIST, 0, pad1, pad2); + newop->op_flags |= OPf_PARENS; + newop->op_flags = (newop->op_flags & ~OPf_WANT) | OPf_WANT_VOID; + + /* insert newop between o and ns3 */ + op_sibling_splice(NULL, o, 0, newop); + + /*fixup op_next chain */ + newpm = cUNOPx(newop)->op_first; /* pushmark */ + o ->op_next = newpm; + newpm->op_next = pad1; + pad1 ->op_next = pad2; + pad2 ->op_next = newop; /* listop */ + newop->op_next = ns3; + + /* Ensure pushmark has this flag if padops do */ + if (pad1->op_flags & OPf_MOD && pad2->op_flags & OPf_MOD) { + newpm->op_flags |= OPf_MOD; + } + + break; + } + + /* Two NEXTSTATEs in a row serve no purpose. Except if they happen + to carry two labels. For now, take the easier option, and skip + this optimisation if the first NEXTSTATE has a label. + Yves asked what about if they have different hints or features? + Tony thinks that as we remove the first of the pair it should + be fine. + */ + if (!CopLABEL((COP*)o) && !PERLDB_NOOPT) { + OP *nextop = o->op_next; + while (nextop) { + switch (nextop->op_type) { + case OP_NULL: + case OP_SCALAR: + case OP_LINESEQ: + case OP_SCOPE: + nextop = nextop->op_next; + continue; + } + break; + } + + if (nextop && (nextop->op_type == OP_NEXTSTATE)) { + op_null(o); + if (oldop) + oldop->op_next = nextop; + o = nextop; + /* Skip (old)oldop assignment since the current oldop's + op_next already points to the next op. */ + goto redo; + } + } + break; + + case OP_CONCAT: + if (o->op_next && o->op_next->op_type == OP_STRINGIFY) { + if (o->op_next->op_private & OPpTARGET_MY) { + if (o->op_flags & OPf_STACKED) /* chained concats */ + break; /* ignore_optimization */ + else { + /* assert(PL_opargs[o->op_type] & OA_TARGLEX); */ + o->op_targ = o->op_next->op_targ; + o->op_next->op_targ = 0; + o->op_private |= OPpTARGET_MY; + } + } + op_null(o->op_next); + } + break; + case OP_STUB: + if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) { + break; /* Scalar stub must produce undef. List stub is noop */ + } + goto nothin; + case OP_NULL: + if (o->op_targ == OP_NEXTSTATE + || o->op_targ == OP_DBSTATE) + { + PL_curcop = ((COP*)o); + } + /* XXX: We avoid setting op_seq here to prevent later calls + to rpeep() from mistakenly concluding that optimisation + has already occurred. This doesn't fix the real problem, + though (See 20010220.007 (#5874)). AMS 20010719 */ + /* op_seq functionality is now replaced by op_opt */ + o->op_opt = 0; + /* FALLTHROUGH */ + case OP_SCALAR: + case OP_LINESEQ: + case OP_SCOPE: + nothin: + if (oldop) { + oldop->op_next = o->op_next; + o->op_opt = 0; + continue; + } + break; + + case OP_PUSHMARK: + + /* Given + 5 repeat/DOLIST + 3 ex-list + 1 pushmark + 2 scalar or const + 4 const[0] + convert repeat into a stub with no kids. + */ + if (o->op_next->op_type == OP_CONST + || ( o->op_next->op_type == OP_PADSV + && !(o->op_next->op_private & OPpLVAL_INTRO)) + || ( o->op_next->op_type == OP_GV + && o->op_next->op_next->op_type == OP_RV2SV + && !(o->op_next->op_next->op_private + & (OPpLVAL_INTRO|OPpOUR_INTRO)))) + { + const OP *kid = o->op_next->op_next; + if (o->op_next->op_type == OP_GV) + kid = kid->op_next; + /* kid is now the ex-list. */ + if (kid->op_type == OP_NULL + && (kid = kid->op_next)->op_type == OP_CONST + /* kid is now the repeat count. */ + && kid->op_next->op_type == OP_REPEAT + && kid->op_next->op_private & OPpREPEAT_DOLIST + && (kid->op_next->op_flags & OPf_WANT) == OPf_WANT_LIST + && SvIOK(kSVOP_sv) && SvIVX(kSVOP_sv) == 0 + && oldop) + { + o = kid->op_next; /* repeat */ + oldop->op_next = o; + op_free(cBINOPo->op_first); + op_free(cBINOPo->op_last ); + o->op_flags &=~ OPf_KIDS; + /* stub is a baseop; repeat is a binop */ + STATIC_ASSERT_STMT(sizeof(OP) <= sizeof(BINOP)); + OpTYPE_set(o, OP_STUB); + o->op_private = 0; + break; + } + } + + /* If the pushmark is associated with an empty anonhash + * or anonlist, null out the pushmark and swap in a + * specialised op for the parent. + * 4 <@> anonhash sK* ->5 + * 3 <0> pushmark s ->4 + * becomes: + * 3 <@> emptyavhv sK* ->4 + * - <0> pushmark s ->3 + */ + if (!OpHAS_SIBLING(o) && (o->op_next == o->op_sibparent) && ( + (o->op_next->op_type == OP_ANONHASH) || + (o->op_next->op_type == OP_ANONLIST) ) && + (o->op_next->op_flags & OPf_SPECIAL) ) { + + OP* anon = o->op_next; + /* These next two are _potentially_ a padsv and an sassign */ + OP* padsv = anon->op_next; + OP* sassign = (padsv) ? padsv->op_next: NULL; + + anon->op_private = (anon->op_type == OP_ANONLIST) ? + 0 : OPpEMPTYAVHV_IS_HV; + OpTYPE_set(anon, OP_EMPTYAVHV); + op_null(o); + o = anon; + if (oldop) /* A previous optimization may have NULLED it */ + oldop->op_next = anon; + + /* Further optimise scalar assignment of an empty anonhash + * or anonlist by subsuming the padsv & sassign OPs. */ + if ((padsv->op_type == OP_PADSV) && + !(padsv->op_private & OPpDEREF) && + sassign && (sassign->op_type == OP_SASSIGN) ){ + + /* Take some public flags from the sassign */ + anon->op_flags = OPf_KIDS | OPf_SPECIAL | + (anon->op_flags & OPf_PARENS) | + (sassign->op_flags & (OPf_WANT|OPf_PARENS)); + + /* Take some private flags from the padsv */ + anon->op_private |= OPpTARGET_MY | + (padsv->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)); + + /* Take the targ slot from the padsv*/ + anon->op_targ = padsv->op_targ; + padsv->op_targ = 0; + + /* Clean up */ + anon->op_next = sassign->op_next; + op_null(padsv); + op_null(sassign); + } + break; + + } + + + /* Convert a series of PAD ops for my vars plus support into a + * single padrange op. Basically + * + * pushmark -> pad[ahs]v -> pad[ahs]?v -> ... -> (list) -> rest + * + * becomes, depending on circumstances, one of + * + * padrange ----------------------------------> (list) -> rest + * padrange --------------------------------------------> rest + * + * where all the pad indexes are sequential and of the same type + * (INTRO or not). + * We convert the pushmark into a padrange op, then skip + * any other pad ops, and possibly some trailing ops. + * Note that we don't null() the skipped ops, to make it + * easier for Deparse to undo this optimisation (and none of + * the skipped ops are holding any resources). It also makes + * it easier for find_uninit_var(), as it can just ignore + * padrange, and examine the original pad ops. + */ + { + OP *p; + OP *followop = NULL; /* the op that will follow the padrange op */ + U8 count = 0; + U8 intro = 0; + PADOFFSET base = 0; /* init only to stop compiler whining */ + bool gvoid = 0; /* init only to stop compiler whining */ + bool defav = 0; /* seen (...) = @_ */ + bool reuse = 0; /* reuse an existing padrange op */ + + /* look for a pushmark -> gv[_] -> rv2av */ + + { + OP *rv2av, *q; + p = o->op_next; + if ( p->op_type == OP_GV + && cGVOPx_gv(p) == PL_defgv + && (rv2av = p->op_next) + && rv2av->op_type == OP_RV2AV + && !(rv2av->op_flags & OPf_REF) + && !(rv2av->op_private & (OPpLVAL_INTRO|OPpMAYBE_LVSUB)) + && ((rv2av->op_flags & OPf_WANT) == OPf_WANT_LIST) + ) { + q = rv2av->op_next; + if (q->op_type == OP_NULL) + q = q->op_next; + if (q->op_type == OP_PUSHMARK) { + defav = 1; + p = q; + } + } + } + if (!defav) { + p = o; + } + + /* scan for PAD ops */ + + for (p = p->op_next; p; p = p->op_next) { + if (p->op_type == OP_NULL) + continue; + + if (( p->op_type != OP_PADSV + && p->op_type != OP_PADAV + && p->op_type != OP_PADHV + ) + /* any private flag other than INTRO? e.g. STATE */ + || (p->op_private & ~OPpLVAL_INTRO) + ) + break; + + /* let $a[N] potentially be optimised into AELEMFAST_LEX + * instead */ + if ( p->op_type == OP_PADAV + && p->op_next + && p->op_next->op_type == OP_CONST + && p->op_next->op_next + && p->op_next->op_next->op_type == OP_AELEM + ) + break; + + /* for 1st padop, note what type it is and the range + * start; for the others, check that it's the same type + * and that the targs are contiguous */ + if (count == 0) { + intro = (p->op_private & OPpLVAL_INTRO); + base = p->op_targ; + gvoid = OP_GIMME(p,0) == G_VOID; + } + else { + if ((p->op_private & OPpLVAL_INTRO) != intro) + break; + /* Note that you'd normally expect targs to be + * contiguous in my($a,$b,$c), but that's not the case + * when external modules start doing things, e.g. + * Function::Parameters */ + if (p->op_targ != base + count) + break; + assert(p->op_targ == base + count); + /* Either all the padops or none of the padops should + be in void context. Since we only do the optimisa- + tion for av/hv when the aggregate itself is pushed + on to the stack (one item), there is no need to dis- + tinguish list from scalar context. */ + if (gvoid != (OP_GIMME(p,0) == G_VOID)) + break; + } + + /* for AV, HV, only when we're not flattening */ + if ( p->op_type != OP_PADSV + && !gvoid + && !(p->op_flags & OPf_REF) + ) + break; + + if (count >= OPpPADRANGE_COUNTMASK) + break; + + /* there's a biggest base we can fit into a + * SAVEt_CLEARPADRANGE in pp_padrange. + * (The sizeof() stuff will be constant-folded, and is + * intended to avoid getting "comparison is always false" + * compiler warnings. See the comments above + * MEM_WRAP_CHECK for more explanation on why we do this + * in a weird way to avoid compiler warnings.) + */ + if ( intro + && (8*sizeof(base) > + 8*sizeof(UV)-OPpPADRANGE_COUNTSHIFT-SAVE_TIGHT_SHIFT + ? (Size_t)base + : (UV_MAX >> (OPpPADRANGE_COUNTSHIFT+SAVE_TIGHT_SHIFT)) + ) > + (UV_MAX >> (OPpPADRANGE_COUNTSHIFT+SAVE_TIGHT_SHIFT)) + ) + break; + + /* Success! We've got another valid pad op to optimise away */ + count++; + followop = p->op_next; + } + + if (count < 1 || (count == 1 && !defav)) + break; + + /* pp_padrange in specifically compile-time void context + * skips pushing a mark and lexicals; in all other contexts + * (including unknown till runtime) it pushes a mark and the + * lexicals. We must be very careful then, that the ops we + * optimise away would have exactly the same effect as the + * padrange. + * In particular in void context, we can only optimise to + * a padrange if we see the complete sequence + * pushmark, pad*v, ...., list + * which has the net effect of leaving the markstack as it + * was. Not pushing onto the stack (whereas padsv does touch + * the stack) makes no difference in void context. + */ + assert(followop); + if (gvoid) { + if (followop->op_type == OP_LIST + && OP_GIMME(followop,0) == G_VOID + ) + { + followop = followop->op_next; /* skip OP_LIST */ + + /* consolidate two successive my(...);'s */ + + if ( oldoldop + && oldoldop->op_type == OP_PADRANGE + && (oldoldop->op_flags & OPf_WANT) == OPf_WANT_VOID + && (oldoldop->op_private & OPpLVAL_INTRO) == intro + && !(oldoldop->op_flags & OPf_SPECIAL) + ) { + U8 old_count; + assert(oldoldop->op_next == oldop); + assert( oldop->op_type == OP_NEXTSTATE + || oldop->op_type == OP_DBSTATE); + assert(oldop->op_next == o); + + old_count + = (oldoldop->op_private & OPpPADRANGE_COUNTMASK); + + /* Do not assume pad offsets for $c and $d are con- + tiguous in + my ($a,$b,$c); + my ($d,$e,$f); + */ + if ( oldoldop->op_targ + old_count == base + && old_count < OPpPADRANGE_COUNTMASK - count) { + base = oldoldop->op_targ; + count += old_count; + reuse = 1; + } + } + + /* if there's any immediately following singleton + * my var's; then swallow them and the associated + * nextstates; i.e. + * my ($a,$b); my $c; my $d; + * is treated as + * my ($a,$b,$c,$d); + */ + + while ( ((p = followop->op_next)) + && ( p->op_type == OP_PADSV + || p->op_type == OP_PADAV + || p->op_type == OP_PADHV) + && (p->op_flags & OPf_WANT) == OPf_WANT_VOID + && (p->op_private & OPpLVAL_INTRO) == intro + && !(p->op_private & ~OPpLVAL_INTRO) + && p->op_next + && ( p->op_next->op_type == OP_NEXTSTATE + || p->op_next->op_type == OP_DBSTATE) + && count < OPpPADRANGE_COUNTMASK + && base + count == p->op_targ + ) { + count++; + followop = p->op_next; + } + } + else + break; + } + + if (reuse) { + assert(oldoldop->op_type == OP_PADRANGE); + oldoldop->op_next = followop; + oldoldop->op_private = (intro | count); + o = oldoldop; + oldop = NULL; + oldoldop = NULL; + } + else { + /* Convert the pushmark into a padrange. + * To make Deparse easier, we guarantee that a padrange was + * *always* formerly a pushmark */ + assert(o->op_type == OP_PUSHMARK); + o->op_next = followop; + OpTYPE_set(o, OP_PADRANGE); + o->op_targ = base; + /* bit 7: INTRO; bit 6..0: count */ + o->op_private = (intro | count); + o->op_flags = ((o->op_flags & ~(OPf_WANT|OPf_SPECIAL)) + | gvoid * OPf_WANT_VOID + | (defav ? OPf_SPECIAL : 0)); + } + break; + } + + case OP_RV2AV: + if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) + S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); + break; + + case OP_RV2HV: + case OP_PADHV: + /*'keys %h' in void or scalar context: skip the OP_KEYS + * and perform the functionality directly in the RV2HV/PADHV + * op + */ + if (o->op_flags & OPf_REF) { + OP *k = o->op_next; + U8 want = (k->op_flags & OPf_WANT); + if ( k + && k->op_type == OP_KEYS + && ( want == OPf_WANT_VOID + || want == OPf_WANT_SCALAR) + && !(k->op_private & OPpMAYBE_LVSUB) + && !(k->op_flags & OPf_MOD) + ) { + o->op_next = k->op_next; + o->op_flags &= ~(OPf_REF|OPf_WANT); + o->op_flags |= want; + o->op_private |= (o->op_type == OP_PADHV ? + OPpPADHV_ISKEYS : OPpRV2HV_ISKEYS); + /* for keys(%lex), hold onto the OP_KEYS's targ + * since padhv doesn't have its own targ to return + * an int with */ + if (!(o->op_type ==OP_PADHV && want == OPf_WANT_SCALAR)) + op_null(k); + } + } + + /* see if %h is used in boolean context */ + if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) + S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, OPpMAYBE_TRUEBOOL); + + + if (o->op_type != OP_PADHV) + break; + /* FALLTHROUGH */ + case OP_PADAV: + if ( o->op_type == OP_PADAV + && (o->op_flags & OPf_WANT) == OPf_WANT_SCALAR + ) + S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); + /* FALLTHROUGH */ + case OP_PADSV: + /* Skip over state($x) in void context. */ + if (oldop && o->op_private == (OPpPAD_STATE|OPpLVAL_INTRO) + && (o->op_flags & OPf_WANT) == OPf_WANT_VOID) + { + oldop->op_next = o->op_next; + goto redo_nextstate; + } + if (o->op_type != OP_PADAV) + break; + /* FALLTHROUGH */ + case OP_GV: + if (o->op_type == OP_PADAV || o->op_next->op_type == OP_RV2AV) { + OP* const pop = (o->op_type == OP_PADAV) ? + o->op_next : o->op_next->op_next; + IV i; + if (pop && pop->op_type == OP_CONST && + ((PL_op = pop->op_next)) && + pop->op_next->op_type == OP_AELEM && + !(pop->op_next->op_private & + (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF|OPpMAYBE_LVSUB)) && + (i = SvIV(cSVOPx(pop)->op_sv)) >= -128 && i <= 127) + { + GV *gv; + if (cSVOPx(pop)->op_private & OPpCONST_STRICT) + no_bareword_allowed(pop); + if (o->op_type == OP_GV) + op_null(o->op_next); + op_null(pop->op_next); + op_null(pop); + o->op_flags |= pop->op_next->op_flags & OPf_MOD; + o->op_next = pop->op_next->op_next; + o->op_ppaddr = PL_ppaddr[OP_AELEMFAST]; + o->op_private = (U8)i; + if (o->op_type == OP_GV) { + gv = cGVOPo_gv; + GvAVn(gv); + o->op_type = OP_AELEMFAST; + } + else + o->op_type = OP_AELEMFAST_LEX; + } + if (o->op_type != OP_GV) + break; + } + + /* Remove $foo from the op_next chain in void context. */ + if (oldop + && ( o->op_next->op_type == OP_RV2SV + || o->op_next->op_type == OP_RV2AV + || o->op_next->op_type == OP_RV2HV ) + && (o->op_next->op_flags & OPf_WANT) == OPf_WANT_VOID + && !(o->op_next->op_private & OPpLVAL_INTRO)) + { + oldop->op_next = o->op_next->op_next; + /* Reprocess the previous op if it is a nextstate, to + allow double-nextstate optimisation. */ + redo_nextstate: + if (oldop->op_type == OP_NEXTSTATE) { + oldop->op_opt = 0; + o = oldop; + oldop = oldoldop; + oldoldop = NULL; + goto redo; + } + o = oldop->op_next; + goto redo; + } + else if (o->op_next->op_type == OP_RV2SV) { + if (!(o->op_next->op_private & OPpDEREF)) { + op_null(o->op_next); + o->op_private |= o->op_next->op_private & (OPpLVAL_INTRO + | OPpOUR_INTRO); + o->op_next = o->op_next->op_next; + OpTYPE_set(o, OP_GVSV); + } + } + else if (o->op_next->op_type == OP_READLINE + && o->op_next->op_next->op_type == OP_CONCAT + && (o->op_next->op_next->op_flags & OPf_STACKED)) + { + /* Turn "$a .= " into an OP_RCATLINE. AMS 20010917 */ + OpTYPE_set(o, OP_RCATLINE); + o->op_flags |= OPf_STACKED; + op_null(o->op_next->op_next); + op_null(o->op_next); + } + + break; + + case OP_NOT: + break; + + case OP_AND: + case OP_OR: + case OP_DOR: + case OP_CMPCHAIN_AND: + case OP_PUSHDEFER: + while (cLOGOP->op_other->op_type == OP_NULL) + cLOGOP->op_other = cLOGOP->op_other->op_next; + while (o->op_next && ( o->op_type == o->op_next->op_type + || o->op_next->op_type == OP_NULL)) + o->op_next = o->op_next->op_next; + + /* If we're an OR and our next is an AND in void context, we'll + follow its op_other on short circuit, same for reverse. + We can't do this with OP_DOR since if it's true, its return + value is the underlying value which must be evaluated + by the next op. */ + if (o->op_next && + ( + (IS_AND_OP(o) && IS_OR_OP(o->op_next)) + || (IS_OR_OP(o) && IS_AND_OP(o->op_next)) + ) + && (o->op_next->op_flags & OPf_WANT) == OPf_WANT_VOID + ) { + o->op_next = cLOGOPx(o->op_next)->op_other; + } + DEFER(cLOGOP->op_other); + o->op_opt = 1; + break; + + case OP_GREPWHILE: + if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) + S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); + /* FALLTHROUGH */ + case OP_COND_EXPR: + case OP_MAPWHILE: + case OP_ANDASSIGN: + case OP_ORASSIGN: + case OP_DORASSIGN: + case OP_RANGE: + case OP_ONCE: + case OP_ARGDEFELEM: + while (cLOGOP->op_other->op_type == OP_NULL) + cLOGOP->op_other = cLOGOP->op_other->op_next; + DEFER(cLOGOP->op_other); + break; + + case OP_ENTERLOOP: + case OP_ENTERITER: + while (cLOOP->op_redoop->op_type == OP_NULL) + cLOOP->op_redoop = cLOOP->op_redoop->op_next; + while (cLOOP->op_nextop->op_type == OP_NULL) + cLOOP->op_nextop = cLOOP->op_nextop->op_next; + while (cLOOP->op_lastop->op_type == OP_NULL) + cLOOP->op_lastop = cLOOP->op_lastop->op_next; + /* a while(1) loop doesn't have an op_next that escapes the + * loop, so we have to explicitly follow the op_lastop to + * process the rest of the code */ + DEFER(cLOOP->op_lastop); + break; + + case OP_ENTERTRY: + assert(cLOGOPo->op_other->op_type == OP_LEAVETRY); + DEFER(cLOGOPo->op_other); + break; + + case OP_ENTERTRYCATCH: + assert(cLOGOPo->op_other->op_type == OP_CATCH); + /* catch body is the ->op_other of the OP_CATCH */ + DEFER(cLOGOPx(cLOGOPo->op_other)->op_other); + break; + + case OP_SUBST: + if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) + S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); + assert(!(cPMOP->op_pmflags & PMf_ONCE)); + while (cPMOP->op_pmstashstartu.op_pmreplstart && + cPMOP->op_pmstashstartu.op_pmreplstart->op_type == OP_NULL) + cPMOP->op_pmstashstartu.op_pmreplstart + = cPMOP->op_pmstashstartu.op_pmreplstart->op_next; + DEFER(cPMOP->op_pmstashstartu.op_pmreplstart); + break; + + case OP_SORT: { + OP *oright; + + if (o->op_flags & OPf_SPECIAL) { + /* first arg is a code block */ + OP * const nullop = OpSIBLING(cLISTOP->op_first); + OP * kid = cUNOPx(nullop)->op_first; + + assert(nullop->op_type == OP_NULL); + assert(kid->op_type == OP_SCOPE + || (kid->op_type == OP_NULL && kid->op_targ == OP_LEAVE)); + /* since OP_SORT doesn't have a handy op_other-style + * field that can point directly to the start of the code + * block, store it in the otherwise-unused op_next field + * of the top-level OP_NULL. This will be quicker at + * run-time, and it will also allow us to remove leading + * OP_NULLs by just messing with op_nexts without + * altering the basic op_first/op_sibling layout. */ + kid = kLISTOP->op_first; + assert( + (kid->op_type == OP_NULL + && ( kid->op_targ == OP_NEXTSTATE + || kid->op_targ == OP_DBSTATE )) + || kid->op_type == OP_STUB + || kid->op_type == OP_ENTER + || (PL_parser && PL_parser->error_count)); + nullop->op_next = kid->op_next; + DEFER(nullop->op_next); + } + + /* check that RHS of sort is a single plain array */ + oright = cUNOPo->op_first; + if (!oright || oright->op_type != OP_PUSHMARK) + break; + + if (o->op_private & OPpSORT_INPLACE) + break; + + /* reverse sort ... can be optimised. */ + if (!OpHAS_SIBLING(cUNOPo)) { + /* Nothing follows us on the list. */ + OP * const reverse = o->op_next; + + if (reverse->op_type == OP_REVERSE && + (reverse->op_flags & OPf_WANT) == OPf_WANT_LIST) { + OP * const pushmark = cUNOPx(reverse)->op_first; + if (pushmark && (pushmark->op_type == OP_PUSHMARK) + && (OpSIBLING(cUNOPx(pushmark)) == o)) { + /* reverse -> pushmark -> sort */ + o->op_private |= OPpSORT_REVERSE; + op_null(reverse); + pushmark->op_next = oright->op_next; + op_null(oright); + } + } + } + + break; + } + + case OP_REVERSE: { + OP *ourmark, *theirmark, *ourlast, *iter, *expushmark, *rv2av; + OP *gvop = NULL; + LISTOP *enter, *exlist; + + if (o->op_private & OPpSORT_INPLACE) + break; + + enter = cLISTOPx(o->op_next); + if (!enter) + break; + if (enter->op_type == OP_NULL) { + enter = cLISTOPx(enter->op_next); + if (!enter) + break; + } + /* for $a (...) will have OP_GV then OP_RV2GV here. + for (...) just has an OP_GV. */ + if (enter->op_type == OP_GV) { + gvop = (OP *) enter; + enter = cLISTOPx(enter->op_next); + if (!enter) + break; + if (enter->op_type == OP_RV2GV) { + enter = cLISTOPx(enter->op_next); + if (!enter) + break; + } + } + + if (enter->op_type != OP_ENTERITER) + break; + + iter = enter->op_next; + if (!iter || iter->op_type != OP_ITER) + break; + + expushmark = enter->op_first; + if (!expushmark || expushmark->op_type != OP_NULL + || expushmark->op_targ != OP_PUSHMARK) + break; + + exlist = cLISTOPx(OpSIBLING(expushmark)); + if (!exlist || exlist->op_type != OP_NULL + || exlist->op_targ != OP_LIST) + break; + + if (exlist->op_last != o) { + /* Mmm. Was expecting to point back to this op. */ + break; + } + theirmark = exlist->op_first; + if (!theirmark || theirmark->op_type != OP_PUSHMARK) + break; + + if (OpSIBLING(theirmark) != o) { + /* There's something between the mark and the reverse, eg + for (1, reverse (...)) + so no go. */ + break; + } + + ourmark = cLISTOPo->op_first; + if (!ourmark || ourmark->op_type != OP_PUSHMARK) + break; + + ourlast = cLISTOPo->op_last; + if (!ourlast || ourlast->op_next != o) + break; + + rv2av = OpSIBLING(ourmark); + if (rv2av && rv2av->op_type == OP_RV2AV && !OpHAS_SIBLING(rv2av) + && rv2av->op_flags == (OPf_WANT_LIST | OPf_KIDS)) { + /* We're just reversing a single array. */ + rv2av->op_flags = OPf_WANT_SCALAR | OPf_KIDS | OPf_REF; + enter->op_flags |= OPf_STACKED; + } + + /* We don't have control over who points to theirmark, so sacrifice + ours. */ + theirmark->op_next = ourmark->op_next; + theirmark->op_flags = ourmark->op_flags; + ourlast->op_next = gvop ? gvop : (OP *) enter; + op_null(ourmark); + op_null(o); + enter->op_private |= OPpITER_REVERSED; + iter->op_private |= OPpITER_REVERSED; + + oldoldop = NULL; + oldop = ourlast; + o = oldop->op_next; + goto redo; + NOT_REACHED; /* NOTREACHED */ + break; + } + + case OP_UNDEF: + if ((o->op_flags & OPf_KIDS) && + (cUNOPx(o)->op_first->op_type == OP_PADSV)) { + + /* Convert: + * undef + * padsv[$x] + * to: + * undef[$x] + */ + + OP * padsv = cUNOPx(o)->op_first; + o->op_private = OPpTARGET_MY | + (padsv->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)); + o->op_targ = padsv->op_targ; padsv->op_targ = 0; + op_null(padsv); + /* Optimizer does NOT seem to fix up the padsv op_next ptr */ + if (oldoldop) + oldoldop->op_next = o; + oldop = oldoldop; + oldoldop = NULL; + + } else if (o->op_next->op_type == OP_PADSV) { + OP * padsv = o->op_next; + OP * sassign = (padsv->op_next && + padsv->op_next->op_type == OP_SASSIGN) ? + padsv->op_next : NULL; + if (sassign && cBINOPx(sassign)->op_first == o) { + /* Convert: + * sassign + * undef + * padsv[$x] + * to: + * undef[$x] + * NOTE: undef does not have the "T" flag set in + * regen/opcodes, as this would cause + * S_maybe_targlex to do the optimization. + * Seems easier to keep it all here, rather + * than have an undef-specific branch in + * S_maybe_targlex just to add the + * OPpUNDEF_KEEP_PV flag. + */ + o->op_private = OPpTARGET_MY | OPpUNDEF_KEEP_PV | + (padsv->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)); + o->op_targ = padsv->op_targ; padsv->op_targ = 0; + op_null(padsv); + op_null(sassign); + /* Optimizer DOES seems to fix up the op_next ptrs */ + } + } + break; + + case OP_QR: + case OP_MATCH: + if (!(cPMOP->op_pmflags & PMf_ONCE)) { + assert (!cPMOP->op_pmstashstartu.op_pmreplstart); + } + break; + + case OP_RUNCV: + if (!(o->op_private & OPpOFFBYONE) && !CvCLONE(PL_compcv) + && (!CvANON(PL_compcv) || (!PL_cv_has_eval && !PL_perldb))) + { + SV *sv; + if (CvEVAL(PL_compcv)) sv = &PL_sv_undef; + else { + sv = newRV((SV *)PL_compcv); + sv_rvweaken(sv); + SvREADONLY_on(sv); + } + OpTYPE_set(o, OP_CONST); + o->op_flags |= OPf_SPECIAL; + cSVOPo->op_sv = sv; + } + break; + + case OP_SASSIGN: { + if (OP_GIMME(o,0) == G_VOID + || ( o->op_next->op_type == OP_LINESEQ + && ( o->op_next->op_next->op_type == OP_LEAVESUB + || ( o->op_next->op_next->op_type == OP_RETURN + && !CvLVALUE(PL_compcv))))) + { + OP *right = cBINOP->op_first; + if (right) { + /* sassign + * RIGHT + * substr + * pushmark + * arg1 + * arg2 + * ... + * becomes + * + * ex-sassign + * substr + * pushmark + * RIGHT + * arg1 + * arg2 + * ... + */ + OP *left = OpSIBLING(right); + if (left->op_type == OP_SUBSTR + && (left->op_private & 7) < 4) { + op_null(o); + /* cut out right */ + op_sibling_splice(o, NULL, 1, NULL); + /* and insert it as second child of OP_SUBSTR */ + op_sibling_splice(left, cBINOPx(left)->op_first, 0, + right); + left->op_private |= OPpSUBSTR_REPL_FIRST; + left->op_flags = + (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID; + } + } + } + OP* rhs = cBINOPx(o)->op_first; + OP* lval = cBINOPx(o)->op_last; + + /* Combine a simple SASSIGN OP with a PADSV lvalue child OP + * into a single OP. */ + + /* This optimization covers arbitrarily complicated RHS OP + * trees. Separate optimizations may exist for specific, + * single RHS OPs, such as: + * "my $foo = undef;" or "my $bar = $other_padsv;" */ + + if (!(o->op_private & (OPpASSIGN_BACKWARDS|OPpASSIGN_CV_TO_GV)) + && lval && (lval->op_type == OP_PADSV) && + !(lval->op_private & OPpDEREF) + /* skip if padrange has already gazumped the padsv */ + && (lval == oldop) + /* Memoize::Once produces a non-standard SASSIGN that + * doesn't actually point to pp_sassign, has only one + * child (PADSV), and gets to it via op_other rather + * than op_next. Don't try to optimize this. */ + && (lval != rhs) + ) { + /* SASSIGN's bitfield flags, such as op_moresib and + * op_slabbed, will be carried over unchanged. */ + OpTYPE_set(o, OP_PADSV_STORE); + + /* Explicitly craft the new OP's op_flags, carrying + * some bits over from the SASSIGN */ + o->op_flags = ( + OPf_KIDS | OPf_STACKED | + (o->op_flags & (OPf_WANT|OPf_PARENS)) + ); + + /* Reset op_private flags, taking relevant private flags + * from the PADSV */ + o->op_private = (lval->op_private & + (OPpLVAL_INTRO|OPpPAD_STATE|OPpDEREF)); + + /* Steal the targ from the PADSV */ + o->op_targ = lval->op_targ; lval->op_targ = 0; + + /* Fixup op_next ptrs */ + assert(oldop->op_type == OP_PADSV); + /* oldoldop can be arbitrarily deep in the RHS OP tree */ + oldoldop->op_next = o; + + /* Even when (rhs != oldoldop), rhs might still have a + * relevant op_next ptr to lval. This is definitely true + * when rhs is OP_NULL with a LOGOP kid (e.g. orassign). + * There may be other cases. */ + if (rhs->op_next == lval) + rhs->op_next = o; + + /* Now null-out the PADSV */ + op_null(lval); + + /* NULL the previous op ptrs, so rpeep can continue */ + oldoldop = NULL; oldop = NULL; + } + + /* Combine a simple SASSIGN OP with an AELEMFAST_LEX lvalue + * into a single OP. This optimization covers arbitrarily + * complicated RHS OP trees. */ + + if (!(o->op_private & (OPpASSIGN_BACKWARDS|OPpASSIGN_CV_TO_GV)) + && (lval->op_type == OP_NULL) && (lval->op_private == 2) && + (cBINOPx(lval)->op_first->op_type == OP_AELEMFAST_LEX) + ) { + OP * lex = cBINOPx(lval)->op_first; + /* SASSIGN's bitfield flags, such as op_moresib and + * op_slabbed, will be carried over unchanged. */ + OpTYPE_set(o, OP_AELEMFASTLEX_STORE); + + /* Explicitly craft the new OP's op_flags, carrying + * some bits over from the SASSIGN */ + o->op_flags = ( + OPf_KIDS | OPf_STACKED | + (o->op_flags & (OPf_WANT|OPf_PARENS)) + ); + + /* Copy the AELEMFAST_LEX op->private, which contains + * the key index. */ + o->op_private = lex->op_private; + + /* Take the targ from the AELEMFAST_LEX */ + o->op_targ = lex->op_targ; lex->op_targ = 0; + + assert(oldop->op_type == OP_AELEMFAST_LEX); + /* oldoldop can be arbitrarily deep in the RHS OP tree */ + oldoldop->op_next = o; + + /* Even when (rhs != oldoldop), rhs might still have a + * relevant op_next ptr to lex. (Updating it here can + * also cause other ops in the RHS to get the desired + * op_next pointer, presumably thanks to the finalizer.) + * This is definitely truewhen rhs is OP_NULL with a + * LOGOP kid (e.g. orassign). There may be other cases. */ + if (rhs->op_next == lex) + rhs->op_next = o; + + /* Now null-out the AELEMFAST_LEX */ + op_null(lex); + + /* NULL the previous op ptrs, so rpeep can continue */ + oldop = oldoldop; oldoldop = NULL; + } + + break; + } + + case OP_AASSIGN: { + int l, r, lr, lscalars, rscalars; + + /* handle common vars detection, e.g. ($a,$b) = ($b,$a). + Note that we do this now rather than in newASSIGNOP(), + since only by now are aliased lexicals flagged as such + + See the essay "Common vars in list assignment" above for + the full details of the rationale behind all the conditions + below. + + PL_generation sorcery: + To detect whether there are common vars, the global var + PL_generation is incremented for each assign op we scan. + Then we run through all the lexical variables on the LHS, + of the assignment, setting a spare slot in each of them to + PL_generation. Then we scan the RHS, and if any lexicals + already have that value, we know we've got commonality. + Also, if the generation number is already set to + PERL_INT_MAX, then the variable is involved in aliasing, so + we also have potential commonality in that case. + */ + + PL_generation++; + /* scan LHS */ + lscalars = 0; + l = S_aassign_scan(aTHX_ cLISTOPo->op_last, FALSE, &lscalars); + /* scan RHS */ + rscalars = 0; + r = S_aassign_scan(aTHX_ cLISTOPo->op_first, TRUE, &rscalars); + lr = (l|r); + + + /* After looking for things which are *always* safe, this main + * if/else chain selects primarily based on the type of the + * LHS, gradually working its way down from the more dangerous + * to the more restrictive and thus safer cases */ + + if ( !l /* () = ....; */ + || !r /* .... = (); */ + || !(l & ~AAS_SAFE_SCALAR) /* (undef, pos()) = ...; */ + || !(r & ~AAS_SAFE_SCALAR) /* ... = (1,2,length,undef); */ + || (lscalars < 2) /* (undef, $x) = ... */ + ) { + NOOP; /* always safe */ + } + else if (l & AAS_DANGEROUS) { + /* always dangerous */ + o->op_private |= OPpASSIGN_COMMON_SCALAR; + o->op_private |= OPpASSIGN_COMMON_AGG; + } + else if (l & (AAS_PKG_SCALAR|AAS_PKG_AGG)) { + /* package vars are always dangerous - too many + * aliasing possibilities */ + if (l & AAS_PKG_SCALAR) + o->op_private |= OPpASSIGN_COMMON_SCALAR; + if (l & AAS_PKG_AGG) + o->op_private |= OPpASSIGN_COMMON_AGG; + } + else if (l & ( AAS_MY_SCALAR|AAS_MY_AGG + |AAS_LEX_SCALAR|AAS_LEX_AGG)) + { + /* LHS contains only lexicals and safe ops */ + + if (l & (AAS_MY_AGG|AAS_LEX_AGG)) + o->op_private |= OPpASSIGN_COMMON_AGG; + + if (l & (AAS_MY_SCALAR|AAS_LEX_SCALAR)) { + if (lr & AAS_LEX_SCALAR_COMM) + o->op_private |= OPpASSIGN_COMMON_SCALAR; + else if ( !(l & AAS_LEX_SCALAR) + && (r & AAS_DEFAV)) + { + /* falsely mark + * my (...) = @_ + * as scalar-safe for performance reasons. + * (it will still have been marked _AGG if necessary */ + NOOP; + } + else if (r & (AAS_PKG_SCALAR|AAS_PKG_AGG|AAS_DANGEROUS)) + /* if there are only lexicals on the LHS and no + * common ones on the RHS, then we assume that the + * only way those lexicals could also get + * on the RHS is via some sort of dereffing or + * closure, e.g. + * $r = \$lex; + * ($lex, $x) = (1, $$r) + * and in this case we assume the var must have + * a bumped ref count. So if its ref count is 1, + * it must only be on the LHS. + */ + o->op_private |= OPpASSIGN_COMMON_RC1; + } + } + + /* ... = ($x) + * may have to handle aggregate on LHS, but we can't + * have common scalars. */ + if (rscalars < 2) + o->op_private &= + ~(OPpASSIGN_COMMON_SCALAR|OPpASSIGN_COMMON_RC1); + + if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) + S_check_for_bool_cxt(o, 1, OPpASSIGN_TRUEBOOL, 0); + break; + } + + case OP_REF: + case OP_BLESSED: + /* if the op is used in boolean context, set the TRUEBOOL flag + * which enables an optimisation at runtime which avoids creating + * a stack temporary for known-true package names */ + if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) + S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, OPpMAYBE_TRUEBOOL); + break; + + case OP_LENGTH: + /* see if the op is used in known boolean context, + * but not if OA_TARGLEX optimisation is enabled */ + if ( (o->op_flags & OPf_WANT) == OPf_WANT_SCALAR + && !(o->op_private & OPpTARGET_MY) + ) + S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); + break; + + case OP_POS: + /* see if the op is used in known boolean context */ + if ((o->op_flags & OPf_WANT) == OPf_WANT_SCALAR) + S_check_for_bool_cxt(o, 1, OPpTRUEBOOL, 0); + break; + + case OP_CUSTOM: { + Perl_cpeep_t cpeep = + XopENTRYCUSTOM(o, xop_peep); + if (cpeep) + cpeep(aTHX_ o, oldop); + break; + } + + } + /* did we just null the current op? If so, re-process it to handle + * eliding "empty" ops from the chain */ + if (o->op_type == OP_NULL && oldop && oldop->op_next == o) { + o->op_opt = 0; + o = oldop; + } + else { + oldoldop = oldop; + oldop = o; + } + } + LEAVE; +} + +void +Perl_peep(pTHX_ OP *o) +{ + CALL_RPEEP(o); +} + +/* + * ex: set ts=8 sts=4 sw=4 et: + */ Index: gnu/usr.bin/perl/perl.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perl.c,v diff -u -p -a -u -p -r1.45 perl.c --- gnu/usr.bin/perl/perl.c 8 Jul 2023 14:18:35 -0000 1.45 +++ gnu/usr.bin/perl/perl.c 21 Feb 2024 15:47:02 -0000 @@ -67,12 +67,6 @@ static I32 read_e_script(pTHX_ int idx, # define validate_suid(rsfp) S_validate_suid(aTHX_ rsfp) #endif -#define CALL_BODY_SUB(myop) \ - if (PL_op == (myop)) \ - PL_op = PL_ppaddr[OP_ENTERSUB](aTHX); \ - if (PL_op) \ - CALLRUNOPS(aTHX); - #define CALL_LIST_BODY(cv) \ PUSHMARK(PL_stack_sp); \ call_sv(MUTABLE_SV((cv)), G_EVAL|G_DISCARD|G_VOID); @@ -108,6 +102,34 @@ S_init_tls_and_interp(PerlInterpreter *m } +#ifndef PLATFORM_SYS_INIT_ +# define PLATFORM_SYS_INIT_ NOOP +#endif + +#ifndef PLATFORM_SYS_TERM_ +# define PLATFORM_SYS_TERM_ NOOP +#endif + +#ifndef PERL_SYS_INIT_BODY +# define PERL_SYS_INIT_BODY(c,v) \ + MALLOC_CHECK_TAINT2(*c,*v) PERL_FPU_INIT; PERLIO_INIT; \ + MALLOC_INIT; PLATFORM_SYS_INIT_; +#endif + +/* Generally add things last-in first-terminated. IO and memory terminations + * need to be generally last + * + * BEWARE that using PerlIO in these will be using freed memory, so may appear + * to work, but must NOT be retained in production code. */ +#ifndef PERL_SYS_TERM_BODY +# define PERL_SYS_TERM_BODY() \ + ENV_TERM; USER_PROP_MUTEX_TERM; LOCALE_TERM; \ + HINTS_REFCNT_TERM; KEYWORD_PLUGIN_MUTEX_TERM; \ + OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM; \ + PERLIO_TERM; MALLOC_TERM; \ + PLATFORM_SYS_TERM_; +#endif + /* these implement the PERL_SYS_INIT, PERL_SYS_INIT3, PERL_SYS_TERM macros */ void @@ -238,20 +260,43 @@ perl_construct(pTHXx) init_stacks(); -/* The PERL_INTERNAL_RAND_SEED set-up must be after init_stacks because it calls +#if !defined(NO_PERL_RAND_SEED) || !defined(NO_PERL_INTERNAL_HASH_SEED) + bool sensitive_env_vars_allowed = + (PerlProc_getuid() == PerlProc_geteuid() && + PerlProc_getgid() == PerlProc_getegid()) ? TRUE : FALSE; +#endif + +/* The seed set-up must be after init_stacks because it calls * things that may put SVs on the stack. */ +#ifndef NO_PERL_RAND_SEED + if (sensitive_env_vars_allowed) { + UV seed= 0; + const char *env_pv; + if ((env_pv = PerlEnv_getenv("PERL_RAND_SEED")) && + grok_number(env_pv, strlen(env_pv), &seed) == IS_NUMBER_IN_UV) + { + PL_srand_override_next = seed; + PERL_SRAND_OVERRIDE_NEXT_INIT(); + } + } +#endif + + /* This is NOT the state used for C, this is only + * used in internal functionality */ #ifdef NO_PERL_INTERNAL_RAND_SEED Perl_drand48_init_r(&PL_internal_random_state, seed()); #else { UV seed; const char *env_pv; - if (PerlProc_getuid() != PerlProc_geteuid() || - PerlProc_getgid() != PerlProc_getegid() || + if ( + !sensitive_env_vars_allowed || !(env_pv = PerlEnv_getenv("PERL_INTERNAL_RAND_SEED")) || - grok_number(env_pv, strlen(env_pv), &seed) != IS_NUMBER_IN_UV) { + grok_number(env_pv, strlen(env_pv), &seed) != IS_NUMBER_IN_UV) + { + /* use a randomly generated seed */ seed = seed(); } Perl_drand48_init_r(&PL_internal_random_state, (U32)seed); @@ -337,7 +382,7 @@ perl_construct(pTHXx) PERL_HASH_WITH_STATE(PL_hash_state,PL_hash_chars[256],str,0); } #endif - /* at this point we have initialezed the hash function, and we can start + /* at this point we have initialized the hash function, and we can start * constructing hashes */ PL_hash_seed_set= TRUE; } @@ -356,11 +401,17 @@ perl_construct(pTHXx) hv_ksplit(PL_strtab, 1 << 11); } +#ifdef USE_ITHREADS + PL_compiling.cop_file = NULL; + PL_compiling.cop_warnings = NULL; +#endif + Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*); #ifndef PERL_MICRO # ifdef USE_ENVIRON_ARRAY - PL_origenviron = environ; + if (!PL_origenviron) + PL_origenviron = environ; # endif #endif @@ -410,10 +461,6 @@ perl_construct(pTHXx) /* Start with 1 bucket, for DFS. It's unlikely we'll need more. */ HvMAX(PL_registered_mros) = 0; -#ifdef USE_POSIX_2008_LOCALE - PL_C_locale_obj = newlocale(LC_ALL_MASK, "C", NULL); -#endif - ENTER; init_i18nl10n(1); } @@ -583,9 +630,6 @@ perl_destruct(pTHXx) assert(PL_scopestack_ix == 1); - /* wait for all pseudo-forked children to finish */ - PERL_WAIT_FOR_CHILDREN; - destruct_level = PL_perl_destruct_level; { const char * const s = PerlEnv_getenv("PERL_DESTRUCT_LEVEL"); @@ -624,6 +668,10 @@ perl_destruct(pTHXx) FREETMPS; assert(PL_scopestack_ix == 0); + /* wait for all pseudo-forked children to finish */ + PERL_WAIT_FOR_CHILDREN; + + /* normally when we get here, PL_parser should be null due to having * its original (null) value restored by SAVEt_PARSER during leaving * scope (usually before run-time starts in fact). @@ -884,6 +932,10 @@ perl_destruct(pTHXx) PL_warnhook = NULL; SvREFCNT_dec(PL_diehook); PL_diehook = NULL; + SvREFCNT_dec(PL_hook__require__before); + PL_hook__require__before = NULL; + SvREFCNT_dec(PL_hook__require__after); + PL_hook__require__after = NULL; /* call exit list functions */ while (PL_exitlistlen-- > 0) @@ -896,32 +948,6 @@ perl_destruct(pTHXx) SvREFCNT_dec(PL_registered_mros); - /* jettison our possibly duplicated environment */ - /* if PERL_USE_SAFE_PUTENV is defined environ will not have been copied - * so we certainly shouldn't free it here - */ -#ifndef PERL_MICRO -#if defined(USE_ENVIRON_ARRAY) && !defined(PERL_USE_SAFE_PUTENV) - if (environ != PL_origenviron && !PL_use_safe_putenv -#ifdef USE_ITHREADS - /* only main thread can free environ[0] contents */ - && PL_curinterp == aTHX -#endif - ) - { - I32 i; - - for (i = 0; environ[i]; i++) - safesysfree(environ[i]); - - /* Must use safesysfree() when working with environ. */ - safesysfree(environ); - - environ = PL_origenviron; - } -#endif -#endif /* !PERL_MICRO */ - if (destruct_level == 0) { DEBUG_P(debprofdump()); @@ -1096,29 +1122,44 @@ perl_destruct(pTHXx) Safefree(PL_collation_name); PL_collation_name = NULL; #endif -#if defined(USE_POSIX_2008_LOCALE) \ - && defined(USE_THREAD_SAFE_LOCALE) \ - && ! defined(HAS_QUERYLOCALE) +#if defined(USE_PL_CURLOCALES) for (i = 0; i < (int) C_ARRAY_LENGTH(PL_curlocales); i++) { Safefree(PL_curlocales[i]); PL_curlocales[i] = NULL; } #endif -#ifdef HAS_POSIX_2008_LOCALE +#ifdef USE_POSIX_2008_LOCALE { /* This also makes sure we aren't using a locale object that gets freed * below */ - const locale_t old_locale = uselocale(LC_GLOBAL_LOCALE); - if ( old_locale != LC_GLOBAL_LOCALE -# ifdef USE_POSIX_2008_LOCALE - && old_locale != PL_C_locale_obj -# endif + if ( PL_cur_locale_obj != NULL + && PL_cur_locale_obj != LC_GLOBAL_LOCALE + && PL_cur_locale_obj != PL_C_locale_obj ) { - DEBUG_Lv(PerlIO_printf(Perl_debug_log, - "%s:%d: Freeing %p\n", __FILE__, __LINE__, old_locale)); - freelocale(old_locale); + locale_t cur_locale = uselocale((locale_t) 0); + if (cur_locale == PL_cur_locale_obj) { + uselocale(LC_GLOBAL_LOCALE); + } + + freelocale(PL_cur_locale_obj); + PL_cur_locale_obj = NULL; } } + +# ifdef USE_PL_CUR_LC_ALL + + if (PL_cur_LC_ALL) { + DEBUG_L( PerlIO_printf(Perl_debug_log, "PL_cur_LC_ALL=%p\n", PL_cur_LC_ALL)); + Safefree(PL_cur_LC_ALL); + PL_cur_LC_ALL = NULL; + } + +# endif + + if (PL_scratch_locale_obj) { + freelocale(PL_scratch_locale_obj); + PL_scratch_locale_obj = NULL; + } # ifdef USE_LOCALE_NUMERIC if (PL_underlying_numeric_obj) { DEBUG_Lv(PerlIO_printf(Perl_debug_log, @@ -1134,6 +1175,12 @@ perl_destruct(pTHXx) PL_numeric_name = NULL; SvREFCNT_dec(PL_numeric_radix_sv); PL_numeric_radix_sv = NULL; + SvREFCNT_dec(PL_underlying_radix_sv); + PL_underlying_radix_sv = NULL; +#endif +#ifdef USE_LOCALE_CTYPE + Safefree(PL_ctype_name); + PL_ctype_name = NULL; #endif if (PL_setlocale_buf) { @@ -1146,6 +1193,11 @@ perl_destruct(pTHXx) PL_langinfo_buf = NULL; } + if (PL_stdize_locale_buf) { + Safefree(PL_stdize_locale_buf); + PL_stdize_locale_buf = NULL; + } + #ifdef USE_LOCALE_CTYPE SvREFCNT_dec(PL_warn_locale); PL_warn_locale = NULL; @@ -1216,7 +1268,7 @@ perl_destruct(pTHXx) SvREFCNT_dec(PL_XPosix_ptrs[i]); PL_XPosix_ptrs[i] = NULL; - if (i != _CC_CASED) { /* A copy of Alpha */ + if (i != CC_CASED_) { /* A copy of Alpha */ SvREFCNT_dec(PL_Posix_ptrs[i]); PL_Posix_ptrs[i] = NULL; } @@ -1377,7 +1429,7 @@ perl_destruct(pTHXx) for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) { svend = &sva[SvREFCNT(sva)]; for (sv = sva + 1; sv < svend; ++sv) { - if (SvTYPE(sv) != (svtype)SVTYPEMASK) { + if (!SvIS_FREED(sv)) { PerlIO_printf(Perl_debug_log, "leaked: sv=0x%p" " flags=0x%" UVxf " refcnt=%" UVuf pTHX__FORMAT "\n" @@ -1608,6 +1660,48 @@ Perl_call_atexit(pTHX_ ATEXIT_t fn, void ++PL_exitlistlen; } +#ifdef USE_ENVIRON_ARRAY +static void +dup_environ(pTHX) +{ +# ifdef USE_ITHREADS + if (aTHX != PL_curinterp) + return; +# endif + if (!environ) + return; + + size_t n_entries = 0, vars_size = 0; + + for (char **ep = environ; *ep; ++ep) { + ++n_entries; + vars_size += strlen(*ep) + 1; + } + + /* To save memory, we store both the environ array and its values in a + * single memory block. */ + char **new_environ = (char**)PerlMemShared_malloc( + (sizeof(char*) * (n_entries + 1)) + vars_size + ); + char *vars = (char*)(new_environ + n_entries + 1); + + for (size_t i = 0, copied = 0; n_entries > i; ++i) { + size_t len = strlen(environ[i]) + 1; + new_environ[i] = (char *) CopyD(environ[i], vars + copied, len, char); + copied += len; + } + new_environ[n_entries] = NULL; + + environ = new_environ; + /* Store a pointer in a global variable to ensure it's always reachable so + * LeakSanitizer/Valgrind won't complain about it. We can't ever free it. + * Even if libc allocates a new environ, it's possible that some of its + * values will still be pointing to the old environ. + */ + PL_my_environ = new_environ; +} +#endif + /* =for apidoc perl_parse @@ -1654,16 +1748,13 @@ For historical reasons, the non-zero ret be a suitable value to pass to the C library function C (or to return from C

), to serve as an exit code indicating the nature of the way initialisation terminated. However, this isn't portable, -due to differing exit code conventions. A historical bug is preserved -for the time being: if the Perl built-in C is called during this -function's execution, with a type of exit entailing a zero exit code -under the host operating system's conventions, then this function -returns zero rather than a non-zero value. This bug, [perl #2754], -leads to C being called (and therefore C blocks and the -main program running) despite a call to C. It has been preserved -because a popular module-installing module has come to rely on it and -needs time to be fixed. This issue is [perl #132577], and the original -bug is due to be fixed in Perl 5.30. +due to differing exit code conventions. An attempt is made to return +an exit code of the type required by the host operating system, but +because it is constrained to be non-zero, it is not necessarily possible +to indicate every type of exit. It is only reliable on Unix, where a +zero exit code can be augmented with a set bit that will be ignored. +In any case, this function is not the correct place to acquire an exit +code: one should get that from L. =cut */ @@ -1753,9 +1844,9 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int a } } -#ifndef PERL_USE_SAFE_PUTENV +#ifdef USE_ENVIRON_ARRAY /* Can we grab env area too to be used as the area for $0? */ - if (s && PL_origenviron && !PL_use_safe_putenv) { + if (s && PL_origenviron) { if ((PL_origenviron[0] == s + 1) || (aligned && @@ -1769,8 +1860,11 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int a s = PL_origenviron[0]; while (*s) s++; #endif - my_setenv("NoNe SuCh", NULL); + /* Force copy of environment. */ + if (PL_origenviron == environ) + dup_environ(aTHX); + for (i = 1; PL_origenviron[i]; i++) { if (PL_origenviron[i] == s + 1 || @@ -1788,7 +1882,7 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int a } } } -#endif /* !defined(PERL_USE_SAFE_PUTENV) */ +#endif /* USE_ENVIRON_ARRAY */ PL_origalen = s ? s - PL_origargv[0] + 1 : 0; } @@ -1853,12 +1947,11 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int a ret = STATUS_EXIT; if (ret == 0) { /* - * At this point we should do - * ret = 0x100; - * to avoid [perl #2754], but that bugfix has been postponed - * because of the Module::Install breakage it causes - * [perl #132577]. + * We do this here to avoid [perl #2754]. + * Note this may cause trouble with Module::Install. + * See: [perl #132577]. */ + ret = 0x100; } break; case 3: @@ -1875,6 +1968,7 @@ perl_parse(pTHXx_ XSINIT_t xsinit, int a /* What this returns is subject to change. Use the public interface in Config. */ + static void S_Internals_V(pTHX_ CV *cv) { @@ -1886,15 +1980,26 @@ S_Internals_V(pTHX_ CV *cv) #endif const int entries = 3 + local_patch_count; int i; + /* NOTE - This list must remain sorted. Do not put any settings here + * which affect binary compatibility */ static const char non_bincompat_options[] = # ifdef DEBUGGING " DEBUGGING" # endif +# ifdef HAS_LONG_DOUBLE + " HAS_LONG_DOUBLE" +# endif +# ifdef HAS_STRTOLD + " HAS_STRTOLD" +# endif # ifdef NO_MATHOMS " NO_MATHOMS" # endif -# ifdef NO_HASH_SEED - " NO_HASH_SEED" +# ifdef NO_PERL_INTERNAL_RAND_SEED + " NO_PERL_INTERNAL_RAND_SEED" +# endif +# ifdef NO_PERL_RAND_SEED + " NO_PERL_RAND_SEED" # endif # ifdef NO_TAINT_SUPPORT " NO_TAINT_SUPPORT" @@ -1911,30 +2016,6 @@ S_Internals_V(pTHX_ CV *cv) # ifdef PERL_EXTERNAL_GLOB " PERL_EXTERNAL_GLOB" # endif -# ifdef PERL_HASH_FUNC_SIPHASH - " PERL_HASH_FUNC_SIPHASH" -# endif -# ifdef PERL_HASH_FUNC_SDBM - " PERL_HASH_FUNC_SDBM" -# endif -# ifdef PERL_HASH_FUNC_DJB2 - " PERL_HASH_FUNC_DJB2" -# endif -# ifdef PERL_HASH_FUNC_SUPERFAST - " PERL_HASH_FUNC_SUPERFAST" -# endif -# ifdef PERL_HASH_FUNC_MURMUR3 - " PERL_HASH_FUNC_MURMUR3" -# endif -# ifdef PERL_HASH_FUNC_ONE_AT_A_TIME - " PERL_HASH_FUNC_ONE_AT_A_TIME" -# endif -# ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_HARD - " PERL_HASH_FUNC_ONE_AT_A_TIME_HARD" -# endif -# ifdef PERL_HASH_FUNC_ONE_AT_A_TIME_OLD - " PERL_HASH_FUNC_ONE_AT_A_TIME_OLD" -# endif # ifdef PERL_IS_MINIPERL " PERL_IS_MINIPERL" # endif @@ -1971,6 +2052,7 @@ S_Internals_V(pTHX_ CV *cv) # ifdef PERL_USE_SAFE_PUTENV " PERL_USE_SAFE_PUTENV" # endif + # ifdef PERL_USE_UNSHARED_KEYS_IN_LARGE_HASHES " PERL_USE_UNSHARED_KEYS_IN_LARGE_HASHES" # endif @@ -2004,7 +2086,8 @@ S_Internals_V(pTHX_ CV *cv) # ifdef USE_THREAD_SAFE_LOCALE " USE_THREAD_SAFE_LOCALE" # endif - ; + ""; /* keep this on a line by itself, WITH the empty string */ + PERL_UNUSED_ARG(cv); PERL_UNUSED_VAR(items); @@ -2536,7 +2619,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t SETERRNO(0,SS_NORMAL); if (yyparse(GRAMPROG) || PL_parser->error_count) { - abort_execution("", PL_origfilename); + abort_execution(NULL, PL_origfilename); } CopLINE_set(PL_curcop, 0); SET_CURSTASH(PL_defstash); @@ -2712,6 +2795,14 @@ S_run_body(pTHX_ I32 oldscope) PERL_SET_PHASE(PERL_PHASE_RUN); if (PL_restartop) { +#ifdef DEBUGGING + /* this complements the "EXECUTING..." debug we emit above. + * it will show up when an eval fails in the main program level + * and the code continues after the error. + */ + if (!DEBUG_q_TEST) + PERL_DEBUG(PerlIO_printf(Perl_debug_log, "\nCONTINUING...\n\n")); +#endif PL_restartjmpenv = NULL; PL_op = PL_restartop; PL_restartop = 0; @@ -2761,7 +2852,8 @@ Returns the AV of the specified Perl glo name (so it won't work on lexical variables). C are passed to C. If C is set and the Perl variable does not exist then it will be created. If C is zero -and the variable does not exist then NULL is returned. +(ignoring C) and the variable does not exist then C is +returned. Perl equivalent: C<@{"$name"}>. @@ -2775,7 +2867,7 @@ Perl_get_av(pTHX_ const char *name, I32 PERL_ARGS_ASSERT_GET_AV; - if (flags) + if (flags & ~SVf_UTF8) return GvAVn(gv); if (gv) return GvAV(gv); @@ -2790,7 +2882,8 @@ Perl_get_av(pTHX_ const char *name, I32 Returns the HV of the specified Perl hash. C are passed to C. If C is set and the Perl variable does not exist then it will be created. If C is zero -and the variable does not exist then C is returned. +(ignoring C) and the variable does not exist then C is +returned. =cut */ @@ -2802,7 +2895,7 @@ Perl_get_hv(pTHX_ const char *name, I32 PERL_ARGS_ASSERT_GET_HV; - if (flags) + if (flags & ~SVf_UTF8) return GvHVn(gv); if (gv) return GvHV(gv); @@ -2812,9 +2905,9 @@ Perl_get_hv(pTHX_ const char *name, I32 /* =for apidoc_section $CV -=for apidoc get_cv +=for apidoc get_cv +=for apidoc_item get_cvn_flags =for apidoc_item |CV *|get_cvs|"string"|I32 flags -=for apidoc_item get_cvn_flags These return the CV of the specified Perl subroutine. C are passed to C. If C is set and the Perl subroutine does not @@ -3001,6 +3094,8 @@ Perl_call_sv(pTHX_ SV *sv, volatile I32 if (!(flags & G_NOARGS)) myop.op_flags |= OPf_STACKED; myop.op_flags |= OP_GIMME_REVERSE(flags); + myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB]; + myop.op_type = OP_ENTERSUB; SAVEOP(); PL_op = (OP*)&myop; @@ -3033,13 +3128,11 @@ Perl_call_sv(pTHX_ SV *sv, volatile I32 method_op.op_ppaddr = PL_ppaddr[OP_METHOD]; method_op.op_type = OP_METHOD; } - myop.op_ppaddr = PL_ppaddr[OP_ENTERSUB]; - myop.op_type = OP_ENTERSUB; } if (!(flags & G_EVAL)) { CATCH_SET(TRUE); - CALL_BODY_SUB((OP*)&myop); + CALLRUNOPS(aTHX); retval = PL_stack_sp - (PL_stack_base + oldmark); CATCH_SET(oldcatch); } @@ -3056,7 +3149,7 @@ Perl_call_sv(pTHX_ SV *sv, volatile I32 switch (ret) { case 0: redo_body: - CALL_BODY_SUB((OP*)&myop); + CALLRUNOPS(aTHX); retval = PL_stack_sp - (PL_stack_base + oldmark); if (!(flags & G_KEEPERR)) { CLEAR_ERRSV(); @@ -3146,6 +3239,9 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags) SAVEOP(); PL_op = (OP*)&myop; Zero(&myop, 1, UNOP); + myop.op_ppaddr = PL_ppaddr[OP_ENTEREVAL]; + myop.op_type = OP_ENTEREVAL; + { dSP; oldmark = SP - PL_stack_base; @@ -3161,8 +3257,9 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags) if (flags & G_KEEPERR) myop.op_flags |= OPf_SPECIAL; + myop.op_private = (OPpEVAL_EVALSV); /* tell pp_entereval we're the caller */ if (flags & G_RE_REPARSING) - myop.op_private = (OPpEVAL_COPHH | OPpEVAL_RE_REPARSING); + myop.op_private |= (OPpEVAL_COPHH | OPpEVAL_RE_REPARSING); /* fail now; otherwise we could fail after the JMPENV_PUSH but * before a cx_pusheval(), which corrupts the stack after a croak */ @@ -3171,13 +3268,22 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags) JMPENV_PUSH(ret); switch (ret) { case 0: - redo_body: - if (PL_op == (OP*)(&myop)) { - PL_op = PL_ppaddr[OP_ENTEREVAL](aTHX); - if (!PL_op) - goto fail; /* failed in compilation */ - } CALLRUNOPS(aTHX); + if (!*PL_stack_sp) { + /* In the presence of the OPpEVAL_EVALSV flag, + * pp_entereval() pushes a NULL pointer onto the stack to + * indicate compilation failure. Otherwise, the top slot on + * the stack will be a non-NULL pointer to whatever scalar or + * list value(s) the eval returned. In void context it will + * be whatever our caller has at the top of stack at the time, + * or the &PL_sv_undef guard at PL_stack_base[0]. Note that + * NULLs are not pushed on the stack except in a few very + * specific circumstances (such as this) to flag something + * special. */ + PL_stack_sp--; + goto fail; + } + redone_body: retval = PL_stack_sp - (PL_stack_base + oldmark); if (!(flags & G_KEEPERR)) { CLEAR_ERRSV(); @@ -3198,14 +3304,19 @@ Perl_eval_sv(pTHX_ SV *sv, I32 flags) PL_restartjmpenv = NULL; PL_op = PL_restartop; PL_restartop = 0; - goto redo_body; + CALLRUNOPS(aTHX); + goto redone_body; } fail: if (flags & G_RETHROW) { JMPENV_POP; croak_sv(ERRSV); } - + /* Should be nothing left in stack frame apart from a possible + * scalar context undef. Assert it's safe to reset the stack */ + assert( PL_stack_sp == PL_stack_base + oldmark + || (PL_stack_sp == PL_stack_base + oldmark + 1 + && *PL_stack_sp == &PL_sv_undef)); PL_stack_sp = PL_stack_base + oldmark; if ((flags & G_WANT) == G_LIST) retval = 0; @@ -3306,6 +3417,7 @@ S_usage(pTHX) /* XXX move this out into " -E commandline like -e, but enables all optional features\n" " -f don't do $sitelib/sitecustomize.pl at startup\n" " -F/pattern/ split() pattern for -a switch (//'s are optional)\n" +" -g read all input in one go (slurp), rather than line-by-line (alias for -0777)\n" " -i[extension] edit <> files in place (makes backup if extension supplied)\n" " -Idirectory specify @INC/#include directory (several -I's allowed)\n", " -l[octnum] enable line ending processing, specifies line terminator\n" @@ -3390,7 +3502,7 @@ Perl_get_debug_opts(pTHX_ const char **s * If there is a free slot available marked with '?' feel * free to reuse it for something else. * - * Regardles remember to update DEBUG_MASK in perl.h, and + * Regardless remember to update DEBUG_MASK in perl.h, and * update the documentation above AND in pod/perlrun.pod. * * Note that the ? indicates an unused slot. As the code below @@ -3464,8 +3576,8 @@ Perl_moreswitches(pTHX_ const char *s) numlen = 0; s--; } - PL_rs = newSVpvs(""); - tmps = (U8*) SvGROW(PL_rs, (STRLEN)(UVCHR_SKIP(rschar) + 1)); + PL_rs = newSV((STRLEN)(UVCHR_SKIP(rschar) + 1)); + tmps = (U8*)SvPVCLEAR_FRESH(PL_rs); uvchr_to_utf8(tmps, rschar); SvCUR_set(PL_rs, UVCHR_SKIP(rschar)); SvUTF8_on(PL_rs); @@ -3495,9 +3607,12 @@ Perl_moreswitches(pTHX_ const char *s) PL_minus_a = TRUE; PL_minus_F = TRUE; PL_minus_n = TRUE; - PL_splitstr = ++s; - while (*s && !isSPACE(*s)) ++s; - PL_splitstr = savepvn(PL_splitstr, s - PL_splitstr); + { + const char *start = ++s; + while (*s && !isSPACE(*s)) ++s; + Safefree(PL_splitstr); + PL_splitstr = savepvn(start, s - start); + } return s; case 'a': PL_minus_a = TRUE; @@ -3738,12 +3853,12 @@ Perl_moreswitches(pTHX_ const char *s) return s; case 'W': PL_dowarn = G_WARN_ALL_ON|G_WARN_ON; - free_and_set_cop_warnings(&PL_compiling, pWARN_ALL); + free_and_set_cop_warnings(&PL_compiling, pWARN_ALL); s++; return s; case 'X': PL_dowarn = G_WARN_ALL_OFF; - free_and_set_cop_warnings(&PL_compiling, pWARN_NONE); + free_and_set_cop_warnings(&PL_compiling, pWARN_NONE); s++; return s; case '*': @@ -4572,7 +4687,7 @@ S_init_postdump_symbols(pTHX_ int argc, hv = GvHVn(PL_envgv); hv_magic(hv, NULL, PERL_MAGIC_env); #ifndef PERL_MICRO -#ifdef USE_ENVIRON_ARRAY +#if defined(USE_ENVIRON_ARRAY) || defined(WIN32) /* Note that if the supplied env parameter is actually a copy of the global environ then it may now point to free'd memory if the environment has been modified since. To avoid this @@ -4708,16 +4823,7 @@ S_init_perllib(pTHX) if (!TAINTING_get) { #ifndef VMS perl5lib = PerlEnv_getenv("PERL5LIB"); -/* - * It isn't possible to delete an environment variable with - * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that - * case we treat PERL5LIB as undefined if it has a zero-length value. - */ -#if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV) if (perl5lib && *perl5lib != '\0') -#else - if (perl5lib) -#endif incpush_use_sep(perl5lib, 0, INCPUSH_ADD_SUB_DIRS); else { s = PerlEnv_getenv("PERLLIB"); @@ -5217,6 +5323,19 @@ Perl_my_exit(pTHX_ U32 status) } my_exit_jump(); } + +/* +=for apidoc my_failure_exit + +Exit the running Perl process with an error. + +On non-VMS platforms, this is essentially equivalent to L>, using +C, but forces an en error code of 255 if C is 0. + +On VMS, it takes care to set the appropriate severity bits in the exit status. + +=cut +*/ void Perl_my_failure_exit(pTHX) Index: gnu/usr.bin/perl/perl.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perl.h,v diff -u -p -a -u -p -r1.28 perl.h --- gnu/usr.bin/perl/perl.h 15 Feb 2023 01:36:13 -0000 1.28 +++ gnu/usr.bin/perl/perl.h 21 Feb 2024 15:47:02 -0000 @@ -11,6 +11,22 @@ #ifndef H_PERL #define H_PERL 1 +#if defined(__HP_cc) || defined(__HP_aCC) +/* The HPUX compiler for Itanium is very picky and warns about + * things that gcc doesn't and that we would prefer it does not. + * So on that platform silence certain warnings unlaterally. */ + +/* silence "relational operator ">" always evaluates to 'false'" + * warnings. We get a LOT of these from the memwrap checks. */ +#pragma diag_suppress 4276 + +/* silence "may cause misaligned access" warnings from our "OO in C" + * type logic. we do this a lot and if it was broken we would fail tests + * all over the place */ +#pragma diag_suppress 4232 + +#endif /* end HPUX warning disablement */ + #ifdef PERL_FOR_X2P /* * This file is being used for x2p stuff. @@ -30,7 +46,7 @@ /* =for apidoc_section $debugging -=for apidoc CmnW ||_aDEPTH +=for apidoc CmnW ||comma_aDEPTH Some functions when compiled under DEBUGGING take an extra final argument named C, indicating the C stack depth. This argument is omitted otherwise. This macro expands to either S> under DEBUGGING, or to nothing at @@ -38,20 +54,32 @@ all when not under DEBUGGING, reducing t The program is responsible for maintaining the correct value for C. -=for apidoc CyW ||_pDEPTH -This is used in the prototype declarations for functions that take a L> +=for apidoc CyW ||comma_pDEPTH +This is used in the prototype declarations for functions that take a L> final parameter, much like L|perlguts/Background and MULTIPLICITY> is used in functions that take a thread context initial parameter. +=for apidoc CmnW ||debug_aDEPTH +Same as L> but with no leading argument. Intended for functions with +no normal arguments, and used by L> itself. + +=for apidoc CmnW ||debug_pDEPTH +Same as L> but with no leading argument. Intended for functions with +no normal arguments, and used by L> itself. + =cut */ #ifdef DEBUGGING -# define _pDEPTH ,U32 depth -# define _aDEPTH ,depth -#else -# define _pDEPTH -# define _aDEPTH +# define debug_pDEPTH U32 depth +# define comma_pDEPTH ,debug_pDEPTH +# define debug_aDEPTH depth +# define comma_aDEPTH ,debug_aDEPTH +#else +# define debug_aDEPTH +# define comma_aDEPTH +# define debug_pDEPTH +# define comma_pDEPTH #endif /* NOTE 1: that with gcc -std=c89 the __STDC_VERSION__ is *not* defined @@ -79,14 +107,18 @@ is used in functions that take a thread #endif /* PERL_IMPLICIT_CONTEXT is a legacy synonym for MULTIPLICITY */ -#ifdef MULTIPLICITY -# ifndef PERL_IMPLICIT_CONTEXT -# define PERL_IMPLICIT_CONTEXT -# endif +#if defined(MULTIPLICITY) \ + && ! defined(PERL_CORE) \ + && ! defined(PERL_IMPLICIT_CONTEXT) +# define PERL_IMPLICIT_CONTEXT #endif #if defined(PERL_IMPLICIT_CONTEXT) && !defined(MULTIPLICITY) # define MULTIPLICITY #endif +#if defined(PERL_CORE) && defined(PERL_IMPLICIT_CONTEXT) +# pragma message("PERL_IMPLICIT_CONTEXT was removed from core perl. It does not do anything. Undeffing it for compilation") +# undef PERL_IMPLICIT_CONTEXT +#endif /* undef WIN32 when building on Cygwin (for libwin32) - gph */ #ifdef __CYGWIN__ @@ -364,6 +396,9 @@ Now a no-op. # if PERL_GCC_VERSION_GE(4,7,0) # define HASATTRIBUTE_ALWAYS_INLINE # endif +# if PERL_GCC_VERSION_GE(3,3,0) +# define HASATTRIBUTE_VISIBILITY +# endif # endif #endif /* #ifndef PERL_MICRO */ @@ -397,6 +432,14 @@ Now a no-op. # define __attribute__always_inline__ __attribute__((always_inline)) # endif #endif +#if defined(HASATTRIBUTE_VISIBILITY) && !defined(_WIN32) && !defined(__CYGWIN__) +/* On Windows instead of this, we use __declspec(dllexport) and a .def file + * Cygwin works by exporting every global symbol, see the definition of ldflags + * near the end of hints/cygwin.sh and the visibility attribute doesn't appear + * to control that. + */ +# define __attribute__visibility__(x) __attribute__((visibility(x))) +#endif /* If we haven't defined the attributes yet, define them to blank. */ #ifndef __attribute__deprecated__ @@ -426,6 +469,9 @@ Now a no-op. #ifndef __attribute__always_inline__ # define __attribute__always_inline__ #endif +#ifndef __attribute__visibility__ +# define __attribute__visibility__(x) +#endif /* Some OS warn on NULL format to printf */ #ifdef PRINTF_FORMAT_NULL_OK @@ -443,7 +489,9 @@ Now a no-op. * marking unused variables (they need e.g. a #pragma) and therefore * cpp macros like PERL_UNUSED_DECL cannot work for this purpose, even * if it were PERL_UNUSED_DECL(x), which it cannot be (see above). +*/ +/* =for apidoc_section $directives =for apidoc AmnU||PERL_UNUSED_DECL Tells the compiler that the parameter in the function prototype just before it @@ -462,7 +510,7 @@ Example usage: =back =cut - */ +*/ #ifndef PERL_UNUSED_DECL # define PERL_UNUSED_DECL __attribute__unused__ @@ -472,25 +520,26 @@ Example usage: * for silencing unused variables that are actually used most of the time, * but we cannot quite get rid of, such as "ax" in PPCODE+noargs xsubs, * or variables/arguments that are used only in certain configurations. - -=for apidoc Ams||PERL_UNUSED_ARG|void x + */ +/* +=for apidoc Am;||PERL_UNUSED_ARG|void x This is used to suppress compiler warnings that a parameter to a function is not used. This situation can arise, for example, when a parameter is needed under some configuration conditions, but not others, so that C preprocessor -conditional compilation causes it be used just some times. +conditional compilation causes it be used just sometimes. -=for apidoc Amns||PERL_UNUSED_CONTEXT +=for apidoc Amn;||PERL_UNUSED_CONTEXT This is used to suppress compiler warnings that the thread context parameter to a function is not used. This situation can arise, for example, when a C preprocessor conditional compilation causes it be used just some times. -=for apidoc Ams||PERL_UNUSED_VAR|void x +=for apidoc Am;||PERL_UNUSED_VAR|void x This is used to suppress compiler warnings that the variable I is not used. This situation can arise, for example, when a C preprocessor conditional compilation causes it be used just some times. =cut - */ +*/ #ifndef PERL_UNUSED_ARG # define PERL_UNUSED_ARG(x) ((void)sizeof(x)) #endif @@ -546,7 +595,7 @@ and use C> on that. =cut The __typeof__() is used instead of typeof() since typeof() is not -available under strict C89, and because of compilers masquerading +available under strict ISO C, and because of compilers masquerading as gcc (clang and icc), we want exactly the gcc extension __typeof__ and nothing else. @@ -625,18 +674,18 @@ __typeof__ and nothing else. #define MSVC_DIAG_RESTORE_STMT MSVC_DIAG_RESTORE NOOP /* -=for apidoc Amns||NOOP +=for apidoc Amn;||NOOP Do nothing; typically used as a placeholder to replace something that used to do something. -=for apidoc Amns||dNOOP +=for apidoc Amn;||dNOOP Declare nothing; typically used as a placeholder to replace something that used to declare something. Works on compilers that require declarations before any code. =cut */ -#define NOOP /*EMPTY*/(void)0 +#define NOOP ((void)0) #define dNOOP struct Perl___notused_struct #ifndef pTHX @@ -668,7 +717,7 @@ code. This is now a synonym for dNOOP: declare nothing =for apidoc_section $XS -=for apidoc Amns||dMY_CXT_SV +=for apidoc Amn;||dMY_CXT_SV Now a placeholder that declares nothing =cut @@ -717,28 +766,60 @@ Now a placeholder that declares nothing /* =for apidoc_section $directives -=for apidoc AmnUu|void|STMT_START -=for apidoc_item ||STMT_END +=for apidoc AmnUu|void|STMT_END +=for apidoc_item | |STMT_START -This allows a series of statements in a macro to be used as a single statement, +These allow a series of statements in a macro to be used as a single statement, as in if (x) STMT_START { ... } STMT_END else ... -Note that you can't return a value out of them, which limits their utility. -But see C>. +Note that you can't return a value out of this construct and cannot use it as +an operand to the comma operator. These limit its utility. + +But, a value could be returned by constructing the API so that a pointer is +passed and the macro dereferences this to set the return. If the value can be +any of various types, depending on context, you can handle that situation in +some situations by adding the type of the return as an extra accompanying +parameter: + + #define foo(param, type) STMT_START { + type * param; *param = do_calc; ... + } STMT_END + +This could be awkward, so consider instead using a C language C +function. + +If you do use this construct, it is easy to forget that it is a macro and not a +function, and hence fall into traps that might not show up until someone +someday writes code which contains names that clash with the ones you chose +here, or calls it with a parameter which is an expression with side effects, +the consequences of which you didn't think about. See L for how to avoid these. -=for apidoc AmnuU|bool|PERL_USE_GCC_BRACE_GROUPS +=for apidoc_section $genconfig +=for apidoc Amn#||PERL_USE_GCC_BRACE_GROUPS This C pre-processor value, if defined, indicates that it is permissible to use -the GCC brace groups extension. This extension, of the form +the GCC brace groups extension. However, use of this extension is DISCOURAGED. +Use a C function instead. + +The extension, of the form ({ statement ... }) -turns the block consisting of I into an expression with a +turns the block consisting of I into an expression with a value, unlike plain C language blocks. This can present optimization -possibilities, B you generally need to specify an alternative in case this -ability doesn't exist or has otherwise been forbidden. +possibilities, B, unless you know for sure that this will never be +compiled without this extension being available and not forbidden, you need to +specify an alternative. Thus two code paths have to be maintained, which can +get out-of-sync. All these issues are solved by using a C +function instead. + +Perl can be configured to not use this feature by passing the parameter +C<-Accflags=-DPERL_GCC_BRACE_GROUPS_FORBIDDEN> to F. + +=for apidoc Amnh#||PERL_GCC_BRACE_GROUPS_FORBIDDEN Example usage: @@ -765,10 +846,19 @@ Example usage: # define BYTEORDER 0x1234 #endif +/* +=for apidoc_section $genconfig +=for apidoc Amn#||ASCIIish + +A preprocessor symbol that is defined iff the system is an ASCII platform; this +symbol would not be defined on C> platforms. + +=cut +*/ #if 'A' == 65 && 'I' == 73 && 'J' == 74 && 'Z' == 90 -#define ASCIIish +# define ASCIIish #else -#undef ASCIIish +# undef ASCIIish #endif /* @@ -961,6 +1051,13 @@ violations are fatal. # endif #endif +/* This define exists only for compatibility. It used to mean "my_setenv and + * friends should use setenv/putenv, instead of manipulating environ directly", + * which is now always the case. It's still defined to prevent XS modules from + * using the no longer existing PL_use_safe_putenv variable. + */ +#define PERL_USE_SAFE_PUTENV + /* HP-UX 10.X CMA (Common Multithreaded Architecture) insists that pthread.h must be included before all other header files. */ @@ -1000,6 +1097,12 @@ violations are fatal. # include #endif +#include "perl_langinfo.h" /* Needed for _NL_LOCALE_NAME */ + +/* ========================================================================= + * The defines from here to the following ===== line are unfortunately + * duplicated in makedef.pl, and changes here MUST also be made there */ + /* If not forbidden, we enable locale handling if either 1) the POSIX 2008 * functions are available, or 2) just the setlocale() function. This logic is * repeated in t/loc_tools.pl and makedef.pl; The three should be kept in @@ -1061,6 +1164,9 @@ violations are fatal. # if !defined(NO_LOCALE_TELEPHONE) && defined(LC_TELEPHONE) # define USE_LOCALE_TELEPHONE # endif +# if !defined(NO_LOCALE_NAME) && defined(LC_NAME) +# define USE_LOCALE_NAME +# endif # if !defined(NO_LOCALE_SYNTAX) && defined(LC_SYNTAX) # define USE_LOCALE_SYNTAX # endif @@ -1068,38 +1174,205 @@ violations are fatal. # define USE_LOCALE_TOD # endif -/* XXX The next few defines are unfortunately duplicated in makedef.pl, and - * changes here MUST also be made there */ +/* Now create LC_foo_INDEX_ #defines for just those categories on this system */ +# ifdef USE_LOCALE_CTYPE +# define LC_CTYPE_INDEX_ 0 +# define PERL_DUMMY_CTYPE_ LC_CTYPE_INDEX_ +# else +# define PERL_DUMMY_CTYPE_ -1 +# endif +# ifdef USE_LOCALE_NUMERIC +# define LC_NUMERIC_INDEX_ PERL_DUMMY_CTYPE_ + 1 +# define PERL_DUMMY_NUMERIC_ LC_NUMERIC_INDEX_ +# else +# define PERL_DUMMY_NUMERIC_ PERL_DUMMY_CTYPE_ +# endif +# ifdef USE_LOCALE_COLLATE +# define LC_COLLATE_INDEX_ PERL_DUMMY_NUMERIC_ + 1 +# define PERL_DUMMY_COLLATE_ LC_COLLATE_INDEX_ +# else +# define PERL_DUMMY_COLLATE_ PERL_DUMMY_NUMERIC_ +# endif +# ifdef USE_LOCALE_TIME +# define LC_TIME_INDEX_ PERL_DUMMY_COLLATE_ + 1 +# define PERL_DUMMY_TIME_ LC_TIME_INDEX_ +# else +# define PERL_DUMMY_TIME_ PERL_DUMMY_COLLATE_ +# endif +# ifdef USE_LOCALE_MESSAGES +# define LC_MESSAGES_INDEX_ PERL_DUMMY_TIME_ + 1 +# define PERL_DUMMY_MESSAGES_ LC_MESSAGES_INDEX_ +# else +# define PERL_DUMMY_MESSAGES_ PERL_DUMMY_TIME_ +# endif +# ifdef USE_LOCALE_MONETARY +# define LC_MONETARY_INDEX_ PERL_DUMMY_MESSAGES_ + 1 +# define PERL_DUMMY_MONETARY_ LC_MONETARY_INDEX_ +# else +# define PERL_DUMMY_MONETARY_ PERL_DUMMY_MESSAGES_ +# endif +# ifdef USE_LOCALE_ADDRESS +# define LC_ADDRESS_INDEX_ PERL_DUMMY_MONETARY_ + 1 +# define PERL_DUMMY_ADDRESS_ LC_ADDRESS_INDEX_ +# else +# define PERL_DUMMY_ADDRESS_ PERL_DUMMY_MONETARY_ +# endif +# ifdef USE_LOCALE_IDENTIFICATION +# define LC_IDENTIFICATION_INDEX_ PERL_DUMMY_ADDRESS_ + 1 +# define PERL_DUMMY_IDENTIFICATION_ LC_IDENTIFICATION_INDEX_ +# else +# define PERL_DUMMY_IDENTIFICATION_ PERL_DUMMY_ADDRESS_ +# endif +# ifdef USE_LOCALE_MEASUREMENT +# define LC_MEASUREMENT_INDEX_ PERL_DUMMY_IDENTIFICATION_ + 1 +# define PERL_DUMMY_MEASUREMENT_ LC_MEASUREMENT_INDEX_ +# else +# define PERL_DUMMY_MEASUREMENT_ PERL_DUMMY_IDENTIFICATION_ +# endif +# ifdef USE_LOCALE_PAPER +# define LC_PAPER_INDEX_ PERL_DUMMY_MEASUREMENT_ + 1 +# define PERL_DUMMY_PAPER_ LC_PAPER_INDEX_ +# else +# define PERL_DUMMY_PAPER_ PERL_DUMMY_MEASUREMENT_ +# endif +# ifdef USE_LOCALE_TELEPHONE +# define LC_TELEPHONE_INDEX_ PERL_DUMMY_PAPER_ + 1 +# define PERL_DUMMY_TELEPHONE_ LC_TELEPHONE_INDEX_ +# else +# define PERL_DUMMY_TELEPHONE_ PERL_DUMMY_PAPER_ +# endif +# ifdef USE_LOCALE_NAME +# define LC_NAME_INDEX_ PERL_DUMMY_TELEPHONE_ + 1 +# define PERL_DUMMY_NAME_ LC_NAME_INDEX_ +# else +# define PERL_DUMMY_NAME_ PERL_DUMMY_TELEPHONE_ +# endif +# ifdef USE_LOCALE_SYNTAX +# define LC_SYNTAX_INDEX_ PERL_DUMMY_NAME + 1 +# define PERL_DUMMY_SYNTAX_ LC_SYNTAX_INDEX_ +# else +# define PERL_DUMMY_SYNTAX_ PERL_DUMMY_NAME_ +# endif +# ifdef USE_LOCALE_TOD +# define LC_TOD_INDEX_ PERL_DUMMY_SYNTAX_ + 1 +# define PERL_DUMMY_TOD_ LC_TOD_INDEX_ +# else +# define PERL_DUMMY_TOD_ PERL_DUMMY_SYNTAX_ +# endif +# ifdef LC_ALL +# define LC_ALL_INDEX_ PERL_DUMMY_TOD_ + 1 +# endif -# if ! defined(HAS_SETLOCALE) && defined(HAS_POSIX_2008_LOCALE) -# define USE_POSIX_2008_LOCALE -# ifndef USE_THREAD_SAFE_LOCALE -# define USE_THREAD_SAFE_LOCALE -# endif - /* If compiled with - * -DUSE_THREAD_SAFE_LOCALE, will do so even - * on unthreaded builds */ -# elif (defined(USE_ITHREADS) || defined(USE_THREAD_SAFE_LOCALE)) \ - && ( defined(HAS_POSIX_2008_LOCALE) \ - || (defined(WIN32) && defined(_MSC_VER))) \ - && ! defined(NO_THREAD_SAFE_LOCALE) -# ifndef USE_THREAD_SAFE_LOCALE + +# if defined(USE_ITHREADS) && ! defined(NO_LOCALE_THREADS) +# define USE_LOCALE_THREADS +# endif + + /* Use POSIX 2008 locales if available, and no alternative exists + * ('setlocale()' is the alternative); or is threaded and not forbidden to + * use them */ +# if defined(HAS_POSIX_2008_LOCALE) && ( ! defined(HAS_SETLOCALE) \ + || ( defined(USE_LOCALE_THREADS) \ + && ! defined(NO_POSIX_2008_LOCALE))) +# define USE_POSIX_2008_LOCALE +# endif + + /* On threaded builds, use thread-safe locales if they are available and not + * forbidden. Availability is when we are using POSIX 2008 locales, or + * Windows for quite a few releases now. */ +# if defined(USE_LOCALE_THREADS) && ! defined(NO_THREAD_SAFE_LOCALE) +# if defined(USE_POSIX_2008_LOCALE) || (defined(WIN32) && defined(_MSC_VER)) # define USE_THREAD_SAFE_LOCALE # endif -# ifdef HAS_POSIX_2008_LOCALE -# define USE_POSIX_2008_LOCALE +# endif + +# include "perl_langinfo.h" /* Needed for _NL_LOCALE_NAME */ + +# ifdef USE_POSIX_2008_LOCALE +# if defined(HAS_QUERYLOCALE) \ + /* Use querylocale if has it, or has the glibc internal \ + * undocumented equivalent. */ \ + || ( defined(_NL_LOCALE_NAME) \ + /* And asked for */ \ + && defined(USE_NL_LOCALE_NAME) \ + /* nl_langinfo_l almost certainly will exist on systems that \ + * have _NL_LOCALE_NAME, so there is nothing lost by \ + * requiring it instead of also allowing plain nl_langinfo(). \ + * And experience indicates that its glibc implementation is \ + * thread-safe, eliminating code complications */ \ + && defined(HAS_NL_LANGINFO_L) \ + /* On systems that accept any locale name, the real \ + * underlying locale is often returned by this internal \ + * item, so we can't use it */ \ + && ! defined(SETLOCALE_ACCEPTS_ANY_LOCALE_NAME)) +# define USE_QUERYLOCALE # endif # endif + + /* POSIX 2008 has no means of finding out the current locale without a + * querylocale; so must keep track of it ourselves */ +# if (defined(USE_POSIX_2008_LOCALE) && ! defined(USE_QUERYLOCALE)) +# define USE_PL_CURLOCALES +# define USE_PL_CUR_LC_ALL +# endif + +# if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE) + + /* We need to be able to map the current value of what the tTHX context + * thinks LC_ALL is so as to inform the Windows libc when switching + * contexts. */ +# define USE_PL_CUR_LC_ALL + + /* Microsoft documentation reads in the change log for VS 2015: "The + * localeconv function declared in locale.h now works correctly when + * per-thread locale is enabled. In previous versions of the library, this + * function would return the lconv data for the global locale, not the + * thread's locale." */ +# if _MSC_VER < 1900 +# define TS_W32_BROKEN_LOCALECONV +# endif +# endif + + /* POSIX 2008 and Windows with thread-safe locales keep locale information + * in libc data. Therefore we must inform their libc's when the context + * switches */ +# if defined(MULTIPLICITY) && ( defined(USE_POSIX_2008_LOCALE) \ + || ( defined(WIN32) \ + && defined(USE_THREAD_SAFE_LOCALE))) +# define USE_PERL_SWITCH_LOCALE_CONTEXT +# endif #endif -/* Microsoft documentation reads in the change log for VS 2015: - * "The localeconv function declared in locale.h now works correctly when - * per-thread locale is enabled. In previous versions of the library, this - * function would return the lconv data for the global locale, not the - * thread's locale." - */ -#if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE) && _MSC_VER < 1900 -# define TS_W32_BROKEN_LOCALECONV +/* end of makedef.pl logic duplication + * ========================================================================= */ + +#ifdef PERL_CORE + +/* Both typedefs are used in locale.c only, but defined here so that embed.fnc + * can generate the proper prototypes. */ + +typedef enum { + DONT_RECALC_LC_ALL, + YES_RECALC_LC_ALL, + + /* Used in tight loops through all sub-categories, where LC_ALL won't be + * fully known until all subcategories are handled. */ + RECALCULATE_LC_ALL_ON_FINAL_INTERATION +} recalc_lc_all_t; + + +typedef enum { /* Is the locale UTF8? */ + LOCALE_NOT_UTF8, + LOCALE_IS_UTF8, + LOCALE_UTF8NESS_UNKNOWN +} locale_utf8ness_t; + +typedef struct { + const char *name; + size_t offset; +} lconv_offset_t; + + #endif #include @@ -1158,7 +1431,9 @@ EXTERN_C int usleep(unsigned int); /* Macros for correct constant construction. These are in C99 * (so they will not be available in strict C89 mode), but they are nice, so - * let's define them if necessary. + * let's define them if necessary. */ + +/* =for apidoc_section $integer =for apidoc Am|I16|INT16_C|number =for apidoc_item |I32|INT32_C|number @@ -1372,6 +1647,32 @@ Use L to declare variables of the m #define MEM_SIZE Size_t +/* av_extend and analogues enforce a minimum number of array elements. + * This has been 4 elements (so a minimum key size of 3) for a long + * time, but the rationale behind this seems to have been lost to the + * mists of time. */ +#ifndef PERL_ARRAY_NEW_MIN_KEY +#define PERL_ARRAY_NEW_MIN_KEY 3 +#endif + +/* Functions like Perl_sv_grow mandate a minimum string size. + * This was 10 bytes for a long time, the rationale for which seems lost + * to the mists of time. However, this does not correlate to what modern + * malloc implementations will actually return, in particular the fact + * that chunks are almost certainly some multiple of pointer size. The + * default has therefore been revised to a more useful approximation. + * Notes: The following is specifically conservative for 64 bit, since + * most dlmalloc derivatives seem to serve a 3xPTRSIZE minimum chunk, + * so the below perhaps should be: + * ((PTRSIZE == 4) ? 12 : 24) + * Configure probes for malloc_good_size, malloc_actual_size etc. + * could be revised to record the actual minimum chunk size, to which + * PERL_STRLEN_NEW_MIN could then be set. + */ +#ifndef PERL_STRLEN_NEW_MIN +#define PERL_STRLEN_NEW_MIN ((PTRSIZE == 4) ? 12 : 16) +#endif + /* Round all values passed to malloc up, by default to a multiple of sizeof(size_t) */ @@ -1444,10 +1745,12 @@ Use L to declare variables of the m if (newval) { \ PERL_UNUSED_RESULT(panic_write2("panic: tainting with $ENV{PERL_MALLOC_OPT}\n"));\ exit(1); }) -# define MALLOC_CHECK_TAINT(argc,argv,env) STMT_START { \ - if (doing_taint(argc,argv,env)) { \ - MallocCfg_ptr[MallocCfg_skip_cfg_env] = 1; \ - }} STMT_END; +# define MALLOC_CHECK_TAINT(argc,argv,env) \ + STMT_START { \ + if (doing_taint(argc,argv,env)) { \ + MallocCfg_ptr[MallocCfg_skip_cfg_env] = 1; \ + } \ + } STMT_END; #else /* MYMALLOC */ # define safemalloc safesysmalloc # define safecalloc safesyscalloc @@ -2014,7 +2317,7 @@ my_snprintf() #define PERL_SNPRINTF_CHECK(len, max, api) STMT_START { if ((max) > 0 && (Size_t)len > (max)) Perl_croak_nocontext("panic: %s buffer overflow", STRINGIFY(api)); } STMT_END -#ifdef USE_QUADMATH +#if defined(USE_LOCALE_NUMERIC) || defined(USE_QUADMATH) # define my_snprintf Perl_my_snprintf # define PERL_MY_SNPRINTF_GUARDED #elif defined(HAS_SNPRINTF) && defined(HAS_C99_VARIADIC_MACROS) && !(defined(DEBUGGING) && !defined(PERL_USE_GCC_BRACE_GROUPS)) && !defined(PERL_GCC_PEDANTIC) @@ -2031,9 +2334,16 @@ my_snprintf() /* There is no quadmath_vsnprintf, and therefore my_vsnprintf() * dies if called under USE_QUADMATH. */ -#if defined(HAS_VSNPRINTF) && defined(HAS_C99_VARIADIC_MACROS) && !(defined(DEBUGGING) && !defined(PERL_USE_GCC_BRACE_GROUPS)) && !defined(PERL_GCC_PEDANTIC) +#if ! defined(USE_LOCALE_NUMERIC) \ + && defined(HAS_VSNPRINTF) \ + && defined(HAS_C99_VARIADIC_MACROS) \ + && ! (defined(DEBUGGING) && ! defined(PERL_USE_GCC_BRACE_GROUPS)) \ + && ! defined(PERL_GCC_PEDANTIC) # ifdef PERL_USE_GCC_BRACE_GROUPS -# define my_vsnprintf(buffer, max, ...) ({ int len = vsnprintf(buffer, max, __VA_ARGS__); PERL_SNPRINTF_CHECK(len, max, vsnprintf); len; }) +# define my_vsnprintf(buffer, max, ...) \ + ({ int len = vsnprintf(buffer, max, __VA_ARGS__); \ + PERL_SNPRINTF_CHECK(len, max, vsnprintf); \ + len; }) # define PERL_MY_VSNPRINTF_GUARDED # else # define my_vsnprintf(buffer, max, ...) vsnprintf(buffer, max, __VA_ARGS__) @@ -2418,7 +2728,7 @@ extern long double Perl_my_frexpl(long d # define Perl_ldexp(x, y) ldexpq(x,y) # define Perl_isinf(x) isinfq(x) # define Perl_isnan(x) isnanq(x) -# define Perl_isfinite(x) !(isnanq(x) || isinfq(x)) +# define Perl_isfinite(x) (!(isnanq(x) || isinfq(x))) # define Perl_fp_class(x) ((x) == 0.0Q ? 0 : isinfq(x) ? 3 : isnanq(x) ? 4 : PERL_ABS(x) < FLT128_MIN ? 2 : 1) # define Perl_fp_class_inf(x) (Perl_fp_class(x) == 3) # define Perl_fp_class_nan(x) (Perl_fp_class(x) == 4) @@ -2745,7 +3055,7 @@ extern long double Perl_my_frexpl(long d #ifndef Perl_isinf # if defined(Perl_isfinite) && defined(Perl_isnan) -# define Perl_isinf(x) !(Perl_isfinite(x)||Perl_isnan(x)) +# define Perl_isinf(x) (!(Perl_isfinite(x)||Perl_isnan(x))) # endif #endif @@ -2762,15 +3072,20 @@ extern long double Perl_my_frexpl(long d # elif defined(HAS_FINITEL) # define Perl_isfinitel(x) finitel(x) # elif defined(HAS_ISINFL) && defined(HAS_ISNANL) -# define Perl_isfinitel(x) !(isinfl(x)||isnanl(x)) +# define Perl_isfinitel(x) (!(isinfl(x)||isnanl(x))) # else # define Perl_isfinitel(x) ((x) * 0 == 0) /* See Perl_isfinite. */ # endif #endif /* The default is to use Perl's own atof() implementation (in numeric.c). - * Usually that is the one to use but for some platforms (e.g. UNICOS) - * it is however best to use the native implementation of atof. + * This knows about if 'use locale' is in effect or not, and handles the radix + * character accordingly. On some platforms (e.g. UNICOS) it is however best + * to use the native implementation of atof, as long as you accept that the + * current underlying locale will affect the radix character. Perl's version + * uses a dot for a radix, execpt within the lexical scope of a Perl C statement. + * * You can experiment with using your native one by -DUSE_PERL_ATOF=0. * Some good tests to try out with either setting are t/base/num.t, * t/op/numconvert.t, and t/op/pack.t. Note that if using long doubles @@ -2787,7 +3102,7 @@ extern long double Perl_my_frexpl(long d #endif #ifdef USE_PERL_ATOF -# define Perl_atof(s) Perl_my_atof(s) +# define Perl_atof(s) Perl_my_atof(aTHX_ s) # define Perl_atof2(s, n) Perl_my_atof3(aTHX_ (s), &(n), 0) #else # define Perl_atof(s) (NV)atof(s) @@ -2796,6 +3111,17 @@ extern long double Perl_my_frexpl(long d #define my_atof2(a,b) my_atof3(a,b,0) /* +=for apidoc AmTR|NV|Atof|NN const char * const s + +This is a synonym for L>. + +=cut + +*/ + +#define Atof my_atof + +/* =for apidoc_section $numeric =for apidoc AmT|NV|Perl_acos|NV x =for apidoc_item |NV|Perl_asin|NV x @@ -2828,6 +3154,7 @@ NV on this platform. If no such functio the highest precision one available is used. =cut + */ /* @@ -2870,24 +3197,24 @@ the highest precision one available is u /* =for apidoc_section $integer -=for apidoc AmnU||PERL_INT_MAX -=for apidoc_item ||PERL_INT_MIN -=for apidoc_item ||PERL_LONG_MAX -=for apidoc_item ||PERL_LONG_MIN -=for apidoc_item ||PERL_SHORT_MAX -=for apidoc_item ||PERL_SHORT_MIN -=for apidoc_item ||PERL_UCHAR_MAX -=for apidoc_item ||PERL_UCHAR_MIN -=for apidoc_item ||PERL_UINT_MAX -=for apidoc_item ||PERL_UINT_MIN -=for apidoc_item ||PERL_ULONG_MAX -=for apidoc_item ||PERL_ULONG_MIN -=for apidoc_item ||PERL_USHORT_MAX -=for apidoc_item ||PERL_USHORT_MIN -=for apidoc_item ||PERL_QUAD_MAX -=for apidoc_item ||PERL_QUAD_MIN -=for apidoc_item ||PERL_UQUAD_MAX -=for apidoc_item ||PERL_UQUAD_MIN +=for apidoc Amn |int|PERL_INT_MAX +=for apidoc_item |int|PERL_INT_MIN +=for apidoc_item |long|PERL_LONG_MAX +=for apidoc_item |long|PERL_LONG_MIN +=for apidoc_item |IV|PERL_QUAD_MAX +=for apidoc_item |IV|PERL_QUAD_MIN +=for apidoc_item |short|PERL_SHORT_MAX +=for apidoc_item |short|PERL_SHORT_MIN +=for apidoc_item |U8|PERL_UCHAR_MAX +=for apidoc_item |U8|PERL_UCHAR_MIN +=for apidoc_item |unsigned int|PERL_UINT_MAX +=for apidoc_item |unsigned int|PERL_UINT_MIN +=for apidoc_item |unsigned long|PERL_ULONG_MAX +=for apidoc_item |unsigned long|PERL_ULONG_MIN +=for apidoc_item |UV|PERL_UQUAD_MAX +=for apidoc_item |UV|PERL_UQUAD_MIN +=for apidoc_item |unsigned short|PERL_USHORT_MAX +=for apidoc_item |unsigned short|PERL_USHORT_MIN These give the largest and smallest number representable in the current platform in variables of the corresponding types. @@ -2963,6 +3290,7 @@ typedef struct xpvcv XPVCV; typedef struct xpvbm XPVBM; typedef struct xpvfm XPVFM; typedef struct xpvio XPVIO; +typedef struct xobject XPVOBJ; typedef struct mgvtbl MGVTBL; typedef union any ANY; typedef struct ptr_tbl_ent PTR_TBL_ENT_t; @@ -3769,7 +4097,10 @@ out there, Solaris being the most promin /* the traditional thread-unsafe notion of "current interpreter". */ #ifndef PERL_SET_INTERP -# define PERL_SET_INTERP(i) (PL_curinterp = (PerlInterpreter*)(i)) +# define PERL_SET_INTERP(i) \ + STMT_START { PL_curinterp = (PerlInterpreter*)(i); \ + PERL_SET_NON_tTHX_CONTEXT(i); \ + } STMT_END #endif #ifndef PERL_GET_INTERP @@ -3811,30 +4142,63 @@ out there, Solaris being the most promin #define SVfARG(p) ((void*)(p)) +/* Render an SV as a quoted and escaped string suitable for an error message. + * Only shows the first PERL_QUOTEDPREFIX_LEN characters, and adds ellipses if the + * string is too long. + */ +#ifndef PERL_QUOTEDPREFIX_LEN +# define PERL_QUOTEDPREFIX_LEN 256 +#endif +#ifndef SVf_QUOTEDPREFIX +# define SVf_QUOTEDPREFIX "5p" +#endif + +/* like %s but runs through the quoted prefix logic */ +#ifndef PVf_QUOTEDPREFIX +# define PVf_QUOTEDPREFIX "1p" +#endif + #ifndef HEKf # define HEKf "2p" #endif +#ifndef HEKf_QUOTEDPREFIX +# define HEKf_QUOTEDPREFIX "7p" +#endif + /* Not ideal, but we cannot easily include a number in an already-numeric * format sequence. */ #ifndef HEKf256 # define HEKf256 "3p" #endif +#ifndef HEKf256_QUOTEDPREFIX +# define HEKf256_QUOTEDPREFIX "8p" +#endif + #define HEKfARG(p) ((void*)(p)) /* Documented in perlguts * - * %4p is a custom format + * %4p and %9p are custom formats for handling UTF8 parameters. + * They only occur when prefixed by specific other formats. */ #ifndef UTF8f # define UTF8f "d%" UVuf "%4p" #endif +#ifndef UTF8f_QUOTEDPREFIX +# define UTF8f_QUOTEDPREFIX "d%" UVuf "%9p" +#endif #define UTF8fARG(u,l,p) (int)cBOOL(u), (UV)(l), (void*)(p) #define PNf UTF8f #define PNfARG(pn) (int)1, (UV)PadnameLEN(pn), (void *)PadnamePV(pn) +#define HvNAMEf "6p" +#define HvNAMEf_QUOTEDPREFIX "10p" + +#define HvNAMEfARG(hv) ((void*)(hv)) + #ifdef PERL_CORE /* not used; but needed for backward compatibility with XS code? - RMB =for apidoc_section $io_formats @@ -3954,6 +4318,14 @@ intrinsic function, see its documents fo #ifdef DEBUGGING # define ASSUME(x) assert(x) +#elif __has_builtin(__builtin_assume) +# if defined(__clang__) || defined(__clang) +# define ASSUME(x) CLANG_DIAG_IGNORE(-Wassume) \ + __builtin_assume (x) \ + CLANG_DIAG_RESTORE +# else +# define ASSUME(x) __builtin_assume(x) +# endif #elif defined(_MSC_VER) # define ASSUME(x) __assume(x) #elif defined(__ARMCC_VERSION) /* untested */ @@ -4025,7 +4397,7 @@ void init_os_extras(void); UNION_ANY_DEFINITION; #else union any { - void* any_ptr; + void* any_ptr; SV* any_sv; SV** any_svp; GV* any_gv; @@ -4034,14 +4406,17 @@ union any { OP* any_op; char* any_pv; char** any_pvp; - I32 any_i32; - U32 any_u32; - IV any_iv; - UV any_uv; - long any_long; - bool any_bool; - void (*any_dptr) (void*); - void (*any_dxptr) (pTHX_ void*); + I32 any_i32; + U32 any_u32; + IV any_iv; + UV any_uv; + long any_long; + bool any_bool; + Size_t any_size; + SSize_t any_ssize; + STRLEN any_strlen; + void (*any_dptr) (void*); + void (*any_dxptr) (pTHX_ void*); }; #endif @@ -4116,7 +4491,7 @@ typedef struct crypt_data { / #define FAKE_BIT_BUCKET #endif -/* [perl #22371] Algorimic Complexity Attack on Perl 5.6.1, 5.8.0. +/* [perl #22371] Algorithmic Complexity Attack on Perl 5.6.1, 5.8.0. * Note that the USE_HASH_SEED and similar defines are *NOT* defined by * Configure, despite their names being similar to other defines like * USE_ITHREADS. Configure in fact knows nothing about the randomised @@ -4182,8 +4557,7 @@ typedef struct crypt_data { / typedef struct magic_state MGS; /* struct magic_state defined in mg.c */ -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) \ - || defined(PERL_EXT_RE_BUILD) +#if defined(PERL_IN_REGEX_ENGINE) || defined(PERL_EXT_RE_BUILD) /* These have to be predeclared, as they are used in proto.h which is #included * before their definitions in regcomp.h. */ @@ -4199,6 +4573,7 @@ typedef struct regnode_charclass_posixl typedef struct regnode_ssc regnode_ssc; typedef struct RExC_state_t RExC_state_t; struct _reg_trie_data; +typedef struct scan_data_t scan_data_t; #endif @@ -4497,13 +4872,23 @@ Gid_t getegid (void); # define DEBUG_q_TEST_ UNLIKELY(PL_debug & DEBUG_q_FLAG) # define DEBUG_M_TEST_ UNLIKELY(PL_debug & DEBUG_M_FLAG) # define DEBUG_B_TEST_ UNLIKELY(PL_debug & DEBUG_B_FLAG) -# define DEBUG_L_TEST_ UNLIKELY(PL_debug & DEBUG_L_FLAG) + +/* Locale initialization comes earlier than PL_debug gets set, + * DEBUG_LOCALE_INITIALIZATION_, if defined, will be set early enough */ +# ifndef DEBUG_LOCALE_INITIALIZATION_ +# define DEBUG_LOCALE_INITIALIZATION_ 0 +# endif +# define DEBUG_L_TEST_ \ + ( UNLIKELY(DEBUG_LOCALE_INITIALIZATION_) \ + || UNLIKELY(PL_debug & DEBUG_L_FLAG)) +# define DEBUG_Lv_TEST_ \ + ( UNLIKELY(DEBUG_LOCALE_INITIALIZATION_) \ + || UNLIKELY(DEBUG_BOTH_FLAGS_TEST_(DEBUG_L_FLAG, DEBUG_v_FLAG))) # define DEBUG_i_TEST_ UNLIKELY(PL_debug & DEBUG_i_FLAG) # define DEBUG_y_TEST_ UNLIKELY(PL_debug & DEBUG_y_FLAG) # define DEBUG_Xv_TEST_ DEBUG_BOTH_FLAGS_TEST_(DEBUG_X_FLAG, DEBUG_v_FLAG) # define DEBUG_Uv_TEST_ DEBUG_BOTH_FLAGS_TEST_(DEBUG_U_FLAG, DEBUG_v_FLAG) # define DEBUG_Pv_TEST_ DEBUG_BOTH_FLAGS_TEST_(DEBUG_P_FLAG, DEBUG_v_FLAG) -# define DEBUG_Lv_TEST_ DEBUG_BOTH_FLAGS_TEST_(DEBUG_L_FLAG, DEBUG_v_FLAG) # define DEBUG_yv_TEST_ DEBUG_BOTH_FLAGS_TEST_(DEBUG_y_FLAG, DEBUG_v_FLAG) #ifdef DEBUGGING @@ -4597,9 +4982,9 @@ Gid_t getegid (void); # define DEBUG__(t, a) \ STMT_START { \ - if (t) STMT_START { \ + if (t) { \ DEBUG_PRE_STMTS a; DEBUG_POST_STMTS \ - } STMT_END; \ + } \ } STMT_END # define DEBUG_f(a) DEBUG__(DEBUG_f_TEST, a) @@ -5061,9 +5446,9 @@ Indices outside the range 0..31 result i EXTCONST char PL_hexdigit[] INIT("0123456789abcdef0123456789ABCDEF"); -EXTCONST STRLEN PL_WARN_ALL +EXT char PL_WARN_ALL INIT(0); -EXTCONST STRLEN PL_WARN_NONE +EXT char PL_WARN_NONE INIT(0); /* This is constant on most architectures, a global on OS/2 */ @@ -5167,41 +5552,6 @@ EXTCONST unsigned char PL_fold[] = { 248, 249, 250, 251, 252, 253, 254, 255 }; -EXT unsigned char PL_fold_locale[] = { /* Unfortunately not EXTCONST. */ - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, - 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', - 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', - 'x', 'y', 'z', 91, 92, 93, 94, 95, - 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255 -}; - EXTCONST unsigned char PL_fold_latin1[] = { /* Full latin1 complement folding, except for three problematic code points: * Micro sign (181 = 0xB5) and y with diearesis (255 = 0xFF) have their @@ -5333,7 +5683,6 @@ EXTCONST unsigned char PL_fold[]; EXTCONST unsigned char PL_fold_latin1[]; EXTCONST unsigned char PL_mod_latin1_uc[]; EXTCONST unsigned char PL_latin1_lc[]; -EXT unsigned char PL_fold_locale[]; /* Unfortunately not EXTCONST. */ # endif #endif @@ -5386,6 +5735,9 @@ EXTCONST char PL_bincompat_options[] = # ifdef MYMALLOC " MYMALLOC" # endif +# ifdef NO_HASH_SEED + " NO_HASH_SEED" +# endif # ifdef PERLIO_LAYERS " PERLIO_LAYERS" # endif @@ -5395,6 +5747,16 @@ EXTCONST char PL_bincompat_options[] = # ifdef PERL_DEBUG_READONLY_OPS " PERL_DEBUG_READONLY_OPS" # endif +# ifdef PERL_HASH_FUNC_DEFINE +/* note that this is different from the others, PERL_HASH_FUNC_DEFINE + * is a string which says which define was defined. */ + " " PERL_HASH_FUNC_DEFINE +# endif +# ifdef PERL_HASH_USE_SBOX32 + " PERL_HASH_USE_SBOX32" +# else + " PERL_HASH_NO_SBOX32" +# endif # ifdef PERL_IMPLICIT_SYS " PERL_IMPLICIT_SYS" # endif @@ -5461,7 +5823,7 @@ EXTCONST char PL_bincompat_options[] = # ifdef VMS_WE_ARE_CASE_SENSITIVE " VMS_SYMBOL_CASE_AS_IS" # endif - ""; + ""; /* keep this on a line by itself, WITH the empty string */ #else EXTCONST char PL_bincompat_options[]; #endif @@ -5682,7 +6044,7 @@ typedef char* (*re_intuit_start_t) (pT typedef SV* (*re_intuit_string_t) (pTHX_ regexp *prog); typedef void (*regfree_t) (pTHX_ struct regexp* r); typedef regexp* (*regdupe_t) (pTHX_ const regexp* r, CLONE_PARAMS *param); -typedef I32 (*re_fold_t)(const char *, char const *, I32); +typedef I32 (*re_fold_t)(pTHX_ const char *, char const *, I32); typedef void (*DESTRUCTORFUNC_NOCONTEXT_t) (void*); typedef void (*DESTRUCTORFUNC_t) (pTHX_ void*); @@ -5692,10 +6054,38 @@ typedef void (*XSINIT_t) (pTHX); typedef void (*ATEXIT_t) (pTHX_ void*); typedef void (*XSUBADDR_t) (pTHX_ CV *); +enum Perl_custom_infix_precedence { + /* These numbers are spaced out to give room to insert new values as + * required. They form part of the ABI contract with XS::Parse::Infix so + * they should not be changed within a stable release cycle, but they can + * be freely altered during a development cycle because no ABI guarantees + * are made at that time */ + INFIX_PREC_LOW = 10, /* non-associative */ + INFIX_PREC_LOGICAL_OR_LOW = 30, /* left-associative, as `or` */ + INFIX_PREC_LOGICAL_AND_LOW = 40, /* left-associative, as `and` */ + INFIX_PREC_ASSIGN = 50, /* right-associative, as `=` */ + INFIX_PREC_LOGICAL_OR = 70, /* left-associative, as `||` */ + INFIX_PREC_LOGICAL_AND = 80, /* left-associative, as `&&` */ + INFIX_PREC_REL = 90, /* non-associative, just below `==` */ + INFIX_PREC_ADD = 110, /* left-associative, as `+` */ + INFIX_PREC_MUL = 130, /* left-associative, as `*` */ + INFIX_PREC_POW = 150, /* right-associative, as `**` */ + INFIX_PREC_HIGH = 170, /* non-associative */ + /* Try to keep within the range of a U8 in case we need to split the field + * and add flags */ +}; +struct Perl_custom_infix; +struct Perl_custom_infix { + enum Perl_custom_infix_precedence prec; + void (*parse)(pTHX_ SV **opdata, struct Perl_custom_infix *); /* optional */ + OP *(*build_op)(pTHX_ SV **opdata, OP *lhs, OP *rhs, struct Perl_custom_infix *); +}; + typedef OP* (*Perl_ppaddr_t)(pTHX); typedef OP* (*Perl_check_t) (pTHX_ OP*); typedef void(*Perl_ophook_t)(pTHX_ OP*); typedef int (*Perl_keyword_plugin_t)(pTHX_ char*, STRLEN, OP**); +typedef STRLEN (*Perl_infix_plugin_t)(pTHX_ char*, STRLEN, struct Perl_custom_infix **); typedef void(*Perl_cpeep_t)(pTHX_ OP *, OP *); typedef void(*globhook_t)(pTHX); @@ -5908,19 +6298,19 @@ EXTCONST U8 PL_magic_data[256]; #endif #ifdef DOINIT - /* NL IV NV PV INV PI PN MG RX GV LV AV HV CV FM IO */ + /* NL IV NV PV INV PI PN MG RX GV LV AV HV CV FM IO OBJ */ EXTCONST bool -PL_valid_types_IVX[] = { 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 }; +PL_valid_types_IVX[] = { 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0 }; EXTCONST bool -PL_valid_types_NVX[] = { 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 }; +PL_valid_types_NVX[] = { 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0 }; EXTCONST bool -PL_valid_types_PVX[] = { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 }; +PL_valid_types_PVX[] = { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0 }; EXTCONST bool -PL_valid_types_RV[] = { 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 }; +PL_valid_types_RV[] = { 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0 }; EXTCONST bool -PL_valid_types_IV_set[] = { 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 }; +PL_valid_types_IV_set[] = { 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0 }; EXTCONST bool -PL_valid_types_NV_set[] = { 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; +PL_valid_types_NV_set[] = { 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }; EXTCONST U8 PL_deBruijn_bitpos_tab32[] = { @@ -5972,6 +6362,24 @@ EXTCONST U8 PL_deBruijn_bitpos_tab64[] # define PERL_SET_CONTEXT(i) PERL_SET_INTERP(i) #endif +#ifdef USE_PERL_SWITCH_LOCALE_CONTEXT +# define PERL_SET_LOCALE_CONTEXT(i) \ + STMT_START { \ + if (UNLIKELY(PL_veto_switch_non_tTHX_context)) \ + Perl_switch_locale_context(); \ + } STMT_END +#else +# define PERL_SET_LOCALE_CONTEXT(i) NOOP +#endif + +/* In some Configurations there may be per-thread information that is carried + * in a library instead of perl's tTHX structure. This macro is to be used to + * handle those when tTHX is changed. Only locale handling is currently known + * to be affected. */ +#define PERL_SET_NON_tTHX_CONTEXT(i) \ + STMT_START { PERL_SET_LOCALE_CONTEXT(i); } STMT_END + + #ifndef PERL_GET_CONTEXT # define PERL_GET_CONTEXT PERL_GET_INTERP #endif @@ -6609,14 +7017,14 @@ the plain locale pragma without a parame * instead it makes sense to minimize space used and do all the work in * the rarely called function */ # ifdef USE_LOCALE_CTYPE -# define _CHECK_AND_WARN_PROBLEMATIC_LOCALE \ +# define CHECK_AND_WARN_PROBLEMATIC_LOCALE_ \ STMT_START { \ if (UNLIKELY(PL_warn_locale)) { \ Perl__warn_problematic_locale(); \ } \ } STMT_END # else -# define _CHECK_AND_WARN_PROBLEMATIC_LOCALE +# define CHECK_AND_WARN_PROBLEMATIC_LOCALE_ # endif @@ -6626,7 +7034,7 @@ the plain locale pragma without a parame * string, and an end position which it won't try to read past */ # define _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG(cp) \ STMT_START { \ - if (! PL_in_utf8_CTYPE_locale && ckWARN(WARN_LOCALE)) { \ + if (! IN_UTF8_CTYPE_LOCALE && ckWARN(WARN_LOCALE)) { \ Perl_warner(aTHX_ packWARN(WARN_LOCALE), \ "Wide character (U+%" UVXf ") in %s",\ (UV) cp, OP_DESC(PL_op)); \ @@ -6635,7 +7043,7 @@ the plain locale pragma without a parame # define _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(s, send) \ STMT_START { /* Check if to warn before doing the conversion work */\ - if (! PL_in_utf8_CTYPE_locale && ckWARN(WARN_LOCALE)) { \ + if (! IN_UTF8_CTYPE_LOCALE && ckWARN(WARN_LOCALE)) { \ UV cp = utf8_to_uvchr_buf((U8 *) (s), (U8 *) (send), NULL); \ Perl_warner(aTHX_ packWARN(WARN_LOCALE), \ "Wide character (U+%" UVXf ") in %s", \ @@ -6661,207 +7069,99 @@ the plain locale pragma without a parame # define IN_LC_COMPILETIME(category) 0 # define IN_LC_RUNTIME(category) 0 # define IN_LC(category) 0 -# define _CHECK_AND_WARN_PROBLEMATIC_LOCALE +# define CHECK_AND_WARN_PROBLEMATIC_LOCALE_ # define _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(s, send) # define _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG(c) #endif +#define locale_panic_(m) Perl_locale_panic((m), __FILE__, __LINE__, errno) /* Locale/thread synchronization macros. */ -#if ! ( defined(USE_LOCALE) \ - && defined(USE_ITHREADS) \ - && ( ! defined(USE_THREAD_SAFE_LOCALE) \ - || ( defined(HAS_LOCALECONV) \ - && ( ! defined(HAS_LOCALECONV_L) \ - || defined(TS_W32_BROKEN_LOCALECONV))) \ - || ( defined(HAS_NL_LANGINFO) \ - && ! defined(HAS_THREAD_SAFE_NL_LANGINFO_L)) \ - || (defined(HAS_MBLEN) && ! defined(HAS_MBRLEN)) \ - || (defined(HAS_MBTOWC) && ! defined(HAS_MBRTOWC)) \ - || (defined(HAS_WCTOMB) && ! defined(HAS_WCRTOMB)))) - -/* The whole expression just above was complemented, so here we have no need - * for thread synchronization, most likely it would be that this isn't a - * threaded build. */ +#if ! defined(USE_LOCALE) || ! defined(USE_LOCALE_THREADS) +# define LOCALE_LOCK_(cond) NOOP +# define LOCALE_UNLOCK_ NOOP # define LOCALE_INIT # define LOCALE_TERM -# define LC_NUMERIC_LOCK(cond) NOOP -# define LC_NUMERIC_UNLOCK NOOP -# define LOCALECONV_LOCK NOOP -# define LOCALECONV_UNLOCK NOOP -# define LOCALE_READ_LOCK NOOP -# define LOCALE_READ_UNLOCK NOOP -# define MBLEN_LOCK NOOP -# define MBLEN_UNLOCK NOOP -# define MBTOWC_LOCK NOOP -# define MBTOWC_UNLOCK NOOP -# define NL_LANGINFO_LOCK NOOP -# define NL_LANGINFO_UNLOCK NOOP -# define SETLOCALE_LOCK NOOP -# define SETLOCALE_UNLOCK NOOP -# define WCTOMB_LOCK NOOP -# define WCTOMB_UNLOCK NOOP -#else - - /* Here, we will need critical sections in locale handling, because one or - * more of the above conditions are true. This could be because the - * platform doesn't have thread-safe locales, or that at least one of the - * locale-dependent functions in the core isn't thread-safe. The latter - * case is generally because they return a pointer to a static buffer, which - * may be per-process instead of per-thread. There are supposedly - * re-entrant, safe versions for all of them Perl currently uses (which the - * #if above checks for), but most platforms don't have all the needed ones - * available, and the Posix standard doesn't require nl_langinfo_l() to be - * fully thread-safe, so a Configure probe was written. localeconv_l() is - * uncommon, and judging by bug reports on the web, some earlier library - * localeconv_l versions were broken, so perhaps a probe is in order for - * that, but it would be a pain to write. - * - * On non-thread-safe systems, some of the above functions are vulnerable to - * races should another thread get control and change the locale in the - * middle of their execution. - * - * We currently use a single mutex for all these cases. This solves both - * the problem of another thread changing the locale, and the buffer being - * overwritten (the code copies the results to a safe place before releasing - * the mutex). Ideally, for locale thread-safe platforms where the only - * issue is another thread clobbering the function's static buffer, there - * would be a separate mutex for each such buffer. Otherwise, things get - * locked that don't need to. But, it is not expected that any of these - * will be called frequently, and the locked interval should be short, and - * modern platforms will have reentrant versions (which don't lock) for - * almost all of them, so khw thinks a single mutex should suffice. */ -# define LOCALE_LOCK_ \ - STMT_START { \ - DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ - "%s: %d: locking locale\n", __FILE__, __LINE__)); \ - MUTEX_LOCK(&PL_locale_mutex); \ - } STMT_END -# define LOCALE_UNLOCK_ \ - STMT_START { \ - DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ - "%s: %d: unlocking locale\n", __FILE__, __LINE__)); \ - MUTEX_UNLOCK(&PL_locale_mutex); \ - } STMT_END - /* We do define a different macro for each case; then if we want to have - * separate mutexes for some of them, the only changes needed are here. - * Define just the necessary macros. The compiler should then croak if the - * #ifdef's in the code are incorrect */ -# if defined(HAS_LOCALECONV) && ( ! defined(HAS_POSIX_2008_LOCALE) \ - || ! defined(HAS_LOCALECONV_L) \ - || defined(TS_W32_BROKEN_LOCALECONV)) -# define LOCALECONV_LOCK LOCALE_LOCK_ -# define LOCALECONV_UNLOCK LOCALE_UNLOCK_ -# endif -# if defined(HAS_NL_LANGINFO) && ( ! defined(HAS_THREAD_SAFE_NL_LANGINFO_L) \ - || ! defined(HAS_POSIX_2008_LOCALE)) -# define NL_LANGINFO_LOCK LOCALE_LOCK_ -# define NL_LANGINFO_UNLOCK LOCALE_UNLOCK_ -# endif -# if defined(HAS_MBLEN) && ! defined(HAS_MBRLEN) -# define MBLEN_LOCK LOCALE_LOCK_ -# define MBLEN_UNLOCK LOCALE_UNLOCK_ -# endif -# if defined(HAS_MBTOWC) && ! defined(HAS_MBRTOWC) -# define MBTOWC_LOCK LOCALE_LOCK_ -# define MBTOWC_UNLOCK LOCALE_UNLOCK_ -# endif -# if defined(HAS_WCTOMB) && ! defined(HAS_WCRTOMB) -# define WCTOMB_LOCK LOCALE_LOCK_ -# define WCTOMB_UNLOCK LOCALE_UNLOCK_ -# endif -# if defined(USE_THREAD_SAFE_LOCALE) - /* On locale thread-safe systems, we don't need these workarounds */ -# define LOCALE_TERM_LC_NUMERIC_ NOOP -# define LOCALE_INIT_LC_NUMERIC_ NOOP -# define LC_NUMERIC_LOCK(cond) NOOP -# define LC_NUMERIC_UNLOCK NOOP -# define LOCALE_INIT_LC_NUMERIC_ NOOP -# define LOCALE_TERM_LC_NUMERIC_ NOOP - - /* There may be instance core where we this is invoked yet should do - * nothing. Rather than have #ifdef's around them, define it here */ -# define SETLOCALE_LOCK NOOP -# define SETLOCALE_UNLOCK NOOP -# else -# define SETLOCALE_LOCK LOCALE_LOCK_ -# define SETLOCALE_UNLOCK LOCALE_UNLOCK_ +#else /* Below: Threaded, and locales are supported */ - /* On platforms without per-thread locales, when another thread can switch - * our locale, we need another mutex to create critical sections where we - * want the LC_NUMERIC locale to be locked into either the C (standard) - * locale, or the underlying locale, so that other threads interrupting - * this one don't change it to the wrong state before we've had a chance to - * complete our operation. It can stay locked over an entire printf - * operation, for example. And so is made distinct from the LOCALE_LOCK - * mutex. + /* A locale mutex is required on all such threaded builds. * - * This simulates kind of a general semaphore. The current thread will - * lock the mutex if the per-thread variable is zero, and then increments - * that variable. Each corresponding UNLOCK decrements the variable until - * it is 0, at which point it actually unlocks the mutex. Since the - * variable is per-thread, there is no race with other threads. + * This mutex simulates a general (or recursive) semaphore. The current + * thread will lock the mutex if the per-thread variable is zero, and then + * increments that variable. Each corresponding UNLOCK decrements the + * variable until it is 0, at which point it actually unlocks the mutex. + * Since the variable is per-thread, initialized to 0, there is no race + * with other threads. * - * The single argument is a condition to test for, and if true, to panic, - * as this would be an attempt to complement the LC_NUMERIC state, and - * we're not supposed to because it's locked. + * The single argument is a condition to test for, and if true, to panic. + * Call it with the constant 0 to suppress the check. * * Clang improperly gives warnings for this, if not silenced: * https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#conditional-locks - * - * If LC_NUMERIC_LOCK is combined with one of the LOCKs above, calls to - * that and its corresponding unlock should be contained entirely within - * the locked portion of LC_NUMERIC. Those mutexes should be used only in - * very short sections of code, while LC_NUMERIC_LOCK may span more - * operations. By always following this convention, deadlock should be - * impossible. But if necessary, the two mutexes could be combined. */ -# define LC_NUMERIC_LOCK(cond_to_panic_if_already_locked) \ - CLANG_DIAG_IGNORE(-Wthread-safety) \ + */ +# define LOCALE_LOCK_(cond_to_panic_if_already_locked) \ STMT_START { \ - if (PL_lc_numeric_mutex_depth <= 0) { \ - MUTEX_LOCK(&PL_lc_numeric_mutex); \ - PL_lc_numeric_mutex_depth = 1; \ + CLANG_DIAG_IGNORE(-Wthread-safety) \ + if (LIKELY(PL_locale_mutex_depth <= 0)) { \ DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ - "%s: %d: locking lc_numeric; depth=1\n", \ + "%s: %d: locking locale; depth=1\n", \ __FILE__, __LINE__)); \ + MUTEX_LOCK(&PL_locale_mutex); \ + PL_locale_mutex_depth = 1; \ } \ else { \ - PL_lc_numeric_mutex_depth++; \ + PL_locale_mutex_depth++; \ DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ - "%s: %d: avoided lc_numeric_lock; new depth=%d\n", \ - __FILE__, __LINE__, PL_lc_numeric_mutex_depth)); \ + "%s: %d: avoided locking locale; new depth=%d\n", \ + __FILE__, __LINE__, PL_locale_mutex_depth)); \ if (cond_to_panic_if_already_locked) { \ - Perl_croak_nocontext("panic: %s: %d: Trying to change" \ - " LC_NUMERIC incompatibly", \ - __FILE__, __LINE__); \ + locale_panic_("Trying to lock locale incompatibly: " \ + STRINGIFY(cond_to_panic_if_already_locked)); \ } \ } \ + CLANG_DIAG_RESTORE \ } STMT_END -# define LC_NUMERIC_UNLOCK \ +# define LOCALE_UNLOCK_ \ STMT_START { \ - if (PL_lc_numeric_mutex_depth <= 1) { \ - MUTEX_UNLOCK(&PL_lc_numeric_mutex); \ - PL_lc_numeric_mutex_depth = 0; \ + if (LIKELY(PL_locale_mutex_depth == 1)) { \ DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ - "%s: %d: unlocking lc_numeric; depth=0\n", \ + "%s: %d: unlocking locale; new depth=0\n", \ __FILE__, __LINE__)); \ + PL_locale_mutex_depth = 0; \ + MUTEX_UNLOCK(&PL_locale_mutex); \ + } \ + else if (PL_locale_mutex_depth <= 0) { \ + DEBUG_L(PerlIO_printf(Perl_debug_log, \ + "%s: %d: ignored attempt to unlock already" \ + " unlocked locale; depth unchanged at %d\n", \ + __FILE__, __LINE__, PL_locale_mutex_depth)); \ } \ else { \ - PL_lc_numeric_mutex_depth--; \ + PL_locale_mutex_depth--; \ DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ - "%s: %d: avoided lc_numeric_unlock; new depth=%d\n",\ - __FILE__, __LINE__, PL_lc_numeric_mutex_depth)); \ + "%s: %d: avoided unlocking locale; new depth=%d\n", \ + __FILE__, __LINE__, PL_locale_mutex_depth)); \ } \ - } STMT_END \ - CLANG_DIAG_RESTORE + } STMT_END -# define LOCALE_INIT_LC_NUMERIC_ MUTEX_INIT(&PL_lc_numeric_mutex) -# define LOCALE_TERM_LC_NUMERIC_ MUTEX_DESTROY(&PL_lc_numeric_mutex) +# if defined(USE_THREADS) && ! defined(USE_THREAD_SAFE_LOCALE) + + /* By definition, a thread-unsafe locale means we need a critical + * section. */ +# define SETLOCALE_LOCK LOCALE_LOCK_(0) +# define SETLOCALE_UNLOCK LOCALE_UNLOCK_ +# ifdef USE_LOCALE_NUMERIC +# define LC_NUMERIC_LOCK(cond_to_panic_if_already_locked) \ + LOCALE_LOCK_(cond_to_panic_if_already_locked) +# define LC_NUMERIC_UNLOCK LOCALE_UNLOCK_ +# endif # endif -# ifdef USE_POSIX_2008_LOCALE +# ifndef USE_POSIX_2008_LOCALE +# define LOCALE_TERM_POSIX_2008_ NOOP +# else /* We have a locale object holding the 'C' locale for Posix 2008 */ # define LOCALE_TERM_POSIX_2008_ \ STMT_START { \ @@ -6873,22 +7173,131 @@ the plain locale pragma without a parame PL_C_locale_obj = (locale_t) NULL; \ } \ } STMT_END -# else -# define LOCALE_TERM_POSIX_2008_ NOOP # endif -# define LOCALE_INIT STMT_START { \ - MUTEX_INIT(&PL_locale_mutex); \ - LOCALE_INIT_LC_NUMERIC_; \ - } STMT_END - +# define LOCALE_INIT MUTEX_INIT(&PL_locale_mutex) # define LOCALE_TERM STMT_START { \ - MUTEX_DESTROY(&PL_locale_mutex); \ - LOCALE_TERM_LC_NUMERIC_; \ LOCALE_TERM_POSIX_2008_; \ + MUTEX_DESTROY(&PL_locale_mutex); \ } STMT_END #endif +/* There are some locale-related functions which may need locking only because + * they share some common memory across threads, and hence there is the + * potential for a race in accessing that space. Most are because their return + * points to a global static buffer, but some just use some common space + * internally. All functions accessing a given space need to have a critical + * section to prevent any other thread from accessing it at the same time. + * Ideally, there would be a separate mutex for each such space, so that + * another thread isn't unnecessarily blocked. But, most of them need to be + * locked against the locale changing while accessing that space, and it is not + * expected that any will be called frequently, and the locked interval should + * be short, and modern platforms will have reentrant versions (which don't + * lock) for almost all of them, so khw thinks a single mutex should suffice. + * Having a single mutex facilitates that, avoiding potential deadlock + * situations. + * + * This will be a no-op iff the perl is unthreaded. 'gw' stands for 'global + * write', to indicate the caller wants to be able to access memory that isn't + * thread specific, either to write to itself, or to prevent anyone else from + * writing. */ +#define gwLOCALE_LOCK LOCALE_LOCK_(0) +#define gwLOCALE_UNLOCK LOCALE_UNLOCK_ + +/* setlocale() generally returns in a global static buffer, but not on Windows + * when operating in thread-safe mode */ +#if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE) +# define POSIX_SETLOCALE_LOCK \ + STMT_START { \ + if (_configthreadlocale(0) == _DISABLE_PER_THREAD_LOCALE) \ + gwLOCALE_LOCK; \ + } STMT_END +# define POSIX_SETLOCALE_UNLOCK \ + STMT_START { \ + if (_configthreadlocale(0) == _DISABLE_PER_THREAD_LOCALE) \ + gwLOCALE_UNLOCK; \ + } STMT_END +#else +# define POSIX_SETLOCALE_LOCK gwLOCALE_LOCK +# define POSIX_SETLOCALE_UNLOCK gwLOCALE_UNLOCK +#endif + +/* It handles _wsetlocale() as well */ +#define WSETLOCALE_LOCK POSIX_SETLOCALE_LOCK +#define WSETLOCALE_UNLOCK POSIX_SETLOCALE_UNLOCK + +/* Similar to gwLOCALE_LOCK, there are functions that require both the locale + * and environment to be constant during their execution, and don't change + * either of those things, but do write to some sort of shared global space. + * They require some sort of exclusive lock against similar functions, and a + * read lock on both the locale and environment. However, on systems which + * have per-thread locales, the locale is constant during the execution of + * these functions, and so no locale lock is necssary. For such systems, an + * exclusive ENV lock is necessary and sufficient. On systems where the locale + * could change out from under us, we use an exclusive LOCALE lock to prevent + * that, and a read ENV lock to prevent other threads that have nothing to do + * with locales here from changing the environment. */ +#ifdef SETLOCALE_LOCK +# define gwENVr_LOCALEr_LOCK \ + STMT_START { SETLOCALE_LOCK; ENV_READ_LOCK; } STMT_END +# define gwENVr_LOCALEr_UNLOCK \ + STMT_START { ENV_READ_UNLOCK; SETLOCALE_UNLOCK; } STMT_END +#else +# define gwENVr_LOCALEr_LOCK ENV_LOCK +# define gwENVr_LOCALEr_UNLOCK ENV_UNLOCK +#endif + +/* Now that we have defined gwENVr_LOCALEr_LOCK, we can finish defining + * SETLOCALE_LOCK, which we kept undefined until here on a thread-safe system + * so that we could use that fact to calculate what gwENVr_LOCALEr_LOCK should + * be */ +#ifndef SETLOCALE_LOCK +# define SETLOCALE_LOCK NOOP +# define SETLOCALE_UNLOCK NOOP +#endif + + + /* On systems that don't have per-thread locales, even though we don't + * think we are changing the locale ourselves, behind the scenes it does + * get changed to whatever the thread's should be, so it has to be an + * exclusive lock. By defining it here with this name, we can, for the + * most part, hide this detail from the rest of the code */ +/* Currently, the read lock is an exclusive lock */ +#define LOCALE_READ_LOCK SETLOCALE_LOCK +#define LOCALE_READ_UNLOCK SETLOCALE_UNLOCK + + +#ifndef LC_NUMERIC_LOCK +# define LC_NUMERIC_LOCK(cond) NOOP +# define LC_NUMERIC_UNLOCK NOOP +#endif + + /* These non-reentrant versions use global space */ +# define MBLEN_LOCK_ gwLOCALE_LOCK +# define MBLEN_UNLOCK_ gwLOCALE_UNLOCK + +# define MBTOWC_LOCK_ gwLOCALE_LOCK +# define MBTOWC_UNLOCK_ gwLOCALE_UNLOCK + +# define WCTOMB_LOCK_ gwLOCALE_LOCK +# define WCTOMB_UNLOCK_ gwLOCALE_UNLOCK + + /* Whereas the reentrant versions don't (assuming they are called with a + * per-thread buffer; some have the capability of being called with a NULL + * parameter, which defeats the reentrancy) */ +# define MBRLEN_LOCK_ NOOP +# define MBRLEN_UNLOCK_ NOOP +# define MBRTOWC_LOCK_ NOOP +# define MBRTOWC_UNLOCK_ NOOP +# define WCRTOMB_LOCK_ NOOP +# define WCRTOMB_UNLOCK_ NOOP + +# define LC_COLLATE_LOCK SETLOCALE_LOCK +# define LC_COLLATE_UNLOCK SETLOCALE_UNLOCK + +# define STRFTIME_LOCK ENV_LOCK +# define STRFTIME_UNLOCK ENV_UNLOCK + #ifdef USE_LOCALE_NUMERIC /* These macros are for toggling between the underlying locale (UNDERLYING or @@ -7045,12 +7454,12 @@ cannot have changed since the precalcula * khw believes the reason for the variables instead of the bits in a single * word is to avoid having to have masking instructions. */ -# define _NOT_IN_NUMERIC_STANDARD (! PL_numeric_standard) +# define NOT_IN_NUMERIC_STANDARD_ (! PL_numeric_standard) /* We can lock the category to stay in the C locale, making requests to the * contrary be noops, in the dynamic scope by setting PL_numeric_standard to 2. * */ -# define _NOT_IN_NUMERIC_UNDERLYING \ +# define NOT_IN_NUMERIC_UNDERLYING_ \ (! PL_numeric_underlying && PL_numeric_standard < 2) # define DECLARATION_FOR_LC_NUMERIC_MANIPULATION \ @@ -7060,17 +7469,17 @@ cannot have changed since the precalcula STMT_START { \ bool _in_lc_numeric = (in); \ LC_NUMERIC_LOCK( \ - ( ( _in_lc_numeric && _NOT_IN_NUMERIC_UNDERLYING) \ - || (! _in_lc_numeric && _NOT_IN_NUMERIC_STANDARD))); \ + ( ( _in_lc_numeric && NOT_IN_NUMERIC_UNDERLYING_) \ + || (! _in_lc_numeric && NOT_IN_NUMERIC_STANDARD_))); \ if (_in_lc_numeric) { \ - if (_NOT_IN_NUMERIC_UNDERLYING) { \ + if (NOT_IN_NUMERIC_UNDERLYING_) { \ Perl_set_numeric_underlying(aTHX); \ _restore_LC_NUMERIC_function \ = &Perl_set_numeric_standard; \ } \ } \ else { \ - if (_NOT_IN_NUMERIC_STANDARD) { \ + if (NOT_IN_NUMERIC_STANDARD_) { \ Perl_set_numeric_standard(aTHX); \ _restore_LC_NUMERIC_function \ = &Perl_set_numeric_underlying; \ @@ -7089,22 +7498,25 @@ cannot have changed since the precalcula LC_NUMERIC_UNLOCK; \ } STMT_END -/* The next two macros set unconditionally. These should be rarely used, and - * only after being sure that this is what is needed */ +/* The next two macros should be rarely used, and only after being sure that + * this is what is needed */ # define SET_NUMERIC_STANDARD() \ STMT_START { \ DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ "%s: %d: lc_numeric standard=%d\n", \ __FILE__, __LINE__, PL_numeric_standard)); \ - Perl_set_numeric_standard(aTHX); \ + if (UNLIKELY(NOT_IN_NUMERIC_STANDARD_)) { \ + Perl_set_numeric_standard(aTHX); \ + } \ DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ "%s: %d: lc_numeric standard=%d\n", \ __FILE__, __LINE__, PL_numeric_standard)); \ } STMT_END # define SET_NUMERIC_UNDERLYING() \ - STMT_START { \ - if (_NOT_IN_NUMERIC_UNDERLYING) { \ + STMT_START { \ + /*assert(PL_locale_mutex_depth > 0);*/ \ + if (NOT_IN_NUMERIC_UNDERLYING_) { \ Perl_set_numeric_underlying(aTHX); \ } \ } STMT_END @@ -7113,8 +7525,8 @@ cannot have changed since the precalcula * the RESTORE_foo ones called to switch back, but only if need be */ # define STORE_LC_NUMERIC_SET_STANDARD() \ STMT_START { \ - LC_NUMERIC_LOCK(_NOT_IN_NUMERIC_STANDARD); \ - if (_NOT_IN_NUMERIC_STANDARD) { \ + LC_NUMERIC_LOCK(NOT_IN_NUMERIC_STANDARD_); \ + if (NOT_IN_NUMERIC_STANDARD_) { \ _restore_LC_NUMERIC_function = &Perl_set_numeric_underlying;\ Perl_set_numeric_standard(aTHX); \ } \ @@ -7123,9 +7535,9 @@ cannot have changed since the precalcula /* Rarely, we want to change to the underlying locale even outside of 'use * locale'. This is principally in the POSIX:: functions */ # define STORE_LC_NUMERIC_FORCE_TO_UNDERLYING() \ - STMT_START { \ - LC_NUMERIC_LOCK(_NOT_IN_NUMERIC_UNDERLYING); \ - if (_NOT_IN_NUMERIC_UNDERLYING) { \ + STMT_START { \ + LC_NUMERIC_LOCK(NOT_IN_NUMERIC_UNDERLYING_); \ + if (NOT_IN_NUMERIC_UNDERLYING_) { \ Perl_set_numeric_underlying(aTHX); \ _restore_LC_NUMERIC_function = &Perl_set_numeric_standard; \ } \ @@ -7191,7 +7603,7 @@ cannot have changed since the precalcula #endif /* !USE_LOCALE_NUMERIC */ -#ifdef USE_ITHREADS +#ifdef USE_LOCALE_THREADS # define ENV_LOCK PERL_WRITE_LOCK(&PL_env_mutex) # define ENV_UNLOCK PERL_WRITE_UNLOCK(&PL_env_mutex) # define ENV_READ_LOCK PERL_READ_LOCK(&PL_env_mutex) @@ -7224,6 +7636,162 @@ cannot have changed since the precalcula # define GETENV_UNLOCK NOOP #endif +/* Some critical sections need to lock both the locale and the environment from + * changing, while allowing for any number of readers. To avoid deadlock, this + * is always done in the same order. These should always be invoked, like all + * locks really, at such a low level that its just a libc call that is wrapped, + * so as to prevent recursive calls which could deadlock. */ +#define ENVr_LOCALEr_LOCK \ + STMT_START { LOCALE_READ_LOCK; ENV_READ_LOCK; } STMT_END +#define ENVr_LOCALEr_UNLOCK \ + STMT_START { ENV_READ_UNLOCK; LOCALE_READ_UNLOCK; } STMT_END + +/* These time-related functions all requre that the environment and locale + * don't change while they are executing (at least in glibc; this appears to be + * contrary to the POSIX standard). tzset() writes global variables, so + * always needs to have write locking. ctime, localtime, mktime, and strftime + * effectively call it, so they too need exclusive access. The rest need to + * have exclusive locking as well so that they can copy the contents of the + * returned static buffer before releasing the lock. That leaves asctime and + * gmtime. There may be reentrant versions of these available on the platform + * which don't require write locking. + */ +#ifdef PERL_REENTR_USING_ASCTIME_R +# define ASCTIME_LOCK ENVr_LOCALEr_LOCK +# define ASCTIME_UNLOCK ENVr_LOCALEr_UNLOCK +#else +# define ASCTIME_LOCK gwENVr_LOCALEr_LOCK +# define ASCTIME_UNLOCK gwENVr_LOCALEr_UNLOCK +#endif + +#define CTIME_LOCK gwENVr_LOCALEr_LOCK +#define CTIME_UNLOCK gwENVr_LOCALEr_UNLOCK + +#ifdef PERL_REENTR_USING_GMTIME_R +# define GMTIME_LOCK ENVr_LOCALEr_LOCK +# define GMTIME_UNLOCK ENVr_LOCALEr_UNLOCK +#else +# define GMTIME_LOCK gwENVr_LOCALEr_LOCK +# define GMTIME_UNLOCK gwENVr_LOCALEr_UNLOCK +#endif + +#define LOCALTIME_LOCK gwENVr_LOCALEr_LOCK +#define LOCALTIME_UNLOCK gwENVr_LOCALEr_UNLOCK +#define MKTIME_LOCK gwENVr_LOCALEr_LOCK +#define MKTIME_UNLOCK gwENVr_LOCALEr_UNLOCK +#define TZSET_LOCK gwENVr_LOCALEr_LOCK +#define TZSET_UNLOCK gwENVr_LOCALEr_UNLOCK + +/* Similiarly, these functions need a constant environment and/or locale. And + * some have a buffer that is shared with another thread executing the same or + * a related call. A mutex could be created for each class, but for now, share + * the ENV mutex with everything, as none probably gets called so much that + * performance would suffer by a thread being locked out by another thread that + * could have used a different mutex. + * + * But, create a different macro name just to indicate the ones that don't + * actually depend on the environment, but are using its mutex for want of a + * better one */ +#define gwLOCALEr_LOCK gwENVr_LOCALEr_LOCK +#define gwLOCALEr_UNLOCK gwENVr_LOCALEr_UNLOCK + +#ifdef PERL_REENTR_USING_GETHOSTBYADDR_R +# define GETHOSTBYADDR_LOCK ENVr_LOCALEr_LOCK +# define GETHOSTBYADDR_UNLOCK ENVr_LOCALEr_UNLOCK +#else +# define GETHOSTBYADDR_LOCK gwENVr_LOCALEr_LOCK +# define GETHOSTBYADDR_UNLOCK gwENVr_LOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETHOSTBYNAME_R +# define GETHOSTBYNAME_LOCK ENVr_LOCALEr_LOCK +# define GETHOSTBYNAME_UNLOCK ENVr_LOCALEr_UNLOCK +#else +# define GETHOSTBYNAME_LOCK gwENVr_LOCALEr_LOCK +# define GETHOSTBYNAME_UNLOCK gwENVr_LOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETNETBYADDR_R +# define GETNETBYADDR_LOCK LOCALE_READ_LOCK +# define GETNETBYADDR_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETNETBYADDR_LOCK gwLOCALEr_LOCK +# define GETNETBYADDR_UNLOCK gwLOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETNETBYNAME_R +# define GETNETBYNAME_LOCK LOCALE_READ_LOCK +# define GETNETBYNAME_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETNETBYNAME_LOCK gwLOCALEr_LOCK +# define GETNETBYNAME_UNLOCK gwLOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETPROTOBYNAME_R +# define GETPROTOBYNAME_LOCK LOCALE_READ_LOCK +# define GETPROTOBYNAME_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETPROTOBYNAME_LOCK gwLOCALEr_LOCK +# define GETPROTOBYNAME_UNLOCK gwLOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETPROTOBYNUMBER_R +# define GETPROTOBYNUMBER_LOCK LOCALE_READ_LOCK +# define GETPROTOBYNUMBER_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETPROTOBYNUMBER_LOCK gwLOCALEr_LOCK +# define GETPROTOBYNUMBER_UNLOCK gwLOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETPROTOENT_R +# define GETPROTOENT_LOCK LOCALE_READ_LOCK +# define GETPROTOENT_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETPROTOENT_LOCK gwLOCALEr_LOCK +# define GETPROTOENT_UNLOCK gwLOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETPWNAM_R +# define GETPWNAM_LOCK LOCALE_READ_LOCK +# define GETPWNAM_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETPWNAM_LOCK gwLOCALEr_LOCK +# define GETPWNAM_UNLOCK gwLOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETPWUID_R +# define GETPWUID_LOCK LOCALE_READ_LOCK +# define GETPWUID_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETPWUID_LOCK gwLOCALEr_LOCK +# define GETPWUID_UNLOCK gwLOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETSERVBYNAME_R +# define GETSERVBYNAME_LOCK LOCALE_READ_LOCK +# define GETSERVBYNAME_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETSERVBYNAME_LOCK gwLOCALEr_LOCK +# define GETSERVBYNAME_UNLOCK gwLOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETSERVBYPORT_R +# define GETSERVBYPORT_LOCK LOCALE_READ_LOCK +# define GETSERVBYPORT_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETSERVBYPORT_LOCK gwLOCALEr_LOCK +# define GETSERVBYPORT_UNLOCK gwLOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETSERVENT_R +# define GETSERVENT_LOCK LOCALE_READ_LOCK +# define GETSERVENT_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETSERVENT_LOCK gwLOCALEr_LOCK +# define GETSERVENT_UNLOCK gwLOCALEr_UNLOCK +#endif +#ifdef PERL_REENTR_USING_GETSPNAM_R +# define GETSPNAM_LOCK LOCALE_READ_LOCK +# define GETSPNAM_UNLOCK LOCALE_READ_UNLOCK +#else +# define GETSPNAM_LOCK gwLOCALEr_LOCK +# define GETSPNAM_UNLOCK gwLOCALEr_UNLOCK +#endif + +#define STRFMON_LOCK LC_MONETARY_LOCK +#define STRFMON_UNLOCK LC_MONETARY_UNLOCK + +/* End of locale/env synchronization */ + #ifndef PERL_NO_INLINE_FUNCTIONS /* Static inline funcs that depend on includes and declarations above. Some of these reference functions in the perl object files, and some @@ -7239,6 +7807,7 @@ cannot have changed since the precalcula START_EXTERN_C +# include "perlstatic.h" # include "inline.h" # include "sv_inline.h" @@ -7246,23 +7815,6 @@ END_EXTERN_C #endif -/* Some critical sections need to lock both the locale and the environment. - * XXX khw intends to change this to lock both mutexes, but that brings up - * issues of potential deadlock, so should be done at the beginning of a - * development cycle. So for now, it just locks the environment. Note that - * many modern platforms are locale-thread-safe anyway, so locking the locale - * mutex is a no-op anyway */ -#define ENV_LOCALE_LOCK ENV_LOCK -#define ENV_LOCALE_UNLOCK ENV_UNLOCK - -/* And some critical sections care only that no one else is writing either the - * locale nor the environment. XXX Again this is for the future. This can be - * simulated with using COND_WAIT in thread.h */ -#define ENV_LOCALE_READ_LOCK ENV_LOCALE_LOCK -#define ENV_LOCALE_READ_UNLOCK ENV_LOCALE_UNLOCK - -#define Atof my_atof - /* =for apidoc_section $numeric @@ -7359,12 +7911,12 @@ C. #endif #define grok_bin(s,lp,fp,rp) \ - grok_bin_oct_hex(s, lp, fp, rp, 1, _CC_BINDIGIT, 'b') + grok_bin_oct_hex(s, lp, fp, rp, 1, CC_BINDIGIT_, 'b') #define grok_oct(s,lp,fp,rp) \ (*(fp) |= PERL_SCAN_DISALLOW_PREFIX, \ - grok_bin_oct_hex(s, lp, fp, rp, 3, _CC_OCTDIGIT, '\0')) + grok_bin_oct_hex(s, lp, fp, rp, 3, CC_OCTDIGIT_, '\0')) #define grok_hex(s,lp,fp,rp) \ - grok_bin_oct_hex(s, lp, fp, rp, 4, _CC_XDIGIT, 'x') + grok_bin_oct_hex(s, lp, fp, rp, 4, CC_XDIGIT_, 'x') #ifndef PERL_SCRIPT_MODE #define PERL_SCRIPT_MODE "r" @@ -7442,7 +7994,9 @@ C. * "DynaLoader::_guts" XS_VERSION * XXX in the current implementation, this string is ignored. * 2. Declare a typedef named my_cxt_t that is a structure that contains - * all the data that needs to be interpreter-local. + * all the data that needs to be interpreter-local that perl controls. This + * doesn't include things that libc controls, such as the uselocale object + * in Configurations that use it. * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. * 4. Use the MY_CXT_INIT macro such that it is called exactly once * (typically put in the BOOT: section). @@ -7644,7 +8198,7 @@ extern void moncontrol(int); #endif /* ISO 6429 NEL - C1 control NExt Line */ -/* See https://www.unicode.org/reports/tr13/ */ +/* See https://www.unicode.org/unicode/reports/tr13/ */ #define NEXT_LINE_CHAR NEXT_LINE_NATIVE #ifndef PIPESOCK_MODE @@ -7784,7 +8338,7 @@ Allows one ending \0 #define PERL_PV_ESCAPE_NONASCII 0x000400 #define PERL_PV_ESCAPE_FIRSTCHAR 0x000800 -#define PERL_PV_ESCAPE_ALL 0x001000 +#define PERL_PV_ESCAPE_ALL 0x001000 #define PERL_PV_ESCAPE_NOBACKSLASH 0x002000 #define PERL_PV_ESCAPE_NOCLEAR 0x004000 #define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR @@ -7796,6 +8350,18 @@ Allows one ending \0 /* Escape PV with all hex, including NUL. */ #define PERL_PV_ESCAPE_DWIM_ALL_HEX 0x020000 +/* Do not escape word characters, alters meaning of other flags */ +#define PERL_PV_ESCAPE_NON_WC 0x040000 +#define PERL_PV_ESCAPE_TRUNC_MIDDLE 0x080000 + +#define PERL_PV_PRETTY_QUOTEDPREFIX ( \ + PERL_PV_PRETTY_ELLIPSES | \ + PERL_PV_PRETTY_QUOTE | \ + PERL_PV_ESCAPE_NONASCII | \ + PERL_PV_ESCAPE_NON_WC | \ + PERL_PV_ESCAPE_TRUNC_MIDDLE | \ + 0) + /* used by pv_display in dump.c*/ #define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE @@ -8498,6 +9064,69 @@ END_EXTERN_C #endif /* DOUBLE_HAS_NAN */ +/* these are used to faciliate the env var PERL_RAND_SEED, + * which allows consistent behavior from code that calls + * srand() with no arguments, either explicitly or implicitly. + */ +#define PERL_SRAND_OVERRIDE_NEXT() PERL_XORSHIFT32_A(PL_srand_override_next); + +#define PERL_SRAND_OVERRIDE_NEXT_INIT() STMT_START { \ + PL_srand_override = PL_srand_override_next; \ + PERL_SRAND_OVERRIDE_NEXT(); \ +} STMT_END + +#define PERL_SRAND_OVERRIDE_GET(into) STMT_START { \ + into= PL_srand_override; \ + PERL_SRAND_OVERRIDE_NEXT_INIT(); \ +} STMT_END + +#define PERL_SRAND_OVERRIDE_NEXT_CHILD() STMT_START { \ + PERL_XORSHIFT32_B(PL_srand_override_next); \ + PERL_SRAND_OVERRIDE_NEXT_INIT(); \ +} STMT_END + +#define PERL_SRAND_OVERRIDE_NEXT_PARENT() \ + PERL_SRAND_OVERRIDE_NEXT() + +/* in something like + * + * perl -le'sub f { eval "BEGIN{ f() }" }' + * + * Each iteration chews up 8 stacks frames, and we will eventually SEGV + * due to C stack overflow. + * + * This define provides a maximum limit to prevent the SEGV. Such code is + * unusual, so it unlikely we need a very large number here. + */ +#ifndef PERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT +#define PERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT 1000 +#endif +/* ${^MAX_NESTED_EVAL_BEGIN_BLOCKS} */ +#define PERL_VAR_MAX_NESTED_EVAL_BEGIN_BLOCKS "\015AX_NESTED_EVAL_BEGIN_BLOCKS" + +/* Defines like this make it easier to do porting/diag.t. They are no- + * ops that return their argument which can be used to hint to diag.t + * that a string is actually an error message. By putting the category + * information into the macro name it considerably simplifies extended + * diag.t to support these cases. Feel free to add more. + * + * While it seems tempting to try to convert all of our diagnostics to + * this format, it would miss part of the point of diag.t in that it + * detects NEW diagnostics, which would not necessarily use these + * macros. The macros instead exist where we know we have an error + * message that isnt being picked up by diag.t because it is declared + * as a string independently of the function it is fed to, something + * diag.t can never handle right without help. + */ +#define PERL_DIAG_STR_(x) ("" x "") +#define PERL_DIAG_WARN_SYNTAX(x) PERL_DIAG_STR_(x) +#define PERL_DIAG_DIE_SYNTAX(x) PERL_DIAG_STR_(x) + +#ifndef PERL_STOP_PARSING_AFTER_N_ERRORS +#define PERL_STOP_PARSING_AFTER_N_ERRORS 10 +#endif + +#define PERL_PARSE_ERROR_COUNT(f) (f) /* Index: gnu/usr.bin/perl/perl_inc_macro.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perl_inc_macro.h,v diff -u -p -a -u -p -r1.1.1.2 perl_inc_macro.h --- gnu/usr.bin/perl/perl_inc_macro.h 15 Feb 2023 01:31:58 -0000 1.1.1.2 +++ gnu/usr.bin/perl/perl_inc_macro.h 21 Feb 2024 15:47:02 -0000 @@ -89,18 +89,9 @@ /* submacros for INCPUSH_PERL5LIB */ -#if defined(PERL_USE_SAFE_PUTENV) && ! defined(HAS_UNSETENV) -# define _INCPUSH_PERL5LIB_IF if (perl5lib && *perl5lib != '\0') -#else -# define _INCPUSH_PERL5LIB_IF if (perl5lib) -#endif +#define _INCPUSH_PERL5LIB_IF if (perl5lib && *perl5lib != '\0') #ifndef VMS -/* - * It isn't possible to delete an environment variable with - * PERL_USE_SAFE_PUTENV set unless unsetenv() is also available, so in that - * case we treat PERL5LIB as undefined if it has a zero-length value. - */ # define _INCPUSH_PERL5LIB_ADD _INCPUSH_PERL5LIB_IF incpush_use_sep(perl5lib, 0, INCPUSH_ADD_OLD_VERS|INCPUSH_NOT_BASEDIR); #else /* VMS */ Index: gnu/usr.bin/perl/perlapi.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perlapi.h,v diff -u -p -a -u -p -r1.7 perlapi.h --- gnu/usr.bin/perl/perlapi.h 15 Feb 2023 01:36:13 -0000 1.7 +++ gnu/usr.bin/perl/perlapi.h 21 Feb 2024 15:47:02 -0000 @@ -13,7 +13,7 @@ /* * This file used to declare accessor functions for Perl variables * when PERL_GLOBAL_STRUCT was enabled, but that no longer exists. - * This file is kept for backwards compatiblity with XS code that + * This file is kept for backwards compatibility with XS code that * might include it. */ #ifndef __perlapi_h__ Index: gnu/usr.bin/perl/perlio.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perlio.c,v diff -u -p -a -u -p -r1.22 perlio.c --- gnu/usr.bin/perl/perlio.c 15 Feb 2023 01:36:13 -0000 1.22 +++ gnu/usr.bin/perl/perlio.c 21 Feb 2024 15:47:02 -0000 @@ -53,7 +53,7 @@ # include #endif -#define PerlIO_lockcnt(f) (((PerlIOl*)(f))->head->flags) +#define PerlIO_lockcnt(f) (((PerlIOl*)(void*)(f))->head->flags) /* Call the callback or PerlIOBase, and return failure. */ #define Perl_PerlIO_or_Base(f, callback, base, failure, args) \ @@ -294,7 +294,7 @@ PerlIO_openn(pTHX_ const char *layers, c } } else { - return PerlIO_fdopen(fd, (char *) mode); + return PerlIO_fdopen(fd, mode); } return NULL; } @@ -362,14 +362,17 @@ PerlIO_debug(const char *fmt, ...) const char * const s = CopFILE(PL_curcop); /* Use fixed buffer as sv_catpvf etc. needs SVs */ char buffer[1024]; - const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" IVdf " ", s ? s : "(none)", (IV) CopLINE(PL_curcop)); + const STRLEN len1 = my_snprintf(buffer, sizeof(buffer), "%.40s:%" LINE_Tf " ", s ? s : "(none)", CopLINE(PL_curcop)); # ifdef USE_QUADMATH # ifdef HAS_VSNPRINTF /* my_vsnprintf() isn't available with quadmath, but the native vsnprintf() should be, otherwise the system isn't likely to support quadmath. Nothing should be calling PerlIO_debug() with floating point anyway. */ + DECLARATION_FOR_LC_NUMERIC_MANIPULATION; + STORE_LC_NUMERIC_SET_TO_NEEDED(); const STRLEN len2 = vsnprintf(buffer + len1, sizeof(buffer) - len1, fmt, ap); + RESTORE_LC_NUMERIC(); # else STATIC_ASSERT_STMT(0); # endif @@ -380,8 +383,8 @@ PerlIO_debug(const char *fmt, ...) #else const char *s = CopFILE(PL_curcop); STRLEN len; - SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" IVdf " ", s ? s : "(none)", - (IV) CopLINE(PL_curcop)); + SV * const sv = Perl_newSVpvf(aTHX_ "%s:%" LINE_Tf " ", + s ? s : "(none)", CopLINE(PL_curcop)); Perl_sv_vcatpvf(aTHX_ sv, fmt, &ap); s = SvPV_const(sv, len); @@ -416,7 +419,7 @@ PerlIO_verify_head(pTHX_ PerlIO *f) assert(p); do { assert(p->head == head); - if (p == (PerlIOl*)f) + if (&p->next == f) seen = 1; p = p->next; } while (p); @@ -446,14 +449,14 @@ PerlIO * PerlIO_allocate(pTHX) { /* - * Find a free slot in the table, allocating new table as necessary + * Find a free slot in the table, allocating new tables as necessary */ PerlIOl **last; PerlIOl *f; last = &PL_perlio; while ((f = *last)) { int i; - last = (PerlIOl **) (f); + last = &f->next; for (i = 1; i < PERLIO_TABLE_SIZE; i++) { if (!((++f)->next)) { goto good_exit; @@ -464,13 +467,13 @@ PerlIO_allocate(pTHX) if (!f) { return NULL; } - *last = (PerlIOl*) f++; + *last = f++; good_exit: f->flags = 0; /* lockcnt */ f->tab = NULL; f->head = f; - return (PerlIO*) f; + return &f->next; } #undef PerlIO_fdupopen @@ -498,7 +501,7 @@ PerlIO_cleantable(pTHX_ PerlIOl **tablep PerlIOl * const table = *tablep; if (table) { int i; - PerlIO_cleantable(aTHX_(PerlIOl **) & (table[0])); + PerlIO_cleantable(aTHX_ &table[0].next); for (i = PERLIO_TABLE_SIZE - 1; i > 0; i--) { PerlIOl * const f = table + i; if (f->next) { @@ -592,7 +595,8 @@ PerlIO_clone(pTHX_ PerlInterpreter *prot DEBUG_i( PerlIO_debug("Clone %p from %p\n",(void*)aTHX,(void*)proto) ); while ((f = *table)) { int i; - table = (PerlIOl **) (f++); + table = &f->next; + f++; for (i = 1; i < PERLIO_TABLE_SIZE; i++) { if (f->next) { (void) fp_dup(&(f->next), 0, param); @@ -617,7 +621,8 @@ PerlIO_destruct(pTHX) #endif while ((f = *table)) { int i; - table = (PerlIOl **) (f++); + table = &f->next; + f++; for (i = 1; i < PERLIO_TABLE_SIZE; i++) { PerlIO *x = &(f->next); const PerlIOl *l; @@ -690,9 +695,9 @@ PerlIO_get_layers(pTHX_ PerlIO *f) newSVpv(l->tab->name, 0) : &PL_sv_undef; SV * const arg = l->tab && l->tab->Getarg ? (*l->tab->Getarg)(aTHX_ &l, 0, 0) : &PL_sv_undef; - av_push(av, name); - av_push(av, arg); - av_push(av, newSViv((IV)l->flags)); + av_push_simple(av, name); + av_push_simple(av, arg); + av_push_simple(av, newSViv((IV)l->flags)); l = l->next; } } @@ -818,7 +823,7 @@ XS(XS_io_MODIFY_SCALAR_ATTRIBUTES) const char * const name = SvPV_const(ST(i), len); SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1); if (layer) { - av_push(av, SvREFCNT_inc_simple_NN(layer)); + av_push_simple(av, SvREFCNT_inc_simple_NN(layer)); } else { ST(count) = ST(i); @@ -1441,7 +1446,7 @@ PerlIO_resolve_layers(pTHX_ const char * } /* * Don't fail if handler cannot be found :via(...) etc. may do - * something sensible else we will just stringfy and open + * something sensible else we will just stringify and open * resulting string. */ } @@ -1628,7 +1633,8 @@ Perl_PerlIO_flush(pTHX_ PerlIO *f) int code = 0; while ((ff = *table)) { int i; - table = (PerlIOl **) (ff++); + table = &ff->next; + ff++; for (i = 1; i < PERLIO_TABLE_SIZE; i++) { if (ff->next && PerlIO_flush(&(ff->next)) != 0) code = -1; @@ -1646,7 +1652,8 @@ PerlIOBase_flush_linebuf(pTHX) PerlIOl *f; while ((f = *table)) { int i; - table = (PerlIOl **) (f++); + table = &f->next; + f++; for (i = 1; i < PERLIO_TABLE_SIZE; i++) { if (f->next && (PerlIOBase(&(f->next))-> @@ -4831,7 +4838,7 @@ Perl_PerlIO_stdin(pTHX) if (!PL_perlio) { PerlIO_stdstreams(aTHX); } - return (PerlIO*)&PL_perlio[1]; + return &PL_perlio[1].next; } PerlIO * @@ -4840,7 +4847,7 @@ Perl_PerlIO_stdout(pTHX) if (!PL_perlio) { PerlIO_stdstreams(aTHX); } - return (PerlIO*)&PL_perlio[2]; + return &PL_perlio[2].next; } PerlIO * @@ -4849,7 +4856,7 @@ Perl_PerlIO_stderr(pTHX) if (!PL_perlio) { PerlIO_stdstreams(aTHX); } - return (PerlIO*)&PL_perlio[3]; + return &PL_perlio[3].next; } /*--------------------------------------------------------------------------------------*/ Index: gnu/usr.bin/perl/perlio.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perlio.h,v diff -u -p -a -u -p -r1.15 perlio.h --- gnu/usr.bin/perl/perlio.h 15 Feb 2023 01:36:13 -0000 1.15 +++ gnu/usr.bin/perl/perlio.h 21 Feb 2024 15:47:02 -0000 @@ -32,7 +32,7 @@ # error "stdio is no longer supported as the default base layer -- use perlio." #endif -/* -------------------- End of Configure controls ---------------------------- */ +/*-------------------- End of Configure controls ---------------------------*/ /* * Although we may not want stdio to be used including here Index: gnu/usr.bin/perl/perlstatic.h =================================================================== RCS file: gnu/usr.bin/perl/perlstatic.h diff -N gnu/usr.bin/perl/perlstatic.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/perlstatic.h 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,33 @@ +/* perlstatic.h + * + * 'I don't know half of you half as well as I should like; and I like less + * than half of you half as well as you deserve.' + * + * Copyright (C) 2020 by Larry Wall and others + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the README file. + * + * This file is a home for static functions that we don't consider suitable for + * inlining, but for which giving the compiler full knowledge of may be + * advantageous. Functions that have potential tail call optimizations are a + * likely component. + + */ + +/* saves machine code for a common noreturn idiom typically used in Newx*() */ +GCC_DIAG_IGNORE_DECL(-Wunused-function); + +STATIC void +Perl_croak_memory_wrap(void) +{ + Perl_croak_nocontext("%s",PL_memory_wrap); +} + +GCC_DIAG_RESTORE_DECL; + + +/* + * ex: set ts=8 sts=4 sw=4 et: + */ + Index: gnu/usr.bin/perl/perlvars.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perlvars.h,v diff -u -p -a -u -p -r1.10 perlvars.h --- gnu/usr.bin/perl/perlvars.h 15 Feb 2023 01:36:13 -0000 1.10 +++ gnu/usr.bin/perl/perlvars.h 21 Feb 2024 15:47:02 -0000 @@ -48,10 +48,6 @@ PERLVAR(G, thr_key, perl_key) /* key to /* XXX does anyone even use this? */ PERLVARI(G, do_undump, bool, FALSE) /* -u or dump seen? */ -#ifndef PERL_USE_SAFE_PUTENV -PERLVARI(G, use_safe_putenv, bool, TRUE) -#endif - #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS) PERLVARI(G, sig_handlers_initted, int, 0) #endif @@ -106,13 +102,10 @@ PERLVARI(G, mmap_page_size, IV, 0) PERLVAR(G, hints_mutex, perl_mutex) /* Mutex for refcounted he refcounting */ PERLVAR(G, env_mutex, perl_RnW1_mutex_t) /* Mutex for accessing ENV */ PERLVAR(G, locale_mutex, perl_mutex) /* Mutex related to locale handling */ -# ifndef USE_THREAD_SAFE_LOCALE -PERLVAR(G, lc_numeric_mutex, perl_mutex) /* Mutex for switching LC_NUMERIC */ -# endif #endif #ifdef USE_POSIX_2008_LOCALE -PERLVAR(G, C_locale_obj, locale_t) +PERLVARI(G, C_locale_obj, locale_t, NULL) #endif PERLVARI(G, watch_pvx, char *, NULL) @@ -176,6 +169,7 @@ PERLVAR(G, check_mutex, perl_mutex) /* M #ifdef MULTIPLICITY # ifdef USE_ITHREADS PERLVAR(G, my_ctx_mutex, perl_mutex) +PERLVARI(G, veto_switch_non_tTHX_context, int, FALSE) # endif PERLVARI(G, my_cxt_index, int, 0) #endif @@ -241,10 +235,107 @@ Instead, use the function L This API exists entirely for the purpose of making the CPAN module +C work. It is not expected that additional modules will make +use of it; rather, that they should use C to provide parsing +of new infix operators. + +Function pointer, pointing at a function used to handle extended infix +operators. The function should be declared as + + int infix_plugin_function(pTHX_ + char *opname, STRLEN oplen, + struct Perl_custom_infix **infix_ptr) + +The function is called from the tokenizer whenever a possible infix operator +is seen. C points to the operator name in the parser's input buffer, +and C gives the I number of bytes of it that should be +consumed; it is not null-terminated. The function is expected to examine the +operator name and possibly other state such as L<%^H|perlvar/%^H>, to +determine whether it wants to handle the operator name. + +As compared to the single stage of C, parsing of additional +infix operators occurs in three separate stages. This is because of the more +complex interactions it has with the parser, to ensure that operator +precedence rules work correctly. These stages are co-ordinated by the use of +an additional information structure. + +If the function wants to handle the infix operator, it must set the variable +pointed to by C to the address of a structure that provides this +additional information about the subsequent parsing stages. If it does not, +it should make a call to the next function in the chain. + +This structure has the following definition: + + struct Perl_custom_infix { + enum Perl_custom_infix_precedence prec; + void (*parse)(pTHX_ SV **opdata, + struct Perl_custom_infix *); + OP *(*build_op)(pTHX_ SV **opdata, OP *lhs, OP *rhs, + struct Perl_custom_infix *); + }; + +The function must then return an integer giving the number of bytes consumed +by the name of this operator. In the case of an operator whose name is +composed of identifier characters, this must be equal to C. In the case +of an operator named by non-identifier characters, this is permitted to be +shorter than C, and any additional characters after it will not be +claimed by the infix operator but instead will be consumed by the tokenizer +and parser as normal. + +If the optional C function is provided, it is called immediately by the +parser to let the operator's definition consume any additional syntax from the +source code. This should I be used for normal operand parsing, but it may +be useful when implementing things like parametric operators or meta-operators +that consume more syntax themselves. This function may use the variable +pointed to by C to provide an SV containing additional data to be +passed into the C function later on. + +The information structure gives the operator precedence level in the C +field. This is used to tell the parser how much of the surrounding syntax +before and after should be considered as operands to the operator. + +The tokenizer and parser will then continue to operate as normal until enough +additional input has been parsed to form both the left- and right-hand side +operands to the operator, according to the precedence level. At this point the +C function is called, being passed the left- and right-hand operands +as optree fragments. It is expected to combine them into the resulting optree +fragment, which it should return. + +After the C function has returned, if the variable pointed to by +C was set to a non-C value, it will then be destroyed by calling +C. + +For thread safety, modules should not set this variable directly. +Instead, use the function L. + +However, that all said, the introductory note above still applies. This +variable is provided in core perl only for the benefit of the +C module. That module acts as a central registry for infix +operators, automatically handling things like deparse support and +discovery/reflection, and these abilities only work because it knows all the +registered operators. Other modules should not use this interpreter variable +directly to implement them because then those central features would no longer +work properly. + +Furthermore, it is likely that this (experimental) API will be replaced in a +future Perl version by a more complete API that fully implements the central +registry and other semantics currently provided by C, once +the module has had sufficient experimental testing time. This current +mechanism exists only as an interim measure to get to that stage. + +=cut +*/ + +PERLVARI(G, infix_plugin, Perl_infix_plugin_t, Perl_infix_plugin_standard) + PERLVARI(G, op_sequence, HV *, NULL) /* dump.c */ PERLVARI(G, op_seq, UV, 0) /* dump.c */ @@ -264,12 +355,13 @@ PERLVAR(G, malloc_mutex, perl_mutex) /* #endif PERLVARI(G, hash_seed_set, bool, FALSE) /* perl.c */ -PERLVARA(G, hash_seed_w, PERL_HASH_SEED_WORDS, __PERL_HASH_WORD_TYPE) /* perl.c and hv.h */ +PERLVARA(G, hash_seed_w, PERL_HASH_SEED_WORDS, PVT__PERL_HASH_WORD_TYPE) /* perl.c and hv.h */ #if defined(PERL_HASH_STATE_BYTES) -PERLVARA(G, hash_state_w, PERL_HASH_STATE_WORDS, __PERL_HASH_WORD_TYPE) /* perl.c and hv.h */ +PERLVARA(G, hash_state_w, PERL_HASH_STATE_WORDS, PVT__PERL_HASH_WORD_TYPE) /* perl.c and hv.h */ #endif #if defined(PERL_USE_SINGLE_CHAR_HASH_CACHE) -PERLVARA(G, hash_chars, (1+256) * sizeof(U32), unsigned char) /* perl.c and hv.h */ +#define PERL_SINGLE_CHAR_HASH_CACHE_ELEMS ((1+256) * sizeof(U32)) +PERLVARA(G, hash_chars, PERL_SINGLE_CHAR_HASH_CACHE_ELEMS, unsigned char) /* perl.c and hv.h */ #endif /* The path separator can vary depending on whether we're running under DCL or @@ -305,3 +397,6 @@ PERLVARI(G, strategy_socket, int, 0) PERLVARI(G, strategy_accept, int, 0) /* doio.c */ PERLVARI(G, strategy_pipe, int, 0) /* doio.c */ PERLVARI(G, strategy_socketpair, int, 0) /* doio.c */ + +PERLVARI(G, my_environ, char **, NULL) +PERLVARI(G, origenviron, char **, NULL) Index: gnu/usr.bin/perl/perly.act =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perly.act,v diff -u -p -a -u -p -r1.6 perly.act --- gnu/usr.bin/perl/perly.act 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/perly.act 21 Feb 2024 15:47:02 -0000 @@ -1,12 +1,12 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by regen_perly.pl from perly.y. Any changes made here will be lost! */ case 2: -#line 140 "perly.y" - { +#line 161 "perly.y" + { parser->expect = XSTATE; (yyval.ival) = 0; } @@ -14,8 +14,8 @@ case 2: break; case 3: -#line 145 "perly.y" - { +#line 166 "perly.y" + { newPROG(block_end((ps[-1].val.ival),(ps[0].val.opval))); PL_compiling.cop_seq = 0; (yyval.ival) = 0; @@ -24,8 +24,8 @@ case 2: break; case 4: -#line 151 "perly.y" - { +#line 172 "perly.y" + { parser->expect = XTERM; (yyval.ival) = 0; } @@ -33,8 +33,8 @@ case 2: break; case 5: -#line 156 "perly.y" - { +#line 177 "perly.y" + { PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; } @@ -42,8 +42,8 @@ case 2: break; case 6: -#line 161 "perly.y" - { +#line 182 "perly.y" + { parser->expect = XBLOCK; (yyval.ival) = 0; } @@ -51,8 +51,8 @@ case 2: break; case 7: -#line 166 "perly.y" - { +#line 187 "perly.y" + { PL_pad_reset_pending = TRUE; PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; @@ -63,8 +63,8 @@ case 2: break; case 8: -#line 174 "perly.y" - { +#line 195 "perly.y" + { parser->expect = XSTATE; (yyval.ival) = 0; } @@ -72,8 +72,8 @@ case 2: break; case 9: -#line 179 "perly.y" - { +#line 200 "perly.y" + { PL_pad_reset_pending = TRUE; PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; @@ -84,8 +84,8 @@ case 2: break; case 10: -#line 187 "perly.y" - { +#line 208 "perly.y" + { parser->expect = XSTATE; (yyval.ival) = 0; } @@ -93,8 +93,8 @@ case 2: break; case 11: -#line 192 "perly.y" - { +#line 213 "perly.y" + { PL_pad_reset_pending = TRUE; PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; @@ -105,8 +105,8 @@ case 2: break; case 12: -#line 200 "perly.y" - { +#line 221 "perly.y" + { parser->expect = XSTATE; (yyval.ival) = 0; } @@ -114,8 +114,8 @@ case 2: break; case 13: -#line 205 "perly.y" - { +#line 226 "perly.y" + { PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; } @@ -123,8 +123,8 @@ case 2: break; case 14: -#line 210 "perly.y" - { +#line 231 "perly.y" + { parser->expect = XSTATE; (yyval.ival) = 0; } @@ -132,8 +132,8 @@ case 2: break; case 15: -#line 215 "perly.y" - { +#line 236 "perly.y" + { PL_eval_root = (ps[0].val.opval); (yyval.ival) = 0; } @@ -141,55 +141,85 @@ case 2: break; case 16: -#line 223 "perly.y" - { if (parser->copline > (line_t)(ps[-3].val.ival)) +#line 245 "perly.y" + { (yyval.ival) = KW_SUB_named_sig; } + + break; + + case 17: +#line 247 "perly.y" + { (yyval.ival) = KW_METHOD_named; } + + break; + + case 18: +#line 252 "perly.y" + { if (parser->copline > (line_t)(ps[-3].val.ival)) parser->copline = (line_t)(ps[-3].val.ival); (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval)); } break; - case 17: -#line 230 "perly.y" - { (yyval.opval) = NULL; } + case 19: +#line 259 "perly.y" + { (yyval.opval) = NULL; } break; - case 18: -#line 235 "perly.y" - { if (parser->copline > (line_t)(ps[-6].val.ival)) + case 20: +#line 264 "perly.y" + { if (parser->copline > (line_t)(ps[-6].val.ival)) parser->copline = (line_t)(ps[-6].val.ival); (yyval.opval) = block_end((ps[-5].val.ival), (ps[-2].val.opval)); } break; - case 19: -#line 242 "perly.y" - { (yyval.ival) = block_start(TRUE); + case 21: +#line 271 "perly.y" + { (yyval.ival) = block_start(TRUE); parser->parsed_sub = 0; } break; - case 20: -#line 247 "perly.y" - { if (parser->copline > (line_t)(ps[-3].val.ival)) + case 22: +#line 276 "perly.y" + { if (parser->copline > (line_t)(ps[-3].val.ival)) parser->copline = (line_t)(ps[-3].val.ival); (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval)); } break; - case 21: -#line 254 "perly.y" - { (yyval.ival) = block_start(FALSE); + case 23: +#line 283 "perly.y" + { (yyval.ival) = block_start(FALSE); parser->parsed_sub = 0; } break; - case 23: -#line 262 "perly.y" - { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval)); + case 25: +#line 292 "perly.y" + { parser->in_my = 1; } + + break; + + case 26: +#line 294 "perly.y" + { parser->in_my = 0; intro_my(); } + + break; + + case 27: +#line 296 "perly.y" + { (yyval.opval) = (ps[-2].val.opval); } + + break; + + case 29: +#line 303 "perly.y" + { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval)); PL_pad_reset_pending = TRUE; if ((ps[-1].val.opval) && (ps[0].val.opval)) PL_hints |= HINT_BLOCK_SCOPE; @@ -197,9 +227,9 @@ case 2: break; - case 25: -#line 273 "perly.y" - { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval)); + case 31: +#line 314 "perly.y" + { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval)); PL_pad_reset_pending = TRUE; if ((ps[-1].val.opval) && (ps[0].val.opval)) PL_hints |= HINT_BLOCK_SCOPE; @@ -207,23 +237,23 @@ case 2: break; - case 26: -#line 282 "perly.y" - { + case 32: +#line 323 "perly.y" + { (yyval.opval) = (ps[0].val.opval) ? newSTATEOP(0, NULL, (ps[0].val.opval)) : NULL; } break; - case 27: -#line 286 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 33: +#line 327 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 28: -#line 290 "perly.y" - { + case 34: +#line 331 "perly.y" + { SV *label = cSVOPx_sv((ps[-1].val.opval)); (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8, savepv(SvPVX_const(label)), (ps[0].val.opval)); @@ -232,9 +262,9 @@ case 2: break; - case 29: -#line 297 "perly.y" - { + case 35: +#line 338 "perly.y" + { SV *label = cSVOPx_sv((ps[-1].val.opval)); (yyval.opval) = newSTATEOP(SvFLAGS(label) & SVf_UTF8, savepv(SvPVX_const(label)), (ps[0].val.opval)); @@ -243,15 +273,15 @@ case 2: break; - case 30: -#line 307 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 36: +#line 348 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 31: -#line 309 "perly.y" - { + case 37: +#line 350 "perly.y" + { CV *fmtcv = PL_compcv; newFORM((ps[-2].val.ival), (ps[-1].val.opval), (ps[0].val.opval)); (yyval.opval) = NULL; @@ -263,9 +293,9 @@ case 2: break; - case 32: -#line 321 "perly.y" - { + case 38: +#line 362 "perly.y" + { init_named_cv(PL_compcv, (ps[-1].val.opval)); parser->in_my = 0; parser->in_my_stash = NULL; @@ -273,9 +303,9 @@ case 2: break; - case 33: -#line 327 "perly.y" - { + case 39: +#line 368 "perly.y" + { SvREFCNT_inc_simple_void(PL_compcv); (ps[-5].val.opval)->op_type == OP_CONST ? newATTRSUB((ps[-4].val.ival), (ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)) @@ -288,23 +318,29 @@ case 2: break; - case 34: -#line 342 "perly.y" - { + case 40: +#line 383 "perly.y" + { init_named_cv(PL_compcv, (ps[-1].val.opval)); + if((ps[-2].val.ival) == KW_METHOD_named) { + croak_kw_unless_class("method"); + class_prepare_method_parse(PL_compcv); + } parser->in_my = 0; parser->in_my_stash = NULL; } break; - case 35: -#line 348 "perly.y" - { + case 41: +#line 393 "perly.y" + { + OP *body = (ps[0].val.opval); + SvREFCNT_inc_simple_void(PL_compcv); (ps[-4].val.opval)->op_type == OP_CONST - ? newATTRSUB((ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), (ps[0].val.opval)) - : newMYSUB( (ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), (ps[0].val.opval)) + ? newATTRSUB((ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), body) + : newMYSUB( (ps[-3].val.ival), (ps[-4].val.opval), NULL, (ps[-1].val.opval), body) ; (yyval.opval) = NULL; intro_my(); @@ -313,9 +349,43 @@ case 2: break; - case 36: -#line 359 "perly.y" - { + case 42: +#line 406 "perly.y" + { + switch((ps[-1].val.ival)) { + case KEY_ADJUST: + croak_kw_unless_class("ADJUST"); + class_prepare_method_parse(PL_compcv); + break; + default: + NOT_REACHED; + } + } + + break; + + case 43: +#line 417 "perly.y" + { + OP *body = (ps[0].val.opval); + SvREFCNT_inc_simple_void(PL_compcv); + + CV *cv; + + switch((ps[-3].val.ival)) { + case KEY_ADJUST: + cv = newATTRSUB((ps[-2].val.ival), NULL, NULL, NULL, body); + class_add_ADJUST(PL_curstash, cv); + break; + } + (yyval.opval) = NULL; + } + + break; + + case 44: +#line 436 "perly.y" + { package((ps[-1].val.opval)); if ((ps[-2].val.opval)) package_version((ps[-2].val.opval)); @@ -324,15 +394,30 @@ case 2: break; - case 37: -#line 366 "perly.y" - { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } + case 45: +#line 443 "perly.y" + { + package((ps[-2].val.opval)); + if ((ps[-3].val.opval)) + package_version((ps[-3].val.opval)); + (yyval.opval) = NULL; + class_setup_stash(PL_curstash); + if ((ps[-1].val.opval)) { + class_apply_attributes(PL_curstash, (ps[-1].val.opval)); + } + } break; - case 38: -#line 368 "perly.y" - { + case 46: +#line 454 "perly.y" + { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } + + break; + + case 47: +#line 458 "perly.y" + { SvREFCNT_inc_simple_void(PL_compcv); utilize((ps[-6].val.ival), (ps[-5].val.ival), (ps[-3].val.opval), (ps[-2].val.opval), (ps[-1].val.opval)); parser->parsed_sub = 1; @@ -341,9 +426,9 @@ case 2: break; - case 39: -#line 375 "perly.y" - { + case 48: +#line 465 "perly.y" + { (yyval.opval) = block_end((ps[-4].val.ival), newCONDOP(0, (ps[-3].val.opval), op_scope((ps[-1].val.opval)), (ps[0].val.opval))); parser->copline = (line_t)(ps[-6].val.ival); @@ -351,9 +436,9 @@ case 2: break; - case 40: -#line 381 "perly.y" - { + case 49: +#line 471 "perly.y" + { (yyval.opval) = block_end((ps[-4].val.ival), newCONDOP(0, (ps[-3].val.opval), (ps[0].val.opval), op_scope((ps[-1].val.opval)))); parser->copline = (line_t)(ps[-6].val.ival); @@ -361,30 +446,30 @@ case 2: break; - case 41: -#line 387 "perly.y" - { + case 50: +#line 477 "perly.y" + { (yyval.opval) = block_end((ps[-3].val.ival), newGIVENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)), 0)); parser->copline = (line_t)(ps[-5].val.ival); } break; - case 42: -#line 392 "perly.y" - { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); } + case 51: +#line 482 "perly.y" + { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); } break; - case 43: -#line 394 "perly.y" - { (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); } + case 52: +#line 484 "perly.y" + { (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); } break; - case 44: -#line 396 "perly.y" - { + case 53: +#line 486 "perly.y" + { (yyval.opval) = block_end((ps[-5].val.ival), newWHILEOP(0, 1, NULL, (ps[-4].val.opval), (ps[-1].val.opval), (ps[0].val.opval), (ps[-2].val.ival))); @@ -393,9 +478,9 @@ case 2: break; - case 45: -#line 403 "perly.y" - { + case 54: +#line 493 "perly.y" + { (yyval.opval) = block_end((ps[-5].val.ival), newWHILEOP(0, 1, NULL, (ps[-4].val.opval), (ps[-1].val.opval), (ps[0].val.opval), (ps[-2].val.ival))); @@ -404,21 +489,21 @@ case 2: break; - case 46: -#line 410 "perly.y" - { parser->expect = XTERM; } + case 55: +#line 500 "perly.y" + { parser->expect = XTERM; } break; - case 47: -#line 412 "perly.y" - { parser->expect = XTERM; } + case 56: +#line 502 "perly.y" + { parser->expect = XTERM; } break; - case 48: -#line 415 "perly.y" - { + case 57: +#line 505 "perly.y" + { OP *initop = (ps[-9].val.opval); OP *forop = newWHILEOP(0, 1, NULL, scalar((ps[-6].val.opval)), (ps[0].val.opval), (ps[-2].val.opval), (ps[-3].val.ival)); @@ -435,18 +520,18 @@ case 2: break; - case 49: -#line 430 "perly.y" - { + case 58: +#line 520 "perly.y" + { (yyval.opval) = block_end((ps[-6].val.ival), newFOROP(0, (ps[-5].val.opval), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))); parser->copline = (line_t)(ps[-8].val.ival); } break; - case 50: -#line 435 "perly.y" - { + case 59: +#line 525 "perly.y" + { if ((ps[-6].val.opval)->op_type == OP_PADSV) /* degenerate case of 1 var: for my ($x) .... Flag it so it can be special-cased in newFOROP */ @@ -457,9 +542,9 @@ case 2: break; - case 51: -#line 444 "perly.y" - { + case 60: +#line 534 "perly.y" + { (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(0, op_lvalue((ps[-6].val.opval), OP_ENTERLOOP), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))); parser->copline = (line_t)(ps[-7].val.ival); @@ -467,15 +552,15 @@ case 2: break; - case 52: -#line 450 "perly.y" - { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } + case 61: +#line 540 "perly.y" + { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } break; - case 53: -#line 452 "perly.y" - { + case 62: +#line 542 "perly.y" + { (yyval.opval) = block_end( (ps[-7].val.ival), newFOROP(0, @@ -490,9 +575,9 @@ case 2: break; - case 54: -#line 465 "perly.y" - { + case 63: +#line 555 "perly.y" + { (yyval.opval) = block_end((ps[-4].val.ival), newFOROP( 0, op_lvalue(newUNOP(OP_REFGEN, 0, (ps[-6].val.opval)), @@ -502,9 +587,9 @@ case 2: break; - case 55: -#line 473 "perly.y" - { + case 64: +#line 563 "perly.y" + { (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(0, NULL, (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval))); parser->copline = (line_t)(ps[-6].val.ival); @@ -512,33 +597,32 @@ case 2: break; - case 56: -#line 479 "perly.y" - { parser->in_my = 1; } - - break; - - case 57: -#line 481 "perly.y" - { parser->in_my = 0; intro_my(); } + case 65: +#line 569 "perly.y" + { + if(!(ps[0].val.opval)) { + yyerror("catch block requires a (VAR)"); + YYERROR; + } + } break; - case 58: -#line 483 "perly.y" - { + case 66: +#line 576 "perly.y" + { (yyval.opval) = newTRYCATCHOP(0, - (ps[-9].val.opval), (ps[-4].val.opval), block_end((ps[-5].val.ival), op_scope((ps[-1].val.opval)))); + (ps[-6].val.opval), (ps[-3].val.opval), block_end((ps[-4].val.ival), op_scope((ps[-1].val.opval)))); if((ps[0].val.opval)) (yyval.opval) = op_wrap_finally((yyval.opval), (ps[0].val.opval)); - parser->copline = (line_t)(ps[-10].val.ival); + parser->copline = (line_t)(ps[-7].val.ival); } break; - case 59: -#line 491 "perly.y" - { + case 67: +#line 584 "perly.y" + { /* a block is a loop that happens once */ (yyval.opval) = newWHILEOP(0, 1, NULL, NULL, (ps[-1].val.opval), (ps[0].val.opval), 0); @@ -546,9 +630,9 @@ case 2: break; - case 60: -#line 497 "perly.y" - { + case 68: +#line 590 "perly.y" + { package((ps[-2].val.opval)); if ((ps[-3].val.opval)) { package_version((ps[-3].val.opval)); @@ -557,9 +641,9 @@ case 2: break; - case 61: -#line 504 "perly.y" - { + case 69: +#line 597 "perly.y" + { /* a block is a loop that happens once */ (yyval.opval) = newWHILEOP(0, 1, NULL, NULL, block_end((ps[-3].val.ival), (ps[-1].val.opval)), NULL, 0); @@ -569,43 +653,80 @@ case 2: break; - case 62: -#line 512 "perly.y" - { + case 70: +#line 605 "perly.y" + { + package((ps[-3].val.opval)); + + if ((ps[-4].val.opval)) { + package_version((ps[-4].val.opval)); + } + class_setup_stash(PL_curstash); + if ((ps[-2].val.opval)) { + class_apply_attributes(PL_curstash, (ps[-2].val.opval)); + } + } + + break; + + case 71: +#line 617 "perly.y" + { + /* a block is a loop that happens once */ + (yyval.opval) = newWHILEOP(0, 1, NULL, + NULL, block_end((ps[-3].val.ival), (ps[-1].val.opval)), NULL, 0); + if (parser->copline > (line_t)(ps[-4].val.ival)) + parser->copline = (line_t)(ps[-4].val.ival); + } + + break; + + case 72: +#line 625 "perly.y" + { (yyval.opval) = (ps[-1].val.opval); } break; - case 63: -#line 516 "perly.y" - { + case 73: +#line 629 "perly.y" + { + (yyval.opval) = (ps[-1].val.opval); + } + + break; + + case 74: +#line 633 "perly.y" + { (yyval.opval) = newDEFEROP(0, op_scope((ps[0].val.opval))); } break; - case 64: -#line 520 "perly.y" - { + case 75: +#line 637 "perly.y" + { + /* diag_listed_as: Unimplemented */ (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), newSVOP(OP_CONST, 0, newSVpvs("Unimplemented"))); } break; - case 65: -#line 525 "perly.y" - { + case 76: +#line 643 "perly.y" + { (yyval.opval) = NULL; parser->copline = NOLINE; } break; - case 66: -#line 533 "perly.y" - { OP *list; + case 77: +#line 651 "perly.y" + { OP *list; if ((ps[0].val.opval)) { OP *term = (ps[0].val.opval); list = op_append_elem(OP_LIST, (ps[-1].val.opval), term); @@ -622,73 +743,73 @@ case 2: break; - case 68: -#line 552 "perly.y" - { (yyval.opval) = op_unscope((ps[-1].val.opval)); } + case 79: +#line 670 "perly.y" + { (yyval.opval) = op_unscope((ps[-1].val.opval)); } break; - case 70: -#line 560 "perly.y" - { (yyval.opval) = NULL; } + case 81: +#line 678 "perly.y" + { (yyval.opval) = NULL; } break; - case 71: -#line 562 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 82: +#line 680 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 72: -#line 564 "perly.y" - { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); } + case 83: +#line 682 "perly.y" + { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); } break; - case 73: -#line 566 "perly.y" - { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); } + case 84: +#line 684 "perly.y" + { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); } break; - case 74: -#line 568 "perly.y" - { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); } + case 85: +#line 686 "perly.y" + { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); } break; - case 75: -#line 570 "perly.y" - { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); } + case 86: +#line 688 "perly.y" + { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); } break; - case 76: -#line 572 "perly.y" - { (yyval.opval) = newFOROP(0, NULL, (ps[0].val.opval), (ps[-2].val.opval), NULL); + case 87: +#line 690 "perly.y" + { (yyval.opval) = newFOROP(0, NULL, (ps[0].val.opval), (ps[-2].val.opval), NULL); parser->copline = (line_t)(ps[-1].val.ival); } break; - case 77: -#line 575 "perly.y" - { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); } + case 88: +#line 693 "perly.y" + { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); } break; - case 79: -#line 582 "perly.y" - { + case 90: +#line 700 "perly.y" + { ((ps[0].val.opval))->op_flags |= OPf_PARENS; (yyval.opval) = op_scope((ps[0].val.opval)); } break; - case 80: -#line 587 "perly.y" - { parser->copline = (line_t)(ps[-5].val.ival); + case 91: +#line 705 "perly.y" + { parser->copline = (line_t)(ps[-5].val.ival); (yyval.opval) = newCONDOP(0, newSTATEOP(OPf_SPECIAL,NULL,(ps[-3].val.opval)), op_scope((ps[-1].val.opval)), (ps[0].val.opval)); @@ -697,145 +818,157 @@ case 2: break; - case 82: -#line 599 "perly.y" - { (yyval.opval) = op_scope((ps[0].val.opval)); } + case 93: +#line 717 "perly.y" + { (yyval.opval) = op_scope((ps[0].val.opval)); } break; - case 83: -#line 604 "perly.y" - { (yyval.opval) = NULL; } + case 94: +#line 722 "perly.y" + { (yyval.opval) = NULL; } break; - case 84: -#line 606 "perly.y" - { (yyval.opval) = op_scope((ps[0].val.opval)); } + case 95: +#line 724 "perly.y" + { (yyval.opval) = op_scope((ps[0].val.opval)); } break; - case 85: -#line 611 "perly.y" - { (yyval.ival) = (PL_min_intro_pending && + case 96: +#line 729 "perly.y" + { (yyval.ival) = (PL_min_intro_pending && PL_max_intro_pending >= PL_min_intro_pending); intro_my(); } break; - case 88: -#line 623 "perly.y" - { YYSTYPE tmplval; + case 99: +#line 741 "perly.y" + { YYSTYPE tmplval; (void)scan_num("1", &tmplval); (yyval.opval) = tmplval.opval; } break; - case 90: -#line 631 "perly.y" - { (yyval.opval) = invert(scalar((ps[0].val.opval))); } + case 101: +#line 749 "perly.y" + { (yyval.opval) = invert(scalar((ps[0].val.opval))); } break; - case 91: -#line 636 "perly.y" - { (yyval.opval) = (ps[0].val.opval); intro_my(); } + case 102: +#line 754 "perly.y" + { (yyval.opval) = (ps[0].val.opval); intro_my(); } break; - case 92: -#line 640 "perly.y" - { (yyval.opval) = (ps[0].val.opval); intro_my(); } + case 103: +#line 758 "perly.y" + { (yyval.opval) = (ps[0].val.opval); intro_my(); } break; - case 93: -#line 643 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 104: +#line 761 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 95: -#line 648 "perly.y" - { (yyval.ival) = start_subparse(FALSE, 0); + case 106: +#line 766 "perly.y" + { (yyval.ival) = start_subparse(FALSE, 0); SAVEFREESV(PL_compcv); } break; - case 96: -#line 654 "perly.y" - { (yyval.ival) = start_subparse(FALSE, CVf_ANON); + case 107: +#line 772 "perly.y" + { (yyval.ival) = start_subparse(FALSE, CVf_ANON); SAVEFREESV(PL_compcv); } break; - case 97: -#line 659 "perly.y" - { (yyval.ival) = start_subparse(TRUE, 0); + case 108: +#line 777 "perly.y" + { (yyval.ival) = start_subparse(FALSE, CVf_ANON|CVf_IsMETHOD); SAVEFREESV(PL_compcv); } break; - case 103: -#line 678 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 109: +#line 782 "perly.y" + { (yyval.ival) = start_subparse(TRUE, 0); + SAVEFREESV(PL_compcv); } break; - case 104: -#line 680 "perly.y" - { (yyval.opval) = NULL; } + case 115: +#line 801 "perly.y" + { + OP *attrlist = (ps[0].val.opval); + if(attrlist && !PL_parser->sig_seen) + attrlist = apply_builtin_cv_attributes(PL_compcv, attrlist); + (yyval.opval) = attrlist; + } break; - case 105: -#line 685 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 116: +#line 808 "perly.y" + { (yyval.opval) = NULL; } break; - case 106: -#line 687 "perly.y" - { (yyval.opval) = NULL; } + case 117: +#line 813 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 107: -#line 698 "perly.y" - { parser->in_my = 0; (yyval.opval) = NULL; } + case 118: +#line 815 "perly.y" + { (yyval.opval) = NULL; } break; - case 108: -#line 700 "perly.y" - { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); } + case 119: +#line 826 "perly.y" + { parser->in_my = 0; (yyval.opval) = NULL; } break; - case 109: -#line 705 "perly.y" - { (yyval.ival) = '@'; } + case 120: +#line 828 "perly.y" + { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); } break; - case 110: -#line 707 "perly.y" - { (yyval.ival) = '%'; } + case 121: +#line 833 "perly.y" + { (yyval.ival) = '@'; } break; - case 111: -#line 711 "perly.y" - { - I32 sigil = (ps[-2].val.ival); - OP *var = (ps[-1].val.opval); - OP *defexpr = (ps[0].val.opval); + case 122: +#line 835 "perly.y" + { (yyval.ival) = '%'; } - if (parser->sig_slurpy) - yyerror("Multiple slurpy parameters not allowed"); - parser->sig_slurpy = (char)sigil; + break; + + case 123: +#line 839 "perly.y" + { + I32 sigil = (ps[-2].val.ival); + OP *var = (ps[-1].val.opval); + OP *defop = (ps[0].val.opval); + + if (parser->sig_slurpy) + yyerror("Multiple slurpy parameters not allowed"); + parser->sig_slurpy = (char)sigil; - if (defexpr) + if (defop) yyerror("A slurpy parameter may not have " "a default value"); @@ -844,32 +977,41 @@ case 2: break; - case 113: -#line 732 "perly.y" - { (yyval.opval) = newOP(OP_NULL, 0); } + case 125: +#line 860 "perly.y" + { (yyval.opval) = newARGDEFELEMOP(0, newOP(OP_NULL, 0), parser->sig_elems); } break; - case 114: -#line 734 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 126: +#line 862 "perly.y" + { + I32 flags = 0; + if ((ps[-1].val.ival) == OP_DORASSIGN) + flags |= OPpARG_IF_UNDEF << 8; + if ((ps[-1].val.ival) == OP_ORASSIGN) + flags |= OPpARG_IF_FALSE << 8; + (yyval.opval) = newARGDEFELEMOP(flags, (ps[0].val.opval), parser->sig_elems); + } break; - case 115: -#line 740 "perly.y" - { - OP *var = (ps[-1].val.opval); - OP *defexpr = (ps[0].val.opval); + case 127: +#line 875 "perly.y" + { + OP *var = (ps[-1].val.opval); + OP *defop = (ps[0].val.opval); if (parser->sig_slurpy) yyerror("Slurpy parameter not last"); parser->sig_elems++; - if (defexpr) { + if (defop) { parser->sig_optelems++; + OP *defexpr = cLOGOPx(defop)->op_first; + if ( defexpr->op_type == OP_NULL && !(defexpr->op_flags & OPf_KIDS)) { @@ -877,17 +1019,10 @@ case 2: if (var) yyerror("Optional parameter " "lacks default expression"); - op_free(defexpr); + op_free(defop); } else { /* a normal '=default' expression */ - OP *defop = (OP*)alloc_LOGOP(OP_ARGDEFELEM, - defexpr, - LINKLIST(defexpr)); - /* re-purpose op_targ to hold @_ index */ - defop->op_targ = - (PADOFFSET)(parser->sig_elems - 1); - if (var) { var->op_flags |= OPf_STACKED; (void)op_sibling_splice(var, @@ -921,47 +1056,47 @@ case 2: break; - case 116: -#line 805 "perly.y" - { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); } + case 128: +#line 935 "perly.y" + { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); } break; - case 117: -#line 807 "perly.y" - { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); } + case 129: +#line 937 "perly.y" + { parser->in_my = KEY_sigvar; (yyval.opval) = (ps[0].val.opval); } break; - case 118: -#line 813 "perly.y" - { (yyval.opval) = (ps[-1].val.opval); } + case 130: +#line 943 "perly.y" + { (yyval.opval) = (ps[-1].val.opval); } break; - case 119: -#line 815 "perly.y" - { + case 131: +#line 945 "perly.y" + { (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 120: -#line 819 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 132: +#line 949 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 125: -#line 836 "perly.y" - { (yyval.opval) = (ps[-1].val.opval); } + case 137: +#line 966 "perly.y" + { (yyval.opval) = (ps[-1].val.opval); } break; - case 126: -#line 839 "perly.y" - { + case 138: +#line 969 "perly.y" + { ENTER; SAVEIV(parser->sig_elems); SAVEIV(parser->sig_optelems); @@ -974,14 +1109,14 @@ case 2: break; - case 127: -#line 850 "perly.y" - { + case 139: +#line 980 "perly.y" + { OP *sigops = (ps[0].val.opval); struct op_argcheck_aux *aux; OP *check; - if (!FEATURE_SIGNATURES_IS_ENABLED) + if (!FEATURE_SIGNATURES_IS_ENABLED && !CvIsMETHOD(PL_compcv)) Perl_croak(aTHX_ "Experimental " "subroutine signatures not enabled"); @@ -1031,15 +1166,15 @@ case 2: break; - case 129: -#line 907 "perly.y" - { (yyval.opval) = NULL; } + case 141: +#line 1037 "perly.y" + { (yyval.opval) = NULL; } break; - case 130: -#line 913 "perly.y" - { + case 142: +#line 1043 "perly.y" + { if (parser->copline > (line_t)(ps[-2].val.ival)) parser->copline = (line_t)(ps[-2].val.ival); (yyval.opval) = block_end((ps[-3].val.ival), (ps[-1].val.opval)); @@ -1047,15 +1182,15 @@ case 2: break; - case 132: -#line 925 "perly.y" - { (yyval.opval) = NULL; } + case 144: +#line 1055 "perly.y" + { (yyval.opval) = NULL; } break; - case 133: -#line 930 "perly.y" - { + case 145: +#line 1060 "perly.y" + { if (parser->copline > (line_t)(ps[-2].val.ival)) parser->copline = (line_t)(ps[-2].val.ival); (yyval.opval) = block_end((ps[-4].val.ival), @@ -1064,52 +1199,64 @@ case 2: break; - case 134: -#line 941 "perly.y" - { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } + case 146: +#line 1071 "perly.y" + { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 135: -#line 943 "perly.y" - { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); } + case 147: +#line 1073 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; - case 137: -#line 949 "perly.y" - { (yyval.opval) = (ps[-1].val.opval); } + case 148: +#line 1075 "perly.y" + { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 138: -#line 951 "perly.y" - { + case 149: +#line 1077 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } + + break; + + case 151: +#line 1083 "perly.y" + { (yyval.opval) = (ps[-1].val.opval); } + + break; + + case 152: +#line 1085 "perly.y" + { OP* term = (ps[0].val.opval); (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), term); } break; - case 140: -#line 960 "perly.y" - { (yyval.opval) = op_convert_list((ps[-2].val.ival), OPf_STACKED, + case 154: +#line 1094 "perly.y" + { (yyval.opval) = op_convert_list((ps[-2].val.ival), OPf_STACKED, op_prepend_elem(OP_LIST, newGVREF((ps[-2].val.ival),(ps[-1].val.opval)), (ps[0].val.opval)) ); } break; - case 141: -#line 964 "perly.y" - { (yyval.opval) = op_convert_list((ps[-4].val.ival), OPf_STACKED, + case 155: +#line 1098 "perly.y" + { (yyval.opval) = op_convert_list((ps[-4].val.ival), OPf_STACKED, op_prepend_elem(OP_LIST, newGVREF((ps[-4].val.ival),(ps[-2].val.opval)), (ps[-1].val.opval)) ); } break; - case 142: -#line 968 "perly.y" - { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, + case 156: +#line 1102 "perly.y" + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, scalar((ps[-5].val.opval)), (ps[-1].val.opval)), newMETHOP(OP_METHOD, 0, (ps[-3].val.opval)))); @@ -1117,18 +1264,18 @@ case 2: break; - case 143: -#line 974 "perly.y" - { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, + case 157: +#line 1108 "perly.y" + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, scalar((ps[-2].val.opval)), newMETHOP(OP_METHOD, 0, (ps[0].val.opval)))); } break; - case 144: -#line 979 "perly.y" - { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, + case 158: +#line 1113 "perly.y" + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)), newMETHOP(OP_METHOD, 0, (ps[-2].val.opval)))); @@ -1136,9 +1283,9 @@ case 2: break; - case 145: -#line 985 "perly.y" - { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, + case 159: +#line 1119 "perly.y" + { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[-3].val.opval), (ps[-1].val.opval)), newMETHOP(OP_METHOD, 0, (ps[-4].val.opval)))); @@ -1146,97 +1293,97 @@ case 2: break; - case 146: -#line 991 "perly.y" - { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); } + case 160: +#line 1125 "perly.y" + { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); } break; - case 147: -#line 993 "perly.y" - { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } + case 161: +#line 1127 "perly.y" + { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } break; - case 148: -#line 995 "perly.y" - { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } + case 162: +#line 1129 "perly.y" + { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); } break; - case 149: -#line 997 "perly.y" - { SvREFCNT_inc_simple_void(PL_compcv); + case 163: +#line 1131 "perly.y" + { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[-1].val.ival), 0, NULL, (ps[0].val.opval)); } break; - case 150: -#line 1000 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, + case 164: +#line 1134 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)), (ps[-4].val.opval))); } break; - case 153: -#line 1015 "perly.y" - { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); } + case 167: +#line 1149 "perly.y" + { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); } break; - case 154: -#line 1017 "perly.y" - { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval))); + case 168: +#line 1151 "perly.y" + { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval))); } break; - case 155: -#line 1020 "perly.y" - { (yyval.opval) = newBINOP(OP_AELEM, 0, + case 169: +#line 1154 "perly.y" + { (yyval.opval) = newBINOP(OP_AELEM, 0, ref(newAVREF((ps[-4].val.opval)),OP_RV2AV), scalar((ps[-1].val.opval))); } break; - case 156: -#line 1025 "perly.y" - { (yyval.opval) = newBINOP(OP_AELEM, 0, + case 170: +#line 1159 "perly.y" + { (yyval.opval) = newBINOP(OP_AELEM, 0, ref(newAVREF((ps[-3].val.opval)),OP_RV2AV), scalar((ps[-1].val.opval))); } break; - case 157: -#line 1030 "perly.y" - { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval))); + case 171: +#line 1164 "perly.y" + { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval))); } break; - case 158: -#line 1033 "perly.y" - { (yyval.opval) = newBINOP(OP_HELEM, 0, + case 172: +#line 1167 "perly.y" + { (yyval.opval) = newBINOP(OP_HELEM, 0, ref(newHVREF((ps[-5].val.opval)),OP_RV2HV), jmaybe((ps[-2].val.opval))); } break; - case 159: -#line 1037 "perly.y" - { (yyval.opval) = newBINOP(OP_HELEM, 0, + case 173: +#line 1171 "perly.y" + { (yyval.opval) = newBINOP(OP_HELEM, 0, ref(newHVREF((ps[-4].val.opval)),OP_RV2HV), jmaybe((ps[-2].val.opval))); } break; - case 160: -#line 1041 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, + case 174: +#line 1175 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, newCVREF(0, scalar((ps[-3].val.opval)))); if (parser->expect == XBLOCK) parser->expect = XOPERATOR; @@ -1244,9 +1391,9 @@ case 2: break; - case 161: -#line 1047 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, + case 175: +#line 1181 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[-1].val.opval), newCVREF(0, scalar((ps[-4].val.opval))))); if (parser->expect == XBLOCK) @@ -1255,9 +1402,9 @@ case 2: break; - case 162: -#line 1055 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, + case 176: +#line 1189 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[-1].val.opval), newCVREF(0, scalar((ps[-3].val.opval))))); if (parser->expect == XBLOCK) @@ -1266,9 +1413,9 @@ case 2: break; - case 163: -#line 1062 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, + case 177: +#line 1196 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, newCVREF(0, scalar((ps[-2].val.opval)))); if (parser->expect == XBLOCK) parser->expect = XOPERATOR; @@ -1276,224 +1423,278 @@ case 2: break; - case 164: -#line 1068 "perly.y" - { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); } + case 178: +#line 1202 "perly.y" + { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); } + + break; + + case 179: +#line 1204 "perly.y" + { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); } break; - case 165: -#line 1070 "perly.y" - { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); } + case 180: +#line 1206 "perly.y" + { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); } break; - case 166: -#line 1072 "perly.y" - { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); } + case 181: +#line 1211 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; - case 167: -#line 1077 "perly.y" - { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); } + case 182: +#line 1213 "perly.y" + { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); } break; - case 168: -#line 1079 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } + case 183: +#line 1215 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; - case 169: -#line 1081 "perly.y" - { if ((ps[-1].val.ival) != OP_REPEAT) + case 184: +#line 1217 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } + + break; + + case 185: +#line 1219 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } + + break; + + case 186: +#line 1221 "perly.y" + { if ((ps[-1].val.ival) != OP_REPEAT) scalar((ps[-2].val.opval)); (yyval.opval) = newBINOP((ps[-1].val.ival), 0, (ps[-2].val.opval), scalar((ps[0].val.opval))); } break; - case 170: -#line 1086 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } + case 187: +#line 1226 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; - case 171: -#line 1088 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } + case 188: +#line 1228 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; - case 172: -#line 1090 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 189: +#line 1230 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; - case 173: -#line 1092 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 190: +#line 1232 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; - case 174: -#line 1094 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } + case 191: +#line 1234 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 175: -#line 1096 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } + case 192: +#line 1236 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 176: -#line 1098 "perly.y" - { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } + case 193: +#line 1238 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; - case 177: -#line 1100 "perly.y" - { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } + case 194: +#line 1240 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; - case 178: -#line 1102 "perly.y" - { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } + case 195: +#line 1242 "perly.y" + { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; - case 179: -#line 1104 "perly.y" - { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } + case 196: +#line 1244 "perly.y" + { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 180: -#line 1106 "perly.y" - { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } + case 197: +#line 1246 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; - case 181: -#line 1110 "perly.y" - { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); } + case 198: +#line 1248 "perly.y" + { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 182: -#line 1112 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } + case 199: +#line 1250 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; - case 183: -#line 1114 "perly.y" - { yyerror("syntax error"); YYERROR; } + case 200: +#line 1252 "perly.y" + { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 184: -#line 1116 "perly.y" - { yyerror("syntax error"); YYERROR; } + case 201: +#line 1254 "perly.y" + { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 185: -#line 1120 "perly.y" - { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } + case 202: +#line 1256 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; - case 186: -#line 1122 "perly.y" - { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } + case 203: +#line 1260 "perly.y" + { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); } break; - case 187: -#line 1126 "perly.y" - { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); } + case 204: +#line 1262 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; - case 188: -#line 1128 "perly.y" - { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } + case 205: +#line 1264 "perly.y" + { yyerror("syntax error"); YYERROR; } break; - case 189: -#line 1130 "perly.y" - { yyerror("syntax error"); YYERROR; } + case 206: +#line 1266 "perly.y" + { yyerror("syntax error"); YYERROR; } break; - case 190: -#line 1132 "perly.y" - { yyerror("syntax error"); YYERROR; } + case 207: +#line 1268 "perly.y" + { (yyval.opval) = build_infix_plugin((ps[-2].val.opval), (ps[0].val.opval), (ps[-1].val.pval)); } break; - case 191: -#line 1136 "perly.y" - { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } + case 208: +#line 1272 "perly.y" + { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 192: -#line 1138 "perly.y" - { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } + case 209: +#line 1274 "perly.y" + { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 193: -#line 1143 "perly.y" - { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); } + case 210: +#line 1278 "perly.y" + { (yyval.opval) = cmpchain_finish((ps[0].val.opval)); } break; - case 194: -#line 1145 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 211: +#line 1280 "perly.y" + { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); } break; - case 195: -#line 1148 "perly.y" - { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } + case 212: +#line 1282 "perly.y" + { yyerror("syntax error"); YYERROR; } break; - case 196: -#line 1150 "perly.y" - { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); } + case 213: +#line 1284 "perly.y" + { yyerror("syntax error"); YYERROR; } break; - case 197: -#line 1152 "perly.y" - { (yyval.opval) = newUNOP(OP_POSTINC, 0, + case 214: +#line 1288 "perly.y" + { (yyval.opval) = cmpchain_start((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } + + break; + + case 215: +#line 1290 "perly.y" + { (yyval.opval) = cmpchain_extend((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); } + + break; + + case 216: +#line 1295 "perly.y" + { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); } + + break; + + case 217: +#line 1297 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } + + break; + + case 218: +#line 1300 "perly.y" + { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } + + break; + + case 219: +#line 1302 "perly.y" + { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); } + + break; + + case 220: +#line 1304 "perly.y" + { (yyval.opval) = newUNOP(OP_POSTINC, 0, op_lvalue(scalar((ps[-1].val.opval)), OP_POSTINC)); } break; - case 198: -#line 1155 "perly.y" - { (yyval.opval) = newUNOP(OP_POSTDEC, 0, + case 221: +#line 1307 "perly.y" + { (yyval.opval) = newUNOP(OP_POSTDEC, 0, op_lvalue(scalar((ps[-1].val.opval)), OP_POSTDEC));} break; - case 199: -#line 1158 "perly.y" - { (yyval.opval) = op_convert_list(OP_JOIN, 0, + case 222: +#line 1310 "perly.y" + { (yyval.opval) = op_convert_list(OP_JOIN, 0, op_append_elem( OP_LIST, newSVREF(scalar( @@ -1506,139 +1707,148 @@ case 2: break; - case 200: -#line 1169 "perly.y" - { (yyval.opval) = newUNOP(OP_PREINC, 0, + case 223: +#line 1321 "perly.y" + { (yyval.opval) = newUNOP(OP_PREINC, 0, op_lvalue(scalar((ps[0].val.opval)), OP_PREINC)); } break; - case 201: -#line 1172 "perly.y" - { (yyval.opval) = newUNOP(OP_PREDEC, 0, + case 224: +#line 1324 "perly.y" + { (yyval.opval) = newUNOP(OP_PREDEC, 0, op_lvalue(scalar((ps[0].val.opval)), OP_PREDEC)); } break; - case 202: -#line 1180 "perly.y" - { (yyval.opval) = newANONLIST((ps[-1].val.opval)); } + case 225: +#line 1332 "perly.y" + { (yyval.opval) = newANONLIST((ps[-1].val.opval)); } break; - case 203: -#line 1182 "perly.y" - { (yyval.opval) = newANONHASH((ps[-2].val.opval)); } + case 226: +#line 1334 "perly.y" + { (yyval.opval) = newANONHASH((ps[-2].val.opval)); } break; - case 204: -#line 1184 "perly.y" - { SvREFCNT_inc_simple_void(PL_compcv); + case 227: +#line 1336 "perly.y" + { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[-3].val.ival), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)); } break; - case 205: -#line 1187 "perly.y" - { SvREFCNT_inc_simple_void(PL_compcv); + case 228: +#line 1339 "perly.y" + { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[-2].val.ival), NULL, (ps[-1].val.opval), (ps[0].val.opval)); } break; - case 206: -#line 1193 "perly.y" - { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));} + case 229: +#line 1342 "perly.y" + { + SvREFCNT_inc_simple_void(PL_compcv); + (yyval.opval) = newANONATTRSUB((ps[-2].val.ival), NULL, (ps[-1].val.opval), (ps[0].val.opval)); + } break; - case 207: -#line 1195 "perly.y" - { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));} + case 230: +#line 1350 "perly.y" + { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));} break; - case 212: -#line 1203 "perly.y" - { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); } + case 231: +#line 1352 "perly.y" + { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));} break; - case 213: -#line 1205 "perly.y" - { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); } + case 236: +#line 1360 "perly.y" + { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 214: -#line 1207 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 237: +#line 1362 "perly.y" + { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); } break; - case 215: -#line 1209 "perly.y" - { (yyval.opval) = localize((ps[0].val.opval),0); } + case 238: +#line 1364 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 216: -#line 1211 "perly.y" - { (yyval.opval) = sawparens((ps[-1].val.opval)); } + case 239: +#line 1366 "perly.y" + { (yyval.opval) = localize((ps[0].val.opval),0); } break; - case 217: -#line 1213 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 240: +#line 1368 "perly.y" + { (yyval.opval) = sawparens((ps[-1].val.opval)); } break; - case 218: -#line 1215 "perly.y" - { (yyval.opval) = sawparens(newNULLLIST()); } + case 241: +#line 1370 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 219: -#line 1217 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 242: +#line 1372 "perly.y" + { (yyval.opval) = sawparens(newNULLLIST()); } break; - case 220: -#line 1219 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 243: +#line 1374 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 221: -#line 1221 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 244: +#line 1376 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 222: -#line 1223 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 245: +#line 1378 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 223: -#line 1225 "perly.y" - { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));} + case 246: +#line 1380 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 224: -#line 1227 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 247: +#line 1382 "perly.y" + { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));} break; - case 225: -#line 1229 "perly.y" - { (yyval.opval) = op_prepend_elem(OP_ASLICE, + case 248: +#line 1384 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } + + break; + + case 249: +#line 1386 "perly.y" + { (yyval.opval) = op_prepend_elem(OP_ASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_ASLICE, 0, list((ps[-1].val.opval)), @@ -1650,9 +1860,9 @@ case 2: break; - case 226: -#line 1239 "perly.y" - { (yyval.opval) = op_prepend_elem(OP_KVASLICE, + case 250: +#line 1396 "perly.y" + { (yyval.opval) = op_prepend_elem(OP_KVASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_KVASLICE, 0, list((ps[-1].val.opval)), @@ -1664,9 +1874,9 @@ case 2: break; - case 227: -#line 1249 "perly.y" - { (yyval.opval) = op_prepend_elem(OP_HSLICE, + case 251: +#line 1406 "perly.y" + { (yyval.opval) = op_prepend_elem(OP_HSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_HSLICE, 0, list((ps[-2].val.opval)), @@ -1678,9 +1888,9 @@ case 2: break; - case 228: -#line 1259 "perly.y" - { (yyval.opval) = op_prepend_elem(OP_KVHSLICE, + case 252: +#line 1416 "perly.y" + { (yyval.opval) = op_prepend_elem(OP_KVHSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_KVHSLICE, 0, list((ps[-2].val.opval)), @@ -1692,182 +1902,182 @@ case 2: break; - case 229: -#line 1269 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 253: +#line 1426 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 230: -#line 1271 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); } + case 254: +#line 1428 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); } break; - case 231: -#line 1273 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval))); + case 255: +#line 1430 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval))); } break; - case 232: -#line 1276 "perly.y" - { + case 256: +#line 1433 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[-1].val.opval), scalar((ps[-3].val.opval)))); } break; - case 233: -#line 1281 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, + case 257: +#line 1438 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); } break; - case 234: -#line 1285 "perly.y" - { (yyval.opval) = newSVREF((ps[-3].val.opval)); } + case 258: +#line 1442 "perly.y" + { (yyval.opval) = newSVREF((ps[-3].val.opval)); } break; - case 235: -#line 1287 "perly.y" - { (yyval.opval) = newAVREF((ps[-3].val.opval)); } + case 259: +#line 1444 "perly.y" + { (yyval.opval) = newAVREF((ps[-3].val.opval)); } break; - case 236: -#line 1289 "perly.y" - { (yyval.opval) = newHVREF((ps[-3].val.opval)); } + case 260: +#line 1446 "perly.y" + { (yyval.opval) = newHVREF((ps[-3].val.opval)); } break; - case 237: -#line 1291 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, + case 261: +#line 1448 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar(newCVREF((ps[-1].val.ival),(ps[-3].val.opval)))); } break; - case 238: -#line 1294 "perly.y" - { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); } + case 262: +#line 1451 "perly.y" + { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); } break; - case 239: -#line 1296 "perly.y" - { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL); + case 263: +#line 1453 "perly.y" + { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL); PL_hints |= HINT_BLOCK_SCOPE; } break; - case 240: -#line 1299 "perly.y" - { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); } + case 264: +#line 1456 "perly.y" + { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); } break; - case 241: -#line 1301 "perly.y" - { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } + case 265: +#line 1458 "perly.y" + { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); } break; - case 242: -#line 1303 "perly.y" - { (yyval.opval) = newOP((ps[0].val.ival), 0); } + case 266: +#line 1460 "perly.y" + { (yyval.opval) = newOP((ps[0].val.ival), 0); } break; - case 243: -#line 1305 "perly.y" - { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } + case 267: +#line 1462 "perly.y" + { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } break; - case 244: -#line 1307 "perly.y" - { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } + case 268: +#line 1464 "perly.y" + { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); } break; - case 245: -#line 1309 "perly.y" - { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); } + case 269: +#line 1466 "perly.y" + { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); } break; - case 246: -#line 1311 "perly.y" - { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); } + case 270: +#line 1468 "perly.y" + { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); } break; - case 247: -#line 1313 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } + case 271: +#line 1470 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } break; - case 248: -#line 1315 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, + case 272: +#line 1472 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); } break; - case 249: -#line 1318 "perly.y" - { (yyval.opval) = newOP((ps[0].val.ival), 0); } + case 273: +#line 1475 "perly.y" + { (yyval.opval) = newOP((ps[0].val.ival), 0); } break; - case 250: -#line 1320 "perly.y" - { (yyval.opval) = newOP((ps[-2].val.ival), 0);} + case 274: +#line 1477 "perly.y" + { (yyval.opval) = newOP((ps[-2].val.ival), 0);} break; - case 251: -#line 1322 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 275: +#line 1479 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 252: -#line 1324 "perly.y" - { (yyval.opval) = (ps[-2].val.opval); } + case 276: +#line 1481 "perly.y" + { (yyval.opval) = (ps[-2].val.opval); } break; - case 253: -#line 1326 "perly.y" - { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } + case 277: +#line 1483 "perly.y" + { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); } break; - case 254: -#line 1328 "perly.y" - { (yyval.opval) = ((ps[-2].val.ival) == OP_NOT) + case 278: +#line 1485 "perly.y" + { (yyval.opval) = ((ps[-2].val.ival) == OP_NOT) ? newUNOP((ps[-2].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0))) : newOP((ps[-2].val.ival), OPf_SPECIAL); } break; - case 255: -#line 1332 "perly.y" - { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); } + case 279: +#line 1489 "perly.y" + { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); } break; - case 256: -#line 1334 "perly.y" - { + case 280: +#line 1491 "perly.y" + { if ( (ps[0].val.opval)->op_type != OP_TRANS && (ps[0].val.opval)->op_type != OP_TRANSR && (((PMOP*)(ps[0].val.opval))->op_pmflags & PMf_HAS_CV)) @@ -1880,193 +2090,264 @@ case 2: break; - case 257: -#line 1345 "perly.y" - { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); } + case 281: +#line 1502 "perly.y" + { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); } break; - case 261: -#line 1354 "perly.y" - { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); } + case 285: +#line 1511 "perly.y" + { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); } break; - case 262: -#line 1356 "perly.y" - { (yyval.opval) = localize((ps[0].val.opval),1); } + case 286: +#line 1513 "perly.y" + { (yyval.opval) = localize((ps[0].val.opval),1); } break; - case 263: -#line 1358 "perly.y" - { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); } + case 287: +#line 1515 "perly.y" + { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); } break; - case 264: -#line 1360 "perly.y" - { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); } + case 288: +#line 1517 "perly.y" + { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); } break; - case 265: -#line 1365 "perly.y" - { (yyval.opval) = sawparens((ps[-1].val.opval)); } + case 289: +#line 1522 "perly.y" + { (yyval.opval) = sawparens((ps[-1].val.opval)); } break; - case 266: -#line 1367 "perly.y" - { (yyval.opval) = sawparens(newNULLLIST()); } + case 290: +#line 1524 "perly.y" + { (yyval.opval) = sawparens(newNULLLIST()); } break; - case 267: -#line 1370 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 291: +#line 1527 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 268: -#line 1372 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 292: +#line 1529 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 269: -#line 1374 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 293: +#line 1531 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - case 275: -#line 1390 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 294: +#line 1536 "perly.y" + { + (yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ]; + op_free((ps[0].val.opval)); + } break; - case 276: -#line 1396 "perly.y" - { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } + case 295: +#line 1541 "perly.y" + { + (yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ]; + op_free((ps[0].val.opval)); + } break; - case 277: -#line 1401 "perly.y" - { (yyval.opval) = (ps[-1].val.opval); } + case 296: +#line 1546 "perly.y" + { + (yyval.pval) = PadnamelistARRAY(PL_comppad_name)[(ps[0].val.opval)->op_targ]; + op_free((ps[0].val.opval)); + } break; - case 278: -#line 1403 "perly.y" - { + case 297: +#line 1554 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } + + break; + + case 298: +#line 1556 "perly.y" + { (yyval.opval) = NULL; } + + break; + + case 300: +#line 1562 "perly.y" + { + parser->in_my = 0; + if((ps[0].val.opval)) + class_apply_field_attributes((PADNAME *)(ps[-1].val.pval), (ps[0].val.opval)); + (yyval.opval) = newOP(OP_NULL, 0); + } + + break; + + case 301: +#line 1569 "perly.y" + { + parser->in_my = 0; + if((ps[-1].val.opval)) + class_apply_field_attributes((PADNAME *)(ps[-2].val.pval), (ps[-1].val.opval)); + ENTER; + class_prepare_initfield_parse(); + } + + break; + + case 302: +#line 1577 "perly.y" + { + class_set_field_defop((PADNAME *)(ps[-4].val.pval), (ps[-2].val.ival), (ps[0].val.opval)); + LEAVE; + (yyval.opval) = newOP(OP_NULL, 0); + } + + break; + + case 308: +#line 1597 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } + + break; + + case 309: +#line 1603 "perly.y" + { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); } + + break; + + case 310: +#line 1608 "perly.y" + { (yyval.opval) = (ps[-1].val.opval); } + + break; + + case 311: +#line 1610 "perly.y" + { (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), (ps[0].val.opval)); } break; - case 280: -#line 1410 "perly.y" - { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); } + case 313: +#line 1617 "perly.y" + { parser->in_my = 0; (yyval.opval) = (ps[0].val.opval); } break; - case 288: -#line 1427 "perly.y" - { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); } + case 321: +#line 1634 "perly.y" + { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); } break; - case 289: -#line 1431 "perly.y" - { (yyval.opval) = newSVREF((ps[0].val.opval)); } + case 322: +#line 1638 "perly.y" + { (yyval.opval) = newSVREF((ps[0].val.opval)); } break; - case 290: -#line 1435 "perly.y" - { (yyval.opval) = newAVREF((ps[0].val.opval)); + case 323: +#line 1642 "perly.y" + { (yyval.opval) = newAVREF((ps[0].val.opval)); if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival); } break; - case 291: -#line 1441 "perly.y" - { (yyval.opval) = newHVREF((ps[0].val.opval)); + case 324: +#line 1648 "perly.y" + { (yyval.opval) = newHVREF((ps[0].val.opval)); if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival); } break; - case 292: -#line 1447 "perly.y" - { (yyval.opval) = newAVREF((ps[0].val.opval)); } + case 325: +#line 1654 "perly.y" + { (yyval.opval) = newAVREF((ps[0].val.opval)); } break; - case 293: -#line 1449 "perly.y" - { (yyval.opval) = newAVREF((ps[-3].val.opval)); } + case 326: +#line 1656 "perly.y" + { (yyval.opval) = newAVREF((ps[-3].val.opval)); } break; - case 294: -#line 1453 "perly.y" - { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); } + case 327: +#line 1660 "perly.y" + { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); } break; - case 296: -#line 1458 "perly.y" - { (yyval.opval) = newAVREF((ps[-2].val.opval)); } + case 329: +#line 1665 "perly.y" + { (yyval.opval) = newAVREF((ps[-2].val.opval)); } break; - case 298: -#line 1463 "perly.y" - { (yyval.opval) = newHVREF((ps[-2].val.opval)); } + case 331: +#line 1670 "perly.y" + { (yyval.opval) = newHVREF((ps[-2].val.opval)); } break; - case 300: -#line 1468 "perly.y" - { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); } + case 333: +#line 1675 "perly.y" + { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); } break; - case 301: -#line 1473 "perly.y" - { (yyval.opval) = scalar((ps[0].val.opval)); } + case 334: +#line 1680 "perly.y" + { (yyval.opval) = scalar((ps[0].val.opval)); } break; - case 302: -#line 1475 "perly.y" - { (yyval.opval) = scalar((ps[0].val.opval)); } + case 335: +#line 1682 "perly.y" + { (yyval.opval) = scalar((ps[0].val.opval)); } break; - case 303: -#line 1477 "perly.y" - { (yyval.opval) = op_scope((ps[0].val.opval)); } + case 336: +#line 1684 "perly.y" + { (yyval.opval) = op_scope((ps[0].val.opval)); } break; - case 304: -#line 1480 "perly.y" - { (yyval.opval) = (ps[0].val.opval); } + case 337: +#line 1687 "perly.y" + { (yyval.opval) = (ps[0].val.opval); } break; - default: break; /* Generated from: - * 0caf1eb1cc4750131dc71e3a22ead383ed9a123dec61ccd23408ff13441fafde perly.y + * 0a5fcd15cf0b7afb57ade6ceaf68037a38dd194acd9d60d3e4ad99c15233af75 perly.y * acf1cbfd2545faeaaa58b1cf0cf9d7f98b5be0752eb7a54528ef904a9e2e1ca7 regen_perly.pl - * ex: set ro: */ + * ex: set ro ft=c: */ Index: gnu/usr.bin/perl/perly.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perly.c,v diff -u -p -a -u -p -r1.19 perly.c --- gnu/usr.bin/perl/perly.c 15 Feb 2023 01:36:13 -0000 1.19 +++ gnu/usr.bin/perl/perly.c 21 Feb 2024 15:47:02 -0000 @@ -488,7 +488,8 @@ Perl_yyparse (pTHX_ int gramtype) yyerrlab: /* If not already recovering from an error, report this error. */ if (!parser->yyerrstatus) { - yyerror ("syntax error"); + yyerror("syntax error"); + yyquit(); } Index: gnu/usr.bin/perl/perly.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perly.h,v diff -u -p -a -u -p -r1.14 perly.h --- gnu/usr.bin/perl/perly.h 15 Feb 2023 01:36:13 -0000 1.14 +++ gnu/usr.bin/perl/perly.h 21 Feb 2024 15:47:02 -0000 @@ -1,17 +1,17 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by regen_perly.pl from perly.y. Any changes made here will be lost! */ -#define PERL_BISON_VERSION 30006 +#define PERL_BISON_VERSION 30003 #ifdef PERL_CORE -/* A Bison parser, made by GNU Bison 3.6.4. */ +/* A Bison parser, made by GNU Bison 3.3. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -40,9 +40,8 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, - especially those whose name start with YY_ or yy_. They are - private implementation details that can be changed or removed. */ +/* Undocumented macros, especially those whose name start with YY_, + are private implementation details. Do not rely on them. */ /* Debug traces. */ #ifndef YYDEBUG @@ -52,129 +51,140 @@ extern int yydebug; #endif -/* Token kinds. */ +/* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { - YYEMPTY = -2, - YYEOF = 0, /* "end of file" */ - YYerror = 256, /* error */ - YYUNDEF = 257, /* "invalid token" */ - GRAMPROG = 258, /* GRAMPROG */ - GRAMEXPR = 259, /* GRAMEXPR */ - GRAMBLOCK = 260, /* GRAMBLOCK */ - GRAMBARESTMT = 261, /* GRAMBARESTMT */ - GRAMFULLSTMT = 262, /* GRAMFULLSTMT */ - GRAMSTMTSEQ = 263, /* GRAMSTMTSEQ */ - GRAMSUBSIGNATURE = 264, /* GRAMSUBSIGNATURE */ - PERLY_AMPERSAND = 265, /* PERLY_AMPERSAND */ - PERLY_BRACE_OPEN = 266, /* PERLY_BRACE_OPEN */ - PERLY_BRACE_CLOSE = 267, /* PERLY_BRACE_CLOSE */ - PERLY_BRACKET_OPEN = 268, /* PERLY_BRACKET_OPEN */ - PERLY_BRACKET_CLOSE = 269, /* PERLY_BRACKET_CLOSE */ - PERLY_COMMA = 270, /* PERLY_COMMA */ - PERLY_DOLLAR = 271, /* PERLY_DOLLAR */ - PERLY_DOT = 272, /* PERLY_DOT */ - PERLY_EQUAL_SIGN = 273, /* PERLY_EQUAL_SIGN */ - PERLY_MINUS = 274, /* PERLY_MINUS */ - PERLY_PERCENT_SIGN = 275, /* PERLY_PERCENT_SIGN */ - PERLY_PLUS = 276, /* PERLY_PLUS */ - PERLY_SEMICOLON = 277, /* PERLY_SEMICOLON */ - PERLY_SLASH = 278, /* PERLY_SLASH */ - PERLY_SNAIL = 279, /* PERLY_SNAIL */ - PERLY_STAR = 280, /* PERLY_STAR */ - BAREWORD = 281, /* BAREWORD */ - METHOD = 282, /* METHOD */ - FUNCMETH = 283, /* FUNCMETH */ - THING = 284, /* THING */ - PMFUNC = 285, /* PMFUNC */ - PRIVATEREF = 286, /* PRIVATEREF */ - QWLIST = 287, /* QWLIST */ - FUNC0OP = 288, /* FUNC0OP */ - FUNC0SUB = 289, /* FUNC0SUB */ - UNIOPSUB = 290, /* UNIOPSUB */ - LSTOPSUB = 291, /* LSTOPSUB */ - PLUGEXPR = 292, /* PLUGEXPR */ - PLUGSTMT = 293, /* PLUGSTMT */ - LABEL = 294, /* LABEL */ - FORMAT = 295, /* FORMAT */ - SUB = 296, /* SUB */ - SIGSUB = 297, /* SIGSUB */ - ANONSUB = 298, /* ANONSUB */ - ANON_SIGSUB = 299, /* ANON_SIGSUB */ - PACKAGE = 300, /* PACKAGE */ - USE = 301, /* USE */ - WHILE = 302, /* WHILE */ - UNTIL = 303, /* UNTIL */ - IF = 304, /* IF */ - UNLESS = 305, /* UNLESS */ - ELSE = 306, /* ELSE */ - ELSIF = 307, /* ELSIF */ - CONTINUE = 308, /* CONTINUE */ - FOR = 309, /* FOR */ - GIVEN = 310, /* GIVEN */ - WHEN = 311, /* WHEN */ - DEFAULT = 312, /* DEFAULT */ - TRY = 313, /* TRY */ - CATCH = 314, /* CATCH */ - FINALLY = 315, /* FINALLY */ - LOOPEX = 316, /* LOOPEX */ - DOTDOT = 317, /* DOTDOT */ - YADAYADA = 318, /* YADAYADA */ - FUNC0 = 319, /* FUNC0 */ - FUNC1 = 320, /* FUNC1 */ - FUNC = 321, /* FUNC */ - UNIOP = 322, /* UNIOP */ - LSTOP = 323, /* LSTOP */ - MULOP = 324, /* MULOP */ - ADDOP = 325, /* ADDOP */ - DOLSHARP = 326, /* DOLSHARP */ - DO = 327, /* DO */ - HASHBRACK = 328, /* HASHBRACK */ - NOAMP = 329, /* NOAMP */ - LOCAL = 330, /* LOCAL */ - MY = 331, /* MY */ - REQUIRE = 332, /* REQUIRE */ - COLONATTR = 333, /* COLONATTR */ - FORMLBRACK = 334, /* FORMLBRACK */ - FORMRBRACK = 335, /* FORMRBRACK */ - SUBLEXSTART = 336, /* SUBLEXSTART */ - SUBLEXEND = 337, /* SUBLEXEND */ - DEFER = 338, /* DEFER */ - PREC_LOW = 339, /* PREC_LOW */ - OROP = 340, /* OROP */ - ANDOP = 341, /* ANDOP */ - NOTOP = 342, /* NOTOP */ - ASSIGNOP = 343, /* ASSIGNOP */ - PERLY_QUESTION_MARK = 344, /* PERLY_QUESTION_MARK */ - PERLY_COLON = 345, /* PERLY_COLON */ - OROR = 346, /* OROR */ - DORDOR = 347, /* DORDOR */ - ANDAND = 348, /* ANDAND */ - BITOROP = 349, /* BITOROP */ - BITANDOP = 350, /* BITANDOP */ - CHEQOP = 351, /* CHEQOP */ - NCEQOP = 352, /* NCEQOP */ - CHRELOP = 353, /* CHRELOP */ - NCRELOP = 354, /* NCRELOP */ - SHIFTOP = 355, /* SHIFTOP */ - MATCHOP = 356, /* MATCHOP */ - PERLY_EXCLAMATION_MARK = 357, /* PERLY_EXCLAMATION_MARK */ - PERLY_TILDE = 358, /* PERLY_TILDE */ - UMINUS = 359, /* UMINUS */ - REFGEN = 360, /* REFGEN */ - POWOP = 361, /* POWOP */ - PREINC = 362, /* PREINC */ - PREDEC = 363, /* PREDEC */ - POSTINC = 364, /* POSTINC */ - POSTDEC = 365, /* POSTDEC */ - POSTJOIN = 366, /* POSTJOIN */ - ARROW = 367, /* ARROW */ - PERLY_PAREN_CLOSE = 368, /* PERLY_PAREN_CLOSE */ - PERLY_PAREN_OPEN = 369 /* PERLY_PAREN_OPEN */ + GRAMPROG = 258, + GRAMEXPR = 259, + GRAMBLOCK = 260, + GRAMBARESTMT = 261, + GRAMFULLSTMT = 262, + GRAMSTMTSEQ = 263, + GRAMSUBSIGNATURE = 264, + PERLY_AMPERSAND = 265, + PERLY_BRACE_OPEN = 266, + PERLY_BRACE_CLOSE = 267, + PERLY_BRACKET_OPEN = 268, + PERLY_BRACKET_CLOSE = 269, + PERLY_COMMA = 270, + PERLY_DOLLAR = 271, + PERLY_DOT = 272, + PERLY_EQUAL_SIGN = 273, + PERLY_MINUS = 274, + PERLY_PERCENT_SIGN = 275, + PERLY_PLUS = 276, + PERLY_SEMICOLON = 277, + PERLY_SLASH = 278, + PERLY_SNAIL = 279, + PERLY_STAR = 280, + KW_FORMAT = 281, + KW_PACKAGE = 282, + KW_CLASS = 283, + KW_LOCAL = 284, + KW_MY = 285, + KW_FIELD = 286, + KW_IF = 287, + KW_ELSE = 288, + KW_ELSIF = 289, + KW_UNLESS = 290, + KW_FOR = 291, + KW_UNTIL = 292, + KW_WHILE = 293, + KW_CONTINUE = 294, + KW_GIVEN = 295, + KW_WHEN = 296, + KW_DEFAULT = 297, + KW_TRY = 298, + KW_CATCH = 299, + KW_FINALLY = 300, + KW_DEFER = 301, + KW_REQUIRE = 302, + KW_DO = 303, + KW_USE_or_NO = 304, + KW_SUB_named = 305, + KW_SUB_named_sig = 306, + KW_SUB_anon = 307, + KW_SUB_anon_sig = 308, + KW_METHOD_named = 309, + KW_METHOD_anon = 310, + BAREWORD = 311, + METHCALL0 = 312, + METHCALL = 313, + THING = 314, + PMFUNC = 315, + PRIVATEREF = 316, + QWLIST = 317, + FUNC0OP = 318, + FUNC0SUB = 319, + UNIOPSUB = 320, + LSTOPSUB = 321, + PLUGEXPR = 322, + PLUGSTMT = 323, + LABEL = 324, + LOOPEX = 325, + DOTDOT = 326, + YADAYADA = 327, + FUNC0 = 328, + FUNC1 = 329, + FUNC = 330, + UNIOP = 331, + LSTOP = 332, + POWOP = 333, + MULOP = 334, + ADDOP = 335, + DOLSHARP = 336, + HASHBRACK = 337, + NOAMP = 338, + COLONATTR = 339, + FORMLBRACK = 340, + FORMRBRACK = 341, + SUBLEXSTART = 342, + SUBLEXEND = 343, + PHASER = 344, + PREC_LOW = 345, + PLUGIN_LOW_OP = 346, + OROP = 347, + PLUGIN_LOGICAL_OR_LOW_OP = 348, + ANDOP = 349, + PLUGIN_LOGICAL_AND_LOW_OP = 350, + NOTOP = 351, + ASSIGNOP = 352, + PLUGIN_ASSIGN_OP = 353, + PERLY_QUESTION_MARK = 354, + PERLY_COLON = 355, + OROR = 356, + DORDOR = 357, + PLUGIN_LOGICAL_OR_OP = 358, + ANDAND = 359, + PLUGIN_LOGICAL_AND_OP = 360, + BITOROP = 361, + BITANDOP = 362, + CHEQOP = 363, + NCEQOP = 364, + CHRELOP = 365, + NCRELOP = 366, + PLUGIN_REL_OP = 367, + SHIFTOP = 368, + PLUGIN_ADD_OP = 369, + PLUGIN_MUL_OP = 370, + MATCHOP = 371, + PERLY_EXCLAMATION_MARK = 372, + PERLY_TILDE = 373, + UMINUS = 374, + REFGEN = 375, + PLUGIN_POW_OP = 376, + PREINC = 377, + PREDEC = 378, + POSTINC = 379, + POSTDEC = 380, + POSTJOIN = 381, + PLUGIN_HIGH_OP = 382, + ARROW = 383, + PERLY_PAREN_CLOSE = 384, + PERLY_PAREN_OPEN = 385 }; - typedef enum yytokentype yytoken_kind_t; #endif /* Value type. */ @@ -185,10 +195,10 @@ S_is_opval_token(int type) { case BAREWORD: case FUNC0OP: case FUNC0SUB: - case FUNCMETH: case LABEL: case LSTOPSUB: - case METHOD: + case METHCALL: + case METHCALL0: case PLUGEXPR: case PLUGSTMT: case PMFUNC: @@ -203,17 +213,18 @@ S_is_opval_token(int type) { #endif /* PERL_IN_TOKE_C */ #endif /* PERL_CORE */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED + union YYSTYPE { I32 ival; /* __DEFAULT__ (marker for regen_perly.pl; must always be 1st union member) */ - char *pval; + void *pval; OP *opval; GV *gvval; - }; + typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 @@ -225,6 +236,6 @@ int yyparse (void); /* Generated from: - * 0caf1eb1cc4750131dc71e3a22ead383ed9a123dec61ccd23408ff13441fafde perly.y + * 0a5fcd15cf0b7afb57ade6ceaf68037a38dd194acd9d60d3e4ad99c15233af75 perly.y * acf1cbfd2545faeaaa58b1cf0cf9d7f98b5be0752eb7a54528ef904a9e2e1ca7 regen_perly.pl - * ex: set ro: */ + * ex: set ro ft=c: */ Index: gnu/usr.bin/perl/perly.tab =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perly.tab,v diff -u -p -a -u -p -r1.6 perly.tab --- gnu/usr.bin/perl/perly.tab 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/perly.tab 21 Feb 2024 15:47:02 -0000 @@ -1,263 +1,33 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by regen_perly.pl from perly.y. Any changes made here will be lost! */ -/* Symbol kind. */ -enum yysymbol_kind_t -{ - YYSYMBOL_YYEMPTY = -2, - YYSYMBOL_YYEOF = 0, /* "end of file" */ - YYSYMBOL_YYerror = 1, /* error */ - YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ - YYSYMBOL_GRAMPROG = 3, /* GRAMPROG */ - YYSYMBOL_GRAMEXPR = 4, /* GRAMEXPR */ - YYSYMBOL_GRAMBLOCK = 5, /* GRAMBLOCK */ - YYSYMBOL_GRAMBARESTMT = 6, /* GRAMBARESTMT */ - YYSYMBOL_GRAMFULLSTMT = 7, /* GRAMFULLSTMT */ - YYSYMBOL_GRAMSTMTSEQ = 8, /* GRAMSTMTSEQ */ - YYSYMBOL_GRAMSUBSIGNATURE = 9, /* GRAMSUBSIGNATURE */ - YYSYMBOL_PERLY_AMPERSAND = 10, /* PERLY_AMPERSAND */ - YYSYMBOL_PERLY_BRACE_OPEN = 11, /* PERLY_BRACE_OPEN */ - YYSYMBOL_PERLY_BRACE_CLOSE = 12, /* PERLY_BRACE_CLOSE */ - YYSYMBOL_PERLY_BRACKET_OPEN = 13, /* PERLY_BRACKET_OPEN */ - YYSYMBOL_PERLY_BRACKET_CLOSE = 14, /* PERLY_BRACKET_CLOSE */ - YYSYMBOL_PERLY_COMMA = 15, /* PERLY_COMMA */ - YYSYMBOL_PERLY_DOLLAR = 16, /* PERLY_DOLLAR */ - YYSYMBOL_PERLY_DOT = 17, /* PERLY_DOT */ - YYSYMBOL_PERLY_EQUAL_SIGN = 18, /* PERLY_EQUAL_SIGN */ - YYSYMBOL_PERLY_MINUS = 19, /* PERLY_MINUS */ - YYSYMBOL_PERLY_PERCENT_SIGN = 20, /* PERLY_PERCENT_SIGN */ - YYSYMBOL_PERLY_PLUS = 21, /* PERLY_PLUS */ - YYSYMBOL_PERLY_SEMICOLON = 22, /* PERLY_SEMICOLON */ - YYSYMBOL_PERLY_SLASH = 23, /* PERLY_SLASH */ - YYSYMBOL_PERLY_SNAIL = 24, /* PERLY_SNAIL */ - YYSYMBOL_PERLY_STAR = 25, /* PERLY_STAR */ - YYSYMBOL_BAREWORD = 26, /* BAREWORD */ - YYSYMBOL_METHOD = 27, /* METHOD */ - YYSYMBOL_FUNCMETH = 28, /* FUNCMETH */ - YYSYMBOL_THING = 29, /* THING */ - YYSYMBOL_PMFUNC = 30, /* PMFUNC */ - YYSYMBOL_PRIVATEREF = 31, /* PRIVATEREF */ - YYSYMBOL_QWLIST = 32, /* QWLIST */ - YYSYMBOL_FUNC0OP = 33, /* FUNC0OP */ - YYSYMBOL_FUNC0SUB = 34, /* FUNC0SUB */ - YYSYMBOL_UNIOPSUB = 35, /* UNIOPSUB */ - YYSYMBOL_LSTOPSUB = 36, /* LSTOPSUB */ - YYSYMBOL_PLUGEXPR = 37, /* PLUGEXPR */ - YYSYMBOL_PLUGSTMT = 38, /* PLUGSTMT */ - YYSYMBOL_LABEL = 39, /* LABEL */ - YYSYMBOL_FORMAT = 40, /* FORMAT */ - YYSYMBOL_SUB = 41, /* SUB */ - YYSYMBOL_SIGSUB = 42, /* SIGSUB */ - YYSYMBOL_ANONSUB = 43, /* ANONSUB */ - YYSYMBOL_ANON_SIGSUB = 44, /* ANON_SIGSUB */ - YYSYMBOL_PACKAGE = 45, /* PACKAGE */ - YYSYMBOL_USE = 46, /* USE */ - YYSYMBOL_WHILE = 47, /* WHILE */ - YYSYMBOL_UNTIL = 48, /* UNTIL */ - YYSYMBOL_IF = 49, /* IF */ - YYSYMBOL_UNLESS = 50, /* UNLESS */ - YYSYMBOL_ELSE = 51, /* ELSE */ - YYSYMBOL_ELSIF = 52, /* ELSIF */ - YYSYMBOL_CONTINUE = 53, /* CONTINUE */ - YYSYMBOL_FOR = 54, /* FOR */ - YYSYMBOL_GIVEN = 55, /* GIVEN */ - YYSYMBOL_WHEN = 56, /* WHEN */ - YYSYMBOL_DEFAULT = 57, /* DEFAULT */ - YYSYMBOL_TRY = 58, /* TRY */ - YYSYMBOL_CATCH = 59, /* CATCH */ - YYSYMBOL_FINALLY = 60, /* FINALLY */ - YYSYMBOL_LOOPEX = 61, /* LOOPEX */ - YYSYMBOL_DOTDOT = 62, /* DOTDOT */ - YYSYMBOL_YADAYADA = 63, /* YADAYADA */ - YYSYMBOL_FUNC0 = 64, /* FUNC0 */ - YYSYMBOL_FUNC1 = 65, /* FUNC1 */ - YYSYMBOL_FUNC = 66, /* FUNC */ - YYSYMBOL_UNIOP = 67, /* UNIOP */ - YYSYMBOL_LSTOP = 68, /* LSTOP */ - YYSYMBOL_MULOP = 69, /* MULOP */ - YYSYMBOL_ADDOP = 70, /* ADDOP */ - YYSYMBOL_DOLSHARP = 71, /* DOLSHARP */ - YYSYMBOL_DO = 72, /* DO */ - YYSYMBOL_HASHBRACK = 73, /* HASHBRACK */ - YYSYMBOL_NOAMP = 74, /* NOAMP */ - YYSYMBOL_LOCAL = 75, /* LOCAL */ - YYSYMBOL_MY = 76, /* MY */ - YYSYMBOL_REQUIRE = 77, /* REQUIRE */ - YYSYMBOL_COLONATTR = 78, /* COLONATTR */ - YYSYMBOL_FORMLBRACK = 79, /* FORMLBRACK */ - YYSYMBOL_FORMRBRACK = 80, /* FORMRBRACK */ - YYSYMBOL_SUBLEXSTART = 81, /* SUBLEXSTART */ - YYSYMBOL_SUBLEXEND = 82, /* SUBLEXEND */ - YYSYMBOL_DEFER = 83, /* DEFER */ - YYSYMBOL_PREC_LOW = 84, /* PREC_LOW */ - YYSYMBOL_OROP = 85, /* OROP */ - YYSYMBOL_ANDOP = 86, /* ANDOP */ - YYSYMBOL_NOTOP = 87, /* NOTOP */ - YYSYMBOL_ASSIGNOP = 88, /* ASSIGNOP */ - YYSYMBOL_PERLY_QUESTION_MARK = 89, /* PERLY_QUESTION_MARK */ - YYSYMBOL_PERLY_COLON = 90, /* PERLY_COLON */ - YYSYMBOL_OROR = 91, /* OROR */ - YYSYMBOL_DORDOR = 92, /* DORDOR */ - YYSYMBOL_ANDAND = 93, /* ANDAND */ - YYSYMBOL_BITOROP = 94, /* BITOROP */ - YYSYMBOL_BITANDOP = 95, /* BITANDOP */ - YYSYMBOL_CHEQOP = 96, /* CHEQOP */ - YYSYMBOL_NCEQOP = 97, /* NCEQOP */ - YYSYMBOL_CHRELOP = 98, /* CHRELOP */ - YYSYMBOL_NCRELOP = 99, /* NCRELOP */ - YYSYMBOL_SHIFTOP = 100, /* SHIFTOP */ - YYSYMBOL_MATCHOP = 101, /* MATCHOP */ - YYSYMBOL_PERLY_EXCLAMATION_MARK = 102, /* PERLY_EXCLAMATION_MARK */ - YYSYMBOL_PERLY_TILDE = 103, /* PERLY_TILDE */ - YYSYMBOL_UMINUS = 104, /* UMINUS */ - YYSYMBOL_REFGEN = 105, /* REFGEN */ - YYSYMBOL_POWOP = 106, /* POWOP */ - YYSYMBOL_PREINC = 107, /* PREINC */ - YYSYMBOL_PREDEC = 108, /* PREDEC */ - YYSYMBOL_POSTINC = 109, /* POSTINC */ - YYSYMBOL_POSTDEC = 110, /* POSTDEC */ - YYSYMBOL_POSTJOIN = 111, /* POSTJOIN */ - YYSYMBOL_ARROW = 112, /* ARROW */ - YYSYMBOL_PERLY_PAREN_CLOSE = 113, /* PERLY_PAREN_CLOSE */ - YYSYMBOL_PERLY_PAREN_OPEN = 114, /* PERLY_PAREN_OPEN */ - YYSYMBOL_YYACCEPT = 115, /* $accept */ - YYSYMBOL_grammar = 116, /* grammar */ - YYSYMBOL_117_1 = 117, /* @1 */ - YYSYMBOL_118_2 = 118, /* @2 */ - YYSYMBOL_119_3 = 119, /* @3 */ - YYSYMBOL_120_4 = 120, /* @4 */ - YYSYMBOL_121_5 = 121, /* @5 */ - YYSYMBOL_122_6 = 122, /* @6 */ - YYSYMBOL_123_7 = 123, /* @7 */ - YYSYMBOL_block = 124, /* block */ - YYSYMBOL_empty = 125, /* empty */ - YYSYMBOL_formblock = 126, /* formblock */ - YYSYMBOL_remember = 127, /* remember */ - YYSYMBOL_mblock = 128, /* mblock */ - YYSYMBOL_mremember = 129, /* mremember */ - YYSYMBOL_stmtseq = 130, /* stmtseq */ - YYSYMBOL_formstmtseq = 131, /* formstmtseq */ - YYSYMBOL_fullstmt = 132, /* fullstmt */ - YYSYMBOL_labfullstmt = 133, /* labfullstmt */ - YYSYMBOL_barestmt = 134, /* barestmt */ - YYSYMBOL_135_8 = 135, /* $@8 */ - YYSYMBOL_136_9 = 136, /* $@9 */ - YYSYMBOL_137_10 = 137, /* $@10 */ - YYSYMBOL_138_11 = 138, /* $@11 */ - YYSYMBOL_139_12 = 139, /* $@12 */ - YYSYMBOL_140_13 = 140, /* @13 */ - YYSYMBOL_141_14 = 141, /* $@14 */ - YYSYMBOL_142_15 = 142, /* $@15 */ - YYSYMBOL_143_16 = 143, /* $@16 */ - YYSYMBOL_formline = 144, /* formline */ - YYSYMBOL_formarg = 145, /* formarg */ - YYSYMBOL_condition = 146, /* condition */ - YYSYMBOL_sideff = 147, /* sideff */ - YYSYMBOL_else = 148, /* else */ - YYSYMBOL_cont = 149, /* cont */ - YYSYMBOL_finally = 150, /* finally */ - YYSYMBOL_mintro = 151, /* mintro */ - YYSYMBOL_nexpr = 152, /* nexpr */ - YYSYMBOL_texpr = 153, /* texpr */ - YYSYMBOL_iexpr = 154, /* iexpr */ - YYSYMBOL_mexpr = 155, /* mexpr */ - YYSYMBOL_mnexpr = 156, /* mnexpr */ - YYSYMBOL_formname = 157, /* formname */ - YYSYMBOL_startsub = 158, /* startsub */ - YYSYMBOL_startanonsub = 159, /* startanonsub */ - YYSYMBOL_startformsub = 160, /* startformsub */ - YYSYMBOL_subname = 161, /* subname */ - YYSYMBOL_proto = 162, /* proto */ - YYSYMBOL_subattrlist = 163, /* subattrlist */ - YYSYMBOL_myattrlist = 164, /* myattrlist */ - YYSYMBOL_sigvarname = 165, /* sigvarname */ - YYSYMBOL_sigslurpsigil = 166, /* sigslurpsigil */ - YYSYMBOL_sigslurpelem = 167, /* sigslurpelem */ - YYSYMBOL_sigdefault = 168, /* sigdefault */ - YYSYMBOL_sigscalarelem = 169, /* sigscalarelem */ - YYSYMBOL_sigelem = 170, /* sigelem */ - YYSYMBOL_siglist = 171, /* siglist */ - YYSYMBOL_optsiglist = 172, /* optsiglist */ - YYSYMBOL_optsubsignature = 173, /* optsubsignature */ - YYSYMBOL_subsignature = 174, /* subsignature */ - YYSYMBOL_subsigguts = 175, /* subsigguts */ - YYSYMBOL_176_17 = 176, /* $@17 */ - YYSYMBOL_optsubbody = 177, /* optsubbody */ - YYSYMBOL_subbody = 178, /* subbody */ - YYSYMBOL_optsigsubbody = 179, /* optsigsubbody */ - YYSYMBOL_sigsubbody = 180, /* sigsubbody */ - YYSYMBOL_expr = 181, /* expr */ - YYSYMBOL_listexpr = 182, /* listexpr */ - YYSYMBOL_listop = 183, /* listop */ - YYSYMBOL_184_18 = 184, /* @18 */ - YYSYMBOL_method = 185, /* method */ - YYSYMBOL_subscripted = 186, /* subscripted */ - YYSYMBOL_termbinop = 187, /* termbinop */ - YYSYMBOL_termrelop = 188, /* termrelop */ - YYSYMBOL_relopchain = 189, /* relopchain */ - YYSYMBOL_termeqop = 190, /* termeqop */ - YYSYMBOL_eqopchain = 191, /* eqopchain */ - YYSYMBOL_termunop = 192, /* termunop */ - YYSYMBOL_anonymous = 193, /* anonymous */ - YYSYMBOL_termdo = 194, /* termdo */ - YYSYMBOL_term = 195, /* term */ - YYSYMBOL_196_19 = 196, /* @19 */ - YYSYMBOL_myattrterm = 197, /* myattrterm */ - YYSYMBOL_myterm = 198, /* myterm */ - YYSYMBOL_optlistexpr = 199, /* optlistexpr */ - YYSYMBOL_optexpr = 200, /* optexpr */ - YYSYMBOL_optrepl = 201, /* optrepl */ - YYSYMBOL_my_scalar = 202, /* my_scalar */ - YYSYMBOL_list_of_scalars = 203, /* list_of_scalars */ - YYSYMBOL_my_list_of_scalars = 204, /* my_list_of_scalars */ - YYSYMBOL_my_var = 205, /* my_var */ - YYSYMBOL_refgen_topic = 206, /* refgen_topic */ - YYSYMBOL_my_refgen = 207, /* my_refgen */ - YYSYMBOL_amper = 208, /* amper */ - YYSYMBOL_scalar = 209, /* scalar */ - YYSYMBOL_ary = 210, /* ary */ - YYSYMBOL_hsh = 211, /* hsh */ - YYSYMBOL_arylen = 212, /* arylen */ - YYSYMBOL_star = 213, /* star */ - YYSYMBOL_sliceme = 214, /* sliceme */ - YYSYMBOL_kvslice = 215, /* kvslice */ - YYSYMBOL_gelem = 216, /* gelem */ - YYSYMBOL_indirob = 217 /* indirob */ -}; -typedef enum yysymbol_kind_t yysymbol_kind_t; - - - - #define YYFINAL 16 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 3293 +#define YYLAST 3664 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 115 +#define YYNTOKENS 131 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 103 +#define YYNNTS 113 /* YYNRULES -- Number of rules. */ -#define YYNRULES 304 +#define YYNRULES 337 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 610 - -#define YYMAXUTOK 369 +#define YYNSTATES 669 +#define YYUNDEFTOK 2 +#define YYMAXUTOK 385 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ -#define YYTRANSLATE(YYX) \ - (0 <= (YYX) && (YYX) <= YYMAXUTOK \ - ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ - : YYSYMBOL_YYUNDEF) +#define YYTRANSLATE(YYX) \ + ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex. */ -static const yytype_int8 yytranslate[] = +static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -295,110 +65,109 @@ static const yytype_int8 yytranslate[] = 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114 + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_int16 yyrline[] = +static const yytype_uint16 yyrline[] = { - 0, 140, 140, 139, 151, 150, 161, 160, 174, 173, - 187, 186, 200, 199, 210, 209, 222, 230, 234, 241, - 246, 253, 260, 261, 271, 272, 281, 285, 289, 296, - 306, 308, 321, 318, 342, 337, 358, 366, 365, 374, - 380, 386, 391, 393, 395, 402, 410, 412, 409, 429, - 434, 443, 450, 449, 464, 472, 479, 481, 478, 490, - 497, 496, 511, 515, 519, 524, 532, 550, 551, 555, - 559, 561, 563, 565, 567, 569, 571, 574, 580, 581, - 586, 597, 598, 603, 605, 610, 617, 618, 622, 626, - 630, 635, 639, 643, 644, 647, 653, 658, 664, 665, - 670, 671, 676, 677, 679, 684, 686, 697, 699, 704, - 706, 710, 730, 731, 733, 739, 804, 806, 812, 814, - 818, 824, 825, 830, 831, 835, 839, 839, 906, 907, - 912, 924, 925, 929, 940, 942, 944, 948, 950, 955, - 959, 963, 967, 973, 978, 984, 990, 992, 994, 997, - 996, 1007, 1008, 1012, 1016, 1019, 1024, 1029, 1032, 1036, - 1040, 1046, 1054, 1061, 1067, 1069, 1071, 1076, 1078, 1080, - 1085, 1087, 1089, 1091, 1093, 1095, 1097, 1099, 1101, 1103, - 1105, 1109, 1111, 1113, 1115, 1119, 1121, 1125, 1127, 1129, - 1131, 1135, 1137, 1142, 1144, 1147, 1149, 1151, 1154, 1157, - 1168, 1171, 1179, 1181, 1183, 1186, 1192, 1194, 1198, 1199, - 1200, 1201, 1202, 1204, 1206, 1208, 1210, 1212, 1214, 1216, - 1218, 1220, 1222, 1224, 1226, 1228, 1238, 1248, 1258, 1268, - 1270, 1272, 1275, 1280, 1284, 1286, 1288, 1290, 1293, 1295, - 1298, 1300, 1302, 1304, 1306, 1308, 1310, 1312, 1314, 1317, - 1319, 1321, 1323, 1325, 1327, 1331, 1334, 1333, 1346, 1347, - 1348, 1353, 1355, 1357, 1359, 1364, 1366, 1369, 1371, 1373, - 1379, 1380, 1384, 1385, 1389, 1390, 1395, 1400, 1402, 1406, - 1409, 1413, 1414, 1415, 1418, 1419, 1422, 1423, 1426, 1430, - 1434, 1440, 1446, 1448, 1452, 1456, 1457, 1461, 1462, 1466, - 1467, 1472, 1474, 1476, 1479 + 0, 161, 161, 160, 172, 171, 182, 181, 195, 194, + 208, 207, 221, 220, 231, 230, 244, 246, 251, 259, + 263, 270, 275, 282, 288, 292, 294, 291, 301, 302, + 312, 313, 322, 326, 330, 337, 347, 349, 362, 359, + 383, 378, 406, 405, 431, 442, 454, 453, 464, 470, + 476, 481, 483, 485, 492, 500, 502, 499, 519, 524, + 533, 540, 539, 554, 562, 569, 568, 583, 590, 589, + 605, 604, 624, 628, 632, 636, 642, 650, 668, 669, + 673, 677, 679, 681, 683, 685, 687, 689, 692, 698, + 699, 704, 715, 716, 721, 723, 728, 735, 736, 740, + 744, 748, 753, 757, 761, 762, 765, 771, 776, 781, + 787, 788, 793, 794, 799, 800, 807, 812, 814, 825, + 827, 832, 834, 838, 858, 859, 861, 874, 934, 936, + 942, 944, 948, 954, 955, 960, 961, 965, 969, 969, + 1036, 1037, 1042, 1054, 1055, 1059, 1070, 1072, 1074, 1076, + 1078, 1082, 1084, 1089, 1093, 1097, 1101, 1107, 1112, 1118, + 1124, 1126, 1128, 1131, 1130, 1141, 1142, 1146, 1150, 1153, + 1158, 1163, 1166, 1170, 1174, 1180, 1188, 1195, 1201, 1203, + 1205, 1210, 1212, 1214, 1216, 1218, 1220, 1225, 1227, 1229, + 1231, 1233, 1235, 1237, 1239, 1241, 1243, 1245, 1247, 1249, + 1251, 1253, 1255, 1259, 1261, 1263, 1265, 1267, 1271, 1273, + 1277, 1279, 1281, 1283, 1287, 1289, 1294, 1296, 1299, 1301, + 1303, 1306, 1309, 1320, 1323, 1331, 1333, 1335, 1338, 1341, + 1349, 1351, 1355, 1356, 1357, 1358, 1359, 1361, 1363, 1365, + 1367, 1369, 1371, 1373, 1375, 1377, 1379, 1381, 1383, 1385, + 1395, 1405, 1415, 1425, 1427, 1429, 1432, 1437, 1441, 1443, + 1445, 1447, 1450, 1452, 1455, 1457, 1459, 1461, 1463, 1465, + 1467, 1469, 1471, 1474, 1476, 1478, 1480, 1482, 1484, 1488, + 1491, 1490, 1503, 1504, 1505, 1510, 1512, 1514, 1516, 1521, + 1523, 1526, 1528, 1530, 1535, 1540, 1545, 1553, 1555, 1557, + 1561, 1569, 1568, 1586, 1587, 1591, 1592, 1596, 1597, 1602, + 1607, 1609, 1613, 1616, 1620, 1621, 1622, 1625, 1626, 1629, + 1630, 1633, 1637, 1641, 1647, 1653, 1655, 1659, 1663, 1664, + 1668, 1669, 1673, 1674, 1679, 1681, 1683, 1686 }; #endif -/** Accessing symbol of state STATE. */ -#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) - -#if YYDEBUG || 0 -/* The user-facing name of the symbol whose (internal) number is - YYSYMBOL. No bounds checking. */ -static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; - +#if YYDEBUG || YYERROR_VERBOSE || 0 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { - "\"end of file\"", "error", "\"invalid token\"", "GRAMPROG", "GRAMEXPR", - "GRAMBLOCK", "GRAMBARESTMT", "GRAMFULLSTMT", "GRAMSTMTSEQ", - "GRAMSUBSIGNATURE", "PERLY_AMPERSAND", "PERLY_BRACE_OPEN", - "PERLY_BRACE_CLOSE", "PERLY_BRACKET_OPEN", "PERLY_BRACKET_CLOSE", - "PERLY_COMMA", "PERLY_DOLLAR", "PERLY_DOT", "PERLY_EQUAL_SIGN", - "PERLY_MINUS", "PERLY_PERCENT_SIGN", "PERLY_PLUS", "PERLY_SEMICOLON", - "PERLY_SLASH", "PERLY_SNAIL", "PERLY_STAR", "BAREWORD", "METHOD", - "FUNCMETH", "THING", "PMFUNC", "PRIVATEREF", "QWLIST", "FUNC0OP", - "FUNC0SUB", "UNIOPSUB", "LSTOPSUB", "PLUGEXPR", "PLUGSTMT", "LABEL", - "FORMAT", "SUB", "SIGSUB", "ANONSUB", "ANON_SIGSUB", "PACKAGE", "USE", - "WHILE", "UNTIL", "IF", "UNLESS", "ELSE", "ELSIF", "CONTINUE", "FOR", - "GIVEN", "WHEN", "DEFAULT", "TRY", "CATCH", "FINALLY", "LOOPEX", - "DOTDOT", "YADAYADA", "FUNC0", "FUNC1", "FUNC", "UNIOP", "LSTOP", - "MULOP", "ADDOP", "DOLSHARP", "DO", "HASHBRACK", "NOAMP", "LOCAL", "MY", - "REQUIRE", "COLONATTR", "FORMLBRACK", "FORMRBRACK", "SUBLEXSTART", - "SUBLEXEND", "DEFER", "PREC_LOW", "OROP", "ANDOP", "NOTOP", "ASSIGNOP", - "PERLY_QUESTION_MARK", "PERLY_COLON", "OROR", "DORDOR", "ANDAND", - "BITOROP", "BITANDOP", "CHEQOP", "NCEQOP", "CHRELOP", "NCRELOP", - "SHIFTOP", "MATCHOP", "PERLY_EXCLAMATION_MARK", "PERLY_TILDE", "UMINUS", - "REFGEN", "POWOP", "PREINC", "PREDEC", "POSTINC", "POSTDEC", "POSTJOIN", - "ARROW", "PERLY_PAREN_CLOSE", "PERLY_PAREN_OPEN", "$accept", "grammar", - "@1", "@2", "@3", "@4", "@5", "@6", "@7", "block", "empty", "formblock", - "remember", "mblock", "mremember", "stmtseq", "formstmtseq", "fullstmt", - "labfullstmt", "barestmt", "$@8", "$@9", "$@10", "$@11", "$@12", "@13", - "$@14", "$@15", "$@16", "formline", "formarg", "condition", "sideff", - "else", "cont", "finally", "mintro", "nexpr", "texpr", "iexpr", "mexpr", - "mnexpr", "formname", "startsub", "startanonsub", "startformsub", - "subname", "proto", "subattrlist", "myattrlist", "sigvarname", - "sigslurpsigil", "sigslurpelem", "sigdefault", "sigscalarelem", - "sigelem", "siglist", "optsiglist", "optsubsignature", "subsignature", - "subsigguts", "$@17", "optsubbody", "subbody", "optsigsubbody", - "sigsubbody", "expr", "listexpr", "listop", "@18", "method", - "subscripted", "termbinop", "termrelop", "relopchain", "termeqop", - "eqopchain", "termunop", "anonymous", "termdo", "term", "@19", - "myattrterm", "myterm", "optlistexpr", "optexpr", "optrepl", "my_scalar", - "list_of_scalars", "my_list_of_scalars", "my_var", "refgen_topic", - "my_refgen", "amper", "scalar", "ary", "hsh", "arylen", "star", - "sliceme", "kvslice", "gelem", "indirob", YY_NULLPTR + "$end", "error", "$undefined", "GRAMPROG", "GRAMEXPR", "GRAMBLOCK", + "GRAMBARESTMT", "GRAMFULLSTMT", "GRAMSTMTSEQ", "GRAMSUBSIGNATURE", + "PERLY_AMPERSAND", "PERLY_BRACE_OPEN", "PERLY_BRACE_CLOSE", + "PERLY_BRACKET_OPEN", "PERLY_BRACKET_CLOSE", "PERLY_COMMA", + "PERLY_DOLLAR", "PERLY_DOT", "PERLY_EQUAL_SIGN", "PERLY_MINUS", + "PERLY_PERCENT_SIGN", "PERLY_PLUS", "PERLY_SEMICOLON", "PERLY_SLASH", + "PERLY_SNAIL", "PERLY_STAR", "KW_FORMAT", "KW_PACKAGE", "KW_CLASS", + "KW_LOCAL", "KW_MY", "KW_FIELD", "KW_IF", "KW_ELSE", "KW_ELSIF", + "KW_UNLESS", "KW_FOR", "KW_UNTIL", "KW_WHILE", "KW_CONTINUE", "KW_GIVEN", + "KW_WHEN", "KW_DEFAULT", "KW_TRY", "KW_CATCH", "KW_FINALLY", "KW_DEFER", + "KW_REQUIRE", "KW_DO", "KW_USE_or_NO", "KW_SUB_named", + "KW_SUB_named_sig", "KW_SUB_anon", "KW_SUB_anon_sig", "KW_METHOD_named", + "KW_METHOD_anon", "BAREWORD", "METHCALL0", "METHCALL", "THING", "PMFUNC", + "PRIVATEREF", "QWLIST", "FUNC0OP", "FUNC0SUB", "UNIOPSUB", "LSTOPSUB", + "PLUGEXPR", "PLUGSTMT", "LABEL", "LOOPEX", "DOTDOT", "YADAYADA", "FUNC0", + "FUNC1", "FUNC", "UNIOP", "LSTOP", "POWOP", "MULOP", "ADDOP", "DOLSHARP", + "HASHBRACK", "NOAMP", "COLONATTR", "FORMLBRACK", "FORMRBRACK", + "SUBLEXSTART", "SUBLEXEND", "PHASER", "PREC_LOW", "PLUGIN_LOW_OP", + "OROP", "PLUGIN_LOGICAL_OR_LOW_OP", "ANDOP", "PLUGIN_LOGICAL_AND_LOW_OP", + "NOTOP", "ASSIGNOP", "PLUGIN_ASSIGN_OP", "PERLY_QUESTION_MARK", + "PERLY_COLON", "OROR", "DORDOR", "PLUGIN_LOGICAL_OR_OP", "ANDAND", + "PLUGIN_LOGICAL_AND_OP", "BITOROP", "BITANDOP", "CHEQOP", "NCEQOP", + "CHRELOP", "NCRELOP", "PLUGIN_REL_OP", "SHIFTOP", "PLUGIN_ADD_OP", + "PLUGIN_MUL_OP", "MATCHOP", "PERLY_EXCLAMATION_MARK", "PERLY_TILDE", + "UMINUS", "REFGEN", "PLUGIN_POW_OP", "PREINC", "PREDEC", "POSTINC", + "POSTDEC", "POSTJOIN", "PLUGIN_HIGH_OP", "ARROW", "PERLY_PAREN_CLOSE", + "PERLY_PAREN_OPEN", "$accept", "grammar", "@1", "@2", "@3", "@4", "@5", + "@6", "@7", "sigsub_or_method_named", "block", "empty", "formblock", + "remember", "mblock", "mremember", "catch_paren", "$@8", "$@9", + "stmtseq", "formstmtseq", "fullstmt", "labfullstmt", "barestmt", "$@10", + "$@11", "$@12", "$@13", "$@14", "$@15", "@16", "$@17", "$@18", "$@19", + "formline", "formarg", "condition", "sideff", "else", "cont", "finally", + "mintro", "nexpr", "texpr", "iexpr", "mexpr", "mnexpr", "formname", + "startsub", "startanonsub", "startanonmethod", "startformsub", "subname", + "proto", "subattrlist", "myattrlist", "sigvarname", "sigslurpsigil", + "sigslurpelem", "sigdefault", "sigscalarelem", "sigelem", "siglist", + "optsiglist", "optsubsignature", "subsignature", "subsigguts", "$@20", + "optsubbody", "subbody", "optsigsubbody", "sigsubbody", "expr", + "listexpr", "listop", "@21", "methodname", "subscripted", "termbinop", + "termrelop", "relopchain", "termeqop", "eqopchain", "termunop", + "anonymous", "termdo", "term", "@22", "myattrterm", "myterm", "fieldvar", + "optfieldattrlist", "fielddecl", "$@23", "optlistexpr", "optexpr", + "optrepl", "my_scalar", "list_of_scalars", "my_list_of_scalars", + "my_var", "refgen_topic", "my_refgen", "amper", "scalar", "ary", "hsh", + "arylen", "star", "sliceme", "kvslice", "gelem", "indirob", YY_NULLPTR }; - -static const char * -yysymbol_name (yysymbol_kind_t yysymbol) -{ - return yytname[yysymbol]; -} #endif -#ifdef YYPRINT +# ifdef YYPRINT /* YYTOKNUM[NUM] -- (External) token number corresponding to the (internal) symbol number NUM (which must be that of a token). */ -static const yytype_int16 yytoknum[] = +static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, @@ -411,185 +180,201 @@ static const yytype_int16 yytoknum[] = 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369 + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385 }; -#endif +# endif -#define YYPACT_NINF (-498) +#define YYPACT_NINF -551 -#define yypact_value_is_default(Yyn) \ - ((Yyn) == YYPACT_NINF) +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-551))) -#define YYTABLE_NINF (-300) +#define YYTABLE_NINF -336 -#define yytable_value_is_error(Yyn) \ - ((Yyn) == YYTABLE_NINF) +#define yytable_value_is_error(Yytable_value) \ + (!!((Yytable_value) == (-336))) /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int16 yypact[] = { - 477, -498, -498, -498, -498, -498, -498, -498, 37, -498, - 2923, 16, 1589, 1490, -498, -498, -498, -498, 214, 2923, - 214, 2923, 214, 2923, 214, 214, -498, 214, 214, -498, - -498, 33, -64, -498, 2923, -498, -498, -498, -498, 2923, - -49, -46, -37, 2155, 2056, 214, 2155, 2923, 155, 2923, - 50, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2251, -498, - 2, 57, -498, 10, -498, 120, -14, 176, 1, -498, - -498, -498, 3091, -498, -498, -5, 171, 189, 194, -498, - 94, 220, 224, 111, -498, -498, -498, -498, -498, -498, - 155, 155, 125, -498, 26, 69, 99, 112, 9, 133, - 136, 16, 244, 165, 244, 208, -498, 243, 512, 1490, - -498, -498, -498, -498, 630, -498, 35, 774, -498, -498, - -498, -498, -498, 260, -498, 400, -498, 400, -498, -498, - 2923, 177, 229, 2923, 201, 223, 16, 292, 248, 3091, - 230, 2347, 2923, 2056, -498, 223, 1952, -498, 57, -498, - 1850, 2923, -498, -498, 223, 323, -498, -498, 2923, 223, - 3019, 2443, 268, -498, -498, -498, 223, 57, 400, 400, - 400, 253, 253, 354, 59, 2923, 2923, 2923, 2923, 2923, - 2539, -498, -498, 2923, -498, -498, 2923, 2923, 2923, 2923, - 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, - 2923, 2923, 2923, 2923, -498, -498, -498, 149, 2635, 2923, - 2923, 2923, 2923, 2923, 2923, 2923, -498, 331, -498, -498, - 348, -498, -498, -498, -498, -498, 283, 188, -498, -498, - 265, -498, -498, -498, -498, 333, -498, -498, 16, -498, - -498, -498, 2923, 2923, 2923, 2923, 2923, 2923, -498, -498, - -498, 359, -498, -498, -498, 359, -498, -498, -498, 378, - -498, -498, -498, 2923, 2923, 22, -498, -498, -498, -498, - 248, 375, -498, -498, -498, -498, 156, 334, 314, 2923, - 57, 393, -498, 2731, 400, 268, 78, 117, 139, -498, - 181, 392, -498, 2923, 415, 343, -498, 3091, 72, 25, - -498, 185, 223, 361, 3181, 344, 238, 3091, 3046, 1884, - 1884, 1669, 444, 301, 361, 361, 223, 223, 308, 400, - 400, 407, 2923, 2923, 622, 408, 416, 418, -498, 421, - 2827, 337, -498, -498, 191, 82, 27, 124, 31, 153, - 53, 158, 879, -498, -498, 429, -498, -498, 20, 426, - 2923, 2923, 2923, 2923, -498, -12, -498, -498, 349, -498, - -498, -498, -498, 1685, 356, -498, 2923, 2923, -498, 351, - -498, -498, 2, -498, 2, -498, -498, -498, -498, -498, - 369, 369, 35, 353, 114, -498, 2923, -498, -498, 360, - -498, -498, -498, -498, 242, -498, 15, 256, -498, -498, - -498, 68, 2923, 464, -498, -498, 2923, -498, 174, 85, - -498, -498, -498, -498, -498, -498, 274, 2923, -498, 465, - -498, 466, -498, 475, -498, 476, -498, -498, -498, 292, - 248, -498, -498, 463, 380, 2, 384, 386, 2, 387, - 487, 391, -498, -498, -498, -498, -498, 402, 495, 143, - -498, 2923, 406, 409, 995, -498, 2923, -498, -498, -498, - -498, -498, 2923, -498, 441, -498, 514, -498, -498, -498, - 515, -498, -498, 49, -498, 92, -498, 3136, 517, -498, - -498, 417, -498, -498, -498, -498, 524, 248, 526, -498, - 2923, -498, -498, 244, 244, 519, 423, -498, 2923, 2923, - 244, -498, 435, 424, 244, 244, -498, -498, 3091, 2, - -498, -498, 439, -498, -498, -498, -498, 478, 535, -498, - -498, -498, -498, 541, 244, 244, 228, 228, 487, 450, - 452, 454, 208, 2923, 2923, 244, -498, -498, 487, 1094, - -498, 1193, -498, -498, -498, -498, 1292, -498, 208, 208, - 244, 455, -498, -498, -498, -498, 2923, 244, 244, -498, - 548, 460, 208, -498, -498, -498, -498, 18, -498, -498, - -498, -498, 2923, 461, 208, 208, -498, 244, -498, 462, - 560, 499, -498, 467, 244, -498, -498, -498, 208, 244, - -498, -498, -498, -498, 244, 208, 1781, -498, 521, 1391, - 228, -498, 469, 16, -498, -498, -498, 244, -498, -498 + 926, -551, -551, -551, -551, -551, -551, -551, 34, -551, + 2909, 41, 1877, 1762, -551, -551, -551, -551, 46, 2909, + 46, 2909, 46, 2909, 46, 46, 2909, 12, 2909, 2198, + -551, -551, -551, -551, 46, 46, -551, -551, 42, -66, + -551, 2909, -551, -551, 2909, -41, -38, -64, 2198, 2119, + 46, 2909, -23, 2909, 2909, 2909, 2909, 2909, 2909, 2277, + -551, 680, 101, -551, 4, -551, -42, 10, 63, 22, + -551, -551, -551, 3152, -551, -551, 18, 185, 200, 212, + -551, 151, 219, 229, 192, -551, -551, -551, -551, -551, + 160, 177, 129, 82, 111, 13, 127, 134, 175, 180, + 41, 300, 300, -551, -23, -551, -551, -551, 292, -551, + -23, 276, -551, 303, 432, 313, 1762, -551, -551, -551, + -551, 660, -551, 384, 832, -551, -551, -551, -551, -551, + 323, -551, 329, -551, 329, -551, -551, 317, 2988, 2356, + 255, -551, -551, -551, 317, -551, 317, 281, 261, 261, + 2909, 216, 266, 2909, 230, 317, 41, 3152, 232, 2435, + 2909, 2119, -551, 317, 3067, -551, 101, -551, 2514, 2909, + -551, 326, -551, -551, 2909, 101, 329, 329, 329, 642, + 642, 350, 262, 2909, 2909, 2909, 2909, 2909, 2909, 2909, + 2593, -551, -551, 2909, -551, -551, 2909, 2909, 2909, 2909, + 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2909, + 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2909, + 2909, 2909, -551, -551, -551, 2909, 84, 2672, 2909, 2909, + 2909, 2909, 2909, 2909, 2909, -551, 318, 324, 325, 289, + -551, -551, -551, -551, -551, 259, 741, -551, -551, 258, + -551, -551, -551, -551, -551, -551, 341, -551, -551, -551, + -551, -551, -551, 41, -551, -551, -551, 2909, 2909, 2909, + 2909, 2909, 2909, -551, -551, -551, -551, 332, -551, -551, + -551, 332, -551, -551, -551, 372, -551, -551, 2751, 329, + 255, 40, 250, 278, -551, 273, 340, -551, -551, -551, + 261, 342, -551, -551, -551, -551, 2909, 2909, 96, -551, + -551, -551, -551, 390, 315, 282, 2909, 101, 398, -551, + 2909, 399, 161, 161, -551, -551, 3254, 66, 100, -551, + 411, 3517, 3497, 3356, 329, 492, 3220, 3203, 3254, 3254, + 3101, 3395, 3395, 3395, 3418, 3418, 3457, 3478, 3497, 3497, + 3517, 3517, 3536, 459, 3220, 492, 329, 329, 146, 392, + 2909, 2909, 322, 393, 400, 401, -551, 410, 2830, 294, + -551, -551, 417, 89, 115, 236, 142, 249, 159, 257, + 947, -551, -551, 418, 54, 261, 380, -551, 343, 2909, + 2909, -551, 6, -551, -551, 316, -551, -551, -551, -551, + 1961, 129, -551, 2909, 2909, 2909, 2909, -551, -551, 403, + -551, 426, -551, -551, -551, 680, -551, -551, -551, 680, + -551, -551, -551, 352, 352, 384, -12, 449, -551, -551, + -551, -551, -551, 330, -551, -551, 334, 103, -551, 2909, + -551, -551, -551, 500, -551, 173, 2909, 453, -551, -551, + 2909, -551, 277, 214, -551, -551, -551, -551, -551, -551, + 652, 2909, -551, 454, -551, 460, -551, 462, -551, 463, + -551, -551, -551, -551, -551, 156, -551, -551, 347, 680, + 349, 455, 358, -551, -551, -551, -551, -551, 351, 457, + 183, -551, 2909, 361, 363, 680, 365, 366, 1072, 367, + 442, 281, -551, 490, -551, -551, 261, 2909, -551, -551, + -551, -551, 37, -551, -551, -551, 491, -551, -551, 2909, + -551, 419, -551, -551, -551, 224, -551, 3305, 502, -551, + -551, 386, -551, -551, -551, -551, 494, -551, -551, -551, + 2909, 300, 300, 503, 391, -551, 2909, 2909, 300, -551, + 415, 404, -551, -551, 300, 300, -551, -551, -551, -551, + 2909, 261, -551, 506, 3152, 423, -551, 680, -551, -551, + -551, -551, 436, -551, -551, 3152, 247, 247, 455, 424, + 428, 429, 276, 2909, 2909, 300, 300, 300, -551, -551, + 455, 300, 507, 426, 1187, -551, -551, -551, -551, 1302, + -551, 1417, -551, 300, 431, -551, -551, -551, -551, 2909, + 300, 300, -551, 525, 430, 276, 276, 276, -551, 519, + -551, -551, -551, -551, -551, 20, -551, 1532, -551, 2909, + 439, 276, 276, -551, 300, -551, -551, -551, 440, 41, + -551, 548, 486, -551, -551, 447, 300, -551, -551, -551, + 276, -551, -551, -551, -551, -551, -551, 300, 276, 2040, + -551, 1647, 247, -551, 448, -551, -551, 300, -551 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ -static const yytype_int16 yydefact[] = +static const yytype_uint16 yydefact[] = { - 0, 2, 4, 6, 8, 10, 12, 14, 0, 19, - 17, 0, 0, 0, 17, 126, 1, 17, 0, 17, - 0, 0, 0, 0, 0, 0, 258, 0, 0, 229, - 256, 217, 251, 253, 247, 96, 260, 96, 96, 239, - 249, 0, 0, 242, 17, 0, 0, 17, 0, 0, - 0, 245, 0, 0, 0, 0, 0, 0, 0, 272, - 273, 136, 259, 224, 208, 172, 181, 173, 187, 209, - 210, 211, 139, 214, 5, 230, 219, 222, 221, 223, - 220, 0, 0, 0, 19, 7, 70, 65, 30, 97, - 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 9, 0, 71, 0, - 11, 27, 26, 22, 0, 15, 17, 0, 301, 304, - 303, 302, 288, 0, 289, 193, 291, 194, 290, 294, - 17, 0, 0, 0, 0, 248, 0, 17, 17, 240, - 0, 0, 17, 17, 243, 244, 301, 270, 271, 146, - 302, 0, 292, 207, 206, 0, 98, 99, 17, 215, - 0, 0, 262, 267, 269, 268, 246, 241, 195, 196, - 213, 200, 201, 218, 0, 0, 0, 137, 0, 0, - 0, 184, 183, 0, 190, 189, 0, 0, 0, 0, + 0, 2, 4, 6, 8, 10, 12, 14, 0, 21, + 19, 0, 0, 0, 19, 138, 1, 19, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, + 107, 107, 108, 282, 0, 0, 253, 280, 241, 275, + 277, 271, 107, 284, 263, 273, 0, 0, 266, 19, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 305, 306, 150, 283, 248, 232, 191, 203, 192, 210, + 233, 234, 235, 153, 238, 5, 254, 243, 246, 245, + 247, 244, 0, 0, 0, 21, 7, 81, 76, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 197, 198, 199, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 17, 95, 95, - 0, 37, 19, 19, 19, 19, 19, 0, 19, 19, - 0, 19, 19, 43, 21, 0, 64, 63, 0, 81, - 59, 62, 0, 0, 0, 0, 0, 0, 29, 28, - 23, 107, 110, 109, 121, 107, 117, 116, 120, 122, - 127, 202, 144, 17, 0, 0, 252, 149, 101, 100, - 17, 104, 102, 19, 250, 254, 0, 0, 0, 0, - 140, 0, 233, 0, 264, 0, 219, 222, 221, 266, - 0, 106, 261, 0, 216, 135, 134, 138, 0, 0, - 163, 0, 186, 192, 176, 169, 170, 167, 0, 178, - 179, 177, 175, 174, 191, 188, 185, 182, 171, 180, - 168, 0, 0, 0, 0, 298, 296, 300, 151, 0, - 0, 143, 152, 231, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 93, 94, 0, 32, 34, 0, 0, - 88, 0, 0, 0, 286, 0, 287, 284, 0, 285, - 281, 282, 283, 0, 0, 19, 0, 0, 17, 0, - 82, 74, 69, 75, 90, 72, 73, 76, 77, 108, - 17, 17, 118, 0, 17, 165, 17, 19, 103, 17, - 205, 255, 148, 147, 0, 203, 218, 0, 263, 265, - 105, 0, 0, 0, 156, 162, 0, 237, 0, 0, - 234, 236, 235, 238, 293, 160, 0, 17, 232, 0, - 154, 0, 225, 0, 226, 0, 16, 19, 31, 17, - 17, 19, 36, 0, 0, 89, 0, 0, 91, 0, - 0, 0, 276, 19, 86, 87, 92, 0, 0, 71, - 52, 0, 0, 0, 0, 56, 113, 112, 115, 111, - 119, 145, 0, 274, 0, 150, 0, 204, 126, 123, - 0, 124, 141, 216, 166, 0, 159, 212, 0, 155, - 161, 0, 157, 227, 228, 153, 0, 17, 19, 60, - 17, 85, 85, 0, 0, 280, 0, 279, 0, 0, - 0, 46, 0, 0, 0, 0, 20, 19, 114, 275, - 257, 17, 0, 17, 164, 158, 142, 0, 19, 132, - 35, 131, 17, 0, 0, 0, 17, 17, 277, 0, - 0, 0, 17, 88, 0, 0, 41, 42, 0, 0, - 125, 0, 17, 129, 33, 128, 0, 38, 17, 17, - 0, 0, 78, 39, 40, 278, 0, 0, 0, 55, - 0, 0, 17, 57, 130, 133, 24, 0, 61, 44, - 45, 79, 0, 0, 17, 17, 47, 0, 51, 0, - 0, 17, 25, 0, 0, 49, 54, 85, 17, 0, - 18, 17, 67, 66, 0, 17, 0, 53, 83, 0, - 17, 50, 0, 0, 58, 68, 80, 0, 84, 48 + 0, 0, 0, 106, 0, 16, 17, 36, 0, 106, + 0, 19, 9, 0, 82, 0, 0, 11, 33, 32, + 28, 0, 15, 19, 0, 334, 337, 336, 335, 321, + 0, 322, 216, 324, 217, 323, 327, 239, 0, 0, + 286, 291, 293, 292, 270, 231, 230, 19, 19, 19, + 19, 0, 0, 0, 0, 272, 0, 264, 0, 0, + 19, 19, 267, 268, 282, 303, 304, 160, 243, 0, + 325, 0, 110, 111, 19, 265, 218, 219, 237, 223, + 224, 242, 0, 0, 0, 0, 0, 151, 0, 0, + 0, 206, 205, 0, 213, 212, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 220, 221, 222, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 19, 0, 0, 19, + 294, 296, 295, 21, 21, 21, 0, 21, 21, 0, + 21, 21, 21, 21, 52, 23, 0, 74, 46, 106, + 75, 42, 106, 0, 92, 67, 73, 0, 0, 0, + 0, 0, 0, 72, 35, 34, 29, 119, 122, 121, + 133, 119, 129, 128, 132, 134, 139, 225, 0, 288, + 0, 243, 246, 245, 290, 0, 118, 285, 113, 112, + 19, 116, 114, 21, 21, 158, 19, 0, 0, 276, + 163, 274, 278, 0, 0, 0, 0, 154, 0, 257, + 0, 240, 148, 149, 146, 147, 152, 0, 0, 177, + 0, 209, 215, 195, 184, 186, 188, 202, 182, 183, + 0, 198, 200, 199, 196, 197, 194, 193, 214, 211, + 208, 204, 207, 190, 189, 187, 201, 185, 181, 0, + 0, 0, 0, 331, 329, 333, 165, 0, 0, 157, + 166, 255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 104, 105, 0, 0, 19, 298, 299, 300, 0, + 0, 319, 0, 320, 317, 0, 318, 314, 315, 316, + 0, 0, 21, 0, 99, 0, 0, 19, 21, 0, + 38, 21, 40, 93, 83, 80, 84, 87, 86, 101, + 85, 88, 120, 19, 19, 130, 242, 0, 287, 289, + 117, 21, 115, 19, 228, 229, 0, 19, 179, 19, + 279, 162, 161, 0, 226, 0, 0, 0, 170, 176, + 0, 261, 0, 0, 258, 260, 259, 262, 326, 174, + 0, 19, 256, 0, 168, 0, 249, 0, 250, 0, + 18, 21, 37, 21, 44, 0, 297, 301, 0, 102, + 0, 0, 0, 309, 21, 97, 98, 103, 0, 0, + 82, 61, 0, 0, 0, 100, 0, 0, 0, 19, + 0, 19, 141, 0, 43, 140, 19, 125, 124, 127, + 123, 131, 240, 227, 138, 135, 0, 136, 159, 0, + 307, 0, 164, 155, 180, 0, 173, 236, 0, 169, + 175, 0, 171, 251, 252, 167, 0, 68, 21, 45, + 0, 0, 0, 313, 0, 312, 0, 0, 0, 55, + 0, 0, 96, 96, 0, 0, 22, 25, 24, 65, + 19, 19, 19, 21, 126, 0, 19, 308, 281, 178, + 172, 156, 0, 19, 70, 302, 19, 19, 310, 0, + 0, 0, 19, 99, 0, 0, 0, 0, 50, 51, + 0, 0, 0, 21, 0, 144, 41, 143, 137, 0, + 19, 0, 19, 0, 0, 89, 48, 49, 311, 0, + 0, 0, 64, 0, 0, 19, 19, 19, 26, 94, + 47, 39, 142, 145, 30, 0, 69, 0, 90, 0, + 0, 19, 19, 56, 0, 60, 54, 53, 0, 0, + 66, 0, 19, 31, 71, 0, 0, 58, 63, 96, + 19, 27, 95, 20, 19, 78, 77, 0, 19, 0, + 62, 0, 19, 59, 0, 79, 91, 0, 57 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -498, -498, -498, -498, -498, -498, -498, -498, -498, -11, - 5, -498, 77, -56, -498, -15, -498, 572, 474, 6, - -498, -498, -498, -498, -498, -498, -498, -498, -498, -498, - -498, 137, -360, -497, -237, -498, -487, -498, 54, 237, - -310, -6, -498, 71, 259, -498, 240, 170, -264, 309, - 345, -498, -498, 221, -498, 226, -498, -498, -498, -498, - 135, -498, -498, 93, -498, 122, 73, -32, -498, -498, - -498, -498, -498, -498, -498, -498, -498, -498, -498, -498, - 570, -498, -498, 457, -129, -9, -498, -498, -498, -498, - 250, -498, -498, 385, 51, -42, -24, -498, -498, -498, - -498, -498, 36 + -551, -551, -551, -551, -551, -551, -551, -551, -551, -551, + -4, -10, -551, 50, -55, -551, -551, -551, -551, -13, + -551, 568, 466, 28, -551, -551, -551, -551, -551, -551, + -551, -551, -551, -551, -551, -551, 52, -390, -550, -533, + -551, -534, -551, 14, 193, -220, -61, -551, -96, 137, + -551, -551, -17, 102, -146, 311, 328, -551, -551, 186, + -551, 179, -551, -551, -551, -551, 97, -551, 30, 184, + -551, -293, 16, -47, -551, -551, -551, -551, -551, -551, + -551, -551, -551, -551, -551, -551, 610, -551, -551, 489, + -551, -551, -551, -551, -126, -14, -551, -551, -551, -551, + 223, -551, -551, 382, 36, -19, -15, -551, -551, -551, + -551, -551, 56 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 8, 9, 10, 11, 12, 13, 14, 15, 105, - 239, 428, 389, 235, 368, 114, 567, 250, 111, 112, - 429, 430, 349, 533, 587, 502, 507, 579, 522, 582, - 593, 371, 107, 553, 240, 604, 524, 446, 434, 373, - 437, 448, 345, 221, 136, 217, 158, 270, 273, 292, - 380, 255, 256, 458, 257, 258, 259, 260, 470, 471, - 115, 116, 544, 467, 520, 390, 108, 61, 62, 386, - 331, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 132, 73, 162, 149, 74, 464, 441, 495, 496, - 357, 358, 229, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 124 + -1, 8, 9, 10, 11, 12, 13, 14, 15, 110, + 111, 120, 472, 433, 256, 407, 559, 590, 638, 121, + 625, 276, 118, 119, 501, 506, 411, 409, 583, 649, + 550, 591, 573, 602, 643, 656, 414, 113, 606, 265, + 640, 586, 487, 494, 418, 478, 489, 383, 258, 147, + 149, 236, 174, 300, 303, 297, 423, 281, 282, 509, + 283, 284, 285, 286, 516, 517, 122, 123, 504, 505, + 596, 434, 114, 62, 63, 439, 369, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 152, 74, 140, + 239, 388, 115, 540, 167, 75, 521, 482, 543, 544, + 394, 395, 248, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 131 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -597,859 +382,952 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 85, 262, 117, 445, 20, 525, 387, 120, 164, 120, - 123, 120, 148, 120, 120, 59, 120, 120, 106, 113, - 167, 178, 113, 179, 59, 20, 165, 84, 293, 282, - 554, 431, 144, 120, 120, 153, 385, 16, 155, 404, - 580, 420, 432, 439, 142, 422, 133, 581, 237, 147, - 134, 251, 59, 447, 122, 252, 452, 453, 126, 253, - 128, 129, 402, 130, 131, 140, 20, 424, 141, 121, - 22, 121, 177, 121, 24, 121, 121, 143, 121, 121, - 151, 152, 474, 60, 183, 226, 17, 175, 176, 209, - 233, 210, 60, -266, 403, 150, 121, 186, 148, 479, - 596, 163, 440, 606, 419, -299, 514, 175, 176, 208, - 175, 176, 175, 176, 227, 249, 175, 176, 287, 280, - 60, 254, 215, 228, 180, 267, 148, -265, -295, 177, - -295, 174, 120, 277, 278, 147, 288, 462, 175, 176, - 222, 503, 269, 272, 175, 176, 421, 59, 59, 230, - -297, 220, -297, 175, 176, 160, -267, 175, 176, 321, - 322, 216, 323, 147, 161, 324, 488, 175, 176, 325, - 175, 176, 294, 326, 327, 423, 328, 175, 176, 279, - 425, 156, 209, 223, 210, 361, 157, 236, 530, 531, - 242, 243, 244, 245, 150, -269, 478, 246, 18, 247, - -295, 342, -295, 362, 20, -297, 265, -297, 22, 175, - 176, 286, 24, 224, 276, 60, 60, -268, 181, 182, - 329, 113, 344, 518, 561, 84, 225, 370, 175, 176, - 20, 211, 384, 212, 290, 213, 445, 214, 175, 176, - 118, 175, 176, 175, 176, 119, 573, 231, 295, 296, - 232, 298, 299, 301, 383, 234, -91, 465, 332, 175, - 176, 238, 583, 330, 356, 241, 175, 176, 59, 391, - 175, 176, 184, 185, 261, 272, 175, 176, 360, 550, - 551, 334, 335, 336, 337, 338, 339, 340, 341, 346, - 347, 263, 188, 189, 399, 559, 137, 138, 405, 350, - 351, 352, 353, 355, 418, 363, 364, 188, 366, 367, - 264, 569, 570, 120, 266, 372, 374, 372, 372, 372, - 372, 268, 361, 201, 202, 578, 271, 175, 176, 203, - 218, 219, 204, 205, 206, 207, 60, 585, 586, 202, - 362, 175, 176, 274, 203, 281, 291, 204, 205, 206, - 207, 597, 394, 454, 148, 472, 397, 343, 601, 175, - 176, 523, -300, -300, -300, 207, 401, 293, 444, 473, - 188, 189, 20, 113, 348, 121, 22, 188, 189, 365, - 24, 375, 376, 377, 378, 457, 457, 480, 354, 463, - 379, 147, 369, 382, 469, 408, 409, 197, 198, 199, - 200, 201, 202, 416, 388, 395, 442, 203, 481, 202, - 204, 205, 206, 207, 203, 360, 392, 204, 205, 206, - 207, 400, 59, 435, 374, 438, 438, 393, 402, 176, - 188, 189, 407, 411, 269, 272, 449, 526, 527, 438, - 438, 412, 451, 413, 532, 202, 414, 427, 536, 537, - 203, 417, 433, 204, 205, 206, 207, 456, 148, 199, - 200, 201, 202, 443, 466, 455, 461, 203, 548, 549, - 204, 205, 206, 207, 468, 475, 476, 482, 483, 562, - 1, 2, 3, 4, 5, 6, 7, 484, 485, 490, - 60, 497, 272, 491, 571, 147, 539, 492, 541, 493, - 494, 574, 575, 20, 486, 498, 203, 546, 489, 204, - 205, 206, 207, 188, 189, 500, 113, 501, 113, 504, - 499, 588, 505, 510, 438, 511, 513, 113, 595, 515, - 516, 552, 552, 598, 528, 509, 529, 535, 600, 196, - 197, 198, 199, 200, 201, 202, 517, 566, 519, 534, - 203, 609, 540, 204, 205, 206, 207, 543, 542, 242, - 243, 244, 245, 547, 556, 557, 246, 558, 247, 572, - 576, 438, 438, 577, 584, 589, 599, 590, 591, 555, - 594, 603, 607, 248, 538, 110, 592, 560, 436, 563, - 602, 125, 608, 127, 398, 466, 113, 175, 176, 487, - 381, 444, 459, 512, 135, 552, 435, 438, 460, 139, - 521, 545, 359, 145, 450, 0, 154, 285, 0, 159, - 0, 166, 0, 168, 169, 170, 171, 172, 0, 438, - -13, 86, 0, 84, 0, 0, 0, 0, 20, 0, - 18, 84, 0, 19, 0, 438, 20, 410, 118, 21, - 22, 23, 87, 119, 24, 25, 26, 27, 28, 29, - 30, 0, 31, 32, 33, 34, 35, 36, 88, 109, - 89, 90, 91, 37, 38, 92, 93, 94, 95, 96, - 97, 0, 0, 0, 98, 99, 100, 101, 102, 0, - 0, 39, 0, 103, 40, 41, 42, 43, 44, 0, - 0, 45, 46, 47, 48, 49, 50, 51, 0, 0, - 0, 0, 0, 104, 0, 0, 0, 52, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 284, 0, 53, 54, 0, 55, 0, 56, 57, 0, - 0, 0, 0, 0, 58, 0, 0, 297, 0, 0, - 0, 0, 0, 302, 0, 0, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, -3, 86, 0, 0, 0, 0, - 0, 0, 0, 0, 18, 84, 0, 19, 0, 0, - 20, 0, 0, 21, 22, 23, 87, 0, 24, 25, - 26, 27, 28, 29, 30, 0, 31, 32, 33, 34, - 35, 36, 88, 109, 89, 90, 91, 37, 38, 92, - 93, 94, 95, 96, 97, 0, 0, 0, 98, 99, - 100, 101, 102, 0, 0, 39, 0, 103, 40, 41, - 42, 43, 44, 0, 0, 45, 46, 47, 48, 49, - 50, 51, 0, 0, 0, 0, 0, 104, 0, 0, - 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 53, 54, 0, 55, - 86, 56, 57, 0, 0, 0, 0, 0, 58, 18, - 84, 426, 19, 0, 0, 20, 0, 0, 21, 22, - 23, 87, 0, 24, 25, 26, 27, 28, 29, 30, - 0, 31, 32, 33, 34, 35, 36, 88, 109, 89, - 90, 91, 37, 38, 92, 93, 94, 95, 96, 97, - 0, 0, 0, 98, 99, 100, 101, 102, 0, 0, - 39, 0, 103, 40, 41, 42, 43, 44, 0, 0, - 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, - 0, 0, 104, 0, 0, 0, 52, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 477, 0, 0, 0, - 0, 53, 54, 0, 55, 0, 56, 57, 0, 0, - 0, 0, 0, 58, 0, 0, 86, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 84, 506, 19, 0, - 0, 20, 0, 0, 21, 22, 23, 87, 0, 24, - 25, 26, 27, 28, 29, 30, 508, 31, 32, 33, - 34, 35, 36, 88, 109, 89, 90, 91, 37, 38, - 92, 93, 94, 95, 96, 97, 0, 0, 0, 98, - 99, 100, 101, 102, 0, 0, 39, 0, 103, 40, - 41, 42, 43, 44, 0, 0, 45, 46, 47, 48, - 49, 50, 51, 0, 0, 0, 0, 0, 104, 0, - 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 86, 0, 53, 54, 0, - 55, 0, 56, 57, 18, 84, 564, 19, 0, 58, - 20, 0, 0, 21, 22, 23, 87, 0, 24, 25, - 26, 27, 28, 29, 30, 0, 31, 32, 33, 34, - 35, 36, 88, 109, 89, 90, 91, 37, 38, 92, - 93, 94, 95, 96, 97, 0, 0, 0, 98, 99, - 100, 101, 102, 0, 0, 39, 0, 103, 40, 41, - 42, 43, 44, 0, 0, 45, 46, 47, 48, 49, - 50, 51, 0, 0, 0, 0, 0, 104, 0, 0, - 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 0, 53, 54, 0, 55, - 0, 56, 57, 18, 84, 565, 19, 0, 58, 20, - 0, 0, 21, 22, 23, 87, 0, 24, 25, 26, - 27, 28, 29, 30, 0, 31, 32, 33, 34, 35, - 36, 88, 109, 89, 90, 91, 37, 38, 92, 93, - 94, 95, 96, 97, 0, 0, 0, 98, 99, 100, - 101, 102, 0, 0, 39, 0, 103, 40, 41, 42, - 43, 44, 0, 0, 45, 46, 47, 48, 49, 50, - 51, 0, 0, 0, 0, 0, 104, 0, 0, 0, - 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 86, 0, 53, 54, 0, 55, 0, - 56, 57, 18, 84, 568, 19, 0, 58, 20, 0, - 0, 21, 22, 23, 87, 0, 24, 25, 26, 27, - 28, 29, 30, 0, 31, 32, 33, 34, 35, 36, - 88, 109, 89, 90, 91, 37, 38, 92, 93, 94, - 95, 96, 97, 0, 0, 0, 98, 99, 100, 101, - 102, 0, 0, 39, 0, 103, 40, 41, 42, 43, - 44, 0, 0, 45, 46, 47, 48, 49, 50, 51, - 0, 0, 0, 0, 0, 104, 0, 0, 0, 52, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 86, 0, 53, 54, 0, 55, 0, 56, - 57, 18, 84, 0, 19, 0, 58, 20, 0, 0, - 21, 22, 23, 87, 0, 24, 25, 26, 27, 28, - 29, 30, 0, 31, 32, 33, 34, 35, 36, 88, - 109, 89, 90, 91, 37, 38, 92, 93, 94, 95, - 96, 97, 0, 0, 0, 98, 99, 100, 101, 102, - 0, 0, 39, 0, 103, 40, 41, 42, 43, 44, - 0, 0, 45, 46, 47, 48, 49, 50, 51, 0, - 0, 605, 0, 0, 104, 0, 0, 0, 52, 0, + 60, 320, 166, 304, 124, 130, 175, 86, 142, 60, + 486, 435, 143, 261, 127, 188, 127, 189, 127, 587, + 127, 127, 20, 160, 305, 145, 61, 607, 20, 20, + 127, 127, 22, 172, 16, 61, 24, 171, 173, 165, + 112, 60, 641, 245, 162, 127, 127, 257, 319, 612, + 446, 228, 85, 229, 128, 153, 128, 85, 128, 17, + 128, 128, 20, 141, 154, 473, 161, 61, 191, 192, + 128, 128, -290, 241, 129, 182, 474, 242, 133, 642, + 135, 136, 635, 636, 637, 168, 128, 259, 447, 158, + 150, 151, 159, 262, 359, 360, 254, 361, 647, 648, + 362, 264, 125, 166, 363, 169, 170, 126, 364, 365, + 438, 463, 666, 280, 448, 659, 187, 660, 187, 292, + 193, -289, 317, 293, -291, 663, 519, 166, 240, 464, + 196, 249, 138, 246, 190, 235, 481, 299, 302, 302, + 165, 366, 139, 247, 275, 20, 314, 315, 227, 22, + 60, 60, 310, 24, 431, 295, 466, 127, 183, 184, + 185, 186, -332, 410, 165, 367, 412, 538, 148, 308, + 480, 194, 195, 468, 291, 313, 61, 61, 539, 156, + 488, 183, 184, 185, 186, 496, 497, 524, 183, 184, + 185, 186, 183, 184, 185, 186, 228, 168, 229, 322, + 323, 324, 325, 234, 327, 328, 330, 183, 184, 185, + 186, -328, 243, -328, 368, 267, 237, 316, 268, 269, + 270, 271, 380, -330, 272, -330, 382, 398, 529, 387, + 230, 399, 231, 238, 183, 184, 185, 186, 569, 475, + 232, 244, 233, 372, 373, 374, 375, 376, 377, 378, + 379, 183, 184, 185, 186, 185, 186, 250, 465, 413, + 437, -328, 370, -328, 251, 183, 184, 185, 186, 486, + 597, 467, 551, -336, 226, 183, 184, 185, 186, 469, + 603, 604, 397, 415, 415, 415, 419, 415, 415, -330, + 302, -330, 436, 389, 390, 392, 60, 400, 401, 528, + 403, 404, 405, 406, 427, 252, 183, 184, 185, 186, + 253, 255, -102, 522, 260, 263, 183, 184, 185, 186, + 416, 417, 61, 420, 421, 266, 580, 581, 183, 184, + 185, 186, 443, 85, -293, 273, 445, 287, 20, 296, + 298, 183, 184, 185, 186, 301, 306, 454, 318, 183, + 184, 185, 186, 307, 183, 184, 185, 186, 127, 309, + 563, 311, -292, 320, 614, 183, 184, 185, 186, 183, + 184, 185, 186, 386, 381, 302, 452, 453, 125, 391, + 384, 385, 398, 126, 460, 408, 399, 425, 402, 630, + 485, 321, 166, 422, 498, 198, 199, 200, 128, 430, + 277, 432, 429, 441, 278, 479, 479, 198, 279, 645, + 444, 442, 446, 508, 508, 593, 490, 451, 455, 419, + 495, 479, 479, 515, 461, 456, 457, 520, 483, 165, + 217, 218, 219, 220, 592, 458, 471, 397, 221, 476, + 477, 222, 223, 224, 225, 226, 484, 531, 502, 507, + 221, 60, 492, 222, 223, 224, 225, 226, 499, 500, + 514, 503, 525, 518, 267, 526, 532, 268, 269, 270, + 271, 20, 533, 272, 534, 535, 541, 61, 542, 549, + 548, 503, 183, 184, 185, 186, 576, 577, 546, 558, + 552, 299, 553, 582, 554, 555, 302, 557, 560, 588, + 589, 562, 566, 183, 184, 185, 186, 568, 479, 183, + 184, 185, 186, 166, 570, 571, 572, 545, 578, 440, + 579, 536, 600, 537, 183, 184, 185, 186, 595, 620, + 615, 616, 617, 585, 547, 567, 619, 198, 199, 200, + 449, 183, 184, 185, 186, 584, 462, 633, 628, 594, + 165, 302, 598, 599, 609, 631, 632, 610, 611, 634, + 601, 629, 479, 479, 639, 653, 605, 605, 646, 651, + 198, 654, 264, 218, 219, 220, 657, 667, 512, 650, + 221, 117, 274, 222, 223, 224, 225, 226, 574, 627, + 624, 658, 183, 184, 185, 186, 493, 613, 664, 495, + 479, 428, 662, 561, 511, 264, 264, 264, 220, 424, + 510, 565, 668, 221, 608, 513, 222, 223, 224, 225, + 226, 264, 264, 621, 491, 479, 618, 290, 396, 523, + 0, 132, 655, 134, 0, 652, 137, 0, 144, 146, + 264, 661, 0, 503, 0, 479, 0, 0, 264, 485, + 0, 155, 605, 0, 157, 0, 0, 0, 163, 0, + -13, 87, 0, 0, 176, 177, 178, 179, 180, 0, + 18, 85, 0, 19, 0, 0, 20, 0, 0, 21, + 22, 23, 88, 0, 24, 25, 89, 90, 91, 26, + 27, 92, 93, 0, 0, 94, 95, 96, 97, 0, + 98, 99, 100, 101, 0, 0, 102, 28, 29, 103, + 104, 105, 30, 31, 106, 32, 33, 34, 35, 36, + 37, 0, 38, 39, 40, 41, 42, 43, 107, 116, + 44, 0, 108, 45, 46, 47, 48, 49, 0, 0, + 0, 50, 51, 52, 183, 184, 185, 186, 289, 109, + 0, 18, 0, 0, 0, 0, 53, 20, 0, 0, + 0, 22, 0, 0, 0, 24, -336, -336, -336, 225, + 226, 393, 183, 184, 185, 186, 0, 54, 55, 0, + 56, 530, 57, 58, 0, 0, 0, 0, 0, 0, + 59, 0, 0, 0, 0, 0, 0, 326, 0, 0, + 0, 0, 0, 331, 0, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, -3, 87, 0, 358, 0, 0, 0, 0, + 0, 0, 18, 85, 0, 19, 0, 0, 20, 0, + 0, 21, 22, 23, 88, 0, 24, 25, 89, 90, + 91, 26, 27, 92, 93, 0, 0, 94, 95, 96, + 97, 0, 98, 99, 100, 101, 0, 0, 102, 28, + 29, 103, 104, 105, 30, 31, 106, 32, 33, 34, + 35, 36, 37, 0, 38, 39, 40, 41, 42, 43, + 107, 116, 44, 0, 108, 45, 46, 47, 48, 49, + 0, 0, 0, 50, 51, 52, 0, 0, 0, 0, + 0, 109, 0, 0, 0, 0, 0, 0, 53, 1, + 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 54, + 55, 0, 56, 0, 57, 58, 0, 18, 85, 470, + 19, 0, 59, 20, 0, 0, 21, 22, 23, 88, + 0, 24, 25, 89, 90, 91, 26, 27, 92, 93, + 0, 0, 94, 95, 96, 97, 0, 98, 99, 100, + 101, 0, 0, 102, 28, 29, 103, 104, 105, 30, + 31, 106, 32, 33, 34, 35, 36, 37, 0, 38, + 39, 40, 41, 42, 43, 107, 116, 44, 0, 108, + 45, 46, 47, 48, 49, 0, 0, 0, 50, 51, + 52, 0, 0, 0, 0, 0, 109, 0, 0, 0, + 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 86, 0, 53, 54, 0, 55, 0, 56, 57, - 18, 84, 0, 19, 0, 58, 20, 0, 0, 21, - 22, 23, 87, 0, 24, 25, 26, 27, 28, 29, - 30, 0, 31, 32, 33, 34, 35, 36, 88, 109, - 89, 90, 91, 37, 38, 92, 93, 94, 95, 96, - 97, 0, 0, 0, 98, 99, 100, 101, 102, 0, - 0, 39, 0, 103, 40, 41, 42, 43, 44, 0, - 0, 45, 46, 47, 48, 49, 50, 51, 0, 0, - 0, 0, 0, 104, 0, 0, 0, 52, 0, 0, + 527, 0, 0, 0, 54, 55, 0, 56, 0, 57, + 58, 0, 0, 87, 0, 0, 0, 59, 0, 0, + 0, 0, 18, 85, 556, 19, 0, 0, 20, 0, + 0, 21, 22, 23, 88, 0, 24, 25, 89, 90, + 91, 26, 27, 92, 93, 0, 0, 94, 95, 96, + 97, 0, 98, 99, 100, 101, 0, 564, 102, 28, + 29, 103, 104, 105, 30, 31, 106, 32, 33, 34, + 35, 36, 37, 0, 38, 39, 40, 41, 42, 43, + 107, 116, 44, 0, 108, 45, 46, 47, 48, 49, + 575, 0, 0, 50, 51, 52, 0, 0, 0, 0, + 0, 109, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 0, 53, 54, 0, 55, 0, 56, 57, 18, - 84, 0, 19, 0, 58, 20, 0, 0, 21, 22, - 23, 87, 0, 24, 25, 26, 27, 28, 29, 30, - 0, 31, 32, 33, 34, 35, 36, 88, 0, 89, - 90, 91, 37, 38, 92, 93, 94, 95, 96, 97, - 0, 0, 0, 98, 99, 100, 101, 102, 0, 0, - 39, 0, 103, 40, 41, 42, 43, 44, 0, 0, - 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, - 0, 0, 104, 0, 0, 0, 52, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 86, 0, 0, 0, - 0, 53, 54, 0, 55, 18, 56, 57, 19, 0, - 0, 20, 0, 58, 21, 22, 23, -17, 0, 24, - 25, 26, 27, 28, 29, 30, 0, 31, 32, 33, - 34, 35, 36, 0, 0, 0, 0, 0, 37, 38, - 0, 0, 0, 0, 0, 0, 0, 0, 188, 189, - 0, 0, 0, 0, 0, 0, 39, 0, 0, 40, - 41, 42, 43, 44, 0, 0, 45, 46, 47, 48, - 49, 50, 51, 195, 196, 197, 198, 199, 200, 201, - 202, 0, 52, 0, 0, 203, 0, 0, 204, 205, - 206, 207, 86, 0, 0, 0, 0, 53, 54, 0, - 55, 18, 56, 57, 19, 0, 0, 20, 0, 58, - 21, 22, 23, 0, 0, 24, 25, 26, 27, 28, - 29, 30, 0, 31, 32, 33, 34, 35, 36, 0, - 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 54, + 55, 0, 56, 0, 57, 58, 0, 18, 85, 622, + 19, 0, 59, 20, 0, 0, 21, 22, 23, 88, + 0, 24, 25, 89, 90, 91, 26, 27, 92, 93, + 0, 0, 94, 95, 96, 97, 0, 98, 99, 100, + 101, 0, 0, 102, 28, 29, 103, 104, 105, 30, + 31, 106, 32, 33, 34, 35, 36, 37, 0, 38, + 39, 40, 41, 42, 43, 107, 116, 44, 0, 108, + 45, 46, 47, 48, 49, 0, 0, 0, 50, 51, + 52, 0, 0, 0, 0, 0, 109, 0, 0, 0, + 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 39, 0, 0, 40, 41, 42, 43, 44, - -219, 0, 45, 46, 47, 48, 49, 50, 51, 0, - 0, 209, 0, 210, -219, -219, 0, 0, 52, 0, - 0, 0, -219, -219, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 53, 54, 0, 55, 0, 56, 57, - 0, 0, 0, 0, -17, 58, 0, -219, -219, -219, - -219, 0, 0, 0, -219, 0, -219, 0, 0, 0, - 0, 0, -219, 0, 0, 0, 0, 0, 0, -219, - -219, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -219, 0, 0, -219, -219, 0, -219, -219, - -219, -219, -219, -219, -219, -219, -219, -219, -219, -219, - -219, -219, -258, 188, 189, 0, -219, 0, 0, -219, - -219, -219, -219, -219, 0, 0, -258, -258, 0, 0, - 0, 0, 0, 0, -258, -258, 0, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 0, 0, 0, 0, - 203, 0, 0, 204, 205, 206, 207, 0, 0, -258, - -258, -258, -258, 0, 0, 0, -258, 0, -258, 0, - 0, 0, 0, 0, -258, 0, 0, 0, 0, 0, - 0, -258, -258, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -258, 0, 0, -258, -258, 0, - -258, -258, -258, -258, -258, -258, -258, -258, -258, -258, - -258, -258, -258, -258, 0, 0, 0, 0, -258, 0, - 0, -258, -258, -258, -258, -258, 18, 84, 0, 19, - 0, 0, 20, 0, 0, 21, 22, 23, 0, 0, - 24, 25, 146, 27, 28, 29, 30, 119, 31, 32, - 33, 34, 35, 36, 0, 0, 0, 0, 0, 37, - 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, - 40, 41, 42, 43, 44, 0, 0, 45, 46, 47, - 48, 49, 50, 51, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, - 0, 55, 0, 56, 57, 18, 84, 0, 19, 0, - 58, 20, 0, 0, 21, 22, 23, 0, 0, 24, - 25, 26, 27, 28, 29, 30, 0, 31, 32, 33, - 34, 35, 36, 0, 0, 0, 0, 0, 37, 38, + 0, 0, 0, 87, 54, 55, 0, 56, 0, 57, + 58, 0, 18, 85, 623, 19, 0, 59, 20, 0, + 0, 21, 22, 23, 88, 0, 24, 25, 89, 90, + 91, 26, 27, 92, 93, 0, 0, 94, 95, 96, + 97, 0, 98, 99, 100, 101, 0, 0, 102, 28, + 29, 103, 104, 105, 30, 31, 106, 32, 33, 34, + 35, 36, 37, 0, 38, 39, 40, 41, 42, 43, + 107, 116, 44, 0, 108, 45, 46, 47, 48, 49, + 0, 0, 0, 50, 51, 52, 0, 0, 0, 0, + 0, 109, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 39, 0, 0, 40, - 41, 42, 43, 44, 0, 0, 45, 46, 47, 48, - 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 53, 54, 0, - 55, 18, 56, 57, 19, 0, 0, 20, 0, 58, - 21, 22, 23, 0, 0, 24, 25, 26, 27, 28, - 29, 30, 0, 31, 32, 33, 34, 35, 36, 0, - 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 54, + 55, 0, 56, 0, 57, 58, 0, 18, 85, 626, + 19, 0, 59, 20, 0, 0, 21, 22, 23, 88, + 0, 24, 25, 89, 90, 91, 26, 27, 92, 93, + 0, 0, 94, 95, 96, 97, 0, 98, 99, 100, + 101, 0, 0, 102, 28, 29, 103, 104, 105, 30, + 31, 106, 32, 33, 34, 35, 36, 37, 0, 38, + 39, 40, 41, 42, 43, 107, 116, 44, 0, 108, + 45, 46, 47, 48, 49, 0, 0, 0, 50, 51, + 52, 0, 0, 0, 0, 0, 109, 0, 0, 0, + 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 39, 0, 0, 40, 41, 42, 43, 44, - 0, 0, 45, 46, 47, 48, 49, 50, 51, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 0, 87, 54, 55, 0, 56, 0, 57, + 58, 0, 18, 85, 644, 19, 0, 59, 20, 0, + 0, 21, 22, 23, 88, 0, 24, 25, 89, 90, + 91, 26, 27, 92, 93, 0, 0, 94, 95, 96, + 97, 0, 98, 99, 100, 101, 0, 0, 102, 28, + 29, 103, 104, 105, 30, 31, 106, 32, 33, 34, + 35, 36, 37, 0, 38, 39, 40, 41, 42, 43, + 107, 116, 44, 0, 108, 45, 46, 47, 48, 49, + 0, 0, 0, 50, 51, 52, 0, 0, 0, 0, + 0, 109, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 53, 54, 0, 55, 18, 56, 57, - 19, 0, 0, 20, 173, 58, 21, 22, 23, 0, - 0, 24, 25, 26, 27, 28, 29, 30, 0, 31, - 32, 33, 34, 35, 36, 0, 0, 0, 0, 0, - 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, - 0, 40, 41, 42, 43, 44, 0, 0, 45, 46, - 47, 48, 49, 50, 51, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, - 54, 0, 55, 18, 56, 57, 19, 0, 0, 20, - 275, 58, 21, 22, 23, 0, 0, 24, 25, 26, - 27, 28, 29, 30, 0, 31, 32, 33, 34, 35, - 36, 0, 0, 0, 0, 0, 37, 38, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 54, + 55, 0, 56, 0, 57, 58, 0, 18, 85, 0, + 19, 0, 59, 20, 0, 0, 21, 22, 23, 88, + 0, 24, 25, 89, 90, 91, 26, 27, 92, 93, + 0, 0, 94, 95, 96, 97, 0, 98, 99, 100, + 101, 0, 0, 102, 28, 29, 103, 104, 105, 30, + 31, 106, 32, 33, 34, 35, 36, 37, 0, 38, + 39, 40, 41, 42, 43, 107, 116, 44, 0, 108, + 45, 46, 47, 48, 49, 0, 0, 0, 50, 51, + 52, 0, 0, 665, 0, 0, 109, 0, 0, 0, + 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 39, 0, 0, 40, 41, 42, - 43, 44, 0, 0, 45, 46, 47, 48, 49, 50, - 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 53, 54, 0, 55, 18, - 56, 57, 19, 0, 0, 20, 289, 58, 21, 22, - 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, - 0, 31, 32, 33, 34, 35, 36, 0, 0, 0, - 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 87, 54, 55, 0, 56, 0, 57, + 58, 0, 18, 85, 0, 19, 0, 59, 20, 0, + 0, 21, 22, 23, 88, 0, 24, 25, 89, 90, + 91, 26, 27, 92, 93, 0, 0, 94, 95, 96, + 97, 0, 98, 99, 100, 101, 0, 0, 102, 28, + 29, 103, 104, 105, 30, 31, 106, 32, 33, 34, + 35, 36, 37, 0, 38, 39, 40, 41, 42, 43, + 107, 116, 44, 0, 108, 45, 46, 47, 48, 49, + 0, 0, 0, 50, 51, 52, 0, 0, 0, 0, + 0, 109, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 39, 0, 0, 40, 41, 42, 43, 44, 0, 0, - 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 54, + 55, 0, 56, 0, 57, 58, 0, 18, 85, 0, + 19, 0, 59, 20, 0, 0, 21, 22, 23, 88, + 0, 24, 25, 89, 90, 91, 26, 27, 92, 93, + 0, 0, 94, 95, 96, 97, 0, 98, 99, 100, + 101, 0, 0, 102, 28, 29, 103, 104, 105, 30, + 31, 106, 32, 33, 34, 35, 36, 37, 0, 38, + 39, 40, 41, 42, 43, 107, 0, 44, 0, 108, + 45, 46, 47, 48, 49, 0, 0, 0, 50, 51, + 52, 0, 87, 0, 0, 0, 109, 0, 0, 0, + 0, 18, 0, 53, 19, 0, 0, 20, 0, 0, + 21, 22, 23, -19, 0, 24, 25, 0, 0, 0, + 26, 27, 0, 0, 54, 55, 0, 56, 0, 57, + 58, 0, 0, 0, 0, 0, 0, 59, 28, 29, + 0, 0, 0, 30, 31, 0, 32, 33, 34, 35, + 36, 37, 0, 38, 39, 40, 41, 42, 43, 0, + 0, 44, 0, 0, 45, 46, 47, 48, 49, 0, + 0, 87, 50, 51, 52, 0, 0, 0, 0, 0, + 18, 0, 0, 19, 0, 0, 20, 53, 0, 21, + 22, 23, 0, 0, 24, 25, 0, 0, 0, 26, + 27, 0, 0, 0, 0, 0, 0, 0, 54, 55, + 0, 56, 0, 57, 58, 0, 0, 28, 29, 0, + 0, 59, 30, 31, 0, 32, 33, 34, 35, 36, + 37, 0, 38, 39, 40, 41, 42, 43, 0, 0, + 44, 0, 0, 45, 46, 47, 48, 49, 0, 0, + 0, 50, 51, 52, 0, 0, 0, 0, 0, 18, + 85, 0, 19, 0, 0, 20, 53, 0, 21, 22, + 23, 0, 0, 24, 25, 0, 0, 0, 26, 27, + 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, + 56, 0, 57, 58, 0, 0, 28, 29, 0, -19, + 59, 30, 31, 0, 32, 164, 34, 35, 36, 37, + 126, 38, 39, 40, 41, 42, 43, 0, 0, 44, + 0, 0, 45, 46, 47, 48, 49, 0, 0, 0, + 50, 51, 52, 0, 0, 0, 0, 0, 18, 85, + 0, 19, 0, 0, 20, 53, 0, 21, 22, 23, + 0, 0, 24, 25, 0, 0, 0, 26, 27, 0, + 0, 0, 0, 0, 0, 0, 54, 55, 0, 56, + 0, 57, 58, 0, 0, 28, 29, 0, 0, 59, + 30, 31, 0, 32, 33, 34, 35, 36, 37, 0, + 38, 39, 40, 41, 42, 43, 0, 0, 44, 0, + 0, 45, 46, 47, 48, 49, 0, 0, 0, 50, + 51, 52, 0, 0, 0, 0, 0, 18, 0, 0, + 19, 0, 0, 20, 53, 0, 21, 22, 23, 0, + 0, 24, 25, 0, 0, 0, 26, 27, 0, 0, + 0, 0, 0, 0, 0, 54, 55, 0, 56, 0, + 57, 58, 0, 0, 28, 29, 0, 0, 59, 30, + 31, 0, 32, 33, 34, 35, 36, 37, 0, 38, + 39, 40, 41, 42, 43, 0, 0, 44, 0, 0, + 45, 46, 47, 48, 49, 0, 0, 0, 50, 51, + 52, 0, 0, 0, 0, 0, 18, 0, 0, 19, + 0, 0, 20, 53, 0, 21, 22, 23, 0, 0, + 24, 25, 0, 0, 0, 26, 27, 0, 0, 0, + 0, 0, 0, 0, 54, 55, 0, 56, 0, 57, + 58, 0, 0, 28, 29, 0, 181, 59, 30, 31, + 0, 32, 33, 34, 35, 36, 37, 0, 38, 39, + 40, 41, 42, 43, 0, 0, 44, 0, 0, 45, + 46, 47, 48, 49, 0, 0, 0, 50, 51, 52, + 0, 0, 0, 0, 0, 18, 0, 0, 19, 0, + 0, 20, 53, 0, 21, 22, 23, 0, 0, 24, + 25, 0, 0, 0, 26, 27, 0, 0, 0, 0, + 0, 0, 0, 54, 55, 0, 56, 0, 57, 58, + 0, 0, 28, 29, 0, 294, 59, 30, 31, 0, + 32, 33, 34, 35, 36, 37, 0, 38, 39, 40, + 41, 42, 43, 0, 0, 44, 0, 0, 45, 46, + 47, 48, 49, 0, 0, 0, 50, 51, 52, 0, + 0, 0, 0, 0, -335, 228, 0, 229, 0, 0, + -335, 53, 0, -335, -335, -335, 0, 0, -335, -335, + 0, 0, 0, -335, -335, 0, 0, 0, 0, 0, + 0, 0, 54, 55, 0, 56, 0, 57, 58, 0, + 0, -335, -335, 0, 312, 59, -335, -335, 0, -335, + -335, -335, -335, -335, -335, 0, -335, -335, -335, -335, + -335, -335, 0, 0, -335, 0, 0, -335, -335, -335, + -335, -335, 0, 0, 0, -335, -335, -335, 0, 0, + 0, 0, 0, 18, 0, 0, 19, 0, 0, 20, + -335, 0, 21, 22, 23, 0, 0, 24, 25, 0, + 0, 0, 26, 27, 0, 0, 0, 0, 0, 0, + 0, -335, -335, 0, -335, 0, -335, -335, 0, 0, + 28, 29, 0, 0, -335, 30, 31, 0, 32, 33, + 34, 35, 36, 37, 0, 38, 39, 40, 41, 42, + 43, 0, 0, 44, 0, 0, 45, 46, 47, 48, + 49, 0, 0, 0, 50, 51, 52, 0, 0, 0, + 0, 0, 18, 0, 0, 19, 0, 0, 20, 53, + 0, 21, 22, 23, 0, 0, 24, 25, 0, 0, + 0, 26, 27, 0, 0, 0, 0, 0, 0, 0, + 54, 55, 0, 56, 0, 57, 58, 0, 0, 28, + 29, 0, 329, 59, 30, 31, 0, 32, 33, 34, + 35, 36, 37, 0, 38, 39, 40, 41, 42, 43, + 0, 0, 44, 0, 0, 45, 46, 47, 48, 49, + 0, 0, 0, 50, 51, 52, 0, 0, 0, 0, + 0, 18, 0, 0, 19, 0, 0, 20, 53, 0, + 21, 22, 23, 0, 0, 24, 25, 0, 0, 0, + 26, 27, 0, 0, 0, 0, 0, 0, 0, 54, + 55, 0, 56, 0, 57, 58, 0, 0, 28, 29, + 0, 371, 59, 30, 31, 0, 32, 33, 34, 35, + 36, 37, 0, 38, 39, 40, 41, 42, 43, 0, + 0, 44, 0, 0, 45, 46, 47, 48, 49, 0, + 0, 0, 50, 51, 52, 0, 0, 0, 0, 0, + 18, 0, 0, 19, 0, 0, 20, 53, 0, 21, + 22, 23, 0, 0, 24, 25, 0, 0, 0, 26, + 27, 0, 0, 0, 0, 0, 0, 0, 54, 55, + 0, 56, 0, 57, 58, 0, 0, 28, 29, 0, + 426, 59, 30, 31, 0, 32, 33, 34, 35, 36, + 37, 0, 38, 39, 40, 41, 42, 43, 0, 0, + 44, 0, 0, 45, 46, 47, 48, 49, 0, 0, + 0, 50, 51, 52, 0, 0, 0, 0, 0, 18, + 0, 0, 19, 0, 0, 20, 53, 0, 21, 22, + 23, 0, 0, 24, 25, 0, 0, 0, 26, 27, + 0, 0, 0, 0, 0, 0, 0, 54, 55, 0, + 56, 0, 57, 58, 0, 0, 28, 29, 0, 459, + 59, 30, 31, 0, 32, 33, 34, 35, 36, 37, + 0, 38, 39, 40, 41, 42, 43, 0, 0, 44, + 0, 0, 45, 46, 47, 48, 49, 0, 0, 0, + 50, 51, 52, 0, 0, 0, 0, 0, 18, 0, + 0, 19, 0, 0, 20, 53, 0, 21, 22, 23, + 0, 0, 24, 25, 0, 0, 0, 26, 27, 0, + 0, 0, 0, 0, 0, 0, 54, 55, 0, 56, + 0, 57, 58, 0, 0, 28, 29, 0, 0, 59, + 30, 31, 0, 32, 33, 34, 35, 36, 37, 0, + 38, 39, 40, 41, 42, 43, 0, 0, 44, 0, + 0, 45, 46, 47, 48, 49, 0, 0, 0, 50, + 51, 52, 0, 0, 0, 0, 0, -334, 0, 0, + -334, 0, 0, -334, 53, 0, -334, -334, -334, 0, + 0, -334, -334, 0, 0, 0, -334, -334, 0, 0, + 0, 0, 0, 0, 0, 54, 55, 0, 56, 0, + 57, 58, 0, 0, -334, -334, 0, 0, 288, -334, + -334, 0, -334, -334, -334, -334, -334, -334, 0, -334, + -334, -334, -334, -334, -334, 0, 0, -334, 0, 0, + -334, -334, -334, -334, -334, 0, 0, 0, -334, -334, + -334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -334, 0, 0, 0, 0, 0, 0, + 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, + 199, 200, 0, 0, -334, -334, 0, -334, 0, -334, + -334, 0, 201, 0, 0, 0, 0, -334, 202, 203, + 204, 450, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 0, 0, + 0, 0, 221, 197, 0, 222, 223, 224, 225, 226, + 198, 199, 200, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 201, 0, 0, 0, 0, 0, 202, + 203, 204, 0, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 0, + 0, 0, 0, 221, 197, 0, 222, 223, 224, 225, + 226, 198, 199, 200, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -336, 0, 0, 0, 198, 199, + 202, 203, 204, 0, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 0, 0, 0, 0, 221, 197, 0, 222, 223, 224, + 225, 226, 198, 199, 200, 219, 220, 0, 0, 0, + 0, 221, 0, 0, 222, 223, 224, 225, 226, 0, + 0, 202, 203, 204, 0, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 0, 0, 0, 0, 221, 197, 0, 222, 223, + 224, 225, 226, 198, 199, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 53, 54, 0, 55, 18, 56, 57, 19, 0, - 0, 20, 300, 58, 21, 22, 23, 0, 0, 24, - 25, 26, 27, 28, 29, 30, 0, 31, 32, 33, - 34, 35, 36, 0, 0, 0, 0, 0, 37, 38, + 0, 0, 0, 0, 204, 0, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 0, 0, 0, 0, 221, -336, 0, 222, + 223, 224, 225, 226, 198, 199, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 39, 0, 0, 40, - 41, 42, 43, 44, 0, 0, 45, 46, 47, 48, - 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 53, 54, 0, - 55, 18, 56, 57, 19, 0, 0, 20, 333, 58, - 21, 22, 23, 0, 0, 24, 25, 26, 27, 28, - 29, 30, 0, 31, 32, 33, 34, 35, 36, 0, - 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 39, 0, 0, 40, 41, 42, 43, 44, - 0, 0, 45, 46, 47, 48, 49, 50, 51, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 53, 54, 0, 55, 18, 56, 57, - 19, 0, 0, 20, 396, 58, 21, 22, 23, 0, - 0, 24, 25, 26, 27, 28, 29, 30, 0, 31, - 32, 33, 34, 35, 36, 0, 0, 0, 0, 0, - 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, - 0, 40, 41, 42, 43, 44, 0, 0, 45, 46, - 47, 48, 49, 50, 51, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, - 54, 0, 55, 18, 56, 57, 19, 0, 0, 20, - 415, 58, 21, 22, 23, 0, 0, 24, 25, 26, - 27, 28, 29, 30, 0, 31, 32, 33, 34, 35, - 36, 0, 0, 0, 0, 0, 37, 38, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 39, 0, 0, 40, 41, 42, - 43, 44, 0, 0, 45, 46, 47, 48, 49, 50, - 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 53, 54, 0, 55, 18, - 56, 57, 19, 0, 0, 20, 0, 58, 21, 22, - 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, - 0, 31, 32, 33, 34, 35, 36, 0, 0, 0, - 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 39, 0, 0, 40, 41, 42, 43, 44, 0, 0, - 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 52, 0, 187, 0, - 0, 0, 0, 0, 0, 188, 189, 0, 0, 0, - 0, 53, 54, 0, 55, 0, 56, 57, 0, 0, - 0, 0, 0, 283, 190, 191, 406, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 0, 0, - 0, 0, 203, 187, 0, 204, 205, 206, 207, 0, - 188, 189, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, - 191, 0, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 0, 0, 0, 0, 203, 187, 0, - 204, 205, 206, 207, 0, 188, 189, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 191, 0, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 0, 0, - 0, 0, 203, -300, 0, 204, 205, 206, 207, 0, - 188, 189, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 0, 0, 0, 0, 203, 0, 0, - 204, 205, 206, 207 + 0, 0, 0, 0, 0, 0, 0, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 198, 199, 200, 0, 221, 0, 0, + 222, 223, 224, 225, 226, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 199, 200, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 0, 0, 0, 0, 221, 0, 0, 222, + 223, 224, 225, 226, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 198, 199, 200, 0, 221, + 0, 0, 222, 223, 224, 225, 226, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 198, 199, 200, 0, + 0, 0, 0, 0, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 0, 198, 199, 200, 221, 0, + 0, 222, 223, 224, 225, 226, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 198, 199, 200, 0, 221, + 0, 0, 222, 223, 224, 225, 226, 214, 215, 216, + 217, 218, 219, 220, 198, 199, 200, 0, 221, 0, + 0, 222, 223, 224, 225, 226, 0, 0, 0, 216, + 217, 218, 219, 220, 0, 0, 0, 0, 221, 0, + 0, 222, 223, 224, 225, 226, 0, 0, -336, 217, + 218, 219, 220, 0, 0, 0, 0, 221, 0, 0, + 222, 223, 224, 225, 226 }; static const yytype_int16 yycheck[] = { - 11, 130, 17, 363, 16, 492, 270, 18, 50, 20, - 19, 22, 44, 24, 25, 10, 27, 28, 12, 14, - 52, 11, 17, 13, 19, 16, 50, 11, 13, 158, - 527, 11, 43, 44, 45, 46, 14, 0, 47, 14, - 22, 14, 22, 353, 81, 14, 13, 29, 104, 44, - 114, 16, 47, 363, 18, 20, 366, 367, 22, 24, - 24, 25, 13, 27, 28, 114, 16, 14, 114, 18, - 20, 20, 15, 22, 24, 24, 25, 114, 27, 28, - 44, 45, 14, 10, 98, 76, 9, 85, 86, 11, - 101, 13, 19, 78, 22, 44, 45, 96, 130, 14, - 587, 50, 114, 600, 22, 11, 14, 85, 86, 114, - 85, 86, 85, 86, 105, 109, 85, 86, 160, 151, - 47, 116, 11, 114, 114, 136, 158, 78, 11, 15, - 13, 58, 143, 142, 143, 130, 160, 23, 85, 86, - 114, 451, 137, 138, 85, 86, 22, 142, 143, 98, - 11, 26, 13, 85, 86, 105, 78, 85, 86, 10, - 11, 84, 13, 158, 114, 16, 430, 85, 86, 20, - 85, 86, 113, 24, 25, 22, 27, 85, 86, 143, - 22, 26, 11, 114, 13, 227, 31, 22, 498, 499, - 47, 48, 49, 50, 143, 78, 22, 54, 10, 56, - 11, 216, 13, 227, 16, 11, 133, 13, 20, 85, - 86, 160, 24, 114, 141, 142, 143, 78, 98, 99, - 71, 216, 217, 487, 534, 11, 114, 238, 85, 86, - 16, 11, 264, 13, 161, 11, 596, 13, 85, 86, - 26, 85, 86, 85, 86, 31, 556, 114, 175, 176, - 114, 178, 179, 180, 263, 11, 113, 386, 207, 85, - 86, 53, 572, 114, 76, 22, 85, 86, 263, 113, - 85, 86, 96, 97, 14, 270, 85, 86, 227, 51, - 52, 208, 209, 210, 211, 212, 213, 214, 215, 218, - 219, 114, 69, 70, 113, 532, 37, 38, 113, 222, - 223, 224, 225, 226, 113, 228, 229, 69, 231, 232, - 81, 548, 549, 324, 113, 242, 243, 244, 245, 246, - 247, 29, 364, 100, 101, 562, 78, 85, 86, 106, - 90, 91, 109, 110, 111, 112, 263, 574, 575, 101, - 364, 85, 86, 113, 106, 22, 78, 109, 110, 111, - 112, 588, 279, 368, 386, 113, 283, 26, 595, 85, - 86, 490, 109, 110, 111, 112, 293, 13, 363, 113, - 69, 70, 16, 368, 26, 324, 20, 69, 70, 114, - 24, 244, 245, 246, 247, 380, 381, 113, 105, 384, - 31, 386, 59, 15, 389, 322, 323, 96, 97, 98, - 99, 100, 101, 330, 29, 12, 355, 106, 417, 101, - 109, 110, 111, 112, 106, 364, 82, 109, 110, 111, - 112, 29, 417, 350, 351, 352, 353, 113, 13, 86, - 69, 70, 25, 25, 429, 430, 363, 493, 494, 366, - 367, 25, 365, 25, 500, 101, 25, 18, 504, 505, - 106, 114, 26, 109, 110, 111, 112, 88, 490, 98, - 99, 100, 101, 114, 387, 114, 113, 106, 524, 525, - 109, 110, 111, 112, 114, 402, 12, 12, 12, 535, - 3, 4, 5, 6, 7, 8, 9, 12, 12, 26, - 417, 440, 487, 113, 550, 490, 511, 113, 513, 113, - 113, 557, 558, 16, 427, 114, 106, 522, 431, 109, - 110, 111, 112, 69, 70, 113, 511, 22, 513, 113, - 443, 577, 113, 82, 451, 11, 11, 522, 584, 12, - 113, 526, 527, 589, 15, 462, 113, 113, 594, 95, - 96, 97, 98, 99, 100, 101, 22, 542, 22, 114, - 106, 607, 113, 109, 110, 111, 112, 22, 80, 47, - 48, 49, 50, 22, 114, 113, 54, 113, 56, 114, - 22, 498, 499, 113, 113, 113, 591, 17, 79, 528, - 113, 60, 113, 109, 507, 13, 581, 533, 351, 538, - 596, 21, 603, 23, 285, 518, 591, 85, 86, 429, - 255, 596, 381, 468, 34, 600, 533, 534, 382, 39, - 488, 518, 227, 43, 364, -1, 46, 160, -1, 49, - -1, 51, -1, 53, 54, 55, 56, 57, -1, 556, - 0, 1, -1, 11, -1, -1, -1, -1, 16, -1, - 10, 11, -1, 13, -1, 572, 16, 25, 26, 19, - 20, 21, 22, 31, 24, 25, 26, 27, 28, 29, - 30, -1, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, -1, -1, -1, 54, 55, 56, 57, 58, -1, - -1, 61, -1, 63, 64, 65, 66, 67, 68, -1, - -1, 71, 72, 73, 74, 75, 76, 77, -1, -1, - -1, -1, -1, 83, -1, -1, -1, 87, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 160, -1, 102, 103, -1, 105, -1, 107, 108, -1, - -1, -1, -1, -1, 114, -1, -1, 177, -1, -1, - -1, -1, -1, 183, -1, -1, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 0, 1, -1, -1, -1, -1, - -1, -1, -1, -1, 10, 11, -1, 13, -1, -1, - 16, -1, -1, 19, 20, 21, 22, -1, 24, 25, - 26, 27, 28, 29, 30, -1, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, -1, -1, -1, 54, 55, - 56, 57, 58, -1, -1, 61, -1, 63, 64, 65, - 66, 67, 68, -1, -1, 71, 72, 73, 74, 75, - 76, 77, -1, -1, -1, -1, -1, 83, -1, -1, - -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 102, 103, -1, 105, - 1, 107, 108, -1, -1, -1, -1, -1, 114, 10, - 11, 12, 13, -1, -1, 16, -1, -1, 19, 20, - 21, 22, -1, 24, 25, 26, 27, 28, 29, 30, - -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - -1, -1, -1, 54, 55, 56, 57, 58, -1, -1, - 61, -1, 63, 64, 65, 66, 67, 68, -1, -1, - 71, 72, 73, 74, 75, 76, 77, -1, -1, -1, - -1, -1, 83, -1, -1, -1, 87, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 406, -1, -1, -1, - -1, 102, 103, -1, 105, -1, 107, 108, -1, -1, - -1, -1, -1, 114, -1, -1, 1, -1, -1, -1, - -1, -1, -1, -1, -1, 10, 11, 12, 13, -1, - -1, 16, -1, -1, 19, 20, 21, 22, -1, 24, - 25, 26, 27, 28, 29, 30, 456, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, -1, -1, -1, 54, - 55, 56, 57, 58, -1, -1, 61, -1, 63, 64, - 65, 66, 67, 68, -1, -1, 71, 72, 73, 74, - 75, 76, 77, -1, -1, -1, -1, -1, 83, -1, - -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1, -1, 102, 103, -1, - 105, -1, 107, 108, 10, 11, 12, 13, -1, 114, - 16, -1, -1, 19, 20, 21, 22, -1, 24, 25, - 26, 27, 28, 29, 30, -1, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, -1, -1, -1, 54, 55, - 56, 57, 58, -1, -1, 61, -1, 63, 64, 65, - 66, 67, 68, -1, -1, 71, 72, 73, 74, 75, - 76, 77, -1, -1, -1, -1, -1, 83, -1, -1, - -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1, -1, 102, 103, -1, 105, - -1, 107, 108, 10, 11, 12, 13, -1, 114, 16, - -1, -1, 19, 20, 21, 22, -1, 24, 25, 26, - 27, 28, 29, 30, -1, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, -1, -1, -1, 54, 55, 56, - 57, 58, -1, -1, 61, -1, 63, 64, 65, 66, - 67, 68, -1, -1, 71, 72, 73, 74, 75, 76, - 77, -1, -1, -1, -1, -1, 83, -1, -1, -1, - 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1, -1, 102, 103, -1, 105, -1, - 107, 108, 10, 11, 12, 13, -1, 114, 16, -1, - -1, 19, 20, 21, 22, -1, 24, 25, 26, 27, - 28, 29, 30, -1, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, -1, -1, -1, 54, 55, 56, 57, - 58, -1, -1, 61, -1, 63, 64, 65, 66, 67, - 68, -1, -1, 71, 72, 73, 74, 75, 76, 77, - -1, -1, -1, -1, -1, 83, -1, -1, -1, 87, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1, -1, 102, 103, -1, 105, -1, 107, - 108, 10, 11, -1, 13, -1, 114, 16, -1, -1, - 19, 20, 21, 22, -1, 24, 25, 26, 27, 28, - 29, 30, -1, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, -1, -1, -1, 54, 55, 56, 57, 58, - -1, -1, 61, -1, 63, 64, 65, 66, 67, 68, - -1, -1, 71, 72, 73, 74, 75, 76, 77, -1, - -1, 80, -1, -1, 83, -1, -1, -1, 87, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1, -1, 102, 103, -1, 105, -1, 107, 108, - 10, 11, -1, 13, -1, 114, 16, -1, -1, 19, + 10, 13, 49, 149, 17, 19, 53, 11, 27, 19, + 400, 304, 27, 109, 18, 11, 20, 13, 22, 553, + 24, 25, 16, 87, 150, 29, 10, 577, 16, 16, + 34, 35, 20, 56, 0, 19, 24, 51, 61, 49, + 12, 51, 22, 30, 48, 49, 50, 102, 174, 582, + 13, 11, 11, 13, 18, 13, 20, 11, 22, 9, + 24, 25, 16, 27, 130, 11, 130, 51, 110, 111, + 34, 35, 84, 92, 18, 59, 22, 92, 22, 59, + 24, 25, 615, 616, 617, 49, 50, 104, 22, 130, + 34, 35, 130, 110, 10, 11, 100, 13, 631, 632, + 16, 111, 56, 150, 20, 49, 50, 61, 24, 25, + 14, 22, 662, 123, 14, 649, 15, 650, 15, 138, + 110, 84, 169, 138, 84, 658, 23, 174, 92, 14, + 108, 95, 120, 120, 130, 85, 130, 147, 148, 149, + 150, 57, 130, 130, 116, 16, 160, 161, 130, 20, + 160, 161, 156, 24, 300, 139, 14, 161, 92, 93, + 94, 95, 11, 259, 174, 81, 262, 11, 31, 153, + 390, 108, 109, 14, 138, 159, 160, 161, 22, 42, + 400, 92, 93, 94, 95, 405, 406, 14, 92, 93, + 94, 95, 92, 93, 94, 95, 11, 161, 13, 183, + 184, 185, 186, 11, 188, 189, 190, 92, 93, 94, + 95, 11, 130, 13, 130, 32, 56, 161, 35, 36, + 37, 38, 235, 11, 41, 13, 236, 246, 14, 239, + 11, 246, 13, 56, 92, 93, 94, 95, 14, 385, + 11, 130, 13, 227, 228, 229, 230, 231, 232, 233, + 234, 92, 93, 94, 95, 94, 95, 130, 22, 263, + 307, 11, 226, 13, 130, 92, 93, 94, 95, 659, + 563, 22, 492, 127, 128, 92, 93, 94, 95, 22, + 33, 34, 246, 267, 268, 269, 270, 271, 272, 11, + 300, 13, 306, 243, 244, 245, 306, 247, 248, 22, + 250, 251, 252, 253, 288, 130, 92, 93, 94, 95, + 130, 11, 129, 439, 22, 39, 92, 93, 94, 95, + 268, 269, 306, 271, 272, 22, 546, 547, 92, 93, + 94, 95, 316, 11, 84, 22, 320, 14, 16, 84, + 59, 92, 93, 94, 95, 84, 130, 25, 22, 92, + 93, 94, 95, 87, 92, 93, 94, 95, 362, 129, + 506, 129, 84, 13, 584, 92, 93, 94, 95, 92, + 93, 94, 95, 84, 56, 385, 360, 361, 56, 120, + 56, 56, 401, 61, 368, 44, 401, 15, 130, 609, + 400, 129, 439, 61, 407, 78, 79, 80, 362, 59, + 16, 59, 129, 88, 20, 389, 390, 78, 24, 629, + 12, 129, 13, 423, 424, 561, 400, 25, 25, 403, + 404, 405, 406, 433, 130, 25, 25, 437, 392, 439, + 113, 114, 115, 116, 560, 25, 18, 401, 121, 59, + 97, 124, 125, 126, 127, 128, 130, 461, 22, 97, + 121, 461, 402, 124, 125, 126, 127, 128, 408, 56, + 130, 411, 446, 129, 32, 12, 12, 35, 36, 37, + 38, 16, 12, 41, 12, 12, 129, 461, 129, 22, + 129, 431, 92, 93, 94, 95, 541, 542, 130, 499, + 129, 501, 129, 548, 129, 129, 506, 130, 56, 554, + 555, 11, 11, 92, 93, 94, 95, 88, 492, 92, + 93, 94, 95, 560, 12, 129, 22, 481, 15, 129, + 129, 471, 86, 473, 92, 93, 94, 95, 22, 22, + 585, 586, 587, 129, 484, 519, 591, 78, 79, 80, + 129, 92, 93, 94, 95, 130, 129, 22, 603, 562, + 560, 561, 129, 566, 130, 610, 611, 129, 129, 129, + 573, 130, 546, 547, 45, 17, 576, 577, 129, 129, + 78, 85, 582, 114, 115, 116, 129, 129, 129, 634, + 121, 13, 116, 124, 125, 126, 127, 128, 538, 602, + 600, 646, 92, 93, 94, 95, 403, 583, 659, 583, + 584, 290, 657, 501, 425, 615, 616, 617, 116, 281, + 424, 514, 667, 121, 578, 431, 124, 125, 126, 127, + 128, 631, 632, 593, 401, 609, 590, 138, 246, 129, + -1, 21, 642, 23, -1, 639, 26, -1, 28, 29, + 650, 654, -1, 593, -1, 629, -1, -1, 658, 659, + -1, 41, 662, -1, 44, -1, -1, -1, 48, -1, + 0, 1, -1, -1, 54, 55, 56, 57, 58, -1, + 10, 11, -1, 13, -1, -1, 16, -1, -1, 19, 20, 21, 22, -1, 24, 25, 26, 27, 28, 29, - 30, -1, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, -1, -1, -1, 54, 55, 56, 57, 58, -1, - -1, 61, -1, 63, 64, 65, 66, 67, 68, -1, - -1, 71, 72, 73, 74, 75, 76, 77, -1, -1, - -1, -1, -1, 83, -1, -1, -1, 87, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1, -1, 102, 103, -1, 105, -1, 107, 108, 10, - 11, -1, 13, -1, 114, 16, -1, -1, 19, 20, - 21, 22, -1, 24, 25, 26, 27, 28, 29, 30, - -1, 32, 33, 34, 35, 36, 37, 38, -1, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - -1, -1, -1, 54, 55, 56, 57, 58, -1, -1, - 61, -1, 63, 64, 65, 66, 67, 68, -1, -1, - 71, 72, 73, 74, 75, 76, 77, -1, -1, -1, - -1, -1, 83, -1, -1, -1, 87, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, - -1, 102, 103, -1, 105, 10, 107, 108, 13, -1, - -1, 16, -1, 114, 19, 20, 21, 22, -1, 24, - 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, - 35, 36, 37, -1, -1, -1, -1, -1, 43, 44, - -1, -1, -1, -1, -1, -1, -1, -1, 69, 70, - -1, -1, -1, -1, -1, -1, 61, -1, -1, 64, - 65, 66, 67, 68, -1, -1, 71, 72, 73, 74, - 75, 76, 77, 94, 95, 96, 97, 98, 99, 100, - 101, -1, 87, -1, -1, 106, -1, -1, 109, 110, - 111, 112, 1, -1, -1, -1, -1, 102, 103, -1, - 105, 10, 107, 108, 13, -1, -1, 16, -1, 114, - 19, 20, 21, -1, -1, 24, 25, 26, 27, 28, - 29, 30, -1, 32, 33, 34, 35, 36, 37, -1, - -1, -1, -1, -1, 43, 44, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 61, -1, -1, 64, 65, 66, 67, 68, - 0, -1, 71, 72, 73, 74, 75, 76, 77, -1, - -1, 11, -1, 13, 14, 15, -1, -1, 87, -1, - -1, -1, 22, 23, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 102, 103, -1, 105, -1, 107, 108, - -1, -1, -1, -1, 113, 114, -1, 47, 48, 49, - 50, -1, -1, -1, 54, -1, 56, -1, -1, -1, - -1, -1, 62, -1, -1, -1, -1, -1, -1, 69, - 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 82, -1, -1, 85, 86, -1, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 0, 69, 70, -1, 106, -1, -1, 109, - 110, 111, 112, 113, -1, -1, 14, 15, -1, -1, - -1, -1, -1, -1, 22, 23, -1, 93, 94, 95, - 96, 97, 98, 99, 100, 101, -1, -1, -1, -1, - 106, -1, -1, 109, 110, 111, 112, -1, -1, 47, - 48, 49, 50, -1, -1, -1, 54, -1, 56, -1, - -1, -1, -1, -1, 62, -1, -1, -1, -1, -1, - -1, 69, 70, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 82, -1, -1, 85, 86, -1, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, -1, -1, -1, -1, 106, -1, - -1, 109, 110, 111, 112, 113, 10, 11, -1, 13, - -1, -1, 16, -1, -1, 19, 20, 21, -1, -1, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, -1, -1, -1, -1, -1, 43, - 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, - 64, 65, 66, 67, 68, -1, -1, 71, 72, 73, - 74, 75, 76, 77, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 102, 103, - -1, 105, -1, 107, 108, 10, 11, -1, 13, -1, - 114, 16, -1, -1, 19, 20, 21, -1, -1, 24, - 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, - 35, 36, 37, -1, -1, -1, -1, -1, 43, 44, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 61, -1, -1, 64, - 65, 66, 67, 68, -1, -1, 71, 72, 73, 74, - 75, 76, 77, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 102, 103, -1, - 105, 10, 107, 108, 13, -1, -1, 16, -1, 114, - 19, 20, 21, -1, -1, 24, 25, 26, 27, 28, - 29, 30, -1, 32, 33, 34, 35, 36, 37, -1, - -1, -1, -1, -1, 43, 44, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 61, -1, -1, 64, 65, 66, 67, 68, - -1, -1, 71, 72, 73, 74, 75, 76, 77, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 87, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 102, 103, -1, 105, 10, 107, 108, - 13, -1, -1, 16, 113, 114, 19, 20, 21, -1, - -1, 24, 25, 26, 27, 28, 29, 30, -1, 32, - 33, 34, 35, 36, 37, -1, -1, -1, -1, -1, - 43, 44, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, - -1, 64, 65, 66, 67, 68, -1, -1, 71, 72, - 73, 74, 75, 76, 77, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 87, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 102, - 103, -1, 105, 10, 107, 108, 13, -1, -1, 16, - 113, 114, 19, 20, 21, -1, -1, 24, 25, 26, - 27, 28, 29, 30, -1, 32, 33, 34, 35, 36, - 37, -1, -1, -1, -1, -1, 43, 44, -1, -1, + 30, 31, 32, -1, -1, 35, 36, 37, 38, -1, + 40, 41, 42, 43, -1, -1, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, -1, 62, 63, 64, 65, 66, 67, 68, 69, + 70, -1, 72, 73, 74, 75, 76, 77, -1, -1, + -1, 81, 82, 83, 92, 93, 94, 95, 138, 89, + -1, 10, -1, -1, -1, -1, 96, 16, -1, -1, + -1, 20, -1, -1, -1, 24, 124, 125, 126, 127, + 128, 30, 92, 93, 94, 95, -1, 117, 118, -1, + 120, 129, 122, 123, -1, -1, -1, -1, -1, -1, + 130, -1, -1, -1, -1, -1, -1, 187, -1, -1, + -1, -1, -1, 193, -1, -1, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 0, 1, -1, 225, -1, -1, -1, -1, + -1, -1, 10, 11, -1, 13, -1, -1, 16, -1, + -1, 19, 20, 21, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, 35, 36, 37, + 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, -1, 62, 63, 64, 65, 66, 67, + 68, 69, 70, -1, 72, 73, 74, 75, 76, 77, + -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, + -1, 89, -1, -1, -1, -1, -1, -1, 96, 3, + 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, 117, + 118, -1, 120, -1, 122, 123, -1, 10, 11, 12, + 13, -1, 130, 16, -1, -1, 19, 20, 21, 22, + -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, + 43, -1, -1, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, -1, 62, + 63, 64, 65, 66, 67, 68, 69, 70, -1, 72, + 73, 74, 75, 76, 77, -1, -1, -1, 81, 82, + 83, -1, -1, -1, -1, -1, 89, -1, -1, -1, + -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 61, -1, -1, 64, 65, 66, - 67, 68, -1, -1, 71, 72, 73, 74, 75, 76, - 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 102, 103, -1, 105, 10, - 107, 108, 13, -1, -1, 16, 113, 114, 19, 20, - 21, -1, -1, 24, 25, 26, 27, 28, 29, 30, - -1, 32, 33, 34, 35, 36, 37, -1, -1, -1, - -1, -1, 43, 44, -1, -1, -1, -1, -1, -1, + 450, -1, -1, -1, 117, 118, -1, 120, -1, 122, + 123, -1, -1, 1, -1, -1, -1, 130, -1, -1, + -1, -1, 10, 11, 12, 13, -1, -1, 16, -1, + -1, 19, 20, 21, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, 35, 36, 37, + 38, -1, 40, 41, 42, 43, -1, 507, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, -1, 62, 63, 64, 65, 66, 67, + 68, 69, 70, -1, 72, 73, 74, 75, 76, 77, + 540, -1, -1, 81, 82, 83, -1, -1, -1, -1, + -1, 89, -1, -1, -1, -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 61, -1, -1, 64, 65, 66, 67, 68, -1, -1, - 71, 72, 73, 74, 75, 76, 77, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 87, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, 117, + 118, -1, 120, -1, 122, 123, -1, 10, 11, 12, + 13, -1, 130, 16, -1, -1, 19, 20, 21, 22, + -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, + 43, -1, -1, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, -1, 62, + 63, 64, 65, 66, 67, 68, 69, 70, -1, 72, + 73, 74, 75, 76, 77, -1, -1, -1, 81, 82, + 83, -1, -1, -1, -1, -1, 89, -1, -1, -1, + -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 102, 103, -1, 105, 10, 107, 108, 13, -1, - -1, 16, 113, 114, 19, 20, 21, -1, -1, 24, - 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, - 35, 36, 37, -1, -1, -1, -1, -1, 43, 44, + -1, -1, -1, 1, 117, 118, -1, 120, -1, 122, + 123, -1, 10, 11, 12, 13, -1, 130, 16, -1, + -1, 19, 20, 21, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, 35, 36, 37, + 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, -1, 62, 63, 64, 65, 66, 67, + 68, 69, 70, -1, 72, 73, 74, 75, 76, 77, + -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, + -1, 89, -1, -1, -1, -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 61, -1, -1, 64, - 65, 66, 67, 68, -1, -1, 71, 72, 73, 74, - 75, 76, 77, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 102, 103, -1, - 105, 10, 107, 108, 13, -1, -1, 16, 113, 114, - 19, 20, 21, -1, -1, 24, 25, 26, 27, 28, - 29, 30, -1, 32, 33, 34, 35, 36, 37, -1, - -1, -1, -1, -1, 43, 44, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, 117, + 118, -1, 120, -1, 122, 123, -1, 10, 11, 12, + 13, -1, 130, 16, -1, -1, 19, 20, 21, 22, + -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, + 43, -1, -1, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, -1, 62, + 63, 64, 65, 66, 67, 68, 69, 70, -1, 72, + 73, 74, 75, 76, 77, -1, -1, -1, 81, 82, + 83, -1, -1, -1, -1, -1, 89, -1, -1, -1, + -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 61, -1, -1, 64, 65, 66, 67, 68, - -1, -1, 71, 72, 73, 74, 75, 76, 77, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 87, -1, + -1, -1, -1, 1, 117, 118, -1, 120, -1, 122, + 123, -1, 10, 11, 12, 13, -1, 130, 16, -1, + -1, 19, 20, 21, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, 35, 36, 37, + 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, -1, 62, 63, 64, 65, 66, 67, + 68, 69, 70, -1, 72, 73, 74, 75, 76, 77, + -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, + -1, 89, -1, -1, -1, -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 102, 103, -1, 105, 10, 107, 108, - 13, -1, -1, 16, 113, 114, 19, 20, 21, -1, - -1, 24, 25, 26, 27, 28, 29, 30, -1, 32, - 33, 34, 35, 36, 37, -1, -1, -1, -1, -1, - 43, 44, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, - -1, 64, 65, 66, 67, 68, -1, -1, 71, 72, - 73, 74, 75, 76, 77, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 87, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 102, - 103, -1, 105, 10, 107, 108, 13, -1, -1, 16, - 113, 114, 19, 20, 21, -1, -1, 24, 25, 26, - 27, 28, 29, 30, -1, 32, 33, 34, 35, 36, - 37, -1, -1, -1, -1, -1, 43, 44, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, 117, + 118, -1, 120, -1, 122, 123, -1, 10, 11, -1, + 13, -1, 130, 16, -1, -1, 19, 20, 21, 22, + -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, + 43, -1, -1, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, -1, 62, + 63, 64, 65, 66, 67, 68, 69, 70, -1, 72, + 73, 74, 75, 76, 77, -1, -1, -1, 81, 82, + 83, -1, -1, 86, -1, -1, 89, -1, -1, -1, + -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 61, -1, -1, 64, 65, 66, - 67, 68, -1, -1, 71, 72, 73, 74, 75, 76, - 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 102, 103, -1, 105, 10, - 107, 108, 13, -1, -1, 16, -1, 114, 19, 20, - 21, -1, -1, 24, 25, 26, 27, 28, 29, 30, - -1, 32, 33, 34, 35, 36, 37, -1, -1, -1, - -1, -1, 43, 44, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1, 117, 118, -1, 120, -1, 122, + 123, -1, 10, 11, -1, 13, -1, 130, 16, -1, + -1, 19, 20, 21, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, 35, 36, 37, + 38, -1, 40, 41, 42, 43, -1, -1, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, -1, 62, 63, 64, 65, 66, 67, + 68, 69, 70, -1, 72, 73, 74, 75, 76, 77, + -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, + -1, 89, -1, -1, -1, -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 61, -1, -1, 64, 65, 66, 67, 68, -1, -1, - 71, 72, 73, 74, 75, 76, 77, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 87, -1, 62, -1, - -1, -1, -1, -1, -1, 69, 70, -1, -1, -1, - -1, 102, 103, -1, 105, -1, 107, 108, -1, -1, - -1, -1, -1, 114, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, -1, -1, - -1, -1, 106, 62, -1, 109, 110, 111, 112, -1, - 69, 70, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, - 89, -1, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, -1, -1, -1, -1, 106, 62, -1, - 109, 110, 111, 112, -1, 69, 70, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1, 117, + 118, -1, 120, -1, 122, 123, -1, 10, 11, -1, + 13, -1, 130, 16, -1, -1, 19, 20, 21, 22, + -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, + 43, -1, -1, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, -1, 62, + 63, 64, 65, 66, 67, 68, -1, 70, -1, 72, + 73, 74, 75, 76, 77, -1, -1, -1, 81, 82, + 83, -1, 1, -1, -1, -1, 89, -1, -1, -1, + -1, 10, -1, 96, 13, -1, -1, 16, -1, -1, + 19, 20, 21, 22, -1, 24, 25, -1, -1, -1, + 29, 30, -1, -1, 117, 118, -1, 120, -1, 122, + 123, -1, -1, -1, -1, -1, -1, 130, 47, 48, + -1, -1, -1, 52, 53, -1, 55, 56, 57, 58, + 59, 60, -1, 62, 63, 64, 65, 66, 67, -1, + -1, 70, -1, -1, 73, 74, 75, 76, 77, -1, + -1, 1, 81, 82, 83, -1, -1, -1, -1, -1, + 10, -1, -1, 13, -1, -1, 16, 96, -1, 19, + 20, 21, -1, -1, 24, 25, -1, -1, -1, 29, + 30, -1, -1, -1, -1, -1, -1, -1, 117, 118, + -1, 120, -1, 122, 123, -1, -1, 47, 48, -1, + -1, 130, 52, 53, -1, 55, 56, 57, 58, 59, + 60, -1, 62, 63, 64, 65, 66, 67, -1, -1, + 70, -1, -1, 73, 74, 75, 76, 77, -1, -1, + -1, 81, 82, 83, -1, -1, -1, -1, -1, 10, + 11, -1, 13, -1, -1, 16, 96, -1, 19, 20, + 21, -1, -1, 24, 25, -1, -1, -1, 29, 30, + -1, -1, -1, -1, -1, -1, -1, 117, 118, -1, + 120, -1, 122, 123, -1, -1, 47, 48, -1, 129, + 130, 52, 53, -1, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, -1, -1, 70, + -1, -1, 73, 74, 75, 76, 77, -1, -1, -1, + 81, 82, 83, -1, -1, -1, -1, -1, 10, 11, + -1, 13, -1, -1, 16, 96, -1, 19, 20, 21, + -1, -1, 24, 25, -1, -1, -1, 29, 30, -1, + -1, -1, -1, -1, -1, -1, 117, 118, -1, 120, + -1, 122, 123, -1, -1, 47, 48, -1, -1, 130, + 52, 53, -1, 55, 56, 57, 58, 59, 60, -1, + 62, 63, 64, 65, 66, 67, -1, -1, 70, -1, + -1, 73, 74, 75, 76, 77, -1, -1, -1, 81, + 82, 83, -1, -1, -1, -1, -1, 10, -1, -1, + 13, -1, -1, 16, 96, -1, 19, 20, 21, -1, + -1, 24, 25, -1, -1, -1, 29, 30, -1, -1, + -1, -1, -1, -1, -1, 117, 118, -1, 120, -1, + 122, 123, -1, -1, 47, 48, -1, -1, 130, 52, + 53, -1, 55, 56, 57, 58, 59, 60, -1, 62, + 63, 64, 65, 66, 67, -1, -1, 70, -1, -1, + 73, 74, 75, 76, 77, -1, -1, -1, 81, 82, + 83, -1, -1, -1, -1, -1, 10, -1, -1, 13, + -1, -1, 16, 96, -1, 19, 20, 21, -1, -1, + 24, 25, -1, -1, -1, 29, 30, -1, -1, -1, + -1, -1, -1, -1, 117, 118, -1, 120, -1, 122, + 123, -1, -1, 47, 48, -1, 129, 130, 52, 53, + -1, 55, 56, 57, 58, 59, 60, -1, 62, 63, + 64, 65, 66, 67, -1, -1, 70, -1, -1, 73, + 74, 75, 76, 77, -1, -1, -1, 81, 82, 83, + -1, -1, -1, -1, -1, 10, -1, -1, 13, -1, + -1, 16, 96, -1, 19, 20, 21, -1, -1, 24, + 25, -1, -1, -1, 29, 30, -1, -1, -1, -1, + -1, -1, -1, 117, 118, -1, 120, -1, 122, 123, + -1, -1, 47, 48, -1, 129, 130, 52, 53, -1, + 55, 56, 57, 58, 59, 60, -1, 62, 63, 64, + 65, 66, 67, -1, -1, 70, -1, -1, 73, 74, + 75, 76, 77, -1, -1, -1, 81, 82, 83, -1, + -1, -1, -1, -1, 10, 11, -1, 13, -1, -1, + 16, 96, -1, 19, 20, 21, -1, -1, 24, 25, + -1, -1, -1, 29, 30, -1, -1, -1, -1, -1, + -1, -1, 117, 118, -1, 120, -1, 122, 123, -1, + -1, 47, 48, -1, 129, 130, 52, 53, -1, 55, + 56, 57, 58, 59, 60, -1, 62, 63, 64, 65, + 66, 67, -1, -1, 70, -1, -1, 73, 74, 75, + 76, 77, -1, -1, -1, 81, 82, 83, -1, -1, + -1, -1, -1, 10, -1, -1, 13, -1, -1, 16, + 96, -1, 19, 20, 21, -1, -1, 24, 25, -1, + -1, -1, 29, 30, -1, -1, -1, -1, -1, -1, + -1, 117, 118, -1, 120, -1, 122, 123, -1, -1, + 47, 48, -1, -1, 130, 52, 53, -1, 55, 56, + 57, 58, 59, 60, -1, 62, 63, 64, 65, 66, + 67, -1, -1, 70, -1, -1, 73, 74, 75, 76, + 77, -1, -1, -1, 81, 82, 83, -1, -1, -1, + -1, -1, 10, -1, -1, 13, -1, -1, 16, 96, + -1, 19, 20, 21, -1, -1, 24, 25, -1, -1, + -1, 29, 30, -1, -1, -1, -1, -1, -1, -1, + 117, 118, -1, 120, -1, 122, 123, -1, -1, 47, + 48, -1, 129, 130, 52, 53, -1, 55, 56, 57, + 58, 59, 60, -1, 62, 63, 64, 65, 66, 67, + -1, -1, 70, -1, -1, 73, 74, 75, 76, 77, + -1, -1, -1, 81, 82, 83, -1, -1, -1, -1, + -1, 10, -1, -1, 13, -1, -1, 16, 96, -1, + 19, 20, 21, -1, -1, 24, 25, -1, -1, -1, + 29, 30, -1, -1, -1, -1, -1, -1, -1, 117, + 118, -1, 120, -1, 122, 123, -1, -1, 47, 48, + -1, 129, 130, 52, 53, -1, 55, 56, 57, 58, + 59, 60, -1, 62, 63, 64, 65, 66, 67, -1, + -1, 70, -1, -1, 73, 74, 75, 76, 77, -1, + -1, -1, 81, 82, 83, -1, -1, -1, -1, -1, + 10, -1, -1, 13, -1, -1, 16, 96, -1, 19, + 20, 21, -1, -1, 24, 25, -1, -1, -1, 29, + 30, -1, -1, -1, -1, -1, -1, -1, 117, 118, + -1, 120, -1, 122, 123, -1, -1, 47, 48, -1, + 129, 130, 52, 53, -1, 55, 56, 57, 58, 59, + 60, -1, 62, 63, 64, 65, 66, 67, -1, -1, + 70, -1, -1, 73, 74, 75, 76, 77, -1, -1, + -1, 81, 82, 83, -1, -1, -1, -1, -1, 10, + -1, -1, 13, -1, -1, 16, 96, -1, 19, 20, + 21, -1, -1, 24, 25, -1, -1, -1, 29, 30, + -1, -1, -1, -1, -1, -1, -1, 117, 118, -1, + 120, -1, 122, 123, -1, -1, 47, 48, -1, 129, + 130, 52, 53, -1, 55, 56, 57, 58, 59, 60, + -1, 62, 63, 64, 65, 66, 67, -1, -1, 70, + -1, -1, 73, 74, 75, 76, 77, -1, -1, -1, + 81, 82, 83, -1, -1, -1, -1, -1, 10, -1, + -1, 13, -1, -1, 16, 96, -1, 19, 20, 21, + -1, -1, 24, 25, -1, -1, -1, 29, 30, -1, + -1, -1, -1, -1, -1, -1, 117, 118, -1, 120, + -1, 122, 123, -1, -1, 47, 48, -1, -1, 130, + 52, 53, -1, 55, 56, 57, 58, 59, 60, -1, + 62, 63, 64, 65, 66, 67, -1, -1, 70, -1, + -1, 73, 74, 75, 76, 77, -1, -1, -1, 81, + 82, 83, -1, -1, -1, -1, -1, 10, -1, -1, + 13, -1, -1, 16, 96, -1, 19, 20, 21, -1, + -1, 24, 25, -1, -1, -1, 29, 30, -1, -1, + -1, -1, -1, -1, -1, 117, 118, -1, 120, -1, + 122, 123, -1, -1, 47, 48, -1, -1, 130, 52, + 53, -1, 55, 56, 57, 58, 59, 60, -1, 62, + 63, 64, 65, 66, 67, -1, -1, 70, -1, -1, + 73, 74, 75, 76, 77, -1, -1, -1, 81, 82, + 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, + -1, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, 80, -1, -1, 117, 118, -1, 120, -1, 122, + 123, -1, 91, -1, -1, -1, -1, 130, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, -1, -1, + -1, -1, 121, 71, -1, 124, 125, 126, 127, 128, + 78, 79, 80, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 91, -1, -1, -1, -1, -1, 97, + 98, 99, -1, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, -1, + -1, -1, -1, 121, 71, -1, 124, 125, 126, 127, + 128, 78, 79, 80, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 91, -1, -1, -1, 78, 79, + 97, 98, 99, -1, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + -1, -1, -1, -1, 121, 71, -1, 124, 125, 126, + 127, 128, 78, 79, 80, 115, 116, -1, -1, -1, + -1, 121, -1, -1, 124, 125, 126, 127, 128, -1, + -1, 97, 98, 99, -1, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, -1, -1, -1, -1, 121, 71, -1, 124, 125, + 126, 127, 128, 78, 79, 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 89, -1, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, -1, -1, - -1, -1, 106, 62, -1, 109, 110, 111, 112, -1, - 69, 70, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 99, -1, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, -1, -1, -1, -1, 121, 71, -1, 124, + 125, 126, 127, 128, 78, 79, 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, -1, -1, -1, -1, 106, -1, -1, - 109, 110, 111, 112 + -1, -1, -1, -1, -1, -1, -1, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 78, 79, 80, -1, 121, -1, -1, + 124, 125, 126, 127, 128, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 78, 79, 80, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, -1, -1, -1, -1, 121, -1, -1, 124, + 125, 126, 127, 128, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 78, 79, 80, -1, 121, + -1, -1, 124, 125, 126, 127, 128, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 78, 79, 80, -1, + -1, -1, -1, -1, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, -1, 78, 79, 80, 121, -1, + -1, 124, 125, 126, 127, 128, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 78, 79, 80, -1, 121, + -1, -1, 124, 125, 126, 127, 128, 110, 111, 112, + 113, 114, 115, 116, 78, 79, 80, -1, 121, -1, + -1, 124, 125, 126, 127, 128, -1, -1, -1, 112, + 113, 114, 115, 116, -1, -1, -1, -1, 121, -1, + -1, 124, 125, 126, 127, 128, -1, -1, 112, 113, + 114, 115, 116, -1, -1, -1, -1, 121, -1, -1, + 124, 125, 126, 127, 128 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 3, 4, 5, 6, 7, 8, 9, 116, 117, - 118, 119, 120, 121, 122, 123, 0, 127, 10, 13, - 16, 19, 20, 21, 24, 25, 26, 27, 28, 29, - 30, 32, 33, 34, 35, 36, 37, 43, 44, 61, - 64, 65, 66, 67, 68, 71, 72, 73, 74, 75, - 76, 77, 87, 102, 103, 105, 107, 108, 114, 125, - 181, 182, 183, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 197, 200, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 11, 124, 1, 22, 38, 40, - 41, 42, 45, 46, 47, 48, 49, 50, 54, 55, - 56, 57, 58, 63, 83, 124, 134, 147, 181, 39, - 132, 133, 134, 125, 130, 175, 176, 130, 26, 31, - 124, 209, 217, 200, 217, 195, 217, 195, 217, 217, - 217, 217, 196, 13, 114, 195, 159, 159, 159, 195, - 114, 114, 81, 114, 124, 195, 26, 125, 182, 199, - 209, 217, 217, 124, 195, 200, 26, 31, 161, 195, - 105, 114, 198, 209, 210, 211, 195, 182, 195, 195, - 195, 195, 195, 113, 181, 85, 86, 15, 11, 13, - 114, 98, 99, 98, 96, 97, 96, 62, 69, 70, - 88, 89, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 106, 109, 110, 111, 112, 114, 11, - 13, 11, 13, 11, 13, 11, 127, 160, 161, 161, - 26, 158, 114, 114, 114, 114, 76, 105, 114, 207, - 209, 114, 114, 124, 11, 128, 22, 128, 53, 125, - 149, 22, 47, 48, 49, 50, 54, 56, 133, 134, - 132, 16, 20, 24, 125, 166, 167, 169, 170, 171, - 172, 14, 199, 114, 81, 181, 113, 124, 29, 125, - 162, 78, 125, 163, 113, 113, 181, 200, 200, 217, - 182, 22, 199, 114, 195, 198, 209, 210, 211, 113, - 181, 78, 164, 13, 113, 181, 181, 195, 181, 181, - 113, 181, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 10, 11, 13, 16, 20, 24, 25, 27, 71, - 114, 185, 209, 113, 181, 181, 181, 181, 181, 181, - 181, 181, 130, 26, 125, 157, 158, 158, 26, 137, - 127, 127, 127, 127, 105, 127, 76, 205, 206, 208, - 209, 210, 211, 127, 127, 114, 127, 127, 129, 59, - 124, 146, 181, 154, 181, 146, 146, 146, 146, 31, - 165, 165, 15, 200, 182, 14, 184, 163, 29, 127, - 180, 113, 82, 113, 181, 12, 113, 181, 164, 113, - 29, 181, 13, 22, 14, 113, 90, 25, 181, 181, - 25, 25, 25, 25, 25, 113, 181, 114, 113, 22, - 14, 22, 14, 22, 14, 22, 12, 18, 126, 135, - 136, 11, 22, 26, 153, 181, 154, 155, 181, 155, - 114, 202, 209, 114, 125, 147, 152, 155, 156, 181, - 205, 127, 155, 155, 130, 114, 88, 125, 168, 168, - 170, 113, 23, 125, 201, 199, 127, 178, 114, 125, - 173, 174, 113, 113, 14, 181, 12, 195, 22, 14, - 113, 200, 12, 12, 12, 12, 127, 162, 163, 127, - 26, 113, 113, 113, 113, 203, 204, 209, 114, 127, - 113, 22, 140, 155, 113, 113, 12, 141, 195, 181, - 82, 11, 175, 11, 14, 12, 113, 22, 163, 22, - 179, 180, 143, 199, 151, 151, 128, 128, 15, 113, - 155, 155, 128, 138, 114, 113, 128, 128, 127, 130, - 113, 130, 80, 22, 177, 178, 130, 22, 128, 128, - 51, 52, 125, 148, 148, 209, 114, 113, 113, 149, - 153, 155, 128, 209, 12, 12, 125, 131, 12, 149, - 149, 128, 114, 155, 128, 128, 22, 113, 149, 142, - 22, 29, 144, 155, 113, 149, 149, 139, 128, 113, - 17, 79, 125, 145, 113, 128, 151, 149, 128, 130, - 128, 149, 156, 60, 150, 80, 148, 113, 124, 128 + 0, 3, 4, 5, 6, 7, 8, 9, 132, 133, + 134, 135, 136, 137, 138, 139, 0, 144, 10, 13, + 16, 19, 20, 21, 24, 25, 29, 30, 47, 48, + 52, 53, 55, 56, 57, 58, 59, 60, 62, 63, + 64, 65, 66, 67, 70, 73, 74, 75, 76, 77, + 81, 82, 83, 96, 117, 118, 120, 122, 123, 130, + 142, 203, 204, 205, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 219, 226, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 11, 141, 1, 22, 26, + 27, 28, 31, 32, 35, 36, 37, 38, 40, 41, + 42, 43, 46, 49, 50, 51, 54, 68, 72, 89, + 140, 141, 154, 168, 203, 223, 69, 152, 153, 154, + 142, 150, 197, 198, 150, 56, 61, 141, 235, 243, + 226, 243, 217, 243, 217, 243, 243, 217, 120, 130, + 220, 235, 236, 237, 217, 141, 217, 180, 180, 181, + 243, 243, 218, 13, 130, 217, 180, 217, 130, 130, + 87, 130, 141, 217, 56, 142, 204, 225, 235, 243, + 243, 226, 56, 61, 183, 204, 217, 217, 217, 217, + 217, 129, 203, 92, 93, 94, 95, 15, 11, 13, + 130, 110, 111, 110, 108, 109, 108, 71, 78, 79, + 80, 91, 97, 98, 99, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 121, 124, 125, 126, 127, 128, 130, 11, 13, + 11, 13, 11, 13, 11, 144, 182, 56, 56, 221, + 235, 236, 237, 130, 130, 30, 120, 130, 233, 235, + 130, 130, 130, 130, 141, 11, 145, 145, 179, 183, + 22, 179, 183, 39, 142, 170, 22, 32, 35, 36, + 37, 38, 41, 22, 153, 154, 152, 16, 20, 24, + 142, 188, 189, 191, 192, 193, 194, 14, 130, 217, + 220, 235, 236, 237, 129, 203, 84, 186, 59, 142, + 184, 84, 142, 185, 185, 225, 130, 87, 203, 129, + 141, 129, 129, 203, 226, 226, 243, 204, 22, 225, + 13, 129, 203, 203, 203, 203, 217, 203, 203, 129, + 203, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 10, + 11, 13, 16, 20, 24, 25, 57, 81, 130, 207, + 235, 129, 203, 203, 203, 203, 203, 203, 203, 203, + 150, 56, 142, 178, 56, 56, 84, 142, 222, 144, + 144, 120, 144, 30, 231, 232, 234, 235, 236, 237, + 144, 144, 130, 144, 144, 144, 144, 146, 44, 158, + 179, 157, 179, 141, 167, 203, 167, 167, 175, 203, + 167, 167, 61, 187, 187, 15, 129, 203, 186, 129, + 59, 185, 59, 144, 202, 202, 226, 204, 14, 206, + 129, 88, 129, 203, 12, 203, 13, 22, 14, 129, + 100, 25, 203, 203, 25, 25, 25, 25, 25, 129, + 203, 130, 129, 22, 14, 22, 14, 22, 14, 22, + 12, 18, 143, 11, 22, 185, 59, 97, 176, 203, + 176, 130, 228, 235, 130, 142, 168, 173, 176, 177, + 203, 231, 144, 175, 174, 203, 176, 176, 150, 144, + 56, 155, 22, 144, 199, 200, 156, 97, 142, 190, + 190, 192, 129, 200, 130, 142, 195, 196, 129, 23, + 142, 227, 225, 129, 14, 203, 12, 217, 22, 14, + 129, 226, 12, 12, 12, 12, 144, 144, 11, 22, + 224, 129, 129, 229, 230, 235, 130, 144, 129, 22, + 161, 176, 129, 129, 129, 129, 12, 130, 142, 147, + 56, 184, 11, 185, 217, 197, 11, 203, 88, 14, + 12, 129, 22, 163, 144, 217, 145, 145, 15, 129, + 176, 176, 145, 159, 130, 129, 172, 172, 145, 145, + 148, 162, 225, 185, 150, 22, 201, 202, 129, 150, + 86, 150, 164, 33, 34, 142, 169, 169, 235, 130, + 129, 129, 170, 174, 176, 145, 145, 145, 235, 145, + 22, 199, 12, 12, 142, 151, 12, 150, 145, 130, + 176, 145, 145, 22, 129, 170, 170, 170, 149, 45, + 171, 22, 59, 165, 12, 176, 129, 170, 170, 160, + 145, 129, 141, 17, 85, 142, 166, 129, 145, 172, + 170, 150, 145, 170, 177, 86, 169, 129, 145 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 115, 117, 116, 118, 116, 119, 116, 120, 116, - 121, 116, 122, 116, 123, 116, 124, 125, 126, 127, - 128, 129, 130, 130, 131, 131, 132, 132, 133, 133, - 134, 134, 135, 134, 136, 134, 134, 137, 134, 134, - 134, 134, 134, 134, 134, 134, 138, 139, 134, 134, - 134, 134, 140, 134, 134, 134, 141, 142, 134, 134, - 143, 134, 134, 134, 134, 134, 144, 145, 145, 146, - 147, 147, 147, 147, 147, 147, 147, 147, 148, 148, - 148, 149, 149, 150, 150, 151, 152, 152, 153, 153, - 154, 155, 156, 157, 157, 158, 159, 160, 161, 161, - 162, 162, 163, 163, 163, 164, 164, 165, 165, 166, - 166, 167, 168, 168, 168, 169, 170, 170, 171, 171, - 171, 172, 172, 173, 173, 174, 176, 175, 177, 177, - 178, 179, 179, 180, 181, 181, 181, 182, 182, 182, - 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, - 183, 185, 185, 186, 186, 186, 186, 186, 186, 186, - 186, 186, 186, 186, 186, 186, 186, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 188, 188, 188, 188, 189, 189, 190, 190, 190, - 190, 191, 191, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 193, 193, 193, 193, 194, 194, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 196, 195, 195, 195, - 195, 197, 197, 197, 197, 198, 198, 198, 198, 198, - 199, 199, 200, 200, 201, 201, 202, 203, 203, 203, - 204, 205, 205, 205, 206, 206, 207, 207, 208, 209, - 210, 211, 212, 212, 213, 214, 214, 215, 215, 216, - 216, 217, 217, 217, 217 + 0, 131, 133, 132, 134, 132, 135, 132, 136, 132, + 137, 132, 138, 132, 139, 132, 140, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 147, 150, 150, + 151, 151, 152, 152, 153, 153, 154, 154, 155, 154, + 156, 154, 157, 154, 154, 154, 158, 154, 154, 154, + 154, 154, 154, 154, 154, 159, 160, 154, 154, 154, + 154, 161, 154, 154, 154, 162, 154, 154, 163, 154, + 164, 154, 154, 154, 154, 154, 154, 165, 166, 166, + 167, 168, 168, 168, 168, 168, 168, 168, 168, 169, + 169, 169, 170, 170, 171, 171, 172, 173, 173, 174, + 174, 175, 176, 177, 178, 178, 179, 180, 181, 182, + 183, 183, 184, 184, 185, 185, 185, 186, 186, 187, + 187, 188, 188, 189, 190, 190, 190, 191, 192, 192, + 193, 193, 193, 194, 194, 195, 195, 196, 198, 197, + 199, 199, 200, 201, 201, 202, 203, 203, 203, 203, + 203, 204, 204, 204, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 206, 205, 207, 207, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 210, 210, 210, 210, 210, 211, 211, + 212, 212, 212, 212, 213, 213, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 215, 215, 215, 215, 215, + 216, 216, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + 218, 217, 217, 217, 217, 219, 219, 219, 219, 220, + 220, 220, 220, 220, 221, 221, 221, 222, 222, 222, + 223, 224, 223, 225, 225, 226, 226, 227, 227, 228, + 229, 229, 229, 230, 231, 231, 231, 232, 232, 233, + 233, 234, 235, 236, 237, 238, 238, 239, 240, 240, + 241, 241, 242, 242, 243, 243, 243, 243 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ -static const yytype_int8 yyr2[] = +static const yytype_uint8 yyr2[] = { 0, 2, 0, 4, 0, 3, 0, 3, 0, 3, - 0, 3, 0, 3, 0, 3, 4, 0, 7, 0, - 4, 0, 1, 2, 1, 2, 1, 1, 2, 2, - 1, 4, 0, 7, 0, 6, 4, 0, 7, 7, - 7, 6, 6, 2, 8, 8, 0, 0, 13, 9, - 11, 8, 0, 10, 9, 7, 0, 0, 11, 2, - 0, 8, 2, 2, 2, 1, 2, 1, 3, 1, - 1, 1, 3, 3, 3, 3, 3, 3, 1, 2, - 6, 1, 2, 0, 2, 0, 1, 1, 0, 1, - 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, - 1, 1, 1, 2, 1, 2, 1, 0, 1, 1, - 1, 3, 1, 1, 2, 3, 1, 1, 2, 3, - 1, 1, 1, 1, 1, 3, 0, 2, 1, 1, - 4, 1, 1, 5, 3, 3, 1, 2, 3, 1, - 3, 5, 6, 3, 3, 5, 2, 4, 4, 0, - 5, 1, 1, 5, 4, 5, 4, 5, 6, 5, - 4, 5, 4, 3, 6, 4, 5, 3, 3, 3, - 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, - 3, 1, 3, 2, 2, 3, 3, 1, 3, 2, - 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 4, 5, 4, 2, 2, 1, 1, - 1, 1, 5, 2, 1, 2, 3, 1, 2, 1, - 1, 1, 1, 1, 1, 4, 4, 5, 5, 1, - 1, 3, 4, 3, 4, 4, 4, 4, 4, 1, - 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, - 3, 1, 3, 1, 3, 4, 0, 6, 1, 1, - 1, 3, 2, 4, 3, 3, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 2, 3, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 2, 2, 4, 2, 1, 3, 1, 3, 1, - 3, 1, 1, 1, 1 + 0, 3, 0, 3, 0, 3, 1, 1, 4, 0, + 7, 0, 4, 0, 1, 0, 0, 5, 1, 2, + 1, 2, 1, 1, 2, 2, 1, 4, 0, 7, + 0, 6, 0, 4, 4, 5, 0, 7, 7, 7, + 6, 6, 2, 8, 8, 0, 0, 13, 9, 11, + 8, 0, 10, 9, 7, 0, 8, 2, 0, 8, + 0, 9, 2, 2, 2, 2, 1, 2, 1, 3, + 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, + 2, 6, 1, 2, 0, 2, 0, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 2, 1, 2, 1, 0, + 1, 1, 1, 3, 1, 1, 2, 3, 1, 1, + 2, 3, 1, 1, 1, 1, 1, 3, 0, 2, + 1, 1, 4, 1, 1, 5, 3, 3, 3, 3, + 1, 2, 3, 1, 3, 5, 6, 3, 3, 5, + 2, 4, 4, 0, 5, 1, 1, 5, 4, 5, + 4, 5, 6, 5, 4, 5, 4, 3, 6, 4, + 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 1, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 1, 3, 2, 2, 3, 3, 3, + 1, 3, 2, 2, 3, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 3, 4, 5, 4, 4, + 2, 2, 1, 1, 1, 1, 5, 2, 1, 2, + 3, 1, 2, 1, 1, 1, 1, 1, 1, 4, + 4, 5, 5, 1, 1, 3, 4, 3, 4, 4, + 4, 4, 4, 1, 2, 2, 1, 2, 2, 1, + 2, 1, 2, 1, 3, 1, 3, 1, 3, 4, + 0, 6, 1, 1, 1, 3, 2, 4, 3, 3, + 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, + 3, 0, 6, 1, 1, 1, 1, 1, 2, 1, + 2, 3, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 1, 3, + 1, 3, 1, 3, 1, 1, 1, 1 }; typedef enum { - toketype_ival, toketype_opval + toketype_ival, toketype_opval, toketype_pval } toketypes; /* type of each token/terminal */ static const toketypes yy_type_tab[] = { - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_opval, - toketype_ival, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, - toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_opval, + toketype_ival, toketype_opval, toketype_ival, toketype_opval, toketype_ival, toketype_ival, + toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_ival, + toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_ival, toketype_ival, toketype_ival, toketype_ival, toketype_opval, + toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_ival, toketype_opval, toketype_opval, toketype_opval, + toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, + toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, - toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_pval, + toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_opval + toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval }; /* Generated from: - * 0caf1eb1cc4750131dc71e3a22ead383ed9a123dec61ccd23408ff13441fafde perly.y + * 0a5fcd15cf0b7afb57ade6ceaf68037a38dd194acd9d60d3e4ad99c15233af75 perly.y * acf1cbfd2545faeaaa58b1cf0cf9d7f98b5be0752eb7a54528ef904a9e2e1ca7 regen_perly.pl - * ex: set ro: */ + * ex: set ro ft=c: */ Index: gnu/usr.bin/perl/perly.y =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/perly.y,v diff -u -p -a -u -p -r1.21 perly.y --- gnu/usr.bin/perl/perly.y 15 Feb 2023 01:36:13 -0000 1.21 +++ gnu/usr.bin/perl/perly.y 21 Feb 2024 15:47:02 -0000 @@ -38,13 +38,14 @@ %union { I32 ival; /* __DEFAULT__ (marker for regen_perly.pl; must always be 1st union member) */ - char *pval; + void *pval; OP *opval; GV *gvval; } %token GRAMPROG GRAMEXPR GRAMBLOCK GRAMBARESTMT GRAMFULLSTMT GRAMSTMTSEQ GRAMSUBSIGNATURE +/* Tokens emitted by toke.c for simple punctiation characters - &, {, }, etc... */ %token PERLY_AMPERSAND %token PERLY_BRACE_OPEN %token PERLY_BRACE_CLOSE @@ -62,38 +63,55 @@ %token PERLY_SNAIL %token PERLY_STAR -%token BAREWORD METHOD FUNCMETH THING PMFUNC PRIVATEREF QWLIST +/* Tokens emitted by toke.c on simple keywords */ +%token KW_FORMAT KW_PACKAGE KW_CLASS +%token KW_LOCAL KW_MY KW_FIELD +%token KW_IF KW_ELSE KW_ELSIF KW_UNLESS +%token KW_FOR KW_UNTIL KW_WHILE KW_CONTINUE +%token KW_GIVEN KW_WHEN KW_DEFAULT +%token KW_TRY KW_CATCH KW_FINALLY KW_DEFER +%token KW_REQUIRE KW_DO + +/* The 'use' and 'no' keywords both emit this */ +%token KW_USE_or_NO + +/* The 'sub' keyword is a bit special; four different tokens depending on + * named-vs-anon, and whether signatures are in effect */ +%token KW_SUB_named KW_SUB_named_sig KW_SUB_anon KW_SUB_anon_sig +%token KW_METHOD_named KW_METHOD_anon + +/* Tokens emitted in other situations */ +%token BAREWORD METHCALL0 METHCALL THING PMFUNC PRIVATEREF QWLIST %token FUNC0OP FUNC0SUB UNIOPSUB LSTOPSUB %token PLUGEXPR PLUGSTMT %token LABEL -%token FORMAT SUB SIGSUB ANONSUB ANON_SIGSUB PACKAGE USE -%token WHILE UNTIL IF UNLESS ELSE ELSIF CONTINUE FOR -%token GIVEN WHEN DEFAULT -%token TRY CATCH FINALLY %token LOOPEX DOTDOT YADAYADA %token FUNC0 FUNC1 FUNC UNIOP LSTOP -%token MULOP ADDOP -%token DOLSHARP DO HASHBRACK NOAMP -%token LOCAL MY REQUIRE +%token POWOP MULOP ADDOP +%token DOLSHARP HASHBRACK NOAMP %token COLONATTR FORMLBRACK FORMRBRACK %token SUBLEXSTART SUBLEXEND -%token DEFER +%token PHASER %type grammar remember mremember -%type startsub startanonsub startformsub +%type startsub startanonsub startanonmethod startformsub %type mintro +%type sigsub_or_method_named %type stmtseq fullstmt labfullstmt barestmt block mblock else finally %type expr term subscripted scalar ary hsh arylen star amper sideff %type condition +%type catch_paren %type empty %type sliceme kvslice gelem %type listexpr nexpr texpr iexpr mexpr mnexpr -%type optlistexpr optexpr optrepl indirob listop method +%type optlistexpr optexpr optrepl indirob listop methodname %type formname subname proto cont my_scalar my_var %type list_of_scalars my_list_of_scalars refgen_topic formblock %type subattrlist myattrlist myattrterm myterm +%type fieldvar /* pval is PADNAME */ +%type optfieldattrlist fielddecl %type termbinop termunop anonymous termdo %type termrelop relopchain termeqop eqopchain %type sigslurpsigil @@ -105,29 +123,32 @@ %nonassoc PREC_LOW %nonassoc LOOPEX -%left OROP -%left ANDOP +%nonassoc PLUGIN_LOW_OP +%left OROP PLUGIN_LOGICAL_OR_LOW_OP +%left ANDOP PLUGIN_LOGICAL_AND_LOW_OP %right NOTOP %nonassoc LSTOP LSTOPSUB %left PERLY_COMMA -%right ASSIGNOP +%right ASSIGNOP PLUGIN_ASSIGN_OP %right PERLY_QUESTION_MARK PERLY_COLON %nonassoc DOTDOT -%left OROR DORDOR -%left ANDAND +%left OROR DORDOR PLUGIN_LOGICAL_OR_OP +%left ANDAND PLUGIN_LOGICAL_AND_OP %left BITOROP %left BITANDOP %left CHEQOP NCEQOP %left CHRELOP NCRELOP +%nonassoc PLUGIN_REL_OP %nonassoc UNIOP UNIOPSUB -%nonassoc REQUIRE +%nonassoc KW_REQUIRE %left SHIFTOP -%left ADDOP -%left MULOP +%left ADDOP PLUGIN_ADD_OP +%left MULOP PLUGIN_MUL_OP %left MATCHOP %right PERLY_EXCLAMATION_MARK PERLY_TILDE UMINUS REFGEN -%right POWOP +%right POWOP PLUGIN_POW_OP %nonassoc PREINC PREDEC POSTINC POSTDEC POSTJOIN +%nonassoc PLUGIN_HIGH_OP %left ARROW %nonassoc PERLY_PAREN_CLOSE %left PERLY_PAREN_OPEN @@ -218,6 +239,14 @@ grammar : GRAMPROG } ; +/* Either a signatured 'sub' or 'method' keyword */ +sigsub_or_method_named + : KW_SUB_named_sig + { $$ = KW_SUB_named_sig; } + | KW_METHOD_named + { $$ = KW_METHOD_named; } + ; + /* An ordinary block */ block : PERLY_BRACE_OPEN remember stmtseq PERLY_BRACE_CLOSE { if (parser->copline > (line_t)$PERLY_BRACE_OPEN) @@ -255,6 +284,18 @@ mremember: %empty /* start a partial lex parser->parsed_sub = 0; } ; +/* The parenthesized variable of a catch block */ +catch_paren: empty + /* not really valid grammar but we detect it in the + * action block to throw a nicer error message */ + | PERLY_PAREN_OPEN + { parser->in_my = 1; } + scalar + { parser->in_my = 0; intro_my(); } + PERLY_PAREN_CLOSE + { $$ = $scalar; } + ; + /* A sequence of statements in the program */ stmtseq : empty @@ -305,7 +346,7 @@ labfullstmt: LABEL barestmt /* A bare statement, lacking label and other aspects of state op */ barestmt: PLUGSTMT { $$ = $PLUGSTMT; } - | FORMAT startformsub formname formblock + | KW_FORMAT startformsub formname formblock { CV *fmtcv = PL_compcv; newFORM($startformsub, $formname, $formblock); @@ -315,7 +356,7 @@ barestmt: PLUGSTMT } parser->parsed_sub = 1; } - | SUB subname startsub + | KW_SUB_named subname startsub /* sub declaration or definition not within scope of 'use feature "signatures"'*/ { @@ -334,79 +375,128 @@ barestmt: PLUGSTMT intro_my(); parser->parsed_sub = 1; } - | SIGSUB subname startsub + | sigsub_or_method_named subname startsub /* sub declaration or definition under 'use feature * "signatures"'. (Note that a signature isn't * allowed in a declaration) */ { init_named_cv(PL_compcv, $subname); + if($sigsub_or_method_named == KW_METHOD_named) { + croak_kw_unless_class("method"); + class_prepare_method_parse(PL_compcv); + } parser->in_my = 0; parser->in_my_stash = NULL; } subattrlist optsigsubbody { + OP *body = $optsigsubbody; + SvREFCNT_inc_simple_void(PL_compcv); $subname->op_type == OP_CONST - ? newATTRSUB($startsub, $subname, NULL, $subattrlist, $optsigsubbody) - : newMYSUB( $startsub, $subname, NULL, $subattrlist, $optsigsubbody) + ? newATTRSUB($startsub, $subname, NULL, $subattrlist, body) + : newMYSUB( $startsub, $subname, NULL, $subattrlist, body) ; $$ = NULL; intro_my(); parser->parsed_sub = 1; } - | PACKAGE BAREWORD[version] BAREWORD[package] PERLY_SEMICOLON + | PHASER startsub + { + switch($PHASER) { + case KEY_ADJUST: + croak_kw_unless_class("ADJUST"); + class_prepare_method_parse(PL_compcv); + break; + default: + NOT_REACHED; + } + } + optsubbody + { + OP *body = $optsubbody; + SvREFCNT_inc_simple_void(PL_compcv); + + CV *cv; + + switch($PHASER) { + case KEY_ADJUST: + cv = newATTRSUB($startsub, NULL, NULL, NULL, body); + class_add_ADJUST(PL_curstash, cv); + break; + } + $$ = NULL; + } + | KW_PACKAGE BAREWORD[version] BAREWORD[package] PERLY_SEMICOLON + /* version and package appear in the reverse order to what may be + * expected, because toke.c has already pushed both of them to a stack + * by calling force_next() from within force_version(). + * When the parser pops them back out again they appear swapped */ + { + package($package); + if ($version) + package_version($version); + $$ = NULL; + } + | KW_CLASS BAREWORD[version] BAREWORD[package] subattrlist PERLY_SEMICOLON { package($package); if ($version) package_version($version); $$ = NULL; + class_setup_stash(PL_curstash); + if ($subattrlist) { + class_apply_attributes(PL_curstash, $subattrlist); + } } - | USE startsub + | KW_USE_or_NO startsub { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ } BAREWORD[version] BAREWORD[module] optlistexpr PERLY_SEMICOLON + /* version and package appear in reverse order for the same reason as + * KW_PACKAGE; see comment above */ { SvREFCNT_inc_simple_void(PL_compcv); - utilize($USE, $startsub, $version, $module, $optlistexpr); + utilize($KW_USE_or_NO, $startsub, $version, $module, $optlistexpr); parser->parsed_sub = 1; $$ = NULL; } - | IF PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else + | KW_IF PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else { $$ = block_end($remember, newCONDOP(0, $mexpr, op_scope($mblock), $else)); - parser->copline = (line_t)$IF; + parser->copline = (line_t)$KW_IF; } - | UNLESS PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else + | KW_UNLESS PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock else { $$ = block_end($remember, newCONDOP(0, $mexpr, $else, op_scope($mblock))); - parser->copline = (line_t)$UNLESS; + parser->copline = (line_t)$KW_UNLESS; } - | GIVEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock + | KW_GIVEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock { $$ = block_end($remember, newGIVENOP($mexpr, op_scope($mblock), 0)); - parser->copline = (line_t)$GIVEN; + parser->copline = (line_t)$KW_GIVEN; } - | WHEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock + | KW_WHEN PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock { $$ = block_end($remember, newWHENOP($mexpr, op_scope($mblock))); } - | DEFAULT block + | KW_DEFAULT block { $$ = newWHENOP(0, op_scope($block)); } - | WHILE PERLY_PAREN_OPEN remember texpr PERLY_PAREN_CLOSE mintro mblock cont + | KW_WHILE PERLY_PAREN_OPEN remember texpr PERLY_PAREN_CLOSE mintro mblock cont { $$ = block_end($remember, newWHILEOP(0, 1, NULL, $texpr, $mblock, $cont, $mintro)); - parser->copline = (line_t)$WHILE; + parser->copline = (line_t)$KW_WHILE; } - | UNTIL PERLY_PAREN_OPEN remember iexpr PERLY_PAREN_CLOSE mintro mblock cont + | KW_UNTIL PERLY_PAREN_OPEN remember iexpr PERLY_PAREN_CLOSE mintro mblock cont { $$ = block_end($remember, newWHILEOP(0, 1, NULL, $iexpr, $mblock, $cont, $mintro)); - parser->copline = (line_t)$UNTIL; + parser->copline = (line_t)$KW_UNTIL; } - | FOR PERLY_PAREN_OPEN remember mnexpr[init_mnexpr] PERLY_SEMICOLON + | KW_FOR PERLY_PAREN_OPEN remember mnexpr[init_mnexpr] PERLY_SEMICOLON { parser->expect = XTERM; } texpr PERLY_SEMICOLON { parser->expect = XTERM; } @@ -424,29 +514,29 @@ barestmt: PLUGSTMT } PL_hints |= HINT_BLOCK_SCOPE; $$ = block_end($remember, forop); - parser->copline = (line_t)$FOR; + parser->copline = (line_t)$KW_FOR; } - | FOR MY remember my_scalar PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont + | KW_FOR KW_MY remember my_scalar PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont { $$ = block_end($remember, newFOROP(0, $my_scalar, $mexpr, $mblock, $cont)); - parser->copline = (line_t)$FOR; + parser->copline = (line_t)$KW_FOR; } - | FOR MY remember PERLY_PAREN_OPEN my_list_of_scalars PERLY_PAREN_CLOSE PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont + | KW_FOR KW_MY remember PERLY_PAREN_OPEN my_list_of_scalars PERLY_PAREN_CLOSE PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont { if ($my_list_of_scalars->op_type == OP_PADSV) /* degenerate case of 1 var: for my ($x) .... Flag it so it can be special-cased in newFOROP */ $my_list_of_scalars->op_flags |= OPf_PARENS; $$ = block_end($remember, newFOROP(0, $my_list_of_scalars, $mexpr, $mblock, $cont)); - parser->copline = (line_t)$FOR; + parser->copline = (line_t)$KW_FOR; } - | FOR scalar PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont + | KW_FOR scalar PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont { $$ = block_end($remember, newFOROP(0, op_lvalue($scalar, OP_ENTERLOOP), $mexpr, $mblock, $cont)); - parser->copline = (line_t)$FOR; + parser->copline = (line_t)$KW_FOR; } - | FOR my_refgen remember my_var + | KW_FOR my_refgen remember my_var { parser->in_my = 0; $$ = my($my_var); }[variable] PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock cont { @@ -459,33 +549,36 @@ barestmt: PLUGSTMT OP_ENTERLOOP), $mexpr, $mblock, $cont) ); - parser->copline = (line_t)$FOR; + parser->copline = (line_t)$KW_FOR; } - | FOR REFGEN refgen_topic PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont + | KW_FOR REFGEN refgen_topic PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont { $$ = block_end($remember, newFOROP( 0, op_lvalue(newUNOP(OP_REFGEN, 0, $refgen_topic), OP_ENTERLOOP), $mexpr, $mblock, $cont)); - parser->copline = (line_t)$FOR; + parser->copline = (line_t)$KW_FOR; } - | FOR PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont + | KW_FOR PERLY_PAREN_OPEN remember mexpr PERLY_PAREN_CLOSE mblock cont { $$ = block_end($remember, newFOROP(0, NULL, $mexpr, $mblock, $cont)); - parser->copline = (line_t)$FOR; + parser->copline = (line_t)$KW_FOR; } - | TRY mblock[try] CATCH PERLY_PAREN_OPEN - { parser->in_my = 1; } - remember scalar - { parser->in_my = 0; intro_my(); } - PERLY_PAREN_CLOSE mblock[catch] finally + | KW_TRY mblock[try] KW_CATCH remember catch_paren[scalar] + { + if(!$scalar) { + yyerror("catch block requires a (VAR)"); + YYERROR; + } + } + mblock[catch] finally { $$ = newTRYCATCHOP(0, $try, $scalar, block_end($remember, op_scope($catch))); if($finally) $$ = op_wrap_finally($$, $finally); - parser->copline = (line_t)$TRY; + parser->copline = (line_t)$KW_TRY; } | block cont { @@ -493,7 +586,7 @@ barestmt: PLUGSTMT $$ = newWHILEOP(0, 1, NULL, NULL, $block, $cont, 0); } - | PACKAGE BAREWORD[version] BAREWORD[package] PERLY_BRACE_OPEN remember + | KW_PACKAGE BAREWORD[version] BAREWORD[package] PERLY_BRACE_OPEN remember { package($package); if ($version) { @@ -508,16 +601,41 @@ barestmt: PLUGSTMT if (parser->copline > (line_t)$PERLY_BRACE_OPEN) parser->copline = (line_t)$PERLY_BRACE_OPEN; } + | KW_CLASS BAREWORD[version] BAREWORD[package] subattrlist PERLY_BRACE_OPEN remember + { + package($package); + + if ($version) { + package_version($version); + } + class_setup_stash(PL_curstash); + if ($subattrlist) { + class_apply_attributes(PL_curstash, $subattrlist); + } + } + stmtseq PERLY_BRACE_CLOSE + { + /* a block is a loop that happens once */ + $$ = newWHILEOP(0, 1, NULL, + NULL, block_end($remember, $stmtseq), NULL, 0); + if (parser->copline > (line_t)$PERLY_BRACE_OPEN) + parser->copline = (line_t)$PERLY_BRACE_OPEN; + } + | fielddecl PERLY_SEMICOLON + { + $$ = $fielddecl; + } | sideff PERLY_SEMICOLON { $$ = $sideff; } - | DEFER mblock + | KW_DEFER mblock { $$ = newDEFEROP(0, op_scope($2)); } | YADAYADA PERLY_SEMICOLON { + /* diag_listed_as: Unimplemented */ $$ = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), newSVOP(OP_CONST, 0, newSVpvs("Unimplemented"))); } @@ -560,31 +678,31 @@ sideff : error { $$ = NULL; } | expr[body] { $$ = $body; } - | expr[body] IF condition + | expr[body] KW_IF condition { $$ = newLOGOP(OP_AND, 0, $condition, $body); } - | expr[body] UNLESS condition + | expr[body] KW_UNLESS condition { $$ = newLOGOP(OP_OR, 0, $condition, $body); } - | expr[body] WHILE condition + | expr[body] KW_WHILE condition { $$ = newLOOPOP(OPf_PARENS, 1, scalar($condition), $body); } - | expr[body] UNTIL iexpr + | expr[body] KW_UNTIL iexpr { $$ = newLOOPOP(OPf_PARENS, 1, $iexpr, $body); } - | expr[body] FOR condition + | expr[body] KW_FOR condition { $$ = newFOROP(0, NULL, $condition, $body, NULL); - parser->copline = (line_t)$FOR; } - | expr[body] WHEN condition + parser->copline = (line_t)$KW_FOR; } + | expr[body] KW_WHEN condition { $$ = newWHENOP($condition, op_scope($body)); } ; /* else and elsif blocks */ else : empty - | ELSE mblock + | KW_ELSE mblock { ($mblock)->op_flags |= OPf_PARENS; $$ = op_scope($mblock); } - | ELSIF PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock else[else.recurse] - { parser->copline = (line_t)$ELSIF; + | KW_ELSIF PERLY_PAREN_OPEN mexpr PERLY_PAREN_CLOSE mblock else[else.recurse] + { parser->copline = (line_t)$KW_ELSIF; $$ = newCONDOP(0, newSTATEOP(OPf_SPECIAL,NULL,$mexpr), op_scope($mblock), $[else.recurse]); @@ -595,14 +713,14 @@ else /* Continue blocks */ cont : empty - | CONTINUE block + | KW_CONTINUE block { $$ = op_scope($block); } ; /* Finally blocks */ finally : %empty { $$ = NULL; } - | FINALLY block + | KW_FINALLY block { $$ = op_scope($block); } ; @@ -655,6 +773,11 @@ startanonsub: %empty /* start an anonymo SAVEFREESV(PL_compcv); } ; +startanonmethod: %empty /* start an anonymous method scope */ + { $$ = start_subparse(FALSE, CVf_ANON|CVf_IsMETHOD); + SAVEFREESV(PL_compcv); } + ; + startformsub: %empty /* start a format subroutine scope */ { $$ = start_subparse(TRUE, 0); SAVEFREESV(PL_compcv); } @@ -675,7 +798,12 @@ proto subattrlist : empty | COLONATTR THING - { $$ = $THING; } + { + OP *attrlist = $THING; + if(attrlist && !PL_parser->sig_seen) + attrlist = apply_builtin_cv_attributes(PL_compcv, attrlist); + $$ = attrlist; + } | COLONATTR { $$ = NULL; } ; @@ -709,15 +837,15 @@ sigslurpsigil: /* @, %, @foo, %foo */ sigslurpelem: sigslurpsigil sigvarname sigdefault/* def only to catch errors */ { - I32 sigil = $sigslurpsigil; - OP *var = $sigvarname; - OP *defexpr = $sigdefault; + I32 sigil = $sigslurpsigil; + OP *var = $sigvarname; + OP *defop = $sigdefault; if (parser->sig_slurpy) yyerror("Multiple slurpy parameters not allowed"); parser->sig_slurpy = (char)sigil; - if (defexpr) + if (defop) yyerror("A slurpy parameter may not have " "a default value"); @@ -729,26 +857,35 @@ sigslurpelem: sigslurpsigil sigvarname s sigdefault : empty | ASSIGNOP - { $$ = newOP(OP_NULL, 0); } + { $$ = newARGDEFELEMOP(0, newOP(OP_NULL, 0), parser->sig_elems); } | ASSIGNOP term - { $$ = $term; } + { + I32 flags = 0; + if ($ASSIGNOP == OP_DORASSIGN) + flags |= OPpARG_IF_UNDEF << 8; + if ($ASSIGNOP == OP_ORASSIGN) + flags |= OPpARG_IF_FALSE << 8; + $$ = newARGDEFELEMOP(flags, $term, parser->sig_elems); + } /* subroutine signature scalar element: e.g. '$x', '$=', '$x = $default' */ sigscalarelem: PERLY_DOLLAR sigvarname sigdefault { - OP *var = $sigvarname; - OP *defexpr = $sigdefault; + OP *var = $sigvarname; + OP *defop = $sigdefault; if (parser->sig_slurpy) yyerror("Slurpy parameter not last"); parser->sig_elems++; - if (defexpr) { + if (defop) { parser->sig_optelems++; + OP *defexpr = cLOGOPx(defop)->op_first; + if ( defexpr->op_type == OP_NULL && !(defexpr->op_flags & OPf_KIDS)) { @@ -756,17 +893,10 @@ sigscalarelem: if (var) yyerror("Optional parameter " "lacks default expression"); - op_free(defexpr); + op_free(defop); } else { /* a normal '=default' expression */ - OP *defop = (OP*)alloc_LOGOP(OP_ARGDEFELEM, - defexpr, - LINKLIST(defexpr)); - /* re-purpose op_targ to hold @_ index */ - defop->op_targ = - (PADOFFSET)(parser->sig_elems - 1); - if (var) { var->op_flags |= OPf_STACKED; (void)op_sibling_splice(var, @@ -852,7 +982,7 @@ subsigguts: struct op_argcheck_aux *aux; OP *check; - if (!FEATURE_SIGNATURES_IS_ENABLED) + if (!FEATURE_SIGNATURES_IS_ENABLED && !CvIsMETHOD(PL_compcv)) Perl_croak(aTHX_ "Experimental " "subroutine signatures not enabled"); @@ -939,8 +1069,12 @@ sigsubbody: remember optsubsignature PER /* Ordinary expressions; logical combinations */ expr : expr[lhs] ANDOP expr[rhs] { $$ = newLOGOP(OP_AND, 0, $lhs, $rhs); } + | expr[lhs] PLUGIN_LOGICAL_AND_LOW_OP[op] expr[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } | expr[lhs] OROP[operator] expr[rhs] { $$ = newLOGOP($operator, 0, $lhs, $rhs); } + | expr[lhs] PLUGIN_LOGICAL_OR_LOW_OP[op] expr[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } | listexpr %prec PREC_LOW ; @@ -964,28 +1098,28 @@ listop : LSTOP indirob listexpr /* map { { $$ = op_convert_list($FUNC, OPf_STACKED, op_prepend_elem(OP_LIST, newGVREF($FUNC,$indirob), $expr) ); } - | term ARROW method PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE /* $foo->bar(list) */ + | term ARROW methodname PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE /* $foo->bar(list) */ { $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, scalar($term), $optexpr), - newMETHOP(OP_METHOD, 0, $method))); + newMETHOP(OP_METHOD, 0, $methodname))); } - | term ARROW method /* $foo->bar */ + | term ARROW methodname /* $foo->bar */ { $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, scalar($term), - newMETHOP(OP_METHOD, 0, $method))); + newMETHOP(OP_METHOD, 0, $methodname))); } - | METHOD indirob optlistexpr /* new Class @args */ + | METHCALL0 indirob optlistexpr /* new Class @args */ { $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, $indirob, $optlistexpr), - newMETHOP(OP_METHOD, 0, $METHOD))); + newMETHOP(OP_METHOD, 0, $METHCALL0))); } - | FUNCMETH indirob PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE /* method $object (@args) */ + | METHCALL indirob PERLY_PAREN_OPEN optexpr PERLY_PAREN_CLOSE /* method $object (@args) */ { $$ = op_convert_list(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, $indirob, $optexpr), - newMETHOP(OP_METHOD, 0, $FUNCMETH))); + newMETHOP(OP_METHOD, 0, $METHCALL))); } | LSTOP optlistexpr /* print @args */ { $$ = op_convert_list($LSTOP, 0, $optlistexpr); } @@ -1004,7 +1138,7 @@ listop : LSTOP indirob listexpr /* map { ; /* Names of methods. May use $object->$methodname */ -method : METHOD +methodname: METHCALL0 | scalar ; @@ -1073,17 +1207,27 @@ subscripted: gelem PERLY_BRACE_OPEN e ; /* Binary operators between terms */ -termbinop: term[lhs] ASSIGNOP term[rhs] /* $x = $y, $x += $y */ +termbinop: term[lhs] PLUGIN_HIGH_OP[op] term[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } + | term[lhs] ASSIGNOP term[rhs] /* $x = $y, $x += $y */ { $$ = newASSIGNOP(OPf_STACKED, $lhs, $ASSIGNOP, $rhs); } + | term[lhs] PLUGIN_ASSIGN_OP[op] term[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } | term[lhs] POWOP term[rhs] /* $x ** $y */ { $$ = newBINOP($POWOP, 0, scalar($lhs), scalar($rhs)); } + | term[lhs] PLUGIN_POW_OP[op] term[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } | term[lhs] MULOP term[rhs] /* $x * $y, $x x $y */ { if ($MULOP != OP_REPEAT) scalar($lhs); $$ = newBINOP($MULOP, 0, $lhs, scalar($rhs)); } + | term[lhs] PLUGIN_MUL_OP[op] term[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } | term[lhs] ADDOP term[rhs] /* $x + $y */ { $$ = newBINOP($ADDOP, 0, scalar($lhs), scalar($rhs)); } + | term[lhs] PLUGIN_ADD_OP[op] term[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } | term[lhs] SHIFTOP term[rhs] /* $x >> $y, $x << $y */ { $$ = newBINOP($SHIFTOP, 0, scalar($lhs), scalar($rhs)); } | termrelop %prec PREC_LOW /* $x > $y, etc. */ @@ -1098,12 +1242,18 @@ termbinop: term[lhs] ASSIGNOP term[rhs] { $$ = newRANGE($DOTDOT, scalar($lhs), scalar($rhs)); } | term[lhs] ANDAND term[rhs] /* $x && $y */ { $$ = newLOGOP(OP_AND, 0, $lhs, $rhs); } + | term[lhs] PLUGIN_LOGICAL_AND_OP[op] term[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } | term[lhs] OROR term[rhs] /* $x || $y */ { $$ = newLOGOP(OP_OR, 0, $lhs, $rhs); } + | term[lhs] PLUGIN_LOGICAL_OR_OP[op] term[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } | term[lhs] DORDOR term[rhs] /* $x // $y */ { $$ = newLOGOP(OP_DOR, 0, $lhs, $rhs); } | term[lhs] MATCHOP term[rhs] /* $x =~ /$y/ */ { $$ = bind_match($MATCHOP, $lhs, $rhs); } + | term[lhs] PLUGIN_LOW_OP[op] term[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } ; termrelop: relopchain %prec PREC_LOW @@ -1114,6 +1264,8 @@ termrelop: relopchain %prec PREC_LOW { yyerror("syntax error"); YYERROR; } | termrelop CHRELOP { yyerror("syntax error"); YYERROR; } + | term[lhs] PLUGIN_REL_OP[op] term[rhs] + { $$ = build_infix_plugin($lhs, $rhs, $op); } ; relopchain: term[lhs] CHRELOP term[rhs] @@ -1180,18 +1332,23 @@ anonymous { $$ = newANONLIST($optexpr); } | HASHBRACK optexpr PERLY_SEMICOLON PERLY_BRACE_CLOSE %prec PERLY_PAREN_OPEN /* { foo => "Bar" } */ { $$ = newANONHASH($optexpr); } - | ANONSUB startanonsub proto subattrlist subbody %prec PERLY_PAREN_OPEN + | KW_SUB_anon startanonsub proto subattrlist subbody %prec PERLY_PAREN_OPEN { SvREFCNT_inc_simple_void(PL_compcv); $$ = newANONATTRSUB($startanonsub, $proto, $subattrlist, $subbody); } - | ANON_SIGSUB startanonsub subattrlist sigsubbody %prec PERLY_PAREN_OPEN + | KW_SUB_anon_sig startanonsub subattrlist sigsubbody %prec PERLY_PAREN_OPEN { SvREFCNT_inc_simple_void(PL_compcv); $$ = newANONATTRSUB($startanonsub, NULL, $subattrlist, $sigsubbody); } + | KW_METHOD_anon startanonmethod subattrlist sigsubbody %prec PERLY_PAREN_OPEN + { + SvREFCNT_inc_simple_void(PL_compcv); + $$ = newANONATTRSUB($startanonmethod, NULL, $subattrlist, $sigsubbody); + } ; /* Things called with "do" */ -termdo : DO term %prec UNIOP /* do $filename */ - { $$ = dofile($term, $DO);} - | DO block %prec PERLY_PAREN_OPEN /* do { code */ +termdo : KW_DO term %prec UNIOP /* do $filename */ + { $$ = dofile($term, $KW_DO);} + | KW_DO block %prec PERLY_PAREN_OPEN /* do { code */ { $$ = newUNOP(OP_NULL, OPf_SPECIAL, op_scope($block));} ; @@ -1205,7 +1362,7 @@ term[product] : termbinop { $$ = newUNOP(OP_REFGEN, 0, $operand); } | myattrterm %prec UNIOP { $$ = $myattrterm; } - | LOCAL term[operand] %prec UNIOP + | KW_LOCAL term[operand] %prec UNIOP { $$ = localize($operand,0); } | PERLY_PAREN_OPEN expr PERLY_PAREN_CLOSE { $$ = sawparens($expr); } @@ -1305,10 +1462,10 @@ term[product] : termbinop { $$ = newUNOP($UNIOP, 0, $block); } | UNIOP term[operand] /* Unary op */ { $$ = newUNOP($UNIOP, 0, $operand); } - | REQUIRE /* require, $_ implied */ - { $$ = newOP(OP_REQUIRE, $REQUIRE ? OPf_SPECIAL : 0); } - | REQUIRE term[operand] /* require Foo */ - { $$ = newUNOP(OP_REQUIRE, $REQUIRE ? OPf_SPECIAL : 0, $operand); } + | KW_REQUIRE /* require, $_ implied */ + { $$ = newOP(OP_REQUIRE, $KW_REQUIRE ? OPf_SPECIAL : 0); } + | KW_REQUIRE term[operand] /* require Foo */ + { $$ = newUNOP(OP_REQUIRE, $KW_REQUIRE ? OPf_SPECIAL : 0, $operand); } | UNIOPSUB { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($UNIOPSUB)); } | UNIOPSUB term[operand] /* Sub treated as unop */ @@ -1350,13 +1507,13 @@ term[product] : termbinop /* "my" declarations, with optional attributes */ myattrterm - : MY myterm myattrlist + : KW_MY myterm myattrlist { $$ = my_attrs($myterm,$myattrlist); } - | MY myterm + | KW_MY myterm { $$ = localize($myterm,1); } - | MY REFGEN myterm myattrlist + | KW_MY REFGEN myterm myattrlist { $$ = newUNOP(OP_REFGEN, 0, my_attrs($myterm,$myattrlist)); } - | MY REFGEN term[operand] + | KW_MY REFGEN term[operand] { $$ = newUNOP(OP_REFGEN, 0, localize($operand,1)); } ; @@ -1374,6 +1531,56 @@ myterm : PERLY_PAREN_OPEN expr PERLY_PAR { $$ = $ary; } ; +/* "field" declarations */ +fieldvar: scalar %prec PERLY_PAREN_OPEN + { + $$ = PadnamelistARRAY(PL_comppad_name)[$scalar->op_targ]; + op_free($scalar); + } + | hsh %prec PERLY_PAREN_OPEN + { + $$ = PadnamelistARRAY(PL_comppad_name)[$hsh->op_targ]; + op_free($hsh); + } + | ary %prec PERLY_PAREN_OPEN + { + $$ = PadnamelistARRAY(PL_comppad_name)[$ary->op_targ]; + op_free($ary); + } + ; + +optfieldattrlist: + COLONATTR THING + { $$ = $THING; } + | COLONATTR + { $$ = NULL; } + | empty + ; + +fielddecl + : KW_FIELD fieldvar optfieldattrlist + { + parser->in_my = 0; + if($optfieldattrlist) + class_apply_field_attributes((PADNAME *)$fieldvar, $optfieldattrlist); + $$ = newOP(OP_NULL, 0); + } + | KW_FIELD fieldvar optfieldattrlist ASSIGNOP + { + parser->in_my = 0; + if($optfieldattrlist) + class_apply_field_attributes((PADNAME *)$fieldvar, $optfieldattrlist); + ENTER; + class_prepare_initfield_parse(); + } + term + { + class_set_field_defop((PADNAME *)$fieldvar, $ASSIGNOP, $term); + LEAVE; + $$ = newOP(OP_NULL, 0); + } + ; + /* Basic list expressions */ optlistexpr : empty %prec PREC_LOW @@ -1419,8 +1626,8 @@ refgen_topic: my_var | amper ; -my_refgen: MY REFGEN - | REFGEN MY +my_refgen: KW_MY REFGEN + | REFGEN KW_MY ; amper : PERLY_AMPERSAND indirob Index: gnu/usr.bin/perl/pp.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/pp.c,v diff -u -p -a -u -p -r1.37 pp.c --- gnu/usr.bin/perl/pp.c 15 Feb 2023 01:38:21 -0000 1.37 +++ gnu/usr.bin/perl/pp.c 21 Feb 2024 15:47:03 -0000 @@ -405,7 +405,15 @@ PP(pp_anoncode) if (CvCLONE(cv)) cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv)))); EXTEND(SP,1); - PUSHs(MUTABLE_SV(cv)); + + SV* sv = MUTABLE_SV(cv); + + if (LIKELY(PL_op->op_flags & OPf_REF)) { + sv = refto(sv); + } + + PUSHs(sv); + RETURN; } @@ -730,7 +738,6 @@ S_do_chomp(pTHX_ SV *retval, SV *sv, boo if (chomping) { if (s && len) { char *temp_buffer = NULL; - SV *svrecode = NULL; s += --len; if (RsPARA(PL_rs)) { if (*s != '\n') @@ -760,10 +767,10 @@ S_do_chomp(pTHX_ SV *retval, SV *sv, boo if (is_utf8) { /* Cannot downgrade, therefore cannot possibly match. At this point, temp_buffer is not alloced, and - is the buffer inside PL_rs, so dont free it. + is the buffer inside PL_rs, so don't free it. */ assert (temp_buffer == rsptr); - goto nope_free_sv; + goto nope_free_nothing; } rsptr = temp_buffer; } @@ -796,8 +803,6 @@ S_do_chomp(pTHX_ SV *retval, SV *sv, boo nope_free_all: Safefree(temp_buffer); - nope_free_sv: - SvREFCNT_dec(svrecode); nope_free_nothing: ; } } else { @@ -879,11 +884,21 @@ PP(pp_undef) RETPUSHUNDEF; } - sv = TOPs; - if (!sv) - { - SETs(&PL_sv_undef); - return NORMAL; + if (PL_op->op_private & OPpTARGET_MY) { + SV** const padentry = &PAD_SVl(PL_op->op_targ); + sv = *padentry; + EXTEND(SP,1);sp++;PUTBACK; + if ((PL_op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)) == OPpLVAL_INTRO) { + save_clearsv(padentry); + } + } else { + sv = TOPs; + + if (!sv) + { + SETs(&PL_sv_undef); + return NORMAL; + } } if (SvTHINKFIRST(sv)) @@ -904,11 +919,11 @@ PP(pp_undef) "Constant subroutine %" SVf " undefined", SVfARG(CvANON((const CV *)sv) ? newSVpvs_flags("(anonymous)", SVs_TEMP) - : sv_2mortal(newSVhek( + : newSVhek_mortal( CvNAMED(sv) ? CvNAME_HEK((CV *)sv) : GvENAME_HEK(CvGV((const CV *)sv)) - )) + ) )); /* FALLTHROUGH */ case SVt_PVFM: @@ -925,7 +940,7 @@ PP(pp_undef) /* undef *Pkg::meth_name ... */ bool method_changed = GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv)) - && HvENAME_get(stash); + && HvHasENAME(stash); /* undef *Foo:: */ if((stash = GvHV((const GV *)sv))) { if(HvENAME_get(stash)) @@ -950,7 +965,7 @@ PP(pp_undef) /* undef *Foo::ISA */ if( strEQ(GvNAME((const GV *)sv), "ISA") && (stash = GvSTASH((const GV *)sv)) - && (method_changed || HvENAME(stash)) ) + && (method_changed || HvHasENAME(stash)) ) mro_isa_changed_in(stash); else if(method_changed) mro_method_changed_in( @@ -960,7 +975,9 @@ PP(pp_undef) break; } default: - if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv)) { + if (SvTYPE(sv) >= SVt_PV && SvPVX_const(sv) && SvLEN(sv) + && !(PL_op->op_private & OPpUNDEF_KEEP_PV) + ) { SvPV_free(sv); SvPV_set(sv, NULL); SvLEN_set(sv, 0); @@ -969,7 +986,11 @@ PP(pp_undef) SvSETMAGIC(sv); } - SETs(&PL_sv_undef); + + if (PL_op->op_private & OPpTARGET_MY) + SETs(sv); + else + SETs(&PL_sv_undef); return NORMAL; } @@ -1206,6 +1227,20 @@ PP(pp_pow) } else { SETn( Perl_pow( left, right) ); } +#elif IVSIZE == 4 && defined(LONGDOUBLE_DOUBLEDOUBLE) && defined(USE_LONG_DOUBLE) + /* + Under these conditions, if a known libm bug exists, Perl_pow() could return + an incorrect value if the correct value is an integer in the range of around + 25 or more bits. The error is always quite small, so we work around it by + rounding to the nearest integer value ... but only if is_int is true. + See https://github.com/Perl/perl5/issues/19625. + */ + + if (is_int) { + SETn( roundl( Perl_pow( left, right) ) ); + } + else SETn( Perl_pow( left, right) ); + #else SETn( Perl_pow( left, right) ); #endif /* HAS_AIX_POWL_NEG_BASE_BUG */ @@ -2662,7 +2697,7 @@ PP(pp_i_multiply) tryAMAGICbin_MG(mult_amg, AMGf_assign); { dPOPTOPiirl_nomg; - SETi( left * right ); + SETi( (IV)((UV)left * (UV)right) ); RETURN; } } @@ -2681,7 +2716,7 @@ PP(pp_i_divide) /* avoid FPE_INTOVF on some platforms when num is IV_MIN */ if (value == -1) - value = - num; + value = (IV)-(UV)num; else value = num / value; SETi(value); @@ -2712,7 +2747,7 @@ PP(pp_i_add) tryAMAGICbin_MG(add_amg, AMGf_assign); { dPOPTOPiirl_ul_nomg; - SETi( left + right ); + SETi( (IV)((UV)left + (UV)right) ); RETURN; } } @@ -2723,7 +2758,7 @@ PP(pp_i_subtract) tryAMAGICbin_MG(subtr_amg, AMGf_assign); { dPOPTOPiirl_ul_nomg; - SETi( left - right ); + SETi( (IV)((UV)left - (UV)right) ); RETURN; } } @@ -2821,7 +2856,7 @@ PP(pp_i_negate) { SV * const sv = TOPs; IV const i = SvIV_nomg(sv); - SETi(-i); + SETi((IV)-(UV)i); return NORMAL; } } @@ -2873,10 +2908,16 @@ PP(pp_sin) #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan) ! Perl_isnan(value) && #endif - (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0))) { + (op_type == OP_LOG ? (value <= 0.0) : (value < 0.0))) + { + char * mesg; + LC_NUMERIC_LOCK(0); SET_NUMERIC_STANDARD(); + mesg = Perl_form(aTHX_ "Can't take %s of %" NVgf, neg_report, value); + LC_NUMERIC_UNLOCK; + /* diag_listed_as: Can't take log of %g */ - DIE(aTHX_ "Can't take %s of %" NVgf, neg_report, value); + DIE(aTHX_ "%s", mesg); } } switch (op_type) { @@ -2906,7 +2947,18 @@ PP(pp_sin) PP(pp_rand) { if (!PL_srand_called) { - (void)seedDrand01((Rand_seed_t)seed()); + Rand_seed_t s; + if (PL_srand_override) { + /* env var PERL_RAND_SEED has been set so the user wants + * consistent srand() initialization. */ + PERL_SRAND_OVERRIDE_GET(s); + (void)srand48_deterministic((Rand_seed_t)s); + } else { + /* Pseudo random initialization from context state and possible + * random devices */ + s= (Rand_seed_t)seed(); + (void)seedDrand01(s); + } PL_srand_called = TRUE; } { @@ -2966,8 +3018,15 @@ PP(pp_srand) (void)srand48_deterministic((Rand_seed_t)anum); } else { - anum = seed(); - (void)seedDrand01((Rand_seed_t)anum); + if (PL_srand_override) { + /* env var PERL_RAND_SEED has been set so the user wants + * consistent srand() initialization. */ + PERL_SRAND_OVERRIDE_GET(anum); + (void)srand48_deterministic((Rand_seed_t)anum); + } else { + anum = seed(); + (void)seedDrand01((Rand_seed_t)anum); + } } PL_srand_called = TRUE; @@ -3086,7 +3145,7 @@ PP(pp_oct) SV* const tsv = sv_2mortal(newSVsv(sv)); SvUTF8_on(tsv); - sv_utf8_downgrade(tsv, FALSE); + (void)sv_utf8_downgrade(tsv, FALSE); tmps = SvPV_const(tsv, len); } if (PL_op->op_type == OP_HEX) @@ -3184,7 +3243,7 @@ PP(pp_length) SvSETMAGIC(TARG); } else - /* TARG is on stack at this point and is overwriten by SETs. + /* TARG is on stack at this point and is overwritten by SETs. * This branch is the odd one out, so put TARG by default on * stack earlier to let local SP go out of liveness sooner */ SETs(&PL_sv_undef); @@ -3676,7 +3735,7 @@ PP(pp_crypt) * Yes, we made this up. */ SV* const tsv = newSVpvn_flags(tmps, len, SVf_UTF8|SVs_TEMP); - sv_utf8_downgrade(tsv, FALSE); + (void)sv_utf8_downgrade(tsv, FALSE); tmps = SvPV_const(tsv, len); } # ifdef USE_ITHREADS @@ -3749,7 +3808,7 @@ PP(pp_ucfirst) #ifdef USE_LOCALE_CTYPE if (IN_LC_RUNTIME(LC_CTYPE)) { - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; } #endif @@ -3787,7 +3846,7 @@ PP(pp_ucfirst) * call to lowercase above has handled this. But SpecialCasing.txt * says we are supposed to remove the COMBINING DOT ABOVE. We can * tell if we have this situation if I ==> i in a turkic locale. */ - if ( UNLIKELY(PL_in_utf8_turkic_locale) + if ( UNLIKELY(IN_UTF8_TURKIC_LOCALE) && IN_LC_RUNTIME(LC_CTYPE) && (UNLIKELY(*s == 'I' && tmpbuf[0] == 'i'))) { @@ -3831,7 +3890,7 @@ PP(pp_ucfirst) #ifdef USE_LOCALE_CTYPE if (IN_LC_RUNTIME(LC_CTYPE)) { - if ( UNLIKELY(PL_in_utf8_turkic_locale) + if ( UNLIKELY(IN_UTF8_TURKIC_LOCALE) && ( (op_type == OP_LCFIRST && UNLIKELY(*s == 'I')) || (op_type == OP_UCFIRST && UNLIKELY(*s == 'i')))) { @@ -4115,7 +4174,7 @@ PP(pp_uc) #ifdef USE_LOCALE_CTYPE if (IN_LC_RUNTIME(LC_CTYPE)) { - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; } #endif @@ -4233,7 +4292,7 @@ PP(pp_uc) #ifdef USE_LOCALE_CTYPE - && (LIKELY( ! PL_in_utf8_turkic_locale + && (LIKELY( ! IN_UTF8_TURKIC_LOCALE || ! IN_LC_RUNTIME(LC_CTYPE)) || *s != 'i') #endif @@ -4339,7 +4398,7 @@ PP(pp_uc) * its own loop */ #ifdef USE_LOCALE_CTYPE - if ( UNLIKELY(PL_in_utf8_turkic_locale) + if ( UNLIKELY(IN_UTF8_TURKIC_LOCALE) && UNLIKELY(IN_LC_RUNTIME(LC_CTYPE))) { for (; s < send; s++) { @@ -4405,7 +4464,7 @@ PP(pp_lc) #ifdef USE_LOCALE_CTYPE && ( LIKELY(! IN_LC_RUNTIME(LC_CTYPE)) - || LIKELY(! PL_in_utf8_turkic_locale)) + || LIKELY(! IN_UTF8_TURKIC_LOCALE)) #endif @@ -4437,11 +4496,11 @@ PP(pp_lc) if (IN_LC_RUNTIME(LC_CTYPE)) { const U8 * next_I; - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; /* Lowercasing in a Turkic locale can cause non-UTF-8 to need to become * UTF-8 for the single case of the character 'I' */ - if ( UNLIKELY(PL_in_utf8_turkic_locale) + if ( UNLIKELY(IN_UTF8_TURKIC_LOCALE) && ! DO_UTF8(source) && (next_I = (U8 *) memchr(s, 'I', len))) { @@ -4498,7 +4557,7 @@ PP(pp_lc) * and if so, do it. We know that there is a DOT because * _toLOWER_utf8_flags() wouldn't have returned 'i' unless there * was one in a proper position. */ - if ( UNLIKELY(PL_in_utf8_turkic_locale) + if ( UNLIKELY(IN_UTF8_TURKIC_LOCALE) && IN_LC_RUNTIME(LC_CTYPE)) { if ( UNLIKELY(remove_dot_above) @@ -4736,7 +4795,7 @@ PP(pp_fc) #ifdef USE_LOCALE_CTYPE if ( IN_LC_RUNTIME(LC_CTYPE) ) { /* Under locale */ - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; } #endif @@ -4790,7 +4849,7 @@ PP(pp_fc) for (; s < send; d++, s++) { if ( UNLIKELY(*s == MICRO_SIGN) #ifdef USE_LOCALE_CTYPE - || ( UNLIKELY(PL_in_utf8_turkic_locale) + || ( UNLIKELY(IN_UTF8_TURKIC_LOCALE) && UNLIKELY(IN_LC_RUNTIME(LC_CTYPE)) && UNLIKELY(*s == 'I')) #endif @@ -5105,7 +5164,7 @@ S_do_delete_local(pTHX) const U8 gimme = GIMME_V; const MAGIC *mg; HV *stash; - const bool sliced = !!(PL_op->op_private & OPpSLICE); + const bool sliced = cBOOL(PL_op->op_private & OPpSLICE); SV **unsliced_keysv = sliced ? NULL : sp--; SV * const osv = POPs; SV **mark = sliced ? PL_stack_base + POPMARK : unsliced_keysv-1; @@ -5321,6 +5380,78 @@ PP(pp_exists) RETPUSHNO; } +/* OP_HELEMEXISTSOR is a LOGOP not currently available to pure Perl code, but + * is defined for use by the core for new features, optimisations, or XS + * modules. + * + * Constructing it consumes two optrees, the first of which must be an + * OP_HELEM. + * + * OP *o = newLOGOP(OP_HELEMEXISTSOR, 0, helemop, otherop); + * + * If the hash element exists (by the same rules as OP_EXISTS would find + * true) the op pushes it to the stack in the same way as a regular OP_HELEM + * and invokes op_next. If the element does not exist, then op_other is + * invoked instead. This is roughly equivalent to the perl code + * + * exists $hash{$key} ? $hash{$key} : OTHER + * + * Except that any expressions or side-effects involved in obtaining the HV + * or the key are only invoked once, and it is a little more efficient when + * run on regular (non-magical) HVs. + * + * Combined with the OPpHELEMEXISTSOR_DELETE flag in op_private, this + * additionally deletes the element if found. + * + * On a tied HV, the 'EXISTS' method will be run as expected. If the method + * returns true then either the 'FETCH' or 'DELETE' method will also be run + * as required. + */ + +PP(pp_helemexistsor) +{ + dSP; + SV *keysv = POPs; + HV *hv = MUTABLE_HV(POPs); + bool is_delete = PL_op->op_private & OPpHELEMEXISTSOR_DELETE; + + assert(SvTYPE(hv) == SVt_PVHV); + + bool hv_is_magical = UNLIKELY(SvMAGICAL(hv)); + + SV *val = NULL; + + /* For magical HVs we have to ensure we invoke the EXISTS method first. + * For regular HVs we can just skip this and use the "pointer or NULL" + * result of the real hv_* functions + */ + if(hv_is_magical && !hv_exists_ent(hv, keysv, 0)) + goto other; + + if(is_delete) { + val = hv_delete_ent(hv, keysv, 0, 0); + } + else { + HE *he = hv_fetch_ent(hv, keysv, 0, 0); + val = he ? HeVAL(he) : NULL; + + /* A magical HV hasn't yet actually invoked the FETCH method. We must + * ask it to do so now + */ + if(hv_is_magical && val) + SvGETMAGIC(val); + } + + if(!val) { +other: + PUTBACK; + return cLOGOP->op_other; + } + + PUSHs(val); + RETURN; +} + PP(pp_hslice) { dSP; dMARK; dORIGMARK; @@ -5513,6 +5644,51 @@ PP(pp_anonlist) RETURN; } +/* When an anonlist or anonhash will (1) be empty and (2) return an RV + * pointing to the new AV/HV, the peephole optimizer can swap in this + * simpler function and op_null the originally associated PUSHMARK. */ +PP(pp_emptyavhv) +{ + dSP; + OP * const op = PL_op; + SV * rv; + SV * const sv = MUTABLE_SV( newSV_type( + (op->op_private & OPpEMPTYAVHV_IS_HV) ? + SVt_PVHV : + SVt_PVAV ) ); + + /* Is it an assignment, just a stack push, or both?*/ + if (op->op_private & OPpTARGET_MY) { + SV** const padentry = &PAD_SVl(op->op_targ); + rv = *padentry; + /* Since the op_targ is very likely to be an undef SVt_IV from + * a previous iteration, converting it to a live RV can + * typically be special-cased.*/ + if (SvTYPE(rv) == SVt_IV && !SvOK(rv)) { + SvFLAGS(rv) = (SVt_IV | SVf_ROK); + SvRV_set(rv, sv); + } else { + sv_setrv_noinc_mg(rv, sv); + } + if ((op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)) == OPpLVAL_INTRO) { + save_clearsv(padentry); + } + if (GIMME_V == G_VOID) { + RETURN; /* skip extending and pushing */ + } + } else { + /* Inlined newRV_noinc */ + SV * refsv = newSV_type_mortal(SVt_IV); + SvRV_set(refsv, sv); + SvROK_on(refsv); + + rv = refsv; + } + + XPUSHs(rv); + RETURN; +} + PP(pp_anonhash) { dSP; dMARK; dORIGMARK; @@ -5783,7 +5959,7 @@ PP(pp_push) /* SPAGAIN; not needed: SP is assigned to immediately below */ } else { - /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we + /* PL_delaymagic is restored by JMPENV_POP on dieing, so we * only need to save locally, not on the save stack */ U16 old_delaymagic = PL_delaymagic; @@ -5839,17 +6015,38 @@ PP(pp_unshift) /* SPAGAIN; not needed: SP is assigned to immediately below */ } else { - /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we + /* PL_delaymagic is restored by JMPENV_POP on dieing, so we * only need to save locally, not on the save stack */ U16 old_delaymagic = PL_delaymagic; SSize_t i = 0; av_unshift(ary, SP - MARK); PL_delaymagic = DM_DELAY; - while (MARK < SP) { - SV * const sv = newSVsv(*++MARK); - (void)av_store(ary, i++, sv); + + if (!SvMAGICAL(ary)) { + /* The av_unshift above means that many of the checks inside + * av_store are unnecessary. If ary does not have magic attached + * then a simple direct assignment is possible here. */ + while (MARK < SP) { + SV * const sv = newSVsv(*++MARK); + assert( !SvTIED_mg((const SV *)ary, PERL_MAGIC_tied) ); + assert( i >= 0 ); + assert( !SvREADONLY(ary) ); + assert( AvREAL(ary) || !AvREIFY(ary) ); + assert( i <= AvMAX(ary) ); + assert( i <= AvFILLp(ary) ); + if (AvREAL(ary)) + SvREFCNT_dec(AvARRAY(ary)[i]); + AvARRAY(ary)[i] = sv; + i++; + } + } else { + while (MARK < SP) { + SV * const sv = newSVsv(*++MARK); + (void)av_store(ary, i++, sv); + } } + if (PL_delaymagic & DM_ARRAY_ISA) mg_set(MUTABLE_SV(ary)); PL_delaymagic = old_delaymagic; @@ -6009,7 +6206,7 @@ PP(pp_split) const bool do_utf8 = DO_UTF8(sv); const bool in_uni_8_bit = IN_UNI_8_BIT; const char *strend = s + len; - PMOP *pm = cPMOPx(PL_op); + PMOP *pm = cPMOP; REGEXP *rx; SV *dstr; const char *m; @@ -6306,7 +6503,7 @@ PP(pp_split) /* we never pass the REXEC_COPY_STR flag, so it should * never get copied */ assert(!RX_MATCH_COPIED(rx)); - m = RX_OFFS(rx)[0].start + orig; + m = RX_OFFS_START(rx,0) + orig; if (gimme_scalar) { iters++; @@ -6321,8 +6518,8 @@ PP(pp_split) if (RX_NPARENS(rx)) { I32 i; for (i = 1; i <= (I32)RX_NPARENS(rx); i++) { - s = RX_OFFS(rx)[i].start + orig; - m = RX_OFFS(rx)[i].end + orig; + s = orig + RX_OFFS_START(rx,i); + m = orig + RX_OFFS_END(rx,i); /* japhy (07/27/01) -- the (m && s) test doesn't catch parens that didn't match -- they should be set to @@ -6344,7 +6541,7 @@ PP(pp_split) } } - s = RX_OFFS(rx)[0].end + orig; + s = RX_OFFS_END(rx,0) + orig; } } @@ -6554,8 +6751,7 @@ PP(pp_coreargs) to come in between two things this function does (stack reset and arg pushing). This seems the easiest way to do it. */ if (pushmark) { - PUTBACK; - (void)Perl_pp_pushmark(aTHX); + PUSHMARK(SP); } EXTEND(SP, maxargs == I32_MAX ? numargs : maxargs); @@ -6924,10 +7120,25 @@ PP(pp_anonconst) { dSP; dTOPss; - SETs(sv_2mortal((SV *)newCONSTSUB(SvTYPE(CopSTASH(PL_curcop))==SVt_PVHV - ? CopSTASH(PL_curcop) - : NULL, - NULL, SvREFCNT_inc_simple_NN(sv)))); + + CV* constsub = newCONSTSUB( + SvTYPE(CopSTASH(PL_curcop))==SVt_PVHV ? CopSTASH(PL_curcop) : NULL, + NULL, + SvREFCNT_inc_simple_NN(sv) + ); + + SV* ret_sv = sv_2mortal((SV *)constsub); + + /* Prior to Perl 5.38 anonconst ops always fed into srefgen. + 5.38 redefined anonconst to create the reference without srefgen. + OPf_REF was added to the op. In case some XS code out there creates + anonconst the old way, we accommodate OPf_REF's absence here. + */ + if (LIKELY(PL_op->op_flags & OPf_REF)) { + ret_sv = refto(ret_sv); + } + + SETs(ret_sv); RETURN; } @@ -7104,14 +7315,20 @@ PP(pp_argdefelem) assert(ix <= SSize_t_MAX); #endif - if (AvFILL(defav) >= ix) { - dSP; - SV **svp = av_fetch(defav, ix, FALSE); - SV *val = svp ? *svp : &PL_sv_undef; - XPUSHs(val); - RETURN; - } - return cLOGOPo->op_other; + if (AvFILL(defav) < ix) + return cLOGOPo->op_other; + + SV **svp = av_fetch(defav, ix, FALSE); + SV *val = svp ? *svp : &PL_sv_undef; + + if ((PL_op->op_private & OPpARG_IF_UNDEF) && !SvOK(val)) + return cLOGOPo->op_other; + if ((PL_op->op_private & OPpARG_IF_FALSE) && !SvTRUE(val)) + return cLOGOPo->op_other; + + dSP; + XPUSHs(val); + RETURN; } @@ -7215,28 +7432,22 @@ PP(pp_cmpchain_dup) PP(pp_is_bool) { - dSP; - dTARGET; - SV *arg = POPs; + SV *arg = *PL_stack_sp; SvGETMAGIC(arg); - sv_setbool_mg(TARG, SvIsBOOL(arg)); - PUSHs(TARG); - RETURN; + *PL_stack_sp = boolSV(SvIsBOOL(arg)); + return NORMAL; } PP(pp_is_weak) { - dSP; - dTARGET; - SV *arg = POPs; + SV *arg = *PL_stack_sp; SvGETMAGIC(arg); - sv_setbool_mg(TARG, SvROK(arg) && SvWEAKREF(arg)); - PUSHs(TARG); - RETURN; + *PL_stack_sp = boolSV(SvWEAKREF(arg)); + return NORMAL; } PP(pp_weaken) @@ -7341,6 +7552,16 @@ PP(pp_floor) dTARGET; PUSHn(Perl_floor(POPn)); RETURN; +} + +PP(pp_is_tainted) +{ + SV *arg = *PL_stack_sp; + + SvGETMAGIC(arg); + + *PL_stack_sp = boolSV(SvTAINTED(arg)); + return NORMAL; } /* Index: gnu/usr.bin/perl/pp.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/pp.h,v diff -u -p -a -u -p -r1.20 pp.h --- gnu/usr.bin/perl/pp.h 15 Feb 2023 01:36:13 -0000 1.20 +++ gnu/usr.bin/perl/pp.h 21 Feb 2024 15:47:03 -0000 @@ -24,28 +24,28 @@ Stack marker variable for the XSUB. See Opening bracket for arguments on a callback. See C> and L. -=for apidoc Amns||dSP +=for apidoc Amn;||dSP Declares a local copy of perl's stack pointer for the XSUB, available via the C macro. See C>. -=for apidoc ms||djSP +=for apidoc m;||djSP Declare Just C. This is actually identical to C, and declares a local copy of perl's stack pointer, available via the C macro. See C>. (Available for backward source code compatibility with the old (Perl 5.005) thread model.) -=for apidoc Amns||dMARK +=for apidoc Amn;||dMARK Declare a stack marker variable, C, for the XSUB. See C> and C>. -=for apidoc Amns||dORIGMARK +=for apidoc Amn;||dORIGMARK Saves the original stack mark for the XSUB. See C>. =for apidoc AmnU||ORIGMARK The original stack mark for the XSUB. See C>. -=for apidoc Amns||SPAGAIN +=for apidoc Amn;||SPAGAIN Refetch the stack pointer. Used after a callback. See L. =cut */ @@ -55,7 +55,7 @@ Refetch the stack pointer. Used after a #define MARK mark /* -=for apidoc Amns||TARG +=for apidoc Amn;||TARG C is short for "target". It is an entry in the pad that an OPs C refers to. It is scratchpad space, often used as a return @@ -103,8 +103,8 @@ value for the OP, but some use it for ot #define GETTARGET targ = PAD_SV(PL_op->op_targ) /* -=for apidoc Amns||dTARGET -Declare that this function uses C +=for apidoc Amn;||dTARGET +Declare that this function uses C, and initializes it =cut */ @@ -119,7 +119,7 @@ Declare that this function uses C #define DIE return Perl_die /* -=for apidoc Amns||PUTBACK +=for apidoc Amn;||PUTBACK Closing bracket for XSUB arguments. This is usually handled by C. See C> and L for other uses. @@ -201,6 +201,10 @@ C, so C or C sho call multiple C-oriented macros to return lists from XSUB's - see C> instead. See also C> and C>. +=for apidoc Am|void|PUSHpvs|"literal string" +A variation on C that takes a literal string and calculates its size +directly. + =for apidoc Am|void|PUSHn|NV nv Push a double onto the stack. The stack must have room for this element. Handles 'set' magic. Uses C, so C or C should be @@ -234,6 +238,10 @@ C or C should be calle multiple C-oriented macros to return lists from XSUB's - see C> instead. See also C> and C>. +=for apidoc Am|void|XPUSHpvs|"literal string" +A variation on C that takes a literal string and calculates its size +directly. + =for apidoc Am|void|XPUSHn|NV nv Push a double onto the stack, extending the stack if necessary. Handles 'set' magic. Uses C, so C or C should be called to @@ -270,6 +278,10 @@ Push a string onto the stack. The stack The C indicates the length of the string. Does not use C. See also C>, C> and C>. +=for apidoc Am|void|mPUSHpvs|"literal string" +A variation on C that takes a literal string and calculates its size +directly. + =for apidoc Am|void|mPUSHn|NV nv Push a double onto the stack. The stack must have room for this element. Does not use C. See also C>, C> and C>. @@ -297,6 +309,10 @@ Push a string onto the stack, extending indicates the length of the string. Does not use C. See also C>, C and C. +=for apidoc Am|void|mXPUSHpvs|"literal string" +A variation on C that takes a literal string and calculates its size +directly. + =for apidoc Am|void|mXPUSHn|NV nv Push a double onto the stack, extending the stack if necessary. Does not use C. See also C>, C> and C>. @@ -316,11 +332,11 @@ Does not use C. See also C PL_curstackinfo->si_stack_hwm) \ - PL_curstackinfo->si_stack_hwm = ix; \ +# define EXTEND_HWM_SET(p, n) \ + STMT_START { \ + SSize_t extend_hwm_set_ix = (p) - PL_stack_base + (n); \ + if (extend_hwm_set_ix > PL_curstackinfo->si_stack_hwm) \ + PL_curstackinfo->si_stack_hwm = extend_hwm_set_ix; \ } STMT_END #else # define EXTEND_HWM_SET(p, n) NOOP @@ -382,7 +398,7 @@ Does not use C. See also C. See also C. See also C. See also C. See also C. See also C. See also Csi_cxsubix >= 0 \ ? PL_curstackinfo->si_cxsubix \ @@ -81,7 +78,7 @@ PP(pp_regcreset) PP(pp_regcomp) { dSP; - PMOP *pm = (PMOP*)cLOGOP->op_other; + PMOP *pm = cPMOPx(cLOGOP->op_other); SV **args; int nargs; REGEXP *re = NULL; @@ -192,7 +189,7 @@ PP(pp_substcont) { dSP; PERL_CONTEXT *cx = CX_CUR(); - PMOP * const pm = (PMOP*) cLOGOP->op_other; + PMOP * const pm = cPMOPx(cLOGOP->op_other); SV * const dstr = cx->sb_dstr; char *s = cx->sb_s; char *m = cx->sb_m; @@ -323,14 +320,14 @@ PP(pp_substcont) s = orig + (m - s); cx->sb_strend = s + (cx->sb_strend - m); } - cx->sb_m = m = RX_OFFS(rx)[0].start + orig; + cx->sb_m = m = RX_OFFS_START(rx,0) + orig; if (m > s) { if (DO_UTF8(dstr) && !SvUTF8(cx->sb_targ)) sv_catpvn_nomg_utf8_upgrade(dstr, s, m - s, nsv); else sv_catpvn_nomg(dstr, s, m-s); } - cx->sb_s = RX_OFFS(rx)[0].end + orig; + cx->sb_s = RX_OFFS_END(rx,0) + orig; { /* Update the pos() information. */ SV * const sv = (pm->op_pmflags & PMf_NONDESTRUCT) ? cx->sb_dstr : cx->sb_targ; @@ -382,6 +379,7 @@ Perl_rxres_save(pTHX_ void **rsp, REGEXP PERL_ARGS_ASSERT_RXRES_SAVE; PERL_UNUSED_CONTEXT; + /* deal with regexp_paren_pair items */ if (!p || p[1] < RX_NPARENS(rx)) { #ifdef PERL_ANY_COW i = 7 + (RX_NPARENS(rx)+1) * 2; @@ -410,8 +408,8 @@ Perl_rxres_save(pTHX_ void **rsp, REGEXP *p++ = (UV)RX_SUBOFFSET(rx); *p++ = (UV)RX_SUBCOFFSET(rx); for (i = 0; i <= RX_NPARENS(rx); ++i) { - *p++ = (UV)RX_OFFS(rx)[i].start; - *p++ = (UV)RX_OFFS(rx)[i].end; + *p++ = (UV)RX_OFFSp(rx)[i].start; + *p++ = (UV)RX_OFFSp(rx)[i].end; } } @@ -441,8 +439,8 @@ S_rxres_restore(pTHX_ void **rsp, REGEXP RX_SUBOFFSET(rx) = (I32)*p++; RX_SUBCOFFSET(rx) = (I32)*p++; for (i = 0; i <= RX_NPARENS(rx); ++i) { - RX_OFFS(rx)[i].start = (I32)(*p++); - RX_OFFS(rx)[i].end = (I32)(*p++); + RX_OFFSp(rx)[i].start = (I32)(*p++); + RX_OFFSp(rx)[i].end = (I32)(*p++); } } @@ -574,7 +572,9 @@ PP(pp_formline) source = (U8 *)f; f += to_copy; trans = '~'; - item_is_utf8 = targ_is_utf8 ? !!DO_UTF8(formsv) : !!SvUTF8(formsv); + item_is_utf8 = (targ_is_utf8) + ? cBOOL(DO_UTF8(formsv)) + : cBOOL(SvUTF8(formsv)); goto append; case FF_SKIP: /* skip chars in format */ @@ -876,15 +876,16 @@ PP(pp_formline) { Size_t max = SvLEN(PL_formtarget) - (t - SvPVX(PL_formtarget)); int len; - DECLARATION_FOR_LC_NUMERIC_MANIPULATION; - STORE_LC_NUMERIC_SET_TO_NEEDED(); arg &= ~(FORM_NUM_POINT|FORM_NUM_BLANK); #ifdef USE_QUADMATH { int len; if (!quadmath_format_valid(fmt)) Perl_croak_nocontext("panic: quadmath invalid format \"%s\"", fmt); - len = quadmath_snprintf(t, max, fmt, (int) fieldsize, (int) arg, value); + WITH_LC_NUMERIC_SET_TO_NEEDED( + len = quadmath_snprintf(t, max, fmt, (int) fieldsize, + (int) arg, value); + ); if (len == -1) Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s\"", fmt); } @@ -895,7 +896,6 @@ PP(pp_formline) GCC_DIAG_RESTORE_STMT; #endif PERL_MY_SNPRINTF_POST_GUARD(len, max); - RESTORE_LC_NUMERIC(); } t += fieldsize; break; @@ -969,6 +969,11 @@ PP(pp_formline) /* also used for: pp_mapstart() */ PP(pp_grepstart) { + /* See the code comments at the start of pp_grepwhile() and + * pp_mapwhile() for an explanation of how the stack is used + * during a grep or map. + */ + dSP; SV *src; @@ -979,8 +984,8 @@ PP(pp_grepstart) RETURNOP(PL_op->op_next->op_next); } PL_stack_sp = PL_stack_base + TOPMARK + 1; - Perl_pp_pushmark(aTHX); /* push dst */ - Perl_pp_pushmark(aTHX); /* push src */ + PUSHMARK(PL_stack_sp); /* push dst */ + PUSHMARK(PL_stack_sp); /* push src */ ENTER_with_name("grep"); /* enter outer scope */ SAVETMPS; @@ -998,14 +1003,70 @@ PP(pp_grepstart) PUTBACK; if (PL_op->op_type == OP_MAPSTART) - Perl_pp_pushmark(aTHX); /* push top */ - return ((LOGOP*)PL_op->op_next)->op_other; + PUSHMARK(PL_stack_sp); /* push top */ + return cLOGOPx(PL_op->op_next)->op_other; } /* pp_grepwhile() lives in pp_hot.c */ PP(pp_mapwhile) { + /* Understanding the stack during a map. + * + * 'map expr, args' is implemented in the form of + * + * grepstart; // which handles map too + * do { + * expr; + * mapwhile; + * } while (args); + * + * The stack examples below are in the form of 'perl -Ds' output, + * where any stack element indexed by PL_markstack_ptr[i] has a star + * just to the right of it. In addition, the corresponding i value + * is displayed under the indexed stack element. + * + * On entry to mapwhile, the stack looks like this: + * + * => * A1..An X1 * X2..Xn C * R1..Rn * E1..En + * [-3] [-2] [-1] [0] + * + * where: + * A1..An Accumulated results from all previous iterations of expr + * X1..Xn Random garbage + * C The current (just processed) arg, still aliased to $_. + * R1..Rn The args remaining to be processed. + * E1..En the (list) result of the just-executed map expression. + * + * Note that it is easiest to think of stack marks [-1] and [-2] as both + * being one too high, and so it would make more sense to have had the + * marks like this: + * + * => * A1..An * X1..Xn * C R1..Rn * E1..En + * [-3] [-2] [-1] [0] + * + * where the stack is divided neatly into 4 groups: + * - accumulated results + * - discards and/or holes proactively created for later result storage + * - being, or yet to be, processed, + * - results of last expr + * But off-by-one is the way it is currently, and it works as long as + * we keep it consistent and bear it in mind. + * + * pp_mapwhile() does the following: + * + * - If there isn't enough space in the X1..Xn zone to insert the + * expression results, grow the stack and shift up everything above C. + * - move E1..En to just above An + * - at the same time, manipulate the tmps stack so that temporaries + * from executing expr can be freed without prematurely freeing + * E1..En. + * - if on last iteration, pop all the marks, reset the stack pointer + * and update the return args based on caller context. + * - else alias $_ to the next arg. + * + */ + dSP; const U8 gimme = GIMME_V; I32 items = (SP - PL_stack_base) - TOPMARK; /* how many new items */ @@ -1162,7 +1223,7 @@ PP(pp_flip) dSP; if (GIMME_V == G_LIST) { - RETURNOP(((LOGOP*)cUNOP->op_first)->op_other); + RETURNOP(cLOGOPx(cUNOP->op_first)->op_other); } else { dTOPss; @@ -1191,7 +1252,7 @@ PP(pp_flip) else { sv_setiv(targ, 0); SP--; - RETURNOP(((LOGOP*)cUNOP->op_first)->op_other); + RETURNOP(cLOGOPx(cUNOP->op_first)->op_other); } } SvPVCLEAR(TARG); @@ -1300,7 +1361,7 @@ PP(pp_flop) } if (flop) { - sv_setiv(PAD_SV(((UNOP*)cUNOP->op_first)->op_first->op_targ), 0); + sv_setiv(PAD_SV(cUNOPx(cUNOP->op_first)->op_first->op_targ), 0); sv_catpvs(targ, "E0"); } SETs(targ); @@ -1657,25 +1718,53 @@ void Perl_qerror(pTHX_ SV *err) { PERL_ARGS_ASSERT_QERROR; + if (err!=NULL) { + if (PL_in_eval) { + if (PL_in_eval & EVAL_KEEPERR) { + Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "\t(in cleanup) %" SVf, + SVfARG(err)); + } + else { + sv_catsv(ERRSV, err); + } + } + else if (PL_errors) + sv_catsv(PL_errors, err); + else + Perl_warn(aTHX_ "%" SVf, SVfARG(err)); + + if (PL_parser) { + ++PL_parser->error_count; + } + } + + if ( PL_parser && (err == NULL || + PL_parser->error_count >= PERL_STOP_PARSING_AFTER_N_ERRORS) + ) { + const char * const name = OutCopFILE(PL_curcop); + SV * errsv = NULL; + U8 raw_error_count = PERL_PARSE_ERROR_COUNT(PL_parser->error_count); + + if (PL_in_eval) { + errsv = ERRSV; + } - if (PL_in_eval) { - if (PL_in_eval & EVAL_KEEPERR) { - Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "\t(in cleanup) %" SVf, - SVfARG(err)); + if (err == NULL) { + abort_execution(errsv, name); } else - sv_catsv(ERRSV, err); + if (raw_error_count >= PERL_STOP_PARSING_AFTER_N_ERRORS) { + if (errsv) { + Perl_croak(aTHX_ "%" SVf "%s has too many errors.\n", + SVfARG(errsv), name); + } else { + Perl_croak(aTHX_ "%s has too many errors.\n", name); + } + } } - else if (PL_errors) - sv_catsv(PL_errors, err); - else - Perl_warn(aTHX_ "%" SVf, SVfARG(err)); - if (PL_parser) - ++PL_parser->error_count; } - /* pop a CXt_EVAL context and in addition, if it was a require then * based on action: * 0: do nothing extra; @@ -1954,7 +2043,7 @@ PP(pp_caller) else (void)POPs; } - cx = caller_cx(count + !!(PL_op->op_private & OPpOFFBYONE), &dbcx); + cx = caller_cx(count + cBOOL(PL_op->op_private & OPpOFFBYONE), &dbcx); if (!cx) { if (gimme != G_LIST) { EXTEND(SP, 1); @@ -2067,7 +2156,7 @@ PP(pp_caller) mPUSHi(CopHINTS_get(cx->blk_oldcop)); { SV * mask ; - STRLEN * const old_warnings = cx->blk_oldcop->cop_warnings ; + char *old_warnings = cx->blk_oldcop->cop_warnings; if (old_warnings == pWARN_NONE) mask = newSVpvn(WARN_NONEstring, WARNsize) ; @@ -2078,7 +2167,7 @@ PP(pp_caller) mask = newSVpvn(WARN_ALLstring, WARNsize) ; } else - mask = newSVpvn((char *) (old_warnings + 1), old_warnings[0]); + mask = newSVpvn(old_warnings, RCPV_LEN(old_warnings)); mPUSHs(mask); } @@ -2255,6 +2344,7 @@ PP(pp_enteriter) SV * const sv = POPs; itervarp = (void *)sv; if (LIKELY(isGV(sv))) { /* symbol table variable */ + SvREFCNT_inc_simple_void(sv); itersave = GvSV(sv); SvREFCNT_inc_simple_void(itersave); cxflags = CXp_FOR_GV; @@ -2267,6 +2357,7 @@ PP(pp_enteriter) assert(SvMAGIC(sv)->mg_type == PERL_MAGIC_lvref); itersave = NULL; cxflags = CXp_FOR_LVREF; + SvREFCNT_inc_simple_void(sv); } } /* OPpITER_DEF (implicit $_) should only occur with a GV iter var */ @@ -2635,25 +2726,33 @@ S_unwind_loop(pTHX) OP_NAME(PL_op)); } else { - dSP; STRLEN label_len; - const char * const label = - PL_op->op_flags & OPf_STACKED - ? SvPV(TOPs,label_len) - : (label_len = strlen(cPVOP->op_pv), cPVOP->op_pv); - const U32 label_flags = - PL_op->op_flags & OPf_STACKED - ? SvUTF8(POPs) - : (cPVOP->op_private & OPpPV_IS_UTF8) ? SVf_UTF8 : 0; - PUTBACK; + const char * label; + U32 label_flags; + SV *sv; + + if (PL_op->op_flags & OPf_STACKED) { + dSP; + sv = POPs; + PUTBACK; + label = SvPV(sv, label_len); + label_flags = SvUTF8(sv); + } + else { + sv = NULL; /* not needed, but shuts up compiler warn */ + label = cPVOP->op_pv; + label_len = strlen(label); + label_flags = (cPVOP->op_private & OPpPV_IS_UTF8) ? SVf_UTF8 : 0; + } + cxix = dopoptolabel(label, label_len, label_flags); if (cxix < 0) /* diag_listed_as: Label not found for "last %s" */ Perl_croak(aTHX_ "Label not found for \"%s %" SVf "\"", OP_NAME(PL_op), SVfARG(PL_op->op_flags & OPf_STACKED - && !SvGMAGICAL(TOPp1s) - ? TOPp1s + && !SvGMAGICAL(sv) + ? sv : newSVpvn_flags(label, label_len, label_flags | SVs_TEMP))); @@ -2878,6 +2977,7 @@ PP(pp_goto) PERL_CONTEXT *cx; CV *cv = MUTABLE_CV(SvRV(sv)); AV *arg = GvAV(PL_defgv); + CV *old_cv = NULL; while (!CvROOT(cv) && !CvXSUB(cv)) { const GV * const gv = CvGV(cv); @@ -2981,7 +3081,13 @@ PP(pp_goto) if (CxTYPE(cx) == CXt_SUB) { CvDEPTH(cx->blk_sub.cv) = cx->blk_sub.olddepth; - SvREFCNT_dec_NN(cx->blk_sub.cv); + /*on XS calls defer freeing the old CV as it could + * prematurely set PL_op to NULL, which could cause + * e..g XS subs using GIMME_V to SEGV */ + if (CvISXSUB(cv)) + old_cv = cx->blk_sub.cv; + else + SvREFCNT_dec_NN(cx->blk_sub.cv); } /* Now do some callish stuff. */ @@ -2989,10 +3095,13 @@ PP(pp_goto) const SSize_t items = arg ? AvFILL(arg) + 1 : 0; const bool m = arg ? cBOOL(SvRMAGICAL(arg)) : 0; SV** mark; + UNOP fake_goto_op; ENTER; SAVETMPS; SAVEFREESV(cv); /* later, undo the 'avoid premature free' hack */ + if (old_cv) + SAVEFREESV(old_cv); /* ditto, deferred freeing of old CV */ /* put GvAV(defgv) back onto stack */ if (items) { @@ -3025,6 +3134,19 @@ PP(pp_goto) PL_comppad = cx->blk_sub.prevcomppad; PL_curpad = LIKELY(PL_comppad) ? AvARRAY(PL_comppad) : NULL; + /* Make a temporary a copy of the current GOTO op on the C + * stack, but with a modified gimme (we can't modify the + * real GOTO op as that's not thread-safe). This allows XS + * users of GIMME_V to get the correct calling context, + * even though there is no longer a CXt_SUB frame to + * provide that information. + */ + Copy(PL_op, &fake_goto_op, 1, UNOP); + fake_goto_op.op_flags = + (fake_goto_op.op_flags & ~OPf_WANT) + | (cx->blk_gimme & G_WANT); + PL_op = (OP*)&fake_goto_op; + /* XS subs don't have a CXt_SUB, so pop it; * this is a cx_popblock(), less all the stuff we already did * for cx_topblock() earlier */ @@ -3214,7 +3336,7 @@ PP(pp_goto) ? 2 : 1; if (enterops[i]) - deprecate("\"goto\" to jump into a construct"); + deprecate(WARN_DEPRECATED__GOTO_CONSTRUCT, "Use of \"goto\" to jump into a construct"); } /* pop unwanted frames */ @@ -3322,17 +3444,65 @@ S_save_lines(pTHX_ AV *array, SV *sv) /* =for apidoc docatch -Check for the cases 0 or 3 of cur_env.je_ret, only used inside an eval context. +Interpose, for the current op and RUNOPS loop, + + - a new JMPENV stack catch frame, and + - an inner RUNOPS loop to run all the remaining ops following the + current PL_op. + +Then handle any exceptions raised while in that loop. +For a caught eval at this level, re-enter the loop with the specified +restart op (i.e. the op following the OP_LEAVETRY etc); otherwise re-throw +the exception. -0 is used as continue inside eval, +docatch() is intended to be used like this: -3 is used for a die caught by an inner eval - continue inner loop + PP(pp_entertry) + { + if (CATCH_GET) + return docatch(Perl_pp_entertry); + + ... rest of function ... + return PL_op->op_next; + } + +If a new catch frame isn't needed, the op behaves normally. Otherwise it +calls docatch(), which recursively calls pp_entertry(), this time with +CATCH_GET() false, so the rest of the body of the entertry is run. Then +docatch() calls CALLRUNOPS() which executes all the ops following the +entertry. When the loop finally finishes, control returns to docatch(), +which pops the JMPENV and returns to the parent pp_entertry(), which +itself immediately returns. Note that *all* subsequent ops are run within +the inner RUNOPS loop, not just the body of the eval. For example, in + + sub TIEARRAY { eval {1}; my $x } + tie @a, "main"; + +at the point the 'my' is executed, the C stack will look something like: + + #10 main() + #9 perl_run() # JMPENV_PUSH level 1 here + #8 S_run_body() + #7 Perl_runops_standard() # main RUNOPS loop + #6 Perl_pp_tie() + #5 Perl_call_sv() + #4 Perl_runops_standard() # unguarded RUNOPS loop: no new JMPENV + #3 Perl_pp_entertry() + #2 S_docatch() # JMPENV_PUSH level 2 here + #1 Perl_runops_standard() # docatch()'s RUNOPs loop + #0 Perl_pp_padsv() + +Basically, any section of the perl core which starts a RUNOPS loop may +make a promise that it will catch any exceptions and restart the loop if +necessary. If it's not prepared to do that (like call_sv() isn't), then +it sets CATCH_GET() to true, so that any later eval-like code knows to +set up a new handler and loop (via docatch()). -See F: je_mustcatch, when set at any runlevel to TRUE, means eval ops must -establish a local jmpenv to handle exception traps. +See L for further details. =cut */ + STATIC OP * S_docatch(pTHX_ Perl_ppaddr_t firstpp) { @@ -3340,18 +3510,23 @@ S_docatch(pTHX_ Perl_ppaddr_t firstpp) OP * const oldop = PL_op; dJMPENV; - assert(CATCH_GET == TRUE); - + assert(CATCH_GET); JMPENV_PUSH(ret); + assert(!CATCH_GET); + switch (ret) { - case 0: + case 0: /* normal flow-of-control return from JMPENV_PUSH */ + + /* re-run the current op, this time executing the full body of the + * pp function */ PL_op = firstpp(aTHX); redo_body: if (PL_op) { CALLRUNOPS(aTHX); } break; - case 3: + + case 3: /* an exception raised within an eval */ if (PL_restartjmpenv == PL_top_env) { /* die caught by an inner eval - continue inner loop */ @@ -3363,10 +3538,11 @@ S_docatch(pTHX_ Perl_ppaddr_t firstpp) goto redo_body; } /* FALLTHROUGH */ + default: JMPENV_POP; PL_op = oldop; - JMPENV_JUMP(ret); + JMPENV_JUMP(ret); /* re-throw the exception */ NOT_REACHED; /* NOTREACHED */ } JMPENV_POP; @@ -3443,16 +3619,39 @@ Perl_find_runcv_where(pTHX_ U8 cond, IV } -/* Run yyparse() in a setjmp wrapper. Returns: +/* S_try_yyparse(): + * + * Run yyparse() in a setjmp wrapper. Returns: * 0: yyparse() successful * 1: yyparse() failed * 3: yyparse() died + * + * This is used to trap Perl_croak() calls that are executed + * during the compilation process and before the code has been + * completely compiled. It is expected to be called from + * doeval_compile() only. The parameter 'caller_op' is + * only used in DEBUGGING to validate the logic is working + * correctly. + * + * See also try_run_unitcheck(). + * */ STATIC int -S_try_yyparse(pTHX_ int gramtype) +S_try_yyparse(pTHX_ int gramtype, OP *caller_op) { - int ret; + /* if we die during compilation PL_restartop and PL_restartjmpenv + * will be set by Perl_die_unwind(). We need to restore their values + * if that happens as they are intended for the case where the code + * compiles and dies during execution, not where it dies during + * compilation. PL_restartop and caller_op->op_next should be the + * same anyway, and when compilation fails then caller_op->op_next is + * used as the next op after the compile. + */ + JMPENV *restartjmpenv = PL_restartjmpenv; + OP *restartop = PL_restartop; dJMPENV; + int ret; + PERL_UNUSED_ARG(caller_op); /* only used in debugging builds */ assert(CxTYPE(CX_CUR()) == CXt_EVAL); JMPENV_PUSH(ret); @@ -3461,6 +3660,11 @@ S_try_yyparse(pTHX_ int gramtype) ret = yyparse(gramtype) ? 1 : 0; break; case 3: + /* yyparse() died and we trapped the error. We need to restore + * the old PL_restartjmpenv and PL_restartop values. */ + assert(PL_restartop == caller_op->op_next); /* we expect these to match */ + PL_restartjmpenv = restartjmpenv; + PL_restartop = restartop; break; default: JMPENV_POP; @@ -3471,6 +3675,67 @@ S_try_yyparse(pTHX_ int gramtype) return ret; } +/* S_try_run_unitcheck() + * + * Run PL_unitcheckav in a setjmp wrapper via call_list. + * Returns: + * 0: unitcheck blocks ran without error + * 3: a unitcheck block died + * + * This is used to trap Perl_croak() calls that are executed + * during UNITCHECK blocks executed after the compilation + * process has completed but before the code itself has been + * executed via the normal run loops. It is expected to be called + * from doeval_compile() only. The parameter 'caller_op' is + * only used in DEBUGGING to validate the logic is working + * correctly. + * + * See also try_yyparse(). + */ +STATIC int +S_try_run_unitcheck(pTHX_ OP* caller_op) +{ + /* if we die during compilation PL_restartop and PL_restartjmpenv + * will be set by Perl_die_unwind(). We need to restore their values + * if that happens as they are intended for the case where the code + * compiles and dies during execution, not where it dies during + * compilation. UNITCHECK runs after compilation completes, and + * if it dies we will execute the PL_restartop anyway via the + * failed compilation code path. PL_restartop and caller_op->op_next + * should be the same anyway, and when compilation fails then + * caller_op->op_next is used as the next op after the compile. + */ + JMPENV *restartjmpenv = PL_restartjmpenv; + OP *restartop = PL_restartop; + dJMPENV; + int ret; + PERL_UNUSED_ARG(caller_op); /* only used in debugging builds */ + + assert(CxTYPE(CX_CUR()) == CXt_EVAL); + JMPENV_PUSH(ret); + switch (ret) { + case 0: + call_list(PL_scopestack_ix, PL_unitcheckav); + break; + case 3: + /* call_list died */ + /* call_list() died and we trapped the error. We should restore + * the old PL_restartjmpenv and PL_restartop values, as they are + * used only in the case where the code was actually run. + * The assert validates that we will still execute the PL_restartop. + */ + assert(PL_restartop == caller_op->op_next); /* we expect these to match */ + PL_restartjmpenv = restartjmpenv; + PL_restartop = restartop; + break; + default: + JMPENV_POP; + JMPENV_JUMP(ret); + NOT_REACHED; /* NOTREACHED */ + } + JMPENV_POP; + return ret; +} /* Compile a require/do or an eval ''. * @@ -3610,22 +3875,30 @@ S_doeval_compile(pTHX_ U8 gimme, CV* out CALL_BLOCK_HOOKS(bhk_eval, saveop); - /* note that yyparse() may raise an exception, e.g. C, - * so honour CATCH_GET and trap it here if necessary */ + /* we should never be CATCH_GET true here, as our immediate callers should + * always handle that case. */ + assert(!CATCH_GET); + /* compile the code */ - /* compile the code */ - yystatus = (!in_require && CATCH_GET) ? S_try_yyparse(aTHX_ GRAMPROG) : yyparse(GRAMPROG); + yystatus = (!in_require) + ? S_try_yyparse(aTHX_ GRAMPROG, saveop) + : yyparse(GRAMPROG); if (yystatus || PL_parser->error_count || !PL_eval_root) { PERL_CONTEXT *cx; SV *errsv; PL_op = saveop; - /* note that if yystatus == 3, then the require/eval died during - * compilation, so the EVAL CX block has already been popped, and - * various vars restored */ if (yystatus != 3) { + /* note that if yystatus == 3, then the require/eval died during + * compilation, so the EVAL CX block has already been popped, and + * various vars restored. This block applies similar steps after + * the other "failed to compile" cases in yyparse, eg, where + * yystatus=1, "failed, but did not die". */ + + if (!in_require) + invoke_exception_hook(ERRSV,FALSE); if (PL_eval_root) { op_free(PL_eval_root); PL_eval_root = NULL; @@ -3633,6 +3906,10 @@ S_doeval_compile(pTHX_ U8 gimme, CV* out SP = PL_stack_base + POPMARK; /* pop original mark */ cx = CX_CUR(); assert(CxTYPE(cx) == CXt_EVAL); + /* If we are in an eval we need to make sure that $SIG{__DIE__} + * handler is invoked so we simulate that part of the + * Perl_die_unwind() process. In a require we will croak + * so it will happen there. */ /* pop the CXt_EVAL, and if was a require, croak */ S_pop_eval_context_maybe_croak(aTHX_ cx, ERRSV, 2); } @@ -3646,6 +3923,7 @@ S_doeval_compile(pTHX_ U8 gimme, CV* out if (!*(SvPV_nolen_const(errsv))) sv_setpvs(errsv, "Compilation error"); + if (gimme != G_LIST) PUSHs(&PL_sv_undef); PUTBACK; return FALSE; @@ -3673,9 +3951,31 @@ S_doeval_compile(pTHX_ U8 gimme, CV* out } } - if (PL_unitcheckav) { + if (PL_unitcheckav && av_count(PL_unitcheckav)>0) { OP *es = PL_eval_start; - call_list(PL_scopestack_ix, PL_unitcheckav); + /* TODO: are we sure we shouldn't do S_try_run_unitcheck() + * when `in_require` is true? */ + if (in_require) { + call_list(PL_scopestack_ix, PL_unitcheckav); + } + else if (S_try_run_unitcheck(aTHX_ saveop)) { + /* there was an error! */ + + /* Restore PL_OP */ + PL_op = saveop; + + SV *errsv = ERRSV; + if (!*(SvPV_nolen_const(errsv))) { + /* This happens when using: + * eval qq# UNITCHECK { die "\x00"; } #; + */ + sv_setpvs(errsv, "Unit check error"); + } + + if (gimme != G_LIST) PUSHs(&PL_sv_undef); + PUTBACK; + return FALSE; + } PL_eval_start = es; } @@ -3934,6 +4234,46 @@ S_require_file(pTHX_ SV *sv) if (!(name && len > 0 && *name)) DIE(aTHX_ "Missing or undefined argument to %s", op_name); + if ( + PL_hook__require__before + && SvROK(PL_hook__require__before) + && SvTYPE(SvRV(PL_hook__require__before)) == SVt_PVCV + ) { + SV* name_sv = sv_mortalcopy(sv); + SV *post_hook__require__before_sv = NULL; + + ENTER_with_name("call_PRE_REQUIRE"); + SAVETMPS; + EXTEND(SP, 1); + PUSHMARK(SP); + PUSHs(name_sv); /* always use the object for method calls */ + PUTBACK; + int count = call_sv(PL_hook__require__before, G_SCALAR); + SPAGAIN; + if (count && SvOK(*SP) && SvROK(*SP) && SvTYPE(SvRV(*SP)) == SVt_PVCV) + post_hook__require__before_sv = SvREFCNT_inc_simple_NN(*SP); + if (!sv_streq(name_sv,sv)) { + /* they modified the name argument, so do some sleight of hand */ + name = SvPV_nomg_const(name_sv, len); + if (!(name && len > 0 && *name)) + DIE(aTHX_ "Missing or undefined argument to %s via %%{^HOOK}{require__before}", + op_name); + sv = SvREFCNT_inc_simple_NN(name_sv); + } + FREETMPS; + LEAVE_with_name("call_PRE_REQUIRE"); + if (post_hook__require__before_sv) { + MORTALDESTRUCTOR_SV(post_hook__require__before_sv, newSVsv(sv)); + } + } + if ( + PL_hook__require__after + && SvROK(PL_hook__require__after) + && SvTYPE(SvRV(PL_hook__require__after)) == SVt_PVCV + ) { + MORTALDESTRUCTOR_SV(PL_hook__require__after, newSVsv(sv)); + } + #ifndef VMS /* try to return earlier (save the SAFE_PATHNAME check) if INC already got the name */ if (op_is_require) { @@ -3996,7 +4336,7 @@ S_require_file(pTHX_ SV *sv) /*XXX OPf_KIDS should always be true? -dapm 4/2017 */ if (PL_op->op_flags & OPf_KIDS) { - SVOP * const kid = (SVOP*)cUNOP->op_first; + SVOP * const kid = cSVOPx(cUNOP->op_first); if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) { /* Make sure that a bareword module name (e.g. ::Foo::Bar) @@ -4059,58 +4399,145 @@ S_require_file(pTHX_ SV *sv) * * For searchable paths, just search @INC normally */ + AV *inc_checked = (AV*)sv_2mortal((SV*)newAV()); if (!tryrsfp && !(errno == EACCES && !path_searchable)) { - AV * const ar = GvAVn(PL_incgv); - SSize_t i; + SSize_t inc_idx; #ifdef VMS if (vms_unixname) #endif { - SV *nsv = sv; + AV *incdir_av = (AV*)sv_2mortal((SV*)newAV()); + SV *nsv = sv; /* non const copy we can change if necessary */ namesv = newSV_type(SVt_PV); - for (i = 0; i <= AvFILL(ar); i++) { - SV * const dirsv = *av_fetch(ar, i, TRUE); + AV *inc_ar = GvAVn(PL_incgv); + SSize_t incdir_continue_inc_idx = -1; + + for ( + inc_idx = 0; + (AvFILL(incdir_av)>=0 /* we have INCDIR items pending */ + || inc_idx <= AvFILL(inc_ar)); /* @INC entries remain */ + inc_idx++ + ) { + SV *dirsv; + + /* do we have any pending INCDIR items? */ + if (AvFILL(incdir_av)>=0) { + /* yep, shift it out */ + dirsv = av_shift(incdir_av); + if (AvFILL(incdir_av)<0) { + /* incdir is now empty, continue from where + * we left off after we process this entry */ + inc_idx = incdir_continue_inc_idx; + } + } else { + dirsv = *av_fetch(inc_ar, inc_idx, TRUE); + } + + if (SvGMAGICAL(dirsv)) { + SvGETMAGIC(dirsv); + dirsv = newSVsv_nomg(dirsv); + } else { + /* on the other hand, since we aren't copying we do need + * to increment */ + SvREFCNT_inc(dirsv); + } + if (!SvOK(dirsv)) + continue; + + av_push(inc_checked, dirsv); - SvGETMAGIC(dirsv); if (SvROK(dirsv)) { int count; SV **svp; SV *loader = dirsv; + UV diruv = PTR2UV(SvRV(dirsv)); if (SvTYPE(SvRV(loader)) == SVt_PVAV && !SvOBJECT(SvRV(loader))) { loader = *av_fetch(MUTABLE_AV(SvRV(loader)), 0, TRUE); - SvGETMAGIC(loader); + if (SvGMAGICAL(loader)) { + SvGETMAGIC(loader); + SV *l = sv_newmortal(); + sv_setsv_nomg(l, loader); + loader = l; + } } - Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%" UVxf "/%s", - PTR2UV(SvRV(dirsv)), name); - tryname = SvPVX_const(namesv); - tryrsfp = NULL; - if (SvPADTMP(nsv)) { nsv = sv_newmortal(); SvSetSV_nosteal(nsv,sv); } - ENTER_with_name("call_INC"); - SAVETMPS; - EXTEND(SP, 2); + const char *method = NULL; + bool is_incdir = FALSE; + SV * inc_idx_sv = save_scalar(PL_incgv); + sv_setiv(inc_idx_sv,inc_idx); + if (sv_isobject(loader)) { + /* if it is an object and it has an INC method, then + * call the method. + */ + HV *pkg = SvSTASH(SvRV(loader)); + GV * gv = gv_fetchmethod_pvn_flags(pkg, "INC", 3, GV_AUTOLOAD); + if (gv && isGV(gv)) { + method = "INC"; + } else { + /* no point to autoload here, it would have been found above */ + gv = gv_fetchmethod_pvn_flags(pkg, "INCDIR", 6, 0); + if (gv && isGV(gv)) { + method = "INCDIR"; + is_incdir = TRUE; + } + } + /* But if we have no method, check if this is a + * coderef, if it is then we treat it as an + * unblessed coderef would be treated: we + * execute it. If it is some other and it is in + * an array ref wrapper, then really we don't + * know what to do with it, (why use the + * wrapper?) and we throw an exception to help + * debug. If it is not in a wrapper assume it + * has an overload and treat it as a string. + * Maybe in the future we can detect if it does + * have overloading and throw an error if not. + */ + if (!method) { + if (SvTYPE(SvRV(loader)) != SVt_PVCV) { + if (amagic_applies(loader,string_amg,AMGf_unary)) + goto treat_as_string; + else { + croak("Can't locate object method \"INC\", nor" + " \"INCDIR\" nor string overload via" + " package %" HvNAMEf_QUOTEDPREFIX " %s" + " in @INC", pkg, + dirsv == loader + ? "in object hook" + : "in object in ARRAY hook" + ); + } + } + } + } + Perl_sv_setpvf(aTHX_ namesv, "/loader/0x%" UVxf "/%s", + diruv, name); + tryname = SvPVX_const(namesv); + tryrsfp = NULL; + + ENTER_with_name("call_INC_hook"); + SAVETMPS; + EXTEND(SP, 2 + ((method && (loader != dirsv)) ? 1 : 0)); PUSHMARK(SP); - PUSHs(dirsv); + PUSHs(method ? loader : dirsv); /* always use the object for method calls */ PUSHs(nsv); + if (method && (loader != dirsv)) /* add the args array for method calls */ + PUSHs(dirsv); PUTBACK; - if (SvGMAGICAL(loader)) { - SV *l = sv_newmortal(); - sv_setsv_nomg(l, loader); - loader = l; + if (method) { + count = call_method(method, G_LIST|G_EVAL); + } else { + count = call_sv(loader, G_LIST|G_EVAL); } - if (sv_isobject(loader)) - count = call_method("INC", G_LIST); - else - count = call_sv(loader, G_LIST); SPAGAIN; if (count > 0) { @@ -4118,6 +4545,48 @@ S_require_file(pTHX_ SV *sv) SV *arg; SP -= count - 1; + + if (is_incdir) { + /* push the stringified returned items into the + * incdir_av array for processing immediately + * afterwards. we deliberately stringify or copy + * "special" arguments, so that overload logic for + * instance applies, but so that the end result is + * stable. We speficially do *not* support returning + * coderefs from an INCDIR call. */ + while (count-->0) { + arg = SP[i++]; + SvGETMAGIC(arg); + if (!SvOK(arg)) + continue; + if (SvROK(arg)) { + STRLEN l; + char *pv = SvPV(arg,l); + arg = newSVpvn(pv,l); + } + else if (SvGMAGICAL(arg)) { + arg = newSVsv_nomg(arg); + } + else { + SvREFCNT_inc(arg); + } + av_push(incdir_av, arg); + } + /* We copy $INC into incdir_continue_inc_idx + * so that when we finish processing the items + * we just inserted into incdir_av we can continue + * as though we had just finished executing the INCDIR + * hook. We honour $INC here just like we would for + * an INC hook, the hook might have rewritten @INC + * at the same time as returning something to us. + */ + inc_idx_sv = GvSVn(PL_incgv); + incdir_continue_inc_idx = SvOK(inc_idx_sv) + ? SvIV(inc_idx_sv) : -1; + + goto done_hook; + } + arg = SP[i++]; if (SvROK(arg) && (SvTYPE(SvRV(arg)) <= SVt_PVLV) @@ -4166,15 +4635,62 @@ S_require_file(pTHX_ SV *sv) tryrsfp = PerlIO_open(BIT_BUCKET, PERL_SCRIPT_MODE); } + done_hook: SP--; + } else { + SV *errsv= ERRSV; + if (SvTRUE(errsv) && !SvROK(errsv)) { + STRLEN l; + char *pv= SvPV(errsv,l); + /* Heuristic to tell if this error message + * includes the standard line number info: + * check if the line ends in digit dot newline. + * If it does then we add some extra info so + * its obvious this is coming from a hook. + * If it is a user generated error we try to + * leave it alone. l>12 is to ensure the + * other checks are in string, but also + * accounts for "at ... line 1.\n" to a + * certain extent. Really we should check + * further, but this is good enough for back + * compat I think. + */ + if (l>=12 && pv[l-1] == '\n' && pv[l-2] == '.' && isDIGIT(pv[l-3])) + sv_catpvf(errsv, "%s %s hook died--halting @INC search", + method ? method : "INC", + method ? "method" : "sub"); + croak_sv(errsv); + } } /* FREETMPS may free our filter_cache */ SvREFCNT_inc_simple_void(filter_cache); + /* + Let the hook override which @INC entry we visit + next by setting $INC to a different value than it + was before we called the hook. If they have + completely rewritten the array they might want us + to start traversing from the beginning, which is + represented by -1. We use undef as an equivalent of + -1. This can't be used as a way to call a hook + twice, as we still dedupe. + We have to do this before we LEAVE, as we localized + $INC before we called the hook. + */ + inc_idx_sv = GvSVn(PL_incgv); + inc_idx = SvOK(inc_idx_sv) ? SvIV(inc_idx_sv) : -1; + PUTBACK; FREETMPS; - LEAVE_with_name("call_INC"); + LEAVE_with_name("call_INC_hook"); + + /* + It is possible that @INC has been replaced and that inc_ar + now points at a freed AV. So we have to refresh it from + the GV to be sure. + */ + inc_ar = GvAVn(PL_incgv); /* Now re-mortalize it. */ sv_2mortal(filter_cache); @@ -4182,8 +4698,24 @@ S_require_file(pTHX_ SV *sv) /* Adjust file name if the hook has set an %INC entry. This needs to happen after the FREETMPS above. */ svp = hv_fetch(GvHVn(PL_incgv), name, len, 0); - if (svp) - tryname = SvPV_nolen_const(*svp); + /* we have to make sure that the value is not undef + * or the empty string, if it is then we should not + * set tryname to it as this will break error messages. + * + * This might happen if an @INC hook evals the module + * which was required in the first place and which + * triggered the @INC hook, and that eval dies. + * See https://github.com/Perl/perl5/issues/20535 + */ + if (svp && SvOK(*svp)) { + STRLEN len; + const char *tmp_pv = SvPV_const(*svp,len); + /* we also guard against the deliberate empty string. + * We do not guard against '0', if people want to set their + * file name to 0 that is up to them. */ + if (len) + tryname = tmp_pv; + } if (tryrsfp) { hook_sv = dirsv; @@ -4201,12 +4733,13 @@ S_require_file(pTHX_ SV *sv) filter_sub = NULL; } } - else if (path_searchable) { + else + treat_as_string: + if (path_searchable) { /* match against a plain @INC element (non-searchable * paths are only matched against refs in @INC) */ const char *dir; STRLEN dirlen; - if (SvOK(dirsv)) { dir = SvPV_nomg_const(dirsv, dirlen); } else { @@ -4286,14 +4819,15 @@ S_require_file(pTHX_ SV *sv) DIE(aTHX_ "Can't locate %s: %s: %s", name, tryname, Strerror(saved_errno)); } else { - if (path_searchable) { /* did we lookup @INC? */ - AV * const ar = GvAVn(PL_incgv); + if (path_searchable) { /* did we lookup @INC? */ SSize_t i; SV *const msg = newSVpvs_flags("", SVs_TEMP); SV *const inc = newSVpvs_flags("", SVs_TEMP); - for (i = 0; i <= AvFILL(ar); i++) { + for (i = 0; i <= AvFILL(inc_checked); i++) { + SV **svp= av_fetch(inc_checked, i, TRUE); + if (!svp || !*svp) continue; sv_catpvs(inc, " "); - sv_catsv(inc, *av_fetch(ar, i, TRUE)); + sv_catsv(inc, *svp); } if (memENDPs(name, len, ".pm")) { const char *e = name + len - (sizeof(".pm") - 1); @@ -4347,7 +4881,7 @@ S_require_file(pTHX_ SV *sv) /* diag_listed_as: Can't locate %s */ DIE(aTHX_ - "Can't locate %s in @INC%" SVf " (@INC contains:%" SVf ")", + "Can't locate %s in @INC%" SVf " (@INC entries checked:%" SVf ")", name, msg, inc); } } @@ -4361,7 +4895,7 @@ S_require_file(pTHX_ SV *sv) /* the complication is to match the logic from doopen_pm() so * we don't treat do "sda1" as a previously successful "do". */ - bool do_warn = namesv && ckWARN_d(WARN_DEPRECATED) + bool do_warn = namesv && ckWARN_d(WARN_DEPRECATED__DOT_IN_INC) && PerlLIO_stat(name, &st) == 0 && !S_ISDIR(st.st_mode) && !S_ISBLK(st.st_mode) && (io = PerlIO_openn(aTHX_ ":", PERL_SCRIPT_MODE, -1, 0, 0, NULL, 1, &sv)) != NULL; if (io) @@ -4369,7 +4903,7 @@ S_require_file(pTHX_ SV *sv) RESTORE_ERRNO; if (do_warn) { - Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), + Perl_warner(aTHX_ packWARN(WARN_DEPRECATED__DOT_IN_INC), "do \"%s\" failed, '.' is no longer in @INC; " "did you mean do \"./%s\"?", name, name); @@ -4389,10 +4923,13 @@ S_require_file(pTHX_ SV *sv) (void)hv_store(GvHVn(PL_incgv), unixname, unixlen, newSVpv(tryname,0),0); } else { + /* store the hook in the sv, note we have to *copy* hook_sv, + * we don't want modifications to it to change @INC - see GH #20577 + */ SV** const svp = hv_fetch(GvHVn(PL_incgv), unixname, unixlen, 0); if (!svp) (void)hv_store(GvHVn(PL_incgv), - unixname, unixlen, SvREFCNT_inc_simple(hook_sv), 0 ); + unixname, unixlen, newSVsv(hook_sv), 0 ); } /* Now parse the file */ @@ -4441,7 +4978,15 @@ S_require_file(pTHX_ SV *sv) PP(pp_require) { - RUN_PP_CATCHABLY(Perl_pp_require); + /* If a suitable JMPENV catch frame isn't present, call docatch(), + * which will: + * - add such a frame, and + * - start a new RUNOPS loop, which will (as the first op to run), + * recursively call this pp function again. + * The main body of this function is then executed by the inner call. + */ + if (CATCH_GET) + return docatch(Perl_pp_require); { dSP; @@ -4484,7 +5029,17 @@ PP(pp_entereval) bool bytes; I32 old_savestack_ix; - RUN_PP_CATCHABLY(Perl_pp_entereval); + /* If a suitable JMPENV catch frame isn't present, call docatch(), + * which will: + * - add such a frame, and + * - start a new RUNOPS loop, which will (as the first op to run), + * recursively call this pp function again. + * The main body of this function is then executed by the inner call. + */ + if (CATCH_GET) + return docatch(Perl_pp_entereval); + + assert(!CATCH_GET); gimme = GIMME_V; was = PL_breakable_sub_gen; @@ -4542,9 +5097,9 @@ PP(pp_entereval) if (PERLDB_NAMEEVAL && CopLINE(PL_curcop)) { SV * const temp_sv = sv_newmortal(); - Perl_sv_setpvf(aTHX_ temp_sv, "_<(eval %lu)[%s:%" IVdf "]", + Perl_sv_setpvf(aTHX_ temp_sv, "_<(eval %lu)[%s:%" LINE_Tf "]", (unsigned long)++PL_evalseq, - CopFILE(PL_curcop), (IV)CopLINE(PL_curcop)); + CopFILE(PL_curcop), CopLINE(PL_curcop)); tmpbuf = SvPVX(temp_sv); len = SvCUR(temp_sv); } @@ -4602,6 +5157,9 @@ PP(pp_entereval) } else if (!saved_delete) { (void)hv_delete(PL_defstash, tmpbuf, len, G_DISCARD); } + if (PL_op->op_private & OPpEVAL_EVALSV) + /* signal compiletime failure to our eval_sv() caller */ + *++PL_stack_sp = NULL; return PL_op->op_next; } } @@ -4616,6 +5174,7 @@ PP(pp_leaveeval) PERL_CONTEXT *cx; OP *retop; int failed; + bool override_return = FALSE; /* is feature 'module_true' in effect? */ CV *evalcv; bool keep; @@ -4627,8 +5186,57 @@ PP(pp_leaveeval) oldsp = PL_stack_base + cx->blk_oldsp; gimme = cx->blk_gimme; - /* did require return a false value? */ - failed = CxOLD_OP_TYPE(cx) == OP_REQUIRE + bool is_require= CxOLD_OP_TYPE(cx) == OP_REQUIRE; + if (is_require) { + /* We are in an require. Check if use feature 'module_true' is enabled, + * and if so later on correct any returns from the require. */ + + /* we might be called for an OP_LEAVEEVAL or OP_RETURN opcode + * and the parse tree will look different for either case. + * so find the right op to check later */ + if (OP_TYPE_IS_OR_WAS(PL_op, OP_RETURN)) { + if (PL_op->op_flags & OPf_SPECIAL) + override_return = true; + } + else if ((PL_op->op_flags & OPf_KIDS) && OP_TYPE_IS_OR_WAS(PL_op, OP_LEAVEEVAL)){ + COP *old_pl_curcop = PL_curcop; + OP *check = cUNOPx(PL_op)->op_first; + + /* ok, we found something to check, we need to scan through + * it and find the last OP_NEXTSTATE it contains and then read the + * feature state out of the COP data it contains. + */ + if (check) { + if (!OP_TYPE_IS(check,OP_STUB)) { + const OP *kid = cLISTOPx(check)->op_first; + const OP *last_state = NULL; + + for (; kid; kid = OpSIBLING(kid)) { + if ( + OP_TYPE_IS_OR_WAS(kid, OP_NEXTSTATE) + || OP_TYPE_IS_OR_WAS(kid, OP_DBSTATE) + ){ + last_state = kid; + } + } + if (last_state) { + PL_curcop = cCOPx(last_state); + if (FEATURE_MODULE_TRUE_IS_ENABLED) { + override_return = TRUE; + } + } else { + NOT_REACHED; /* NOTREACHED */ + } + } + } else { + NOT_REACHED; /* NOTREACHED */ + } + PL_curcop = old_pl_curcop; + } + } + + /* we might override this later if 'module_true' is enabled */ + failed = is_require && !(gimme == G_SCALAR ? SvTRUE_NN(*PL_stack_sp) : PL_stack_sp > oldsp); @@ -4658,6 +5266,19 @@ PP(pp_leaveeval) #endif CvDEPTH(evalcv) = 0; + if (override_return) { + /* make sure that we use a standard return when feature 'module_load' + * is enabled. Returns from require are problematic (consider what happens + * when it is called twice) */ + if (gimme == G_SCALAR) { + /* this following is an optimization of POPs()/PUSHs(). + * and does the same thing with less bookkeeping */ + *PL_stack_sp = &PL_sv_yes; + } + assert(gimme == G_VOID || gimme == G_SCALAR); + failed = 0; + } + /* pop the CXt_EVAL, and if a require failed, croak */ S_pop_eval_context_maybe_croak(aTHX_ cx, NULL, failed); @@ -4679,7 +5300,15 @@ PP(pp_entertrycatch) PERL_CONTEXT *cx; const U8 gimme = GIMME_V; - RUN_PP_CATCHABLY(Perl_pp_entertrycatch); + /* If a suitable JMPENV catch frame isn't present, call docatch(), + * which will: + * - add such a frame, and + * - start a new RUNOPS loop, which will (as the first op to run), + * recursively call this pp function again. + * The main body of this function is then executed by the inner call. + */ + if (CATCH_GET) + return docatch(Perl_pp_entertrycatch); assert(!CATCH_GET); @@ -4760,7 +5389,15 @@ PP(pp_entertry) { OP *retop = cLOGOP->op_other->op_next; - RUN_PP_CATCHABLY(Perl_pp_entertry); + /* If a suitable JMPENV catch frame isn't present, call docatch(), + * which will: + * - add such a frame, and + * - start a new RUNOPS loop, which will (as the first op to run), + * recursively call this pp function again. + * The main body of this function is then executed by the inner call. + */ + if (CATCH_GET) + return docatch(Perl_pp_entertry); assert(!CATCH_GET); @@ -4849,7 +5486,7 @@ PP(pp_leavegiven) STATIC PMOP * S_make_matcher(pTHX_ REGEXP *re) { - PMOP *matcher = (PMOP *) newPMOP(OP_MATCH, OPf_WANT_SCALAR | OPf_STACKED); + PMOP *matcher = cPMOPx(newPMOP(OP_MATCH, OPf_WANT_SCALAR | OPf_STACKED)); PERL_ARGS_ASSERT_MAKE_MATCHER; @@ -5587,9 +6224,9 @@ S_doparseform(pTHX_ SV *sv) if (mg) { /* still the same as previously-compiled string? */ SV *old = mg->mg_obj; - if ( !(!!SvUTF8(old) ^ !!SvUTF8(sv)) - && len == SvCUR(old) - && strnEQ(SvPVX(old), s, len) + if ( ! (cBOOL(SvUTF8(old)) ^ cBOOL(SvUTF8(sv))) + && len == SvCUR(old) + && strnEQ(SvPVX(old), s, len) ) { DEBUG_f(PerlIO_printf(Perl_debug_log,"Re-using compiled format\n")); return mg; Index: gnu/usr.bin/perl/pp_hot.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/pp_hot.c,v diff -u -p -a -u -p -r1.25 pp_hot.c --- gnu/usr.bin/perl/pp_hot.c 8 Jul 2023 14:18:35 -0000 1.25 +++ gnu/usr.bin/perl/pp_hot.c 21 Feb 2024 15:47:03 -0000 @@ -58,6 +58,7 @@ PP(pp_nextstate) PP(pp_gvsv) { dSP; + assert(SvTYPE(cGVOP_gv) == SVt_PVGV); EXTEND(SP,1); if (UNLIKELY(PL_op->op_private & OPpLVAL_INTRO)) PUSHs(save_scalar(cGVOP_gv)); @@ -96,6 +97,9 @@ PP(pp_stringify) PP(pp_gv) { dSP; + /* cGVOP_gv might be a real GV or might be an RV to a CV */ + assert(SvTYPE(cGVOP_gv) == SVt_PVGV || + (SvTYPE(cGVOP_gv) <= SVt_PVMG && SvROK(cGVOP_gv) && SvTYPE(SvRV(cGVOP_gv)) == SVt_PVCV)); XPUSHs(MUTABLE_SV(cGVOP_gv)); RETURN; } @@ -123,6 +127,98 @@ PP(pp_and) } } +/* + * Mashup of simple padsv + sassign OPs + * Doesn't support the following lengthy and unlikely sassign case: + * (UNLIKELY(PL_op->op_private & OPpASSIGN_CV_TO_GV)) + * These cases have a separate optimization, so are not handled here: + * (PL_op->op_private & OPpASSIGN_BACKWARDS) {or,and,dor}assign +*/ + +PP(pp_padsv_store) +{ + dSP; + OP * const op = PL_op; + SV** const padentry = &PAD_SVl(op->op_targ); + SV* targ = *padentry; /* lvalue to assign into */ + SV* const val = TOPs; /* RHS value to assign */ + + /* !OPf_STACKED is not handled by this OP */ + assert(op->op_flags & OPf_STACKED); + + /* Inlined, simplified pp_padsv here */ + if ((op->op_private & (OPpLVAL_INTRO|OPpPAD_STATE)) == OPpLVAL_INTRO) { + save_clearsv(padentry); + } + + /* Inlined, simplified pp_sassign from here */ + assert(TAINTING_get || !TAINT_get); + if (UNLIKELY(TAINT_get) && !SvTAINTED(val)) + TAINT_NOT; + + if ( + UNLIKELY(SvTEMP(targ)) && !SvSMAGICAL(targ) && SvREFCNT(targ) == 1 && + (!isGV_with_GP(targ) || SvFAKE(targ)) && ckWARN(WARN_MISC) + ) + Perl_warner(aTHX_ + packWARN(WARN_MISC), "Useless assignment to a temporary" + ); + SvSetMagicSV(targ, val); + + SETs(targ); + RETURN; +} + +/* A mashup of simplified AELEMFAST_LEX + SASSIGN OPs */ + +PP(pp_aelemfastlex_store) +{ + dSP; + OP * const op = PL_op; + SV* const val = TOPs; /* RHS value to assign */ + AV * const av = MUTABLE_AV(PAD_SV(op->op_targ)); + const I8 key = (I8)PL_op->op_private; + SV * targ = NULL; + + /* !OPf_STACKED is not handled by this OP */ + assert(op->op_flags & OPf_STACKED); + + /* Inlined, simplified pp_aelemfast here */ + assert(SvTYPE(av) == SVt_PVAV); + + /* inlined av_fetch() for simple cases ... */ + if (!SvRMAGICAL(av) && key >=0 && key <= AvFILLp(av)) { + targ = AvARRAY(av)[key]; + } + /* ... else do it the hard way */ + if (!targ) { + SV **svp = av_fetch(av, key, 1); + + if (svp) + targ = *svp; + else + DIE(aTHX_ PL_no_aelem, (int)key); + } + + /* Inlined, simplified pp_sassign from here */ + assert(TAINTING_get || !TAINT_get); + if (UNLIKELY(TAINT_get) && !SvTAINTED(val)) + TAINT_NOT; + + /* This assertion is a deviation from pp_sassign, which uses an if() + * condition to check for "Useless assignment to a temporary" and + * warns if the condition is true. Here, the condition should NEVER + * be true when the LHS is the result of an array fetch. The + * assertion is here as a final check that this remains the case. + */ + assert(!(SvTEMP(targ) && SvREFCNT(targ) == 1 && !SvSMAGICAL(targ))); + + SvSetMagicSV(targ, val); + + SETs(targ); + RETURN; +} + PP(pp_sassign) { dSP; @@ -1638,6 +1734,9 @@ PP(pp_aelemfast) if (sv) { PUSHs(sv); RETURN; + } else if (!lval) { + PUSHs(&PL_sv_undef); + RETURN; } } @@ -1774,12 +1873,7 @@ PP(pp_print) PERL_STATIC_INLINE OP* S_padhv_rv2hv_common(pTHX_ HV *hv, U8 gimme, bool is_keys, bool has_targ) { - bool is_tied; - bool is_bool; - MAGIC *mg; dSP; - IV i; - SV *sv; assert(PL_op->op_type == OP_PADHV || PL_op->op_type == OP_RV2HV); @@ -1795,12 +1889,17 @@ S_padhv_rv2hv_common(pTHX_ HV *hv, U8 gi if (gimme == G_VOID) return NORMAL; - is_bool = ( PL_op->op_private & OPpTRUEBOOL - || ( PL_op->op_private & OPpMAYBE_TRUEBOOL - && block_gimme() == G_VOID)); - is_tied = SvRMAGICAL(hv) && (mg = mg_find(MUTABLE_SV(hv), PERL_MAGIC_tied)); - - if (UNLIKELY(is_tied)) { + bool is_bool = ( PL_op->op_private & OPpTRUEBOOL + || ( PL_op->op_private & OPpMAYBE_TRUEBOOL + && block_gimme() == G_VOID)); + + MAGIC *is_tied_mg = SvRMAGICAL(hv) + ? mg_find(MUTABLE_SV(hv), PERL_MAGIC_tied) + : NULL; + + IV i = 0; + SV *sv = NULL; + if (UNLIKELY(is_tied_mg)) { if (is_keys && !is_bool) { i = 0; while (hv_iternext(hv)) @@ -1808,7 +1907,7 @@ S_padhv_rv2hv_common(pTHX_ HV *hv, U8 gi goto push_i; } else { - sv = magic_scalarpack(hv, mg); + sv = magic_scalarpack(hv, is_tied_mg); goto push_sv; } } @@ -2223,7 +2322,7 @@ PP(pp_aassign) SV **relem; SV **lelem; U8 gimme; - /* PL_delaymagic is restored by JUMPENV_POP on dieing, so we + /* PL_delaymagic is restored by JMPENV_POP on dieing, so we * only need to save locally, not on the save stack */ U16 old_delaymagic = PL_delaymagic; #ifdef DEBUGGING @@ -3091,7 +3190,7 @@ PP(pp_match) if (global && (gimme != G_LIST || (dynpm->op_pmflags & PMf_CONTINUE))) { if (!mg) mg = sv_magicext_mglob(TARG); - MgBYTEPOS_set(mg, TARG, truebase, RXp_OFFS(prog)[0].end); + MgBYTEPOS_set(mg, TARG, truebase, RXp_OFFS_END(prog,0)); if (RXp_ZERO_LEN(prog)) mg->mg_flags |= MGf_MINMATCH; else @@ -3106,38 +3205,90 @@ PP(pp_match) /* push captures on stack */ { - const I32 nparens = RXp_NPARENS(prog); - I32 i = (global && !nparens) ? 1 : 0; + const I32 logical_nparens = RXp_LOGICAL_NPARENS(prog); + /* This following statement is *devious* code. If we are in a global + match and the pattern has no parens in it we should return $& + (offset pair 0). So we set logical_paren to 1 when we should return + $&, otherwise we set it to 0. + + This allows us to simply add logical_nparens to logical_paren to + compute the number of elements we are going to return. + + In the loop intit we "not" it with: logical_paren = !logical_paren + which results in it being 0 inside the loop when we want to return + $&, and results in it being 1 when we want to return the parens. + Thus we either loop over 1..logical_nparens, or just over 0. + + This is an elegant way to do this code wise, but is super devious + and potentially confusing. When I first saw this logic I thought + "WTF?". But it makes sense after you poke it a while. + + Frankly I probably would have done it differently, but it works so + I am leaving it. - Yves */ + I32 logical_paren = (global && !logical_nparens) ? 1 : 0; + I32 *l2p = RXp_LOGICAL_TO_PARNO(prog); + /* this is used to step through the physical parens associated + * with a given logical paren. */ + I32 *p2l_next = RXp_PARNO_TO_LOGICAL_NEXT(prog); SPAGAIN; /* EVAL blocks could move the stack. */ - EXTEND(SP, nparens + i); - EXTEND_MORTAL(nparens + i); - for (i = !i; i <= nparens; i++) { - if (LIKELY((RXp_OFFS(prog)[i].start != -1) - && RXp_OFFS(prog)[i].end != -1 )) - { - const I32 len = RXp_OFFS(prog)[i].end - RXp_OFFS(prog)[i].start; - const char * const s = RXp_OFFS(prog)[i].start + truebase; - if (UNLIKELY( RXp_OFFS(prog)[i].end < 0 - || RXp_OFFS(prog)[i].start < 0 - || len < 0 - || len > strend - s) - ) - DIE(aTHX_ "panic: pp_match start/end pointers, i=%ld, " - "start=%ld, end=%ld, s=%p, strend=%p, len=%" UVuf, - (long) i, (long) RXp_OFFS(prog)[i].start, - (long)RXp_OFFS(prog)[i].end, s, strend, (UV) len); - PUSHs(newSVpvn_flags(s, len, - (DO_UTF8(TARG)) - ? SVf_UTF8|SVs_TEMP - : SVs_TEMP) - ); - } else { - PUSHs(sv_newmortal()); + EXTEND(SP, logical_nparens + logical_paren); /* devious code ... */ + EXTEND_MORTAL(logical_nparens + logical_paren); /* ... see above */ + + /* loop over the logical parens in the pattern. This may not + correspond to the actual paren checked, as branch reset may + mean that there is more than one paren "behind" the logical + parens. Eg, in /(?|(a)|(b))/ there are two parens, but one + logical paren. */ + for (logical_paren = !logical_paren; + logical_paren <= logical_nparens; + logical_paren++) + { + /* now convert the logical_paren to the physical parens which + are "behind" it. If branch reset was not used then + physical_paren and logical_paren are the same as each other + and we will only perform one iteration of the loop */ + I32 phys_paren = l2p ? l2p[logical_paren] : logical_paren; + SSize_t offs_start, offs_end; + /* We check the loop invariants below and break out of the loop + explicitly if our checks fail, so we use while (1) here to + avoid double testing a conditional. */ + while (1) { + /* Check end offset first, as the start might be >=0 even + though the end is -1, so testing the end first helps + use avoid the start check. Really we should be able to + get away with ONLY testing the end, but testing both + doesn't hurt much and preserves sanity. */ + if (((offs_end = RXp_OFFS_END(prog, phys_paren)) != -1) && + ((offs_start = RXp_OFFS_START(prog, phys_paren)) != -1)) + { + const SSize_t len = offs_end - offs_start; + const char * const s = offs_start + truebase; + if ( UNLIKELY( len < 0 || len > strend - s) ) { + DIE(aTHX_ "panic: pp_match start/end pointers, paren=%" I32df ", " + "start=%zd, end=%zd, s=%p, strend=%p, len=%zd", + phys_paren, offs_start, offs_end, s, strend, len); + } + PUSHs(newSVpvn_flags(s, len, + (DO_UTF8(TARG)) + ? SVf_UTF8|SVs_TEMP + : SVs_TEMP) + ); + break; + } else if (!p2l_next || !(phys_paren = p2l_next[phys_paren])) { + /* Either logical_paren and phys_paren are the same and + we won't have a p2l_next, or they aren't the same (and + we do have a p2l_next) but we have exhausted the list + of physical parens associated with this logical paren. + Either way we are done, and we can push undef and break + out of the loop. */ + PUSHs(sv_newmortal()); + break; + } } } if (global) { - curpos = (UV)RXp_OFFS(prog)[0].end; + curpos = (UV)RXp_OFFS_END(prog,0); had_zerolen = RXp_ZERO_LEN(prog); PUTBACK; /* EVAL blocks may use stack */ r_flags |= REXEC_IGNOREPOS | REXEC_NOT_FIRST; @@ -3286,14 +3437,19 @@ Perl_do_readline(pTHX) || SNARF_EOF(gimme, PL_rs, io, sv) || PerlIO_error(fp))) { - PerlIO_clearerr(fp); if (IoFLAGS(io) & IOf_ARGV) { fp = nextargv(PL_last_in_gv, PL_op->op_flags & OPf_SPECIAL); - if (fp) + if (fp) { continue; + } (void)do_close(PL_last_in_gv, FALSE); } else if (type == OP_GLOB) { + /* clear any errors here so we only fail on the pclose() + failing, which should only happen on the child + failing + */ + PerlIO_clearerr(fp); if (!do_close(PL_last_in_gv, FALSE)) { Perl_ck_warner(aTHX_ packWARN(WARN_GLOB), "glob failed (child exited with status %d%s)", @@ -3390,10 +3546,9 @@ PP(pp_helem) MAGIC *mg; HV *stash; - /* If we can determine whether the element exists, - * Try to preserve the existenceness of a tied hash + /* Try to preserve the existence of a tied hash * element by using EXISTS and DELETE if possible. - * Fallback to FETCH and STORE otherwise. */ + * Fall back to FETCH and STORE otherwise. */ if (SvCANEXISTDELETE(hv)) preeminent = hv_exists_ent(hv, keysv, 0); } @@ -3476,7 +3631,7 @@ S_softref2xv_lite(pTHX_ SV *const sv, co * op_aux points to an array of unions of UV / IV / SV* / PADOFFSET. * Each of these either contains a set of actions, or an argument, such as * an IV to use as an array index, or a lexical var to retrieve. - * Several actions re stored per UV; we keep shifting new actions off the + * Several actions are stored per UV; we keep shifting new actions off the * one UV, and only reload when it becomes zero. */ @@ -3491,7 +3646,7 @@ PP(pp_multideref) PL_multideref_pc = items; while (1) { - /* there are three main classes of action; the first retrieve + /* there are three main classes of action; the first retrieves * the initial AV or HV from a variable or the stack; the second * does the equivalent of an unrolled (/DREFAV, rv2av, aelem), * the third an unrolled (/DREFHV, rv2hv, helem). @@ -3635,10 +3790,9 @@ PP(pp_multideref) MAGIC *mg; HV *stash; - /* If we can determine whether the element exist, - * Try to preserve the existenceness of a tied array + /* Try to preserve the existence of a tied array * element by using EXISTS and DELETE if possible. - * Fallback to FETCH and STORE otherwise. */ + * Fall back to FETCH and STORE otherwise. */ if (SvCANEXISTDELETE(av)) preeminent = av_exists(av, elem); } @@ -3828,10 +3982,9 @@ PP(pp_multideref) MAGIC *mg; HV *stash; - /* If we can determine whether the element exist, - * Try to preserve the existenceness of a tied hash + /* Try to preserve the existence of a tied hash * element by using EXISTS and DELETE if possible. - * Fallback to FETCH and STORE otherwise. */ + * Fall back to FETCH and STORE otherwise. */ if (SvCANEXISTDELETE(hv)) preeminent = hv_exists_ent(hv, keysv, 0); } @@ -3972,7 +4125,7 @@ PP(pp_iter) if (UNLIKELY(pad_it)) { /* We're "beyond the end" of the iterator here, filling the extra lexicals with undef, so we mustn't do anything - (further) to the the iterator itself at this point. + (further) to the iterator itself at this point. (Observe how the other two blocks modify the iterator's value) */ } @@ -4248,7 +4401,6 @@ PP(pp_subst) STRLEN len; int force_on_match = 0; const I32 oldsave = PL_savestack_ix; - STRLEN slen; bool doutf8 = FALSE; /* whether replacement is in utf8 */ #ifdef PERL_ANY_COW bool was_cow; @@ -4314,10 +4466,12 @@ PP(pp_subst) DIE(aTHX_ "panic: pp_subst, pm=%p, orig=%p", pm, orig); strend = orig + len; - slen = DO_UTF8(TARG) ? utf8_length((U8*)orig, (U8*)strend) : len; - maxiters = 2 * slen + 10; /* We can match twice at each - position, once with zero-length, - second time with non-zero. */ + /* We can match twice at each position, once with zero-length, + * second time with non-zero. + * Don't handle utf8 specially; we can use length-in-bytes as an + * upper bound on length-in-characters, and avoid the cpu-cost of + * computing a tighter bound. */ + maxiters = 2 * len + 10; /* handle the empty pattern */ if (!RX_PRELEN(rx) && PL_curpm && !prog->mother_re) { @@ -4415,8 +4569,8 @@ PP(pp_subst) char *d, *m; if (RXp_MATCH_TAINTED(prog)) /* run time pattern taint, eg locale */ rxtainted |= SUBST_TAINT_PAT; - m = orig + RXp_OFFS(prog)[0].start; - d = orig + RXp_OFFS(prog)[0].end; + m = orig + RXp_OFFS_START(prog,0); + d = orig + RXp_OFFS_END(prog,0); s = orig; if (m - s > strend - d) { /* faster to shorten from end */ I32 i; @@ -4446,7 +4600,7 @@ PP(pp_subst) } else { char *d, *m; - d = s = RXp_OFFS(prog)[0].start + orig; + d = s = RXp_OFFS_START(prog,0) + orig; do { I32 i; if (UNLIKELY(iters++ > maxiters)) @@ -4454,7 +4608,7 @@ PP(pp_subst) /* run time pattern taint, eg locale */ if (UNLIKELY(RXp_MATCH_TAINTED(prog))) rxtainted |= SUBST_TAINT_PAT; - m = RXp_OFFS(prog)[0].start + orig; + m = RXp_OFFS_START(prog,0) + orig; if ((i = m - s)) { if (s != d) Move(s, d, i, char); @@ -4464,7 +4618,7 @@ PP(pp_subst) Copy(c, d, clen, char); d += clen; } - s = RXp_OFFS(prog)[0].end + orig; + s = RXp_OFFS_END(prog,0) + orig; } while (CALLREGEXEC(rx, s, strend, orig, s == m, /* don't match same null twice */ TARG, NULL, @@ -4507,7 +4661,7 @@ PP(pp_subst) if (RXp_MATCH_TAINTED(prog)) /* run time pattern taint, eg locale */ rxtainted |= SUBST_TAINT_PAT; repl = dstr; - s = RXp_OFFS(prog)[0].start + orig; + s = RXp_OFFS_START(prog,0) + orig; dstr = newSVpvn_flags(orig, s-orig, SVs_TEMP | (DO_UTF8(TARG) ? SVf_UTF8 : 0)); if (!c) { @@ -4537,9 +4691,9 @@ PP(pp_subst) s = orig + (old_s - old_orig); strend = s + (strend - old_s); } - m = RXp_OFFS(prog)[0].start + orig; + m = RXp_OFFS_START(prog,0) + orig; sv_catpvn_nomg_maybeutf8(dstr, s, m - s, DO_UTF8(TARG)); - s = RXp_OFFS(prog)[0].end + orig; + s = RXp_OFFS_END(prog,0) + orig; if (first) { /* replacement already stringified */ if (clen) @@ -4625,6 +4779,57 @@ PP(pp_subst) PP(pp_grepwhile) { + /* Understanding the stack during a grep. + * + * 'grep expr, args' is implemented in the form of + * grepstart; + * do { + * expr; + * grepwhile; + * } while (args); + * + * The stack examples below are in the form of 'perl -Ds' output, + * where any stack element indexed by PL_markstack_ptr[i] has a star + * just to the right of it. In addition, the corresponding i value + * is displayed under the indexed stack element. + * + * On entry to grepwhile, the stack looks like this: + * + * => * M1..Mn X1 * X2..Xn C * R1..Rn BOOL + * [-2] [-1] [0] + * + * where: + * M1..Mn Accumulated args which have been matched so far. + * X1..Xn Random discardable elements from previous iterations. + * C The current (just processed) arg, still aliased to $_. + * R1..Rn The args remaining to be processed. + * BOOL the result of the just-executed grep expression. + * + * Note that it is easiest to think of the top two stack marks as both + * being one too high, and so it would make more sense to have had the + * marks like this: + * + * => * M1..Mn * X1..Xn * C R1..Rn BOOL + * [-2] [-1] [0] + * + * where the stack is divided neatly into 3 groups: + * - matched, + * - discarded, + * - being, or yet to be, processed. + * But off-by-one is the way it is currently, and it works as long as + * we keep it consistent and bear it in mind. + * + * pp_grepwhile() does the following: + * + * - for a match, replace the X1 pointer with a pointer to C and bump + * PL_markstack_ptr[-1] + * - if more args to process, bump PL_markstack_ptr[0] and update the + * $_ alias, else + * - remove top 3 MARKs and return M1..Mn, or a scalar, + * or void as appropriate. + * + */ + dSP; dPOPss; @@ -4756,13 +4961,9 @@ Perl_leave_adjust_stacks(pTHX_ SV **from assert(from_sp == SP); EXTEND(SP, 1); *++SP = &PL_sv_undef; - to_sp = SP; - nargs = 0; - } - else { - from_sp = SP; - nargs = 1; } + from_sp = SP; + nargs = 1; } /* common code for G_SCALAR and G_LIST */ @@ -5048,7 +5249,8 @@ Perl_clear_defarray(pTHX_ AV* av, bool a else { const SSize_t size = AvFILLp(av) + 1; /* The ternary gives consistency with av_extend() */ - AV *newav = newAV_alloc_x(size < 4 ? 4 : size); + AV *newav = newAV_alloc_x(size < PERL_ARRAY_NEW_MIN_KEY ? + PERL_ARRAY_NEW_MIN_KEY : size); AvREIFY_only(newav); PAD_SVl(0) = MUTABLE_SV(newav); SvREFCNT_dec_NN(av); @@ -5439,10 +5641,9 @@ PP(pp_aelem) MAGIC *mg; HV *stash; - /* If we can determine whether the element exist, - * Try to preserve the existenceness of a tied array + /* Try to preserve the existence of a tied array * element by using EXISTS and DELETE if possible. - * Fallback to FETCH and STORE otherwise. */ + * Fall back to FETCH and STORE otherwise. */ if (SvCANEXISTDELETE(av)) preeminent = av_exists(av, elem); } @@ -5658,7 +5859,7 @@ PP(pp_method_named) { dSP; GV* gv; - SV* const meth = cMETHOPx_meth(PL_op); + SV* const meth = cMETHOP_meth; HV* const stash = opmethod_stash(meth); if (LIKELY(SvTYPE(stash) == SVt_PVHV)) { @@ -5677,7 +5878,7 @@ PP(pp_method_super) dSP; GV* gv; HV* cache; - SV* const meth = cMETHOPx_meth(PL_op); + SV* const meth = cMETHOP_meth; HV* const stash = CopSTASH(PL_curcop); /* Actually, SUPER doesn't need real object's (or class') stash at all, * as it uses CopSTASH. However, we must ensure that object(class) is @@ -5699,12 +5900,12 @@ PP(pp_method_redir) { dSP; GV* gv; - SV* const meth = cMETHOPx_meth(PL_op); - HV* stash = gv_stashsv(cMETHOPx_rclass(PL_op), 0); + SV* const meth = cMETHOP_meth; + HV* stash = gv_stashsv(cMETHOP_rclass, 0); opmethod_stash(meth); /* not used but needed for error checks */ if (stash) { METHOD_CHECK_CACHE(stash, stash, meth); } - else stash = MUTABLE_HV(cMETHOPx_rclass(PL_op)); + else stash = MUTABLE_HV(cMETHOP_rclass); gv = gv_fetchmethod_sv_flags(stash, meth, GV_AUTOLOAD|GV_CROAK); assert(gv); @@ -5718,11 +5919,11 @@ PP(pp_method_redir_super) dSP; GV* gv; HV* cache; - SV* const meth = cMETHOPx_meth(PL_op); - HV* stash = gv_stashsv(cMETHOPx_rclass(PL_op), 0); + SV* const meth = cMETHOP_meth; + HV* stash = gv_stashsv(cMETHOP_rclass, 0); opmethod_stash(meth); /* not used but needed for error checks */ - if (UNLIKELY(!stash)) stash = MUTABLE_HV(cMETHOPx_rclass(PL_op)); + if (UNLIKELY(!stash)) stash = MUTABLE_HV(cMETHOP_rclass); else if ((cache = HvMROMETA(stash)->super)) { METHOD_CHECK_CACHE(stash, cache, meth); } Index: gnu/usr.bin/perl/pp_pack.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/pp_pack.c,v diff -u -p -a -u -p -r1.8 pp_pack.c --- gnu/usr.bin/perl/pp_pack.c 15 Feb 2023 01:36:13 -0000 1.8 +++ gnu/usr.bin/perl/pp_pack.c 21 Feb 2024 15:47:03 -0000 @@ -541,22 +541,24 @@ STATIC const char * S_group_end(pTHX_ const char *patptr, const char *patend, char ender) { PERL_ARGS_ASSERT_GROUP_END; + Size_t opened = 0; /* number of pending opened brackets */ while (patptr < patend) { const char c = *patptr++; - if (isSPACE(c)) - continue; - else if (c == ender) + if (opened == 0 && c == ender) return patptr-1; else if (c == '#') { while (patptr < patend && *patptr != '\n') patptr++; continue; - } else if (c == '(') - patptr = group_end(patptr, patend, ')') + 1; - else if (c == '[') - patptr = group_end(patptr, patend, ']') + 1; + } else if (c == '(' || c == '[') + ++opened; + else if (c == ')' || c == ']') { + if (opened == 0) + Perl_croak(aTHX_ "Mismatched brackets in template"); + --opened; + } } Perl_croak(aTHX_ "No group ending character '%c' found in template", ender); @@ -937,6 +939,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, co const U32 group_modifiers = TYPE_MODIFIERS(datumtype & ~symptr->flags); symptr->flags |= group_modifiers; symptr->patend = savsym.grpend; + /* cppcheck-suppress autoVariables */ symptr->previous = &savsym; symptr->level++; PUTBACK; @@ -2247,6 +2250,7 @@ S_pack_rec(pTHX_ SV *cat, tempsym_t* sym symptr->flags |= group_modifiers; symptr->patend = savsym.grpend; symptr->level++; + /* cppcheck-suppress autoVariables */ symptr->previous = &lookahead; while (len--) { U32 was_utf8; Index: gnu/usr.bin/perl/pp_proto.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/pp_proto.h,v diff -u -p -a -u -p -r1.5 pp_proto.h --- gnu/usr.bin/perl/pp_proto.h 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/pp_proto.h 21 Feb 2024 15:47:03 -0000 @@ -1,317 +1,324 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by opcode.pl from its data. Any changes made here will be lost! */ -PERL_CALLCONV OP *Perl_do_kv(pTHX); -PERL_CALLCONV OP *Perl_pp_aassign(pTHX); -PERL_CALLCONV OP *Perl_pp_abs(pTHX); -PERL_CALLCONV OP *Perl_pp_accept(pTHX); -PERL_CALLCONV OP *Perl_pp_add(pTHX); -PERL_CALLCONV OP *Perl_pp_aeach(pTHX); -PERL_CALLCONV OP *Perl_pp_aelem(pTHX); -PERL_CALLCONV OP *Perl_pp_aelemfast(pTHX); -PERL_CALLCONV OP *Perl_pp_akeys(pTHX); -PERL_CALLCONV OP *Perl_pp_alarm(pTHX); -PERL_CALLCONV OP *Perl_pp_and(pTHX); -PERL_CALLCONV OP *Perl_pp_anoncode(pTHX); -PERL_CALLCONV OP *Perl_pp_anonconst(pTHX); -PERL_CALLCONV OP *Perl_pp_anonhash(pTHX); -PERL_CALLCONV OP *Perl_pp_anonlist(pTHX); -PERL_CALLCONV OP *Perl_pp_argcheck(pTHX); -PERL_CALLCONV OP *Perl_pp_argdefelem(pTHX); -PERL_CALLCONV OP *Perl_pp_argelem(pTHX); -PERL_CALLCONV OP *Perl_pp_aslice(pTHX); -PERL_CALLCONV OP *Perl_pp_atan2(pTHX); -PERL_CALLCONV OP *Perl_pp_av2arylen(pTHX); -PERL_CALLCONV OP *Perl_pp_avhvswitch(pTHX); -PERL_CALLCONV OP *Perl_pp_backtick(pTHX); -PERL_CALLCONV OP *Perl_pp_bind(pTHX); -PERL_CALLCONV OP *Perl_pp_binmode(pTHX); -PERL_CALLCONV OP *Perl_pp_bit_and(pTHX); -PERL_CALLCONV OP *Perl_pp_bit_or(pTHX); -PERL_CALLCONV OP *Perl_pp_bless(pTHX); -PERL_CALLCONV OP *Perl_pp_blessed(pTHX); -PERL_CALLCONV OP *Perl_pp_break(pTHX); -PERL_CALLCONV OP *Perl_pp_caller(pTHX); -PERL_CALLCONV OP *Perl_pp_catch(pTHX); -PERL_CALLCONV OP *Perl_pp_ceil(pTHX); -PERL_CALLCONV OP *Perl_pp_chdir(pTHX); -PERL_CALLCONV OP *Perl_pp_chop(pTHX); -PERL_CALLCONV OP *Perl_pp_chown(pTHX); -PERL_CALLCONV OP *Perl_pp_chr(pTHX); -PERL_CALLCONV OP *Perl_pp_chroot(pTHX); -PERL_CALLCONV OP *Perl_pp_clonecv(pTHX); -PERL_CALLCONV OP *Perl_pp_close(pTHX); -PERL_CALLCONV OP *Perl_pp_closedir(pTHX); -PERL_CALLCONV OP *Perl_pp_cmpchain_and(pTHX); -PERL_CALLCONV OP *Perl_pp_cmpchain_dup(pTHX); -PERL_CALLCONV OP *Perl_pp_complement(pTHX); -PERL_CALLCONV OP *Perl_pp_concat(pTHX); -PERL_CALLCONV OP *Perl_pp_cond_expr(pTHX); -PERL_CALLCONV OP *Perl_pp_const(pTHX); -PERL_CALLCONV OP *Perl_pp_continue(pTHX); -PERL_CALLCONV OP *Perl_pp_coreargs(pTHX); -PERL_CALLCONV OP *Perl_pp_crypt(pTHX); -PERL_CALLCONV OP *Perl_pp_dbmopen(pTHX); -PERL_CALLCONV OP *Perl_pp_dbstate(pTHX); -PERL_CALLCONV OP *Perl_pp_defined(pTHX); -PERL_CALLCONV OP *Perl_pp_delete(pTHX); -PERL_CALLCONV OP *Perl_pp_die(pTHX); -PERL_CALLCONV OP *Perl_pp_divide(pTHX); -PERL_CALLCONV OP *Perl_pp_each(pTHX); -PERL_CALLCONV OP *Perl_pp_ehostent(pTHX); -PERL_CALLCONV OP *Perl_pp_enter(pTHX); -PERL_CALLCONV OP *Perl_pp_entereval(pTHX); -PERL_CALLCONV OP *Perl_pp_entergiven(pTHX); -PERL_CALLCONV OP *Perl_pp_enteriter(pTHX); -PERL_CALLCONV OP *Perl_pp_enterloop(pTHX); -PERL_CALLCONV OP *Perl_pp_entersub(pTHX); -PERL_CALLCONV OP *Perl_pp_entertry(pTHX); -PERL_CALLCONV OP *Perl_pp_entertrycatch(pTHX); -PERL_CALLCONV OP *Perl_pp_enterwhen(pTHX); -PERL_CALLCONV OP *Perl_pp_enterwrite(pTHX); -PERL_CALLCONV OP *Perl_pp_eof(pTHX); -PERL_CALLCONV OP *Perl_pp_eq(pTHX); -PERL_CALLCONV OP *Perl_pp_exec(pTHX); -PERL_CALLCONV OP *Perl_pp_exists(pTHX); -PERL_CALLCONV OP *Perl_pp_exit(pTHX); -PERL_CALLCONV OP *Perl_pp_fc(pTHX); -PERL_CALLCONV OP *Perl_pp_fileno(pTHX); -PERL_CALLCONV OP *Perl_pp_flip(pTHX); -PERL_CALLCONV OP *Perl_pp_flock(pTHX); -PERL_CALLCONV OP *Perl_pp_floor(pTHX); -PERL_CALLCONV OP *Perl_pp_flop(pTHX); -PERL_CALLCONV OP *Perl_pp_fork(pTHX); -PERL_CALLCONV OP *Perl_pp_formline(pTHX); -PERL_CALLCONV OP *Perl_pp_ftis(pTHX); -PERL_CALLCONV OP *Perl_pp_ftlink(pTHX); -PERL_CALLCONV OP *Perl_pp_ftrowned(pTHX); -PERL_CALLCONV OP *Perl_pp_ftrread(pTHX); -PERL_CALLCONV OP *Perl_pp_fttext(pTHX); -PERL_CALLCONV OP *Perl_pp_fttty(pTHX); -PERL_CALLCONV OP *Perl_pp_ge(pTHX); -PERL_CALLCONV OP *Perl_pp_gelem(pTHX); -PERL_CALLCONV OP *Perl_pp_getc(pTHX); -PERL_CALLCONV OP *Perl_pp_getlogin(pTHX); -PERL_CALLCONV OP *Perl_pp_getpeername(pTHX); -PERL_CALLCONV OP *Perl_pp_getpgrp(pTHX); -PERL_CALLCONV OP *Perl_pp_getppid(pTHX); -PERL_CALLCONV OP *Perl_pp_getpriority(pTHX); -PERL_CALLCONV OP *Perl_pp_ggrent(pTHX); -PERL_CALLCONV OP *Perl_pp_ghostent(pTHX); -PERL_CALLCONV OP *Perl_pp_glob(pTHX); -PERL_CALLCONV OP *Perl_pp_gmtime(pTHX); -PERL_CALLCONV OP *Perl_pp_gnetent(pTHX); -PERL_CALLCONV OP *Perl_pp_goto(pTHX); -PERL_CALLCONV OP *Perl_pp_gprotoent(pTHX); -PERL_CALLCONV OP *Perl_pp_gpwent(pTHX); -PERL_CALLCONV OP *Perl_pp_grepstart(pTHX); -PERL_CALLCONV OP *Perl_pp_grepwhile(pTHX); -PERL_CALLCONV OP *Perl_pp_gservent(pTHX); -PERL_CALLCONV OP *Perl_pp_gt(pTHX); -PERL_CALLCONV OP *Perl_pp_gv(pTHX); -PERL_CALLCONV OP *Perl_pp_gvsv(pTHX); -PERL_CALLCONV OP *Perl_pp_helem(pTHX); -PERL_CALLCONV OP *Perl_pp_hintseval(pTHX); -PERL_CALLCONV OP *Perl_pp_hslice(pTHX); -PERL_CALLCONV OP *Perl_pp_i_add(pTHX); -PERL_CALLCONV OP *Perl_pp_i_divide(pTHX); -PERL_CALLCONV OP *Perl_pp_i_eq(pTHX); -PERL_CALLCONV OP *Perl_pp_i_ge(pTHX); -PERL_CALLCONV OP *Perl_pp_i_gt(pTHX); -PERL_CALLCONV OP *Perl_pp_i_le(pTHX); -PERL_CALLCONV OP *Perl_pp_i_lt(pTHX); -PERL_CALLCONV OP *Perl_pp_i_modulo(pTHX); -PERL_CALLCONV OP *Perl_pp_i_multiply(pTHX); -PERL_CALLCONV OP *Perl_pp_i_ncmp(pTHX); -PERL_CALLCONV OP *Perl_pp_i_ne(pTHX); -PERL_CALLCONV OP *Perl_pp_i_negate(pTHX); -PERL_CALLCONV OP *Perl_pp_i_subtract(pTHX); -PERL_CALLCONV OP *Perl_pp_index(pTHX); -PERL_CALLCONV OP *Perl_pp_int(pTHX); -PERL_CALLCONV OP *Perl_pp_introcv(pTHX); -PERL_CALLCONV OP *Perl_pp_ioctl(pTHX); -PERL_CALLCONV OP *Perl_pp_is_bool(pTHX); -PERL_CALLCONV OP *Perl_pp_is_weak(pTHX); -PERL_CALLCONV OP *Perl_pp_isa(pTHX); -PERL_CALLCONV OP *Perl_pp_iter(pTHX); -PERL_CALLCONV OP *Perl_pp_join(pTHX); -PERL_CALLCONV OP *Perl_pp_kvaslice(pTHX); -PERL_CALLCONV OP *Perl_pp_kvhslice(pTHX); -PERL_CALLCONV OP *Perl_pp_last(pTHX); -PERL_CALLCONV OP *Perl_pp_lc(pTHX); -PERL_CALLCONV OP *Perl_pp_le(pTHX); -PERL_CALLCONV OP *Perl_pp_leave(pTHX); -PERL_CALLCONV OP *Perl_pp_leaveeval(pTHX); -PERL_CALLCONV OP *Perl_pp_leavegiven(pTHX); -PERL_CALLCONV OP *Perl_pp_leaveloop(pTHX); -PERL_CALLCONV OP *Perl_pp_leavesub(pTHX); -PERL_CALLCONV OP *Perl_pp_leavesublv(pTHX); -PERL_CALLCONV OP *Perl_pp_leavetry(pTHX); -PERL_CALLCONV OP *Perl_pp_leavetrycatch(pTHX); -PERL_CALLCONV OP *Perl_pp_leavewhen(pTHX); -PERL_CALLCONV OP *Perl_pp_leavewrite(pTHX); -PERL_CALLCONV OP *Perl_pp_left_shift(pTHX); -PERL_CALLCONV OP *Perl_pp_length(pTHX); -PERL_CALLCONV OP *Perl_pp_link(pTHX); -PERL_CALLCONV OP *Perl_pp_list(pTHX); -PERL_CALLCONV OP *Perl_pp_listen(pTHX); -PERL_CALLCONV OP *Perl_pp_lock(pTHX); -PERL_CALLCONV OP *Perl_pp_lslice(pTHX); -PERL_CALLCONV OP *Perl_pp_lt(pTHX); -PERL_CALLCONV OP *Perl_pp_lvavref(pTHX); -PERL_CALLCONV OP *Perl_pp_lvref(pTHX); -PERL_CALLCONV OP *Perl_pp_lvrefslice(pTHX); -PERL_CALLCONV OP *Perl_pp_mapwhile(pTHX); -PERL_CALLCONV OP *Perl_pp_match(pTHX); -PERL_CALLCONV OP *Perl_pp_method(pTHX); -PERL_CALLCONV OP *Perl_pp_method_named(pTHX); -PERL_CALLCONV OP *Perl_pp_method_redir(pTHX); -PERL_CALLCONV OP *Perl_pp_method_redir_super(pTHX); -PERL_CALLCONV OP *Perl_pp_method_super(pTHX); -PERL_CALLCONV OP *Perl_pp_mkdir(pTHX); -PERL_CALLCONV OP *Perl_pp_modulo(pTHX); -PERL_CALLCONV OP *Perl_pp_multiconcat(pTHX); -PERL_CALLCONV OP *Perl_pp_multideref(pTHX); -PERL_CALLCONV OP *Perl_pp_multiply(pTHX); -PERL_CALLCONV OP *Perl_pp_nbit_and(pTHX); -PERL_CALLCONV OP *Perl_pp_nbit_or(pTHX); -PERL_CALLCONV OP *Perl_pp_ncmp(pTHX); -PERL_CALLCONV OP *Perl_pp_ncomplement(pTHX); -PERL_CALLCONV OP *Perl_pp_ne(pTHX); -PERL_CALLCONV OP *Perl_pp_negate(pTHX); -PERL_CALLCONV OP *Perl_pp_next(pTHX); -PERL_CALLCONV OP *Perl_pp_nextstate(pTHX); -PERL_CALLCONV OP *Perl_pp_not(pTHX); -PERL_CALLCONV OP *Perl_pp_null(pTHX); -PERL_CALLCONV OP *Perl_pp_oct(pTHX); -PERL_CALLCONV OP *Perl_pp_once(pTHX); -PERL_CALLCONV OP *Perl_pp_open(pTHX); -PERL_CALLCONV OP *Perl_pp_open_dir(pTHX); -PERL_CALLCONV OP *Perl_pp_or(pTHX); -PERL_CALLCONV OP *Perl_pp_ord(pTHX); -PERL_CALLCONV OP *Perl_pp_pack(pTHX); -PERL_CALLCONV OP *Perl_pp_padav(pTHX); -PERL_CALLCONV OP *Perl_pp_padcv(pTHX); -PERL_CALLCONV OP *Perl_pp_padhv(pTHX); -PERL_CALLCONV OP *Perl_pp_padrange(pTHX); -PERL_CALLCONV OP *Perl_pp_padsv(pTHX); -PERL_CALLCONV OP *Perl_pp_pipe_op(pTHX); -PERL_CALLCONV OP *Perl_pp_poptry(pTHX); -PERL_CALLCONV OP *Perl_pp_pos(pTHX); -PERL_CALLCONV OP *Perl_pp_postdec(pTHX); -PERL_CALLCONV OP *Perl_pp_postinc(pTHX); -PERL_CALLCONV OP *Perl_pp_pow(pTHX); -PERL_CALLCONV OP *Perl_pp_predec(pTHX); -PERL_CALLCONV OP *Perl_pp_preinc(pTHX); -PERL_CALLCONV OP *Perl_pp_print(pTHX); -PERL_CALLCONV OP *Perl_pp_prototype(pTHX); -PERL_CALLCONV OP *Perl_pp_prtf(pTHX); -PERL_CALLCONV OP *Perl_pp_push(pTHX); -PERL_CALLCONV OP *Perl_pp_pushdefer(pTHX); -PERL_CALLCONV OP *Perl_pp_pushmark(pTHX); -PERL_CALLCONV OP *Perl_pp_qr(pTHX); -PERL_CALLCONV OP *Perl_pp_quotemeta(pTHX); -PERL_CALLCONV OP *Perl_pp_rand(pTHX); -PERL_CALLCONV OP *Perl_pp_range(pTHX); -PERL_CALLCONV OP *Perl_pp_rcatline(pTHX); -PERL_CALLCONV OP *Perl_pp_readdir(pTHX); -PERL_CALLCONV OP *Perl_pp_readline(pTHX); -PERL_CALLCONV OP *Perl_pp_readlink(pTHX); -PERL_CALLCONV OP *Perl_pp_redo(pTHX); -PERL_CALLCONV OP *Perl_pp_ref(pTHX); -PERL_CALLCONV OP *Perl_pp_refaddr(pTHX); -PERL_CALLCONV OP *Perl_pp_refassign(pTHX); -PERL_CALLCONV OP *Perl_pp_refgen(pTHX); -PERL_CALLCONV OP *Perl_pp_reftype(pTHX); -PERL_CALLCONV OP *Perl_pp_regcomp(pTHX); -PERL_CALLCONV OP *Perl_pp_regcreset(pTHX); -PERL_CALLCONV OP *Perl_pp_rename(pTHX); -PERL_CALLCONV OP *Perl_pp_repeat(pTHX); -PERL_CALLCONV OP *Perl_pp_require(pTHX); -PERL_CALLCONV OP *Perl_pp_reset(pTHX); -PERL_CALLCONV OP *Perl_pp_return(pTHX); -PERL_CALLCONV OP *Perl_pp_reverse(pTHX); -PERL_CALLCONV OP *Perl_pp_rewinddir(pTHX); -PERL_CALLCONV OP *Perl_pp_right_shift(pTHX); -PERL_CALLCONV OP *Perl_pp_rmdir(pTHX); -PERL_CALLCONV OP *Perl_pp_runcv(pTHX); -PERL_CALLCONV OP *Perl_pp_rv2av(pTHX); -PERL_CALLCONV OP *Perl_pp_rv2cv(pTHX); -PERL_CALLCONV OP *Perl_pp_rv2gv(pTHX); -PERL_CALLCONV OP *Perl_pp_rv2sv(pTHX); -PERL_CALLCONV OP *Perl_pp_sassign(pTHX); -PERL_CALLCONV OP *Perl_pp_sbit_and(pTHX); -PERL_CALLCONV OP *Perl_pp_sbit_or(pTHX); -PERL_CALLCONV OP *Perl_pp_schop(pTHX); -PERL_CALLCONV OP *Perl_pp_scmp(pTHX); -PERL_CALLCONV OP *Perl_pp_scomplement(pTHX); -PERL_CALLCONV OP *Perl_pp_seekdir(pTHX); -PERL_CALLCONV OP *Perl_pp_select(pTHX); -PERL_CALLCONV OP *Perl_pp_semctl(pTHX); -PERL_CALLCONV OP *Perl_pp_semget(pTHX); -PERL_CALLCONV OP *Perl_pp_seq(pTHX); -PERL_CALLCONV OP *Perl_pp_setpgrp(pTHX); -PERL_CALLCONV OP *Perl_pp_setpriority(pTHX); -PERL_CALLCONV OP *Perl_pp_shift(pTHX); -PERL_CALLCONV OP *Perl_pp_shmwrite(pTHX); -PERL_CALLCONV OP *Perl_pp_shostent(pTHX); -PERL_CALLCONV OP *Perl_pp_shutdown(pTHX); -PERL_CALLCONV OP *Perl_pp_sin(pTHX); -PERL_CALLCONV OP *Perl_pp_sle(pTHX); -PERL_CALLCONV OP *Perl_pp_sleep(pTHX); -PERL_CALLCONV OP *Perl_pp_smartmatch(pTHX); -PERL_CALLCONV OP *Perl_pp_sne(pTHX); -PERL_CALLCONV OP *Perl_pp_socket(pTHX); -PERL_CALLCONV OP *Perl_pp_sockpair(pTHX); -PERL_CALLCONV OP *Perl_pp_sort(pTHX); -PERL_CALLCONV OP *Perl_pp_splice(pTHX); -PERL_CALLCONV OP *Perl_pp_split(pTHX); -PERL_CALLCONV OP *Perl_pp_sprintf(pTHX); -PERL_CALLCONV OP *Perl_pp_srand(pTHX); -PERL_CALLCONV OP *Perl_pp_srefgen(pTHX); -PERL_CALLCONV OP *Perl_pp_sselect(pTHX); -PERL_CALLCONV OP *Perl_pp_ssockopt(pTHX); -PERL_CALLCONV OP *Perl_pp_stat(pTHX); -PERL_CALLCONV OP *Perl_pp_stringify(pTHX); -PERL_CALLCONV OP *Perl_pp_stub(pTHX); -PERL_CALLCONV OP *Perl_pp_study(pTHX); -PERL_CALLCONV OP *Perl_pp_subst(pTHX); -PERL_CALLCONV OP *Perl_pp_substcont(pTHX); -PERL_CALLCONV OP *Perl_pp_substr(pTHX); -PERL_CALLCONV OP *Perl_pp_subtract(pTHX); -PERL_CALLCONV OP *Perl_pp_syscall(pTHX); -PERL_CALLCONV OP *Perl_pp_sysopen(pTHX); -PERL_CALLCONV OP *Perl_pp_sysread(pTHX); -PERL_CALLCONV OP *Perl_pp_sysseek(pTHX); -PERL_CALLCONV OP *Perl_pp_system(pTHX); -PERL_CALLCONV OP *Perl_pp_syswrite(pTHX); -PERL_CALLCONV OP *Perl_pp_tell(pTHX); -PERL_CALLCONV OP *Perl_pp_telldir(pTHX); -PERL_CALLCONV OP *Perl_pp_tie(pTHX); -PERL_CALLCONV OP *Perl_pp_tied(pTHX); -PERL_CALLCONV OP *Perl_pp_time(pTHX); -PERL_CALLCONV OP *Perl_pp_tms(pTHX); -PERL_CALLCONV OP *Perl_pp_trans(pTHX); -PERL_CALLCONV OP *Perl_pp_truncate(pTHX); -PERL_CALLCONV OP *Perl_pp_uc(pTHX); -PERL_CALLCONV OP *Perl_pp_ucfirst(pTHX); -PERL_CALLCONV OP *Perl_pp_umask(pTHX); -PERL_CALLCONV OP *Perl_pp_undef(pTHX); -PERL_CALLCONV OP *Perl_pp_unpack(pTHX); -PERL_CALLCONV OP *Perl_pp_unshift(pTHX); -PERL_CALLCONV OP *Perl_pp_unstack(pTHX); -PERL_CALLCONV OP *Perl_pp_untie(pTHX); -PERL_CALLCONV OP *Perl_pp_unweaken(pTHX); -PERL_CALLCONV OP *Perl_pp_vec(pTHX); -PERL_CALLCONV OP *Perl_pp_wait(pTHX); -PERL_CALLCONV OP *Perl_pp_waitpid(pTHX); -PERL_CALLCONV OP *Perl_pp_wantarray(pTHX); -PERL_CALLCONV OP *Perl_pp_warn(pTHX); -PERL_CALLCONV OP *Perl_pp_weaken(pTHX); -PERL_CALLCONV OP *Perl_pp_xor(pTHX); -PERL_CALLCONV OP *Perl_unimplemented_op(pTHX); +PERL_CALLCONV PP(do_kv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_aassign) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_abs) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_accept) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_add) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_aeach) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_aelem) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_aelemfast) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_aelemfastlex_store) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_akeys) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_alarm) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_and) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_anoncode) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_anonconst) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_anonhash) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_anonlist) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_argcheck) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_argdefelem) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_argelem) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_aslice) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_atan2) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_av2arylen) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_avhvswitch) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_backtick) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_bind) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_binmode) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_bit_and) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_bit_or) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_bless) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_blessed) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_break) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_caller) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_catch) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ceil) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_chdir) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_chop) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_chown) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_chr) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_chroot) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_clonecv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_close) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_closedir) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_cmpchain_and) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_cmpchain_dup) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_complement) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_concat) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_cond_expr) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_const) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_continue) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_coreargs) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_crypt) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_dbmopen) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_dbstate) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_defined) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_delete) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_die) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_divide) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_each) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ehostent) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_emptyavhv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_enter) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_entereval) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_entergiven) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_enteriter) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_enterloop) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_entersub) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_entertry) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_entertrycatch) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_enterwhen) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_enterwrite) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_eof) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_eq) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_exec) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_exists) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_exit) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_fc) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_fileno) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_flip) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_flock) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_floor) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_flop) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_fork) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_formline) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ftis) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ftlink) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ftrowned) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ftrread) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_fttext) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_fttty) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ge) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_gelem) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_getc) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_getlogin) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_getpeername) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_getpgrp) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_getppid) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_getpriority) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ggrent) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ghostent) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_glob) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_gmtime) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_gnetent) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_goto) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_gprotoent) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_gpwent) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_grepstart) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_grepwhile) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_gservent) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_gt) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_gv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_gvsv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_helem) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_helemexistsor) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_hintseval) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_hslice) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_add) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_divide) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_eq) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_ge) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_gt) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_le) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_lt) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_modulo) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_multiply) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_ncmp) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_ne) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_negate) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_i_subtract) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_index) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_initfield) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_int) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_introcv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ioctl) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_is_bool) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_is_tainted) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_is_weak) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_isa) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_iter) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_join) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_kvaslice) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_kvhslice) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_last) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_lc) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_le) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_leave) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_leaveeval) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_leavegiven) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_leaveloop) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_leavesub) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_leavesublv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_leavetry) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_leavetrycatch) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_leavewhen) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_leavewrite) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_left_shift) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_length) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_link) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_list) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_listen) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_lock) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_lslice) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_lt) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_lvavref) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_lvref) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_lvrefslice) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_mapwhile) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_match) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_method) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_method_named) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_method_redir) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_method_redir_super) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_method_super) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_methstart) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_mkdir) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_modulo) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_multiconcat) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_multideref) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_multiply) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_nbit_and) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_nbit_or) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ncmp) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ncomplement) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ne) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_negate) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_next) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_nextstate) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_not) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_null) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_oct) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_once) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_open) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_open_dir) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_or) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ord) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_pack) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_padav) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_padcv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_padhv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_padrange) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_padsv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_padsv_store) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_pipe_op) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_poptry) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_pos) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_postdec) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_postinc) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_pow) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_predec) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_preinc) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_print) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_prototype) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_prtf) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_push) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_pushdefer) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_pushmark) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_qr) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_quotemeta) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_rand) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_range) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_rcatline) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_readdir) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_readline) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_readlink) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_redo) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ref) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_refaddr) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_refassign) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_refgen) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_reftype) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_regcomp) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_regcreset) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_rename) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_repeat) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_require) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_reset) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_return) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_reverse) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_rewinddir) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_right_shift) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_rmdir) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_runcv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_rv2av) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_rv2cv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_rv2gv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_rv2sv) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sassign) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sbit_and) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sbit_or) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_schop) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_scmp) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_scomplement) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_seekdir) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_select) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_semctl) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_semget) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_seq) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_setpgrp) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_setpriority) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_shift) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_shmwrite) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_shostent) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_shutdown) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sin) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sle) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sleep) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_smartmatch) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sne) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_socket) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sockpair) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sort) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_splice) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_split) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sprintf) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_srand) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_srefgen) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sselect) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ssockopt) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_stat) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_stringify) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_stub) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_study) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_subst) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_substcont) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_substr) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_subtract) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_syscall) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sysopen) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sysread) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_sysseek) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_system) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_syswrite) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_tell) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_telldir) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_tie) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_tied) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_time) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_tms) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_trans) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_truncate) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_uc) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_ucfirst) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_umask) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_undef) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_unpack) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_unshift) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_unstack) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_untie) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_unweaken) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_vec) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_wait) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_waitpid) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_wantarray) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_warn) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_weaken) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(pp_xor) __attribute__visibility__("hidden"); +PERL_CALLCONV PP(unimplemented_op) __attribute__visibility__("hidden"); -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/pp_sort.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/pp_sort.c,v diff -u -p -a -u -p -r1.5 pp_sort.c --- gnu/usr.bin/perl/pp_sort.c 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/pp_sort.c 21 Feb 2024 15:47:03 -0000 @@ -716,6 +716,24 @@ PP(pp_sort) ENTER; SAVEVPTR(PL_sortcop); + + /* Important flag meanings: + * + * OPf_STACKED sort args + * + * (OPf_STACKED + * |OPf_SPECIAL) sort { } args + * + * ---- standard block; e.g. sort { $a <=> $b } args + * + * + * OPpSORT_NUMERIC { $a <=> $b } (as opposed to $a cmp $b) + * OPpSORT_INTEGER ditto in scope of 'use integer' + * OPpSORT_DESCEND { $b <=> $a } + * OPpSORT_REVERSE @a= reverse sort ....; + * OPpSORT_INPLACE @a = sort @a; + */ + if (flags & OPf_STACKED) { if (flags & OPf_SPECIAL) { OP *nullop = OpSIBLING(cLISTOP->op_first); /* pass pushmark */ @@ -888,10 +906,10 @@ PP(pp_sort) if (hasargs) { /* This is mostly copied from pp_entersub */ - AV * const av = MUTABLE_AV(PAD_SVl(0)); + AV * const av0 = MUTABLE_AV(PAD_SVl(0)); cx->blk_sub.savearray = GvAV(PL_defgv); - GvAV(PL_defgv) = MUTABLE_AV(SvREFCNT_inc_simple(av)); + GvAV(PL_defgv) = MUTABLE_AV(SvREFCNT_inc_simple(av0)); } } Index: gnu/usr.bin/perl/pp_sys.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/pp_sys.c,v diff -u -p -a -u -p -r1.25 pp_sys.c --- gnu/usr.bin/perl/pp_sys.c 3 Sep 2023 01:43:09 -0000 1.25 +++ gnu/usr.bin/perl/pp_sys.c 21 Feb 2024 15:47:03 -0000 @@ -60,6 +60,10 @@ # endif #endif +#ifdef I_SYS_SYSCALL +# include +#endif + /* XXX Configure test needed. h_errno might not be a simple 'int', especially for multi-threaded applications, see "extern int errno in perl.h". Creating such @@ -934,7 +938,8 @@ PP(pp_tie) stash = gv_stashsv(*MARK, 0); if (!stash) { if (SvROK(*MARK)) - DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\"", + DIE(aTHX_ "Can't locate object method %" PVf_QUOTEDPREFIX + " via package %" SVf_QUOTEDPREFIX, methname, SVfARG(*MARK)); else if (isGV(*MARK)) { /* If the glob doesn't name an existing package, using @@ -942,15 +947,17 @@ PP(pp_tie) * generate the name for the error message explicitly. */ SV *stashname = sv_newmortal(); gv_fullname4(stashname, (GV *) *MARK, NULL, FALSE); - DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\"", + DIE(aTHX_ "Can't locate object method %" PVf_QUOTEDPREFIX + " via package %" SVf_QUOTEDPREFIX, methname, SVfARG(stashname)); } else { SV *stashname = !SvPOK(*MARK) ? &PL_sv_no : SvCUR(*MARK) ? *MARK : newSVpvs_flags("main", SVs_TEMP); - DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\"" - " (perhaps you forgot to load \"%" SVf "\"?)", + DIE(aTHX_ "Can't locate object method %" PVf_QUOTEDPREFIX + " via package %" SVf_QUOTEDPREFIX + " (perhaps you forgot to load %" SVf_QUOTEDPREFIX "?)", methname, SVfARG(stashname), SVfARG(stashname)); } } @@ -959,7 +966,8 @@ PP(pp_tie) * been deleted from the symbol table, which this one can't * be, since we just looked it up by name. */ - DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" HEKf "\"", + DIE(aTHX_ "Can't locate object method %" PVf_QUOTEDPREFIX + " via package %" HEKf_QUOTEDPREFIX , methname, HvENAME_HEK_NN(stash)); } ENTER_with_name("call_TIE"); @@ -1167,7 +1175,10 @@ PP(pp_sselect) Perl_croak_no_modify(); } else if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0); - if (!SvPOK(sv)) { + if (SvPOK(sv)) { + if (SvUTF8(sv)) sv_utf8_downgrade(sv, FALSE); + } + else { if (!SvPOKp(sv)) Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask"); @@ -1313,6 +1324,10 @@ typeglob. As C "owns" a re count of the passed in typeglob is increased by one, and the reference count of the typeglob that C points to is decreased by one. +=for apidoc AmnU||PL_defoutgv + +See C>. + =cut */ @@ -1339,7 +1354,7 @@ PP(pp_select) if (!egv) egv = PL_defoutgv; hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL; - gvp = hv && HvENAME(hv) + gvp = hv && HvHasENAME(hv) ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE) : NULL; if (gvp && *gvp == egv) { @@ -1845,9 +1860,8 @@ PP(pp_sysread) reading to: */ SvCUR_set(bufsv, offset); - read_target = sv_newmortal(); - SvUPGRADE(read_target, SVt_PV); - buffer = SvGROW(read_target, (STRLEN)(length + 1)); + read_target = newSV_type_mortal(SVt_PV); + buffer = sv_grow_fresh(read_target, (STRLEN)(length + 1)); } if (PL_op->op_type == OP_SYSREAD) { @@ -2274,7 +2288,8 @@ PP(pp_truncate) if (PL_op->op_flags & OPf_SPECIAL ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1) - : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) { + : cBOOL(tmpgv = MAYBE_DEREF_GV(sv)) ) + { io = GvIO(tmpgv); if (!io) result = 0; @@ -2676,6 +2691,9 @@ PP(pp_shutdown) RETPUSHUNDEF; } +#ifndef PERL_GETSOCKOPT_SIZE +#define PERL_GETSOCKOPT_SIZE 1024 +#endif /* also used for: pp_gsockopt() */ @@ -2683,7 +2701,7 @@ PP(pp_ssockopt) { dSP; const int optype = PL_op->op_type; - SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs; + SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(PERL_GETSOCKOPT_SIZE+1)) : POPs; const unsigned int optname = (unsigned int) POPi; const unsigned int lvl = (unsigned int) POPi; GV * const gv = MUTABLE_GV(POPs); @@ -2702,14 +2720,14 @@ PP(pp_ssockopt) /* Note: there used to be an explicit SvGROW(sv,257) here, but * this is redundant given the sv initialization ternary above */ (void)SvPOK_only(sv); - SvCUR_set(sv,256); + SvCUR_set(sv, PERL_GETSOCKOPT_SIZE); *SvEND(sv) ='\0'; len = SvCUR(sv); if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0) goto nuts2; #if defined(_AIX) /* XXX Configure test: does getsockopt set the length properly? */ - if (len == 256) + if (len == PERL_GETSOCKOPT_SIZE) len = sizeof(int); #endif SvCUR_set(sv, len); @@ -2720,7 +2738,7 @@ PP(pp_ssockopt) const char *buf; int aint; SvGETMAGIC(sv); - if (SvPOKp(sv)) { + if (SvPOK(sv) && !SvIsBOOL(sv)) { /* sv is originally a string */ STRLEN l; buf = SvPVbyte_nomg(sv, l); len = l; @@ -2829,7 +2847,8 @@ PP(pp_stat) SV* sv; if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1) - : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) { + : cBOOL((sv=POPs, gv = MAYBE_DEREF_GV(sv)))) + { if (PL_op->op_type == OP_LSTAT) { if (gv != PL_defgv) { do_fstat_warning_check: @@ -2837,7 +2856,7 @@ PP(pp_stat) "lstat() on filehandle%s%" SVf, gv ? " " : "", SVfARG(gv - ? sv_2mortal(newSVhek(GvENAME_HEK(gv))) + ? newSVhek_mortal(GvENAME_HEK(gv)) : &PL_sv_no)); } else if (PL_laststype != OP_LSTAT) /* diag_listed_as: The stat preceding %s wasn't an lstat */ @@ -2976,7 +2995,13 @@ PP(pp_stat) Stat_t s; CLANG_DIAG_IGNORE_STMT(-Wtautological-compare); GCC_DIAG_IGNORE_STMT(-Wtype-limits); +#if defined(__HP_cc) || defined(__HP_aCC) +#pragma diag_suppress 2186 +#endif neg = PL_statcache.st_ino < 0; +#if defined(__HP_cc) || defined(__HP_aCC) +#pragma diag_default 2186 +#endif GCC_DIAG_RESTORE_STMT; CLANG_DIAG_RESTORE_STMT; if (neg) { @@ -3098,9 +3123,11 @@ S_ft_return_true(pTHX_ SV *ret) { #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef) #define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes) +/* NB: OPf_REF implies '-X _' and thus no arg on the stack */ #define tryAMAGICftest_MG(chr) STMT_START { \ - if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \ - && PL_op->op_flags & OPf_KIDS) { \ + if ( !(PL_op->op_flags & OPf_REF) \ + && (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG))) \ + { \ OP *next = S_try_amagic_ftest(aTHX_ chr); \ if (next) return next; \ } \ @@ -4225,6 +4252,7 @@ PP(pp_fork) sigset_t oldmask, newmask; #endif + EXTEND(SP, 1); PERL_FLUSHALL_FOR_CHILD; #ifdef HAS_SIGPROCMASK @@ -4252,6 +4280,9 @@ PP(pp_fork) #ifdef PERL_USES_PL_PIDSTATUS hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */ #endif + PERL_SRAND_OVERRIDE_NEXT_CHILD(); + } else { + PERL_SRAND_OVERRIDE_NEXT_PARENT(); } PUSHi(childpid); RETURN; @@ -4264,6 +4295,19 @@ PP(pp_fork) childpid = PerlProc_fork(); if (childpid == -1) RETPUSHUNDEF; + else if (childpid) { + /* we are in the parent */ + PERL_SRAND_OVERRIDE_NEXT_PARENT(); + } + else { + /* This is part of the logic supporting the env var + * PERL_RAND_SEED which causes use of rand() without an + * explicit srand() to use a deterministic seed. This logic is + * intended to give most forked children of a process a + * deterministic but different srand seed. + */ + PERL_SRAND_OVERRIDE_NEXT_CHILD(); + } PUSHi(childpid); RETURN; #else @@ -5494,20 +5538,28 @@ PP(pp_gpwent) case OP_GPWNAM: { const char* const name = POPpbytex; + GETPWNAM_LOCK; pwent = getpwnam(name); + GETPWNAM_UNLOCK; } break; case OP_GPWUID: { Uid_t uid = POPi; + GETPWUID_LOCK; pwent = getpwuid(uid); + GETPWUID_UNLOCK; } break; case OP_GPWENT: # ifdef HAS_GETPWENT pwent = getpwent(); #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */ - if (pwent) pwent = getpwnam(pwent->pw_name); + if (pwent) { + GETPWNAM_LOCK; + pwent = getpwnam(pwent->pw_name); + GETPWNAM_UNLOCK; + } #endif # else DIE(aTHX_ PL_no_func, "getpwent"); @@ -5552,8 +5604,10 @@ PP(pp_gpwent) * has a different API than the Solaris/IRIX one. */ # if defined(HAS_GETSPNAM) && !defined(_AIX) { + const struct spwd * spwent; dSAVE_ERRNO; - const struct spwd * const spwent = getspnam(pwent->pw_name); + GETSPNAM_LOCK; + spwent = getspnam(pwent->pw_name); /* Save and restore errno so that * underprivileged attempts seem * to have never made the unsuccessful @@ -5561,6 +5615,7 @@ PP(pp_gpwent) RESTORE_ERRNO; if (spwent && spwent->sp_pwdp) sv_setpv(sv, spwent->sp_pwdp); + GETSPNAM_UNLOCK; } # endif # ifdef PWPASSWD Index: gnu/usr.bin/perl/proto.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/proto.h,v diff -u -p -a -u -p -r1.30 proto.h --- gnu/usr.bin/perl/proto.h 8 Jul 2023 14:18:35 -0000 1.30 +++ gnu/usr.bin/perl/proto.h 21 Feb 2024 15:47:03 -0000 @@ -1,7059 +1,10554 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * proto.h * * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - * 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall and others + * 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, + * 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 + * by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. * * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! - * This file is built by regen/embed.pl from data in embed.fnc, - * regen/embed.pl, regen/opcodes, intrpvar.h and perlvars.h. + * This file is built by regen/embed.pl from embed.fnc, intrpvar.h, + * perlvars.h, regen/opcodes, regen/embed.pl, regen/embed_lib.pl and + * regen/HeaderParser.pm. * Any changes made here will be lost! * * Edit those files and run 'make regen_headers' to effect changes. */ START_EXTERN_C -#ifndef NO_MATHOMS -PERL_CALLCONV UV ASCII_TO_NEED(const UV enc, const UV ch) - __attribute__deprecated__ - __attribute__warn_unused_result__ - __attribute__pure__; -#define PERL_ARGS_ASSERT_ASCII_TO_NEED -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 * Perl_CvDEPTH(const CV * const sv); -#define PERL_ARGS_ASSERT_CVDEPTH \ - assert(sv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE GV * Perl_CvGV(pTHX_ CV *sv); -#define PERL_ARGS_ASSERT_CVGV \ - assert(sv) -#endif -PERL_CALLCONV int Perl_Gv_AMupdate(pTHX_ HV* stash, bool destructing); -#define PERL_ARGS_ASSERT_GV_AMUPDATE \ - assert(stash) -#ifndef NO_MATHOMS -PERL_CALLCONV UV NATIVE_TO_NEED(const UV enc, const UV ch) - __attribute__deprecated__ - __attribute__warn_unused_result__ - __attribute__pure__; -#define PERL_ARGS_ASSERT_NATIVE_TO_NEED -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 Perl_POPMARK(pTHX); -#define PERL_ARGS_ASSERT_POPMARK -#endif -PERL_CALLCONV const char * Perl_PerlIO_context_layers(pTHX_ const char *mode); +PERL_CALLCONV int +Perl_Gv_AMupdate(pTHX_ HV *stash, bool destructing); +#define PERL_ARGS_ASSERT_GV_AMUPDATE \ + assert(stash) + +PERL_CALLCONV const char * +Perl_PerlIO_context_layers(pTHX_ const char *mode); #define PERL_ARGS_ASSERT_PERLIO_CONTEXT_LAYERS -PERL_CALLCONV int Perl_PerlLIO_dup2_cloexec(pTHX_ int oldfd, int newfd); + +PERL_CALLCONV int +Perl_PerlLIO_dup2_cloexec(pTHX_ int oldfd, int newfd) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_PERLLIO_DUP2_CLOEXEC -PERL_CALLCONV int Perl_PerlLIO_dup_cloexec(pTHX_ int oldfd) - __attribute__warn_unused_result__; + +PERL_CALLCONV int +Perl_PerlLIO_dup_cloexec(pTHX_ int oldfd) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_PERLLIO_DUP_CLOEXEC -PERL_CALLCONV int Perl_PerlLIO_open3_cloexec(pTHX_ const char *file, int flag, int perm) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLLIO_OPEN3_CLOEXEC \ - assert(file) - -PERL_CALLCONV int Perl_PerlLIO_open_cloexec(pTHX_ const char *file, int flag) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLLIO_OPEN_CLOEXEC \ - assert(file) - -/* PERL_CALLCONV const XOP * Perl_custom_op_xop(pTHX_ const OP *o); */ -#define PERL_ARGS_ASSERT_PERL_CUSTOM_OP_XOP -PERL_CALLCONV const char* Perl_setlocale(const int category, const char* locale); +PERL_CALLCONV int +Perl_PerlLIO_open3_cloexec(pTHX_ const char *file, int flag, int perm) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_PERLLIO_OPEN3_CLOEXEC \ + assert(file) + +PERL_CALLCONV int +Perl_PerlLIO_open_cloexec(pTHX_ const char *file, int flag) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_PERLLIO_OPEN_CLOEXEC \ + assert(file) + +/* PERL_CALLCONV const XOP * +Perl_custom_op_xop(pTHX_ const OP *o); */ + +PERL_CALLCONV HV * +Perl_localeconv(pTHX); +#define PERL_ARGS_ASSERT_PERL_LOCALECONV + +PERL_CALLCONV const char * +Perl_setlocale(const int category, const char *locale); #define PERL_ARGS_ASSERT_PERL_SETLOCALE -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE struct regexp * Perl_ReANY(const REGEXP * const re); -#define PERL_ARGS_ASSERT_REANY \ - assert(re) -#endif -PERL_CALLCONV void* Perl_Slab_Alloc(pTHX_ size_t sz) - __attribute__warn_unused_result__; + +PERL_CALLCONV void * +Perl_Slab_Alloc(pTHX_ size_t sz) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_SLAB_ALLOC -PERL_CALLCONV void Perl_Slab_Free(pTHX_ void *op); -#define PERL_ARGS_ASSERT_SLAB_FREE \ - assert(op) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_SvAMAGIC_off(SV *sv); -#define PERL_ARGS_ASSERT_SVAMAGIC_OFF \ - assert(sv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_SvAMAGIC_on(SV *sv); -#define PERL_ARGS_ASSERT_SVAMAGIC_ON \ - assert(sv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_SvREFCNT_dec(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SVREFCNT_DEC -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_SvREFCNT_dec_NN(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SVREFCNT_DEC_NN \ - assert(sv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE SV * Perl_SvREFCNT_inc(SV *sv); -#define PERL_ARGS_ASSERT_SVREFCNT_INC -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE SV * Perl_SvREFCNT_inc_NN(SV *sv); -#define PERL_ARGS_ASSERT_SVREFCNT_INC_NN \ - assert(sv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_SvREFCNT_inc_void(SV *sv); -#define PERL_ARGS_ASSERT_SVREFCNT_INC_VOID -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_SvTRUE(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SVTRUE -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_SvTRUE_NN(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SVTRUE_NN \ - assert(sv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_SvTRUE_common(pTHX_ SV *sv, const bool sv_2bool_is_fallback); -#define PERL_ARGS_ASSERT_SVTRUE_COMMON \ - assert(sv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_SvTRUE_nomg(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SVTRUE_NOMG -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 Perl_TOPMARK(pTHX); -#define PERL_ARGS_ASSERT_TOPMARK -#endif -PERL_CALLCONV char * Perl__byte_dump_string(pTHX_ const U8 * const start, const STRLEN len, const bool format); -#define PERL_ARGS_ASSERT__BYTE_DUMP_STRING \ - assert(start) -PERL_CALLCONV void Perl__force_out_malformed_utf8_message(pTHX_ const U8 *const p, const U8 * const e, const U32 flags, const bool die_here); -#define PERL_ARGS_ASSERT__FORCE_OUT_MALFORMED_UTF8_MESSAGE \ - assert(p); assert(e) -PERL_CALLCONV Size_t Perl__inverse_folds(pTHX_ const UV cp, U32 * first_folds_to, const U32 ** remaining_folds_to) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__INVERSE_FOLDS \ - assert(first_folds_to); assert(remaining_folds_to) +PERL_CALLCONV void +Perl_Slab_Free(pTHX_ void *op); +#define PERL_ARGS_ASSERT_SLAB_FREE \ + assert(op) + +/* PERL_CALLCONV void +SvREFCNT_dec_set_NULL(pTHX_ SV *sv); */ + +PERL_CALLCONV char * +Perl__byte_dump_string(pTHX_ const U8 * const start, const STRLEN len, const bool format); +#define PERL_ARGS_ASSERT__BYTE_DUMP_STRING \ + assert(start) + +PERL_CALLCONV void +Perl__force_out_malformed_utf8_message(pTHX_ const U8 * const p, const U8 * const e, const U32 flags, const bool die_here); +#define PERL_ARGS_ASSERT__FORCE_OUT_MALFORMED_UTF8_MESSAGE \ + assert(p); assert(e) + +PERL_CALLCONV Size_t +Perl__inverse_folds(pTHX_ const UV cp, U32 *first_folds_to, const U32 **remaining_folds_to) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT__INVERSE_FOLDS \ + assert(first_folds_to); assert(remaining_folds_to) -PERL_CALLCONV bool Perl__is_in_locale_category(pTHX_ const bool compiling, const int category); +PERL_CALLCONV bool +Perl__is_in_locale_category(pTHX_ const bool compiling, const int category); #define PERL_ARGS_ASSERT__IS_IN_LOCALE_CATEGORY -PERL_CALLCONV bool Perl__is_uni_FOO(pTHX_ const U8 classnum, const UV c) - __attribute__warn_unused_result__; + +PERL_CALLCONV bool +Perl__is_uni_FOO(pTHX_ const U8 classnum, const UV c) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT__IS_UNI_FOO -PERL_CALLCONV bool Perl__is_uni_perl_idcont(pTHX_ UV c) - __attribute__warn_unused_result__; +PERL_CALLCONV bool +Perl__is_uni_perl_idcont(pTHX_ UV c) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT__IS_UNI_PERL_IDCONT -PERL_CALLCONV bool Perl__is_uni_perl_idstart(pTHX_ UV c) - __attribute__warn_unused_result__; +PERL_CALLCONV bool +Perl__is_uni_perl_idstart(pTHX_ UV c) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT__IS_UNI_PERL_IDSTART -PERL_CALLCONV bool Perl__is_utf8_FOO(pTHX_ const U8 classnum, const U8 *p, const U8 * const e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__IS_UTF8_FOO \ - assert(p); assert(e) - -PERL_CALLCONV bool Perl__is_utf8_perl_idcont(pTHX_ const U8 *p, const U8 * const e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__IS_UTF8_PERL_IDCONT \ - assert(p); assert(e) - -PERL_CALLCONV bool Perl__is_utf8_perl_idstart(pTHX_ const U8 *p, const U8 * const e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__IS_UTF8_PERL_IDSTART \ - assert(p); assert(e) - -PERL_CALLCONV UV Perl__to_uni_fold_flags(pTHX_ UV c, U8 *p, STRLEN *lenp, U8 flags); -#define PERL_ARGS_ASSERT__TO_UNI_FOLD_FLAGS \ - assert(p); assert(lenp) -PERL_CALLCONV UV Perl__to_utf8_fold_flags(pTHX_ const U8 *p, const U8 *e, U8* ustrp, STRLEN *lenp, U8 flags); -#define PERL_ARGS_ASSERT__TO_UTF8_FOLD_FLAGS \ - assert(p); assert(ustrp) -PERL_CALLCONV UV Perl__to_utf8_lower_flags(pTHX_ const U8 *p, const U8* e, U8* ustrp, STRLEN *lenp, bool flags); -#define PERL_ARGS_ASSERT__TO_UTF8_LOWER_FLAGS \ - assert(p); assert(ustrp) -PERL_CALLCONV UV Perl__to_utf8_title_flags(pTHX_ const U8 *p, const U8* e, U8* ustrp, STRLEN *lenp, bool flags); -#define PERL_ARGS_ASSERT__TO_UTF8_TITLE_FLAGS \ - assert(p); assert(ustrp) -PERL_CALLCONV UV Perl__to_utf8_upper_flags(pTHX_ const U8 *p, const U8 *e, U8* ustrp, STRLEN *lenp, bool flags); -#define PERL_ARGS_ASSERT__TO_UTF8_UPPER_FLAGS \ - assert(p); assert(ustrp) -PERL_CALLCONV UV Perl__utf8n_to_uvchr_msgs_helper(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 * errors, AV ** msgs); -#define PERL_ARGS_ASSERT__UTF8N_TO_UVCHR_MSGS_HELPER \ - assert(s) -PERL_CALLCONV void Perl__warn_problematic_locale(void); +PERL_CALLCONV bool +Perl__is_utf8_FOO(pTHX_ const U8 classnum, const U8 *p, const U8 * const e) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT__IS_UTF8_FOO \ + assert(p); assert(e) + +PERL_CALLCONV bool +Perl__is_utf8_perl_idcont(pTHX_ const U8 *p, const U8 * const e) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT__IS_UTF8_PERL_IDCONT \ + assert(p); assert(e) + +PERL_CALLCONV bool +Perl__is_utf8_perl_idstart(pTHX_ const U8 *p, const U8 * const e) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT__IS_UTF8_PERL_IDSTART \ + assert(p); assert(e) + +PERL_CALLCONV UV +Perl__to_uni_fold_flags(pTHX_ UV c, U8 *p, STRLEN *lenp, U8 flags); +#define PERL_ARGS_ASSERT__TO_UNI_FOLD_FLAGS \ + assert(p); assert(lenp) + +PERL_CALLCONV UV +Perl__to_utf8_fold_flags(pTHX_ const U8 *p, const U8 *e, U8 *ustrp, STRLEN *lenp, U8 flags); +#define PERL_ARGS_ASSERT__TO_UTF8_FOLD_FLAGS \ + assert(p); assert(ustrp) + +PERL_CALLCONV UV +Perl__to_utf8_lower_flags(pTHX_ const U8 *p, const U8 *e, U8 *ustrp, STRLEN *lenp, bool flags); +#define PERL_ARGS_ASSERT__TO_UTF8_LOWER_FLAGS \ + assert(p); assert(ustrp) + +PERL_CALLCONV UV +Perl__to_utf8_title_flags(pTHX_ const U8 *p, const U8 *e, U8 *ustrp, STRLEN *lenp, bool flags); +#define PERL_ARGS_ASSERT__TO_UTF8_TITLE_FLAGS \ + assert(p); assert(ustrp) + +PERL_CALLCONV UV +Perl__to_utf8_upper_flags(pTHX_ const U8 *p, const U8 *e, U8 *ustrp, STRLEN *lenp, bool flags); +#define PERL_ARGS_ASSERT__TO_UTF8_UPPER_FLAGS \ + assert(p); assert(ustrp) + +PERL_CALLCONV UV +Perl__utf8n_to_uvchr_msgs_helper(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 *errors, AV **msgs); +#define PERL_ARGS_ASSERT__UTF8N_TO_UVCHR_MSGS_HELPER \ + assert(s) + +PERL_CALLCONV void +Perl__warn_problematic_locale(void); #define PERL_ARGS_ASSERT__WARN_PROBLEMATIC_LOCALE -PERL_CALLCONV_NO_RET void Perl_abort_execution(pTHX_ const char * const msg, const char * const name) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_ABORT_EXECUTION \ - assert(msg); assert(name) -PERL_CALLCONV LOGOP* Perl_alloc_LOGOP(pTHX_ I32 type, OP *first, OP *other); +PERL_CALLCONV_NO_RET void +Perl_abort_execution(pTHX_ SV *msg_sv, const char * const name) + __attribute__noreturn__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_ABORT_EXECUTION \ + assert(name) + +PERL_CALLCONV LOGOP * +Perl_alloc_LOGOP(pTHX_ I32 type, OP *first, OP *other) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_ALLOC_LOGOP -PERL_CALLCONV PADOFFSET Perl_allocmy(pTHX_ const char *const name, const STRLEN len, const U32 flags); -#define PERL_ARGS_ASSERT_ALLOCMY \ - assert(name) -PERL_CALLCONV SV* Perl_amagic_call(pTHX_ SV* left, SV* right, int method, int dir); -#define PERL_ARGS_ASSERT_AMAGIC_CALL \ - assert(left); assert(right) -PERL_CALLCONV SV * Perl_amagic_deref_call(pTHX_ SV *ref, int method); -#define PERL_ARGS_ASSERT_AMAGIC_DEREF_CALL \ - assert(ref) -PERL_CALLCONV bool Perl_amagic_is_enabled(pTHX_ int method); + +PERL_CALLCONV PADOFFSET +Perl_allocmy(pTHX_ const char * const name, const STRLEN len, const U32 flags) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_ALLOCMY \ + assert(name) + +PERL_CALLCONV bool +Perl_amagic_applies(pTHX_ SV *sv, int method, int flags); +#define PERL_ARGS_ASSERT_AMAGIC_APPLIES \ + assert(sv) + +PERL_CALLCONV SV * +Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int dir); +#define PERL_ARGS_ASSERT_AMAGIC_CALL \ + assert(left); assert(right) + +PERL_CALLCONV SV * +Perl_amagic_deref_call(pTHX_ SV *ref, int method); +#define PERL_ARGS_ASSERT_AMAGIC_DEREF_CALL \ + assert(ref) + +PERL_CALLCONV bool +Perl_amagic_is_enabled(pTHX_ int method) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_AMAGIC_IS_ENABLED -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_append_utf8_from_native_byte(const U8 byte, U8** dest); -#define PERL_ARGS_ASSERT_APPEND_UTF8_FROM_NATIVE_BYTE \ - assert(dest) -#endif -PERL_CALLCONV I32 Perl_apply(pTHX_ I32 type, SV** mark, SV** sp); -#define PERL_ARGS_ASSERT_APPLY \ - assert(mark); assert(sp) -PERL_CALLCONV void Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv, const char *attrstr, STRLEN len); -#define PERL_ARGS_ASSERT_APPLY_ATTRS_STRING \ - assert(stashpv); assert(cv); assert(attrstr) -PERL_CALLCONV void Perl_atfork_lock(void); + +PERL_CALLCONV I32 +Perl_apply(pTHX_ I32 type, SV **mark, SV **sp) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_APPLY \ + assert(mark); assert(sp) + +PERL_CALLCONV void +Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv, const char *attrstr, STRLEN len); +#define PERL_ARGS_ASSERT_APPLY_ATTRS_STRING \ + assert(stashpv); assert(cv); assert(attrstr) + +PERL_CALLCONV OP * +Perl_apply_builtin_cv_attributes(pTHX_ CV *cv, OP *attrlist); +#define PERL_ARGS_ASSERT_APPLY_BUILTIN_CV_ATTRIBUTES \ + assert(cv) + +PERL_CALLCONV void +Perl_atfork_lock(void); #define PERL_ARGS_ASSERT_ATFORK_LOCK -PERL_CALLCONV void Perl_atfork_unlock(void); + +PERL_CALLCONV void +Perl_atfork_unlock(void); #define PERL_ARGS_ASSERT_ATFORK_UNLOCK -PERL_CALLCONV SV** Perl_av_arylen_p(pTHX_ AV *av); -#define PERL_ARGS_ASSERT_AV_ARYLEN_P \ - assert(av) -PERL_CALLCONV void Perl_av_clear(pTHX_ AV *av); -#define PERL_ARGS_ASSERT_AV_CLEAR \ - assert(av) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE Size_t Perl_av_count(pTHX_ AV *av) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_AV_COUNT \ - assert(av) -#endif - -PERL_CALLCONV void Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val); -#define PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH \ - assert(avp); assert(val) -PERL_CALLCONV SV** Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val); -#define PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE \ - assert(avp); assert(val) -PERL_CALLCONV SV* Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags); -#define PERL_ARGS_ASSERT_AV_DELETE \ - assert(av) -PERL_CALLCONV bool Perl_av_exists(pTHX_ AV *av, SSize_t key) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_AV_EXISTS \ - assert(av) - -PERL_CALLCONV void Perl_av_extend(pTHX_ AV *av, SSize_t key); -#define PERL_ARGS_ASSERT_AV_EXTEND \ - assert(av) -PERL_CALLCONV void Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp, SV ***arrayp); -#define PERL_ARGS_ASSERT_AV_EXTEND_GUTS \ - assert(maxp); assert(allocp); assert(arrayp) -PERL_CALLCONV SV** Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_AV_FETCH \ - assert(av) - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE SV** Perl_av_fetch_simple(pTHX_ AV *av, SSize_t key, I32 lval) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_AV_FETCH_SIMPLE \ - assert(av) -#endif - -PERL_CALLCONV void Perl_av_fill(pTHX_ AV *av, SSize_t fill); -#define PERL_ARGS_ASSERT_AV_FILL \ - assert(av) -PERL_CALLCONV IV* Perl_av_iter_p(pTHX_ AV *av); -#define PERL_ARGS_ASSERT_AV_ITER_P \ - assert(av) -PERL_CALLCONV SSize_t Perl_av_len(pTHX_ AV *av) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_AV_LEN \ - assert(av) - -PERL_CALLCONV AV* Perl_av_make(pTHX_ SSize_t size, SV **strp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_AV_MAKE \ - assert(strp) - -PERL_CALLCONV AV* Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_AV_NEW_ALLOC - -PERL_CALLCONV SV* Perl_av_nonelem(pTHX_ AV *av, SSize_t ix); -#define PERL_ARGS_ASSERT_AV_NONELEM \ - assert(av) -PERL_CALLCONV SV* Perl_av_pop(pTHX_ AV *av); -#define PERL_ARGS_ASSERT_AV_POP \ - assert(av) -PERL_CALLCONV void Perl_av_push(pTHX_ AV *av, SV *val); -#define PERL_ARGS_ASSERT_AV_PUSH \ - assert(av); assert(val) -PERL_CALLCONV void Perl_av_reify(pTHX_ AV *av); -#define PERL_ARGS_ASSERT_AV_REIFY \ - assert(av) -PERL_CALLCONV SV* Perl_av_shift(pTHX_ AV *av) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_AV_SHIFT \ - assert(av) - -PERL_CALLCONV SV** Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val); -#define PERL_ARGS_ASSERT_AV_STORE \ - assert(av) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE SV** Perl_av_store_simple(pTHX_ AV *av, SSize_t key, SV *val); -#define PERL_ARGS_ASSERT_AV_STORE_SIMPLE \ - assert(av) -#endif -/* PERL_CALLCONV SSize_t av_tindex(pTHX_ AV *av) - __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_AV_TINDEX - -/* PERL_CALLCONV SSize_t av_top_index(pTHX_ AV *av) - __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_AV_TOP_INDEX - -PERL_CALLCONV void Perl_av_undef(pTHX_ AV *av); -#define PERL_ARGS_ASSERT_AV_UNDEF \ - assert(av) -PERL_CALLCONV void Perl_av_unshift(pTHX_ AV *av, SSize_t num); -#define PERL_ARGS_ASSERT_AV_UNSHIFT \ - assert(av) -PERL_CALLCONV OP* Perl_bind_match(pTHX_ I32 type, OP *left, OP *right) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_BIND_MATCH \ - assert(left); assert(right) -PERL_CALLCONV OP* Perl_block_end(pTHX_ I32 floor, OP* seq) - __attribute__warn_unused_result__; +PERL_CALLCONV SV ** +Perl_av_arylen_p(pTHX_ AV *av); +#define PERL_ARGS_ASSERT_AV_ARYLEN_P \ + assert(av) + +PERL_CALLCONV void +Perl_av_clear(pTHX_ AV *av); +#define PERL_ARGS_ASSERT_AV_CLEAR \ + assert(av) + +PERL_CALLCONV void +Perl_av_create_and_push(pTHX_ AV ** const avp, SV * const val); +#define PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH \ + assert(avp); assert(val) + +PERL_CALLCONV SV ** +Perl_av_create_and_unshift_one(pTHX_ AV ** const avp, SV * const val); +#define PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE \ + assert(avp); assert(val) + +PERL_CALLCONV SV * +Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags); +#define PERL_ARGS_ASSERT_AV_DELETE \ + assert(av) + +PERL_CALLCONV void +Perl_av_dump(pTHX_ AV *av); +#define PERL_ARGS_ASSERT_AV_DUMP + +PERL_CALLCONV bool +Perl_av_exists(pTHX_ AV *av, SSize_t key) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_AV_EXISTS \ + assert(av) + +PERL_CALLCONV void +Perl_av_extend(pTHX_ AV *av, SSize_t key); +#define PERL_ARGS_ASSERT_AV_EXTEND \ + assert(av) + +PERL_CALLCONV void +Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp, SV ***arrayp) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_AV_EXTEND_GUTS \ + assert(maxp); assert(allocp); assert(arrayp) + +PERL_CALLCONV SV ** +Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_AV_FETCH \ + assert(av) + +PERL_CALLCONV void +Perl_av_fill(pTHX_ AV *av, SSize_t fill); +#define PERL_ARGS_ASSERT_AV_FILL \ + assert(av) + +PERL_CALLCONV IV * +Perl_av_iter_p(pTHX_ AV *av); +#define PERL_ARGS_ASSERT_AV_ITER_P \ + assert(av) + +PERL_CALLCONV SSize_t +Perl_av_len(pTHX_ AV *av) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_AV_LEN \ + assert(av) + +PERL_CALLCONV AV * +Perl_av_make(pTHX_ SSize_t size, SV **strp) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_AV_MAKE \ + assert(strp) + +PERL_CALLCONV SV * +Perl_av_nonelem(pTHX_ AV *av, SSize_t ix) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_AV_NONELEM \ + assert(av) + +PERL_CALLCONV SV * +Perl_av_pop(pTHX_ AV *av); +#define PERL_ARGS_ASSERT_AV_POP \ + assert(av) + +PERL_CALLCONV void +Perl_av_push(pTHX_ AV *av, SV *val); +#define PERL_ARGS_ASSERT_AV_PUSH \ + assert(av); assert(val) + +PERL_CALLCONV void +Perl_av_reify(pTHX_ AV *av); +#define PERL_ARGS_ASSERT_AV_REIFY \ + assert(av) + +PERL_CALLCONV SV * +Perl_av_shift(pTHX_ AV *av) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_AV_SHIFT \ + assert(av) + +PERL_CALLCONV SV ** +Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val); +#define PERL_ARGS_ASSERT_AV_STORE \ + assert(av) + +/* PERL_CALLCONV SSize_t +av_tindex(pTHX_ AV *av) + __attribute__warn_unused_result__; */ + +/* PERL_CALLCONV SSize_t +av_top_index(pTHX_ AV *av) + __attribute__warn_unused_result__; */ + +PERL_CALLCONV void +Perl_av_undef(pTHX_ AV *av); +#define PERL_ARGS_ASSERT_AV_UNDEF \ + assert(av) + +PERL_CALLCONV void +Perl_av_unshift(pTHX_ AV *av, SSize_t num); +#define PERL_ARGS_ASSERT_AV_UNSHIFT \ + assert(av) + +PERL_CALLCONV OP * +Perl_bind_match(pTHX_ I32 type, OP *left, OP *right) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_BIND_MATCH \ + assert(left); assert(right) + +PERL_CALLCONV OP * +Perl_block_end(pTHX_ I32 floor, OP *seq) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_BLOCK_END -PERL_CALLCONV U8 Perl_block_gimme(pTHX) - __attribute__warn_unused_result__; +PERL_CALLCONV U8 +Perl_block_gimme(pTHX) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_BLOCK_GIMME -PERL_CALLCONV int Perl_block_start(pTHX_ int full) - __attribute__warn_unused_result__; +PERL_CALLCONV int +Perl_block_start(pTHX_ int full) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_BLOCK_START -PERL_CALLCONV void Perl_blockhook_register(pTHX_ BHK *hk); -#define PERL_ARGS_ASSERT_BLOCKHOOK_REGISTER \ - assert(hk) -PERL_CALLCONV void Perl_boot_core_PerlIO(pTHX); +PERL_CALLCONV void +Perl_blockhook_register(pTHX_ BHK *hk); +#define PERL_ARGS_ASSERT_BLOCKHOOK_REGISTER \ + assert(hk) + +PERL_CALLCONV void +Perl_boot_core_PerlIO(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_BOOT_CORE_PERLIO -PERL_CALLCONV void Perl_boot_core_UNIVERSAL(pTHX); + +PERL_CALLCONV void +Perl_boot_core_UNIVERSAL(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_BOOT_CORE_UNIVERSAL -PERL_CALLCONV void Perl_boot_core_builtin(pTHX); + +PERL_CALLCONV void +Perl_boot_core_builtin(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_BOOT_CORE_BUILTIN -PERL_CALLCONV void Perl_boot_core_mro(pTHX); + +PERL_CALLCONV void +Perl_boot_core_mro(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_BOOT_CORE_MRO -PERL_CALLCONV int Perl_bytes_cmp_utf8(pTHX_ const U8 *b, STRLEN blen, const U8 *u, STRLEN ulen); -#define PERL_ARGS_ASSERT_BYTES_CMP_UTF8 \ - assert(b); assert(u) -PERL_CALLCONV U8* Perl_bytes_from_utf8(pTHX_ const U8 *s, STRLEN *lenp, bool *is_utf8p); -#define PERL_ARGS_ASSERT_BYTES_FROM_UTF8 \ - assert(s); assert(lenp); assert(is_utf8p) -PERL_CALLCONV U8* Perl_bytes_from_utf8_loc(const U8 *s, STRLEN *lenp, bool *is_utf8p, const U8 ** first_unconverted); -#define PERL_ARGS_ASSERT_BYTES_FROM_UTF8_LOC \ - assert(s); assert(lenp); assert(is_utf8p) -PERL_CALLCONV U8* Perl_bytes_to_utf8(pTHX_ const U8 *s, STRLEN *lenp); -#define PERL_ARGS_ASSERT_BYTES_TO_UTF8 \ - assert(s); assert(lenp) -PERL_CALLCONV I32 Perl_call_argv(pTHX_ const char* sub_name, I32 flags, char** argv); -#define PERL_ARGS_ASSERT_CALL_ARGV \ - assert(sub_name); assert(argv) -PERL_CALLCONV void Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr); + +PERL_CALLCONV OP * +Perl_build_infix_plugin(pTHX_ OP *lhs, OP *rhs, void *tokendata) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_BUILD_INFIX_PLUGIN \ + assert(lhs); assert(rhs); assert(tokendata) + +PERL_CALLCONV int +Perl_bytes_cmp_utf8(pTHX_ const U8 *b, STRLEN blen, const U8 *u, STRLEN ulen); +#define PERL_ARGS_ASSERT_BYTES_CMP_UTF8 \ + assert(b); assert(u) + +PERL_CALLCONV U8 * +Perl_bytes_from_utf8(pTHX_ const U8 *s, STRLEN *lenp, bool *is_utf8p); +#define PERL_ARGS_ASSERT_BYTES_FROM_UTF8 \ + assert(s); assert(lenp); assert(is_utf8p) + +PERL_CALLCONV U8 * +Perl_bytes_from_utf8_loc(const U8 *s, STRLEN *lenp, bool *is_utf8p, const U8 **first_unconverted); +#define PERL_ARGS_ASSERT_BYTES_FROM_UTF8_LOC \ + assert(s); assert(lenp); assert(is_utf8p) + +PERL_CALLCONV U8 * +Perl_bytes_to_utf8(pTHX_ const U8 *s, STRLEN *lenp); +#define PERL_ARGS_ASSERT_BYTES_TO_UTF8 \ + assert(s); assert(lenp) + +PERL_CALLCONV I32 +Perl_call_argv(pTHX_ const char *sub_name, I32 flags, char **argv); +#define PERL_ARGS_ASSERT_CALL_ARGV \ + assert(sub_name); assert(argv) + +PERL_CALLCONV void +Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr); #define PERL_ARGS_ASSERT_CALL_ATEXIT -PERL_CALLCONV void Perl_call_list(pTHX_ I32 oldscope, AV *paramList); -#define PERL_ARGS_ASSERT_CALL_LIST \ - assert(paramList) -PERL_CALLCONV I32 Perl_call_method(pTHX_ const char* methname, I32 flags); -#define PERL_ARGS_ASSERT_CALL_METHOD \ - assert(methname) -PERL_CALLCONV I32 Perl_call_pv(pTHX_ const char* sub_name, I32 flags); -#define PERL_ARGS_ASSERT_CALL_PV \ - assert(sub_name) -PERL_CALLCONV I32 Perl_call_sv(pTHX_ SV* sv, volatile I32 flags); -#define PERL_ARGS_ASSERT_CALL_SV \ - assert(sv) -PERL_CALLCONV const PERL_CONTEXT * Perl_caller_cx(pTHX_ I32 level, const PERL_CONTEXT **dbcxp); + +PERL_CALLCONV void +Perl_call_list(pTHX_ I32 oldscope, AV *paramList); +#define PERL_ARGS_ASSERT_CALL_LIST \ + assert(paramList) + +PERL_CALLCONV I32 +Perl_call_method(pTHX_ const char *methname, I32 flags); +#define PERL_ARGS_ASSERT_CALL_METHOD \ + assert(methname) + +PERL_CALLCONV I32 +Perl_call_pv(pTHX_ const char *sub_name, I32 flags); +#define PERL_ARGS_ASSERT_CALL_PV \ + assert(sub_name) + +PERL_CALLCONV I32 +Perl_call_sv(pTHX_ SV *sv, volatile I32 flags); +#define PERL_ARGS_ASSERT_CALL_SV \ + assert(sv) + +PERL_CALLCONV const PERL_CONTEXT * +Perl_caller_cx(pTHX_ I32 level, const PERL_CONTEXT **dbcxp); #define PERL_ARGS_ASSERT_CALLER_CX -PERL_CALLCONV Malloc_t Perl_calloc(MEM_SIZE elements, MEM_SIZE size) - __attribute__malloc__ - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CALLOC -PERL_CALLCONV bool Perl_cando(pTHX_ Mode_t mode, bool effective, const Stat_t* statbufp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CANDO \ - assert(statbufp) +PERL_CALLCONV Malloc_t +Perl_calloc(MEM_SIZE elements, MEM_SIZE size) + __attribute__malloc__ + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_CALLOC -PERL_CALLCONV I32 Perl_cast_i32(NV f) - __attribute__warn_unused_result__; +PERL_CALLCONV bool +Perl_cando(pTHX_ Mode_t mode, bool effective, const Stat_t *statbufp) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_CANDO \ + assert(statbufp) + +PERL_CALLCONV I32 +Perl_cast_i32(NV f) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_CAST_I32 -PERL_CALLCONV IV Perl_cast_iv(NV f) - __attribute__warn_unused_result__; +PERL_CALLCONV IV +Perl_cast_iv(NV f) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_CAST_IV -PERL_CALLCONV U32 Perl_cast_ulong(NV f) - __attribute__warn_unused_result__; +PERL_CALLCONV U32 +Perl_cast_ulong(NV f) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_CAST_ULONG -PERL_CALLCONV UV Perl_cast_uv(NV f) - __attribute__warn_unused_result__; +PERL_CALLCONV UV +Perl_cast_uv(NV f) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_CAST_UV -PERL_CALLCONV bool Perl_check_utf8_print(pTHX_ const U8 *s, const STRLEN len); -#define PERL_ARGS_ASSERT_CHECK_UTF8_PRINT \ - assert(s) -PERL_CALLCONV OP * Perl_ck_anoncode(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_ANONCODE \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_backtick(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_BACKTICK \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_bitop(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_BITOP \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_cmp(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_CMP \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_concat(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_CONCAT \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_defined(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_DEFINED \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_delete(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_DELETE \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_each(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_EACH \ - assert(o) - -PERL_CALLCONV OP* Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv); -#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_CORE \ - assert(entersubop); assert(namegv); assert(protosv) -PERL_CALLCONV OP* Perl_ck_entersub_args_list(pTHX_ OP *entersubop); -#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_LIST \ - assert(entersubop) -PERL_CALLCONV OP* Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv); -#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO \ - assert(entersubop); assert(namegv); assert(protosv) -PERL_CALLCONV OP* Perl_ck_entersub_args_proto_or_list(pTHX_ OP *entersubop, GV *namegv, SV *protosv); -#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO_OR_LIST \ - assert(entersubop); assert(namegv); assert(protosv) -PERL_CALLCONV OP * Perl_ck_eof(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_EOF \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_eval(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_EVAL \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_exec(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_EXEC \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_exists(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_EXISTS \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_ftst(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_FTST \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_fun(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_FUN \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_glob(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_GLOB \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_grep(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_GREP \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_index(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_INDEX \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_isa(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_ISA \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_join(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_JOIN \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_length(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_LENGTH \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_lfun(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_LFUN \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_listiob(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_LISTIOB \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_match(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_MATCH \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_method(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_METHOD \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_null(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_NULL \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_open(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_OPEN \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_prototype(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_PROTOTYPE \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_readline(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_READLINE \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_refassign(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_REFASSIGN \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_repeat(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_REPEAT \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_require(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_REQUIRE \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_return(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_RETURN \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_rfun(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_RFUN \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_rvconst(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_RVCONST \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_sassign(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_SASSIGN \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_select(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_SELECT \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_shift(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_SHIFT \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_smartmatch(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_SMARTMATCH \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_sort(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_SORT \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_spair(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_SPAIR \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_split(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_SPLIT \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_stringify(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_STRINGIFY \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_subr(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_SUBR \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_substr(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_SUBSTR \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_svconst(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_SVCONST \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_tell(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_TELL \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_trunc(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_TRUNC \ - assert(o) - -PERL_CALLCONV OP * Perl_ck_trycatch(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CK_TRYCATCH \ - assert(o) - -PERL_CALLCONV void Perl_ck_warner(pTHX_ U32 err, const char* pat, ...) - __attribute__format__(__printf__,pTHX_2,pTHX_3); -#define PERL_ARGS_ASSERT_CK_WARNER \ - assert(pat) - -PERL_CALLCONV void Perl_ck_warner_d(pTHX_ U32 err, const char* pat, ...) - __attribute__format__(__printf__,pTHX_2,pTHX_3); -#define PERL_ARGS_ASSERT_CK_WARNER_D \ - assert(pat) - -PERL_CALLCONV bool Perl_ckwarn(pTHX_ U32 w) - __attribute__warn_unused_result__ - __attribute__pure__; +PERL_CALLCONV bool +Perl_check_utf8_print(pTHX_ const U8 *s, const STRLEN len) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_CHECK_UTF8_PRINT \ + assert(s) + +PERL_CALLCONV OP * +Perl_ck_entersub_args_core(pTHX_ OP *entersubop, GV *namegv, SV *protosv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_CORE \ + assert(entersubop); assert(namegv); assert(protosv) + +PERL_CALLCONV OP * +Perl_ck_entersub_args_list(pTHX_ OP *entersubop); +#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_LIST \ + assert(entersubop) + +PERL_CALLCONV OP * +Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv); +#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO \ + assert(entersubop); assert(namegv); assert(protosv) + +PERL_CALLCONV OP * +Perl_ck_entersub_args_proto_or_list(pTHX_ OP *entersubop, GV *namegv, SV *protosv); +#define PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_PROTO_OR_LIST \ + assert(entersubop); assert(namegv); assert(protosv) + +PERL_CALLCONV void +Perl_ck_warner(pTHX_ U32 err, const char *pat, ...) + __attribute__format__(__printf__,pTHX_2,pTHX_3); +#define PERL_ARGS_ASSERT_CK_WARNER \ + assert(pat) + +PERL_CALLCONV void +Perl_ck_warner_d(pTHX_ U32 err, const char *pat, ...) + __attribute__format__(__printf__,pTHX_2,pTHX_3); +#define PERL_ARGS_ASSERT_CK_WARNER_D \ + assert(pat) + +PERL_CALLCONV bool +Perl_ckwarn(pTHX_ U32 w) + __attribute__warn_unused_result__ + __attribute__pure__; #define PERL_ARGS_ASSERT_CKWARN -PERL_CALLCONV bool Perl_ckwarn_d(pTHX_ U32 w) - __attribute__warn_unused_result__ - __attribute__pure__; +PERL_CALLCONV bool +Perl_ckwarn_d(pTHX_ U32 w) + __attribute__warn_unused_result__ + __attribute__pure__; #define PERL_ARGS_ASSERT_CKWARN_D -PERL_CALLCONV void Perl_clear_defarray(pTHX_ AV* av, bool abandon); -#define PERL_ARGS_ASSERT_CLEAR_DEFARRAY \ - assert(av) -PERL_CALLCONV const COP* Perl_closest_cop(pTHX_ const COP *cop, const OP *o, const OP *curop, bool opnext); -#define PERL_ARGS_ASSERT_CLOSEST_COP \ - assert(cop) -PERL_CALLCONV OP* Perl_cmpchain_extend(pTHX_ I32 type, OP* ch, OP* right) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CMPCHAIN_EXTEND \ - assert(ch) - -PERL_CALLCONV OP* Perl_cmpchain_finish(pTHX_ OP* ch) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CMPCHAIN_FINISH \ - assert(ch) - -PERL_CALLCONV OP* Perl_cmpchain_start(pTHX_ I32 type, OP* left, OP* right) - __attribute__warn_unused_result__; +PERL_CALLCONV void +Perl_clear_defarray(pTHX_ AV *av, bool abandon); +#define PERL_ARGS_ASSERT_CLEAR_DEFARRAY \ + assert(av) + +PERL_CALLCONV const COP * +Perl_closest_cop(pTHX_ const COP *cop, const OP *o, const OP *curop, bool opnext) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_CLOSEST_COP \ + assert(cop) + +PERL_CALLCONV OP * +Perl_cmpchain_extend(pTHX_ I32 type, OP *ch, OP *right) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_CMPCHAIN_EXTEND \ + assert(ch) + +PERL_CALLCONV OP * +Perl_cmpchain_finish(pTHX_ OP *ch) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_CMPCHAIN_FINISH \ + assert(ch) + +PERL_CALLCONV OP * +Perl_cmpchain_start(pTHX_ I32 type, OP *left, OP *right) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_CMPCHAIN_START -PERL_CALLCONV const char * Perl_cntrl_to_mnemonic(const U8 c) - __attribute__warn_unused_result__; +PERL_CALLCONV const char * +Perl_cntrl_to_mnemonic(const U8 c) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_CNTRL_TO_MNEMONIC -PERL_CALLCONV const char * Perl_cop_fetch_label(pTHX_ COP *const cop, STRLEN *len, U32 *flags); -#define PERL_ARGS_ASSERT_COP_FETCH_LABEL \ - assert(cop) -PERL_CALLCONV void Perl_cop_store_label(pTHX_ COP *const cop, const char *label, STRLEN len, U32 flags); -#define PERL_ARGS_ASSERT_COP_STORE_LABEL \ - assert(cop); assert(label) -PERL_CALLCONV SV * Perl_core_prototype(pTHX_ SV *sv, const char *name, const int code, int * const opnum); -#define PERL_ARGS_ASSERT_CORE_PROTOTYPE \ - assert(name) -PERL_CALLCONV OP * Perl_coresub_op(pTHX_ SV *const coreargssv, const int code, const int opnum); -#define PERL_ARGS_ASSERT_CORESUB_OP \ - assert(coreargssv) -PERL_CALLCONV void Perl_create_eval_scope(pTHX_ OP *retop, U32 flags); +PERL_CALLCONV const char * +Perl_cop_fetch_label(pTHX_ COP * const cop, STRLEN *len, U32 *flags); +#define PERL_ARGS_ASSERT_COP_FETCH_LABEL \ + assert(cop) + +PERL_CALLCONV void +Perl_cop_store_label(pTHX_ COP * const cop, const char *label, STRLEN len, U32 flags); +#define PERL_ARGS_ASSERT_COP_STORE_LABEL \ + assert(cop); assert(label) + +PERL_CALLCONV SV * +Perl_core_prototype(pTHX_ SV *sv, const char *name, const int code, int * const opnum) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_CORE_PROTOTYPE \ + assert(name) + +PERL_CALLCONV OP * +Perl_coresub_op(pTHX_ SV * const coreargssv, const int code, const int opnum) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_CORESUB_OP \ + assert(coreargssv) + +PERL_CALLCONV void +Perl_create_eval_scope(pTHX_ OP *retop, U32 flags) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_CREATE_EVAL_SCOPE -PERL_CALLCONV_NO_RET void Perl_croak(pTHX_ const char* pat, ...) - __attribute__noreturn__ - __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2); + +PERL_CALLCONV_NO_RET void +Perl_croak(pTHX_ const char *pat, ...) + __attribute__noreturn__ + __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2); #define PERL_ARGS_ASSERT_CROAK -PERL_CALLCONV_NO_RET void Perl_croak_caller(const char* pat, ...) - __attribute__noreturn__ - __attribute__format__null_ok__(__printf__,1,2); +PERL_CALLCONV_NO_RET void +Perl_croak_caller(const char *pat, ...) + __attribute__noreturn__ + __attribute__visibility__("hidden") + __attribute__format__null_ok__(__printf__,1,2); #define PERL_ARGS_ASSERT_CROAK_CALLER -PERL_CALLCONV_NO_RET void Perl_croak_memory_wrap(void) - __attribute__noreturn__; +PERL_STATIC_NO_RET void +Perl_croak_memory_wrap(void) + __attribute__noreturn__; #define PERL_ARGS_ASSERT_CROAK_MEMORY_WRAP -PERL_CALLCONV_NO_RET void Perl_croak_no_mem(void) - __attribute__noreturn__; +PERL_CALLCONV_NO_RET void +Perl_croak_no_mem(void) + __attribute__noreturn__ + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_CROAK_NO_MEM -PERL_CALLCONV_NO_RET void Perl_croak_no_modify(void) - __attribute__noreturn__; +PERL_CALLCONV_NO_RET void +Perl_croak_no_modify(void) + __attribute__noreturn__; #define PERL_ARGS_ASSERT_CROAK_NO_MODIFY -PERL_CALLCONV_NO_RET void Perl_croak_popstack(void) - __attribute__noreturn__; +PERL_CALLCONV_NO_RET void +Perl_croak_popstack(void) + __attribute__noreturn__; #define PERL_ARGS_ASSERT_CROAK_POPSTACK -PERL_CALLCONV_NO_RET void Perl_croak_sv(pTHX_ SV *baseex) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_CROAK_SV \ - assert(baseex) - -PERL_CALLCONV_NO_RET void Perl_croak_xs_usage(const CV *const cv, const char *const params) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_CROAK_XS_USAGE \ - assert(cv); assert(params) +PERL_CALLCONV_NO_RET void +Perl_croak_sv(pTHX_ SV *baseex) + __attribute__noreturn__; +#define PERL_ARGS_ASSERT_CROAK_SV \ + assert(baseex) + +PERL_CALLCONV_NO_RET void +Perl_croak_xs_usage(const CV * const cv, const char * const params) + __attribute__noreturn__; +#define PERL_ARGS_ASSERT_CROAK_XS_USAGE \ + assert(cv); assert(params) -PERL_CALLCONV Signal_t Perl_csighandler1(int sig); +PERL_CALLCONV Signal_t +Perl_csighandler1(int sig); #define PERL_ARGS_ASSERT_CSIGHANDLER1 -PERL_CALLCONV Signal_t Perl_csighandler3(int sig, Siginfo_t *info, void *uap); + +PERL_CALLCONV Signal_t +Perl_csighandler3(int sig, Siginfo_t *info, void *uap); #define PERL_ARGS_ASSERT_CSIGHANDLER3 -PERL_CALLCONV regexp_engine const * Perl_current_re_engine(pTHX); + +PERL_CALLCONV regexp_engine const * +Perl_current_re_engine(pTHX); #define PERL_ARGS_ASSERT_CURRENT_RE_ENGINE -#ifndef NO_MATHOMS -PERL_CALLCONV const char * Perl_custom_op_desc(pTHX_ const OP *o) - __attribute__deprecated__ - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CUSTOM_OP_DESC \ - assert(o) -#endif - -PERL_CALLCONV XOPRETANY Perl_custom_op_get_field(pTHX_ const OP *o, const xop_flags_enum field) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CUSTOM_OP_GET_FIELD \ - assert(o) - -#ifndef NO_MATHOMS -PERL_CALLCONV const char * Perl_custom_op_name(pTHX_ const OP *o) - __attribute__deprecated__ - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CUSTOM_OP_NAME \ - assert(o) -#endif - -PERL_CALLCONV void Perl_custom_op_register(pTHX_ Perl_ppaddr_t ppaddr, const XOP *xop); -#define PERL_ARGS_ASSERT_CUSTOM_OP_REGISTER \ - assert(ppaddr); assert(xop) -PERL_CALLCONV void Perl_cv_ckproto_len_flags(pTHX_ const CV* cv, const GV* gv, const char* p, const STRLEN len, const U32 flags); -#define PERL_ARGS_ASSERT_CV_CKPROTO_LEN_FLAGS \ - assert(cv) -PERL_CALLCONV CV* Perl_cv_clone(pTHX_ CV* proto); -#define PERL_ARGS_ASSERT_CV_CLONE \ - assert(proto) -PERL_CALLCONV CV* Perl_cv_clone_into(pTHX_ CV* proto, CV *target); -#define PERL_ARGS_ASSERT_CV_CLONE_INTO \ - assert(proto); assert(target) -PERL_CALLCONV SV* Perl_cv_const_sv(const CV *const cv) - __attribute__warn_unused_result__; + +PERL_CALLCONV XOPRETANY +Perl_custom_op_get_field(pTHX_ const OP *o, const xop_flags_enum field) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_CUSTOM_OP_GET_FIELD \ + assert(o) + +PERL_CALLCONV void +Perl_custom_op_register(pTHX_ Perl_ppaddr_t ppaddr, const XOP *xop); +#define PERL_ARGS_ASSERT_CUSTOM_OP_REGISTER \ + assert(ppaddr); assert(xop) + +PERL_CALLCONV void +Perl_cv_ckproto_len_flags(pTHX_ const CV *cv, const GV *gv, const char *p, const STRLEN len, const U32 flags); +#define PERL_ARGS_ASSERT_CV_CKPROTO_LEN_FLAGS \ + assert(cv) + +PERL_CALLCONV CV * +Perl_cv_clone(pTHX_ CV *proto); +#define PERL_ARGS_ASSERT_CV_CLONE \ + assert(proto) + +PERL_CALLCONV CV * +Perl_cv_clone_into(pTHX_ CV *proto, CV *target) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_CV_CLONE_INTO \ + assert(proto); assert(target) + +PERL_CALLCONV SV * +Perl_cv_const_sv(const CV * const cv) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_CV_CONST_SV -PERL_CALLCONV SV* Perl_cv_const_sv_or_av(const CV *const cv) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_cv_const_sv_or_av(const CV * const cv) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_CV_CONST_SV_OR_AV -PERL_CALLCONV void Perl_cv_forget_slab(pTHX_ CV *cv); +PERL_CALLCONV void +Perl_cv_forget_slab(pTHX_ CV *cv) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_CV_FORGET_SLAB -PERL_CALLCONV void Perl_cv_get_call_checker(pTHX_ CV *cv, Perl_call_checker *ckfun_p, SV **ckobj_p); -#define PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER \ - assert(cv); assert(ckfun_p); assert(ckobj_p) -PERL_CALLCONV void Perl_cv_get_call_checker_flags(pTHX_ CV *cv, U32 gflags, Perl_call_checker *ckfun_p, SV **ckobj_p, U32 *ckflags_p); -#define PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER_FLAGS \ - assert(cv); assert(ckfun_p); assert(ckobj_p); assert(ckflags_p) -PERL_CALLCONV SV * Perl_cv_name(pTHX_ CV *cv, SV *sv, U32 flags); -#define PERL_ARGS_ASSERT_CV_NAME \ - assert(cv) -PERL_CALLCONV void Perl_cv_set_call_checker(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj); -#define PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER \ - assert(cv); assert(ckfun); assert(ckobj) -PERL_CALLCONV void Perl_cv_set_call_checker_flags(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj, U32 ckflags); -#define PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER_FLAGS \ - assert(cv); assert(ckfun); assert(ckobj) -PERL_CALLCONV void Perl_cv_undef(pTHX_ CV* cv); -#define PERL_ARGS_ASSERT_CV_UNDEF \ - assert(cv) -PERL_CALLCONV void Perl_cv_undef_flags(pTHX_ CV* cv, U32 flags); -#define PERL_ARGS_ASSERT_CV_UNDEF_FLAGS \ - assert(cv) -PERL_CALLCONV GV * Perl_cvgv_from_hek(pTHX_ CV* cv); -#define PERL_ARGS_ASSERT_CVGV_FROM_HEK \ - assert(cv) -PERL_CALLCONV void Perl_cvgv_set(pTHX_ CV* cv, GV* gv); -#define PERL_ARGS_ASSERT_CVGV_SET \ - assert(cv) -PERL_CALLCONV void Perl_cvstash_set(pTHX_ CV* cv, HV* stash); -#define PERL_ARGS_ASSERT_CVSTASH_SET \ - assert(cv) -PERL_CALLCONV void Perl_cx_dump(pTHX_ PERL_CONTEXT* cx); -#define PERL_ARGS_ASSERT_CX_DUMP \ - assert(cx) -PERL_CALLCONV I32 Perl_cxinc(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CXINC -PERL_CALLCONV void Perl_deb(pTHX_ const char* pat, ...) - __attribute__format__(__printf__,pTHX_1,pTHX_2); -#define PERL_ARGS_ASSERT_DEB \ - assert(pat) +PERL_CALLCONV void +Perl_cv_get_call_checker(pTHX_ CV *cv, Perl_call_checker *ckfun_p, SV **ckobj_p); +#define PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER \ + assert(cv); assert(ckfun_p); assert(ckobj_p) + +PERL_CALLCONV void +Perl_cv_get_call_checker_flags(pTHX_ CV *cv, U32 gflags, Perl_call_checker *ckfun_p, SV **ckobj_p, U32 *ckflags_p); +#define PERL_ARGS_ASSERT_CV_GET_CALL_CHECKER_FLAGS \ + assert(cv); assert(ckfun_p); assert(ckobj_p); assert(ckflags_p) + +PERL_CALLCONV SV * +Perl_cv_name(pTHX_ CV *cv, SV *sv, U32 flags); +#define PERL_ARGS_ASSERT_CV_NAME \ + assert(cv) + +PERL_CALLCONV void +Perl_cv_set_call_checker(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj); +#define PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER \ + assert(cv); assert(ckfun); assert(ckobj) + +PERL_CALLCONV void +Perl_cv_set_call_checker_flags(pTHX_ CV *cv, Perl_call_checker ckfun, SV *ckobj, U32 ckflags); +#define PERL_ARGS_ASSERT_CV_SET_CALL_CHECKER_FLAGS \ + assert(cv); assert(ckfun); assert(ckobj) + +PERL_CALLCONV void +Perl_cv_undef(pTHX_ CV *cv); +#define PERL_ARGS_ASSERT_CV_UNDEF \ + assert(cv) + +PERL_CALLCONV void +Perl_cv_undef_flags(pTHX_ CV *cv, U32 flags) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_CV_UNDEF_FLAGS \ + assert(cv) + +PERL_CALLCONV GV * +Perl_cvgv_from_hek(pTHX_ CV *cv); +#define PERL_ARGS_ASSERT_CVGV_FROM_HEK \ + assert(cv) + +PERL_CALLCONV void +Perl_cvgv_set(pTHX_ CV *cv, GV *gv); +#define PERL_ARGS_ASSERT_CVGV_SET \ + assert(cv) + +PERL_CALLCONV void +Perl_cvstash_set(pTHX_ CV *cv, HV *stash); +#define PERL_ARGS_ASSERT_CVSTASH_SET \ + assert(cv) + +PERL_CALLCONV void +Perl_cx_dump(pTHX_ PERL_CONTEXT *cx); +#define PERL_ARGS_ASSERT_CX_DUMP \ + assert(cx) + +PERL_CALLCONV I32 +Perl_cxinc(pTHX) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_CXINC -PERL_CALLCONV void Perl_deb_stack_all(pTHX); +PERL_CALLCONV void +Perl_deb(pTHX_ const char *pat, ...) + __attribute__format__(__printf__,pTHX_1,pTHX_2); +#define PERL_ARGS_ASSERT_DEB \ + assert(pat) + +PERL_CALLCONV void +Perl_deb_stack_all(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_DEB_STACK_ALL -PERL_CALLCONV I32 Perl_debop(pTHX_ const OP* o); -#define PERL_ARGS_ASSERT_DEBOP \ - assert(o) -PERL_CALLCONV void Perl_debprofdump(pTHX); + +PERL_CALLCONV I32 +Perl_debop(pTHX_ const OP *o); +#define PERL_ARGS_ASSERT_DEBOP \ + assert(o) + +PERL_CALLCONV void +Perl_debprofdump(pTHX); #define PERL_ARGS_ASSERT_DEBPROFDUMP -PERL_CALLCONV I32 Perl_debstack(pTHX); + +PERL_CALLCONV I32 +Perl_debstack(pTHX); #define PERL_ARGS_ASSERT_DEBSTACK -PERL_CALLCONV I32 Perl_debstackptrs(pTHX); + +PERL_CALLCONV I32 +Perl_debstackptrs(pTHX); #define PERL_ARGS_ASSERT_DEBSTACKPTRS -PERL_CALLCONV void Perl_debug_hash_seed(pTHX_ bool via_debug_h); + +PERL_CALLCONV void +Perl_debug_hash_seed(pTHX_ bool via_debug_h) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_DEBUG_HASH_SEED -PERL_CALLCONV SV * Perl_defelem_target(pTHX_ SV *sv, MAGIC *mg) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DEFELEM_TARGET \ - assert(sv) -PERL_CALLCONV void Perl_delete_eval_scope(pTHX); +PERL_CALLCONV SV * +Perl_defelem_target(pTHX_ SV *sv, MAGIC *mg) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DEFELEM_TARGET \ + assert(sv) + +PERL_CALLCONV void +Perl_delete_eval_scope(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_DELETE_EVAL_SCOPE -PERL_CALLCONV char* Perl_delimcpy(char* to, const char* to_end, const char* from, const char* from_end, const int delim, I32* retlen); -#define PERL_ARGS_ASSERT_DELIMCPY \ - assert(to); assert(to_end); assert(from); assert(from_end); assert(retlen) -PERL_CALLCONV char* Perl_delimcpy_no_escape(char* to, const char* to_end, const char* from, const char* from_end, const int delim, I32* retlen); -#define PERL_ARGS_ASSERT_DELIMCPY_NO_ESCAPE \ - assert(to); assert(to_end); assert(from); assert(from_end); assert(retlen) -PERL_CALLCONV void Perl_despatch_signals(pTHX); + +PERL_CALLCONV char * +Perl_delimcpy(char *to, const char *to_end, const char *from, const char *from_end, const int delim, I32 *retlen); +#define PERL_ARGS_ASSERT_DELIMCPY \ + assert(to); assert(to_end); assert(from); assert(from_end); assert(retlen) + +PERL_CALLCONV char * +Perl_delimcpy_no_escape(char *to, const char *to_end, const char *from, const char *from_end, const int delim, I32 *retlen); +#define PERL_ARGS_ASSERT_DELIMCPY_NO_ESCAPE \ + assert(to); assert(to_end); assert(from); assert(from_end); assert(retlen) + +PERL_CALLCONV void +Perl_despatch_signals(pTHX); #define PERL_ARGS_ASSERT_DESPATCH_SIGNALS -PERL_CALLCONV_NO_RET OP* Perl_die(pTHX_ const char* pat, ...) - __attribute__noreturn__ - __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2); + +PERL_CALLCONV_NO_RET OP * +Perl_die(pTHX_ const char *pat, ...) + __attribute__noreturn__ + __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2); #define PERL_ARGS_ASSERT_DIE -PERL_CALLCONV_NO_RET OP* Perl_die_sv(pTHX_ SV *baseex) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_DIE_SV \ - assert(baseex) - -PERL_CALLCONV_NO_RET void Perl_die_unwind(pTHX_ SV* msv) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_DIE_UNWIND \ - assert(msv) - -#ifndef NO_MATHOMS -PERL_CALLCONV bool Perl_do_aexec(pTHX_ SV* really, SV** mark, SV** sp); -#define PERL_ARGS_ASSERT_DO_AEXEC \ - assert(mark); assert(sp) -#endif -PERL_CALLCONV bool Perl_do_aexec5(pTHX_ SV* really, SV** mark, SV** sp, int fd, int do_report); -#define PERL_ARGS_ASSERT_DO_AEXEC5 \ - assert(mark); assert(sp) -#ifndef NO_MATHOMS -PERL_CALLCONV int Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_DO_BINMODE \ - assert(fp) -#endif +PERL_CALLCONV_NO_RET OP * +Perl_die_sv(pTHX_ SV *baseex) + __attribute__noreturn__; +#define PERL_ARGS_ASSERT_DIE_SV \ + assert(baseex) + +PERL_CALLCONV_NO_RET void +Perl_die_unwind(pTHX_ SV *msv) + __attribute__noreturn__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DIE_UNWIND \ + assert(msv) + +PERL_CALLCONV bool +Perl_do_aexec5(pTHX_ SV *really, SV **mark, SV **sp, int fd, int do_report) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_AEXEC5 \ + assert(mark); assert(sp) -PERL_CALLCONV bool Perl_do_close(pTHX_ GV* gv, bool not_implicit); +PERL_CALLCONV bool +Perl_do_close(pTHX_ GV *gv, bool is_explicit); #define PERL_ARGS_ASSERT_DO_CLOSE -PERL_CALLCONV void Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full); -#define PERL_ARGS_ASSERT_DO_DUMP_PAD \ - assert(file) -PERL_CALLCONV bool Perl_do_eof(pTHX_ GV* gv); -#define PERL_ARGS_ASSERT_DO_EOF \ - assert(gv) -PERL_CALLCONV void Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv); -#define PERL_ARGS_ASSERT_DO_GV_DUMP \ - assert(file); assert(name) -PERL_CALLCONV void Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv); -#define PERL_ARGS_ASSERT_DO_GVGV_DUMP \ - assert(file); assert(name) -PERL_CALLCONV void Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv); -#define PERL_ARGS_ASSERT_DO_HV_DUMP \ - assert(file); assert(name) -PERL_CALLCONV void Perl_do_join(pTHX_ SV *sv, SV *delim, SV **mark, SV **sp); -#define PERL_ARGS_ASSERT_DO_JOIN \ - assert(sv); assert(delim); assert(mark); assert(sp) -PERL_CALLCONV void Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim); -#define PERL_ARGS_ASSERT_DO_MAGIC_DUMP \ - assert(file) -PERL_CALLCONV I32 Perl_do_ncmp(pTHX_ SV *const left, SV *const right) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DO_NCMP \ - assert(left); assert(right) - -PERL_CALLCONV void Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o); -#define PERL_ARGS_ASSERT_DO_OP_DUMP \ - assert(file) -#ifndef NO_MATHOMS -PERL_CALLCONV bool Perl_do_open(pTHX_ GV* gv, const char* name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO* supplied_fp); -#define PERL_ARGS_ASSERT_DO_OPEN \ - assert(gv); assert(name) -#endif -PERL_CALLCONV bool Perl_do_open6(pTHX_ GV *gv, const char *oname, STRLEN len, PerlIO *supplied_fp, SV **svp, U32 num); -#define PERL_ARGS_ASSERT_DO_OPEN6 \ - assert(gv); assert(oname) -#ifndef NO_MATHOMS -PERL_CALLCONV bool Perl_do_open9(pTHX_ GV *gv, const char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs, I32 num) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_DO_OPEN9 \ - assert(gv); assert(name); assert(svs) -#endif - -PERL_CALLCONV bool Perl_do_open_raw(pTHX_ GV *gv, const char *oname, STRLEN len, int rawmode, int rawperm, Stat_t *statbufp); -#define PERL_ARGS_ASSERT_DO_OPEN_RAW \ - assert(gv); assert(oname) -PERL_CALLCONV bool Perl_do_openn(pTHX_ GV *gv, const char *oname, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV **svp, I32 num); -#define PERL_ARGS_ASSERT_DO_OPENN \ - assert(gv); assert(oname) -PERL_CALLCONV void Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm); -#define PERL_ARGS_ASSERT_DO_PMOP_DUMP \ - assert(file) -PERL_CALLCONV bool Perl_do_print(pTHX_ SV* sv, PerlIO* fp); -#define PERL_ARGS_ASSERT_DO_PRINT \ - assert(fp) -PERL_CALLCONV OP* Perl_do_readline(pTHX) - __attribute__warn_unused_result__; + +PERL_CALLCONV void +Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_DUMP_PAD \ + assert(file) + +PERL_CALLCONV bool +Perl_do_eof(pTHX_ GV *gv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_EOF \ + assert(gv) + +PERL_CALLCONV void +Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv); +#define PERL_ARGS_ASSERT_DO_GV_DUMP \ + assert(file); assert(name) + +PERL_CALLCONV void +Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv); +#define PERL_ARGS_ASSERT_DO_GVGV_DUMP \ + assert(file); assert(name) + +PERL_CALLCONV void +Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv); +#define PERL_ARGS_ASSERT_DO_HV_DUMP \ + assert(file); assert(name) + +PERL_CALLCONV void +Perl_do_join(pTHX_ SV *sv, SV *delim, SV **mark, SV **sp); +#define PERL_ARGS_ASSERT_DO_JOIN \ + assert(sv); assert(delim); assert(mark); assert(sp) + +PERL_CALLCONV void +Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim); +#define PERL_ARGS_ASSERT_DO_MAGIC_DUMP \ + assert(file) + +PERL_CALLCONV I32 +Perl_do_ncmp(pTHX_ SV * const left, SV * const right) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_NCMP \ + assert(left); assert(right) + +PERL_CALLCONV void +Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o); +#define PERL_ARGS_ASSERT_DO_OP_DUMP \ + assert(file) + +PERL_CALLCONV bool +Perl_do_open6(pTHX_ GV *gv, const char *oname, STRLEN len, PerlIO *supplied_fp, SV **svp, U32 num) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_OPEN6 \ + assert(gv); assert(oname) + +PERL_CALLCONV bool +Perl_do_open_raw(pTHX_ GV *gv, const char *oname, STRLEN len, int rawmode, int rawperm, Stat_t *statbufp) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_OPEN_RAW \ + assert(gv); assert(oname) + +PERL_CALLCONV bool +Perl_do_openn(pTHX_ GV *gv, const char *oname, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV **svp, I32 num); +#define PERL_ARGS_ASSERT_DO_OPENN \ + assert(gv); assert(oname) + +PERL_CALLCONV void +Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm); +#define PERL_ARGS_ASSERT_DO_PMOP_DUMP \ + assert(file) + +PERL_CALLCONV bool +Perl_do_print(pTHX_ SV *sv, PerlIO *fp) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_PRINT \ + assert(fp) + +PERL_CALLCONV OP * +Perl_do_readline(pTHX) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_DO_READLINE -PERL_CALLCONV bool Perl_do_seek(pTHX_ GV* gv, Off_t pos, int whence); +PERL_CALLCONV bool +Perl_do_seek(pTHX_ GV *gv, Off_t pos, int whence) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_DO_SEEK -PERL_CALLCONV void Perl_do_sprintf(pTHX_ SV* sv, SSize_t len, SV** sarg); -#define PERL_ARGS_ASSERT_DO_SPRINTF \ - assert(sv); assert(sarg) -PERL_CALLCONV void Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim); -#define PERL_ARGS_ASSERT_DO_SV_DUMP \ - assert(file) -PERL_CALLCONV Off_t Perl_do_sysseek(pTHX_ GV* gv, Off_t pos, int whence); -#define PERL_ARGS_ASSERT_DO_SYSSEEK \ - assert(gv) -PERL_CALLCONV Off_t Perl_do_tell(pTHX_ GV* gv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DO_TELL \ - assert(gv) - -PERL_CALLCONV Size_t Perl_do_trans(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_DO_TRANS \ - assert(sv) -PERL_CALLCONV I16 Perl_do_uniprop_match(const char * const key, const U16 key_len) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DO_UNIPROP_MATCH \ - assert(key) - -PERL_CALLCONV UV Perl_do_vecget(pTHX_ SV* sv, STRLEN offset, int size); -#define PERL_ARGS_ASSERT_DO_VECGET \ - assert(sv) -PERL_CALLCONV void Perl_do_vecset(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_DO_VECSET \ - assert(sv) -PERL_CALLCONV void Perl_do_vop(pTHX_ I32 optype, SV* sv, SV* left, SV* right); -#define PERL_ARGS_ASSERT_DO_VOP \ - assert(sv); assert(left); assert(right) -PERL_CALLCONV OP* Perl_dofile(pTHX_ OP* term, I32 force_builtin); -#define PERL_ARGS_ASSERT_DOFILE \ - assert(term) -PERL_CALLCONV bool Perl_doing_taint(int argc, char** argv, char** env) - __attribute__warn_unused_result__; + +PERL_CALLCONV void +Perl_do_sprintf(pTHX_ SV *sv, SSize_t len, SV **sarg); +#define PERL_ARGS_ASSERT_DO_SPRINTF \ + assert(sv); assert(sarg) + +PERL_CALLCONV void +Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim); +#define PERL_ARGS_ASSERT_DO_SV_DUMP \ + assert(file) + +PERL_CALLCONV Off_t +Perl_do_sysseek(pTHX_ GV *gv, Off_t pos, int whence) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_SYSSEEK \ + assert(gv) + +PERL_CALLCONV Off_t +Perl_do_tell(pTHX_ GV *gv) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_TELL \ + assert(gv) + +PERL_CALLCONV Size_t +Perl_do_trans(pTHX_ SV *sv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_TRANS \ + assert(sv) + +PERL_CALLCONV I16 +Perl_do_uniprop_match(const char * const key, const U16 key_len) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_DO_UNIPROP_MATCH \ + assert(key) + +PERL_CALLCONV UV +Perl_do_vecget(pTHX_ SV *sv, STRLEN offset, int size) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_VECGET \ + assert(sv) + +PERL_CALLCONV void +Perl_do_vecset(pTHX_ SV *sv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_VECSET \ + assert(sv) + +PERL_CALLCONV void +Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DO_VOP \ + assert(sv); assert(left); assert(right) + +PERL_CALLCONV OP * +Perl_dofile(pTHX_ OP *term, I32 force_builtin) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DOFILE \ + assert(term) + +PERL_CALLCONV bool +Perl_doing_taint(int argc, char **argv, char **env) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_DOING_TAINT -PERL_CALLCONV OP * Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref); -#define PERL_ARGS_ASSERT_DOREF \ - assert(o) -PERL_CALLCONV void Perl_dounwind(pTHX_ I32 cxix); +PERL_CALLCONV OP * +Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref); +#define PERL_ARGS_ASSERT_DOREF \ + assert(o) + +PERL_CALLCONV void +Perl_dounwind(pTHX_ I32 cxix); #define PERL_ARGS_ASSERT_DOUNWIND -PERL_CALLCONV U8 Perl_dowantarray(pTHX) - __attribute__warn_unused_result__; + +PERL_CALLCONV U8 +Perl_dowantarray(pTHX) + __attribute__deprecated__ + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_DOWANTARRAY -PERL_CALLCONV void Perl_drand48_init_r(perl_drand48_t *random_state, U32 seed); -#define PERL_ARGS_ASSERT_DRAND48_INIT_R \ - assert(random_state) -PERL_CALLCONV double Perl_drand48_r(perl_drand48_t *random_state); -#define PERL_ARGS_ASSERT_DRAND48_R \ - assert(random_state) -PERL_CALLCONV void Perl_dump_all(pTHX); +PERL_CALLCONV void +Perl_drand48_init_r(perl_drand48_t *random_state, U32 seed); +#define PERL_ARGS_ASSERT_DRAND48_INIT_R \ + assert(random_state) + +PERL_CALLCONV double +Perl_drand48_r(perl_drand48_t *random_state); +#define PERL_ARGS_ASSERT_DRAND48_R \ + assert(random_state) + +PERL_CALLCONV void +Perl_dump_all(pTHX); #define PERL_ARGS_ASSERT_DUMP_ALL -PERL_CALLCONV void Perl_dump_all_perl(pTHX_ bool justperl); + +PERL_CALLCONV void +Perl_dump_all_perl(pTHX_ bool justperl) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_DUMP_ALL_PERL -PERL_CALLCONV void Perl_dump_eval(pTHX); + +PERL_CALLCONV void +Perl_dump_eval(pTHX); #define PERL_ARGS_ASSERT_DUMP_EVAL -PERL_CALLCONV void Perl_dump_form(pTHX_ const GV* gv); -#define PERL_ARGS_ASSERT_DUMP_FORM \ - assert(gv) -PERL_CALLCONV void Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...) - __attribute__format__(__printf__,pTHX_3,pTHX_4); -#define PERL_ARGS_ASSERT_DUMP_INDENT \ - assert(file); assert(pat) - -PERL_CALLCONV void Perl_dump_packsubs(pTHX_ const HV* stash); -#define PERL_ARGS_ASSERT_DUMP_PACKSUBS \ - assert(stash) -PERL_CALLCONV void Perl_dump_packsubs_perl(pTHX_ const HV* stash, bool justperl); -#define PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL \ - assert(stash) -PERL_CALLCONV void Perl_dump_sub(pTHX_ const GV* gv); -#define PERL_ARGS_ASSERT_DUMP_SUB \ - assert(gv) -PERL_CALLCONV void Perl_dump_sub_perl(pTHX_ const GV* gv, bool justperl); -#define PERL_ARGS_ASSERT_DUMP_SUB_PERL \ - assert(gv) -PERL_CALLCONV void Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args); -#define PERL_ARGS_ASSERT_DUMP_VINDENT \ - assert(file); assert(pat) -PERL_CALLCONV STRLEN* Perl_dup_warnings(pTHX_ STRLEN* warnings); + +PERL_CALLCONV void +Perl_dump_form(pTHX_ const GV *gv); +#define PERL_ARGS_ASSERT_DUMP_FORM \ + assert(gv) + +PERL_CALLCONV void +Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char *pat, ...) + __attribute__format__(__printf__,pTHX_3,pTHX_4); +#define PERL_ARGS_ASSERT_DUMP_INDENT \ + assert(file); assert(pat) + +PERL_CALLCONV void +Perl_dump_packsubs(pTHX_ const HV *stash); +#define PERL_ARGS_ASSERT_DUMP_PACKSUBS \ + assert(stash) + +PERL_CALLCONV void +Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL \ + assert(stash) + +PERL_CALLCONV void +Perl_dump_sub(pTHX_ const GV *gv); +#define PERL_ARGS_ASSERT_DUMP_SUB \ + assert(gv) + +PERL_CALLCONV void +Perl_dump_sub_perl(pTHX_ const GV *gv, bool justperl) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_DUMP_SUB_PERL \ + assert(gv) + +PERL_CALLCONV void +Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char *pat, va_list *args); +#define PERL_ARGS_ASSERT_DUMP_VINDENT \ + assert(file); assert(pat) + +PERL_CALLCONV char * +Perl_dup_warnings(pTHX_ char *warnings); #define PERL_ARGS_ASSERT_DUP_WARNINGS -PERL_CALLCONV void Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv); -#define PERL_ARGS_ASSERT_EMULATE_COP_IO \ - assert(c); assert(sv) -PERL_CALLCONV SV* Perl_eval_pv(pTHX_ const char* p, I32 croak_on_error); -#define PERL_ARGS_ASSERT_EVAL_PV \ - assert(p) -PERL_CALLCONV I32 Perl_eval_sv(pTHX_ SV* sv, I32 flags); -#define PERL_ARGS_ASSERT_EVAL_SV \ - assert(sv) -PERL_CALLCONV void Perl_fbm_compile(pTHX_ SV* sv, U32 flags); -#define PERL_ARGS_ASSERT_FBM_COMPILE \ - assert(sv) -PERL_CALLCONV char* Perl_fbm_instr(pTHX_ unsigned char* big, unsigned char* bigend, SV* littlestr, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_FBM_INSTR \ - assert(big); assert(bigend); assert(littlestr) -PERL_CALLCONV SV* Perl_filter_add(pTHX_ filter_t funcp, SV* datasv); +PERL_CALLCONV void +Perl_emulate_cop_io(pTHX_ const COP * const c, SV * const sv); +#define PERL_ARGS_ASSERT_EMULATE_COP_IO \ + assert(c); assert(sv) + +PERL_CALLCONV SV * +Perl_eval_pv(pTHX_ const char *p, I32 croak_on_error); +#define PERL_ARGS_ASSERT_EVAL_PV \ + assert(p) + +PERL_CALLCONV I32 +Perl_eval_sv(pTHX_ SV *sv, I32 flags); +#define PERL_ARGS_ASSERT_EVAL_SV \ + assert(sv) + +PERL_CALLCONV void +Perl_fbm_compile(pTHX_ SV *sv, U32 flags); +#define PERL_ARGS_ASSERT_FBM_COMPILE \ + assert(sv) + +PERL_CALLCONV char * +Perl_fbm_instr(pTHX_ unsigned char *big, unsigned char *bigend, SV *littlestr, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_FBM_INSTR \ + assert(big); assert(bigend); assert(littlestr) + +PERL_CALLCONV SV * +Perl_filter_add(pTHX_ filter_t funcp, SV *datasv); #define PERL_ARGS_ASSERT_FILTER_ADD -PERL_CALLCONV void Perl_filter_del(pTHX_ filter_t funcp); -#define PERL_ARGS_ASSERT_FILTER_DEL \ - assert(funcp) -PERL_CALLCONV I32 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_FILTER_READ \ - assert(buf_sv) - -PERL_CALLCONV void Perl_finalize_optree(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_FINALIZE_OPTREE \ - assert(o) -PERL_CALLCONV CV * Perl_find_lexical_cv(pTHX_ PADOFFSET off); + +PERL_CALLCONV void +Perl_filter_del(pTHX_ filter_t funcp); +#define PERL_ARGS_ASSERT_FILTER_DEL \ + assert(funcp) + +PERL_CALLCONV I32 +Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_FILTER_READ \ + assert(buf_sv) + +PERL_CALLCONV CV * +Perl_find_lexical_cv(pTHX_ PADOFFSET off) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_FIND_LEXICAL_CV -PERL_CALLCONV CV* Perl_find_runcv(pTHX_ U32 *db_seqp) - __attribute__warn_unused_result__; + +PERL_CALLCONV CV * +Perl_find_runcv(pTHX_ U32 *db_seqp) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_FIND_RUNCV -PERL_CALLCONV CV* Perl_find_runcv_where(pTHX_ U8 cond, IV arg, U32 *db_seqp) - __attribute__warn_unused_result__; +PERL_CALLCONV CV * +Perl_find_runcv_where(pTHX_ U8 cond, IV arg, U32 *db_seqp) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_FIND_RUNCV_WHERE -PERL_CALLCONV SV* Perl_find_rundefsv(pTHX); +PERL_CALLCONV SV * +Perl_find_rundefsv(pTHX); #define PERL_ARGS_ASSERT_FIND_RUNDEFSV -PERL_CALLCONV PADOFFSET Perl_find_rundefsvoffset(pTHX) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_FIND_RUNDEFSVOFFSET - -PERL_CALLCONV char* Perl_find_script(pTHX_ const char *scriptname, bool dosearch, const char *const *const search_ext, I32 flags); -#define PERL_ARGS_ASSERT_FIND_SCRIPT \ - assert(scriptname) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 Perl_foldEQ(const char* a, const char* b, I32 len); -#define PERL_ARGS_ASSERT_FOLDEQ \ - assert(a); assert(b) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 Perl_foldEQ_latin1(const char* a, const char* b, I32 len); -#define PERL_ARGS_ASSERT_FOLDEQ_LATIN1 \ - assert(a); assert(b) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 Perl_foldEQ_locale(const char* a, const char* b, I32 len); -#define PERL_ARGS_ASSERT_FOLDEQ_LOCALE \ - assert(a); assert(b) -#endif -/* PERL_CALLCONV I32 foldEQ_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2); */ -#define PERL_ARGS_ASSERT_FOLDEQ_UTF8 -PERL_CALLCONV I32 Perl_foldEQ_utf8_flags(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2, U32 flags); -#define PERL_ARGS_ASSERT_FOLDEQ_UTF8_FLAGS \ - assert(s1); assert(s2) -PERL_CALLCONV char* Perl_form(pTHX_ const char* pat, ...) - __attribute__format__(__printf__,pTHX_1,pTHX_2); -#define PERL_ARGS_ASSERT_FORM \ - assert(pat) -PERL_CALLCONV void Perl_free_tied_hv_pool(pTHX); +PERL_CALLCONV char * +Perl_find_script(pTHX_ const char *scriptname, bool dosearch, const char * const * const search_ext, I32 flags) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_FIND_SCRIPT \ + assert(scriptname) + +/* PERL_CALLCONV I32 +foldEQ_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2); */ + +PERL_CALLCONV I32 +Perl_foldEQ_utf8_flags(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2, U32 flags); +#define PERL_ARGS_ASSERT_FOLDEQ_UTF8_FLAGS \ + assert(s1); assert(s2) + +PERL_CALLCONV void +Perl_forbid_outofblock_ops(pTHX_ OP *o, const char *blockname); +#define PERL_ARGS_ASSERT_FORBID_OUTOFBLOCK_OPS \ + assert(o); assert(blockname) + +PERL_CALLCONV void +Perl_force_locale_unlock(void) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_FORCE_LOCALE_UNLOCK + +PERL_CALLCONV char * +Perl_form(pTHX_ const char *pat, ...) + __attribute__format__(__printf__,pTHX_1,pTHX_2); +#define PERL_ARGS_ASSERT_FORM \ + assert(pat) + +PERL_CALLCONV void +Perl_free_tied_hv_pool(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_FREE_TIED_HV_POOL -PERL_CALLCONV void Perl_free_tmps(pTHX); + +PERL_CALLCONV void +Perl_free_tmps(pTHX); #define PERL_ARGS_ASSERT_FREE_TMPS -PERL_CALLCONV SV* Perl_get_and_check_backslash_N_name(pTHX_ const char* s, const char* e, const bool is_utf8, const char** error_msg) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GET_AND_CHECK_BACKSLASH_N_NAME \ - assert(s); assert(e); assert(error_msg) - -PERL_CALLCONV AV* Perl_get_av(pTHX_ const char *name, I32 flags); -#define PERL_ARGS_ASSERT_GET_AV \ - assert(name) -PERL_CALLCONV void* Perl_get_context(void) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GET_CONTEXT - -PERL_CALLCONV CV* Perl_get_cv(pTHX_ const char* name, I32 flags); -#define PERL_ARGS_ASSERT_GET_CV \ - assert(name) -PERL_CALLCONV CV* Perl_get_cvn_flags(pTHX_ const char* name, STRLEN len, I32 flags); -#define PERL_ARGS_ASSERT_GET_CVN_FLAGS \ - assert(name) -PERL_CALLCONV void Perl_get_db_sub(pTHX_ SV **svp, CV *cv); -#define PERL_ARGS_ASSERT_GET_DB_SUB \ - assert(cv) -PERL_CALLCONV const char * Perl_get_deprecated_property_msg(const Size_t warning_offset) - __attribute__warn_unused_result__; + +PERL_CALLCONV SV * +Perl_get_and_check_backslash_N_name(pTHX_ const char *s, const char *e, const bool is_utf8, const char **error_msg) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_GET_AND_CHECK_BACKSLASH_N_NAME \ + assert(s); assert(e); assert(error_msg) + +PERL_CALLCONV AV * +Perl_get_av(pTHX_ const char *name, I32 flags); +#define PERL_ARGS_ASSERT_GET_AV \ + assert(name) + +PERL_CALLCONV CV * +Perl_get_cv(pTHX_ const char *name, I32 flags); +#define PERL_ARGS_ASSERT_GET_CV \ + assert(name) + +PERL_CALLCONV CV * +Perl_get_cvn_flags(pTHX_ const char *name, STRLEN len, I32 flags); +#define PERL_ARGS_ASSERT_GET_CVN_FLAGS \ + assert(name) + +PERL_CALLCONV void +Perl_get_db_sub(pTHX_ SV **svp, CV *cv); +#define PERL_ARGS_ASSERT_GET_DB_SUB \ + assert(cv) + +PERL_CALLCONV const char * +Perl_get_deprecated_property_msg(const Size_t warning_offset) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_GET_DEPRECATED_PROPERTY_MSG -PERL_CALLCONV void Perl_get_hash_seed(pTHX_ unsigned char * const seed_buffer); -#define PERL_ARGS_ASSERT_GET_HASH_SEED \ - assert(seed_buffer) -PERL_CALLCONV HV* Perl_get_hv(pTHX_ const char *name, I32 flags); -#define PERL_ARGS_ASSERT_GET_HV \ - assert(name) -PERL_CALLCONV const char* Perl_get_no_modify(pTHX) - __attribute__warn_unused_result__ - __attribute__pure__; +PERL_CALLCONV int +Perl_get_extended_os_errno(void) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_GET_EXTENDED_OS_ERRNO + +PERL_CALLCONV void +Perl_get_hash_seed(pTHX_ unsigned char * const seed_buffer) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_GET_HASH_SEED \ + assert(seed_buffer) + +PERL_CALLCONV HV * +Perl_get_hv(pTHX_ const char *name, I32 flags); +#define PERL_ARGS_ASSERT_GET_HV \ + assert(name) + +PERL_CALLCONV const char * +Perl_get_no_modify(pTHX) + __attribute__deprecated__ + __attribute__warn_unused_result__ + __attribute__pure__ + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_GET_NO_MODIFY -PERL_CALLCONV char** Perl_get_op_descs(pTHX) - __attribute__warn_unused_result__ - __attribute__pure__; +PERL_CALLCONV char ** +Perl_get_op_descs(pTHX) + __attribute__deprecated__ + __attribute__warn_unused_result__ + __attribute__pure__; #define PERL_ARGS_ASSERT_GET_OP_DESCS -PERL_CALLCONV char** Perl_get_op_names(pTHX) - __attribute__warn_unused_result__ - __attribute__pure__; +PERL_CALLCONV char ** +Perl_get_op_names(pTHX) + __attribute__deprecated__ + __attribute__warn_unused_result__ + __attribute__pure__; #define PERL_ARGS_ASSERT_GET_OP_NAMES -PERL_CALLCONV U32* Perl_get_opargs(pTHX) - __attribute__warn_unused_result__ - __attribute__pure__; +PERL_CALLCONV U32 * +Perl_get_opargs(pTHX) + __attribute__deprecated__ + __attribute__warn_unused_result__ + __attribute__pure__ + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_GET_OPARGS -PERL_CALLCONV PPADDR_t* Perl_get_ppaddr(pTHX) - __attribute__warn_unused_result__ - __attribute__pure__; +PERL_CALLCONV PPADDR_t * +Perl_get_ppaddr(pTHX) + __attribute__deprecated__ + __attribute__warn_unused_result__ + __attribute__pure__; #define PERL_ARGS_ASSERT_GET_PPADDR -PERL_CALLCONV SV * Perl_get_prop_definition(pTHX_ const int table_index) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_get_prop_definition(pTHX_ const int table_index) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_GET_PROP_DEFINITION -PERL_CALLCONV const char * const * Perl_get_prop_values(const int table_index) - __attribute__warn_unused_result__; +PERL_CALLCONV const char * const * +Perl_get_prop_values(const int table_index) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_GET_PROP_VALUES -PERL_CALLCONV REGEXP * Perl_get_re_arg(pTHX_ SV *sv); +PERL_CALLCONV REGEXP * +Perl_get_re_arg(pTHX_ SV *sv); #define PERL_ARGS_ASSERT_GET_RE_ARG -PERL_CALLCONV SV* Perl_get_sv(pTHX_ const char *name, I32 flags); -#define PERL_ARGS_ASSERT_GET_SV \ - assert(name) -PERL_CALLCONV MGVTBL* Perl_get_vtbl(pTHX_ int vtbl_id) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GET_VTBL - -PERL_CALLCONV int Perl_getcwd_sv(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_GETCWD_SV \ - assert(sv) -PERL_CALLCONV void Perl_gp_free(pTHX_ GV* gv); + +PERL_CALLCONV SV * +Perl_get_sv(pTHX_ const char *name, I32 flags); +#define PERL_ARGS_ASSERT_GET_SV \ + assert(name) + +PERL_CALLCONV int +Perl_getcwd_sv(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_GETCWD_SV \ + assert(sv) + +PERL_CALLCONV void +Perl_gp_free(pTHX_ GV *gv); #define PERL_ARGS_ASSERT_GP_FREE -PERL_CALLCONV GP* Perl_gp_ref(pTHX_ GP* gp); + +PERL_CALLCONV GP * +Perl_gp_ref(pTHX_ GP *gp); #define PERL_ARGS_ASSERT_GP_REF -PERL_CALLCONV bool Perl_grok_atoUV(const char* pv, UV* valptr, const char** endptr); -#define PERL_ARGS_ASSERT_GROK_ATOUV \ - assert(pv); assert(valptr) -PERL_CALLCONV UV Perl_grok_bin(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result); -#define PERL_ARGS_ASSERT_GROK_BIN \ - assert(start); assert(len_p); assert(flags) -PERL_CALLCONV UV Perl_grok_bin_oct_hex(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result, const unsigned shift, const U8 lookup_bit, const char prefix); -#define PERL_ARGS_ASSERT_GROK_BIN_OCT_HEX \ - assert(start); assert(len_p); assert(flags) -PERL_CALLCONV UV Perl_grok_hex(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result); -#define PERL_ARGS_ASSERT_GROK_HEX \ - assert(start); assert(len_p); assert(flags) -PERL_CALLCONV int Perl_grok_infnan(pTHX_ const char** sp, const char *send); -#define PERL_ARGS_ASSERT_GROK_INFNAN \ - assert(sp); assert(send) -PERL_CALLCONV int Perl_grok_number(pTHX_ const char *pv, STRLEN len, UV *valuep); -#define PERL_ARGS_ASSERT_GROK_NUMBER \ - assert(pv) -PERL_CALLCONV int Perl_grok_number_flags(pTHX_ const char *pv, STRLEN len, UV *valuep, U32 flags); -#define PERL_ARGS_ASSERT_GROK_NUMBER_FLAGS \ - assert(pv) -PERL_CALLCONV bool Perl_grok_numeric_radix(pTHX_ const char **sp, const char *send) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GROK_NUMERIC_RADIX \ - assert(sp); assert(send) - -PERL_CALLCONV UV Perl_grok_oct(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result); -#define PERL_ARGS_ASSERT_GROK_OCT \ - assert(start); assert(len_p); assert(flags) -#ifndef NO_MATHOMS -PERL_CALLCONV GV* Perl_gv_AVadd(pTHX_ GV *gv); -#define PERL_ARGS_ASSERT_GV_AVADD -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV GV* Perl_gv_HVadd(pTHX_ GV *gv); -#define PERL_ARGS_ASSERT_GV_HVADD -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV GV* Perl_gv_IOadd(pTHX_ GV* gv); -#define PERL_ARGS_ASSERT_GV_IOADD -#endif -PERL_CALLCONV GV* Perl_gv_add_by_type(pTHX_ GV *gv, svtype type); + +PERL_CALLCONV bool +Perl_grok_atoUV(const char *pv, UV *valptr, const char **endptr); +#define PERL_ARGS_ASSERT_GROK_ATOUV \ + assert(pv); assert(valptr) + +PERL_CALLCONV UV +Perl_grok_bin(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result); +#define PERL_ARGS_ASSERT_GROK_BIN \ + assert(start); assert(len_p); assert(flags) + +PERL_CALLCONV UV +Perl_grok_bin_oct_hex(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result, const unsigned shift, const U8 lookup_bit, const char prefix); +#define PERL_ARGS_ASSERT_GROK_BIN_OCT_HEX \ + assert(start); assert(len_p); assert(flags) + +PERL_CALLCONV UV +Perl_grok_hex(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result); +#define PERL_ARGS_ASSERT_GROK_HEX \ + assert(start); assert(len_p); assert(flags) + +PERL_CALLCONV int +Perl_grok_infnan(pTHX_ const char **sp, const char *send); +#define PERL_ARGS_ASSERT_GROK_INFNAN \ + assert(sp); assert(send) + +PERL_CALLCONV int +Perl_grok_number(pTHX_ const char *pv, STRLEN len, UV *valuep); +#define PERL_ARGS_ASSERT_GROK_NUMBER \ + assert(pv) + +PERL_CALLCONV int +Perl_grok_number_flags(pTHX_ const char *pv, STRLEN len, UV *valuep, U32 flags); +#define PERL_ARGS_ASSERT_GROK_NUMBER_FLAGS \ + assert(pv) + +PERL_CALLCONV bool +Perl_grok_numeric_radix(pTHX_ const char **sp, const char *send) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_GROK_NUMERIC_RADIX \ + assert(sp); assert(send) + +PERL_CALLCONV UV +Perl_grok_oct(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result); +#define PERL_ARGS_ASSERT_GROK_OCT \ + assert(start); assert(len_p); assert(flags) + +PERL_CALLCONV GV * +Perl_gv_add_by_type(pTHX_ GV *gv, svtype type); #define PERL_ARGS_ASSERT_GV_ADD_BY_TYPE -/* PERL_CALLCONV GV* gv_autoload4(pTHX_ HV* stash, const char* name, STRLEN len, I32 method) - __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_GV_AUTOLOAD4 - -PERL_CALLCONV GV* Perl_gv_autoload_pv(pTHX_ HV* stash, const char* namepv, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GV_AUTOLOAD_PV \ - assert(namepv) - -PERL_CALLCONV GV* Perl_gv_autoload_pvn(pTHX_ HV* stash, const char* name, STRLEN len, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GV_AUTOLOAD_PVN \ - assert(name) - -PERL_CALLCONV GV* Perl_gv_autoload_sv(pTHX_ HV* stash, SV* namesv, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GV_AUTOLOAD_SV \ - assert(namesv) - -PERL_CALLCONV void Perl_gv_check(pTHX_ HV* stash); -#define PERL_ARGS_ASSERT_GV_CHECK \ - assert(stash) -PERL_CALLCONV SV* Perl_gv_const_sv(pTHX_ GV* gv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GV_CONST_SV \ - assert(gv) -PERL_CALLCONV void Perl_gv_dump(pTHX_ GV* gv); +/* PERL_CALLCONV GV * +gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method) + __attribute__warn_unused_result__; */ + +PERL_CALLCONV GV * +Perl_gv_autoload_pv(pTHX_ HV *stash, const char *namepv, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_GV_AUTOLOAD_PV \ + assert(namepv) + +PERL_CALLCONV GV * +Perl_gv_autoload_pvn(pTHX_ HV *stash, const char *name, STRLEN len, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_GV_AUTOLOAD_PVN \ + assert(name) + +PERL_CALLCONV GV * +Perl_gv_autoload_sv(pTHX_ HV *stash, SV *namesv, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_GV_AUTOLOAD_SV \ + assert(namesv) + +PERL_CALLCONV void +Perl_gv_check(pTHX_ HV *stash); +#define PERL_ARGS_ASSERT_GV_CHECK \ + assert(stash) + +PERL_CALLCONV SV * +Perl_gv_const_sv(pTHX_ GV *gv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_GV_CONST_SV \ + assert(gv) + +PERL_CALLCONV void +Perl_gv_dump(pTHX_ GV *gv); #define PERL_ARGS_ASSERT_GV_DUMP -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_gv_efullname(pTHX_ SV* sv, const GV* gv) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_GV_EFULLNAME \ - assert(sv); assert(gv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_gv_efullname3(pTHX_ SV* sv, const GV* gv, const char* prefix); -#define PERL_ARGS_ASSERT_GV_EFULLNAME3 \ - assert(sv); assert(gv) -#endif -PERL_CALLCONV void Perl_gv_efullname4(pTHX_ SV* sv, const GV* gv, const char* prefix, bool keepmain); -#define PERL_ARGS_ASSERT_GV_EFULLNAME4 \ - assert(sv); assert(gv) -PERL_CALLCONV GV* Perl_gv_fetchfile(pTHX_ const char* name); -#define PERL_ARGS_ASSERT_GV_FETCHFILE \ - assert(name) -PERL_CALLCONV GV* Perl_gv_fetchfile_flags(pTHX_ const char *const name, const STRLEN len, const U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHFILE_FLAGS \ - assert(name) -/* PERL_CALLCONV GV* gv_fetchmeth(pTHX_ HV* stash, const char* name, STRLEN len, I32 level); */ -#define PERL_ARGS_ASSERT_GV_FETCHMETH -/* PERL_CALLCONV GV* gv_fetchmeth_autoload(pTHX_ HV* stash, const char* name, STRLEN len, I32 level); */ -#define PERL_ARGS_ASSERT_GV_FETCHMETH_AUTOLOAD -PERL_CALLCONV GV* Perl_gv_fetchmeth_pv(pTHX_ HV* stash, const char* name, I32 level, U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHMETH_PV \ - assert(name) -PERL_CALLCONV GV* Perl_gv_fetchmeth_pv_autoload(pTHX_ HV* stash, const char* name, I32 level, U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHMETH_PV_AUTOLOAD \ - assert(name) -PERL_CALLCONV GV* Perl_gv_fetchmeth_pvn(pTHX_ HV* stash, const char* name, STRLEN len, I32 level, U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHMETH_PVN \ - assert(name) -PERL_CALLCONV GV* Perl_gv_fetchmeth_pvn_autoload(pTHX_ HV* stash, const char* name, STRLEN len, I32 level, U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHMETH_PVN_AUTOLOAD \ - assert(name) -PERL_CALLCONV GV* Perl_gv_fetchmeth_sv(pTHX_ HV* stash, SV* namesv, I32 level, U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHMETH_SV \ - assert(namesv) -PERL_CALLCONV GV* Perl_gv_fetchmeth_sv_autoload(pTHX_ HV* stash, SV* namesv, I32 level, U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHMETH_SV_AUTOLOAD \ - assert(namesv) -#ifndef NO_MATHOMS -PERL_CALLCONV GV* Perl_gv_fetchmethod(pTHX_ HV* stash, const char* name); -#define PERL_ARGS_ASSERT_GV_FETCHMETHOD \ - assert(stash); assert(name) -#endif -PERL_CALLCONV GV* Perl_gv_fetchmethod_autoload(pTHX_ HV* stash, const char* name, I32 autoload); -#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_AUTOLOAD \ - assert(stash); assert(name) -PERL_CALLCONV GV* Perl_gv_fetchmethod_pv_flags(pTHX_ HV* stash, const char* name, U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_PV_FLAGS \ - assert(stash); assert(name) -PERL_CALLCONV GV* Perl_gv_fetchmethod_pvn_flags(pTHX_ HV* stash, const char* name, const STRLEN len, U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_PVN_FLAGS \ - assert(stash); assert(name) -PERL_CALLCONV GV* Perl_gv_fetchmethod_sv_flags(pTHX_ HV* stash, SV* namesv, U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_SV_FLAGS \ - assert(stash); assert(namesv) -PERL_CALLCONV GV* Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 flags, const svtype sv_type); -#define PERL_ARGS_ASSERT_GV_FETCHPV \ - assert(nambeg) -PERL_CALLCONV GV* Perl_gv_fetchpvn_flags(pTHX_ const char* name, STRLEN len, I32 flags, const svtype sv_type); -#define PERL_ARGS_ASSERT_GV_FETCHPVN_FLAGS \ - assert(name) -PERL_CALLCONV GV* Perl_gv_fetchsv(pTHX_ SV *name, I32 flags, const svtype sv_type); -#define PERL_ARGS_ASSERT_GV_FETCHSV \ - assert(name) -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_gv_fullname(pTHX_ SV* sv, const GV* gv) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_GV_FULLNAME \ - assert(sv); assert(gv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_gv_fullname3(pTHX_ SV* sv, const GV* gv, const char* prefix); -#define PERL_ARGS_ASSERT_GV_FULLNAME3 \ - assert(sv); assert(gv) -#endif -PERL_CALLCONV void Perl_gv_fullname4(pTHX_ SV* sv, const GV* gv, const char* prefix, bool keepmain); -#define PERL_ARGS_ASSERT_GV_FULLNAME4 \ - assert(sv); assert(gv) -PERL_CALLCONV CV* Perl_gv_handler(pTHX_ HV* stash, I32 id) - __attribute__warn_unused_result__; + +PERL_CALLCONV void +Perl_gv_efullname4(pTHX_ SV *sv, const GV *gv, const char *prefix, bool keepmain); +#define PERL_ARGS_ASSERT_GV_EFULLNAME4 \ + assert(sv); assert(gv) + +PERL_CALLCONV GV * +Perl_gv_fetchfile(pTHX_ const char *name); +#define PERL_ARGS_ASSERT_GV_FETCHFILE \ + assert(name) + +PERL_CALLCONV GV * +Perl_gv_fetchfile_flags(pTHX_ const char * const name, const STRLEN len, const U32 flags); +#define PERL_ARGS_ASSERT_GV_FETCHFILE_FLAGS \ + assert(name) + +/* PERL_CALLCONV GV * +gv_fetchmeth(pTHX_ HV *stash, const char *name, STRLEN len, I32 level); */ + +/* PERL_CALLCONV GV * +gv_fetchmeth_autoload(pTHX_ HV *stash, const char *name, STRLEN len, I32 level); */ + +PERL_CALLCONV GV * +Perl_gv_fetchmeth_pv(pTHX_ HV *stash, const char *name, I32 level, U32 flags); +#define PERL_ARGS_ASSERT_GV_FETCHMETH_PV \ + assert(name) + +PERL_CALLCONV GV * +Perl_gv_fetchmeth_pv_autoload(pTHX_ HV *stash, const char *name, I32 level, U32 flags); +#define PERL_ARGS_ASSERT_GV_FETCHMETH_PV_AUTOLOAD \ + assert(name) + +PERL_CALLCONV GV * +Perl_gv_fetchmeth_pvn(pTHX_ HV *stash, const char *name, STRLEN len, I32 level, U32 flags); +#define PERL_ARGS_ASSERT_GV_FETCHMETH_PVN \ + assert(name) + +PERL_CALLCONV GV * +Perl_gv_fetchmeth_pvn_autoload(pTHX_ HV *stash, const char *name, STRLEN len, I32 level, U32 flags); +#define PERL_ARGS_ASSERT_GV_FETCHMETH_PVN_AUTOLOAD \ + assert(name) + +PERL_CALLCONV GV * +Perl_gv_fetchmeth_sv(pTHX_ HV *stash, SV *namesv, I32 level, U32 flags); +#define PERL_ARGS_ASSERT_GV_FETCHMETH_SV \ + assert(namesv) + +PERL_CALLCONV GV * +Perl_gv_fetchmeth_sv_autoload(pTHX_ HV *stash, SV *namesv, I32 level, U32 flags); +#define PERL_ARGS_ASSERT_GV_FETCHMETH_SV_AUTOLOAD \ + assert(namesv) + +PERL_CALLCONV GV * +Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload); +#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_AUTOLOAD \ + assert(stash); assert(name) + +PERL_CALLCONV GV * +Perl_gv_fetchmethod_pv_flags(pTHX_ HV *stash, const char *name, U32 flags); +#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_PV_FLAGS \ + assert(stash); assert(name) + +PERL_CALLCONV GV * +Perl_gv_fetchmethod_pvn_flags(pTHX_ HV *stash, const char *name, const STRLEN len, U32 flags); +#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_PVN_FLAGS \ + assert(stash); assert(name) + +PERL_CALLCONV GV * +Perl_gv_fetchmethod_sv_flags(pTHX_ HV *stash, SV *namesv, U32 flags); +#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_SV_FLAGS \ + assert(stash); assert(namesv) + +PERL_CALLCONV GV * +Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 flags, const svtype sv_type); +#define PERL_ARGS_ASSERT_GV_FETCHPV \ + assert(nambeg) + +PERL_CALLCONV GV * +Perl_gv_fetchpvn_flags(pTHX_ const char *name, STRLEN len, I32 flags, const svtype sv_type); +#define PERL_ARGS_ASSERT_GV_FETCHPVN_FLAGS \ + assert(name) + +PERL_CALLCONV GV * +Perl_gv_fetchsv(pTHX_ SV *name, I32 flags, const svtype sv_type); +#define PERL_ARGS_ASSERT_GV_FETCHSV \ + assert(name) + +PERL_CALLCONV void +Perl_gv_fullname4(pTHX_ SV *sv, const GV *gv, const char *prefix, bool keepmain); +#define PERL_ARGS_ASSERT_GV_FULLNAME4 \ + assert(sv); assert(gv) + +PERL_CALLCONV CV * +Perl_gv_handler(pTHX_ HV *stash, I32 id) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_GV_HANDLER -/* PERL_CALLCONV void gv_init(pTHX_ GV* gv, HV* stash, const char* name, STRLEN len, int multi); */ -#define PERL_ARGS_ASSERT_GV_INIT -PERL_CALLCONV void Perl_gv_init_pv(pTHX_ GV* gv, HV* stash, const char* name, U32 flags); -#define PERL_ARGS_ASSERT_GV_INIT_PV \ - assert(gv); assert(name) -PERL_CALLCONV void Perl_gv_init_pvn(pTHX_ GV* gv, HV* stash, const char* name, STRLEN len, U32 flags); -#define PERL_ARGS_ASSERT_GV_INIT_PVN \ - assert(gv); assert(name) -PERL_CALLCONV void Perl_gv_init_sv(pTHX_ GV* gv, HV* stash, SV* namesv, U32 flags); -#define PERL_ARGS_ASSERT_GV_INIT_SV \ - assert(gv); assert(namesv) -PERL_CALLCONV void Perl_gv_name_set(pTHX_ GV* gv, const char *name, U32 len, U32 flags); -#define PERL_ARGS_ASSERT_GV_NAME_SET \ - assert(gv); assert(name) -PERL_CALLCONV GV * Perl_gv_override(pTHX_ const char * const name, const STRLEN len); -#define PERL_ARGS_ASSERT_GV_OVERRIDE \ - assert(name) -PERL_CALLCONV void Perl_gv_setref(pTHX_ SV *const dsv, SV *const ssv); -#define PERL_ARGS_ASSERT_GV_SETREF \ - assert(dsv); assert(ssv) -PERL_CALLCONV HV* Perl_gv_stashpv(pTHX_ const char* name, I32 flags); -#define PERL_ARGS_ASSERT_GV_STASHPV \ - assert(name) -PERL_CALLCONV HV* Perl_gv_stashpvn(pTHX_ const char* name, U32 namelen, I32 flags); -#define PERL_ARGS_ASSERT_GV_STASHPVN \ - assert(name) -PERL_CALLCONV HV* Perl_gv_stashsv(pTHX_ SV* sv, I32 flags); -#define PERL_ARGS_ASSERT_GV_STASHSV \ - assert(sv) -PERL_CALLCONV void Perl_gv_try_downgrade(pTHX_ GV* gv); -#define PERL_ARGS_ASSERT_GV_TRY_DOWNGRADE \ - assert(gv) -PERL_CALLCONV struct xpvhv_aux* Perl_hv_auxalloc(pTHX_ HV *hv); -#define PERL_ARGS_ASSERT_HV_AUXALLOC \ - assert(hv) -PERL_CALLCONV AV** Perl_hv_backreferences_p(pTHX_ HV *hv); -#define PERL_ARGS_ASSERT_HV_BACKREFERENCES_P \ - assert(hv) -PERL_CALLCONV SV* Perl_hv_bucket_ratio(pTHX_ HV *hv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_BUCKET_RATIO \ - assert(hv) +/* PERL_CALLCONV void +gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi); */ + +PERL_CALLCONV void +Perl_gv_init_pv(pTHX_ GV *gv, HV *stash, const char *name, U32 flags); +#define PERL_ARGS_ASSERT_GV_INIT_PV \ + assert(gv); assert(name) + +PERL_CALLCONV void +Perl_gv_init_pvn(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, U32 flags); +#define PERL_ARGS_ASSERT_GV_INIT_PVN \ + assert(gv); assert(name) + +PERL_CALLCONV void +Perl_gv_init_sv(pTHX_ GV *gv, HV *stash, SV *namesv, U32 flags); +#define PERL_ARGS_ASSERT_GV_INIT_SV \ + assert(gv); assert(namesv) + +PERL_CALLCONV void +Perl_gv_name_set(pTHX_ GV *gv, const char *name, U32 len, U32 flags); +#define PERL_ARGS_ASSERT_GV_NAME_SET \ + assert(gv); assert(name) + +PERL_CALLCONV GV * +Perl_gv_override(pTHX_ const char * const name, const STRLEN len); +#define PERL_ARGS_ASSERT_GV_OVERRIDE \ + assert(name) + +PERL_CALLCONV void +Perl_gv_setref(pTHX_ SV * const dsv, SV * const ssv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_GV_SETREF \ + assert(dsv); assert(ssv) + +PERL_CALLCONV HV * +Perl_gv_stashpv(pTHX_ const char *name, I32 flags); +#define PERL_ARGS_ASSERT_GV_STASHPV \ + assert(name) + +PERL_CALLCONV HV * +Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 flags); +#define PERL_ARGS_ASSERT_GV_STASHPVN \ + assert(name) + +PERL_CALLCONV HV * +Perl_gv_stashsv(pTHX_ SV *sv, I32 flags); +#define PERL_ARGS_ASSERT_GV_STASHSV \ + assert(sv) + +PERL_CALLCONV void +Perl_gv_try_downgrade(pTHX_ GV *gv); +#define PERL_ARGS_ASSERT_GV_TRY_DOWNGRADE \ + assert(gv) + +PERL_CALLCONV struct xpvhv_aux * +Perl_hv_auxalloc(pTHX_ HV *hv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_HV_AUXALLOC \ + assert(hv) + +PERL_CALLCONV AV ** +Perl_hv_backreferences_p(pTHX_ HV *hv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_HV_BACKREFERENCES_P \ + assert(hv) + +PERL_CALLCONV SV * +Perl_hv_bucket_ratio(pTHX_ HV *hv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_BUCKET_RATIO \ + assert(hv) -PERL_CALLCONV void Perl_hv_clear(pTHX_ HV *hv); +PERL_CALLCONV void +Perl_hv_clear(pTHX_ HV *hv); #define PERL_ARGS_ASSERT_HV_CLEAR -PERL_CALLCONV void Perl_hv_clear_placeholders(pTHX_ HV *hv); -#define PERL_ARGS_ASSERT_HV_CLEAR_PLACEHOLDERS \ - assert(hv) -PERL_CALLCONV void* Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char* key, STRLEN klen, int flags, int action, SV *val, U32 hash); + +PERL_CALLCONV void +Perl_hv_clear_placeholders(pTHX_ HV *hv); +#define PERL_ARGS_ASSERT_HV_CLEAR_PLACEHOLDERS \ + assert(hv) + +PERL_CALLCONV void * +Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, int flags, int action, SV *val, U32 hash); #define PERL_ARGS_ASSERT_HV_COMMON -PERL_CALLCONV void* Perl_hv_common_key_len(pTHX_ HV *hv, const char *key, I32 klen_i32, const int action, SV *val, const U32 hash); -#define PERL_ARGS_ASSERT_HV_COMMON_KEY_LEN \ - assert(key) -PERL_CALLCONV HV * Perl_hv_copy_hints_hv(pTHX_ HV *const ohv) - __attribute__warn_unused_result__; + +PERL_CALLCONV void * +Perl_hv_common_key_len(pTHX_ HV *hv, const char *key, I32 klen_i32, const int action, SV *val, const U32 hash); +#define PERL_ARGS_ASSERT_HV_COMMON_KEY_LEN \ + assert(key) + +PERL_CALLCONV HV * +Perl_hv_copy_hints_hv(pTHX_ HV * const ohv) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_HV_COPY_HINTS_HV -PERL_CALLCONV void Perl_hv_delayfree_ent(pTHX_ HV *notused, HE *entry); +PERL_CALLCONV void +Perl_hv_delayfree_ent(pTHX_ HV *notused, HE *entry); #define PERL_ARGS_ASSERT_HV_DELAYFREE_ENT -#ifndef NO_MATHOMS -PERL_CALLCONV SV* Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags); -#define PERL_ARGS_ASSERT_HV_DELETE \ - assert(key) -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV SV* Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash); -#define PERL_ARGS_ASSERT_HV_DELETE_ENT \ - assert(keysv) -#endif -PERL_CALLCONV HE** Perl_hv_eiter_p(pTHX_ HV *hv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_EITER_P \ - assert(hv) - -PERL_CALLCONV void Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter); -#define PERL_ARGS_ASSERT_HV_EITER_SET \ - assert(hv) -PERL_CALLCONV void Perl_hv_ename_add(pTHX_ HV *hv, const char *name, U32 len, U32 flags); -#define PERL_ARGS_ASSERT_HV_ENAME_ADD \ - assert(hv); assert(name) -PERL_CALLCONV void Perl_hv_ename_delete(pTHX_ HV *hv, const char *name, U32 len, U32 flags); -#define PERL_ARGS_ASSERT_HV_ENAME_DELETE \ - assert(hv); assert(name) -#ifndef NO_MATHOMS -PERL_CALLCONV bool Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_EXISTS \ - assert(key) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV bool Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_EXISTS_ENT \ - assert(keysv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV SV** Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval); -#define PERL_ARGS_ASSERT_HV_FETCH \ - assert(key) -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV HE* Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, U32 hash); -#define PERL_ARGS_ASSERT_HV_FETCH_ENT \ - assert(keysv) -#endif -PERL_CALLCONV STRLEN Perl_hv_fill(pTHX_ HV *const hv); -#define PERL_ARGS_ASSERT_HV_FILL \ - assert(hv) -PERL_CALLCONV void Perl_hv_free_ent(pTHX_ HV *notused, HE *entry); + +PERL_CALLCONV void +Perl_hv_dump(pTHX_ HV *hv); +#define PERL_ARGS_ASSERT_HV_DUMP + +PERL_CALLCONV HE ** +Perl_hv_eiter_p(pTHX_ HV *hv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_EITER_P \ + assert(hv) + +PERL_CALLCONV void +Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter); +#define PERL_ARGS_ASSERT_HV_EITER_SET \ + assert(hv) + +PERL_CALLCONV void +Perl_hv_ename_add(pTHX_ HV *hv, const char *name, U32 len, U32 flags) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_HV_ENAME_ADD \ + assert(hv); assert(name) + +PERL_CALLCONV void +Perl_hv_ename_delete(pTHX_ HV *hv, const char *name, U32 len, U32 flags) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_HV_ENAME_DELETE \ + assert(hv); assert(name) + +PERL_CALLCONV STRLEN +Perl_hv_fill(pTHX_ HV * const hv); +#define PERL_ARGS_ASSERT_HV_FILL \ + assert(hv) + +PERL_CALLCONV void +Perl_hv_free_ent(pTHX_ HV *notused, HE *entry); #define PERL_ARGS_ASSERT_HV_FREE_ENT -PERL_CALLCONV I32 Perl_hv_iterinit(pTHX_ HV *hv); -#define PERL_ARGS_ASSERT_HV_ITERINIT \ - assert(hv) -PERL_CALLCONV char* Perl_hv_iterkey(pTHX_ HE* entry, I32* retlen) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_ITERKEY \ - assert(entry); assert(retlen) - -PERL_CALLCONV SV* Perl_hv_iterkeysv(pTHX_ HE* entry) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_ITERKEYSV \ - assert(entry) - -#ifndef NO_MATHOMS -PERL_CALLCONV HE* Perl_hv_iternext(pTHX_ HV *hv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_ITERNEXT \ - assert(hv) -#endif - -PERL_CALLCONV HE* Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_ITERNEXT_FLAGS \ - assert(hv) - -PERL_CALLCONV SV* Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_ITERNEXTSV \ - assert(hv); assert(key); assert(retlen) - -PERL_CALLCONV SV* Perl_hv_iterval(pTHX_ HV *hv, HE *entry) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_ITERVAL \ - assert(hv); assert(entry) - -PERL_CALLCONV void Perl_hv_ksplit(pTHX_ HV *hv, IV newmax); -#define PERL_ARGS_ASSERT_HV_KSPLIT \ - assert(hv) -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how); -#define PERL_ARGS_ASSERT_HV_MAGIC \ - assert(hv) -#endif -PERL_CALLCONV void Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags); -#define PERL_ARGS_ASSERT_HV_NAME_SET \ - assert(hv) -PERL_CALLCONV I32 Perl_hv_placeholders_get(pTHX_ const HV *hv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_GET \ - assert(hv) - -PERL_CALLCONV SSize_t* Perl_hv_placeholders_p(pTHX_ HV *hv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_P \ - assert(hv) - -PERL_CALLCONV void Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph); -#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_SET \ - assert(hv) -PERL_CALLCONV void Perl_hv_pushkv(pTHX_ HV *hv, U32 flags); -#define PERL_ARGS_ASSERT_HV_PUSHKV \ - assert(hv) -PERL_CALLCONV void Perl_hv_rand_set(pTHX_ HV *hv, U32 new_xhv_rand); -#define PERL_ARGS_ASSERT_HV_RAND_SET \ - assert(hv) -PERL_CALLCONV I32* Perl_hv_riter_p(pTHX_ HV *hv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_RITER_P \ - assert(hv) - -PERL_CALLCONV void Perl_hv_riter_set(pTHX_ HV *hv, I32 riter); -#define PERL_ARGS_ASSERT_HV_RITER_SET \ - assert(hv) -PERL_CALLCONV SV* Perl_hv_scalar(pTHX_ HV *hv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HV_SCALAR \ - assert(hv) - -#ifndef NO_MATHOMS -PERL_CALLCONV SV** Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash); -#define PERL_ARGS_ASSERT_HV_STORE -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV HE* Perl_hv_store_ent(pTHX_ HV *hv, SV *key, SV *val, U32 hash); -#define PERL_ARGS_ASSERT_HV_STORE_ENT -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV SV** Perl_hv_store_flags(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash, int flags); -#define PERL_ARGS_ASSERT_HV_STORE_FLAGS -#endif -/* PERL_CALLCONV void hv_undef(pTHX_ HV *hv); */ -#define PERL_ARGS_ASSERT_HV_UNDEF -PERL_CALLCONV void Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags); + +PERL_CALLCONV I32 +Perl_hv_iterinit(pTHX_ HV *hv); +#define PERL_ARGS_ASSERT_HV_ITERINIT \ + assert(hv) + +PERL_CALLCONV char * +Perl_hv_iterkey(pTHX_ HE *entry, I32 *retlen) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_ITERKEY \ + assert(entry); assert(retlen) + +PERL_CALLCONV SV * +Perl_hv_iterkeysv(pTHX_ HE *entry) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_ITERKEYSV \ + assert(entry) + +PERL_CALLCONV HE * +Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_ITERNEXT_FLAGS \ + assert(hv) + +PERL_CALLCONV SV * +Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_ITERNEXTSV \ + assert(hv); assert(key); assert(retlen) + +PERL_CALLCONV SV * +Perl_hv_iterval(pTHX_ HV *hv, HE *entry) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_ITERVAL \ + assert(hv); assert(entry) + +PERL_CALLCONV void +Perl_hv_ksplit(pTHX_ HV *hv, IV newmax); +#define PERL_ARGS_ASSERT_HV_KSPLIT \ + assert(hv) + +PERL_CALLCONV void +Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags); +#define PERL_ARGS_ASSERT_HV_NAME_SET \ + assert(hv) + +PERL_CALLCONV I32 +Perl_hv_placeholders_get(pTHX_ const HV *hv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_GET \ + assert(hv) + +PERL_CALLCONV SSize_t * +Perl_hv_placeholders_p(pTHX_ HV *hv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_P \ + assert(hv) + +PERL_CALLCONV void +Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph); +#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_SET \ + assert(hv) + +PERL_CALLCONV void +Perl_hv_pushkv(pTHX_ HV *hv, U32 flags) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_HV_PUSHKV \ + assert(hv) + +PERL_CALLCONV void +Perl_hv_rand_set(pTHX_ HV *hv, U32 new_xhv_rand); +#define PERL_ARGS_ASSERT_HV_RAND_SET \ + assert(hv) + +PERL_CALLCONV I32 * +Perl_hv_riter_p(pTHX_ HV *hv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_RITER_P \ + assert(hv) + +PERL_CALLCONV void +Perl_hv_riter_set(pTHX_ HV *hv, I32 riter); +#define PERL_ARGS_ASSERT_HV_RITER_SET \ + assert(hv) + +PERL_CALLCONV SV * +Perl_hv_scalar(pTHX_ HV *hv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_HV_SCALAR \ + assert(hv) + +/* PERL_CALLCONV SV ** +hv_stores(pTHX_ HV *hv, const char * const key, SV *val); */ + +/* PERL_CALLCONV void +hv_undef(pTHX_ HV *hv); */ + +PERL_CALLCONV void +Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags); #define PERL_ARGS_ASSERT_HV_UNDEF_FLAGS -/* PERL_CALLCONV I32 ibcmp(pTHX_ const char* a, const char* b, I32 len) - __attribute__warn_unused_result__ - __attribute__pure__; */ -#define PERL_ARGS_ASSERT_IBCMP - -/* PERL_CALLCONV I32 ibcmp_locale(pTHX_ const char* a, const char* b, I32 len) - __attribute__warn_unused_result__ - __attribute__pure__; */ -#define PERL_ARGS_ASSERT_IBCMP_LOCALE - -/* PERL_CALLCONV I32 ibcmp_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2); */ -#define PERL_ARGS_ASSERT_IBCMP_UTF8 -PERL_CALLCONV void Perl_init_argv_symbols(pTHX_ int argc, char **argv); -#define PERL_ARGS_ASSERT_INIT_ARGV_SYMBOLS \ - assert(argv) -PERL_CALLCONV void Perl_init_constants(pTHX); + +/* PERL_CALLCONV I32 +ibcmp(pTHX_ const char *a, const char *b, I32 len) + __attribute__warn_unused_result__ + __attribute__pure__; */ + +/* PERL_CALLCONV I32 +ibcmp_locale(pTHX_ const char *a, const char *b, I32 len) + __attribute__warn_unused_result__ + __attribute__pure__; */ + +/* PERL_CALLCONV I32 +ibcmp_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2); */ + +PERL_CALLCONV STRLEN +Perl_infix_plugin_standard(pTHX_ char *operator_ptr, STRLEN operator_len, struct Perl_custom_infix **def); +#define PERL_ARGS_ASSERT_INFIX_PLUGIN_STANDARD \ + assert(operator_ptr); assert(def) + +PERL_CALLCONV void +Perl_init_argv_symbols(pTHX_ int argc, char **argv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_INIT_ARGV_SYMBOLS \ + assert(argv) + +PERL_CALLCONV void +Perl_init_constants(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_INIT_CONSTANTS -PERL_CALLCONV void Perl_init_dbargs(pTHX); + +PERL_CALLCONV void +Perl_init_dbargs(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_INIT_DBARGS -PERL_CALLCONV void Perl_init_debugger(pTHX); + +PERL_CALLCONV void +Perl_init_debugger(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_INIT_DEBUGGER -PERL_CALLCONV int Perl_init_i18nl10n(pTHX_ int printwarn); + +PERL_CALLCONV int +Perl_init_i18nl10n(pTHX_ int printwarn); #define PERL_ARGS_ASSERT_INIT_I18NL10N -#ifndef NO_MATHOMS -PERL_CALLCONV int Perl_init_i18nl14n(pTHX_ int printwarn) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_INIT_I18NL14N -#endif -PERL_CALLCONV void Perl_init_named_cv(pTHX_ CV *cv, OP *nameop); -#define PERL_ARGS_ASSERT_INIT_NAMED_CV \ - assert(cv); assert(nameop) -PERL_CALLCONV void Perl_init_stacks(pTHX); +PERL_CALLCONV void +Perl_init_named_cv(pTHX_ CV *cv, OP *nameop); +#define PERL_ARGS_ASSERT_INIT_NAMED_CV \ + assert(cv); assert(nameop) + +PERL_CALLCONV void +Perl_init_stacks(pTHX); #define PERL_ARGS_ASSERT_INIT_STACKS -PERL_CALLCONV void Perl_init_tm(pTHX_ struct tm *ptm); -#define PERL_ARGS_ASSERT_INIT_TM \ - assert(ptm) -PERL_CALLCONV void Perl_init_uniprops(pTHX); + +PERL_CALLCONV void +Perl_init_tm(pTHX_ struct tm *ptm); +#define PERL_ARGS_ASSERT_INIT_TM \ + assert(ptm) + +PERL_CALLCONV void +Perl_init_uniprops(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_INIT_UNIPROPS -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_instr(const char* big, const char* little) - __attribute__warn_unused_result__ - __attribute__pure__; -#define PERL_ARGS_ASSERT_INSTR \ - assert(big); assert(little) -#endif -PERL_CALLCONV U32 Perl_intro_my(pTHX); +PERL_CALLCONV U32 +Perl_intro_my(pTHX); #define PERL_ARGS_ASSERT_INTRO_MY -PERL_CALLCONV OP* Perl_invert(pTHX_ OP* cmd) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_INVERT -PERL_CALLCONV void Perl_invmap_dump(pTHX_ SV* invlist, UV * map); -#define PERL_ARGS_ASSERT_INVMAP_DUMP \ - assert(invlist); assert(map) -PERL_CALLCONV bool Perl_io_close(pTHX_ IO* io, GV *gv, bool not_implicit, bool warn_on_fail); -#define PERL_ARGS_ASSERT_IO_CLOSE \ - assert(io) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE Size_t Perl_isC9_STRICT_UTF8_CHAR(const U8 * const s0, const U8 * const e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISC9_STRICT_UTF8_CHAR \ - assert(s0); assert(e) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE Size_t Perl_isSTRICT_UTF8_CHAR(const U8 * const s0, const U8 * const e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISSTRICT_UTF8_CHAR \ - assert(s0); assert(e) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE Size_t Perl_isUTF8_CHAR(const U8 * const s0, const U8 * const e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISUTF8_CHAR \ - assert(s0); assert(e) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE Size_t Perl_isUTF8_CHAR_flags(const U8 * const s0, const U8 * const e, const U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISUTF8_CHAR_FLAGS \ - assert(s0); assert(e) -#endif - -/* PERL_CALLCONV bool is_ascii_string(const U8* const s, STRLEN len) - __attribute__warn_unused_result__ - __attribute__pure__; */ -#define PERL_ARGS_ASSERT_IS_ASCII_STRING - -/* PERL_CALLCONV bool is_c9strict_utf8_string(const U8 *s, STRLEN len) - __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_IS_C9STRICT_UTF8_STRING - -/* PERL_CALLCONV bool is_c9strict_utf8_string_loc(const U8 *s, STRLEN len, const U8 **ep); */ -#define PERL_ARGS_ASSERT_IS_C9STRICT_UTF8_STRING_LOC -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_is_c9strict_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el); -#define PERL_ARGS_ASSERT_IS_C9STRICT_UTF8_STRING_LOCLEN \ - assert(s) -#endif -/* PERL_CALLCONV bool is_invariant_string(const U8* const s, STRLEN len) - __attribute__warn_unused_result__ - __attribute__pure__; */ -#define PERL_ARGS_ASSERT_IS_INVARIANT_STRING +PERL_CALLCONV OP * +Perl_invert(pTHX_ OP *cmd) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_INVERT -PERL_CALLCONV I32 Perl_is_lvalue_sub(pTHX) - __attribute__warn_unused_result__; +PERL_CALLCONV void +Perl_invmap_dump(pTHX_ SV *invlist, UV *map) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_INVMAP_DUMP \ + assert(invlist); assert(map) + +PERL_CALLCONV bool +Perl_io_close(pTHX_ IO *io, GV *gv, bool is_explicit, bool warn_on_fail) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_IO_CLOSE \ + assert(io) + +/* PERL_CALLCONV bool +is_ascii_string(const U8 * const s, STRLEN len) + __attribute__warn_unused_result__ + __attribute__pure__; */ + +/* PERL_CALLCONV bool +is_c9strict_utf8_string(const U8 *s, STRLEN len) + __attribute__warn_unused_result__; */ + +/* PERL_CALLCONV bool +is_c9strict_utf8_string_loc(const U8 *s, STRLEN len, const U8 **ep); */ + +/* PERL_CALLCONV bool +is_invariant_string(const U8 * const s, STRLEN len) + __attribute__warn_unused_result__ + __attribute__pure__; */ + +PERL_CALLCONV I32 +Perl_is_lvalue_sub(pTHX) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_IS_LVALUE_SUB -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_is_safe_syscall(pTHX_ const char *pv, STRLEN len, const char *what, const char *op_name) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_SAFE_SYSCALL \ - assert(pv); assert(what); assert(op_name) -#endif - -/* PERL_CALLCONV bool is_strict_utf8_string(const U8 *s, STRLEN len) - __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING - -/* PERL_CALLCONV bool is_strict_utf8_string_loc(const U8 *s, STRLEN len, const U8 **ep); */ -#define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING_LOC -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_is_strict_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el); -#define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING_LOCLEN \ - assert(s) -#endif -PERL_CALLCONV Size_t Perl_is_utf8_FF_helper_(const U8 * const s0, const U8 * const e, const bool require_partial) - __attribute__warn_unused_result__ - __attribute__pure__; -#define PERL_ARGS_ASSERT_IS_UTF8_FF_HELPER_ \ - assert(s0); assert(e) - -#ifndef NO_MATHOMS -PERL_CALLCONV STRLEN Perl_is_utf8_char(const U8 *s) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_IS_UTF8_CHAR \ - assert(s) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV STRLEN Perl_is_utf8_char_buf(const U8 *buf, const U8 *buf_end); -#define PERL_ARGS_ASSERT_IS_UTF8_CHAR_BUF \ - assert(buf); assert(buf_end) -#endif -PERL_CALLCONV STRLEN Perl_is_utf8_char_helper_(const U8 * const s, const U8 * e, const U32 flags) - __attribute__warn_unused_result__ - __attribute__pure__; -#define PERL_ARGS_ASSERT_IS_UTF8_CHAR_HELPER_ \ - assert(s); assert(e) - -/* PERL_CALLCONV bool is_utf8_fixed_width_buf_flags(const U8 * const s, STRLEN len, const U32 flags); */ -#define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_FLAGS -/* PERL_CALLCONV bool is_utf8_fixed_width_buf_loc_flags(const U8 * const s, STRLEN len, const U8 **ep, const U32 flags); */ -#define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_LOC_FLAGS -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_is_utf8_fixed_width_buf_loclen_flags(const U8 * const s, STRLEN len, const U8 **ep, STRLEN *el, const U32 flags); -#define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_LOCLEN_FLAGS \ - assert(s) -#endif -/* PERL_CALLCONV bool is_utf8_invariant_string(const U8* const s, STRLEN len) - __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_IS_UTF8_INVARIANT_STRING - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_is_utf8_invariant_string_loc(const U8* const s, STRLEN len, const U8 ** ep) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_UTF8_INVARIANT_STRING_LOC \ - assert(s) -#endif - -/* PERL_CALLCONV bool is_utf8_string(const U8 *s, STRLEN len) - __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_IS_UTF8_STRING - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_is_utf8_string_flags(const U8 *s, STRLEN len, const U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_UTF8_STRING_FLAGS \ - assert(s) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV bool Perl_is_utf8_string_loc(const U8 *s, const STRLEN len, const U8 **ep); -#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOC \ - assert(s); assert(ep) -#endif -/* PERL_CALLCONV bool is_utf8_string_loc_flags(const U8 *s, STRLEN len, const U8 **ep, const U32 flags); */ -#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOC_FLAGS -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el); -#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN \ - assert(s) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_is_utf8_string_loclen_flags(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el, const U32 flags); -#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN_FLAGS \ - assert(s) -#endif -/* PERL_CALLCONV bool is_utf8_valid_partial_char(const U8 * const s0, const U8 * const e) - __attribute__warn_unused_result__ - __attribute__pure__; */ -#define PERL_ARGS_ASSERT_IS_UTF8_VALID_PARTIAL_CHAR - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_is_utf8_valid_partial_char_flags(const U8 * const s0, const U8 * const e, const U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_UTF8_VALID_PARTIAL_CHAR_FLAGS \ - assert(s0); assert(e) -#endif - -PERL_CALLCONV bool Perl_isinfnan(NV nv) - __attribute__warn_unused_result__ - __attribute__pure__; +/* PERL_CALLCONV bool +is_strict_utf8_string(const U8 *s, STRLEN len) + __attribute__warn_unused_result__; */ + +/* PERL_CALLCONV bool +is_strict_utf8_string_loc(const U8 *s, STRLEN len, const U8 **ep); */ + +PERL_CALLCONV Size_t +Perl_is_utf8_FF_helper_(const U8 * const s0, const U8 * const e, const bool require_partial) + __attribute__warn_unused_result__ + __attribute__pure__; +#define PERL_ARGS_ASSERT_IS_UTF8_FF_HELPER_ \ + assert(s0); assert(e) + +PERL_CALLCONV STRLEN +Perl_is_utf8_char_helper_(const U8 * const s, const U8 *e, const U32 flags) + __attribute__warn_unused_result__ + __attribute__pure__; +#define PERL_ARGS_ASSERT_IS_UTF8_CHAR_HELPER_ \ + assert(s); assert(e) + +/* PERL_CALLCONV bool +is_utf8_fixed_width_buf_flags(const U8 * const s, STRLEN len, const U32 flags); */ + +/* PERL_CALLCONV bool +is_utf8_fixed_width_buf_loc_flags(const U8 * const s, STRLEN len, const U8 **ep, const U32 flags); */ + +/* PERL_CALLCONV bool +is_utf8_invariant_string(const U8 * const s, STRLEN len) + __attribute__warn_unused_result__; */ + +/* PERL_CALLCONV bool +is_utf8_string(const U8 *s, STRLEN len) + __attribute__warn_unused_result__; */ + +/* PERL_CALLCONV bool +is_utf8_string_loc_flags(const U8 *s, STRLEN len, const U8 **ep, const U32 flags); */ + +/* PERL_CALLCONV bool +is_utf8_valid_partial_char(const U8 * const s0, const U8 * const e) + __attribute__warn_unused_result__ + __attribute__pure__; */ + +PERL_CALLCONV bool +Perl_isinfnan(NV nv) + __attribute__warn_unused_result__ + __attribute__pure__; #define PERL_ARGS_ASSERT_ISINFNAN -PERL_CALLCONV bool Perl_isinfnansv(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_ISINFNANSV \ - assert(sv) -PERL_CALLCONV OP* Perl_jmaybe(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_JMAYBE \ - assert(o) -PERL_CALLCONV I32 Perl_keyword(pTHX_ const char *name, I32 len, bool all_keywords) - __attribute__warn_unused_result__ - __attribute__pure__; -#define PERL_ARGS_ASSERT_KEYWORD \ - assert(name) - -PERL_CALLCONV int Perl_keyword_plugin_standard(pTHX_ char* keyword_ptr, STRLEN keyword_len, OP** op_ptr); -#define PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD \ - assert(keyword_ptr); assert(op_ptr) -PERL_CALLCONV void Perl_leave_adjust_stacks(pTHX_ SV **from_sp, SV **to_sp, U8 gimme, int filter); -#define PERL_ARGS_ASSERT_LEAVE_ADJUST_STACKS \ - assert(from_sp); assert(to_sp) -PERL_CALLCONV void Perl_leave_scope(pTHX_ I32 base); +PERL_CALLCONV bool +Perl_isinfnansv(pTHX_ SV *sv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_ISINFNANSV \ + assert(sv) + +PERL_CALLCONV OP * +Perl_jmaybe(pTHX_ OP *o) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_JMAYBE \ + assert(o) + +PERL_CALLCONV I32 +Perl_keyword(pTHX_ const char *name, I32 len, bool all_keywords) + __attribute__warn_unused_result__ + __attribute__pure__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_KEYWORD \ + assert(name) + +PERL_CALLCONV int +Perl_keyword_plugin_standard(pTHX_ char *keyword_ptr, STRLEN keyword_len, OP **op_ptr); +#define PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD \ + assert(keyword_ptr); assert(op_ptr) + +PERL_CALLCONV void +Perl_leave_adjust_stacks(pTHX_ SV **from_sp, SV **to_sp, U8 gimme, int filter); +#define PERL_ARGS_ASSERT_LEAVE_ADJUST_STACKS \ + assert(from_sp); assert(to_sp) + +PERL_CALLCONV void +Perl_leave_scope(pTHX_ I32 base); #define PERL_ARGS_ASSERT_LEAVE_SCOPE -PERL_CALLCONV bool Perl_lex_bufutf8(pTHX); + +PERL_CALLCONV bool +Perl_lex_bufutf8(pTHX); #define PERL_ARGS_ASSERT_LEX_BUFUTF8 -PERL_CALLCONV void Perl_lex_discard_to(pTHX_ char* ptr); -#define PERL_ARGS_ASSERT_LEX_DISCARD_TO \ - assert(ptr) -PERL_CALLCONV char* Perl_lex_grow_linestr(pTHX_ STRLEN len); + +PERL_CALLCONV void +Perl_lex_discard_to(pTHX_ char *ptr); +#define PERL_ARGS_ASSERT_LEX_DISCARD_TO \ + assert(ptr) + +PERL_CALLCONV char * +Perl_lex_grow_linestr(pTHX_ STRLEN len); #define PERL_ARGS_ASSERT_LEX_GROW_LINESTR -PERL_CALLCONV bool Perl_lex_next_chunk(pTHX_ U32 flags); + +PERL_CALLCONV bool +Perl_lex_next_chunk(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_LEX_NEXT_CHUNK -PERL_CALLCONV I32 Perl_lex_peek_unichar(pTHX_ U32 flags); + +PERL_CALLCONV I32 +Perl_lex_peek_unichar(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_LEX_PEEK_UNICHAR -PERL_CALLCONV void Perl_lex_read_space(pTHX_ U32 flags); + +PERL_CALLCONV void +Perl_lex_read_space(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_LEX_READ_SPACE -PERL_CALLCONV void Perl_lex_read_to(pTHX_ char* ptr); -#define PERL_ARGS_ASSERT_LEX_READ_TO \ - assert(ptr) -PERL_CALLCONV I32 Perl_lex_read_unichar(pTHX_ U32 flags); + +PERL_CALLCONV void +Perl_lex_read_to(pTHX_ char *ptr); +#define PERL_ARGS_ASSERT_LEX_READ_TO \ + assert(ptr) + +PERL_CALLCONV I32 +Perl_lex_read_unichar(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_LEX_READ_UNICHAR -PERL_CALLCONV void Perl_lex_start(pTHX_ SV* line, PerlIO *rsfp, U32 flags); + +PERL_CALLCONV void +Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, U32 flags); #define PERL_ARGS_ASSERT_LEX_START -PERL_CALLCONV void Perl_lex_stuff_pv(pTHX_ const char* pv, U32 flags); -#define PERL_ARGS_ASSERT_LEX_STUFF_PV \ - assert(pv) -PERL_CALLCONV void Perl_lex_stuff_pvn(pTHX_ const char* pv, STRLEN len, U32 flags); -#define PERL_ARGS_ASSERT_LEX_STUFF_PVN \ - assert(pv) -PERL_CALLCONV void Perl_lex_stuff_sv(pTHX_ SV* sv, U32 flags); -#define PERL_ARGS_ASSERT_LEX_STUFF_SV \ - assert(sv) -PERL_CALLCONV void Perl_lex_unstuff(pTHX_ char* ptr); -#define PERL_ARGS_ASSERT_LEX_UNSTUFF \ - assert(ptr) -PERL_CALLCONV OP* Perl_list(pTHX_ OP* o); + +PERL_CALLCONV void +Perl_lex_stuff_pv(pTHX_ const char *pv, U32 flags); +#define PERL_ARGS_ASSERT_LEX_STUFF_PV \ + assert(pv) + +PERL_CALLCONV void +Perl_lex_stuff_pvn(pTHX_ const char *pv, STRLEN len, U32 flags); +#define PERL_ARGS_ASSERT_LEX_STUFF_PVN \ + assert(pv) + +PERL_CALLCONV void +Perl_lex_stuff_sv(pTHX_ SV *sv, U32 flags); +#define PERL_ARGS_ASSERT_LEX_STUFF_SV \ + assert(sv) + +PERL_CALLCONV void +Perl_lex_unstuff(pTHX_ char *ptr); +#define PERL_ARGS_ASSERT_LEX_UNSTUFF \ + assert(ptr) + +PERL_CALLCONV OP * +Perl_list(pTHX_ OP *o) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_LIST -PERL_CALLCONV HV* Perl_load_charnames(pTHX_ SV * char_name, const char * context, const STRLEN context_len, const char ** error_msg) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_LOAD_CHARNAMES \ - assert(char_name); assert(context); assert(error_msg) - -PERL_CALLCONV void Perl_load_module(pTHX_ U32 flags, SV* name, SV* ver, ...); -#define PERL_ARGS_ASSERT_LOAD_MODULE \ - assert(name) -PERL_CALLCONV OP* Perl_localize(pTHX_ OP *o, I32 lex); -#define PERL_ARGS_ASSERT_LOCALIZE \ - assert(o) -PERL_CALLCONV I32 Perl_looks_like_number(pTHX_ SV *const sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER \ - assert(sv) - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE unsigned Perl_lsbit_pos32(U32 word) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_LSBIT_POS32 -#endif - -PERL_CALLCONV int Perl_magic_clear_all_env(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_cleararylen_p(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_CLEARARYLEN_P \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_clearenv(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_CLEARENV \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_clearhint(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_CLEARHINT \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_clearhints(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_CLEARHINTS \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_clearisa(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_CLEARISA \ - assert(mg) -PERL_CALLCONV int Perl_magic_clearpack(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_CLEARPACK \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_clearsig(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_CLEARSIG \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_copycallchecker(pTHX_ SV* sv, MAGIC *mg, SV *nsv, const char *name, I32 namlen); -#define PERL_ARGS_ASSERT_MAGIC_COPYCALLCHECKER \ - assert(sv); assert(mg); assert(nsv) -PERL_CALLCONV void Perl_magic_dump(pTHX_ const MAGIC *mg); + +PERL_CALLCONV HV * +Perl_load_charnames(pTHX_ SV *char_name, const char *context, const STRLEN context_len, const char **error_msg) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_LOAD_CHARNAMES \ + assert(char_name); assert(context); assert(error_msg) + +PERL_CALLCONV void +Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...); +#define PERL_ARGS_ASSERT_LOAD_MODULE \ + assert(name) + +PERL_CALLCONV_NO_RET void +Perl_locale_panic(const char *msg, const char *file_name, const line_t line, const int errnum) + __attribute__noreturn__; +#define PERL_ARGS_ASSERT_LOCALE_PANIC \ + assert(msg); assert(file_name) + +PERL_CALLCONV OP * +Perl_localize(pTHX_ OP *o, I32 lex) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_LOCALIZE \ + assert(o) + +PERL_CALLCONV I32 +Perl_looks_like_number(pTHX_ SV * const sv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER \ + assert(sv) + +PERL_CALLCONV int +Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_cleararylen_p(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_CLEARARYLEN_P \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_CLEARENV \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_clearhint(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_CLEARHINT \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_clearhints(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_CLEARHINTS \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_clearhook(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_CLEARHOOK \ + assert(mg) + +PERL_CALLCONV int +Perl_magic_clearhookall(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_CLEARHOOKALL \ + assert(mg) + +PERL_CALLCONV int +Perl_magic_clearisa(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_CLEARISA \ + assert(mg) + +PERL_CALLCONV int +Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_CLEARPACK \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_CLEARSIG \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_copycallchecker(pTHX_ SV *sv, MAGIC *mg, SV *nsv, const char *name, I32 namlen) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_COPYCALLCHECKER \ + assert(sv); assert(mg); assert(nsv) + +PERL_CALLCONV void +Perl_magic_dump(pTHX_ const MAGIC *mg); #define PERL_ARGS_ASSERT_MAGIC_DUMP -PERL_CALLCONV int Perl_magic_existspack(pTHX_ SV* sv, const MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_EXISTSPACK \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_freearylen_p(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_freemglob(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_FREEMGLOB \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_freeovrld(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_FREEOVRLD \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_freeutf8(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_FREEUTF8 \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_get(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GET \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_getarylen(pTHX_ SV* sv, const MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETARYLEN \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_getdebugvar(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETDEBUGVAR \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_getdefelem(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETDEFELEM \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_getnkeys(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETNKEYS \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_getpack(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETPACK \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_getpos(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETPOS \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_getsig(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETSIG \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_getsubstr(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETSUBSTR \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_gettaint(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETTAINT \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_getuvar(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETUVAR \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_getvec(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_GETVEC \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg); -#define PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS \ - assert(sv); assert(mg) -PERL_CALLCONV SV* Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags, U32 argc, ...); -#define PERL_ARGS_ASSERT_MAGIC_METHCALL \ - assert(sv); assert(mg); assert(meth) -PERL_CALLCONV int Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key); -#define PERL_ARGS_ASSERT_MAGIC_NEXTPACK \ - assert(sv); assert(mg); assert(key) -PERL_CALLCONV U32 Perl_magic_regdata_cnt(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_regdatum_get(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET \ - assert(sv); assert(mg) -PERL_CALLCONV SV* Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg); -#define PERL_ARGS_ASSERT_MAGIC_SCALARPACK \ - assert(hv); assert(mg) -PERL_CALLCONV int Perl_magic_set(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SET \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_set_all_env(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setarylen(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETARYLEN \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setdbline(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETDBLINE \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setdebugvar(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETDEBUGVAR \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setdefelem(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETDEFELEM \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setenv(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETENV \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_sethint(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETHINT \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setisa(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETISA \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setlvref(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETLVREF \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setmglob(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETMGLOB \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setnkeys(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETNKEYS \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setnonelem(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETNONELEM \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setpack(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETPACK \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setpos(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETPOS \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setregexp(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETREGEXP \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setsig(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETSIG \ - assert(mg) -PERL_CALLCONV int Perl_magic_setsigall(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETSIGALL \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setsubstr(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETSUBSTR \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_settaint(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETTAINT \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setutf8(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETUTF8 \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setuvar(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETUVAR \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setvec(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETVEC \ - assert(sv); assert(mg) -PERL_CALLCONV U32 Perl_magic_sizepack(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SIZEPACK \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_wipepack(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_WIPEPACK \ - assert(sv); assert(mg) -PERL_CALLCONV Malloc_t Perl_malloc(MEM_SIZE nbytes) - __attribute__malloc__ - __attribute__warn_unused_result__; + +PERL_CALLCONV int +Perl_magic_existspack(pTHX_ SV *sv, const MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_EXISTSPACK \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_freearylen_p(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_freedestruct(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_FREEDESTRUCT \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_freemglob(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_FREEMGLOB \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_freeovrld(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_FREEOVRLD \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_freeutf8(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_FREEUTF8 \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GET \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_getarylen(pTHX_ SV *sv, const MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETARYLEN \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_getdebugvar(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETDEBUGVAR \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETDEFELEM \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETNKEYS \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETPACK \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETPOS \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETSIG \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETSUBSTR \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETTAINT \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETUVAR \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_GETVEC \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS \ + assert(sv); assert(mg) + +PERL_CALLCONV SV * +Perl_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags, U32 argc, ...) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_METHCALL \ + assert(sv); assert(mg); assert(meth) + +PERL_CALLCONV int +Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_NEXTPACK \ + assert(sv); assert(mg); assert(key) + +PERL_CALLCONV U32 +Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET \ + assert(sv); assert(mg) + +PERL_CALLCONV SV * +Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SCALARPACK \ + assert(hv); assert(mg) + +PERL_CALLCONV int +Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SET \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETARYLEN \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETDBLINE \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setdebugvar(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETDEBUGVAR \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETDEFELEM \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETENV \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_sethint(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETHINT \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_sethook(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETHOOK \ + assert(mg) + +PERL_CALLCONV int +Perl_magic_sethookall(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETHOOKALL \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETISA \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setlvref(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETLVREF \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETMGLOB \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETNKEYS \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setnonelem(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETNONELEM \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETPACK \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETPOS \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setregexp(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETREGEXP \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETSIG \ + assert(mg) + +PERL_CALLCONV int +Perl_magic_setsigall(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETSIGALL \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETSUBSTR \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETTAINT \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setutf8(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETUTF8 \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETUVAR \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SETVEC \ + assert(sv); assert(mg) + +PERL_CALLCONV U32 +Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_SIZEPACK \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MAGIC_WIPEPACK \ + assert(sv); assert(mg) + +PERL_CALLCONV Malloc_t +Perl_malloc(MEM_SIZE nbytes) + __attribute__malloc__ + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_MALLOC -PERL_CALLCONV I32 * Perl_markstack_grow(pTHX); +PERL_CALLCONV I32 * +Perl_markstack_grow(pTHX); #define PERL_ARGS_ASSERT_MARKSTACK_GROW -PERL_CALLCONV SV* Perl_mess(pTHX_ const char* pat, ...) - __attribute__format__(__printf__,pTHX_1,pTHX_2); -#define PERL_ARGS_ASSERT_MESS \ - assert(pat) - -PERL_CALLCONV SV* Perl_mess_sv(pTHX_ SV* basemsg, bool consume); -#define PERL_ARGS_ASSERT_MESS_SV \ - assert(basemsg) -PERL_CALLCONV Free_t Perl_mfree(Malloc_t where); + +PERL_CALLCONV int +Perl_mbtowc_(pTHX_ const wchar_t *pwc, const char *s, const Size_t len); +#define PERL_ARGS_ASSERT_MBTOWC_ + +PERL_CALLCONV SV * +Perl_mess(pTHX_ const char *pat, ...) + __attribute__format__(__printf__,pTHX_1,pTHX_2); +#define PERL_ARGS_ASSERT_MESS \ + assert(pat) + +PERL_CALLCONV SV * +Perl_mess_sv(pTHX_ SV *basemsg, bool consume); +#define PERL_ARGS_ASSERT_MESS_SV \ + assert(basemsg) + +PERL_CALLCONV Free_t +Perl_mfree(Malloc_t where); #define PERL_ARGS_ASSERT_MFREE -PERL_CALLCONV int Perl_mg_clear(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_MG_CLEAR \ - assert(sv) -PERL_CALLCONV int Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen); -#define PERL_ARGS_ASSERT_MG_COPY \ - assert(sv); assert(nsv) -PERL_CALLCONV MAGIC* Perl_mg_find(const SV* sv, int type) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MG_FIND -PERL_CALLCONV MAGIC* Perl_mg_find_mglob(pTHX_ SV* sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MG_FIND_MGLOB \ - assert(sv) +PERL_CALLCONV int +Perl_mg_clear(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_MG_CLEAR \ + assert(sv) + +PERL_CALLCONV int +Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen); +#define PERL_ARGS_ASSERT_MG_COPY \ + assert(sv); assert(nsv) + +PERL_CALLCONV MAGIC * +Perl_mg_find(const SV *sv, int type) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_MG_FIND -PERL_CALLCONV MAGIC* Perl_mg_findext(const SV* sv, int type, const MGVTBL *vtbl) - __attribute__warn_unused_result__; +PERL_CALLCONV MAGIC * +Perl_mg_find_mglob(pTHX_ SV *sv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_MG_FIND_MGLOB \ + assert(sv) + +PERL_CALLCONV MAGIC * +Perl_mg_findext(const SV *sv, int type, const MGVTBL *vtbl) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_MG_FINDEXT -PERL_CALLCONV int Perl_mg_free(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_MG_FREE \ - assert(sv) -PERL_CALLCONV void Perl_mg_free_type(pTHX_ SV* sv, int how); -#define PERL_ARGS_ASSERT_MG_FREE_TYPE \ - assert(sv) -PERL_CALLCONV void Perl_mg_freeext(pTHX_ SV* sv, int how, const MGVTBL *vtbl); -#define PERL_ARGS_ASSERT_MG_FREEEXT \ - assert(sv) -PERL_CALLCONV int Perl_mg_get(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_MG_GET \ - assert(sv) -PERL_CALLCONV U32 Perl_mg_length(pTHX_ SV* sv) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_MG_LENGTH \ - assert(sv) - -PERL_CALLCONV void Perl_mg_localize(pTHX_ SV* sv, SV* nsv, bool setmagic); -#define PERL_ARGS_ASSERT_MG_LOCALIZE \ - assert(sv); assert(nsv) -PERL_CALLCONV void Perl_mg_magical(SV* sv); -#define PERL_ARGS_ASSERT_MG_MAGICAL \ - assert(sv) -PERL_CALLCONV int Perl_mg_set(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_MG_SET \ - assert(sv) -PERL_CALLCONV I32 Perl_mg_size(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_MG_SIZE \ - assert(sv) -PERL_CALLCONV void Perl_mini_mktime(struct tm *ptm); -#define PERL_ARGS_ASSERT_MINI_MKTIME \ - assert(ptm) -PERL_CALLCONV int Perl_mode_from_discipline(pTHX_ const char* s, STRLEN len); +PERL_CALLCONV int +Perl_mg_free(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_MG_FREE \ + assert(sv) + +PERL_CALLCONV void +Perl_mg_free_type(pTHX_ SV *sv, int how); +#define PERL_ARGS_ASSERT_MG_FREE_TYPE \ + assert(sv) + +PERL_CALLCONV void +Perl_mg_freeext(pTHX_ SV *sv, int how, const MGVTBL *vtbl); +#define PERL_ARGS_ASSERT_MG_FREEEXT \ + assert(sv) + +PERL_CALLCONV int +Perl_mg_get(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_MG_GET \ + assert(sv) + +PERL_CALLCONV void +Perl_mg_localize(pTHX_ SV *sv, SV *nsv, bool setmagic) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MG_LOCALIZE \ + assert(sv); assert(nsv) + +PERL_CALLCONV void +Perl_mg_magical(SV *sv); +#define PERL_ARGS_ASSERT_MG_MAGICAL \ + assert(sv) + +PERL_CALLCONV int +Perl_mg_set(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_MG_SET \ + assert(sv) + +PERL_CALLCONV I32 +Perl_mg_size(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_MG_SIZE \ + assert(sv) + +PERL_CALLCONV void +Perl_mini_mktime(struct tm *ptm); +#define PERL_ARGS_ASSERT_MINI_MKTIME \ + assert(ptm) + +PERL_CALLCONV int +Perl_mode_from_discipline(pTHX_ const char *s, STRLEN len) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_MODE_FROM_DISCIPLINE -PERL_CALLCONV void * Perl_more_bodies(pTHX_ const svtype sv_type, const size_t body_size, const size_t arena_size); + +PERL_CALLCONV void * +Perl_more_bodies(pTHX_ const svtype sv_type, const size_t body_size, const size_t arena_size); #define PERL_ARGS_ASSERT_MORE_BODIES -PERL_CALLCONV const char* Perl_moreswitches(pTHX_ const char* s); -#define PERL_ARGS_ASSERT_MORESWITCHES \ - assert(s) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE char * Perl_mortal_getenv(const char * str) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MORTAL_GETENV \ - assert(str) -#endif - -PERL_CALLCONV const struct mro_alg * Perl_mro_get_from_name(pTHX_ SV *name); -#define PERL_ARGS_ASSERT_MRO_GET_FROM_NAME \ - assert(name) -PERL_CALLCONV AV* Perl_mro_get_linear_isa(pTHX_ HV* stash); -#define PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA \ - assert(stash) -PERL_CALLCONV SV* Perl_mro_get_private_data(pTHX_ struct mro_meta *const smeta, const struct mro_alg *const which); -#define PERL_ARGS_ASSERT_MRO_GET_PRIVATE_DATA \ - assert(smeta); assert(which) -PERL_CALLCONV void Perl_mro_isa_changed_in(pTHX_ HV* stash); -#define PERL_ARGS_ASSERT_MRO_ISA_CHANGED_IN \ - assert(stash) -PERL_CALLCONV struct mro_meta* Perl_mro_meta_init(pTHX_ HV* stash); -#define PERL_ARGS_ASSERT_MRO_META_INIT \ - assert(stash) -PERL_CALLCONV void Perl_mro_method_changed_in(pTHX_ HV* stash); -#define PERL_ARGS_ASSERT_MRO_METHOD_CHANGED_IN \ - assert(stash) -PERL_CALLCONV void Perl_mro_package_moved(pTHX_ HV * const stash, HV * const oldstash, const GV * const gv, U32 flags); -#define PERL_ARGS_ASSERT_MRO_PACKAGE_MOVED \ - assert(gv) -PERL_CALLCONV void Perl_mro_register(pTHX_ const struct mro_alg *mro); -#define PERL_ARGS_ASSERT_MRO_REGISTER \ - assert(mro) -PERL_CALLCONV void Perl_mro_set_mro(pTHX_ struct mro_meta *const meta, SV *const name); -#define PERL_ARGS_ASSERT_MRO_SET_MRO \ - assert(meta); assert(name) -PERL_CALLCONV SV* Perl_mro_set_private_data(pTHX_ struct mro_meta *const smeta, const struct mro_alg *const which, SV *const data); -#define PERL_ARGS_ASSERT_MRO_SET_PRIVATE_DATA \ - assert(smeta); assert(which); assert(data) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE unsigned Perl_msbit_pos32(U32 word) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MSBIT_POS32 -#endif - -PERL_CALLCONV SV* Perl_multiconcat_stringify(pTHX_ const OP* o); -#define PERL_ARGS_ASSERT_MULTICONCAT_STRINGIFY \ - assert(o) -PERL_CALLCONV SV* Perl_multideref_stringify(pTHX_ const OP* o, CV *cv); -#define PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY \ - assert(o) -PERL_CALLCONV NV Perl_my_atof(pTHX_ const char *s); -#define PERL_ARGS_ASSERT_MY_ATOF \ - assert(s) -PERL_CALLCONV char* Perl_my_atof2(pTHX_ const char *orig, NV* value); -#define PERL_ARGS_ASSERT_MY_ATOF2 \ - assert(orig); assert(value) -PERL_CALLCONV char* Perl_my_atof3(pTHX_ const char *orig, NV* value, const STRLEN len); -#define PERL_ARGS_ASSERT_MY_ATOF3 \ - assert(orig); assert(value) -PERL_CALLCONV OP * Perl_my_attrs(pTHX_ OP *o, OP *attrs); -#define PERL_ARGS_ASSERT_MY_ATTRS \ - assert(o) -PERL_CALLCONV void Perl_my_clearenv(pTHX); + +PERL_CALLCONV const char * +Perl_moreswitches(pTHX_ const char *s); +#define PERL_ARGS_ASSERT_MORESWITCHES \ + assert(s) + +PERL_CALLCONV void +Perl_mortal_destructor_sv(pTHX_ SV *coderef, SV *args); +#define PERL_ARGS_ASSERT_MORTAL_DESTRUCTOR_SV \ + assert(coderef) + +PERL_CALLCONV void +Perl_mortal_svfunc_x(pTHX_ SVFUNC_t f, SV *p); +#define PERL_ARGS_ASSERT_MORTAL_SVFUNC_X + +PERL_CALLCONV const struct mro_alg * +Perl_mro_get_from_name(pTHX_ SV *name); +#define PERL_ARGS_ASSERT_MRO_GET_FROM_NAME \ + assert(name) + +PERL_CALLCONV AV * +Perl_mro_get_linear_isa(pTHX_ HV *stash); +#define PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA \ + assert(stash) + +PERL_CALLCONV SV * +Perl_mro_get_private_data(pTHX_ struct mro_meta * const smeta, const struct mro_alg * const which); +#define PERL_ARGS_ASSERT_MRO_GET_PRIVATE_DATA \ + assert(smeta); assert(which) + +PERL_CALLCONV void +Perl_mro_isa_changed_in(pTHX_ HV *stash) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MRO_ISA_CHANGED_IN \ + assert(stash) + +PERL_CALLCONV struct mro_meta * +Perl_mro_meta_init(pTHX_ HV *stash); +#define PERL_ARGS_ASSERT_MRO_META_INIT \ + assert(stash) + +PERL_CALLCONV void +Perl_mro_method_changed_in(pTHX_ HV *stash); +#define PERL_ARGS_ASSERT_MRO_METHOD_CHANGED_IN \ + assert(stash) + +PERL_CALLCONV void +Perl_mro_package_moved(pTHX_ HV * const stash, HV * const oldstash, const GV * const gv, U32 flags); +#define PERL_ARGS_ASSERT_MRO_PACKAGE_MOVED \ + assert(gv) + +PERL_CALLCONV void +Perl_mro_register(pTHX_ const struct mro_alg *mro); +#define PERL_ARGS_ASSERT_MRO_REGISTER \ + assert(mro) + +PERL_CALLCONV void +Perl_mro_set_mro(pTHX_ struct mro_meta * const meta, SV * const name); +#define PERL_ARGS_ASSERT_MRO_SET_MRO \ + assert(meta); assert(name) + +PERL_CALLCONV SV * +Perl_mro_set_private_data(pTHX_ struct mro_meta * const smeta, const struct mro_alg * const which, SV * const data); +#define PERL_ARGS_ASSERT_MRO_SET_PRIVATE_DATA \ + assert(smeta); assert(which); assert(data) + +PERL_CALLCONV SV * +Perl_multiconcat_stringify(pTHX_ const OP *o); +#define PERL_ARGS_ASSERT_MULTICONCAT_STRINGIFY \ + assert(o) + +PERL_CALLCONV SV * +Perl_multideref_stringify(pTHX_ const OP *o, CV *cv); +#define PERL_ARGS_ASSERT_MULTIDEREF_STRINGIFY \ + assert(o) + +PERL_CALLCONV NV +Perl_my_atof(pTHX_ const char *s); +#define PERL_ARGS_ASSERT_MY_ATOF \ + assert(s) + +PERL_CALLCONV char * +Perl_my_atof2(pTHX_ const char *orig, NV *value); +#define PERL_ARGS_ASSERT_MY_ATOF2 \ + assert(orig); assert(value) + +PERL_CALLCONV char * +Perl_my_atof3(pTHX_ const char *orig, NV *value, const STRLEN len); +#define PERL_ARGS_ASSERT_MY_ATOF3 \ + assert(orig); assert(value) + +PERL_CALLCONV OP * +Perl_my_attrs(pTHX_ OP *o, OP *attrs) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MY_ATTRS \ + assert(o) + +PERL_CALLCONV void +Perl_my_clearenv(pTHX); #define PERL_ARGS_ASSERT_MY_CLEARENV -PERL_CALLCONV int Perl_my_dirfd(DIR* dir); + +PERL_CALLCONV int +Perl_my_dirfd(DIR *dir); #define PERL_ARGS_ASSERT_MY_DIRFD -PERL_CALLCONV_NO_RET void Perl_my_exit(pTHX_ U32 status) - __attribute__noreturn__; + +PERL_CALLCONV_NO_RET void +Perl_my_exit(pTHX_ U32 status) + __attribute__noreturn__; #define PERL_ARGS_ASSERT_MY_EXIT -PERL_CALLCONV_NO_RET void Perl_my_failure_exit(pTHX) - __attribute__noreturn__; +PERL_CALLCONV_NO_RET void +Perl_my_failure_exit(pTHX) + __attribute__noreturn__; #define PERL_ARGS_ASSERT_MY_FAILURE_EXIT -PERL_CALLCONV I32 Perl_my_fflush_all(pTHX); +PERL_CALLCONV I32 +Perl_my_fflush_all(pTHX); #define PERL_ARGS_ASSERT_MY_FFLUSH_ALL -PERL_CALLCONV Pid_t Perl_my_fork(void); + +PERL_CALLCONV Pid_t +Perl_my_fork(void); #define PERL_ARGS_ASSERT_MY_FORK -/* PERL_CALLCONV I32 my_lstat(pTHX); */ -#define PERL_ARGS_ASSERT_MY_LSTAT -PERL_CALLCONV I32 Perl_my_lstat_flags(pTHX_ const U32 flags); + +/* PERL_CALLCONV I32 +my_lstat(pTHX); */ + +PERL_CALLCONV I32 +Perl_my_lstat_flags(pTHX_ const U32 flags); #define PERL_ARGS_ASSERT_MY_LSTAT_FLAGS -PERL_CALLCONV int Perl_my_mkostemp_cloexec(char *templte, int flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MY_MKOSTEMP_CLOEXEC \ - assert(templte) - -PERL_CALLCONV int Perl_my_mkstemp_cloexec(char *templte) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MY_MKSTEMP_CLOEXEC \ - assert(templte) - -PERL_CALLCONV PerlIO* Perl_my_popen_list(pTHX_ const char* mode, int n, SV ** args); -#define PERL_ARGS_ASSERT_MY_POPEN_LIST \ - assert(mode); assert(args) -PERL_CALLCONV void Perl_my_setenv(pTHX_ const char* nam, const char* val); + +PERL_CALLCONV int +Perl_my_mkostemp_cloexec(char *templte, int flags) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MY_MKOSTEMP_CLOEXEC \ + assert(templte) + +PERL_CALLCONV int +Perl_my_mkstemp_cloexec(char *templte) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MY_MKSTEMP_CLOEXEC \ + assert(templte) + +PERL_CALLCONV PerlIO * +Perl_my_popen_list(pTHX_ const char *mode, int n, SV **args); +#define PERL_ARGS_ASSERT_MY_POPEN_LIST \ + assert(mode); assert(args) + +PERL_CALLCONV void +Perl_my_setenv(pTHX_ const char *nam, const char *val); #define PERL_ARGS_ASSERT_MY_SETENV -PERL_CALLCONV int Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...) - __attribute__format__(__printf__,3,4); -#define PERL_ARGS_ASSERT_MY_SNPRINTF \ - assert(buffer); assert(format) -PERL_CALLCONV int Perl_my_socketpair(int family, int type, int protocol, int fd[2]); +PERL_CALLCONV int +Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...) + __attribute__format__(__printf__,3,4); +#define PERL_ARGS_ASSERT_MY_SNPRINTF \ + assert(buffer); assert(format) + +PERL_CALLCONV int +Perl_my_socketpair(int family, int type, int protocol, int fd[2]); #define PERL_ARGS_ASSERT_MY_SOCKETPAIR -/* PERL_CALLCONV I32 my_stat(pTHX); */ -#define PERL_ARGS_ASSERT_MY_STAT -PERL_CALLCONV I32 Perl_my_stat_flags(pTHX_ const U32 flags); + +/* PERL_CALLCONV I32 +my_stat(pTHX); */ + +PERL_CALLCONV I32 +Perl_my_stat_flags(pTHX_ const U32 flags); #define PERL_ARGS_ASSERT_MY_STAT_FLAGS -PERL_CALLCONV char* Perl_my_strerror(pTHX_ const int errnum); -#define PERL_ARGS_ASSERT_MY_STRERROR -PERL_CALLCONV char * Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst) - __attribute__format__(__strftime__,pTHX_1,0); -#define PERL_ARGS_ASSERT_MY_STRFTIME \ - assert(fmt) - -PERL_CALLCONV NV Perl_my_strtod(const char * const s, char ** e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MY_STRTOD \ - assert(s) -PERL_CALLCONV void Perl_my_unexec(pTHX); +PERL_CALLCONV const char * +Perl_my_strerror(pTHX_ const int errnum, utf8ness_t *utf8ness) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_MY_STRERROR \ + assert(utf8ness) + +PERL_CALLCONV char * +Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst) + __attribute__format__(__strftime__,pTHX_1,0); +#define PERL_ARGS_ASSERT_MY_STRFTIME \ + assert(fmt) + +PERL_CALLCONV char * +Perl_my_strftime8_temp(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst, utf8ness_t *utf8ness) + __attribute__format__(__strftime__,pTHX_1,0); +#define PERL_ARGS_ASSERT_MY_STRFTIME8_TEMP \ + assert(fmt) + +PERL_CALLCONV NV +Perl_my_strtod(const char * const s, char **e) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_MY_STRTOD \ + assert(s) + +PERL_CALLCONV void +Perl_my_unexec(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_MY_UNEXEC -PERL_CALLCONV int Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap); -#define PERL_ARGS_ASSERT_MY_VSNPRINTF \ - assert(buffer); assert(format) -PERL_CALLCONV OP* Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block); + +PERL_CALLCONV int +Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap); +#define PERL_ARGS_ASSERT_MY_VSNPRINTF \ + assert(buffer); assert(format) + +PERL_CALLCONV OP * +Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block); #define PERL_ARGS_ASSERT_NEWANONATTRSUB -PERL_CALLCONV OP* Perl_newANONHASH(pTHX_ OP* o) - __attribute__warn_unused_result__; + +PERL_CALLCONV OP * +Perl_newANONHASH(pTHX_ OP *o) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWANONHASH -PERL_CALLCONV OP* Perl_newANONLIST(pTHX_ OP* o) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newANONLIST(pTHX_ OP *o) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWANONLIST -PERL_CALLCONV OP* Perl_newANONSUB(pTHX_ I32 floor, OP* proto, OP* block); +PERL_CALLCONV OP * +Perl_newANONSUB(pTHX_ I32 floor, OP *proto, OP *block); #define PERL_ARGS_ASSERT_NEWANONSUB -PERL_CALLCONV OP* Perl_newASSIGNOP(pTHX_ I32 flags, OP* left, I32 optype, OP* right) - __attribute__warn_unused_result__; + +PERL_CALLCONV OP * +Perl_newARGDEFELEMOP(pTHX_ I32 flags, OP *expr, I32 argindex) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWARGDEFELEMOP \ + assert(expr) + +PERL_CALLCONV OP * +Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWASSIGNOP -/* PERL_CALLCONV CV* newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block); */ -#define PERL_ARGS_ASSERT_NEWATTRSUB -PERL_CALLCONV CV* Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block, bool o_is_gv); +/* PERL_CALLCONV CV * +newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block); */ + +PERL_CALLCONV CV * +Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block, bool o_is_gv); #define PERL_ARGS_ASSERT_NEWATTRSUB_X -#ifndef NO_MATHOMS -PERL_CALLCONV AV* Perl_newAV(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWAV -#endif - -PERL_CALLCONV OP* Perl_newAVREF(pTHX_ OP* o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWAVREF \ - assert(o) - -/* PERL_CALLCONV AV* newAV_alloc_x(pTHX_ SSize_t size) - __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_NEWAV_ALLOC_X - -/* PERL_CALLCONV AV* newAV_alloc_xz(pTHX_ SSize_t size) - __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_NEWAV_ALLOC_XZ -PERL_CALLCONV OP* Perl_newBINOP(pTHX_ I32 type, I32 flags, OP* first, OP* last) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newAVREF(pTHX_ OP *o) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWAVREF \ + assert(o) + +/* PERL_CALLCONV AV * +newAV_alloc_x(pTHX_ SSize_t size) + __attribute__warn_unused_result__; */ + +/* PERL_CALLCONV AV * +newAV_alloc_xz(pTHX_ SSize_t size) + __attribute__warn_unused_result__; */ + +PERL_CALLCONV AV * +Perl_newAVav(pTHX_ AV *oav) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWAVAV + +PERL_CALLCONV AV * +Perl_newAVhv(pTHX_ HV *ohv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWAVHV + +PERL_CALLCONV OP * +Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWBINOP -PERL_CALLCONV OP* Perl_newCONDOP(pTHX_ I32 flags, OP* first, OP* trueop, OP* falseop) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWCONDOP \ - assert(first) +PERL_CALLCONV OP * +Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWCONDOP \ + assert(first) -PERL_CALLCONV CV* Perl_newCONSTSUB(pTHX_ HV* stash, const char* name, SV* sv); +PERL_CALLCONV CV * +Perl_newCONSTSUB(pTHX_ HV *stash, const char *name, SV *sv); #define PERL_ARGS_ASSERT_NEWCONSTSUB -PERL_CALLCONV CV* Perl_newCONSTSUB_flags(pTHX_ HV* stash, const char* name, STRLEN len, U32 flags, SV* sv); + +PERL_CALLCONV CV * +Perl_newCONSTSUB_flags(pTHX_ HV *stash, const char *name, STRLEN len, U32 flags, SV *sv); #define PERL_ARGS_ASSERT_NEWCONSTSUB_FLAGS -PERL_CALLCONV OP* Perl_newCVREF(pTHX_ I32 flags, OP* o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWCVREF -PERL_CALLCONV OP* Perl_newDEFEROP(pTHX_ I32 flags, OP *block) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWDEFEROP \ - assert(block) +PERL_CALLCONV OP * +Perl_newCVREF(pTHX_ I32 flags, OP *o) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWCVREF -PERL_CALLCONV OP* Perl_newDEFSVOP(pTHX) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newDEFEROP(pTHX_ I32 flags, OP *block) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWDEFEROP \ + assert(block) + +PERL_CALLCONV OP * +Perl_newDEFSVOP(pTHX) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWDEFSVOP -PERL_CALLCONV void Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block); +PERL_CALLCONV void +Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block); #define PERL_ARGS_ASSERT_NEWFORM -PERL_CALLCONV OP* Perl_newFOROP(pTHX_ I32 flags, OP* sv, OP* expr, OP* block, OP* cont) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWFOROP \ - assert(expr) - -PERL_CALLCONV OP* Perl_newGIVENOP(pTHX_ OP* cond, OP* block, PADOFFSET defsv_off) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWGIVENOP \ - assert(cond); assert(block) - -PERL_CALLCONV GP * Perl_newGP(pTHX_ GV *const gv); -#define PERL_ARGS_ASSERT_NEWGP \ - assert(gv) -PERL_CALLCONV OP* Perl_newGVOP(pTHX_ I32 type, I32 flags, GV* gv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWGVOP \ - assert(gv) -PERL_CALLCONV OP* Perl_newGVREF(pTHX_ I32 type, OP* o) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWFOROP \ + assert(expr) + +PERL_CALLCONV OP * +Perl_newGIVENOP(pTHX_ OP *cond, OP *block, PADOFFSET defsv_off) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWGIVENOP \ + assert(cond); assert(block) + +PERL_CALLCONV GP * +Perl_newGP(pTHX_ GV * const gv); +#define PERL_ARGS_ASSERT_NEWGP \ + assert(gv) + +PERL_CALLCONV OP * +Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWGVOP \ + assert(gv) + +PERL_CALLCONV OP * +Perl_newGVREF(pTHX_ I32 type, OP *o) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWGVREF -/* PERL_CALLCONV GV* newGVgen(pTHX_ const char* pack); */ -#define PERL_ARGS_ASSERT_NEWGVGEN -PERL_CALLCONV GV* Perl_newGVgen_flags(pTHX_ const char* pack, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWGVGEN_FLAGS \ - assert(pack) - -#ifndef NO_MATHOMS -PERL_CALLCONV HV* Perl_newHV(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWHV -#endif - -PERL_CALLCONV OP* Perl_newHVREF(pTHX_ OP* o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWHVREF \ - assert(o) +/* PERL_CALLCONV GV * +newGVgen(pTHX_ const char *pack); */ -PERL_CALLCONV HV* Perl_newHVhv(pTHX_ HV *hv) - __attribute__warn_unused_result__; +PERL_CALLCONV GV * +Perl_newGVgen_flags(pTHX_ const char *pack, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWGVGEN_FLAGS \ + assert(pack) + +PERL_CALLCONV OP * +Perl_newHVREF(pTHX_ OP *o) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWHVREF \ + assert(o) + +PERL_CALLCONV HV * +Perl_newHVhv(pTHX_ HV *hv) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWHVHV -#ifndef NO_MATHOMS -PERL_CALLCONV IO* Perl_newIO(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWIO -#endif - -PERL_CALLCONV OP* Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP* first, OP* last) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWLISTOP -PERL_CALLCONV OP* Perl_newLOGOP(pTHX_ I32 optype, I32 flags, OP *first, OP *other) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWLOGOP \ - assert(first); assert(other) - -PERL_CALLCONV OP* Perl_newLOOPEX(pTHX_ I32 type, OP* label) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWLOOPEX \ - assert(label) - -PERL_CALLCONV OP* Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP* expr, OP* block) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWLOOPOP - -PERL_CALLCONV OP* Perl_newMETHOP(pTHX_ I32 type, I32 flags, OP* dynamic_meth) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWMETHOP \ - assert(dynamic_meth) - -PERL_CALLCONV OP* Perl_newMETHOP_named(pTHX_ I32 type, I32 flags, SV* const_meth) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWMETHOP_NAMED \ - assert(const_meth) - -PERL_CALLCONV CV * Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block); -#define PERL_ARGS_ASSERT_NEWMYSUB \ - assert(o) -PERL_CALLCONV OP* Perl_newNULLLIST(pTHX) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newLOGOP(pTHX_ I32 optype, I32 flags, OP *first, OP *other) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWLOGOP \ + assert(first); assert(other) + +PERL_CALLCONV OP * +Perl_newLOOPEX(pTHX_ I32 type, OP *label) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWLOOPEX \ + assert(label) + +PERL_CALLCONV OP * +Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWLOOPOP \ + assert(expr) + +PERL_CALLCONV OP * +Perl_newMETHOP(pTHX_ I32 type, I32 flags, OP *dynamic_meth) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWMETHOP \ + assert(dynamic_meth) + +PERL_CALLCONV OP * +Perl_newMETHOP_named(pTHX_ I32 type, I32 flags, SV * const_meth) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWMETHOP_NAMED \ + assert(const_meth) + +PERL_CALLCONV CV * +Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block); +#define PERL_ARGS_ASSERT_NEWMYSUB \ + assert(o) + +PERL_CALLCONV OP * +Perl_newNULLLIST(pTHX) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWNULLLIST -PERL_CALLCONV OP* Perl_newOP(pTHX_ I32 optype, I32 flags) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newOP(pTHX_ I32 optype, I32 flags) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWOP -PERL_CALLCONV PADNAMELIST * Perl_newPADNAMELIST(size_t max) - __attribute__warn_unused_result__; +PERL_CALLCONV PADNAMELIST * +Perl_newPADNAMELIST(size_t max) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWPADNAMELIST -PERL_CALLCONV PADNAME * Perl_newPADNAMEouter(PADNAME *outer) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWPADNAMEOUTER \ - assert(outer) - -PERL_CALLCONV PADNAME * Perl_newPADNAMEpvn(const char *s, STRLEN len) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWPADNAMEPVN \ - assert(s) - -PERL_CALLCONV OP* Perl_newPMOP(pTHX_ I32 type, I32 flags) - __attribute__warn_unused_result__; +PERL_CALLCONV PADNAME * +Perl_newPADNAMEouter(PADNAME *outer) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWPADNAMEOUTER \ + assert(outer) + +PERL_CALLCONV PADNAME * +Perl_newPADNAMEpvn(const char *s, STRLEN len) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWPADNAMEPVN \ + assert(s) + +PERL_CALLCONV OP * +Perl_newPMOP(pTHX_ I32 type, I32 flags) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWPMOP -PERL_CALLCONV void Perl_newPROG(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_NEWPROG \ - assert(o) -PERL_CALLCONV OP* Perl_newPVOP(pTHX_ I32 type, I32 flags, char* pv) - __attribute__warn_unused_result__; +PERL_CALLCONV void +Perl_newPROG(pTHX_ OP *o); +#define PERL_ARGS_ASSERT_NEWPROG \ + assert(o) + +PERL_CALLCONV OP * +Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWPVOP -PERL_CALLCONV OP* Perl_newRANGE(pTHX_ I32 flags, OP* left, OP* right) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWRANGE \ - assert(left); assert(right) - -PERL_CALLCONV SV* Perl_newRV(pTHX_ SV *const sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWRV \ - assert(sv) - -PERL_CALLCONV SV* Perl_newRV_noinc(pTHX_ SV *const tmpRef) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWRV_NOINC \ - assert(tmpRef) - -PERL_CALLCONV OP* Perl_newSLICEOP(pTHX_ I32 flags, OP* subscript, OP* listop) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newRANGE(pTHX_ I32 flags, OP *left, OP *right) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWRANGE \ + assert(left); assert(right) + +PERL_CALLCONV SV * +Perl_newRV(pTHX_ SV * const sv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWRV \ + assert(sv) + +PERL_CALLCONV OP * +Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listop) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSLICEOP -PERL_CALLCONV OP* Perl_newSTATEOP(pTHX_ I32 flags, char* label, OP* o) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSTATEOP -PERL_CALLCONV CV* Perl_newSTUB(pTHX_ GV *gv, bool fake); -#define PERL_ARGS_ASSERT_NEWSTUB \ - assert(gv) -#ifndef NO_MATHOMS -PERL_CALLCONV CV* Perl_newSUB(pTHX_ I32 floor, OP* o, OP* proto, OP* block); -#define PERL_ARGS_ASSERT_NEWSUB -#endif -PERL_CALLCONV SV* Perl_newSV(pTHX_ const STRLEN len) - __attribute__warn_unused_result__; +PERL_CALLCONV CV * +Perl_newSTUB(pTHX_ GV *gv, bool fake) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_NEWSTUB \ + assert(gv) + +PERL_CALLCONV SV * +Perl_newSV(pTHX_ const STRLEN len) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSV -PERL_CALLCONV OP* Perl_newSVOP(pTHX_ I32 type, I32 flags, SV* sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWSVOP \ - assert(sv) - -PERL_CALLCONV OP* Perl_newSVREF(pTHX_ OP* o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWSVREF \ - assert(o) - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE SV* Perl_newSV_type(pTHX_ const svtype type) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWSV_TYPE -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_FORCE_INLINE SV* Perl_newSV_type_mortal(pTHX_ const svtype type) - __attribute__warn_unused_result__ - __attribute__always_inline__; -#define PERL_ARGS_ASSERT_NEWSV_TYPE_MORTAL -#endif - -PERL_CALLCONV SV* Perl_newSVavdefelem(pTHX_ AV *av, SSize_t ix, bool extendible) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWSVAVDEFELEM \ - assert(av) - -PERL_CALLCONV SV* Perl_newSVhek(pTHX_ const HEK *const hek) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWSVOP \ + assert(sv) + +PERL_CALLCONV OP * +Perl_newSVREF(pTHX_ OP *o) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWSVREF \ + assert(o) + +PERL_CALLCONV SV * +Perl_newSV_false(pTHX) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWSV_FALSE + +PERL_CALLCONV SV * +Perl_newSV_true(pTHX) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWSV_TRUE + +PERL_CALLCONV SV * +Perl_newSVavdefelem(pTHX_ AV *av, SSize_t ix, bool extendible) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_NEWSVAVDEFELEM \ + assert(av) + +PERL_CALLCONV SV * +Perl_newSVbool(pTHX_ const bool bool_val) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWSVBOOL + +PERL_CALLCONV SV * +Perl_newSVhek(pTHX_ const HEK * const hek) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSVHEK -PERL_CALLCONV SV* Perl_newSViv(pTHX_ const IV i) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_newSVhek_mortal(pTHX_ const HEK * const hek) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWSVHEK_MORTAL + +PERL_CALLCONV SV * +Perl_newSViv(pTHX_ const IV i) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSVIV -PERL_CALLCONV SV* Perl_newSVnv(pTHX_ const NV n) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_newSVnv(pTHX_ const NV n) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSVNV -PERL_CALLCONV SV* Perl_newSVpv(pTHX_ const char *const s, const STRLEN len) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_newSVpv(pTHX_ const char * const s, const STRLEN len) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSVPV -PERL_CALLCONV SV* Perl_newSVpv_share(pTHX_ const char* s, U32 hash) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_newSVpv_share(pTHX_ const char *s, U32 hash) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSVPV_SHARE -PERL_CALLCONV SV* Perl_newSVpvf(pTHX_ const char *const pat, ...) - __attribute__warn_unused_result__ - __attribute__format__(__printf__,pTHX_1,pTHX_2); -#define PERL_ARGS_ASSERT_NEWSVPVF \ - assert(pat) - -PERL_CALLCONV SV* Perl_newSVpvn(pTHX_ const char *const buffer, const STRLEN len) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_newSVpvf(pTHX_ const char * const pat, ...) + __attribute__warn_unused_result__ + __attribute__format__(__printf__,pTHX_1,pTHX_2); +#define PERL_ARGS_ASSERT_NEWSVPVF \ + assert(pat) + +PERL_CALLCONV SV * +Perl_newSVpvn(pTHX_ const char * const buffer, const STRLEN len) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSVPVN -PERL_CALLCONV SV* Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_newSVpvn_flags(pTHX_ const char * const s, const STRLEN len, const U32 flags) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSVPVN_FLAGS -PERL_CALLCONV SV* Perl_newSVpvn_share(pTHX_ const char* s, I32 len, U32 hash) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_newSVpvn_share(pTHX_ const char *s, I32 len, U32 hash) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSVPVN_SHARE -PERL_CALLCONV SV* Perl_newSVrv(pTHX_ SV *const rv, const char *const classname); -#define PERL_ARGS_ASSERT_NEWSVRV \ - assert(rv) -#ifndef NO_MATHOMS -PERL_CALLCONV SV* Perl_newSVsv(pTHX_ SV *const old) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWSVSV -#endif - -PERL_CALLCONV SV* Perl_newSVsv_flags(pTHX_ SV *const old, I32 flags) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_newSVrv(pTHX_ SV * const rv, const char * const classname); +#define PERL_ARGS_ASSERT_NEWSVRV \ + assert(rv) + +PERL_CALLCONV SV * +Perl_newSVsv_flags(pTHX_ SV * const old, I32 flags) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSVSV_FLAGS -/* PERL_CALLCONV SV* newSVsv_nomg(pTHX_ SV *const old) - __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_NEWSVSV_NOMG - -PERL_CALLCONV SV* Perl_newSVuv(pTHX_ const UV u) - __attribute__warn_unused_result__; +/* PERL_CALLCONV SV * +newSVsv_nomg(pTHX_ SV * const old) + __attribute__warn_unused_result__; */ + +PERL_CALLCONV SV * +Perl_newSVuv(pTHX_ const UV u) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWSVUV -PERL_CALLCONV OP* Perl_newTRYCATCHOP(pTHX_ I32 flags, OP* tryblock, OP *catchvar, OP* catchblock) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWTRYCATCHOP \ - assert(tryblock); assert(catchvar); assert(catchblock) - -PERL_CALLCONV OP* Perl_newUNOP(pTHX_ I32 type, I32 flags, OP* first) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newTRYCATCHOP(pTHX_ I32 flags, OP *tryblock, OP *catchvar, OP *catchblock) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWTRYCATCHOP \ + assert(tryblock); assert(catchvar); assert(catchblock) + +PERL_CALLCONV OP * +Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWUNOP -PERL_CALLCONV OP* Perl_newUNOP_AUX(pTHX_ I32 type, I32 flags, OP* first, UNOP_AUX_item *aux) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newUNOP_AUX(pTHX_ I32 type, I32 flags, OP *first, UNOP_AUX_item *aux) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWUNOP_AUX -PERL_CALLCONV OP* Perl_newWHENOP(pTHX_ OP* cond, OP* block) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWWHENOP \ - assert(block) - -PERL_CALLCONV OP* Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP* loop, OP* expr, OP* block, OP* cont, I32 has_my) - __attribute__warn_unused_result__; +PERL_CALLCONV OP * +Perl_newWHENOP(pTHX_ OP *cond, OP *block) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEWWHENOP \ + assert(block) + +PERL_CALLCONV OP * +Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP *loop, OP *expr, OP *block, OP *cont, I32 has_my) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEWWHILEOP -PERL_CALLCONV CV* Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename); -#define PERL_ARGS_ASSERT_NEWXS \ - assert(subaddr); assert(filename) -PERL_CALLCONV CV * Perl_newXS_deffile(pTHX_ const char *name, XSUBADDR_t subaddr); -#define PERL_ARGS_ASSERT_NEWXS_DEFFILE \ - assert(name); assert(subaddr) -PERL_CALLCONV CV * Perl_newXS_flags(pTHX_ const char *name, XSUBADDR_t subaddr, const char *const filename, const char *const proto, U32 flags); -#define PERL_ARGS_ASSERT_NEWXS_FLAGS \ - assert(subaddr); assert(filename) -PERL_CALLCONV CV * Perl_newXS_len_flags(pTHX_ const char *name, STRLEN len, XSUBADDR_t subaddr, const char *const filename, const char *const proto, SV **const_svp, U32 flags); -#define PERL_ARGS_ASSERT_NEWXS_LEN_FLAGS \ - assert(subaddr) -PERL_CALLCONV PERL_SI* Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems) - __attribute__warn_unused_result__; +PERL_CALLCONV CV * +Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename); +#define PERL_ARGS_ASSERT_NEWXS \ + assert(subaddr); assert(filename) + +PERL_CALLCONV CV * +Perl_newXS_deffile(pTHX_ const char *name, XSUBADDR_t subaddr); +#define PERL_ARGS_ASSERT_NEWXS_DEFFILE \ + assert(name); assert(subaddr) + +PERL_CALLCONV CV * +Perl_newXS_flags(pTHX_ const char *name, XSUBADDR_t subaddr, const char * const filename, const char * const proto, U32 flags); +#define PERL_ARGS_ASSERT_NEWXS_FLAGS \ + assert(subaddr); assert(filename) + +PERL_CALLCONV CV * +Perl_newXS_len_flags(pTHX_ const char *name, STRLEN len, XSUBADDR_t subaddr, const char * const filename, const char * const proto, SV ** const_svp, U32 flags) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_NEWXS_LEN_FLAGS \ + assert(subaddr) + +PERL_CALLCONV PERL_SI * +Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_NEW_STACKINFO -PERL_CALLCONV SV* Perl_new_version(pTHX_ SV *ver); -#define PERL_ARGS_ASSERT_NEW_VERSION \ - assert(ver) -PERL_CALLCONV STRLEN * Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits, STRLEN size) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD \ - assert(bits) - -PERL_CALLCONV PerlIO* Perl_nextargv(pTHX_ GV* gv, bool nomagicopen); -#define PERL_ARGS_ASSERT_NEXTARGV \ - assert(gv) -PERL_CALLCONV char* Perl_ninstr(const char* big, const char* bigend, const char* little, const char* lend) - __attribute__warn_unused_result__ - __attribute__pure__; -#define PERL_ARGS_ASSERT_NINSTR \ - assert(big); assert(bigend); assert(little); assert(lend) - -PERL_CALLCONV void Perl_no_bareword_filehandle(pTHX_ const char *fhname); -#define PERL_ARGS_ASSERT_NO_BAREWORD_FILEHANDLE \ - assert(fhname) -PERL_CALLCONV_NO_RET void Perl_noperl_die(const char* pat, ...) - __attribute__noreturn__ - __attribute__format__(__printf__,1,2); -#define PERL_ARGS_ASSERT_NOPERL_DIE \ - assert(pat) +PERL_CALLCONV SV * +Perl_new_version(pTHX_ SV *ver); +#define PERL_ARGS_ASSERT_NEW_VERSION \ + assert(ver) + +PERL_CALLCONV char * +Perl_new_warnings_bitfield(pTHX_ char *buffer, const char * const bits, STRLEN size) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD \ + assert(bits) + +PERL_CALLCONV PerlIO * +Perl_nextargv(pTHX_ GV *gv, bool nomagicopen) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_NEXTARGV \ + assert(gv) + +PERL_CALLCONV char * +Perl_ninstr(const char *big, const char *bigend, const char *little, const char *lend) + __attribute__warn_unused_result__ + __attribute__pure__; +#define PERL_ARGS_ASSERT_NINSTR \ + assert(big); assert(bigend); assert(little); assert(lend) + +PERL_CALLCONV void +Perl_no_bareword_filehandle(pTHX_ const char *fhname) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_NO_BAREWORD_FILEHANDLE \ + assert(fhname) + +PERL_CALLCONV_NO_RET void +Perl_noperl_die(const char *pat, ...) + __attribute__noreturn__ + __attribute__format__(__printf__,1,2); +#define PERL_ARGS_ASSERT_NOPERL_DIE \ + assert(pat) -PERL_CALLCONV int Perl_nothreadhook(pTHX); +PERL_CALLCONV int +Perl_nothreadhook(pTHX); #define PERL_ARGS_ASSERT_NOTHREADHOOK -PERL_CALLCONV void Perl_notify_parser_that_changed_to_utf8(pTHX); + +PERL_CALLCONV void +Perl_notify_parser_that_changed_to_utf8(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_NOTIFY_PARSER_THAT_CHANGED_TO_UTF8 -PERL_CALLCONV OP* Perl_oopsAV(pTHX_ OP* o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_OOPSAV \ - assert(o) - -PERL_CALLCONV OP* Perl_oopsHV(pTHX_ OP* o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_OOPSHV \ - assert(o) -PERL_CALLCONV OP* Perl_op_append_elem(pTHX_ I32 optype, OP* first, OP* last); +PERL_CALLCONV OP * +Perl_oopsAV(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_OOPSAV \ + assert(o) + +PERL_CALLCONV OP * +Perl_oopsHV(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_OOPSHV \ + assert(o) + +PERL_CALLCONV OP * +Perl_op_append_elem(pTHX_ I32 optype, OP *first, OP *last); #define PERL_ARGS_ASSERT_OP_APPEND_ELEM -PERL_CALLCONV OP* Perl_op_append_list(pTHX_ I32 optype, OP* first, OP* last); + +PERL_CALLCONV OP * +Perl_op_append_list(pTHX_ I32 optype, OP *first, OP *last); #define PERL_ARGS_ASSERT_OP_APPEND_LIST -PERL_CALLCONV OPclass Perl_op_class(pTHX_ const OP *o); + +PERL_CALLCONV OPclass +Perl_op_class(pTHX_ const OP *o); #define PERL_ARGS_ASSERT_OP_CLASS -PERL_CALLCONV void Perl_op_clear(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_OP_CLEAR \ - assert(o) -PERL_CALLCONV OP* Perl_op_contextualize(pTHX_ OP* o, I32 context); -#define PERL_ARGS_ASSERT_OP_CONTEXTUALIZE \ - assert(o) -PERL_CALLCONV OP* Perl_op_convert_list(pTHX_ I32 optype, I32 flags, OP* o) - __attribute__warn_unused_result__; + +PERL_CALLCONV void +Perl_op_clear(pTHX_ OP *o); +#define PERL_ARGS_ASSERT_OP_CLEAR \ + assert(o) + +PERL_CALLCONV OP * +Perl_op_contextualize(pTHX_ OP *o, I32 context); +#define PERL_ARGS_ASSERT_OP_CONTEXTUALIZE \ + assert(o) + +PERL_CALLCONV OP * +Perl_op_convert_list(pTHX_ I32 optype, I32 flags, OP *o) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_OP_CONVERT_LIST -PERL_CALLCONV void Perl_op_dump(pTHX_ const OP *o); -#define PERL_ARGS_ASSERT_OP_DUMP \ - assert(o) -PERL_CALLCONV void Perl_op_free(pTHX_ OP* arg); +PERL_CALLCONV void +Perl_op_dump(pTHX_ const OP *o); +#define PERL_ARGS_ASSERT_OP_DUMP \ + assert(o) + +PERL_CALLCONV OP * +Perl_op_force_list(pTHX_ OP *o); +#define PERL_ARGS_ASSERT_OP_FORCE_LIST + +PERL_CALLCONV void +Perl_op_free(pTHX_ OP *arg); #define PERL_ARGS_ASSERT_OP_FREE -PERL_CALLCONV OP* Perl_op_linklist(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_OP_LINKLIST \ - assert(o) -/* PERL_CALLCONV OP* op_lvalue(pTHX_ OP* o, I32 type); */ -#define PERL_ARGS_ASSERT_OP_LVALUE -PERL_CALLCONV OP* Perl_op_lvalue_flags(pTHX_ OP* o, I32 type, U32 flags); + +PERL_CALLCONV OP * +Perl_op_linklist(pTHX_ OP *o); +#define PERL_ARGS_ASSERT_OP_LINKLIST \ + assert(o) + +/* PERL_CALLCONV OP * +op_lvalue(pTHX_ OP *o, I32 type); */ + +PERL_CALLCONV OP * +Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags); #define PERL_ARGS_ASSERT_OP_LVALUE_FLAGS -PERL_CALLCONV void Perl_op_null(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_OP_NULL \ - assert(o) -PERL_CALLCONV OP* Perl_op_parent(OP *o); -#define PERL_ARGS_ASSERT_OP_PARENT \ - assert(o) -PERL_CALLCONV OP* Perl_op_prepend_elem(pTHX_ I32 optype, OP* first, OP* last); + +PERL_CALLCONV void +Perl_op_null(pTHX_ OP *o); +#define PERL_ARGS_ASSERT_OP_NULL \ + assert(o) + +PERL_CALLCONV OP * +Perl_op_parent(OP *o); +#define PERL_ARGS_ASSERT_OP_PARENT \ + assert(o) + +PERL_CALLCONV OP * +Perl_op_prepend_elem(pTHX_ I32 optype, OP *first, OP *last); #define PERL_ARGS_ASSERT_OP_PREPEND_ELEM -PERL_CALLCONV void Perl_op_refcnt_lock(pTHX); + +PERL_CALLCONV void +Perl_op_refcnt_lock(pTHX); #define PERL_ARGS_ASSERT_OP_REFCNT_LOCK -PERL_CALLCONV void Perl_op_refcnt_unlock(pTHX); + +PERL_CALLCONV void +Perl_op_refcnt_unlock(pTHX); #define PERL_ARGS_ASSERT_OP_REFCNT_UNLOCK -PERL_CALLCONV OP* Perl_op_scope(pTHX_ OP* o); + +PERL_CALLCONV OP * +Perl_op_scope(pTHX_ OP *o); #define PERL_ARGS_ASSERT_OP_SCOPE -PERL_CALLCONV OP* Perl_op_sibling_splice(OP *parent, OP *start, int del_count, OP* insert); + +PERL_CALLCONV OP * +Perl_op_sibling_splice(OP *parent, OP *start, int del_count, OP *insert); #define PERL_ARGS_ASSERT_OP_SIBLING_SPLICE -PERL_CALLCONV OP* Perl_op_unscope(pTHX_ OP* o); + +PERL_CALLCONV OP * +Perl_op_unscope(pTHX_ OP *o) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_OP_UNSCOPE -PERL_CALLCONV OP* Perl_op_wrap_finally(pTHX_ OP *block, OP *finally) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_OP_WRAP_FINALLY \ - assert(block); assert(finally) - -PERL_CALLCONV void Perl_optimize_optree(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_OPTIMIZE_OPTREE \ - assert(o) -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_pack_cat(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist, SV ***next_in_list, U32 flags) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_PACK_CAT \ - assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist); assert(next_in_list) -#endif - -PERL_CALLCONV void Perl_package(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_PACKAGE \ - assert(o) -PERL_CALLCONV void Perl_package_version(pTHX_ OP* v); -#define PERL_ARGS_ASSERT_PACKAGE_VERSION \ - assert(v) -PERL_CALLCONV void Perl_packlist(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist); -#define PERL_ARGS_ASSERT_PACKLIST \ - assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist) -PERL_CALLCONV PADOFFSET Perl_pad_add_anon(pTHX_ CV* func, I32 optype); -#define PERL_ARGS_ASSERT_PAD_ADD_ANON \ - assert(func) -PERL_CALLCONV PADOFFSET Perl_pad_add_name_pv(pTHX_ const char *name, const U32 flags, HV *typestash, HV *ourstash); -#define PERL_ARGS_ASSERT_PAD_ADD_NAME_PV \ - assert(name) -PERL_CALLCONV PADOFFSET Perl_pad_add_name_pvn(pTHX_ const char *namepv, STRLEN namelen, U32 flags, HV *typestash, HV *ourstash); -#define PERL_ARGS_ASSERT_PAD_ADD_NAME_PVN \ - assert(namepv) -PERL_CALLCONV PADOFFSET Perl_pad_add_name_sv(pTHX_ SV *name, U32 flags, HV *typestash, HV *ourstash); -#define PERL_ARGS_ASSERT_PAD_ADD_NAME_SV \ - assert(name) -PERL_CALLCONV void Perl_pad_add_weakref(pTHX_ CV* func); -#define PERL_ARGS_ASSERT_PAD_ADD_WEAKREF \ - assert(func) -PERL_CALLCONV PADOFFSET Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype); + +PERL_CALLCONV OP * +Perl_op_wrap_finally(pTHX_ OP *block, OP *finally) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_OP_WRAP_FINALLY \ + assert(block); assert(finally) + +PERL_CALLCONV void +Perl_package(pTHX_ OP *o) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_PACKAGE \ + assert(o) + +PERL_CALLCONV void +Perl_package_version(pTHX_ OP *v) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_PACKAGE_VERSION \ + assert(v) + +PERL_CALLCONV void +Perl_packlist(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist); +#define PERL_ARGS_ASSERT_PACKLIST \ + assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist) + +PERL_CALLCONV PADOFFSET +Perl_pad_add_anon(pTHX_ CV *func, I32 optype); +#define PERL_ARGS_ASSERT_PAD_ADD_ANON \ + assert(func) + +PERL_CALLCONV PADOFFSET +Perl_pad_add_name_pv(pTHX_ const char *name, const U32 flags, HV *typestash, HV *ourstash); +#define PERL_ARGS_ASSERT_PAD_ADD_NAME_PV \ + assert(name) + +PERL_CALLCONV PADOFFSET +Perl_pad_add_name_pvn(pTHX_ const char *namepv, STRLEN namelen, U32 flags, HV *typestash, HV *ourstash); +#define PERL_ARGS_ASSERT_PAD_ADD_NAME_PVN \ + assert(namepv) + +PERL_CALLCONV PADOFFSET +Perl_pad_add_name_sv(pTHX_ SV *name, U32 flags, HV *typestash, HV *ourstash); +#define PERL_ARGS_ASSERT_PAD_ADD_NAME_SV \ + assert(name) + +PERL_CALLCONV void +Perl_pad_add_weakref(pTHX_ CV *func) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_PAD_ADD_WEAKREF \ + assert(func) + +PERL_CALLCONV PADOFFSET +Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype); #define PERL_ARGS_ASSERT_PAD_ALLOC -PERL_CALLCONV void Perl_pad_block_start(pTHX_ int full); + +PERL_CALLCONV void +Perl_pad_block_start(pTHX_ int full) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_PAD_BLOCK_START -#ifndef NO_MATHOMS -PERL_CALLCONV HV* Perl_pad_compname_type(pTHX_ const PADOFFSET po) - __attribute__deprecated__ - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PAD_COMPNAME_TYPE -#endif - -PERL_CALLCONV PADOFFSET Perl_pad_findmy_pv(pTHX_ const char* name, U32 flags); -#define PERL_ARGS_ASSERT_PAD_FINDMY_PV \ - assert(name) -PERL_CALLCONV PADOFFSET Perl_pad_findmy_pvn(pTHX_ const char* namepv, STRLEN namelen, U32 flags); -#define PERL_ARGS_ASSERT_PAD_FINDMY_PVN \ - assert(namepv) -PERL_CALLCONV PADOFFSET Perl_pad_findmy_sv(pTHX_ SV* name, U32 flags); -#define PERL_ARGS_ASSERT_PAD_FINDMY_SV \ - assert(name) -PERL_CALLCONV void Perl_pad_fixup_inner_anons(pTHX_ PADLIST *padlist, CV *old_cv, CV *new_cv); -#define PERL_ARGS_ASSERT_PAD_FIXUP_INNER_ANONS \ - assert(padlist); assert(old_cv); assert(new_cv) -PERL_CALLCONV void Perl_pad_free(pTHX_ PADOFFSET po); + +PERL_CALLCONV PADOFFSET +Perl_pad_findmy_pv(pTHX_ const char *name, U32 flags); +#define PERL_ARGS_ASSERT_PAD_FINDMY_PV \ + assert(name) + +PERL_CALLCONV PADOFFSET +Perl_pad_findmy_pvn(pTHX_ const char *namepv, STRLEN namelen, U32 flags); +#define PERL_ARGS_ASSERT_PAD_FINDMY_PVN \ + assert(namepv) + +PERL_CALLCONV PADOFFSET +Perl_pad_findmy_sv(pTHX_ SV *name, U32 flags); +#define PERL_ARGS_ASSERT_PAD_FINDMY_SV \ + assert(name) + +PERL_CALLCONV void +Perl_pad_fixup_inner_anons(pTHX_ PADLIST *padlist, CV *old_cv, CV *new_cv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_PAD_FIXUP_INNER_ANONS \ + assert(padlist); assert(old_cv); assert(new_cv) + +PERL_CALLCONV void +Perl_pad_free(pTHX_ PADOFFSET po) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_PAD_FREE -PERL_CALLCONV OP * Perl_pad_leavemy(pTHX); + +PERL_CALLCONV OP * +Perl_pad_leavemy(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_PAD_LEAVEMY -PERL_CALLCONV PADLIST* Perl_pad_new(pTHX_ int flags) - __attribute__warn_unused_result__; + +PERL_CALLCONV PADLIST * +Perl_pad_new(pTHX_ int flags) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_PAD_NEW -PERL_CALLCONV void Perl_pad_push(pTHX_ PADLIST *padlist, int depth); -#define PERL_ARGS_ASSERT_PAD_PUSH \ - assert(padlist) -PERL_CALLCONV void Perl_pad_swipe(pTHX_ PADOFFSET po, bool refadjust); +PERL_CALLCONV void +Perl_pad_push(pTHX_ PADLIST *padlist, int depth); +#define PERL_ARGS_ASSERT_PAD_PUSH \ + assert(padlist) + +PERL_CALLCONV void +Perl_pad_swipe(pTHX_ PADOFFSET po, bool refadjust) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_PAD_SWIPE -PERL_CALLCONV void Perl_pad_tidy(pTHX_ padtidy_type type); + +PERL_CALLCONV void +Perl_pad_tidy(pTHX_ padtidy_type type); #define PERL_ARGS_ASSERT_PAD_TIDY -PERL_CALLCONV PAD ** Perl_padlist_store(pTHX_ PADLIST *padlist, I32 key, PAD *val); -#define PERL_ARGS_ASSERT_PADLIST_STORE \ - assert(padlist) -PERL_CALLCONV void Perl_padname_free(pTHX_ PADNAME *pn); -#define PERL_ARGS_ASSERT_PADNAME_FREE \ - assert(pn) -PERL_CALLCONV PADNAME * Perl_padnamelist_fetch(PADNAMELIST *pnl, SSize_t key) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PADNAMELIST_FETCH \ - assert(pnl) - -PERL_CALLCONV void Perl_padnamelist_free(pTHX_ PADNAMELIST *pnl); -#define PERL_ARGS_ASSERT_PADNAMELIST_FREE \ - assert(pnl) -PERL_CALLCONV PADNAME ** Perl_padnamelist_store(pTHX_ PADNAMELIST *pnl, SSize_t key, PADNAME *val); -#define PERL_ARGS_ASSERT_PADNAMELIST_STORE \ - assert(pnl) -PERL_CALLCONV OP* Perl_parse_arithexpr(pTHX_ U32 flags); + +PERL_CALLCONV PAD ** +Perl_padlist_store(pTHX_ PADLIST *padlist, I32 key, PAD *val) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_PADLIST_STORE \ + assert(padlist) + +PERL_CALLCONV void +Perl_padname_free(pTHX_ PADNAME *pn); +#define PERL_ARGS_ASSERT_PADNAME_FREE \ + assert(pn) + +PERL_CALLCONV PADNAME * +Perl_padnamelist_fetch(PADNAMELIST *pnl, SSize_t key) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_PADNAMELIST_FETCH \ + assert(pnl) + +PERL_CALLCONV void +Perl_padnamelist_free(pTHX_ PADNAMELIST *pnl); +#define PERL_ARGS_ASSERT_PADNAMELIST_FREE \ + assert(pnl) + +PERL_CALLCONV PADNAME ** +Perl_padnamelist_store(pTHX_ PADNAMELIST *pnl, SSize_t key, PADNAME *val); +#define PERL_ARGS_ASSERT_PADNAMELIST_STORE \ + assert(pnl) + +PERL_CALLCONV OP * +Perl_parse_arithexpr(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_PARSE_ARITHEXPR -PERL_CALLCONV OP* Perl_parse_barestmt(pTHX_ U32 flags); + +PERL_CALLCONV OP * +Perl_parse_barestmt(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_PARSE_BARESTMT -PERL_CALLCONV OP* Perl_parse_block(pTHX_ U32 flags); + +PERL_CALLCONV OP * +Perl_parse_block(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_PARSE_BLOCK -PERL_CALLCONV OP* Perl_parse_fullexpr(pTHX_ U32 flags); + +PERL_CALLCONV OP * +Perl_parse_fullexpr(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_PARSE_FULLEXPR -PERL_CALLCONV OP* Perl_parse_fullstmt(pTHX_ U32 flags); + +PERL_CALLCONV OP * +Perl_parse_fullstmt(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_PARSE_FULLSTMT -PERL_CALLCONV SV* Perl_parse_label(pTHX_ U32 flags); + +PERL_CALLCONV SV * +Perl_parse_label(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_PARSE_LABEL -PERL_CALLCONV OP* Perl_parse_listexpr(pTHX_ U32 flags); + +PERL_CALLCONV OP * +Perl_parse_listexpr(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_PARSE_LISTEXPR -PERL_CALLCONV OP* Perl_parse_stmtseq(pTHX_ U32 flags); + +PERL_CALLCONV OP * +Perl_parse_stmtseq(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_PARSE_STMTSEQ -PERL_CALLCONV OP* Perl_parse_subsignature(pTHX_ U32 flags); + +PERL_CALLCONV OP * +Perl_parse_subsignature(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_PARSE_SUBSIGNATURE -PERL_CALLCONV OP* Perl_parse_termexpr(pTHX_ U32 flags); + +PERL_CALLCONV OP * +Perl_parse_termexpr(pTHX_ U32 flags); #define PERL_ARGS_ASSERT_PARSE_TERMEXPR -PERL_CALLCONV U32 Perl_parse_unicode_opts(pTHX_ const char **popt); -#define PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS \ - assert(popt) -PERL_CALLCONV void Perl_parser_free(pTHX_ const yy_parser *parser); -#define PERL_ARGS_ASSERT_PARSER_FREE \ - assert(parser) -PERL_CALLCONV void Perl_peep(pTHX_ OP* o); + +PERL_CALLCONV U32 +Perl_parse_unicode_opts(pTHX_ const char **popt) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS \ + assert(popt) + +PERL_CALLCONV void +Perl_parser_free(pTHX_ const yy_parser *parser) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_PARSER_FREE \ + assert(parser) + +PERL_CALLCONV void +Perl_peep(pTHX_ OP *o) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_PEEP -PERL_CALLCONV PerlInterpreter* perl_alloc(void); + +PERL_CALLCONV PerlInterpreter * +perl_alloc(void); #define PERL_ARGS_ASSERT_PERL_ALLOC -PERL_CALLCONV void perl_construct(PerlInterpreter *my_perl); -#define PERL_ARGS_ASSERT_PERL_CONSTRUCT \ - assert(my_perl) -PERL_CALLCONV int perl_destruct(PerlInterpreter *my_perl); -#define PERL_ARGS_ASSERT_PERL_DESTRUCT \ - assert(my_perl) -PERL_CALLCONV void perl_free(PerlInterpreter *my_perl); -#define PERL_ARGS_ASSERT_PERL_FREE \ - assert(my_perl) -PERL_CALLCONV int perl_parse(PerlInterpreter *my_perl, XSINIT_t xsinit, int argc, char** argv, char** env); -#define PERL_ARGS_ASSERT_PERL_PARSE \ - assert(my_perl) -PERL_CALLCONV int perl_run(PerlInterpreter *my_perl); -#define PERL_ARGS_ASSERT_PERL_RUN \ - assert(my_perl) -PERL_CALLCONV Signal_t Perl_perly_sighandler(int sig, Siginfo_t *info, void *uap, bool safe); + +PERL_CALLCONV void +perl_construct(PerlInterpreter *my_perl); +#define PERL_ARGS_ASSERT_PERL_CONSTRUCT \ + assert(my_perl) + +PERL_CALLCONV int +perl_destruct(PerlInterpreter *my_perl); +#define PERL_ARGS_ASSERT_PERL_DESTRUCT \ + assert(my_perl) + +PERL_CALLCONV void +perl_free(PerlInterpreter *my_perl); +#define PERL_ARGS_ASSERT_PERL_FREE \ + assert(my_perl) + +PERL_CALLCONV int +perl_parse(PerlInterpreter *my_perl, XSINIT_t xsinit, int argc, char **argv, char **env); +#define PERL_ARGS_ASSERT_PERL_PARSE \ + assert(my_perl) + +PERL_CALLCONV int +perl_run(PerlInterpreter *my_perl); +#define PERL_ARGS_ASSERT_PERL_RUN \ + assert(my_perl) + +PERL_CALLCONV Signal_t +Perl_perly_sighandler(int sig, Siginfo_t *info, void *uap, bool safe); #define PERL_ARGS_ASSERT_PERLY_SIGHANDLER -/* PERL_CALLCONV const char *const phase_name(pTHX_ enum perl_phase); */ -#define PERL_ARGS_ASSERT_PHASE_NAME -PERL_CALLCONV void Perl_pmop_dump(pTHX_ PMOP* pm); + +/* PERL_CALLCONV const char * const +phase_name(pTHX_ enum perl_phase); */ + +PERL_CALLCONV void +Perl_pmop_dump(pTHX_ PMOP *pm); #define PERL_ARGS_ASSERT_PMOP_DUMP -PERL_CALLCONV OP* Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl, UV flags, I32 floor); -#define PERL_ARGS_ASSERT_PMRUNTIME \ - assert(o); assert(expr) -PERL_CALLCONV void Perl_pop_scope(pTHX); + +PERL_CALLCONV OP * +Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl, UV flags, I32 floor) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_PMRUNTIME \ + assert(o); assert(expr) + +PERL_CALLCONV void +Perl_pop_scope(pTHX); #define PERL_ARGS_ASSERT_POP_SCOPE -PERL_CALLCONV void Perl_populate_isa(pTHX_ const char *name, STRLEN len, ...); -#define PERL_ARGS_ASSERT_POPULATE_ISA \ - assert(name) -PERL_CALLCONV REGEXP* Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags); -#define PERL_ARGS_ASSERT_PREGCOMP \ - assert(pattern) -PERL_CALLCONV I32 Perl_pregexec(pTHX_ REGEXP * const prog, char* stringarg, char* strend, char* strbeg, SSize_t minend, SV* screamer, U32 nosave); -#define PERL_ARGS_ASSERT_PREGEXEC \ - assert(prog); assert(stringarg); assert(strend); assert(strbeg); assert(screamer) -PERL_CALLCONV void Perl_pregfree(pTHX_ REGEXP* r); + +PERL_CALLCONV void +Perl_populate_isa(pTHX_ const char *name, STRLEN len, ...) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_POPULATE_ISA \ + assert(name) + +PERL_CALLCONV REGEXP * +Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags); +#define PERL_ARGS_ASSERT_PREGCOMP \ + assert(pattern) + +PERL_CALLCONV I32 +Perl_pregexec(pTHX_ REGEXP * const prog, char *stringarg, char *strend, char *strbeg, SSize_t minend, SV *screamer, U32 nosave); +#define PERL_ARGS_ASSERT_PREGEXEC \ + assert(prog); assert(stringarg); assert(strend); assert(strbeg); \ + assert(screamer) + +PERL_CALLCONV void +Perl_pregfree(pTHX_ REGEXP *r); #define PERL_ARGS_ASSERT_PREGFREE -PERL_CALLCONV void Perl_pregfree2(pTHX_ REGEXP *rx); -#define PERL_ARGS_ASSERT_PREGFREE2 \ - assert(rx) -PERL_CALLCONV const char* Perl_prescan_version(pTHX_ const char *s, bool strict, const char** errstr, bool *sqv, int *ssaw_decimal, int *swidth, bool *salpha); -#define PERL_ARGS_ASSERT_PRESCAN_VERSION \ - assert(s) -PERL_CALLCONV void* Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PTR_TABLE_FETCH \ - assert(tbl) -PERL_CALLCONV void Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl); +PERL_CALLCONV void +Perl_pregfree2(pTHX_ REGEXP *rx); +#define PERL_ARGS_ASSERT_PREGFREE2 \ + assert(rx) + +PERL_CALLCONV const char * +Perl_prescan_version(pTHX_ const char *s, bool strict, const char **errstr, bool *sqv, int *ssaw_decimal, int *swidth, bool *salpha); +#define PERL_ARGS_ASSERT_PRESCAN_VERSION \ + assert(s) + +PERL_CALLCONV void * +Perl_ptr_table_fetch(pTHX_ PTR_TBL_t * const tbl, const void * const sv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_PTR_TABLE_FETCH \ + assert(tbl) + +PERL_CALLCONV void +Perl_ptr_table_free(pTHX_ PTR_TBL_t * const tbl); #define PERL_ARGS_ASSERT_PTR_TABLE_FREE -PERL_CALLCONV PTR_TBL_t* Perl_ptr_table_new(pTHX) - __attribute__warn_unused_result__; + +PERL_CALLCONV PTR_TBL_t * +Perl_ptr_table_new(pTHX) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_PTR_TABLE_NEW -PERL_CALLCONV void Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl); -#define PERL_ARGS_ASSERT_PTR_TABLE_SPLIT \ - assert(tbl) -PERL_CALLCONV void Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv); -#define PERL_ARGS_ASSERT_PTR_TABLE_STORE \ - assert(tbl); assert(newsv) -PERL_CALLCONV void Perl_push_scope(pTHX); +PERL_CALLCONV void +Perl_ptr_table_split(pTHX_ PTR_TBL_t * const tbl); +#define PERL_ARGS_ASSERT_PTR_TABLE_SPLIT \ + assert(tbl) + +PERL_CALLCONV void +Perl_ptr_table_store(pTHX_ PTR_TBL_t * const tbl, const void * const oldsv, void * const newsv); +#define PERL_ARGS_ASSERT_PTR_TABLE_STORE \ + assert(tbl); assert(newsv) + +PERL_CALLCONV void +Perl_push_scope(pTHX); #define PERL_ARGS_ASSERT_PUSH_SCOPE -PERL_CALLCONV char* Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim); -#define PERL_ARGS_ASSERT_PV_DISPLAY \ - assert(dsv); assert(pv) -PERL_CALLCONV char* Perl_pv_escape(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); -#define PERL_ARGS_ASSERT_PV_ESCAPE \ - assert(str) -PERL_CALLCONV char* Perl_pv_pretty(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); -#define PERL_ARGS_ASSERT_PV_PRETTY \ - assert(dsv); assert(str) -PERL_CALLCONV char* Perl_pv_uni_display(pTHX_ SV *dsv, const U8 *spv, STRLEN len, STRLEN pvlim, UV flags); -#define PERL_ARGS_ASSERT_PV_UNI_DISPLAY \ - assert(dsv); assert(spv) -PERL_CALLCONV void Perl_qerror(pTHX_ SV* err); -#define PERL_ARGS_ASSERT_QERROR \ - assert(err) -PERL_CALLCONV REGEXP* Perl_re_compile(pTHX_ SV * const pattern, U32 orig_rx_flags); -#define PERL_ARGS_ASSERT_RE_COMPILE \ - assert(pattern) -PERL_CALLCONV char* Perl_re_intuit_start(pTHX_ REGEXP * const rx, SV* sv, const char* const strbeg, char* strpos, char* strend, const U32 flags, re_scream_pos_data *data); -#define PERL_ARGS_ASSERT_RE_INTUIT_START \ - assert(rx); assert(strbeg); assert(strpos); assert(strend) -PERL_CALLCONV SV* Perl_re_intuit_string(pTHX_ REGEXP *const r); -#define PERL_ARGS_ASSERT_RE_INTUIT_STRING \ - assert(r) -PERL_CALLCONV REGEXP* Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count, OP *expr, const regexp_engine* eng, REGEXP *old_re, bool *is_bare_re, const U32 rx_flags, const U32 pm_flags); -#define PERL_ARGS_ASSERT_RE_OP_COMPILE \ - assert(eng) -PERL_CALLCONV Malloc_t Perl_realloc(Malloc_t where, MEM_SIZE nbytes) - __attribute__warn_unused_result__; + +PERL_CALLCONV char * +Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim); +#define PERL_ARGS_ASSERT_PV_DISPLAY \ + assert(dsv); assert(pv) + +PERL_CALLCONV char * +Perl_pv_escape(pTHX_ SV *dsv, char const * const str, const STRLEN count, STRLEN max, STRLEN * const escaped, U32 flags); +#define PERL_ARGS_ASSERT_PV_ESCAPE \ + assert(str) + +PERL_CALLCONV char * +Perl_pv_pretty(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); +#define PERL_ARGS_ASSERT_PV_PRETTY \ + assert(dsv); assert(str) + +PERL_CALLCONV char * +Perl_pv_uni_display(pTHX_ SV *dsv, const U8 *spv, STRLEN len, STRLEN pvlim, UV flags); +#define PERL_ARGS_ASSERT_PV_UNI_DISPLAY \ + assert(dsv); assert(spv) + +PERL_CALLCONV void +Perl_qerror(pTHX_ SV *err); +#define PERL_ARGS_ASSERT_QERROR + +PERL_CALLCONV char * +Perl_rcpv_copy(pTHX_ char * const pv); +#define PERL_ARGS_ASSERT_RCPV_COPY + +PERL_CALLCONV char * +Perl_rcpv_free(pTHX_ char * const pv); +#define PERL_ARGS_ASSERT_RCPV_FREE + +PERL_CALLCONV char * +Perl_rcpv_new(pTHX_ const char * const pv, STRLEN len, U32 flags) + __attribute__malloc__ + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_RCPV_NEW + +PERL_CALLCONV REGEXP * +Perl_re_compile(pTHX_ SV * const pattern, U32 orig_rx_flags); +#define PERL_ARGS_ASSERT_RE_COMPILE \ + assert(pattern) + +PERL_CALLCONV char * +Perl_re_intuit_start(pTHX_ REGEXP * const rx, SV *sv, const char * const strbeg, char *strpos, char *strend, const U32 flags, re_scream_pos_data *data); +#define PERL_ARGS_ASSERT_RE_INTUIT_START \ + assert(rx); assert(strbeg); assert(strpos); assert(strend) + +PERL_CALLCONV SV * +Perl_re_intuit_string(pTHX_ REGEXP * const r); +#define PERL_ARGS_ASSERT_RE_INTUIT_STRING \ + assert(r) + +PERL_CALLCONV REGEXP * +Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count, OP *expr, const regexp_engine *eng, REGEXP *old_re, bool *is_bare_re, const U32 rx_flags, const U32 pm_flags); +#define PERL_ARGS_ASSERT_RE_OP_COMPILE \ + assert(eng) + +PERL_CALLCONV Malloc_t +Perl_realloc(Malloc_t where, MEM_SIZE nbytes) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_REALLOC -PERL_CALLCONV void Perl_reentrant_free(pTHX); +PERL_CALLCONV void +Perl_reentrant_free(pTHX); #define PERL_ARGS_ASSERT_REENTRANT_FREE -PERL_CALLCONV void Perl_reentrant_init(pTHX); + +PERL_CALLCONV void +Perl_reentrant_init(pTHX); #define PERL_ARGS_ASSERT_REENTRANT_INIT -PERL_CALLCONV void* Perl_reentrant_retry(const char *f, ...); -#define PERL_ARGS_ASSERT_REENTRANT_RETRY \ - assert(f) -PERL_CALLCONV void Perl_reentrant_size(pTHX); + +PERL_CALLCONV void * +Perl_reentrant_retry(const char *f, ...); +#define PERL_ARGS_ASSERT_REENTRANT_RETRY \ + assert(f) + +PERL_CALLCONV void +Perl_reentrant_size(pTHX); #define PERL_ARGS_ASSERT_REENTRANT_SIZE -PERL_CALLCONV HV * Perl_refcounted_he_chain_2hv(pTHX_ const struct refcounted_he *c, U32 flags); + +PERL_CALLCONV HV * +Perl_refcounted_he_chain_2hv(pTHX_ const struct refcounted_he *c, U32 flags); #define PERL_ARGS_ASSERT_REFCOUNTED_HE_CHAIN_2HV -PERL_CALLCONV SV * Perl_refcounted_he_fetch_pv(pTHX_ const struct refcounted_he *chain, const char *key, U32 hash, U32 flags); -#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PV \ - assert(key) -PERL_CALLCONV SV * Perl_refcounted_he_fetch_pvn(pTHX_ const struct refcounted_he *chain, const char *keypv, STRLEN keylen, U32 hash, U32 flags); -#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PVN \ - assert(keypv) -PERL_CALLCONV SV * Perl_refcounted_he_fetch_sv(pTHX_ const struct refcounted_he *chain, SV *key, U32 hash, U32 flags); -#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_SV \ - assert(key) -PERL_CALLCONV void Perl_refcounted_he_free(pTHX_ struct refcounted_he *he); + +PERL_CALLCONV SV * +Perl_refcounted_he_fetch_pv(pTHX_ const struct refcounted_he *chain, const char *key, U32 hash, U32 flags); +#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PV \ + assert(key) + +PERL_CALLCONV SV * +Perl_refcounted_he_fetch_pvn(pTHX_ const struct refcounted_he *chain, const char *keypv, STRLEN keylen, U32 hash, U32 flags); +#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_PVN \ + assert(keypv) + +PERL_CALLCONV SV * +Perl_refcounted_he_fetch_sv(pTHX_ const struct refcounted_he *chain, SV *key, U32 hash, U32 flags); +#define PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_SV \ + assert(key) + +PERL_CALLCONV void +Perl_refcounted_he_free(pTHX_ struct refcounted_he *he); #define PERL_ARGS_ASSERT_REFCOUNTED_HE_FREE -PERL_CALLCONV struct refcounted_he * Perl_refcounted_he_inc(pTHX_ struct refcounted_he *he); + +PERL_CALLCONV struct refcounted_he * +Perl_refcounted_he_inc(pTHX_ struct refcounted_he *he); #define PERL_ARGS_ASSERT_REFCOUNTED_HE_INC -PERL_CALLCONV struct refcounted_he * Perl_refcounted_he_new_pv(pTHX_ struct refcounted_he *parent, const char *key, U32 hash, SV *value, U32 flags); -#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PV \ - assert(key) -PERL_CALLCONV struct refcounted_he * Perl_refcounted_he_new_pvn(pTHX_ struct refcounted_he *parent, const char *keypv, STRLEN keylen, U32 hash, SV *value, U32 flags); -#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PVN \ - assert(keypv) -PERL_CALLCONV struct refcounted_he * Perl_refcounted_he_new_sv(pTHX_ struct refcounted_he *parent, SV *key, U32 hash, SV *value, U32 flags); -#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_SV \ - assert(key) -PERL_CALLCONV SV* Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value, const U32 flags); -#define PERL_ARGS_ASSERT_REG_NAMED_BUFF \ - assert(rx) -PERL_CALLCONV SV* Perl_reg_named_buff_all(pTHX_ REGEXP * const rx, const U32 flags); -#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL \ - assert(rx) -PERL_CALLCONV bool Perl_reg_named_buff_exists(pTHX_ REGEXP * const rx, SV * const key, const U32 flags); -#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS \ - assert(rx); assert(key) -PERL_CALLCONV SV* Perl_reg_named_buff_fetch(pTHX_ REGEXP * const rx, SV * const namesv, const U32 flags); -#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH \ - assert(rx); assert(namesv) -PERL_CALLCONV SV* Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const rx, const U32 flags); -#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY \ - assert(rx) -PERL_CALLCONV SV* Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey, const U32 flags); -#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER \ - assert(rx) -PERL_CALLCONV SV* Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const rx, const U32 flags); -#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY \ - assert(rx) -PERL_CALLCONV SV* Perl_reg_named_buff_scalar(pTHX_ REGEXP * const rx, const U32 flags); -#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR \ - assert(rx) -PERL_CALLCONV void Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const rx, const I32 paren, SV * const sv); -#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH \ - assert(rx) -PERL_CALLCONV I32 Perl_reg_numbered_buff_length(pTHX_ REGEXP * const rx, const SV * const sv, const I32 paren); -#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH \ - assert(rx); assert(sv) -PERL_CALLCONV void Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren, SV const * const value); -#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE \ - assert(rx) -PERL_CALLCONV SV* Perl_reg_qr_package(pTHX_ REGEXP * const rx); -#define PERL_ARGS_ASSERT_REG_QR_PACKAGE \ - assert(rx) -PERL_CALLCONV REGEXP* Perl_reg_temp_copy(pTHX_ REGEXP* dsv, REGEXP* ssv); -#define PERL_ARGS_ASSERT_REG_TEMP_COPY \ - assert(ssv) -PERL_CALLCONV void Perl_regdump(pTHX_ const regexp* r); -#define PERL_ARGS_ASSERT_REGDUMP \ - assert(r) -PERL_CALLCONV I32 Perl_regexec_flags(pTHX_ REGEXP *const rx, char *stringarg, char *strend, char *strbeg, SSize_t minend, SV *sv, void *data, U32 flags); -#define PERL_ARGS_ASSERT_REGEXEC_FLAGS \ - assert(rx); assert(stringarg); assert(strend); assert(strbeg); assert(sv) -PERL_CALLCONV void Perl_regfree_internal(pTHX_ REGEXP *const rx); -#define PERL_ARGS_ASSERT_REGFREE_INTERNAL \ - assert(rx) -PERL_CALLCONV void Perl_reginitcolors(pTHX); + +PERL_CALLCONV struct refcounted_he * +Perl_refcounted_he_new_pv(pTHX_ struct refcounted_he *parent, const char *key, U32 hash, SV *value, U32 flags); +#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PV \ + assert(key) + +PERL_CALLCONV struct refcounted_he * +Perl_refcounted_he_new_pvn(pTHX_ struct refcounted_he *parent, const char *keypv, STRLEN keylen, U32 hash, SV *value, U32 flags); +#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PVN \ + assert(keypv) + +PERL_CALLCONV struct refcounted_he * +Perl_refcounted_he_new_sv(pTHX_ struct refcounted_he *parent, SV *key, U32 hash, SV *value, U32 flags); +#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_SV \ + assert(key) + +PERL_CALLCONV SV * +Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value, const U32 flags); +#define PERL_ARGS_ASSERT_REG_NAMED_BUFF \ + assert(rx) + +PERL_CALLCONV SV * +Perl_reg_named_buff_all(pTHX_ REGEXP * const rx, const U32 flags); +#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL \ + assert(rx) + +PERL_CALLCONV bool +Perl_reg_named_buff_exists(pTHX_ REGEXP * const rx, SV * const key, const U32 flags); +#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS \ + assert(rx); assert(key) + +PERL_CALLCONV SV * +Perl_reg_named_buff_fetch(pTHX_ REGEXP * const rx, SV * const namesv, const U32 flags); +#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH \ + assert(rx); assert(namesv) + +PERL_CALLCONV SV * +Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const rx, const U32 flags); +#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY \ + assert(rx) + +PERL_CALLCONV SV * +Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey, const U32 flags); +#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER \ + assert(rx) + +PERL_CALLCONV SV * +Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const rx, const U32 flags); +#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY \ + assert(rx) + +PERL_CALLCONV SV * +Perl_reg_named_buff_scalar(pTHX_ REGEXP * const rx, const U32 flags); +#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR \ + assert(rx) + +PERL_CALLCONV void +Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const re, const I32 paren, SV * const sv); +#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH \ + assert(re) + +PERL_CALLCONV void +Perl_reg_numbered_buff_fetch_flags(pTHX_ REGEXP * const re, const I32 paren, SV * const sv, U32 flags); +#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH_FLAGS \ + assert(re) + +PERL_CALLCONV I32 +Perl_reg_numbered_buff_length(pTHX_ REGEXP * const rx, const SV * const sv, const I32 paren); +#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH \ + assert(rx); assert(sv) + +PERL_CALLCONV void +Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren, SV const * const value); +#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE \ + assert(rx) + +PERL_CALLCONV SV * +Perl_reg_qr_package(pTHX_ REGEXP * const rx); +#define PERL_ARGS_ASSERT_REG_QR_PACKAGE \ + assert(rx) + +PERL_CALLCONV REGEXP * +Perl_reg_temp_copy(pTHX_ REGEXP *dsv, REGEXP *ssv); +#define PERL_ARGS_ASSERT_REG_TEMP_COPY \ + assert(ssv) + +PERL_CALLCONV void +Perl_regdump(pTHX_ const regexp *r); +#define PERL_ARGS_ASSERT_REGDUMP \ + assert(r) + +PERL_CALLCONV I32 +Perl_regexec_flags(pTHX_ REGEXP * const rx, char *stringarg, char *strend, char *strbeg, SSize_t minend, SV *sv, void *data, U32 flags); +#define PERL_ARGS_ASSERT_REGEXEC_FLAGS \ + assert(rx); assert(stringarg); assert(strend); assert(strbeg); assert(sv) + +PERL_CALLCONV void +Perl_regfree_internal(pTHX_ REGEXP * const rx); +#define PERL_ARGS_ASSERT_REGFREE_INTERNAL \ + assert(rx) + +PERL_CALLCONV void +Perl_reginitcolors(pTHX); #define PERL_ARGS_ASSERT_REGINITCOLORS -PERL_CALLCONV regnode* Perl_regnext(pTHX_ regnode* p) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGNEXT - -PERL_CALLCONV void Perl_repeatcpy(char* to, const char* from, I32 len, IV count); -#define PERL_ARGS_ASSERT_REPEATCPY \ - assert(to); assert(from) -PERL_CALLCONV void Perl_report_evil_fh(pTHX_ const GV *gv); + +PERL_CALLCONV void +Perl_repeatcpy(char *to, const char *from, I32 len, IV count); +#define PERL_ARGS_ASSERT_REPEATCPY \ + assert(to); assert(from) + +PERL_CALLCONV void +Perl_report_evil_fh(pTHX_ const GV *gv) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_REPORT_EVIL_FH -PERL_CALLCONV void Perl_report_uninit(pTHX_ const SV *uninit_sv); + +PERL_CALLCONV void +Perl_report_uninit(pTHX_ const SV *uninit_sv); #define PERL_ARGS_ASSERT_REPORT_UNINIT -PERL_CALLCONV void Perl_report_wrongway_fh(pTHX_ const GV *gv, const char have); + +PERL_CALLCONV void +Perl_report_wrongway_fh(pTHX_ const GV *gv, const char have) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_REPORT_WRONGWAY_FH -PERL_CALLCONV void Perl_require_pv(pTHX_ const char* pv); -#define PERL_ARGS_ASSERT_REQUIRE_PV \ - assert(pv) -PERL_CALLCONV char* Perl_rninstr(const char* big, const char* bigend, const char* little, const char* lend) - __attribute__warn_unused_result__ - __attribute__pure__; -#define PERL_ARGS_ASSERT_RNINSTR \ - assert(big); assert(bigend); assert(little); assert(lend) -PERL_CALLCONV void Perl_rpeep(pTHX_ OP* o); +PERL_CALLCONV void +Perl_require_pv(pTHX_ const char *pv); +#define PERL_ARGS_ASSERT_REQUIRE_PV \ + assert(pv) + +PERL_CALLCONV void +Perl_resume_compcv(pTHX_ struct suspended_compcv *buffer, bool save); +#define PERL_ARGS_ASSERT_RESUME_COMPCV \ + assert(buffer) + +/* PERL_CALLCONV void +resume_compcv_and_save(pTHX_ struct suspended_compcv *buffer); */ + +/* PERL_CALLCONV void +resume_compcv_final(pTHX_ struct suspended_compcv *buffer); */ + +PERL_CALLCONV char * +Perl_rninstr(const char *big, const char *bigend, const char *little, const char *lend) + __attribute__warn_unused_result__ + __attribute__pure__; +#define PERL_ARGS_ASSERT_RNINSTR \ + assert(big); assert(bigend); assert(little); assert(lend) + +PERL_CALLCONV void +Perl_rpeep(pTHX_ OP *o) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_RPEEP -PERL_CALLCONV Sighandler_t Perl_rsignal(pTHX_ int i, Sighandler_t t); + +PERL_CALLCONV Sighandler_t +Perl_rsignal(pTHX_ int i, Sighandler_t t); #define PERL_ARGS_ASSERT_RSIGNAL -PERL_CALLCONV int Perl_rsignal_restore(pTHX_ int i, Sigsave_t* t); + +PERL_CALLCONV int +Perl_rsignal_restore(pTHX_ int i, Sigsave_t *t) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_RSIGNAL_RESTORE -PERL_CALLCONV int Perl_rsignal_save(pTHX_ int i, Sighandler_t t1, Sigsave_t* save); -#define PERL_ARGS_ASSERT_RSIGNAL_SAVE \ - assert(save) -PERL_CALLCONV Sighandler_t Perl_rsignal_state(pTHX_ int i); + +PERL_CALLCONV int +Perl_rsignal_save(pTHX_ int i, Sighandler_t t1, Sigsave_t *save) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_RSIGNAL_SAVE \ + assert(save) + +PERL_CALLCONV Sighandler_t +Perl_rsignal_state(pTHX_ int i); #define PERL_ARGS_ASSERT_RSIGNAL_STATE -PERL_CALLCONV int Perl_runops_debug(pTHX); + +PERL_CALLCONV int +Perl_runops_debug(pTHX); #define PERL_ARGS_ASSERT_RUNOPS_DEBUG -PERL_CALLCONV int Perl_runops_standard(pTHX); + +PERL_CALLCONV int +Perl_runops_standard(pTHX); #define PERL_ARGS_ASSERT_RUNOPS_STANDARD -PERL_CALLCONV CV* Perl_rv2cv_op_cv(pTHX_ OP *cvop, U32 flags); -#define PERL_ARGS_ASSERT_RV2CV_OP_CV \ - assert(cvop) -PERL_CALLCONV void Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx); -#define PERL_ARGS_ASSERT_RXRES_SAVE \ - assert(rsp); assert(rx) -PERL_CALLCONV Malloc_t Perl_safesyscalloc(MEM_SIZE elements, MEM_SIZE size) - __attribute__malloc__ - __attribute__warn_unused_result__; + +PERL_CALLCONV CV * +Perl_rv2cv_op_cv(pTHX_ OP *cvop, U32 flags); +#define PERL_ARGS_ASSERT_RV2CV_OP_CV \ + assert(cvop) + +PERL_CALLCONV void +Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_RXRES_SAVE \ + assert(rsp); assert(rx) + +PERL_CALLCONV Malloc_t +Perl_safesyscalloc(MEM_SIZE elements, MEM_SIZE size) + __attribute__malloc__ + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_SAFESYSCALLOC -PERL_CALLCONV Free_t Perl_safesysfree(Malloc_t where); +PERL_CALLCONV Free_t +Perl_safesysfree(Malloc_t where); #define PERL_ARGS_ASSERT_SAFESYSFREE -PERL_CALLCONV Malloc_t Perl_safesysmalloc(MEM_SIZE nbytes) - __attribute__malloc__ - __attribute__warn_unused_result__; + +PERL_CALLCONV Malloc_t +Perl_safesysmalloc(MEM_SIZE nbytes) + __attribute__malloc__ + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_SAFESYSMALLOC -PERL_CALLCONV Malloc_t Perl_safesysrealloc(Malloc_t where, MEM_SIZE nbytes) - __attribute__warn_unused_result__; +PERL_CALLCONV Malloc_t +Perl_safesysrealloc(Malloc_t where, MEM_SIZE nbytes) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_SAFESYSREALLOC -PERL_CALLCONV void Perl_save_I16(pTHX_ I16* intp); -#define PERL_ARGS_ASSERT_SAVE_I16 \ - assert(intp) -PERL_CALLCONV void Perl_save_I32(pTHX_ I32* intp); -#define PERL_ARGS_ASSERT_SAVE_I32 \ - assert(intp) -PERL_CALLCONV void Perl_save_I8(pTHX_ I8* bytep); -#define PERL_ARGS_ASSERT_SAVE_I8 \ - assert(bytep) -PERL_CALLCONV void Perl_save_adelete(pTHX_ AV *av, SSize_t key); -#define PERL_ARGS_ASSERT_SAVE_ADELETE \ - assert(av) -/* PERL_CALLCONV void save_aelem(pTHX_ AV* av, SSize_t idx, SV **sptr); */ -#define PERL_ARGS_ASSERT_SAVE_AELEM -PERL_CALLCONV void Perl_save_aelem_flags(pTHX_ AV* av, SSize_t idx, SV **sptr, const U32 flags); -#define PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS \ - assert(av); assert(sptr) -PERL_CALLCONV I32 Perl_save_alloc(pTHX_ I32 size, I32 pad); +PERL_CALLCONV void +Perl_save_I16(pTHX_ I16 *intp); +#define PERL_ARGS_ASSERT_SAVE_I16 \ + assert(intp) + +PERL_CALLCONV void +Perl_save_I32(pTHX_ I32 *intp); +#define PERL_ARGS_ASSERT_SAVE_I32 \ + assert(intp) + +PERL_CALLCONV void +Perl_save_I8(pTHX_ I8 *bytep); +#define PERL_ARGS_ASSERT_SAVE_I8 \ + assert(bytep) + +PERL_CALLCONV void +Perl_save_adelete(pTHX_ AV *av, SSize_t key); +#define PERL_ARGS_ASSERT_SAVE_ADELETE \ + assert(av) + +/* PERL_CALLCONV void +save_aelem(pTHX_ AV *av, SSize_t idx, SV **sptr); */ + +PERL_CALLCONV void +Perl_save_aelem_flags(pTHX_ AV *av, SSize_t idx, SV **sptr, const U32 flags); +#define PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS \ + assert(av); assert(sptr) + +PERL_CALLCONV SSize_t +Perl_save_alloc(pTHX_ SSize_t size, I32 pad); #define PERL_ARGS_ASSERT_SAVE_ALLOC -PERL_CALLCONV void Perl_save_aptr(pTHX_ AV** aptr); -#define PERL_ARGS_ASSERT_SAVE_APTR \ - assert(aptr) -PERL_CALLCONV AV* Perl_save_ary(pTHX_ GV* gv); -#define PERL_ARGS_ASSERT_SAVE_ARY \ - assert(gv) -PERL_CALLCONV void Perl_save_bool(pTHX_ bool* boolp); -#define PERL_ARGS_ASSERT_SAVE_BOOL \ - assert(boolp) -PERL_CALLCONV void Perl_save_clearsv(pTHX_ SV** svp); -#define PERL_ARGS_ASSERT_SAVE_CLEARSV \ - assert(svp) -PERL_CALLCONV void Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen); -#define PERL_ARGS_ASSERT_SAVE_DELETE \ - assert(hv); assert(key) -PERL_CALLCONV void Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p); -#define PERL_ARGS_ASSERT_SAVE_DESTRUCTOR \ - assert(p) -PERL_CALLCONV void Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p); + +PERL_CALLCONV void +Perl_save_aptr(pTHX_ AV **aptr); +#define PERL_ARGS_ASSERT_SAVE_APTR \ + assert(aptr) + +PERL_CALLCONV AV * +Perl_save_ary(pTHX_ GV *gv); +#define PERL_ARGS_ASSERT_SAVE_ARY \ + assert(gv) + +PERL_CALLCONV void +Perl_save_bool(pTHX_ bool *boolp); +#define PERL_ARGS_ASSERT_SAVE_BOOL \ + assert(boolp) + +PERL_CALLCONV void +Perl_save_clearsv(pTHX_ SV **svp); +#define PERL_ARGS_ASSERT_SAVE_CLEARSV \ + assert(svp) + +PERL_CALLCONV void +Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen); +#define PERL_ARGS_ASSERT_SAVE_DELETE \ + assert(hv); assert(key) + +PERL_CALLCONV void +Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void *p); +#define PERL_ARGS_ASSERT_SAVE_DESTRUCTOR \ + assert(p) + +PERL_CALLCONV void +Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void *p); #define PERL_ARGS_ASSERT_SAVE_DESTRUCTOR_X -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_save_freeop(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_SAVE_FREEOP -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_save_freepv(pTHX_ char* pv); -#define PERL_ARGS_ASSERT_SAVE_FREEPV -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_save_freesv(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_SAVE_FREESV -#endif -PERL_CALLCONV void Perl_save_generic_pvref(pTHX_ char** str); -#define PERL_ARGS_ASSERT_SAVE_GENERIC_PVREF \ - assert(str) -PERL_CALLCONV void Perl_save_generic_svref(pTHX_ SV** sptr); -#define PERL_ARGS_ASSERT_SAVE_GENERIC_SVREF \ - assert(sptr) -PERL_CALLCONV void Perl_save_gp(pTHX_ GV* gv, I32 empty); -#define PERL_ARGS_ASSERT_SAVE_GP \ - assert(gv) -PERL_CALLCONV HV* Perl_save_hash(pTHX_ GV* gv); -#define PERL_ARGS_ASSERT_SAVE_HASH \ - assert(gv) -PERL_CALLCONV void Perl_save_hdelete(pTHX_ HV *hv, SV *keysv); -#define PERL_ARGS_ASSERT_SAVE_HDELETE \ - assert(hv); assert(keysv) -/* PERL_CALLCONV void save_helem(pTHX_ HV *hv, SV *key, SV **sptr); */ -#define PERL_ARGS_ASSERT_SAVE_HELEM -PERL_CALLCONV void Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags); -#define PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS \ - assert(hv); assert(key); assert(sptr) -PERL_CALLCONV void Perl_save_hints(pTHX); + +PERL_CALLCONV void +Perl_save_freercpv(pTHX_ char *rcpv); +#define PERL_ARGS_ASSERT_SAVE_FREERCPV \ + assert(rcpv) + +PERL_CALLCONV void +Perl_save_generic_pvref(pTHX_ char **str); +#define PERL_ARGS_ASSERT_SAVE_GENERIC_PVREF \ + assert(str) + +PERL_CALLCONV void +Perl_save_generic_svref(pTHX_ SV **sptr); +#define PERL_ARGS_ASSERT_SAVE_GENERIC_SVREF \ + assert(sptr) + +PERL_CALLCONV void +Perl_save_gp(pTHX_ GV *gv, I32 empty); +#define PERL_ARGS_ASSERT_SAVE_GP \ + assert(gv) + +PERL_CALLCONV HV * +Perl_save_hash(pTHX_ GV *gv); +#define PERL_ARGS_ASSERT_SAVE_HASH \ + assert(gv) + +PERL_CALLCONV void +Perl_save_hdelete(pTHX_ HV *hv, SV *keysv); +#define PERL_ARGS_ASSERT_SAVE_HDELETE \ + assert(hv); assert(keysv) + +/* PERL_CALLCONV void +save_helem(pTHX_ HV *hv, SV *key, SV **sptr); */ + +PERL_CALLCONV void +Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags); +#define PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS \ + assert(hv); assert(key); assert(sptr) + +PERL_CALLCONV void +Perl_save_hints(pTHX); #define PERL_ARGS_ASSERT_SAVE_HINTS -PERL_CALLCONV void Perl_save_hptr(pTHX_ HV** hptr); -#define PERL_ARGS_ASSERT_SAVE_HPTR \ - assert(hptr) -PERL_CALLCONV void Perl_save_int(pTHX_ int* intp); -#define PERL_ARGS_ASSERT_SAVE_INT \ - assert(intp) -PERL_CALLCONV void Perl_save_item(pTHX_ SV* item); -#define PERL_ARGS_ASSERT_SAVE_ITEM \ - assert(item) -PERL_CALLCONV void Perl_save_iv(pTHX_ IV *ivp); -#define PERL_ARGS_ASSERT_SAVE_IV \ - assert(ivp) -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_save_list(pTHX_ SV** sarg, I32 maxsarg) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SAVE_LIST \ - assert(sarg) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_save_long(pTHX_ long* longp) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SAVE_LONG \ - assert(longp) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_save_mortalizesv(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_SAVE_MORTALIZESV \ - assert(sv) -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_save_nogv(pTHX_ GV* gv) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SAVE_NOGV \ - assert(gv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_save_op(pTHX); -#define PERL_ARGS_ASSERT_SAVE_OP -#endif -PERL_CALLCONV void Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off); + +PERL_CALLCONV void +Perl_save_hptr(pTHX_ HV **hptr); +#define PERL_ARGS_ASSERT_SAVE_HPTR \ + assert(hptr) + +PERL_CALLCONV void +Perl_save_int(pTHX_ int *intp); +#define PERL_ARGS_ASSERT_SAVE_INT \ + assert(intp) + +PERL_CALLCONV void +Perl_save_item(pTHX_ SV *item); +#define PERL_ARGS_ASSERT_SAVE_ITEM \ + assert(item) + +PERL_CALLCONV void +Perl_save_iv(pTHX_ IV *ivp); +#define PERL_ARGS_ASSERT_SAVE_IV \ + assert(ivp) + +PERL_CALLCONV void +Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off); #define PERL_ARGS_ASSERT_SAVE_PADSV_AND_MORTALIZE -PERL_CALLCONV void Perl_save_pptr(pTHX_ char** pptr); -#define PERL_ARGS_ASSERT_SAVE_PPTR \ - assert(pptr) -PERL_CALLCONV void Perl_save_pushi32ptr(pTHX_ const I32 i, void *const ptr, const int type); + +PERL_CALLCONV void +Perl_save_pptr(pTHX_ char **pptr); +#define PERL_ARGS_ASSERT_SAVE_PPTR \ + assert(pptr) + +PERL_CALLCONV void +Perl_save_pushi32ptr(pTHX_ const I32 i, void * const ptr, const int type); #define PERL_ARGS_ASSERT_SAVE_PUSHI32PTR -PERL_CALLCONV void Perl_save_pushptr(pTHX_ void *const ptr, const int type); + +PERL_CALLCONV void +Perl_save_pushptr(pTHX_ void * const ptr, const int type); #define PERL_ARGS_ASSERT_SAVE_PUSHPTR -PERL_CALLCONV void Perl_save_pushptrptr(pTHX_ void *const ptr1, void *const ptr2, const int type); + +PERL_CALLCONV void +Perl_save_pushptrptr(pTHX_ void * const ptr1, void * const ptr2, const int type); #define PERL_ARGS_ASSERT_SAVE_PUSHPTRPTR -PERL_CALLCONV void Perl_save_re_context(pTHX); + +PERL_CALLCONV void +Perl_save_rcpv(pTHX_ char **prcpv); +#define PERL_ARGS_ASSERT_SAVE_RCPV \ + assert(prcpv) + +PERL_CALLCONV void +Perl_save_re_context(pTHX); #define PERL_ARGS_ASSERT_SAVE_RE_CONTEXT -PERL_CALLCONV SV* Perl_save_scalar(pTHX_ GV* gv); -#define PERL_ARGS_ASSERT_SAVE_SCALAR \ - assert(gv) -PERL_CALLCONV void Perl_save_set_svflags(pTHX_ SV *sv, U32 mask, U32 val); -#define PERL_ARGS_ASSERT_SAVE_SET_SVFLAGS \ - assert(sv) -PERL_CALLCONV void Perl_save_shared_pvref(pTHX_ char** str); -#define PERL_ARGS_ASSERT_SAVE_SHARED_PVREF \ - assert(str) -PERL_CALLCONV void Perl_save_sptr(pTHX_ SV** sptr); -#define PERL_ARGS_ASSERT_SAVE_SPTR \ - assert(sptr) -PERL_CALLCONV void Perl_save_strlen(pTHX_ STRLEN* ptr); -#define PERL_ARGS_ASSERT_SAVE_STRLEN \ - assert(ptr) -PERL_CALLCONV SV* Perl_save_svref(pTHX_ SV** sptr); -#define PERL_ARGS_ASSERT_SAVE_SVREF \ - assert(sptr) -PERL_CALLCONV void Perl_save_vptr(pTHX_ void *ptr); -#define PERL_ARGS_ASSERT_SAVE_VPTR \ - assert(ptr) -PERL_CALLCONV char* Perl_savepv(pTHX_ const char* pv) - __attribute__malloc__ - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SAVEPV - -PERL_CALLCONV char* Perl_savepvn(pTHX_ const char* pv, Size_t len) - __attribute__malloc__ - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SAVEPVN - -PERL_CALLCONV char* Perl_savesharedpv(pTHX_ const char* pv) - __attribute__malloc__ - __attribute__warn_unused_result__; + +PERL_CALLCONV SV * +Perl_save_scalar(pTHX_ GV *gv); +#define PERL_ARGS_ASSERT_SAVE_SCALAR \ + assert(gv) + +PERL_CALLCONV void +Perl_save_set_svflags(pTHX_ SV *sv, U32 mask, U32 val); +#define PERL_ARGS_ASSERT_SAVE_SET_SVFLAGS \ + assert(sv) + +PERL_CALLCONV void +Perl_save_shared_pvref(pTHX_ char **str); +#define PERL_ARGS_ASSERT_SAVE_SHARED_PVREF \ + assert(str) + +PERL_CALLCONV void +Perl_save_sptr(pTHX_ SV **sptr); +#define PERL_ARGS_ASSERT_SAVE_SPTR \ + assert(sptr) + +PERL_CALLCONV void +Perl_save_strlen(pTHX_ STRLEN *ptr); +#define PERL_ARGS_ASSERT_SAVE_STRLEN \ + assert(ptr) + +PERL_CALLCONV SV * +Perl_save_svref(pTHX_ SV **sptr); +#define PERL_ARGS_ASSERT_SAVE_SVREF \ + assert(sptr) + +PERL_CALLCONV void +Perl_save_vptr(pTHX_ void *ptr); +#define PERL_ARGS_ASSERT_SAVE_VPTR \ + assert(ptr) + +PERL_CALLCONV char * +Perl_savesharedpv(pTHX_ const char *pv) + __attribute__malloc__ + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_SAVESHAREDPV -PERL_CALLCONV char* Perl_savesharedpvn(pTHX_ const char *const pv, const STRLEN len) - __attribute__malloc__ - __attribute__warn_unused_result__; +PERL_CALLCONV char * +Perl_savesharedpvn(pTHX_ const char * const pv, const STRLEN len) + __attribute__malloc__ + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_SAVESHAREDPVN -PERL_CALLCONV char* Perl_savesharedsvpv(pTHX_ SV *sv) - __attribute__malloc__ - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SAVESHAREDSVPV \ - assert(sv) - -PERL_CALLCONV void Perl_savestack_grow(pTHX); +PERL_CALLCONV void +Perl_savestack_grow(pTHX); #define PERL_ARGS_ASSERT_SAVESTACK_GROW -PERL_CALLCONV void Perl_savestack_grow_cnt(pTHX_ I32 need); + +PERL_CALLCONV void +Perl_savestack_grow_cnt(pTHX_ I32 need); #define PERL_ARGS_ASSERT_SAVESTACK_GROW_CNT -PERL_CALLCONV char* Perl_savesvpv(pTHX_ SV* sv) - __attribute__malloc__ - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SAVESVPV \ - assert(sv) -PERL_CALLCONV void Perl_savetmps(pTHX); +PERL_CALLCONV void +Perl_savetmps(pTHX); #define PERL_ARGS_ASSERT_SAVETMPS -PERL_CALLCONV OP* Perl_sawparens(pTHX_ OP* o); + +PERL_CALLCONV OP * +Perl_sawparens(pTHX_ OP *o) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SAWPARENS -PERL_CALLCONV OP* Perl_scalar(pTHX_ OP* o); + +PERL_CALLCONV OP * +Perl_scalar(pTHX_ OP *o) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SCALAR -PERL_CALLCONV OP* Perl_scalarvoid(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_SCALARVOID \ - assert(o) -PERL_CALLCONV NV Perl_scan_bin(pTHX_ const char* start, STRLEN len, STRLEN* retlen); -#define PERL_ARGS_ASSERT_SCAN_BIN \ - assert(start); assert(retlen) -PERL_CALLCONV NV Perl_scan_hex(pTHX_ const char* start, STRLEN len, STRLEN* retlen); -#define PERL_ARGS_ASSERT_SCAN_HEX \ - assert(start); assert(retlen) -PERL_CALLCONV char* Perl_scan_num(pTHX_ const char* s, YYSTYPE *lvalp); -#define PERL_ARGS_ASSERT_SCAN_NUM \ - assert(s); assert(lvalp) -PERL_CALLCONV NV Perl_scan_oct(pTHX_ const char* start, STRLEN len, STRLEN* retlen); -#define PERL_ARGS_ASSERT_SCAN_OCT \ - assert(start); assert(retlen) -PERL_CALLCONV char* Perl_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims, int re_reparse, char **delimp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SCAN_STR \ - assert(start) - -PERL_CALLCONV const char* Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv); -#define PERL_ARGS_ASSERT_SCAN_VERSION \ - assert(s); assert(rv) -PERL_CALLCONV char* Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv); -#define PERL_ARGS_ASSERT_SCAN_VSTRING \ - assert(s); assert(e); assert(sv) -PERL_CALLCONV char* Perl_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp); -#define PERL_ARGS_ASSERT_SCAN_WORD \ - assert(s); assert(dest); assert(slp) -PERL_CALLCONV U32 Perl_seed(pTHX); + +PERL_CALLCONV OP * +Perl_scalarvoid(pTHX_ OP *o) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_SCALARVOID \ + assert(o) + +PERL_CALLCONV NV +Perl_scan_bin(pTHX_ const char *start, STRLEN len, STRLEN *retlen); +#define PERL_ARGS_ASSERT_SCAN_BIN \ + assert(start); assert(retlen) + +PERL_CALLCONV NV +Perl_scan_hex(pTHX_ const char *start, STRLEN len, STRLEN *retlen); +#define PERL_ARGS_ASSERT_SCAN_HEX \ + assert(start); assert(retlen) + +PERL_CALLCONV char * +Perl_scan_num(pTHX_ const char *s, YYSTYPE *lvalp); +#define PERL_ARGS_ASSERT_SCAN_NUM \ + assert(s); assert(lvalp) + +PERL_CALLCONV NV +Perl_scan_oct(pTHX_ const char *start, STRLEN len, STRLEN *retlen); +#define PERL_ARGS_ASSERT_SCAN_OCT \ + assert(start); assert(retlen) + +PERL_CALLCONV char * +Perl_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims, int re_reparse, char **delimp) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SCAN_STR \ + assert(start) + +PERL_CALLCONV const char * +Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv); +#define PERL_ARGS_ASSERT_SCAN_VERSION \ + assert(s); assert(rv) + +PERL_CALLCONV char * +Perl_scan_vstring(pTHX_ const char *s, const char * const e, SV *sv); +#define PERL_ARGS_ASSERT_SCAN_VSTRING \ + assert(s); assert(e); assert(sv) + +PERL_CALLCONV char * +Perl_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp); +#define PERL_ARGS_ASSERT_SCAN_WORD \ + assert(s); assert(dest); assert(slp) + +PERL_CALLCONV char * +Perl_scan_word6(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp, bool warn_tick); +#define PERL_ARGS_ASSERT_SCAN_WORD6 \ + assert(s); assert(dest); assert(slp) + +PERL_CALLCONV U32 +Perl_seed(pTHX); #define PERL_ARGS_ASSERT_SEED -PERL_CALLCONV void Perl_set_caret_X(pTHX); + +PERL_CALLCONV void +Perl_set_caret_X(pTHX); #define PERL_ARGS_ASSERT_SET_CARET_X -PERL_CALLCONV void Perl_set_context(void *t); -#define PERL_ARGS_ASSERT_SET_CONTEXT \ - assert(t) -PERL_CALLCONV void Perl_set_numeric_standard(pTHX); + +PERL_CALLCONV void +Perl_set_context(void *t); +#define PERL_ARGS_ASSERT_SET_CONTEXT \ + assert(t) + +PERL_CALLCONV void +Perl_set_numeric_standard(pTHX); #define PERL_ARGS_ASSERT_SET_NUMERIC_STANDARD -PERL_CALLCONV void Perl_set_numeric_underlying(pTHX); + +PERL_CALLCONV void +Perl_set_numeric_underlying(pTHX); #define PERL_ARGS_ASSERT_SET_NUMERIC_UNDERLYING -PERL_CALLCONV void Perl_setdefout(pTHX_ GV* gv); -#define PERL_ARGS_ASSERT_SETDEFOUT \ - assert(gv) -PERL_CALLCONV void Perl_setfd_cloexec(int fd); + +PERL_CALLCONV void +Perl_setdefout(pTHX_ GV *gv); +#define PERL_ARGS_ASSERT_SETDEFOUT \ + assert(gv) + +PERL_CALLCONV void +Perl_setfd_cloexec(int fd) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SETFD_CLOEXEC -PERL_CALLCONV void Perl_setfd_cloexec_for_nonsysfd(pTHX_ int fd); + +PERL_CALLCONV void +Perl_setfd_cloexec_for_nonsysfd(pTHX_ int fd) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SETFD_CLOEXEC_FOR_NONSYSFD -PERL_CALLCONV void Perl_setfd_cloexec_or_inhexec_by_sysfdness(pTHX_ int fd); + +PERL_CALLCONV void +Perl_setfd_cloexec_or_inhexec_by_sysfdness(pTHX_ int fd) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SETFD_CLOEXEC_OR_INHEXEC_BY_SYSFDNESS -PERL_CALLCONV void Perl_setfd_inhexec(int fd); + +PERL_CALLCONV void +Perl_setfd_inhexec(int fd) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SETFD_INHEXEC -PERL_CALLCONV void Perl_setfd_inhexec_for_sysfd(pTHX_ int fd); + +PERL_CALLCONV void +Perl_setfd_inhexec_for_sysfd(pTHX_ int fd) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SETFD_INHEXEC_FOR_SYSFD -PERL_CALLCONV HEK* Perl_share_hek(pTHX_ const char* str, SSize_t len, U32 hash); -#define PERL_ARGS_ASSERT_SHARE_HEK \ - assert(str) -PERL_CALLCONV Signal_t Perl_sighandler1(int sig); + +PERL_CALLCONV HEK * +Perl_share_hek(pTHX_ const char *str, SSize_t len, U32 hash); +#define PERL_ARGS_ASSERT_SHARE_HEK \ + assert(str) + +PERL_CALLCONV Signal_t +Perl_sighandler1(int sig) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SIGHANDLER1 -PERL_CALLCONV Signal_t Perl_sighandler3(int sig, Siginfo_t *info, void *uap); + +PERL_CALLCONV Signal_t +Perl_sighandler3(int sig, Siginfo_t *info, void *uap) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SIGHANDLER3 -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE unsigned Perl_single_1bit_pos32(U32 word) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SINGLE_1BIT_POS32 -#endif - -PERL_CALLCONV char* Perl_skipspace_flags(pTHX_ char *s, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SKIPSPACE_FLAGS \ - assert(s) - -PERL_CALLCONV void Perl_sortsv(pTHX_ SV** array, size_t num_elts, SVCOMPARE_t cmp); -#define PERL_ARGS_ASSERT_SORTSV \ - assert(cmp) -PERL_CALLCONV void Perl_sortsv_flags(pTHX_ SV** array, size_t num_elts, SVCOMPARE_t cmp, U32 flags); -#define PERL_ARGS_ASSERT_SORTSV_FLAGS \ - assert(cmp) -PERL_CALLCONV SV** Perl_stack_grow(pTHX_ SV** sp, SV** p, SSize_t n); -#define PERL_ARGS_ASSERT_STACK_GROW \ - assert(sp); assert(p) -PERL_CALLCONV PerlIO* Perl_start_glob(pTHX_ SV *tmpglob, IO *io); -#define PERL_ARGS_ASSERT_START_GLOB \ - assert(tmpglob); assert(io) -PERL_CALLCONV I32 Perl_start_subparse(pTHX_ I32 is_format, U32 flags); + +PERL_CALLCONV char * +Perl_skipspace_flags(pTHX_ char *s, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SKIPSPACE_FLAGS \ + assert(s) + +PERL_CALLCONV void +Perl_sortsv(pTHX_ SV **array, size_t num_elts, SVCOMPARE_t cmp); +#define PERL_ARGS_ASSERT_SORTSV \ + assert(cmp) + +PERL_CALLCONV void +Perl_sortsv_flags(pTHX_ SV **array, size_t num_elts, SVCOMPARE_t cmp, U32 flags); +#define PERL_ARGS_ASSERT_SORTSV_FLAGS \ + assert(cmp) + +PERL_CALLCONV SV ** +Perl_stack_grow(pTHX_ SV **sp, SV **p, SSize_t n); +#define PERL_ARGS_ASSERT_STACK_GROW \ + assert(sp); assert(p) + +PERL_CALLCONV PerlIO * +Perl_start_glob(pTHX_ SV *tmpglob, IO *io) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_START_GLOB \ + assert(tmpglob); assert(io) + +PERL_CALLCONV I32 +Perl_start_subparse(pTHX_ I32 is_format, U32 flags); #define PERL_ARGS_ASSERT_START_SUBPARSE -PERL_CALLCONV NV Perl_str_to_version(pTHX_ SV *sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_STR_TO_VERSION \ - assert(sv) - -PERL_CALLCONV void Perl_sub_crush_depth(pTHX_ CV* cv); -#define PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH \ - assert(cv) -#ifndef NO_MATHOMS -PERL_CALLCONV bool Perl_sv_2bool(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_2BOOL \ - assert(sv) -#endif -PERL_CALLCONV bool Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags); -#define PERL_ARGS_ASSERT_SV_2BOOL_FLAGS \ - assert(sv) -PERL_CALLCONV CV* Perl_sv_2cv(pTHX_ SV* sv, HV **const st, GV **const gvp, const I32 lref); -#define PERL_ARGS_ASSERT_SV_2CV \ - assert(st); assert(gvp) -PERL_CALLCONV IO* Perl_sv_2io(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_2IO \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV IV Perl_sv_2iv(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SV_2IV \ - assert(sv) -#endif -PERL_CALLCONV IV Perl_sv_2iv_flags(pTHX_ SV *const sv, const I32 flags); -#define PERL_ARGS_ASSERT_SV_2IV_FLAGS \ - assert(sv) -PERL_CALLCONV SV* Perl_sv_2mortal(pTHX_ SV *const sv); + +PERL_CALLCONV NV +Perl_str_to_version(pTHX_ SV *sv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_STR_TO_VERSION \ + assert(sv) + +PERL_CALLCONV void +Perl_sub_crush_depth(pTHX_ CV *cv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH \ + assert(cv) + +PERL_CALLCONV void +Perl_suspend_compcv(pTHX_ struct suspended_compcv *buffer); +#define PERL_ARGS_ASSERT_SUSPEND_COMPCV \ + assert(buffer) + +PERL_CALLCONV bool +Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags); +#define PERL_ARGS_ASSERT_SV_2BOOL_FLAGS \ + assert(sv) + +PERL_CALLCONV CV * +Perl_sv_2cv(pTHX_ SV *sv, HV ** const st, GV ** const gvp, const I32 lref); +#define PERL_ARGS_ASSERT_SV_2CV \ + assert(st); assert(gvp) + +PERL_CALLCONV IO * +Perl_sv_2io(pTHX_ SV * const sv); +#define PERL_ARGS_ASSERT_SV_2IO \ + assert(sv) + +PERL_CALLCONV IV +Perl_sv_2iv_flags(pTHX_ SV * const sv, const I32 flags); +#define PERL_ARGS_ASSERT_SV_2IV_FLAGS \ + assert(sv) + +PERL_CALLCONV SV * +Perl_sv_2mortal(pTHX_ SV * const sv); #define PERL_ARGS_ASSERT_SV_2MORTAL -PERL_CALLCONV SV* Perl_sv_2num(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_2NUM \ - assert(sv) -PERL_CALLCONV NV Perl_sv_2nv_flags(pTHX_ SV *const sv, const I32 flags); -#define PERL_ARGS_ASSERT_SV_2NV_FLAGS \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_2pv(pTHX_ SV *sv, STRLEN *lp); -#define PERL_ARGS_ASSERT_SV_2PV \ - assert(sv) -#endif -PERL_CALLCONV char* Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const U32 flags); -#define PERL_ARGS_ASSERT_SV_2PV_FLAGS \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_2pv_nolen(pTHX_ SV* sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_2PV_NOLEN \ - assert(sv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_2pvbyte(pTHX_ SV *sv, STRLEN *const lp); -#define PERL_ARGS_ASSERT_SV_2PVBYTE \ - assert(sv) -#endif -PERL_CALLCONV char* Perl_sv_2pvbyte_flags(pTHX_ SV *sv, STRLEN *const lp, const U32 flags); -#define PERL_ARGS_ASSERT_SV_2PVBYTE_FLAGS \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_2pvbyte_nolen(pTHX_ SV* sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_2PVBYTE_NOLEN \ - assert(sv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_2pvutf8(pTHX_ SV *sv, STRLEN *const lp); -#define PERL_ARGS_ASSERT_SV_2PVUTF8 \ - assert(sv) -#endif -PERL_CALLCONV char* Perl_sv_2pvutf8_flags(pTHX_ SV *sv, STRLEN *const lp, const U32 flags); -#define PERL_ARGS_ASSERT_SV_2PVUTF8_FLAGS \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_2pvutf8_nolen(pTHX_ SV* sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_2PVUTF8_NOLEN \ - assert(sv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV UV Perl_sv_2uv(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SV_2UV \ - assert(sv) -#endif -PERL_CALLCONV UV Perl_sv_2uv_flags(pTHX_ SV *const sv, const I32 flags); -#define PERL_ARGS_ASSERT_SV_2UV_FLAGS \ - assert(sv) -PERL_CALLCONV void Perl_sv_backoff(SV *const sv); -#define PERL_ARGS_ASSERT_SV_BACKOFF \ - assert(sv) -PERL_CALLCONV SV* Perl_sv_bless(pTHX_ SV *const sv, HV *const stash); -#define PERL_ARGS_ASSERT_SV_BLESS \ - assert(sv); assert(stash) -PERL_CALLCONV bool Perl_sv_cat_decode(pTHX_ SV* dsv, SV *encoding, SV *ssv, int *offset, char* tstr, int tlen); -#define PERL_ARGS_ASSERT_SV_CAT_DECODE \ - assert(dsv); assert(encoding); assert(ssv); assert(offset); assert(tstr) -PERL_CALLCONV void Perl_sv_catpv(pTHX_ SV *const dsv, const char* sstr); -#define PERL_ARGS_ASSERT_SV_CATPV \ - assert(dsv) -PERL_CALLCONV void Perl_sv_catpv_flags(pTHX_ SV *dsv, const char *sstr, const I32 flags); -#define PERL_ARGS_ASSERT_SV_CATPV_FLAGS \ - assert(dsv); assert(sstr) -PERL_CALLCONV void Perl_sv_catpv_mg(pTHX_ SV *const dsv, const char *const sstr); -#define PERL_ARGS_ASSERT_SV_CATPV_MG \ - assert(dsv) -PERL_CALLCONV void Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...) - __attribute__format__(__printf__,pTHX_2,pTHX_3); -#define PERL_ARGS_ASSERT_SV_CATPVF \ - assert(sv); assert(pat) - -PERL_CALLCONV void Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...) - __attribute__format__(__printf__,pTHX_2,pTHX_3); -#define PERL_ARGS_ASSERT_SV_CATPVF_MG \ - assert(sv); assert(pat) - -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_catpvn(pTHX_ SV *dsv, const char *sstr, STRLEN len); -#define PERL_ARGS_ASSERT_SV_CATPVN \ - assert(dsv); assert(sstr) -#endif -PERL_CALLCONV void Perl_sv_catpvn_flags(pTHX_ SV *const dsv, const char *sstr, const STRLEN len, const I32 flags); -#define PERL_ARGS_ASSERT_SV_CATPVN_FLAGS \ - assert(dsv); assert(sstr) -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_catpvn_mg(pTHX_ SV *dsv, const char *sstr, STRLEN len); -#define PERL_ARGS_ASSERT_SV_CATPVN_MG \ - assert(dsv); assert(sstr) -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_catsv(pTHX_ SV *dsv, SV *sstr); -#define PERL_ARGS_ASSERT_SV_CATSV \ - assert(dsv) -#endif -PERL_CALLCONV void Perl_sv_catsv_flags(pTHX_ SV *const dsv, SV *const sstr, const I32 flags); -#define PERL_ARGS_ASSERT_SV_CATSV_FLAGS \ - assert(dsv) -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_catsv_mg(pTHX_ SV *dsv, SV *sstr); -#define PERL_ARGS_ASSERT_SV_CATSV_MG \ - assert(dsv) -#endif -PERL_CALLCONV void Perl_sv_chop(pTHX_ SV *const sv, const char *const ptr); -#define PERL_ARGS_ASSERT_SV_CHOP \ - assert(sv) -PERL_CALLCONV I32 Perl_sv_clean_all(pTHX); + +PERL_CALLCONV SV * +Perl_sv_2num(pTHX_ SV * const sv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_SV_2NUM \ + assert(sv) + +PERL_CALLCONV NV +Perl_sv_2nv_flags(pTHX_ SV * const sv, const I32 flags); +#define PERL_ARGS_ASSERT_SV_2NV_FLAGS \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_2pv_flags(pTHX_ SV * const sv, STRLEN * const lp, const U32 flags); +#define PERL_ARGS_ASSERT_SV_2PV_FLAGS \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_2pvbyte_flags(pTHX_ SV *sv, STRLEN * const lp, const U32 flags); +#define PERL_ARGS_ASSERT_SV_2PVBYTE_FLAGS \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_2pvutf8_flags(pTHX_ SV *sv, STRLEN * const lp, const U32 flags); +#define PERL_ARGS_ASSERT_SV_2PVUTF8_FLAGS \ + assert(sv) + +PERL_CALLCONV UV +Perl_sv_2uv_flags(pTHX_ SV * const sv, const I32 flags); +#define PERL_ARGS_ASSERT_SV_2UV_FLAGS \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_backoff(SV * const sv); +#define PERL_ARGS_ASSERT_SV_BACKOFF \ + assert(sv) + +PERL_CALLCONV SV * +Perl_sv_bless(pTHX_ SV * const sv, HV * const stash); +#define PERL_ARGS_ASSERT_SV_BLESS \ + assert(sv); assert(stash) + +PERL_CALLCONV bool +Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding, SV *ssv, int *offset, char *tstr, int tlen); +#define PERL_ARGS_ASSERT_SV_CAT_DECODE \ + assert(dsv); assert(encoding); assert(ssv); assert(offset); assert(tstr) + +PERL_CALLCONV void +Perl_sv_catpv(pTHX_ SV * const dsv, const char *sstr); +#define PERL_ARGS_ASSERT_SV_CATPV \ + assert(dsv) + +PERL_CALLCONV void +Perl_sv_catpv_flags(pTHX_ SV *dsv, const char *sstr, const I32 flags); +#define PERL_ARGS_ASSERT_SV_CATPV_FLAGS \ + assert(dsv); assert(sstr) + +PERL_CALLCONV void +Perl_sv_catpv_mg(pTHX_ SV * const dsv, const char * const sstr); +#define PERL_ARGS_ASSERT_SV_CATPV_MG \ + assert(dsv) + +PERL_CALLCONV void +Perl_sv_catpvf(pTHX_ SV * const sv, const char * const pat, ...) + __attribute__format__(__printf__,pTHX_2,pTHX_3); +#define PERL_ARGS_ASSERT_SV_CATPVF \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_catpvf_mg(pTHX_ SV * const sv, const char * const pat, ...) + __attribute__format__(__printf__,pTHX_2,pTHX_3); +#define PERL_ARGS_ASSERT_SV_CATPVF_MG \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_catpvn_flags(pTHX_ SV * const dsv, const char *sstr, const STRLEN len, const I32 flags); +#define PERL_ARGS_ASSERT_SV_CATPVN_FLAGS \ + assert(dsv); assert(sstr) + +PERL_CALLCONV void +Perl_sv_catsv_flags(pTHX_ SV * const dsv, SV * const sstr, const I32 flags); +#define PERL_ARGS_ASSERT_SV_CATSV_FLAGS \ + assert(dsv) + +PERL_CALLCONV void +Perl_sv_chop(pTHX_ SV * const sv, const char * const ptr); +#define PERL_ARGS_ASSERT_SV_CHOP \ + assert(sv) + +PERL_CALLCONV I32 +Perl_sv_clean_all(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SV_CLEAN_ALL -PERL_CALLCONV void Perl_sv_clean_objs(pTHX); + +PERL_CALLCONV void +Perl_sv_clean_objs(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SV_CLEAN_OBJS -PERL_CALLCONV void Perl_sv_clear(pTHX_ SV *const orig_sv); -#define PERL_ARGS_ASSERT_SV_CLEAR \ - assert(orig_sv) -PERL_CALLCONV I32 Perl_sv_cmp(pTHX_ SV *const sv1, SV *const sv2); + +PERL_CALLCONV void +Perl_sv_clear(pTHX_ SV * const orig_sv); +#define PERL_ARGS_ASSERT_SV_CLEAR \ + assert(orig_sv) + +PERL_CALLCONV I32 +Perl_sv_cmp(pTHX_ SV * const sv1, SV * const sv2); #define PERL_ARGS_ASSERT_SV_CMP -PERL_CALLCONV I32 Perl_sv_cmp_flags(pTHX_ SV *const sv1, SV *const sv2, const U32 flags); + +PERL_CALLCONV I32 +Perl_sv_cmp_flags(pTHX_ SV * const sv1, SV * const sv2, const U32 flags); #define PERL_ARGS_ASSERT_SV_CMP_FLAGS -PERL_CALLCONV I32 Perl_sv_cmp_locale(pTHX_ SV *const sv1, SV *const sv2); + +PERL_CALLCONV I32 +Perl_sv_cmp_locale(pTHX_ SV * const sv1, SV * const sv2); #define PERL_ARGS_ASSERT_SV_CMP_LOCALE -PERL_CALLCONV I32 Perl_sv_cmp_locale_flags(pTHX_ SV *const sv1, SV *const sv2, const U32 flags); + +PERL_CALLCONV I32 +Perl_sv_cmp_locale_flags(pTHX_ SV * const sv1, SV * const sv2, const U32 flags); #define PERL_ARGS_ASSERT_SV_CMP_LOCALE_FLAGS -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_copypv(pTHX_ SV *const dsv, SV *const ssv); -#define PERL_ARGS_ASSERT_SV_COPYPV \ - assert(dsv); assert(ssv) -#endif -PERL_CALLCONV void Perl_sv_copypv_flags(pTHX_ SV *const dsv, SV *const ssv, const I32 flags); -#define PERL_ARGS_ASSERT_SV_COPYPV_FLAGS \ - assert(dsv); assert(ssv) -/* PERL_CALLCONV void sv_copypv_nomg(pTHX_ SV *const dsv, SV *const ssv); */ -#define PERL_ARGS_ASSERT_SV_COPYPV_NOMG -PERL_CALLCONV void Perl_sv_dec(pTHX_ SV *const sv); + +PERL_CALLCONV void +Perl_sv_copypv_flags(pTHX_ SV * const dsv, SV * const ssv, const I32 flags); +#define PERL_ARGS_ASSERT_SV_COPYPV_FLAGS \ + assert(dsv); assert(ssv) + +/* PERL_CALLCONV void +sv_copypv_nomg(pTHX_ SV * const dsv, SV * const ssv); */ + +PERL_CALLCONV void +Perl_sv_dec(pTHX_ SV * const sv); #define PERL_ARGS_ASSERT_SV_DEC -PERL_CALLCONV void Perl_sv_dec_nomg(pTHX_ SV *const sv); + +PERL_CALLCONV void +Perl_sv_dec_nomg(pTHX_ SV * const sv); #define PERL_ARGS_ASSERT_SV_DEC_NOMG -PERL_CALLCONV void Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv); -#define PERL_ARGS_ASSERT_SV_DEL_BACKREF \ - assert(tsv); assert(sv) -PERL_CALLCONV bool Perl_sv_derived_from(pTHX_ SV* sv, const char *const name) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DERIVED_FROM \ - assert(sv); assert(name) - -PERL_CALLCONV bool Perl_sv_derived_from_pv(pTHX_ SV* sv, const char *const name, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_PV \ - assert(sv); assert(name) - -PERL_CALLCONV bool Perl_sv_derived_from_pvn(pTHX_ SV* sv, const char *const name, const STRLEN len, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_PVN \ - assert(sv); assert(name) - -PERL_CALLCONV bool Perl_sv_derived_from_sv(pTHX_ SV* sv, SV *namesv, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_SV \ - assert(sv); assert(namesv) -PERL_CALLCONV bool Perl_sv_destroyable(pTHX_ SV *sv); +PERL_CALLCONV void +Perl_sv_del_backref(pTHX_ SV * const tsv, SV * const sv); +#define PERL_ARGS_ASSERT_SV_DEL_BACKREF \ + assert(tsv); assert(sv) + +PERL_CALLCONV bool +Perl_sv_derived_from(pTHX_ SV *sv, const char * const name) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_DERIVED_FROM \ + assert(sv); assert(name) + +PERL_CALLCONV bool +Perl_sv_derived_from_hv(pTHX_ SV *sv, HV *hv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_HV \ + assert(sv); assert(hv) + +PERL_CALLCONV bool +Perl_sv_derived_from_pv(pTHX_ SV *sv, const char * const name, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_PV \ + assert(sv); assert(name) + +PERL_CALLCONV bool +Perl_sv_derived_from_pvn(pTHX_ SV *sv, const char * const name, const STRLEN len, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_PVN \ + assert(sv); assert(name) + +PERL_CALLCONV bool +Perl_sv_derived_from_sv(pTHX_ SV *sv, SV *namesv, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_DERIVED_FROM_SV \ + assert(sv); assert(namesv) + +PERL_CALLCONV bool +Perl_sv_destroyable(pTHX_ SV *sv); #define PERL_ARGS_ASSERT_SV_DESTROYABLE -PERL_CALLCONV bool Perl_sv_does(pTHX_ SV* sv, const char *const name) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DOES \ - assert(sv); assert(name) - -PERL_CALLCONV bool Perl_sv_does_pv(pTHX_ SV* sv, const char *const name, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DOES_PV \ - assert(sv); assert(name) - -PERL_CALLCONV bool Perl_sv_does_pvn(pTHX_ SV* sv, const char *const name, const STRLEN len, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DOES_PVN \ - assert(sv); assert(name) - -PERL_CALLCONV bool Perl_sv_does_sv(pTHX_ SV* sv, SV* namesv, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DOES_SV \ - assert(sv); assert(namesv) -PERL_CALLCONV void Perl_sv_dump(pTHX_ SV* sv); +PERL_CALLCONV bool +Perl_sv_does(pTHX_ SV *sv, const char * const name) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_DOES \ + assert(sv); assert(name) + +PERL_CALLCONV bool +Perl_sv_does_pv(pTHX_ SV *sv, const char * const name, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_DOES_PV \ + assert(sv); assert(name) + +PERL_CALLCONV bool +Perl_sv_does_pvn(pTHX_ SV *sv, const char * const name, const STRLEN len, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_DOES_PVN \ + assert(sv); assert(name) + +PERL_CALLCONV bool +Perl_sv_does_sv(pTHX_ SV *sv, SV *namesv, U32 flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_DOES_SV \ + assert(sv); assert(namesv) + +PERL_CALLCONV void +Perl_sv_dump(pTHX_ SV *sv); #define PERL_ARGS_ASSERT_SV_DUMP -#ifndef NO_MATHOMS -PERL_CALLCONV I32 Perl_sv_eq(pTHX_ SV* sv1, SV* sv2); -#define PERL_ARGS_ASSERT_SV_EQ -#endif -PERL_CALLCONV I32 Perl_sv_eq_flags(pTHX_ SV* sv1, SV* sv2, const U32 flags); + +PERL_CALLCONV void +Perl_sv_dump_depth(pTHX_ SV *sv, I32 depth); +#define PERL_ARGS_ASSERT_SV_DUMP_DEPTH + +PERL_CALLCONV I32 +Perl_sv_eq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags); #define PERL_ARGS_ASSERT_SV_EQ_FLAGS -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_force_normal(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SV_FORCE_NORMAL \ - assert(sv) -#endif -PERL_CALLCONV void Perl_sv_force_normal_flags(pTHX_ SV *const sv, const U32 flags); -#define PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS \ - assert(sv) -PERL_CALLCONV void Perl_sv_free(pTHX_ SV *const sv); + +PERL_CALLCONV void +Perl_sv_force_normal_flags(pTHX_ SV * const sv, const U32 flags); +#define PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_free(pTHX_ SV * const sv); #define PERL_ARGS_ASSERT_SV_FREE -PERL_CALLCONV void Perl_sv_free2(pTHX_ SV *const sv, const U32 refcnt); -#define PERL_ARGS_ASSERT_SV_FREE2 \ - assert(sv) -PERL_CALLCONV void Perl_sv_free_arenas(pTHX); + +PERL_CALLCONV void +Perl_sv_free2(pTHX_ SV * const sv, const U32 refcnt); +#define PERL_ARGS_ASSERT_SV_FREE2 \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_free_arenas(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SV_FREE_ARENAS -PERL_CALLCONV SV* Perl_sv_get_backrefs(SV *const sv); -#define PERL_ARGS_ASSERT_SV_GET_BACKREFS \ - assert(sv) -PERL_CALLCONV char* Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append); -#define PERL_ARGS_ASSERT_SV_GETS \ - assert(sv); assert(fp) -PERL_CALLCONV char* Perl_sv_grow(pTHX_ SV *const sv, STRLEN newlen); -#define PERL_ARGS_ASSERT_SV_GROW \ - assert(sv) -PERL_CALLCONV char* Perl_sv_grow_fresh(pTHX_ SV *const sv, STRLEN newlen); -#define PERL_ARGS_ASSERT_SV_GROW_FRESH \ - assert(sv) -PERL_CALLCONV void Perl_sv_inc(pTHX_ SV *const sv); + +PERL_CALLCONV SV * +Perl_sv_get_backrefs(SV * const sv); +#define PERL_ARGS_ASSERT_SV_GET_BACKREFS \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_gets(pTHX_ SV * const sv, PerlIO * const fp, I32 append); +#define PERL_ARGS_ASSERT_SV_GETS \ + assert(sv); assert(fp) + +PERL_CALLCONV char * +Perl_sv_grow(pTHX_ SV * const sv, STRLEN newlen); +#define PERL_ARGS_ASSERT_SV_GROW \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_grow_fresh(pTHX_ SV * const sv, STRLEN newlen); +#define PERL_ARGS_ASSERT_SV_GROW_FRESH \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_inc(pTHX_ SV * const sv); #define PERL_ARGS_ASSERT_SV_INC -PERL_CALLCONV void Perl_sv_inc_nomg(pTHX_ SV *const sv); + +PERL_CALLCONV void +Perl_sv_inc_nomg(pTHX_ SV * const sv); #define PERL_ARGS_ASSERT_SV_INC_NOMG -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_insert(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen); -#define PERL_ARGS_ASSERT_SV_INSERT \ - assert(bigstr); assert(little) -#endif -PERL_CALLCONV void Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *little, const STRLEN littlelen, const U32 flags); -#define PERL_ARGS_ASSERT_SV_INSERT_FLAGS \ - assert(bigstr); assert(little) -PERL_CALLCONV int Perl_sv_isa(pTHX_ SV* sv, const char *const name); -#define PERL_ARGS_ASSERT_SV_ISA \ - assert(name) -PERL_CALLCONV bool Perl_sv_isa_sv(pTHX_ SV* sv, SV* namesv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_ISA_SV \ - assert(sv); assert(namesv) -PERL_CALLCONV int Perl_sv_isobject(pTHX_ SV* sv); +PERL_CALLCONV void +Perl_sv_insert_flags(pTHX_ SV * const bigstr, const STRLEN offset, const STRLEN len, const char *little, const STRLEN littlelen, const U32 flags); +#define PERL_ARGS_ASSERT_SV_INSERT_FLAGS \ + assert(bigstr); assert(little) + +PERL_CALLCONV int +Perl_sv_isa(pTHX_ SV *sv, const char * const name); +#define PERL_ARGS_ASSERT_SV_ISA \ + assert(name) + +PERL_CALLCONV bool +Perl_sv_isa_sv(pTHX_ SV *sv, SV *namesv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_ISA_SV \ + assert(sv); assert(namesv) + +PERL_CALLCONV int +Perl_sv_isobject(pTHX_ SV *sv); #define PERL_ARGS_ASSERT_SV_ISOBJECT -#ifndef NO_MATHOMS -PERL_CALLCONV IV Perl_sv_iv(pTHX_ SV* sv) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_IV \ - assert(sv) -#endif -PERL_CALLCONV STRLEN Perl_sv_len(pTHX_ SV *const sv); +PERL_CALLCONV STRLEN +Perl_sv_len(pTHX_ SV * const sv); #define PERL_ARGS_ASSERT_SV_LEN -PERL_CALLCONV STRLEN Perl_sv_len_utf8(pTHX_ SV *const sv); + +PERL_CALLCONV STRLEN +Perl_sv_len_utf8(pTHX_ SV * const sv); #define PERL_ARGS_ASSERT_SV_LEN_UTF8 -PERL_CALLCONV STRLEN Perl_sv_len_utf8_nomg(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_LEN_UTF8_NOMG \ - assert(sv) -PERL_CALLCONV void Perl_sv_magic(pTHX_ SV *const sv, SV *const obj, const int how, const char *const name, const I32 namlen); -#define PERL_ARGS_ASSERT_SV_MAGIC \ - assert(sv) -PERL_CALLCONV MAGIC * Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how, const MGVTBL *const vtbl, const char *const name, const I32 namlen); -#define PERL_ARGS_ASSERT_SV_MAGICEXT \ - assert(sv) -PERL_CALLCONV MAGIC * Perl_sv_magicext_mglob(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SV_MAGICEXT_MGLOB \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV SV* Perl_sv_mortalcopy(pTHX_ SV *const oldsv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_MORTALCOPY -#endif -PERL_CALLCONV SV* Perl_sv_mortalcopy_flags(pTHX_ SV *const oldsv, U32 flags) - __attribute__warn_unused_result__; +PERL_CALLCONV STRLEN +Perl_sv_len_utf8_nomg(pTHX_ SV * const sv); +#define PERL_ARGS_ASSERT_SV_LEN_UTF8_NOMG \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_magic(pTHX_ SV * const sv, SV * const obj, const int how, const char * const name, const I32 namlen); +#define PERL_ARGS_ASSERT_SV_MAGIC \ + assert(sv) + +PERL_CALLCONV MAGIC * +Perl_sv_magicext(pTHX_ SV * const sv, SV * const obj, const int how, const MGVTBL * const vtbl, const char * const name, const I32 namlen); +#define PERL_ARGS_ASSERT_SV_MAGICEXT \ + assert(sv) + +PERL_CALLCONV MAGIC * +Perl_sv_magicext_mglob(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_SV_MAGICEXT_MGLOB \ + assert(sv) + +PERL_CALLCONV SV * +Perl_sv_mortalcopy_flags(pTHX_ SV * const oldsv, U32 flags) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_SV_MORTALCOPY_FLAGS -PERL_CALLCONV SV* Perl_sv_newmortal(pTHX) - __attribute__warn_unused_result__; +PERL_CALLCONV SV * +Perl_sv_newmortal(pTHX) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_SV_NEWMORTAL -PERL_CALLCONV SV* Perl_sv_newref(pTHX_ SV *const sv); +PERL_CALLCONV SV * +Perl_sv_newref(pTHX_ SV * const sv); #define PERL_ARGS_ASSERT_SV_NEWREF -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_nolocking(pTHX_ SV *sv) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_NOLOCKING -#endif -PERL_CALLCONV void Perl_sv_nosharing(pTHX_ SV *sv); +PERL_CALLCONV void +Perl_sv_nosharing(pTHX_ SV *sv); #define PERL_ARGS_ASSERT_SV_NOSHARING -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_nounlocking(pTHX_ SV *sv) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_NOUNLOCKING -#endif -/* PERL_CALLCONV bool sv_numeq(pTHX_ SV* sv1, SV* sv2); */ -#define PERL_ARGS_ASSERT_SV_NUMEQ -PERL_CALLCONV bool Perl_sv_numeq_flags(pTHX_ SV* sv1, SV* sv2, const U32 flags); +/* PERL_CALLCONV bool +sv_numeq(pTHX_ SV *sv1, SV *sv2); */ + +PERL_CALLCONV bool +Perl_sv_numeq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags); #define PERL_ARGS_ASSERT_SV_NUMEQ_FLAGS -#ifndef NO_MATHOMS -PERL_CALLCONV NV Perl_sv_nv(pTHX_ SV* sv) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_NV \ - assert(sv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_sv_only_taint_gmagic(SV *sv); -#define PERL_ARGS_ASSERT_SV_ONLY_TAINT_GMAGIC \ - assert(sv) -#endif -PERL_CALLCONV char* Perl_sv_peek(pTHX_ SV* sv); +PERL_CALLCONV char * +Perl_sv_peek(pTHX_ SV *sv); #define PERL_ARGS_ASSERT_SV_PEEK -PERL_CALLCONV void Perl_sv_pos_b2u(pTHX_ SV *const sv, I32 *const offsetp); -#define PERL_ARGS_ASSERT_SV_POS_B2U \ - assert(offsetp) -PERL_CALLCONV STRLEN Perl_sv_pos_b2u_flags(pTHX_ SV *const sv, STRLEN const offset, U32 flags); -#define PERL_ARGS_ASSERT_SV_POS_B2U_FLAGS \ - assert(sv) -PERL_CALLCONV void Perl_sv_pos_u2b(pTHX_ SV *const sv, I32 *const offsetp, I32 *const lenp); -#define PERL_ARGS_ASSERT_SV_POS_U2B \ - assert(offsetp) -PERL_CALLCONV STRLEN Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp, U32 flags); -#define PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_pv(pTHX_ SV *sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_PV \ - assert(sv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_pvbyte(pTHX_ SV *sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_PVBYTE \ - assert(sv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_PVBYTEN \ - assert(sv); assert(lp) -#endif - -PERL_CALLCONV char* Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp); -#define PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_PVN \ - assert(sv); assert(lp) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_pvn_force(pTHX_ SV* sv, STRLEN* lp); -#define PERL_ARGS_ASSERT_SV_PVN_FORCE \ - assert(sv) -#endif -PERL_CALLCONV char* Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const U32 flags); -#define PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_pvn_nomg(pTHX_ SV* sv, STRLEN* lp) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_PVN_NOMG \ - assert(sv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_pvutf8(pTHX_ SV *sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_PVUTF8 \ - assert(sv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_PVUTF8N \ - assert(sv); assert(lp) -#endif - -PERL_CALLCONV char* Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp); -#define PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE \ - assert(sv) -PERL_CALLCONV char* Perl_sv_recode_to_utf8(pTHX_ SV* sv, SV *encoding); -#define PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8 \ - assert(sv); assert(encoding) -PERL_CALLCONV SV* Perl_sv_ref(pTHX_ SV *dst, const SV *const sv, const int ob); -#define PERL_ARGS_ASSERT_SV_REF \ - assert(sv) -PERL_CALLCONV const char* Perl_sv_reftype(pTHX_ const SV *const sv, const int ob) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_REFTYPE \ - assert(sv) - -PERL_CALLCONV void Perl_sv_replace(pTHX_ SV *const sv, SV *const nsv); -#define PERL_ARGS_ASSERT_SV_REPLACE \ - assert(sv); assert(nsv) -PERL_CALLCONV void Perl_sv_report_used(pTHX); + +PERL_CALLCONV void +Perl_sv_pos_b2u(pTHX_ SV * const sv, I32 * const offsetp); +#define PERL_ARGS_ASSERT_SV_POS_B2U \ + assert(offsetp) + +PERL_CALLCONV STRLEN +Perl_sv_pos_b2u_flags(pTHX_ SV * const sv, STRLEN const offset, U32 flags); +#define PERL_ARGS_ASSERT_SV_POS_B2U_FLAGS \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_pos_u2b(pTHX_ SV * const sv, I32 * const offsetp, I32 * const lenp); +#define PERL_ARGS_ASSERT_SV_POS_U2B \ + assert(offsetp) + +PERL_CALLCONV STRLEN +Perl_sv_pos_u2b_flags(pTHX_ SV * const sv, STRLEN uoffset, STRLEN * const lenp, U32 flags); +#define PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_pvbyten_force(pTHX_ SV * const sv, STRLEN * const lp); +#define PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_pvn_force_flags(pTHX_ SV * const sv, STRLEN * const lp, const U32 flags); +#define PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_pvutf8n_force(pTHX_ SV * const sv, STRLEN * const lp); +#define PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding); +#define PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8 \ + assert(sv); assert(encoding) + +PERL_CALLCONV SV * +Perl_sv_ref(pTHX_ SV *dst, const SV * const sv, const int ob); +#define PERL_ARGS_ASSERT_SV_REF \ + assert(sv) + +PERL_CALLCONV const char * +Perl_sv_reftype(pTHX_ const SV * const sv, const int ob) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_REFTYPE \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_replace(pTHX_ SV * const sv, SV * const nsv); +#define PERL_ARGS_ASSERT_SV_REPLACE \ + assert(sv); assert(nsv) + +PERL_CALLCONV void +Perl_sv_report_used(pTHX); #define PERL_ARGS_ASSERT_SV_REPORT_USED -PERL_CALLCONV void Perl_sv_reset(pTHX_ const char* s, HV *const stash); -#define PERL_ARGS_ASSERT_SV_RESET \ - assert(s) -PERL_CALLCONV void Perl_sv_resetpvn(pTHX_ const char* s, STRLEN len, HV *const stash); + +PERL_CALLCONV void +Perl_sv_reset(pTHX_ const char *s, HV * const stash); +#define PERL_ARGS_ASSERT_SV_RESET \ + assert(s) + +PERL_CALLCONV void +Perl_sv_resetpvn(pTHX_ const char *s, STRLEN len, HV * const stash) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_SV_RESETPVN -PERL_CALLCONV SV* Perl_sv_rvunweaken(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_RVUNWEAKEN \ - assert(sv) -PERL_CALLCONV SV* Perl_sv_rvweaken(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_RVWEAKEN \ - assert(sv) -PERL_CALLCONV void Perl_sv_set_undef(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SV_SET_UNDEF \ - assert(sv) -PERL_CALLCONV void Perl_sv_sethek(pTHX_ SV *const sv, const HEK *const hek); -#define PERL_ARGS_ASSERT_SV_SETHEK \ - assert(sv) -PERL_CALLCONV void Perl_sv_setiv(pTHX_ SV *const sv, const IV num); -#define PERL_ARGS_ASSERT_SV_SETIV \ - assert(sv) -PERL_CALLCONV void Perl_sv_setiv_mg(pTHX_ SV *const sv, const IV i); -#define PERL_ARGS_ASSERT_SV_SETIV_MG \ - assert(sv) -PERL_CALLCONV void Perl_sv_setnv(pTHX_ SV *const sv, const NV num); -#define PERL_ARGS_ASSERT_SV_SETNV \ - assert(sv) -PERL_CALLCONV void Perl_sv_setnv_mg(pTHX_ SV *const sv, const NV num); -#define PERL_ARGS_ASSERT_SV_SETNV_MG \ - assert(sv) -PERL_CALLCONV void Perl_sv_setpv(pTHX_ SV *const sv, const char *const ptr); -#define PERL_ARGS_ASSERT_SV_SETPV \ - assert(sv) -PERL_CALLCONV char * Perl_sv_setpv_bufsize(pTHX_ SV *const sv, const STRLEN cur, const STRLEN len); -#define PERL_ARGS_ASSERT_SV_SETPV_BUFSIZE \ - assert(sv) -PERL_CALLCONV void Perl_sv_setpv_mg(pTHX_ SV *const sv, const char *const ptr); -#define PERL_ARGS_ASSERT_SV_SETPV_MG \ - assert(sv) -PERL_CALLCONV void Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...) - __attribute__format__(__printf__,pTHX_2,pTHX_3); -#define PERL_ARGS_ASSERT_SV_SETPVF \ - assert(sv); assert(pat) - -PERL_CALLCONV void Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...) - __attribute__format__(__printf__,pTHX_2,pTHX_3); -#define PERL_ARGS_ASSERT_SV_SETPVF_MG \ - assert(sv); assert(pat) - -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_setpviv(pTHX_ SV *const sv, const IV num) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_SETPVIV \ - assert(sv) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_SETPVIV_MG \ - assert(sv) -#endif - -PERL_CALLCONV void Perl_sv_setpvn(pTHX_ SV *const sv, const char *const ptr, const STRLEN len); -#define PERL_ARGS_ASSERT_SV_SETPVN \ - assert(sv) -PERL_CALLCONV void Perl_sv_setpvn_fresh(pTHX_ SV *const sv, const char *const ptr, const STRLEN len); -#define PERL_ARGS_ASSERT_SV_SETPVN_FRESH \ - assert(sv) -PERL_CALLCONV void Perl_sv_setpvn_mg(pTHX_ SV *const sv, const char *const ptr, const STRLEN len); -#define PERL_ARGS_ASSERT_SV_SETPVN_MG \ - assert(sv); assert(ptr) -PERL_CALLCONV SV* Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv); -#define PERL_ARGS_ASSERT_SV_SETREF_IV \ - assert(rv) -PERL_CALLCONV SV* Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv); -#define PERL_ARGS_ASSERT_SV_SETREF_NV \ - assert(rv) -PERL_CALLCONV SV* Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv); -#define PERL_ARGS_ASSERT_SV_SETREF_PV \ - assert(rv) -PERL_CALLCONV SV* Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname, const char *const pv, const STRLEN n); -#define PERL_ARGS_ASSERT_SV_SETREF_PVN \ - assert(rv); assert(pv) -PERL_CALLCONV SV* Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv); -#define PERL_ARGS_ASSERT_SV_SETREF_UV \ - assert(rv) -PERL_CALLCONV void Perl_sv_setrv_inc(pTHX_ SV *const sv, SV *const ref); -#define PERL_ARGS_ASSERT_SV_SETRV_INC \ - assert(sv); assert(ref) -PERL_CALLCONV void Perl_sv_setrv_inc_mg(pTHX_ SV *const sv, SV *const ref); -#define PERL_ARGS_ASSERT_SV_SETRV_INC_MG \ - assert(sv); assert(ref) -PERL_CALLCONV void Perl_sv_setrv_noinc(pTHX_ SV *const sv, SV *const ref); -#define PERL_ARGS_ASSERT_SV_SETRV_NOINC \ - assert(sv); assert(ref) -PERL_CALLCONV void Perl_sv_setrv_noinc_mg(pTHX_ SV *const sv, SV *const ref); -#define PERL_ARGS_ASSERT_SV_SETRV_NOINC_MG \ - assert(sv); assert(ref) -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_setsv(pTHX_ SV *dsv, SV *ssv); -#define PERL_ARGS_ASSERT_SV_SETSV \ - assert(dsv) -#endif -PERL_CALLCONV void Perl_sv_setsv_flags(pTHX_ SV *dsv, SV *ssv, const I32 flags); -#define PERL_ARGS_ASSERT_SV_SETSV_FLAGS \ - assert(dsv) -PERL_CALLCONV void Perl_sv_setsv_mg(pTHX_ SV *const dsv, SV *const ssv); -#define PERL_ARGS_ASSERT_SV_SETSV_MG \ - assert(dsv) -PERL_CALLCONV void Perl_sv_setuv(pTHX_ SV *const sv, const UV num); -#define PERL_ARGS_ASSERT_SV_SETUV \ - assert(sv) -PERL_CALLCONV void Perl_sv_setuv_mg(pTHX_ SV *const sv, const UV u); -#define PERL_ARGS_ASSERT_SV_SETUV_MG \ - assert(sv) -/* PERL_CALLCONV bool sv_streq(pTHX_ SV* sv1, SV* sv2); */ -#define PERL_ARGS_ASSERT_SV_STREQ -PERL_CALLCONV bool Perl_sv_streq_flags(pTHX_ SV* sv1, SV* sv2, const U32 flags); + +PERL_CALLCONV SV * +Perl_sv_rvunweaken(pTHX_ SV * const sv); +#define PERL_ARGS_ASSERT_SV_RVUNWEAKEN \ + assert(sv) + +PERL_CALLCONV SV * +Perl_sv_rvweaken(pTHX_ SV * const sv); +#define PERL_ARGS_ASSERT_SV_RVWEAKEN \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_set_bool(pTHX_ SV *sv, const bool bool_val); +#define PERL_ARGS_ASSERT_SV_SET_BOOL \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_set_false(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_SV_SET_FALSE \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_set_true(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_SV_SET_TRUE \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_set_undef(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_SV_SET_UNDEF \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_sethek(pTHX_ SV * const sv, const HEK * const hek); +#define PERL_ARGS_ASSERT_SV_SETHEK \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setiv(pTHX_ SV * const sv, const IV num); +#define PERL_ARGS_ASSERT_SV_SETIV \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setiv_mg(pTHX_ SV * const sv, const IV i); +#define PERL_ARGS_ASSERT_SV_SETIV_MG \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setnv(pTHX_ SV * const sv, const NV num); +#define PERL_ARGS_ASSERT_SV_SETNV \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setnv_mg(pTHX_ SV * const sv, const NV num); +#define PERL_ARGS_ASSERT_SV_SETNV_MG \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setpv(pTHX_ SV * const sv, const char * const ptr); +#define PERL_ARGS_ASSERT_SV_SETPV \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_setpv_bufsize(pTHX_ SV * const sv, const STRLEN cur, const STRLEN len); +#define PERL_ARGS_ASSERT_SV_SETPV_BUFSIZE \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setpv_mg(pTHX_ SV * const sv, const char * const ptr); +#define PERL_ARGS_ASSERT_SV_SETPV_MG \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setpvf(pTHX_ SV * const sv, const char * const pat, ...) + __attribute__format__(__printf__,pTHX_2,pTHX_3); +#define PERL_ARGS_ASSERT_SV_SETPVF \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_setpvf_mg(pTHX_ SV * const sv, const char * const pat, ...) + __attribute__format__(__printf__,pTHX_2,pTHX_3); +#define PERL_ARGS_ASSERT_SV_SETPVF_MG \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_setpvn(pTHX_ SV * const sv, const char * const ptr, const STRLEN len); +#define PERL_ARGS_ASSERT_SV_SETPVN \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setpvn_fresh(pTHX_ SV * const sv, const char * const ptr, const STRLEN len); +#define PERL_ARGS_ASSERT_SV_SETPVN_FRESH \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setpvn_mg(pTHX_ SV * const sv, const char * const ptr, const STRLEN len); +#define PERL_ARGS_ASSERT_SV_SETPVN_MG \ + assert(sv); assert(ptr) + +PERL_CALLCONV SV * +Perl_sv_setref_iv(pTHX_ SV * const rv, const char * const classname, const IV iv); +#define PERL_ARGS_ASSERT_SV_SETREF_IV \ + assert(rv) + +PERL_CALLCONV SV * +Perl_sv_setref_nv(pTHX_ SV * const rv, const char * const classname, const NV nv); +#define PERL_ARGS_ASSERT_SV_SETREF_NV \ + assert(rv) + +PERL_CALLCONV SV * +Perl_sv_setref_pv(pTHX_ SV * const rv, const char * const classname, void * const pv); +#define PERL_ARGS_ASSERT_SV_SETREF_PV \ + assert(rv) + +PERL_CALLCONV SV * +Perl_sv_setref_pvn(pTHX_ SV * const rv, const char * const classname, const char * const pv, const STRLEN n); +#define PERL_ARGS_ASSERT_SV_SETREF_PVN \ + assert(rv); assert(pv) + +PERL_CALLCONV SV * +Perl_sv_setref_uv(pTHX_ SV * const rv, const char * const classname, const UV uv); +#define PERL_ARGS_ASSERT_SV_SETREF_UV \ + assert(rv) + +PERL_CALLCONV void +Perl_sv_setrv_inc(pTHX_ SV * const sv, SV * const ref); +#define PERL_ARGS_ASSERT_SV_SETRV_INC \ + assert(sv); assert(ref) + +PERL_CALLCONV void +Perl_sv_setrv_inc_mg(pTHX_ SV * const sv, SV * const ref); +#define PERL_ARGS_ASSERT_SV_SETRV_INC_MG \ + assert(sv); assert(ref) + +PERL_CALLCONV void +Perl_sv_setrv_noinc(pTHX_ SV * const sv, SV * const ref); +#define PERL_ARGS_ASSERT_SV_SETRV_NOINC \ + assert(sv); assert(ref) + +PERL_CALLCONV void +Perl_sv_setrv_noinc_mg(pTHX_ SV * const sv, SV * const ref); +#define PERL_ARGS_ASSERT_SV_SETRV_NOINC_MG \ + assert(sv); assert(ref) + +PERL_CALLCONV void +Perl_sv_setsv_flags(pTHX_ SV *dsv, SV *ssv, const I32 flags); +#define PERL_ARGS_ASSERT_SV_SETSV_FLAGS \ + assert(dsv) + +PERL_CALLCONV void +Perl_sv_setsv_mg(pTHX_ SV * const dsv, SV * const ssv); +#define PERL_ARGS_ASSERT_SV_SETSV_MG \ + assert(dsv) + +PERL_CALLCONV void +Perl_sv_setuv(pTHX_ SV * const sv, const UV num); +#define PERL_ARGS_ASSERT_SV_SETUV \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setuv_mg(pTHX_ SV * const sv, const UV u); +#define PERL_ARGS_ASSERT_SV_SETUV_MG \ + assert(sv) + +/* PERL_CALLCONV bool +sv_streq(pTHX_ SV *sv1, SV *sv2); */ + +PERL_CALLCONV bool +Perl_sv_streq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags); #define PERL_ARGS_ASSERT_SV_STREQ_FLAGS -PERL_CALLCONV SV* Perl_sv_string_from_errnum(pTHX_ int errnum, SV* tgtsv); + +PERL_CALLCONV SV * +Perl_sv_string_from_errnum(pTHX_ int errnum, SV *tgtsv); #define PERL_ARGS_ASSERT_SV_STRING_FROM_ERRNUM -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_taint(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_SV_TAINT \ - assert(sv) -#endif -PERL_CALLCONV bool Perl_sv_tainted(pTHX_ SV *const sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_TAINTED \ - assert(sv) -PERL_CALLCONV I32 Perl_sv_true(pTHX_ SV *const sv); +PERL_CALLCONV bool +Perl_sv_tainted(pTHX_ SV * const sv) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_TAINTED \ + assert(sv) + +PERL_CALLCONV I32 +Perl_sv_true(pTHX_ SV * const sv); #define PERL_ARGS_ASSERT_SV_TRUE -PERL_CALLCONV char* Perl_sv_uni_display(pTHX_ SV *dsv, SV *ssv, STRLEN pvlim, UV flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_UNI_DISPLAY \ - assert(dsv); assert(ssv) - -PERL_CALLCONV int Perl_sv_unmagic(pTHX_ SV *const sv, const int type); -#define PERL_ARGS_ASSERT_SV_UNMAGIC \ - assert(sv) -PERL_CALLCONV int Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl); -#define PERL_ARGS_ASSERT_SV_UNMAGICEXT \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_unref(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_SV_UNREF \ - assert(sv) -#endif -PERL_CALLCONV void Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags); -#define PERL_ARGS_ASSERT_SV_UNREF_FLAGS \ - assert(ref) -PERL_CALLCONV void Perl_sv_untaint(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_UNTAINT \ - assert(sv) -PERL_CALLCONV void Perl_sv_upgrade(pTHX_ SV *const sv, svtype new_type); -#define PERL_ARGS_ASSERT_SV_UPGRADE \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_usepvn(pTHX_ SV* sv, char* ptr, STRLEN len); -#define PERL_ARGS_ASSERT_SV_USEPVN \ - assert(sv) -#endif -PERL_CALLCONV void Perl_sv_usepvn_flags(pTHX_ SV *const sv, char* ptr, const STRLEN len, const U32 flags); -#define PERL_ARGS_ASSERT_SV_USEPVN_FLAGS \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV void Perl_sv_usepvn_mg(pTHX_ SV *sv, char *ptr, STRLEN len); -#define PERL_ARGS_ASSERT_SV_USEPVN_MG \ - assert(sv) -#endif -PERL_CALLCONV bool Perl_sv_utf8_decode(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_UTF8_DECODE \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV bool Perl_sv_utf8_downgrade(pTHX_ SV *const sv, const bool fail_ok); -#define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE \ - assert(sv) -#endif -PERL_CALLCONV bool Perl_sv_utf8_downgrade_flags(pTHX_ SV *const sv, const bool fail_ok, const U32 flags); -#define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE_FLAGS \ - assert(sv) -/* PERL_CALLCONV bool sv_utf8_downgrade_nomg(pTHX_ SV *const sv, const bool fail_ok); */ -#define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE_NOMG -PERL_CALLCONV void Perl_sv_utf8_encode(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_UTF8_ENCODE \ - assert(sv) -#ifndef NO_MATHOMS -PERL_CALLCONV STRLEN Perl_sv_utf8_upgrade(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE \ - assert(sv) -#endif -/* PERL_CALLCONV STRLEN sv_utf8_upgrade_flags(pTHX_ SV *const sv, const I32 flags); */ -#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS -PERL_CALLCONV STRLEN Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV *const sv, const I32 flags, STRLEN extra); -#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW \ - assert(sv) -/* PERL_CALLCONV STRLEN sv_utf8_upgrade_nomg(pTHX_ SV *sv); */ -#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_NOMG -#ifndef NO_MATHOMS -PERL_CALLCONV UV Perl_sv_uv(pTHX_ SV* sv) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_SV_UV \ - assert(sv) -#endif - -PERL_CALLCONV void Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args); -#define PERL_ARGS_ASSERT_SV_VCATPVF \ - assert(sv); assert(pat) -PERL_CALLCONV void Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args); -#define PERL_ARGS_ASSERT_SV_VCATPVF_MG \ - assert(sv); assert(pat) -PERL_CALLCONV void Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen, va_list *const args, SV **const svargs, const Size_t sv_count, bool *const maybe_tainted); -#define PERL_ARGS_ASSERT_SV_VCATPVFN \ - assert(sv); assert(pat) -PERL_CALLCONV void Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen, va_list *const args, SV **const svargs, const Size_t sv_count, bool *const maybe_tainted, const U32 flags); -#define PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS \ - assert(sv); assert(pat) -PERL_CALLCONV void Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args); -#define PERL_ARGS_ASSERT_SV_VSETPVF \ - assert(sv); assert(pat) -PERL_CALLCONV void Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args); -#define PERL_ARGS_ASSERT_SV_VSETPVF_MG \ - assert(sv); assert(pat) -PERL_CALLCONV void Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen, va_list *const args, SV **const svargs, const Size_t sv_count, bool *const maybe_tainted); -#define PERL_ARGS_ASSERT_SV_VSETPVFN \ - assert(sv); assert(pat) -PERL_CALLCONV void Perl_switch_to_global_locale(void); + +PERL_CALLCONV char * +Perl_sv_uni_display(pTHX_ SV *dsv, SV *ssv, STRLEN pvlim, UV flags) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_SV_UNI_DISPLAY \ + assert(dsv); assert(ssv) + +PERL_CALLCONV int +Perl_sv_unmagic(pTHX_ SV * const sv, const int type); +#define PERL_ARGS_ASSERT_SV_UNMAGIC \ + assert(sv) + +PERL_CALLCONV int +Perl_sv_unmagicext(pTHX_ SV * const sv, const int type, const MGVTBL *vtbl); +#define PERL_ARGS_ASSERT_SV_UNMAGICEXT \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_unref_flags(pTHX_ SV * const ref, const U32 flags); +#define PERL_ARGS_ASSERT_SV_UNREF_FLAGS \ + assert(ref) + +PERL_CALLCONV void +Perl_sv_untaint(pTHX_ SV * const sv); +#define PERL_ARGS_ASSERT_SV_UNTAINT \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_upgrade(pTHX_ SV * const sv, svtype new_type); +#define PERL_ARGS_ASSERT_SV_UPGRADE \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_usepvn_flags(pTHX_ SV * const sv, char *ptr, const STRLEN len, const U32 flags); +#define PERL_ARGS_ASSERT_SV_USEPVN_FLAGS \ + assert(sv) + +PERL_CALLCONV bool +Perl_sv_utf8_decode(pTHX_ SV * const sv); +#define PERL_ARGS_ASSERT_SV_UTF8_DECODE \ + assert(sv) + +PERL_CALLCONV bool +Perl_sv_utf8_downgrade_flags(pTHX_ SV * const sv, const bool fail_ok, const U32 flags); +#define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE_FLAGS \ + assert(sv) + +/* PERL_CALLCONV bool +sv_utf8_downgrade_nomg(pTHX_ SV * const sv, const bool fail_ok); */ + +PERL_CALLCONV void +Perl_sv_utf8_encode(pTHX_ SV * const sv); +#define PERL_ARGS_ASSERT_SV_UTF8_ENCODE \ + assert(sv) + +/* PERL_CALLCONV STRLEN +sv_utf8_upgrade_flags(pTHX_ SV * const sv, const I32 flags); */ + +PERL_CALLCONV STRLEN +Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV * const sv, const I32 flags, STRLEN extra); +#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW \ + assert(sv) + +/* PERL_CALLCONV STRLEN +sv_utf8_upgrade_nomg(pTHX_ SV *sv); */ + +PERL_CALLCONV void +Perl_sv_vcatpvf(pTHX_ SV * const sv, const char * const pat, va_list * const args); +#define PERL_ARGS_ASSERT_SV_VCATPVF \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_vcatpvf_mg(pTHX_ SV * const sv, const char * const pat, va_list * const args); +#define PERL_ARGS_ASSERT_SV_VCATPVF_MG \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_vcatpvfn(pTHX_ SV * const sv, const char * const pat, const STRLEN patlen, va_list * const args, SV ** const svargs, const Size_t sv_count, bool * const maybe_tainted); +#define PERL_ARGS_ASSERT_SV_VCATPVFN \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_vcatpvfn_flags(pTHX_ SV * const sv, const char * const pat, const STRLEN patlen, va_list * const args, SV ** const svargs, const Size_t sv_count, bool * const maybe_tainted, const U32 flags); +#define PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_vsetpvf(pTHX_ SV * const sv, const char * const pat, va_list * const args); +#define PERL_ARGS_ASSERT_SV_VSETPVF \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_vsetpvf_mg(pTHX_ SV * const sv, const char * const pat, va_list * const args); +#define PERL_ARGS_ASSERT_SV_VSETPVF_MG \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_vsetpvfn(pTHX_ SV * const sv, const char * const pat, const STRLEN patlen, va_list * const args, SV ** const svargs, const Size_t sv_count, bool * const maybe_tainted); +#define PERL_ARGS_ASSERT_SV_VSETPVFN \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_switch_to_global_locale(pTHX); #define PERL_ARGS_ASSERT_SWITCH_TO_GLOBAL_LOCALE -PERL_CALLCONV bool Perl_sync_locale(void); + +PERL_CALLCONV bool +Perl_sync_locale(pTHX); #define PERL_ARGS_ASSERT_SYNC_LOCALE -PERL_CALLCONV void Perl_sys_init(int* argc, char*** argv); -#define PERL_ARGS_ASSERT_SYS_INIT \ - assert(argc); assert(argv) -PERL_CALLCONV void Perl_sys_init3(int* argc, char*** argv, char*** env); -#define PERL_ARGS_ASSERT_SYS_INIT3 \ - assert(argc); assert(argv); assert(env) -PERL_CALLCONV void Perl_sys_term(void); + +PERL_CALLCONV void +Perl_sys_init(int *argc, char ***argv); +#define PERL_ARGS_ASSERT_SYS_INIT \ + assert(argc); assert(argv) + +PERL_CALLCONV void +Perl_sys_init3(int *argc, char ***argv, char ***env); +#define PERL_ARGS_ASSERT_SYS_INIT3 \ + assert(argc); assert(argv); assert(env) + +PERL_CALLCONV void +Perl_sys_term(void); #define PERL_ARGS_ASSERT_SYS_TERM -PERL_CALLCONV void Perl_taint_env(pTHX); + +PERL_CALLCONV void +Perl_taint_env(pTHX); #define PERL_ARGS_ASSERT_TAINT_ENV -PERL_CALLCONV void Perl_taint_proper(pTHX_ const char* f, const char *const s); -#define PERL_ARGS_ASSERT_TAINT_PROPER \ - assert(s) -PERL_CALLCONV void Perl_thread_locale_init(void); + +PERL_CALLCONV void +Perl_taint_proper(pTHX_ const char *f, const char * const s); +#define PERL_ARGS_ASSERT_TAINT_PROPER \ + assert(s) + +PERL_CALLCONV void +Perl_thread_locale_init(pTHX); #define PERL_ARGS_ASSERT_THREAD_LOCALE_INIT -PERL_CALLCONV void Perl_thread_locale_term(void); + +PERL_CALLCONV void +Perl_thread_locale_term(pTHX); #define PERL_ARGS_ASSERT_THREAD_LOCALE_TERM -PERL_CALLCONV OP * Perl_tied_method(pTHX_ SV *methname, SV **sp, SV *const sv, const MAGIC *const mg, const U32 flags, U32 argc, ...); -#define PERL_ARGS_ASSERT_TIED_METHOD \ - assert(methname); assert(sp); assert(sv); assert(mg) -PERL_CALLCONV SSize_t Perl_tmps_grow_p(pTHX_ SSize_t ix); + +PERL_CALLCONV OP * +Perl_tied_method(pTHX_ SV *methname, SV **sp, SV * const sv, const MAGIC * const mg, const U32 flags, U32 argc, ...) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_TIED_METHOD \ + assert(methname); assert(sp); assert(sv); assert(mg) + +PERL_CALLCONV SSize_t +Perl_tmps_grow_p(pTHX_ SSize_t ix); #define PERL_ARGS_ASSERT_TMPS_GROW_P -/* PERL_CALLCONV UV to_uni_fold(pTHX_ UV c, U8 *p, STRLEN *lenp); */ -#define PERL_ARGS_ASSERT_TO_UNI_FOLD -PERL_CALLCONV UV Perl_to_uni_lower(pTHX_ UV c, U8 *p, STRLEN *lenp); -#define PERL_ARGS_ASSERT_TO_UNI_LOWER \ - assert(p); assert(lenp) -PERL_CALLCONV UV Perl_to_uni_title(pTHX_ UV c, U8 *p, STRLEN *lenp); -#define PERL_ARGS_ASSERT_TO_UNI_TITLE \ - assert(p); assert(lenp) -PERL_CALLCONV UV Perl_to_uni_upper(pTHX_ UV c, U8 *p, STRLEN *lenp); -#define PERL_ARGS_ASSERT_TO_UNI_UPPER \ - assert(p); assert(lenp) -PERL_CALLCONV bool Perl_try_amagic_bin(pTHX_ int method, int flags); + +/* PERL_CALLCONV UV +to_uni_fold(pTHX_ UV c, U8 *p, STRLEN *lenp); */ + +PERL_CALLCONV UV +Perl_to_uni_lower(pTHX_ UV c, U8 *p, STRLEN *lenp); +#define PERL_ARGS_ASSERT_TO_UNI_LOWER \ + assert(p); assert(lenp) + +PERL_CALLCONV UV +Perl_to_uni_title(pTHX_ UV c, U8 *p, STRLEN *lenp); +#define PERL_ARGS_ASSERT_TO_UNI_TITLE \ + assert(p); assert(lenp) + +PERL_CALLCONV UV +Perl_to_uni_upper(pTHX_ UV c, U8 *p, STRLEN *lenp); +#define PERL_ARGS_ASSERT_TO_UNI_UPPER \ + assert(p); assert(lenp) + +PERL_CALLCONV bool +Perl_try_amagic_bin(pTHX_ int method, int flags); #define PERL_ARGS_ASSERT_TRY_AMAGIC_BIN -PERL_CALLCONV bool Perl_try_amagic_un(pTHX_ int method, int flags); + +PERL_CALLCONV bool +Perl_try_amagic_un(pTHX_ int method, int flags); #define PERL_ARGS_ASSERT_TRY_AMAGIC_UN -#ifndef NO_MATHOMS -PERL_CALLCONV SSize_t Perl_unpack_str(pTHX_ const char *pat, const char *patend, const char *s, const char *strbeg, const char *strend, char **new_s, I32 ocnt, U32 flags) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_UNPACK_STR \ - assert(pat); assert(patend); assert(s); assert(strend) -#endif -PERL_CALLCONV SSize_t Perl_unpackstring(pTHX_ const char *pat, const char *patend, const char *s, const char *strend, U32 flags); -#define PERL_ARGS_ASSERT_UNPACKSTRING \ - assert(pat); assert(patend); assert(s); assert(strend) -PERL_CALLCONV void Perl_unshare_hek(pTHX_ HEK* hek); +PERL_CALLCONV SSize_t +Perl_unpackstring(pTHX_ const char *pat, const char *patend, const char *s, const char *strend, U32 flags); +#define PERL_ARGS_ASSERT_UNPACKSTRING \ + assert(pat); assert(patend); assert(s); assert(strend) + +PERL_CALLCONV void +Perl_unshare_hek(pTHX_ HEK *hek); #define PERL_ARGS_ASSERT_UNSHARE_HEK -PERL_CALLCONV void Perl_unsharepvn(pTHX_ const char* sv, I32 len, U32 hash); + +PERL_CALLCONV void +Perl_unsharepvn(pTHX_ const char *sv, I32 len, U32 hash); #define PERL_ARGS_ASSERT_UNSHAREPVN -PERL_CALLCONV SV* Perl_upg_version(pTHX_ SV *ver, bool qv); -#define PERL_ARGS_ASSERT_UPG_VERSION \ - assert(ver) -PERL_CALLCONV U8* Perl_utf16_to_utf8(pTHX_ U8* p, U8 *d, Size_t bytelen, Size_t *newlen); -#define PERL_ARGS_ASSERT_UTF16_TO_UTF8 \ - assert(p); assert(d); assert(newlen) -PERL_CALLCONV U8* Perl_utf16_to_utf8_base(pTHX_ U8* p, U8 *d, Size_t bytelen, Size_t *newlen, const bool high, const bool low); -#define PERL_ARGS_ASSERT_UTF16_TO_UTF8_BASE \ - assert(p); assert(d); assert(newlen) -PERL_CALLCONV U8* Perl_utf16_to_utf8_reversed(pTHX_ U8* p, U8 *d, Size_t bytelen, Size_t *newlen); -#define PERL_ARGS_ASSERT_UTF16_TO_UTF8_REVERSED \ - assert(p); assert(d); assert(newlen) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE IV Perl_utf8_distance(pTHX_ const U8 *a, const U8 *b) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_UTF8_DISTANCE \ - assert(a); assert(b) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE U8* Perl_utf8_hop(const U8 *s, SSize_t off) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_UTF8_HOP \ - assert(s) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE U8* Perl_utf8_hop_back(const U8 *s, SSize_t off, const U8 *start) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_UTF8_HOP_BACK \ - assert(s); assert(start) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE U8* Perl_utf8_hop_forward(const U8 *s, SSize_t off, const U8 *end) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_UTF8_HOP_FORWARD \ - assert(s); assert(end) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE U8* Perl_utf8_hop_safe(const U8 *s, SSize_t off, const U8 *start, const U8 *end) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_UTF8_HOP_SAFE \ - assert(s); assert(start); assert(end) -#endif - -PERL_CALLCONV STRLEN Perl_utf8_length(pTHX_ const U8* s, const U8 *e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_UTF8_LENGTH \ - assert(s); assert(e) - -PERL_CALLCONV U8* Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *lenp); -#define PERL_ARGS_ASSERT_UTF8_TO_BYTES \ - assert(s); assert(lenp) -PERL_CALLCONV U8* Perl_utf8_to_utf16_base(pTHX_ U8* s, U8 *d, Size_t bytelen, Size_t *newlen, const bool high, const bool low); -#define PERL_ARGS_ASSERT_UTF8_TO_UTF16_BASE \ - assert(s); assert(d); assert(newlen) -#ifndef NO_MATHOMS -PERL_CALLCONV UV Perl_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_UTF8_TO_UVCHR \ - assert(s) -#endif - -PERL_CALLCONV UV Perl_utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen); -#define PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF \ - assert(s); assert(send) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE UV Perl_utf8_to_uvchr_buf_helper(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen); -#define PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF_HELPER \ - assert(s); assert(send) -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV UV Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_UTF8_TO_UVUNI \ - assert(s) -#endif - -PERL_CALLCONV UV Perl_utf8_to_uvuni_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_UTF8_TO_UVUNI_BUF \ - assert(s); assert(send) - -PERL_CALLCONV UV Perl_utf8n_to_uvchr(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags); -#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR \ - assert(s) -PERL_CALLCONV UV Perl_utf8n_to_uvchr_error(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 * errors); -#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR_ERROR \ - assert(s) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE UV Perl_utf8n_to_uvchr_msgs(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 * errors, AV ** msgs); -#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR_MSGS \ - assert(s) -#endif -#ifndef NO_MATHOMS -PERL_CALLCONV UV Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_UTF8N_TO_UVUNI \ - assert(s) -#endif - -PERL_CALLCONV void Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg); -#define PERL_ARGS_ASSERT_UTILIZE \ - assert(idop) -/* PERL_CALLCONV U8* uvchr_to_utf8(pTHX_ U8 *d, UV uv); */ -#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8 -/* PERL_CALLCONV U8* uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags); */ -#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8_FLAGS -/* PERL_CALLCONV U8* uvchr_to_utf8_flags_msgs(pTHX_ U8 *d, UV uv, UV flags, HV ** msgs); */ -#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8_FLAGS_MSGS -PERL_CALLCONV U8* Perl_uvoffuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags); -#define PERL_ARGS_ASSERT_UVOFFUNI_TO_UTF8_FLAGS \ - assert(d) -PERL_CALLCONV U8* Perl_uvoffuni_to_utf8_flags_msgs(pTHX_ U8 *d, UV input_uv, const UV flags, HV** msgs); -#define PERL_ARGS_ASSERT_UVOFFUNI_TO_UTF8_FLAGS_MSGS \ - assert(d) -PERL_CALLCONV U8* Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv); -#define PERL_ARGS_ASSERT_UVUNI_TO_UTF8 \ - assert(d) -#ifndef NO_MATHOMS -PERL_CALLCONV U8* Perl_uvuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_UVUNI_TO_UTF8_FLAGS \ - assert(d) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE UV Perl_valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVCHR \ - assert(s) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV UV Perl_valid_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVUNI \ - assert(s) -#endif - -PERL_CALLCONV bool Perl_validate_proto(pTHX_ SV *name, SV *proto, bool warn, bool curstash); -#define PERL_ARGS_ASSERT_VALIDATE_PROTO \ - assert(name) -PERL_CALLCONV int Perl_vcmp(pTHX_ SV *lhv, SV *rhv); -#define PERL_ARGS_ASSERT_VCMP \ - assert(lhv); assert(rhv) -PERL_CALLCONV_NO_RET void Perl_vcroak(pTHX_ const char* pat, va_list* args) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_VCROAK -PERL_CALLCONV void Perl_vdeb(pTHX_ const char* pat, va_list* args); -#define PERL_ARGS_ASSERT_VDEB \ - assert(pat) -PERL_CALLCONV char* Perl_vform(pTHX_ const char* pat, va_list* args); -#define PERL_ARGS_ASSERT_VFORM \ - assert(pat) -PERL_CALLCONV void Perl_vivify_defelem(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_VIVIFY_DEFELEM \ - assert(sv) -PERL_CALLCONV SV* Perl_vivify_ref(pTHX_ SV* sv, U32 to_what) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_VIVIFY_REF \ - assert(sv) - -PERL_CALLCONV void Perl_vload_module(pTHX_ U32 flags, SV* name, SV* ver, va_list* args); -#define PERL_ARGS_ASSERT_VLOAD_MODULE \ - assert(name) -PERL_CALLCONV SV* Perl_vmess(pTHX_ const char* pat, va_list* args); -#define PERL_ARGS_ASSERT_VMESS \ - assert(pat) -PERL_CALLCONV SV* Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_VNEWSVPVF \ - assert(pat) - -PERL_CALLCONV SV* Perl_vnormal(pTHX_ SV *vs); -#define PERL_ARGS_ASSERT_VNORMAL \ - assert(vs) -PERL_CALLCONV SV* Perl_vnumify(pTHX_ SV *vs); -#define PERL_ARGS_ASSERT_VNUMIFY \ - assert(vs) -PERL_CALLCONV SV* Perl_vstringify(pTHX_ SV *vs); -#define PERL_ARGS_ASSERT_VSTRINGIFY \ - assert(vs) -PERL_CALLCONV SV* Perl_vverify(pTHX_ SV *vs); -#define PERL_ARGS_ASSERT_VVERIFY \ - assert(vs) -PERL_CALLCONV void Perl_vwarn(pTHX_ const char* pat, va_list* args); -#define PERL_ARGS_ASSERT_VWARN \ - assert(pat) -PERL_CALLCONV void Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args); -#define PERL_ARGS_ASSERT_VWARNER \ - assert(pat) -PERL_CALLCONV I32 Perl_wait4pid(pTHX_ Pid_t pid, int* statusp, int flags); -#define PERL_ARGS_ASSERT_WAIT4PID \ - assert(statusp) -PERL_CALLCONV void Perl_warn(pTHX_ const char* pat, ...) - __attribute__format__(__printf__,pTHX_1,pTHX_2); -#define PERL_ARGS_ASSERT_WARN \ - assert(pat) - -PERL_CALLCONV void Perl_warn_sv(pTHX_ SV *baseex); -#define PERL_ARGS_ASSERT_WARN_SV \ - assert(baseex) -PERL_CALLCONV void Perl_warner(pTHX_ U32 err, const char* pat, ...) - __attribute__format__(__printf__,pTHX_2,pTHX_3); -#define PERL_ARGS_ASSERT_WARNER \ - assert(pat) +PERL_CALLCONV SV * +Perl_upg_version(pTHX_ SV *ver, bool qv); +#define PERL_ARGS_ASSERT_UPG_VERSION \ + assert(ver) + +PERL_CALLCONV U8 * +Perl_utf16_to_utf8(pTHX_ U8 *p, U8 *d, Size_t bytelen, Size_t *newlen); +#define PERL_ARGS_ASSERT_UTF16_TO_UTF8 \ + assert(p); assert(d); assert(newlen) + +PERL_CALLCONV U8 * +Perl_utf16_to_utf8_base(pTHX_ U8 *p, U8 *d, Size_t bytelen, Size_t *newlen, const bool high, const bool low); +#define PERL_ARGS_ASSERT_UTF16_TO_UTF8_BASE \ + assert(p); assert(d); assert(newlen) + +PERL_CALLCONV U8 * +Perl_utf16_to_utf8_reversed(pTHX_ U8 *p, U8 *d, Size_t bytelen, Size_t *newlen); +#define PERL_ARGS_ASSERT_UTF16_TO_UTF8_REVERSED \ + assert(p); assert(d); assert(newlen) + +PERL_CALLCONV STRLEN +Perl_utf8_length(pTHX_ const U8 *s0, const U8 *e) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_UTF8_LENGTH \ + assert(s0); assert(e) + +PERL_CALLCONV U8 * +Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *lenp); +#define PERL_ARGS_ASSERT_UTF8_TO_BYTES \ + assert(s); assert(lenp) + +PERL_CALLCONV U8 * +Perl_utf8_to_utf16_base(pTHX_ U8 *s, U8 *d, Size_t bytelen, Size_t *newlen, const bool high, const bool low); +#define PERL_ARGS_ASSERT_UTF8_TO_UTF16_BASE \ + assert(s); assert(d); assert(newlen) + +PERL_CALLCONV UV +Perl_utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen); +#define PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF \ + assert(s); assert(send) + +PERL_CALLCONV UV +Perl_utf8n_to_uvchr(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags); +#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR \ + assert(s) + +PERL_CALLCONV UV +Perl_utf8n_to_uvchr_error(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 *errors); +#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR_ERROR \ + assert(s) + +PERL_CALLCONV void +Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_UTILIZE \ + assert(idop) + +/* PERL_CALLCONV U8 * +uvchr_to_utf8(pTHX_ U8 *d, UV uv); */ + +/* PERL_CALLCONV U8 * +uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags); */ + +/* PERL_CALLCONV U8 * +uvchr_to_utf8_flags_msgs(pTHX_ U8 *d, UV uv, UV flags, HV **msgs); */ + +PERL_CALLCONV U8 * +Perl_uvoffuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags); +#define PERL_ARGS_ASSERT_UVOFFUNI_TO_UTF8_FLAGS \ + assert(d) + +PERL_CALLCONV U8 * +Perl_uvoffuni_to_utf8_flags_msgs(pTHX_ U8 *d, UV input_uv, const UV flags, HV **msgs); +#define PERL_ARGS_ASSERT_UVOFFUNI_TO_UTF8_FLAGS_MSGS \ + assert(d) + +PERL_CALLCONV U8 * +Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv); +#define PERL_ARGS_ASSERT_UVUNI_TO_UTF8 \ + assert(d) + +PERL_CALLCONV bool +Perl_validate_proto(pTHX_ SV *name, SV *proto, bool warn, bool curstash); +#define PERL_ARGS_ASSERT_VALIDATE_PROTO \ + assert(name) + +PERL_CALLCONV int +Perl_vcmp(pTHX_ SV *lhv, SV *rhv); +#define PERL_ARGS_ASSERT_VCMP \ + assert(lhv); assert(rhv) + +PERL_CALLCONV_NO_RET void +Perl_vcroak(pTHX_ const char *pat, va_list *args) + __attribute__noreturn__; +#define PERL_ARGS_ASSERT_VCROAK -PERL_CALLCONV I32 Perl_was_lvalue_sub(pTHX) - __attribute__warn_unused_result__; +PERL_CALLCONV void +Perl_vdeb(pTHX_ const char *pat, va_list *args); +#define PERL_ARGS_ASSERT_VDEB \ + assert(pat) + +PERL_CALLCONV char * +Perl_vform(pTHX_ const char *pat, va_list *args); +#define PERL_ARGS_ASSERT_VFORM \ + assert(pat) + +PERL_CALLCONV void +Perl_vivify_defelem(pTHX_ SV *sv); +#define PERL_ARGS_ASSERT_VIVIFY_DEFELEM \ + assert(sv) + +PERL_CALLCONV SV * +Perl_vivify_ref(pTHX_ SV *sv, U32 to_what) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_VIVIFY_REF \ + assert(sv) + +PERL_CALLCONV void +Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args); +#define PERL_ARGS_ASSERT_VLOAD_MODULE \ + assert(name) + +PERL_CALLCONV SV * +Perl_vmess(pTHX_ const char *pat, va_list *args); +#define PERL_ARGS_ASSERT_VMESS \ + assert(pat) + +PERL_CALLCONV SV * +Perl_vnewSVpvf(pTHX_ const char * const pat, va_list * const args) + __attribute__warn_unused_result__; +#define PERL_ARGS_ASSERT_VNEWSVPVF \ + assert(pat) + +PERL_CALLCONV SV * +Perl_vnormal(pTHX_ SV *vs); +#define PERL_ARGS_ASSERT_VNORMAL \ + assert(vs) + +PERL_CALLCONV SV * +Perl_vnumify(pTHX_ SV *vs); +#define PERL_ARGS_ASSERT_VNUMIFY \ + assert(vs) + +PERL_CALLCONV SV * +Perl_vstringify(pTHX_ SV *vs); +#define PERL_ARGS_ASSERT_VSTRINGIFY \ + assert(vs) + +PERL_CALLCONV SV * +Perl_vverify(pTHX_ SV *vs); +#define PERL_ARGS_ASSERT_VVERIFY \ + assert(vs) + +PERL_CALLCONV void +Perl_vwarn(pTHX_ const char *pat, va_list *args); +#define PERL_ARGS_ASSERT_VWARN \ + assert(pat) + +PERL_CALLCONV void +Perl_vwarner(pTHX_ U32 err, const char *pat, va_list *args); +#define PERL_ARGS_ASSERT_VWARNER \ + assert(pat) + +PERL_CALLCONV I32 +Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_WAIT4PID \ + assert(statusp) + +PERL_CALLCONV void +Perl_warn(pTHX_ const char *pat, ...) + __attribute__format__(__printf__,pTHX_1,pTHX_2); +#define PERL_ARGS_ASSERT_WARN \ + assert(pat) + +PERL_CALLCONV void +Perl_warn_sv(pTHX_ SV *baseex); +#define PERL_ARGS_ASSERT_WARN_SV \ + assert(baseex) + +PERL_CALLCONV void +Perl_warner(pTHX_ U32 err, const char *pat, ...) + __attribute__format__(__printf__,pTHX_2,pTHX_3); +#define PERL_ARGS_ASSERT_WARNER \ + assert(pat) + +PERL_CALLCONV I32 +Perl_was_lvalue_sub(pTHX) + __attribute__warn_unused_result__; #define PERL_ARGS_ASSERT_WAS_LVALUE_SUB -PERL_CALLCONV void Perl_watch(pTHX_ char** addr); -#define PERL_ARGS_ASSERT_WATCH \ - assert(addr) -/* PERL_CALLCONV I32 whichsig(pTHX_ const char* sig); */ -#define PERL_ARGS_ASSERT_WHICHSIG -PERL_CALLCONV I32 Perl_whichsig_pv(pTHX_ const char* sig); -#define PERL_ARGS_ASSERT_WHICHSIG_PV \ - assert(sig) -PERL_CALLCONV I32 Perl_whichsig_pvn(pTHX_ const char* sig, STRLEN len); -#define PERL_ARGS_ASSERT_WHICHSIG_PVN \ - assert(sig) -PERL_CALLCONV I32 Perl_whichsig_sv(pTHX_ SV* sigsv); -#define PERL_ARGS_ASSERT_WHICHSIG_SV \ - assert(sigsv) -PERL_CALLCONV void Perl_wrap_keyword_plugin(pTHX_ Perl_keyword_plugin_t new_plugin, Perl_keyword_plugin_t *old_plugin_p); -#define PERL_ARGS_ASSERT_WRAP_KEYWORD_PLUGIN \ - assert(new_plugin); assert(old_plugin_p) -PERL_CALLCONV void Perl_wrap_op_checker(pTHX_ Optype opcode, Perl_check_t new_checker, Perl_check_t *old_checker_p); -#define PERL_ARGS_ASSERT_WRAP_OP_CHECKER \ - assert(new_checker); assert(old_checker_p) -PERL_CALLCONV void Perl_write_to_stderr(pTHX_ SV* msv); -#define PERL_ARGS_ASSERT_WRITE_TO_STDERR \ - assert(msv) -PERL_CALLCONV void Perl_xs_boot_epilog(pTHX_ const I32 ax); +PERL_CALLCONV void +Perl_watch(pTHX_ char **addr) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_WATCH \ + assert(addr) + +/* PERL_CALLCONV I32 +whichsig(pTHX_ const char *sig); */ + +PERL_CALLCONV I32 +Perl_whichsig_pv(pTHX_ const char *sig); +#define PERL_ARGS_ASSERT_WHICHSIG_PV \ + assert(sig) + +PERL_CALLCONV I32 +Perl_whichsig_pvn(pTHX_ const char *sig, STRLEN len); +#define PERL_ARGS_ASSERT_WHICHSIG_PVN \ + assert(sig) + +PERL_CALLCONV I32 +Perl_whichsig_sv(pTHX_ SV *sigsv); +#define PERL_ARGS_ASSERT_WHICHSIG_SV \ + assert(sigsv) + +PERL_CALLCONV void +Perl_wrap_infix_plugin(pTHX_ Perl_infix_plugin_t new_plugin, Perl_infix_plugin_t *old_plugin_p); +#define PERL_ARGS_ASSERT_WRAP_INFIX_PLUGIN \ + assert(new_plugin); assert(old_plugin_p) + +PERL_CALLCONV void +Perl_wrap_keyword_plugin(pTHX_ Perl_keyword_plugin_t new_plugin, Perl_keyword_plugin_t *old_plugin_p); +#define PERL_ARGS_ASSERT_WRAP_KEYWORD_PLUGIN \ + assert(new_plugin); assert(old_plugin_p) + +PERL_CALLCONV void +Perl_wrap_op_checker(pTHX_ Optype opcode, Perl_check_t new_checker, Perl_check_t *old_checker_p); +#define PERL_ARGS_ASSERT_WRAP_OP_CHECKER \ + assert(new_checker); assert(old_checker_p) + +PERL_CALLCONV void +Perl_write_to_stderr(pTHX_ SV *msv) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_WRITE_TO_STDERR \ + assert(msv) + +PERL_CALLCONV void +Perl_xs_boot_epilog(pTHX_ const I32 ax); #define PERL_ARGS_ASSERT_XS_BOOT_EPILOG -PERL_CALLCONV I32 Perl_xs_handshake(const U32 key, void * v_my_perl, const char * file, ...); -#define PERL_ARGS_ASSERT_XS_HANDSHAKE \ - assert(v_my_perl); assert(file) -PERL_CALLCONV int Perl_yyerror(pTHX_ const char *const s); -#define PERL_ARGS_ASSERT_YYERROR \ - assert(s) -PERL_CALLCONV int Perl_yyerror_pv(pTHX_ const char *const s, U32 flags); -#define PERL_ARGS_ASSERT_YYERROR_PV \ - assert(s) -PERL_CALLCONV int Perl_yyerror_pvn(pTHX_ const char *const s, STRLEN len, U32 flags); + +PERL_CALLCONV I32 +Perl_xs_handshake(const U32 key, void *v_my_perl, const char *file, ...); +#define PERL_ARGS_ASSERT_XS_HANDSHAKE \ + assert(v_my_perl); assert(file) + +PERL_CALLCONV int +Perl_yyerror(pTHX_ const char * const s) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_YYERROR \ + assert(s) + +PERL_CALLCONV int +Perl_yyerror_pv(pTHX_ const char * const s, U32 flags) + __attribute__visibility__("hidden"); +#define PERL_ARGS_ASSERT_YYERROR_PV \ + assert(s) + +PERL_CALLCONV int +Perl_yyerror_pvn(pTHX_ const char * const s, STRLEN len, U32 flags) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_YYERROR_PVN -PERL_CALLCONV int Perl_yylex(pTHX); + +PERL_CALLCONV int +Perl_yylex(pTHX); #define PERL_ARGS_ASSERT_YYLEX -PERL_CALLCONV int Perl_yyparse(pTHX_ int gramtype); + +PERL_CALLCONV int +Perl_yyparse(pTHX_ int gramtype) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_YYPARSE -PERL_CALLCONV void Perl_yyquit(pTHX); + +PERL_CALLCONV void +Perl_yyquit(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_YYQUIT -PERL_CALLCONV void Perl_yyunlex(pTHX); + +PERL_CALLCONV void +Perl_yyunlex(pTHX) + __attribute__visibility__("hidden"); #define PERL_ARGS_ASSERT_YYUNLEX -#if ! defined(HAS_MEMRCHR) && (defined(PERL_CORE) || defined(PERL_EXT)) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void * S_my_memrchr(const char * s, const char c, const STRLEN len); -#define PERL_ARGS_ASSERT_MY_MEMRCHR \ - assert(s) -#endif -#endif -#if !(!defined(PERL_EXT_RE_BUILD)) -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) -PERL_CALLCONV SV* Perl_get_re_gclass_nonbitmap_data(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp, SV **lonly_utf8_locale, SV **output_invlist); -#define PERL_ARGS_ASSERT_GET_RE_GCLASS_NONBITMAP_DATA \ - assert(node) -# endif -#endif -#if !(defined(DEBUGGING)) -# if !defined(NV_PRESERVES_UV) -# if defined(PERL_IN_SV_C) -STATIC int S_sv_2iuv_non_preserve(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE \ - assert(sv) -# endif -# endif -#endif -#if !(defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H)) -PERL_CALLCONV const char* Perl_langinfo(const int item); -#define PERL_ARGS_ASSERT_PERL_LANGINFO -#endif -#if !(defined(HAS_NL_LANGINFO)) -# if defined(PERL_IN_LOCALE_C) -STATIC const char* S_my_nl_langinfo(const int item, bool toggle); -#define PERL_ARGS_ASSERT_MY_NL_LANGINFO -# endif -#endif -#if !(defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION)) -PERL_CALLCONV bool Perl_do_exec(pTHX_ const char* cmd); -#define PERL_ARGS_ASSERT_DO_EXEC \ - assert(cmd) -#endif -#if !(defined(PERL_USE_3ARG_SIGHANDLER)) -PERL_CALLCONV Signal_t Perl_csighandler(int sig); -#define PERL_ARGS_ASSERT_CSIGHANDLER -PERL_CALLCONV Signal_t Perl_sighandler(int sig); -#define PERL_ARGS_ASSERT_SIGHANDLER -#endif -#if !(defined(_MSC_VER)) -PERL_CALLCONV_NO_RET int Perl_magic_regdatum_set(pTHX_ SV* sv, MAGIC* mg) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET \ - assert(sv); assert(mg) + +#if defined(DEBUGGING) +PERL_CALLCONV int +Perl_get_debug_opts(pTHX_ const char **s, bool givehelp) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_GET_DEBUG_OPTS \ + assert(s) + +PERL_CALLCONV void +Perl_hv_assert(pTHX_ HV *hv); +# define PERL_ARGS_ASSERT_HV_ASSERT \ + assert(hv) + +PERL_CALLCONV void +Perl_pad_setsv(pTHX_ PADOFFSET po, SV *sv); +# define PERL_ARGS_ASSERT_PAD_SETSV \ + assert(sv) + +PERL_CALLCONV SV * +Perl_pad_sv(pTHX_ PADOFFSET po); +# define PERL_ARGS_ASSERT_PAD_SV + +PERL_CALLCONV void +Perl_set_padlist(CV *cv, PADLIST *padlist); +# define PERL_ARGS_ASSERT_SET_PADLIST \ + assert(cv) + +#endif /* defined(DEBUGGING) */ +#if defined(DEBUG_LEAKING_SCALARS_FORK_DUMP) +PERL_CALLCONV void +Perl_dump_sv_child(pTHX_ SV *sv) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DUMP_SV_CHILD \ + assert(sv) #endif #if !defined(EBCDIC) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE unsigned int Perl_variant_byte_number(PERL_UINTMAX_T word) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_VARIANT_BYTE_NUMBER -#endif + +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE unsigned int +Perl_variant_byte_number(PERL_UINTMAX_T word) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_VARIANT_BYTE_NUMBER + +# endif +#endif +#if defined(F_FREESP) && !defined(HAS_CHSIZE) && !defined(HAS_TRUNCATE) +PERL_CALLCONV I32 +Perl_my_chsize(pTHX_ int fd, Off_t length) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MY_CHSIZE #endif #if !defined(HAS_GETENV_LEN) -PERL_CALLCONV char* Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len); -#define PERL_ARGS_ASSERT_GETENV_LEN \ - assert(env_elem); assert(len) -#endif -#if !defined(HAS_MKDIR) || !defined(HAS_RMDIR) -# if defined(PERL_IN_PP_SYS_C) -STATIC int S_dooneliner(pTHX_ const char *cmd, const char *filename) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOONELINER \ - assert(cmd); assert(filename) +PERL_CALLCONV char * +Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_GETENV_LEN \ + assert(env_elem); assert(len) -# endif #endif #if !defined(HAS_MKOSTEMP) -PERL_CALLCONV int Perl_my_mkostemp(char *templte, int flags); -#define PERL_ARGS_ASSERT_MY_MKOSTEMP \ - assert(templte) -#endif -#if !defined(HAS_MKSTEMP) -PERL_CALLCONV int Perl_my_mkstemp(char *templte); -#define PERL_ARGS_ASSERT_MY_MKSTEMP \ - assert(templte) -#endif -#if !defined(HAS_RENAME) -PERL_CALLCONV I32 Perl_same_dirent(pTHX_ const char* a, const char* b); -#define PERL_ARGS_ASSERT_SAME_DIRENT \ - assert(a); assert(b) -#endif -#if !defined(HAS_SIGNBIT) -PERL_CALLCONV int Perl_signbit(NV f) - __attribute__warn_unused_result__ - __attribute__pure__; -#define PERL_ARGS_ASSERT_PERL_SIGNBIT +PERL_CALLCONV int +Perl_my_mkostemp(char *templte, int flags) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MY_MKOSTEMP \ + assert(templte) #endif -#if !defined(HAS_STRLCAT) -PERL_CALLCONV Size_t Perl_my_strlcat(char *dst, const char *src, Size_t size); -#define PERL_ARGS_ASSERT_MY_STRLCAT -#endif -#if !defined(HAS_STRLCPY) -PERL_CALLCONV Size_t Perl_my_strlcpy(char *dst, const char *src, Size_t size); -#define PERL_ARGS_ASSERT_MY_STRLCPY -#endif -#if !defined(HAS_STRNLEN) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE Size_t Perl_my_strnlen(const char *str, Size_t maxlen); -#define PERL_ARGS_ASSERT_MY_STRNLEN \ - assert(str) -#endif -#endif -#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP) -PERL_CALLCONV I32 Perl_my_chsize(pTHX_ int fd, Off_t length) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MY_CHSIZE - -#endif -#if !defined(NV_PRESERVES_UV) -# if defined(DEBUGGING) -# if defined(PERL_IN_SV_C) -STATIC int S_sv_2iuv_non_preserve(pTHX_ SV *const sv, I32 numtype); -#define PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE \ - assert(sv) -# endif -# endif -#endif -#if !defined(PERL_DISABLE_PMC) -# if defined(PERL_IN_PP_CTL_C) -STATIC PerlIO * S_doopen_pm(pTHX_ SV *name) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOOPEN_PM \ - assert(name) - -# endif -#endif -#if !defined(PERL_EXT_RE_BUILD) -# if defined(PERL_IN_REGCOMP_C) -STATIC void S__append_range_to_invlist(pTHX_ SV* const invlist, const UV start, const UV end); -#define PERL_ARGS_ASSERT__APPEND_RANGE_TO_INVLIST \ - assert(invlist) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE UV* S__invlist_array_init(SV* const invlist, const bool will_have_0) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__INVLIST_ARRAY_INIT \ - assert(invlist) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE IV* S_get_invlist_previous_index_addr(SV* invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GET_INVLIST_PREVIOUS_INDEX_ADDR \ - assert(invlist) -#endif - -STATIC void S_initialize_invlist_guts(pTHX_ SV* invlist, const Size_t initial_size); -#define PERL_ARGS_ASSERT_INITIALIZE_INVLIST_GUTS \ - assert(invlist) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void S_invlist_clear(pTHX_ SV* invlist); -#define PERL_ARGS_ASSERT_INVLIST_CLEAR \ - assert(invlist) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE UV S_invlist_max(const SV* const invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_INVLIST_MAX \ - assert(invlist) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE IV S_invlist_previous_index(SV* const invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_INVLIST_PREVIOUS_INDEX \ - assert(invlist) -#endif - -STATIC void S_invlist_replace_list_destroys_src(pTHX_ SV *dest, SV *src); -#define PERL_ARGS_ASSERT_INVLIST_REPLACE_LIST_DESTROYS_SRC \ - assert(dest); assert(src) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void S_invlist_set_previous_index(SV* const invlist, const IV index); -#define PERL_ARGS_ASSERT_INVLIST_SET_PREVIOUS_INDEX \ - assert(invlist) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void S_invlist_trim(SV* invlist); -#define PERL_ARGS_ASSERT_INVLIST_TRIM \ - assert(invlist) -#endif -# endif -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) -PERL_CALLCONV SV* Perl_get_regclass_nonbitmap_data(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp, SV **lonly_utf8_locale, SV **output_invlist); -#define PERL_ARGS_ASSERT_GET_REGCLASS_NONBITMAP_DATA \ - assert(node) -# endif -#endif -#if !defined(PERL_IMPLICIT_SYS) -PERL_CALLCONV I32 Perl_my_pclose(pTHX_ PerlIO* ptr); -#define PERL_ARGS_ASSERT_MY_PCLOSE -PERL_CALLCONV PerlIO* Perl_my_popen(pTHX_ const char* cmd, const char* mode); -#define PERL_ARGS_ASSERT_MY_POPEN \ - assert(cmd); assert(mode) -#endif -#if !defined(PERL_IS_MINIPERL) -# if defined(PERL_IN_PERL_C) -STATIC SV * S_incpush_if_exists(pTHX_ AV *const av, SV *dir, SV *const stem); -#define PERL_ARGS_ASSERT_INCPUSH_IF_EXISTS \ - assert(av); assert(dir); assert(stem) -# endif -#endif -#if !defined(PERL_NO_INLINE_FUNCTIONS) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_popblock(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_POPBLOCK \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_popeval(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_POPEVAL \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_popformat(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_POPFORMAT \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_popgiven(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_POPGIVEN \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_poploop(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_POPLOOP \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_popsub(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_POPSUB \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_popsub_args(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_POPSUB_ARGS \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_popsub_common(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_POPSUB_COMMON \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_popwhen(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_POPWHEN \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE PERL_CONTEXT * Perl_cx_pushblock(pTHX_ U8 type, U8 gimme, SV** sp, I32 saveix); -#define PERL_ARGS_ASSERT_CX_PUSHBLOCK \ - assert(sp) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_pusheval(pTHX_ PERL_CONTEXT *cx, OP *retop, SV *namesv); -#define PERL_ARGS_ASSERT_CX_PUSHEVAL \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_pushformat(pTHX_ PERL_CONTEXT *cx, CV *cv, OP *retop, GV *gv); -#define PERL_ARGS_ASSERT_CX_PUSHFORMAT \ - assert(cx); assert(cv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_pushgiven(pTHX_ PERL_CONTEXT *cx, SV *orig_defsv); -#define PERL_ARGS_ASSERT_CX_PUSHGIVEN \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_pushloop_for(pTHX_ PERL_CONTEXT *cx, void *itervarp, SV *itersave); -#define PERL_ARGS_ASSERT_CX_PUSHLOOP_FOR \ - assert(cx); assert(itervarp) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_pushloop_plain(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_PUSHLOOP_PLAIN \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_pushsub(pTHX_ PERL_CONTEXT *cx, CV *cv, OP *retop, bool hasargs); -#define PERL_ARGS_ASSERT_CX_PUSHSUB \ - assert(cx); assert(cv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_pushtry(pTHX_ PERL_CONTEXT *cx, OP *retop); -#define PERL_ARGS_ASSERT_CX_PUSHTRY \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_pushwhen(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_PUSHWHEN \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void Perl_cx_topblock(pTHX_ PERL_CONTEXT *cx); -#define PERL_ARGS_ASSERT_CX_TOPBLOCK \ - assert(cx) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE U8 Perl_gimme_V(pTHX); -#define PERL_ARGS_ASSERT_GIMME_V -#endif -#endif -#if !defined(PERL_NO_UTF16_FILTER) -# if defined(PERL_IN_TOKE_C) -STATIC U8* S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed); -#define PERL_ARGS_ASSERT_ADD_UTF16_TEXTFILTER \ - assert(s) -STATIC I32 S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen); -#define PERL_ARGS_ASSERT_UTF16_TEXTFILTER \ - assert(sv) -# endif -#endif -#if !defined(PURIFY) -# if defined(PERL_IN_HV_C) -STATIC HE* S_new_he(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEW_HE - -# endif -#endif -#if !defined(SETUID_SCRIPTS_ARE_SECURE_NOW) -# if defined(PERL_IN_PERL_C) -STATIC void S_validate_suid(pTHX_ PerlIO *rsfp); -#define PERL_ARGS_ASSERT_VALIDATE_SUID \ - assert(rsfp) -# endif -#endif -#if !defined(USE_ITHREADS) -/* PERL_CALLCONV void CopFILEGV_set(pTHX_ COP * c, GV * gv); */ -#define PERL_ARGS_ASSERT_COPFILEGV_SET -#endif -#if !defined(WIN32) -PERL_CALLCONV bool Perl_do_exec3(pTHX_ const char *incmd, int fd, int do_report); -#define PERL_ARGS_ASSERT_DO_EXEC3 \ - assert(incmd) -#endif -#if 0 /* Not currently used, but may be needed in the future */ -# if defined(PERL_IN_UTF8_C) -STATIC void S_warn_on_first_deprecated_use(pTHX_ const char * const name, const char * const alternative, const bool use_locale, const char * const file, const unsigned line); -#define PERL_ARGS_ASSERT_WARN_ON_FIRST_DEPRECATED_USE \ - assert(name); assert(alternative); assert(file) -# endif -#endif -#if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET)) -PERL_CALLCONV int Perl_PerlSock_socketpair_cloexec(pTHX_ int domain, int type, int protocol, int *pairfd) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLSOCK_SOCKETPAIR_CLOEXEC \ - assert(pairfd) +#if !defined(HAS_MKSTEMP) +PERL_CALLCONV int +Perl_my_mkstemp(char *templte) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MY_MKSTEMP \ + assert(templte) #endif -#if defined(DEBUGGING) -PERL_CALLCONV int Perl_get_debug_opts(pTHX_ const char **s, bool givehelp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GET_DEBUG_OPTS \ - assert(s) - -PERL_CALLCONV void Perl_hv_assert(pTHX_ HV *hv); -#define PERL_ARGS_ASSERT_HV_ASSERT \ - assert(hv) -PERL_CALLCONV void Perl_pad_setsv(pTHX_ PADOFFSET po, SV* sv); -#define PERL_ARGS_ASSERT_PAD_SETSV \ - assert(sv) -PERL_CALLCONV SV* Perl_pad_sv(pTHX_ PADOFFSET po); -#define PERL_ARGS_ASSERT_PAD_SV -PERL_CALLCONV void Perl_set_padlist(CV * cv, PADLIST * padlist); -#define PERL_ARGS_ASSERT_SET_PADLIST \ - assert(cv) -# if defined(PERL_IN_LOCALE_C) -# if defined(USE_LOCALE) -STATIC void S_print_bytes_for_locale(pTHX_ const char * const s, const char * const e, const bool is_utf8); -#define PERL_ARGS_ASSERT_PRINT_BYTES_FOR_LOCALE \ - assert(s); assert(e) -STATIC void S_print_collxfrm_input_and_return(pTHX_ const char * const s, const char * const e, const STRLEN * const xlen, const bool is_utf8); -#define PERL_ARGS_ASSERT_PRINT_COLLXFRM_INPUT_AND_RETURN \ - assert(s); assert(e) -STATIC char * S_setlocale_debug_string(const int category, const char* const locale, const char* const retval) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SETLOCALE_DEBUG_STRING - -# endif -# endif -# if defined(PERL_IN_PAD_C) -STATIC void S_cv_dump(pTHX_ const CV *cv, const char *title); -#define PERL_ARGS_ASSERT_CV_DUMP \ - assert(cv); assert(title) -# endif -# if defined(PERL_IN_REGCOMP_C) -STATIC void S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV* widecharmap, AV *revcharmap, U32 depth); -#define PERL_ARGS_ASSERT_DUMP_TRIE \ - assert(trie); assert(revcharmap) -STATIC void S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie, HV* widecharmap, AV *revcharmap, U32 next_alloc, U32 depth); -#define PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST \ - assert(trie); assert(revcharmap) -STATIC void S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie, HV* widecharmap, AV *revcharmap, U32 next_alloc, U32 depth); -#define PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE \ - assert(trie); assert(revcharmap) -STATIC const regnode* S_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node, const regnode *last, const regnode *plast, SV* sv, I32 indent, U32 depth); -#define PERL_ARGS_ASSERT_DUMPUNTIL \ - assert(r); assert(start); assert(node); assert(sv) -STATIC bool S_put_charclass_bitmap_innards(pTHX_ SV* sv, char* bitmap, SV* nonbitmap_invlist, SV* only_utf8_locale_invlist, const regnode * const node, const U8 flags, const bool force_as_is_display); -#define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS \ - assert(sv) -STATIC SV* S_put_charclass_bitmap_innards_common(pTHX_ SV* invlist, SV* posixes, SV* only_utf8, SV* not_utf8, SV* only_utf8_locale, const bool invert); -#define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_COMMON \ - assert(invlist) -STATIC void S_put_charclass_bitmap_innards_invlist(pTHX_ SV *sv, SV* invlist); -#define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_INVLIST \ - assert(sv); assert(invlist) -STATIC void S_put_code_point(pTHX_ SV* sv, UV c); -#define PERL_ARGS_ASSERT_PUT_CODE_POINT \ - assert(sv) -STATIC void S_put_range(pTHX_ SV* sv, UV start, const UV end, const bool allow_literals); -#define PERL_ARGS_ASSERT_PUT_RANGE \ - assert(sv) -PERL_CALLCONV int Perl_re_indentf(pTHX_ const char *fmt, U32 depth, ...); -#define PERL_ARGS_ASSERT_RE_INDENTF \ - assert(fmt) -STATIC void S_regdump_extflags(pTHX_ const char *lead, const U32 flags); -#define PERL_ARGS_ASSERT_REGDUMP_EXTFLAGS -STATIC void S_regdump_intflags(pTHX_ const char *lead, const U32 flags); -#define PERL_ARGS_ASSERT_REGDUMP_INTFLAGS -STATIC regnode_offset S_regnode_guts_debug(pTHX_ RExC_state_t *pRExC_state, const U8 op, const STRLEN extra_len); -#define PERL_ARGS_ASSERT_REGNODE_GUTS_DEBUG \ - assert(pRExC_state) -STATIC bool S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode_offset p, const regnode_offset val, U32 depth) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGTAIL_STUDY \ - assert(pRExC_state); assert(p); assert(val) - -# endif -# if defined(PERL_IN_REGEXEC_C) -STATIC void S_debug_start_match(pTHX_ const REGEXP *prog, const bool do_utf8, const char *start, const char *end, const char *blurb); -#define PERL_ARGS_ASSERT_DEBUG_START_MATCH \ - assert(prog); assert(start); assert(end); assert(blurb) -STATIC void S_dump_exec_pos(pTHX_ const char *locinput, const regnode *scan, const char *loc_regeol, const char *loc_bostr, const char *loc_reg_starttry, const bool do_utf8, const U32 depth); -#define PERL_ARGS_ASSERT_DUMP_EXEC_POS \ - assert(locinput); assert(scan); assert(loc_regeol); assert(loc_bostr); assert(loc_reg_starttry) -PERL_CALLCONV int Perl_re_exec_indentf(pTHX_ const char *fmt, U32 depth, ...); -#define PERL_ARGS_ASSERT_RE_EXEC_INDENTF \ - assert(fmt) -# endif -# if defined(PERL_IN_SV_C) -STATIC void S_del_sv(pTHX_ SV *p); -#define PERL_ARGS_ASSERT_DEL_SV \ - assert(p) -# endif -# if defined(PERL_IN_TOKE_C) -STATIC void S_printbuf(pTHX_ const char *const fmt, const char *const s) - __attribute__format__(__printf__,pTHX_1,0); -#define PERL_ARGS_ASSERT_PRINTBUF \ - assert(fmt); assert(s) - -STATIC int S_tokereport(pTHX_ I32 rv, const YYSTYPE* lvalp); -#define PERL_ARGS_ASSERT_TOKEREPORT \ - assert(lvalp) -# endif -#endif -#if defined(DEBUGGING) && defined(ENABLE_REGEX_SETS_DEBUGGING) -# if defined(PERL_IN_REGCOMP_C) -STATIC void S_dump_regex_sets_structures(pTHX_ RExC_state_t *pRExC_state, AV * stack, const IV fence, AV * fence_stack); -#define PERL_ARGS_ASSERT_DUMP_REGEX_SETS_STRUCTURES \ - assert(pRExC_state); assert(stack); assert(fence_stack) -# endif -#endif -#if defined(DEBUG_LEAKING_SCALARS_FORK_DUMP) -PERL_CALLCONV void Perl_dump_sv_child(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_DUMP_SV_CHILD \ - assert(sv) -#endif #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) -PERL_CALLCONV I32 Perl_do_ipcctl(pTHX_ I32 optype, SV** mark, SV** sp); -#define PERL_ARGS_ASSERT_DO_IPCCTL \ - assert(mark); assert(sp) -PERL_CALLCONV I32 Perl_do_ipcget(pTHX_ I32 optype, SV** mark, SV** sp); -#define PERL_ARGS_ASSERT_DO_IPCGET \ - assert(mark); assert(sp) -PERL_CALLCONV I32 Perl_do_msgrcv(pTHX_ SV** mark, SV** sp); -#define PERL_ARGS_ASSERT_DO_MSGRCV \ - assert(mark); assert(sp) -PERL_CALLCONV I32 Perl_do_msgsnd(pTHX_ SV** mark, SV** sp); -#define PERL_ARGS_ASSERT_DO_MSGSND \ - assert(mark); assert(sp) -PERL_CALLCONV I32 Perl_do_semop(pTHX_ SV** mark, SV** sp); -#define PERL_ARGS_ASSERT_DO_SEMOP \ - assert(mark); assert(sp) -PERL_CALLCONV I32 Perl_do_shmio(pTHX_ I32 optype, SV** mark, SV** sp); -#define PERL_ARGS_ASSERT_DO_SHMIO \ - assert(mark); assert(sp) -#endif -#if defined(HAS_NL_LANGINFO) -# if defined(PERL_IN_LOCALE_C) -STATIC const char* S_my_nl_langinfo(const nl_item item, bool toggle); -#define PERL_ARGS_ASSERT_MY_NL_LANGINFO -# endif -#endif +PERL_CALLCONV I32 +Perl_do_ipcctl(pTHX_ I32 optype, SV **mark, SV **sp) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DO_IPCCTL \ + assert(mark); assert(sp) + +PERL_CALLCONV I32 +Perl_do_ipcget(pTHX_ I32 optype, SV **mark, SV **sp) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DO_IPCGET \ + assert(mark); assert(sp) + +PERL_CALLCONV I32 +Perl_do_msgrcv(pTHX_ SV **mark, SV **sp) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DO_MSGRCV \ + assert(mark); assert(sp) + +PERL_CALLCONV I32 +Perl_do_msgsnd(pTHX_ SV **mark, SV **sp) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DO_MSGSND \ + assert(mark); assert(sp) + +PERL_CALLCONV I32 +Perl_do_semop(pTHX_ SV **mark, SV **sp) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DO_SEMOP \ + assert(mark); assert(sp) + +PERL_CALLCONV I32 +Perl_do_shmio(pTHX_ I32 optype, SV **mark, SV **sp) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DO_SHMIO \ + assert(mark); assert(sp) + +#endif /* defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) */ #if defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H) -PERL_CALLCONV const char* Perl_langinfo(const nl_item item); -#define PERL_ARGS_ASSERT_PERL_LANGINFO +PERL_CALLCONV const char * +Perl_langinfo(const nl_item item); +# define PERL_ARGS_ASSERT_PERL_LANGINFO + +PERL_CALLCONV const char * +Perl_langinfo8(const nl_item item, utf8ness_t *utf8ness); +# define PERL_ARGS_ASSERT_PERL_LANGINFO8 + +#else +PERL_CALLCONV const char * +Perl_langinfo(const int item); +# define PERL_ARGS_ASSERT_PERL_LANGINFO + +PERL_CALLCONV const char * +Perl_langinfo8(const int item, utf8ness_t *utf8ness); +# define PERL_ARGS_ASSERT_PERL_LANGINFO8 + #endif #if defined(HAS_PIPE) -PERL_CALLCONV int Perl_PerlProc_pipe_cloexec(pTHX_ int *pipefd) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLPROC_PIPE_CLOEXEC \ - assert(pipefd) +PERL_CALLCONV int +Perl_PerlProc_pipe_cloexec(pTHX_ int *pipefd) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_PERLPROC_PIPE_CLOEXEC \ + assert(pipefd) + +#endif +#if !defined(HAS_RENAME) +PERL_CALLCONV I32 +Perl_same_dirent(pTHX_ const char *a, const char *b) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_SAME_DIRENT \ + assert(a); assert(b) + +#endif +#if !defined(HAS_SIGNBIT) +PERL_CALLCONV int +Perl_signbit(NV f) + __attribute__warn_unused_result__ + __attribute__pure__; +# define PERL_ARGS_ASSERT_PERL_SIGNBIT #endif #if defined(HAS_SOCKET) -PERL_CALLCONV int Perl_PerlSock_accept_cloexec(pTHX_ int listenfd, struct sockaddr *addr, Sock_size_t *addrlen) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLSOCK_ACCEPT_CLOEXEC - -PERL_CALLCONV int Perl_PerlSock_socket_cloexec(pTHX_ int domain, int type, int protocol) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLSOCK_SOCKET_CLOEXEC +PERL_CALLCONV int +Perl_PerlSock_accept_cloexec(pTHX_ int listenfd, struct sockaddr *addr, Sock_size_t *addrlen) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_PERLSOCK_ACCEPT_CLOEXEC + +PERL_CALLCONV int +Perl_PerlSock_socket_cloexec(pTHX_ int domain, int type, int protocol) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_PERLSOCK_SOCKET_CLOEXEC + +#endif /* defined(HAS_SOCKET) */ +#if defined(HAS_SOCKETPAIR) || \ + ( defined(AF_INET) && defined(HAS_SOCKET) && defined(PF_INET) && \ + defined(SOCK_DGRAM) ) +PERL_CALLCONV int +Perl_PerlSock_socketpair_cloexec(pTHX_ int domain, int type, int protocol, int *pairfd) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_PERLSOCK_SOCKETPAIR_CLOEXEC \ + assert(pairfd) + +#endif +#if !defined(HAS_STRLCPY) +STATIC Size_t +Perl_my_strlcpy(char *dst, const char *src, Size_t size); +# define PERL_ARGS_ASSERT_MY_STRLCPY #endif #if defined(HAVE_INTERP_INTERN) -PERL_CALLCONV void Perl_sys_intern_clear(pTHX); -#define PERL_ARGS_ASSERT_SYS_INTERN_CLEAR -PERL_CALLCONV void Perl_sys_intern_init(pTHX); -#define PERL_ARGS_ASSERT_SYS_INTERN_INIT -# if defined(USE_ITHREADS) -PERL_CALLCONV void Perl_sys_intern_dup(pTHX_ struct interp_intern* src, struct interp_intern* dst); -#define PERL_ARGS_ASSERT_SYS_INTERN_DUP \ - assert(src); assert(dst) -# endif +PERL_CALLCONV void +Perl_sys_intern_clear(pTHX); +# define PERL_ARGS_ASSERT_SYS_INTERN_CLEAR + +PERL_CALLCONV void +Perl_sys_intern_init(pTHX); +# define PERL_ARGS_ASSERT_SYS_INTERN_INIT + +# if defined(USE_ITHREADS) +PERL_CALLCONV void +Perl_sys_intern_dup(pTHX_ struct interp_intern *src, struct interp_intern *dst); +# define PERL_ARGS_ASSERT_SYS_INTERN_DUP \ + assert(src); assert(dst) + +# endif +#endif /* defined(HAVE_INTERP_INTERN) */ +#if defined(_MSC_VER) +PERL_CALLCONV int +Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET \ + assert(sv); assert(mg) + +#else +PERL_CALLCONV_NO_RET int +Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg) + __attribute__noreturn__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET \ + assert(sv); assert(mg) + #endif #if defined(MULTIPLICITY) -PERL_CALLCONV_NO_RET void Perl_croak_nocontext(const char* pat, ...) - __attribute__noreturn__ - __attribute__format__null_ok__(__printf__,1,2); -#define PERL_ARGS_ASSERT_CROAK_NOCONTEXT - -PERL_CALLCONV void Perl_deb_nocontext(const char* pat, ...) - __attribute__format__(__printf__,1,2); -#define PERL_ARGS_ASSERT_DEB_NOCONTEXT \ - assert(pat) - -PERL_CALLCONV_NO_RET OP* Perl_die_nocontext(const char* pat, ...) - __attribute__noreturn__ - __attribute__format__null_ok__(__printf__,1,2); -#define PERL_ARGS_ASSERT_DIE_NOCONTEXT - -PERL_CALLCONV char* Perl_form_nocontext(const char* pat, ...) - __attribute__format__(__printf__,1,2); -#define PERL_ARGS_ASSERT_FORM_NOCONTEXT \ - assert(pat) - -#ifndef NO_MATHOMS -PERL_CALLCONV int Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...) - __attribute__deprecated__ - __attribute__format__(__printf__,2,3); -#define PERL_ARGS_ASSERT_FPRINTF_NOCONTEXT \ - assert(stream); assert(format) -#endif - -PERL_CALLCONV void Perl_load_module_nocontext(U32 flags, SV* name, SV* ver, ...); -#define PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT \ - assert(name) -PERL_CALLCONV SV* Perl_mess_nocontext(const char* pat, ...) - __attribute__format__(__printf__,1,2); -#define PERL_ARGS_ASSERT_MESS_NOCONTEXT \ - assert(pat) - -PERL_CALLCONV void* Perl_my_cxt_init(pTHX_ int *indexp, size_t size); -#define PERL_ARGS_ASSERT_MY_CXT_INIT \ - assert(indexp) -PERL_CALLCONV SV* Perl_newSVpvf_nocontext(const char *const pat, ...) - __attribute__format__(__printf__,1,2); -#define PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT \ - assert(pat) - -#ifndef NO_MATHOMS -PERL_CALLCONV int Perl_printf_nocontext(const char *format, ...) - __attribute__deprecated__ - __attribute__format__(__printf__,1,2); -#define PERL_ARGS_ASSERT_PRINTF_NOCONTEXT \ - assert(format) -#endif - -PERL_CALLCONV void Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...) - __attribute__format__(__printf__,2,3); -#define PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT \ - assert(sv); assert(pat) - -PERL_CALLCONV void Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...) - __attribute__format__(__printf__,2,3); -#define PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT \ - assert(sv); assert(pat) - -PERL_CALLCONV void Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...) - __attribute__format__(__printf__,2,3); -#define PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT \ - assert(sv); assert(pat) - -PERL_CALLCONV void Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...) - __attribute__format__(__printf__,2,3); -#define PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT \ - assert(sv); assert(pat) - -PERL_CALLCONV void Perl_warn_nocontext(const char* pat, ...) - __attribute__format__(__printf__,1,2); -#define PERL_ARGS_ASSERT_WARN_NOCONTEXT \ - assert(pat) - -PERL_CALLCONV void Perl_warner_nocontext(U32 err, const char* pat, ...) - __attribute__format__(__printf__,2,3); -#define PERL_ARGS_ASSERT_WARNER_NOCONTEXT \ - assert(pat) +PERL_CALLCONV_NO_RET void +Perl_croak_nocontext(const char *pat, ...) + __attribute__noreturn__ + __attribute__format__null_ok__(__printf__,1,2); +# define PERL_ARGS_ASSERT_CROAK_NOCONTEXT + +PERL_CALLCONV void +Perl_deb_nocontext(const char *pat, ...) + __attribute__format__(__printf__,1,2); +# define PERL_ARGS_ASSERT_DEB_NOCONTEXT \ + assert(pat) + +PERL_CALLCONV_NO_RET OP * +Perl_die_nocontext(const char *pat, ...) + __attribute__noreturn__ + __attribute__format__null_ok__(__printf__,1,2); +# define PERL_ARGS_ASSERT_DIE_NOCONTEXT + +PERL_CALLCONV char * +Perl_form_nocontext(const char *pat, ...) + __attribute__format__(__printf__,1,2); +# define PERL_ARGS_ASSERT_FORM_NOCONTEXT \ + assert(pat) + +PERL_CALLCONV void +Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...); +# define PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT \ + assert(name) + +PERL_CALLCONV SV * +Perl_mess_nocontext(const char *pat, ...) + __attribute__format__(__printf__,1,2); +# define PERL_ARGS_ASSERT_MESS_NOCONTEXT \ + assert(pat) + +PERL_CALLCONV void * +Perl_my_cxt_init(pTHX_ int *indexp, size_t size); +# define PERL_ARGS_ASSERT_MY_CXT_INIT \ + assert(indexp) + +PERL_CALLCONV SV * +Perl_newSVpvf_nocontext(const char * const pat, ...) + __attribute__format__(__printf__,1,2); +# define PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT \ + assert(pat) + +PERL_CALLCONV void +Perl_sv_catpvf_mg_nocontext(SV * const sv, const char * const pat, ...) + __attribute__format__(__printf__,2,3); +# define PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_catpvf_nocontext(SV * const sv, const char * const pat, ...) + __attribute__format__(__printf__,2,3); +# define PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_setpvf_mg_nocontext(SV * const sv, const char * const pat, ...) + __attribute__format__(__printf__,2,3); +# define PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_sv_setpvf_nocontext(SV * const sv, const char * const pat, ...) + __attribute__format__(__printf__,2,3); +# define PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT \ + assert(sv); assert(pat) + +PERL_CALLCONV void +Perl_warn_nocontext(const char *pat, ...) + __attribute__format__(__printf__,1,2); +# define PERL_ARGS_ASSERT_WARN_NOCONTEXT \ + assert(pat) + +PERL_CALLCONV void +Perl_warner_nocontext(U32 err, const char *pat, ...) + __attribute__format__(__printf__,2,3); +# define PERL_ARGS_ASSERT_WARNER_NOCONTEXT \ + assert(pat) -#endif +#endif /* defined(MULTIPLICITY) */ #if defined(MYMALLOC) -PERL_CALLCONV void Perl_dump_mstats(pTHX_ const char* s); -#define PERL_ARGS_ASSERT_DUMP_MSTATS \ - assert(s) -PERL_CALLCONV int Perl_get_mstats(pTHX_ perl_mstats_t *buf, int buflen, int level); -#define PERL_ARGS_ASSERT_GET_MSTATS \ - assert(buf) -PERL_CALLCONV MEM_SIZE Perl_malloc_good_size(size_t nbytes) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MALLOC_GOOD_SIZE - -PERL_CALLCONV MEM_SIZE Perl_malloced_size(void *p) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MALLOCED_SIZE \ - assert(p) +PERL_CALLCONV void +Perl_dump_mstats(pTHX_ const char *s); +# define PERL_ARGS_ASSERT_DUMP_MSTATS \ + assert(s) + +PERL_CALLCONV int +Perl_get_mstats(pTHX_ perl_mstats_t *buf, int buflen, int level); +# define PERL_ARGS_ASSERT_GET_MSTATS \ + assert(buf) + +PERL_CALLCONV MEM_SIZE +Perl_malloc_good_size(size_t nbytes) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MALLOC_GOOD_SIZE + +PERL_CALLCONV MEM_SIZE +Perl_malloced_size(void *p) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MALLOCED_SIZE \ + assert(p) + +#endif /* defined(MYMALLOC) */ +#if !defined(NO_MATHOMS) +PERL_CALLCONV bool +Perl_do_aexec(pTHX_ SV *really, SV **mark, SV **sp); +# define PERL_ARGS_ASSERT_DO_AEXEC \ + assert(mark); assert(sp) + +PERL_CALLCONV bool +Perl_do_open(pTHX_ GV *gv, const char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp); +# define PERL_ARGS_ASSERT_DO_OPEN \ + assert(gv); assert(name) + +PERL_CALLCONV GV * +Perl_gv_AVadd(pTHX_ GV *gv); +# define PERL_ARGS_ASSERT_GV_AVADD + +PERL_CALLCONV GV * +Perl_gv_HVadd(pTHX_ GV *gv); +# define PERL_ARGS_ASSERT_GV_HVADD + +PERL_CALLCONV GV * +Perl_gv_IOadd(pTHX_ GV *gv); +# define PERL_ARGS_ASSERT_GV_IOADD + +PERL_CALLCONV void +Perl_gv_efullname3(pTHX_ SV *sv, const GV *gv, const char *prefix); +# define PERL_ARGS_ASSERT_GV_EFULLNAME3 \ + assert(sv); assert(gv) + +PERL_CALLCONV GV * +Perl_gv_fetchmethod(pTHX_ HV *stash, const char *name); +# define PERL_ARGS_ASSERT_GV_FETCHMETHOD \ + assert(stash); assert(name) + +PERL_CALLCONV void +Perl_gv_fullname3(pTHX_ SV *sv, const GV *gv, const char *prefix); +# define PERL_ARGS_ASSERT_GV_FULLNAME3 \ + assert(sv); assert(gv) + +PERL_CALLCONV SV * +Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags); +# define PERL_ARGS_ASSERT_HV_DELETE \ + assert(key) + +PERL_CALLCONV SV * +Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash); +# define PERL_ARGS_ASSERT_HV_DELETE_ENT \ + assert(keysv) + +PERL_CALLCONV bool +Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_HV_EXISTS \ + assert(key) + +PERL_CALLCONV bool +Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_HV_EXISTS_ENT \ + assert(keysv) + +PERL_CALLCONV SV ** +Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval); +# define PERL_ARGS_ASSERT_HV_FETCH \ + assert(key) + +PERL_CALLCONV HE * +Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, U32 hash); +# define PERL_ARGS_ASSERT_HV_FETCH_ENT \ + assert(keysv) + +PERL_CALLCONV HE * +Perl_hv_iternext(pTHX_ HV *hv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_HV_ITERNEXT \ + assert(hv) + +PERL_CALLCONV void +Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how); +# define PERL_ARGS_ASSERT_HV_MAGIC \ + assert(hv) + +PERL_CALLCONV SV ** +Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash); +# define PERL_ARGS_ASSERT_HV_STORE + +PERL_CALLCONV HE * +Perl_hv_store_ent(pTHX_ HV *hv, SV *key, SV *val, U32 hash); +# define PERL_ARGS_ASSERT_HV_STORE_ENT + +PERL_CALLCONV SV ** +Perl_hv_store_flags(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash, int flags); +# define PERL_ARGS_ASSERT_HV_STORE_FLAGS + +PERL_CALLCONV char * +Perl_instr(const char *big, const char *little) + __attribute__warn_unused_result__ + __attribute__pure__; +# define PERL_ARGS_ASSERT_INSTR \ + assert(big); assert(little) + +PERL_CALLCONV STRLEN +Perl_is_utf8_char_buf(const U8 *buf, const U8 *buf_end); +# define PERL_ARGS_ASSERT_IS_UTF8_CHAR_BUF \ + assert(buf); assert(buf_end) + +PERL_CALLCONV bool +Perl_is_utf8_string_loc(const U8 *s, const STRLEN len, const U8 **ep); +# define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOC \ + assert(s); assert(ep) + +PERL_CALLCONV AV * +Perl_newAV(pTHX) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEWAV + +PERL_CALLCONV HV * +Perl_newHV(pTHX) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEWHV + +PERL_CALLCONV IO * +Perl_newIO(pTHX) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEWIO + +PERL_CALLCONV CV * +Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block); +# define PERL_ARGS_ASSERT_NEWSUB + +PERL_CALLCONV SV * +Perl_newSVsv(pTHX_ SV * const old) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEWSVSV + +PERL_CALLCONV void +Perl_save_freeop(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_SAVE_FREEOP + +PERL_CALLCONV void +Perl_save_freepv(pTHX_ char *pv); +# define PERL_ARGS_ASSERT_SAVE_FREEPV + +PERL_CALLCONV void +Perl_save_freesv(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SAVE_FREESV + +PERL_CALLCONV void +Perl_save_mortalizesv(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SAVE_MORTALIZESV \ + assert(sv) + +PERL_CALLCONV void +Perl_save_op(pTHX); +# define PERL_ARGS_ASSERT_SAVE_OP + +PERL_CALLCONV bool +Perl_sv_2bool(pTHX_ SV * const sv); +# define PERL_ARGS_ASSERT_SV_2BOOL \ + assert(sv) + +PERL_CALLCONV IV +Perl_sv_2iv(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SV_2IV \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_2pv(pTHX_ SV *sv, STRLEN *lp); +# define PERL_ARGS_ASSERT_SV_2PV \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_2pv_nolen(pTHX_ SV *sv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_2PV_NOLEN \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_2pvbyte(pTHX_ SV *sv, STRLEN * const lp); +# define PERL_ARGS_ASSERT_SV_2PVBYTE \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_2pvbyte_nolen(pTHX_ SV *sv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_2PVBYTE_NOLEN \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_2pvutf8(pTHX_ SV *sv, STRLEN * const lp); +# define PERL_ARGS_ASSERT_SV_2PVUTF8 \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_2pvutf8_nolen(pTHX_ SV *sv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_2PVUTF8_NOLEN \ + assert(sv) + +PERL_CALLCONV UV +Perl_sv_2uv(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SV_2UV \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_catpvn(pTHX_ SV *dsv, const char *sstr, STRLEN len); +# define PERL_ARGS_ASSERT_SV_CATPVN \ + assert(dsv); assert(sstr) + +PERL_CALLCONV void +Perl_sv_catpvn_mg(pTHX_ SV *dsv, const char *sstr, STRLEN len); +# define PERL_ARGS_ASSERT_SV_CATPVN_MG \ + assert(dsv); assert(sstr) + +PERL_CALLCONV void +Perl_sv_catsv(pTHX_ SV *dsv, SV *sstr); +# define PERL_ARGS_ASSERT_SV_CATSV \ + assert(dsv) + +PERL_CALLCONV void +Perl_sv_catsv_mg(pTHX_ SV *dsv, SV *sstr); +# define PERL_ARGS_ASSERT_SV_CATSV_MG \ + assert(dsv) + +PERL_CALLCONV void +Perl_sv_copypv(pTHX_ SV * const dsv, SV * const ssv); +# define PERL_ARGS_ASSERT_SV_COPYPV \ + assert(dsv); assert(ssv) + +PERL_CALLCONV I32 +Perl_sv_eq(pTHX_ SV *sv1, SV *sv2); +# define PERL_ARGS_ASSERT_SV_EQ + +PERL_CALLCONV void +Perl_sv_force_normal(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SV_FORCE_NORMAL \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_insert(pTHX_ SV * const bigstr, const STRLEN offset, const STRLEN len, const char * const little, const STRLEN littlelen); +# define PERL_ARGS_ASSERT_SV_INSERT \ + assert(bigstr); assert(little) + +PERL_CALLCONV SV * +Perl_sv_mortalcopy(pTHX_ SV * const oldsv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_MORTALCOPY + +PERL_CALLCONV void +Perl_sv_nolocking(pTHX_ SV *sv) + __attribute__deprecated__; +# define PERL_ARGS_ASSERT_SV_NOLOCKING + +PERL_CALLCONV void +Perl_sv_nounlocking(pTHX_ SV *sv) + __attribute__deprecated__; +# define PERL_ARGS_ASSERT_SV_NOUNLOCKING + +PERL_CALLCONV char * +Perl_sv_pv(pTHX_ SV *sv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_PV \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_pvbyte(pTHX_ SV *sv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_PVBYTE \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp); +# define PERL_ARGS_ASSERT_SV_PVN_FORCE \ + assert(sv) + +PERL_CALLCONV char * +Perl_sv_pvutf8(pTHX_ SV *sv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_PVUTF8 \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_setsv(pTHX_ SV *dsv, SV *ssv); +# define PERL_ARGS_ASSERT_SV_SETSV \ + assert(dsv) + +PERL_CALLCONV void +Perl_sv_taint(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SV_TAINT \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_unref(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SV_UNREF \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_usepvn(pTHX_ SV *sv, char *ptr, STRLEN len); +# define PERL_ARGS_ASSERT_SV_USEPVN \ + assert(sv) + +PERL_CALLCONV void +Perl_sv_usepvn_mg(pTHX_ SV *sv, char *ptr, STRLEN len); +# define PERL_ARGS_ASSERT_SV_USEPVN_MG \ + assert(sv) + +PERL_CALLCONV bool +Perl_sv_utf8_downgrade(pTHX_ SV * const sv, const bool fail_ok); +# define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE \ + assert(sv) + +PERL_CALLCONV STRLEN +Perl_sv_utf8_upgrade(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE \ + assert(sv) + +PERL_CALLCONV UV +Perl_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen) + __attribute__deprecated__; +# define PERL_ARGS_ASSERT_UTF8_TO_UVCHR \ + assert(s) + +PERL_CALLCONV UV +Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen) + __attribute__deprecated__; +# define PERL_ARGS_ASSERT_UTF8_TO_UVUNI \ + assert(s) + +PERL_CALLCONV UV +Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags) + __attribute__deprecated__; +# define PERL_ARGS_ASSERT_UTF8N_TO_UVUNI \ + assert(s) + +# if defined(PERL_DONT_CREATE_GVSV) +PERL_CALLCONV GV * +Perl_gv_SVadd(pTHX_ GV *gv); +# define PERL_ARGS_ASSERT_GV_SVADD + +# endif +# if defined(PERL_IN_MATHOMS_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PERLY_C) || defined(PERL_IN_TOKE_C) +PERL_CALLCONV OP * +Perl_ref(pTHX_ OP *o, I32 type); +# define PERL_ARGS_ASSERT_REF + +# endif +# if defined(USE_LOCALE_COLLATE) +PERL_CALLCONV char * +Perl_sv_collxfrm(pTHX_ SV * const sv, STRLEN * const nxp); +# define PERL_ARGS_ASSERT_SV_COLLXFRM \ + assert(sv); assert(nxp) -#endif +# endif +#endif /* !defined(NO_MATHOMS) */ #if defined(PERL_ANY_COW) -PERL_CALLCONV SV* Perl_sv_setsv_cow(pTHX_ SV* dsv, SV* ssv); -#define PERL_ARGS_ASSERT_SV_SETSV_COW \ - assert(ssv) +PERL_CALLCONV SV * +Perl_sv_setsv_cow(pTHX_ SV *dsv, SV *ssv); +# define PERL_ARGS_ASSERT_SV_SETSV_COW \ + assert(ssv) + #endif #if defined(PERL_CORE) -PERL_CALLCONV void Perl_opslab_force_free(pTHX_ OPSLAB *slab); -#define PERL_ARGS_ASSERT_OPSLAB_FORCE_FREE \ - assert(slab) -PERL_CALLCONV void Perl_opslab_free(pTHX_ OPSLAB *slab); -#define PERL_ARGS_ASSERT_OPSLAB_FREE \ - assert(slab) -PERL_CALLCONV void Perl_opslab_free_nopad(pTHX_ OPSLAB *slab); -#define PERL_ARGS_ASSERT_OPSLAB_FREE_NOPAD \ - assert(slab) -PERL_CALLCONV void Perl_parser_free_nexttoke_ops(pTHX_ yy_parser *parser, OPSLAB *slab); -#define PERL_ARGS_ASSERT_PARSER_FREE_NEXTTOKE_OPS \ - assert(parser); assert(slab) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool S_should_warn_nl(const char *pv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SHOULD_WARN_NL \ - assert(pv) -#endif - -# if defined(PERL_DEBUG_READONLY_OPS) -PERL_CALLCONV void Perl_Slab_to_ro(pTHX_ OPSLAB *slab); -#define PERL_ARGS_ASSERT_SLAB_TO_RO \ - assert(slab) -PERL_CALLCONV void Perl_Slab_to_rw(pTHX_ OPSLAB *const slab); -#define PERL_ARGS_ASSERT_SLAB_TO_RW \ - assert(slab) -# endif -#endif -#if defined(PERL_CORE) || defined (PERL_EXT) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool Perl_is_utf8_non_invariant_string(const U8* const s, STRLEN len) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_UTF8_NON_INVARIANT_STRING \ - assert(s) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE STRLEN S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp); -#define PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B \ - assert(sv); assert(pv) -#endif -#endif +PERL_CALLCONV void +Perl_opslab_force_free(pTHX_ OPSLAB *slab) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_OPSLAB_FORCE_FREE \ + assert(slab) + +PERL_CALLCONV void +Perl_opslab_free(pTHX_ OPSLAB *slab) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_OPSLAB_FREE \ + assert(slab) + +PERL_CALLCONV void +Perl_opslab_free_nopad(pTHX_ OPSLAB *slab) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_OPSLAB_FREE_NOPAD \ + assert(slab) + +PERL_CALLCONV void +Perl_parser_free_nexttoke_ops(pTHX_ yy_parser *parser, OPSLAB *slab) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_PARSER_FREE_NEXTTOKE_OPS \ + assert(parser); assert(slab) + +# if defined(PERL_DEBUG_READONLY_OPS) +PERL_CALLCONV void +Perl_Slab_to_ro(pTHX_ OPSLAB *slab); +# define PERL_ARGS_ASSERT_SLAB_TO_RO \ + assert(slab) + +PERL_CALLCONV void +Perl_Slab_to_rw(pTHX_ OPSLAB * const slab); +# define PERL_ARGS_ASSERT_SLAB_TO_RW \ + assert(slab) + +# endif /* defined(PERL_DEBUG_READONLY_OPS) */ +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE bool +S_should_warn_nl(const char *pv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SHOULD_WARN_NL \ + assert(pv) + +# endif +#endif /* defined(PERL_CORE) */ #if defined(PERL_CORE) || defined(PERL_EXT) -PERL_CALLCONV bool Perl_isSCRIPT_RUN(pTHX_ const U8 *s, const U8 *send, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISSCRIPT_RUN \ - assert(s); assert(send) - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE Size_t S_variant_under_utf8_count(const U8* const s, const U8* const e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_VARIANT_UNDER_UTF8_COUNT \ - assert(s); assert(e) -#endif +PERL_CALLCONV bool +Perl_isSCRIPT_RUN(pTHX_ const U8 *s, const U8 *send, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISSCRIPT_RUN \ + assert(s); assert(send) + +#endif /* defined(PERL_CORE) || defined(PERL_EXT) */ +#if defined(PERL_CORE) || defined(PERL_USE_VOLATILE_API) +PERL_CALLCONV void +Perl_finalize_optree(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_FINALIZE_OPTREE \ + assert(o) + +PERL_CALLCONV void +Perl_optimize_optree(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_OPTIMIZE_OPTREE \ + assert(o) -#endif -#if defined(PERL_CR_FILTER) -# if defined(PERL_IN_TOKE_C) -STATIC I32 S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen); -#define PERL_ARGS_ASSERT_CR_TEXTFILTER -STATIC void S_strip_return(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_STRIP_RETURN \ - assert(sv) -# endif -#endif +#endif /* defined(PERL_CORE) || defined(PERL_USE_VOLATILE_API) */ #if defined(PERL_DEBUG_READONLY_COW) -PERL_CALLCONV void Perl_sv_buf_to_ro(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SV_BUF_TO_RO \ - assert(sv) -# if defined(PERL_IN_SV_C) -STATIC void S_sv_buf_to_rw(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_SV_BUF_TO_RW \ - assert(sv) -# endif +PERL_CALLCONV void +Perl_sv_buf_to_ro(pTHX_ SV *sv) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_SV_BUF_TO_RO \ + assert(sv) + #endif #if defined(PERL_DEBUG_READONLY_OPS) -PERL_CALLCONV PADOFFSET Perl_op_refcnt_dec(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_OP_REFCNT_DEC \ - assert(o) -PERL_CALLCONV OP * Perl_op_refcnt_inc(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_OP_REFCNT_INC -#endif +PERL_CALLCONV PADOFFSET +Perl_op_refcnt_dec(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_OP_REFCNT_DEC \ + assert(o) + +PERL_CALLCONV OP * +Perl_op_refcnt_inc(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_OP_REFCNT_INC + +#endif /* defined(PERL_DEBUG_READONLY_OPS) */ #if defined(PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION) -PERL_CALLCONV bool Perl_do_exec(pTHX_ const char* cmd); -#define PERL_ARGS_ASSERT_DO_EXEC \ - assert(cmd) -#endif -#if defined(PERL_DONT_CREATE_GVSV) -#ifndef NO_MATHOMS -PERL_CALLCONV GV* Perl_gv_SVadd(pTHX_ GV *gv); -#define PERL_ARGS_ASSERT_GV_SVADD -#endif +PERL_CALLCONV bool +Perl_do_exec(pTHX_ const char *cmd) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DO_EXEC \ + assert(cmd) + +#else +PERL_CALLCONV bool +Perl_do_exec(pTHX_ const char *cmd) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DO_EXEC \ + assert(cmd) + #endif #if defined(PERL_IMPLICIT_SYS) -PERL_CALLCONV PerlInterpreter* perl_alloc_using(struct IPerlMem *ipM, struct IPerlMem *ipMS, struct IPerlMem *ipMP, struct IPerlEnv *ipE, struct IPerlStdIO *ipStd, struct IPerlLIO *ipLIO, struct IPerlDir *ipD, struct IPerlSock *ipS, struct IPerlProc *ipP); -#define PERL_ARGS_ASSERT_PERL_ALLOC_USING \ - assert(ipM); assert(ipMS); assert(ipMP); assert(ipE); assert(ipStd); assert(ipLIO); assert(ipD); assert(ipS); assert(ipP) -# if defined(USE_ITHREADS) -PERL_CALLCONV PerlInterpreter* perl_clone_using(PerlInterpreter *proto_perl, UV flags, struct IPerlMem* ipM, struct IPerlMem* ipMS, struct IPerlMem* ipMP, struct IPerlEnv* ipE, struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO, struct IPerlDir* ipD, struct IPerlSock* ipS, struct IPerlProc* ipP); -#define PERL_ARGS_ASSERT_PERL_CLONE_USING \ - assert(proto_perl); assert(ipM); assert(ipMS); assert(ipMP); assert(ipE); assert(ipStd); assert(ipLIO); assert(ipD); assert(ipS); assert(ipP) -# endif -#endif +PERL_CALLCONV PerlInterpreter * +perl_alloc_using(struct IPerlMem *ipM, struct IPerlMem *ipMS, struct IPerlMem *ipMP, struct IPerlEnv *ipE, struct IPerlStdIO *ipStd, struct IPerlLIO *ipLIO, struct IPerlDir *ipD, struct IPerlSock *ipS, struct IPerlProc *ipP); +# define PERL_ARGS_ASSERT_PERL_ALLOC_USING \ + assert(ipM); assert(ipMS); assert(ipMP); assert(ipE); assert(ipStd); \ + assert(ipLIO); assert(ipD); assert(ipS); assert(ipP) + +# if defined(USE_ITHREADS) +PERL_CALLCONV PerlInterpreter * +perl_clone_using(PerlInterpreter *proto_perl, UV flags, struct IPerlMem *ipM, struct IPerlMem *ipMS, struct IPerlMem *ipMP, struct IPerlEnv *ipE, struct IPerlStdIO *ipStd, struct IPerlLIO *ipLIO, struct IPerlDir *ipD, struct IPerlSock *ipS, struct IPerlProc *ipP); +# define PERL_ARGS_ASSERT_PERL_CLONE_USING \ + assert(proto_perl); assert(ipM); assert(ipMS); assert(ipMP); assert(ipE); \ + assert(ipStd); assert(ipLIO); assert(ipD); assert(ipS); assert(ipP) + +# endif +#else /* if !defined(PERL_IMPLICIT_SYS) */ +PERL_CALLCONV I32 +Perl_my_pclose(pTHX_ PerlIO *ptr); +# define PERL_ARGS_ASSERT_MY_PCLOSE + +PERL_CALLCONV PerlIO * +Perl_my_popen(pTHX_ const char *cmd, const char *mode); +# define PERL_ARGS_ASSERT_MY_POPEN \ + assert(cmd); assert(mode) + +#endif /* !defined(PERL_IMPLICIT_SYS) */ #if defined(PERL_IN_AV_C) -STATIC MAGIC* S_get_aux_mg(pTHX_ AV *av); -#define PERL_ARGS_ASSERT_GET_AUX_MG \ - assert(av) -#endif +STATIC MAGIC * +S_get_aux_mg(pTHX_ AV *av); +# define PERL_ARGS_ASSERT_GET_AUX_MG \ + assert(av) + +#endif +#if defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PAD_C) || defined(PERL_IN_PERLY_C) || \ + defined(PERL_IN_TOKE_C) +PERL_CALLCONV void +Perl_class_add_ADJUST(pTHX_ HV *stash, CV *cv); +# define PERL_ARGS_ASSERT_CLASS_ADD_ADJUST \ + assert(stash); assert(cv) + +PERL_CALLCONV void +Perl_class_add_field(pTHX_ HV *stash, PADNAME *pn); +# define PERL_ARGS_ASSERT_CLASS_ADD_FIELD \ + assert(stash); assert(pn) + +PERL_CALLCONV void +Perl_class_apply_attributes(pTHX_ HV *stash, OP *attrlist); +# define PERL_ARGS_ASSERT_CLASS_APPLY_ATTRIBUTES \ + assert(stash) + +PERL_CALLCONV void +Perl_class_apply_field_attributes(pTHX_ PADNAME *pn, OP *attrlist); +# define PERL_ARGS_ASSERT_CLASS_APPLY_FIELD_ATTRIBUTES \ + assert(pn) + +PERL_CALLCONV void +Perl_class_prepare_initfield_parse(pTHX); +# define PERL_ARGS_ASSERT_CLASS_PREPARE_INITFIELD_PARSE + +PERL_CALLCONV void +Perl_class_prepare_method_parse(pTHX_ CV *cv); +# define PERL_ARGS_ASSERT_CLASS_PREPARE_METHOD_PARSE \ + assert(cv) + +PERL_CALLCONV void +Perl_class_seal_stash(pTHX_ HV *stash); +# define PERL_ARGS_ASSERT_CLASS_SEAL_STASH \ + assert(stash) + +PERL_CALLCONV void +Perl_class_set_field_defop(pTHX_ PADNAME *pn, OPCODE defmode, OP *defop); +# define PERL_ARGS_ASSERT_CLASS_SET_FIELD_DEFOP \ + assert(pn); assert(defop) + +PERL_CALLCONV void +Perl_class_setup_stash(pTHX_ HV *stash); +# define PERL_ARGS_ASSERT_CLASS_SETUP_STASH \ + assert(stash) + +PERL_CALLCONV OP * +Perl_class_wrap_method_body(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_CLASS_WRAP_METHOD_BODY + +PERL_CALLCONV void +Perl_croak_kw_unless_class(pTHX_ const char *kw); +# define PERL_ARGS_ASSERT_CROAK_KW_UNLESS_CLASS \ + assert(kw) + +#endif /* defined(PERL_IN_CLASS_C) || defined(PERL_IN_OP_C) || + defined(PERL_IN_PAD_C) || defined(PERL_IN_PERLY_C) || + defined(PERL_IN_TOKE_C) */ #if defined(PERL_IN_DEB_C) -STATIC void S_deb_stack_n(pTHX_ SV** stack_base, I32 stack_min, I32 stack_max, I32 mark_min, I32 mark_max); -#define PERL_ARGS_ASSERT_DEB_STACK_N \ - assert(stack_base) +STATIC void +S_deb_stack_n(pTHX_ SV **stack_base, I32 stack_min, I32 stack_max, I32 mark_min, I32 mark_max); +# define PERL_ARGS_ASSERT_DEB_STACK_N \ + assert(stack_base) + #endif #if defined(PERL_IN_DOIO_C) -STATIC bool S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool not_implicit); -#define PERL_ARGS_ASSERT_ARGVOUT_FINAL \ - assert(mg); assert(io) -STATIC void S_exec_failed(pTHX_ const char *cmd, int fd, int do_report); -#define PERL_ARGS_ASSERT_EXEC_FAILED \ - assert(cmd) -STATIC bool S_ingroup(pTHX_ Gid_t testgid, bool effective) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_INGROUP - -STATIC bool S_openn_cleanup(pTHX_ GV *gv, IO *io, PerlIO *fp, char *mode, const char *oname, PerlIO *saveifp, PerlIO *saveofp, int savefd, char savetype, int writing, bool was_fdopen, const char *type, Stat_t *statbufp); -#define PERL_ARGS_ASSERT_OPENN_CLEANUP \ - assert(gv); assert(io); assert(mode); assert(oname) -STATIC IO * S_openn_setup(pTHX_ GV *gv, char *mode, PerlIO **saveifp, PerlIO **saveofp, int *savefd, char *savetype); -#define PERL_ARGS_ASSERT_OPENN_SETUP \ - assert(gv); assert(mode); assert(saveifp); assert(saveofp); assert(savefd); assert(savetype) -#endif +STATIC bool +S_argvout_final(pTHX_ MAGIC *mg, IO *io, bool is_explicit); +# define PERL_ARGS_ASSERT_ARGVOUT_FINAL \ + assert(mg); assert(io) + +STATIC void +S_exec_failed(pTHX_ const char *cmd, int fd, int do_report); +# define PERL_ARGS_ASSERT_EXEC_FAILED \ + assert(cmd) + +STATIC bool +S_ingroup(pTHX_ Gid_t testgid, bool effective) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_INGROUP + +STATIC bool +S_openn_cleanup(pTHX_ GV *gv, IO *io, PerlIO *fp, char *mode, const char *oname, PerlIO *saveifp, PerlIO *saveofp, int savefd, char savetype, int writing, bool was_fdopen, const char *type, Stat_t *statbufp); +# define PERL_ARGS_ASSERT_OPENN_CLEANUP \ + assert(gv); assert(io); assert(mode); assert(oname) + +STATIC IO * +S_openn_setup(pTHX_ GV *gv, char *mode, PerlIO **saveifp, PerlIO **saveofp, int *savefd, char *savetype); +# define PERL_ARGS_ASSERT_OPENN_SETUP \ + assert(gv); assert(mode); assert(saveifp); assert(saveofp); assert(savefd); \ + assert(savetype) + +#endif /* defined(PERL_IN_DOIO_C) */ #if defined(PERL_IN_DOOP_C) -STATIC Size_t S_do_trans_complex(pTHX_ SV * const sv, const OPtrans_map * const tbl) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DO_TRANS_COMPLEX \ - assert(sv); assert(tbl) - -STATIC Size_t S_do_trans_count(pTHX_ SV * const sv, const OPtrans_map * const tbl) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DO_TRANS_COUNT \ - assert(sv); assert(tbl) - -STATIC Size_t S_do_trans_count_invmap(pTHX_ SV * const sv, AV * const map) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DO_TRANS_COUNT_INVMAP \ - assert(sv); assert(map) - -STATIC Size_t S_do_trans_invmap(pTHX_ SV * const sv, AV * const map) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DO_TRANS_INVMAP \ - assert(sv); assert(map) - -STATIC Size_t S_do_trans_simple(pTHX_ SV * const sv, const OPtrans_map * const tbl) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DO_TRANS_SIMPLE \ - assert(sv); assert(tbl) +STATIC Size_t +S_do_trans_complex(pTHX_ SV * const sv, const OPtrans_map * const tbl) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DO_TRANS_COMPLEX \ + assert(sv); assert(tbl) + +STATIC Size_t +S_do_trans_count(pTHX_ SV * const sv, const OPtrans_map * const tbl) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DO_TRANS_COUNT \ + assert(sv); assert(tbl) + +STATIC Size_t +S_do_trans_count_invmap(pTHX_ SV * const sv, AV * const map) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DO_TRANS_COUNT_INVMAP \ + assert(sv); assert(map) + +STATIC Size_t +S_do_trans_invmap(pTHX_ SV * const sv, AV * const map) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DO_TRANS_INVMAP \ + assert(sv); assert(map) + +STATIC Size_t +S_do_trans_simple(pTHX_ SV * const sv, const OPtrans_map * const tbl) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DO_TRANS_SIMPLE \ + assert(sv); assert(tbl) + +#endif /* defined(PERL_IN_DOOP_C) */ +#if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || \ + defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) || \ + defined(PERL_IN_UTF8_C) + +PERL_CALLCONV SSize_t +Perl__invlist_search(SV * const invlist, const UV cp) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT__INVLIST_SEARCH \ + assert(invlist) + +#endif /* defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || + defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || + defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) || + defined(PERL_IN_UTF8_C) */ +#if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_REGCOMP_ANY) + +#endif +#if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C) +PERL_CALLCONV SV * +Perl__add_range_to_invlist(pTHX_ SV *invlist, UV start, UV end) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT__ADD_RANGE_TO_INVLIST + +/* PERL_CALLCONV void +_invlist_intersection(pTHX_ SV * const a, SV * const b, SV **i); */ + +PERL_CALLCONV void +Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV * const a, SV * const b, const bool complement_b, SV **i); +# define PERL_ARGS_ASSERT__INVLIST_INTERSECTION_MAYBE_COMPLEMENT_2ND \ + assert(b); assert(i) + +PERL_CALLCONV void +Perl__invlist_invert(pTHX_ SV * const invlist); +# define PERL_ARGS_ASSERT__INVLIST_INVERT \ + assert(invlist) + +/* PERL_CALLCONV void +_invlist_subtract(pTHX_ SV * const a, SV * const b, SV **result); */ + +/* PERL_CALLCONV void +_invlist_union(pTHX_ SV * const a, SV * const b, SV **output); */ + +PERL_CALLCONV void +Perl__invlist_union_maybe_complement_2nd(pTHX_ SV * const a, SV * const b, const bool complement_b, SV **output); +# define PERL_ARGS_ASSERT__INVLIST_UNION_MAYBE_COMPLEMENT_2ND \ + assert(b); assert(output) + +PERL_CALLCONV SV * +Perl__new_invlist(pTHX_ IV initial_size) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT__NEW_INVLIST + +PERL_CALLCONV SV * +Perl__setup_canned_invlist(pTHX_ const STRLEN size, const UV element0, UV **other_elements_ptr) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT__SETUP_CANNED_INVLIST \ + assert(other_elements_ptr) + +#endif /* defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || + defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C) */ +#if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \ + defined(PERL_IN_TOKE_C) +PERL_CALLCONV const char * +Perl_form_alien_digit_msg(pTHX_ const U8 which, const STRLEN valids_len, const char * const first_bad, const char * const send, const bool UTF, const bool braced) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_FORM_ALIEN_DIGIT_MSG \ + assert(first_bad); assert(send) + +PERL_CALLCONV bool +Perl_grok_bslash_c(pTHX_ const char source, U8 *result, const char **message, U32 *packed_warn) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GROK_BSLASH_C \ + assert(result); assert(message) + +PERL_CALLCONV bool +Perl_grok_bslash_o(pTHX_ char **s, const char * const send, UV *uv, const char **message, U32 *packed_warn, const bool strict, const bool allow_UV_MAX, const bool utf8) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GROK_BSLASH_O \ + assert(s); assert(send); assert(uv); assert(message) + +PERL_CALLCONV bool +Perl_grok_bslash_x(pTHX_ char **s, const char * const send, UV *uv, const char **message, U32 *packed_warn, const bool strict, const bool allow_UV_MAX, const bool utf8) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GROK_BSLASH_X \ + assert(s); assert(send); assert(uv); assert(message) + +#endif /* defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || + defined(PERL_IN_TOKE_C) */ +#if defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_REGCOMP_C) || \ + defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) +PERL_CALLCONV const char * +Perl_form_cp_too_large_msg(pTHX_ const U8 which, const char *string, const Size_t len, const UV cp) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_FORM_CP_TOO_LARGE_MSG #endif #if defined(PERL_IN_DUMP_C) -STATIC CV* S_deb_curcv(pTHX_ I32 ix); -#define PERL_ARGS_ASSERT_DEB_CURCV -STATIC void S_debprof(pTHX_ const OP *o); -#define PERL_ARGS_ASSERT_DEBPROF \ - assert(o) -STATIC SV* S_pm_description(pTHX_ const PMOP *pm); -#define PERL_ARGS_ASSERT_PM_DESCRIPTION \ - assert(pm) -STATIC UV S_sequence_num(pTHX_ const OP *o); -#define PERL_ARGS_ASSERT_SEQUENCE_NUM -#endif -#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_SCOPE_C) -PERL_CALLCONV void Perl_hv_kill_backrefs(pTHX_ HV *hv); -#define PERL_ARGS_ASSERT_HV_KILL_BACKREFS \ - assert(hv) -#endif +STATIC CV * +S_deb_curcv(pTHX_ I32 ix); +# define PERL_ARGS_ASSERT_DEB_CURCV + +STATIC void +S_debprof(pTHX_ const OP *o); +# define PERL_ARGS_ASSERT_DEBPROF \ + assert(o) + +STATIC SV * +S_pm_description(pTHX_ const PMOP *pm); +# define PERL_ARGS_ASSERT_PM_DESCRIPTION \ + assert(pm) + +STATIC UV +S_sequence_num(pTHX_ const OP *o); +# define PERL_ARGS_ASSERT_SEQUENCE_NUM + +#endif /* defined(PERL_IN_DUMP_C) */ +#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || \ + defined(PERL_IN_SCOPE_C) || defined(PERL_IN_SV_C) +PERL_CALLCONV void +Perl_hv_kill_backrefs(pTHX_ HV *hv) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_HV_KILL_BACKREFS \ + assert(hv) + +#endif +#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_REGCOMP_ANY) +PERL_CALLCONV void +Perl__invlist_dump(pTHX_ PerlIO *file, I32 level, const char * const indent, SV * const invlist); +# define PERL_ARGS_ASSERT__INVLIST_DUMP \ + assert(file); assert(indent); assert(invlist) + +#endif +#if defined(PERL_IN_GLOBALS_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PEEP_C) +PERL_CALLCONV OP * +Perl_ck_anoncode(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_ANONCODE \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_backtick(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_BACKTICK \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_bitop(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_BITOP \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_cmp(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_CMP \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_concat(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_CONCAT \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_defined(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_DEFINED \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_delete(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_DELETE \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_each(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_EACH \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_eof(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_EOF \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_eval(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_EVAL \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_exec(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_EXEC \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_exists(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_EXISTS \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_ftst(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_FTST \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_fun(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_FUN \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_glob(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_GLOB \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_grep(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_GREP \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_helemexistsor(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_HELEMEXISTSOR \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_index(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_INDEX \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_isa(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_ISA \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_join(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_JOIN \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_length(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_LENGTH \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_lfun(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_LFUN \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_listiob(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_LISTIOB \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_match(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_MATCH \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_method(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_METHOD \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_null(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_NULL \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_open(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_OPEN \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_prototype(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_PROTOTYPE \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_readline(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_READLINE \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_refassign(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_REFASSIGN \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_repeat(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_REPEAT \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_require(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_REQUIRE \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_return(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_RETURN \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_rfun(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_RFUN \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_rvconst(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_RVCONST \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_sassign(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_SASSIGN \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_select(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_SELECT \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_shift(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_SHIFT \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_smartmatch(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_SMARTMATCH \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_sort(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_SORT \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_spair(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_SPAIR \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_split(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_SPLIT \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_stringify(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_STRINGIFY \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_subr(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_SUBR \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_substr(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_SUBSTR \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_svconst(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_SVCONST \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_tell(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_TELL \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_trunc(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_TRUNC \ + assert(o) + +PERL_CALLCONV OP * +Perl_ck_trycatch(pTHX_ OP *o) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CK_TRYCATCH \ + assert(o) + +#endif /* defined(PERL_IN_GLOBALS_C) || defined(PERL_IN_OP_C) || + defined(PERL_IN_PEEP_C) */ #if defined(PERL_IN_GV_C) -STATIC bool S_find_default_stash(pTHX_ HV **stash, const char *name, STRLEN len, const U32 is_utf8, const I32 add, const svtype sv_type); -#define PERL_ARGS_ASSERT_FIND_DEFAULT_STASH \ - assert(stash); assert(name) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE GV* S_gv_fetchmeth_internal(pTHX_ HV* stash, SV* meth, const char* name, STRLEN len, I32 level, U32 flags); -#define PERL_ARGS_ASSERT_GV_FETCHMETH_INTERNAL -#endif -STATIC void S_gv_init_svtype(pTHX_ GV *gv, const svtype sv_type); -#define PERL_ARGS_ASSERT_GV_INIT_SVTYPE \ - assert(gv) -STATIC bool S_gv_is_in_main(pTHX_ const char *name, STRLEN len, const U32 is_utf8); -#define PERL_ARGS_ASSERT_GV_IS_IN_MAIN \ - assert(name) -STATIC bool S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, const svtype sv_type); -#define PERL_ARGS_ASSERT_GV_MAGICALIZE \ - assert(gv); assert(stash); assert(name) -STATIC void S_gv_magicalize_isa(pTHX_ GV *gv); -#define PERL_ARGS_ASSERT_GV_MAGICALIZE_ISA \ - assert(gv) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE HV* S_gv_stashpvn_internal(pTHX_ const char* name, U32 namelen, I32 flags); -#define PERL_ARGS_ASSERT_GV_STASHPVN_INTERNAL \ - assert(name) -#endif -STATIC void S_maybe_multimagic_gv(pTHX_ GV *gv, const char *name, const svtype sv_type); -#define PERL_ARGS_ASSERT_MAYBE_MULTIMAGIC_GV \ - assert(gv); assert(name) -STATIC bool S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name, STRLEN *len, const char *nambeg, STRLEN full_len, const U32 is_utf8, const I32 add); -#define PERL_ARGS_ASSERT_PARSE_GV_STASH_NAME \ - assert(stash); assert(gv); assert(name); assert(len); assert(nambeg) -STATIC void S_require_tie_mod(pTHX_ GV *gv, const char varname, const char * name, STRLEN len, const U32 flags); -#define PERL_ARGS_ASSERT_REQUIRE_TIE_MOD \ - assert(gv); assert(varname); assert(name) -#endif -#if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C) -PERL_CALLCONV void Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv); -#define PERL_ARGS_ASSERT_SV_ADD_BACKREF \ - assert(tsv); assert(sv) +STATIC bool +S_find_default_stash(pTHX_ HV **stash, const char *name, STRLEN len, const U32 is_utf8, const I32 add, const svtype sv_type); +# define PERL_ARGS_ASSERT_FIND_DEFAULT_STASH \ + assert(stash); assert(name) + +STATIC void +S_gv_init_svtype(pTHX_ GV *gv, const svtype sv_type); +# define PERL_ARGS_ASSERT_GV_INIT_SVTYPE \ + assert(gv) + +STATIC bool +S_gv_is_in_main(pTHX_ const char *name, STRLEN len, const U32 is_utf8); +# define PERL_ARGS_ASSERT_GV_IS_IN_MAIN \ + assert(name) + +STATIC bool +S_gv_magicalize(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, const svtype sv_type); +# define PERL_ARGS_ASSERT_GV_MAGICALIZE \ + assert(gv); assert(stash); assert(name) + +STATIC void +S_gv_magicalize_isa(pTHX_ GV *gv); +# define PERL_ARGS_ASSERT_GV_MAGICALIZE_ISA \ + assert(gv) + +STATIC void +S_maybe_multimagic_gv(pTHX_ GV *gv, const char *name, const svtype sv_type); +# define PERL_ARGS_ASSERT_MAYBE_MULTIMAGIC_GV \ + assert(gv); assert(name) + +STATIC bool +S_parse_gv_stash_name(pTHX_ HV **stash, GV **gv, const char **name, STRLEN *len, const char *nambeg, STRLEN full_len, const U32 is_utf8, const I32 add); +# define PERL_ARGS_ASSERT_PARSE_GV_STASH_NAME \ + assert(stash); assert(gv); assert(name); assert(len); assert(nambeg) + +STATIC void +S_require_tie_mod(pTHX_ GV *gv, const char varname, const char *name, STRLEN len, const U32 flags); +# define PERL_ARGS_ASSERT_REQUIRE_TIE_MOD \ + assert(gv); assert(varname); assert(name) + +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE GV * +S_gv_fetchmeth_internal(pTHX_ HV *stash, SV *meth, const char *name, STRLEN len, I32 level, U32 flags); +# define PERL_ARGS_ASSERT_GV_FETCHMETH_INTERNAL + +PERL_STATIC_INLINE HV * +S_gv_stashpvn_internal(pTHX_ const char *name, U32 namelen, I32 flags); +# define PERL_ARGS_ASSERT_GV_STASHPVN_INTERNAL \ + assert(name) + +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#endif /* defined(PERL_IN_GV_C) */ +#if defined(PERL_IN_GV_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PAD_C) || defined(PERL_IN_SV_C) +PERL_CALLCONV void +Perl_sv_add_backref(pTHX_ SV * const tsv, SV * const sv) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_SV_ADD_BACKREF \ + assert(tsv); assert(sv) + #endif #if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C) -PERL_CALLCONV HV* Perl_gv_stashsvpvn_cached(pTHX_ SV *namesv, const char* name, U32 namelen, I32 flags); +PERL_CALLCONV HV * +Perl_gv_stashsvpvn_cached(pTHX_ SV *namesv, const char *name, U32 namelen, I32 flags) + __attribute__visibility__("hidden"); + #endif #if defined(PERL_IN_HV_C) -STATIC void S_clear_placeholders(pTHX_ HV *hv, U32 items); -#define PERL_ARGS_ASSERT_CLEAR_PLACEHOLDERS \ - assert(hv) -STATIC void S_hsplit(pTHX_ HV *hv, STRLEN const oldsize, STRLEN newsize); -#define PERL_ARGS_ASSERT_HSPLIT \ - assert(hv) -STATIC struct xpvhv_aux* S_hv_auxinit(pTHX_ HV *hv); -#define PERL_ARGS_ASSERT_HV_AUXINIT \ - assert(hv) -STATIC SV* S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, int k_flags, I32 d_flags, U32 hash); -#define PERL_ARGS_ASSERT_HV_DELETE_COMMON -STATIC SV* S_hv_free_ent_ret(pTHX_ HE *entry); -#define PERL_ARGS_ASSERT_HV_FREE_ENT_RET \ - assert(entry) -STATIC void S_hv_free_entries(pTHX_ HV *hv); -#define PERL_ARGS_ASSERT_HV_FREE_ENTRIES \ - assert(hv) -STATIC void S_hv_magic_check(HV *hv, bool *needs_copy, bool *needs_store); -#define PERL_ARGS_ASSERT_HV_MAGIC_CHECK \ - assert(hv); assert(needs_copy); assert(needs_store) -PERL_STATIC_NO_RET void S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen, const char *msg) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_HV_NOTALLOWED \ - assert(key); assert(msg) - -STATIC SV * S_refcounted_he_value(pTHX_ const struct refcounted_he *he); -#define PERL_ARGS_ASSERT_REFCOUNTED_HE_VALUE \ - assert(he) -STATIC HEK* S_save_hek_flags(const char *str, I32 len, U32 hash, int flags) - __attribute__malloc__ - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SAVE_HEK_FLAGS \ - assert(str) - -STATIC HEK* S_share_hek_flags(pTHX_ const char *str, STRLEN len, U32 hash, int flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SHARE_HEK_FLAGS \ - assert(str) +STATIC void +S_clear_placeholders(pTHX_ HV *hv, U32 items); +# define PERL_ARGS_ASSERT_CLEAR_PLACEHOLDERS \ + assert(hv) + +STATIC void +S_hsplit(pTHX_ HV *hv, STRLEN const oldsize, STRLEN newsize); +# define PERL_ARGS_ASSERT_HSPLIT \ + assert(hv) + +STATIC struct xpvhv_aux * +S_hv_auxinit(pTHX_ HV *hv); +# define PERL_ARGS_ASSERT_HV_AUXINIT \ + assert(hv) + +STATIC SV * +S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, int k_flags, I32 d_flags, U32 hash); +# define PERL_ARGS_ASSERT_HV_DELETE_COMMON + +STATIC SV * +S_hv_free_ent_ret(pTHX_ HE *entry); +# define PERL_ARGS_ASSERT_HV_FREE_ENT_RET \ + assert(entry) + +STATIC void +S_hv_free_entries(pTHX_ HV *hv); +# define PERL_ARGS_ASSERT_HV_FREE_ENTRIES \ + assert(hv) + +STATIC void +S_hv_magic_check(HV *hv, bool *needs_copy, bool *needs_store); +# define PERL_ARGS_ASSERT_HV_MAGIC_CHECK \ + assert(hv); assert(needs_copy); assert(needs_store) + +PERL_STATIC_NO_RET void +S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen, const char *msg) + __attribute__noreturn__; +# define PERL_ARGS_ASSERT_HV_NOTALLOWED \ + assert(key); assert(msg) + +STATIC SV * +S_refcounted_he_value(pTHX_ const struct refcounted_he *he); +# define PERL_ARGS_ASSERT_REFCOUNTED_HE_VALUE \ + assert(he) + +STATIC HEK * +S_save_hek_flags(const char *str, I32 len, U32 hash, int flags) + __attribute__malloc__ + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SAVE_HEK_FLAGS \ + assert(str) + +STATIC HEK * +S_share_hek_flags(pTHX_ const char *str, STRLEN len, U32 hash, int flags) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SHARE_HEK_FLAGS \ + assert(str) + +STATIC void +S_unshare_hek_or_pvn(pTHX_ const HEK *hek, const char *str, I32 len, U32 hash); +# define PERL_ARGS_ASSERT_UNSHARE_HEK_OR_PVN + +# if !defined(PURIFY) +STATIC HE * +S_new_he(pTHX) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEW_HE -STATIC void S_unshare_hek_or_pvn(pTHX_ const HEK* hek, const char* str, I32 len, U32 hash); -#define PERL_ARGS_ASSERT_UNSHARE_HEK_OR_PVN -#endif +# endif +#endif /* defined(PERL_IN_HV_C) */ #if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C) -PERL_CALLCONV void Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av); -#define PERL_ARGS_ASSERT_SV_KILL_BACKREFS \ - assert(sv) +PERL_CALLCONV void +Perl_sv_kill_backrefs(pTHX_ SV * const sv, AV * const av) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_SV_KILL_BACKREFS \ + assert(sv) + #endif #if defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) -PERL_CALLCONV SV* Perl_hfree_next_entry(pTHX_ HV *hv, STRLEN *indexp); -#define PERL_ARGS_ASSERT_HFREE_NEXT_ENTRY \ - assert(hv); assert(indexp) +PERL_CALLCONV SV * +Perl_hfree_next_entry(pTHX_ HV *hv, STRLEN *indexp) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_HFREE_NEXT_ENTRY \ + assert(hv); assert(indexp) + #endif #if defined(PERL_IN_LOCALE_C) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE const char * S_save_to_buffer(const char * string, char **buf, Size_t *buf_size, const Size_t offset) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SAVE_TO_BUFFER \ - assert(buf_size) -#endif - -# if defined(USE_LOCALE) -STATIC const char* S_category_name(const int category); -#define PERL_ARGS_ASSERT_CATEGORY_NAME -STATIC void S_new_collate(pTHX_ const char* newcoll); -#define PERL_ARGS_ASSERT_NEW_COLLATE -STATIC void S_new_ctype(pTHX_ const char* newctype); -#define PERL_ARGS_ASSERT_NEW_CTYPE \ - assert(newctype) -STATIC void S_new_numeric(pTHX_ const char* newnum); -#define PERL_ARGS_ASSERT_NEW_NUMERIC -STATIC void S_restore_switched_locale(pTHX_ const int category, const char * const original_locale); -#define PERL_ARGS_ASSERT_RESTORE_SWITCHED_LOCALE -STATIC void S_set_numeric_radix(pTHX_ const bool use_locale); -#define PERL_ARGS_ASSERT_SET_NUMERIC_RADIX -STATIC char* S_stdize_locale(pTHX_ char* locs); -#define PERL_ARGS_ASSERT_STDIZE_LOCALE \ - assert(locs) -STATIC const char* S_switch_category_locale_to_template(pTHX_ const int switch_category, const int template_category, const char * template_locale); -#define PERL_ARGS_ASSERT_SWITCH_CATEGORY_LOCALE_TO_TEMPLATE -# if defined(USE_POSIX_2008_LOCALE) -STATIC const char* S_emulate_setlocale(const int category, const char* locale, unsigned int index, const bool is_index_valid); -#define PERL_ARGS_ASSERT_EMULATE_SETLOCALE -# endif -# if defined(WIN32) -STATIC char* S_win32_setlocale(pTHX_ int category, const char* locale); -#define PERL_ARGS_ASSERT_WIN32_SETLOCALE -# endif -# endif -#endif -#if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_MATHOMS_C) -# if defined(USE_LOCALE_COLLATE) -PERL_CALLCONV char* Perl__mem_collxfrm(pTHX_ const char* input_string, STRLEN len, STRLEN* xlen, bool utf8); -#define PERL_ARGS_ASSERT__MEM_COLLXFRM \ - assert(input_string); assert(xlen) -# endif -#endif +STATIC utf8ness_t +S_get_locale_string_utf8ness_i(pTHX_ const char *string, const locale_utf8ness_t known_utf8, const char *locale, const unsigned cat_index); +# define PERL_ARGS_ASSERT_GET_LOCALE_STRING_UTF8NESS_I + +STATIC bool +S_is_locale_utf8(pTHX_ const char *locale); +# define PERL_ARGS_ASSERT_IS_LOCALE_UTF8 \ + assert(locale) + +# if defined(HAS_LOCALECONV) +STATIC HV * +S_my_localeconv(pTHX_ const int item); +# define PERL_ARGS_ASSERT_MY_LOCALECONV + +STATIC void +S_populate_hash_from_localeconv(pTHX_ HV *hv, const char *locale, const U32 which_mask, const lconv_offset_t *strings[2], const lconv_offset_t *integers); +# define PERL_ARGS_ASSERT_POPULATE_HASH_FROM_LOCALECONV \ + assert(hv); assert(locale); assert(strings) + +# endif /* defined(HAS_LOCALECONV) */ +# if defined(USE_LOCALE) +STATIC unsigned int +S_get_category_index(const int category, const char *locale); +# define PERL_ARGS_ASSERT_GET_CATEGORY_INDEX + +STATIC int +S_get_category_index_nowarn(const int category); +# define PERL_ARGS_ASSERT_GET_CATEGORY_INDEX_NOWARN + +STATIC void +S_new_LC_ALL(pTHX_ const char *unused, bool force); +# define PERL_ARGS_ASSERT_NEW_LC_ALL + +STATIC void +S_restore_toggled_locale_i(pTHX_ const unsigned cat_index, const char *original_locale, const line_t caller_line); +# define PERL_ARGS_ASSERT_RESTORE_TOGGLED_LOCALE_I + +STATIC const char * +S_save_to_buffer(const char *string, const char **buf, Size_t *buf_size); +# define PERL_ARGS_ASSERT_SAVE_TO_BUFFER + +PERL_STATIC_NO_RET void +S_setlocale_failure_panic_i(pTHX_ const unsigned int cat_index, const char *current, const char *failed, const line_t caller_0_line, const line_t caller_1_line) + __attribute__noreturn__; +# define PERL_ARGS_ASSERT_SETLOCALE_FAILURE_PANIC_I \ + assert(failed) + +STATIC const char * +S_stdize_locale(pTHX_ const int category, const char *input_locale, const char **buf, Size_t *buf_size, line_t caller_line); +# define PERL_ARGS_ASSERT_STDIZE_LOCALE + +STATIC const char * +S_toggle_locale_i(pTHX_ const unsigned switch_cat_index, const char *new_locale, const line_t caller_line); +# define PERL_ARGS_ASSERT_TOGGLE_LOCALE_I \ + assert(new_locale) + +# if defined(DEBUGGING) +STATIC char * +S_my_setlocale_debug_string_i(pTHX_ const unsigned cat_index, const char *locale, const char *retval, const line_t line) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MY_SETLOCALE_DEBUG_STRING_I + +# endif +# if defined(HAS_NL_LANGINFO) || defined(HAS_NL_LANGINFO_L) +STATIC const char * +S_my_langinfo_i(pTHX_ const nl_item item, const unsigned int cat_index, const char *locale, const char **retbufp, Size_t *retbuf_sizep, utf8ness_t *utf8ness); +# define PERL_ARGS_ASSERT_MY_LANGINFO_I \ + assert(locale); assert(retbufp) + +# else +STATIC const char * +S_my_langinfo_i(pTHX_ const int item, const unsigned int cat_index, const char *locale, const char **retbufp, Size_t *retbuf_sizep, utf8ness_t *utf8ness); +# define PERL_ARGS_ASSERT_MY_LANGINFO_I \ + assert(locale); assert(retbufp) + +# endif +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE const char * +S_mortalized_pv_copy(pTHX_ const char * const pv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MORTALIZED_PV_COPY + +# endif +# if defined(USE_LOCALE_COLLATE) +STATIC void +S_new_collate(pTHX_ const char *newcoll, bool force); +# define PERL_ARGS_ASSERT_NEW_COLLATE \ + assert(newcoll) + +# if defined(DEBUGGING) +STATIC void +S_print_collxfrm_input_and_return(pTHX_ const char *s, const char *e, const char *xbuf, const STRLEN xlen, const bool is_utf8); +# define PERL_ARGS_ASSERT_PRINT_COLLXFRM_INPUT_AND_RETURN \ + assert(s); assert(e) + +# endif +# endif /* defined(USE_LOCALE_COLLATE) */ +# if defined(USE_LOCALE_CTYPE) +STATIC bool +S_is_codeset_name_UTF8(const char *name); +# define PERL_ARGS_ASSERT_IS_CODESET_NAME_UTF8 \ + assert(name) + +STATIC void +S_new_ctype(pTHX_ const char *newctype, bool force); +# define PERL_ARGS_ASSERT_NEW_CTYPE \ + assert(newctype) + +# endif /* defined(USE_LOCALE_CTYPE) */ +# if defined(USE_LOCALE_NUMERIC) +STATIC void +S_new_numeric(pTHX_ const char *newnum, bool force); +# define PERL_ARGS_ASSERT_NEW_NUMERIC \ + assert(newnum) + +# endif +# if defined(USE_PERL_SWITCH_LOCALE_CONTEXT) || defined(DEBUGGING) +STATIC const char * +S_get_LC_ALL_display(pTHX); +# define PERL_ARGS_ASSERT_GET_LC_ALL_DISPLAY + +# endif +# if defined(USE_POSIX_2008_LOCALE) +STATIC const char * +S_emulate_setlocale_i(pTHX_ const unsigned int index, const char *new_locale, const recalc_lc_all_t recalc_LC_ALL, const line_t line); +# define PERL_ARGS_ASSERT_EMULATE_SETLOCALE_I + +STATIC const char * +S_my_querylocale_i(pTHX_ const unsigned int index); +# define PERL_ARGS_ASSERT_MY_QUERYLOCALE_I + +STATIC const char * +S_setlocale_from_aggregate_LC_ALL(pTHX_ const char *locale, const line_t line); +# define PERL_ARGS_ASSERT_SETLOCALE_FROM_AGGREGATE_LC_ALL \ + assert(locale) + +STATIC locale_t +S_use_curlocale_scratch(pTHX); +# define PERL_ARGS_ASSERT_USE_CURLOCALE_SCRATCH + +# if defined(USE_QUERYLOCALE) +STATIC const char * +S_calculate_LC_ALL(pTHX_ const locale_t cur_obj); +# define PERL_ARGS_ASSERT_CALCULATE_LC_ALL + +# else +STATIC const char * +S_update_PL_curlocales_i(pTHX_ const unsigned int index, const char *new_locale, recalc_lc_all_t recalc_LC_ALL); +# define PERL_ARGS_ASSERT_UPDATE_PL_CURLOCALES_I \ + assert(new_locale) + +# endif +# elif defined(USE_LOCALE_THREADS) && \ + !defined(USE_THREAD_SAFE_LOCALE) && \ + !defined(USE_THREAD_SAFE_LOCALE_EMULATION) /* && + !defined(USE_POSIX_2008_LOCALE) */ +STATIC const char * +S_less_dicey_setlocale_r(pTHX_ const int category, const char *locale); +# define PERL_ARGS_ASSERT_LESS_DICEY_SETLOCALE_R + +STATIC void +S_less_dicey_void_setlocale_i(pTHX_ const unsigned cat_index, const char *locale, const line_t line); +# define PERL_ARGS_ASSERT_LESS_DICEY_VOID_SETLOCALE_I \ + assert(locale) + +# if 0 +STATIC bool +S_less_dicey_bool_setlocale_r(pTHX_ const int cat, const char *locale); +# define PERL_ARGS_ASSERT_LESS_DICEY_BOOL_SETLOCALE_R \ + assert(locale) + +# endif +# endif /* defined(USE_LOCALE_THREADS) && + !defined(USE_POSIX_2008_LOCALE) && + !defined(USE_THREAD_SAFE_LOCALE) && + !defined(USE_THREAD_SAFE_LOCALE_EMULATION) */ +# if !( defined(USE_POSIX_2008_LOCALE) && defined(USE_QUERYLOCALE) ) && \ + ( !defined(LC_ALL) || defined(USE_POSIX_2008_LOCALE) || \ + defined(WIN32) ) +STATIC const char * +S_calculate_LC_ALL(pTHX_ const char **individ_locales); +# define PERL_ARGS_ASSERT_CALCULATE_LC_ALL \ + assert(individ_locales) + +# endif +# if defined(WIN32) +STATIC wchar_t * +S_Win_byte_string_to_wstring(const UINT code_page, const char *byte_string); +# define PERL_ARGS_ASSERT_WIN_BYTE_STRING_TO_WSTRING + +STATIC char * +S_Win_wstring_to_byte_string(const UINT code_page, const wchar_t *wstring); +# define PERL_ARGS_ASSERT_WIN_WSTRING_TO_BYTE_STRING + +STATIC const char * +S_win32_setlocale(pTHX_ int category, const char *locale); +# define PERL_ARGS_ASSERT_WIN32_SETLOCALE + +STATIC const char * +S_wrap_wsetlocale(pTHX_ const int category, const char *locale); +# define PERL_ARGS_ASSERT_WRAP_WSETLOCALE + +# endif /* defined(WIN32) */ +# if defined(WIN32) || \ + ( defined(USE_POSIX_2008_LOCALE) && !defined(USE_QUERYLOCALE) ) +STATIC const char * +S_find_locale_from_environment(pTHX_ const unsigned int index); +# define PERL_ARGS_ASSERT_FIND_LOCALE_FROM_ENVIRONMENT + +# endif +# endif /* defined(USE_LOCALE) */ +# if defined(USE_POSIX_2008_LOCALE) || defined(DEBUGGING) +STATIC const char * +S_get_displayable_string(pTHX_ const char * const s, const char * const e, const bool is_utf8); +# define PERL_ARGS_ASSERT_GET_DISPLAYABLE_STRING \ + assert(s); assert(e) + +# endif +#endif /* defined(PERL_IN_LOCALE_C) */ #if defined(PERL_IN_MALLOC_C) -STATIC int S_adjust_size_and_find_bucket(size_t *nbytes_p); -#define PERL_ARGS_ASSERT_ADJUST_SIZE_AND_FIND_BUCKET \ - assert(nbytes_p) +STATIC int +S_adjust_size_and_find_bucket(size_t *nbytes_p); +# define PERL_ARGS_ASSERT_ADJUST_SIZE_AND_FIND_BUCKET \ + assert(nbytes_p) + #endif #if defined(PERL_IN_MG_C) -STATIC void S_fixup_errno_string(pTHX_ SV* sv); -#define PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING \ - assert(sv) -STATIC SV* S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags, int n, SV *val); -#define PERL_ARGS_ASSERT_MAGIC_METHCALL1 \ - assert(sv); assert(mg); assert(meth) -STATIC int S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, SV *meth); -#define PERL_ARGS_ASSERT_MAGIC_METHPACK \ - assert(sv); assert(mg); assert(meth) -STATIC void S_restore_magic(pTHX_ const void *p); -#define PERL_ARGS_ASSERT_RESTORE_MAGIC -STATIC void S_save_magic_flags(pTHX_ I32 mgs_ix, SV *sv, U32 flags); -#define PERL_ARGS_ASSERT_SAVE_MAGIC_FLAGS \ - assert(sv) -STATIC void S_unwind_handler_stack(pTHX_ const void *p); -#define PERL_ARGS_ASSERT_UNWIND_HANDLER_STACK -#endif +STATIC void +S_fixup_errno_string(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_FIXUP_ERRNO_STRING \ + assert(sv) + +STATIC SV * +S_magic_methcall1(pTHX_ SV *sv, const MAGIC *mg, SV *meth, U32 flags, int n, SV *val); +# define PERL_ARGS_ASSERT_MAGIC_METHCALL1 \ + assert(sv); assert(mg); assert(meth) + +STATIC int +S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, SV *meth); +# define PERL_ARGS_ASSERT_MAGIC_METHPACK \ + assert(sv); assert(mg); assert(meth) + +STATIC void +S_restore_magic(pTHX_ const void *p); +# define PERL_ARGS_ASSERT_RESTORE_MAGIC + +STATIC void +S_save_magic_flags(pTHX_ SSize_t mgs_ix, SV *sv, U32 flags); +# define PERL_ARGS_ASSERT_SAVE_MAGIC_FLAGS \ + assert(sv) + +STATIC void +S_unwind_handler_stack(pTHX_ const void *p); +# define PERL_ARGS_ASSERT_UNWIND_HANDLER_STACK + +#endif /* defined(PERL_IN_MG_C) */ #if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C) -PERL_CALLCONV bool Perl_translate_substr_offsets(STRLEN curlen, IV pos1_iv, bool pos1_is_uv, IV len_iv, bool len_is_uv, STRLEN *posp, STRLEN *lenp); -#define PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS \ - assert(posp); assert(lenp) +PERL_CALLCONV bool +Perl_translate_substr_offsets(STRLEN curlen, IV pos1_iv, bool pos1_is_uv, IV len_iv, bool len_is_uv, STRLEN *posp, STRLEN *lenp) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS \ + assert(posp); assert(lenp) + #endif #if defined(PERL_IN_MRO_C) -STATIC void S_mro_clean_isarev(pTHX_ HV * const isa, const char * const name, const STRLEN len, HV * const exceptions, U32 hash, U32 flags); -#define PERL_ARGS_ASSERT_MRO_CLEAN_ISAREV \ - assert(isa); assert(name) -STATIC void S_mro_gather_and_rename(pTHX_ HV * const stashes, HV * const seen_stashes, HV *stash, HV *oldstash, SV *namesv); -#define PERL_ARGS_ASSERT_MRO_GATHER_AND_RENAME \ - assert(stashes); assert(seen_stashes); assert(namesv) -STATIC AV* S_mro_get_linear_isa_dfs(pTHX_ HV* stash, U32 level); -#define PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA_DFS \ - assert(stash) -#endif +STATIC void +S_mro_clean_isarev(pTHX_ HV * const isa, const char * const name, const STRLEN len, HV * const exceptions, U32 hash, U32 flags); +# define PERL_ARGS_ASSERT_MRO_CLEAN_ISAREV \ + assert(isa); assert(name) + +STATIC void +S_mro_gather_and_rename(pTHX_ HV * const stashes, HV * const seen_stashes, HV *stash, HV *oldstash, SV *namesv); +# define PERL_ARGS_ASSERT_MRO_GATHER_AND_RENAME \ + assert(stashes); assert(seen_stashes); assert(namesv) + +STATIC AV * +S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level); +# define PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA_DFS \ + assert(stash) + +#endif /* defined(PERL_IN_MRO_C) */ #if defined(PERL_IN_NUMERIC_C) -STATIC void S_output_non_portable(pTHX_ const U8 shift); -#define PERL_ARGS_ASSERT_OUTPUT_NON_PORTABLE +STATIC void +S_output_non_portable(pTHX_ const U8 shift); +# define PERL_ARGS_ASSERT_OUTPUT_NON_PORTABLE + #endif #if defined(PERL_IN_OP_C) -STATIC void S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs); -#define PERL_ARGS_ASSERT_APPLY_ATTRS \ - assert(stash); assert(target) -STATIC void S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp); -#define PERL_ARGS_ASSERT_APPLY_ATTRS_MY \ - assert(stash); assert(target); assert(imopsp) -STATIC I32 S_assignment_type(pTHX_ const OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ASSIGNMENT_TYPE - -STATIC void S_bad_type_gv(pTHX_ I32 n, GV *gv, const OP *kid, const char *t); -#define PERL_ARGS_ASSERT_BAD_TYPE_GV \ - assert(gv); assert(kid); assert(t) -STATIC void S_bad_type_pv(pTHX_ I32 n, const char *t, const OP *o, const OP *kid); -#define PERL_ARGS_ASSERT_BAD_TYPE_PV \ - assert(t); assert(o); assert(kid) -STATIC void S_clear_special_blocks(pTHX_ const char *const fullname, GV *const gv, CV *const cv); -#define PERL_ARGS_ASSERT_CLEAR_SPECIAL_BLOCKS \ - assert(fullname); assert(gv); assert(cv) -STATIC void S_cop_free(pTHX_ COP *cop); -#define PERL_ARGS_ASSERT_COP_FREE \ - assert(cop) -STATIC OP * S_dup_attrlist(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_DUP_ATTRLIST \ - assert(o) -STATIC void S_finalize_op(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_FINALIZE_OP \ - assert(o) -STATIC void S_find_and_forget_pmops(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_FIND_AND_FORGET_PMOPS \ - assert(o) -STATIC OP* S_fold_constants(pTHX_ OP * const o); -#define PERL_ARGS_ASSERT_FOLD_CONSTANTS \ - assert(o) -STATIC OP* S_force_list(pTHX_ OP* arg, bool nullit); -#define PERL_ARGS_ASSERT_FORCE_LIST -STATIC void S_forget_pmop(pTHX_ PMOP *const o); -#define PERL_ARGS_ASSERT_FORGET_PMOP \ - assert(o) -STATIC void S_gen_constant_list(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_GEN_CONSTANT_LIST -STATIC void S_inplace_aassign(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_INPLACE_AASSIGN \ - assert(o) -STATIC bool S_is_handle_constructor(const OP *o, I32 numargs) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR \ - assert(o) - -STATIC OP* S_listkids(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_LISTKIDS -STATIC bool S_looks_like_bool(pTHX_ const OP* o); -#define PERL_ARGS_ASSERT_LOOKS_LIKE_BOOL \ - assert(o) -STATIC OP* S_modkids(pTHX_ OP *o, I32 type); -#define PERL_ARGS_ASSERT_MODKIDS -STATIC void S_move_proto_attr(pTHX_ OP **proto, OP **attrs, const GV *name, bool curstash); -#define PERL_ARGS_ASSERT_MOVE_PROTO_ATTR \ - assert(proto); assert(attrs); assert(name) -STATIC OP * S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp); -#define PERL_ARGS_ASSERT_MY_KID \ - assert(imopsp) -STATIC OP* S_newGIVWHENOP(pTHX_ OP* cond, OP *block, I32 enter_opcode, I32 leave_opcode, PADOFFSET entertarg); -#define PERL_ARGS_ASSERT_NEWGIVWHENOP \ - assert(block) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE OP* S_newMETHOP_internal(pTHX_ I32 type, I32 flags, OP* dynamic_meth, SV* const_meth); -#define PERL_ARGS_ASSERT_NEWMETHOP_INTERNAL -#endif -STATIC OP* S_new_logop(pTHX_ I32 type, I32 flags, OP **firstp, OP **otherp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEW_LOGOP \ - assert(firstp); assert(otherp) - -STATIC void S_no_bareword_allowed(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED \ - assert(o) -STATIC OP* S_no_fh_allowed(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NO_FH_ALLOWED \ - assert(o) - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE OP* S_op_integerize(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_OP_INTEGERIZE \ - assert(o) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE OP* S_op_std_init(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_OP_STD_INIT \ - assert(o) -#endif -STATIC void S_optimize_op(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_OPTIMIZE_OP \ - assert(o) -STATIC OP* S_pmtrans(pTHX_ OP* o, OP* expr, OP* repl); -#define PERL_ARGS_ASSERT_PMTRANS \ - assert(o); assert(expr); assert(repl) -STATIC bool S_process_special_blocks(pTHX_ I32 floor, const char *const fullname, GV *const gv, CV *const cv); -#define PERL_ARGS_ASSERT_PROCESS_SPECIAL_BLOCKS \ - assert(fullname); assert(gv); assert(cv) -STATIC OP* S_ref_array_or_hash(pTHX_ OP* cond); -#define PERL_ARGS_ASSERT_REF_ARRAY_OR_HASH -STATIC OP* S_refkids(pTHX_ OP* o, I32 type); -#define PERL_ARGS_ASSERT_REFKIDS -STATIC bool S_scalar_mod_type(const OP *o, I32 type) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SCALAR_MOD_TYPE - -STATIC OP* S_scalarboolean(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_SCALARBOOLEAN \ - assert(o) -STATIC OP* S_scalarkids(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_SCALARKIDS -STATIC OP* S_search_const(pTHX_ OP *o) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SEARCH_CONST \ - assert(o) - -STATIC void S_simplify_sort(pTHX_ OP *o); -#define PERL_ARGS_ASSERT_SIMPLIFY_SORT \ - assert(o) -STATIC OP* S_too_few_arguments_pv(pTHX_ OP *o, const char* name, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_TOO_FEW_ARGUMENTS_PV \ - assert(o); assert(name) - -STATIC OP* S_too_many_arguments_pv(pTHX_ OP *o, const char* name, U32 flags); -#define PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS_PV \ - assert(o); assert(name) -STATIC OP* S_traverse_op_tree(pTHX_ OP* top, OP* o); -#define PERL_ARGS_ASSERT_TRAVERSE_OP_TREE \ - assert(top); assert(o) -STATIC OP* S_voidnonfinal(pTHX_ OP* o); -#define PERL_ARGS_ASSERT_VOIDNONFINAL -# if defined(USE_ITHREADS) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void S_op_relocate_sv(pTHX_ SV** svp, PADOFFSET* targp); -#define PERL_ARGS_ASSERT_OP_RELOCATE_SV \ - assert(svp); assert(targp) -#endif -# endif +STATIC void +S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs); +# define PERL_ARGS_ASSERT_APPLY_ATTRS \ + assert(stash); assert(target) + +STATIC void +S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp); +# define PERL_ARGS_ASSERT_APPLY_ATTRS_MY \ + assert(stash); assert(target); assert(imopsp) + +STATIC I32 +S_assignment_type(pTHX_ const OP *o) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ASSIGNMENT_TYPE + +STATIC void +S_bad_type_gv(pTHX_ I32 n, GV *gv, const OP *kid, const char *t); +# define PERL_ARGS_ASSERT_BAD_TYPE_GV \ + assert(gv); assert(kid); assert(t) + +STATIC void +S_bad_type_pv(pTHX_ I32 n, const char *t, const OP *o, const OP *kid); +# define PERL_ARGS_ASSERT_BAD_TYPE_PV \ + assert(t); assert(o); assert(kid) + +STATIC void +S_clear_special_blocks(pTHX_ const char * const fullname, GV * const gv, CV * const cv); +# define PERL_ARGS_ASSERT_CLEAR_SPECIAL_BLOCKS \ + assert(fullname); assert(gv); assert(cv) + +STATIC void +S_cop_free(pTHX_ COP *cop); +# define PERL_ARGS_ASSERT_COP_FREE \ + assert(cop) + +STATIC OP * +S_dup_attrlist(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_DUP_ATTRLIST \ + assert(o) + +STATIC void +S_find_and_forget_pmops(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_FIND_AND_FORGET_PMOPS \ + assert(o) + +STATIC OP * +S_fold_constants(pTHX_ OP * const o); +# define PERL_ARGS_ASSERT_FOLD_CONSTANTS \ + assert(o) + +STATIC OP * +S_force_list(pTHX_ OP *arg, bool nullit); +# define PERL_ARGS_ASSERT_FORCE_LIST + +STATIC void +S_forget_pmop(pTHX_ PMOP * const o); +# define PERL_ARGS_ASSERT_FORGET_PMOP \ + assert(o) + +STATIC void +S_gen_constant_list(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_GEN_CONSTANT_LIST + +STATIC void +S_inplace_aassign(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_INPLACE_AASSIGN \ + assert(o) + +STATIC bool +S_is_handle_constructor(const OP *o, I32 numargs) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR \ + assert(o) + +STATIC OP * +S_listkids(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_LISTKIDS + +STATIC bool +S_looks_like_bool(pTHX_ const OP *o); +# define PERL_ARGS_ASSERT_LOOKS_LIKE_BOOL \ + assert(o) + +STATIC OP * +S_modkids(pTHX_ OP *o, I32 type); +# define PERL_ARGS_ASSERT_MODKIDS + +STATIC void +S_move_proto_attr(pTHX_ OP **proto, OP **attrs, const GV *name, bool curstash); +# define PERL_ARGS_ASSERT_MOVE_PROTO_ATTR \ + assert(proto); assert(attrs); assert(name) + +STATIC OP * +S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp); +# define PERL_ARGS_ASSERT_MY_KID \ + assert(imopsp) + +STATIC OP * +S_newGIVWHENOP(pTHX_ OP *cond, OP *block, I32 enter_opcode, I32 leave_opcode, PADOFFSET entertarg); +# define PERL_ARGS_ASSERT_NEWGIVWHENOP \ + assert(block) + +STATIC OP * +S_new_logop(pTHX_ I32 type, I32 flags, OP **firstp, OP **otherp) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEW_LOGOP \ + assert(firstp); assert(otherp) + +STATIC OP * +S_no_fh_allowed(pTHX_ OP *o) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NO_FH_ALLOWED \ + assert(o) + +STATIC OP * +S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl); +# define PERL_ARGS_ASSERT_PMTRANS \ + assert(o); assert(expr); assert(repl) + +STATIC bool +S_process_special_blocks(pTHX_ I32 floor, const char * const fullname, GV * const gv, CV * const cv); +# define PERL_ARGS_ASSERT_PROCESS_SPECIAL_BLOCKS \ + assert(fullname); assert(gv); assert(cv) + +STATIC OP * +S_ref_array_or_hash(pTHX_ OP *cond); +# define PERL_ARGS_ASSERT_REF_ARRAY_OR_HASH + +STATIC OP * +S_refkids(pTHX_ OP *o, I32 type); +# define PERL_ARGS_ASSERT_REFKIDS + +STATIC bool +S_scalar_mod_type(const OP *o, I32 type) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SCALAR_MOD_TYPE + +STATIC OP * +S_scalarboolean(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_SCALARBOOLEAN \ + assert(o) + +STATIC OP * +S_scalarkids(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_SCALARKIDS + +STATIC OP * +S_search_const(pTHX_ OP *o) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SEARCH_CONST \ + assert(o) + +STATIC void +S_simplify_sort(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_SIMPLIFY_SORT \ + assert(o) + +STATIC OP * +S_too_few_arguments_pv(pTHX_ OP *o, const char *name, U32 flags) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_TOO_FEW_ARGUMENTS_PV \ + assert(o); assert(name) + +STATIC OP * +S_too_many_arguments_pv(pTHX_ OP *o, const char *name, U32 flags); +# define PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS_PV \ + assert(o); assert(name) + +STATIC OP * +S_voidnonfinal(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_VOIDNONFINAL + +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE OP * +S_newMETHOP_internal(pTHX_ I32 type, I32 flags, OP *dynamic_meth, SV * const_meth); +# define PERL_ARGS_ASSERT_NEWMETHOP_INTERNAL + +PERL_STATIC_INLINE OP * +S_op_integerize(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_OP_INTEGERIZE \ + assert(o) + +PERL_STATIC_INLINE OP * +S_op_std_init(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_OP_STD_INIT \ + assert(o) + +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#endif /* defined(PERL_IN_OP_C) */ +#if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C) +PERL_CALLCONV void +Perl_check_hash_fields_and_hekify(pTHX_ UNOP *rop, SVOP *key_op, int real) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CHECK_HASH_FIELDS_AND_HEKIFY + +PERL_CALLCONV void +Perl_no_bareword_allowed(pTHX_ OP *o) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED \ + assert(o) + +PERL_CALLCONV void +Perl_op_prune_chain_head(OP **op_p) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_OP_PRUNE_CHAIN_HEAD \ + assert(op_p) + +PERL_CALLCONV SV * +Perl_op_varname(pTHX_ const OP *o) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_OP_VARNAME \ + assert(o) + +PERL_CALLCONV void +Perl_warn_elem_scalar_context(pTHX_ const OP *o, SV *name, bool is_hash, bool is_slice) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_WARN_ELEM_SCALAR_CONTEXT \ + assert(o); assert(name) + +#endif /* defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C) */ +#if defined(PERL_IN_OP_C) || defined(PERL_IN_REGCOMP_ANY) + #endif #if defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C) -PERL_CALLCONV void Perl_report_redefined_cv(pTHX_ const SV *name, const CV *old_cv, SV * const *new_const_svp); -#define PERL_ARGS_ASSERT_REPORT_REDEFINED_CV \ - assert(name); assert(old_cv) -#endif +PERL_CALLCONV void +Perl_report_redefined_cv(pTHX_ const SV *name, const CV *old_cv, SV * const *new_const_svp) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_REPORT_REDEFINED_CV \ + assert(name); assert(old_cv) + +PERL_CALLCONV SV * +Perl_varname(pTHX_ const GV * const gv, const char gvtype, PADOFFSET targ, const SV * const keyname, SSize_t aindex, int subscript_type) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_VARNAME + +#endif /* defined(PERL_IN_OP_C) || defined(PERL_IN_SV_C) */ #if defined(PERL_IN_PAD_C) -STATIC PADOFFSET S_pad_alloc_name(pTHX_ PADNAME *name, U32 flags, HV *typestash, HV *ourstash); -#define PERL_ARGS_ASSERT_PAD_ALLOC_NAME \ - assert(name) -STATIC void S_pad_check_dup(pTHX_ PADNAME *name, U32 flags, const HV *ourstash); -#define PERL_ARGS_ASSERT_PAD_CHECK_DUP \ - assert(name) -STATIC PADOFFSET S_pad_findlex(pTHX_ const char *namepv, STRLEN namelen, U32 flags, const CV* cv, U32 seq, int warn, SV** out_capture, PADNAME** out_name, int *out_flags); -#define PERL_ARGS_ASSERT_PAD_FINDLEX \ - assert(namepv); assert(cv); assert(out_name); assert(out_flags) -STATIC void S_pad_reset(pTHX); -#define PERL_ARGS_ASSERT_PAD_RESET -#endif -#if defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool S_PadnameIN_SCOPE(const PADNAME * const pn, const U32 seq); -#define PERL_ARGS_ASSERT_PADNAMEIN_SCOPE \ - assert(pn) -#endif -#endif -#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C) -#ifndef NO_MATHOMS -PERL_CALLCONV OP* Perl_ref(pTHX_ OP* o, I32 type); -#define PERL_ARGS_ASSERT_REF -#endif -#endif +STATIC PADOFFSET +S_pad_alloc_name(pTHX_ PADNAME *name, U32 flags, HV *typestash, HV *ourstash); +# define PERL_ARGS_ASSERT_PAD_ALLOC_NAME \ + assert(name) + +STATIC void +S_pad_check_dup(pTHX_ PADNAME *name, U32 flags, const HV *ourstash); +# define PERL_ARGS_ASSERT_PAD_CHECK_DUP \ + assert(name) + +STATIC PADOFFSET +S_pad_findlex(pTHX_ const char *namepv, STRLEN namelen, U32 flags, const CV *cv, U32 seq, int warn, SV **out_capture, PADNAME **out_name, int *out_flags); +# define PERL_ARGS_ASSERT_PAD_FINDLEX \ + assert(namepv); assert(cv); assert(out_name); assert(out_flags) + +STATIC void +S_pad_reset(pTHX); +# define PERL_ARGS_ASSERT_PAD_RESET + +# if defined(DEBUGGING) +STATIC void +S_cv_dump(pTHX_ const CV *cv, const char *title); +# define PERL_ARGS_ASSERT_CV_DUMP \ + assert(cv); assert(title) + +# endif +#endif /* defined(PERL_IN_PAD_C) */ +#if defined(PERL_IN_PEEP_C) +STATIC void +S_finalize_op(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_FINALIZE_OP \ + assert(o) + +STATIC void +S_optimize_op(pTHX_ OP *o); +# define PERL_ARGS_ASSERT_OPTIMIZE_OP \ + assert(o) + +STATIC OP * +S_traverse_op_tree(pTHX_ OP *top, OP *o); +# define PERL_ARGS_ASSERT_TRAVERSE_OP_TREE \ + assert(top); assert(o) + +#endif /* defined(PERL_IN_PEEP_C) */ #if defined(PERL_IN_PERL_C) -STATIC void S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp); -#define PERL_ARGS_ASSERT_FIND_BEGINNING \ - assert(linestr_sv); assert(rsfp) -STATIC void S_forbid_setid(pTHX_ const char flag, const bool suidscript); -#define PERL_ARGS_ASSERT_FORBID_SETID -STATIC void S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags); -#define PERL_ARGS_ASSERT_INCPUSH \ - assert(dir) -STATIC void S_incpush_use_sep(pTHX_ const char *p, STRLEN len, U32 flags); -#define PERL_ARGS_ASSERT_INCPUSH_USE_SEP \ - assert(p) -STATIC void S_init_ids(pTHX); -#define PERL_ARGS_ASSERT_INIT_IDS -STATIC void S_init_interp(pTHX); -#define PERL_ARGS_ASSERT_INIT_INTERP -STATIC void S_init_main_stash(pTHX); -#define PERL_ARGS_ASSERT_INIT_MAIN_STASH -STATIC void S_init_perllib(pTHX); -#define PERL_ARGS_ASSERT_INIT_PERLLIB -STATIC void S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env); -#define PERL_ARGS_ASSERT_INIT_POSTDUMP_SYMBOLS \ - assert(argv) -STATIC void S_init_predump_symbols(pTHX); -#define PERL_ARGS_ASSERT_INIT_PREDUMP_SYMBOLS -STATIC SV* S_mayberelocate(pTHX_ const char *const dir, STRLEN len, U32 flags); -#define PERL_ARGS_ASSERT_MAYBERELOCATE \ - assert(dir) -PERL_STATIC_NO_RET void S_minus_v(pTHX) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_MINUS_V - -PERL_STATIC_NO_RET void S_my_exit_jump(pTHX) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_MY_EXIT_JUMP - -STATIC void S_nuke_stacks(pTHX); -#define PERL_ARGS_ASSERT_NUKE_STACKS -STATIC PerlIO * S_open_script(pTHX_ const char *scriptname, bool dosearch, bool *suidscript); -#define PERL_ARGS_ASSERT_OPEN_SCRIPT \ - assert(scriptname); assert(suidscript) -STATIC void* S_parse_body(pTHX_ char **env, XSINIT_t xsinit); -#define PERL_ARGS_ASSERT_PARSE_BODY -PERL_STATIC_NO_RET void S_run_body(pTHX_ I32 oldscope) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_RUN_BODY - -PERL_STATIC_NO_RET void S_usage(pTHX) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_USAGE +STATIC void +S_find_beginning(pTHX_ SV *linestr_sv, PerlIO *rsfp); +# define PERL_ARGS_ASSERT_FIND_BEGINNING \ + assert(linestr_sv); assert(rsfp) + +STATIC void +S_forbid_setid(pTHX_ const char flag, const bool suidscript); +# define PERL_ARGS_ASSERT_FORBID_SETID + +STATIC void +S_incpush(pTHX_ const char * const dir, STRLEN len, U32 flags); +# define PERL_ARGS_ASSERT_INCPUSH \ + assert(dir) + +STATIC void +S_incpush_use_sep(pTHX_ const char *p, STRLEN len, U32 flags); +# define PERL_ARGS_ASSERT_INCPUSH_USE_SEP \ + assert(p) + +STATIC void +S_init_ids(pTHX); +# define PERL_ARGS_ASSERT_INIT_IDS + +STATIC void +S_init_interp(pTHX); +# define PERL_ARGS_ASSERT_INIT_INTERP + +STATIC void +S_init_main_stash(pTHX); +# define PERL_ARGS_ASSERT_INIT_MAIN_STASH + +STATIC void +S_init_perllib(pTHX); +# define PERL_ARGS_ASSERT_INIT_PERLLIB + +STATIC void +S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env); +# define PERL_ARGS_ASSERT_INIT_POSTDUMP_SYMBOLS \ + assert(argv) + +STATIC void +S_init_predump_symbols(pTHX); +# define PERL_ARGS_ASSERT_INIT_PREDUMP_SYMBOLS + +STATIC SV * +S_mayberelocate(pTHX_ const char * const dir, STRLEN len, U32 flags); +# define PERL_ARGS_ASSERT_MAYBERELOCATE \ + assert(dir) + +PERL_STATIC_NO_RET void +S_minus_v(pTHX) + __attribute__noreturn__; +# define PERL_ARGS_ASSERT_MINUS_V + +PERL_STATIC_NO_RET void +S_my_exit_jump(pTHX) + __attribute__noreturn__; +# define PERL_ARGS_ASSERT_MY_EXIT_JUMP + +STATIC void +S_nuke_stacks(pTHX); +# define PERL_ARGS_ASSERT_NUKE_STACKS + +STATIC PerlIO * +S_open_script(pTHX_ const char *scriptname, bool dosearch, bool *suidscript); +# define PERL_ARGS_ASSERT_OPEN_SCRIPT \ + assert(scriptname); assert(suidscript) + +STATIC void * +S_parse_body(pTHX_ char **env, XSINIT_t xsinit); +# define PERL_ARGS_ASSERT_PARSE_BODY + +PERL_STATIC_NO_RET void +S_run_body(pTHX_ I32 oldscope) + __attribute__noreturn__; +# define PERL_ARGS_ASSERT_RUN_BODY + +PERL_STATIC_NO_RET void +S_usage(pTHX) + __attribute__noreturn__; +# define PERL_ARGS_ASSERT_USAGE + +# if !defined(PERL_IS_MINIPERL) +STATIC SV * +S_incpush_if_exists(pTHX_ AV * const av, SV *dir, SV * const stem); +# define PERL_ARGS_ASSERT_INCPUSH_IF_EXISTS \ + assert(av); assert(dir); assert(stem) + +# endif +# if !defined(SETUID_SCRIPTS_ARE_SECURE_NOW) +STATIC void +S_validate_suid(pTHX_ PerlIO *rsfp); +# define PERL_ARGS_ASSERT_VALIDATE_SUID \ + assert(rsfp) + +# endif +#endif /* defined(PERL_IN_PERL_C) */ +#if defined(PERL_IN_PERL_C) || defined(PERL_IN_REGCOMP_ANY) || \ + defined(PERL_IN_UTF8_C) +PERL_CALLCONV bool +Perl__invlistEQ(pTHX_ SV * const a, SV * const b, const bool complement_b); +# define PERL_ARGS_ASSERT__INVLISTEQ \ + assert(a); assert(b) + +PERL_CALLCONV SV * +Perl__new_invlist_C_array(pTHX_ const UV * const list) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY \ + assert(list) -#endif +#endif /* defined(PERL_IN_PERL_C) || defined(PERL_IN_REGCOMP_ANY) || + defined(PERL_IN_UTF8_C) */ #if defined(PERL_IN_PP_C) -STATIC size_t S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping); -#define PERL_ARGS_ASSERT_DO_CHOMP \ - assert(retval); assert(sv) -STATIC OP* S_do_delete_local(pTHX); -#define PERL_ARGS_ASSERT_DO_DELETE_LOCAL -STATIC SV* S_refto(pTHX_ SV* sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REFTO \ - assert(sv) +STATIC size_t +S_do_chomp(pTHX_ SV *retval, SV *sv, bool chomping); +# define PERL_ARGS_ASSERT_DO_CHOMP \ + assert(retval); assert(sv) + +STATIC OP * +S_do_delete_local(pTHX); +# define PERL_ARGS_ASSERT_DO_DELETE_LOCAL + +STATIC SV * +S_refto(pTHX_ SV *sv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REFTO \ + assert(sv) -#endif +#endif /* defined(PERL_IN_PP_C) */ #if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool S_lossless_NV_to_IV(const NV nv, IV * ivp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_LOSSLESS_NV_TO_IV \ - assert(ivp) -#endif -PERL_CALLCONV GV* Perl_softref2xv(pTHX_ SV *const sv, const char *const what, const svtype type, SV ***spp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SOFTREF2XV \ - assert(sv); assert(what); assert(spp) +PERL_CALLCONV GV * +Perl_softref2xv(pTHX_ SV * const sv, const char * const what, const svtype type, SV ***spp) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SOFTREF2XV \ + assert(sv); assert(what); assert(spp) + +#endif +#if defined(PERL_IN_PP_C) || defined(PERL_IN_UTF8_C) +PERL_CALLCONV UV +Perl__to_upper_title_latin1(pTHX_ const U8 c, U8 *p, STRLEN *lenp, const char S_or_s) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT__TO_UPPER_TITLE_LATIN1 \ + assert(p); assert(lenp) #endif #if defined(PERL_IN_PP_CTL_C) -STATIC PerlIO * S_check_type_and_open(pTHX_ SV *name) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CHECK_TYPE_AND_OPEN \ - assert(name) - -STATIC void S_destroy_matcher(pTHX_ PMOP* matcher); -#define PERL_ARGS_ASSERT_DESTROY_MATCHER \ - assert(matcher) -STATIC OP* S_do_smartmatch(pTHX_ HV* seen_this, HV* seen_other, const bool copied); -#define PERL_ARGS_ASSERT_DO_SMARTMATCH -STATIC OP* S_docatch(pTHX_ Perl_ppaddr_t firstpp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOCATCH - -STATIC bool S_doeval_compile(pTHX_ U8 gimme, CV* outside, U32 seq, HV* hh); -#define PERL_ARGS_ASSERT_DOEVAL_COMPILE -STATIC OP* S_dofindlabel(pTHX_ OP *o, const char *label, STRLEN len, U32 flags, OP **opstack, OP **oplimit) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOFINDLABEL \ - assert(o); assert(label); assert(opstack); assert(oplimit) - -STATIC MAGIC * S_doparseform(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_DOPARSEFORM \ - assert(sv) -STATIC I32 S_dopoptoeval(pTHX_ I32 startingblock) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOPOPTOEVAL - -STATIC I32 S_dopoptogivenfor(pTHX_ I32 startingblock) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOPOPTOGIVENFOR - -STATIC I32 S_dopoptolabel(pTHX_ const char *label, STRLEN len, U32 flags) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOPOPTOLABEL \ - assert(label) - -STATIC I32 S_dopoptoloop(pTHX_ I32 startingblock) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOPOPTOLOOP - -STATIC I32 S_dopoptosub_at(pTHX_ const PERL_CONTEXT* cxstk, I32 startingblock) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOPOPTOSUB_AT \ - assert(cxstk) - -STATIC I32 S_dopoptowhen(pTHX_ I32 startingblock) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOPOPTOWHEN - -STATIC PMOP* S_make_matcher(pTHX_ REGEXP* re) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MAKE_MATCHER \ - assert(re) - -STATIC bool S_matcher_matches_sv(pTHX_ PMOP* matcher, SV* sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MATCHER_MATCHES_SV \ - assert(matcher); assert(sv) - -STATIC bool S_num_overflow(NV value, I32 fldsize, I32 frcsize) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NUM_OVERFLOW - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool S_path_is_searchable(const char *name) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PATH_IS_SEARCHABLE \ - assert(name) -#endif - -STATIC I32 S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_RUN_USER_FILTER \ - assert(buf_sv) - -STATIC void S_rxres_free(pTHX_ void** rsp); -#define PERL_ARGS_ASSERT_RXRES_FREE \ - assert(rsp) -STATIC void S_rxres_restore(pTHX_ void **rsp, REGEXP *rx); -#define PERL_ARGS_ASSERT_RXRES_RESTORE \ - assert(rsp); assert(rx) -STATIC void S_save_lines(pTHX_ AV *array, SV *sv); -#define PERL_ARGS_ASSERT_SAVE_LINES \ - assert(sv) +STATIC PerlIO * +S_check_type_and_open(pTHX_ SV *name) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_CHECK_TYPE_AND_OPEN \ + assert(name) + +STATIC void +S_destroy_matcher(pTHX_ PMOP *matcher); +# define PERL_ARGS_ASSERT_DESTROY_MATCHER \ + assert(matcher) + +STATIC OP * +S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other, const bool copied); +# define PERL_ARGS_ASSERT_DO_SMARTMATCH + +STATIC OP * +S_docatch(pTHX_ Perl_ppaddr_t firstpp) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOCATCH + +STATIC bool +S_doeval_compile(pTHX_ U8 gimme, CV *outside, U32 seq, HV *hh); +# define PERL_ARGS_ASSERT_DOEVAL_COMPILE + +STATIC OP * +S_dofindlabel(pTHX_ OP *o, const char *label, STRLEN len, U32 flags, OP **opstack, OP **oplimit) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOFINDLABEL \ + assert(o); assert(label); assert(opstack); assert(oplimit) + +STATIC MAGIC * +S_doparseform(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_DOPARSEFORM \ + assert(sv) + +STATIC I32 +S_dopoptoeval(pTHX_ I32 startingblock) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOPOPTOEVAL + +STATIC I32 +S_dopoptogivenfor(pTHX_ I32 startingblock) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOPOPTOGIVENFOR + +STATIC I32 +S_dopoptolabel(pTHX_ const char *label, STRLEN len, U32 flags) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOPOPTOLABEL \ + assert(label) + +STATIC I32 +S_dopoptoloop(pTHX_ I32 startingblock) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOPOPTOLOOP + +STATIC I32 +S_dopoptosub_at(pTHX_ const PERL_CONTEXT *cxstk, I32 startingblock) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOPOPTOSUB_AT \ + assert(cxstk) + +STATIC I32 +S_dopoptowhen(pTHX_ I32 startingblock) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOPOPTOWHEN + +STATIC PMOP * +S_make_matcher(pTHX_ REGEXP *re) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MAKE_MATCHER \ + assert(re) + +STATIC bool +S_matcher_matches_sv(pTHX_ PMOP *matcher, SV *sv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MATCHER_MATCHES_SV \ + assert(matcher); assert(sv) + +STATIC bool +S_num_overflow(NV value, I32 fldsize, I32 frcsize) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NUM_OVERFLOW + +STATIC I32 +S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_RUN_USER_FILTER \ + assert(buf_sv) + +STATIC void +S_rxres_free(pTHX_ void **rsp); +# define PERL_ARGS_ASSERT_RXRES_FREE \ + assert(rsp) + +STATIC void +S_rxres_restore(pTHX_ void **rsp, REGEXP *rx); +# define PERL_ARGS_ASSERT_RXRES_RESTORE \ + assert(rsp); assert(rx) + +STATIC void +S_save_lines(pTHX_ AV *array, SV *sv); +# define PERL_ARGS_ASSERT_SAVE_LINES \ + assert(sv) + +# if !defined(PERL_DISABLE_PMC) +STATIC PerlIO * +S_doopen_pm(pTHX_ SV *name) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOOPEN_PM \ + assert(name) + +# endif +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE bool +S_path_is_searchable(const char *name) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_PATH_IS_SEARCHABLE \ + assert(name) + +# endif +#endif /* defined(PERL_IN_PP_CTL_C) */ +#if defined(PERL_IN_PP_CTL_C) || defined(PERL_IN_UTIL_C) +PERL_CALLCONV bool +Perl_invoke_exception_hook(pTHX_ SV *ex, bool warn) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_INVOKE_EXCEPTION_HOOK + #endif #if defined(PERL_IN_PP_HOT_C) -STATIC void S_do_oddball(pTHX_ SV **oddkey, SV **firstkey); -#define PERL_ARGS_ASSERT_DO_ODDBALL \ - assert(oddkey); assert(firstkey) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE HV* S_opmethod_stash(pTHX_ SV* meth); -#define PERL_ARGS_ASSERT_OPMETHOD_STASH \ - assert(meth) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_FORCE_INLINE bool S_should_we_output_Debug_r(pTHX_ regexp * prog) - __attribute__warn_unused_result__ - __attribute__always_inline__; -#define PERL_ARGS_ASSERT_SHOULD_WE_OUTPUT_DEBUG_R \ - assert(prog) -#endif +STATIC void +S_do_oddball(pTHX_ SV **oddkey, SV **firstkey); +# define PERL_ARGS_ASSERT_DO_ODDBALL \ + assert(oddkey); assert(firstkey) + +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE HV * +S_opmethod_stash(pTHX_ SV *meth); +# define PERL_ARGS_ASSERT_OPMETHOD_STASH \ + assert(meth) + +PERL_STATIC_FORCE_INLINE bool +S_should_we_output_Debug_r(pTHX_ regexp *prog) + __attribute__warn_unused_result__ + __attribute__always_inline__; +# define PERL_ARGS_ASSERT_SHOULD_WE_OUTPUT_DEBUG_R \ + assert(prog) -#endif +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#endif /* defined(PERL_IN_PP_HOT_C) */ #if defined(PERL_IN_PP_PACK_C) -STATIC int S_div128(pTHX_ SV *pnum, bool *done); -#define PERL_ARGS_ASSERT_DIV128 \ - assert(pnum); assert(done) -STATIC char S_first_symbol(const char *pat, const char *patend); -#define PERL_ARGS_ASSERT_FIRST_SYMBOL \ - assert(pat); assert(patend) -STATIC const char * S_get_num(pTHX_ const char *patptr, SSize_t *lenptr) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GET_NUM \ - assert(patptr); assert(lenptr) - -STATIC const char * S_group_end(pTHX_ const char *patptr, const char *patend, char ender); -#define PERL_ARGS_ASSERT_GROUP_END \ - assert(patptr); assert(patend) -STATIC SV* S_is_an_int(pTHX_ const char *s, STRLEN l) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_AN_INT \ - assert(s) - -STATIC SSize_t S_measure_struct(pTHX_ struct tempsym* symptr); -#define PERL_ARGS_ASSERT_MEASURE_STRUCT \ - assert(symptr) -STATIC SV* S_mul128(pTHX_ SV *sv, U8 m); -#define PERL_ARGS_ASSERT_MUL128 \ - assert(sv) -STATIC char * S_my_bytes_to_utf8(const U8 *start, STRLEN len, char *dest, const bool needs_swap) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MY_BYTES_TO_UTF8 \ - assert(start); assert(dest) - -STATIC bool S_need_utf8(const char *pat, const char *patend); -#define PERL_ARGS_ASSERT_NEED_UTF8 \ - assert(pat); assert(patend) -STATIC bool S_next_symbol(pTHX_ struct tempsym* symptr); -#define PERL_ARGS_ASSERT_NEXT_SYMBOL \ - assert(symptr) -STATIC SV ** S_pack_rec(pTHX_ SV *cat, struct tempsym* symptr, SV **beglist, SV **endlist); -#define PERL_ARGS_ASSERT_PACK_REC \ - assert(cat); assert(symptr); assert(beglist); assert(endlist) -STATIC char * S_sv_exp_grow(pTHX_ SV *sv, STRLEN needed) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_EXP_GROW \ - assert(sv) - -STATIC SSize_t S_unpack_rec(pTHX_ struct tempsym* symptr, const char *s, const char *strbeg, const char *strend, const char **new_s); -#define PERL_ARGS_ASSERT_UNPACK_REC \ - assert(symptr); assert(s); assert(strbeg); assert(strend) -#endif +STATIC int +S_div128(pTHX_ SV *pnum, bool *done); +# define PERL_ARGS_ASSERT_DIV128 \ + assert(pnum); assert(done) + +STATIC char +S_first_symbol(const char *pat, const char *patend); +# define PERL_ARGS_ASSERT_FIRST_SYMBOL \ + assert(pat); assert(patend) + +STATIC const char * +S_get_num(pTHX_ const char *patptr, SSize_t *lenptr) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GET_NUM \ + assert(patptr); assert(lenptr) + +STATIC const char * +S_group_end(pTHX_ const char *patptr, const char *patend, char ender); +# define PERL_ARGS_ASSERT_GROUP_END \ + assert(patptr); assert(patend) + +STATIC SV * +S_is_an_int(pTHX_ const char *s, STRLEN l) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_IS_AN_INT \ + assert(s) + +STATIC SSize_t +S_measure_struct(pTHX_ struct tempsym *symptr); +# define PERL_ARGS_ASSERT_MEASURE_STRUCT \ + assert(symptr) + +STATIC SV * +S_mul128(pTHX_ SV *sv, U8 m); +# define PERL_ARGS_ASSERT_MUL128 \ + assert(sv) + +STATIC char * +S_my_bytes_to_utf8(const U8 *start, STRLEN len, char *dest, const bool needs_swap) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MY_BYTES_TO_UTF8 \ + assert(start); assert(dest) + +STATIC bool +S_need_utf8(const char *pat, const char *patend); +# define PERL_ARGS_ASSERT_NEED_UTF8 \ + assert(pat); assert(patend) + +STATIC bool +S_next_symbol(pTHX_ struct tempsym *symptr); +# define PERL_ARGS_ASSERT_NEXT_SYMBOL \ + assert(symptr) + +STATIC SV ** +S_pack_rec(pTHX_ SV *cat, struct tempsym *symptr, SV **beglist, SV **endlist); +# define PERL_ARGS_ASSERT_PACK_REC \ + assert(cat); assert(symptr); assert(beglist); assert(endlist) + +STATIC char * +S_sv_exp_grow(pTHX_ SV *sv, STRLEN needed) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_EXP_GROW \ + assert(sv) + +STATIC SSize_t +S_unpack_rec(pTHX_ struct tempsym *symptr, const char *s, const char *strbeg, const char *strend, const char **new_s); +# define PERL_ARGS_ASSERT_UNPACK_REC \ + assert(symptr); assert(s); assert(strbeg); assert(strend) + +#endif /* defined(PERL_IN_PP_PACK_C) */ #if defined(PERL_IN_PP_SORT_C) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_amagic_cmp(pTHX_ SV *const str1, SV *const str2); -#define PERL_ARGS_ASSERT_AMAGIC_CMP \ - assert(str1); assert(str2) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_amagic_cmp_desc(pTHX_ SV *const str1, SV *const str2); -#define PERL_ARGS_ASSERT_AMAGIC_CMP_DESC \ - assert(str1); assert(str2) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_amagic_i_ncmp(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_AMAGIC_I_NCMP \ - assert(a); assert(b) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_amagic_i_ncmp_desc(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_AMAGIC_I_NCMP_DESC \ - assert(a); assert(b) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_amagic_ncmp(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_AMAGIC_NCMP \ - assert(a); assert(b) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_amagic_ncmp_desc(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_AMAGIC_NCMP_DESC \ - assert(a); assert(b) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_cmp_desc(pTHX_ SV *const str1, SV *const str2); -#define PERL_ARGS_ASSERT_CMP_DESC \ - assert(str1); assert(str2) -#endif -STATIC I32 S_sortcv(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_SORTCV \ - assert(a); assert(b) -STATIC I32 S_sortcv_stacked(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_SORTCV_STACKED \ - assert(a); assert(b) -STATIC I32 S_sortcv_xsub(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_SORTCV_XSUB \ - assert(a); assert(b) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_FORCE_INLINE void S_sortsv_flags_impl(pTHX_ SV** array, size_t num_elts, SVCOMPARE_t cmp, U32 flags) - __attribute__always_inline__; -#define PERL_ARGS_ASSERT_SORTSV_FLAGS_IMPL \ - assert(cmp) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_sv_i_ncmp(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_SV_I_NCMP \ - assert(a); assert(b) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_sv_i_ncmp_desc(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_SV_I_NCMP_DESC \ - assert(a); assert(b) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_sv_ncmp(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_SV_NCMP \ - assert(a); assert(b) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_sv_ncmp_desc(pTHX_ SV *const a, SV *const b); -#define PERL_ARGS_ASSERT_SV_NCMP_DESC \ - assert(a); assert(b) -#endif -# if defined(USE_LOCALE_COLLATE) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_amagic_cmp_locale(pTHX_ SV *const str1, SV *const str2); -#define PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE \ - assert(str1); assert(str2) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_amagic_cmp_locale_desc(pTHX_ SV *const str1, SV *const str2); -#define PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE_DESC \ - assert(str1); assert(str2) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_cmp_locale_desc(pTHX_ SV *const str1, SV *const str2); -#define PERL_ARGS_ASSERT_CMP_LOCALE_DESC \ - assert(str1); assert(str2) -#endif -# endif -#endif +STATIC I32 +S_sortcv(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_SORTCV \ + assert(a); assert(b) + +STATIC I32 +S_sortcv_stacked(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_SORTCV_STACKED \ + assert(a); assert(b) + +STATIC I32 +S_sortcv_xsub(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_SORTCV_XSUB \ + assert(a); assert(b) + +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE I32 +S_amagic_cmp(pTHX_ SV * const str1, SV * const str2); +# define PERL_ARGS_ASSERT_AMAGIC_CMP \ + assert(str1); assert(str2) + +PERL_STATIC_INLINE I32 +S_amagic_cmp_desc(pTHX_ SV * const str1, SV * const str2); +# define PERL_ARGS_ASSERT_AMAGIC_CMP_DESC \ + assert(str1); assert(str2) + +PERL_STATIC_INLINE I32 +S_amagic_i_ncmp(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_AMAGIC_I_NCMP \ + assert(a); assert(b) + +PERL_STATIC_INLINE I32 +S_amagic_i_ncmp_desc(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_AMAGIC_I_NCMP_DESC \ + assert(a); assert(b) + +PERL_STATIC_INLINE I32 +S_amagic_ncmp(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_AMAGIC_NCMP \ + assert(a); assert(b) + +PERL_STATIC_INLINE I32 +S_amagic_ncmp_desc(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_AMAGIC_NCMP_DESC \ + assert(a); assert(b) + +PERL_STATIC_INLINE I32 +S_cmp_desc(pTHX_ SV * const str1, SV * const str2); +# define PERL_ARGS_ASSERT_CMP_DESC \ + assert(str1); assert(str2) + +PERL_STATIC_FORCE_INLINE void +S_sortsv_flags_impl(pTHX_ SV **array, size_t num_elts, SVCOMPARE_t cmp, U32 flags) + __attribute__always_inline__; +# define PERL_ARGS_ASSERT_SORTSV_FLAGS_IMPL \ + assert(cmp) + +PERL_STATIC_INLINE I32 +S_sv_i_ncmp(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_SV_I_NCMP \ + assert(a); assert(b) + +PERL_STATIC_INLINE I32 +S_sv_i_ncmp_desc(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_SV_I_NCMP_DESC \ + assert(a); assert(b) + +PERL_STATIC_INLINE I32 +S_sv_ncmp(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_SV_NCMP \ + assert(a); assert(b) + +PERL_STATIC_INLINE I32 +S_sv_ncmp_desc(pTHX_ SV * const a, SV * const b); +# define PERL_ARGS_ASSERT_SV_NCMP_DESC \ + assert(a); assert(b) + +# if defined(USE_LOCALE_COLLATE) +PERL_STATIC_INLINE I32 +S_amagic_cmp_locale(pTHX_ SV * const str1, SV * const str2); +# define PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE \ + assert(str1); assert(str2) + +PERL_STATIC_INLINE I32 +S_amagic_cmp_locale_desc(pTHX_ SV * const str1, SV * const str2); +# define PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE_DESC \ + assert(str1); assert(str2) + +PERL_STATIC_INLINE I32 +S_cmp_locale_desc(pTHX_ SV * const str1, SV * const str2); +# define PERL_ARGS_ASSERT_CMP_LOCALE_DESC \ + assert(str1); assert(str2) + +# endif /* defined(USE_LOCALE_COLLATE) */ +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#endif /* defined(PERL_IN_PP_SORT_C) */ #if defined(PERL_IN_PP_SYS_C) -STATIC OP* S_doform(pTHX_ CV *cv, GV *gv, OP *retop); -#define PERL_ARGS_ASSERT_DOFORM \ - assert(cv); assert(gv) -STATIC SV * S_space_join_names_mortal(pTHX_ char *const *array); -#define PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL +STATIC OP * +S_doform(pTHX_ CV *cv, GV *gv, OP *retop); +# define PERL_ARGS_ASSERT_DOFORM \ + assert(cv); assert(gv) + +STATIC SV * +S_space_join_names_mortal(pTHX_ char * const *array); +# define PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL + +# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR) +STATIC int +S_dooneliner(pTHX_ const char *cmd, const char *filename) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOONELINER \ + assert(cmd); assert(filename) + +# endif +#endif /* defined(PERL_IN_PP_SYS_C) */ +#if defined(PERL_IN_REGCOMP_ANY) +PERL_CALLCONV void +Perl_add_above_Latin1_folds(pTHX_ RExC_state_t *pRExC_state, const U8 cp, SV **invlist) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_ADD_ABOVE_LATIN1_FOLDS \ + assert(pRExC_state); assert(invlist) + +PERL_CALLCONV regnode * +Perl_construct_ahocorasick_from_trie(pTHX_ RExC_state_t *pRExC_state, regnode *source, U32 depth) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_CONSTRUCT_AHOCORASICK_FROM_TRIE \ + assert(pRExC_state); assert(source) + +PERL_CALLCONV SV * +Perl_get_ANYOFHbbm_contents(pTHX_ const regnode *n) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_GET_ANYOFHBBM_CONTENTS \ + assert(n) + +PERL_CALLCONV SV * +Perl_get_ANYOFM_contents(pTHX_ const regnode *n) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_GET_ANYOFM_CONTENTS \ + assert(n) + +PERL_CALLCONV bool +Perl_is_ssc_worth_it(const RExC_state_t *pRExC_state, const regnode_ssc *ssc) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_IS_SSC_WORTH_IT \ + assert(pRExC_state); assert(ssc) + +PERL_CALLCONV U32 +Perl_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan, UV *min_subtract, bool *unfolded_multi_char, U32 flags, regnode *val, U32 depth) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_JOIN_EXACT \ + assert(pRExC_state); assert(scan); assert(min_subtract); assert(unfolded_multi_char) + +PERL_CALLCONV I32 +Perl_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *first, regnode *last, regnode *tail, U32 word_count, U32 flags, U32 depth) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MAKE_TRIE \ + assert(pRExC_state); assert(startbranch); assert(first); assert(last); \ + assert(tail) + +PERL_CALLCONV void +Perl_populate_anyof_bitmap_from_invlist(pTHX_ regnode *node, SV **invlist_ptr) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_POPULATE_ANYOF_BITMAP_FROM_INVLIST \ + assert(node); assert(invlist_ptr) + +PERL_CALLCONV U32 +Perl_reg_add_data(RExC_state_t * const pRExC_state, const char * const s, const U32 n) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_REG_ADD_DATA \ + assert(pRExC_state); assert(s) + +PERL_CALLCONV void +Perl_scan_commit(pTHX_ const RExC_state_t *pRExC_state, struct scan_data_t *data, SSize_t *minlenp, int is_inf) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_SCAN_COMMIT \ + assert(pRExC_state); assert(data); assert(minlenp) + +PERL_CALLCONV void +Perl_set_ANYOF_arg(pTHX_ RExC_state_t * const pRExC_state, regnode * const node, SV * const cp_list, SV * const runtime_defns, SV * const only_utf8_locale_list) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_SET_ANYOF_ARG \ + assert(pRExC_state); assert(node) + +PERL_CALLCONV void +Perl_ssc_finalize(pTHX_ RExC_state_t *pRExC_state, regnode_ssc *ssc) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_SSC_FINALIZE \ + assert(pRExC_state); assert(ssc) + +PERL_CALLCONV void +Perl_ssc_init(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_SSC_INIT \ + assert(pRExC_state); assert(ssc) + +PERL_CALLCONV SSize_t +Perl_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, SSize_t *minlenp, SSize_t *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U32 recursed_depth, regnode_ssc *and_withp, U32 flags, U32 depth, bool was_mutate_ok) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_STUDY_CHUNK \ + assert(pRExC_state); assert(scanp); assert(minlenp); assert(deltap); \ + assert(last) + +# if defined(PERL_IN_REGCOMP_TRIE_C) && defined(DEBUGGING) +STATIC void +S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap, AV *revcharmap, U32 depth); +# define PERL_ARGS_ASSERT_DUMP_TRIE \ + assert(trie); assert(revcharmap) + +STATIC void +S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap, AV *revcharmap, U32 next_alloc, U32 depth); +# define PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST \ + assert(trie); assert(revcharmap) + +STATIC void +S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap, AV *revcharmap, U32 next_alloc, U32 depth); +# define PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE \ + assert(trie); assert(revcharmap) + +# endif /* defined(PERL_IN_REGCOMP_TRIE_C) && defined(DEBUGGING) */ +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE SV * +S_invlist_contents(pTHX_ SV * const invlist, const bool traditional_style) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_INVLIST_CONTENTS \ + assert(invlist) + +PERL_STATIC_INLINE UV +S_invlist_highest_range_start(SV * const invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_INVLIST_HIGHEST_RANGE_START \ + assert(invlist) + +PERL_STATIC_INLINE bool +S_invlist_is_iterating(const SV * const invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_INVLIST_IS_ITERATING \ + assert(invlist) + +PERL_STATIC_INLINE UV +S_invlist_lowest(SV * const invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_INVLIST_LOWEST \ + assert(invlist) + +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#endif /* defined(PERL_IN_REGCOMP_ANY) */ +#if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_SV_C) +PERL_CALLCONV SV * +Perl_invlist_clone(pTHX_ SV * const invlist, SV *newlist); +# define PERL_ARGS_ASSERT_INVLIST_CLONE \ + assert(invlist) + #endif #if defined(PERL_IN_REGCOMP_C) -STATIC void S_add_above_Latin1_folds(pTHX_ RExC_state_t *pRExC_state, const U8 cp, SV** invlist); -#define PERL_ARGS_ASSERT_ADD_ABOVE_LATIN1_FOLDS \ - assert(pRExC_state); assert(invlist) -STATIC U32 S_add_data(RExC_state_t* const pRExC_state, const char* const s, const U32 n) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ADD_DATA \ - assert(pRExC_state); assert(s) - -STATIC AV* S_add_multi_match(pTHX_ AV* multi_char_matches, SV* multi_string, const STRLEN cp_count); -#define PERL_ARGS_ASSERT_ADD_MULTI_MATCH \ - assert(multi_string) -STATIC void S_change_engine_size(pTHX_ RExC_state_t *pRExC_state, const Ptrdiff_t size); -#define PERL_ARGS_ASSERT_CHANGE_ENGINE_SIZE \ - assert(pRExC_state) -STATIC REGEXP* S_compile_wildcard(pTHX_ const char * subpattern, const STRLEN len, const bool ignore_case) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_COMPILE_WILDCARD \ - assert(subpattern) - -STATIC U8 S_compute_EXACTish(RExC_state_t *pRExC_state); -#define PERL_ARGS_ASSERT_COMPUTE_EXACTISH \ - assert(pRExC_state) -STATIC regnode * S_construct_ahocorasick_from_trie(pTHX_ RExC_state_t *pRExC_state, regnode *source, U32 depth); -#define PERL_ARGS_ASSERT_CONSTRUCT_AHOCORASICK_FROM_TRIE \ - assert(pRExC_state); assert(source) -STATIC int S_edit_distance(const UV *src, const UV *tgt, const STRLEN x, const STRLEN y, const SSize_t maxDistance) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_EDIT_DISTANCE \ - assert(src); assert(tgt) - -STATIC I32 S_execute_wildcard(pTHX_ REGEXP * const prog, char* stringarg, char* strend, char* strbeg, SSize_t minend, SV* screamer, U32 nosave); -#define PERL_ARGS_ASSERT_EXECUTE_WILDCARD \ - assert(prog); assert(stringarg); assert(strend); assert(strbeg); assert(screamer) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE Size_t S_find_first_differing_byte_pos(const U8 * s1, const U8 * s2, const Size_t max); -#define PERL_ARGS_ASSERT_FIND_FIRST_DIFFERING_BYTE_POS \ - assert(s1); assert(s2) -#endif -STATIC SV * S_get_ANYOFM_contents(pTHX_ const regnode * n) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GET_ANYOFM_CONTENTS \ - assert(n) - -STATIC SV* S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state, const regnode_charclass* const node); -#define PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC \ - assert(pRExC_state); assert(node) -STATIC U32 S_get_quantifier_value(pTHX_ RExC_state_t *pRExC_state, const char * start, const char * end); -#define PERL_ARGS_ASSERT_GET_QUANTIFIER_VALUE \ - assert(pRExC_state); assert(start); assert(end) -STATIC bool S_grok_bslash_N(pTHX_ RExC_state_t *pRExC_state, regnode_offset* nodep, UV *code_point_p, int* cp_count, I32 *flagp, const bool strict, const U32 depth); -#define PERL_ARGS_ASSERT_GROK_BSLASH_N \ - assert(pRExC_state); assert(flagp) -STATIC regnode_offset S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, char * backref_parse_start, char ch); -#define PERL_ARGS_ASSERT_HANDLE_NAMED_BACKREF \ - assert(pRExC_state); assert(flagp); assert(backref_parse_start) -STATIC bool S_handle_names_wildcard(pTHX_ const char * wname, const STRLEN wname_len, SV ** prop_definition, AV ** strings); -#define PERL_ARGS_ASSERT_HANDLE_NAMES_WILDCARD \ - assert(wname); assert(prop_definition); assert(strings) -STATIC int S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, const char* const s, char ** updated_parse_ptr, AV** posix_warnings, const bool check_only); -#define PERL_ARGS_ASSERT_HANDLE_POSSIBLE_POSIX \ - assert(pRExC_state); assert(s) -STATIC regnode_offset S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV ** return_invlist, I32 *flagp, U32 depth); -#define PERL_ARGS_ASSERT_HANDLE_REGEX_SETS \ - assert(pRExC_state); assert(flagp) -STATIC SV * S_handle_user_defined_property(pTHX_ const char * name, const STRLEN name_len, const bool is_utf8, const bool to_fold, const bool runtime, const bool deferrable, SV* contents, bool *user_defined_ptr, SV * msg, const STRLEN level); -#define PERL_ARGS_ASSERT_HANDLE_USER_DEFINED_PROPERTY \ - assert(name); assert(contents); assert(user_defined_ptr); assert(msg) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE SV* S_invlist_contents(pTHX_ SV* const invlist, const bool traditional_style) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_INVLIST_CONTENTS \ - assert(invlist) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool S_invlist_is_iterating(const SV* const invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_INVLIST_IS_ITERATING \ - assert(invlist) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE UV S_invlist_lowest(SV* const invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_INVLIST_LOWEST \ - assert(invlist) -#endif - -STATIC bool S_is_ssc_worth_it(const RExC_state_t * pRExC_state, const regnode_ssc * ssc); -#define PERL_ARGS_ASSERT_IS_SSC_WORTH_IT \ - assert(pRExC_state); assert(ssc) -STATIC U32 S_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan, UV *min_subtract, bool *unfolded_multi_char, U32 flags, regnode *val, U32 depth); -#define PERL_ARGS_ASSERT_JOIN_EXACT \ - assert(pRExC_state); assert(scan); assert(min_subtract); assert(unfolded_multi_char) -STATIC SV* S_make_exactf_invlist(pTHX_ RExC_state_t *pRExC_state, regnode *node) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MAKE_EXACTF_INVLIST \ - assert(pRExC_state); assert(node) - -STATIC I32 S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, regnode *first, regnode *last, regnode *tail, U32 word_count, U32 flags, U32 depth); -#define PERL_ARGS_ASSERT_MAKE_TRIE \ - assert(pRExC_state); assert(startbranch); assert(first); assert(last); assert(tail) -STATIC void S_nextchar(pTHX_ RExC_state_t *pRExC_state); -#define PERL_ARGS_ASSERT_NEXTCHAR \ - assert(pRExC_state) -STATIC U8 S_optimize_regclass(pTHX_ RExC_state_t *pRExC_state, SV* cp_list, SV* only_utf8_locale_list, SV* upper_latin1_only_utf8_matches, const U32 has_runtime_dependency, const U32 posixl, U8 * anyof_flags, bool * invert, regnode_offset * ret, I32 *flagp); -#define PERL_ARGS_ASSERT_OPTIMIZE_REGCLASS \ - assert(pRExC_state); assert(anyof_flags); assert(invert); assert(ret); assert(flagp) -STATIC void S_output_posix_warnings(pTHX_ RExC_state_t *pRExC_state, AV* posix_warnings); -#define PERL_ARGS_ASSERT_OUTPUT_POSIX_WARNINGS \ - assert(pRExC_state); assert(posix_warnings) -STATIC void S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state); -#define PERL_ARGS_ASSERT_PARSE_LPAREN_QUESTION_FLAGS \ - assert(pRExC_state) -STATIC SV * S_parse_uniprop_string(pTHX_ const char * const name, Size_t name_len, const bool is_utf8, const bool to_fold, const bool runtime, const bool deferrable, AV ** strings, bool * user_defined_ptr, SV * msg, const STRLEN level); -#define PERL_ARGS_ASSERT_PARSE_UNIPROP_STRING \ - assert(name); assert(user_defined_ptr); assert(msg) -STATIC void S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr); -#define PERL_ARGS_ASSERT_POPULATE_ANYOF_FROM_INVLIST \ - assert(node); assert(invlist_ptr) -STATIC void S_rck_elide_nothing(pTHX_ regnode *node); -#define PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING \ - assert(node) -PERL_STATIC_NO_RET void S_re_croak(pTHX_ bool utf8, const char* pat, ...) - __attribute__noreturn__ - __attribute__format__(__printf__,pTHX_2,pTHX_3); -#define PERL_ARGS_ASSERT_RE_CROAK \ - assert(pat) - -STATIC regnode_offset S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth); -#define PERL_ARGS_ASSERT_REG \ - assert(pRExC_state); assert(flagp) -STATIC regnode_offset S_reg2Lanode(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2); -#define PERL_ARGS_ASSERT_REG2LANODE \ - assert(pRExC_state) -STATIC regnode_offset S_reg_la_NOTHING(pTHX_ RExC_state_t *pRExC_state, U32 flags, const char *type); -#define PERL_ARGS_ASSERT_REG_LA_NOTHING \ - assert(pRExC_state); assert(type) -STATIC regnode_offset S_reg_la_OPFAIL(pTHX_ RExC_state_t *pRExC_state, U32 flags, const char *type); -#define PERL_ARGS_ASSERT_REG_LA_OPFAIL \ - assert(pRExC_state); assert(type) -STATIC regnode_offset S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op); -#define PERL_ARGS_ASSERT_REG_NODE \ - assert(pRExC_state) -STATIC SV * S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags); -#define PERL_ARGS_ASSERT_REG_SCAN_NAME \ - assert(pRExC_state) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE char * S_reg_skipcomment(RExC_state_t *pRExC_state, char * p); -#define PERL_ARGS_ASSERT_REG_SKIPCOMMENT \ - assert(pRExC_state); assert(p) -#endif -STATIC regnode_offset S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg); -#define PERL_ARGS_ASSERT_REGANODE \ - assert(pRExC_state) -STATIC regnode_offset S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth); -#define PERL_ARGS_ASSERT_REGATOM \ - assert(pRExC_state); assert(flagp) -STATIC regnode_offset S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth); -#define PERL_ARGS_ASSERT_REGBRANCH \ - assert(pRExC_state); assert(flagp) -STATIC regnode_offset S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth, const bool stop_at_1, bool allow_multi_fold, const bool silence_non_portable, const bool strict, bool optimizable, SV** ret_invlist); -#define PERL_ARGS_ASSERT_REGCLASS \ - assert(pRExC_state); assert(flagp) -STATIC unsigned int S_regex_set_precedence(const U8 my_operator) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGEX_SET_PRECEDENCE - -STATIC void S_reginsert(pTHX_ RExC_state_t *pRExC_state, const U8 op, const regnode_offset operand, const U32 depth); -#define PERL_ARGS_ASSERT_REGINSERT \ - assert(pRExC_state) -STATIC regnode_offset S_regnode_guts(pTHX_ RExC_state_t *pRExC_state, const STRLEN extra_len); -#define PERL_ARGS_ASSERT_REGNODE_GUTS \ - assert(pRExC_state) -STATIC regnode_offset S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth); -#define PERL_ARGS_ASSERT_REGPIECE \ - assert(pRExC_state); assert(flagp) -STATIC regnode_offset S_regpnode(pTHX_ RExC_state_t *pRExC_state, U8 op, SV * arg); -#define PERL_ARGS_ASSERT_REGPNODE \ - assert(pRExC_state); assert(arg) -STATIC bool S_regtail(pTHX_ RExC_state_t * pRExC_state, const regnode_offset p, const regnode_offset val, const U32 depth) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGTAIL \ - assert(pRExC_state); assert(p); assert(val) - -STATIC void S_scan_commit(pTHX_ const RExC_state_t *pRExC_state, struct scan_data_t *data, SSize_t *minlenp, int is_inf); -#define PERL_ARGS_ASSERT_SCAN_COMMIT \ - assert(pRExC_state); assert(data); assert(minlenp) -STATIC void S_set_ANYOF_arg(pTHX_ RExC_state_t* const pRExC_state, regnode* const node, SV* const cp_list, SV* const runtime_defns, SV* const only_utf8_locale_list); -#define PERL_ARGS_ASSERT_SET_ANYOF_ARG \ - assert(pRExC_state); assert(node) -STATIC void S_set_regex_pv(pTHX_ RExC_state_t *pRExC_state, REGEXP *Rx); -#define PERL_ARGS_ASSERT_SET_REGEX_PV \ - assert(pRExC_state); assert(Rx) -STATIC void S_skip_to_be_ignored_text(pTHX_ RExC_state_t *pRExC_state, char ** p, const bool force_to_xmod); -#define PERL_ARGS_ASSERT_SKIP_TO_BE_IGNORED_TEXT \ - assert(pRExC_state); assert(p) -STATIC void S_ssc_add_range(pTHX_ regnode_ssc *ssc, UV const start, UV const end); -#define PERL_ARGS_ASSERT_SSC_ADD_RANGE \ - assert(ssc) -STATIC void S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, const regnode_charclass *and_with); -#define PERL_ARGS_ASSERT_SSC_AND \ - assert(pRExC_state); assert(ssc); assert(and_with) -STATIC void S_ssc_anything(pTHX_ regnode_ssc *ssc); -#define PERL_ARGS_ASSERT_SSC_ANYTHING \ - assert(ssc) -STATIC void S_ssc_clear_locale(regnode_ssc *ssc); -#define PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE \ - assert(ssc) -STATIC void S_ssc_cp_and(pTHX_ regnode_ssc *ssc, UV const cp); -#define PERL_ARGS_ASSERT_SSC_CP_AND \ - assert(ssc) -STATIC void S_ssc_finalize(pTHX_ RExC_state_t *pRExC_state, regnode_ssc *ssc); -#define PERL_ARGS_ASSERT_SSC_FINALIZE \ - assert(pRExC_state); assert(ssc) -STATIC void S_ssc_init(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc); -#define PERL_ARGS_ASSERT_SSC_INIT \ - assert(pRExC_state); assert(ssc) -STATIC void S_ssc_intersection(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert_2nd); -#define PERL_ARGS_ASSERT_SSC_INTERSECTION \ - assert(ssc); assert(invlist) -STATIC int S_ssc_is_anything(const regnode_ssc *ssc) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SSC_IS_ANYTHING \ - assert(ssc) - -STATIC int S_ssc_is_cp_posixl_init(const RExC_state_t *pRExC_state, const regnode_ssc *ssc) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT \ - assert(pRExC_state); assert(ssc) - -STATIC void S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, const regnode_charclass *or_with); -#define PERL_ARGS_ASSERT_SSC_OR \ - assert(pRExC_state); assert(ssc); assert(or_with) -STATIC void S_ssc_union(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert_2nd); -#define PERL_ARGS_ASSERT_SSC_UNION \ - assert(ssc); assert(invlist) -STATIC SSize_t S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, SSize_t *minlenp, SSize_t *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U32 recursed_depth, regnode_ssc *and_withp, U32 flags, U32 depth, bool was_mutate_ok); -#define PERL_ARGS_ASSERT_STUDY_CHUNK \ - assert(pRExC_state); assert(scanp); assert(minlenp); assert(deltap); assert(last) -#endif -#if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C) || defined(PERL_IN_OP_C) -PERL_CALLCONV void Perl__invlist_dump(pTHX_ PerlIO *file, I32 level, const char* const indent, SV* const invlist); -#define PERL_ARGS_ASSERT__INVLIST_DUMP \ - assert(file); assert(indent); assert(invlist) -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE SV* S_add_cp_to_invlist(pTHX_ SV* invlist, const UV cp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ADD_CP_TO_INVLIST -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void S_invlist_extend(pTHX_ SV* const invlist, const UV len); -#define PERL_ARGS_ASSERT_INVLIST_EXTEND \ - assert(invlist) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE UV S_invlist_highest(SV* const invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_INVLIST_HIGHEST \ - assert(invlist) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void S_invlist_set_len(pTHX_ SV* const invlist, const UV len, const bool offset); -#define PERL_ARGS_ASSERT_INVLIST_SET_LEN \ - assert(invlist) -#endif -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_UTF8_C) -PERL_CALLCONV SV* Perl__add_range_to_invlist(pTHX_ SV* invlist, UV start, UV end) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__ADD_RANGE_TO_INVLIST - -/* PERL_CALLCONV void _invlist_intersection(pTHX_ SV* const a, SV* const b, SV** i); */ -#define PERL_ARGS_ASSERT__INVLIST_INTERSECTION -PERL_CALLCONV void Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, const bool complement_b, SV** i); -#define PERL_ARGS_ASSERT__INVLIST_INTERSECTION_MAYBE_COMPLEMENT_2ND \ - assert(b); assert(i) -PERL_CALLCONV void Perl__invlist_invert(pTHX_ SV* const invlist); -#define PERL_ARGS_ASSERT__INVLIST_INVERT \ - assert(invlist) -/* PERL_CALLCONV void _invlist_subtract(pTHX_ SV* const a, SV* const b, SV** result); */ -#define PERL_ARGS_ASSERT__INVLIST_SUBTRACT -/* PERL_CALLCONV void _invlist_union(pTHX_ SV* const a, SV* const b, SV** output); */ -#define PERL_ARGS_ASSERT__INVLIST_UNION -PERL_CALLCONV void Perl__invlist_union_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, const bool complement_b, SV** output); -#define PERL_ARGS_ASSERT__INVLIST_UNION_MAYBE_COMPLEMENT_2ND \ - assert(b); assert(output) -PERL_CALLCONV SV* Perl__new_invlist(pTHX_ IV initial_size) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__NEW_INVLIST - -PERL_CALLCONV SV* Perl__setup_canned_invlist(pTHX_ const STRLEN size, const UV element0, UV** other_elements_ptr) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__SETUP_CANNED_INVLIST \ - assert(other_elements_ptr) - -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C) -PERL_CALLCONV const char * Perl_form_alien_digit_msg(pTHX_ const U8 which, const STRLEN valids_len, const char * const first_bad, const char * const send, const bool UTF, const bool braced) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_FORM_ALIEN_DIGIT_MSG \ - assert(first_bad); assert(send) - -PERL_CALLCONV bool Perl_grok_bslash_c(pTHX_ const char source, U8 * result, const char** message, U32 * packed_warn) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GROK_BSLASH_C \ - assert(result); assert(message) - -PERL_CALLCONV bool Perl_grok_bslash_o(pTHX_ char** s, const char* const send, UV* uv, const char** message, U32 * packed_warn, const bool strict, const bool allow_UV_MAX, const bool utf8) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GROK_BSLASH_O \ - assert(s); assert(send); assert(uv); assert(message) - -PERL_CALLCONV bool Perl_grok_bslash_x(pTHX_ char** s, const char* const send, UV* uv, const char** message, U32 * packed_warn, const bool strict, const bool allow_UV_MAX, const bool utf8) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GROK_BSLASH_X \ - assert(s); assert(send); assert(uv); assert(message) - -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) -PERL_CALLCONV const char * Perl_form_cp_too_large_msg(pTHX_ const U8 which, const char * string, const Size_t len, const UV cp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_FORM_CP_TOO_LARGE_MSG - -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE STRLEN* S_get_invlist_iter_addr(SV* invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GET_INVLIST_ITER_ADDR \ - assert(invlist) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void S_invlist_iterfinish(SV* invlist); -#define PERL_ARGS_ASSERT_INVLIST_ITERFINISH \ - assert(invlist) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void S_invlist_iterinit(SV* invlist); -#define PERL_ARGS_ASSERT_INVLIST_ITERINIT \ - assert(invlist) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool S_invlist_iternext(SV* invlist, UV* start, UV* end) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_INVLIST_ITERNEXT \ - assert(invlist); assert(start); assert(end) -#endif - -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PERL_C) || defined(PERL_IN_UTF8_C) -PERL_CALLCONV bool Perl__invlistEQ(pTHX_ SV* const a, SV* const b, const bool complement_b); -#define PERL_ARGS_ASSERT__INVLISTEQ \ - assert(a); assert(b) -PERL_CALLCONV SV* Perl__new_invlist_C_array(pTHX_ const UV* const list) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY \ - assert(list) - -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE const char * S_get_regex_charset_name(const U32 flags, STRLEN* const lenp); -#define PERL_ARGS_ASSERT_GET_REGEX_CHARSET_NAME \ - assert(lenp) -#endif -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) -PERL_CALLCONV int Perl_re_printf(pTHX_ const char *fmt, ...) - __attribute__format__(__printf__,pTHX_1,pTHX_2); -#define PERL_ARGS_ASSERT_RE_PRINTF \ - assert(fmt) - -PERL_CALLCONV void Perl_regprop(pTHX_ const regexp *prog, SV* sv, const regnode* o, const regmatch_info *reginfo, const RExC_state_t *pRExC_state); -#define PERL_ARGS_ASSERT_REGPROP \ - assert(sv); assert(o) -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_PP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) || defined(PERL_IN_DOOP_C) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool S__invlist_contains_cp(SV* const invlist, const UV cp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__INVLIST_CONTAINS_CP \ - assert(invlist) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE UV S__invlist_len(SV* const invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__INVLIST_LEN \ - assert(invlist) -#endif - -PERL_CALLCONV SSize_t Perl__invlist_search(SV* const invlist, const UV cp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT__INVLIST_SEARCH \ - assert(invlist) - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool* S_get_invlist_offset_addr(SV* invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GET_INVLIST_OFFSET_ADDR \ - assert(invlist) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE UV* S_invlist_array(SV* const invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_INVLIST_ARRAY \ - assert(invlist) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool S_is_invlist(const SV* const invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_INVLIST -#endif - -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) -PERL_CALLCONV bool Perl_is_grapheme(pTHX_ const U8 * strbeg, const U8 * s, const U8 *strend, const UV cp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_GRAPHEME \ - assert(strbeg); assert(s); assert(strend) - -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C) -PERL_CALLCONV UV Perl__to_fold_latin1(const U8 c, U8 *p, STRLEN *lenp, const unsigned int flags); -#define PERL_ARGS_ASSERT__TO_FOLD_LATIN1 \ - assert(p); assert(lenp) -#endif -#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_SV_C) -PERL_CALLCONV SV* Perl_invlist_clone(pTHX_ SV* const invlist, SV* newlist); -#define PERL_ARGS_ASSERT_INVLIST_CLONE \ - assert(invlist) +STATIC AV * +S_add_multi_match(pTHX_ AV *multi_char_matches, SV *multi_string, const STRLEN cp_count); +# define PERL_ARGS_ASSERT_ADD_MULTI_MATCH \ + assert(multi_string) + +STATIC void +S_change_engine_size(pTHX_ RExC_state_t *pRExC_state, const Ptrdiff_t size); +# define PERL_ARGS_ASSERT_CHANGE_ENGINE_SIZE \ + assert(pRExC_state) + +STATIC REGEXP * +S_compile_wildcard(pTHX_ const char *subpattern, const STRLEN len, const bool ignore_case) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_COMPILE_WILDCARD \ + assert(subpattern) + +STATIC U8 +S_compute_EXACTish(RExC_state_t *pRExC_state); +# define PERL_ARGS_ASSERT_COMPUTE_EXACTISH \ + assert(pRExC_state) + +STATIC int +S_edit_distance(const UV *src, const UV *tgt, const STRLEN x, const STRLEN y, const SSize_t maxDistance) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_EDIT_DISTANCE \ + assert(src); assert(tgt) + +STATIC I32 +S_execute_wildcard(pTHX_ REGEXP * const prog, char *stringarg, char *strend, char *strbeg, SSize_t minend, SV *screamer, U32 nosave); +# define PERL_ARGS_ASSERT_EXECUTE_WILDCARD \ + assert(prog); assert(stringarg); assert(strend); assert(strbeg); \ + assert(screamer) + +STATIC U32 +S_get_quantifier_value(pTHX_ RExC_state_t *pRExC_state, const char *start, const char *end); +# define PERL_ARGS_ASSERT_GET_QUANTIFIER_VALUE \ + assert(pRExC_state); assert(start); assert(end) + +STATIC bool +S_grok_bslash_N(pTHX_ RExC_state_t *pRExC_state, regnode_offset *nodep, UV *code_point_p, int *cp_count, I32 *flagp, const bool strict, const U32 depth); +# define PERL_ARGS_ASSERT_GROK_BSLASH_N \ + assert(pRExC_state); assert(flagp) + +STATIC regnode_offset +S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, char *backref_parse_start, char ch); +# define PERL_ARGS_ASSERT_HANDLE_NAMED_BACKREF \ + assert(pRExC_state); assert(flagp); assert(backref_parse_start) + +STATIC bool +S_handle_names_wildcard(pTHX_ const char *wname, const STRLEN wname_len, SV **prop_definition, AV **strings); +# define PERL_ARGS_ASSERT_HANDLE_NAMES_WILDCARD \ + assert(wname); assert(prop_definition); assert(strings) + +STATIC int +S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state, const char * const s, char **updated_parse_ptr, AV **posix_warnings, const bool check_only); +# define PERL_ARGS_ASSERT_HANDLE_POSSIBLE_POSIX \ + assert(pRExC_state); assert(s) + +STATIC regnode_offset +S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV **return_invlist, I32 *flagp, U32 depth); +# define PERL_ARGS_ASSERT_HANDLE_REGEX_SETS \ + assert(pRExC_state); assert(flagp) + +STATIC SV * +S_handle_user_defined_property(pTHX_ const char *name, const STRLEN name_len, const bool is_utf8, const bool to_fold, const bool runtime, const bool deferrable, SV *contents, bool *user_defined_ptr, SV *msg, const STRLEN level); +# define PERL_ARGS_ASSERT_HANDLE_USER_DEFINED_PROPERTY \ + assert(name); assert(contents); assert(user_defined_ptr); assert(msg) + +STATIC void +S_nextchar(pTHX_ RExC_state_t *pRExC_state); +# define PERL_ARGS_ASSERT_NEXTCHAR \ + assert(pRExC_state) + +STATIC U8 +S_optimize_regclass(pTHX_ RExC_state_t *pRExC_state, SV *cp_list, SV *only_utf8_locale_list, SV *upper_latin1_only_utf8_matches, const U32 has_runtime_dependency, const U32 posixl, U8 *anyof_flags, bool *invert, regnode_offset *ret, I32 *flagp); +# define PERL_ARGS_ASSERT_OPTIMIZE_REGCLASS \ + assert(pRExC_state); assert(anyof_flags); assert(invert); assert(ret); \ + assert(flagp) + +STATIC void +S_output_posix_warnings(pTHX_ RExC_state_t *pRExC_state, AV *posix_warnings); +# define PERL_ARGS_ASSERT_OUTPUT_POSIX_WARNINGS \ + assert(pRExC_state); assert(posix_warnings) + +STATIC void +S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state); +# define PERL_ARGS_ASSERT_PARSE_LPAREN_QUESTION_FLAGS \ + assert(pRExC_state) + +STATIC SV * +S_parse_uniprop_string(pTHX_ const char * const name, Size_t name_len, const bool is_utf8, const bool to_fold, const bool runtime, const bool deferrable, AV **strings, bool *user_defined_ptr, SV *msg, const STRLEN level); +# define PERL_ARGS_ASSERT_PARSE_UNIPROP_STRING \ + assert(name); assert(user_defined_ptr); assert(msg) + +PERL_STATIC_NO_RET void +S_re_croak(pTHX_ bool utf8, const char *pat, ...) + __attribute__noreturn__ + __attribute__format__(__printf__,pTHX_2,pTHX_3); +# define PERL_ARGS_ASSERT_RE_CROAK \ + assert(pat) + +STATIC regnode_offset +S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth); +# define PERL_ARGS_ASSERT_REG \ + assert(pRExC_state); assert(flagp) + +STATIC regnode_offset +S_reg1node(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg); +# define PERL_ARGS_ASSERT_REG1NODE \ + assert(pRExC_state) + +STATIC regnode_offset +S_reg2node(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2); +# define PERL_ARGS_ASSERT_REG2NODE \ + assert(pRExC_state) + +STATIC regnode_offset +S_reg_la_NOTHING(pTHX_ RExC_state_t *pRExC_state, U32 flags, const char *type); +# define PERL_ARGS_ASSERT_REG_LA_NOTHING \ + assert(pRExC_state); assert(type) + +STATIC regnode_offset +S_reg_la_OPFAIL(pTHX_ RExC_state_t *pRExC_state, U32 flags, const char *type); +# define PERL_ARGS_ASSERT_REG_LA_OPFAIL \ + assert(pRExC_state); assert(type) + +STATIC regnode_offset +S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op); +# define PERL_ARGS_ASSERT_REG_NODE \ + assert(pRExC_state) + +STATIC SV * +S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags); +# define PERL_ARGS_ASSERT_REG_SCAN_NAME \ + assert(pRExC_state) + +STATIC regnode_offset +S_regatom(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth); +# define PERL_ARGS_ASSERT_REGATOM \ + assert(pRExC_state); assert(flagp) + +STATIC regnode_offset +S_regbranch(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth); +# define PERL_ARGS_ASSERT_REGBRANCH \ + assert(pRExC_state); assert(flagp) + +STATIC regnode_offset +S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth, const bool stop_at_1, bool allow_multi_fold, const bool silence_non_portable, const bool strict, bool optimizable, SV **ret_invlist); +# define PERL_ARGS_ASSERT_REGCLASS \ + assert(pRExC_state); assert(flagp) + +STATIC unsigned int +S_regex_set_precedence(const U8 my_operator) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGEX_SET_PRECEDENCE + +STATIC void +S_reginsert(pTHX_ RExC_state_t *pRExC_state, const U8 op, const regnode_offset operand, const U32 depth); +# define PERL_ARGS_ASSERT_REGINSERT \ + assert(pRExC_state) + +STATIC regnode_offset +S_regnode_guts(pTHX_ RExC_state_t *pRExC_state, const STRLEN extra_len); +# define PERL_ARGS_ASSERT_REGNODE_GUTS \ + assert(pRExC_state) + +STATIC regnode_offset +S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth); +# define PERL_ARGS_ASSERT_REGPIECE \ + assert(pRExC_state); assert(flagp) + +STATIC regnode_offset +S_regpnode(pTHX_ RExC_state_t *pRExC_state, U8 op, SV *arg); +# define PERL_ARGS_ASSERT_REGPNODE \ + assert(pRExC_state); assert(arg) + +STATIC bool +S_regtail(pTHX_ RExC_state_t *pRExC_state, const regnode_offset p, const regnode_offset val, const U32 depth) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGTAIL \ + assert(pRExC_state); assert(p); assert(val) + +STATIC void +S_set_regex_pv(pTHX_ RExC_state_t *pRExC_state, REGEXP *Rx); +# define PERL_ARGS_ASSERT_SET_REGEX_PV \ + assert(pRExC_state); assert(Rx) + +STATIC void +S_skip_to_be_ignored_text(pTHX_ RExC_state_t *pRExC_state, char **p, const bool force_to_xmod); +# define PERL_ARGS_ASSERT_SKIP_TO_BE_IGNORED_TEXT \ + assert(pRExC_state); assert(p) + +# if defined(DEBUGGING) +STATIC regnode_offset +S_regnode_guts_debug(pTHX_ RExC_state_t *pRExC_state, const U8 op, const STRLEN extra_len); +# define PERL_ARGS_ASSERT_REGNODE_GUTS_DEBUG \ + assert(pRExC_state) + +STATIC bool +S_regtail_study(pTHX_ RExC_state_t *pRExC_state, regnode_offset p, const regnode_offset val, U32 depth) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGTAIL_STUDY \ + assert(pRExC_state); assert(p); assert(val) + +# if defined(ENABLE_REGEX_SETS_DEBUGGING) +STATIC void +S_dump_regex_sets_structures(pTHX_ RExC_state_t *pRExC_state, AV *stack, const IV fence, AV *fence_stack); +# define PERL_ARGS_ASSERT_DUMP_REGEX_SETS_STRUCTURES \ + assert(pRExC_state); assert(stack); assert(fence_stack) + +# endif +# endif /* defined(DEBUGGING) */ +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE Size_t +S_find_first_differing_byte_pos(const U8 *s1, const U8 *s2, const Size_t max); +# define PERL_ARGS_ASSERT_FIND_FIRST_DIFFERING_BYTE_POS \ + assert(s1); assert(s2) + +PERL_STATIC_INLINE char * +S_reg_skipcomment(RExC_state_t *pRExC_state, char *p); +# define PERL_ARGS_ASSERT_REG_SKIPCOMMENT \ + assert(pRExC_state); assert(p) + +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#endif /* defined(PERL_IN_REGCOMP_C) */ +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGCOMP_INVLIST_C) +PERL_CALLCONV void +Perl_populate_bitmap_from_invlist(pTHX_ SV *invlist, const UV offset, const U8 *bitmap, const Size_t len) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_POPULATE_BITMAP_FROM_INVLIST \ + assert(invlist); assert(bitmap) + +PERL_CALLCONV void +Perl_populate_invlist_from_bitmap(pTHX_ const U8 *bitmap, const Size_t bitmap_len, SV **invlist, const UV offset) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_POPULATE_INVLIST_FROM_BITMAP \ + assert(bitmap); assert(invlist) + +#endif /* defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGCOMP_INVLIST_C) */ +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \ + defined(PERL_IN_TOKE_C) +PERL_CALLCONV bool +Perl_is_grapheme(pTHX_ const U8 *strbeg, const U8 *s, const U8 *strend, const UV cp) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_IS_GRAPHEME \ + assert(strbeg); assert(s); assert(strend) + +#endif +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || \ + defined(PERL_IN_UTF8_C) +PERL_CALLCONV UV +Perl__to_fold_latin1(const U8 c, U8 *p, STRLEN *lenp, const unsigned int flags); +# define PERL_ARGS_ASSERT__TO_FOLD_LATIN1 \ + assert(p); assert(lenp) + #endif #if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) -PERL_CALLCONV bool Perl_regcurly(const char *s, const char *e, const char * result[5]) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGCURLY \ - assert(s); assert(e) +PERL_CALLCONV bool +Perl_regcurly(const char *s, const char *e, const char *result[5]) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGCURLY \ + assert(s); assert(e) + +#endif +#if defined(PERL_IN_REGCOMP_DEBUG_C) && defined(DEBUGGING) +STATIC U8 +S_put_charclass_bitmap_innards(pTHX_ SV *sv, char *bitmap, SV *nonbitmap_invlist, SV *only_utf8_locale_invlist, const regnode * const node, const U8 flags, const bool force_as_is_display); +# define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS \ + assert(sv) + +STATIC SV * +S_put_charclass_bitmap_innards_common(pTHX_ SV *invlist, SV *posixes, SV *only_utf8, SV *not_utf8, SV *only_utf8_locale, const bool invert); +# define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_COMMON \ + assert(invlist) + +STATIC void +S_put_charclass_bitmap_innards_invlist(pTHX_ SV *sv, SV *invlist); +# define PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_INVLIST \ + assert(sv); assert(invlist) + +STATIC void +S_put_code_point(pTHX_ SV *sv, UV c); +# define PERL_ARGS_ASSERT_PUT_CODE_POINT \ + assert(sv) + +STATIC void +S_put_range(pTHX_ SV *sv, UV start, const UV end, const bool allow_literals); +# define PERL_ARGS_ASSERT_PUT_RANGE \ + assert(sv) + +STATIC void +S_regdump_extflags(pTHX_ const char *lead, const U32 flags); +# define PERL_ARGS_ASSERT_REGDUMP_EXTFLAGS + +STATIC void +S_regdump_intflags(pTHX_ const char *lead, const U32 flags); +# define PERL_ARGS_ASSERT_REGDUMP_INTFLAGS + +#endif /* defined(PERL_IN_REGCOMP_DEBUG_C) && defined(DEBUGGING) */ +#if defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD) +STATIC void +S__append_range_to_invlist(pTHX_ SV * const invlist, const UV start, const UV end); +# define PERL_ARGS_ASSERT__APPEND_RANGE_TO_INVLIST \ + assert(invlist) + +STATIC void +S_initialize_invlist_guts(pTHX_ SV *invlist, const Size_t initial_size); +# define PERL_ARGS_ASSERT_INITIALIZE_INVLIST_GUTS \ + assert(invlist) + +STATIC void +S_invlist_replace_list_destroys_src(pTHX_ SV *dest, SV *src); +# define PERL_ARGS_ASSERT_INVLIST_REPLACE_LIST_DESTROYS_SRC \ + assert(dest); assert(src) + +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE UV * +S__invlist_array_init(SV * const invlist, const bool will_have_0) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT__INVLIST_ARRAY_INIT \ + assert(invlist) + +PERL_STATIC_INLINE IV * +S_get_invlist_previous_index_addr(SV *invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GET_INVLIST_PREVIOUS_INDEX_ADDR \ + assert(invlist) + +PERL_STATIC_INLINE void +S_invlist_clear(pTHX_ SV *invlist); +# define PERL_ARGS_ASSERT_INVLIST_CLEAR \ + assert(invlist) + +PERL_STATIC_INLINE UV +S_invlist_max(const SV * const invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_INVLIST_MAX \ + assert(invlist) + +PERL_STATIC_INLINE IV +S_invlist_previous_index(SV * const invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_INVLIST_PREVIOUS_INDEX \ + assert(invlist) + +PERL_STATIC_INLINE void +S_invlist_set_previous_index(SV * const invlist, const IV index); +# define PERL_ARGS_ASSERT_INVLIST_SET_PREVIOUS_INDEX \ + assert(invlist) + +PERL_STATIC_INLINE void +S_invlist_trim(SV *invlist); +# define PERL_ARGS_ASSERT_INVLIST_TRIM \ + assert(invlist) + +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#endif /* defined(PERL_IN_REGCOMP_INVLIST_C) && !defined(PERL_EXT_RE_BUILD) */ +#if defined(PERL_IN_REGCOMP_STUDY_C) +STATIC SV * +S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state, const regnode_charclass * const node); +# define PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC \ + assert(pRExC_state); assert(node) + +STATIC SV * +S_make_exactf_invlist(pTHX_ RExC_state_t *pRExC_state, regnode *node) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MAKE_EXACTF_INVLIST \ + assert(pRExC_state); assert(node) + +STATIC void +S_rck_elide_nothing(pTHX_ regnode *node); +# define PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING \ + assert(node) + +STATIC void +S_ssc_add_range(pTHX_ regnode_ssc *ssc, UV const start, UV const end); +# define PERL_ARGS_ASSERT_SSC_ADD_RANGE \ + assert(ssc) + +STATIC void +S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, const regnode_charclass *and_with); +# define PERL_ARGS_ASSERT_SSC_AND \ + assert(pRExC_state); assert(ssc); assert(and_with) + +STATIC void +S_ssc_anything(pTHX_ regnode_ssc *ssc); +# define PERL_ARGS_ASSERT_SSC_ANYTHING \ + assert(ssc) + +STATIC void +S_ssc_clear_locale(regnode_ssc *ssc); +# define PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE \ + assert(ssc) + +STATIC void +S_ssc_cp_and(pTHX_ regnode_ssc *ssc, UV const cp); +# define PERL_ARGS_ASSERT_SSC_CP_AND \ + assert(ssc) + +STATIC void +S_ssc_intersection(pTHX_ regnode_ssc *ssc, SV * const invlist, const bool invert_2nd); +# define PERL_ARGS_ASSERT_SSC_INTERSECTION \ + assert(ssc); assert(invlist) + +STATIC int +S_ssc_is_anything(const regnode_ssc *ssc) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SSC_IS_ANYTHING \ + assert(ssc) + +STATIC int +S_ssc_is_cp_posixl_init(const RExC_state_t *pRExC_state, const regnode_ssc *ssc) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT \ + assert(pRExC_state); assert(ssc) + +STATIC void +S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, const regnode_charclass *or_with); +# define PERL_ARGS_ASSERT_SSC_OR \ + assert(pRExC_state); assert(ssc); assert(or_with) + +STATIC void +S_ssc_union(pTHX_ regnode_ssc *ssc, SV * const invlist, const bool invert_2nd); +# define PERL_ARGS_ASSERT_SSC_UNION \ + assert(ssc); assert(invlist) + +STATIC void +S_unwind_scan_frames(pTHX_ const void *p); +# define PERL_ARGS_ASSERT_UNWIND_SCAN_FRAMES \ + assert(p) -#endif +#endif /* defined(PERL_IN_REGCOMP_STUDY_C) */ #if defined(PERL_IN_REGEXEC_C) -STATIC LB_enum S_advance_one_LB(pTHX_ U8 ** curpos, const U8 * const strend, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ADVANCE_ONE_LB \ - assert(curpos); assert(strend) - -STATIC SB_enum S_advance_one_SB(pTHX_ U8 ** curpos, const U8 * const strend, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ADVANCE_ONE_SB \ - assert(curpos); assert(strend) - -STATIC WB_enum S_advance_one_WB(pTHX_ U8 ** curpos, const U8 * const strend, const bool utf8_target, const bool skip_Extend_Format) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ADVANCE_ONE_WB \ - assert(curpos); assert(strend) - -STATIC GCB_enum S_backup_one_GCB(pTHX_ const U8 * const strbeg, U8 ** curpos, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_BACKUP_ONE_GCB \ - assert(strbeg); assert(curpos) - -STATIC LB_enum S_backup_one_LB(pTHX_ const U8 * const strbeg, U8 ** curpos, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_BACKUP_ONE_LB \ - assert(strbeg); assert(curpos) - -STATIC SB_enum S_backup_one_SB(pTHX_ const U8 * const strbeg, U8 ** curpos, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_BACKUP_ONE_SB \ - assert(strbeg); assert(curpos) - -STATIC WB_enum S_backup_one_WB(pTHX_ WB_enum * previous, const U8 * const strbeg, U8 ** curpos, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_BACKUP_ONE_WB \ - assert(previous); assert(strbeg); assert(curpos) - -STATIC char* S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s, const char *strend, regmatch_info *reginfo) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_FIND_BYCLASS \ - assert(prog); assert(c); assert(s); assert(strend) - -STATIC U8 * S_find_next_masked(U8 * s, const U8 * send, const U8 byte, const U8 mask) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_FIND_NEXT_MASKED \ - assert(s); assert(send) - -STATIC U8 * S_find_span_end(U8* s, const U8 * send, const U8 span_byte) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_FIND_SPAN_END \ - assert(s); assert(send) - -STATIC U8 * S_find_span_end_mask(U8 * s, const U8 * send, const U8 span_byte, const U8 mask) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_FIND_SPAN_END_MASK \ - assert(s); assert(send) - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE I32 S_foldEQ_latin1_s2_folded(const char* a, const char* b, I32 len); -#define PERL_ARGS_ASSERT_FOLDEQ_LATIN1_S2_FOLDED \ - assert(a); assert(b) -#endif -STATIC bool S_isFOO_lc(pTHX_ const U8 classnum, const U8 character) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISFOO_LC - -STATIC bool S_isFOO_utf8_lc(pTHX_ const U8 classnum, const U8* character, const U8* e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISFOO_UTF8_LC \ - assert(character); assert(e) - -STATIC bool S_isGCB(pTHX_ const GCB_enum before, const GCB_enum after, const U8 * const strbeg, const U8 * const curpos, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISGCB \ - assert(strbeg); assert(curpos) - -STATIC bool S_isLB(pTHX_ LB_enum before, LB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISLB \ - assert(strbeg); assert(curpos); assert(strend) - -STATIC bool S_isSB(pTHX_ SB_enum before, SB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISSB \ - assert(strbeg); assert(curpos); assert(strend) - -STATIC bool S_isWB(pTHX_ WB_enum previous, WB_enum before, WB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISWB \ - assert(strbeg); assert(curpos); assert(strend) - -STATIC I32 S_reg_check_named_buff_matched(const regexp *rex, const regnode *scan) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REG_CHECK_NAMED_BUFF_MATCHED \ - assert(rex); assert(scan) - -STATIC void S_regcp_restore(pTHX_ regexp *rex, I32 ix, U32 *maxopenparen_p _pDEPTH); -#define PERL_ARGS_ASSERT_REGCP_RESTORE \ - assert(rex); assert(maxopenparen_p) -STATIC void S_regcppop(pTHX_ regexp *rex, U32 *maxopenparen_p _pDEPTH); -#define PERL_ARGS_ASSERT_REGCPPOP \ - assert(rex); assert(maxopenparen_p) -STATIC CHECKPOINT S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxopenparen _pDEPTH); -#define PERL_ARGS_ASSERT_REGCPPUSH \ - assert(rex) -STATIC U8* S_reghop3(U8 *s, SSize_t off, const U8 *lim) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGHOP3 \ - assert(s); assert(lim) - -STATIC U8* S_reghop4(U8 *s, SSize_t off, const U8 *llim, const U8 *rlim) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGHOP4 \ - assert(s); assert(llim); assert(rlim) - -STATIC U8* S_reghopmaybe3(U8 *s, SSize_t off, const U8 * const lim) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGHOPMAYBE3 \ - assert(s); assert(lim) - -STATIC bool S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8 * const p, const U8 * const p_end, bool const utf8_target) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGINCLASS \ - assert(n); assert(p); assert(p_end) - -STATIC SSize_t S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGMATCH \ - assert(reginfo); assert(startpos); assert(prog) - -STATIC I32 S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p, char *loceol, regmatch_info *const reginfo, I32 max _pDEPTH) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGREPEAT \ - assert(prog); assert(startposp); assert(p); assert(loceol); assert(reginfo) - -STATIC bool S_regtry(pTHX_ regmatch_info *reginfo, char **startposp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_REGTRY \ - assert(reginfo); assert(startposp) - -STATIC bool S_to_byte_substr(pTHX_ regexp * prog); -#define PERL_ARGS_ASSERT_TO_BYTE_SUBSTR \ - assert(prog) -STATIC void S_to_utf8_substr(pTHX_ regexp * prog); -#define PERL_ARGS_ASSERT_TO_UTF8_SUBSTR \ - assert(prog) -#endif +STATIC LB_enum +S_advance_one_LB(pTHX_ U8 **curpos, const U8 * const strend, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ADVANCE_ONE_LB \ + assert(curpos); assert(strend) + +STATIC SB_enum +S_advance_one_SB(pTHX_ U8 **curpos, const U8 * const strend, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ADVANCE_ONE_SB \ + assert(curpos); assert(strend) + +STATIC WB_enum +S_advance_one_WB(pTHX_ U8 **curpos, const U8 * const strend, const bool utf8_target, const bool skip_Extend_Format) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ADVANCE_ONE_WB \ + assert(curpos); assert(strend) + +STATIC GCB_enum +S_backup_one_GCB(pTHX_ const U8 * const strbeg, U8 **curpos, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_BACKUP_ONE_GCB \ + assert(strbeg); assert(curpos) + +STATIC LB_enum +S_backup_one_LB(pTHX_ const U8 * const strbeg, U8 **curpos, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_BACKUP_ONE_LB \ + assert(strbeg); assert(curpos) + +STATIC SB_enum +S_backup_one_SB(pTHX_ const U8 * const strbeg, U8 **curpos, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_BACKUP_ONE_SB \ + assert(strbeg); assert(curpos) + +STATIC WB_enum +S_backup_one_WB(pTHX_ WB_enum *previous, const U8 * const strbeg, U8 **curpos, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_BACKUP_ONE_WB \ + assert(previous); assert(strbeg); assert(curpos) + +STATIC char * +S_find_byclass(pTHX_ regexp *prog, const regnode *c, char *s, const char *strend, regmatch_info *reginfo) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_FIND_BYCLASS \ + assert(prog); assert(c); assert(s); assert(strend) + +STATIC U8 * +S_find_next_masked(U8 *s, const U8 *send, const U8 byte, const U8 mask) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_FIND_NEXT_MASKED \ + assert(s); assert(send) + +STATIC U8 * +S_find_span_end(U8 *s, const U8 *send, const U8 span_byte) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_FIND_SPAN_END \ + assert(s); assert(send) + +STATIC U8 * +S_find_span_end_mask(U8 *s, const U8 *send, const U8 span_byte, const U8 mask) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_FIND_SPAN_END_MASK \ + assert(s); assert(send) + +STATIC bool +S_isFOO_lc(pTHX_ const U8 classnum, const U8 character) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISFOO_LC + +STATIC bool +S_isFOO_utf8_lc(pTHX_ const U8 classnum, const U8 *character, const U8 *e) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISFOO_UTF8_LC \ + assert(character); assert(e) + +STATIC bool +S_isGCB(pTHX_ const GCB_enum before, const GCB_enum after, const U8 * const strbeg, const U8 * const curpos, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISGCB \ + assert(strbeg); assert(curpos) + +STATIC bool +S_isLB(pTHX_ LB_enum before, LB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISLB \ + assert(strbeg); assert(curpos); assert(strend) + +STATIC bool +S_isSB(pTHX_ SB_enum before, SB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISSB \ + assert(strbeg); assert(curpos); assert(strend) + +STATIC bool +S_isWB(pTHX_ WB_enum previous, WB_enum before, WB_enum after, const U8 * const strbeg, const U8 * const curpos, const U8 * const strend, const bool utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISWB \ + assert(strbeg); assert(curpos); assert(strend) + +STATIC I32 +S_reg_check_named_buff_matched(const regexp *rex, const regnode *scan) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REG_CHECK_NAMED_BUFF_MATCHED \ + assert(rex); assert(scan) + +STATIC void +S_regcp_restore(pTHX_ regexp *rex, I32 ix, U32 *maxopenparen_p comma_pDEPTH); +# define PERL_ARGS_ASSERT_REGCP_RESTORE \ + assert(rex); assert(maxopenparen_p) + +STATIC void +S_regcppop(pTHX_ regexp *rex, U32 *maxopenparen_p comma_pDEPTH); +# define PERL_ARGS_ASSERT_REGCPPOP \ + assert(rex); assert(maxopenparen_p) + +STATIC CHECKPOINT +S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxopenparen comma_pDEPTH); +# define PERL_ARGS_ASSERT_REGCPPUSH \ + assert(rex) + +STATIC U8 * +S_reghop3(U8 *s, SSize_t off, const U8 *lim) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGHOP3 \ + assert(s); assert(lim) + +STATIC U8 * +S_reghop4(U8 *s, SSize_t off, const U8 *llim, const U8 *rlim) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGHOP4 \ + assert(s); assert(llim); assert(rlim) + +STATIC U8 * +S_reghopmaybe3(U8 *s, SSize_t off, const U8 * const lim) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGHOPMAYBE3 \ + assert(s); assert(lim) + +STATIC bool +S_reginclass(pTHX_ regexp * const prog, const regnode * const n, const U8 * const p, const U8 * const p_end, bool const utf8_target) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGINCLASS \ + assert(n); assert(p); assert(p_end) + +STATIC SSize_t +S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGMATCH \ + assert(reginfo); assert(startpos); assert(prog) + +STATIC I32 +S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p, char *loceol, regmatch_info * const reginfo, I32 max comma_pDEPTH) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGREPEAT \ + assert(prog); assert(startposp); assert(p); assert(loceol); assert(reginfo); \ + assert(max) + +STATIC bool +S_regtry(pTHX_ regmatch_info *reginfo, char **startposp) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGTRY \ + assert(reginfo); assert(startposp) + +STATIC bool +S_to_byte_substr(pTHX_ regexp *prog); +# define PERL_ARGS_ASSERT_TO_BYTE_SUBSTR \ + assert(prog) + +STATIC void +S_to_utf8_substr(pTHX_ regexp *prog); +# define PERL_ARGS_ASSERT_TO_UTF8_SUBSTR \ + assert(prog) + +# if defined(DEBUGGING) +STATIC void +S_debug_start_match(pTHX_ const REGEXP *prog, const bool do_utf8, const char *start, const char *end, const char *blurb); +# define PERL_ARGS_ASSERT_DEBUG_START_MATCH \ + assert(prog); assert(start); assert(end); assert(blurb) + +STATIC void +S_dump_exec_pos(pTHX_ const char *locinput, const regnode *scan, const char *loc_regeol, const char *loc_bostr, const char *loc_reg_starttry, const bool do_utf8, const U32 depth); +# define PERL_ARGS_ASSERT_DUMP_EXEC_POS \ + assert(locinput); assert(scan); assert(loc_regeol); assert(loc_bostr); \ + assert(loc_reg_starttry) + +PERL_CALLCONV int +Perl_re_exec_indentf(pTHX_ const char *fmt, U32 depth, ...) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_RE_EXEC_INDENTF \ + assert(fmt) + +# endif /* defined(DEBUGGING) */ +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE void +S_capture_clear(pTHX_ regexp *rex, U16 from_ix, U16 to_ix, const char *str comma_pDEPTH); +# define PERL_ARGS_ASSERT_CAPTURE_CLEAR \ + assert(rex); assert(str) + +PERL_STATIC_INLINE I32 +S_foldEQ_latin1_s2_folded(pTHX_ const char *a, const char *b, I32 len); +# define PERL_ARGS_ASSERT_FOLDEQ_LATIN1_S2_FOLDED \ + assert(a); assert(b) + +PERL_STATIC_INLINE void +S_unwind_paren(pTHX_ regexp *rex, U32 lp, U32 lcp comma_pDEPTH); +# define PERL_ARGS_ASSERT_UNWIND_PAREN \ + assert(rex) + +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#endif /* defined(PERL_IN_REGEXEC_C) */ +#if defined(PERL_IN_REGEX_ENGINE) + +# if defined(DEBUGGING) +PERL_CALLCONV void +Perl_debug_peep(pTHX_ const char *str, const RExC_state_t *pRExC_state, regnode *scan, U32 depth, U32 flags) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DEBUG_PEEP \ + assert(str); assert(pRExC_state) + +PERL_CALLCONV void +Perl_debug_show_study_flags(pTHX_ U32 flags, const char *open_str, const char *close_str) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DEBUG_SHOW_STUDY_FLAGS \ + assert(open_str); assert(close_str) + +PERL_CALLCONV void +Perl_debug_studydata(pTHX_ const char *where, scan_data_t *data, U32 depth, int is_inf, SSize_t min, SSize_t stopmin, SSize_t delta) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DEBUG_STUDYDATA \ + assert(where) + +PERL_CALLCONV const regnode * +Perl_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node, const regnode *last, const regnode *plast, SV *sv, I32 indent, U32 depth) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DUMPUNTIL \ + assert(r); assert(start); assert(node); assert(sv) + +PERL_CALLCONV int +Perl_re_indentf(pTHX_ const char *fmt, U32 depth, ...) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_RE_INDENTF \ + assert(fmt) + +PERL_CALLCONV int +Perl_re_printf(pTHX_ const char *fmt, ...) + __attribute__visibility__("hidden") + __attribute__format__(__printf__,pTHX_1,pTHX_2); +# define PERL_ARGS_ASSERT_RE_PRINTF \ + assert(fmt) + +PERL_CALLCONV void +Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_info *reginfo, const RExC_state_t *pRExC_state) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_REGPROP \ + assert(sv); assert(o) + +# endif /* defined(DEBUGGING) */ +# if defined(PERL_EXT_RE_BUILD) +PERL_CALLCONV SV * +Perl_get_re_gclass_aux_data(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp, SV **lonly_utf8_locale, SV **output_invlist) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_GET_RE_GCLASS_AUX_DATA \ + assert(node) + +# else +PERL_CALLCONV SV * +Perl_get_regclass_aux_data(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp, SV **lonly_utf8_locale, SV **output_invlist) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_GET_REGCLASS_AUX_DATA \ + assert(node) + +# endif +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE bool +Perl_check_regnode_after(pTHX_ const regnode *p, const STRLEN extra) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_CHECK_REGNODE_AFTER + +PERL_STATIC_INLINE regnode * +Perl_regnext(pTHX_ const regnode *p) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGNEXT + +PERL_STATIC_INLINE regnode * +Perl_regnode_after(pTHX_ const regnode *p, bool varies) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_REGNODE_AFTER + +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#endif /* defined(PERL_IN_REGEX_ENGINE) */ #if defined(PERL_IN_SCOPE_C) -STATIC void S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2, const int type); -#define PERL_ARGS_ASSERT_SAVE_PUSHPTRI32PTR -STATIC SV* S_save_scalar_at(pTHX_ SV **sptr, const U32 flags); -#define PERL_ARGS_ASSERT_SAVE_SCALAR_AT \ - assert(sptr) -#endif +STATIC void +S_save_pushptri32ptr(pTHX_ void * const ptr1, const I32 i, void * const ptr2, const int type); +# define PERL_ARGS_ASSERT_SAVE_PUSHPTRI32PTR + +STATIC SV * +S_save_scalar_at(pTHX_ SV **sptr, const U32 flags); +# define PERL_ARGS_ASSERT_SAVE_SCALAR_AT \ + assert(sptr) + +#endif /* defined(PERL_IN_SCOPE_C) */ #if defined(PERL_IN_SV_C) -STATIC char * S_F0convert(NV nv, char *const endbuf, STRLEN *const len); -#define PERL_ARGS_ASSERT_F0CONVERT \ - assert(endbuf); assert(len) -STATIC void S_anonymise_cv_maybe(pTHX_ GV *gv, CV *cv); -#define PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE \ - assert(gv); assert(cv) -STATIC void S_assert_uft8_cache_coherent(pTHX_ const char *const func, STRLEN from_cache, STRLEN real, SV *const sv); -#define PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT \ - assert(func); assert(sv) -STATIC bool S_curse(pTHX_ SV * const sv, const bool check_refcnt); -#define PERL_ARGS_ASSERT_CURSE \ - assert(sv) -STATIC STRLEN S_expect_number(pTHX_ const char **const pattern) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_EXPECT_NUMBER \ - assert(pattern) - -STATIC SSize_t S_find_array_subscript(pTHX_ const AV *const av, const SV *const val); -#define PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT \ - assert(val) -STATIC SV * S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val); -#define PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT \ - assert(val) -STATIC SV* S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv, bool match, const char **desc_p); -#define PERL_ARGS_ASSERT_FIND_UNINIT_VAR \ - assert(desc_p) -STATIC bool S_glob_2number(pTHX_ GV* const gv); -#define PERL_ARGS_ASSERT_GLOB_2NUMBER \ - assert(gv) -STATIC void S_glob_assign_glob(pTHX_ SV *const dsv, SV *const ssv, const int dtype); -#define PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB \ - assert(dsv); assert(ssv) -PERL_CALLCONV SV * Perl_more_sv(pTHX); -#define PERL_ARGS_ASSERT_MORE_SV -STATIC void S_not_a_number(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_NOT_A_NUMBER \ - assert(sv) -STATIC void S_not_incrementable(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_NOT_INCREMENTABLE \ - assert(sv) -STATIC PTR_TBL_ENT_t * S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PTR_TABLE_FIND \ - assert(tbl) - -STATIC bool S_sv_2iuv_common(pTHX_ SV *const sv); -#define PERL_ARGS_ASSERT_SV_2IUV_COMMON \ - assert(sv) -STATIC void S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags); -#define PERL_ARGS_ASSERT_SV_ADD_ARENA \ - assert(ptr) -STATIC const char * S_sv_display(pTHX_ SV *const sv, char *tmpbuf, STRLEN tmpbuf_size); -#define PERL_ARGS_ASSERT_SV_DISPLAY \ - assert(sv); assert(tmpbuf) -STATIC STRLEN S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target, const U8 *end, STRLEN endu); -#define PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY \ - assert(s); assert(target); assert(end) -STATIC STRLEN S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start, const U8 *const send, STRLEN uoffset, STRLEN uoffset0, STRLEN boffset0); -#define PERL_ARGS_ASSERT_SV_POS_U2B_CACHED \ - assert(sv); assert(mgp); assert(start); assert(send) -STATIC STRLEN S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send, STRLEN *const uoffset, bool *const at_end, bool *canonical_position); -#define PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS \ - assert(start); assert(send); assert(uoffset); assert(at_end); assert(canonical_position) -STATIC STRLEN S_sv_pos_u2b_midway(const U8 *const start, const U8 *send, STRLEN uoffset, const STRLEN uend); -#define PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY \ - assert(start); assert(send) -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE void S_sv_unglob(pTHX_ SV *const sv, U32 flags); -#define PERL_ARGS_ASSERT_SV_UNGLOB \ - assert(sv) -#endif -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE char * S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_UIV_2BUF \ - assert(buf); assert(peob) -#endif - -STATIC void S_utf8_mg_len_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN ulen); -#define PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE \ - assert(sv); assert(mgp) -STATIC void S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte, const STRLEN utf8, const STRLEN blen); -#define PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE \ - assert(sv); assert(mgp) -STATIC I32 S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask); -#define PERL_ARGS_ASSERT_VISIT \ - assert(f) -# if defined(USE_ITHREADS) -STATIC SV* S_sv_dup_common(pTHX_ const SV *const ssv, CLONE_PARAMS *const param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DUP_COMMON \ - assert(ssv); assert(param) - -STATIC SV ** S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest, SSize_t items, CLONE_PARAMS *const param); -#define PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE \ - assert(source); assert(dest); assert(param) -STATIC void S_unreferenced_to_tmp_stack(pTHX_ AV *const unreferenced); -#define PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK \ - assert(unreferenced) -# endif -#endif -#if defined(PERL_IN_SV_C) || defined (PERL_IN_OP_C) -PERL_CALLCONV SV * Perl_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ, const SV *const keyname, SSize_t aindex, int subscript_type) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_VARNAME +STATIC char * +S_F0convert(NV nv, char * const endbuf, STRLEN * const len); +# define PERL_ARGS_ASSERT_F0CONVERT \ + assert(endbuf); assert(len) + +STATIC void +S_anonymise_cv_maybe(pTHX_ GV *gv, CV *cv); +# define PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE \ + assert(gv); assert(cv) + +STATIC void +S_assert_uft8_cache_coherent(pTHX_ const char * const func, STRLEN from_cache, STRLEN real, SV * const sv); +# define PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT \ + assert(func); assert(sv) + +STATIC bool +S_curse(pTHX_ SV * const sv, const bool check_refcnt); +# define PERL_ARGS_ASSERT_CURSE \ + assert(sv) + +STATIC STRLEN +S_expect_number(pTHX_ const char ** const pattern) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_EXPECT_NUMBER \ + assert(pattern) + +STATIC SSize_t +S_find_array_subscript(pTHX_ const AV * const av, const SV * const val); +# define PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT \ + assert(val) + +STATIC SV * +S_find_hash_subscript(pTHX_ const HV * const hv, const SV * const val); +# define PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT \ + assert(val) + +STATIC SV * +S_find_uninit_var(pTHX_ const OP * const obase, const SV * const uninit_sv, bool match, const char **desc_p); +# define PERL_ARGS_ASSERT_FIND_UNINIT_VAR \ + assert(desc_p) + +STATIC bool +S_glob_2number(pTHX_ GV * const gv); +# define PERL_ARGS_ASSERT_GLOB_2NUMBER \ + assert(gv) + +STATIC void +S_glob_assign_glob(pTHX_ SV * const dsv, SV * const ssv, const int dtype); +# define PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB \ + assert(dsv); assert(ssv) + +PERL_CALLCONV SV * +Perl_more_sv(pTHX); +# define PERL_ARGS_ASSERT_MORE_SV + +STATIC void +S_not_a_number(pTHX_ SV * const sv); +# define PERL_ARGS_ASSERT_NOT_A_NUMBER \ + assert(sv) + +STATIC void +S_not_incrementable(pTHX_ SV * const sv); +# define PERL_ARGS_ASSERT_NOT_INCREMENTABLE \ + assert(sv) + +STATIC PTR_TBL_ENT_t * +S_ptr_table_find(PTR_TBL_t * const tbl, const void * const sv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_PTR_TABLE_FIND \ + assert(tbl) + +STATIC bool +S_sv_2iuv_common(pTHX_ SV * const sv); +# define PERL_ARGS_ASSERT_SV_2IUV_COMMON \ + assert(sv) + +STATIC void +S_sv_add_arena(pTHX_ char * const ptr, const U32 size, const U32 flags); +# define PERL_ARGS_ASSERT_SV_ADD_ARENA \ + assert(ptr) + +STATIC const char * +S_sv_display(pTHX_ SV * const sv, char *tmpbuf, STRLEN tmpbuf_size); +# define PERL_ARGS_ASSERT_SV_DISPLAY \ + assert(sv); assert(tmpbuf) + +STATIC STRLEN +S_sv_pos_b2u_midway(pTHX_ const U8 * const s, const U8 * const target, const U8 *end, STRLEN endu); +# define PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY \ + assert(s); assert(target); assert(end) + +STATIC STRLEN +S_sv_pos_u2b_cached(pTHX_ SV * const sv, MAGIC ** const mgp, const U8 * const start, const U8 * const send, STRLEN uoffset, STRLEN uoffset0, STRLEN boffset0); +# define PERL_ARGS_ASSERT_SV_POS_U2B_CACHED \ + assert(sv); assert(mgp); assert(start); assert(send) + +STATIC STRLEN +S_sv_pos_u2b_forwards(const U8 * const start, const U8 * const send, STRLEN * const uoffset, bool * const at_end, bool *canonical_position); +# define PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS \ + assert(start); assert(send); assert(uoffset); assert(at_end); assert(canonical_position) + +STATIC STRLEN +S_sv_pos_u2b_midway(const U8 * const start, const U8 *send, STRLEN uoffset, const STRLEN uend); +# define PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY \ + assert(start); assert(send) + +STATIC void +S_utf8_mg_len_cache_update(pTHX_ SV * const sv, MAGIC ** const mgp, const STRLEN ulen); +# define PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE \ + assert(sv); assert(mgp) + +STATIC void +S_utf8_mg_pos_cache_update(pTHX_ SV * const sv, MAGIC ** const mgp, const STRLEN byte, const STRLEN utf8, const STRLEN blen); +# define PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE \ + assert(sv); assert(mgp) + +STATIC I32 +S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask); +# define PERL_ARGS_ASSERT_VISIT \ + assert(f) + +# if defined(DEBUGGING) +STATIC void +S_del_sv(pTHX_ SV *p); +# define PERL_ARGS_ASSERT_DEL_SV \ + assert(p) + +# endif +# if !defined(NV_PRESERVES_UV) +# if defined(DEBUGGING) +STATIC int +S_sv_2iuv_non_preserve(pTHX_ SV * const sv, I32 numtype); +# define PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE \ + assert(sv) + +# else +STATIC int +S_sv_2iuv_non_preserve(pTHX_ SV * const sv); +# define PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE \ + assert(sv) + +# endif +# endif /* !defined(NV_PRESERVES_UV) */ +# if defined(PERL_DEBUG_READONLY_COW) +STATIC void +S_sv_buf_to_rw(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SV_BUF_TO_RW \ + assert(sv) + +# endif +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE void +S_sv_unglob(pTHX_ SV * const sv, U32 flags); +# define PERL_ARGS_ASSERT_SV_UNGLOB \ + assert(sv) + +PERL_STATIC_INLINE char * +S_uiv_2buf(char * const buf, const IV iv, UV uv, const int is_uv, char ** const peob) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_UIV_2BUF \ + assert(buf); assert(peob) + +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +# if defined(USE_ITHREADS) +STATIC SV * +S_sv_dup_common(pTHX_ const SV * const ssv, CLONE_PARAMS * const param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_DUP_COMMON \ + assert(ssv); assert(param) + +STATIC void +S_sv_dup_hvaux(pTHX_ const SV * const ssv, SV *dsv, CLONE_PARAMS * const param); +# define PERL_ARGS_ASSERT_SV_DUP_HVAUX \ + assert(ssv); assert(dsv); assert(param) + +STATIC SV ** +S_sv_dup_inc_multiple(pTHX_ SV * const *source, SV **dest, SSize_t items, CLONE_PARAMS * const param); +# define PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE \ + assert(source); assert(dest); assert(param) + +STATIC void +S_unreferenced_to_tmp_stack(pTHX_ AV * const unreferenced); +# define PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK \ + assert(unreferenced) -#endif +# endif /* defined(USE_ITHREADS) */ +#endif /* defined(PERL_IN_SV_C) */ #if defined(PERL_IN_TOKE_C) -STATIC int S_ao(pTHX_ int toketype); -#define PERL_ARGS_ASSERT_AO -STATIC void S_check_uni(pTHX); -#define PERL_ARGS_ASSERT_CHECK_UNI -STATIC void S_checkcomma(pTHX_ const char *s, const char *name, const char *what); -#define PERL_ARGS_ASSERT_CHECKCOMMA \ - assert(s); assert(name); assert(what) -STATIC char * S_filter_gets(pTHX_ SV *sv, STRLEN append) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_FILTER_GETS \ - assert(sv) - -STATIC HV * S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_FIND_IN_MY_STASH \ - assert(pkgname) - -STATIC void S_force_ident(pTHX_ const char *s, int kind); -#define PERL_ARGS_ASSERT_FORCE_IDENT \ - assert(s) -STATIC void S_force_ident_maybe_lex(pTHX_ char pit); -#define PERL_ARGS_ASSERT_FORCE_IDENT_MAYBE_LEX -STATIC void S_force_next(pTHX_ I32 type); -#define PERL_ARGS_ASSERT_FORCE_NEXT -STATIC char* S_force_strict_version(pTHX_ char *s); -#define PERL_ARGS_ASSERT_FORCE_STRICT_VERSION \ - assert(s) -STATIC char* S_force_version(pTHX_ char *s, int guessing); -#define PERL_ARGS_ASSERT_FORCE_VERSION \ - assert(s) -STATIC char* S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack); -#define PERL_ARGS_ASSERT_FORCE_WORD \ - assert(start) -STATIC SV* S_get_and_check_backslash_N_name_wrapper(pTHX_ const char* s, const char* const e) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GET_AND_CHECK_BACKSLASH_N_NAME_WRAPPER \ - assert(s); assert(e) - -STATIC void S_incline(pTHX_ const char *s, const char *end); -#define PERL_ARGS_ASSERT_INCLINE \ - assert(s); assert(end) -STATIC int S_intuit_method(pTHX_ char *s, SV *ioname, CV *cv); -#define PERL_ARGS_ASSERT_INTUIT_METHOD \ - assert(s) -STATIC int S_intuit_more(pTHX_ char *s, char *e); -#define PERL_ARGS_ASSERT_INTUIT_MORE \ - assert(s); assert(e) -STATIC I32 S_lop(pTHX_ I32 f, U8 x, char *s); -#define PERL_ARGS_ASSERT_LOP \ - assert(s) -PERL_STATIC_NO_RET void S_missingterm(pTHX_ char *s, STRLEN len) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_MISSINGTERM - -STATIC SV* S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen, SV *sv, SV *pv, const char *type, STRLEN typelen, const char ** error_msg); -#define PERL_ARGS_ASSERT_NEW_CONSTANT \ - assert(key); assert(sv) -STATIC void S_no_op(pTHX_ const char *const what, char *s); -#define PERL_ARGS_ASSERT_NO_OP \ - assert(what) -STATIC void S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_package, bool is_utf8, bool check_dollar, bool tick_warn); -#define PERL_ARGS_ASSERT_PARSE_IDENT \ - assert(s); assert(d); assert(e) -STATIC int S_pending_ident(pTHX); -#define PERL_ARGS_ASSERT_PENDING_IDENT -STATIC char* S_scan_const(pTHX_ char *start) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SCAN_CONST \ - assert(start) - -STATIC char* S_scan_formline(pTHX_ char *s) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SCAN_FORMLINE \ - assert(s) - -STATIC char* S_scan_heredoc(pTHX_ char *s) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SCAN_HEREDOC \ - assert(s) - -STATIC char* S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni); -#define PERL_ARGS_ASSERT_SCAN_IDENT \ - assert(s); assert(dest) -STATIC char* S_scan_inputsymbol(pTHX_ char *start) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL \ - assert(start) - -STATIC char* S_scan_pat(pTHX_ char *start, I32 type) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SCAN_PAT \ - assert(start) - -STATIC char* S_scan_subst(pTHX_ char *start) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SCAN_SUBST \ - assert(start) - -STATIC char* S_scan_trans(pTHX_ char *start) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SCAN_TRANS \ - assert(start) - -STATIC I32 S_sublex_done(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SUBLEX_DONE - -STATIC I32 S_sublex_push(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SUBLEX_PUSH - -STATIC I32 S_sublex_start(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SUBLEX_START - -STATIC char* S_swallow_bom(pTHX_ U8 *s) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SWALLOW_BOM \ - assert(s) - -STATIC char * S_tokenize_use(pTHX_ int is_use, char *s) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_TOKENIZE_USE \ - assert(s) - -STATIC SV* S_tokeq(pTHX_ SV *sv); -#define PERL_ARGS_ASSERT_TOKEQ \ - assert(sv) -STATIC void S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len); -#define PERL_ARGS_ASSERT_UPDATE_DEBUGGER_INFO -STATIC int S_yywarn(pTHX_ const char *const s, U32 flags); -#define PERL_ARGS_ASSERT_YYWARN \ - assert(s) -#endif +STATIC int +S_ao(pTHX_ int toketype); +# define PERL_ARGS_ASSERT_AO + +STATIC void +S_check_uni(pTHX); +# define PERL_ARGS_ASSERT_CHECK_UNI + +STATIC void +S_checkcomma(pTHX_ const char *s, const char *name, const char *what); +# define PERL_ARGS_ASSERT_CHECKCOMMA \ + assert(s); assert(name); assert(what) + +STATIC char * +S_filter_gets(pTHX_ SV *sv, STRLEN append) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_FILTER_GETS \ + assert(sv) + +STATIC HV * +S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_FIND_IN_MY_STASH \ + assert(pkgname) + +STATIC void +S_force_ident(pTHX_ const char *s, int kind); +# define PERL_ARGS_ASSERT_FORCE_IDENT \ + assert(s) + +STATIC void +S_force_ident_maybe_lex(pTHX_ char pit); +# define PERL_ARGS_ASSERT_FORCE_IDENT_MAYBE_LEX + +STATIC void +S_force_next(pTHX_ I32 type); +# define PERL_ARGS_ASSERT_FORCE_NEXT + +STATIC char * +S_force_strict_version(pTHX_ char *s); +# define PERL_ARGS_ASSERT_FORCE_STRICT_VERSION \ + assert(s) + +STATIC char * +S_force_version(pTHX_ char *s, int guessing); +# define PERL_ARGS_ASSERT_FORCE_VERSION \ + assert(s) + +STATIC char * +S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack); +# define PERL_ARGS_ASSERT_FORCE_WORD \ + assert(start) + +STATIC SV * +S_get_and_check_backslash_N_name_wrapper(pTHX_ const char *s, const char * const e) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GET_AND_CHECK_BACKSLASH_N_NAME_WRAPPER \ + assert(s); assert(e) + +STATIC void +S_incline(pTHX_ const char *s, const char *end); +# define PERL_ARGS_ASSERT_INCLINE \ + assert(s); assert(end) + +STATIC int +S_intuit_method(pTHX_ char *s, SV *ioname, CV *cv); +# define PERL_ARGS_ASSERT_INTUIT_METHOD \ + assert(s) + +STATIC int +S_intuit_more(pTHX_ char *s, char *e); +# define PERL_ARGS_ASSERT_INTUIT_MORE \ + assert(s); assert(e) + +STATIC I32 +S_lop(pTHX_ I32 f, U8 x, char *s); +# define PERL_ARGS_ASSERT_LOP \ + assert(s) + +PERL_STATIC_NO_RET void +S_missingterm(pTHX_ char *s, STRLEN len) + __attribute__noreturn__; +# define PERL_ARGS_ASSERT_MISSINGTERM + +STATIC SV * +S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen, SV *sv, SV *pv, const char *type, STRLEN typelen, const char **error_msg); +# define PERL_ARGS_ASSERT_NEW_CONSTANT \ + assert(key); assert(sv) + +STATIC void +S_no_op(pTHX_ const char * const what, char *s); +# define PERL_ARGS_ASSERT_NO_OP \ + assert(what) + +STATIC void +S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_package, bool is_utf8, bool check_dollar, bool tick_warn); +# define PERL_ARGS_ASSERT_PARSE_IDENT \ + assert(s); assert(d); assert(e) + +STATIC int +S_pending_ident(pTHX); +# define PERL_ARGS_ASSERT_PENDING_IDENT + +STATIC char * +S_scan_const(pTHX_ char *start) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SCAN_CONST \ + assert(start) + +STATIC char * +S_scan_formline(pTHX_ char *s) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SCAN_FORMLINE \ + assert(s) + +STATIC char * +S_scan_heredoc(pTHX_ char *s) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SCAN_HEREDOC \ + assert(s) + +STATIC char * +S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni); +# define PERL_ARGS_ASSERT_SCAN_IDENT \ + assert(s); assert(dest) + +STATIC char * +S_scan_inputsymbol(pTHX_ char *start) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL \ + assert(start) + +STATIC char * +S_scan_pat(pTHX_ char *start, I32 type) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SCAN_PAT \ + assert(start) + +STATIC char * +S_scan_subst(pTHX_ char *start) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SCAN_SUBST \ + assert(start) + +STATIC char * +S_scan_trans(pTHX_ char *start) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SCAN_TRANS \ + assert(start) + +STATIC I32 +S_sublex_done(pTHX) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SUBLEX_DONE + +STATIC I32 +S_sublex_push(pTHX) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SUBLEX_PUSH + +STATIC I32 +S_sublex_start(pTHX) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SUBLEX_START + +STATIC char * +S_swallow_bom(pTHX_ U8 *s) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SWALLOW_BOM \ + assert(s) + +STATIC char * +S_tokenize_use(pTHX_ int is_use, char *s) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_TOKENIZE_USE \ + assert(s) + +STATIC SV * +S_tokeq(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_TOKEQ \ + assert(sv) + +STATIC void +S_update_debugger_info(pTHX_ SV *orig_sv, const char * const buf, STRLEN len); +# define PERL_ARGS_ASSERT_UPDATE_DEBUGGER_INFO + +STATIC int +S_yywarn(pTHX_ const char * const s, U32 flags); +# define PERL_ARGS_ASSERT_YYWARN \ + assert(s) + +# if defined(DEBUGGING) +STATIC void +S_printbuf(pTHX_ const char * const fmt, const char * const s) + __attribute__format__(__printf__,pTHX_1,0); +# define PERL_ARGS_ASSERT_PRINTBUF \ + assert(fmt); assert(s) + +STATIC int +S_tokereport(pTHX_ I32 rv, const YYSTYPE *lvalp); +# define PERL_ARGS_ASSERT_TOKEREPORT \ + assert(lvalp) + +# endif /* defined(DEBUGGING) */ +# if defined(PERL_CR_FILTER) +STATIC I32 +S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen); +# define PERL_ARGS_ASSERT_CR_TEXTFILTER + +STATIC void +S_strip_return(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_STRIP_RETURN \ + assert(sv) + +# endif /* defined(PERL_CR_FILTER) */ +# if !defined(PERL_NO_UTF16_FILTER) +STATIC U8 * +S_add_utf16_textfilter(pTHX_ U8 * const s, bool reversed); +# define PERL_ARGS_ASSERT_ADD_UTF16_TEXTFILTER \ + assert(s) + +STATIC I32 +S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen); +# define PERL_ARGS_ASSERT_UTF16_TEXTFILTER \ + assert(sv) + +# endif /* !defined(PERL_NO_UTF16_FILTER) */ +#endif /* defined(PERL_IN_TOKE_C) */ #if defined(PERL_IN_UNIVERSAL_C) -STATIC bool S_isa_lookup(pTHX_ HV *stash, SV *namesv, const char * name, STRLEN len, U32 flags); -STATIC bool S_sv_derived_from_svpvn(pTHX_ SV *sv, SV *namesv, const char * name, const STRLEN len, U32 flags); +STATIC bool +S_isa_lookup(pTHX_ HV *stash, SV *namesv, const char *name, STRLEN len, U32 flags); + +STATIC bool +S_sv_derived_from_svpvn(pTHX_ SV *sv, SV *namesv, const char *name, const STRLEN len, U32 flags); + #endif #if defined(PERL_IN_UTF8_C) -STATIC UV S__to_utf8_case(pTHX_ const UV original, const U8 *p, U8* ustrp, STRLEN *lenp, SV *invlist, const I32 * const invmap, const U32 * const * const aux_tables, const U8 * const aux_table_lengths, const char * const normal); -#define PERL_ARGS_ASSERT__TO_UTF8_CASE \ - assert(ustrp); assert(lenp); assert(invlist); assert(invmap); assert(normal) -STATIC UV S_check_locale_boundary_crossing(pTHX_ const U8* const p, const UV result, U8* const ustrp, STRLEN *lenp) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CHECK_LOCALE_BOUNDARY_CROSSING \ - assert(p); assert(ustrp); assert(lenp) - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE int S_does_utf8_overflow(const U8 * const s, const U8 * e, const bool consider_overlongs) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DOES_UTF8_OVERFLOW \ - assert(s); assert(e) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE int S_isFF_overlong(const U8 * const s, const STRLEN len) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ISFF_OVERLONG \ - assert(s) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE bool S_is_utf8_common(pTHX_ const U8 *const p, const U8 *const e, SV* const invlist) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_UTF8_COMMON \ - assert(p); assert(e) -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE int S_is_utf8_overlong(const U8 * const s, const STRLEN len) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_IS_UTF8_OVERLONG \ - assert(s) -#endif - -STATIC HV * S_new_msg_hv(pTHX_ const char * const message, U32 categories, U32 flag) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEW_MSG_HV \ - assert(message) - -STATIC UV S_to_case_cp_list(pTHX_ const UV original, const U32 ** const remaining_list, Size_t * remaining_count, SV *invlist, const I32 * const invmap, const U32 * const * const aux_tables, const U8 * const aux_table_lengths, const char * const normal); -#define PERL_ARGS_ASSERT_TO_CASE_CP_LIST \ - assert(invlist); assert(invmap); assert(normal) -STATIC U8 S_to_lower_latin1(const U8 c, U8 *p, STRLEN *lenp, const char dummy) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_TO_LOWER_LATIN1 - -STATIC UV S_turkic_fc(pTHX_ const U8 * const p, const U8 * const e, U8* ustrp, STRLEN *lenp); -#define PERL_ARGS_ASSERT_TURKIC_FC \ - assert(p); assert(e); assert(ustrp); assert(lenp) -STATIC UV S_turkic_lc(pTHX_ const U8 * const p0, const U8 * const e, U8* ustrp, STRLEN *lenp); -#define PERL_ARGS_ASSERT_TURKIC_LC \ - assert(p0); assert(e); assert(ustrp); assert(lenp) -STATIC UV S_turkic_uc(pTHX_ const U8 * const p, const U8 * const e, U8* ustrp, STRLEN *lenp); -#define PERL_ARGS_ASSERT_TURKIC_UC \ - assert(p); assert(e); assert(ustrp); assert(lenp) -STATIC char * S_unexpected_non_continuation_text(pTHX_ const U8 * const s, STRLEN print_len, const STRLEN non_cont_byte_pos, const STRLEN expect_len) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_UNEXPECTED_NON_CONTINUATION_TEXT \ - assert(s) - -#endif -#if defined(PERL_IN_UTF8_C) || defined(PERL_IN_PP_C) -PERL_CALLCONV UV Perl__to_upper_title_latin1(pTHX_ const U8 c, U8 *p, STRLEN *lenp, const char S_or_s); -#define PERL_ARGS_ASSERT__TO_UPPER_TITLE_LATIN1 \ - assert(p); assert(lenp) -#endif +STATIC UV +S__to_utf8_case(pTHX_ const UV original, const U8 *p, U8 *ustrp, STRLEN *lenp, SV *invlist, const I32 * const invmap, const U32 * const * const aux_tables, const U8 * const aux_table_lengths, const char * const normal); +# define PERL_ARGS_ASSERT__TO_UTF8_CASE \ + assert(ustrp); assert(lenp); assert(invlist); assert(invmap); assert(normal) + +STATIC UV +S_check_locale_boundary_crossing(pTHX_ const U8 * const p, const UV result, U8 * const ustrp, STRLEN *lenp) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_CHECK_LOCALE_BOUNDARY_CROSSING \ + assert(p); assert(ustrp); assert(lenp) + +STATIC HV * +S_new_msg_hv(pTHX_ const char * const message, U32 categories, U32 flag) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEW_MSG_HV \ + assert(message) + +STATIC UV +S_to_case_cp_list(pTHX_ const UV original, const U32 ** const remaining_list, Size_t *remaining_count, SV *invlist, const I32 * const invmap, const U32 * const * const aux_tables, const U8 * const aux_table_lengths, const char * const normal); +# define PERL_ARGS_ASSERT_TO_CASE_CP_LIST \ + assert(invlist); assert(invmap); assert(normal) + +STATIC U8 +S_to_lower_latin1(const U8 c, U8 *p, STRLEN *lenp, const char dummy) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_TO_LOWER_LATIN1 + +STATIC UV +S_turkic_fc(pTHX_ const U8 * const p, const U8 * const e, U8 *ustrp, STRLEN *lenp); +# define PERL_ARGS_ASSERT_TURKIC_FC \ + assert(p); assert(e); assert(ustrp); assert(lenp) + +STATIC UV +S_turkic_lc(pTHX_ const U8 * const p0, const U8 * const e, U8 *ustrp, STRLEN *lenp); +# define PERL_ARGS_ASSERT_TURKIC_LC \ + assert(p0); assert(e); assert(ustrp); assert(lenp) + +STATIC UV +S_turkic_uc(pTHX_ const U8 * const p, const U8 * const e, U8 *ustrp, STRLEN *lenp); +# define PERL_ARGS_ASSERT_TURKIC_UC \ + assert(p); assert(e); assert(ustrp); assert(lenp) + +STATIC char * +S_unexpected_non_continuation_text(pTHX_ const U8 * const s, STRLEN print_len, const STRLEN non_cont_byte_pos, const STRLEN expect_len) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_UNEXPECTED_NON_CONTINUATION_TEXT \ + assert(s) + +# if 0 +STATIC void +S_warn_on_first_deprecated_use(pTHX_ U32 category, const char * const name, const char * const alternative, const bool use_locale, const char * const file, const unsigned line); +# define PERL_ARGS_ASSERT_WARN_ON_FIRST_DEPRECATED_USE \ + assert(name); assert(alternative); assert(file) + +# endif +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE int +S_does_utf8_overflow(const U8 * const s, const U8 *e, const bool consider_overlongs) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DOES_UTF8_OVERFLOW \ + assert(s); assert(e) + +PERL_STATIC_INLINE int +S_isFF_overlong(const U8 * const s, const STRLEN len) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISFF_OVERLONG \ + assert(s) + +PERL_STATIC_INLINE bool +S_is_utf8_common(pTHX_ const U8 * const p, const U8 * const e, SV * const invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_IS_UTF8_COMMON \ + assert(p); assert(e) + +PERL_STATIC_INLINE int +S_is_utf8_overlong(const U8 * const s, const STRLEN len) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_IS_UTF8_OVERLONG \ + assert(s) + +# endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ +#endif /* defined(PERL_IN_UTF8_C) */ #if defined(PERL_IN_UTIL_C) -STATIC bool S_ckwarn_common(pTHX_ U32 w); -#define PERL_ARGS_ASSERT_CKWARN_COMMON -STATIC bool S_invoke_exception_hook(pTHX_ SV *ex, bool warn); -#define PERL_ARGS_ASSERT_INVOKE_EXCEPTION_HOOK -STATIC SV* S_mess_alloc(pTHX); -#define PERL_ARGS_ASSERT_MESS_ALLOC -STATIC SV * S_with_queued_errors(pTHX_ SV *ex); -#define PERL_ARGS_ASSERT_WITH_QUEUED_ERRORS \ - assert(ex) -STATIC void S_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p, STRLEN xs_len); -#define PERL_ARGS_ASSERT_XS_VERSION_BOOTCHECK \ - assert(xs_p) -# if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL) -STATIC void S_mem_log_common(enum mem_log_type mlt, const UV n, const UV typesize, const char *type_name, const SV *sv, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname); -#define PERL_ARGS_ASSERT_MEM_LOG_COMMON \ - assert(type_name); assert(filename); assert(funcname) -# endif -#endif +STATIC bool +S_ckwarn_common(pTHX_ U32 w); +# define PERL_ARGS_ASSERT_CKWARN_COMMON + +STATIC SV * +S_mess_alloc(pTHX); +# define PERL_ARGS_ASSERT_MESS_ALLOC + +STATIC SV * +S_with_queued_errors(pTHX_ SV *ex); +# define PERL_ARGS_ASSERT_WITH_QUEUED_ERRORS \ + assert(ex) + +STATIC void +S_xs_version_bootcheck(pTHX_ U32 items, U32 ax, const char *xs_p, STRLEN xs_len); +# define PERL_ARGS_ASSERT_XS_VERSION_BOOTCHECK \ + assert(xs_p) + +# if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL) +STATIC void +S_mem_log_common(enum mem_log_type mlt, const UV n, const UV typesize, const char *type_name, const SV *sv, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname); +# define PERL_ARGS_ASSERT_MEM_LOG_COMMON \ + assert(type_name); assert(filename); assert(funcname) + +# endif +# if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE U32 +S_ptr_hash(PTRV u); +# define PERL_ARGS_ASSERT_PTR_HASH + +# endif +# if defined(PERL_USES_PL_PIDSTATUS) +STATIC void +S_pidgone(pTHX_ Pid_t pid, int status); +# define PERL_ARGS_ASSERT_PIDGONE + +# endif +#endif /* defined(PERL_IN_UTIL_C) */ #if defined(PERL_MEM_LOG) -PERL_CALLCONV Malloc_t Perl_mem_log_alloc(const UV nconst, UV typesize, const char *type_name, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname); -#define PERL_ARGS_ASSERT_MEM_LOG_ALLOC \ - assert(type_name); assert(filename); assert(funcname) -PERL_CALLCONV void Perl_mem_log_del_sv(const SV *sv, const char *filename, int linenumber, const char *funcname); -#define PERL_ARGS_ASSERT_MEM_LOG_DEL_SV \ - assert(sv); assert(filename); assert(funcname) -PERL_CALLCONV Malloc_t Perl_mem_log_free(Malloc_t oldalloc, const char *filename, const int linenumber, const char *funcname); -#define PERL_ARGS_ASSERT_MEM_LOG_FREE \ - assert(filename); assert(funcname) -PERL_CALLCONV void Perl_mem_log_new_sv(const SV *sv, const char *filename, int linenumber, const char *funcname); -#define PERL_ARGS_ASSERT_MEM_LOG_NEW_SV \ - assert(sv); assert(filename); assert(funcname) -PERL_CALLCONV Malloc_t Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname); -#define PERL_ARGS_ASSERT_MEM_LOG_REALLOC \ - assert(type_name); assert(filename); assert(funcname) -#endif -#if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C) -STATIC void S_pidgone(pTHX_ Pid_t pid, int status); -#define PERL_ARGS_ASSERT_PIDGONE -#endif +PERL_CALLCONV Malloc_t +Perl_mem_log_alloc(const UV nconst, UV typesize, const char *type_name, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname); +# define PERL_ARGS_ASSERT_MEM_LOG_ALLOC \ + assert(type_name); assert(filename); assert(funcname) + +PERL_CALLCONV void +Perl_mem_log_del_sv(const SV *sv, const char *filename, int linenumber, const char *funcname); +# define PERL_ARGS_ASSERT_MEM_LOG_DEL_SV \ + assert(sv); assert(filename); assert(funcname) + +PERL_CALLCONV Malloc_t +Perl_mem_log_free(Malloc_t oldalloc, const char *filename, const int linenumber, const char *funcname); +# define PERL_ARGS_ASSERT_MEM_LOG_FREE \ + assert(filename); assert(funcname) + +PERL_CALLCONV void +Perl_mem_log_new_sv(const SV *sv, const char *filename, int linenumber, const char *funcname); +# define PERL_ARGS_ASSERT_MEM_LOG_NEW_SV \ + assert(sv); assert(filename); assert(funcname) + +PERL_CALLCONV Malloc_t +Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname); +# define PERL_ARGS_ASSERT_MEM_LOG_REALLOC \ + assert(type_name); assert(filename); assert(funcname) + +#endif /* defined(PERL_MEM_LOG) */ +#if !defined(PERL_NO_INLINE_FUNCTIONS) +PERL_STATIC_INLINE I32 * +Perl_CvDEPTH(const CV * const sv); +# define PERL_ARGS_ASSERT_CVDEPTH \ + assert(sv) + +PERL_STATIC_INLINE GV * +Perl_CvGV(pTHX_ CV *sv); +# define PERL_ARGS_ASSERT_CVGV \ + assert(sv) + +PERL_STATIC_INLINE I32 +Perl_POPMARK(pTHX); +# define PERL_ARGS_ASSERT_POPMARK + +PERL_STATIC_INLINE struct regexp * +Perl_ReANY(const REGEXP * const re); +# define PERL_ARGS_ASSERT_REANY \ + assert(re) + +PERL_STATIC_INLINE void +Perl_SvAMAGIC_off(SV *sv); +# define PERL_ARGS_ASSERT_SVAMAGIC_OFF \ + assert(sv) + +PERL_STATIC_INLINE void +Perl_SvAMAGIC_on(SV *sv); +# define PERL_ARGS_ASSERT_SVAMAGIC_ON \ + assert(sv) + +PERL_STATIC_INLINE void +Perl_SvGETMAGIC(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVGETMAGIC \ + assert(sv) + +PERL_STATIC_INLINE IV +Perl_SvIV(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVIV \ + assert(sv) + +PERL_STATIC_INLINE IV +Perl_SvIV_nomg(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVIV_NOMG \ + assert(sv) + +PERL_STATIC_INLINE NV +Perl_SvNV(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVNV \ + assert(sv) + +PERL_STATIC_INLINE NV +Perl_SvNV_nomg(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVNV_NOMG \ + assert(sv) + +PERL_STATIC_FORCE_INLINE bool +Perl_SvPVXtrue(pTHX_ SV *sv) + __attribute__always_inline__; +# define PERL_ARGS_ASSERT_SVPVXTRUE \ + assert(sv) + +PERL_STATIC_INLINE void +Perl_SvREFCNT_dec(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVREFCNT_DEC + +PERL_STATIC_INLINE void +Perl_SvREFCNT_dec_NN(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVREFCNT_DEC_NN \ + assert(sv) + +PERL_STATIC_INLINE SV * +Perl_SvREFCNT_dec_ret_NULL(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVREFCNT_DEC_RET_NULL + +PERL_STATIC_INLINE SV * +Perl_SvREFCNT_inc(SV *sv); +# define PERL_ARGS_ASSERT_SVREFCNT_INC + +PERL_STATIC_INLINE SV * +Perl_SvREFCNT_inc_NN(SV *sv); +# define PERL_ARGS_ASSERT_SVREFCNT_INC_NN \ + assert(sv) + +PERL_STATIC_INLINE void +Perl_SvREFCNT_inc_void(SV *sv); +# define PERL_ARGS_ASSERT_SVREFCNT_INC_VOID + +PERL_STATIC_INLINE bool +Perl_SvTRUE(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVTRUE + +PERL_STATIC_INLINE bool +Perl_SvTRUE_NN(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVTRUE_NN \ + assert(sv) + +PERL_STATIC_INLINE bool +Perl_SvTRUE_common(pTHX_ SV *sv, const bool sv_2bool_is_fallback); +# define PERL_ARGS_ASSERT_SVTRUE_COMMON \ + assert(sv) + +PERL_STATIC_INLINE bool +Perl_SvTRUE_nomg(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVTRUE_NOMG + +PERL_STATIC_INLINE UV +Perl_SvUV(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVUV \ + assert(sv) + +PERL_STATIC_INLINE UV +Perl_SvUV_nomg(pTHX_ SV *sv); +# define PERL_ARGS_ASSERT_SVUV_NOMG \ + assert(sv) + +PERL_STATIC_INLINE I32 +Perl_TOPMARK(pTHX); +# define PERL_ARGS_ASSERT_TOPMARK + +PERL_STATIC_INLINE void +Perl_append_utf8_from_native_byte(const U8 byte, U8 **dest); +# define PERL_ARGS_ASSERT_APPEND_UTF8_FROM_NATIVE_BYTE \ + assert(dest) + +PERL_STATIC_INLINE Size_t +Perl_av_count(pTHX_ AV *av) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_AV_COUNT \ + assert(av) + +PERL_STATIC_INLINE SV ** +Perl_av_fetch_simple(pTHX_ AV *av, SSize_t key, I32 lval) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_AV_FETCH_SIMPLE \ + assert(av) + +PERL_STATIC_INLINE AV * +Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_AV_NEW_ALLOC + +PERL_STATIC_INLINE void +Perl_av_push_simple(pTHX_ AV *av, SV *val); +# define PERL_ARGS_ASSERT_AV_PUSH_SIMPLE \ + assert(av); assert(val) + +PERL_STATIC_INLINE SV ** +Perl_av_store_simple(pTHX_ AV *av, SSize_t key, SV *val); +# define PERL_ARGS_ASSERT_AV_STORE_SIMPLE \ + assert(av) + +PERL_STATIC_INLINE I32 +Perl_foldEQ(pTHX_ const char *a, const char *b, I32 len); +# define PERL_ARGS_ASSERT_FOLDEQ \ + assert(a); assert(b) + +PERL_STATIC_INLINE I32 +Perl_foldEQ_latin1(pTHX_ const char *a, const char *b, I32 len); +# define PERL_ARGS_ASSERT_FOLDEQ_LATIN1 \ + assert(a); assert(b) + +PERL_STATIC_INLINE I32 +Perl_foldEQ_locale(pTHX_ const char *a, const char *b, I32 len); +# define PERL_ARGS_ASSERT_FOLDEQ_LOCALE \ + assert(a); assert(b) + +PERL_STATIC_INLINE MGVTBL * +Perl_get_vtbl(pTHX_ int vtbl_id) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GET_VTBL + +PERL_STATIC_INLINE Size_t +Perl_isC9_STRICT_UTF8_CHAR(const U8 * const s0, const U8 * const e) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISC9_STRICT_UTF8_CHAR \ + assert(s0); assert(e) + +PERL_STATIC_INLINE Size_t +Perl_isSTRICT_UTF8_CHAR(const U8 * const s0, const U8 * const e) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISSTRICT_UTF8_CHAR \ + assert(s0); assert(e) + +PERL_STATIC_INLINE Size_t +Perl_isUTF8_CHAR(const U8 * const s0, const U8 * const e) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISUTF8_CHAR \ + assert(s0); assert(e) + +PERL_STATIC_INLINE Size_t +Perl_isUTF8_CHAR_flags(const U8 * const s0, const U8 * const e, const U32 flags) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ISUTF8_CHAR_FLAGS \ + assert(s0); assert(e) + +PERL_STATIC_INLINE bool +Perl_is_c9strict_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el); +# define PERL_ARGS_ASSERT_IS_C9STRICT_UTF8_STRING_LOCLEN \ + assert(s) + +PERL_STATIC_INLINE bool +Perl_is_safe_syscall(pTHX_ const char *pv, STRLEN len, const char *what, const char *op_name) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_IS_SAFE_SYSCALL \ + assert(pv); assert(what); assert(op_name) + +PERL_STATIC_INLINE bool +Perl_is_strict_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el); +# define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING_LOCLEN \ + assert(s) + +PERL_STATIC_INLINE bool +Perl_is_utf8_fixed_width_buf_loclen_flags(const U8 * const s, STRLEN len, const U8 **ep, STRLEN *el, const U32 flags); +# define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_LOCLEN_FLAGS \ + assert(s) + +PERL_STATIC_INLINE bool +Perl_is_utf8_invariant_string_loc(const U8 * const s, STRLEN len, const U8 **ep) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_IS_UTF8_INVARIANT_STRING_LOC \ + assert(s) + +PERL_STATIC_INLINE bool +Perl_is_utf8_string_flags(const U8 *s, STRLEN len, const U32 flags) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_IS_UTF8_STRING_FLAGS \ + assert(s) + +PERL_STATIC_INLINE bool +Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el); +# define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN \ + assert(s) + +PERL_STATIC_INLINE bool +Perl_is_utf8_string_loclen_flags(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el, const U32 flags); +# define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN_FLAGS \ + assert(s) + +PERL_STATIC_INLINE bool +Perl_is_utf8_valid_partial_char_flags(const U8 * const s0, const U8 * const e, const U32 flags) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_IS_UTF8_VALID_PARTIAL_CHAR_FLAGS \ + assert(s0); assert(e) + +PERL_STATIC_INLINE unsigned +Perl_lsbit_pos32(U32 word) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_LSBIT_POS32 + +PERL_STATIC_INLINE char * +Perl_mortal_getenv(const char *str) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MORTAL_GETENV \ + assert(str) + +PERL_STATIC_INLINE unsigned +Perl_msbit_pos32(U32 word) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MSBIT_POS32 + +PERL_STATIC_INLINE OP * +Perl_newPADxVOP(pTHX_ I32 type, I32 flags, PADOFFSET padix) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEWPADXVOP + +PERL_STATIC_INLINE SV * +Perl_newRV_noinc(pTHX_ SV * const tmpRef) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEWRV_NOINC \ + assert(tmpRef) + +PERL_STATIC_INLINE SV * +Perl_newSV_type(pTHX_ const svtype type) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEWSV_TYPE + +PERL_STATIC_FORCE_INLINE SV * +Perl_newSV_type_mortal(pTHX_ const svtype type) + __attribute__warn_unused_result__ + __attribute__always_inline__; +# define PERL_ARGS_ASSERT_NEWSV_TYPE_MORTAL + +PERL_STATIC_INLINE char * +Perl_savepv(pTHX_ const char *pv) + __attribute__malloc__ + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SAVEPV + +PERL_STATIC_INLINE char * +Perl_savepvn(pTHX_ const char *pv, Size_t len) + __attribute__malloc__ + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SAVEPVN + +PERL_STATIC_INLINE char * +Perl_savesharedsvpv(pTHX_ SV *sv) + __attribute__malloc__ + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SAVESHAREDSVPV \ + assert(sv) + +PERL_STATIC_INLINE char * +Perl_savesvpv(pTHX_ SV *sv) + __attribute__malloc__ + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SAVESVPV \ + assert(sv) + +PERL_STATIC_INLINE unsigned +Perl_single_1bit_pos32(U32 word) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SINGLE_1BIT_POS32 + +PERL_STATIC_INLINE bool +Perl_sv_only_taint_gmagic(SV *sv); +# define PERL_ARGS_ASSERT_SV_ONLY_TAINT_GMAGIC \ + assert(sv) + +PERL_STATIC_INLINE char * +Perl_sv_pvbyten_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy); +# define PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE_WRAPPER \ + assert(sv) + +PERL_STATIC_INLINE char * +Perl_sv_pvutf8n_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy); +# define PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE_WRAPPER \ + assert(sv) + +PERL_STATIC_INLINE char * +Perl_sv_setpv_freshbuf(pTHX_ SV * const sv); +# define PERL_ARGS_ASSERT_SV_SETPV_FRESHBUF \ + assert(sv) + +PERL_STATIC_INLINE IV +Perl_utf8_distance(pTHX_ const U8 *a, const U8 *b) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_UTF8_DISTANCE \ + assert(a); assert(b) + +PERL_STATIC_INLINE U8 * +Perl_utf8_hop(const U8 *s, SSize_t off) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_UTF8_HOP \ + assert(s) + +PERL_STATIC_INLINE U8 * +Perl_utf8_hop_back(const U8 *s, SSize_t off, const U8 *start) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_UTF8_HOP_BACK \ + assert(s); assert(start) + +PERL_STATIC_INLINE U8 * +Perl_utf8_hop_forward(const U8 *s, SSize_t off, const U8 *end) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_UTF8_HOP_FORWARD \ + assert(s); assert(end) + +PERL_STATIC_INLINE U8 * +Perl_utf8_hop_safe(const U8 *s, SSize_t off, const U8 *start, const U8 *end) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_UTF8_HOP_SAFE \ + assert(s); assert(start); assert(end) + +PERL_STATIC_INLINE UV +Perl_utf8_to_uvchr_buf_helper(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen); +# define PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF_HELPER \ + assert(s); assert(send) + +PERL_STATIC_INLINE UV +Perl_utf8n_to_uvchr_msgs(const U8 *s, STRLEN curlen, STRLEN *retlen, const U32 flags, U32 *errors, AV **msgs); +# define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR_MSGS \ + assert(s) + +PERL_STATIC_INLINE UV +Perl_valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVCHR \ + assert(s) + +PERL_STATIC_INLINE void +Perl_cx_popblock(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_POPBLOCK \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_popeval(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_POPEVAL \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_popformat(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_POPFORMAT \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_popgiven(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_POPGIVEN \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_poploop(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_POPLOOP \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_popsub(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_POPSUB \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_popsub_args(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_POPSUB_ARGS \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_popsub_common(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_POPSUB_COMMON \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_popwhen(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_POPWHEN \ + assert(cx) + +PERL_STATIC_INLINE PERL_CONTEXT * +Perl_cx_pushblock(pTHX_ U8 type, U8 gimme, SV **sp, I32 saveix); +# define PERL_ARGS_ASSERT_CX_PUSHBLOCK \ + assert(sp) + +PERL_STATIC_INLINE void +Perl_cx_pusheval(pTHX_ PERL_CONTEXT *cx, OP *retop, SV *namesv); +# define PERL_ARGS_ASSERT_CX_PUSHEVAL \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_pushformat(pTHX_ PERL_CONTEXT *cx, CV *cv, OP *retop, GV *gv); +# define PERL_ARGS_ASSERT_CX_PUSHFORMAT \ + assert(cx); assert(cv) + +PERL_STATIC_INLINE void +Perl_cx_pushgiven(pTHX_ PERL_CONTEXT *cx, SV *orig_defsv); +# define PERL_ARGS_ASSERT_CX_PUSHGIVEN \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_pushloop_for(pTHX_ PERL_CONTEXT *cx, void *itervarp, SV *itersave); +# define PERL_ARGS_ASSERT_CX_PUSHLOOP_FOR \ + assert(cx); assert(itervarp) + +PERL_STATIC_INLINE void +Perl_cx_pushloop_plain(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_PUSHLOOP_PLAIN \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_pushsub(pTHX_ PERL_CONTEXT *cx, CV *cv, OP *retop, bool hasargs); +# define PERL_ARGS_ASSERT_CX_PUSHSUB \ + assert(cx); assert(cv) + +PERL_STATIC_INLINE void +Perl_cx_pushtry(pTHX_ PERL_CONTEXT *cx, OP *retop); +# define PERL_ARGS_ASSERT_CX_PUSHTRY \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_pushwhen(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_PUSHWHEN \ + assert(cx) + +PERL_STATIC_INLINE void +Perl_cx_topblock(pTHX_ PERL_CONTEXT *cx); +# define PERL_ARGS_ASSERT_CX_TOPBLOCK \ + assert(cx) + +PERL_STATIC_INLINE U8 +Perl_gimme_V(pTHX); +# define PERL_ARGS_ASSERT_GIMME_V + +# if !defined(HAS_STRLCAT) +PERL_STATIC_INLINE Size_t +Perl_my_strlcat(char *dst, const char *src, Size_t size); +# define PERL_ARGS_ASSERT_MY_STRLCAT + +# endif +# if !defined(HAS_STRNLEN) +PERL_STATIC_INLINE Size_t +Perl_my_strnlen(const char *str, Size_t maxlen); +# define PERL_ARGS_ASSERT_MY_STRNLEN \ + assert(str) + +# endif +# if defined(PERL_CORE) || defined(PERL_EXT) +PERL_STATIC_INLINE bool +Perl_is_utf8_non_invariant_string(const U8 * const s, STRLEN len) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_IS_UTF8_NON_INVARIANT_STRING \ + assert(s) + +PERL_STATIC_INLINE STRLEN +S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp); +# define PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B \ + assert(sv); assert(pv) + +PERL_STATIC_INLINE Size_t +S_variant_under_utf8_count(const U8 * const s, const U8 * const e) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_VARIANT_UNDER_UTF8_COUNT \ + assert(s); assert(e) + +# if !defined(HAS_MEMRCHR) +PERL_STATIC_INLINE void * +S_my_memrchr(const char *s, const char c, const STRLEN len); +# define PERL_ARGS_ASSERT_MY_MEMRCHR \ + assert(s) + +# endif +# endif /* defined(PERL_CORE) || defined(PERL_EXT) */ +# if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || \ + defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) || \ + defined(PERL_IN_UTF8_C) +PERL_STATIC_INLINE bool +S__invlist_contains_cp(SV * const invlist, const UV cp) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT__INVLIST_CONTAINS_CP \ + assert(invlist) + +PERL_STATIC_INLINE UV +S__invlist_len(SV * const invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT__INVLIST_LEN \ + assert(invlist) + +PERL_STATIC_INLINE bool * +S_get_invlist_offset_addr(SV *invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GET_INVLIST_OFFSET_ADDR \ + assert(invlist) + +PERL_STATIC_INLINE UV * +S_invlist_array(SV * const invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_INVLIST_ARRAY \ + assert(invlist) + +PERL_STATIC_INLINE bool +S_is_invlist(const SV * const invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_IS_INVLIST + +# endif /* defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || + defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || + defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) || + defined(PERL_IN_UTF8_C) */ +# if defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || \ + defined(PERL_IN_REGCOMP_ANY) +PERL_STATIC_INLINE SV * +S_add_cp_to_invlist(pTHX_ SV *invlist, const UV cp) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ADD_CP_TO_INVLIST + +PERL_STATIC_INLINE void +S_invlist_extend(pTHX_ SV * const invlist, const UV len); +# define PERL_ARGS_ASSERT_INVLIST_EXTEND \ + assert(invlist) + +PERL_STATIC_INLINE UV +S_invlist_highest(SV * const invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_INVLIST_HIGHEST \ + assert(invlist) + +PERL_STATIC_INLINE void +S_invlist_set_len(pTHX_ SV * const invlist, const UV len, const bool offset); +# define PERL_ARGS_ASSERT_INVLIST_SET_LEN \ + assert(invlist) + +# endif /* defined(PERL_IN_DOOP_C) || defined(PERL_IN_OP_C) || + defined(PERL_IN_REGCOMP_ANY) */ +# if defined(PERL_IN_OP_C) || defined(PERL_IN_PAD_C) +PERL_STATIC_INLINE bool +S_PadnameIN_SCOPE(const PADNAME * const pn, const U32 seq); +# define PERL_ARGS_ASSERT_PADNAMEIN_SCOPE \ + assert(pn) + +# endif +# if defined(PERL_IN_OP_C) || defined(PERL_IN_REGCOMP_ANY) +PERL_STATIC_INLINE STRLEN * +S_get_invlist_iter_addr(SV *invlist) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GET_INVLIST_ITER_ADDR \ + assert(invlist) + +PERL_STATIC_INLINE void +S_invlist_iterfinish(SV *invlist); +# define PERL_ARGS_ASSERT_INVLIST_ITERFINISH \ + assert(invlist) + +PERL_STATIC_INLINE void +S_invlist_iterinit(SV *invlist); +# define PERL_ARGS_ASSERT_INVLIST_ITERINIT \ + assert(invlist) + +PERL_STATIC_INLINE bool +S_invlist_iternext(SV *invlist, UV *start, UV *end) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_INVLIST_ITERNEXT \ + assert(invlist); assert(start); assert(end) + +# endif /* defined(PERL_IN_OP_C) || defined(PERL_IN_REGCOMP_ANY) */ +# if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C) +PERL_STATIC_INLINE bool +S_lossless_NV_to_IV(const NV nv, IV *ivp) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_LOSSLESS_NV_TO_IV \ + assert(ivp) + +# endif +# if defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_ANY) || \ + defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C) +PERL_STATIC_INLINE const char * +S_get_regex_charset_name(const U32 flags, STRLEN * const lenp); +# define PERL_ARGS_ASSERT_GET_REGEX_CHARSET_NAME \ + assert(lenp) + +# endif +# if defined(U64TYPE) +PERL_STATIC_INLINE unsigned +Perl_lsbit_pos64(U64 word) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_LSBIT_POS64 + +PERL_STATIC_INLINE unsigned +Perl_msbit_pos64(U64 word) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MSBIT_POS64 + +PERL_STATIC_INLINE unsigned +Perl_single_1bit_pos64(U64 word) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SINGLE_1BIT_POS64 + +# endif /* defined(U64TYPE) */ +# if defined(USE_ITHREADS) +PERL_STATIC_INLINE AV * +Perl_cop_file_avn(pTHX_ const COP *cop); +# define PERL_ARGS_ASSERT_COP_FILE_AVN \ + assert(cop) + +# if !defined(PERL_IMPLICIT_SYS) +PERL_STATIC_INLINE bool +S_PerlEnv_putenv(pTHX_ char *str); +# define PERL_ARGS_ASSERT_PERLENV_PUTENV \ + assert(str) + +# endif +# endif /* defined(USE_ITHREADS) */ +# if !defined(WIN32) +PERL_STATIC_INLINE void * +Perl_get_context(void) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GET_CONTEXT + +# endif +#endif /* !defined(PERL_NO_INLINE_FUNCTIONS) */ #if defined(PERL_USE_3ARG_SIGHANDLER) -PERL_CALLCONV Signal_t Perl_csighandler(int sig, Siginfo_t *info, void *uap); -#define PERL_ARGS_ASSERT_CSIGHANDLER -PERL_CALLCONV Signal_t Perl_sighandler(int sig, Siginfo_t *info, void *uap); -#define PERL_ARGS_ASSERT_SIGHANDLER -#endif -#if defined(U64TYPE) /* HAS_QUAD undefined outside of core */ -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE unsigned Perl_lsbit_pos64(U64 word) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_LSBIT_POS64 -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE unsigned Perl_msbit_pos64(U64 word) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MSBIT_POS64 -#endif - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE unsigned Perl_single_1bit_pos64(U64 word) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SINGLE_1BIT_POS64 -#endif +PERL_CALLCONV Signal_t +Perl_csighandler(int sig, Siginfo_t *info, void *uap); +# define PERL_ARGS_ASSERT_CSIGHANDLER + +PERL_CALLCONV Signal_t +Perl_sighandler(int sig, Siginfo_t *info, void *uap) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_SIGHANDLER + +#else /* if !defined(PERL_USE_3ARG_SIGHANDLER) */ +PERL_CALLCONV Signal_t +Perl_csighandler(int sig); +# define PERL_ARGS_ASSERT_CSIGHANDLER + +PERL_CALLCONV Signal_t +Perl_sighandler(int sig) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_SIGHANDLER + +#endif /* !defined(PERL_USE_3ARG_SIGHANDLER) */ +#if defined(U64TYPE) #endif #if defined(UNLINK_ALL_VERSIONS) -PERL_CALLCONV I32 Perl_unlnk(pTHX_ const char* f); -#define PERL_ARGS_ASSERT_UNLNK \ - assert(f) +PERL_CALLCONV I32 +Perl_unlnk(pTHX_ const char *f); +# define PERL_ARGS_ASSERT_UNLNK \ + assert(f) + #endif #if defined(USE_C_BACKTRACE) -PERL_CALLCONV bool Perl_dump_c_backtrace(pTHX_ PerlIO* fp, int max_depth, int skip); -#define PERL_ARGS_ASSERT_DUMP_C_BACKTRACE \ - assert(fp) -/* PERL_CALLCONV void free_c_backtrace(pTHX_ Perl_c_backtrace* bt); */ -#define PERL_ARGS_ASSERT_FREE_C_BACKTRACE -PERL_CALLCONV Perl_c_backtrace* Perl_get_c_backtrace(pTHX_ int max_depth, int skip); -#define PERL_ARGS_ASSERT_GET_C_BACKTRACE -PERL_CALLCONV SV* Perl_get_c_backtrace_dump(pTHX_ int max_depth, int skip); -#define PERL_ARGS_ASSERT_GET_C_BACKTRACE_DUMP -#endif +PERL_CALLCONV bool +Perl_dump_c_backtrace(pTHX_ PerlIO *fp, int max_depth, int skip); +# define PERL_ARGS_ASSERT_DUMP_C_BACKTRACE \ + assert(fp) + +/* PERL_CALLCONV void +free_c_backtrace(pTHX_ Perl_c_backtrace *bt); */ + +PERL_CALLCONV Perl_c_backtrace * +Perl_get_c_backtrace(pTHX_ int max_depth, int skip) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_GET_C_BACKTRACE + +PERL_CALLCONV SV * +Perl_get_c_backtrace_dump(pTHX_ int max_depth, int skip); +# define PERL_ARGS_ASSERT_GET_C_BACKTRACE_DUMP + +#endif /* defined(USE_C_BACKTRACE) */ #if defined(USE_DTRACE) -PERL_CALLCONV void Perl_dtrace_probe_call(pTHX_ CV *cv, bool is_call); -#define PERL_ARGS_ASSERT_DTRACE_PROBE_CALL \ - assert(cv) -PERL_CALLCONV void Perl_dtrace_probe_load(pTHX_ const char *name, bool is_loading); -#define PERL_ARGS_ASSERT_DTRACE_PROBE_LOAD \ - assert(name) -PERL_CALLCONV void Perl_dtrace_probe_op(pTHX_ const OP *op); -#define PERL_ARGS_ASSERT_DTRACE_PROBE_OP \ - assert(op) -PERL_CALLCONV void Perl_dtrace_probe_phase(pTHX_ enum perl_phase phase); -#define PERL_ARGS_ASSERT_DTRACE_PROBE_PHASE -#endif +PERL_CALLCONV void +Perl_dtrace_probe_call(pTHX_ CV *cv, bool is_call); +# define PERL_ARGS_ASSERT_DTRACE_PROBE_CALL \ + assert(cv) + +PERL_CALLCONV void +Perl_dtrace_probe_load(pTHX_ const char *name, bool is_loading); +# define PERL_ARGS_ASSERT_DTRACE_PROBE_LOAD \ + assert(name) + +PERL_CALLCONV void +Perl_dtrace_probe_op(pTHX_ const OP *op); +# define PERL_ARGS_ASSERT_DTRACE_PROBE_OP \ + assert(op) + +PERL_CALLCONV void +Perl_dtrace_probe_phase(pTHX_ enum perl_phase phase); +# define PERL_ARGS_ASSERT_DTRACE_PROBE_PHASE + +#endif /* defined(USE_DTRACE) */ #if defined(USE_ITHREADS) -PERL_CALLCONV PADOFFSET Perl_alloccopstash(pTHX_ HV *hv); -#define PERL_ARGS_ASSERT_ALLOCCOPSTASH \ - assert(hv) -PERL_CALLCONV void* Perl_any_dup(pTHX_ void* v, const PerlInterpreter* proto_perl) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_ANY_DUP \ - assert(proto_perl) - -PERL_CALLCONV void Perl_clone_params_del(CLONE_PARAMS *param); -#define PERL_ARGS_ASSERT_CLONE_PARAMS_DEL \ - assert(param) -PERL_CALLCONV CLONE_PARAMS * Perl_clone_params_new(PerlInterpreter *const from, PerlInterpreter *const to) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CLONE_PARAMS_NEW \ - assert(from); assert(to) - -#ifndef PERL_NO_INLINE_FUNCTIONS -PERL_STATIC_INLINE AV* Perl_cop_file_avn(pTHX_ const COP *cop); -#define PERL_ARGS_ASSERT_COP_FILE_AVN \ - assert(cop) -#endif -PERL_CALLCONV PERL_CONTEXT* Perl_cx_dup(pTHX_ PERL_CONTEXT* cx, I32 ix, I32 max, CLONE_PARAMS* param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_CX_DUP \ - assert(param) - -PERL_CALLCONV DIR* Perl_dirp_dup(pTHX_ DIR *const dp, CLONE_PARAMS *const param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_DIRP_DUP \ - assert(param) - -PERL_CALLCONV PerlIO* Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param); -#define PERL_ARGS_ASSERT_FP_DUP \ - assert(param) -PERL_CALLCONV GP* Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_GP_DUP \ - assert(param) - -PERL_CALLCONV HE* Perl_he_dup(pTHX_ const HE* e, bool shared, CLONE_PARAMS* param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HE_DUP \ - assert(param) - -PERL_CALLCONV HEK* Perl_hek_dup(pTHX_ HEK* e, CLONE_PARAMS* param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_HEK_DUP \ - assert(param) - -PERL_CALLCONV MAGIC* Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_MG_DUP \ - assert(param) - -PERL_CALLCONV struct mro_meta* Perl_mro_meta_dup(pTHX_ struct mro_meta* smeta, CLONE_PARAMS* param); -#define PERL_ARGS_ASSERT_MRO_META_DUP \ - assert(smeta); assert(param) -PERL_CALLCONV OP* Perl_newPADOP(pTHX_ I32 type, I32 flags, SV* sv) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_NEWPADOP \ - assert(sv) - -PERL_CALLCONV PADLIST * Perl_padlist_dup(pTHX_ PADLIST *srcpad, CLONE_PARAMS *param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PADLIST_DUP \ - assert(srcpad); assert(param) - -PERL_CALLCONV PADNAME * Perl_padname_dup(pTHX_ PADNAME *src, CLONE_PARAMS *param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PADNAME_DUP \ - assert(src); assert(param) - -PERL_CALLCONV PADNAMELIST * Perl_padnamelist_dup(pTHX_ PADNAMELIST *srcpad, CLONE_PARAMS *param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PADNAMELIST_DUP \ - assert(srcpad); assert(param) - -PERL_CALLCONV yy_parser* Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param); -#define PERL_ARGS_ASSERT_PARSER_DUP \ - assert(param) -PERL_CALLCONV PerlInterpreter* perl_clone(PerlInterpreter *proto_perl, UV flags); -#define PERL_ARGS_ASSERT_PERL_CLONE \ - assert(proto_perl) -PERL_CALLCONV void Perl_re_dup_guts(pTHX_ const REGEXP *sstr, REGEXP *dstr, CLONE_PARAMS* param); -#define PERL_ARGS_ASSERT_RE_DUP_GUTS \ - assert(sstr); assert(dstr); assert(param) -PERL_CALLCONV void* Perl_regdupe_internal(pTHX_ REGEXP * const r, CLONE_PARAMS* param); -#define PERL_ARGS_ASSERT_REGDUPE_INTERNAL \ - assert(r); assert(param) -PERL_CALLCONV void Perl_rvpv_dup(pTHX_ SV *const dsv, const SV *const ssv, CLONE_PARAMS *const param); -#define PERL_ARGS_ASSERT_RVPV_DUP \ - assert(dsv); assert(ssv); assert(param) -PERL_CALLCONV PERL_SI* Perl_si_dup(pTHX_ PERL_SI* si, CLONE_PARAMS* param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SI_DUP \ - assert(param) - -PERL_CALLCONV ANY* Perl_ss_dup(pTHX_ PerlInterpreter* proto_perl, CLONE_PARAMS* param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SS_DUP \ - assert(proto_perl); assert(param) - -PERL_CALLCONV SV* Perl_sv_dup(pTHX_ const SV *const ssv, CLONE_PARAMS *const param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DUP \ - assert(param) - -PERL_CALLCONV SV* Perl_sv_dup_inc(pTHX_ const SV *const ssv, CLONE_PARAMS *const param) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_SV_DUP_INC \ - assert(param) - -#endif -#if defined(USE_LOCALE) && ( defined(PERL_IN_LOCALE_C) || defined(PERL_IN_MG_C) || defined (PERL_EXT_POSIX) || defined (PERL_EXT_LANGINFO)) -PERL_CALLCONV bool Perl__is_cur_LC_category_utf8(pTHX_ int category); -#define PERL_ARGS_ASSERT__IS_CUR_LC_CATEGORY_UTF8 +PERL_CALLCONV PADOFFSET +Perl_alloccopstash(pTHX_ HV *hv); +# define PERL_ARGS_ASSERT_ALLOCCOPSTASH \ + assert(hv) + +PERL_CALLCONV void * +Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_ANY_DUP \ + assert(proto_perl) + +PERL_CALLCONV void +Perl_clone_params_del(CLONE_PARAMS *param); +# define PERL_ARGS_ASSERT_CLONE_PARAMS_DEL \ + assert(param) + +PERL_CALLCONV CLONE_PARAMS * +Perl_clone_params_new(PerlInterpreter * const from, PerlInterpreter * const to) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_CLONE_PARAMS_NEW \ + assert(from); assert(to) + +PERL_CALLCONV PERL_CONTEXT * +Perl_cx_dup(pTHX_ PERL_CONTEXT *cx, I32 ix, I32 max, CLONE_PARAMS *param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_CX_DUP \ + assert(param) + +PERL_CALLCONV DIR * +Perl_dirp_dup(pTHX_ DIR * const dp, CLONE_PARAMS * const param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_DIRP_DUP \ + assert(param) + +PERL_CALLCONV PerlIO * +Perl_fp_dup(pTHX_ PerlIO * const fp, const char type, CLONE_PARAMS * const param); +# define PERL_ARGS_ASSERT_FP_DUP \ + assert(param) + +PERL_CALLCONV GP * +Perl_gp_dup(pTHX_ GP * const gp, CLONE_PARAMS * const param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GP_DUP \ + assert(param) + +PERL_CALLCONV HE * +Perl_he_dup(pTHX_ const HE *e, bool shared, CLONE_PARAMS *param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_HE_DUP \ + assert(param) + +PERL_CALLCONV HEK * +Perl_hek_dup(pTHX_ HEK *e, CLONE_PARAMS *param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_HEK_DUP \ + assert(param) + +PERL_CALLCONV MAGIC * +Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS * const param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_MG_DUP \ + assert(param) + +PERL_CALLCONV struct mro_meta * +Perl_mro_meta_dup(pTHX_ struct mro_meta *smeta, CLONE_PARAMS *param) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MRO_META_DUP \ + assert(smeta); assert(param) + +PERL_CALLCONV OP * +Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_NEWPADOP \ + assert(sv) + +PERL_CALLCONV PADLIST * +Perl_padlist_dup(pTHX_ PADLIST *srcpad, CLONE_PARAMS *param) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_PADLIST_DUP \ + assert(srcpad); assert(param) + +PERL_CALLCONV PADNAME * +Perl_padname_dup(pTHX_ PADNAME *src, CLONE_PARAMS *param) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_PADNAME_DUP \ + assert(src); assert(param) + +PERL_CALLCONV PADNAMELIST * +Perl_padnamelist_dup(pTHX_ PADNAMELIST *srcpad, CLONE_PARAMS *param) + __attribute__warn_unused_result__ + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_PADNAMELIST_DUP \ + assert(srcpad); assert(param) + +PERL_CALLCONV yy_parser * +Perl_parser_dup(pTHX_ const yy_parser * const proto, CLONE_PARAMS * const param); +# define PERL_ARGS_ASSERT_PARSER_DUP \ + assert(param) + +PERL_CALLCONV PerlInterpreter * +perl_clone(PerlInterpreter *proto_perl, UV flags); +# define PERL_ARGS_ASSERT_PERL_CLONE \ + assert(proto_perl) + +PERL_CALLCONV void +Perl_re_dup_guts(pTHX_ const REGEXP *sstr, REGEXP *dstr, CLONE_PARAMS *param); +# define PERL_ARGS_ASSERT_RE_DUP_GUTS \ + assert(sstr); assert(dstr); assert(param) + +PERL_CALLCONV void * +Perl_regdupe_internal(pTHX_ REGEXP * const r, CLONE_PARAMS *param); +# define PERL_ARGS_ASSERT_REGDUPE_INTERNAL \ + assert(r); assert(param) + +PERL_CALLCONV void +Perl_rvpv_dup(pTHX_ SV * const dsv, const SV * const ssv, CLONE_PARAMS * const param); +# define PERL_ARGS_ASSERT_RVPV_DUP \ + assert(dsv); assert(ssv); assert(param) + +PERL_CALLCONV PERL_SI * +Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS *param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SI_DUP \ + assert(param) + +PERL_CALLCONV ANY * +Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS *param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SS_DUP \ + assert(proto_perl); assert(param) + +PERL_CALLCONV SV * +Perl_sv_dup(pTHX_ const SV * const ssv, CLONE_PARAMS * const param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_DUP \ + assert(param) + +PERL_CALLCONV SV * +Perl_sv_dup_inc(pTHX_ const SV * const ssv, CLONE_PARAMS * const param) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_SV_DUP_INC \ + assert(param) + +# if defined(PERL_IN_OP_C) || defined(PERL_IN_PEEP_C) +PERL_CALLCONV void +Perl_op_relocate_sv(pTHX_ SV **svp, PADOFFSET *targp) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_OP_RELOCATE_SV \ + assert(svp); assert(targp) + +# endif +#else /* if !defined(USE_ITHREADS) */ +/* PERL_CALLCONV void +CopFILEGV_set(pTHX_ COP *c, GV *gv); */ + #endif #if defined(USE_LOCALE_COLLATE) -PERL_CALLCONV int Perl_magic_freecollxfrm(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_FREECOLLXFRM \ - assert(sv); assert(mg) -PERL_CALLCONV int Perl_magic_setcollxfrm(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM \ - assert(sv); assert(mg) -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_mem_collxfrm(pTHX_ const char* input_string, STRLEN len, STRLEN* xlen) - __attribute__deprecated__; -#define PERL_ARGS_ASSERT_MEM_COLLXFRM \ - assert(input_string); assert(xlen) -#endif - -#ifndef NO_MATHOMS -PERL_CALLCONV char* Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp); -#define PERL_ARGS_ASSERT_SV_COLLXFRM \ - assert(sv); assert(nxp) -#endif -PERL_CALLCONV char* Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, I32 const flags); -#define PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS \ - assert(sv); assert(nxp) -#endif +PERL_CALLCONV int +Perl_magic_freecollxfrm(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MAGIC_FREECOLLXFRM \ + assert(sv); assert(mg) + +PERL_CALLCONV int +Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM \ + assert(sv); assert(mg) + +PERL_CALLCONV SV * +Perl_strxfrm(pTHX_ SV *src); +# define PERL_ARGS_ASSERT_STRXFRM \ + assert(src) + +PERL_CALLCONV char * +Perl_sv_collxfrm_flags(pTHX_ SV * const sv, STRLEN * const nxp, I32 const flags); +# define PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS \ + assert(sv); assert(nxp) + +# if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_MATHOMS_C) || \ + defined(PERL_IN_SV_C) +PERL_CALLCONV char * +Perl_mem_collxfrm_(pTHX_ const char *input_string, STRLEN len, STRLEN *xlen, bool utf8) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_MEM_COLLXFRM_ \ + assert(input_string); assert(xlen) + +# endif +#endif /* defined(USE_LOCALE_COLLATE) */ #if defined(USE_PERLIO) -PERL_CALLCONV void Perl_PerlIO_clearerr(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_CLEARERR -PERL_CALLCONV int Perl_PerlIO_close(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_CLOSE -PERL_CALLCONV int Perl_PerlIO_eof(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_EOF -PERL_CALLCONV int Perl_PerlIO_error(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_ERROR -PERL_CALLCONV int Perl_PerlIO_fileno(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_FILENO -PERL_CALLCONV int Perl_PerlIO_fill(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_FILL -PERL_CALLCONV int Perl_PerlIO_flush(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_FLUSH -PERL_CALLCONV STDCHAR * Perl_PerlIO_get_base(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_GET_BASE -PERL_CALLCONV SSize_t Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLIO_GET_BUFSIZ - -PERL_CALLCONV SSize_t Perl_PerlIO_get_cnt(pTHX_ PerlIO *f) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLIO_GET_CNT - -PERL_CALLCONV STDCHAR * Perl_PerlIO_get_ptr(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_GET_PTR -PERL_CALLCONV SSize_t Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count); -#define PERL_ARGS_ASSERT_PERLIO_READ \ - assert(vbuf) -PERL_CALLCONV void Perl_PerlIO_restore_errno(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_RESTORE_ERRNO -PERL_CALLCONV void Perl_PerlIO_save_errno(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_SAVE_ERRNO -PERL_CALLCONV int Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence); -#define PERL_ARGS_ASSERT_PERLIO_SEEK -PERL_CALLCONV void Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, SSize_t cnt); -#define PERL_ARGS_ASSERT_PERLIO_SET_CNT -PERL_CALLCONV void Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR *ptr, SSize_t cnt); -#define PERL_ARGS_ASSERT_PERLIO_SET_PTRCNT -PERL_CALLCONV void Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_SETLINEBUF -PERL_CALLCONV PerlIO * Perl_PerlIO_stderr(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLIO_STDERR - -PERL_CALLCONV PerlIO * Perl_PerlIO_stdin(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLIO_STDIN - -PERL_CALLCONV PerlIO * Perl_PerlIO_stdout(pTHX) - __attribute__warn_unused_result__; -#define PERL_ARGS_ASSERT_PERLIO_STDOUT - -PERL_CALLCONV Off_t Perl_PerlIO_tell(pTHX_ PerlIO *f); -#define PERL_ARGS_ASSERT_PERLIO_TELL -PERL_CALLCONV SSize_t Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count); -#define PERL_ARGS_ASSERT_PERLIO_UNREAD \ - assert(vbuf) -PERL_CALLCONV SSize_t Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count); -#define PERL_ARGS_ASSERT_PERLIO_WRITE \ - assert(vbuf) +PERL_CALLCONV void +Perl_PerlIO_clearerr(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_CLEARERR + +PERL_CALLCONV int +Perl_PerlIO_close(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_CLOSE + +PERL_CALLCONV int +Perl_PerlIO_eof(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_EOF + +PERL_CALLCONV int +Perl_PerlIO_error(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_ERROR + +PERL_CALLCONV int +Perl_PerlIO_fileno(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_FILENO + +PERL_CALLCONV int +Perl_PerlIO_fill(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_FILL + +PERL_CALLCONV int +Perl_PerlIO_flush(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_FLUSH + +PERL_CALLCONV STDCHAR * +Perl_PerlIO_get_base(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_GET_BASE + +PERL_CALLCONV SSize_t +Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_PERLIO_GET_BUFSIZ + +PERL_CALLCONV SSize_t +Perl_PerlIO_get_cnt(pTHX_ PerlIO *f) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_PERLIO_GET_CNT + +PERL_CALLCONV STDCHAR * +Perl_PerlIO_get_ptr(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_GET_PTR + +PERL_CALLCONV SSize_t +Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count); +# define PERL_ARGS_ASSERT_PERLIO_READ \ + assert(vbuf) + +PERL_CALLCONV void +Perl_PerlIO_restore_errno(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_RESTORE_ERRNO + +PERL_CALLCONV void +Perl_PerlIO_save_errno(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_SAVE_ERRNO + +PERL_CALLCONV int +Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence); +# define PERL_ARGS_ASSERT_PERLIO_SEEK + +PERL_CALLCONV void +Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, SSize_t cnt); +# define PERL_ARGS_ASSERT_PERLIO_SET_CNT + +PERL_CALLCONV void +Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR *ptr, SSize_t cnt); +# define PERL_ARGS_ASSERT_PERLIO_SET_PTRCNT + +PERL_CALLCONV void +Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_SETLINEBUF + +PERL_CALLCONV PerlIO * +Perl_PerlIO_stderr(pTHX) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_PERLIO_STDERR + +PERL_CALLCONV PerlIO * +Perl_PerlIO_stdin(pTHX) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_PERLIO_STDIN + +PERL_CALLCONV PerlIO * +Perl_PerlIO_stdout(pTHX) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_PERLIO_STDOUT + +PERL_CALLCONV Off_t +Perl_PerlIO_tell(pTHX_ PerlIO *f); +# define PERL_ARGS_ASSERT_PERLIO_TELL + +PERL_CALLCONV SSize_t +Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count); +# define PERL_ARGS_ASSERT_PERLIO_UNREAD \ + assert(vbuf) + +PERL_CALLCONV SSize_t +Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count); +# define PERL_ARGS_ASSERT_PERLIO_WRITE \ + assert(vbuf) + +#endif /* defined(USE_PERLIO) */ +#if defined(USE_PERL_SWITCH_LOCALE_CONTEXT) +PERL_CALLCONV void +Perl_switch_locale_context(void); +# define PERL_ARGS_ASSERT_SWITCH_LOCALE_CONTEXT + #endif #if defined(USE_QUADMATH) -PERL_CALLCONV bool Perl_quadmath_format_needed(const char* format); -#define PERL_ARGS_ASSERT_QUADMATH_FORMAT_NEEDED \ - assert(format) -PERL_CALLCONV bool Perl_quadmath_format_valid(const char* format); -#define PERL_ARGS_ASSERT_QUADMATH_FORMAT_VALID \ - assert(format) -#endif +PERL_CALLCONV bool +Perl_quadmath_format_needed(const char *format) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_QUADMATH_FORMAT_NEEDED \ + assert(format) + +PERL_CALLCONV bool +Perl_quadmath_format_valid(const char *format) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_QUADMATH_FORMAT_VALID \ + assert(format) + +#endif /* defined(USE_QUADMATH) */ +#if defined(VMS) || defined(WIN32) +PERL_CALLCONV int +Perl_do_aspawn(pTHX_ SV *really, SV **mark, SV **sp); +# define PERL_ARGS_ASSERT_DO_ASPAWN \ + assert(mark); assert(sp) + +PERL_CALLCONV int +Perl_do_spawn(pTHX_ char *cmd); +# define PERL_ARGS_ASSERT_DO_SPAWN \ + assert(cmd) + +PERL_CALLCONV int +Perl_do_spawn_nowait(pTHX_ char *cmd); +# define PERL_ARGS_ASSERT_DO_SPAWN_NOWAIT \ + assert(cmd) + +#endif /* defined(VMS) || defined(WIN32) */ #if defined(WIN32) -PERL_CALLCONV_NO_RET void win32_croak_not_implemented(const char * fname) - __attribute__noreturn__; -#define PERL_ARGS_ASSERT_WIN32_CROAK_NOT_IMPLEMENTED \ - assert(fname) - -#endif -#if defined(WIN32) || defined(VMS) -PERL_CALLCONV int Perl_do_aspawn(pTHX_ SV* really, SV** mark, SV** sp); -#define PERL_ARGS_ASSERT_DO_ASPAWN \ - assert(mark); assert(sp) -PERL_CALLCONV int Perl_do_spawn(pTHX_ char* cmd); -#define PERL_ARGS_ASSERT_DO_SPAWN \ - assert(cmd) -PERL_CALLCONV int Perl_do_spawn_nowait(pTHX_ char* cmd); -#define PERL_ARGS_ASSERT_DO_SPAWN_NOWAIT \ - assert(cmd) -#endif -#if defined(_MSC_VER) -PERL_CALLCONV int Perl_magic_regdatum_set(pTHX_ SV* sv, MAGIC* mg); -#define PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET \ - assert(sv); assert(mg) +PERL_CALLCONV void * +Perl_get_context(void) + __attribute__warn_unused_result__; +# define PERL_ARGS_ASSERT_GET_CONTEXT + +PERL_CALLCONV bool +Perl_get_win32_message_utf8ness(pTHX_ const char *string) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_GET_WIN32_MESSAGE_UTF8NESS + +PERL_CALLCONV_NO_RET void +win32_croak_not_implemented(const char *fname) + __attribute__noreturn__; +# define PERL_ARGS_ASSERT_WIN32_CROAK_NOT_IMPLEMENTED \ + assert(fname) + +#else /* if !defined(WIN32) */ +PERL_CALLCONV bool +Perl_do_exec3(pTHX_ const char *incmd, int fd, int do_report) + __attribute__visibility__("hidden"); +# define PERL_ARGS_ASSERT_DO_EXEC3 \ + assert(incmd) + #endif + #ifdef PERL_CORE # include "pp_proto.h" #endif END_EXTERN_C -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/reentr.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/reentr.c,v diff -u -p -a -u -p -r1.5 reentr.c --- gnu/usr.bin/perl/reentr.c 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/reentr.c 21 Feb 2024 15:47:03 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * reentr.c * @@ -677,4 +677,4 @@ Perl_reentrant_retry(const char *f, ...) return retptr; } -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/reentr.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/reentr.h,v diff -u -p -a -u -p -r1.1.1.12 reentr.h --- gnu/usr.bin/perl/reentr.h 15 Feb 2023 01:32:01 -0000 1.1.1.12 +++ gnu/usr.bin/perl/reentr.h 21 Feb 2024 15:47:03 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * reentr.h * @@ -1697,4 +1697,4 @@ typedef struct { #endif -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/regcharclass.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/regcharclass.h,v diff -u -p -a -u -p -r1.6 regcharclass.h --- gnu/usr.bin/perl/regcharclass.h 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/regcharclass.h 21 Feb 2024 15:47:03 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * * regcharclass.h * @@ -3802,56 +3802,57 @@ /* Generated from: * 688d673ec947f7ccf898b4eae9848139d4d33676b688dee54f449f8bf9d3bbd2 lib/Unicode/UCD.pm - * c7698811e9adb6cc98fb996a7de4be2b6532f2ac67e76055cc8afdbf6ee18af3 lib/unicore/ArabicShaping.txt - * 24a74555f918bbe99f5b3f1b83cf36fc0e205bb8a600a6a3aa539c710a3dcf27 lib/unicore/BidiBrackets.txt - * 7a5c74cedc1616a9af0a9d22e108ae592d86fe93649c144ae6ba49f193a44122 lib/unicore/BidiMirroring.txt - * 598870dddef7b34b5a972916528c456aff2765b79cd4f9647fb58ceb767e7f17 lib/unicore/Blocks.txt - * a566cd48687b2cd897e02501118b2413c14ae86d318f9abbbba97feb84189f0f lib/unicore/CaseFolding.txt - * 3360762fc3295cea54ab251c31df621d05ba4b94d46c60eaac29aa16d70ad1e0 lib/unicore/CompositionExclusions.txt - * 7e058dec02147098bc9c28d86209f0f251bba0538f3b5a705ad02ea3bb709fe0 lib/unicore/DAge.txt - * e3eddd7d469cd1b0feed7528defad1a1cc7c6a9ceb0ae4446a6d10921ed2e7bc lib/unicore/DCoreProperties.txt - * b2c444c20730b097787fdf50bd7d6dd3fc5256ab8084f5b35b11c8776eca674c lib/unicore/DNormalizationProps.txt - * f901ac011aa32a09224d6555da71e2532c59c1d3381322829de0e3b880507250 lib/unicore/EastAsianWidth.txt - * 5995522f01633073911dad1edb74d13aa832f42862c0392a79627b85d52f2391 lib/unicore/EquivalentUnifiedIdeograph.txt - * cd1c9367cba438afa965fcb5edc6ed3ec6e685fd5dd21c0cc20c026f04beb0e5 lib/unicore/HangulSyllableType.txt - * 3f3f368fccdb37f350ecedc20b37fa71ab31c04e847884c77780d34283539f73 lib/unicore/IdStatus.txt - * 45a150c23961b58d7784704af6c4daccd6517d97b6489e53d13bbdbf9e4f065f lib/unicore/IdType.txt - * d8704c8725568813a947ff2ef38bcf1f05e2a6fbea6876ba384890f187a8bf61 lib/unicore/IndicPositionalCategory.txt - * c7b969b653dc278fb66ab4136223d320e30ad19367eb791ae60dcc6d92071b16 lib/unicore/IndicSyllabicCategory.txt - * 39ff89e0a329e1ccce6d54fad8cf82e90926901928c0ca9b9a2ad5681f330dd9 lib/unicore/Jamo.txt - * 9e06e9f35c6959fb91dcc7993f90d58523c3079bc62c6b25f828b4cdebc5d70c lib/unicore/LineBreak.txt - * 14b3b677d33f95c51423dce6eef4a6a28b4b160451ecedee4b91edb6745cf4a3 lib/unicore/NameAliases.txt - * db5745688affcdc0c3927a1ee0667018a96a7b24513f866d5235e98fef6c2436 lib/unicore/NamedSequences.txt - * 6bddfdb850417a5bee6deff19290fd1b138589909afb50f5a049f343bf2c6722 lib/unicore/PropList.txt - * eb755757e20b72b330b2948df3cf2ff7adb0e31bb060140dc09dafb132ace2cd lib/unicore/PropValueAliases.txt - * 859d7225f2d2a460b3ccb1d61a7945f8cc219acdf5aa53b66b7a1e4bf6ebfc87 lib/unicore/PropertyAliases.txt - * d37eedf63ff9c48bac863d5f76862373d6cf5269fd21253d499e2430d638c01d lib/unicore/ScriptExtensions.txt - * 52db475c4ec445e73b0b16915448c357614946ad7062843c563e00d7535c6510 lib/unicore/Scripts.txt - * c667b45908fd269af25fd55d2fc5bbc157fb1b77675936e25c513ce32e080334 lib/unicore/SpecialCasing.txt - * 36018e68657fdcb3485f636630ffe8c8532e01c977703d2803f5b89d6c5feafb lib/unicore/UnicodeData.txt - * 869ff43dd012f924d03c89fc268c88f0e7eea72f0228b91ca30455afdb84f8fd lib/unicore/VerticalOrientation.txt - * ddc7d4d1f3838573b94fc5d83ff7217e63c47b22ae1cd40c5fe1a54efc15589b lib/unicore/auxiliary/GCBTest.txt - * 97e79f1f8d9cd76d120f2420381a01abc00a7c78a2aa583fa3f9627264a99742 lib/unicore/auxiliary/GraphemeBreakProperty.txt - * 488dbb6a7e1d0070d4aa7c175352c818ff6425172850d1b40c6177726658cb05 lib/unicore/auxiliary/LBTest.txt - * 7e42dd749dbb94aa44b13faf9df6319d9a16ce2ea09a3a094fcfbb5962168040 lib/unicore/auxiliary/SBTest.txt - * 7092ca4117cec891c25c7724132efc519e1dece01ae9fd6068035a9db04d526e lib/unicore/auxiliary/SentenceBreakProperty.txt - * 8094b544ec1580c7e41ac0187805cc1aeb330a90301ec7505563e1a59318284e lib/unicore/auxiliary/WBTest.txt - * 7716752aad296d4ab23ff4ed0a2746fc5328750ff84e9e7d6f3828ee9eaef742 lib/unicore/auxiliary/WordBreakProperty.txt - * b597836124298b8f7fa076273802840cfc3271a25f5c397a082e120954b82c3c lib/unicore/emoji/emoji.txt - * e5fe51acc74e3e83b4fb4c7b25f3c34491d6eb8095c9955d0712dafbca7b3c2b lib/unicore/extracted/DBidiClass.txt - * cd0a14176d93bf440b77a582a0d678190fc0688b15442d4cfb250bf2e27956af lib/unicore/extracted/DBinaryProperties.txt - * 12b0c3af9b600b49488d66545a3e7844ea980809627201bf9afeebe1c9f16f4e lib/unicore/extracted/DCombiningClass.txt - * f76064b298cfbd715ba542e7894f7a507d32da2f011070d1d01df95cad9817d6 lib/unicore/extracted/DDecompositionType.txt - * f9bef074cc916db57fece99d54a4505f8e7c7b17481619e3f0005211f7717d4b lib/unicore/extracted/DEastAsianWidth.txt - * cde679c8461976ed40d7edf61ae98cbb947540831f06f5bc7da7decbf91a1420 lib/unicore/extracted/DGeneralCategory.txt - * 9bb891831328713603a486a4a03df7f7987c3e1e8144a6d1ac71fd061ef3f732 lib/unicore/extracted/DJoinGroup.txt - * e97c65bbea0a69d2fae6ec4182b09e519e13232e20bd804b3004edc0f36bb0d4 lib/unicore/extracted/DJoinType.txt - * 43f6df50e4878f501b417e366b0ee097ae5ccb2d4ce942026bed3d62d78e7887 lib/unicore/extracted/DLineBreak.txt - * a04502ebb36a45d83cbe48a7d8132ea8143edb7b3d34d0aa6afe4a9685049741 lib/unicore/extracted/DNumType.txt - * 11075771b112e8e7ccf6ffa637c4c91eadc3ef3db0517b24e605df8fd3624239 lib/unicore/extracted/DNumValues.txt - * 1e514199c3fa46f5df6148d272db7bddbfd5e89c9710e39773ef9d734f344a2f lib/unicore/mktables - * c72bbdeda99714db1c8024d3311da4aef3c0db3b9b9f11455a7cfe10d5e9aba3 lib/unicore/version + * eb840f36e0a7446293578c684a54c6d83d249abde7bdd4dfa89794af1d7fe9e9 lib/unicore/ArabicShaping.txt + * 333ae1e99db0504ca8a046a07dc45b5e7aa91869c685e6bf955ebe674804827a lib/unicore/BidiBrackets.txt + * b4b9e1d87d8ea273613880de9d2b2f0b0b696244b42152bfa0a3106e7d983a20 lib/unicore/BidiMirroring.txt + * 529dc5d0f6386d52f2f56e004bbfab48ce2d587eea9d38ba546c4052491bd820 lib/unicore/Blocks.txt + * cdd49e55eae3bbf1f0a3f6580c974a0263cb86a6a08daa10fbf705b4808a56f7 lib/unicore/CaseFolding.txt + * 3b019c0a33c3140cbc920c078f4f9af2680ba4f71869c8d4de5190667c70b6a3 lib/unicore/CompositionExclusions.txt + * 7570877e0fa197c45338f7c41a02636da4e14c8dba6a3611a01cd30bf329d5ca lib/unicore/DAge.txt + * d367290bc0867e6b484c68370530bdd1a08b6b32404601b8c7accaf83e05628d lib/unicore/DCoreProperties.txt + * d5687a48c95c7d6e1ec59cb29c0f2e8b052018eb069a4371b7368d0561e12a29 lib/unicore/DNormalizationProps.txt + * 743e7bc435c04ab1a8459710b1c3cad56eedced5b806b4659b6e69b85d0adf2a lib/unicore/EastAsianWidth.txt + * f2e04bae8c856fad3a16353a99d4cc2de6c72770260379f5e4974a97548aad2a lib/unicore/EquivalentUnifiedIdeograph.txt + * 9a3ab36d36a22bdb84de7a17b17e9b9c242134f0080f0a8b4b28d209465a8fc8 lib/unicore/HangulSyllableType.txt + * 790bc9595795c0e0a3860a21a7f97157a134b61a4fc4ab03c7d315d07c9a6eb7 lib/unicore/IdStatus.txt + * 71d3ed8f15cd5d8cd00cdebe62015ff26356462774b261b4a2b83d3bf46b1639 lib/unicore/IdType.txt + * 0ce56c1294da405c0a0a0071582ac839fd229bbf97bdd260462ee571309d4ec4 lib/unicore/IndicPositionalCategory.txt + * ffae561a51b47ddbbe267fdd8505ac3776b85b2932268809127acee84200b573 lib/unicore/IndicSyllabicCategory.txt + * 14733bcb6731ae0c07485bf59a41cb3db08785a50bd2b46b836b4341eab7ee46 lib/unicore/Jamo.txt + * 012bca868e2c4e59a5a10a7546baf0c6fb1b2ef458c277f054915c8a49d292bf lib/unicore/LineBreak.txt + * 3e39509e8fae3e5d50ba73759d0b97194501d14a9c63107a6372a46b38be18e8 lib/unicore/NameAliases.txt + * 1d5202155f14841973aa540b1625f4befbde185ac77ce5aceaaaa0501a68bd66 lib/unicore/NamedSequences.txt + * fb9ac8cc154a80cad6caac9897af55a4e75176af6f4e2bb6edc2bf8b1d57f326 lib/unicore/NormTest.txt + * e05c0a2811d113dae4abd832884199a3ea8d187ee1b872d8240a788a96540bfd lib/unicore/PropList.txt + * 13a7666843abea5c6b7eb8c057c57ab9bb2ba96cfc936e204224dd67d71cafad lib/unicore/PropValueAliases.txt + * e4935149af407fa455901832b710bccb63d2453e46d09190e234d019bcfbba45 lib/unicore/PropertyAliases.txt + * 7e07313d9d0bee42220c476b64485995130ae30917bbcf7780b602d677d7e33f lib/unicore/ScriptExtensions.txt + * cca85d830f46aece2e7c1459ef1249993dca8f2e46d51e869255be140d7ea4b0 lib/unicore/Scripts.txt + * 78b29c64b5840d25c11a9f31b665ee551b8a499eca6c70d770fcad7dd710f494 lib/unicore/SpecialCasing.txt + * 806e9aed65037197f1ec85e12be6e8cd870fc5608b4de0fffd990f689f376a73 lib/unicore/UnicodeData.txt + * ca6d332f485a6f5f452b29b4a74146af0f2c17b7577aa4c821d597210f70611a lib/unicore/VerticalOrientation.txt + * 0d2080d0def294a4b7660801cc03ddfe5866ff300c789c2cc1b50fd7802b2d97 lib/unicore/auxiliary/GCBTest.txt + * 5a0f8748575432f8ff95e1dd5bfaa27bda1a844809e17d6939ee912bba6568a1 lib/unicore/auxiliary/GraphemeBreakProperty.txt + * 371bde4052aa593b108684ae292d8ea2dbb93c19990e0cdf416fa7239557aac3 lib/unicore/auxiliary/LBTest.txt + * f62279d8fd10935ba0cf0d8417a1dcbe7ab0d4e62f59c17e02cbe40f580c4162 lib/unicore/auxiliary/SBTest.txt + * 61e4ba975b0a5bc1a76ee931b94914395d7289ef624e3c0d4d6b9460ee387bea lib/unicore/auxiliary/SentenceBreakProperty.txt + * 2a676130c71194245e7c74a837e58330f202600d8ddcf4518129dd476f26e18e lib/unicore/auxiliary/WBTest.txt + * 5188a56e91593467c2e912601ebc78750e6adc9b04541b8c5becb5441e388ce2 lib/unicore/auxiliary/WordBreakProperty.txt + * 29071dba22c72c27783a73016afb8ffaeb025866740791f9c2d0b55cc45a3470 lib/unicore/emoji/emoji.txt + * 4841f2090c2dbc592d3ce43bb74c2191b3da50fb9a0d00274f1448c202851b02 lib/unicore/extracted/DBidiClass.txt + * f10a35451429137f7348825f22d624b6390c526ead3d8e756d2af9e5ed5b2b67 lib/unicore/extracted/DBinaryProperties.txt + * ca54f6360cd288ad92113415bf1f77749015abe11cbd6798d21f7fa81f04205d lib/unicore/extracted/DCombiningClass.txt + * db059ce45e3cec49bfda56e262fa658b3a5561b1648de266c818d2a08a85b78a lib/unicore/extracted/DDecompositionType.txt + * d62e6950f086e53f47c593a38342621f8838f48c49a1de070cf83d3959bd1688 lib/unicore/extracted/DEastAsianWidth.txt + * fe29a45c0882500e591140aaa5c4f5067e6a5d746806148af34400c48b9c06f9 lib/unicore/extracted/DGeneralCategory.txt + * e13ca1344b16023aa38c6ada39f9658536fc6bb7c3c24d579f0bc316a4f4f1e0 lib/unicore/extracted/DJoinGroup.txt + * c4870b11e2b8b7d0eb70b99ce85608e5c28a399efa316cca97238a58ae160e5e lib/unicore/extracted/DJoinType.txt + * 3f4f32ed2a577344a508114527e721d7a8b633d32f38945d47fe0c743650c585 lib/unicore/extracted/DLineBreak.txt + * 710abf2d581ac9c57f244c0834f9d9969d9781e0396adccd330eaae658ac7d6b lib/unicore/extracted/DNumType.txt + * 6bd30f385f3baf3ab5d5308c111a81de87bea5f494ba0ba69e8ab45263b8c34d lib/unicore/extracted/DNumValues.txt + * f7265069b38ba9a0675a18600e241b1ec6fc8c55fd806fe4c13bc5d8cb0dc508 lib/unicore/mktables + * 55d90fdc3f902e5c0b16b3378f9eaa36e970a1c09723c33de7d47d0370044012 lib/unicore/version * 0a6b5ab33bb1026531f816efe81aea1a8ffcd34a27cbea37dd6a70a63d73c844 regen/charset_translations.pl * acc94e4afc339fe2cf2ae74d6e1cbcf2c396328d78e56236ad314eadbfc84125 regen/regcharclass.pl * b2f896452d2b30da3e04800f478c60c1fd0b03d6b668689b020f1e3cf1f1cdd9 regen/regcharclass_multi_char_folds.pl - * ex: set ro: */ + * ex: set ro ft=c: */ Index: gnu/usr.bin/perl/regcomp.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/regcomp.c,v diff -u -p -a -u -p -r1.34 regcomp.c --- gnu/usr.bin/perl/regcomp.c 26 Nov 2023 16:52:12 -0000 1.34 +++ gnu/usr.bin/perl/regcomp.c 21 Feb 2024 15:47:03 -0000 @@ -31,10 +31,6 @@ * with the POSIX routines of the same names. */ -#ifdef PERL_EXT_RE_BUILD -#include "re_top.h" -#endif - /* * pregcomp and pregexec -- regsub and regerror are not used in perl * @@ -95,7 +91,7 @@ * #ifndef PERL_IN_XSUB_RE * ... * #endif - * blocks, so there is only one defintion for them in the whole + * blocks, so there is only one definition for them in the whole * executable, the one in regcomp.c (or regexec.c). The implication of * that is any debugging info that comes from them is controlled only by * -Dr. Further, any static function they call will also be the version @@ -127,11 +123,16 @@ * access data that we don't want to duplicate. */ +#ifdef PERL_EXT_RE_BUILD +#include "re_top.h" +#endif + #include "EXTERN.h" +#define PERL_IN_REGEX_ENGINE +#define PERL_IN_REGCOMP_ANY #define PERL_IN_REGCOMP_C #include "perl.h" -#define REG_COMP_C #ifdef PERL_IN_XSUB_RE # include "re_comp.h" EXTERN_C const struct regexp_engine my_reg_engine; @@ -142,1296 +143,7 @@ EXTERN_C const struct regexp_engine wild #include "invlist_inline.h" #include "unicode_constants.h" - -#ifndef STATIC -#define STATIC static -#endif - -/* this is a chain of data about sub patterns we are processing that - need to be handled separately/specially in study_chunk. Its so - we can simulate recursion without losing state. */ -struct scan_frame; -typedef struct scan_frame { - regnode *last_regnode; /* last node to process in this frame */ - regnode *next_regnode; /* next node to process when last is reached */ - U32 prev_recursed_depth; - I32 stopparen; /* what stopparen do we use */ - bool in_gosub; /* this or an outer frame is for GOSUB */ - - struct scan_frame *this_prev_frame; /* this previous frame */ - struct scan_frame *prev_frame; /* previous frame */ - struct scan_frame *next_frame; /* next frame */ -} scan_frame; - -/* Certain characters are output as a sequence with the first being a - * backslash. */ -#define isBACKSLASHED_PUNCT(c) memCHRs("-[]\\^", c) - - -struct RExC_state_t { - U32 flags; /* RXf_* are we folding, multilining? */ - U32 pm_flags; /* PMf_* stuff from the calling PMOP */ - char *precomp; /* uncompiled string. */ - char *precomp_end; /* pointer to end of uncompiled string. */ - REGEXP *rx_sv; /* The SV that is the regexp. */ - regexp *rx; /* perl core regexp structure */ - regexp_internal *rxi; /* internal data for regexp object - pprivate field */ - char *start; /* Start of input for compile */ - char *end; /* End of input for compile */ - char *parse; /* Input-scan pointer. */ - char *copy_start; /* start of copy of input within - constructed parse string */ - char *save_copy_start; /* Provides one level of saving - and restoring 'copy_start' */ - char *copy_start_in_input; /* Position in input string - corresponding to copy_start */ - SSize_t whilem_seen; /* number of WHILEM in this expr */ - regnode *emit_start; /* Start of emitted-code area */ - regnode_offset emit; /* Code-emit pointer */ - I32 naughty; /* How bad is this pattern? */ - I32 sawback; /* Did we see \1, ...? */ - SSize_t size; /* Number of regnode equivalents in - pattern */ - Size_t sets_depth; /* Counts recursion depth of already- - compiled regex set patterns */ - U32 seen; - - I32 parens_buf_size; /* #slots malloced open/close_parens */ - regnode_offset *open_parens; /* offsets to open parens */ - regnode_offset *close_parens; /* offsets to close parens */ - HV *paren_names; /* Paren names */ - - /* position beyond 'precomp' of the warning message furthest away from - * 'precomp'. During the parse, no warnings are raised for any problems - * earlier in the parse than this position. This works if warnings are - * raised the first time a given spot is parsed, and if only one - * independent warning is raised for any given spot */ - Size_t latest_warn_offset; - - I32 npar; /* Capture buffer count so far in the - parse, (OPEN) plus one. ("par" 0 is - the whole pattern)*/ - I32 total_par; /* During initial parse, is either 0, - or -1; the latter indicating a - reparse is needed. After that pass, - it is what 'npar' became after the - pass. Hence, it being > 0 indicates - we are in a reparse situation */ - I32 nestroot; /* root parens we are in - used by - accept */ - I32 seen_zerolen; - regnode *end_op; /* END node in program */ - I32 utf8; /* whether the pattern is utf8 or not */ - I32 orig_utf8; /* whether the pattern was originally in utf8 */ - /* XXX use this for future optimisation of case - * where pattern must be upgraded to utf8. */ - I32 uni_semantics; /* If a d charset modifier should use unicode - rules, even if the pattern is not in - utf8 */ - - I32 recurse_count; /* Number of recurse regops we have generated */ - regnode **recurse; /* Recurse regops */ - U8 *study_chunk_recursed; /* bitmap of which subs we have moved - through */ - U32 study_chunk_recursed_bytes; /* bytes in bitmap */ - I32 in_lookaround; - I32 contains_locale; - I32 override_recoding; - I32 recode_x_to_native; - I32 in_multi_char_class; - int code_index; /* next code_blocks[] slot */ - struct reg_code_blocks *code_blocks;/* positions of literal (?{}) - within pattern */ - SSize_t maxlen; /* mininum possible number of chars in string to match */ - scan_frame *frame_head; - scan_frame *frame_last; - U32 frame_count; - AV *warn_text; - HV *unlexed_names; - SV *runtime_code_qr; /* qr with the runtime code blocks */ -#ifdef DEBUGGING - const char *lastparse; - I32 lastnum; - U32 study_chunk_recursed_count; - AV *paren_name_list; /* idx -> name */ - SV *mysv1; - SV *mysv2; - -#define RExC_lastparse (pRExC_state->lastparse) -#define RExC_lastnum (pRExC_state->lastnum) -#define RExC_paren_name_list (pRExC_state->paren_name_list) -#define RExC_study_chunk_recursed_count (pRExC_state->study_chunk_recursed_count) -#define RExC_mysv (pRExC_state->mysv1) -#define RExC_mysv1 (pRExC_state->mysv1) -#define RExC_mysv2 (pRExC_state->mysv2) - -#endif - bool seen_d_op; - bool strict; - bool study_started; - bool in_script_run; - bool use_BRANCHJ; - bool sWARN_EXPERIMENTAL__VLB; - bool sWARN_EXPERIMENTAL__REGEX_SETS; -}; - -#define RExC_flags (pRExC_state->flags) -#define RExC_pm_flags (pRExC_state->pm_flags) -#define RExC_precomp (pRExC_state->precomp) -#define RExC_copy_start_in_input (pRExC_state->copy_start_in_input) -#define RExC_copy_start_in_constructed (pRExC_state->copy_start) -#define RExC_save_copy_start_in_constructed (pRExC_state->save_copy_start) -#define RExC_precomp_end (pRExC_state->precomp_end) -#define RExC_rx_sv (pRExC_state->rx_sv) -#define RExC_rx (pRExC_state->rx) -#define RExC_rxi (pRExC_state->rxi) -#define RExC_start (pRExC_state->start) -#define RExC_end (pRExC_state->end) -#define RExC_parse (pRExC_state->parse) -#define RExC_latest_warn_offset (pRExC_state->latest_warn_offset ) -#define RExC_whilem_seen (pRExC_state->whilem_seen) -#define RExC_seen_d_op (pRExC_state->seen_d_op) /* Seen something that differs - under /d from /u ? */ - -#define RExC_emit (pRExC_state->emit) -#define RExC_emit_start (pRExC_state->emit_start) -#define RExC_sawback (pRExC_state->sawback) -#define RExC_seen (pRExC_state->seen) -#define RExC_size (pRExC_state->size) -#define RExC_maxlen (pRExC_state->maxlen) -#define RExC_npar (pRExC_state->npar) -#define RExC_total_parens (pRExC_state->total_par) -#define RExC_parens_buf_size (pRExC_state->parens_buf_size) -#define RExC_nestroot (pRExC_state->nestroot) -#define RExC_seen_zerolen (pRExC_state->seen_zerolen) -#define RExC_utf8 (pRExC_state->utf8) -#define RExC_uni_semantics (pRExC_state->uni_semantics) -#define RExC_orig_utf8 (pRExC_state->orig_utf8) -#define RExC_open_parens (pRExC_state->open_parens) -#define RExC_close_parens (pRExC_state->close_parens) -#define RExC_end_op (pRExC_state->end_op) -#define RExC_paren_names (pRExC_state->paren_names) -#define RExC_recurse (pRExC_state->recurse) -#define RExC_recurse_count (pRExC_state->recurse_count) -#define RExC_sets_depth (pRExC_state->sets_depth) -#define RExC_study_chunk_recursed (pRExC_state->study_chunk_recursed) -#define RExC_study_chunk_recursed_bytes \ - (pRExC_state->study_chunk_recursed_bytes) -#define RExC_in_lookaround (pRExC_state->in_lookaround) -#define RExC_contains_locale (pRExC_state->contains_locale) -#define RExC_recode_x_to_native (pRExC_state->recode_x_to_native) - -#ifdef EBCDIC -# define SET_recode_x_to_native(x) \ - STMT_START { RExC_recode_x_to_native = (x); } STMT_END -#else -# define SET_recode_x_to_native(x) NOOP -#endif - -#define RExC_in_multi_char_class (pRExC_state->in_multi_char_class) -#define RExC_frame_head (pRExC_state->frame_head) -#define RExC_frame_last (pRExC_state->frame_last) -#define RExC_frame_count (pRExC_state->frame_count) -#define RExC_strict (pRExC_state->strict) -#define RExC_study_started (pRExC_state->study_started) -#define RExC_warn_text (pRExC_state->warn_text) -#define RExC_in_script_run (pRExC_state->in_script_run) -#define RExC_use_BRANCHJ (pRExC_state->use_BRANCHJ) -#define RExC_warned_WARN_EXPERIMENTAL__VLB (pRExC_state->sWARN_EXPERIMENTAL__VLB) -#define RExC_warned_WARN_EXPERIMENTAL__REGEX_SETS (pRExC_state->sWARN_EXPERIMENTAL__REGEX_SETS) -#define RExC_unlexed_names (pRExC_state->unlexed_names) - - -/***********************************************************************/ -/* UTILITY MACROS FOR ADVANCING OR SETTING THE PARSE "CURSOR" RExC_parse - * - * All of these macros depend on the above RExC_ accessor macros, which - * in turns depend on a variable pRExC_state being in scope where they - * are used. This is the standard regexp parser context variable which is - * passed into every non-trivial parse function in this file. - * - * Note that the UTF macro is itself a wrapper around RExC_utf8, so all - * of the macros which do not take an argument will operate on the - * pRExC_state structure *only*. - * - * Please do NOT modify RExC_parse without using these macros. In the - * future these macros will be extended for enhanced debugging and trace - * output during the parse process. - */ - -/* RExC_parse_incf(flag) - * - * Increment RExC_parse to point at the next codepoint, while doing - * the right thing depending on whether we are parsing UTF-8 strings - * or not. The 'flag' argument determines if content is UTF-8 or not, - * intended for cases where this is NOT governed by the UTF macro. - * - * Use RExC_parse_inc() if UTF-8ness is controlled by the UTF macro. - * - * WARNING: Does NOT take into account RExC_end; it is the callers - * responsibility to make sure there are enough octets left in - * RExC_parse to ensure that when processing UTF-8 we would not read - * past the end of the string. - */ -#define RExC_parse_incf(flag) STMT_START { \ - RExC_parse += (flag) ? UTF8SKIP(RExC_parse) : 1; \ -} STMT_END - -/* RExC_parse_inc_safef(flag) - * - * Safely increment RExC_parse to point at the next codepoint, - * doing the right thing depending on whether we are parsing - * UTF-8 strings or not and NOT reading past the end of the buffer. - * The 'flag' argument determines if content is UTF-8 or not, - * intended for cases where this is NOT governed by the UTF macro. - * - * Use RExC_parse_safe() if UTF-8ness is controlled by the UTF macro. - * - * NOTE: Will NOT read past RExC_end when content is UTF-8. - */ -#define RExC_parse_inc_safef(flag) STMT_START { \ - RExC_parse += (flag) ? UTF8_SAFE_SKIP(RExC_parse,RExC_end) : 1; \ -} STMT_END - -/* RExC_parse_inc() - * - * Increment RExC_parse to point at the next codepoint, - * doing the right thing depending on whether we are parsing - * UTF-8 strings or not. - * - * WARNING: Does NOT take into account RExC_end, it is the callers - * responsibility to make sure there are enough octets left in - * RExC_parse to ensure that when processing UTF-8 we would not read - * past the end of the string. - * - * NOTE: whether we are parsing UTF-8 or not is determined by the - * UTF macro which is defined as cBOOL(RExC_parse_utf8), thus this - * macro operates on the pRExC_state structure only. - */ -#define RExC_parse_inc() RExC_parse_incf(UTF) - -/* RExC_parse_inc_safe() - * - * Safely increment RExC_parse to point at the next codepoint, - * doing the right thing depending on whether we are parsing - * UTF-8 strings or not and NOT reading past the end of the buffer. - * - * NOTE: whether we are parsing UTF-8 or not is determined by the - * UTF macro which is defined as cBOOL(RExC_parse_utf8), thus this - * macro operates on the pRExC_state structure only. - */ -#define RExC_parse_inc_safe() RExC_parse_inc_safef(UTF) - -/* RExC_parse_inc_utf8() - * - * Increment RExC_parse to point at the next utf8 codepoint, - * assumes content is UTF-8. - * - * WARNING: Does NOT take into account RExC_end; it is the callers - * responsibility to make sure there are enough octets left in RExC_parse - * to ensure that when processing UTF-8 we would not read past the end - * of the string. - */ -#define RExC_parse_inc_utf8() STMT_START { \ - RExC_parse += UTF8SKIP(RExC_parse); \ -} STMT_END - -/* RExC_parse_inc_if_char() - * - * Increment RExC_parse to point at the next codepoint, if and only - * if the current parse point is NOT a NULL, while doing the right thing - * depending on whether we are parsing UTF-8 strings or not. - * - * WARNING: Does NOT take into account RExC_end, it is the callers - * responsibility to make sure there are enough octets left in RExC_parse - * to ensure that when processing UTF-8 we would not read past the end - * of the string. - * - * NOTE: whether we are parsing UTF-8 or not is determined by the - * UTF macro which is defined as cBOOL(RExC_parse_utf8), thus this - * macro operates on the pRExC_state structure only. - */ -#define RExC_parse_inc_if_char() STMT_START { \ - RExC_parse += SKIP_IF_CHAR(RExC_parse,RExC_end); \ -} STMT_END - -/* RExC_parse_inc_by(n_octets) - * - * Increment the parse cursor by the number of octets specified by - * the 'n_octets' argument. - * - * NOTE: Does NOT check ANY constraints. It is the callers responsibility - * that this will not move past the end of the string, or leave the - * pointer in the middle of a UTF-8 sequence. - * - * Typically used to advanced past previously analyzed content. - */ -#define RExC_parse_inc_by(n_octets) STMT_START { \ - RExC_parse += (n_octets); \ -} STMT_END - -/* RExC_parse_set(to_ptr) - * - * Sets the RExC_parse pointer to the pointer specified by the 'to' - * argument. No validation whatsoever is performed on the to pointer. - */ -#define RExC_parse_set(to_ptr) STMT_START { \ - RExC_parse = (to_ptr); \ -} STMT_END - -/**********************************************************************/ - -/* Heuristic check on the complexity of the pattern: if TOO_NAUGHTY, we set - * a flag to disable back-off on the fixed/floating substrings - if it's - * a high complexity pattern we assume the benefit of avoiding a full match - * is worth the cost of checking for the substrings even if they rarely help. - */ -#define RExC_naughty (pRExC_state->naughty) -#define TOO_NAUGHTY (10) -#define MARK_NAUGHTY(add) \ - if (RExC_naughty < TOO_NAUGHTY) \ - RExC_naughty += (add) -#define MARK_NAUGHTY_EXP(exp, add) \ - if (RExC_naughty < TOO_NAUGHTY) \ - RExC_naughty += RExC_naughty / (exp) + (add) - -#define isNON_BRACE_QUANTIFIER(c) ((c) == '*' || (c) == '+' || (c) == '?') -#define isQUANTIFIER(s,e) ( isNON_BRACE_QUANTIFIER(*s) \ - || ((*s) == '{' && regcurly(s, e, NULL))) - -/* - * Flags to be passed up. - */ -#define HASWIDTH 0x01 /* Known to not match null strings, could match - non-null ones. */ -#define SIMPLE 0x02 /* Exactly one character wide */ - /* (or LNBREAK as a special case) */ -#define POSTPONED 0x08 /* (?1),(?&name), (??{...}) or similar */ -#define TRYAGAIN 0x10 /* Weeded out a declaration. */ -#define RESTART_PARSE 0x20 /* Need to redo the parse */ -#define NEED_UTF8 0x40 /* In conjunction with RESTART_PARSE, need to - calcuate sizes as UTF-8 */ - -#define REG_NODE_NUM(x) ((x) ? (int)((x)-RExC_emit_start) : -1) - -/* whether trie related optimizations are enabled */ -#if PERL_ENABLE_EXTENDED_TRIE_OPTIMISATION -#define TRIE_STUDY_OPT -#define FULL_TRIE_STUDY -#define TRIE_STCLASS -#endif - -/* About the term "restudy" and the var "restudied" and the defines - * "SCF_TRIE_RESTUDY" and "SCF_TRIE_DOING_RESTUDY": All of these relate to - * doing multiple study_chunk() calls over the same set of opcodes for* the - * purpose of enhanced TRIE optimizations. - * - * Specifically, when TRIE_STUDY_OPT is defined, and it is defined in normal - * builds, (see above), during compilation SCF_TRIE_RESTUDY may be enabled - * which then causes the Perl_re_op_compile() to then call the optimizer - * S_study_chunk() a second time to perform additional optimizations, - * including the aho_corasick startclass optimization. - * This additional pass will only happen once, which is managed by the - * 'restudied' variable in Perl_re_op_compile(). - * - * When this second pass is under way the flags passed into study_chunk() will - * include SCF_TRIE_DOING_RESTUDY and this flag is and must be cascaded down - * to any recursive calls to S_study_chunk(). - * - * IMPORTANT: Any logic in study_chunk() that emits warnings should check that - * the SCF_TRIE_DOING_RESTUDY flag is NOT set in 'flags', or the warning may - * be produced twice. - * - * See commit 07be1b83a6b2d24b492356181ddf70e1c7917ae3 and - * 688e03912e3bff2d2419c457d8b0e1bab3eb7112 for more details. - */ - - -#define PBYTE(u8str,paren) ((U8*)(u8str))[(paren) >> 3] -#define PBITVAL(paren) (1 << ((paren) & 7)) -#define PAREN_OFFSET(depth) \ - (RExC_study_chunk_recursed + (depth) * RExC_study_chunk_recursed_bytes) -#define PAREN_TEST(depth, paren) \ - (PBYTE(PAREN_OFFSET(depth), paren) & PBITVAL(paren)) -#define PAREN_SET(depth, paren) \ - (PBYTE(PAREN_OFFSET(depth), paren) |= PBITVAL(paren)) -#define PAREN_UNSET(depth, paren) \ - (PBYTE(PAREN_OFFSET(depth), paren) &= ~PBITVAL(paren)) - -#define REQUIRE_UTF8(flagp) STMT_START { \ - if (!UTF) { \ - *flagp = RESTART_PARSE|NEED_UTF8; \ - return 0; \ - } \ - } STMT_END - -/* /u is to be chosen if we are supposed to use Unicode rules, or if the - * pattern is in UTF-8. This latter condition is in case the outermost rules - * are locale. See GH #17278 */ -#define toUSE_UNI_CHARSET_NOT_DEPENDS (RExC_uni_semantics || UTF) - -/* Change from /d into /u rules, and restart the parse. RExC_uni_semantics is - * a flag that indicates we need to override /d with /u as a result of - * something in the pattern. It should only be used in regards to calling - * set_regex_charset() or get_regex_charset() */ -#define REQUIRE_UNI_RULES(flagp, restart_retval) \ - STMT_START { \ - if (DEPENDS_SEMANTICS) { \ - set_regex_charset(&RExC_flags, REGEX_UNICODE_CHARSET); \ - RExC_uni_semantics = 1; \ - if (RExC_seen_d_op && LIKELY(! IN_PARENS_PASS)) { \ - /* No need to restart the parse if we haven't seen \ - * anything that differs between /u and /d, and no need \ - * to restart immediately if we're going to reparse \ - * anyway to count parens */ \ - *flagp |= RESTART_PARSE; \ - return restart_retval; \ - } \ - } \ - } STMT_END - -#define REQUIRE_BRANCHJ(flagp, restart_retval) \ - STMT_START { \ - RExC_use_BRANCHJ = 1; \ - *flagp |= RESTART_PARSE; \ - return restart_retval; \ - } STMT_END - -/* Until we have completed the parse, we leave RExC_total_parens at 0 or - * less. After that, it must always be positive, because the whole re is - * considered to be surrounded by virtual parens. Setting it to negative - * indicates there is some construct that needs to know the actual number of - * parens to be properly handled. And that means an extra pass will be - * required after we've counted them all */ -#define ALL_PARENS_COUNTED (RExC_total_parens > 0) -#define REQUIRE_PARENS_PASS \ - STMT_START { /* No-op if have completed a pass */ \ - if (! ALL_PARENS_COUNTED) RExC_total_parens = -1; \ - } STMT_END -#define IN_PARENS_PASS (RExC_total_parens < 0) - - -/* This is used to return failure (zero) early from the calling function if - * various flags in 'flags' are set. Two flags always cause a return: - * 'RESTART_PARSE' and 'NEED_UTF8'. 'extra' can be used to specify any - * additional flags that should cause a return; 0 if none. If the return will - * be done, '*flagp' is first set to be all of the flags that caused the - * return. */ -#define RETURN_FAIL_ON_RESTART_OR_FLAGS(flags,flagp,extra) \ - STMT_START { \ - if ((flags) & (RESTART_PARSE|NEED_UTF8|(extra))) { \ - *(flagp) = (flags) & (RESTART_PARSE|NEED_UTF8|(extra)); \ - return 0; \ - } \ - } STMT_END - -#define MUST_RESTART(flags) ((flags) & (RESTART_PARSE)) - -#define RETURN_FAIL_ON_RESTART(flags,flagp) \ - RETURN_FAIL_ON_RESTART_OR_FLAGS( flags, flagp, 0) -#define RETURN_FAIL_ON_RESTART_FLAGP(flagp) \ - if (MUST_RESTART(*(flagp))) return 0 - -/* This converts the named class defined in regcomp.h to its equivalent class - * number defined in handy.h. */ -#define namedclass_to_classnum(class) ((int) ((class) / 2)) -#define classnum_to_namedclass(classnum) ((classnum) * 2) - -#define _invlist_union_complement_2nd(a, b, output) \ - _invlist_union_maybe_complement_2nd(a, b, TRUE, output) -#define _invlist_intersection_complement_2nd(a, b, output) \ - _invlist_intersection_maybe_complement_2nd(a, b, TRUE, output) - -/* We add a marker if we are deferring expansion of a property that is both - * 1) potentiallly user-defined; and - * 2) could also be an official Unicode property. - * - * Without this marker, any deferred expansion can only be for a user-defined - * one. This marker shouldn't conflict with any that could be in a legal name, - * and is appended to its name to indicate this. There is a string and - * character form */ -#define DEFERRED_COULD_BE_OFFICIAL_MARKERs "~" -#define DEFERRED_COULD_BE_OFFICIAL_MARKERc '~' - -/* What is infinity for optimization purposes */ -#define OPTIMIZE_INFTY SSize_t_MAX - -/* About scan_data_t. - - During optimisation we recurse through the regexp program performing - various inplace (keyhole style) optimisations. In addition study_chunk - and scan_commit populate this data structure with information about - what strings MUST appear in the pattern. We look for the longest - string that must appear at a fixed location, and we look for the - longest string that may appear at a floating location. So for instance - in the pattern: - - /FOO[xX]A.*B[xX]BAR/ - - Both 'FOO' and 'A' are fixed strings. Both 'B' and 'BAR' are floating - strings (because they follow a .* construct). study_chunk will identify - both FOO and BAR as being the longest fixed and floating strings respectively. - - The strings can be composites, for instance - - /(f)(o)(o)/ - - will result in a composite fixed substring 'foo'. - - For each string some basic information is maintained: - - - min_offset - This is the position the string must appear at, or not before. - It also implicitly (when combined with minlenp) tells us how many - characters must match before the string we are searching for. - Likewise when combined with minlenp and the length of the string it - tells us how many characters must appear after the string we have - found. - - - max_offset - Only used for floating strings. This is the rightmost point that - the string can appear at. If set to OPTIMIZE_INFTY it indicates that the - string can occur infinitely far to the right. - For fixed strings, it is equal to min_offset. - - - minlenp - A pointer to the minimum number of characters of the pattern that the - string was found inside. This is important as in the case of positive - lookahead or positive lookbehind we can have multiple patterns - involved. Consider - - /(?=FOO).*F/ - - The minimum length of the pattern overall is 3, the minimum length - of the lookahead part is 3, but the minimum length of the part that - will actually match is 1. So 'FOO's minimum length is 3, but the - minimum length for the F is 1. This is important as the minimum length - is used to determine offsets in front of and behind the string being - looked for. Since strings can be composites this is the length of the - pattern at the time it was committed with a scan_commit. Note that - the length is calculated by study_chunk, so that the minimum lengths - are not known until the full pattern has been compiled, thus the - pointer to the value. - - - lookbehind - - In the case of lookbehind the string being searched for can be - offset past the start point of the final matching string. - If this value was just blithely removed from the min_offset it would - invalidate some of the calculations for how many chars must match - before or after (as they are derived from min_offset and minlen and - the length of the string being searched for). - When the final pattern is compiled and the data is moved from the - scan_data_t structure into the regexp structure the information - about lookbehind is factored in, with the information that would - have been lost precalculated in the end_shift field for the - associated string. - - The fields pos_min and pos_delta are used to store the minimum offset - and the delta to the maximum offset at the current point in the pattern. - -*/ - -struct scan_data_substrs { - SV *str; /* longest substring found in pattern */ - SSize_t min_offset; /* earliest point in string it can appear */ - SSize_t max_offset; /* latest point in string it can appear */ - SSize_t *minlenp; /* pointer to the minlen relevant to the string */ - SSize_t lookbehind; /* is the pos of the string modified by LB */ - I32 flags; /* per substring SF_* and SCF_* flags */ -}; - -typedef struct scan_data_t { - /*I32 len_min; unused */ - /*I32 len_delta; unused */ - SSize_t pos_min; - SSize_t pos_delta; - SV *last_found; - SSize_t last_end; /* min value, <0 unless valid. */ - SSize_t last_start_min; - SSize_t last_start_max; - U8 cur_is_floating; /* whether the last_* values should be set as - * the next fixed (0) or floating (1) - * substring */ - - /* [0] is longest fixed substring so far, [1] is longest float so far */ - struct scan_data_substrs substrs[2]; - - I32 flags; /* common SF_* and SCF_* flags */ - I32 whilem_c; - SSize_t *last_closep; - regnode **last_close_opp; /* pointer to pointer to last CLOSE regop - seen. DO NOT DEREFERENCE the regnode - pointer - the op may have been optimized - away */ - regnode_ssc *start_class; -} scan_data_t; - -/* - * Forward declarations for pregcomp()'s friends. - */ - -static const scan_data_t zero_scan_data = { - 0, 0, NULL, 0, 0, 0, 0, - { - { NULL, 0, 0, 0, 0, 0 }, - { NULL, 0, 0, 0, 0, 0 }, - }, - 0, 0, NULL, NULL, NULL -}; - -/* study flags */ - -#define SF_BEFORE_SEOL 0x0001 -#define SF_BEFORE_MEOL 0x0002 -#define SF_BEFORE_EOL (SF_BEFORE_SEOL|SF_BEFORE_MEOL) - -#define SF_IS_INF 0x0040 -#define SF_HAS_PAR 0x0080 -#define SF_IN_PAR 0x0100 -#define SF_HAS_EVAL 0x0200 - - -/* SCF_DO_SUBSTR is the flag that tells the regexp analyzer to track the - * longest substring in the pattern. When it is not set the optimiser keeps - * track of position, but does not keep track of the actual strings seen, - * - * So for instance /foo/ will be parsed with SCF_DO_SUBSTR being true, but - * /foo/i will not. - * - * Similarly, /foo.*(blah|erm|huh).*fnorble/ will have "foo" and "fnorble" - * parsed with SCF_DO_SUBSTR on, but while processing the (...) it will be - * turned off because of the alternation (BRANCH). */ -#define SCF_DO_SUBSTR 0x0400 - -#define SCF_DO_STCLASS_AND 0x0800 -#define SCF_DO_STCLASS_OR 0x1000 -#define SCF_DO_STCLASS (SCF_DO_STCLASS_AND|SCF_DO_STCLASS_OR) -#define SCF_WHILEM_VISITED_POS 0x2000 - -#define SCF_TRIE_RESTUDY 0x4000 /* Need to do restudy in study_chunk()? - Search for "restudy" in this file - to find a detailed explanation.*/ -#define SCF_SEEN_ACCEPT 0x8000 -#define SCF_TRIE_DOING_RESTUDY 0x10000 /* Are we in restudy right now? - Search for "restudy" in this file - to find a detailed explanation. */ -#define SCF_IN_DEFINE 0x20000 - - - -#define UTF cBOOL(RExC_utf8) - -/* The enums for all these are ordered so things work out correctly */ -#define LOC (get_regex_charset(RExC_flags) == REGEX_LOCALE_CHARSET) -#define DEPENDS_SEMANTICS (get_regex_charset(RExC_flags) \ - == REGEX_DEPENDS_CHARSET) -#define UNI_SEMANTICS (get_regex_charset(RExC_flags) == REGEX_UNICODE_CHARSET) -#define AT_LEAST_UNI_SEMANTICS (get_regex_charset(RExC_flags) \ - >= REGEX_UNICODE_CHARSET) -#define ASCII_RESTRICTED (get_regex_charset(RExC_flags) \ - == REGEX_ASCII_RESTRICTED_CHARSET) -#define AT_LEAST_ASCII_RESTRICTED (get_regex_charset(RExC_flags) \ - >= REGEX_ASCII_RESTRICTED_CHARSET) -#define ASCII_FOLD_RESTRICTED (get_regex_charset(RExC_flags) \ - == REGEX_ASCII_MORE_RESTRICTED_CHARSET) - -#define FOLD cBOOL(RExC_flags & RXf_PMf_FOLD) - -/* For programs that want to be strictly Unicode compatible by dying if any - * attempt is made to match a non-Unicode code point against a Unicode - * property. */ -#define ALWAYS_WARN_SUPER ckDEAD(packWARN(WARN_NON_UNICODE)) - -#define OOB_NAMEDCLASS -1 - -/* There is no code point that is out-of-bounds, so this is problematic. But - * its only current use is to initialize a variable that is always set before - * looked at. */ -#define OOB_UNICODE 0xDEADBEEF - -#define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv)) - - -/* length of regex to show in messages that don't mark a position within */ -#define RegexLengthToShowInErrorMessages 127 - -/* - * If MARKER[12] are adjusted, be sure to adjust the constants at the top - * of t/op/regmesg.t, the tests in t/op/re_tests, and those in - * op/pragma/warn/regcomp. - */ -#define MARKER1 "<-- HERE" /* marker as it appears in the description */ -#define MARKER2 " <-- HERE " /* marker as it appears within the regex */ - -#define REPORT_LOCATION " in regex; marked by " MARKER1 \ - " in m/%" UTF8f MARKER2 "%" UTF8f "/" - -/* The code in this file in places uses one level of recursion with parsing - * rebased to an alternate string constructed by us in memory. This can take - * the form of something that is completely different from the input, or - * something that uses the input as part of the alternate. In the first case, - * there should be no possibility of an error, as we are in complete control of - * the alternate string. But in the second case we don't completely control - * the input portion, so there may be errors in that. Here's an example: - * /[abc\x{DF}def]/ui - * is handled specially because \x{df} folds to a sequence of more than one - * character: 'ss'. What is done is to create and parse an alternate string, - * which looks like this: - * /(?:\x{DF}|[abc\x{DF}def])/ui - * where it uses the input unchanged in the middle of something it constructs, - * which is a branch for the DF outside the character class, and clustering - * parens around the whole thing. (It knows enough to skip the DF inside the - * class while in this substitute parse.) 'abc' and 'def' may have errors that - * need to be reported. The general situation looks like this: - * - * |<------- identical ------>| - * sI tI xI eI - * Input: --------------------------------------------------------------- - * Constructed: --------------------------------------------------- - * sC tC xC eC EC - * |<------- identical ------>| - * - * sI..eI is the portion of the input pattern we are concerned with here. - * sC..EC is the constructed substitute parse string. - * sC..tC is constructed by us - * tC..eC is an exact duplicate of the portion of the input pattern tI..eI. - * In the diagram, these are vertically aligned. - * eC..EC is also constructed by us. - * xC is the position in the substitute parse string where we found a - * problem. - * xI is the position in the original pattern corresponding to xC. - * - * We want to display a message showing the real input string. Thus we need to - * translate from xC to xI. We know that xC >= tC, since the portion of the - * string sC..tC has been constructed by us, and so shouldn't have errors. We - * get: - * xI = tI + (xC - tC) - * - * When the substitute parse is constructed, the code needs to set: - * RExC_start (sC) - * RExC_end (eC) - * RExC_copy_start_in_input (tI) - * RExC_copy_start_in_constructed (tC) - * and restore them when done. - * - * During normal processing of the input pattern, both - * 'RExC_copy_start_in_input' and 'RExC_copy_start_in_constructed' are set to - * sI, so that xC equals xI. - */ - -#define sI RExC_precomp -#define eI RExC_precomp_end -#define sC RExC_start -#define eC RExC_end -#define tI RExC_copy_start_in_input -#define tC RExC_copy_start_in_constructed -#define xI(xC) (tI + (xC - tC)) -#define xI_offset(xC) (xI(xC) - sI) - -#define REPORT_LOCATION_ARGS(xC) \ - UTF8fARG(UTF, \ - (xI(xC) > eI) /* Don't run off end */ \ - ? eI - sI /* Length before the <--HERE */ \ - : ((xI_offset(xC) >= 0) \ - ? xI_offset(xC) \ - : (Perl_croak(aTHX_ "panic: %s: %d: negative offset: %" \ - IVdf " trying to output message for " \ - " pattern %.*s", \ - __FILE__, __LINE__, (IV) xI_offset(xC), \ - ((int) (eC - sC)), sC), 0)), \ - sI), /* The input pattern printed up to the <--HERE */ \ - UTF8fARG(UTF, \ - (xI(xC) > eI) ? 0 : eI - xI(xC), /* Length after <--HERE */ \ - (xI(xC) > eI) ? eI : xI(xC)) /* pattern after <--HERE */ - -/* Used to point after bad bytes for an error message, but avoid skipping - * past a nul byte. */ -#define SKIP_IF_CHAR(s, e) (!*(s) ? 0 : UTF ? UTF8_SAFE_SKIP(s, e) : 1) - -/* Set up to clean up after our imminent demise */ -#define PREPARE_TO_DIE \ - STMT_START { \ - if (RExC_rx_sv) \ - SAVEFREESV(RExC_rx_sv); \ - if (RExC_open_parens) \ - SAVEFREEPV(RExC_open_parens); \ - if (RExC_close_parens) \ - SAVEFREEPV(RExC_close_parens); \ - } STMT_END - -/* - * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given - * arg. Show regex, up to a maximum length. If it's too long, chop and add - * "...". - */ -#define _FAIL(code) STMT_START { \ - const char *ellipses = ""; \ - IV len = RExC_precomp_end - RExC_precomp; \ - \ - PREPARE_TO_DIE; \ - if (len > RegexLengthToShowInErrorMessages) { \ - /* chop 10 shorter than the max, to ensure meaning of "..." */ \ - len = RegexLengthToShowInErrorMessages - 10; \ - ellipses = "..."; \ - } \ - code; \ -} STMT_END - -#define FAIL(msg) _FAIL( \ - Perl_croak(aTHX_ "%s in regex m/%" UTF8f "%s/", \ - msg, UTF8fARG(UTF, len, RExC_precomp), ellipses)) - -#define FAIL2(msg,arg) _FAIL( \ - Perl_croak(aTHX_ msg " in regex m/%" UTF8f "%s/", \ - arg, UTF8fARG(UTF, len, RExC_precomp), ellipses)) - -#define FAIL3(msg,arg1,arg2) _FAIL( \ - Perl_croak(aTHX_ msg " in regex m/%" UTF8f "%s/", \ - arg1, arg2, UTF8fARG(UTF, len, RExC_precomp), ellipses)) - -/* - * Simple_vFAIL -- like FAIL, but marks the current location in the scan - */ -#define Simple_vFAIL(m) STMT_START { \ - Perl_croak(aTHX_ "%s" REPORT_LOCATION, \ - m, REPORT_LOCATION_ARGS(RExC_parse)); \ -} STMT_END - -/* - * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL() - */ -#define vFAIL(m) STMT_START { \ - PREPARE_TO_DIE; \ - Simple_vFAIL(m); \ -} STMT_END - -/* - * Like Simple_vFAIL(), but accepts two arguments. - */ -#define Simple_vFAIL2(m,a1) STMT_START { \ - S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, \ - REPORT_LOCATION_ARGS(RExC_parse)); \ -} STMT_END - -/* - * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL2(). - */ -#define vFAIL2(m,a1) STMT_START { \ - PREPARE_TO_DIE; \ - Simple_vFAIL2(m, a1); \ -} STMT_END - - -/* - * Like Simple_vFAIL(), but accepts three arguments. - */ -#define Simple_vFAIL3(m, a1, a2) STMT_START { \ - S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, a2, \ - REPORT_LOCATION_ARGS(RExC_parse)); \ -} STMT_END - -/* - * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL3(). - */ -#define vFAIL3(m,a1,a2) STMT_START { \ - PREPARE_TO_DIE; \ - Simple_vFAIL3(m, a1, a2); \ -} STMT_END - -/* - * Like Simple_vFAIL(), but accepts four arguments. - */ -#define Simple_vFAIL4(m, a1, a2, a3) STMT_START { \ - S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, a2, a3, \ - REPORT_LOCATION_ARGS(RExC_parse)); \ -} STMT_END - -#define vFAIL4(m,a1,a2,a3) STMT_START { \ - PREPARE_TO_DIE; \ - Simple_vFAIL4(m, a1, a2, a3); \ -} STMT_END - -/* A specialized version of vFAIL2 that works with UTF8f */ -#define vFAIL2utf8f(m, a1) STMT_START { \ - PREPARE_TO_DIE; \ - S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, \ - REPORT_LOCATION_ARGS(RExC_parse)); \ -} STMT_END - -#define vFAIL3utf8f(m, a1, a2) STMT_START { \ - PREPARE_TO_DIE; \ - S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, a2, \ - REPORT_LOCATION_ARGS(RExC_parse)); \ -} STMT_END - -/* Setting this to NULL is a signal to not output warnings */ -#define TURN_OFF_WARNINGS_IN_SUBSTITUTE_PARSE \ - STMT_START { \ - RExC_save_copy_start_in_constructed = RExC_copy_start_in_constructed;\ - RExC_copy_start_in_constructed = NULL; \ - } STMT_END -#define RESTORE_WARNINGS \ - RExC_copy_start_in_constructed = RExC_save_copy_start_in_constructed - -/* Since a warning can be generated multiple times as the input is reparsed, we - * output it the first time we come to that point in the parse, but suppress it - * otherwise. 'RExC_copy_start_in_constructed' being NULL is a flag to not - * generate any warnings */ -#define TO_OUTPUT_WARNINGS(loc) \ - ( RExC_copy_start_in_constructed \ - && ((xI(loc)) - RExC_precomp) > (Ptrdiff_t) RExC_latest_warn_offset) - -/* After we've emitted a warning, we save the position in the input so we don't - * output it again */ -#define UPDATE_WARNINGS_LOC(loc) \ - STMT_START { \ - if (TO_OUTPUT_WARNINGS(loc)) { \ - RExC_latest_warn_offset = MAX(sI, MIN(eI, xI(loc))) \ - - RExC_precomp; \ - } \ - } STMT_END - -/* 'warns' is the output of the packWARNx macro used in 'code' */ -#define _WARN_HELPER(loc, warns, code) \ - STMT_START { \ - if (! RExC_copy_start_in_constructed) { \ - Perl_croak( aTHX_ "panic! %s: %d: Tried to warn when none" \ - " expected at '%s'", \ - __FILE__, __LINE__, loc); \ - } \ - if (TO_OUTPUT_WARNINGS(loc)) { \ - if (ckDEAD(warns)) \ - PREPARE_TO_DIE; \ - code; \ - UPDATE_WARNINGS_LOC(loc); \ - } \ - } STMT_END - -/* m is not necessarily a "literal string", in this macro */ -#define warn_non_literal_string(loc, packed_warn, m) \ - _WARN_HELPER(loc, packed_warn, \ - Perl_warner(aTHX_ packed_warn, \ - "%s" REPORT_LOCATION, \ - m, REPORT_LOCATION_ARGS(loc))) -#define reg_warn_non_literal_string(loc, m) \ - warn_non_literal_string(loc, packWARN(WARN_REGEXP), m) - -#define ckWARN2_non_literal_string(loc, packwarn, m, a1) \ - STMT_START { \ - char * format; \ - Size_t format_size = strlen(m) + strlen(REPORT_LOCATION)+ 1;\ - Newx(format, format_size, char); \ - my_strlcpy(format, m, format_size); \ - my_strlcat(format, REPORT_LOCATION, format_size); \ - SAVEFREEPV(format); \ - _WARN_HELPER(loc, packwarn, \ - Perl_ck_warner(aTHX_ packwarn, \ - format, \ - a1, REPORT_LOCATION_ARGS(loc))); \ - } STMT_END - -#define ckWARNreg(loc,m) \ - _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ - Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), \ - m REPORT_LOCATION, \ - REPORT_LOCATION_ARGS(loc))) - -#define vWARN(loc, m) \ - _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ - Perl_warner(aTHX_ packWARN(WARN_REGEXP), \ - m REPORT_LOCATION, \ - REPORT_LOCATION_ARGS(loc))) \ - -#define vWARN_dep(loc, m) \ - _WARN_HELPER(loc, packWARN(WARN_DEPRECATED), \ - Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), \ - m REPORT_LOCATION, \ - REPORT_LOCATION_ARGS(loc))) - -#define ckWARNdep(loc,m) \ - _WARN_HELPER(loc, packWARN(WARN_DEPRECATED), \ - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), \ - m REPORT_LOCATION, \ - REPORT_LOCATION_ARGS(loc))) - -#define ckWARNregdep(loc,m) \ - _WARN_HELPER(loc, packWARN2(WARN_DEPRECATED, WARN_REGEXP), \ - Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, \ - WARN_REGEXP), \ - m REPORT_LOCATION, \ - REPORT_LOCATION_ARGS(loc))) - -#define ckWARN2reg_d(loc,m, a1) \ - _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ - Perl_ck_warner_d(aTHX_ packWARN(WARN_REGEXP), \ - m REPORT_LOCATION, \ - a1, REPORT_LOCATION_ARGS(loc))) - -#define ckWARN2reg(loc, m, a1) \ - _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ - Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), \ - m REPORT_LOCATION, \ - a1, REPORT_LOCATION_ARGS(loc))) - -#define vWARN3(loc, m, a1, a2) \ - _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ - Perl_warner(aTHX_ packWARN(WARN_REGEXP), \ - m REPORT_LOCATION, \ - a1, a2, REPORT_LOCATION_ARGS(loc))) - -#define ckWARN3reg(loc, m, a1, a2) \ - _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ - Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), \ - m REPORT_LOCATION, \ - a1, a2, \ - REPORT_LOCATION_ARGS(loc))) - -#define vWARN4(loc, m, a1, a2, a3) \ - _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ - Perl_warner(aTHX_ packWARN(WARN_REGEXP), \ - m REPORT_LOCATION, \ - a1, a2, a3, \ - REPORT_LOCATION_ARGS(loc))) - -#define ckWARN4reg(loc, m, a1, a2, a3) \ - _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ - Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), \ - m REPORT_LOCATION, \ - a1, a2, a3, \ - REPORT_LOCATION_ARGS(loc))) - -#define vWARN5(loc, m, a1, a2, a3, a4) \ - _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ - Perl_warner(aTHX_ packWARN(WARN_REGEXP), \ - m REPORT_LOCATION, \ - a1, a2, a3, a4, \ - REPORT_LOCATION_ARGS(loc))) - -#define ckWARNexperimental(loc, class, m) \ - STMT_START { \ - if (! RExC_warned_ ## class) { /* warn once per compilation */ \ - RExC_warned_ ## class = 1; \ - _WARN_HELPER(loc, packWARN(class), \ - Perl_ck_warner_d(aTHX_ packWARN(class), \ - m REPORT_LOCATION, \ - REPORT_LOCATION_ARGS(loc)));\ - } \ - } STMT_END - -#define ckWARNexperimental_with_arg(loc, class, m, arg) \ - STMT_START { \ - if (! RExC_warned_ ## class) { /* warn once per compilation */ \ - RExC_warned_ ## class = 1; \ - _WARN_HELPER(loc, packWARN(class), \ - Perl_ck_warner_d(aTHX_ packWARN(class), \ - m REPORT_LOCATION, \ - arg, REPORT_LOCATION_ARGS(loc)));\ - } \ - } STMT_END - -/* Convert between a pointer to a node and its offset from the beginning of the - * program */ -#define REGNODE_p(offset) (RExC_emit_start + (offset)) -#define REGNODE_OFFSET(node) ((node) - RExC_emit_start) - -#define ProgLen(ri) ri->proglen -#define SetProgLen(ri,x) ri->proglen = x - -#if PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS -#define EXPERIMENTAL_INPLACESCAN -#endif /*PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS*/ - -#ifdef DEBUGGING -int -Perl_re_printf(pTHX_ const char *fmt, ...) -{ - va_list ap; - int result; - PerlIO *f= Perl_debug_log; - PERL_ARGS_ASSERT_RE_PRINTF; - va_start(ap, fmt); - result = PerlIO_vprintf(f, fmt, ap); - va_end(ap); - return result; -} - -int -Perl_re_indentf(pTHX_ const char *fmt, U32 depth, ...) -{ - va_list ap; - int result; - PerlIO *f= Perl_debug_log; - PERL_ARGS_ASSERT_RE_INDENTF; - va_start(ap, depth); - PerlIO_printf(f, "%*s", ( (int)depth % 20 ) * 2, ""); - result = PerlIO_vprintf(f, fmt, ap); - va_end(ap); - return result; -} -#endif /* DEBUGGING */ - -#define DEBUG_RExC_seen() \ - DEBUG_OPTIMISE_MORE_r({ \ - Perl_re_printf( aTHX_ "RExC_seen: "); \ - \ - if (RExC_seen & REG_ZERO_LEN_SEEN) \ - Perl_re_printf( aTHX_ "REG_ZERO_LEN_SEEN "); \ - \ - if (RExC_seen & REG_LOOKBEHIND_SEEN) \ - Perl_re_printf( aTHX_ "REG_LOOKBEHIND_SEEN "); \ - \ - if (RExC_seen & REG_GPOS_SEEN) \ - Perl_re_printf( aTHX_ "REG_GPOS_SEEN "); \ - \ - if (RExC_seen & REG_RECURSE_SEEN) \ - Perl_re_printf( aTHX_ "REG_RECURSE_SEEN "); \ - \ - if (RExC_seen & REG_TOP_LEVEL_BRANCHES_SEEN) \ - Perl_re_printf( aTHX_ "REG_TOP_LEVEL_BRANCHES_SEEN "); \ - \ - if (RExC_seen & REG_VERBARG_SEEN) \ - Perl_re_printf( aTHX_ "REG_VERBARG_SEEN "); \ - \ - if (RExC_seen & REG_CUTGROUP_SEEN) \ - Perl_re_printf( aTHX_ "REG_CUTGROUP_SEEN "); \ - \ - if (RExC_seen & REG_RUN_ON_COMMENT_SEEN) \ - Perl_re_printf( aTHX_ "REG_RUN_ON_COMMENT_SEEN "); \ - \ - if (RExC_seen & REG_UNFOLDED_MULTI_SEEN) \ - Perl_re_printf( aTHX_ "REG_UNFOLDED_MULTI_SEEN "); \ - \ - if (RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN) \ - Perl_re_printf( aTHX_ "REG_UNBOUNDED_QUANTIFIER_SEEN "); \ - \ - Perl_re_printf( aTHX_ "\n"); \ - }); - -#define DEBUG_SHOW_STUDY_FLAG(flags,flag) \ - if ((flags) & flag) Perl_re_printf( aTHX_ "%s ", #flag) - - -#ifdef DEBUGGING -static void -S_debug_show_study_flags(pTHX_ U32 flags, const char *open_str, - const char *close_str) -{ - if (!flags) - return; - - Perl_re_printf( aTHX_ "%s", open_str); - DEBUG_SHOW_STUDY_FLAG(flags, SF_BEFORE_SEOL); - DEBUG_SHOW_STUDY_FLAG(flags, SF_BEFORE_MEOL); - DEBUG_SHOW_STUDY_FLAG(flags, SF_IS_INF); - DEBUG_SHOW_STUDY_FLAG(flags, SF_HAS_PAR); - DEBUG_SHOW_STUDY_FLAG(flags, SF_IN_PAR); - DEBUG_SHOW_STUDY_FLAG(flags, SF_HAS_EVAL); - DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_SUBSTR); - DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_STCLASS_AND); - DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_STCLASS_OR); - DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_STCLASS); - DEBUG_SHOW_STUDY_FLAG(flags, SCF_WHILEM_VISITED_POS); - DEBUG_SHOW_STUDY_FLAG(flags, SCF_TRIE_RESTUDY); - DEBUG_SHOW_STUDY_FLAG(flags, SCF_SEEN_ACCEPT); - DEBUG_SHOW_STUDY_FLAG(flags, SCF_TRIE_DOING_RESTUDY); - DEBUG_SHOW_STUDY_FLAG(flags, SCF_IN_DEFINE); - Perl_re_printf( aTHX_ "%s", close_str); -} - - -static void -S_debug_studydata(pTHX_ const char *where, scan_data_t *data, - U32 depth, int is_inf, - SSize_t min, SSize_t stopmin, SSize_t delta) -{ - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - DEBUG_OPTIMISE_MORE_r({ - if (!data) - return; - Perl_re_indentf(aTHX_ "%s: M/S/D: %" IVdf "/%" IVdf "/%" IVdf " Pos:%" IVdf "/%" IVdf " Flags: 0x%" UVXf, - depth, - where, - min, stopmin, delta, - (IV)data->pos_min, - (IV)data->pos_delta, - (UV)data->flags - ); - - S_debug_show_study_flags(aTHX_ data->flags," [","]"); - - Perl_re_printf( aTHX_ - " Whilem_c: %" IVdf " Lcp: %" IVdf " %s", - (IV)data->whilem_c, - (IV)(data->last_closep ? *((data)->last_closep) : -1), - is_inf ? "INF " : "" - ); - - if (data->last_found) { - int i; - Perl_re_printf(aTHX_ - "Last:'%s' %" IVdf ":%" IVdf "/%" IVdf, - SvPVX_const(data->last_found), - (IV)data->last_end, - (IV)data->last_start_min, - (IV)data->last_start_max - ); - - for (i = 0; i < 2; i++) { - Perl_re_printf(aTHX_ - " %s%s: '%s' @ %" IVdf "/%" IVdf, - data->cur_is_floating == i ? "*" : "", - i ? "Float" : "Fixed", - SvPVX_const(data->substrs[i].str), - (IV)data->substrs[i].min_offset, - (IV)data->substrs[i].max_offset - ); - S_debug_show_study_flags(aTHX_ data->substrs[i].flags," [","]"); - } - } - - Perl_re_printf( aTHX_ "\n"); - }); -} - - -static void -S_debug_peep(pTHX_ const char *str, const RExC_state_t *pRExC_state, - regnode *scan, U32 depth, U32 flags) -{ - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - DEBUG_OPTIMISE_r({ - regnode *Next; - - if (!scan) - return; - Next = regnext(scan); - regprop(RExC_rx, RExC_mysv, scan, NULL, pRExC_state); - Perl_re_indentf( aTHX_ "%s>%3d: %s (%d)", - depth, - str, - REG_NODE_NUM(scan), SvPV_nolen_const(RExC_mysv), - Next ? (REG_NODE_NUM(Next)) : 0 ); - S_debug_show_study_flags(aTHX_ flags," [ ","]"); - Perl_re_printf( aTHX_ "\n"); - }); -} - - -# define DEBUG_STUDYDATA(where, data, depth, is_inf, min, stopmin, delta) \ - S_debug_studydata(aTHX_ where, data, depth, is_inf, min, stopmin, delta) - -# define DEBUG_PEEP(str, scan, depth, flags) \ - S_debug_peep(aTHX_ str, pRExC_state, scan, depth, flags) - -#else -# define DEBUG_STUDYDATA(where, data, depth, is_inf, min, stopmin, delta) NOOP -# define DEBUG_PEEP(str, scan, depth, flags) NOOP -#endif - +#include "regcomp_internal.h" /* ========================================================= * BEGIN edit_distance stuff. @@ -1526,7 +238,7 @@ S_edit_distance(const UV* src, PERL_ARGS_ASSERT_EDIT_DISTANCE; - /* intialize matrix start values */ + /* initialize matrix start values */ Newx(scores, ( (x + 2) * (y + 2)), UV); scores[0] = score_ceil; scores[1 * (y + 2) + 0] = score_ceil; @@ -1578,9534 +290,2171 @@ S_edit_distance(const UV* src, /* END of edit_distance() stuff * ========================================================= */ -/* Mark that we cannot extend a found fixed substring at this point. - Update the longest found anchored substring or the longest found - floating substrings if needed. */ - -STATIC void -S_scan_commit(pTHX_ const RExC_state_t *pRExC_state, scan_data_t *data, - SSize_t *minlenp, int is_inf) +/* add a data member to the struct reg_data attached to this regex, it should + * always return a non-zero return. the 's' argument is the type of the items + * being added and the n is the number of items. The length of 's' should match + * the number of items. */ +U32 +Perl_reg_add_data(RExC_state_t* const pRExC_state, const char* const s, const U32 n) { - const STRLEN l = CHR_SVLEN(data->last_found); - SV * const longest_sv = data->substrs[data->cur_is_floating].str; - const STRLEN old_l = CHR_SVLEN(longest_sv); - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - PERL_ARGS_ASSERT_SCAN_COMMIT; - - if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) { - const U8 i = data->cur_is_floating; - SvSetMagicSV(longest_sv, data->last_found); - data->substrs[i].min_offset = l ? data->last_start_min : data->pos_min; - - if (!i) /* fixed */ - data->substrs[0].max_offset = data->substrs[0].min_offset; - else { /* float */ - data->substrs[1].max_offset = - (is_inf) - ? OPTIMIZE_INFTY - : (l - ? data->last_start_max - /* temporary underflow guard for 5.32 */ - : data->pos_delta < 0 ? OPTIMIZE_INFTY - : (data->pos_delta > OPTIMIZE_INFTY - data->pos_min - ? OPTIMIZE_INFTY - : data->pos_min + data->pos_delta)); - } - - data->substrs[i].flags &= ~SF_BEFORE_EOL; - data->substrs[i].flags |= data->flags & SF_BEFORE_EOL; - data->substrs[i].minlenp = minlenp; - data->substrs[i].lookbehind = 0; - } - - SvCUR_set(data->last_found, 0); - { - SV * const sv = data->last_found; - if (SvUTF8(sv) && SvMAGICAL(sv)) { - MAGIC * const mg = mg_find(sv, PERL_MAGIC_utf8); - if (mg) - mg->mg_len = 0; - } - } - data->last_end = -1; - data->flags &= ~SF_BEFORE_EOL; - DEBUG_STUDYDATA("commit", data, 0, is_inf, -1, -1, -1); -} + U32 count = RExC_rxi->data ? RExC_rxi->data->count : 1; -/* An SSC is just a regnode_charclass_posix with an extra field: the inversion - * list that describes which code points it matches */ + PERL_ARGS_ASSERT_REG_ADD_DATA; -STATIC void -S_ssc_anything(pTHX_ regnode_ssc *ssc) -{ - /* Set the SSC 'ssc' to match an empty string or any code point */ - - PERL_ARGS_ASSERT_SSC_ANYTHING; - - assert(is_ANYOF_SYNTHETIC(ssc)); - - /* mortalize so won't leak */ - ssc->invlist = sv_2mortal(_add_range_to_invlist(NULL, 0, UV_MAX)); - ANYOF_FLAGS(ssc) |= SSC_MATCHES_EMPTY_STRING; /* Plus matches empty */ + /* in the below expression we have (count + n - 1), the minus one is there + * because the struct that we allocate already contains a slot for 1 data + * item, so we do not need to allocate it the first time. IOW, the + * sizeof(*RExC_rxi->data) already accounts for one of the elements we need + * to allocate. See struct reg_data in regcomp.h + */ + Renewc(RExC_rxi->data, + sizeof(*RExC_rxi->data) + (sizeof(void*) * (count + n - 1)), + char, struct reg_data); + /* however in the data->what expression we use (count + n) and do not + * subtract one from the result because the data structure contains a + * pointer to an array, and does not allocate the first element as part of + * the data struct. */ + if (count > 1) + Renew(RExC_rxi->data->what, (count + n), U8); + else { + /* when count == 1 it means we have not initialized anything. + * we always fill the 0 slot of the data array with a '%' entry, which + * means "zero" (all the other types are letters) which exists purely + * so the return from reg_add_data is ALWAYS true, so we can tell it apart + * from a "no value" idx=0 in places where we would return an index + * into reg_add_data. This is particularly important with the new "single + * pass, usually, but not always" strategy that we use, where the code + * will use a 0 to represent "not able to compute this yet". + */ + Newx(RExC_rxi->data->what, n+1, U8); + /* fill in the placeholder slot of 0 with a what of '%', we use + * this because it sorta looks like a zero (0/0) and it is not a letter + * like any of the other "whats", this type should never be created + * any other way but here. '%' happens to also not appear in this + * file for any other reason (at the time of writing this comment)*/ + RExC_rxi->data->what[0]= '%'; + RExC_rxi->data->data[0]= NULL; + } + RExC_rxi->data->count = count + n; + Copy(s, RExC_rxi->data->what + count, n, U8); + assert(count>0); + return count; } -STATIC int -S_ssc_is_anything(const regnode_ssc *ssc) +/*XXX: todo make this not included in a non debugging perl, but appears to be + * used anyway there, in 'use re' */ +#ifndef PERL_IN_XSUB_RE +void +Perl_reginitcolors(pTHX) { - /* Returns TRUE if the SSC 'ssc' can match the empty string and any code - * point; FALSE otherwise. Thus, this is used to see if using 'ssc' buys - * us anything: if the function returns TRUE, 'ssc' hasn't been restricted - * in any way, so there's no point in using it */ - - UV start, end; - bool ret; - - PERL_ARGS_ASSERT_SSC_IS_ANYTHING; - - assert(is_ANYOF_SYNTHETIC(ssc)); - - if (! (ANYOF_FLAGS(ssc) & SSC_MATCHES_EMPTY_STRING)) { - return FALSE; - } - - /* See if the list consists solely of the range 0 - Infinity */ - invlist_iterinit(ssc->invlist); - ret = invlist_iternext(ssc->invlist, &start, &end) - && start == 0 - && end == UV_MAX; - - invlist_iterfinish(ssc->invlist); - - if (ret) { - return TRUE; - } - - /* If e.g., both \w and \W are set, matches everything */ - if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) { - int i; - for (i = 0; i < ANYOF_POSIXL_MAX; i += 2) { - if (ANYOF_POSIXL_TEST(ssc, i) && ANYOF_POSIXL_TEST(ssc, i+1)) { - return TRUE; + const char * const s = PerlEnv_getenv("PERL_RE_COLORS"); + if (s) { + char *t = savepv(s); + int i = 0; + PL_colors[0] = t; + while (++i < 6) { + t = strchr(t, '\t'); + if (t) { + *t = '\0'; + PL_colors[i] = ++t; } + else + PL_colors[i] = t = (char *)""; } + } else { + int i = 0; + while (i < 6) + PL_colors[i++] = (char *)""; } - - return FALSE; -} - -STATIC void -S_ssc_init(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc) -{ - /* Initializes the SSC 'ssc'. This includes setting it to match an empty - * string, any code point, or any posix class under locale */ - - PERL_ARGS_ASSERT_SSC_INIT; - - Zero(ssc, 1, regnode_ssc); - set_ANYOF_SYNTHETIC(ssc); - ARG_SET(ssc, ANYOF_ONLY_HAS_BITMAP); - ssc_anything(ssc); - - /* If any portion of the regex is to operate under locale rules that aren't - * fully known at compile time, initialization includes it. The reason - * this isn't done for all regexes is that the optimizer was written under - * the assumption that locale was all-or-nothing. Given the complexity and - * lack of documentation in the optimizer, and that there are inadequate - * test cases for locale, many parts of it may not work properly, it is - * safest to avoid locale unless necessary. */ - if (RExC_contains_locale) { - ANYOF_POSIXL_SETALL(ssc); - } - else { - ANYOF_POSIXL_ZERO(ssc); - } + PL_colorset = 1; } +#endif -STATIC int -S_ssc_is_cp_posixl_init(const RExC_state_t *pRExC_state, - const regnode_ssc *ssc) -{ - /* Returns TRUE if the SSC 'ssc' is in its initial state with regard only - * to the list of code points matched, and locale posix classes; hence does - * not check its flags) */ - UV start, end; - bool ret; +#ifdef TRIE_STUDY_OPT +/* search for "restudy" in this file for a detailed explanation */ +#define CHECK_RESTUDY_GOTO_butfirst(dOsomething) \ + STMT_START { \ + if ( \ + (data.flags & SCF_TRIE_RESTUDY) \ + && ! restudied++ \ + ) { \ + dOsomething; \ + goto reStudy; \ + } \ + } STMT_END +#else +#define CHECK_RESTUDY_GOTO_butfirst +#endif - PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT; +/* + * pregcomp - compile a regular expression into internal code + * + * Decides which engine's compiler to call based on the hint currently in + * scope + */ - assert(is_ANYOF_SYNTHETIC(ssc)); +#ifndef PERL_IN_XSUB_RE - invlist_iterinit(ssc->invlist); - ret = invlist_iternext(ssc->invlist, &start, &end) - && start == 0 - && end == UV_MAX; +/* return the currently in-scope regex engine (or the default if none) */ - invlist_iterfinish(ssc->invlist); +regexp_engine const * +Perl_current_re_engine(pTHX) +{ + if (IN_PERL_COMPILETIME) { + HV * const table = GvHV(PL_hintgv); + SV **ptr; - if (! ret) { - return FALSE; + if (!table || !(PL_hints & HINT_LOCALIZE_HH)) + return &PL_core_reg_engine; + ptr = hv_fetchs(table, "regcomp", FALSE); + if ( !(ptr && SvIOK(*ptr) && SvIV(*ptr))) + return &PL_core_reg_engine; + return INT2PTR(regexp_engine*, SvIV(*ptr)); } - - if (RExC_contains_locale && ! ANYOF_POSIXL_SSC_TEST_ALL_SET(ssc)) { - return FALSE; + else { + SV *ptr; + if (!PL_curcop->cop_hints_hash) + return &PL_core_reg_engine; + ptr = cop_hints_fetch_pvs(PL_curcop, "regcomp", 0); + if ( !(ptr && SvIOK(ptr) && SvIV(ptr))) + return &PL_core_reg_engine; + return INT2PTR(regexp_engine*, SvIV(ptr)); } - - return TRUE; } -#define INVLIST_INDEX 0 -#define ONLY_LOCALE_MATCHES_INDEX 1 -#define DEFERRED_USER_DEFINED_INDEX 2 -STATIC SV* -S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state, - const regnode_charclass* const node) +REGEXP * +Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags) { - /* Returns a mortal inversion list defining which code points are matched - * by 'node', which is of type ANYOF. Handles complementing the result if - * appropriate. If some code points aren't knowable at this time, the - * returned list must, and will, contain every code point that is a - * possibility. */ - - SV* invlist = NULL; - SV* only_utf8_locale_invlist = NULL; - unsigned int i; - const U32 n = ARG(node); - bool new_node_has_latin1 = FALSE; - const U8 flags = (inRANGE(OP(node), ANYOFH, ANYOFRb)) - ? 0 - : ANYOF_FLAGS(node); + regexp_engine const *eng = current_re_engine(); + DECLARE_AND_GET_RE_DEBUG_FLAGS; - PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC; + PERL_ARGS_ASSERT_PREGCOMP; - /* Look at the data structure created by S_set_ANYOF_arg() */ - if (n != ANYOF_ONLY_HAS_BITMAP) { - SV * const rv = MUTABLE_SV(RExC_rxi->data->data[n]); - AV * const av = MUTABLE_AV(SvRV(rv)); - SV **const ary = AvARRAY(av); - assert(RExC_rxi->data->what[n] == 's'); + /* Dispatch a request to compile a regexp to correct regexp engine. */ + DEBUG_COMPILE_r({ + Perl_re_printf( aTHX_ "Using engine %" UVxf "\n", + PTR2UV(eng)); + }); + return CALLREGCOMP_ENG(eng, pattern, flags); +} +#endif - if (av_tindex_skip_len_mg(av) >= DEFERRED_USER_DEFINED_INDEX) { +/* +=for apidoc re_compile - /* Here there are things that won't be known until runtime -- we - * have to assume it could be anything */ - invlist = sv_2mortal(_new_invlist(1)); - return _add_range_to_invlist(invlist, 0, UV_MAX); - } - else if (ary[INVLIST_INDEX]) { +Compile the regular expression pattern C, returning a pointer to the +compiled object for later matching with the internal regex engine. - /* Use the node's inversion list */ - invlist = sv_2mortal(invlist_clone(ary[INVLIST_INDEX], NULL)); - } +This function is typically used by a custom regexp engine C<.comp()> function +to hand off to the core regexp engine those patterns it doesn't want to handle +itself (typically passing through the same flags it was called with). In +almost all other cases, a regexp should be compiled by calling L> +to compile using the currently active regexp engine. - /* Get the code points valid only under UTF-8 locales */ - if ( (flags & ANYOFL_FOLD) - && av_tindex_skip_len_mg(av) >= ONLY_LOCALE_MATCHES_INDEX) - { - only_utf8_locale_invlist = ary[ONLY_LOCALE_MATCHES_INDEX]; - } - } +If C is already a C, this function does nothing but return a +pointer to the input. Otherwise the PV is extracted and treated like a string +representing a pattern. See L. - if (! invlist) { - invlist = sv_2mortal(_new_invlist(0)); - } +The possible flags for C are documented in L. Their names +all begin with C. - /* An ANYOF node contains a bitmap for the first NUM_ANYOF_CODE_POINTS - * code points, and an inversion list for the others, but if there are code - * points that should match only conditionally on the target string being - * UTF-8, those are placed in the inversion list, and not the bitmap. - * Since there are circumstances under which they could match, they are - * included in the SSC. But if the ANYOF node is to be inverted, we have - * to exclude them here, so that when we invert below, the end result - * actually does include them. (Think about "\xe0" =~ /[^\xc0]/di;). We - * have to do this here before we add the unconditionally matched code - * points */ - if (flags & ANYOF_INVERT) { - _invlist_intersection_complement_2nd(invlist, - PL_UpperLatin1, - &invlist); - } - - /* Add in the points from the bit map */ - if (! inRANGE(OP(node), ANYOFH, ANYOFRb)) { - for (i = 0; i < NUM_ANYOF_CODE_POINTS; i++) { - if (ANYOF_BITMAP_TEST(node, i)) { - unsigned int start = i++; +=cut - for (; i < NUM_ANYOF_CODE_POINTS - && ANYOF_BITMAP_TEST(node, i); ++i) - { - /* empty */ - } - invlist = _add_range_to_invlist(invlist, start, i-1); - new_node_has_latin1 = TRUE; - } - } - } + * public entry point for the perl core's own regex compiling code. + * It's actually a wrapper for Perl_re_op_compile that only takes an SV + * pattern rather than a list of OPs, and uses the internal engine rather + * than the current one */ - /* If this can match all upper Latin1 code points, have to add them - * as well. But don't add them if inverting, as when that gets done below, - * it would exclude all these characters, including the ones it shouldn't - * that were added just above */ - if (! (flags & ANYOF_INVERT) && OP(node) == ANYOFD - && (flags & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER)) - { - _invlist_union(invlist, PL_UpperLatin1, &invlist); - } +REGEXP * +Perl_re_compile(pTHX_ SV * const pattern, U32 rx_flags) +{ + SV *pat = pattern; /* defeat constness! */ - /* Similarly for these */ - if (flags & ANYOF_MATCHES_ALL_ABOVE_BITMAP) { - _invlist_union_complement_2nd(invlist, PL_InBitmap, &invlist); - } + PERL_ARGS_ASSERT_RE_COMPILE; - if (flags & ANYOF_INVERT) { - _invlist_invert(invlist); - } - else if (flags & ANYOFL_FOLD) { - if (new_node_has_latin1) { + return Perl_re_op_compile(aTHX_ &pat, 1, NULL, +#ifdef PERL_IN_XSUB_RE + &my_reg_engine, +#else + &PL_core_reg_engine, +#endif + NULL, NULL, rx_flags, 0); +} - /* Under /li, any 0-255 could fold to any other 0-255, depending on - * the locale. We can skip this if there are no 0-255 at all. */ - _invlist_union(invlist, PL_Latin1, &invlist); +static void +S_free_codeblocks(pTHX_ struct reg_code_blocks *cbs) +{ + int n; - invlist = add_cp_to_invlist(invlist, LATIN_SMALL_LETTER_DOTLESS_I); - invlist = add_cp_to_invlist(invlist, LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE); - } - else { - if (_invlist_contains_cp(invlist, LATIN_SMALL_LETTER_DOTLESS_I)) { - invlist = add_cp_to_invlist(invlist, 'I'); - } - if (_invlist_contains_cp(invlist, - LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE)) - { - invlist = add_cp_to_invlist(invlist, 'i'); - } + if (--cbs->refcnt > 0) + return; + for (n = 0; n < cbs->count; n++) { + REGEXP *rx = cbs->cb[n].src_regex; + if (rx) { + cbs->cb[n].src_regex = NULL; + SvREFCNT_dec_NN(rx); } } + Safefree(cbs->cb); + Safefree(cbs); +} - /* Similarly add the UTF-8 locale possible matches. These have to be - * deferred until after the non-UTF-8 locale ones are taken care of just - * above, or it leads to wrong results under ANYOF_INVERT */ - if (only_utf8_locale_invlist) { - _invlist_union_maybe_complement_2nd(invlist, - only_utf8_locale_invlist, - flags & ANYOF_INVERT, - &invlist); - } - return invlist; +static struct reg_code_blocks * +S_alloc_code_blocks(pTHX_ int ncode) +{ + struct reg_code_blocks *cbs; + Newx(cbs, 1, struct reg_code_blocks); + cbs->count = ncode; + cbs->refcnt = 1; + SAVEDESTRUCTOR_X(S_free_codeblocks, cbs); + if (ncode) + Newx(cbs->cb, ncode, struct reg_code_block); + else + cbs->cb = NULL; + return cbs; } -/* These two functions currently do the exact same thing */ -#define ssc_init_zero ssc_init -#define ssc_add_cp(ssc, cp) ssc_add_range((ssc), (cp), (cp)) -#define ssc_match_all_cp(ssc) ssc_add_range(ssc, 0, UV_MAX) - -/* 'AND' a given class with another one. Can create false positives. 'ssc' - * should not be inverted. 'and_with->flags & ANYOF_MATCHES_POSIXL' should be - * 0 if 'and_with' is a regnode_charclass instead of a regnode_ssc. */ +/* upgrade pattern pat_p of length plen_p to UTF8, and if there are code + * blocks, recalculate the indices. Update pat_p and plen_p in-place to + * point to the realloced string and length. + * + * This is essentially a copy of Perl_bytes_to_utf8() with the code index + * stuff added */ -STATIC void -S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, - const regnode_charclass *and_with) +static void +S_pat_upgrade_to_utf8(pTHX_ RExC_state_t * const pRExC_state, + char **pat_p, STRLEN *plen_p, int num_code_blocks) { - /* Accumulate into SSC 'ssc' its 'AND' with 'and_with', which is either - * another SSC or a regular ANYOF class. Can create false positives. */ + U8 *const src = (U8*)*pat_p; + U8 *dst, *d; + int n=0; + STRLEN s = 0; + bool do_end = 0; + DECLARE_AND_GET_RE_DEBUG_FLAGS; - SV* anded_cp_list; - U8 and_with_flags = inRANGE(OP(and_with), ANYOFH, ANYOFRb) - ? 0 - : ANYOF_FLAGS(and_with); - U8 anded_flags; - - PERL_ARGS_ASSERT_SSC_AND; - - assert(is_ANYOF_SYNTHETIC(ssc)); - - /* 'and_with' is used as-is if it too is an SSC; otherwise have to extract - * the code point inversion list and just the relevant flags */ - if (is_ANYOF_SYNTHETIC(and_with)) { - anded_cp_list = ((regnode_ssc *)and_with)->invlist; - anded_flags = and_with_flags; - - /* XXX This is a kludge around what appears to be deficiencies in the - * optimizer. If we make S_ssc_anything() add in the WARN_SUPER flag, - * there are paths through the optimizer where it doesn't get weeded - * out when it should. And if we don't make some extra provision for - * it like the code just below, it doesn't get added when it should. - * This solution is to add it only when AND'ing, which is here, and - * only when what is being AND'ed is the pristine, original node - * matching anything. Thus it is like adding it to ssc_anything() but - * only when the result is to be AND'ed. Probably the same solution - * could be adopted for the same problem we have with /l matching, - * which is solved differently in S_ssc_init(), and that would lead to - * fewer false positives than that solution has. But if this solution - * creates bugs, the consequences are only that a warning isn't raised - * that should be; while the consequences for having /l bugs is - * incorrect matches */ - if (ssc_is_anything((regnode_ssc *)and_with)) { - anded_flags |= ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER; - } - } - else { - anded_cp_list = get_ANYOF_cp_list_for_ssc(pRExC_state, and_with); - if (OP(and_with) == ANYOFD) { - anded_flags = and_with_flags & ANYOF_COMMON_FLAGS; - } - else { - anded_flags = and_with_flags - &( ANYOF_COMMON_FLAGS - |ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER - |ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP); - if (ANYOFL_UTF8_LOCALE_REQD(and_with_flags)) { - anded_flags &= - ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD; - } - } - } - - ANYOF_FLAGS(ssc) &= anded_flags; - - /* Below, C1 is the list of code points in 'ssc'; P1, its posix classes. - * C2 is the list of code points in 'and-with'; P2, its posix classes. - * 'and_with' may be inverted. When not inverted, we have the situation of - * computing: - * (C1 | P1) & (C2 | P2) - * = (C1 & (C2 | P2)) | (P1 & (C2 | P2)) - * = ((C1 & C2) | (C1 & P2)) | ((P1 & C2) | (P1 & P2)) - * <= ((C1 & C2) | P2)) | ( P1 | (P1 & P2)) - * <= ((C1 & C2) | P1 | P2) - * Alternatively, the last few steps could be: - * = ((C1 & C2) | (C1 & P2)) | ((P1 & C2) | (P1 & P2)) - * <= ((C1 & C2) | C1 ) | ( C2 | (P1 & P2)) - * <= (C1 | C2 | (P1 & P2)) - * We favor the second approach if either P1 or P2 is non-empty. This is - * because these components are a barrier to doing optimizations, as what - * they match cannot be known until the moment of matching as they are - * dependent on the current locale, 'AND"ing them likely will reduce or - * eliminate them. - * But we can do better if we know that C1,P1 are in their initial state (a - * frequent occurrence), each matching everything: - * () & (C2 | P2) = C2 | P2 - * Similarly, if C2,P2 are in their initial state (again a frequent - * occurrence), the result is a no-op - * (C1 | P1) & () = C1 | P1 - * - * Inverted, we have - * (C1 | P1) & ~(C2 | P2) = (C1 | P1) & (~C2 & ~P2) - * = (C1 & (~C2 & ~P2)) | (P1 & (~C2 & ~P2)) - * <= (C1 & ~C2) | (P1 & ~P2) - * */ + DEBUG_PARSE_r(Perl_re_printf( aTHX_ + "UTF8 mismatch! Converting to utf8 for resizing and compile\n")); - if ((and_with_flags & ANYOF_INVERT) - && ! is_ANYOF_SYNTHETIC(and_with)) - { - unsigned int i; + /* 1 for each byte + 1 for each byte that expands to two, + trailing NUL */ + Newx(dst, *plen_p + variant_under_utf8_count(src, src + *plen_p) + 1, U8); + d = dst; - ssc_intersection(ssc, - anded_cp_list, - FALSE /* Has already been inverted */ - ); - - /* If either P1 or P2 is empty, the intersection will be also; can skip - * the loop */ - if (! (and_with_flags & ANYOF_MATCHES_POSIXL)) { - ANYOF_POSIXL_ZERO(ssc); - } - else if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) { - - /* Note that the Posix class component P from 'and_with' actually - * looks like: - * P = Pa | Pb | ... | Pn - * where each component is one posix class, such as in [\w\s]. - * Thus - * ~P = ~(Pa | Pb | ... | Pn) - * = ~Pa & ~Pb & ... & ~Pn - * <= ~Pa | ~Pb | ... | ~Pn - * The last is something we can easily calculate, but unfortunately - * is likely to have many false positives. We could do better - * in some (but certainly not all) instances if two classes in - * P have known relationships. For example - * :lower: <= :alpha: <= :alnum: <= \w <= :graph: <= :print: - * So - * :lower: & :print: = :lower: - * And similarly for classes that must be disjoint. For example, - * since \s and \w can have no elements in common based on rules in - * the POSIX standard, - * \w & ^\S = nothing - * Unfortunately, some vendor locales do not meet the Posix - * standard, in particular almost everything by Microsoft. - * The loop below just changes e.g., \w into \W and vice versa */ - - regnode_charclass_posixl temp; - int add = 1; /* To calculate the index of the complement */ - - Zero(&temp, 1, regnode_charclass_posixl); - ANYOF_POSIXL_ZERO(&temp); - for (i = 0; i < ANYOF_MAX; i++) { - assert(i % 2 != 0 - || ! ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i) - || ! ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i + 1)); - - if (ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i)) { - ANYOF_POSIXL_SET(&temp, i + add); - } - add = 0 - add; /* 1 goes to -1; -1 goes to 1 */ - } - ANYOF_POSIXL_AND(&temp, ssc); - - } /* else ssc already has no posixes */ - } /* else: Not inverted. This routine is a no-op if 'and_with' is an SSC - in its initial state */ - else if (! is_ANYOF_SYNTHETIC(and_with) - || ! ssc_is_cp_posixl_init(pRExC_state, (regnode_ssc *)and_with)) - { - /* But if 'ssc' is in its initial state, the result is just 'and_with'; - * copy it over 'ssc' */ - if (ssc_is_cp_posixl_init(pRExC_state, ssc)) { - if (is_ANYOF_SYNTHETIC(and_with)) { - StructCopy(and_with, ssc, regnode_ssc); - } - else { - ssc->invlist = anded_cp_list; - ANYOF_POSIXL_ZERO(ssc); - if (and_with_flags & ANYOF_MATCHES_POSIXL) { - ANYOF_POSIXL_OR((regnode_charclass_posixl*) and_with, ssc); - } - } - } - else if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc) - || (and_with_flags & ANYOF_MATCHES_POSIXL)) - { - /* One or the other of P1, P2 is non-empty. */ - if (and_with_flags & ANYOF_MATCHES_POSIXL) { - ANYOF_POSIXL_AND((regnode_charclass_posixl*) and_with, ssc); - } - ssc_union(ssc, anded_cp_list, FALSE); - } - else { /* P1 = P2 = empty */ - ssc_intersection(ssc, anded_cp_list, FALSE); - } - } -} + while (s < *plen_p) { + append_utf8_from_native_byte(src[s], &d); -STATIC void -S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, - const regnode_charclass *or_with) -{ - /* Accumulate into SSC 'ssc' its 'OR' with 'or_with', which is either - * another SSC or a regular ANYOF class. Can create false positives if - * 'or_with' is to be inverted. */ - - SV* ored_cp_list; - U8 ored_flags; - U8 or_with_flags = inRANGE(OP(or_with), ANYOFH, ANYOFRb) - ? 0 - : ANYOF_FLAGS(or_with); - - PERL_ARGS_ASSERT_SSC_OR; - - assert(is_ANYOF_SYNTHETIC(ssc)); - - /* 'or_with' is used as-is if it too is an SSC; otherwise have to extract - * the code point inversion list and just the relevant flags */ - if (is_ANYOF_SYNTHETIC(or_with)) { - ored_cp_list = ((regnode_ssc*) or_with)->invlist; - ored_flags = or_with_flags; - } - else { - ored_cp_list = get_ANYOF_cp_list_for_ssc(pRExC_state, or_with); - ored_flags = or_with_flags & ANYOF_COMMON_FLAGS; - if (OP(or_with) != ANYOFD) { - ored_flags - |= or_with_flags - & ( ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER - |ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP); - if (ANYOFL_UTF8_LOCALE_REQD(or_with_flags)) { - ored_flags |= - ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD; + if (n < num_code_blocks) { + assert(pRExC_state->code_blocks); + if (!do_end && pRExC_state->code_blocks->cb[n].start == s) { + pRExC_state->code_blocks->cb[n].start = d - dst - 1; + assert(*(d - 1) == '('); + do_end = 1; } - } - } - - ANYOF_FLAGS(ssc) |= ored_flags; - - /* Below, C1 is the list of code points in 'ssc'; P1, its posix classes. - * C2 is the list of code points in 'or-with'; P2, its posix classes. - * 'or_with' may be inverted. When not inverted, we have the simple - * situation of computing: - * (C1 | P1) | (C2 | P2) = (C1 | C2) | (P1 | P2) - * If P1|P2 yields a situation with both a class and its complement are - * set, like having both \w and \W, this matches all code points, and we - * can delete these from the P component of the ssc going forward. XXX We - * might be able to delete all the P components, but I (khw) am not certain - * about this, and it is better to be safe. - * - * Inverted, we have - * (C1 | P1) | ~(C2 | P2) = (C1 | P1) | (~C2 & ~P2) - * <= (C1 | P1) | ~C2 - * <= (C1 | ~C2) | P1 - * (which results in actually simpler code than the non-inverted case) - * */ - - if ((or_with_flags & ANYOF_INVERT) - && ! is_ANYOF_SYNTHETIC(or_with)) - { - /* We ignore P2, leaving P1 going forward */ - } /* else Not inverted */ - else if (or_with_flags & ANYOF_MATCHES_POSIXL) { - ANYOF_POSIXL_OR((regnode_charclass_posixl*)or_with, ssc); - if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) { - unsigned int i; - for (i = 0; i < ANYOF_MAX; i += 2) { - if (ANYOF_POSIXL_TEST(ssc, i) && ANYOF_POSIXL_TEST(ssc, i + 1)) - { - ssc_match_all_cp(ssc); - ANYOF_POSIXL_CLEAR(ssc, i); - ANYOF_POSIXL_CLEAR(ssc, i+1); - } + else if (do_end && pRExC_state->code_blocks->cb[n].end == s) { + pRExC_state->code_blocks->cb[n].end = d - dst - 1; + assert(*(d - 1) == ')'); + do_end = 0; + n++; } } + s++; } - - ssc_union(ssc, - ored_cp_list, - FALSE /* Already has been inverted */ - ); -} - -STATIC void -S_ssc_union(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert2nd) -{ - PERL_ARGS_ASSERT_SSC_UNION; - - assert(is_ANYOF_SYNTHETIC(ssc)); - - _invlist_union_maybe_complement_2nd(ssc->invlist, - invlist, - invert2nd, - &ssc->invlist); -} - -STATIC void -S_ssc_intersection(pTHX_ regnode_ssc *ssc, - SV* const invlist, - const bool invert2nd) -{ - PERL_ARGS_ASSERT_SSC_INTERSECTION; - - assert(is_ANYOF_SYNTHETIC(ssc)); - - _invlist_intersection_maybe_complement_2nd(ssc->invlist, - invlist, - invert2nd, - &ssc->invlist); -} - -STATIC void -S_ssc_add_range(pTHX_ regnode_ssc *ssc, const UV start, const UV end) -{ - PERL_ARGS_ASSERT_SSC_ADD_RANGE; - - assert(is_ANYOF_SYNTHETIC(ssc)); - - ssc->invlist = _add_range_to_invlist(ssc->invlist, start, end); -} - -STATIC void -S_ssc_cp_and(pTHX_ regnode_ssc *ssc, const UV cp) -{ - /* AND just the single code point 'cp' into the SSC 'ssc' */ - - SV* cp_list = _new_invlist(2); - - PERL_ARGS_ASSERT_SSC_CP_AND; - - assert(is_ANYOF_SYNTHETIC(ssc)); - - cp_list = add_cp_to_invlist(cp_list, cp); - ssc_intersection(ssc, cp_list, - FALSE /* Not inverted */ - ); - SvREFCNT_dec_NN(cp_list); -} - -STATIC void -S_ssc_clear_locale(regnode_ssc *ssc) -{ - /* Set the SSC 'ssc' to not match any locale things */ - PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE; - - assert(is_ANYOF_SYNTHETIC(ssc)); - - ANYOF_POSIXL_ZERO(ssc); - ANYOF_FLAGS(ssc) &= ~ANYOF_LOCALE_FLAGS; + *d = '\0'; + *plen_p = d - dst; + *pat_p = (char*) dst; + SAVEFREEPV(*pat_p); + RExC_orig_utf8 = RExC_utf8 = 1; } -STATIC bool -S_is_ssc_worth_it(const RExC_state_t * pRExC_state, const regnode_ssc * ssc) -{ - /* The synthetic start class is used to hopefully quickly winnow down - * places where a pattern could start a match in the target string. If it - * doesn't really narrow things down that much, there isn't much point to - * having the overhead of using it. This function uses some very crude - * heuristics to decide if to use the ssc or not. - * - * It returns TRUE if 'ssc' rules out more than half what it considers to - * be the "likely" possible matches, but of course it doesn't know what the - * actual things being matched are going to be; these are only guesses - * - * For /l matches, it assumes that the only likely matches are going to be - * in the 0-255 range, uniformly distributed, so half of that is 127 - * For /a and /d matches, it assumes that the likely matches will be just - * the ASCII range, so half of that is 63 - * For /u and there isn't anything matching above the Latin1 range, it - * assumes that that is the only range likely to be matched, and uses - * half that as the cut-off: 127. If anything matches above Latin1, - * it assumes that all of Unicode could match (uniformly), except for - * non-Unicode code points and things in the General Category "Other" - * (unassigned, private use, surrogates, controls and formats). This - * is a much large number. */ - - U32 count = 0; /* Running total of number of code points matched by - 'ssc' */ - UV start, end; /* Start and end points of current range in inversion - XXX outdated. UTF-8 locales are common, what about invert? list */ - const U32 max_code_points = (LOC) - ? 256 - : (( ! UNI_SEMANTICS - || invlist_highest(ssc->invlist) < 256) - ? 128 - : NON_OTHER_COUNT); - const U32 max_match = max_code_points / 2; - - PERL_ARGS_ASSERT_IS_SSC_WORTH_IT; - - invlist_iterinit(ssc->invlist); - while (invlist_iternext(ssc->invlist, &start, &end)) { - if (start >= max_code_points) { - break; - } - end = MIN(end, max_code_points - 1); - count += end - start + 1; - if (count >= max_match) { - invlist_iterfinish(ssc->invlist); - return FALSE; - } - } - return TRUE; -} +/* S_concat_pat(): concatenate a list of args to the pattern string pat, + * while recording any code block indices, and handling overloading, + * nested qr// objects etc. If pat is null, it will allocate a new + * string, or just return the first arg, if there's only one. + * + * Returns the malloced/updated pat. + * patternp and pat_count is the array of SVs to be concatted; + * oplist is the optional list of ops that generated the SVs; + * recompile_p is a pointer to a boolean that will be set if + * the regex will need to be recompiled. + * delim, if non-null is an SV that will be inserted between each element + */ -STATIC void -S_ssc_finalize(pTHX_ RExC_state_t *pRExC_state, regnode_ssc *ssc) +static SV* +S_concat_pat(pTHX_ RExC_state_t * const pRExC_state, + SV *pat, SV ** const patternp, int pat_count, + OP *oplist, bool *recompile_p, SV *delim) { - /* The inversion list in the SSC is marked mortal; now we need a more - * permanent copy, which is stored the same way that is done in a regular - * ANYOF node, with the first NUM_ANYOF_CODE_POINTS code points in a bit - * map */ - - SV* invlist = invlist_clone(ssc->invlist, NULL); - - PERL_ARGS_ASSERT_SSC_FINALIZE; - - assert(is_ANYOF_SYNTHETIC(ssc)); - - /* The code in this file assumes that all but these flags aren't relevant - * to the SSC, except SSC_MATCHES_EMPTY_STRING, which should be cleared - * by the time we reach here */ - assert(! (ANYOF_FLAGS(ssc) - & ~( ANYOF_COMMON_FLAGS - |ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER - |ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP))); - - populate_ANYOF_from_invlist( (regnode *) ssc, &invlist); - - set_ANYOF_arg(pRExC_state, (regnode *) ssc, invlist, NULL, NULL); - SvREFCNT_dec(invlist); - - /* Make sure is clone-safe */ - ssc->invlist = NULL; + SV **svp; + int n = 0; + bool use_delim = FALSE; + bool alloced = FALSE; - if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) { - ANYOF_FLAGS(ssc) |= ANYOF_MATCHES_POSIXL; - OP(ssc) = ANYOFPOSIXL; - } - else if (RExC_contains_locale) { - OP(ssc) = ANYOFL; + /* if we know we have at least two args, create an empty string, + * then concatenate args to that. For no args, return an empty string */ + if (!pat && pat_count != 1) { + pat = newSVpvs(""); + SAVEFREESV(pat); + alloced = TRUE; } - assert(! (ANYOF_FLAGS(ssc) & ANYOF_LOCALE_FLAGS) || RExC_contains_locale); -} - -#define TRIE_LIST_ITEM(state,idx) (trie->states[state].trans.list)[ idx ] -#define TRIE_LIST_CUR(state) ( TRIE_LIST_ITEM( state, 0 ).forid ) -#define TRIE_LIST_LEN(state) ( TRIE_LIST_ITEM( state, 0 ).newstate ) -#define TRIE_LIST_USED(idx) ( trie->states[state].trans.list \ - ? (TRIE_LIST_CUR( idx ) - 1) \ - : 0 ) - - -#ifdef DEBUGGING -/* - dump_trie(trie,widecharmap,revcharmap) - dump_trie_interim_list(trie,widecharmap,revcharmap,next_alloc) - dump_trie_interim_table(trie,widecharmap,revcharmap,next_alloc) - - These routines dump out a trie in a somewhat readable format. - The _interim_ variants are used for debugging the interim - tables that are used to generate the final compressed - representation which is what dump_trie expects. - - Part of the reason for their existence is to provide a form - of documentation as to how the different representations function. - -*/ - -/* - Dumps the final compressed table form of the trie to Perl_debug_log. - Used for debugging make_trie(). -*/ + for (svp = patternp; svp < patternp + pat_count; svp++) { + SV *sv; + SV *rx = NULL; + STRLEN orig_patlen = 0; + bool code = 0; + SV *msv = use_delim ? delim : *svp; + if (!msv) msv = &PL_sv_undef; -STATIC void -S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap, - AV *revcharmap, U32 depth) -{ - U32 state; - SV *sv=sv_newmortal(); - int colwidth= widecharmap ? 6 : 4; - U16 word; - DECLARE_AND_GET_RE_DEBUG_FLAGS; + /* if we've got a delimiter, we go round the loop twice for each + * svp slot (except the last), using the delimiter the second + * time round */ + if (use_delim) { + svp--; + use_delim = FALSE; + } + else if (delim) + use_delim = TRUE; - PERL_ARGS_ASSERT_DUMP_TRIE; + if (SvTYPE(msv) == SVt_PVAV) { + /* we've encountered an interpolated array within + * the pattern, e.g. /...@a..../. Expand the list of elements, + * then recursively append elements. + * The code in this block is based on S_pushav() */ - Perl_re_indentf( aTHX_ "Char : %-6s%-6s%-4s ", - depth+1, "Match","Base","Ofs" ); + AV *const av = (AV*)msv; + const SSize_t maxarg = AvFILL(av) + 1; + SV **array; - for( state = 0 ; state < trie->uniquecharcount ; state++ ) { - SV ** const tmp = av_fetch( revcharmap, state, 0); - if ( tmp ) { - Perl_re_printf( aTHX_ "%*s", - colwidth, - pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth, - PL_colors[0], PL_colors[1], - (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) | - PERL_PV_ESCAPE_FIRSTCHAR - ) - ); - } - } - Perl_re_printf( aTHX_ "\n"); - Perl_re_indentf( aTHX_ "State|-----------------------", depth+1); + if (oplist) { + assert(oplist->op_type == OP_PADAV + || oplist->op_type == OP_RV2AV); + oplist = OpSIBLING(oplist); + } - for( state = 0 ; state < trie->uniquecharcount ; state++ ) - Perl_re_printf( aTHX_ "%.*s", colwidth, "--------"); - Perl_re_printf( aTHX_ "\n"); + if (SvRMAGICAL(av)) { + SSize_t i; - for( state = 1 ; state < trie->statecount ; state++ ) { - const U32 base = trie->states[ state ].trans.base; + Newx(array, maxarg, SV*); + SAVEFREEPV(array); + for (i=0; i < maxarg; i++) { + SV ** const svp = av_fetch(av, i, FALSE); + array[i] = svp ? *svp : &PL_sv_undef; + } + } + else + array = AvARRAY(av); - Perl_re_indentf( aTHX_ "#%4" UVXf "|", depth+1, (UV)state); + if (maxarg > 0) { + pat = S_concat_pat(aTHX_ pRExC_state, pat, + array, maxarg, NULL, recompile_p, + /* $" */ + GvSV((gv_fetchpvs("\"", GV_ADDMULTI, SVt_PV)))); + } + else if (!pat) { + pat = newSVpvs_flags("", SVs_TEMP); + } - if ( trie->states[ state ].wordnum ) { - Perl_re_printf( aTHX_ " W%4X", trie->states[ state ].wordnum ); - } else { - Perl_re_printf( aTHX_ "%6s", "" ); + continue; } - Perl_re_printf( aTHX_ " @%4" UVXf " ", (UV)base ); - if ( base ) { - U32 ofs = 0; - - while( ( base + ofs < trie->uniquecharcount ) || - ( base + ofs - trie->uniquecharcount < trie->lasttrans - && trie->trans[ base + ofs - trie->uniquecharcount ].check - != state)) - ofs++; - - Perl_re_printf( aTHX_ "+%2" UVXf "[ ", (UV)ofs); + /* we make the assumption here that each op in the list of + * op_siblings maps to one SV pushed onto the stack, + * except for code blocks, with have both an OP_NULL and + * an OP_CONST. + * This allows us to match up the list of SVs against the + * list of OPs to find the next code block. + * + * Note that PUSHMARK PADSV PADSV .. + * is optimised to + * PADRANGE PADSV PADSV .. + * so the alignment still works. */ - for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) { - if ( ( base + ofs >= trie->uniquecharcount ) - && ( base + ofs - trie->uniquecharcount - < trie->lasttrans ) - && trie->trans[ base + ofs - - trie->uniquecharcount ].check == state ) - { - Perl_re_printf( aTHX_ "%*" UVXf, colwidth, - (UV)trie->trans[ base + ofs - trie->uniquecharcount ].next - ); - } else { - Perl_re_printf( aTHX_ "%*s", colwidth," ." ); - } + if (oplist) { + if (oplist->op_type == OP_NULL + && (oplist->op_flags & OPf_SPECIAL)) + { + assert(n < pRExC_state->code_blocks->count); + pRExC_state->code_blocks->cb[n].start = pat ? SvCUR(pat) : 0; + pRExC_state->code_blocks->cb[n].block = oplist; + pRExC_state->code_blocks->cb[n].src_regex = NULL; + n++; + code = 1; + oplist = OpSIBLING(oplist); /* skip CONST */ + assert(oplist); } - - Perl_re_printf( aTHX_ "]"); - + oplist = OpSIBLING(oplist);; } - Perl_re_printf( aTHX_ "\n" ); - } - Perl_re_indentf( aTHX_ "word_info N:(prev,len)=", - depth); - for (word=1; word <= trie->wordcount; word++) { - Perl_re_printf( aTHX_ " %d:(%d,%d)", - (int)word, (int)(trie->wordinfo[word].prev), - (int)(trie->wordinfo[word].len)); - } - Perl_re_printf( aTHX_ "\n" ); -} -/* - Dumps a fully constructed but uncompressed trie in list form. - List tries normally only are used for construction when the number of - possible chars (trie->uniquecharcount) is very high. - Used for debugging make_trie(). -*/ -STATIC void -S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie, - HV *widecharmap, AV *revcharmap, U32 next_alloc, - U32 depth) -{ - U32 state; - SV *sv=sv_newmortal(); - int colwidth= widecharmap ? 6 : 4; - DECLARE_AND_GET_RE_DEBUG_FLAGS; - PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST; + /* apply magic and QR overloading to arg */ - /* print out the table precompression. */ - Perl_re_indentf( aTHX_ "State :Word | Transition Data\n", - depth+1 ); - Perl_re_indentf( aTHX_ "%s", - depth+1, "------:-----+-----------------\n" ); - - for( state=1 ; state < next_alloc ; state ++ ) { - U16 charid; - - Perl_re_indentf( aTHX_ " %4" UVXf " :", - depth+1, (UV)state ); - if ( ! trie->states[ state ].wordnum ) { - Perl_re_printf( aTHX_ "%5s| ",""); - } else { - Perl_re_printf( aTHX_ "W%4x| ", - trie->states[ state ].wordnum - ); - } - for( charid = 1 ; charid <= TRIE_LIST_USED( state ) ; charid++ ) { - SV ** const tmp = av_fetch( revcharmap, - TRIE_LIST_ITEM(state, charid).forid, 0); - if ( tmp ) { - Perl_re_printf( aTHX_ "%*s:%3X=%4" UVXf " | ", - colwidth, - pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), - colwidth, - PL_colors[0], PL_colors[1], - (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) - | PERL_PV_ESCAPE_FIRSTCHAR - ) , - TRIE_LIST_ITEM(state, charid).forid, - (UV)TRIE_LIST_ITEM(state, charid).newstate - ); - if (!(charid % 10)) - Perl_re_printf( aTHX_ "\n%*s| ", - (int)((depth * 2) + 14), ""); + SvGETMAGIC(msv); + if (SvROK(msv) && SvAMAGIC(msv)) { + SV *sv = AMG_CALLunary(msv, regexp_amg); + if (sv) { + if (SvROK(sv)) + sv = SvRV(sv); + if (SvTYPE(sv) != SVt_REGEXP) + Perl_croak(aTHX_ "Overloaded qr did not return a REGEXP"); + msv = sv; } } - Perl_re_printf( aTHX_ "\n"); - } -} -/* - Dumps a fully constructed but uncompressed trie in table form. - This is the normal DFA style state transition table, with a few - twists to facilitate compression later. - Used for debugging make_trie(). -*/ -STATIC void -S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie, - HV *widecharmap, AV *revcharmap, U32 next_alloc, - U32 depth) -{ - U32 state; - U16 charid; - SV *sv=sv_newmortal(); - int colwidth= widecharmap ? 6 : 4; - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE; - - /* - print out the table precompression so that we can do a visual check - that they are identical. - */ - - Perl_re_indentf( aTHX_ "Char : ", depth+1 ); - - for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) { - SV ** const tmp = av_fetch( revcharmap, charid, 0); - if ( tmp ) { - Perl_re_printf( aTHX_ "%*s", - colwidth, - pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth, - PL_colors[0], PL_colors[1], - (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) | - PERL_PV_ESCAPE_FIRSTCHAR - ) - ); + /* try concatenation overload ... */ + if (pat && (SvAMAGIC(pat) || SvAMAGIC(msv)) && + (sv = amagic_call(pat, msv, concat_amg, AMGf_assign))) + { + sv_setsv(pat, sv); + /* overloading involved: all bets are off over literal + * code. Pretend we haven't seen it */ + if (n) + pRExC_state->code_blocks->count -= n; + n = 0; } - } - - Perl_re_printf( aTHX_ "\n"); - Perl_re_indentf( aTHX_ "State+-", depth+1 ); + else { + /* ... or failing that, try "" overload */ + while (SvAMAGIC(msv) + && (sv = AMG_CALLunary(msv, string_amg)) + && sv != msv + && !( SvROK(msv) + && SvROK(sv) + && SvRV(msv) == SvRV(sv)) + ) { + msv = sv; + SvGETMAGIC(msv); + } + if (SvROK(msv) && SvTYPE(SvRV(msv)) == SVt_REGEXP) + msv = SvRV(msv); - for( charid=0 ; charid < trie->uniquecharcount ; charid++ ) { - Perl_re_printf( aTHX_ "%.*s", colwidth,"--------"); - } + if (pat) { + /* this is a partially unrolled + * sv_catsv_nomg(pat, msv); + * that allows us to adjust code block indices if + * needed */ + STRLEN dlen; + char *dst = SvPV_force_nomg(pat, dlen); + orig_patlen = dlen; + if (SvUTF8(msv) && !SvUTF8(pat)) { + S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &dst, &dlen, n); + sv_setpvn(pat, dst, dlen); + SvUTF8_on(pat); + } + sv_catsv_nomg(pat, msv); + rx = msv; + } + else { + /* We have only one SV to process, but we need to verify + * it is properly null terminated or we will fail asserts + * later. In theory we probably shouldn't get such SV's, + * but if we do we should handle it gracefully. */ + if ( SvTYPE(msv) != SVt_PV || (SvLEN(msv) > SvCUR(msv) && *(SvEND(msv)) == 0) || SvIsCOW_shared_hash(msv) ) { + /* not a string, or a string with a trailing null */ + pat = msv; + } else { + /* a string with no trailing null, we need to copy it + * so it has a trailing null */ + pat = sv_2mortal(newSVsv(msv)); + } + } - Perl_re_printf( aTHX_ "\n" ); + if (code) + pRExC_state->code_blocks->cb[n-1].end = SvCUR(pat)-1; + } - for( state=1 ; state < next_alloc ; state += trie->uniquecharcount ) { + /* extract any code blocks within any embedded qr//'s */ + if (rx && SvTYPE(rx) == SVt_REGEXP + && RX_ENGINE((REGEXP*)rx)->op_comp) + { - Perl_re_indentf( aTHX_ "%4" UVXf " : ", - depth+1, - (UV)TRIE_NODENUM( state ) ); + RXi_GET_DECL(ReANY((REGEXP *)rx), ri); + if (ri->code_blocks && ri->code_blocks->count) { + int i; + /* the presence of an embedded qr// with code means + * we should always recompile: the text of the + * qr// may not have changed, but it may be a + * different closure than last time */ + *recompile_p = 1; + if (pRExC_state->code_blocks) { + int new_count = pRExC_state->code_blocks->count + + ri->code_blocks->count; + Renew(pRExC_state->code_blocks->cb, + new_count, struct reg_code_block); + pRExC_state->code_blocks->count = new_count; + } + else + pRExC_state->code_blocks = S_alloc_code_blocks(aTHX_ + ri->code_blocks->count); - for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) { - UV v=(UV)SAFE_TRIE_NODENUM( trie->trans[ state + charid ].next ); - if (v) - Perl_re_printf( aTHX_ "%*" UVXf, colwidth, v ); - else - Perl_re_printf( aTHX_ "%*s", colwidth, "." ); - } - if ( ! trie->states[ TRIE_NODENUM( state ) ].wordnum ) { - Perl_re_printf( aTHX_ " (%4" UVXf ")\n", - (UV)trie->trans[ state ].check ); - } else { - Perl_re_printf( aTHX_ " (%4" UVXf ") W%4X\n", - (UV)trie->trans[ state ].check, - trie->states[ TRIE_NODENUM( state ) ].wordnum ); + for (i=0; i < ri->code_blocks->count; i++) { + struct reg_code_block *src, *dst; + STRLEN offset = orig_patlen + + ReANY((REGEXP *)rx)->pre_prefix; + assert(n < pRExC_state->code_blocks->count); + src = &ri->code_blocks->cb[i]; + dst = &pRExC_state->code_blocks->cb[n]; + dst->start = src->start + offset; + dst->end = src->end + offset; + dst->block = src->block; + dst->src_regex = (REGEXP*) SvREFCNT_inc( (SV*) + src->src_regex + ? src->src_regex + : (REGEXP*)rx); + n++; + } + } } } -} - -#endif - - -/* make_trie(startbranch,first,last,tail,word_count,flags,depth) - startbranch: the first branch in the whole branch sequence - first : start branch of sequence of branch-exact nodes. - May be the same as startbranch - last : Thing following the last branch. - May be the same as tail. - tail : item following the branch sequence - count : words in the sequence - flags : currently the OP() type we will be building one of /EXACT(|F|FA|FU|FU_SS|L|FLU8)/ - depth : indent depth - -Inplace optimizes a sequence of 2 or more Branch-Exact nodes into a TRIE node. - -A trie is an N'ary tree where the branches are determined by digital -decomposition of the key. IE, at the root node you look up the 1st character and -follow that branch repeat until you find the end of the branches. Nodes can be -marked as "accepting" meaning they represent a complete word. Eg: - - /he|she|his|hers/ - -would convert into the following structure. Numbers represent states, letters -following numbers represent valid transitions on the letter from that state, if -the number is in square brackets it represents an accepting state, otherwise it -will be in parenthesis. - - +-h->+-e->[3]-+-r->(8)-+-s->[9] - | | - | (2) - | | - (1) +-i->(6)-+-s->[7] - | - +-s->(3)-+-h->(4)-+-e->[5] - - Accept Word Mapping: 3=>1 (he),5=>2 (she), 7=>3 (his), 9=>4 (hers) - -This shows that when matching against the string 'hers' we will begin at state 1 -read 'h' and move to state 2, read 'e' and move to state 3 which is accepting, -then read 'r' and go to state 8 followed by 's' which takes us to state 9 which -is also accepting. Thus we know that we can match both 'he' and 'hers' with a -single traverse. We store a mapping from accepting to state to which word was -matched, and then when we have multiple possibilities we try to complete the -rest of the regex in the order in which they occurred in the alternation. - -The only prior NFA like behaviour that would be changed by the TRIE support is -the silent ignoring of duplicate alternations which are of the form: - - / (DUPE|DUPE) X? (?{ ... }) Y /x - -Thus EVAL blocks following a trie may be called a different number of times with -and without the optimisation. With the optimisations dupes will be silently -ignored. This inconsistent behaviour of EVAL type nodes is well established as -the following demonstrates: - - 'words'=~/(word|word|word)(?{ print $1 })[xyz]/ - -which prints out 'word' three times, but - - 'words'=~/(word|word|word)(?{ print $1 })S/ - -which doesnt print it out at all. This is due to other optimisations kicking in. - -Example of what happens on a structural level: - -The regexp /(ac|ad|ab)+/ will produce the following debug output: - - 1: CURLYM[1] {1,32767}(18) - 5: BRANCH(8) - 6: EXACT (16) - 8: BRANCH(11) - 9: EXACT (16) - 11: BRANCH(14) - 12: EXACT (16) - 16: SUCCEED(0) - 17: NOTHING(18) - 18: END(0) - -This would be optimizable with startbranch=5, first=5, last=16, tail=16 -and should turn into: - - 1: CURLYM[1] {1,32767}(18) - 5: TRIE(16) - [Words:3 Chars Stored:6 Unique Chars:4 States:5 NCP:1] - - - - 16: SUCCEED(0) - 17: NOTHING(18) - 18: END(0) - -Cases where tail != last would be like /(?foo|bar)baz/: - - 1: BRANCH(4) - 2: EXACT (8) - 4: BRANCH(7) - 5: EXACT (8) - 7: TAIL(8) - 8: EXACT (10) - 10: END(0) - -which would be optimizable with startbranch=1, first=1, last=7, tail=8 -and would end up looking like: - - 1: TRIE(8) - [Words:2 Chars Stored:6 Unique Chars:5 States:7 NCP:1] - - - 7: TAIL(8) - 8: EXACT (10) - 10: END(0) + /* avoid calling magic multiple times on a single element e.g. =~ $qr */ + if (alloced) + SvSETMAGIC(pat); - d = uvchr_to_utf8_flags(d, uv, 0); + return pat; +} -is the recommended Unicode-aware way of saying - *(d++) = uv; -*/ -#define TRIE_STORE_REVCHAR(val) \ - STMT_START { \ - if (UTF) { \ - SV *zlopp = newSV(UTF8_MAXBYTES); \ - unsigned char *flrbbbbb = (unsigned char *) SvPVX(zlopp); \ - unsigned char *const kapow = uvchr_to_utf8(flrbbbbb, val); \ - *kapow = '\0'; \ - SvCUR_set(zlopp, kapow - flrbbbbb); \ - SvPOK_on(zlopp); \ - SvUTF8_on(zlopp); \ - av_push(revcharmap, zlopp); \ - } else { \ - char ooooff = (char)val; \ - av_push(revcharmap, newSVpvn(&ooooff, 1)); \ - } \ - } STMT_END - -/* This gets the next character from the input, folding it if not already - * folded. */ -#define TRIE_READ_CHAR STMT_START { \ - wordlen++; \ - if ( UTF ) { \ - /* if it is UTF then it is either already folded, or does not need \ - * folding */ \ - uvc = valid_utf8_to_uvchr( (const U8*) uc, &len); \ - } \ - else if (folder == PL_fold_latin1) { \ - /* This folder implies Unicode rules, which in the range expressible \ - * by not UTF is the lower case, with the two exceptions, one of \ - * which should have been taken care of before calling this */ \ - assert(*uc != LATIN_SMALL_LETTER_SHARP_S); \ - uvc = toLOWER_L1(*uc); \ - if (UNLIKELY(uvc == MICRO_SIGN)) uvc = GREEK_SMALL_LETTER_MU; \ - len = 1; \ - } else { \ - /* raw data, will be folded later if needed */ \ - uvc = (U32)*uc; \ - len = 1; \ - } \ -} STMT_END - - - -#define TRIE_LIST_PUSH(state,fid,ns) STMT_START { \ - if ( TRIE_LIST_CUR( state ) >=TRIE_LIST_LEN( state ) ) { \ - U32 ging = TRIE_LIST_LEN( state ) * 2; \ - Renew( trie->states[ state ].trans.list, ging, reg_trie_trans_le ); \ - TRIE_LIST_LEN( state ) = ging; \ - } \ - TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).forid = fid; \ - TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).newstate = ns; \ - TRIE_LIST_CUR( state )++; \ -} STMT_END - -#define TRIE_LIST_NEW(state) STMT_START { \ - Newx( trie->states[ state ].trans.list, \ - 4, reg_trie_trans_le ); \ - TRIE_LIST_CUR( state ) = 1; \ - TRIE_LIST_LEN( state ) = 4; \ -} STMT_END - -#define TRIE_HANDLE_WORD(state) STMT_START { \ - U16 dupe= trie->states[ state ].wordnum; \ - regnode * const noper_next = regnext( noper ); \ - \ - DEBUG_r({ \ - /* store the word for dumping */ \ - SV* tmp; \ - if (OP(noper) != NOTHING) \ - tmp = newSVpvn_utf8(STRING(noper), STR_LEN(noper), UTF); \ - else \ - tmp = newSVpvn_utf8( "", 0, UTF ); \ - av_push( trie_words, tmp ); \ - }); \ - \ - curword++; \ - trie->wordinfo[curword].prev = 0; \ - trie->wordinfo[curword].len = wordlen; \ - trie->wordinfo[curword].accept = state; \ - \ - if ( noper_next < tail ) { \ - if (!trie->jump) \ - trie->jump = (U16 *) PerlMemShared_calloc( word_count + 1, \ - sizeof(U16) ); \ - trie->jump[curword] = (U16)(noper_next - convert); \ - if (!jumper) \ - jumper = noper_next; \ - if (!nextbranch) \ - nextbranch= regnext(cur); \ - } \ - \ - if ( dupe ) { \ - /* It's a dupe. Pre-insert into the wordinfo[].prev */\ - /* chain, so that when the bits of chain are later */\ - /* linked together, the dups appear in the chain */\ - trie->wordinfo[curword].prev = trie->wordinfo[dupe].prev; \ - trie->wordinfo[dupe].prev = curword; \ - } else { \ - /* we haven't inserted this word yet. */ \ - trie->states[ state ].wordnum = curword; \ - } \ -} STMT_END - - -#define TRIE_TRANS_STATE(state,base,ucharcount,charid,special) \ - ( ( base + charid >= ucharcount \ - && base + charid < ubound \ - && state == trie->trans[ base - ucharcount + charid ].check \ - && trie->trans[ base - ucharcount + charid ].next ) \ - ? trie->trans[ base - ucharcount + charid ].next \ - : ( state==1 ? special : 0 ) \ - ) - -#define TRIE_BITMAP_SET_FOLDED(trie, uvc, folder) \ -STMT_START { \ - TRIE_BITMAP_SET(trie, uvc); \ - /* store the folded codepoint */ \ - if ( folder ) \ - TRIE_BITMAP_SET(trie, folder[(U8) uvc ]); \ - \ - if ( !UTF ) { \ - /* store first byte of utf8 representation of */ \ - /* variant codepoints */ \ - if (! UVCHR_IS_INVARIANT(uvc)) { \ - TRIE_BITMAP_SET(trie, UTF8_TWO_BYTE_HI(uvc)); \ - } \ - } \ -} STMT_END -#define MADE_TRIE 1 -#define MADE_JUMP_TRIE 2 -#define MADE_EXACT_TRIE 4 +/* see if there are any run-time code blocks in the pattern. + * False positives are allowed */ -STATIC I32 -S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, - regnode *first, regnode *last, regnode *tail, - U32 word_count, U32 flags, U32 depth) +static bool +S_has_runtime_code(pTHX_ RExC_state_t * const pRExC_state, + char *pat, STRLEN plen) { - /* first pass, loop through and scan words */ - reg_trie_data *trie; - HV *widecharmap = NULL; - AV *revcharmap = newAV(); - regnode *cur; - STRLEN len = 0; - UV uvc = 0; - U16 curword = 0; - U32 next_alloc = 0; - regnode *jumper = NULL; - regnode *nextbranch = NULL; - regnode *convert = NULL; - U32 *prev_states; /* temp array mapping each state to previous one */ - /* we just use folder as a flag in utf8 */ - const U8 * folder = NULL; - - /* in the below add_data call we are storing either 'tu' or 'tuaa' - * which stands for one trie structure, one hash, optionally followed - * by two arrays */ -#ifdef DEBUGGING - const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("tuaa")); - AV *trie_words = NULL; - /* along with revcharmap, this only used during construction but both are - * useful during debugging so we store them in the struct when debugging. - */ -#else - const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("tu")); - STRLEN trie_charcount=0; -#endif - SV *re_trie_maxbuff; - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - PERL_ARGS_ASSERT_MAKE_TRIE; -#ifndef DEBUGGING - PERL_UNUSED_ARG(depth); -#endif - - switch (flags) { - case EXACT: case EXACT_REQ8: case EXACTL: break; - case EXACTFAA: - case EXACTFUP: - case EXACTFU: - case EXACTFLU8: folder = PL_fold_latin1; break; - case EXACTF: folder = PL_fold; break; - default: Perl_croak( aTHX_ "panic! In trie construction, unknown node type %u %s", (unsigned) flags, PL_reg_name[flags] ); - } - - trie = (reg_trie_data *) PerlMemShared_calloc( 1, sizeof(reg_trie_data) ); - trie->refcount = 1; - trie->startstate = 1; - trie->wordcount = word_count; - RExC_rxi->data->data[ data_slot ] = (void*)trie; - trie->charmap = (U16 *) PerlMemShared_calloc( 256, sizeof(U16) ); - if (flags == EXACT || flags == EXACT_REQ8 || flags == EXACTL) - trie->bitmap = (char *) PerlMemShared_calloc( ANYOF_BITMAP_SIZE, 1 ); - trie->wordinfo = (reg_trie_wordinfo *) PerlMemShared_calloc( - trie->wordcount+1, sizeof(reg_trie_wordinfo)); - - DEBUG_r({ - trie_words = newAV(); - }); - - re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, GV_ADD); - assert(re_trie_maxbuff); - if (!SvIOK(re_trie_maxbuff)) { - sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT); - } - DEBUG_TRIE_COMPILE_r({ - Perl_re_indentf( aTHX_ - "make_trie start==%d, first==%d, last==%d, tail==%d depth=%d\n", - depth+1, - REG_NODE_NUM(startbranch), REG_NODE_NUM(first), - REG_NODE_NUM(last), REG_NODE_NUM(tail), (int)depth); - }); - - /* Find the node we are going to overwrite */ - if ( first == startbranch && OP( last ) != BRANCH ) { - /* whole branch chain */ - convert = first; - } else { - /* branch sub-chain */ - convert = NEXTOPER( first ); - } - - /* -- First loop and Setup -- - - We first traverse the branches and scan each word to determine if it - contains widechars, and how many unique chars there are, this is - important as we have to build a table with at least as many columns as we - have unique chars. - - We use an array of integers to represent the character codes 0..255 - (trie->charmap) and we use a an HV* to store Unicode characters. We use - the native representation of the character value as the key and IV's for - the coded index. - - *TODO* If we keep track of how many times each character is used we can - remap the columns so that the table compression later on is more - efficient in terms of memory by ensuring the most common value is in the - middle and the least common are on the outside. IMO this would be better - than a most to least common mapping as theres a decent chance the most - common letter will share a node with the least common, meaning the node - will not be compressible. With a middle is most common approach the worst - case is when we have the least common nodes twice. - - */ - - for ( cur = first ; cur < last ; cur = regnext( cur ) ) { - regnode *noper = NEXTOPER( cur ); - const U8 *uc; - const U8 *e; - int foldlen = 0; - U32 wordlen = 0; /* required init */ - STRLEN minchars = 0; - STRLEN maxchars = 0; - bool set_bit = trie->bitmap ? 1 : 0; /*store the first char in the - bitmap?*/ - - if (OP(noper) == NOTHING) { - /* skip past a NOTHING at the start of an alternation - * eg, /(?:)a|(?:b)/ should be the same as /a|b/ - * - * If the next node is not something we are supposed to process - * we will just ignore it due to the condition guarding the - * next block. - */ + int n = 0; + STRLEN s; - regnode *noper_next= regnext(noper); - if (noper_next < tail) - noper= noper_next; - } + PERL_UNUSED_CONTEXT; - if ( noper < tail - && ( OP(noper) == flags - || (flags == EXACT && OP(noper) == EXACT_REQ8) - || (flags == EXACTFU && ( OP(noper) == EXACTFU_REQ8 - || OP(noper) == EXACTFUP)))) + for (s = 0; s < plen; s++) { + if ( pRExC_state->code_blocks + && n < pRExC_state->code_blocks->count + && s == pRExC_state->code_blocks->cb[n].start) { - uc= (U8*)STRING(noper); - e= uc + STR_LEN(noper); - } else { - trie->minlen= 0; + s = pRExC_state->code_blocks->cb[n].end; + n++; continue; } + /* TODO ideally should handle [..], (#..), /#.../x to reduce false + * positives here */ + if (pat[s] == '(' && s+2 <= plen && pat[s+1] == '?' && + (pat[s+2] == '{' + || (s + 2 <= plen && pat[s+2] == '?' && pat[s+3] == '{')) + ) + return 1; + } + return 0; +} +/* Handle run-time code blocks. We will already have compiled any direct + * or indirect literal code blocks. Now, take the pattern 'pat' and make a + * copy of it, but with any literal code blocks blanked out and + * appropriate chars escaped; then feed it into + * + * eval "qr'modified_pattern'" + * + * For example, + * + * a\bc(?{"this was literal"})def'ghi\\jkl(?{"this is runtime"})mno + * + * becomes + * + * qr'a\\bc_______________________def\'ghi\\\\jkl(?{"this is runtime"})mno' + * + * After eval_sv()-ing that, grab any new code blocks from the returned qr + * and merge them with any code blocks of the original regexp. + * + * If the pat is non-UTF8, while the evalled qr is UTF8, don't merge; + * instead, just save the qr and return FALSE; this tells our caller that + * the original pattern needs upgrading to utf8. + */ - if ( set_bit ) { /* bitmap only alloced when !(UTF&&Folding) */ - TRIE_BITMAP_SET(trie,*uc); /* store the raw first byte - regardless of encoding */ - if (OP( noper ) == EXACTFUP) { - /* false positives are ok, so just set this */ - TRIE_BITMAP_SET(trie, LATIN_SMALL_LETTER_SHARP_S); - } - } - - for ( ; uc < e ; uc += len ) { /* Look at each char in the current - branch */ - TRIE_CHARCOUNT(trie)++; - TRIE_READ_CHAR; - - /* TRIE_READ_CHAR returns the current character, or its fold if /i - * is in effect. Under /i, this character can match itself, or - * anything that folds to it. If not under /i, it can match just - * itself. Most folds are 1-1, for example k, K, and KELVIN SIGN - * all fold to k, and all are single characters. But some folds - * expand to more than one character, so for example LATIN SMALL - * LIGATURE FFI folds to the three character sequence 'ffi'. If - * the string beginning at 'uc' is 'ffi', it could be matched by - * three characters, or just by the one ligature character. (It - * could also be matched by two characters: LATIN SMALL LIGATURE FF - * followed by 'i', or by 'f' followed by LATIN SMALL LIGATURE FI). - * (Of course 'I' and/or 'F' instead of 'i' and 'f' can also - * match.) The trie needs to know the minimum and maximum number - * of characters that could match so that it can use size alone to - * quickly reject many match attempts. The max is simple: it is - * the number of folded characters in this branch (since a fold is - * never shorter than what folds to it. */ - - maxchars++; - - /* And the min is equal to the max if not under /i (indicated by - * 'folder' being NULL), or there are no multi-character folds. If - * there is a multi-character fold, the min is incremented just - * once, for the character that folds to the sequence. Each - * character in the sequence needs to be added to the list below of - * characters in the trie, but we count only the first towards the - * min number of characters needed. This is done through the - * variable 'foldlen', which is returned by the macros that look - * for these sequences as the number of bytes the sequence - * occupies. Each time through the loop, we decrement 'foldlen' by - * how many bytes the current char occupies. Only when it reaches - * 0 do we increment 'minchars' or look for another multi-character - * sequence. */ - if (folder == NULL) { - minchars++; - } - else if (foldlen > 0) { - foldlen -= (UTF) ? UTF8SKIP(uc) : 1; - } - else { - minchars++; - - /* See if *uc is the beginning of a multi-character fold. If - * so, we decrement the length remaining to look at, to account - * for the current character this iteration. (We can use 'uc' - * instead of the fold returned by TRIE_READ_CHAR because the - * macro is smart enough to account for any unfolded - * characters. */ - if (UTF) { - if ((foldlen = is_MULTI_CHAR_FOLD_utf8_safe(uc, e))) { - foldlen -= UTF8SKIP(uc); - } - } - else if ((foldlen = is_MULTI_CHAR_FOLD_latin1_safe(uc, e))) { - foldlen--; - } - } - - /* The current character (and any potential folds) should be added - * to the possible matching characters for this position in this - * branch */ - if ( uvc < 256 ) { - if ( folder ) { - U8 folded= folder[ (U8) uvc ]; - if ( !trie->charmap[ folded ] ) { - trie->charmap[ folded ]=( ++trie->uniquecharcount ); - TRIE_STORE_REVCHAR( folded ); - } - } - if ( !trie->charmap[ uvc ] ) { - trie->charmap[ uvc ]=( ++trie->uniquecharcount ); - TRIE_STORE_REVCHAR( uvc ); - } - if ( set_bit ) { - /* store the codepoint in the bitmap, and its folded - * equivalent. */ - TRIE_BITMAP_SET_FOLDED(trie, uvc, folder); - set_bit = 0; /* We've done our bit :-) */ - } - } else { - - /* XXX We could come up with the list of code points that fold - * to this using PL_utf8_foldclosures, except not for - * multi-char folds, as there may be multiple combinations - * there that could work, which needs to wait until runtime to - * resolve (The comment about LIGATURE FFI above is such an - * example */ - - SV** svpp; - if ( !widecharmap ) - widecharmap = newHV(); - - svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 1 ); - - if ( !svpp ) - Perl_croak( aTHX_ "error creating/fetching widecharmap entry for 0x%" UVXf, uvc ); - - if ( !SvTRUE( *svpp ) ) { - sv_setiv( *svpp, ++trie->uniquecharcount ); - TRIE_STORE_REVCHAR(uvc); - } - } - } /* end loop through characters in this branch of the trie */ - - /* We take the min and max for this branch and combine to find the min - * and max for all branches processed so far */ - if( cur == first ) { - trie->minlen = minchars; - trie->maxlen = maxchars; - } else if (minchars < trie->minlen) { - trie->minlen = minchars; - } else if (maxchars > trie->maxlen) { - trie->maxlen = maxchars; - } - } /* end first pass */ - DEBUG_TRIE_COMPILE_r( - Perl_re_indentf( aTHX_ - "TRIE(%s): W:%d C:%d Uq:%d Min:%d Max:%d\n", - depth+1, - ( widecharmap ? "UTF8" : "NATIVE" ), (int)word_count, - (int)TRIE_CHARCOUNT(trie), trie->uniquecharcount, - (int)trie->minlen, (int)trie->maxlen ) - ); - - /* - We now know what we are dealing with in terms of unique chars and - string sizes so we can calculate how much memory a naive - representation using a flat table will take. If it's over a reasonable - limit (as specified by ${^RE_TRIE_MAXBUF}) we use a more memory - conservative but potentially much slower representation using an array - of lists. - - At the end we convert both representations into the same compressed - form that will be used in regexec.c for matching with. The latter - is a form that cannot be used to construct with but has memory - properties similar to the list form and access properties similar - to the table form making it both suitable for fast searches and - small enough that its feasable to store for the duration of a program. - - See the comment in the code where the compressed table is produced - inplace from the flat tabe representation for an explanation of how - the compression works. +static bool +S_compile_runtime_code(pTHX_ RExC_state_t * const pRExC_state, + char *pat, STRLEN plen) +{ + SV *qr; - */ + DECLARE_AND_GET_RE_DEBUG_FLAGS; + if (pRExC_state->runtime_code_qr) { + /* this is the second time we've been called; this should + * only happen if the main pattern got upgraded to utf8 + * during compilation; re-use the qr we compiled first time + * round (which should be utf8 too) + */ + qr = pRExC_state->runtime_code_qr; + pRExC_state->runtime_code_qr = NULL; + assert(RExC_utf8 && SvUTF8(qr)); + } + else { + int n = 0; + STRLEN s; + char *p, *newpat; + int newlen = plen + 7; /* allow for "qr''xx\0" extra chars */ + SV *sv, *qr_ref; + dSP; - Newx(prev_states, TRIE_CHARCOUNT(trie) + 2, U32); - prev_states[1] = 0; + /* determine how many extra chars we need for ' and \ escaping */ + for (s = 0; s < plen; s++) { + if (pat[s] == '\'' || pat[s] == '\\') + newlen++; + } - if ( (IV)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount + 1) - > SvIV(re_trie_maxbuff) ) - { - /* - Second Pass -- Array Of Lists Representation + Newx(newpat, newlen, char); + p = newpat; + *p++ = 'q'; *p++ = 'r'; *p++ = '\''; - Each state will be represented by a list of charid:state records - (reg_trie_trans_le) the first such element holds the CUR and LEN - points of the allocated array. (See defines above). - - We build the initial structure using the lists, and then convert - it into the compressed table form which allows faster lookups - (but cant be modified once converted). - */ - - STRLEN transcount = 1; - - DEBUG_TRIE_COMPILE_MORE_r( Perl_re_indentf( aTHX_ "Compiling trie using list compiler\n", - depth+1)); - - trie->states = (reg_trie_state *) - PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2, - sizeof(reg_trie_state) ); - TRIE_LIST_NEW(1); - next_alloc = 2; - - for ( cur = first ; cur < last ; cur = regnext( cur ) ) { - - regnode *noper = NEXTOPER( cur ); - U32 state = 1; /* required init */ - U16 charid = 0; /* sanity init */ - U32 wordlen = 0; /* required init */ - - if (OP(noper) == NOTHING) { - regnode *noper_next= regnext(noper); - if (noper_next < tail) - noper= noper_next; - /* we will undo this assignment if noper does not - * point at a trieable type in the else clause of - * the following statement. */ - } - - if ( noper < tail - && ( OP(noper) == flags - || (flags == EXACT && OP(noper) == EXACT_REQ8) - || (flags == EXACTFU && ( OP(noper) == EXACTFU_REQ8 - || OP(noper) == EXACTFUP)))) + for (s = 0; s < plen; s++) { + if ( pRExC_state->code_blocks + && n < pRExC_state->code_blocks->count + && s == pRExC_state->code_blocks->cb[n].start) { - const U8 *uc= (U8*)STRING(noper); - const U8 *e= uc + STR_LEN(noper); - - for ( ; uc < e ; uc += len ) { - - TRIE_READ_CHAR; - - if ( uvc < 256 ) { - charid = trie->charmap[ uvc ]; - } else { - SV** const svpp = hv_fetch( widecharmap, - (char*)&uvc, - sizeof( UV ), - 0); - if ( !svpp ) { - charid = 0; - } else { - charid=(U16)SvIV( *svpp ); - } - } - /* charid is now 0 if we dont know the char read, or - * nonzero if we do */ - if ( charid ) { - - U16 check; - U32 newstate = 0; - - charid--; - if ( !trie->states[ state ].trans.list ) { - TRIE_LIST_NEW( state ); - } - for ( check = 1; - check <= TRIE_LIST_USED( state ); - check++ ) - { - if ( TRIE_LIST_ITEM( state, check ).forid - == charid ) - { - newstate = TRIE_LIST_ITEM( state, check ).newstate; - break; - } - } - if ( ! newstate ) { - newstate = next_alloc++; - prev_states[newstate] = state; - TRIE_LIST_PUSH( state, charid, newstate ); - transcount++; - } - state = newstate; - } else { - Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %" IVdf, uvc ); - } - } - } else { - /* If we end up here it is because we skipped past a NOTHING, but did not end up - * on a trieable type. So we need to reset noper back to point at the first regop - * in the branch before we call TRIE_HANDLE_WORD() + /* blank out literal code block so that they aren't + * recompiled: eg change from/to: + * /(?{xyz})/ + * /(?=====)/ + * and + * /(??{xyz})/ + * /(?======)/ + * and + * /(?(?{xyz}))/ + * /(?(?=====))/ */ - noper= NEXTOPER(cur); + assert(pat[s] == '('); + assert(pat[s+1] == '?'); + *p++ = '('; + *p++ = '?'; + s += 2; + while (s < pRExC_state->code_blocks->cb[n].end) { + *p++ = '='; + s++; + } + *p++ = ')'; + n++; + continue; } - TRIE_HANDLE_WORD(state); - - } /* end second pass */ - - /* next alloc is the NEXT state to be allocated */ - trie->statecount = next_alloc; - trie->states = (reg_trie_state *) - PerlMemShared_realloc( trie->states, - next_alloc - * sizeof(reg_trie_state) ); - - /* and now dump it out before we compress it */ - DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_list(trie, widecharmap, - revcharmap, next_alloc, - depth+1) - ); - - trie->trans = (reg_trie_trans *) - PerlMemShared_calloc( transcount, sizeof(reg_trie_trans) ); - { - U32 state; - U32 tp = 0; - U32 zp = 0; - - - for( state=1 ; state < next_alloc ; state ++ ) { - U32 base=0; - - /* - DEBUG_TRIE_COMPILE_MORE_r( - Perl_re_printf( aTHX_ "tp: %d zp: %d ",tp,zp) - ); - */ - - if (trie->states[state].trans.list) { - U16 minid=TRIE_LIST_ITEM( state, 1).forid; - U16 maxid=minid; - U16 idx; - - for( idx = 2 ; idx <= TRIE_LIST_USED( state ) ; idx++ ) { - const U16 forid = TRIE_LIST_ITEM( state, idx).forid; - if ( forid < minid ) { - minid=forid; - } else if ( forid > maxid ) { - maxid=forid; - } - } - if ( transcount < tp + maxid - minid + 1) { - transcount *= 2; - trie->trans = (reg_trie_trans *) - PerlMemShared_realloc( trie->trans, - transcount - * sizeof(reg_trie_trans) ); - Zero( trie->trans + (transcount / 2), - transcount / 2, - reg_trie_trans ); - } - base = trie->uniquecharcount + tp - minid; - if ( maxid == minid ) { - U32 set = 0; - for ( ; zp < tp ; zp++ ) { - if ( ! trie->trans[ zp ].next ) { - base = trie->uniquecharcount + zp - minid; - trie->trans[ zp ].next = TRIE_LIST_ITEM( state, - 1).newstate; - trie->trans[ zp ].check = state; - set = 1; - break; - } - } - if ( !set ) { - trie->trans[ tp ].next = TRIE_LIST_ITEM( state, - 1).newstate; - trie->trans[ tp ].check = state; - tp++; - zp = tp; - } - } else { - for ( idx=1; idx <= TRIE_LIST_USED( state ) ; idx++ ) { - const U32 tid = base - - trie->uniquecharcount - + TRIE_LIST_ITEM( state, idx ).forid; - trie->trans[ tid ].next = TRIE_LIST_ITEM( state, - idx ).newstate; - trie->trans[ tid ].check = state; - } - tp += ( maxid - minid + 1 ); - } - Safefree(trie->states[ state ].trans.list); - } - /* - DEBUG_TRIE_COMPILE_MORE_r( - Perl_re_printf( aTHX_ " base: %d\n",base); - ); - */ - trie->states[ state ].trans.base=base; + if (pat[s] == '\'' || pat[s] == '\\') + *p++ = '\\'; + *p++ = pat[s]; + } + *p++ = '\''; + if (pRExC_state->pm_flags & RXf_PMf_EXTENDED) { + *p++ = 'x'; + if (pRExC_state->pm_flags & RXf_PMf_EXTENDED_MORE) { + *p++ = 'x'; } - trie->lasttrans = tp + 1; } - } else { - /* - Second Pass -- Flat Table Representation. - - we dont use the 0 slot of either trans[] or states[] so we add 1 to - each. We know that we will need Charcount+1 trans at most to store - the data (one row per char at worst case) So we preallocate both - structures assuming worst case. - - We then construct the trie using only the .next slots of the entry - structs. - - We use the .check field of the first entry of the node temporarily - to make compression both faster and easier by keeping track of how - many non zero fields are in the node. - - Since trans are numbered from 1 any 0 pointer in the table is a FAIL - transition. - - There are two terms at use here: state as a TRIE_NODEIDX() which is - a number representing the first entry of the node, and state as a - TRIE_NODENUM() which is the trans number. state 1 is TRIE_NODEIDX(1) - and TRIE_NODENUM(1), state 2 is TRIE_NODEIDX(2) and TRIE_NODENUM(3) - if there are 2 entrys per node. eg: - - A B A B - 1. 2 4 1. 3 7 - 2. 0 3 3. 0 5 - 3. 0 0 5. 0 0 - 4. 0 0 7. 0 0 - - The table is internally in the right hand, idx form. However as we - also have to deal with the states array which is indexed by nodenum - we have to use TRIE_NODENUM() to convert. - - */ - DEBUG_TRIE_COMPILE_MORE_r( Perl_re_indentf( aTHX_ "Compiling trie using table compiler\n", - depth+1)); - - trie->trans = (reg_trie_trans *) - PerlMemShared_calloc( ( TRIE_CHARCOUNT(trie) + 1 ) - * trie->uniquecharcount + 1, - sizeof(reg_trie_trans) ); - trie->states = (reg_trie_state *) - PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2, - sizeof(reg_trie_state) ); - next_alloc = trie->uniquecharcount + 1; - - - for ( cur = first ; cur < last ; cur = regnext( cur ) ) { - - regnode *noper = NEXTOPER( cur ); - - U32 state = 1; /* required init */ - - U16 charid = 0; /* sanity init */ - U32 accept_state = 0; /* sanity init */ + *p++ = '\0'; + DEBUG_COMPILE_r({ + Perl_re_printf( aTHX_ + "%sre-parsing pattern for runtime code:%s %s\n", + PL_colors[4], PL_colors[5], newpat); + }); - U32 wordlen = 0; /* required init */ + sv = newSVpvn_flags(newpat, p-newpat-1, RExC_utf8 ? SVf_UTF8 : 0); + Safefree(newpat); - if (OP(noper) == NOTHING) { - regnode *noper_next= regnext(noper); - if (noper_next < tail) - noper= noper_next; - /* we will undo this assignment if noper does not - * point at a trieable type in the else clause of - * the following statement. */ - } + ENTER; + SAVETMPS; + save_re_context(); + PUSHSTACKi(PERLSI_REQUIRE); + /* G_RE_REPARSING causes the toker to collapse \\ into \ when + * parsing qr''; normally only q'' does this. It also alters + * hints handling */ + eval_sv(sv, G_SCALAR|G_RE_REPARSING); + SvREFCNT_dec_NN(sv); + SPAGAIN; + qr_ref = POPs; + PUTBACK; + { + SV * const errsv = ERRSV; + if (SvTRUE_NN(errsv)) + /* use croak_sv ? */ + Perl_croak_nocontext("%" SVf, SVfARG(errsv)); + } + assert(SvROK(qr_ref)); + qr = SvRV(qr_ref); + assert(SvTYPE(qr) == SVt_REGEXP && RX_ENGINE((REGEXP*)qr)->op_comp); + /* the leaving below frees the tmp qr_ref. + * Give qr a life of its own */ + SvREFCNT_inc(qr); + POPSTACK; + FREETMPS; + LEAVE; - if ( noper < tail - && ( OP(noper) == flags - || (flags == EXACT && OP(noper) == EXACT_REQ8) - || (flags == EXACTFU && ( OP(noper) == EXACTFU_REQ8 - || OP(noper) == EXACTFUP)))) - { - const U8 *uc= (U8*)STRING(noper); - const U8 *e= uc + STR_LEN(noper); + } - for ( ; uc < e ; uc += len ) { + if (!RExC_utf8 && SvUTF8(qr)) { + /* first time through; the pattern got upgraded; save the + * qr for the next time through */ + assert(!pRExC_state->runtime_code_qr); + pRExC_state->runtime_code_qr = qr; + return 0; + } - TRIE_READ_CHAR; - if ( uvc < 256 ) { - charid = trie->charmap[ uvc ]; - } else { - SV* const * const svpp = hv_fetch( widecharmap, - (char*)&uvc, - sizeof( UV ), - 0); - charid = svpp ? (U16)SvIV(*svpp) : 0; - } - if ( charid ) { - charid--; - if ( !trie->trans[ state + charid ].next ) { - trie->trans[ state + charid ].next = next_alloc; - trie->trans[ state ].check++; - prev_states[TRIE_NODENUM(next_alloc)] - = TRIE_NODENUM(state); - next_alloc += trie->uniquecharcount; - } - state = trie->trans[ state + charid ].next; - } else { - Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %" IVdf, uvc ); - } - /* charid is now 0 if we dont know the char read, or - * nonzero if we do */ - } - } else { - /* If we end up here it is because we skipped past a NOTHING, but did not end up - * on a trieable type. So we need to reset noper back to point at the first regop - * in the branch before we call TRIE_HANDLE_WORD(). - */ - noper= NEXTOPER(cur); - } - accept_state = TRIE_NODENUM( state ); - TRIE_HANDLE_WORD(accept_state); + /* extract any code blocks within the returned qr// */ - } /* end second pass */ - /* and now dump it out before we compress it */ - DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_table(trie, widecharmap, - revcharmap, - next_alloc, depth+1)); + /* merge the main (r1) and run-time (r2) code blocks into one */ + { + RXi_GET_DECL(ReANY((REGEXP *)qr), r2); + struct reg_code_block *new_block, *dst; + RExC_state_t * const r1 = pRExC_state; /* convenient alias */ + int i1 = 0, i2 = 0; + int r1c, r2c; + if (!r2->code_blocks || !r2->code_blocks->count) /* we guessed wrong */ { - /* - * Inplace compress the table.* - - For sparse data sets the table constructed by the trie algorithm will - be mostly 0/FAIL transitions or to put it another way mostly empty. - (Note that leaf nodes will not contain any transitions.) - - This algorithm compresses the tables by eliminating most such - transitions, at the cost of a modest bit of extra work during lookup: - - - Each states[] entry contains a .base field which indicates the - index in the state[] array wheres its transition data is stored. - - - If .base is 0 there are no valid transitions from that node. - - - If .base is nonzero then charid is added to it to find an entry in - the trans array. - - -If trans[states[state].base+charid].check!=state then the - transition is taken to be a 0/Fail transition. Thus if there are fail - transitions at the front of the node then the .base offset will point - somewhere inside the previous nodes data (or maybe even into a node - even earlier), but the .check field determines if the transition is - valid. - - XXX - wrong maybe? - The following process inplace converts the table to the compressed - table: We first do not compress the root node 1,and mark all its - .check pointers as 1 and set its .base pointer as 1 as well. This - allows us to do a DFA construction from the compressed table later, - and ensures that any .base pointers we calculate later are greater - than 0. - - - We set 'pos' to indicate the first entry of the second node. - - - We then iterate over the columns of the node, finding the first and - last used entry at l and m. We then copy l..m into pos..(pos+m-l), - and set the .check pointers accordingly, and advance pos - appropriately and repreat for the next node. Note that when we copy - the next pointers we have to convert them from the original - NODEIDX form to NODENUM form as the former is not valid post - compression. - - - If a node has no transitions used we mark its base as 0 and do not - advance the pos pointer. - - - If a node only has one transition we use a second pointer into the - structure to fill in allocated fail transitions from other states. - This pointer is independent of the main pointer and scans forward - looking for null transitions that are allocated to a state. When it - finds one it writes the single transition into the "hole". If the - pointer doesnt find one the single transition is appended as normal. - - - Once compressed we can Renew/realloc the structures to release the - excess space. + SvREFCNT_dec_NN(qr); + return 1; + } - See "Table-Compression Methods" in sec 3.9 of the Red Dragon, - specifically Fig 3.47 and the associated pseudocode. + if (!r1->code_blocks) + r1->code_blocks = S_alloc_code_blocks(aTHX_ 0); - demq - */ - const U32 laststate = TRIE_NODENUM( next_alloc ); - U32 state, charid; - U32 pos = 0, zp=0; - trie->statecount = laststate; - - for ( state = 1 ; state < laststate ; state++ ) { - U8 flag = 0; - const U32 stateidx = TRIE_NODEIDX( state ); - const U32 o_used = trie->trans[ stateidx ].check; - U32 used = trie->trans[ stateidx ].check; - trie->trans[ stateidx ].check = 0; - - for ( charid = 0; - used && charid < trie->uniquecharcount; - charid++ ) - { - if ( flag || trie->trans[ stateidx + charid ].next ) { - if ( trie->trans[ stateidx + charid ].next ) { - if (o_used == 1) { - for ( ; zp < pos ; zp++ ) { - if ( ! trie->trans[ zp ].next ) { - break; - } - } - trie->states[ state ].trans.base - = zp - + trie->uniquecharcount - - charid ; - trie->trans[ zp ].next - = SAFE_TRIE_NODENUM( trie->trans[ stateidx - + charid ].next ); - trie->trans[ zp ].check = state; - if ( ++zp > pos ) pos = zp; - break; - } - used--; - } - if ( !flag ) { - flag = 1; - trie->states[ state ].trans.base - = pos + trie->uniquecharcount - charid ; - } - trie->trans[ pos ].next - = SAFE_TRIE_NODENUM( - trie->trans[ stateidx + charid ].next ); - trie->trans[ pos ].check = state; - pos++; - } - } - } - trie->lasttrans = pos + 1; - trie->states = (reg_trie_state *) - PerlMemShared_realloc( trie->states, laststate - * sizeof(reg_trie_state) ); - DEBUG_TRIE_COMPILE_MORE_r( - Perl_re_indentf( aTHX_ "Alloc: %d Orig: %" IVdf " elements, Final:%" IVdf ". Savings of %%%5.2f\n", - depth+1, - (int)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount - + 1 ), - (IV)next_alloc, - (IV)pos, - ( ( next_alloc - pos ) * 100 ) / (double)next_alloc ); - ); + r1c = r1->code_blocks->count; + r2c = r2->code_blocks->count; - } /* end table compress */ - } - DEBUG_TRIE_COMPILE_MORE_r( - Perl_re_indentf( aTHX_ "Statecount:%" UVxf " Lasttrans:%" UVxf "\n", - depth+1, - (UV)trie->statecount, - (UV)trie->lasttrans) - ); - /* resize the trans array to remove unused space */ - trie->trans = (reg_trie_trans *) - PerlMemShared_realloc( trie->trans, trie->lasttrans - * sizeof(reg_trie_trans) ); - - { /* Modify the program and insert the new TRIE node */ - U8 nodetype =(U8) flags; - char *str=NULL; + Newx(new_block, r1c + r2c, struct reg_code_block); -#ifdef DEBUGGING - regnode *optimize = NULL; -#endif /* DEBUGGING */ - /* - This means we convert either the first branch or the first Exact, - depending on whether the thing following (in 'last') is a branch - or not and whther first is the startbranch (ie is it a sub part of - the alternation or is it the whole thing.) - Assuming its a sub part we convert the EXACT otherwise we convert - the whole branch sequence, including the first. - */ - /* Find the node we are going to overwrite */ - if ( first != startbranch || OP( last ) == BRANCH ) { - /* branch sub-chain */ - NEXT_OFF( first ) = (U16)(last - first); - /* whole branch chain */ - } - /* But first we check to see if there is a common prefix we can - split out as an EXACT and put in front of the TRIE node. */ - trie->startstate= 1; - if ( trie->bitmap && !widecharmap && !trie->jump ) { - /* we want to find the first state that has more than - * one transition, if that state is not the first state - * then we have a common prefix which we can remove. - */ - U32 state; - for ( state = 1 ; state < trie->statecount-1 ; state++ ) { - U32 ofs = 0; - I32 first_ofs = -1; /* keeps track of the ofs of the first - transition, -1 means none */ - U32 count = 0; - const U32 base = trie->states[ state ].trans.base; + dst = new_block; - /* does this state terminate an alternation? */ - if ( trie->states[state].wordnum ) - count = 1; + while (i1 < r1c || i2 < r2c) { + struct reg_code_block *src; + bool is_qr = 0; - for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) { - if ( ( base + ofs >= trie->uniquecharcount ) && - ( base + ofs - trie->uniquecharcount < trie->lasttrans ) && - trie->trans[ base + ofs - trie->uniquecharcount ].check == state ) - { - if ( ++count > 1 ) { - /* we have more than one transition */ - SV **tmp; - U8 *ch; - /* if this is the first state there is no common prefix - * to extract, so we can exit */ - if ( state == 1 ) break; - tmp = av_fetch( revcharmap, ofs, 0); - ch = (U8*)SvPV_nolen_const( *tmp ); - - /* if we are on count 2 then we need to initialize the - * bitmap, and store the previous char if there was one - * in it*/ - if ( count == 2 ) { - /* clear the bitmap */ - Zero(trie->bitmap, ANYOF_BITMAP_SIZE, char); - DEBUG_OPTIMISE_r( - Perl_re_indentf( aTHX_ "New Start State=%" UVuf " Class: [", - depth+1, - (UV)state)); - if (first_ofs >= 0) { - SV ** const tmp = av_fetch( revcharmap, first_ofs, 0); - const U8 * const ch = (U8*)SvPV_nolen_const( *tmp ); - - TRIE_BITMAP_SET_FOLDED(trie,*ch, folder); - DEBUG_OPTIMISE_r( - Perl_re_printf( aTHX_ "%s", (char*)ch) - ); - } - } - /* store the current firstchar in the bitmap */ - TRIE_BITMAP_SET_FOLDED(trie,*ch, folder); - DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "%s", ch)); - } - first_ofs = ofs; - } - } - if ( count == 1 ) { - /* This state has only one transition, its transition is part - * of a common prefix - we need to concatenate the char it - * represents to what we have so far. */ - SV **tmp = av_fetch( revcharmap, first_ofs, 0); - STRLEN len; - char *ch = SvPV( *tmp, len ); - DEBUG_OPTIMISE_r({ - SV *sv=sv_newmortal(); - Perl_re_indentf( aTHX_ "Prefix State: %" UVuf " Ofs:%" UVuf " Char='%s'\n", - depth+1, - (UV)state, (UV)first_ofs, - pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), 6, - PL_colors[0], PL_colors[1], - (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) | - PERL_PV_ESCAPE_FIRSTCHAR - ) - ); - }); - if ( state==1 ) { - OP( convert ) = nodetype; - str=STRING(convert); - setSTR_LEN(convert, 0); - } - assert( ( STR_LEN(convert) + len ) < 256 ); - setSTR_LEN(convert, (U8)(STR_LEN(convert) + len)); - while (len--) - *str++ = *ch++; - } else { -#ifdef DEBUGGING - if (state>1) - DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "]\n")); -#endif - break; - } - } - trie->prefixlen = (state-1); - if (str) { - regnode *n = convert+NODE_SZ_STR(convert); - assert( NODE_SZ_STR(convert) <= U16_MAX ); - NEXT_OFF(convert) = (U16)(NODE_SZ_STR(convert)); - trie->startstate = state; - trie->minlen -= (state - 1); - trie->maxlen -= (state - 1); -#ifdef DEBUGGING - /* At least the UNICOS C compiler choked on this - * being argument to DEBUG_r(), so let's just have - * it right here. */ - if ( -#ifdef PERL_EXT_RE_BUILD - 1 -#else - DEBUG_r_TEST -#endif - ) { - U32 word = trie->wordcount; - while (word--) { - SV ** const tmp = av_fetch( trie_words, word, 0 ); - if (tmp) { - if ( STR_LEN(convert) <= SvCUR(*tmp) ) - sv_chop(*tmp, SvPV_nolen(*tmp) + STR_LEN(convert)); - else - sv_chop(*tmp, SvPV_nolen(*tmp) + SvCUR(*tmp)); - } - } - } -#endif - if (trie->maxlen) { - convert = n; - } else { - NEXT_OFF(convert) = (U16)(tail - convert); - DEBUG_r(optimize= n); - } + if (i1 == r1c) { + src = &r2->code_blocks->cb[i2++]; + is_qr = 1; } - } - if (!jumper) - jumper = last; - if ( trie->maxlen ) { - NEXT_OFF( convert ) = (U16)(tail - convert); - ARG_SET( convert, data_slot ); - /* Store the offset to the first unabsorbed branch in - jump[0], which is otherwise unused by the jump logic. - We use this when dumping a trie and during optimisation. */ - if (trie->jump) - trie->jump[0] = (U16)(nextbranch - convert); - - /* If the start state is not accepting (meaning there is no empty string/NOTHING) - * and there is a bitmap - * and the first "jump target" node we found leaves enough room - * then convert the TRIE node into a TRIEC node, with the bitmap - * embedded inline in the opcode - this is hypothetically faster. - */ - if ( !trie->states[trie->startstate].wordnum - && trie->bitmap - && ( (char *)jumper - (char *)convert) >= (int)sizeof(struct regnode_charclass) ) + else if (i2 == r2c) + src = &r1->code_blocks->cb[i1++]; + else if ( r1->code_blocks->cb[i1].start + < r2->code_blocks->cb[i2].start) { - OP( convert ) = TRIEC; - Copy(trie->bitmap, ((struct regnode_charclass *)convert)->bitmap, ANYOF_BITMAP_SIZE, char); - PerlMemShared_free(trie->bitmap); - trie->bitmap= NULL; - } else - OP( convert ) = TRIE; - - /* store the type in the flags */ - convert->flags = nodetype; - DEBUG_r({ - optimize = convert - + NODE_STEP_REGNODE - + regarglen[ OP( convert ) ]; - }); - /* XXX We really should free up the resource in trie now, - as we won't use them - (which resources?) dmq */ - } - /* needed for dumping*/ - DEBUG_r(if (optimize) { - /* - Try to clean up some of the debris left after the - optimisation. - */ - while( optimize < jumper ) { - OP( optimize ) = OPTIMIZED; - optimize++; + src = &r1->code_blocks->cb[i1++]; + assert(src->end < r2->code_blocks->cb[i2].start); } - }); - } /* end node insert */ - - /* Finish populating the prev field of the wordinfo array. Walk back - * from each accept state until we find another accept state, and if - * so, point the first word's .prev field at the second word. If the - * second already has a .prev field set, stop now. This will be the - * case either if we've already processed that word's accept state, - * or that state had multiple words, and the overspill words were - * already linked up earlier. - */ - { - U16 word; - U32 state; - U16 prev; - - for (word=1; word <= trie->wordcount; word++) { - prev = 0; - if (trie->wordinfo[word].prev) - continue; - state = trie->wordinfo[word].accept; - while (state) { - state = prev_states[state]; - if (!state) - break; - prev = trie->states[state].wordnum; - if (prev) - break; + else { + assert( r1->code_blocks->cb[i1].start + > r2->code_blocks->cb[i2].start); + src = &r2->code_blocks->cb[i2++]; + is_qr = 1; + assert(src->end < r1->code_blocks->cb[i1].start); } - trie->wordinfo[word].prev = prev; + + assert(pat[src->start] == '('); + assert(pat[src->end] == ')'); + dst->start = src->start; + dst->end = src->end; + dst->block = src->block; + dst->src_regex = is_qr ? (REGEXP*) SvREFCNT_inc( (SV*) qr) + : src->src_regex; + dst++; } - Safefree(prev_states); + r1->code_blocks->count += r2c; + Safefree(r1->code_blocks->cb); + r1->code_blocks->cb = new_block; } - - /* and now dump out the compressed format */ - DEBUG_TRIE_COMPILE_r(dump_trie(trie, widecharmap, revcharmap, depth+1)); - - RExC_rxi->data->data[ data_slot + 1 ] = (void*)widecharmap; -#ifdef DEBUGGING - RExC_rxi->data->data[ data_slot + TRIE_WORDS_OFFSET ] = (void*)trie_words; - RExC_rxi->data->data[ data_slot + 3 ] = (void*)revcharmap; -#else - SvREFCNT_dec_NN(revcharmap); -#endif - return trie->jump - ? MADE_JUMP_TRIE - : trie->startstate>1 - ? MADE_EXACT_TRIE - : MADE_TRIE; + SvREFCNT_dec_NN(qr); + return 1; } -STATIC regnode * -S_construct_ahocorasick_from_trie(pTHX_ RExC_state_t *pRExC_state, regnode *source, U32 depth) + +STATIC bool +S_setup_longest(pTHX_ RExC_state_t *pRExC_state, + struct reg_substr_datum *rsd, + struct scan_data_substrs *sub, + STRLEN longest_length) { -/* The Trie is constructed and compressed now so we can build a fail array if - * it's needed + /* This is the common code for setting up the floating and fixed length + * string data extracted from Perl_re_op_compile() below. Returns a boolean + * as to whether succeeded or not */ - This is basically the Aho-Corasick algorithm. Its from exercise 3.31 and - 3.32 in the - "Red Dragon" -- Compilers, principles, techniques, and tools. Aho, Sethi, - Ullman 1985/88 - ISBN 0-201-10088-6 - - We find the fail state for each state in the trie, this state is the longest - proper suffix of the current state's 'word' that is also a proper prefix of - another word in our trie. State 1 represents the word '' and is thus the - default fail state. This allows the DFA not to have to restart after its - tried and failed a word at a given point, it simply continues as though it - had been matching the other word in the first place. - Consider - 'abcdgu'=~/abcdefg|cdgu/ - When we get to 'd' we are still matching the first word, we would encounter - 'g' which would fail, which would bring us to the state representing 'd' in - the second word where we would try 'g' and succeed, proceeding to match - 'cdgu'. - */ - /* add a fail transition */ - const U32 trie_offset = ARG(source); - reg_trie_data *trie=(reg_trie_data *)RExC_rxi->data->data[trie_offset]; - U32 *q; - const U32 ucharcount = trie->uniquecharcount; - const U32 numstates = trie->statecount; - const U32 ubound = trie->lasttrans + ucharcount; - U32 q_read = 0; - U32 q_write = 0; - U32 charid; - U32 base = trie->states[ 1 ].trans.base; - U32 *fail; - reg_ac_data *aho; - const U32 data_slot = add_data( pRExC_state, STR_WITH_LEN("T")); - regnode *stclass; - DECLARE_AND_GET_RE_DEBUG_FLAGS; + I32 t; + SSize_t ml; + bool eol = cBOOL(sub->flags & SF_BEFORE_EOL); + bool meol = cBOOL(sub->flags & SF_BEFORE_MEOL); - PERL_ARGS_ASSERT_CONSTRUCT_AHOCORASICK_FROM_TRIE; - PERL_UNUSED_CONTEXT; -#ifndef DEBUGGING - PERL_UNUSED_ARG(depth); -#endif - - if ( OP(source) == TRIE ) { - struct regnode_1 *op = (struct regnode_1 *) - PerlMemShared_calloc(1, sizeof(struct regnode_1)); - StructCopy(source, op, struct regnode_1); - stclass = (regnode *)op; - } else { - struct regnode_charclass *op = (struct regnode_charclass *) - PerlMemShared_calloc(1, sizeof(struct regnode_charclass)); - StructCopy(source, op, struct regnode_charclass); - stclass = (regnode *)op; - } - OP(stclass)+=2; /* convert the TRIE type to its AHO-CORASICK equivalent */ - - ARG_SET( stclass, data_slot ); - aho = (reg_ac_data *) PerlMemShared_calloc( 1, sizeof(reg_ac_data) ); - RExC_rxi->data->data[ data_slot ] = (void*)aho; - aho->trie=trie_offset; - aho->states=(reg_trie_state *)PerlMemShared_malloc( numstates * sizeof(reg_trie_state) ); - Copy( trie->states, aho->states, numstates, reg_trie_state ); - Newx( q, numstates, U32); - aho->fail = (U32 *) PerlMemShared_calloc( numstates, sizeof(U32) ); - aho->refcount = 1; - fail = aho->fail; - /* initialize fail[0..1] to be 1 so that we always have - a valid final fail state */ - fail[ 0 ] = fail[ 1 ] = 1; - - for ( charid = 0; charid < ucharcount ; charid++ ) { - const U32 newstate = TRIE_TRANS_STATE( 1, base, ucharcount, charid, 0 ); - if ( newstate ) { - q[ q_write ] = newstate; - /* set to point at the root */ - fail[ q[ q_write++ ] ]=1; - } - } - while ( q_read < q_write) { - const U32 cur = q[ q_read++ % numstates ]; - base = trie->states[ cur ].trans.base; - - for ( charid = 0 ; charid < ucharcount ; charid++ ) { - const U32 ch_state = TRIE_TRANS_STATE( cur, base, ucharcount, charid, 1 ); - if (ch_state) { - U32 fail_state = cur; - U32 fail_base; - do { - fail_state = fail[ fail_state ]; - fail_base = aho->states[ fail_state ].trans.base; - } while ( !TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 ) ); - - fail_state = TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 ); - fail[ ch_state ] = fail_state; - if ( !aho->states[ ch_state ].wordnum && aho->states[ fail_state ].wordnum ) - { - aho->states[ ch_state ].wordnum = aho->states[ fail_state ].wordnum; - } - q[ q_write++ % numstates] = ch_state; - } - } - } - /* restore fail[0..1] to 0 so that we "fall out" of the AC loop - when we fail in state 1, this allows us to use the - charclass scan to find a valid start char. This is based on the principle - that theres a good chance the string being searched contains lots of stuff - that cant be a start char. - */ - fail[ 0 ] = fail[ 1 ] = 0; - DEBUG_TRIE_COMPILE_r({ - Perl_re_indentf( aTHX_ "Stclass Failtable (%" UVuf " states): 0", - depth, (UV)numstates - ); - for( q_read=1; q_read next) - stringok = 0; - if (PL_regkind[OP(n)] == NOTHING) { - DEBUG_PEEP("skip:", n, depth, 0); - NEXT_OFF(scan) += NEXT_OFF(n); - next = n + NODE_STEP_REGNODE; -#ifdef DEBUGGING - if (stringok) - stop = n; -#endif - n = regnext(n); - } - else if (stringok) { - const unsigned int oldl = STR_LEN(scan); - regnode * const nnext = regnext(n); - - /* XXX I (khw) kind of doubt that this works on platforms (should - * Perl ever run on one) where U8_MAX is above 255 because of lots - * of other assumptions */ - /* Don't join if the sum can't fit into a single node */ - if (oldl + STR_LEN(n) > U8_MAX) - break; - - /* Joining something that requires UTF-8 with something that - * doesn't, means the result requires UTF-8. */ - if (OP(scan) == EXACT && (OP(n) == EXACT_REQ8)) { - OP(scan) = EXACT_REQ8; - } - else if (OP(scan) == EXACT_REQ8 && (OP(n) == EXACT)) { - ; /* join is compatible, no need to change OP */ - } - else if ((OP(scan) == EXACTFU) && (OP(n) == EXACTFU_REQ8)) { - OP(scan) = EXACTFU_REQ8; - } - else if ((OP(scan) == EXACTFU_REQ8) && (OP(n) == EXACTFU)) { - ; /* join is compatible, no need to change OP */ - } - else if (OP(scan) == EXACTFU && OP(n) == EXACTFU) { - ; /* join is compatible, no need to change OP */ - } - else if (OP(scan) == EXACTFU && OP(n) == EXACTFU_S_EDGE) { - - /* Under /di, temporary EXACTFU_S_EDGE nodes are generated, - * which can join with EXACTFU ones. We check for this case - * here. These need to be resolved to either EXACTFU or - * EXACTF at joining time. They have nothing in them that - * would forbid them from being the more desirable EXACTFU - * nodes except that they begin and/or end with a single [Ss]. - * The reason this is problematic is because they could be - * joined in this loop with an adjacent node that ends and/or - * begins with [Ss] which would then form the sequence 'ss', - * which matches differently under /di than /ui, in which case - * EXACTFU can't be used. If the 'ss' sequence doesn't get - * formed, the nodes get absorbed into any adjacent EXACTFU - * node. And if the only adjacent node is EXACTF, they get - * absorbed into that, under the theory that a longer node is - * better than two shorter ones, even if one is EXACTFU. Note - * that EXACTFU_REQ8 is generated only for UTF-8 patterns, - * and the EXACTFU_S_EDGE ones only for non-UTF-8. */ - - if (STRING(n)[STR_LEN(n)-1] == 's') { - - /* Here the joined node would end with 's'. If the node - * following the combination is an EXACTF one, it's better to - * join this trailing edge 's' node with that one, leaving the - * current one in 'scan' be the more desirable EXACTFU */ - if (OP(nnext) == EXACTF) { - break; - } - - OP(scan) = EXACTFU_S_EDGE; - - } /* Otherwise, the beginning 's' of the 2nd node just - becomes an interior 's' in 'scan' */ - } - else if (OP(scan) == EXACTF && OP(n) == EXACTF) { - ; /* join is compatible, no need to change OP */ - } - else if (OP(scan) == EXACTF && OP(n) == EXACTFU_S_EDGE) { - - /* EXACTF nodes are compatible for joining with EXACTFU_S_EDGE - * nodes. But the latter nodes can be also joined with EXACTFU - * ones, and that is a better outcome, so if the node following - * 'n' is EXACTFU, quit now so that those two can be joined - * later */ - if (OP(nnext) == EXACTFU) { - break; - } - - /* The join is compatible, and the combined node will be - * EXACTF. (These don't care if they begin or end with 's' */ - } - else if (OP(scan) == EXACTFU_S_EDGE && OP(n) == EXACTFU_S_EDGE) { - if ( STRING(scan)[STR_LEN(scan)-1] == 's' - && STRING(n)[0] == 's') - { - /* When combined, we have the sequence 'ss', which means we - * have to remain /di */ - OP(scan) = EXACTF; - } - } - else if (OP(scan) == EXACTFU_S_EDGE && OP(n) == EXACTFU) { - if (STRING(n)[0] == 's') { - ; /* Here the join is compatible and the combined node - starts with 's', no need to change OP */ - } - else { /* Now the trailing 's' is in the interior */ - OP(scan) = EXACTFU; - } - } - else if (OP(scan) == EXACTFU_S_EDGE && OP(n) == EXACTF) { - - /* The join is compatible, and the combined node will be - * EXACTF. (These don't care if they begin or end with 's' */ - OP(scan) = EXACTF; - } - else if (OP(scan) != OP(n)) { - - /* The only other compatible joinings are the same node type */ - break; - } - - DEBUG_PEEP("merg", n, depth, 0); - merged++; - - NEXT_OFF(scan) += NEXT_OFF(n); - assert( ( STR_LEN(scan) + STR_LEN(n) ) < 256 ); - setSTR_LEN(scan, (U8)(STR_LEN(scan) + STR_LEN(n))); - next = n + NODE_SZ_STR(n); - /* Now we can overwrite *n : */ - Move(STRING(n), STRING(scan) + oldl, STR_LEN(n), char); -#ifdef DEBUGGING - stop = next - 1; -#endif - n = nnext; - if (stopnow) break; - } - -#ifdef EXPERIMENTAL_INPLACESCAN - if (flags && !NEXT_OFF(n)) { - DEBUG_PEEP("atch", val, depth, 0); - if (reg_off_by_arg[OP(n)]) { - ARG_SET(n, val - n); - } - else { - NEXT_OFF(n) = val - n; - } - stopnow = 1; - } -#endif - } - - /* This temporary node can now be turned into EXACTFU, and must, as - * regexec.c doesn't handle it */ - if (OP(scan) == EXACTFU_S_EDGE) { - OP(scan) = EXACTFU; - } - - *min_subtract = 0; - *unfolded_multi_char = FALSE; - - /* Here, all the adjacent mergeable EXACTish nodes have been merged. We - * can now analyze for sequences of problematic code points. (Prior to - * this final joining, sequences could have been split over boundaries, and - * hence missed). The sequences only happen in folding, hence for any - * non-EXACT EXACTish node */ - if (OP(scan) != EXACT && OP(scan) != EXACT_REQ8 && OP(scan) != EXACTL) { - U8* s0 = (U8*) STRING(scan); - U8* s = s0; - U8* s_end = s0 + STR_LEN(scan); - - int total_count_delta = 0; /* Total delta number of characters that - multi-char folds expand to */ - - /* One pass is made over the node's string looking for all the - * possibilities. To avoid some tests in the loop, there are two main - * cases, for UTF-8 patterns (which can't have EXACTF nodes) and - * non-UTF-8 */ - if (UTF) { - U8* folded = NULL; - - if (OP(scan) == EXACTFL) { - U8 *d; - - /* An EXACTFL node would already have been changed to another - * node type unless there is at least one character in it that - * is problematic; likely a character whose fold definition - * won't be known until runtime, and so has yet to be folded. - * For all but the UTF-8 locale, folds are 1-1 in length, but - * to handle the UTF-8 case, we need to create a temporary - * folded copy using UTF-8 locale rules in order to analyze it. - * This is because our macros that look to see if a sequence is - * a multi-char fold assume everything is folded (otherwise the - * tests in those macros would be too complicated and slow). - * Note that here, the non-problematic folds will have already - * been done, so we can just copy such characters. We actually - * don't completely fold the EXACTFL string. We skip the - * unfolded multi-char folds, as that would just create work - * below to figure out the size they already are */ - - Newx(folded, UTF8_MAX_FOLD_CHAR_EXPAND * STR_LEN(scan) + 1, U8); - d = folded; - while (s < s_end) { - STRLEN s_len = UTF8SKIP(s); - if (! is_PROBLEMATIC_LOCALE_FOLD_utf8(s)) { - Copy(s, d, s_len, U8); - d += s_len; - } - else if (is_FOLDS_TO_MULTI_utf8(s)) { - *unfolded_multi_char = TRUE; - Copy(s, d, s_len, U8); - d += s_len; - } - else if (isASCII(*s)) { - *(d++) = toFOLD(*s); - } - else { - STRLEN len; - _toFOLD_utf8_flags(s, s_end, d, &len, FOLD_FLAGS_FULL); - d += len; - } - s += s_len; - } - - /* Point the remainder of the routine to look at our temporary - * folded copy */ - s = folded; - s_end = d; - } /* End of creating folded copy of EXACTFL string */ - - /* Examine the string for a multi-character fold sequence. UTF-8 - * patterns have all characters pre-folded by the time this code is - * executed */ - while (s < s_end - 1) /* Can stop 1 before the end, as minimum - length sequence we are looking for is 2 */ - { - int count = 0; /* How many characters in a multi-char fold */ - int len = is_MULTI_CHAR_FOLD_utf8_safe(s, s_end); - if (! len) { /* Not a multi-char fold: get next char */ - s += UTF8SKIP(s); - continue; - } - - { /* Here is a generic multi-char fold. */ - U8* multi_end = s + len; - - /* Count how many characters are in it. In the case of - * /aa, no folds which contain ASCII code points are - * allowed, so check for those, and skip if found. */ - if (OP(scan) != EXACTFAA && OP(scan) != EXACTFAA_NO_TRIE) { - count = utf8_length(s, multi_end); - s = multi_end; - } - else { - while (s < multi_end) { - if (isASCII(*s)) { - s++; - goto next_iteration; - } - else { - s += UTF8SKIP(s); - } - count++; - } - } - } - - /* The delta is how long the sequence is minus 1 (1 is how long - * the character that folds to the sequence is) */ - total_count_delta += count - 1; - next_iteration: ; - } - - /* We created a temporary folded copy of the string in EXACTFL - * nodes. Therefore we need to be sure it doesn't go below zero, - * as the real string could be shorter */ - if (OP(scan) == EXACTFL) { - int total_chars = utf8_length((U8*) STRING(scan), - (U8*) STRING(scan) + STR_LEN(scan)); - if (total_count_delta > total_chars) { - total_count_delta = total_chars; - } - } - - *min_subtract += total_count_delta; - Safefree(folded); - } - else if (OP(scan) == EXACTFAA) { - - /* Non-UTF-8 pattern, EXACTFAA node. There can't be a multi-char - * fold to the ASCII range (and there are no existing ones in the - * upper latin1 range). But, as outlined in the comments preceding - * this function, we need to flag any occurrences of the sharp s. - * This character forbids trie formation (because of added - * complexity) */ -#if UNICODE_MAJOR_VERSION > 3 /* no multifolds in early Unicode */ \ - || (UNICODE_MAJOR_VERSION == 3 && ( UNICODE_DOT_VERSION > 0) \ - || UNICODE_DOT_DOT_VERSION > 0) - while (s < s_end) { - if (*s == LATIN_SMALL_LETTER_SHARP_S) { - OP(scan) = EXACTFAA_NO_TRIE; - *unfolded_multi_char = TRUE; - break; - } - s++; - } - } - else if (OP(scan) != EXACTFAA_NO_TRIE) { - - /* Non-UTF-8 pattern, not EXACTFAA node. Look for the multi-char - * folds that are all Latin1. As explained in the comments - * preceding this function, we look also for the sharp s in EXACTF - * and EXACTFL nodes; it can be in the final position. Otherwise - * we can stop looking 1 byte earlier because have to find at least - * two characters for a multi-fold */ - const U8* upper = (OP(scan) == EXACTF || OP(scan) == EXACTFL) - ? s_end - : s_end -1; - - while (s < upper) { - int len = is_MULTI_CHAR_FOLD_latin1_safe(s, s_end); - if (! len) { /* Not a multi-char fold. */ - if (*s == LATIN_SMALL_LETTER_SHARP_S - && (OP(scan) == EXACTF || OP(scan) == EXACTFL)) - { - *unfolded_multi_char = TRUE; - } - s++; - continue; - } - - if (len == 2 - && isALPHA_FOLD_EQ(*s, 's') - && isALPHA_FOLD_EQ(*(s+1), 's')) - { - - /* EXACTF nodes need to know that the minimum length - * changed so that a sharp s in the string can match this - * ss in the pattern, but they remain EXACTF nodes, as they - * won't match this unless the target string is in UTF-8, - * which we don't know until runtime. EXACTFL nodes can't - * transform into EXACTFU nodes */ - if (OP(scan) != EXACTF && OP(scan) != EXACTFL) { - OP(scan) = EXACTFUP; - } - } - - *min_subtract += len - 1; - s += len; - } -#endif - } + return FALSE; } -#ifdef DEBUGGING - /* Allow dumping but overwriting the collection of skipped - * ops and/or strings with fake optimized ops */ - n = scan + NODE_SZ_STR(scan); - while (n <= stop) { - OP(n) = OPTIMIZED; - FLAGS(n) = 0; - NEXT_OFF(n) = 0; - n++; + /* copy the information about the longest from the reg_scan_data + over to the program. */ + if (SvUTF8(sub->str)) { + rsd->substr = NULL; + rsd->utf8_substr = sub->str; + } else { + rsd->substr = sub->str; + rsd->utf8_substr = NULL; } -#endif - DEBUG_OPTIMISE_r(if (merged){DEBUG_PEEP("finl", scan, depth, 0);}); - return stopnow; -} - -/* REx optimizer. Converts nodes into quicker variants "in place". - Finds fixed substrings. */ - -/* Stops at toplevel WHILEM as well as at "last". At end *scanp is set - to the position after last scanned or to NULL. */ - -#define INIT_AND_WITHP \ - assert(!and_withp); \ - Newx(and_withp, 1, regnode_ssc); \ - SAVEFREEPV(and_withp) + /* end_shift is how many chars that must be matched that + follow this item. We calculate it ahead of time as once the + lookbehind offset is added in we lose the ability to correctly + calculate it.*/ + ml = sub->minlenp ? *(sub->minlenp) : (SSize_t)longest_length; + rsd->end_shift = ml - sub->min_offset + - longest_length + /* XXX SvTAIL is always false here - did you mean FBMcf_TAIL + * intead? - DAPM + + (SvTAIL(sub->str) != 0) + */ + + sub->lookbehind; + t = (eol/* Can't have SEOL and MULTI */ + && (! meol || (RExC_flags & RXf_PMf_MULTILINE))); + fbm_compile(sub->str, t ? FBMcf_TAIL : 0); -static void -S_unwind_scan_frames(pTHX_ const void *p) -{ - scan_frame *f= (scan_frame *)p; - do { - scan_frame *n= f->next_frame; - Safefree(f); - f= n; - } while (f); + return TRUE; } -/* Follow the next-chain of the current node and optimize away - all the NOTHINGs from it. - */ STATIC void -S_rck_elide_nothing(pTHX_ regnode *node) +S_set_regex_pv(pTHX_ RExC_state_t *pRExC_state, REGEXP *Rx) { - PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING; + /* Calculates and sets in the compiled pattern 'Rx' the string to compile, + * properly wrapped with the right modifiers */ - if (OP(node) != CURLYX) { - const int max = (reg_off_by_arg[OP(node)] - ? I32_MAX - /* I32 may be smaller than U16 on CRAYs! */ - : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX)); - int off = (reg_off_by_arg[OP(node)] ? ARG(node) : NEXT_OFF(node)); - int noff; - regnode *n = node; - - /* Skip NOTHING and LONGJMP. */ - while ( - (n = regnext(n)) - && ( - (PL_regkind[OP(n)] == NOTHING && (noff = NEXT_OFF(n))) - || ((OP(n) == LONGJMP) && (noff = ARG(n))) - ) - && off + noff < max - ) { - off += noff; - } - if (reg_off_by_arg[OP(node)]) - ARG(node) = off; - else - NEXT_OFF(node) = off; - } - return; -} + bool has_p = ((RExC_rx->extflags & RXf_PMf_KEEPCOPY) == RXf_PMf_KEEPCOPY); + bool has_charset = RExC_utf8 || (get_regex_charset(RExC_rx->extflags) + != REGEX_DEPENDS_CHARSET); -/* the return from this sub is the minimum length that could possibly match */ -STATIC SSize_t -S_study_chunk(pTHX_ - RExC_state_t *pRExC_state, - regnode **scanp, /* Start here (read-write). */ - SSize_t *minlenp, /* used for the minlen of substrings? */ - SSize_t *deltap, /* Write maxlen-minlen here. */ - regnode *last, /* Stop before this one. */ - scan_data_t *data, /* string data about the pattern */ - I32 stopparen, /* treat CLOSE-N as END, see GOSUB */ - U32 recursed_depth, /* how deep have we recursed via GOSUB */ - regnode_ssc *and_withp, /* Valid if flags & SCF_DO_STCLASS_OR */ - U32 flags, /* flags controlling this call, see SCF_ flags */ - U32 depth, /* how deep have we recursed period */ - bool was_mutate_ok /* TRUE if in-place optimizations are allowed. - FALSE only if the caller (recursively) was - prohibited from modifying the regops, because - a higher caller is holding a ptr to them. */ -) -{ - /* vars about the regnodes we are working with */ - regnode *scan = *scanp; /* the current opcode we are inspecting */ - regnode *next = NULL; /* the next opcode beyond scan, tmp var */ - regnode *first_non_open = scan; /* FIXME: should this init to NULL? - the first non open regop, if the init - val IS an OPEN then we will skip past - it just after the var decls section */ - I32 code = 0; /* temp var used to hold the optype of a regop */ - - /* vars about the min and max length of the pattern */ - SSize_t min = 0; /* min length of this part of the pattern */ - SSize_t stopmin = OPTIMIZE_INFTY; /* min length accounting for ACCEPT - this is adjusted down if we find - an ACCEPT */ - SSize_t delta = 0; /* difference between min and max length - (not accounting for stopmin) */ - - /* vars about capture buffers in the pattern */ - I32 pars = 0; /* count of OPEN opcodes */ - I32 is_par = OP(scan) == OPEN ? ARG(scan) : 0; /* is this op an OPEN? */ - - /* vars about whether this pattern contains something that can match - * infinitely long strings, eg, X* or X+ */ - int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF); - int is_inf_internal = 0; /* The studied chunk is infinite */ - - /* scan_data_t (struct) is used to hold information about the substrings - * and start class we have extracted from the string */ - scan_data_t data_fake; /* temp var used for recursing in some cases */ + /* The caret is output if there are any defaults: if not all the STD + * flags are set, or if no character set specifier is needed */ + bool has_default = + (((RExC_rx->extflags & RXf_PMf_STD_PMMOD) != RXf_PMf_STD_PMMOD) + || ! has_charset); + bool has_runon = ((RExC_seen & REG_RUN_ON_COMMENT_SEEN) + == REG_RUN_ON_COMMENT_SEEN); + U8 reganch = (U8)((RExC_rx->extflags & RXf_PMf_STD_PMMOD) + >> RXf_PMf_STD_PMMOD_SHIFT); + const char *fptr = STD_PAT_MODS; /*"msixxn"*/ + char *p; + STRLEN pat_len = RExC_precomp_end - RExC_precomp; - SV *re_trie_maxbuff = NULL; /* temp var used to hold whether we can do - trie optimizations */ + /* We output all the necessary flags; we never output a minus, as all + * those are defaults, so are + * covered by the caret */ + const STRLEN wraplen = pat_len + has_p + has_runon + + has_default /* If needs a caret */ + + PL_bitcount[reganch] /* 1 char for each set standard flag */ - scan_frame *frame = NULL; /* used as part of fake recursion */ + /* If needs a character set specifier */ + + ((has_charset) ? MAX_CHARSET_NAME_LENGTH : 0) + + (sizeof("(?:)") - 1); - DECLARE_AND_GET_RE_DEBUG_FLAGS; + PERL_ARGS_ASSERT_SET_REGEX_PV; - PERL_ARGS_ASSERT_STUDY_CHUNK; - RExC_study_started= 1; + /* make sure PL_bitcount bounds not exceeded */ + STATIC_ASSERT_STMT(sizeof(STD_PAT_MODS) <= 8); - Zero(&data_fake, 1, scan_data_t); + p = sv_grow(MUTABLE_SV(Rx), wraplen + 1); /* +1 for the ending NUL */ + SvPOK_on(Rx); + if (RExC_utf8) + SvFLAGS(Rx) |= SVf_UTF8; + *p++='('; *p++='?'; - if ( depth == 0 ) { - while (first_non_open && OP(first_non_open) == OPEN) - first_non_open=regnext(first_non_open); + /* If a default, cover it using the caret */ + if (has_default) { + *p++= DEFAULT_PAT_MOD; } + if (has_charset) { + STRLEN len; + const char* name; - fake_study_recurse: - DEBUG_r( - RExC_study_chunk_recursed_count++; - ); - DEBUG_OPTIMISE_MORE_r( - { - Perl_re_indentf( aTHX_ "study_chunk stopparen=%ld recursed_count=%lu depth=%lu recursed_depth=%lu scan=%p last=%p", - depth, (long)stopparen, - (unsigned long)RExC_study_chunk_recursed_count, - (unsigned long)depth, (unsigned long)recursed_depth, - scan, - last); - if (recursed_depth) { - U32 i; - U32 j; - for ( j = 0 ; j < recursed_depth ; j++ ) { - for ( i = 0 ; i < (U32)RExC_total_parens ; i++ ) { - if (PAREN_TEST(j, i) && (!j || !PAREN_TEST(j - 1, i))) { - Perl_re_printf( aTHX_ " %d",(int)i); - break; - } - } - if ( j + 1 < recursed_depth ) { - Perl_re_printf( aTHX_ ","); - } - } + name = get_regex_charset_name(RExC_rx->extflags, &len); + if (strEQ(name, DEPENDS_PAT_MODS)) { /* /d under UTF-8 => /u */ + assert(RExC_utf8); + name = UNICODE_PAT_MODS; + len = sizeof(UNICODE_PAT_MODS) - 1; } - Perl_re_printf( aTHX_ "\n"); + Copy(name, p, len, char); + p += len; } - ); - while ( scan && OP(scan) != END && scan < last ){ - UV min_subtract = 0; /* How mmany chars to subtract from the minimum - node length to get a real minimum (because - the folded version may be shorter) */ - bool unfolded_multi_char = FALSE; - /* avoid mutating ops if we are anywhere within the recursed or - * enframed handling for a GOSUB: the outermost level will handle it. - */ - bool mutate_ok = was_mutate_ok && !(frame && frame->in_gosub); - /* Peephole optimizer: */ - DEBUG_STUDYDATA("Peep", data, depth, is_inf, min, stopmin, delta); - DEBUG_PEEP("Peep", scan, depth, flags); - - - /* The reason we do this here is that we need to deal with things like - * /(?:f)(?:o)(?:o)/ which cant be dealt with by the normal EXACT - * parsing code, as each (?:..) is handled by a different invocation of - * reg() -- Yves - */ - if (PL_regkind[OP(scan)] == EXACT - && OP(scan) != LEXACT - && OP(scan) != LEXACT_REQ8 - && mutate_ok - ) { - join_exact(pRExC_state, scan, &min_subtract, &unfolded_multi_char, - 0, NULL, depth + 1); + if (has_p) + *p++ = KEEPCOPY_PAT_MOD; /*'p'*/ + { + char ch; + while((ch = *fptr++)) { + if(reganch & 1) + *p++ = ch; + reganch >>= 1; } + } - /* Follow the next-chain of the current node and optimize - away all the NOTHINGs from it. - */ - rck_elide_nothing(scan); + *p++ = ':'; + Copy(RExC_precomp, p, pat_len, char); + assert ((RX_WRAPPED(Rx) - p) < 16); + RExC_rx->pre_prefix = p - RX_WRAPPED(Rx); + p += pat_len; - /* The principal pseudo-switch. Cannot be a switch, since we look into - * several different things. */ - if ( OP(scan) == DEFINEP ) { - SSize_t minlen = 0; - SSize_t deltanext = 0; - SSize_t fake_last_close = 0; - regnode *fake_last_close_op = NULL; - U32 f = SCF_IN_DEFINE | (flags & SCF_TRIE_DOING_RESTUDY); - - StructCopy(&zero_scan_data, &data_fake, scan_data_t); - scan = regnext(scan); - assert( OP(scan) == IFTHEN ); - DEBUG_PEEP("expect IFTHEN", scan, depth, flags); - - data_fake.last_closep= &fake_last_close; - data_fake.last_close_opp= &fake_last_close_op; - minlen = *minlenp; - next = regnext(scan); - scan = NEXTOPER(NEXTOPER(scan)); - DEBUG_PEEP("scan", scan, depth, flags); - DEBUG_PEEP("next", next, depth, flags); - - /* we suppose the run is continuous, last=next... - * NOTE we dont use the return here! */ - /* DEFINEP study_chunk() recursion */ - (void)study_chunk(pRExC_state, &scan, &minlen, - &deltanext, next, &data_fake, stopparen, - recursed_depth, NULL, f, depth+1, mutate_ok); - - scan = next; - } else - if ( - OP(scan) == BRANCH || - OP(scan) == BRANCHJ || - OP(scan) == IFTHEN - ) { - next = regnext(scan); - code = OP(scan); - - /* The op(next)==code check below is to see if we - * have "BRANCH-BRANCH", "BRANCHJ-BRANCHJ", "IFTHEN-IFTHEN" - * IFTHEN is special as it might not appear in pairs. - * Not sure whether BRANCH-BRANCHJ is possible, regardless - * we dont handle it cleanly. */ - if (OP(next) == code || code == IFTHEN) { - /* NOTE - There is similar code to this block below for - * handling TRIE nodes on a re-study. If you change stuff here - * check there too. */ - SSize_t max1 = 0, min1 = OPTIMIZE_INFTY, num = 0; - regnode_ssc accum; - regnode * const startbranch=scan; - - if (flags & SCF_DO_SUBSTR) { - /* Cannot merge strings after this. */ - scan_commit(pRExC_state, data, minlenp, is_inf); - } - - if (flags & SCF_DO_STCLASS) - ssc_init_zero(pRExC_state, &accum); - - while (OP(scan) == code) { - SSize_t deltanext, minnext, fake_last_close = 0; - regnode *fake_last_close_op = NULL; - U32 f = (flags & SCF_TRIE_DOING_RESTUDY); - regnode_ssc this_class; - - DEBUG_PEEP("Branch", scan, depth, flags); - - num++; - StructCopy(&zero_scan_data, &data_fake, scan_data_t); - if (data) { - data_fake.whilem_c = data->whilem_c; - data_fake.last_closep = data->last_closep; - data_fake.last_close_opp = data->last_close_opp; - } - else { - data_fake.last_closep = &fake_last_close; - data_fake.last_close_opp = &fake_last_close_op; - } - - data_fake.pos_delta = delta; - next = regnext(scan); - - scan = NEXTOPER(scan); /* everything */ - if (code != BRANCH) /* everything but BRANCH */ - scan = NEXTOPER(scan); - - if (flags & SCF_DO_STCLASS) { - ssc_init(pRExC_state, &this_class); - data_fake.start_class = &this_class; - f |= SCF_DO_STCLASS_AND; - } - if (flags & SCF_WHILEM_VISITED_POS) - f |= SCF_WHILEM_VISITED_POS; - - /* we suppose the run is continuous, last=next...*/ - /* recurse study_chunk() for each BRANCH in an alternation */ - minnext = study_chunk(pRExC_state, &scan, minlenp, - &deltanext, next, &data_fake, stopparen, - recursed_depth, NULL, f, depth+1, - mutate_ok); - - if (min1 > minnext) - min1 = minnext; - if (deltanext == OPTIMIZE_INFTY) { - is_inf = is_inf_internal = 1; - max1 = OPTIMIZE_INFTY; - } else if (max1 < minnext + deltanext) - max1 = minnext + deltanext; - scan = next; - if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR)) - pars++; - if (data_fake.flags & SCF_SEEN_ACCEPT) { - if ( stopmin > minnext) - stopmin = min + min1; - flags &= ~SCF_DO_SUBSTR; - if (data) - data->flags |= SCF_SEEN_ACCEPT; - } - if (data) { - if (data_fake.flags & SF_HAS_EVAL) - data->flags |= SF_HAS_EVAL; - data->whilem_c = data_fake.whilem_c; - } - if (flags & SCF_DO_STCLASS) - ssc_or(pRExC_state, &accum, (regnode_charclass*)&this_class); - DEBUG_STUDYDATA("end BRANCH", data, depth, is_inf, min, stopmin, delta); - } - if (code == IFTHEN && num < 2) /* Empty ELSE branch */ - min1 = 0; - if (flags & SCF_DO_SUBSTR) { - data->pos_min += min1; - if (data->pos_delta >= OPTIMIZE_INFTY - (max1 - min1)) - data->pos_delta = OPTIMIZE_INFTY; - else - data->pos_delta += max1 - min1; - if (max1 != min1 || is_inf) - data->cur_is_floating = 1; - } - min += min1; - if (delta == OPTIMIZE_INFTY - || OPTIMIZE_INFTY - delta - (max1 - min1) < 0) - delta = OPTIMIZE_INFTY; - else - delta += max1 - min1; - if (flags & SCF_DO_STCLASS_OR) { - ssc_or(pRExC_state, data->start_class, (regnode_charclass*) &accum); - if (min1) { - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); - flags &= ~SCF_DO_STCLASS; - } - } - else if (flags & SCF_DO_STCLASS_AND) { - if (min1) { - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &accum); - flags &= ~SCF_DO_STCLASS; - } - else { - /* Switch to OR mode: cache the old value of - * data->start_class */ - INIT_AND_WITHP; - StructCopy(data->start_class, and_withp, regnode_ssc); - flags &= ~SCF_DO_STCLASS_AND; - StructCopy(&accum, data->start_class, regnode_ssc); - flags |= SCF_DO_STCLASS_OR; - } - } - DEBUG_STUDYDATA("pre TRIE", data, depth, is_inf, min, stopmin, delta); - - if (PERL_ENABLE_TRIE_OPTIMISATION - && OP(startbranch) == BRANCH - && mutate_ok - ) { - /* demq. - - Assuming this was/is a branch we are dealing with: 'scan' - now points at the item that follows the branch sequence, - whatever it is. We now start at the beginning of the - sequence and look for subsequences of - - BRANCH->EXACT=>x1 - BRANCH->EXACT=>x2 - tail - - which would be constructed from a pattern like - /A|LIST|OF|WORDS/ - - If we can find such a subsequence we need to turn the first - element into a trie and then add the subsequent branch exact - strings to the trie. - - We have two cases - - 1. patterns where the whole set of branches can be - converted. - - 2. patterns where only a subset can be converted. - - In case 1 we can replace the whole set with a single regop - for the trie. In case 2 we need to keep the start and end - branches so - - 'BRANCH EXACT; BRANCH EXACT; BRANCH X' - becomes BRANCH TRIE; BRANCH X; - - There is an additional case, that being where there is a - common prefix, which gets split out into an EXACT like node - preceding the TRIE node. - - If x(1..n)==tail then we can do a simple trie, if not we make - a "jump" trie, such that when we match the appropriate word - we "jump" to the appropriate tail node. Essentially we turn - a nested if into a case structure of sorts. - - */ - - int made=0; - if (!re_trie_maxbuff) { - re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1); - if (!SvIOK(re_trie_maxbuff)) - sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT); - } - if ( SvIV(re_trie_maxbuff)>=0 ) { - regnode *cur; - regnode *first = (regnode *)NULL; - regnode *prev = (regnode *)NULL; - regnode *tail = scan; - U8 trietype = 0; - U32 count=0; - - /* var tail is used because there may be a TAIL - regop in the way. Ie, the exacts will point to the - thing following the TAIL, but the last branch will - point at the TAIL. So we advance tail. If we - have nested (?:) we may have to move through several - tails. - */ - - while ( OP( tail ) == TAIL ) { - /* this is the TAIL generated by (?:) */ - tail = regnext( tail ); - } - - - DEBUG_TRIE_COMPILE_r({ - regprop(RExC_rx, RExC_mysv, tail, NULL, pRExC_state); - Perl_re_indentf( aTHX_ "%s %" UVuf ":%s\n", - depth+1, - "Looking for TRIE'able sequences. Tail node is ", - (UV) REGNODE_OFFSET(tail), - SvPV_nolen_const( RExC_mysv ) - ); - }); - - /* - - Step through the branches - cur represents each branch, - noper is the first thing to be matched as part - of that branch - noper_next is the regnext() of that node. - - We normally handle a case like this - /FOO[xyz]|BAR[pqr]/ via a "jump trie" but we also - support building with NOJUMPTRIE, which restricts - the trie logic to structures like /FOO|BAR/. - - If noper is a trieable nodetype then the branch is - a possible optimization target. If we are building - under NOJUMPTRIE then we require that noper_next is - the same as scan (our current position in the regex - program). - - Once we have two or more consecutive such branches - we can create a trie of the EXACT's contents and - stitch it in place into the program. - - If the sequence represents all of the branches in - the alternation we replace the entire thing with a - single TRIE node. - - Otherwise when it is a subsequence we need to - stitch it in place and replace only the relevant - branches. This means the first branch has to remain - as it is used by the alternation logic, and its - next pointer, and needs to be repointed at the item - on the branch chain following the last branch we - have optimized away. - - This could be either a BRANCH, in which case the - subsequence is internal, or it could be the item - following the branch sequence in which case the - subsequence is at the end (which does not - necessarily mean the first node is the start of the - alternation). - - TRIE_TYPE(X) is a define which maps the optype to a - trietype. - - optype | trietype - ----------------+----------- - NOTHING | NOTHING - EXACT | EXACT - EXACT_REQ8 | EXACT - EXACTFU | EXACTFU - EXACTFU_REQ8 | EXACTFU - EXACTFUP | EXACTFU - EXACTFAA | EXACTFAA - EXACTL | EXACTL - EXACTFLU8 | EXACTFLU8 - - - */ -#define TRIE_TYPE(X) ( ( NOTHING == (X) ) \ - ? NOTHING \ - : ( EXACT == (X) || EXACT_REQ8 == (X) ) \ - ? EXACT \ - : ( EXACTFU == (X) \ - || EXACTFU_REQ8 == (X) \ - || EXACTFUP == (X) ) \ - ? EXACTFU \ - : ( EXACTFAA == (X) ) \ - ? EXACTFAA \ - : ( EXACTL == (X) ) \ - ? EXACTL \ - : ( EXACTFLU8 == (X) ) \ - ? EXACTFLU8 \ - : 0 ) - - /* dont use tail as the end marker for this traverse */ - for ( cur = startbranch ; cur != scan ; cur = regnext( cur ) ) { - regnode * const noper = NEXTOPER( cur ); - U8 noper_type = OP( noper ); - U8 noper_trietype = TRIE_TYPE( noper_type ); -#if defined(DEBUGGING) || defined(NOJUMPTRIE) - regnode * const noper_next = regnext( noper ); - U8 noper_next_type = (noper_next && noper_next < tail) ? OP(noper_next) : 0; - U8 noper_next_trietype = (noper_next && noper_next < tail) ? TRIE_TYPE( noper_next_type ) :0; -#endif - - DEBUG_TRIE_COMPILE_r({ - regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state); - Perl_re_indentf( aTHX_ "- %d:%s (%d)", - depth+1, - REG_NODE_NUM(cur), SvPV_nolen_const( RExC_mysv ), REG_NODE_NUM(cur) ); - - regprop(RExC_rx, RExC_mysv, noper, NULL, pRExC_state); - Perl_re_printf( aTHX_ " -> %d:%s", - REG_NODE_NUM(noper), SvPV_nolen_const(RExC_mysv)); - - if ( noper_next ) { - regprop(RExC_rx, RExC_mysv, noper_next, NULL, pRExC_state); - Perl_re_printf( aTHX_ "\t=> %d:%s\t", - REG_NODE_NUM(noper_next), SvPV_nolen_const(RExC_mysv)); - } - Perl_re_printf( aTHX_ "(First==%d,Last==%d,Cur==%d,tt==%s,ntt==%s,nntt==%s)\n", - REG_NODE_NUM(first), REG_NODE_NUM(prev), REG_NODE_NUM(cur), - PL_reg_name[trietype], PL_reg_name[noper_trietype], PL_reg_name[noper_next_trietype] - ); - }); - - /* Is noper a trieable nodetype that can be merged - * with the current trie (if there is one)? */ - if ( noper_trietype - && - ( - ( noper_trietype == NOTHING ) - || ( trietype == NOTHING ) - || ( trietype == noper_trietype ) - ) -#ifdef NOJUMPTRIE - && noper_next >= tail -#endif - && count < U16_MAX) - { - /* Handle mergable triable node Either we are - * the first node in a new trieable sequence, - * in which case we do some bookkeeping, - * otherwise we update the end pointer. */ - if ( !first ) { - first = cur; - if ( noper_trietype == NOTHING ) { -#if !defined(DEBUGGING) && !defined(NOJUMPTRIE) - regnode * const noper_next = regnext( noper ); - U8 noper_next_type = (noper_next && noper_next < tail) ? OP(noper_next) : 0; - U8 noper_next_trietype = noper_next_type ? TRIE_TYPE( noper_next_type ) :0; -#endif - - if ( noper_next_trietype ) { - trietype = noper_next_trietype; - } else if (noper_next_type) { - /* a NOTHING regop is 1 regop wide. - * We need at least two for a trie - * so we can't merge this in */ - first = NULL; - } - } else { - trietype = noper_trietype; - } - } else { - if ( trietype == NOTHING ) - trietype = noper_trietype; - prev = cur; - } - if (first) - count++; - } /* end handle mergable triable node */ - else { - /* handle unmergable node - - * noper may either be a triable node which can - * not be tried together with the current trie, - * or a non triable node */ - if ( prev ) { - /* If last is set and trietype is not - * NOTHING then we have found at least two - * triable branch sequences in a row of a - * similar trietype so we can turn them - * into a trie. If/when we allow NOTHING to - * start a trie sequence this condition - * will be required, and it isn't expensive - * so we leave it in for now. */ - if ( trietype && trietype != NOTHING ) - make_trie( pRExC_state, - startbranch, first, cur, tail, - count, trietype, depth+1 ); - prev = NULL; /* note: we clear/update - first, trietype etc below, - so we dont do it here */ - } - if ( noper_trietype -#ifdef NOJUMPTRIE - && noper_next >= tail -#endif - ){ - /* noper is triable, so we can start a new - * trie sequence */ - count = 1; - first = cur; - trietype = noper_trietype; - } else if (first) { - /* if we already saw a first but the - * current node is not triable then we have - * to reset the first information. */ - count = 0; - first = NULL; - trietype = 0; - } - } /* end handle unmergable node */ - } /* loop over branches */ - DEBUG_TRIE_COMPILE_r({ - regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state); - Perl_re_indentf( aTHX_ "- %s (%d) ", - depth+1, SvPV_nolen_const( RExC_mysv ), REG_NODE_NUM(cur)); - Perl_re_printf( aTHX_ "(First==%d, Last==%d, Cur==%d, tt==%s)\n", - REG_NODE_NUM(first), REG_NODE_NUM(prev), REG_NODE_NUM(cur), - PL_reg_name[trietype] - ); - - }); - if ( prev && trietype ) { - if ( trietype != NOTHING ) { - /* the last branch of the sequence was part of - * a trie, so we have to construct it here - * outside of the loop */ - made= make_trie( pRExC_state, startbranch, - first, scan, tail, count, - trietype, depth+1 ); -#ifdef TRIE_STUDY_OPT - if ( ((made == MADE_EXACT_TRIE && - startbranch == first) - || ( first_non_open == first )) && - depth==0 ) { - flags |= SCF_TRIE_RESTUDY; - if ( startbranch == first - && scan >= tail ) - { - RExC_seen &=~REG_TOP_LEVEL_BRANCHES_SEEN; - } - } -#endif - } else { - /* at this point we know whatever we have is a - * NOTHING sequence/branch AND if 'startbranch' - * is 'first' then we can turn the whole thing - * into a NOTHING - */ - if ( startbranch == first ) { - regnode *opt; - /* the entire thing is a NOTHING sequence, - * something like this: (?:|) So we can - * turn it into a plain NOTHING op. */ - DEBUG_TRIE_COMPILE_r({ - regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state); - Perl_re_indentf( aTHX_ "- %s (%d) \n", - depth+1, - SvPV_nolen_const( RExC_mysv ), REG_NODE_NUM(cur)); - - }); - OP(startbranch)= NOTHING; - NEXT_OFF(startbranch)= tail - startbranch; - for ( opt= startbranch + 1; opt < tail ; opt++ ) - OP(opt)= OPTIMIZED; - } - } - } /* end if ( prev) */ - } /* TRIE_MAXBUF is non zero */ - } /* do trie */ - DEBUG_STUDYDATA("after TRIE", data, depth, is_inf, min, stopmin, delta); - } - else if ( code == BRANCHJ ) { /* single branch is optimized. */ - scan = NEXTOPER(NEXTOPER(scan)); - } else /* single branch is optimized. */ - scan = NEXTOPER(scan); - continue; - } else if (OP(scan) == SUSPEND || OP(scan) == GOSUB) { - I32 paren = 0; - regnode *start = NULL; - regnode *end = NULL; - U32 my_recursed_depth= recursed_depth; - - if (OP(scan) != SUSPEND) { /* GOSUB */ - /* Do setup, note this code has side effects beyond - * the rest of this block. Specifically setting - * RExC_recurse[] must happen at least once during - * study_chunk(). */ - paren = ARG(scan); - RExC_recurse[ARG2L(scan)] = scan; - start = REGNODE_p(RExC_open_parens[paren]); - end = REGNODE_p(RExC_close_parens[paren]); - - /* NOTE we MUST always execute the above code, even - * if we do nothing with a GOSUB */ - if ( - ( flags & SCF_IN_DEFINE ) - || - ( - (is_inf_internal || is_inf || (data && data->flags & SF_IS_INF)) - && - ( (flags & (SCF_DO_STCLASS | SCF_DO_SUBSTR)) == 0 ) - ) - ) { - /* no need to do anything here if we are in a define. */ - /* or we are after some kind of infinite construct - * so we can skip recursing into this item. - * Since it is infinite we will not change the maxlen - * or delta, and if we miss something that might raise - * the minlen it will merely pessimise a little. - * - * Iow /(?(DEFINE)(?foo|food))a+(?&foo)/ - * might result in a minlen of 1 and not of 4, - * but this doesn't make us mismatch, just try a bit - * harder than we should. - * - * However we must assume this GOSUB is infinite, to - * avoid wrongly applying other optimizations in the - * enclosing scope - see GH 18096, for example. - */ - is_inf = is_inf_internal = 1; - scan= regnext(scan); - continue; - } - - if ( - !recursed_depth - || !PAREN_TEST(recursed_depth - 1, paren) - ) { - /* it is quite possible that there are more efficient ways - * to do this. We maintain a bitmap per level of recursion - * of which patterns we have entered so we can detect if a - * pattern creates a possible infinite loop. When we - * recurse down a level we copy the previous levels bitmap - * down. When we are at recursion level 0 we zero the top - * level bitmap. It would be nice to implement a different - * more efficient way of doing this. In particular the top - * level bitmap may be unnecessary. - */ - if (!recursed_depth) { - Zero(RExC_study_chunk_recursed, RExC_study_chunk_recursed_bytes, U8); - } else { - Copy(PAREN_OFFSET(recursed_depth - 1), - PAREN_OFFSET(recursed_depth), - RExC_study_chunk_recursed_bytes, U8); - } - /* we havent recursed into this paren yet, so recurse into it */ - DEBUG_STUDYDATA("gosub-set", data, depth, is_inf, min, stopmin, delta); - PAREN_SET(recursed_depth, paren); - my_recursed_depth= recursed_depth + 1; - } else { - DEBUG_STUDYDATA("gosub-inf", data, depth, is_inf, min, stopmin, delta); - /* some form of infinite recursion, assume infinite length - * */ - if (flags & SCF_DO_SUBSTR) { - scan_commit(pRExC_state, data, minlenp, is_inf); - data->cur_is_floating = 1; - } - is_inf = is_inf_internal = 1; - if (flags & SCF_DO_STCLASS_OR) /* Allow everything */ - ssc_anything(data->start_class); - flags &= ~SCF_DO_STCLASS; - - start= NULL; /* reset start so we dont recurse later on. */ - } - } else { - paren = stopparen; - start = scan + 2; - end = regnext(scan); - } - if (start) { - scan_frame *newframe; - assert(end); - if (!RExC_frame_last) { - Newxz(newframe, 1, scan_frame); - SAVEDESTRUCTOR_X(S_unwind_scan_frames, newframe); - RExC_frame_head= newframe; - RExC_frame_count++; - } else if (!RExC_frame_last->next_frame) { - Newxz(newframe, 1, scan_frame); - RExC_frame_last->next_frame= newframe; - newframe->prev_frame= RExC_frame_last; - RExC_frame_count++; - } else { - newframe= RExC_frame_last->next_frame; - } - RExC_frame_last= newframe; - - newframe->next_regnode = regnext(scan); - newframe->last_regnode = last; - newframe->stopparen = stopparen; - newframe->prev_recursed_depth = recursed_depth; - newframe->this_prev_frame= frame; - newframe->in_gosub = ( - (frame && frame->in_gosub) || OP(scan) == GOSUB - ); - - DEBUG_STUDYDATA("frame-new", data, depth, is_inf, min, stopmin, delta); - DEBUG_PEEP("fnew", scan, depth, flags); - - frame = newframe; - scan = start; - stopparen = paren; - last = end; - depth = depth + 1; - recursed_depth= my_recursed_depth; - - continue; - } - } - else if (PL_regkind[OP(scan)] == EXACT && ! isEXACTFish(OP(scan))) { - SSize_t bytelen = STR_LEN(scan), charlen; - UV uc; - assert(bytelen); - if (UTF) { - const U8 * const s = (U8*)STRING(scan); - uc = utf8_to_uvchr_buf(s, s + bytelen, NULL); - charlen = utf8_length(s, s + bytelen); - } else { - uc = *((U8*)STRING(scan)); - charlen = bytelen; - } - min += charlen; - if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */ - /* The code below prefers earlier match for fixed - offset, later match for variable offset. */ - if (data->last_end == -1) { /* Update the start info. */ - data->last_start_min = data->pos_min; - data->last_start_max = - is_inf ? OPTIMIZE_INFTY - : (data->pos_delta > OPTIMIZE_INFTY - data->pos_min) - ? OPTIMIZE_INFTY : data->pos_min + data->pos_delta; - } - sv_catpvn(data->last_found, STRING(scan), bytelen); - if (UTF) - SvUTF8_on(data->last_found); - { - SV * const sv = data->last_found; - MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? - mg_find(sv, PERL_MAGIC_utf8) : NULL; - if (mg && mg->mg_len >= 0) - mg->mg_len += charlen; - } - data->last_end = data->pos_min + charlen; - data->pos_min += charlen; /* As in the first entry. */ - data->flags &= ~SF_BEFORE_EOL; - } - - /* ANDing the code point leaves at most it, and not in locale, and - * can't match null string */ - if (flags & SCF_DO_STCLASS_AND) { - ssc_cp_and(data->start_class, uc); - ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING; - ssc_clear_locale(data->start_class); - } - else if (flags & SCF_DO_STCLASS_OR) { - ssc_add_cp(data->start_class, uc); - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); - - /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */ - ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING; - } - flags &= ~SCF_DO_STCLASS; - DEBUG_STUDYDATA("end EXACT", data, depth, is_inf, min, stopmin, delta); - } - else if (PL_regkind[OP(scan)] == EXACT) { - /* But OP != EXACT!, so is EXACTFish */ - SSize_t bytelen = STR_LEN(scan), charlen; - const U8 * s = (U8*)STRING(scan); - - /* Replace a length 1 ASCII fold pair node with an ANYOFM node, - * with the mask set to the complement of the bit that differs - * between upper and lower case, and the lowest code point of the - * pair (which the '&' forces) */ - if ( bytelen == 1 - && isALPHA_A(*s) - && ( OP(scan) == EXACTFAA - || ( OP(scan) == EXACTFU - && ! HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(*s))) - && mutate_ok - ) { - U8 mask = ~ ('A' ^ 'a'); /* These differ in just one bit */ - - OP(scan) = ANYOFM; - ARG_SET(scan, *s & mask); - FLAGS(scan) = mask; - /* We're not EXACTFish any more, so restudy. - * Search for "restudy" in this file to find - * a comment with details. */ - continue; - } - - /* Search for fixed substrings supports EXACT only. */ - if (flags & SCF_DO_SUBSTR) { - assert(data); - scan_commit(pRExC_state, data, minlenp, is_inf); - } - charlen = UTF ? (SSize_t) utf8_length(s, s + bytelen) : bytelen; - if (unfolded_multi_char) { - RExC_seen |= REG_UNFOLDED_MULTI_SEEN; - } - min += charlen - min_subtract; - assert (min >= 0); - if ((SSize_t)min_subtract < OPTIMIZE_INFTY - && delta < OPTIMIZE_INFTY - (SSize_t)min_subtract - ) { - delta += min_subtract; - } else { - delta = OPTIMIZE_INFTY; - } - if (flags & SCF_DO_SUBSTR) { - data->pos_min += charlen - min_subtract; - if (data->pos_min < 0) { - data->pos_min = 0; - } - if ((SSize_t)min_subtract < OPTIMIZE_INFTY - && data->pos_delta < OPTIMIZE_INFTY - (SSize_t)min_subtract - ) { - data->pos_delta += min_subtract; - } else { - data->pos_delta = OPTIMIZE_INFTY; - } - if (min_subtract) { - data->cur_is_floating = 1; /* float */ - } - } - - if (flags & SCF_DO_STCLASS) { - SV* EXACTF_invlist = make_exactf_invlist(pRExC_state, scan); - - assert(EXACTF_invlist); - if (flags & SCF_DO_STCLASS_AND) { - if (OP(scan) != EXACTFL) - ssc_clear_locale(data->start_class); - ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING; - ANYOF_POSIXL_ZERO(data->start_class); - ssc_intersection(data->start_class, EXACTF_invlist, FALSE); - } - else { /* SCF_DO_STCLASS_OR */ - ssc_union(data->start_class, EXACTF_invlist, FALSE); - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); - - /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */ - ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING; - } - flags &= ~SCF_DO_STCLASS; - SvREFCNT_dec(EXACTF_invlist); - } - DEBUG_STUDYDATA("end EXACTish", data, depth, is_inf, min, stopmin, delta); - } - else if (REGNODE_VARIES(OP(scan))) { - SSize_t mincount, maxcount, minnext, deltanext, pos_before = 0; - I32 fl = 0; - U32 f = flags; - regnode * const oscan = scan; - regnode_ssc this_class; - regnode_ssc *oclass = NULL; - I32 next_is_eval = 0; - - switch (PL_regkind[OP(scan)]) { - case WHILEM: /* End of (?:...)* . */ - scan = NEXTOPER(scan); - goto finish; - case PLUS: - if (flags & (SCF_DO_SUBSTR | SCF_DO_STCLASS)) { - next = NEXTOPER(scan); - if ( ( PL_regkind[OP(next)] == EXACT - && ! isEXACTFish(OP(next))) - || (flags & SCF_DO_STCLASS)) - { - mincount = 1; - maxcount = REG_INFTY; - next = regnext(scan); - scan = NEXTOPER(scan); - goto do_curly; - } - } - if (flags & SCF_DO_SUBSTR) - data->pos_min++; - /* This will bypass the formal 'min += minnext * mincount' - * calculation in the do_curly path, so assumes min width - * of the PLUS payload is exactly one. */ - min++; - /* FALLTHROUGH */ - case STAR: - next = NEXTOPER(scan); - - /* This temporary node can now be turned into EXACTFU, and - * must, as regexec.c doesn't handle it */ - if (OP(next) == EXACTFU_S_EDGE && mutate_ok) { - OP(next) = EXACTFU; - } - - if ( STR_LEN(next) == 1 - && isALPHA_A(* STRING(next)) - && ( OP(next) == EXACTFAA - || ( OP(next) == EXACTFU - && ! HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(* STRING(next)))) - && mutate_ok - ) { - /* These differ in just one bit */ - U8 mask = ~ ('A' ^ 'a'); - - assert(isALPHA_A(* STRING(next))); - - /* Then replace it by an ANYOFM node, with - * the mask set to the complement of the - * bit that differs between upper and lower - * case, and the lowest code point of the - * pair (which the '&' forces) */ - OP(next) = ANYOFM; - ARG_SET(next, *STRING(next) & mask); - FLAGS(next) = mask; - } - - if (flags & SCF_DO_STCLASS) { - mincount = 0; - maxcount = REG_INFTY; - next = regnext(scan); - scan = NEXTOPER(scan); - goto do_curly; - } - if (flags & SCF_DO_SUBSTR) { - scan_commit(pRExC_state, data, minlenp, is_inf); - /* Cannot extend fixed substrings */ - data->cur_is_floating = 1; /* float */ - } - is_inf = is_inf_internal = 1; - scan = regnext(scan); - goto optimize_curly_tail; - case CURLY: - if (stopparen>0 && (OP(scan)==CURLYN || OP(scan)==CURLYM) - && (scan->flags == stopparen)) - { - mincount = 1; - maxcount = 1; - } else { - mincount = ARG1(scan); - maxcount = ARG2(scan); - } - next = regnext(scan); - if (OP(scan) == CURLYX) { - I32 lp = (data ? *(data->last_closep) : 0); - scan->flags = ((lp <= (I32)U8_MAX) ? (U8)lp : U8_MAX); - } - scan = NEXTOPER(scan) + EXTRA_STEP_2ARGS; - next_is_eval = (OP(scan) == EVAL); - do_curly: - if (flags & SCF_DO_SUBSTR) { - if (mincount == 0) - scan_commit(pRExC_state, data, minlenp, is_inf); - /* Cannot extend fixed substrings */ - pos_before = data->pos_min; - } - if (data) { - fl = data->flags; - data->flags &= ~(SF_HAS_PAR|SF_IN_PAR|SF_HAS_EVAL); - if (is_inf) - data->flags |= SF_IS_INF; - } - if (flags & SCF_DO_STCLASS) { - ssc_init(pRExC_state, &this_class); - oclass = data->start_class; - data->start_class = &this_class; - f |= SCF_DO_STCLASS_AND; - f &= ~SCF_DO_STCLASS_OR; - } - /* Exclude from super-linear cache processing any {n,m} - regops for which the combination of input pos and regex - pos is not enough information to determine if a match - will be possible. - - For example, in the regex /foo(bar\s*){4,8}baz/ with the - regex pos at the \s*, the prospects for a match depend not - only on the input position but also on how many (bar\s*) - repeats into the {4,8} we are. */ - if ((mincount > 1) || (maxcount > 1 && maxcount != REG_INFTY)) - f &= ~SCF_WHILEM_VISITED_POS; - - /* This will finish on WHILEM, setting scan, or on NULL: */ - /* recurse study_chunk() on loop bodies */ - minnext = study_chunk(pRExC_state, &scan, minlenp, &deltanext, - last, data, stopparen, recursed_depth, NULL, - (mincount == 0 - ? (f & ~SCF_DO_SUBSTR) - : f) - , depth+1, mutate_ok); - - if (data && data->flags & SCF_SEEN_ACCEPT) { - if (mincount > 1) - mincount = 1; - } - - if (flags & SCF_DO_STCLASS) - data->start_class = oclass; - if (mincount == 0 || minnext == 0) { - if (flags & SCF_DO_STCLASS_OR) { - ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &this_class); - } - else if (flags & SCF_DO_STCLASS_AND) { - /* Switch to OR mode: cache the old value of - * data->start_class */ - INIT_AND_WITHP; - StructCopy(data->start_class, and_withp, regnode_ssc); - flags &= ~SCF_DO_STCLASS_AND; - StructCopy(&this_class, data->start_class, regnode_ssc); - flags |= SCF_DO_STCLASS_OR; - ANYOF_FLAGS(data->start_class) - |= SSC_MATCHES_EMPTY_STRING; - } - } else { /* Non-zero len */ - if (flags & SCF_DO_STCLASS_OR) { - ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &this_class); - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); - } - else if (flags & SCF_DO_STCLASS_AND) - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &this_class); - flags &= ~SCF_DO_STCLASS; - } - if (!scan) /* It was not CURLYX, but CURLY. */ - scan = next; - if (((flags & (SCF_TRIE_DOING_RESTUDY|SCF_DO_SUBSTR))==SCF_DO_SUBSTR) - /* ? quantifier ok, except for (?{ ... }) */ - && (next_is_eval || !(mincount == 0 && maxcount == 1)) - && (minnext == 0) && (deltanext == 0) - && data && !(data->flags & (SF_HAS_PAR|SF_IN_PAR)) - && maxcount <= REG_INFTY/3) /* Complement check for big - count */ - { - _WARN_HELPER(RExC_precomp_end, packWARN(WARN_REGEXP), - Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), - "Quantifier unexpected on zero-length expression " - "in regex m/%" UTF8f "/", - UTF8fARG(UTF, RExC_precomp_end - RExC_precomp, - RExC_precomp))); - } - - if ( ( minnext > 0 && mincount >= SSize_t_MAX / minnext ) - || min >= SSize_t_MAX - minnext * mincount ) - { - FAIL("Regexp out of space"); - } - - min += minnext * mincount; - is_inf_internal |= deltanext == OPTIMIZE_INFTY - || (maxcount == REG_INFTY && minnext + deltanext > 0); - is_inf |= is_inf_internal; - if (is_inf) { - delta = OPTIMIZE_INFTY; - } else { - delta += (minnext + deltanext) * maxcount - - minnext * mincount; - } - - if (data && data->flags & SCF_SEEN_ACCEPT) { - if (flags & SCF_DO_SUBSTR) { - scan_commit(pRExC_state, data, minlenp, is_inf); - flags &= ~SCF_DO_SUBSTR; - } - if (stopmin > min) - stopmin = min; - DEBUG_STUDYDATA("after-whilem accept", data, depth, is_inf, min, stopmin, delta); - } - /* Try powerful optimization CURLYX => CURLYN. */ - if ( OP(oscan) == CURLYX && data - && data->flags & SF_IN_PAR - && !(data->flags & SF_HAS_EVAL) - && !deltanext && minnext == 1 - && mutate_ok - ) { - /* Try to optimize to CURLYN. */ - regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; - regnode * const nxt1 = nxt; -#ifdef DEBUGGING - regnode *nxt2; -#endif - - /* Skip open. */ - nxt = regnext(nxt); - if (!REGNODE_SIMPLE(OP(nxt)) - && !(PL_regkind[OP(nxt)] == EXACT - && STR_LEN(nxt) == 1)) - goto nogo; -#ifdef DEBUGGING - nxt2 = nxt; -#endif - nxt = regnext(nxt); - if (OP(nxt) != CLOSE) - goto nogo; - if (RExC_open_parens) { - - /*open->CURLYM*/ - RExC_open_parens[ARG(nxt1)] = REGNODE_OFFSET(oscan); - - /*close->while*/ - RExC_close_parens[ARG(nxt1)] = REGNODE_OFFSET(nxt) + 2; - } - /* Now we know that nxt2 is the only contents: */ - oscan->flags = (U8)ARG(nxt); - OP(oscan) = CURLYN; - OP(nxt1) = NOTHING; /* was OPEN. */ - -#ifdef DEBUGGING - OP(nxt1 + 1) = OPTIMIZED; /* was count. */ - NEXT_OFF(nxt1+ 1) = 0; /* just for consistency. */ - NEXT_OFF(nxt2) = 0; /* just for consistency with CURLY. */ - OP(nxt) = OPTIMIZED; /* was CLOSE. */ - OP(nxt + 1) = OPTIMIZED; /* was count. */ - NEXT_OFF(nxt+ 1) = 0; /* just for consistency. */ -#endif - } - nogo: - - /* Try optimization CURLYX => CURLYM. */ - if ( OP(oscan) == CURLYX && data - && !(data->flags & SF_HAS_PAR) - && !(data->flags & SF_HAS_EVAL) - && !deltanext /* atom is fixed width */ - && minnext != 0 /* CURLYM can't handle zero width */ - /* Nor characters whose fold at run-time may be - * multi-character */ - && ! (RExC_seen & REG_UNFOLDED_MULTI_SEEN) - && mutate_ok - ) { - /* XXXX How to optimize if data == 0? */ - /* Optimize to a simpler form. */ - regnode *nxt = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN */ - regnode *nxt2; - - OP(oscan) = CURLYM; - while ( (nxt2 = regnext(nxt)) /* skip over embedded stuff*/ - && (OP(nxt2) != WHILEM)) - nxt = nxt2; - OP(nxt2) = SUCCEED; /* Whas WHILEM */ - /* Need to optimize away parenths. */ - if ((data->flags & SF_IN_PAR) && OP(nxt) == CLOSE) { - /* Set the parenth number. */ - regnode *nxt1 = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN*/ - - oscan->flags = (U8)ARG(nxt); - if (RExC_open_parens) { - /*open->CURLYM*/ - RExC_open_parens[ARG(nxt1)] = REGNODE_OFFSET(oscan); - - /*close->NOTHING*/ - RExC_close_parens[ARG(nxt1)] = REGNODE_OFFSET(nxt2) - + 1; - } - OP(nxt1) = OPTIMIZED; /* was OPEN. */ - OP(nxt) = OPTIMIZED; /* was CLOSE. */ - -#ifdef DEBUGGING - OP(nxt1 + 1) = OPTIMIZED; /* was count. */ - OP(nxt + 1) = OPTIMIZED; /* was count. */ - NEXT_OFF(nxt1 + 1) = 0; /* just for consistency. */ - NEXT_OFF(nxt + 1) = 0; /* just for consistency. */ -#endif -#if 0 - while ( nxt1 && (OP(nxt1) != WHILEM)) { - regnode *nnxt = regnext(nxt1); - if (nnxt == nxt) { - if (reg_off_by_arg[OP(nxt1)]) - ARG_SET(nxt1, nxt2 - nxt1); - else if (nxt2 - nxt1 < U16_MAX) - NEXT_OFF(nxt1) = nxt2 - nxt1; - else - OP(nxt) = NOTHING; /* Cannot beautify */ - } - nxt1 = nnxt; - } -#endif - /* Optimize again: */ - /* recurse study_chunk() on optimised CURLYX => CURLYM */ - study_chunk(pRExC_state, &nxt1, minlenp, &deltanext, nxt, - NULL, stopparen, recursed_depth, NULL, 0, - depth+1, mutate_ok); - } - else - oscan->flags = 0; - } - else if ((OP(oscan) == CURLYX) - && (flags & SCF_WHILEM_VISITED_POS) - /* See the comment on a similar expression above. - However, this time it's not a subexpression - we care about, but the expression itself. */ - && (maxcount == REG_INFTY) - && data) { - /* This stays as CURLYX, we can put the count/of pair. */ - /* Find WHILEM (as in regexec.c) */ - regnode *nxt = oscan + NEXT_OFF(oscan); - - if (OP(PREVOPER(nxt)) == NOTHING) /* LONGJMP */ - nxt += ARG(nxt); - nxt = PREVOPER(nxt); - if (nxt->flags & 0xf) { - /* we've already set whilem count on this node */ - } else if (++data->whilem_c < 16) { - assert(data->whilem_c <= RExC_whilem_seen); - nxt->flags = (U8)(data->whilem_c - | (RExC_whilem_seen << 4)); /* On WHILEM */ - } - } - if (data && fl & (SF_HAS_PAR|SF_IN_PAR)) - pars++; - if (flags & SCF_DO_SUBSTR) { - SV *last_str = NULL; - STRLEN last_chrs = 0; - int counted = mincount != 0; - - if (data->last_end > 0 && mincount != 0) { /* Ends with a - string. */ - SSize_t b = pos_before >= data->last_start_min - ? pos_before : data->last_start_min; - STRLEN l; - const char * const s = SvPV_const(data->last_found, l); - SSize_t old = b - data->last_start_min; - assert(old >= 0); - - if (UTF) - old = utf8_hop_forward((U8*)s, old, - (U8 *) SvEND(data->last_found)) - - (U8*)s; - l -= old; - /* Get the added string: */ - last_str = newSVpvn_utf8(s + old, l, UTF); - last_chrs = UTF ? utf8_length((U8*)(s + old), - (U8*)(s + old + l)) : l; - if (deltanext == 0 && pos_before == b) { - /* What was added is a constant string */ - if (mincount > 1) { - - SvGROW(last_str, (mincount * l) + 1); - repeatcpy(SvPVX(last_str) + l, - SvPVX_const(last_str), l, - mincount - 1); - SvCUR_set(last_str, SvCUR(last_str) * mincount); - /* Add additional parts. */ - SvCUR_set(data->last_found, - SvCUR(data->last_found) - l); - sv_catsv(data->last_found, last_str); - { - SV * sv = data->last_found; - MAGIC *mg = - SvUTF8(sv) && SvMAGICAL(sv) ? - mg_find(sv, PERL_MAGIC_utf8) : NULL; - if (mg && mg->mg_len >= 0) - mg->mg_len += last_chrs * (mincount-1); - } - last_chrs *= mincount; - data->last_end += l * (mincount - 1); - } - } else { - /* start offset must point into the last copy */ - data->last_start_min += minnext * (mincount - 1); - data->last_start_max = - is_inf - ? OPTIMIZE_INFTY - : data->last_start_max + - (maxcount - 1) * (minnext + data->pos_delta); - } - } - /* It is counted once already... */ - data->pos_min += minnext * (mincount - counted); -#if 0 - Perl_re_printf( aTHX_ "counted=%" UVuf " deltanext=%" UVuf - " OPTIMIZE_INFTY=%" UVuf " minnext=%" UVuf - " maxcount=%" UVuf " mincount=%" UVuf - " data->pos_delta=%" UVuf "\n", - (UV)counted, (UV)deltanext, (UV)OPTIMIZE_INFTY, (UV)minnext, - (UV)maxcount, (UV)mincount, (UV)data->pos_delta); - if (deltanext != OPTIMIZE_INFTY) - Perl_re_printf( aTHX_ "LHS=%" UVuf " RHS=%" UVuf "\n", - (UV)(-counted * deltanext + (minnext + deltanext) * maxcount - - minnext * mincount), (UV)(OPTIMIZE_INFTY - data->pos_delta)); -#endif - if (deltanext == OPTIMIZE_INFTY - || data->pos_delta == OPTIMIZE_INFTY - || -counted * deltanext + (minnext + deltanext) * maxcount - minnext * mincount >= OPTIMIZE_INFTY - data->pos_delta) - data->pos_delta = OPTIMIZE_INFTY; - else - data->pos_delta += - counted * deltanext + - (minnext + deltanext) * maxcount - minnext * mincount; - if (mincount != maxcount) { - /* Cannot extend fixed substrings found inside - the group. */ - scan_commit(pRExC_state, data, minlenp, is_inf); - if (mincount && last_str) { - SV * const sv = data->last_found; - MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? - mg_find(sv, PERL_MAGIC_utf8) : NULL; - - if (mg) - mg->mg_len = -1; - sv_setsv(sv, last_str); - data->last_end = data->pos_min; - data->last_start_min = data->pos_min - last_chrs; - data->last_start_max = is_inf - ? OPTIMIZE_INFTY - : data->pos_min + data->pos_delta - last_chrs; - } - data->cur_is_floating = 1; /* float */ - } - SvREFCNT_dec(last_str); - } - if (data && (fl & SF_HAS_EVAL)) - data->flags |= SF_HAS_EVAL; - optimize_curly_tail: - rck_elide_nothing(oscan); - continue; - - default: - Perl_croak(aTHX_ "panic: unexpected varying REx opcode %d", - OP(scan)); - case REF: - case CLUMP: - if (flags & SCF_DO_SUBSTR) { - /* Cannot expect anything... */ - scan_commit(pRExC_state, data, minlenp, is_inf); - data->cur_is_floating = 1; /* float */ - } - is_inf = is_inf_internal = 1; - if (flags & SCF_DO_STCLASS_OR) { - if (OP(scan) == CLUMP) { - /* Actually is any start char, but very few code points - * aren't start characters */ - ssc_match_all_cp(data->start_class); - } - else { - ssc_anything(data->start_class); - } - } - flags &= ~SCF_DO_STCLASS; - break; - } - } - else if (OP(scan) == LNBREAK) { - if (flags & SCF_DO_STCLASS) { - if (flags & SCF_DO_STCLASS_AND) { - ssc_intersection(data->start_class, - PL_XPosix_ptrs[_CC_VERTSPACE], FALSE); - ssc_clear_locale(data->start_class); - ANYOF_FLAGS(data->start_class) - &= ~SSC_MATCHES_EMPTY_STRING; - } - else if (flags & SCF_DO_STCLASS_OR) { - ssc_union(data->start_class, - PL_XPosix_ptrs[_CC_VERTSPACE], - FALSE); - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); - - /* See commit msg for - * 749e076fceedeb708a624933726e7989f2302f6a */ - ANYOF_FLAGS(data->start_class) - &= ~SSC_MATCHES_EMPTY_STRING; - } - flags &= ~SCF_DO_STCLASS; - } - min++; - if (delta != OPTIMIZE_INFTY) - delta++; /* Because of the 2 char string cr-lf */ - if (flags & SCF_DO_SUBSTR) { - /* Cannot expect anything... */ - scan_commit(pRExC_state, data, minlenp, is_inf); - data->pos_min += 1; - if (data->pos_delta != OPTIMIZE_INFTY) { - data->pos_delta += 1; - } - data->cur_is_floating = 1; /* float */ - } - } - else if (REGNODE_SIMPLE(OP(scan))) { - - if (flags & SCF_DO_SUBSTR) { - scan_commit(pRExC_state, data, minlenp, is_inf); - data->pos_min++; - } - min++; - if (flags & SCF_DO_STCLASS) { - bool invert = 0; - SV* my_invlist = NULL; - U8 namedclass; - - /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */ - ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING; - - /* Some of the logic below assumes that switching - locale on will only add false positives. */ - switch (OP(scan)) { - - default: -#ifdef DEBUGGING - Perl_croak(aTHX_ "panic: unexpected simple REx opcode %d", - OP(scan)); -#endif - case SANY: - if (flags & SCF_DO_STCLASS_OR) /* Allow everything */ - ssc_match_all_cp(data->start_class); - break; - - case REG_ANY: - { - SV* REG_ANY_invlist = _new_invlist(2); - REG_ANY_invlist = add_cp_to_invlist(REG_ANY_invlist, - '\n'); - if (flags & SCF_DO_STCLASS_OR) { - ssc_union(data->start_class, - REG_ANY_invlist, - TRUE /* TRUE => invert, hence all but \n - */ - ); - } - else if (flags & SCF_DO_STCLASS_AND) { - ssc_intersection(data->start_class, - REG_ANY_invlist, - TRUE /* TRUE => invert */ - ); - ssc_clear_locale(data->start_class); - } - SvREFCNT_dec_NN(REG_ANY_invlist); - } - break; - - case ANYOFD: - case ANYOFL: - case ANYOFPOSIXL: - case ANYOFH: - case ANYOFHb: - case ANYOFHr: - case ANYOFHs: - case ANYOF: - if (flags & SCF_DO_STCLASS_AND) - ssc_and(pRExC_state, data->start_class, - (regnode_charclass *) scan); - else - ssc_or(pRExC_state, data->start_class, - (regnode_charclass *) scan); - break; - - case NANYOFM: /* NANYOFM already contains the inversion of the - input ANYOF data, so, unlike things like - NPOSIXA, don't change 'invert' to TRUE */ - /* FALLTHROUGH */ - case ANYOFM: - { - SV* cp_list = get_ANYOFM_contents(scan); - - if (flags & SCF_DO_STCLASS_OR) { - ssc_union(data->start_class, cp_list, invert); - } - else if (flags & SCF_DO_STCLASS_AND) { - ssc_intersection(data->start_class, cp_list, invert); - } - - SvREFCNT_dec_NN(cp_list); - break; - } - - case ANYOFR: - case ANYOFRb: - { - SV* cp_list = NULL; - - cp_list = _add_range_to_invlist(cp_list, - ANYOFRbase(scan), - ANYOFRbase(scan) + ANYOFRdelta(scan)); - - if (flags & SCF_DO_STCLASS_OR) { - ssc_union(data->start_class, cp_list, invert); - } - else if (flags & SCF_DO_STCLASS_AND) { - ssc_intersection(data->start_class, cp_list, invert); - } - - SvREFCNT_dec_NN(cp_list); - break; - } - - case NPOSIXL: - invert = 1; - /* FALLTHROUGH */ - - case POSIXL: - namedclass = classnum_to_namedclass(FLAGS(scan)) + invert; - if (flags & SCF_DO_STCLASS_AND) { - bool was_there = cBOOL( - ANYOF_POSIXL_TEST(data->start_class, - namedclass)); - ANYOF_POSIXL_ZERO(data->start_class); - if (was_there) { /* Do an AND */ - ANYOF_POSIXL_SET(data->start_class, namedclass); - } - /* No individual code points can now match */ - data->start_class->invlist - = sv_2mortal(_new_invlist(0)); - } - else { - int complement = namedclass + ((invert) ? -1 : 1); - - assert(flags & SCF_DO_STCLASS_OR); - - /* If the complement of this class was already there, - * the result is that they match all code points, - * (\d + \D == everything). Remove the classes from - * future consideration. Locale is not relevant in - * this case */ - if (ANYOF_POSIXL_TEST(data->start_class, complement)) { - ssc_match_all_cp(data->start_class); - ANYOF_POSIXL_CLEAR(data->start_class, namedclass); - ANYOF_POSIXL_CLEAR(data->start_class, complement); - } - else { /* The usual case; just add this class to the - existing set */ - ANYOF_POSIXL_SET(data->start_class, namedclass); - } - } - break; - - case NPOSIXA: /* For these, we always know the exact set of - what's matched */ - invert = 1; - /* FALLTHROUGH */ - case POSIXA: - my_invlist = invlist_clone(PL_Posix_ptrs[FLAGS(scan)], NULL); - goto join_posix_and_ascii; - - case NPOSIXD: - case NPOSIXU: - invert = 1; - /* FALLTHROUGH */ - case POSIXD: - case POSIXU: - my_invlist = invlist_clone(PL_XPosix_ptrs[FLAGS(scan)], NULL); - - /* NPOSIXD matches all upper Latin1 code points unless the - * target string being matched is UTF-8, which is - * unknowable until match time. Since we are going to - * invert, we want to get rid of all of them so that the - * inversion will match all */ - if (OP(scan) == NPOSIXD) { - _invlist_subtract(my_invlist, PL_UpperLatin1, - &my_invlist); - } - - join_posix_and_ascii: - - if (flags & SCF_DO_STCLASS_AND) { - ssc_intersection(data->start_class, my_invlist, invert); - ssc_clear_locale(data->start_class); - } - else { - assert(flags & SCF_DO_STCLASS_OR); - ssc_union(data->start_class, my_invlist, invert); - } - SvREFCNT_dec(my_invlist); - } - if (flags & SCF_DO_STCLASS_OR) - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); - flags &= ~SCF_DO_STCLASS; - } - } - else if (PL_regkind[OP(scan)] == EOL && flags & SCF_DO_SUBSTR) { - data->flags |= (OP(scan) == MEOL - ? SF_BEFORE_MEOL - : SF_BEFORE_SEOL); - scan_commit(pRExC_state, data, minlenp, is_inf); - - } - else if ( PL_regkind[OP(scan)] == BRANCHJ - /* Lookbehind, or need to calculate parens/evals/stclass: */ - && (scan->flags || data || (flags & SCF_DO_STCLASS)) - && (OP(scan) == IFMATCH || OP(scan) == UNLESSM)) - { - if ( !PERL_ENABLE_POSITIVE_ASSERTION_STUDY - || OP(scan) == UNLESSM ) - { - /* Negative Lookahead/lookbehind - In this case we can't do fixed string optimisation. - */ - - bool is_positive = OP(scan) == IFMATCH ? 1 : 0; - SSize_t deltanext, minnext; - SSize_t fake_last_close = 0; - regnode *fake_last_close_op = NULL; - regnode *cur_last_close_op; - regnode *nscan; - regnode_ssc intrnl; - U32 f = (flags & SCF_TRIE_DOING_RESTUDY); - - StructCopy(&zero_scan_data, &data_fake, scan_data_t); - if (data) { - data_fake.whilem_c = data->whilem_c; - data_fake.last_closep = data->last_closep; - data_fake.last_close_opp = data->last_close_opp; - } - else { - data_fake.last_closep = &fake_last_close; - data_fake.last_close_opp = &fake_last_close_op; - } - - /* remember the last_close_op we saw so we can see if - * we are dealing with variable length lookbehind that - * contains capturing buffers, which are considered - * experimental */ - cur_last_close_op= *(data_fake.last_close_opp); - - data_fake.pos_delta = delta; - if ( flags & SCF_DO_STCLASS && !scan->flags - && OP(scan) == IFMATCH ) { /* Lookahead */ - ssc_init(pRExC_state, &intrnl); - data_fake.start_class = &intrnl; - f |= SCF_DO_STCLASS_AND; - } - if (flags & SCF_WHILEM_VISITED_POS) - f |= SCF_WHILEM_VISITED_POS; - next = regnext(scan); - nscan = NEXTOPER(NEXTOPER(scan)); - - /* recurse study_chunk() for lookahead body */ - minnext = study_chunk(pRExC_state, &nscan, minlenp, &deltanext, - last, &data_fake, stopparen, - recursed_depth, NULL, f, depth+1, - mutate_ok); - - if (scan->flags) { - if ( deltanext < 0 - || deltanext > (I32) U8_MAX - || minnext > (I32)U8_MAX - || minnext + deltanext > (I32)U8_MAX) - { - FAIL2("Lookbehind longer than %" UVuf " not implemented", - (UV)U8_MAX); - } - - /* The 'next_off' field has been repurposed to count the - * additional starting positions to try beyond the initial - * one. (This leaves it at 0 for non-variable length - * matches to avoid breakage for those not using this - * extension) */ - if (deltanext) { - scan->next_off = deltanext; - if ( - /* See a CLOSE op inside this lookbehind? */ - cur_last_close_op != *(data_fake.last_close_opp) - /* and not doing restudy. see: restudied */ - && !(flags & SCF_TRIE_DOING_RESTUDY) - ) { - /* this is positive variable length lookbehind with - * capture buffers inside of it */ - ckWARNexperimental_with_arg(RExC_parse, - WARN_EXPERIMENTAL__VLB, - "Variable length %s lookbehind with capturing is experimental", - is_positive ? "positive" : "negative"); - } - } - scan->flags = (U8)minnext + deltanext; - } - if (data) { - if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR)) - pars++; - if (data_fake.flags & SF_HAS_EVAL) - data->flags |= SF_HAS_EVAL; - data->whilem_c = data_fake.whilem_c; - } - if (f & SCF_DO_STCLASS_AND) { - if (flags & SCF_DO_STCLASS_OR) { - /* OR before, AND after: ideally we would recurse with - * data_fake to get the AND applied by study of the - * remainder of the pattern, and then derecurse; - * *** HACK *** for now just treat as "no information". - * See [perl #56690]. - */ - ssc_init(pRExC_state, data->start_class); - } else { - /* AND before and after: combine and continue. These - * assertions are zero-length, so can match an EMPTY - * string */ - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &intrnl); - ANYOF_FLAGS(data->start_class) - |= SSC_MATCHES_EMPTY_STRING; - } - } - DEBUG_STUDYDATA("end LOOKAROUND", data, depth, is_inf, min, stopmin, delta); - } -#if PERL_ENABLE_POSITIVE_ASSERTION_STUDY - else { - /* Positive Lookahead/lookbehind - In this case we can do fixed string optimisation, - but we must be careful about it. Note in the case of - lookbehind the positions will be offset by the minimum - length of the pattern, something we won't know about - until after the recurse. - */ - SSize_t deltanext, fake_last_close = 0; - regnode *last_close_op = NULL; - regnode *nscan; - regnode_ssc intrnl; - U32 f = (flags & SCF_TRIE_DOING_RESTUDY); - /* We use SAVEFREEPV so that when the full compile - is finished perl will clean up the allocated - minlens when it's all done. This way we don't - have to worry about freeing them when we know - they wont be used, which would be a pain. - */ - SSize_t *minnextp; - Newx( minnextp, 1, SSize_t ); - SAVEFREEPV(minnextp); - - if (data) { - StructCopy(data, &data_fake, scan_data_t); - if ((flags & SCF_DO_SUBSTR) && data->last_found) { - f |= SCF_DO_SUBSTR; - if (scan->flags) - scan_commit(pRExC_state, &data_fake, minlenp, is_inf); - data_fake.last_found=newSVsv(data->last_found); - } - } - else { - data_fake.last_closep = &fake_last_close; - data_fake.last_close_opp = &fake_last_close_opp; - } - data_fake.flags = 0; - data_fake.substrs[0].flags = 0; - data_fake.substrs[1].flags = 0; - data_fake.pos_delta = delta; - if (is_inf) - data_fake.flags |= SF_IS_INF; - if ( flags & SCF_DO_STCLASS && !scan->flags - && OP(scan) == IFMATCH ) { /* Lookahead */ - ssc_init(pRExC_state, &intrnl); - data_fake.start_class = &intrnl; - f |= SCF_DO_STCLASS_AND; - } - if (flags & SCF_WHILEM_VISITED_POS) - f |= SCF_WHILEM_VISITED_POS; - next = regnext(scan); - nscan = NEXTOPER(NEXTOPER(scan)); - - /* positive lookahead study_chunk() recursion */ - *minnextp = study_chunk(pRExC_state, &nscan, minnextp, - &deltanext, last, &data_fake, - stopparen, recursed_depth, NULL, - f, depth+1, mutate_ok); - if (scan->flags) { - assert(0); /* This code has never been tested since this - is normally not compiled */ - if ( deltanext < 0 - || deltanext > (I32) U8_MAX - || *minnextp > (I32)U8_MAX - || *minnextp + deltanext > (I32)U8_MAX) - { - FAIL2("Lookbehind longer than %" UVuf " not implemented", - (UV)U8_MAX); - } - - if (deltanext) { - scan->next_off = deltanext; - } - scan->flags = (U8)*minnextp + deltanext; - } - - *minnextp += min; - - if (f & SCF_DO_STCLASS_AND) { - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &intrnl); - ANYOF_FLAGS(data->start_class) |= SSC_MATCHES_EMPTY_STRING; - } - if (data) { - if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR)) - pars++; - if (data_fake.flags & SF_HAS_EVAL) - data->flags |= SF_HAS_EVAL; - data->whilem_c = data_fake.whilem_c; - if ((flags & SCF_DO_SUBSTR) && data_fake.last_found) { - int i; - if (RExC_rx->minlen < *minnextp) - RExC_rx->minlen = *minnextp; - scan_commit(pRExC_state, &data_fake, minnextp, is_inf); - SvREFCNT_dec_NN(data_fake.last_found); - - for (i = 0; i < 2; i++) { - if (data_fake.substrs[i].minlenp != minlenp) { - data->substrs[i].min_offset = - data_fake.substrs[i].min_offset; - data->substrs[i].max_offset = - data_fake.substrs[i].max_offset; - data->substrs[i].minlenp = - data_fake.substrs[i].minlenp; - data->substrs[i].lookbehind += scan->flags; - } - } - } - } - } -#endif - } - else if (OP(scan) == OPEN) { - if (stopparen != (I32)ARG(scan)) - pars++; - } - else if (OP(scan) == CLOSE) { - if (stopparen == (I32)ARG(scan)) { - break; - } - if ((I32)ARG(scan) == is_par) { - next = regnext(scan); - - if ( next && (OP(next) != WHILEM) && next < last) - is_par = 0; /* Disable optimization */ - } - if (data) { - *(data->last_closep) = ARG(scan); - *(data->last_close_opp) = scan; - } - } - else if (OP(scan) == EVAL) { - if (data) - data->flags |= SF_HAS_EVAL; - } - else if ( PL_regkind[OP(scan)] == ENDLIKE ) { - if (flags & SCF_DO_SUBSTR) { - scan_commit(pRExC_state, data, minlenp, is_inf); - flags &= ~SCF_DO_SUBSTR; - } - if (OP(scan)==ACCEPT) { - /* m{(*ACCEPT)x} does not have to start with 'x' */ - flags &= ~SCF_DO_STCLASS; - if (data) - data->flags |= SCF_SEEN_ACCEPT; - if (stopmin > min) - stopmin = min; - } - } - else if (OP(scan) == COMMIT) { - /* gh18770: m{abc(*COMMIT)xyz} must fail on "abc abcxyz", so we - * must not end up with "abcxyz" as a fixed substring else we'll - * skip straight to attempting to match at offset 4. - */ - if (flags & SCF_DO_SUBSTR) { - scan_commit(pRExC_state, data, minlenp, is_inf); - flags &= ~SCF_DO_SUBSTR; - } - } - else if (OP(scan) == LOGICAL && scan->flags == 2) /* Embedded follows */ - { - if (flags & SCF_DO_SUBSTR) { - scan_commit(pRExC_state, data, minlenp, is_inf); - data->cur_is_floating = 1; /* float */ - } - is_inf = is_inf_internal = 1; - if (flags & SCF_DO_STCLASS_OR) /* Allow everything */ - ssc_anything(data->start_class); - flags &= ~SCF_DO_STCLASS; - } - else if (OP(scan) == GPOS) { - if (!(RExC_rx->intflags & PREGf_GPOS_FLOAT) && - !(delta || is_inf || (data && data->pos_delta))) - { - if (!(RExC_rx->intflags & PREGf_ANCH) && (flags & SCF_DO_SUBSTR)) - RExC_rx->intflags |= PREGf_ANCH_GPOS; - if (RExC_rx->gofs < (STRLEN)min) - RExC_rx->gofs = min; - } else { - RExC_rx->intflags |= PREGf_GPOS_FLOAT; - RExC_rx->gofs = 0; - } - } -#ifdef TRIE_STUDY_OPT -#ifdef FULL_TRIE_STUDY - else if (PL_regkind[OP(scan)] == TRIE) { - /* NOTE - There is similar code to this block above for handling - BRANCH nodes on the initial study. If you change stuff here - check there too. */ - regnode *trie_node= scan; - regnode *tail= regnext(scan); - reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ]; - SSize_t max1 = 0, min1 = OPTIMIZE_INFTY; - regnode_ssc accum; - - if (flags & SCF_DO_SUBSTR) { /* XXXX Add !SUSPEND? */ - /* Cannot merge strings after this. */ - scan_commit(pRExC_state, data, minlenp, is_inf); - } - if (flags & SCF_DO_STCLASS) - ssc_init_zero(pRExC_state, &accum); - - if (!trie->jump) { - min1= trie->minlen; - max1= trie->maxlen; - } else { - const regnode *nextbranch= NULL; - U32 word; - - for ( word=1 ; word <= trie->wordcount ; word++) - { - SSize_t deltanext = 0, minnext = 0; - U32 f = (flags & SCF_TRIE_DOING_RESTUDY); - SSize_t fake_last_close = 0; - regnode *fake_last_close_op = NULL; - regnode_ssc this_class; - - StructCopy(&zero_scan_data, &data_fake, scan_data_t); - if (data) { - data_fake.whilem_c = data->whilem_c; - data_fake.last_closep = data->last_closep; - data_fake.last_close_opp = data->last_close_opp; - } - else { - data_fake.last_closep = &fake_last_close; - data_fake.last_close_opp = &fake_last_close_op; - } - data_fake.pos_delta = delta; - if (flags & SCF_DO_STCLASS) { - ssc_init(pRExC_state, &this_class); - data_fake.start_class = &this_class; - f |= SCF_DO_STCLASS_AND; - } - if (flags & SCF_WHILEM_VISITED_POS) - f |= SCF_WHILEM_VISITED_POS; - - if (trie->jump[word]) { - if (!nextbranch) - nextbranch = trie_node + trie->jump[0]; - scan= trie_node + trie->jump[word]; - /* We go from the jump point to the branch that follows - it. Note this means we need the vestigal unused - branches even though they arent otherwise used. */ - /* optimise study_chunk() for TRIE */ - minnext = study_chunk(pRExC_state, &scan, minlenp, - &deltanext, (regnode *)nextbranch, &data_fake, - stopparen, recursed_depth, NULL, f, depth+1, - mutate_ok); - } - if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH) - nextbranch= regnext((regnode*)nextbranch); - - if (min1 > (SSize_t)(minnext + trie->minlen)) - min1 = minnext + trie->minlen; - if (deltanext == OPTIMIZE_INFTY) { - is_inf = is_inf_internal = 1; - max1 = OPTIMIZE_INFTY; - } else if (max1 < (SSize_t)(minnext + deltanext + trie->maxlen)) - max1 = minnext + deltanext + trie->maxlen; - - if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR)) - pars++; - if (data_fake.flags & SCF_SEEN_ACCEPT) { - if ( stopmin > min + min1) - stopmin = min + min1; - flags &= ~SCF_DO_SUBSTR; - if (data) - data->flags |= SCF_SEEN_ACCEPT; - } - if (data) { - if (data_fake.flags & SF_HAS_EVAL) - data->flags |= SF_HAS_EVAL; - data->whilem_c = data_fake.whilem_c; - } - if (flags & SCF_DO_STCLASS) - ssc_or(pRExC_state, &accum, (regnode_charclass *) &this_class); - } - DEBUG_STUDYDATA("after JUMPTRIE", data, depth, is_inf, min, stopmin, delta); - } - if (flags & SCF_DO_SUBSTR) { - data->pos_min += min1; - data->pos_delta += max1 - min1; - if (max1 != min1 || is_inf) - data->cur_is_floating = 1; /* float */ - } - min += min1; - if (delta != OPTIMIZE_INFTY) { - if (OPTIMIZE_INFTY - (max1 - min1) >= delta) - delta += max1 - min1; - else - delta = OPTIMIZE_INFTY; - } - if (flags & SCF_DO_STCLASS_OR) { - ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &accum); - if (min1) { - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); - flags &= ~SCF_DO_STCLASS; - } - } - else if (flags & SCF_DO_STCLASS_AND) { - if (min1) { - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &accum); - flags &= ~SCF_DO_STCLASS; - } - else { - /* Switch to OR mode: cache the old value of - * data->start_class */ - INIT_AND_WITHP; - StructCopy(data->start_class, and_withp, regnode_ssc); - flags &= ~SCF_DO_STCLASS_AND; - StructCopy(&accum, data->start_class, regnode_ssc); - flags |= SCF_DO_STCLASS_OR; - } - } - scan= tail; - DEBUG_STUDYDATA("after TRIE study", data, depth, is_inf, min, stopmin, delta); - continue; - } -#else - else if (PL_regkind[OP(scan)] == TRIE) { - reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG(scan) ]; - U8*bang=NULL; - - min += trie->minlen; - delta += (trie->maxlen - trie->minlen); - flags &= ~SCF_DO_STCLASS; /* xxx */ - if (flags & SCF_DO_SUBSTR) { - /* Cannot expect anything... */ - scan_commit(pRExC_state, data, minlenp, is_inf); - data->pos_min += trie->minlen; - data->pos_delta += (trie->maxlen - trie->minlen); - if (trie->maxlen != trie->minlen) - data->cur_is_floating = 1; /* float */ - } - if (trie->jump) /* no more substrings -- for now /grr*/ - flags &= ~SCF_DO_SUBSTR; - } - -#endif /* old or new */ -#endif /* TRIE_STUDY_OPT */ - - else if (OP(scan) == REGEX_SET) { - Perl_croak(aTHX_ "panic: %s regnode should be resolved" - " before optimization", PL_reg_name[REGEX_SET]); - } - - /* Else: zero-length, ignore. */ - scan = regnext(scan); - } - - finish: - if (frame) { - /* we need to unwind recursion. */ - depth = depth - 1; - - DEBUG_STUDYDATA("frame-end", data, depth, is_inf, min, stopmin, delta); - DEBUG_PEEP("fend", scan, depth, flags); - - /* restore previous context */ - last = frame->last_regnode; - scan = frame->next_regnode; - stopparen = frame->stopparen; - recursed_depth = frame->prev_recursed_depth; - - RExC_frame_last = frame->prev_frame; - frame = frame->this_prev_frame; - goto fake_study_recurse; - } - - assert(!frame); - DEBUG_STUDYDATA("pre-fin", data, depth, is_inf, min, stopmin, delta); - - /* is this pattern infinite? Eg, consider /(a|b+)/ */ - if (is_inf_internal) - delta = OPTIMIZE_INFTY; - - /* deal with (*ACCEPT), Eg, consider /(foo(*ACCEPT)|bop)bar/ */ - if (min > stopmin) { - /* - At this point 'min' represents the minimum length string we can - match while *ignoring* the implication of ACCEPT, and 'delta' - represents the difference between the minimum length and maximum - length, and if the pattern matches an infinitely long string - (consider the + and * quantifiers) then we use the special delta - value of OPTIMIZE_INFTY to represent it. 'stopmin' is the - minimum length that can be matched *and* accepted. - - A pattern is accepted when matching was successful *and* - complete, and thus there is no further matching needing to be - done, no backtracking to occur, etc. Prior to the introduction - of ACCEPT the only opcode that signaled acceptance was the END - opcode, which is always the very last opcode in a regex program. - ACCEPT is thus conceptually an early successful return out of - the matching process. stopmin starts out as OPTIMIZE_INFTY to - represent "the entire pattern", and is ratched down to the - "current min" if necessary when an ACCEPT opcode is encountered. - - Thus stopmin might be smaller than min if we saw an (*ACCEPT), - and we now need to account for it in both min and delta. - Consider that in a pattern /AB/ normally the min length it can - match can be computed as min(A)+min(B). But (*ACCEPT) means - that it might be something else, not even neccesarily min(A) at - all. Consider - - A = /(foo(*ACCEPT)|x+)/ - B = /whop/ - AB = /(foo(*ACCEPT)|x+)whop/ - - The min for A is 1 for "x" and the delta for A is OPTIMIZE_INFTY - for "xxxxx...", its stopmin is 3 for "foo". The min for B is 4 for - "whop", and the delta of 0 as the pattern is of fixed length, the - stopmin would be OPTIMIZE_INFTY as it does not contain an ACCEPT. - When handling AB we expect to see a min of 5 for "xwhop", and a - delta of OPTIMIZE_INFTY for "xxxxx...whop", and a stopmin of 3 - for "foo". This should result in a final min of 3 for "foo", and - a final delta of OPTIMIZE_INFTY for "xxxxx...whop". - - In something like /(dude(*ACCEPT)|irk)x{3,7}/ we would have a - min of 6 for "irkxxx" and a delta of 4 for "irkxxxxxxx", and the - stop min would be 4 for "dude". This should result in a final - min of 4 for "dude", and a final delta of 6, for "irkxxxxxxx". - - When min is smaller than stopmin then we can ignore it. In the - fragment /(x{10,20}(*ACCEPT)|a)b+/, we would have a min of 2, - and a delta of OPTIMIZE_INFTY, and a stopmin of 10. Obviously - the ACCEPT doesn't reduce the minimum length of the string that - might be matched, nor affect the maximum length. - - In something like /foo(*ACCEPT)ba?r/ we would have a min of 5 - for "foobr", a delta of 1 for "foobar", and a stopmin of 3 for - "foo". We currently turn this into a min of 3 for "foo" and a - delta of 3 for "foobar" even though technically "foobar" isn't - possible. ACCEPT affects some aspects of the optimizer, like - length computations and mandatory substring optimizations, but - there are other optimzations this routine perfoms that are not - affected and this compromise simplifies implementation. - - It might be helpful to consider that this C function is called - recursively on the pattern in a bottom up fashion, and that the - min returned by a nested call may be marked as coming from an - ACCEPT, causing its callers to treat the returned min as a - stopmin as the recursion unwinds. Thus a single ACCEPT can affect - multiple calls into this function in different ways. - */ - - if (OPTIMIZE_INFTY - delta >= min - stopmin) - delta += min - stopmin; - else - delta = OPTIMIZE_INFTY; - min = stopmin; - } - - *scanp = scan; - *deltap = delta; - - if (flags & SCF_DO_SUBSTR && is_inf) - data->pos_delta = OPTIMIZE_INFTY - data->pos_min; - if (is_par > (I32)U8_MAX) - is_par = 0; - if (is_par && pars==1 && data) { - data->flags |= SF_IN_PAR; - data->flags &= ~SF_HAS_PAR; - } - else if (pars && data) { - data->flags |= SF_HAS_PAR; - data->flags &= ~SF_IN_PAR; - } - if (flags & SCF_DO_STCLASS_OR) - ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); - if (flags & SCF_TRIE_RESTUDY) - data->flags |= SCF_TRIE_RESTUDY; - - - if (!(RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN)) { - if (min > OPTIMIZE_INFTY - delta) - RExC_maxlen = OPTIMIZE_INFTY; - else if (RExC_maxlen < min + delta) - RExC_maxlen = min + delta; - } - DEBUG_STUDYDATA("post-fin", data, depth, is_inf, min, stopmin, delta); - return min; -} - -/* add a data member to the struct reg_data attached to this regex, it should - * always return a non-zero return. the 's' argument is the type of the items - * being added and the n is the number of items. The length of 's' should match - * the number of items. */ -STATIC U32 -S_add_data(RExC_state_t* const pRExC_state, const char* const s, const U32 n) -{ - U32 count = RExC_rxi->data ? RExC_rxi->data->count : 1; - - PERL_ARGS_ASSERT_ADD_DATA; - - /* in the below expression we have (count + n - 1), the minus one is there - * because the struct that we allocate already contains a slot for 1 data - * item, so we do not need to allocate it the first time. IOW, the - * sizeof(*RExC_rxi->data) already accounts for one of the elements we need - * to allocate. See struct reg_data in regcomp.h - */ - Renewc(RExC_rxi->data, - sizeof(*RExC_rxi->data) + (sizeof(void*) * (count + n - 1)), - char, struct reg_data); - /* however in the data->what expression we use (count + n) and do not - * subtract one from the result because the data structure contains a - * pointer to an array, and does not allocate the first element as part of - * the data struct. */ - if (count > 1) - Renew(RExC_rxi->data->what, (count + n), U8); - else { - /* when count == 1 it means we have not initialized anything. - * we always fill the 0 slot of the data array with a '%' entry, which - * means "zero" (all the other types are letters) which exists purely - * so the return from add_data is ALWAYS true, so we can tell it apart - * from a "no value" idx=0 in places where we would return an index - * into add_data. This is particularly important with the new "single - * pass, usually, but not always" strategy that we use, where the code - * will use a 0 to represent "not able to compute this yet". - */ - Newx(RExC_rxi->data->what, n+1, U8); - /* fill in the placeholder slot of 0 with a what of '%', we use - * this because it sorta looks like a zero (0/0) and it is not a letter - * like any of the other "whats", this type should never be created - * any other way but here. '%' happens to also not appear in this - * file for any other reason (at the time of writing this comment)*/ - RExC_rxi->data->what[0]= '%'; - RExC_rxi->data->data[0]= NULL; - } - RExC_rxi->data->count = count + n; - Copy(s, RExC_rxi->data->what + count, n, U8); - assert(count>0); - return count; -} - -/*XXX: todo make this not included in a non debugging perl, but appears to be - * used anyway there, in 'use re' */ -#ifndef PERL_IN_XSUB_RE -void -Perl_reginitcolors(pTHX) -{ - const char * const s = PerlEnv_getenv("PERL_RE_COLORS"); - if (s) { - char *t = savepv(s); - int i = 0; - PL_colors[0] = t; - while (++i < 6) { - t = strchr(t, '\t'); - if (t) { - *t = '\0'; - PL_colors[i] = ++t; - } - else - PL_colors[i] = t = (char *)""; - } - } else { - int i = 0; - while (i < 6) - PL_colors[i++] = (char *)""; - } - PL_colorset = 1; -} -#endif - - -#ifdef TRIE_STUDY_OPT -/* search for "restudy" in this file for a detailed explanation */ -#define CHECK_RESTUDY_GOTO_butfirst(dOsomething) \ - STMT_START { \ - if ( \ - (data.flags & SCF_TRIE_RESTUDY) \ - && ! restudied++ \ - ) { \ - dOsomething; \ - goto reStudy; \ - } \ - } STMT_END -#else -#define CHECK_RESTUDY_GOTO_butfirst -#endif - -/* - * pregcomp - compile a regular expression into internal code - * - * Decides which engine's compiler to call based on the hint currently in - * scope - */ - -#ifndef PERL_IN_XSUB_RE - -/* return the currently in-scope regex engine (or the default if none) */ - -regexp_engine const * -Perl_current_re_engine(pTHX) -{ - if (IN_PERL_COMPILETIME) { - HV * const table = GvHV(PL_hintgv); - SV **ptr; - - if (!table || !(PL_hints & HINT_LOCALIZE_HH)) - return &PL_core_reg_engine; - ptr = hv_fetchs(table, "regcomp", FALSE); - if ( !(ptr && SvIOK(*ptr) && SvIV(*ptr))) - return &PL_core_reg_engine; - return INT2PTR(regexp_engine*, SvIV(*ptr)); - } - else { - SV *ptr; - if (!PL_curcop->cop_hints_hash) - return &PL_core_reg_engine; - ptr = cop_hints_fetch_pvs(PL_curcop, "regcomp", 0); - if ( !(ptr && SvIOK(ptr) && SvIV(ptr))) - return &PL_core_reg_engine; - return INT2PTR(regexp_engine*, SvIV(ptr)); - } -} - - -REGEXP * -Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags) -{ - regexp_engine const *eng = current_re_engine(); - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - PERL_ARGS_ASSERT_PREGCOMP; - - /* Dispatch a request to compile a regexp to correct regexp engine. */ - DEBUG_COMPILE_r({ - Perl_re_printf( aTHX_ "Using engine %" UVxf "\n", - PTR2UV(eng)); - }); - return CALLREGCOMP_ENG(eng, pattern, flags); -} -#endif - -/* -=for apidoc re_compile - -Compile the regular expression pattern C, returning a pointer to the -compiled object for later matching with the internal regex engine. - -This function is typically used by a custom regexp engine C<.comp()> function -to hand off to the core regexp engine those patterns it doesn't want to handle -itself (typically passing through the same flags it was called with). In -almost all other cases, a regexp should be compiled by calling L> -to compile using the currently active regexp engine. - -If C is already a C, this function does nothing but return a -pointer to the input. Otherwise the PV is extracted and treated like a string -representing a pattern. See L. - -The possible flags for C are documented in L. Their names -all begin with C. - -=cut - - * public entry point for the perl core's own regex compiling code. - * It's actually a wrapper for Perl_re_op_compile that only takes an SV - * pattern rather than a list of OPs, and uses the internal engine rather - * than the current one */ - -REGEXP * -Perl_re_compile(pTHX_ SV * const pattern, U32 rx_flags) -{ - SV *pat = pattern; /* defeat constness! */ - - PERL_ARGS_ASSERT_RE_COMPILE; - - return Perl_re_op_compile(aTHX_ &pat, 1, NULL, -#ifdef PERL_IN_XSUB_RE - &my_reg_engine, -#else - &PL_core_reg_engine, -#endif - NULL, NULL, rx_flags, 0); -} - -static void -S_free_codeblocks(pTHX_ struct reg_code_blocks *cbs) -{ - int n; - - if (--cbs->refcnt > 0) - return; - for (n = 0; n < cbs->count; n++) { - REGEXP *rx = cbs->cb[n].src_regex; - if (rx) { - cbs->cb[n].src_regex = NULL; - SvREFCNT_dec_NN(rx); - } - } - Safefree(cbs->cb); - Safefree(cbs); -} - - -static struct reg_code_blocks * -S_alloc_code_blocks(pTHX_ int ncode) -{ - struct reg_code_blocks *cbs; - Newx(cbs, 1, struct reg_code_blocks); - cbs->count = ncode; - cbs->refcnt = 1; - SAVEDESTRUCTOR_X(S_free_codeblocks, cbs); - if (ncode) - Newx(cbs->cb, ncode, struct reg_code_block); - else - cbs->cb = NULL; - return cbs; -} - - -/* upgrade pattern pat_p of length plen_p to UTF8, and if there are code - * blocks, recalculate the indices. Update pat_p and plen_p in-place to - * point to the realloced string and length. - * - * This is essentially a copy of Perl_bytes_to_utf8() with the code index - * stuff added */ - -static void -S_pat_upgrade_to_utf8(pTHX_ RExC_state_t * const pRExC_state, - char **pat_p, STRLEN *plen_p, int num_code_blocks) -{ - U8 *const src = (U8*)*pat_p; - U8 *dst, *d; - int n=0; - STRLEN s = 0; - bool do_end = 0; - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - DEBUG_PARSE_r(Perl_re_printf( aTHX_ - "UTF8 mismatch! Converting to utf8 for resizing and compile\n")); - - /* 1 for each byte + 1 for each byte that expands to two, + trailing NUL */ - Newx(dst, *plen_p + variant_under_utf8_count(src, src + *plen_p) + 1, U8); - d = dst; - - while (s < *plen_p) { - append_utf8_from_native_byte(src[s], &d); - - if (n < num_code_blocks) { - assert(pRExC_state->code_blocks); - if (!do_end && pRExC_state->code_blocks->cb[n].start == s) { - pRExC_state->code_blocks->cb[n].start = d - dst - 1; - assert(*(d - 1) == '('); - do_end = 1; - } - else if (do_end && pRExC_state->code_blocks->cb[n].end == s) { - pRExC_state->code_blocks->cb[n].end = d - dst - 1; - assert(*(d - 1) == ')'); - do_end = 0; - n++; - } - } - s++; - } - *d = '\0'; - *plen_p = d - dst; - *pat_p = (char*) dst; - SAVEFREEPV(*pat_p); - RExC_orig_utf8 = RExC_utf8 = 1; -} - - - -/* S_concat_pat(): concatenate a list of args to the pattern string pat, - * while recording any code block indices, and handling overloading, - * nested qr// objects etc. If pat is null, it will allocate a new - * string, or just return the first arg, if there's only one. - * - * Returns the malloced/updated pat. - * patternp and pat_count is the array of SVs to be concatted; - * oplist is the optional list of ops that generated the SVs; - * recompile_p is a pointer to a boolean that will be set if - * the regex will need to be recompiled. - * delim, if non-null is an SV that will be inserted between each element - */ - -static SV* -S_concat_pat(pTHX_ RExC_state_t * const pRExC_state, - SV *pat, SV ** const patternp, int pat_count, - OP *oplist, bool *recompile_p, SV *delim) -{ - SV **svp; - int n = 0; - bool use_delim = FALSE; - bool alloced = FALSE; - - /* if we know we have at least two args, create an empty string, - * then concatenate args to that. For no args, return an empty string */ - if (!pat && pat_count != 1) { - pat = newSVpvs(""); - SAVEFREESV(pat); - alloced = TRUE; - } - - for (svp = patternp; svp < patternp + pat_count; svp++) { - SV *sv; - SV *rx = NULL; - STRLEN orig_patlen = 0; - bool code = 0; - SV *msv = use_delim ? delim : *svp; - if (!msv) msv = &PL_sv_undef; - - /* if we've got a delimiter, we go round the loop twice for each - * svp slot (except the last), using the delimiter the second - * time round */ - if (use_delim) { - svp--; - use_delim = FALSE; - } - else if (delim) - use_delim = TRUE; - - if (SvTYPE(msv) == SVt_PVAV) { - /* we've encountered an interpolated array within - * the pattern, e.g. /...@a..../. Expand the list of elements, - * then recursively append elements. - * The code in this block is based on S_pushav() */ - - AV *const av = (AV*)msv; - const SSize_t maxarg = AvFILL(av) + 1; - SV **array; - - if (oplist) { - assert(oplist->op_type == OP_PADAV - || oplist->op_type == OP_RV2AV); - oplist = OpSIBLING(oplist); - } - - if (SvRMAGICAL(av)) { - SSize_t i; - - Newx(array, maxarg, SV*); - SAVEFREEPV(array); - for (i=0; i < maxarg; i++) { - SV ** const svp = av_fetch(av, i, FALSE); - array[i] = svp ? *svp : &PL_sv_undef; - } - } - else - array = AvARRAY(av); - - pat = S_concat_pat(aTHX_ pRExC_state, pat, - array, maxarg, NULL, recompile_p, - /* $" */ - GvSV((gv_fetchpvs("\"", GV_ADDMULTI, SVt_PV)))); - - continue; - } - - - /* we make the assumption here that each op in the list of - * op_siblings maps to one SV pushed onto the stack, - * except for code blocks, with have both an OP_NULL and - * an OP_CONST. - * This allows us to match up the list of SVs against the - * list of OPs to find the next code block. - * - * Note that PUSHMARK PADSV PADSV .. - * is optimised to - * PADRANGE PADSV PADSV .. - * so the alignment still works. */ - - if (oplist) { - if (oplist->op_type == OP_NULL - && (oplist->op_flags & OPf_SPECIAL)) - { - assert(n < pRExC_state->code_blocks->count); - pRExC_state->code_blocks->cb[n].start = pat ? SvCUR(pat) : 0; - pRExC_state->code_blocks->cb[n].block = oplist; - pRExC_state->code_blocks->cb[n].src_regex = NULL; - n++; - code = 1; - oplist = OpSIBLING(oplist); /* skip CONST */ - assert(oplist); - } - oplist = OpSIBLING(oplist);; - } - - /* apply magic and QR overloading to arg */ - - SvGETMAGIC(msv); - if (SvROK(msv) && SvAMAGIC(msv)) { - SV *sv = AMG_CALLunary(msv, regexp_amg); - if (sv) { - if (SvROK(sv)) - sv = SvRV(sv); - if (SvTYPE(sv) != SVt_REGEXP) - Perl_croak(aTHX_ "Overloaded qr did not return a REGEXP"); - msv = sv; - } - } - - /* try concatenation overload ... */ - if (pat && (SvAMAGIC(pat) || SvAMAGIC(msv)) && - (sv = amagic_call(pat, msv, concat_amg, AMGf_assign))) - { - sv_setsv(pat, sv); - /* overloading involved: all bets are off over literal - * code. Pretend we haven't seen it */ - if (n) - pRExC_state->code_blocks->count -= n; - n = 0; - } - else { - /* ... or failing that, try "" overload */ - while (SvAMAGIC(msv) - && (sv = AMG_CALLunary(msv, string_amg)) - && sv != msv - && !( SvROK(msv) - && SvROK(sv) - && SvRV(msv) == SvRV(sv)) - ) { - msv = sv; - SvGETMAGIC(msv); - } - if (SvROK(msv) && SvTYPE(SvRV(msv)) == SVt_REGEXP) - msv = SvRV(msv); - - if (pat) { - /* this is a partially unrolled - * sv_catsv_nomg(pat, msv); - * that allows us to adjust code block indices if - * needed */ - STRLEN dlen; - char *dst = SvPV_force_nomg(pat, dlen); - orig_patlen = dlen; - if (SvUTF8(msv) && !SvUTF8(pat)) { - S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &dst, &dlen, n); - sv_setpvn(pat, dst, dlen); - SvUTF8_on(pat); - } - sv_catsv_nomg(pat, msv); - rx = msv; - } - else { - /* We have only one SV to process, but we need to verify - * it is properly null terminated or we will fail asserts - * later. In theory we probably shouldn't get such SV's, - * but if we do we should handle it gracefully. */ - if ( SvTYPE(msv) != SVt_PV || (SvLEN(msv) > SvCUR(msv) && *(SvEND(msv)) == 0) || SvIsCOW_shared_hash(msv) ) { - /* not a string, or a string with a trailing null */ - pat = msv; - } else { - /* a string with no trailing null, we need to copy it - * so it has a trailing null */ - pat = sv_2mortal(newSVsv(msv)); - } - } - - if (code) - pRExC_state->code_blocks->cb[n-1].end = SvCUR(pat)-1; - } - - /* extract any code blocks within any embedded qr//'s */ - if (rx && SvTYPE(rx) == SVt_REGEXP - && RX_ENGINE((REGEXP*)rx)->op_comp) - { - - RXi_GET_DECL(ReANY((REGEXP *)rx), ri); - if (ri->code_blocks && ri->code_blocks->count) { - int i; - /* the presence of an embedded qr// with code means - * we should always recompile: the text of the - * qr// may not have changed, but it may be a - * different closure than last time */ - *recompile_p = 1; - if (pRExC_state->code_blocks) { - int new_count = pRExC_state->code_blocks->count - + ri->code_blocks->count; - Renew(pRExC_state->code_blocks->cb, - new_count, struct reg_code_block); - pRExC_state->code_blocks->count = new_count; - } - else - pRExC_state->code_blocks = S_alloc_code_blocks(aTHX_ - ri->code_blocks->count); - - for (i=0; i < ri->code_blocks->count; i++) { - struct reg_code_block *src, *dst; - STRLEN offset = orig_patlen - + ReANY((REGEXP *)rx)->pre_prefix; - assert(n < pRExC_state->code_blocks->count); - src = &ri->code_blocks->cb[i]; - dst = &pRExC_state->code_blocks->cb[n]; - dst->start = src->start + offset; - dst->end = src->end + offset; - dst->block = src->block; - dst->src_regex = (REGEXP*) SvREFCNT_inc( (SV*) - src->src_regex - ? src->src_regex - : (REGEXP*)rx); - n++; - } - } - } - } - /* avoid calling magic multiple times on a single element e.g. =~ $qr */ - if (alloced) - SvSETMAGIC(pat); - - return pat; -} - - - -/* see if there are any run-time code blocks in the pattern. - * False positives are allowed */ - -static bool -S_has_runtime_code(pTHX_ RExC_state_t * const pRExC_state, - char *pat, STRLEN plen) -{ - int n = 0; - STRLEN s; - - PERL_UNUSED_CONTEXT; - - for (s = 0; s < plen; s++) { - if ( pRExC_state->code_blocks - && n < pRExC_state->code_blocks->count - && s == pRExC_state->code_blocks->cb[n].start) - { - s = pRExC_state->code_blocks->cb[n].end; - n++; - continue; - } - /* TODO ideally should handle [..], (#..), /#.../x to reduce false - * positives here */ - if (pat[s] == '(' && s+2 <= plen && pat[s+1] == '?' && - (pat[s+2] == '{' - || (s + 2 <= plen && pat[s+2] == '?' && pat[s+3] == '{')) - ) - return 1; - } - return 0; -} - -/* Handle run-time code blocks. We will already have compiled any direct - * or indirect literal code blocks. Now, take the pattern 'pat' and make a - * copy of it, but with any literal code blocks blanked out and - * appropriate chars escaped; then feed it into - * - * eval "qr'modified_pattern'" - * - * For example, - * - * a\bc(?{"this was literal"})def'ghi\\jkl(?{"this is runtime"})mno - * - * becomes - * - * qr'a\\bc_______________________def\'ghi\\\\jkl(?{"this is runtime"})mno' - * - * After eval_sv()-ing that, grab any new code blocks from the returned qr - * and merge them with any code blocks of the original regexp. - * - * If the pat is non-UTF8, while the evalled qr is UTF8, don't merge; - * instead, just save the qr and return FALSE; this tells our caller that - * the original pattern needs upgrading to utf8. - */ - -static bool -S_compile_runtime_code(pTHX_ RExC_state_t * const pRExC_state, - char *pat, STRLEN plen) -{ - SV *qr; - - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - if (pRExC_state->runtime_code_qr) { - /* this is the second time we've been called; this should - * only happen if the main pattern got upgraded to utf8 - * during compilation; re-use the qr we compiled first time - * round (which should be utf8 too) - */ - qr = pRExC_state->runtime_code_qr; - pRExC_state->runtime_code_qr = NULL; - assert(RExC_utf8 && SvUTF8(qr)); - } - else { - int n = 0; - STRLEN s; - char *p, *newpat; - int newlen = plen + 7; /* allow for "qr''xx\0" extra chars */ - SV *sv, *qr_ref; - dSP; - - /* determine how many extra chars we need for ' and \ escaping */ - for (s = 0; s < plen; s++) { - if (pat[s] == '\'' || pat[s] == '\\') - newlen++; - } - - Newx(newpat, newlen, char); - p = newpat; - *p++ = 'q'; *p++ = 'r'; *p++ = '\''; - - for (s = 0; s < plen; s++) { - if ( pRExC_state->code_blocks - && n < pRExC_state->code_blocks->count - && s == pRExC_state->code_blocks->cb[n].start) - { - /* blank out literal code block so that they aren't - * recompiled: eg change from/to: - * /(?{xyz})/ - * /(?=====)/ - * and - * /(??{xyz})/ - * /(?======)/ - * and - * /(?(?{xyz}))/ - * /(?(?=====))/ - */ - assert(pat[s] == '('); - assert(pat[s+1] == '?'); - *p++ = '('; - *p++ = '?'; - s += 2; - while (s < pRExC_state->code_blocks->cb[n].end) { - *p++ = '='; - s++; - } - *p++ = ')'; - n++; - continue; - } - if (pat[s] == '\'' || pat[s] == '\\') - *p++ = '\\'; - *p++ = pat[s]; - } - *p++ = '\''; - if (pRExC_state->pm_flags & RXf_PMf_EXTENDED) { - *p++ = 'x'; - if (pRExC_state->pm_flags & RXf_PMf_EXTENDED_MORE) { - *p++ = 'x'; - } - } - *p++ = '\0'; - DEBUG_COMPILE_r({ - Perl_re_printf( aTHX_ - "%sre-parsing pattern for runtime code:%s %s\n", - PL_colors[4], PL_colors[5], newpat); - }); - - sv = newSVpvn_flags(newpat, p-newpat-1, RExC_utf8 ? SVf_UTF8 : 0); - Safefree(newpat); - - ENTER; - SAVETMPS; - save_re_context(); - PUSHSTACKi(PERLSI_REQUIRE); - /* G_RE_REPARSING causes the toker to collapse \\ into \ when - * parsing qr''; normally only q'' does this. It also alters - * hints handling */ - eval_sv(sv, G_SCALAR|G_RE_REPARSING); - SvREFCNT_dec_NN(sv); - SPAGAIN; - qr_ref = POPs; - PUTBACK; - { - SV * const errsv = ERRSV; - if (SvTRUE_NN(errsv)) - /* use croak_sv ? */ - Perl_croak_nocontext("%" SVf, SVfARG(errsv)); - } - assert(SvROK(qr_ref)); - qr = SvRV(qr_ref); - assert(SvTYPE(qr) == SVt_REGEXP && RX_ENGINE((REGEXP*)qr)->op_comp); - /* the leaving below frees the tmp qr_ref. - * Give qr a life of its own */ - SvREFCNT_inc(qr); - POPSTACK; - FREETMPS; - LEAVE; - - } - - if (!RExC_utf8 && SvUTF8(qr)) { - /* first time through; the pattern got upgraded; save the - * qr for the next time through */ - assert(!pRExC_state->runtime_code_qr); - pRExC_state->runtime_code_qr = qr; - return 0; - } - - - /* extract any code blocks within the returned qr// */ - - - /* merge the main (r1) and run-time (r2) code blocks into one */ - { - RXi_GET_DECL(ReANY((REGEXP *)qr), r2); - struct reg_code_block *new_block, *dst; - RExC_state_t * const r1 = pRExC_state; /* convenient alias */ - int i1 = 0, i2 = 0; - int r1c, r2c; - - if (!r2->code_blocks || !r2->code_blocks->count) /* we guessed wrong */ - { - SvREFCNT_dec_NN(qr); - return 1; - } - - if (!r1->code_blocks) - r1->code_blocks = S_alloc_code_blocks(aTHX_ 0); - - r1c = r1->code_blocks->count; - r2c = r2->code_blocks->count; - - Newx(new_block, r1c + r2c, struct reg_code_block); - - dst = new_block; - - while (i1 < r1c || i2 < r2c) { - struct reg_code_block *src; - bool is_qr = 0; - - if (i1 == r1c) { - src = &r2->code_blocks->cb[i2++]; - is_qr = 1; - } - else if (i2 == r2c) - src = &r1->code_blocks->cb[i1++]; - else if ( r1->code_blocks->cb[i1].start - < r2->code_blocks->cb[i2].start) - { - src = &r1->code_blocks->cb[i1++]; - assert(src->end < r2->code_blocks->cb[i2].start); - } - else { - assert( r1->code_blocks->cb[i1].start - > r2->code_blocks->cb[i2].start); - src = &r2->code_blocks->cb[i2++]; - is_qr = 1; - assert(src->end < r1->code_blocks->cb[i1].start); - } - - assert(pat[src->start] == '('); - assert(pat[src->end] == ')'); - dst->start = src->start; - dst->end = src->end; - dst->block = src->block; - dst->src_regex = is_qr ? (REGEXP*) SvREFCNT_inc( (SV*) qr) - : src->src_regex; - dst++; - } - r1->code_blocks->count += r2c; - Safefree(r1->code_blocks->cb); - r1->code_blocks->cb = new_block; - } - - SvREFCNT_dec_NN(qr); - return 1; -} - - -STATIC bool -S_setup_longest(pTHX_ RExC_state_t *pRExC_state, - struct reg_substr_datum *rsd, - struct scan_data_substrs *sub, - STRLEN longest_length) -{ - /* This is the common code for setting up the floating and fixed length - * string data extracted from Perl_re_op_compile() below. Returns a boolean - * as to whether succeeded or not */ - - I32 t; - SSize_t ml; - bool eol = cBOOL(sub->flags & SF_BEFORE_EOL); - bool meol = cBOOL(sub->flags & SF_BEFORE_MEOL); - - if (! (longest_length - || (eol /* Can't have SEOL and MULTI */ - && (! meol || (RExC_flags & RXf_PMf_MULTILINE))) - ) - /* See comments for join_exact for why REG_UNFOLDED_MULTI_SEEN */ - || (RExC_seen & REG_UNFOLDED_MULTI_SEEN)) - { - return FALSE; - } - - /* copy the information about the longest from the reg_scan_data - over to the program. */ - if (SvUTF8(sub->str)) { - rsd->substr = NULL; - rsd->utf8_substr = sub->str; - } else { - rsd->substr = sub->str; - rsd->utf8_substr = NULL; - } - /* end_shift is how many chars that must be matched that - follow this item. We calculate it ahead of time as once the - lookbehind offset is added in we lose the ability to correctly - calculate it.*/ - ml = sub->minlenp ? *(sub->minlenp) : (SSize_t)longest_length; - rsd->end_shift = ml - sub->min_offset - - longest_length - /* XXX SvTAIL is always false here - did you mean FBMcf_TAIL - * intead? - DAPM - + (SvTAIL(sub->str) != 0) - */ - + sub->lookbehind; - - t = (eol/* Can't have SEOL and MULTI */ - && (! meol || (RExC_flags & RXf_PMf_MULTILINE))); - fbm_compile(sub->str, t ? FBMcf_TAIL : 0); - - return TRUE; -} - -STATIC void -S_set_regex_pv(pTHX_ RExC_state_t *pRExC_state, REGEXP *Rx) -{ - /* Calculates and sets in the compiled pattern 'Rx' the string to compile, - * properly wrapped with the right modifiers */ - - bool has_p = ((RExC_rx->extflags & RXf_PMf_KEEPCOPY) == RXf_PMf_KEEPCOPY); - bool has_charset = RExC_utf8 || (get_regex_charset(RExC_rx->extflags) - != REGEX_DEPENDS_CHARSET); - - /* The caret is output if there are any defaults: if not all the STD - * flags are set, or if no character set specifier is needed */ - bool has_default = - (((RExC_rx->extflags & RXf_PMf_STD_PMMOD) != RXf_PMf_STD_PMMOD) - || ! has_charset); - bool has_runon = ((RExC_seen & REG_RUN_ON_COMMENT_SEEN) - == REG_RUN_ON_COMMENT_SEEN); - U8 reganch = (U8)((RExC_rx->extflags & RXf_PMf_STD_PMMOD) - >> RXf_PMf_STD_PMMOD_SHIFT); - const char *fptr = STD_PAT_MODS; /*"msixxn"*/ - char *p; - STRLEN pat_len = RExC_precomp_end - RExC_precomp; - - /* We output all the necessary flags; we never output a minus, as all - * those are defaults, so are - * covered by the caret */ - const STRLEN wraplen = pat_len + has_p + has_runon - + has_default /* If needs a caret */ - + PL_bitcount[reganch] /* 1 char for each set standard flag */ - - /* If needs a character set specifier */ - + ((has_charset) ? MAX_CHARSET_NAME_LENGTH : 0) - + (sizeof("(?:)") - 1); - - PERL_ARGS_ASSERT_SET_REGEX_PV; - - /* make sure PL_bitcount bounds not exceeded */ - STATIC_ASSERT_STMT(sizeof(STD_PAT_MODS) <= 8); - - p = sv_grow(MUTABLE_SV(Rx), wraplen + 1); /* +1 for the ending NUL */ - SvPOK_on(Rx); - if (RExC_utf8) - SvFLAGS(Rx) |= SVf_UTF8; - *p++='('; *p++='?'; - - /* If a default, cover it using the caret */ - if (has_default) { - *p++= DEFAULT_PAT_MOD; - } - if (has_charset) { - STRLEN len; - const char* name; - - name = get_regex_charset_name(RExC_rx->extflags, &len); - if (strEQ(name, DEPENDS_PAT_MODS)) { /* /d under UTF-8 => /u */ - assert(RExC_utf8); - name = UNICODE_PAT_MODS; - len = sizeof(UNICODE_PAT_MODS) - 1; - } - Copy(name, p, len, char); - p += len; - } - if (has_p) - *p++ = KEEPCOPY_PAT_MOD; /*'p'*/ - { - char ch; - while((ch = *fptr++)) { - if(reganch & 1) - *p++ = ch; - reganch >>= 1; - } - } - - *p++ = ':'; - Copy(RExC_precomp, p, pat_len, char); - assert ((RX_WRAPPED(Rx) - p) < 16); - RExC_rx->pre_prefix = p - RX_WRAPPED(Rx); - p += pat_len; - - /* Adding a trailing \n causes this to compile properly: - my $R = qr / A B C # D E/x; /($R)/ - Otherwise the parens are considered part of the comment */ - if (has_runon) - *p++ = '\n'; - *p++ = ')'; - *p = 0; - SvCUR_set(Rx, p - RX_WRAPPED(Rx)); -} - -/* - * Perl_re_op_compile - the perl internal RE engine's function to compile a - * regular expression into internal code. - * The pattern may be passed either as: - * a list of SVs (patternp plus pat_count) - * a list of OPs (expr) - * If both are passed, the SV list is used, but the OP list indicates - * which SVs are actually pre-compiled code blocks - * - * The SVs in the list have magic and qr overloading applied to them (and - * the list may be modified in-place with replacement SVs in the latter - * case). - * - * If the pattern hasn't changed from old_re, then old_re will be - * returned. - * - * eng is the current engine. If that engine has an op_comp method, then - * handle directly (i.e. we assume that op_comp was us); otherwise, just - * do the initial concatenation of arguments and pass on to the external - * engine. - * - * If is_bare_re is not null, set it to a boolean indicating whether the - * arg list reduced (after overloading) to a single bare regex which has - * been returned (i.e. /$qr/). - * - * orig_rx_flags contains RXf_* flags. See perlreapi.pod for more details. - * - * pm_flags contains the PMf_* flags, typically based on those from the - * pm_flags field of the related PMOP. Currently we're only interested in - * PMf_HAS_CV, PMf_IS_QR, PMf_USE_RE_EVAL, PMf_WILDCARD. - * - * For many years this code had an initial sizing pass that calculated - * (sometimes incorrectly, leading to security holes) the size needed for the - * compiled pattern. That was changed by commit - * 7c932d07cab18751bfc7515b4320436273a459e2 in 5.29, which reallocs the size, a - * node at a time, as parsing goes along. Patches welcome to fix any obsolete - * references to this sizing pass. - * - * Now, an initial crude guess as to the size needed is made, based on the - * length of the pattern. Patches welcome to improve that guess. That amount - * of space is malloc'd and then immediately freed, and then clawed back node - * by node. This design is to minimze, to the extent possible, memory churn - * when doing the reallocs. - * - * A separate parentheses counting pass may be needed in some cases. - * (Previously the sizing pass did this.) Patches welcome to reduce the number - * of these cases. - * - * The existence of a sizing pass necessitated design decisions that are no - * longer needed. There are potential areas of simplification. - * - * Beware that the optimization-preparation code in here knows about some - * of the structure of the compiled regexp. [I'll say.] - */ - -REGEXP * -Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count, - OP *expr, const regexp_engine* eng, REGEXP *old_re, - bool *is_bare_re, const U32 orig_rx_flags, const U32 pm_flags) -{ - REGEXP *Rx; /* Capital 'R' means points to a REGEXP */ - STRLEN plen; - char *exp; - regnode *scan; - I32 flags; - SSize_t minlen = 0; - U32 rx_flags; - SV *pat; - SV** new_patternp = patternp; - - /* these are all flags - maybe they should be turned - * into a single int with different bit masks */ - I32 sawlookahead = 0; - I32 sawplus = 0; - I32 sawopen = 0; - I32 sawminmod = 0; - - regex_charset initial_charset = get_regex_charset(orig_rx_flags); - bool recompile = 0; - bool runtime_code = 0; - scan_data_t data; - RExC_state_t RExC_state; - RExC_state_t * const pRExC_state = &RExC_state; -#ifdef TRIE_STUDY_OPT - /* search for "restudy" in this file for a detailed explanation */ - int restudied = 0; - RExC_state_t copyRExC_state; -#endif - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - PERL_ARGS_ASSERT_RE_OP_COMPILE; - - DEBUG_r(if (!PL_colorset) reginitcolors()); - - - pRExC_state->warn_text = NULL; - pRExC_state->unlexed_names = NULL; - pRExC_state->code_blocks = NULL; - - if (is_bare_re) - *is_bare_re = FALSE; - - if (expr && (expr->op_type == OP_LIST || - (expr->op_type == OP_NULL && expr->op_targ == OP_LIST))) { - /* allocate code_blocks if needed */ - OP *o; - int ncode = 0; - - for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) - if (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL)) - ncode++; /* count of DO blocks */ - - if (ncode) - pRExC_state->code_blocks = S_alloc_code_blocks(aTHX_ ncode); - } - - if (!pat_count) { - /* compile-time pattern with just OP_CONSTs and DO blocks */ - - int n; - OP *o; - - /* find how many CONSTs there are */ - assert(expr); - n = 0; - if (expr->op_type == OP_CONST) - n = 1; - else - for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) { - if (o->op_type == OP_CONST) - n++; - } - - /* fake up an SV array */ - - assert(!new_patternp); - Newx(new_patternp, n, SV*); - SAVEFREEPV(new_patternp); - pat_count = n; - - n = 0; - if (expr->op_type == OP_CONST) - new_patternp[n] = cSVOPx_sv(expr); - else - for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) { - if (o->op_type == OP_CONST) - new_patternp[n++] = cSVOPo_sv; - } - - } - - DEBUG_PARSE_r(Perl_re_printf( aTHX_ - "Assembling pattern from %d elements%s\n", pat_count, - orig_rx_flags & RXf_SPLIT ? " for split" : "")); - - /* set expr to the first arg op */ - - if (pRExC_state->code_blocks && pRExC_state->code_blocks->count - && expr->op_type != OP_CONST) - { - expr = cLISTOPx(expr)->op_first; - assert( expr->op_type == OP_PUSHMARK - || (expr->op_type == OP_NULL && expr->op_targ == OP_PUSHMARK) - || expr->op_type == OP_PADRANGE); - expr = OpSIBLING(expr); - } - - pat = S_concat_pat(aTHX_ pRExC_state, NULL, new_patternp, pat_count, - expr, &recompile, NULL); - - /* handle bare (possibly after overloading) regex: foo =~ $re */ - { - SV *re = pat; - if (SvROK(re)) - re = SvRV(re); - if (SvTYPE(re) == SVt_REGEXP) { - if (is_bare_re) - *is_bare_re = TRUE; - SvREFCNT_inc(re); - DEBUG_PARSE_r(Perl_re_printf( aTHX_ - "Precompiled pattern%s\n", - orig_rx_flags & RXf_SPLIT ? " for split" : "")); - - return (REGEXP*)re; - } - } - - exp = SvPV_nomg(pat, plen); - - if (!eng->op_comp) { - if ((SvUTF8(pat) && IN_BYTES) - || SvGMAGICAL(pat) || SvAMAGIC(pat)) - { - /* make a temporary copy; either to convert to bytes, - * or to avoid repeating get-magic / overloaded stringify */ - pat = newSVpvn_flags(exp, plen, SVs_TEMP | - (IN_BYTES ? 0 : SvUTF8(pat))); - } - return CALLREGCOMP_ENG(eng, pat, orig_rx_flags); - } - - /* ignore the utf8ness if the pattern is 0 length */ - RExC_utf8 = RExC_orig_utf8 = (plen == 0 || IN_BYTES) ? 0 : SvUTF8(pat); - RExC_uni_semantics = 0; - RExC_contains_locale = 0; - RExC_strict = cBOOL(pm_flags & RXf_PMf_STRICT); - RExC_in_script_run = 0; - RExC_study_started = 0; - pRExC_state->runtime_code_qr = NULL; - RExC_frame_head= NULL; - RExC_frame_last= NULL; - RExC_frame_count= 0; - RExC_latest_warn_offset = 0; - RExC_use_BRANCHJ = 0; - RExC_warned_WARN_EXPERIMENTAL__VLB = 0; - RExC_warned_WARN_EXPERIMENTAL__REGEX_SETS = 0; - RExC_total_parens = 0; - RExC_open_parens = NULL; - RExC_close_parens = NULL; - RExC_paren_names = NULL; - RExC_size = 0; - RExC_seen_d_op = FALSE; -#ifdef DEBUGGING - RExC_paren_name_list = NULL; -#endif - - DEBUG_r({ - RExC_mysv1= sv_newmortal(); - RExC_mysv2= sv_newmortal(); - }); - - DEBUG_COMPILE_r({ - SV *dsv= sv_newmortal(); - RE_PV_QUOTED_DECL(s, RExC_utf8, dsv, exp, plen, PL_dump_re_max_len); - Perl_re_printf( aTHX_ "%sCompiling REx%s %s\n", - PL_colors[4], PL_colors[5], s); - }); - - /* we jump here if we have to recompile, e.g., from upgrading the pattern - * to utf8 */ - - if ((pm_flags & PMf_USE_RE_EVAL) - /* this second condition covers the non-regex literal case, - * i.e. $foo =~ '(?{})'. */ - || (IN_PERL_COMPILETIME && (PL_hints & HINT_RE_EVAL)) - ) - runtime_code = S_has_runtime_code(aTHX_ pRExC_state, exp, plen); - - redo_parse: - /* return old regex if pattern hasn't changed */ - /* XXX: note in the below we have to check the flags as well as the - * pattern. - * - * Things get a touch tricky as we have to compare the utf8 flag - * independently from the compile flags. */ - - if ( old_re - && !recompile - && !!RX_UTF8(old_re) == !!RExC_utf8 - && ( RX_COMPFLAGS(old_re) == ( orig_rx_flags & RXf_PMf_FLAGCOPYMASK ) ) - && RX_PRECOMP(old_re) - && RX_PRELEN(old_re) == plen - && memEQ(RX_PRECOMP(old_re), exp, plen) - && !runtime_code /* with runtime code, always recompile */ ) - { - DEBUG_COMPILE_r({ - SV *dsv= sv_newmortal(); - RE_PV_QUOTED_DECL(s, RExC_utf8, dsv, exp, plen, PL_dump_re_max_len); - Perl_re_printf( aTHX_ "%sSkipping recompilation of unchanged REx%s %s\n", - PL_colors[4], PL_colors[5], s); - }); - return old_re; - } - - /* Allocate the pattern's SV */ - RExC_rx_sv = Rx = (REGEXP*) newSV_type(SVt_REGEXP); - RExC_rx = ReANY(Rx); - if ( RExC_rx == NULL ) - FAIL("Regexp out of space"); - - rx_flags = orig_rx_flags; - - if ( toUSE_UNI_CHARSET_NOT_DEPENDS - && initial_charset == REGEX_DEPENDS_CHARSET) - { - - /* Set to use unicode semantics if the pattern is in utf8 and has the - * 'depends' charset specified, as it means unicode when utf8 */ - set_regex_charset(&rx_flags, REGEX_UNICODE_CHARSET); - RExC_uni_semantics = 1; - } - - RExC_pm_flags = pm_flags; - - if (runtime_code) { - assert(TAINTING_get || !TAINT_get); - if (TAINT_get) - Perl_croak(aTHX_ "Eval-group in insecure regular expression"); - - if (!S_compile_runtime_code(aTHX_ pRExC_state, exp, plen)) { - /* whoops, we have a non-utf8 pattern, whilst run-time code - * got compiled as utf8. Try again with a utf8 pattern */ - S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &exp, &plen, - pRExC_state->code_blocks ? pRExC_state->code_blocks->count : 0); - goto redo_parse; - } - } - assert(!pRExC_state->runtime_code_qr); - - RExC_sawback = 0; - - RExC_seen = 0; - RExC_maxlen = 0; - RExC_in_lookaround = 0; - RExC_seen_zerolen = *exp == '^' ? -1 : 0; - RExC_recode_x_to_native = 0; - RExC_in_multi_char_class = 0; - - RExC_start = RExC_copy_start_in_constructed = RExC_copy_start_in_input = RExC_precomp = exp; - RExC_precomp_end = RExC_end = exp + plen; - RExC_nestroot = 0; - RExC_whilem_seen = 0; - RExC_end_op = NULL; - RExC_recurse = NULL; - RExC_study_chunk_recursed = NULL; - RExC_study_chunk_recursed_bytes= 0; - RExC_recurse_count = 0; - RExC_sets_depth = 0; - pRExC_state->code_index = 0; - - /* Initialize the string in the compiled pattern. This is so that there is - * something to output if necessary */ - set_regex_pv(pRExC_state, Rx); - - DEBUG_PARSE_r({ - Perl_re_printf( aTHX_ - "Starting parse and generation\n"); - RExC_lastnum=0; - RExC_lastparse=NULL; - }); - - /* Allocate space and zero-initialize. Note, the two step process - of zeroing when in debug mode, thus anything assigned has to - happen after that */ - if (! RExC_size) { - - /* On the first pass of the parse, we guess how big this will be. Then - * we grow in one operation to that amount and then give it back. As - * we go along, we re-allocate what we need. - * - * XXX Currently the guess is essentially that the pattern will be an - * EXACT node with one byte input, one byte output. This is crude, and - * better heuristics are welcome. - * - * On any subsequent passes, we guess what we actually computed in the - * latest earlier pass. Such a pass probably didn't complete so is - * missing stuff. We could improve those guesses by knowing where the - * parse stopped, and use the length so far plus apply the above - * assumption to what's left. */ - RExC_size = STR_SZ(RExC_end - RExC_start); - } - - Newxc(RExC_rxi, sizeof(regexp_internal) + RExC_size, char, regexp_internal); - if ( RExC_rxi == NULL ) - FAIL("Regexp out of space"); - - Zero(RExC_rxi, sizeof(regexp_internal) + RExC_size, char); - RXi_SET( RExC_rx, RExC_rxi ); - - /* We start from 0 (over from 0 in the case this is a reparse. The first - * node parsed will give back any excess memory we have allocated so far). - * */ - RExC_size = 0; - - /* non-zero initialization begins here */ - RExC_rx->engine= eng; - RExC_rx->extflags = rx_flags; - RXp_COMPFLAGS(RExC_rx) = orig_rx_flags & RXf_PMf_FLAGCOPYMASK; - - if (pm_flags & PMf_IS_QR) { - RExC_rxi->code_blocks = pRExC_state->code_blocks; - if (RExC_rxi->code_blocks) { - RExC_rxi->code_blocks->refcnt++; - } - } - - RExC_rx->intflags = 0; - - RExC_flags = rx_flags; /* don't let top level (?i) bleed */ - RExC_parse_set(exp); - - /* This NUL is guaranteed because the pattern comes from an SV*, and the sv - * code makes sure the final byte is an uncounted NUL. But should this - * ever not be the case, lots of things could read beyond the end of the - * buffer: loops like - * while(isFOO(*RExC_parse)) RExC_parse_inc_by(1); - * strchr(RExC_parse, "foo"); - * etc. So it is worth noting. */ - assert(*RExC_end == '\0'); - - RExC_naughty = 0; - RExC_npar = 1; - RExC_parens_buf_size = 0; - RExC_emit_start = RExC_rxi->program; - pRExC_state->code_index = 0; - - *((char*) RExC_emit_start) = (char) REG_MAGIC; - RExC_emit = 1; - - /* Do the parse */ - if (reg(pRExC_state, 0, &flags, 1)) { - - /* Success!, But we may need to redo the parse knowing how many parens - * there actually are */ - if (IN_PARENS_PASS) { - flags |= RESTART_PARSE; - } - - /* We have that number in RExC_npar */ - RExC_total_parens = RExC_npar; - } - else if (! MUST_RESTART(flags)) { - ReREFCNT_dec(Rx); - Perl_croak(aTHX_ "panic: reg returned failure to re_op_compile, flags=%#" UVxf, (UV) flags); - } - - /* Here, we either have success, or we have to redo the parse for some reason */ - if (MUST_RESTART(flags)) { - - /* It's possible to write a regexp in ascii that represents Unicode - codepoints outside of the byte range, such as via \x{100}. If we - detect such a sequence we have to convert the entire pattern to utf8 - and then recompile, as our sizing calculation will have been based - on 1 byte == 1 character, but we will need to use utf8 to encode - at least some part of the pattern, and therefore must convert the whole - thing. - -- dmq */ - if (flags & NEED_UTF8) { - - /* We have stored the offset of the final warning output so far. - * That must be adjusted. Any variant characters between the start - * of the pattern and this warning count for 2 bytes in the final, - * so just add them again */ - if (UNLIKELY(RExC_latest_warn_offset > 0)) { - RExC_latest_warn_offset += - variant_under_utf8_count((U8 *) exp, (U8 *) exp - + RExC_latest_warn_offset); - } - S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &exp, &plen, - pRExC_state->code_blocks ? pRExC_state->code_blocks->count : 0); - DEBUG_PARSE_r(Perl_re_printf( aTHX_ "Need to redo parse after upgrade\n")); - } - else { - DEBUG_PARSE_r(Perl_re_printf( aTHX_ "Need to redo parse\n")); - } - - if (ALL_PARENS_COUNTED) { - /* Make enough room for all the known parens, and zero it */ - Renew(RExC_open_parens, RExC_total_parens, regnode_offset); - Zero(RExC_open_parens, RExC_total_parens, regnode_offset); - RExC_open_parens[0] = 1; /* +1 for REG_MAGIC */ - - Renew(RExC_close_parens, RExC_total_parens, regnode_offset); - Zero(RExC_close_parens, RExC_total_parens, regnode_offset); - } - else { /* Parse did not complete. Reinitialize the parentheses - structures */ - RExC_total_parens = 0; - if (RExC_open_parens) { - Safefree(RExC_open_parens); - RExC_open_parens = NULL; - } - if (RExC_close_parens) { - Safefree(RExC_close_parens); - RExC_close_parens = NULL; - } - } - - /* Clean up what we did in this parse */ - SvREFCNT_dec_NN(RExC_rx_sv); - - goto redo_parse; - } - - /* Here, we have successfully parsed and generated the pattern's program - * for the regex engine. We are ready to finish things up and look for - * optimizations. */ - - /* Update the string to compile, with correct modifiers, etc */ - set_regex_pv(pRExC_state, Rx); - - RExC_rx->nparens = RExC_total_parens - 1; - - /* Uses the upper 4 bits of the FLAGS field, so keep within that size */ - if (RExC_whilem_seen > 15) - RExC_whilem_seen = 15; - - DEBUG_PARSE_r({ - Perl_re_printf( aTHX_ - "Required size %" IVdf " nodes\n", (IV)RExC_size); - RExC_lastnum=0; - RExC_lastparse=NULL; - }); - - SetProgLen(RExC_rxi,RExC_size); - - DEBUG_DUMP_PRE_OPTIMIZE_r({ - SV * const sv = sv_newmortal(); - RXi_GET_DECL(RExC_rx, ri); - DEBUG_RExC_seen(); - Perl_re_printf( aTHX_ "Program before optimization:\n"); - - (void)dumpuntil(RExC_rx, ri->program, ri->program + 1, NULL, NULL, - sv, 0, 0); - }); - - DEBUG_OPTIMISE_r( - Perl_re_printf( aTHX_ "Starting post parse optimization\n"); - ); - - /* XXXX To minimize changes to RE engine we always allocate - 3-units-long substrs field. */ - Newx(RExC_rx->substrs, 1, struct reg_substr_data); - if (RExC_recurse_count) { - Newx(RExC_recurse, RExC_recurse_count, regnode *); - SAVEFREEPV(RExC_recurse); - } - - if (RExC_seen & REG_RECURSE_SEEN) { - /* Note, RExC_total_parens is 1 + the number of parens in a pattern. - * So its 1 if there are no parens. */ - RExC_study_chunk_recursed_bytes= (RExC_total_parens >> 3) + - ((RExC_total_parens & 0x07) != 0); - Newx(RExC_study_chunk_recursed, - RExC_study_chunk_recursed_bytes * RExC_total_parens, U8); - SAVEFREEPV(RExC_study_chunk_recursed); - } - - reStudy: - RExC_rx->minlen = minlen = sawlookahead = sawplus = sawopen = sawminmod = 0; - DEBUG_r( - RExC_study_chunk_recursed_count= 0; - ); - Zero(RExC_rx->substrs, 1, struct reg_substr_data); - if (RExC_study_chunk_recursed) { - Zero(RExC_study_chunk_recursed, - RExC_study_chunk_recursed_bytes * RExC_total_parens, U8); - } - - -#ifdef TRIE_STUDY_OPT - /* search for "restudy" in this file for a detailed explanation */ - if (!restudied) { - StructCopy(&zero_scan_data, &data, scan_data_t); - copyRExC_state = RExC_state; - } else { - U32 seen=RExC_seen; - DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "Restudying\n")); - - RExC_state = copyRExC_state; - if (seen & REG_TOP_LEVEL_BRANCHES_SEEN) - RExC_seen |= REG_TOP_LEVEL_BRANCHES_SEEN; - else - RExC_seen &= ~REG_TOP_LEVEL_BRANCHES_SEEN; - StructCopy(&zero_scan_data, &data, scan_data_t); - } -#else - StructCopy(&zero_scan_data, &data, scan_data_t); -#endif - - /* Dig out information for optimizations. */ - RExC_rx->extflags = RExC_flags; /* was pm_op */ - /*dmq: removed as part of de-PMOP: pm->op_pmflags = RExC_flags; */ - - if (UTF) - SvUTF8_on(Rx); /* Unicode in it? */ - RExC_rxi->regstclass = NULL; - if (RExC_naughty >= TOO_NAUGHTY) /* Probably an expensive pattern. */ - RExC_rx->intflags |= PREGf_NAUGHTY; - scan = RExC_rxi->program + 1; /* First BRANCH. */ - - /* testing for BRANCH here tells us whether there is "must appear" - data in the pattern. If there is then we can use it for optimisations */ - if (!(RExC_seen & REG_TOP_LEVEL_BRANCHES_SEEN)) { /* Only one top-level choice. - */ - SSize_t fake_deltap; - STRLEN longest_length[2]; - regnode_ssc ch_class; /* pointed to by data */ - int stclass_flag; - SSize_t last_close = 0; /* pointed to by data */ - regnode *first= scan; - regnode *first_next= regnext(first); - regnode *last_close_op= NULL; - int i; - - /* - * Skip introductions and multiplicators >= 1 - * so that we can extract the 'meat' of the pattern that must - * match in the large if() sequence following. - * NOTE that EXACT is NOT covered here, as it is normally - * picked up by the optimiser separately. - * - * This is unfortunate as the optimiser isnt handling lookahead - * properly currently. - * - */ - while ((OP(first) == OPEN && (sawopen = 1)) || - /* An OR of *one* alternative - should not happen now. */ - (OP(first) == BRANCH && OP(first_next) != BRANCH) || - /* for now we can't handle lookbehind IFMATCH*/ - (OP(first) == IFMATCH && !first->flags && (sawlookahead = 1)) || - (OP(first) == PLUS) || - (OP(first) == MINMOD) || - /* An {n,m} with n>0 */ - (PL_regkind[OP(first)] == CURLY && ARG1(first) > 0) || - (OP(first) == NOTHING && PL_regkind[OP(first_next)] != END )) - { - /* - * the only op that could be a regnode is PLUS, all the rest - * will be regnode_1 or regnode_2. - * - * (yves doesn't think this is true) - */ - if (OP(first) == PLUS) - sawplus = 1; - else { - if (OP(first) == MINMOD) - sawminmod = 1; - first += regarglen[OP(first)]; - } - first = NEXTOPER(first); - first_next= regnext(first); - } - - /* Starting-point info. */ - again: - DEBUG_PEEP("first:", first, 0, 0); - /* Ignore EXACT as we deal with it later. */ - if (PL_regkind[OP(first)] == EXACT) { - if (! isEXACTFish(OP(first))) { - NOOP; /* Empty, get anchored substr later. */ - } - else - RExC_rxi->regstclass = first; - } -#ifdef TRIE_STCLASS - else if (PL_regkind[OP(first)] == TRIE && - ((reg_trie_data *)RExC_rxi->data->data[ ARG(first) ])->minlen>0) - { - /* this can happen only on restudy - * Search for "restudy" in this file to find - * a comment with details. */ - RExC_rxi->regstclass = construct_ahocorasick_from_trie(pRExC_state, (regnode *)first, 0); - } -#endif - else if (REGNODE_SIMPLE(OP(first))) - RExC_rxi->regstclass = first; - else if (PL_regkind[OP(first)] == BOUND || - PL_regkind[OP(first)] == NBOUND) - RExC_rxi->regstclass = first; - else if (PL_regkind[OP(first)] == BOL) { - RExC_rx->intflags |= (OP(first) == MBOL - ? PREGf_ANCH_MBOL - : PREGf_ANCH_SBOL); - first = NEXTOPER(first); - goto again; - } - else if (OP(first) == GPOS) { - RExC_rx->intflags |= PREGf_ANCH_GPOS; - first = NEXTOPER(first); - goto again; - } - else if ((!sawopen || !RExC_sawback) && - !sawlookahead && - (OP(first) == STAR && - PL_regkind[OP(NEXTOPER(first))] == REG_ANY) && - !(RExC_rx->intflags & PREGf_ANCH) && !pRExC_state->code_blocks) - { - /* turn .* into ^.* with an implied $*=1 */ - const int type = - (OP(NEXTOPER(first)) == REG_ANY) - ? PREGf_ANCH_MBOL - : PREGf_ANCH_SBOL; - RExC_rx->intflags |= (type | PREGf_IMPLICIT); - first = NEXTOPER(first); - goto again; - } - if (sawplus && !sawminmod && !sawlookahead - && (!sawopen || !RExC_sawback) - && !pRExC_state->code_blocks) /* May examine pos and $& */ - /* x+ must match at the 1st pos of run of x's */ - RExC_rx->intflags |= PREGf_SKIP; - - /* Scan is after the zeroth branch, first is atomic matcher. */ -#ifdef TRIE_STUDY_OPT - /* search for "restudy" in this file for a detailed explanation */ - DEBUG_PARSE_r( - if (!restudied) - Perl_re_printf( aTHX_ "first at %" IVdf "\n", - (IV)(first - scan + 1)) - ); -#else - DEBUG_PARSE_r( - Perl_re_printf( aTHX_ "first at %" IVdf "\n", - (IV)(first - scan + 1)) - ); -#endif - - - /* - * If there's something expensive in the r.e., find the - * longest literal string that must appear and make it the - * regmust. Resolve ties in favor of later strings, since - * the regstart check works with the beginning of the r.e. - * and avoiding duplication strengthens checking. Not a - * strong reason, but sufficient in the absence of others. - * [Now we resolve ties in favor of the earlier string if - * it happens that c_offset_min has been invalidated, since the - * earlier string may buy us something the later one won't.] - */ - - data.substrs[0].str = newSVpvs(""); - data.substrs[1].str = newSVpvs(""); - data.last_found = newSVpvs(""); - data.cur_is_floating = 0; /* initially any found substring is fixed */ - ENTER_with_name("study_chunk"); - SAVEFREESV(data.substrs[0].str); - SAVEFREESV(data.substrs[1].str); - SAVEFREESV(data.last_found); - first = scan; - if (!RExC_rxi->regstclass) { - ssc_init(pRExC_state, &ch_class); - data.start_class = &ch_class; - stclass_flag = SCF_DO_STCLASS_AND; - } else /* XXXX Check for BOUND? */ - stclass_flag = 0; - data.last_closep = &last_close; - data.last_close_opp = &last_close_op; - - DEBUG_RExC_seen(); - /* - * MAIN ENTRY FOR study_chunk() FOR m/PATTERN/ - * (NO top level branches) - */ - minlen = study_chunk(pRExC_state, &first, &minlen, &fake_deltap, - scan + RExC_size, /* Up to end */ - &data, -1, 0, NULL, - SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag - | (restudied ? SCF_TRIE_DOING_RESTUDY : 0), - 0, TRUE); - /* search for "restudy" in this file for a detailed explanation - * of 'restudied' and SCF_TRIE_DOING_RESTUDY */ - - - CHECK_RESTUDY_GOTO_butfirst(LEAVE_with_name("study_chunk")); - - - if ( RExC_total_parens == 1 && !data.cur_is_floating - && data.last_start_min == 0 && data.last_end > 0 - && !RExC_seen_zerolen - && !(RExC_seen & REG_VERBARG_SEEN) - && !(RExC_seen & REG_GPOS_SEEN) - ){ - RExC_rx->extflags |= RXf_CHECK_ALL; - } - scan_commit(pRExC_state, &data,&minlen, 0); - - - /* XXX this is done in reverse order because that's the way the - * code was before it was parameterised. Don't know whether it - * actually needs doing in reverse order. DAPM */ - for (i = 1; i >= 0; i--) { - longest_length[i] = CHR_SVLEN(data.substrs[i].str); - - if ( !( i - && SvCUR(data.substrs[0].str) /* ok to leave SvCUR */ - && data.substrs[0].min_offset - == data.substrs[1].min_offset - && SvCUR(data.substrs[0].str) - == SvCUR(data.substrs[1].str) - ) - && S_setup_longest (aTHX_ pRExC_state, - &(RExC_rx->substrs->data[i]), - &(data.substrs[i]), - longest_length[i])) - { - RExC_rx->substrs->data[i].min_offset = - data.substrs[i].min_offset - data.substrs[i].lookbehind; - - RExC_rx->substrs->data[i].max_offset = data.substrs[i].max_offset; - /* Don't offset infinity */ - if (data.substrs[i].max_offset < OPTIMIZE_INFTY) - RExC_rx->substrs->data[i].max_offset -= data.substrs[i].lookbehind; - SvREFCNT_inc_simple_void_NN(data.substrs[i].str); - } - else { - RExC_rx->substrs->data[i].substr = NULL; - RExC_rx->substrs->data[i].utf8_substr = NULL; - longest_length[i] = 0; - } - } - - LEAVE_with_name("study_chunk"); - - if (RExC_rxi->regstclass - && (OP(RExC_rxi->regstclass) == REG_ANY || OP(RExC_rxi->regstclass) == SANY)) - RExC_rxi->regstclass = NULL; - - if ((!(RExC_rx->substrs->data[0].substr || RExC_rx->substrs->data[0].utf8_substr) - || RExC_rx->substrs->data[0].min_offset) - && stclass_flag - && ! (ANYOF_FLAGS(data.start_class) & SSC_MATCHES_EMPTY_STRING) - && is_ssc_worth_it(pRExC_state, data.start_class)) - { - const U32 n = add_data(pRExC_state, STR_WITH_LEN("f")); - - ssc_finalize(pRExC_state, data.start_class); - - Newx(RExC_rxi->data->data[n], 1, regnode_ssc); - StructCopy(data.start_class, - (regnode_ssc*)RExC_rxi->data->data[n], - regnode_ssc); - RExC_rxi->regstclass = (regnode*)RExC_rxi->data->data[n]; - RExC_rx->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */ - DEBUG_COMPILE_r({ SV *sv = sv_newmortal(); - regprop(RExC_rx, sv, (regnode*)data.start_class, NULL, pRExC_state); - Perl_re_printf( aTHX_ - "synthetic stclass \"%s\".\n", - SvPVX_const(sv));}); - data.start_class = NULL; - } - - /* A temporary algorithm prefers floated substr to fixed one of - * same length to dig more info. */ - i = (longest_length[0] <= longest_length[1]); - RExC_rx->substrs->check_ix = i; - RExC_rx->check_end_shift = RExC_rx->substrs->data[i].end_shift; - RExC_rx->check_substr = RExC_rx->substrs->data[i].substr; - RExC_rx->check_utf8 = RExC_rx->substrs->data[i].utf8_substr; - RExC_rx->check_offset_min = RExC_rx->substrs->data[i].min_offset; - RExC_rx->check_offset_max = RExC_rx->substrs->data[i].max_offset; - if (!i && (RExC_rx->intflags & (PREGf_ANCH_SBOL|PREGf_ANCH_GPOS))) - RExC_rx->intflags |= PREGf_NOSCAN; - - if ((RExC_rx->check_substr || RExC_rx->check_utf8) ) { - RExC_rx->extflags |= RXf_USE_INTUIT; - if (SvTAIL(RExC_rx->check_substr ? RExC_rx->check_substr : RExC_rx->check_utf8)) - RExC_rx->extflags |= RXf_INTUIT_TAIL; - } - - /* XXX Unneeded? dmq (shouldn't as this is handled elsewhere) - if ( (STRLEN)minlen < longest_length[1] ) - minlen= longest_length[1]; - if ( (STRLEN)minlen < longest_length[0] ) - minlen= longest_length[0]; - */ - } - else { - /* Several toplevels. Best we can is to set minlen. */ - SSize_t fake_deltap; - regnode_ssc ch_class; - SSize_t last_close = 0; - regnode *last_close_op = NULL; - - DEBUG_PARSE_r(Perl_re_printf( aTHX_ "\nMulti Top Level\n")); - - scan = RExC_rxi->program + 1; - ssc_init(pRExC_state, &ch_class); - data.start_class = &ch_class; - data.last_closep = &last_close; - data.last_close_opp = &last_close_op; - - DEBUG_RExC_seen(); - /* - * MAIN ENTRY FOR study_chunk() FOR m/P1|P2|.../ - * (patterns WITH top level branches) - */ - minlen = study_chunk(pRExC_state, - &scan, &minlen, &fake_deltap, scan + RExC_size, &data, -1, 0, NULL, - SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS|(restudied - ? SCF_TRIE_DOING_RESTUDY - : 0), - 0, TRUE); - /* search for "restudy" in this file for a detailed explanation - * of 'restudied' and SCF_TRIE_DOING_RESTUDY */ - - CHECK_RESTUDY_GOTO_butfirst(NOOP); - - RExC_rx->check_substr = NULL; - RExC_rx->check_utf8 = NULL; - RExC_rx->substrs->data[0].substr = NULL; - RExC_rx->substrs->data[0].utf8_substr = NULL; - RExC_rx->substrs->data[1].substr = NULL; - RExC_rx->substrs->data[1].utf8_substr = NULL; - - if (! (ANYOF_FLAGS(data.start_class) & SSC_MATCHES_EMPTY_STRING) - && is_ssc_worth_it(pRExC_state, data.start_class)) - { - const U32 n = add_data(pRExC_state, STR_WITH_LEN("f")); - - ssc_finalize(pRExC_state, data.start_class); - - Newx(RExC_rxi->data->data[n], 1, regnode_ssc); - StructCopy(data.start_class, - (regnode_ssc*)RExC_rxi->data->data[n], - regnode_ssc); - RExC_rxi->regstclass = (regnode*)RExC_rxi->data->data[n]; - RExC_rx->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */ - DEBUG_COMPILE_r({ SV* sv = sv_newmortal(); - regprop(RExC_rx, sv, (regnode*)data.start_class, NULL, pRExC_state); - Perl_re_printf( aTHX_ - "synthetic stclass \"%s\".\n", - SvPVX_const(sv));}); - data.start_class = NULL; - } - } - - if (RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN) { - RExC_rx->extflags |= RXf_UNBOUNDED_QUANTIFIER_SEEN; - RExC_rx->maxlen = REG_INFTY; - } - else { - RExC_rx->maxlen = RExC_maxlen; - } - - /* Guard against an embedded (?=) or (?<=) with a longer minlen than - the "real" pattern. */ - DEBUG_OPTIMISE_r({ - Perl_re_printf( aTHX_ "minlen: %" IVdf " RExC_rx->minlen:%" IVdf " maxlen:%" IVdf "\n", - (IV)minlen, (IV)RExC_rx->minlen, (IV)RExC_maxlen); - }); - RExC_rx->minlenret = minlen; - if (RExC_rx->minlen < minlen) - RExC_rx->minlen = minlen; - - if (RExC_seen & REG_RECURSE_SEEN ) { - RExC_rx->intflags |= PREGf_RECURSE_SEEN; - Newx(RExC_rx->recurse_locinput, RExC_rx->nparens + 1, char *); - } - if (RExC_seen & REG_GPOS_SEEN) - RExC_rx->intflags |= PREGf_GPOS_SEEN; - if (RExC_seen & REG_LOOKBEHIND_SEEN) - RExC_rx->extflags |= RXf_NO_INPLACE_SUBST; /* inplace might break the - lookbehind */ - if (pRExC_state->code_blocks) - RExC_rx->extflags |= RXf_EVAL_SEEN; - if (RExC_seen & REG_VERBARG_SEEN) - { - RExC_rx->intflags |= PREGf_VERBARG_SEEN; - RExC_rx->extflags |= RXf_NO_INPLACE_SUBST; /* don't understand this! Yves */ - } - if (RExC_seen & REG_CUTGROUP_SEEN) - RExC_rx->intflags |= PREGf_CUTGROUP_SEEN; - if (pm_flags & PMf_USE_RE_EVAL) - RExC_rx->intflags |= PREGf_USE_RE_EVAL; - if (RExC_paren_names) - RXp_PAREN_NAMES(RExC_rx) = MUTABLE_HV(SvREFCNT_inc(RExC_paren_names)); - else - RXp_PAREN_NAMES(RExC_rx) = NULL; - - /* If we have seen an anchor in our pattern then we set the extflag RXf_IS_ANCHORED - * so it can be used in pp.c */ - if (RExC_rx->intflags & PREGf_ANCH) - RExC_rx->extflags |= RXf_IS_ANCHORED; - - - { - /* this is used to identify "special" patterns that might result - * in Perl NOT calling the regex engine and instead doing the match "itself", - * particularly special cases in split//. By having the regex compiler - * do this pattern matching at a regop level (instead of by inspecting the pattern) - * we avoid weird issues with equivalent patterns resulting in different behavior, - * AND we allow non Perl engines to get the same optimizations by the setting the - * flags appropriately - Yves */ - regnode *first = RExC_rxi->program + 1; - U8 fop = OP(first); - regnode *next = NEXTOPER(first); - /* It's safe to read through *next only if OP(first) is a regop of - * the right type (not EXACT, for example). - */ - U8 nop = (fop == NOTHING || fop == MBOL || fop == SBOL || fop == PLUS) - ? OP(next) : 0; - - if (PL_regkind[fop] == NOTHING && nop == END) - RExC_rx->extflags |= RXf_NULL; - else if ((fop == MBOL || (fop == SBOL && !first->flags)) && nop == END) - /* when fop is SBOL first->flags will be true only when it was - * produced by parsing /\A/, and not when parsing /^/. This is - * very important for the split code as there we want to - * treat /^/ as /^/m, but we do not want to treat /\A/ as /^/m. - * See rt #122761 for more details. -- Yves */ - RExC_rx->extflags |= RXf_START_ONLY; - else if (fop == PLUS - && PL_regkind[nop] == POSIXD && FLAGS(next) == _CC_SPACE - && OP(regnext(first)) == END) - RExC_rx->extflags |= RXf_WHITE; - else if ( RExC_rx->extflags & RXf_SPLIT - && (PL_regkind[fop] == EXACT && ! isEXACTFish(fop)) - && STR_LEN(first) == 1 - && *(STRING(first)) == ' ' - && OP(regnext(first)) == END ) - RExC_rx->extflags |= (RXf_SKIPWHITE|RXf_WHITE); - - } - - if (RExC_contains_locale) { - RXp_EXTFLAGS(RExC_rx) |= RXf_TAINTED; - } - -#ifdef DEBUGGING - if (RExC_paren_names) { - RExC_rxi->name_list_idx = add_data( pRExC_state, STR_WITH_LEN("a")); - RExC_rxi->data->data[RExC_rxi->name_list_idx] - = (void*)SvREFCNT_inc(RExC_paren_name_list); - } else -#endif - RExC_rxi->name_list_idx = 0; - - while ( RExC_recurse_count > 0 ) { - const regnode *scan = RExC_recurse[ --RExC_recurse_count ]; - /* - * This data structure is set up in study_chunk() and is used - * to calculate the distance between a GOSUB regopcode and - * the OPEN/CURLYM (CURLYM's are special and can act like OPEN's) - * it refers to. - * - * If for some reason someone writes code that optimises - * away a GOSUB opcode then the assert should be changed to - * an if(scan) to guard the ARG2L_SET() - Yves - * - */ - assert(scan && OP(scan) == GOSUB); - ARG2L_SET( scan, RExC_open_parens[ARG(scan)] - REGNODE_OFFSET(scan)); - } - - Newxz(RExC_rx->offs, RExC_total_parens, regexp_paren_pair); - /* assume we don't need to swap parens around before we match */ - DEBUG_TEST_r({ - Perl_re_printf( aTHX_ "study_chunk_recursed_count: %lu\n", - (unsigned long)RExC_study_chunk_recursed_count); - }); - DEBUG_DUMP_r({ - DEBUG_RExC_seen(); - Perl_re_printf( aTHX_ "Final program:\n"); - regdump(RExC_rx); - }); - - if (RExC_open_parens) { - Safefree(RExC_open_parens); - RExC_open_parens = NULL; - } - if (RExC_close_parens) { - Safefree(RExC_close_parens); - RExC_close_parens = NULL; - } - -#ifdef USE_ITHREADS - /* under ithreads the ?pat? PMf_USED flag on the pmop is simulated - * by setting the regexp SV to readonly-only instead. If the - * pattern's been recompiled, the USEDness should remain. */ - if (old_re && SvREADONLY(old_re)) - SvREADONLY_on(Rx); -#endif - return Rx; -} - - -SV* -Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value, - const U32 flags) -{ - PERL_ARGS_ASSERT_REG_NAMED_BUFF; - - PERL_UNUSED_ARG(value); - - if (flags & RXapif_FETCH) { - return reg_named_buff_fetch(rx, key, flags); - } else if (flags & (RXapif_STORE | RXapif_DELETE | RXapif_CLEAR)) { - Perl_croak_no_modify(); - return NULL; - } else if (flags & RXapif_EXISTS) { - return reg_named_buff_exists(rx, key, flags) - ? &PL_sv_yes - : &PL_sv_no; - } else if (flags & RXapif_REGNAMES) { - return reg_named_buff_all(rx, flags); - } else if (flags & (RXapif_SCALAR | RXapif_REGNAMES_COUNT)) { - return reg_named_buff_scalar(rx, flags); - } else { - Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff", (int)flags); - return NULL; - } -} - -SV* -Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey, - const U32 flags) -{ - PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER; - PERL_UNUSED_ARG(lastkey); - - if (flags & RXapif_FIRSTKEY) - return reg_named_buff_firstkey(rx, flags); - else if (flags & RXapif_NEXTKEY) - return reg_named_buff_nextkey(rx, flags); - else { - Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_iter", - (int)flags); - return NULL; - } -} - -SV* -Perl_reg_named_buff_fetch(pTHX_ REGEXP * const r, SV * const namesv, - const U32 flags) -{ - SV *ret; - struct regexp *const rx = ReANY(r); - - PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH; - - if (rx && RXp_PAREN_NAMES(rx)) { - HE *he_str = hv_fetch_ent( RXp_PAREN_NAMES(rx), namesv, 0, 0 ); - if (he_str) { - IV i; - SV* sv_dat=HeVAL(he_str); - I32 *nums=(I32*)SvPVX(sv_dat); - AV * const retarray = (flags & RXapif_ALL) ? newAV() : NULL; - for ( i=0; inparens) >= nums[i] - && rx->offs[nums[i]].start != -1 - && rx->offs[nums[i]].end != -1) - { - ret = newSVpvs(""); - CALLREG_NUMBUF_FETCH(r, nums[i], ret); - if (!retarray) - return ret; - } else { - if (retarray) - ret = newSV_type(SVt_NULL); - } - if (retarray) - av_push(retarray, ret); - } - if (retarray) - return newRV_noinc(MUTABLE_SV(retarray)); - } - } - return NULL; -} - -bool -Perl_reg_named_buff_exists(pTHX_ REGEXP * const r, SV * const key, - const U32 flags) -{ - struct regexp *const rx = ReANY(r); - - PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS; - - if (rx && RXp_PAREN_NAMES(rx)) { - if (flags & RXapif_ALL) { - return hv_exists_ent(RXp_PAREN_NAMES(rx), key, 0); - } else { - SV *sv = CALLREG_NAMED_BUFF_FETCH(r, key, flags); - if (sv) { - SvREFCNT_dec_NN(sv); - return TRUE; - } else { - return FALSE; - } - } - } else { - return FALSE; - } -} - -SV* -Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const r, const U32 flags) -{ - struct regexp *const rx = ReANY(r); - - PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY; - - if ( rx && RXp_PAREN_NAMES(rx) ) { - (void)hv_iterinit(RXp_PAREN_NAMES(rx)); - - return CALLREG_NAMED_BUFF_NEXTKEY(r, NULL, flags & ~RXapif_FIRSTKEY); - } else { - return FALSE; - } -} - -SV* -Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const r, const U32 flags) -{ - struct regexp *const rx = ReANY(r); - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY; - - if (rx && RXp_PAREN_NAMES(rx)) { - HV *hv = RXp_PAREN_NAMES(rx); - HE *temphe; - while ( (temphe = hv_iternext_flags(hv, 0)) ) { - IV i; - IV parno = 0; - SV* sv_dat = HeVAL(temphe); - I32 *nums = (I32*)SvPVX(sv_dat); - for ( i = 0; i < SvIVX(sv_dat); i++ ) { - if ((I32)(rx->lastparen) >= nums[i] && - rx->offs[nums[i]].start != -1 && - rx->offs[nums[i]].end != -1) - { - parno = nums[i]; - break; - } - } - if (parno || flags & RXapif_ALL) { - return newSVhek(HeKEY_hek(temphe)); - } - } - } - return NULL; -} - -SV* -Perl_reg_named_buff_scalar(pTHX_ REGEXP * const r, const U32 flags) -{ - SV *ret; - AV *av; - SSize_t length; - struct regexp *const rx = ReANY(r); - - PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR; - - if (rx && RXp_PAREN_NAMES(rx)) { - if (flags & (RXapif_ALL | RXapif_REGNAMES_COUNT)) { - return newSViv(HvTOTALKEYS(RXp_PAREN_NAMES(rx))); - } else if (flags & RXapif_ONE) { - ret = CALLREG_NAMED_BUFF_ALL(r, (flags | RXapif_REGNAMES)); - av = MUTABLE_AV(SvRV(ret)); - length = av_count(av); - SvREFCNT_dec_NN(ret); - return newSViv(length); - } else { - Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_scalar", - (int)flags); - return NULL; - } - } - return &PL_sv_undef; -} - -SV* -Perl_reg_named_buff_all(pTHX_ REGEXP * const r, const U32 flags) -{ - struct regexp *const rx = ReANY(r); - AV *av = newAV(); - - PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL; - - if (rx && RXp_PAREN_NAMES(rx)) { - HV *hv= RXp_PAREN_NAMES(rx); - HE *temphe; - (void)hv_iterinit(hv); - while ( (temphe = hv_iternext_flags(hv, 0)) ) { - IV i; - IV parno = 0; - SV* sv_dat = HeVAL(temphe); - I32 *nums = (I32*)SvPVX(sv_dat); - for ( i = 0; i < SvIVX(sv_dat); i++ ) { - if ((I32)(rx->lastparen) >= nums[i] && - rx->offs[nums[i]].start != -1 && - rx->offs[nums[i]].end != -1) - { - parno = nums[i]; - break; - } - } - if (parno || flags & RXapif_ALL) { - av_push(av, newSVhek(HeKEY_hek(temphe))); - } - } - } - - return newRV_noinc(MUTABLE_SV(av)); -} - -void -Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const r, const I32 paren, - SV * const sv) -{ - struct regexp *const rx = ReANY(r); - char *s = NULL; - SSize_t i = 0; - SSize_t s1, t1; - I32 n = paren; - - PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH; - - if ( n == RX_BUFF_IDX_CARET_PREMATCH - || n == RX_BUFF_IDX_CARET_FULLMATCH - || n == RX_BUFF_IDX_CARET_POSTMATCH - ) - { - bool keepcopy = cBOOL(rx->extflags & RXf_PMf_KEEPCOPY); - if (!keepcopy) { - /* on something like - * $r = qr/.../; - * /$qr/p; - * the KEEPCOPY is set on the PMOP rather than the regex */ - if (PL_curpm && r == PM_GETRE(PL_curpm)) - keepcopy = cBOOL(PL_curpm->op_pmflags & PMf_KEEPCOPY); - } - if (!keepcopy) - goto ret_undef; - } - - if (!rx->subbeg) - goto ret_undef; - - if (n == RX_BUFF_IDX_CARET_FULLMATCH) - /* no need to distinguish between them any more */ - n = RX_BUFF_IDX_FULLMATCH; - - if ((n == RX_BUFF_IDX_PREMATCH || n == RX_BUFF_IDX_CARET_PREMATCH) - && rx->offs[0].start != -1) - { - /* $`, ${^PREMATCH} */ - i = rx->offs[0].start; - s = rx->subbeg; - } - else - if ((n == RX_BUFF_IDX_POSTMATCH || n == RX_BUFF_IDX_CARET_POSTMATCH) - && rx->offs[0].end != -1) - { - /* $', ${^POSTMATCH} */ - s = rx->subbeg - rx->suboffset + rx->offs[0].end; - i = rx->sublen + rx->suboffset - rx->offs[0].end; - } - else - if (inRANGE(n, 0, (I32)rx->nparens) && - (s1 = rx->offs[n].start) != -1 && - (t1 = rx->offs[n].end) != -1) - { - /* $&, ${^MATCH}, $1 ... */ - i = t1 - s1; - s = rx->subbeg + s1 - rx->suboffset; - } else { - goto ret_undef; - } - - assert(s >= rx->subbeg); - assert((STRLEN)rx->sublen >= (STRLEN)((s - rx->subbeg) + i) ); - if (i >= 0) { -#ifdef NO_TAINT_SUPPORT - sv_setpvn(sv, s, i); -#else - const int oldtainted = TAINT_get; - TAINT_NOT; - sv_setpvn(sv, s, i); - TAINT_set(oldtainted); -#endif - if (RXp_MATCH_UTF8(rx)) - SvUTF8_on(sv); - else - SvUTF8_off(sv); - if (TAINTING_get) { - if (RXp_MATCH_TAINTED(rx)) { - if (SvTYPE(sv) >= SVt_PVMG) { - MAGIC* const mg = SvMAGIC(sv); - MAGIC* mgt; - TAINT; - SvMAGIC_set(sv, mg->mg_moremagic); - SvTAINT(sv); - if ((mgt = SvMAGIC(sv))) { - mg->mg_moremagic = mgt; - SvMAGIC_set(sv, mg); - } - } else { - TAINT; - SvTAINT(sv); - } - } else - SvTAINTED_off(sv); - } - } else { - ret_undef: - sv_set_undef(sv); - return; - } -} - -void -Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren, - SV const * const value) -{ - PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE; - - PERL_UNUSED_ARG(rx); - PERL_UNUSED_ARG(paren); - PERL_UNUSED_ARG(value); - - if (!PL_localizing) - Perl_croak_no_modify(); -} - -I32 -Perl_reg_numbered_buff_length(pTHX_ REGEXP * const r, const SV * const sv, - const I32 paren) -{ - struct regexp *const rx = ReANY(r); - I32 i; - I32 s1, t1; - - PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH; - - if ( paren == RX_BUFF_IDX_CARET_PREMATCH - || paren == RX_BUFF_IDX_CARET_FULLMATCH - || paren == RX_BUFF_IDX_CARET_POSTMATCH - ) - { - bool keepcopy = cBOOL(rx->extflags & RXf_PMf_KEEPCOPY); - if (!keepcopy) { - /* on something like - * $r = qr/.../; - * /$qr/p; - * the KEEPCOPY is set on the PMOP rather than the regex */ - if (PL_curpm && r == PM_GETRE(PL_curpm)) - keepcopy = cBOOL(PL_curpm->op_pmflags & PMf_KEEPCOPY); - } - if (!keepcopy) - goto warn_undef; - } - - /* Some of this code was originally in C in F */ - switch (paren) { - case RX_BUFF_IDX_CARET_PREMATCH: /* ${^PREMATCH} */ - case RX_BUFF_IDX_PREMATCH: /* $` */ - if (rx->offs[0].start != -1) { - i = rx->offs[0].start; - if (i > 0) { - s1 = 0; - t1 = i; - goto getlen; - } - } - return 0; - - case RX_BUFF_IDX_CARET_POSTMATCH: /* ${^POSTMATCH} */ - case RX_BUFF_IDX_POSTMATCH: /* $' */ - if (rx->offs[0].end != -1) { - i = rx->sublen - rx->offs[0].end; - if (i > 0) { - s1 = rx->offs[0].end; - t1 = rx->sublen; - goto getlen; - } - } - return 0; - - default: /* $& / ${^MATCH}, $1, $2, ... */ - if (paren <= (I32)rx->nparens && - (s1 = rx->offs[paren].start) != -1 && - (t1 = rx->offs[paren].end) != -1) - { - i = t1 - s1; - goto getlen; - } else { - warn_undef: - if (ckWARN(WARN_UNINITIALIZED)) - report_uninit((const SV *)sv); - return 0; - } - } - getlen: - if (i > 0 && RXp_MATCH_UTF8(rx)) { - const char * const s = rx->subbeg - rx->suboffset + s1; - const U8 *ep; - STRLEN el; - - i = t1 - s1; - if (is_utf8_string_loclen((U8*)s, i, &ep, &el)) - i = el; - } - return i; -} - -SV* -Perl_reg_qr_package(pTHX_ REGEXP * const rx) -{ - PERL_ARGS_ASSERT_REG_QR_PACKAGE; - PERL_UNUSED_ARG(rx); - if (0) - return NULL; - else - return newSVpvs("Regexp"); + /* Adding a trailing \n causes this to compile properly: + my $R = qr / A B C # D E/x; /($R)/ + Otherwise the parens are considered part of the comment */ + if (has_runon) + *p++ = '\n'; + *p++ = ')'; + *p = 0; + SvCUR_set(Rx, p - RX_WRAPPED(Rx)); } -/* Scans the name of a named buffer from the pattern. - * If flags is REG_RSN_RETURN_NULL returns null. - * If flags is REG_RSN_RETURN_NAME returns an SV* containing the name - * If flags is REG_RSN_RETURN_DATA returns the data SV* corresponding - * to the parsed name as looked up in the RExC_paren_names hash. - * If there is an error throws a vFAIL().. type exception. +/* + * Perl_re_op_compile - the perl internal RE engine's function to compile a + * regular expression into internal code. + * The pattern may be passed either as: + * a list of SVs (patternp plus pat_count) + * a list of OPs (expr) + * If both are passed, the SV list is used, but the OP list indicates + * which SVs are actually pre-compiled code blocks + * + * The SVs in the list have magic and qr overloading applied to them (and + * the list may be modified in-place with replacement SVs in the latter + * case). + * + * If the pattern hasn't changed from old_re, then old_re will be + * returned. + * + * eng is the current engine. If that engine has an op_comp method, then + * handle directly (i.e. we assume that op_comp was us); otherwise, just + * do the initial concatenation of arguments and pass on to the external + * engine. + * + * If is_bare_re is not null, set it to a boolean indicating whether the + * arg list reduced (after overloading) to a single bare regex which has + * been returned (i.e. /$qr/). + * + * orig_rx_flags contains RXf_* flags. See perlreapi.pod for more details. + * + * pm_flags contains the PMf_* flags, typically based on those from the + * pm_flags field of the related PMOP. Currently we're only interested in + * PMf_HAS_CV, PMf_IS_QR, PMf_USE_RE_EVAL, PMf_WILDCARD. + * + * For many years this code had an initial sizing pass that calculated + * (sometimes incorrectly, leading to security holes) the size needed for the + * compiled pattern. That was changed by commit + * 7c932d07cab18751bfc7515b4320436273a459e2 in 5.29, which reallocs the size, a + * node at a time, as parsing goes along. Patches welcome to fix any obsolete + * references to this sizing pass. + * + * Now, an initial crude guess as to the size needed is made, based on the + * length of the pattern. Patches welcome to improve that guess. That amount + * of space is malloc'd and then immediately freed, and then clawed back node + * by node. This design is to minimize, to the extent possible, memory churn + * when doing the reallocs. + * + * A separate parentheses counting pass may be needed in some cases. + * (Previously the sizing pass did this.) Patches welcome to reduce the number + * of these cases. + * + * The existence of a sizing pass necessitated design decisions that are no + * longer needed. There are potential areas of simplification. + * + * Beware that the optimization-preparation code in here knows about some + * of the structure of the compiled regexp. [I'll say.] */ -#define REG_RSN_RETURN_NULL 0 -#define REG_RSN_RETURN_NAME 1 -#define REG_RSN_RETURN_DATA 2 - -STATIC SV* -S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags) +REGEXP * +Perl_re_op_compile(pTHX_ SV ** const patternp, int pat_count, + OP *expr, const regexp_engine* eng, REGEXP *old_re, + bool *is_bare_re, const U32 orig_rx_flags, const U32 pm_flags) { - char *name_start = RExC_parse; - SV* sv_name; - - PERL_ARGS_ASSERT_REG_SCAN_NAME; - - assert (RExC_parse <= RExC_end); - if (RExC_parse == RExC_end) NOOP; - else if (isIDFIRST_lazy_if_safe(RExC_parse, RExC_end, UTF)) { - /* Note that the code here assumes well-formed UTF-8. Skip IDFIRST by - * using do...while */ - if (UTF) - do { - RExC_parse_inc_utf8(); - } while ( RExC_parse < RExC_end - && isWORDCHAR_utf8_safe((U8*)RExC_parse, (U8*) RExC_end)); - else - do { - RExC_parse_inc_by(1); - } while (RExC_parse < RExC_end && isWORDCHAR(*RExC_parse)); - } else { - RExC_parse_inc_by(1); /* so the <- from the vFAIL is after the offending - character */ - vFAIL("Group name must start with a non-digit word character"); - } - sv_name = newSVpvn_flags(name_start, (int)(RExC_parse - name_start), - SVs_TEMP | (UTF ? SVf_UTF8 : 0)); - if ( flags == REG_RSN_RETURN_NAME) - return sv_name; - else if (flags==REG_RSN_RETURN_DATA) { - HE *he_str = NULL; - SV *sv_dat = NULL; - if ( ! sv_name ) /* should not happen*/ - Perl_croak(aTHX_ "panic: no svname in reg_scan_name"); - if (RExC_paren_names) - he_str = hv_fetch_ent( RExC_paren_names, sv_name, 0, 0 ); - if ( he_str ) - sv_dat = HeVAL(he_str); - if ( ! sv_dat ) { /* Didn't find group */ - - /* It might be a forward reference; we can't fail until we - * know, by completing the parse to get all the groups, and - * then reparsing */ - if (ALL_PARENS_COUNTED) { - vFAIL("Reference to nonexistent named group"); - } - else { - REQUIRE_PARENS_PASS; - } - } - return sv_dat; - } - - Perl_croak(aTHX_ "panic: bad flag %lx in reg_scan_name", - (unsigned long) flags); -} - -#define DEBUG_PARSE_MSG(funcname) DEBUG_PARSE_r({ \ - if (RExC_lastparse!=RExC_parse) { \ - Perl_re_printf( aTHX_ "%s", \ - Perl_pv_pretty(aTHX_ RExC_mysv1, RExC_parse, \ - RExC_end - RExC_parse, 16, \ - "", "", \ - PERL_PV_ESCAPE_UNI_DETECT | \ - PERL_PV_PRETTY_ELLIPSES | \ - PERL_PV_PRETTY_LTGT | \ - PERL_PV_ESCAPE_RE | \ - PERL_PV_PRETTY_EXACTSIZE \ - ) \ - ); \ - } else \ - Perl_re_printf( aTHX_ "%16s",""); \ - \ - if (RExC_lastnum!=RExC_emit) \ - Perl_re_printf( aTHX_ "|%4zu", RExC_emit); \ - else \ - Perl_re_printf( aTHX_ "|%4s",""); \ - Perl_re_printf( aTHX_ "|%*s%-4s", \ - (int)((depth*2)), "", \ - (funcname) \ - ); \ - RExC_lastnum=RExC_emit; \ - RExC_lastparse=RExC_parse; \ -}) + REGEXP *Rx; /* Capital 'R' means points to a REGEXP */ + STRLEN plen; + char *exp; + regnode *scan; + I32 flags; + SSize_t minlen = 0; + U32 rx_flags; + SV *pat; + SV** new_patternp = patternp; + /* these are all flags - maybe they should be turned + * into a single int with different bit masks */ + I32 sawlookahead = 0; + I32 sawplus = 0; + I32 sawopen = 0; + I32 sawminmod = 0; + regex_charset initial_charset = get_regex_charset(orig_rx_flags); + bool recompile = 0; + bool runtime_code = 0; + scan_data_t data; + RExC_state_t RExC_state; + RExC_state_t * const pRExC_state = &RExC_state; +#ifdef TRIE_STUDY_OPT + /* search for "restudy" in this file for a detailed explanation */ + int restudied = 0; + RExC_state_t copyRExC_state; +#endif + DECLARE_AND_GET_RE_DEBUG_FLAGS; -#define DEBUG_PARSE(funcname) DEBUG_PARSE_r({ \ - DEBUG_PARSE_MSG((funcname)); \ - Perl_re_printf( aTHX_ "%4s","\n"); \ -}) -#define DEBUG_PARSE_FMT(funcname,fmt,args) DEBUG_PARSE_r({\ - DEBUG_PARSE_MSG((funcname)); \ - Perl_re_printf( aTHX_ fmt "\n",args); \ -}) + PERL_ARGS_ASSERT_RE_OP_COMPILE; -/* This section of code defines the inversion list object and its methods. The - * interfaces are highly subject to change, so as much as possible is static to - * this file. An inversion list is here implemented as a malloc'd C UV array - * as an SVt_INVLIST scalar. - * - * An inversion list for Unicode is an array of code points, sorted by ordinal - * number. Each element gives the code point that begins a range that extends - * up-to but not including the code point given by the next element. The final - * element gives the first code point of a range that extends to the platform's - * infinity. The even-numbered elements (invlist[0], invlist[2], invlist[4], - * ...) give ranges whose code points are all in the inversion list. We say - * that those ranges are in the set. The odd-numbered elements give ranges - * whose code points are not in the inversion list, and hence not in the set. - * Thus, element [0] is the first code point in the list. Element [1] - * is the first code point beyond that not in the list; and element [2] is the - * first code point beyond that that is in the list. In other words, the first - * range is invlist[0]..(invlist[1]-1), and all code points in that range are - * in the inversion list. The second range is invlist[1]..(invlist[2]-1), and - * all code points in that range are not in the inversion list. The third - * range invlist[2]..(invlist[3]-1) gives code points that are in the inversion - * list, and so forth. Thus every element whose index is divisible by two - * gives the beginning of a range that is in the list, and every element whose - * index is not divisible by two gives the beginning of a range not in the - * list. If the final element's index is divisible by two, the inversion list - * extends to the platform's infinity; otherwise the highest code point in the - * inversion list is the contents of that element minus 1. - * - * A range that contains just a single code point N will look like - * invlist[i] == N - * invlist[i+1] == N+1 - * - * If N is UV_MAX (the highest representable code point on the machine), N+1 is - * impossible to represent, so element [i+1] is omitted. The single element - * inversion list - * invlist[0] == UV_MAX - * contains just UV_MAX, but is interpreted as matching to infinity. - * - * Taking the complement (inverting) an inversion list is quite simple, if the - * first element is 0, remove it; otherwise add a 0 element at the beginning. - * This implementation reserves an element at the beginning of each inversion - * list to always contain 0; there is an additional flag in the header which - * indicates if the list begins at the 0, or is offset to begin at the next - * element. This means that the inversion list can be inverted without any - * copying; just flip the flag. - * - * More about inversion lists can be found in "Unicode Demystified" - * Chapter 13 by Richard Gillam, published by Addison-Wesley. - * - * The inversion list data structure is currently implemented as an SV pointing - * to an array of UVs that the SV thinks are bytes. This allows us to have an - * array of UV whose memory management is automatically handled by the existing - * facilities for SV's. - * - * Some of the methods should always be private to the implementation, and some - * should eventually be made public */ + DEBUG_r(if (!PL_colorset) reginitcolors()); -/* The header definitions are in F */ -#ifndef PERL_IN_XSUB_RE + pRExC_state->warn_text = NULL; + pRExC_state->unlexed_names = NULL; + pRExC_state->code_blocks = NULL; -PERL_STATIC_INLINE UV* -S__invlist_array_init(SV* const invlist, const bool will_have_0) -{ - /* Returns a pointer to the first element in the inversion list's array. - * This is called upon initialization of an inversion list. Where the - * array begins depends on whether the list has the code point U+0000 in it - * or not. The other parameter tells it whether the code that follows this - * call is about to put a 0 in the inversion list or not. The first - * element is either the element reserved for 0, if TRUE, or the element - * after it, if FALSE */ - - bool* offset = get_invlist_offset_addr(invlist); - UV* zero_addr = (UV *) SvPVX(invlist); - - PERL_ARGS_ASSERT__INVLIST_ARRAY_INIT; - - /* Must be empty */ - assert(! _invlist_len(invlist)); - - *zero_addr = 0; - - /* 1^1 = 0; 1^0 = 1 */ - *offset = 1 ^ will_have_0; - return zero_addr + *offset; -} + if (is_bare_re) + *is_bare_re = FALSE; -STATIC void -S_invlist_replace_list_destroys_src(pTHX_ SV * dest, SV * src) -{ - /* Replaces the inversion list in 'dest' with the one from 'src'. It - * steals the list from 'src', so 'src' is made to have a NULL list. This - * is similar to what SvSetMagicSV() would do, if it were implemented on - * inversion lists, though this routine avoids a copy */ - - const UV src_len = _invlist_len(src); - const bool src_offset = *get_invlist_offset_addr(src); - const STRLEN src_byte_len = SvLEN(src); - char * array = SvPVX(src); + if (expr && (expr->op_type == OP_LIST || + (expr->op_type == OP_NULL && expr->op_targ == OP_LIST))) { + /* allocate code_blocks if needed */ + OP *o; + int ncode = 0; -#ifndef NO_TAINT_SUPPORT - const int oldtainted = TAINT_get; -#endif + for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) + if (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL)) + ncode++; /* count of DO blocks */ - PERL_ARGS_ASSERT_INVLIST_REPLACE_LIST_DESTROYS_SRC; + if (ncode) + pRExC_state->code_blocks = S_alloc_code_blocks(aTHX_ ncode); + } - assert(is_invlist(src)); - assert(is_invlist(dest)); - assert(! invlist_is_iterating(src)); - assert(SvCUR(src) == 0 || SvCUR(src) < SvLEN(src)); - - /* Make sure it ends in the right place with a NUL, as our inversion list - * manipulations aren't careful to keep this true, but sv_usepvn_flags() - * asserts it */ - array[src_byte_len - 1] = '\0'; - - TAINT_NOT; /* Otherwise it breaks */ - sv_usepvn_flags(dest, - (char *) array, - src_byte_len - 1, - - /* This flag is documented to cause a copy to be avoided */ - SV_HAS_TRAILING_NUL); - TAINT_set(oldtainted); - SvPV_set(src, 0); - SvLEN_set(src, 0); - SvCUR_set(src, 0); - - /* Finish up copying over the other fields in an inversion list */ - *get_invlist_offset_addr(dest) = src_offset; - invlist_set_len(dest, src_len, src_offset); - *get_invlist_previous_index_addr(dest) = 0; - invlist_iterfinish(dest); -} + if (!pat_count) { + /* compile-time pattern with just OP_CONSTs and DO blocks */ -PERL_STATIC_INLINE IV* -S_get_invlist_previous_index_addr(SV* invlist) -{ - /* Return the address of the IV that is reserved to hold the cached index - * */ - PERL_ARGS_ASSERT_GET_INVLIST_PREVIOUS_INDEX_ADDR; + int n; + OP *o; - assert(is_invlist(invlist)); + /* find how many CONSTs there are */ + assert(expr); + n = 0; + if (expr->op_type == OP_CONST) + n = 1; + else + for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) { + if (o->op_type == OP_CONST) + n++; + } - return &(((XINVLIST*) SvANY(invlist))->prev_index); -} + /* fake up an SV array */ -PERL_STATIC_INLINE IV -S_invlist_previous_index(SV* const invlist) -{ - /* Returns cached index of previous search */ + assert(!new_patternp); + Newx(new_patternp, n, SV*); + SAVEFREEPV(new_patternp); + pat_count = n; - PERL_ARGS_ASSERT_INVLIST_PREVIOUS_INDEX; + n = 0; + if (expr->op_type == OP_CONST) + new_patternp[n] = cSVOPx_sv(expr); + else + for (o = cLISTOPx(expr)->op_first; o; o = OpSIBLING(o)) { + if (o->op_type == OP_CONST) + new_patternp[n++] = cSVOPo_sv; + } - return *get_invlist_previous_index_addr(invlist); -} + } -PERL_STATIC_INLINE void -S_invlist_set_previous_index(SV* const invlist, const IV index) -{ - /* Caches for later retrieval */ + DEBUG_PARSE_r(Perl_re_printf( aTHX_ + "Assembling pattern from %d elements%s\n", pat_count, + orig_rx_flags & RXf_SPLIT ? " for split" : "")); - PERL_ARGS_ASSERT_INVLIST_SET_PREVIOUS_INDEX; + /* set expr to the first arg op */ - assert(index == 0 || index < (int) _invlist_len(invlist)); + if (pRExC_state->code_blocks && pRExC_state->code_blocks->count + && expr->op_type != OP_CONST) + { + expr = cLISTOPx(expr)->op_first; + assert( expr->op_type == OP_PUSHMARK + || (expr->op_type == OP_NULL && expr->op_targ == OP_PUSHMARK) + || expr->op_type == OP_PADRANGE); + expr = OpSIBLING(expr); + } - *get_invlist_previous_index_addr(invlist) = index; -} + pat = S_concat_pat(aTHX_ pRExC_state, NULL, new_patternp, pat_count, + expr, &recompile, NULL); -PERL_STATIC_INLINE void -S_invlist_trim(SV* invlist) -{ - /* Free the not currently-being-used space in an inversion list */ + /* handle bare (possibly after overloading) regex: foo =~ $re */ + { + SV *re = pat; + if (SvROK(re)) + re = SvRV(re); + if (SvTYPE(re) == SVt_REGEXP) { + if (is_bare_re) + *is_bare_re = TRUE; + SvREFCNT_inc(re); + DEBUG_PARSE_r(Perl_re_printf( aTHX_ + "Precompiled pattern%s\n", + orig_rx_flags & RXf_SPLIT ? " for split" : "")); - /* But don't free up the space needed for the 0 UV that is always at the - * beginning of the list, nor the trailing NUL */ - const UV min_size = TO_INTERNAL_SIZE(1) + 1; + return (REGEXP*)re; + } + } - PERL_ARGS_ASSERT_INVLIST_TRIM; + exp = SvPV_nomg(pat, plen); - assert(is_invlist(invlist)); + if (!eng->op_comp) { + if ((SvUTF8(pat) && IN_BYTES) + || SvGMAGICAL(pat) || SvAMAGIC(pat)) + { + /* make a temporary copy; either to convert to bytes, + * or to avoid repeating get-magic / overloaded stringify */ + pat = newSVpvn_flags(exp, plen, SVs_TEMP | + (IN_BYTES ? 0 : SvUTF8(pat))); + } + return CALLREGCOMP_ENG(eng, pat, orig_rx_flags); + } - SvPV_renew(invlist, MAX(min_size, SvCUR(invlist) + 1)); -} + /* ignore the utf8ness if the pattern is 0 length */ + RExC_utf8 = RExC_orig_utf8 = (plen == 0 || IN_BYTES) ? 0 : SvUTF8(pat); + RExC_uni_semantics = 0; + RExC_contains_locale = 0; + RExC_strict = cBOOL(pm_flags & RXf_PMf_STRICT); + RExC_in_script_run = 0; + RExC_study_started = 0; + pRExC_state->runtime_code_qr = NULL; + RExC_frame_head= NULL; + RExC_frame_last= NULL; + RExC_frame_count= 0; + RExC_latest_warn_offset = 0; + RExC_use_BRANCHJ = 0; + RExC_warned_WARN_EXPERIMENTAL__VLB = 0; + RExC_warned_WARN_EXPERIMENTAL__REGEX_SETS = 0; + RExC_logical_total_parens = 0; + RExC_total_parens = 0; + RExC_logical_to_parno = NULL; + RExC_parno_to_logical = NULL; + RExC_open_parens = NULL; + RExC_close_parens = NULL; + RExC_paren_names = NULL; + RExC_size = 0; + RExC_seen_d_op = FALSE; +#ifdef DEBUGGING + RExC_paren_name_list = NULL; +#endif -PERL_STATIC_INLINE void -S_invlist_clear(pTHX_ SV* invlist) /* Empty the inversion list */ -{ - PERL_ARGS_ASSERT_INVLIST_CLEAR; + DEBUG_r({ + RExC_mysv1= sv_newmortal(); + RExC_mysv2= sv_newmortal(); + }); - assert(is_invlist(invlist)); + DEBUG_COMPILE_r({ + SV *dsv= sv_newmortal(); + RE_PV_QUOTED_DECL(s, RExC_utf8, dsv, exp, plen, PL_dump_re_max_len); + Perl_re_printf( aTHX_ "%sCompiling REx%s %s\n", + PL_colors[4], PL_colors[5], s); + }); - invlist_set_len(invlist, 0, 0); - invlist_trim(invlist); -} + /* we jump here if we have to recompile, e.g., from upgrading the pattern + * to utf8 */ + + if ((pm_flags & PMf_USE_RE_EVAL) + /* this second condition covers the non-regex literal case, + * i.e. $foo =~ '(?{})'. */ + || (IN_PERL_COMPILETIME && (PL_hints & HINT_RE_EVAL)) + ) + runtime_code = S_has_runtime_code(aTHX_ pRExC_state, exp, plen); -#endif /* ifndef PERL_IN_XSUB_RE */ + redo_parse: + /* return old regex if pattern hasn't changed */ + /* XXX: note in the below we have to check the flags as well as the + * pattern. + * + * Things get a touch tricky as we have to compare the utf8 flag + * independently from the compile flags. */ -PERL_STATIC_INLINE bool -S_invlist_is_iterating(const SV* const invlist) -{ - PERL_ARGS_ASSERT_INVLIST_IS_ITERATING; + if ( old_re + && !recompile + && cBOOL(RX_UTF8(old_re)) == cBOOL(RExC_utf8) + && ( RX_COMPFLAGS(old_re) == ( orig_rx_flags & RXf_PMf_FLAGCOPYMASK ) ) + && RX_PRELEN(old_re) == plen + && memEQ(RX_PRECOMP(old_re), exp, plen) + && !runtime_code /* with runtime code, always recompile */ ) + { + DEBUG_COMPILE_r({ + SV *dsv= sv_newmortal(); + RE_PV_QUOTED_DECL(s, RExC_utf8, dsv, exp, plen, PL_dump_re_max_len); + Perl_re_printf( aTHX_ "%sSkipping recompilation of unchanged REx%s %s\n", + PL_colors[4], PL_colors[5], s); + }); + return old_re; + } - /* get_invlist_iter_addr()'s sv is non-const only because it returns a - * value that can be used to modify the invlist, it doesn't modify the - * invlist itself */ - return *(get_invlist_iter_addr((SV*)invlist)) < (STRLEN) UV_MAX; -} + /* Allocate the pattern's SV */ + RExC_rx_sv = Rx = (REGEXP*) newSV_type(SVt_REGEXP); + RExC_rx = ReANY(Rx); + if ( RExC_rx == NULL ) + FAIL("Regexp out of space"); -#ifndef PERL_IN_XSUB_RE + rx_flags = orig_rx_flags; -PERL_STATIC_INLINE UV -S_invlist_max(const SV* const invlist) -{ - /* Returns the maximum number of elements storable in the inversion list's - * array, without having to realloc() */ + if ( toUSE_UNI_CHARSET_NOT_DEPENDS + && initial_charset == REGEX_DEPENDS_CHARSET) + { - PERL_ARGS_ASSERT_INVLIST_MAX; + /* Set to use unicode semantics if the pattern is in utf8 and has the + * 'depends' charset specified, as it means unicode when utf8 */ + set_regex_charset(&rx_flags, REGEX_UNICODE_CHARSET); + RExC_uni_semantics = 1; + } - assert(is_invlist(invlist)); + RExC_pm_flags = pm_flags; - /* Assumes worst case, in which the 0 element is not counted in the - * inversion list, so subtracts 1 for that */ - return SvLEN(invlist) == 0 /* This happens under _new_invlist_C_array */ - ? FROM_INTERNAL_SIZE(SvCUR(invlist)) - 1 - : FROM_INTERNAL_SIZE(SvLEN(invlist)) - 1; -} + if (runtime_code) { + assert(TAINTING_get || !TAINT_get); + if (TAINT_get) + Perl_croak(aTHX_ "Eval-group in insecure regular expression"); -STATIC void -S_initialize_invlist_guts(pTHX_ SV* invlist, const Size_t initial_size) -{ - PERL_ARGS_ASSERT_INITIALIZE_INVLIST_GUTS; + if (!S_compile_runtime_code(aTHX_ pRExC_state, exp, plen)) { + /* whoops, we have a non-utf8 pattern, whilst run-time code + * got compiled as utf8. Try again with a utf8 pattern */ + S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &exp, &plen, + pRExC_state->code_blocks ? pRExC_state->code_blocks->count : 0); + goto redo_parse; + } + } + assert(!pRExC_state->runtime_code_qr); - /* First 1 is in case the zero element isn't in the list; second 1 is for - * trailing NUL */ - SvGROW(invlist, TO_INTERNAL_SIZE(initial_size + 1) + 1); - invlist_set_len(invlist, 0, 0); + RExC_sawback = 0; - /* Force iterinit() to be used to get iteration to work */ - invlist_iterfinish(invlist); + RExC_seen = 0; + RExC_maxlen = 0; + RExC_in_lookaround = 0; + RExC_seen_zerolen = *exp == '^' ? -1 : 0; + RExC_recode_x_to_native = 0; + RExC_in_multi_char_class = 0; - *get_invlist_previous_index_addr(invlist) = 0; - SvPOK_on(invlist); /* This allows B to extract the PV */ -} + RExC_start = RExC_copy_start_in_constructed = RExC_copy_start_in_input = RExC_precomp = exp; + RExC_precomp_end = RExC_end = exp + plen; + RExC_nestroot = 0; + RExC_whilem_seen = 0; + RExC_end_op = NULL; + RExC_recurse = NULL; + RExC_study_chunk_recursed = NULL; + RExC_study_chunk_recursed_bytes= 0; + RExC_recurse_count = 0; + RExC_sets_depth = 0; + pRExC_state->code_index = 0; -SV* -Perl__new_invlist(pTHX_ IV initial_size) -{ + /* Initialize the string in the compiled pattern. This is so that there is + * something to output if necessary */ + set_regex_pv(pRExC_state, Rx); - /* Return a pointer to a newly constructed inversion list, with enough - * space to store 'initial_size' elements. If that number is negative, a - * system default is used instead */ + DEBUG_PARSE_r({ + Perl_re_printf( aTHX_ + "Starting parse and generation\n"); + RExC_lastnum=0; + RExC_lastparse=NULL; + }); - SV* new_list; + /* Allocate space and zero-initialize. Note, the two step process + of zeroing when in debug mode, thus anything assigned has to + happen after that */ + if (! RExC_size) { - if (initial_size < 0) { - initial_size = 10; + /* On the first pass of the parse, we guess how big this will be. Then + * we grow in one operation to that amount and then give it back. As + * we go along, we re-allocate what we need. + * + * XXX Currently the guess is essentially that the pattern will be an + * EXACT node with one byte input, one byte output. This is crude, and + * better heuristics are welcome. + * + * On any subsequent passes, we guess what we actually computed in the + * latest earlier pass. Such a pass probably didn't complete so is + * missing stuff. We could improve those guesses by knowing where the + * parse stopped, and use the length so far plus apply the above + * assumption to what's left. */ + RExC_size = STR_SZ(RExC_end - RExC_start); } - new_list = newSV_type(SVt_INVLIST); - initialize_invlist_guts(new_list, initial_size); - - return new_list; -} + Newxc(RExC_rxi, sizeof(regexp_internal) + RExC_size, char, regexp_internal); + if ( RExC_rxi == NULL ) + FAIL("Regexp out of space"); -SV* -Perl__new_invlist_C_array(pTHX_ const UV* const list) -{ - /* Return a pointer to a newly constructed inversion list, initialized to - * point to , which has to be in the exact correct inversion list - * form, including internal fields. Thus this is a dangerous routine that - * should not be used in the wrong hands. The passed in 'list' contains - * several header fields at the beginning that are not part of the - * inversion list body proper */ - - const STRLEN length = (STRLEN) list[0]; - const UV version_id = list[1]; - const bool offset = cBOOL(list[2]); -#define HEADER_LENGTH 3 - /* If any of the above changes in any way, you must change HEADER_LENGTH - * (if appropriate) and regenerate INVLIST_VERSION_ID by running - * perl -E 'say int(rand 2**31-1)' - */ -#define INVLIST_VERSION_ID 148565664 /* This is a combination of a version and - data structure type, so that one being - passed in can be validated to be an - inversion list of the correct vintage. - */ + Zero(RExC_rxi, sizeof(regexp_internal) + RExC_size, char); + RXi_SET( RExC_rx, RExC_rxi ); - SV* invlist = newSV_type(SVt_INVLIST); + /* We start from 0 (over from 0 in the case this is a reparse. The first + * node parsed will give back any excess memory we have allocated so far). + * */ + RExC_size = 0; - PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY; + /* non-zero initialization begins here */ + RExC_rx->engine= eng; + RExC_rx->extflags = rx_flags; + RXp_COMPFLAGS(RExC_rx) = orig_rx_flags & RXf_PMf_FLAGCOPYMASK; - if (version_id != INVLIST_VERSION_ID) { - Perl_croak(aTHX_ "panic: Incorrect version for previously generated inversion list"); + if (pm_flags & PMf_IS_QR) { + RExC_rxi->code_blocks = pRExC_state->code_blocks; + if (RExC_rxi->code_blocks) { + RExC_rxi->code_blocks->refcnt++; + } } - /* The generated array passed in includes header elements that aren't part - * of the list proper, so start it just after them */ - SvPV_set(invlist, (char *) (list + HEADER_LENGTH)); - - SvLEN_set(invlist, 0); /* Means we own the contents, and the system - shouldn't touch it */ - - *(get_invlist_offset_addr(invlist)) = offset; - - /* The 'length' passed to us is the physical number of elements in the - * inversion list. But if there is an offset the logical number is one - * less than that */ - invlist_set_len(invlist, length - offset, offset); + RExC_rx->intflags = 0; - invlist_set_previous_index(invlist, 0); + RExC_flags = rx_flags; /* don't let top level (?i) bleed */ + RExC_parse_set(exp); - /* Initialize the iteration pointer. */ - invlist_iterfinish(invlist); + /* This NUL is guaranteed because the pattern comes from an SV*, and the sv + * code makes sure the final byte is an uncounted NUL. But should this + * ever not be the case, lots of things could read beyond the end of the + * buffer: loops like + * while(isFOO(*RExC_parse)) RExC_parse_inc_by(1); + * strchr(RExC_parse, "foo"); + * etc. So it is worth noting. */ + assert(*RExC_end == '\0'); - SvREADONLY_on(invlist); - SvPOK_on(invlist); + RExC_naughty = 0; + RExC_npar = 1; + RExC_logical_npar = 1; + RExC_parens_buf_size = 0; + RExC_emit_start = RExC_rxi->program; + pRExC_state->code_index = 0; - return invlist; -} + *((char*) RExC_emit_start) = (char) REG_MAGIC; + RExC_emit = NODE_STEP_REGNODE; -STATIC void -S__append_range_to_invlist(pTHX_ SV* const invlist, - const UV start, const UV end) -{ - /* Subject to change or removal. Append the range from 'start' to 'end' at - * the end of the inversion list. The range must be above any existing - * ones. */ - - UV* array; - UV max = invlist_max(invlist); - UV len = _invlist_len(invlist); - bool offset; - - PERL_ARGS_ASSERT__APPEND_RANGE_TO_INVLIST; - - if (len == 0) { /* Empty lists must be initialized */ - offset = start != 0; - array = _invlist_array_init(invlist, ! offset); - } - else { - /* Here, the existing list is non-empty. The current max entry in the - * list is generally the first value not in the set, except when the - * set extends to the end of permissible values, in which case it is - * the first entry in that final set, and so this call is an attempt to - * append out-of-order */ - - UV final_element = len - 1; - array = invlist_array(invlist); - if ( array[final_element] > start - || ELEMENT_RANGE_MATCHES_INVLIST(final_element)) - { - Perl_croak(aTHX_ "panic: attempting to append to an inversion list, but wasn't at the end of the list, final=%" UVuf ", start=%" UVuf ", match=%c", - array[final_element], start, - ELEMENT_RANGE_MATCHES_INVLIST(final_element) ? 't' : 'f'); - } + /* Do the parse */ + if (reg(pRExC_state, 0, &flags, 1)) { - /* Here, it is a legal append. If the new range begins 1 above the end - * of the range below it, it is extending the range below it, so the - * new first value not in the set is one greater than the newly - * extended range. */ - offset = *get_invlist_offset_addr(invlist); - if (array[final_element] == start) { - if (end != UV_MAX) { - array[final_element] = end + 1; - } - else { - /* But if the end is the maximum representable on the machine, - * assume that infinity was actually what was meant. Just let - * the range that this would extend to have no end */ - invlist_set_len(invlist, len - 1, offset); - } - return; + /* Success!, But we may need to redo the parse knowing how many parens + * there actually are */ + if (IN_PARENS_PASS) { + flags |= RESTART_PARSE; } - } - /* Here the new range doesn't extend any existing set. Add it */ - - len += 2; /* Includes an element each for the start and end of range */ - - /* If wll overflow the existing space, extend, which may cause the array to - * be moved */ - if (max < len) { - invlist_extend(invlist, len); - - /* Have to set len here to avoid assert failure in invlist_array() */ - invlist_set_len(invlist, len, offset); - - array = invlist_array(invlist); + /* We have that number in RExC_npar */ + RExC_total_parens = RExC_npar; + RExC_logical_total_parens = RExC_logical_npar; } - else { - invlist_set_len(invlist, len, offset); + else if (! MUST_RESTART(flags)) { + ReREFCNT_dec(Rx); + Perl_croak(aTHX_ "panic: reg returned failure to re_op_compile, flags=%#" UVxf, (UV) flags); } - /* The next item on the list starts the range, the one after that is - * one past the new range. */ - array[len - 2] = start; - if (end != UV_MAX) { - array[len - 1] = end + 1; - } - else { - /* But if the end is the maximum representable on the machine, just let - * the range have no end */ - invlist_set_len(invlist, len - 1, offset); - } -} + /* Here, we either have success, or we have to redo the parse for some reason */ + if (MUST_RESTART(flags)) { -SSize_t -Perl__invlist_search(SV* const invlist, const UV cp) -{ - /* Searches the inversion list for the entry that contains the input code - * point . If is not in the list, -1 is returned. Otherwise, the - * return value is the index into the list's array of the range that - * contains , that is, 'i' such that - * array[i] <= cp < array[i+1] - */ + /* It's possible to write a regexp in ascii that represents Unicode + codepoints outside of the byte range, such as via \x{100}. If we + detect such a sequence we have to convert the entire pattern to utf8 + and then recompile, as our sizing calculation will have been based + on 1 byte == 1 character, but we will need to use utf8 to encode + at least some part of the pattern, and therefore must convert the whole + thing. + -- dmq */ + if (flags & NEED_UTF8) { - IV low = 0; - IV mid; - IV high = _invlist_len(invlist); - const IV highest_element = high - 1; - const UV* array; - - PERL_ARGS_ASSERT__INVLIST_SEARCH; - - /* If list is empty, return failure. */ - if (UNLIKELY(high == 0)) { - return -1; - } - - /* (We can't get the array unless we know the list is non-empty) */ - array = invlist_array(invlist); - - mid = invlist_previous_index(invlist); - assert(mid >=0); - if (UNLIKELY(mid > highest_element)) { - mid = highest_element; - } - - /* contains the cache of the result of the previous call to this - * function (0 the first time). See if this call is for the same result, - * or if it is for mid-1. This is under the theory that calls to this - * function will often be for related code points that are near each other. - * And benchmarks show that caching gives better results. We also test - * here if the code point is within the bounds of the list. These tests - * replace others that would have had to be made anyway to make sure that - * the array bounds were not exceeded, and these give us extra information - * at the same time */ - if (cp >= array[mid]) { - if (cp >= array[highest_element]) { - return highest_element; - } - - /* Here, array[mid] <= cp < array[highest_element]. This means that - * the final element is not the answer, so can exclude it; it also - * means that is not the final element, so can refer to 'mid + 1' - * safely */ - if (cp < array[mid + 1]) { - return mid; - } - high--; - low = mid + 1; - } - else { /* cp < aray[mid] */ - if (cp < array[0]) { /* Fail if outside the array */ - return -1; - } - high = mid; - if (cp >= array[mid - 1]) { - goto found_entry; - } - } - - /* Binary search. What we are looking for is such that - * array[i] <= cp < array[i+1] - * The loop below converges on the i+1. Note that there may not be an - * (i+1)th element in the array, and things work nonetheless */ - while (low < high) { - mid = (low + high) / 2; - assert(mid <= highest_element); - if (array[mid] <= cp) { /* cp >= array[mid] */ - low = mid + 1; - - /* We could do this extra test to exit the loop early. - if (cp < array[low]) { - return mid; + /* We have stored the offset of the final warning output so far. + * That must be adjusted. Any variant characters between the start + * of the pattern and this warning count for 2 bytes in the final, + * so just add them again */ + if (UNLIKELY(RExC_latest_warn_offset > 0)) { + RExC_latest_warn_offset += + variant_under_utf8_count((U8 *) exp, (U8 *) exp + + RExC_latest_warn_offset); } - */ + S_pat_upgrade_to_utf8(aTHX_ pRExC_state, &exp, &plen, + pRExC_state->code_blocks ? pRExC_state->code_blocks->count : 0); + DEBUG_PARSE_r(Perl_re_printf( aTHX_ "Need to redo parse after upgrade\n")); } - else { /* cp < array[mid] */ - high = mid; + else { + DEBUG_PARSE_r(Perl_re_printf( aTHX_ "Need to redo parse\n")); } - } - - found_entry: - high--; - invlist_set_previous_index(invlist, high); - return high; -} - -void -Perl__invlist_union_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, - const bool complement_b, SV** output) -{ - /* Take the union of two inversion lists and point '*output' to it. On - * input, '*output' MUST POINT TO NULL OR TO AN SV* INVERSION LIST (possibly - * even 'a' or 'b'). If to an inversion list, the contents of the original - * list will be replaced by the union. The first list, 'a', may be - * NULL, in which case a copy of the second list is placed in '*output'. - * If 'complement_b' is TRUE, the union is taken of the complement - * (inversion) of 'b' instead of b itself. - * - * The basis for this comes from "Unicode Demystified" Chapter 13 by - * Richard Gillam, published by Addison-Wesley, and explained at some - * length there. The preface says to incorporate its examples into your - * code at your own risk. - * - * The algorithm is like a merge sort. */ - const UV* array_a; /* a's array */ - const UV* array_b; - UV len_a; /* length of a's array */ - UV len_b; - - SV* u; /* the resulting union */ - UV* array_u; - UV len_u = 0; - - UV i_a = 0; /* current index into a's array */ - UV i_b = 0; - UV i_u = 0; - - /* running count, as explained in the algorithm source book; items are - * stopped accumulating and are output when the count changes to/from 0. - * The count is incremented when we start a range that's in an input's set, - * and decremented when we start a range that's not in a set. So this - * variable can be 0, 1, or 2. When it is 0 neither input is in their set, - * and hence nothing goes into the union; 1, just one of the inputs is in - * its set (and its current range gets added to the union); and 2 when both - * inputs are in their sets. */ - UV count = 0; - - PERL_ARGS_ASSERT__INVLIST_UNION_MAYBE_COMPLEMENT_2ND; - assert(a != b); - assert(*output == NULL || is_invlist(*output)); - - len_b = _invlist_len(b); - if (len_b == 0) { - - /* Here, 'b' is empty, hence it's complement is all possible code - * points. So if the union includes the complement of 'b', it includes - * everything, and we need not even look at 'a'. It's easiest to - * create a new inversion list that matches everything. */ - if (complement_b) { - SV* everything = _add_range_to_invlist(NULL, 0, UV_MAX); - - if (*output == NULL) { /* If the output didn't exist, just point it - at the new list */ - *output = everything; - } - else { /* Otherwise, replace its contents with the new list */ - invlist_replace_list_destroys_src(*output, everything); - SvREFCNT_dec_NN(everything); - } + if (ALL_PARENS_COUNTED) { + /* Make enough room for all the known parens, and zero it */ + Renew(RExC_open_parens, RExC_total_parens, regnode_offset); + Zero(RExC_open_parens, RExC_total_parens, regnode_offset); + RExC_open_parens[0] = 1; /* +1 for REG_MAGIC */ - return; + Renew(RExC_close_parens, RExC_total_parens, regnode_offset); + Zero(RExC_close_parens, RExC_total_parens, regnode_offset); + /* we do NOT reinitialize RExC_logical_to_parno and + * RExC_parno_to_logical here. We need their data on the second + * pass */ } - - /* Here, we don't want the complement of 'b', and since 'b' is empty, - * the union will come entirely from 'a'. If 'a' is NULL or empty, the - * output will be empty */ - - if (a == NULL || _invlist_len(a) == 0) { - if (*output == NULL) { - *output = _new_invlist(0); + else { /* Parse did not complete. Reinitialize the parentheses + structures */ + RExC_total_parens = 0; + if (RExC_open_parens) { + Safefree(RExC_open_parens); + RExC_open_parens = NULL; } - else { - invlist_clear(*output); + if (RExC_close_parens) { + Safefree(RExC_close_parens); + RExC_close_parens = NULL; + } + if (RExC_logical_to_parno) { + Safefree(RExC_logical_to_parno); + RExC_logical_to_parno = NULL; + } + if (RExC_parno_to_logical) { + Safefree(RExC_parno_to_logical); + RExC_parno_to_logical = NULL; } - return; - } - - /* Here, 'a' is not empty, but 'b' is, so 'a' entirely determines the - * union. We can just return a copy of 'a' if '*output' doesn't point - * to an existing list */ - if (*output == NULL) { - *output = invlist_clone(a, NULL); - return; - } - - /* If the output is to overwrite 'a', we have a no-op, as it's - * already in 'a' */ - if (*output == a) { - return; } - /* Here, '*output' is to be overwritten by 'a' */ - u = invlist_clone(a, NULL); - invlist_replace_list_destroys_src(*output, u); - SvREFCNT_dec_NN(u); + /* Clean up what we did in this parse */ + SvREFCNT_dec_NN(RExC_rx_sv); - return; + goto redo_parse; } - /* Here 'b' is not empty. See about 'a' */ - - if (a == NULL || ((len_a = _invlist_len(a)) == 0)) { - - /* Here, 'a' is empty (and b is not). That means the union will come - * entirely from 'b'. If '*output' is NULL, we can directly return a - * clone of 'b'. Otherwise, we replace the contents of '*output' with - * the clone */ - - SV ** dest = (*output == NULL) ? output : &u; - *dest = invlist_clone(b, NULL); - if (complement_b) { - _invlist_invert(*dest); - } + /* Here, we have successfully parsed and generated the pattern's program + * for the regex engine. We are ready to finish things up and look for + * optimizations. */ - if (dest == &u) { - invlist_replace_list_destroys_src(*output, u); - SvREFCNT_dec_NN(u); - } + /* Update the string to compile, with correct modifiers, etc */ + set_regex_pv(pRExC_state, Rx); - return; - } + RExC_rx->nparens = RExC_total_parens - 1; + RExC_rx->logical_nparens = RExC_logical_total_parens - 1; - /* Here both lists exist and are non-empty */ - array_a = invlist_array(a); - array_b = invlist_array(b); - - /* If are to take the union of 'a' with the complement of b, set it - * up so are looking at b's complement. */ - if (complement_b) { - - /* To complement, we invert: if the first element is 0, remove it. To - * do this, we just pretend the array starts one later */ - if (array_b[0] == 0) { - array_b++; - len_b--; - } - else { + /* Uses the upper 4 bits of the FLAGS field, so keep within that size */ + if (RExC_whilem_seen > 15) + RExC_whilem_seen = 15; - /* But if the first element is not zero, we pretend the list starts - * at the 0 that is always stored immediately before the array. */ - array_b--; - len_b++; - } - } + DEBUG_PARSE_r({ + Perl_re_printf( aTHX_ + "Required size %" IVdf " nodes\n", (IV)RExC_size); + RExC_lastnum=0; + RExC_lastparse=NULL; + }); - /* Size the union for the worst case: that the sets are completely - * disjoint */ - u = _new_invlist(len_a + len_b); - - /* Will contain U+0000 if either component does */ - array_u = _invlist_array_init(u, ( len_a > 0 && array_a[0] == 0) - || (len_b > 0 && array_b[0] == 0)); - - /* Go through each input list item by item, stopping when have exhausted - * one of them */ - while (i_a < len_a && i_b < len_b) { - UV cp; /* The element to potentially add to the union's array */ - bool cp_in_set; /* is it in the input list's set or not */ - - /* We need to take one or the other of the two inputs for the union. - * Since we are merging two sorted lists, we take the smaller of the - * next items. In case of a tie, we take first the one that is in its - * set. If we first took the one not in its set, it would decrement - * the count, possibly to 0 which would cause it to be output as ending - * the range, and the next time through we would take the same number, - * and output it again as beginning the next range. By doing it the - * opposite way, there is no possibility that the count will be - * momentarily decremented to 0, and thus the two adjoining ranges will - * be seamlessly merged. (In a tie and both are in the set or both not - * in the set, it doesn't matter which we take first.) */ - if ( array_a[i_a] < array_b[i_b] - || ( array_a[i_a] == array_b[i_b] - && ELEMENT_RANGE_MATCHES_INVLIST(i_a))) - { - cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_a); - cp = array_a[i_a++]; - } - else { - cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_b); - cp = array_b[i_b++]; - } + SetProgLen(RExC_rxi,RExC_size); - /* Here, have chosen which of the two inputs to look at. Only output - * if the running count changes to/from 0, which marks the - * beginning/end of a range that's in the set */ - if (cp_in_set) { - if (count == 0) { - array_u[i_u++] = cp; - } - count++; - } - else { - count--; - if (count == 0) { - array_u[i_u++] = cp; - } - } - } + DEBUG_DUMP_PRE_OPTIMIZE_r({ + SV * const sv = sv_newmortal(); + RXi_GET_DECL(RExC_rx, ri); + DEBUG_RExC_seen(); + Perl_re_printf( aTHX_ "Program before optimization:\n"); + (void)dumpuntil(RExC_rx, ri->program, ri->program + 1, NULL, NULL, + sv, 0, 0); + }); - /* The loop above increments the index into exactly one of the input lists - * each iteration, and ends when either index gets to its list end. That - * means the other index is lower than its end, and so something is - * remaining in that one. We decrement 'count', as explained below, if - * that list is in its set. (i_a and i_b each currently index the element - * beyond the one we care about.) */ - if ( (i_a != len_a && PREV_RANGE_MATCHES_INVLIST(i_a)) - || (i_b != len_b && PREV_RANGE_MATCHES_INVLIST(i_b))) - { - count--; - } + DEBUG_OPTIMISE_r( + Perl_re_printf( aTHX_ "Starting post parse optimization\n"); + ); - /* Above we decremented 'count' if the list that had unexamined elements in - * it was in its set. This has made it so that 'count' being non-zero - * means there isn't anything left to output; and 'count' equal to 0 means - * that what is left to output is precisely that which is left in the - * non-exhausted input list. - * - * To see why, note first that the exhausted input obviously has nothing - * left to add to the union. If it was in its set at its end, that means - * the set extends from here to the platform's infinity, and hence so does - * the union and the non-exhausted set is irrelevant. The exhausted set - * also contributed 1 to 'count'. If 'count' was 2, it got decremented to - * 1, but if it was 1, the non-exhausted set wasn't in its set, and so - * 'count' remains at 1. This is consistent with the decremented 'count' - * != 0 meaning there's nothing left to add to the union. - * - * But if the exhausted input wasn't in its set, it contributed 0 to - * 'count', and the rest of the union will be whatever the other input is. - * If 'count' was 0, neither list was in its set, and 'count' remains 0; - * otherwise it gets decremented to 0. This is consistent with 'count' - * == 0 meaning the remainder of the union is whatever is left in the - * non-exhausted list. */ - if (count != 0) { - len_u = i_u; - } - else { - IV copy_count = len_a - i_a; - if (copy_count > 0) { /* The non-exhausted input is 'a' */ - Copy(array_a + i_a, array_u + i_u, copy_count, UV); - } - else { /* The non-exhausted input is b */ - copy_count = len_b - i_b; - Copy(array_b + i_b, array_u + i_u, copy_count, UV); - } - len_u = i_u + copy_count; + /* XXXX To minimize changes to RE engine we always allocate + 3-units-long substrs field. */ + Newx(RExC_rx->substrs, 1, struct reg_substr_data); + if (RExC_recurse_count) { + Newx(RExC_recurse, RExC_recurse_count, regnode *); + SAVEFREEPV(RExC_recurse); } - /* Set the result to the final length, which can change the pointer to - * array_u, so re-find it. (Note that it is unlikely that this will - * change, as we are shrinking the space, not enlarging it) */ - if (len_u != _invlist_len(u)) { - invlist_set_len(u, len_u, *get_invlist_offset_addr(u)); - invlist_trim(u); - array_u = invlist_array(u); + if (RExC_seen & REG_RECURSE_SEEN) { + /* Note, RExC_total_parens is 1 + the number of parens in a pattern. + * So its 1 if there are no parens. */ + RExC_study_chunk_recursed_bytes= (RExC_total_parens >> 3) + + ((RExC_total_parens & 0x07) != 0); + Newx(RExC_study_chunk_recursed, + RExC_study_chunk_recursed_bytes * RExC_total_parens, U8); + SAVEFREEPV(RExC_study_chunk_recursed); } - if (*output == NULL) { /* Simply return the new inversion list */ - *output = u; - } - else { - /* Otherwise, overwrite the inversion list that was in '*output'. We - * could instead free '*output', and then set it to 'u', but experience - * has shown [perl #127392] that if the input is a mortal, we can get a - * huge build-up of these during regex compilation before they get - * freed. */ - invlist_replace_list_destroys_src(*output, u); - SvREFCNT_dec_NN(u); + reStudy: + RExC_rx->minlen = minlen = sawlookahead = sawplus = sawopen = sawminmod = 0; + DEBUG_r( + RExC_study_chunk_recursed_count= 0; + ); + Zero(RExC_rx->substrs, 1, struct reg_substr_data); + if (RExC_study_chunk_recursed) { + Zero(RExC_study_chunk_recursed, + RExC_study_chunk_recursed_bytes * RExC_total_parens, U8); } - return; -} - -void -Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, - const bool complement_b, SV** i) -{ - /* Take the intersection of two inversion lists and point '*i' to it. On - * input, '*i' MUST POINT TO NULL OR TO AN SV* INVERSION LIST (possibly - * even 'a' or 'b'). If to an inversion list, the contents of the original - * list will be replaced by the intersection. The first list, 'a', may be - * NULL, in which case '*i' will be an empty list. If 'complement_b' is - * TRUE, the result will be the intersection of 'a' and the complement (or - * inversion) of 'b' instead of 'b' directly. - * - * The basis for this comes from "Unicode Demystified" Chapter 13 by - * Richard Gillam, published by Addison-Wesley, and explained at some - * length there. The preface says to incorporate its examples into your - * code at your own risk. In fact, it had bugs - * - * The algorithm is like a merge sort, and is essentially the same as the - * union above - */ - const UV* array_a; /* a's array */ - const UV* array_b; - UV len_a; /* length of a's array */ - UV len_b; - - SV* r; /* the resulting intersection */ - UV* array_r; - UV len_r = 0; - - UV i_a = 0; /* current index into a's array */ - UV i_b = 0; - UV i_r = 0; - - /* running count of how many of the two inputs are postitioned at ranges - * that are in their sets. As explained in the algorithm source book, - * items are stopped accumulating and are output when the count changes - * to/from 2. The count is incremented when we start a range that's in an - * input's set, and decremented when we start a range that's not in a set. - * Only when it is 2 are we in the intersection. */ - UV count = 0; - - PERL_ARGS_ASSERT__INVLIST_INTERSECTION_MAYBE_COMPLEMENT_2ND; - assert(a != b); - assert(*i == NULL || is_invlist(*i)); - - /* Special case if either one is empty */ - len_a = (a == NULL) ? 0 : _invlist_len(a); - if ((len_a == 0) || ((len_b = _invlist_len(b)) == 0)) { - if (len_a != 0 && complement_b) { - - /* Here, 'a' is not empty, therefore from the enclosing 'if', 'b' - * must be empty. Here, also we are using 'b's complement, which - * hence must be every possible code point. Thus the intersection - * is simply 'a'. */ +#ifdef TRIE_STUDY_OPT + /* search for "restudy" in this file for a detailed explanation */ + if (!restudied) { + StructCopy(&zero_scan_data, &data, scan_data_t); + copyRExC_state = RExC_state; + } else { + U32 seen=RExC_seen; + DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "Restudying\n")); - if (*i == a) { /* No-op */ - return; - } + RExC_state = copyRExC_state; + if (seen & REG_TOP_LEVEL_BRANCHES_SEEN) + RExC_seen |= REG_TOP_LEVEL_BRANCHES_SEEN; + else + RExC_seen &= ~REG_TOP_LEVEL_BRANCHES_SEEN; + StructCopy(&zero_scan_data, &data, scan_data_t); + } +#else + StructCopy(&zero_scan_data, &data, scan_data_t); +#endif - if (*i == NULL) { - *i = invlist_clone(a, NULL); - return; - } + /* Dig out information for optimizations. */ + RExC_rx->extflags = RExC_flags; /* was pm_op */ + /*dmq: removed as part of de-PMOP: pm->op_pmflags = RExC_flags; */ - r = invlist_clone(a, NULL); - invlist_replace_list_destroys_src(*i, r); - SvREFCNT_dec_NN(r); - return; - } + if (UTF) + SvUTF8_on(Rx); /* Unicode in it? */ + RExC_rxi->regstclass = NULL; + if (RExC_naughty >= TOO_NAUGHTY) /* Probably an expensive pattern. */ + RExC_rx->intflags |= PREGf_NAUGHTY; + scan = RExC_rxi->program + 1; /* First BRANCH. */ - /* Here, 'a' or 'b' is empty and not using the complement of 'b'. The - * intersection must be empty */ - if (*i == NULL) { - *i = _new_invlist(0); - return; - } + /* testing for BRANCH here tells us whether there is "must appear" + data in the pattern. If there is then we can use it for optimisations */ + if (!(RExC_seen & REG_TOP_LEVEL_BRANCHES_SEEN)) { /* Only one top-level choice. + */ + SSize_t fake_deltap; + STRLEN longest_length[2]; + regnode_ssc ch_class; /* pointed to by data */ + int stclass_flag; + SSize_t last_close = 0; /* pointed to by data */ + regnode *first= scan; + regnode *first_next= regnext(first); + regnode *last_close_op= NULL; + int i; - invlist_clear(*i); - return; - } + /* + * Skip introductions and multiplicators >= 1 + * so that we can extract the 'meat' of the pattern that must + * match in the large if() sequence following. + * NOTE that EXACT is NOT covered here, as it is normally + * picked up by the optimiser separately. + * + * This is unfortunate as the optimiser isnt handling lookahead + * properly currently. + * + */ + while (1) + { + if (OP(first) == OPEN) + sawopen = 1; + else + if (OP(first) == IFMATCH && !FLAGS(first)) + /* for now we can't handle lookbehind IFMATCH */ + sawlookahead = 1; + else + if (OP(first) == PLUS) + sawplus = 1; + else + if (OP(first) == MINMOD) + sawminmod = 1; + else + if (!( + /* An OR of *one* alternative - should not happen now. */ + (OP(first) == BRANCH && OP(first_next) != BRANCH) || + /* An {n,m} with n>0 */ + (REGNODE_TYPE(OP(first)) == CURLY && ARG1i(first) > 0) || + (OP(first) == NOTHING && REGNODE_TYPE(OP(first_next)) != END) + )){ + break; + } - /* Here both lists exist and are non-empty */ - array_a = invlist_array(a); - array_b = invlist_array(b); - - /* If are to take the intersection of 'a' with the complement of b, set it - * up so are looking at b's complement. */ - if (complement_b) { - - /* To complement, we invert: if the first element is 0, remove it. To - * do this, we just pretend the array starts one later */ - if (array_b[0] == 0) { - array_b++; - len_b--; + first = REGNODE_AFTER(first); + first_next= regnext(first); } - else { - /* But if the first element is not zero, we pretend the list starts - * at the 0 that is always stored immediately before the array. */ - array_b--; - len_b++; + /* Starting-point info. */ + again: + DEBUG_PEEP("first:", first, 0, 0); + /* Ignore EXACT as we deal with it later. */ + if (REGNODE_TYPE(OP(first)) == EXACT) { + if (! isEXACTFish(OP(first))) { + NOOP; /* Empty, get anchored substr later. */ + } + else + RExC_rxi->regstclass = first; } - } - - /* Size the intersection for the worst case: that the intersection ends up - * fragmenting everything to be completely disjoint */ - r= _new_invlist(len_a + len_b); - - /* Will contain U+0000 iff both components do */ - array_r = _invlist_array_init(r, len_a > 0 && array_a[0] == 0 - && len_b > 0 && array_b[0] == 0); - - /* Go through each list item by item, stopping when have exhausted one of - * them */ - while (i_a < len_a && i_b < len_b) { - UV cp; /* The element to potentially add to the intersection's - array */ - bool cp_in_set; /* Is it in the input list's set or not */ - - /* We need to take one or the other of the two inputs for the - * intersection. Since we are merging two sorted lists, we take the - * smaller of the next items. In case of a tie, we take first the one - * that is not in its set (a difference from the union algorithm). If - * we first took the one in its set, it would increment the count, - * possibly to 2 which would cause it to be output as starting a range - * in the intersection, and the next time through we would take that - * same number, and output it again as ending the set. By doing the - * opposite of this, there is no possibility that the count will be - * momentarily incremented to 2. (In a tie and both are in the set or - * both not in the set, it doesn't matter which we take first.) */ - if ( array_a[i_a] < array_b[i_b] - || ( array_a[i_a] == array_b[i_b] - && ! ELEMENT_RANGE_MATCHES_INVLIST(i_a))) +#ifdef TRIE_STCLASS + else if (REGNODE_TYPE(OP(first)) == TRIE && + ((reg_trie_data *)RExC_rxi->data->data[ ARG1u(first) ])->minlen>0) { - cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_a); - cp = array_a[i_a++]; - } - else { - cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_b); - cp= array_b[i_b++]; - } - - /* Here, have chosen which of the two inputs to look at. Only output - * if the running count changes to/from 2, which marks the - * beginning/end of a range that's in the intersection */ - if (cp_in_set) { - count++; - if (count == 2) { - array_r[i_r++] = cp; - } + /* this can happen only on restudy + * Search for "restudy" in this file to find + * a comment with details. */ + RExC_rxi->regstclass = construct_ahocorasick_from_trie(pRExC_state, (regnode *)first, 0); } - else { - if (count == 2) { - array_r[i_r++] = cp; - } - count--; +#endif + else if (REGNODE_SIMPLE(OP(first))) + RExC_rxi->regstclass = first; + else if (REGNODE_TYPE(OP(first)) == BOUND || + REGNODE_TYPE(OP(first)) == NBOUND) + RExC_rxi->regstclass = first; + else if (REGNODE_TYPE(OP(first)) == BOL) { + RExC_rx->intflags |= (OP(first) == MBOL + ? PREGf_ANCH_MBOL + : PREGf_ANCH_SBOL); + first = REGNODE_AFTER(first); + goto again; } - - } - - /* The loop above increments the index into exactly one of the input lists - * each iteration, and ends when either index gets to its list end. That - * means the other index is lower than its end, and so something is - * remaining in that one. We increment 'count', as explained below, if the - * exhausted list was in its set. (i_a and i_b each currently index the - * element beyond the one we care about.) */ - if ( (i_a == len_a && PREV_RANGE_MATCHES_INVLIST(i_a)) - || (i_b == len_b && PREV_RANGE_MATCHES_INVLIST(i_b))) - { - count++; - } - - /* Above we incremented 'count' if the exhausted list was in its set. This - * has made it so that 'count' being below 2 means there is nothing left to - * output; otheriwse what's left to add to the intersection is precisely - * that which is left in the non-exhausted input list. - * - * To see why, note first that the exhausted input obviously has nothing - * left to affect the intersection. If it was in its set at its end, that - * means the set extends from here to the platform's infinity, and hence - * anything in the non-exhausted's list will be in the intersection, and - * anything not in it won't be. Hence, the rest of the intersection is - * precisely what's in the non-exhausted list The exhausted set also - * contributed 1 to 'count', meaning 'count' was at least 1. Incrementing - * it means 'count' is now at least 2. This is consistent with the - * incremented 'count' being >= 2 means to add the non-exhausted list to - * the intersection. - * - * But if the exhausted input wasn't in its set, it contributed 0 to - * 'count', and the intersection can't include anything further; the - * non-exhausted set is irrelevant. 'count' was at most 1, and doesn't get - * incremented. This is consistent with 'count' being < 2 meaning nothing - * further to add to the intersection. */ - if (count < 2) { /* Nothing left to put in the intersection. */ - len_r = i_r; - } - else { /* copy the non-exhausted list, unchanged. */ - IV copy_count = len_a - i_a; - if (copy_count > 0) { /* a is the one with stuff left */ - Copy(array_a + i_a, array_r + i_r, copy_count, UV); - } - else { /* b is the one with stuff left */ - copy_count = len_b - i_b; - Copy(array_b + i_b, array_r + i_r, copy_count, UV); - } - len_r = i_r + copy_count; - } - - /* Set the result to the final length, which can change the pointer to - * array_r, so re-find it. (Note that it is unlikely that this will - * change, as we are shrinking the space, not enlarging it) */ - if (len_r != _invlist_len(r)) { - invlist_set_len(r, len_r, *get_invlist_offset_addr(r)); - invlist_trim(r); - array_r = invlist_array(r); - } - - if (*i == NULL) { /* Simply return the calculated intersection */ - *i = r; - } - else { /* Otherwise, replace the existing inversion list in '*i'. We could - instead free '*i', and then set it to 'r', but experience has - shown [perl #127392] that if the input is a mortal, we can get a - huge build-up of these during regex compilation before they get - freed. */ - if (len_r) { - invlist_replace_list_destroys_src(*i, r); + else if (OP(first) == GPOS) { + RExC_rx->intflags |= PREGf_ANCH_GPOS; + first = REGNODE_AFTER_type(first,tregnode_GPOS); + goto again; } - else { - invlist_clear(*i); + else if ((!sawopen || !RExC_sawback) && + !sawlookahead && + (OP(first) == STAR && + REGNODE_TYPE(OP(REGNODE_AFTER(first))) == REG_ANY) && + !(RExC_rx->intflags & PREGf_ANCH) && !(RExC_seen & REG_PESSIMIZE_SEEN)) + { + /* turn .* into ^.* with an implied $*=1 */ + const int type = + (OP(REGNODE_AFTER(first)) == REG_ANY) + ? PREGf_ANCH_MBOL + : PREGf_ANCH_SBOL; + RExC_rx->intflags |= (type | PREGf_IMPLICIT); + first = REGNODE_AFTER(first); + goto again; } - SvREFCNT_dec_NN(r); - } - - return; -} + if (sawplus && !sawminmod && !sawlookahead + && (!sawopen || !RExC_sawback) + && !(RExC_seen & REG_PESSIMIZE_SEEN)) /* May examine pos and $& */ + /* x+ must match at the 1st pos of run of x's */ + RExC_rx->intflags |= PREGf_SKIP; -SV* -Perl__add_range_to_invlist(pTHX_ SV* invlist, UV start, UV end) -{ - /* Add the range from 'start' to 'end' inclusive to the inversion list's - * set. A pointer to the inversion list is returned. This may actually be - * a new list, in which case the passed in one has been destroyed. The - * passed-in inversion list can be NULL, in which case a new one is created - * with just the one range in it. The new list is not necessarily - * NUL-terminated. Space is not freed if the inversion list shrinks as a - * result of this function. The gain would not be large, and in many - * cases, this is called multiple times on a single inversion list, so - * anything freed may almost immediately be needed again. - * - * This used to mostly call the 'union' routine, but that is much more - * heavyweight than really needed for a single range addition */ + /* Scan is after the zeroth branch, first is atomic matcher. */ +#ifdef TRIE_STUDY_OPT + /* search for "restudy" in this file for a detailed explanation */ + DEBUG_PARSE_r( + if (!restudied) + Perl_re_printf( aTHX_ "first at %" IVdf "\n", + (IV)(first - scan + 1)) + ); +#else + DEBUG_PARSE_r( + Perl_re_printf( aTHX_ "first at %" IVdf "\n", + (IV)(first - scan + 1)) + ); +#endif - UV* array; /* The array implementing the inversion list */ - UV len; /* How many elements in 'array' */ - SSize_t i_s; /* index into the invlist array where 'start' - should go */ - SSize_t i_e = 0; /* And the index where 'end' should go */ - UV cur_highest; /* The highest code point in the inversion list - upon entry to this function */ - - /* This range becomes the whole inversion list if none already existed */ - if (invlist == NULL) { - invlist = _new_invlist(2); - _append_range_to_invlist(invlist, start, end); - return invlist; - } - - /* Likewise, if the inversion list is currently empty */ - len = _invlist_len(invlist); - if (len == 0) { - _append_range_to_invlist(invlist, start, end); - return invlist; - } - - /* Starting here, we have to know the internals of the list */ - array = invlist_array(invlist); - - /* If the new range ends higher than the current highest ... */ - cur_highest = invlist_highest(invlist); - if (end > cur_highest) { - - /* If the whole range is higher, we can just append it */ - if (start > cur_highest) { - _append_range_to_invlist(invlist, start, end); - return invlist; - } - - /* Otherwise, add the portion that is higher ... */ - _append_range_to_invlist(invlist, cur_highest + 1, end); - - /* ... and continue on below to handle the rest. As a result of the - * above append, we know that the index of the end of the range is the - * final even numbered one of the array. Recall that the final element - * always starts a range that extends to infinity. If that range is in - * the set (meaning the set goes from here to infinity), it will be an - * even index, but if it isn't in the set, it's odd, and the final - * range in the set is one less, which is even. */ - if (end == UV_MAX) { - i_e = len; - } - else { - i_e = len - 2; - } - } - /* We have dealt with appending, now see about prepending. If the new - * range starts lower than the current lowest ... */ - if (start < array[0]) { + /* + * If there's something expensive in the r.e., find the + * longest literal string that must appear and make it the + * regmust. Resolve ties in favor of later strings, since + * the regstart check works with the beginning of the r.e. + * and avoiding duplication strengthens checking. Not a + * strong reason, but sufficient in the absence of others. + * [Now we resolve ties in favor of the earlier string if + * it happens that c_offset_min has been invalidated, since the + * earlier string may buy us something the later one won't.] + */ - /* Adding something which has 0 in it is somewhat tricky, and uncommon. - * Let the union code handle it, rather than having to know the - * trickiness in two code places. */ - if (UNLIKELY(start == 0)) { - SV* range_invlist; + data.substrs[0].str = newSVpvs(""); + data.substrs[1].str = newSVpvs(""); + data.last_found = newSVpvs(""); + data.cur_is_floating = 0; /* initially any found substring is fixed */ + ENTER_with_name("study_chunk"); + SAVEFREESV(data.substrs[0].str); + SAVEFREESV(data.substrs[1].str); + SAVEFREESV(data.last_found); + first = scan; + if (!RExC_rxi->regstclass) { + ssc_init(pRExC_state, &ch_class); + data.start_class = &ch_class; + stclass_flag = SCF_DO_STCLASS_AND; + } else /* XXXX Check for BOUND? */ + stclass_flag = 0; + data.last_closep = &last_close; + data.last_close_opp = &last_close_op; - range_invlist = _new_invlist(2); - _append_range_to_invlist(range_invlist, start, end); + DEBUG_RExC_seen(); + /* + * MAIN ENTRY FOR study_chunk() FOR m/PATTERN/ + * (NO top level branches) + */ + minlen = study_chunk(pRExC_state, &first, &minlen, &fake_deltap, + scan + RExC_size, /* Up to end */ + &data, -1, 0, NULL, + SCF_DO_SUBSTR | SCF_WHILEM_VISITED_POS | stclass_flag + | (restudied ? SCF_TRIE_DOING_RESTUDY : 0), + 0, TRUE); + /* search for "restudy" in this file for a detailed explanation + * of 'restudied' and SCF_TRIE_DOING_RESTUDY */ - _invlist_union(invlist, range_invlist, &invlist); - SvREFCNT_dec_NN(range_invlist); + CHECK_RESTUDY_GOTO_butfirst(LEAVE_with_name("study_chunk")); - return invlist; - } - /* If the whole new range comes before the first entry, and doesn't - * extend it, we have to insert it as an additional range */ - if (end < array[0] - 1) { - i_s = i_e = -1; - goto splice_in_new_range; + if ( RExC_total_parens == 1 && !data.cur_is_floating + && data.last_start_min == 0 && data.last_end > 0 + && !RExC_seen_zerolen + && !(RExC_seen & REG_VERBARG_SEEN) + && !(RExC_seen & REG_GPOS_SEEN) + ){ + RExC_rx->extflags |= RXf_CHECK_ALL; } + scan_commit(pRExC_state, &data,&minlen, 0); - /* Here the new range adjoins the existing first range, extending it - * downwards. */ - array[0] = start; - - /* And continue on below to handle the rest. We know that the index of - * the beginning of the range is the first one of the array */ - i_s = 0; - } - else { /* Not prepending any part of the new range to the existing list. - * Find where in the list it should go. This finds i_s, such that: - * invlist[i_s] <= start < array[i_s+1] - */ - i_s = _invlist_search(invlist, start); - } - - /* At this point, any extending before the beginning of the inversion list - * and/or after the end has been done. This has made it so that, in the - * code below, each endpoint of the new range is either in a range that is - * in the set, or is in a gap between two ranges that are. This means we - * don't have to worry about exceeding the array bounds. - * - * Find where in the list the new range ends (but we can skip this if we - * have already determined what it is, or if it will be the same as i_s, - * which we already have computed) */ - if (i_e == 0) { - i_e = (start == end) - ? i_s - : _invlist_search(invlist, end); - } - - /* Here generally invlist[i_e] <= end < array[i_e+1]. But if invlist[i_e] - * is a range that goes to infinity there is no element at invlist[i_e+1], - * so only the first relation holds. */ - if ( ! ELEMENT_RANGE_MATCHES_INVLIST(i_s)) { + /* XXX this is done in reverse order because that's the way the + * code was before it was parameterised. Don't know whether it + * actually needs doing in reverse order. DAPM */ + for (i = 1; i >= 0; i--) { + longest_length[i] = CHR_SVLEN(data.substrs[i].str); - /* Here, the ranges on either side of the beginning of the new range - * are in the set, and this range starts in the gap between them. - * - * The new range extends the range above it downwards if the new range - * ends at or above that range's start */ - const bool extends_the_range_above = ( end == UV_MAX - || end + 1 >= array[i_s+1]); - - /* The new range extends the range below it upwards if it begins just - * after where that range ends */ - if (start == array[i_s]) { - - /* If the new range fills the entire gap between the other ranges, - * they will get merged together. Other ranges may also get - * merged, depending on how many of them the new range spans. In - * the general case, we do the merge later, just once, after we - * figure out how many to merge. But in the case where the new - * range exactly spans just this one gap (possibly extending into - * the one above), we do the merge here, and an early exit. This - * is done here to avoid having to special case later. */ - if (i_e - i_s <= 1) { - - /* If i_e - i_s == 1, it means that the new range terminates - * within the range above, and hence 'extends_the_range_above' - * must be true. (If the range above it extends to infinity, - * 'i_s+2' will be above the array's limit, but 'len-i_s-2' - * will be 0, so no harm done.) */ - if (extends_the_range_above) { - Move(array + i_s + 2, array + i_s, len - i_s - 2, UV); - invlist_set_len(invlist, - len - 2, - *(get_invlist_offset_addr(invlist))); - return invlist; - } + if ( !( i + && SvCUR(data.substrs[0].str) /* ok to leave SvCUR */ + && data.substrs[0].min_offset + == data.substrs[1].min_offset + && SvCUR(data.substrs[0].str) + == SvCUR(data.substrs[1].str) + ) + && S_setup_longest (aTHX_ pRExC_state, + &(RExC_rx->substrs->data[i]), + &(data.substrs[i]), + longest_length[i])) + { + RExC_rx->substrs->data[i].min_offset = + data.substrs[i].min_offset - data.substrs[i].lookbehind; - /* Here, i_e must == i_s. We keep them in sync, as they apply - * to the same range, and below we are about to decrement i_s - * */ - i_e--; + RExC_rx->substrs->data[i].max_offset = data.substrs[i].max_offset; + /* Don't offset infinity */ + if (data.substrs[i].max_offset < OPTIMIZE_INFTY) + RExC_rx->substrs->data[i].max_offset -= data.substrs[i].lookbehind; + SvREFCNT_inc_simple_void_NN(data.substrs[i].str); + } + else { + RExC_rx->substrs->data[i].substr = NULL; + RExC_rx->substrs->data[i].utf8_substr = NULL; + longest_length[i] = 0; } - - /* Here, the new range is adjacent to the one below. (It may also - * span beyond the range above, but that will get resolved later.) - * Extend the range below to include this one. */ - array[i_s] = (end == UV_MAX) ? UV_MAX : end + 1; - i_s--; - start = array[i_s]; } - else if (extends_the_range_above) { - /* Here the new range only extends the range above it, but not the - * one below. It merges with the one above. Again, we keep i_e - * and i_s in sync if they point to the same range */ - if (i_e == i_s) { - i_e++; - } - i_s++; - array[i_s] = start; - } - } + LEAVE_with_name("study_chunk"); - /* Here, we've dealt with the new range start extending any adjoining - * existing ranges. - * - * If the new range extends to infinity, it is now the final one, - * regardless of what was there before */ - if (UNLIKELY(end == UV_MAX)) { - invlist_set_len(invlist, i_s + 1, *(get_invlist_offset_addr(invlist))); - return invlist; - } + if (RExC_rxi->regstclass + && (OP(RExC_rxi->regstclass) == REG_ANY || OP(RExC_rxi->regstclass) == SANY)) + RExC_rxi->regstclass = NULL; - /* If i_e started as == i_s, it has also been dealt with, - * and been updated to the new i_s, which will fail the following if */ - if (! ELEMENT_RANGE_MATCHES_INVLIST(i_e)) { + if ((!(RExC_rx->substrs->data[0].substr || RExC_rx->substrs->data[0].utf8_substr) + || RExC_rx->substrs->data[0].min_offset) + && stclass_flag + && ! (ANYOF_FLAGS(data.start_class) & SSC_MATCHES_EMPTY_STRING) + && is_ssc_worth_it(pRExC_state, data.start_class)) + { + const U32 n = reg_add_data(pRExC_state, STR_WITH_LEN("f")); - /* Here, the ranges on either side of the end of the new range are in - * the set, and this range ends in the gap between them. - * - * If this range is adjacent to (hence extends) the range above it, it - * becomes part of that range; likewise if it extends the range below, - * it becomes part of that range */ - if (end + 1 == array[i_e+1]) { - i_e++; - array[i_e] = start; - } - else if (start <= array[i_e]) { - array[i_e] = end + 1; - i_e--; - } - } + ssc_finalize(pRExC_state, data.start_class); - if (i_s == i_e) { - - /* If the range fits entirely in an existing range (as possibly already - * extended above), it doesn't add anything new */ - if (ELEMENT_RANGE_MATCHES_INVLIST(i_s)) { - return invlist; - } - - /* Here, no part of the range is in the list. Must add it. It will - * occupy 2 more slots */ - splice_in_new_range: - - invlist_extend(invlist, len + 2); - array = invlist_array(invlist); - /* Move the rest of the array down two slots. Don't include any - * trailing NUL */ - Move(array + i_e + 1, array + i_e + 3, len - i_e - 1, UV); - - /* Do the actual splice */ - array[i_e+1] = start; - array[i_e+2] = end + 1; - invlist_set_len(invlist, len + 2, *(get_invlist_offset_addr(invlist))); - return invlist; - } - - /* Here the new range crossed the boundaries of a pre-existing range. The - * code above has adjusted things so that both ends are in ranges that are - * in the set. This means everything in between must also be in the set. - * Just squash things together */ - Move(array + i_e + 1, array + i_s + 1, len - i_e - 1, UV); - invlist_set_len(invlist, - len - i_e + i_s, - *(get_invlist_offset_addr(invlist))); + Newx(RExC_rxi->data->data[n], 1, regnode_ssc); + StructCopy(data.start_class, + (regnode_ssc*)RExC_rxi->data->data[n], + regnode_ssc); + RExC_rxi->regstclass = (regnode*)RExC_rxi->data->data[n]; + RExC_rx->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */ + DEBUG_COMPILE_r({ SV *sv = sv_newmortal(); + regprop(RExC_rx, sv, (regnode*)data.start_class, NULL, pRExC_state); + Perl_re_printf( aTHX_ + "synthetic stclass \"%s\".\n", + SvPVX_const(sv));}); + data.start_class = NULL; + } - return invlist; -} + /* A temporary algorithm prefers floated substr to fixed one of + * same length to dig more info. */ + i = (longest_length[0] <= longest_length[1]); + RExC_rx->substrs->check_ix = i; + RExC_rx->check_end_shift = RExC_rx->substrs->data[i].end_shift; + RExC_rx->check_substr = RExC_rx->substrs->data[i].substr; + RExC_rx->check_utf8 = RExC_rx->substrs->data[i].utf8_substr; + RExC_rx->check_offset_min = RExC_rx->substrs->data[i].min_offset; + RExC_rx->check_offset_max = RExC_rx->substrs->data[i].max_offset; + if (!i && (RExC_rx->intflags & (PREGf_ANCH_SBOL|PREGf_ANCH_GPOS))) + RExC_rx->intflags |= PREGf_NOSCAN; -SV* -Perl__setup_canned_invlist(pTHX_ const STRLEN size, const UV element0, - UV** other_elements_ptr) -{ - /* Create and return an inversion list whose contents are to be populated - * by the caller. The caller gives the number of elements (in 'size') and - * the very first element ('element0'). This function will set - * '*other_elements_ptr' to an array of UVs, where the remaining elements - * are to be placed. - * - * Obviously there is some trust involved that the caller will properly - * fill in the other elements of the array. - * - * (The first element needs to be passed in, as the underlying code does - * things differently depending on whether it is zero or non-zero) */ + if ((RExC_rx->check_substr || RExC_rx->check_utf8) ) { + RExC_rx->extflags |= RXf_USE_INTUIT; + if (SvTAIL(RExC_rx->check_substr ? RExC_rx->check_substr : RExC_rx->check_utf8)) + RExC_rx->extflags |= RXf_INTUIT_TAIL; + } - SV* invlist = _new_invlist(size); - bool offset; + /* XXX Unneeded? dmq (shouldn't as this is handled elsewhere) + if ( (STRLEN)minlen < longest_length[1] ) + minlen= longest_length[1]; + if ( (STRLEN)minlen < longest_length[0] ) + minlen= longest_length[0]; + */ + } + else { + /* Several toplevels. Best we can is to set minlen. */ + SSize_t fake_deltap; + regnode_ssc ch_class; + SSize_t last_close = 0; + regnode *last_close_op = NULL; - PERL_ARGS_ASSERT__SETUP_CANNED_INVLIST; + DEBUG_PARSE_r(Perl_re_printf( aTHX_ "\nMulti Top Level\n")); - invlist = add_cp_to_invlist(invlist, element0); - offset = *get_invlist_offset_addr(invlist); + scan = RExC_rxi->program + 1; + ssc_init(pRExC_state, &ch_class); + data.start_class = &ch_class; + data.last_closep = &last_close; + data.last_close_opp = &last_close_op; - invlist_set_len(invlist, size, offset); - *other_elements_ptr = invlist_array(invlist) + 1; - return invlist; -} + DEBUG_RExC_seen(); + /* + * MAIN ENTRY FOR study_chunk() FOR m/P1|P2|.../ + * (patterns WITH top level branches) + */ + minlen = study_chunk(pRExC_state, + &scan, &minlen, &fake_deltap, scan + RExC_size, &data, -1, 0, NULL, + SCF_DO_STCLASS_AND|SCF_WHILEM_VISITED_POS|(restudied + ? SCF_TRIE_DOING_RESTUDY + : 0), + 0, TRUE); + /* search for "restudy" in this file for a detailed explanation + * of 'restudied' and SCF_TRIE_DOING_RESTUDY */ -#endif + CHECK_RESTUDY_GOTO_butfirst(NOOP); -#ifndef PERL_IN_XSUB_RE -void -Perl__invlist_invert(pTHX_ SV* const invlist) -{ - /* Complement the input inversion list. This adds a 0 if the list didn't - * have a zero; removes it otherwise. As described above, the data - * structure is set up so that this is very efficient */ + RExC_rx->check_substr = NULL; + RExC_rx->check_utf8 = NULL; + RExC_rx->substrs->data[0].substr = NULL; + RExC_rx->substrs->data[0].utf8_substr = NULL; + RExC_rx->substrs->data[1].substr = NULL; + RExC_rx->substrs->data[1].utf8_substr = NULL; - PERL_ARGS_ASSERT__INVLIST_INVERT; + if (! (ANYOF_FLAGS(data.start_class) & SSC_MATCHES_EMPTY_STRING) + && is_ssc_worth_it(pRExC_state, data.start_class)) + { + const U32 n = reg_add_data(pRExC_state, STR_WITH_LEN("f")); - assert(! invlist_is_iterating(invlist)); + ssc_finalize(pRExC_state, data.start_class); - /* The inverse of matching nothing is matching everything */ - if (_invlist_len(invlist) == 0) { - _append_range_to_invlist(invlist, 0, UV_MAX); - return; + Newx(RExC_rxi->data->data[n], 1, regnode_ssc); + StructCopy(data.start_class, + (regnode_ssc*)RExC_rxi->data->data[n], + regnode_ssc); + RExC_rxi->regstclass = (regnode*)RExC_rxi->data->data[n]; + RExC_rx->intflags &= ~PREGf_SKIP; /* Used in find_byclass(). */ + DEBUG_COMPILE_r({ SV* sv = sv_newmortal(); + regprop(RExC_rx, sv, (regnode*)data.start_class, NULL, pRExC_state); + Perl_re_printf( aTHX_ + "synthetic stclass \"%s\".\n", + SvPVX_const(sv));}); + data.start_class = NULL; + } } - *get_invlist_offset_addr(invlist) = ! *get_invlist_offset_addr(invlist); -} - -SV* -Perl_invlist_clone(pTHX_ SV* const invlist, SV* new_invlist) -{ - /* Return a new inversion list that is a copy of the input one, which is - * unchanged. The new list will not be mortal even if the old one was. */ - - const STRLEN nominal_length = _invlist_len(invlist); - const STRLEN physical_length = SvCUR(invlist); - const bool offset = *(get_invlist_offset_addr(invlist)); - - PERL_ARGS_ASSERT_INVLIST_CLONE; - - if (new_invlist == NULL) { - new_invlist = _new_invlist(nominal_length); + if (RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN) { + RExC_rx->extflags |= RXf_UNBOUNDED_QUANTIFIER_SEEN; + RExC_rx->maxlen = REG_INFTY; } else { - sv_upgrade(new_invlist, SVt_INVLIST); - initialize_invlist_guts(new_invlist, nominal_length); + RExC_rx->maxlen = RExC_maxlen; } - *(get_invlist_offset_addr(new_invlist)) = offset; - invlist_set_len(new_invlist, nominal_length, offset); - Copy(SvPVX(invlist), SvPVX(new_invlist), physical_length, char); + /* Guard against an embedded (?=) or (?<=) with a longer minlen than + the "real" pattern. */ + DEBUG_OPTIMISE_r({ + Perl_re_printf( aTHX_ "minlen: %" IVdf " RExC_rx->minlen:%" IVdf " maxlen:%" IVdf "\n", + (IV)minlen, (IV)RExC_rx->minlen, (IV)RExC_maxlen); + }); + RExC_rx->minlenret = minlen; + if (RExC_rx->minlen < minlen) + RExC_rx->minlen = minlen; - return new_invlist; -} + if (RExC_seen & REG_RECURSE_SEEN ) { + RExC_rx->intflags |= PREGf_RECURSE_SEEN; + Newx(RExC_rx->recurse_locinput, RExC_rx->nparens + 1, char *); + } + if (RExC_seen & REG_GPOS_SEEN) + RExC_rx->intflags |= PREGf_GPOS_SEEN; -#endif + if (RExC_seen & REG_PESSIMIZE_SEEN) + RExC_rx->intflags |= PREGf_PESSIMIZE_SEEN; -PERL_STATIC_INLINE UV -S_invlist_lowest(SV* const invlist) -{ - /* Returns the lowest code point that matches an inversion list. This API - * has an ambiguity, as it returns 0 under either the lowest is actually - * 0, or if the list is empty. If this distinction matters to you, check - * for emptiness before calling this function */ + if (RExC_seen & REG_LOOKBEHIND_SEEN) + RExC_rx->extflags |= RXf_NO_INPLACE_SUBST; /* inplace might break the + lookbehind */ + if (pRExC_state->code_blocks) + RExC_rx->extflags |= RXf_EVAL_SEEN; - UV len = _invlist_len(invlist); - UV *array; + if (RExC_seen & REG_VERBARG_SEEN) { + RExC_rx->intflags |= PREGf_VERBARG_SEEN; + RExC_rx->extflags |= RXf_NO_INPLACE_SUBST; /* don't understand this! Yves */ + } - PERL_ARGS_ASSERT_INVLIST_LOWEST; + if (RExC_seen & REG_CUTGROUP_SEEN) + RExC_rx->intflags |= PREGf_CUTGROUP_SEEN; - if (len == 0) { - return 0; - } + if (pm_flags & PMf_USE_RE_EVAL) + RExC_rx->intflags |= PREGf_USE_RE_EVAL; - array = invlist_array(invlist); + if (RExC_paren_names) + RXp_PAREN_NAMES(RExC_rx) = MUTABLE_HV(SvREFCNT_inc(RExC_paren_names)); + else + RXp_PAREN_NAMES(RExC_rx) = NULL; - return array[0]; -} + /* If we have seen an anchor in our pattern then we set the extflag RXf_IS_ANCHORED + * so it can be used in pp.c */ + if (RExC_rx->intflags & PREGf_ANCH) + RExC_rx->extflags |= RXf_IS_ANCHORED; -STATIC SV * -S_invlist_contents(pTHX_ SV* const invlist, const bool traditional_style) -{ - /* Get the contents of an inversion list into a string SV so that they can - * be printed out. If 'traditional_style' is TRUE, it uses the format - * traditionally done for debug tracing; otherwise it uses a format - * suitable for just copying to the output, with blanks between ranges and - * a dash between range components */ - - UV start, end; - SV* output; - const char intra_range_delimiter = (traditional_style ? '\t' : '-'); - const char inter_range_delimiter = (traditional_style ? '\n' : ' '); - if (traditional_style) { - output = newSVpvs("\n"); - } - else { - output = newSVpvs(""); + { + /* this is used to identify "special" patterns that might result + * in Perl NOT calling the regex engine and instead doing the match "itself", + * particularly special cases in split//. By having the regex compiler + * do this pattern matching at a regop level (instead of by inspecting the pattern) + * we avoid weird issues with equivalent patterns resulting in different behavior, + * AND we allow non Perl engines to get the same optimizations by the setting the + * flags appropriately - Yves */ + regnode *first = RExC_rxi->program + 1; + U8 fop = OP(first); + regnode *next = NULL; + U8 nop = 0; + if (fop == NOTHING || fop == MBOL || fop == SBOL || fop == PLUS) { + next = REGNODE_AFTER(first); + nop = OP(next); + } + /* It's safe to read through *next only if OP(first) is a regop of + * the right type (not EXACT, for example). + */ + if (REGNODE_TYPE(fop) == NOTHING && nop == END) + RExC_rx->extflags |= RXf_NULL; + else if ((fop == MBOL || (fop == SBOL && !FLAGS(first))) && nop == END) + /* when fop is SBOL first->flags will be true only when it was + * produced by parsing /\A/, and not when parsing /^/. This is + * very important for the split code as there we want to + * treat /^/ as /^/m, but we do not want to treat /\A/ as /^/m. + * See rt #122761 for more details. -- Yves */ + RExC_rx->extflags |= RXf_START_ONLY; + else if (fop == PLUS + && REGNODE_TYPE(nop) == POSIXD && FLAGS(next) == CC_SPACE_ + && OP(regnext(first)) == END) + RExC_rx->extflags |= RXf_WHITE; + else if ( RExC_rx->extflags & RXf_SPLIT + && (REGNODE_TYPE(fop) == EXACT && ! isEXACTFish(fop)) + && STR_LEN(first) == 1 + && *(STRING(first)) == ' ' + && OP(regnext(first)) == END ) + RExC_rx->extflags |= (RXf_SKIPWHITE|RXf_WHITE); + } - PERL_ARGS_ASSERT_INVLIST_CONTENTS; + if (RExC_contains_locale) { + RXp_EXTFLAGS(RExC_rx) |= RXf_TAINTED; + } - assert(! invlist_is_iterating(invlist)); +#ifdef DEBUGGING + if (RExC_paren_names) { + RExC_rxi->name_list_idx = reg_add_data( pRExC_state, STR_WITH_LEN("a")); + RExC_rxi->data->data[RExC_rxi->name_list_idx] + = (void*)SvREFCNT_inc(RExC_paren_name_list); + } else +#endif + RExC_rxi->name_list_idx = 0; - invlist_iterinit(invlist); - while (invlist_iternext(invlist, &start, &end)) { - if (end == UV_MAX) { - Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%cINFTY%c", - start, intra_range_delimiter, - inter_range_delimiter); - } - else if (end != start) { - Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%c%04" UVXf "%c", - start, - intra_range_delimiter, - end, inter_range_delimiter); - } - else { - Perl_sv_catpvf(aTHX_ output, "%04" UVXf "%c", - start, inter_range_delimiter); - } + while ( RExC_recurse_count > 0 ) { + const regnode *scan = RExC_recurse[ --RExC_recurse_count ]; + /* + * This data structure is set up in study_chunk() and is used + * to calculate the distance between a GOSUB regopcode and + * the OPEN/CURLYM (CURLYM's are special and can act like OPEN's) + * it refers to. + * + * If for some reason someone writes code that optimises + * away a GOSUB opcode then the assert should be changed to + * an if(scan) to guard the ARG2i_SET() - Yves + * + */ + assert(scan && OP(scan) == GOSUB); + ARG2i_SET( scan, RExC_open_parens[ARG1u(scan)] - REGNODE_OFFSET(scan)); } - - if (SvCUR(output) && ! traditional_style) {/* Get rid of trailing blank */ - SvCUR_set(output, SvCUR(output) - 1); + if (RExC_logical_total_parens != RExC_total_parens) { + Newxz(RExC_parno_to_logical_next, RExC_total_parens, I32); + /* we rebuild this below */ + Zero(RExC_logical_to_parno, RExC_total_parens, I32); + for( int parno = RExC_total_parens-1 ; parno > 0 ; parno-- ) { + int logical_parno= RExC_parno_to_logical[parno]; + assert(logical_parno); + RExC_parno_to_logical_next[parno]= RExC_logical_to_parno[logical_parno]; + RExC_logical_to_parno[logical_parno] = parno; + } + RExC_rx->logical_to_parno = RExC_logical_to_parno; + RExC_rx->parno_to_logical = RExC_parno_to_logical; + RExC_rx->parno_to_logical_next = RExC_parno_to_logical_next; + RExC_logical_to_parno = NULL; + RExC_parno_to_logical = NULL; + RExC_parno_to_logical_next = NULL; + } else { + RExC_rx->logical_to_parno = NULL; + RExC_rx->parno_to_logical = NULL; + RExC_rx->parno_to_logical_next = NULL; } - return output; -} + Newxz(RXp_OFFSp(RExC_rx), RExC_total_parens, regexp_paren_pair); + /* assume we don't need to swap parens around before we match */ + DEBUG_TEST_r({ + Perl_re_printf( aTHX_ "study_chunk_recursed_count: %lu\n", + (unsigned long)RExC_study_chunk_recursed_count); + }); + DEBUG_DUMP_r({ + DEBUG_RExC_seen(); + Perl_re_printf( aTHX_ "Final program:\n"); + regdump(RExC_rx); + }); -#ifndef PERL_IN_XSUB_RE -void -Perl__invlist_dump(pTHX_ PerlIO *file, I32 level, - const char * const indent, SV* const invlist) -{ - /* Designed to be called only by do_sv_dump(). Dumps out the ranges of the - * inversion list 'invlist' to 'file' at 'level' Each line is prefixed by - * the string 'indent'. The output looks like this: - [0] 0x000A .. 0x000D - [2] 0x0085 - [4] 0x2028 .. 0x2029 - [6] 0x3104 .. INFTY - * This means that the first range of code points matched by the list are - * 0xA through 0xD; the second range contains only the single code point - * 0x85, etc. An inversion list is an array of UVs. Two array elements - * are used to define each range (except if the final range extends to - * infinity, only a single element is needed). The array index of the - * first element for the corresponding range is given in brackets. */ - - UV start, end; - STRLEN count = 0; - - PERL_ARGS_ASSERT__INVLIST_DUMP; - - if (invlist_is_iterating(invlist)) { - Perl_dump_indent(aTHX_ level, file, - "%sCan't dump inversion list because is in middle of iterating\n", - indent); - return; + if (RExC_open_parens) { + Safefree(RExC_open_parens); + RExC_open_parens = NULL; + } + if (RExC_close_parens) { + Safefree(RExC_close_parens); + RExC_close_parens = NULL; } - - invlist_iterinit(invlist); - while (invlist_iternext(invlist, &start, &end)) { - if (end == UV_MAX) { - Perl_dump_indent(aTHX_ level, file, - "%s[%" UVuf "] 0x%04" UVXf " .. INFTY\n", - indent, (UV)count, start); - } - else if (end != start) { - Perl_dump_indent(aTHX_ level, file, - "%s[%" UVuf "] 0x%04" UVXf " .. 0x%04" UVXf "\n", - indent, (UV)count, start, end); - } - else { - Perl_dump_indent(aTHX_ level, file, "%s[%" UVuf "] 0x%04" UVXf "\n", - indent, (UV)count, start); - } - count += 2; + if (RExC_logical_to_parno) { + Safefree(RExC_logical_to_parno); + RExC_logical_to_parno = NULL; + } + if (RExC_parno_to_logical) { + Safefree(RExC_parno_to_logical); + RExC_parno_to_logical = NULL; } -} +#ifdef USE_ITHREADS + /* under ithreads the ?pat? PMf_USED flag on the pmop is simulated + * by setting the regexp SV to readonly-only instead. If the + * pattern's been recompiled, the USEDness should remain. */ + if (old_re && SvREADONLY(old_re)) + SvREADONLY_on(Rx); #endif + return Rx; +} -#if defined(PERL_ARGS_ASSERT__INVLISTEQ) && !defined(PERL_IN_XSUB_RE) -bool -Perl__invlistEQ(pTHX_ SV* const a, SV* const b, const bool complement_b) -{ - /* Return a boolean as to if the two passed in inversion lists are - * identical. The final argument, if TRUE, says to take the complement of - * the second inversion list before doing the comparison */ - - const UV len_a = _invlist_len(a); - UV len_b = _invlist_len(b); - - const UV* array_a = NULL; - const UV* array_b = NULL; - - PERL_ARGS_ASSERT__INVLISTEQ; - - /* This code avoids accessing the arrays unless it knows the length is - * non-zero */ - if (len_a == 0) { - if (len_b == 0) { - return ! complement_b; - } - } - else { - array_a = invlist_array(a); - } - if (len_b != 0) { - array_b = invlist_array(b); - } +SV* +Perl_reg_qr_package(pTHX_ REGEXP * const rx) +{ + PERL_ARGS_ASSERT_REG_QR_PACKAGE; + PERL_UNUSED_ARG(rx); + if (0) + return NULL; + else + return newSVpvs("Regexp"); +} - /* If are to compare 'a' with the complement of b, set it - * up so are looking at b's complement. */ - if (complement_b) { +/* Scans the name of a named buffer from the pattern. + * If flags is REG_RSN_RETURN_NULL returns null. + * If flags is REG_RSN_RETURN_NAME returns an SV* containing the name + * If flags is REG_RSN_RETURN_DATA returns the data SV* corresponding + * to the parsed name as looked up in the RExC_paren_names hash. + * If there is an error throws a vFAIL().. type exception. + */ - /* The complement of nothing is everything, so would have to have - * just one element, starting at zero (ending at infinity) */ - if (len_b == 0) { - return (len_a == 1 && array_a[0] == 0); - } - if (array_b[0] == 0) { +#define REG_RSN_RETURN_NULL 0 +#define REG_RSN_RETURN_NAME 1 +#define REG_RSN_RETURN_DATA 2 - /* Otherwise, to complement, we invert. Here, the first element is - * 0, just remove it. To do this, we just pretend the array starts - * one later */ +STATIC SV* +S_reg_scan_name(pTHX_ RExC_state_t *pRExC_state, U32 flags) +{ + char *name_start = RExC_parse; + SV* sv_name; - array_b++; - len_b--; - } - else { + PERL_ARGS_ASSERT_REG_SCAN_NAME; - /* But if the first element is not zero, we pretend the list starts - * at the 0 that is always stored immediately before the array. */ - array_b--; - len_b++; - } + assert (RExC_parse <= RExC_end); + if (RExC_parse == RExC_end) NOOP; + else if (isIDFIRST_lazy_if_safe(RExC_parse, RExC_end, UTF)) { + /* Note that the code here assumes well-formed UTF-8. Skip IDFIRST by + * using do...while */ + if (UTF) + do { + RExC_parse_inc_utf8(); + } while ( RExC_parse < RExC_end + && isWORDCHAR_utf8_safe((U8*)RExC_parse, (U8*) RExC_end)); + else + do { + RExC_parse_inc_by(1); + } while (RExC_parse < RExC_end && isWORDCHAR(*RExC_parse)); + } else { + RExC_parse_inc_by(1); /* so the <- from the vFAIL is after the offending + character */ + vFAIL("Group name must start with a non-digit word character"); } + sv_name = newSVpvn_flags(name_start, (int)(RExC_parse - name_start), + SVs_TEMP | (UTF ? SVf_UTF8 : 0)); + if ( flags == REG_RSN_RETURN_NAME) + return sv_name; + else if (flags==REG_RSN_RETURN_DATA) { + HE *he_str = NULL; + SV *sv_dat = NULL; + if ( ! sv_name ) /* should not happen*/ + Perl_croak(aTHX_ "panic: no svname in reg_scan_name"); + if (RExC_paren_names) + he_str = hv_fetch_ent( RExC_paren_names, sv_name, 0, 0 ); + if ( he_str ) + sv_dat = HeVAL(he_str); + if ( ! sv_dat ) { /* Didn't find group */ - return len_a == len_b - && memEQ(array_a, array_b, len_a * sizeof(array_a[0])); - -} -#endif - -/* - * As best we can, determine the characters that can match the start of - * the given EXACTF-ish node. This is for use in creating ssc nodes, so there - * can be false positive matches - * - * Returns the invlist as a new SV*; it is the caller's responsibility to - * call SvREFCNT_dec() when done with it. - */ -STATIC SV* -S_make_exactf_invlist(pTHX_ RExC_state_t *pRExC_state, regnode *node) -{ - const U8 * s = (U8*)STRING(node); - SSize_t bytelen = STR_LEN(node); - UV uc; - /* Start out big enough for 2 separate code points */ - SV* invlist = _new_invlist(4); - - PERL_ARGS_ASSERT_MAKE_EXACTF_INVLIST; - - if (! UTF) { - uc = *s; - - /* We punt and assume can match anything if the node begins - * with a multi-character fold. Things are complicated. For - * example, /ffi/i could match any of: - * "\N{LATIN SMALL LIGATURE FFI}" - * "\N{LATIN SMALL LIGATURE FF}I" - * "F\N{LATIN SMALL LIGATURE FI}" - * plus several other things; and making sure we have all the - * possibilities is hard. */ - if (is_MULTI_CHAR_FOLD_latin1_safe(s, s + bytelen)) { - invlist = _add_range_to_invlist(invlist, 0, UV_MAX); - } - else { - /* Any Latin1 range character can potentially match any - * other depending on the locale, and in Turkic locales, U+130 and - * U+131 */ - if (OP(node) == EXACTFL) { - _invlist_union(invlist, PL_Latin1, &invlist); - invlist = add_cp_to_invlist(invlist, - LATIN_SMALL_LETTER_DOTLESS_I); - invlist = add_cp_to_invlist(invlist, - LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE); + /* It might be a forward reference; we can't fail until we + * know, by completing the parse to get all the groups, and + * then reparsing */ + if (ALL_PARENS_COUNTED) { + vFAIL("Reference to nonexistent named group"); } else { - /* But otherwise, it matches at least itself. We can - * quickly tell if it has a distinct fold, and if so, - * it matches that as well */ - invlist = add_cp_to_invlist(invlist, uc); - if (IS_IN_SOME_FOLD_L1(uc)) - invlist = add_cp_to_invlist(invlist, PL_fold_latin1[uc]); - } - - /* Some characters match above-Latin1 ones under /i. This - * is true of EXACTFL ones when the locale is UTF-8 */ - if (HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(uc) - && (! isASCII(uc) || ! inRANGE(OP(node), EXACTFAA, - EXACTFAA_NO_TRIE))) - { - add_above_Latin1_folds(pRExC_state, (U8) uc, &invlist); + REQUIRE_PARENS_PASS; } } + return sv_dat; } - else { /* Pattern is UTF-8 */ - U8 folded[UTF8_MAX_FOLD_CHAR_EXPAND * UTF8_MAXBYTES_CASE + 1] = { '\0' }; - const U8* e = s + bytelen; - IV fc; - - fc = uc = utf8_to_uvchr_buf(s, s + bytelen, NULL); - - /* The only code points that aren't folded in a UTF EXACTFish - * node are the problematic ones in EXACTFL nodes */ - if (OP(node) == EXACTFL && is_PROBLEMATIC_LOCALE_FOLDEDS_START_cp(uc)) { - /* We need to check for the possibility that this EXACTFL - * node begins with a multi-char fold. Therefore we fold - * the first few characters of it so that we can make that - * check */ - U8 *d = folded; - int i; - - fc = -1; - for (i = 0; i < UTF8_MAX_FOLD_CHAR_EXPAND && s < e; i++) { - if (isASCII(*s)) { - *(d++) = (U8) toFOLD(*s); - if (fc < 0) { /* Save the first fold */ - fc = *(d-1); - } - s++; - } - else { - STRLEN len; - UV fold = toFOLD_utf8_safe(s, e, d, &len); - if (fc < 0) { /* Save the first fold */ - fc = fold; - } - d += len; - s += UTF8SKIP(s); - } - } - - /* And set up so the code below that looks in this folded - * buffer instead of the node's string */ - e = d; - s = folded; - } - - /* When we reach here 's' points to the fold of the first - * character(s) of the node; and 'e' points to far enough along - * the folded string to be just past any possible multi-char - * fold. - * - * Like the non-UTF case above, we punt if the node begins with a - * multi-char fold */ - - if (is_MULTI_CHAR_FOLD_utf8_safe(s, e)) { - invlist = _add_range_to_invlist(invlist, 0, UV_MAX); - } - else { /* Single char fold */ - unsigned int k; - U32 first_fold; - const U32 * remaining_folds; - Size_t folds_count; - - /* It matches itself */ - invlist = add_cp_to_invlist(invlist, fc); - - /* ... plus all the things that fold to it, which are found in - * PL_utf8_foldclosures */ - folds_count = _inverse_folds(fc, &first_fold, - &remaining_folds); - for (k = 0; k < folds_count; k++) { - UV c = (k == 0) ? first_fold : remaining_folds[k-1]; - - /* /aa doesn't allow folds between ASCII and non- */ - if ( inRANGE(OP(node), EXACTFAA, EXACTFAA_NO_TRIE) - && isASCII(c) != isASCII(fc)) - { - continue; - } - invlist = add_cp_to_invlist(invlist, c); - } + Perl_croak(aTHX_ "panic: bad flag %lx in reg_scan_name", + (unsigned long) flags); +} - if (OP(node) == EXACTFL) { +#define DEBUG_PARSE_MSG(funcname) DEBUG_PARSE_r({ \ + if (RExC_lastparse!=RExC_parse) { \ + Perl_re_printf( aTHX_ "%s", \ + Perl_pv_pretty(aTHX_ RExC_mysv1, RExC_parse, \ + RExC_end - RExC_parse, 16, \ + "", "", \ + PERL_PV_ESCAPE_UNI_DETECT | \ + PERL_PV_PRETTY_ELLIPSES | \ + PERL_PV_PRETTY_LTGT | \ + PERL_PV_ESCAPE_RE | \ + PERL_PV_PRETTY_EXACTSIZE \ + ) \ + ); \ + } else \ + Perl_re_printf( aTHX_ "%16s",""); \ + \ + if (RExC_lastnum!=RExC_emit) \ + Perl_re_printf( aTHX_ "|%4zu", RExC_emit); \ + else \ + Perl_re_printf( aTHX_ "|%4s",""); \ + Perl_re_printf( aTHX_ "|%*s%-4s", \ + (int)((depth*2)), "", \ + (funcname) \ + ); \ + RExC_lastnum=RExC_emit; \ + RExC_lastparse=RExC_parse; \ +}) - /* If either [iI] are present in an EXACTFL node the above code - * should have added its normal case pair, but under a Turkish - * locale they could match instead the case pairs from it. Add - * those as potential matches as well */ - if (isALPHA_FOLD_EQ(fc, 'I')) { - invlist = add_cp_to_invlist(invlist, - LATIN_SMALL_LETTER_DOTLESS_I); - invlist = add_cp_to_invlist(invlist, - LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE); - } - else if (fc == LATIN_SMALL_LETTER_DOTLESS_I) { - invlist = add_cp_to_invlist(invlist, 'I'); - } - else if (fc == LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) { - invlist = add_cp_to_invlist(invlist, 'i'); - } - } - } - } - return invlist; -} -#undef HEADER_LENGTH -#undef TO_INTERNAL_SIZE -#undef FROM_INTERNAL_SIZE -#undef INVLIST_VERSION_ID +#define DEBUG_PARSE(funcname) DEBUG_PARSE_r({ \ + DEBUG_PARSE_MSG((funcname)); \ + Perl_re_printf( aTHX_ "%4s","\n"); \ +}) +#define DEBUG_PARSE_FMT(funcname,fmt,args) DEBUG_PARSE_r({\ + DEBUG_PARSE_MSG((funcname)); \ + Perl_re_printf( aTHX_ fmt "\n",args); \ +}) -/* End of inversion list object */ STATIC void S_parse_lparen_question_flags(pTHX_ RExC_state_t *pRExC_state) @@ -11375,12 +2724,6 @@ S_parse_lparen_question_flags(pTHX_ RExC * is a trifle forced, but the need to tie the tails of the branches to what * follows makes it hard to avoid. */ -#define REGTAIL(x,y,z) regtail((x),(y),(z),depth+1) -#ifdef DEBUGGING -#define REGTAIL_STUDY(x,y,z) regtail_study((x),(y),(z),depth+1) -#else -#define REGTAIL_STUDY(x,y,z) regtail((x),(y),(z),depth+1) -#endif STATIC regnode_offset S_handle_named_backref(pTHX_ RExC_state_t *pRExC_state, @@ -11408,12 +2751,12 @@ S_handle_named_backref(pTHX_ RExC_state_ } if (sv_dat) { - num = add_data( pRExC_state, STR_WITH_LEN("S")); + num = reg_add_data( pRExC_state, STR_WITH_LEN("S")); RExC_rxi->data->data[num]=(void*)sv_dat; SvREFCNT_inc_simple_void_NN(sv_dat); } RExC_sawback = 1; - ret = reganode(pRExC_state, + ret = reg2node(pRExC_state, ((! FOLD) ? REFN : (ASCII_FOLD_RESTRICTED) @@ -11423,7 +2766,9 @@ S_handle_named_backref(pTHX_ RExC_state_ : (LOC) ? REFFLN : REFFN), - num); + num, RExC_nestroot); + if (RExC_nestroot && num >= (U32)RExC_nestroot) + FLAGS(REGNODE_p(ret)) = VOLATILE_REF; *flagp |= HASWIDTH; nextchar(pRExC_state); @@ -11432,7 +2777,7 @@ S_handle_named_backref(pTHX_ RExC_state_ /* reg_la_NOTHING() * - * Maybe parse a parenthezised lookaround construct that is equivalent to a + * Maybe parse a parenthesized lookaround construct that is equivalent to a * NOTHING regop when the construct is empty. * * Calls skip_to_be_ignored_text() before checking if the construct is empty. @@ -11482,7 +2827,7 @@ S_reg_la_NOTHING(pTHX_ RExC_state_t *pRE /* reg_la_OPFAIL() * - * Maybe parse a parenthezised lookaround construct that is equivalent to a + * Maybe parse a parenthesized lookaround construct that is equivalent to a * OPFAIL regop when the construct is empty. * * Calls skip_to_be_ignored_text() before checking if the construct is empty. @@ -11516,7 +2861,7 @@ S_reg_la_OPFAIL(pTHX_ RExC_state_t *pREx vFAIL2("Sequence (%s... not terminated", type); if (*RExC_parse == ')') { - regnode_offset ret= reganode(pRExC_state, OPFAIL, 0); + regnode_offset ret= reg1node(pRExC_state, OPFAIL, 0); nextchar(pRExC_state); return ret; /* return produced regop */ } @@ -11595,6 +2940,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I regnode_offset br; regnode_offset lastbr; regnode_offset ender = 0; + I32 logical_parno = 0; I32 parno = 0; I32 flags; U32 oregflags = RExC_flags; @@ -11605,6 +2951,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I I32 num; /* numeric backreferences */ SV * max_open; /* Max number of unclosed parens */ I32 was_in_lookaround = RExC_in_lookaround; + I32 fake_eval = 0; /* matches paren */ /* The difference between the following variables can be seen with * * the broken pattern /(?:foo/ where segment_parse_start will point * @@ -11661,6 +3008,11 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I goto parse_rest; } else if ( *RExC_parse == '*') { /* (*VERB:ARG), (*construct:...) */ + if (RExC_parse[1] == '{') { /* (*{ ... }) optimistic EVAL */ + fake_eval = '{'; + goto handle_qmark; + } + char *start_verb = RExC_parse + 1; STRLEN verb_len; char *start_arg = NULL; @@ -11902,7 +3254,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I * See also: S_reg_la_OPFAIL() */ /* Note: OPFAIL is *not* zerolen. */ - ret = reganode(pRExC_state, OPFAIL, 0); + ret = reg1node(pRExC_state, OPFAIL, 0); nextchar(pRExC_state); return ret; } @@ -11951,27 +3303,29 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I (int) verb_len, start_verb); } if (internal_argval == -1) { - ret = reganode(pRExC_state, op, 0); + ret = reg1node(pRExC_state, op, 0); } else { - ret = reg2Lanode(pRExC_state, op, 0, internal_argval); + ret = reg2node(pRExC_state, op, 0, internal_argval); } RExC_seen |= REG_VERBARG_SEEN; if (start_arg) { SV *sv = newSVpvn( start_arg, RExC_parse - start_arg); - ARG(REGNODE_p(ret)) = add_data( pRExC_state, + ARG1u(REGNODE_p(ret)) = reg_add_data( pRExC_state, STR_WITH_LEN("S")); - RExC_rxi->data->data[ARG(REGNODE_p(ret))]=(void*)sv; + RExC_rxi->data->data[ARG1u(REGNODE_p(ret))]=(void*)sv; FLAGS(REGNODE_p(ret)) = 1; } else { FLAGS(REGNODE_p(ret)) = 0; } if ( internal_argval != -1 ) - ARG2L_SET(REGNODE_p(ret), internal_argval); + ARG2i_SET(REGNODE_p(ret), internal_argval); nextchar(pRExC_state); return ret; } else if (*RExC_parse == '?') { /* (?...) */ - bool is_logical = 0; + handle_qmark: + ; /* make sure the label has a statement associated with it*/ + bool is_logical = 0, is_optimistic = 0; const char * const seqstart = RExC_parse; const char * endptr; const char non_existent_group_msg[] @@ -11984,8 +3338,14 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I } RExC_parse_inc_by(1); /* past the '?' */ - paren = *RExC_parse; /* might be a trailing NUL, if not - well-formed */ + if (!fake_eval) { + paren = *RExC_parse; /* might be a trailing NUL, if not + well-formed */ + is_optimistic = 0; + } else { + is_optimistic = 1; + paren = fake_eval; + } RExC_parse_inc(); if (RExC_parse > RExC_end) { paren = '\0'; @@ -12104,14 +3464,15 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I SvIV_set(sv_dat, 1); } #ifdef DEBUGGING - /* Yes this does cause a memory leak in debugging Perls - * */ + /* No, this does not cause a memory leak under + * debugging. RExC_paren_name_list is freed later + * on in the dump process. - Yves + */ if (!av_store(RExC_paren_name_list, RExC_npar, SvREFCNT_inc_NN(svname))) SvREFCNT_dec_NN(svname); #endif - /*sv_dump(sv_dat);*/ } nextchar(pRExC_state); paren = 1; @@ -12130,7 +3491,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I /* branch reset, behave like a (?:...) except that buffers in alternations share the same numbers */ paren = ':'; - after_freeze = freeze_paren = RExC_npar; + after_freeze = freeze_paren = RExC_logical_npar; /* XXX This construct currently requires an extra pass. * Investigation would be required to see if that could be @@ -12219,7 +3580,6 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I if (*RExC_parse!=')') vFAIL("Expecting close bracket"); - gen_recurse_regop: if (paren == '-' || paren == '+') { /* Don't overflow */ @@ -12256,7 +3616,26 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I vFAIL(non_existent_group_msg); } } + else + if (num && num < RExC_logical_npar) { + num = RExC_logical_to_parno[num]; + } + else + if (ALL_PARENS_COUNTED) { + if (num < RExC_logical_total_parens) { + num = RExC_logical_to_parno[num]; + } + else { + RExC_parse_inc_by(1); + vFAIL(non_existent_group_msg); + } + } + else { + REQUIRE_PARENS_PASS; + } + + gen_recurse_regop: if (num >= RExC_npar) { /* It might be a forward reference; we can't fail until we @@ -12274,20 +3653,20 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I } /* We keep track how many GOSUB items we have produced. - To start off the ARG2L() of the GOSUB holds its "id", + To start off the ARG2i() of the GOSUB holds its "id", which is used later in conjunction with RExC_recurse to calculate the offset we need to jump for the GOSUB, which it will store in the final representation. We have to defer the actual calculation until much later as the regop may move. */ - ret = reg2Lanode(pRExC_state, GOSUB, num, RExC_recurse_count); + ret = reg2node(pRExC_state, GOSUB, num, RExC_recurse_count); RExC_recurse_count++; DEBUG_OPTIMISE_MORE_r(Perl_re_printf( aTHX_ "%*s%*s Recurse #%" UVuf " to %" IVdf "\n", 22, "| |", (int)(depth * 2 + 1), "", - (UV)ARG(REGNODE_p(ret)), - (IV)ARG2L(REGNODE_p(ret)))); + (UV)ARG1u(REGNODE_p(ret)), + (IV)ARG2i(REGNODE_p(ret)))); RExC_seen |= REG_RECURSE_SEEN; *flagp |= POSTPONED; @@ -12335,37 +3714,42 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I RExC_parse_set(RExC_start + cb->end); o = cb->block; if (cb->src_regex) { - n = add_data(pRExC_state, STR_WITH_LEN("rl")); + n = reg_add_data(pRExC_state, STR_WITH_LEN("rl")); RExC_rxi->data->data[n] = (void*)SvREFCNT_inc((SV*)cb->src_regex); RExC_rxi->data->data[n+1] = (void*)o; } else { - n = add_data(pRExC_state, + n = reg_add_data(pRExC_state, (RExC_pm_flags & PMf_HAS_CV) ? "L" : "l", 1); RExC_rxi->data->data[n] = (void*)o; } pRExC_state->code_index++; nextchar(pRExC_state); + if (!is_optimistic) + RExC_seen |= REG_PESSIMIZE_SEEN; if (is_logical) { regnode_offset eval; ret = reg_node(pRExC_state, LOGICAL); + FLAGS(REGNODE_p(ret)) = 2; - eval = reg2Lanode(pRExC_state, EVAL, + eval = reg2node(pRExC_state, EVAL, n, /* for later propagation into (??{}) * return value */ RExC_flags & RXf_PMf_COMPILETIME ); - FLAGS(REGNODE_p(ret)) = 2; + FLAGS(REGNODE_p(eval)) = is_optimistic * EVAL_OPTIMISTIC_FLAG; if (! REGTAIL(pRExC_state, ret, eval)) { REQUIRE_BRANCHJ(flagp, 0); } return ret; } - ret = reg2Lanode(pRExC_state, EVAL, n, 0); + ret = reg2node(pRExC_state, EVAL, n, 0); + FLAGS(REGNODE_p(ret)) = is_optimistic * EVAL_OPTIMISTIC_FLAG; + return ret; } case '(': /* (?(?{...})...) and (?(?=...)...) */ @@ -12379,7 +3763,8 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I || RExC_parse[1] == '<' || RExC_parse[1] == '{')) || ( RExC_parse[0] == '*' /* (?(*...)) */ - && ( memBEGINs(RExC_parse + 1, + && ( RExC_parse[1] == '{' + || ( memBEGINs(RExC_parse + 1, (Size_t) (RExC_end - (RExC_parse + 1)), "pla:") || memBEGINs(RExC_parse + 1, @@ -12402,7 +3787,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I "negative_lookahead:") || memBEGINs(RExC_parse + 1, (Size_t) (RExC_end - (RExC_parse + 1)), - "negative_lookbehind:")))) + "negative_lookbehind:"))))) ) { /* Lookahead or eval. */ I32 flag; regnode_offset tail; @@ -12434,18 +3819,18 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I } RExC_parse_inc_by(1); if (sv_dat) { - num = add_data( pRExC_state, STR_WITH_LEN("S")); + num = reg_add_data( pRExC_state, STR_WITH_LEN("S")); RExC_rxi->data->data[num]=(void*)sv_dat; SvREFCNT_inc_simple_void_NN(sv_dat); } - ret = reganode(pRExC_state, GROUPPN, num); + ret = reg1node(pRExC_state, GROUPPN, num); goto insert_if_check_paren; } else if (memBEGINs(RExC_parse, (STRLEN) (RExC_end - RExC_parse), "DEFINE")) { - ret = reganode(pRExC_state, DEFINEP, 0); + ret = reg1node(pRExC_state, DEFINEP, 0); RExC_parse_inc_by(DEFINE_len); is_define = 1; goto insert_if_check_paren; @@ -12479,7 +3864,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I if (sv_dat) parno = 1 + *((I32 *)SvPVX(sv_dat)); } - ret = reganode(pRExC_state, INSUBP, parno); + ret = reg1node(pRExC_state, INSUBP, parno); goto insert_if_check_paren; } else if (inRANGE(RExC_parse[0], '1', '9')) { @@ -12496,7 +3881,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I else { vFAIL("panic: grok_atoUV returned FALSE"); } - ret = reganode(pRExC_state, GROUPP, parno); + ret = reg1node(pRExC_state, GROUPP, parno); insert_if_check_paren: if (UCHARAT(RExC_parse) != ')') { @@ -12505,7 +3890,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I } nextchar(pRExC_state); insert_if: - if (! REGTAIL(pRExC_state, ret, reganode(pRExC_state, + if (! REGTAIL(pRExC_state, ret, reg1node(pRExC_state, IFTHEN, 0))) { REQUIRE_BRANCHJ(flagp, 0); @@ -12516,7 +3901,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I FAIL2("panic: regbranch returned failure, flags=%#" UVxf, (UV) flags); } else - if (! REGTAIL(pRExC_state, br, reganode(pRExC_state, + if (! REGTAIL(pRExC_state, br, reg1node(pRExC_state, LONGJMP, 0))) { REQUIRE_BRANCHJ(flagp, 0); @@ -12530,7 +3915,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I vFAIL("(?(DEFINE)....) does not allow branches"); /* Fake one for optimizer. */ - lastbr = reganode(pRExC_state, IFTHEN, 0); + lastbr = reg1node(pRExC_state, IFTHEN, 0); if (!regbranch(pRExC_state, &flags, 1, depth+1)) { RETURN_FAIL_ON_RESTART(flags, flagp); @@ -12563,8 +3948,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I } if (! REGTAIL(pRExC_state, REGNODE_OFFSET( - NEXTOPER( - NEXTOPER(REGNODE_p(lastbr)))), + REGNODE_AFTER(REGNODE_p(lastbr))), ender)) { REQUIRE_BRANCHJ(flagp, 0); @@ -12618,6 +4002,11 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I capturing_parens: parno = RExC_npar; RExC_npar++; + if (RExC_npar >= U16_MAX) + FAIL2("Too many capture groups (limit is %" UVuf ")", (UV)RExC_npar); + + logical_parno = RExC_logical_npar; + RExC_logical_npar++; if (! ALL_PARENS_COUNTED) { /* If we are in our first pass through (and maybe only pass), * we need to allocate memory for the capturing parentheses @@ -12641,9 +4030,12 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I * */ Newxz(RExC_close_parens, RExC_parens_buf_size, regnode_offset); - /* we dont know where end op starts yet, so we dont need to + /* we don't know where end op starts yet, so we don't need to * set RExC_close_parens[0] like we do RExC_open_parens[0] * above */ + + Newxz(RExC_logical_to_parno, RExC_parens_buf_size, I32); + Newxz(RExC_parno_to_logical, RExC_parens_buf_size, I32); } else if (RExC_npar > RExC_parens_buf_size) { I32 old_size = RExC_parens_buf_size; @@ -12659,10 +4051,18 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I regnode_offset); Zero(RExC_close_parens + old_size, RExC_parens_buf_size - old_size, regnode_offset); + + Renew(RExC_logical_to_parno, RExC_parens_buf_size, I32); + Zero(RExC_logical_to_parno + old_size, + RExC_parens_buf_size - old_size, I32); + + Renew(RExC_parno_to_logical, RExC_parens_buf_size, I32); + Zero(RExC_parno_to_logical + old_size, + RExC_parens_buf_size - old_size, I32); } } - ret = reganode(pRExC_state, OPEN, parno); + ret = reg1node(pRExC_state, OPEN, parno); if (!RExC_nestroot) RExC_nestroot = parno; if (RExC_open_parens && !RExC_open_parens[parno]) @@ -12673,7 +4073,11 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I (IV)parno, ret)); RExC_open_parens[parno]= ret; } - + if (RExC_parno_to_logical) { + RExC_parno_to_logical[parno] = logical_parno; + if (RExC_logical_to_parno && !RExC_logical_to_parno[logical_parno]) + RExC_logical_to_parno[logical_parno] = parno; + } is_open = 1; } else { /* with RXf_PMf_NOCAPTURE treat (...) as (?:...) */ @@ -12687,6 +4091,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I parse_rest: /* Pick up the branches, linking them together. */ segment_parse_start = RExC_parse; + I32 npar_before_regbranch = RExC_npar - 1; br = regbranch(pRExC_state, &flags, 1, depth+1); /* branch_len = (paren != 0); */ @@ -12698,9 +4103,13 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I if (*RExC_parse == '|') { if (RExC_use_BRANCHJ) { reginsert(pRExC_state, BRANCHJ, br, depth+1); + ARG2a_SET(REGNODE_p(br), npar_before_regbranch); + ARG2b_SET(REGNODE_p(br), (U16)RExC_npar - 1); } else { reginsert(pRExC_state, BRANCH, br, depth+1); + ARG1a_SET(REGNODE_p(br), (U16)npar_before_regbranch); + ARG1b_SET(REGNODE_p(br), (U16)RExC_npar - 1); } have_branch = 1; } @@ -12720,19 +4129,19 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I if (RExC_use_BRANCHJ) { bool shut_gcc_up; - ender = reganode(pRExC_state, LONGJMP, 0); + ender = reg1node(pRExC_state, LONGJMP, 0); /* Append to the previous. */ shut_gcc_up = REGTAIL(pRExC_state, - REGNODE_OFFSET(NEXTOPER(NEXTOPER(REGNODE_p(lastbr)))), + REGNODE_OFFSET(REGNODE_AFTER(REGNODE_p(lastbr))), ender); PERL_UNUSED_VAR(shut_gcc_up); } nextchar(pRExC_state); if (freeze_paren) { - if (RExC_npar > after_freeze) - after_freeze = RExC_npar; - RExC_npar = freeze_paren; + if (RExC_logical_npar > after_freeze) + after_freeze = RExC_logical_npar; + RExC_logical_npar = freeze_paren; } br = regbranch(pRExC_state, &flags, 0, depth+1); @@ -12743,6 +4152,22 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I if (! REGTAIL(pRExC_state, lastbr, br)) { /* BRANCH -> BRANCH. */ REQUIRE_BRANCHJ(flagp, 0); } + assert(OP(REGNODE_p(br)) == BRANCH || OP(REGNODE_p(br))==BRANCHJ); + assert(OP(REGNODE_p(lastbr)) == BRANCH || OP(REGNODE_p(lastbr))==BRANCHJ); + if (OP(REGNODE_p(br)) == BRANCH) { + if (OP(REGNODE_p(lastbr)) == BRANCH) + ARG1b_SET(REGNODE_p(lastbr),ARG1a(REGNODE_p(br))); + else + ARG2b_SET(REGNODE_p(lastbr),ARG1a(REGNODE_p(br))); + } + else + if (OP(REGNODE_p(br)) == BRANCHJ) { + if (OP(REGNODE_p(lastbr)) == BRANCH) + ARG1b_SET(REGNODE_p(lastbr),ARG2a(REGNODE_p(br))); + else + ARG2b_SET(REGNODE_p(lastbr),ARG2a(REGNODE_p(br))); + } + lastbr = br; *flagp |= flags & (HASWIDTH | POSTPONED); } @@ -12756,7 +4181,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I ender = reg_node(pRExC_state, TAIL); break; case 1: case 2: - ender = reganode(pRExC_state, CLOSE, parno); + ender = reg1node(pRExC_state, CLOSE, parno); if ( RExC_close_parens ) { DEBUG_OPTIMISE_MORE_r(Perl_re_printf( aTHX_ "%*s%*s Setting close paren #%" IVdf " to %zu\n", @@ -12816,6 +4241,14 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I (IV)(ender - lastbr) ); }); + if (OP(REGNODE_p(lastbr)) == BRANCH) { + ARG1b_SET(REGNODE_p(lastbr),(U16)RExC_npar-1); + } + else + if (OP(REGNODE_p(lastbr)) == BRANCHJ) { + ARG2b_SET(REGNODE_p(lastbr),(U16)RExC_npar-1); + } + if (! REGTAIL(pRExC_state, lastbr, ender)) { REQUIRE_BRANCHJ(flagp, 0); } @@ -12827,33 +4260,35 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I /* Hook the tails of the branches to the closing node. */ for (br = REGNODE_p(ret); br; br = regnext(br)) { - const U8 op = PL_regkind[OP(br)]; + const U8 op = REGNODE_TYPE(OP(br)); + regnode *nextoper = REGNODE_AFTER(br); if (op == BRANCH) { if (! REGTAIL_STUDY(pRExC_state, - REGNODE_OFFSET(NEXTOPER(br)), + REGNODE_OFFSET(nextoper), ender)) { REQUIRE_BRANCHJ(flagp, 0); } - if ( OP(NEXTOPER(br)) != NOTHING - || regnext(NEXTOPER(br)) != REGNODE_p(ender)) + if ( OP(nextoper) != NOTHING + || regnext(nextoper) != REGNODE_p(ender)) is_nothing= 0; } else if (op == BRANCHJ) { bool shut_gcc_up = REGTAIL_STUDY(pRExC_state, - REGNODE_OFFSET(NEXTOPER(NEXTOPER(br))), + REGNODE_OFFSET(nextoper), ender); PERL_UNUSED_VAR(shut_gcc_up); /* for now we always disable this optimisation * / - if ( OP(NEXTOPER(NEXTOPER(br))) != NOTHING - || regnext(NEXTOPER(NEXTOPER(br))) != REGNODE_p(ender)) + regnode *nopr= REGNODE_AFTER_type(br,tregnode_BRANCHJ); + if ( OP(nopr) != NOTHING + || regnext(nopr) != REGNODE_p(ender)) */ is_nothing= 0; } } if (is_nothing) { regnode * ret_as_regnode = REGNODE_p(ret); - br= PL_regkind[OP(ret_as_regnode)] != BRANCH + br= REGNODE_TYPE(OP(ret_as_regnode)) != BRANCH ? regnext(ret_as_regnode) : ret_as_regnode; DEBUG_PARSE_r({ @@ -12873,7 +4308,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I OP(br)= NOTHING; if (OP(REGNODE_p(ender)) == TAIL) { NEXT_OFF(br)= 0; - RExC_emit= REGNODE_OFFSET(br) + 1; + RExC_emit= REGNODE_OFFSET(br) + NODE_STEP_REGNODE; } else { regnode *opt; for ( opt= br + 1; opt < REGNODE_p(ender) ; opt++ ) @@ -12931,8 +4366,8 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I NOT_REACHED; /* NOTREACHED */ } - if (after_freeze > RExC_npar) - RExC_npar = after_freeze; + if (after_freeze > RExC_logical_npar) + RExC_logical_npar = after_freeze; RExC_in_lookaround = was_in_lookaround; @@ -12957,6 +4392,7 @@ S_regbranch(pTHX_ RExC_state_t *pRExC_st regnode_offset ret; regnode_offset chain = 0; regnode_offset latest; + regnode *branch_node = NULL; I32 flags = 0, c = 0; DECLARE_AND_GET_RE_DEBUG_FLAGS; @@ -12967,10 +4403,14 @@ S_regbranch(pTHX_ RExC_state_t *pRExC_st if (first) ret = 0; else { - if (RExC_use_BRANCHJ) - ret = reganode(pRExC_state, BRANCHJ, 0); - else { - ret = reg_node(pRExC_state, BRANCH); + if (RExC_use_BRANCHJ) { + ret = reg2node(pRExC_state, BRANCHJ, 0, 0); + branch_node = REGNODE_p(ret); + ARG2a_SET(branch_node, (U16)RExC_npar-1); + } else { + ret = reg1node(pRExC_state, BRANCH, 0); + branch_node = REGNODE_p(ret); + ARG1a_SET(branch_node, (U16)RExC_npar-1); } } @@ -13010,9 +4450,8 @@ S_regbranch(pTHX_ RExC_state_t *pRExC_st ret = chain; } if (c == 1) { - *flagp |= flags&SIMPLE; + *flagp |= flags & SIMPLE; } - return ret; } @@ -13205,6 +4644,7 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_sta const char * const origparse = RExC_parse; I32 min; I32 max = REG_INFTY; + I32 npar_before = RExC_npar-1; /* Save the original in case we change the emitted regop to a FAIL. */ const regnode_offset orig_emit = RExC_emit; @@ -13220,6 +4660,7 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_sta RETURN_FAIL_ON_RESTART_OR_FLAGS(flags, flagp, TRYAGAIN); FAIL2("panic: regatom returned failure, flags=%#" UVxf, (UV) flags); } + I32 npar_after = RExC_npar-1; op = *RExC_parse; switch (op) { @@ -13275,7 +4716,7 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_sta reginsert(pRExC_state, OPFAIL, orig_emit, depth+1); ckWARNreg(RExC_parse, "Quantifier {n,m} with n > m can't match"); NEXT_OFF(REGNODE_p(orig_emit)) = - regarglen[OPFAIL] + NODE_STEP_REGNODE; + REGNODE_ARG_LEN(OPFAIL) + NODE_STEP_REGNODE; return ret; } else if (min == max && *RExC_parse == '?') { @@ -13301,22 +4742,12 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_sta * Check and possibly adjust a zero width operand */ if (! (flags & (HASWIDTH|POSTPONED))) { if (max > REG_INFTY/3) { - if (origparse[0] == '\\' && origparse[1] == 'K') { - vFAIL2utf8f( - "%" UTF8f " is forbidden - matches null string" - " many times", - UTF8fARG(UTF, (RExC_parse >= origparse - ? RExC_parse - origparse - : 0), - origparse)); - } else { - ckWARN2reg(RExC_parse, - "%" UTF8f " matches null string many times", - UTF8fARG(UTF, (RExC_parse >= origparse - ? RExC_parse - origparse - : 0), - origparse)); - } + ckWARN2reg(RExC_parse, + "%" UTF8f " matches null string many times", + UTF8fARG(UTF, (RExC_parse >= origparse + ? RExC_parse - origparse + : 0), + origparse)); } /* There's no point in trying to match something 0 length more than @@ -13373,13 +4804,13 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_sta if (RExC_use_BRANCHJ) { reginsert(pRExC_state, LONGJMP, ret, depth+1); reginsert(pRExC_state, NOTHING, ret, depth+1); - NEXT_OFF(REGNODE_p(ret)) = 3; /* Go over LONGJMP. */ + REGNODE_STEP_OVER(ret,tregnode_NOTHING,tregnode_LONGJMP); } reginsert(pRExC_state, CURLYX, ret, depth+1); - if (RExC_use_BRANCHJ) - NEXT_OFF(REGNODE_p(ret)) = 3; /* Go over NOTHING to - LONGJMP. */ + /* Go over NOTHING to LONGJMP. */ + REGNODE_STEP_OVER(ret,tregnode_CURLYX,tregnode_NOTHING); + if (! REGTAIL(pRExC_state, ret, reg_node(pRExC_state, NOTHING))) { @@ -13392,8 +4823,19 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_sta /* Finish up the CURLY/CURLYX case */ FLAGS(REGNODE_p(ret)) = 0; - ARG1_SET(REGNODE_p(ret), (U16)min); - ARG2_SET(REGNODE_p(ret), (U16)max); + ARG1i_SET(REGNODE_p(ret), min); + ARG2i_SET(REGNODE_p(ret), max); + + /* if we had a npar_after then we need to increment npar_before, + * we want to track the range of parens we need to reset each iteration + */ + if (npar_after!=npar_before) { + ARG3a_SET(REGNODE_p(ret), (U16)npar_before+1); + ARG3b_SET(REGNODE_p(ret), (U16)npar_after); + } else { + ARG3a_SET(REGNODE_p(ret), 0); + ARG3b_SET(REGNODE_p(ret), 0); + } done_main_op: @@ -13936,14 +5378,6 @@ S_backref_value(char *p, char *e) return I32_MAX; } -#ifdef DEBUGGING -#define REGNODE_GUTS(state,op,extra_size) \ - regnode_guts_debug(state,op,extra_size) -#else -#define REGNODE_GUTS(state,op,extra_size) \ - regnode_guts(state,extra_size) -#endif - /* - regatom - the lowest level @@ -13981,7 +5415,7 @@ S_backref_value(char *p, char *e) cases for each unambiguous special: handle this special; break; - cases for each ambigous special/literal: + cases for each ambiguous special/literal: disambiguate; if (special) handle here else goto defchar; @@ -14509,11 +5943,26 @@ S_regatom(pTHX_ RExC_state_t *pRExC_stat else vFAIL("Unterminated \\g... pattern"); } - - if (isrel) { - num = RExC_npar - num; - if (num < 1) - vFAIL("Reference to nonexistent or unclosed group"); + + if (isrel) { + num = RExC_npar - num; + if (num < 1) + vFAIL("Reference to nonexistent or unclosed group"); + } + else + if (num < RExC_logical_npar) { + num = RExC_logical_to_parno[num]; + } + else + if (ALL_PARENS_COUNTED) { + if (num < RExC_logical_total_parens) + num = RExC_logical_to_parno[num]; + else { + num = -1; + } + } + else{ + REQUIRE_PARENS_PASS; } } else { @@ -14528,7 +5977,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_stat if ( /* any numeric escape < 10 is always a backref */ num > 9 /* any numeric escape < RExC_npar is a backref */ - && num >= RExC_npar + && num >= RExC_logical_npar /* cannot be an octal escape if it starts with [89] * */ && ! inRANGE(*RExC_parse, '8', '9') @@ -14540,6 +5989,19 @@ S_regatom(pTHX_ RExC_state_t *pRExC_stat RExC_parse_set(atom_parse_start); goto defchar; } + if (num < RExC_logical_npar) { + num = RExC_logical_to_parno[num]; + } + else + if (ALL_PARENS_COUNTED) { + if (num < RExC_logical_total_parens) { + num = RExC_logical_to_parno[num]; + } else { + num = -1; + } + } else { + REQUIRE_PARENS_PASS; + } } /* At this point RExC_parse points at a numeric escape like @@ -14556,9 +6018,10 @@ S_regatom(pTHX_ RExC_state_t *pRExC_stat else while (isDIGIT(*RExC_parse)) { RExC_parse_inc_by(1); } + if (num < 0) + vFAIL("Reference to nonexistent group"); if (num >= (I32)RExC_npar) { - /* It might be a forward reference; we can't fail until we * know, by completing the parse to get all the groups, and * then reparsing */ @@ -14572,7 +6035,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_stat } } RExC_sawback = 1; - ret = reganode(pRExC_state, + ret = reg2node(pRExC_state, ((! FOLD) ? REF : (ASCII_FOLD_RESTRICTED) @@ -14582,7 +6045,9 @@ S_regatom(pTHX_ RExC_state_t *pRExC_stat : (LOC) ? REFFL : REFF), - num); + num, RExC_nestroot); + if (RExC_nestroot && num >= RExC_nestroot) + FLAGS(REGNODE_p(ret)) = VOLATILE_REF; if (OP(REGNODE_p(ret)) == REFF) { RExC_seen_d_op = TRUE; } @@ -14702,7 +6167,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_stat * change, it works */ ret = REGNODE_GUTS(pRExC_state, node_type, current_string_nodes); FILL_NODE(ret, node_type); - RExC_emit++; + RExC_emit += NODE_STEP_REGNODE; s = STRING(REGNODE_p(ret)); @@ -15352,7 +6817,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_stat * eventually we'll have to artificially chunk the pattern into * multiple nodes. */ if (! LOC && (node_type == EXACT || node_type == LEXACT)) { - Size_t overhead = 1 + regarglen[OP(REGNODE_p(ret))]; + Size_t overhead = 1 + REGNODE_ARG_LEN(OP(REGNODE_p(ret))); Size_t overhead_expansion = 0; char temp[256]; Size_t max_nodes_for_string; @@ -15371,7 +6836,7 @@ S_regatom(pTHX_ RExC_state_t *pRExC_stat * to save the string in the EXACT case before growing, and * then copy it afterwards to its new location */ if (node_type == EXACT) { - overhead_expansion = regarglen[LEXACT] - regarglen[EXACT]; + overhead_expansion = REGNODE_ARG_LEN(LEXACT) - REGNODE_ARG_LEN(EXACT); RExC_emit += overhead_expansion; Copy(s0, temp, len, char); } @@ -15978,19 +7443,18 @@ S_regatom(pTHX_ RExC_state_t *pRExC_stat } -STATIC void -S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr) +void +Perl_populate_anyof_bitmap_from_invlist(pTHX_ regnode *node, SV** invlist_ptr) { /* Uses the inversion list '*invlist_ptr' to populate the ANYOF 'node'. It * sets up the bitmap and any flags, removing those code points from the * inversion list, setting it to NULL should it become completely empty */ - PERL_ARGS_ASSERT_POPULATE_ANYOF_FROM_INVLIST; - assert(PL_regkind[OP(node)] == ANYOF); + PERL_ARGS_ASSERT_POPULATE_ANYOF_BITMAP_FROM_INVLIST; /* There is no bitmap for this node type */ - if (inRANGE(OP(node), ANYOFH, ANYOFRb)) { + if (REGNODE_TYPE(OP(node)) != ANYOF) { return; } @@ -16008,10 +7472,6 @@ S_populate_ANYOF_from_invlist(pTHX_ regn UV high; int i; - if (end == UV_MAX && start <= NUM_ANYOF_CODE_POINTS) { - ANYOF_FLAGS(node) |= ANYOF_MATCHES_ALL_ABOVE_BITMAP; - } - /* Quit if are above what we should change */ if (start >= NUM_ANYOF_CODE_POINTS) { break; @@ -16030,14 +7490,10 @@ S_populate_ANYOF_from_invlist(pTHX_ regn invlist_iterfinish(*invlist_ptr); /* Done with loop; remove any code points that are in the bitmap from - * *invlist_ptr; similarly for code points above the bitmap if we have - * a flag to match all of them anyways */ + * *invlist_ptr */ if (change_invlist) { _invlist_subtract(*invlist_ptr, PL_InBitmap, invlist_ptr); } - if (ANYOF_FLAGS(node) & ANYOF_MATCHES_ALL_ABOVE_BITMAP) { - _invlist_intersection(*invlist_ptr, PL_InBitmap, invlist_ptr); - } /* If have completely emptied it, remove it completely */ if (_invlist_len(*invlist_ptr) == 0) { @@ -16070,7 +7526,7 @@ S_populate_ANYOF_from_invlist(pTHX_ regn if (posix_warnings) { \ if (! RExC_warn_text ) RExC_warn_text = \ (AV *) sv_2mortal((SV *) newAV()); \ - av_push(RExC_warn_text, Perl_newSVpvf(aTHX_ \ + av_push_simple(RExC_warn_text, Perl_newSVpvf(aTHX_ \ WARNING_PREFIX \ text \ REPORT_LOCATION, \ @@ -16955,7 +8411,7 @@ S_handle_regex_sets(pTHX_ RExC_state_t * * with pronouncing it called it Reverse Polish instead, but now that YOU * know how to pronounce it you can use the correct term, thus giving due * credit to the person who invented it, and impressing your geek friends. - * Wikipedia says that the pronounciation of "Ł" has been changing so that + * Wikipedia says that the pronunciation of "Ł" has been changing so that * it is now more like an English initial W (as in wonk) than an L.) * * This means that, for example, 'a | b & c' is stored on the stack as @@ -17087,7 +8543,7 @@ redo_curchar: * which isn't legal */ || RExC_emit != orig_emit + NODE_STEP_REGNODE - + regarglen[REGEX_SET]) + + REGNODE_ARG_LEN(REGEX_SET)) { vFAIL("Expecting interpolated extended charclass"); } @@ -17120,7 +8576,7 @@ redo_curchar: } /* Stack the position of this undealt-with left paren */ - av_push(fence_stack, newSViv(fence)); + av_push_simple(fence_stack, newSViv(fence)); fence = top_index + 1; break; @@ -17262,8 +8718,8 @@ redo_curchar: /* Place the operator before the operand */ SV* lhs = av_pop(stack); - av_push(stack, newSVuv(curchar)); - av_push(stack, lhs); + av_push_simple(stack, newSVuv(curchar)); + av_push_simple(stack, lhs); break; } @@ -17304,9 +8760,8 @@ redo_curchar: * */ lhs = av_pop(stack); assert(IS_OPERAND(lhs)); - - av_push(stack, newSVuv(curchar)); - av_push(stack, lhs); + av_push_simple(stack, newSVuv(curchar)); + av_push_simple(stack, lhs); break; } @@ -17367,7 +8822,7 @@ redo_curchar: * stacked operation */ only_to_avoid_leaks = av_pop(stack); SvREFCNT_dec(only_to_avoid_leaks); - av_push(stack, rhs); + av_push_simple(stack, rhs); goto redo_curchar; case '!': /* Highest priority, right associative */ @@ -17382,7 +8837,7 @@ redo_curchar: } else { /* Otherwise, since it's right associative, just push onto the stack */ - av_push(stack, newSVuv(curchar)); + av_push_simple(stack, newSVuv(curchar)); } break; @@ -17443,7 +8898,7 @@ redo_curchar: /* Here there was nothing on the stack or the top element was * another operand. Just add this new one */ - av_push(stack, current); + av_push_simple(stack, current); } /* End of switch on next parse token */ @@ -17571,8 +9026,7 @@ redo_curchar: assert(OP(REGNODE_p(node)) == ANYOF); OP(REGNODE_p(node)) = ANYOFL; - ANYOF_FLAGS(REGNODE_p(node)) - |= ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD; + ANYOF_FLAGS(REGNODE_p(node)) |= ANYOFL_UTF8_LOCALE_REQD; } } @@ -17626,7 +9080,7 @@ S_dump_regex_sets_structures(pTHX_ RExC_ else { PerlIO_printf(Perl_debug_log, "Fence_stack: \n"); for (i = fence_stack_top; i >= 0; i--) { - SV ** element_ptr = av_fetch(fence_stack, i, FALSE); + SV ** element_ptr = av_fetch_simple(fence_stack, i, FALSE); if (! element_ptr) { } @@ -17641,8 +9095,8 @@ S_dump_regex_sets_structures(pTHX_ RExC_ #undef IS_OPERATOR #undef IS_OPERAND -STATIC void -S_add_above_Latin1_folds(pTHX_ RExC_state_t *pRExC_state, const U8 cp, SV** invlist) +void +Perl_add_above_Latin1_folds(pTHX_ RExC_state_t *pRExC_state, const U8 cp, SV** invlist) { /* This adds the Latin1/above-Latin1 folding rules. * @@ -17775,7 +9229,6 @@ S_find_first_differing_byte_pos(const U8 return s1 - start; } - STATIC AV * S_add_multi_match(pTHX_ AV* multi_char_matches, SV* multi_string, const STRLEN cp_count) { @@ -17810,15 +9263,15 @@ S_add_multi_match(pTHX_ AV* multi_char_m } if (av_exists(multi_char_matches, cp_count)) { - this_array_ptr = (AV**) av_fetch(multi_char_matches, cp_count, FALSE); + this_array_ptr = (AV**) av_fetch_simple(multi_char_matches, cp_count, FALSE); this_array = *this_array_ptr; } else { this_array = newAV(); - av_store(multi_char_matches, cp_count, + av_store_simple(multi_char_matches, cp_count, (SV*) this_array); } - av_push(this_array, multi_string); + av_push_simple(this_array, multi_string); return multi_char_matches; } @@ -17944,7 +9397,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta /* In a range, if one of the endpoints is non-character-set portable, * meaning that it hard-codes a code point that may mean a different - * charactger in ASCII vs. EBCDIC, as opposed to, say, a literal 'A' or a + * character in ASCII vs. EBCDIC, as opposed to, say, a literal 'A' or a * mnemonic '\t' which each mean the same character no matter which * character set the platform is on. */ unsigned int non_portable_endpoint = 0; @@ -18142,7 +9595,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta TRUE /* checking only */); } else if ( strict && ! skip_white - && ( _generic_isCC(value, _CC_VERTSPACE) + && ( generic_isCC_(value, CC_VERTSPACE_) || is_VERTWS_cp_high(value))) { vFAIL("Literal vertical space in [] is illegal except under /x"); @@ -18387,8 +9840,8 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta * points. */ AV * this_string = (AV *) av_shift( strings); STRLEN cp_count = av_count(this_string); - SV * final = newSV(cp_count * 4); - SvPVCLEAR(final); + SV * final = newSV(cp_count ? cp_count * 4 : 1); + SvPVCLEAR_FRESH(final); /* Create another string of sequences of \x{...} */ while (av_count(this_string) > 0) { @@ -18438,14 +9891,14 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta /* We don't know yet what this matches, so have to flag * it */ - anyof_flags |= ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP; + anyof_flags |= ANYOF_HAS_EXTRA_RUNTIME_MATCHES; } else { assert (prop_definition && is_invlist(prop_definition)); /* Here we do have the complete property definition * - * Temporary workaround for [perl #133136]. For this + * Temporary workaround for [GH #16520]. For this * precise input that is in the .t that is failing, * load utf8.pm, which is what the test wants, so that * that .t passes */ @@ -18638,7 +10091,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta if (LOC && namedclass < ANYOF_POSIXL_MAX #ifndef HAS_ISASCII - && classnum != _CC_ASCII + && classnum != CC_ASCII_ #endif ) { SV* scratch_list = NULL; @@ -18708,13 +10161,13 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta /* Here, should be \h, \H, \v, or \V. None of /d, /i * nor /l make a difference in what these match, * therefore we just add what they match to cp_list. */ - if (classnum != _CC_VERTSPACE) { + if (classnum != CC_VERTSPACE_) { assert( namedclass == ANYOF_HORIZWS || namedclass == ANYOF_NHORIZWS); /* It turns out that \h is just a synonym for * XPosixBlank */ - classnum = _CC_BLANK; + classnum = CC_BLANK_; } _invlist_union_maybe_complement_2nd( @@ -18727,9 +10180,9 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta } } else if ( AT_LEAST_UNI_SEMANTICS - || classnum == _CC_ASCII - || (DEPENDS_SEMANTICS && ( classnum == _CC_DIGIT - || classnum == _CC_XDIGIT))) + || classnum == CC_ASCII_ + || (DEPENDS_SEMANTICS && ( classnum == CC_DIGIT_ + || classnum == CC_XDIGIT_))) { /* We usually have to worry about /d affecting what POSIX * classes match, with special code needed because we won't @@ -19007,7 +10460,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta * are in the same series, which is the same range. * */ index_start = _invlist_search( - PL_XPosix_ptrs[_CC_DIGIT], + PL_XPosix_ptrs[CC_DIGIT_], prevvalue); /* Warn if the range starts and ends with a digit, @@ -19015,7 +10468,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta if ( index_start >= 0 && ELEMENT_RANGE_MATCHES_INVLIST(index_start) && (index_final = - _invlist_search(PL_XPosix_ptrs[_CC_DIGIT], + _invlist_search(PL_XPosix_ptrs[CC_DIGIT_], value)) != index_start && index_final >= 0 && ELEMENT_RANGE_MATCHES_INVLIST(index_final)) @@ -19143,7 +10596,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta AV** this_array_ptr; SV* this_sequence; - this_array_ptr = (AV**) av_fetch(multi_char_matches, + this_array_ptr = (AV**) av_fetch_simple(multi_char_matches, cp_count, FALSE); while ((this_sequence = av_pop(*this_array_ptr)) != &PL_sv_undef) @@ -19441,7 +10894,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta _invlist_subtract(only_non_utf8_list, cp_list, &only_non_utf8_list); if (_invlist_len(only_non_utf8_list) != 0) { - anyof_flags |= ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER; + anyof_flags |= ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared; } SvREFCNT_dec_NN(only_non_utf8_list); } @@ -19526,8 +10979,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta } if (warn_super) { - anyof_flags - |= ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER; + anyof_flags |= ANYOF_WARN_SUPER__shared; /* Because an ANYOF node is the only one that warns, this node * can't be optimized into something else */ @@ -19563,24 +11015,34 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta } } if ( only_utf8_locale_list - || (cp_list && ( _invlist_contains_cp(cp_list, LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) - || _invlist_contains_cp(cp_list, LATIN_SMALL_LETTER_DOTLESS_I)))) + || ( cp_list + && ( _invlist_contains_cp(cp_list, + LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) + || _invlist_contains_cp(cp_list, + LATIN_SMALL_LETTER_DOTLESS_I)))) { has_runtime_dependency |= HAS_L_RUNTIME_DEPENDENCY; - anyof_flags - |= ANYOFL_FOLD - | ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD; + anyof_flags |= ANYOFL_FOLD|ANYOF_HAS_EXTRA_RUNTIME_MATCHES; } else if (cp_list && invlist_lowest(cp_list) < 256) { /* If nothing is below 256, has no locale dependency; otherwise it * does */ anyof_flags |= ANYOFL_FOLD; has_runtime_dependency |= HAS_L_RUNTIME_DEPENDENCY; + + /* In a Turkish locale these could match, notify the run-time code + * to check for that */ + if ( _invlist_contains_cp(cp_list, 'I') + || _invlist_contains_cp(cp_list, 'i')) + { + anyof_flags |= ANYOFL_FOLD|ANYOF_HAS_EXTRA_RUNTIME_MATCHES; + } } } else if ( DEPENDS_SEMANTICS && ( upper_latin1_only_utf8_matches - || (anyof_flags & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER))) + || ( anyof_flags + & ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared))) { RExC_seen_d_op = TRUE; has_runtime_dependency |= HAS_D_RUNTIME_DEPENDENCY; @@ -19655,9 +11117,9 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta } } - ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]); + ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op)); FILL_NODE(ret, op); /* We set the argument later */ - RExC_emit += 1 + regarglen[op]; + RExC_emit += NODE_STEP_REGNODE + REGNODE_ARG_LEN(op); ANYOF_FLAGS(REGNODE_p(ret)) = anyof_flags; /* Here, contains all the code points we can determine at @@ -19666,7 +11128,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta * . While we are at it, see if everything above 255 is in the * list, and if so, set a flag to speed up execution */ - populate_ANYOF_from_invlist(REGNODE_p(ret), &cp_list); + populate_anyof_bitmap_from_invlist(REGNODE_p(ret), &cp_list); if (posixl) { ANYOF_POSIXL_SET_TO_BITMAP(REGNODE_p(ret), posixl); @@ -19690,7 +11152,7 @@ S_regclass(pTHX_ RExC_state_t *pRExC_sta else { cp_list = upper_latin1_only_utf8_matches; } - ANYOF_FLAGS(REGNODE_p(ret)) |= ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP; + ANYOF_FLAGS(REGNODE_p(ret)) |= ANYOF_HAS_EXTRA_RUNTIME_MATCHES; } set_ANYOF_arg(pRExC_state, REGNODE_p(ret), cp_list, @@ -19787,10 +11249,7 @@ S_optimize_regclass(pTHX_ if (*invert) { goto return_OPFAIL; } - else { - goto return_SANY; - } - return op; + goto return_SANY; } } @@ -20009,7 +11468,7 @@ S_optimize_regclass(pTHX_ } else { - /* Here, the only possible fold lowest_cp particpates in + /* Here, the only possible fold lowest_cp participates in * is with start[1]. /i or not isn't relevant */ op = EXACTFU; } @@ -20194,7 +11653,7 @@ S_optimize_regclass(pTHX_ *ret = REGNODE_GUTS(pRExC_state, op, len); FILL_NODE(*ret, op); - RExC_emit += 1 + STR_SZ(len); + RExC_emit += NODE_STEP_REGNODE + STR_SZ(len); setSTR_LEN(REGNODE_p(*ret), len); if (len == 1) { *STRINGs(REGNODE_p(*ret)) = (U8) value; @@ -20202,6 +11661,7 @@ S_optimize_regclass(pTHX_ else { uvchr_to_utf8((U8 *) STRINGs(REGNODE_p(*ret)), value); } + return op; } } @@ -20306,7 +11766,7 @@ S_optimize_regclass(pTHX_ ANYOFM_mask = ~ bits_differing; /* This goes into FLAGS */ /* The argument is the lowest code point */ - *ret = reganode(pRExC_state, op, lowest_cp); + *ret = reg1node(pRExC_state, op, lowest_cp); FLAGS(REGNODE_p(*ret)) = ANYOFM_mask; } @@ -20348,7 +11808,7 @@ S_optimize_regclass(pTHX_ } for (posix_class = 0; - posix_class <= _HIGHEST_REGCOMP_DOT_H_SYNC; + posix_class <= HIGHEST_REGCOMP_DOT_H_SYNC_; posix_class++) { SV** our_code_points = &cp_list; @@ -20409,10 +11869,12 @@ S_optimize_regclass(pTHX_ } else { /* POSIXD, inverted. If this doesn't have this flag set, it isn't /d. */ - if (! (*anyof_flags & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER)) + if (! ( *anyof_flags + & ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared)) { continue; } + our_code_points = &cp_list; } @@ -20427,7 +11889,19 @@ S_optimize_regclass(pTHX_ { /* Here, they precisely match. Optimize this ANYOF * node into its equivalent POSIX one of the correct - * type, possibly inverted */ + * type, possibly inverted. + * + * Some of these nodes match a single range of + * characters (or [:alpha:] matches two parallel ranges + * on ASCII platforms). The array lookup at execution + * time could be replaced by a range check for such + * nodes. But regnodes are a finite resource, and the + * possible performance boost isn't large, so this + * hasn't been done. An attempt to use just one node + * (and its inverse) to encompass all such cases was + * made in d62feba66bf43f35d092bb026694f927e9f94d38. + * But the shifting/masking it used ended up being + * slower than the array look up, so it was reverted */ op = (try_inverted) ? type + NPOSIXA - POSIXA : type; @@ -20455,7 +11929,7 @@ S_optimize_regclass(pTHX_ && *anyof_flags == 0 && start[0] < (1 << ANYOFR_BASE_BITS) && end[0] - start[0] - < ((1U << (sizeof(((struct regnode_1 *)NULL)->arg1) + < ((1U << (sizeof(ARG1u_LOC(NULL)) * CHARBITS - ANYOFR_BASE_BITS)))) { @@ -20463,7 +11937,7 @@ S_optimize_regclass(pTHX_ U8 high_utf8[UTF8_MAXBYTES+1]; op = ANYOFR; - *ret = reganode(pRExC_state, op, + *ret = reg1node(pRExC_state, op, (start[0] | (end[0] - start[0]) << ANYOFR_BASE_BITS)); /* Place the lowest UTF-8 start byte in the flags field, so as to allow @@ -20489,7 +11963,7 @@ S_optimize_regclass(pTHX_ } /* If didn't find an optimization and there is no need for a bitmap, - * optimize to indicate that */ + * of the lowest code points, optimize to indicate that */ if ( lowest_cp >= NUM_ANYOF_CODE_POINTS && ! LOC && ! upper_latin1_only_utf8_matches @@ -20529,25 +12003,58 @@ S_optimize_regclass(pTHX_ Size_t len = find_first_differing_byte_pos(low_utf8, high_utf8, MIN(low_len, high_len)); - if (len == 1) { /* No need to convert to I8 for EBCDIC as this is an exact * match */ *anyof_flags = low_utf8[0]; - op = ANYOFHb; + + if (high_len == 2) { + /* If the elements matched all have a 2-byte UTF-8 + * representation, with the first byte being the same, + * we can use a compact, fast regnode. capable of + * matching any combination of continuation byte + * patterns. + * + * (A similar regnode could be created for the Latin1 + * range; the complication being that it could match + * non-UTF8 targets. The internal bitmap would serve + * both cases; with some extra code in regexec.c) */ + op = ANYOFHbbm; + *ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op)); + FILL_NODE(*ret, op); + FIRST_BYTE((struct regnode_bbm *) REGNODE_p(*ret)) = low_utf8[0], + + /* The 64 bit (or 32 on EBCCDIC) map can be looked up + * directly based on the continuation byte, without + * needing to convert to code point */ + populate_bitmap_from_invlist( + cp_list, + + /* The base code point is from the start byte */ + TWO_BYTE_UTF8_TO_NATIVE(low_utf8[0], + UTF_CONTINUATION_MARK | 0), + + ((struct regnode_bbm *) REGNODE_p(*ret))->bitmap, + REGNODE_BBM_BITMAP_LEN); + RExC_emit += NODE_STEP_REGNODE + REGNODE_ARG_LEN(op); + return op; + } + else { + op = ANYOFHb; + } } else { op = ANYOFHs; *ret = REGNODE_GUTS(pRExC_state, op, - regarglen[op] + STR_SZ(len)); + REGNODE_ARG_LEN(op) + STR_SZ(len)); FILL_NODE(*ret, op); - ((struct regnode_anyofhs *) REGNODE_p(*ret))->str_len + STR_LEN_U8((struct regnode_anyofhs *) REGNODE_p(*ret)) = len; Copy(low_utf8, /* Add the common bytes */ ((struct regnode_anyofhs *) REGNODE_p(*ret))->string, len, U8); - RExC_emit += NODE_SZ_STR(REGNODE_p(*ret)); + RExC_emit = REGNODE_OFFSET(REGNODE_AFTER_varies(REGNODE_p(*ret))); set_ANYOF_arg(pRExC_state, REGNODE_p(*ret), cp_list, NULL, only_utf8_locale_list); return op; @@ -20586,7 +12093,7 @@ S_optimize_regclass(pTHX_ return_OPFAIL: op = OPFAIL; - *ret = reganode(pRExC_state, op, 0); + *ret = reg1node(pRExC_state, op, 0); return op; return_SANY: @@ -20598,19 +12105,21 @@ S_optimize_regclass(pTHX_ #undef HAS_NONLOCALE_RUNTIME_PROPERTY_DEFINITION -STATIC void -S_set_ANYOF_arg(pTHX_ RExC_state_t* const pRExC_state, +void +Perl_set_ANYOF_arg(pTHX_ RExC_state_t* const pRExC_state, regnode* const node, SV* const cp_list, SV* const runtime_defns, SV* const only_utf8_locale_list) { /* Sets the arg field of an ANYOF-type node 'node', using information about - * the node passed-in. If there is nothing outside the node's bitmap, the - * arg is set to ANYOF_ONLY_HAS_BITMAP. Otherwise, it sets the argument to - * the count returned by add_data(), having allocated and stored an array, - * av, as follows: + * the node passed-in. If only the bitmap is needed to determine what + * matches, the arg is set appropriately to either + * 1) ANYOF_MATCHES_NONE_OUTSIDE_BITMAP_VALUE + * 2) ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE * + * Otherwise, it sets the argument to the count returned by reg_add_data(), + * having allocated and stored an array, av, as follows: * av[0] stores the inversion list defining this class as far as known at * this time, or PL_sv_undef if nothing definite is now known. * av[1] stores the inversion list of code points that match only if the @@ -20623,52 +12132,152 @@ S_set_ANYOF_arg(pTHX_ RExC_state_t* cons PERL_ARGS_ASSERT_SET_ANYOF_ARG; - if (! cp_list && ! runtime_defns && ! only_utf8_locale_list) { - assert(! (ANYOF_FLAGS(node) - & ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP)); - ARG_SET(node, ANYOF_ONLY_HAS_BITMAP); - } - else { - AV * const av = newAV(); - SV *rv; + /* If this is set, the final disposition won't be known until runtime, so + * we can't do any of the compile time optimizations */ + if (! runtime_defns) { + + /* On plain ANYOF nodes without the possibility of a runtime locale + * making a difference, maybe there's no information to be gleaned + * except for what's in the bitmap */ + if (REGNODE_TYPE(OP(node)) == ANYOF && ! only_utf8_locale_list) { - if (cp_list) { - av_store(av, INVLIST_INDEX, SvREFCNT_inc_NN(cp_list)); - } + /* There are two such cases: + * 1) there is no list of code points matched outside the bitmap + */ + if (! cp_list) { + ARG1u_SET(node, ANYOF_MATCHES_NONE_OUTSIDE_BITMAP_VALUE); + return; + } - /* (Note that if any of this changes, the size calculations in - * S_optimize_regclass() might need to be updated.) */ + /* 2) the list indicates everything outside the bitmap matches */ + if ( invlist_highest(cp_list) == UV_MAX + && invlist_highest_range_start(cp_list) + <= NUM_ANYOF_CODE_POINTS) + { + ARG1u_SET(node, ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE); + return; + } - if (only_utf8_locale_list) { - av_store(av, ONLY_LOCALE_MATCHES_INDEX, - SvREFCNT_inc_NN(only_utf8_locale_list)); + /* In all other cases there are things outside the bitmap that we + * may need to check at runtime. */ } - if (runtime_defns) { - av_store(av, DEFERRED_USER_DEFINED_INDEX, - SvREFCNT_inc_NN(runtime_defns)); - } + /* Here, we have resolved all the possible run-time matches, and they + * are stored in one or both of two possible lists. (While some match + * only under certain runtime circumstances, we know all the possible + * ones for each such circumstance.) + * + * It may very well be that the pattern being compiled contains an + * identical class, already encountered. Reusing that class here saves + * space. Look through all classes so far encountered. */ + U32 existing_items = RExC_rxi->data ? RExC_rxi->data->count : 0; + for (unsigned int i = 0; i < existing_items; i++) { + + /* Only look at auxiliary data of this type */ + if (RExC_rxi->data->what[i] != 's') { + continue; + } + + SV * const rv = MUTABLE_SV(RExC_rxi->data->data[i]); + AV * const av = MUTABLE_AV(SvRV(rv)); + + /* If the already encountered class has data that won't be known + * until runtime (stored in the final element of the array), we + * can't share */ + if (av_top_index(av) > ONLY_LOCALE_MATCHES_INDEX) { + continue; + } + + SV ** stored_cp_list_ptr = av_fetch(av, INVLIST_INDEX, + false /* no lvalue */); - rv = newRV_noinc(MUTABLE_SV(av)); - n = add_data(pRExC_state, STR_WITH_LEN("s")); - RExC_rxi->data->data[n] = (void*)rv; - ARG_SET(node, n); + /* The new and the existing one both have to have or both not + * have this element, for this one to duplicate that one */ + if (cBOOL(cp_list) != cBOOL(stored_cp_list_ptr)) { + continue; + } + + /* If the inversion lists aren't equivalent, can't share */ + if (cp_list && ! _invlistEQ(cp_list, + *stored_cp_list_ptr, + FALSE /* don't complement */)) + { + continue; + } + + /* Similarly for the other list */ + SV ** stored_only_utf8_locale_list_ptr = av_fetch( + av, + ONLY_LOCALE_MATCHES_INDEX, + false /* no lvalue */); + if ( cBOOL(only_utf8_locale_list) + != cBOOL(stored_only_utf8_locale_list_ptr)) + { + continue; + } + + if (only_utf8_locale_list && ! _invlistEQ( + only_utf8_locale_list, + *stored_only_utf8_locale_list_ptr, + FALSE /* don't complement */)) + { + continue; + } + + /* Here, the existence and contents of both compile-time lists + * are identical between the new and existing data. Re-use the + * existing one */ + ARG1u_SET(node, i); + return; + } /* end of loop through existing classes */ } + + /* Here, we need to create a new auxiliary data element; either because + * this doesn't duplicate an existing one, or we can't tell at this time if + * it eventually will */ + + AV * const av = newAV(); + SV *rv; + + if (cp_list) { + av_store_simple(av, INVLIST_INDEX, SvREFCNT_inc_NN(cp_list)); + } + + /* (Note that if any of this changes, the size calculations in + * S_optimize_regclass() might need to be updated.) */ + + if (only_utf8_locale_list) { + av_store_simple(av, ONLY_LOCALE_MATCHES_INDEX, + SvREFCNT_inc_NN(only_utf8_locale_list)); + } + + if (runtime_defns) { + av_store_simple(av, DEFERRED_USER_DEFINED_INDEX, + SvREFCNT_inc_NN(runtime_defns)); + } + + rv = newRV_noinc(MUTABLE_SV(av)); + n = reg_add_data(pRExC_state, STR_WITH_LEN("s")); + RExC_rxi->data->data[n] = (void*)rv; + ARG1u_SET(node, n); } SV * #if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION) -Perl_get_regclass_nonbitmap_data(pTHX_ const regexp *prog, const regnode* node, bool doinit, SV** listsvp, SV** only_utf8_locale_ptr, SV** output_invlist) +Perl_get_regclass_aux_data(pTHX_ const regexp *prog, const regnode* node, bool doinit, SV** listsvp, SV** only_utf8_locale_ptr, SV** output_invlist) #else -Perl_get_re_gclass_nonbitmap_data(pTHX_ const regexp *prog, const regnode* node, bool doinit, SV** listsvp, SV** only_utf8_locale_ptr, SV** output_invlist) +Perl_get_re_gclass_aux_data(pTHX_ const regexp *prog, const regnode* node, bool doinit, SV** listsvp, SV** only_utf8_locale_ptr, SV** output_invlist) #endif { /* For internal core use only. * Returns the inversion list for the input 'node' in the regex 'prog'. * If is 'true', will attempt to create the inversion list if not - * already done. + * already done. If it is created, it will add to the normal inversion + * list any that comes from user-defined properties. It croaks if this + * is called before such a list is ready to be generated, that is when a + * user-defined property has been declared, buyt still not yet defined. * If is non-null, will return the printable contents of the * property definition. This can be used to get debugging information * even before the inversion list exists, by calling this function with @@ -20695,18 +12304,18 @@ Perl_get_re_gclass_nonbitmap_data(pTHX_ SV *si = NULL; /* Input initialization string */ SV* invlist = NULL; - RXi_GET_DECL(prog, progi); + RXi_GET_DECL_NULL(prog, progi); const struct reg_data * const data = prog ? progi->data : NULL; #if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION) - PERL_ARGS_ASSERT_GET_REGCLASS_NONBITMAP_DATA; + PERL_ARGS_ASSERT_GET_REGCLASS_AUX_DATA; #else - PERL_ARGS_ASSERT_GET_RE_GCLASS_NONBITMAP_DATA; + PERL_ARGS_ASSERT_GET_RE_GCLASS_AUX_DATA; #endif assert(! output_invlist || listsvp); if (data && data->count) { - const U32 n = ARG(node); + const U32 n = ARG1u(node); if (data->what[n] == 's') { SV * const rv = MUTABLE_SV(data->data[n]); @@ -21072,7 +12681,7 @@ S_regnode_guts(pTHX_ RExC_state_t *pRExC STATIC regnode_offset S_regnode_guts_debug(pTHX_ RExC_state_t *pRExC_state, const U8 op, const STRLEN extra_size) { PERL_ARGS_ASSERT_REGNODE_GUTS_DEBUG; - assert(extra_size >= regarglen[op] || PL_regkind[op] == ANYOF); + assert(extra_size >= REGNODE_ARG_LEN(op) || REGNODE_TYPE(op) == ANYOF); return S_regnode_guts(aTHX_ pRExC_state, extra_size); } @@ -21086,12 +12695,12 @@ S_regnode_guts_debug(pTHX_ RExC_state_t STATIC regnode_offset /* Location. */ S_reg_node(pTHX_ RExC_state_t *pRExC_state, U8 op) { - const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]); + const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op)); regnode_offset ptr = ret; PERL_ARGS_ASSERT_REG_NODE; - assert(regarglen[op] == 0); + assert(REGNODE_ARG_LEN(op) == 0); FILL_ADVANCE_NODE(ptr, op); RExC_emit = ptr; @@ -21099,20 +12708,20 @@ S_reg_node(pTHX_ RExC_state_t *pRExC_sta } /* -- reganode - emit a node with an argument +- reg1node - emit a node with an argument */ STATIC regnode_offset /* Location. */ -S_reganode(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg) +S_reg1node(pTHX_ RExC_state_t *pRExC_state, U8 op, U32 arg) { - const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]); + const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op)); regnode_offset ptr = ret; - PERL_ARGS_ASSERT_REGANODE; + PERL_ARGS_ASSERT_REG1NODE; /* ANYOF are special cased to allow non-length 1 args */ - assert(regarglen[op] == 1); + assert(REGNODE_ARG_LEN(op) == 1); - FILL_ADVANCE_NODE_ARG(ptr, op, arg); + FILL_ADVANCE_NODE_ARG1u(ptr, op, arg); RExC_emit = ptr; return(ret); } @@ -21123,7 +12732,7 @@ S_reganode(pTHX_ RExC_state_t *pRExC_sta STATIC regnode_offset /* Location. */ S_regpnode(pTHX_ RExC_state_t *pRExC_state, U8 op, SV * arg) { - const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]); + const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op)); regnode_offset ptr = ret; PERL_ARGS_ASSERT_REGPNODE; @@ -21134,18 +12743,18 @@ S_regpnode(pTHX_ RExC_state_t *pRExC_sta } STATIC regnode_offset -S_reg2Lanode(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2) +S_reg2node(pTHX_ RExC_state_t *pRExC_state, const U8 op, const U32 arg1, const I32 arg2) { /* emit a node with U32 and I32 arguments */ - const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]); + const regnode_offset ret = REGNODE_GUTS(pRExC_state, op, REGNODE_ARG_LEN(op)); regnode_offset ptr = ret; - PERL_ARGS_ASSERT_REG2LANODE; + PERL_ARGS_ASSERT_REG2NODE; - assert(regarglen[op] == 2); + assert(REGNODE_ARG_LEN(op) == 2); - FILL_ADVANCE_NODE_2L_ARG(ptr, op, arg1, arg2); + FILL_ADVANCE_NODE_2ui_ARG(ptr, op, arg1, arg2); RExC_emit = ptr; return(ret); } @@ -21160,7 +12769,7 @@ S_reg2Lanode(pTHX_ RExC_state_t *pRExC_s * set up NEXT_OFF() of the inserted node if needed. Something like this: * * reginsert(pRExC, OPFAIL, orig_emit, depth+1); -* NEXT_OFF(orig_emit) = regarglen[OPFAIL] + NODE_STEP_REGNODE; +* NEXT_OFF(REGNODE_p(orig_emit)) = REGNODE_ARG_LEN(OPFAIL) + NODE_STEP_REGNODE; * * ALSO NOTE - FLAGS(newly-inserted-operator) will be set to 0 as well. */ @@ -21171,15 +12780,14 @@ S_reginsert(pTHX_ RExC_state_t *pRExC_st regnode *src; regnode *dst; regnode *place; - const int offset = regarglen[(U8)op]; + const int offset = REGNODE_ARG_LEN((U8)op); const int size = NODE_STEP_REGNODE + offset; DECLARE_AND_GET_RE_DEBUG_FLAGS; PERL_ARGS_ASSERT_REGINSERT; PERL_UNUSED_CONTEXT; PERL_UNUSED_ARG(depth); -/* (PL_regkind[(U8)op] == CURLY ? EXTRA_STEP_2ARGS : 0); */ - DEBUG_PARSE_FMT("inst"," - %s", PL_reg_name[op]); + DEBUG_PARSE_FMT("inst"," - %s", REGNODE_NAME(op)); assert(!RExC_study_started); /* I believe we should never use reginsert once we have started studying. If this is wrong then we need to adjust RExC_recurse below like we do with RExC_open_parens/RExC_close_parens. */ @@ -21223,7 +12831,7 @@ S_reginsert(pTHX_ RExC_state_t *pRExC_st } place = REGNODE_p(operand); /* Op node, where operand used to be. */ - src = NEXTOPER(place); + src = place + 1; /* NOT REGNODE_AFTER! */ FLAGS(place) = 0; FILL_NODE(operand, op); @@ -21263,7 +12871,7 @@ S_regtail(pTHX_ RExC_state_t * pRExC_sta Perl_re_printf( aTHX_ "~ %s (%zu) %s %s\n", SvPV_nolen_const(RExC_mysv), scan, (temp == NULL ? "->" : ""), - (temp == NULL ? PL_reg_name[OP(REGNODE_p(val))] : "") + (temp == NULL ? REGNODE_NAME(OP(REGNODE_p(val))) : "") ); }); if (temp == NULL) @@ -21273,9 +12881,9 @@ S_regtail(pTHX_ RExC_state_t * pRExC_sta /* Populate this node's next pointer */ assert(val >= scan); - if (reg_off_by_arg[OP(REGNODE_p(scan))]) { + if (REGNODE_OFF_BY_ARG(OP(REGNODE_p(scan)))) { assert((UV) (val - scan) <= U32_MAX); - ARG_SET(REGNODE_p(scan), val - scan); + ARG1u_SET(REGNODE_p(scan), val - scan); } else { if (val - scan > U16_MAX) { @@ -21332,7 +12940,7 @@ S_regtail_study(pTHX_ RExC_state_t *pREx for (;;) { regnode * const temp = regnext(REGNODE_p(scan)); #ifdef EXPERIMENTAL_INPLACESCAN - if (PL_regkind[OP(REGNODE_p(scan))] == EXACT) { + if (REGNODE_TYPE(OP(REGNODE_p(scan))) == EXACT) { bool unfolded_multi_char; /* Unexamined in this routine */ if (join_exact(pRExC_state, scan, &min, &unfolded_multi_char, 1, REGNODE_p(val), depth+1)) @@ -21340,7 +12948,7 @@ S_regtail_study(pTHX_ RExC_state_t *pREx } #endif if ( exact ) { - if (PL_regkind[OP(REGNODE_p(scan))] == EXACT) { + if (REGNODE_TYPE(OP(REGNODE_p(scan))) == EXACT) { if (exact == PSEUDO ) exact= OP(REGNODE_p(scan)); else if (exact != OP(REGNODE_p(scan)) ) @@ -21356,7 +12964,7 @@ S_regtail_study(pTHX_ RExC_state_t *pREx Perl_re_printf( aTHX_ "~ %s (%zu) -> %s\n", SvPV_nolen_const(RExC_mysv), scan, - PL_reg_name[exact]); + REGNODE_NAME(exact)); }); if (temp == NULL) break; @@ -21372,9 +12980,9 @@ S_regtail_study(pTHX_ RExC_state_t *pREx (IV)(val - scan) ); }); - if (reg_off_by_arg[OP(REGNODE_p(scan))]) { + if (REGNODE_OFF_BY_ARG(OP(REGNODE_p(scan)))) { assert((UV) (val - scan) <= U32_MAX); - ARG_SET(REGNODE_p(scan), val - scan); + ARG1u_SET(REGNODE_p(scan), val - scan); } else { if (val - scan > U16_MAX) { @@ -21391,710 +12999,53 @@ S_regtail_study(pTHX_ RExC_state_t *pREx } #endif -STATIC SV* -S_get_ANYOFM_contents(pTHX_ const regnode * n) { +SV* +Perl_get_ANYOFM_contents(pTHX_ const regnode * n) { /* Returns an inversion list of all the code points matched by the * ANYOFM/NANYOFM node 'n' */ SV * cp_list = _new_invlist(-1); - const U8 lowest = (U8) ARG(n); + const U8 lowest = (U8) ARG1u(n); unsigned int i; U8 count = 0; - U8 needed = 1U << PL_bitcount[ (U8) ~ FLAGS(n)]; - - PERL_ARGS_ASSERT_GET_ANYOFM_CONTENTS; - - /* Starting with the lowest code point, any code point that ANDed with the - * mask yields the lowest code point is in the set */ - for (i = lowest; i <= 0xFF; i++) { - if ((i & FLAGS(n)) == ARG(n)) { - cp_list = add_cp_to_invlist(cp_list, i); - count++; - - /* We know how many code points (a power of two) that are in the - * set. No use looking once we've got that number */ - if (count >= needed) break; - } - } - - if (OP(n) == NANYOFM) { - _invlist_invert(cp_list); - } - return cp_list; -} - -/* - - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form - */ -#ifdef DEBUGGING - -static void -S_regdump_intflags(pTHX_ const char *lead, const U32 flags) -{ - int bit; - int set=0; - - ASSUME(REG_INTFLAGS_NAME_SIZE <= sizeof(flags)*8); - - for (bit=0; bitprogram, ri->program + 1, NULL, NULL, sv, 0, 0); - - /* Header fields of interest. */ - for (i = 0; i < 2; i++) { - if (r->substrs->data[i].substr) { - RE_PV_QUOTED_DECL(s, 0, dsv, - SvPVX_const(r->substrs->data[i].substr), - RE_SV_DUMPLEN(r->substrs->data[i].substr), - PL_dump_re_max_len); - Perl_re_printf( aTHX_ - "%s %s%s at %" IVdf "..%" UVuf " ", - i ? "floating" : "anchored", - s, - RE_SV_TAIL(r->substrs->data[i].substr), - (IV)r->substrs->data[i].min_offset, - (UV)r->substrs->data[i].max_offset); - } - else if (r->substrs->data[i].utf8_substr) { - RE_PV_QUOTED_DECL(s, 1, dsv, - SvPVX_const(r->substrs->data[i].utf8_substr), - RE_SV_DUMPLEN(r->substrs->data[i].utf8_substr), - 30); - Perl_re_printf( aTHX_ - "%s utf8 %s%s at %" IVdf "..%" UVuf " ", - i ? "floating" : "anchored", - s, - RE_SV_TAIL(r->substrs->data[i].utf8_substr), - (IV)r->substrs->data[i].min_offset, - (UV)r->substrs->data[i].max_offset); - } - } - - if (r->check_substr || r->check_utf8) - Perl_re_printf( aTHX_ - (const char *) - ( r->check_substr == r->substrs->data[1].substr - && r->check_utf8 == r->substrs->data[1].utf8_substr - ? "(checking floating" : "(checking anchored")); - if (r->intflags & PREGf_NOSCAN) - Perl_re_printf( aTHX_ " noscan"); - if (r->extflags & RXf_CHECK_ALL) - Perl_re_printf( aTHX_ " isall"); - if (r->check_substr || r->check_utf8) - Perl_re_printf( aTHX_ ") "); - - if (ri->regstclass) { - regprop(r, sv, ri->regstclass, NULL, NULL); - Perl_re_printf( aTHX_ "stclass %s ", SvPVX_const(sv)); - } - if (r->intflags & PREGf_ANCH) { - Perl_re_printf( aTHX_ "anchored"); - if (r->intflags & PREGf_ANCH_MBOL) - Perl_re_printf( aTHX_ "(MBOL)"); - if (r->intflags & PREGf_ANCH_SBOL) - Perl_re_printf( aTHX_ "(SBOL)"); - if (r->intflags & PREGf_ANCH_GPOS) - Perl_re_printf( aTHX_ "(GPOS)"); - Perl_re_printf( aTHX_ " "); - } - if (r->intflags & PREGf_GPOS_SEEN) - Perl_re_printf( aTHX_ "GPOS:%" UVuf " ", (UV)r->gofs); - if (r->intflags & PREGf_SKIP) - Perl_re_printf( aTHX_ "plus "); - if (r->intflags & PREGf_IMPLICIT) - Perl_re_printf( aTHX_ "implicit "); - Perl_re_printf( aTHX_ "minlen %" IVdf " ", (IV)r->minlen); - if (r->extflags & RXf_EVAL_SEEN) - Perl_re_printf( aTHX_ "with eval "); - Perl_re_printf( aTHX_ "\n"); - DEBUG_FLAGS_r({ - regdump_extflags("r->extflags: ", r->extflags); - regdump_intflags("r->intflags: ", r->intflags); - }); -#else - PERL_ARGS_ASSERT_REGDUMP; - PERL_UNUSED_CONTEXT; - PERL_UNUSED_ARG(r); -#endif /* DEBUGGING */ -} - -/* Should be synchronized with ANYOF_ #defines in regcomp.h */ -#ifdef DEBUGGING - -# if _CC_WORDCHAR != 0 || _CC_DIGIT != 1 || _CC_ALPHA != 2 \ - || _CC_LOWER != 3 || _CC_UPPER != 4 || _CC_PUNCT != 5 \ - || _CC_PRINT != 6 || _CC_ALPHANUMERIC != 7 || _CC_GRAPH != 8 \ - || _CC_CASED != 9 || _CC_SPACE != 10 || _CC_BLANK != 11 \ - || _CC_XDIGIT != 12 || _CC_CNTRL != 13 || _CC_ASCII != 14 \ - || _CC_VERTSPACE != 15 -# error Need to adjust order of anyofs[] -# endif -static const char * const anyofs[] = { - "\\w", - "\\W", - "\\d", - "\\D", - "[:alpha:]", - "[:^alpha:]", - "[:lower:]", - "[:^lower:]", - "[:upper:]", - "[:^upper:]", - "[:punct:]", - "[:^punct:]", - "[:print:]", - "[:^print:]", - "[:alnum:]", - "[:^alnum:]", - "[:graph:]", - "[:^graph:]", - "[:cased:]", - "[:^cased:]", - "\\s", - "\\S", - "[:blank:]", - "[:^blank:]", - "[:xdigit:]", - "[:^xdigit:]", - "[:cntrl:]", - "[:^cntrl:]", - "[:ascii:]", - "[:^ascii:]", - "\\v", - "\\V" -}; -#endif - -/* -- regprop - printable representation of opcode, with run time support -*/ - -void -Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_info *reginfo, const RExC_state_t *pRExC_state) -{ -#ifdef DEBUGGING - int k; - RXi_GET_DECL(prog, progi); - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - PERL_ARGS_ASSERT_REGPROP; - - SvPVCLEAR(sv); - - if (OP(o) > REGNODE_MAX) { /* regnode.type is unsigned */ - if (pRExC_state) { /* This gives more info, if we have it */ - FAIL3("panic: corrupted regexp opcode %d > %d", - (int)OP(o), (int)REGNODE_MAX); - } - else { - Perl_croak(aTHX_ "panic: corrupted regexp opcode %d > %d", - (int)OP(o), (int)REGNODE_MAX); - } - } - sv_catpv(sv, PL_reg_name[OP(o)]); /* Take off const! */ - - k = PL_regkind[OP(o)]; - - if (k == EXACT) { - sv_catpvs(sv, " "); - /* Using is_utf8_string() (via PERL_PV_UNI_DETECT) - * is a crude hack but it may be the best for now since - * we have no flag "this EXACTish node was UTF-8" - * --jhi */ - pv_pretty(sv, STRING(o), STR_LEN(o), PL_dump_re_max_len, - PL_colors[0], PL_colors[1], - PERL_PV_ESCAPE_UNI_DETECT | - PERL_PV_ESCAPE_NONASCII | - PERL_PV_PRETTY_ELLIPSES | - PERL_PV_PRETTY_LTGT | - PERL_PV_PRETTY_NOCLEAR - ); - } else if (k == TRIE) { - /* print the details of the trie in dumpuntil instead, as - * progi->data isn't available here */ - const char op = OP(o); - const U32 n = ARG(o); - const reg_ac_data * const ac = IS_TRIE_AC(op) ? - (reg_ac_data *)progi->data->data[n] : - NULL; - const reg_trie_data * const trie - = (reg_trie_data*)progi->data->data[!IS_TRIE_AC(op) ? n : ac->trie]; - - Perl_sv_catpvf(aTHX_ sv, "-%s", PL_reg_name[o->flags]); - DEBUG_TRIE_COMPILE_r({ - if (trie->jump) - sv_catpvs(sv, "(JUMP)"); - Perl_sv_catpvf(aTHX_ sv, - "", - (UV)trie->startstate, - (IV)trie->statecount-1, /* -1 because of the unused 0 element */ - (UV)trie->wordcount, - (UV)trie->minlen, - (UV)trie->maxlen, - (UV)TRIE_CHARCOUNT(trie), - (UV)trie->uniquecharcount - ); - }); - if ( IS_ANYOF_TRIE(op) || trie->bitmap ) { - sv_catpvs(sv, "["); - (void) put_charclass_bitmap_innards(sv, - ((IS_ANYOF_TRIE(op)) - ? ANYOF_BITMAP(o) - : TRIE_BITMAP(trie)), - NULL, - NULL, - NULL, - 0, - FALSE - ); - sv_catpvs(sv, "]"); - } - } else if (k == CURLY) { - U32 lo = ARG1(o), hi = ARG2(o); - if (OP(o) == CURLYM || OP(o) == CURLYN || OP(o) == CURLYX) - Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); /* Parenth number */ - Perl_sv_catpvf(aTHX_ sv, "{%u,", (unsigned) lo); - if (hi == REG_INFTY) - sv_catpvs(sv, "INFTY"); - else - Perl_sv_catpvf(aTHX_ sv, "%u", (unsigned) hi); - sv_catpvs(sv, "}"); - } - else if (k == WHILEM && o->flags) /* Ordinal/of */ - Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", o->flags & 0xf, o->flags>>4); - else if (k == REF || k == OPEN || k == CLOSE - || k == GROUPP || OP(o)==ACCEPT) - { - AV *name_list= NULL; - U32 parno= OP(o) == ACCEPT ? (U32)ARG2L(o) : ARG(o); - Perl_sv_catpvf(aTHX_ sv, "%" UVuf, (UV)parno); /* Parenth number */ - if ( RXp_PAREN_NAMES(prog) ) { - name_list= MUTABLE_AV(progi->data->data[progi->name_list_idx]); - } else if ( pRExC_state ) { - name_list= RExC_paren_name_list; - } - if ( name_list ) { - if ( k != REF || (OP(o) < REFN)) { - SV **name= av_fetch(name_list, parno, 0 ); - if (name) - Perl_sv_catpvf(aTHX_ sv, " '%" SVf "'", SVfARG(*name)); - } - else - if (parno > 0) { - /* parno must always be larger than 0 for this block - * as it represents a slot into the data array, which - * has the 0 slot reserved for a placeholder so any valid - * index into it is always true, eg non-zero - * see the '%' "what" type and the implementation of - * S_add_data() - */ - SV *sv_dat= MUTABLE_SV(progi->data->data[ parno ]); - I32 *nums=(I32*)SvPVX(sv_dat); - SV **name= av_fetch(name_list, nums[0], 0 ); - I32 n; - if (name) { - for ( n=0; noffs[n].start; - if (prog->lastparen < n || ln == -1 || prog->offs[n].end == -1) - Perl_sv_catpvf(aTHX_ sv, ": FAIL"); - else if (ln == prog->offs[n].end) - Perl_sv_catpvf(aTHX_ sv, ": ACCEPT - EMPTY STRING"); - else { - const char *s = reginfo->strbeg + ln; - Perl_sv_catpvf(aTHX_ sv, ": "); - Perl_pv_pretty( aTHX_ sv, s, prog->offs[n].end - prog->offs[n].start, 32, 0, 0, - PERL_PV_ESCAPE_UNI_DETECT|PERL_PV_PRETTY_NOCLEAR|PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE ); - } - } - } else if (k == GOSUB) { - AV *name_list= NULL; - if ( RXp_PAREN_NAMES(prog) ) { - name_list= MUTABLE_AV(progi->data->data[progi->name_list_idx]); - } else if ( pRExC_state ) { - name_list= RExC_paren_name_list; - } - - /* Paren and offset */ - Perl_sv_catpvf(aTHX_ sv, "%d[%+d:%d]", (int)ARG(o),(int)ARG2L(o), - (int)((o + (int)ARG2L(o)) - progi->program) ); - if (name_list) { - SV **name= av_fetch(name_list, ARG(o), 0 ); - if (name) - Perl_sv_catpvf(aTHX_ sv, " '%" SVf "'", SVfARG(*name)); - } - } - else if (k == LOGICAL) - /* 2: embedded, otherwise 1 */ - Perl_sv_catpvf(aTHX_ sv, "[%d]", o->flags); - else if (k == ANYOF || k == ANYOFR) { - U8 flags; - char * bitmap; - U32 arg; - bool do_sep = FALSE; /* Do we need to separate various components of - the output? */ - /* Set if there is still an unresolved user-defined property */ - SV *unresolved = NULL; - - /* Things that are ignored except when the runtime locale is UTF-8 */ - SV *only_utf8_locale_invlist = NULL; - - /* Code points that don't fit in the bitmap */ - SV *nonbitmap_invlist = NULL; - - /* And things that aren't in the bitmap, but are small enough to be */ - SV* bitmap_range_not_in_bitmap = NULL; - - bool inverted; - - if (inRANGE(OP(o), ANYOFH, ANYOFRb)) { - flags = 0; - bitmap = NULL; - arg = 0; - } - else { - flags = ANYOF_FLAGS(o); - bitmap = ANYOF_BITMAP(o); - arg = ARG(o); - } - - if (OP(o) == ANYOFL || OP(o) == ANYOFPOSIXL) { - if (ANYOFL_UTF8_LOCALE_REQD(flags)) { - sv_catpvs(sv, "{utf8-locale-reqd}"); - } - if (flags & ANYOFL_FOLD) { - sv_catpvs(sv, "{i}"); - } - } - - inverted = flags & ANYOF_INVERT; - - /* If there is stuff outside the bitmap, get it */ - if (arg != ANYOF_ONLY_HAS_BITMAP) { - if (inRANGE(OP(o), ANYOFR, ANYOFRb)) { - nonbitmap_invlist = _add_range_to_invlist(nonbitmap_invlist, - ANYOFRbase(o), - ANYOFRbase(o) + ANYOFRdelta(o)); - } - else { -#if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION) - (void) get_regclass_nonbitmap_data(prog, o, FALSE, - &unresolved, - &only_utf8_locale_invlist, - &nonbitmap_invlist); -#else - (void) get_re_gclass_nonbitmap_data(prog, o, FALSE, - &unresolved, - &only_utf8_locale_invlist, - &nonbitmap_invlist); -#endif - } - - /* The non-bitmap data may contain stuff that could fit in the - * bitmap. This could come from a user-defined property being - * finally resolved when this call was done; or much more likely - * because there are matches that require UTF-8 to be valid, and so - * aren't in the bitmap (or ANYOFR). This is teased apart later */ - _invlist_intersection(nonbitmap_invlist, - PL_InBitmap, - &bitmap_range_not_in_bitmap); - /* Leave just the things that don't fit into the bitmap */ - _invlist_subtract(nonbitmap_invlist, - PL_InBitmap, - &nonbitmap_invlist); - } - - /* Obey this flag to add all above-the-bitmap code points */ - if (flags & ANYOF_MATCHES_ALL_ABOVE_BITMAP) { - nonbitmap_invlist = _add_range_to_invlist(nonbitmap_invlist, - NUM_ANYOF_CODE_POINTS, - UV_MAX); - } - - /* Ready to start outputting. First, the initial left bracket */ - Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]); - - /* ANYOFH by definition doesn't have anything that will fit inside the - * bitmap; ANYOFR may or may not. */ - if ( ! inRANGE(OP(o), ANYOFH, ANYOFHr) - && ( ! inRANGE(OP(o), ANYOFR, ANYOFRb) - || ANYOFRbase(o) < NUM_ANYOF_CODE_POINTS)) - { - /* Then all the things that could fit in the bitmap */ - do_sep = put_charclass_bitmap_innards(sv, - bitmap, - bitmap_range_not_in_bitmap, - only_utf8_locale_invlist, - o, - flags, - - /* Can't try inverting for a - * better display if there - * are things that haven't - * been resolved */ - unresolved != NULL - || inRANGE(OP(o), ANYOFR, ANYOFRb)); - SvREFCNT_dec(bitmap_range_not_in_bitmap); - - /* If there are user-defined properties which haven't been defined - * yet, output them. If the result is not to be inverted, it is - * clearest to output them in a separate [] from the bitmap range - * stuff. If the result is to be complemented, we have to show - * everything in one [], as the inversion applies to the whole - * thing. Use {braces} to separate them from anything in the - * bitmap and anything above the bitmap. */ - if (unresolved) { - if (inverted) { - if (! do_sep) { /* If didn't output anything in the bitmap - */ - sv_catpvs(sv, "^"); - } - sv_catpvs(sv, "{"); - } - else if (do_sep) { - Perl_sv_catpvf(aTHX_ sv,"%s][%s", PL_colors[1], - PL_colors[0]); - } - sv_catsv(sv, unresolved); - if (inverted) { - sv_catpvs(sv, "}"); - } - do_sep = ! inverted; - } - } - - /* And, finally, add the above-the-bitmap stuff */ - if (nonbitmap_invlist && _invlist_len(nonbitmap_invlist)) { - SV* contents; - - /* See if truncation size is overridden */ - const STRLEN dump_len = (PL_dump_re_max_len > 256) - ? PL_dump_re_max_len - : 256; - - /* This is output in a separate [] */ - if (do_sep) { - Perl_sv_catpvf(aTHX_ sv,"%s][%s", PL_colors[1], PL_colors[0]); - } - - /* And, for easy of understanding, it is shown in the - * uncomplemented form if possible. The one exception being if - * there are unresolved items, where the inversion has to be - * delayed until runtime */ - if (inverted && ! unresolved) { - _invlist_invert(nonbitmap_invlist); - _invlist_subtract(nonbitmap_invlist, PL_InBitmap, &nonbitmap_invlist); - } - - contents = invlist_contents(nonbitmap_invlist, - FALSE /* output suitable for catsv */ - ); - - /* If the output is shorter than the permissible maximum, just do it. */ - if (SvCUR(contents) <= dump_len) { - sv_catsv(sv, contents); - } - else { - const char * contents_string = SvPVX(contents); - STRLEN i = dump_len; - - /* Otherwise, start at the permissible max and work back to the - * first break possibility */ - while (i > 0 && contents_string[i] != ' ') { - i--; - } - if (i == 0) { /* Fail-safe. Use the max if we couldn't - find a legal break */ - i = dump_len; - } - - sv_catpvn(sv, contents_string, i); - sv_catpvs(sv, "..."); - } - - SvREFCNT_dec_NN(contents); - SvREFCNT_dec_NN(nonbitmap_invlist); - } - - /* And finally the matching, closing ']' */ - Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]); - - if (OP(o) == ANYOFHs) { - Perl_sv_catpvf(aTHX_ sv, " (Leading UTF-8 bytes=%s", _byte_dump_string((U8 *) ((struct regnode_anyofhs *) o)->string, FLAGS(o), 1)); - } - else if (inRANGE(OP(o), ANYOFH, ANYOFRb)) { - U8 lowest = (OP(o) != ANYOFHr) - ? FLAGS(o) - : LOWEST_ANYOF_HRx_BYTE(FLAGS(o)); - U8 highest = (OP(o) == ANYOFHr) - ? HIGHEST_ANYOF_HRx_BYTE(FLAGS(o)) - : (OP(o) == ANYOFH || OP(o) == ANYOFR) - ? 0xFF - : lowest; -#ifndef EBCDIC - if (OP(o) != ANYOFR || ! isASCII(ANYOFRbase(o) + ANYOFRdelta(o))) -#endif - { - Perl_sv_catpvf(aTHX_ sv, " (First UTF-8 byte=%02X", lowest); - if (lowest != highest) { - Perl_sv_catpvf(aTHX_ sv, "-%02X", highest); - } - Perl_sv_catpvf(aTHX_ sv, ")"); - } - } - - SvREFCNT_dec(unresolved); - } - else if (k == ANYOFM) { - SV * cp_list = get_ANYOFM_contents(o); + U8 needed = 1U << PL_bitcount[ (U8) ~ FLAGS(n)]; - Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]); - if (OP(o) == NANYOFM) { - _invlist_invert(cp_list); - } + PERL_ARGS_ASSERT_GET_ANYOFM_CONTENTS; - put_charclass_bitmap_innards(sv, NULL, cp_list, NULL, NULL, 0, TRUE); - Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]); + /* Starting with the lowest code point, any code point that ANDed with the + * mask yields the lowest code point is in the set */ + for (i = lowest; i <= 0xFF; i++) { + if ((i & FLAGS(n)) == ARG1u(n)) { + cp_list = add_cp_to_invlist(cp_list, i); + count++; - SvREFCNT_dec(cp_list); - } - else if (k == POSIXD || k == NPOSIXD) { - U8 index = FLAGS(o) * 2; - if (index < C_ARRAY_LENGTH(anyofs)) { - if (*anyofs[index] != '[') { - sv_catpvs(sv, "["); - } - sv_catpv(sv, anyofs[index]); - if (*anyofs[index] != '[') { - sv_catpvs(sv, "]"); - } - } - else { - Perl_sv_catpvf(aTHX_ sv, "[illegal type=%d])", index); + /* We know how many code points (a power of two) that are in the + * set. No use looking once we've got that number */ + if (count >= needed) break; } } - else if (k == BOUND || k == NBOUND) { - /* Must be synced with order of 'bound_type' in regcomp.h */ - const char * const bounds[] = { - "", /* Traditional */ - "{gcb}", - "{lb}", - "{sb}", - "{wb}" - }; - assert(FLAGS(o) < C_ARRAY_LENGTH(bounds)); - sv_catpv(sv, bounds[FLAGS(o)]); - } - else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH)) { - Perl_sv_catpvf(aTHX_ sv, "[%d", -(o->flags)); - if (o->next_off) { - Perl_sv_catpvf(aTHX_ sv, "..-%d", o->flags - o->next_off); - } - Perl_sv_catpvf(aTHX_ sv, "]"); - } - else if (OP(o) == SBOL) - Perl_sv_catpvf(aTHX_ sv, " /%s/", o->flags ? "\\A" : "^"); - - /* add on the verb argument if there is one */ - if ( ( k == VERB || OP(o) == ACCEPT || OP(o) == OPFAIL ) && o->flags) { - if ( ARG(o) ) - Perl_sv_catpvf(aTHX_ sv, ":%" SVf, - SVfARG((MUTABLE_SV(progi->data->data[ ARG( o ) ])))); - else - sv_catpvs(sv, ":NULL"); + + if (OP(n) == NANYOFM) { + _invlist_invert(cp_list); } -#else - PERL_UNUSED_CONTEXT; - PERL_UNUSED_ARG(sv); - PERL_UNUSED_ARG(o); - PERL_UNUSED_ARG(prog); - PERL_UNUSED_ARG(reginfo); - PERL_UNUSED_ARG(pRExC_state); -#endif /* DEBUGGING */ + return cp_list; +} + +SV * +Perl_get_ANYOFHbbm_contents(pTHX_ const regnode * n) { + PERL_ARGS_ASSERT_GET_ANYOFHBBM_CONTENTS; + + SV * cp_list = NULL; + populate_invlist_from_bitmap( + ((struct regnode_bbm *) n)->bitmap, + REGNODE_BBM_BITMAP_LEN * CHARBITS, + &cp_list, + + /* The base cp is from the start byte plus a zero continuation */ + TWO_BYTE_UTF8_TO_NATIVE(FIRST_BYTE((struct regnode_bbm *) n), + UTF_CONTINUATION_MARK | 0)); + return cp_list; } @@ -22183,7 +13134,13 @@ Perl_pregfree2(pTHX_ REGEXP *rx) #ifdef PERL_ANY_COW SvREFCNT_dec(r->saved_copy); #endif - Safefree(r->offs); + Safefree(RXp_OFFSp(r)); + if (r->logical_to_parno) { + Safefree(r->logical_to_parno); + Safefree(r->parno_to_logical); + Safefree(r->parno_to_logical_next); + } + SvREFCNT_dec(r->qr_anoncv); if (r->recurse_locinput) Safefree(r->recurse_locinput); @@ -22281,12 +13238,12 @@ Perl_reg_temp_copy(pTHX_ REGEXP *dsv, RE */ memcpy(&(drx->xpv_cur), &(srx->xpv_cur), sizeof(regexp) - STRUCT_OFFSET(regexp, xpv_cur)); + if (!islv) SvLEN_set(dsv, 0); - if (srx->offs) { + if (RXp_OFFSp(srx)) { const I32 npar = srx->nparens+1; - Newx(drx->offs, npar, regexp_paren_pair); - Copy(srx->offs, drx->offs, npar, regexp_paren_pair); + NewCopy(RXp_OFFSp(srx), RXp_OFFSp(drx), npar, regexp_paren_pair); } if (srx->substrs) { int i; @@ -22301,9 +13258,26 @@ Perl_reg_temp_copy(pTHX_ REGEXP *dsv, RE /* check_substr and check_utf8, if non-NULL, point to either their anchored or float namesakes, and don't hold a second reference. */ } + if (srx->logical_to_parno) { + NewCopy(srx->logical_to_parno, + drx->logical_to_parno, + srx->nparens+1, I32); + NewCopy(srx->parno_to_logical, + drx->parno_to_logical, + srx->nparens+1, I32); + NewCopy(srx->parno_to_logical_next, + drx->parno_to_logical_next, + srx->nparens+1, I32); + } else { + drx->logical_to_parno = NULL; + drx->parno_to_logical = NULL; + drx->parno_to_logical_next = NULL; + } + drx->logical_nparens = srx->logical_nparens; + RX_MATCH_COPIED_off(dsv); #ifdef PERL_ANY_COW - drx->saved_copy = NULL; + RXp_SAVED_COPY(drx) = NULL; #endif drx->mother_re = ReREFCNT_inc(srx->mother_re ? srx->mother_re : ssv); SvREFCNT_inc_void(drx->qr_anoncv); @@ -22416,6 +13390,10 @@ Perl_regfree_internal(pTHX_ REGEXP * con PerlMemShared_free(trie->bitmap); if (trie->jump) PerlMemShared_free(trie->jump); + if (trie->j_before_paren) + PerlMemShared_free(trie->j_before_paren); + if (trie->j_after_paren) + PerlMemShared_free(trie->j_after_paren); PerlMemShared_free(trie->wordinfo); /* do this last!!!! */ PerlMemShared_free(ri->data->data[n]); @@ -22423,7 +13401,7 @@ Perl_regfree_internal(pTHX_ REGEXP * con } break; case '%': - /* NO-OP a '%' data contains a null pointer, so that add_data + /* NO-OP a '%' data contains a null pointer, so that reg_add_data * always returns non-zero, this should only ever happen in the * 0 index */ assert(n==0); @@ -22440,8 +13418,6 @@ Perl_regfree_internal(pTHX_ REGEXP * con Safefree(ri); } -#define av_dup_inc(s, t) MUTABLE_AV(sv_dup_inc((const SV *)s, t)) -#define hv_dup_inc(s, t) MUTABLE_HV(sv_dup_inc((const SV *)s, t)) #define SAVEPVN(p, n) ((p) ? savepvn(p, n) : NULL) /* @@ -22472,8 +13448,7 @@ Perl_re_dup_guts(pTHX_ const REGEXP *sst PERL_ARGS_ASSERT_RE_DUP_GUTS; npar = r->nparens+1; - Newx(ret->offs, npar, regexp_paren_pair); - Copy(r->offs, ret->offs, npar, regexp_paren_pair); + NewCopy(RXp_OFFSp(r), RXp_OFFSp(ret), npar, regexp_paren_pair); if (ret->substrs) { /* Do it this way to avoid reading from *r after the StructCopy(). @@ -22527,13 +13502,26 @@ Perl_re_dup_guts(pTHX_ const REGEXP *sst RXi_SET(ret, CALLREGDUPE_PVT(dstr, param)); if (RX_MATCH_COPIED(dstr)) - ret->subbeg = SAVEPVN(ret->subbeg, ret->sublen); + RXp_SUBBEG(ret) = SAVEPVN(RXp_SUBBEG(ret), RXp_SUBLEN(ret)); else - ret->subbeg = NULL; + RXp_SUBBEG(ret) = NULL; #ifdef PERL_ANY_COW - ret->saved_copy = NULL; + RXp_SAVED_COPY(ret) = NULL; #endif + if (r->logical_to_parno) { + /* we use total_parens for all three just for symmetry */ + ret->logical_to_parno = (I32*)SAVEPVN((char*)(r->logical_to_parno), (1+r->nparens) * sizeof(I32)); + ret->parno_to_logical = (I32*)SAVEPVN((char*)(r->parno_to_logical), (1+r->nparens) * sizeof(I32)); + ret->parno_to_logical_next = (I32*)SAVEPVN((char*)(r->parno_to_logical_next), (1+r->nparens) * sizeof(I32)); + } else { + ret->logical_to_parno = NULL; + ret->parno_to_logical = NULL; + ret->parno_to_logical_next = NULL; + } + + ret->logical_nparens = r->logical_nparens; + /* Whether mother_re be set or no, we need to copy the string. We cannot refrain from copying it when the storage points directly to our mother regexp, because that's @@ -22658,7 +13646,7 @@ Perl_regdupe_internal(pTHX_ REGEXP * con break; case '%': /* this is a placeholder type, it exists purely so that - * add_data always returns a non-zero value, this type of + * reg_add_data always returns a non-zero value, this type of * entry should ONLY be present in the 0 slot of the array */ assert(i == 0); d->data[i]= ri->data->data[i]; @@ -22674,6 +13662,15 @@ Perl_regdupe_internal(pTHX_ REGEXP * con else reti->data = NULL; + if (ri->regstclass && !reti->regstclass) { + /* Assume that the regstclass is a regnode which is inside of the + * program which we have to copy over */ + regnode *node= ri->regstclass; + assert(node >= ri->program && (node - ri->program) < len); + reti->regstclass = reti->program + (node - ri->program); + } + + reti->name_list_idx = ri->name_list_idx; SetProgLen(reti, len); @@ -22683,33 +13680,6 @@ Perl_regdupe_internal(pTHX_ REGEXP * con #endif /* USE_ITHREADS */ -#ifndef PERL_IN_XSUB_RE - -/* - - regnext - dig the "next" pointer out of a node - */ -regnode * -Perl_regnext(pTHX_ regnode *p) -{ - I32 offset; - - if (!p) - return(NULL); - - if (OP(p) > REGNODE_MAX) { /* regnode.type is unsigned */ - Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d", - (int)OP(p), (int)REGNODE_MAX); - } - - offset = (reg_off_by_arg[OP(p)] ? ARG(p) : NEXT_OFF(p)); - if (offset == 0) - return(NULL); - - return(p+offset); -} - -#endif - STATIC void S_re_croak(pTHX_ bool utf8, const char* pat,...) { @@ -22778,776 +13748,6 @@ Perl_save_re_context(pTHX) } #endif -#ifdef DEBUGGING - -STATIC void -S_put_code_point(pTHX_ SV *sv, UV c) -{ - PERL_ARGS_ASSERT_PUT_CODE_POINT; - - if (c > 255) { - Perl_sv_catpvf(aTHX_ sv, "\\x{%04" UVXf "}", c); - } - else if (isPRINT(c)) { - const char string = (char) c; - - /* We use {phrase} as metanotation in the class, so also escape literal - * braces */ - if (isBACKSLASHED_PUNCT(c) || c == '{' || c == '}') - sv_catpvs(sv, "\\"); - sv_catpvn(sv, &string, 1); - } - else if (isMNEMONIC_CNTRL(c)) { - Perl_sv_catpvf(aTHX_ sv, "%s", cntrl_to_mnemonic((U8) c)); - } - else { - Perl_sv_catpvf(aTHX_ sv, "\\x%02X", (U8) c); - } -} - -STATIC void -S_put_range(pTHX_ SV *sv, UV start, const UV end, const bool allow_literals) -{ - /* Appends to 'sv' a displayable version of the range of code points from - * 'start' to 'end'. Mnemonics (like '\r') are used for the few controls - * that have them, when they occur at the beginning or end of the range. - * It uses hex to output the remaining code points, unless 'allow_literals' - * is true, in which case the printable ASCII ones are output as-is (though - * some of these will be escaped by put_code_point()). - * - * NOTE: This is designed only for printing ranges of code points that fit - * inside an ANYOF bitmap. Higher code points are simply suppressed - */ - - const unsigned int min_range_count = 3; - - assert(start <= end); - - PERL_ARGS_ASSERT_PUT_RANGE; - - while (start <= end) { - UV this_end; - const char * format; - - if ( end - start < min_range_count - && (end - start <= 2 || (isPRINT_A(start) && isPRINT_A(end)))) - { - /* Output a range of 1 or 2 chars individually, or longer ranges - * when printable */ - for (; start <= end; start++) { - put_code_point(sv, start); - } - break; - } - - /* If permitted by the input options, and there is a possibility that - * this range contains a printable literal, look to see if there is - * one. */ - if (allow_literals && start <= MAX_PRINT_A) { - - /* If the character at the beginning of the range isn't an ASCII - * printable, effectively split the range into two parts: - * 1) the portion before the first such printable, - * 2) the rest - * and output them separately. */ - if (! isPRINT_A(start)) { - UV temp_end = start + 1; - - /* There is no point looking beyond the final possible - * printable, in MAX_PRINT_A */ - UV max = MIN(end, MAX_PRINT_A); - - while (temp_end <= max && ! isPRINT_A(temp_end)) { - temp_end++; - } - - /* Here, temp_end points to one beyond the first printable if - * found, or to one beyond 'max' if not. If none found, make - * sure that we use the entire range */ - if (temp_end > MAX_PRINT_A) { - temp_end = end + 1; - } - - /* Output the first part of the split range: the part that - * doesn't have printables, with the parameter set to not look - * for literals (otherwise we would infinitely recurse) */ - put_range(sv, start, temp_end - 1, FALSE); - - /* The 2nd part of the range (if any) starts here. */ - start = temp_end; - - /* We do a continue, instead of dropping down, because even if - * the 2nd part is non-empty, it could be so short that we want - * to output it as individual characters, as tested for at the - * top of this loop. */ - continue; - } - - /* Here, 'start' is a printable ASCII. If it is an alphanumeric, - * output a sub-range of just the digits or letters, then process - * the remaining portion as usual. */ - if (isALPHANUMERIC_A(start)) { - UV mask = (isDIGIT_A(start)) - ? _CC_DIGIT - : isUPPER_A(start) - ? _CC_UPPER - : _CC_LOWER; - UV temp_end = start + 1; - - /* Find the end of the sub-range that includes just the - * characters in the same class as the first character in it */ - while (temp_end <= end && _generic_isCC_A(temp_end, mask)) { - temp_end++; - } - temp_end--; - - /* For short ranges, don't duplicate the code above to output - * them; just call recursively */ - if (temp_end - start < min_range_count) { - put_range(sv, start, temp_end, FALSE); - } - else { /* Output as a range */ - put_code_point(sv, start); - sv_catpvs(sv, "-"); - put_code_point(sv, temp_end); - } - start = temp_end + 1; - continue; - } - - /* We output any other printables as individual characters */ - if (isPUNCT_A(start) || isSPACE_A(start)) { - while (start <= end && (isPUNCT_A(start) - || isSPACE_A(start))) - { - put_code_point(sv, start); - start++; - } - continue; - } - } /* End of looking for literals */ - - /* Here is not to output as a literal. Some control characters have - * mnemonic names. Split off any of those at the beginning and end of - * the range to print mnemonically. It isn't possible for many of - * these to be in a row, so this won't overwhelm with output */ - if ( start <= end - && (isMNEMONIC_CNTRL(start) || isMNEMONIC_CNTRL(end))) - { - while (isMNEMONIC_CNTRL(start) && start <= end) { - put_code_point(sv, start); - start++; - } - - /* If this didn't take care of the whole range ... */ - if (start <= end) { - - /* Look backwards from the end to find the final non-mnemonic - * */ - UV temp_end = end; - while (isMNEMONIC_CNTRL(temp_end)) { - temp_end--; - } - - /* And separately output the interior range that doesn't start - * or end with mnemonics */ - put_range(sv, start, temp_end, FALSE); - - /* Then output the mnemonic trailing controls */ - start = temp_end + 1; - while (start <= end) { - put_code_point(sv, start); - start++; - } - break; - } - } - - /* As a final resort, output the range or subrange as hex. */ - - if (start >= NUM_ANYOF_CODE_POINTS) { - this_end = end; - } - else { /* Have to split range at the bitmap boundary */ - this_end = (end < NUM_ANYOF_CODE_POINTS) - ? end - : NUM_ANYOF_CODE_POINTS - 1; - } -#if NUM_ANYOF_CODE_POINTS > 256 - format = (this_end < 256) - ? "\\x%02" UVXf "-\\x%02" UVXf - : "\\x{%04" UVXf "}-\\x{%04" UVXf "}"; -#else - format = "\\x%02" UVXf "-\\x%02" UVXf; -#endif - GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); - Perl_sv_catpvf(aTHX_ sv, format, start, this_end); - GCC_DIAG_RESTORE_STMT; - break; - } -} - -STATIC void -S_put_charclass_bitmap_innards_invlist(pTHX_ SV *sv, SV* invlist) -{ - /* Concatenate onto the PV in 'sv' a displayable form of the inversion list - * 'invlist' */ - - UV start, end; - bool allow_literals = TRUE; - - PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_INVLIST; - - /* Generally, it is more readable if printable characters are output as - * literals, but if a range (nearly) spans all of them, it's best to output - * it as a single range. This code will use a single range if all but 2 - * ASCII printables are in it */ - invlist_iterinit(invlist); - while (invlist_iternext(invlist, &start, &end)) { - - /* If the range starts beyond the final printable, it doesn't have any - * in it */ - if (start > MAX_PRINT_A) { - break; - } - - /* In both ASCII and EBCDIC, a SPACE is the lowest printable. To span - * all but two, the range must start and end no later than 2 from - * either end */ - if (start < ' ' + 2 && end > MAX_PRINT_A - 2) { - if (end > MAX_PRINT_A) { - end = MAX_PRINT_A; - } - if (start < ' ') { - start = ' '; - } - if (end - start >= MAX_PRINT_A - ' ' - 2) { - allow_literals = FALSE; - } - break; - } - } - invlist_iterfinish(invlist); - - /* Here we have figured things out. Output each range */ - invlist_iterinit(invlist); - while (invlist_iternext(invlist, &start, &end)) { - if (start >= NUM_ANYOF_CODE_POINTS) { - break; - } - put_range(sv, start, end, allow_literals); - } - invlist_iterfinish(invlist); - - return; -} - -STATIC SV* -S_put_charclass_bitmap_innards_common(pTHX_ - SV* invlist, /* The bitmap */ - SV* posixes, /* Under /l, things like [:word:], \S */ - SV* only_utf8, /* Under /d, matches iff the target is UTF-8 */ - SV* not_utf8, /* /d, matches iff the target isn't UTF-8 */ - SV* only_utf8_locale, /* Under /l, matches if the locale is UTF-8 */ - const bool invert /* Is the result to be inverted? */ -) -{ - /* Create and return an SV containing a displayable version of the bitmap - * and associated information determined by the input parameters. If the - * output would have been only the inversion indicator '^', NULL is instead - * returned. */ - - SV * output; - - PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_COMMON; - - if (invert) { - output = newSVpvs("^"); - } - else { - output = newSVpvs(""); - } - - /* First, the code points in the bitmap that are unconditionally there */ - put_charclass_bitmap_innards_invlist(output, invlist); - - /* Traditionally, these have been placed after the main code points */ - if (posixes) { - sv_catsv(output, posixes); - } - - if (only_utf8 && _invlist_len(only_utf8)) { - Perl_sv_catpvf(aTHX_ output, "%s{utf8}%s", PL_colors[1], PL_colors[0]); - put_charclass_bitmap_innards_invlist(output, only_utf8); - } - - if (not_utf8 && _invlist_len(not_utf8)) { - Perl_sv_catpvf(aTHX_ output, "%s{not utf8}%s", PL_colors[1], PL_colors[0]); - put_charclass_bitmap_innards_invlist(output, not_utf8); - } - - if (only_utf8_locale && _invlist_len(only_utf8_locale)) { - Perl_sv_catpvf(aTHX_ output, "%s{utf8 locale}%s", PL_colors[1], PL_colors[0]); - put_charclass_bitmap_innards_invlist(output, only_utf8_locale); - - /* This is the only list in this routine that can legally contain code - * points outside the bitmap range. The call just above to - * 'put_charclass_bitmap_innards_invlist' will simply suppress them, so - * output them here. There's about a half-dozen possible, and none in - * contiguous ranges longer than 2 */ - if (invlist_highest(only_utf8_locale) >= NUM_ANYOF_CODE_POINTS) { - UV start, end; - SV* above_bitmap = NULL; - - _invlist_subtract(only_utf8_locale, PL_InBitmap, &above_bitmap); - - invlist_iterinit(above_bitmap); - while (invlist_iternext(above_bitmap, &start, &end)) { - UV i; - - for (i = start; i <= end; i++) { - put_code_point(output, i); - } - } - invlist_iterfinish(above_bitmap); - SvREFCNT_dec_NN(above_bitmap); - } - } - - if (invert && SvCUR(output) == 1) { - return NULL; - } - - return output; -} - -STATIC bool -S_put_charclass_bitmap_innards(pTHX_ SV *sv, - char *bitmap, - SV *nonbitmap_invlist, - SV *only_utf8_locale_invlist, - const regnode * const node, - const U8 flags, - const bool force_as_is_display) -{ - /* Appends to 'sv' a displayable version of the innards of the bracketed - * character class defined by the other arguments: - * 'bitmap' points to the bitmap, or NULL if to ignore that. - * 'nonbitmap_invlist' is an inversion list of the code points that are in - * the bitmap range, but for some reason aren't in the bitmap; NULL if - * none. The reasons for this could be that they require some - * condition such as the target string being or not being in UTF-8 - * (under /d), or because they came from a user-defined property that - * was not resolved at the time of the regex compilation (under /u) - * 'only_utf8_locale_invlist' is an inversion list of the code points that - * are valid only if the runtime locale is a UTF-8 one; NULL if none - * 'node' is the regex pattern ANYOF node. It is needed only when the - * above two parameters are not null, and is passed so that this - * routine can tease apart the various reasons for them. - * 'flags' is the flags field of 'node' - * 'force_as_is_display' is TRUE if this routine should definitely NOT try - * to invert things to see if that leads to a cleaner display. If - * FALSE, this routine is free to use its judgment about doing this. - * - * It returns TRUE if there was actually something output. (It may be that - * the bitmap, etc is empty.) - * - * When called for outputting the bitmap of a non-ANYOF node, just pass the - * bitmap, with the succeeding parameters set to NULL, and the final one to - * FALSE. - */ - - /* In general, it tries to display the 'cleanest' representation of the - * innards, choosing whether to display them inverted or not, regardless of - * whether the class itself is to be inverted. However, there are some - * cases where it can't try inverting, as what actually matches isn't known - * until runtime, and hence the inversion isn't either. */ - - bool inverting_allowed = ! force_as_is_display; - - int i; - STRLEN orig_sv_cur = SvCUR(sv); - - SV* invlist; /* Inversion list we accumulate of code points that - are unconditionally matched */ - SV* only_utf8 = NULL; /* Under /d, list of matches iff the target is - UTF-8 */ - SV* not_utf8 = NULL; /* /d, list of matches iff the target isn't UTF-8 - */ - SV* posixes = NULL; /* Under /l, string of things like [:word:], \D */ - SV* only_utf8_locale = NULL; /* Under /l, list of matches if the locale - is UTF-8 */ - - SV* as_is_display; /* The output string when we take the inputs - literally */ - SV* inverted_display; /* The output string when we invert the inputs */ - - bool invert = cBOOL(flags & ANYOF_INVERT); /* Is the input to be inverted - to match? */ - /* We are biased in favor of displaying things without them being inverted, - * as that is generally easier to understand */ - const int bias = 5; - - PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS; - - /* Start off with whatever code points are passed in. (We clone, so we - * don't change the caller's list) */ - if (nonbitmap_invlist) { - assert(invlist_highest(nonbitmap_invlist) < NUM_ANYOF_CODE_POINTS); - invlist = invlist_clone(nonbitmap_invlist, NULL); - } - else { /* Worst case size is every other code point is matched */ - invlist = _new_invlist(NUM_ANYOF_CODE_POINTS / 2); - } - - if (flags) { - if (OP(node) == ANYOFD) { - - /* This flag indicates that the code points below 0x100 in the - * nonbitmap list are precisely the ones that match only when the - * target is UTF-8 (they should all be non-ASCII). */ - if (flags & ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP) - { - _invlist_intersection(invlist, PL_UpperLatin1, &only_utf8); - _invlist_subtract(invlist, only_utf8, &invlist); - } - - /* And this flag for matching all non-ASCII 0xFF and below */ - if (flags & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER) - { - not_utf8 = invlist_clone(PL_UpperLatin1, NULL); - } - } - else if (OP(node) == ANYOFL || OP(node) == ANYOFPOSIXL) { - - /* If either of these flags are set, what matches isn't - * determinable except during execution, so don't know enough here - * to invert */ - if (flags & (ANYOFL_FOLD|ANYOF_MATCHES_POSIXL)) { - inverting_allowed = FALSE; - } - - /* What the posix classes match also varies at runtime, so these - * will be output symbolically. */ - if (ANYOF_POSIXL_TEST_ANY_SET(node)) { - int i; - - posixes = newSVpvs(""); - for (i = 0; i < ANYOF_POSIXL_MAX; i++) { - if (ANYOF_POSIXL_TEST(node, i)) { - sv_catpv(posixes, anyofs[i]); - } - } - } - } - } - - /* Accumulate the bit map into the unconditional match list */ - if (bitmap) { - for (i = 0; i < NUM_ANYOF_CODE_POINTS; i++) { - if (BITMAP_TEST(bitmap, i)) { - int start = i++; - for (; - i < NUM_ANYOF_CODE_POINTS && BITMAP_TEST(bitmap, i); - i++) - { /* empty */ } - invlist = _add_range_to_invlist(invlist, start, i-1); - } - } - } - - /* Make sure that the conditional match lists don't have anything in them - * that match unconditionally; otherwise the output is quite confusing. - * This could happen if the code that populates these misses some - * duplication. */ - if (only_utf8) { - _invlist_subtract(only_utf8, invlist, &only_utf8); - } - if (not_utf8) { - _invlist_subtract(not_utf8, invlist, ¬_utf8); - } - - if (only_utf8_locale_invlist) { - - /* Since this list is passed in, we have to make a copy before - * modifying it */ - only_utf8_locale = invlist_clone(only_utf8_locale_invlist, NULL); - - _invlist_subtract(only_utf8_locale, invlist, &only_utf8_locale); - - /* And, it can get really weird for us to try outputting an inverted - * form of this list when it has things above the bitmap, so don't even - * try */ - if (invlist_highest(only_utf8_locale) >= NUM_ANYOF_CODE_POINTS) { - inverting_allowed = FALSE; - } - } - - /* Calculate what the output would be if we take the input as-is */ - as_is_display = put_charclass_bitmap_innards_common(invlist, - posixes, - only_utf8, - not_utf8, - only_utf8_locale, - invert); - - /* If have to take the output as-is, just do that */ - if (! inverting_allowed) { - if (as_is_display) { - sv_catsv(sv, as_is_display); - SvREFCNT_dec_NN(as_is_display); - } - } - else { /* But otherwise, create the output again on the inverted input, and - use whichever version is shorter */ - - int inverted_bias, as_is_bias; - - /* We will apply our bias to whichever of the results doesn't have - * the '^' */ - if (invert) { - invert = FALSE; - as_is_bias = bias; - inverted_bias = 0; - } - else { - invert = TRUE; - as_is_bias = 0; - inverted_bias = bias; - } - - /* Now invert each of the lists that contribute to the output, - * excluding from the result things outside the possible range */ - - /* For the unconditional inversion list, we have to add in all the - * conditional code points, so that when inverted, they will be gone - * from it */ - _invlist_union(only_utf8, invlist, &invlist); - _invlist_union(not_utf8, invlist, &invlist); - _invlist_union(only_utf8_locale, invlist, &invlist); - _invlist_invert(invlist); - _invlist_intersection(invlist, PL_InBitmap, &invlist); - - if (only_utf8) { - _invlist_invert(only_utf8); - _invlist_intersection(only_utf8, PL_UpperLatin1, &only_utf8); - } - else if (not_utf8) { - - /* If a code point matches iff the target string is not in UTF-8, - * then complementing the result has it not match iff not in UTF-8, - * which is the same thing as matching iff it is UTF-8. */ - only_utf8 = not_utf8; - not_utf8 = NULL; - } - - if (only_utf8_locale) { - _invlist_invert(only_utf8_locale); - _invlist_intersection(only_utf8_locale, - PL_InBitmap, - &only_utf8_locale); - } - - inverted_display = put_charclass_bitmap_innards_common( - invlist, - posixes, - only_utf8, - not_utf8, - only_utf8_locale, invert); - - /* Use the shortest representation, taking into account our bias - * against showing it inverted */ - if ( inverted_display - && ( ! as_is_display - || ( SvCUR(inverted_display) + inverted_bias - < SvCUR(as_is_display) + as_is_bias))) - { - sv_catsv(sv, inverted_display); - } - else if (as_is_display) { - sv_catsv(sv, as_is_display); - } - - SvREFCNT_dec(as_is_display); - SvREFCNT_dec(inverted_display); - } - - SvREFCNT_dec_NN(invlist); - SvREFCNT_dec(only_utf8); - SvREFCNT_dec(not_utf8); - SvREFCNT_dec(posixes); - SvREFCNT_dec(only_utf8_locale); - - return SvCUR(sv) > orig_sv_cur; -} - -#define CLEAR_OPTSTART \ - if (optstart) STMT_START { \ - DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ \ - " (%" IVdf " nodes)\n", (IV)(node - optstart))); \ - optstart=NULL; \ - } STMT_END - -#define DUMPUNTIL(b,e) \ - CLEAR_OPTSTART; \ - node=dumpuntil(r,start,(b),(e),last,sv,indent+1,depth+1); - -STATIC const regnode * -S_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node, - const regnode *last, const regnode *plast, - SV* sv, I32 indent, U32 depth) -{ - U8 op = PSEUDO; /* Arbitrary non-END op. */ - const regnode *next; - const regnode *optstart= NULL; - - RXi_GET_DECL(r, ri); - DECLARE_AND_GET_RE_DEBUG_FLAGS; - - PERL_ARGS_ASSERT_DUMPUNTIL; - -#ifdef DEBUG_DUMPUNTIL - Perl_re_printf( aTHX_ "--- %d : %d - %d - %d\n", indent, node-start, - last ? last-start : 0, plast ? plast-start : 0); -#endif - - if (plast && plast < last) - last= plast; - - while (PL_regkind[op] != END && (!last || node < last)) { - assert(node); - /* While that wasn't END last time... */ - NODE_ALIGN(node); - op = OP(node); - if (op == CLOSE || op == SRCLOSE || op == WHILEM) - indent--; - next = regnext((regnode *)node); - - /* Where, what. */ - if (OP(node) == OPTIMIZED) { - if (!optstart && RE_DEBUG_FLAG(RE_DEBUG_COMPILE_OPTIMISE)) - optstart = node; - else - goto after_print; - } else - CLEAR_OPTSTART; - - regprop(r, sv, node, NULL, NULL); - Perl_re_printf( aTHX_ "%4" IVdf ":%*s%s", (IV)(node - start), - (int)(2*indent + 1), "", SvPVX_const(sv)); - - if (OP(node) != OPTIMIZED) { - if (next == NULL) /* Next ptr. */ - Perl_re_printf( aTHX_ " (0)"); - else if (PL_regkind[(U8)op] == BRANCH - && PL_regkind[OP(next)] != BRANCH ) - Perl_re_printf( aTHX_ " (FAIL)"); - else - Perl_re_printf( aTHX_ " (%" IVdf ")", (IV)(next - start)); - Perl_re_printf( aTHX_ "\n"); - } - - after_print: - if (PL_regkind[(U8)op] == BRANCHJ) { - assert(next); - { - const regnode *nnode = (OP(next) == LONGJMP - ? regnext((regnode *)next) - : next); - if (last && nnode > last) - nnode = last; - DUMPUNTIL(NEXTOPER(NEXTOPER(node)), nnode); - } - } - else if (PL_regkind[(U8)op] == BRANCH) { - assert(next); - DUMPUNTIL(NEXTOPER(node), next); - } - else if ( PL_regkind[(U8)op] == TRIE ) { - const regnode *this_trie = node; - const char op = OP(node); - const U32 n = ARG(node); - const reg_ac_data * const ac = op>=AHOCORASICK ? - (reg_ac_data *)ri->data->data[n] : - NULL; - const reg_trie_data * const trie = - (reg_trie_data*)ri->data->data[optrie]; -#ifdef DEBUGGING - AV *const trie_words - = MUTABLE_AV(ri->data->data[n + TRIE_WORDS_OFFSET]); -#endif - const regnode *nextbranch= NULL; - I32 word_idx; - SvPVCLEAR(sv); - for (word_idx= 0; word_idx < (I32)trie->wordcount; word_idx++) { - SV ** const elem_ptr = av_fetch(trie_words, word_idx, 0); - - Perl_re_indentf( aTHX_ "%s ", - indent+3, - elem_ptr - ? pv_pretty(sv, SvPV_nolen_const(*elem_ptr), - SvCUR(*elem_ptr), PL_dump_re_max_len, - PL_colors[0], PL_colors[1], - (SvUTF8(*elem_ptr) - ? PERL_PV_ESCAPE_UNI - : 0) - | PERL_PV_PRETTY_ELLIPSES - | PERL_PV_PRETTY_LTGT - ) - : "???" - ); - if (trie->jump) { - U16 dist= trie->jump[word_idx+1]; - Perl_re_printf( aTHX_ "(%" UVuf ")\n", - (UV)((dist ? this_trie + dist : next) - start)); - if (dist) { - if (!nextbranch) - nextbranch= this_trie + trie->jump[0]; - DUMPUNTIL(this_trie + dist, nextbranch); - } - if (nextbranch && PL_regkind[OP(nextbranch)]==BRANCH) - nextbranch= regnext((regnode *)nextbranch); - } else { - Perl_re_printf( aTHX_ "\n"); - } - } - if (last && next > last) - node= last; - else - node= next; - } - else if ( op == CURLY ) { /* "next" might be very big: optimizer */ - DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS, - NEXTOPER(node) + EXTRA_STEP_2ARGS + 1); - } - else if (PL_regkind[(U8)op] == CURLY && op != CURLYX) { - assert(next); - DUMPUNTIL(NEXTOPER(node) + EXTRA_STEP_2ARGS, next); - } - else if ( op == PLUS || op == STAR) { - DUMPUNTIL(NEXTOPER(node), NEXTOPER(node) + 1); - } - else if (PL_regkind[(U8)op] == EXACT || op == ANYOFHs) { - /* Literal string, where present. */ - node += NODE_SZ_STR(node) - 1; - node = NEXTOPER(node); - } - else { - node = NEXTOPER(node); - node += regarglen[(U8)op]; - } - if (op == CURLYX || op == OPEN || op == SROPEN) - indent++; - } - CLEAR_OPTSTART; -#ifdef DEBUG_DUMPUNTIL - Perl_re_printf( aTHX_ "--- %d\n", (int)indent); -#endif - return node; -} - -#endif /* DEBUGGING */ - #ifndef PERL_IN_XSUB_RE # include "uni_keywords.h" @@ -23578,39 +13778,39 @@ Perl_init_uniprops(pTHX) /* Set up the inversion list interpreter-level variables */ - PL_XPosix_ptrs[_CC_ASCII] = _new_invlist_C_array(uni_prop_ptrs[UNI_ASCII]); - PL_XPosix_ptrs[_CC_ALPHANUMERIC] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXALNUM]); - PL_XPosix_ptrs[_CC_ALPHA] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXALPHA]); - PL_XPosix_ptrs[_CC_BLANK] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXBLANK]); - PL_XPosix_ptrs[_CC_CASED] = _new_invlist_C_array(uni_prop_ptrs[UNI_CASED]); - PL_XPosix_ptrs[_CC_CNTRL] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXCNTRL]); - PL_XPosix_ptrs[_CC_DIGIT] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXDIGIT]); - PL_XPosix_ptrs[_CC_GRAPH] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXGRAPH]); - PL_XPosix_ptrs[_CC_LOWER] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXLOWER]); - PL_XPosix_ptrs[_CC_PRINT] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXPRINT]); - PL_XPosix_ptrs[_CC_PUNCT] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXPUNCT]); - PL_XPosix_ptrs[_CC_SPACE] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXSPACE]); - PL_XPosix_ptrs[_CC_UPPER] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXUPPER]); - PL_XPosix_ptrs[_CC_VERTSPACE] = _new_invlist_C_array(uni_prop_ptrs[UNI_VERTSPACE]); - PL_XPosix_ptrs[_CC_WORDCHAR] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXWORD]); - PL_XPosix_ptrs[_CC_XDIGIT] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXXDIGIT]); - - PL_Posix_ptrs[_CC_ASCII] = _new_invlist_C_array(uni_prop_ptrs[UNI_ASCII]); - PL_Posix_ptrs[_CC_ALPHANUMERIC] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXALNUM]); - PL_Posix_ptrs[_CC_ALPHA] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXALPHA]); - PL_Posix_ptrs[_CC_BLANK] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXBLANK]); - PL_Posix_ptrs[_CC_CASED] = PL_Posix_ptrs[_CC_ALPHA]; - PL_Posix_ptrs[_CC_CNTRL] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXCNTRL]); - PL_Posix_ptrs[_CC_DIGIT] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXDIGIT]); - PL_Posix_ptrs[_CC_GRAPH] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXGRAPH]); - PL_Posix_ptrs[_CC_LOWER] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXLOWER]); - PL_Posix_ptrs[_CC_PRINT] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXPRINT]); - PL_Posix_ptrs[_CC_PUNCT] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXPUNCT]); - PL_Posix_ptrs[_CC_SPACE] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXSPACE]); - PL_Posix_ptrs[_CC_UPPER] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXUPPER]); - PL_Posix_ptrs[_CC_VERTSPACE] = NULL; - PL_Posix_ptrs[_CC_WORDCHAR] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXWORD]); - PL_Posix_ptrs[_CC_XDIGIT] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXXDIGIT]); + PL_XPosix_ptrs[CC_ASCII_] = _new_invlist_C_array(uni_prop_ptrs[UNI_ASCII]); + PL_XPosix_ptrs[CC_ALPHANUMERIC_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXALNUM]); + PL_XPosix_ptrs[CC_ALPHA_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXALPHA]); + PL_XPosix_ptrs[CC_BLANK_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXBLANK]); + PL_XPosix_ptrs[CC_CASED_] = _new_invlist_C_array(uni_prop_ptrs[UNI_CASED]); + PL_XPosix_ptrs[CC_CNTRL_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXCNTRL]); + PL_XPosix_ptrs[CC_DIGIT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXDIGIT]); + PL_XPosix_ptrs[CC_GRAPH_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXGRAPH]); + PL_XPosix_ptrs[CC_LOWER_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXLOWER]); + PL_XPosix_ptrs[CC_PRINT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXPRINT]); + PL_XPosix_ptrs[CC_PUNCT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXPUNCT]); + PL_XPosix_ptrs[CC_SPACE_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXSPACE]); + PL_XPosix_ptrs[CC_UPPER_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXUPPER]); + PL_XPosix_ptrs[CC_VERTSPACE_] = _new_invlist_C_array(uni_prop_ptrs[UNI_VERTSPACE]); + PL_XPosix_ptrs[CC_WORDCHAR_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXWORD]); + PL_XPosix_ptrs[CC_XDIGIT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_XPOSIXXDIGIT]); + + PL_Posix_ptrs[CC_ASCII_] = _new_invlist_C_array(uni_prop_ptrs[UNI_ASCII]); + PL_Posix_ptrs[CC_ALPHANUMERIC_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXALNUM]); + PL_Posix_ptrs[CC_ALPHA_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXALPHA]); + PL_Posix_ptrs[CC_BLANK_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXBLANK]); + PL_Posix_ptrs[CC_CASED_] = PL_Posix_ptrs[CC_ALPHA_]; + PL_Posix_ptrs[CC_CNTRL_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXCNTRL]); + PL_Posix_ptrs[CC_DIGIT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXDIGIT]); + PL_Posix_ptrs[CC_GRAPH_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXGRAPH]); + PL_Posix_ptrs[CC_LOWER_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXLOWER]); + PL_Posix_ptrs[CC_PRINT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXPRINT]); + PL_Posix_ptrs[CC_PUNCT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXPUNCT]); + PL_Posix_ptrs[CC_SPACE_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXSPACE]); + PL_Posix_ptrs[CC_UPPER_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXUPPER]); + PL_Posix_ptrs[CC_VERTSPACE_] = NULL; + PL_Posix_ptrs[CC_WORDCHAR_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXWORD]); + PL_Posix_ptrs[CC_XDIGIT_] = _new_invlist_C_array(uni_prop_ptrs[UNI_POSIXXDIGIT]); PL_GCB_invlist = _new_invlist_C_array(_Perl_GCB_invlist); PL_SB_invlist = _new_invlist_C_array(_Perl_SB_invlist); @@ -24377,8 +14577,6 @@ S_parse_uniprop_string(pTHX_ } /* End of parsing through the lhs of the property name (or all of it if no rhs) */ -# define STRLENs(s) (sizeof("" s "") - 1) - /* If there is a single package name 'utf8::', it is ambiguous. It could * be for a user-defined property, or it could be a Unicode property, as * all of them are considered to be for that package. For the purposes of @@ -24415,7 +14613,7 @@ S_parse_uniprop_string(pTHX_ && name[i] != '+' && name[i] != '_' && name[i] != '{' - /* A backslash means the real delimitter is the next character, + /* A backslash means the real delimiter is the next character, * but it must be punctuation */ && (name[i] != '\\' || (i < name_len && isPUNCT_A(name[i+1])))) { @@ -24434,7 +14632,7 @@ S_parse_uniprop_string(pTHX_ const char * const * prop_values; bool escaped = 0; - /* Backslash => delimitter is the character following. We + /* Backslash => delimiter is the character following. We * already checked that it is punctuation */ if (open == '\\') { open = name[i++]; @@ -24683,15 +14881,15 @@ S_parse_uniprop_string(pTHX_ } this_string = newAV(); - av_push(this_string, newSVuv(cp)); + av_push_simple(this_string, newSVuv(cp)); do { cp = valid_utf8_to_uvchr((U8 *) remaining, &character_len); - av_push(this_string, newSVuv(cp)); + av_push_simple(this_string, newSVuv(cp)); remaining += character_len; } while (remaining < SvEND(character)); - av_push(*strings, (SV *) this_string); + av_push_simple(*strings, (SV *) this_string); } return prop_definition; @@ -24900,7 +15098,7 @@ S_parse_uniprop_string(pTHX_ && name[non_pkg_begin+0] == 'I' && (name[non_pkg_begin+1] == 'n' || name[non_pkg_begin+1] == 's')) { - /* Names that start with In have different characterstics than those + /* Names that start with In have different characteristics than those * that start with Is */ if (name[non_pkg_begin+1] == 's') { starts_with_Is = TRUE; @@ -25466,7 +15664,7 @@ S_parse_uniprop_string(pTHX_ if (table_index > MAX_UNI_KEYWORD_INDEX) { Size_t warning_offset = table_index / MAX_UNI_KEYWORD_INDEX; table_index %= MAX_UNI_KEYWORD_INDEX; - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), + Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED__UNICODE_PROPERTY_NAME), "Use of '%.*s' in \\p{} or \\P{} is deprecated because: %s", (int) name_len, name, get_deprecated_property_msg(warning_offset)); @@ -25751,9 +15949,9 @@ S_handle_names_wildcard(pTHX_ const char * so we could match anywhere in that string. We have to rule out * matching a code point line */ char * this_name_start = all_names_start - + RX_OFFS(subpattern_re)->start; + + RX_OFFS_START(subpattern_re,0); char * this_name_end = all_names_start - + RX_OFFS(subpattern_re)->end; + + RX_OFFS_END(subpattern_re,0); char * cp_start; char * cp_end; UV cp = 0; /* Silences some compilers */ @@ -25842,7 +16040,7 @@ S_handle_names_wildcard(pTHX_ const char } is_multi = TRUE; - av_push(this_string, newSVuv(cp)); + av_push_simple(this_string, newSVuv(cp)); } } @@ -25851,7 +16049,7 @@ S_handle_names_wildcard(pTHX_ const char *strings = newAV(); } - av_push(*strings, (SV *) this_string); + av_push_simple(*strings, (SV *) this_string); } else { /* Only a single code point */ *prop_definition = add_cp_to_invlist(*prop_definition, cp); Index: gnu/usr.bin/perl/regcomp.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/regcomp.h,v diff -u -p -a -u -p -r1.20 regcomp.h --- gnu/usr.bin/perl/regcomp.h 15 Feb 2023 01:38:21 -0000 1.20 +++ gnu/usr.bin/perl/regcomp.h 21 Feb 2024 15:47:03 -0000 @@ -10,8 +10,65 @@ #if ! defined(PERL_REGCOMP_H_) && ( defined(PERL_CORE) \ || defined(PERL_EXT_RE_BUILD)) + #define PERL_REGCOMP_H_ +#ifndef RE_PESSIMISTIC_PARENS +/* Define this to 1 if you want to enable a really aggressive and + * inefficient paren cleanup during backtracking which should ensure + * correctness. Doing so should fix any bugs related to backreferences, + * at the cost of saving and restoring paren state far more than we + * necessarily must. + * + * When it is set to 0 we try to optimize away unnecessary save/restore + * operations which could potentially introduce bugs. We should pass our + * test suite with this as 0, but setting it to 1 might fix cases we do + * not currently test for. If setting this to 1 does fix a bug, then + * review the code related to storing and restoring paren state. + * + * See comment for VOLATILE_REF below for more details of a + * related case. + */ +#define RE_PESSIMISTIC_PARENS 0 +#endif + +/* a VOLATILE_REF is a ref which is inside of a capturing group and it + * refers to the capturing group it is inside of or to a following capture + * group which might be affected by what this capture group matches, and + * thus the ref requires additional backtracking support. For example: + * + * "xa=xaaa" =~ /^(xa|=?\1a){2}\z/ + * + * should not match. In older perls the matching process would go like this: + * + * Iter 1: "xa" matches in capture group. + * Iter 2: "xa" does not match, goes to next alternation. + * "=" matches in =? + * Bifurcates here (= might not match) + * "xa" matches via \1 from previous iteration + * "a" matches via "a" at end of second alternation + * # at this point $1 is "=xaa" + * \z does not match -> backtracks. + * Backtracks to Iter 2 "=?" Bifurcation point where we have NOT matched "=" + * "=xaa" matches via \1 (as $1 has not been reset) + * "a" matches via "a" at end of second alternation + * "\z" does match. -> Pattern matches overall. + * + * What should happen and now does happen instead is: + * + * Backtracks to Iter 2 "=?" Bifurcation point where we have NOT matched "=", + * \1 does not match as it is "xa" (as $1 was reset when backtracked) + * and the current character in the string is an "=" + * + * The fact that \1 in this case is marked as a VOLATILE_REF is what ensures + * that we reset the capture buffer properly. + * + * See 59db194299c94c6707095797c3df0e2f67ff82b2 + * and 38508ce8fc3a1bd12a3bb65e9d4ceb9b396a18db + * for more details. + */ +#define VOLATILE_REF 1 + #include "regcharclass.h" /* Convert branch sequences to more efficient trie ops? */ @@ -81,6 +138,7 @@ typedef struct regexp_internal { #define RXi_SET(x,y) (x)->pprivate = (void*)(y) #define RXi_GET(x) ((regexp_internal *)((x)->pprivate)) #define RXi_GET_DECL(r,ri) regexp_internal *ri = RXi_GET(r) +#define RXi_GET_DECL_NULL(r,ri) regexp_internal *ri = (r) ? RXi_GET(r) : NULL /* * Flags stored in regexp->intflags * These are used only internally to the regexp engine @@ -106,6 +164,7 @@ typedef struct regexp_internal { #define PREGf_ANCH_SBOL 0x00000800 #define PREGf_ANCH_GPOS 0x00001000 #define PREGf_RECURSE_SEEN 0x00002000 +#define PREGf_PESSIMIZE_SEEN 0x00004000 #define PREGf_ANCH \ ( PREGf_ANCH_SBOL | PREGf_ANCH_GPOS | PREGf_ANCH_MBOL ) @@ -119,16 +178,36 @@ typedef struct regexp_internal { * change things without care. If you look at regexp.h you will see it * contains this: * + * union regnode_head { + * struct { + * union { + * U8 flags; + * U8 str_len_u8; + * U8 first_byte; + * } u_8; + * U8 type; + * U16 next_off; + * } data; + * U32 data_u32; + * }; + * * struct regnode { - * U8 flags; - * U8 type; - * U16 next_off; + * union regnode_head head; * }; * - * This structure is the base unit of elements in the regexp program. When - * we increment our way through the program we increment by the size of this - * structure, and in all cases where regnode sizing is considered it is in - * units of this structure. + * Which really is a complicated and alignment friendly version of + * + * struct { + * U8 flags; + * U8 type; + * U16 next_off; + * }; + * + * This structure is the base unit of elements in the regexp program. + * When we increment our way through the program we increment by the + * size of this structure (32 bits), and in all cases where regnode + * sizing is considered it is in units of this structure. All regnodes + * have a union regnode_head as their first parameter. * * This implies that no regnode style structure should contain 64 bit * aligned members. Since the base regnode is 32 bits any member might @@ -151,36 +230,40 @@ typedef struct regexp_internal { * we already have support for in the data array. */ +union regnode_arg { + I32 i32; + U32 u32; + struct { + U16 u16a; + U16 u16b; + } hi_lo; +}; + + struct regnode_string { - U8 str_len; - U8 type; - U16 next_off; + union regnode_head head; char string[1]; }; struct regnode_lstring { /* Constructed this way to keep the string aligned. */ - U8 flags; - U8 type; - U16 next_off; - U32 str_len; /* Only 18 bits allowed before would overflow 'next_off' */ + union regnode_head head; + U32 str_len_u32; /* Only 18 bits allowed before would overflow 'next_off' */ char string[1]; }; struct regnode_anyofhs { /* Constructed this way to keep the string aligned. */ - U8 str_len; - U8 type; - U16 next_off; - U32 arg1; /* set by set_ANYOF_arg() */ + union regnode_head head; + union regnode_arg arg1; char string[1]; }; -/* Argument bearing node - workhorse, - arg1 is often for the data field */ +/* Argument bearing node - workhorse, ARG1u() is often used for the data field + * Can store either a signed 32 bit value via ARG1i() or unsigned 32 bit value + * via ARG1u(), or two unsigned 16 bit values via ARG1a() or ARG1b() + */ struct regnode_1 { - U8 flags; - U8 type; - U16 next_off; - U32 arg1; + union regnode_head head; + union regnode_arg arg1; }; /* Node whose argument is 'SV *'. This needs to be used very carefully in @@ -199,31 +282,48 @@ struct regnode_1 { * then use inline functions to copy the data in or out. * */ struct regnode_p { - U8 flags; - U8 type; - U16 next_off; + union regnode_head head; char arg1_sv_ptr_bytes[sizeof(SV *)]; }; -/* Similar to a regnode_1 but with an extra signed argument */ -struct regnode_2L { - U8 flags; - U8 type; - U16 next_off; - U32 arg1; - I32 arg2; +/* "Two Node" - similar to a regnode_1 but with space for an extra 32 + * bit value, or two 16 bit valus. The first fields must match regnode_1. + * Extra field can be accessed as (U32)ARG2u() (I32)ARG2i() or (U16)ARG2a() + * and (U16)ARG2b() */ +struct regnode_2 { + union regnode_head head; + union regnode_arg arg1; + union regnode_arg arg2; }; -/* 'Two field' -- Two 16 bit unsigned args */ -struct regnode_2 { - U8 flags; - U8 type; - U16 next_off; - U16 arg1; - U16 arg2; +/* "Three Node" - similar to a regnode_2 but with space for an additional + * 32 bit value, or two 16 bit values. The first fields must match regnode_2. + * The extra field can be accessed as (U32)ARG3u() (I32)ARG3i() or (U16)ARG3a() + * and (U16)ARG3b(). + * Currently used for the CURLY style regops used to represent quantifers, + * storing the min and of the quantifier via ARG1i() and ARG2i(), along with + * ARG3a() and ARG3b() which are used to store information about the number of + * parens before and inside the quantified expression. */ +struct regnode_3 { + union regnode_head head; + union regnode_arg arg1; + union regnode_arg arg2; + union regnode_arg arg3; }; -#define ANYOF_BITMAP_SIZE (NUM_ANYOF_CODE_POINTS / 8) /* 8 bits/Byte */ +#define REGNODE_BBM_BITMAP_LEN \ + /* 6 info bits requires 64 bits; 5 => 32 */ \ + ((1 << (UTF_CONTINUATION_BYTE_INFO_BITS)) / CHARBITS) + +/* Used for matching any two-byte UTF-8 character whose start byte is known. + * The array is a bitmap capable of representing any possible continuation + * byte. */ +struct regnode_bbm { + union regnode_head head; + U8 bitmap[REGNODE_BBM_BITMAP_LEN]; +}; + +#define ANYOF_BITMAP_SIZE (NUM_ANYOF_CODE_POINTS / CHARBITS) /* Note that these form structs which are supersets of the next smaller one, by * appending fields. Alignment problems can occur if one of those optional @@ -235,22 +335,18 @@ struct regnode_2 { * the code that inserts and deletes regnodes. The basic single-argument * regnode has a U32, which is what reganode() allocates as a unit. Therefore * no field can require stricter alignment than U32. */ - + /* also used by trie */ struct regnode_charclass { - U8 flags; - U8 type; - U16 next_off; - U32 arg1; /* set by set_ANYOF_arg() */ + union regnode_head head; + union regnode_arg arg1; char bitmap[ANYOF_BITMAP_SIZE]; /* only compile-time */ }; /* has runtime (locale) \d, \w, ..., [:posix:] classes */ struct regnode_charclass_posixl { - U8 flags; /* ANYOF_MATCHES_POSIXL bit must go here */ - U8 type; - U16 next_off; - U32 arg1; + union regnode_head head; + union regnode_arg arg1; char bitmap[ANYOF_BITMAP_SIZE]; /* both compile-time ... */ U32 classflags; /* and run-time */ }; @@ -269,10 +365,8 @@ struct regnode_charclass_posixl { * never a next node. */ struct regnode_ssc { - U8 flags; /* ANYOF_MATCHES_POSIXL bit must go here */ - U8 type; - U16 next_off; - U32 arg1; + union regnode_head head; + union regnode_arg arg1; char bitmap[ANYOF_BITMAP_SIZE]; /* both compile-time ... */ U32 classflags; /* ... and run-time */ @@ -289,31 +383,34 @@ struct regnode_ssc { * to 12 regnode units on 32-bit systems, (hence the minimum this can be (if * not 0) is 11 there. Even if things get tightly packed on a 64-bit system, * it still would be more than 1. */ -#define set_ANYOF_SYNTHETIC(n) STMT_START{ OP(n) = ANYOF; \ - NEXT_OFF(n) = 1; \ - } STMT_END -#define is_ANYOF_SYNTHETIC(n) (PL_regkind[OP(n)] == ANYOF && NEXT_OFF(n) == 1) +#define set_ANYOF_SYNTHETIC(n) \ + STMT_START{ \ + OP(n) = ANYOF; \ + NEXT_OFF(n) = 1; \ + } STMT_END + +#define is_ANYOF_SYNTHETIC(n) (REGNODE_TYPE(OP(n)) == ANYOF && NEXT_OFF(n) == 1) /* XXX fix this description. Impose a limit of REG_INFTY on various pattern matching operations to limit stack growth and to avoid "infinite" recursions. */ -/* The default size for REG_INFTY is U16_MAX, which is the same as - USHORT_MAX (see perl.h). Unfortunately U16 isn't necessarily 16 bits - (see handy.h). On the Cray C90, sizeof(short)==4 and hence U16_MAX is - ((1<<32)-1), while on the Cray T90, sizeof(short)==8 and U16_MAX is - ((1<<64)-1). To limit stack growth to reasonable sizes, supply a +/* The default size for REG_INFTY is I32_MAX, which is the same as UINT_MAX + (see perl.h). Unfortunately I32 isn't necessarily 32 bits (see handy.h). + On the Cray C90, or Cray T90, I32_MAX is considerably larger than it + might be elsewhere. To limit stack growth to reasonable sizes, supply a smaller default. --Andy Dougherty 11 June 1998 + --Amended by Yves Orton 15 Jan 2023 */ -#if SHORTSIZE > 2 +#if INTSIZE > 4 # ifndef REG_INFTY -# define REG_INFTY nBIT_UMAX(16) +# define REG_INFTY nBIT_IMAX(32) # endif #endif #ifndef REG_INFTY -# define REG_INFTY U16_MAX +# define REG_INFTY I32_MAX #endif #define ARG_VALUE(arg) (arg) @@ -323,23 +420,48 @@ struct regnode_ssc { #undef ARG1 #undef ARG2 -#define ARG(p) ARG_VALUE(ARG_LOC(p)) +/* convention: each arg is is 32 bits, with the "u" suffix + * being unsigned 32 bits, the "i" suffix being signed 32 bits, + * and the "a" and "b" suffixes being unsigned 16 bit fields. + * + * We provide all 4 macros for each case for consistency, even + * though they arent all used. + */ + +#define ARG1u(p) ARG_VALUE(ARG1u_LOC(p)) +#define ARG1i(p) ARG_VALUE(ARG1i_LOC(p)) +#define ARG1a(p) ARG_VALUE(ARG1a_LOC(p)) +#define ARG1b(p) ARG_VALUE(ARG1b_LOC(p)) + +#define ARG2u(p) ARG_VALUE(ARG2u_LOC(p)) +#define ARG2i(p) ARG_VALUE(ARG2i_LOC(p)) +#define ARG2a(p) ARG_VALUE(ARG2a_LOC(p)) +#define ARG2b(p) ARG_VALUE(ARG2b_LOC(p)) + +#define ARG3u(p) ARG_VALUE(ARG3u_LOC(p)) +#define ARG3i(p) ARG_VALUE(ARG3i_LOC(p)) +#define ARG3a(p) ARG_VALUE(ARG3a_LOC(p)) +#define ARG3b(p) ARG_VALUE(ARG3b_LOC(p)) + #define ARGp(p) ARGp_VALUE_inline(p) -#define ARG1(p) ARG_VALUE(ARG1_LOC(p)) -#define ARG2(p) ARG_VALUE(ARG2_LOC(p)) -#define ARG2L(p) ARG_VALUE(ARG2L_LOC(p)) - -#define ARG_SET(p, val) ARG__SET(ARG_LOC(p), (val)) -#define ARG1_SET(p, val) ARG__SET(ARG1_LOC(p), (val)) -#define ARG2_SET(p, val) ARG__SET(ARG2_LOC(p), (val)) -#define ARG2L_SET(p, val) ARG__SET(ARG2L_LOC(p), (val)) -#define ARGp_SET(p, val) ARGp_SET_inline((p),(val)) -#undef NEXT_OFF -#undef NODE_ALIGN +#define ARG1u_SET(p, val) ARG__SET(ARG1u_LOC(p), (val)) +#define ARG1i_SET(p, val) ARG__SET(ARG1i_LOC(p), (val)) +#define ARG1a_SET(p, val) ARG__SET(ARG1a_LOC(p), (val)) +#define ARG1b_SET(p, val) ARG__SET(ARG1b_LOC(p), (val)) + +#define ARG2u_SET(p, val) ARG__SET(ARG2u_LOC(p), (val)) +#define ARG2i_SET(p, val) ARG__SET(ARG2i_LOC(p), (val)) +#define ARG2a_SET(p, val) ARG__SET(ARG2a_LOC(p), (val)) +#define ARG2b_SET(p, val) ARG__SET(ARG2b_LOC(p), (val)) + +#define ARG3u_SET(p, val) ARG__SET(ARG3u_LOC(p), (val)) +#define ARG3i_SET(p, val) ARG__SET(ARG3i_LOC(p), (val)) +#define ARG3a_SET(p, val) ARG__SET(ARG3a_LOC(p), (val)) +#define ARG3b_SET(p, val) ARG__SET(ARG3b_LOC(p), (val)) + +#define ARGp_SET(p, val) ARGp_SET_inline((p),(val)) -#define NEXT_OFF(p) ((p)->next_off) -#define NODE_ALIGN(node) /* the following define was set to 0xde in 075abff3 * as part of some linting logic. I have set it to 0 * as otherwise in every place where we /might/ set flags @@ -349,23 +471,32 @@ struct regnode_ssc { * is changed from 0 then at the very least make sure * that SBOL for /^/ sets the flags to 0 explicitly. * -- Yves */ -#define NODE_ALIGN_FILL(node) ((node)->flags = 0) +#define NODE_ALIGN(node) #define SIZE_ALIGN NODE_ALIGN #undef OP #undef OPERAND #undef STRING +#undef NEXT_OFF +#undef NODE_ALIGN -#define OP(p) ((p)->type) -#define FLAGS(p) ((p)->flags) /* Caution: Doesn't apply to all \ +#define NEXT_OFF(p) ((p)->head.data.next_off) +#define OP(p) ((p)->head.data.type) +#define STR_LEN_U8(p) ((p)->head.data.u_8.str_len_u8) +#define FIRST_BYTE(p) ((p)->head.data.u_8.first_byte) +#define FLAGS(p) ((p)->head.data.u_8.flags) /* Caution: Doesn't apply to all \ regnode types. For some, it's the \ character set of the regnode */ -#define STR_LENs(p) (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_REQ8) \ - ((struct regnode_string *)p)->str_len) -#define STRINGs(p) (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_REQ8) \ +#define STR_LENs(p) (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_REQ8) \ + STR_LEN_U8((struct regnode_string *)p)) +#define STRINGs(p) (__ASSERT_(OP(p) != LEXACT && OP(p) != LEXACT_REQ8) \ ((struct regnode_string *)p)->string) -#define OPERANDs(p) STRINGs(p) +#define OPERANDs(p) STRINGs(p) + +#define PARNO(p) ARG1u(p) /* APPLIES for OPEN and CLOSE only */ + +#define NODE_ALIGN_FILL(node) (FLAGS(node) = 0) /* Long strings. Currently limited to length 18 bits, which handles a 262000 * byte string. The limiting factor is the 16 bit 'next_off' field, which @@ -379,55 +510,158 @@ struct regnode_ssc { * node to be an ARG2L, using the second 32 bit field for the length, and not * using the flags nor next_off fields at all. One could have an llstring node * and even an lllstring type. */ -#define STR_LENl(p) (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_REQ8) \ - (((struct regnode_lstring *)p)->str_len)) -#define STRINGl(p) (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_REQ8) \ +#define STR_LENl(p) (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_REQ8) \ + (((struct regnode_lstring *)p)->str_len_u32)) +#define STRINGl(p) (__ASSERT_(OP(p) == LEXACT || OP(p) == LEXACT_REQ8) \ (((struct regnode_lstring *)p)->string)) -#define OPERANDl(p) STRINGl(p) +#define OPERANDl(p) STRINGl(p) -#define STR_LEN(p) ((OP(p) == LEXACT || OP(p) == LEXACT_REQ8) \ +#define STR_LEN(p) ((OP(p) == LEXACT || OP(p) == LEXACT_REQ8) \ ? STR_LENl(p) : STR_LENs(p)) -#define STRING(p) ((OP(p) == LEXACT || OP(p) == LEXACT_REQ8) \ +#define STRING(p) ((OP(p) == LEXACT || OP(p) == LEXACT_REQ8) \ ? STRINGl(p) : STRINGs(p)) -#define OPERAND(p) STRING(p) +#define OPERAND(p) STRING(p) /* The number of (smallest) regnode equivalents that a string of length l bytes - * occupies */ + * occupies - Used by the REGNODE_AFTER() macros and functions. */ #define STR_SZ(l) (((l) + sizeof(regnode) - 1) / sizeof(regnode)) -/* The number of (smallest) regnode equivalents that the EXACTISH node 'p' - * occupies */ -#define NODE_SZ_STR(p) (STR_SZ(STR_LEN(p)) + 1 + regarglen[(p)->type]) - #define setSTR_LEN(p,v) \ STMT_START{ \ if (OP(p) == LEXACT || OP(p) == LEXACT_REQ8) \ - ((struct regnode_lstring *)(p))->str_len = (v); \ + ((struct regnode_lstring *)(p))->str_len_u32 = (v); \ else \ - ((struct regnode_string *)(p))->str_len = (v); \ + STR_LEN_U8((struct regnode_string *)(p)) = (v); \ } STMT_END #define ANYOFR_BASE_BITS 20 -#define ANYOFRbase(p) (ARG(p) & nBIT_MASK(ANYOFR_BASE_BITS)) -#define ANYOFRdelta(p) (ARG(p) >> ANYOFR_BASE_BITS) +#define ANYOFRbase(p) (ARG1u(p) & nBIT_MASK(ANYOFR_BASE_BITS)) +#define ANYOFRdelta(p) (ARG1u(p) >> ANYOFR_BASE_BITS) #undef NODE_ALIGN #undef ARG_LOC -#undef NEXTOPER -#undef PREVOPER -#define NODE_ALIGN(node) -#define ARG_LOC(p) (((struct regnode_1 *)p)->arg1) +#define NODE_ALIGN(node) #define ARGp_BYTES_LOC(p) (((struct regnode_p *)p)->arg1_sv_ptr_bytes) -#define ARG1_LOC(p) (((struct regnode_2 *)p)->arg1) -#define ARG2_LOC(p) (((struct regnode_2 *)p)->arg2) -#define ARG2L_LOC(p) (((struct regnode_2L *)p)->arg2) +#define ARG1u_LOC(p) (((struct regnode_1 *)p)->arg1.u32) +#define ARG1i_LOC(p) (((struct regnode_1 *)p)->arg1.i32) +#define ARG1a_LOC(p) (((struct regnode_1 *)p)->arg1.hi_lo.u16a) +#define ARG1b_LOC(p) (((struct regnode_1 *)p)->arg1.hi_lo.u16b) +#define ARG2u_LOC(p) (((struct regnode_2 *)p)->arg2.u32) +#define ARG2i_LOC(p) (((struct regnode_2 *)p)->arg2.i32) +#define ARG2a_LOC(p) (((struct regnode_2 *)p)->arg2.hi_lo.u16a) +#define ARG2b_LOC(p) (((struct regnode_2 *)p)->arg2.hi_lo.u16b) +#define ARG3u_LOC(p) (((struct regnode_3 *)p)->arg3.u32) +#define ARG3i_LOC(p) (((struct regnode_3 *)p)->arg3.i32) +#define ARG3a_LOC(p) (((struct regnode_3 *)p)->arg3.hi_lo.u16a) +#define ARG3b_LOC(p) (((struct regnode_3 *)p)->arg3.hi_lo.u16b) +/* These should no longer be used directly in most cases. Please use + * the REGNODE_AFTER() macros instead. */ #define NODE_STEP_REGNODE 1 /* sizeof(regnode)/sizeof(regnode) */ -#define EXTRA_STEP_2ARGS EXTRA_SIZE(struct regnode_2) -#define NEXTOPER(p) ((p) + NODE_STEP_REGNODE) -#define PREVOPER(p) ((p) - NODE_STEP_REGNODE) +/* Core macros for computing "the regnode after this one". See also + * Perl_regnode_after() in reginline.h + * + * At the struct level regnodes are a linked list, with each node pointing + * at the next (via offsets), usually via the C field in the + * structure. Where there is a need for a node to have two children the + * immediate physical successor of the node in the compiled program is used + * to represent one of them. A good example is the BRANCH construct, + * consider the pattern C + * + * 1: EXACT (3) + * 3: BRANCH (8) + * 4: ANYOFR[ab] (6) + * 6: EXACT (14) + * 8: BRANCH (FAIL) + * 9: ANYOFR[cd] (11) + * 11: EXACT (14) + * 13: TAIL (14) + * 14: EXACT (16) + * 16: END (0) + * + * The numbers in parens at the end of each line show the "next_off" value + * for that regnode in the program. We can see that the C of + * the first BRANCH node (#3) is the second BRANCH node (#8), and indicates + * where execution should go if the regnodes *following* the BRANCH node fail + * to accept the input string. Thus to find the "next BRANCH" we would do + * C and follow the C pointer, and to find + * the "BRANCHes contents" we would use C. + * + * Be aware that C is not guaranteed to give a *useful* + * result once the regex peephole optimizer has run (it will be correct + * however!). By the time code in regexec.c executes various regnodes + * may have been optimized out of the C chain. An example + * can be seen above, node 13 will never be reached during execution + * flow as it has been stitched out of the C chain. Both 6 and + * 11 would have pointed at it during compilation, but it exists only to + * facilitate the construction of the BRANCH structure and is effectively + * a NOOP, and thus the optimizer adjusts the links so it is skipped + * from execution time flow. In regexec.c it is only safe to use + * REGNODE_AFTER() on specific node types. + * + * Conversely during compilation C may not work properly + * as the C may not be known until "later", (such as in the + * case of BRANCH nodes) and thus in regcomp.c the REGNODE_AFTER() macro + * is used very heavily instead. + * + * There are several variants of the REGNODE_AFTER_xxx() macros which + * are intended for use in different situations depending on how + * confident the code is about what type of node it is trying to find a + * successor for. + * + * So for instance if you know you are dealing with a known node type of + * constant size then you should use REGNODE_AFTER_type(n,TYPE). + * + * If you have a regnode pointer and you know you are dealing with a + * regnode type of constant size and you have already extracted its + * opcode use: REGNODE_AFTER_opcode(n,OPCODE). + * + * If you have a regnode and you know it is variable size then you + * you can produce optimized code by using REGNODE_AFTER_varies(n). + * + * If you have a regnode pointer and nothing else use: REGNODE_AFTER(n) + * This is the safest option and wraps C. It + * should produce the correct result regardless of its argument. The + * other options only produce correct results under specific + * constraints. + */ +#define REGNODE_AFTER_PLUS(p,extra) ((p) + NODE_STEP_REGNODE + (extra)) +/* under DEBUGGING we check that all REGNODE_AFTER optimized macros did the + * same thing that Perl_regnode_after() would have done. Note that when + * not compiled under DEBUGGING the assert_() macro is empty. Thus we + * don't have to implement different versions for DEBUGGING and not DEBUGGING, + * and explains why all the macros use REGNODE_AFTER_PLUS_DEBUG() under the + * hood. */ +#define REGNODE_AFTER_PLUS_DEBUG(p,extra) \ + (assert_(check_regnode_after(p,extra)) REGNODE_AFTER_PLUS((p),(extra))) + +/* find the regnode after this p by using the opcode we previously extracted + * with OP(p) */ +#define REGNODE_AFTER_opcode(p,op) REGNODE_AFTER_PLUS_DEBUG((p),REGNODE_ARG_LEN(op)) + +/* find the regnode after this p by using the size of the struct associated with + * the opcode for p. use this when you *know* that p is pointer to a given type*/ +#define REGNODE_AFTER_type(p,t) REGNODE_AFTER_PLUS_DEBUG((p),EXTRA_SIZE(t)) + +/* find the regnode after this p by using OP(p) to find the regnode type of p */ +#define REGNODE_AFTER_varies(p) regnode_after(p,TRUE) + +/* find the regnode after this p by using OP(p) to find the regnode type of p */ +#define REGNODE_AFTER(p) regnode_after(p,FALSE) + + +/* REGNODE_BEFORE() is trickier to deal with in terms of validation, execution. + * All the places that use it assume that p will be one struct regnode large. + * So to validate it we do the math to go backwards and then validate that the + * type of regnode we landed on is actually one regnode large. In theory if + * things go wrong the opcode should be illegal or say the item should be larger + * than it is, etc. */ +#define REGNODE_BEFORE_BASE(p) ((p) - NODE_STEP_REGNODE) +#define REGNODE_BEFORE_BASE_DEBUG(p) \ + (assert_(check_regnode_after(REGNODE_BEFORE_BASE(p),0)) REGNODE_BEFORE_BASE(p)) +#define REGNODE_BEFORE(p) REGNODE_BEFORE_BASE_DEBUG(p) #define FILL_NODE(offset, op) \ STMT_START { \ @@ -439,24 +673,24 @@ struct regnode_ssc { FILL_NODE(offset, op); \ (offset)++; \ } STMT_END -#define FILL_ADVANCE_NODE_ARG(offset, op, arg) \ +#define FILL_ADVANCE_NODE_ARG1u(offset, op, arg) \ STMT_START { \ - ARG_SET(REGNODE_p(offset), arg); \ + ARG1u_SET(REGNODE_p(offset), arg); \ FILL_ADVANCE_NODE(offset, op); \ /* This is used generically for other operations \ * that have a longer argument */ \ - (offset) += regarglen[op]; \ + (offset) += REGNODE_ARG_LEN(op); \ } STMT_END -#define FILL_ADVANCE_NODE_ARGp(offset, op, arg) \ +#define FILL_ADVANCE_NODE_ARGp(offset, op, arg) \ STMT_START { \ - ARGp_SET(REGNODE_p(offset), arg); \ + ARGp_SET(REGNODE_p(offset), arg); \ FILL_ADVANCE_NODE(offset, op); \ - (offset) += regarglen[op]; \ + (offset) += REGNODE_ARG_LEN(op); \ } STMT_END -#define FILL_ADVANCE_NODE_2L_ARG(offset, op, arg1, arg2) \ +#define FILL_ADVANCE_NODE_2ui_ARG(offset, op, arg1, arg2) \ STMT_START { \ - ARG_SET(REGNODE_p(offset), arg1); \ - ARG2L_SET(REGNODE_p(offset), arg2); \ + ARG1u_SET(REGNODE_p(offset), arg1); \ + ARG2i_SET(REGNODE_p(offset), arg2); \ FILL_ADVANCE_NODE(offset, op); \ (offset) += 2; \ } STMT_END @@ -479,104 +713,137 @@ ARGp_SET_inline(struct regnode *node, SV #define REG_MAGIC 0234 -/* An ANYOF node is basically a bitmap with the index being a code point. If - * the bit for that code point is 1, the code point matches; if 0, it doesn't - * match (complemented if inverted). There is an additional mechanism to deal - * with cases where the bitmap is insufficient in and of itself. This #define - * indicates if the bitmap does fully represent what this ANYOF node can match. - * The ARG is set to this special value (since 0, 1, ... are legal, but will - * never reach this high). */ -#define ANYOF_ONLY_HAS_BITMAP ((U32) -1) - -/* When the bitmap isn't completely sufficient for handling the ANYOF node, - * flags (in node->flags of the ANYOF node) get set to indicate this. These - * are perennially in short supply. Beyond several cases where warnings need - * to be raised under certain circumstances, currently, there are six cases - * where the bitmap alone isn't sufficient. We could use six flags to - * represent the 6 cases, but to save flags bits, we play some games. The - * cases are: - * - * 1) The bitmap has a compiled-in very finite size. So something else needs - * to be used to specify if a code point that is too large for the bitmap - * actually matches. The mechanism currently is an inversion - * list. ANYOF_ONLY_HAS_BITMAP, described above, being TRUE indicates - * there are no matches of too-large code points. But if it is FALSE, - * then almost certainly there are matches too large for the bitmap. (The - * other cases, described below, either imply this one or are extremely - * rare in practice.) So we can just assume that a too-large code point - * will need something beyond the bitmap if ANYOF_ONLY_HAS_BITMAP is - * FALSE, instead of having a separate flag for this. - * 2) A subset of item 1) is if all possible code points outside the bitmap - * match. This is a common occurrence when the class is complemented, - * like /[^ij]/. Therefore a bit is reserved to indicate this, - * rather than having an inversion list created, - * ANYOF_MATCHES_ALL_ABOVE_BITMAP. - * 3) Under /d rules, it can happen that code points that are in the upper +/* An ANYOF node matches a single code point based on specified criteria. It + * now comes in several styles, but originally it was just a 256 element + * bitmap, indexed by the code point (which was always just a byte). If the + * corresponding bit for a code point is 1, the code point matches; if 0, it + * doesn't match (complemented if inverted). This worked fine before Unicode + * existed, but making a bit map long enough to accommodate a bit for every + * possible Unicode code point is prohibitively large. Therefore it is made + * much much smaller, and an inversion list is created to handle code points + * not represented by the bitmap. (It is now possible to compile the bitmap to + * a larger size to avoid the slower inversion list lookup for however big the + * bitmap is set to, but this is rarely done). If the bitmap is sufficient to + * specify all possible matches (with nothing outside it matching), no + * inversion list is needed nor included, and the argument to the ANYOF node is + * set to the following: */ + +#define ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE U32_MAX +#define ANYOF_MATCHES_ALL_OUTSIDE_BITMAP(node) \ + (ARG1u(node) == ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE) + +#define ANYOF_MATCHES_NONE_OUTSIDE_BITMAP_VALUE \ + /* Assumes ALL is odd */ (ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE - 1) +#define ANYOF_MATCHES_NONE_OUTSIDE_BITMAP(node) \ + (ARG1u(node) == ANYOF_MATCHES_NONE_OUTSIDE_BITMAP_VALUE) + +#define ANYOF_ONLY_HAS_BITMAP_MASK ANYOF_MATCHES_NONE_OUTSIDE_BITMAP_VALUE +#define ANYOF_ONLY_HAS_BITMAP(node) \ + ((ARG1u(node) & ANYOF_ONLY_HAS_BITMAP_MASK) == ANYOF_ONLY_HAS_BITMAP_MASK) + +#define ANYOF_HAS_AUX(node) (! ANYOF_ONLY_HAS_BITMAP(node)) + +/* There are also ANYOFM nodes, used when the bit patterns representing the + * matched code points happen to be such that they can be checked by ANDing + * with a mask. The regex compiler looks for and silently optimizes to using + * this node type in the few cases where it works out. The eight octal digits + * form such a group. These nodes are simple and fast and no further + * discussion is needed here. + * + * And, there are ANYOFH-ish nodes which match only code points that aren't in + * the bitmap (the H stands for High). These are common for expressing + * Unicode properties concerning non-Latin scripts. They dispense with the + * bitmap altogether and don't need any of the flags discussed below. + * + * And, there are ANYOFR-ish nodes which match within a single range. + * + * When there is a need to specify what matches outside the bitmap, it is done + * by allocating an AV as part of the pattern's compiled form, and the argument + * to the node instead of being ANYOF_ONLY_HAS_BITMAP, points to that AV. + * + * (Actually, that is an oversimplification. The AV is placed into the + * pattern's struct reg_data, and what is stored in the node's argument field + * is its index into that struct. And the inversion list is just one element, + * the zeroth, of the AV.) + * + * There are certain situations where a single inversion list can't handle all + * the complexity. These are dealt with by having extra elements in the AV, by + * specifying flag bits in the ANYOF node, and/or special code. As an example, + * there are instances where what the ANYOF node matches is not completely + * known until runtime. In these cases, a flag is set, and the bitmap has a 1 + * for the code points which are known at compile time to be 1, and a 0 for the + * ones that are known to be 0, or require runtime resolution. Some missing + * information can be found by merely seeing if the pattern is UTF-8 or not; + * other cases require looking at the extra elements in the AV. + * + * There are 5 cases where the bitmap is insufficient. These are specified by + * flags in the node's flags field. We could use five bits to represent the 5 + * cases, but to save flags bits (which are perennially in short supply), we + * play some games. The cases are: + * + * 1) As already mentioned, if some code points outside the bitmap match, and + * some do not, an inversion list is specified to indicate which ones. + * + * 2) Under /d rules, it can happen that code points that are in the upper * latin1 range (\x80-\xFF or their equivalents on EBCDIC platforms) match * only if the runtime target string being matched against is UTF-8. For - * example /[\w[:punct:]]/d. This happens only for posix classes (with a - * couple of exceptions, like \d where it doesn't happen), and all such - * ones also have above-bitmap matches. Thus, 3) implies 1) as well. + * example /[\w[:punct:]]/d. This happens only for certain posix classes, + * and all such ones also have above-bitmap matches. + * * Note that /d rules are no longer encouraged; 'use 5.14' or higher - * deselects them. But a flag is required so that they can be properly - * handled. But it can be a shared flag: see 5) below. - * 4) Also under /d rules, something like /[\Wfoo]/ will match everything in + * deselects them. But they are still supported, and a flag is required + * so that they can be properly handled. But it can be a shared flag: see + * 4) below. + * + * 3) Also under /d rules, something like /[\Wfoo]/ will match everything in * the \x80-\xFF range, unless the string being matched against is UTF-8. * An inversion list could be created for this case, but this is * relatively common, and it turns out that it's all or nothing: if any * one of these code points matches, they all do. Hence a single bit * suffices. We use a shared flag that doesn't take up space by itself: - * ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER. This - * also implies 1), with one exception: [:^cntrl:]. - * 5) A user-defined \p{} property may not have been defined by the time the + * ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared. This also means there + * is an inversion list for the things that don't fit into the bitmap. + * + * 4) A user-defined \p{} property may not have been defined by the time the * regex is compiled. In this case, we don't know until runtime what it * will match, so we have to assume it could match anything, including * code points that ordinarily would be in the bitmap. A flag bit is - * necessary to indicate this, though it can be shared with the item 3) - * flag, as that only occurs under /d, and this only occurs under non-d. - * This case is quite uncommon in the field, and the /(?[ ...])/ construct - * is a better way to accomplish what this feature does. This case also - * implies 1). - * ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP - * is the shared flag. - * 6) /[foo]/il may have folds that are only valid if the runtime locale is a - * UTF-8 one. These are quite rare, so it would be good to avoid the - * expense of looking for them. But /l matching is slow anyway, and we've - * traditionally not worried too much about its performance. And this - * condition requires the ANYOFL_FOLD flag to be set, so testing for - * that flag would be sufficient to rule out most cases of this. So it is - * unclear if this should have a flag or not. But, this flag can be - * shared with another, so it doesn't occupy extra space. - * - * At the moment, there is one spare bit, but this could be increased by + * necessary to indicate this, though we can use the + * ANYOF_HAS_EXTRA_RUNTIME_MATCHES flag, along with the node not being + * ANYOFD. The information required to construct the property is stored + * in the AV pointed to by the node's argument. This case is quite + * uncommon in the field, and the /(?[...])/ construct is a better way to + * accomplish what this feature does. + * + * 5) /[foo]/il may have folds that are only valid if the runtime locale is a + * UTF-8 one. The ANYOF_HAS_EXTRA_RUNTIME_MATCHES flag can also be used + * for these. The list is stored in a different element of the AV, so its + * existence differentiates this case from that of 4), along with the node + * being ANYOFL, with the ANYOFL_FOLD flag being set. There are a few + * additional folds valid only if the UTF-8 locale is a Turkic one which + * is tested for explicitly. + * + * Note that the user-defined property flag and the /il flag can affect whether + * an ASCII character matches in the bitmap or not. + * + * And this still isn't the end of the story. In some cases, warnings are + * supposed to be raised when matching certain categories of code points in the + * target string. Flags are set to indicate this. This adds up to a bunch of + * flags required, and we only have 8 available. That is why we share some. + * At the moment, there are two spare flag bits, but this could be increased by * various tricks: * - * If just one more bit is needed, as of this writing it seems to khw that the - * best choice would be to make ANYOF_MATCHES_ALL_ABOVE_BITMAP not a flag, but - * something like - * - * #define ANYOF_MATCHES_ALL_ABOVE_BITMAP ((U32) -2) - * - * and access it through the ARG like ANYOF_ONLY_HAS_BITMAP is. This flag is - * used by all ANYOF node types, and it could be used to avoid calling the - * handler function, as the macro REGINCLASS in regexec.c does now for other - * cases. - * - * Another possibility is based on the fact that ANYOF_MATCHES_POSIXL is - * redundant with the node type ANYOFPOSIXL. That flag could be removed, but - * at the expense of extra code in regexec.c. The flag has been retained - * because it allows us to see if we need to call reginclass, or just use the - * bitmap in one test. + * ANYOF_MATCHES_POSIXL is redundant with the node type ANYOFPOSIXL. That flag + * could be removed, but at the expense of having to write extra code, which + * would take up space, and writing this turns out to be not hard, but not + * trivial. * * If this is done, an extension would be to make all ANYOFL nodes contain the - * extra 32 bits that ANYOFPOSIXL ones do. The posix flags only occupy 30 - * bits, so the ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD flags - * and ANYOFL_FOLD could be moved to that extra space, but it would mean extra - * instructions, as there are currently places in the code that assume those - * two bits are zero. - * - * All told, 5 bits could be available for other uses if all of the above were - * done. + * extra 32 bits that ANYOFPOSIXL ones do, doubling each instance's size. The + * posix flags only occupy 30 bits, so the ANYOFL_FOLD and + * ANYOFL_UTF8_LOCALE_REQD bits could be moved to that extra space, but it + * would also mean extra instructions, as there are currently places in the + * code that assume those two bits are zero. * * Some flags are not used in synthetic start class (SSC) nodes, so could be * shared should new flags be needed for SSCs, like SSC_MATCHES_EMPTY_STRING @@ -602,48 +869,39 @@ ARGp_SET_inline(struct regnode *node, SV * then. Only set under /l; never in an SSC */ #define ANYOFL_FOLD 0x04 -/* Shared bit set only with ANYOFL and SSC nodes: - * If ANYOFL_FOLD is set, this flag indicates there are potential matches - * valid only if the locale is a UTF-8 one. - * If ANYOFL_FOLD is NOT set, this flag means to warn if the runtime locale - * isn't a UTF-8 one (and the generated node assumes a UTF-8 locale). - * None of INVERT, POSIXL, - * ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP - * can be set. */ -#define ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD 0x08 - -/* Convenience macros for teasing apart the meanings when reading the above bit - * */ -#define ANYOFL_SOME_FOLDS_ONLY_IN_UTF8_LOCALE(flags) \ - ((flags & ( ANYOFL_FOLD /* Both bits are set */ \ - |ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD)) \ - == ( ANYOFL_FOLD \ - |ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD)) - -#define ANYOFL_UTF8_LOCALE_REQD(flags) \ - ((flags & ( ANYOFL_FOLD /* Only REQD bit is set */ \ - |ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD)) \ - == ANYOFL_SHARED_UTF8_LOCALE_fold_HAS_MATCHES_nonfold_REQD) +/* Warn if the runtime locale isn't a UTF-8 one (and the generated node assumes + * a UTF-8 locale. */ +#define ANYOFL_UTF8_LOCALE_REQD 0x08 /* Spare: Be sure to change ANYOF_FLAGS_ALL if this gets used 0x10 */ -/* If set, the node matches every code point NUM_ANYOF_CODE_POINTS and above. - * Can be in an SSC */ -#define ANYOF_MATCHES_ALL_ABOVE_BITMAP 0x20 +/* Spare: Be sure to change ANYOF_FLAGS_ALL if this gets used 0x20 */ -/* Shared bit: - * Under /d it means the ANYOFD node matches more things if the target - * string is encoded in UTF-8; any such things will be non-ASCII, - * characters that are < 256, and can be accessed via the inversion - * list. - * When not under /d, it means the ANYOF node contains a user-defined - * property that wasn't yet defined at the time the regex was compiled, - * and so must be looked up at runtime, by creating an inversion list. - * (These uses are mutually exclusive because a user-defined property is - * specified by \p{}, and \p{} implies /u which deselects /d). The long macro - * name is to make sure that you are cautioned about its shared nature. Only - * the non-/d meaning can be in an SSC */ -#define ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP 0x40 +/* Shared bit that indicates that there are potential additional matches stored + * outside the bitmap, as pointed to by the AV given by the node's argument. + * The node type is used at runtime (in conjunction with this flag and other + * information available then) to decide if the flag should be acted upon. + * This extra information is needed because of at least one of the following + * three reasons. + * Under /d and the matched string is in UTF-8, it means the ANYOFD node + * matches more things than in the bitmap. Those things will be any + * code point too high for the bitmap, but crucially, any non-ASCII + * characters that match iff when using Unicode rules. These all are + * < 256. + * + * Under /l and ANYOFL_FOLD is set, this flag may indicate there are + * potential matches valid only if the locale is a UTF-8 one. If so, + * a list of them is stored in the AV. + * + * For any non-ANYOFD node, there may be a user-defined property that + * wasn't yet defined at the time the regex was compiled, and so must + * be looked up at runtime, The information required to do so will + * also be in the AV. + * + * Note that an ANYOFL node may contain both a user-defined property, and + * folds not always valid. The important thing is that there is an AV to + * look at. */ +#define ANYOF_HAS_EXTRA_RUNTIME_MATCHES 0x40 /* Shared bit: * Under /d it means the ANYOFD node matches all non-ASCII Latin1 @@ -652,13 +910,16 @@ ARGp_SET_inline(struct regnode *node, SV * matching against an above-Unicode code point. * (These uses are mutually exclusive because the warning requires a \p{}, and * \p{} implies /u which deselects /d). An SSC node only has this bit set if - * what is meant is the warning. The long macro name is to make sure that you - * are cautioned about its shared nature */ -#define ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER 0x80 - -#define ANYOF_FLAGS_ALL ((U8) ~0x10) - -#define ANYOF_LOCALE_FLAGS (ANYOFL_FOLD | ANYOF_MATCHES_POSIXL) + * what is meant is the warning. The names are to make sure that you are + * cautioned about its shared nature */ +#define ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared 0x80 +#define ANYOF_WARN_SUPER__shared 0x80 + +#define ANYOF_FLAGS_ALL ((U8) ~(0x10|0x20)) + +#define ANYOF_LOCALE_FLAGS ( ANYOFL_FOLD \ + | ANYOF_MATCHES_POSIXL \ + | ANYOFL_UTF8_LOCALE_REQD) /* These are the flags that apply to both regular ANYOF nodes and synthetic * start class nodes during construction of the SSC. During finalization of @@ -669,48 +930,48 @@ ARGp_SET_inline(struct regnode *node, SV /* Should be synchronized with a table in regprop() */ /* 2n should be the normal one, paired with its complement at 2n+1 */ -#define ANYOF_ALPHA ((_CC_ALPHA) * 2) +#define ANYOF_ALPHA ((CC_ALPHA_) * 2) #define ANYOF_NALPHA ((ANYOF_ALPHA) + 1) -#define ANYOF_ALPHANUMERIC ((_CC_ALPHANUMERIC) * 2) /* [[:alnum:]] isalnum(3), utf8::IsAlnum */ +#define ANYOF_ALPHANUMERIC ((CC_ALPHANUMERIC_) * 2) /* [[:alnum:]] isalnum(3), utf8::IsAlnum */ #define ANYOF_NALPHANUMERIC ((ANYOF_ALPHANUMERIC) + 1) -#define ANYOF_ASCII ((_CC_ASCII) * 2) +#define ANYOF_ASCII ((CC_ASCII_) * 2) #define ANYOF_NASCII ((ANYOF_ASCII) + 1) -#define ANYOF_BLANK ((_CC_BLANK) * 2) /* GNU extension: space and tab: non-vertical space */ +#define ANYOF_BLANK ((CC_BLANK_) * 2) /* GNU extension: space and tab: non-vertical space */ #define ANYOF_NBLANK ((ANYOF_BLANK) + 1) -#define ANYOF_CASED ((_CC_CASED) * 2) /* Pseudo class for [:lower:] or +#define ANYOF_CASED ((CC_CASED_) * 2) /* Pseudo class for [:lower:] or [:upper:] under /i */ #define ANYOF_NCASED ((ANYOF_CASED) + 1) -#define ANYOF_CNTRL ((_CC_CNTRL) * 2) +#define ANYOF_CNTRL ((CC_CNTRL_) * 2) #define ANYOF_NCNTRL ((ANYOF_CNTRL) + 1) -#define ANYOF_DIGIT ((_CC_DIGIT) * 2) /* \d */ +#define ANYOF_DIGIT ((CC_DIGIT_) * 2) /* \d */ #define ANYOF_NDIGIT ((ANYOF_DIGIT) + 1) -#define ANYOF_GRAPH ((_CC_GRAPH) * 2) +#define ANYOF_GRAPH ((CC_GRAPH_) * 2) #define ANYOF_NGRAPH ((ANYOF_GRAPH) + 1) -#define ANYOF_LOWER ((_CC_LOWER) * 2) +#define ANYOF_LOWER ((CC_LOWER_) * 2) #define ANYOF_NLOWER ((ANYOF_LOWER) + 1) -#define ANYOF_PRINT ((_CC_PRINT) * 2) +#define ANYOF_PRINT ((CC_PRINT_) * 2) #define ANYOF_NPRINT ((ANYOF_PRINT) + 1) -#define ANYOF_PUNCT ((_CC_PUNCT) * 2) +#define ANYOF_PUNCT ((CC_PUNCT_) * 2) #define ANYOF_NPUNCT ((ANYOF_PUNCT) + 1) -#define ANYOF_SPACE ((_CC_SPACE) * 2) /* \s */ +#define ANYOF_SPACE ((CC_SPACE_) * 2) /* \s */ #define ANYOF_NSPACE ((ANYOF_SPACE) + 1) -#define ANYOF_UPPER ((_CC_UPPER) * 2) +#define ANYOF_UPPER ((CC_UPPER_) * 2) #define ANYOF_NUPPER ((ANYOF_UPPER) + 1) -#define ANYOF_WORDCHAR ((_CC_WORDCHAR) * 2) /* \w, PL_utf8_alnum, utf8::IsWord, ALNUM */ +#define ANYOF_WORDCHAR ((CC_WORDCHAR_) * 2) /* \w, PL_utf8_alnum, utf8::IsWord, ALNUM */ #define ANYOF_NWORDCHAR ((ANYOF_WORDCHAR) + 1) -#define ANYOF_XDIGIT ((_CC_XDIGIT) * 2) +#define ANYOF_XDIGIT ((CC_XDIGIT_) * 2) #define ANYOF_NXDIGIT ((ANYOF_XDIGIT) + 1) /* pseudo classes below this, not stored in the class bitmap, but used as flags during compilation of char classes */ -#define ANYOF_VERTWS ((_CC_VERTSPACE) * 2) +#define ANYOF_VERTWS ((CC_VERTSPACE_) * 2) #define ANYOF_NVERTWS ((ANYOF_VERTWS)+1) /* It is best if this is the last one, as all above it are stored as bits in a * bitmap, and it isn't part of that bitmap */ -#if _CC_VERTSPACE != _HIGHEST_REGCOMP_DOT_H_SYNC -# error Problem with handy.h _HIGHEST_REGCOMP_DOT_H_SYNC #define +#if CC_VERTSPACE_ != HIGHEST_REGCOMP_DOT_H_SYNC_ +# error Problem with handy.h HIGHEST_REGCOMP_DOT_H_SYNC_ #define #endif #define ANYOF_POSIXL_MAX (ANYOF_VERTWS) /* So upper loop limit is written: @@ -720,7 +981,7 @@ ARGp_SET_inline(struct regnode *node, SV #define ANYOF_MAX ANYOF_POSIXL_MAX #if (ANYOF_POSIXL_MAX > 32) /* Must fit in 32-bit word */ -# error Problem with handy.h _CC_foo #defines +# error Problem with handy.h CC_foo_ #defines #endif #define ANYOF_HORIZWS ((ANYOF_POSIXL_MAX)+2) /* = (ANYOF_NVERTWS + 1) */ @@ -740,9 +1001,13 @@ ARGp_SET_inline(struct regnode *node, SV /* Utility macros for the bitmap and classes of ANYOF */ -#define ANYOF_FLAGS(p) ((p)->flags) +#define BITMAP_BYTE(p, c) (( (U8*) (p)) [ ( ( (UV) (c)) >> 3) ] ) +#define BITMAP_BIT(c) (1U << ((c) & 7)) +#define BITMAP_TEST(p, c) (BITMAP_BYTE(p, c) & BITMAP_BIT((U8)(c))) + +#define ANYOF_FLAGS(p) (FLAGS(p)) -#define ANYOF_BIT(c) (1U << ((c) & 7)) +#define ANYOF_BIT(c) BITMAP_BIT(c) #define ANYOF_POSIXL_BITMAP(p) (((regnode_charclass_posixl*) (p))->classflags) @@ -794,7 +1059,7 @@ ARGp_SET_inline(struct regnode *node, SV #define ANYOF_BITMAP_BYTE(p, c) BITMAP_BYTE(ANYOF_BITMAP(p), c) #define ANYOF_BITMAP_SET(p, c) (ANYOF_BITMAP_BYTE(p, c) |= ANYOF_BIT(c)) #define ANYOF_BITMAP_CLEAR(p,c) (ANYOF_BITMAP_BYTE(p, c) &= ~ANYOF_BIT(c)) -#define ANYOF_BITMAP_TEST(p, c) cBOOL(ANYOF_BITMAP_BYTE(p, c) & ANYOF_BIT(c)) +#define ANYOF_BITMAP_TEST(p, c) cBOOL(ANYOF_BITMAP_BYTE(p, c) & ANYOF_BIT(c)) #define ANYOF_BITMAP_SETALL(p) \ memset (ANYOF_BITMAP(p), 255, ANYOF_BITMAP_SIZE) @@ -828,6 +1093,7 @@ ARGp_SET_inline(struct regnode *node, SV #define REG_UNFOLDED_MULTI_SEEN 0x00000400 /* spare */ #define REG_UNBOUNDED_QUANTIFIER_SEEN 0x00001000 +#define REG_PESSIMIZE_SEEN 0x00002000 START_EXTERN_C @@ -976,6 +1242,11 @@ struct _reg_trie_data { char *bitmap; /* stclass bitmap */ U16 *jump; /* optional 1 indexed array of offsets before tail for the node following a given word. */ + U16 *j_before_paren; /* optional 1 indexed array of parno reset data + for the given jump. */ + U16 *j_after_paren; /* optional 1 indexed array of parno reset data + for the given jump. */ + reg_trie_wordinfo *wordinfo; /* array of info per word */ U16 uniquecharcount; /* unique chars in trie (width of trans table) */ U32 startstate; /* initial state - used for common prefix optimisation */ @@ -985,6 +1256,8 @@ struct _reg_trie_data { U32 statecount; /* Build only - number of states in the states array (including the unused zero state) */ U32 wordcount; /* Build only */ + U16 before_paren; + U16 after_paren; #ifdef DEBUGGING STRLEN charcount; /* Build only */ #endif @@ -1026,10 +1299,6 @@ typedef struct _reg_ac_data reg_ac_data; #define IS_ANYOF_TRIE(op) ((op)==TRIEC || (op)==AHOCORASICKC) #define IS_TRIE_AC(op) ((op)>=AHOCORASICK) - -#define BITMAP_BYTE(p, c) (( (U8*) p) [ ( ( (UV) (c)) >> 3) ] ) -#define BITMAP_TEST(p, c) (BITMAP_BYTE(p, c) & ANYOF_BIT((U8)c)) - /* these defines assume uniquecharcount is the correct variable, and state may be evaluated twice */ #define TRIE_NODENUM(state) (((state)-1)/(trie->uniquecharcount)+1) #define SAFE_TRIE_NODENUM(state) ((state) ? (((state)-1)/(trie->uniquecharcount)+1) : (state)) @@ -1184,7 +1453,7 @@ re.pm, especially to the documentation. /* get_sv() can return NULL during global destruction. */ \ re_debug_flags_sv = PL_curcop ? get_sv(RE_DEBUG_FLAGS, GV_ADD) : NULL; \ if (re_debug_flags_sv) { \ - if (!SvIOK(re_debug_flags_sv)) /* If doesnt exist set to default */\ + if (!SvIOK(re_debug_flags_sv)) /* If doesn't exist set to default */\ sv_setuv(re_debug_flags_sv, \ /* These defaults should be kept in sync with re.pm */ \ RE_DEBUG_COMPILE_DUMP | RE_DEBUG_EXECUTE_MASK ); \ @@ -1234,7 +1503,7 @@ re.pm, especially to the documentation. #define FIRST_NON_ASCII_DECIMAL_DIGIT 0x660 /* ARABIC_INDIC_DIGIT_ZERO */ typedef enum { - TRADITIONAL_BOUND = _CC_WORDCHAR, + TRADITIONAL_BOUND = CC_WORDCHAR_, GCB_BOUND, LB_BOUND, SB_BOUND, @@ -1265,6 +1534,27 @@ typedef enum { #define HIGHEST_ANYOF_HRx_BYTE(b) \ (LOWEST_ANYOF_HRx_BYTE(b) \ + ((MAX_ANYOF_HRx_BYTE - LOWEST_ANYOF_HRx_BYTE(b)) >> ((b) & 3))) + +#if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION) +# define GET_REGCLASS_AUX_DATA(a,b,c,d,e,f) get_regclass_aux_data(a,b,c,d,e,f) +#else +# define GET_REGCLASS_AUX_DATA(a,b,c,d,e,f) get_re_gclass_aux_data(a,b,c,d,e,f) +#endif + +#define REGNODE_TYPE(node) (PL_regnode_info[(node)].type) +#define REGNODE_OFF_BY_ARG(node) (PL_regnode_info[(node)].off_by_arg) +#define REGNODE_ARG_LEN(node) (PL_regnode_info[(node)].arg_len) +#define REGNODE_ARG_LEN_VARIES(node) (PL_regnode_info[(node)].arg_len_varies) +#define REGNODE_NAME(node) (PL_regnode_name[(node)]) + +#if defined(PERL_IN_REGEX_ENGINE) +#include "reginline.h" +#endif + +#define EVAL_OPTIMISTIC_FLAG 128 +#define EVAL_FLAGS_MASK (EVAL_OPTIMISTIC_FLAG-1) + + #endif /* PERL_REGCOMP_H_ */ Index: gnu/usr.bin/perl/regcomp.sym =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/regcomp.sym,v diff -u -p -a -u -p -r1.6 regcomp.sym --- gnu/usr.bin/perl/regcomp.sym 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/regcomp.sym 21 Feb 2024 15:47:03 -0000 @@ -89,13 +89,28 @@ ANYOFL ANYOF, sv charclass S ANYOFPOSIXL ANYOF, sv charclass_posixl S ; Like ANYOFL, but matches [[:posix:]] classes # Must be sequential -ANYOFH ANYOF, sv 1 S ; Like ANYOF, but only has "High" matches, none in the bitmap; the flags field contains the lowest matchable UTF-8 start byte -ANYOFHb ANYOF, sv 1 S ; Like ANYOFH, but all matches share the same UTF-8 start byte, given in the flags field -ANYOFHr ANYOF, sv 1 S ; Like ANYOFH, but the flags field contains packed bounds for all matchable UTF-8 start bytes. -ANYOFHs ANYOF, sv 1 S ; Like ANYOFHb, but has a string field that gives the leading matchable UTF-8 bytes; flags field is len +ANYOFH ANYOFH, sv 1 S ; Like ANYOF, but only has "High" matches, none in the bitmap; the flags field contains the lowest matchable UTF-8 start byte +ANYOFHb ANYOFH, sv 1 S ; Like ANYOFH, but all matches share the same UTF-8 start byte, given in the flags field +ANYOFHr ANYOFH, sv 1 S ; Like ANYOFH, but the flags field contains packed bounds for all matchable UTF-8 start bytes. +ANYOFHs ANYOFH, sv:str 1 S ; Like ANYOFHb, but has a string field that gives the leading matchable UTF-8 bytes; flags field is len ANYOFR ANYOFR, packed 1 S ; Matches any character in the range given by its packed args: upper 12 bits is the max delta from the base lower 20; the flags field contains the lowest matchable UTF-8 start byte ANYOFRb ANYOFR, packed 1 S ; Like ANYOFR, but all matches share the same UTF-8 start byte, given in the flags field -# There is no ANYOFRr because khw doesn't think there are likely to be real-world cases where such a large range is used. +# There is no ANYOFRr because khw doesn't think there are likely to be +# real-world cases where such a large range is used. +# +# And khw doesn't believe an ANYOFRs (which would behave like ANYOFHs) is +# actually worth it. On two-byte UTF-8, the first byte alone is all we need, +# and ANYOFR already does that. And we don't consider non-Unicode code points +# or EBCDIC for performance decisions. If we had it, we would be comparing the +# strings, and if they are equal convert to UV and then test to see if it is in +# the range. The fast DFA we now use to do the conversion is slower than +# comparing the strings, but not by much, and negligible in 2 or 3 byte +# operations. (We don't have to compare the final byte as it has to be +# different or else this wouldn't be a range.) So we might as well displense +# with the comparisons that ANYOFRs would do, and go directly to do the +# conversion . + +ANYOFHbbm ANYOFHbbm none bbm S ; Like ANYOFHb, but only for 2-byte UTF-8 characters; uses a bitmap to match the continuation byte ANYOFM ANYOFM, byte 1 S ; Like ANYOF, but matches an invariant byte as determined by the mask and arg NANYOFM ANYOFM, byte 1 S ; complement of ANYOFM @@ -125,7 +140,7 @@ CLUMP CLUMP, no 0 V ; Matc #* pointer of each individual branch points; each branch #* starts with the operand node of a BRANCH node. #* -BRANCH BRANCH, node 0 V ; Match this alternative, or the next... +BRANCH BRANCH, node 1 V ; Match this alternative, or the next... #*Literals # NOTE: the relative ordering of these types is important do not change it @@ -199,13 +214,13 @@ TAIL NOTHING, no ; Matc #* (one character per match) are implemented with STAR #* and PLUS for speed and to minimize recursive plunges. #* -STAR STAR, node 0 V ; Match this (simple) thing 0 or more times. -PLUS PLUS, node 0 V ; Match this (simple) thing 1 or more times. +STAR STAR, node 0 V ; Match this (simple) thing 0 or more times: /A{0,}B/ where A is width 1 char +PLUS PLUS, node 0 V ; Match this (simple) thing 1 or more times: /A{1,}B/ where A is width 1 char -CURLY CURLY, sv 2 V ; Match this simple thing {n,m} times. -CURLYN CURLY, no 2 V ; Capture next-after-this simple thing -CURLYM CURLY, no 2 V ; Capture this medium-complex thing {n,m} times. -CURLYX CURLY, sv 2 V ; Match this complex thing {n,m} times. +CURLY CURLY, sv 3 V ; Match this (simple) thing {n,m} times: /A{m,n}B/ where A is width 1 char +CURLYN CURLY, no 3 V ; Capture next-after-this simple thing: /(A){m,n}B/ where A is width 1 char +CURLYM CURLY, no 3 V ; Capture this medium-complex thing {n,m} times: /(A){m,n}B/ where A is fixed-length +CURLYX CURLY, sv 3 V ; Match/Capture this complex thing {n,m} times. #*This terminator creates a loop structure for CURLYX WHILEM WHILEM, no 0 V ; Do curly processing and see if rest matches. @@ -218,26 +233,26 @@ CLOSE CLOSE, num 1 ; Clos SROPEN SROPEN, none ; Same as OPEN, but for script run SRCLOSE SRCLOSE, none ; Close preceding SROPEN -REF REF, num 1 V ; Match some already matched string -REFF REF, num 1 V ; Match already matched string, using /di rules. -REFFL REF, num 1 V ; Match already matched string, using /li rules. +REF REF, num 2 V ; Match some already matched string +REFF REF, num 2 V ; Match already matched string, using /di rules. +REFFL REF, num 2 V ; Match already matched string, using /li rules. # N?REFF[AU] could have been implemented using the FLAGS field of the # regnode, but by having a separate node type, we can use the existing switch # statement to avoid some tests -REFFU REF, num 1 V ; Match already matched string, usng /ui. -REFFA REF, num 1 V ; Match already matched string, using /aai rules. +REFFU REF, num 2 V ; Match already matched string, usng /ui. +REFFA REF, num 2 V ; Match already matched string, using /aai rules. #*Named references. Code in regcomp.c assumes that these all are after #*the numbered references -REFN REF, no-sv 1 V ; Match some already matched string -REFFN REF, no-sv 1 V ; Match already matched string, using /di rules. -REFFLN REF, no-sv 1 V ; Match already matched string, using /li rules. -REFFUN REF, num 1 V ; Match already matched string, using /ui rules. -REFFAN REF, num 1 V ; Match already matched string, using /aai rules. +REFN REF, no-sv 2 V ; Match some already matched string +REFFN REF, no-sv 2 V ; Match already matched string, using /di rules. +REFFLN REF, no-sv 2 V ; Match already matched string, using /li rules. +REFFUN REF, num 2 V ; Match already matched string, using /ui rules. +REFFAN REF, num 2 V ; Match already matched string, using /aai rules. #*Support for long RE LONGJMP LONGJMP, off 1 . 1 ; Jump far away. -BRANCHJ BRANCHJ, off 1 V 1 ; BRANCH with long offset. +BRANCHJ BRANCHJ, off 2 V 1 ; BRANCH with long offset. #*Special Case Regops IFMATCH BRANCHJ, off 1 . 1 ; Succeeds if the following matches; non-zero flags "f", next_off "o" means lookbehind assertion starting "f..(f-o)" characters before current @@ -248,7 +263,7 @@ GROUPP GROUPP, num 1 ; Whet #*The heavy worker -EVAL EVAL, evl/flags 2L ; Execute some Perl code. +EVAL EVAL, evl/flags 2 ; Execute some Perl code. #*Modifiers @@ -259,7 +274,7 @@ LOGICAL LOGICAL, no ; Next RENUM BRANCHJ, off 1 . 1 ; Group with independently numbered parens. #*Regex Subroutines -GOSUB GOSUB, num/ofs 2L ; recurse to paren arg1 at (signed) ofs arg2 +GOSUB GOSUB, num/ofs 2 ; recurse to paren arg1 at (signed) ofs arg2 #*Special conditionals GROUPPN GROUPPN, no-sv 1 ; Whether the group matched. @@ -269,7 +284,7 @@ DEFINEP DEFINEP, none 1 ; Neve #*Backtracking Verbs ENDLIKE ENDLIKE, none ; Used only for the type field of verbs OPFAIL ENDLIKE, no-sv 1 ; Same as (?!), but with verb arg -ACCEPT ENDLIKE, no-sv/num 2L ; Accepts the current matched string, with verbar +ACCEPT ENDLIKE, no-sv/num 2 ; Accepts the current matched string, with verbar #*Verbs With Arguments VERB VERB, no-sv 1 ; Used only for the type field of verbs @@ -329,3 +344,4 @@ MARKPOINT next:FAIL SKIP next:FAIL CUTGROUP next:FAIL KEEPS next:FAIL +REF next:FAIL Index: gnu/usr.bin/perl/regcomp_debug.c =================================================================== RCS file: gnu/usr.bin/perl/regcomp_debug.c diff -N gnu/usr.bin/perl/regcomp_debug.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/regcomp_debug.c 21 Feb 2024 15:47:03 -0000 @@ -0,0 +1,1670 @@ +#ifdef PERL_EXT_RE_BUILD +#include "re_top.h" +#endif + +#include "EXTERN.h" +#define PERL_IN_REGEX_ENGINE +#define PERL_IN_REGCOMP_ANY +#define PERL_IN_REGCOMP_DEBUG_C +#include "perl.h" + +#ifdef PERL_IN_XSUB_RE +# include "re_comp.h" +#else +# include "regcomp.h" +#endif + +#include "invlist_inline.h" +#include "unicode_constants.h" +#include "regcomp_internal.h" + +#ifdef DEBUGGING + +int +Perl_re_printf(pTHX_ const char *fmt, ...) +{ + va_list ap; + int result; + PerlIO *f= Perl_debug_log; + PERL_ARGS_ASSERT_RE_PRINTF; + va_start(ap, fmt); + result = PerlIO_vprintf(f, fmt, ap); + va_end(ap); + return result; +} + +int +Perl_re_indentf(pTHX_ const char *fmt, U32 depth, ...) +{ + va_list ap; + int result; + PerlIO *f= Perl_debug_log; + PERL_ARGS_ASSERT_RE_INDENTF; + va_start(ap, depth); + PerlIO_printf(f, "%*s", ( (int)depth % 20 ) * 2, ""); + result = PerlIO_vprintf(f, fmt, ap); + va_end(ap); + return result; +} + +void +Perl_debug_show_study_flags(pTHX_ U32 flags, const char *open_str, + const char *close_str) +{ + PERL_ARGS_ASSERT_DEBUG_SHOW_STUDY_FLAGS; + if (!flags) + return; + + Perl_re_printf( aTHX_ "%s", open_str); + DEBUG_SHOW_STUDY_FLAG(flags, SF_BEFORE_SEOL); + DEBUG_SHOW_STUDY_FLAG(flags, SF_BEFORE_MEOL); + DEBUG_SHOW_STUDY_FLAG(flags, SF_IS_INF); + DEBUG_SHOW_STUDY_FLAG(flags, SF_HAS_PAR); + DEBUG_SHOW_STUDY_FLAG(flags, SF_IN_PAR); + DEBUG_SHOW_STUDY_FLAG(flags, SF_HAS_EVAL); + DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_SUBSTR); + DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_STCLASS_AND); + DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_STCLASS_OR); + DEBUG_SHOW_STUDY_FLAG(flags, SCF_DO_STCLASS); + DEBUG_SHOW_STUDY_FLAG(flags, SCF_WHILEM_VISITED_POS); + DEBUG_SHOW_STUDY_FLAG(flags, SCF_TRIE_RESTUDY); + DEBUG_SHOW_STUDY_FLAG(flags, SCF_SEEN_ACCEPT); + DEBUG_SHOW_STUDY_FLAG(flags, SCF_TRIE_DOING_RESTUDY); + DEBUG_SHOW_STUDY_FLAG(flags, SCF_IN_DEFINE); + Perl_re_printf( aTHX_ "%s", close_str); +} + +void +Perl_debug_studydata(pTHX_ const char *where, scan_data_t *data, + U32 depth, int is_inf, + SSize_t min, SSize_t stopmin, SSize_t delta) +{ + PERL_ARGS_ASSERT_DEBUG_STUDYDATA; + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + DEBUG_OPTIMISE_MORE_r({ + if (!data) { + Perl_re_indentf(aTHX_ "%s: NO DATA", + depth, + where); + return; + } + Perl_re_indentf(aTHX_ "%s: M/S/D: %" IVdf "/%" IVdf "/%" IVdf " Pos:%" IVdf "/%" IVdf " Flags: 0x%" UVXf, + depth, + where, + min, stopmin, delta, + (IV)data->pos_min, + (IV)data->pos_delta, + (UV)data->flags + ); + + Perl_debug_show_study_flags(aTHX_ data->flags," [","]"); + + Perl_re_printf( aTHX_ + " Whilem_c: %" IVdf " Lcp: %" IVdf " %s", + (IV)data->whilem_c, + (IV)(data->last_closep ? *((data)->last_closep) : -1), + is_inf ? "INF " : "" + ); + + if (data->last_found) { + int i; + Perl_re_printf(aTHX_ + "Last:'%s' %" IVdf ":%" IVdf "/%" IVdf, + SvPVX_const(data->last_found), + (IV)data->last_end, + (IV)data->last_start_min, + (IV)data->last_start_max + ); + + for (i = 0; i < 2; i++) { + Perl_re_printf(aTHX_ + " %s%s: '%s' @ %" IVdf "/%" IVdf, + data->cur_is_floating == i ? "*" : "", + i ? "Float" : "Fixed", + SvPVX_const(data->substrs[i].str), + (IV)data->substrs[i].min_offset, + (IV)data->substrs[i].max_offset + ); + Perl_debug_show_study_flags(aTHX_ data->substrs[i].flags," [","]"); + } + } + + Perl_re_printf( aTHX_ "\n"); + }); +} + + +void +Perl_debug_peep(pTHX_ const char *str, const RExC_state_t *pRExC_state, + regnode *scan, U32 depth, U32 flags) +{ + PERL_ARGS_ASSERT_DEBUG_PEEP; + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + DEBUG_OPTIMISE_r({ + regnode *Next; + + if (!scan) + return; + Next = regnext(scan); + regprop(RExC_rx, RExC_mysv, scan, NULL, pRExC_state); + Perl_re_indentf( aTHX_ "%s>%3d: %s (%d)", + depth, + str, + REG_NODE_NUM(scan), SvPV_nolen_const(RExC_mysv), + Next ? (REG_NODE_NUM(Next)) : 0 ); + Perl_debug_show_study_flags(aTHX_ flags," [ ","]"); + Perl_re_printf( aTHX_ "\n"); + }); +} + +#endif /* DEBUGGING */ + +/* + - regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form + */ +#ifdef DEBUGGING + +static void +S_regdump_intflags(pTHX_ const char *lead, const U32 flags) +{ + int bit; + int set=0; + + ASSUME(REG_INTFLAGS_NAME_SIZE <= sizeof(flags)*8); + + for (bit=0; bit<=REG_INTFLAGS_NAME_SIZE; bit++) { + if (flags & (1<program, ri->program + 1, NULL, NULL, sv, 0, 0); + + /* Header fields of interest. */ + for (i = 0; i < 2; i++) { + if (r->substrs->data[i].substr) { + RE_PV_QUOTED_DECL(s, 0, dsv, + SvPVX_const(r->substrs->data[i].substr), + RE_SV_DUMPLEN(r->substrs->data[i].substr), + PL_dump_re_max_len); + Perl_re_printf( aTHX_ + "%s %s%s at %" IVdf "..%" UVuf " ", + i ? "floating" : "anchored", + s, + RE_SV_TAIL(r->substrs->data[i].substr), + (IV)r->substrs->data[i].min_offset, + (UV)r->substrs->data[i].max_offset); + } + else if (r->substrs->data[i].utf8_substr) { + RE_PV_QUOTED_DECL(s, 1, dsv, + SvPVX_const(r->substrs->data[i].utf8_substr), + RE_SV_DUMPLEN(r->substrs->data[i].utf8_substr), + 30); + Perl_re_printf( aTHX_ + "%s utf8 %s%s at %" IVdf "..%" UVuf " ", + i ? "floating" : "anchored", + s, + RE_SV_TAIL(r->substrs->data[i].utf8_substr), + (IV)r->substrs->data[i].min_offset, + (UV)r->substrs->data[i].max_offset); + } + } + + if (r->check_substr || r->check_utf8) + Perl_re_printf( aTHX_ + (const char *) + ( r->check_substr == r->substrs->data[1].substr + && r->check_utf8 == r->substrs->data[1].utf8_substr + ? "(checking floating" : "(checking anchored")); + if (r->intflags & PREGf_NOSCAN) + Perl_re_printf( aTHX_ " noscan"); + if (r->extflags & RXf_CHECK_ALL) + Perl_re_printf( aTHX_ " isall"); + if (r->check_substr || r->check_utf8) + Perl_re_printf( aTHX_ ") "); + + if (ri->regstclass) { + regprop(r, sv, ri->regstclass, NULL, NULL); + Perl_re_printf( aTHX_ "stclass %s ", SvPVX_const(sv)); + } + if (r->intflags & PREGf_ANCH) { + Perl_re_printf( aTHX_ "anchored"); + if (r->intflags & PREGf_ANCH_MBOL) + Perl_re_printf( aTHX_ "(MBOL)"); + if (r->intflags & PREGf_ANCH_SBOL) + Perl_re_printf( aTHX_ "(SBOL)"); + if (r->intflags & PREGf_ANCH_GPOS) + Perl_re_printf( aTHX_ "(GPOS)"); + Perl_re_printf( aTHX_ " "); + } + if (r->intflags & PREGf_GPOS_SEEN) + Perl_re_printf( aTHX_ "GPOS:%" UVuf " ", (UV)r->gofs); + if (r->intflags & PREGf_SKIP) + Perl_re_printf( aTHX_ "plus "); + if (r->intflags & PREGf_IMPLICIT) + Perl_re_printf( aTHX_ "implicit "); + Perl_re_printf( aTHX_ "minlen %" IVdf " ", (IV)r->minlen); + if (r->extflags & RXf_EVAL_SEEN) + Perl_re_printf( aTHX_ "with eval "); + Perl_re_printf( aTHX_ "\n"); + DEBUG_FLAGS_r({ + regdump_extflags("r->extflags: ", r->extflags); + regdump_intflags("r->intflags: ", r->intflags); + }); +#else + PERL_ARGS_ASSERT_REGDUMP; + PERL_UNUSED_CONTEXT; + PERL_UNUSED_ARG(r); +#endif /* DEBUGGING */ +} + +/* Should be synchronized with ANYOF_ #defines in regcomp.h */ +#ifdef DEBUGGING + +# if CC_WORDCHAR_ != 0 || CC_DIGIT_ != 1 || CC_ALPHA_ != 2 \ + || CC_LOWER_ != 3 || CC_UPPER_ != 4 || CC_PUNCT_ != 5 \ + || CC_PRINT_ != 6 || CC_ALPHANUMERIC_ != 7 || CC_GRAPH_ != 8 \ + || CC_CASED_ != 9 || CC_SPACE_ != 10 || CC_BLANK_ != 11 \ + || CC_XDIGIT_ != 12 || CC_CNTRL_ != 13 || CC_ASCII_ != 14 \ + || CC_VERTSPACE_ != 15 +# error Need to adjust order of anyofs[] +# endif +static const char * const anyofs[] = { + "\\w", + "\\W", + "\\d", + "\\D", + "[:alpha:]", + "[:^alpha:]", + "[:lower:]", + "[:^lower:]", + "[:upper:]", + "[:^upper:]", + "[:punct:]", + "[:^punct:]", + "[:print:]", + "[:^print:]", + "[:alnum:]", + "[:^alnum:]", + "[:graph:]", + "[:^graph:]", + "[:cased:]", + "[:^cased:]", + "\\s", + "\\S", + "[:blank:]", + "[:^blank:]", + "[:xdigit:]", + "[:^xdigit:]", + "[:cntrl:]", + "[:^cntrl:]", + "[:ascii:]", + "[:^ascii:]", + "\\v", + "\\V" +}; +#endif + +/* +- regprop - printable representation of opcode, with run time support +*/ + +void +Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_info *reginfo, const RExC_state_t *pRExC_state) +{ +#ifdef DEBUGGING + U8 k; + const U8 op = OP(o); + RXi_GET_DECL(prog, progi); + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + PERL_ARGS_ASSERT_REGPROP; + + SvPVCLEAR(sv); + + if (op > REGNODE_MAX) { /* regnode.type is unsigned */ + if (pRExC_state) { /* This gives more info, if we have it */ + FAIL3("panic: corrupted regexp opcode %d > %d", + (int)op, (int)REGNODE_MAX); + } + else { + Perl_croak(aTHX_ "panic: corrupted regexp opcode %d > %d", + (int)op, (int)REGNODE_MAX); + } + } + sv_catpv(sv, REGNODE_NAME(op)); /* Take off const! */ + + k = REGNODE_TYPE(op); + if (op == BRANCH) { + Perl_sv_catpvf(aTHX_ sv, " (buf:%" IVdf "/%" IVdf ")", (IV)ARG1a(o),(IV)ARG1b(o)); + } + else if (op == BRANCHJ) { + Perl_sv_catpvf(aTHX_ sv, " (buf:%" IVdf "/%" IVdf ")", (IV)ARG2a(o),(IV)ARG2b(o)); + } + else if (k == EXACT) { + sv_catpvs(sv, " "); + /* Using is_utf8_string() (via PERL_PV_UNI_DETECT) + * is a crude hack but it may be the best for now since + * we have no flag "this EXACTish node was UTF-8" + * --jhi */ + pv_pretty(sv, STRING(o), STR_LEN(o), PL_dump_re_max_len, + PL_colors[0], PL_colors[1], + PERL_PV_ESCAPE_UNI_DETECT | + PERL_PV_ESCAPE_NONASCII | + PERL_PV_PRETTY_ELLIPSES | + PERL_PV_PRETTY_LTGT | + PERL_PV_PRETTY_NOCLEAR + ); + } else if (k == TRIE) { + /* print the details of the trie in dumpuntil instead, as + * progi->data isn't available here */ + const U32 n = ARG1u(o); + const reg_ac_data * const ac = IS_TRIE_AC(op) ? + (reg_ac_data *)progi->data->data[n] : + NULL; + const reg_trie_data * const trie + = (reg_trie_data*)progi->data->data[!IS_TRIE_AC(op) ? n : ac->trie]; + + Perl_sv_catpvf(aTHX_ sv, "-%s", REGNODE_NAME(FLAGS(o))); + DEBUG_TRIE_COMPILE_r({ + if (trie->jump) + sv_catpvs(sv, "(JUMP)"); + Perl_sv_catpvf(aTHX_ sv, + "", + (UV)trie->startstate, + (IV)trie->statecount-1, /* -1 because of the unused 0 element */ + (UV)trie->wordcount, + (UV)trie->minlen, + (UV)trie->maxlen, + (UV)TRIE_CHARCOUNT(trie), + (UV)trie->uniquecharcount + ); + }); + if ( IS_ANYOF_TRIE(op) || trie->bitmap ) { + sv_catpvs(sv, "["); + (void) put_charclass_bitmap_innards(sv, + ((IS_ANYOF_TRIE(op)) + ? ANYOF_BITMAP(o) + : TRIE_BITMAP(trie)), + NULL, + NULL, + NULL, + 0, + FALSE + ); + sv_catpvs(sv, "]"); + } + if (trie->before_paren || trie->after_paren) + Perl_sv_catpvf(aTHX_ sv, " (buf:%" IVdf "/%" IVdf ")", + (IV)trie->before_paren,(IV)trie->after_paren); + } else if (k == CURLY) { + U32 lo = ARG1i(o), hi = ARG2i(o); + if (ARG3u(o)) /* check both ARG3a and ARG3b at the same time */ + Perl_sv_catpvf(aTHX_ sv, "<%d:%d>", ARG3a(o),ARG3b(o)); /* paren before, paren after */ + if (op == CURLYM || op == CURLYN || op == CURLYX) + Perl_sv_catpvf(aTHX_ sv, "[%d]", FLAGS(o)); /* Parenth number */ + Perl_sv_catpvf(aTHX_ sv, "{%u,", (unsigned) lo); + if (hi == REG_INFTY) + sv_catpvs(sv, "INFTY"); + else + Perl_sv_catpvf(aTHX_ sv, "%u", (unsigned) hi); + sv_catpvs(sv, "}"); + } + else if (k == WHILEM && FLAGS(o)) /* Ordinal/of */ + Perl_sv_catpvf(aTHX_ sv, "[%d/%d]", FLAGS(o) & 0xf, FLAGS(o)>>4); + else if (k == REF || k == OPEN || k == CLOSE + || k == GROUPP || op == ACCEPT) + { + AV *name_list= NULL; + U32 parno= (op == ACCEPT) ? ARG2u(o) : + (op == OPEN || op == CLOSE) ? PARNO(o) : + ARG1u(o); + if ( RXp_PAREN_NAMES(prog) ) { + name_list= MUTABLE_AV(progi->data->data[progi->name_list_idx]); + } else if ( pRExC_state ) { + name_list= RExC_paren_name_list; + } + if ( name_list ) { + if ( k != REF || (op < REFN)) { + UV logical_parno = parno; + if (prog->parno_to_logical) + logical_parno = prog->parno_to_logical[parno]; + + Perl_sv_catpvf(aTHX_ sv, "%" UVuf, (UV)logical_parno); /* Parenth number */ + if (parno != logical_parno) + Perl_sv_catpvf(aTHX_ sv, "/%" UVuf, (UV)parno); /* Parenth number */ + + SV **name= av_fetch_simple(name_list, parno, 0 ); + if (name) + Perl_sv_catpvf(aTHX_ sv, " '%" SVf "'", SVfARG(*name)); + } + else + if (parno > 0) { + /* parno must always be larger than 0 for this block + * as it represents a slot into the data array, which + * has the 0 slot reserved for a placeholder so any valid + * index into it is always true, eg non-zero + * see the '%' "what" type and the implementation of + * S_reg_add_data() + */ + SV *sv_dat= MUTABLE_SV(progi->data->data[ parno ]); + I32 *nums=(I32*)SvPVX(sv_dat); + SV **name= av_fetch_simple(name_list, nums[0], 0 ); + I32 n; + if (name) { + for ( n=0; n0) { + UV logical_parno = parno; + if (prog->parno_to_logical) + logical_parno = prog->parno_to_logical[parno]; + + Perl_sv_catpvf(aTHX_ sv, "%" UVuf, (UV)logical_parno); /* Parenth number */ + if (logical_parno != parno) + Perl_sv_catpvf(aTHX_ sv, "/%" UVuf, (UV)parno); /* Parenth number */ + + } + if ( k == REF ) { + Perl_sv_catpvf(aTHX_ sv, " <%" IVdf ">", (IV)ARG2i(o)); + } + if ( k == REF && reginfo) { + U32 n = ARG1u(o); /* which paren pair */ + I32 ln = RXp_OFFS_START(prog,n); + if (RXp_LASTPAREN(prog) < n || ln == -1 || RXp_OFFS_END(prog,n) == -1) + Perl_sv_catpvf(aTHX_ sv, ": FAIL"); + else if (ln == RXp_OFFS_END(prog,n)) + Perl_sv_catpvf(aTHX_ sv, ": ACCEPT - EMPTY STRING"); + else { + const char *s = reginfo->strbeg + ln; + Perl_sv_catpvf(aTHX_ sv, ": "); + Perl_pv_pretty( aTHX_ sv, s, RXp_OFFS_END(prog,n) - RXp_OFFS_START(prog,n), 32, 0, 0, + PERL_PV_ESCAPE_UNI_DETECT|PERL_PV_PRETTY_NOCLEAR|PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE ); + } + } + } else if (k == GOSUB) { + AV *name_list= NULL; + IV parno = ARG1u(o); + IV logical_parno = (parno && prog->parno_to_logical) + ? prog->parno_to_logical[parno] + : parno; + if ( RXp_PAREN_NAMES(prog) ) { + name_list= MUTABLE_AV(progi->data->data[progi->name_list_idx]); + } else if ( pRExC_state ) { + name_list= RExC_paren_name_list; + } + + /* Paren and offset */ + Perl_sv_catpvf(aTHX_ sv, "%" IVdf, logical_parno); + if (logical_parno != parno) + Perl_sv_catpvf(aTHX_ sv, "/%" IVdf, parno); + + Perl_sv_catpvf(aTHX_ sv, "[%+d:%d]", (int)ARG2i(o), + (int)((o + (int)ARG2i(o)) - progi->program) ); + if (name_list) { + SV **name= av_fetch_simple(name_list, ARG1u(o), 0 ); + if (name) + Perl_sv_catpvf(aTHX_ sv, " '%" SVf "'", SVfARG(*name)); + } + } + else if (k == LOGICAL) + /* 2: embedded, otherwise 1 */ + Perl_sv_catpvf(aTHX_ sv, "[%d]", FLAGS(o)); + else if (k == ANYOF || k == ANYOFH || k == ANYOFR) { + U8 flags; + char * bitmap; + U8 do_sep = 0; /* Do we need to separate various components of the + output? */ + /* Set if there is still an unresolved user-defined property */ + SV *unresolved = NULL; + + /* Things that are ignored except when the runtime locale is UTF-8 */ + SV *only_utf8_locale_invlist = NULL; + + /* Code points that don't fit in the bitmap */ + SV *nonbitmap_invlist = NULL; + + /* And things that aren't in the bitmap, but are small enough to be */ + SV* bitmap_range_not_in_bitmap = NULL; + + bool inverted; + + if (k != ANYOF) { + flags = 0; + bitmap = NULL; + } + else { + flags = ANYOF_FLAGS(o); + bitmap = ANYOF_BITMAP(o); + } + + if (op == ANYOFL || op == ANYOFPOSIXL) { + if ((flags & ANYOFL_UTF8_LOCALE_REQD)) { + sv_catpvs(sv, "{utf8-locale-reqd}"); + } + if (flags & ANYOFL_FOLD) { + sv_catpvs(sv, "{i}"); + } + } + + inverted = flags & ANYOF_INVERT; + + /* If there is stuff outside the bitmap, get it */ + if (k == ANYOFR) { + + /* For a single range, split into the parts inside vs outside the + * bitmap. */ + UV start = ANYOFRbase(o); + UV end = ANYOFRbase(o) + ANYOFRdelta(o); + + if (start < NUM_ANYOF_CODE_POINTS) { + if (end < NUM_ANYOF_CODE_POINTS) { + bitmap_range_not_in_bitmap + = _add_range_to_invlist(bitmap_range_not_in_bitmap, + start, end); + } + else { + bitmap_range_not_in_bitmap + = _add_range_to_invlist(bitmap_range_not_in_bitmap, + start, NUM_ANYOF_CODE_POINTS); + start = NUM_ANYOF_CODE_POINTS; + } + } + + if (start >= NUM_ANYOF_CODE_POINTS) { + nonbitmap_invlist = _add_range_to_invlist(nonbitmap_invlist, + ANYOFRbase(o), + ANYOFRbase(o) + ANYOFRdelta(o)); + } + } + else if (ANYOF_MATCHES_ALL_OUTSIDE_BITMAP(o)) { + nonbitmap_invlist = _add_range_to_invlist(nonbitmap_invlist, + NUM_ANYOF_CODE_POINTS, + UV_MAX); + } + else if (ANYOF_HAS_AUX(o)) { + (void) GET_REGCLASS_AUX_DATA(prog, o, FALSE, + &unresolved, + &only_utf8_locale_invlist, + &nonbitmap_invlist); + + /* The aux data may contain stuff that could fit in the bitmap. + * This could come from a user-defined property being finally + * resolved when this call was done; or much more likely because + * there are matches that require UTF-8 to be valid, and so aren't + * in the bitmap (or ANYOFR). This is teased apart later */ + _invlist_intersection(nonbitmap_invlist, + PL_InBitmap, + &bitmap_range_not_in_bitmap); + /* Leave just the things that don't fit into the bitmap */ + _invlist_subtract(nonbitmap_invlist, + PL_InBitmap, + &nonbitmap_invlist); + } + + /* Ready to start outputting. First, the initial left bracket */ + Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]); + + if ( bitmap + || bitmap_range_not_in_bitmap + || only_utf8_locale_invlist + || unresolved) + { + /* Then all the things that could fit in the bitmap */ + do_sep = put_charclass_bitmap_innards( + sv, + bitmap, + bitmap_range_not_in_bitmap, + only_utf8_locale_invlist, + o, + flags, + + /* Can't try inverting for a + * better display if there + * are things that haven't + * been resolved */ + (unresolved != NULL || k == ANYOFR)); + SvREFCNT_dec(bitmap_range_not_in_bitmap); + + /* If there are user-defined properties which haven't been defined + * yet, output them. If the result is not to be inverted, it is + * clearest to output them in a separate [] from the bitmap range + * stuff. If the result is to be complemented, we have to show + * everything in one [], as the inversion applies to the whole + * thing. Use {braces} to separate them from anything in the + * bitmap and anything above the bitmap. */ + if (unresolved) { + if (inverted) { + if (! do_sep) { /* If didn't output anything in the bitmap + */ + sv_catpvs(sv, "^"); + } + sv_catpvs(sv, "{"); + } + else if (do_sep) { + Perl_sv_catpvf(aTHX_ sv,"%s][%s", PL_colors[1], + PL_colors[0]); + } + sv_catsv(sv, unresolved); + if (inverted) { + sv_catpvs(sv, "}"); + } + do_sep = ! inverted; + } + else if ( do_sep == 2 + && ! nonbitmap_invlist + && ANYOF_MATCHES_NONE_OUTSIDE_BITMAP(o)) + { + /* Here, the display shows the class as inverted, and + * everything above the lower display should also match, but + * there is no indication of that. Add this range so the code + * below will add it to the display */ + _invlist_union_complement_2nd(nonbitmap_invlist, + PL_InBitmap, + &nonbitmap_invlist); + } + } + + /* And, finally, add the above-the-bitmap stuff */ + if (nonbitmap_invlist && _invlist_len(nonbitmap_invlist)) { + SV* contents; + + /* See if truncation size is overridden */ + const STRLEN dump_len = (PL_dump_re_max_len > 256) + ? PL_dump_re_max_len + : 256; + + /* This is output in a separate [] */ + if (do_sep) { + Perl_sv_catpvf(aTHX_ sv,"%s][%s", PL_colors[1], PL_colors[0]); + } + + /* And, for easy of understanding, it is shown in the + * uncomplemented form if possible. The one exception being if + * there are unresolved items, where the inversion has to be + * delayed until runtime */ + if (inverted && ! unresolved) { + _invlist_invert(nonbitmap_invlist); + _invlist_subtract(nonbitmap_invlist, PL_InBitmap, &nonbitmap_invlist); + } + + contents = invlist_contents(nonbitmap_invlist, + FALSE /* output suitable for catsv */ + ); + + /* If the output is shorter than the permissible maximum, just do it. */ + if (SvCUR(contents) <= dump_len) { + sv_catsv(sv, contents); + } + else { + const char * contents_string = SvPVX(contents); + STRLEN i = dump_len; + + /* Otherwise, start at the permissible max and work back to the + * first break possibility */ + while (i > 0 && contents_string[i] != ' ') { + i--; + } + if (i == 0) { /* Fail-safe. Use the max if we couldn't + find a legal break */ + i = dump_len; + } + + sv_catpvn(sv, contents_string, i); + sv_catpvs(sv, "..."); + } + + SvREFCNT_dec_NN(contents); + SvREFCNT_dec_NN(nonbitmap_invlist); + } + + /* And finally the matching, closing ']' */ + Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]); + + if (op == ANYOFHs) { + Perl_sv_catpvf(aTHX_ sv, " (Leading UTF-8 bytes=%s", _byte_dump_string((U8 *) ((struct regnode_anyofhs *) o)->string, FLAGS(o), 1)); + } + else if (REGNODE_TYPE(op) != ANYOF) { + U8 lowest = (op != ANYOFHr) + ? FLAGS(o) + : LOWEST_ANYOF_HRx_BYTE(FLAGS(o)); + U8 highest = (op == ANYOFHr) + ? HIGHEST_ANYOF_HRx_BYTE(FLAGS(o)) + : (op == ANYOFH || op == ANYOFR) + ? 0xFF + : lowest; +#ifndef EBCDIC + if (op != ANYOFR || ! isASCII(ANYOFRbase(o) + ANYOFRdelta(o))) +#endif + { + Perl_sv_catpvf(aTHX_ sv, " (First UTF-8 byte=%02X", lowest); + if (lowest != highest) { + Perl_sv_catpvf(aTHX_ sv, "-%02X", highest); + } + Perl_sv_catpvf(aTHX_ sv, ")"); + } + } + + SvREFCNT_dec(unresolved); + } + else if (k == ANYOFM) { + SV * cp_list = get_ANYOFM_contents(o); + + Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]); + if (op == NANYOFM) { + _invlist_invert(cp_list); + } + + put_charclass_bitmap_innards(sv, NULL, cp_list, NULL, NULL, 0, TRUE); + Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]); + + SvREFCNT_dec(cp_list); + } + else if (k == ANYOFHbbm) { + SV * cp_list = get_ANYOFHbbm_contents(o); + Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]); + + sv_catsv(sv, invlist_contents(cp_list, + FALSE /* output suitable for catsv */ + )); + Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]); + + SvREFCNT_dec(cp_list); + } + else if (k == POSIXD || k == NPOSIXD) { + U8 index = FLAGS(o) * 2; + if (index < C_ARRAY_LENGTH(anyofs)) { + if (*anyofs[index] != '[') { + sv_catpvs(sv, "["); + } + sv_catpv(sv, anyofs[index]); + if (*anyofs[index] != '[') { + sv_catpvs(sv, "]"); + } + } + else { + Perl_sv_catpvf(aTHX_ sv, "[illegal type=%d])", index); + } + } + else if (k == BOUND || k == NBOUND) { + /* Must be synced with order of 'bound_type' in regcomp.h */ + const char * const bounds[] = { + "", /* Traditional */ + "{gcb}", + "{lb}", + "{sb}", + "{wb}" + }; + assert(FLAGS(o) < C_ARRAY_LENGTH(bounds)); + sv_catpv(sv, bounds[FLAGS(o)]); + } + else if (k == BRANCHJ && (op == UNLESSM || op == IFMATCH)) { + Perl_sv_catpvf(aTHX_ sv, "[%d", -(FLAGS(o))); + if (NEXT_OFF(o)) { + Perl_sv_catpvf(aTHX_ sv, "..-%d", FLAGS(o) - NEXT_OFF(o)); + } + Perl_sv_catpvf(aTHX_ sv, "]"); + } + else if (op == SBOL) + Perl_sv_catpvf(aTHX_ sv, " /%s/", FLAGS(o) ? "\\A" : "^"); + else if (op == EVAL) { + if (FLAGS(o) & EVAL_OPTIMISTIC_FLAG) + Perl_sv_catpvf(aTHX_ sv, " optimistic"); + } + + /* add on the verb argument if there is one */ + if ( ( k == VERB || op == ACCEPT || op == OPFAIL ) && FLAGS(o)) { + if ( ARG1u(o) ) + Perl_sv_catpvf(aTHX_ sv, ":%" SVf, + SVfARG((MUTABLE_SV(progi->data->data[ ARG1u( o ) ])))); + else + sv_catpvs(sv, ":NULL"); + } +#else + PERL_UNUSED_CONTEXT; + PERL_UNUSED_ARG(sv); + PERL_UNUSED_ARG(o); + PERL_UNUSED_ARG(prog); + PERL_UNUSED_ARG(reginfo); + PERL_UNUSED_ARG(pRExC_state); +#endif /* DEBUGGING */ +} + +#ifdef DEBUGGING + +STATIC void +S_put_code_point(pTHX_ SV *sv, UV c) +{ + PERL_ARGS_ASSERT_PUT_CODE_POINT; + + if (c > 255) { + Perl_sv_catpvf(aTHX_ sv, "\\x{%04" UVXf "}", c); + } + else if (isPRINT(c)) { + const char string = (char) c; + + /* We use {phrase} as metanotation in the class, so also escape literal + * braces */ + if (isBACKSLASHED_PUNCT(c) || c == '{' || c == '}') + sv_catpvs(sv, "\\"); + sv_catpvn(sv, &string, 1); + } + else if (isMNEMONIC_CNTRL(c)) { + Perl_sv_catpvf(aTHX_ sv, "%s", cntrl_to_mnemonic((U8) c)); + } + else { + Perl_sv_catpvf(aTHX_ sv, "\\x%02X", (U8) c); + } +} + +STATIC void +S_put_range(pTHX_ SV *sv, UV start, const UV end, const bool allow_literals) +{ + /* Appends to 'sv' a displayable version of the range of code points from + * 'start' to 'end'. Mnemonics (like '\r') are used for the few controls + * that have them, when they occur at the beginning or end of the range. + * It uses hex to output the remaining code points, unless 'allow_literals' + * is true, in which case the printable ASCII ones are output as-is (though + * some of these will be escaped by put_code_point()). + * + * NOTE: This is designed only for printing ranges of code points that fit + * inside an ANYOF bitmap. Higher code points are simply suppressed + */ + + const unsigned int min_range_count = 3; + + assert(start <= end); + + PERL_ARGS_ASSERT_PUT_RANGE; + + while (start <= end) { + UV this_end; + const char * format; + + if ( end - start < min_range_count + && (end - start <= 2 || (isPRINT_A(start) && isPRINT_A(end)))) + { + /* Output a range of 1 or 2 chars individually, or longer ranges + * when printable */ + for (; start <= end; start++) { + put_code_point(sv, start); + } + break; + } + + /* If permitted by the input options, and there is a possibility that + * this range contains a printable literal, look to see if there is + * one. */ + if (allow_literals && start <= MAX_PRINT_A) { + + /* If the character at the beginning of the range isn't an ASCII + * printable, effectively split the range into two parts: + * 1) the portion before the first such printable, + * 2) the rest + * and output them separately. */ + if (! isPRINT_A(start)) { + UV temp_end = start + 1; + + /* There is no point looking beyond the final possible + * printable, in MAX_PRINT_A */ + UV max = MIN(end, MAX_PRINT_A); + + while (temp_end <= max && ! isPRINT_A(temp_end)) { + temp_end++; + } + + /* Here, temp_end points to one beyond the first printable if + * found, or to one beyond 'max' if not. If none found, make + * sure that we use the entire range */ + if (temp_end > MAX_PRINT_A) { + temp_end = end + 1; + } + + /* Output the first part of the split range: the part that + * doesn't have printables, with the parameter set to not look + * for literals (otherwise we would infinitely recurse) */ + put_range(sv, start, temp_end - 1, FALSE); + + /* The 2nd part of the range (if any) starts here. */ + start = temp_end; + + /* We do a continue, instead of dropping down, because even if + * the 2nd part is non-empty, it could be so short that we want + * to output it as individual characters, as tested for at the + * top of this loop. */ + continue; + } + + /* Here, 'start' is a printable ASCII. If it is an alphanumeric, + * output a sub-range of just the digits or letters, then process + * the remaining portion as usual. */ + if (isALPHANUMERIC_A(start)) { + UV mask = (isDIGIT_A(start)) + ? CC_DIGIT_ + : isUPPER_A(start) + ? CC_UPPER_ + : CC_LOWER_; + UV temp_end = start + 1; + + /* Find the end of the sub-range that includes just the + * characters in the same class as the first character in it */ + while (temp_end <= end && generic_isCC_A_(temp_end, mask)) { + temp_end++; + } + temp_end--; + + /* For short ranges, don't duplicate the code above to output + * them; just call recursively */ + if (temp_end - start < min_range_count) { + put_range(sv, start, temp_end, FALSE); + } + else { /* Output as a range */ + put_code_point(sv, start); + sv_catpvs(sv, "-"); + put_code_point(sv, temp_end); + } + start = temp_end + 1; + continue; + } + + /* We output any other printables as individual characters */ + if (isPUNCT_A(start) || isSPACE_A(start)) { + while (start <= end && (isPUNCT_A(start) + || isSPACE_A(start))) + { + put_code_point(sv, start); + start++; + } + continue; + } + } /* End of looking for literals */ + + /* Here is not to output as a literal. Some control characters have + * mnemonic names. Split off any of those at the beginning and end of + * the range to print mnemonically. It isn't possible for many of + * these to be in a row, so this won't overwhelm with output */ + if ( start <= end + && (isMNEMONIC_CNTRL(start) || isMNEMONIC_CNTRL(end))) + { + while (isMNEMONIC_CNTRL(start) && start <= end) { + put_code_point(sv, start); + start++; + } + + /* If this didn't take care of the whole range ... */ + if (start <= end) { + + /* Look backwards from the end to find the final non-mnemonic + * */ + UV temp_end = end; + while (isMNEMONIC_CNTRL(temp_end)) { + temp_end--; + } + + /* And separately output the interior range that doesn't start + * or end with mnemonics */ + put_range(sv, start, temp_end, FALSE); + + /* Then output the mnemonic trailing controls */ + start = temp_end + 1; + while (start <= end) { + put_code_point(sv, start); + start++; + } + break; + } + } + + /* As a final resort, output the range or subrange as hex. */ + + if (start >= NUM_ANYOF_CODE_POINTS) { + this_end = end; + } + else { /* Have to split range at the bitmap boundary */ + this_end = (end < NUM_ANYOF_CODE_POINTS) + ? end + : NUM_ANYOF_CODE_POINTS - 1; + } +#if NUM_ANYOF_CODE_POINTS > 256 + format = (this_end < 256) + ? "\\x%02" UVXf "-\\x%02" UVXf + : "\\x{%04" UVXf "}-\\x{%04" UVXf "}"; +#else + format = "\\x%02" UVXf "-\\x%02" UVXf; +#endif + GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); + Perl_sv_catpvf(aTHX_ sv, format, start, this_end); + GCC_DIAG_RESTORE_STMT; + break; + } +} + +STATIC void +S_put_charclass_bitmap_innards_invlist(pTHX_ SV *sv, SV* invlist) +{ + /* Concatenate onto the PV in 'sv' a displayable form of the inversion list + * 'invlist' */ + + UV start, end; + bool allow_literals = TRUE; + + PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_INVLIST; + + /* Generally, it is more readable if printable characters are output as + * literals, but if a range (nearly) spans all of them, it's best to output + * it as a single range. This code will use a single range if all but 2 + * ASCII printables are in it */ + invlist_iterinit(invlist); + while (invlist_iternext(invlist, &start, &end)) { + + /* If the range starts beyond the final printable, it doesn't have any + * in it */ + if (start > MAX_PRINT_A) { + break; + } + + /* In both ASCII and EBCDIC, a SPACE is the lowest printable. To span + * all but two, the range must start and end no later than 2 from + * either end */ + if (start < ' ' + 2 && end > MAX_PRINT_A - 2) { + if (end > MAX_PRINT_A) { + end = MAX_PRINT_A; + } + if (start < ' ') { + start = ' '; + } + if (end - start >= MAX_PRINT_A - ' ' - 2) { + allow_literals = FALSE; + } + break; + } + } + invlist_iterfinish(invlist); + + /* Here we have figured things out. Output each range */ + invlist_iterinit(invlist); + while (invlist_iternext(invlist, &start, &end)) { + if (start >= NUM_ANYOF_CODE_POINTS) { + break; + } + put_range(sv, start, end, allow_literals); + } + invlist_iterfinish(invlist); + + return; +} + +STATIC SV* +S_put_charclass_bitmap_innards_common(pTHX_ + SV* invlist, /* The bitmap */ + SV* posixes, /* Under /l, things like [:word:], \S */ + SV* only_utf8, /* Under /d, matches iff the target is UTF-8 */ + SV* not_utf8, /* /d, matches iff the target isn't UTF-8 */ + SV* only_utf8_locale, /* Under /l, matches if the locale is UTF-8 */ + const bool invert /* Is the result to be inverted? */ +) +{ + /* Create and return an SV containing a displayable version of the bitmap + * and associated information determined by the input parameters. If the + * output would have been only the inversion indicator '^', NULL is instead + * returned. */ + + SV * output; + + PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS_COMMON; + + if (invert) { + output = newSVpvs("^"); + } + else { + output = newSVpvs(""); + } + + /* First, the code points in the bitmap that are unconditionally there */ + put_charclass_bitmap_innards_invlist(output, invlist); + + /* Traditionally, these have been placed after the main code points */ + if (posixes) { + sv_catsv(output, posixes); + } + + if (only_utf8 && _invlist_len(only_utf8)) { + Perl_sv_catpvf(aTHX_ output, "%s{utf8}%s", PL_colors[1], PL_colors[0]); + put_charclass_bitmap_innards_invlist(output, only_utf8); + } + + if (not_utf8 && _invlist_len(not_utf8)) { + Perl_sv_catpvf(aTHX_ output, "%s{not utf8}%s", PL_colors[1], PL_colors[0]); + put_charclass_bitmap_innards_invlist(output, not_utf8); + } + + if (only_utf8_locale && _invlist_len(only_utf8_locale)) { + Perl_sv_catpvf(aTHX_ output, "%s{utf8 locale}%s", PL_colors[1], PL_colors[0]); + put_charclass_bitmap_innards_invlist(output, only_utf8_locale); + + /* This is the only list in this routine that can legally contain code + * points outside the bitmap range. The call just above to + * 'put_charclass_bitmap_innards_invlist' will simply suppress them, so + * output them here. There's about a half-dozen possible, and none in + * contiguous ranges longer than 2 */ + if (invlist_highest(only_utf8_locale) >= NUM_ANYOF_CODE_POINTS) { + UV start, end; + SV* above_bitmap = NULL; + + _invlist_subtract(only_utf8_locale, PL_InBitmap, &above_bitmap); + + invlist_iterinit(above_bitmap); + while (invlist_iternext(above_bitmap, &start, &end)) { + UV i; + + for (i = start; i <= end; i++) { + put_code_point(output, i); + } + } + invlist_iterfinish(above_bitmap); + SvREFCNT_dec_NN(above_bitmap); + } + } + + if (invert && SvCUR(output) == 1) { + return NULL; + } + + return output; +} + +STATIC U8 +S_put_charclass_bitmap_innards(pTHX_ SV *sv, + char *bitmap, + SV *nonbitmap_invlist, + SV *only_utf8_locale_invlist, + const regnode * const node, + const U8 flags, + const bool force_as_is_display) +{ + /* Appends to 'sv' a displayable version of the innards of the bracketed + * character class defined by the other arguments: + * 'bitmap' points to the bitmap, or NULL if to ignore that. + * 'nonbitmap_invlist' is an inversion list of the code points that are in + * the bitmap range, but for some reason aren't in the bitmap; NULL if + * none. The reasons for this could be that they require some + * condition such as the target string being or not being in UTF-8 + * (under /d), or because they came from a user-defined property that + * was not resolved at the time of the regex compilation (under /u) + * 'only_utf8_locale_invlist' is an inversion list of the code points that + * are valid only if the runtime locale is a UTF-8 one; NULL if none + * 'node' is the regex pattern ANYOF node. It is needed only when the + * above two parameters are not null, and is passed so that this + * routine can tease apart the various reasons for them. + * 'flags' is the flags field of 'node' + * 'force_as_is_display' is TRUE if this routine should definitely NOT try + * to invert things to see if that leads to a cleaner display. If + * FALSE, this routine is free to use its judgment about doing this. + * + * It returns 0 if nothing was actually output. (It may be that + * the bitmap, etc is empty.) + * 1 if the output wasn't inverted (didn't begin with a '^') + * 2 if the output was inverted (did begin with a '^') + * + * When called for outputting the bitmap of a non-ANYOF node, just pass the + * bitmap, with the succeeding parameters set to NULL, and the final one to + * FALSE. + */ + + /* In general, it tries to display the 'cleanest' representation of the + * innards, choosing whether to display them inverted or not, regardless of + * whether the class itself is to be inverted. However, there are some + * cases where it can't try inverting, as what actually matches isn't known + * until runtime, and hence the inversion isn't either. */ + + bool inverting_allowed = ! force_as_is_display; + + int i; + STRLEN orig_sv_cur = SvCUR(sv); + + SV* invlist; /* Inversion list we accumulate of code points that + are unconditionally matched */ + SV* only_utf8 = NULL; /* Under /d, list of matches iff the target is + UTF-8 */ + SV* not_utf8 = NULL; /* /d, list of matches iff the target isn't UTF-8 + */ + SV* posixes = NULL; /* Under /l, string of things like [:word:], \D */ + SV* only_utf8_locale = NULL; /* Under /l, list of matches if the locale + is UTF-8 */ + + SV* as_is_display; /* The output string when we take the inputs + literally */ + SV* inverted_display; /* The output string when we invert the inputs */ + + bool invert = cBOOL(flags & ANYOF_INVERT); /* Is the input to be inverted + to match? */ + /* We are biased in favor of displaying things without them being inverted, + * as that is generally easier to understand */ + const int bias = 5; + + PERL_ARGS_ASSERT_PUT_CHARCLASS_BITMAP_INNARDS; + + /* Start off with whatever code points are passed in. (We clone, so we + * don't change the caller's list) */ + if (nonbitmap_invlist) { + assert(invlist_highest(nonbitmap_invlist) < NUM_ANYOF_CODE_POINTS); + invlist = invlist_clone(nonbitmap_invlist, NULL); + } + else { /* Worst case size is every other code point is matched */ + invlist = _new_invlist(NUM_ANYOF_CODE_POINTS / 2); + } + + if (flags) { + if (OP(node) == ANYOFD) { + + /* This flag indicates that the code points below 0x100 in the + * nonbitmap list are precisely the ones that match only when the + * target is UTF-8 (they should all be non-ASCII). */ + if (flags & ANYOF_HAS_EXTRA_RUNTIME_MATCHES) { + _invlist_intersection(invlist, PL_UpperLatin1, &only_utf8); + _invlist_subtract(invlist, only_utf8, &invlist); + } + + /* And this flag for matching all non-ASCII 0xFF and below */ + if (flags & ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared) { + not_utf8 = invlist_clone(PL_UpperLatin1, NULL); + } + } + else if (OP(node) == ANYOFL || OP(node) == ANYOFPOSIXL) { + + /* If either of these flags are set, what matches isn't + * determinable except during execution, so don't know enough here + * to invert */ + if (flags & (ANYOFL_FOLD|ANYOF_MATCHES_POSIXL)) { + inverting_allowed = FALSE; + } + + /* What the posix classes match also varies at runtime, so these + * will be output symbolically. */ + if (ANYOF_POSIXL_TEST_ANY_SET(node)) { + int i; + + posixes = newSVpvs(""); + for (i = 0; i < ANYOF_POSIXL_MAX; i++) { + if (ANYOF_POSIXL_TEST(node, i)) { + sv_catpv(posixes, anyofs[i]); + } + } + } + } + } + + /* Accumulate the bit map into the unconditional match list */ + if (bitmap) { + for (i = 0; i < NUM_ANYOF_CODE_POINTS; i++) { + if (BITMAP_TEST(bitmap, i)) { + int start = i++; + for (; + i < NUM_ANYOF_CODE_POINTS && BITMAP_TEST(bitmap, i); + i++) + { /* empty */ } + invlist = _add_range_to_invlist(invlist, start, i-1); + } + } + } + + /* Make sure that the conditional match lists don't have anything in them + * that match unconditionally; otherwise the output is quite confusing. + * This could happen if the code that populates these misses some + * duplication. */ + if (only_utf8) { + _invlist_subtract(only_utf8, invlist, &only_utf8); + } + if (not_utf8) { + _invlist_subtract(not_utf8, invlist, ¬_utf8); + } + + if (only_utf8_locale_invlist) { + + /* Since this list is passed in, we have to make a copy before + * modifying it */ + only_utf8_locale = invlist_clone(only_utf8_locale_invlist, NULL); + + _invlist_subtract(only_utf8_locale, invlist, &only_utf8_locale); + + /* And, it can get really weird for us to try outputting an inverted + * form of this list when it has things above the bitmap, so don't even + * try */ + if (invlist_highest(only_utf8_locale) >= NUM_ANYOF_CODE_POINTS) { + inverting_allowed = FALSE; + } + } + + /* Calculate what the output would be if we take the input as-is */ + as_is_display = put_charclass_bitmap_innards_common(invlist, + posixes, + only_utf8, + not_utf8, + only_utf8_locale, + invert); + + /* If have to take the output as-is, just do that */ + if (! inverting_allowed) { + if (as_is_display) { + sv_catsv(sv, as_is_display); + SvREFCNT_dec_NN(as_is_display); + } + } + else { /* But otherwise, create the output again on the inverted input, and + use whichever version is shorter */ + + int inverted_bias, as_is_bias; + + /* We will apply our bias to whichever of the results doesn't have + * the '^' */ + bool trial_invert; + if (invert) { + trial_invert = FALSE; + as_is_bias = bias; + inverted_bias = 0; + } + else { + trial_invert = TRUE; + as_is_bias = 0; + inverted_bias = bias; + } + + /* Now invert each of the lists that contribute to the output, + * excluding from the result things outside the possible range */ + + /* For the unconditional inversion list, we have to add in all the + * conditional code points, so that when inverted, they will be gone + * from it */ + _invlist_union(only_utf8, invlist, &invlist); + _invlist_union(not_utf8, invlist, &invlist); + _invlist_union(only_utf8_locale, invlist, &invlist); + _invlist_invert(invlist); + _invlist_intersection(invlist, PL_InBitmap, &invlist); + + if (only_utf8) { + _invlist_invert(only_utf8); + _invlist_intersection(only_utf8, PL_UpperLatin1, &only_utf8); + } + else if (not_utf8) { + + /* If a code point matches iff the target string is not in UTF-8, + * then complementing the result has it not match iff not in UTF-8, + * which is the same thing as matching iff it is UTF-8. */ + only_utf8 = not_utf8; + not_utf8 = NULL; + } + + if (only_utf8_locale) { + _invlist_invert(only_utf8_locale); + _invlist_intersection(only_utf8_locale, + PL_InBitmap, + &only_utf8_locale); + } + + inverted_display = put_charclass_bitmap_innards_common( + invlist, + posixes, + only_utf8, + not_utf8, + only_utf8_locale, trial_invert); + + /* Use the shortest representation, taking into account our bias + * against showing it inverted */ + if ( inverted_display + && ( ! as_is_display + || ( SvCUR(inverted_display) + inverted_bias + < SvCUR(as_is_display) + as_is_bias))) + { + sv_catsv(sv, inverted_display); + invert = ! invert; + } + else if (as_is_display) { + sv_catsv(sv, as_is_display); + } + + SvREFCNT_dec(as_is_display); + SvREFCNT_dec(inverted_display); + } + + SvREFCNT_dec_NN(invlist); + SvREFCNT_dec(only_utf8); + SvREFCNT_dec(not_utf8); + SvREFCNT_dec(posixes); + SvREFCNT_dec(only_utf8_locale); + + U8 did_output_something = (bool) (SvCUR(sv) > orig_sv_cur); + if (did_output_something) { + /* Distinguish between non and inverted cases */ + did_output_something += invert; + } + + return did_output_something; +} + + +const regnode * +Perl_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node, + const regnode *last, const regnode *plast, + SV* sv, I32 indent, U32 depth) +{ + const regnode *next; + const regnode *optstart= NULL; + + RXi_GET_DECL(r, ri); + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + PERL_ARGS_ASSERT_DUMPUNTIL; + +#ifdef DEBUG_DUMPUNTIL + Perl_re_printf( aTHX_ "--- %d : %d - %d - %d\n", indent, node-start, + last ? last-start : 0, plast ? plast-start : 0); +#endif + + if (plast && plast < last) + last= plast; + + while (node && (!last || node < last)) { + const U8 op = OP(node); + + if (op == CLOSE || op == SRCLOSE || op == WHILEM) + indent--; + next = regnext((regnode *)node); + const regnode *after = regnode_after((regnode *)node,0); + + /* Where, what. */ + if (op == OPTIMIZED) { + if (!optstart && RE_DEBUG_FLAG(RE_DEBUG_COMPILE_OPTIMISE)) + optstart = node; + else + goto after_print; + } else + CLEAR_OPTSTART; + + regprop(r, sv, node, NULL, NULL); + Perl_re_printf( aTHX_ "%4" IVdf ":%*s%s", (IV)(node - start), + (int)(2*indent + 1), "", SvPVX_const(sv)); + + if (op != OPTIMIZED) { + if (next == NULL) /* Next ptr. */ + Perl_re_printf( aTHX_ " (0)"); + else if (REGNODE_TYPE(op) == BRANCH + && REGNODE_TYPE(OP(next)) != BRANCH ) + Perl_re_printf( aTHX_ " (FAIL)"); + else + Perl_re_printf( aTHX_ " (%" IVdf ")", (IV)(next - start)); + Perl_re_printf( aTHX_ "\n"); + } + + after_print: + if (REGNODE_TYPE(op) == BRANCHJ) { + assert(next); + const regnode *nnode = (OP(next) == LONGJMP + ? regnext((regnode *)next) + : next); + if (last && nnode > last) + nnode = last; + DUMPUNTIL(after, nnode); + } + else if (REGNODE_TYPE(op) == BRANCH) { + assert(next); + DUMPUNTIL(after, next); + } + else if ( REGNODE_TYPE(op) == TRIE ) { + const regnode *this_trie = node; + const U32 n = ARG1u(node); + const reg_ac_data * const ac = op>=AHOCORASICK ? + (reg_ac_data *)ri->data->data[n] : + NULL; + const reg_trie_data * const trie = + (reg_trie_data*)ri->data->data[optrie]; +#ifdef DEBUGGING + AV *const trie_words + = MUTABLE_AV(ri->data->data[n + TRIE_WORDS_OFFSET]); +#endif + const regnode *nextbranch= NULL; + I32 word_idx; + SvPVCLEAR(sv); + for (word_idx= 0; word_idx < (I32)trie->wordcount; word_idx++) { + SV ** const elem_ptr = av_fetch_simple(trie_words, word_idx, 0); + + Perl_re_indentf( aTHX_ "%s ", + indent+3, + elem_ptr + ? pv_pretty(sv, SvPV_nolen_const(*elem_ptr), + SvCUR(*elem_ptr), PL_dump_re_max_len, + PL_colors[0], PL_colors[1], + (SvUTF8(*elem_ptr) + ? PERL_PV_ESCAPE_UNI + : 0) + | PERL_PV_PRETTY_ELLIPSES + | PERL_PV_PRETTY_LTGT + ) + : "???" + ); + if (trie->jump) { + U16 dist= trie->jump[word_idx+1]; + Perl_re_printf( aTHX_ "(%" UVuf ")\n", + (UV)((dist ? this_trie + dist : next) - start)); + if (dist) { + if (!nextbranch) + nextbranch= this_trie + trie->jump[0]; + DUMPUNTIL(this_trie + dist, nextbranch); + } + if (nextbranch && REGNODE_TYPE(OP(nextbranch))==BRANCH) + nextbranch= regnext((regnode *)nextbranch); + } else { + Perl_re_printf( aTHX_ "\n"); + } + } + if (last && next > last) + node= last; + else + node= next; + } + else if ( op == CURLY ) { /* "next" might be very big: optimizer */ + DUMPUNTIL(after, after + 1); /* +1 is NOT a REGNODE_AFTER */ + } + else if (REGNODE_TYPE(op) == CURLY && op != CURLYX) { + assert(next); + DUMPUNTIL(after, next); + } + else if ( op == PLUS || op == STAR) { + DUMPUNTIL(after, after + 1); /* +1 NOT a REGNODE_AFTER */ + } + else if (REGNODE_TYPE(op) == EXACT || op == ANYOFHs) { + /* Literal string, where present. */ + node = (const regnode *)REGNODE_AFTER_varies(node); + } + else { + node = REGNODE_AFTER_opcode(node,op); + } + if (op == CURLYX || op == OPEN || op == SROPEN) + indent++; + if (REGNODE_TYPE(op) == END) + break; + } + CLEAR_OPTSTART; +#ifdef DEBUG_DUMPUNTIL + Perl_re_printf( aTHX_ "--- %d\n", (int)indent); +#endif + return node; +} + +#endif /* DEBUGGING */ Index: gnu/usr.bin/perl/regcomp_internal.h =================================================================== RCS file: gnu/usr.bin/perl/regcomp_internal.h diff -N gnu/usr.bin/perl/regcomp_internal.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/regcomp_internal.h 21 Feb 2024 15:47:03 -0000 @@ -0,0 +1,1261 @@ +#ifndef REGCOMP_INTERNAL_H +#define REGCOMP_INTERNAL_H +#ifndef STATIC +#define STATIC static +#endif +#ifndef RE_OPTIMIZE_CURLYX_TO_CURLYM +#define RE_OPTIMIZE_CURLYX_TO_CURLYM 1 +#endif +#ifndef RE_OPTIMIZE_CURLYX_TO_CURLYN +#define RE_OPTIMIZE_CURLYX_TO_CURLYN 1 +#endif + +/* this is a chain of data about sub patterns we are processing that + need to be handled separately/specially in study_chunk. Its so + we can simulate recursion without losing state. */ +struct scan_frame; +typedef struct scan_frame { + regnode *last_regnode; /* last node to process in this frame */ + regnode *next_regnode; /* next node to process when last is reached */ + U32 prev_recursed_depth; + I32 stopparen; /* what stopparen do we use */ + bool in_gosub; /* this or an outer frame is for GOSUB */ + + struct scan_frame *this_prev_frame; /* this previous frame */ + struct scan_frame *prev_frame; /* previous frame */ + struct scan_frame *next_frame; /* next frame */ +} scan_frame; + +/* Certain characters are output as a sequence with the first being a + * backslash. */ +#define isBACKSLASHED_PUNCT(c) memCHRs("-[]\\^", c) + + +struct RExC_state_t { + U32 flags; /* RXf_* are we folding, multilining? */ + U32 pm_flags; /* PMf_* stuff from the calling PMOP */ + char *precomp; /* uncompiled string. */ + char *precomp_end; /* pointer to end of uncompiled string. */ + REGEXP *rx_sv; /* The SV that is the regexp. */ + regexp *rx; /* perl core regexp structure */ + regexp_internal *rxi; /* internal data for regexp object + pprivate field */ + char *start; /* Start of input for compile */ + char *end; /* End of input for compile */ + char *parse; /* Input-scan pointer. */ + char *copy_start; /* start of copy of input within + constructed parse string */ + char *save_copy_start; /* Provides one level of saving + and restoring 'copy_start' */ + char *copy_start_in_input; /* Position in input string + corresponding to copy_start */ + SSize_t whilem_seen; /* number of WHILEM in this expr */ + regnode *emit_start; /* Start of emitted-code area */ + regnode_offset emit; /* Code-emit pointer */ + I32 naughty; /* How bad is this pattern? */ + I32 sawback; /* Did we see \1, ...? */ + SSize_t size; /* Number of regnode equivalents in + pattern */ + Size_t sets_depth; /* Counts recursion depth of already- + compiled regex set patterns */ + U32 seen; + + I32 parens_buf_size; /* #slots malloced open/close_parens */ + regnode_offset *open_parens; /* offsets to open parens */ + regnode_offset *close_parens; /* offsets to close parens */ + HV *paren_names; /* Paren names */ + + /* position beyond 'precomp' of the warning message furthest away from + * 'precomp'. During the parse, no warnings are raised for any problems + * earlier in the parse than this position. This works if warnings are + * raised the first time a given spot is parsed, and if only one + * independent warning is raised for any given spot */ + Size_t latest_warn_offset; + + /* Branch reset /(?|...|...)/ gives us two concepts of capture buffer id. + * "Logical Parno" is the user visible view with branch reset taken into + * account. "Parno" (or physical parno) is the actual capture buffers in + * the pattern *NOT* taking into account branch reset. We also maintain + * a map of "next" pointers which allow us to skip to the next physical + * capture buffer with the same logical id, with 0 representing "none". + * + * As we compile we keep track of the two different counts using the + * 'logical_npar' and 'npar' members, and we keep track of the upper bound + * of both in 'total_par' and 'logical_total_par', we also populate + * the 'logical_to_parno' map, which gives us the first physical parno + * for a given logical parno, and the `parno_to_logical` array which gives + * us the logical id for each physical parno. When compilation is + * completed we construct the 'parno_to_logical_next' array from the + * 'parno_to_logical' array. (We do not bother constructing it during + * compilation as we do not need it, and we can construct it in O(N) time + * once we are done, but would need more complicated logic during the + * compile, because we want the next pointers to go from smallest to + * largest, eg, left to right.) + * + * Logical: $1 $2 $3 $4 $2 $3 $2 $5 + * Physical: 1 2 3 4 5 6 7 8 + * Next: 0 5 6 0 7 0 0 0 + * Pattern /(a) (?| (b) (c) (d) | (e) (f) | (g) ) (h)/ + * + * As much as possible the internals use and store the physical id of + * of capture buffers. We decode the physical to the logical only when + * we need to, for instance when someone use $2. + * + * Note that when branch reset is not used logical and physical are the + * same and the next data would be all zero. So when branch reset is not + * used we do not need to populate this data into the final regexp. + * + */ + I32 *logical_to_parno; /* logical_parno to parno */ + I32 *parno_to_logical; /* parno to logical_parno */ + I32 *parno_to_logical_next; /* parno to next (greater value) + parno with the same + logical_parno as parno.*/ + + I32 npar; /* Capture buffer count so far in the + parse, (OPEN) plus one. ("par" 0 is + the whole pattern)*/ + I32 logical_npar; /* Logical version of npar */ + I32 total_par; /* During initial parse, is either 0, + or -1; the latter indicating a + reparse is needed. After that pass, + it is what 'npar' became after the + pass. Hence, it being > 0 indicates + we are in a reparse situation */ + I32 logical_total_par; /* Logical version to total par */ + I32 nestroot; /* root parens we are in - used by + accept */ + I32 seen_zerolen; + regnode *end_op; /* END node in program */ + I32 utf8; /* whether the pattern is utf8 or not */ + I32 orig_utf8; /* whether the pattern was originally in utf8 */ + /* XXX use this for future optimisation of case + * where pattern must be upgraded to utf8. */ + I32 uni_semantics; /* If a d charset modifier should use unicode + rules, even if the pattern is not in + utf8 */ + + I32 recurse_count; /* Number of recurse regops we have generated */ + regnode **recurse; /* Recurse regops */ + U8 *study_chunk_recursed; /* bitmap of which subs we have moved + through */ + U32 study_chunk_recursed_bytes; /* bytes in bitmap */ + I32 in_lookaround; + I32 contains_locale; + I32 override_recoding; + I32 recode_x_to_native; + I32 in_multi_char_class; + int code_index; /* next code_blocks[] slot */ + struct reg_code_blocks *code_blocks;/* positions of literal (?{}) + within pattern */ + SSize_t maxlen; /* mininum possible number of chars in string to match */ + scan_frame *frame_head; + scan_frame *frame_last; + U32 frame_count; + AV *warn_text; + HV *unlexed_names; + SV *runtime_code_qr; /* qr with the runtime code blocks */ +#ifdef DEBUGGING + const char *lastparse; + I32 lastnum; + U32 study_chunk_recursed_count; + AV *paren_name_list; /* idx -> name */ + SV *mysv1; + SV *mysv2; +#endif + bool seen_d_op; + bool strict; + bool study_started; + bool in_script_run; + bool use_BRANCHJ; + bool sWARN_EXPERIMENTAL__VLB; + bool sWARN_EXPERIMENTAL__REGEX_SETS; +}; + +#ifdef DEBUGGING +#define RExC_lastparse (pRExC_state->lastparse) +#define RExC_lastnum (pRExC_state->lastnum) +#define RExC_paren_name_list (pRExC_state->paren_name_list) +#define RExC_study_chunk_recursed_count (pRExC_state->study_chunk_recursed_count) +#define RExC_mysv (pRExC_state->mysv1) +#define RExC_mysv1 (pRExC_state->mysv1) +#define RExC_mysv2 (pRExC_state->mysv2) +#endif + +#define RExC_flags (pRExC_state->flags) +#define RExC_pm_flags (pRExC_state->pm_flags) +#define RExC_precomp (pRExC_state->precomp) +#define RExC_copy_start_in_input (pRExC_state->copy_start_in_input) +#define RExC_copy_start_in_constructed (pRExC_state->copy_start) +#define RExC_save_copy_start_in_constructed (pRExC_state->save_copy_start) +#define RExC_precomp_end (pRExC_state->precomp_end) +#define RExC_rx_sv (pRExC_state->rx_sv) +#define RExC_rx (pRExC_state->rx) +#define RExC_rxi (pRExC_state->rxi) +#define RExC_start (pRExC_state->start) +#define RExC_end (pRExC_state->end) +#define RExC_parse (pRExC_state->parse) +#define RExC_latest_warn_offset (pRExC_state->latest_warn_offset ) +#define RExC_whilem_seen (pRExC_state->whilem_seen) +#define RExC_seen_d_op (pRExC_state->seen_d_op) /* Seen something that differs + under /d from /u ? */ + +#define RExC_emit (pRExC_state->emit) +#define RExC_emit_start (pRExC_state->emit_start) +#define RExC_sawback (pRExC_state->sawback) +#define RExC_seen (pRExC_state->seen) +#define RExC_size (pRExC_state->size) +#define RExC_maxlen (pRExC_state->maxlen) +#define RExC_logical_npar (pRExC_state->logical_npar) +#define RExC_logical_total_parens (pRExC_state->logical_total_par) +#define RExC_logical_to_parno (pRExC_state->logical_to_parno) +#define RExC_parno_to_logical (pRExC_state->parno_to_logical) +#define RExC_parno_to_logical_next (pRExC_state->parno_to_logical_next) +#define RExC_npar (pRExC_state->npar) +#define RExC_total_parens (pRExC_state->total_par) +#define RExC_parens_buf_size (pRExC_state->parens_buf_size) +#define RExC_nestroot (pRExC_state->nestroot) +#define RExC_seen_zerolen (pRExC_state->seen_zerolen) +#define RExC_utf8 (pRExC_state->utf8) +#define RExC_uni_semantics (pRExC_state->uni_semantics) +#define RExC_orig_utf8 (pRExC_state->orig_utf8) +#define RExC_open_parens (pRExC_state->open_parens) +#define RExC_close_parens (pRExC_state->close_parens) +#define RExC_end_op (pRExC_state->end_op) +#define RExC_paren_names (pRExC_state->paren_names) +#define RExC_recurse (pRExC_state->recurse) +#define RExC_recurse_count (pRExC_state->recurse_count) +#define RExC_sets_depth (pRExC_state->sets_depth) +#define RExC_study_chunk_recursed (pRExC_state->study_chunk_recursed) +#define RExC_study_chunk_recursed_bytes \ + (pRExC_state->study_chunk_recursed_bytes) +#define RExC_in_lookaround (pRExC_state->in_lookaround) +#define RExC_contains_locale (pRExC_state->contains_locale) +#define RExC_recode_x_to_native (pRExC_state->recode_x_to_native) + +#ifdef EBCDIC +# define SET_recode_x_to_native(x) \ + STMT_START { RExC_recode_x_to_native = (x); } STMT_END +#else +# define SET_recode_x_to_native(x) NOOP +#endif + +#define RExC_in_multi_char_class (pRExC_state->in_multi_char_class) +#define RExC_frame_head (pRExC_state->frame_head) +#define RExC_frame_last (pRExC_state->frame_last) +#define RExC_frame_count (pRExC_state->frame_count) +#define RExC_strict (pRExC_state->strict) +#define RExC_study_started (pRExC_state->study_started) +#define RExC_warn_text (pRExC_state->warn_text) +#define RExC_in_script_run (pRExC_state->in_script_run) +#define RExC_use_BRANCHJ (pRExC_state->use_BRANCHJ) +#define RExC_warned_WARN_EXPERIMENTAL__VLB (pRExC_state->sWARN_EXPERIMENTAL__VLB) +#define RExC_warned_WARN_EXPERIMENTAL__REGEX_SETS (pRExC_state->sWARN_EXPERIMENTAL__REGEX_SETS) +#define RExC_unlexed_names (pRExC_state->unlexed_names) + + +/***********************************************************************/ +/* UTILITY MACROS FOR ADVANCING OR SETTING THE PARSE "CURSOR" RExC_parse + * + * All of these macros depend on the above RExC_ accessor macros, which + * in turns depend on a variable pRExC_state being in scope where they + * are used. This is the standard regexp parser context variable which is + * passed into every non-trivial parse function in this file. + * + * Note that the UTF macro is itself a wrapper around RExC_utf8, so all + * of the macros which do not take an argument will operate on the + * pRExC_state structure *only*. + * + * Please do NOT modify RExC_parse without using these macros. In the + * future these macros will be extended for enhanced debugging and trace + * output during the parse process. + */ + +/* RExC_parse_incf(flag) + * + * Increment RExC_parse to point at the next codepoint, while doing + * the right thing depending on whether we are parsing UTF-8 strings + * or not. The 'flag' argument determines if content is UTF-8 or not, + * intended for cases where this is NOT governed by the UTF macro. + * + * Use RExC_parse_inc() if UTF-8ness is controlled by the UTF macro. + * + * WARNING: Does NOT take into account RExC_end; it is the callers + * responsibility to make sure there are enough octets left in + * RExC_parse to ensure that when processing UTF-8 we would not read + * past the end of the string. + */ +#define RExC_parse_incf(flag) STMT_START { \ + RExC_parse += (flag) ? UTF8SKIP(RExC_parse) : 1; \ +} STMT_END + +/* RExC_parse_inc_safef(flag) + * + * Safely increment RExC_parse to point at the next codepoint, + * doing the right thing depending on whether we are parsing + * UTF-8 strings or not and NOT reading past the end of the buffer. + * The 'flag' argument determines if content is UTF-8 or not, + * intended for cases where this is NOT governed by the UTF macro. + * + * Use RExC_parse_safe() if UTF-8ness is controlled by the UTF macro. + * + * NOTE: Will NOT read past RExC_end when content is UTF-8. + */ +#define RExC_parse_inc_safef(flag) STMT_START { \ + RExC_parse += (flag) ? UTF8_SAFE_SKIP(RExC_parse,RExC_end) : 1; \ +} STMT_END + +/* RExC_parse_inc() + * + * Increment RExC_parse to point at the next codepoint, + * doing the right thing depending on whether we are parsing + * UTF-8 strings or not. + * + * WARNING: Does NOT take into account RExC_end, it is the callers + * responsibility to make sure there are enough octets left in + * RExC_parse to ensure that when processing UTF-8 we would not read + * past the end of the string. + * + * NOTE: whether we are parsing UTF-8 or not is determined by the + * UTF macro which is defined as cBOOL(RExC_parse_utf8), thus this + * macro operates on the pRExC_state structure only. + */ +#define RExC_parse_inc() RExC_parse_incf(UTF) + +/* RExC_parse_inc_safe() + * + * Safely increment RExC_parse to point at the next codepoint, + * doing the right thing depending on whether we are parsing + * UTF-8 strings or not and NOT reading past the end of the buffer. + * + * NOTE: whether we are parsing UTF-8 or not is determined by the + * UTF macro which is defined as cBOOL(RExC_parse_utf8), thus this + * macro operates on the pRExC_state structure only. + */ +#define RExC_parse_inc_safe() RExC_parse_inc_safef(UTF) + +/* RExC_parse_inc_utf8() + * + * Increment RExC_parse to point at the next utf8 codepoint, + * assumes content is UTF-8. + * + * WARNING: Does NOT take into account RExC_end; it is the callers + * responsibility to make sure there are enough octets left in RExC_parse + * to ensure that when processing UTF-8 we would not read past the end + * of the string. + */ +#define RExC_parse_inc_utf8() STMT_START { \ + RExC_parse += UTF8SKIP(RExC_parse); \ +} STMT_END + +/* RExC_parse_inc_if_char() + * + * Increment RExC_parse to point at the next codepoint, if and only + * if the current parse point is NOT a NULL, while doing the right thing + * depending on whether we are parsing UTF-8 strings or not. + * + * WARNING: Does NOT take into account RExC_end, it is the callers + * responsibility to make sure there are enough octets left in RExC_parse + * to ensure that when processing UTF-8 we would not read past the end + * of the string. + * + * NOTE: whether we are parsing UTF-8 or not is determined by the + * UTF macro which is defined as cBOOL(RExC_parse_utf8), thus this + * macro operates on the pRExC_state structure only. + */ +#define RExC_parse_inc_if_char() STMT_START { \ + RExC_parse += SKIP_IF_CHAR(RExC_parse,RExC_end); \ +} STMT_END + +/* RExC_parse_inc_by(n_octets) + * + * Increment the parse cursor by the number of octets specified by + * the 'n_octets' argument. + * + * NOTE: Does NOT check ANY constraints. It is the callers responsibility + * that this will not move past the end of the string, or leave the + * pointer in the middle of a UTF-8 sequence. + * + * Typically used to advanced past previously analyzed content. + */ +#define RExC_parse_inc_by(n_octets) STMT_START { \ + RExC_parse += (n_octets); \ +} STMT_END + +/* RExC_parse_set(to_ptr) + * + * Sets the RExC_parse pointer to the pointer specified by the 'to' + * argument. No validation whatsoever is performed on the to pointer. + */ +#define RExC_parse_set(to_ptr) STMT_START { \ + RExC_parse = (to_ptr); \ +} STMT_END + +/**********************************************************************/ + +/* Heuristic check on the complexity of the pattern: if TOO_NAUGHTY, we set + * a flag to disable back-off on the fixed/floating substrings - if it's + * a high complexity pattern we assume the benefit of avoiding a full match + * is worth the cost of checking for the substrings even if they rarely help. + */ +#define RExC_naughty (pRExC_state->naughty) +#define TOO_NAUGHTY (10) +#define MARK_NAUGHTY(add) \ + if (RExC_naughty < TOO_NAUGHTY) \ + RExC_naughty += (add) +#define MARK_NAUGHTY_EXP(exp, add) \ + if (RExC_naughty < TOO_NAUGHTY) \ + RExC_naughty += RExC_naughty / (exp) + (add) + +#define isNON_BRACE_QUANTIFIER(c) ((c) == '*' || (c) == '+' || (c) == '?') +#define isQUANTIFIER(s,e) ( isNON_BRACE_QUANTIFIER(*s) \ + || ((*s) == '{' && regcurly(s, e, NULL))) + +/* + * Flags to be passed up. + */ +#define HASWIDTH 0x01 /* Known to not match null strings, could match + non-null ones. */ +#define SIMPLE 0x02 /* Exactly one character wide */ + /* (or LNBREAK as a special case) */ +#define POSTPONED 0x08 /* (?1),(?&name), (??{...}) or similar */ +#define TRYAGAIN 0x10 /* Weeded out a declaration. */ +#define RESTART_PARSE 0x20 /* Need to redo the parse */ +#define NEED_UTF8 0x40 /* In conjunction with RESTART_PARSE, need to + calcuate sizes as UTF-8 */ + +#define REG_NODE_NUM(x) ((x) ? (int)((x)-RExC_emit_start) : -1) + +/* whether trie related optimizations are enabled */ +#if PERL_ENABLE_EXTENDED_TRIE_OPTIMISATION +#define TRIE_STUDY_OPT +#define FULL_TRIE_STUDY +#define TRIE_STCLASS +#endif + +/* About the term "restudy" and the var "restudied" and the defines + * "SCF_TRIE_RESTUDY" and "SCF_TRIE_DOING_RESTUDY": All of these relate to + * doing multiple study_chunk() calls over the same set of opcodes for* the + * purpose of enhanced TRIE optimizations. + * + * Specifically, when TRIE_STUDY_OPT is defined, and it is defined in normal + * builds, (see above), during compilation SCF_TRIE_RESTUDY may be enabled + * which then causes the Perl_re_op_compile() to then call the optimizer + * S_study_chunk() a second time to perform additional optimizations, + * including the aho_corasick startclass optimization. + * This additional pass will only happen once, which is managed by the + * 'restudied' variable in Perl_re_op_compile(). + * + * When this second pass is under way the flags passed into study_chunk() will + * include SCF_TRIE_DOING_RESTUDY and this flag is and must be cascaded down + * to any recursive calls to S_study_chunk(). + * + * IMPORTANT: Any logic in study_chunk() that emits warnings should check that + * the SCF_TRIE_DOING_RESTUDY flag is NOT set in 'flags', or the warning may + * be produced twice. + * + * See commit 07be1b83a6b2d24b492356181ddf70e1c7917ae3 and + * 688e03912e3bff2d2419c457d8b0e1bab3eb7112 for more details. + */ + + +#define PBYTE(u8str,paren) ((U8*)(u8str))[(paren) >> 3] +#define PBITVAL(paren) (1 << ((paren) & 7)) +#define PAREN_OFFSET(depth) \ + (RExC_study_chunk_recursed + (depth) * RExC_study_chunk_recursed_bytes) +#define PAREN_TEST(depth, paren) \ + (PBYTE(PAREN_OFFSET(depth), paren) & PBITVAL(paren)) +#define PAREN_SET(depth, paren) \ + (PBYTE(PAREN_OFFSET(depth), paren) |= PBITVAL(paren)) +#define PAREN_UNSET(depth, paren) \ + (PBYTE(PAREN_OFFSET(depth), paren) &= ~PBITVAL(paren)) + +#define REQUIRE_UTF8(flagp) STMT_START { \ + if (!UTF) { \ + *flagp = RESTART_PARSE|NEED_UTF8; \ + return 0; \ + } \ + } STMT_END + +/* /u is to be chosen if we are supposed to use Unicode rules, or if the + * pattern is in UTF-8. This latter condition is in case the outermost rules + * are locale. See GH #17278 */ +#define toUSE_UNI_CHARSET_NOT_DEPENDS (RExC_uni_semantics || UTF) + +/* Change from /d into /u rules, and restart the parse. RExC_uni_semantics is + * a flag that indicates we need to override /d with /u as a result of + * something in the pattern. It should only be used in regards to calling + * set_regex_charset() or get_regex_charset() */ +#define REQUIRE_UNI_RULES(flagp, restart_retval) \ + STMT_START { \ + if (DEPENDS_SEMANTICS) { \ + set_regex_charset(&RExC_flags, REGEX_UNICODE_CHARSET); \ + RExC_uni_semantics = 1; \ + if (RExC_seen_d_op && LIKELY(! IN_PARENS_PASS)) { \ + /* No need to restart the parse if we haven't seen \ + * anything that differs between /u and /d, and no need \ + * to restart immediately if we're going to reparse \ + * anyway to count parens */ \ + *flagp |= RESTART_PARSE; \ + return restart_retval; \ + } \ + } \ + } STMT_END + +#define REQUIRE_BRANCHJ(flagp, restart_retval) \ + STMT_START { \ + RExC_use_BRANCHJ = 1; \ + *flagp |= RESTART_PARSE; \ + return restart_retval; \ + } STMT_END + +/* Until we have completed the parse, we leave RExC_total_parens at 0 or + * less. After that, it must always be positive, because the whole re is + * considered to be surrounded by virtual parens. Setting it to negative + * indicates there is some construct that needs to know the actual number of + * parens to be properly handled. And that means an extra pass will be + * required after we've counted them all */ +#define ALL_PARENS_COUNTED (RExC_total_parens > 0) +#define REQUIRE_PARENS_PASS \ + STMT_START { /* No-op if have completed a pass */ \ + if (! ALL_PARENS_COUNTED) RExC_total_parens = -1; \ + } STMT_END +#define IN_PARENS_PASS (RExC_total_parens < 0) + + +/* This is used to return failure (zero) early from the calling function if + * various flags in 'flags' are set. Two flags always cause a return: + * 'RESTART_PARSE' and 'NEED_UTF8'. 'extra' can be used to specify any + * additional flags that should cause a return; 0 if none. If the return will + * be done, '*flagp' is first set to be all of the flags that caused the + * return. */ +#define RETURN_FAIL_ON_RESTART_OR_FLAGS(flags,flagp,extra) \ + STMT_START { \ + if ((flags) & (RESTART_PARSE|NEED_UTF8|(extra))) { \ + *(flagp) = (flags) & (RESTART_PARSE|NEED_UTF8|(extra)); \ + return 0; \ + } \ + } STMT_END + +#define MUST_RESTART(flags) ((flags) & (RESTART_PARSE)) + +#define RETURN_FAIL_ON_RESTART(flags,flagp) \ + RETURN_FAIL_ON_RESTART_OR_FLAGS( flags, flagp, 0) +#define RETURN_FAIL_ON_RESTART_FLAGP(flagp) \ + if (MUST_RESTART(*(flagp))) return 0 + +/* This converts the named class defined in regcomp.h to its equivalent class + * number defined in handy.h. */ +#define namedclass_to_classnum(class) ((int) ((class) / 2)) +#define classnum_to_namedclass(classnum) ((classnum) * 2) + +#define _invlist_union_complement_2nd(a, b, output) \ + _invlist_union_maybe_complement_2nd(a, b, TRUE, output) +#define _invlist_intersection_complement_2nd(a, b, output) \ + _invlist_intersection_maybe_complement_2nd(a, b, TRUE, output) + +/* We add a marker if we are deferring expansion of a property that is both + * 1) potentiallly user-defined; and + * 2) could also be an official Unicode property. + * + * Without this marker, any deferred expansion can only be for a user-defined + * one. This marker shouldn't conflict with any that could be in a legal name, + * and is appended to its name to indicate this. There is a string and + * character form */ +#define DEFERRED_COULD_BE_OFFICIAL_MARKERs "~" +#define DEFERRED_COULD_BE_OFFICIAL_MARKERc '~' + +/* What is infinity for optimization purposes */ +#define OPTIMIZE_INFTY SSize_t_MAX + +/* About scan_data_t. + + During optimisation we recurse through the regexp program performing + various inplace (keyhole style) optimisations. In addition study_chunk + and scan_commit populate this data structure with information about + what strings MUST appear in the pattern. We look for the longest + string that must appear at a fixed location, and we look for the + longest string that may appear at a floating location. So for instance + in the pattern: + + /FOO[xX]A.*B[xX]BAR/ + + Both 'FOO' and 'A' are fixed strings. Both 'B' and 'BAR' are floating + strings (because they follow a .* construct). study_chunk will identify + both FOO and BAR as being the longest fixed and floating strings respectively. + + The strings can be composites, for instance + + /(f)(o)(o)/ + + will result in a composite fixed substring 'foo'. + + For each string some basic information is maintained: + + - min_offset + This is the position the string must appear at, or not before. + It also implicitly (when combined with minlenp) tells us how many + characters must match before the string we are searching for. + Likewise when combined with minlenp and the length of the string it + tells us how many characters must appear after the string we have + found. + + - max_offset + Only used for floating strings. This is the rightmost point that + the string can appear at. If set to OPTIMIZE_INFTY it indicates that the + string can occur infinitely far to the right. + For fixed strings, it is equal to min_offset. + + - minlenp + A pointer to the minimum number of characters of the pattern that the + string was found inside. This is important as in the case of positive + lookahead or positive lookbehind we can have multiple patterns + involved. Consider + + /(?=FOO).*F/ + + The minimum length of the pattern overall is 3, the minimum length + of the lookahead part is 3, but the minimum length of the part that + will actually match is 1. So 'FOO's minimum length is 3, but the + minimum length for the F is 1. This is important as the minimum length + is used to determine offsets in front of and behind the string being + looked for. Since strings can be composites this is the length of the + pattern at the time it was committed with a scan_commit. Note that + the length is calculated by study_chunk, so that the minimum lengths + are not known until the full pattern has been compiled, thus the + pointer to the value. + + - lookbehind + + In the case of lookbehind the string being searched for can be + offset past the start point of the final matching string. + If this value was just blithely removed from the min_offset it would + invalidate some of the calculations for how many chars must match + before or after (as they are derived from min_offset and minlen and + the length of the string being searched for). + When the final pattern is compiled and the data is moved from the + scan_data_t structure into the regexp structure the information + about lookbehind is factored in, with the information that would + have been lost precalculated in the end_shift field for the + associated string. + + The fields pos_min and pos_delta are used to store the minimum offset + and the delta to the maximum offset at the current point in the pattern. + +*/ + +struct scan_data_substrs { + SV *str; /* longest substring found in pattern */ + SSize_t min_offset; /* earliest point in string it can appear */ + SSize_t max_offset; /* latest point in string it can appear */ + SSize_t *minlenp; /* pointer to the minlen relevant to the string */ + SSize_t lookbehind; /* is the pos of the string modified by LB */ + I32 flags; /* per substring SF_* and SCF_* flags */ +}; + +/* this is typedef'ed in perl.h */ +struct scan_data_t { + /*I32 len_min; unused */ + /*I32 len_delta; unused */ + SSize_t pos_min; + SSize_t pos_delta; + SV *last_found; + SSize_t last_end; /* min value, <0 unless valid. */ + SSize_t last_start_min; + SSize_t last_start_max; + U8 cur_is_floating; /* whether the last_* values should be set as + * the next fixed (0) or floating (1) + * substring */ + + /* [0] is longest fixed substring so far, [1] is longest float so far */ + struct scan_data_substrs substrs[2]; + + I32 flags; /* common SF_* and SCF_* flags */ + I32 whilem_c; + SSize_t *last_closep; + regnode **last_close_opp; /* pointer to pointer to last CLOSE regop + seen. DO NOT DEREFERENCE the regnode + pointer - the op may have been optimized + away */ + regnode_ssc *start_class; +}; + +/* + * Forward declarations for pregcomp()'s friends. + */ + +static const scan_data_t zero_scan_data = { + 0, 0, NULL, 0, 0, 0, 0, + { + { NULL, 0, 0, 0, 0, 0 }, + { NULL, 0, 0, 0, 0, 0 }, + }, + 0, 0, NULL, NULL, NULL +}; + +/* study flags */ + +#define SF_BEFORE_SEOL 0x0001 +#define SF_BEFORE_MEOL 0x0002 +#define SF_BEFORE_EOL (SF_BEFORE_SEOL|SF_BEFORE_MEOL) + +#define SF_IS_INF 0x0040 +#define SF_HAS_PAR 0x0080 +#define SF_IN_PAR 0x0100 +#define SF_HAS_EVAL 0x0200 + + +/* SCF_DO_SUBSTR is the flag that tells the regexp analyzer to track the + * longest substring in the pattern. When it is not set the optimiser keeps + * track of position, but does not keep track of the actual strings seen, + * + * So for instance /foo/ will be parsed with SCF_DO_SUBSTR being true, but + * /foo/i will not. + * + * Similarly, /foo.*(blah|erm|huh).*fnorble/ will have "foo" and "fnorble" + * parsed with SCF_DO_SUBSTR on, but while processing the (...) it will be + * turned off because of the alternation (BRANCH). */ +#define SCF_DO_SUBSTR 0x0400 + +#define SCF_DO_STCLASS_AND 0x0800 +#define SCF_DO_STCLASS_OR 0x1000 +#define SCF_DO_STCLASS (SCF_DO_STCLASS_AND|SCF_DO_STCLASS_OR) +#define SCF_WHILEM_VISITED_POS 0x2000 + +#define SCF_TRIE_RESTUDY 0x4000 /* Need to do restudy in study_chunk()? + Search for "restudy" in this file + to find a detailed explanation.*/ +#define SCF_SEEN_ACCEPT 0x8000 +#define SCF_TRIE_DOING_RESTUDY 0x10000 /* Are we in restudy right now? + Search for "restudy" in this file + to find a detailed explanation. */ +#define SCF_IN_DEFINE 0x20000 + + + +#define UTF cBOOL(RExC_utf8) + +/* The enums for all these are ordered so things work out correctly */ +#define LOC (get_regex_charset(RExC_flags) == REGEX_LOCALE_CHARSET) +#define DEPENDS_SEMANTICS (get_regex_charset(RExC_flags) \ + == REGEX_DEPENDS_CHARSET) +#define UNI_SEMANTICS (get_regex_charset(RExC_flags) == REGEX_UNICODE_CHARSET) +#define AT_LEAST_UNI_SEMANTICS (get_regex_charset(RExC_flags) \ + >= REGEX_UNICODE_CHARSET) +#define ASCII_RESTRICTED (get_regex_charset(RExC_flags) \ + == REGEX_ASCII_RESTRICTED_CHARSET) +#define AT_LEAST_ASCII_RESTRICTED (get_regex_charset(RExC_flags) \ + >= REGEX_ASCII_RESTRICTED_CHARSET) +#define ASCII_FOLD_RESTRICTED (get_regex_charset(RExC_flags) \ + == REGEX_ASCII_MORE_RESTRICTED_CHARSET) + +#define FOLD cBOOL(RExC_flags & RXf_PMf_FOLD) + +/* For programs that want to be strictly Unicode compatible by dying if any + * attempt is made to match a non-Unicode code point against a Unicode + * property. */ +#define ALWAYS_WARN_SUPER ckDEAD(packWARN(WARN_NON_UNICODE)) + +#define OOB_NAMEDCLASS -1 + +/* There is no code point that is out-of-bounds, so this is problematic. But + * its only current use is to initialize a variable that is always set before + * looked at. */ +#define OOB_UNICODE 0xDEADBEEF + +#define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv)) + + +/* length of regex to show in messages that don't mark a position within */ +#define RegexLengthToShowInErrorMessages 127 + +/* + * If MARKER[12] are adjusted, be sure to adjust the constants at the top + * of t/op/regmesg.t, the tests in t/op/re_tests, and those in + * op/pragma/warn/regcomp. + */ +#define MARKER1 "<-- HERE" /* marker as it appears in the description */ +#define MARKER2 " <-- HERE " /* marker as it appears within the regex */ + +#define REPORT_LOCATION " in regex; marked by " MARKER1 \ + " in m/%" UTF8f MARKER2 "%" UTF8f "/" + +/* The code in this file in places uses one level of recursion with parsing + * rebased to an alternate string constructed by us in memory. This can take + * the form of something that is completely different from the input, or + * something that uses the input as part of the alternate. In the first case, + * there should be no possibility of an error, as we are in complete control of + * the alternate string. But in the second case we don't completely control + * the input portion, so there may be errors in that. Here's an example: + * /[abc\x{DF}def]/ui + * is handled specially because \x{df} folds to a sequence of more than one + * character: 'ss'. What is done is to create and parse an alternate string, + * which looks like this: + * /(?:\x{DF}|[abc\x{DF}def])/ui + * where it uses the input unchanged in the middle of something it constructs, + * which is a branch for the DF outside the character class, and clustering + * parens around the whole thing. (It knows enough to skip the DF inside the + * class while in this substitute parse.) 'abc' and 'def' may have errors that + * need to be reported. The general situation looks like this: + * + * |<------- identical ------>| + * sI tI xI eI + * Input: --------------------------------------------------------------- + * Constructed: --------------------------------------------------- + * sC tC xC eC EC + * |<------- identical ------>| + * + * sI..eI is the portion of the input pattern we are concerned with here. + * sC..EC is the constructed substitute parse string. + * sC..tC is constructed by us + * tC..eC is an exact duplicate of the portion of the input pattern tI..eI. + * In the diagram, these are vertically aligned. + * eC..EC is also constructed by us. + * xC is the position in the substitute parse string where we found a + * problem. + * xI is the position in the original pattern corresponding to xC. + * + * We want to display a message showing the real input string. Thus we need to + * translate from xC to xI. We know that xC >= tC, since the portion of the + * string sC..tC has been constructed by us, and so shouldn't have errors. We + * get: + * xI = tI + (xC - tC) + * + * When the substitute parse is constructed, the code needs to set: + * RExC_start (sC) + * RExC_end (eC) + * RExC_copy_start_in_input (tI) + * RExC_copy_start_in_constructed (tC) + * and restore them when done. + * + * During normal processing of the input pattern, both + * 'RExC_copy_start_in_input' and 'RExC_copy_start_in_constructed' are set to + * sI, so that xC equals xI. + */ + +#define sI RExC_precomp +#define eI RExC_precomp_end +#define sC RExC_start +#define eC RExC_end +#define tI RExC_copy_start_in_input +#define tC RExC_copy_start_in_constructed +#define xI(xC) (tI + (xC - tC)) +#define xI_offset(xC) (xI(xC) - sI) + +#define REPORT_LOCATION_ARGS(xC) \ + UTF8fARG(UTF, \ + (xI(xC) > eI) /* Don't run off end */ \ + ? eI - sI /* Length before the <--HERE */ \ + : ((xI_offset(xC) >= 0) \ + ? xI_offset(xC) \ + : (Perl_croak(aTHX_ "panic: %s: %d: negative offset: %" \ + IVdf " trying to output message for " \ + " pattern %.*s", \ + __FILE__, __LINE__, (IV) xI_offset(xC), \ + ((int) (eC - sC)), sC), 0)), \ + sI), /* The input pattern printed up to the <--HERE */ \ + UTF8fARG(UTF, \ + (xI(xC) > eI) ? 0 : eI - xI(xC), /* Length after <--HERE */ \ + (xI(xC) > eI) ? eI : xI(xC)) /* pattern after <--HERE */ + +/* Used to point after bad bytes for an error message, but avoid skipping + * past a nul byte. */ +#define SKIP_IF_CHAR(s, e) (!*(s) ? 0 : UTF ? UTF8_SAFE_SKIP(s, e) : 1) + +/* Set up to clean up after our imminent demise */ +#define PREPARE_TO_DIE \ + STMT_START { \ + if (RExC_rx_sv) \ + SAVEFREESV(RExC_rx_sv); \ + if (RExC_open_parens) \ + SAVEFREEPV(RExC_open_parens); \ + if (RExC_close_parens) \ + SAVEFREEPV(RExC_close_parens); \ + if (RExC_logical_to_parno) \ + SAVEFREEPV(RExC_logical_to_parno); \ + if (RExC_parno_to_logical) \ + SAVEFREEPV(RExC_parno_to_logical); \ + } STMT_END + +/* + * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given + * arg. Show regex, up to a maximum length. If it's too long, chop and add + * "...". + */ +#define _FAIL(code) STMT_START { \ + const char *ellipses = ""; \ + IV len = RExC_precomp_end - RExC_precomp; \ + \ + PREPARE_TO_DIE; \ + if (len > RegexLengthToShowInErrorMessages) { \ + /* chop 10 shorter than the max, to ensure meaning of "..." */ \ + len = RegexLengthToShowInErrorMessages - 10; \ + ellipses = "..."; \ + } \ + code; \ +} STMT_END + +#define FAIL(msg) _FAIL( \ + Perl_croak(aTHX_ "%s in regex m/%" UTF8f "%s/", \ + msg, UTF8fARG(UTF, len, RExC_precomp), ellipses)) + +#define FAIL2(msg,arg) _FAIL( \ + Perl_croak(aTHX_ msg " in regex m/%" UTF8f "%s/", \ + arg, UTF8fARG(UTF, len, RExC_precomp), ellipses)) + +#define FAIL3(msg,arg1,arg2) _FAIL( \ + Perl_croak(aTHX_ msg " in regex m/%" UTF8f "%s/", \ + arg1, arg2, UTF8fARG(UTF, len, RExC_precomp), ellipses)) + +/* + * Simple_vFAIL -- like FAIL, but marks the current location in the scan + */ +#define Simple_vFAIL(m) STMT_START { \ + Perl_croak(aTHX_ "%s" REPORT_LOCATION, \ + m, REPORT_LOCATION_ARGS(RExC_parse)); \ +} STMT_END + +/* + * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL() + */ +#define vFAIL(m) STMT_START { \ + PREPARE_TO_DIE; \ + Simple_vFAIL(m); \ +} STMT_END + +/* + * Like Simple_vFAIL(), but accepts two arguments. + */ +#define Simple_vFAIL2(m,a1) STMT_START { \ + S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, \ + REPORT_LOCATION_ARGS(RExC_parse)); \ +} STMT_END + +/* + * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL2(). + */ +#define vFAIL2(m,a1) STMT_START { \ + PREPARE_TO_DIE; \ + Simple_vFAIL2(m, a1); \ +} STMT_END + + +/* + * Like Simple_vFAIL(), but accepts three arguments. + */ +#define Simple_vFAIL3(m, a1, a2) STMT_START { \ + S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, a2, \ + REPORT_LOCATION_ARGS(RExC_parse)); \ +} STMT_END + +/* + * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL3(). + */ +#define vFAIL3(m,a1,a2) STMT_START { \ + PREPARE_TO_DIE; \ + Simple_vFAIL3(m, a1, a2); \ +} STMT_END + +/* + * Like Simple_vFAIL(), but accepts four arguments. + */ +#define Simple_vFAIL4(m, a1, a2, a3) STMT_START { \ + S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, a2, a3, \ + REPORT_LOCATION_ARGS(RExC_parse)); \ +} STMT_END + +#define vFAIL4(m,a1,a2,a3) STMT_START { \ + PREPARE_TO_DIE; \ + Simple_vFAIL4(m, a1, a2, a3); \ +} STMT_END + +/* A specialized version of vFAIL2 that works with UTF8f */ +#define vFAIL2utf8f(m, a1) STMT_START { \ + PREPARE_TO_DIE; \ + S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, \ + REPORT_LOCATION_ARGS(RExC_parse)); \ +} STMT_END + +#define vFAIL3utf8f(m, a1, a2) STMT_START { \ + PREPARE_TO_DIE; \ + S_re_croak(aTHX_ UTF, m REPORT_LOCATION, a1, a2, \ + REPORT_LOCATION_ARGS(RExC_parse)); \ +} STMT_END + +/* Setting this to NULL is a signal to not output warnings */ +#define TURN_OFF_WARNINGS_IN_SUBSTITUTE_PARSE \ + STMT_START { \ + RExC_save_copy_start_in_constructed = RExC_copy_start_in_constructed;\ + RExC_copy_start_in_constructed = NULL; \ + } STMT_END +#define RESTORE_WARNINGS \ + RExC_copy_start_in_constructed = RExC_save_copy_start_in_constructed + +/* Since a warning can be generated multiple times as the input is reparsed, we + * output it the first time we come to that point in the parse, but suppress it + * otherwise. 'RExC_copy_start_in_constructed' being NULL is a flag to not + * generate any warnings */ +#define TO_OUTPUT_WARNINGS(loc) \ + ( RExC_copy_start_in_constructed \ + && ((xI(loc)) - RExC_precomp) > (Ptrdiff_t) RExC_latest_warn_offset) + +/* After we've emitted a warning, we save the position in the input so we don't + * output it again */ +#define UPDATE_WARNINGS_LOC(loc) \ + STMT_START { \ + if (TO_OUTPUT_WARNINGS(loc)) { \ + RExC_latest_warn_offset = MAX(sI, MIN(eI, xI(loc))) \ + - RExC_precomp; \ + } \ + } STMT_END + +/* 'warns' is the output of the packWARNx macro used in 'code' */ +#define _WARN_HELPER(loc, warns, code) \ + STMT_START { \ + if (! RExC_copy_start_in_constructed) { \ + Perl_croak( aTHX_ "panic! %s: %d: Tried to warn when none" \ + " expected at '%s'", \ + __FILE__, __LINE__, loc); \ + } \ + if (TO_OUTPUT_WARNINGS(loc)) { \ + if (ckDEAD(warns)) \ + PREPARE_TO_DIE; \ + code; \ + UPDATE_WARNINGS_LOC(loc); \ + } \ + } STMT_END + +/* m is not necessarily a "literal string", in this macro */ +#define warn_non_literal_string(loc, packed_warn, m) \ + _WARN_HELPER(loc, packed_warn, \ + Perl_warner(aTHX_ packed_warn, \ + "%s" REPORT_LOCATION, \ + m, REPORT_LOCATION_ARGS(loc))) +#define reg_warn_non_literal_string(loc, m) \ + warn_non_literal_string(loc, packWARN(WARN_REGEXP), m) + +#define ckWARN2_non_literal_string(loc, packwarn, m, a1) \ + STMT_START { \ + char * format; \ + Size_t format_size = strlen(m) + strlen(REPORT_LOCATION)+ 1;\ + Newx(format, format_size, char); \ + my_strlcpy(format, m, format_size); \ + my_strlcat(format, REPORT_LOCATION, format_size); \ + SAVEFREEPV(format); \ + _WARN_HELPER(loc, packwarn, \ + Perl_ck_warner(aTHX_ packwarn, \ + format, \ + a1, REPORT_LOCATION_ARGS(loc))); \ + } STMT_END + +#define ckWARNreg(loc,m) \ + _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ + Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), \ + m REPORT_LOCATION, \ + REPORT_LOCATION_ARGS(loc))) + +#define vWARN(loc, m) \ + _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ + Perl_warner(aTHX_ packWARN(WARN_REGEXP), \ + m REPORT_LOCATION, \ + REPORT_LOCATION_ARGS(loc))) \ + +#define vWARN_dep(loc,category,m) \ + _WARN_HELPER(loc, packWARN(category), \ + Perl_warner(aTHX_ packWARN(category), \ + m REPORT_LOCATION, \ + REPORT_LOCATION_ARGS(loc))) + +#define ckWARNdep(loc,category,m) \ + _WARN_HELPER(loc, packWARN(category), \ + Perl_ck_warner_d(aTHX_ packWARN(category), \ + m REPORT_LOCATION, \ + REPORT_LOCATION_ARGS(loc))) + +#define ckWARNregdep(loc,category,m) \ + _WARN_HELPER(loc, packWARN2(category, WARN_REGEXP), \ + Perl_ck_warner_d(aTHX_ packWARN2(category, \ + WARN_REGEXP), \ + m REPORT_LOCATION, \ + REPORT_LOCATION_ARGS(loc))) + +#define ckWARN2reg_d(loc,m, a1) \ + _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ + Perl_ck_warner_d(aTHX_ packWARN(WARN_REGEXP), \ + m REPORT_LOCATION, \ + a1, REPORT_LOCATION_ARGS(loc))) + +#define ckWARN2reg(loc, m, a1) \ + _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ + Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), \ + m REPORT_LOCATION, \ + a1, REPORT_LOCATION_ARGS(loc))) + +#define vWARN3(loc, m, a1, a2) \ + _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ + Perl_warner(aTHX_ packWARN(WARN_REGEXP), \ + m REPORT_LOCATION, \ + a1, a2, REPORT_LOCATION_ARGS(loc))) + +#define ckWARN3reg(loc, m, a1, a2) \ + _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ + Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), \ + m REPORT_LOCATION, \ + a1, a2, \ + REPORT_LOCATION_ARGS(loc))) + +#define vWARN4(loc, m, a1, a2, a3) \ + _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ + Perl_warner(aTHX_ packWARN(WARN_REGEXP), \ + m REPORT_LOCATION, \ + a1, a2, a3, \ + REPORT_LOCATION_ARGS(loc))) + +#define ckWARN4reg(loc, m, a1, a2, a3) \ + _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ + Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), \ + m REPORT_LOCATION, \ + a1, a2, a3, \ + REPORT_LOCATION_ARGS(loc))) + +#define vWARN5(loc, m, a1, a2, a3, a4) \ + _WARN_HELPER(loc, packWARN(WARN_REGEXP), \ + Perl_warner(aTHX_ packWARN(WARN_REGEXP), \ + m REPORT_LOCATION, \ + a1, a2, a3, a4, \ + REPORT_LOCATION_ARGS(loc))) + +#define ckWARNexperimental(loc, class, m) \ + STMT_START { \ + if (! RExC_warned_ ## class) { /* warn once per compilation */ \ + RExC_warned_ ## class = 1; \ + _WARN_HELPER(loc, packWARN(class), \ + Perl_ck_warner_d(aTHX_ packWARN(class), \ + m REPORT_LOCATION, \ + REPORT_LOCATION_ARGS(loc)));\ + } \ + } STMT_END + +#define ckWARNexperimental_with_arg(loc, class, m, arg) \ + STMT_START { \ + if (! RExC_warned_ ## class) { /* warn once per compilation */ \ + RExC_warned_ ## class = 1; \ + _WARN_HELPER(loc, packWARN(class), \ + Perl_ck_warner_d(aTHX_ packWARN(class), \ + m REPORT_LOCATION, \ + arg, REPORT_LOCATION_ARGS(loc)));\ + } \ + } STMT_END + +/* Convert between a pointer to a node and its offset from the beginning of the + * program */ +#define REGNODE_p(offset) (RExC_emit_start + (offset)) +#define REGNODE_OFFSET(node) (__ASSERT_((node) >= RExC_emit_start) \ + (SSize_t) ((node) - RExC_emit_start)) + +#define ProgLen(ri) ri->proglen +#define SetProgLen(ri,x) ri->proglen = x + +#if PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS +#define EXPERIMENTAL_INPLACESCAN +#endif /*PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS*/ + +#define DEBUG_RExC_seen() \ + DEBUG_OPTIMISE_MORE_r({ \ + Perl_re_printf( aTHX_ "RExC_seen: "); \ + \ + if (RExC_seen & REG_ZERO_LEN_SEEN) \ + Perl_re_printf( aTHX_ "REG_ZERO_LEN_SEEN "); \ + \ + if (RExC_seen & REG_LOOKBEHIND_SEEN) \ + Perl_re_printf( aTHX_ "REG_LOOKBEHIND_SEEN "); \ + \ + if (RExC_seen & REG_GPOS_SEEN) \ + Perl_re_printf( aTHX_ "REG_GPOS_SEEN "); \ + \ + if (RExC_seen & REG_RECURSE_SEEN) \ + Perl_re_printf( aTHX_ "REG_RECURSE_SEEN "); \ + \ + if (RExC_seen & REG_TOP_LEVEL_BRANCHES_SEEN) \ + Perl_re_printf( aTHX_ "REG_TOP_LEVEL_BRANCHES_SEEN "); \ + \ + if (RExC_seen & REG_VERBARG_SEEN) \ + Perl_re_printf( aTHX_ "REG_VERBARG_SEEN "); \ + \ + if (RExC_seen & REG_CUTGROUP_SEEN) \ + Perl_re_printf( aTHX_ "REG_CUTGROUP_SEEN "); \ + \ + if (RExC_seen & REG_RUN_ON_COMMENT_SEEN) \ + Perl_re_printf( aTHX_ "REG_RUN_ON_COMMENT_SEEN "); \ + \ + if (RExC_seen & REG_UNFOLDED_MULTI_SEEN) \ + Perl_re_printf( aTHX_ "REG_UNFOLDED_MULTI_SEEN "); \ + \ + if (RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN) \ + Perl_re_printf( aTHX_ "REG_UNBOUNDED_QUANTIFIER_SEEN "); \ + \ + if (RExC_seen & REG_PESSIMIZE_SEEN) \ + Perl_re_printf( aTHX_ "REG_PESSIMIZE_SEEN "); \ + \ + Perl_re_printf( aTHX_ "\n"); \ + }); + +#define DEBUG_SHOW_STUDY_FLAG(flags,flag) \ + if ((flags) & flag) Perl_re_printf( aTHX_ "%s ", #flag) + + +#ifdef DEBUGGING +# define DEBUG_STUDYDATA(where, data, depth, is_inf, min, stopmin, delta) \ + debug_studydata(where, data, depth, is_inf, min, stopmin, delta) + +# define DEBUG_PEEP(str, scan, depth, flags) \ + debug_peep(str, pRExC_state, scan, depth, flags) +#else +# define DEBUG_STUDYDATA(where, data, depth, is_inf, min, stopmin, delta) NOOP +# define DEBUG_PEEP(str, scan, depth, flags) NOOP +#endif + +#define REGTAIL(x,y,z) regtail((x),(y),(z),depth+1) +#ifdef DEBUGGING +#define REGTAIL_STUDY(x,y,z) regtail_study((x),(y),(z),depth+1) +#else +#define REGTAIL_STUDY(x,y,z) regtail((x),(y),(z),depth+1) +#endif + +#define MADE_TRIE 1 +#define MADE_JUMP_TRIE 2 +#define MADE_EXACT_TRIE 4 + +#define INVLIST_INDEX 0 +#define ONLY_LOCALE_MATCHES_INDEX 1 +#define DEFERRED_USER_DEFINED_INDEX 2 + +/* These two functions currently do the exact same thing */ +#define ssc_init_zero ssc_init + +#define ssc_add_cp(ssc, cp) ssc_add_range((ssc), (cp), (cp)) +#define ssc_match_all_cp(ssc) ssc_add_range(ssc, 0, UV_MAX) + +#ifdef DEBUGGING +#define REGNODE_GUTS(state,op,extra_size) \ + regnode_guts_debug(state,op,extra_size) +#else +#define REGNODE_GUTS(state,op,extra_size) \ + regnode_guts(state,extra_size) +#endif + +#define CLEAR_OPTSTART \ + if (optstart) STMT_START { \ + DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ \ + " (%" IVdf " nodes)\n", (IV)(node - optstart))); \ + optstart=NULL; \ + } STMT_END + +#define DUMPUNTIL(b,e) \ + CLEAR_OPTSTART; \ + node = dumpuntil(r,start,(b),(e),last,sv,indent+1,depth+1); + +#define REGNODE_STEP_OVER(ret,t1,t2) \ + NEXT_OFF(REGNODE_p(ret)) = ((sizeof(t1)+sizeof(t2))/sizeof(regnode)) + +#endif /* REGCOMP_INTERNAL_H */ Index: gnu/usr.bin/perl/regcomp_invlist.c =================================================================== RCS file: gnu/usr.bin/perl/regcomp_invlist.c diff -N gnu/usr.bin/perl/regcomp_invlist.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/regcomp_invlist.c 21 Feb 2024 15:47:03 -0000 @@ -0,0 +1,1540 @@ +#ifdef PERL_EXT_RE_BUILD +#include "re_top.h" +#endif + +#include "EXTERN.h" +#define PERL_IN_REGEX_ENGINE +#define PERL_IN_REGCOMP_ANY +#define PERL_IN_REGCOMP_INVLIST_C +#include "perl.h" + +#ifdef PERL_IN_XSUB_RE +# include "re_comp.h" +#else +# include "regcomp.h" +#endif + +#include "invlist_inline.h" +#include "unicode_constants.h" +#include "regcomp_internal.h" + + +void +Perl_populate_bitmap_from_invlist(pTHX_ SV * invlist, const UV offset, const U8 * bitmap, const Size_t len) +{ + PERL_ARGS_ASSERT_POPULATE_BITMAP_FROM_INVLIST; + + /* As the name says. The zeroth bit corresponds to the code point given by + * 'offset' */ + + UV start, end; + + Zero(bitmap, len, U8); + + invlist_iterinit(invlist); + while (invlist_iternext(invlist, &start, &end)) { + assert(start >= offset); + + for (UV i = start; i <= end; i++) { + UV adjusted = i - offset; + + BITMAP_BYTE(bitmap, adjusted) |= BITMAP_BIT(adjusted); + } + } + invlist_iterfinish(invlist); +} + +void +Perl_populate_invlist_from_bitmap(pTHX_ const U8 * bitmap, const Size_t bitmap_len, SV ** invlist, const UV offset) +{ + PERL_ARGS_ASSERT_POPULATE_INVLIST_FROM_BITMAP; + + /* As the name says. The zeroth bit corresponds to the code point given by + * 'offset' */ + + Size_t i; + + for (i = 0; i < bitmap_len; i++) { + if (BITMAP_TEST(bitmap, i)) { + int start = i++; + + /* Save a little work by adding a range all at once instead of bit + * by bit */ + while (i < bitmap_len && BITMAP_TEST(bitmap, i)) { + i++; + } + + *invlist = _add_range_to_invlist(*invlist, + start + offset, + i + offset - 1); + } + } +} + +/* This section of code defines the inversion list object and its methods. The + * interfaces are highly subject to change, so as much as possible is static to + * this file. An inversion list is here implemented as a malloc'd C UV array + * as an SVt_INVLIST scalar. + * + * An inversion list for Unicode is an array of code points, sorted by ordinal + * number. Each element gives the code point that begins a range that extends + * up-to but not including the code point given by the next element. The final + * element gives the first code point of a range that extends to the platform's + * infinity. The even-numbered elements (invlist[0], invlist[2], invlist[4], + * ...) give ranges whose code points are all in the inversion list. We say + * that those ranges are in the set. The odd-numbered elements give ranges + * whose code points are not in the inversion list, and hence not in the set. + * Thus, element [0] is the first code point in the list. Element [1] + * is the first code point beyond that not in the list; and element [2] is the + * first code point beyond that that is in the list. In other words, the first + * range is invlist[0]..(invlist[1]-1), and all code points in that range are + * in the inversion list. The second range is invlist[1]..(invlist[2]-1), and + * all code points in that range are not in the inversion list. The third + * range invlist[2]..(invlist[3]-1) gives code points that are in the inversion + * list, and so forth. Thus every element whose index is divisible by two + * gives the beginning of a range that is in the list, and every element whose + * index is not divisible by two gives the beginning of a range not in the + * list. If the final element's index is divisible by two, the inversion list + * extends to the platform's infinity; otherwise the highest code point in the + * inversion list is the contents of that element minus 1. + * + * A range that contains just a single code point N will look like + * invlist[i] == N + * invlist[i+1] == N+1 + * + * If N is UV_MAX (the highest representable code point on the machine), N+1 is + * impossible to represent, so element [i+1] is omitted. The single element + * inversion list + * invlist[0] == UV_MAX + * contains just UV_MAX, but is interpreted as matching to infinity. + * + * Taking the complement (inverting) an inversion list is quite simple, if the + * first element is 0, remove it; otherwise add a 0 element at the beginning. + * This implementation reserves an element at the beginning of each inversion + * list to always contain 0; there is an additional flag in the header which + * indicates if the list begins at the 0, or is offset to begin at the next + * element. This means that the inversion list can be inverted without any + * copying; just flip the flag. + * + * More about inversion lists can be found in "Unicode Demystified" + * Chapter 13 by Richard Gillam, published by Addison-Wesley. + * + * The inversion list data structure is currently implemented as an SV pointing + * to an array of UVs that the SV thinks are bytes. This allows us to have an + * array of UV whose memory management is automatically handled by the existing + * facilities for SV's. + * + * Some of the methods should always be private to the implementation, and some + * should eventually be made public */ + +/* The header definitions are in F */ + +#ifndef PERL_IN_XSUB_RE + +PERL_STATIC_INLINE UV* +S__invlist_array_init(SV* const invlist, const bool will_have_0) +{ + /* Returns a pointer to the first element in the inversion list's array. + * This is called upon initialization of an inversion list. Where the + * array begins depends on whether the list has the code point U+0000 in it + * or not. The other parameter tells it whether the code that follows this + * call is about to put a 0 in the inversion list or not. The first + * element is either the element reserved for 0, if TRUE, or the element + * after it, if FALSE */ + + bool* offset = get_invlist_offset_addr(invlist); + UV* zero_addr = (UV *) SvPVX(invlist); + + PERL_ARGS_ASSERT__INVLIST_ARRAY_INIT; + + /* Must be empty */ + assert(! _invlist_len(invlist)); + + *zero_addr = 0; + + /* 1^1 = 0; 1^0 = 1 */ + *offset = 1 ^ will_have_0; + return zero_addr + *offset; +} + +STATIC void +S_invlist_replace_list_destroys_src(pTHX_ SV * dest, SV * src) +{ + /* Replaces the inversion list in 'dest' with the one from 'src'. It + * steals the list from 'src', so 'src' is made to have a NULL list. This + * is similar to what SvSetMagicSV() would do, if it were implemented on + * inversion lists, though this routine avoids a copy */ + + const UV src_len = _invlist_len(src); + const bool src_offset = *get_invlist_offset_addr(src); + const STRLEN src_byte_len = SvLEN(src); + char * array = SvPVX(src); + +#ifndef NO_TAINT_SUPPORT + const int oldtainted = TAINT_get; +#endif + + PERL_ARGS_ASSERT_INVLIST_REPLACE_LIST_DESTROYS_SRC; + + assert(is_invlist(src)); + assert(is_invlist(dest)); + assert(! invlist_is_iterating(src)); + assert(SvCUR(src) == 0 || SvCUR(src) < SvLEN(src)); + + /* Make sure it ends in the right place with a NUL, as our inversion list + * manipulations aren't careful to keep this true, but sv_usepvn_flags() + * asserts it */ + array[src_byte_len - 1] = '\0'; + + TAINT_NOT; /* Otherwise it breaks */ + sv_usepvn_flags(dest, + (char *) array, + src_byte_len - 1, + + /* This flag is documented to cause a copy to be avoided */ + SV_HAS_TRAILING_NUL); + TAINT_set(oldtainted); + SvPV_set(src, 0); + SvLEN_set(src, 0); + SvCUR_set(src, 0); + + /* Finish up copying over the other fields in an inversion list */ + *get_invlist_offset_addr(dest) = src_offset; + invlist_set_len(dest, src_len, src_offset); + *get_invlist_previous_index_addr(dest) = 0; + invlist_iterfinish(dest); +} + +PERL_STATIC_INLINE IV* +S_get_invlist_previous_index_addr(SV* invlist) +{ + /* Return the address of the IV that is reserved to hold the cached index + * */ + PERL_ARGS_ASSERT_GET_INVLIST_PREVIOUS_INDEX_ADDR; + + assert(is_invlist(invlist)); + + return &(((XINVLIST*) SvANY(invlist))->prev_index); +} + +PERL_STATIC_INLINE IV +S_invlist_previous_index(SV* const invlist) +{ + /* Returns cached index of previous search */ + + PERL_ARGS_ASSERT_INVLIST_PREVIOUS_INDEX; + + return *get_invlist_previous_index_addr(invlist); +} + +PERL_STATIC_INLINE void +S_invlist_set_previous_index(SV* const invlist, const IV index) +{ + /* Caches for later retrieval */ + + PERL_ARGS_ASSERT_INVLIST_SET_PREVIOUS_INDEX; + + assert(index == 0 || index < (int) _invlist_len(invlist)); + + *get_invlist_previous_index_addr(invlist) = index; +} + +PERL_STATIC_INLINE void +S_invlist_trim(SV* invlist) +{ + /* Free the not currently-being-used space in an inversion list */ + + /* But don't free up the space needed for the 0 UV that is always at the + * beginning of the list, nor the trailing NUL */ + const UV min_size = TO_INTERNAL_SIZE(1) + 1; + + PERL_ARGS_ASSERT_INVLIST_TRIM; + + assert(is_invlist(invlist)); + + SvPV_renew(invlist, MAX(min_size, SvCUR(invlist) + 1)); +} + +PERL_STATIC_INLINE void +S_invlist_clear(pTHX_ SV* invlist) /* Empty the inversion list */ +{ + PERL_ARGS_ASSERT_INVLIST_CLEAR; + + assert(is_invlist(invlist)); + + invlist_set_len(invlist, 0, 0); + invlist_trim(invlist); +} + +PERL_STATIC_INLINE UV +S_invlist_max(const SV* const invlist) +{ + /* Returns the maximum number of elements storable in the inversion list's + * array, without having to realloc() */ + + PERL_ARGS_ASSERT_INVLIST_MAX; + + assert(is_invlist(invlist)); + + /* Assumes worst case, in which the 0 element is not counted in the + * inversion list, so subtracts 1 for that */ + return SvLEN(invlist) == 0 /* This happens under _new_invlist_C_array */ + ? FROM_INTERNAL_SIZE(SvCUR(invlist)) - 1 + : FROM_INTERNAL_SIZE(SvLEN(invlist)) - 1; +} + +STATIC void +S_initialize_invlist_guts(pTHX_ SV* invlist, const Size_t initial_size) +{ + PERL_ARGS_ASSERT_INITIALIZE_INVLIST_GUTS; + + /* First 1 is in case the zero element isn't in the list; second 1 is for + * trailing NUL */ + SvGROW(invlist, TO_INTERNAL_SIZE(initial_size + 1) + 1); + invlist_set_len(invlist, 0, 0); + + /* Force iterinit() to be used to get iteration to work */ + invlist_iterfinish(invlist); + + *get_invlist_previous_index_addr(invlist) = 0; + SvPOK_on(invlist); /* This allows B to extract the PV */ +} + +SV* +Perl__new_invlist(pTHX_ IV initial_size) +{ + + /* Return a pointer to a newly constructed inversion list, with enough + * space to store 'initial_size' elements. If that number is negative, a + * system default is used instead */ + + SV* new_list; + + if (initial_size < 0) { + initial_size = 10; + } + + new_list = newSV_type(SVt_INVLIST); + initialize_invlist_guts(new_list, initial_size); + + return new_list; +} + +SV* +Perl__new_invlist_C_array(pTHX_ const UV* const list) +{ + /* Return a pointer to a newly constructed inversion list, initialized to + * point to , which has to be in the exact correct inversion list + * form, including internal fields. Thus this is a dangerous routine that + * should not be used in the wrong hands. The passed in 'list' contains + * several header fields at the beginning that are not part of the + * inversion list body proper */ + + const STRLEN length = (STRLEN) list[0]; + const UV version_id = list[1]; + const bool offset = cBOOL(list[2]); +#define HEADER_LENGTH 3 + /* If any of the above changes in any way, you must change HEADER_LENGTH + * (if appropriate) and regenerate INVLIST_VERSION_ID by running + * perl -E 'say int(rand 2**31-1)' + */ +#define INVLIST_VERSION_ID 148565664 /* This is a combination of a version and + data structure type, so that one being + passed in can be validated to be an + inversion list of the correct vintage. + */ + + SV* invlist = newSV_type(SVt_INVLIST); + + PERL_ARGS_ASSERT__NEW_INVLIST_C_ARRAY; + + if (version_id != INVLIST_VERSION_ID) { + Perl_croak(aTHX_ "panic: Incorrect version for previously generated inversion list"); + } + + /* The generated array passed in includes header elements that aren't part + * of the list proper, so start it just after them */ + SvPV_set(invlist, (char *) (list + HEADER_LENGTH)); + + SvLEN_set(invlist, 0); /* Means we own the contents, and the system + shouldn't touch it */ + + *(get_invlist_offset_addr(invlist)) = offset; + + /* The 'length' passed to us is the physical number of elements in the + * inversion list. But if there is an offset the logical number is one + * less than that */ + invlist_set_len(invlist, length - offset, offset); + + invlist_set_previous_index(invlist, 0); + + /* Initialize the iteration pointer. */ + invlist_iterfinish(invlist); + + SvREADONLY_on(invlist); + SvPOK_on(invlist); + + return invlist; +} + +STATIC void +S__append_range_to_invlist(pTHX_ SV* const invlist, + const UV start, const UV end) +{ + /* Subject to change or removal. Append the range from 'start' to 'end' at + * the end of the inversion list. The range must be above any existing + * ones. */ + + UV* array; + UV max = invlist_max(invlist); + UV len = _invlist_len(invlist); + bool offset; + + PERL_ARGS_ASSERT__APPEND_RANGE_TO_INVLIST; + + if (len == 0) { /* Empty lists must be initialized */ + offset = start != 0; + array = _invlist_array_init(invlist, ! offset); + } + else { + /* Here, the existing list is non-empty. The current max entry in the + * list is generally the first value not in the set, except when the + * set extends to the end of permissible values, in which case it is + * the first entry in that final set, and so this call is an attempt to + * append out-of-order */ + + UV final_element = len - 1; + array = invlist_array(invlist); + if ( array[final_element] > start + || ELEMENT_RANGE_MATCHES_INVLIST(final_element)) + { + Perl_croak(aTHX_ "panic: attempting to append to an inversion list, but wasn't at the end of the list, final=%" UVuf ", start=%" UVuf ", match=%c", + array[final_element], start, + ELEMENT_RANGE_MATCHES_INVLIST(final_element) ? 't' : 'f'); + } + + /* Here, it is a legal append. If the new range begins 1 above the end + * of the range below it, it is extending the range below it, so the + * new first value not in the set is one greater than the newly + * extended range. */ + offset = *get_invlist_offset_addr(invlist); + if (array[final_element] == start) { + if (end != UV_MAX) { + array[final_element] = end + 1; + } + else { + /* But if the end is the maximum representable on the machine, + * assume that infinity was actually what was meant. Just let + * the range that this would extend to have no end */ + invlist_set_len(invlist, len - 1, offset); + } + return; + } + } + + /* Here the new range doesn't extend any existing set. Add it */ + + len += 2; /* Includes an element each for the start and end of range */ + + /* If wll overflow the existing space, extend, which may cause the array to + * be moved */ + if (max < len) { + invlist_extend(invlist, len); + + /* Have to set len here to avoid assert failure in invlist_array() */ + invlist_set_len(invlist, len, offset); + + array = invlist_array(invlist); + } + else { + invlist_set_len(invlist, len, offset); + } + + /* The next item on the list starts the range, the one after that is + * one past the new range. */ + array[len - 2] = start; + if (end != UV_MAX) { + array[len - 1] = end + 1; + } + else { + /* But if the end is the maximum representable on the machine, just let + * the range have no end */ + invlist_set_len(invlist, len - 1, offset); + } +} + +SSize_t +Perl__invlist_search(SV* const invlist, const UV cp) +{ + /* Searches the inversion list for the entry that contains the input code + * point . If is not in the list, -1 is returned. Otherwise, the + * return value is the index into the list's array of the range that + * contains , that is, 'i' such that + * array[i] <= cp < array[i+1] + */ + + IV low = 0; + IV mid; + IV high = _invlist_len(invlist); + const IV highest_element = high - 1; + const UV* array; + + PERL_ARGS_ASSERT__INVLIST_SEARCH; + + /* If list is empty, return failure. */ + if (UNLIKELY(high == 0)) { + return -1; + } + + /* (We can't get the array unless we know the list is non-empty) */ + array = invlist_array(invlist); + + mid = invlist_previous_index(invlist); + assert(mid >=0); + if (UNLIKELY(mid > highest_element)) { + mid = highest_element; + } + + /* contains the cache of the result of the previous call to this + * function (0 the first time). See if this call is for the same result, + * or if it is for mid-1. This is under the theory that calls to this + * function will often be for related code points that are near each other. + * And benchmarks show that caching gives better results. We also test + * here if the code point is within the bounds of the list. These tests + * replace others that would have had to be made anyway to make sure that + * the array bounds were not exceeded, and these give us extra information + * at the same time */ + if (cp >= array[mid]) { + if (cp >= array[highest_element]) { + return highest_element; + } + + /* Here, array[mid] <= cp < array[highest_element]. This means that + * the final element is not the answer, so can exclude it; it also + * means that is not the final element, so can refer to 'mid + 1' + * safely */ + if (cp < array[mid + 1]) { + return mid; + } + high--; + low = mid + 1; + } + else { /* cp < aray[mid] */ + if (cp < array[0]) { /* Fail if outside the array */ + return -1; + } + high = mid; + if (cp >= array[mid - 1]) { + goto found_entry; + } + } + + /* Binary search. What we are looking for is such that + * array[i] <= cp < array[i+1] + * The loop below converges on the i+1. Note that there may not be an + * (i+1)th element in the array, and things work nonetheless */ + while (low < high) { + mid = (low + high) / 2; + assert(mid <= highest_element); + if (array[mid] <= cp) { /* cp >= array[mid] */ + low = mid + 1; + + /* We could do this extra test to exit the loop early. + if (cp < array[low]) { + return mid; + } + */ + } + else { /* cp < array[mid] */ + high = mid; + } + } + + found_entry: + high--; + invlist_set_previous_index(invlist, high); + return high; +} + +void +Perl__invlist_union_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, + const bool complement_b, SV** output) +{ + /* Take the union of two inversion lists and point '*output' to it. On + * input, '*output' MUST POINT TO NULL OR TO AN SV* INVERSION LIST (possibly + * even 'a' or 'b'). If to an inversion list, the contents of the original + * list will be replaced by the union. The first list, 'a', may be + * NULL, in which case a copy of the second list is placed in '*output'. + * If 'complement_b' is TRUE, the union is taken of the complement + * (inversion) of 'b' instead of b itself. + * + * The basis for this comes from "Unicode Demystified" Chapter 13 by + * Richard Gillam, published by Addison-Wesley, and explained at some + * length there. The preface says to incorporate its examples into your + * code at your own risk. + * + * The algorithm is like a merge sort. */ + + const UV* array_a; /* a's array */ + const UV* array_b; + UV len_a; /* length of a's array */ + UV len_b; + + SV* u; /* the resulting union */ + UV* array_u; + UV len_u = 0; + + UV i_a = 0; /* current index into a's array */ + UV i_b = 0; + UV i_u = 0; + + /* running count, as explained in the algorithm source book; items are + * stopped accumulating and are output when the count changes to/from 0. + * The count is incremented when we start a range that's in an input's set, + * and decremented when we start a range that's not in a set. So this + * variable can be 0, 1, or 2. When it is 0 neither input is in their set, + * and hence nothing goes into the union; 1, just one of the inputs is in + * its set (and its current range gets added to the union); and 2 when both + * inputs are in their sets. */ + UV count = 0; + + PERL_ARGS_ASSERT__INVLIST_UNION_MAYBE_COMPLEMENT_2ND; + assert(a != b); + assert(*output == NULL || is_invlist(*output)); + + len_b = _invlist_len(b); + if (len_b == 0) { + + /* Here, 'b' is empty, hence it's complement is all possible code + * points. So if the union includes the complement of 'b', it includes + * everything, and we need not even look at 'a'. It's easiest to + * create a new inversion list that matches everything. */ + if (complement_b) { + SV* everything = _add_range_to_invlist(NULL, 0, UV_MAX); + + if (*output == NULL) { /* If the output didn't exist, just point it + at the new list */ + *output = everything; + } + else { /* Otherwise, replace its contents with the new list */ + invlist_replace_list_destroys_src(*output, everything); + SvREFCNT_dec_NN(everything); + } + + return; + } + + /* Here, we don't want the complement of 'b', and since 'b' is empty, + * the union will come entirely from 'a'. If 'a' is NULL or empty, the + * output will be empty */ + + if (a == NULL || _invlist_len(a) == 0) { + if (*output == NULL) { + *output = _new_invlist(0); + } + else { + invlist_clear(*output); + } + return; + } + + /* Here, 'a' is not empty, but 'b' is, so 'a' entirely determines the + * union. We can just return a copy of 'a' if '*output' doesn't point + * to an existing list */ + if (*output == NULL) { + *output = invlist_clone(a, NULL); + return; + } + + /* If the output is to overwrite 'a', we have a no-op, as it's + * already in 'a' */ + if (*output == a) { + return; + } + + /* Here, '*output' is to be overwritten by 'a' */ + u = invlist_clone(a, NULL); + invlist_replace_list_destroys_src(*output, u); + SvREFCNT_dec_NN(u); + + return; + } + + /* Here 'b' is not empty. See about 'a' */ + + if (a == NULL || ((len_a = _invlist_len(a)) == 0)) { + + /* Here, 'a' is empty (and b is not). That means the union will come + * entirely from 'b'. If '*output' is NULL, we can directly return a + * clone of 'b'. Otherwise, we replace the contents of '*output' with + * the clone */ + + SV ** dest = (*output == NULL) ? output : &u; + *dest = invlist_clone(b, NULL); + if (complement_b) { + _invlist_invert(*dest); + } + + if (dest == &u) { + invlist_replace_list_destroys_src(*output, u); + SvREFCNT_dec_NN(u); + } + + return; + } + + /* Here both lists exist and are non-empty */ + array_a = invlist_array(a); + array_b = invlist_array(b); + + /* If are to take the union of 'a' with the complement of b, set it + * up so are looking at b's complement. */ + if (complement_b) { + + /* To complement, we invert: if the first element is 0, remove it. To + * do this, we just pretend the array starts one later */ + if (array_b[0] == 0) { + array_b++; + len_b--; + } + else { + + /* But if the first element is not zero, we pretend the list starts + * at the 0 that is always stored immediately before the array. */ + array_b--; + len_b++; + } + } + + /* Size the union for the worst case: that the sets are completely + * disjoint */ + u = _new_invlist(len_a + len_b); + + /* Will contain U+0000 if either component does */ + array_u = _invlist_array_init(u, ( len_a > 0 && array_a[0] == 0) + || (len_b > 0 && array_b[0] == 0)); + + /* Go through each input list item by item, stopping when have exhausted + * one of them */ + while (i_a < len_a && i_b < len_b) { + UV cp; /* The element to potentially add to the union's array */ + bool cp_in_set; /* is it in the input list's set or not */ + + /* We need to take one or the other of the two inputs for the union. + * Since we are merging two sorted lists, we take the smaller of the + * next items. In case of a tie, we take first the one that is in its + * set. If we first took the one not in its set, it would decrement + * the count, possibly to 0 which would cause it to be output as ending + * the range, and the next time through we would take the same number, + * and output it again as beginning the next range. By doing it the + * opposite way, there is no possibility that the count will be + * momentarily decremented to 0, and thus the two adjoining ranges will + * be seamlessly merged. (In a tie and both are in the set or both not + * in the set, it doesn't matter which we take first.) */ + if ( array_a[i_a] < array_b[i_b] + || ( array_a[i_a] == array_b[i_b] + && ELEMENT_RANGE_MATCHES_INVLIST(i_a))) + { + cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_a); + cp = array_a[i_a++]; + } + else { + cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_b); + cp = array_b[i_b++]; + } + + /* Here, have chosen which of the two inputs to look at. Only output + * if the running count changes to/from 0, which marks the + * beginning/end of a range that's in the set */ + if (cp_in_set) { + if (count == 0) { + array_u[i_u++] = cp; + } + count++; + } + else { + count--; + if (count == 0) { + array_u[i_u++] = cp; + } + } + } + + + /* The loop above increments the index into exactly one of the input lists + * each iteration, and ends when either index gets to its list end. That + * means the other index is lower than its end, and so something is + * remaining in that one. We decrement 'count', as explained below, if + * that list is in its set. (i_a and i_b each currently index the element + * beyond the one we care about.) */ + if ( (i_a != len_a && PREV_RANGE_MATCHES_INVLIST(i_a)) + || (i_b != len_b && PREV_RANGE_MATCHES_INVLIST(i_b))) + { + count--; + } + + /* Above we decremented 'count' if the list that had unexamined elements in + * it was in its set. This has made it so that 'count' being non-zero + * means there isn't anything left to output; and 'count' equal to 0 means + * that what is left to output is precisely that which is left in the + * non-exhausted input list. + * + * To see why, note first that the exhausted input obviously has nothing + * left to add to the union. If it was in its set at its end, that means + * the set extends from here to the platform's infinity, and hence so does + * the union and the non-exhausted set is irrelevant. The exhausted set + * also contributed 1 to 'count'. If 'count' was 2, it got decremented to + * 1, but if it was 1, the non-exhausted set wasn't in its set, and so + * 'count' remains at 1. This is consistent with the decremented 'count' + * != 0 meaning there's nothing left to add to the union. + * + * But if the exhausted input wasn't in its set, it contributed 0 to + * 'count', and the rest of the union will be whatever the other input is. + * If 'count' was 0, neither list was in its set, and 'count' remains 0; + * otherwise it gets decremented to 0. This is consistent with 'count' + * == 0 meaning the remainder of the union is whatever is left in the + * non-exhausted list. */ + if (count != 0) { + len_u = i_u; + } + else { + IV copy_count = len_a - i_a; + if (copy_count > 0) { /* The non-exhausted input is 'a' */ + Copy(array_a + i_a, array_u + i_u, copy_count, UV); + } + else { /* The non-exhausted input is b */ + copy_count = len_b - i_b; + Copy(array_b + i_b, array_u + i_u, copy_count, UV); + } + len_u = i_u + copy_count; + } + + /* Set the result to the final length, which can change the pointer to + * array_u, so re-find it. (Note that it is unlikely that this will + * change, as we are shrinking the space, not enlarging it) */ + if (len_u != _invlist_len(u)) { + invlist_set_len(u, len_u, *get_invlist_offset_addr(u)); + invlist_trim(u); + array_u = invlist_array(u); + } + + if (*output == NULL) { /* Simply return the new inversion list */ + *output = u; + } + else { + /* Otherwise, overwrite the inversion list that was in '*output'. We + * could instead free '*output', and then set it to 'u', but experience + * has shown [perl #127392] that if the input is a mortal, we can get a + * huge build-up of these during regex compilation before they get + * freed. */ + invlist_replace_list_destroys_src(*output, u); + SvREFCNT_dec_NN(u); + } + + return; +} + +void +Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV* const a, SV* const b, + const bool complement_b, SV** i) +{ + /* Take the intersection of two inversion lists and point '*i' to it. On + * input, '*i' MUST POINT TO NULL OR TO AN SV* INVERSION LIST (possibly + * even 'a' or 'b'). If to an inversion list, the contents of the original + * list will be replaced by the intersection. The first list, 'a', may be + * NULL, in which case '*i' will be an empty list. If 'complement_b' is + * TRUE, the result will be the intersection of 'a' and the complement (or + * inversion) of 'b' instead of 'b' directly. + * + * The basis for this comes from "Unicode Demystified" Chapter 13 by + * Richard Gillam, published by Addison-Wesley, and explained at some + * length there. The preface says to incorporate its examples into your + * code at your own risk. In fact, it had bugs + * + * The algorithm is like a merge sort, and is essentially the same as the + * union above + */ + + const UV* array_a; /* a's array */ + const UV* array_b; + UV len_a; /* length of a's array */ + UV len_b; + + SV* r; /* the resulting intersection */ + UV* array_r; + UV len_r = 0; + + UV i_a = 0; /* current index into a's array */ + UV i_b = 0; + UV i_r = 0; + + /* running count of how many of the two inputs are postitioned at ranges + * that are in their sets. As explained in the algorithm source book, + * items are stopped accumulating and are output when the count changes + * to/from 2. The count is incremented when we start a range that's in an + * input's set, and decremented when we start a range that's not in a set. + * Only when it is 2 are we in the intersection. */ + UV count = 0; + + PERL_ARGS_ASSERT__INVLIST_INTERSECTION_MAYBE_COMPLEMENT_2ND; + assert(a != b); + assert(*i == NULL || is_invlist(*i)); + + /* Special case if either one is empty */ + len_a = (a == NULL) ? 0 : _invlist_len(a); + if ((len_a == 0) || ((len_b = _invlist_len(b)) == 0)) { + if (len_a != 0 && complement_b) { + + /* Here, 'a' is not empty, therefore from the enclosing 'if', 'b' + * must be empty. Here, also we are using 'b's complement, which + * hence must be every possible code point. Thus the intersection + * is simply 'a'. */ + + if (*i == a) { /* No-op */ + return; + } + + if (*i == NULL) { + *i = invlist_clone(a, NULL); + return; + } + + r = invlist_clone(a, NULL); + invlist_replace_list_destroys_src(*i, r); + SvREFCNT_dec_NN(r); + return; + } + + /* Here, 'a' or 'b' is empty and not using the complement of 'b'. The + * intersection must be empty */ + if (*i == NULL) { + *i = _new_invlist(0); + return; + } + + invlist_clear(*i); + return; + } + + /* Here both lists exist and are non-empty */ + array_a = invlist_array(a); + array_b = invlist_array(b); + + /* If are to take the intersection of 'a' with the complement of b, set it + * up so are looking at b's complement. */ + if (complement_b) { + + /* To complement, we invert: if the first element is 0, remove it. To + * do this, we just pretend the array starts one later */ + if (array_b[0] == 0) { + array_b++; + len_b--; + } + else { + + /* But if the first element is not zero, we pretend the list starts + * at the 0 that is always stored immediately before the array. */ + array_b--; + len_b++; + } + } + + /* Size the intersection for the worst case: that the intersection ends up + * fragmenting everything to be completely disjoint */ + r= _new_invlist(len_a + len_b); + + /* Will contain U+0000 iff both components do */ + array_r = _invlist_array_init(r, len_a > 0 && array_a[0] == 0 + && len_b > 0 && array_b[0] == 0); + + /* Go through each list item by item, stopping when have exhausted one of + * them */ + while (i_a < len_a && i_b < len_b) { + UV cp; /* The element to potentially add to the intersection's + array */ + bool cp_in_set; /* Is it in the input list's set or not */ + + /* We need to take one or the other of the two inputs for the + * intersection. Since we are merging two sorted lists, we take the + * smaller of the next items. In case of a tie, we take first the one + * that is not in its set (a difference from the union algorithm). If + * we first took the one in its set, it would increment the count, + * possibly to 2 which would cause it to be output as starting a range + * in the intersection, and the next time through we would take that + * same number, and output it again as ending the set. By doing the + * opposite of this, there is no possibility that the count will be + * momentarily incremented to 2. (In a tie and both are in the set or + * both not in the set, it doesn't matter which we take first.) */ + if ( array_a[i_a] < array_b[i_b] + || ( array_a[i_a] == array_b[i_b] + && ! ELEMENT_RANGE_MATCHES_INVLIST(i_a))) + { + cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_a); + cp = array_a[i_a++]; + } + else { + cp_in_set = ELEMENT_RANGE_MATCHES_INVLIST(i_b); + cp= array_b[i_b++]; + } + + /* Here, have chosen which of the two inputs to look at. Only output + * if the running count changes to/from 2, which marks the + * beginning/end of a range that's in the intersection */ + if (cp_in_set) { + count++; + if (count == 2) { + array_r[i_r++] = cp; + } + } + else { + if (count == 2) { + array_r[i_r++] = cp; + } + count--; + } + + } + + /* The loop above increments the index into exactly one of the input lists + * each iteration, and ends when either index gets to its list end. That + * means the other index is lower than its end, and so something is + * remaining in that one. We increment 'count', as explained below, if the + * exhausted list was in its set. (i_a and i_b each currently index the + * element beyond the one we care about.) */ + if ( (i_a == len_a && PREV_RANGE_MATCHES_INVLIST(i_a)) + || (i_b == len_b && PREV_RANGE_MATCHES_INVLIST(i_b))) + { + count++; + } + + /* Above we incremented 'count' if the exhausted list was in its set. This + * has made it so that 'count' being below 2 means there is nothing left to + * output; otheriwse what's left to add to the intersection is precisely + * that which is left in the non-exhausted input list. + * + * To see why, note first that the exhausted input obviously has nothing + * left to affect the intersection. If it was in its set at its end, that + * means the set extends from here to the platform's infinity, and hence + * anything in the non-exhausted's list will be in the intersection, and + * anything not in it won't be. Hence, the rest of the intersection is + * precisely what's in the non-exhausted list The exhausted set also + * contributed 1 to 'count', meaning 'count' was at least 1. Incrementing + * it means 'count' is now at least 2. This is consistent with the + * incremented 'count' being >= 2 means to add the non-exhausted list to + * the intersection. + * + * But if the exhausted input wasn't in its set, it contributed 0 to + * 'count', and the intersection can't include anything further; the + * non-exhausted set is irrelevant. 'count' was at most 1, and doesn't get + * incremented. This is consistent with 'count' being < 2 meaning nothing + * further to add to the intersection. */ + if (count < 2) { /* Nothing left to put in the intersection. */ + len_r = i_r; + } + else { /* copy the non-exhausted list, unchanged. */ + IV copy_count = len_a - i_a; + if (copy_count > 0) { /* a is the one with stuff left */ + Copy(array_a + i_a, array_r + i_r, copy_count, UV); + } + else { /* b is the one with stuff left */ + copy_count = len_b - i_b; + Copy(array_b + i_b, array_r + i_r, copy_count, UV); + } + len_r = i_r + copy_count; + } + + /* Set the result to the final length, which can change the pointer to + * array_r, so re-find it. (Note that it is unlikely that this will + * change, as we are shrinking the space, not enlarging it) */ + if (len_r != _invlist_len(r)) { + invlist_set_len(r, len_r, *get_invlist_offset_addr(r)); + invlist_trim(r); + array_r = invlist_array(r); + } + + if (*i == NULL) { /* Simply return the calculated intersection */ + *i = r; + } + else { /* Otherwise, replace the existing inversion list in '*i'. We could + instead free '*i', and then set it to 'r', but experience has + shown [perl #127392] that if the input is a mortal, we can get a + huge build-up of these during regex compilation before they get + freed. */ + if (len_r) { + invlist_replace_list_destroys_src(*i, r); + } + else { + invlist_clear(*i); + } + SvREFCNT_dec_NN(r); + } + + return; +} + +SV* +Perl__add_range_to_invlist(pTHX_ SV* invlist, UV start, UV end) +{ + /* Add the range from 'start' to 'end' inclusive to the inversion list's + * set. A pointer to the inversion list is returned. This may actually be + * a new list, in which case the passed in one has been destroyed. The + * passed-in inversion list can be NULL, in which case a new one is created + * with just the one range in it. The new list is not necessarily + * NUL-terminated. Space is not freed if the inversion list shrinks as a + * result of this function. The gain would not be large, and in many + * cases, this is called multiple times on a single inversion list, so + * anything freed may almost immediately be needed again. + * + * This used to mostly call the 'union' routine, but that is much more + * heavyweight than really needed for a single range addition */ + + UV* array; /* The array implementing the inversion list */ + UV len; /* How many elements in 'array' */ + SSize_t i_s; /* index into the invlist array where 'start' + should go */ + SSize_t i_e = 0; /* And the index where 'end' should go */ + UV cur_highest; /* The highest code point in the inversion list + upon entry to this function */ + + /* This range becomes the whole inversion list if none already existed */ + if (invlist == NULL) { + invlist = _new_invlist(2); + _append_range_to_invlist(invlist, start, end); + return invlist; + } + + /* Likewise, if the inversion list is currently empty */ + len = _invlist_len(invlist); + if (len == 0) { + _append_range_to_invlist(invlist, start, end); + return invlist; + } + + /* Starting here, we have to know the internals of the list */ + array = invlist_array(invlist); + + /* If the new range ends higher than the current highest ... */ + cur_highest = invlist_highest(invlist); + if (end > cur_highest) { + + /* If the whole range is higher, we can just append it */ + if (start > cur_highest) { + _append_range_to_invlist(invlist, start, end); + return invlist; + } + + /* Otherwise, add the portion that is higher ... */ + _append_range_to_invlist(invlist, cur_highest + 1, end); + + /* ... and continue on below to handle the rest. As a result of the + * above append, we know that the index of the end of the range is the + * final even numbered one of the array. Recall that the final element + * always starts a range that extends to infinity. If that range is in + * the set (meaning the set goes from here to infinity), it will be an + * even index, but if it isn't in the set, it's odd, and the final + * range in the set is one less, which is even. */ + if (end == UV_MAX) { + i_e = len; + } + else { + i_e = len - 2; + } + } + + /* We have dealt with appending, now see about prepending. If the new + * range starts lower than the current lowest ... */ + if (start < array[0]) { + + /* Adding something which has 0 in it is somewhat tricky, and uncommon. + * Let the union code handle it, rather than having to know the + * trickiness in two code places. */ + if (UNLIKELY(start == 0)) { + SV* range_invlist; + + range_invlist = _new_invlist(2); + _append_range_to_invlist(range_invlist, start, end); + + _invlist_union(invlist, range_invlist, &invlist); + + SvREFCNT_dec_NN(range_invlist); + + return invlist; + } + + /* If the whole new range comes before the first entry, and doesn't + * extend it, we have to insert it as an additional range */ + if (end < array[0] - 1) { + i_s = i_e = -1; + goto splice_in_new_range; + } + + /* Here the new range adjoins the existing first range, extending it + * downwards. */ + array[0] = start; + + /* And continue on below to handle the rest. We know that the index of + * the beginning of the range is the first one of the array */ + i_s = 0; + } + else { /* Not prepending any part of the new range to the existing list. + * Find where in the list it should go. This finds i_s, such that: + * invlist[i_s] <= start < array[i_s+1] + */ + i_s = _invlist_search(invlist, start); + } + + /* At this point, any extending before the beginning of the inversion list + * and/or after the end has been done. This has made it so that, in the + * code below, each endpoint of the new range is either in a range that is + * in the set, or is in a gap between two ranges that are. This means we + * don't have to worry about exceeding the array bounds. + * + * Find where in the list the new range ends (but we can skip this if we + * have already determined what it is, or if it will be the same as i_s, + * which we already have computed) */ + if (i_e == 0) { + i_e = (start == end) + ? i_s + : _invlist_search(invlist, end); + } + + /* Here generally invlist[i_e] <= end < array[i_e+1]. But if invlist[i_e] + * is a range that goes to infinity there is no element at invlist[i_e+1], + * so only the first relation holds. */ + + if ( ! ELEMENT_RANGE_MATCHES_INVLIST(i_s)) { + + /* Here, the ranges on either side of the beginning of the new range + * are in the set, and this range starts in the gap between them. + * + * The new range extends the range above it downwards if the new range + * ends at or above that range's start */ + const bool extends_the_range_above = ( end == UV_MAX + || end + 1 >= array[i_s+1]); + + /* The new range extends the range below it upwards if it begins just + * after where that range ends */ + if (start == array[i_s]) { + + /* If the new range fills the entire gap between the other ranges, + * they will get merged together. Other ranges may also get + * merged, depending on how many of them the new range spans. In + * the general case, we do the merge later, just once, after we + * figure out how many to merge. But in the case where the new + * range exactly spans just this one gap (possibly extending into + * the one above), we do the merge here, and an early exit. This + * is done here to avoid having to special case later. */ + if (i_e - i_s <= 1) { + + /* If i_e - i_s == 1, it means that the new range terminates + * within the range above, and hence 'extends_the_range_above' + * must be true. (If the range above it extends to infinity, + * 'i_s+2' will be above the array's limit, but 'len-i_s-2' + * will be 0, so no harm done.) */ + if (extends_the_range_above) { + Move(array + i_s + 2, array + i_s, len - i_s - 2, UV); + invlist_set_len(invlist, + len - 2, + *(get_invlist_offset_addr(invlist))); + return invlist; + } + + /* Here, i_e must == i_s. We keep them in sync, as they apply + * to the same range, and below we are about to decrement i_s + * */ + i_e--; + } + + /* Here, the new range is adjacent to the one below. (It may also + * span beyond the range above, but that will get resolved later.) + * Extend the range below to include this one. */ + array[i_s] = (end == UV_MAX) ? UV_MAX : end + 1; + i_s--; + start = array[i_s]; + } + else if (extends_the_range_above) { + + /* Here the new range only extends the range above it, but not the + * one below. It merges with the one above. Again, we keep i_e + * and i_s in sync if they point to the same range */ + if (i_e == i_s) { + i_e++; + } + i_s++; + array[i_s] = start; + } + } + + /* Here, we've dealt with the new range start extending any adjoining + * existing ranges. + * + * If the new range extends to infinity, it is now the final one, + * regardless of what was there before */ + if (UNLIKELY(end == UV_MAX)) { + invlist_set_len(invlist, i_s + 1, *(get_invlist_offset_addr(invlist))); + return invlist; + } + + /* If i_e started as == i_s, it has also been dealt with, + * and been updated to the new i_s, which will fail the following if */ + if (! ELEMENT_RANGE_MATCHES_INVLIST(i_e)) { + + /* Here, the ranges on either side of the end of the new range are in + * the set, and this range ends in the gap between them. + * + * If this range is adjacent to (hence extends) the range above it, it + * becomes part of that range; likewise if it extends the range below, + * it becomes part of that range */ + if (end + 1 == array[i_e+1]) { + i_e++; + array[i_e] = start; + } + else if (start <= array[i_e]) { + array[i_e] = end + 1; + i_e--; + } + } + + if (i_s == i_e) { + + /* If the range fits entirely in an existing range (as possibly already + * extended above), it doesn't add anything new */ + if (ELEMENT_RANGE_MATCHES_INVLIST(i_s)) { + return invlist; + } + + /* Here, no part of the range is in the list. Must add it. It will + * occupy 2 more slots */ + splice_in_new_range: + + invlist_extend(invlist, len + 2); + array = invlist_array(invlist); + /* Move the rest of the array down two slots. Don't include any + * trailing NUL */ + Move(array + i_e + 1, array + i_e + 3, len - i_e - 1, UV); + + /* Do the actual splice */ + array[i_e+1] = start; + array[i_e+2] = end + 1; + invlist_set_len(invlist, len + 2, *(get_invlist_offset_addr(invlist))); + return invlist; + } + + /* Here the new range crossed the boundaries of a pre-existing range. The + * code above has adjusted things so that both ends are in ranges that are + * in the set. This means everything in between must also be in the set. + * Just squash things together */ + Move(array + i_e + 1, array + i_s + 1, len - i_e - 1, UV); + invlist_set_len(invlist, + len - i_e + i_s, + *(get_invlist_offset_addr(invlist))); + + return invlist; +} + +SV* +Perl__setup_canned_invlist(pTHX_ const STRLEN size, const UV element0, + UV** other_elements_ptr) +{ + /* Create and return an inversion list whose contents are to be populated + * by the caller. The caller gives the number of elements (in 'size') and + * the very first element ('element0'). This function will set + * '*other_elements_ptr' to an array of UVs, where the remaining elements + * are to be placed. + * + * Obviously there is some trust involved that the caller will properly + * fill in the other elements of the array. + * + * (The first element needs to be passed in, as the underlying code does + * things differently depending on whether it is zero or non-zero) */ + + SV* invlist = _new_invlist(size); + bool offset; + + PERL_ARGS_ASSERT__SETUP_CANNED_INVLIST; + + invlist = add_cp_to_invlist(invlist, element0); + offset = *get_invlist_offset_addr(invlist); + + invlist_set_len(invlist, size, offset); + *other_elements_ptr = invlist_array(invlist) + 1; + return invlist; +} + +#endif + +#ifndef PERL_IN_XSUB_RE +void +Perl__invlist_invert(pTHX_ SV* const invlist) +{ + /* Complement the input inversion list. This adds a 0 if the list didn't + * have a zero; removes it otherwise. As described above, the data + * structure is set up so that this is very efficient */ + + PERL_ARGS_ASSERT__INVLIST_INVERT; + + assert(! invlist_is_iterating(invlist)); + + /* The inverse of matching nothing is matching everything */ + if (_invlist_len(invlist) == 0) { + _append_range_to_invlist(invlist, 0, UV_MAX); + return; + } + + *get_invlist_offset_addr(invlist) = ! *get_invlist_offset_addr(invlist); +} + +SV* +Perl_invlist_clone(pTHX_ SV* const invlist, SV* new_invlist) +{ + /* Return a new inversion list that is a copy of the input one, which is + * unchanged. The new list will not be mortal even if the old one was. */ + + const STRLEN nominal_length = _invlist_len(invlist); + const STRLEN physical_length = SvCUR(invlist); + const bool offset = *(get_invlist_offset_addr(invlist)); + + PERL_ARGS_ASSERT_INVLIST_CLONE; + + if (new_invlist == NULL) { + new_invlist = _new_invlist(nominal_length); + } + else { + sv_upgrade(new_invlist, SVt_INVLIST); + initialize_invlist_guts(new_invlist, nominal_length); + } + + *(get_invlist_offset_addr(new_invlist)) = offset; + invlist_set_len(new_invlist, nominal_length, offset); + Copy(SvPVX(invlist), SvPVX(new_invlist), physical_length, char); + + return new_invlist; +} + +#endif + + +#ifndef PERL_IN_XSUB_RE +void +Perl__invlist_dump(pTHX_ PerlIO *file, I32 level, + const char * const indent, SV* const invlist) +{ + /* Designed to be called only by do_sv_dump(). Dumps out the ranges of the + * inversion list 'invlist' to 'file' at 'level' Each line is prefixed by + * the string 'indent'. The output looks like this: + [0] 0x000A .. 0x000D + [2] 0x0085 + [4] 0x2028 .. 0x2029 + [6] 0x3104 .. INFTY + * This means that the first range of code points matched by the list are + * 0xA through 0xD; the second range contains only the single code point + * 0x85, etc. An inversion list is an array of UVs. Two array elements + * are used to define each range (except if the final range extends to + * infinity, only a single element is needed). The array index of the + * first element for the corresponding range is given in brackets. */ + + UV start, end; + STRLEN count = 0; + + PERL_ARGS_ASSERT__INVLIST_DUMP; + + if (invlist_is_iterating(invlist)) { + Perl_dump_indent(aTHX_ level, file, + "%sCan't dump inversion list because is in middle of iterating\n", + indent); + return; + } + + invlist_iterinit(invlist); + while (invlist_iternext(invlist, &start, &end)) { + if (end == UV_MAX) { + Perl_dump_indent(aTHX_ level, file, + "%s[%" UVuf "] 0x%04" UVXf " .. INFTY\n", + indent, (UV)count, start); + } + else if (end != start) { + Perl_dump_indent(aTHX_ level, file, + "%s[%" UVuf "] 0x%04" UVXf " .. 0x%04" UVXf "\n", + indent, (UV)count, start, end); + } + else { + Perl_dump_indent(aTHX_ level, file, "%s[%" UVuf "] 0x%04" UVXf "\n", + indent, (UV)count, start); + } + count += 2; + } +} + +#endif + +#if defined(PERL_ARGS_ASSERT__INVLISTEQ) && !defined(PERL_IN_XSUB_RE) +bool +Perl__invlistEQ(pTHX_ SV* const a, SV* const b, const bool complement_b) +{ + /* Return a boolean as to if the two passed in inversion lists are + * identical. The final argument, if TRUE, says to take the complement of + * the second inversion list before doing the comparison */ + + const UV len_a = _invlist_len(a); + UV len_b = _invlist_len(b); + + const UV* array_a = NULL; + const UV* array_b = NULL; + + PERL_ARGS_ASSERT__INVLISTEQ; + + /* This code avoids accessing the arrays unless it knows the length is + * non-zero */ + + if (len_a == 0) { + if (len_b == 0) { + return ! complement_b; + } + } + else { + array_a = invlist_array(a); + } + + if (len_b != 0) { + array_b = invlist_array(b); + } + + /* If are to compare 'a' with the complement of b, set it + * up so are looking at b's complement. */ + if (complement_b) { + + /* The complement of nothing is everything, so would have to have + * just one element, starting at zero (ending at infinity) */ + if (len_b == 0) { + return (len_a == 1 && array_a[0] == 0); + } + if (array_b[0] == 0) { + + /* Otherwise, to complement, we invert. Here, the first element is + * 0, just remove it. To do this, we just pretend the array starts + * one later */ + + array_b++; + len_b--; + } + else { + + /* But if the first element is not zero, we pretend the list starts + * at the 0 that is always stored immediately before the array. */ + array_b--; + len_b++; + } + } + + return len_a == len_b + && memEQ(array_a, array_b, len_a * sizeof(array_a[0])); + +} +#endif + +#undef HEADER_LENGTH +#undef TO_INTERNAL_SIZE +#undef FROM_INTERNAL_SIZE +#undef INVLIST_VERSION_ID + +/* End of inversion list object */ Index: gnu/usr.bin/perl/regcomp_study.c =================================================================== RCS file: gnu/usr.bin/perl/regcomp_study.c diff -N gnu/usr.bin/perl/regcomp_study.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/regcomp_study.c 21 Feb 2024 15:47:03 -0000 @@ -0,0 +1,3821 @@ +#ifdef PERL_EXT_RE_BUILD +#include "re_top.h" +#endif + +#include "EXTERN.h" +#define PERL_IN_REGEX_ENGINE +#define PERL_IN_REGCOMP_ANY +#define PERL_IN_REGCOMP_STUDY_C +#include "perl.h" + +#ifdef PERL_IN_XSUB_RE +# include "re_comp.h" +#else +# include "regcomp.h" +#endif + +#include "invlist_inline.h" +#include "unicode_constants.h" +#include "regcomp_internal.h" + +#define INIT_AND_WITHP \ + assert(!and_withp); \ + Newx(and_withp, 1, regnode_ssc); \ + SAVEFREEPV(and_withp) + + +STATIC void +S_unwind_scan_frames(pTHX_ const void *p) +{ + PERL_ARGS_ASSERT_UNWIND_SCAN_FRAMES; + scan_frame *f= (scan_frame *)p; + do { + scan_frame *n= f->next_frame; + Safefree(f); + f= n; + } while (f); +} + +/* Follow the next-chain of the current node and optimize away + all the NOTHINGs from it. + */ +STATIC void +S_rck_elide_nothing(pTHX_ regnode *node) +{ + PERL_ARGS_ASSERT_RCK_ELIDE_NOTHING; + + if (OP(node) != CURLYX) { + const int max = (REGNODE_OFF_BY_ARG(OP(node)) + ? I32_MAX + /* I32 may be smaller than U16 on CRAYs! */ + : (I32_MAX < U16_MAX ? I32_MAX : U16_MAX)); + int off = (REGNODE_OFF_BY_ARG(OP(node)) ? ARG1u(node) : NEXT_OFF(node)); + int noff; + regnode *n = node; + + /* Skip NOTHING and LONGJMP. */ + while ( + (n = regnext(n)) + && ( + (REGNODE_TYPE(OP(n)) == NOTHING && (noff = NEXT_OFF(n))) + || ((OP(n) == LONGJMP) && (noff = ARG1u(n))) + ) + && off + noff < max + ) { + off += noff; + } + if (REGNODE_OFF_BY_ARG(OP(node))) + ARG1u(node) = off; + else + NEXT_OFF(node) = off; + } + return; +} + + +/* + * As best we can, determine the characters that can match the start of + * the given EXACTF-ish node. This is for use in creating ssc nodes, so there + * can be false positive matches + * + * Returns the invlist as a new SV*; it is the caller's responsibility to + * call SvREFCNT_dec() when done with it. + */ +STATIC SV* +S_make_exactf_invlist(pTHX_ RExC_state_t *pRExC_state, regnode *node) +{ + const U8 * s = (U8*)STRING(node); + SSize_t bytelen = STR_LEN(node); + UV uc; + /* Start out big enough for 2 separate code points */ + SV* invlist = _new_invlist(4); + + PERL_ARGS_ASSERT_MAKE_EXACTF_INVLIST; + + if (! UTF) { + uc = *s; + + /* We punt and assume can match anything if the node begins + * with a multi-character fold. Things are complicated. For + * example, /ffi/i could match any of: + * "\N{LATIN SMALL LIGATURE FFI}" + * "\N{LATIN SMALL LIGATURE FF}I" + * "F\N{LATIN SMALL LIGATURE FI}" + * plus several other things; and making sure we have all the + * possibilities is hard. */ + if (is_MULTI_CHAR_FOLD_latin1_safe(s, s + bytelen)) { + invlist = _add_range_to_invlist(invlist, 0, UV_MAX); + } + else { + /* Any Latin1 range character can potentially match any + * other depending on the locale, and in Turkic locales, 'I' and + * 'i' can match U+130 and U+131 */ + if (OP(node) == EXACTFL) { + _invlist_union(invlist, PL_Latin1, &invlist); + if (isALPHA_FOLD_EQ(uc, 'I')) { + invlist = add_cp_to_invlist(invlist, + LATIN_SMALL_LETTER_DOTLESS_I); + invlist = add_cp_to_invlist(invlist, + LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE); + } + } + else { + /* But otherwise, it matches at least itself. We can + * quickly tell if it has a distinct fold, and if so, + * it matches that as well */ + invlist = add_cp_to_invlist(invlist, uc); + if (IS_IN_SOME_FOLD_L1(uc)) + invlist = add_cp_to_invlist(invlist, PL_fold_latin1[uc]); + } + + /* Some characters match above-Latin1 ones under /i. This + * is true of EXACTFL ones when the locale is UTF-8 */ + if (HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(uc) + && (! isASCII(uc) || ! inRANGE(OP(node), EXACTFAA, + EXACTFAA_NO_TRIE))) + { + add_above_Latin1_folds(pRExC_state, (U8) uc, &invlist); + } + } + } + else { /* Pattern is UTF-8 */ + U8 folded[UTF8_MAX_FOLD_CHAR_EXPAND * UTF8_MAXBYTES_CASE + 1] = { '\0' }; + const U8* e = s + bytelen; + IV fc; + + fc = uc = utf8_to_uvchr_buf(s, s + bytelen, NULL); + + /* The only code points that aren't folded in a UTF EXACTFish + * node are the problematic ones in EXACTFL nodes */ + if (OP(node) == EXACTFL && is_PROBLEMATIC_LOCALE_FOLDEDS_START_cp(uc)) { + /* We need to check for the possibility that this EXACTFL + * node begins with a multi-char fold. Therefore we fold + * the first few characters of it so that we can make that + * check */ + U8 *d = folded; + int i; + + fc = -1; + for (i = 0; i < UTF8_MAX_FOLD_CHAR_EXPAND && s < e; i++) { + if (isASCII(*s)) { + *(d++) = (U8) toFOLD(*s); + if (fc < 0) { /* Save the first fold */ + fc = *(d-1); + } + s++; + } + else { + STRLEN len; + UV fold = toFOLD_utf8_safe(s, e, d, &len); + if (fc < 0) { /* Save the first fold */ + fc = fold; + } + d += len; + s += UTF8SKIP(s); + } + } + + /* And set up so the code below that looks in this folded + * buffer instead of the node's string */ + e = d; + s = folded; + } + + /* When we reach here 's' points to the fold of the first + * character(s) of the node; and 'e' points to far enough along + * the folded string to be just past any possible multi-char + * fold. + * + * Like the non-UTF case above, we punt if the node begins with a + * multi-char fold */ + + if (is_MULTI_CHAR_FOLD_utf8_safe(s, e)) { + invlist = _add_range_to_invlist(invlist, 0, UV_MAX); + } + else { /* Single char fold */ + unsigned int k; + U32 first_fold; + const U32 * remaining_folds; + Size_t folds_count; + + /* It matches itself */ + invlist = add_cp_to_invlist(invlist, fc); + + /* ... plus all the things that fold to it, which are found in + * PL_utf8_foldclosures */ + folds_count = _inverse_folds(fc, &first_fold, + &remaining_folds); + for (k = 0; k < folds_count; k++) { + UV c = (k == 0) ? first_fold : remaining_folds[k-1]; + + /* /aa doesn't allow folds between ASCII and non- */ + if ( inRANGE(OP(node), EXACTFAA, EXACTFAA_NO_TRIE) + && isASCII(c) != isASCII(fc)) + { + continue; + } + + invlist = add_cp_to_invlist(invlist, c); + } + + if (OP(node) == EXACTFL) { + + /* If either [iI] are present in an EXACTFL node the above code + * should have added its normal case pair, but under a Turkish + * locale they could match instead the case pairs from it. Add + * those as potential matches as well */ + if (isALPHA_FOLD_EQ(fc, 'I')) { + invlist = add_cp_to_invlist(invlist, + LATIN_SMALL_LETTER_DOTLESS_I); + invlist = add_cp_to_invlist(invlist, + LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE); + } + else if (fc == LATIN_SMALL_LETTER_DOTLESS_I) { + invlist = add_cp_to_invlist(invlist, 'I'); + } + else if (fc == LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) { + invlist = add_cp_to_invlist(invlist, 'i'); + } + } + } + } + + return invlist; +} + + +/* Mark that we cannot extend a found fixed substring at this point. + Update the longest found anchored substring or the longest found + floating substrings if needed. */ + +void +Perl_scan_commit(pTHX_ const RExC_state_t *pRExC_state, scan_data_t *data, + SSize_t *minlenp, int is_inf) +{ + const STRLEN l = CHR_SVLEN(data->last_found); + SV * const longest_sv = data->substrs[data->cur_is_floating].str; + const STRLEN old_l = CHR_SVLEN(longest_sv); + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + PERL_ARGS_ASSERT_SCAN_COMMIT; + + if ((l >= old_l) && ((l > old_l) || (data->flags & SF_BEFORE_EOL))) { + const U8 i = data->cur_is_floating; + SvSetMagicSV(longest_sv, data->last_found); + data->substrs[i].min_offset = l ? data->last_start_min : data->pos_min; + + if (!i) /* fixed */ + data->substrs[0].max_offset = data->substrs[0].min_offset; + else { /* float */ + data->substrs[1].max_offset = + (is_inf) + ? OPTIMIZE_INFTY + : (l + ? data->last_start_max + : (data->pos_delta > OPTIMIZE_INFTY - data->pos_min + ? OPTIMIZE_INFTY + : data->pos_min + data->pos_delta)); + } + + data->substrs[i].flags &= ~SF_BEFORE_EOL; + data->substrs[i].flags |= data->flags & SF_BEFORE_EOL; + data->substrs[i].minlenp = minlenp; + data->substrs[i].lookbehind = 0; + } + + SvCUR_set(data->last_found, 0); + { + SV * const sv = data->last_found; + if (SvUTF8(sv) && SvMAGICAL(sv)) { + MAGIC * const mg = mg_find(sv, PERL_MAGIC_utf8); + if (mg) + mg->mg_len = 0; + } + } + data->last_end = -1; + data->flags &= ~SF_BEFORE_EOL; + DEBUG_STUDYDATA("commit", data, 0, is_inf, -1, -1, -1); +} + +/* An SSC is just a regnode_charclass_posix with an extra field: the inversion + * list that describes which code points it matches */ + +STATIC void +S_ssc_anything(pTHX_ regnode_ssc *ssc) +{ + /* Set the SSC 'ssc' to match an empty string or any code point */ + + PERL_ARGS_ASSERT_SSC_ANYTHING; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + /* mortalize so won't leak */ + ssc->invlist = sv_2mortal(_add_range_to_invlist(NULL, 0, UV_MAX)); + ANYOF_FLAGS(ssc) |= SSC_MATCHES_EMPTY_STRING; /* Plus matches empty */ +} + +STATIC int +S_ssc_is_anything(const regnode_ssc *ssc) +{ + /* Returns TRUE if the SSC 'ssc' can match the empty string and any code + * point; FALSE otherwise. Thus, this is used to see if using 'ssc' buys + * us anything: if the function returns TRUE, 'ssc' hasn't been restricted + * in any way, so there's no point in using it */ + + UV start = 0, end = 0; /* Initialize due to messages from dumb compiler */ + bool ret; + + PERL_ARGS_ASSERT_SSC_IS_ANYTHING; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + if (! (ANYOF_FLAGS(ssc) & SSC_MATCHES_EMPTY_STRING)) { + return FALSE; + } + + /* See if the list consists solely of the range 0 - Infinity */ + invlist_iterinit(ssc->invlist); + ret = invlist_iternext(ssc->invlist, &start, &end) + && start == 0 + && end == UV_MAX; + + invlist_iterfinish(ssc->invlist); + + if (ret) { + return TRUE; + } + + /* If e.g., both \w and \W are set, matches everything */ + if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) { + int i; + for (i = 0; i < ANYOF_POSIXL_MAX; i += 2) { + if (ANYOF_POSIXL_TEST(ssc, i) && ANYOF_POSIXL_TEST(ssc, i+1)) { + return TRUE; + } + } + } + + return FALSE; +} + +void +Perl_ssc_init(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc) +{ + /* Initializes the SSC 'ssc'. This includes setting it to match an empty + * string, any code point, or any posix class under locale */ + + PERL_ARGS_ASSERT_SSC_INIT; + + Zero(ssc, 1, regnode_ssc); + set_ANYOF_SYNTHETIC(ssc); + ARG1u_SET(ssc, ANYOF_MATCHES_ALL_OUTSIDE_BITMAP_VALUE); + ssc_anything(ssc); + + /* If any portion of the regex is to operate under locale rules that aren't + * fully known at compile time, initialization includes it. The reason + * this isn't done for all regexes is that the optimizer was written under + * the assumption that locale was all-or-nothing. Given the complexity and + * lack of documentation in the optimizer, and that there are inadequate + * test cases for locale, many parts of it may not work properly, it is + * safest to avoid locale unless necessary. */ + if (RExC_contains_locale) { + ANYOF_POSIXL_SETALL(ssc); + } + else { + ANYOF_POSIXL_ZERO(ssc); + } +} + +STATIC int +S_ssc_is_cp_posixl_init(const RExC_state_t *pRExC_state, + const regnode_ssc *ssc) +{ + /* Returns TRUE if the SSC 'ssc' is in its initial state with regard only + * to the list of code points matched, and locale posix classes; hence does + * not check its flags) */ + + UV start = 0, end = 0; /* Initialize due to messages from dumb compiler */ + bool ret; + + PERL_ARGS_ASSERT_SSC_IS_CP_POSIXL_INIT; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + invlist_iterinit(ssc->invlist); + ret = invlist_iternext(ssc->invlist, &start, &end) + && start == 0 + && end == UV_MAX; + + invlist_iterfinish(ssc->invlist); + + if (! ret) { + return FALSE; + } + + if (RExC_contains_locale && ! ANYOF_POSIXL_SSC_TEST_ALL_SET(ssc)) { + return FALSE; + } + + return TRUE; +} + + +STATIC SV* +S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state, + const regnode_charclass* const node) +{ + /* Returns a mortal inversion list defining which code points are matched + * by 'node', which is of ANYOF-ish type . Handles complementing the + * result if appropriate. If some code points aren't knowable at this + * time, the returned list must, and will, contain every code point that is + * a possibility. */ + + SV* invlist = NULL; + SV* only_utf8_locale_invlist = NULL; + bool new_node_has_latin1 = FALSE; + const U8 flags = (REGNODE_TYPE(OP(node)) == ANYOF) + ? ANYOF_FLAGS(node) + : 0; + + PERL_ARGS_ASSERT_GET_ANYOF_CP_LIST_FOR_SSC; + + /* Look at the data structure created by S_set_ANYOF_arg() */ + if (ANYOF_MATCHES_ALL_OUTSIDE_BITMAP(node)) { + invlist = sv_2mortal(_new_invlist(1)); + invlist = _add_range_to_invlist(invlist, NUM_ANYOF_CODE_POINTS, UV_MAX); + } + else if (ANYOF_HAS_AUX(node)) { + const U32 n = ARG1u(node); + SV * const rv = MUTABLE_SV(RExC_rxi->data->data[n]); + AV * const av = MUTABLE_AV(SvRV(rv)); + SV **const ary = AvARRAY(av); + + if (av_tindex_skip_len_mg(av) >= DEFERRED_USER_DEFINED_INDEX) { + + /* Here there are things that won't be known until runtime -- we + * have to assume it could be anything */ + invlist = sv_2mortal(_new_invlist(1)); + return _add_range_to_invlist(invlist, 0, UV_MAX); + } + else if (ary[INVLIST_INDEX]) { + + /* Use the node's inversion list */ + invlist = sv_2mortal(invlist_clone(ary[INVLIST_INDEX], NULL)); + } + + /* Get the code points valid only under UTF-8 locales */ + if ( (flags & ANYOFL_FOLD) + && av_tindex_skip_len_mg(av) >= ONLY_LOCALE_MATCHES_INDEX) + { + only_utf8_locale_invlist = ary[ONLY_LOCALE_MATCHES_INDEX]; + } + } + + if (! invlist) { + invlist = sv_2mortal(_new_invlist(0)); + } + + /* An ANYOF node contains a bitmap for the first NUM_ANYOF_CODE_POINTS + * code points, and an inversion list for the others, but if there are code + * points that should match only conditionally on the target string being + * UTF-8, those are placed in the inversion list, and not the bitmap. + * Since there are circumstances under which they could match, they are + * included in the SSC. But if the ANYOF node is to be inverted, we have + * to exclude them here, so that when we invert below, the end result + * actually does include them. (Think about "\xe0" =~ /[^\xc0]/di;). We + * have to do this here before we add the unconditionally matched code + * points */ + if (flags & ANYOF_INVERT) { + _invlist_intersection_complement_2nd(invlist, + PL_UpperLatin1, + &invlist); + } + + /* Add in the points from the bit map */ + if (REGNODE_TYPE(OP(node)) == ANYOF){ + for (unsigned i = 0; i < NUM_ANYOF_CODE_POINTS; i++) { + if (ANYOF_BITMAP_TEST(node, i)) { + unsigned int start = i++; + + for (; i < NUM_ANYOF_CODE_POINTS + && ANYOF_BITMAP_TEST(node, i); ++i) + { + /* empty */ + } + invlist = _add_range_to_invlist(invlist, start, i-1); + new_node_has_latin1 = TRUE; + } + } + } + + /* If this can match all upper Latin1 code points, have to add them + * as well. But don't add them if inverting, as when that gets done below, + * it would exclude all these characters, including the ones it shouldn't + * that were added just above */ + if ( ! (flags & ANYOF_INVERT) + && OP(node) == ANYOFD + && (flags & ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared)) + { + _invlist_union(invlist, PL_UpperLatin1, &invlist); + } + + /* Similarly for these */ + if (ANYOF_MATCHES_ALL_OUTSIDE_BITMAP(node)) { + _invlist_union_complement_2nd(invlist, PL_InBitmap, &invlist); + } + + if (flags & ANYOF_INVERT) { + _invlist_invert(invlist); + } + else if (flags & ANYOFL_FOLD) { + if (new_node_has_latin1) { + + /* These folds are potential in Turkic locales */ + if (_invlist_contains_cp(invlist, 'i')) { + invlist = add_cp_to_invlist(invlist, + LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE); + } + if (_invlist_contains_cp(invlist, 'I')) { + invlist = add_cp_to_invlist(invlist, + LATIN_SMALL_LETTER_DOTLESS_I); + } + + /* Under /li, any 0-255 could fold to any other 0-255, depending on + * the locale. We can skip this if there are no 0-255 at all. */ + _invlist_union(invlist, PL_Latin1, &invlist); + } + else { + if (_invlist_contains_cp(invlist, LATIN_SMALL_LETTER_DOTLESS_I)) { + invlist = add_cp_to_invlist(invlist, 'I'); + } + if (_invlist_contains_cp(invlist, + LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE)) + { + invlist = add_cp_to_invlist(invlist, 'i'); + } + } + } + + /* Similarly add the UTF-8 locale possible matches. These have to be + * deferred until after the non-UTF-8 locale ones are taken care of just + * above, or it leads to wrong results under ANYOF_INVERT */ + if (only_utf8_locale_invlist) { + _invlist_union_maybe_complement_2nd(invlist, + only_utf8_locale_invlist, + flags & ANYOF_INVERT, + &invlist); + } + + return invlist; +} + +/* 'AND' a given class with another one. Can create false positives. 'ssc' + * should not be inverted. */ + +STATIC void +S_ssc_and(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, + const regnode_charclass *and_with) +{ + /* Accumulate into SSC 'ssc' its 'AND' with 'and_with', which is either + * another SSC or a regular ANYOF class. Can create false positives. */ + + SV* anded_cp_list; + U8 and_with_flags = (REGNODE_TYPE(OP(and_with)) == ANYOF) + ? ANYOF_FLAGS(and_with) + : 0; + U8 anded_flags; + + PERL_ARGS_ASSERT_SSC_AND; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + /* 'and_with' is used as-is if it too is an SSC; otherwise have to extract + * the code point inversion list and just the relevant flags */ + if (is_ANYOF_SYNTHETIC(and_with)) { + anded_cp_list = ((regnode_ssc *)and_with)->invlist; + anded_flags = and_with_flags; + + /* XXX This is a kludge around what appears to be deficiencies in the + * optimizer. If we make S_ssc_anything() add in the WARN_SUPER flag, + * there are paths through the optimizer where it doesn't get weeded + * out when it should. And if we don't make some extra provision for + * it like the code just below, it doesn't get added when it should. + * This solution is to add it only when AND'ing, which is here, and + * only when what is being AND'ed is the pristine, original node + * matching anything. Thus it is like adding it to ssc_anything() but + * only when the result is to be AND'ed. Probably the same solution + * could be adopted for the same problem we have with /l matching, + * which is solved differently in S_ssc_init(), and that would lead to + * fewer false positives than that solution has. But if this solution + * creates bugs, the consequences are only that a warning isn't raised + * that should be; while the consequences for having /l bugs is + * incorrect matches */ + if (ssc_is_anything((regnode_ssc *)and_with)) { + anded_flags |= ANYOF_WARN_SUPER__shared; + } + } + else { + anded_cp_list = get_ANYOF_cp_list_for_ssc(pRExC_state, and_with); + if (OP(and_with) == ANYOFD) { + anded_flags = and_with_flags & ANYOF_COMMON_FLAGS; + } + else { + anded_flags = and_with_flags + & ( ANYOF_COMMON_FLAGS + |ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared + |ANYOF_HAS_EXTRA_RUNTIME_MATCHES); + if (and_with_flags & ANYOFL_UTF8_LOCALE_REQD) { + anded_flags &= ANYOF_HAS_EXTRA_RUNTIME_MATCHES; + } + } + } + + ANYOF_FLAGS(ssc) &= anded_flags; + + /* Below, C1 is the list of code points in 'ssc'; P1, its posix classes. + * C2 is the list of code points in 'and-with'; P2, its posix classes. + * 'and_with' may be inverted. When not inverted, we have the situation of + * computing: + * (C1 | P1) & (C2 | P2) + * = (C1 & (C2 | P2)) | (P1 & (C2 | P2)) + * = ((C1 & C2) | (C1 & P2)) | ((P1 & C2) | (P1 & P2)) + * <= ((C1 & C2) | P2)) | ( P1 | (P1 & P2)) + * <= ((C1 & C2) | P1 | P2) + * Alternatively, the last few steps could be: + * = ((C1 & C2) | (C1 & P2)) | ((P1 & C2) | (P1 & P2)) + * <= ((C1 & C2) | C1 ) | ( C2 | (P1 & P2)) + * <= (C1 | C2 | (P1 & P2)) + * We favor the second approach if either P1 or P2 is non-empty. This is + * because these components are a barrier to doing optimizations, as what + * they match cannot be known until the moment of matching as they are + * dependent on the current locale, 'AND"ing them likely will reduce or + * eliminate them. + * But we can do better if we know that C1,P1 are in their initial state (a + * frequent occurrence), each matching everything: + * () & (C2 | P2) = C2 | P2 + * Similarly, if C2,P2 are in their initial state (again a frequent + * occurrence), the result is a no-op + * (C1 | P1) & () = C1 | P1 + * + * Inverted, we have + * (C1 | P1) & ~(C2 | P2) = (C1 | P1) & (~C2 & ~P2) + * = (C1 & (~C2 & ~P2)) | (P1 & (~C2 & ~P2)) + * <= (C1 & ~C2) | (P1 & ~P2) + * */ + + if ((and_with_flags & ANYOF_INVERT) + && ! is_ANYOF_SYNTHETIC(and_with)) + { + unsigned int i; + + ssc_intersection(ssc, + anded_cp_list, + FALSE /* Has already been inverted */ + ); + + /* If either P1 or P2 is empty, the intersection will be also; can skip + * the loop */ + if (! (and_with_flags & ANYOF_MATCHES_POSIXL)) { + ANYOF_POSIXL_ZERO(ssc); + } + else if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) { + + /* Note that the Posix class component P from 'and_with' actually + * looks like: + * P = Pa | Pb | ... | Pn + * where each component is one posix class, such as in [\w\s]. + * Thus + * ~P = ~(Pa | Pb | ... | Pn) + * = ~Pa & ~Pb & ... & ~Pn + * <= ~Pa | ~Pb | ... | ~Pn + * The last is something we can easily calculate, but unfortunately + * is likely to have many false positives. We could do better + * in some (but certainly not all) instances if two classes in + * P have known relationships. For example + * :lower: <= :alpha: <= :alnum: <= \w <= :graph: <= :print: + * So + * :lower: & :print: = :lower: + * And similarly for classes that must be disjoint. For example, + * since \s and \w can have no elements in common based on rules in + * the POSIX standard, + * \w & ^\S = nothing + * Unfortunately, some vendor locales do not meet the Posix + * standard, in particular almost everything by Microsoft. + * The loop below just changes e.g., \w into \W and vice versa */ + + regnode_charclass_posixl temp; + int add = 1; /* To calculate the index of the complement */ + + Zero(&temp, 1, regnode_charclass_posixl); + ANYOF_POSIXL_ZERO(&temp); + for (i = 0; i < ANYOF_MAX; i++) { + assert(i % 2 != 0 + || ! ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i) + || ! ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i + 1)); + + if (ANYOF_POSIXL_TEST((regnode_charclass_posixl*) and_with, i)) { + ANYOF_POSIXL_SET(&temp, i + add); + } + add = 0 - add; /* 1 goes to -1; -1 goes to 1 */ + } + ANYOF_POSIXL_AND(&temp, ssc); + + } /* else ssc already has no posixes */ + } /* else: Not inverted. This routine is a no-op if 'and_with' is an SSC + in its initial state */ + else if (! is_ANYOF_SYNTHETIC(and_with) + || ! ssc_is_cp_posixl_init(pRExC_state, (regnode_ssc *)and_with)) + { + /* But if 'ssc' is in its initial state, the result is just 'and_with'; + * copy it over 'ssc' */ + if (ssc_is_cp_posixl_init(pRExC_state, ssc)) { + if (is_ANYOF_SYNTHETIC(and_with)) { + StructCopy(and_with, ssc, regnode_ssc); + } + else { + ssc->invlist = anded_cp_list; + ANYOF_POSIXL_ZERO(ssc); + if (and_with_flags & ANYOF_MATCHES_POSIXL) { + ANYOF_POSIXL_OR((regnode_charclass_posixl*) and_with, ssc); + } + } + } + else if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc) + || (and_with_flags & ANYOF_MATCHES_POSIXL)) + { + /* One or the other of P1, P2 is non-empty. */ + if (and_with_flags & ANYOF_MATCHES_POSIXL) { + ANYOF_POSIXL_AND((regnode_charclass_posixl*) and_with, ssc); + } + ssc_union(ssc, anded_cp_list, FALSE); + } + else { /* P1 = P2 = empty */ + ssc_intersection(ssc, anded_cp_list, FALSE); + } + } +} + +STATIC void +S_ssc_or(pTHX_ const RExC_state_t *pRExC_state, regnode_ssc *ssc, + const regnode_charclass *or_with) +{ + /* Accumulate into SSC 'ssc' its 'OR' with 'or_with', which is either + * another SSC or a regular ANYOF class. Can create false positives if + * 'or_with' is to be inverted. */ + + SV* ored_cp_list; + U8 ored_flags; + U8 or_with_flags = (REGNODE_TYPE(OP(or_with)) == ANYOF) + ? ANYOF_FLAGS(or_with) + : 0; + + PERL_ARGS_ASSERT_SSC_OR; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + /* 'or_with' is used as-is if it too is an SSC; otherwise have to extract + * the code point inversion list and just the relevant flags */ + if (is_ANYOF_SYNTHETIC(or_with)) { + ored_cp_list = ((regnode_ssc*) or_with)->invlist; + ored_flags = or_with_flags; + } + else { + ored_cp_list = get_ANYOF_cp_list_for_ssc(pRExC_state, or_with); + ored_flags = or_with_flags & ANYOF_COMMON_FLAGS; + if (OP(or_with) != ANYOFD) { + ored_flags |= + or_with_flags & ( ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared + |ANYOF_HAS_EXTRA_RUNTIME_MATCHES); + if (or_with_flags & ANYOFL_UTF8_LOCALE_REQD) { + ored_flags |= ANYOF_HAS_EXTRA_RUNTIME_MATCHES; + } + } + } + + ANYOF_FLAGS(ssc) |= ored_flags; + + /* Below, C1 is the list of code points in 'ssc'; P1, its posix classes. + * C2 is the list of code points in 'or-with'; P2, its posix classes. + * 'or_with' may be inverted. When not inverted, we have the simple + * situation of computing: + * (C1 | P1) | (C2 | P2) = (C1 | C2) | (P1 | P2) + * If P1|P2 yields a situation with both a class and its complement are + * set, like having both \w and \W, this matches all code points, and we + * can delete these from the P component of the ssc going forward. XXX We + * might be able to delete all the P components, but I (khw) am not certain + * about this, and it is better to be safe. + * + * Inverted, we have + * (C1 | P1) | ~(C2 | P2) = (C1 | P1) | (~C2 & ~P2) + * <= (C1 | P1) | ~C2 + * <= (C1 | ~C2) | P1 + * (which results in actually simpler code than the non-inverted case) + * */ + + if ((or_with_flags & ANYOF_INVERT) + && ! is_ANYOF_SYNTHETIC(or_with)) + { + /* We ignore P2, leaving P1 going forward */ + } /* else Not inverted */ + else if (or_with_flags & ANYOF_MATCHES_POSIXL) { + ANYOF_POSIXL_OR((regnode_charclass_posixl*)or_with, ssc); + if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) { + unsigned int i; + for (i = 0; i < ANYOF_MAX; i += 2) { + if (ANYOF_POSIXL_TEST(ssc, i) && ANYOF_POSIXL_TEST(ssc, i + 1)) + { + ssc_match_all_cp(ssc); + ANYOF_POSIXL_CLEAR(ssc, i); + ANYOF_POSIXL_CLEAR(ssc, i+1); + } + } + } + } + + ssc_union(ssc, + ored_cp_list, + FALSE /* Already has been inverted */ + ); +} + +STATIC void +S_ssc_union(pTHX_ regnode_ssc *ssc, SV* const invlist, const bool invert2nd) +{ + PERL_ARGS_ASSERT_SSC_UNION; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + _invlist_union_maybe_complement_2nd(ssc->invlist, + invlist, + invert2nd, + &ssc->invlist); +} + +STATIC void +S_ssc_intersection(pTHX_ regnode_ssc *ssc, + SV* const invlist, + const bool invert2nd) +{ + PERL_ARGS_ASSERT_SSC_INTERSECTION; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + _invlist_intersection_maybe_complement_2nd(ssc->invlist, + invlist, + invert2nd, + &ssc->invlist); +} + +STATIC void +S_ssc_add_range(pTHX_ regnode_ssc *ssc, const UV start, const UV end) +{ + PERL_ARGS_ASSERT_SSC_ADD_RANGE; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + ssc->invlist = _add_range_to_invlist(ssc->invlist, start, end); +} + +STATIC void +S_ssc_cp_and(pTHX_ regnode_ssc *ssc, const UV cp) +{ + /* AND just the single code point 'cp' into the SSC 'ssc' */ + + SV* cp_list = _new_invlist(2); + + PERL_ARGS_ASSERT_SSC_CP_AND; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + cp_list = add_cp_to_invlist(cp_list, cp); + ssc_intersection(ssc, cp_list, + FALSE /* Not inverted */ + ); + SvREFCNT_dec_NN(cp_list); +} + +STATIC void +S_ssc_clear_locale(regnode_ssc *ssc) +{ + /* Set the SSC 'ssc' to not match any locale things */ + PERL_ARGS_ASSERT_SSC_CLEAR_LOCALE; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + ANYOF_POSIXL_ZERO(ssc); + ANYOF_FLAGS(ssc) &= ~ANYOF_LOCALE_FLAGS; +} + +bool +Perl_is_ssc_worth_it(const RExC_state_t * pRExC_state, const regnode_ssc * ssc) +{ + /* The synthetic start class is used to hopefully quickly winnow down + * places where a pattern could start a match in the target string. If it + * doesn't really narrow things down that much, there isn't much point to + * having the overhead of using it. This function uses some very crude + * heuristics to decide if to use the ssc or not. + * + * It returns TRUE if 'ssc' rules out more than half what it considers to + * be the "likely" possible matches, but of course it doesn't know what the + * actual things being matched are going to be; these are only guesses + * + * For /l matches, it assumes that the only likely matches are going to be + * in the 0-255 range, uniformly distributed, so half of that is 127 + * For /a and /d matches, it assumes that the likely matches will be just + * the ASCII range, so half of that is 63 + * For /u and there isn't anything matching above the Latin1 range, it + * assumes that that is the only range likely to be matched, and uses + * half that as the cut-off: 127. If anything matches above Latin1, + * it assumes that all of Unicode could match (uniformly), except for + * non-Unicode code points and things in the General Category "Other" + * (unassigned, private use, surrogates, controls and formats). This + * is a much large number. */ + + U32 count = 0; /* Running total of number of code points matched by + 'ssc' */ + UV start, end; /* Start and end points of current range in inversion + XXX outdated. UTF-8 locales are common, what about invert? list */ + const U32 max_code_points = (LOC) + ? 256 + : (( ! UNI_SEMANTICS + || invlist_highest(ssc->invlist) < 256) + ? 128 + : NON_OTHER_COUNT); + const U32 max_match = max_code_points / 2; + + PERL_ARGS_ASSERT_IS_SSC_WORTH_IT; + + invlist_iterinit(ssc->invlist); + while (invlist_iternext(ssc->invlist, &start, &end)) { + if (start >= max_code_points) { + break; + } + end = MIN(end, max_code_points - 1); + count += end - start + 1; + if (count >= max_match) { + invlist_iterfinish(ssc->invlist); + return FALSE; + } + } + + return TRUE; +} + + +void +Perl_ssc_finalize(pTHX_ RExC_state_t *pRExC_state, regnode_ssc *ssc) +{ + /* The inversion list in the SSC is marked mortal; now we need a more + * permanent copy, which is stored the same way that is done in a regular + * ANYOF node, with the first NUM_ANYOF_CODE_POINTS code points in a bit + * map */ + + SV* invlist = invlist_clone(ssc->invlist, NULL); + + PERL_ARGS_ASSERT_SSC_FINALIZE; + + assert(is_ANYOF_SYNTHETIC(ssc)); + + /* The code in this file assumes that all but these flags aren't relevant + * to the SSC, except SSC_MATCHES_EMPTY_STRING, which should be cleared + * by the time we reach here */ + assert(! (ANYOF_FLAGS(ssc) + & ~( ANYOF_COMMON_FLAGS + |ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared + |ANYOF_HAS_EXTRA_RUNTIME_MATCHES))); + + populate_anyof_bitmap_from_invlist( (regnode *) ssc, &invlist); + + set_ANYOF_arg(pRExC_state, (regnode *) ssc, invlist, NULL, NULL); + SvREFCNT_dec(invlist); + + /* Make sure is clone-safe */ + ssc->invlist = NULL; + + if (ANYOF_POSIXL_SSC_TEST_ANY_SET(ssc)) { + ANYOF_FLAGS(ssc) |= ANYOF_MATCHES_POSIXL; + OP(ssc) = ANYOFPOSIXL; + } + else if (RExC_contains_locale) { + OP(ssc) = ANYOFL; + } + + assert(! (ANYOF_FLAGS(ssc) & ANYOF_LOCALE_FLAGS) || RExC_contains_locale); +} + +/* The below joins as many adjacent EXACTish nodes as possible into a single + * one. The regop may be changed if the node(s) contain certain sequences that + * require special handling. The joining is only done if: + * 1) there is room in the current conglomerated node to entirely contain the + * next one. + * 2) they are compatible node types + * + * The adjacent nodes actually may be separated by NOTHING-kind nodes, and + * these get optimized out + * + * XXX khw thinks this should be enhanced to fill EXACT (at least) nodes as full + * as possible, even if that means splitting an existing node so that its first + * part is moved to the preceding node. This would maximise the efficiency of + * memEQ during matching. + * + * If a node is to match under /i (folded), the number of characters it matches + * can be different than its character length if it contains a multi-character + * fold. *min_subtract is set to the total delta number of characters of the + * input nodes. + * + * And *unfolded_multi_char is set to indicate whether or not the node contains + * an unfolded multi-char fold. This happens when it won't be known until + * runtime whether the fold is valid or not; namely + * 1) for EXACTF nodes that contain LATIN SMALL LETTER SHARP S, as only if the + * target string being matched against turns out to be UTF-8 is that fold + * valid; or + * 2) for EXACTFL nodes whose folding rules depend on the locale in force at + * runtime. + * (Multi-char folds whose components are all above the Latin1 range are not + * run-time locale dependent, and have already been folded by the time this + * function is called.) + * + * This is as good a place as any to discuss the design of handling these + * multi-character fold sequences. It's been wrong in Perl for a very long + * time. There are three code points in Unicode whose multi-character folds + * were long ago discovered to mess things up. The previous designs for + * dealing with these involved assigning a special node for them. This + * approach doesn't always work, as evidenced by this example: + * "\xDFs" =~ /s\xDF/ui # Used to fail before these patches + * Both sides fold to "sss", but if the pattern is parsed to create a node that + * would match just the \xDF, it won't be able to handle the case where a + * successful match would have to cross the node's boundary. The new approach + * that hopefully generally solves the problem generates an EXACTFUP node + * that is "sss" in this case. + * + * It turns out that there are problems with all multi-character folds, and not + * just these three. Now the code is general, for all such cases. The + * approach taken is: + * 1) This routine examines each EXACTFish node that could contain multi- + * character folded sequences. Since a single character can fold into + * such a sequence, the minimum match length for this node is less than + * the number of characters in the node. This routine returns in + * *min_subtract how many characters to subtract from the actual + * length of the string to get a real minimum match length; it is 0 if + * there are no multi-char foldeds. This delta is used by the caller to + * adjust the min length of the match, and the delta between min and max, + * so that the optimizer doesn't reject these possibilities based on size + * constraints. + * + * 2) For the sequence involving the LATIN SMALL LETTER SHARP S (U+00DF) + * under /u, we fold it to 'ss' in regatom(), and in this routine, after + * joining, we scan for occurrences of the sequence 'ss' in non-UTF-8 + * EXACTFU nodes. The node type of such nodes is then changed to + * EXACTFUP, indicating it is problematic, and needs careful handling. + * (The procedures in step 1) above are sufficient to handle this case in + * UTF-8 encoded nodes.) The reason this is problematic is that this is + * the only case where there is a possible fold length change in non-UTF-8 + * patterns. By reserving a special node type for problematic cases, the + * far more common regular EXACTFU nodes can be processed faster. + * regexec.c takes advantage of this. + * + * EXACTFUP has been created as a grab-bag for (hopefully uncommon) + * problematic cases. These all only occur when the pattern is not + * UTF-8. In addition to the 'ss' sequence where there is a possible fold + * length change, it handles the situation where the string cannot be + * entirely folded. The strings in an EXACTFish node are folded as much + * as possible during compilation in regcomp.c. This saves effort in + * regex matching. By using an EXACTFUP node when it is not possible to + * fully fold at compile time, regexec.c can know that everything in an + * EXACTFU node is folded, so folding can be skipped at runtime. The only + * case where folding in EXACTFU nodes can't be done at compile time is + * the presumably uncommon MICRO SIGN, when the pattern isn't UTF-8. This + * is because its fold requires UTF-8 to represent. Thus EXACTFUP nodes + * handle two very different cases. Alternatively, there could have been + * a node type where there are length changes, one for unfolded, and one + * for both. If yet another special case needed to be created, the number + * of required node types would have to go to 7. khw figures that even + * though there are plenty of node types to spare, that the maintenance + * cost wasn't worth the small speedup of doing it that way, especially + * since he thinks the MICRO SIGN is rarely encountered in practice. + * + * There are other cases where folding isn't done at compile time, but + * none of them are under /u, and hence not for EXACTFU nodes. The folds + * in EXACTFL nodes aren't known until runtime, and vary as the locale + * changes. Some folds in EXACTF depend on if the runtime target string + * is UTF-8 or not. (regatom() will create an EXACTFU node even under /di + * when no fold in it depends on the UTF-8ness of the target string.) + * + * 3) A problem remains for unfolded multi-char folds. (These occur when the + * validity of the fold won't be known until runtime, and so must remain + * unfolded for now. This happens for the sharp s in EXACTF and EXACTFAA + * nodes when the pattern isn't in UTF-8. (Note, BTW, that there cannot + * be an EXACTF node with a UTF-8 pattern.) They also occur for various + * folds in EXACTFL nodes, regardless of the UTF-ness of the pattern.) + * The reason this is a problem is that the optimizer part of regexec.c + * (probably unwittingly, in Perl_regexec_flags()) makes an assumption + * that a character in the pattern corresponds to at most a single + * character in the target string. (And I do mean character, and not byte + * here, unlike other parts of the documentation that have never been + * updated to account for multibyte Unicode.) Sharp s in EXACTF and + * EXACTFL nodes can match the two character string 'ss'; in EXACTFAA + * nodes it can match "\x{17F}\x{17F}". These, along with other ones in + * EXACTFL nodes, violate the assumption, and they are the only instances + * where it is violated. I'm reluctant to try to change the assumption, + * as the code involved is impenetrable to me (khw), so instead the code + * here punts. This routine examines EXACTFL nodes, and (when the pattern + * isn't UTF-8) EXACTF and EXACTFAA for such unfolded folds, and returns a + * boolean indicating whether or not the node contains such a fold. When + * it is true, the caller sets a flag that later causes the optimizer in + * this file to not set values for the floating and fixed string lengths, + * and thus avoids the optimizer code in regexec.c that makes the invalid + * assumption. Thus, there is no optimization based on string lengths for + * EXACTFL nodes that contain these few folds, nor for non-UTF8-pattern + * EXACTF and EXACTFAA nodes that contain the sharp s. (The reason the + * assumption is wrong only in these cases is that all other non-UTF-8 + * folds are 1-1; and, for UTF-8 patterns, we pre-fold all other folds to + * their expanded versions. (Again, we can't prefold sharp s to 'ss' in + * EXACTF nodes because we don't know at compile time if it actually + * matches 'ss' or not. For EXACTF nodes it will match iff the target + * string is in UTF-8. This is in contrast to EXACTFU nodes, where it + * always matches; and EXACTFAA where it never does. In an EXACTFAA node + * in a UTF-8 pattern, sharp s is folded to "\x{17F}\x{17F}, avoiding the + * problem; but in a non-UTF8 pattern, folding it to that above-Latin1 + * string would require the pattern to be forced into UTF-8, the overhead + * of which we want to avoid. Similarly the unfolded multi-char folds in + * EXACTFL nodes will match iff the locale at the time of match is a UTF-8 + * locale.) + * + * Similarly, the code that generates tries doesn't currently handle + * not-already-folded multi-char folds, and it looks like a pain to change + * that. Therefore, trie generation of EXACTFAA nodes with the sharp s + * doesn't work. Instead, such an EXACTFAA is turned into a new regnode, + * EXACTFAA_NO_TRIE, which the trie code knows not to handle. Most people + * using /iaa matching will be doing so almost entirely with ASCII + * strings, so this should rarely be encountered in practice */ + +U32 +Perl_join_exact(pTHX_ RExC_state_t *pRExC_state, regnode *scan, + UV *min_subtract, bool *unfolded_multi_char, + U32 flags, regnode *val, U32 depth) +{ + /* Merge several consecutive EXACTish nodes into one. */ + + regnode *n = regnext(scan); + U32 stringok = 1; + regnode *next = REGNODE_AFTER_varies(scan); + U32 merged = 0; + U32 stopnow = 0; +#ifdef DEBUGGING + regnode *stop = scan; + DECLARE_AND_GET_RE_DEBUG_FLAGS; +#else + PERL_UNUSED_ARG(depth); +#endif + + PERL_ARGS_ASSERT_JOIN_EXACT; +#ifndef EXPERIMENTAL_INPLACESCAN + PERL_UNUSED_ARG(flags); + PERL_UNUSED_ARG(val); +#endif + DEBUG_PEEP("join", scan, depth, 0); + + assert(REGNODE_TYPE(OP(scan)) == EXACT); + + /* Look through the subsequent nodes in the chain. Skip NOTHING, merge + * EXACT ones that are mergeable to the current one. */ + while ( n + && ( REGNODE_TYPE(OP(n)) == NOTHING + || (stringok && REGNODE_TYPE(OP(n)) == EXACT)) + && NEXT_OFF(n) + && NEXT_OFF(scan) + NEXT_OFF(n) < I16_MAX) + { + + if (OP(n) == TAIL || n > next) + stringok = 0; + if (REGNODE_TYPE(OP(n)) == NOTHING) { + DEBUG_PEEP("skip:", n, depth, 0); + NEXT_OFF(scan) += NEXT_OFF(n); + next = n + NODE_STEP_REGNODE; +#ifdef DEBUGGING + if (stringok) + stop = n; +#endif + n = regnext(n); + } + else if (stringok) { + const unsigned int oldl = STR_LEN(scan); + regnode * const nnext = regnext(n); + + /* XXX I (khw) kind of doubt that this works on platforms (should + * Perl ever run on one) where U8_MAX is above 255 because of lots + * of other assumptions */ + /* Don't join if the sum can't fit into a single node */ + if (oldl + STR_LEN(n) > U8_MAX) + break; + + /* Joining something that requires UTF-8 with something that + * doesn't, means the result requires UTF-8. */ + if (OP(scan) == EXACT && (OP(n) == EXACT_REQ8)) { + OP(scan) = EXACT_REQ8; + } + else if (OP(scan) == EXACT_REQ8 && (OP(n) == EXACT)) { + ; /* join is compatible, no need to change OP */ + } + else if ((OP(scan) == EXACTFU) && (OP(n) == EXACTFU_REQ8)) { + OP(scan) = EXACTFU_REQ8; + } + else if ((OP(scan) == EXACTFU_REQ8) && (OP(n) == EXACTFU)) { + ; /* join is compatible, no need to change OP */ + } + else if (OP(scan) == EXACTFU && OP(n) == EXACTFU) { + ; /* join is compatible, no need to change OP */ + } + else if (OP(scan) == EXACTFU && OP(n) == EXACTFU_S_EDGE) { + + /* Under /di, temporary EXACTFU_S_EDGE nodes are generated, + * which can join with EXACTFU ones. We check for this case + * here. These need to be resolved to either EXACTFU or + * EXACTF at joining time. They have nothing in them that + * would forbid them from being the more desirable EXACTFU + * nodes except that they begin and/or end with a single [Ss]. + * The reason this is problematic is because they could be + * joined in this loop with an adjacent node that ends and/or + * begins with [Ss] which would then form the sequence 'ss', + * which matches differently under /di than /ui, in which case + * EXACTFU can't be used. If the 'ss' sequence doesn't get + * formed, the nodes get absorbed into any adjacent EXACTFU + * node. And if the only adjacent node is EXACTF, they get + * absorbed into that, under the theory that a longer node is + * better than two shorter ones, even if one is EXACTFU. Note + * that EXACTFU_REQ8 is generated only for UTF-8 patterns, + * and the EXACTFU_S_EDGE ones only for non-UTF-8. */ + + if (STRING(n)[STR_LEN(n)-1] == 's') { + + /* Here the joined node would end with 's'. If the node + * following the combination is an EXACTF one, it's better to + * join this trailing edge 's' node with that one, leaving the + * current one in 'scan' be the more desirable EXACTFU */ + if (OP(nnext) == EXACTF) { + break; + } + + OP(scan) = EXACTFU_S_EDGE; + + } /* Otherwise, the beginning 's' of the 2nd node just + becomes an interior 's' in 'scan' */ + } + else if (OP(scan) == EXACTF && OP(n) == EXACTF) { + ; /* join is compatible, no need to change OP */ + } + else if (OP(scan) == EXACTF && OP(n) == EXACTFU_S_EDGE) { + + /* EXACTF nodes are compatible for joining with EXACTFU_S_EDGE + * nodes. But the latter nodes can be also joined with EXACTFU + * ones, and that is a better outcome, so if the node following + * 'n' is EXACTFU, quit now so that those two can be joined + * later */ + if (OP(nnext) == EXACTFU) { + break; + } + + /* The join is compatible, and the combined node will be + * EXACTF. (These don't care if they begin or end with 's' */ + } + else if (OP(scan) == EXACTFU_S_EDGE && OP(n) == EXACTFU_S_EDGE) { + if ( STRING(scan)[STR_LEN(scan)-1] == 's' + && STRING(n)[0] == 's') + { + /* When combined, we have the sequence 'ss', which means we + * have to remain /di */ + OP(scan) = EXACTF; + } + } + else if (OP(scan) == EXACTFU_S_EDGE && OP(n) == EXACTFU) { + if (STRING(n)[0] == 's') { + ; /* Here the join is compatible and the combined node + starts with 's', no need to change OP */ + } + else { /* Now the trailing 's' is in the interior */ + OP(scan) = EXACTFU; + } + } + else if (OP(scan) == EXACTFU_S_EDGE && OP(n) == EXACTF) { + + /* The join is compatible, and the combined node will be + * EXACTF. (These don't care if they begin or end with 's' */ + OP(scan) = EXACTF; + } + else if (OP(scan) != OP(n)) { + + /* The only other compatible joinings are the same node type */ + break; + } + + DEBUG_PEEP("merg", n, depth, 0); + merged++; + + next = REGNODE_AFTER_varies(n); + NEXT_OFF(scan) += NEXT_OFF(n); + assert( ( STR_LEN(scan) + STR_LEN(n) ) < 256 ); + setSTR_LEN(scan, (U8)(STR_LEN(scan) + STR_LEN(n))); + /* Now we can overwrite *n : */ + Move(STRING(n), STRING(scan) + oldl, STR_LEN(n), char); +#ifdef DEBUGGING + stop = next - 1; +#endif + n = nnext; + if (stopnow) break; + } + +#ifdef EXPERIMENTAL_INPLACESCAN + if (flags && !NEXT_OFF(n)) { + DEBUG_PEEP("atch", val, depth, 0); + if (REGNODE_OFF_BY_ARG(OP(n))) { + ARG1u_SET(n, val - n); + } + else { + NEXT_OFF(n) = val - n; + } + stopnow = 1; + } +#endif + } + + /* This temporary node can now be turned into EXACTFU, and must, as + * regexec.c doesn't handle it */ + if (OP(scan) == EXACTFU_S_EDGE) { + OP(scan) = EXACTFU; + } + + *min_subtract = 0; + *unfolded_multi_char = FALSE; + + /* Here, all the adjacent mergeable EXACTish nodes have been merged. We + * can now analyze for sequences of problematic code points. (Prior to + * this final joining, sequences could have been split over boundaries, and + * hence missed). The sequences only happen in folding, hence for any + * non-EXACT EXACTish node */ + if (OP(scan) != EXACT && OP(scan) != EXACT_REQ8 && OP(scan) != EXACTL) { + U8* s0 = (U8*) STRING(scan); + U8* s = s0; + U8* s_end = s0 + STR_LEN(scan); + + int total_count_delta = 0; /* Total delta number of characters that + multi-char folds expand to */ + + /* One pass is made over the node's string looking for all the + * possibilities. To avoid some tests in the loop, there are two main + * cases, for UTF-8 patterns (which can't have EXACTF nodes) and + * non-UTF-8 */ + if (UTF) { + U8* folded = NULL; + + if (OP(scan) == EXACTFL) { + U8 *d; + + /* An EXACTFL node would already have been changed to another + * node type unless there is at least one character in it that + * is problematic; likely a character whose fold definition + * won't be known until runtime, and so has yet to be folded. + * For all but the UTF-8 locale, folds are 1-1 in length, but + * to handle the UTF-8 case, we need to create a temporary + * folded copy using UTF-8 locale rules in order to analyze it. + * This is because our macros that look to see if a sequence is + * a multi-char fold assume everything is folded (otherwise the + * tests in those macros would be too complicated and slow). + * Note that here, the non-problematic folds will have already + * been done, so we can just copy such characters. We actually + * don't completely fold the EXACTFL string. We skip the + * unfolded multi-char folds, as that would just create work + * below to figure out the size they already are */ + + Newx(folded, UTF8_MAX_FOLD_CHAR_EXPAND * STR_LEN(scan) + 1, U8); + d = folded; + while (s < s_end) { + STRLEN s_len = UTF8SKIP(s); + if (! is_PROBLEMATIC_LOCALE_FOLD_utf8(s)) { + Copy(s, d, s_len, U8); + d += s_len; + } + else if (is_FOLDS_TO_MULTI_utf8(s)) { + *unfolded_multi_char = TRUE; + Copy(s, d, s_len, U8); + d += s_len; + } + else if (isASCII(*s)) { + *(d++) = toFOLD(*s); + } + else { + STRLEN len; + _toFOLD_utf8_flags(s, s_end, d, &len, FOLD_FLAGS_FULL); + d += len; + } + s += s_len; + } + + /* Point the remainder of the routine to look at our temporary + * folded copy */ + s = folded; + s_end = d; + } /* End of creating folded copy of EXACTFL string */ + + /* Examine the string for a multi-character fold sequence. UTF-8 + * patterns have all characters pre-folded by the time this code is + * executed */ + while (s < s_end - 1) /* Can stop 1 before the end, as minimum + length sequence we are looking for is 2 */ + { + int count = 0; /* How many characters in a multi-char fold */ + int len = is_MULTI_CHAR_FOLD_utf8_safe(s, s_end); + if (! len) { /* Not a multi-char fold: get next char */ + s += UTF8SKIP(s); + continue; + } + + { /* Here is a generic multi-char fold. */ + U8* multi_end = s + len; + + /* Count how many characters are in it. In the case of + * /aa, no folds which contain ASCII code points are + * allowed, so check for those, and skip if found. */ + if (OP(scan) != EXACTFAA && OP(scan) != EXACTFAA_NO_TRIE) { + count = utf8_length(s, multi_end); + s = multi_end; + } + else { + while (s < multi_end) { + if (isASCII(*s)) { + s++; + goto next_iteration; + } + else { + s += UTF8SKIP(s); + } + count++; + } + } + } + + /* The delta is how long the sequence is minus 1 (1 is how long + * the character that folds to the sequence is) */ + total_count_delta += count - 1; + next_iteration: ; + } + + /* We created a temporary folded copy of the string in EXACTFL + * nodes. Therefore we need to be sure it doesn't go below zero, + * as the real string could be shorter */ + if (OP(scan) == EXACTFL) { + int total_chars = utf8_length((U8*) STRING(scan), + (U8*) STRING(scan) + STR_LEN(scan)); + if (total_count_delta > total_chars) { + total_count_delta = total_chars; + } + } + + *min_subtract += total_count_delta; + Safefree(folded); + } + else if (OP(scan) == EXACTFAA) { + + /* Non-UTF-8 pattern, EXACTFAA node. There can't be a multi-char + * fold to the ASCII range (and there are no existing ones in the + * upper latin1 range). But, as outlined in the comments preceding + * this function, we need to flag any occurrences of the sharp s. + * This character forbids trie formation (because of added + * complexity) */ +#if UNICODE_MAJOR_VERSION > 3 /* no multifolds in early Unicode */ \ + || (UNICODE_MAJOR_VERSION == 3 && ( UNICODE_DOT_VERSION > 0) \ + || UNICODE_DOT_DOT_VERSION > 0) + while (s < s_end) { + if (*s == LATIN_SMALL_LETTER_SHARP_S) { + OP(scan) = EXACTFAA_NO_TRIE; + *unfolded_multi_char = TRUE; + break; + } + s++; + } + } + else if (OP(scan) != EXACTFAA_NO_TRIE) { + + /* Non-UTF-8 pattern, not EXACTFAA node. Look for the multi-char + * folds that are all Latin1. As explained in the comments + * preceding this function, we look also for the sharp s in EXACTF + * and EXACTFL nodes; it can be in the final position. Otherwise + * we can stop looking 1 byte earlier because have to find at least + * two characters for a multi-fold */ + const U8* upper = (OP(scan) == EXACTF || OP(scan) == EXACTFL) + ? s_end + : s_end -1; + + while (s < upper) { + int len = is_MULTI_CHAR_FOLD_latin1_safe(s, s_end); + if (! len) { /* Not a multi-char fold. */ + if (*s == LATIN_SMALL_LETTER_SHARP_S + && (OP(scan) == EXACTF || OP(scan) == EXACTFL)) + { + *unfolded_multi_char = TRUE; + } + s++; + continue; + } + + if (len == 2 + && isALPHA_FOLD_EQ(*s, 's') + && isALPHA_FOLD_EQ(*(s+1), 's')) + { + + /* EXACTF nodes need to know that the minimum length + * changed so that a sharp s in the string can match this + * ss in the pattern, but they remain EXACTF nodes, as they + * won't match this unless the target string is in UTF-8, + * which we don't know until runtime. EXACTFL nodes can't + * transform into EXACTFU nodes */ + if (OP(scan) != EXACTF && OP(scan) != EXACTFL) { + OP(scan) = EXACTFUP; + } + } + + *min_subtract += len - 1; + s += len; + } +#endif + } + } + +#ifdef DEBUGGING + /* Allow dumping but overwriting the collection of skipped + * ops and/or strings with fake optimized ops */ + n = REGNODE_AFTER_varies(scan); + while (n <= stop) { + OP(n) = OPTIMIZED; + FLAGS(n) = 0; + NEXT_OFF(n) = 0; + n++; + } +#endif + DEBUG_OPTIMISE_r(if (merged){DEBUG_PEEP("finl", scan, depth, 0);}); + return stopnow; +} + +/* REx optimizer. Converts nodes into quicker variants "in place". + Finds fixed substrings. */ + + +/* Stops at toplevel WHILEM as well as at "last". At end *scanp is set + to the position after last scanned or to NULL. */ + +/* the return from this sub is the minimum length that could possibly match */ +SSize_t +Perl_study_chunk(pTHX_ + RExC_state_t *pRExC_state, + regnode **scanp, /* Start here (read-write). */ + SSize_t *minlenp, /* used for the minlen of substrings? */ + SSize_t *deltap, /* Write maxlen-minlen here. */ + regnode *last, /* Stop before this one. */ + scan_data_t *data, /* string data about the pattern */ + I32 stopparen, /* treat CLOSE-N as END, see GOSUB */ + U32 recursed_depth, /* how deep have we recursed via GOSUB */ + regnode_ssc *and_withp, /* Valid if flags & SCF_DO_STCLASS_OR */ + U32 flags, /* flags controlling this call, see SCF_ flags */ + U32 depth, /* how deep have we recursed period */ + bool was_mutate_ok /* TRUE if in-place optimizations are allowed. + FALSE only if the caller (recursively) was + prohibited from modifying the regops, because + a higher caller is holding a ptr to them. */ +) +{ + /* vars about the regnodes we are working with */ + regnode *scan = *scanp; /* the current opcode we are inspecting */ + regnode *next = NULL; /* the next opcode beyond scan, tmp var */ + regnode *first_non_open = scan; /* FIXME: should this init to NULL? + the first non open regop, if the init + val IS an OPEN then we will skip past + it just after the var decls section */ + I32 code = 0; /* temp var used to hold the optype of a regop */ + + /* vars about the min and max length of the pattern */ + SSize_t min = 0; /* min length of this part of the pattern */ + SSize_t stopmin = OPTIMIZE_INFTY; /* min length accounting for ACCEPT + this is adjusted down if we find + an ACCEPT */ + SSize_t delta = 0; /* difference between min and max length + (not accounting for stopmin) */ + + /* vars about capture buffers in the pattern */ + I32 pars = 0; /* count of OPEN opcodes */ + I32 is_par = OP(scan) == OPEN ? PARNO(scan) : 0; /* is this op an OPEN? */ + + /* vars about whether this pattern contains something that can match + * infinitely long strings, eg, X* or X+ */ + int is_inf = (flags & SCF_DO_SUBSTR) && (data->flags & SF_IS_INF); + int is_inf_internal = 0; /* The studied chunk is infinite */ + + /* scan_data_t (struct) is used to hold information about the substrings + * and start class we have extracted from the string */ + scan_data_t data_fake; /* temp var used for recursing in some cases */ + + SV *re_trie_maxbuff = NULL; /* temp var used to hold whether we can do + trie optimizations */ + + scan_frame *frame = NULL; /* used as part of fake recursion */ + + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + PERL_ARGS_ASSERT_STUDY_CHUNK; + RExC_study_started= 1; + + Zero(&data_fake, 1, scan_data_t); + + if ( depth == 0 ) { + while (first_non_open && OP(first_non_open) == OPEN) + first_non_open=regnext(first_non_open); + } + + fake_study_recurse: + DEBUG_r( + RExC_study_chunk_recursed_count++; + ); + DEBUG_OPTIMISE_MORE_r( + { + Perl_re_indentf( aTHX_ "study_chunk stopparen=%ld recursed_count=%lu depth=%lu recursed_depth=%lu scan=%p last=%p", + depth, (long)stopparen, + (unsigned long)RExC_study_chunk_recursed_count, + (unsigned long)depth, (unsigned long)recursed_depth, + scan, + last); + if (recursed_depth) { + U32 i; + U32 j; + for ( j = 0 ; j < recursed_depth ; j++ ) { + for ( i = 0 ; i < (U32)RExC_total_parens ; i++ ) { + if (PAREN_TEST(j, i) && (!j || !PAREN_TEST(j - 1, i))) { + Perl_re_printf( aTHX_ " %d",(int)i); + break; + } + } + if ( j + 1 < recursed_depth ) { + Perl_re_printf( aTHX_ ","); + } + } + } + Perl_re_printf( aTHX_ "\n"); + } + ); + while ( scan && OP(scan) != END && scan < last ){ + UV min_subtract = 0; /* How mmany chars to subtract from the minimum + node length to get a real minimum (because + the folded version may be shorter) */ + bool unfolded_multi_char = FALSE; + /* avoid mutating ops if we are anywhere within the recursed or + * enframed handling for a GOSUB: the outermost level will handle it. + */ + bool mutate_ok = was_mutate_ok && !(frame && frame->in_gosub); + /* Peephole optimizer: */ + DEBUG_STUDYDATA("Peep", data, depth, is_inf, min, stopmin, delta); + DEBUG_PEEP("Peep", scan, depth, flags); + + + /* The reason we do this here is that we need to deal with things like + * /(?:f)(?:o)(?:o)/ which cant be dealt with by the normal EXACT + * parsing code, as each (?:..) is handled by a different invocation of + * reg() -- Yves + */ + if (REGNODE_TYPE(OP(scan)) == EXACT + && OP(scan) != LEXACT + && OP(scan) != LEXACT_REQ8 + && mutate_ok + ) { + join_exact(pRExC_state, scan, &min_subtract, &unfolded_multi_char, + 0, NULL, depth + 1); + } + + /* Follow the next-chain of the current node and optimize + away all the NOTHINGs from it. + */ + rck_elide_nothing(scan); + + /* The principal pseudo-switch. Cannot be a switch, since we look into + * several different things. */ + if ( OP(scan) == DEFINEP ) { + SSize_t minlen = 0; + SSize_t deltanext = 0; + SSize_t fake_last_close = 0; + regnode *fake_last_close_op = NULL; + U32 f = SCF_IN_DEFINE | (flags & SCF_TRIE_DOING_RESTUDY); + + StructCopy(&zero_scan_data, &data_fake, scan_data_t); + scan = regnext(scan); + assert( OP(scan) == IFTHEN ); + DEBUG_PEEP("expect IFTHEN", scan, depth, flags); + + data_fake.last_closep= &fake_last_close; + data_fake.last_close_opp= &fake_last_close_op; + minlen = *minlenp; + next = regnext(scan); + scan = REGNODE_AFTER_type(scan,tregnode_IFTHEN); + DEBUG_PEEP("scan", scan, depth, flags); + DEBUG_PEEP("next", next, depth, flags); + + /* we suppose the run is continuous, last=next... + * NOTE we dont use the return here! */ + /* DEFINEP study_chunk() recursion */ + (void)study_chunk(pRExC_state, &scan, &minlen, + &deltanext, next, &data_fake, stopparen, + recursed_depth, NULL, f, depth+1, mutate_ok); + + scan = next; + } else + if ( + OP(scan) == BRANCH || + OP(scan) == BRANCHJ || + OP(scan) == IFTHEN + ) { + next = regnext(scan); + code = OP(scan); + + /* The op(next)==code check below is to see if we + * have "BRANCH-BRANCH", "BRANCHJ-BRANCHJ", "IFTHEN-IFTHEN" + * IFTHEN is special as it might not appear in pairs. + * Not sure whether BRANCH-BRANCHJ is possible, regardless + * we dont handle it cleanly. */ + if (OP(next) == code || code == IFTHEN) { + /* NOTE - There is similar code to this block below for + * handling TRIE nodes on a re-study. If you change stuff here + * check there too. */ + SSize_t max1 = 0, min1 = OPTIMIZE_INFTY, num = 0; + regnode_ssc accum; + regnode * const startbranch=scan; + + if (flags & SCF_DO_SUBSTR) { + /* Cannot merge strings after this. */ + scan_commit(pRExC_state, data, minlenp, is_inf); + } + + if (flags & SCF_DO_STCLASS) + ssc_init_zero(pRExC_state, &accum); + + while (OP(scan) == code) { + SSize_t deltanext, minnext, fake_last_close = 0; + regnode *fake_last_close_op = NULL; + U32 f = (flags & SCF_TRIE_DOING_RESTUDY); + regnode_ssc this_class; + + DEBUG_PEEP("Branch", scan, depth, flags); + + num++; + StructCopy(&zero_scan_data, &data_fake, scan_data_t); + if (data) { + data_fake.whilem_c = data->whilem_c; + data_fake.last_closep = data->last_closep; + data_fake.last_close_opp = data->last_close_opp; + } + else { + data_fake.last_closep = &fake_last_close; + data_fake.last_close_opp = &fake_last_close_op; + } + + data_fake.pos_delta = delta; + next = regnext(scan); + + scan = REGNODE_AFTER_opcode(scan, code); + + if (flags & SCF_DO_STCLASS) { + ssc_init(pRExC_state, &this_class); + data_fake.start_class = &this_class; + f |= SCF_DO_STCLASS_AND; + } + if (flags & SCF_WHILEM_VISITED_POS) + f |= SCF_WHILEM_VISITED_POS; + + /* we suppose the run is continuous, last=next...*/ + /* recurse study_chunk() for each BRANCH in an alternation */ + minnext = study_chunk(pRExC_state, &scan, minlenp, + &deltanext, next, &data_fake, stopparen, + recursed_depth, NULL, f, depth+1, + mutate_ok); + + if (min1 > minnext) + min1 = minnext; + if (deltanext == OPTIMIZE_INFTY) { + is_inf = is_inf_internal = 1; + max1 = OPTIMIZE_INFTY; + } else if (max1 < minnext + deltanext) + max1 = minnext + deltanext; + scan = next; + if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR)) + pars++; + if (data_fake.flags & SCF_SEEN_ACCEPT) { + if ( stopmin > minnext) + stopmin = min + min1; + flags &= ~SCF_DO_SUBSTR; + if (data) + data->flags |= SCF_SEEN_ACCEPT; + } + if (data) { + if (data_fake.flags & SF_HAS_EVAL) + data->flags |= SF_HAS_EVAL; + data->whilem_c = data_fake.whilem_c; + } + if (flags & SCF_DO_STCLASS) + ssc_or(pRExC_state, &accum, (regnode_charclass*)&this_class); + DEBUG_STUDYDATA("end BRANCH", data, depth, is_inf, min, stopmin, delta); + } + if (code == IFTHEN && num < 2) /* Empty ELSE branch */ + min1 = 0; + if (flags & SCF_DO_SUBSTR) { + data->pos_min += min1; + if (data->pos_delta >= OPTIMIZE_INFTY - (max1 - min1)) + data->pos_delta = OPTIMIZE_INFTY; + else + data->pos_delta += max1 - min1; + if (max1 != min1 || is_inf) + data->cur_is_floating = 1; + } + min += min1; + if (delta == OPTIMIZE_INFTY + || OPTIMIZE_INFTY - delta - (max1 - min1) < 0) + delta = OPTIMIZE_INFTY; + else + delta += max1 - min1; + if (flags & SCF_DO_STCLASS_OR) { + ssc_or(pRExC_state, data->start_class, (regnode_charclass*) &accum); + if (min1) { + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); + flags &= ~SCF_DO_STCLASS; + } + } + else if (flags & SCF_DO_STCLASS_AND) { + if (min1) { + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &accum); + flags &= ~SCF_DO_STCLASS; + } + else { + /* Switch to OR mode: cache the old value of + * data->start_class */ + INIT_AND_WITHP; + StructCopy(data->start_class, and_withp, regnode_ssc); + flags &= ~SCF_DO_STCLASS_AND; + StructCopy(&accum, data->start_class, regnode_ssc); + flags |= SCF_DO_STCLASS_OR; + } + } + DEBUG_STUDYDATA("pre TRIE", data, depth, is_inf, min, stopmin, delta); + + if (PERL_ENABLE_TRIE_OPTIMISATION + && OP(startbranch) == BRANCH + && mutate_ok + ) { + /* demq. + + Assuming this was/is a branch we are dealing with: 'scan' + now points at the item that follows the branch sequence, + whatever it is. We now start at the beginning of the + sequence and look for subsequences of + + BRANCH->EXACT=>x1 + BRANCH->EXACT=>x2 + tail + + which would be constructed from a pattern like + /A|LIST|OF|WORDS/ + + If we can find such a subsequence we need to turn the first + element into a trie and then add the subsequent branch exact + strings to the trie. + + We have two cases + + 1. patterns where the whole set of branches can be + converted. + + 2. patterns where only a subset can be converted. + + In case 1 we can replace the whole set with a single regop + for the trie. In case 2 we need to keep the start and end + branches so + + 'BRANCH EXACT; BRANCH EXACT; BRANCH X' + becomes BRANCH TRIE; BRANCH X; + + There is an additional case, that being where there is a + common prefix, which gets split out into an EXACT like node + preceding the TRIE node. + + If X(1..n)==tail then we can do a simple trie, if not we make + a "jump" trie, such that when we match the appropriate word + we "jump" to the appropriate tail node. Essentially we turn + a nested if into a case structure of sorts. + + */ + + int made=0; + if (!re_trie_maxbuff) { + re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, 1); + if (!SvIOK(re_trie_maxbuff)) + sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT); + } + if ( SvIV(re_trie_maxbuff)>=0 ) { + regnode *cur; + regnode *first = (regnode *)NULL; + regnode *prev = (regnode *)NULL; + regnode *tail = scan; + U8 trietype = 0; + U32 count=0; + + /* var tail is used because there may be a TAIL + regop in the way. Ie, the exacts will point to the + thing following the TAIL, but the last branch will + point at the TAIL. So we advance tail. If we + have nested (?:) we may have to move through several + tails. + */ + + while ( OP( tail ) == TAIL ) { + /* this is the TAIL generated by (?:) */ + tail = regnext( tail ); + } + + + DEBUG_TRIE_COMPILE_r({ + regprop(RExC_rx, RExC_mysv, tail, NULL, pRExC_state); + Perl_re_indentf( aTHX_ "%s %" UVuf ":%s\n", + depth+1, + "Looking for TRIE'able sequences. Tail node is ", + (UV) REGNODE_OFFSET(tail), + SvPV_nolen_const( RExC_mysv ) + ); + }); + + /* + + Step through the branches + cur represents each branch, + noper is the first thing to be matched as part + of that branch + noper_next is the regnext() of that node. + + We normally handle a case like this + /FOO[xyz]|BAR[pqr]/ via a "jump trie" but we also + support building with NOJUMPTRIE, which restricts + the trie logic to structures like /FOO|BAR/. + + If noper is a trieable nodetype then the branch is + a possible optimization target. If we are building + under NOJUMPTRIE then we require that noper_next is + the same as scan (our current position in the regex + program). + + Once we have two or more consecutive such branches + we can create a trie of the EXACT's contents and + stitch it in place into the program. + + If the sequence represents all of the branches in + the alternation we replace the entire thing with a + single TRIE node. + + Otherwise when it is a subsequence we need to + stitch it in place and replace only the relevant + branches. This means the first branch has to remain + as it is used by the alternation logic, and its + next pointer, and needs to be repointed at the item + on the branch chain following the last branch we + have optimized away. + + This could be either a BRANCH, in which case the + subsequence is internal, or it could be the item + following the branch sequence in which case the + subsequence is at the end (which does not + necessarily mean the first node is the start of the + alternation). + + TRIE_TYPE(X) is a define which maps the optype to a + trietype. + + optype | trietype + ----------------+----------- + NOTHING | NOTHING + EXACT | EXACT + EXACT_REQ8 | EXACT + EXACTFU | EXACTFU + EXACTFU_REQ8 | EXACTFU + EXACTFUP | EXACTFU + EXACTFAA | EXACTFAA + EXACTL | EXACTL + EXACTFLU8 | EXACTFLU8 + + + */ +#define TRIE_TYPE(X) ( ( NOTHING == (X) ) \ + ? NOTHING \ + : ( EXACT == (X) || EXACT_REQ8 == (X) ) \ + ? EXACT \ + : ( EXACTFU == (X) \ + || EXACTFU_REQ8 == (X) \ + || EXACTFUP == (X) ) \ + ? EXACTFU \ + : ( EXACTFAA == (X) ) \ + ? EXACTFAA \ + : ( EXACTL == (X) ) \ + ? EXACTL \ + : ( EXACTFLU8 == (X) ) \ + ? EXACTFLU8 \ + : 0 ) + + /* dont use tail as the end marker for this traverse */ + for ( cur = startbranch ; cur != scan ; cur = regnext( cur ) ) { + regnode * const noper = REGNODE_AFTER( cur ); + U8 noper_type = OP( noper ); + U8 noper_trietype = TRIE_TYPE( noper_type ); +#if defined(DEBUGGING) || defined(NOJUMPTRIE) + regnode * const noper_next = regnext( noper ); + U8 noper_next_type = (noper_next && noper_next < tail) ? OP(noper_next) : 0; + U8 noper_next_trietype = (noper_next && noper_next < tail) ? TRIE_TYPE( noper_next_type ) :0; +#endif + + DEBUG_TRIE_COMPILE_r({ + regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state); + Perl_re_indentf( aTHX_ "- %d:%s (%d)", + depth+1, + REG_NODE_NUM(cur), SvPV_nolen_const( RExC_mysv ), REG_NODE_NUM(cur) ); + + regprop(RExC_rx, RExC_mysv, noper, NULL, pRExC_state); + Perl_re_printf( aTHX_ " -> %d:%s", + REG_NODE_NUM(noper), SvPV_nolen_const(RExC_mysv)); + + if ( noper_next ) { + regprop(RExC_rx, RExC_mysv, noper_next, NULL, pRExC_state); + Perl_re_printf( aTHX_ "\t=> %d:%s\t", + REG_NODE_NUM(noper_next), SvPV_nolen_const(RExC_mysv)); + } + Perl_re_printf( aTHX_ "(First==%d,Last==%d,Cur==%d,tt==%s,ntt==%s,nntt==%s)\n", + REG_NODE_NUM(first), REG_NODE_NUM(prev), REG_NODE_NUM(cur), + REGNODE_NAME(trietype), REGNODE_NAME(noper_trietype), REGNODE_NAME(noper_next_trietype) + ); + }); + + /* Is noper a trieable nodetype that can be merged + * with the current trie (if there is one)? */ + if ( noper_trietype + && + ( + ( noper_trietype == NOTHING ) + || ( trietype == NOTHING ) + || ( trietype == noper_trietype ) + ) +#ifdef NOJUMPTRIE + && noper_next >= tail +#endif + && count < U16_MAX) + { + /* Handle mergable triable node Either we are + * the first node in a new trieable sequence, + * in which case we do some bookkeeping, + * otherwise we update the end pointer. */ + if ( !first ) { + first = cur; + if ( noper_trietype == NOTHING ) { +#if !defined(DEBUGGING) && !defined(NOJUMPTRIE) + regnode * const noper_next = regnext( noper ); + U8 noper_next_type = (noper_next && noper_next < tail) ? OP(noper_next) : 0; + U8 noper_next_trietype = noper_next_type ? TRIE_TYPE( noper_next_type ) :0; +#endif + + if ( noper_next_trietype ) { + trietype = noper_next_trietype; + } else if (noper_next_type) { + /* a NOTHING regop is 1 regop wide. + * We need at least two for a trie + * so we can't merge this in */ + first = NULL; + } + } else { + trietype = noper_trietype; + } + } else { + if ( trietype == NOTHING ) + trietype = noper_trietype; + prev = cur; + } + if (first) + count++; + } /* end handle mergable triable node */ + else { + /* handle unmergable node - + * noper may either be a triable node which can + * not be tried together with the current trie, + * or a non triable node */ + if ( prev ) { + /* If last is set and trietype is not + * NOTHING then we have found at least two + * triable branch sequences in a row of a + * similar trietype so we can turn them + * into a trie. If/when we allow NOTHING to + * start a trie sequence this condition + * will be required, and it isn't expensive + * so we leave it in for now. */ + if ( trietype && trietype != NOTHING ) + make_trie( pRExC_state, + startbranch, first, cur, tail, + count, trietype, depth+1 ); + prev = NULL; /* note: we clear/update + first, trietype etc below, + so we dont do it here */ + } + if ( noper_trietype +#ifdef NOJUMPTRIE + && noper_next >= tail +#endif + ){ + /* noper is triable, so we can start a new + * trie sequence */ + count = 1; + first = cur; + trietype = noper_trietype; + } else if (first) { + /* if we already saw a first but the + * current node is not triable then we have + * to reset the first information. */ + count = 0; + first = NULL; + trietype = 0; + } + } /* end handle unmergable node */ + } /* loop over branches */ + DEBUG_TRIE_COMPILE_r({ + regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state); + Perl_re_indentf( aTHX_ "- %s (%d) ", + depth+1, SvPV_nolen_const( RExC_mysv ), REG_NODE_NUM(cur)); + Perl_re_printf( aTHX_ "(First==%d, Last==%d, Cur==%d, tt==%s)\n", + REG_NODE_NUM(first), REG_NODE_NUM(prev), REG_NODE_NUM(cur), + REGNODE_NAME(trietype) + ); + + }); + if ( prev && trietype ) { + if ( trietype != NOTHING ) { + /* the last branch of the sequence was part of + * a trie, so we have to construct it here + * outside of the loop */ + made= make_trie( pRExC_state, startbranch, + first, scan, tail, count, + trietype, depth+1 ); +#ifdef TRIE_STUDY_OPT + if ( ((made == MADE_EXACT_TRIE && + startbranch == first) + || ( first_non_open == first )) && + depth==0 ) { + flags |= SCF_TRIE_RESTUDY; + if ( startbranch == first + && scan >= tail ) + { + RExC_seen &=~REG_TOP_LEVEL_BRANCHES_SEEN; + } + } +#endif + } else { + /* at this point we know whatever we have is a + * NOTHING sequence/branch AND if 'startbranch' + * is 'first' then we can turn the whole thing + * into a NOTHING + */ + if ( startbranch == first ) { + regnode *opt; + /* the entire thing is a NOTHING sequence, + * something like this: (?:|) So we can + * turn it into a plain NOTHING op. */ + DEBUG_TRIE_COMPILE_r({ + regprop(RExC_rx, RExC_mysv, cur, NULL, pRExC_state); + Perl_re_indentf( aTHX_ "- %s (%d) \n", + depth+1, + SvPV_nolen_const( RExC_mysv ), REG_NODE_NUM(cur)); + + }); + OP(startbranch)= NOTHING; + NEXT_OFF(startbranch)= tail - startbranch; + for ( opt= startbranch + 1; opt < tail ; opt++ ) + OP(opt)= OPTIMIZED; + } + } + } /* end if ( prev) */ + } /* TRIE_MAXBUF is non zero */ + } /* do trie */ + DEBUG_STUDYDATA("after TRIE", data, depth, is_inf, min, stopmin, delta); + } + else + scan = REGNODE_AFTER_opcode(scan,code); + continue; + } else if (OP(scan) == SUSPEND || OP(scan) == GOSUB) { + I32 paren = 0; + regnode *start = NULL; + regnode *end = NULL; + U32 my_recursed_depth= recursed_depth; + + if (OP(scan) != SUSPEND) { /* GOSUB */ + /* Do setup, note this code has side effects beyond + * the rest of this block. Specifically setting + * RExC_recurse[] must happen at least once during + * study_chunk(). */ + paren = ARG1u(scan); + RExC_recurse[ARG2i(scan)] = scan; + start = REGNODE_p(RExC_open_parens[paren]); + end = REGNODE_p(RExC_close_parens[paren]); + + /* NOTE we MUST always execute the above code, even + * if we do nothing with a GOSUB */ + if ( + ( flags & SCF_IN_DEFINE ) + || + ( + (is_inf_internal || is_inf || (data && data->flags & SF_IS_INF)) + && + ( (flags & (SCF_DO_STCLASS | SCF_DO_SUBSTR)) == 0 ) + ) + ) { + /* no need to do anything here if we are in a define. */ + /* or we are after some kind of infinite construct + * so we can skip recursing into this item. + * Since it is infinite we will not change the maxlen + * or delta, and if we miss something that might raise + * the minlen it will merely pessimise a little. + * + * Iow /(?(DEFINE)(?foo|food))a+(?&foo)/ + * might result in a minlen of 1 and not of 4, + * but this doesn't make us mismatch, just try a bit + * harder than we should. + * + * However we must assume this GOSUB is infinite, to + * avoid wrongly applying other optimizations in the + * enclosing scope - see GH 18096, for example. + */ + is_inf = is_inf_internal = 1; + scan= regnext(scan); + continue; + } + + if ( + !recursed_depth + || !PAREN_TEST(recursed_depth - 1, paren) + ) { + /* it is quite possible that there are more efficient ways + * to do this. We maintain a bitmap per level of recursion + * of which patterns we have entered so we can detect if a + * pattern creates a possible infinite loop. When we + * recurse down a level we copy the previous levels bitmap + * down. When we are at recursion level 0 we zero the top + * level bitmap. It would be nice to implement a different + * more efficient way of doing this. In particular the top + * level bitmap may be unnecessary. + */ + if (!recursed_depth) { + Zero(RExC_study_chunk_recursed, RExC_study_chunk_recursed_bytes, U8); + } else { + Copy(PAREN_OFFSET(recursed_depth - 1), + PAREN_OFFSET(recursed_depth), + RExC_study_chunk_recursed_bytes, U8); + } + /* we havent recursed into this paren yet, so recurse into it */ + DEBUG_STUDYDATA("gosub-set", data, depth, is_inf, min, stopmin, delta); + PAREN_SET(recursed_depth, paren); + my_recursed_depth= recursed_depth + 1; + } else { + DEBUG_STUDYDATA("gosub-inf", data, depth, is_inf, min, stopmin, delta); + /* some form of infinite recursion, assume infinite length + * */ + if (flags & SCF_DO_SUBSTR) { + scan_commit(pRExC_state, data, minlenp, is_inf); + data->cur_is_floating = 1; + } + is_inf = is_inf_internal = 1; + if (flags & SCF_DO_STCLASS_OR) /* Allow everything */ + ssc_anything(data->start_class); + flags &= ~SCF_DO_STCLASS; + + start= NULL; /* reset start so we dont recurse later on. */ + } + } else { + paren = stopparen; + start = scan + 2; + end = regnext(scan); + } + if (start) { + scan_frame *newframe; + assert(end); + if (!RExC_frame_last) { + Newxz(newframe, 1, scan_frame); + SAVEDESTRUCTOR_X(S_unwind_scan_frames, newframe); + RExC_frame_head= newframe; + RExC_frame_count++; + } else if (!RExC_frame_last->next_frame) { + Newxz(newframe, 1, scan_frame); + RExC_frame_last->next_frame= newframe; + newframe->prev_frame= RExC_frame_last; + RExC_frame_count++; + } else { + newframe= RExC_frame_last->next_frame; + } + RExC_frame_last= newframe; + + newframe->next_regnode = regnext(scan); + newframe->last_regnode = last; + newframe->stopparen = stopparen; + newframe->prev_recursed_depth = recursed_depth; + newframe->this_prev_frame= frame; + newframe->in_gosub = ( + (frame && frame->in_gosub) || OP(scan) == GOSUB + ); + + DEBUG_STUDYDATA("frame-new", data, depth, is_inf, min, stopmin, delta); + DEBUG_PEEP("fnew", scan, depth, flags); + + frame = newframe; + scan = start; + stopparen = paren; + last = end; + depth = depth + 1; + recursed_depth= my_recursed_depth; + + continue; + } + } + else if (REGNODE_TYPE(OP(scan)) == EXACT && ! isEXACTFish(OP(scan))) { + SSize_t bytelen = STR_LEN(scan), charlen; + UV uc; + assert(bytelen); + if (UTF) { + const U8 * const s = (U8*)STRING(scan); + uc = utf8_to_uvchr_buf(s, s + bytelen, NULL); + charlen = utf8_length(s, s + bytelen); + } else { + uc = *((U8*)STRING(scan)); + charlen = bytelen; + } + min += charlen; + if (flags & SCF_DO_SUBSTR) { /* Update longest substr. */ + /* The code below prefers earlier match for fixed + offset, later match for variable offset. */ + if (data->last_end == -1) { /* Update the start info. */ + data->last_start_min = data->pos_min; + data->last_start_max = + is_inf ? OPTIMIZE_INFTY + : (data->pos_delta > OPTIMIZE_INFTY - data->pos_min) + ? OPTIMIZE_INFTY : data->pos_min + data->pos_delta; + } + sv_catpvn(data->last_found, STRING(scan), bytelen); + if (UTF) + SvUTF8_on(data->last_found); + { + SV * const sv = data->last_found; + MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? + mg_find(sv, PERL_MAGIC_utf8) : NULL; + if (mg && mg->mg_len >= 0) + mg->mg_len += charlen; + } + data->last_end = data->pos_min + charlen; + data->pos_min += charlen; /* As in the first entry. */ + data->flags &= ~SF_BEFORE_EOL; + } + + /* ANDing the code point leaves at most it, and not in locale, and + * can't match null string */ + if (flags & SCF_DO_STCLASS_AND) { + ssc_cp_and(data->start_class, uc); + ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING; + ssc_clear_locale(data->start_class); + } + else if (flags & SCF_DO_STCLASS_OR) { + ssc_add_cp(data->start_class, uc); + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); + + /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */ + ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING; + } + flags &= ~SCF_DO_STCLASS; + DEBUG_STUDYDATA("end EXACT", data, depth, is_inf, min, stopmin, delta); + } + else if (REGNODE_TYPE(OP(scan)) == EXACT) { + /* But OP != EXACT!, so is EXACTFish */ + SSize_t bytelen = STR_LEN(scan), charlen; + const U8 * s = (U8*)STRING(scan); + + /* Replace a length 1 ASCII fold pair node with an ANYOFM node, + * with the mask set to the complement of the bit that differs + * between upper and lower case, and the lowest code point of the + * pair (which the '&' forces) */ + if ( bytelen == 1 + && isALPHA_A(*s) + && ( OP(scan) == EXACTFAA + || ( OP(scan) == EXACTFU + && ! HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(*s))) + && mutate_ok + ) { + U8 mask = ~ ('A' ^ 'a'); /* These differ in just one bit */ + + OP(scan) = ANYOFM; + ARG1u_SET(scan, *s & mask); + FLAGS(scan) = mask; + /* We're not EXACTFish any more, so restudy. + * Search for "restudy" in this file to find + * a comment with details. */ + continue; + } + + /* Search for fixed substrings supports EXACT only. */ + if (flags & SCF_DO_SUBSTR) { + assert(data); + scan_commit(pRExC_state, data, minlenp, is_inf); + } + charlen = UTF ? (SSize_t) utf8_length(s, s + bytelen) : bytelen; + if (unfolded_multi_char) { + RExC_seen |= REG_UNFOLDED_MULTI_SEEN; + } + min += charlen - min_subtract; + assert (min >= 0); + if ((SSize_t)min_subtract < OPTIMIZE_INFTY + && delta < OPTIMIZE_INFTY - (SSize_t)min_subtract + ) { + delta += min_subtract; + } else { + delta = OPTIMIZE_INFTY; + } + if (flags & SCF_DO_SUBSTR) { + data->pos_min += charlen - min_subtract; + if (data->pos_min < 0) { + data->pos_min = 0; + } + if ((SSize_t)min_subtract < OPTIMIZE_INFTY + && data->pos_delta < OPTIMIZE_INFTY - (SSize_t)min_subtract + ) { + data->pos_delta += min_subtract; + } else { + data->pos_delta = OPTIMIZE_INFTY; + } + if (min_subtract) { + data->cur_is_floating = 1; /* float */ + } + } + + if (flags & SCF_DO_STCLASS) { + SV* EXACTF_invlist = make_exactf_invlist(pRExC_state, scan); + + assert(EXACTF_invlist); + if (flags & SCF_DO_STCLASS_AND) { + if (OP(scan) != EXACTFL) + ssc_clear_locale(data->start_class); + ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING; + ANYOF_POSIXL_ZERO(data->start_class); + ssc_intersection(data->start_class, EXACTF_invlist, FALSE); + } + else { /* SCF_DO_STCLASS_OR */ + ssc_union(data->start_class, EXACTF_invlist, FALSE); + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); + + /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */ + ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING; + } + flags &= ~SCF_DO_STCLASS; + SvREFCNT_dec(EXACTF_invlist); + } + DEBUG_STUDYDATA("end EXACTish", data, depth, is_inf, min, stopmin, delta); + } + else if (REGNODE_VARIES(OP(scan))) { + SSize_t mincount, maxcount, minnext, deltanext, pos_before = 0; + I32 fl = 0; + U32 f = flags; + regnode * const oscan = scan; + regnode_ssc this_class; + regnode_ssc *oclass = NULL; + I32 next_is_eval = 0; + + switch (REGNODE_TYPE(OP(scan))) { + case WHILEM: /* End of (?:...)* . */ + scan = REGNODE_AFTER(scan); + goto finish; + case PLUS: + if (flags & (SCF_DO_SUBSTR | SCF_DO_STCLASS)) { + next = REGNODE_AFTER(scan); + if ( ( REGNODE_TYPE(OP(next)) == EXACT + && ! isEXACTFish(OP(next))) + || (flags & SCF_DO_STCLASS)) + { + mincount = 1; + maxcount = REG_INFTY; + next = regnext(scan); + scan = REGNODE_AFTER(scan); + goto do_curly; + } + } + if (flags & SCF_DO_SUBSTR) + data->pos_min++; + /* This will bypass the formal 'min += minnext * mincount' + * calculation in the do_curly path, so assumes min width + * of the PLUS payload is exactly one. */ + min++; + /* FALLTHROUGH */ + case STAR: + next = REGNODE_AFTER(scan); + + /* This temporary node can now be turned into EXACTFU, and + * must, as regexec.c doesn't handle it */ + if (OP(next) == EXACTFU_S_EDGE && mutate_ok) { + OP(next) = EXACTFU; + } + + if ( STR_LEN(next) == 1 + && isALPHA_A(* STRING(next)) + && ( OP(next) == EXACTFAA + || ( OP(next) == EXACTFU + && ! HAS_NONLATIN1_SIMPLE_FOLD_CLOSURE(* STRING(next)))) + && mutate_ok + ) { + /* These differ in just one bit */ + U8 mask = ~ ('A' ^ 'a'); + + assert(isALPHA_A(* STRING(next))); + + /* Then replace it by an ANYOFM node, with + * the mask set to the complement of the + * bit that differs between upper and lower + * case, and the lowest code point of the + * pair (which the '&' forces) */ + OP(next) = ANYOFM; + ARG1u_SET(next, *STRING(next) & mask); + FLAGS(next) = mask; + } + + if (flags & SCF_DO_STCLASS) { + mincount = 0; + maxcount = REG_INFTY; + next = regnext(scan); + scan = REGNODE_AFTER(scan); + goto do_curly; + } + if (flags & SCF_DO_SUBSTR) { + scan_commit(pRExC_state, data, minlenp, is_inf); + /* Cannot extend fixed substrings */ + data->cur_is_floating = 1; /* float */ + } + is_inf = is_inf_internal = 1; + scan = regnext(scan); + goto optimize_curly_tail; + case CURLY: + if (stopparen>0 && (OP(scan)==CURLYN || OP(scan)==CURLYM) + && (FLAGS(scan) == stopparen)) + { + mincount = 1; + maxcount = 1; + } else { + mincount = ARG1i(scan); + maxcount = ARG2i(scan); + } + next = regnext(scan); + if (OP(scan) == CURLYX) { + I32 lp = (data ? *(data->last_closep) : 0); + FLAGS(scan) = ((lp <= (I32)U8_MAX) ? (U8)lp : U8_MAX); + } + scan = REGNODE_AFTER(scan); + next_is_eval = (OP(scan) == EVAL); + do_curly: + if (flags & SCF_DO_SUBSTR) { + if (mincount == 0) + scan_commit(pRExC_state, data, minlenp, is_inf); + /* Cannot extend fixed substrings */ + pos_before = data->pos_min; + } + if (data) { + fl = data->flags; + data->flags &= ~(SF_HAS_PAR|SF_IN_PAR|SF_HAS_EVAL); + if (is_inf) + data->flags |= SF_IS_INF; + } + if (flags & SCF_DO_STCLASS) { + ssc_init(pRExC_state, &this_class); + oclass = data->start_class; + data->start_class = &this_class; + f |= SCF_DO_STCLASS_AND; + f &= ~SCF_DO_STCLASS_OR; + } + /* Exclude from super-linear cache processing any {n,m} + regops for which the combination of input pos and regex + pos is not enough information to determine if a match + will be possible. + + For example, in the regex /foo(bar\s*){4,8}baz/ with the + regex pos at the \s*, the prospects for a match depend not + only on the input position but also on how many (bar\s*) + repeats into the {4,8} we are. */ + if ((mincount > 1) || (maxcount > 1 && maxcount != REG_INFTY)) + f &= ~SCF_WHILEM_VISITED_POS; + + /* This will finish on WHILEM, setting scan, or on NULL: */ + /* recurse study_chunk() on loop bodies */ + minnext = study_chunk(pRExC_state, &scan, minlenp, &deltanext, + last, data, stopparen, recursed_depth, NULL, + (mincount == 0 + ? (f & ~SCF_DO_SUBSTR) + : f) + , depth+1, mutate_ok); + + if (data && data->flags & SCF_SEEN_ACCEPT) { + if (mincount > 1) + mincount = 1; + } + + if (flags & SCF_DO_STCLASS) + data->start_class = oclass; + if (mincount == 0 || minnext == 0) { + if (flags & SCF_DO_STCLASS_OR) { + ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &this_class); + } + else if (flags & SCF_DO_STCLASS_AND) { + /* Switch to OR mode: cache the old value of + * data->start_class */ + INIT_AND_WITHP; + StructCopy(data->start_class, and_withp, regnode_ssc); + flags &= ~SCF_DO_STCLASS_AND; + StructCopy(&this_class, data->start_class, regnode_ssc); + flags |= SCF_DO_STCLASS_OR; + ANYOF_FLAGS(data->start_class) + |= SSC_MATCHES_EMPTY_STRING; + } + } else { /* Non-zero len */ + if (flags & SCF_DO_STCLASS_OR) { + ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &this_class); + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); + } + else if (flags & SCF_DO_STCLASS_AND) + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &this_class); + flags &= ~SCF_DO_STCLASS; + } + if (!scan) /* It was not CURLYX, but CURLY. */ + scan = next; + if (((flags & (SCF_TRIE_DOING_RESTUDY|SCF_DO_SUBSTR))==SCF_DO_SUBSTR) + /* ? quantifier ok, except for (?{ ... }) */ + && (next_is_eval || !(mincount == 0 && maxcount == 1)) + && (minnext == 0) && (deltanext == 0) + && data && !(data->flags & (SF_HAS_PAR|SF_IN_PAR)) + && maxcount <= REG_INFTY/3) /* Complement check for big + count */ + { + _WARN_HELPER(RExC_precomp_end, packWARN(WARN_REGEXP), + Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), + "Quantifier unexpected on zero-length expression " + "in regex m/%" UTF8f "/", + UTF8fARG(UTF, RExC_precomp_end - RExC_precomp, + RExC_precomp))); + } + + if ( ( minnext > 0 && mincount >= SSize_t_MAX / minnext ) + || min >= SSize_t_MAX - minnext * mincount ) + { + FAIL("Regexp out of space"); + } + + min += minnext * mincount; + is_inf_internal |= deltanext == OPTIMIZE_INFTY + || (maxcount == REG_INFTY && minnext + deltanext > 0); + is_inf |= is_inf_internal; + if (is_inf) { + delta = OPTIMIZE_INFTY; + } else { + delta += (minnext + deltanext) * maxcount + - minnext * mincount; + } + + if (data && data->flags & SCF_SEEN_ACCEPT) { + if (flags & SCF_DO_SUBSTR) { + scan_commit(pRExC_state, data, minlenp, is_inf); + flags &= ~SCF_DO_SUBSTR; + } + if (stopmin > min) + stopmin = min; + DEBUG_STUDYDATA("after-whilem accept", data, depth, is_inf, min, stopmin, delta); + } + DEBUG_STUDYDATA("PRE CURLYX_TO_CURLYN", data, depth, is_inf, min, stopmin, delta); + /* Try powerful optimization CURLYX => CURLYN. */ + if ( RE_OPTIMIZE_CURLYX_TO_CURLYN + && OP(oscan) == CURLYX + && data + && !(RExC_seen & REG_PESSIMIZE_SEEN) /* XXX: for now disable whenever a + non optimistic eval is seen + anywhere.*/ + && ( data->flags & SF_IN_PAR ) /* has parens */ + && !deltanext + && minnext == 1 + && mutate_ok + ) { + DEBUG_STUDYDATA("CURLYX_TO_CURLYN", data, depth, is_inf, min, stopmin, delta); + /* Try to optimize to CURLYN. */ + regnode *nxt = REGNODE_AFTER_type(oscan, tregnode_CURLYX); + regnode * const nxt1 = nxt; +#ifdef DEBUGGING + regnode *nxt2; +#endif + /* Skip open. */ + nxt = regnext(nxt); + if (!REGNODE_SIMPLE(OP(nxt)) + && !(REGNODE_TYPE(OP(nxt)) == EXACT + && STR_LEN(nxt) == 1)) + goto nogo; +#ifdef DEBUGGING + nxt2 = nxt; +#endif + nxt = regnext(nxt); + if (OP(nxt) != CLOSE) + goto nogo; + if (RExC_open_parens) { + + /*open->CURLYM*/ + RExC_open_parens[PARNO(nxt1)] = REGNODE_OFFSET(oscan); + + /*close->while*/ + RExC_close_parens[PARNO(nxt1)] = REGNODE_OFFSET(nxt) + 2; + } + /* Now we know that nxt2 is the only contents: */ + FLAGS(oscan) = (U8)PARNO(nxt); + OP(oscan) = CURLYN; + OP(nxt1) = NOTHING; /* was OPEN. */ + +#ifdef DEBUGGING + OP(nxt1 + 1) = OPTIMIZED; /* was count. */ + NEXT_OFF(nxt1+ 1) = 0; /* just for consistency. */ + NEXT_OFF(nxt2) = 0; /* just for consistency with CURLY. */ + OP(nxt) = OPTIMIZED; /* was CLOSE. */ + OP(nxt + 1) = OPTIMIZED; /* was count. */ + NEXT_OFF(nxt+ 1) = 0; /* just for consistency. */ +#endif + } + nogo: + + DEBUG_STUDYDATA("PRE CURLYX_TO_CURLYM", data, depth, is_inf, min, stopmin, delta); + + /* Try optimization CURLYX => CURLYM. */ + if ( RE_OPTIMIZE_CURLYX_TO_CURLYM + && OP(oscan) == CURLYX + && data + && !(RExC_seen & REG_PESSIMIZE_SEEN) /* XXX: for now disable whenever a + non optimistic eval is seen + anywhere.*/ + && !(data->flags & SF_HAS_PAR) /* no parens! */ + && !deltanext /* atom is fixed width */ + && minnext != 0 /* CURLYM can't handle zero width */ + /* Nor characters whose fold at run-time may be + * multi-character */ + && !(RExC_seen & REG_UNFOLDED_MULTI_SEEN) + && mutate_ok + ) { + DEBUG_STUDYDATA("CURLYX_TO_CURLYM", data, depth, is_inf, min, stopmin, delta); + /* XXXX How to optimize if data == 0? */ + /* Optimize to a simpler form. */ + regnode *nxt = REGNODE_AFTER_type(oscan, tregnode_CURLYX); /* OPEN */ + regnode *nxt2; + + OP(oscan) = CURLYM; + while ( (nxt2 = regnext(nxt)) /* skip over embedded stuff*/ + && (OP(nxt2) != WHILEM)) + nxt = nxt2; + OP(nxt2) = SUCCEED; /* Whas WHILEM */ + /* Need to optimize away parenths. */ + if ((data->flags & SF_IN_PAR) && OP(nxt) == CLOSE) { + /* Set the parenth number. */ + /* note that we have changed the type of oscan to CURLYM here */ + regnode *nxt1 = REGNODE_AFTER_type(oscan, tregnode_CURLYM); /* OPEN*/ + + FLAGS(oscan) = (U8)PARNO(nxt); + if (RExC_open_parens) { + /*open->CURLYM*/ + RExC_open_parens[PARNO(nxt1)] = REGNODE_OFFSET(oscan); + + /*close->NOTHING*/ + RExC_close_parens[PARNO(nxt1)] = REGNODE_OFFSET(nxt2) + + 1; + } + OP(nxt1) = OPTIMIZED; /* was OPEN. */ + OP(nxt) = OPTIMIZED; /* was CLOSE. */ + +#ifdef DEBUGGING + OP(nxt1 + 1) = OPTIMIZED; /* was count. */ + OP(nxt + 1) = OPTIMIZED; /* was count. */ + NEXT_OFF(nxt1 + 1) = 0; /* just for consistency. */ + NEXT_OFF(nxt + 1) = 0; /* just for consistency. */ +#endif +#if 0 + while ( nxt1 && (OP(nxt1) != WHILEM)) { + regnode *nnxt = regnext(nxt1); + if (nnxt == nxt) { + if (REGNODE_OFF_BY_ARG(OP(nxt1))) + ARG1u_SET(nxt1, nxt2 - nxt1); + else if (nxt2 - nxt1 < U16_MAX) + NEXT_OFF(nxt1) = nxt2 - nxt1; + else + OP(nxt) = NOTHING; /* Cannot beautify */ + } + nxt1 = nnxt; + } +#endif + /* Optimize again: */ + /* recurse study_chunk() on optimised CURLYX => CURLYM */ + study_chunk(pRExC_state, &nxt1, minlenp, &deltanext, nxt, + NULL, stopparen, recursed_depth, NULL, 0, + depth+1, mutate_ok); + } + else + FLAGS(oscan) = 0; + } + else if ((OP(oscan) == CURLYX) + && (flags & SCF_WHILEM_VISITED_POS) + /* See the comment on a similar expression above. + However, this time it's not a subexpression + we care about, but the expression itself. */ + && (maxcount == REG_INFTY) + && data) { + /* This stays as CURLYX, we can put the count/of pair. */ + /* Find WHILEM (as in regexec.c) */ + regnode *nxt = oscan + NEXT_OFF(oscan); + + if (OP(REGNODE_BEFORE(nxt)) == NOTHING) /* LONGJMP */ + nxt += ARG1u(nxt); + nxt = REGNODE_BEFORE(nxt); + if (FLAGS(nxt) & 0xf) { + /* we've already set whilem count on this node */ + } else if (++data->whilem_c < 16) { + assert(data->whilem_c <= RExC_whilem_seen); + FLAGS(nxt) = (U8)(data->whilem_c + | (RExC_whilem_seen << 4)); /* On WHILEM */ + } + } + if (data && fl & (SF_HAS_PAR|SF_IN_PAR)) + pars++; + if (flags & SCF_DO_SUBSTR) { + SV *last_str = NULL; + STRLEN last_chrs = 0; + int counted = mincount != 0; + + if (data->last_end > 0 && mincount != 0) { /* Ends with a + string. */ + SSize_t b = pos_before >= data->last_start_min + ? pos_before : data->last_start_min; + STRLEN l; + const char * const s = SvPV_const(data->last_found, l); + SSize_t old = b - data->last_start_min; + assert(old >= 0); + + if (UTF) + old = utf8_hop_forward((U8*)s, old, + (U8 *) SvEND(data->last_found)) + - (U8*)s; + l -= old; + /* Get the added string: */ + last_str = newSVpvn_utf8(s + old, l, UTF); + last_chrs = UTF ? utf8_length((U8*)(s + old), + (U8*)(s + old + l)) : l; + if (deltanext == 0 && pos_before == b) { + /* What was added is a constant string */ + if (mincount > 1) { + + SvGROW(last_str, (mincount * l) + 1); + repeatcpy(SvPVX(last_str) + l, + SvPVX_const(last_str), l, + mincount - 1); + SvCUR_set(last_str, SvCUR(last_str) * mincount); + /* Add additional parts. */ + SvCUR_set(data->last_found, + SvCUR(data->last_found) - l); + sv_catsv(data->last_found, last_str); + { + SV * sv = data->last_found; + MAGIC *mg = + SvUTF8(sv) && SvMAGICAL(sv) ? + mg_find(sv, PERL_MAGIC_utf8) : NULL; + if (mg && mg->mg_len >= 0) + mg->mg_len += last_chrs * (mincount-1); + } + last_chrs *= mincount; + data->last_end += l * (mincount - 1); + } + } else { + /* start offset must point into the last copy */ + data->last_start_min += minnext * (mincount - 1); + data->last_start_max = + is_inf + ? OPTIMIZE_INFTY + : data->last_start_max + + (maxcount - 1) * (minnext + data->pos_delta); + } + } + /* It is counted once already... */ + data->pos_min += minnext * (mincount - counted); +#if 0 + Perl_re_printf( aTHX_ "counted=%" UVuf " deltanext=%" UVuf + " OPTIMIZE_INFTY=%" UVuf " minnext=%" UVuf + " maxcount=%" UVuf " mincount=%" UVuf + " data->pos_delta=%" UVuf "\n", + (UV)counted, (UV)deltanext, (UV)OPTIMIZE_INFTY, (UV)minnext, + (UV)maxcount, (UV)mincount, (UV)data->pos_delta); + if (deltanext != OPTIMIZE_INFTY) + Perl_re_printf( aTHX_ "LHS=%" UVuf " RHS=%" UVuf "\n", + (UV)(-counted * deltanext + (minnext + deltanext) * maxcount + - minnext * mincount), (UV)(OPTIMIZE_INFTY - data->pos_delta)); +#endif + if (deltanext == OPTIMIZE_INFTY + || data->pos_delta == OPTIMIZE_INFTY + || -counted * deltanext + (minnext + deltanext) * maxcount - minnext * mincount >= OPTIMIZE_INFTY - data->pos_delta) + data->pos_delta = OPTIMIZE_INFTY; + else + data->pos_delta += - counted * deltanext + + (minnext + deltanext) * maxcount - minnext * mincount; + if (mincount != maxcount) { + /* Cannot extend fixed substrings found inside + the group. */ + scan_commit(pRExC_state, data, minlenp, is_inf); + if (mincount && last_str) { + SV * const sv = data->last_found; + MAGIC * const mg = SvUTF8(sv) && SvMAGICAL(sv) ? + mg_find(sv, PERL_MAGIC_utf8) : NULL; + + if (mg) + mg->mg_len = -1; + sv_setsv(sv, last_str); + data->last_end = data->pos_min; + data->last_start_min = data->pos_min - last_chrs; + data->last_start_max = is_inf + ? OPTIMIZE_INFTY + : data->pos_min + data->pos_delta - last_chrs; + } + data->cur_is_floating = 1; /* float */ + } + SvREFCNT_dec(last_str); + } + if (data && (fl & SF_HAS_EVAL)) + data->flags |= SF_HAS_EVAL; + optimize_curly_tail: + rck_elide_nothing(oscan); + continue; + + default: + Perl_croak(aTHX_ "panic: unexpected varying REx opcode %d", + OP(scan)); + case REF: + case CLUMP: + if (flags & SCF_DO_SUBSTR) { + /* Cannot expect anything... */ + scan_commit(pRExC_state, data, minlenp, is_inf); + data->cur_is_floating = 1; /* float */ + } + is_inf = is_inf_internal = 1; + if (flags & SCF_DO_STCLASS_OR) { + if (OP(scan) == CLUMP) { + /* Actually is any start char, but very few code points + * aren't start characters */ + ssc_match_all_cp(data->start_class); + } + else { + ssc_anything(data->start_class); + } + } + flags &= ~SCF_DO_STCLASS; + break; + } + } + else if (OP(scan) == LNBREAK) { + if (flags & SCF_DO_STCLASS) { + if (flags & SCF_DO_STCLASS_AND) { + ssc_intersection(data->start_class, + PL_XPosix_ptrs[CC_VERTSPACE_], FALSE); + ssc_clear_locale(data->start_class); + ANYOF_FLAGS(data->start_class) + &= ~SSC_MATCHES_EMPTY_STRING; + } + else if (flags & SCF_DO_STCLASS_OR) { + ssc_union(data->start_class, + PL_XPosix_ptrs[CC_VERTSPACE_], + FALSE); + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); + + /* See commit msg for + * 749e076fceedeb708a624933726e7989f2302f6a */ + ANYOF_FLAGS(data->start_class) + &= ~SSC_MATCHES_EMPTY_STRING; + } + flags &= ~SCF_DO_STCLASS; + } + min++; + if (delta != OPTIMIZE_INFTY) + delta++; /* Because of the 2 char string cr-lf */ + if (flags & SCF_DO_SUBSTR) { + /* Cannot expect anything... */ + scan_commit(pRExC_state, data, minlenp, is_inf); + data->pos_min += 1; + if (data->pos_delta != OPTIMIZE_INFTY) { + data->pos_delta += 1; + } + data->cur_is_floating = 1; /* float */ + } + } + else if (REGNODE_SIMPLE(OP(scan))) { + + if (flags & SCF_DO_SUBSTR) { + scan_commit(pRExC_state, data, minlenp, is_inf); + data->pos_min++; + } + min++; + if (flags & SCF_DO_STCLASS) { + bool invert = 0; + SV* my_invlist = NULL; + U8 namedclass; + + /* See commit msg 749e076fceedeb708a624933726e7989f2302f6a */ + ANYOF_FLAGS(data->start_class) &= ~SSC_MATCHES_EMPTY_STRING; + + /* Some of the logic below assumes that switching + locale on will only add false positives. */ + switch (OP(scan)) { + + default: +#ifdef DEBUGGING + Perl_croak(aTHX_ "panic: unexpected simple REx opcode %d", + OP(scan)); +#endif + case SANY: + if (flags & SCF_DO_STCLASS_OR) /* Allow everything */ + ssc_match_all_cp(data->start_class); + break; + + case REG_ANY: + { + SV* REG_ANY_invlist = _new_invlist(2); + REG_ANY_invlist = add_cp_to_invlist(REG_ANY_invlist, + '\n'); + if (flags & SCF_DO_STCLASS_OR) { + ssc_union(data->start_class, + REG_ANY_invlist, + TRUE /* TRUE => invert, hence all but \n + */ + ); + } + else if (flags & SCF_DO_STCLASS_AND) { + ssc_intersection(data->start_class, + REG_ANY_invlist, + TRUE /* TRUE => invert */ + ); + ssc_clear_locale(data->start_class); + } + SvREFCNT_dec_NN(REG_ANY_invlist); + } + break; + + case ANYOFD: + case ANYOFL: + case ANYOFPOSIXL: + case ANYOFH: + case ANYOFHb: + case ANYOFHr: + case ANYOFHs: + case ANYOF: + if (flags & SCF_DO_STCLASS_AND) + ssc_and(pRExC_state, data->start_class, + (regnode_charclass *) scan); + else + ssc_or(pRExC_state, data->start_class, + (regnode_charclass *) scan); + break; + + case ANYOFHbbm: + { + SV* cp_list = get_ANYOFHbbm_contents(scan); + + if (flags & SCF_DO_STCLASS_OR) { + ssc_union(data->start_class, cp_list, invert); + } + else if (flags & SCF_DO_STCLASS_AND) { + ssc_intersection(data->start_class, cp_list, invert); + } + + SvREFCNT_dec_NN(cp_list); + break; + } + + case NANYOFM: /* NANYOFM already contains the inversion of the + input ANYOF data, so, unlike things like + NPOSIXA, don't change 'invert' to TRUE */ + /* FALLTHROUGH */ + case ANYOFM: + { + SV* cp_list = get_ANYOFM_contents(scan); + + if (flags & SCF_DO_STCLASS_OR) { + ssc_union(data->start_class, cp_list, invert); + } + else if (flags & SCF_DO_STCLASS_AND) { + ssc_intersection(data->start_class, cp_list, invert); + } + + SvREFCNT_dec_NN(cp_list); + break; + } + + case ANYOFR: + case ANYOFRb: + { + SV* cp_list = NULL; + + cp_list = _add_range_to_invlist(cp_list, + ANYOFRbase(scan), + ANYOFRbase(scan) + ANYOFRdelta(scan)); + + if (flags & SCF_DO_STCLASS_OR) { + ssc_union(data->start_class, cp_list, invert); + } + else if (flags & SCF_DO_STCLASS_AND) { + ssc_intersection(data->start_class, cp_list, invert); + } + + SvREFCNT_dec_NN(cp_list); + break; + } + + case NPOSIXL: + invert = 1; + /* FALLTHROUGH */ + + case POSIXL: + namedclass = classnum_to_namedclass(FLAGS(scan)) + invert; + if (flags & SCF_DO_STCLASS_AND) { + bool was_there = cBOOL( + ANYOF_POSIXL_TEST(data->start_class, + namedclass)); + ANYOF_POSIXL_ZERO(data->start_class); + if (was_there) { /* Do an AND */ + ANYOF_POSIXL_SET(data->start_class, namedclass); + } + /* No individual code points can now match */ + data->start_class->invlist + = sv_2mortal(_new_invlist(0)); + } + else { + int complement = namedclass + ((invert) ? -1 : 1); + + assert(flags & SCF_DO_STCLASS_OR); + + /* If the complement of this class was already there, + * the result is that they match all code points, + * (\d + \D == everything). Remove the classes from + * future consideration. Locale is not relevant in + * this case */ + if (ANYOF_POSIXL_TEST(data->start_class, complement)) { + ssc_match_all_cp(data->start_class); + ANYOF_POSIXL_CLEAR(data->start_class, namedclass); + ANYOF_POSIXL_CLEAR(data->start_class, complement); + } + else { /* The usual case; just add this class to the + existing set */ + ANYOF_POSIXL_SET(data->start_class, namedclass); + } + } + break; + + case NPOSIXA: /* For these, we always know the exact set of + what's matched */ + invert = 1; + /* FALLTHROUGH */ + case POSIXA: + my_invlist = invlist_clone(PL_Posix_ptrs[FLAGS(scan)], NULL); + goto join_posix_and_ascii; + + case NPOSIXD: + case NPOSIXU: + invert = 1; + /* FALLTHROUGH */ + case POSIXD: + case POSIXU: + my_invlist = invlist_clone(PL_XPosix_ptrs[FLAGS(scan)], NULL); + + /* NPOSIXD matches all upper Latin1 code points unless the + * target string being matched is UTF-8, which is + * unknowable until match time. Since we are going to + * invert, we want to get rid of all of them so that the + * inversion will match all */ + if (OP(scan) == NPOSIXD) { + _invlist_subtract(my_invlist, PL_UpperLatin1, + &my_invlist); + } + + join_posix_and_ascii: + + if (flags & SCF_DO_STCLASS_AND) { + ssc_intersection(data->start_class, my_invlist, invert); + ssc_clear_locale(data->start_class); + } + else { + assert(flags & SCF_DO_STCLASS_OR); + ssc_union(data->start_class, my_invlist, invert); + } + SvREFCNT_dec(my_invlist); + } + if (flags & SCF_DO_STCLASS_OR) + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); + flags &= ~SCF_DO_STCLASS; + } + } + else if (REGNODE_TYPE(OP(scan)) == EOL && flags & SCF_DO_SUBSTR) { + data->flags |= (OP(scan) == MEOL + ? SF_BEFORE_MEOL + : SF_BEFORE_SEOL); + scan_commit(pRExC_state, data, minlenp, is_inf); + + } + else if ( REGNODE_TYPE(OP(scan)) == BRANCHJ + /* Lookbehind, or need to calculate parens/evals/stclass: */ + && (FLAGS(scan) || data || (flags & SCF_DO_STCLASS)) + && (OP(scan) == IFMATCH || OP(scan) == UNLESSM)) + { + if ( !PERL_ENABLE_POSITIVE_ASSERTION_STUDY + || OP(scan) == UNLESSM ) + { + /* Negative Lookahead/lookbehind + In this case we can't do fixed string optimisation. + */ + + bool is_positive = OP(scan) == IFMATCH ? 1 : 0; + SSize_t deltanext, minnext; + SSize_t fake_last_close = 0; + regnode *fake_last_close_op = NULL; + regnode *cur_last_close_op; + regnode *nscan; + regnode_ssc intrnl; + U32 f = (flags & SCF_TRIE_DOING_RESTUDY); + + StructCopy(&zero_scan_data, &data_fake, scan_data_t); + if (data) { + data_fake.whilem_c = data->whilem_c; + data_fake.last_closep = data->last_closep; + data_fake.last_close_opp = data->last_close_opp; + } + else { + data_fake.last_closep = &fake_last_close; + data_fake.last_close_opp = &fake_last_close_op; + } + + /* remember the last_close_op we saw so we can see if + * we are dealing with variable length lookbehind that + * contains capturing buffers, which are considered + * experimental */ + cur_last_close_op= *(data_fake.last_close_opp); + + data_fake.pos_delta = delta; + if ( flags & SCF_DO_STCLASS && !FLAGS(scan) + && OP(scan) == IFMATCH ) { /* Lookahead */ + ssc_init(pRExC_state, &intrnl); + data_fake.start_class = &intrnl; + f |= SCF_DO_STCLASS_AND; + } + if (flags & SCF_WHILEM_VISITED_POS) + f |= SCF_WHILEM_VISITED_POS; + next = regnext(scan); + nscan = REGNODE_AFTER(scan); + + /* recurse study_chunk() for lookahead body */ + minnext = study_chunk(pRExC_state, &nscan, minlenp, &deltanext, + last, &data_fake, stopparen, + recursed_depth, NULL, f, depth+1, + mutate_ok); + + if (FLAGS(scan)) { + if ( deltanext < 0 + || deltanext > (I32) U8_MAX + || minnext > (I32)U8_MAX + || minnext + deltanext > (I32)U8_MAX) + { + FAIL2("Lookbehind longer than %" UVuf " not implemented", + (UV)U8_MAX); + } + + /* The 'next_off' field has been repurposed to count the + * additional starting positions to try beyond the initial + * one. (This leaves it at 0 for non-variable length + * matches to avoid breakage for those not using this + * extension) */ + if (deltanext) { + NEXT_OFF(scan) = deltanext; + if ( + /* See a CLOSE op inside this lookbehind? */ + cur_last_close_op != *(data_fake.last_close_opp) + /* and not doing restudy. see: restudied */ + && !(flags & SCF_TRIE_DOING_RESTUDY) + ) { + /* this is positive variable length lookbehind with + * capture buffers inside of it */ + ckWARNexperimental_with_arg(RExC_parse, + WARN_EXPERIMENTAL__VLB, + "Variable length %s lookbehind with capturing is experimental", + is_positive ? "positive" : "negative"); + } + } + FLAGS(scan) = (U8)minnext + deltanext; + } + if (data) { + if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR)) + pars++; + if (data_fake.flags & SF_HAS_EVAL) + data->flags |= SF_HAS_EVAL; + data->whilem_c = data_fake.whilem_c; + } + if (f & SCF_DO_STCLASS_AND) { + if (flags & SCF_DO_STCLASS_OR) { + /* OR before, AND after: ideally we would recurse with + * data_fake to get the AND applied by study of the + * remainder of the pattern, and then derecurse; + * *** HACK *** for now just treat as "no information". + * See [perl #56690]. + */ + ssc_init(pRExC_state, data->start_class); + } else { + /* AND before and after: combine and continue. These + * assertions are zero-length, so can match an EMPTY + * string */ + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &intrnl); + ANYOF_FLAGS(data->start_class) + |= SSC_MATCHES_EMPTY_STRING; + } + } + DEBUG_STUDYDATA("end LOOKAROUND", data, depth, is_inf, min, stopmin, delta); + } +#if PERL_ENABLE_POSITIVE_ASSERTION_STUDY + else { + /* Positive Lookahead/lookbehind + In this case we can do fixed string optimisation, + but we must be careful about it. Note in the case of + lookbehind the positions will be offset by the minimum + length of the pattern, something we won't know about + until after the recurse. + */ + SSize_t deltanext, fake_last_close = 0; + regnode *last_close_op = NULL; + regnode *nscan; + regnode_ssc intrnl; + U32 f = (flags & SCF_TRIE_DOING_RESTUDY); + /* We use SAVEFREEPV so that when the full compile + is finished perl will clean up the allocated + minlens when it's all done. This way we don't + have to worry about freeing them when we know + they wont be used, which would be a pain. + */ + SSize_t *minnextp; + Newx( minnextp, 1, SSize_t ); + SAVEFREEPV(minnextp); + + if (data) { + StructCopy(data, &data_fake, scan_data_t); + if ((flags & SCF_DO_SUBSTR) && data->last_found) { + f |= SCF_DO_SUBSTR; + if (FLAGS(scan)) + scan_commit(pRExC_state, &data_fake, minlenp, is_inf); + data_fake.last_found=newSVsv(data->last_found); + } + } + else { + data_fake.last_closep = &fake_last_close; + data_fake.last_close_opp = &fake_last_close_opp; + } + data_fake.flags = 0; + data_fake.substrs[0].flags = 0; + data_fake.substrs[1].flags = 0; + data_fake.pos_delta = delta; + if (is_inf) + data_fake.flags |= SF_IS_INF; + if ( flags & SCF_DO_STCLASS && !FLAGS(scan) + && OP(scan) == IFMATCH ) { /* Lookahead */ + ssc_init(pRExC_state, &intrnl); + data_fake.start_class = &intrnl; + f |= SCF_DO_STCLASS_AND; + } + if (flags & SCF_WHILEM_VISITED_POS) + f |= SCF_WHILEM_VISITED_POS; + next = regnext(scan); + nscan = REGNODE_AFTER(scan); + + /* positive lookahead study_chunk() recursion */ + *minnextp = study_chunk(pRExC_state, &nscan, minnextp, + &deltanext, last, &data_fake, + stopparen, recursed_depth, NULL, + f, depth+1, mutate_ok); + if (FLAGS(scan)) { + assert(0); /* This code has never been tested since this + is normally not compiled */ + if ( deltanext < 0 + || deltanext > (I32) U8_MAX + || *minnextp > (I32)U8_MAX + || *minnextp + deltanext > (I32)U8_MAX) + { + FAIL2("Lookbehind longer than %" UVuf " not implemented", + (UV)U8_MAX); + } + + if (deltanext) { + NEXT_OFF(scan) = deltanext; + } + FLAGS(scan) = (U8)*minnextp + deltanext; + } + + *minnextp += min; + + if (f & SCF_DO_STCLASS_AND) { + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &intrnl); + ANYOF_FLAGS(data->start_class) |= SSC_MATCHES_EMPTY_STRING; + } + if (data) { + if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR)) + pars++; + if (data_fake.flags & SF_HAS_EVAL) + data->flags |= SF_HAS_EVAL; + data->whilem_c = data_fake.whilem_c; + if ((flags & SCF_DO_SUBSTR) && data_fake.last_found) { + int i; + if (RExC_rx->minlen < *minnextp) + RExC_rx->minlen = *minnextp; + scan_commit(pRExC_state, &data_fake, minnextp, is_inf); + SvREFCNT_dec_NN(data_fake.last_found); + + for (i = 0; i < 2; i++) { + if (data_fake.substrs[i].minlenp != minlenp) { + data->substrs[i].min_offset = + data_fake.substrs[i].min_offset; + data->substrs[i].max_offset = + data_fake.substrs[i].max_offset; + data->substrs[i].minlenp = + data_fake.substrs[i].minlenp; + data->substrs[i].lookbehind += FLAGS(scan); + } + } + } + } + } +#endif + } + else if (OP(scan) == OPEN) { + if (stopparen != (I32)PARNO(scan)) + pars++; + } + else if (OP(scan) == CLOSE) { + if (stopparen == (I32)PARNO(scan)) { + break; + } + if ((I32)PARNO(scan) == is_par) { + next = regnext(scan); + + if ( next && (OP(next) != WHILEM) && next < last) + is_par = 0; /* Disable optimization */ + } + if (data) { + *(data->last_closep) = PARNO(scan); + *(data->last_close_opp) = scan; + } + } + else if (OP(scan) == EVAL) { + if (data && !(FLAGS(scan) & EVAL_OPTIMISTIC_FLAG) ) + data->flags |= SF_HAS_EVAL; + } + else if ( REGNODE_TYPE(OP(scan)) == ENDLIKE ) { + if (flags & SCF_DO_SUBSTR) { + scan_commit(pRExC_state, data, minlenp, is_inf); + flags &= ~SCF_DO_SUBSTR; + } + if (OP(scan)==ACCEPT) { + /* m{(*ACCEPT)x} does not have to start with 'x' */ + flags &= ~SCF_DO_STCLASS; + if (data) + data->flags |= SCF_SEEN_ACCEPT; + if (stopmin > min) + stopmin = min; + } + } + else if (OP(scan) == COMMIT) { + /* gh18770: m{abc(*COMMIT)xyz} must fail on "abc abcxyz", so we + * must not end up with "abcxyz" as a fixed substring else we'll + * skip straight to attempting to match at offset 4. + */ + if (flags & SCF_DO_SUBSTR) { + scan_commit(pRExC_state, data, minlenp, is_inf); + flags &= ~SCF_DO_SUBSTR; + } + } + else if (OP(scan) == LOGICAL && FLAGS(scan) == 2) /* Embedded follows */ + { + if (flags & SCF_DO_SUBSTR) { + scan_commit(pRExC_state, data, minlenp, is_inf); + data->cur_is_floating = 1; /* float */ + } + is_inf = is_inf_internal = 1; + if (flags & SCF_DO_STCLASS_OR) /* Allow everything */ + ssc_anything(data->start_class); + flags &= ~SCF_DO_STCLASS; + } + else if (OP(scan) == GPOS) { + if (!(RExC_rx->intflags & PREGf_GPOS_FLOAT) && + !(delta || is_inf || (data && data->pos_delta))) + { + if (!(RExC_rx->intflags & PREGf_ANCH) && (flags & SCF_DO_SUBSTR)) + RExC_rx->intflags |= PREGf_ANCH_GPOS; + if (RExC_rx->gofs < (STRLEN)min) + RExC_rx->gofs = min; + } else { + RExC_rx->intflags |= PREGf_GPOS_FLOAT; + RExC_rx->gofs = 0; + } + } +#ifdef TRIE_STUDY_OPT +#ifdef FULL_TRIE_STUDY + else if (REGNODE_TYPE(OP(scan)) == TRIE) { + /* NOTE - There is similar code to this block above for handling + BRANCH nodes on the initial study. If you change stuff here + check there too. */ + regnode *trie_node= scan; + regnode *tail= regnext(scan); + reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG1u(scan) ]; + SSize_t max1 = 0, min1 = OPTIMIZE_INFTY; + regnode_ssc accum; + + if (flags & SCF_DO_SUBSTR) { /* XXXX Add !SUSPEND? */ + /* Cannot merge strings after this. */ + scan_commit(pRExC_state, data, minlenp, is_inf); + } + if (flags & SCF_DO_STCLASS) + ssc_init_zero(pRExC_state, &accum); + + if (!trie->jump) { + min1= trie->minlen; + max1= trie->maxlen; + } else { + const regnode *nextbranch= NULL; + U32 word; + + for ( word=1 ; word <= trie->wordcount ; word++) + { + SSize_t deltanext = 0, minnext = 0; + U32 f = (flags & SCF_TRIE_DOING_RESTUDY); + SSize_t fake_last_close = 0; + regnode *fake_last_close_op = NULL; + regnode_ssc this_class; + + StructCopy(&zero_scan_data, &data_fake, scan_data_t); + if (data) { + data_fake.whilem_c = data->whilem_c; + data_fake.last_closep = data->last_closep; + data_fake.last_close_opp = data->last_close_opp; + } + else { + data_fake.last_closep = &fake_last_close; + data_fake.last_close_opp = &fake_last_close_op; + } + data_fake.pos_delta = delta; + if (flags & SCF_DO_STCLASS) { + ssc_init(pRExC_state, &this_class); + data_fake.start_class = &this_class; + f |= SCF_DO_STCLASS_AND; + } + if (flags & SCF_WHILEM_VISITED_POS) + f |= SCF_WHILEM_VISITED_POS; + + if (trie->jump[word]) { + if (!nextbranch) + nextbranch = trie_node + trie->jump[0]; + scan= trie_node + trie->jump[word]; + /* We go from the jump point to the branch that follows + it. Note this means we need the vestigal unused + branches even though they arent otherwise used. */ + /* optimise study_chunk() for TRIE */ + minnext = study_chunk(pRExC_state, &scan, minlenp, + &deltanext, (regnode *)nextbranch, &data_fake, + stopparen, recursed_depth, NULL, f, depth+1, + mutate_ok); + } + if (nextbranch && REGNODE_TYPE(OP(nextbranch))==BRANCH) + nextbranch= regnext((regnode*)nextbranch); + + if (min1 > (SSize_t)(minnext + trie->minlen)) + min1 = minnext + trie->minlen; + if (deltanext == OPTIMIZE_INFTY) { + is_inf = is_inf_internal = 1; + max1 = OPTIMIZE_INFTY; + } else if (max1 < (SSize_t)(minnext + deltanext + trie->maxlen)) + max1 = minnext + deltanext + trie->maxlen; + + if (data_fake.flags & (SF_HAS_PAR|SF_IN_PAR)) + pars++; + if (data_fake.flags & SCF_SEEN_ACCEPT) { + if ( stopmin > min + min1) + stopmin = min + min1; + flags &= ~SCF_DO_SUBSTR; + if (data) + data->flags |= SCF_SEEN_ACCEPT; + } + if (data) { + if (data_fake.flags & SF_HAS_EVAL) + data->flags |= SF_HAS_EVAL; + data->whilem_c = data_fake.whilem_c; + } + if (flags & SCF_DO_STCLASS) + ssc_or(pRExC_state, &accum, (regnode_charclass *) &this_class); + } + DEBUG_STUDYDATA("after JUMPTRIE", data, depth, is_inf, min, stopmin, delta); + } + if (flags & SCF_DO_SUBSTR) { + data->pos_min += min1; + data->pos_delta += max1 - min1; + if (max1 != min1 || is_inf) + data->cur_is_floating = 1; /* float */ + } + min += min1; + if (delta != OPTIMIZE_INFTY) { + if (OPTIMIZE_INFTY - (max1 - min1) >= delta) + delta += max1 - min1; + else + delta = OPTIMIZE_INFTY; + } + if (flags & SCF_DO_STCLASS_OR) { + ssc_or(pRExC_state, data->start_class, (regnode_charclass *) &accum); + if (min1) { + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); + flags &= ~SCF_DO_STCLASS; + } + } + else if (flags & SCF_DO_STCLASS_AND) { + if (min1) { + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) &accum); + flags &= ~SCF_DO_STCLASS; + } + else { + /* Switch to OR mode: cache the old value of + * data->start_class */ + INIT_AND_WITHP; + StructCopy(data->start_class, and_withp, regnode_ssc); + flags &= ~SCF_DO_STCLASS_AND; + StructCopy(&accum, data->start_class, regnode_ssc); + flags |= SCF_DO_STCLASS_OR; + } + } + scan= tail; + DEBUG_STUDYDATA("after TRIE study", data, depth, is_inf, min, stopmin, delta); + continue; + } +#else + else if (REGNODE_TYPE(OP(scan)) == TRIE) { + reg_trie_data *trie = (reg_trie_data*)RExC_rxi->data->data[ ARG1u(scan) ]; + U8*bang=NULL; + + min += trie->minlen; + delta += (trie->maxlen - trie->minlen); + flags &= ~SCF_DO_STCLASS; /* xxx */ + if (flags & SCF_DO_SUBSTR) { + /* Cannot expect anything... */ + scan_commit(pRExC_state, data, minlenp, is_inf); + data->pos_min += trie->minlen; + data->pos_delta += (trie->maxlen - trie->minlen); + if (trie->maxlen != trie->minlen) + data->cur_is_floating = 1; /* float */ + } + if (trie->jump) /* no more substrings -- for now /grr*/ + flags &= ~SCF_DO_SUBSTR; + } + +#endif /* old or new */ +#endif /* TRIE_STUDY_OPT */ + + else if (OP(scan) == REGEX_SET) { + Perl_croak(aTHX_ "panic: %s regnode should be resolved" + " before optimization", REGNODE_NAME(REGEX_SET)); + } + + /* Else: zero-length, ignore. */ + scan = regnext(scan); + } + + finish: + if (frame) { + /* we need to unwind recursion. */ + depth = depth - 1; + + DEBUG_STUDYDATA("frame-end", data, depth, is_inf, min, stopmin, delta); + DEBUG_PEEP("fend", scan, depth, flags); + + /* restore previous context */ + last = frame->last_regnode; + scan = frame->next_regnode; + stopparen = frame->stopparen; + recursed_depth = frame->prev_recursed_depth; + + RExC_frame_last = frame->prev_frame; + frame = frame->this_prev_frame; + goto fake_study_recurse; + } + + assert(!frame); + DEBUG_STUDYDATA("pre-fin", data, depth, is_inf, min, stopmin, delta); + + /* is this pattern infinite? Eg, consider /(a|b+)/ */ + if (is_inf_internal) + delta = OPTIMIZE_INFTY; + + /* deal with (*ACCEPT), Eg, consider /(foo(*ACCEPT)|bop)bar/ */ + if (min > stopmin) { + /* + At this point 'min' represents the minimum length string we can + match while *ignoring* the implication of ACCEPT, and 'delta' + represents the difference between the minimum length and maximum + length, and if the pattern matches an infinitely long string + (consider the + and * quantifiers) then we use the special delta + value of OPTIMIZE_INFTY to represent it. 'stopmin' is the + minimum length that can be matched *and* accepted. + + A pattern is accepted when matching was successful *and* + complete, and thus there is no further matching needing to be + done, no backtracking to occur, etc. Prior to the introduction + of ACCEPT the only opcode that signaled acceptance was the END + opcode, which is always the very last opcode in a regex program. + ACCEPT is thus conceptually an early successful return out of + the matching process. stopmin starts out as OPTIMIZE_INFTY to + represent "the entire pattern", and is ratched down to the + "current min" if necessary when an ACCEPT opcode is encountered. + + Thus stopmin might be smaller than min if we saw an (*ACCEPT), + and we now need to account for it in both min and delta. + Consider that in a pattern /AB/ normally the min length it can + match can be computed as min(A)+min(B). But (*ACCEPT) means + that it might be something else, not even neccesarily min(A) at + all. Consider + + A = /(foo(*ACCEPT)|x+)/ + B = /whop/ + AB = /(foo(*ACCEPT)|x+)whop/ + + The min for A is 1 for "x" and the delta for A is OPTIMIZE_INFTY + for "xxxxx...", its stopmin is 3 for "foo". The min for B is 4 for + "whop", and the delta of 0 as the pattern is of fixed length, the + stopmin would be OPTIMIZE_INFTY as it does not contain an ACCEPT. + When handling AB we expect to see a min of 5 for "xwhop", and a + delta of OPTIMIZE_INFTY for "xxxxx...whop", and a stopmin of 3 + for "foo". This should result in a final min of 3 for "foo", and + a final delta of OPTIMIZE_INFTY for "xxxxx...whop". + + In something like /(dude(*ACCEPT)|irk)x{3,7}/ we would have a + min of 6 for "irkxxx" and a delta of 4 for "irkxxxxxxx", and the + stop min would be 4 for "dude". This should result in a final + min of 4 for "dude", and a final delta of 6, for "irkxxxxxxx". + + When min is smaller than stopmin then we can ignore it. In the + fragment /(x{10,20}(*ACCEPT)|a)b+/, we would have a min of 2, + and a delta of OPTIMIZE_INFTY, and a stopmin of 10. Obviously + the ACCEPT doesn't reduce the minimum length of the string that + might be matched, nor affect the maximum length. + + In something like /foo(*ACCEPT)ba?r/ we would have a min of 5 + for "foobr", a delta of 1 for "foobar", and a stopmin of 3 for + "foo". We currently turn this into a min of 3 for "foo" and a + delta of 3 for "foobar" even though technically "foobar" isn't + possible. ACCEPT affects some aspects of the optimizer, like + length computations and mandatory substring optimizations, but + there are other optimzations this routine perfoms that are not + affected and this compromise simplifies implementation. + + It might be helpful to consider that this C function is called + recursively on the pattern in a bottom up fashion, and that the + min returned by a nested call may be marked as coming from an + ACCEPT, causing its callers to treat the returned min as a + stopmin as the recursion unwinds. Thus a single ACCEPT can affect + multiple calls into this function in different ways. + */ + + if (OPTIMIZE_INFTY - delta >= min - stopmin) + delta += min - stopmin; + else + delta = OPTIMIZE_INFTY; + min = stopmin; + } + + *scanp = scan; + *deltap = delta; + + if (flags & SCF_DO_SUBSTR && is_inf) + data->pos_delta = OPTIMIZE_INFTY - data->pos_min; + if (is_par > (I32)U8_MAX) + is_par = 0; + if (is_par && pars==1 && data) { + data->flags |= SF_IN_PAR; + data->flags &= ~SF_HAS_PAR; + } + else if (pars && data) { + data->flags |= SF_HAS_PAR; + data->flags &= ~SF_IN_PAR; + } + if (flags & SCF_DO_STCLASS_OR) + ssc_and(pRExC_state, data->start_class, (regnode_charclass *) and_withp); + if (flags & SCF_TRIE_RESTUDY) + data->flags |= SCF_TRIE_RESTUDY; + + + if (!(RExC_seen & REG_UNBOUNDED_QUANTIFIER_SEEN)) { + if (min > OPTIMIZE_INFTY - delta) + RExC_maxlen = OPTIMIZE_INFTY; + else if (RExC_maxlen < min + delta) + RExC_maxlen = min + delta; + } + DEBUG_STUDYDATA("post-fin", data, depth, is_inf, min, stopmin, delta); + return min; +} Index: gnu/usr.bin/perl/regcomp_trie.c =================================================================== RCS file: gnu/usr.bin/perl/regcomp_trie.c diff -N gnu/usr.bin/perl/regcomp_trie.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/regcomp_trie.c 21 Feb 2024 15:47:03 -0000 @@ -0,0 +1,1717 @@ +#ifdef PERL_EXT_RE_BUILD +#include "re_top.h" +#endif + +#include "EXTERN.h" +#define PERL_IN_REGEX_ENGINE +#define PERL_IN_REGCOMP_ANY +#define PERL_IN_REGCOMP_TRIE_C +#include "perl.h" + +#ifdef PERL_IN_XSUB_RE +# include "re_comp.h" +#else +# include "regcomp.h" +#endif + +#include "invlist_inline.h" +#include "unicode_constants.h" +#include "regcomp_internal.h" + +#define TRIE_LIST_ITEM(state,idx) (trie->states[state].trans.list)[ idx ] +#define TRIE_LIST_CUR(state) ( TRIE_LIST_ITEM( state, 0 ).forid ) +#define TRIE_LIST_LEN(state) ( TRIE_LIST_ITEM( state, 0 ).newstate ) +#define TRIE_LIST_USED(idx) ( trie->states[state].trans.list \ + ? (TRIE_LIST_CUR( idx ) - 1) \ + : 0 ) + + +#ifdef DEBUGGING +/* + dump_trie(trie,widecharmap,revcharmap) + dump_trie_interim_list(trie,widecharmap,revcharmap,next_alloc) + dump_trie_interim_table(trie,widecharmap,revcharmap,next_alloc) + + These routines dump out a trie in a somewhat readable format. + The _interim_ variants are used for debugging the interim + tables that are used to generate the final compressed + representation which is what dump_trie expects. + + Part of the reason for their existence is to provide a form + of documentation as to how the different representations function. + +*/ + +/* + Dumps the final compressed table form of the trie to Perl_debug_log. + Used for debugging make_trie(). +*/ + +STATIC void +S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV *widecharmap, + AV *revcharmap, U32 depth) +{ + U32 state; + SV *sv=sv_newmortal(); + int colwidth= widecharmap ? 6 : 4; + U16 word; + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + PERL_ARGS_ASSERT_DUMP_TRIE; + + Perl_re_indentf( aTHX_ "Char : %-6s%-6s%-4s ", + depth+1, "Match","Base","Ofs" ); + + for( state = 0 ; state < trie->uniquecharcount ; state++ ) { + SV ** const tmp = av_fetch_simple( revcharmap, state, 0); + if ( tmp ) { + Perl_re_printf( aTHX_ "%*s", + colwidth, + pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth, + PL_colors[0], PL_colors[1], + (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) | + PERL_PV_ESCAPE_FIRSTCHAR + ) + ); + } + } + Perl_re_printf( aTHX_ "\n"); + Perl_re_indentf( aTHX_ "State|-----------------------", depth+1); + + for( state = 0 ; state < trie->uniquecharcount ; state++ ) + Perl_re_printf( aTHX_ "%.*s", colwidth, "--------"); + Perl_re_printf( aTHX_ "\n"); + + for( state = 1 ; state < trie->statecount ; state++ ) { + const U32 base = trie->states[ state ].trans.base; + + Perl_re_indentf( aTHX_ "#%4" UVXf "|", depth+1, (UV)state); + + if ( trie->states[ state ].wordnum ) { + Perl_re_printf( aTHX_ " W%4X", trie->states[ state ].wordnum ); + } else { + Perl_re_printf( aTHX_ "%6s", "" ); + } + + Perl_re_printf( aTHX_ " @%4" UVXf " ", (UV)base ); + + if ( base ) { + U32 ofs = 0; + + while( ( base + ofs < trie->uniquecharcount ) || + ( base + ofs - trie->uniquecharcount < trie->lasttrans + && trie->trans[ base + ofs - trie->uniquecharcount ].check + != state)) + ofs++; + + Perl_re_printf( aTHX_ "+%2" UVXf "[ ", (UV)ofs); + + for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) { + if ( ( base + ofs >= trie->uniquecharcount ) + && ( base + ofs - trie->uniquecharcount + < trie->lasttrans ) + && trie->trans[ base + ofs + - trie->uniquecharcount ].check == state ) + { + Perl_re_printf( aTHX_ "%*" UVXf, colwidth, + (UV)trie->trans[ base + ofs - trie->uniquecharcount ].next + ); + } else { + Perl_re_printf( aTHX_ "%*s", colwidth," ." ); + } + } + + Perl_re_printf( aTHX_ "]"); + + } + Perl_re_printf( aTHX_ "\n" ); + } + Perl_re_indentf( aTHX_ "word_info N:(prev,len)=", + depth); + for (word=1; word <= trie->wordcount; word++) { + Perl_re_printf( aTHX_ " %d:(%d,%d)", + (int)word, (int)(trie->wordinfo[word].prev), + (int)(trie->wordinfo[word].len)); + } + Perl_re_printf( aTHX_ "\n" ); +} +/* + Dumps a fully constructed but uncompressed trie in list form. + List tries normally only are used for construction when the number of + possible chars (trie->uniquecharcount) is very high. + Used for debugging make_trie(). +*/ +STATIC void +S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie, + HV *widecharmap, AV *revcharmap, U32 next_alloc, + U32 depth) +{ + U32 state; + SV *sv=sv_newmortal(); + int colwidth= widecharmap ? 6 : 4; + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST; + + /* print out the table precompression. */ + Perl_re_indentf( aTHX_ "State :Word | Transition Data\n", + depth+1 ); + Perl_re_indentf( aTHX_ "%s", + depth+1, "------:-----+-----------------\n" ); + + for( state=1 ; state < next_alloc ; state ++ ) { + U16 charid; + + Perl_re_indentf( aTHX_ " %4" UVXf " :", + depth+1, (UV)state ); + if ( ! trie->states[ state ].wordnum ) { + Perl_re_printf( aTHX_ "%5s| ",""); + } else { + Perl_re_printf( aTHX_ "W%4x| ", + trie->states[ state ].wordnum + ); + } + for( charid = 1 ; charid <= TRIE_LIST_USED( state ) ; charid++ ) { + SV ** const tmp = av_fetch_simple( revcharmap, + TRIE_LIST_ITEM(state, charid).forid, 0); + if ( tmp ) { + Perl_re_printf( aTHX_ "%*s:%3X=%4" UVXf " | ", + colwidth, + pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), + colwidth, + PL_colors[0], PL_colors[1], + (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) + | PERL_PV_ESCAPE_FIRSTCHAR + ) , + TRIE_LIST_ITEM(state, charid).forid, + (UV)TRIE_LIST_ITEM(state, charid).newstate + ); + if (!(charid % 10)) + Perl_re_printf( aTHX_ "\n%*s| ", + (int)((depth * 2) + 14), ""); + } + } + Perl_re_printf( aTHX_ "\n"); + } +} + +/* + Dumps a fully constructed but uncompressed trie in table form. + This is the normal DFA style state transition table, with a few + twists to facilitate compression later. + Used for debugging make_trie(). +*/ +STATIC void +S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie, + HV *widecharmap, AV *revcharmap, U32 next_alloc, + U32 depth) +{ + U32 state; + U16 charid; + SV *sv=sv_newmortal(); + int colwidth= widecharmap ? 6 : 4; + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE; + + /* + print out the table precompression so that we can do a visual check + that they are identical. + */ + + Perl_re_indentf( aTHX_ "Char : ", depth+1 ); + + for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) { + SV ** const tmp = av_fetch_simple( revcharmap, charid, 0); + if ( tmp ) { + Perl_re_printf( aTHX_ "%*s", + colwidth, + pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), colwidth, + PL_colors[0], PL_colors[1], + (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) | + PERL_PV_ESCAPE_FIRSTCHAR + ) + ); + } + } + + Perl_re_printf( aTHX_ "\n"); + Perl_re_indentf( aTHX_ "State+-", depth+1 ); + + for( charid=0 ; charid < trie->uniquecharcount ; charid++ ) { + Perl_re_printf( aTHX_ "%.*s", colwidth,"--------"); + } + + Perl_re_printf( aTHX_ "\n" ); + + for( state=1 ; state < next_alloc ; state += trie->uniquecharcount ) { + + Perl_re_indentf( aTHX_ "%4" UVXf " : ", + depth+1, + (UV)TRIE_NODENUM( state ) ); + + for( charid = 0 ; charid < trie->uniquecharcount ; charid++ ) { + UV v=(UV)SAFE_TRIE_NODENUM( trie->trans[ state + charid ].next ); + if (v) + Perl_re_printf( aTHX_ "%*" UVXf, colwidth, v ); + else + Perl_re_printf( aTHX_ "%*s", colwidth, "." ); + } + if ( ! trie->states[ TRIE_NODENUM( state ) ].wordnum ) { + Perl_re_printf( aTHX_ " (%4" UVXf ")\n", + (UV)trie->trans[ state ].check ); + } else { + Perl_re_printf( aTHX_ " (%4" UVXf ") W%4X\n", + (UV)trie->trans[ state ].check, + trie->states[ TRIE_NODENUM( state ) ].wordnum ); + } + } +} + +#endif + + +/* make_trie(startbranch,first,last,tail,word_count,flags,depth) + startbranch: the first branch in the whole branch sequence + first : start branch of sequence of branch-exact nodes. + May be the same as startbranch + last : Thing following the last branch. + May be the same as tail. + tail : item following the branch sequence + count : words in the sequence + flags : currently the OP() type we will be building one of /EXACT(|F|FA|FU|FU_SS|L|FLU8)/ + depth : indent depth + +Inplace optimizes a sequence of 2 or more Branch-Exact nodes into a TRIE node. + +A trie is an N'ary tree where the branches are determined by digital +decomposition of the key. IE, at the root node you look up the 1st character and +follow that branch repeat until you find the end of the branches. Nodes can be +marked as "accepting" meaning they represent a complete word. Eg: + + /he|she|his|hers/ + +would convert into the following structure. Numbers represent states, letters +following numbers represent valid transitions on the letter from that state, if +the number is in square brackets it represents an accepting state, otherwise it +will be in parenthesis. + + +-h->+-e->[3]-+-r->(8)-+-s->[9] + | | + | (2) + | | + (1) +-i->(6)-+-s->[7] + | + +-s->(3)-+-h->(4)-+-e->[5] + + Accept Word Mapping: 3=>1 (he),5=>2 (she), 7=>3 (his), 9=>4 (hers) + +This shows that when matching against the string 'hers' we will begin at state 1 +read 'h' and move to state 2, read 'e' and move to state 3 which is accepting, +then read 'r' and go to state 8 followed by 's' which takes us to state 9 which +is also accepting. Thus we know that we can match both 'he' and 'hers' with a +single traverse. We store a mapping from accepting to state to which word was +matched, and then when we have multiple possibilities we try to complete the +rest of the regex in the order in which they occurred in the alternation. + +The only prior NFA like behaviour that would be changed by the TRIE support is +the silent ignoring of duplicate alternations which are of the form: + + / (DUPE|DUPE) X? (?{ ... }) Y /x + +Thus EVAL blocks following a trie may be called a different number of times with +and without the optimisation. With the optimisations dupes will be silently +ignored. This inconsistent behaviour of EVAL type nodes is well established as +the following demonstrates: + + 'words'=~/(word|word|word)(?{ print $1 })[xyz]/ + +which prints out 'word' three times, but + + 'words'=~/(word|word|word)(?{ print $1 })S/ + +which doesnt print it out at all. This is due to other optimisations kicking in. + +Example of what happens on a structural level: + +The regexp /(ac|ad|ab)+/ will produce the following debug output: + + 1: CURLYM[1] {1,32767}(18) + 5: BRANCH(8) + 6: EXACT (16) + 8: BRANCH(11) + 9: EXACT (16) + 11: BRANCH(14) + 12: EXACT (16) + 16: SUCCEED(0) + 17: NOTHING(18) + 18: END(0) + +This would be optimizable with startbranch=5, first=5, last=16, tail=16 +and should turn into: + + 1: CURLYM[1] {1,32767}(18) + 5: TRIE(16) + [Words:3 Chars Stored:6 Unique Chars:4 States:5 NCP:1] + + + + 16: SUCCEED(0) + 17: NOTHING(18) + 18: END(0) + +Cases where tail != last would be like /(?foo|bar)baz/: + + 1: BRANCH(4) + 2: EXACT (8) + 4: BRANCH(7) + 5: EXACT (8) + 7: TAIL(8) + 8: EXACT (10) + 10: END(0) + +which would be optimizable with startbranch=1, first=1, last=7, tail=8 +and would end up looking like: + + 1: TRIE(8) + [Words:2 Chars Stored:6 Unique Chars:5 States:7 NCP:1] + + + 7: TAIL(8) + 8: EXACT (10) + 10: END(0) + + d = uvchr_to_utf8_flags(d, uv, 0); + +is the recommended Unicode-aware way of saying + + *(d++) = uv; +*/ + +#define TRIE_STORE_REVCHAR(val) \ + STMT_START { \ + if (UTF) { \ + SV *zlopp = newSV(UTF8_MAXBYTES); \ + unsigned char *flrbbbbb = (unsigned char *) SvPVX(zlopp); \ + unsigned char *const kapow = uvchr_to_utf8(flrbbbbb, val); \ + *kapow = '\0'; \ + SvCUR_set(zlopp, kapow - flrbbbbb); \ + SvPOK_on(zlopp); \ + SvUTF8_on(zlopp); \ + av_push_simple(revcharmap, zlopp); \ + } else { \ + char ooooff = (char)val; \ + av_push_simple(revcharmap, newSVpvn(&ooooff, 1)); \ + } \ + } STMT_END + +/* This gets the next character from the input, folding it if not already + * folded. */ +#define TRIE_READ_CHAR STMT_START { \ + wordlen++; \ + if ( UTF ) { \ + /* if it is UTF then it is either already folded, or does not need \ + * folding */ \ + uvc = valid_utf8_to_uvchr( (const U8*) uc, &len); \ + } \ + else if (folder == PL_fold_latin1) { \ + /* This folder implies Unicode rules, which in the range expressible \ + * by not UTF is the lower case, with the two exceptions, one of \ + * which should have been taken care of before calling this */ \ + assert(*uc != LATIN_SMALL_LETTER_SHARP_S); \ + uvc = toLOWER_L1(*uc); \ + if (UNLIKELY(uvc == MICRO_SIGN)) uvc = GREEK_SMALL_LETTER_MU; \ + len = 1; \ + } else { \ + /* raw data, will be folded later if needed */ \ + uvc = (U32)*uc; \ + len = 1; \ + } \ +} STMT_END + + + +#define TRIE_LIST_PUSH(state,fid,ns) STMT_START { \ + if ( TRIE_LIST_CUR( state ) >=TRIE_LIST_LEN( state ) ) { \ + U32 ging = TRIE_LIST_LEN( state ) * 2; \ + Renew( trie->states[ state ].trans.list, ging, reg_trie_trans_le ); \ + TRIE_LIST_LEN( state ) = ging; \ + } \ + TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).forid = fid; \ + TRIE_LIST_ITEM( state, TRIE_LIST_CUR( state ) ).newstate = ns; \ + TRIE_LIST_CUR( state )++; \ +} STMT_END + +#define TRIE_LIST_NEW(state) STMT_START { \ + Newx( trie->states[ state ].trans.list, \ + 4, reg_trie_trans_le ); \ + TRIE_LIST_CUR( state ) = 1; \ + TRIE_LIST_LEN( state ) = 4; \ +} STMT_END + +#define TRIE_HANDLE_WORD(state) STMT_START { \ + U16 dupe= trie->states[ state ].wordnum; \ + regnode * const noper_next = regnext( noper ); \ + \ + DEBUG_r({ \ + /* store the word for dumping */ \ + SV* tmp; \ + if (OP(noper) != NOTHING) \ + tmp = newSVpvn_utf8(STRING(noper), STR_LEN(noper), UTF); \ + else \ + tmp = newSVpvn_utf8( "", 0, UTF ); \ + av_push_simple( trie_words, tmp ); \ + }); \ + \ + curword++; \ + trie->wordinfo[curword].prev = 0; \ + trie->wordinfo[curword].len = wordlen; \ + trie->wordinfo[curword].accept = state; \ + \ + if ( noper_next < tail ) { \ + if (!trie->jump) { \ + trie->jump = (U16 *) PerlMemShared_calloc( word_count + 1, \ + sizeof(U16) ); \ + trie->j_before_paren = (U16 *) PerlMemShared_calloc( word_count + 1, \ + sizeof(U16) ); \ + trie->j_after_paren = (U16 *) PerlMemShared_calloc( word_count + 1, \ + sizeof(U16) ); \ + } \ + trie->jump[curword] = (U16)(noper_next - convert); \ + U16 set_before_paren; \ + U16 set_after_paren; \ + if (OP(cur) == BRANCH) { \ + set_before_paren = ARG1a(cur); \ + set_after_paren = ARG1b(cur); \ + } else { \ + set_before_paren = ARG2a(cur); \ + set_after_paren = ARG2b(cur); \ + } \ + trie->j_before_paren[curword] = set_before_paren; \ + trie->j_after_paren[curword] = set_after_paren; \ + if (!jumper) \ + jumper = noper_next; \ + if (!nextbranch) \ + nextbranch= regnext(cur); \ + } \ + \ + if ( dupe ) { \ + /* It's a dupe. Pre-insert into the wordinfo[].prev */\ + /* chain, so that when the bits of chain are later */\ + /* linked together, the dups appear in the chain */\ + trie->wordinfo[curword].prev = trie->wordinfo[dupe].prev; \ + trie->wordinfo[dupe].prev = curword; \ + } else { \ + /* we haven't inserted this word yet. */ \ + trie->states[ state ].wordnum = curword; \ + } \ +} STMT_END + + +#define TRIE_TRANS_STATE(state,base,ucharcount,charid,special) \ + ( ( base + charid >= ucharcount \ + && base + charid < ubound \ + && state == trie->trans[ base - ucharcount + charid ].check \ + && trie->trans[ base - ucharcount + charid ].next ) \ + ? trie->trans[ base - ucharcount + charid ].next \ + : ( state==1 ? special : 0 ) \ + ) + +#define TRIE_BITMAP_SET_FOLDED(trie, uvc, folder) \ +STMT_START { \ + TRIE_BITMAP_SET(trie, uvc); \ + /* store the folded codepoint */ \ + if ( folder ) \ + TRIE_BITMAP_SET(trie, folder[(U8) uvc ]); \ + \ + if ( !UTF ) { \ + /* store first byte of utf8 representation of */ \ + /* variant codepoints */ \ + if (! UVCHR_IS_INVARIANT(uvc)) { \ + TRIE_BITMAP_SET(trie, UTF8_TWO_BYTE_HI(uvc)); \ + } \ + } \ +} STMT_END + +I32 +Perl_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch, + regnode *first, regnode *last, regnode *tail, + U32 word_count, U32 flags, U32 depth) +{ + /* first pass, loop through and scan words */ + reg_trie_data *trie; + HV *widecharmap = NULL; + AV *revcharmap = newAV(); + regnode *cur; + STRLEN len = 0; + UV uvc = 0; + U16 curword = 0; + U32 next_alloc = 0; + regnode *jumper = NULL; + regnode *nextbranch = NULL; + regnode *lastbranch = NULL; + regnode *convert = NULL; + U32 *prev_states; /* temp array mapping each state to previous one */ + /* we just use folder as a flag in utf8 */ + const U8 * folder = NULL; + + /* in the below reg_add_data call we are storing either 'tu' or 'tuaa' + * which stands for one trie structure, one hash, optionally followed + * by two arrays */ +#ifdef DEBUGGING + const U32 data_slot = reg_add_data( pRExC_state, STR_WITH_LEN("tuaa")); + AV *trie_words = NULL; + /* along with revcharmap, this only used during construction but both are + * useful during debugging so we store them in the struct when debugging. + */ +#else + const U32 data_slot = reg_add_data( pRExC_state, STR_WITH_LEN("tu")); + STRLEN trie_charcount=0; +#endif + SV *re_trie_maxbuff; + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + PERL_ARGS_ASSERT_MAKE_TRIE; +#ifndef DEBUGGING + PERL_UNUSED_ARG(depth); +#endif + + switch (flags) { + case EXACT: case EXACT_REQ8: case EXACTL: break; + case EXACTFAA: + case EXACTFUP: + case EXACTFU: + case EXACTFLU8: folder = PL_fold_latin1; break; + case EXACTF: folder = PL_fold; break; + default: Perl_croak( aTHX_ "panic! In trie construction, unknown node type %u %s", (unsigned) flags, REGNODE_NAME(flags) ); + } + + /* create the trie struct, all zeroed */ + trie = (reg_trie_data *) PerlMemShared_calloc( 1, sizeof(reg_trie_data) ); + trie->refcount = 1; + trie->startstate = 1; + trie->wordcount = word_count; + RExC_rxi->data->data[ data_slot ] = (void*)trie; + trie->charmap = (U16 *) PerlMemShared_calloc( 256, sizeof(U16) ); + if (flags == EXACT || flags == EXACT_REQ8 || flags == EXACTL) + trie->bitmap = (char *) PerlMemShared_calloc( ANYOF_BITMAP_SIZE, 1 ); + trie->wordinfo = (reg_trie_wordinfo *) PerlMemShared_calloc( + trie->wordcount+1, sizeof(reg_trie_wordinfo)); + + DEBUG_r({ + trie_words = newAV(); + }); + + re_trie_maxbuff = get_sv(RE_TRIE_MAXBUF_NAME, GV_ADD); + assert(re_trie_maxbuff); + if (!SvIOK(re_trie_maxbuff)) { + sv_setiv(re_trie_maxbuff, RE_TRIE_MAXBUF_INIT); + } + DEBUG_TRIE_COMPILE_r({ + Perl_re_indentf( aTHX_ + "make_trie start==%d, first==%d, last==%d, tail==%d depth=%d\n", + depth+1, + REG_NODE_NUM(startbranch), REG_NODE_NUM(first), + REG_NODE_NUM(last), REG_NODE_NUM(tail), (int)depth); + }); + + /* Find the node we are going to overwrite */ + if ( first == startbranch && OP( last ) != BRANCH ) { + /* whole branch chain */ + convert = first; + } else { + /* branch sub-chain */ + convert = REGNODE_AFTER( first ); + } + + /* -- First loop and Setup -- + + We first traverse the branches and scan each word to determine if it + contains widechars, and how many unique chars there are, this is + important as we have to build a table with at least as many columns as we + have unique chars. + + We use an array of integers to represent the character codes 0..255 + (trie->charmap) and we use a an HV* to store Unicode characters. We use + the native representation of the character value as the key and IV's for + the coded index. + + *TODO* If we keep track of how many times each character is used we can + remap the columns so that the table compression later on is more + efficient in terms of memory by ensuring the most common value is in the + middle and the least common are on the outside. IMO this would be better + than a most to least common mapping as theres a decent chance the most + common letter will share a node with the least common, meaning the node + will not be compressible. With a middle is most common approach the worst + case is when we have the least common nodes twice. + + */ + + for ( cur = first ; cur < last ; cur = regnext( cur ) ) { + regnode *noper = REGNODE_AFTER( cur ); + const U8 *uc; + const U8 *e; + int foldlen = 0; + U32 wordlen = 0; /* required init */ + STRLEN minchars = 0; + STRLEN maxchars = 0; + bool set_bit = trie->bitmap ? 1 : 0; /*store the first char in the + bitmap?*/ + lastbranch = cur; + + if (OP(noper) == NOTHING) { + /* skip past a NOTHING at the start of an alternation + * eg, /(?:)a|(?:b)/ should be the same as /a|b/ + * + * If the next node is not something we are supposed to process + * we will just ignore it due to the condition guarding the + * next block. + */ + + regnode *noper_next= regnext(noper); + if (noper_next < tail) + noper= noper_next; + } + + if ( noper < tail + && ( OP(noper) == flags + || (flags == EXACT && OP(noper) == EXACT_REQ8) + || (flags == EXACTFU && ( OP(noper) == EXACTFU_REQ8 + || OP(noper) == EXACTFUP)))) + { + uc= (U8*)STRING(noper); + e= uc + STR_LEN(noper); + } else { + trie->minlen= 0; + continue; + } + + + if ( set_bit ) { /* bitmap only alloced when !(UTF&&Folding) */ + TRIE_BITMAP_SET(trie,*uc); /* store the raw first byte + regardless of encoding */ + if (OP( noper ) == EXACTFUP) { + /* false positives are ok, so just set this */ + TRIE_BITMAP_SET(trie, LATIN_SMALL_LETTER_SHARP_S); + } + } + + for ( ; uc < e ; uc += len ) { /* Look at each char in the current + branch */ + TRIE_CHARCOUNT(trie)++; + TRIE_READ_CHAR; + + /* TRIE_READ_CHAR returns the current character, or its fold if /i + * is in effect. Under /i, this character can match itself, or + * anything that folds to it. If not under /i, it can match just + * itself. Most folds are 1-1, for example k, K, and KELVIN SIGN + * all fold to k, and all are single characters. But some folds + * expand to more than one character, so for example LATIN SMALL + * LIGATURE FFI folds to the three character sequence 'ffi'. If + * the string beginning at 'uc' is 'ffi', it could be matched by + * three characters, or just by the one ligature character. (It + * could also be matched by two characters: LATIN SMALL LIGATURE FF + * followed by 'i', or by 'f' followed by LATIN SMALL LIGATURE FI). + * (Of course 'I' and/or 'F' instead of 'i' and 'f' can also + * match.) The trie needs to know the minimum and maximum number + * of characters that could match so that it can use size alone to + * quickly reject many match attempts. The max is simple: it is + * the number of folded characters in this branch (since a fold is + * never shorter than what folds to it. */ + + maxchars++; + + /* And the min is equal to the max if not under /i (indicated by + * 'folder' being NULL), or there are no multi-character folds. If + * there is a multi-character fold, the min is incremented just + * once, for the character that folds to the sequence. Each + * character in the sequence needs to be added to the list below of + * characters in the trie, but we count only the first towards the + * min number of characters needed. This is done through the + * variable 'foldlen', which is returned by the macros that look + * for these sequences as the number of bytes the sequence + * occupies. Each time through the loop, we decrement 'foldlen' by + * how many bytes the current char occupies. Only when it reaches + * 0 do we increment 'minchars' or look for another multi-character + * sequence. */ + if (folder == NULL) { + minchars++; + } + else if (foldlen > 0) { + foldlen -= (UTF) ? UTF8SKIP(uc) : 1; + } + else { + minchars++; + + /* See if *uc is the beginning of a multi-character fold. If + * so, we decrement the length remaining to look at, to account + * for the current character this iteration. (We can use 'uc' + * instead of the fold returned by TRIE_READ_CHAR because the + * macro is smart enough to account for any unfolded + * characters. */ + if (UTF) { + if ((foldlen = is_MULTI_CHAR_FOLD_utf8_safe(uc, e))) { + foldlen -= UTF8SKIP(uc); + } + } + else if ((foldlen = is_MULTI_CHAR_FOLD_latin1_safe(uc, e))) { + foldlen--; + } + } + + /* The current character (and any potential folds) should be added + * to the possible matching characters for this position in this + * branch */ + if ( uvc < 256 ) { + if ( folder ) { + U8 folded= folder[ (U8) uvc ]; + if ( !trie->charmap[ folded ] ) { + trie->charmap[ folded ]=( ++trie->uniquecharcount ); + TRIE_STORE_REVCHAR( folded ); + } + } + if ( !trie->charmap[ uvc ] ) { + trie->charmap[ uvc ]=( ++trie->uniquecharcount ); + TRIE_STORE_REVCHAR( uvc ); + } + if ( set_bit ) { + /* store the codepoint in the bitmap, and its folded + * equivalent. */ + TRIE_BITMAP_SET_FOLDED(trie, uvc, folder); + set_bit = 0; /* We've done our bit :-) */ + } + } else { + + /* XXX We could come up with the list of code points that fold + * to this using PL_utf8_foldclosures, except not for + * multi-char folds, as there may be multiple combinations + * there that could work, which needs to wait until runtime to + * resolve (The comment about LIGATURE FFI above is such an + * example */ + + SV** svpp; + if ( !widecharmap ) + widecharmap = newHV(); + + svpp = hv_fetch( widecharmap, (char*)&uvc, sizeof( UV ), 1 ); + + if ( !svpp ) + Perl_croak( aTHX_ "error creating/fetching widecharmap entry for 0x%" UVXf, uvc ); + + if ( !SvTRUE( *svpp ) ) { + sv_setiv( *svpp, ++trie->uniquecharcount ); + TRIE_STORE_REVCHAR(uvc); + } + } + } /* end loop through characters in this branch of the trie */ + + /* We take the min and max for this branch and combine to find the min + * and max for all branches processed so far */ + if( cur == first ) { + trie->minlen = minchars; + trie->maxlen = maxchars; + } else if (minchars < trie->minlen) { + trie->minlen = minchars; + } else if (maxchars > trie->maxlen) { + trie->maxlen = maxchars; + } + } /* end first pass */ + trie->before_paren = OP(first) == BRANCH + ? ARG1a(first) + : ARG2a(first); /* BRANCHJ */ + + trie->after_paren = OP(lastbranch) == BRANCH + ? ARG1b(lastbranch) + : ARG2b(lastbranch); /* BRANCHJ */ + DEBUG_TRIE_COMPILE_r( + Perl_re_indentf( aTHX_ + "TRIE(%s): W:%d C:%d Uq:%d Min:%d Max:%d\n", + depth+1, + ( widecharmap ? "UTF8" : "NATIVE" ), (int)word_count, + (int)TRIE_CHARCOUNT(trie), trie->uniquecharcount, + (int)trie->minlen, (int)trie->maxlen ) + ); + + /* + We now know what we are dealing with in terms of unique chars and + string sizes so we can calculate how much memory a naive + representation using a flat table will take. If it's over a reasonable + limit (as specified by ${^RE_TRIE_MAXBUF}) we use a more memory + conservative but potentially much slower representation using an array + of lists. + + At the end we convert both representations into the same compressed + form that will be used in regexec.c for matching with. The latter + is a form that cannot be used to construct with but has memory + properties similar to the list form and access properties similar + to the table form making it both suitable for fast searches and + small enough that its feasable to store for the duration of a program. + + See the comment in the code where the compressed table is produced + inplace from the flat tabe representation for an explanation of how + the compression works. + + */ + + + Newx(prev_states, TRIE_CHARCOUNT(trie) + 2, U32); + prev_states[1] = 0; + + if ( (IV)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount + 1) + > SvIV(re_trie_maxbuff) ) + { + /* + Second Pass -- Array Of Lists Representation + + Each state will be represented by a list of charid:state records + (reg_trie_trans_le) the first such element holds the CUR and LEN + points of the allocated array. (See defines above). + + We build the initial structure using the lists, and then convert + it into the compressed table form which allows faster lookups + (but cant be modified once converted). + */ + + STRLEN transcount = 1; + + DEBUG_TRIE_COMPILE_MORE_r( Perl_re_indentf( aTHX_ "Compiling trie using list compiler\n", + depth+1)); + + trie->states = (reg_trie_state *) + PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2, + sizeof(reg_trie_state) ); + TRIE_LIST_NEW(1); + next_alloc = 2; + + for ( cur = first ; cur < last ; cur = regnext( cur ) ) { + + regnode *noper = REGNODE_AFTER( cur ); + U32 state = 1; /* required init */ + U16 charid = 0; /* sanity init */ + U32 wordlen = 0; /* required init */ + + if (OP(noper) == NOTHING) { + regnode *noper_next= regnext(noper); + if (noper_next < tail) + noper= noper_next; + /* we will undo this assignment if noper does not + * point at a trieable type in the else clause of + * the following statement. */ + } + + if ( noper < tail + && ( OP(noper) == flags + || (flags == EXACT && OP(noper) == EXACT_REQ8) + || (flags == EXACTFU && ( OP(noper) == EXACTFU_REQ8 + || OP(noper) == EXACTFUP)))) + { + const U8 *uc= (U8*)STRING(noper); + const U8 *e= uc + STR_LEN(noper); + + for ( ; uc < e ; uc += len ) { + + TRIE_READ_CHAR; + + if ( uvc < 256 ) { + charid = trie->charmap[ uvc ]; + } else { + SV** const svpp = hv_fetch( widecharmap, + (char*)&uvc, + sizeof( UV ), + 0); + if ( !svpp ) { + charid = 0; + } else { + charid=(U16)SvIV( *svpp ); + } + } + /* charid is now 0 if we dont know the char read, or + * nonzero if we do */ + if ( charid ) { + + U16 check; + U32 newstate = 0; + + charid--; + if ( !trie->states[ state ].trans.list ) { + TRIE_LIST_NEW( state ); + } + for ( check = 1; + check <= TRIE_LIST_USED( state ); + check++ ) + { + if ( TRIE_LIST_ITEM( state, check ).forid + == charid ) + { + newstate = TRIE_LIST_ITEM( state, check ).newstate; + break; + } + } + if ( ! newstate ) { + newstate = next_alloc++; + prev_states[newstate] = state; + TRIE_LIST_PUSH( state, charid, newstate ); + transcount++; + } + state = newstate; + } else { + Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %" IVdf, uvc ); + } + } + } else { + /* If we end up here it is because we skipped past a NOTHING, but did not end up + * on a trieable type. So we need to reset noper back to point at the first regop + * in the branch before we call TRIE_HANDLE_WORD() + */ + noper= REGNODE_AFTER(cur); + } + TRIE_HANDLE_WORD(state); + + } /* end second pass */ + + /* next alloc is the NEXT state to be allocated */ + trie->statecount = next_alloc; + trie->states = (reg_trie_state *) + PerlMemShared_realloc( trie->states, + next_alloc + * sizeof(reg_trie_state) ); + + /* and now dump it out before we compress it */ + DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_list(trie, widecharmap, + revcharmap, next_alloc, + depth+1) + ); + + trie->trans = (reg_trie_trans *) + PerlMemShared_calloc( transcount, sizeof(reg_trie_trans) ); + { + U32 state; + U32 tp = 0; + U32 zp = 0; + + + for( state=1 ; state < next_alloc ; state ++ ) { + U32 base=0; + + /* + DEBUG_TRIE_COMPILE_MORE_r( + Perl_re_printf( aTHX_ "tp: %d zp: %d ",tp,zp) + ); + */ + + if (trie->states[state].trans.list) { + U16 minid=TRIE_LIST_ITEM( state, 1).forid; + U16 maxid=minid; + U16 idx; + + for( idx = 2 ; idx <= TRIE_LIST_USED( state ) ; idx++ ) { + const U16 forid = TRIE_LIST_ITEM( state, idx).forid; + if ( forid < minid ) { + minid=forid; + } else if ( forid > maxid ) { + maxid=forid; + } + } + if ( transcount < tp + maxid - minid + 1) { + transcount *= 2; + trie->trans = (reg_trie_trans *) + PerlMemShared_realloc( trie->trans, + transcount + * sizeof(reg_trie_trans) ); + Zero( trie->trans + (transcount / 2), + transcount / 2, + reg_trie_trans ); + } + base = trie->uniquecharcount + tp - minid; + if ( maxid == minid ) { + U32 set = 0; + for ( ; zp < tp ; zp++ ) { + if ( ! trie->trans[ zp ].next ) { + base = trie->uniquecharcount + zp - minid; + trie->trans[ zp ].next = TRIE_LIST_ITEM( state, + 1).newstate; + trie->trans[ zp ].check = state; + set = 1; + break; + } + } + if ( !set ) { + trie->trans[ tp ].next = TRIE_LIST_ITEM( state, + 1).newstate; + trie->trans[ tp ].check = state; + tp++; + zp = tp; + } + } else { + for ( idx=1; idx <= TRIE_LIST_USED( state ) ; idx++ ) { + const U32 tid = base + - trie->uniquecharcount + + TRIE_LIST_ITEM( state, idx ).forid; + trie->trans[ tid ].next = TRIE_LIST_ITEM( state, + idx ).newstate; + trie->trans[ tid ].check = state; + } + tp += ( maxid - minid + 1 ); + } + Safefree(trie->states[ state ].trans.list); + } + /* + DEBUG_TRIE_COMPILE_MORE_r( + Perl_re_printf( aTHX_ " base: %d\n",base); + ); + */ + trie->states[ state ].trans.base=base; + } + trie->lasttrans = tp + 1; + } + } else { + /* + Second Pass -- Flat Table Representation. + + we dont use the 0 slot of either trans[] or states[] so we add 1 to + each. We know that we will need Charcount+1 trans at most to store + the data (one row per char at worst case) So we preallocate both + structures assuming worst case. + + We then construct the trie using only the .next slots of the entry + structs. + + We use the .check field of the first entry of the node temporarily + to make compression both faster and easier by keeping track of how + many non zero fields are in the node. + + Since trans are numbered from 1 any 0 pointer in the table is a FAIL + transition. + + There are two terms at use here: state as a TRIE_NODEIDX() which is + a number representing the first entry of the node, and state as a + TRIE_NODENUM() which is the trans number. state 1 is TRIE_NODEIDX(1) + and TRIE_NODENUM(1), state 2 is TRIE_NODEIDX(2) and TRIE_NODENUM(3) + if there are 2 entrys per node. eg: + + A B A B + 1. 2 4 1. 3 7 + 2. 0 3 3. 0 5 + 3. 0 0 5. 0 0 + 4. 0 0 7. 0 0 + + The table is internally in the right hand, idx form. However as we + also have to deal with the states array which is indexed by nodenum + we have to use TRIE_NODENUM() to convert. + + */ + DEBUG_TRIE_COMPILE_MORE_r( Perl_re_indentf( aTHX_ "Compiling trie using table compiler\n", + depth+1)); + + trie->trans = (reg_trie_trans *) + PerlMemShared_calloc( ( TRIE_CHARCOUNT(trie) + 1 ) + * trie->uniquecharcount + 1, + sizeof(reg_trie_trans) ); + trie->states = (reg_trie_state *) + PerlMemShared_calloc( TRIE_CHARCOUNT(trie) + 2, + sizeof(reg_trie_state) ); + next_alloc = trie->uniquecharcount + 1; + + + for ( cur = first ; cur < last ; cur = regnext( cur ) ) { + + regnode *noper = REGNODE_AFTER( cur ); + + U32 state = 1; /* required init */ + + U16 charid = 0; /* sanity init */ + U32 accept_state = 0; /* sanity init */ + + U32 wordlen = 0; /* required init */ + + if (OP(noper) == NOTHING) { + regnode *noper_next= regnext(noper); + if (noper_next < tail) + noper= noper_next; + /* we will undo this assignment if noper does not + * point at a trieable type in the else clause of + * the following statement. */ + } + + if ( noper < tail + && ( OP(noper) == flags + || (flags == EXACT && OP(noper) == EXACT_REQ8) + || (flags == EXACTFU && ( OP(noper) == EXACTFU_REQ8 + || OP(noper) == EXACTFUP)))) + { + const U8 *uc= (U8*)STRING(noper); + const U8 *e= uc + STR_LEN(noper); + + for ( ; uc < e ; uc += len ) { + + TRIE_READ_CHAR; + + if ( uvc < 256 ) { + charid = trie->charmap[ uvc ]; + } else { + SV* const * const svpp = hv_fetch( widecharmap, + (char*)&uvc, + sizeof( UV ), + 0); + charid = svpp ? (U16)SvIV(*svpp) : 0; + } + if ( charid ) { + charid--; + if ( !trie->trans[ state + charid ].next ) { + trie->trans[ state + charid ].next = next_alloc; + trie->trans[ state ].check++; + prev_states[TRIE_NODENUM(next_alloc)] + = TRIE_NODENUM(state); + next_alloc += trie->uniquecharcount; + } + state = trie->trans[ state + charid ].next; + } else { + Perl_croak( aTHX_ "panic! In trie construction, no char mapping for %" IVdf, uvc ); + } + /* charid is now 0 if we dont know the char read, or + * nonzero if we do */ + } + } else { + /* If we end up here it is because we skipped past a NOTHING, but did not end up + * on a trieable type. So we need to reset noper back to point at the first regop + * in the branch before we call TRIE_HANDLE_WORD(). + */ + noper= REGNODE_AFTER(cur); + } + accept_state = TRIE_NODENUM( state ); + TRIE_HANDLE_WORD(accept_state); + + } /* end second pass */ + + /* and now dump it out before we compress it */ + DEBUG_TRIE_COMPILE_MORE_r(dump_trie_interim_table(trie, widecharmap, + revcharmap, + next_alloc, depth+1)); + + { + /* + * Inplace compress the table.* + + For sparse data sets the table constructed by the trie algorithm will + be mostly 0/FAIL transitions or to put it another way mostly empty. + (Note that leaf nodes will not contain any transitions.) + + This algorithm compresses the tables by eliminating most such + transitions, at the cost of a modest bit of extra work during lookup: + + - Each states[] entry contains a .base field which indicates the + index in the state[] array wheres its transition data is stored. + + - If .base is 0 there are no valid transitions from that node. + + - If .base is nonzero then charid is added to it to find an entry in + the trans array. + + -If trans[states[state].base+charid].check!=state then the + transition is taken to be a 0/Fail transition. Thus if there are fail + transitions at the front of the node then the .base offset will point + somewhere inside the previous nodes data (or maybe even into a node + even earlier), but the .check field determines if the transition is + valid. + + XXX - wrong maybe? + The following process inplace converts the table to the compressed + table: We first do not compress the root node 1,and mark all its + .check pointers as 1 and set its .base pointer as 1 as well. This + allows us to do a DFA construction from the compressed table later, + and ensures that any .base pointers we calculate later are greater + than 0. + + - We set 'pos' to indicate the first entry of the second node. + + - We then iterate over the columns of the node, finding the first and + last used entry at l and m. We then copy l..m into pos..(pos+m-l), + and set the .check pointers accordingly, and advance pos + appropriately and repreat for the next node. Note that when we copy + the next pointers we have to convert them from the original + NODEIDX form to NODENUM form as the former is not valid post + compression. + + - If a node has no transitions used we mark its base as 0 and do not + advance the pos pointer. + + - If a node only has one transition we use a second pointer into the + structure to fill in allocated fail transitions from other states. + This pointer is independent of the main pointer and scans forward + looking for null transitions that are allocated to a state. When it + finds one it writes the single transition into the "hole". If the + pointer doesnt find one the single transition is appended as normal. + + - Once compressed we can Renew/realloc the structures to release the + excess space. + + See "Table-Compression Methods" in sec 3.9 of the Red Dragon, + specifically Fig 3.47 and the associated pseudocode. + + demq + */ + const U32 laststate = TRIE_NODENUM( next_alloc ); + U32 state, charid; + U32 pos = 0, zp=0; + trie->statecount = laststate; + + for ( state = 1 ; state < laststate ; state++ ) { + U8 flag = 0; + const U32 stateidx = TRIE_NODEIDX( state ); + const U32 o_used = trie->trans[ stateidx ].check; + U32 used = trie->trans[ stateidx ].check; + trie->trans[ stateidx ].check = 0; + + for ( charid = 0; + used && charid < trie->uniquecharcount; + charid++ ) + { + if ( flag || trie->trans[ stateidx + charid ].next ) { + if ( trie->trans[ stateidx + charid ].next ) { + if (o_used == 1) { + for ( ; zp < pos ; zp++ ) { + if ( ! trie->trans[ zp ].next ) { + break; + } + } + trie->states[ state ].trans.base + = zp + + trie->uniquecharcount + - charid ; + trie->trans[ zp ].next + = SAFE_TRIE_NODENUM( trie->trans[ stateidx + + charid ].next ); + trie->trans[ zp ].check = state; + if ( ++zp > pos ) pos = zp; + break; + } + used--; + } + if ( !flag ) { + flag = 1; + trie->states[ state ].trans.base + = pos + trie->uniquecharcount - charid ; + } + trie->trans[ pos ].next + = SAFE_TRIE_NODENUM( + trie->trans[ stateidx + charid ].next ); + trie->trans[ pos ].check = state; + pos++; + } + } + } + trie->lasttrans = pos + 1; + trie->states = (reg_trie_state *) + PerlMemShared_realloc( trie->states, laststate + * sizeof(reg_trie_state) ); + DEBUG_TRIE_COMPILE_MORE_r( + Perl_re_indentf( aTHX_ "Alloc: %d Orig: %" IVdf " elements, Final:%" IVdf ". Savings of %%%5.2f\n", + depth+1, + (int)( ( TRIE_CHARCOUNT(trie) + 1 ) * trie->uniquecharcount + + 1 ), + (IV)next_alloc, + (IV)pos, + ( ( next_alloc - pos ) * 100 ) / (double)next_alloc ); + ); + + } /* end table compress */ + } + DEBUG_TRIE_COMPILE_MORE_r( + Perl_re_indentf( aTHX_ "Statecount:%" UVxf " Lasttrans:%" UVxf "\n", + depth+1, + (UV)trie->statecount, + (UV)trie->lasttrans) + ); + /* resize the trans array to remove unused space */ + trie->trans = (reg_trie_trans *) + PerlMemShared_realloc( trie->trans, trie->lasttrans + * sizeof(reg_trie_trans) ); + + { /* Modify the program and insert the new TRIE node */ + U8 nodetype =(U8) flags; + char *str=NULL; + +#ifdef DEBUGGING + regnode *optimize = NULL; +#endif /* DEBUGGING */ + /* make sure we have enough room to inject the TRIE op */ + assert((!trie->jump) || !trie->jump[1] || + (trie->jump[1] >= (sizeof(tregnode_TRIE)/sizeof(struct regnode)))); + /* + This means we convert either the first branch or the first Exact, + depending on whether the thing following (in 'last') is a branch + or not and whther first is the startbranch (ie is it a sub part of + the alternation or is it the whole thing.) + Assuming its a sub part we convert the EXACT otherwise we convert + the whole branch sequence, including the first. + */ + /* Find the node we are going to overwrite */ + if ( first != startbranch || OP( last ) == BRANCH ) { + /* branch sub-chain */ + NEXT_OFF( first ) = (U16)(last - first); + /* whole branch chain */ + } + /* But first we check to see if there is a common prefix we can + split out as an EXACT and put in front of the TRIE node. */ + trie->startstate= 1; + if ( trie->bitmap && !widecharmap && !trie->jump ) { + /* we want to find the first state that has more than + * one transition, if that state is not the first state + * then we have a common prefix which we can remove. + */ + U32 state; + for ( state = 1 ; state < trie->statecount-1 ; state++ ) { + U32 ofs = 0; + I32 first_ofs = -1; /* keeps track of the ofs of the first + transition, -1 means none */ + U32 count = 0; + const U32 base = trie->states[ state ].trans.base; + + /* does this state terminate an alternation? */ + if ( trie->states[state].wordnum ) + count = 1; + + for ( ofs = 0 ; ofs < trie->uniquecharcount ; ofs++ ) { + if ( ( base + ofs >= trie->uniquecharcount ) && + ( base + ofs - trie->uniquecharcount < trie->lasttrans ) && + trie->trans[ base + ofs - trie->uniquecharcount ].check == state ) + { + if ( ++count > 1 ) { + /* we have more than one transition */ + SV **tmp; + U8 *ch; + /* if this is the first state there is no common prefix + * to extract, so we can exit */ + if ( state == 1 ) break; + tmp = av_fetch_simple( revcharmap, ofs, 0); + ch = (U8*)SvPV_nolen_const( *tmp ); + + /* if we are on count 2 then we need to initialize the + * bitmap, and store the previous char if there was one + * in it*/ + if ( count == 2 ) { + /* clear the bitmap */ + Zero(trie->bitmap, ANYOF_BITMAP_SIZE, char); + DEBUG_OPTIMISE_r( + Perl_re_indentf( aTHX_ "New Start State=%" UVuf " Class: [", + depth+1, + (UV)state)); + if (first_ofs >= 0) { + SV ** const tmp = av_fetch_simple( revcharmap, first_ofs, 0); + const U8 * const ch = (U8*)SvPV_nolen_const( *tmp ); + + TRIE_BITMAP_SET_FOLDED(trie,*ch, folder); + DEBUG_OPTIMISE_r( + Perl_re_printf( aTHX_ "%s", (char*)ch) + ); + } + } + /* store the current firstchar in the bitmap */ + TRIE_BITMAP_SET_FOLDED(trie,*ch, folder); + DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "%s", ch)); + } + first_ofs = ofs; + } + } + if ( count == 1 ) { + /* This state has only one transition, its transition is part + * of a common prefix - we need to concatenate the char it + * represents to what we have so far. */ + SV **tmp = av_fetch_simple( revcharmap, first_ofs, 0); + STRLEN len; + char *ch = SvPV( *tmp, len ); + DEBUG_OPTIMISE_r({ + SV *sv=sv_newmortal(); + Perl_re_indentf( aTHX_ "Prefix State: %" UVuf " Ofs:%" UVuf " Char='%s'\n", + depth+1, + (UV)state, (UV)first_ofs, + pv_pretty(sv, SvPV_nolen_const(*tmp), SvCUR(*tmp), 6, + PL_colors[0], PL_colors[1], + (SvUTF8(*tmp) ? PERL_PV_ESCAPE_UNI : 0) | + PERL_PV_ESCAPE_FIRSTCHAR + ) + ); + }); + if ( state==1 ) { + OP( convert ) = nodetype; + str=STRING(convert); + setSTR_LEN(convert, 0); + } + assert( ( STR_LEN(convert) + len ) < 256 ); + setSTR_LEN(convert, (U8)(STR_LEN(convert) + len)); + while (len--) + *str++ = *ch++; + } else { +#ifdef DEBUGGING + if (state>1) + DEBUG_OPTIMISE_r(Perl_re_printf( aTHX_ "]\n")); +#endif + break; + } + } + trie->prefixlen = (state-1); + if (str) { + regnode *n = REGNODE_AFTER(convert); + assert( n - convert <= U16_MAX ); + NEXT_OFF(convert) = n - convert; + trie->startstate = state; + trie->minlen -= (state - 1); + trie->maxlen -= (state - 1); +#ifdef DEBUGGING + /* At least the UNICOS C compiler choked on this + * being argument to DEBUG_r(), so let's just have + * it right here. */ + if ( +#ifdef PERL_EXT_RE_BUILD + 1 +#else + DEBUG_r_TEST +#endif + ) { + U32 word = trie->wordcount; + while (word--) { + SV ** const tmp = av_fetch_simple( trie_words, word, 0 ); + if (tmp) { + if ( STR_LEN(convert) <= SvCUR(*tmp) ) + sv_chop(*tmp, SvPV_nolen(*tmp) + STR_LEN(convert)); + else + sv_chop(*tmp, SvPV_nolen(*tmp) + SvCUR(*tmp)); + } + } + } +#endif + if (trie->maxlen) { + convert = n; + } else { + NEXT_OFF(convert) = (U16)(tail - convert); + DEBUG_r(optimize= n); + } + } + } + if (!jumper) + jumper = last; + if ( trie->maxlen ) { + NEXT_OFF( convert ) = (U16)(tail - convert); + ARG1u_SET( convert, data_slot ); + /* Store the offset to the first unabsorbed branch in + jump[0], which is otherwise unused by the jump logic. + We use this when dumping a trie and during optimisation. */ + if (trie->jump) + trie->jump[0] = (U16)(nextbranch - convert); + + /* If the start state is not accepting (meaning there is no empty string/NOTHING) + * and there is a bitmap + * and the first "jump target" node we found leaves enough room + * then convert the TRIE node into a TRIEC node, with the bitmap + * embedded inline in the opcode - this is hypothetically faster. + */ + if ( !trie->states[trie->startstate].wordnum + && trie->bitmap + && ( (char *)jumper - (char *)convert) >= (int)sizeof(tregnode_TRIEC) ) + { + OP( convert ) = TRIEC; + Copy(trie->bitmap, ((tregnode_TRIEC *)convert)->bitmap, ANYOF_BITMAP_SIZE, char); + PerlMemShared_free(trie->bitmap); + trie->bitmap= NULL; + } else + OP( convert ) = TRIE; + + /* store the type in the flags */ + FLAGS(convert) = nodetype; + DEBUG_r({ + optimize = convert + + NODE_STEP_REGNODE + + REGNODE_ARG_LEN( OP( convert ) ); + }); + /* XXX We really should free up the resource in trie now, + as we won't use them - (which resources?) dmq */ + } + /* needed for dumping*/ + DEBUG_r(if (optimize) { + /* + Try to clean up some of the debris left after the + optimisation. + */ + while( optimize < jumper ) { + OP( optimize ) = OPTIMIZED; + optimize++; + } + }); + } /* end node insert */ + + /* Finish populating the prev field of the wordinfo array. Walk back + * from each accept state until we find another accept state, and if + * so, point the first word's .prev field at the second word. If the + * second already has a .prev field set, stop now. This will be the + * case either if we've already processed that word's accept state, + * or that state had multiple words, and the overspill words were + * already linked up earlier. + */ + { + U16 word; + U32 state; + U16 prev; + + for (word=1; word <= trie->wordcount; word++) { + prev = 0; + if (trie->wordinfo[word].prev) + continue; + state = trie->wordinfo[word].accept; + while (state) { + state = prev_states[state]; + if (!state) + break; + prev = trie->states[state].wordnum; + if (prev) + break; + } + trie->wordinfo[word].prev = prev; + } + Safefree(prev_states); + } + + + /* and now dump out the compressed format */ + DEBUG_TRIE_COMPILE_r(dump_trie(trie, widecharmap, revcharmap, depth+1)); + + RExC_rxi->data->data[ data_slot + 1 ] = (void*)widecharmap; +#ifdef DEBUGGING + RExC_rxi->data->data[ data_slot + TRIE_WORDS_OFFSET ] = (void*)trie_words; + RExC_rxi->data->data[ data_slot + 3 ] = (void*)revcharmap; +#else + SvREFCNT_dec_NN(revcharmap); +#endif + return trie->jump + ? MADE_JUMP_TRIE + : trie->startstate>1 + ? MADE_EXACT_TRIE + : MADE_TRIE; +} + +regnode * +Perl_construct_ahocorasick_from_trie(pTHX_ RExC_state_t *pRExC_state, regnode *source, U32 depth) +{ +/* The Trie is constructed and compressed now so we can build a fail array if + * it's needed + + This is basically the Aho-Corasick algorithm. Its from exercise 3.31 and + 3.32 in the + "Red Dragon" -- Compilers, principles, techniques, and tools. Aho, Sethi, + Ullman 1985/88 + ISBN 0-201-10088-6 + + We find the fail state for each state in the trie, this state is the longest + proper suffix of the current state's 'word' that is also a proper prefix of + another word in our trie. State 1 represents the word '' and is thus the + default fail state. This allows the DFA not to have to restart after its + tried and failed a word at a given point, it simply continues as though it + had been matching the other word in the first place. + Consider + 'abcdgu'=~/abcdefg|cdgu/ + When we get to 'd' we are still matching the first word, we would encounter + 'g' which would fail, which would bring us to the state representing 'd' in + the second word where we would try 'g' and succeed, proceeding to match + 'cdgu'. + */ + /* add a fail transition */ + const U32 trie_offset = ARG1u(source); + reg_trie_data *trie=(reg_trie_data *)RExC_rxi->data->data[trie_offset]; + U32 *q; + const U32 ucharcount = trie->uniquecharcount; + const U32 numstates = trie->statecount; + const U32 ubound = trie->lasttrans + ucharcount; + U32 q_read = 0; + U32 q_write = 0; + U32 charid; + U32 base = trie->states[ 1 ].trans.base; + U32 *fail; + reg_ac_data *aho; + const U32 data_slot = reg_add_data( pRExC_state, STR_WITH_LEN("T")); + regnode *stclass; + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + PERL_ARGS_ASSERT_CONSTRUCT_AHOCORASICK_FROM_TRIE; + PERL_UNUSED_CONTEXT; +#ifndef DEBUGGING + PERL_UNUSED_ARG(depth); +#endif + + if ( OP(source) == TRIE ) { + tregnode_TRIE *op = (tregnode_TRIE *) + PerlMemShared_calloc(1, sizeof(tregnode_TRIE)); + StructCopy(source, op, tregnode_TRIE); + stclass = (regnode *)op; + } else { + tregnode_TRIEC *op = (tregnode_TRIEC *) + PerlMemShared_calloc(1, sizeof(tregnode_TRIEC)); + StructCopy(source, op, tregnode_TRIEC); + stclass = (regnode *)op; + } + OP(stclass)+=2; /* convert the TRIE type to its AHO-CORASICK equivalent */ + + ARG1u_SET( stclass, data_slot ); + aho = (reg_ac_data *) PerlMemShared_calloc( 1, sizeof(reg_ac_data) ); + RExC_rxi->data->data[ data_slot ] = (void*)aho; + aho->trie=trie_offset; + aho->states=(reg_trie_state *)PerlMemShared_malloc( numstates * sizeof(reg_trie_state) ); + Copy( trie->states, aho->states, numstates, reg_trie_state ); + Newx( q, numstates, U32); + aho->fail = (U32 *) PerlMemShared_calloc( numstates, sizeof(U32) ); + aho->refcount = 1; + fail = aho->fail; + /* initialize fail[0..1] to be 1 so that we always have + a valid final fail state */ + fail[ 0 ] = fail[ 1 ] = 1; + + for ( charid = 0; charid < ucharcount ; charid++ ) { + const U32 newstate = TRIE_TRANS_STATE( 1, base, ucharcount, charid, 0 ); + if ( newstate ) { + q[ q_write ] = newstate; + /* set to point at the root */ + fail[ q[ q_write++ ] ]=1; + } + } + while ( q_read < q_write) { + const U32 cur = q[ q_read++ % numstates ]; + base = trie->states[ cur ].trans.base; + + for ( charid = 0 ; charid < ucharcount ; charid++ ) { + const U32 ch_state = TRIE_TRANS_STATE( cur, base, ucharcount, charid, 1 ); + if (ch_state) { + U32 fail_state = cur; + U32 fail_base; + do { + fail_state = fail[ fail_state ]; + fail_base = aho->states[ fail_state ].trans.base; + } while ( !TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 ) ); + + fail_state = TRIE_TRANS_STATE( fail_state, fail_base, ucharcount, charid, 1 ); + fail[ ch_state ] = fail_state; + if ( !aho->states[ ch_state ].wordnum && aho->states[ fail_state ].wordnum ) + { + aho->states[ ch_state ].wordnum = aho->states[ fail_state ].wordnum; + } + q[ q_write++ % numstates] = ch_state; + } + } + } + /* restore fail[0..1] to 0 so that we "fall out" of the AC loop + when we fail in state 1, this allows us to use the + charclass scan to find a valid start char. This is based on the principle + that theres a good chance the string being searched contains lots of stuff + that cant be a start char. + */ + fail[ 0 ] = fail[ 1 ] = 0; + DEBUG_TRIE_COMPILE_r({ + Perl_re_indentf( aTHX_ "Stclass Failtable (%" UVuf " states): 0", + depth, (UV)numstates + ); + for( q_read=1; q_read 0) \ + (REGNODE_TYPE(OP(rn)) == CURLY && ARG1i(rn) > 0) \ ) -#define IS_EXACT(rn) (PL_regkind[OP(rn)] == EXACT) +#define IS_EXACT(rn) (REGNODE_TYPE(OP(rn)) == EXACT) -#define HAS_TEXT(rn) ( IS_EXACT(rn) || PL_regkind[OP(rn)] == REF ) +#define HAS_TEXT(rn) ( IS_EXACT(rn) || REGNODE_TYPE(OP(rn)) == REF ) /* Search for mandatory following text node; for lookahead, the text must - follow but for lookbehind (rn->flags != 0) we skip to the next step. + follow but for lookbehind (FLAGS(rn) != 0) we skip to the next step. */ #define FIND_NEXT_IMPT(rn) STMT_START { \ while (JUMPABLE(rn)) { \ const OPCODE type = OP(rn); \ - if (type == SUSPEND || PL_regkind[type] == CURLY) \ - rn = NEXTOPER(NEXTOPER(rn)); \ + if (type == SUSPEND || REGNODE_TYPE(type) == CURLY) \ + rn = REGNODE_AFTER_opcode(rn,type); \ else if (type == PLUS) \ - rn = NEXTOPER(rn); \ + rn = REGNODE_AFTER_type(rn,tregnode_PLUS); \ else if (type == IFMATCH) \ - rn = (rn->flags == 0) ? NEXTOPER(NEXTOPER(rn)) : rn + ARG(rn); \ + rn = (FLAGS(rn) == 0) ? REGNODE_AFTER_type(rn,tregnode_IFMATCH) : rn + ARG1u(rn); \ else rn += NEXT_OFF(rn); \ } \ } STMT_END @@ -218,29 +219,31 @@ static void S_setup_eval_state(pTHX_ reg static void S_cleanup_regmatch_info_aux(pTHX_ void *arg); static regmatch_state * S_push_slab(pTHX); -#define REGCP_PAREN_ELEMS 3 #define REGCP_OTHER_ELEMS 3 #define REGCP_FRAME_ELEMS 1 /* REGCP_FRAME_ELEMS are not part of the REGCP_OTHER_ELEMS and * are needed for the regexp context stack bookkeeping. */ STATIC CHECKPOINT -S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxopenparen _pDEPTH) +S_regcppush(pTHX_ const regexp *rex, I32 parenfloor, U32 maxopenparen comma_pDEPTH) { const int retval = PL_savestack_ix; - const int paren_elems_to_push = - (maxopenparen - parenfloor) * REGCP_PAREN_ELEMS; + /* Number of bytes about to be stored in the stack */ + const SSize_t paren_bytes_to_push = sizeof(*RXp_OFFSp(rex)) * (maxopenparen - parenfloor); + /* Number of savestack[] entries to be filled by the paren data */ + /* Rounding is performed in case we are few elements short */ + const int paren_elems_to_push = (paren_bytes_to_push + sizeof(*PL_savestack) - 1) / sizeof(*PL_savestack); const UV total_elems = paren_elems_to_push + REGCP_OTHER_ELEMS; const UV elems_shifted = total_elems << SAVE_TIGHT_SHIFT; - I32 p; + DECLARE_AND_GET_RE_DEBUG_FLAGS; PERL_ARGS_ASSERT_REGCPPUSH; if (paren_elems_to_push < 0) - Perl_croak(aTHX_ "panic: paren_elems_to_push, %i < 0, maxopenparen: %i parenfloor: %i REGCP_PAREN_ELEMS: %u", + Perl_croak(aTHX_ "panic: paren_elems_to_push, %i < 0, maxopenparen: %i parenfloor: %i", (int)paren_elems_to_push, (int)maxopenparen, - (int)parenfloor, (unsigned)REGCP_PAREN_ELEMS); + (int)parenfloor); if ((elems_shifted >> SAVE_TIGHT_SHIFT) != total_elems) Perl_croak(aTHX_ "panic: paren_elems_to_push offset %" UVuf @@ -249,37 +252,50 @@ S_regcppush(pTHX_ const regexp *rex, I32 (unsigned long)maxopenparen, (long)parenfloor); - SSGROW(total_elems + REGCP_FRAME_ELEMS); - DEBUG_BUFFERS_r( if ((int)maxopenparen > (int)parenfloor) Perl_re_exec_indentf( aTHX_ "rex=0x%" UVxf " offs=0x%" UVxf ": saving capture indices:\n", depth, PTR2UV(rex), - PTR2UV(rex->offs) + PTR2UV(RXp_OFFSp(rex)) ); ); - for (p = parenfloor+1; p <= (I32)maxopenparen; p++) { -/* REGCP_PARENS_ELEMS are pushed per pairs of parentheses. */ - SSPUSHIV(rex->offs[p].end); - SSPUSHIV(rex->offs[p].start); - SSPUSHINT(rex->offs[p].start_tmp); - DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_ - " \\%" UVuf ": %" IVdf "(%" IVdf ")..%" IVdf "\n", - depth, - (UV)p, - (IV)rex->offs[p].start, - (IV)rex->offs[p].start_tmp, - (IV)rex->offs[p].end - )); - } + + SSGROW(total_elems + REGCP_FRAME_ELEMS); + assert((IV)PL_savestack_max > (IV)(total_elems + REGCP_FRAME_ELEMS)); + + /* memcpy the offs inside the stack - it's faster than for loop */ + memcpy(&PL_savestack[PL_savestack_ix], RXp_OFFSp(rex) + parenfloor + 1, paren_bytes_to_push); + PL_savestack_ix += paren_elems_to_push; + + DEBUG_BUFFERS_r({ + I32 p; + for (p = parenfloor + 1; p <= (I32)maxopenparen; p++) { + Perl_re_exec_indentf(aTHX_ + " \\%" UVuf " %" IVdf " (%" IVdf ") .. %" IVdf " (regcppush)\n", + depth, + (UV)p, + (IV)RXp_OFFSp(rex)[p].start, + (IV)RXp_OFFSp(rex)[p].start_tmp, + (IV)RXp_OFFSp(rex)[p].end + ); + } + }); + /* REGCP_OTHER_ELEMS are pushed in any case, parentheses or no. */ SSPUSHINT(maxopenparen); - SSPUSHINT(rex->lastparen); - SSPUSHINT(rex->lastcloseparen); + SSPUSHINT(RXp_LASTPAREN(rex)); + SSPUSHINT(RXp_LASTCLOSEPAREN(rex)); SSPUSHUV(SAVEt_REGCONTEXT | elems_shifted); /* Magic cookie. */ + + DEBUG_BUFFERS_r({ + Perl_re_exec_indentf(aTHX_ + "finished regcppush returning %" IVdf " cur: %" IVdf "\n", + depth, retval, PL_savestack_ix); + }); + return retval; } @@ -305,41 +321,83 @@ S_regcppush(pTHX_ const regexp *rex, I32 regcpblow(cp) /* set the start and end positions of capture ix */ -#define CLOSE_CAPTURE(ix, s, e) \ - rex->offs[ix].start = s; \ - rex->offs[ix].end = e; \ - if (ix > rex->lastparen) \ - rex->lastparen = ix; \ - rex->lastcloseparen = ix; \ - DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_ \ - "CLOSE: rex=0x%" UVxf " offs=0x%" UVxf ": \\%" UVuf ": set %" IVdf "..%" IVdf " max: %" UVuf "\n", \ - depth, \ - PTR2UV(rex), \ - PTR2UV(rex->offs), \ - (UV)ix, \ - (IV)rex->offs[ix].start, \ - (IV)rex->offs[ix].end, \ - (UV)rex->lastparen \ +#define CLOSE_ANY_CAPTURE(rex, ix, s, e) \ + RXp_OFFSp(rex)[(ix)].start = (s); \ + RXp_OFFSp(rex)[(ix)].end = (e) + +#define CLOSE_CAPTURE(rex, ix, s, e) \ + CLOSE_ANY_CAPTURE(rex, ix, s, e); \ + if (ix > RXp_LASTPAREN(rex)) \ + RXp_LASTPAREN(rex) = (ix); \ + RXp_LASTCLOSEPAREN(rex) = (ix); \ + DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_ \ + "CLOSE: rex=0x%" UVxf " offs=0x%" UVxf ": \\%" UVuf ": set %" IVdf " .. %" IVdf " max: %" UVuf "\n", \ + depth, \ + PTR2UV(rex), \ + PTR2UV(RXp_OFFSp(rex)), \ + (UV)(ix), \ + (IV)RXp_OFFSp(rex)[ix].start, \ + (IV)RXp_OFFSp(rex)[ix].end, \ + (UV)RXp_LASTPAREN(rex) \ )) -#define UNWIND_PAREN(lp, lcp) \ - DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_ \ - "UNWIND_PAREN: rex=0x%" UVxf " offs=0x%" UVxf ": invalidate (%" UVuf "..%" UVuf "] set lcp: %" UVuf "\n", \ - depth, \ - PTR2UV(rex), \ - PTR2UV(rex->offs), \ - (UV)(lp), \ - (UV)(rex->lastparen), \ - (UV)(lcp) \ - )); \ - for (n = rex->lastparen; n > lp; n--) \ - rex->offs[n].end = -1; \ - rex->lastparen = n; \ - rex->lastcloseparen = lcp; +/* the lp and lcp args match the relevant members of the + * regexp structure, but in practice they should all be U16 + * instead as we have a hard limit of U16_MAX parens. See + * line 4003 or so of regcomp.c where we parse OPEN parens + * of various types. */ +PERL_STATIC_INLINE void +S_unwind_paren(pTHX_ regexp *rex, U32 lp, U32 lcp comma_pDEPTH) { + PERL_ARGS_ASSERT_UNWIND_PAREN; + U32 n; + DECLARE_AND_GET_RE_DEBUG_FLAGS; + DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_ + "UNWIND_PAREN: rex=0x%" UVxf " offs=0x%" UVxf + ": invalidate (%" UVuf " .. %" UVuf ") set lcp: %" UVuf "\n", + depth, + PTR2UV(rex), + PTR2UV(RXp_OFFSp(rex)), + (UV)(lp), + (UV)(RXp_LASTPAREN(rex)), + (UV)(lcp) + )); + for (n = RXp_LASTPAREN(rex); n > lp; n--) { + RXp_OFFSp(rex)[n].end = -1; + } + RXp_LASTPAREN(rex) = n; + RXp_LASTCLOSEPAREN(rex) = lcp; +} +#define UNWIND_PAREN(lp,lcp) unwind_paren(rex,lp,lcp) + +PERL_STATIC_INLINE void +S_capture_clear(pTHX_ regexp *rex, U16 from_ix, U16 to_ix, const char *str comma_pDEPTH) { + PERL_ARGS_ASSERT_CAPTURE_CLEAR; + PERL_UNUSED_ARG(str); /* only used for debugging */ + U16 my_ix; + DECLARE_AND_GET_RE_DEBUG_FLAGS; + for ( my_ix = from_ix; my_ix <= to_ix; my_ix++ ) { + DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_ + "CAPTURE_CLEAR %s \\%" IVdf ": " + "%" IVdf "(%" IVdf ") .. %" IVdf + " => " + "%" IVdf "(%" IVdf ") .. %" IVdf + "\n", + depth, str, (IV)my_ix, + (IV)RXp_OFFSp(rex)[my_ix].start, + (IV)RXp_OFFSp(rex)[my_ix].start_tmp, + (IV)RXp_OFFSp(rex)[my_ix].end, + (IV)-1, (IV)-1, (IV)-1)); + RXp_OFFSp(rex)[my_ix].start = -1; + RXp_OFFSp(rex)[my_ix].start_tmp = -1; + RXp_OFFSp(rex)[my_ix].end = -1; + } +} +#define CAPTURE_CLEAR(from_ix, to_ix, str) \ + if (from_ix) capture_clear(rex,from_ix, to_ix, str) STATIC void -S_regcppop(pTHX_ regexp *rex, U32 *maxopenparen_p _pDEPTH) +S_regcppop(pTHX_ regexp *rex, U32 *maxopenparen_p comma_pDEPTH) { UV i; U32 paren; @@ -347,44 +405,62 @@ S_regcppop(pTHX_ regexp *rex, U32 *maxop PERL_ARGS_ASSERT_REGCPPOP; + + DEBUG_BUFFERS_r({ + Perl_re_exec_indentf(aTHX_ + "starting regcppop at %" IVdf "\n", + depth, PL_savestack_ix); + }); + /* Pop REGCP_OTHER_ELEMS before the parentheses loop starts. */ i = SSPOPUV; assert((i & SAVE_MASK) == SAVEt_REGCONTEXT); /* Check that the magic cookie is there. */ i >>= SAVE_TIGHT_SHIFT; /* Parentheses elements to pop. */ - rex->lastcloseparen = SSPOPINT; - rex->lastparen = SSPOPINT; + RXp_LASTCLOSEPAREN(rex) = SSPOPINT; + RXp_LASTPAREN(rex) = SSPOPINT; *maxopenparen_p = SSPOPINT; i -= REGCP_OTHER_ELEMS; /* Now restore the parentheses context. */ DEBUG_BUFFERS_r( - if (i || rex->lastparen + 1 <= rex->nparens) + if (i || RXp_LASTPAREN(rex) + 1 <= rex->nparens) Perl_re_exec_indentf( aTHX_ "rex=0x%" UVxf " offs=0x%" UVxf ": restoring capture indices to:\n", depth, PTR2UV(rex), - PTR2UV(rex->offs) + PTR2UV(RXp_OFFSp(rex)) ); ); - paren = *maxopenparen_p; - for ( ; i > 0; i -= REGCP_PAREN_ELEMS) { - SSize_t tmps; - rex->offs[paren].start_tmp = SSPOPINT; - rex->offs[paren].start = SSPOPIV; - tmps = SSPOPIV; - if (paren <= rex->lastparen) - rex->offs[paren].end = tmps; - DEBUG_BUFFERS_r( Perl_re_exec_indentf( aTHX_ - " \\%" UVuf ": %" IVdf "(%" IVdf ")..%" IVdf "%s\n", - depth, - (UV)paren, - (IV)rex->offs[paren].start, - (IV)rex->offs[paren].start_tmp, - (IV)rex->offs[paren].end, - (paren > rex->lastparen ? "(skipped)" : "")); - ); - paren--; - } + /* substract remaining elements from the stack */ + PL_savestack_ix -= i; + + /* static assert that offs struc size is not less than stack elem size */ + STATIC_ASSERT_STMT(sizeof(*RXp_OFFSp(rex)) >= sizeof(*PL_savestack)); + + /* calculate actual number of offs/capture groups stored */ + /* by doing integer division (leaving potential alignment aside) */ + i = (i * sizeof(*PL_savestack)) / sizeof(*RXp_OFFSp(rex)); + + /* calculate paren starting point */ + /* i is our number of entries which we are subtracting from *maxopenparen_p */ + /* and we are storing + 1 this to get the beginning */ + paren = *maxopenparen_p - i + 1; + + /* restore them */ + memcpy(RXp_OFFSp(rex) + paren, &PL_savestack[PL_savestack_ix], i * sizeof(*RXp_OFFSp(rex))); + + DEBUG_BUFFERS_r( + for (; paren <= *maxopenparen_p; ++paren) { + Perl_re_exec_indentf(aTHX_ + " \\%" UVuf " %" IVdf "(%" IVdf ") .. %" IVdf " %s (regcppop)\n", + depth, + (UV)paren, + (IV)RXp_OFFSp(rex)[paren].start, + (IV)RXp_OFFSp(rex)[paren].start_tmp, + (IV)RXp_OFFSp(rex)[paren].end, + (paren > RXp_LASTPAREN(rex) ? "(skipped)" : "")); + } + ); #if 1 /* It would seem that the similar code in regtry() * already takes care of this, and in fact it is in @@ -395,25 +471,31 @@ S_regcppop(pTHX_ regexp *rex, U32 *maxop * this code seems to be necessary or otherwise * this erroneously leaves $1 defined: "1" =~ /^(?:(\d)x)?\d$/ * --jhi updated by dapm */ - for (i = rex->lastparen + 1; i <= rex->nparens; i++) { - if (i > *maxopenparen_p) - rex->offs[i].start = -1; - rex->offs[i].end = -1; + for (i = RXp_LASTPAREN(rex) + 1; i <= rex->nparens; i++) { + if (i > *maxopenparen_p) { + RXp_OFFSp(rex)[i].start = -1; + } + RXp_OFFSp(rex)[i].end = -1; DEBUG_BUFFERS_r( Perl_re_exec_indentf( aTHX_ - " \\%" UVuf ": %s ..-1 undeffing\n", + " \\%" UVuf ": %s ..-1 undeffing (regcppop)\n", depth, (UV)i, (i > *maxopenparen_p) ? "-1" : " " )); } #endif + DEBUG_BUFFERS_r({ + Perl_re_exec_indentf(aTHX_ + "finished regcppop at %" IVdf "\n", + depth, PL_savestack_ix); + }); } /* restore the parens and associated vars at savestack position ix, * but without popping the stack */ STATIC void -S_regcp_restore(pTHX_ regexp *rex, I32 ix, U32 *maxopenparen_p _pDEPTH) +S_regcp_restore(pTHX_ regexp *rex, I32 ix, U32 *maxopenparen_p comma_pDEPTH) { I32 tmpix = PL_savestack_ix; PERL_ARGS_ASSERT_REGCP_RESTORE; @@ -430,7 +512,7 @@ S_isFOO_lc(pTHX_ const U8 classnum, cons { /* Returns a boolean as to whether or not 'character' is a member of the * Posix character class given by 'classnum' that should be equivalent to a - * value in the typedef '_char_class_number'. + * value in the typedef 'char_class_number_'. * * Ideally this could be replaced by a just an array of function pointers * to the C library functions that implement the macros this calls. @@ -441,33 +523,40 @@ S_isFOO_lc(pTHX_ const U8 classnum, cons * optimizer strips it away). But we don't particularly care about * performance with locales anyway. */ - switch ((_char_class_number) classnum) { - case _CC_ENUM_ALPHANUMERIC: return isALPHANUMERIC_LC(character); - case _CC_ENUM_ALPHA: return isALPHA_LC(character); - case _CC_ENUM_ASCII: return isASCII_LC(character); - case _CC_ENUM_BLANK: return isBLANK_LC(character); - case _CC_ENUM_CASED: return isLOWER_LC(character) - || isUPPER_LC(character); - case _CC_ENUM_CNTRL: return isCNTRL_LC(character); - case _CC_ENUM_DIGIT: return isDIGIT_LC(character); - case _CC_ENUM_GRAPH: return isGRAPH_LC(character); - case _CC_ENUM_LOWER: return isLOWER_LC(character); - case _CC_ENUM_PRINT: return isPRINT_LC(character); - case _CC_ENUM_PUNCT: return isPUNCT_LC(character); - case _CC_ENUM_SPACE: return isSPACE_LC(character); - case _CC_ENUM_UPPER: return isUPPER_LC(character); - case _CC_ENUM_WORDCHAR: return isWORDCHAR_LC(character); - case _CC_ENUM_XDIGIT: return isXDIGIT_LC(character); + if (IN_UTF8_CTYPE_LOCALE) { + return cBOOL(generic_isCC_(character, classnum)); + } + + switch ((char_class_number_) classnum) { + case CC_ENUM_ALPHANUMERIC_: return isU8_ALPHANUMERIC_LC(character); + case CC_ENUM_ALPHA_: return isU8_ALPHA_LC(character); + case CC_ENUM_ASCII_: return isU8_ASCII_LC(character); + case CC_ENUM_BLANK_: return isU8_BLANK_LC(character); + case CC_ENUM_CASED_: return isU8_CASED_LC(character); + case CC_ENUM_CNTRL_: return isU8_CNTRL_LC(character); + case CC_ENUM_DIGIT_: return isU8_DIGIT_LC(character); + case CC_ENUM_GRAPH_: return isU8_GRAPH_LC(character); + case CC_ENUM_LOWER_: return isU8_LOWER_LC(character); + case CC_ENUM_PRINT_: return isU8_PRINT_LC(character); + case CC_ENUM_PUNCT_: return isU8_PUNCT_LC(character); + case CC_ENUM_SPACE_: return isU8_SPACE_LC(character); + case CC_ENUM_UPPER_: return isU8_UPPER_LC(character); + case CC_ENUM_WORDCHAR_: return isU8_WORDCHAR_LC(character); + case CC_ENUM_XDIGIT_: return isU8_XDIGIT_LC(character); default: /* VERTSPACE should never occur in locales */ - Perl_croak(aTHX_ "panic: isFOO_lc() has an unexpected character class '%d'", classnum); + break; } + Perl_croak(aTHX_ + "panic: isFOO_lc() has an unexpected character class '%d'", + classnum); + NOT_REACHED; /* NOTREACHED */ return FALSE; } PERL_STATIC_INLINE I32 -S_foldEQ_latin1_s2_folded(const char *s1, const char *s2, I32 len) +S_foldEQ_latin1_s2_folded(pTHX_ const char *s1, const char *s2, I32 len) { /* Compare non-UTF-8 using Unicode (Latin1) semantics. s2 must already be * folded. Works on all folds representable without UTF-8, except for @@ -500,7 +589,7 @@ S_isFOO_utf8_lc(pTHX_ const U8 classnum, /* Returns a boolean as to whether or not the (well-formed) UTF-8-encoded * 'character' is a member of the Posix character class given by 'classnum' * that should be equivalent to a value in the typedef - * '_char_class_number'. + * 'char_class_number_'. * * This just calls isFOO_lc on the code point for the character if it is in * the range 0-255. Outside that range, all characters use Unicode @@ -520,17 +609,16 @@ S_isFOO_utf8_lc(pTHX_ const U8 classnum, _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(character, e); - switch ((_char_class_number) classnum) { - case _CC_ENUM_SPACE: return is_XPERLSPACE_high(character); - case _CC_ENUM_BLANK: return is_HORIZWS_high(character); - case _CC_ENUM_XDIGIT: return is_XDIGIT_high(character); - case _CC_ENUM_VERTSPACE: return is_VERTWS_high(character); + switch ((char_class_number_) classnum) { + case CC_ENUM_SPACE_: return is_XPERLSPACE_high(character); + case CC_ENUM_BLANK_: return is_HORIZWS_high(character); + case CC_ENUM_XDIGIT_: return is_XDIGIT_high(character); + case CC_ENUM_VERTSPACE_: return is_VERTWS_high(character); default: return _invlist_contains_cp(PL_XPosix_ptrs[classnum], utf8_to_uvchr_buf(character, e, NULL)); } - - return FALSE; /* Things like CNTRL are always below 256 */ + NOT_REACHED; /* NOTREACHED */ } STATIC U8 * @@ -1111,7 +1199,7 @@ Perl_re_intuit_start(pTHX_ && prog->intflags & PREGf_ANCH && prog->check_offset_max != SSize_t_MAX) { - SSize_t check_len = SvCUR(check) - !!SvTAIL(check); + SSize_t check_len = SvCUR(check) - cBOOL(SvTAIL(check)); const char * const anchor = (prog->intflags & PREGf_ANCH_GPOS ? strpos : strbeg); SSize_t targ_len = (char*)end_point - anchor; @@ -1478,11 +1566,11 @@ Perl_re_intuit_start(pTHX_ * (trie stclasses are too expensive to use here, we are better off to * leave it to regmatch itself) */ - if (progi->regstclass && PL_regkind[OP(progi->regstclass)]!=TRIE) { + if (progi->regstclass && REGNODE_TYPE(OP(progi->regstclass))!=TRIE) { const U8* const str = (U8*)STRING(progi->regstclass); /* XXX this value could be pre-computed */ - const SSize_t cl_l = (PL_regkind[OP(progi->regstclass)] == EXACT + const SSize_t cl_l = (REGNODE_TYPE(OP(progi->regstclass)) == EXACT ? (reginfo->is_utf8_pat ? (SSize_t)utf8_distance(str + STR_LEN(progi->regstclass), str) : (SSize_t)STR_LEN(progi->regstclass)) @@ -1693,15 +1781,15 @@ Perl_re_intuit_start(pTHX_ const enum { trie_plain, trie_utf8, trie_utf8_fold, trie_latin_utf8_fold, \ trie_utf8_exactfa_fold, trie_latin_utf8_exactfa_fold, \ trie_utf8l, trie_flu8, trie_flu8_latin } \ - trie_type = ((scan->flags == EXACT) \ + trie_type = ((FLAGS(scan) == EXACT) \ ? (utf8_target ? trie_utf8 : trie_plain) \ - : (scan->flags == EXACTL) \ + : (FLAGS(scan) == EXACTL) \ ? (utf8_target ? trie_utf8l : trie_plain) \ - : (scan->flags == EXACTFAA) \ + : (FLAGS(scan) == EXACTFAA) \ ? (utf8_target \ ? trie_utf8_exactfa_fold \ : trie_latin_utf8_exactfa_fold) \ - : (scan->flags == EXACTFLU8 \ + : (FLAGS(scan) == EXACTFLU8 \ ? (utf8_target \ ? trie_flu8 \ : trie_flu8_latin) \ @@ -1717,7 +1805,7 @@ STMT_START { U8 flags = FOLD_FLAGS_FULL; \ switch (trie_type) { \ case trie_flu8: \ - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; \ + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; \ if (UTF8_IS_ABOVE_LATIN1(*uc)) { \ _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(uc, uc_end); \ } \ @@ -1742,7 +1830,7 @@ STMT_START { } \ break; \ case trie_flu8_latin: \ - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; \ + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; \ goto do_trie_latin_utf8_fold; \ case trie_latin_utf8_exactfa_fold: \ flags |= FOLD_FLAGS_NOMIX_ASCII; \ @@ -1763,7 +1851,7 @@ STMT_START { } \ break; \ case trie_utf8l: \ - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; \ + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; \ if (utf8_target && UTF8_IS_ABOVE_LATIN1(*uc)) { \ _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(uc, uc_end); \ } \ @@ -1793,6 +1881,9 @@ STMT_START { dump_exec_pos(li,s,(reginfo->strend),(reginfo->strbeg), \ startpos, doutf8, depth) +#define GET_ANYOFH_INVLIST(prog, n) \ + GET_REGCLASS_AUX_DATA(prog, n, TRUE, 0, NULL, NULL) + #define REXEC_FBC_UTF8_SCAN(CODE) \ STMT_START { \ while (s < strend) { \ @@ -2183,7 +2274,7 @@ S_find_byclass(pTHX_ regexp * prog, cons U8 c2; char *e = NULL; - /* In some cases we accept only the first occurence of 'x' in a sequence of + /* In some cases we accept only the first occurrence of 'x' in a sequence of * them. This variable points to just beyond the end of the previous * occurrence of 'x', hence we can tell if we are in a sequence. (Having * it point to beyond the 'x' allows us to work for UTF-8 without having to @@ -2197,7 +2288,7 @@ S_find_byclass(pTHX_ regexp * prog, cons bool to_complement = FALSE; /* Invert the result? Taking the xor of this with a result inverts that result, as 0^1 = 1 and 1^1 = 0 */ - _char_class_number classnum; + char_class_number_ classnum; RXi_GET_DECL(prog,progi); @@ -2208,12 +2299,13 @@ S_find_byclass(pTHX_ regexp * prog, cons * for it isn't; 'b' stands for byte), and the UTF8ness of the pattern * ('p8' and 'pb'. */ switch (with_tp_UTF8ness(OP(c), utf8_target, is_utf8_pat)) { + SV * anyofh_list; case ANYOFPOSIXL_t8_pb: case ANYOFPOSIXL_t8_p8: case ANYOFL_t8_pb: case ANYOFL_t8_p8: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(c); /* FALLTHROUGH */ @@ -2230,7 +2322,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case ANYOFPOSIXL_tb_p8: case ANYOFL_tb_pb: case ANYOFL_tb_p8: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(c); /* FALLTHROUGH */ @@ -2239,22 +2331,22 @@ S_find_byclass(pTHX_ regexp * prog, cons case ANYOFD_tb_p8: case ANYOF_tb_pb: case ANYOF_tb_p8: - if (ANYOF_FLAGS(c) & ~ ANYOF_MATCHES_ALL_ABOVE_BITMAP) { + if (! ANYOF_FLAGS(c) && ANYOF_MATCHES_NONE_OUTSIDE_BITMAP(c)) { /* We know that s is in the bitmap range since the target isn't * UTF-8, so what happens for out-of-range values is not relevant, * so exclude that from the flags */ - REXEC_FBC_NON_UTF8_CLASS_SCAN(reginclass(prog,c, (U8*)s, (U8*)s+1, - 0)); + REXEC_FBC_NON_UTF8_CLASS_SCAN(ANYOF_BITMAP_TEST(c, *((U8*)s))); } else { - REXEC_FBC_NON_UTF8_CLASS_SCAN(ANYOF_BITMAP_TEST(c, *((U8*)s))); + REXEC_FBC_NON_UTF8_CLASS_SCAN(reginclass(prog,c, (U8*)s, (U8*)s+1, + 0)); } break; - case ANYOFM_tb_pb: /* ARG() is the base byte; FLAGS() the mask byte */ + case ANYOFM_tb_pb: /* ARG1u() is the base byte; FLAGS() the mask byte */ case ANYOFM_tb_p8: REXEC_FBC_NON_UTF8_FIND_NEXT_SCAN( - find_next_masked((U8 *) s, (U8 *) strend, (U8) ARG(c), FLAGS(c))); + find_next_masked((U8 *) s, (U8 *) strend, (U8) ARG1u(c), FLAGS(c))); break; case ANYOFM_t8_pb: @@ -2263,13 +2355,13 @@ S_find_byclass(pTHX_ regexp * prog, cons * we do anyway for performance reasons, as otherwise we would have to * examine all the continuation characters */ REXEC_FBC_UTF8_FIND_NEXT_SCAN( - find_next_masked((U8 *) s, (U8 *) strend, (U8) ARG(c), FLAGS(c))); + find_next_masked((U8 *) s, (U8 *) strend, (U8) ARG1u(c), FLAGS(c))); break; case NANYOFM_tb_pb: case NANYOFM_tb_p8: REXEC_FBC_NON_UTF8_FIND_NEXT_SCAN( - find_span_end_mask((U8 *) s, (U8 *) strend, (U8) ARG(c), FLAGS(c))); + find_span_end_mask((U8 *) s, (U8 *) strend, (U8) ARG1u(c), FLAGS(c))); break; case NANYOFM_t8_pb: @@ -2277,7 +2369,7 @@ S_find_byclass(pTHX_ regexp * prog, cons variants. */ REXEC_FBC_UTF8_FIND_NEXT_SCAN( (char *) find_span_end_mask((U8 *) s, (U8 *) strend, - (U8) ARG(c), FLAGS(c))); + (U8) ARG1u(c), FLAGS(c))); break; /* These nodes all require at least one code point to be in UTF-8 to @@ -2286,6 +2378,8 @@ S_find_byclass(pTHX_ regexp * prog, cons case ANYOFH_tb_p8: case ANYOFHb_tb_pb: case ANYOFHb_tb_p8: + case ANYOFHbbm_tb_pb: + case ANYOFHbbm_tb_p8: case ANYOFHr_tb_pb: case ANYOFHr_tb_p8: case ANYOFHs_tb_pb: @@ -2298,9 +2392,13 @@ S_find_byclass(pTHX_ regexp * prog, cons case ANYOFH_t8_pb: case ANYOFH_t8_p8: + anyofh_list = GET_ANYOFH_INVLIST(prog, c); REXEC_FBC_UTF8_CLASS_SCAN( ( (U8) NATIVE_UTF8_TO_I8(*s) >= ANYOF_FLAGS(c) - && reginclass(prog, c, (U8*)s, (U8*) strend, 1 /* is utf8 */))); + && _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) s, + (U8 *) strend, + NULL)))); break; case ANYOFHb_t8_pb: @@ -2309,29 +2407,53 @@ S_find_byclass(pTHX_ regexp * prog, cons /* We know what the first byte of any matched string should be. */ U8 first_byte = FLAGS(c); + anyofh_list = GET_ANYOFH_INVLIST(prog, c); + REXEC_FBC_FIND_NEXT_UTF8_BYTE_SCAN(first_byte, + _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) s, + (U8 *) strend, + NULL))); + } + break; + + case ANYOFHbbm_t8_pb: + case ANYOFHbbm_t8_p8: + { + /* We know what the first byte of any matched string should be. */ + U8 first_byte = FLAGS(c); + + /* And a bitmap defines all the legal 2nd byte matches */ REXEC_FBC_FIND_NEXT_UTF8_BYTE_SCAN(first_byte, - reginclass(prog, c, (U8*)s, (U8*) strend, 1 /* is utf8 */)); + ( s < strend + && BITMAP_TEST(((struct regnode_bbm *) c)->bitmap, + (U8) s[1] & UTF_CONTINUATION_MASK))); } break; case ANYOFHr_t8_pb: case ANYOFHr_t8_p8: + anyofh_list = GET_ANYOFH_INVLIST(prog, c); REXEC_FBC_UTF8_CLASS_SCAN( ( inRANGE(NATIVE_UTF8_TO_I8(*s), LOWEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(c)), HIGHEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(c))) - && reginclass(prog, c, (U8*)s, (U8*) strend, - 1 /* is utf8 */))); + && _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) s, + (U8 *) strend, + NULL)))); break; case ANYOFHs_t8_pb: case ANYOFHs_t8_p8: + anyofh_list = GET_ANYOFH_INVLIST(prog, c); REXEC_FBC_FIND_NEXT_UTF8_STRING_SCAN( ((struct regnode_anyofhs *) c)->string, /* Note FLAGS is the string length in this regnode */ ((struct regnode_anyofhs *) c)->string + FLAGS(c), - reginclass(prog, c, (U8*)s, (U8*) strend, - 1 /* is utf8 */)); + _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) s, + (U8 *) strend, + NULL))); break; case ANYOFR_tb_pb: @@ -2374,16 +2496,16 @@ S_find_byclass(pTHX_ regexp * prog, cons /* Latin1 folds are not affected by /a, except it excludes the sharp s, * which these functions don't handle anyway */ fold_array = PL_fold_latin1; - folder = foldEQ_latin1_s2_folded; + folder = S_foldEQ_latin1_s2_folded; goto do_exactf_non_utf8; case EXACTF_tb_pb: fold_array = PL_fold; - folder = foldEQ; + folder = Perl_foldEQ; goto do_exactf_non_utf8; case EXACTFL_tb_pb: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; if (IN_UTF8_CTYPE_LOCALE) { utf8_fold_flags = FOLDEQ_LOCALE; @@ -2391,7 +2513,7 @@ S_find_byclass(pTHX_ regexp * prog, cons } fold_array = PL_fold_locale; - folder = foldEQ_locale; + folder = Perl_foldEQ_locale; goto do_exactf_non_utf8; case EXACTFU_tb_pb: @@ -2399,7 +2521,7 @@ S_find_byclass(pTHX_ regexp * prog, cons * don't have to worry here about this single special case in the * Latin1 range */ fold_array = PL_fold_latin1; - folder = foldEQ_latin1_s2_folded; + folder = S_foldEQ_latin1_s2_folded; /* FALLTHROUGH */ @@ -2418,7 +2540,7 @@ S_find_byclass(pTHX_ regexp * prog, cons /* We know that we have to match at least 'ln' bytes (which is the same * as characters, since not utf8). If we have to match 3 characters, - * and there are only 2 availabe, we know without trying that it will + * and there are only 2 available, we know without trying that it will * fail; so don't start a match past the required minimum number from * the far end */ e = HOP3c(strend, -((SSize_t)ln), s); @@ -2435,7 +2557,7 @@ S_find_byclass(pTHX_ regexp * prog, cons } /* Check that the rest of the node matches */ - if ( (ln == 1 || folder(s + 1, pat_string + 1, ln - 1)) + if ( (ln == 1 || folder(aTHX_ s + 1, pat_string + 1, ln - 1)) && (reginfo->intuit || regtry(reginfo, &s)) ) { goto got_it; @@ -2459,7 +2581,7 @@ S_find_byclass(pTHX_ regexp * prog, cons break; } - if ( (ln == 1 || folder(s + 1, pat_string + 1, ln - 1)) + if ( (ln == 1 || folder(aTHX_ s + 1, pat_string + 1, ln - 1)) && (reginfo->intuit || regtry(reginfo, &s)) ) { goto got_it; @@ -2471,7 +2593,7 @@ S_find_byclass(pTHX_ regexp * prog, cons should actually happen only in EXACTFL nodes */ while (s <= e) { if ( (*(U8*)s == c1 || *(U8*)s == c2) - && (ln == 1 || folder(s + 1, pat_string + 1, ln - 1)) + && (ln == 1 || folder(aTHX_ s + 1, pat_string + 1, ln - 1)) && (reginfo->intuit || regtry(reginfo, &s)) ) { goto got_it; @@ -2504,7 +2626,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case EXACTFL_tb_p8: case EXACTFL_t8_pb: case EXACTFL_t8_p8: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; utf8_fold_flags = FOLDEQ_LOCALE; goto do_exactf_utf8; @@ -2635,7 +2757,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case NBOUNDL_tb_pb: case NBOUNDL_tb_p8: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; if (FLAGS(c) == TRADITIONAL_BOUND) { FBC_NBOUND_NON_UTF8(isWORDCHAR_LC); break; @@ -2648,7 +2770,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case BOUNDL_tb_pb: case BOUNDL_tb_p8: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; if (FLAGS(c) == TRADITIONAL_BOUND) { FBC_BOUND_NON_UTF8(isWORDCHAR_LC); break; @@ -2779,7 +2901,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case BOUNDL_t8_pb: case BOUNDL_t8_p8: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; if (FLAGS(c) == TRADITIONAL_BOUND) { FBC_BOUND_UTF8(isWORDCHAR_LC, isWORDCHAR_LC_uvchr, isWORDCHAR_LC_utf8_safe); @@ -2793,7 +2915,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case NBOUNDL_t8_pb: case NBOUNDL_t8_p8: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; if (FLAGS(c) == TRADITIONAL_BOUND) { FBC_NBOUND_UTF8(isWORDCHAR_LC, isWORDCHAR_LC_uvchr, isWORDCHAR_LC_utf8_safe); @@ -2990,7 +3112,7 @@ S_find_byclass(pTHX_ regexp * prog, cons break; /* The argument to all the POSIX node types is the class number to pass - * to _generic_isCC() to build a mask for searching in PL_charclass[] */ + * to generic_isCC_() to build a mask for searching in PL_charclass[] */ case NPOSIXL_t8_pb: case NPOSIXL_t8_p8: @@ -2999,7 +3121,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case POSIXL_t8_pb: case POSIXL_t8_p8: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; REXEC_FBC_UTF8_CLASS_SCAN( to_complement ^ cBOOL(isFOO_utf8_lc(FLAGS(c), (U8 *) s, (U8 *) strend))); @@ -3012,7 +3134,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case POSIXL_tb_pb: case POSIXL_tb_p8: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; REXEC_FBC_NON_UTF8_CLASS_SCAN( to_complement ^ cBOOL(isFOO_lc(FLAGS(c), *s))); break; @@ -3022,7 +3144,7 @@ S_find_byclass(pTHX_ regexp * prog, cons /* The complement of something that matches only ASCII matches all * non-ASCII, plus everything in ASCII that isn't in the class. */ REXEC_FBC_UTF8_CLASS_SCAN( ! isASCII_utf8_safe(s, strend) - || ! _generic_isCC_A(*s, FLAGS(c))); + || ! generic_isCC_A_(*s, FLAGS(c))); break; case POSIXA_t8_pb: @@ -3031,7 +3153,7 @@ S_find_byclass(pTHX_ regexp * prog, cons * byte invariant character. But we do anyway for performance reasons, * as otherwise we would have to examine all the continuation * characters */ - REXEC_FBC_UTF8_CLASS_SCAN(_generic_isCC_A(*s, FLAGS(c))); + REXEC_FBC_UTF8_CLASS_SCAN(generic_isCC_A_(*s, FLAGS(c))); break; case NPOSIXD_tb_pb: @@ -3046,7 +3168,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case POSIXA_tb_pb: case POSIXA_tb_p8: REXEC_FBC_NON_UTF8_CLASS_SCAN( - to_complement ^ cBOOL(_generic_isCC_A(*s, FLAGS(c)))); + to_complement ^ cBOOL(generic_isCC_A_(*s, FLAGS(c)))); break; case NPOSIXU_tb_pb: @@ -3057,7 +3179,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case POSIXU_tb_pb: case POSIXU_tb_p8: REXEC_FBC_NON_UTF8_CLASS_SCAN( - to_complement ^ cBOOL(_generic_isCC(*s, + to_complement ^ cBOOL(generic_isCC_(*s, FLAGS(c)))); break; @@ -3072,7 +3194,7 @@ S_find_byclass(pTHX_ regexp * prog, cons case POSIXD_t8_p8: case POSIXU_t8_pb: case POSIXU_t8_p8: - classnum = (_char_class_number) FLAGS(c); + classnum = (char_class_number_) FLAGS(c); switch (classnum) { default: REXEC_FBC_UTF8_CLASS_SCAN( @@ -3083,27 +3205,27 @@ S_find_byclass(pTHX_ regexp * prog, cons NULL)))); break; - case _CC_ENUM_SPACE: + case CC_ENUM_SPACE_: REXEC_FBC_UTF8_CLASS_SCAN( to_complement ^ cBOOL(isSPACE_utf8_safe(s, strend))); break; - case _CC_ENUM_BLANK: + case CC_ENUM_BLANK_: REXEC_FBC_UTF8_CLASS_SCAN( to_complement ^ cBOOL(isBLANK_utf8_safe(s, strend))); break; - case _CC_ENUM_XDIGIT: + case CC_ENUM_XDIGIT_: REXEC_FBC_UTF8_CLASS_SCAN( to_complement ^ cBOOL(isXDIGIT_utf8_safe(s, strend))); break; - case _CC_ENUM_VERTSPACE: + case CC_ENUM_VERTSPACE_: REXEC_FBC_UTF8_CLASS_SCAN( to_complement ^ cBOOL(isVERTWS_utf8_safe(s, strend))); break; - case _CC_ENUM_CNTRL: + case CC_ENUM_CNTRL_: REXEC_FBC_UTF8_CLASS_SCAN( to_complement ^ cBOOL(isCNTRL_utf8_safe(s, strend))); break; @@ -3121,7 +3243,7 @@ S_find_byclass(pTHX_ regexp * prog, cons { DECL_TRIE_TYPE(c); /* what trie are we using right now */ - reg_ac_data *aho = (reg_ac_data*)progi->data->data[ ARG( c ) ]; + reg_ac_data *aho = (reg_ac_data*)progi->data->data[ ARG1u( c ) ]; reg_trie_data *trie = (reg_trie_data*)progi->data->data[aho->trie]; HV *widecharmap = MUTABLE_HV(progi->data->data[ aho->trie + 1 ]); @@ -3393,29 +3515,29 @@ S_reg_set_capture_string(pTHX_ REGEXP * /* Create a new COW SV to share the match string and store * in saved_copy, unless the current COW SV in saved_copy * is valid and suitable for our purpose */ - if (( prog->saved_copy - && SvIsCOW(prog->saved_copy) - && SvPOKp(prog->saved_copy) + if (( RXp_SAVED_COPY(prog) + && SvIsCOW(RXp_SAVED_COPY(prog)) + && SvPOKp(RXp_SAVED_COPY(prog)) && SvIsCOW(sv) && SvPOKp(sv) - && SvPVX(sv) == SvPVX(prog->saved_copy))) + && SvPVX(sv) == SvPVX(RXp_SAVED_COPY(prog)))) { /* just reuse saved_copy SV */ if (RXp_MATCH_COPIED(prog)) { - Safefree(prog->subbeg); + Safefree(RXp_SUBBEG(prog)); RXp_MATCH_COPIED_off(prog); } } else { /* create new COW SV to share string */ RXp_MATCH_COPY_FREE(prog); - prog->saved_copy = sv_setsv_cow(prog->saved_copy, sv); + RXp_SAVED_COPY(prog) = sv_setsv_cow(RXp_SAVED_COPY(prog), sv); } - prog->subbeg = (char *)SvPVX_const(prog->saved_copy); - assert (SvPOKp(prog->saved_copy)); - prog->sublen = strend - strbeg; - prog->suboffset = 0; - prog->subcoffset = 0; + RXp_SUBBEG(prog) = (char *)SvPVX_const(RXp_SAVED_COPY(prog)); + assert (SvPOKp(RXp_SAVED_COPY(prog))); + RXp_SUBLEN(prog) = strend - strbeg; + RXp_SUBOFFSET(prog) = 0; + RXp_SUBCOFFSET(prog) = 0; } else #endif { @@ -3427,19 +3549,20 @@ S_reg_set_capture_string(pTHX_ REGEXP * && !(prog->extflags & RXf_PMf_KEEPCOPY) /* //p */ && !(PL_sawampersand & SAWAMPERSAND_RIGHT) ) { /* don't copy $' part of string */ + SSize_t offs_end; U32 n = 0; max = -1; /* calculate the right-most part of the string covered * by a capture. Due to lookahead, this may be to * the right of $&, so we have to scan all captures */ - while (n <= prog->lastparen) { - if (prog->offs[n].end > max) - max = prog->offs[n].end; + while (n <= RXp_LASTPAREN(prog)) { + if ((offs_end = RXp_OFFS_END(prog,n)) > max) + max = offs_end; n++; } if (max == -1) max = (PL_sawampersand & SAWAMPERSAND_LEFT) - ? prog->offs[0].start + ? RXp_OFFS_START(prog,0) : 0; assert(max >= 0 && max <= strend - strbeg); } @@ -3453,18 +3576,19 @@ S_reg_set_capture_string(pTHX_ REGEXP * /* calculate the left-most part of the string covered * by a capture. Due to lookbehind, this may be to * the left of $&, so we have to scan all captures */ - while (min && n <= prog->lastparen) { - if ( prog->offs[n].start != -1 - && prog->offs[n].start < min) + while (min && n <= RXp_LASTPAREN(prog)) { + I32 start = RXp_OFFS_START(prog,n); + if ( start != -1 + && start < min) { - min = prog->offs[n].start; + min = start; } n++; } if ((PL_sawampersand & SAWAMPERSAND_RIGHT) - && min > prog->offs[0].end + && min > RXp_OFFS_END(prog,0) ) - min = prog->offs[0].end; + min = RXp_OFFS_END(prog,0); } @@ -3472,20 +3596,20 @@ S_reg_set_capture_string(pTHX_ REGEXP * sublen = max - min; if (RXp_MATCH_COPIED(prog)) { - if (sublen > prog->sublen) - prog->subbeg = - (char*)saferealloc(prog->subbeg, sublen+1); + if (sublen > RXp_SUBLEN(prog)) + RXp_SUBBEG(prog) = + (char*)saferealloc(RXp_SUBBEG(prog), sublen+1); } else - prog->subbeg = (char*)safemalloc(sublen+1); - Copy(strbeg + min, prog->subbeg, sublen, char); - prog->subbeg[sublen] = '\0'; - prog->suboffset = min; - prog->sublen = sublen; + RXp_SUBBEG(prog) = (char*)safemalloc(sublen+1); + Copy(strbeg + min, RXp_SUBBEG(prog), sublen, char); + RXp_SUBBEG(prog)[sublen] = '\0'; + RXp_SUBOFFSET(prog) = min; + RXp_SUBLEN(prog) = sublen; RXp_MATCH_COPIED_on(prog); } - prog->subcoffset = prog->suboffset; - if (prog->suboffset && utf8_target) { + RXp_SUBCOFFSET(prog) = RXp_SUBOFFSET(prog); + if (RXp_SUBOFFSET(prog) && utf8_target) { /* Convert byte offset to chars. * XXX ideally should only compute this if @-/@+ * has been seen, a la PL_sawampersand ??? */ @@ -3501,19 +3625,19 @@ S_reg_set_capture_string(pTHX_ REGEXP * * $x = "\x{100}" x 1E6; 1 while $x =~ /(.)/g; * from going quadratic */ if (SvPOKp(sv) && SvPVX(sv) == strbeg) - prog->subcoffset = sv_pos_b2u_flags(sv, prog->subcoffset, + RXp_SUBCOFFSET(prog) = sv_pos_b2u_flags(sv, RXp_SUBCOFFSET(prog), SV_GMAGIC|SV_CONST_RETURN); else - prog->subcoffset = utf8_length((U8*)strbeg, - (U8*)(strbeg+prog->suboffset)); + RXp_SUBCOFFSET(prog) = utf8_length((U8*)strbeg, + (U8*)(strbeg+RXp_SUBOFFSET(prog))); } } else { RXp_MATCH_COPY_FREE(prog); - prog->subbeg = strbeg; - prog->suboffset = 0; - prog->subcoffset = 0; - prog->sublen = strend - strbeg; + RXp_SUBBEG(prog) = strbeg; + RXp_SUBOFFSET(prog) = 0; + RXp_SUBCOFFSET(prog) = 0; + RXp_SUBLEN(prog) = strend - strbeg; } } @@ -3665,12 +3789,13 @@ Perl_regexec_flags(pTHX_ REGEXP * const /* match via INTUIT shouldn't have any captures. * Let @-, @+, $^N know */ - prog->lastparen = prog->lastcloseparen = 0; + RXp_LASTPAREN(prog) = RXp_LASTCLOSEPAREN(prog) = 0; RXp_MATCH_UTF8_set(prog, utf8_target); - prog->offs[0].start = s - strbeg; - prog->offs[0].end = utf8_target + SSize_t match_start = s - strbeg; + SSize_t match_end = utf8_target ? (char*)utf8_hop_forward((U8*)s, prog->minlenret, (U8 *) strend) - strbeg : s - strbeg + prog->minlenret; + CLOSE_ANY_CAPTURE(prog, 0, match_start, match_end); if ( !(flags & REXEC_NOT_FIRST) ) S_reg_set_capture_string(aTHX_ rx, strbeg, strend, @@ -3775,16 +3900,16 @@ Perl_regexec_flags(pTHX_ REGEXP * const to the re, and switch the buffer each match. If we fail, we switch it back; otherwise we leave it swapped. */ - swap = prog->offs; + swap = RXp_OFFSp(prog); /* avoid leak if we die, or clean up anyway if match completes */ SAVEFREEPV(swap); - Newxz(prog->offs, (prog->nparens + 1), regexp_paren_pair); + Newxz(RXp_OFFSp(prog), (prog->nparens + 1), regexp_paren_pair); DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_ "rex=0x%" UVxf " saving offs: orig=0x%" UVxf " new=0x%" UVxf "\n", 0, PTR2UV(prog), PTR2UV(swap), - PTR2UV(prog->offs) + PTR2UV(RXp_OFFSp(prog)) )); } @@ -4009,7 +4134,7 @@ Perl_regexec_flags(pTHX_ REGEXP * const if (minlen) { const OPCODE op = OP(progi->regstclass); /* don't bother with what can't match */ - if (PL_regkind[op] != EXACT && PL_regkind[op] != TRIE) + if (REGNODE_TYPE(op) != EXACT && REGNODE_TYPE(op) != TRIE) strend = HOPc(strend, -(minlen - 1)); } DEBUG_EXECUTE_r({ @@ -4155,7 +4280,7 @@ Perl_regexec_flags(pTHX_ REGEXP * const /* s/// doesn't like it if $& is earlier than where we asked it to * start searching (which can happen on something like /.\G/) */ if ( (flags & REXEC_FAIL_ON_UNDERFLOW) - && (prog->offs[0].start < stringarg - strbeg)) + && (RXp_OFFS_START(prog,0) < stringarg - strbeg)) { /* this should only be possible under \G */ assert(prog->intflags & PREGf_GPOS_SEEN); @@ -4195,11 +4320,11 @@ Perl_regexec_flags(pTHX_ REGEXP * const "rex=0x%" UVxf " rolling back offs: 0x%" UVxf " will be freed; restoring data to =0x%" UVxf "\n", 0, PTR2UV(prog), - PTR2UV(prog->offs), + PTR2UV(RXp_OFFSp(prog)), PTR2UV(swap) )); - Copy(swap, prog->offs, prog->nparens + 1, regexp_paren_pair); + Copy(swap, RXp_OFFSp(prog), prog->nparens + 1, regexp_paren_pair); } /* clean up; this will trigger destructors that will free all slabs @@ -4242,17 +4367,17 @@ S_regtry(pTHX_ regmatch_info *reginfo, c reginfo->cutpoint=NULL; - prog->offs[0].start = *startposp - reginfo->strbeg; - prog->lastparen = 0; - prog->lastcloseparen = 0; + RXp_OFFSp(prog)[0].start = *startposp - reginfo->strbeg; + RXp_LASTPAREN(prog) = 0; + RXp_LASTCLOSEPAREN(prog) = 0; /* XXXX What this code is doing here?!!! There should be no need - to do this again and again, prog->lastparen should take care of + to do this again and again, RXp_LASTPAREN(prog) should take care of this! --ilya*/ /* Tests pat.t#187 and split.t#{13,14} seem to depend on this code. * Actually, the code in regcppop() (which Ilya may be meaning by - * prog->lastparen), is not needed at all by the test suite + * RXp_LASTPAREN(prog)), is not needed at all by the test suite * (op/regexp, op/pat, op/split), but that code is needed otherwise * this erroneously leaves $1 defined: "1" =~ /^(?:(\d)x)?\d$/ * Meanwhile, this code *is* needed for the @@ -4269,9 +4394,9 @@ S_regtry(pTHX_ regmatch_info *reginfo, c * places it is called, and related regcp() routines. - Yves */ #if 1 if (prog->nparens) { - regexp_paren_pair *pp = prog->offs; + regexp_paren_pair *pp = RXp_OFFSp(prog); I32 i; - for (i = prog->nparens; i > (I32)prog->lastparen; i--) { + for (i = prog->nparens; i > (I32)RXp_LASTPAREN(prog); i--) { ++pp; pp->start = -1; pp->end = -1; @@ -4281,7 +4406,7 @@ S_regtry(pTHX_ regmatch_info *reginfo, c REGCP_SET(lastcp); result = regmatch(reginfo, *startposp, progi->program + 1); if (result != -1) { - prog->offs[0].end = result; + RXp_OFFSp(prog)[0].end = result; return 1; } if (reginfo->cutpoint) @@ -4385,14 +4510,20 @@ S_dump_exec_pos(pTHX_ const char *locinp PERL_ARGS_ASSERT_DUMP_EXEC_POS; - while (utf8_target && UTF8_IS_CONTINUATION(*(U8*)(locinput - pref_len))) - pref_len++; + if (utf8_target) { + while (UTF8_IS_CONTINUATION(*(U8*)(locinput - pref_len))) { + pref_len++; + } + } pref0_len = pref_len - (locinput - loc_reg_starttry); if (l + pref_len < (5 + taill) && l < loc_regeol - locinput) l = ( loc_regeol - locinput > (5 + taill) - pref_len ? (5 + taill) - pref_len : loc_regeol - locinput); - while (utf8_target && UTF8_IS_CONTINUATION(*(U8*)(locinput + l))) - l--; + if (utf8_target) { + while (UTF8_IS_CONTINUATION(*(U8*)(locinput + l))) { + l--; + } + } if (pref0_len < 0) pref0_len = 0; if (pref0_len > pref_len) @@ -4429,7 +4560,7 @@ S_dump_exec_pos(pTHX_ const char *locinp /* reg_check_named_buff_matched() * Checks to see if a named buffer has matched. The data array of * buffer numbers corresponding to the buffer is expected to reside - * in the regexp->data->data array in the slot stored in the ARG() of + * in the regexp->data->data array in the slot stored in the ARG1u() of * node involved. Note that this routine doesn't actually care about the * name, that information is not preserved from compilation to execution. * Returns the index of the leftmost defined buffer with the given name @@ -4440,14 +4571,14 @@ S_reg_check_named_buff_matched(const reg { I32 n; RXi_GET_DECL(rex,rexi); - SV *sv_dat= MUTABLE_SV(rexi->data->data[ ARG( scan ) ]); + SV *sv_dat= MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]); I32 *nums=(I32*)SvPVX(sv_dat); PERL_ARGS_ASSERT_REG_CHECK_NAMED_BUFF_MATCHED; for ( n=0; nlastparen >= nums[n] && - rex->offs[nums[n]].end != -1) + if ((I32)RXp_LASTPAREN(rex) >= nums[n] && + RXp_OFFS_END(rex,nums[n]) != -1) { return nums[n]; } @@ -4576,7 +4707,7 @@ S_setup_EXACTISH_ST(pTHX_ const regnode if ( (op == EXACTF && utf8_target) || (op == EXACTFL && IN_UTF8_CTYPE_LOCALE)) { - if (op == EXACTFL && PL_in_utf8_turkic_locale) { + if (op == EXACTFL && IN_UTF8_TURKIC_LOCALE) { op = TURKISH; } else { @@ -4868,7 +4999,7 @@ S_setup_EXACTISH_ST(pTHX_ const regnode /* Add this character to the list of possible matches */ if (utf8_target) { - uvchr_to_utf8(matches[m->count], fold_from); + uvchr_to_utf8(matches[(U8) m->count], fold_from); lengths[m->count] = UVCHR_SKIP(fold_from); m->count++; } @@ -5301,7 +5432,7 @@ S_isLB(pTHX_ LB_enum before, /* Here, we have the character preceding the span of spaces all set * up. We follow LB18: "Break after spaces" unless the table shows - * that is overriden */ + * that is overridden */ return LB_table[prev][after] != LB_NOBREAK_EVEN_WITH_SP_BETWEEN; case LB_CM_ZWJ_foo: @@ -5314,7 +5445,7 @@ S_isLB(pTHX_ LB_enum before, while (prev == LB_Combining_Mark || prev == LB_ZWJ); /* Here, 'prev' is that first earlier non-CM character. If the CM - * attatches to it, then it inherits the behavior of 'prev'. If it + * attaches to it, then it inherits the behavior of 'prev'. If it * doesn't attach, it is to be treated as an AL */ if (! LB_CM_ATTACHES_TO(prev)) { prev = LB_Alphabetic; @@ -5735,7 +5866,7 @@ S_backup_one_SB(pTHX_ const U8 * const s } /* Back up over Extend and Format. curpos is always just to the right - * of the characater whose value we are getting */ + * of the character whose value we are getting */ do { U8 * prev_prev_char_pos; if ((prev_prev_char_pos = reghopmaybe3((U8 *) prev_char_pos, -1, @@ -6035,7 +6166,7 @@ S_backup_one_WB(pTHX_ WB_enum * previous } /* Back up over Extend and Format. curpos is always just to the right - * of the characater whose value we are getting */ + * of the character whose value we are getting */ do { U8 * prev_prev_char_pos; if ((prev_prev_char_pos = reghopmaybe3((U8 *) prev_char_pos, @@ -6081,7 +6212,7 @@ S_backup_one_WB(pTHX_ WB_enum * previous #define sayNO goto no #define sayNO_SILENT goto no_silent -/* we dont use STMT_START/END here because it leads to +/* we don't use STMT_START/END here because it leads to "unreachable code" warnings, which are bogus, but distracting. */ #define CACHEsayNO \ if (ST.cache_mask) \ @@ -6136,7 +6267,7 @@ S_backup_one_WB(pTHX_ WB_enum * previous Perl_re_printf( aTHX_ \ "%*s" pp " %s%s%s%s%s\n", \ INDENT_CHARS(depth), "", \ - PL_reg_name[st->resume_state], \ + REGNODE_NAME(st->resume_state), \ ((st==yes_state||st==mark_state) ? "[" : ""), \ ((st==yes_state) ? "Y" : ""), \ ((st==mark_state) ? "M" : ""), \ @@ -6358,13 +6489,15 @@ S_regmatch(pTHX_ regmatch_info *reginfo, CV *last_pushed_cv = NULL; /* most recently called (?{}) CV */ U32 maxopenparen = 0; /* max '(' index seen so far */ int to_complement; /* Invert the result? */ - _char_class_number classnum; + char_class_number_ classnum; bool is_utf8_pat = reginfo->is_utf8_pat; bool match = FALSE; I32 orig_savestack_ix = PL_savestack_ix; U8 * script_run_begin = NULL; char *match_end= NULL; /* where a match MUST end to be considered successful */ bool is_accepted = FALSE; /* have we hit an ACCEPT opcode? */ + re_fold_t folder = NULL; /* used by various EXACTish regops */ + const U8 * fold_array = NULL; /* used by various EXACTish regops */ /* Solaris Studio 12.3 messes up fetching PL_charclass['\n'] */ #if (defined(__SUNPRO_C) && (__SUNPRO_C == 0x5120) && defined(__x86_64) && defined(USE_64_BIT_ALL)) @@ -6416,7 +6549,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, INDENT_CHARS(depth), "", (IV)(scan - rexi->program), SvPVX_const(prop), - (PL_regkind[OP(scan)] == END || !rnext) ? + (REGNODE_TYPE(OP(scan)) == END || !rnext) ? 0 : (IV)(rnext - rexi->program)); } ); @@ -6427,6 +6560,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, assert(nextbyte < 256 && (nextbyte >= 0 || nextbyte == NEXTCHR_EOS)); switch (state_num) { + SV * anyofh_list; + case SBOL: /* /^../ and /\A../ */ if (locinput == reginfo->strbeg) break; @@ -6447,15 +6582,15 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case KEEPS: /* \K */ /* update the startpoint */ - st->u.keeper.val = rex->offs[0].start; - rex->offs[0].start = locinput - reginfo->strbeg; + st->u.keeper.val = RXp_OFFS_START(rex,0); + RXp_OFFSp(rex)[0].start = locinput - reginfo->strbeg; PUSH_STATE_GOTO(KEEPS_next, next, locinput, loceol, script_run_begin); NOT_REACHED; /* NOTREACHED */ case KEEPS_next_fail: /* rollback the start point change */ - rex->offs[0].start = st->u.keeper.val; + RXp_OFFSp(rex)[0].start = st->u.keeper.val; sayNO_SILENT; NOT_REACHED; /* NOTREACHED */ @@ -6560,16 +6695,21 @@ S_regmatch(pTHX_ regmatch_info *reginfo, /* what trie are we using right now */ reg_trie_data * const trie - = (reg_trie_data*)rexi->data->data[ ARG( scan ) ]; - HV * widecharmap = MUTABLE_HV(rexi->data->data[ ARG( scan ) + 1 ]); + = (reg_trie_data*)rexi->data->data[ ARG1u( scan ) ]; + ST.before_paren = trie->before_paren; + ST.after_paren = trie->after_paren; + assert(ST.before_paren<=rex->nparens); + assert(ST.after_paren<=rex->nparens); + + HV * widecharmap = MUTABLE_HV(rexi->data->data[ ARG1u( scan ) + 1 ]); U32 state = trie->startstate; - if (scan->flags == EXACTL || scan->flags == EXACTFLU8) { - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + if (FLAGS(scan) == EXACTL || FLAGS(scan) == EXACTFLU8) { + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; if (utf8_target && ! NEXTCHR_IS_EOS && UTF8_IS_ABOVE_LATIN1(nextbyte) - && scan->flags == EXACTL) + && FLAGS(scan) == EXACTL) { /* We only output for EXACTL, as we let the folder * output this message for EXACTFLU8 to avoid @@ -6610,6 +6750,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, U32 accepted = 0; /* have we seen any accepting states? */ ST.jump = trie->jump; + ST.j_before_paren = trie->j_before_paren; + ST.j_after_paren= trie->j_after_paren; ST.me = scan; ST.firstpos = NULL; ST.longfold = FALSE; /* char longer if folded => it's harder */ @@ -6713,6 +6855,10 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case TRIE_next_fail: /* we failed - try next alternative */ { U8 *uc; + if (RE_PESSIMISTIC_PARENS) { + REGCP_UNWIND(ST.lastcp); + regcppop(rex,&maxopenparen); + } if ( ST.jump ) { /* undo any captures done in the tail part of a branch, * e.g. @@ -6721,6 +6867,10 @@ S_regmatch(pTHX_ regmatch_info *reginfo, * rest of the branch */ REGCP_UNWIND(ST.cp); UNWIND_PAREN(ST.lastparen, ST.lastcloseparen); + if (ST.after_paren) { + assert(ST.before_paren<=rex->nparens && ST.after_paren<=rex->nparens); + CAPTURE_CLEAR(ST.before_paren+1, ST.after_paren, "TRIE_next_fail"); + } } if (!--ST.accepted) { DEBUG_EXECUTE_r({ @@ -6738,7 +6888,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, U16 word; U16 const nextword = ST.nextword; reg_trie_wordinfo * const wordinfo - = ((reg_trie_data*)rexi->data->data[ARG(ST.me)])->wordinfo; + = ((reg_trie_data*)rexi->data->data[ARG1u(ST.me)])->wordinfo; for (word=ST.topword; word; word=wordinfo[word].prev) { if (word > nextword && (!min || word < min)) min = word; @@ -6753,8 +6903,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, } if ( ST.jump ) { - ST.lastparen = rex->lastparen; - ST.lastcloseparen = rex->lastcloseparen; + ST.lastparen = RXp_LASTPAREN(rex); + ST.lastcloseparen = RXp_LASTCLOSEPAREN(rex); REGCP_SET(ST.cp); } @@ -6762,7 +6912,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, { U32 chars; /* how many chars to skip */ reg_trie_data * const trie - = (reg_trie_data*)rexi->data->data[ARG(ST.me)]; + = (reg_trie_data*)rexi->data->data[ARG1u(ST.me)]; assert((trie->wordinfo[ST.nextword].len - trie->prefixlen) >= ST.firstchars); @@ -6810,10 +6960,16 @@ S_regmatch(pTHX_ regmatch_info *reginfo, uc += chars; } } + if (ST.jump && ST.jump[ST.nextword]) { + scan = ST.me + ST.jump[ST.nextword]; + ST.before_paren = ST.j_before_paren[ST.nextword]; + assert(ST.before_paren <= rex->nparens); + ST.after_paren = ST.j_after_paren[ST.nextword]; + assert(ST.after_paren <= rex->nparens); + } else { + scan = ST.me + NEXT_OFF(ST.me); + } - scan = ST.me + ((ST.jump && ST.jump[ST.nextword]) - ? ST.jump[ST.nextword] - : NEXT_OFF(ST.me)); DEBUG_EXECUTE_r({ Perl_re_exec_indentf( aTHX_ "%sTRIE matched word #%d, continuing%s\n", @@ -6825,6 +6981,10 @@ S_regmatch(pTHX_ regmatch_info *reginfo, }); if ( ST.accepted > 1 || has_cutgroup || ST.jump ) { + if (RE_PESSIMISTIC_PARENS) { + (void)regcppush(rex, 0, maxopenparen); + REGCP_SET(ST.lastcp); + } PUSH_STATE_GOTO(TRIE_next, scan, (char*)uc, loceol, script_run_begin); NOT_REACHED; /* NOTREACHED */ @@ -6832,7 +6992,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, /* only one choice left - just continue */ DEBUG_EXECUTE_r({ AV *const trie_words - = MUTABLE_AV(rexi->data->data[ARG(ST.me)+TRIE_WORDS_OFFSET]); + = MUTABLE_AV(rexi->data->data[ARG1u(ST.me)+TRIE_WORDS_OFFSET]); SV ** const tmp = trie_words ? av_fetch(trie_words, ST.nextword - 1, 0) : NULL; SV *sv= tmp ? sv_newmortal() : NULL; @@ -6869,11 +7029,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, goto join_short_long_exact; case EXACTL: /* /abc/l */ - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; /* Complete checking would involve going through every character * matched by the string to see if any is above latin1. But the - * comparision otherwise might very well be a fast assembly + * comparison otherwise might very well be a fast assembly * language routine, and I (khw) don't think slowing things down * just to check for this warning is worth it. So this just checks * the first character */ @@ -6972,13 +7132,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case EXACTFL: /* /abc/il */ { - re_fold_t folder; - const U8 * fold_array; const char * s; U32 fold_utf8_flags; - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; - folder = foldEQ_locale; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; + folder = Perl_foldEQ_locale; fold_array = PL_fold_locale; fold_utf8_flags = FOLDEQ_LOCALE; goto do_exactf; @@ -6991,7 +7149,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, } fold_utf8_flags = FOLDEQ_LOCALE | FOLDEQ_S2_ALREADY_FOLDED | FOLDEQ_S2_FOLDS_SANE; - folder = foldEQ_latin1_s2_folded; + folder = S_foldEQ_latin1_s2_folded; fold_array = PL_fold_latin1; goto do_exactf; @@ -7001,18 +7159,24 @@ S_regmatch(pTHX_ regmatch_info *reginfo, } assert(is_utf8_pat); fold_utf8_flags = FOLDEQ_S2_ALREADY_FOLDED; +#ifdef DEBUGGING + /* this is only used in an assert check, so we restrict it to DEBUGGING mode. + * In theory neither of these variables should be used in this mode. */ + folder = NULL; + fold_array = NULL; +#endif goto do_exactf; case EXACTFUP: /* /foo/iu, and something is problematic in 'foo' so can't take shortcuts. */ assert(! is_utf8_pat); - folder = foldEQ_latin1; + folder = Perl_foldEQ_latin1; fold_array = PL_fold_latin1; fold_utf8_flags = 0; goto do_exactf; case EXACTFU: /* /abc/iu */ - folder = foldEQ_latin1_s2_folded; + folder = S_foldEQ_latin1_s2_folded; fold_array = PL_fold_latin1; fold_utf8_flags = FOLDEQ_S2_ALREADY_FOLDED; goto do_exactf; @@ -7022,7 +7186,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, assert(! is_utf8_pat); /* FALLTHROUGH */ case EXACTFAA: /* /abc/iaa */ - folder = foldEQ_latin1_s2_folded; + folder = S_foldEQ_latin1_s2_folded; fold_array = PL_fold_latin1; fold_utf8_flags = FOLDEQ_UTF8_NOMIX_ASCII; if (is_utf8_pat || ! utf8_target) { @@ -7039,7 +7203,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case EXACTF: /* /abc/i This node only generated for non-utf8 patterns */ assert(! is_utf8_pat); - folder = foldEQ; + folder = Perl_foldEQ; fold_array = PL_fold; fold_utf8_flags = 0; @@ -7067,6 +7231,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, } /* Neither the target nor the pattern are utf8 */ + assert(fold_array); if (UCHARAT(s) != nextbyte && !NEXTCHR_IS_EOS && UCHARAT(s) != fold_array[nextbyte]) @@ -7075,7 +7240,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, } if (loceol - locinput < ln) sayNO; - if (ln > 1 && ! folder(locinput, s, ln)) + assert(folder); + if (ln > 1 && ! folder(aTHX_ locinput, s, ln)) sayNO; locinput += ln; break; @@ -7088,7 +7254,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case BOUNDL: /* /\b/l */ { bool b1, b2; - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; if (FLAGS(scan) != TRADITIONAL_BOUND) { CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_BOUND; @@ -7359,7 +7525,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case ANYOFPOSIXL: case ANYOFL: /* /[abc]/l */ - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(scan); /* FALLTHROUGH */ @@ -7368,7 +7534,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, if (NEXTCHR_IS_EOS || locinput >= loceol) sayNO; if ( (! utf8_target || UTF8_IS_INVARIANT(*locinput)) - && ! (ANYOF_FLAGS(scan) & ~ ANYOF_MATCHES_ALL_ABOVE_BITMAP)) + && ! ANYOF_FLAGS(scan) + && ANYOF_MATCHES_NONE_OUTSIDE_BITMAP(scan)) { if (! ANYOF_BITMAP_TEST(scan, * (U8 *) (locinput))) { sayNO; @@ -7387,7 +7554,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case ANYOFM: if ( NEXTCHR_IS_EOS - || (UCHARAT(locinput) & FLAGS(scan)) != ARG(scan) + || (UCHARAT(locinput) & FLAGS(scan)) != ARG1u(scan) || locinput >= loceol) { sayNO; @@ -7397,7 +7564,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case NANYOFM: if ( NEXTCHR_IS_EOS - || (UCHARAT(locinput) & FLAGS(scan)) == ARG(scan) + || (UCHARAT(locinput) & FLAGS(scan)) == ARG1u(scan) || locinput >= loceol) { sayNO; @@ -7409,8 +7576,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, if ( ! utf8_target || NEXTCHR_IS_EOS || ANYOF_FLAGS(scan) > NATIVE_UTF8_TO_I8(*locinput) - || ! reginclass(rex, scan, (U8*)locinput, (U8*) loceol, - utf8_target)) + || ! (anyofh_list = GET_ANYOFH_INVLIST(rex, scan)) + || ! _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) locinput, + (U8 *) loceol, + NULL))) { sayNO; } @@ -7421,8 +7591,24 @@ S_regmatch(pTHX_ regmatch_info *reginfo, if ( ! utf8_target || NEXTCHR_IS_EOS || ANYOF_FLAGS(scan) != (U8) *locinput - || ! reginclass(rex, scan, (U8*)locinput, (U8*) loceol, - utf8_target)) + || ! (anyofh_list = GET_ANYOFH_INVLIST(rex, scan)) + || ! _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) locinput, + (U8 *) loceol, + NULL))) + { + sayNO; + } + goto increment_locinput; + break; + + case ANYOFHbbm: + if ( ! utf8_target + || NEXTCHR_IS_EOS + || ANYOF_FLAGS(scan) != (U8) locinput[0] + || locinput >= reginfo->strend + || ! BITMAP_TEST(( (struct regnode_bbm *) scan)->bitmap, + (U8) locinput[1] & UTF_CONTINUATION_MASK)) { sayNO; } @@ -7435,8 +7621,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, || ! inRANGE((U8) NATIVE_UTF8_TO_I8(*locinput), LOWEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(scan)), HIGHEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(scan))) - || ! reginclass(rex, scan, (U8*)locinput, (U8*) loceol, - utf8_target)) + || ! (anyofh_list = GET_ANYOFH_INVLIST(rex, scan)) + || ! _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) locinput, + (U8 *) loceol, + NULL))) { sayNO; } @@ -7448,8 +7637,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, || NEXTCHR_IS_EOS || loceol - locinput < FLAGS(scan) || memNE(locinput, ((struct regnode_anyofhs *) scan)->string, FLAGS(scan)) - || ! reginclass(rex, scan, (U8*)locinput, (U8*) loceol, - utf8_target)) + || ! (anyofh_list = GET_ANYOFH_INVLIST(rex, scan)) + || ! _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) locinput, + (U8 *) loceol, + NULL))) { sayNO; } @@ -7514,7 +7706,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, /* FALLTHROUGH */ case POSIXL: /* \w or [:punct:] etc. under /l */ - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; if (NEXTCHR_IS_EOS || locinput >= loceol) sayNO; @@ -7585,7 +7777,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, join_nposixa: - if (! (to_complement ^ cBOOL(_generic_isCC_A(nextbyte, + if (! (to_complement ^ cBOOL(generic_isCC_A_(nextbyte, FLAGS(scan))))) { sayNO; @@ -7606,11 +7798,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, sayNO; } - /* Use _generic_isCC() for characters within Latin1. (Note that + /* Use generic_isCC_() for characters within Latin1. (Note that * UTF8_IS_INVARIANT works even on non-UTF-8 strings, or else * wouldn't be invariant) */ if (UTF8_IS_INVARIANT(nextbyte) || ! utf8_target) { - if (! (to_complement ^ cBOOL(_generic_isCC(nextbyte, + if (! (to_complement ^ cBOOL(generic_isCC_(nextbyte, FLAGS(scan))))) { sayNO; @@ -7619,7 +7811,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, } else if (UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(locinput, reginfo->strend)) { if (! (to_complement - ^ cBOOL(_generic_isCC(EIGHT_BIT_UTF8_TO_NATIVE(nextbyte, + ^ cBOOL(generic_isCC_(EIGHT_BIT_UTF8_TO_NATIVE(nextbyte, *(locinput + 1)), FLAGS(scan))))) { @@ -7629,7 +7821,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, } else { /* Handle above Latin-1 code points */ utf8_posix_above_latin1: - classnum = (_char_class_number) FLAGS(scan); + classnum = (char_class_number_) FLAGS(scan); switch (classnum) { default: if (! (to_complement @@ -7642,36 +7834,36 @@ S_regmatch(pTHX_ regmatch_info *reginfo, sayNO; } break; - case _CC_ENUM_SPACE: + case CC_ENUM_SPACE_: if (! (to_complement ^ cBOOL(is_XPERLSPACE_high(locinput)))) { sayNO; } break; - case _CC_ENUM_BLANK: + case CC_ENUM_BLANK_: if (! (to_complement ^ cBOOL(is_HORIZWS_high(locinput)))) { sayNO; } break; - case _CC_ENUM_XDIGIT: + case CC_ENUM_XDIGIT_: if (! (to_complement ^ cBOOL(is_XDIGIT_high(locinput)))) { sayNO; } break; - case _CC_ENUM_VERTSPACE: + case CC_ENUM_VERTSPACE_: if (! (to_complement ^ cBOOL(is_VERTWS_high(locinput)))) { sayNO; } break; - case _CC_ENUM_CNTRL: /* These can't match above Latin1 */ - case _CC_ENUM_ASCII: + case CC_ENUM_CNTRL_: /* These can't match above Latin1 */ + case CC_ENUM_ASCII_: if (! to_complement) { sayNO; } @@ -7740,29 +7932,29 @@ S_regmatch(pTHX_ regmatch_info *reginfo, const U8 *fold_array; UV utf8_fold_flags; - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; - folder = foldEQ_locale; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; + folder = Perl_foldEQ_locale; fold_array = PL_fold_locale; type = REFFL; utf8_fold_flags = FOLDEQ_LOCALE; goto do_nref; case REFFAN: /* /\g{name}/iaa */ - folder = foldEQ_latin1; + folder = Perl_foldEQ_latin1; fold_array = PL_fold_latin1; type = REFFA; utf8_fold_flags = FOLDEQ_UTF8_NOMIX_ASCII; goto do_nref; case REFFUN: /* /\g{name}/iu */ - folder = foldEQ_latin1; + folder = Perl_foldEQ_latin1; fold_array = PL_fold_latin1; type = REFFU; utf8_fold_flags = 0; goto do_nref; case REFFN: /* /\g{name}/i */ - folder = foldEQ; + folder = Perl_foldEQ; fold_array = PL_fold; type = REFF; utf8_fold_flags = 0; @@ -7785,30 +7977,32 @@ S_regmatch(pTHX_ regmatch_info *reginfo, goto do_nref_ref_common; case REFFL: /* /\1/il */ - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; - folder = foldEQ_locale; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; + folder = Perl_foldEQ_locale; fold_array = PL_fold_locale; utf8_fold_flags = FOLDEQ_LOCALE; goto do_ref; case REFFA: /* /\1/iaa */ - folder = foldEQ_latin1; + folder = Perl_foldEQ_latin1; fold_array = PL_fold_latin1; utf8_fold_flags = FOLDEQ_UTF8_NOMIX_ASCII; goto do_ref; case REFFU: /* /\1/iu */ - folder = foldEQ_latin1; + folder = Perl_foldEQ_latin1; fold_array = PL_fold_latin1; utf8_fold_flags = 0; goto do_ref; case REFF: /* /\1/i */ - folder = foldEQ; + folder = Perl_foldEQ; fold_array = PL_fold; utf8_fold_flags = 0; goto do_ref; +#undef ST +#define ST st->u.backref case REF: /* /\1/ */ folder = NULL; fold_array = NULL; @@ -7816,16 +8010,37 @@ S_regmatch(pTHX_ regmatch_info *reginfo, do_ref: type = OP(scan); - n = ARG(scan); /* which paren pair */ + n = ARG1u(scan); /* which paren pair */ + if (rex->logical_to_parno) { + n = rex->logical_to_parno[n]; + do { + if ( RXp_LASTPAREN(rex) < n || + RXp_OFFS_START(rex,n) == -1 || + RXp_OFFS_END(rex,n) == -1 + ) { + n = rex->parno_to_logical_next[n]; + } + else { + break; + } + } while(n); + + if (!n) /* this means there is nothing that matched */ + sayNO; + } do_nref_ref_common: - ln = rex->offs[n].start; - endref = rex->offs[n].end; reginfo->poscache_iter = reginfo->poscache_maxiter; /* Void cache */ - if (rex->lastparen < n || ln == -1 || endref == -1) + if (RXp_LASTPAREN(rex) < n) + sayNO; + + ln = RXp_OFFSp(rex)[n].start; + endref = RXp_OFFSp(rex)[n].end; + if (ln == -1 || endref == -1) sayNO; /* Do not match unless seen CLOSEn. */ + if (ln == endref) - break; + goto ref_yes; s = reginfo->strbeg + ln; if (type != REF /* REF can do byte comparison */ @@ -7844,7 +8059,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, sayNO; } locinput = limit; - break; + goto ref_yes; } /* Not utf8: Inline the first character, for speed. */ @@ -7861,11 +8076,29 @@ S_regmatch(pTHX_ regmatch_info *reginfo, sayNO; if (ln > 1 && (type == REF ? memNE(s, locinput, ln) - : ! folder(locinput, s, ln))) + : ! folder(aTHX_ locinput, s, ln))) sayNO; locinput += ln; - break; } + ref_yes: + if (FLAGS(scan)) { /* == VOLATILE_REF but only other value is 0 */ + ST.cp = regcppush(rex, ARG2u(scan) - 1, maxopenparen); + REGCP_SET(ST.lastcp); + PUSH_STATE_GOTO(REF_next, next, locinput, loceol, + script_run_begin); + } + break; + NOT_REACHED; /* NOTREACHED */ + + case REF_next: + sayYES; + break; + + case REF_next_fail: + REGCP_UNWIND(ST.lastcp); + regcppop(rex, &maxopenparen); + sayNO; + break; case NOTHING: /* null op; e.g. the 'nothing' following * the '*' in m{(a+|b)*}' */ @@ -7886,7 +8119,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, U32 arg; case GOSUB: /* /(...(?1))/ /(...(?&foo))/ */ - arg= (U32)ARG(scan); + arg = ARG1u(scan); if (cur_eval && cur_eval->locinput == locinput) { if ( ++nochange_depth > max_nochange_depth ) Perl_croak(aTHX_ @@ -7898,7 +8131,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, re_sv = rex_sv; re = rex; rei = rexi; - startpoint = scan + ARG2L(scan); + startpoint = scan + ARG2i(scan); EVAL_CLOSE_PAREN_SET( st, arg ); /* Detect infinite recursion * @@ -7953,13 +8186,13 @@ S_regmatch(pTHX_ regmatch_info *reginfo, CV *newcv; /* save *all* paren positions */ - regcppush(rex, 0, maxopenparen); + ST.cp = regcppush(rex, 0, maxopenparen); REGCP_SET(ST.lastcp); if (!caller_cv) caller_cv = find_runcv(NULL); - n = ARG(scan); + n = ARG1u(scan); if (rexi->data->what[n] == 'r') { /* code from an external qr */ newcv = (ReANY( @@ -8084,7 +8317,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, DEBUG_STATE_r( Perl_re_printf( aTHX_ " re EVAL PL_op=0x%" UVxf "\n", PTR2UV(nop)) ); - rex->offs[0].end = locinput - reginfo->strbeg; + RXp_OFFSp(rex)[0].end = locinput - reginfo->strbeg; if (reginfo->info_aux_eval->pos_magic) MgBYTEPOS_set(reginfo->info_aux_eval->pos_magic, reginfo->sv, reginfo->strbeg, @@ -8118,7 +8351,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, PL_op = NULL; re_sv = NULL; - if (logical == 0) { /* (?{})/ */ + if (logical == 0) { /* /(?{ ... })/ and /(*{ ... })/ */ SV *replsv = save_scalar(PL_replgv); sv_setsv(replsv, ret); /* $^R */ SvSETMAGIC(replsv); @@ -8127,7 +8360,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, sw = cBOOL(SvTRUE_NN(ret)); logical = 0; } - else { /* /(??{}) */ + else { /* /(??{ ... }) */ /* if its overloaded, let the regex compiler handle * it; otherwise extract regex, or stringify */ if (SvGMAGICAL(ret)) @@ -8170,7 +8403,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, } } - /* only /(??{})/ from now on */ + /* only /(??{ ... })/ from now on */ logical = 0; { /* extract RE object from returned value; compiling if @@ -8195,11 +8428,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, /* if we got here, it should be an engine which * supports compiling code blocks and stuff */ assert(rex->engine && rex->engine->op_comp); - assert(!(scan->flags & ~RXf_PMf_COMPILETIME)); + assert(!(FLAGS(scan) & ~RXf_PMf_COMPILETIME)); re_sv = rex->engine->op_comp(aTHX_ &ret, 1, NULL, rex->engine, NULL, NULL, /* copy /msixn etc to inner pattern */ - ARG2L(scan), + ARG2i(scan), pm_flags); if (!(SvFLAGS(ret) @@ -8215,12 +8448,12 @@ S_regmatch(pTHX_ regmatch_info *reginfo, re = ReANY(re_sv); } RXp_MATCH_COPIED_off(re); - re->subbeg = rex->subbeg; - re->sublen = rex->sublen; - re->suboffset = rex->suboffset; - re->subcoffset = rex->subcoffset; - re->lastparen = 0; - re->lastcloseparen = 0; + RXp_SUBBEG(re) = RXp_SUBBEG(rex); + RXp_SUBLEN(re) = RXp_SUBLEN(rex); + RXp_SUBOFFSET(re) = RXp_SUBOFFSET(rex); + RXp_SUBCOFFSET(re) = RXp_SUBCOFFSET(rex); + RXp_LASTPAREN(re) = 0; + RXp_LASTCLOSEPAREN(re) = 0; rei = RXi_GET(re); DEBUG_EXECUTE_r( debug_start_match(re_sv, utf8_target, locinput, @@ -8230,9 +8463,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, EVAL_CLOSE_PAREN_CLEAR(st); /* ST.close_paren = 0; * close_paren only for GOSUB */ ST.prev_recurse_locinput= NULL; /* only used for GOSUB */ - /* Save all the seen positions so far. */ + + /* note we saved the paren state earlier: ST.cp = regcppush(rex, 0, maxopenparen); REGCP_SET(ST.lastcp); + */ /* and set maxopenparen to 0, since we are starting a "fresh" match */ maxopenparen = 0; /* run the pattern returned from (??{...}) */ @@ -8322,6 +8557,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case EVAL_B_fail: /* unsuccessful B in (?{...})B */ REGCP_UNWIND(ST.lastcp); + regcppop(rex, &maxopenparen); sayNO; case EVAL_postponed_AB_fail: /* unsuccessfully ran A or B in (??{A})B */ @@ -8354,17 +8590,17 @@ S_regmatch(pTHX_ regmatch_info *reginfo, #undef ST case OPEN: /* ( */ - n = ARG(scan); /* which paren pair */ - rex->offs[n].start_tmp = locinput - reginfo->strbeg; + n = PARNO(scan); /* which paren pair */ + RXp_OFFSp(rex)[n].start_tmp = locinput - reginfo->strbeg; if (n > maxopenparen) maxopenparen = n; DEBUG_BUFFERS_r(Perl_re_exec_indentf( aTHX_ "OPEN: rex=0x%" UVxf " offs=0x%" UVxf ": \\%" UVuf ": set %" IVdf " tmp; maxopenparen=%" UVuf "\n", depth, PTR2UV(rex), - PTR2UV(rex->offs), + PTR2UV(RXp_OFFSp(rex)), (UV)n, - (IV)rex->offs[n].start_tmp, + (IV)RXp_OFFSp(rex)[n].start_tmp, (UV)maxopenparen )); lastopen = n; @@ -8376,8 +8612,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case CLOSE: /* ) */ - n = ARG(scan); /* which paren pair */ - CLOSE_CAPTURE(n, rex->offs[n].start_tmp, + n = PARNO(scan); /* which paren pair */ + CLOSE_CAPTURE(rex, n, RXp_OFFSp(rex)[n].start_tmp, locinput - reginfo->strbeg); if ( EVAL_CLOSE_PAREN_IS( cur_eval, n ) ) goto fake_end; @@ -8396,28 +8632,31 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case ACCEPT: /* (*ACCEPT) */ is_accepted = true; - if (scan->flags) - sv_yes_mark = MUTABLE_SV(rexi->data->data[ ARG( scan ) ]); - utmp = (U32)ARG2L(scan); + if (FLAGS(scan)) + sv_yes_mark = MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]); + utmp = ARG2u(scan); if ( utmp ) { regnode *cursor; for ( cursor = scan; cursor && ( OP(cursor) != END ); - cursor = ( PL_regkind[ OP(cursor) ] == END ) - ? NEXTOPER(cursor) + cursor = ( + REGNODE_TYPE( OP(cursor) ) == END + || REGNODE_TYPE( OP(cursor) ) == WHILEM + ) + ? REGNODE_AFTER(cursor) : regnext(cursor) ){ if ( OP(cursor) != CLOSE ) continue; - n = ARG(cursor); + n = PARNO(cursor); if ( n > lastopen ) /* might be OPEN/CLOSE in the way */ continue; /* so skip this one */ - CLOSE_CAPTURE(n, rex->offs[n].start_tmp, + CLOSE_CAPTURE(rex, n, RXp_OFFSp(rex)[n].start_tmp, locinput - reginfo->strbeg); if ( n == utmp || EVAL_CLOSE_PAREN_IS(cur_eval, n) ) @@ -8428,8 +8667,8 @@ S_regmatch(pTHX_ regmatch_info *reginfo, /* NOTREACHED */ case GROUPP: /* (?(1)) */ - n = ARG(scan); /* which paren pair */ - sw = cBOOL(rex->lastparen >= n && rex->offs[n].end != -1); + n = ARG1u(scan); /* which paren pair */ + sw = cBOOL(RXp_LASTPAREN(rex) >= n && RXp_OFFS_END(rex,n) != -1); break; case GROUPPN: /* (?()) */ @@ -8438,7 +8677,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, break; case INSUBP: /* (?(R)) */ - n = ARG(scan); + n = ARG1u(scan); /* this does not need to use EVAL_CLOSE_PAREN macros, as the arg * of SCAN is already set up as matches a eval.close_paren */ sw = cur_eval && (n == 0 || CUR_EVAL.close_paren == n); @@ -8451,16 +8690,16 @@ S_regmatch(pTHX_ regmatch_info *reginfo, case IFTHEN: /* (?(cond)A|B) */ reginfo->poscache_iter = reginfo->poscache_maxiter; /* Void cache */ if (sw) - next = NEXTOPER(NEXTOPER(scan)); + next = REGNODE_AFTER_type(scan,tregnode_IFTHEN); else { - next = scan + ARG(scan); + next = scan + ARG1u(scan); if (OP(next) == IFTHEN) /* Fake one. */ - next = NEXTOPER(NEXTOPER(next)); + next = REGNODE_AFTER_type(next,tregnode_IFTHEN); } break; case LOGICAL: /* modifier for EVAL and IFMATCH */ - logical = scan->flags; + logical = FLAGS(scan) & EVAL_FLAGS_MASK; /* reserve a bit for optimistic eval */ break; /******************************************************************* @@ -8551,16 +8790,16 @@ NULL case CURLYX: /* start of /A*B/ (for complex A) */ { /* No need to save/restore up to this paren */ - I32 parenfloor = scan->flags; + I32 parenfloor = FLAGS(scan); assert(next); /* keep Coverity happy */ - if (OP(PREVOPER(next)) == NOTHING) /* LONGJMP */ - next += ARG(next); + if (OP(REGNODE_BEFORE(next)) == NOTHING) /* LONGJMP */ + next += ARG1u(next); /* XXXX Probably it is better to teach regpush to support parenfloor > maxopenparen ... */ - if (parenfloor > (I32)rex->lastparen) - parenfloor = rex->lastparen; /* Pessimization... */ + if (parenfloor > (I32)RXp_LASTPAREN(rex)) + parenfloor = RXp_LASTPAREN(rex); /* Pessimization... */ ST.prev_curlyx= cur_curlyx; cur_curlyx = st; @@ -8576,7 +8815,7 @@ NULL ST.count = -1; /* this will be updated by WHILEM */ ST.lastloc = NULL; /* this will be updated by WHILEM */ - PUSH_YES_STATE_GOTO(CURLYX_end, PREVOPER(next), locinput, loceol, + PUSH_YES_STATE_GOTO(CURLYX_end, REGNODE_BEFORE(next), locinput, loceol, script_run_begin); NOT_REACHED; /* NOTREACHED */ } @@ -8601,25 +8840,26 @@ NULL /* see the discussion above about CURLYX/WHILEM */ I32 n; int min, max; + /* U16 first_paren, last_paren; */ regnode *A; assert(cur_curlyx); /* keep Coverity happy */ - min = ARG1(cur_curlyx->u.curlyx.me); - max = ARG2(cur_curlyx->u.curlyx.me); - A = NEXTOPER(cur_curlyx->u.curlyx.me) + EXTRA_STEP_2ARGS; + min = ARG1i(cur_curlyx->u.curlyx.me); + max = ARG2i(cur_curlyx->u.curlyx.me); + /* first_paren = ARG3a(cur_curlyx->u.curlyx.me); */ + /* last_paren = ARG3b(cur_curlyx->u.curlyx.me); */ + A = REGNODE_AFTER(cur_curlyx->u.curlyx.me); n = ++cur_curlyx->u.curlyx.count; /* how many A's matched */ ST.save_lastloc = cur_curlyx->u.curlyx.lastloc; ST.cache_offset = 0; ST.cache_mask = 0; - DEBUG_EXECUTE_r( Perl_re_exec_indentf( aTHX_ "WHILEM: matched %ld out of %d..%d\n", depth, (long)n, min, max) ); /* First just match a string of min A's. */ - if (n < min) { ST.cp = regcppush(rex, cur_curlyx->u.curlyx.parenfloor, maxopenparen); cur_curlyx->u.curlyx.lastloc = locinput; @@ -8644,7 +8884,7 @@ NULL * The idea here is that for certain types of CURLYX/WHILEM - * principally those whose upper bound is infinity (and * excluding regexes that have things like \1 and other very - * non-regular expresssiony things), then if a pattern like + * non-regular expressiony things), then if a pattern like * /....A*.../ fails and we backtrack to the WHILEM, then we * make a note that this particular WHILEM op was at string * position 47 (say) when the rest of pattern failed. Then, if @@ -8665,20 +8905,20 @@ NULL * op (string-length x #WHILEMs) times do we allocate the * cache. * - * The top 4 bits of scan->flags byte say how many different + * The top 4 bits of FLAGS(scan) byte say how many different * relevant CURLLYX/WHILEM op pairs there are, while the * bottom 4-bits is the identifying index number of this * WHILEM. */ - if (scan->flags) { + if (FLAGS(scan)) { if (!reginfo->poscache_maxiter) { /* start the countdown: Postpone detection until we * know the match is not *that* much linear. */ reginfo->poscache_maxiter = (reginfo->strend - reginfo->strbeg + 1) - * (scan->flags>>4); + * (FLAGS(scan)>>4); /* possible overflow for long strings and many CURLYX's */ if (reginfo->poscache_maxiter < 0) reginfo->poscache_maxiter = I32_MAX; @@ -8711,9 +8951,9 @@ NULL SSize_t offset, mask; reginfo->poscache_iter = -1; /* stop eventual underflow */ - offset = (scan->flags & 0xf) - 1 + offset = (FLAGS(scan) & 0xf) - 1 + (locinput - reginfo->strbeg) - * (scan->flags>>4); + * (FLAGS(scan)>>4); mask = 1 << (offset % 8); offset /= 8; if (reginfo->info_aux->poscache[offset] & mask) { @@ -8782,18 +9022,8 @@ NULL DEBUG_EXECUTE_r(Perl_re_exec_indentf( aTHX_ "WHILEM: failed, trying continuation...\n", depth) ); - do_whilem_B_max: - if (cur_curlyx->u.curlyx.count >= REG_INFTY - && ckWARN(WARN_REGEXP) - && !reginfo->warned) - { - reginfo->warned = TRUE; - Perl_warner(aTHX_ packWARN(WARN_REGEXP), - "Complex regular subexpression recursion limit (%d) " - "exceeded", - REG_INFTY - 1); - } + do_whilem_B_max: /* now try B */ ST.save_curlyx = cur_curlyx; cur_curlyx = cur_curlyx->u.curlyx.prev_curlyx; @@ -8804,18 +9034,8 @@ NULL case WHILEM_B_min_fail: /* just failed to match B in a minimal match */ cur_curlyx = ST.save_curlyx; - if (cur_curlyx->u.curlyx.count >= /*max*/ARG2(cur_curlyx->u.curlyx.me)) { + if (cur_curlyx->u.curlyx.count >= /*max*/ARG2i(cur_curlyx->u.curlyx.me)) { /* Maximum greed exceeded */ - if (cur_curlyx->u.curlyx.count >= REG_INFTY - && ckWARN(WARN_REGEXP) - && !reginfo->warned) - { - reginfo->warned = TRUE; - Perl_warner(aTHX_ packWARN(WARN_REGEXP), - "Complex regular subexpression recursion " - "limit (%d) exceeded", - REG_INFTY - 1); - } cur_curlyx->u.curlyx.count--; CACHEsayNO; } @@ -8824,11 +9044,10 @@ NULL ); /* Try grabbing another A and see if it helps. */ cur_curlyx->u.curlyx.lastloc = locinput; - ST.cp = regcppush(rex, cur_curlyx->u.curlyx.parenfloor, - maxopenparen); + ST.cp = regcppush(rex, cur_curlyx->u.curlyx.parenfloor, maxopenparen); REGCP_SET(ST.lastcp); PUSH_STATE_GOTO(WHILEM_A_min, - /*A*/ NEXTOPER(ST.save_curlyx->u.curlyx.me) + EXTRA_STEP_2ARGS, + /*A*/ REGNODE_AFTER(ST.save_curlyx->u.curlyx.me), locinput, loceol, script_run_begin); NOT_REACHED; /* NOTREACHED */ @@ -8836,18 +9055,28 @@ NULL #define ST st->u.branch case BRANCHJ: /* /(...|A|...)/ with long next pointer */ - next = scan + ARG(scan); + next = scan + ARG1u(scan); if (next == scan) next = NULL; - scan = NEXTOPER(scan); - /* FALLTHROUGH */ + ST.before_paren = ARG2a(scan); + ST.after_paren = ARG2b(scan); + goto branch_logic; + NOT_REACHED; /* NOTREACHED */ case BRANCH: /* /(...|A|...)/ */ - scan = NEXTOPER(scan); /* scan now points to inner node */ - ST.lastparen = rex->lastparen; - ST.lastcloseparen = rex->lastcloseparen; + ST.before_paren = ARG1a(scan); + ST.after_paren = ARG1b(scan); + branch_logic: + scan = REGNODE_AFTER_opcode(scan,state_num); /* scan now points to inner node */ + assert(scan); + ST.lastparen = RXp_LASTPAREN(rex); + ST.lastcloseparen = RXp_LASTCLOSEPAREN(rex); ST.next_branch = next; REGCP_SET(ST.cp); + if (RE_PESSIMISTIC_PARENS) { + regcppush(rex, 0, maxopenparen); + REGCP_SET(ST.lastcp); + } /* Now go into the branch */ if (has_cutgroup) { @@ -8860,8 +9089,8 @@ NULL NOT_REACHED; /* NOTREACHED */ case CUTGROUP: /* /(*THEN)/ */ - sv_yes_mark = st->u.mark.mark_name = scan->flags - ? MUTABLE_SV(rexi->data->data[ ARG( scan ) ]) + sv_yes_mark = st->u.mark.mark_name = FLAGS(scan) + ? MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]) : NULL; PUSH_STATE_GOTO(CUTGROUP_next, next, locinput, loceol, script_run_begin); @@ -8884,8 +9113,13 @@ NULL do_cutgroup = 0; no_final = 0; } + if (RE_PESSIMISTIC_PARENS) { + REGCP_UNWIND(ST.lastcp); + regcppop(rex,&maxopenparen); + } REGCP_UNWIND(ST.cp); UNWIND_PAREN(ST.lastparen, ST.lastcloseparen); + CAPTURE_CLEAR(ST.before_paren+1, ST.after_paren, "BRANCH_next_fail"); scan = ST.next_branch; /* no more branches? */ if (!scan || (OP(scan) != BRANCH && OP(scan) != BRANCHJ)) { @@ -8916,14 +9150,14 @@ NULL */ ST.me = scan; - scan = NEXTOPER(scan) + NODE_STEP_REGNODE; + scan = REGNODE_AFTER_type(scan, tregnode_CURLYM); - ST.lastparen = rex->lastparen; - ST.lastcloseparen = rex->lastcloseparen; + ST.lastparen = RXp_LASTPAREN(rex); + ST.lastcloseparen = RXp_LASTCLOSEPAREN(rex); /* if paren positive, emulate an OPEN/CLOSE around A */ - if (ST.me->flags) { - U32 paren = ST.me->flags; + if (FLAGS(ST.me)) { + U32 paren = FLAGS(ST.me); lastopen = paren; if (paren > maxopenparen) maxopenparen = paren; @@ -8938,7 +9172,7 @@ NULL ST.Binfo.count = -1; REGCP_SET(ST.cp); - if (!(ST.minmod ? ARG1(ST.me) : ARG2(ST.me))) /* min/max */ + if (!(ST.minmod ? ARG1i(ST.me) : ARG2i(ST.me))) /* min/max */ goto curlym_do_B; curlym_do_A: /* execute the A in /A{m,n}B/ */ @@ -8961,19 +9195,27 @@ NULL ST.alen = locinput - st->locinput; } if (ST.alen == 0) - ST.count = ST.minmod ? ARG1(ST.me) : ARG2(ST.me); + ST.count = ST.minmod ? ARG1i(ST.me) : ARG2i(ST.me); } DEBUG_EXECUTE_r( Perl_re_exec_indentf( aTHX_ "CURLYM now matched %" IVdf " times, len=%" IVdf "...\n", depth, (IV) ST.count, (IV)ST.alen) ); - if (EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)ST.me->flags)) + if (FLAGS(ST.me)) { + /* emulate CLOSE: mark current A as captured */ + U32 paren = (U32)FLAGS(ST.me); + CLOSE_CAPTURE(rex, paren, + HOPc(locinput, -ST.alen) - reginfo->strbeg, + locinput - reginfo->strbeg); + } + + if (EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)FLAGS(ST.me))) goto fake_end; if (!is_accepted) { - I32 max = (ST.minmod ? ARG1(ST.me) : ARG2(ST.me)); + I32 max = (ST.minmod ? ARG1i(ST.me) : ARG2i(ST.me)); if ( max == REG_INFTY || ST.count < max ) goto curlym_do_A; /* try to match another A */ } @@ -8983,8 +9225,8 @@ NULL REGCP_UNWIND(ST.cp); - if (ST.minmod || ST.count < ARG1(ST.me) /* min*/ - || EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)ST.me->flags)) + if (ST.minmod || ST.count < ARG1i(ST.me) /* min*/ + || EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)FLAGS(ST.me))) sayNO; curlym_do_B: /* execute the B in /A{m,n}B/ */ @@ -8998,7 +9240,7 @@ NULL regnode *text_node = ST.B; if (! HAS_TEXT(text_node)) FIND_NEXT_IMPT(text_node); - if (PL_regkind[OP(text_node)] == EXACT) { + if (REGNODE_TYPE(OP(text_node)) == EXACT) { if (! S_setup_EXACTISH_ST(aTHX_ text_node, &ST.Binfo, reginfo)) { @@ -9033,17 +9275,18 @@ NULL } curlym_close_B: - if (ST.me->flags) { + if (FLAGS(ST.me)) { /* emulate CLOSE: mark current A as captured */ - U32 paren = (U32)ST.me->flags; + U32 paren = (U32)FLAGS(ST.me); if (ST.count || is_accepted) { - CLOSE_CAPTURE(paren, + CLOSE_CAPTURE(rex, paren, HOPc(locinput, -ST.alen) - reginfo->strbeg, locinput - reginfo->strbeg); } else - rex->offs[paren].end = -1; - if (EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)ST.me->flags)) + RXp_OFFSp(rex)[paren].end = -1; + + if (EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)FLAGS(ST.me))) { if (ST.count || is_accepted) goto fake_end; @@ -9063,13 +9306,13 @@ NULL REGCP_UNWIND(ST.cp); UNWIND_PAREN(ST.lastparen, ST.lastcloseparen); if (ST.minmod) { - I32 max = ARG2(ST.me); + I32 max = ARG2i(ST.me); if (max != REG_INFTY && ST.count == max) sayNO; goto curlym_do_A; /* try to match a further A */ } /* backtrack one A */ - if (ST.count == ARG1(ST.me) /* min */) + if (ST.count == ARG1i(ST.me) /* min */) sayNO; ST.count--; SET_locinput(HOPc(locinput, -ST.alen)); @@ -9078,42 +9321,42 @@ NULL #undef ST #define ST st->u.curly -#define CURLY_SETPAREN(paren, success) \ - if (paren) { \ - if (success) { \ - CLOSE_CAPTURE(paren, HOPc(locinput, -1) - reginfo->strbeg, \ - locinput - reginfo->strbeg); \ - } \ - else { \ - rex->offs[paren].end = -1; \ - rex->lastparen = ST.lastparen; \ - rex->lastcloseparen = ST.lastcloseparen; \ - } \ +#define CURLY_SETPAREN(paren, success) \ + if (paren) { \ + if (success) { \ + CLOSE_CAPTURE(rex, paren, HOPc(locinput, -1) - reginfo->strbeg, \ + locinput - reginfo->strbeg); \ + } \ + else { \ + RXp_OFFSp(rex)[paren].end = -1; \ + RXp_LASTPAREN(rex) = ST.lastparen; \ + RXp_LASTCLOSEPAREN(rex) = ST.lastcloseparen; \ + } \ } case STAR: /* /A*B/ where A is width 1 char */ ST.paren = 0; ST.min = 0; ST.max = REG_INFTY; - scan = NEXTOPER(scan); + scan = REGNODE_AFTER_type(scan,tregnode_STAR); goto repeat; case PLUS: /* /A+B/ where A is width 1 char */ ST.paren = 0; ST.min = 1; ST.max = REG_INFTY; - scan = NEXTOPER(scan); + scan = REGNODE_AFTER_type(scan,tregnode_PLUS); goto repeat; case CURLYN: /* /(A){m,n}B/ where A is width 1 char */ - ST.paren = scan->flags; /* Which paren to set */ - ST.lastparen = rex->lastparen; - ST.lastcloseparen = rex->lastcloseparen; + ST.paren = FLAGS(scan); /* Which paren to set */ + ST.lastparen = RXp_LASTPAREN(rex); + ST.lastcloseparen = RXp_LASTCLOSEPAREN(rex); if (ST.paren > maxopenparen) maxopenparen = ST.paren; - ST.min = ARG1(scan); /* min to match */ - ST.max = ARG2(scan); /* max to match */ - scan = regnext(NEXTOPER(scan) + NODE_STEP_REGNODE); + ST.min = ARG1i(scan); /* min to match */ + ST.max = ARG2i(scan); /* max to match */ + scan = regnext(REGNODE_AFTER_type(scan, tregnode_CURLYN)); /* handle the single-char capture called as a GOSUB etc */ if (EVAL_CLOSE_PAREN_IS_TRUE(cur_eval,(U32)ST.paren)) @@ -9129,9 +9372,9 @@ NULL case CURLY: /* /A{m,n}B/ where A is width 1 char */ ST.paren = 0; - ST.min = ARG1(scan); /* min to match */ - ST.max = ARG2(scan); /* max to match */ - scan = NEXTOPER(scan) + NODE_STEP_REGNODE; + ST.min = ARG1i(scan); /* min to match */ + ST.max = ARG2i(scan); /* max to match */ + scan = REGNODE_AFTER_type(scan, tregnode_CURLY); repeat: /* * Lookahead to avoid useless match attempts @@ -9155,7 +9398,7 @@ NULL if (! HAS_TEXT(text_node)) ST.Binfo.count = 0; else { - if ( PL_regkind[OP(text_node)] != EXACT ) { + if ( REGNODE_TYPE(OP(text_node)) != EXACT ) { ST.Binfo.count = 0; } else { @@ -9213,12 +9456,15 @@ NULL /* avoid taking address of locinput, so it can remain * a register var */ char *li = locinput; - ST.count = regrepeat(rex, &li, ST.A, loceol, reginfo, ST.max); + if (ST.max) + ST.count = regrepeat(rex, &li, ST.A, loceol, reginfo, ST.max); + else + ST.count = 0; if (ST.count < ST.min) sayNO; SET_locinput(li); if ((ST.count > ST.min) - && (PL_regkind[OP(ST.B)] == EOL) && (OP(ST.B) != MEOL)) + && (REGNODE_TYPE(OP(ST.B)) == EOL) && (OP(ST.B) != MEOL)) { /* A{m,n} must come at the end of the string, there's * no point in backing off ... */ @@ -9236,7 +9482,10 @@ NULL case CURLY_B_min_fail: /* failed to find B in a non-greedy match. */ - + if (RE_PESSIMISTIC_PARENS) { + REGCP_UNWIND(ST.lastcp); + regcppop(rex, &maxopenparen); /* Restore some previous $s? */ + } REGCP_UNWIND(ST.cp); if (ST.paren) { UNWIND_PAREN(ST.lastparen, ST.lastcloseparen); @@ -9349,6 +9598,10 @@ NULL } curly_try_B_min: + if (RE_PESSIMISTIC_PARENS) { + (void)regcppush(rex, 0, maxopenparen); + REGCP_SET(ST.lastcp); + } CURLY_SETPAREN(ST.paren, ST.count); PUSH_STATE_GOTO(CURLY_B_min, ST.B, locinput, loceol, script_run_begin); @@ -9362,16 +9615,26 @@ NULL && locinput + ST.Binfo.min_length <= loceol && S_test_EXACTISH_ST(locinput, ST.Binfo))) { + if (RE_PESSIMISTIC_PARENS) { + (void)regcppush(rex, 0, maxopenparen); + REGCP_SET(ST.lastcp); + } CURLY_SETPAREN(ST.paren, ST.count); PUSH_STATE_GOTO(CURLY_B_max, ST.B, locinput, loceol, script_run_begin); NOT_REACHED; /* NOTREACHED */ } - /* FALLTHROUGH */ + goto CURLY_B_all_failed; + NOT_REACHED; /* NOTREACHED */ case CURLY_B_max_fail: /* failed to find B in a greedy match */ + if (RE_PESSIMISTIC_PARENS) { + REGCP_UNWIND(ST.lastcp); + regcppop(rex, &maxopenparen); /* Restore some previous $s? */ + } + CURLY_B_all_failed: REGCP_UNWIND(ST.cp); if (ST.paren) { UNWIND_PAREN(ST.lastparen, ST.lastcloseparen); @@ -9475,10 +9738,10 @@ NULL ST.wanted = 1; ifmatch_trivial_fail_test: ST.prev_match_end= match_end; - ST.count = scan->next_off + 1; /* next_off repurposed to be + ST.count = NEXT_OFF(scan) + 1; /* next_off repurposed to be lookbehind count, requires non-zero flags */ - if (! scan->flags) { /* 'flags' zero means lookahed */ + if (! FLAGS(scan)) { /* 'flags' zero means lookahed */ /* Lookahead starts here and ends at the normal place */ ST.start = locinput; @@ -9486,7 +9749,7 @@ NULL match_end = NULL; } else { - PERL_UINT_FAST8_T back_count = scan->flags; + PERL_UINT_FAST8_T back_count = FLAGS(scan); char * s; match_end = locinput; @@ -9514,7 +9777,7 @@ NULL sayNO; /* Here, we didn't want it to match, so is actually success */ - next = scan + ARG(scan); + next = scan + ARG1u(scan); if (next == scan) next = NULL; break; @@ -9526,7 +9789,7 @@ NULL logical = 0; /* XXX: reset state of logical once it has been saved into ST */ /* execute body of (?...A) */ - PUSH_YES_STATE_GOTO(IFMATCH_A, NEXTOPER(NEXTOPER(scan)), ST.start, + PUSH_YES_STATE_GOTO(IFMATCH_A, REGNODE_AFTER(scan), ST.start, ST.end, script_run_begin); NOT_REACHED; /* NOTREACHED */ @@ -9564,7 +9827,7 @@ NULL loceol = st->loceol; script_run_begin = st->sr0; } - scan = ST.me + ARG(ST.me); + scan = ST.me + ARG1u(ST.me); if (scan == ST.me) scan = NULL; continue; /* execute B */ @@ -9574,7 +9837,7 @@ NULL case LONGJMP: /* alternative with many branches compiles to * (BRANCHJ; EXACT ...; LONGJMP ) x N */ - next = scan + ARG(scan); + next = scan + ARG1u(scan); if (next == scan) next = NULL; break; @@ -9584,8 +9847,8 @@ NULL /* FALLTHROUGH */ case PRUNE: /* (*PRUNE) */ - if (scan->flags) - sv_yes_mark = sv_commit = MUTABLE_SV(rexi->data->data[ ARG( scan ) ]); + if (FLAGS(scan)) + sv_yes_mark = sv_commit = MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]); PUSH_STATE_GOTO(COMMIT_next, next, locinput, loceol, script_run_begin); NOT_REACHED; /* NOTREACHED */ @@ -9597,8 +9860,8 @@ NULL NOT_REACHED; /* NOTREACHED */ case OPFAIL: /* (*FAIL) */ - if (scan->flags) - sv_commit = MUTABLE_SV(rexi->data->data[ ARG( scan ) ]); + if (FLAGS(scan)) + sv_commit = MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]); if (logical) { /* deal with (?(?!)X|Y) properly, * make sure we trigger the no branch @@ -9614,7 +9877,7 @@ NULL case MARKPOINT: /* (*MARK:foo) */ ST.prev_mark = mark_state; ST.mark_name = sv_commit = sv_yes_mark - = MUTABLE_SV(rexi->data->data[ ARG( scan ) ]); + = MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]); mark_state = st; ST.mark_loc = locinput; PUSH_YES_STATE_GOTO(MARKPOINT_next, next, locinput, loceol, @@ -9647,7 +9910,7 @@ NULL NOT_REACHED; /* NOTREACHED */ case SKIP: /* (*SKIP) */ - if (!scan->flags) { + if (!FLAGS(scan)) { /* (*SKIP) : if we fail we cut here*/ ST.mark_name = NULL; ST.mark_loc = locinput; @@ -9658,7 +9921,7 @@ NULL otherwise do nothing. Meaning we need to scan */ regmatch_state *cur = mark_state; - SV *find = MUTABLE_SV(rexi->data->data[ ARG( scan ) ]); + SV *find = MUTABLE_SV(rexi->data->data[ ARG1u( scan ) ]); while (cur) { if ( sv_eq( cur->u.mark.mark_name, @@ -9753,7 +10016,7 @@ NULL Perl_re_exec_indentf( aTHX_ "%4s #%-3d %-10s %s\n", depth, i ? " " : "push", - depth - i, PL_reg_name[cur->resume_state], + depth - i, REGNODE_NAME(cur->resume_state), (curyes == cur) ? "yes" : "" ); if (curyes == cur) @@ -9844,7 +10107,7 @@ NULL * When popping the save stack, all these locals would be undone; * bypass this by setting the outermost saved $^R to the latest * value */ - /* I dont know if this is needed or works properly now. + /* I don't know if this is needed or works properly now. * see code related to PL_replgv elsewhere in this file. * Yves */ @@ -9945,7 +10208,7 @@ NULL */ STATIC I32 S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p, - char * loceol, regmatch_info *const reginfo, I32 max _pDEPTH) + char * loceol, regmatch_info *const reginfo, I32 max comma_pDEPTH) { char *scan; /* Pointer to current position in target string */ I32 c; @@ -9953,7 +10216,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s I32 hardcount = 0; /* How many matches so far */ bool utf8_target = reginfo->is_utf8_target; unsigned int to_complement = 0; /* Invert the result? */ - _char_class_number classnum; + char_class_number_ classnum; PERL_ARGS_ASSERT_REGREPEAT; @@ -9993,6 +10256,8 @@ S_regrepeat(pTHX_ regexp *prog, char **s * count doesn't exceed the maximum permissible */ switch (with_t_UTF8ness(OP(p), utf8_target)) { + SV * anyofh_list; + case REG_ANY_t8: while (scan < this_eol && hardcount < max && *scan != '\n') { scan += UTF8SKIP(scan); @@ -10034,7 +10299,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s case EXACTFL_tb: case EXACTFLU8_t8: case EXACTFLU8_tb: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; /* FALLTHROUGH */ case EXACT_REQ8_t8: @@ -10137,7 +10402,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s * and the rest matched as well, but could have false positives */ do { - PERL_INT_FAST8_T i; + int i; U8 * matches = Binfo.matches; /* The first bytes were definitive. Look at the remaining */ @@ -10175,7 +10440,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s * there were no initial bytes that could rule out anything * definitively. Use brute force to examine all the possibilities */ while (scan < this_eol && hardcount < max) { - PERL_INT_FAST8_T i; + int i; U8 * matches = Binfo.matches; for (i = 0; i < Binfo.count; i++) { @@ -10198,8 +10463,8 @@ S_regrepeat(pTHX_ regexp *prog, char **s case ANYOFPOSIXL_t8: case ANYOFL_t8: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; - CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(p); + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; + CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(p); /* FALLTHROUGH */ case ANYOFD_t8: @@ -10215,13 +10480,13 @@ S_regrepeat(pTHX_ regexp *prog, char **s case ANYOFPOSIXL_tb: case ANYOFL_tb: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; - CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(p); + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; + CHECK_AND_WARN_NON_UTF8_CTYPE_LOCALE_IN_SETS(p); /* FALLTHROUGH */ case ANYOFD_tb: case ANYOF_tb: - if (ANYOF_FLAGS(p) & ~ ANYOF_MATCHES_ALL_ABOVE_BITMAP) { + if (ANYOF_FLAGS(p) || ANYOF_HAS_AUX(p)) { while ( scan < this_eol && reginclass(prog, p, (U8*)scan, (U8*)scan+1, 0)) scan++; @@ -10244,13 +10509,13 @@ S_regrepeat(pTHX_ regexp *prog, char **s case ANYOFM_tb: scan = (char *) find_span_end_mask((U8 *) scan, (U8 *) this_eol, - (U8) ARG(p), FLAGS(p)); + (U8) ARG1u(p), FLAGS(p)); break; case NANYOFM_t8: while ( hardcount < max && scan < this_eol - && (*scan & FLAGS(p)) != ARG(p)) + && (*scan & FLAGS(p)) != ARG1u(p)) { scan += UTF8SKIP(scan); hardcount++; @@ -10259,20 +10524,25 @@ S_regrepeat(pTHX_ regexp *prog, char **s case NANYOFM_tb: scan = (char *) find_next_masked((U8 *) scan, (U8 *) this_eol, - (U8) ARG(p), FLAGS(p)); + (U8) ARG1u(p), FLAGS(p)); break; case ANYOFH_tb: /* ANYOFH only can match UTF-8 targets */ case ANYOFHb_tb: + case ANYOFHbbm_tb: case ANYOFHr_tb: case ANYOFHs_tb: break; case ANYOFH_t8: + anyofh_list = GET_ANYOFH_INVLIST(prog, p); while ( hardcount < max && scan < this_eol && NATIVE_UTF8_TO_I8(*scan) >= ANYOF_FLAGS(p) - && reginclass(prog, p, (U8*)scan, (U8*) this_eol, TRUE)) + && _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) scan, + (U8 *) this_eol, + NULL))) { scan += UTF8SKIP(scan); hardcount++; @@ -10281,24 +10551,44 @@ S_regrepeat(pTHX_ regexp *prog, char **s case ANYOFHb_t8: /* we know the first byte must be the FLAGS field */ + anyofh_list = GET_ANYOFH_INVLIST(prog, p); while ( hardcount < max && scan < this_eol && (U8) *scan == ANYOF_FLAGS(p) - && reginclass(prog, p, (U8*)scan, (U8*) this_eol, TRUE)) + && _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) scan, + (U8 *) this_eol, + NULL))) { scan += UTF8SKIP(scan); hardcount++; } break; + case ANYOFHbbm_t8: + while ( hardcount < max + && scan + 1 < this_eol + && (U8) *scan == ANYOF_FLAGS(p) + && BITMAP_TEST(( (struct regnode_bbm *) p)->bitmap, + (U8) scan[1] & UTF_CONTINUATION_MASK)) + { + scan += 2; /* This node only matces 2-byte UTF-8 */ + hardcount++; + } + break; + case ANYOFHr_t8: + anyofh_list = GET_ANYOFH_INVLIST(prog, p); while ( hardcount < max && scan < this_eol && inRANGE(NATIVE_UTF8_TO_I8(*scan), LOWEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(p)), HIGHEST_ANYOF_HRx_BYTE(ANYOF_FLAGS(p))) && NATIVE_UTF8_TO_I8(*scan) >= ANYOF_FLAGS(p) - && reginclass(prog, p, (U8*)scan, (U8*) this_eol, TRUE)) + && _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) scan, + (U8 *) this_eol, + NULL))) { scan += UTF8SKIP(scan); hardcount++; @@ -10306,10 +10596,14 @@ S_regrepeat(pTHX_ regexp *prog, char **s break; case ANYOFHs_t8: + anyofh_list = GET_ANYOFH_INVLIST(prog, p); while ( hardcount < max && scan + FLAGS(p) < this_eol && memEQ(scan, ((struct regnode_anyofhs *) p)->string, FLAGS(p)) - && reginclass(prog, p, (U8*)scan, (U8*) this_eol, TRUE)) + && _invlist_contains_cp(anyofh_list, + utf8_to_uvchr_buf((U8 *) scan, + (U8 *) this_eol, + NULL))) { scan += UTF8SKIP(scan); hardcount++; @@ -10371,7 +10665,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s /* FALLTHROUGH */ case POSIXL_tb: - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; while ( scan < this_eol && to_complement ^ cBOOL(isFOO_lc(FLAGS(p), *scan))) { @@ -10408,7 +10702,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s /* FALLTHROUGH */ case POSIXA_tb: - while (scan < this_eol && _generic_isCC_A((U8) *scan, FLAGS(p))) { + while (scan < this_eol && generic_isCC_A_((U8) *scan, FLAGS(p))) { scan++; } break; @@ -10417,7 +10711,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s /* FALLTHROUGH */ case NPOSIXA_tb: - while (scan < this_eol && ! _generic_isCC_A((U8) *scan, FLAGS(p))) { + while (scan < this_eol && ! generic_isCC_A_((U8) *scan, FLAGS(p))) { scan++; } break; @@ -10428,7 +10722,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s * non-ASCII, plus everything in ASCII that isn't in the class. */ while ( hardcount < max && scan < this_eol && ( ! isASCII_utf8_safe(scan, loceol) - || ! _generic_isCC_A((U8) *scan, FLAGS(p)))) + || ! generic_isCC_A_((U8) *scan, FLAGS(p)))) { scan += UTF8SKIP(scan); hardcount++; @@ -10441,7 +10735,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s case POSIXU_tb: while ( scan < this_eol - && to_complement ^ cBOOL(_generic_isCC((U8) *scan, FLAGS(p)))) + && to_complement ^ cBOOL(generic_isCC_((U8) *scan, FLAGS(p)))) { scan++; } @@ -10454,7 +10748,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s case POSIXD_t8: case POSIXU_t8: - classnum = (_char_class_number) FLAGS(p); + classnum = (char_class_number_) FLAGS(p); switch (classnum) { default: while ( hardcount < max && scan < this_eol @@ -10472,7 +10766,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s * for making the loops as tight as possible. It could be * refactored to save space instead. */ - case _CC_ENUM_SPACE: + case CC_ENUM_SPACE_: while ( hardcount < max && scan < this_eol && (to_complement @@ -10482,7 +10776,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s hardcount++; } break; - case _CC_ENUM_BLANK: + case CC_ENUM_BLANK_: while ( hardcount < max && scan < this_eol && (to_complement @@ -10492,7 +10786,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s hardcount++; } break; - case _CC_ENUM_XDIGIT: + case CC_ENUM_XDIGIT_: while ( hardcount < max && scan < this_eol && (to_complement @@ -10502,7 +10796,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s hardcount++; } break; - case _CC_ENUM_VERTSPACE: + case CC_ENUM_VERTSPACE_: while ( hardcount < max && scan < this_eol && (to_complement @@ -10512,7 +10806,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s hardcount++; } break; - case _CC_ENUM_CNTRL: + case CC_ENUM_CNTRL_: while ( hardcount < max && scan < this_eol && (to_complement @@ -10549,7 +10843,7 @@ S_regrepeat(pTHX_ regexp *prog, char **s default: Perl_croak(aTHX_ "panic: regrepeat() called with unrecognized" - " node type %d='%s'", OP(p), PL_reg_name[OP(p)]); + " node type %d='%s'", OP(p), REGNODE_NAME(OP(p))); NOT_REACHED; /* NOTREACHED */ } @@ -10615,7 +10909,7 @@ S_reginclass(pTHX_ regexp * const prog, } if ( c > 255 && (OP(n) == ANYOFL || OP(n) == ANYOFPOSIXL) - && ! ANYOFL_UTF8_LOCALE_REQD(flags)) + && ! (flags & ANYOFL_UTF8_LOCALE_REQD)) { _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG(c); } @@ -10625,11 +10919,10 @@ S_reginclass(pTHX_ regexp * const prog, if (c < NUM_ANYOF_CODE_POINTS && ! inRANGE(OP(n), ANYOFH, ANYOFHb)) { if (ANYOF_BITMAP_TEST(n, c)) match = TRUE; - else if ((flags - & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER) - && OP(n) == ANYOFD - && ! utf8_target - && ! isASCII(c)) + else if ( (flags & ANYOFD_NON_UTF8_MATCHES_ALL_NON_ASCII__shared) + && OP(n) == ANYOFD + && ! utf8_target + && ! isASCII(c)) { match = TRUE; } @@ -10678,108 +10971,124 @@ S_reginclass(pTHX_ regexp * const prog, } } - /* If the bitmap didn't (or couldn't) match, and something outside the * bitmap could match, try that. */ if (!match) { - if (c >= NUM_ANYOF_CODE_POINTS - && (flags & ANYOF_MATCHES_ALL_ABOVE_BITMAP)) - { - match = TRUE; /* Everything above the bitmap matches */ + if ( c >= NUM_ANYOF_CODE_POINTS + && ANYOF_ONLY_HAS_BITMAP(n) + && ! (flags & ANYOF_HAS_EXTRA_RUNTIME_MATCHES)) + { + /* In this case, the ARG is set up so that the final bit indicates + * whether it matches or not */ + match = ARG1u(n) & 1; } - /* Here doesn't match everything above the bitmap. If there is - * some information available beyond the bitmap, we may find a - * match in it. If so, this is most likely because the code point - * is outside the bitmap range. But rarely, it could be because of - * some other reason. If so, various flags are set to indicate - * this possibility. On ANYOFD nodes, there may be matches that - * happen only when the target string is UTF-8; or for other node - * types, because runtime lookup is needed, regardless of the - * UTF-8ness of the target string. Finally, under /il, there may - * be some matches only possible if the locale is a UTF-8 one. */ - else if ( ARG(n) != ANYOF_ONLY_HAS_BITMAP - && ( c >= NUM_ANYOF_CODE_POINTS - || ( (flags & ANYOF_SHARED_d_UPPER_LATIN1_UTF8_STRING_MATCHES_non_d_RUNTIME_USER_PROP) - && ( UNLIKELY(OP(n) != ANYOFD) - || (utf8_target && ! isASCII_uni(c) + else + /* Here, the main way it could match is if the code point is + * outside the bitmap and an inversion list exists to handle such + * things. The other ways all occur when a flag is set to indicate + * we need special handling. That handling doesn't come in to + * effect for ANYOFD nodes unless the target string is UTF-8 and + * that matters to code point being matched. */ + if ( c >= NUM_ANYOF_CODE_POINTS + || ( (flags & ANYOF_HAS_EXTRA_RUNTIME_MATCHES) + && ( UNLIKELY(OP(n) != ANYOFD) + || (utf8_target && ! isASCII_uvchr(c) # if NUM_ANYOF_CODE_POINTS > 256 - && c < 256 + && c < 256 # endif - ))) - || ( ANYOFL_SOME_FOLDS_ONLY_IN_UTF8_LOCALE(flags) - && IN_UTF8_CTYPE_LOCALE))) - { - SV* only_utf8_locale = NULL; - SV * const definition = -#if !defined(PERL_IN_XSUB_RE) || defined(PLUGGABLE_RE_EXTENSION) - get_regclass_nonbitmap_data(prog, n, TRUE, 0, - &only_utf8_locale, NULL); -#else - get_re_gclass_nonbitmap_data(prog, n, TRUE, 0, - &only_utf8_locale, NULL); -#endif - if (definition) { - U8 utf8_buffer[2]; - U8 * utf8_p; - if (utf8_target) { - utf8_p = (U8 *) p; - } else { /* Convert to utf8 */ - utf8_p = utf8_buffer; - append_utf8_from_native_byte(*p, &utf8_p); - utf8_p = utf8_buffer; + )))) + { + /* Here, we have an inversion list for outside-the-bitmap code + * points and/or the flag is set indicating special handling is + * needed. The flag is set when there is auxiliary data beyond the + * normal inversion list, or if there is the possibility of a + * special Turkic locale match, even without auxiliary data. + * + * First check if there is an inversion list and/or auxiliary data. + * */ + if (ANYOF_HAS_AUX(n)) { + SV* only_utf8_locale = NULL; + + /* This call will return in 'definition' the union of the base + * non-bitmap inversion list, if any, plus the deferred + * definitions of user-defined properties, if any. It croaks + * if there is such a property but which still has no definition + * available */ + SV * const definition = GET_REGCLASS_AUX_DATA(prog, n, TRUE, 0, + &only_utf8_locale, NULL); + if (definition) { + /* Most likely is the outside-the-bitmap inversion list. */ + if (_invlist_contains_cp(definition, c)) { + match = TRUE; + } + else /* Failing that, hardcode the two tests for a Turkic + locale */ + if ( UNLIKELY(IN_UTF8_TURKIC_LOCALE) + && isALPHA_FOLD_EQ(*p, 'i')) + { + /* Turkish locales have these hard-coded rules + * overriding normal ones */ + if (*p == 'i') { + if (_invlist_contains_cp(definition, + LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE)) + { + match = TRUE; + } + } + else if (_invlist_contains_cp(definition, + LATIN_SMALL_LETTER_DOTLESS_I)) + { + match = TRUE; + } + } } - /* Turkish locales have these hard-coded rules overriding - * normal ones */ - if ( UNLIKELY(PL_in_utf8_turkic_locale) - && isALPHA_FOLD_EQ(*p, 'i')) + if ( UNLIKELY(only_utf8_locale) + && UNLIKELY(IN_UTF8_CTYPE_LOCALE) + && ! match) { - if (*p == 'i') { - if (_invlist_contains_cp(definition, - LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE)) - { + match = _invlist_contains_cp(only_utf8_locale, c); + } + } + + /* In a Turkic locale under folding, hard-code the I i case pair + * matches; these wouldn't have the ANYOF_HAS_EXTRA_RUNTIME_MATCHES + * flag set unless [Ii] were match possibilities */ + if (UNLIKELY(IN_UTF8_TURKIC_LOCALE) && ! match) { + if (utf8_target) { + if (c == LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) { + if (ANYOF_BITMAP_TEST(n, 'i')) { match = TRUE; } } - else if (*p == 'I') { - if (_invlist_contains_cp(definition, - LATIN_SMALL_LETTER_DOTLESS_I)) - { + else if (c == LATIN_SMALL_LETTER_DOTLESS_I) { + if (ANYOF_BITMAP_TEST(n, 'I')) { match = TRUE; } } } - else if (_invlist_contains_cp(definition, c)) { - match = TRUE; - } - } - if (! match && only_utf8_locale && IN_UTF8_CTYPE_LOCALE) { - match = _invlist_contains_cp(only_utf8_locale, c); - } - } - /* In a Turkic locale under folding, hard-code the I i case pair - * matches */ - if ( UNLIKELY(PL_in_utf8_turkic_locale) - && ! match - && (flags & ANYOFL_FOLD) - && utf8_target) - { - if (c == LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE) { - if (ANYOF_BITMAP_TEST(n, 'i')) { - match = TRUE; +#if NUM_ANYOF_CODE_POINTS > 256 + /* Larger bitmap means these special cases aren't handled + * outside the bitmap above. */ + if (*p == 'i') { + if (ANYOF_BITMAP_TEST(n, + LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE)) + { + match = TRUE; + } } - } - else if (c == LATIN_SMALL_LETTER_DOTLESS_I) { - if (ANYOF_BITMAP_TEST(n, 'I')) { - match = TRUE; + else if (*p == 'I') { + if (ANYOF_BITMAP_TEST(n, LATIN_SMALL_LETTER_DOTLESS_I)) { + match = TRUE; + } } +#endif } } - if (UNICODE_IS_SUPER(c) - && (flags - & ANYOF_SHARED_d_MATCHES_ALL_NON_UTF8_NON_ASCII_non_d_WARN_SUPER) + if ( UNICODE_IS_SUPER(c) + && (flags & ANYOF_WARN_SUPER__shared) && OP(n) != ANYOFD && ckWARN_d(WARN_NON_UNICODE)) { @@ -10965,21 +11274,21 @@ S_setup_eval_state(pTHX_ regmatch_info * /* Here is a serious problem: we cannot rewrite subbeg, since it may be needed if this match fails. Thus $` inside (?{}) could fail... */ - eval_state->subbeg = rex->subbeg; - eval_state->sublen = rex->sublen; - eval_state->suboffset = rex->suboffset; - eval_state->subcoffset = rex->subcoffset; + eval_state->subbeg = RXp_SUBBEG(rex); + eval_state->sublen = RXp_SUBLEN(rex); + eval_state->suboffset = RXp_SUBOFFSET(rex); + eval_state->subcoffset = RXp_SUBCOFFSET(rex); #ifdef PERL_ANY_COW - eval_state->saved_copy = rex->saved_copy; + eval_state->saved_copy = RXp_SAVED_COPY(rex); #endif RXp_MATCH_COPIED_off(rex); } else eval_state->subbeg = NULL; - rex->subbeg = (char *)reginfo->strbeg; - rex->suboffset = 0; - rex->subcoffset = 0; - rex->sublen = reginfo->strend - reginfo->strbeg; + RXp_SUBBEG(rex) = (char *)reginfo->strbeg; + RXp_SUBOFFSET(rex) = 0; + RXp_SUBCOFFSET(rex) = 0; + RXp_SUBLEN(rex) = reginfo->strend - reginfo->strbeg; } @@ -11000,12 +11309,12 @@ S_cleanup_regmatch_info_aux(pTHX_ void * if (eval_state->subbeg) { regexp * const rex = eval_state->rex; - rex->subbeg = eval_state->subbeg; - rex->sublen = eval_state->sublen; - rex->suboffset = eval_state->suboffset; - rex->subcoffset = eval_state->subcoffset; + RXp_SUBBEG(rex) = eval_state->subbeg; + RXp_SUBLEN(rex) = eval_state->sublen; + RXp_SUBOFFSET(rex) = eval_state->suboffset; + RXp_SUBCOFFSET(rex) = eval_state->subcoffset; #ifdef PERL_ANY_COW - rex->saved_copy = eval_state->saved_copy; + RXp_SAVED_COPY(rex) = eval_state->saved_copy; #endif RXp_MATCH_COPIED_on(rex); } @@ -11247,7 +11556,7 @@ Perl_isSCRIPT_RUN(pTHX_ const U8 * s, co /* Things that match /\d/u */ - SV * decimals_invlist = PL_XPosix_ptrs[_CC_DIGIT]; + SV * decimals_invlist = PL_XPosix_ptrs[CC_DIGIT_]; UV * decimals_array = invlist_array(decimals_invlist); /* What code point is the digit '0' of the script run? (0 meaning FALSE if @@ -11424,7 +11733,7 @@ Perl_isSCRIPT_RUN(pTHX_ const U8 * s, co * * Negative script numbers signify that the value may be any of several * scripts, and we need to look at auxiliary information to make our - * deterimination. But if both are non-negative, we can fail now */ + * determination. But if both are non-negative, we can fail now */ if (LIKELY(script_of_char >= 0)) { const SCX_enum * search_in; PERL_UINT_FAST8_T search_in_len; @@ -11612,8 +11921,461 @@ Perl_isSCRIPT_RUN(pTHX_ const U8 * s, co return retval; } - #endif /* ifndef PERL_IN_XSUB_RE */ + +/* Buffer logic. */ +SV* +Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value, + const U32 flags) +{ + PERL_ARGS_ASSERT_REG_NAMED_BUFF; + + PERL_UNUSED_ARG(value); + + if (flags & RXapif_FETCH) { + return reg_named_buff_fetch(rx, key, flags); + } else if (flags & (RXapif_STORE | RXapif_DELETE | RXapif_CLEAR)) { + Perl_croak_no_modify(); + return NULL; + } else if (flags & RXapif_EXISTS) { + return reg_named_buff_exists(rx, key, flags) + ? &PL_sv_yes + : &PL_sv_no; + } else if (flags & RXapif_REGNAMES) { + return reg_named_buff_all(rx, flags); + } else if (flags & (RXapif_SCALAR | RXapif_REGNAMES_COUNT)) { + return reg_named_buff_scalar(rx, flags); + } else { + Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff", (int)flags); + return NULL; + } +} + +SV* +Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey, + const U32 flags) +{ + PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER; + PERL_UNUSED_ARG(lastkey); + + if (flags & RXapif_FIRSTKEY) + return reg_named_buff_firstkey(rx, flags); + else if (flags & RXapif_NEXTKEY) + return reg_named_buff_nextkey(rx, flags); + else { + Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_iter", + (int)flags); + return NULL; + } +} + +SV* +Perl_reg_named_buff_fetch(pTHX_ REGEXP * const r, SV * const namesv, + const U32 flags) +{ + SV *ret; + struct regexp *const rx = ReANY(r); + + PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH; + + if (rx && RXp_PAREN_NAMES(rx)) { + HE *he_str = hv_fetch_ent( RXp_PAREN_NAMES(rx), namesv, 0, 0 ); + if (he_str) { + IV i; + SV* sv_dat=HeVAL(he_str); + I32 *nums=(I32*)SvPVX(sv_dat); + AV * const retarray = (flags & RXapif_ALL) ? newAV_alloc_x(SvIVX(sv_dat)) : NULL; + for ( i=0; inparens) >= nums[i] + && RXp_OFFS_VALID(rx,nums[i])) + { + ret = newSVpvs(""); + Perl_reg_numbered_buff_fetch_flags(aTHX_ r, nums[i], ret, REG_FETCH_ABSOLUTE); + if (!retarray) + return ret; + } else { + if (retarray) + ret = newSV_type(SVt_NULL); + } + if (retarray) + av_push_simple(retarray, ret); + } + if (retarray) + return newRV_noinc(MUTABLE_SV(retarray)); + } + } + return NULL; +} + +bool +Perl_reg_named_buff_exists(pTHX_ REGEXP * const r, SV * const key, + const U32 flags) +{ + struct regexp *const rx = ReANY(r); + + PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS; + + if (rx && RXp_PAREN_NAMES(rx)) { + if (flags & RXapif_ALL) { + return hv_exists_ent(RXp_PAREN_NAMES(rx), key, 0); + } else { + SV *sv = CALLREG_NAMED_BUFF_FETCH(r, key, flags); + if (sv) { + SvREFCNT_dec_NN(sv); + return TRUE; + } else { + return FALSE; + } + } + } else { + return FALSE; + } +} + +SV* +Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const r, const U32 flags) +{ + struct regexp *const rx = ReANY(r); + + PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY; + + if ( rx && RXp_PAREN_NAMES(rx) ) { + (void)hv_iterinit(RXp_PAREN_NAMES(rx)); + + return CALLREG_NAMED_BUFF_NEXTKEY(r, NULL, flags & ~RXapif_FIRSTKEY); + } else { + return FALSE; + } +} + +SV* +Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const r, const U32 flags) +{ + struct regexp *const rx = ReANY(r); + DECLARE_AND_GET_RE_DEBUG_FLAGS; + + PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY; + + if (rx && RXp_PAREN_NAMES(rx)) { + HV *hv = RXp_PAREN_NAMES(rx); + HE *temphe; + while ( (temphe = hv_iternext_flags(hv, 0)) ) { + IV i; + IV parno = 0; + SV* sv_dat = HeVAL(temphe); + I32 *nums = (I32*)SvPVX(sv_dat); + for ( i = 0; i < SvIVX(sv_dat); i++ ) { + if ((I32)(RXp_LASTPAREN(rx)) >= nums[i] && + RXp_OFFS_VALID(rx,nums[i])) + { + parno = nums[i]; + break; + } + } + if (parno || flags & RXapif_ALL) { + return newSVhek(HeKEY_hek(temphe)); + } + } + } + return NULL; +} + +SV* +Perl_reg_named_buff_scalar(pTHX_ REGEXP * const r, const U32 flags) +{ + SV *ret; + AV *av; + SSize_t length; + struct regexp *const rx = ReANY(r); + + PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR; + + if (rx && RXp_PAREN_NAMES(rx)) { + if (flags & (RXapif_ALL | RXapif_REGNAMES_COUNT)) { + return newSViv(HvTOTALKEYS(RXp_PAREN_NAMES(rx))); + } else if (flags & RXapif_ONE) { + ret = CALLREG_NAMED_BUFF_ALL(r, (flags | RXapif_REGNAMES)); + av = MUTABLE_AV(SvRV(ret)); + length = av_count(av); + SvREFCNT_dec_NN(ret); + return newSViv(length); + } else { + Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_scalar", + (int)flags); + return NULL; + } + } + return &PL_sv_undef; +} + +SV* +Perl_reg_named_buff_all(pTHX_ REGEXP * const r, const U32 flags) +{ + struct regexp *const rx = ReANY(r); + AV *av = newAV(); + + PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL; + + if (rx && RXp_PAREN_NAMES(rx)) { + HV *hv= RXp_PAREN_NAMES(rx); + HE *temphe; + (void)hv_iterinit(hv); + while ( (temphe = hv_iternext_flags(hv, 0)) ) { + IV i; + IV parno = 0; + SV* sv_dat = HeVAL(temphe); + I32 *nums = (I32*)SvPVX(sv_dat); + for ( i = 0; i < SvIVX(sv_dat); i++ ) { + if ((I32)(RXp_LASTPAREN(rx)) >= nums[i] && + RXp_OFFS_VALID(rx,nums[i])) + { + parno = nums[i]; + break; + } + } + if (parno || flags & RXapif_ALL) { + av_push_simple(av, newSVhek(HeKEY_hek(temphe))); + } + } + } + + return newRV_noinc(MUTABLE_SV(av)); +} + +void +Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const re, const I32 paren, + SV * const sv) +{ + PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH; + Perl_reg_numbered_buff_fetch_flags(aTHX_ re, paren, sv, 0); +} + +#ifndef PERL_IN_XSUB_RE + +void +Perl_reg_numbered_buff_fetch_flags(pTHX_ REGEXP * const re, const I32 paren, + SV * const sv, U32 flags) +{ + struct regexp *const rx = ReANY(re); + char *s = NULL; + SSize_t i,t = 0; + SSize_t s1, t1; + I32 n = paren; + I32 logical_nparens = rx->logical_nparens ? rx->logical_nparens : rx->nparens; + + PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH_FLAGS; + + if ( n == RX_BUFF_IDX_CARET_PREMATCH + || n == RX_BUFF_IDX_CARET_FULLMATCH + || n == RX_BUFF_IDX_CARET_POSTMATCH + ) + { + bool keepcopy = cBOOL(rx->extflags & RXf_PMf_KEEPCOPY); + if (!keepcopy) { + /* on something like + * $r = qr/.../; + * /$qr/p; + * the KEEPCOPY is set on the PMOP rather than the regex */ + if (PL_curpm && re == PM_GETRE(PL_curpm)) + keepcopy = cBOOL(PL_curpm->op_pmflags & PMf_KEEPCOPY); + } + if (!keepcopy) + goto ret_undef; + } + + if (!RXp_SUBBEG(rx)) + goto ret_undef; + + if (n == RX_BUFF_IDX_CARET_FULLMATCH) + /* no need to distinguish between them any more */ + n = RX_BUFF_IDX_FULLMATCH; + + if ((n == RX_BUFF_IDX_PREMATCH || n == RX_BUFF_IDX_CARET_PREMATCH) + && (i = RXp_OFFS_START(rx,0)) != -1) + { + /* $`, ${^PREMATCH} */ + s = RXp_SUBBEG(rx); + } + else + if ((n == RX_BUFF_IDX_POSTMATCH || n == RX_BUFF_IDX_CARET_POSTMATCH) + && (t = RXp_OFFS_END(rx,0)) != -1) + { + /* $', ${^POSTMATCH} */ + s = RXp_SUBBEG(rx) - RXp_SUBOFFSET(rx) + t; + i = RXp_SUBLEN(rx) + RXp_SUBOFFSET(rx) - t; + } + else /* when flags is true we do an absolute lookup, and compare against rx->nparens */ + if (inRANGE(n, 0, flags ? (I32)rx->nparens : logical_nparens)) { + I32 *map = (!flags && n) ? rx->logical_to_parno : NULL; + I32 true_parno = map ? map[n] : n; + do { + if (((s1 = RXp_OFFS_START(rx,true_parno)) != -1) && + ((t1 = RXp_OFFS_END(rx,true_parno)) != -1)) + { + /* $&, ${^MATCH}, $1 ... */ + i = t1 - s1; + s = RXp_SUBBEG(rx) + s1 - RXp_SUBOFFSET(rx); + goto found_it; + } + else if (map) { + true_parno = rx->parno_to_logical_next[true_parno]; + } + else { + break; + } + } while (true_parno); + goto ret_undef; + } else { + goto ret_undef; + } + + found_it: + assert(s >= RXp_SUBBEG(rx)); + assert((STRLEN)RXp_SUBLEN(rx) >= (STRLEN)((s - RXp_SUBBEG(rx)) + i) ); + if (i >= 0) { +#ifdef NO_TAINT_SUPPORT + sv_setpvn(sv, s, i); +#else + const int oldtainted = TAINT_get; + TAINT_NOT; + sv_setpvn(sv, s, i); + TAINT_set(oldtainted); +#endif + if (RXp_MATCH_UTF8(rx)) + SvUTF8_on(sv); + else + SvUTF8_off(sv); + if (TAINTING_get) { + if (RXp_MATCH_TAINTED(rx)) { + if (SvTYPE(sv) >= SVt_PVMG) { + MAGIC* const mg = SvMAGIC(sv); + MAGIC* mgt; + TAINT; + SvMAGIC_set(sv, mg->mg_moremagic); + SvTAINT(sv); + if ((mgt = SvMAGIC(sv))) { + mg->mg_moremagic = mgt; + SvMAGIC_set(sv, mg); + } + } else { + TAINT; + SvTAINT(sv); + } + } else + SvTAINTED_off(sv); + } + } else { + ret_undef: + sv_set_undef(sv); + return; + } +} + +#endif + +void +Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren, + SV const * const value) +{ + PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE; + + PERL_UNUSED_ARG(rx); + PERL_UNUSED_ARG(paren); + PERL_UNUSED_ARG(value); + + if (!PL_localizing) + Perl_croak_no_modify(); +} + +I32 +Perl_reg_numbered_buff_length(pTHX_ REGEXP * const r, const SV * const sv, + const I32 paren) +{ + struct regexp *const rx = ReANY(r); + I32 i,j; + I32 s1, t1; + I32 logical_nparens = rx->logical_nparens ? rx->logical_nparens : rx->nparens; + + PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH; + + if ( paren == RX_BUFF_IDX_CARET_PREMATCH + || paren == RX_BUFF_IDX_CARET_FULLMATCH + || paren == RX_BUFF_IDX_CARET_POSTMATCH + ) + { + bool keepcopy = cBOOL(rx->extflags & RXf_PMf_KEEPCOPY); + if (!keepcopy) { + /* on something like + * $r = qr/.../; + * /$qr/p; + * the KEEPCOPY is set on the PMOP rather than the regex */ + if (PL_curpm && r == PM_GETRE(PL_curpm)) + keepcopy = cBOOL(PL_curpm->op_pmflags & PMf_KEEPCOPY); + } + if (!keepcopy) + goto warn_undef; + } + + /* Some of this code was originally in C in F */ + switch (paren) { + case RX_BUFF_IDX_CARET_PREMATCH: /* ${^PREMATCH} */ + case RX_BUFF_IDX_PREMATCH: /* $` */ + if ( (i = RXp_OFFS_START(rx,0)) != -1) { + if (i > 0) { + s1 = 0; + t1 = i; + goto getlen; + } + } + return 0; + + case RX_BUFF_IDX_CARET_POSTMATCH: /* ${^POSTMATCH} */ + case RX_BUFF_IDX_POSTMATCH: /* $' */ + if ( (j = RXp_OFFS_END(rx,0)) != -1 ) { + i = RXp_SUBLEN(rx) - j; + if (i > 0) { + s1 = j; + t1 = RXp_SUBLEN(rx); + goto getlen; + } + } + return 0; + + default: /* $& / ${^MATCH}, $1, $2, ... */ + if (paren <= logical_nparens) { + I32 true_paren = rx->logical_to_parno + ? rx->logical_to_parno[paren] + : paren; + do { + if (((s1 = RXp_OFFS_START(rx,true_paren)) != -1) && + ((t1 = RXp_OFFS_END(rx,true_paren)) != -1)) + { + i = t1 - s1; + goto getlen; + } else if (rx->parno_to_logical_next) { + true_paren = rx->parno_to_logical_next[true_paren]; + } else { + break; + } + } while(true_paren); + } + warn_undef: + if (ckWARN(WARN_UNINITIALIZED)) + report_uninit((const SV *)sv); + return 0; + } + getlen: + if (i > 0 && RXp_MATCH_UTF8(rx)) { + const char * const s = RXp_SUBBEG(rx) - RXp_SUBOFFSET(rx) + s1; + const U8 *ep; + STRLEN el; + + i = t1 - s1; + if (is_utf8_string_loclen((U8*)s, i, &ep, &el)) + i = el; + } + return i; +} /* * ex: set ts=8 sts=4 sw=4 et: Index: gnu/usr.bin/perl/regexp.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/regexp.h,v diff -u -p -a -u -p -r1.18 regexp.h --- gnu/usr.bin/perl/regexp.h 15 Feb 2023 01:36:13 -0000 1.18 +++ gnu/usr.bin/perl/regexp.h 21 Feb 2024 15:47:03 -0000 @@ -22,10 +22,30 @@ typedef SSize_t regnode_offset; +struct regnode_meta { + U8 type; + U8 arg_len; + U8 arg_len_varies; + U8 off_by_arg; +}; + +/* this ensures that on alignment sensitive platforms + * this struct is aligned on 32 bit boundaries */ +union regnode_head { + struct { + union { + U8 flags; + U8 str_len_u8; + U8 first_byte; + } u_8; + U8 type; + U16 next_off; + } data; + U32 data_u32; +}; + struct regnode { - U8 flags; - U8 type; - U16 next_off; + union regnode_head head; }; typedef struct regnode regnode; @@ -39,7 +59,7 @@ struct regexp; struct reg_substr_datum { SSize_t min_offset; /* min pos (in chars) that substr must appear */ - SSize_t max_offset /* max pos (in chars) that substr must appear */; + SSize_t max_offset; /* max pos (in chars) that substr must appear */ SV *substr; /* non-utf8 variant */ SV *utf8_substr; /* utf8 variant */ SSize_t end_shift; /* how many fixed chars must end the string */ @@ -55,11 +75,13 @@ struct reg_substr_data { # define SV_SAVED_COPY # endif -/* offsets within a string of a particular /(.)/ capture */ - +/* offsets within a string of a particular /(.)/ capture + * if you change this by adding new non-temporary fields + * then be sure to update Perl_rxres_save() in pp_ctl.c */ typedef struct regexp_paren_pair { SSize_t start; SSize_t end; + /* 'start_tmp' records a new opening position before the matching end * has been found, so that the old start and end values are still * valid, e.g. @@ -69,7 +91,7 @@ typedef struct regexp_paren_pair { SSize_t start_tmp; } regexp_paren_pair; -# if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_UTF8_C) +# if defined(PERL_IN_REGCOMP_ANY) || defined(PERL_IN_UTF8_C) # define _invlist_union(a, b, output) _invlist_union_maybe_complement_2nd(a, b, FALSE, output) # define _invlist_intersection(a, b, output) _invlist_intersection_maybe_complement_2nd(a, b, FALSE, output) @@ -118,13 +140,23 @@ typedef struct regexp { * Information about the match that the perl core uses to manage things */ + /* see comment in regcomp_internal.h about branch reset to understand + the distinction between physical and logical capture buffers */ + U32 nparens; /* physical number of capture buffers */ + U32 logical_nparens; /* logical_number of capture buffers */ + I32 *logical_to_parno; /* map logical parno to first physcial */ + I32 *parno_to_logical; /* map every physical parno to logical */ + I32 *parno_to_logical_next; /* map every physical parno to the next + physical with the same logical id */ + U32 extflags; /* Flags used both externally and internally */ - U32 nparens; /* number of capture buffers */ + SSize_t maxlen; /* maximum possible number of chars in string to match */ SSize_t minlen; /* minimum possible number of chars in string to match */ - SSize_t minlenret; /* mininum possible number of chars in $& */ + SSize_t minlenret; /* minimum possible number of chars in $& */ STRLEN gofs; /* chars left of pos that we search from */ /* substring data about strings that must appear in * the final match, used for optimisations */ + struct reg_substr_data *substrs; /* private engine specific data */ @@ -142,6 +174,7 @@ typedef struct regexp { char **recurse_locinput; /* used to detect infinite recursion, XXX: move to internal */ U32 lastcloseparen; /* last close paren matched ($^N) */ + /*---------------------------------------------------------------------- */ /* offset from wrapped to the start of precomp */ @@ -158,7 +191,6 @@ typedef struct regexp { SSize_t sublen; /* Length of string pointed by subbeg */ SSize_t suboffset; /* byte offset of subbeg from logical start of str */ SSize_t subcoffset; /* suboffset equiv, but in chars (for @-/@+) */ - SSize_t maxlen; /* minimum possible number of chars in string to match */ /*---------------------------------------------------------------------- */ @@ -167,7 +199,20 @@ typedef struct regexp { } regexp; -# define RXp_PAREN_NAMES(rx) ((rx)->paren_names) +#define RXp_PAREN_NAMES(rx) ((rx)->paren_names) + +#define RXp_OFFS_START(rx,n) \ + RXp_OFFSp(rx)[(n)].start + +#define RXp_OFFS_END(rx,n) \ + RXp_OFFSp(rx)[(n)].end + +#define RXp_OFFS_VALID(rx,n) \ + (RXp_OFFSp(rx)[(n)].end != -1 && RXp_OFFSp(rx)[(n)].start != -1 ) + +#define RX_OFFS_START(rx_sv,n) RXp_OFFS_START(ReANY(rx_sv),n) +#define RX_OFFS_END(rx_sv,n) RXp_OFFS_END(ReANY(rx_sv),n) +#define RX_OFFS_VALID(rx_sv,n) RXp_OFFS_VALID(ReANY(rx_sv),n) /* used for high speed searches */ typedef struct re_scream_pos_data_s @@ -526,30 +571,53 @@ and check for NULL. # define RX_COMPFLAGS(rx_sv) RXp_COMPFLAGS(ReANY(rx_sv)) # define RXp_ENGINE(prog) ((prog)->engine) # define RX_ENGINE(rx_sv) (RXp_ENGINE(ReANY(rx_sv))) -# define RXp_SUBBEG(prog) (prog->subbeg) +# define RXp_SUBBEG(prog) ((prog)->subbeg) # define RX_SUBBEG(rx_sv) (RXp_SUBBEG(ReANY(rx_sv))) -# define RXp_SUBOFFSET(prog) (prog->suboffset) +# define RXp_SUBOFFSET(prog) ((prog)->suboffset) # define RX_SUBOFFSET(rx_sv) (RXp_SUBOFFSET(ReANY(rx_sv))) -# define RX_SUBCOFFSET(rx_sv) (ReANY(rx_sv)->subcoffset) -# define RXp_OFFS(prog) (prog->offs) -# define RX_OFFS(rx_sv) (RXp_OFFS(ReANY(rx_sv))) -# define RXp_NPARENS(prog) (prog->nparens) +# define RXp_SUBCOFFSET(prog) ((prog)->subcoffset) +# define RX_SUBCOFFSET(rx_sv) (RXp_SUBCOFFSET(ReANY(rx_sv))) +# define RXp_OFFSp(prog) ((prog)->offs) +# define RX_OFFSp(rx_sv) (RXp_OFFSp(ReANY(rx_sv))) +# define RXp_LOGICAL_NPARENS(prog) ((prog)->logical_nparens) +# define RX_LOGICAL_NPARENS(rx_sv) (RXp_LOGICAL_NPARENS(ReANY(rx_sv))) +# define RXp_LOGICAL_TO_PARNO(prog) ((prog)->logical_to_parno) +# define RX_LOGICAL_TO_PARNO(rx_sv) (RXp_LOGICAL_TO_PARNO(ReANY(rx_sv))) +# define RXp_PARNO_TO_LOGICAL(prog) ((prog)->parno_to_logical) +# define RX_PARNO_TO_LOGICAL(rx_sv) (RXp_PARNO_TO_LOGICAL(ReANY(rx_sv))) +# define RXp_PARNO_TO_LOGICAL_NEXT(prog) ((prog)->parno_to_logical_next) +# define RX_PARNO_TO_LOGICAL_NEXT(rx_sv) (RXp_PARNO_TO_LOGICAL_NEXT(ReANY(rx_sv))) +# define RXp_NPARENS(prog) ((prog)->nparens) # define RX_NPARENS(rx_sv) (RXp_NPARENS(ReANY(rx_sv))) -# define RX_SUBLEN(rx_sv) (ReANY(rx_sv)->sublen) -# define RXp_MINLEN(prog) (prog->minlen) +# define RXp_SUBLEN(prog) ((prog)->sublen) +# define RX_SUBLEN(rx_sv) (RXp_SUBLEN(ReANY(rx_sv))) +# define RXp_MINLEN(prog) ((prog)->minlen) # define RX_MINLEN(rx_sv) (RXp_MINLEN(ReANY(rx_sv))) -# define RXp_MINLENRET(prog) (prog->minlenret) +# define RXp_MINLENRET(prog) ((prog)->minlenret) # define RX_MINLENRET(rx_sv) (RXp_MINLENRET(ReANY(rx_sv))) -# define RXp_GOFS(prog) (prog->gofs) +# define RXp_GOFS(prog) ((prog)->gofs) # define RX_GOFS(rx_sv) (RXp_GOFS(ReANY(rx_sv))) -# define RX_LASTPAREN(rx_sv) (ReANY(rx_sv)->lastparen) -# define RX_LASTCLOSEPAREN(rx_sv) (ReANY(rx_sv)->lastcloseparen) -# define RXp_SAVED_COPY(prog) (prog->saved_copy) +# define RXp_LASTPAREN(prog) ((prog)->lastparen) +# define RX_LASTPAREN(rx_sv) (RXp_LASTPAREN(ReANY(rx_sv))) +# define RXp_LASTCLOSEPAREN(prog) ((prog)->lastcloseparen) +# define RX_LASTCLOSEPAREN(rx_sv) (RXp_LASTCLOSEPAREN(ReANY(rx_sv))) +# define RXp_SAVED_COPY(prog) ((prog)->saved_copy) # define RX_SAVED_COPY(rx_sv) (RXp_SAVED_COPY(ReANY(rx_sv))) +# define RXp_SUBSTRS(prog) ((prog)->substrs) +# define RX_SUBSTRS(rx_sv) (RXp_SUBSTRS(ReANY(rx_sv))) +# define RXp_PPRIVATE(prog) ((prog)->pprivate) +# define RX_PPRIVATE(rx_sv) (RXp_PPRIVATE(ReANY(rx_sv))) +# define RXp_QR_ANONCV(prog) ((prog)->qr_anoncv) +# define RX_QR_ANONCV(rx_sv) (RXp_QR_ANONCV(ReANY(rx_sv))) +# define RXp_MOTHER_RE(prog) ((prog)->mother_re) +# define RX_MOTHER_RE(rx_sv) (RXp_MOTHER_RE(ReANY(rx_sv))) +# define RXp_PRE_PREFIX(prog) ((prog)->pre_prefix) +# define RX_PRE_PREFIX(rx_sv) (RXp_PRE_PREFIX(ReANY(rx_sv))) + /* last match was zero-length */ # define RXp_ZERO_LEN(prog) \ - (RXp_OFFS(prog)[0].start + (SSize_t)RXp_GOFS(prog) \ - == RXp_OFFS(prog)[0].end) + (RXp_OFFS_START(prog,0) + (SSize_t)RXp_GOFS(prog) \ + == RXp_OFFS_END(prog,0)) # define RX_ZERO_LEN(rx_sv) (RXp_ZERO_LEN(ReANY(rx_sv))) #endif /* PLUGGABLE_RE_EXTENSION */ @@ -557,20 +625,24 @@ and check for NULL. /* Stuff that needs to be included in the pluggable extension goes below here */ #ifdef PERL_ANY_COW -# define RXp_MATCH_COPY_FREE(prog) \ - STMT_START {if (RXp_SAVED_COPY(prog)) { \ - SV_CHECK_THINKFIRST_COW_DROP(RXp_SAVED_COPY(prog)); \ - } \ - if (RXp_MATCH_COPIED(prog)) { \ - Safefree(RXp_SUBBEG(prog)); \ - RXp_MATCH_COPIED_off(prog); \ - }} STMT_END +# define RXp_MATCH_COPY_FREE(prog) \ + STMT_START { \ + if (RXp_SAVED_COPY(prog)) { \ + SV_CHECK_THINKFIRST_COW_DROP(RXp_SAVED_COPY(prog)); \ + } \ + if (RXp_MATCH_COPIED(prog)) { \ + Safefree(RXp_SUBBEG(prog)); \ + RXp_MATCH_COPIED_off(prog); \ + } \ + } STMT_END #else -# define RXp_MATCH_COPY_FREE(prog) \ - STMT_START {if (RXp_MATCH_COPIED(prog)) { \ - Safefree(RXp_SUBBEG(prog)); \ - RXp_MATCH_COPIED_off(prog); \ - }} STMT_END +# define RXp_MATCH_COPY_FREE(prog) \ + STMT_START { \ + if (RXp_MATCH_COPIED(prog)) { \ + Safefree(RXp_SUBBEG(prog)); \ + RXp_MATCH_COPIED_off(prog); \ + } \ + } STMT_END #endif #define RX_MATCH_COPY_FREE(rx_sv) RXp_MATCH_COPY_FREE(ReANY(rx_sv)) @@ -779,43 +851,71 @@ typedef struct regmatch_state { struct regmatch_state *prev_yes_state; } yes; + + /* NOTE: Regarding 'cp' and 'lastcp' in the following structs... + * + * In the majority of cases we use 'cp' for the "normal" + * checkpoint for paren saves, and 'lastcp' for the addtional + * paren saves that are done only under RE_PESSIMISTIC_PARENS. + * + * There may be a few cases where both are used always. + * Regardless they tend be used something like this: + * + * ST.cp = regcppush(rex, 0, maxopenparen); + * REGCP_SET(ST.lastcp); + * + * thus ST.cp holds the checkpoint from before we push parens, + * and ST.lastcp holds the checkpoint from afterwards. + */ + /* branchlike members */ /* this is a fake union member that matches the first elements * of each member that needs to behave like a branch */ struct { /* this first element must match u.yes */ struct regmatch_state *prev_yes_state; - U32 lastparen; - U32 lastcloseparen; - CHECKPOINT cp; + U32 lastparen; + U32 lastcloseparen; + CHECKPOINT cp; /* see note above "struct branchlike" */ + CHECKPOINT lastcp; /* see note above "struct branchlike" */ + U16 before_paren; + U16 after_paren; } branchlike; struct { /* the first elements must match u.branchlike */ struct regmatch_state *prev_yes_state; - U32 lastparen; - U32 lastcloseparen; - CHECKPOINT cp; + U32 lastparen; + U32 lastcloseparen; + CHECKPOINT cp; /* see note above "struct branchlike" */ + CHECKPOINT lastcp; /* see note above "struct branchlike" */ + U16 before_paren; + U16 after_paren; - regnode *next_branch; /* next branch node */ + regnode *next_branch; /* next branch node */ } branch; struct { /* the first elements must match u.branchlike */ struct regmatch_state *prev_yes_state; - U32 lastparen; - U32 lastcloseparen; - CHECKPOINT cp; - - U32 accepted; /* how many accepting states left */ - bool longfold;/* saw a fold with a 1->n char mapping */ - U16 *jump; /* positive offsets from me */ - regnode *me; /* Which node am I - needed for jump tries*/ - U8 *firstpos;/* pos in string of first trie match */ - U32 firstchars;/* len in chars of firstpos from start */ - U16 nextword;/* next word to try */ - U16 topword; /* longest accepted word */ + U32 lastparen; + U32 lastcloseparen; + CHECKPOINT cp; /* see note above "struct branchlike" */ + CHECKPOINT lastcp; /* see note above "struct branchlike" */ + U16 before_paren; + U16 after_paren; + + U32 accepted; /* how many accepting states left */ + bool longfold; /* saw a fold with a 1->n char mapping */ + U16 *jump; /* positive offsets from me */ + U16 *j_before_paren; + U16 *j_after_paren; + regnode *me; /* Which node am I - needed for jump tries*/ + U8 *firstpos; /* pos in string of first trie match */ + U32 firstchars; /* len in chars of firstpos from start */ + U16 nextword; /* next word to try */ + U16 topword; /* longest accepted word */ } trie; /* special types - these members are used to store state for special @@ -826,31 +926,31 @@ typedef struct regmatch_state { struct regmatch_state *prev_curlyx; struct regmatch_state *prev_eval; REGEXP *prev_rex; - CHECKPOINT cp; /* remember current savestack indexes */ - CHECKPOINT lastcp; - U32 close_paren; /* which close bracket is our end (+1) */ - regnode *B; /* the node following us */ + CHECKPOINT cp; /* see note above "struct branchlike" */ + CHECKPOINT lastcp; /* see note above "struct branchlike" */ + U32 close_paren; /* which close bracket is our end (+1) */ + regnode *B; /* the node following us */ char *prev_recurse_locinput; } eval; struct { /* this first element must match u.yes */ struct regmatch_state *prev_yes_state; - I32 wanted; - I32 logical; /* saved copy of 'logical' var */ - U8 count; /* number of beginning positions */ - char *start; - char *end; - regnode *me; /* the IFMATCH/SUSPEND/UNLESSM node */ - char *prev_match_end; - } ifmatch; /* and SUSPEND/UNLESSM */ + I32 wanted; + I32 logical; /* saved copy of 'logical' var */ + U8 count; /* number of beginning positions */ + char *start; + char *end; + regnode *me; /* the IFMATCH/SUSPEND/UNLESSM node */ + char *prev_match_end; + } ifmatch; /* and SUSPEND/UNLESSM */ struct { /* this first element must match u.yes */ struct regmatch_state *prev_yes_state; struct regmatch_state *prev_mark; - SV* mark_name; - char *mark_loc; + SV *mark_name; + char *mark_loc; } mark; struct { @@ -863,24 +963,25 @@ typedef struct regmatch_state { /* this first element must match u.yes */ struct regmatch_state *prev_yes_state; struct regmatch_state *prev_curlyx; /* previous cur_curlyx */ - regnode *me; /* the CURLYX node */ - regnode *B; /* the B node in /A*B/ */ - CHECKPOINT cp; /* remember current savestack index */ + regnode *me; /* the CURLYX node */ + regnode *B; /* the B node in /A*B/ */ + CHECKPOINT cp; /* see note above "struct branchlike" */ + CHECKPOINT lastcp; /* see note above "struct branchlike" */ bool minmod; - int parenfloor;/* how far back to strip paren data */ + int parenfloor; /* how far back to strip paren data */ /* these two are modified by WHILEM */ - int count; /* how many instances of A we've matched */ - char *lastloc;/* where previous A matched (0-len detect) */ + int count; /* how many instances of A we've matched */ + char *lastloc; /* where previous A matched (0-len detect) */ } curlyx; struct { /* this first element must match u.yes */ struct regmatch_state *prev_yes_state; struct regmatch_state *save_curlyx; - CHECKPOINT cp; /* remember current savestack indexes */ - CHECKPOINT lastcp; - char *save_lastloc; /* previous curlyx.lastloc */ + CHECKPOINT cp; /* see note above "struct branchlike" */ + CHECKPOINT lastcp; /* see note above "struct branchlike" */ + char *save_lastloc; /* previous curlyx.lastloc */ I32 cache_offset; I32 cache_mask; } whilem; @@ -888,30 +989,36 @@ typedef struct regmatch_state { struct { /* this first element must match u.yes */ struct regmatch_state *prev_yes_state; - CHECKPOINT cp; - U32 lastparen; - U32 lastcloseparen; - I32 alen; /* length of first-matched A string */ - I32 count; - bool minmod; - regnode *A, *B; /* the nodes corresponding to /A*B/ */ - regnode *me; /* the curlym node */ + U32 lastparen; + U32 lastcloseparen; + CHECKPOINT cp; /* see note above "struct branchlike" */ + CHECKPOINT lastcp; /* see note above "struct branchlike" */ + I32 alen; /* length of first-matched A string */ + I32 count; + bool minmod; + regnode *A, *B; /* the nodes corresponding to /A*B/ */ + regnode *me; /* the curlym node */ struct next_matchable_info Binfo; } curlym; struct { - U32 paren; - CHECKPOINT cp; - U32 lastparen; - U32 lastcloseparen; - char *maxpos; /* highest possible point in string to match */ - char *oldloc; /* the previous locinput */ - int count; - int min, max; /* {m,n} */ - regnode *A, *B; /* the nodes corresponding to /A*B/ */ + U32 paren; + U32 lastparen; + U32 lastcloseparen; + CHECKPOINT cp; /* see note above "struct branchlike" */ + CHECKPOINT lastcp; /* see note above "struct branchlike" */ + char *maxpos; /* highest possible point in string to match */ + char *oldloc; /* the previous locinput */ + int count; + int min, max; /* {m,n} */ + regnode *A, *B; /* the nodes corresponding to /A*B/ */ struct next_matchable_info Binfo; } curly; /* and CURLYN/PLUS/STAR */ + struct { + CHECKPOINT cp; + CHECKPOINT lastcp; + } backref; /* REF and friends */ } u; } regmatch_state; @@ -930,6 +1037,7 @@ typedef struct regmatch_slab { } regmatch_slab; +#define REG_FETCH_ABSOLUTE 1 /* * ex: set ts=8 sts=4 sw=4 et: Index: gnu/usr.bin/perl/reginline.h =================================================================== RCS file: gnu/usr.bin/perl/reginline.h diff -N gnu/usr.bin/perl/reginline.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/reginline.h 21 Feb 2024 15:47:03 -0000 @@ -0,0 +1,64 @@ + +#ifndef PERL_REGINLINE_H + +/* + - regnext - dig the "next" pointer out of a node + */ +PERL_STATIC_INLINE +regnode * +Perl_regnext(pTHX_ const regnode *p) +{ + I32 offset; + + if (!p) + return(NULL); + + if (OP(p) > REGNODE_MAX) { /* regnode.type is unsigned */ + Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d", + (int)OP(p), (int)REGNODE_MAX); + } + + offset = (REGNODE_OFF_BY_ARG(OP(p)) ? ARG1u(p) : NEXT_OFF(p)); + if (offset == 0) + return(NULL); + + return(regnode *)(p+offset); +} + +/* + - regnode_after - find the node physically following p in memory, + taking into account the size of p as determined by OP(p), our + sizing data, and possibly the STR_SZ() macro. + */ +PERL_STATIC_INLINE +regnode * +Perl_regnode_after(pTHX_ const regnode *p, const bool varies) +{ + assert(p); + const U8 op = OP(p); + assert(op < REGNODE_MAX); + const regnode *ret = p + NODE_STEP_REGNODE + REGNODE_ARG_LEN(op); + if (varies || REGNODE_ARG_LEN_VARIES(op)) + ret += STR_SZ(STR_LEN(p)); + return (regnode *)ret; +} + +/* validate that the passed in node and extra length would match that + * returned by regnode_after() */ +PERL_STATIC_INLINE +bool +Perl_check_regnode_after(pTHX_ const regnode *p, const STRLEN extra) +{ + const regnode *nextoper = regnode_after((regnode *)p,FALSE); + const regnode *other = REGNODE_AFTER_PLUS(p, extra); + if (nextoper != other) { + return FALSE; + } + return TRUE; +} + +#define PERL_REGINLINE_H +#endif +/* + * ex: set ts=8 sts=4 sw=4 et: + */ Index: gnu/usr.bin/perl/regnodes.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/regnodes.h,v diff -u -p -a -u -p -r1.6 regnodes.h --- gnu/usr.bin/perl/regnodes.h 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/regnodes.h 21 Feb 2024 15:47:03 -0000 @@ -1,15 +1,134 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! - This file is built by regen/regcomp.pl from regcomp.sym. + This file is built by regen/regcomp.pl from regcomp.sym, op_reg_common.h + and regexp.h. Any changes made here will be lost! */ #if defined(PERL_CORE) || defined(PERL_EXT_RE_BUILD) + +/* typedefs for regex nodes - one typedef per node type */ + +typedef struct regnode_2 tregnode_ACCEPT; +typedef struct regnode_1 tregnode_AHOCORASICK; +typedef struct regnode_charclass tregnode_AHOCORASICKC; +typedef struct regnode_charclass tregnode_ANYOF; +typedef struct regnode_charclass tregnode_ANYOFD; +typedef struct regnode_1 tregnode_ANYOFH; +typedef struct regnode_1 tregnode_ANYOFHb; +typedef struct regnode_bbm tregnode_ANYOFHbbm; +typedef struct regnode_1 tregnode_ANYOFHr; +typedef struct regnode_1 tregnode_ANYOFHs; +typedef struct regnode_charclass tregnode_ANYOFL; +typedef struct regnode_1 tregnode_ANYOFM; +typedef struct regnode_charclass_posixl tregnode_ANYOFPOSIXL; +typedef struct regnode_1 tregnode_ANYOFR; +typedef struct regnode_1 tregnode_ANYOFRb; +typedef struct regnode tregnode_BOUND; +typedef struct regnode tregnode_BOUNDA; +typedef struct regnode tregnode_BOUNDL; +typedef struct regnode tregnode_BOUNDU; +typedef struct regnode_1 tregnode_BRANCH; +typedef struct regnode_2 tregnode_BRANCHJ; +typedef struct regnode_1 tregnode_CLOSE; +typedef struct regnode tregnode_CLUMP; +typedef struct regnode_1 tregnode_COMMIT; +typedef struct regnode_3 tregnode_CURLY; +typedef struct regnode_3 tregnode_CURLYM; +typedef struct regnode_3 tregnode_CURLYN; +typedef struct regnode_3 tregnode_CURLYX; +typedef struct regnode_1 tregnode_CUTGROUP; +typedef struct regnode_1 tregnode_DEFINEP; +typedef struct regnode tregnode_END; +typedef struct regnode tregnode_ENDLIKE; +typedef struct regnode tregnode_EOS; +typedef struct regnode_2 tregnode_EVAL; +typedef struct regnode tregnode_EXACT; +typedef struct regnode tregnode_EXACTF; +typedef struct regnode tregnode_EXACTFAA; +typedef struct regnode tregnode_EXACTFAA_NO_TRIE; +typedef struct regnode tregnode_EXACTFL; +typedef struct regnode tregnode_EXACTFLU8; +typedef struct regnode tregnode_EXACTFU; +typedef struct regnode tregnode_EXACTFUP; +typedef struct regnode tregnode_EXACTFU_REQ8; +typedef struct regnode tregnode_EXACTFU_S_EDGE; +typedef struct regnode tregnode_EXACTL; +typedef struct regnode tregnode_EXACT_REQ8; +typedef struct regnode_2 tregnode_GOSUB; +typedef struct regnode tregnode_GPOS; +typedef struct regnode_1 tregnode_GROUPP; +typedef struct regnode_1 tregnode_GROUPPN; +typedef struct regnode_1 tregnode_IFMATCH; +typedef struct regnode_1 tregnode_IFTHEN; +typedef struct regnode_1 tregnode_INSUBP; +typedef struct regnode tregnode_KEEPS; +typedef struct regnode_1 tregnode_LEXACT; +typedef struct regnode_1 tregnode_LEXACT_REQ8; +typedef struct regnode tregnode_LNBREAK; +typedef struct regnode tregnode_LOGICAL; +typedef struct regnode_1 tregnode_LONGJMP; +typedef struct regnode tregnode_LOOKBEHIND_END; +typedef struct regnode_1 tregnode_MARKPOINT; +typedef struct regnode tregnode_MBOL; +typedef struct regnode tregnode_MEOL; +typedef struct regnode tregnode_MINMOD; +typedef struct regnode_1 tregnode_NANYOFM; +typedef struct regnode tregnode_NBOUND; +typedef struct regnode tregnode_NBOUNDA; +typedef struct regnode tregnode_NBOUNDL; +typedef struct regnode tregnode_NBOUNDU; +typedef struct regnode tregnode_NOTHING; +typedef struct regnode tregnode_NPOSIXA; +typedef struct regnode tregnode_NPOSIXD; +typedef struct regnode tregnode_NPOSIXL; +typedef struct regnode tregnode_NPOSIXU; +typedef struct regnode_1 tregnode_OPEN; +typedef struct regnode_1 tregnode_OPFAIL; +typedef struct regnode tregnode_OPTIMIZED; +typedef struct regnode tregnode_PLUS; +typedef struct regnode tregnode_POSIXA; +typedef struct regnode tregnode_POSIXD; +typedef struct regnode tregnode_POSIXL; +typedef struct regnode tregnode_POSIXU; +typedef struct regnode_1 tregnode_PRUNE; +typedef struct regnode tregnode_PSEUDO; +typedef struct regnode_2 tregnode_REF; +typedef struct regnode_2 tregnode_REFF; +typedef struct regnode_2 tregnode_REFFA; +typedef struct regnode_2 tregnode_REFFAN; +typedef struct regnode_2 tregnode_REFFL; +typedef struct regnode_2 tregnode_REFFLN; +typedef struct regnode_2 tregnode_REFFN; +typedef struct regnode_2 tregnode_REFFU; +typedef struct regnode_2 tregnode_REFFUN; +typedef struct regnode_2 tregnode_REFN; +typedef struct regnode_p tregnode_REGEX_SET; +typedef struct regnode tregnode_REG_ANY; +typedef struct regnode_1 tregnode_RENUM; +typedef struct regnode tregnode_SANY; +typedef struct regnode tregnode_SBOL; +typedef struct regnode tregnode_SEOL; +typedef struct regnode_1 tregnode_SKIP; +typedef struct regnode tregnode_SRCLOSE; +typedef struct regnode tregnode_SROPEN; +typedef struct regnode tregnode_STAR; +typedef struct regnode tregnode_SUCCEED; +typedef struct regnode_1 tregnode_SUSPEND; +typedef struct regnode tregnode_TAIL; +typedef struct regnode_1 tregnode_TRIE; +typedef struct regnode_charclass tregnode_TRIEC; +typedef struct regnode_1 tregnode_UNLESSM; +typedef struct regnode_1 tregnode_VERB; +typedef struct regnode tregnode_WHILEM; + +/* end typedefs */ + /* Regops and State definitions */ -#define REGNODE_MAX 110 -#define REGMATCH_STATE_MAX 150 +#define REGNODE_MAX 111 +#define REGMATCH_STATE_MAX 153 /* -- For regexec.c to switch on target being utf8 (t8) or not (tb, b='byte'); */ #define with_t_UTF8ness(op, t_utf8) (((op) << 1) + (cBOOL(t_utf8))) @@ -317,1529 +436,1166 @@ #define ANYOFRb_t8_pb 110 /* 0x06e */ #define ANYOFRb_t8_p8 111 /* 0x06f */ -#define ANYOFM 28 /* 0x1c Like ANYOF, but matches +#define ANYOFHbbm 28 /* 0x1c Like ANYOFHb, but only + for 2-byte UTF-8 characters; + uses a bitmap to match the + continuation byte */ +#define ANYOFHbbm_tb 56 /* 0x038 */ +#define ANYOFHbbm_t8 57 /* 0x039 */ +#define ANYOFHbbm_tb_pb 112 /* 0x070 */ +#define ANYOFHbbm_tb_p8 113 /* 0x071 */ +#define ANYOFHbbm_t8_pb 114 /* 0x072 */ +#define ANYOFHbbm_t8_p8 115 /* 0x073 */ + +#define ANYOFM 29 /* 0x1d Like ANYOF, but matches an invariant byte as determined by the mask and arg */ -#define ANYOFM_tb 56 /* 0x038 */ -#define ANYOFM_t8 57 /* 0x039 */ -#define ANYOFM_tb_pb 112 /* 0x070 */ -#define ANYOFM_tb_p8 113 /* 0x071 */ -#define ANYOFM_t8_pb 114 /* 0x072 */ -#define ANYOFM_t8_p8 115 /* 0x073 */ - -#define NANYOFM 29 /* 0x1d complement of ANYOFM */ -#define NANYOFM_tb 58 /* 0x03a */ -#define NANYOFM_t8 59 /* 0x03b */ -#define NANYOFM_tb_pb 116 /* 0x074 */ -#define NANYOFM_tb_p8 117 /* 0x075 */ -#define NANYOFM_t8_pb 118 /* 0x076 */ -#define NANYOFM_t8_p8 119 /* 0x077 */ +#define ANYOFM_tb 58 /* 0x03a */ +#define ANYOFM_t8 59 /* 0x03b */ +#define ANYOFM_tb_pb 116 /* 0x074 */ +#define ANYOFM_tb_p8 117 /* 0x075 */ +#define ANYOFM_t8_pb 118 /* 0x076 */ +#define ANYOFM_t8_p8 119 /* 0x077 */ + +#define NANYOFM 30 /* 0x1e complement of ANYOFM */ +#define NANYOFM_tb 60 /* 0x03c */ +#define NANYOFM_t8 61 /* 0x03d */ +#define NANYOFM_tb_pb 120 /* 0x078 */ +#define NANYOFM_tb_p8 121 /* 0x079 */ +#define NANYOFM_t8_pb 122 /* 0x07a */ +#define NANYOFM_t8_p8 123 /* 0x07b */ -#define POSIXD 30 /* 0x1e Some [[:class:]] under +#define POSIXD 31 /* 0x1f Some [[:class:]] under /d; the FLAGS field gives which one */ -#define POSIXD_tb 60 /* 0x03c */ -#define POSIXD_t8 61 /* 0x03d */ -#define POSIXD_tb_pb 120 /* 0x078 */ -#define POSIXD_tb_p8 121 /* 0x079 */ -#define POSIXD_t8_pb 122 /* 0x07a */ -#define POSIXD_t8_p8 123 /* 0x07b */ +#define POSIXD_tb 62 /* 0x03e */ +#define POSIXD_t8 63 /* 0x03f */ +#define POSIXD_tb_pb 124 /* 0x07c */ +#define POSIXD_tb_p8 125 /* 0x07d */ +#define POSIXD_t8_pb 126 /* 0x07e */ +#define POSIXD_t8_p8 127 /* 0x07f */ -#define POSIXL 31 /* 0x1f Some [[:class:]] under +#define POSIXL 32 /* 0x20 Some [[:class:]] under /l; the FLAGS field gives which one */ -#define POSIXL_tb 62 /* 0x03e */ -#define POSIXL_t8 63 /* 0x03f */ -#define POSIXL_tb_pb 124 /* 0x07c */ -#define POSIXL_tb_p8 125 /* 0x07d */ -#define POSIXL_t8_pb 126 /* 0x07e */ -#define POSIXL_t8_p8 127 /* 0x07f */ +#define POSIXL_tb 64 /* 0x040 */ +#define POSIXL_t8 65 /* 0x041 */ +#define POSIXL_tb_pb 128 /* 0x080 */ +#define POSIXL_tb_p8 129 /* 0x081 */ +#define POSIXL_t8_pb 130 /* 0x082 */ +#define POSIXL_t8_p8 131 /* 0x083 */ -#define POSIXU 32 /* 0x20 Some [[:class:]] under +#define POSIXU 33 /* 0x21 Some [[:class:]] under /u; the FLAGS field gives which one */ -#define POSIXU_tb 64 /* 0x040 */ -#define POSIXU_t8 65 /* 0x041 */ -#define POSIXU_tb_pb 128 /* 0x080 */ -#define POSIXU_tb_p8 129 /* 0x081 */ -#define POSIXU_t8_pb 130 /* 0x082 */ -#define POSIXU_t8_p8 131 /* 0x083 */ +#define POSIXU_tb 66 /* 0x042 */ +#define POSIXU_t8 67 /* 0x043 */ +#define POSIXU_tb_pb 132 /* 0x084 */ +#define POSIXU_tb_p8 133 /* 0x085 */ +#define POSIXU_t8_pb 134 /* 0x086 */ +#define POSIXU_t8_p8 135 /* 0x087 */ -#define POSIXA 33 /* 0x21 Some [[:class:]] under +#define POSIXA 34 /* 0x22 Some [[:class:]] under /a; the FLAGS field gives which one */ -#define POSIXA_tb 66 /* 0x042 */ -#define POSIXA_t8 67 /* 0x043 */ -#define POSIXA_tb_pb 132 /* 0x084 */ -#define POSIXA_tb_p8 133 /* 0x085 */ -#define POSIXA_t8_pb 134 /* 0x086 */ -#define POSIXA_t8_p8 135 /* 0x087 */ +#define POSIXA_tb 68 /* 0x044 */ +#define POSIXA_t8 69 /* 0x045 */ +#define POSIXA_tb_pb 136 /* 0x088 */ +#define POSIXA_tb_p8 137 /* 0x089 */ +#define POSIXA_t8_pb 138 /* 0x08a */ +#define POSIXA_t8_p8 139 /* 0x08b */ -#define NPOSIXD 34 /* 0x22 complement of POSIXD, +#define NPOSIXD 35 /* 0x23 complement of POSIXD, [[:^class:]] */ -#define NPOSIXD_tb 68 /* 0x044 */ -#define NPOSIXD_t8 69 /* 0x045 */ -#define NPOSIXD_tb_pb 136 /* 0x088 */ -#define NPOSIXD_tb_p8 137 /* 0x089 */ -#define NPOSIXD_t8_pb 138 /* 0x08a */ -#define NPOSIXD_t8_p8 139 /* 0x08b */ +#define NPOSIXD_tb 70 /* 0x046 */ +#define NPOSIXD_t8 71 /* 0x047 */ +#define NPOSIXD_tb_pb 140 /* 0x08c */ +#define NPOSIXD_tb_p8 141 /* 0x08d */ +#define NPOSIXD_t8_pb 142 /* 0x08e */ +#define NPOSIXD_t8_p8 143 /* 0x08f */ -#define NPOSIXL 35 /* 0x23 complement of POSIXL, +#define NPOSIXL 36 /* 0x24 complement of POSIXL, [[:^class:]] */ -#define NPOSIXL_tb 70 /* 0x046 */ -#define NPOSIXL_t8 71 /* 0x047 */ -#define NPOSIXL_tb_pb 140 /* 0x08c */ -#define NPOSIXL_tb_p8 141 /* 0x08d */ -#define NPOSIXL_t8_pb 142 /* 0x08e */ -#define NPOSIXL_t8_p8 143 /* 0x08f */ +#define NPOSIXL_tb 72 /* 0x048 */ +#define NPOSIXL_t8 73 /* 0x049 */ +#define NPOSIXL_tb_pb 144 /* 0x090 */ +#define NPOSIXL_tb_p8 145 /* 0x091 */ +#define NPOSIXL_t8_pb 146 /* 0x092 */ +#define NPOSIXL_t8_p8 147 /* 0x093 */ -#define NPOSIXU 36 /* 0x24 complement of POSIXU, +#define NPOSIXU 37 /* 0x25 complement of POSIXU, [[:^class:]] */ -#define NPOSIXU_tb 72 /* 0x048 */ -#define NPOSIXU_t8 73 /* 0x049 */ -#define NPOSIXU_tb_pb 144 /* 0x090 */ -#define NPOSIXU_tb_p8 145 /* 0x091 */ -#define NPOSIXU_t8_pb 146 /* 0x092 */ -#define NPOSIXU_t8_p8 147 /* 0x093 */ +#define NPOSIXU_tb 74 /* 0x04a */ +#define NPOSIXU_t8 75 /* 0x04b */ +#define NPOSIXU_tb_pb 148 /* 0x094 */ +#define NPOSIXU_tb_p8 149 /* 0x095 */ +#define NPOSIXU_t8_pb 150 /* 0x096 */ +#define NPOSIXU_t8_p8 151 /* 0x097 */ -#define NPOSIXA 37 /* 0x25 complement of POSIXA, +#define NPOSIXA 38 /* 0x26 complement of POSIXA, [[:^class:]] */ -#define NPOSIXA_tb 74 /* 0x04a */ -#define NPOSIXA_t8 75 /* 0x04b */ -#define NPOSIXA_tb_pb 148 /* 0x094 */ -#define NPOSIXA_tb_p8 149 /* 0x095 */ -#define NPOSIXA_t8_pb 150 /* 0x096 */ -#define NPOSIXA_t8_p8 151 /* 0x097 */ +#define NPOSIXA_tb 76 /* 0x04c */ +#define NPOSIXA_t8 77 /* 0x04d */ +#define NPOSIXA_tb_pb 152 /* 0x098 */ +#define NPOSIXA_tb_p8 153 /* 0x099 */ +#define NPOSIXA_t8_pb 154 /* 0x09a */ +#define NPOSIXA_t8_p8 155 /* 0x09b */ -#define CLUMP 38 /* 0x26 Match any extended +#define CLUMP 39 /* 0x27 Match any extended grapheme cluster sequence */ -#define CLUMP_tb 76 /* 0x04c */ -#define CLUMP_t8 77 /* 0x04d */ -#define CLUMP_tb_pb 152 /* 0x098 */ -#define CLUMP_tb_p8 153 /* 0x099 */ -#define CLUMP_t8_pb 154 /* 0x09a */ -#define CLUMP_t8_p8 155 /* 0x09b */ +#define CLUMP_tb 78 /* 0x04e */ +#define CLUMP_t8 79 /* 0x04f */ +#define CLUMP_tb_pb 156 /* 0x09c */ +#define CLUMP_tb_p8 157 /* 0x09d */ +#define CLUMP_t8_pb 158 /* 0x09e */ +#define CLUMP_t8_p8 159 /* 0x09f */ -#define BRANCH 39 /* 0x27 Match this alternative, +#define BRANCH 40 /* 0x28 Match this alternative, or the next... */ -#define BRANCH_tb 78 /* 0x04e */ -#define BRANCH_t8 79 /* 0x04f */ -#define BRANCH_tb_pb 156 /* 0x09c */ -#define BRANCH_tb_p8 157 /* 0x09d */ -#define BRANCH_t8_pb 158 /* 0x09e */ -#define BRANCH_t8_p8 159 /* 0x09f */ +#define BRANCH_tb 80 /* 0x050 */ +#define BRANCH_t8 81 /* 0x051 */ +#define BRANCH_tb_pb 160 /* 0x0a0 */ +#define BRANCH_tb_p8 161 /* 0x0a1 */ +#define BRANCH_t8_pb 162 /* 0x0a2 */ +#define BRANCH_t8_p8 163 /* 0x0a3 */ -#define EXACT 40 /* 0x28 Match this string +#define EXACT 41 /* 0x29 Match this string (flags field is the length). */ -#define EXACT_tb 80 /* 0x050 */ -#define EXACT_t8 81 /* 0x051 */ -#define EXACT_tb_pb 160 /* 0x0a0 */ -#define EXACT_tb_p8 161 /* 0x0a1 */ -#define EXACT_t8_pb 162 /* 0x0a2 */ -#define EXACT_t8_p8 163 /* 0x0a3 */ +#define EXACT_tb 82 /* 0x052 */ +#define EXACT_t8 83 /* 0x053 */ +#define EXACT_tb_pb 164 /* 0x0a4 */ +#define EXACT_tb_p8 165 /* 0x0a5 */ +#define EXACT_t8_pb 166 /* 0x0a6 */ +#define EXACT_t8_p8 167 /* 0x0a7 */ -#define LEXACT 41 /* 0x29 Match this long string +#define LEXACT 42 /* 0x2a Match this long string (preceded by length; flags unused). */ -#define LEXACT_tb 82 /* 0x052 */ -#define LEXACT_t8 83 /* 0x053 */ -#define LEXACT_tb_pb 164 /* 0x0a4 */ -#define LEXACT_tb_p8 165 /* 0x0a5 */ -#define LEXACT_t8_pb 166 /* 0x0a6 */ -#define LEXACT_t8_p8 167 /* 0x0a7 */ +#define LEXACT_tb 84 /* 0x054 */ +#define LEXACT_t8 85 /* 0x055 */ +#define LEXACT_tb_pb 168 /* 0x0a8 */ +#define LEXACT_tb_p8 169 /* 0x0a9 */ +#define LEXACT_t8_pb 170 /* 0x0aa */ +#define LEXACT_t8_p8 171 /* 0x0ab */ -#define EXACTL 42 /* 0x2a Like EXACT, but /l is +#define EXACTL 43 /* 0x2b Like EXACT, but /l is in effect (used so locale-related warnings can be checked for) */ -#define EXACTL_tb 84 /* 0x054 */ -#define EXACTL_t8 85 /* 0x055 */ -#define EXACTL_tb_pb 168 /* 0x0a8 */ -#define EXACTL_tb_p8 169 /* 0x0a9 */ -#define EXACTL_t8_pb 170 /* 0x0aa */ -#define EXACTL_t8_p8 171 /* 0x0ab */ +#define EXACTL_tb 86 /* 0x056 */ +#define EXACTL_t8 87 /* 0x057 */ +#define EXACTL_tb_pb 172 /* 0x0ac */ +#define EXACTL_tb_p8 173 /* 0x0ad */ +#define EXACTL_t8_pb 174 /* 0x0ae */ +#define EXACTL_t8_p8 175 /* 0x0af */ -#define EXACTF 43 /* 0x2b Like EXACT, but match +#define EXACTF 44 /* 0x2c Like EXACT, but match using /id rules; (string not UTF-8, ASCII folded; non-ASCII not) */ -#define EXACTF_tb 86 /* 0x056 */ -#define EXACTF_t8 87 /* 0x057 */ -#define EXACTF_tb_pb 172 /* 0x0ac */ -#define EXACTF_tb_p8 173 /* 0x0ad */ -#define EXACTF_t8_pb 174 /* 0x0ae */ -#define EXACTF_t8_p8 175 /* 0x0af */ +#define EXACTF_tb 88 /* 0x058 */ +#define EXACTF_t8 89 /* 0x059 */ +#define EXACTF_tb_pb 176 /* 0x0b0 */ +#define EXACTF_tb_p8 177 /* 0x0b1 */ +#define EXACTF_t8_pb 178 /* 0x0b2 */ +#define EXACTF_t8_p8 179 /* 0x0b3 */ -#define EXACTFL 44 /* 0x2c Like EXACT, but match +#define EXACTFL 45 /* 0x2d Like EXACT, but match using /il rules; (string not likely to be folded) */ -#define EXACTFL_tb 88 /* 0x058 */ -#define EXACTFL_t8 89 /* 0x059 */ -#define EXACTFL_tb_pb 176 /* 0x0b0 */ -#define EXACTFL_tb_p8 177 /* 0x0b1 */ -#define EXACTFL_t8_pb 178 /* 0x0b2 */ -#define EXACTFL_t8_p8 179 /* 0x0b3 */ +#define EXACTFL_tb 90 /* 0x05a */ +#define EXACTFL_t8 91 /* 0x05b */ +#define EXACTFL_tb_pb 180 /* 0x0b4 */ +#define EXACTFL_tb_p8 181 /* 0x0b5 */ +#define EXACTFL_t8_pb 182 /* 0x0b6 */ +#define EXACTFL_t8_p8 183 /* 0x0b7 */ -#define EXACTFU 45 /* 0x2d Like EXACT, but match +#define EXACTFU 46 /* 0x2e Like EXACT, but match using /iu rules; (string folded) */ -#define EXACTFU_tb 90 /* 0x05a */ -#define EXACTFU_t8 91 /* 0x05b */ -#define EXACTFU_tb_pb 180 /* 0x0b4 */ -#define EXACTFU_tb_p8 181 /* 0x0b5 */ -#define EXACTFU_t8_pb 182 /* 0x0b6 */ -#define EXACTFU_t8_p8 183 /* 0x0b7 */ +#define EXACTFU_tb 92 /* 0x05c */ +#define EXACTFU_t8 93 /* 0x05d */ +#define EXACTFU_tb_pb 184 /* 0x0b8 */ +#define EXACTFU_tb_p8 185 /* 0x0b9 */ +#define EXACTFU_t8_pb 186 /* 0x0ba */ +#define EXACTFU_t8_p8 187 /* 0x0bb */ -#define EXACTFAA 46 /* 0x2e Like EXACT, but match +#define EXACTFAA 47 /* 0x2f Like EXACT, but match using /iaa rules; (string folded except MICRO in non-UTF8 patterns; doesn't contain SHARP S unless UTF-8; folded length <= unfolded) */ -#define EXACTFAA_tb 92 /* 0x05c */ -#define EXACTFAA_t8 93 /* 0x05d */ -#define EXACTFAA_tb_pb 184 /* 0x0b8 */ -#define EXACTFAA_tb_p8 185 /* 0x0b9 */ -#define EXACTFAA_t8_pb 186 /* 0x0ba */ -#define EXACTFAA_t8_p8 187 /* 0x0bb */ +#define EXACTFAA_tb 94 /* 0x05e */ +#define EXACTFAA_t8 95 /* 0x05f */ +#define EXACTFAA_tb_pb 188 /* 0x0bc */ +#define EXACTFAA_tb_p8 189 /* 0x0bd */ +#define EXACTFAA_t8_pb 190 /* 0x0be */ +#define EXACTFAA_t8_p8 191 /* 0x0bf */ -#define EXACTFAA_NO_TRIE 47 /* 0x2f Like EXACTFAA, (string +#define EXACTFAA_NO_TRIE 48 /* 0x30 Like EXACTFAA, (string not UTF-8, folded except: MICRO, SHARP S; folded length <= unfolded, not currently trie-able) */ -#define EXACTFAA_NO_TRIE_tb 94 /* 0x05e */ -#define EXACTFAA_NO_TRIE_t8 95 /* 0x05f */ -#define EXACTFAA_NO_TRIE_tb_pb 188 /* 0x0bc */ -#define EXACTFAA_NO_TRIE_tb_p8 189 /* 0x0bd */ -#define EXACTFAA_NO_TRIE_t8_pb 190 /* 0x0be */ -#define EXACTFAA_NO_TRIE_t8_p8 191 /* 0x0bf */ +#define EXACTFAA_NO_TRIE_tb 96 /* 0x060 */ +#define EXACTFAA_NO_TRIE_t8 97 /* 0x061 */ +#define EXACTFAA_NO_TRIE_tb_pb 192 /* 0x0c0 */ +#define EXACTFAA_NO_TRIE_tb_p8 193 /* 0x0c1 */ +#define EXACTFAA_NO_TRIE_t8_pb 194 /* 0x0c2 */ +#define EXACTFAA_NO_TRIE_t8_p8 195 /* 0x0c3 */ -#define EXACTFUP 48 /* 0x30 Like EXACT, but match +#define EXACTFUP 49 /* 0x31 Like EXACT, but match using /iu rules; (string not UTF-8, folded except MICRO: hence Problematic) */ -#define EXACTFUP_tb 96 /* 0x060 */ -#define EXACTFUP_t8 97 /* 0x061 */ -#define EXACTFUP_tb_pb 192 /* 0x0c0 */ -#define EXACTFUP_tb_p8 193 /* 0x0c1 */ -#define EXACTFUP_t8_pb 194 /* 0x0c2 */ -#define EXACTFUP_t8_p8 195 /* 0x0c3 */ +#define EXACTFUP_tb 98 /* 0x062 */ +#define EXACTFUP_t8 99 /* 0x063 */ +#define EXACTFUP_tb_pb 196 /* 0x0c4 */ +#define EXACTFUP_tb_p8 197 /* 0x0c5 */ +#define EXACTFUP_t8_pb 198 /* 0x0c6 */ +#define EXACTFUP_t8_p8 199 /* 0x0c7 */ -#define EXACTFLU8 49 /* 0x31 Like EXACTFU, but use +#define EXACTFLU8 50 /* 0x32 Like EXACTFU, but use /il, UTF-8, (string is folded, and everything in it is above 255 */ -#define EXACTFLU8_tb 98 /* 0x062 */ -#define EXACTFLU8_t8 99 /* 0x063 */ -#define EXACTFLU8_tb_pb 196 /* 0x0c4 */ -#define EXACTFLU8_tb_p8 197 /* 0x0c5 */ -#define EXACTFLU8_t8_pb 198 /* 0x0c6 */ -#define EXACTFLU8_t8_p8 199 /* 0x0c7 */ +#define EXACTFLU8_tb 100 /* 0x064 */ +#define EXACTFLU8_t8 101 /* 0x065 */ +#define EXACTFLU8_tb_pb 200 /* 0x0c8 */ +#define EXACTFLU8_tb_p8 201 /* 0x0c9 */ +#define EXACTFLU8_t8_pb 202 /* 0x0ca */ +#define EXACTFLU8_t8_p8 203 /* 0x0cb */ -#define EXACT_REQ8 50 /* 0x32 Like EXACT, but only +#define EXACT_REQ8 51 /* 0x33 Like EXACT, but only UTF-8 encoded targets can match */ -#define EXACT_REQ8_tb 100 /* 0x064 */ -#define EXACT_REQ8_t8 101 /* 0x065 */ -#define EXACT_REQ8_tb_pb 200 /* 0x0c8 */ -#define EXACT_REQ8_tb_p8 201 /* 0x0c9 */ -#define EXACT_REQ8_t8_pb 202 /* 0x0ca */ -#define EXACT_REQ8_t8_p8 203 /* 0x0cb */ +#define EXACT_REQ8_tb 102 /* 0x066 */ +#define EXACT_REQ8_t8 103 /* 0x067 */ +#define EXACT_REQ8_tb_pb 204 /* 0x0cc */ +#define EXACT_REQ8_tb_p8 205 /* 0x0cd */ +#define EXACT_REQ8_t8_pb 206 /* 0x0ce */ +#define EXACT_REQ8_t8_p8 207 /* 0x0cf */ -#define LEXACT_REQ8 51 /* 0x33 Like LEXACT, but only +#define LEXACT_REQ8 52 /* 0x34 Like LEXACT, but only UTF-8 encoded targets can match */ -#define LEXACT_REQ8_tb 102 /* 0x066 */ -#define LEXACT_REQ8_t8 103 /* 0x067 */ -#define LEXACT_REQ8_tb_pb 204 /* 0x0cc */ -#define LEXACT_REQ8_tb_p8 205 /* 0x0cd */ -#define LEXACT_REQ8_t8_pb 206 /* 0x0ce */ -#define LEXACT_REQ8_t8_p8 207 /* 0x0cf */ +#define LEXACT_REQ8_tb 104 /* 0x068 */ +#define LEXACT_REQ8_t8 105 /* 0x069 */ +#define LEXACT_REQ8_tb_pb 208 /* 0x0d0 */ +#define LEXACT_REQ8_tb_p8 209 /* 0x0d1 */ +#define LEXACT_REQ8_t8_pb 210 /* 0x0d2 */ +#define LEXACT_REQ8_t8_p8 211 /* 0x0d3 */ -#define EXACTFU_REQ8 52 /* 0x34 Like EXACTFU, but only +#define EXACTFU_REQ8 53 /* 0x35 Like EXACTFU, but only UTF-8 encoded targets can match */ -#define EXACTFU_REQ8_tb 104 /* 0x068 */ -#define EXACTFU_REQ8_t8 105 /* 0x069 */ -#define EXACTFU_REQ8_tb_pb 208 /* 0x0d0 */ -#define EXACTFU_REQ8_tb_p8 209 /* 0x0d1 */ -#define EXACTFU_REQ8_t8_pb 210 /* 0x0d2 */ -#define EXACTFU_REQ8_t8_p8 211 /* 0x0d3 */ +#define EXACTFU_REQ8_tb 106 /* 0x06a */ +#define EXACTFU_REQ8_t8 107 /* 0x06b */ +#define EXACTFU_REQ8_tb_pb 212 /* 0x0d4 */ +#define EXACTFU_REQ8_tb_p8 213 /* 0x0d5 */ +#define EXACTFU_REQ8_t8_pb 214 /* 0x0d6 */ +#define EXACTFU_REQ8_t8_p8 215 /* 0x0d7 */ -#define EXACTFU_S_EDGE 53 /* 0x35 /di rules, but nothing +#define EXACTFU_S_EDGE 54 /* 0x36 /di rules, but nothing in it precludes /ui, except begins and/or ends with [Ss]; (string not UTF-8; compile-time only) */ -#define EXACTFU_S_EDGE_tb 106 /* 0x06a */ -#define EXACTFU_S_EDGE_t8 107 /* 0x06b */ -#define EXACTFU_S_EDGE_tb_pb 212 /* 0x0d4 */ -#define EXACTFU_S_EDGE_tb_p8 213 /* 0x0d5 */ -#define EXACTFU_S_EDGE_t8_pb 214 /* 0x0d6 */ -#define EXACTFU_S_EDGE_t8_p8 215 /* 0x0d7 */ +#define EXACTFU_S_EDGE_tb 108 /* 0x06c */ +#define EXACTFU_S_EDGE_t8 109 /* 0x06d */ +#define EXACTFU_S_EDGE_tb_pb 216 /* 0x0d8 */ +#define EXACTFU_S_EDGE_tb_p8 217 /* 0x0d9 */ +#define EXACTFU_S_EDGE_t8_pb 218 /* 0x0da */ +#define EXACTFU_S_EDGE_t8_p8 219 /* 0x0db */ -#define LNBREAK 54 /* 0x36 generic newline pattern +#define LNBREAK 55 /* 0x37 generic newline pattern */ -#define LNBREAK_tb 108 /* 0x06c */ -#define LNBREAK_t8 109 /* 0x06d */ -#define LNBREAK_tb_pb 216 /* 0x0d8 */ -#define LNBREAK_tb_p8 217 /* 0x0d9 */ -#define LNBREAK_t8_pb 218 /* 0x0da */ -#define LNBREAK_t8_p8 219 /* 0x0db */ +#define LNBREAK_tb 110 /* 0x06e */ +#define LNBREAK_t8 111 /* 0x06f */ +#define LNBREAK_tb_pb 220 /* 0x0dc */ +#define LNBREAK_tb_p8 221 /* 0x0dd */ +#define LNBREAK_t8_pb 222 /* 0x0de */ +#define LNBREAK_t8_p8 223 /* 0x0df */ -#define TRIE 55 /* 0x37 Match many +#define TRIE 56 /* 0x38 Match many EXACT(F[ALU]?)? at once. flags==type */ -#define TRIE_tb 110 /* 0x06e */ -#define TRIE_t8 111 /* 0x06f */ -#define TRIE_tb_pb 220 /* 0x0dc */ -#define TRIE_tb_p8 221 /* 0x0dd */ -#define TRIE_t8_pb 222 /* 0x0de */ -#define TRIE_t8_p8 223 /* 0x0df */ +#define TRIE_tb 112 /* 0x070 */ +#define TRIE_t8 113 /* 0x071 */ +#define TRIE_tb_pb 224 /* 0x0e0 */ +#define TRIE_tb_p8 225 /* 0x0e1 */ +#define TRIE_t8_pb 226 /* 0x0e2 */ +#define TRIE_t8_p8 227 /* 0x0e3 */ -#define TRIEC 56 /* 0x38 Same as TRIE, but with +#define TRIEC 57 /* 0x39 Same as TRIE, but with embedded charclass data */ -#define TRIEC_tb 112 /* 0x070 */ -#define TRIEC_t8 113 /* 0x071 */ -#define TRIEC_tb_pb 224 /* 0x0e0 */ -#define TRIEC_tb_p8 225 /* 0x0e1 */ -#define TRIEC_t8_pb 226 /* 0x0e2 */ -#define TRIEC_t8_p8 227 /* 0x0e3 */ +#define TRIEC_tb 114 /* 0x072 */ +#define TRIEC_t8 115 /* 0x073 */ +#define TRIEC_tb_pb 228 /* 0x0e4 */ +#define TRIEC_tb_p8 229 /* 0x0e5 */ +#define TRIEC_t8_pb 230 /* 0x0e6 */ +#define TRIEC_t8_p8 231 /* 0x0e7 */ -#define AHOCORASICK 57 /* 0x39 Aho Corasick stclass. +#define AHOCORASICK 58 /* 0x3a Aho Corasick stclass. flags==type */ -#define AHOCORASICK_tb 114 /* 0x072 */ -#define AHOCORASICK_t8 115 /* 0x073 */ -#define AHOCORASICK_tb_pb 228 /* 0x0e4 */ -#define AHOCORASICK_tb_p8 229 /* 0x0e5 */ -#define AHOCORASICK_t8_pb 230 /* 0x0e6 */ -#define AHOCORASICK_t8_p8 231 /* 0x0e7 */ +#define AHOCORASICK_tb 116 /* 0x074 */ +#define AHOCORASICK_t8 117 /* 0x075 */ +#define AHOCORASICK_tb_pb 232 /* 0x0e8 */ +#define AHOCORASICK_tb_p8 233 /* 0x0e9 */ +#define AHOCORASICK_t8_pb 234 /* 0x0ea */ +#define AHOCORASICK_t8_p8 235 /* 0x0eb */ -#define AHOCORASICKC 58 /* 0x3a Same as AHOCORASICK, +#define AHOCORASICKC 59 /* 0x3b Same as AHOCORASICK, but with embedded charclass data */ -#define AHOCORASICKC_tb 116 /* 0x074 */ -#define AHOCORASICKC_t8 117 /* 0x075 */ -#define AHOCORASICKC_tb_pb 232 /* 0x0e8 */ -#define AHOCORASICKC_tb_p8 233 /* 0x0e9 */ -#define AHOCORASICKC_t8_pb 234 /* 0x0ea */ -#define AHOCORASICKC_t8_p8 235 /* 0x0eb */ - -#define NOTHING 59 /* 0x3b Match empty string. */ -#define NOTHING_tb 118 /* 0x076 */ -#define NOTHING_t8 119 /* 0x077 */ -#define NOTHING_tb_pb 236 /* 0x0ec */ -#define NOTHING_tb_p8 237 /* 0x0ed */ -#define NOTHING_t8_pb 238 /* 0x0ee */ -#define NOTHING_t8_p8 239 /* 0x0ef */ +#define AHOCORASICKC_tb 118 /* 0x076 */ +#define AHOCORASICKC_t8 119 /* 0x077 */ +#define AHOCORASICKC_tb_pb 236 /* 0x0ec */ +#define AHOCORASICKC_tb_p8 237 /* 0x0ed */ +#define AHOCORASICKC_t8_pb 238 /* 0x0ee */ +#define AHOCORASICKC_t8_p8 239 /* 0x0ef */ + +#define NOTHING 60 /* 0x3c Match empty string. */ +#define NOTHING_tb 120 /* 0x078 */ +#define NOTHING_t8 121 /* 0x079 */ +#define NOTHING_tb_pb 240 /* 0x0f0 */ +#define NOTHING_tb_p8 241 /* 0x0f1 */ +#define NOTHING_t8_pb 242 /* 0x0f2 */ +#define NOTHING_t8_p8 243 /* 0x0f3 */ -#define TAIL 60 /* 0x3c Match empty string. Can +#define TAIL 61 /* 0x3d Match empty string. Can jump here from outside. */ -#define TAIL_tb 120 /* 0x078 */ -#define TAIL_t8 121 /* 0x079 */ -#define TAIL_tb_pb 240 /* 0x0f0 */ -#define TAIL_tb_p8 241 /* 0x0f1 */ -#define TAIL_t8_pb 242 /* 0x0f2 */ -#define TAIL_t8_p8 243 /* 0x0f3 */ - -#define STAR 61 /* 0x3d Match this (simple) - thing 0 or more times. */ -#define STAR_tb 122 /* 0x07a */ -#define STAR_t8 123 /* 0x07b */ -#define STAR_tb_pb 244 /* 0x0f4 */ -#define STAR_tb_p8 245 /* 0x0f5 */ -#define STAR_t8_pb 246 /* 0x0f6 */ -#define STAR_t8_p8 247 /* 0x0f7 */ - -#define PLUS 62 /* 0x3e Match this (simple) - thing 1 or more times. */ -#define PLUS_tb 124 /* 0x07c */ -#define PLUS_t8 125 /* 0x07d */ -#define PLUS_tb_pb 248 /* 0x0f8 */ -#define PLUS_tb_p8 249 /* 0x0f9 */ -#define PLUS_t8_pb 250 /* 0x0fa */ -#define PLUS_t8_p8 251 /* 0x0fb */ - -#define CURLY 63 /* 0x3f Match this simple thing - {n,m} times. */ -#define CURLY_tb 126 /* 0x07e */ -#define CURLY_t8 127 /* 0x07f */ -#define CURLY_tb_pb 252 /* 0x0fc */ -#define CURLY_tb_p8 253 /* 0x0fd */ -#define CURLY_t8_pb 254 /* 0x0fe */ -#define CURLY_t8_p8 255 /* 0x0ff */ - -#define CURLYN 64 /* 0x40 Capture next-after-this - simple thing */ -#define CURLYN_tb 128 /* 0x080 */ -#define CURLYN_t8 129 /* 0x081 */ -#define CURLYN_tb_pb 256 /* 0x100 */ -#define CURLYN_tb_p8 257 /* 0x101 */ -#define CURLYN_t8_pb 258 /* 0x102 */ -#define CURLYN_t8_p8 259 /* 0x103 */ +#define TAIL_tb 122 /* 0x07a */ +#define TAIL_t8 123 /* 0x07b */ +#define TAIL_tb_pb 244 /* 0x0f4 */ +#define TAIL_tb_p8 245 /* 0x0f5 */ +#define TAIL_t8_pb 246 /* 0x0f6 */ +#define TAIL_t8_p8 247 /* 0x0f7 */ + +#define STAR 62 /* 0x3e Match this (simple) + thing 0 or more times: + /A{0,}B/ where A is width 1 + char */ +#define STAR_tb 124 /* 0x07c */ +#define STAR_t8 125 /* 0x07d */ +#define STAR_tb_pb 248 /* 0x0f8 */ +#define STAR_tb_p8 249 /* 0x0f9 */ +#define STAR_t8_pb 250 /* 0x0fa */ +#define STAR_t8_p8 251 /* 0x0fb */ + +#define PLUS 63 /* 0x3f Match this (simple) + thing 1 or more times: + /A{1,}B/ where A is width 1 + char */ +#define PLUS_tb 126 /* 0x07e */ +#define PLUS_t8 127 /* 0x07f */ +#define PLUS_tb_pb 252 /* 0x0fc */ +#define PLUS_tb_p8 253 /* 0x0fd */ +#define PLUS_t8_pb 254 /* 0x0fe */ +#define PLUS_t8_p8 255 /* 0x0ff */ + +#define CURLY 64 /* 0x40 Match this (simple) + thing {n,m} times: /A{m,n}B/ + where A is width 1 char */ +#define CURLY_tb 128 /* 0x080 */ +#define CURLY_t8 129 /* 0x081 */ +#define CURLY_tb_pb 256 /* 0x100 */ +#define CURLY_tb_p8 257 /* 0x101 */ +#define CURLY_t8_pb 258 /* 0x102 */ +#define CURLY_t8_p8 259 /* 0x103 */ + +#define CURLYN 65 /* 0x41 Capture next-after-this + simple thing: /(A){m,n}B/ + where A is width 1 char */ +#define CURLYN_tb 130 /* 0x082 */ +#define CURLYN_t8 131 /* 0x083 */ +#define CURLYN_tb_pb 260 /* 0x104 */ +#define CURLYN_tb_p8 261 /* 0x105 */ +#define CURLYN_t8_pb 262 /* 0x106 */ +#define CURLYN_t8_p8 263 /* 0x107 */ -#define CURLYM 65 /* 0x41 Capture this +#define CURLYM 66 /* 0x42 Capture this medium-complex thing {n,m} - times. */ -#define CURLYM_tb 130 /* 0x082 */ -#define CURLYM_t8 131 /* 0x083 */ -#define CURLYM_tb_pb 260 /* 0x104 */ -#define CURLYM_tb_p8 261 /* 0x105 */ -#define CURLYM_t8_pb 262 /* 0x106 */ -#define CURLYM_t8_p8 263 /* 0x107 */ - -#define CURLYX 66 /* 0x42 Match this complex - thing {n,m} times. */ -#define CURLYX_tb 132 /* 0x084 */ -#define CURLYX_t8 133 /* 0x085 */ -#define CURLYX_tb_pb 264 /* 0x108 */ -#define CURLYX_tb_p8 265 /* 0x109 */ -#define CURLYX_t8_pb 266 /* 0x10a */ -#define CURLYX_t8_p8 267 /* 0x10b */ + times: /(A){m,n}B/ where A + is fixed-length */ +#define CURLYM_tb 132 /* 0x084 */ +#define CURLYM_t8 133 /* 0x085 */ +#define CURLYM_tb_pb 264 /* 0x108 */ +#define CURLYM_tb_p8 265 /* 0x109 */ +#define CURLYM_t8_pb 266 /* 0x10a */ +#define CURLYM_t8_p8 267 /* 0x10b */ + +#define CURLYX 67 /* 0x43 Match/Capture this + complex thing {n,m} times. + */ +#define CURLYX_tb 134 /* 0x086 */ +#define CURLYX_t8 135 /* 0x087 */ +#define CURLYX_tb_pb 268 /* 0x10c */ +#define CURLYX_tb_p8 269 /* 0x10d */ +#define CURLYX_t8_pb 270 /* 0x10e */ +#define CURLYX_t8_p8 271 /* 0x10f */ -#define WHILEM 67 /* 0x43 Do curly processing and +#define WHILEM 68 /* 0x44 Do curly processing and see if rest matches. */ -#define WHILEM_tb 134 /* 0x086 */ -#define WHILEM_t8 135 /* 0x087 */ -#define WHILEM_tb_pb 268 /* 0x10c */ -#define WHILEM_tb_p8 269 /* 0x10d */ -#define WHILEM_t8_pb 270 /* 0x10e */ -#define WHILEM_t8_p8 271 /* 0x10f */ +#define WHILEM_tb 136 /* 0x088 */ +#define WHILEM_t8 137 /* 0x089 */ +#define WHILEM_tb_pb 272 /* 0x110 */ +#define WHILEM_tb_p8 273 /* 0x111 */ +#define WHILEM_t8_pb 274 /* 0x112 */ +#define WHILEM_t8_p8 275 /* 0x113 */ -#define OPEN 68 /* 0x44 Mark this point in +#define OPEN 69 /* 0x45 Mark this point in input as start of #n. */ -#define OPEN_tb 136 /* 0x088 */ -#define OPEN_t8 137 /* 0x089 */ -#define OPEN_tb_pb 272 /* 0x110 */ -#define OPEN_tb_p8 273 /* 0x111 */ -#define OPEN_t8_pb 274 /* 0x112 */ -#define OPEN_t8_p8 275 /* 0x113 */ +#define OPEN_tb 138 /* 0x08a */ +#define OPEN_t8 139 /* 0x08b */ +#define OPEN_tb_pb 276 /* 0x114 */ +#define OPEN_tb_p8 277 /* 0x115 */ +#define OPEN_t8_pb 278 /* 0x116 */ +#define OPEN_t8_p8 279 /* 0x117 */ -#define CLOSE 69 /* 0x45 Close corresponding +#define CLOSE 70 /* 0x46 Close corresponding OPEN of #n. */ -#define CLOSE_tb 138 /* 0x08a */ -#define CLOSE_t8 139 /* 0x08b */ -#define CLOSE_tb_pb 276 /* 0x114 */ -#define CLOSE_tb_p8 277 /* 0x115 */ -#define CLOSE_t8_pb 278 /* 0x116 */ -#define CLOSE_t8_p8 279 /* 0x117 */ +#define CLOSE_tb 140 /* 0x08c */ +#define CLOSE_t8 141 /* 0x08d */ +#define CLOSE_tb_pb 280 /* 0x118 */ +#define CLOSE_tb_p8 281 /* 0x119 */ +#define CLOSE_t8_pb 282 /* 0x11a */ +#define CLOSE_t8_p8 283 /* 0x11b */ -#define SROPEN 70 /* 0x46 Same as OPEN, but for +#define SROPEN 71 /* 0x47 Same as OPEN, but for script run */ -#define SROPEN_tb 140 /* 0x08c */ -#define SROPEN_t8 141 /* 0x08d */ -#define SROPEN_tb_pb 280 /* 0x118 */ -#define SROPEN_tb_p8 281 /* 0x119 */ -#define SROPEN_t8_pb 282 /* 0x11a */ -#define SROPEN_t8_p8 283 /* 0x11b */ +#define SROPEN_tb 142 /* 0x08e */ +#define SROPEN_t8 143 /* 0x08f */ +#define SROPEN_tb_pb 284 /* 0x11c */ +#define SROPEN_tb_p8 285 /* 0x11d */ +#define SROPEN_t8_pb 286 /* 0x11e */ +#define SROPEN_t8_p8 287 /* 0x11f */ -#define SRCLOSE 71 /* 0x47 Close preceding SROPEN +#define SRCLOSE 72 /* 0x48 Close preceding SROPEN */ -#define SRCLOSE_tb 142 /* 0x08e */ -#define SRCLOSE_t8 143 /* 0x08f */ -#define SRCLOSE_tb_pb 284 /* 0x11c */ -#define SRCLOSE_tb_p8 285 /* 0x11d */ -#define SRCLOSE_t8_pb 286 /* 0x11e */ -#define SRCLOSE_t8_p8 287 /* 0x11f */ +#define SRCLOSE_tb 144 /* 0x090 */ +#define SRCLOSE_t8 145 /* 0x091 */ +#define SRCLOSE_tb_pb 288 /* 0x120 */ +#define SRCLOSE_tb_p8 289 /* 0x121 */ +#define SRCLOSE_t8_pb 290 /* 0x122 */ +#define SRCLOSE_t8_p8 291 /* 0x123 */ -#define REF 72 /* 0x48 Match some already +#define REF 73 /* 0x49 Match some already matched string */ -#define REF_tb 144 /* 0x090 */ -#define REF_t8 145 /* 0x091 */ -#define REF_tb_pb 288 /* 0x120 */ -#define REF_tb_p8 289 /* 0x121 */ -#define REF_t8_pb 290 /* 0x122 */ -#define REF_t8_p8 291 /* 0x123 */ +#define REF_tb 146 /* 0x092 */ +#define REF_t8 147 /* 0x093 */ +#define REF_tb_pb 292 /* 0x124 */ +#define REF_tb_p8 293 /* 0x125 */ +#define REF_t8_pb 294 /* 0x126 */ +#define REF_t8_p8 295 /* 0x127 */ -#define REFF 73 /* 0x49 Match already matched +#define REFF 74 /* 0x4a Match already matched string, using /di rules. */ -#define REFF_tb 146 /* 0x092 */ -#define REFF_t8 147 /* 0x093 */ -#define REFF_tb_pb 292 /* 0x124 */ -#define REFF_tb_p8 293 /* 0x125 */ -#define REFF_t8_pb 294 /* 0x126 */ -#define REFF_t8_p8 295 /* 0x127 */ +#define REFF_tb 148 /* 0x094 */ +#define REFF_t8 149 /* 0x095 */ +#define REFF_tb_pb 296 /* 0x128 */ +#define REFF_tb_p8 297 /* 0x129 */ +#define REFF_t8_pb 298 /* 0x12a */ +#define REFF_t8_p8 299 /* 0x12b */ -#define REFFL 74 /* 0x4a Match already matched +#define REFFL 75 /* 0x4b Match already matched string, using /li rules. */ -#define REFFL_tb 148 /* 0x094 */ -#define REFFL_t8 149 /* 0x095 */ -#define REFFL_tb_pb 296 /* 0x128 */ -#define REFFL_tb_p8 297 /* 0x129 */ -#define REFFL_t8_pb 298 /* 0x12a */ -#define REFFL_t8_p8 299 /* 0x12b */ +#define REFFL_tb 150 /* 0x096 */ +#define REFFL_t8 151 /* 0x097 */ +#define REFFL_tb_pb 300 /* 0x12c */ +#define REFFL_tb_p8 301 /* 0x12d */ +#define REFFL_t8_pb 302 /* 0x12e */ +#define REFFL_t8_p8 303 /* 0x12f */ -#define REFFU 75 /* 0x4b Match already matched +#define REFFU 76 /* 0x4c Match already matched string, usng /ui. */ -#define REFFU_tb 150 /* 0x096 */ -#define REFFU_t8 151 /* 0x097 */ -#define REFFU_tb_pb 300 /* 0x12c */ -#define REFFU_tb_p8 301 /* 0x12d */ -#define REFFU_t8_pb 302 /* 0x12e */ -#define REFFU_t8_p8 303 /* 0x12f */ +#define REFFU_tb 152 /* 0x098 */ +#define REFFU_t8 153 /* 0x099 */ +#define REFFU_tb_pb 304 /* 0x130 */ +#define REFFU_tb_p8 305 /* 0x131 */ +#define REFFU_t8_pb 306 /* 0x132 */ +#define REFFU_t8_p8 307 /* 0x133 */ -#define REFFA 76 /* 0x4c Match already matched +#define REFFA 77 /* 0x4d Match already matched string, using /aai rules. */ -#define REFFA_tb 152 /* 0x098 */ -#define REFFA_t8 153 /* 0x099 */ -#define REFFA_tb_pb 304 /* 0x130 */ -#define REFFA_tb_p8 305 /* 0x131 */ -#define REFFA_t8_pb 306 /* 0x132 */ -#define REFFA_t8_p8 307 /* 0x133 */ +#define REFFA_tb 154 /* 0x09a */ +#define REFFA_t8 155 /* 0x09b */ +#define REFFA_tb_pb 308 /* 0x134 */ +#define REFFA_tb_p8 309 /* 0x135 */ +#define REFFA_t8_pb 310 /* 0x136 */ +#define REFFA_t8_p8 311 /* 0x137 */ -#define REFN 77 /* 0x4d Match some already +#define REFN 78 /* 0x4e Match some already matched string */ -#define REFN_tb 154 /* 0x09a */ -#define REFN_t8 155 /* 0x09b */ -#define REFN_tb_pb 308 /* 0x134 */ -#define REFN_tb_p8 309 /* 0x135 */ -#define REFN_t8_pb 310 /* 0x136 */ -#define REFN_t8_p8 311 /* 0x137 */ +#define REFN_tb 156 /* 0x09c */ +#define REFN_t8 157 /* 0x09d */ +#define REFN_tb_pb 312 /* 0x138 */ +#define REFN_tb_p8 313 /* 0x139 */ +#define REFN_t8_pb 314 /* 0x13a */ +#define REFN_t8_p8 315 /* 0x13b */ -#define REFFN 78 /* 0x4e Match already matched +#define REFFN 79 /* 0x4f Match already matched string, using /di rules. */ -#define REFFN_tb 156 /* 0x09c */ -#define REFFN_t8 157 /* 0x09d */ -#define REFFN_tb_pb 312 /* 0x138 */ -#define REFFN_tb_p8 313 /* 0x139 */ -#define REFFN_t8_pb 314 /* 0x13a */ -#define REFFN_t8_p8 315 /* 0x13b */ +#define REFFN_tb 158 /* 0x09e */ +#define REFFN_t8 159 /* 0x09f */ +#define REFFN_tb_pb 316 /* 0x13c */ +#define REFFN_tb_p8 317 /* 0x13d */ +#define REFFN_t8_pb 318 /* 0x13e */ +#define REFFN_t8_p8 319 /* 0x13f */ -#define REFFLN 79 /* 0x4f Match already matched +#define REFFLN 80 /* 0x50 Match already matched string, using /li rules. */ -#define REFFLN_tb 158 /* 0x09e */ -#define REFFLN_t8 159 /* 0x09f */ -#define REFFLN_tb_pb 316 /* 0x13c */ -#define REFFLN_tb_p8 317 /* 0x13d */ -#define REFFLN_t8_pb 318 /* 0x13e */ -#define REFFLN_t8_p8 319 /* 0x13f */ +#define REFFLN_tb 160 /* 0x0a0 */ +#define REFFLN_t8 161 /* 0x0a1 */ +#define REFFLN_tb_pb 320 /* 0x140 */ +#define REFFLN_tb_p8 321 /* 0x141 */ +#define REFFLN_t8_pb 322 /* 0x142 */ +#define REFFLN_t8_p8 323 /* 0x143 */ -#define REFFUN 80 /* 0x50 Match already matched +#define REFFUN 81 /* 0x51 Match already matched string, using /ui rules. */ -#define REFFUN_tb 160 /* 0x0a0 */ -#define REFFUN_t8 161 /* 0x0a1 */ -#define REFFUN_tb_pb 320 /* 0x140 */ -#define REFFUN_tb_p8 321 /* 0x141 */ -#define REFFUN_t8_pb 322 /* 0x142 */ -#define REFFUN_t8_p8 323 /* 0x143 */ +#define REFFUN_tb 162 /* 0x0a2 */ +#define REFFUN_t8 163 /* 0x0a3 */ +#define REFFUN_tb_pb 324 /* 0x144 */ +#define REFFUN_tb_p8 325 /* 0x145 */ +#define REFFUN_t8_pb 326 /* 0x146 */ +#define REFFUN_t8_p8 327 /* 0x147 */ -#define REFFAN 81 /* 0x51 Match already matched +#define REFFAN 82 /* 0x52 Match already matched string, using /aai rules. */ -#define REFFAN_tb 162 /* 0x0a2 */ -#define REFFAN_t8 163 /* 0x0a3 */ -#define REFFAN_tb_pb 324 /* 0x144 */ -#define REFFAN_tb_p8 325 /* 0x145 */ -#define REFFAN_t8_pb 326 /* 0x146 */ -#define REFFAN_t8_p8 327 /* 0x147 */ - -#define LONGJMP 82 /* 0x52 Jump far away. */ -#define LONGJMP_tb 164 /* 0x0a4 */ -#define LONGJMP_t8 165 /* 0x0a5 */ -#define LONGJMP_tb_pb 328 /* 0x148 */ -#define LONGJMP_tb_p8 329 /* 0x149 */ -#define LONGJMP_t8_pb 330 /* 0x14a */ -#define LONGJMP_t8_p8 331 /* 0x14b */ +#define REFFAN_tb 164 /* 0x0a4 */ +#define REFFAN_t8 165 /* 0x0a5 */ +#define REFFAN_tb_pb 328 /* 0x148 */ +#define REFFAN_tb_p8 329 /* 0x149 */ +#define REFFAN_t8_pb 330 /* 0x14a */ +#define REFFAN_t8_p8 331 /* 0x14b */ + +#define LONGJMP 83 /* 0x53 Jump far away. */ +#define LONGJMP_tb 166 /* 0x0a6 */ +#define LONGJMP_t8 167 /* 0x0a7 */ +#define LONGJMP_tb_pb 332 /* 0x14c */ +#define LONGJMP_tb_p8 333 /* 0x14d */ +#define LONGJMP_t8_pb 334 /* 0x14e */ +#define LONGJMP_t8_p8 335 /* 0x14f */ -#define BRANCHJ 83 /* 0x53 BRANCH with long +#define BRANCHJ 84 /* 0x54 BRANCH with long offset. */ -#define BRANCHJ_tb 166 /* 0x0a6 */ -#define BRANCHJ_t8 167 /* 0x0a7 */ -#define BRANCHJ_tb_pb 332 /* 0x14c */ -#define BRANCHJ_tb_p8 333 /* 0x14d */ -#define BRANCHJ_t8_pb 334 /* 0x14e */ -#define BRANCHJ_t8_p8 335 /* 0x14f */ +#define BRANCHJ_tb 168 /* 0x0a8 */ +#define BRANCHJ_t8 169 /* 0x0a9 */ +#define BRANCHJ_tb_pb 336 /* 0x150 */ +#define BRANCHJ_tb_p8 337 /* 0x151 */ +#define BRANCHJ_t8_pb 338 /* 0x152 */ +#define BRANCHJ_t8_p8 339 /* 0x153 */ -#define IFMATCH 84 /* 0x54 Succeeds if the +#define IFMATCH 85 /* 0x55 Succeeds if the following matches; non-zero flags "f", next_off "o" means lookbehind assertion starting "f..(f-o)" characters before current */ -#define IFMATCH_tb 168 /* 0x0a8 */ -#define IFMATCH_t8 169 /* 0x0a9 */ -#define IFMATCH_tb_pb 336 /* 0x150 */ -#define IFMATCH_tb_p8 337 /* 0x151 */ -#define IFMATCH_t8_pb 338 /* 0x152 */ -#define IFMATCH_t8_p8 339 /* 0x153 */ +#define IFMATCH_tb 170 /* 0x0aa */ +#define IFMATCH_t8 171 /* 0x0ab */ +#define IFMATCH_tb_pb 340 /* 0x154 */ +#define IFMATCH_tb_p8 341 /* 0x155 */ +#define IFMATCH_t8_pb 342 /* 0x156 */ +#define IFMATCH_t8_p8 343 /* 0x157 */ -#define UNLESSM 85 /* 0x55 Fails if the following +#define UNLESSM 86 /* 0x56 Fails if the following matches; non-zero flags "f", next_off "o" means lookbehind assertion starting "f..(f-o)" characters before current */ -#define UNLESSM_tb 170 /* 0x0aa */ -#define UNLESSM_t8 171 /* 0x0ab */ -#define UNLESSM_tb_pb 340 /* 0x154 */ -#define UNLESSM_tb_p8 341 /* 0x155 */ -#define UNLESSM_t8_pb 342 /* 0x156 */ -#define UNLESSM_t8_p8 343 /* 0x157 */ +#define UNLESSM_tb 172 /* 0x0ac */ +#define UNLESSM_t8 173 /* 0x0ad */ +#define UNLESSM_tb_pb 344 /* 0x158 */ +#define UNLESSM_tb_p8 345 /* 0x159 */ +#define UNLESSM_t8_pb 346 /* 0x15a */ +#define UNLESSM_t8_p8 347 /* 0x15b */ -#define SUSPEND 86 /* 0x56 "Independent" sub-RE. +#define SUSPEND 87 /* 0x57 "Independent" sub-RE. */ -#define SUSPEND_tb 172 /* 0x0ac */ -#define SUSPEND_t8 173 /* 0x0ad */ -#define SUSPEND_tb_pb 344 /* 0x158 */ -#define SUSPEND_tb_p8 345 /* 0x159 */ -#define SUSPEND_t8_pb 346 /* 0x15a */ -#define SUSPEND_t8_p8 347 /* 0x15b */ +#define SUSPEND_tb 174 /* 0x0ae */ +#define SUSPEND_t8 175 /* 0x0af */ +#define SUSPEND_tb_pb 348 /* 0x15c */ +#define SUSPEND_tb_p8 349 /* 0x15d */ +#define SUSPEND_t8_pb 350 /* 0x15e */ +#define SUSPEND_t8_p8 351 /* 0x15f */ -#define IFTHEN 87 /* 0x57 Switch, should be +#define IFTHEN 88 /* 0x58 Switch, should be preceded by switcher. */ -#define IFTHEN_tb 174 /* 0x0ae */ -#define IFTHEN_t8 175 /* 0x0af */ -#define IFTHEN_tb_pb 348 /* 0x15c */ -#define IFTHEN_tb_p8 349 /* 0x15d */ -#define IFTHEN_t8_pb 350 /* 0x15e */ -#define IFTHEN_t8_p8 351 /* 0x15f */ +#define IFTHEN_tb 176 /* 0x0b0 */ +#define IFTHEN_t8 177 /* 0x0b1 */ +#define IFTHEN_tb_pb 352 /* 0x160 */ +#define IFTHEN_tb_p8 353 /* 0x161 */ +#define IFTHEN_t8_pb 354 /* 0x162 */ +#define IFTHEN_t8_p8 355 /* 0x163 */ -#define GROUPP 88 /* 0x58 Whether the group +#define GROUPP 89 /* 0x59 Whether the group matched. */ -#define GROUPP_tb 176 /* 0x0b0 */ -#define GROUPP_t8 177 /* 0x0b1 */ -#define GROUPP_tb_pb 352 /* 0x160 */ -#define GROUPP_tb_p8 353 /* 0x161 */ -#define GROUPP_t8_pb 354 /* 0x162 */ -#define GROUPP_t8_p8 355 /* 0x163 */ +#define GROUPP_tb 178 /* 0x0b2 */ +#define GROUPP_t8 179 /* 0x0b3 */ +#define GROUPP_tb_pb 356 /* 0x164 */ +#define GROUPP_tb_p8 357 /* 0x165 */ +#define GROUPP_t8_pb 358 /* 0x166 */ +#define GROUPP_t8_p8 359 /* 0x167 */ -#define EVAL 89 /* 0x59 Execute some Perl code. +#define EVAL 90 /* 0x5a Execute some Perl code. */ -#define EVAL_tb 178 /* 0x0b2 */ -#define EVAL_t8 179 /* 0x0b3 */ -#define EVAL_tb_pb 356 /* 0x164 */ -#define EVAL_tb_p8 357 /* 0x165 */ -#define EVAL_t8_pb 358 /* 0x166 */ -#define EVAL_t8_p8 359 /* 0x167 */ +#define EVAL_tb 180 /* 0x0b4 */ +#define EVAL_t8 181 /* 0x0b5 */ +#define EVAL_tb_pb 360 /* 0x168 */ +#define EVAL_tb_p8 361 /* 0x169 */ +#define EVAL_t8_pb 362 /* 0x16a */ +#define EVAL_t8_p8 363 /* 0x16b */ -#define MINMOD 90 /* 0x5a Next operator is not +#define MINMOD 91 /* 0x5b Next operator is not greedy. */ -#define MINMOD_tb 180 /* 0x0b4 */ -#define MINMOD_t8 181 /* 0x0b5 */ -#define MINMOD_tb_pb 360 /* 0x168 */ -#define MINMOD_tb_p8 361 /* 0x169 */ -#define MINMOD_t8_pb 362 /* 0x16a */ -#define MINMOD_t8_p8 363 /* 0x16b */ +#define MINMOD_tb 182 /* 0x0b6 */ +#define MINMOD_t8 183 /* 0x0b7 */ +#define MINMOD_tb_pb 364 /* 0x16c */ +#define MINMOD_tb_p8 365 /* 0x16d */ +#define MINMOD_t8_pb 366 /* 0x16e */ +#define MINMOD_t8_p8 367 /* 0x16f */ -#define LOGICAL 91 /* 0x5b Next opcode should set +#define LOGICAL 92 /* 0x5c Next opcode should set the flag only. */ -#define LOGICAL_tb 182 /* 0x0b6 */ -#define LOGICAL_t8 183 /* 0x0b7 */ -#define LOGICAL_tb_pb 364 /* 0x16c */ -#define LOGICAL_tb_p8 365 /* 0x16d */ -#define LOGICAL_t8_pb 366 /* 0x16e */ -#define LOGICAL_t8_p8 367 /* 0x16f */ +#define LOGICAL_tb 184 /* 0x0b8 */ +#define LOGICAL_t8 185 /* 0x0b9 */ +#define LOGICAL_tb_pb 368 /* 0x170 */ +#define LOGICAL_tb_p8 369 /* 0x171 */ +#define LOGICAL_t8_pb 370 /* 0x172 */ +#define LOGICAL_t8_p8 371 /* 0x173 */ -#define RENUM 92 /* 0x5c Group with +#define RENUM 93 /* 0x5d Group with independently numbered parens. */ -#define RENUM_tb 184 /* 0x0b8 */ -#define RENUM_t8 185 /* 0x0b9 */ -#define RENUM_tb_pb 368 /* 0x170 */ -#define RENUM_tb_p8 369 /* 0x171 */ -#define RENUM_t8_pb 370 /* 0x172 */ -#define RENUM_t8_p8 371 /* 0x173 */ +#define RENUM_tb 186 /* 0x0ba */ +#define RENUM_t8 187 /* 0x0bb */ +#define RENUM_tb_pb 372 /* 0x174 */ +#define RENUM_tb_p8 373 /* 0x175 */ +#define RENUM_t8_pb 374 /* 0x176 */ +#define RENUM_t8_p8 375 /* 0x177 */ -#define GOSUB 93 /* 0x5d recurse to paren arg1 +#define GOSUB 94 /* 0x5e recurse to paren arg1 at (signed) ofs arg2 */ -#define GOSUB_tb 186 /* 0x0ba */ -#define GOSUB_t8 187 /* 0x0bb */ -#define GOSUB_tb_pb 372 /* 0x174 */ -#define GOSUB_tb_p8 373 /* 0x175 */ -#define GOSUB_t8_pb 374 /* 0x176 */ -#define GOSUB_t8_p8 375 /* 0x177 */ +#define GOSUB_tb 188 /* 0x0bc */ +#define GOSUB_t8 189 /* 0x0bd */ +#define GOSUB_tb_pb 376 /* 0x178 */ +#define GOSUB_tb_p8 377 /* 0x179 */ +#define GOSUB_t8_pb 378 /* 0x17a */ +#define GOSUB_t8_p8 379 /* 0x17b */ -#define GROUPPN 94 /* 0x5e Whether the group +#define GROUPPN 95 /* 0x5f Whether the group matched. */ -#define GROUPPN_tb 188 /* 0x0bc */ -#define GROUPPN_t8 189 /* 0x0bd */ -#define GROUPPN_tb_pb 376 /* 0x178 */ -#define GROUPPN_tb_p8 377 /* 0x179 */ -#define GROUPPN_t8_pb 378 /* 0x17a */ -#define GROUPPN_t8_p8 379 /* 0x17b */ +#define GROUPPN_tb 190 /* 0x0be */ +#define GROUPPN_t8 191 /* 0x0bf */ +#define GROUPPN_tb_pb 380 /* 0x17c */ +#define GROUPPN_tb_p8 381 /* 0x17d */ +#define GROUPPN_t8_pb 382 /* 0x17e */ +#define GROUPPN_t8_p8 383 /* 0x17f */ -#define INSUBP 95 /* 0x5f Whether we are in a +#define INSUBP 96 /* 0x60 Whether we are in a specific recurse. */ -#define INSUBP_tb 190 /* 0x0be */ -#define INSUBP_t8 191 /* 0x0bf */ -#define INSUBP_tb_pb 380 /* 0x17c */ -#define INSUBP_tb_p8 381 /* 0x17d */ -#define INSUBP_t8_pb 382 /* 0x17e */ -#define INSUBP_t8_p8 383 /* 0x17f */ +#define INSUBP_tb 192 /* 0x0c0 */ +#define INSUBP_t8 193 /* 0x0c1 */ +#define INSUBP_tb_pb 384 /* 0x180 */ +#define INSUBP_tb_p8 385 /* 0x181 */ +#define INSUBP_t8_pb 386 /* 0x182 */ +#define INSUBP_t8_p8 387 /* 0x183 */ -#define DEFINEP 96 /* 0x60 Never execute directly. +#define DEFINEP 97 /* 0x61 Never execute directly. */ -#define DEFINEP_tb 192 /* 0x0c0 */ -#define DEFINEP_t8 193 /* 0x0c1 */ -#define DEFINEP_tb_pb 384 /* 0x180 */ -#define DEFINEP_tb_p8 385 /* 0x181 */ -#define DEFINEP_t8_pb 386 /* 0x182 */ -#define DEFINEP_t8_p8 387 /* 0x183 */ +#define DEFINEP_tb 194 /* 0x0c2 */ +#define DEFINEP_t8 195 /* 0x0c3 */ +#define DEFINEP_tb_pb 388 /* 0x184 */ +#define DEFINEP_tb_p8 389 /* 0x185 */ +#define DEFINEP_t8_pb 390 /* 0x186 */ +#define DEFINEP_t8_p8 391 /* 0x187 */ -#define ENDLIKE 97 /* 0x61 Used only for the type +#define ENDLIKE 98 /* 0x62 Used only for the type field of verbs */ -#define ENDLIKE_tb 194 /* 0x0c2 */ -#define ENDLIKE_t8 195 /* 0x0c3 */ -#define ENDLIKE_tb_pb 388 /* 0x184 */ -#define ENDLIKE_tb_p8 389 /* 0x185 */ -#define ENDLIKE_t8_pb 390 /* 0x186 */ -#define ENDLIKE_t8_p8 391 /* 0x187 */ +#define ENDLIKE_tb 196 /* 0x0c4 */ +#define ENDLIKE_t8 197 /* 0x0c5 */ +#define ENDLIKE_tb_pb 392 /* 0x188 */ +#define ENDLIKE_tb_p8 393 /* 0x189 */ +#define ENDLIKE_t8_pb 394 /* 0x18a */ +#define ENDLIKE_t8_p8 395 /* 0x18b */ -#define OPFAIL 98 /* 0x62 Same as (?!), but with +#define OPFAIL 99 /* 0x63 Same as (?!), but with verb arg */ -#define OPFAIL_tb 196 /* 0x0c4 */ -#define OPFAIL_t8 197 /* 0x0c5 */ -#define OPFAIL_tb_pb 392 /* 0x188 */ -#define OPFAIL_tb_p8 393 /* 0x189 */ -#define OPFAIL_t8_pb 394 /* 0x18a */ -#define OPFAIL_t8_p8 395 /* 0x18b */ +#define OPFAIL_tb 198 /* 0x0c6 */ +#define OPFAIL_t8 199 /* 0x0c7 */ +#define OPFAIL_tb_pb 396 /* 0x18c */ +#define OPFAIL_tb_p8 397 /* 0x18d */ +#define OPFAIL_t8_pb 398 /* 0x18e */ +#define OPFAIL_t8_p8 399 /* 0x18f */ -#define ACCEPT 99 /* 0x63 Accepts the current +#define ACCEPT 100 /* 0x64 Accepts the current matched string, with verbar */ -#define ACCEPT_tb 198 /* 0x0c6 */ -#define ACCEPT_t8 199 /* 0x0c7 */ -#define ACCEPT_tb_pb 396 /* 0x18c */ -#define ACCEPT_tb_p8 397 /* 0x18d */ -#define ACCEPT_t8_pb 398 /* 0x18e */ -#define ACCEPT_t8_p8 399 /* 0x18f */ +#define ACCEPT_tb 200 /* 0x0c8 */ +#define ACCEPT_t8 201 /* 0x0c9 */ +#define ACCEPT_tb_pb 400 /* 0x190 */ +#define ACCEPT_tb_p8 401 /* 0x191 */ +#define ACCEPT_t8_pb 402 /* 0x192 */ +#define ACCEPT_t8_p8 403 /* 0x193 */ -#define VERB 100 /* 0x64 Used only for the type +#define VERB 101 /* 0x65 Used only for the type field of verbs */ -#define VERB_tb 200 /* 0x0c8 */ -#define VERB_t8 201 /* 0x0c9 */ -#define VERB_tb_pb 400 /* 0x190 */ -#define VERB_tb_p8 401 /* 0x191 */ -#define VERB_t8_pb 402 /* 0x192 */ -#define VERB_t8_p8 403 /* 0x193 */ +#define VERB_tb 202 /* 0x0ca */ +#define VERB_t8 203 /* 0x0cb */ +#define VERB_tb_pb 404 /* 0x194 */ +#define VERB_tb_p8 405 /* 0x195 */ +#define VERB_t8_pb 406 /* 0x196 */ +#define VERB_t8_p8 407 /* 0x197 */ -#define PRUNE 101 /* 0x65 Pattern fails at this +#define PRUNE 102 /* 0x66 Pattern fails at this startpoint if no-backtracking through this */ -#define PRUNE_tb 202 /* 0x0ca */ -#define PRUNE_t8 203 /* 0x0cb */ -#define PRUNE_tb_pb 404 /* 0x194 */ -#define PRUNE_tb_p8 405 /* 0x195 */ -#define PRUNE_t8_pb 406 /* 0x196 */ -#define PRUNE_t8_p8 407 /* 0x197 */ +#define PRUNE_tb 204 /* 0x0cc */ +#define PRUNE_t8 205 /* 0x0cd */ +#define PRUNE_tb_pb 408 /* 0x198 */ +#define PRUNE_tb_p8 409 /* 0x199 */ +#define PRUNE_t8_pb 410 /* 0x19a */ +#define PRUNE_t8_p8 411 /* 0x19b */ -#define MARKPOINT 102 /* 0x66 Push the current +#define MARKPOINT 103 /* 0x67 Push the current location for rollback by cut. */ -#define MARKPOINT_tb 204 /* 0x0cc */ -#define MARKPOINT_t8 205 /* 0x0cd */ -#define MARKPOINT_tb_pb 408 /* 0x198 */ -#define MARKPOINT_tb_p8 409 /* 0x199 */ -#define MARKPOINT_t8_pb 410 /* 0x19a */ -#define MARKPOINT_t8_p8 411 /* 0x19b */ +#define MARKPOINT_tb 206 /* 0x0ce */ +#define MARKPOINT_t8 207 /* 0x0cf */ +#define MARKPOINT_tb_pb 412 /* 0x19c */ +#define MARKPOINT_tb_p8 413 /* 0x19d */ +#define MARKPOINT_t8_pb 414 /* 0x19e */ +#define MARKPOINT_t8_p8 415 /* 0x19f */ -#define SKIP 103 /* 0x67 On failure skip forward +#define SKIP 104 /* 0x68 On failure skip forward (to the mark) before retrying */ -#define SKIP_tb 206 /* 0x0ce */ -#define SKIP_t8 207 /* 0x0cf */ -#define SKIP_tb_pb 412 /* 0x19c */ -#define SKIP_tb_p8 413 /* 0x19d */ -#define SKIP_t8_pb 414 /* 0x19e */ -#define SKIP_t8_p8 415 /* 0x19f */ +#define SKIP_tb 208 /* 0x0d0 */ +#define SKIP_t8 209 /* 0x0d1 */ +#define SKIP_tb_pb 416 /* 0x1a0 */ +#define SKIP_tb_p8 417 /* 0x1a1 */ +#define SKIP_t8_pb 418 /* 0x1a2 */ +#define SKIP_t8_p8 419 /* 0x1a3 */ -#define COMMIT 104 /* 0x68 Pattern fails outright +#define COMMIT 105 /* 0x69 Pattern fails outright if backtracking through this */ -#define COMMIT_tb 208 /* 0x0d0 */ -#define COMMIT_t8 209 /* 0x0d1 */ -#define COMMIT_tb_pb 416 /* 0x1a0 */ -#define COMMIT_tb_p8 417 /* 0x1a1 */ -#define COMMIT_t8_pb 418 /* 0x1a2 */ -#define COMMIT_t8_p8 419 /* 0x1a3 */ +#define COMMIT_tb 210 /* 0x0d2 */ +#define COMMIT_t8 211 /* 0x0d3 */ +#define COMMIT_tb_pb 420 /* 0x1a4 */ +#define COMMIT_tb_p8 421 /* 0x1a5 */ +#define COMMIT_t8_pb 422 /* 0x1a6 */ +#define COMMIT_t8_p8 423 /* 0x1a7 */ -#define CUTGROUP 105 /* 0x69 On failure go to the +#define CUTGROUP 106 /* 0x6a On failure go to the next alternation in the group */ -#define CUTGROUP_tb 210 /* 0x0d2 */ -#define CUTGROUP_t8 211 /* 0x0d3 */ -#define CUTGROUP_tb_pb 420 /* 0x1a4 */ -#define CUTGROUP_tb_p8 421 /* 0x1a5 */ -#define CUTGROUP_t8_pb 422 /* 0x1a6 */ -#define CUTGROUP_t8_p8 423 /* 0x1a7 */ - -#define KEEPS 106 /* 0x6a $& begins here. */ -#define KEEPS_tb 212 /* 0x0d4 */ -#define KEEPS_t8 213 /* 0x0d5 */ -#define KEEPS_tb_pb 424 /* 0x1a8 */ -#define KEEPS_tb_p8 425 /* 0x1a9 */ -#define KEEPS_t8_pb 426 /* 0x1aa */ -#define KEEPS_t8_p8 427 /* 0x1ab */ +#define CUTGROUP_tb 212 /* 0x0d4 */ +#define CUTGROUP_t8 213 /* 0x0d5 */ +#define CUTGROUP_tb_pb 424 /* 0x1a8 */ +#define CUTGROUP_tb_p8 425 /* 0x1a9 */ +#define CUTGROUP_t8_pb 426 /* 0x1aa */ +#define CUTGROUP_t8_p8 427 /* 0x1ab */ + +#define KEEPS 107 /* 0x6b $& begins here. */ +#define KEEPS_tb 214 /* 0x0d6 */ +#define KEEPS_t8 215 /* 0x0d7 */ +#define KEEPS_tb_pb 428 /* 0x1ac */ +#define KEEPS_tb_p8 429 /* 0x1ad */ +#define KEEPS_t8_pb 430 /* 0x1ae */ +#define KEEPS_t8_p8 431 /* 0x1af */ -#define LOOKBEHIND_END 107 /* 0x6b Return from lookbehind +#define LOOKBEHIND_END 108 /* 0x6c Return from lookbehind (IFMATCH/UNLESSM) and validate position */ -#define LOOKBEHIND_END_tb 214 /* 0x0d6 */ -#define LOOKBEHIND_END_t8 215 /* 0x0d7 */ -#define LOOKBEHIND_END_tb_pb 428 /* 0x1ac */ -#define LOOKBEHIND_END_tb_p8 429 /* 0x1ad */ -#define LOOKBEHIND_END_t8_pb 430 /* 0x1ae */ -#define LOOKBEHIND_END_t8_p8 431 /* 0x1af */ +#define LOOKBEHIND_END_tb 216 /* 0x0d8 */ +#define LOOKBEHIND_END_t8 217 /* 0x0d9 */ +#define LOOKBEHIND_END_tb_pb 432 /* 0x1b0 */ +#define LOOKBEHIND_END_tb_p8 433 /* 0x1b1 */ +#define LOOKBEHIND_END_t8_pb 434 /* 0x1b2 */ +#define LOOKBEHIND_END_t8_p8 435 /* 0x1b3 */ -#define OPTIMIZED 108 /* 0x6c Placeholder for dump. +#define OPTIMIZED 109 /* 0x6d Placeholder for dump. */ -#define OPTIMIZED_tb 216 /* 0x0d8 */ -#define OPTIMIZED_t8 217 /* 0x0d9 */ -#define OPTIMIZED_tb_pb 432 /* 0x1b0 */ -#define OPTIMIZED_tb_p8 433 /* 0x1b1 */ -#define OPTIMIZED_t8_pb 434 /* 0x1b2 */ -#define OPTIMIZED_t8_p8 435 /* 0x1b3 */ +#define OPTIMIZED_tb 218 /* 0x0da */ +#define OPTIMIZED_t8 219 /* 0x0db */ +#define OPTIMIZED_tb_pb 436 /* 0x1b4 */ +#define OPTIMIZED_tb_p8 437 /* 0x1b5 */ +#define OPTIMIZED_t8_pb 438 /* 0x1b6 */ +#define OPTIMIZED_t8_p8 439 /* 0x1b7 */ -#define PSEUDO 109 /* 0x6d Pseudo opcode for +#define PSEUDO 110 /* 0x6e Pseudo opcode for internal use. */ -#define PSEUDO_tb 218 /* 0x0da */ -#define PSEUDO_t8 219 /* 0x0db */ -#define PSEUDO_tb_pb 436 /* 0x1b4 */ -#define PSEUDO_tb_p8 437 /* 0x1b5 */ -#define PSEUDO_t8_pb 438 /* 0x1b6 */ -#define PSEUDO_t8_p8 439 /* 0x1b7 */ +#define PSEUDO_tb 220 /* 0x0dc */ +#define PSEUDO_t8 221 /* 0x0dd */ +#define PSEUDO_tb_pb 440 /* 0x1b8 */ +#define PSEUDO_tb_p8 441 /* 0x1b9 */ +#define PSEUDO_t8_pb 442 /* 0x1ba */ +#define PSEUDO_t8_p8 443 /* 0x1bb */ -#define REGEX_SET 110 /* 0x6e Regex set, temporary +#define REGEX_SET 111 /* 0x6f Regex set, temporary node used in pre-optimization compilation */ -#define REGEX_SET_tb 220 /* 0x0dc */ -#define REGEX_SET_t8 221 /* 0x0dd */ -#define REGEX_SET_tb_pb 440 /* 0x1b8 */ -#define REGEX_SET_tb_p8 441 /* 0x1b9 */ -#define REGEX_SET_t8_pb 442 /* 0x1ba */ -#define REGEX_SET_t8_p8 443 /* 0x1bb */ +#define REGEX_SET_tb 222 /* 0x0de */ +#define REGEX_SET_t8 223 /* 0x0df */ +#define REGEX_SET_tb_pb 444 /* 0x1bc */ +#define REGEX_SET_tb_p8 445 /* 0x1bd */ +#define REGEX_SET_t8_pb 446 /* 0x1be */ +#define REGEX_SET_t8_p8 447 /* 0x1bf */ /* ------------ States ------------- */ -#define TRIE_next 111 /* 0x6f state for TRIE */ -#define TRIE_next_tb 222 /* 0x0de */ -#define TRIE_next_t8 223 /* 0x0df */ -#define TRIE_next_tb_pb 444 /* 0x1bc */ -#define TRIE_next_tb_p8 445 /* 0x1bd */ -#define TRIE_next_t8_pb 446 /* 0x1be */ -#define TRIE_next_t8_p8 447 /* 0x1bf */ - -#define TRIE_next_fail 112 /* 0x70 state for TRIE */ -#define TRIE_next_fail_tb 224 /* 0x0e0 */ -#define TRIE_next_fail_t8 225 /* 0x0e1 */ -#define TRIE_next_fail_tb_pb 448 /* 0x1c0 */ -#define TRIE_next_fail_tb_p8 449 /* 0x1c1 */ -#define TRIE_next_fail_t8_pb 450 /* 0x1c2 */ -#define TRIE_next_fail_t8_p8 451 /* 0x1c3 */ - -#define EVAL_B 113 /* 0x71 state for EVAL */ -#define EVAL_B_tb 226 /* 0x0e2 */ -#define EVAL_B_t8 227 /* 0x0e3 */ -#define EVAL_B_tb_pb 452 /* 0x1c4 */ -#define EVAL_B_tb_p8 453 /* 0x1c5 */ -#define EVAL_B_t8_pb 454 /* 0x1c6 */ -#define EVAL_B_t8_p8 455 /* 0x1c7 */ - -#define EVAL_B_fail 114 /* 0x72 state for EVAL */ -#define EVAL_B_fail_tb 228 /* 0x0e4 */ -#define EVAL_B_fail_t8 229 /* 0x0e5 */ -#define EVAL_B_fail_tb_pb 456 /* 0x1c8 */ -#define EVAL_B_fail_tb_p8 457 /* 0x1c9 */ -#define EVAL_B_fail_t8_pb 458 /* 0x1ca */ -#define EVAL_B_fail_t8_p8 459 /* 0x1cb */ - -#define EVAL_postponed_AB 115 /* 0x73 state for EVAL */ -#define EVAL_postponed_AB_tb 230 /* 0x0e6 */ -#define EVAL_postponed_AB_t8 231 /* 0x0e7 */ -#define EVAL_postponed_AB_tb_pb 460 /* 0x1cc */ -#define EVAL_postponed_AB_tb_p8 461 /* 0x1cd */ -#define EVAL_postponed_AB_t8_pb 462 /* 0x1ce */ -#define EVAL_postponed_AB_t8_p8 463 /* 0x1cf */ - -#define EVAL_postponed_AB_fail 116 /* 0x74 state for EVAL */ -#define EVAL_postponed_AB_fail_tb 232 /* 0x0e8 */ -#define EVAL_postponed_AB_fail_t8 233 /* 0x0e9 */ -#define EVAL_postponed_AB_fail_tb_pb 464 /* 0x1d0 */ -#define EVAL_postponed_AB_fail_tb_p8 465 /* 0x1d1 */ -#define EVAL_postponed_AB_fail_t8_pb 466 /* 0x1d2 */ -#define EVAL_postponed_AB_fail_t8_p8 467 /* 0x1d3 */ - -#define CURLYX_end 117 /* 0x75 state for CURLYX */ -#define CURLYX_end_tb 234 /* 0x0ea */ -#define CURLYX_end_t8 235 /* 0x0eb */ -#define CURLYX_end_tb_pb 468 /* 0x1d4 */ -#define CURLYX_end_tb_p8 469 /* 0x1d5 */ -#define CURLYX_end_t8_pb 470 /* 0x1d6 */ -#define CURLYX_end_t8_p8 471 /* 0x1d7 */ - -#define CURLYX_end_fail 118 /* 0x76 state for CURLYX */ -#define CURLYX_end_fail_tb 236 /* 0x0ec */ -#define CURLYX_end_fail_t8 237 /* 0x0ed */ -#define CURLYX_end_fail_tb_pb 472 /* 0x1d8 */ -#define CURLYX_end_fail_tb_p8 473 /* 0x1d9 */ -#define CURLYX_end_fail_t8_pb 474 /* 0x1da */ -#define CURLYX_end_fail_t8_p8 475 /* 0x1db */ - -#define WHILEM_A_pre 119 /* 0x77 state for WHILEM */ -#define WHILEM_A_pre_tb 238 /* 0x0ee */ -#define WHILEM_A_pre_t8 239 /* 0x0ef */ -#define WHILEM_A_pre_tb_pb 476 /* 0x1dc */ -#define WHILEM_A_pre_tb_p8 477 /* 0x1dd */ -#define WHILEM_A_pre_t8_pb 478 /* 0x1de */ -#define WHILEM_A_pre_t8_p8 479 /* 0x1df */ - -#define WHILEM_A_pre_fail 120 /* 0x78 state for WHILEM */ -#define WHILEM_A_pre_fail_tb 240 /* 0x0f0 */ -#define WHILEM_A_pre_fail_t8 241 /* 0x0f1 */ -#define WHILEM_A_pre_fail_tb_pb 480 /* 0x1e0 */ -#define WHILEM_A_pre_fail_tb_p8 481 /* 0x1e1 */ -#define WHILEM_A_pre_fail_t8_pb 482 /* 0x1e2 */ -#define WHILEM_A_pre_fail_t8_p8 483 /* 0x1e3 */ - -#define WHILEM_A_min 121 /* 0x79 state for WHILEM */ -#define WHILEM_A_min_tb 242 /* 0x0f2 */ -#define WHILEM_A_min_t8 243 /* 0x0f3 */ -#define WHILEM_A_min_tb_pb 484 /* 0x1e4 */ -#define WHILEM_A_min_tb_p8 485 /* 0x1e5 */ -#define WHILEM_A_min_t8_pb 486 /* 0x1e6 */ -#define WHILEM_A_min_t8_p8 487 /* 0x1e7 */ - -#define WHILEM_A_min_fail 122 /* 0x7a state for WHILEM */ -#define WHILEM_A_min_fail_tb 244 /* 0x0f4 */ -#define WHILEM_A_min_fail_t8 245 /* 0x0f5 */ -#define WHILEM_A_min_fail_tb_pb 488 /* 0x1e8 */ -#define WHILEM_A_min_fail_tb_p8 489 /* 0x1e9 */ -#define WHILEM_A_min_fail_t8_pb 490 /* 0x1ea */ -#define WHILEM_A_min_fail_t8_p8 491 /* 0x1eb */ - -#define WHILEM_A_max 123 /* 0x7b state for WHILEM */ -#define WHILEM_A_max_tb 246 /* 0x0f6 */ -#define WHILEM_A_max_t8 247 /* 0x0f7 */ -#define WHILEM_A_max_tb_pb 492 /* 0x1ec */ -#define WHILEM_A_max_tb_p8 493 /* 0x1ed */ -#define WHILEM_A_max_t8_pb 494 /* 0x1ee */ -#define WHILEM_A_max_t8_p8 495 /* 0x1ef */ - -#define WHILEM_A_max_fail 124 /* 0x7c state for WHILEM */ -#define WHILEM_A_max_fail_tb 248 /* 0x0f8 */ -#define WHILEM_A_max_fail_t8 249 /* 0x0f9 */ -#define WHILEM_A_max_fail_tb_pb 496 /* 0x1f0 */ -#define WHILEM_A_max_fail_tb_p8 497 /* 0x1f1 */ -#define WHILEM_A_max_fail_t8_pb 498 /* 0x1f2 */ -#define WHILEM_A_max_fail_t8_p8 499 /* 0x1f3 */ - -#define WHILEM_B_min 125 /* 0x7d state for WHILEM */ -#define WHILEM_B_min_tb 250 /* 0x0fa */ -#define WHILEM_B_min_t8 251 /* 0x0fb */ -#define WHILEM_B_min_tb_pb 500 /* 0x1f4 */ -#define WHILEM_B_min_tb_p8 501 /* 0x1f5 */ -#define WHILEM_B_min_t8_pb 502 /* 0x1f6 */ -#define WHILEM_B_min_t8_p8 503 /* 0x1f7 */ - -#define WHILEM_B_min_fail 126 /* 0x7e state for WHILEM */ -#define WHILEM_B_min_fail_tb 252 /* 0x0fc */ -#define WHILEM_B_min_fail_t8 253 /* 0x0fd */ -#define WHILEM_B_min_fail_tb_pb 504 /* 0x1f8 */ -#define WHILEM_B_min_fail_tb_p8 505 /* 0x1f9 */ -#define WHILEM_B_min_fail_t8_pb 506 /* 0x1fa */ -#define WHILEM_B_min_fail_t8_p8 507 /* 0x1fb */ - -#define WHILEM_B_max 127 /* 0x7f state for WHILEM */ -#define WHILEM_B_max_tb 254 /* 0x0fe */ -#define WHILEM_B_max_t8 255 /* 0x0ff */ -#define WHILEM_B_max_tb_pb 508 /* 0x1fc */ -#define WHILEM_B_max_tb_p8 509 /* 0x1fd */ -#define WHILEM_B_max_t8_pb 510 /* 0x1fe */ -#define WHILEM_B_max_t8_p8 511 /* 0x1ff */ - -#define WHILEM_B_max_fail 128 /* 0x80 state for WHILEM */ -#define WHILEM_B_max_fail_tb 256 /* 0x100 */ -#define WHILEM_B_max_fail_t8 257 /* 0x101 */ -#define WHILEM_B_max_fail_tb_pb 512 /* 0x200 */ -#define WHILEM_B_max_fail_tb_p8 513 /* 0x201 */ -#define WHILEM_B_max_fail_t8_pb 514 /* 0x202 */ -#define WHILEM_B_max_fail_t8_p8 515 /* 0x203 */ - -#define BRANCH_next 129 /* 0x81 state for BRANCH */ -#define BRANCH_next_tb 258 /* 0x102 */ -#define BRANCH_next_t8 259 /* 0x103 */ -#define BRANCH_next_tb_pb 516 /* 0x204 */ -#define BRANCH_next_tb_p8 517 /* 0x205 */ -#define BRANCH_next_t8_pb 518 /* 0x206 */ -#define BRANCH_next_t8_p8 519 /* 0x207 */ - -#define BRANCH_next_fail 130 /* 0x82 state for BRANCH */ -#define BRANCH_next_fail_tb 260 /* 0x104 */ -#define BRANCH_next_fail_t8 261 /* 0x105 */ -#define BRANCH_next_fail_tb_pb 520 /* 0x208 */ -#define BRANCH_next_fail_tb_p8 521 /* 0x209 */ -#define BRANCH_next_fail_t8_pb 522 /* 0x20a */ -#define BRANCH_next_fail_t8_p8 523 /* 0x20b */ - -#define CURLYM_A 131 /* 0x83 state for CURLYM */ -#define CURLYM_A_tb 262 /* 0x106 */ -#define CURLYM_A_t8 263 /* 0x107 */ -#define CURLYM_A_tb_pb 524 /* 0x20c */ -#define CURLYM_A_tb_p8 525 /* 0x20d */ -#define CURLYM_A_t8_pb 526 /* 0x20e */ -#define CURLYM_A_t8_p8 527 /* 0x20f */ - -#define CURLYM_A_fail 132 /* 0x84 state for CURLYM */ -#define CURLYM_A_fail_tb 264 /* 0x108 */ -#define CURLYM_A_fail_t8 265 /* 0x109 */ -#define CURLYM_A_fail_tb_pb 528 /* 0x210 */ -#define CURLYM_A_fail_tb_p8 529 /* 0x211 */ -#define CURLYM_A_fail_t8_pb 530 /* 0x212 */ -#define CURLYM_A_fail_t8_p8 531 /* 0x213 */ - -#define CURLYM_B 133 /* 0x85 state for CURLYM */ -#define CURLYM_B_tb 266 /* 0x10a */ -#define CURLYM_B_t8 267 /* 0x10b */ -#define CURLYM_B_tb_pb 532 /* 0x214 */ -#define CURLYM_B_tb_p8 533 /* 0x215 */ -#define CURLYM_B_t8_pb 534 /* 0x216 */ -#define CURLYM_B_t8_p8 535 /* 0x217 */ - -#define CURLYM_B_fail 134 /* 0x86 state for CURLYM */ -#define CURLYM_B_fail_tb 268 /* 0x10c */ -#define CURLYM_B_fail_t8 269 /* 0x10d */ -#define CURLYM_B_fail_tb_pb 536 /* 0x218 */ -#define CURLYM_B_fail_tb_p8 537 /* 0x219 */ -#define CURLYM_B_fail_t8_pb 538 /* 0x21a */ -#define CURLYM_B_fail_t8_p8 539 /* 0x21b */ - -#define IFMATCH_A 135 /* 0x87 state for IFMATCH */ -#define IFMATCH_A_tb 270 /* 0x10e */ -#define IFMATCH_A_t8 271 /* 0x10f */ -#define IFMATCH_A_tb_pb 540 /* 0x21c */ -#define IFMATCH_A_tb_p8 541 /* 0x21d */ -#define IFMATCH_A_t8_pb 542 /* 0x21e */ -#define IFMATCH_A_t8_p8 543 /* 0x21f */ - -#define IFMATCH_A_fail 136 /* 0x88 state for IFMATCH */ -#define IFMATCH_A_fail_tb 272 /* 0x110 */ -#define IFMATCH_A_fail_t8 273 /* 0x111 */ -#define IFMATCH_A_fail_tb_pb 544 /* 0x220 */ -#define IFMATCH_A_fail_tb_p8 545 /* 0x221 */ -#define IFMATCH_A_fail_t8_pb 546 /* 0x222 */ -#define IFMATCH_A_fail_t8_p8 547 /* 0x223 */ - -#define CURLY_B_min 137 /* 0x89 state for CURLY */ -#define CURLY_B_min_tb 274 /* 0x112 */ -#define CURLY_B_min_t8 275 /* 0x113 */ -#define CURLY_B_min_tb_pb 548 /* 0x224 */ -#define CURLY_B_min_tb_p8 549 /* 0x225 */ -#define CURLY_B_min_t8_pb 550 /* 0x226 */ -#define CURLY_B_min_t8_p8 551 /* 0x227 */ - -#define CURLY_B_min_fail 138 /* 0x8a state for CURLY */ -#define CURLY_B_min_fail_tb 276 /* 0x114 */ -#define CURLY_B_min_fail_t8 277 /* 0x115 */ -#define CURLY_B_min_fail_tb_pb 552 /* 0x228 */ -#define CURLY_B_min_fail_tb_p8 553 /* 0x229 */ -#define CURLY_B_min_fail_t8_pb 554 /* 0x22a */ -#define CURLY_B_min_fail_t8_p8 555 /* 0x22b */ - -#define CURLY_B_max 139 /* 0x8b state for CURLY */ -#define CURLY_B_max_tb 278 /* 0x116 */ -#define CURLY_B_max_t8 279 /* 0x117 */ -#define CURLY_B_max_tb_pb 556 /* 0x22c */ -#define CURLY_B_max_tb_p8 557 /* 0x22d */ -#define CURLY_B_max_t8_pb 558 /* 0x22e */ -#define CURLY_B_max_t8_p8 559 /* 0x22f */ - -#define CURLY_B_max_fail 140 /* 0x8c state for CURLY */ -#define CURLY_B_max_fail_tb 280 /* 0x118 */ -#define CURLY_B_max_fail_t8 281 /* 0x119 */ -#define CURLY_B_max_fail_tb_pb 560 /* 0x230 */ -#define CURLY_B_max_fail_tb_p8 561 /* 0x231 */ -#define CURLY_B_max_fail_t8_pb 562 /* 0x232 */ -#define CURLY_B_max_fail_t8_p8 563 /* 0x233 */ - -#define COMMIT_next 141 /* 0x8d state for COMMIT */ -#define COMMIT_next_tb 282 /* 0x11a */ -#define COMMIT_next_t8 283 /* 0x11b */ -#define COMMIT_next_tb_pb 564 /* 0x234 */ -#define COMMIT_next_tb_p8 565 /* 0x235 */ -#define COMMIT_next_t8_pb 566 /* 0x236 */ -#define COMMIT_next_t8_p8 567 /* 0x237 */ - -#define COMMIT_next_fail 142 /* 0x8e state for COMMIT */ -#define COMMIT_next_fail_tb 284 /* 0x11c */ -#define COMMIT_next_fail_t8 285 /* 0x11d */ -#define COMMIT_next_fail_tb_pb 568 /* 0x238 */ -#define COMMIT_next_fail_tb_p8 569 /* 0x239 */ -#define COMMIT_next_fail_t8_pb 570 /* 0x23a */ -#define COMMIT_next_fail_t8_p8 571 /* 0x23b */ - -#define MARKPOINT_next 143 /* 0x8f state for MARKPOINT */ -#define MARKPOINT_next_tb 286 /* 0x11e */ -#define MARKPOINT_next_t8 287 /* 0x11f */ -#define MARKPOINT_next_tb_pb 572 /* 0x23c */ -#define MARKPOINT_next_tb_p8 573 /* 0x23d */ -#define MARKPOINT_next_t8_pb 574 /* 0x23e */ -#define MARKPOINT_next_t8_p8 575 /* 0x23f */ - -#define MARKPOINT_next_fail 144 /* 0x90 state for MARKPOINT */ -#define MARKPOINT_next_fail_tb 288 /* 0x120 */ -#define MARKPOINT_next_fail_t8 289 /* 0x121 */ -#define MARKPOINT_next_fail_tb_pb 576 /* 0x240 */ -#define MARKPOINT_next_fail_tb_p8 577 /* 0x241 */ -#define MARKPOINT_next_fail_t8_pb 578 /* 0x242 */ -#define MARKPOINT_next_fail_t8_p8 579 /* 0x243 */ - -#define SKIP_next 145 /* 0x91 state for SKIP */ -#define SKIP_next_tb 290 /* 0x122 */ -#define SKIP_next_t8 291 /* 0x123 */ -#define SKIP_next_tb_pb 580 /* 0x244 */ -#define SKIP_next_tb_p8 581 /* 0x245 */ -#define SKIP_next_t8_pb 582 /* 0x246 */ -#define SKIP_next_t8_p8 583 /* 0x247 */ - -#define SKIP_next_fail 146 /* 0x92 state for SKIP */ -#define SKIP_next_fail_tb 292 /* 0x124 */ -#define SKIP_next_fail_t8 293 /* 0x125 */ -#define SKIP_next_fail_tb_pb 584 /* 0x248 */ -#define SKIP_next_fail_tb_p8 585 /* 0x249 */ -#define SKIP_next_fail_t8_pb 586 /* 0x24a */ -#define SKIP_next_fail_t8_p8 587 /* 0x24b */ - -#define CUTGROUP_next 147 /* 0x93 state for CUTGROUP */ -#define CUTGROUP_next_tb 294 /* 0x126 */ -#define CUTGROUP_next_t8 295 /* 0x127 */ -#define CUTGROUP_next_tb_pb 588 /* 0x24c */ -#define CUTGROUP_next_tb_p8 589 /* 0x24d */ -#define CUTGROUP_next_t8_pb 590 /* 0x24e */ -#define CUTGROUP_next_t8_p8 591 /* 0x24f */ - -#define CUTGROUP_next_fail 148 /* 0x94 state for CUTGROUP */ -#define CUTGROUP_next_fail_tb 296 /* 0x128 */ -#define CUTGROUP_next_fail_t8 297 /* 0x129 */ -#define CUTGROUP_next_fail_tb_pb 592 /* 0x250 */ -#define CUTGROUP_next_fail_tb_p8 593 /* 0x251 */ -#define CUTGROUP_next_fail_t8_pb 594 /* 0x252 */ -#define CUTGROUP_next_fail_t8_p8 595 /* 0x253 */ - -#define KEEPS_next 149 /* 0x95 state for KEEPS */ -#define KEEPS_next_tb 298 /* 0x12a */ -#define KEEPS_next_t8 299 /* 0x12b */ -#define KEEPS_next_tb_pb 596 /* 0x254 */ -#define KEEPS_next_tb_p8 597 /* 0x255 */ -#define KEEPS_next_t8_pb 598 /* 0x256 */ -#define KEEPS_next_t8_p8 599 /* 0x257 */ - -#define KEEPS_next_fail 150 /* 0x96 state for KEEPS */ -#define KEEPS_next_fail_tb 300 /* 0x12c */ -#define KEEPS_next_fail_t8 301 /* 0x12d */ -#define KEEPS_next_fail_tb_pb 600 /* 0x258 */ -#define KEEPS_next_fail_tb_p8 601 /* 0x259 */ -#define KEEPS_next_fail_t8_pb 602 /* 0x25a */ -#define KEEPS_next_fail_t8_p8 603 /* 0x25b */ - - -/* PL_regkind[] What type of regop or state is this. */ - -#ifndef DOINIT -EXTCONST U8 PL_regkind[]; -#else -EXTCONST U8 PL_regkind[] = { - END, /* END */ - END, /* SUCCEED */ - BOL, /* SBOL */ - BOL, /* MBOL */ - EOL, /* SEOL */ - EOL, /* MEOL */ - EOL, /* EOS */ - GPOS, /* GPOS */ - BOUND, /* BOUND */ - BOUND, /* BOUNDL */ - BOUND, /* BOUNDU */ - BOUND, /* BOUNDA */ - NBOUND, /* NBOUND */ - NBOUND, /* NBOUNDL */ - NBOUND, /* NBOUNDU */ - NBOUND, /* NBOUNDA */ - REG_ANY, /* REG_ANY */ - REG_ANY, /* SANY */ - ANYOF, /* ANYOF */ - ANYOF, /* ANYOFD */ - ANYOF, /* ANYOFL */ - ANYOF, /* ANYOFPOSIXL */ - ANYOF, /* ANYOFH */ - ANYOF, /* ANYOFHb */ - ANYOF, /* ANYOFHr */ - ANYOF, /* ANYOFHs */ - ANYOFR, /* ANYOFR */ - ANYOFR, /* ANYOFRb */ - ANYOFM, /* ANYOFM */ - ANYOFM, /* NANYOFM */ - POSIXD, /* POSIXD */ - POSIXD, /* POSIXL */ - POSIXD, /* POSIXU */ - POSIXD, /* POSIXA */ - NPOSIXD, /* NPOSIXD */ - NPOSIXD, /* NPOSIXL */ - NPOSIXD, /* NPOSIXU */ - NPOSIXD, /* NPOSIXA */ - CLUMP, /* CLUMP */ - BRANCH, /* BRANCH */ - EXACT, /* EXACT */ - EXACT, /* LEXACT */ - EXACT, /* EXACTL */ - EXACT, /* EXACTF */ - EXACT, /* EXACTFL */ - EXACT, /* EXACTFU */ - EXACT, /* EXACTFAA */ - EXACT, /* EXACTFAA_NO_TRIE */ - EXACT, /* EXACTFUP */ - EXACT, /* EXACTFLU8 */ - EXACT, /* EXACT_REQ8 */ - EXACT, /* LEXACT_REQ8 */ - EXACT, /* EXACTFU_REQ8 */ - EXACT, /* EXACTFU_S_EDGE */ - LNBREAK, /* LNBREAK */ - TRIE, /* TRIE */ - TRIE, /* TRIEC */ - TRIE, /* AHOCORASICK */ - TRIE, /* AHOCORASICKC */ - NOTHING, /* NOTHING */ - NOTHING, /* TAIL */ - STAR, /* STAR */ - PLUS, /* PLUS */ - CURLY, /* CURLY */ - CURLY, /* CURLYN */ - CURLY, /* CURLYM */ - CURLY, /* CURLYX */ - WHILEM, /* WHILEM */ - OPEN, /* OPEN */ - CLOSE, /* CLOSE */ - SROPEN, /* SROPEN */ - SRCLOSE, /* SRCLOSE */ - REF, /* REF */ - REF, /* REFF */ - REF, /* REFFL */ - REF, /* REFFU */ - REF, /* REFFA */ - REF, /* REFN */ - REF, /* REFFN */ - REF, /* REFFLN */ - REF, /* REFFUN */ - REF, /* REFFAN */ - LONGJMP, /* LONGJMP */ - BRANCHJ, /* BRANCHJ */ - BRANCHJ, /* IFMATCH */ - BRANCHJ, /* UNLESSM */ - BRANCHJ, /* SUSPEND */ - BRANCHJ, /* IFTHEN */ - GROUPP, /* GROUPP */ - EVAL, /* EVAL */ - MINMOD, /* MINMOD */ - LOGICAL, /* LOGICAL */ - BRANCHJ, /* RENUM */ - GOSUB, /* GOSUB */ - GROUPPN, /* GROUPPN */ - INSUBP, /* INSUBP */ - DEFINEP, /* DEFINEP */ - ENDLIKE, /* ENDLIKE */ - ENDLIKE, /* OPFAIL */ - ENDLIKE, /* ACCEPT */ - VERB, /* VERB */ - VERB, /* PRUNE */ - VERB, /* MARKPOINT */ - VERB, /* SKIP */ - VERB, /* COMMIT */ - VERB, /* CUTGROUP */ - KEEPS, /* KEEPS */ - END, /* LOOKBEHIND_END */ - NOTHING, /* OPTIMIZED */ - PSEUDO, /* PSEUDO */ - REGEX_SET, /* REGEX_SET */ - /* ------------ States ------------- */ - TRIE, /* TRIE_next */ - TRIE, /* TRIE_next_fail */ - EVAL, /* EVAL_B */ - EVAL, /* EVAL_B_fail */ - EVAL, /* EVAL_postponed_AB */ - EVAL, /* EVAL_postponed_AB_fail */ - CURLYX, /* CURLYX_end */ - CURLYX, /* CURLYX_end_fail */ - WHILEM, /* WHILEM_A_pre */ - WHILEM, /* WHILEM_A_pre_fail */ - WHILEM, /* WHILEM_A_min */ - WHILEM, /* WHILEM_A_min_fail */ - WHILEM, /* WHILEM_A_max */ - WHILEM, /* WHILEM_A_max_fail */ - WHILEM, /* WHILEM_B_min */ - WHILEM, /* WHILEM_B_min_fail */ - WHILEM, /* WHILEM_B_max */ - WHILEM, /* WHILEM_B_max_fail */ - BRANCH, /* BRANCH_next */ - BRANCH, /* BRANCH_next_fail */ - CURLYM, /* CURLYM_A */ - CURLYM, /* CURLYM_A_fail */ - CURLYM, /* CURLYM_B */ - CURLYM, /* CURLYM_B_fail */ - IFMATCH, /* IFMATCH_A */ - IFMATCH, /* IFMATCH_A_fail */ - CURLY, /* CURLY_B_min */ - CURLY, /* CURLY_B_min_fail */ - CURLY, /* CURLY_B_max */ - CURLY, /* CURLY_B_max_fail */ - COMMIT, /* COMMIT_next */ - COMMIT, /* COMMIT_next_fail */ - MARKPOINT, /* MARKPOINT_next */ - MARKPOINT, /* MARKPOINT_next_fail */ - SKIP, /* SKIP_next */ - SKIP, /* SKIP_next_fail */ - CUTGROUP, /* CUTGROUP_next */ - CUTGROUP, /* CUTGROUP_next_fail */ - KEEPS, /* KEEPS_next */ - KEEPS, /* KEEPS_next_fail */ -}; -#endif +#define TRIE_next 112 /* 0x70 state for TRIE */ +#define TRIE_next_tb 224 /* 0x0e0 */ +#define TRIE_next_t8 225 /* 0x0e1 */ +#define TRIE_next_tb_pb 448 /* 0x1c0 */ +#define TRIE_next_tb_p8 449 /* 0x1c1 */ +#define TRIE_next_t8_pb 450 /* 0x1c2 */ +#define TRIE_next_t8_p8 451 /* 0x1c3 */ + +#define TRIE_next_fail 113 /* 0x71 state for TRIE */ +#define TRIE_next_fail_tb 226 /* 0x0e2 */ +#define TRIE_next_fail_t8 227 /* 0x0e3 */ +#define TRIE_next_fail_tb_pb 452 /* 0x1c4 */ +#define TRIE_next_fail_tb_p8 453 /* 0x1c5 */ +#define TRIE_next_fail_t8_pb 454 /* 0x1c6 */ +#define TRIE_next_fail_t8_p8 455 /* 0x1c7 */ + +#define EVAL_B 114 /* 0x72 state for EVAL */ +#define EVAL_B_tb 228 /* 0x0e4 */ +#define EVAL_B_t8 229 /* 0x0e5 */ +#define EVAL_B_tb_pb 456 /* 0x1c8 */ +#define EVAL_B_tb_p8 457 /* 0x1c9 */ +#define EVAL_B_t8_pb 458 /* 0x1ca */ +#define EVAL_B_t8_p8 459 /* 0x1cb */ + +#define EVAL_B_fail 115 /* 0x73 state for EVAL */ +#define EVAL_B_fail_tb 230 /* 0x0e6 */ +#define EVAL_B_fail_t8 231 /* 0x0e7 */ +#define EVAL_B_fail_tb_pb 460 /* 0x1cc */ +#define EVAL_B_fail_tb_p8 461 /* 0x1cd */ +#define EVAL_B_fail_t8_pb 462 /* 0x1ce */ +#define EVAL_B_fail_t8_p8 463 /* 0x1cf */ + +#define EVAL_postponed_AB 116 /* 0x74 state for EVAL */ +#define EVAL_postponed_AB_tb 232 /* 0x0e8 */ +#define EVAL_postponed_AB_t8 233 /* 0x0e9 */ +#define EVAL_postponed_AB_tb_pb 464 /* 0x1d0 */ +#define EVAL_postponed_AB_tb_p8 465 /* 0x1d1 */ +#define EVAL_postponed_AB_t8_pb 466 /* 0x1d2 */ +#define EVAL_postponed_AB_t8_p8 467 /* 0x1d3 */ + +#define EVAL_postponed_AB_fail 117 /* 0x75 state for EVAL */ +#define EVAL_postponed_AB_fail_tb 234 /* 0x0ea */ +#define EVAL_postponed_AB_fail_t8 235 /* 0x0eb */ +#define EVAL_postponed_AB_fail_tb_pb 468 /* 0x1d4 */ +#define EVAL_postponed_AB_fail_tb_p8 469 /* 0x1d5 */ +#define EVAL_postponed_AB_fail_t8_pb 470 /* 0x1d6 */ +#define EVAL_postponed_AB_fail_t8_p8 471 /* 0x1d7 */ + +#define CURLYX_end 118 /* 0x76 state for CURLYX */ +#define CURLYX_end_tb 236 /* 0x0ec */ +#define CURLYX_end_t8 237 /* 0x0ed */ +#define CURLYX_end_tb_pb 472 /* 0x1d8 */ +#define CURLYX_end_tb_p8 473 /* 0x1d9 */ +#define CURLYX_end_t8_pb 474 /* 0x1da */ +#define CURLYX_end_t8_p8 475 /* 0x1db */ + +#define CURLYX_end_fail 119 /* 0x77 state for CURLYX */ +#define CURLYX_end_fail_tb 238 /* 0x0ee */ +#define CURLYX_end_fail_t8 239 /* 0x0ef */ +#define CURLYX_end_fail_tb_pb 476 /* 0x1dc */ +#define CURLYX_end_fail_tb_p8 477 /* 0x1dd */ +#define CURLYX_end_fail_t8_pb 478 /* 0x1de */ +#define CURLYX_end_fail_t8_p8 479 /* 0x1df */ + +#define WHILEM_A_pre 120 /* 0x78 state for WHILEM */ +#define WHILEM_A_pre_tb 240 /* 0x0f0 */ +#define WHILEM_A_pre_t8 241 /* 0x0f1 */ +#define WHILEM_A_pre_tb_pb 480 /* 0x1e0 */ +#define WHILEM_A_pre_tb_p8 481 /* 0x1e1 */ +#define WHILEM_A_pre_t8_pb 482 /* 0x1e2 */ +#define WHILEM_A_pre_t8_p8 483 /* 0x1e3 */ + +#define WHILEM_A_pre_fail 121 /* 0x79 state for WHILEM */ +#define WHILEM_A_pre_fail_tb 242 /* 0x0f2 */ +#define WHILEM_A_pre_fail_t8 243 /* 0x0f3 */ +#define WHILEM_A_pre_fail_tb_pb 484 /* 0x1e4 */ +#define WHILEM_A_pre_fail_tb_p8 485 /* 0x1e5 */ +#define WHILEM_A_pre_fail_t8_pb 486 /* 0x1e6 */ +#define WHILEM_A_pre_fail_t8_p8 487 /* 0x1e7 */ + +#define WHILEM_A_min 122 /* 0x7a state for WHILEM */ +#define WHILEM_A_min_tb 244 /* 0x0f4 */ +#define WHILEM_A_min_t8 245 /* 0x0f5 */ +#define WHILEM_A_min_tb_pb 488 /* 0x1e8 */ +#define WHILEM_A_min_tb_p8 489 /* 0x1e9 */ +#define WHILEM_A_min_t8_pb 490 /* 0x1ea */ +#define WHILEM_A_min_t8_p8 491 /* 0x1eb */ + +#define WHILEM_A_min_fail 123 /* 0x7b state for WHILEM */ +#define WHILEM_A_min_fail_tb 246 /* 0x0f6 */ +#define WHILEM_A_min_fail_t8 247 /* 0x0f7 */ +#define WHILEM_A_min_fail_tb_pb 492 /* 0x1ec */ +#define WHILEM_A_min_fail_tb_p8 493 /* 0x1ed */ +#define WHILEM_A_min_fail_t8_pb 494 /* 0x1ee */ +#define WHILEM_A_min_fail_t8_p8 495 /* 0x1ef */ + +#define WHILEM_A_max 124 /* 0x7c state for WHILEM */ +#define WHILEM_A_max_tb 248 /* 0x0f8 */ +#define WHILEM_A_max_t8 249 /* 0x0f9 */ +#define WHILEM_A_max_tb_pb 496 /* 0x1f0 */ +#define WHILEM_A_max_tb_p8 497 /* 0x1f1 */ +#define WHILEM_A_max_t8_pb 498 /* 0x1f2 */ +#define WHILEM_A_max_t8_p8 499 /* 0x1f3 */ + +#define WHILEM_A_max_fail 125 /* 0x7d state for WHILEM */ +#define WHILEM_A_max_fail_tb 250 /* 0x0fa */ +#define WHILEM_A_max_fail_t8 251 /* 0x0fb */ +#define WHILEM_A_max_fail_tb_pb 500 /* 0x1f4 */ +#define WHILEM_A_max_fail_tb_p8 501 /* 0x1f5 */ +#define WHILEM_A_max_fail_t8_pb 502 /* 0x1f6 */ +#define WHILEM_A_max_fail_t8_p8 503 /* 0x1f7 */ + +#define WHILEM_B_min 126 /* 0x7e state for WHILEM */ +#define WHILEM_B_min_tb 252 /* 0x0fc */ +#define WHILEM_B_min_t8 253 /* 0x0fd */ +#define WHILEM_B_min_tb_pb 504 /* 0x1f8 */ +#define WHILEM_B_min_tb_p8 505 /* 0x1f9 */ +#define WHILEM_B_min_t8_pb 506 /* 0x1fa */ +#define WHILEM_B_min_t8_p8 507 /* 0x1fb */ + +#define WHILEM_B_min_fail 127 /* 0x7f state for WHILEM */ +#define WHILEM_B_min_fail_tb 254 /* 0x0fe */ +#define WHILEM_B_min_fail_t8 255 /* 0x0ff */ +#define WHILEM_B_min_fail_tb_pb 508 /* 0x1fc */ +#define WHILEM_B_min_fail_tb_p8 509 /* 0x1fd */ +#define WHILEM_B_min_fail_t8_pb 510 /* 0x1fe */ +#define WHILEM_B_min_fail_t8_p8 511 /* 0x1ff */ + +#define WHILEM_B_max 128 /* 0x80 state for WHILEM */ +#define WHILEM_B_max_tb 256 /* 0x100 */ +#define WHILEM_B_max_t8 257 /* 0x101 */ +#define WHILEM_B_max_tb_pb 512 /* 0x200 */ +#define WHILEM_B_max_tb_p8 513 /* 0x201 */ +#define WHILEM_B_max_t8_pb 514 /* 0x202 */ +#define WHILEM_B_max_t8_p8 515 /* 0x203 */ + +#define WHILEM_B_max_fail 129 /* 0x81 state for WHILEM */ +#define WHILEM_B_max_fail_tb 258 /* 0x102 */ +#define WHILEM_B_max_fail_t8 259 /* 0x103 */ +#define WHILEM_B_max_fail_tb_pb 516 /* 0x204 */ +#define WHILEM_B_max_fail_tb_p8 517 /* 0x205 */ +#define WHILEM_B_max_fail_t8_pb 518 /* 0x206 */ +#define WHILEM_B_max_fail_t8_p8 519 /* 0x207 */ + +#define BRANCH_next 130 /* 0x82 state for BRANCH */ +#define BRANCH_next_tb 260 /* 0x104 */ +#define BRANCH_next_t8 261 /* 0x105 */ +#define BRANCH_next_tb_pb 520 /* 0x208 */ +#define BRANCH_next_tb_p8 521 /* 0x209 */ +#define BRANCH_next_t8_pb 522 /* 0x20a */ +#define BRANCH_next_t8_p8 523 /* 0x20b */ + +#define BRANCH_next_fail 131 /* 0x83 state for BRANCH */ +#define BRANCH_next_fail_tb 262 /* 0x106 */ +#define BRANCH_next_fail_t8 263 /* 0x107 */ +#define BRANCH_next_fail_tb_pb 524 /* 0x20c */ +#define BRANCH_next_fail_tb_p8 525 /* 0x20d */ +#define BRANCH_next_fail_t8_pb 526 /* 0x20e */ +#define BRANCH_next_fail_t8_p8 527 /* 0x20f */ + +#define CURLYM_A 132 /* 0x84 state for CURLYM */ +#define CURLYM_A_tb 264 /* 0x108 */ +#define CURLYM_A_t8 265 /* 0x109 */ +#define CURLYM_A_tb_pb 528 /* 0x210 */ +#define CURLYM_A_tb_p8 529 /* 0x211 */ +#define CURLYM_A_t8_pb 530 /* 0x212 */ +#define CURLYM_A_t8_p8 531 /* 0x213 */ + +#define CURLYM_A_fail 133 /* 0x85 state for CURLYM */ +#define CURLYM_A_fail_tb 266 /* 0x10a */ +#define CURLYM_A_fail_t8 267 /* 0x10b */ +#define CURLYM_A_fail_tb_pb 532 /* 0x214 */ +#define CURLYM_A_fail_tb_p8 533 /* 0x215 */ +#define CURLYM_A_fail_t8_pb 534 /* 0x216 */ +#define CURLYM_A_fail_t8_p8 535 /* 0x217 */ + +#define CURLYM_B 134 /* 0x86 state for CURLYM */ +#define CURLYM_B_tb 268 /* 0x10c */ +#define CURLYM_B_t8 269 /* 0x10d */ +#define CURLYM_B_tb_pb 536 /* 0x218 */ +#define CURLYM_B_tb_p8 537 /* 0x219 */ +#define CURLYM_B_t8_pb 538 /* 0x21a */ +#define CURLYM_B_t8_p8 539 /* 0x21b */ + +#define CURLYM_B_fail 135 /* 0x87 state for CURLYM */ +#define CURLYM_B_fail_tb 270 /* 0x10e */ +#define CURLYM_B_fail_t8 271 /* 0x10f */ +#define CURLYM_B_fail_tb_pb 540 /* 0x21c */ +#define CURLYM_B_fail_tb_p8 541 /* 0x21d */ +#define CURLYM_B_fail_t8_pb 542 /* 0x21e */ +#define CURLYM_B_fail_t8_p8 543 /* 0x21f */ + +#define IFMATCH_A 136 /* 0x88 state for IFMATCH */ +#define IFMATCH_A_tb 272 /* 0x110 */ +#define IFMATCH_A_t8 273 /* 0x111 */ +#define IFMATCH_A_tb_pb 544 /* 0x220 */ +#define IFMATCH_A_tb_p8 545 /* 0x221 */ +#define IFMATCH_A_t8_pb 546 /* 0x222 */ +#define IFMATCH_A_t8_p8 547 /* 0x223 */ + +#define IFMATCH_A_fail 137 /* 0x89 state for IFMATCH */ +#define IFMATCH_A_fail_tb 274 /* 0x112 */ +#define IFMATCH_A_fail_t8 275 /* 0x113 */ +#define IFMATCH_A_fail_tb_pb 548 /* 0x224 */ +#define IFMATCH_A_fail_tb_p8 549 /* 0x225 */ +#define IFMATCH_A_fail_t8_pb 550 /* 0x226 */ +#define IFMATCH_A_fail_t8_p8 551 /* 0x227 */ + +#define CURLY_B_min 138 /* 0x8a state for CURLY */ +#define CURLY_B_min_tb 276 /* 0x114 */ +#define CURLY_B_min_t8 277 /* 0x115 */ +#define CURLY_B_min_tb_pb 552 /* 0x228 */ +#define CURLY_B_min_tb_p8 553 /* 0x229 */ +#define CURLY_B_min_t8_pb 554 /* 0x22a */ +#define CURLY_B_min_t8_p8 555 /* 0x22b */ + +#define CURLY_B_min_fail 139 /* 0x8b state for CURLY */ +#define CURLY_B_min_fail_tb 278 /* 0x116 */ +#define CURLY_B_min_fail_t8 279 /* 0x117 */ +#define CURLY_B_min_fail_tb_pb 556 /* 0x22c */ +#define CURLY_B_min_fail_tb_p8 557 /* 0x22d */ +#define CURLY_B_min_fail_t8_pb 558 /* 0x22e */ +#define CURLY_B_min_fail_t8_p8 559 /* 0x22f */ + +#define CURLY_B_max 140 /* 0x8c state for CURLY */ +#define CURLY_B_max_tb 280 /* 0x118 */ +#define CURLY_B_max_t8 281 /* 0x119 */ +#define CURLY_B_max_tb_pb 560 /* 0x230 */ +#define CURLY_B_max_tb_p8 561 /* 0x231 */ +#define CURLY_B_max_t8_pb 562 /* 0x232 */ +#define CURLY_B_max_t8_p8 563 /* 0x233 */ + +#define CURLY_B_max_fail 141 /* 0x8d state for CURLY */ +#define CURLY_B_max_fail_tb 282 /* 0x11a */ +#define CURLY_B_max_fail_t8 283 /* 0x11b */ +#define CURLY_B_max_fail_tb_pb 564 /* 0x234 */ +#define CURLY_B_max_fail_tb_p8 565 /* 0x235 */ +#define CURLY_B_max_fail_t8_pb 566 /* 0x236 */ +#define CURLY_B_max_fail_t8_p8 567 /* 0x237 */ + +#define COMMIT_next 142 /* 0x8e state for COMMIT */ +#define COMMIT_next_tb 284 /* 0x11c */ +#define COMMIT_next_t8 285 /* 0x11d */ +#define COMMIT_next_tb_pb 568 /* 0x238 */ +#define COMMIT_next_tb_p8 569 /* 0x239 */ +#define COMMIT_next_t8_pb 570 /* 0x23a */ +#define COMMIT_next_t8_p8 571 /* 0x23b */ + +#define COMMIT_next_fail 143 /* 0x8f state for COMMIT */ +#define COMMIT_next_fail_tb 286 /* 0x11e */ +#define COMMIT_next_fail_t8 287 /* 0x11f */ +#define COMMIT_next_fail_tb_pb 572 /* 0x23c */ +#define COMMIT_next_fail_tb_p8 573 /* 0x23d */ +#define COMMIT_next_fail_t8_pb 574 /* 0x23e */ +#define COMMIT_next_fail_t8_p8 575 /* 0x23f */ + +#define MARKPOINT_next 144 /* 0x90 state for MARKPOINT */ +#define MARKPOINT_next_tb 288 /* 0x120 */ +#define MARKPOINT_next_t8 289 /* 0x121 */ +#define MARKPOINT_next_tb_pb 576 /* 0x240 */ +#define MARKPOINT_next_tb_p8 577 /* 0x241 */ +#define MARKPOINT_next_t8_pb 578 /* 0x242 */ +#define MARKPOINT_next_t8_p8 579 /* 0x243 */ + +#define MARKPOINT_next_fail 145 /* 0x91 state for MARKPOINT */ +#define MARKPOINT_next_fail_tb 290 /* 0x122 */ +#define MARKPOINT_next_fail_t8 291 /* 0x123 */ +#define MARKPOINT_next_fail_tb_pb 580 /* 0x244 */ +#define MARKPOINT_next_fail_tb_p8 581 /* 0x245 */ +#define MARKPOINT_next_fail_t8_pb 582 /* 0x246 */ +#define MARKPOINT_next_fail_t8_p8 583 /* 0x247 */ + +#define SKIP_next 146 /* 0x92 state for SKIP */ +#define SKIP_next_tb 292 /* 0x124 */ +#define SKIP_next_t8 293 /* 0x125 */ +#define SKIP_next_tb_pb 584 /* 0x248 */ +#define SKIP_next_tb_p8 585 /* 0x249 */ +#define SKIP_next_t8_pb 586 /* 0x24a */ +#define SKIP_next_t8_p8 587 /* 0x24b */ + +#define SKIP_next_fail 147 /* 0x93 state for SKIP */ +#define SKIP_next_fail_tb 294 /* 0x126 */ +#define SKIP_next_fail_t8 295 /* 0x127 */ +#define SKIP_next_fail_tb_pb 588 /* 0x24c */ +#define SKIP_next_fail_tb_p8 589 /* 0x24d */ +#define SKIP_next_fail_t8_pb 590 /* 0x24e */ +#define SKIP_next_fail_t8_p8 591 /* 0x24f */ + +#define CUTGROUP_next 148 /* 0x94 state for CUTGROUP */ +#define CUTGROUP_next_tb 296 /* 0x128 */ +#define CUTGROUP_next_t8 297 /* 0x129 */ +#define CUTGROUP_next_tb_pb 592 /* 0x250 */ +#define CUTGROUP_next_tb_p8 593 /* 0x251 */ +#define CUTGROUP_next_t8_pb 594 /* 0x252 */ +#define CUTGROUP_next_t8_p8 595 /* 0x253 */ + +#define CUTGROUP_next_fail 149 /* 0x95 state for CUTGROUP */ +#define CUTGROUP_next_fail_tb 298 /* 0x12a */ +#define CUTGROUP_next_fail_t8 299 /* 0x12b */ +#define CUTGROUP_next_fail_tb_pb 596 /* 0x254 */ +#define CUTGROUP_next_fail_tb_p8 597 /* 0x255 */ +#define CUTGROUP_next_fail_t8_pb 598 /* 0x256 */ +#define CUTGROUP_next_fail_t8_p8 599 /* 0x257 */ + +#define KEEPS_next 150 /* 0x96 state for KEEPS */ +#define KEEPS_next_tb 300 /* 0x12c */ +#define KEEPS_next_t8 301 /* 0x12d */ +#define KEEPS_next_tb_pb 600 /* 0x258 */ +#define KEEPS_next_tb_p8 601 /* 0x259 */ +#define KEEPS_next_t8_pb 602 /* 0x25a */ +#define KEEPS_next_t8_p8 603 /* 0x25b */ + +#define KEEPS_next_fail 151 /* 0x97 state for KEEPS */ +#define KEEPS_next_fail_tb 302 /* 0x12e */ +#define KEEPS_next_fail_t8 303 /* 0x12f */ +#define KEEPS_next_fail_tb_pb 604 /* 0x25c */ +#define KEEPS_next_fail_tb_p8 605 /* 0x25d */ +#define KEEPS_next_fail_t8_pb 606 /* 0x25e */ +#define KEEPS_next_fail_t8_p8 607 /* 0x25f */ + +#define REF_next 152 /* 0x98 state for REF */ +#define REF_next_tb 304 /* 0x130 */ +#define REF_next_t8 305 /* 0x131 */ +#define REF_next_tb_pb 608 /* 0x260 */ +#define REF_next_tb_p8 609 /* 0x261 */ +#define REF_next_t8_pb 610 /* 0x262 */ +#define REF_next_t8_p8 611 /* 0x263 */ + +#define REF_next_fail 153 /* 0x99 state for REF */ +#define REF_next_fail_tb 306 /* 0x132 */ +#define REF_next_fail_t8 307 /* 0x133 */ +#define REF_next_fail_tb_pb 612 /* 0x264 */ +#define REF_next_fail_tb_p8 613 /* 0x265 */ +#define REF_next_fail_t8_pb 614 /* 0x266 */ +#define REF_next_fail_t8_p8 615 /* 0x267 */ -#ifdef REG_COMP_C -/* regarglen[] - How large is the argument part of the node (in regnodes) */ - -static const U8 regarglen[] = { - 0, /* END */ - 0, /* SUCCEED */ - 0, /* SBOL */ - 0, /* MBOL */ - 0, /* SEOL */ - 0, /* MEOL */ - 0, /* EOS */ - 0, /* GPOS */ - 0, /* BOUND */ - 0, /* BOUNDL */ - 0, /* BOUNDU */ - 0, /* BOUNDA */ - 0, /* NBOUND */ - 0, /* NBOUNDL */ - 0, /* NBOUNDU */ - 0, /* NBOUNDA */ - 0, /* REG_ANY */ - 0, /* SANY */ - EXTRA_SIZE(struct regnode_charclass), /* ANYOF */ - EXTRA_SIZE(struct regnode_charclass), /* ANYOFD */ - EXTRA_SIZE(struct regnode_charclass), /* ANYOFL */ - EXTRA_SIZE(struct regnode_charclass_posixl), /* ANYOFPOSIXL */ - EXTRA_SIZE(struct regnode_1), /* ANYOFH */ - EXTRA_SIZE(struct regnode_1), /* ANYOFHb */ - EXTRA_SIZE(struct regnode_1), /* ANYOFHr */ - EXTRA_SIZE(struct regnode_1), /* ANYOFHs */ - EXTRA_SIZE(struct regnode_1), /* ANYOFR */ - EXTRA_SIZE(struct regnode_1), /* ANYOFRb */ - EXTRA_SIZE(struct regnode_1), /* ANYOFM */ - EXTRA_SIZE(struct regnode_1), /* NANYOFM */ - 0, /* POSIXD */ - 0, /* POSIXL */ - 0, /* POSIXU */ - 0, /* POSIXA */ - 0, /* NPOSIXD */ - 0, /* NPOSIXL */ - 0, /* NPOSIXU */ - 0, /* NPOSIXA */ - 0, /* CLUMP */ - 0, /* BRANCH */ - 0, /* EXACT */ - EXTRA_SIZE(struct regnode_1), /* LEXACT */ - 0, /* EXACTL */ - 0, /* EXACTF */ - 0, /* EXACTFL */ - 0, /* EXACTFU */ - 0, /* EXACTFAA */ - 0, /* EXACTFAA_NO_TRIE */ - 0, /* EXACTFUP */ - 0, /* EXACTFLU8 */ - 0, /* EXACT_REQ8 */ - EXTRA_SIZE(struct regnode_1), /* LEXACT_REQ8 */ - 0, /* EXACTFU_REQ8 */ - 0, /* EXACTFU_S_EDGE */ - 0, /* LNBREAK */ - EXTRA_SIZE(struct regnode_1), /* TRIE */ - EXTRA_SIZE(struct regnode_charclass), /* TRIEC */ - EXTRA_SIZE(struct regnode_1), /* AHOCORASICK */ - EXTRA_SIZE(struct regnode_charclass), /* AHOCORASICKC */ - 0, /* NOTHING */ - 0, /* TAIL */ - 0, /* STAR */ - 0, /* PLUS */ - EXTRA_SIZE(struct regnode_2), /* CURLY */ - EXTRA_SIZE(struct regnode_2), /* CURLYN */ - EXTRA_SIZE(struct regnode_2), /* CURLYM */ - EXTRA_SIZE(struct regnode_2), /* CURLYX */ - 0, /* WHILEM */ - EXTRA_SIZE(struct regnode_1), /* OPEN */ - EXTRA_SIZE(struct regnode_1), /* CLOSE */ - 0, /* SROPEN */ - 0, /* SRCLOSE */ - EXTRA_SIZE(struct regnode_1), /* REF */ - EXTRA_SIZE(struct regnode_1), /* REFF */ - EXTRA_SIZE(struct regnode_1), /* REFFL */ - EXTRA_SIZE(struct regnode_1), /* REFFU */ - EXTRA_SIZE(struct regnode_1), /* REFFA */ - EXTRA_SIZE(struct regnode_1), /* REFN */ - EXTRA_SIZE(struct regnode_1), /* REFFN */ - EXTRA_SIZE(struct regnode_1), /* REFFLN */ - EXTRA_SIZE(struct regnode_1), /* REFFUN */ - EXTRA_SIZE(struct regnode_1), /* REFFAN */ - EXTRA_SIZE(struct regnode_1), /* LONGJMP */ - EXTRA_SIZE(struct regnode_1), /* BRANCHJ */ - EXTRA_SIZE(struct regnode_1), /* IFMATCH */ - EXTRA_SIZE(struct regnode_1), /* UNLESSM */ - EXTRA_SIZE(struct regnode_1), /* SUSPEND */ - EXTRA_SIZE(struct regnode_1), /* IFTHEN */ - EXTRA_SIZE(struct regnode_1), /* GROUPP */ - EXTRA_SIZE(struct regnode_2L), /* EVAL */ - 0, /* MINMOD */ - 0, /* LOGICAL */ - EXTRA_SIZE(struct regnode_1), /* RENUM */ - EXTRA_SIZE(struct regnode_2L), /* GOSUB */ - EXTRA_SIZE(struct regnode_1), /* GROUPPN */ - EXTRA_SIZE(struct regnode_1), /* INSUBP */ - EXTRA_SIZE(struct regnode_1), /* DEFINEP */ - 0, /* ENDLIKE */ - EXTRA_SIZE(struct regnode_1), /* OPFAIL */ - EXTRA_SIZE(struct regnode_2L), /* ACCEPT */ - EXTRA_SIZE(struct regnode_1), /* VERB */ - EXTRA_SIZE(struct regnode_1), /* PRUNE */ - EXTRA_SIZE(struct regnode_1), /* MARKPOINT */ - EXTRA_SIZE(struct regnode_1), /* SKIP */ - EXTRA_SIZE(struct regnode_1), /* COMMIT */ - EXTRA_SIZE(struct regnode_1), /* CUTGROUP */ - 0, /* KEEPS */ - 0, /* LOOKBEHIND_END */ - 0, /* OPTIMIZED */ - 0, /* PSEUDO */ - EXTRA_SIZE(struct regnode_p), /* REGEX_SET */ -}; - -/* reg_off_by_arg[] - Which argument holds the offset to the next node */ - -static const char reg_off_by_arg[] = { - 0, /* END */ - 0, /* SUCCEED */ - 0, /* SBOL */ - 0, /* MBOL */ - 0, /* SEOL */ - 0, /* MEOL */ - 0, /* EOS */ - 0, /* GPOS */ - 0, /* BOUND */ - 0, /* BOUNDL */ - 0, /* BOUNDU */ - 0, /* BOUNDA */ - 0, /* NBOUND */ - 0, /* NBOUNDL */ - 0, /* NBOUNDU */ - 0, /* NBOUNDA */ - 0, /* REG_ANY */ - 0, /* SANY */ - 0, /* ANYOF */ - 0, /* ANYOFD */ - 0, /* ANYOFL */ - 0, /* ANYOFPOSIXL */ - 0, /* ANYOFH */ - 0, /* ANYOFHb */ - 0, /* ANYOFHr */ - 0, /* ANYOFHs */ - 0, /* ANYOFR */ - 0, /* ANYOFRb */ - 0, /* ANYOFM */ - 0, /* NANYOFM */ - 0, /* POSIXD */ - 0, /* POSIXL */ - 0, /* POSIXU */ - 0, /* POSIXA */ - 0, /* NPOSIXD */ - 0, /* NPOSIXL */ - 0, /* NPOSIXU */ - 0, /* NPOSIXA */ - 0, /* CLUMP */ - 0, /* BRANCH */ - 0, /* EXACT */ - 0, /* LEXACT */ - 0, /* EXACTL */ - 0, /* EXACTF */ - 0, /* EXACTFL */ - 0, /* EXACTFU */ - 0, /* EXACTFAA */ - 0, /* EXACTFAA_NO_TRIE */ - 0, /* EXACTFUP */ - 0, /* EXACTFLU8 */ - 0, /* EXACT_REQ8 */ - 0, /* LEXACT_REQ8 */ - 0, /* EXACTFU_REQ8 */ - 0, /* EXACTFU_S_EDGE */ - 0, /* LNBREAK */ - 0, /* TRIE */ - 0, /* TRIEC */ - 0, /* AHOCORASICK */ - 0, /* AHOCORASICKC */ - 0, /* NOTHING */ - 0, /* TAIL */ - 0, /* STAR */ - 0, /* PLUS */ - 0, /* CURLY */ - 0, /* CURLYN */ - 0, /* CURLYM */ - 0, /* CURLYX */ - 0, /* WHILEM */ - 0, /* OPEN */ - 0, /* CLOSE */ - 0, /* SROPEN */ - 0, /* SRCLOSE */ - 0, /* REF */ - 0, /* REFF */ - 0, /* REFFL */ - 0, /* REFFU */ - 0, /* REFFA */ - 0, /* REFN */ - 0, /* REFFN */ - 0, /* REFFLN */ - 0, /* REFFUN */ - 0, /* REFFAN */ - 1, /* LONGJMP */ - 1, /* BRANCHJ */ - 1, /* IFMATCH */ - 1, /* UNLESSM */ - 1, /* SUSPEND */ - 1, /* IFTHEN */ - 0, /* GROUPP */ - 0, /* EVAL */ - 0, /* MINMOD */ - 0, /* LOGICAL */ - 1, /* RENUM */ - 0, /* GOSUB */ - 0, /* GROUPPN */ - 0, /* INSUBP */ - 0, /* DEFINEP */ - 0, /* ENDLIKE */ - 0, /* OPFAIL */ - 0, /* ACCEPT */ - 0, /* VERB */ - 0, /* PRUNE */ - 0, /* MARKPOINT */ - 0, /* SKIP */ - 0, /* COMMIT */ - 0, /* CUTGROUP */ - 0, /* KEEPS */ - 0, /* LOOKBEHIND_END */ - 0, /* OPTIMIZED */ - 0, /* PSEUDO */ - 0, /* REGEX_SET */ -}; - -#endif /* REG_COMP_C */ - - -/* reg_name[] - Opcode/state names in string form, for debugging */ +/* PL_regnode_name[] - Opcode/state names in string form, for debugging */ #ifndef DOINIT -EXTCONST char * PL_reg_name[]; +EXTCONST char * PL_regnode_name[]; #else -EXTCONST char * const PL_reg_name[] = { +EXTCONST char * const PL_regnode_name[] = { "END", /* 0000 */ "SUCCEED", /* 0x01 */ "SBOL", /* 0x02 */ @@ -1868,89 +1624,90 @@ EXTCONST char * const PL_reg_name[] = { "ANYOFHs", /* 0x19 */ "ANYOFR", /* 0x1a */ "ANYOFRb", /* 0x1b */ - "ANYOFM", /* 0x1c */ - "NANYOFM", /* 0x1d */ - "POSIXD", /* 0x1e */ - "POSIXL", /* 0x1f */ - "POSIXU", /* 0x20 */ - "POSIXA", /* 0x21 */ - "NPOSIXD", /* 0x22 */ - "NPOSIXL", /* 0x23 */ - "NPOSIXU", /* 0x24 */ - "NPOSIXA", /* 0x25 */ - "CLUMP", /* 0x26 */ - "BRANCH", /* 0x27 */ - "EXACT", /* 0x28 */ - "LEXACT", /* 0x29 */ - "EXACTL", /* 0x2a */ - "EXACTF", /* 0x2b */ - "EXACTFL", /* 0x2c */ - "EXACTFU", /* 0x2d */ - "EXACTFAA", /* 0x2e */ - "EXACTFAA_NO_TRIE", /* 0x2f */ - "EXACTFUP", /* 0x30 */ - "EXACTFLU8", /* 0x31 */ - "EXACT_REQ8", /* 0x32 */ - "LEXACT_REQ8", /* 0x33 */ - "EXACTFU_REQ8", /* 0x34 */ - "EXACTFU_S_EDGE", /* 0x35 */ - "LNBREAK", /* 0x36 */ - "TRIE", /* 0x37 */ - "TRIEC", /* 0x38 */ - "AHOCORASICK", /* 0x39 */ - "AHOCORASICKC", /* 0x3a */ - "NOTHING", /* 0x3b */ - "TAIL", /* 0x3c */ - "STAR", /* 0x3d */ - "PLUS", /* 0x3e */ - "CURLY", /* 0x3f */ - "CURLYN", /* 0x40 */ - "CURLYM", /* 0x41 */ - "CURLYX", /* 0x42 */ - "WHILEM", /* 0x43 */ - "OPEN", /* 0x44 */ - "CLOSE", /* 0x45 */ - "SROPEN", /* 0x46 */ - "SRCLOSE", /* 0x47 */ - "REF", /* 0x48 */ - "REFF", /* 0x49 */ - "REFFL", /* 0x4a */ - "REFFU", /* 0x4b */ - "REFFA", /* 0x4c */ - "REFN", /* 0x4d */ - "REFFN", /* 0x4e */ - "REFFLN", /* 0x4f */ - "REFFUN", /* 0x50 */ - "REFFAN", /* 0x51 */ - "LONGJMP", /* 0x52 */ - "BRANCHJ", /* 0x53 */ - "IFMATCH", /* 0x54 */ - "UNLESSM", /* 0x55 */ - "SUSPEND", /* 0x56 */ - "IFTHEN", /* 0x57 */ - "GROUPP", /* 0x58 */ - "EVAL", /* 0x59 */ - "MINMOD", /* 0x5a */ - "LOGICAL", /* 0x5b */ - "RENUM", /* 0x5c */ - "GOSUB", /* 0x5d */ - "GROUPPN", /* 0x5e */ - "INSUBP", /* 0x5f */ - "DEFINEP", /* 0x60 */ - "ENDLIKE", /* 0x61 */ - "OPFAIL", /* 0x62 */ - "ACCEPT", /* 0x63 */ - "VERB", /* 0x64 */ - "PRUNE", /* 0x65 */ - "MARKPOINT", /* 0x66 */ - "SKIP", /* 0x67 */ - "COMMIT", /* 0x68 */ - "CUTGROUP", /* 0x69 */ - "KEEPS", /* 0x6a */ - "LOOKBEHIND_END", /* 0x6b */ - "OPTIMIZED", /* 0x6c */ - "PSEUDO", /* 0x6d */ - "REGEX_SET", /* 0x6e */ + "ANYOFHbbm", /* 0x1c */ + "ANYOFM", /* 0x1d */ + "NANYOFM", /* 0x1e */ + "POSIXD", /* 0x1f */ + "POSIXL", /* 0x20 */ + "POSIXU", /* 0x21 */ + "POSIXA", /* 0x22 */ + "NPOSIXD", /* 0x23 */ + "NPOSIXL", /* 0x24 */ + "NPOSIXU", /* 0x25 */ + "NPOSIXA", /* 0x26 */ + "CLUMP", /* 0x27 */ + "BRANCH", /* 0x28 */ + "EXACT", /* 0x29 */ + "LEXACT", /* 0x2a */ + "EXACTL", /* 0x2b */ + "EXACTF", /* 0x2c */ + "EXACTFL", /* 0x2d */ + "EXACTFU", /* 0x2e */ + "EXACTFAA", /* 0x2f */ + "EXACTFAA_NO_TRIE", /* 0x30 */ + "EXACTFUP", /* 0x31 */ + "EXACTFLU8", /* 0x32 */ + "EXACT_REQ8", /* 0x33 */ + "LEXACT_REQ8", /* 0x34 */ + "EXACTFU_REQ8", /* 0x35 */ + "EXACTFU_S_EDGE", /* 0x36 */ + "LNBREAK", /* 0x37 */ + "TRIE", /* 0x38 */ + "TRIEC", /* 0x39 */ + "AHOCORASICK", /* 0x3a */ + "AHOCORASICKC", /* 0x3b */ + "NOTHING", /* 0x3c */ + "TAIL", /* 0x3d */ + "STAR", /* 0x3e */ + "PLUS", /* 0x3f */ + "CURLY", /* 0x40 */ + "CURLYN", /* 0x41 */ + "CURLYM", /* 0x42 */ + "CURLYX", /* 0x43 */ + "WHILEM", /* 0x44 */ + "OPEN", /* 0x45 */ + "CLOSE", /* 0x46 */ + "SROPEN", /* 0x47 */ + "SRCLOSE", /* 0x48 */ + "REF", /* 0x49 */ + "REFF", /* 0x4a */ + "REFFL", /* 0x4b */ + "REFFU", /* 0x4c */ + "REFFA", /* 0x4d */ + "REFN", /* 0x4e */ + "REFFN", /* 0x4f */ + "REFFLN", /* 0x50 */ + "REFFUN", /* 0x51 */ + "REFFAN", /* 0x52 */ + "LONGJMP", /* 0x53 */ + "BRANCHJ", /* 0x54 */ + "IFMATCH", /* 0x55 */ + "UNLESSM", /* 0x56 */ + "SUSPEND", /* 0x57 */ + "IFTHEN", /* 0x58 */ + "GROUPP", /* 0x59 */ + "EVAL", /* 0x5a */ + "MINMOD", /* 0x5b */ + "LOGICAL", /* 0x5c */ + "RENUM", /* 0x5d */ + "GOSUB", /* 0x5e */ + "GROUPPN", /* 0x5f */ + "INSUBP", /* 0x60 */ + "DEFINEP", /* 0x61 */ + "ENDLIKE", /* 0x62 */ + "OPFAIL", /* 0x63 */ + "ACCEPT", /* 0x64 */ + "VERB", /* 0x65 */ + "PRUNE", /* 0x66 */ + "MARKPOINT", /* 0x67 */ + "SKIP", /* 0x68 */ + "COMMIT", /* 0x69 */ + "CUTGROUP", /* 0x6a */ + "KEEPS", /* 0x6b */ + "LOOKBEHIND_END", /* 0x6c */ + "OPTIMIZED", /* 0x6d */ + "PSEUDO", /* 0x6e */ + "REGEX_SET", /* 0x6f */ /* ------------ States ------------- */ "TRIE_next", /* REGNODE_MAX +0x01 */ "TRIE_next_fail", /* REGNODE_MAX +0x02 */ @@ -1992,6 +1749,1096 @@ EXTCONST char * const PL_reg_name[] = { "CUTGROUP_next_fail", /* REGNODE_MAX +0x26 */ "KEEPS_next", /* REGNODE_MAX +0x27 */ "KEEPS_next_fail", /* REGNODE_MAX +0x28 */ + "REF_next", /* REGNODE_MAX +0x29 */ + "REF_next_fail", /* REGNODE_MAX +0x2a */ +}; +#endif /* DOINIT */ + + +/* PL_regnode_info[] - Opcode/state names in string form, for debugging */ + +#ifndef DOINIT +EXTCONST struct regnode_meta PL_regnode_info[]; +#else +EXTCONST struct regnode_meta PL_regnode_info[] = { + { + /* #0 op END */ + .type = END, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #1 op SUCCEED */ + .type = END, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #2 op SBOL */ + .type = BOL, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #3 op MBOL */ + .type = BOL, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #4 op SEOL */ + .type = EOL, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #5 op MEOL */ + .type = EOL, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #6 op EOS */ + .type = EOL, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #7 op GPOS */ + .type = GPOS, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #8 op BOUND */ + .type = BOUND, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #9 op BOUNDL */ + .type = BOUND, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #10 op BOUNDU */ + .type = BOUND, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #11 op BOUNDA */ + .type = BOUND, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #12 op NBOUND */ + .type = NBOUND, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #13 op NBOUNDL */ + .type = NBOUND, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #14 op NBOUNDU */ + .type = NBOUND, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #15 op NBOUNDA */ + .type = NBOUND, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #16 op REG_ANY */ + .type = REG_ANY, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #17 op SANY */ + .type = REG_ANY, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #18 op ANYOF */ + .type = ANYOF, + .arg_len = EXTRA_SIZE(tregnode_ANYOF), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #19 op ANYOFD */ + .type = ANYOF, + .arg_len = EXTRA_SIZE(tregnode_ANYOFD), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #20 op ANYOFL */ + .type = ANYOF, + .arg_len = EXTRA_SIZE(tregnode_ANYOFL), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #21 op ANYOFPOSIXL */ + .type = ANYOF, + .arg_len = EXTRA_SIZE(tregnode_ANYOFPOSIXL), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #22 op ANYOFH */ + .type = ANYOFH, + .arg_len = EXTRA_SIZE(tregnode_ANYOFH), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #23 op ANYOFHb */ + .type = ANYOFH, + .arg_len = EXTRA_SIZE(tregnode_ANYOFHb), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #24 op ANYOFHr */ + .type = ANYOFH, + .arg_len = EXTRA_SIZE(tregnode_ANYOFHr), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #25 op ANYOFHs */ + .type = ANYOFH, + .arg_len = EXTRA_SIZE(tregnode_ANYOFHs), + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #26 op ANYOFR */ + .type = ANYOFR, + .arg_len = EXTRA_SIZE(tregnode_ANYOFR), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #27 op ANYOFRb */ + .type = ANYOFR, + .arg_len = EXTRA_SIZE(tregnode_ANYOFRb), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #28 op ANYOFHbbm */ + .type = ANYOFHbbm, + .arg_len = EXTRA_SIZE(tregnode_ANYOFHbbm), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #29 op ANYOFM */ + .type = ANYOFM, + .arg_len = EXTRA_SIZE(tregnode_ANYOFM), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #30 op NANYOFM */ + .type = ANYOFM, + .arg_len = EXTRA_SIZE(tregnode_NANYOFM), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #31 op POSIXD */ + .type = POSIXD, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #32 op POSIXL */ + .type = POSIXD, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #33 op POSIXU */ + .type = POSIXD, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #34 op POSIXA */ + .type = POSIXD, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #35 op NPOSIXD */ + .type = NPOSIXD, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #36 op NPOSIXL */ + .type = NPOSIXD, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #37 op NPOSIXU */ + .type = NPOSIXD, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #38 op NPOSIXA */ + .type = NPOSIXD, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #39 op CLUMP */ + .type = CLUMP, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #40 op BRANCH */ + .type = BRANCH, + .arg_len = EXTRA_SIZE(tregnode_BRANCH), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #41 op EXACT */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #42 op LEXACT */ + .type = EXACT, + .arg_len = EXTRA_SIZE(tregnode_LEXACT), + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #43 op EXACTL */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #44 op EXACTF */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #45 op EXACTFL */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #46 op EXACTFU */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #47 op EXACTFAA */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #48 op EXACTFAA_NO_TRIE */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #49 op EXACTFUP */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #50 op EXACTFLU8 */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #51 op EXACT_REQ8 */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #52 op LEXACT_REQ8 */ + .type = EXACT, + .arg_len = EXTRA_SIZE(tregnode_LEXACT_REQ8), + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #53 op EXACTFU_REQ8 */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #54 op EXACTFU_S_EDGE */ + .type = EXACT, + .arg_len = 0, + .arg_len_varies = 1, + .off_by_arg = 0 + }, + { + /* #55 op LNBREAK */ + .type = LNBREAK, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #56 op TRIE */ + .type = TRIE, + .arg_len = EXTRA_SIZE(tregnode_TRIE), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #57 op TRIEC */ + .type = TRIE, + .arg_len = EXTRA_SIZE(tregnode_TRIEC), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #58 op AHOCORASICK */ + .type = TRIE, + .arg_len = EXTRA_SIZE(tregnode_AHOCORASICK), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #59 op AHOCORASICKC */ + .type = TRIE, + .arg_len = EXTRA_SIZE(tregnode_AHOCORASICKC), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #60 op NOTHING */ + .type = NOTHING, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #61 op TAIL */ + .type = NOTHING, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #62 op STAR */ + .type = STAR, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #63 op PLUS */ + .type = PLUS, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #64 op CURLY */ + .type = CURLY, + .arg_len = EXTRA_SIZE(tregnode_CURLY), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #65 op CURLYN */ + .type = CURLY, + .arg_len = EXTRA_SIZE(tregnode_CURLYN), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #66 op CURLYM */ + .type = CURLY, + .arg_len = EXTRA_SIZE(tregnode_CURLYM), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #67 op CURLYX */ + .type = CURLY, + .arg_len = EXTRA_SIZE(tregnode_CURLYX), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #68 op WHILEM */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #69 op OPEN */ + .type = OPEN, + .arg_len = EXTRA_SIZE(tregnode_OPEN), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #70 op CLOSE */ + .type = CLOSE, + .arg_len = EXTRA_SIZE(tregnode_CLOSE), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #71 op SROPEN */ + .type = SROPEN, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #72 op SRCLOSE */ + .type = SRCLOSE, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #73 op REF */ + .type = REF, + .arg_len = EXTRA_SIZE(tregnode_REF), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #74 op REFF */ + .type = REF, + .arg_len = EXTRA_SIZE(tregnode_REFF), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #75 op REFFL */ + .type = REF, + .arg_len = EXTRA_SIZE(tregnode_REFFL), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #76 op REFFU */ + .type = REF, + .arg_len = EXTRA_SIZE(tregnode_REFFU), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #77 op REFFA */ + .type = REF, + .arg_len = EXTRA_SIZE(tregnode_REFFA), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #78 op REFN */ + .type = REF, + .arg_len = EXTRA_SIZE(tregnode_REFN), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #79 op REFFN */ + .type = REF, + .arg_len = EXTRA_SIZE(tregnode_REFFN), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #80 op REFFLN */ + .type = REF, + .arg_len = EXTRA_SIZE(tregnode_REFFLN), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #81 op REFFUN */ + .type = REF, + .arg_len = EXTRA_SIZE(tregnode_REFFUN), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #82 op REFFAN */ + .type = REF, + .arg_len = EXTRA_SIZE(tregnode_REFFAN), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #83 op LONGJMP */ + .type = LONGJMP, + .arg_len = EXTRA_SIZE(tregnode_LONGJMP), + .arg_len_varies = 0, + .off_by_arg = 1 + }, + { + /* #84 op BRANCHJ */ + .type = BRANCHJ, + .arg_len = EXTRA_SIZE(tregnode_BRANCHJ), + .arg_len_varies = 0, + .off_by_arg = 1 + }, + { + /* #85 op IFMATCH */ + .type = BRANCHJ, + .arg_len = EXTRA_SIZE(tregnode_IFMATCH), + .arg_len_varies = 0, + .off_by_arg = 1 + }, + { + /* #86 op UNLESSM */ + .type = BRANCHJ, + .arg_len = EXTRA_SIZE(tregnode_UNLESSM), + .arg_len_varies = 0, + .off_by_arg = 1 + }, + { + /* #87 op SUSPEND */ + .type = BRANCHJ, + .arg_len = EXTRA_SIZE(tregnode_SUSPEND), + .arg_len_varies = 0, + .off_by_arg = 1 + }, + { + /* #88 op IFTHEN */ + .type = BRANCHJ, + .arg_len = EXTRA_SIZE(tregnode_IFTHEN), + .arg_len_varies = 0, + .off_by_arg = 1 + }, + { + /* #89 op GROUPP */ + .type = GROUPP, + .arg_len = EXTRA_SIZE(tregnode_GROUPP), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #90 op EVAL */ + .type = EVAL, + .arg_len = EXTRA_SIZE(tregnode_EVAL), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #91 op MINMOD */ + .type = MINMOD, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #92 op LOGICAL */ + .type = LOGICAL, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #93 op RENUM */ + .type = BRANCHJ, + .arg_len = EXTRA_SIZE(tregnode_RENUM), + .arg_len_varies = 0, + .off_by_arg = 1 + }, + { + /* #94 op GOSUB */ + .type = GOSUB, + .arg_len = EXTRA_SIZE(tregnode_GOSUB), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #95 op GROUPPN */ + .type = GROUPPN, + .arg_len = EXTRA_SIZE(tregnode_GROUPPN), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #96 op INSUBP */ + .type = INSUBP, + .arg_len = EXTRA_SIZE(tregnode_INSUBP), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #97 op DEFINEP */ + .type = DEFINEP, + .arg_len = EXTRA_SIZE(tregnode_DEFINEP), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #98 op ENDLIKE */ + .type = ENDLIKE, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #99 op OPFAIL */ + .type = ENDLIKE, + .arg_len = EXTRA_SIZE(tregnode_OPFAIL), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #100 op ACCEPT */ + .type = ENDLIKE, + .arg_len = EXTRA_SIZE(tregnode_ACCEPT), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #101 op VERB */ + .type = VERB, + .arg_len = EXTRA_SIZE(tregnode_VERB), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #102 op PRUNE */ + .type = VERB, + .arg_len = EXTRA_SIZE(tregnode_PRUNE), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #103 op MARKPOINT */ + .type = VERB, + .arg_len = EXTRA_SIZE(tregnode_MARKPOINT), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #104 op SKIP */ + .type = VERB, + .arg_len = EXTRA_SIZE(tregnode_SKIP), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #105 op COMMIT */ + .type = VERB, + .arg_len = EXTRA_SIZE(tregnode_COMMIT), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #106 op CUTGROUP */ + .type = VERB, + .arg_len = EXTRA_SIZE(tregnode_CUTGROUP), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #107 op KEEPS */ + .type = KEEPS, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #108 op LOOKBEHIND_END */ + .type = END, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #109 op OPTIMIZED */ + .type = NOTHING, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #110 op PSEUDO */ + .type = PSEUDO, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #111 op REGEX_SET */ + .type = REGEX_SET, + .arg_len = EXTRA_SIZE(tregnode_REGEX_SET), + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #112 state TRIE_next */ + .type = TRIE, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #113 state TRIE_next_fail */ + .type = TRIE, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #114 state EVAL_B */ + .type = EVAL, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #115 state EVAL_B_fail */ + .type = EVAL, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #116 state EVAL_postponed_AB */ + .type = EVAL, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #117 state EVAL_postponed_AB_fail */ + .type = EVAL, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #118 state CURLYX_end */ + .type = CURLYX, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #119 state CURLYX_end_fail */ + .type = CURLYX, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #120 state WHILEM_A_pre */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #121 state WHILEM_A_pre_fail */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #122 state WHILEM_A_min */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #123 state WHILEM_A_min_fail */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #124 state WHILEM_A_max */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #125 state WHILEM_A_max_fail */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #126 state WHILEM_B_min */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #127 state WHILEM_B_min_fail */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #128 state WHILEM_B_max */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #129 state WHILEM_B_max_fail */ + .type = WHILEM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #130 state BRANCH_next */ + .type = BRANCH, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #131 state BRANCH_next_fail */ + .type = BRANCH, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #132 state CURLYM_A */ + .type = CURLYM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #133 state CURLYM_A_fail */ + .type = CURLYM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #134 state CURLYM_B */ + .type = CURLYM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #135 state CURLYM_B_fail */ + .type = CURLYM, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #136 state IFMATCH_A */ + .type = IFMATCH, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #137 state IFMATCH_A_fail */ + .type = IFMATCH, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #138 state CURLY_B_min */ + .type = CURLY, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #139 state CURLY_B_min_fail */ + .type = CURLY, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #140 state CURLY_B_max */ + .type = CURLY, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #141 state CURLY_B_max_fail */ + .type = CURLY, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #142 state COMMIT_next */ + .type = COMMIT, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #143 state COMMIT_next_fail */ + .type = COMMIT, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #144 state MARKPOINT_next */ + .type = MARKPOINT, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #145 state MARKPOINT_next_fail */ + .type = MARKPOINT, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #146 state SKIP_next */ + .type = SKIP, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #147 state SKIP_next_fail */ + .type = SKIP, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #148 state CUTGROUP_next */ + .type = CUTGROUP, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #149 state CUTGROUP_next_fail */ + .type = CUTGROUP, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #150 state KEEPS_next */ + .type = KEEPS, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #151 state KEEPS_next_fail */ + .type = KEEPS, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #152 state REF_next */ + .type = REF, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + }, + { + /* #153 state REF_next_fail */ + .type = REF, + .arg_len = 0, + .arg_len_varies = 0, + .off_by_arg = 0 + } }; #endif /* DOINIT */ @@ -2047,24 +2894,26 @@ EXTCONST char * const PL_reg_extflags_na EXTCONST char * PL_reg_intflags_name[]; #else EXTCONST char * const PL_reg_intflags_name[] = { - "SKIP", /* 0x00000001 - PREGf_SKIP */ - "IMPLICIT", /* 0x00000002 - PREGf_IMPLICIT - Converted .* to ^.* */ - "NAUGHTY", /* 0x00000004 - PREGf_NAUGHTY - how exponential is this pattern? */ - "VERBARG_SEEN", /* 0x00000008 - PREGf_VERBARG_SEEN */ - "CUTGROUP_SEEN", /* 0x00000010 - PREGf_CUTGROUP_SEEN */ - "USE_RE_EVAL", /* 0x00000020 - PREGf_USE_RE_EVAL - compiled with "use re 'eval'" */ - "NOSCAN", /* 0x00000040 - PREGf_NOSCAN */ - "GPOS_SEEN", /* 0x00000100 - PREGf_GPOS_SEEN */ - "GPOS_FLOAT", /* 0x00000200 - PREGf_GPOS_FLOAT */ - "ANCH_MBOL", /* 0x00000400 - PREGf_ANCH_MBOL */ - "ANCH_SBOL", /* 0x00000800 - PREGf_ANCH_SBOL */ - "ANCH_GPOS", /* 0x00001000 - PREGf_ANCH_GPOS */ - "RECURSE_SEEN", /* 0x00002000 - PREGf_RECURSE_SEEN */ + "SKIP", /* (1<< 0) - 0x00000001 - PREGf_SKIP */ + "IMPLICIT", /* (1<< 1) - 0x00000002 - PREGf_IMPLICIT - Converted .* to ^.* */ + "NAUGHTY", /* (1<< 2) - 0x00000004 - PREGf_NAUGHTY - how exponential is this pattern? */ + "VERBARG_SEEN", /* (1<< 3) - 0x00000008 - PREGf_VERBARG_SEEN */ + "CUTGROUP_SEEN", /* (1<< 4) - 0x00000010 - PREGf_CUTGROUP_SEEN */ + "USE_RE_EVAL", /* (1<< 5) - 0x00000020 - PREGf_USE_RE_EVAL - compiled with "use re 'eval'" */ + "NOSCAN", /* (1<< 6) - 0x00000040 - PREGf_NOSCAN */ + "", /* (1<< 7) - 0x00000080 - *UNUSED* */ + "GPOS_SEEN", /* (1<< 8) - 0x00000100 - PREGf_GPOS_SEEN */ + "GPOS_FLOAT", /* (1<< 9) - 0x00000200 - PREGf_GPOS_FLOAT */ + "ANCH_MBOL", /* (1<<10) - 0x00000400 - PREGf_ANCH_MBOL */ + "ANCH_SBOL", /* (1<<11) - 0x00000800 - PREGf_ANCH_SBOL */ + "ANCH_GPOS", /* (1<<12) - 0x00001000 - PREGf_ANCH_GPOS */ + "RECURSE_SEEN", /* (1<<13) - 0x00002000 - PREGf_RECURSE_SEEN */ + "PESSIMIZE_SEEN", /* (1<<14) - 0x00004000 - PREGf_PESSIMIZE_SEEN */ }; #endif /* DOINIT */ #ifdef DEBUGGING -# define REG_INTFLAGS_NAME_SIZE 13 +# define REG_INTFLAGS_NAME_SIZE 15 #endif /* The following have no fixed length. U8 so we can do strchr() on it. */ @@ -2085,7 +2934,7 @@ EXTCONST U8 PL_varies[] __attribute__dep EXTCONST U8 PL_varies_bitmask[]; #else EXTCONST U8 PL_varies_bitmask[] = { - 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xE0, 0x0F, 0xFF, 0xCB, 0x00, 0x00, 0x00 + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xC0, 0x1F, 0xFE, 0x97, 0x01, 0x00, 0x00 }; #endif /* DOINIT */ @@ -2098,8 +2947,8 @@ EXTCONST U8 PL_simple[] __attribute__dep #else EXTCONST U8 PL_simple[] __attribute__deprecated__ = { REG_ANY, SANY, ANYOF, ANYOFD, ANYOFL, ANYOFPOSIXL, ANYOFH, ANYOFHb, - ANYOFHr, ANYOFHs, ANYOFR, ANYOFRb, ANYOFM, NANYOFM, POSIXD, POSIXL, - POSIXU, POSIXA, NPOSIXD, NPOSIXL, NPOSIXU, NPOSIXA, REGEX_SET, + ANYOFHr, ANYOFHs, ANYOFR, ANYOFRb, ANYOFHbbm, ANYOFM, NANYOFM, POSIXD, + POSIXL, POSIXU, POSIXA, NPOSIXD, NPOSIXL, NPOSIXU, NPOSIXA, REGEX_SET, 0 }; #endif /* DOINIT */ @@ -2108,15 +2957,15 @@ EXTCONST U8 PL_simple[] __attribute__dep EXTCONST U8 PL_simple_bitmask[]; #else EXTCONST U8 PL_simple_bitmask[] = { - 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40 + 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 }; #endif /* DOINIT */ /* Is 'op', known to be of type EXACT, folding? */ -#define isEXACTFish(op) (__ASSERT_(PL_regkind[op] == EXACT) (PL_EXACTFish_bitmask & (1U << (op - EXACT)))) +#define isEXACTFish(op) (__ASSERT_(REGNODE_TYPE(op) == EXACT) (PL_EXACTFish_bitmask & (1U << (op - EXACT)))) /* Do only UTF-8 target strings match 'op', known to be of type EXACT? */ -#define isEXACT_REQ8(op) (__ASSERT_(PL_regkind[op] == EXACT) (PL_EXACT_REQ8_bitmask & (1U << (op - EXACT)))) +#define isEXACT_REQ8(op) (__ASSERT_(REGNODE_TYPE(op) == EXACT) (PL_EXACT_REQ8_bitmask & (1U << (op - EXACT)))) #ifndef DOINIT EXTCONST U32 PL_EXACTFish_bitmask; @@ -2128,4 +2977,4 @@ EXTCONST U32 PL_EXACT_REQ8_bitmask = 0x1 #endif /* defined(PERL_CORE) || defined(PERL_EXT_RE_BUILD) */ -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/sbox32_hash.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/sbox32_hash.h,v diff -u -p -a -u -p -r1.1.1.2 sbox32_hash.h --- gnu/usr.bin/perl/sbox32_hash.h 15 Feb 2023 01:31:54 -0000 1.1.1.2 +++ gnu/usr.bin/perl/sbox32_hash.h 21 Feb 2024 15:47:03 -0000 @@ -1409,7 +1409,7 @@ SBOX32_STATIC_INLINE void sbox32_seed_st const U8 *seed_ch, U8 *state_ch ) { - U32 *seed= (U32 *)seed_ch; + const U32 *seed= (const U32 *)seed_ch; U32 *state= (U32 *)state_ch; U32 *state_cursor = state + 1; U32 *sbox32_end = state + 1 + (256 * SBOX32_MAX_LEN); @@ -1458,7 +1458,7 @@ SBOX32_STATIC_INLINE U32 sbox32_hash_wit const U8 *key, const STRLEN key_len ) { - U32 *state= (U32 *)state_ch; + const U32 *state= (const U32 *)state_ch; U32 hash = *state; switch (key_len) { default: return zaphod32_hash_with_state(state_ch, key, key_len); Index: gnu/usr.bin/perl/scope.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/scope.c,v diff -u -p -a -u -p -r1.21 scope.c --- gnu/usr.bin/perl/scope.c 15 Feb 2023 01:36:13 -0000 1.21 +++ gnu/usr.bin/perl/scope.c 21 Feb 2024 15:47:03 -0000 @@ -63,10 +63,10 @@ Perl_stack_grow(pTHX_ SV **sp, SV **p, S return PL_stack_sp; } -#ifndef STRESS_REALLOC -#define GROW(old) ((old) * 3 / 2) -#else +#ifdef STRESS_REALLOC #define GROW(old) ((old) + 1) +#else +#define GROW(old) ((old) * 3 / 2) #endif PERL_SI * @@ -166,25 +166,44 @@ Perl_markstack_grow(pTHX) void Perl_savestack_grow(pTHX) { - IV new_max; -#ifdef STRESS_REALLOC - new_max = PL_savestack_max + SS_MAXPUSH; -#else - new_max = GROW(PL_savestack_max); -#endif - /* Note that we allocate SS_MAXPUSH slots higher than ss_max - * so that SS_ADD_END(), SSGROW() etc can do a simper check */ - Renew(PL_savestack, new_max + SS_MAXPUSH, ANY); - PL_savestack_max = new_max; + const I32 by = PL_savestack_max - PL_savestack_ix; + Perl_savestack_grow_cnt(aTHX_ by); } void Perl_savestack_grow_cnt(pTHX_ I32 need) { - const IV new_max = PL_savestack_ix + need; - /* Note that we allocate SS_MAXPUSH slots higher than ss_max - * so that SS_ADD_END(), SSGROW() etc can do a simper check */ - Renew(PL_savestack, new_max + SS_MAXPUSH, ANY); + /* NOTE: PL_savestack_max and PL_savestack_ix are I32. + * + * This makes sense when you consider that having I32_MAX items on + * the stack would be quite large. + * + * However, we use IV here so that we can detect if the new requested + * amount is larger than I32_MAX. + */ + const IV new_floor = PL_savestack_max + need; /* what we need */ + /* the GROW() macro normally does scales by 1.5 but under + * STRESS_REALLOC it simply adds 1 */ + IV new_max = GROW(new_floor); /* and some extra */ + + /* the new_max < PL_savestack_max is for cases where IV is I32 + * and we have rolled over from I32_MAX to a small value */ + if (new_max > I32_MAX || new_max < PL_savestack_max) { + if (new_floor > I32_MAX || new_floor < PL_savestack_max) { + Perl_croak(aTHX_ "panic: savestack overflows I32_MAX"); + } + new_max = new_floor; + } + + /* Note that we add an additional SS_MAXPUSH slots on top of + * PL_savestack_max so that SS_ADD_END(), SSGROW() etc can do + * a simper check and if necessary realloc *after* apparently + * overwriting the current PL_savestack_max. See scope.h. + * + * The +1 is because new_max/PL_savestack_max is the highest + * index, by Renew needs the number of items, which is one + * larger than the highest index. */ + Renew(PL_savestack, new_max + SS_MAXPUSH + 1, ANY); PL_savestack_max = new_max; } @@ -238,6 +257,27 @@ Perl_free_tmps(pTHX) } } +/* +=for apidoc save_scalar_at + +A helper function for localizing the SV referenced by C<*sptr>. + +If C is set in in C, the function returns the input +scalar untouched. + +Otherwise it replaces C<*sptr> with a new C scalar, and returns that. +The new scalar will have the old one's magic (if any) copied to it. +If there is such magic, and C is set in in C, 'set' +magic will be processed on the new scalar. If unset, 'set' magic will be +skipped. The latter typically means that assignment will soon follow (I, +S>), and that will handle the magic. + +=for apidoc Amnh ||SAVEf_KEEPOLDELEM +=for apidoc Amnh ||SAVEf_SETMAGIC + +=cut +*/ + STATIC SV * S_save_scalar_at(pTHX_ SV **sptr, const U32 flags) { @@ -303,6 +343,43 @@ Perl_save_generic_svref(pTHX_ SV **sptr) save_pushptrptr(sptr, SvREFCNT_inc(*sptr), SAVEt_GENERIC_SVREF); } + +/* +=for apidoc save_rcpv + +Implements C. + +Saves and restores a refcounted string, similar to what +save_generic_svref would do for a SV*. Can be used to restore +a refcounted string to its previous state. Performs the +appropriate refcount counting so that nothing should leak +or be prematurely freed. + +=cut + */ +void +Perl_save_rcpv(pTHX_ char **prcpv) { + PERL_ARGS_ASSERT_SAVE_RCPV; + save_pushptrptr(prcpv, rcpv_copy(*prcpv), SAVEt_RCPV); +} + +/* +=for apidoc save_freercpv + +Implements C. + +Saves and frees a refcounted string. Calls rcpv_free() +on the argument when the current pseudo block is finished. + +=cut + */ +void +Perl_save_freercpv(pTHX_ char *rcpv) { + PERL_ARGS_ASSERT_SAVE_FREERCPV; + save_pushptr(rcpv, SAVEt_FREERCPV); +} + + /* =for apidoc_section $callback =for apidoc save_generic_pvref @@ -410,7 +487,7 @@ Perl_save_gp(pTHX_ GV *gv, I32 empty) HV * const stash = GvSTASH(gv); bool isa_changed = 0; - if (stash && HvENAME(stash)) { + if (stash && HvHasENAME(stash)) { if (memEQs(GvNAME(gv), GvNAMELEN(gv), "ISA")) isa_changed = TRUE; else if (GvCVu(gv)) @@ -592,7 +669,7 @@ Perl_save_iv(pTHX_ IV *ivp) { PERL_ARGS_ASSERT_SAVE_IV; - SSCHECK(3); + SSGROW(3); SSPUSHIV(*ivp); SSPUSHPTR(ivp); SSPUSHUV(SAVEt_IV); @@ -672,6 +749,20 @@ Perl_save_aptr(pTHX_ AV **aptr) save_pushptrptr(*aptr, aptr, SAVEt_APTR); } +/* +=for apidoc_section $callback +=for apidoc save_pushptr + +The refcnt of object C will be decremented at the end of the current +I. C gives the type of C, expressed as one of the +constants in F whose name begins with C. + +This is the underlying implementation of several macros, like +C. + +=cut +*/ + void Perl_save_pushptr(pTHX_ void *const ptr, const int type) { @@ -690,6 +781,7 @@ Perl_save_clearsv(pTHX_ SV **svp) PERL_ARGS_ASSERT_SAVE_CLEARSV; ASSERT_CURPAD_ACTIVE("save_clearsv"); + assert(*svp); SvPADSTALE_off(*svp); /* mark lexical as active */ if (UNLIKELY((offset_shifted >> SAVE_TIGHT_SHIFT) != offset)) { Perl_croak(aTHX_ "panic: pad offset %" UVuf " out of range (%p-%p)", @@ -824,6 +916,28 @@ S_save_pushptri32ptr(pTHX_ void *const p SS_ADD_END(4); } +/* +=for apidoc_section $callback +=for apidoc save_aelem +=for apidoc_item save_aelem_flags + +These each arrange for the value of the array element C to be restored +at the end of the enclosing I. + +In C, the SV at C**sptr> will be replaced by a new C +scalar. That scalar will inherit any magic from the original C<**sptr>, +and any 'set' magic will be processed. + +In C, C being set in C causes +the function to forgo all that: the scalar at C<**sptr> is untouched. +If C is not set, the SV at C**sptr> will be replaced by a +new C scalar. That scalar will inherit any magic from the original +C<**sptr>. Any 'set' magic will be processed if and only if C +is set in in C. + +=cut +*/ + void Perl_save_aelem_flags(pTHX_ AV *av, SSize_t idx, SV **sptr, const U32 flags) @@ -855,6 +969,28 @@ Perl_save_aelem_flags(pTHX_ AV *av, SSiz sv_2mortal(sv); } +/* +=for apidoc_section $callback +=for apidoc save_helem +=for apidoc_item save_helem_flags + +These each arrange for the value of the hash element (in Perlish terms) +C<$hv{key}]> to be restored at the end of the enclosing I. + +In C, the SV at C**sptr> will be replaced by a new C +scalar. That scalar will inherit any magic from the original C<**sptr>, +and any 'set' magic will be processed. + +In C, C being set in C causes +the function to forgo all that: the scalar at C<**sptr> is untouched. +If C is not set, the SV at C**sptr> will be replaced by a +new C scalar. That scalar will inherit any magic from the original +C<**sptr>. Any 'set' magic will be processed if and only if C +is set in in C. + +=cut +*/ + void Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags) { @@ -914,10 +1050,10 @@ function. =cut */ -I32 -Perl_save_alloc(pTHX_ I32 size, I32 pad) +SSize_t +Perl_save_alloc(pTHX_ SSize_t size, I32 pad) { - const I32 start = pad + ((char*)&PL_savestack[PL_savestack_ix] + const SSize_t start = pad + ((char*)&PL_savestack[PL_savestack_ix] - (char*)PL_savestack); const UV elems = 1 + ((size + pad - 1) / sizeof(*PL_savestack)); const UV elems_shifted = elems << SAVE_TIGHT_SHIFT; @@ -935,65 +1071,6 @@ Perl_save_alloc(pTHX_ I32 size, I32 pad) } -static const U8 arg_counts[] = { - 0, /* SAVEt_ALLOC */ - 0, /* SAVEt_CLEARPADRANGE */ - 0, /* SAVEt_CLEARSV */ - 0, /* SAVEt_REGCONTEXT */ - 1, /* SAVEt_TMPSFLOOR */ - 1, /* SAVEt_BOOL */ - 1, /* SAVEt_COMPILE_WARNINGS */ - 1, /* SAVEt_COMPPAD */ - 1, /* SAVEt_FREECOPHH */ - 1, /* SAVEt_FREEOP */ - 1, /* SAVEt_FREEPV */ - 1, /* SAVEt_FREESV */ - 1, /* SAVEt_I16 */ - 1, /* SAVEt_I32_SMALL */ - 1, /* SAVEt_I8 */ - 1, /* SAVEt_INT_SMALL */ - 1, /* SAVEt_MORTALIZESV */ - 1, /* SAVEt_NSTAB */ - 1, /* SAVEt_OP */ - 1, /* SAVEt_PARSER */ - 1, /* SAVEt_STACK_POS */ - 1, /* SAVEt_READONLY_OFF */ - 1, /* SAVEt_FREEPADNAME */ - 1, /* SAVEt_STRLEN_SMALL */ - 2, /* SAVEt_AV */ - 2, /* SAVEt_DESTRUCTOR */ - 2, /* SAVEt_DESTRUCTOR_X */ - 2, /* SAVEt_GENERIC_PVREF */ - 2, /* SAVEt_GENERIC_SVREF */ - 2, /* SAVEt_GP */ - 2, /* SAVEt_GVSV */ - 2, /* SAVEt_HINTS */ - 2, /* SAVEt_HPTR */ - 2, /* SAVEt_HV */ - 2, /* SAVEt_I32 */ - 2, /* SAVEt_INT */ - 2, /* SAVEt_ITEM */ - 2, /* SAVEt_IV */ - 2, /* SAVEt_LONG */ - 2, /* SAVEt_PPTR */ - 2, /* SAVEt_SAVESWITCHSTACK */ - 2, /* SAVEt_SHARED_PVREF */ - 2, /* SAVEt_SPTR */ - 2, /* SAVEt_STRLEN */ - 2, /* SAVEt_SV */ - 2, /* SAVEt_SVREF */ - 2, /* SAVEt_VPTR */ - 2, /* SAVEt_ADELETE */ - 2, /* SAVEt_APTR */ - 3, /* SAVEt_HELEM */ - 3, /* SAVEt_PADSV_AND_MORTALIZE*/ - 3, /* SAVEt_SET_SVFLAGS */ - 3, /* SAVEt_GVSLOT */ - 3, /* SAVEt_AELEM */ - 3, /* SAVEt_DELETE */ - 3 /* SAVEt_HINTS_HH */ -}; - /* =for apidoc_section $callback @@ -1029,7 +1106,7 @@ Perl_leave_scope(pTHX_ I32 base) ap = &PL_savestack[ix]; uv = ap->any_uv; type = (U8)uv & SAVE_MASK; - argcount = arg_counts[type]; + argcount = leave_scope_arg_counts[type]; PL_savestack_ix = ix - argcount; ap -= argcount; } @@ -1102,6 +1179,7 @@ Perl_leave_scope(pTHX_ I32 base) a0.any_svp = &GvSV(a0.any_gv); goto restore_svp; + case SAVEt_GENERIC_SVREF: /* generic sv */ a0 = ap[0]; a1 = ap[1]; restore_svp: @@ -1114,12 +1192,30 @@ Perl_leave_scope(pTHX_ I32 base) break; } + case SAVEt_RCPV: /* like generic sv, but for struct rcpv */ + { + a0 = ap[0]; a1 = ap[1]; + char *old = *a0.any_pvp; + *a0.any_pvp = a1.any_pv; + (void)rcpv_free(old); + (void)rcpv_free(a1.any_pv); + break; + } + + case SAVEt_FREERCPV: /* like SAVEt_FREEPV but for a RCPV */ + { + a0 = ap[0]; + char *rcpv = a0.any_pv; + (void)rcpv_free(rcpv); + break; + } + case SAVEt_GVSLOT: /* any slot in GV */ { HV * hv; a0 = ap[0]; a1 = ap[1]; a2 = ap[2]; hv = GvSTASH(a0.any_gv); - if (hv && HvENAME(hv) && ( + if (hv && HvHasENAME(hv) && ( (a2.any_sv && SvTYPE(a2.any_sv) == SVt_PVCV) || (*a1.any_svp && SvTYPE(*a1.any_svp) == SVt_PVCV) )) @@ -1231,10 +1327,10 @@ Perl_leave_scope(pTHX_ I32 base) a0 = ap[0]; a1 = ap[1]; /* possibly taking a method out of circulation */ - had_method = !!GvCVu(a0.any_gv); + had_method = cBOOL(GvCVu(a0.any_gv)); gp_free(a0.any_gv); GvGP_set(a0.any_gv, (GP*)a1.any_ptr); - if ((hv=GvSTASH(a0.any_gv)) && HvENAME_get(hv)) { + if ((hv=GvSTASH(a0.any_gv)) && HvHasENAME(hv)) { if (memEQs(GvNAME(a0.any_gv), GvNAMELEN(a0.any_gv), "ISA")) mro_isa_changed_in(hv); else if (had_method || GvCVu(a0.any_gv)) @@ -1317,12 +1413,10 @@ Perl_leave_scope(pTHX_ I32 base) if (SvREADONLY(sv)) SvREADONLY_off(sv); - if (SvOOK(sv)) { /* OOK or HvAUX */ - if (SvTYPE(sv) == SVt_PVHV) - Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv)); - else - sv_backoff(sv); - } + if (SvTYPE(sv) == SVt_PVHV && HvHasAUX(sv)) + Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv)); + else if(SvOOK(sv)) + sv_backoff(sv); if (SvMAGICAL(sv)) { /* note that backrefs (either in HvAUX or magic) @@ -1589,8 +1683,19 @@ Perl_leave_scope(pTHX_ I32 base) break; case SAVEt_COMPILE_WARNINGS: + /* NOTE: we can't put &PL_compiling or PL_curcop on the save + * stack directly, as we currently cannot translate + * them to the correct addresses after a thread start + * or win32 fork start. - Yves + */ a0 = ap[0]; - free_and_set_cop_warnings(&PL_compiling, (STRLEN*) a0.any_ptr); + free_and_set_cop_warnings(&PL_compiling, a0.any_pv); + break; + + case SAVEt_CURCOP_WARNINGS: + /* NOTE: see comment above about SAVEt_COMPILE_WARNINGS */ + a0 = ap[0]; + free_and_set_cop_warnings(PL_curcop, a0.any_pv); break; case SAVEt_PARSER: @@ -1740,6 +1845,145 @@ Perl_cx_dump(pTHX_ PERL_CONTEXT *cx) PERL_UNUSED_ARG(cx); #endif /* DEBUGGING */ } + +/* +=for apidoc_section $callback +=for apidoc mortal_destructor_sv + +This function arranges for either a Perl code reference, or a C function +reference to be called at the B. + +The C argument determines the type of function that will be +called. If it is C it is assumed to be a reference to a CV and +will arrange for the coderef to be called. If it is not SvROK() then it +is assumed to be a C which is C whose value is a pointer +to a C function of type C created using C. +Either way the C parameter will be provided to the callback as a +parameter, although the rules for doing so differ between the Perl and +C mode. Normally this function is only used directly for the Perl case +and the wrapper C is used for the C function case. + +When operating in Perl callback mode the C parameter may be NULL +in which case the code reference is called with no arguments, otherwise +if it is an AV (SvTYPE(args) == SVt_PVAV) then the contents of the AV +will be used as the arguments to the code reference, and if it is any +other type then the C SV will be provided as a single argument to +the code reference. + +When operating in a C callback mode the C parameter will be passed +directly to the C function as a C pointer. No additional +processing of the argument will be peformed, and it is the callers +responsibility to free the C parameter if necessary. + +Be aware that there is a signficant difference in timing between the +I and the I. If you are looking for a mechanism to trigger a function at the +end of the B you should look at +C instead of this function. + +=for apidoc mortal_svfunc_x + +This function arranges for a C function reference to be called at the +B with the arguments provided. It is a +wrapper around C which ensures that the latter +function is called appropriately. + +Be aware that there is a signficant difference in timing between the +I and the I. If you are looking for a mechanism to trigger a function at the +end of the B you should look at +C instead of this function. + +=for apidoc magic_freedestruct + +This function is called via magic to implement the +C and C functions. It +should not be called directly and has no user servicable parts. + +=cut +*/ + +void +Perl_mortal_destructor_sv(pTHX_ SV *coderef, SV *args) { + PERL_ARGS_ASSERT_MORTAL_DESTRUCTOR_SV; + assert( + (SvROK(coderef) && SvTYPE(SvRV(coderef)) == SVt_PVCV) /* perl coderef */ + || + (SvIOK(coderef) && !SvROK(coderef)) /* C function ref */ + ); + SV *variable = newSV_type_mortal(SVt_IV); + (void)sv_magicext(variable, coderef, PERL_MAGIC_destruct, + &PL_vtbl_destruct, (char *)args, args ? HEf_SVKEY : 0); +} + + +void +Perl_mortal_svfunc_x(pTHX_ SVFUNC_t f, SV *sv) { + PERL_ARGS_ASSERT_MORTAL_SVFUNC_X; + SV *sviv = newSViv(PTR2IV(f)); + mortal_destructor_sv(sviv,sv); +} + + +int +Perl_magic_freedestruct(pTHX_ SV* sv, MAGIC* mg) { + PERL_ARGS_ASSERT_MAGIC_FREEDESTRUCT; + dSP; + union { + SV *sv; + AV *av; + char *pv; + } args_any; + SV *coderef; + + IV nargs = 0; + if (PL_phase == PERL_PHASE_DESTRUCT) { + Perl_warn(aTHX_ "Can't call destructor for 0x%p in global destruction\n", sv); + return 1; + } + + args_any.pv = mg->mg_ptr; + coderef = mg->mg_obj; + + /* Deal with C function destructor */ + if (SvTYPE(coderef) == SVt_IV && !SvROK(coderef)) { + SVFUNC_t f = INT2PTR(SVFUNC_t, SvIV(coderef)); + (f)(aTHX_ args_any.sv); + return 0; + } + + if (args_any.sv) { + if (SvTYPE(args_any.sv) == SVt_PVAV) { + nargs = av_len(args_any.av) + 1; + } else { + nargs = 1; + } + } + PUSHSTACKi(PERLSI_MAGIC); + ENTER_with_name("call_freedestruct"); + SAVETMPS; + EXTEND(SP, nargs); + PUSHMARK(SP); + if (args_any.sv) { + if (SvTYPE(args_any.sv) == SVt_PVAV) { + IV n; + for (n = 0 ; n < nargs ; n++ ) { + SV **argp = av_fetch(args_any.av, n, 0); + if (argp && *argp) + PUSHs(*argp); + } + } else { + PUSHs(args_any.sv); + } + } + PUTBACK; + (void)call_sv(coderef, G_VOID | G_EVAL | G_KEEPERR); + FREETMPS; + LEAVE_with_name("call_freedestruct"); + POPSTACK; + return 0; +} + /* * ex: set ts=8 sts=4 sw=4 et: Index: gnu/usr.bin/perl/scope.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/scope.h,v diff -u -p -a -u -p -r1.20 scope.h --- gnu/usr.bin/perl/scope.h 15 Feb 2023 01:36:13 -0000 1.20 +++ gnu/usr.bin/perl/scope.h 21 Feb 2024 15:47:03 -0000 @@ -8,76 +8,7 @@ * */ -/* *** Update arg_counts[] in scope.c if you modify these */ - -/* zero args */ - -#define SAVEt_ALLOC 0 -#define SAVEt_CLEARPADRANGE 1 -#define SAVEt_CLEARSV 2 -#define SAVEt_REGCONTEXT 3 - -/* one arg */ - -#define SAVEt_TMPSFLOOR 4 -#define SAVEt_BOOL 5 -#define SAVEt_COMPILE_WARNINGS 6 -#define SAVEt_COMPPAD 7 -#define SAVEt_FREECOPHH 8 -#define SAVEt_FREEOP 9 -#define SAVEt_FREEPV 10 -#define SAVEt_FREESV 11 -#define SAVEt_I16 12 -#define SAVEt_I32_SMALL 13 -#define SAVEt_I8 14 -#define SAVEt_INT_SMALL 15 -#define SAVEt_MORTALIZESV 16 -#define SAVEt_NSTAB 17 -#define SAVEt_OP 18 -#define SAVEt_PARSER 19 -#define SAVEt_STACK_POS 20 -#define SAVEt_READONLY_OFF 21 -#define SAVEt_FREEPADNAME 22 -#define SAVEt_STRLEN_SMALL 23 - -/* two args */ - -#define SAVEt_AV 24 -#define SAVEt_DESTRUCTOR 25 -#define SAVEt_DESTRUCTOR_X 26 -#define SAVEt_GENERIC_PVREF 27 -#define SAVEt_GENERIC_SVREF 28 -#define SAVEt_GP 29 -#define SAVEt_GVSV 30 -#define SAVEt_HINTS 31 -#define SAVEt_HPTR 32 -#define SAVEt_HV 33 -#define SAVEt_I32 34 -#define SAVEt_INT 35 -#define SAVEt_ITEM 36 -#define SAVEt_IV 37 -#define SAVEt_LONG 38 -#define SAVEt_PPTR 39 -#define SAVEt_SAVESWITCHSTACK 40 -#define SAVEt_SHARED_PVREF 41 -#define SAVEt_SPTR 42 -#define SAVEt_STRLEN 43 -#define SAVEt_SV 44 -#define SAVEt_SVREF 45 -#define SAVEt_VPTR 46 -#define SAVEt_ADELETE 47 -#define SAVEt_APTR 48 - -/* three args */ - -#define SAVEt_HELEM 49 -#define SAVEt_PADSV_AND_MORTALIZE 50 -#define SAVEt_SET_SVFLAGS 51 -#define SAVEt_GVSLOT 52 -#define SAVEt_AELEM 53 -#define SAVEt_DELETE 54 -#define SAVEt_HINTS_HH 55 - +#include "scope_types.h" #define SAVEf_SETMAGIC 1 #define SAVEf_KEEPOLDELEM 2 @@ -96,8 +27,8 @@ * macros */ #define SS_MAXPUSH 4 -#define SSCHECK(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) > PL_savestack_max)) savestack_grow() #define SSGROW(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) > PL_savestack_max)) savestack_grow_cnt(need) +#define SSCHECK(need) SSGROW(need) /* legacy */ #define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i)) #define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i)) #define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p)) @@ -116,7 +47,7 @@ * like save_pushptrptr() to half its former size. * Of course, doing the size check *after* pushing means we must always * ensure there are SS_MAXPUSH free slots on the savestack. This is ensured by - * savestack_grow() and savestack_grow_cnt always allocating SS_MAXPUSH slots + * savestack_grow_cnt always allocating SS_MAXPUSH slots * more than asked for, or that it sets PL_savestack_max to * * These are for internal core use only and are subject to change */ @@ -130,7 +61,7 @@ ix += (need); \ PL_savestack_ix = ix; \ assert(ix <= PL_savestack_max + SS_MAXPUSH); \ - if (UNLIKELY(ix > PL_savestack_max)) savestack_grow(); \ + if (UNLIKELY(ix > PL_savestack_max)) savestack_grow_cnt(ix - PL_savestack_max); \ assert(PL_savestack_ix <= PL_savestack_max); #define SS_ADD_INT(i) ((ssp++)->any_i32 = (I32)(i)) @@ -155,26 +86,26 @@ /* =for apidoc_section $callback -=for apidoc Amns||SAVETMPS +=for apidoc Amn;||SAVETMPS Opening bracket for temporaries on a callback. See C> and L. -=for apidoc Amns||FREETMPS +=for apidoc Amn;||FREETMPS Closing bracket for temporaries on a callback. See C> and L. -=for apidoc Amns||ENTER +=for apidoc Amn;||ENTER Opening bracket on a callback. See C> and L. -=for apidoc Amns||LEAVE +=for apidoc Amn;||LEAVE Closing bracket on a callback. See C> and L. -=for apidoc Ams||ENTER_with_name|"name" +=for apidoc Am;||ENTER_with_name|"name" Same as C>, but when debugging is enabled it also associates the given literal string with the new scope. -=for apidoc Ams||LEAVE_with_name|"name" +=for apidoc Am;||LEAVE_with_name|"name" Same as C>, but when debugging is enabled it first checks that the scope has the given name. C must be a literal string. @@ -246,6 +177,8 @@ scope has the given name. C must b #define SAVECLEARSV(sv) save_clearsv((SV**)&(sv)) #define SAVEGENERICSV(s) save_generic_svref((SV**)&(s)) #define SAVEGENERICPV(s) save_generic_pvref((char**)&(s)) +#define SAVERCPV(s) save_rcpv((char**)&(s)) +#define SAVEFREERCPV(s) save_freercpv(s) #define SAVESHAREDPV(s) save_shared_pvref((char**)&(s)) #define SAVESETSVFLAGS(sv,mask,val) save_set_svflags(sv,mask,val) #define SAVEFREECOPHH(h) save_pushptr((void *)(h), SAVEt_FREECOPHH) @@ -262,6 +195,12 @@ scope has the given name. C must b #define SAVEDESTRUCTOR_X(f,p) \ save_destructor_x((DESTRUCTORFUNC_t)(f), (void*)(p)) +#define MORTALSVFUNC_X(f,sv) \ + mortal_svfunc_x((SVFUNC_t)(f), sv) + +#define MORTALDESTRUCTOR_SV(coderef,args) \ + mortal_destructor_sv(coderef,args) + #define SAVESTACK_POS() \ STMT_START { \ dSS_ADD; \ @@ -283,19 +222,28 @@ scope has the given name. C must b PL_curstackinfo->si_stack = (t); \ } STMT_END -/* Need to do the cop warnings like this, rather than a "SAVEFREESHAREDPV", - because realloc() means that the value can actually change. Possibly - could have done savefreesharedpvREF, but this way actually seems cleaner, - as it simplifies the code that does the saves, and reduces the load on the - save stack. */ +/* Note these are special, we can't just use a save_pushptrptr() on them + * as the target might change after a fork or thread start. */ #define SAVECOMPILEWARNINGS() save_pushptr(PL_compiling.cop_warnings, SAVEt_COMPILE_WARNINGS) +#define SAVECURCOPWARNINGS() save_pushptr(PL_curcop->cop_warnings, SAVEt_CURCOP_WARNINGS) + #define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER) #ifdef USE_ITHREADS # define SAVECOPSTASH_FREE(c) SAVEIV((c)->cop_stashoff) -# define SAVECOPFILE(c) SAVEPPTR(CopFILE(c)) -# define SAVECOPFILE_FREE(c) SAVESHAREDPV(CopFILE(c)) +# define SAVECOPFILE_x(c) SAVEPPTR((c)->cop_file) +# define SAVECOPFILE(c) \ + STMT_START { \ + SAVECOPFILE_x(c); \ + CopFILE_debug((c),"SAVECOPFILE",0); \ + } STMT_END +# define SAVECOPFILE_FREE_x(c) SAVERCPV((c)->cop_file) +# define SAVECOPFILE_FREE(c) \ + STMT_START { \ + SAVECOPFILE_FREE_x(c); \ + CopFILE_debug((c),"SAVECOPFILE_FREE",0); \ + } STMT_END #else # /* XXX not refcounted */ # define SAVECOPSTASH_FREE(c) SAVESPTR(CopSTASH(c)) @@ -307,12 +255,12 @@ scope has the given name. C must b /* =for apidoc_section $stack -=for apidoc Am|I32|SSNEW |Size_t size -=for apidoc_item | |SSNEWa |Size_t_size|Size_t align -=for apidoc_item | |SSNEWt |Size_t size|type -=for apidoc_item | |SSNEWat|Size_t_size|type|Size_t align +=for apidoc Am|SSize_t|SSNEW |Size_t size +=for apidoc_item | |SSNEWa |Size_t_size|Size_t align +=for apidoc_item | |SSNEWat|Size_t_size|type|Size_t align +=for apidoc_item | |SSNEWt |Size_t size|type -These temporarily allocates data on the savestack, returning an I32 index into +These temporarily allocates data on the savestack, returning an SSize_t index into the savestack, because a pointer would get broken if the savestack is moved on reallocation. Use L> to convert the returned index into a pointer. @@ -325,8 +273,8 @@ L>. The alignment wi reallocation B if realloc returns data aligned to a size divisible by "align"! -=for apidoc Am|type |SSPTR |I32 index|type -=for apidoc_item|type *|SSPTRt|I32 index|type +=for apidoc Am|type |SSPTR |SSize_t index|type +=for apidoc_item|type *|SSPTRt|SSize_t index|type These convert the C returned by L/> and kin into actual pointers. @@ -342,8 +290,8 @@ casts it to a pointer of that C. (I32)(align - ((size_t)((caddr_t)&PL_savestack[PL_savestack_ix]) % align)) % align) #define SSNEWat(n,t,align) SSNEWa((n)*sizeof(t), align) -#define SSPTR(off,type) ((type) ((char*)PL_savestack + off)) -#define SSPTRt(off,type) ((type*) ((char*)PL_savestack + off)) +#define SSPTR(off,type) (assert(sizeof(off) >= sizeof(SSize_t)), (type) ((char*)PL_savestack + off)) +#define SSPTRt(off,type) (assert(sizeof(off) >= sizeof(SSize_t)), (type*) ((char*)PL_savestack + off)) #define save_freesv(op) save_pushptr((void *)(op), SAVEt_FREESV) #define save_mortalizesv(op) save_pushptr((void *)(op), SAVEt_MORTALIZESV) Index: gnu/usr.bin/perl/scope_types.h =================================================================== RCS file: gnu/usr.bin/perl/scope_types.h diff -N gnu/usr.bin/perl/scope_types.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/scope_types.h 21 Feb 2024 15:47:03 -0000 @@ -0,0 +1,151 @@ +/* -*- mode: C; buffer-read-only: t -*- + + Copyright (C) 2022 by Larry Wall and others + + You may distribute under the terms of either the GNU General Public + License or the Artistic License, as specified in the README file. + + !!!!!!! DO NOT EDIT THIS FILE !!!!!!! + This file is built by regen/scope_types.pl. + Any changes made here will be lost! + The defines and contents of the leave_scope_arg_counts[] array + must match. To add a new type modify the __DATA__ section in + regen/scope_types.pl and run `make regen` to rebuild the file. + */ + +/* zero args */ + +#define SAVEt_ALLOC 0 +#define SAVEt_CLEARPADRANGE 1 +#define SAVEt_CLEARSV 2 +#define SAVEt_REGCONTEXT 3 + +/* one arg */ + +#define SAVEt_TMPSFLOOR 4 +#define SAVEt_BOOL 5 +#define SAVEt_COMPILE_WARNINGS 6 +#define SAVEt_CURCOP_WARNINGS 7 +#define SAVEt_COMPPAD 8 +#define SAVEt_FREECOPHH 9 +#define SAVEt_FREEOP 10 +#define SAVEt_FREEPV 11 +#define SAVEt_FREESV 12 +#define SAVEt_I16 13 +#define SAVEt_I32_SMALL 14 +#define SAVEt_I8 15 +#define SAVEt_INT_SMALL 16 +#define SAVEt_MORTALIZESV 17 +#define SAVEt_NSTAB 18 +#define SAVEt_OP 19 +#define SAVEt_PARSER 20 +#define SAVEt_STACK_POS 21 +#define SAVEt_READONLY_OFF 22 +#define SAVEt_FREEPADNAME 23 +#define SAVEt_STRLEN_SMALL 24 +#define SAVEt_FREERCPV 25 + +/* two args */ + +#define SAVEt_AV 26 +#define SAVEt_DESTRUCTOR 27 +#define SAVEt_DESTRUCTOR_X 28 +#define SAVEt_GENERIC_PVREF 29 +#define SAVEt_GENERIC_SVREF 30 +#define SAVEt_GP 31 +#define SAVEt_GVSV 32 +#define SAVEt_HINTS 33 +#define SAVEt_HPTR 34 +#define SAVEt_HV 35 +#define SAVEt_I32 36 +#define SAVEt_INT 37 +#define SAVEt_ITEM 38 +#define SAVEt_IV 39 +#define SAVEt_LONG 40 +#define SAVEt_PPTR 41 +#define SAVEt_SAVESWITCHSTACK 42 +#define SAVEt_SHARED_PVREF 43 +#define SAVEt_SPTR 44 +#define SAVEt_STRLEN 45 +#define SAVEt_SV 46 +#define SAVEt_SVREF 47 +#define SAVEt_VPTR 48 +#define SAVEt_ADELETE 49 +#define SAVEt_APTR 50 +#define SAVEt_RCPV 51 + +/* three args */ + +#define SAVEt_HELEM 52 +#define SAVEt_PADSV_AND_MORTALIZE 53 +#define SAVEt_SET_SVFLAGS 54 +#define SAVEt_GVSLOT 55 +#define SAVEt_AELEM 56 +#define SAVEt_DELETE 57 +#define SAVEt_HINTS_HH 58 + +static const U8 leave_scope_arg_counts[] = { + 0, /* SAVEt_ALLOC */ + 0, /* SAVEt_CLEARPADRANGE */ + 0, /* SAVEt_CLEARSV */ + 0, /* SAVEt_REGCONTEXT */ + 1, /* SAVEt_TMPSFLOOR */ + 1, /* SAVEt_BOOL */ + 1, /* SAVEt_COMPILE_WARNINGS */ + 1, /* SAVEt_CURCOP_WARNINGS */ + 1, /* SAVEt_COMPPAD */ + 1, /* SAVEt_FREECOPHH */ + 1, /* SAVEt_FREEOP */ + 1, /* SAVEt_FREEPV */ + 1, /* SAVEt_FREESV */ + 1, /* SAVEt_I16 */ + 1, /* SAVEt_I32_SMALL */ + 1, /* SAVEt_I8 */ + 1, /* SAVEt_INT_SMALL */ + 1, /* SAVEt_MORTALIZESV */ + 1, /* SAVEt_NSTAB */ + 1, /* SAVEt_OP */ + 1, /* SAVEt_PARSER */ + 1, /* SAVEt_STACK_POS */ + 1, /* SAVEt_READONLY_OFF */ + 1, /* SAVEt_FREEPADNAME */ + 1, /* SAVEt_STRLEN_SMALL */ + 1, /* SAVEt_FREERCPV */ + 2, /* SAVEt_AV */ + 2, /* SAVEt_DESTRUCTOR */ + 2, /* SAVEt_DESTRUCTOR_X */ + 2, /* SAVEt_GENERIC_PVREF */ + 2, /* SAVEt_GENERIC_SVREF */ + 2, /* SAVEt_GP */ + 2, /* SAVEt_GVSV */ + 2, /* SAVEt_HINTS */ + 2, /* SAVEt_HPTR */ + 2, /* SAVEt_HV */ + 2, /* SAVEt_I32 */ + 2, /* SAVEt_INT */ + 2, /* SAVEt_ITEM */ + 2, /* SAVEt_IV */ + 2, /* SAVEt_LONG */ + 2, /* SAVEt_PPTR */ + 2, /* SAVEt_SAVESWITCHSTACK */ + 2, /* SAVEt_SHARED_PVREF */ + 2, /* SAVEt_SPTR */ + 2, /* SAVEt_STRLEN */ + 2, /* SAVEt_SV */ + 2, /* SAVEt_SVREF */ + 2, /* SAVEt_VPTR */ + 2, /* SAVEt_ADELETE */ + 2, /* SAVEt_APTR */ + 2, /* SAVEt_RCPV */ + 3, /* SAVEt_HELEM */ + 3, /* SAVEt_PADSV_AND_MORTALIZE */ + 3, /* SAVEt_SET_SVFLAGS */ + 3, /* SAVEt_GVSLOT */ + 3, /* SAVEt_AELEM */ + 3, /* SAVEt_DELETE */ + 3 /* SAVEt_HINTS_HH */ +}; + +#define MAX_SAVEt 58 + +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/shlib_version =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/shlib_version,v diff -u -p -a -u -p -r1.26 shlib_version --- gnu/usr.bin/perl/shlib_version 15 Feb 2023 01:38:21 -0000 1.26 +++ gnu/usr.bin/perl/shlib_version 21 Feb 2024 15:47:03 -0000 @@ -1,2 +1,2 @@ -major=23 +major=24 minor=0 Index: gnu/usr.bin/perl/sv.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/sv.c,v diff -u -p -a -u -p -r1.32 sv.c --- gnu/usr.bin/perl/sv.c 8 Jul 2023 14:18:35 -0000 1.32 +++ gnu/usr.bin/perl/sv.c 21 Feb 2024 15:47:03 -0000 @@ -231,7 +231,10 @@ Public API: #ifdef DEBUG_LEAKING_SCALARS # define FREE_SV_DEBUG_FILE(sv) STMT_START { \ - if ((sv)->sv_debug_file) PerlMemShared_free((sv)->sv_debug_file); \ + if ((sv)->sv_debug_file) { \ + PerlMemShared_free((sv)->sv_debug_file); \ + sv->sv_debug_file = NULL; \ + } \ } STMT_END # define DEBUG_SV_SERIAL(sv) \ DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) del_SV\n", \ @@ -384,7 +387,7 @@ S_visit(pTHX_ SVFUNC_t f, const U32 flag const SV * const svend = &sva[SvREFCNT(sva)]; SV* sv; for (sv = sva + 1; sv < svend; ++sv) { - if (SvTYPE(sv) != (svtype)SVTYPEMASK + if (!SvIS_FREED(sv) && (sv->sv_flags & mask) == flags && SvREFCNT(sv)) { @@ -403,7 +406,7 @@ S_visit(pTHX_ SVFUNC_t f, const U32 flag static void do_report_used(pTHX_ SV *const sv) { - if (SvTYPE(sv) != (svtype)SVTYPEMASK) { + if (!SvIS_FREED(sv)) { PerlIO_printf(Perl_debug_log, "****\n"); sv_dump(sv); } @@ -685,7 +688,7 @@ Perl_sv_free_arenas(pTHX) /* Historically, here were mid-level routines that manage the allocation of bodies out of the various arenas. Some of these - routines and related definitions remain here, but otherse were + routines and related definitions remain here, but others were moved into sv_inline.h to facilitate inlining of newSV_type(). There are 4 kinds of arenas: @@ -698,7 +701,7 @@ Perl_sv_free_arenas(pTHX) Arena types 2 & 3 are chained by body-type off an array of arena-root pointers, which is indexed by svtype. Some of the larger/less used body types are malloced singly, since a large - unused block of them is wasteful. Also, several svtypes dont have + unused block of them is wasteful. Also, several svtypes don't have bodies; the data fits into the sv-head itself. The arena-root pointer thus has a few unused root-pointers (which may be hijacked later for arena type 4) @@ -1041,6 +1044,7 @@ Perl_sv_upgrade(pTHX_ SV *const sv, svty return; case SVt_PVHV: case SVt_PVAV: + case SVt_PVOBJ: assert(new_type_details->body_size); #ifndef PURIFY @@ -1056,26 +1060,50 @@ Perl_sv_upgrade(pTHX_ SV *const sv, svty new_body = new_NOARENAZ(new_type_details); #endif SvANY(sv) = new_body; - if (new_type == SVt_PVAV) { - *((XPVAV*) SvANY(sv)) = (XPVAV) { - .xmg_stash = NULL, .xmg_u = {.xmg_magic = NULL}, - .xav_fill = -1, .xav_max = -1, .xav_alloc = 0 + switch(new_type) { + case SVt_PVAV: + { + XPVAV pvav = { + .xmg_stash = NULL, + .xmg_u = {.xmg_magic = NULL}, + .xav_fill = -1, .xav_max = -1, .xav_alloc = 0 }; + *((XPVAV*) SvANY(sv)) = pvav; + } AvREAL_only(sv); - } else { - *((XPVHV*) SvANY(sv)) = (XPVHV) { - .xmg_stash = NULL, .xmg_u = {.xmg_magic = NULL}, - .xhv_keys = 0, - /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */ - .xhv_max = PERL_HASH_DEFAULT_HvMAX + break; + case SVt_PVHV: + { + XPVHV pvhv = { + .xmg_stash = NULL, + .xmg_u = {.xmg_magic = NULL}, + .xhv_keys = 0, + /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */ + .xhv_max = PERL_HASH_DEFAULT_HvMAX }; + *((XPVHV*) SvANY(sv)) = pvhv; + } assert(!SvOK(sv)); SvOK_off(sv); #ifndef NODEFAULT_SHAREKEYS HvSHAREKEYS_on(sv); /* key-sharing on by default */ #endif + break; + case SVt_PVOBJ: + { + XPVOBJ pvo = { + .xmg_stash = NULL, .xmg_u = {.xmg_magic = NULL}, + .xobject_maxfield = -1, + .xobject_iter_sv_at = 0, + .xobject_fields = NULL, + }; + *((XPVOBJ*) SvANY(sv)) = pvo; + } + break; + default: + NOT_REACHED; } /* SVt_NULL isn't the only thing upgraded to AV or HV. @@ -1206,7 +1234,7 @@ Perl_hv_auxalloc(pTHX_ HV *hv) { PERL_ARGS_ASSERT_HV_AUXALLOC; assert(SvTYPE(hv) == SVt_PVHV); - assert(!SvOOK(hv)); + assert(!HvHasAUX(hv)); #ifdef PURIFY new_body = new_NOARENAZ(&fake_hv_with_aux); @@ -1230,7 +1258,7 @@ Perl_hv_auxalloc(pTHX_ HV *hv) { #endif SvANY(hv) = (XPVHV *) new_body; - SvOOK_on(hv); + SvFLAGS(hv) |= SVphv_HasAUX; return HvAUX(hv); } @@ -1328,7 +1356,7 @@ Perl_sv_grow(pTHX_ SV *const sv, STRLEN if (newlen > SvLEN(sv)) { /* need more room? */ STRLEN minlen = SvCUR(sv); - minlen += (minlen >> PERL_STRLEN_EXPAND_SHIFT) + 10; + minlen += (minlen >> PERL_STRLEN_EXPAND_SHIFT) + PERL_STRLEN_NEW_MIN; if (newlen < minlen) newlen = minlen; #ifndef PERL_UNWARANTED_CHUMMINESS_WITH_MALLOC @@ -1402,10 +1430,8 @@ Perl_sv_grow_fresh(pTHX_ SV *const sv, S newlen++; #endif - /* 10 is a longstanding, hardcoded minimum length in sv_grow. */ - /* Just doing the same here for consistency. */ - if (newlen < 10) - newlen = 10; + if (newlen < PERL_STRLEN_NEW_MIN) + newlen = PERL_STRLEN_NEW_MIN; s = (char*)safemalloc(newlen); SvPV_set(sv, s); @@ -1435,10 +1461,23 @@ Perl_sv_setiv(pTHX_ SV *const sv, const SV_CHECK_THINKFIRST_COW_DROP(sv); switch (SvTYPE(sv)) { +#if NVSIZE <= IVSIZE + case SVt_NULL: + case SVt_NV: + SET_SVANY_FOR_BODYLESS_IV(sv); + SvFLAGS(sv) &= ~SVTYPEMASK; + SvFLAGS(sv) |= SVt_IV; + break; +#else case SVt_NULL: + SET_SVANY_FOR_BODYLESS_IV(sv); + SvFLAGS(sv) &= ~SVTYPEMASK; + SvFLAGS(sv) |= SVt_IV; + break; case SVt_NV: sv_upgrade(sv, SVt_IV); break; +#endif case SVt_PV: sv_upgrade(sv, SVt_PVIV); break; @@ -1541,8 +1580,15 @@ Perl_sv_setnv(pTHX_ SV *const sv, const switch (SvTYPE(sv)) { case SVt_NULL: case SVt_IV: +#if NVSIZE <= IVSIZE + SET_SVANY_FOR_BODYLESS_NV(sv); + SvFLAGS(sv) &= ~SVTYPEMASK; + SvFLAGS(sv) |= SVt_NV; + break; +#else sv_upgrade(sv, SVt_NV); break; +#endif case SVt_PV: case SVt_PVIV: sv_upgrade(sv, SVt_PVNV); @@ -2180,19 +2226,19 @@ S_sv_2iuv_common(pTHX_ SV *const sv) assert (SvIOKp(sv)); } else { if (((UV)1 << NV_PRESERVES_UV_BITS) > - U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) { + U_V(Perl_fabs(SvNVX(sv)))) { /* Small enough to preserve all bits. */ (void)SvIOKp_on(sv); SvNOK_on(sv); SvIV_set(sv, I_V(SvNVX(sv))); if ((NV)(SvIVX(sv)) == SvNVX(sv)) SvIOK_on(sv); - /* Assumption: first non-preserved integer is < IV_MAX, - this NV is in the preserved range, therefore: */ - if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv)) - < (UV)IV_MAX)) { - Perl_croak(aTHX_ "sv_2iv assumed (U_V(fabs((double)SvNVX(sv))) < (UV)IV_MAX) but SvNVX(sv)=%" NVgf " U_V is 0x%" UVxf ", IV_MAX is 0x%" UVxf "\n", SvNVX(sv), U_V(SvNVX(sv)), (UV)IV_MAX); - } + /* There had been runtime checking for + "U_V(Perl_fabs(SvNVX(sv))) < (UV)IV_MAX" here to ensure + that this NV is in the preserved range, but this should + be always true if the following assertion is true: */ + STATIC_ASSERT_STMT(((UV)1 << NV_PRESERVES_UV_BITS) <= + (UV)IV_MAX); } else { /* IN_UV NOT_INT 0 0 already failed to read UV. @@ -2542,8 +2588,7 @@ Perl_sv_2nv_flags(pTHX_ SV *const sv, co /* if that shift count is out of range then Configure's test is wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS == UV_BITS */ - if (((UV)1 << NV_PRESERVES_UV_BITS) > - U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) { + if (((UV)1 << NV_PRESERVES_UV_BITS) > U_V(Perl_fabs(SvNVX(sv)))) { SvNOK_on(sv); /* Definitely small enough to preserve all bits */ } else if (!(numtype & IS_NUMBER_IN_UV)) { /* Can't use strtol etc to convert this string, so don't try. @@ -2813,21 +2858,28 @@ char * Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const U32 flags) { char *s; + bool done_gmagic = FALSE; PERL_ARGS_ASSERT_SV_2PV_FLAGS; assert (SvTYPE(sv) != SVt_PVAV && SvTYPE(sv) != SVt_PVHV && SvTYPE(sv) != SVt_PVFM); - if (SvGMAGICAL(sv) && (flags & SV_GMAGIC)) + if (SvGMAGICAL(sv) && (flags & SV_GMAGIC)) { mg_get(sv); + done_gmagic = TRUE; + } + if (SvROK(sv)) { if (SvAMAGIC(sv)) { SV *tmpstr; + SV *nsv= (SV *)sv; if (flags & SV_SKIP_OVERLOAD) return NULL; - tmpstr = AMG_CALLunary(sv, string_amg); + if (done_gmagic) + nsv = sv_mortalcopy_flags(sv,0); + tmpstr = AMG_CALLunary(nsv, string_amg); TAINT_IF(tmpstr && SvTAINTED(tmpstr)); - if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) { + if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(nsv)))) { /* Unwrap this: */ /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr); */ @@ -3039,7 +3091,7 @@ Perl_sv_2pv_flags(pTHX_ SV *const sv, ST DECLARATION_FOR_LC_NUMERIC_MANIPULATION; STORE_LC_NUMERIC_SET_TO_NEEDED(); - local_radix = _NOT_IN_NUMERIC_STANDARD; + local_radix = NOT_IN_NUMERIC_STANDARD_; if (local_radix && SvCUR(PL_numeric_radix_sv) > 1) { size += SvCUR(PL_numeric_radix_sv) - 1; s = SvGROW_mutable(sv, size); @@ -3114,8 +3166,8 @@ Perl_sv_2pv_flags(pTHX_ SV *const sv, ST /* =for apidoc sv_copypv -=for apidoc_item sv_copypv_nomg =for apidoc_item sv_copypv_flags +=for apidoc_item sv_copypv_nomg These copy a stringified representation of the source SV into the destination SV. They automatically perform coercion of numeric values into @@ -3292,9 +3344,9 @@ Perl_sv_2bool_flags(pTHX_ SV *sv, I32 fl /* =for apidoc sv_utf8_upgrade -=for apidoc_item sv_utf8_upgrade_nomg =for apidoc_item sv_utf8_upgrade_flags =for apidoc_item sv_utf8_upgrade_flags_grow +=for apidoc_item sv_utf8_upgrade_nomg These convert the PV of an SV to its UTF-8-encoded form. The SV is forced to string form if it is not already. @@ -3709,7 +3761,7 @@ S_glob_assign_glob(pTHX_ SV *const dsv, /* If source has a real method, then a method is going to change */ else if( - GvCV((const GV *)ssv) && GvSTASH(dsv) && HvENAME(GvSTASH(dsv)) + GvCV((const GV *)ssv) && GvSTASH(dsv) && HvHasENAME(GvSTASH(dsv)) ) { mro_changes = 1; } @@ -3718,7 +3770,7 @@ S_glob_assign_glob(pTHX_ SV *const dsv, /* If dest already had a real method, that's a change as well */ if( !mro_changes && GvGP(MUTABLE_GV(dsv)) && GvCVu((const GV *)dsv) - && GvSTASH(dsv) && HvENAME(GvSTASH(dsv)) + && GvSTASH(dsv) && HvHasENAME(GvSTASH(dsv)) ) { mro_changes = 1; } @@ -3731,7 +3783,7 @@ S_glob_assign_glob(pTHX_ SV *const dsv, if(memEQs(name, len, "ISA") /* The stash may have been detached from the symbol table, so check its name. */ - && GvSTASH(dsv) && HvENAME(GvSTASH(dsv)) + && GvSTASH(dsv) && HvHasENAME(GvSTASH(dsv)) ) mro_changes = 2; else { @@ -3775,11 +3827,13 @@ S_glob_assign_glob(pTHX_ SV *const dsv, SV * const sref = (SV *)GvAV((const GV *)dsv); if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) { if (SvTYPE(mg->mg_obj) != SVt_PVAV) { - AV * const ary = newAV(); - av_push(ary, mg->mg_obj); /* takes the refcount */ + AV * const ary = newAV_alloc_x(2); + av_push_simple(ary, mg->mg_obj); /* takes the refcount */ + av_push_simple(ary, SvREFCNT_inc_simple_NN(dsv)); mg->mg_obj = (SV *)ary; + } else { + av_push((AV *)mg->mg_obj, SvREFCNT_inc_simple_NN(dsv)); } - av_push((AV *)mg->mg_obj, SvREFCNT_inc_simple_NN(dsv)); } else sv_magic(sref, dsv, PERL_MAGIC_isa, NULL, 0); } @@ -3787,7 +3841,7 @@ S_glob_assign_glob(pTHX_ SV *const dsv, } else if(mro_changes == 3) { HV * const stash = GvHV(dsv); - if(old_stash ? (HV *)HvENAME_get(old_stash) : stash) + if(old_stash ? HvHasENAME(old_stash) : cBOOL(stash)) mro_package_moved( stash, old_stash, (GV *)dsv, 0 @@ -3887,7 +3941,7 @@ Perl_gv_setref(pTHX_ SV *const dsv, SV * { SV * const new_const_sv = CvCONST((const CV *)sref) - ? cv_const_sv((const CV *)sref) + ? cv_const_sv_or_av((const CV *)sref) : NULL; HV * const stash = GvSTASH((const GV *)dsv); report_redefined_cv( @@ -3937,7 +3991,7 @@ Perl_gv_setref(pTHX_ SV *const dsv, SV * (len > 1 && name[len-2] == ':' && name[len-1] == ':') || (len == 1 && name[0] == ':') ) - && (!dref || HvENAME_get(dref)) + && (!dref || HvHasENAME(dref)) ) { mro_package_moved( (HV *)sref, (HV *)dref, @@ -3950,7 +4004,7 @@ Perl_gv_setref(pTHX_ SV *const dsv, SV * && memEQs(GvNAME((GV*)dsv), GvNAMELEN((GV*)dsv), "ISA") /* The stash may have been detached from the symbol table, so check its name before doing anything. */ - && GvSTASH(dsv) && HvENAME(GvSTASH(dsv)) + && GvSTASH(dsv) && HvHasENAME(GvSTASH(dsv)) ) { MAGIC *mg; MAGIC * const omg = dref && SvSMAGICAL(dref) @@ -3958,8 +4012,8 @@ Perl_gv_setref(pTHX_ SV *const dsv, SV * : NULL; if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) { if (SvTYPE(mg->mg_obj) != SVt_PVAV) { - AV * const ary = newAV(); - av_push(ary, mg->mg_obj); /* takes the refcount */ + AV * const ary = newAV_alloc_xz(4); + av_push_simple(ary, mg->mg_obj); /* takes the refcount */ mg->mg_obj = (SV *)ary; } if (omg) { @@ -4089,9 +4143,14 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* s * freed) just by testing the or'ed types */ STATIC_ASSERT_STMT(SVt_NULL == 0); STATIC_ASSERT_STMT(SVt_IV == 1); + STATIC_ASSERT_STMT(SVt_NV == 2); +#if NVSIZE <= IVSIZE + if (both_type <= 2) { +#else if (both_type <= 1) { - /* both src and dst are UNDEF/IV/RV, so we can do a lot of - * special-casing */ +#endif + /* both src and dst are UNDEF/IV/RV - maybe NV depending on config, + * so we can do a lot of special-casing */ U32 sflags; U32 new_dflags; SV *old_rv = NULL; @@ -4104,6 +4163,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* s sv_unref_flags(dsv, 0); else old_rv = SvRV(dsv); + SvROK_off(dsv); } assert(!SvGMAGICAL(ssv)); @@ -4130,12 +4190,33 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* s new_dflags |= (SVf_IOK|SVp_IOK|(sflags & SVf_IVisUV)); } } +#if NVSIZE <= IVSIZE + else if (sflags & SVf_NOK) { + SET_SVANY_FOR_BODYLESS_NV(dsv); + new_dflags = (SVt_NV|SVf_NOK|SVp_NOK); + + /* both src and dst are <= SVt_MV, so sv_any points to the + * head; so access the head directly + */ + assert( &(ssv->sv_u.svu_nv) + == &(((XPVNV*) SvANY(ssv))->xnv_u.xnv_nv)); + assert( &(dsv->sv_u.svu_nv) + == &(((XPVNV*) SvANY(dsv))->xnv_u.xnv_nv)); + dsv->sv_u.svu_nv = ssv->sv_u.svu_nv; + } +#endif else { new_dflags = dtype; /* turn off everything except the type */ } - SvFLAGS(dsv) = new_dflags; - SvREFCNT_dec(old_rv); + /* Should preserve some dsv flags - at least SVs_TEMP, */ + /* so cannot just set SvFLAGS(dsv) = new_dflags */ + /* First clear the flags that we do want to clobber */ + (void)SvOK_off(dsv); + SvFLAGS(dsv) &= ~SVTYPEMASK; + /* Now set the new flags */ + SvFLAGS(dsv) |= new_dflags; + SvREFCNT_dec(old_rv); return; } @@ -4155,7 +4236,9 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* s SV_CHECK_THINKFIRST_COW_DROP(dsv); dtype = SvTYPE(dsv); /* THINKFIRST may have changed type */ - /* There's a lot of redundancy below but we're going for speed here */ + /* There's a lot of redundancy below but we're going for speed here + * Note: some of the cases below do return; rather than break; so the + * if-elseif-else logic below this switch does not see all cases. */ switch (stype) { case SVt_NULL: @@ -4243,7 +4326,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* s case SVt_INVLIST: invlist_clone(ssv, dsv); - break; + return; default: { const char * const type = sv_reftype(ssv,0); @@ -4382,7 +4465,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* s if (reset_isa) { HV * const stash = GvHV(dsv); if( - old_stash ? (HV *)HvENAME_get(old_stash) : stash + old_stash ? HvHasENAME(old_stash) : cBOOL(stash) ) mro_package_moved( stash, old_stash, @@ -4429,11 +4512,11 @@ Perl_sv_setsv_flags(pTHX_ SV *dsv, SV* s * be allocated it is still not worth swiping PADTMPs for short * strings, as the savings here are small. * - * If swiping is not an option, then we see whether it is - * worth using copy-on-write. If the lhs already has a buf- - * fer big enough and the string is short, we skip it and fall back - * to method 3, since memcpy is faster for short strings than the - * later bookkeeping overhead that copy-on-write entails. + * If swiping is not an option, then we see whether it is worth using + * copy-on-write. If the lhs already has a buffer big enough and the + * string is short, we skip it and fall back to method 3, since memcpy + * is faster for short strings than the later bookkeeping overhead that + * copy-on-write entails. * If the rhs is not a copy-on-write string yet, then we also * consider whether the buffer is too large relative to the string @@ -4682,6 +4765,67 @@ Perl_sv_set_undef(pTHX_ SV *sv) SvOK_off(sv); } +/* +=for apidoc sv_set_true + +Equivalent to C, but may be made more +efficient in the future. Doesn't handle set magic. + +The perl equivalent is C<$sv = !0;>. + +Introduced in perl 5.35.11. + +=cut +*/ + +void +Perl_sv_set_true(pTHX_ SV *sv) +{ + PERL_ARGS_ASSERT_SV_SET_TRUE; + sv_setsv(sv, &PL_sv_yes); +} + +/* +=for apidoc sv_set_false + +Equivalent to C, but may be made more +efficient in the future. Doesn't handle set magic. + +The perl equivalent is C<$sv = !1;>. + +Introduced in perl 5.35.11. + +=cut +*/ + +void +Perl_sv_set_false(pTHX_ SV *sv) +{ + PERL_ARGS_ASSERT_SV_SET_FALSE; + sv_setsv(sv, &PL_sv_no); +} + +/* +=for apidoc sv_set_bool + +Equivalent to C, but +may be made more efficient in the future. Doesn't handle set magic. + +The perl equivalent is C<$sv = !!$expr;>. + +Introduced in perl 5.35.11. + +=cut +*/ + +void +Perl_sv_set_bool(pTHX_ SV *sv, const bool bool_val) +{ + PERL_ARGS_ASSERT_SV_SET_BOOL; + sv_setsv(sv, bool_val ? &PL_sv_yes : &PL_sv_no); +} + + void Perl_sv_setsv_mg(pTHX_ SV *const dsv, SV *const ssv) { @@ -4719,10 +4863,10 @@ Perl_sv_setsv_cow(pTHX_ SV *dsv, SV *ssv sv_force_normal_flags(dsv, SV_COW_DROP_PV); else if (SvPVX_const(dsv)) Safefree(SvPVX_mutable(dsv)); + SvUPGRADE(dsv, SVt_COW); } else - new_SV(dsv); - SvUPGRADE(dsv, SVt_COW); + dsv = newSV_type(SVt_COW); assert (SvPOK(ssv)); assert (SvPOKp(ssv)); @@ -4803,11 +4947,11 @@ Perl_sv_setpv_bufsize(pTHX_ SV *const sv } /* -=for apidoc sv_setpv -=for apidoc_item sv_setpv_mg -=for apidoc_item sv_setpvn -=for apidoc_item sv_setpvn_fresh -=for apidoc_item sv_setpvn_mg +=for apidoc sv_setpv +=for apidoc_item sv_setpv_mg +=for apidoc_item sv_setpvn +=for apidoc_item sv_setpvn_fresh +=for apidoc_item sv_setpvn_mg =for apidoc_item |void|sv_setpvs|SV* sv|"literal string" =for apidoc_item |void|sv_setpvs_mg|SV* sv|"literal string" @@ -4822,7 +4966,7 @@ embedded C characters. In the plain C forms, C points to a NUL-terminated C string. That is, it points to the first byte of the string, and the copy proceeds up through the -first enountered C byte. +first encountered C byte. In the forms that take a C argument, if it is NULL, the SV will become undefined. @@ -4985,8 +5129,8 @@ Perl_sv_sethek(pTHX_ SV *const sv, const /* =for apidoc sv_usepvn -=for apidoc_item sv_usepvn_mg =for apidoc_item sv_usepvn_flags +=for apidoc_item sv_usepvn_mg These tell an SV to use C for its string value. Normally SVs have their string stored inside the SV, but these tell the SV to use an @@ -5677,7 +5821,7 @@ Perl_sv_magicext(pTHX_ SV *const sv, SV mg->mg_ptr = savepvn(name, namlen); else if (namlen == HEf_SVKEY) { /* Yes, this is casting away const. This is only for the case of - HEf_SVKEY. I think we need to document this aberation of the + HEf_SVKEY. I think we need to document this aberration of the constness of the API, rather than making name non-const, as that change propagating outwards a long way. */ mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name); @@ -5779,7 +5923,7 @@ Perl_sv_magic(pTHX_ SV *const sv, SV *co } static int -S_sv_unmagicext_flags(pTHX_ SV *const sv, const int type, MGVTBL *vtbl, const U32 flags) +S_sv_unmagicext_flags(pTHX_ SV *const sv, const int type, const MGVTBL *vtbl, const U32 flags) { MAGIC* mg; MAGIC** mgp; @@ -5844,7 +5988,7 @@ Removes all magic of type C with t */ int -Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl) +Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, const MGVTBL *vtbl) { PERL_ARGS_ASSERT_SV_UNMAGICEXT; return S_sv_unmagicext_flags(aTHX_ sv, type, vtbl, 1); @@ -5949,7 +6093,7 @@ Perl_sv_get_backrefs(SV *const sv) /* find slot to store array or singleton backref */ if (SvTYPE(sv) == SVt_PVHV) { - if (SvOOK(sv)) { + if (HvHasAUX(sv)) { struct xpvhv_aux * const iter = HvAUX((HV *)sv); backrefs = (SV *)iter->xhv_backreferences; } @@ -6056,11 +6200,11 @@ Perl_sv_del_backref(pTHX_ SV *const tsv, PERL_ARGS_ASSERT_SV_DEL_BACKREF; if (SvTYPE(tsv) == SVt_PVHV) { - if (SvOOK(tsv)) + if (HvHasAUX(tsv)) svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv)); } else if (SvIS_FREED(tsv) && PL_phase == PERL_PHASE_DESTRUCT) { - /* It's possible for the the last (strong) reference to tsv to have + /* It's possible for the last (strong) reference to tsv to have become freed *before* the last thing holding a weak reference. If both survive longer than the backreferences array, then when the referent's reference count drops to 0 and it is freed, it's @@ -6447,7 +6591,7 @@ S_anonymise_cv_maybe(pTHX_ GV *gv, CV* c } /* if not, anonymise: */ - gvname = (GvSTASH(gv) && HvNAME(GvSTASH(gv)) && HvENAME(GvSTASH(gv))) + gvname = (GvSTASH(gv) && HvHasNAME(GvSTASH(gv)) && HvHasENAME(GvSTASH(gv))) ? newSVhek(HvENAME_HEK(GvSTASH(gv))) : newSVpvn_flags( "__ANON__", 8, 0 ); sv_catpvs(gvname, "::__ANON__"); @@ -6468,8 +6612,7 @@ and free the body itself. The SV's head its type is set to all 1's so that it won't inadvertently be assumed to be live during global destruction etc. This function should only be called when C is zero. Most of the time -you'll want to call C (or its macro wrapper C) -instead. +you'll want to call C instead. =cut */ @@ -6494,9 +6637,12 @@ Perl_sv_clear(pTHX_ SV *const orig_sv) HV *stash; assert(SvREFCNT(sv) == 0); - assert(SvTYPE(sv) != (svtype)SVTYPEMASK); - + assert(!SvIS_FREED(sv)); +#if NVSIZE <= IVSIZE + if (type <= SVt_NV) { +#else if (type <= SVt_IV) { +#endif /* Historically this check on type was needed so that the code to * free bodies wasn't reached for these types, because the arena * slots were re-used for HEs and pointer table entries. The @@ -6518,6 +6664,9 @@ Perl_sv_clear(pTHX_ SV *const orig_sv) * path, as SvPVX() doesn't point to valid memory. * * Hence this code is still the most efficient way to handle this. + * + * Additionally, for bodyless NVs, riding this branch is more + * efficient than stepping through the general logic. */ if (SvROK(sv)) @@ -6642,6 +6791,17 @@ Perl_sv_clear(pTHX_ SV *const orig_sv) } break; + case SVt_PVOBJ: + if(ObjectMAXFIELD(sv) > -1) { + next_sv = ObjectFIELDS(sv)[ObjectMAXFIELD(sv)--]; + /* save old iter_sv in top-most field, and pray that it + * doesn't get wiped in the meantime */ + ObjectFIELDS(sv)[(ObjectITERSVAT(sv) = ObjectMAXFIELD(sv) + 1)] = iter_sv; + iter_sv = sv; + goto get_next_sv; + } + Safefree(ObjectFIELDS(sv)); + break; case SVt_PVLV: if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */ SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv))); @@ -6682,7 +6842,7 @@ Perl_sv_clear(pTHX_ SV *const orig_sv) case SVt_PVGV: if (isGV_with_GP(sv)) { if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv))) - && HvENAME_get(stash)) + && HvHasENAME(stash)) mro_method_changed_in(stash); gp_free(MUTABLE_GV(sv)); if (GvNAME_HEK(sv)) @@ -6779,7 +6939,7 @@ Perl_sv_clear(pTHX_ SV *const orig_sv) U32 arena_index; const struct body_details *sv_type_details; - if (type == SVt_PVHV && SvOOK(sv)) { + if (type == SVt_PVHV && HvHasAUX(sv)) { arena_index = HVAUX_ARENA_ROOT_IX; sv_type_details = &fake_hv_with_aux; } @@ -6828,6 +6988,17 @@ Perl_sv_clear(pTHX_ SV *const orig_sv) Safefree(AvALLOC(av)); goto free_body; } + } else if (SvTYPE(iter_sv) == SVt_PVOBJ) { + if (ObjectMAXFIELD(iter_sv) > -1) { + sv = ObjectFIELDS(iter_sv)[ObjectMAXFIELD(iter_sv)--]; + } + else { /* no more fields in the current SV to free */ + sv = iter_sv; + type = SvTYPE(sv); + iter_sv = ObjectFIELDS(sv)[ObjectITERSVAT(sv)]; + Safefree(ObjectFIELDS(sv)); + goto free_body; + } } else if (SvTYPE(iter_sv) == SVt_PVHV) { sv = Perl_hfree_next_entry(aTHX_ (HV*)iter_sv, &hash_index); if (!sv && !HvTOTALKEYS((HV *)iter_sv)) { @@ -6901,7 +7072,7 @@ S_curse(pTHX_ SV * const sv, const bool CV* destructor = NULL; struct mro_meta *meta; - assert (SvOOK(stash)); + assert (HvHasAUX(stash)); DEBUG_o( Perl_deb(aTHX_ "Looking for DESTROY method for %s\n", HvNAME(stash)) ); @@ -8358,7 +8529,7 @@ Perl_sv_collxfrm_flags(pTHX_ SV *const s Safefree(mg->mg_ptr); s = SvPV_flags_const(sv, len, flags); - if ((xf = _mem_collxfrm(s, len, &xlen, cBOOL(SvUTF8(sv))))) { + if ((xf = mem_collxfrm_(s, len, &xlen, cBOOL(SvUTF8(sv))))) { if (! mg) { mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm, 0, 0); @@ -8566,7 +8737,7 @@ Perl_sv_gets(pTHX_ SV *const sv, PerlIO SvPOK_only(sv); if (!append) { /* not appending - "clear" the string by setting SvCUR to 0, - * the pv is still avaiable. */ + * the pv is still available. */ SvCUR_set(sv,0); } if (PerlIO_isutf8(fp)) @@ -8813,7 +8984,7 @@ Perl_sv_gets(pTHX_ SV *const sv, PerlIO } if (shortbuffered) { /* oh well, must extend */ - /* we didnt have enough room to fit the line into the target buffer + /* we didn't have enough room to fit the line into the target buffer * so we must extend the target buffer and keep going */ cnt = shortbuffered; shortbuffered = 0; @@ -9404,7 +9575,7 @@ Perl_newSVpvn_flags(pTHX_ const char *co * sv_2mortal() and do what it does ourselves here. Since we have asserted * that flags can only have the SVf_UTF8 and/or SVs_TEMP flags set above we * can use it to enable the sv flags directly (bypassing SvTEMP_on), which - * in turn means we dont need to mask out the SVf_UTF8 flag below, which + * in turn means we don't need to mask out the SVf_UTF8 flag below, which * means that we eliminate quite a few steps than it looks - Yves * (explaining patch by gfx) */ @@ -9492,6 +9663,30 @@ Perl_newSVpvn(pTHX_ const char *const bu } /* +=for apidoc newSVhek_mortal + +Creates a new mortal SV from the hash key structure. It will generate +scalars that point to the shared string table where possible. Returns +a new (undefined) SV if C is NULL. + +This is more efficient than using sv_2mortal(newSVhek( ... )) + +=cut +*/ + +SV * +Perl_newSVhek_mortal(pTHX_ const HEK *const hek) +{ + SV * const sv = newSVhek(hek); + assert(sv); + assert(!SvIMMORTAL(sv)); + + PUSH_EXTEND_MORTAL__SV_C(sv); + SvTEMP_on(sv); + return sv; +} + +/* =for apidoc newSVhek Creates a new SV from the hash key structure. It will generate scalars that @@ -9536,7 +9731,7 @@ Perl_newSVhek(pTHX_ const HEK *const hek SvUTF8_on (sv); return sv; } - /* This will be overwhelminly the most common case. */ + /* This will be overwhelmingly the most common case. */ { /* Inline most of newSVpvn_share(), because share_hek_hek() is far more efficient than sharepvn(). */ @@ -9679,8 +9874,9 @@ Perl_vnewSVpvf(pTHX_ const char *const p PERL_ARGS_ASSERT_VNEWSVPVF; - new_SV(sv); - sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL); + sv = newSV(1); + SvPVCLEAR_FRESH(sv); + sv_vcatpvfn_flags(sv, pat, strlen(pat), args, NULL, 0, NULL, 0); return sv; } @@ -9767,34 +9963,51 @@ Perl_newSVuv(pTHX_ const UV u) } /* -=for apidoc newRV_noinc +=for apidoc newSVbool -Creates an RV wrapper for an SV. The reference count for the original -SV is B incremented. +Creates a new SV boolean. =cut */ SV * -Perl_newRV_noinc(pTHX_ SV *const tmpRef) +Perl_newSVbool(pTHX_ bool bool_val) { - SV *sv; + PERL_ARGS_ASSERT_NEWSVBOOL; + SV *sv = newSVsv(bool_val ? &PL_sv_yes : &PL_sv_no); - PERL_ARGS_ASSERT_NEWRV_NOINC; + return sv; +} - new_SV(sv); +/* +=for apidoc newSV_true - /* We're starting from SVt_FIRST, so provided that's - * actual 0, we don't have to unset any SV type flags - * to promote to SVt_IV. */ - STATIC_ASSERT_STMT(SVt_FIRST == 0); +Creates a new SV that is a boolean true. - SET_SVANY_FOR_BODYLESS_IV(sv); - SvFLAGS(sv) |= SVt_IV; +=cut +*/ +SV * +Perl_newSV_true(pTHX) +{ + PERL_ARGS_ASSERT_NEWSV_TRUE; + SV *sv = newSVsv(&PL_sv_yes); - SvTEMP_off(tmpRef); + return sv; +} - sv_setrv_noinc(sv, tmpRef); +/* +=for apidoc newSV_false + +Creates a new SV that is a boolean false. + +=cut +*/ + +SV * +Perl_newSV_false(pTHX) +{ + PERL_ARGS_ASSERT_NEWSV_FALSE; + SV *sv = newSVsv(&PL_sv_no); return sv; } @@ -9813,8 +10026,8 @@ Perl_newRV(pTHX_ SV *const sv) /* =for apidoc newSVsv -=for apidoc_item newSVsv_nomg =for apidoc_item newSVsv_flags +=for apidoc_item newSVsv_nomg These create a new SV which is an exact duplicate of the original SV (using C.) @@ -9833,7 +10046,7 @@ Perl_newSVsv_flags(pTHX_ SV *const old, if (!old) return NULL; - if (SvTYPE(old) == (svtype)SVTYPEMASK) { + if (SvIS_FREED(old)) { Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string"); return NULL; } @@ -9873,7 +10086,7 @@ Perl_sv_resetpvn(pTHX_ const char *s, ST if (!s) { /* reset ?? searches */ MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab); - if (mg) { + if (mg && mg->mg_len) { const U32 count = mg->mg_len / sizeof(PMOP**); PMOP **pmp = (PMOP**) mg->mg_ptr; PMOP *const *const end = pmp + count; @@ -9929,7 +10142,7 @@ Perl_sv_resetpvn(pTHX_ const char *s, ST if (GvAV(gv)) { av_clear(GvAV(gv)); } - if (GvHV(gv) && !HvNAME_get(GvHV(gv))) { + if (GvHV(gv) && !HvHasNAME(GvHV(gv))) { hv_clear(GvHV(gv)); } } @@ -10196,7 +10409,7 @@ Perl_sv_pvbyten_force(pTHX_ SV *const sv PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE; sv_pvn_force(sv,lp); - sv_utf8_downgrade(sv,0); + (void)sv_utf8_downgrade(sv,0); *lp = SvCUR(sv); return SvPVX(sv); } @@ -10277,6 +10490,7 @@ Perl_sv_reftype(pTHX_ const SV *const sv case SVt_PVIO: return "IO"; case SVt_INVLIST: return "INVLIST"; case SVt_REGEXP: return "REGEXP"; + case SVt_PVOBJ: return "OBJECT"; default: return "UNKNOWN"; } } @@ -10305,9 +10519,10 @@ Perl_sv_ref(pTHX_ SV *dst, const SV *con dst = sv_newmortal(); if (ob && SvOBJECT(sv)) { - HvNAME_get(SvSTASH(sv)) - ? sv_sethek(dst, HvNAME_HEK(SvSTASH(sv))) - : sv_setpvs(dst, "__ANON__"); + if (HvHasNAME(SvSTASH(sv))) + sv_sethek(dst, HvNAME_HEK(SvSTASH(sv))); + else + sv_setpvs(dst, "__ANON__"); } else { const char * reftype = sv_reftype(sv, 0); @@ -10578,10 +10793,15 @@ Perl_sv_bless(pTHX_ SV *const sv, HV *co SvGETMAGIC(sv); if (!SvROK(sv)) Perl_croak(aTHX_ "Can't bless non-reference value"); + if (HvSTASH_IS_CLASS(stash)) + Perl_croak(aTHX_ "Attempt to bless into a class"); + tmpRef = SvRV(sv); if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY|SVf_PROTECT)) { if (SvREADONLY(tmpRef)) Perl_croak_no_modify(); + if (SvTYPE(tmpRef) == SVt_PVOBJ) + Perl_croak(aTHX_ "Can't bless an object reference"); if (SvOBJECT(tmpRef)) { oldstash = SvSTASH(tmpRef); } @@ -10621,7 +10841,7 @@ S_sv_unglob(pTHX_ SV *const sv, U32 flag SvREFCNT_inc_simple_void_NN(sv_2mortal(sv)); if (GvGP(sv)) { if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv))) - && HvNAME_get(stash)) + && HvHasNAME(stash)) mro_method_changed_in(stash); gp_free(MUTABLE_GV(sv)); } @@ -10739,54 +10959,6 @@ Perl_sv_tainted(pTHX_ SV *const sv) return FALSE; } -#ifndef NO_MATHOMS /* Can't move these to mathoms.c because call uiv_2buf(), - private to this file */ - -/* -=for apidoc sv_setpviv -=for apidoc_item sv_setpviv_mg - -These copy an integer into the given SV, also updating its string value. - -They differ only in that C performs 'set' magic; C -skips any magic. - -=cut -*/ - -void -Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv) -{ - /* The purpose of this union is to ensure that arr is aligned on - a 2 byte boundary, because that is what uiv_2buf() requires */ - union { - char arr[TYPE_CHARS(UV)]; - U16 dummy; - } buf; - char *ebuf; - char * const ptr = uiv_2buf(buf.arr, iv, 0, 0, &ebuf); - - PERL_ARGS_ASSERT_SV_SETPVIV; - - sv_setpvn(sv, ptr, ebuf - ptr); -} - -void -Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv) -{ - PERL_ARGS_ASSERT_SV_SETPVIV_MG; - - GCC_DIAG_IGNORE_STMT(-Wdeprecated-declarations); - - sv_setpviv(sv, iv); - - GCC_DIAG_RESTORE_STMT; - - SvSETMAGIC(sv); -} - -#endif /* NO_MATHOMS */ - #if defined(MULTIPLICITY) /* pTHX_ magic can't cope with varargs, so this is a no-context @@ -10827,10 +10999,10 @@ Perl_sv_setpvf_mg_nocontext(SV *const sv #endif /* -=for apidoc sv_setpvf -=for apidoc_item sv_setpvf_nocontext +=for apidoc sv_setpvf =for apidoc_item sv_setpvf_mg =for apidoc_item sv_setpvf_mg_nocontext +=for apidoc_item sv_setpvf_nocontext These work like C> but copy the text into the SV instead of appending it. @@ -10946,9 +11118,9 @@ Perl_sv_catpvf_mg_nocontext(SV *const sv /* =for apidoc sv_catpvf -=for apidoc_item sv_catpvf_nocontext =for apidoc_item sv_catpvf_mg =for apidoc_item sv_catpvf_mg_nocontext +=for apidoc_item sv_catpvf_nocontext These process their arguments like C, and append the formatted output to an SV. As with C, argument reordering is not supporte @@ -11972,6 +12144,7 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const s #endif /* we never change this unless USE_LOCALE_NUMERIC */ bool in_lc_numeric = FALSE; + SV *tmp_sv = NULL; PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS; PERL_UNUSED_ARG(maybe_tainted); @@ -12077,6 +12250,8 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const s char c; /* the actual format ('d', s' etc) */ + bool escape_it = FALSE; /* if this is a string should we quote and escape it? */ + /* echo everything up to the next format specification */ for (q = fmtstart; q < patend && *q != '%'; ++q) @@ -12450,6 +12625,21 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const s } string: + if (escape_it) { + U32 flags = PERL_PV_PRETTY_QUOTEDPREFIX; + if (is_utf8) + flags |= PERL_PV_ESCAPE_UNI; + + if (!tmp_sv) { + /* "blah"... where blah might be made up + * of characters like \x{1234} */ + tmp_sv = newSV(1 + (PERL_QUOTEDPREFIX_LEN * 8) + 1 + 3); + sv_2mortal(tmp_sv); + } + pv_pretty(tmp_sv, eptr, elen, PERL_QUOTEDPREFIX_LEN, + NULL, NULL, flags); + eptr = SvPV_const(tmp_sv, elen); + } if (has_precis && precis < elen) elen = precis; break; @@ -12458,7 +12648,34 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const s case 'p': - /* %p extensions: + /* BEGIN NOTE + * + * We want to extend the C level sprintf format API with + * custom formats for specific types (eg SV*) and behavior. + * However some C compilers are "sprintf aware" and will + * throw compile time exceptions when an illegal sprintf is + * encountered, so we can't just add new format letters. + * + * However it turns out the length argument to the %p format + * is more or less useless (the size of a pointer does not + * change over time) and is not really used in the C level + * code. Accordingly we can map our special behavior to + * specific "length" options to the %p format. We hide these + * mappings behind defines anyway, so nobody needs to know + * that HEKf is actually %2p. This keeps the C compiler + * happy while allowing us to add new formats. + * + * Note the existing logic for which number is used for what + * is torturous. All negative values are used for SVf, and + * non-negative values have arbitrary meanings with no + * structure to them. This may change in the future. + * + * NEVER use the raw %p values directly. Always use the define + * as the underlying mapping may change in the future. + * + * END NOTE + * + * %p extensions: * * "%...p" is normally treated like "%...x", except that the * number to print is the SV's address (or a pointer address @@ -12468,23 +12685,44 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const s * extensions. These are currently: * * %-p (SVf) Like %s, but gets the string from an SV* - * arg rather than a char* arg. + * arg rather than a char* arg. Use C + * to set up the argument properly. * (This was previously %_). * - * %-p Ditto but like %.s (i.e. num is max width) + * %-p Ditto but like %.s (i.e. num is max + * width), there is no escaped and quoted version + * of this. + * + * %1p (PVf_QUOTEDPREFIX). Like raw %s, but it is escaped + * and quoted. + * + * %5p (SVf_QUOTEDPREFIX) Like SVf, but length restricted, + * escaped and quoted with pv_pretty. Intended + * for error messages. * * %2p (HEKf) Like %s, but using the key string in a HEK + * %7p (HEKf_QUOTEDPREFIX) ... but escaped and quoted. * * %3p (HEKf256) Ditto but like %.256s + * %8p (HEKf256_QUOTEDPREFIX) ... but escaped and quoted * * %d%lu%4p (UTF8f) A utf8 string. Consumes 3 args: * (cBOOL(utf8), len, string_buf). * It's handled by the "case 'd'" branch * rather than here. + * %d%lu%9p (UTF8f_QUOTEDPREFIX) .. but escaped and quoted. + * + * %6p (HvNAMEf) Like %s, but using the HvNAME() and HvNAMELEN() + * %10p (HvNAMEf_QUOTEDPREFIX) ... but escaped and quoted * - * %p where num is 1 or > 4: reserved for future + * %p where num is > 9: reserved for future * extensions. Warns, but then is treated as a * general %p (print hex address) format. + * + * NOTE: If you add a new magic %p value you will + * need to update F to be aware of it + * on top of adding the various defines and etc. Do not + * forget to add it to F as well. */ if ( args @@ -12496,10 +12734,12 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const s && q[-2] != '*' && q[-2] != '$' ) { - if (left) { /* %-p (SVf), %-NNNp */ - if (width) { + if (left || width == 5) { /* %-p (SVf), %-NNNp, %5p */ + if (left && width) { precis = width; has_precis = TRUE; + } else if (width == 5) { + escape_it = TRUE; } argsv = MUTABLE_SV(va_arg(*args, void*)); eptr = SvPV_const(argsv, elen); @@ -12508,7 +12748,9 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const s width = 0; goto string; } - else if (width == 2 || width == 3) { /* HEKf, HEKf256 */ + else if (width == 2 || width == 3 || + width == 7 || width == 8) + { /* HEKf, HEKf256, HEKf_QUOTEDPREFIX, HEKf256_QUOTEDPREFIX */ HEK * const hek = va_arg(*args, HEK *); eptr = HEK_KEY(hek); elen = HEK_LEN(hek); @@ -12518,10 +12760,31 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const s precis = 256; has_precis = TRUE; } + if (width > 5) + escape_it = TRUE; + width = 0; + goto string; + } + else if (width == 1) { + eptr = va_arg(*args,char *); + elen = strlen(eptr); + escape_it = TRUE; + width = 0; + goto string; + } + else if (width == 6 || width == 10) { + HV *hv = va_arg(*args, HV *); + eptr = HvNAME(hv); + elen = HvNAMELEN(hv); + if (HvNAMEUTF8(hv)) + is_utf8 = TRUE; + if (width == 10) + escape_it = TRUE; width = 0; goto string; } else if (width) { + /* note width=4 or width=9 is handled under %d */ Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "internal %%p might conflict with future printf extensions"); } @@ -12562,7 +12825,8 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const s case 'd': /* probably just a plain %d, but it might be the start of the * special UTF8f format, which usually looks something like - * "%d%lu%4p" (the lu may vary by platform) + * "%d%lu%4p" (the lu may vary by platform) or + * "%d%lu%9p" for an escaped version. */ assert((UTF8f)[0] == 'd'); assert((UTF8f)[1] == '%'); @@ -12571,10 +12835,15 @@ Perl_sv_vcatpvfn_flags(pTHX_ SV *const s && q == fmtstart + 1 /* plain %d, not %....d */ && patend >= fmtstart + sizeof(UTF8f) - 1 /* long enough */ && *q == '%' - && strnEQ(q + 1, (UTF8f) + 2, sizeof(UTF8f) - 3)) + && strnEQ(q + 1, (UTF8f) + 2, sizeof(UTF8f) - 5) + && q[sizeof(UTF8f)-3] == 'p' + && (q[sizeof(UTF8f)-4] == '4' || + q[sizeof(UTF8f)-4] == '9')) { /* The argument has already gone through cBOOL, so the cast is safe. */ + if (q[sizeof(UTF8f)-4] == '9') + escape_it = TRUE; is_utf8 = (bool)va_arg(*args, int); elen = va_arg(*args, UV); /* if utf8 length is larger than 0x7ffff..., then it might @@ -13527,21 +13796,6 @@ ptr_table_* functions. #endif -/* Certain cases in Perl_ss_dup have been merged, by relying on the fact - that currently av_dup, gv_dup and hv_dup are the same as sv_dup. - If this changes, please unmerge ss_dup. - Likewise, sv_dup_inc_multiple() relies on this fact. */ -#define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup_inc(s,t)) -#define av_dup(s,t) MUTABLE_AV(sv_dup((const SV *)s,t)) -#define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t)) -#define hv_dup(s,t) MUTABLE_HV(sv_dup((const SV *)s,t)) -#define hv_dup_inc(s,t) MUTABLE_HV(sv_dup_inc((const SV *)s,t)) -#define cv_dup(s,t) MUTABLE_CV(sv_dup((const SV *)s,t)) -#define cv_dup_inc(s,t) MUTABLE_CV(sv_dup_inc((const SV *)s,t)) -#define io_dup(s,t) MUTABLE_IO(sv_dup((const SV *)s,t)) -#define io_dup_inc(s,t) MUTABLE_IO(sv_dup_inc((const SV *)s,t)) -#define gv_dup(s,t) MUTABLE_GV(sv_dup((const SV *)s,t)) -#define gv_dup_inc(s,t) MUTABLE_GV(sv_dup_inc((const SV *)s,t)) #define SAVEPV(p) ((p) ? savepv(p) : NULL) #define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL) @@ -13931,6 +14185,7 @@ struct ptr_tbl_arena { }; /* +=for apidoc_section $embedding =for apidoc ptr_table_new Create a new pointer-mapping table @@ -14183,6 +14438,86 @@ S_sv_dup_inc_multiple(pTHX_ SV *const *s return dest; } +/* duplicate the HvAUX of an HV */ +static void +S_sv_dup_hvaux(pTHX_ const SV *const ssv, SV *dsv, CLONE_PARAMS *const param) +{ + PERL_ARGS_ASSERT_SV_DUP_HVAUX; + + const struct xpvhv_aux * const saux = HvAUX(ssv); + struct xpvhv_aux * const daux = HvAUX(dsv); + /* This flag isn't copied. */ + SvFLAGS(dsv) |= SVphv_HasAUX; + + if (saux->xhv_name_count) { + HEK ** const sname = saux->xhv_name_u.xhvnameu_names; + const I32 count = saux->xhv_name_count < 0 + ? -saux->xhv_name_count + : saux->xhv_name_count; + HEK **shekp = sname + count; + HEK **dhekp; + Newx(daux->xhv_name_u.xhvnameu_names, count, HEK *); + dhekp = daux->xhv_name_u.xhvnameu_names + count; + while (shekp-- > sname) { + dhekp--; + *dhekp = hek_dup(*shekp, param); + } + } + else { + daux->xhv_name_u.xhvnameu_name = hek_dup(saux->xhv_name_u.xhvnameu_name, param); + } + daux->xhv_name_count = saux->xhv_name_count; + + daux->xhv_aux_flags = saux->xhv_aux_flags; +#ifdef PERL_HASH_RANDOMIZE_KEYS + daux->xhv_rand = saux->xhv_rand; + daux->xhv_last_rand = saux->xhv_last_rand; +#endif + daux->xhv_riter = saux->xhv_riter; + daux->xhv_eiter = saux->xhv_eiter ? he_dup(saux->xhv_eiter, FALSE, param) : 0; + /* backref array needs refcnt=2; see sv_add_backref */ + daux->xhv_backreferences = + (param->flags & CLONEf_JOIN_IN) + /* when joining, we let the individual GVs and + * CVs add themselves to backref as + * needed. This avoids pulling in stuff + * that isn't required, and simplifies the + * case where stashes aren't cloned back + * if they already exist in the parent + * thread */ + ? NULL + : saux->xhv_backreferences + ? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV) + ? MUTABLE_AV(SvREFCNT_inc( + sv_dup_inc((const SV *) + saux->xhv_backreferences, param))) + : MUTABLE_AV(sv_dup((const SV *) + saux->xhv_backreferences, param)) + : 0; + + daux->xhv_mro_meta = saux->xhv_mro_meta + ? mro_meta_dup(saux->xhv_mro_meta, param) + : 0; + + /* Record stashes for possible cloning in Perl_clone(). */ + if (HvNAME(ssv)) + av_push(param->stashes, dsv); + + if (HvSTASH_IS_CLASS(ssv)) { + daux->xhv_class_superclass = hv_dup_inc(saux->xhv_class_superclass, param); + daux->xhv_class_initfields_cv = cv_dup_inc(saux->xhv_class_initfields_cv, param); + daux->xhv_class_adjust_blocks = av_dup_inc(saux->xhv_class_adjust_blocks, param); + daux->xhv_class_fields = padnamelist_dup_inc(saux->xhv_class_fields, param); + daux->xhv_class_next_fieldix = saux->xhv_class_next_fieldix; + daux->xhv_class_param_map = hv_dup_inc(saux->xhv_class_param_map, param); + + /* TODO: This does mean that we can't compile more `field` expressions + * in the cloned thread, but surely we're done with compiletime now..? + */ + daux->xhv_class_suspended_initfields_compcv = NULL; + } +} + /* duplicate an SV of any type (including AV, HV etc) */ static SV * @@ -14192,7 +14527,7 @@ S_sv_dup_common(pTHX_ const SV *const ss PERL_ARGS_ASSERT_SV_DUP_COMMON; - if (SvTYPE(ssv) == (svtype)SVTYPEMASK) { + if (SvIS_FREED(ssv)) { #ifdef DEBUG_LEAKING_SCALARS_ABORT abort(); #endif @@ -14302,12 +14637,12 @@ S_sv_dup_common(pTHX_ const SV *const ss switch (sv_type) { default: - Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(ssv)); + Perl_croak(param->proto_perl, "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(ssv)); NOT_REACHED; /* NOTREACHED */ break; case SVt_PVHV: - if (SvOOK(ssv)) { + if (HvHasAUX(ssv)) { sv_type_details = &fake_hv_with_aux; #ifdef PURIFY new_body = new_NOARENA(sv_type_details); @@ -14317,6 +14652,7 @@ S_sv_dup_common(pTHX_ const SV *const ss goto have_body; } /* FALLTHROUGH */ + case SVt_PVOBJ: case SVt_PVGV: case SVt_PVIO: case SVt_PVFM: @@ -14355,7 +14691,7 @@ S_sv_dup_common(pTHX_ const SV *const ss sv_type_details->body_size + sv_type_details->offset, char); #endif - if (sv_type != SVt_PVAV && sv_type != SVt_PVHV + if (sv_type != SVt_PVAV && sv_type != SVt_PVHV && sv_type != SVt_PVOBJ && !isGV_with_GP(dsv) && !isREGEXP(dsv) && !(sv_type == SVt_PVIO && !(IoFLAGS(dsv) & IOf_FAKE_DIRP))) @@ -14491,70 +14827,8 @@ S_sv_dup_common(pTHX_ const SV *const ss ? he_dup(source, FALSE, param) : 0; ++i; } - if (SvOOK(ssv)) { - const struct xpvhv_aux * const saux = HvAUX(ssv); - struct xpvhv_aux * const daux = HvAUX(dsv); - /* This flag isn't copied. */ - SvOOK_on(dsv); - - if (saux->xhv_name_count) { - HEK ** const sname = saux->xhv_name_u.xhvnameu_names; - const I32 count - = saux->xhv_name_count < 0 - ? -saux->xhv_name_count - : saux->xhv_name_count; - HEK **shekp = sname + count; - HEK **dhekp; - Newx(daux->xhv_name_u.xhvnameu_names, count, HEK *); - dhekp = daux->xhv_name_u.xhvnameu_names + count; - while (shekp-- > sname) { - dhekp--; - *dhekp = hek_dup(*shekp, param); - } - } - else { - daux->xhv_name_u.xhvnameu_name - = hek_dup(saux->xhv_name_u.xhvnameu_name, - param); - } - daux->xhv_name_count = saux->xhv_name_count; - - daux->xhv_aux_flags = saux->xhv_aux_flags; -#ifdef PERL_HASH_RANDOMIZE_KEYS - daux->xhv_rand = saux->xhv_rand; - daux->xhv_last_rand = saux->xhv_last_rand; -#endif - daux->xhv_riter = saux->xhv_riter; - daux->xhv_eiter = saux->xhv_eiter - ? he_dup(saux->xhv_eiter, FALSE, param) : 0; - /* backref array needs refcnt=2; see sv_add_backref */ - daux->xhv_backreferences = - (param->flags & CLONEf_JOIN_IN) - /* when joining, we let the individual GVs and - * CVs add themselves to backref as - * needed. This avoids pulling in stuff - * that isn't required, and simplifies the - * case where stashes aren't cloned back - * if they already exist in the parent - * thread */ - ? NULL - : saux->xhv_backreferences - ? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV) - ? MUTABLE_AV(SvREFCNT_inc( - sv_dup_inc((const SV *) - saux->xhv_backreferences, param))) - : MUTABLE_AV(sv_dup((const SV *) - saux->xhv_backreferences, param)) - : 0; - - daux->xhv_mro_meta = saux->xhv_mro_meta - ? mro_meta_dup(saux->xhv_mro_meta, param) - : 0; - - /* Record stashes for possible cloning in Perl_clone(). */ - if (HvNAME(ssv)) - av_push(param->stashes, dsv); - } + if (HvHasAUX(ssv)) + sv_dup_hvaux(ssv, dsv, param); } else HvARRAY(MUTABLE_HV(dsv)) = NULL; @@ -14578,6 +14852,9 @@ S_sv_dup_common(pTHX_ const SV *const ss } else if (CvCONST(dsv)) { CvXSUBANY(dsv).any_ptr = sv_dup_inc((const SV *)CvXSUBANY(dsv).any_ptr, param); + } else if (CvREFCOUNTED_ANYSV(dsv)) { + CvXSUBANY(dsv).any_sv = + sv_dup_inc((const SV *)CvXSUBANY(dsv).any_sv, param); } assert(!CvSLABBED(dsv)); if (CvDYNFILE(dsv)) CvFILE(dsv) = SAVEPV(CvFILE(dsv)); @@ -14600,7 +14877,7 @@ S_sv_dup_common(pTHX_ const SV *const ss padlist = padlist_dup(padlist, param); CvPADLIST_set(dsv, padlist); } else -/* unthreaded perl can't sv_dup so we dont support unthreaded's CvHSCXT */ +/* unthreaded perl can't sv_dup so we don't support unthreaded's CvHSCXT */ PoisonPADLIST(dsv); CvOUTSIDE(dsv) = @@ -14608,6 +14885,16 @@ S_sv_dup_common(pTHX_ const SV *const ss ? cv_dup( CvOUTSIDE(dsv), param) : cv_dup_inc(CvOUTSIDE(dsv), param); break; + case SVt_PVOBJ: + { + Size_t fieldcount = ObjectMAXFIELD(ssv) + 1; + + Newx(ObjectFIELDS(dsv), fieldcount, SV *); + ObjectMAXFIELD(dsv) = fieldcount - 1; + + sv_dup_inc_multiple(ObjectFIELDS(ssv), ObjectFIELDS(dsv), fieldcount, param); + } + break; } } } @@ -14829,7 +15116,7 @@ Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PAR #define pv_dup(p) SAVEPV(p) #define svp_dup_inc(p,pp) any_dup(p,pp) -/* map any object to the new equivent - either something in the +/* map any object to the new equivalent - either something in the * ptr table, or something in the interpreter structure */ @@ -14877,6 +15164,7 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto const GV *gv; const AV *av; const HV *hv; + char *pv; /* no const deliberately */ void* ptr; int intval; long longval; @@ -14937,6 +15225,18 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto SvREFCNT_inc_simple_void((SV *)TOPPTR(nss,ix)); ptr = POPPTR(ss,ix); TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */ + /* this feels very strange, we have a **SV from one thread, + * we copy the SV, but dont change the **SV. But in this thread + * the target of the **SV could be something from the *other* thread. + * So how can this possibly work correctly? */ + break; + case SAVEt_RCPV: + pv = (char *)POPPTR(ss,ix); + TOPPTR(nss,ix) = rcpv_copy(pv); + ptr = POPPTR(ss,ix); + (void)rcpv_copy(*((char **)ptr)); + TOPPTR(nss,ix) = ptr; + /* XXXXX: see comment above. */ break; case SAVEt_GVSLOT: /* any slot in GV */ sv = (const SV *)POPPTR(ss,ix); @@ -15066,6 +15366,10 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto c = (char*)POPPTR(ss,ix); TOPPTR(nss,ix) = pv_dup_inc(c); break; + case SAVEt_FREERCPV: + c = (char *)POPPTR(ss,ix); + TOPPTR(nss,ix) = rcpv_copy(c); + break; case SAVEt_STACK_POS: /* Position on Perl stack */ i = POPINT(ss,ix); TOPINT(nss,ix) = i; @@ -15129,9 +15433,11 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto sv = (const SV *)POPPTR(ss,ix); TOPPTR(nss,ix) = sv_dup(sv, param); break; + case SAVEt_CURCOP_WARNINGS: + /* FALLTHROUGH */ case SAVEt_COMPILE_WARNINGS: ptr = POPPTR(ss,ix); - TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr); + TOPPTR(nss,ix) = DUP_WARNINGS((char*)ptr); break; case SAVEt_PARSER: ptr = POPPTR(ss,ix); @@ -15278,6 +15584,7 @@ perl_clone_using(PerlInterpreter *proto_ /* for each stash, determine whether its objects should be cloned */ S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK); + my_perl->Iphase = PERL_PHASE_CONSTRUCT; PERL_SET_THX(my_perl); #ifdef DEBUGGING @@ -15293,6 +15600,7 @@ perl_clone_using(PerlInterpreter *proto_ PL_savestack_max = -1; PL_sig_pending = 0; PL_parser = NULL; + PL_eval_begin_nest_depth = proto_perl->Ieval_begin_nest_depth; Zero(&PL_debug_pad, 1, struct perl_debug_pad); Zero(&PL_padname_undef, 1, PADNAME); Zero(&PL_padname_const, 1, PADNAME); @@ -15362,7 +15670,7 @@ perl_clone_using(PerlInterpreter *proto_ PL_minus_c = proto_perl->Iminus_c; PL_localpatches = proto_perl->Ilocalpatches; - PL_splitstr = proto_perl->Isplitstr; + PL_splitstr = SAVEPV(proto_perl->Isplitstr); PL_minus_n = proto_perl->Iminus_n; PL_minus_p = proto_perl->Iminus_p; PL_minus_l = proto_perl->Iminus_l; @@ -15427,7 +15735,6 @@ perl_clone_using(PerlInterpreter *proto_ PL_nomemok = proto_perl->Inomemok; PL_an = proto_perl->Ian; PL_evalseq = proto_perl->Ievalseq; - PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */ PL_origalen = proto_perl->Iorigalen; PL_sighandlerp = proto_perl->Isighandlerp; @@ -15439,29 +15746,6 @@ perl_clone_using(PerlInterpreter *proto_ PL_subline = proto_perl->Isubline; PL_cv_has_eval = proto_perl->Icv_has_eval; - -#ifdef USE_LOCALE_COLLATE - PL_collation_ix = proto_perl->Icollation_ix; - PL_collation_standard = proto_perl->Icollation_standard; - PL_collxfrm_base = proto_perl->Icollxfrm_base; - PL_collxfrm_mult = proto_perl->Icollxfrm_mult; - PL_strxfrm_max_cp = proto_perl->Istrxfrm_max_cp; -#endif /* USE_LOCALE_COLLATE */ - -#ifdef USE_LOCALE_NUMERIC - PL_numeric_standard = proto_perl->Inumeric_standard; - PL_numeric_underlying = proto_perl->Inumeric_underlying; - PL_numeric_underlying_is_standard = proto_perl->Inumeric_underlying_is_standard; -#endif /* !USE_LOCALE_NUMERIC */ - - /* Did the locale setup indicate UTF-8? */ - PL_utf8locale = proto_perl->Iutf8locale; - PL_in_utf8_CTYPE_locale = proto_perl->Iin_utf8_CTYPE_locale; - PL_in_utf8_COLLATE_locale = proto_perl->Iin_utf8_COLLATE_locale; - my_strlcpy(PL_locale_utf8ness, proto_perl->Ilocale_utf8ness, sizeof(PL_locale_utf8ness)); -#if defined(USE_ITHREADS) && ! defined(USE_THREAD_SAFE_LOCALE) - PL_lc_numeric_mutex_depth = 0; -#endif /* Unicode features (see perlrun/-C) */ PL_unicode = proto_perl->Iunicode; @@ -15490,6 +15774,8 @@ perl_clone_using(PerlInterpreter *proto_ PL_srand_called = proto_perl->Isrand_called; Copy(&(proto_perl->Irandom_state), &PL_random_state, 1, PL_RANDOM_STATE_TYPE); + PL_srand_override = proto_perl->Isrand_override; + PL_srand_override_next = proto_perl->Isrand_override_next; if (flags & CLONEf_COPY_STACKS) { /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */ @@ -15586,9 +15872,7 @@ perl_clone_using(PerlInterpreter *proto_ Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*); - /* This PV will be free'd special way so must set it same way op.c does */ - PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file); - ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file); + PL_compiling.cop_file = rcpv_copy(proto_perl->Icompiling.cop_file); ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling); PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings); @@ -15621,6 +15905,9 @@ perl_clone_using(PerlInterpreter *proto_ PL_diehook = sv_dup_inc(proto_perl->Idiehook, param); PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param); + PL_hook__require__before = sv_dup_inc(proto_perl->Ihook__require__before, param); + PL_hook__require__after = sv_dup_inc(proto_perl->Ihook__require__after, param); + /* switches */ PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param); PL_inplace = SAVEPV(proto_perl->Iinplace); @@ -15762,30 +16049,60 @@ perl_clone_using(PerlInterpreter *proto_ PL_subname = sv_dup_inc(proto_perl->Isubname, param); -#if defined(USE_POSIX_2008_LOCALE) \ - && defined(USE_THREAD_SAFE_LOCALE) \ - && ! defined(HAS_QUERYLOCALE) +#ifdef USE_PL_CURLOCALES for (i = 0; i < (int) C_ARRAY_LENGTH(PL_curlocales); i++) { - PL_curlocales[i] = savepv("."); /* An illegal value */ + PL_curlocales[i] = SAVEPV("C"); } #endif +#ifdef USE_PL_CUR_LC_ALL + PL_cur_LC_ALL = SAVEPV("C"); +#endif #ifdef USE_LOCALE_CTYPE + Copy(PL_fold, PL_fold_locale, 256, U8); + /* Should we warn if uses locale? */ + PL_ctype_name = SAVEPV("C"); PL_warn_locale = sv_dup_inc(proto_perl->Iwarn_locale, param); + PL_in_utf8_CTYPE_locale = false; + PL_in_utf8_turkic_locale = false; #endif + /* Did the locale setup indicate UTF-8? */ + PL_utf8locale = false; + #ifdef USE_LOCALE_COLLATE - PL_collation_name = SAVEPV(proto_perl->Icollation_name); + PL_in_utf8_COLLATE_locale = false; + PL_collation_name = SAVEPV("C"); + PL_collation_ix = proto_perl->Icollation_ix; + PL_collation_standard = true; + PL_collxfrm_base = 0; + PL_collxfrm_mult = 0; + PL_strxfrm_max_cp = 0; + PL_strxfrm_is_behaved = proto_perl->Istrxfrm_is_behaved; + PL_strxfrm_NUL_replacement = '\0'; #endif /* USE_LOCALE_COLLATE */ +#ifdef USE_LOCALE_THREADS + assert(PL_locale_mutex_depth <= 0); + PL_locale_mutex_depth = 0; +#endif + #ifdef USE_LOCALE_NUMERIC - PL_numeric_name = SAVEPV(proto_perl->Inumeric_name); - PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param); + PL_numeric_name = SAVEPV("C"); + PL_numeric_radix_sv = newSVpvs("."); + PL_underlying_radix_sv = newSVpvs("."); + PL_numeric_standard = true; + PL_numeric_underlying = true; + PL_numeric_underlying_is_standard = true; -# if defined(HAS_POSIX_2008_LOCALE) +# if defined(USE_POSIX_2008_LOCALE) PL_underlying_numeric_obj = NULL; # endif #endif /* !USE_LOCALE_NUMERIC */ +#if defined(USE_POSIX_2008_LOCALE) + PL_scratch_locale_obj = NULL; + PL_cur_locale_obj = PL_C_locale_obj; +#endif #ifdef HAS_MBRLEN PL_mbrlen_ps = proto_perl->Imbrlen_ps; @@ -15803,6 +16120,9 @@ perl_clone_using(PerlInterpreter *proto_ PL_setlocale_buf = NULL; PL_setlocale_bufsize = 0; + PL_stdize_locale_buf = NULL; + PL_stdize_locale_bufsize = 0; + /* Unicode inversion lists */ PL_AboveLatin1 = sv_dup_inc(proto_perl->IAboveLatin1, param); @@ -15826,12 +16146,12 @@ perl_clone_using(PerlInterpreter *proto_ PL_WB_invlist = sv_dup_inc(proto_perl->IWB_invlist, param); for (i = 0; i < POSIX_CC_COUNT; i++) { PL_XPosix_ptrs[i] = sv_dup_inc(proto_perl->IXPosix_ptrs[i], param); - if (i != _CC_CASED && i != _CC_VERTSPACE) { + if (i != CC_CASED_ && i != CC_VERTSPACE_) { PL_Posix_ptrs[i] = sv_dup_inc(proto_perl->IPosix_ptrs[i], param); } } - PL_Posix_ptrs[_CC_CASED] = PL_Posix_ptrs[_CC_ALPHA]; - PL_Posix_ptrs[_CC_VERTSPACE] = NULL; + PL_Posix_ptrs[CC_CASED_] = PL_Posix_ptrs[CC_ALPHA_]; + PL_Posix_ptrs[CC_VERTSPACE_] = NULL; PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param); PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param); @@ -16322,7 +16642,7 @@ S_find_hash_subscript(pTHX_ const HV *co HE *entry; for (entry = array[i]; entry; entry = HeNEXT(entry)) { if (HeVAL(entry) == val) - return sv_2mortal(newSVhek(HeKEY_hek(entry))); + return newSVhek_mortal(HeKEY_hek(entry)); } } return NULL; @@ -16463,8 +16783,19 @@ S_find_uninit_var(pTHX_ const OP *const switch (obase->op_type) { case OP_UNDEF: - /* undef should care if its args are undef - any warnings + /* the optimizer rewrites '$x = undef' to 'undef $x' for lexical + * variables, which can occur as the source of warnings: + * ($x = undef) =~ s/a/b/; + * The OPpUNDEF_KEEP_PV flag indicates that this used to be an + * assignment op. + * Otherwise undef should not care if its args are undef - any warnings * will be from tied/magic vars */ + if ( + (obase->op_private & (OPpTARGET_MY | OPpUNDEF_KEEP_PV)) == (OPpTARGET_MY | OPpUNDEF_KEEP_PV) + && (!match || PAD_SVl(obase->op_targ) == uninit_sv) + ) { + return varname(NULL, '$', obase->op_targ, NULL, 0, FUV_SUBSCRIPT_NONE); + } break; case OP_RV2AV: @@ -16543,6 +16874,12 @@ S_find_uninit_var(pTHX_ const OP *const return varname(NULL, '$', obase->op_targ, NULL, 0, FUV_SUBSCRIPT_NONE); + case OP_PADSV_STORE: + if (match && PAD_SVl(obase->op_targ) != uninit_sv) + goto do_op; + return varname(NULL, '$', obase->op_targ, + NULL, 0, FUV_SUBSCRIPT_NONE); + case OP_GVSV: gv = cGVOPx_gv(obase); if (!gv || (match && GvSV(gv) != uninit_sv) || !GvSTASH(gv)) @@ -16561,6 +16898,20 @@ S_find_uninit_var(pTHX_ const OP *const } return varname(NULL, '$', obase->op_targ, NULL, (I8)obase->op_private, FUV_SUBSCRIPT_ARRAY); + + case OP_AELEMFASTLEX_STORE: + if (match) { + SV **svp; + AV *av = MUTABLE_AV(PAD_SV(obase->op_targ)); + if (!av || SvRMAGICAL(av)) + goto do_op; + svp = av_fetch(av, (I8)obase->op_private, FALSE); + if (!svp || *svp != uninit_sv) + goto do_op; + } + return varname(NULL, '$', obase->op_targ, + NULL, (I8)obase->op_private, FUV_SUBSCRIPT_ARRAY); + case OP_AELEMFAST: { gv = cGVOPx_gv(obase); @@ -17142,6 +17493,7 @@ S_find_uninit_var(pTHX_ const OP *const /* +=for apidoc_section $warning =for apidoc report_uninit Print appropriate "Use of uninitialized variable" warning. Index: gnu/usr.bin/perl/sv.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/sv.h,v diff -u -p -a -u -p -r1.24 sv.h --- gnu/usr.bin/perl/sv.h 15 Feb 2023 01:36:13 -0000 1.24 +++ gnu/usr.bin/perl/sv.h 21 Feb 2024 15:47:03 -0000 @@ -38,9 +38,11 @@ The types are: SVt_PVCV SVt_PVFM SVt_PVIO + SVt_PVOBJ These are most easily explained from the bottom up. +C is for object instances of the new `use feature 'class'` kind. C is for I/O objects, C for formats, C for subroutines, C for hashes and C for arrays. @@ -67,10 +69,13 @@ PVMG, we save memory by allocating small other types are just simpler forms of C, with fewer internal fields. C can only hold undef. C can hold undef, an integer, or a reference. (C is an alias for C, which exists for backward -compatibility.) C can hold any of those or a double. C can only -hold C or a string. C is a superset of C and C. -C is similar. C can hold anything C can hold, but it -can, but does not have to, be blessed or magical. +compatibility.) C can hold undef or a double. (In builds that support +headless NVs, these could also hold a reference via a suitable offset, in the +same way that SVt_IV does, but this is not currently supported and seems to +be a rare use case.) C can hold C, a string, or a reference. +C is a superset of C and C. C is a +superset of C and C. C can hold anything C +can hold, but it may also be blessed or magical. =for apidoc AmnU||SVt_NULL Type flag for scalars. See L. @@ -120,6 +125,9 @@ Type flag for formats. See L. =for apidoc AmnU||SVt_PVIO Type flag for I/O objects. See L. +=for apidoc AmnUx||SVt_PVOBJ +Type flag for object instances. See L. + =cut These are ordered so that the simpler types have a lower value; SvUPGRADE @@ -149,7 +157,8 @@ typedef enum { SVt_PVCV, /* 13 */ SVt_PVFM, /* 14 */ SVt_PVIO, /* 15 */ - /* 16-31: Unused, though one should be reserved for a + SVt_PVOBJ, /* 16 */ + /* 17-31: Unused, though one should be reserved for a * freed sv, if the other 3 bits below the flags ones * get allocated */ SVt_LAST /* keep last in enum. used to size arrays */ @@ -158,7 +167,7 @@ typedef enum { /* *** any alterations to the SV types above need to be reflected in * SVt_MASK and the various PL_valid_types_* tables. As of this writing those * tables are in perl.h. There are also two affected names tables in dump.c, - * one in B.xs, and 'bodies_by_type[]' in sv.c. + * one in B.xs, and 'bodies_by_type[]' in sv_inline.h. * * The bits that match 0xe0 are CURRENTLY UNUSED * The bits above that are for flags, like SVf_IOK */ @@ -273,6 +282,11 @@ struct invlist { _SV_HEAD_UNION; }; +struct object { + _SV_HEAD(XPVOBJ*); /* pointer to xobject body */ + _SV_HEAD_UNION; +}; + #undef _SV_HEAD #undef _SV_HEAD_UNION /* ensure no pollution */ @@ -283,14 +297,14 @@ struct invlist { Returns the value of the object's reference count. Exposed to perl code via Internals::SvREFCNT(). -=for apidoc SvREFCNT_inc -=for apidoc_item SvREFCNT_inc_NN -=for apidoc_item SvREFCNT_inc_void -=for apidoc_item |void|SvREFCNT_inc_void_NN|SV* sv -=for apidoc_item |SV*|SvREFCNT_inc_simple|SV* sv -=for apidoc_item |SV*|SvREFCNT_inc_simple_NN|SV* sv +=for apidoc SvREFCNT_inc +=for apidoc_item SvREFCNT_inc_NN +=for apidoc_item |SV* |SvREFCNT_inc_simple|SV* sv +=for apidoc_item |SV* |SvREFCNT_inc_simple_NN|SV* sv =for apidoc_item |void|SvREFCNT_inc_simple_void|SV* sv =for apidoc_item |void|SvREFCNT_inc_simple_void_NN|SV* sv +=for apidoc_item SvREFCNT_inc_void +=for apidoc_item |void|SvREFCNT_inc_void_NN|SV* sv These all increment the reference count of the given SV. The ones without C in their names return the SV. @@ -322,13 +336,30 @@ effects and you don't need the return va C can only be used with expressions without side effects, you don't need the return value, and you know C is not C. -=for apidoc SvREFCNT_dec +=for apidoc SvREFCNT_dec +=for apidoc_item SvREFCNT_dec_set_NULL +=for apidoc_item SvREFCNT_dec_ret_NULL =for apidoc_item SvREFCNT_dec_NN These decrement the reference count of the given SV. C may only be used when C is known to not be C. +The function C is identical to the +C except it returns a NULL C. It is used by +C which is a macro which will, when passed a +non-NULL argument, decrement the reference count of its argument and +then set it to NULL. You can replace code of the following form: + + if (sv) { + SvREFCNT_dec_NN(sv); + sv = NULL; + } + +with + + SvREFCNT_dec_set_NULL(sv); + =for apidoc Am|svtype|SvTYPE|SV* sv Returns the type of the SV. See C>. @@ -349,12 +380,22 @@ perform the upgrade if necessary. See C #define SvREFCNT_inc_void(sv) Perl_SvREFCNT_inc_void(MUTABLE_SV(sv)) /* These guys don't need the curly blocks */ -#define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END +#define SvREFCNT_inc_simple_void(sv) \ + STMT_START { \ + SV * sv_ = MUTABLE_SV(sv); \ + if (sv_) \ + SvREFCNT(sv_)++; \ + } STMT_END + #define SvREFCNT_inc_simple_NN(sv) (++(SvREFCNT(sv)),MUTABLE_SV(sv)) #define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT(MUTABLE_SV(sv))) #define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT(MUTABLE_SV(sv))) #define SvREFCNT_dec(sv) Perl_SvREFCNT_dec(aTHX_ MUTABLE_SV(sv)) +#define SvREFCNT_dec_set_NULL(sv) \ + STMT_START { \ + sv = Perl_SvREFCNT_dec_ret_NULL(aTHX_ MUTABLE_SV(sv)); \ + } STMT_END #define SvREFCNT_dec_NN(sv) Perl_SvREFCNT_dec_NN(aTHX_ MUTABLE_SV(sv)) #define SVTYPEMASK 0xff @@ -416,9 +457,8 @@ perform the upgrade if necessary. See C including PVLV-as-regex. See isREGEXP(). */ -#define SVf_OOK 0x02000000 /* has valid offset value. For a PVHV this - means that a hv_aux struct is present - after the main array */ +#define SVf_OOK 0x02000000 /* has valid offset value */ +#define SVphv_HasAUX SVf_OOK /* PVHV has an additional hv_aux struct */ #define SVf_BREAK 0x04000000 /* refcnt is artificially low - used by SVs in final arena cleanup. Set in S_regtry on PL_reg_curpm, so that @@ -662,6 +702,18 @@ struct xpvio { #define IOf_FAKE_DIRP 64 /* xio_dirp is fake (source filters kludge) Also, when this is set, SvPVX() is valid */ +struct xobject { + HV* xmg_stash; + union _xmgu xmg_u; + SSize_t xobject_maxfield; + SSize_t xobject_iter_sv_at; /* this is only used by Perl_sv_clear() */ + SV** xobject_fields; +}; + +#define ObjectMAXFIELD(inst) ((XPVOBJ *)SvANY(inst))->xobject_maxfield +#define ObjectITERSVAT(inst) ((XPVOBJ *)SvANY(inst))->xobject_iter_sv_at +#define ObjectFIELDS(inst) ((XPVOBJ *)SvANY(inst))->xobject_fields + /* The following macros define implementation-independent predicates on SVs. */ /* @@ -746,6 +798,55 @@ Unsets the PV status of an SV. Tells an SV that it is a string and disables all other C bits. Will also turn off the UTF-8 status. +=for apidoc Am|U32|SvBoolFlagsOK|SV* sv +Returns a bool indicating whether the SV has the right flags set such +that it is safe to call C or +C or +C. Currently equivalent to +C or C. Serialization may want to +unroll this check. If so you are strongly recommended to add code like +C B calling using any of the +BOOL_INTERNALS macros. + +=for apidoc Am|U32|SvIandPOK|SV* sv +Returns a bool indicating whether the SV is both C and +C at the same time. Equivalent to C but +more efficient. + +=for apidoc Am|void|SvIandPOK_on|SV* sv +Tells an SV that is a string and a number in one operation. Equivalent +to C but more efficient. + +=for apidoc Am|void|SvIandPOK_off|SV* sv +Unsets the PV and IV status of an SV in one operation. Equivalent to +C but more efficient. + +=for apidoc Am|bool|BOOL_INTERNALS_sv_isbool|SV* sv +Checks if a C sv is a bool. B that it is the +caller's responsibility to ensure that the sv is C before +calling this. This is only useful in specialized logic like +serialization code where performance is critical and the flags have +already been checked to be correct. Almost always you should be using +C instead. + +=for apidoc Am|bool|BOOL_INTERNALS_sv_isbool_true|SV* sv +Checks if a C sv is a true bool. B that it is +the caller's responsibility to ensure that the sv is C +before calling this. This is only useful in specialized logic like +serialization code where performance is critical and the flags have +already been checked to be correct. This is B what you should use +to check if an SV is "true", for that you should be using +C instead. + +=for apidoc Am|bool|BOOL_INTERNALS_sv_isbool_false|SV* sv +Checks if a C sv is a false bool. B that it is +the caller's responsibility to ensure that the sv is C +before calling this. This is only useful in specialized logic like +serialization code where performance is critical and the flags have +already been checked to be correct. This is B what you should use +to check if an SV is "false", for that you should be using +C instead. + =for apidoc Am|bool|SvVOK|SV* sv Returns a boolean indicating whether the SV contains a v-string. @@ -784,10 +885,10 @@ This is an unnecessary synonym for L is true. See also C>. -=for apidoc Am|char*|SvPVX|SV* sv -=for apidoc_item |char*|SvPVXx|SV* sv +=for apidoc Am |char* |SvPVX|SV* sv =for apidoc_item |const char*|SvPVX_const|SV* sv -=for apidoc_item |char*|SvPVX_mutable|SV* sv +=for apidoc_item |char* |SvPVX_mutable|SV* sv +=for apidoc_item |char* |SvPVXx|SV* sv These return a pointer to the physical string in the SV. The SV must contain a string. Prior to 5.9.3 it is not safe to execute these unless the SV's @@ -914,6 +1015,20 @@ Set the size of the string buffer for th #define SvIOK_notUV(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV)) \ == SVf_IOK) +#define SvIandPOK(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_POK)) == (SVf_IOK|SVf_POK)) +#define SvIandPOK_on(sv) (assert_not_glob(sv) \ + (SvFLAGS(sv) |= (SVf_IOK|SVp_IOK|SVf_POK|SVp_POK))) +#define SvIandPOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_POK|SVp_POK)) + +#define SvBoolFlagsOK(sv) SvIandPOK(sv) + +#define BOOL_INTERNALS_sv_isbool(sv) (SvIsCOW_static(sv) && \ + (SvPVX_const(sv) == PL_Yes || SvPVX_const(sv) == PL_No)) +#define BOOL_INTERNALS_sv_isbool_true(sv) (SvIsCOW_static(sv) && \ + (SvPVX_const(sv) == PL_Yes)) +#define BOOL_INTERNALS_sv_isbool_false(sv) (SvIsCOW_static(sv) && \ + (SvPVX_const(sv) == PL_No)) + #define SvIsUV(sv) (SvFLAGS(sv) & SVf_IVisUV) #define SvIsUV_on(sv) (SvFLAGS(sv) |= SVf_IVisUV) #define SvIsUV_off(sv) (SvFLAGS(sv) &= ~SVf_IVisUV) @@ -1132,7 +1247,7 @@ C does nothing. #define SvTHINKFIRST(sv) (SvFLAGS(sv) & SVf_THINKFIRST) #define SVs_PADMY 0 -#define SvPADMY(sv) !(SvFLAGS(sv) & SVs_PADTMP) +#define SvPADMY(sv) (!(SvFLAGS(sv) & SVs_PADTMP)) #ifndef PERL_CORE # define SvPADMY_on(sv) SvPADTMP_off(sv) #endif @@ -1330,8 +1445,8 @@ object type. Exposed to perl code via In #ifndef PERL_POISON /* Given that these two are new, there can't be any existing code using them * as LVALUEs, so prevent that from happening */ -# define SvPVX_mutable(sv) (0 + (sv)->sv_u.svu_pv) -# define SvPVX_const(sv) ((const char*)(0 + (sv)->sv_u.svu_pv)) +# define SvPVX_mutable(sv) ((char *)((sv)->sv_u.svu_pv)) +# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) #else /* Except for the poison code, which uses & to scribble over the pointer after free() is called. */ @@ -1351,41 +1466,59 @@ object type. Exposed to perl code via In Not guaranteed to stay returning void */ /* Macro won't actually call sv_2iv if already IOK */ #define SvIV_please(sv) \ - STMT_START {if (!SvIOKp(sv) && (SvFLAGS(sv) & (SVf_NOK|SVf_POK))) \ - (void) SvIV(sv); } STMT_END + STMT_START { \ + SV * sv_ = MUTABLE_SV(sv); \ + if (!SvIOKp(sv_) && (SvFLAGS(sv_) & (SVf_NOK|SVf_POK))) \ + (void) SvIV(sv_); \ + } STMT_END #define SvIV_please_nomg(sv) \ (!(SvFLAGS(sv) & (SVf_IOK|SVp_IOK)) && (SvFLAGS(sv) & (SVf_NOK|SVf_POK)) \ ? (sv_2iv_flags(sv, 0), SvIOK(sv)) \ : SvIOK(sv)) + #define SvIV_set(sv, val) \ STMT_START { \ - assert(PL_valid_types_IV_set[SvTYPE(sv) & SVt_MASK]); \ - assert(!isGV_with_GP(sv)); \ - (((XPVIV*) SvANY(sv))->xiv_iv = (val)); } STMT_END + SV * sv_ = MUTABLE_SV(sv); \ + assert(PL_valid_types_IV_set[SvTYPE(sv_) & SVt_MASK]); \ + assert(!isGV_with_GP(sv_)); \ + (((XPVIV*) SvANY(sv_))->xiv_iv = (val)); \ + } STMT_END + #define SvNV_set(sv, val) \ STMT_START { \ - assert(PL_valid_types_NV_set[SvTYPE(sv) & SVt_MASK]); \ - assert(!isGV_with_GP(sv)); \ - (((XPVNV*)SvANY(sv))->xnv_u.xnv_nv = (val)); } STMT_END + SV * sv_ = MUTABLE_SV(sv); \ + assert(PL_valid_types_NV_set[SvTYPE(sv_) & SVt_MASK]); \ + assert(!isGV_with_GP(sv_)); \ + (((XPVNV*)SvANY(sv_))->xnv_u.xnv_nv = (val)); \ + } STMT_END + #define SvPV_set(sv, val) \ STMT_START { \ - assert(PL_valid_types_PVX[SvTYPE(sv) & SVt_MASK]); \ - assert(!isGV_with_GP(sv)); \ - assert(!(SvTYPE(sv) == SVt_PVIO \ - && !(IoFLAGS(sv) & IOf_FAKE_DIRP))); \ - ((sv)->sv_u.svu_pv = (val)); } STMT_END + SV * sv_ = MUTABLE_SV(sv); \ + assert(PL_valid_types_PVX[SvTYPE(sv_) & SVt_MASK]); \ + assert(!isGV_with_GP(sv_)); \ + assert(!(SvTYPE(sv_) == SVt_PVIO \ + && !(IoFLAGS(sv_) & IOf_FAKE_DIRP))); \ + ((sv_)->sv_u.svu_pv = (val)); \ + } STMT_END + #define SvUV_set(sv, val) \ STMT_START { \ - assert(PL_valid_types_IV_set[SvTYPE(sv) & SVt_MASK]); \ - assert(!isGV_with_GP(sv)); \ - (((XPVUV*)SvANY(sv))->xuv_uv = (val)); } STMT_END + SV * sv_ = MUTABLE_SV(sv); \ + assert(PL_valid_types_IV_set[SvTYPE(sv_) & SVt_MASK]); \ + assert(!isGV_with_GP(sv_)); \ + (((XPVUV*)SvANY(sv_))->xuv_uv = (val)); \ + } STMT_END + #define SvRV_set(sv, val) \ STMT_START { \ - assert(PL_valid_types_RV[SvTYPE(sv) & SVt_MASK]); \ - assert(!isGV_with_GP(sv)); \ - assert(!(SvTYPE(sv) == SVt_PVIO \ - && !(IoFLAGS(sv) & IOf_FAKE_DIRP))); \ - ((sv)->sv_u.svu_rv = (val)); } STMT_END + SV * sv_ = MUTABLE_SV(sv); \ + assert(PL_valid_types_RV[SvTYPE(sv_) & SVt_MASK]); \ + assert(!isGV_with_GP(sv_)); \ + assert(!(SvTYPE(sv_) == SVt_PVIO \ + && !(IoFLAGS(sv_) & IOf_FAKE_DIRP))); \ + ((sv_)->sv_u.svu_rv = (val)); \ + } STMT_END #define SvMAGIC_set(sv, val) \ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ (((XPVMG*)SvANY(sv))->xmg_u.xmg_magic = (val)); } STMT_END @@ -1414,7 +1547,7 @@ object type. Exposed to perl code via In =for apidoc Am|void|SvPV_renew|SV* sv|STRLEN len Low level micro optimization of C>. It is generally better to use C instead. This is because C ignores potential issues that -C handles. C needs to have a real C that is unencombered by +C handles. C needs to have a real C that is unencumbered by things like COW. Using C or C before calling this should clean it up, but why not just use C if you're not sure about the provenance? @@ -1427,6 +1560,19 @@ why not just use C if you're not (char*)saferealloc((Malloc_t)SvPVX(sv), \ (MEM_SIZE)((n))))); \ } STMT_END +/* +=for apidoc Am|void|SvPV_shrink_to_cur|SV* sv + +Trim any trailing unused memory in the PV of C, which needs to have a real +C that is unencumbered by things like COW. Think first before using this +functionality. Is the space saving really worth giving up COW? Will the +needed size of C stay the same? + +If the answers are both yes, then use L> or +L> before calling this. + +=cut +*/ #define SvPV_shrink_to_cur(sv) STMT_START { \ const STRLEN _lEnGtH = SvCUR(sv) + 1; \ @@ -1581,19 +1727,19 @@ attention to precisely which outputs are /* =for apidoc_section $SV -=for apidoc Am|char*|SvPV_force|SV* sv|STRLEN len -=for apidoc_item ||SvPV_force_nolen|SV* sv -=for apidoc_item ||SvPVx_force|SV* sv|STRLEN len -=for apidoc_item ||SvPV_force_nomg|SV* sv|STRLEN len -=for apidoc_item ||SvPV_force_nomg_nolen|SV * sv -=for apidoc_item ||SvPV_force_mutable|SV * sv|STRLEN len -=for apidoc_item ||SvPV_force_flags|SV * sv|STRLEN len|U32 flags -=for apidoc_item ||SvPV_force_flags_nolen|SV * sv|U32 flags -=for apidoc_item ||SvPV_force_flags_mutable|SV * sv|STRLEN len|U32 flags -=for apidoc_item ||SvPVbyte_force -=for apidoc_item ||SvPVbytex_force -=for apidoc_item ||SvPVutf8_force -=for apidoc_item ||SvPVutf8x_force +=for apidoc Am|char*|SvPV_force |SV* sv|STRLEN len +=for apidoc_item ||SvPV_force_flags |SV * sv|STRLEN len|U32 flags +=for apidoc_item ||SvPV_force_flags_mutable|SV * sv|STRLEN len|U32 flags +=for apidoc_item ||SvPV_force_flags_nolen |SV * sv |U32 flags +=for apidoc_item ||SvPV_force_mutable |SV * sv|STRLEN len +=for apidoc_item ||SvPV_force_nolen |SV* sv +=for apidoc_item ||SvPV_force_nomg |SV* sv|STRLEN len +=for apidoc_item ||SvPV_force_nomg_nolen |SV * sv +=for apidoc_item ||SvPVbyte_force |SV * sv|STRLEN len +=for apidoc_item ||SvPVbytex_force |SV * sv|STRLEN len +=for apidoc_item ||SvPVutf8_force |SV * sv|STRLEN len +=for apidoc_item ||SvPVutf8x_force |SV * sv|STRLEN len +=for apidoc_item ||SvPVx_force |SV* sv|STRLEN len These are like C>, returning the string in the SV, but will force the SV into containing a string (C>), and only a string @@ -1638,37 +1784,37 @@ downgraded from UTF-8, this croaks. C is like C, but guarantees to evaluate C only once; use the more efficient C otherwise. -=for apidoc Am|char*|SvPV|SV* sv|STRLEN len -=for apidoc_item |char*|SvPVx|SV* sv|STRLEN len -=for apidoc_item |char*|SvPV_nomg|SV* sv|STRLEN len -=for apidoc_item |char*|SvPV_nolen|SV* sv -=for apidoc_item |char*|SvPVx_nolen|SV* sv -=for apidoc_item |char*|SvPV_nomg_nolen|SV* sv -=for apidoc_item |char*|SvPV_mutable|SV* sv|STRLEN len -=for apidoc_item |const char*|SvPV_const|SV* sv|STRLEN len -=for apidoc_item |const char*|SvPVx_const|SV* sv|STRLEN len -=for apidoc_item |const char*|SvPV_nolen_const|SV* sv -=for apidoc_item |const char*|SvPVx_nolen_const|SV* sv -=for apidoc_item |const char*|SvPV_nomg_const|SV* sv|STRLEN len +=for apidoc Am | char*|SvPV |SV* sv|STRLEN len +=for apidoc_item |const char*|SvPV_const |SV* sv|STRLEN len +=for apidoc_item | char*|SvPV_flags |SV* sv|STRLEN len|U32 flags +=for apidoc_item |const char*|SvPV_flags_const |SV* sv|STRLEN len|U32 flags +=for apidoc_item | char*|SvPV_flags_mutable |SV* sv|STRLEN len|U32 flags +=for apidoc_item | char*|SvPV_mutable |SV* sv|STRLEN len +=for apidoc_item | char*|SvPV_nolen |SV* sv +=for apidoc_item |const char*|SvPV_nolen_const |SV* sv +=for apidoc_item | char*|SvPV_nomg |SV* sv|STRLEN len +=for apidoc_item |const char*|SvPV_nomg_const |SV* sv|STRLEN len =for apidoc_item |const char*|SvPV_nomg_const_nolen|SV* sv -=for apidoc_item |char *|SvPV_flags|SV * sv|STRLEN len|U32 flags -=for apidoc_item |const char *|SvPV_flags_const|SV * sv|STRLEN len|U32 flags -=for apidoc_item |char *|SvPV_flags_mutable|SV * sv|STRLEN len|U32 flags -=for apidoc_item |char*|SvPVbyte|SV* sv|STRLEN len -=for apidoc_item |char*|SvPVbyte_nomg|SV* sv|STRLEN len -=for apidoc_item |char*|SvPVbyte_nolen|SV* sv -=for apidoc_item |char*|SvPVbytex_nolen|SV* sv -=for apidoc_item |char*|SvPVbytex|SV* sv|STRLEN len -=for apidoc_item |char*|SvPVbyte_or_null|SV* sv|STRLEN len -=for apidoc_item |char*|SvPVbyte_or_null_nomg|SV* sv|STRLEN len -=for apidoc_item |char*|SvPVutf8|SV* sv|STRLEN len -=for apidoc_item |char*|SvPVutf8x|SV* sv|STRLEN len -=for apidoc_item |char*|SvPVutf8_nomg|SV* sv|STRLEN len -=for apidoc_item |char*|SvPVutf8_nolen|SV* sv -=for apidoc_item |char*|SvPVutf8_or_null|SV* sv|STRLEN len -=for apidoc_item |char*|SvPVutf8_or_null_nomg|SV* sv|STRLEN len +=for apidoc_item | char*|SvPV_nomg_nolen |SV* sv +=for apidoc_item | char*|SvPVbyte |SV* sv|STRLEN len +=for apidoc_item | char*|SvPVbyte_nolen |SV* sv +=for apidoc_item | char*|SvPVbyte_nomg |SV* sv|STRLEN len +=for apidoc_item | char*|SvPVbyte_or_null |SV* sv|STRLEN len +=for apidoc_item | char*|SvPVbyte_or_null_nomg|SV* sv|STRLEN len +=for apidoc_item | char*|SvPVbytex |SV* sv|STRLEN len +=for apidoc_item | char*|SvPVbytex_nolen |SV* sv +=for apidoc_item | char*|SvPVutf8 |SV* sv|STRLEN len +=for apidoc_item | char*|SvPVutf8_nolen |SV* sv +=for apidoc_item | char*|SvPVutf8_nomg |SV* sv|STRLEN len +=for apidoc_item | char*|SvPVutf8_or_null |SV* sv|STRLEN len +=for apidoc_item | char*|SvPVutf8_or_null_nomg|SV* sv|STRLEN len +=for apidoc_item | char*|SvPVutf8x |SV* sv|STRLEN len +=for apidoc_item | char*|SvPVx |SV* sv|STRLEN len +=for apidoc_item |const char*|SvPVx_const |SV* sv|STRLEN len +=for apidoc_item | char*|SvPVx_nolen |SV* sv +=for apidoc_item |const char*|SvPVx_nolen_const |SV* sv -All these return a pointer to the string in C, or a stringified form of +These each return a pointer to the string in C, or a stringified form of C if it does not contain a string. The SV may cache the stringified version becoming C. @@ -1714,13 +1860,11 @@ the string (unless you cast away const y The other forms return a mutable pointer so that the string is modifiable by the caller; this is emphasized for the ones with C in their names. -The forms whose name ends in C are the same as the corresponding form -without the C, but the C form is guaranteed to evaluate C exactly -once, with a slight loss of efficiency. Use this if C is an expression -with side effects. +As of 5.38, all forms are guaranteed to evaluate C exactly once. For +earlier Perls, use a form whose name ends with C for single evaluation. C is like C, but converts C to UTF-8 first if not already -UTF-8. Similiarly, the other forms with C in their names correspond to +UTF-8. Similarly, the other forms with C in their names correspond to their respective forms without. C and C don't have corresponding @@ -1729,62 +1873,17 @@ undef, they return C. C is like C, but converts C to byte representation first if currently encoded as UTF-8. If C cannot be downgraded from UTF-8, it -croaks. Similiarly, the other forms with C in their names correspond to +croaks. Similarly, the other forms with C in their names correspond to their respective forms without. C doesn't have a corresponding non-C form. Instead it is like C, but when C is undef, it returns C. -=for apidoc Am|IV|SvIV|SV* sv -=for apidoc_item SvIVx -=for apidoc_item SvIV_nomg - -These coerce the given SV to IV and return it. The returned value in many -circumstances will get stored in C's IV slot, but not in all cases. (Use -C> to make sure it does). - -C is different from the others in that it is guaranteed to evaluate -C exactly once; the others may evaluate it multiple times. Only use this -form if C is an expression with side effects, otherwise use the more -efficient C. - -C is the same as C, but does not perform 'get' magic. - -=for apidoc Am|NV|SvNV|SV* sv -=for apidoc_item SvNVx -=for apidoc_item SvNV_nomg - -These coerce the given SV to NV and return it. The returned value in many -circumstances will get stored in C's NV slot, but not in all cases. (Use -C> to make sure it does). - -C is different from the others in that it is guaranteed to evaluate -C exactly once; the others may evaluate it multiple times. Only use this -form if C is an expression with side effects, otherwise use the more -efficient C. - -C is the same as C, but does not perform 'get' magic. - -=for apidoc Am|UV|SvUV|SV* sv -=for apidoc_item SvUVx -=for apidoc_item SvUV_nomg - -These coerce the given SV to UV and return it. The returned value in many -circumstances will get stored in C's UV slot, but not in all cases. (Use -C> to make sure it does). - -C is different from the others in that it is guaranteed to evaluate -C exactly once; the others may evaluate it multiple times. Only use this -form if C is an expression with side effects, otherwise use the more -efficient C. - -C is the same as C, but does not perform 'get' magic. - -=for apidoc SvTRUE -=for apidoc_item SvTRUEx -=for apidoc_item SvTRUE_nomg +=for apidoc SvTRUE =for apidoc_item SvTRUE_NN +=for apidoc_item SvTRUE_nomg =for apidoc_item SvTRUE_nomg_NN +=for apidoc_item SvTRUEx These return a boolean indicating whether Perl would evaluate the SV as true or false. See C> for a defined/undefined test. @@ -1817,20 +1916,26 @@ scalar. =cut */ -/* Let us hope that bitmaps for UV and IV are the same */ -#define SvIV(sv) (SvIOK_nog(sv) ? SvIVX(sv) : sv_2iv(sv)) -#define SvUV(sv) (SvUOK_nog(sv) ? SvUVX(sv) : sv_2uv(sv)) -#define SvNV(sv) (SvNOK_nog(sv) ? SvNVX(sv) : sv_2nv(sv)) - -#define SvIV_nomg(sv) (SvIOK(sv) ? SvIVX(sv) : sv_2iv_flags(sv, 0)) -#define SvUV_nomg(sv) (SvUOK(sv) ? SvUVX(sv) : sv_2uv_flags(sv, 0)) -#define SvNV_nomg(sv) (SvNOK(sv) ? SvNVX(sv) : sv_2nv_flags(sv, 0)) - -/* ----*/ - -#define SvPV(sv, len) SvPV_flags(sv, len, SV_GMAGIC) -#define SvPV_const(sv, len) SvPV_flags_const(sv, len, SV_GMAGIC) -#define SvPV_mutable(sv, len) SvPV_flags_mutable(sv, len, SV_GMAGIC) +/* To pass the action to the functions called by the following macros */ +typedef enum { + SvPVutf8_type_, + SvPVbyte_type_, + SvPVnormal_type_, + SvPVforce_type_, + SvPVutf8_pure_type_, + SvPVbyte_pure_type_ +} PL_SvPVtype; + +START_EXTERN_C + +/* When this code was written, embed.fnc could not handle function pointer + * parameters; perhaps it still can't */ +#ifndef PERL_NO_INLINE_FUNCTIONS +PERL_STATIC_INLINE char* +Perl_SvPV_helper(pTHX_ SV *const sv, STRLEN *const lp, const U32 flags, const PL_SvPVtype type, char * (*non_trivial)(pTHX_ SV *, STRLEN * const, const U32), const bool or_null, const U32 return_flags); +#endif + +END_EXTERN_C /* This test is "is there a cached PV that we can use directly?" * We can if @@ -1843,120 +1948,98 @@ scalar. #define SvPOK_or_cached_IV(sv) \ (((SvFLAGS(sv) & (SVf_POK|SVs_GMG)) == SVf_POK) || ((SvFLAGS(sv) & (SVf_IOK|SVp_POK|SVs_GMG)) == (SVf_IOK|SVp_POK))) -#define SvPV_flags(sv, len, flags) \ - (SvPOK_or_cached_IV(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &len, flags)) -#define SvPV_flags_const(sv, len, flags) \ - (SvPOK_or_cached_IV(sv) \ - ? ((len = SvCUR(sv)), SvPVX_const(sv)) : \ - (const char*) sv_2pv_flags(sv, &len, (flags|SV_CONST_RETURN))) -#define SvPV_flags_const_nolen(sv, flags) \ - (SvPOK_or_cached_IV(sv) \ - ? SvPVX_const(sv) : \ - (const char*) sv_2pv_flags(sv, 0, (flags|SV_CONST_RETURN))) -#define SvPV_flags_mutable(sv, len, flags) \ - (SvPOK_or_cached_IV(sv) \ - ? ((len = SvCUR(sv)), SvPVX_mutable(sv)) : \ - sv_2pv_flags(sv, &len, (flags|SV_MUTABLE_RETURN))) +#define SvPV_flags(sv, len, flags) \ + Perl_SvPV_helper(aTHX_ sv, &len, flags, SvPVnormal_type_, \ + Perl_sv_2pv_flags, FALSE, 0) +#define SvPV_flags_const(sv, len, flags) \ + ((const char*) Perl_SvPV_helper(aTHX_ sv, &len, flags, SvPVnormal_type_, \ + Perl_sv_2pv_flags, FALSE, \ + SV_CONST_RETURN)) +#define SvPV_flags_const_nolen(sv, flags) \ + ((const char*) Perl_SvPV_helper(aTHX_ sv, NULL, flags, SvPVnormal_type_, \ + Perl_sv_2pv_flags, FALSE, \ + SV_CONST_RETURN)) +#define SvPV_flags_mutable(sv, len, flags) \ + Perl_SvPV_helper(aTHX_ sv, &len, flags, SvPVnormal_type_, \ + Perl_sv_2pv_flags, FALSE, SV_MUTABLE_RETURN) + +#define SvPV_nolen(sv) \ + Perl_SvPV_helper(aTHX_ sv, NULL, SV_GMAGIC, SvPVnormal_type_, \ + Perl_sv_2pv_flags, FALSE, 0) + +#define SvPV_nolen_const(sv) SvPV_flags_const_nolen(sv, SV_GMAGIC) + +#define SvPV(sv, len) SvPV_flags(sv, len, SV_GMAGIC) +#define SvPV_const(sv, len) SvPV_flags_const(sv, len, SV_GMAGIC) +#define SvPV_mutable(sv, len) SvPV_flags_mutable(sv, len, SV_GMAGIC) + +#define SvPV_nomg_nolen(sv) \ + Perl_SvPV_helper(aTHX_ sv, NULL, 0, SvPVnormal_type_,Perl_sv_2pv_flags, \ + FALSE, 0) +#define SvPV_nomg(sv, len) SvPV_flags(sv, len, 0) +#define SvPV_nomg_const(sv, len) SvPV_flags_const(sv, len, 0) +#define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) + +#define SvPV_force_flags(sv, len, flags) \ + Perl_SvPV_helper(aTHX_ sv, &len, flags, SvPVforce_type_, \ + Perl_sv_pvn_force_flags, FALSE, 0) +#define SvPV_force_flags_nolen(sv, flags) \ + Perl_SvPV_helper(aTHX_ sv, NULL, flags, SvPVforce_type_, \ + Perl_sv_pvn_force_flags, FALSE, 0) +#define SvPV_force_flags_mutable(sv, len, flags) \ + Perl_SvPV_helper(aTHX_ sv, &len, flags, SvPVforce_type_, \ + Perl_sv_pvn_force_flags, FALSE, SV_MUTABLE_RETURN) -#define SvPV_force(sv, len) SvPV_force_flags(sv, len, SV_GMAGIC) -#define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) +#define SvPV_force(sv, len) SvPV_force_flags(sv, len, SV_GMAGIC) +#define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) #define SvPV_force_mutable(sv, len) SvPV_force_flags_mutable(sv, len, SV_GMAGIC) -#define SvPV_force_nomg(sv, len) SvPV_force_flags(sv, len, 0) -#define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) +/* "_nomg" in these defines means no mg_get() */ +#define SvPV_force_nomg(sv, len) SvPV_force_flags(sv, len, 0) +#define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) -#define SvPV_force_flags(sv, len, flags) \ - (SvPOK_pure_nogthink(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &len, flags)) - -#define SvPV_force_flags_nolen(sv, flags) \ - (SvPOK_pure_nogthink(sv) \ - ? SvPVX(sv) : sv_pvn_force_flags(sv, 0, flags)) - -#define SvPV_force_flags_mutable(sv, len, flags) \ - (SvPOK_pure_nogthink(sv) \ - ? ((len = SvCUR(sv)), SvPVX_mutable(sv)) \ - : sv_pvn_force_flags(sv, &len, flags|SV_MUTABLE_RETURN)) - -#define SvPV_nolen(sv) \ - (SvPOK_or_cached_IV(sv) \ - ? SvPVX(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC)) +#define SvPVutf8(sv, len) \ + Perl_SvPV_helper(aTHX_ sv, &len, SV_GMAGIC, SvPVutf8_type_, \ + Perl_sv_2pvutf8_flags, FALSE, 0) +#define SvPVutf8_nomg(sv, len) \ + Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVutf8_type_, \ + Perl_sv_2pvutf8_flags, FALSE, 0) +#define SvPVutf8_nolen(sv) \ + Perl_SvPV_helper(aTHX_ sv, NULL, SV_GMAGIC, SvPVutf8_type_, \ + Perl_sv_2pvutf8_flags, FALSE, 0) +#define SvPVutf8_or_null(sv, len) \ + Perl_SvPV_helper(aTHX_ sv, &len, SV_GMAGIC, SvPVutf8_type_, \ + Perl_sv_2pvutf8_flags, TRUE, 0) +#define SvPVutf8_or_null_nomg(sv, len) \ + Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVutf8_type_, \ + Perl_sv_2pvutf8_flags, TRUE, 0) + +#define SvPVbyte(sv, len) \ + Perl_SvPV_helper(aTHX_ sv, &len, SV_GMAGIC, SvPVbyte_type_, \ + Perl_sv_2pvbyte_flags, FALSE, 0) +#define SvPVbyte_nomg(sv, len) \ + Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVbyte_type_, \ + Perl_sv_2pvbyte_flags, FALSE, 0) +#define SvPVbyte_nolen(sv) \ + Perl_SvPV_helper(aTHX_ sv, NULL, SV_GMAGIC, SvPVbyte_type_, \ + Perl_sv_2pvbyte_flags, FALSE, 0) +#define SvPVbyte_or_null(sv, len) \ + Perl_SvPV_helper(aTHX_ sv, &len, SV_GMAGIC, SvPVbyte_type_, \ + Perl_sv_2pvbyte_flags, TRUE, 0) +#define SvPVbyte_or_null_nomg(sv, len) \ + Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVbyte_type_, \ + Perl_sv_2pvbyte_flags, TRUE, 0) + +#define SvPVutf8_force(sv, len) \ + Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVutf8_pure_type_, \ + Perl_sv_pvutf8n_force_wrapper, FALSE, 0) + +#define SvPVbyte_force(sv, len) \ + Perl_SvPV_helper(aTHX_ sv, &len, 0, SvPVbyte_pure_type_, \ + Perl_sv_pvbyten_force_wrapper, FALSE, 0) -/* "_nomg" in these defines means no mg_get() */ -#define SvPV_nomg_nolen(sv) \ - (SvPOK_or_cached_IV(sv) \ - ? SvPVX(sv) : sv_2pv_flags(sv, 0, 0)) - -#define SvPV_nolen_const(sv) \ - (SvPOK_or_cached_IV(sv) \ - ? SvPVX_const(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC|SV_CONST_RETURN)) - -#define SvPV_nomg(sv, len) SvPV_flags(sv, len, 0) -#define SvPV_nomg_const(sv, len) SvPV_flags_const(sv, len, 0) -#define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) - -/* ----*/ - -#define SvPVutf8(sv, len) \ - (SvPOK_utf8_nog(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &len)) - -#define SvPVutf8_or_null(sv, len) \ - (SvPOK_utf8_nog(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : (SvGETMAGIC(sv), SvOK(sv)) \ - ? sv_2pvutf8_flags(sv, &len, 0) : ((len = 0), NULL)) - -#define SvPVutf8_nomg(sv, len) \ - (SvPOK_utf8_nog(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8_flags(sv, &len, 0)) - -#define SvPVutf8_or_null_nomg(sv, len) \ - (SvPOK_utf8_nog(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : SvOK(sv) \ - ? sv_2pvutf8_flags(sv, &len, 0) : ((len = 0), NULL)) - -#define SvPVutf8_force(sv, len) \ - (SvPOK_utf8_pure_nogthink(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_pvutf8n_force(sv, &len)) - -#define SvPVutf8_nolen(sv) \ - (SvPOK_utf8_nog(sv) \ - ? SvPVX(sv) : sv_2pvutf8(sv, 0)) - -/* ----*/ - -#define SvPVbyte(sv, len) \ - (SvPOK_byte_nog(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &len)) - -#define SvPVbyte_or_null(sv, len) \ - (SvPOK_byte_nog(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : (SvGETMAGIC(sv), SvOK(sv)) \ - ? sv_2pvbyte_flags(sv, &len, 0) : ((len = 0), NULL)) - -#define SvPVbyte_nomg(sv, len) \ - (SvPOK_byte_nog(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte_flags(sv, &len, 0)) - -#define SvPVbyte_or_null_nomg(sv, len) \ - (SvPOK_utf8_nog(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : SvOK(sv) \ - ? sv_2pvbyte_flags(sv, &len, 0) : ((len = 0), NULL)) - -#define SvPVbyte_force(sv, len) \ - (SvPOK_byte_pure_nogthink(sv) \ - ? ((len = SvCUR(sv)), SvPVX(sv)) : sv_pvbyten_force(sv, &len)) - -#define SvPVbyte_nolen(sv) \ - (SvPOK_byte_nog(sv) \ - ? SvPVX(sv) : sv_2pvbyte(sv, 0)) - - -/* define FOOx(): idempotent versions of FOO(). If possible, use a local - * var to evaluate the arg once; failing that, use a global if possible; - * failing that, call a function to do the work - */ +/* define FOOx(): Before FOO(x) was inlined, these were idempotent versions of + * FOO(). */ #define SvPVx_force(sv, len) sv_pvn_force(sv, &len) #define SvPVutf8x_force(sv, len) sv_pvutf8n_force(sv, &len) @@ -1966,11 +2049,12 @@ scalar. #define SvTRUEx_nomg(sv) SvTRUE_nomg(sv) #define SvTRUE_nomg_NN(sv) SvTRUE_common(sv, TRUE) +# define SvIVx(sv) SvIV(sv) +# define SvUVx(sv) SvUV(sv) +# define SvNVx(sv) SvNV(sv) + #if defined(PERL_USE_GCC_BRACE_GROUPS) -# define SvIVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvIV(_sv); }) -# define SvUVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvUV(_sv); }) -# define SvNVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvNV(_sv); }) # define SvPVx(sv, len) ({SV *_sv = (sv); SvPV(_sv, len); }) # define SvPVx_const(sv, len) ({SV *_sv = (sv); SvPV_const(_sv, len); }) # define SvPVx_nolen(sv) ({SV *_sv = (sv); SvPV_nolen(_sv); }) @@ -1984,9 +2068,6 @@ scalar. /* These inlined macros use globals, which will require a thread * declaration in user code, so we avoid them under threads */ -# define SvIVx(sv) ((PL_Sv = (sv)), SvIV(PL_Sv)) -# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) -# define SvNVx(sv) ((PL_Sv = (sv)), SvNV(PL_Sv)) # define SvPVx(sv, len) ((PL_Sv = (sv)), SvPV(PL_Sv, len)) # define SvPVx_const(sv, len) ((PL_Sv = (sv)), SvPV_const(PL_Sv, len)) # define SvPVx_nolen(sv) ((PL_Sv = (sv)), SvPV_nolen(PL_Sv)) @@ -1996,30 +2077,6 @@ scalar. # define SvPVbytex_nolen(sv) ((PL_Sv = (sv)), SvPVbyte_nolen(PL_Sv)) #endif /* __GNU__ */ -/* -=for apidoc Am|bool|SvPVXtrue|SV * sv - -Note: This macro may evaluate C more than once. - -Returns a boolean as to whether or not C contains a PV that is considered -TRUE. FALSE is returned if C doesn't contain a PV, or if the PV it does -contain is zero length, or consists of just the single character '0'. Every -other PV value is considered TRUE. - -=cut -*/ - -#define SvPVXtrue(sv) ( \ - ((XPV*)SvANY((sv))) \ - && ( \ - ((XPV*)SvANY((sv)))->xpv_cur > 1 \ - || ( \ - ((XPV*)SvANY((sv)))->xpv_cur \ - && *(sv)->sv_u.svu_pv != '0' \ - ) \ - ) \ -) - #define SvIsCOW(sv) (SvFLAGS(sv) & SVf_IsCOW) #define SvIsCOW_on(sv) (SvFLAGS(sv) |= SVf_IsCOW) #define SvIsCOW_off(sv) (SvFLAGS(sv) &= ~(SVf_IsCOW|SVppv_STATIC)) @@ -2045,31 +2102,33 @@ Returns the hash for C created by C< =cut */ -#define SV_IMMEDIATE_UNREF 1 -#define SV_GMAGIC 2 -#define SV_COW_DROP_PV 4 -#define SV_NOSTEAL 16 -#define SV_CONST_RETURN 32 -#define SV_MUTABLE_RETURN 64 -#define SV_SMAGIC 128 -#define SV_HAS_TRAILING_NUL 256 -#define SV_COW_SHARED_HASH_KEYS 512 +/* Flags used as `U32 flags` arguments to various functions */ +#define SV_IMMEDIATE_UNREF (1 << 0) /* 0x0001 - 1 */ +#define SV_GMAGIC (1 << 1) /* 0x0002 - 2 */ +#define SV_COW_DROP_PV (1 << 2) /* 0x0004 - 4 */ +/* SV_NOT_USED (1 << 3) 0x0008 - 8 */ +#define SV_NOSTEAL (1 << 4) /* 0x0010 - 16 */ +#define SV_CONST_RETURN (1 << 5) /* 0x0020 - 32 */ +#define SV_MUTABLE_RETURN (1 << 6) /* 0x0040 - 64 */ +#define SV_SMAGIC (1 << 7) /* 0x0080 - 128 */ +#define SV_HAS_TRAILING_NUL (1 << 8) /* 0x0100 - 256 */ +#define SV_COW_SHARED_HASH_KEYS (1 << 9) /* 0x0200 - 512 */ /* This one is only enabled for PERL_OLD_COPY_ON_WRITE */ /* XXX This flag actually enabled for any COW. But it appears not to do anything. Can we just remove it? Or will it serve some future purpose. */ -#define SV_COW_OTHER_PVS 1024 +#define SV_COW_OTHER_PVS (1 << 10) /* 0x0400 - 1024 */ /* Make sv_2pv_flags return NULL if something is undefined. */ -#define SV_UNDEF_RETURNS_NULL 2048 +#define SV_UNDEF_RETURNS_NULL (1 << 11) /* 0x0800 - 2048 */ /* Tell sv_utf8_upgrade() to not check to see if an upgrade is really needed. * This is used when the caller has already determined it is, and avoids * redundant work */ -#define SV_FORCE_UTF8_UPGRADE 4096 +#define SV_FORCE_UTF8_UPGRADE (1 << 12) /* 0x1000 - 4096 */ /* if (after resolving magic etc), the SV is found to be overloaded, * don't call the overload magic, just return as-is */ -#define SV_SKIP_OVERLOAD 8192 -#define SV_CATBYTES 16384 -#define SV_CATUTF8 32768 +#define SV_SKIP_OVERLOAD (1 << 13) /* 0x2000 - 8192 */ +#define SV_CATBYTES (1 << 14) /* 0x4000 - 16384 */ +#define SV_CATUTF8 (1 << 15) /* 0x8000 - 32768 */ /* The core is safe for this COW optimisation. XS code on CPAN may not be. So only default to doing the COW setup if we're in the core. @@ -2090,11 +2149,17 @@ Returns the hash for C created by C< #define sv_usepvn(sv, p, l) sv_usepvn_flags(sv, p, l, 0) #define sv_usepvn_mg(sv, p, l) sv_usepvn_flags(sv, p, l, SV_SMAGIC) -/* We are about to replace the SV's current value. So if it's copy on write - we need to normalise it. Use the SV_COW_DROP_PV flag hint to say that - the value is about to get thrown away, so drop the PV rather than go to - the effort of making a read-write copy only for it to get immediately - discarded. */ +/* +=for apidoc Am|void|SV_CHECK_THINKFIRST_COW_DROP|SV * sv + +Call this when you are about to replace the PV value in C, which is +potentially copy-on-write. It stops any sharing with other SVs, so that no +Copy on Write (COW) actually happens. This COW would be useless, as it would +immediately get changed to something else. This function also removes any +other encumbrances that would be problematic when changing C. + +=cut +*/ #define SV_CHECK_THINKFIRST_COW_DROP(sv) if (SvTHINKFIRST(sv)) \ sv_force_normal_flags(sv, SV_COW_DROP_PV) @@ -2114,6 +2179,19 @@ Returns the hash for C created by C< #define CAN_COW_FLAGS (SVp_POK|SVf_POK) +/* +=for apidoc Am|void|SV_CHECK_THINKFIRST|SV * sv + +Remove any encumbrances from C, that need to be taken care of before it +is modifiable. For example if it is Copy on Write (COW), now is the time to +make that copy. + +If you know that you are about to change the PV value of C, instead use +L> to avoid the write that would be +immediately written again. + +=cut +*/ #define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) \ sv_force_normal_flags(sv, 0) @@ -2184,8 +2262,8 @@ Returns the hash for C created by C< sv_utf8_upgrade(nsv); \ sv_catsv_nomg(dsv, nsv); \ } STMT_END -#define sv_catpvn_nomg_maybeutf8(dsv, sstr, slen, is_utf8) \ - sv_catpvn_flags(dsv, sstr, slen, (is_utf8)?SV_CATUTF8:SV_CATBYTES) +#define sv_catpvn_nomg_maybeutf8(dsv, sstr, len, is_utf8) \ + sv_catpvn_flags(dsv, sstr, len, (is_utf8)?SV_CATUTF8:SV_CATBYTES) #if defined(PERL_CORE) || defined(PERL_EXT) # define sv_or_pv_len_utf8(sv, pv, bytelen) \ @@ -2211,21 +2289,16 @@ for the original SV is incremented. /* =for apidoc_section $SV -=for apidoc Am|void|SvGETMAGIC|SV* sv -Invokes C> on an SV if it has 'get' magic. For example, this -will call C on a tied variable. This macro evaluates its -argument more than once. - =for apidoc Am|void|SvSETMAGIC|SV* sv Invokes C> on an SV if it has 'set' magic. This is necessary after modifying a scalar, in case it is a magical variable like C<$|> or a tied variable (it calls C). This macro evaluates its argument more than once. -=for apidoc Am|void|SvSetSV|SV* dsv|SV* ssv -=for apidoc_item SvSetMagicSV -=for apidoc_item SvSetSV_nosteal -=for apidoc_item SvSetMagicSV_nosteal +=for apidoc Am|void|SvSetMagicSV|SV* dsv|SV* ssv +=for apidoc_item SvSetMagicSV_nosteal +=for apidoc_item SvSetSV +=for apidoc_item SvSetSV_nosteal if C is the same as C, these do nothing. Otherwise they all call some form of C>. They may evaluate their arguments more than @@ -2268,29 +2341,42 @@ existing size, but instead it is the tot Ensures that sv is a SVt_PV and that its SvCUR is 0, and that it is properly null terminated. Equivalent to sv_setpvs(""), but more efficient. +=for apidoc Am|char *|SvPVCLEAR_FRESH|SV* sv + +Like SvPVCLEAR, but optimized for newly-minted SVt_PV/PVIV/PVNV/PVMG +that already have a PV buffer allocated, but no SvTHINKFIRST. + =cut */ #define SvPVCLEAR(sv) sv_setpv_bufsize(sv,0,0) +#define SvPVCLEAR_FRESH(sv) sv_setpv_freshbuf(sv) #define SvSHARE(sv) PL_sharehook(aTHX_ sv) #define SvLOCK(sv) PL_lockhook(aTHX_ sv) #define SvUNLOCK(sv) PL_unlockhook(aTHX_ sv) #define SvDESTROYABLE(sv) PL_destroyhook(aTHX_ sv) -#define SvGETMAGIC(x) ((void)(UNLIKELY(SvGMAGICAL(x)) && mg_get(x))) #define SvSETMAGIC(x) STMT_START { if (UNLIKELY(SvSMAGICAL(x))) mg_set(x); } STMT_END #define SvSetSV_and(dst,src,finally) \ STMT_START { \ - if (LIKELY((dst) != (src))) { \ - sv_setsv(dst, src); \ + SV * src_ = src; \ + SV * dst_ = dst; \ + if (LIKELY((dst_) != (src_))) { \ + sv_setsv(dst_, src_); \ finally; \ } \ } STMT_END + #define SvSetSV_nosteal_and(dst,src,finally) \ STMT_START { \ - if (LIKELY((dst) != (src))) { \ - sv_setsv_flags(dst, src, SV_GMAGIC | SV_NOSTEAL | SV_DO_COW_SVSETSV); \ + SV * src_ = src; \ + SV * dst_ = dst; \ + if (LIKELY((dst_) != (src_))) { \ + sv_setsv_flags(dst_, src_, \ + SV_GMAGIC \ + | SV_NOSTEAL \ + | SV_DO_COW_SVSETSV); \ finally; \ } \ } STMT_END @@ -2374,18 +2460,25 @@ Returns a boolean as to whether or not C #define isGV_with_GP(pwadak) \ (((SvFLAGS(pwadak) & (SVp_POK|SVpgv_GP)) == SVpgv_GP) \ && (SvTYPE(pwadak) == SVt_PVGV || SvTYPE(pwadak) == SVt_PVLV)) -#define isGV_with_GP_on(sv) STMT_START { \ - assert (SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV); \ - assert (!SvPOKp(sv)); \ - assert (!SvIOKp(sv)); \ - (SvFLAGS(sv) |= SVpgv_GP); \ + +#define isGV_with_GP_on(sv) \ + STMT_START { \ + SV * sv_ = MUTABLE_SV(sv); \ + assert (SvTYPE(sv_) == SVt_PVGV || SvTYPE(sv_) == SVt_PVLV); \ + assert (!SvPOKp(sv_)); \ + assert (!SvIOKp(sv_)); \ + (SvFLAGS(sv_) |= SVpgv_GP); \ } STMT_END -#define isGV_with_GP_off(sv) STMT_START { \ - assert (SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV); \ - assert (!SvPOKp(sv)); \ - assert (!SvIOKp(sv)); \ - (SvFLAGS(sv) &= ~SVpgv_GP); \ + +#define isGV_with_GP_off(sv) \ + STMT_START { \ + SV * sv_ = MUTABLE_SV(sv); \ + assert (SvTYPE(sv_) == SVt_PVGV || SvTYPE(sv_) == SVt_PVLV); \ + assert (!SvPOKp(sv_)); \ + assert (!SvIOKp(sv_)); \ + (SvFLAGS(sv_) &= ~SVpgv_GP); \ } STMT_END + #ifdef PERL_CORE # define isGV_or_RVCV(kadawp) \ (isGV(kadawp) || (SvROK(kadawp) && SvTYPE(SvRV(kadawp)) == SVt_PVCV)) @@ -2587,12 +2680,36 @@ Create a new IO, setting the reference c * trick and store them in SvANY for SvIV() (and friends) to use. */ # define SET_SVANY_FOR_BODYLESS_IV(sv) \ - SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) \ - - STRUCT_OFFSET(XPVIV, xiv_iv)) + STMT_START { \ + SV * sv_ = MUTABLE_SV(sv); \ + SvANY(sv_) = (XPVIV*)((char*)&(sv_->sv_u.svu_iv) \ + - STRUCT_OFFSET(XPVIV, xiv_iv)); \ + } STMT_END # define SET_SVANY_FOR_BODYLESS_NV(sv) \ - SvANY(sv) = (XPVNV*)((char*)&(sv->sv_u.svu_nv) \ - - STRUCT_OFFSET(XPVNV, xnv_u.xnv_nv)) + STMT_START { \ + SV * sv_ = MUTABLE_SV(sv); \ + SvANY(sv_) = (XPVNV*)((char*)&(sv_->sv_u.svu_nv) \ + - STRUCT_OFFSET(XPVNV, xnv_u.xnv_nv)); \ + } STMT_END + +#if defined(PERL_CORE) && defined(USE_ITHREADS) +/* Certain cases in Perl_ss_dup have been merged, by relying on the fact + that currently av_dup, gv_dup and hv_dup are the same as sv_dup. + If this changes, please unmerge ss_dup. + Likewise, sv_dup_inc_multiple() relies on this fact. */ +# define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup_inc(s,t)) +# define av_dup(s,t) MUTABLE_AV(sv_dup((const SV *)s,t)) +# define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t)) +# define hv_dup(s,t) MUTABLE_HV(sv_dup((const SV *)s,t)) +# define hv_dup_inc(s,t) MUTABLE_HV(sv_dup_inc((const SV *)s,t)) +# define cv_dup(s,t) MUTABLE_CV(sv_dup((const SV *)s,t)) +# define cv_dup_inc(s,t) MUTABLE_CV(sv_dup_inc((const SV *)s,t)) +# define io_dup(s,t) MUTABLE_IO(sv_dup((const SV *)s,t)) +# define io_dup_inc(s,t) MUTABLE_IO(sv_dup_inc((const SV *)s,t)) +# define gv_dup(s,t) MUTABLE_GV(sv_dup((const SV *)s,t)) +# define gv_dup_inc(s,t) MUTABLE_GV(sv_dup_inc((const SV *)s,t)) +#endif /* * ex: set ts=8 sts=4 sw=4 et: Index: gnu/usr.bin/perl/sv_inline.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/sv_inline.h,v diff -u -p -a -u -p -r1.1.1.1 sv_inline.h --- gnu/usr.bin/perl/sv_inline.h 15 Feb 2023 01:31:59 -0000 1.1.1.1 +++ gnu/usr.bin/perl/sv_inline.h 21 Feb 2024 15:47:03 -0000 @@ -125,7 +125,7 @@ struct body_details { U8 body_size; /* Size to allocate */ U8 copy; /* Size of structure to copy (may be shorter) */ U8 offset; /* Size of unalloced ghost fields to first alloced field*/ - PERL_BITFIELD8 type : 4; /* We have space for a sanity check. */ + PERL_BITFIELD8 type : 5; /* We have space for a sanity check. */ PERL_BITFIELD8 cant_upgrade : 1;/* Cannot upgrade this type */ PERL_BITFIELD8 zero_nv : 1; /* zero the NV when upgrading from this */ PERL_BITFIELD8 arena : 1; /* Allocated from an arena */ @@ -149,6 +149,7 @@ ALIGNED_TYPE(XPVHV_WITH_AUX); ALIGNED_TYPE(XPVCV); ALIGNED_TYPE(XPVFM); ALIGNED_TYPE(XPVIO); +ALIGNED_TYPE(XPVOBJ); #define HADNV FALSE #define NONV TRUE @@ -280,6 +281,12 @@ static const struct body_details bodies_ 0, SVt_PVIO, TRUE, NONV, HASARENA, FIT_ARENA(24, sizeof(ALIGNED_TYPE_NAME(XPVIO))) }, + + { sizeof(ALIGNED_TYPE_NAME(XPVOBJ)), + copy_length(XPVOBJ, xobject_fields), + 0, + SVt_PVOBJ, TRUE, NONV, HASARENA, + FIT_ARENA(0, sizeof(ALIGNED_TYPE_NAME(XPVOBJ))) }, }; #define new_body_allocated(sv_type) \ @@ -390,6 +397,7 @@ Perl_newSV_type(pTHX_ const svtype type) break; case SVt_PVHV: case SVt_PVAV: + case SVt_PVOBJ: assert(type_details->body_size); #ifndef PURIFY @@ -409,13 +417,15 @@ Perl_newSV_type(pTHX_ const svtype type) SvSTASH_set(sv, NULL); SvMAGIC_set(sv, NULL); - if (type == SVt_PVAV) { + switch(type) { + case SVt_PVAV: AvFILLp(sv) = -1; AvMAX(sv) = -1; AvALLOC(sv) = NULL; AvREAL_only(sv); - } else { + break; + case SVt_PVHV: HvTOTALKEYS(sv) = 0; /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */ HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX; @@ -427,6 +437,13 @@ Perl_newSV_type(pTHX_ const svtype type) #endif /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */ HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX; + break; + case SVt_PVOBJ: + ObjectMAXFIELD(sv) = -1; + ObjectFIELDS(sv) = NULL; + break; + default: + NOT_REACHED; } sv->sv_u.svu_array = NULL; /* or svu_hash */ @@ -525,6 +542,459 @@ Perl_newSV_type_mortal(pTHX_ const svtyp PL_tmps_stack[ix] = (sv); SvTEMP_on(sv); return sv; +} + +/* The following functions started out in sv.h and then moved to inline.h. They + * moved again into this file during the 5.37.x development cycle. */ + +/* +=for apidoc_section $SV +=for apidoc SvPVXtrue + +Returns a boolean as to whether or not C contains a PV that is considered +TRUE. FALSE is returned if C doesn't contain a PV, or if the PV it does +contain is zero length, or consists of just the single character '0'. Every +other PV value is considered TRUE. + +As of Perl v5.37.1, C is evaluated exactly once; in earlier releases, it +could be evaluated more than once. + +=cut +*/ + +PERL_STATIC_INLINE bool +Perl_SvPVXtrue(pTHX_ SV *sv) +{ + PERL_ARGS_ASSERT_SVPVXTRUE; + + if (! (XPV *) SvANY(sv)) { + return false; + } + + if ( ((XPV *) SvANY(sv))->xpv_cur > 1) { /* length > 1 */ + return true; + } + + if (( (XPV *) SvANY(sv))->xpv_cur == 0) { + return false; + } + + return *sv->sv_u.svu_pv != '0'; +} + +/* +=for apidoc SvGETMAGIC +Invokes C> on an SV if it has 'get' magic. For example, this +will call C on a tied variable. As of 5.37.1, this function is +guaranteed to evaluate its argument exactly once. + +=cut +*/ + +PERL_STATIC_INLINE void +Perl_SvGETMAGIC(pTHX_ SV *sv) +{ + PERL_ARGS_ASSERT_SVGETMAGIC; + + if (UNLIKELY(SvGMAGICAL(sv))) { + mg_get(sv); + } +} + +PERL_STATIC_INLINE bool +Perl_SvTRUE(pTHX_ SV *sv) +{ + PERL_ARGS_ASSERT_SVTRUE; + + if (UNLIKELY(sv == NULL)) + return FALSE; + SvGETMAGIC(sv); + return SvTRUE_nomg_NN(sv); +} + +PERL_STATIC_INLINE bool +Perl_SvTRUE_nomg(pTHX_ SV *sv) +{ + PERL_ARGS_ASSERT_SVTRUE_NOMG; + + if (UNLIKELY(sv == NULL)) + return FALSE; + return SvTRUE_nomg_NN(sv); +} + +PERL_STATIC_INLINE bool +Perl_SvTRUE_NN(pTHX_ SV *sv) +{ + PERL_ARGS_ASSERT_SVTRUE_NN; + + SvGETMAGIC(sv); + return SvTRUE_nomg_NN(sv); +} + +PERL_STATIC_INLINE bool +Perl_SvTRUE_common(pTHX_ SV * sv, const bool sv_2bool_is_fallback) +{ + PERL_ARGS_ASSERT_SVTRUE_COMMON; + + if (UNLIKELY(SvIMMORTAL_INTERP(sv))) + return SvIMMORTAL_TRUE(sv); + + if (! SvOK(sv)) + return FALSE; + + if (SvPOK(sv)) + return SvPVXtrue(sv); + + if (SvIOK(sv)) + return SvIVX(sv) != 0; /* casts to bool */ + + if (SvROK(sv) && !(SvOBJECT(SvRV(sv)) && HvAMAGIC(SvSTASH(SvRV(sv))))) + return TRUE; + + if (sv_2bool_is_fallback) + return sv_2bool_nomg(sv); + + return isGV_with_GP(sv); +} + +PERL_STATIC_INLINE SV * +Perl_SvREFCNT_inc(SV *sv) +{ + if (LIKELY(sv != NULL)) + SvREFCNT(sv)++; + return sv; +} + +PERL_STATIC_INLINE SV * +Perl_SvREFCNT_inc_NN(SV *sv) +{ + PERL_ARGS_ASSERT_SVREFCNT_INC_NN; + + SvREFCNT(sv)++; + return sv; +} + +PERL_STATIC_INLINE void +Perl_SvREFCNT_inc_void(SV *sv) +{ + if (LIKELY(sv != NULL)) + SvREFCNT(sv)++; +} + +PERL_STATIC_INLINE void +Perl_SvREFCNT_dec(pTHX_ SV *sv) +{ + if (LIKELY(sv != NULL)) { + U32 rc = SvREFCNT(sv); + if (LIKELY(rc > 1)) + SvREFCNT(sv) = rc - 1; + else + Perl_sv_free2(aTHX_ sv, rc); + } +} + +PERL_STATIC_INLINE SV * +Perl_SvREFCNT_dec_ret_NULL(pTHX_ SV *sv) +{ + PERL_ARGS_ASSERT_SVREFCNT_DEC_RET_NULL; + Perl_SvREFCNT_dec(aTHX_ sv); + return NULL; +} + + +PERL_STATIC_INLINE void +Perl_SvREFCNT_dec_NN(pTHX_ SV *sv) +{ + U32 rc = SvREFCNT(sv); + + PERL_ARGS_ASSERT_SVREFCNT_DEC_NN; + + if (LIKELY(rc > 1)) + SvREFCNT(sv) = rc - 1; + else + Perl_sv_free2(aTHX_ sv, rc); +} + +/* +=for apidoc SvAMAGIC_on + +Indicate that C has overloading (active magic) enabled. + +=cut +*/ + +PERL_STATIC_INLINE void +Perl_SvAMAGIC_on(SV *sv) +{ + PERL_ARGS_ASSERT_SVAMAGIC_ON; + assert(SvROK(sv)); + + if (SvOBJECT(SvRV(sv))) HvAMAGIC_on(SvSTASH(SvRV(sv))); +} + +/* +=for apidoc SvAMAGIC_off + +Indicate that C has overloading (active magic) disabled. + +=cut +*/ + +PERL_STATIC_INLINE void +Perl_SvAMAGIC_off(SV *sv) +{ + PERL_ARGS_ASSERT_SVAMAGIC_OFF; + + if (SvROK(sv) && SvOBJECT(SvRV(sv))) + HvAMAGIC_off(SvSTASH(SvRV(sv))); +} + +PERL_STATIC_INLINE U32 +Perl_SvPADSTALE_on(SV *sv) +{ + assert(!(SvFLAGS(sv) & SVs_PADTMP)); + return SvFLAGS(sv) |= SVs_PADSTALE; +} +PERL_STATIC_INLINE U32 +Perl_SvPADSTALE_off(SV *sv) +{ + assert(!(SvFLAGS(sv) & SVs_PADTMP)); + return SvFLAGS(sv) &= ~SVs_PADSTALE; +} + +/* +=for apidoc_section $SV +=for apidoc SvIV +=for apidoc_item SvIV_nomg +=for apidoc_item SvIVx + +These each coerce the given SV to IV and return it. The returned value in many +circumstances will get stored in C's IV slot, but not in all cases. (Use +C> to make sure it does). + +As of 5.37.1, all are guaranteed to evaluate C only once. + +C is now identical to C, but prior to 5.37.1, it was the only form +guaranteed to evaluate C only once. + +C is the same as C, but does not perform 'get' magic. + +=for apidoc SvNV +=for apidoc_item SvNV_nomg +=for apidoc_item SvNVx + +These each coerce the given SV to NV and return it. The returned value in many +circumstances will get stored in C's NV slot, but not in all cases. (Use +C> to make sure it does). + +As of 5.37.1, all are guaranteed to evaluate C only once. + +C is now identical to C, but prior to 5.37.1, it was the only form +guaranteed to evaluate C only once. + +C is the same as C, but does not perform 'get' magic. + +=for apidoc SvUV +=for apidoc_item SvUV_nomg +=for apidoc_item SvUVx + +These each coerce the given SV to UV and return it. The returned value in many +circumstances will get stored in C's UV slot, but not in all cases. (Use +C> to make sure it does). + +As of 5.37.1, all are guaranteed to evaluate C only once. + +C is now identical to C, but prior to 5.37.1, it was the only form +guaranteed to evaluate C only once. + +=cut +*/ + +PERL_STATIC_INLINE IV +Perl_SvIV(pTHX_ SV *sv) { + PERL_ARGS_ASSERT_SVIV; + + if (SvIOK_nog(sv)) + return SvIVX(sv); + return sv_2iv(sv); +} + +PERL_STATIC_INLINE UV +Perl_SvUV(pTHX_ SV *sv) { + PERL_ARGS_ASSERT_SVUV; + + if (SvUOK_nog(sv)) + return SvUVX(sv); + return sv_2uv(sv); +} + +PERL_STATIC_INLINE NV +Perl_SvNV(pTHX_ SV *sv) { + PERL_ARGS_ASSERT_SVNV; + + if (SvNOK_nog(sv)) + return SvNVX(sv); + return sv_2nv(sv); +} + +PERL_STATIC_INLINE IV +Perl_SvIV_nomg(pTHX_ SV *sv) { + PERL_ARGS_ASSERT_SVIV_NOMG; + + if (SvIOK(sv)) + return SvIVX(sv); + return sv_2iv_flags(sv, 0); +} + +PERL_STATIC_INLINE UV +Perl_SvUV_nomg(pTHX_ SV *sv) { + PERL_ARGS_ASSERT_SVUV_NOMG; + + if (SvIOK_nog(sv)) + return SvUVX(sv); + return sv_2uv_flags(sv, 0); +} + +PERL_STATIC_INLINE NV +Perl_SvNV_nomg(pTHX_ SV *sv) { + PERL_ARGS_ASSERT_SVNV_NOMG; + + if (SvNOK_nog(sv)) + return SvNVX(sv); + return sv_2nv_flags(sv, 0); +} + +#if defined(PERL_CORE) || defined (PERL_EXT) +PERL_STATIC_INLINE STRLEN +S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp) +{ + PERL_ARGS_ASSERT_SV_OR_PV_POS_U2B; + if (SvGAMAGIC(sv)) { + U8 *hopped = utf8_hop((U8 *)pv, pos); + if (lenp) *lenp = (STRLEN)(utf8_hop(hopped, *lenp) - hopped); + return (STRLEN)(hopped - (U8 *)pv); + } + return sv_pos_u2b_flags(sv,pos,lenp,SV_CONST_RETURN); +} +#endif + +PERL_STATIC_INLINE char * +Perl_sv_pvutf8n_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy) +{ + /* This is just so can be passed to Perl_SvPV_helper() as a function + * pointer with the same signature as all the other such pointers, and + * having hence an unused parameter */ + PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE_WRAPPER; + PERL_UNUSED_ARG(dummy); + + return sv_pvutf8n_force(sv, lp); +} + +PERL_STATIC_INLINE char * +Perl_sv_pvbyten_force_wrapper(pTHX_ SV * const sv, STRLEN * const lp, const U32 dummy) +{ + /* This is just so can be passed to Perl_SvPV_helper() as a function + * pointer with the same signature as all the other such pointers, and + * having hence an unused parameter */ + PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE_WRAPPER; + PERL_UNUSED_ARG(dummy); + + return sv_pvbyten_force(sv, lp); +} + +PERL_STATIC_INLINE char * +Perl_SvPV_helper(pTHX_ + SV * const sv, + STRLEN * const lp, + const U32 flags, + const PL_SvPVtype type, + char * (*non_trivial)(pTHX_ SV *, STRLEN * const, const U32), + const bool or_null, + const U32 return_flags + ) +{ + /* 'type' should be known at compile time, so this is reduced to a single + * conditional at runtime */ + if ( (type == SvPVbyte_type_ && SvPOK_byte_nog(sv)) + || (type == SvPVforce_type_ && SvPOK_pure_nogthink(sv)) + || (type == SvPVutf8_type_ && SvPOK_utf8_nog(sv)) + || (type == SvPVnormal_type_ && SvPOK_nog(sv)) + || (type == SvPVutf8_pure_type_ && SvPOK_utf8_pure_nogthink(sv)) + || (type == SvPVbyte_pure_type_ && SvPOK_byte_pure_nogthink(sv)) + ) { + if (lp) { + *lp = SvCUR(sv); + } + + /* Similarly 'return_flags is known at compile time, so this becomes + * branchless */ + if (return_flags & SV_MUTABLE_RETURN) { + return SvPVX_mutable(sv); + } + else if(return_flags & SV_CONST_RETURN) { + return (char *) SvPVX_const(sv); + } + else { + return SvPVX(sv); + } + } + + if (or_null) { /* This is also known at compile time */ + if (flags & SV_GMAGIC) { /* As is this */ + SvGETMAGIC(sv); + } + + if (! SvOK(sv)) { + if (lp) { /* As is this */ + *lp = 0; + } + + return NULL; + } + } + + /* Can't trivially handle this, call the function */ + return non_trivial(aTHX_ sv, lp, (flags|return_flags)); +} + +/* +=for apidoc newRV_noinc + +Creates an RV wrapper for an SV. The reference count for the original +SV is B incremented. + +=cut +*/ + +PERL_STATIC_INLINE SV * +Perl_newRV_noinc(pTHX_ SV *const tmpRef) +{ + SV *sv = newSV_type(SVt_IV); + + PERL_ARGS_ASSERT_NEWRV_NOINC; + + SvTEMP_off(tmpRef); + + /* inlined, simplified sv_setrv_noinc(sv, tmpRef); */ + SvRV_set(sv, tmpRef); + SvROK_on(sv); + + return sv; +} + +PERL_STATIC_INLINE char * +Perl_sv_setpv_freshbuf(pTHX_ SV *const sv) +{ + PERL_ARGS_ASSERT_SV_SETPV_FRESHBUF; + assert(SvTYPE(sv) >= SVt_PV); + assert(SvTYPE(sv) <= SVt_PVMG); + assert(!SvTHINKFIRST(sv)); + assert(SvPVX(sv)); + SvCUR_set(sv, 0); + *(SvEND(sv))= '\0'; + (void)SvPOK_only_UTF8(sv); + SvTAINT(sv); + return SvPVX(sv); } /* Index: gnu/usr.bin/perl/syscall_emulator.c =================================================================== RCS file: gnu/usr.bin/perl/syscall_emulator.c diff -N gnu/usr.bin/perl/syscall_emulator.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/syscall_emulator.c 21 Feb 2024 15:47:03 -0000 @@ -0,0 +1,1420 @@ +/* + * Generated from gen_syscall_emulator.pl + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "syscall_emulator.h" + +long +syscall_emulator(int syscall, ...) +{ + long ret = 0; + va_list args; + va_start(args, syscall); + + switch(syscall) { + /* Indirect syscalls not supported + *case SYS_syscall: + * ret = syscall(int, ...); + * break; + */ + case SYS_exit: + exit(va_arg(args, int)); // rval + break; + case SYS_fork: + ret = fork(); + break; + case SYS_read: { + int fd = (int)va_arg(args, long); + void * buf = (void *)va_arg(args, long); + size_t nbyte = (size_t)va_arg(args, long); + ret = read(fd, buf, nbyte); + break; + } + case SYS_write: { + int fd = (int)va_arg(args, long); + const void * buf = (const void *)va_arg(args, long); + size_t nbyte = (size_t)va_arg(args, long); + ret = write(fd, buf, nbyte); + break; + } + case SYS_open: { + const char * path = (const char *)va_arg(args, long); + int flags = (int)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + ret = open(path, flags, mode); + break; + } + case SYS_close: + ret = close(va_arg(args, int)); // fd + break; + case SYS_getentropy: { + void * buf = (void *)va_arg(args, long); + size_t nbyte = (size_t)va_arg(args, long); + ret = getentropy(buf, nbyte); + break; + } + /* No signature found in headers + *case SYS___tfork: { + * const struct __tfork * param = (const struct __tfork *)va_arg(args, long); + * size_t psize = (size_t)va_arg(args, long); + * ret = __tfork(param, psize); + * break; + *} + */ + case SYS_link: { + const char * path = (const char *)va_arg(args, long); + const char * _link = (const char *)va_arg(args, long); + ret = link(path, _link); + break; + } + case SYS_unlink: + ret = unlink(va_arg(args, const char *)); // path + break; + case SYS_wait4: { + pid_t pid = (pid_t)va_arg(args, long); + int * status = (int *)va_arg(args, long); + int options = (int)va_arg(args, long); + struct rusage * rusage = (struct rusage *)va_arg(args, long); + ret = wait4(pid, status, options, rusage); + break; + } + case SYS_chdir: + ret = chdir(va_arg(args, const char *)); // path + break; + case SYS_fchdir: + ret = fchdir(va_arg(args, int)); // fd + break; + case SYS_mknod: { + const char * path = (const char *)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + dev_t dev = (dev_t)va_arg(args, long); + ret = mknod(path, mode, dev); + break; + } + case SYS_chmod: { + const char * path = (const char *)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + ret = chmod(path, mode); + break; + } + case SYS_chown: { + const char * path = (const char *)va_arg(args, long); + uid_t uid = (uid_t)va_arg(args, long); + gid_t gid = (gid_t)va_arg(args, long); + ret = chown(path, uid, gid); + break; + } + /* No signature found in headers + *case SYS_break: + * ret = break(char *); + * break; + */ + case SYS_getdtablecount: + ret = getdtablecount(); + break; + case SYS_getrusage: { + int who = (int)va_arg(args, long); + struct rusage * rusage = (struct rusage *)va_arg(args, long); + ret = getrusage(who, rusage); + break; + } + case SYS_getpid: + ret = getpid(); + break; + case SYS_mount: { + const char * type = (const char *)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + int flags = (int)va_arg(args, long); + void * data = (void *)va_arg(args, long); + ret = mount(type, path, flags, data); + break; + } + case SYS_unmount: { + const char * path = (const char *)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = unmount(path, flags); + break; + } + case SYS_setuid: + ret = setuid(va_arg(args, uid_t)); // uid + break; + case SYS_getuid: + ret = getuid(); + break; + case SYS_geteuid: + ret = geteuid(); + break; + case SYS_ptrace: { + int req = (int)va_arg(args, long); + pid_t pid = (pid_t)va_arg(args, long); + caddr_t addr = (caddr_t)va_arg(args, long); + int data = (int)va_arg(args, long); + ret = ptrace(req, pid, addr, data); + break; + } + case SYS_recvmsg: { + int s = (int)va_arg(args, long); + struct msghdr * msg = (struct msghdr *)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = recvmsg(s, msg, flags); + break; + } + case SYS_sendmsg: { + int s = (int)va_arg(args, long); + const struct msghdr * msg = (const struct msghdr *)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = sendmsg(s, msg, flags); + break; + } + case SYS_recvfrom: { + int s = (int)va_arg(args, long); + void * buf = (void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + int flags = (int)va_arg(args, long); + struct sockaddr * from = (struct sockaddr *)va_arg(args, long); + socklen_t * fromlenaddr = (socklen_t *)va_arg(args, long); + ret = recvfrom(s, buf, len, flags, from, fromlenaddr); + break; + } + case SYS_accept: { + int s = (int)va_arg(args, long); + struct sockaddr * name = (struct sockaddr *)va_arg(args, long); + socklen_t * anamelen = (socklen_t *)va_arg(args, long); + ret = accept(s, name, anamelen); + break; + } + case SYS_getpeername: { + int fdes = (int)va_arg(args, long); + struct sockaddr * asa = (struct sockaddr *)va_arg(args, long); + socklen_t * alen = (socklen_t *)va_arg(args, long); + ret = getpeername(fdes, asa, alen); + break; + } + case SYS_getsockname: { + int fdes = (int)va_arg(args, long); + struct sockaddr * asa = (struct sockaddr *)va_arg(args, long); + socklen_t * alen = (socklen_t *)va_arg(args, long); + ret = getsockname(fdes, asa, alen); + break; + } + case SYS_access: { + const char * path = (const char *)va_arg(args, long); + int amode = (int)va_arg(args, long); + ret = access(path, amode); + break; + } + case SYS_chflags: { + const char * path = (const char *)va_arg(args, long); + u_int flags = (u_int)va_arg(args, long); + ret = chflags(path, flags); + break; + } + case SYS_fchflags: { + int fd = (int)va_arg(args, long); + u_int flags = (u_int)va_arg(args, long); + ret = fchflags(fd, flags); + break; + } + case SYS_sync: + sync(); + break; + /* No signature found in headers + *case SYS_msyscall: { + * void * addr = (void *)va_arg(args, long); + * size_t len = (size_t)va_arg(args, long); + * ret = msyscall(addr, len); + * break; + *} + */ + case SYS_stat: { + const char * path = (const char *)va_arg(args, long); + struct stat * ub = (struct stat *)va_arg(args, long); + ret = stat(path, ub); + break; + } + case SYS_getppid: + ret = getppid(); + break; + case SYS_lstat: { + const char * path = (const char *)va_arg(args, long); + struct stat * ub = (struct stat *)va_arg(args, long); + ret = lstat(path, ub); + break; + } + case SYS_dup: + ret = dup(va_arg(args, int)); // fd + break; + case SYS_fstatat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + struct stat * buf = (struct stat *)va_arg(args, long); + int flag = (int)va_arg(args, long); + ret = fstatat(fd, path, buf, flag); + break; + } + case SYS_getegid: + ret = getegid(); + break; + case SYS_profil: { + caddr_t samples = (caddr_t)va_arg(args, long); + size_t size = (size_t)va_arg(args, long); + u_long offset = (u_long)va_arg(args, long); + u_int scale = (u_int)va_arg(args, long); + ret = profil(samples, size, offset, scale); + break; + } + case SYS_ktrace: { + const char * fname = (const char *)va_arg(args, long); + int ops = (int)va_arg(args, long); + int facs = (int)va_arg(args, long); + pid_t pid = (pid_t)va_arg(args, long); + ret = ktrace(fname, ops, facs, pid); + break; + } + case SYS_sigaction: { + int signum = (int)va_arg(args, long); + const struct sigaction * nsa = (const struct sigaction *)va_arg(args, long); + struct sigaction * osa = (struct sigaction *)va_arg(args, long); + ret = sigaction(signum, nsa, osa); + break; + } + case SYS_getgid: + ret = getgid(); + break; + /* Mismatched func: int sigprocmask(int, const sigset_t *, sigset_t *); + * int sigprocmask(int, sigset_t); + *case SYS_sigprocmask: { + * int how = (int)va_arg(args, long); + * sigset_t mask = (sigset_t)va_arg(args, long); + * ret = sigprocmask(how, mask); + * break; + *} + */ + case SYS_mmap: { + void * addr = (void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + int prot = (int)va_arg(args, long); + int flags = (int)va_arg(args, long); + int fd = (int)va_arg(args, long); + off_t pos = (off_t)va_arg(args, long); + ret = (long)mmap(addr, len, prot, flags, fd, pos); + break; + } + case SYS_setlogin: + ret = setlogin(va_arg(args, const char *)); // namebuf + break; + case SYS_acct: + ret = acct(va_arg(args, const char *)); // path + break; + /* Mismatched func: int sigpending(sigset_t *); + * int sigpending(void); + *case SYS_sigpending: + * ret = sigpending(); + * break; + */ + case SYS_fstat: { + int fd = (int)va_arg(args, long); + struct stat * sb = (struct stat *)va_arg(args, long); + ret = fstat(fd, sb); + break; + } + case SYS_ioctl: { + int fd = (int)va_arg(args, long); + u_long com = (u_long)va_arg(args, long); + void * data = (void *)va_arg(args, long); + ret = ioctl(fd, com, data); + break; + } + case SYS_reboot: + ret = reboot(va_arg(args, int)); // opt + break; + case SYS_revoke: + ret = revoke(va_arg(args, const char *)); // path + break; + case SYS_symlink: { + const char * path = (const char *)va_arg(args, long); + const char * link = (const char *)va_arg(args, long); + ret = symlink(path, link); + break; + } + case SYS_readlink: { + const char * path = (const char *)va_arg(args, long); + char * buf = (char *)va_arg(args, long); + size_t count = (size_t)va_arg(args, long); + ret = readlink(path, buf, count); + break; + } + case SYS_execve: { + const char * path = (const char *)va_arg(args, long); + char *const * argp = (char *const *)va_arg(args, long); + char *const * envp = (char *const *)va_arg(args, long); + ret = execve(path, argp, envp); + break; + } + case SYS_umask: + ret = umask(va_arg(args, mode_t)); // newmask + break; + case SYS_chroot: + ret = chroot(va_arg(args, const char *)); // path + break; + case SYS_getfsstat: { + struct statfs * buf = (struct statfs *)va_arg(args, long); + size_t bufsize = (size_t)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = getfsstat(buf, bufsize, flags); + break; + } + case SYS_statfs: { + const char * path = (const char *)va_arg(args, long); + struct statfs * buf = (struct statfs *)va_arg(args, long); + ret = statfs(path, buf); + break; + } + case SYS_fstatfs: { + int fd = (int)va_arg(args, long); + struct statfs * buf = (struct statfs *)va_arg(args, long); + ret = fstatfs(fd, buf); + break; + } + case SYS_fhstatfs: { + const fhandle_t * fhp = (const fhandle_t *)va_arg(args, long); + struct statfs * buf = (struct statfs *)va_arg(args, long); + ret = fhstatfs(fhp, buf); + break; + } + case SYS_vfork: + ret = vfork(); + break; + case SYS_gettimeofday: { + struct timeval * tp = (struct timeval *)va_arg(args, long); + struct timezone * tzp = (struct timezone *)va_arg(args, long); + ret = gettimeofday(tp, tzp); + break; + } + case SYS_settimeofday: { + const struct timeval * tv = (const struct timeval *)va_arg(args, long); + const struct timezone * tzp = (const struct timezone *)va_arg(args, long); + ret = settimeofday(tv, tzp); + break; + } + case SYS_setitimer: { + int which = (int)va_arg(args, long); + const struct itimerval * itv = (const struct itimerval *)va_arg(args, long); + struct itimerval * oitv = (struct itimerval *)va_arg(args, long); + ret = setitimer(which, itv, oitv); + break; + } + case SYS_getitimer: { + int which = (int)va_arg(args, long); + struct itimerval * itv = (struct itimerval *)va_arg(args, long); + ret = getitimer(which, itv); + break; + } + case SYS_select: { + int nd = (int)va_arg(args, long); + fd_set * in = (fd_set *)va_arg(args, long); + fd_set * ou = (fd_set *)va_arg(args, long); + fd_set * ex = (fd_set *)va_arg(args, long); + struct timeval * tv = (struct timeval *)va_arg(args, long); + ret = select(nd, in, ou, ex, tv); + break; + } + case SYS_kevent: { + int fd = (int)va_arg(args, long); + const struct kevent * changelist = (const struct kevent *)va_arg(args, long); + int nchanges = (int)va_arg(args, long); + struct kevent * eventlist = (struct kevent *)va_arg(args, long); + int nevents = (int)va_arg(args, long); + const struct timespec * timeout = (const struct timespec *)va_arg(args, long); + ret = kevent(fd, changelist, nchanges, eventlist, nevents, timeout); + break; + } + case SYS_munmap: { + void * addr = (void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + ret = munmap(addr, len); + break; + } + case SYS_mprotect: { + void * addr = (void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + int prot = (int)va_arg(args, long); + ret = mprotect(addr, len, prot); + break; + } + case SYS_madvise: { + void * addr = (void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + int behav = (int)va_arg(args, long); + ret = madvise(addr, len, behav); + break; + } + case SYS_utimes: { + const char * path = (const char *)va_arg(args, long); + const struct timeval * tptr = (const struct timeval *)va_arg(args, long); + ret = utimes(path, tptr); + break; + } + case SYS_futimes: { + int fd = (int)va_arg(args, long); + const struct timeval * tptr = (const struct timeval *)va_arg(args, long); + ret = futimes(fd, tptr); + break; + } + case SYS_mquery: { + void * addr = (void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + int prot = (int)va_arg(args, long); + int flags = (int)va_arg(args, long); + int fd = (int)va_arg(args, long); + off_t pos = (off_t)va_arg(args, long); + ret = (long)mquery(addr, len, prot, flags, fd, pos); + break; + } + case SYS_getgroups: { + int gidsetsize = (int)va_arg(args, long); + gid_t * gidset = (gid_t *)va_arg(args, long); + ret = getgroups(gidsetsize, gidset); + break; + } + case SYS_setgroups: { + int gidsetsize = (int)va_arg(args, long); + const gid_t * gidset = (const gid_t *)va_arg(args, long); + ret = setgroups(gidsetsize, gidset); + break; + } + case SYS_getpgrp: + ret = getpgrp(); + break; + case SYS_setpgid: { + pid_t pid = (pid_t)va_arg(args, long); + pid_t pgid = (pid_t)va_arg(args, long); + ret = setpgid(pid, pgid); + break; + } + case SYS_futex: { + uint32_t * f = (uint32_t *)va_arg(args, long); + int op = (int)va_arg(args, long); + int val = (int)va_arg(args, long); + const struct timespec * timeout = (const struct timespec *)va_arg(args, long); + uint32_t * g = (uint32_t *)va_arg(args, long); + ret = futex(f, op, val, timeout, g); + break; + } + case SYS_utimensat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + const struct timespec * times = (const struct timespec *)va_arg(args, long); + int flag = (int)va_arg(args, long); + ret = utimensat(fd, path, times, flag); + break; + } + case SYS_futimens: { + int fd = (int)va_arg(args, long); + const struct timespec * times = (const struct timespec *)va_arg(args, long); + ret = futimens(fd, times); + break; + } + /* No signature found in headers + *case SYS_kbind: { + * const struct __kbind * param = (const struct __kbind *)va_arg(args, long); + * size_t psize = (size_t)va_arg(args, long); + * int64_t proc_cookie = (int64_t)va_arg(args, long); + * ret = kbind(param, psize, proc_cookie); + * break; + *} + */ + case SYS_clock_gettime: { + clockid_t clock_id = (clockid_t)va_arg(args, long); + struct timespec * tp = (struct timespec *)va_arg(args, long); + ret = clock_gettime(clock_id, tp); + break; + } + case SYS_clock_settime: { + clockid_t clock_id = (clockid_t)va_arg(args, long); + const struct timespec * tp = (const struct timespec *)va_arg(args, long); + ret = clock_settime(clock_id, tp); + break; + } + case SYS_clock_getres: { + clockid_t clock_id = (clockid_t)va_arg(args, long); + struct timespec * tp = (struct timespec *)va_arg(args, long); + ret = clock_getres(clock_id, tp); + break; + } + case SYS_dup2: { + int from = (int)va_arg(args, long); + int to = (int)va_arg(args, long); + ret = dup2(from, to); + break; + } + case SYS_nanosleep: { + const struct timespec * rqtp = (const struct timespec *)va_arg(args, long); + struct timespec * rmtp = (struct timespec *)va_arg(args, long); + ret = nanosleep(rqtp, rmtp); + break; + } + case SYS_fcntl: { + int fd = (int)va_arg(args, long); + int cmd = (int)va_arg(args, long); + void * arg = (void *)va_arg(args, long); + ret = fcntl(fd, cmd, arg); + break; + } + case SYS_accept4: { + int s = (int)va_arg(args, long); + struct sockaddr * name = (struct sockaddr *)va_arg(args, long); + socklen_t * anamelen = (socklen_t *)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = accept4(s, name, anamelen, flags); + break; + } + /* No signature found in headers + *case SYS___thrsleep: { + * const volatile void * ident = (const volatile void *)va_arg(args, long); + * clockid_t clock_id = (clockid_t)va_arg(args, long); + * const struct timespec * tp = (const struct timespec *)va_arg(args, long); + * void * lock = (void *)va_arg(args, long); + * const int * abort = (const int *)va_arg(args, long); + * ret = __thrsleep(ident, clock_id, tp, lock, abort); + * break; + *} + */ + case SYS_fsync: + ret = fsync(va_arg(args, int)); // fd + break; + case SYS_setpriority: { + int which = (int)va_arg(args, long); + id_t who = (id_t)va_arg(args, long); + int prio = (int)va_arg(args, long); + ret = setpriority(which, who, prio); + break; + } + case SYS_socket: { + int domain = (int)va_arg(args, long); + int type = (int)va_arg(args, long); + int protocol = (int)va_arg(args, long); + ret = socket(domain, type, protocol); + break; + } + case SYS_connect: { + int s = (int)va_arg(args, long); + const struct sockaddr * name = (const struct sockaddr *)va_arg(args, long); + socklen_t namelen = (socklen_t)va_arg(args, long); + ret = connect(s, name, namelen); + break; + } + case SYS_getdents: { + int fd = (int)va_arg(args, long); + void * buf = (void *)va_arg(args, long); + size_t buflen = (size_t)va_arg(args, long); + ret = getdents(fd, buf, buflen); + break; + } + case SYS_getpriority: { + int which = (int)va_arg(args, long); + id_t who = (id_t)va_arg(args, long); + ret = getpriority(which, who); + break; + } + case SYS_pipe2: { + int * fdp = (int *)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = pipe2(fdp, flags); + break; + } + case SYS_dup3: { + int from = (int)va_arg(args, long); + int to = (int)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = dup3(from, to, flags); + break; + } + /* No signature found in headers + *case SYS_sigreturn: + * ret = sigreturn(va_arg(args, struct sigcontext *)); // sigcntxp + * break; + */ + case SYS_bind: { + int s = (int)va_arg(args, long); + const struct sockaddr * name = (const struct sockaddr *)va_arg(args, long); + socklen_t namelen = (socklen_t)va_arg(args, long); + ret = bind(s, name, namelen); + break; + } + case SYS_setsockopt: { + int s = (int)va_arg(args, long); + int level = (int)va_arg(args, long); + int name = (int)va_arg(args, long); + const void * val = (const void *)va_arg(args, long); + socklen_t valsize = (socklen_t)va_arg(args, long); + ret = setsockopt(s, level, name, val, valsize); + break; + } + case SYS_listen: { + int s = (int)va_arg(args, long); + int backlog = (int)va_arg(args, long); + ret = listen(s, backlog); + break; + } + case SYS_chflagsat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + u_int flags = (u_int)va_arg(args, long); + int atflags = (int)va_arg(args, long); + ret = chflagsat(fd, path, flags, atflags); + break; + } + case SYS_pledge: { + const char * promises = (const char *)va_arg(args, long); + const char * execpromises = (const char *)va_arg(args, long); + ret = pledge(promises, execpromises); + break; + } + case SYS_ppoll: { + struct pollfd * fds = (struct pollfd *)va_arg(args, long); + u_int nfds = (u_int)va_arg(args, long); + const struct timespec * ts = (const struct timespec *)va_arg(args, long); + const sigset_t * mask = (const sigset_t *)va_arg(args, long); + ret = ppoll(fds, nfds, ts, mask); + break; + } + case SYS_pselect: { + int nd = (int)va_arg(args, long); + fd_set * in = (fd_set *)va_arg(args, long); + fd_set * ou = (fd_set *)va_arg(args, long); + fd_set * ex = (fd_set *)va_arg(args, long); + const struct timespec * ts = (const struct timespec *)va_arg(args, long); + const sigset_t * mask = (const sigset_t *)va_arg(args, long); + ret = pselect(nd, in, ou, ex, ts, mask); + break; + } + /* Mismatched func: int sigsuspend(const sigset_t *); + * int sigsuspend(int); + *case SYS_sigsuspend: + * ret = sigsuspend(va_arg(args, int)); // mask + * break; + */ + case SYS_sendsyslog: { + const char * buf = (const char *)va_arg(args, long); + size_t nbyte = (size_t)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = sendsyslog(buf, nbyte, flags); + break; + } + case SYS_unveil: { + const char * path = (const char *)va_arg(args, long); + const char * permissions = (const char *)va_arg(args, long); + ret = unveil(path, permissions); + break; + } + /* No signature found in headers + *case SYS___realpath: { + * const char * pathname = (const char *)va_arg(args, long); + * char * resolved = (char *)va_arg(args, long); + * ret = __realpath(pathname, resolved); + * break; + *} + */ + case SYS_recvmmsg: { + int s = (int)va_arg(args, long); + struct mmsghdr * mmsg = (struct mmsghdr *)va_arg(args, long); + unsigned int vlen = (unsigned int)va_arg(args, long); + int flags = (int)va_arg(args, long); + struct timespec * timeout = (struct timespec *)va_arg(args, long); + ret = recvmmsg(s, mmsg, vlen, flags, timeout); + break; + } + case SYS_sendmmsg: { + int s = (int)va_arg(args, long); + struct mmsghdr * mmsg = (struct mmsghdr *)va_arg(args, long); + unsigned int vlen = (unsigned int)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = sendmmsg(s, mmsg, vlen, flags); + break; + } + case SYS_getsockopt: { + int s = (int)va_arg(args, long); + int level = (int)va_arg(args, long); + int name = (int)va_arg(args, long); + void * val = (void *)va_arg(args, long); + socklen_t * avalsize = (socklen_t *)va_arg(args, long); + ret = getsockopt(s, level, name, val, avalsize); + break; + } + case SYS_thrkill: { + pid_t tid = (pid_t)va_arg(args, long); + int signum = (int)va_arg(args, long); + void * tcb = (void *)va_arg(args, long); + ret = thrkill(tid, signum, tcb); + break; + } + case SYS_readv: { + int fd = (int)va_arg(args, long); + const struct iovec * iovp = (const struct iovec *)va_arg(args, long); + int iovcnt = (int)va_arg(args, long); + ret = readv(fd, iovp, iovcnt); + break; + } + case SYS_writev: { + int fd = (int)va_arg(args, long); + const struct iovec * iovp = (const struct iovec *)va_arg(args, long); + int iovcnt = (int)va_arg(args, long); + ret = writev(fd, iovp, iovcnt); + break; + } + case SYS_kill: { + int pid = (int)va_arg(args, long); + int signum = (int)va_arg(args, long); + ret = kill(pid, signum); + break; + } + case SYS_fchown: { + int fd = (int)va_arg(args, long); + uid_t uid = (uid_t)va_arg(args, long); + gid_t gid = (gid_t)va_arg(args, long); + ret = fchown(fd, uid, gid); + break; + } + case SYS_fchmod: { + int fd = (int)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + ret = fchmod(fd, mode); + break; + } + case SYS_setreuid: { + uid_t ruid = (uid_t)va_arg(args, long); + uid_t euid = (uid_t)va_arg(args, long); + ret = setreuid(ruid, euid); + break; + } + case SYS_setregid: { + gid_t rgid = (gid_t)va_arg(args, long); + gid_t egid = (gid_t)va_arg(args, long); + ret = setregid(rgid, egid); + break; + } + case SYS_rename: { + const char * from = (const char *)va_arg(args, long); + const char * to = (const char *)va_arg(args, long); + ret = rename(from, to); + break; + } + case SYS_flock: { + int fd = (int)va_arg(args, long); + int how = (int)va_arg(args, long); + ret = flock(fd, how); + break; + } + case SYS_mkfifo: { + const char * path = (const char *)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + ret = mkfifo(path, mode); + break; + } + case SYS_sendto: { + int s = (int)va_arg(args, long); + const void * buf = (const void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + int flags = (int)va_arg(args, long); + const struct sockaddr * to = (const struct sockaddr *)va_arg(args, long); + socklen_t tolen = (socklen_t)va_arg(args, long); + ret = sendto(s, buf, len, flags, to, tolen); + break; + } + case SYS_shutdown: { + int s = (int)va_arg(args, long); + int how = (int)va_arg(args, long); + ret = shutdown(s, how); + break; + } + case SYS_socketpair: { + int domain = (int)va_arg(args, long); + int type = (int)va_arg(args, long); + int protocol = (int)va_arg(args, long); + int * rsv = (int *)va_arg(args, long); + ret = socketpair(domain, type, protocol, rsv); + break; + } + case SYS_mkdir: { + const char * path = (const char *)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + ret = mkdir(path, mode); + break; + } + case SYS_rmdir: + ret = rmdir(va_arg(args, const char *)); // path + break; + case SYS_adjtime: { + const struct timeval * delta = (const struct timeval *)va_arg(args, long); + struct timeval * olddelta = (struct timeval *)va_arg(args, long); + ret = adjtime(delta, olddelta); + break; + } + /* Mismatched func: int getlogin_r(char *, size_t); + * int getlogin_r(char *, u_int); + *case SYS_getlogin_r: { + * char * namebuf = (char *)va_arg(args, long); + * u_int namelen = (u_int)va_arg(args, long); + * ret = getlogin_r(namebuf, namelen); + * break; + *} + */ + case SYS_getthrname: { + pid_t tid = (pid_t)va_arg(args, long); + char * name = (char *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + ret = getthrname(tid, name, len); + break; + } + case SYS_setthrname: { + pid_t tid = (pid_t)va_arg(args, long); + const char * name = (const char *)va_arg(args, long); + ret = setthrname(tid, name); + break; + } + /* No signature found in headers + *case SYS_pinsyscall: { + * int syscall = (int)va_arg(args, long); + * void * addr = (void *)va_arg(args, long); + * size_t len = (size_t)va_arg(args, long); + * ret = pinsyscall(syscall, addr, len); + * break; + *} + */ + case SYS_setsid: + ret = setsid(); + break; + case SYS_quotactl: { + const char * path = (const char *)va_arg(args, long); + int cmd = (int)va_arg(args, long); + int uid = (int)va_arg(args, long); + char * arg = (char *)va_arg(args, long); + ret = quotactl(path, cmd, uid, arg); + break; + } + /* No signature found in headers + *case SYS_ypconnect: + * ret = ypconnect(va_arg(args, int)); // type + * break; + */ + case SYS_nfssvc: { + int flag = (int)va_arg(args, long); + void * argp = (void *)va_arg(args, long); + ret = nfssvc(flag, argp); + break; + } + case SYS_mimmutable: { + void * addr = (void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + ret = mimmutable(addr, len); + break; + } + case SYS_waitid: { + int idtype = (int)va_arg(args, long); + id_t id = (id_t)va_arg(args, long); + siginfo_t * info = (siginfo_t *)va_arg(args, long); + int options = (int)va_arg(args, long); + ret = waitid(idtype, id, info, options); + break; + } + case SYS_getfh: { + const char * fname = (const char *)va_arg(args, long); + fhandle_t * fhp = (fhandle_t *)va_arg(args, long); + ret = getfh(fname, fhp); + break; + } + /* No signature found in headers + *case SYS___tmpfd: + * ret = __tmpfd(va_arg(args, int)); // flags + * break; + */ + /* No signature found in headers + *case SYS_sysarch: { + * int op = (int)va_arg(args, long); + * void * parms = (void *)va_arg(args, long); + * ret = sysarch(op, parms); + * break; + *} + */ + case SYS_lseek: { + int fd = (int)va_arg(args, long); + off_t offset = (off_t)va_arg(args, long); + int whence = (int)va_arg(args, long); + ret = lseek(fd, offset, whence); + break; + } + case SYS_truncate: { + const char * path = (const char *)va_arg(args, long); + off_t length = (off_t)va_arg(args, long); + ret = truncate(path, length); + break; + } + case SYS_ftruncate: { + int fd = (int)va_arg(args, long); + off_t length = (off_t)va_arg(args, long); + ret = ftruncate(fd, length); + break; + } + case SYS_pread: { + int fd = (int)va_arg(args, long); + void * buf = (void *)va_arg(args, long); + size_t nbyte = (size_t)va_arg(args, long); + off_t offset = (off_t)va_arg(args, long); + ret = pread(fd, buf, nbyte, offset); + break; + } + case SYS_pwrite: { + int fd = (int)va_arg(args, long); + const void * buf = (const void *)va_arg(args, long); + size_t nbyte = (size_t)va_arg(args, long); + off_t offset = (off_t)va_arg(args, long); + ret = pwrite(fd, buf, nbyte, offset); + break; + } + case SYS_preadv: { + int fd = (int)va_arg(args, long); + const struct iovec * iovp = (const struct iovec *)va_arg(args, long); + int iovcnt = (int)va_arg(args, long); + off_t offset = (off_t)va_arg(args, long); + ret = preadv(fd, iovp, iovcnt, offset); + break; + } + case SYS_pwritev: { + int fd = (int)va_arg(args, long); + const struct iovec * iovp = (const struct iovec *)va_arg(args, long); + int iovcnt = (int)va_arg(args, long); + off_t offset = (off_t)va_arg(args, long); + ret = pwritev(fd, iovp, iovcnt, offset); + break; + } + case SYS_setgid: + ret = setgid(va_arg(args, gid_t)); // gid + break; + case SYS_setegid: + ret = setegid(va_arg(args, gid_t)); // egid + break; + case SYS_seteuid: + ret = seteuid(va_arg(args, uid_t)); // euid + break; + case SYS_pathconf: { + const char * path = (const char *)va_arg(args, long); + int name = (int)va_arg(args, long); + ret = pathconf(path, name); + break; + } + case SYS_fpathconf: { + int fd = (int)va_arg(args, long); + int name = (int)va_arg(args, long); + ret = fpathconf(fd, name); + break; + } + case SYS_swapctl: { + int cmd = (int)va_arg(args, long); + const void * arg = (const void *)va_arg(args, long); + int misc = (int)va_arg(args, long); + ret = swapctl(cmd, arg, misc); + break; + } + case SYS_getrlimit: { + int which = (int)va_arg(args, long); + struct rlimit * rlp = (struct rlimit *)va_arg(args, long); + ret = getrlimit(which, rlp); + break; + } + case SYS_setrlimit: { + int which = (int)va_arg(args, long); + const struct rlimit * rlp = (const struct rlimit *)va_arg(args, long); + ret = setrlimit(which, rlp); + break; + } + case SYS_sysctl: { + const int * name = (const int *)va_arg(args, long); + u_int namelen = (u_int)va_arg(args, long); + void * old = (void *)va_arg(args, long); + size_t * oldlenp = (size_t *)va_arg(args, long); + void * new = (void *)va_arg(args, long); + size_t newlen = (size_t)va_arg(args, long); + ret = sysctl(name, namelen, old, oldlenp, new, newlen); + break; + } + case SYS_mlock: { + const void * addr = (const void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + ret = mlock(addr, len); + break; + } + case SYS_munlock: { + const void * addr = (const void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + ret = munlock(addr, len); + break; + } + case SYS_getpgid: + ret = getpgid(va_arg(args, pid_t)); // pid + break; + case SYS_utrace: { + const char * label = (const char *)va_arg(args, long); + const void * addr = (const void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + ret = utrace(label, addr, len); + break; + } + case SYS_semget: { + key_t key = (key_t)va_arg(args, long); + int nsems = (int)va_arg(args, long); + int semflg = (int)va_arg(args, long); + ret = semget(key, nsems, semflg); + break; + } + case SYS_msgget: { + key_t key = (key_t)va_arg(args, long); + int msgflg = (int)va_arg(args, long); + ret = msgget(key, msgflg); + break; + } + case SYS_msgsnd: { + int msqid = (int)va_arg(args, long); + const void * msgp = (const void *)va_arg(args, long); + size_t msgsz = (size_t)va_arg(args, long); + int msgflg = (int)va_arg(args, long); + ret = msgsnd(msqid, msgp, msgsz, msgflg); + break; + } + case SYS_msgrcv: { + int msqid = (int)va_arg(args, long); + void * msgp = (void *)va_arg(args, long); + size_t msgsz = (size_t)va_arg(args, long); + long msgtyp = (long)va_arg(args, long); + int msgflg = (int)va_arg(args, long); + ret = msgrcv(msqid, msgp, msgsz, msgtyp, msgflg); + break; + } + case SYS_shmat: { + int shmid = (int)va_arg(args, long); + const void * shmaddr = (const void *)va_arg(args, long); + int shmflg = (int)va_arg(args, long); + ret = (long)shmat(shmid, shmaddr, shmflg); + break; + } + case SYS_shmdt: + ret = shmdt(va_arg(args, const void *)); // shmaddr + break; + case SYS_minherit: { + void * addr = (void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + int inherit = (int)va_arg(args, long); + ret = minherit(addr, len, inherit); + break; + } + case SYS_poll: { + struct pollfd * fds = (struct pollfd *)va_arg(args, long); + u_int nfds = (u_int)va_arg(args, long); + int timeout = (int)va_arg(args, long); + ret = poll(fds, nfds, timeout); + break; + } + case SYS_issetugid: + ret = issetugid(); + break; + case SYS_lchown: { + const char * path = (const char *)va_arg(args, long); + uid_t uid = (uid_t)va_arg(args, long); + gid_t gid = (gid_t)va_arg(args, long); + ret = lchown(path, uid, gid); + break; + } + case SYS_getsid: + ret = getsid(va_arg(args, pid_t)); // pid + break; + case SYS_msync: { + void * addr = (void *)va_arg(args, long); + size_t len = (size_t)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = msync(addr, len, flags); + break; + } + case SYS_pipe: + ret = pipe(va_arg(args, int *)); // fdp + break; + case SYS_fhopen: { + const fhandle_t * fhp = (const fhandle_t *)va_arg(args, long); + int flags = (int)va_arg(args, long); + ret = fhopen(fhp, flags); + break; + } + case SYS_kqueue: + ret = kqueue(); + break; + case SYS_mlockall: + ret = mlockall(va_arg(args, int)); // flags + break; + case SYS_munlockall: + ret = munlockall(); + break; + case SYS_getresuid: { + uid_t * ruid = (uid_t *)va_arg(args, long); + uid_t * euid = (uid_t *)va_arg(args, long); + uid_t * suid = (uid_t *)va_arg(args, long); + ret = getresuid(ruid, euid, suid); + break; + } + case SYS_setresuid: { + uid_t ruid = (uid_t)va_arg(args, long); + uid_t euid = (uid_t)va_arg(args, long); + uid_t suid = (uid_t)va_arg(args, long); + ret = setresuid(ruid, euid, suid); + break; + } + case SYS_getresgid: { + gid_t * rgid = (gid_t *)va_arg(args, long); + gid_t * egid = (gid_t *)va_arg(args, long); + gid_t * sgid = (gid_t *)va_arg(args, long); + ret = getresgid(rgid, egid, sgid); + break; + } + case SYS_setresgid: { + gid_t rgid = (gid_t)va_arg(args, long); + gid_t egid = (gid_t)va_arg(args, long); + gid_t sgid = (gid_t)va_arg(args, long); + ret = setresgid(rgid, egid, sgid); + break; + } + case SYS_closefrom: + ret = closefrom(va_arg(args, int)); // fd + break; + case SYS_sigaltstack: { + const struct sigaltstack * nss = (const struct sigaltstack *)va_arg(args, long); + struct sigaltstack * oss = (struct sigaltstack *)va_arg(args, long); + ret = sigaltstack(nss, oss); + break; + } + case SYS_shmget: { + key_t key = (key_t)va_arg(args, long); + size_t size = (size_t)va_arg(args, long); + int shmflg = (int)va_arg(args, long); + ret = shmget(key, size, shmflg); + break; + } + case SYS_semop: { + int semid = (int)va_arg(args, long); + struct sembuf * sops = (struct sembuf *)va_arg(args, long); + size_t nsops = (size_t)va_arg(args, long); + ret = semop(semid, sops, nsops); + break; + } + case SYS_fhstat: { + const fhandle_t * fhp = (const fhandle_t *)va_arg(args, long); + struct stat * sb = (struct stat *)va_arg(args, long); + ret = fhstat(fhp, sb); + break; + } + case SYS___semctl: { + int semid = (int)va_arg(args, long); + int semnum = (int)va_arg(args, long); + int cmd = (int)va_arg(args, long); + union semun * arg = (union semun *)va_arg(args, long); + ret = __semctl(semid, semnum, cmd, arg); + break; + } + case SYS_shmctl: { + int shmid = (int)va_arg(args, long); + int cmd = (int)va_arg(args, long); + struct shmid_ds * buf = (struct shmid_ds *)va_arg(args, long); + ret = shmctl(shmid, cmd, buf); + break; + } + case SYS_msgctl: { + int msqid = (int)va_arg(args, long); + int cmd = (int)va_arg(args, long); + struct msqid_ds * buf = (struct msqid_ds *)va_arg(args, long); + ret = msgctl(msqid, cmd, buf); + break; + } + case SYS_sched_yield: + ret = sched_yield(); + break; + case SYS_getthrid: + ret = getthrid(); + break; + /* No signature found in headers + *case SYS___thrwakeup: { + * const volatile void * ident = (const volatile void *)va_arg(args, long); + * int n = (int)va_arg(args, long); + * ret = __thrwakeup(ident, n); + * break; + *} + */ + /* No signature found in headers + *case SYS___threxit: + * __threxit(va_arg(args, pid_t *)); // notdead + * break; + */ + /* No signature found in headers + *case SYS___thrsigdivert: { + * sigset_t sigmask = (sigset_t)va_arg(args, long); + * siginfo_t * info = (siginfo_t *)va_arg(args, long); + * const struct timespec * timeout = (const struct timespec *)va_arg(args, long); + * ret = __thrsigdivert(sigmask, info, timeout); + * break; + *} + */ + /* No signature found in headers + *case SYS___getcwd: { + * char * buf = (char *)va_arg(args, long); + * size_t len = (size_t)va_arg(args, long); + * ret = __getcwd(buf, len); + * break; + *} + */ + case SYS_adjfreq: { + const int64_t * freq = (const int64_t *)va_arg(args, long); + int64_t * oldfreq = (int64_t *)va_arg(args, long); + ret = adjfreq(freq, oldfreq); + break; + } + case SYS_setrtable: + ret = setrtable(va_arg(args, int)); // rtableid + break; + case SYS_getrtable: + ret = getrtable(); + break; + case SYS_faccessat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + int amode = (int)va_arg(args, long); + int flag = (int)va_arg(args, long); + ret = faccessat(fd, path, amode, flag); + break; + } + case SYS_fchmodat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + int flag = (int)va_arg(args, long); + ret = fchmodat(fd, path, mode, flag); + break; + } + case SYS_fchownat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + uid_t uid = (uid_t)va_arg(args, long); + gid_t gid = (gid_t)va_arg(args, long); + int flag = (int)va_arg(args, long); + ret = fchownat(fd, path, uid, gid, flag); + break; + } + case SYS_linkat: { + int fd1 = (int)va_arg(args, long); + const char * path1 = (const char *)va_arg(args, long); + int fd2 = (int)va_arg(args, long); + const char * path2 = (const char *)va_arg(args, long); + int flag = (int)va_arg(args, long); + ret = linkat(fd1, path1, fd2, path2, flag); + break; + } + case SYS_mkdirat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + ret = mkdirat(fd, path, mode); + break; + } + case SYS_mkfifoat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + ret = mkfifoat(fd, path, mode); + break; + } + case SYS_mknodat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + dev_t dev = (dev_t)va_arg(args, long); + ret = mknodat(fd, path, mode, dev); + break; + } + case SYS_openat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + int flags = (int)va_arg(args, long); + mode_t mode = (mode_t)va_arg(args, long); + ret = openat(fd, path, flags, mode); + break; + } + case SYS_readlinkat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + char * buf = (char *)va_arg(args, long); + size_t count = (size_t)va_arg(args, long); + ret = readlinkat(fd, path, buf, count); + break; + } + case SYS_renameat: { + int fromfd = (int)va_arg(args, long); + const char * from = (const char *)va_arg(args, long); + int tofd = (int)va_arg(args, long); + const char * to = (const char *)va_arg(args, long); + ret = renameat(fromfd, from, tofd, to); + break; + } + case SYS_symlinkat: { + const char * path = (const char *)va_arg(args, long); + int fd = (int)va_arg(args, long); + const char * link = (const char *)va_arg(args, long); + ret = symlinkat(path, fd, link); + break; + } + case SYS_unlinkat: { + int fd = (int)va_arg(args, long); + const char * path = (const char *)va_arg(args, long); + int flag = (int)va_arg(args, long); + ret = unlinkat(fd, path, flag); + break; + } + case SYS___set_tcb: + __set_tcb(va_arg(args, void *)); // tcb + break; + case SYS___get_tcb: + ret = (long)__get_tcb(); + break; + default: + ret = -1; + errno = ENOSYS; + } + va_end(args); + + return ret; +} Index: gnu/usr.bin/perl/taint.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/taint.c,v diff -u -p -a -u -p -r1.20 taint.c --- gnu/usr.bin/perl/taint.c 15 Feb 2023 01:36:13 -0000 1.20 +++ gnu/usr.bin/perl/taint.c 21 Feb 2024 15:47:03 -0000 @@ -34,7 +34,9 @@ Implements the L macro, w void Perl_taint_proper(pTHX_ const char *f, const char *const s) { - /* Output a tainting violation, croaking unless we're just to warn. + /* Don't use directly; instead use TAINT_PROPER + * + * Output a tainting violation, croaking unless we're just to warn. * '_proper' is just to throw you off the scent */ #if defined(HAS_SETEUID) && defined(DEBUGGING) @@ -95,6 +97,8 @@ Implements the L macro, whic void Perl_taint_env(pTHX) { + /* Don't use directly; instead use TAINT_ENV */ + SV** svp; const char* const *e; static const char* const misc_env[] = { Index: gnu/usr.bin/perl/thread.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/thread.h,v diff -u -p -a -u -p -r1.4 thread.h --- gnu/usr.bin/perl/thread.h 15 Feb 2023 01:36:13 -0000 1.4 +++ gnu/usr.bin/perl/thread.h 21 Feb 2024 15:47:03 -0000 @@ -174,20 +174,20 @@ # ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED /* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */ # define MUTEX_INIT(m) \ - STMT_START { \ - int _eC_; \ - Zero((m), 1, perl_mutex); \ - if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \ - Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \ - _eC_, __FILE__, __LINE__); \ + STMT_START { \ + int _eC_; \ + Zero((m), 1, perl_mutex); \ + if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default)))\ + Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END # else # define MUTEX_INIT(m) \ STMT_START { \ int _eC_; \ - if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \ - Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \ - _eC_, __FILE__, __LINE__); \ + if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \ + Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ } STMT_END # endif @@ -199,28 +199,38 @@ # define perl_pthread_mutex_unlock(m) pthread_mutex_unlock(m) # endif -# define MUTEX_LOCK(m) \ +# define MUTEX_LOCK(m) \ STMT_START { \ + dSAVE_ERRNO; \ int _eC_; \ - if ((_eC_ = perl_pthread_mutex_lock((m)))) \ - Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]", \ + if ((_eC_ = perl_pthread_mutex_lock((m)))) \ + Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]",\ _eC_, __FILE__, __LINE__); \ + RESTORE_ERRNO; \ } STMT_END -# define MUTEX_UNLOCK(m) \ +# define MUTEX_UNLOCK(m) \ STMT_START { \ + dSAVE_ERRNO; /* Shouldn't be necessary as panics if fails */\ int _eC_; \ - if ((_eC_ = perl_pthread_mutex_unlock((m)))) \ - Perl_croak_nocontext("panic: MUTEX_UNLOCK (%d) [%s:%d]", \ + if ((_eC_ = perl_pthread_mutex_unlock((m)))) { \ + Perl_croak_nocontext( \ + "panic: MUTEX_UNLOCK (%d) [%s:%d]", \ _eC_, __FILE__, __LINE__); \ + } \ + RESTORE_ERRNO; \ } STMT_END -# define MUTEX_DESTROY(m) \ - STMT_START { \ - int _eC_; \ - if ((_eC_ = pthread_mutex_destroy((m)))) \ - Perl_croak_nocontext("panic: MUTEX_DESTROY (%d) [%s:%d]", \ - _eC_, __FILE__, __LINE__); \ +# define MUTEX_DESTROY(m) \ + STMT_START { \ + int _eC_; \ + if ((_eC_ = pthread_mutex_destroy((m)))) { \ + dTHX; \ + if (PL_phase != PERL_PHASE_DESTRUCT) { \ + Perl_croak_nocontext("panic: MUTEX_DESTROY (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ + } \ + } \ } STMT_END #endif /* MUTEX_INIT */ @@ -258,11 +268,15 @@ } STMT_END # define COND_DESTROY(c) \ - STMT_START { \ - int _eC_; \ - if ((_eC_ = pthread_cond_destroy((c)))) \ - Perl_croak_nocontext("panic: COND_DESTROY (%d) [%s:%d]", \ - _eC_, __FILE__, __LINE__); \ + STMT_START { \ + int _eC_; \ + if ((_eC_ = pthread_cond_destroy((c)))) { \ + dTHX; \ + if (PL_phase != PERL_PHASE_DESTRUCT) { \ + Perl_croak_nocontext("panic: COND_DESTROY (%d) [%s:%d]", \ + _eC_, __FILE__, __LINE__); \ + } \ + } \ } STMT_END #endif /* COND_INIT */ @@ -390,12 +404,14 @@ extern PERL_THREAD_LOCAL void *PL_curren /* We must also call pthread_setspecific() always, as C++ code has to read it * with pthreads (the #else side just below) */ -# define PERL_SET_CONTEXT(t) \ - STMT_START { \ - int _eC_; \ - if ((_eC_ = pthread_setspecific(PL_thr_key, PL_current_context = (void *)(t)))) \ +# define PERL_SET_CONTEXT(t) \ + STMT_START { \ + int _eC_; \ + if ((_eC_ = pthread_setspecific(PL_thr_key, \ + PL_current_context = (void *)(t)))) \ Perl_croak_nocontext("panic: pthread_setspecific (%d) [%s:%d]", \ - _eC_, __FILE__, __LINE__); \ + _eC_, __FILE__, __LINE__); \ + PERL_SET_NON_tTHX_CONTEXT(t); \ } STMT_END #else Index: gnu/usr.bin/perl/time64.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/time64.c,v diff -u -p -a -u -p -r1.5 time64.c --- gnu/usr.bin/perl/time64.c 15 Feb 2023 01:36:13 -0000 1.5 +++ gnu/usr.bin/perl/time64.c 21 Feb 2024 15:47:03 -0000 @@ -26,6 +26,33 @@ THE SOFTWARE. */ + +/* + * This thing all things devours: + * Birds, beasts, trees, flowers; + * Gnaws iron, bites steel; + * Grinds hard stones to meal; + * Slays king, ruins town, + * And beats high mountain down." + * + * Poor Bilbo sat in the dark thinking of all the horrible names of all the + * giants and ogres he had ever heard told of in tales, but not one of them had + * done all these things. He had a feeling that the answer was quite different + * and that he ought to know it, but he could not think of it. He began to get + * frightened, and that is bad for thinking. Gollum began to get out of his + * boat. He flapped into the water and paddled to the bank; Bilbo could see his + * eyes coming towards him. His tongue seemed to stick in his mouth; he wanted + * to shout out: "Give me more time! Give me time!" But all that came out with + * a sudden squeal was: + * + * "Time! Time!" + * + * Bilbo was saved by pure luck. For that of course was the answer. + * + * [p.84 of _The Hobbit_: "Riddles in the Dark"] + * +*/ + /* Programmers who have available to them 64-bit time values as a 'long @@ -113,40 +140,6 @@ static const short safe_years[SOLAR_CYCL # define TIME64_TRACE1(format, var1) ((void)0) # define TIME64_TRACE2(format, var1, var2) ((void)0) # define TIME64_TRACE3(format, var1, var2, var3) ((void)0) -#endif - -/* Set up the mutexes for this file. There are no races possible on - * non-threaded perls, nor platforms that naturally don't have them. - * Otherwise, we need to have mutexes. If we have reentrant versions of the - * functions below, they automatically will be substituted for the - * non-reentrant ones. That solves the problem of the buffers being trashed by - * another thread, but not of the environment or locale changing during their - * execution. To do that, we only need a read lock (which prevents writing by - * others). However, if we don't have re-entrant functions, we can gain some - * measure of thread-safety by using an exclusive lock during their execution. - * That will protect against any other use of the functions that use the - * mutexes, which all of core should be using. */ -#ifdef USE_REENTRANT_API /* This indicates a platform where we need reentrant - versions if have them */ -# ifdef PERL_REENTR_USING_LOCALTIME_R -# define LOCALTIME_LOCK ENV_LOCALE_READ_LOCK -# define LOCALTIME_UNLOCK ENV_LOCALE_READ_UNLOCK -# else -# define LOCALTIME_LOCK ENV_LOCALE_LOCK -# define LOCALTIME_UNLOCK ENV_LOCALE_UNLOCK -# endif -# ifdef PERL_REENTR_USING_GMTIME_R -# define GMTIME_LOCK ENV_LOCALE_READ_LOCK -# define GMTIME_UNLOCK ENV_LOCALE_READ_UNLOCK -# else -# define GMTIME_LOCK ENV_LOCALE_LOCK -# define GMTIME_UNLOCK ENV_LOCALE_UNLOCK -# endif -#else /* Reentrant not needed, so races not possible */ -# define LOCALTIME_LOCK NOOP -# define LOCALTIME_UNLOCK NOOP -# define GMTIME_LOCK NOOP -# define GMTIME_UNLOCK NOOP #endif static int S_is_exception_century(Year year) Index: gnu/usr.bin/perl/toke.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/toke.c,v diff -u -p -a -u -p -r1.27 toke.c --- gnu/usr.bin/perl/toke.c 15 Feb 2023 01:36:13 -0000 1.27 +++ gnu/usr.bin/perl/toke.c 21 Feb 2024 15:47:03 -0000 @@ -115,6 +115,15 @@ static const char ident_var_zero_multi_d * 1999-02-27 mjd-perl-patch@plover.com */ #define isCONTROLVAR(x) (isUPPER(x) || memCHRs("[\\]^_?", (x))) +/* Non-identifier plugin infix operators are allowed any printing character + * except spaces, digits, or identifier chars + */ +#define isPLUGINFIX(c) (c && !isSPACE(c) && !isDIGIT(c) && !isALPHA(c)) +/* Plugin infix operators may not begin with a quote symbol */ +#define isPLUGINFIX_FIRST(c) (isPLUGINFIX(c) && c != '"' && c != '\'') + +#define PLUGINFIX_IS_ENABLED UNLIKELY(PL_infix_plugin != &Perl_infix_plugin_standard) + #define SPACE_OR_TAB(c) isBLANK_A(c) #define HEXFP_PEEK(s) \ @@ -226,6 +235,7 @@ static const char* const lex_state_names #define PRETERMBLOCK(retval) return (PL_expect = XTERMBLOCK,PL_bufptr = s, REPORT(retval)) #define PREREF(retval) return (PL_expect = XREF,PL_bufptr = s, REPORT(retval)) #define TERM(retval) return (CLINE, PL_expect = XOPERATOR, PL_bufptr = s, REPORT(retval)) +#define PHASERBLOCK(f) return (pl_yylval.ival=f, PL_expect = XBLOCK, PL_bufptr = s, REPORT((int)PHASER)) #define POSTDEREF(f) return (PL_bufptr = s, S_postderef(aTHX_ REPORT(f),s[1])) #define LOOPX(f) return (PL_bufptr = force_word(s,BAREWORD,TRUE,FALSE), \ pl_yylval.ival=f, \ @@ -410,106 +420,121 @@ static struct debug_tokens { const char *name; } const debug_tokens[] = { - { ADDOP, TOKENTYPE_OPNUM, "ADDOP" }, - { ANDAND, TOKENTYPE_NONE, "ANDAND" }, - { ANDOP, TOKENTYPE_NONE, "ANDOP" }, - { ANONSUB, TOKENTYPE_IVAL, "ANONSUB" }, - { ANON_SIGSUB, TOKENTYPE_IVAL, "ANON_SIGSUB" }, - { ARROW, TOKENTYPE_NONE, "ARROW" }, - { ASSIGNOP, TOKENTYPE_OPNUM, "ASSIGNOP" }, - { BITANDOP, TOKENTYPE_OPNUM, "BITANDOP" }, - { BITOROP, TOKENTYPE_OPNUM, "BITOROP" }, - { CATCH, TOKENTYPE_IVAL, "CATCH" }, - { CHEQOP, TOKENTYPE_OPNUM, "CHEQOP" }, - { CHRELOP, TOKENTYPE_OPNUM, "CHRELOP" }, - { COLONATTR, TOKENTYPE_NONE, "COLONATTR" }, - { CONTINUE, TOKENTYPE_NONE, "CONTINUE" }, - { DEFAULT, TOKENTYPE_NONE, "DEFAULT" }, - { DO, TOKENTYPE_NONE, "DO" }, - { DOLSHARP, TOKENTYPE_NONE, "DOLSHARP" }, - { DORDOR, TOKENTYPE_NONE, "DORDOR" }, - { DOTDOT, TOKENTYPE_IVAL, "DOTDOT" }, - { ELSE, TOKENTYPE_NONE, "ELSE" }, - { ELSIF, TOKENTYPE_IVAL, "ELSIF" }, - { FOR, TOKENTYPE_IVAL, "FOR" }, - { FORMAT, TOKENTYPE_NONE, "FORMAT" }, - { FORMLBRACK, TOKENTYPE_NONE, "FORMLBRACK" }, - { FORMRBRACK, TOKENTYPE_NONE, "FORMRBRACK" }, - { FUNC, TOKENTYPE_OPNUM, "FUNC" }, - { FUNC0, TOKENTYPE_OPNUM, "FUNC0" }, - { FUNC0OP, TOKENTYPE_OPVAL, "FUNC0OP" }, - { FUNC0SUB, TOKENTYPE_OPVAL, "FUNC0SUB" }, - { FUNC1, TOKENTYPE_OPNUM, "FUNC1" }, - { FUNCMETH, TOKENTYPE_OPVAL, "FUNCMETH" }, - { GIVEN, TOKENTYPE_IVAL, "GIVEN" }, - { HASHBRACK, TOKENTYPE_NONE, "HASHBRACK" }, - { IF, TOKENTYPE_IVAL, "IF" }, - { LABEL, TOKENTYPE_OPVAL, "LABEL" }, - { LOCAL, TOKENTYPE_IVAL, "LOCAL" }, - { LOOPEX, TOKENTYPE_OPNUM, "LOOPEX" }, - { LSTOP, TOKENTYPE_OPNUM, "LSTOP" }, - { LSTOPSUB, TOKENTYPE_OPVAL, "LSTOPSUB" }, - { MATCHOP, TOKENTYPE_OPNUM, "MATCHOP" }, - { METHOD, TOKENTYPE_OPVAL, "METHOD" }, - { MULOP, TOKENTYPE_OPNUM, "MULOP" }, - { MY, TOKENTYPE_IVAL, "MY" }, - { NCEQOP, TOKENTYPE_OPNUM, "NCEQOP" }, - { NCRELOP, TOKENTYPE_OPNUM, "NCRELOP" }, - { NOAMP, TOKENTYPE_NONE, "NOAMP" }, - { NOTOP, TOKENTYPE_NONE, "NOTOP" }, - { OROP, TOKENTYPE_IVAL, "OROP" }, - { OROR, TOKENTYPE_NONE, "OROR" }, - { PACKAGE, TOKENTYPE_NONE, "PACKAGE" }, - DEBUG_TOKEN (IVAL, PERLY_AMPERSAND), - DEBUG_TOKEN (IVAL, PERLY_BRACE_CLOSE), - DEBUG_TOKEN (IVAL, PERLY_BRACE_OPEN), - DEBUG_TOKEN (IVAL, PERLY_BRACKET_CLOSE), - DEBUG_TOKEN (IVAL, PERLY_BRACKET_OPEN), - DEBUG_TOKEN (IVAL, PERLY_COLON), - DEBUG_TOKEN (IVAL, PERLY_COMMA), - DEBUG_TOKEN (IVAL, PERLY_DOT), - DEBUG_TOKEN (IVAL, PERLY_EQUAL_SIGN), - DEBUG_TOKEN (IVAL, PERLY_EXCLAMATION_MARK), - DEBUG_TOKEN (IVAL, PERLY_MINUS), - DEBUG_TOKEN (IVAL, PERLY_PAREN_OPEN), - DEBUG_TOKEN (IVAL, PERLY_PERCENT_SIGN), - DEBUG_TOKEN (IVAL, PERLY_PLUS), - DEBUG_TOKEN (IVAL, PERLY_QUESTION_MARK), - DEBUG_TOKEN (IVAL, PERLY_SEMICOLON), - DEBUG_TOKEN (IVAL, PERLY_SLASH), - DEBUG_TOKEN (IVAL, PERLY_SNAIL), - DEBUG_TOKEN (IVAL, PERLY_STAR), - DEBUG_TOKEN (IVAL, PERLY_TILDE), - { PLUGEXPR, TOKENTYPE_OPVAL, "PLUGEXPR" }, - { PLUGSTMT, TOKENTYPE_OPVAL, "PLUGSTMT" }, - { PMFUNC, TOKENTYPE_OPVAL, "PMFUNC" }, - { POSTJOIN, TOKENTYPE_NONE, "POSTJOIN" }, - { POSTDEC, TOKENTYPE_NONE, "POSTDEC" }, - { POSTINC, TOKENTYPE_NONE, "POSTINC" }, - { POWOP, TOKENTYPE_OPNUM, "POWOP" }, - { PREDEC, TOKENTYPE_NONE, "PREDEC" }, - { PREINC, TOKENTYPE_NONE, "PREINC" }, - { PRIVATEREF, TOKENTYPE_OPVAL, "PRIVATEREF" }, - { QWLIST, TOKENTYPE_OPVAL, "QWLIST" }, - { REFGEN, TOKENTYPE_NONE, "REFGEN" }, - { REQUIRE, TOKENTYPE_NONE, "REQUIRE" }, - { SHIFTOP, TOKENTYPE_OPNUM, "SHIFTOP" }, - { SIGSUB, TOKENTYPE_NONE, "SIGSUB" }, - { SUB, TOKENTYPE_NONE, "SUB" }, - { SUBLEXEND, TOKENTYPE_NONE, "SUBLEXEND" }, - { SUBLEXSTART, TOKENTYPE_NONE, "SUBLEXSTART" }, - { THING, TOKENTYPE_OPVAL, "THING" }, - { TRY, TOKENTYPE_IVAL, "TRY" }, - { UMINUS, TOKENTYPE_NONE, "UMINUS" }, - { UNIOP, TOKENTYPE_OPNUM, "UNIOP" }, - { UNIOPSUB, TOKENTYPE_OPVAL, "UNIOPSUB" }, - { UNLESS, TOKENTYPE_IVAL, "UNLESS" }, - { UNTIL, TOKENTYPE_IVAL, "UNTIL" }, - { USE, TOKENTYPE_IVAL, "USE" }, - { WHEN, TOKENTYPE_IVAL, "WHEN" }, - { WHILE, TOKENTYPE_IVAL, "WHILE" }, - { BAREWORD, TOKENTYPE_OPVAL, "BAREWORD" }, - { YADAYADA, TOKENTYPE_IVAL, "YADAYADA" }, + DEBUG_TOKEN (OPNUM, ADDOP), + DEBUG_TOKEN (NONE, ANDAND), + DEBUG_TOKEN (NONE, ANDOP), + DEBUG_TOKEN (NONE, ARROW), + DEBUG_TOKEN (OPNUM, ASSIGNOP), + DEBUG_TOKEN (OPNUM, BITANDOP), + DEBUG_TOKEN (OPNUM, BITOROP), + DEBUG_TOKEN (OPNUM, CHEQOP), + DEBUG_TOKEN (OPNUM, CHRELOP), + DEBUG_TOKEN (NONE, COLONATTR), + DEBUG_TOKEN (NONE, DOLSHARP), + DEBUG_TOKEN (NONE, DORDOR), + DEBUG_TOKEN (IVAL, DOTDOT), + DEBUG_TOKEN (NONE, FORMLBRACK), + DEBUG_TOKEN (NONE, FORMRBRACK), + DEBUG_TOKEN (OPNUM, FUNC), + DEBUG_TOKEN (OPNUM, FUNC0), + DEBUG_TOKEN (OPVAL, FUNC0OP), + DEBUG_TOKEN (OPVAL, FUNC0SUB), + DEBUG_TOKEN (OPNUM, FUNC1), + DEBUG_TOKEN (NONE, HASHBRACK), + DEBUG_TOKEN (IVAL, KW_CATCH), + DEBUG_TOKEN (IVAL, KW_CLASS), + DEBUG_TOKEN (IVAL, KW_CONTINUE), + DEBUG_TOKEN (IVAL, KW_DEFAULT), + DEBUG_TOKEN (IVAL, KW_DO), + DEBUG_TOKEN (IVAL, KW_ELSE), + DEBUG_TOKEN (IVAL, KW_ELSIF), + DEBUG_TOKEN (IVAL, KW_FIELD), + DEBUG_TOKEN (IVAL, KW_GIVEN), + DEBUG_TOKEN (IVAL, KW_FOR), + DEBUG_TOKEN (IVAL, KW_FORMAT), + DEBUG_TOKEN (IVAL, KW_IF), + DEBUG_TOKEN (IVAL, KW_LOCAL), + DEBUG_TOKEN (IVAL, KW_METHOD_anon), + DEBUG_TOKEN (IVAL, KW_METHOD_named), + DEBUG_TOKEN (IVAL, KW_MY), + DEBUG_TOKEN (IVAL, KW_PACKAGE), + DEBUG_TOKEN (IVAL, KW_REQUIRE), + DEBUG_TOKEN (IVAL, KW_SUB_anon), + DEBUG_TOKEN (IVAL, KW_SUB_anon_sig), + DEBUG_TOKEN (IVAL, KW_SUB_named), + DEBUG_TOKEN (IVAL, KW_SUB_named_sig), + DEBUG_TOKEN (IVAL, KW_TRY), + DEBUG_TOKEN (IVAL, KW_USE_or_NO), + DEBUG_TOKEN (IVAL, KW_UNLESS), + DEBUG_TOKEN (IVAL, KW_UNTIL), + DEBUG_TOKEN (IVAL, KW_WHEN), + DEBUG_TOKEN (IVAL, KW_WHILE), + DEBUG_TOKEN (OPVAL, LABEL), + DEBUG_TOKEN (OPNUM, LOOPEX), + DEBUG_TOKEN (OPNUM, LSTOP), + DEBUG_TOKEN (OPVAL, LSTOPSUB), + DEBUG_TOKEN (OPNUM, MATCHOP), + DEBUG_TOKEN (OPVAL, METHCALL), + DEBUG_TOKEN (OPVAL, METHCALL0), + DEBUG_TOKEN (OPNUM, MULOP), + DEBUG_TOKEN (OPNUM, NCEQOP), + DEBUG_TOKEN (OPNUM, NCRELOP), + DEBUG_TOKEN (NONE, NOAMP), + DEBUG_TOKEN (NONE, NOTOP), + DEBUG_TOKEN (IVAL, OROP), + DEBUG_TOKEN (NONE, OROR), + DEBUG_TOKEN (IVAL, PERLY_AMPERSAND), + DEBUG_TOKEN (IVAL, PERLY_BRACE_CLOSE), + DEBUG_TOKEN (IVAL, PERLY_BRACE_OPEN), + DEBUG_TOKEN (IVAL, PERLY_BRACKET_CLOSE), + DEBUG_TOKEN (IVAL, PERLY_BRACKET_OPEN), + DEBUG_TOKEN (IVAL, PERLY_COLON), + DEBUG_TOKEN (IVAL, PERLY_COMMA), + DEBUG_TOKEN (IVAL, PERLY_DOT), + DEBUG_TOKEN (IVAL, PERLY_EQUAL_SIGN), + DEBUG_TOKEN (IVAL, PERLY_EXCLAMATION_MARK), + DEBUG_TOKEN (IVAL, PERLY_MINUS), + DEBUG_TOKEN (IVAL, PERLY_PAREN_OPEN), + DEBUG_TOKEN (IVAL, PERLY_PERCENT_SIGN), + DEBUG_TOKEN (IVAL, PERLY_PLUS), + DEBUG_TOKEN (IVAL, PERLY_QUESTION_MARK), + DEBUG_TOKEN (IVAL, PERLY_SEMICOLON), + DEBUG_TOKEN (IVAL, PERLY_SLASH), + DEBUG_TOKEN (IVAL, PERLY_SNAIL), + DEBUG_TOKEN (IVAL, PERLY_STAR), + DEBUG_TOKEN (IVAL, PERLY_TILDE), + DEBUG_TOKEN (OPVAL, PLUGEXPR), + DEBUG_TOKEN (OPVAL, PLUGSTMT), + DEBUG_TOKEN (PVAL, PLUGIN_ADD_OP), + DEBUG_TOKEN (PVAL, PLUGIN_ASSIGN_OP), + DEBUG_TOKEN (PVAL, PLUGIN_HIGH_OP), + DEBUG_TOKEN (PVAL, PLUGIN_LOGICAL_AND_OP), + DEBUG_TOKEN (PVAL, PLUGIN_LOGICAL_OR_OP), + DEBUG_TOKEN (PVAL, PLUGIN_LOGICAL_AND_LOW_OP), + DEBUG_TOKEN (PVAL, PLUGIN_LOGICAL_OR_LOW_OP), + DEBUG_TOKEN (PVAL, PLUGIN_LOW_OP), + DEBUG_TOKEN (PVAL, PLUGIN_MUL_OP), + DEBUG_TOKEN (PVAL, PLUGIN_POW_OP), + DEBUG_TOKEN (PVAL, PLUGIN_REL_OP), + DEBUG_TOKEN (OPVAL, PMFUNC), + DEBUG_TOKEN (NONE, POSTJOIN), + DEBUG_TOKEN (NONE, POSTDEC), + DEBUG_TOKEN (NONE, POSTINC), + DEBUG_TOKEN (OPNUM, POWOP), + DEBUG_TOKEN (NONE, PREDEC), + DEBUG_TOKEN (NONE, PREINC), + DEBUG_TOKEN (OPVAL, PRIVATEREF), + DEBUG_TOKEN (OPVAL, QWLIST), + DEBUG_TOKEN (NONE, REFGEN), + DEBUG_TOKEN (OPNUM, SHIFTOP), + DEBUG_TOKEN (NONE, SUBLEXEND), + DEBUG_TOKEN (NONE, SUBLEXSTART), + DEBUG_TOKEN (OPVAL, THING), + DEBUG_TOKEN (NONE, UMINUS), + DEBUG_TOKEN (OPNUM, UNIOP), + DEBUG_TOKEN (OPVAL, UNIOPSUB), + DEBUG_TOKEN (OPVAL, BAREWORD), + DEBUG_TOKEN (IVAL, YADAYADA), { 0, TOKENTYPE_NONE, NULL } }; @@ -558,7 +583,7 @@ S_tokereport(pTHX_ I32 rv, const YYSTYPE PL_op_name[lvalp->ival]); break; case TOKENTYPE_PVAL: - Perl_sv_catpvf(aTHX_ report, "(pval=\"%s\")", lvalp->pval); + Perl_sv_catpvf(aTHX_ report, "(pval=%p)", lvalp->pval); break; case TOKENTYPE_OPVAL: if (lvalp->opval) { @@ -642,6 +667,10 @@ S_no_op(pTHX_ const char *const what, ch { char * const oldbp = PL_bufptr; const bool is_first = (PL_oldbufptr == PL_linestart); + SV *message = sv_2mortal( newSVpvf( + PERL_DIAG_WARN_SYNTAX("%s found where operator expected"), + what + ) ); PERL_ARGS_ASSERT_NO_OP; @@ -649,34 +678,54 @@ S_no_op(pTHX_ const char *const what, ch s = oldbp; else PL_bufptr = s; - yywarn(Perl_form(aTHX_ "%s found where operator expected", what), UTF ? SVf_UTF8 : 0); + if (ckWARN_d(WARN_SYNTAX)) { - if (is_first) - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "\t(Missing semicolon on previous line?)\n"); - else if (PL_oldoldbufptr && isIDFIRST_lazy_if_safe(PL_oldoldbufptr, - PL_bufend, - UTF)) - { + bool has_more = FALSE; + if (is_first) { + has_more = TRUE; + sv_catpvs(message, + " (Missing semicolon on previous line?)"); + } + else if (PL_oldoldbufptr) { + /* yyerror (via yywarn) would do this itself, so we should too */ const char *t; for (t = PL_oldoldbufptr; - (isWORDCHAR_lazy_if_safe(t, PL_bufend, UTF) || *t == ':'); + t < PL_bufptr && isSPACE(*t); t += UTF ? UTF8SKIP(t) : 1) { NOOP; } - if (t < PL_bufptr && isSPACE(*t)) - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "\t(Do you need to predeclare %" UTF8f "?)\n", - UTF8fARG(UTF, t - PL_oldoldbufptr, PL_oldoldbufptr)); + /* see if we can identify the cause of the warning */ + if (isIDFIRST_lazy_if_safe(t,PL_bufend,UTF)) + { + const char *t_start= t; + for ( ; + (isWORDCHAR_lazy_if_safe(t, PL_bufend, UTF) || *t == ':'); + t += UTF ? UTF8SKIP(t) : 1) + { + NOOP; + } + if (t < PL_bufptr && isSPACE(*t)) { + has_more = TRUE; + sv_catpvf( message, + " (Do you need to predeclare \"%" UTF8f "\"?)", + UTF8fARG(UTF, t - t_start, t_start)); + } + } } - else { + if (!has_more) { + const char *t= oldbp; assert(s >= oldbp); - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "\t(Missing operator before %" UTF8f "?)\n", - UTF8fARG(UTF, s - oldbp, oldbp)); + while (t < s && isSPACE(*t)) { + t += UTF ? UTF8SKIP(t) : 1; + } + + sv_catpvf(message, + " (Missing operator before \"%" UTF8f "\"?)", + UTF8fARG(UTF, s - t, t)); } } + yywarn(SvPV_nolen(message), UTF ? SVf_UTF8 : 0); PL_bufptr = oldbp; } @@ -852,7 +901,7 @@ Perl_lex_start(pTHX_ SV *line, PerlIO *r Newxz(parser->lex_shared, 1, LEXSHARED); if (line) { - STRLEN len; + Size_t len; const U8* first_bad_char_loc; s = SvPV_const(line, len); @@ -2194,7 +2243,7 @@ S_newSV_maybe_utf8(pTHX_ const char *con * Arguments: * char *start : buffer position (must be within PL_linestr) * int token : PL_next* will be this type of bare word - * (e.g., METHOD,BAREWORD) + * (e.g., METHCALL0,BAREWORD) * int check_keyword : if true, Perl checks to make sure the word isn't * a keyword (do this if the word is a label, e.g. goto FOO) * int allow_pack : if true, : characters will also be allowed (require, @@ -2214,7 +2263,7 @@ S_force_word(pTHX_ char *start, int toke if ( isIDFIRST_lazy_if_safe(s, PL_bufend, UTF) || (allow_pack && *s == ':' && s[1] == ':') ) { - s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len); + s = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, allow_pack, &len, allow_pack); if (check_keyword) { char *s2 = PL_tokenbuf; STRLEN len2 = len; @@ -2225,7 +2274,7 @@ S_force_word(pTHX_ char *start, int toke if (keyword(s2, len2, 0)) return start; } - if (token == METHOD) { + if (token == METHCALL0) { s = skipspace(s); if (*s == '(') PL_expect = XTERM; @@ -2382,8 +2431,8 @@ S_force_strict_version(pTHX_ char *s) s = (char *)scan_version(s, ver, 0); version = newSVOP(OP_CONST, 0, ver); } - else if ((*s != ';' && *s != '{' && *s != '}' ) - && (s = skipspace(s), (*s != ';' && *s != '{' && *s != '}' ))) + else if ((*s != ';' && *s != ':' && *s != '{' && *s != '}' ) + && (s = skipspace(s), (*s != ';' && *s != ':' && *s != '{' && *s != '}' ))) { PL_bufptr = s; if (errstr) @@ -3032,7 +3081,7 @@ Perl_get_and_check_backslash_N_name(pTHX stops on: @ and $ where it appears to be a var, but not for $ as tail anchor \l \L \u \U \Q \E - (?{ or (??{ + (?{ or (??{ or (*{ In transliterations: characters are VERY literal, except for - not at the start or end @@ -3069,7 +3118,7 @@ Perl_get_and_check_backslash_N_name(pTHX The structure of the code is while (there's a character to process) { handle transliteration ranges - skip regexp comments /(?#comment)/ and codes /(?{code})/ + skip regexp comments /(?#comment)/ and codes /(?{code})/ ((*{code})/ skip #-initiated comments in //x patterns check for embedded arrays check for embedded scalars @@ -3592,9 +3641,9 @@ S_scan_const(pTHX_ char *start) } /* skip for regexp comments /(?#comment)/, except for the last * char, which will be done separately. Stop on (?{..}) and - * friends */ - else if (*s == '(' && PL_lex_inpat && s[1] == '?' && !in_charclass) { - if (s[2] == '#') { + * friends (??{ ... }) or (*{ ... }) */ + else if (*s == '(' && PL_lex_inpat && (s[1] == '?' || s[1] == '*') && !in_charclass) { + if (s[1] == '?' && s[2] == '#') { if (s_is_utf8) { PERL_UINT_FAST8_T len = UTF8SKIP(s); @@ -3609,10 +3658,13 @@ S_scan_const(pTHX_ char *start) *d++ = *s++; } } - else if (!PL_lex_casemods - && ( s[2] == '{' /* This should match regcomp.c */ - || (s[2] == '?' && s[3] == '{'))) - { + else + if (!PL_lex_casemods && + /* The following should match regcomp.c */ + ((s[1] == '?' && (s[2] == '{' /* (?{ ... }) */ + || (s[2] == '?' && s[3] == '{'))) || /* (??{ ... }) */ + (s[1] == '*' && (s[2] == '{' ))) /* (*{ ... }) */ + ){ break; } } @@ -4564,7 +4616,7 @@ S_intuit_more(pTHX_ char *s, char *e) * Does all the checking to disambiguate * foo bar * between foo(bar) and bar->foo. Returns 0 if not a method, otherwise - * FUNCMETH (bar->foo(args)) or METHOD (bar->foo args). + * METHCALL (bar->foo(args)) or METHCALL0 (bar->foo args). * * First argument is the stuff after the first token, e.g. "bar". * @@ -4620,10 +4672,10 @@ S_intuit_method(pTHX_ char *start, SV *i s = skipspace(s); PL_bufptr = SvPVX(PL_linestr) + start_off; PL_expect = XREF; - return *s == '(' ? FUNCMETH : METHOD; + return *s == '(' ? METHCALL : METHCALL0; } - s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len); + s = scan_word6(s, tmpbuf, sizeof tmpbuf, TRUE, &len, FALSE); /* start is the beginning of the possible filehandle/object, * and s is the end of it * tmpbuf is a copy of it (but with single quotes as double colons) @@ -4653,7 +4705,7 @@ S_intuit_method(pTHX_ char *start, SV *i PL_expect = XTERM; force_next(BAREWORD); PL_bufptr = s; - return *s == '(' ? FUNCMETH : METHOD; + return *s == '(' ? METHCALL : METHCALL0; } } return 0; @@ -4767,7 +4819,7 @@ Perl_filter_del(pTHX_ filter_t funcp) /* if filter is on top of stack (usual case) just pop it off */ datasv = FILTER_DATA(AvFILLp(PL_rsfp_filters)); if (IoANY(datasv) == FPTR2DPTR(void *, funcp)) { - sv_free(av_pop(PL_rsfp_filters)); + SvREFCNT_dec(av_pop(PL_rsfp_filters)); return; } @@ -5066,7 +5118,23 @@ yyl_sigvar(pTHX_ char *s) PL_oldbufptr = s; ++s; - NEXTVAL_NEXTTOKE.ival = 0; + NEXTVAL_NEXTTOKE.ival = OP_SASSIGN; + force_next(ASSIGNOP); + PL_expect = XTERM; + } + else if(*s == '/' && s[1] == '/' && s[2] == '=') { + PL_oldbufptr = s; + + s += 3; + NEXTVAL_NEXTTOKE.ival = OP_DORASSIGN; + force_next(ASSIGNOP); + PL_expect = XTERM; + } + else if(*s == '|' && s[1] == '|' && s[2] == '=') { + PL_oldbufptr = s; + + s += 3; + NEXTVAL_NEXTTOKE.ival = OP_ORASSIGN; force_next(ASSIGNOP); PL_expect = XTERM; } @@ -5235,8 +5303,8 @@ yyl_dollar(pTHX_ char *s) } while (isSPACE(*t)); if (isIDFIRST_lazy_if_safe(t, PL_bufend, UTF)) { STRLEN len; - t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE, - &len); + t = scan_word6(t, tmpbuf, sizeof tmpbuf, TRUE, + &len, TRUE); while (isSPACE(*t)) t++; if ( *t == ';' @@ -5269,7 +5337,7 @@ yyl_dollar(pTHX_ char *s) char tmpbuf[sizeof PL_tokenbuf]; int t2; STRLEN len; - scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len); + scan_word6(s, tmpbuf, sizeof tmpbuf, TRUE, &len, FALSE); if ((t2 = keyword(tmpbuf, len, 0))) { /* binary operators exclude handle interpretations */ switch (t2) { @@ -5319,7 +5387,10 @@ yyl_sub(pTHX_ char *s, const int key) bool have_name, have_proto; STRLEN len; SV *format_name = NULL; - bool is_sigsub = FEATURE_SIGNATURES_IS_ENABLED; + bool is_method = (key == KEY_method); + + /* method always implies signatures */ + bool is_sigsub = is_method || FEATURE_SIGNATURES_IS_ENABLED; SSize_t off = s-SvPVX(PL_linestr); char *d; @@ -5337,8 +5408,8 @@ yyl_sub(pTHX_ char *s, const int key) { PL_expect = XATTRBLOCK; - d = scan_word(s, tmpbuf, sizeof PL_tokenbuf - 1, TRUE, - &len); + d = scan_word6(s, tmpbuf, sizeof PL_tokenbuf - 1, TRUE, + &len, TRUE); if (key == KEY_format) format_name = S_newSV_maybe_utf8(aTHX_ s, d - s); *PL_tokenbuf = '&'; @@ -5377,7 +5448,7 @@ yyl_sub(pTHX_ char *s, const int key) NEXTVAL_NEXTTOKE.opval->op_private |= OPpCONST_BARE; force_next(BAREWORD); } - PREBLOCK(FORMAT); + PREBLOCK(KW_FORMAT); } /* Look for a prototype */ @@ -5398,9 +5469,9 @@ yyl_sub(pTHX_ char *s, const int key) if ( !(*s == ':' && s[1] != ':') && (*s != '{' && *s != '(') && key != KEY_format) { - assert(key == KEY_sub || key == KEY_AUTOLOAD || - key == KEY_DESTROY || key == KEY_BEGIN || - key == KEY_UNITCHECK || key == KEY_CHECK || + assert(key == KEY_sub || key == KEY_method || + key == KEY_AUTOLOAD || key == KEY_DESTROY || + key == KEY_BEGIN || key == KEY_UNITCHECK || key == KEY_CHECK || key == KEY_INIT || key == KEY_END || key == KEY_my || key == KEY_state || key == KEY_our); @@ -5416,21 +5487,26 @@ yyl_sub(pTHX_ char *s, const int key) PL_lex_stuff = NULL; force_next(THING); } + if (!have_name) { if (PL_curstash) sv_setpvs(PL_subname, "__ANON__"); else sv_setpvs(PL_subname, "__ANON__::__ANON__"); - if (is_sigsub) - TOKEN(ANON_SIGSUB); + if (is_method) + TOKEN(KW_METHOD_anon); + else if (is_sigsub) + TOKEN(KW_SUB_anon_sig); else - TOKEN(ANONSUB); + TOKEN(KW_SUB_anon); } force_ident_maybe_lex('&'); - if (is_sigsub) - TOKEN(SIGSUB); + if (is_method) + TOKEN(KW_METHOD_named); + else if (is_sigsub) + TOKEN(KW_SUB_named_sig); else - TOKEN(SUB); + TOKEN(KW_SUB_named); } static int @@ -5547,7 +5623,7 @@ yyl_secondclass_keyword(pTHX_ char *s, S { if (GvIMPORTED_CV(gv)) ogv = gv; - else if (! CvMETHOD(cv)) + else if (! CvNOWARN_AMBIGUOUS(cv)) hgv = gv; } if (!ogv @@ -5742,7 +5818,7 @@ yyl_hyphen(pTHX_ char *s) TOKEN(ARROW); } if (isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)) { - s = force_word(s,METHOD,FALSE,TRUE); + s = force_word(s,METHCALL0,FALSE,TRUE); TOKEN(ARROW); } else if (*s == '$') @@ -5914,11 +5990,10 @@ yyl_colon(pTHX_ char *s) s = skipspace(s); attrs = NULL; while (isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)) { - bool sig = PL_parser->sig_seen; I32 tmp; SV *sv; STRLEN len; - char *d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len); + char *d = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len, FALSE); if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len, 0))) { if (tmp < 0) tmp = -tmp; switch (tmp) { @@ -5941,7 +6016,8 @@ yyl_colon(pTHX_ char *s) if (!d) { if (attrs) op_free(attrs); - sv_free(sv); + ASSUME(sv && SvREFCNT(sv) == 1); + SvREFCNT_dec(sv); Perl_croak(aTHX_ "Unterminated attribute parameter in attribute list"); } COPLINE_SET_FROM_MULTI_END; @@ -5954,45 +6030,8 @@ yyl_colon(pTHX_ char *s) PL_lex_stuff = NULL; } else { - /* NOTE: any CV attrs applied here need to be part of - the CVf_BUILTIN_ATTRS define in cv.h! */ - if (!PL_in_my && memEQs(SvPVX(sv), len, "lvalue")) { - sv_free(sv); - if (!sig) - CvLVALUE_on(PL_compcv); - } - else if (!PL_in_my && memEQs(SvPVX(sv), len, "method")) { - sv_free(sv); - if (!sig) - CvMETHOD_on(PL_compcv); - } - else if (!PL_in_my && memEQs(SvPVX(sv), len, "const")) { - sv_free(sv); - if (!sig) { - Perl_ck_warner_d(aTHX_ - packWARN(WARN_EXPERIMENTAL__CONST_ATTR), - ":const is experimental" - ); - CvANONCONST_on(PL_compcv); - if (!CvANON(PL_compcv)) - yyerror(":const is not permitted on named " - "subroutines"); - } - } - /* After we've set the flags, it could be argued that - we don't need to do the attributes.pm-based setting - process, and shouldn't bother appending recognized - flags. To experiment with that, uncomment the - following "else". (Note that's already been - uncommented. That keeps the above-applied built-in - attributes from being intercepted (and possibly - rejected) by a package's attribute routines, but is - justified by the performance win for the common case - of applying only built-in attributes.) */ - else - attrs = op_append_elem(OP_LIST, attrs, - newSVOP(OP_CONST, 0, - sv)); + attrs = op_append_elem(OP_LIST, attrs, + newSVOP(OP_CONST, 0, sv)); } s = skipspace(d); if (*s == ':' && s[1] != ':') @@ -6005,8 +6044,9 @@ yyl_colon(pTHX_ char *s) if (*s != ';' && *s != '}' && !(PL_expect == XOPERATOR - ? (*s == '=' || *s == ')') - : (*s == '{' || *s == '('))) + /* if an operator is expected, permit =, //= and ||= or ) to end */ + ? (*s == '=' || *s == ')' || *s == '/' || *s == '|') + : (*s == '{' || *s == '('))) { const char q = ((*s == '\'') ? '"' : '\''); /* If here for an expression, and parsed no attrs, back off. */ @@ -6135,8 +6175,8 @@ yyl_leftcurly(pTHX_ char *s, const U8 fo } if (d < PL_bufend && isIDFIRST_lazy_if_safe(d, PL_bufend, UTF)) { STRLEN len; - d = scan_word(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, - FALSE, &len); + d = scan_word6(d, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, + FALSE, &len, FALSE); while (d < PL_bufend && SPACE_OR_TAB(*d)) d++; if (*d == '}') { @@ -6178,6 +6218,7 @@ yyl_leftcurly(pTHX_ char *s, const U8 fo /* This hack is to get the ${} in the message. */ PL_bufptr = s+1; yyerror("syntax error"); + yyquit(); break; } OPERATOR(HASHBRACK); @@ -6597,8 +6638,8 @@ yyl_tilde(pTHX_ char *s) TOKEN(0); s += 2; Perl_ck_warner_d(aTHX_ - packWARN(WARN_EXPERIMENTAL__SMARTMATCH), - "Smartmatch is experimental"); + packWARN(WARN_DEPRECATED__SMARTMATCH), + "Smartmatch is deprecated"); NCEop(OP_SMARTMATCH); } s++; @@ -6921,7 +6962,7 @@ yyl_require(pTHX_ char *s, I32 orig_keyw PL_last_uni = PL_oldbufptr; PL_last_lop_op = OP_REQUIRE; s = skipspace(s); - return REPORT( (int)REQUIRE ); + return REPORT( (int)KW_REQUIRE ); } static int @@ -6981,7 +7022,7 @@ yyl_foreach(pTHX_ char *s) /* skip optional package name, as in "for my abc $x (..)" */ if (UNLIKELY(isIDFIRST_lazy_if_safe(p, PL_bufend, UTF))) { STRLEN len; - p = scan_word(p, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len); + p = scan_word6(p, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len, TRUE); p = skipspace(p); paren_is_valid = FALSE; } @@ -6999,7 +7040,7 @@ yyl_foreach(pTHX_ char *s) /* The buffer may have been reallocated, update s */ s = SvPVX(PL_linestr) + s_off; } - OPERATOR(FOR); + OPERATOR(KW_FOR); } static int @@ -7007,13 +7048,13 @@ yyl_do(pTHX_ char *s, I32 orig_keyword) { s = skipspace(s); if (*s == '{') - PRETERMBLOCK(DO); + PRETERMBLOCK(KW_DO); if (*s != '\'') { char *d; STRLEN len; *PL_tokenbuf = '&'; - d = scan_word(s, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, - 1, &len); + d = scan_word6(s, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, + 1, &len, TRUE); if (len && memNEs(PL_tokenbuf+1, len, "CORE") && !keyword(PL_tokenbuf + 1, len, 0)) { SSize_t off = s-SvPVX(PL_linestr); @@ -7029,7 +7070,7 @@ yyl_do(pTHX_ char *s, I32 orig_keyword) pl_yylval.ival = 1; else pl_yylval.ival = 0; - OPERATOR(DO); + OPERATOR(KW_DO); } static int @@ -7048,7 +7089,7 @@ yyl_my(pTHX_ char *s, I32 my) s = skipspace(s); if (isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)) { STRLEN len; - s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len); + s = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, TRUE, &len, TRUE); if (memEQs(PL_tokenbuf, len, "sub")) return yyl_sub(aTHX_ s, my); PL_in_my_stash = find_in_my_stash(PL_tokenbuf, len); @@ -7069,7 +7110,7 @@ yyl_my(pTHX_ char *s, I32 my) packWARN(WARN_EXPERIMENTAL__DECLARED_REFS), "Declaring references is experimental"); } - OPERATOR(MY); + OPERATOR(KW_MY); } static int yyl_try(pTHX_ char*); @@ -7520,8 +7561,8 @@ yyl_just_a_word(pTHX_ char *s, STRLEN le if (*s == '\'' || (*s == ':' && s[1] == ':')) { STRLEN morelen; - s = scan_word(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len, - TRUE, &morelen); + s = scan_word6(s, PL_tokenbuf + len, sizeof PL_tokenbuf - len, + TRUE, &morelen, TRUE); if (no_op_error) { no_op("Bareword",s); no_op_error = FALSE; @@ -7622,12 +7663,6 @@ yyl_just_a_word(pTHX_ char *s, STRLEN le } s = SvPVX(PL_linestr) + s_off; - if (((PL_opargs[PL_last_lop_op] >> OASHIFT) & 7) == OA_FILEREF - && !immediate_paren && !c.cv - && !FEATURE_BAREWORD_FILEHANDLES_IS_ENABLED) { - no_bareword_filehandle(PL_tokenbuf); - } - /* If not a declared subroutine, it's an indirect object. */ /* (But it's an indir obj regardless for sort.) */ /* Also, if "_" follows a filetest operator, it's a bareword */ @@ -7699,7 +7734,7 @@ yyl_just_a_word(pTHX_ char *s, STRLEN le PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; PL_expect = XBLOCKTERM; PL_bufptr = s; - return REPORT(METHOD); + return REPORT(METHCALL0); } /* If followed by a bareword, see if it looks like indir obj. */ @@ -7720,7 +7755,7 @@ yyl_just_a_word(pTHX_ char *s, STRLEN le else SvUTF8_off(c.sv); } op_free(c.rv2cv_op); - if (key == METHOD && !PL_lex_allbrackets + if (key == METHCALL0 && !PL_lex_allbrackets && PL_lex_fakeeof > LEX_FAKEEOF_LOWLOGIC) { PL_lex_fakeeof = LEX_FAKEEOF_LOWLOGIC; @@ -7761,7 +7796,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE case KEY___LINE__: FUN0OP( newSVOP(OP_CONST, 0, - Perl_newSVpvf(aTHX_ "%" IVdf, (IV)CopLINE(PL_curcop))) + Perl_newSVpvf(aTHX_ "%" LINE_Tf, CopLINE(PL_curcop))) ); case KEY___PACKAGE__: @@ -7778,9 +7813,12 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE return yyl_fake_eof(aTHX_ LEX_FAKE_EOF, FALSE, s); case KEY___SUB__: + /* If !CvCLONE(PL_compcv) then rpeep will probably turn this into an + * OP_CONST. We need to make it big enough to allow room for that if + * so */ FUN0OP(CvCLONE(PL_compcv) ? newOP(OP_RUNCV, 0) - : newPVOP(OP_RUNCV,0,NULL)); + : newSVOP(OP_RUNCV, 0, &PL_sv_undef)); case KEY_AUTOLOAD: case KEY_DESTROY: @@ -7793,6 +7831,16 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE return yyl_sub(aTHX_ PL_bufptr, key); return yyl_just_a_word(aTHX_ s, len, orig_keyword, c); + case KEY_ADJUST: + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__CLASS), "ADJUST is experimental"); + + /* The way that KEY_CHECK et.al. are handled currently are nothing + * short of crazy. We won't copy that model for new phasers, but use + * this as an experiment to test if this will work + */ + PHASERBLOCK(KEY_ADJUST); + case KEY_abs: UNI(OP_ABS); @@ -7825,11 +7873,21 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE case KEY_catch: Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__TRY), "try/catch is experimental"); - PREBLOCK(CATCH); + PREBLOCK(KW_CATCH); case KEY_chop: UNI(OP_CHOP); + case KEY_class: + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__CLASS), "class is experimental"); + + s = force_word(s,BAREWORD,FALSE,TRUE); + s = skipspace(s); + s = force_strict_version(s); + PL_expect = XATTRBLOCK; + TOKEN(KW_CLASS); + case KEY_continue: /* We have to disambiguate the two senses of "continue". If the next token is a '{' then @@ -7838,7 +7896,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE */ s = skipspace(s); if (*s == '{') - PREBLOCK(CONTINUE); + PREBLOCK(KW_CONTINUE); else FUN0(OP_CONTINUE); @@ -7884,12 +7942,12 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE UNI(OP_CHROOT); case KEY_default: - PREBLOCK(DEFAULT); + PREBLOCK(KW_DEFAULT); case KEY_defer: Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__DEFER), "defer is experimental"); - PREBLOCK(DEFER); + PREBLOCK(KW_DEFER); case KEY_do: return yyl_do(aTHX_ s, orig_keyword); @@ -7921,11 +7979,11 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE LOOPX(OP_DUMP); case KEY_else: - PREBLOCK(ELSE); + PREBLOCK(KW_ELSE); case KEY_elsif: pl_yylval.ival = CopLINE(PL_curcop); - OPERATOR(ELSIF); + OPERATOR(KW_ELSIF); case KEY_eq: if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_COMPARE) @@ -7983,10 +8041,22 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE case KEY_endgrent: FUN0(OP_EGRENT); + case KEY_field: + /* TODO: maybe this should use the same parser/grammar structures as + * `my`, but it's also rather messy because of the `our` conflation + */ + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__CLASS), "field is experimental"); + + croak_kw_unless_class("field"); + + PL_parser->in_my = KEY_field; + OPERATOR(KW_FIELD); + case KEY_finally: Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__TRY), "try/catch/finally is experimental"); - PREBLOCK(FINALLY); + PREBLOCK(KW_FINALLY); case KEY_for: case KEY_foreach: @@ -8109,9 +8179,9 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE case KEY_given: pl_yylval.ival = CopLINE(PL_curcop); - Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__SMARTMATCH), - "given is experimental"); - OPERATOR(GIVEN); + Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED__SMARTMATCH), + "given is deprecated"); + OPERATOR(KW_GIVEN); case KEY_glob: LOP( orig_keyword==KEY_glob ? -OP_GLOB : OP_GLOB, XTERM ); @@ -8123,7 +8193,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); - OPERATOR(IF); + OPERATOR(KW_IF); case KEY_index: LOP(OP_INDEX,XTERM); @@ -8156,7 +8226,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE UNI(OP_LCFIRST); case KEY_local: - OPERATOR(LOCAL); + OPERATOR(KW_LOCAL); case KEY_length: UNI(OP_LENGTH); @@ -8226,7 +8296,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE case KEY_no: s = tokenize_use(0, s); - TOKEN(USE); + TOKEN(KW_USE_or_NO); case KEY_not: if (*s == '(' || (s = skipspace(s), *s == '(')) @@ -8241,7 +8311,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE s = skipspace(s); if (isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)) { const char *t; - char *d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len); + char *d = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len, FALSE); for (t=d; isSPACE(*t);) t++; if ( *t && memCHRs("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE) @@ -8299,7 +8369,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE s = force_word(s,BAREWORD,FALSE,TRUE); s = skipspace(s); s = force_strict_version(s); - PREBLOCK(PACKAGE); + PREBLOCK(KW_PACKAGE); case KEY_pipe: LOP(OP_PIPE_OP,XTERM); @@ -8515,6 +8585,12 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE case KEY_substr: LOP(OP_SUBSTR,XTERM); + case KEY_method: + /* For now we just treat 'method' identical to 'sub' plus a warning */ + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__CLASS), "method is experimental"); + return yyl_sub(aTHX_ s, KEY_method); + case KEY_format: case KEY_sub: return yyl_sub(aTHX_ s, key); @@ -8570,7 +8646,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE pl_yylval.ival = CopLINE(PL_curcop); Perl_ck_warner_d(aTHX_ packWARN(WARN_EXPERIMENTAL__TRY), "try/catch is experimental"); - PREBLOCK(TRY); + PREBLOCK(KW_TRY); case KEY_uc: UNI(OP_UC); @@ -8585,13 +8661,13 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); - OPERATOR(UNTIL); + OPERATOR(KW_UNTIL); case KEY_unless: if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); - OPERATOR(UNLESS); + OPERATOR(KW_UNLESS); case KEY_unlink: LOP(OP_UNLINK,XTERM); @@ -8613,7 +8689,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE case KEY_use: s = tokenize_use(1, s); - TOKEN(USE); + TOKEN(KW_USE_or_NO); case KEY_values: UNI(OP_VALUES); @@ -8626,15 +8702,15 @@ yyl_word_or_keyword(pTHX_ char *s, STRLE return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); Perl_ck_warner_d(aTHX_ - packWARN(WARN_EXPERIMENTAL__SMARTMATCH), - "when is experimental"); - OPERATOR(WHEN); + packWARN(WARN_DEPRECATED__SMARTMATCH), + "when is deprecated"); + OPERATOR(KW_WHEN); case KEY_while: if (!PL_lex_allbrackets && PL_lex_fakeeof >= LEX_FAKEEOF_NONEXPR) return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); - OPERATOR(WHILE); + OPERATOR(KW_WHILE); case KEY_warn: PL_hints |= HINT_BLOCK_SCOPE; @@ -8683,7 +8759,7 @@ yyl_key_core(pTHX_ char *s, STRLEN len, STRLEN olen = len; char *d = s; s += 2; - s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len); + s = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len, FALSE); if ((*s == ':' && s[1] == ':') || (!(key = keyword(PL_tokenbuf, len, 1)) && *s == '\'')) { @@ -8704,6 +8780,51 @@ yyl_key_core(pTHX_ char *s, STRLEN len, return yyl_word_or_keyword(aTHX_ s, len, key, orig_keyword, c); } +struct Perl_custom_infix_result { + struct Perl_custom_infix *def; + SV *parsedata; +}; + +static enum yytokentype tokentype_for_plugop(struct Perl_custom_infix *def) +{ + enum Perl_custom_infix_precedence prec = def->prec; + if(prec <= INFIX_PREC_LOW) + return PLUGIN_LOW_OP; + if(prec <= INFIX_PREC_LOGICAL_OR_LOW) + return PLUGIN_LOGICAL_OR_LOW_OP; + if(prec <= INFIX_PREC_LOGICAL_AND_LOW) + return PLUGIN_LOGICAL_AND_LOW_OP; + if(prec <= INFIX_PREC_ASSIGN) + return PLUGIN_ASSIGN_OP; + if(prec <= INFIX_PREC_LOGICAL_OR) + return PLUGIN_LOGICAL_OR_OP; + if(prec <= INFIX_PREC_LOGICAL_AND) + return PLUGIN_LOGICAL_AND_OP; + if(prec <= INFIX_PREC_REL) + return PLUGIN_REL_OP; + if(prec <= INFIX_PREC_ADD) + return PLUGIN_ADD_OP; + if(prec <= INFIX_PREC_MUL) + return PLUGIN_MUL_OP; + if(prec <= INFIX_PREC_POW) + return PLUGIN_POW_OP; + return PLUGIN_HIGH_OP; +} + +OP * +Perl_build_infix_plugin(pTHX_ OP *lhs, OP *rhs, void *tokendata) +{ + PERL_ARGS_ASSERT_BUILD_INFIX_PLUGIN; + + struct Perl_custom_infix_result *result = (struct Perl_custom_infix_result *)tokendata; + SAVEFREEPV(result); + if(result->parsedata) + SAVEFREESV(result->parsedata); + + return (*result->def->build_op)(aTHX_ + &result->parsedata, lhs, rhs, result->def); +} + static int yyl_keylookup(pTHX_ char *s, GV *gv) { @@ -8717,7 +8838,7 @@ yyl_keylookup(pTHX_ char *s, GV *gv) c.gv = gv; PL_bufptr = s; - s = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len); + s = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len, FALSE); /* Some keywords can be followed by any delimiter, including ':' */ anydelim = word_takes_any_delimiter(PL_tokenbuf, len); @@ -8764,6 +8885,30 @@ yyl_keylookup(pTHX_ char *s, GV *gv) } } + /* Check for plugged-in named operator */ + if(PLUGINFIX_IS_ENABLED) { + struct Perl_custom_infix *def; + STRLEN result; + result = PL_infix_plugin(aTHX_ PL_tokenbuf, len, &def); + if(result) { + if(result != len) + Perl_croak(aTHX_ "Bad infix plugin result (%zd) - did not consume entire identifier <%s>\n", + result, PL_tokenbuf); + PL_bufptr = s = d; + struct Perl_custom_infix_result *result; + Newx(result, 1, struct Perl_custom_infix_result); + result->def = def; + result->parsedata = NULL; + if(def->parse) { + (*def->parse)(aTHX_ &result->parsedata, def); + s = PL_bufptr; /* restore local s variable */ + } + pl_yylval.pval = result; + CLINE; + OPERATOR(tokentype_for_plugop(def)); + } + } + /* Is this a label? */ if (!anydelim && PL_expect == XSTATE && d < PL_bufend && *d == ':' && *(d + 1) != ':') { @@ -8794,7 +8939,8 @@ yyl_keylookup(pTHX_ char *s, GV *gv) SVt_PVCV); c.off = 0; if (!c.gv) { - sv_free(c.sv); + ASSUME(c.sv && SvREFCNT(c.sv) == 1); + SvREFCNT_dec(c.sv); c.sv = NULL; return yyl_just_a_word(aTHX_ s, len, 0, c); } @@ -8842,6 +8988,34 @@ yyl_try(pTHX_ char *s) int tok; retry: + /* Check for plugged-in symbolic operator */ + if(PLUGINFIX_IS_ENABLED && isPLUGINFIX_FIRST(*s)) { + struct Perl_custom_infix *def; + char *s_end = s, *d = PL_tokenbuf; + STRLEN len; + + /* Copy the longest sequence of isPLUGINFIX() chars into PL_tokenbuf */ + while(s_end < PL_bufend && d < PL_tokenbuf+sizeof(PL_tokenbuf)-1 && isPLUGINFIX(*s_end)) + *d++ = *s_end++; + *d = '\0'; + + if((len = (*PL_infix_plugin)(aTHX_ PL_tokenbuf, s_end - s, &def))) { + s += len; + struct Perl_custom_infix_result *result; + Newx(result, 1, struct Perl_custom_infix_result); + result->def = def; + result->parsedata = NULL; + if(def->parse) { + PL_bufptr = s; + (*def->parse)(aTHX_ &result->parsedata, def); + s = PL_bufptr; /* restore local s variable */ + } + pl_yylval.pval = result; + CLINE; + OPERATOR(tokentype_for_plugop(def)); + } + } + switch (*s) { default: if (UTF ? isIDFIRST_utf8_safe(s, PL_bufend) : isALNUMC(*s)) { @@ -8909,7 +9083,7 @@ yyl_try(pTHX_ char *s) ++svp; sv_catpvs(PL_linestr, ";"); } - sv_free(MUTABLE_SV(PL_preambleav)); + SvREFCNT_dec(MUTABLE_SV(PL_preambleav)); PL_preambleav = NULL; } if (PL_minus_E) @@ -8927,7 +9101,7 @@ yyl_try(pTHX_ char *s) && strchr(PL_splitstr + 1, *PL_splitstr)) { /* strchr is ok, because -F pattern can't contain - * embeddded NULs */ + * embedded NULs */ Perl_sv_catpvf(aTHX_ PL_linestr, "our @F=split(%s);", PL_splitstr); } else { @@ -9388,8 +9562,8 @@ Perl_yylex(pTHX) } DEBUG_T( { SV* tmp = newSVpvs(""); - PerlIO_printf(Perl_debug_log, "### %" IVdf ":LEX_%s/X%s %s\n", - (IV)CopLINE(PL_curcop), + PerlIO_printf(Perl_debug_log, "### %" LINE_Tf ":LEX_%s/X%s %s\n", + CopLINE(PL_curcop), lex_state_names[PL_lex_state], exp_name[PL_expect], pv_display(tmp, s, strlen(s), 0, 60)); @@ -9459,14 +9633,14 @@ Perl_yylex(pTHX) NEXTVAL_NEXTTOKE.ival = OP_JOIN; /* emulate join($", ...) */ force_next(FUNC); } - /* Convert (?{...}) and friends to 'do {...}' */ + /* Convert (?{...}) or (*{...}) and friends to 'do {...}' */ if (PL_lex_inpat && *PL_bufptr == '(') { PL_parser->lex_shared->re_eval_start = PL_bufptr; PL_bufptr += 2; if (*PL_bufptr != '{') PL_bufptr++; PL_expect = XTERMBLOCK; - force_next(DO); + force_next(KW_DO); } if (PL_lex_starts++) { @@ -9697,7 +9871,8 @@ S_pending_ident(pTHX) /* PL_no_myglob is constant */ GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); yyerror_pv(Perl_form(aTHX_ PL_no_myglob, - PL_in_my == KEY_my ? "my" : "state", + PL_in_my == KEY_my ? "my" : + PL_in_my == KEY_field ? "field" : "state", *PL_tokenbuf == '&' ? "subroutine" : "variable", PL_tokenbuf), UTF ? SVf_UTF8 : 0); @@ -10037,70 +10212,73 @@ S_parse_ident(pTHX_ char **s, char **d, else break; } - if (UNLIKELY(tick_warn && saw_tick && PL_lex_state == LEX_INTERPNORMAL - && !PL_lex_brackets && ckWARN(WARN_SYNTAX))) { - char *this_d; - char *d2; - Newx(this_d, *s - olds + saw_tick + 2, char); /* +2 for $# */ - d2 = this_d; - SAVEFREEPV(this_d); - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "Old package separator used in string"); - if (olds[-1] == '#') - *d2++ = olds[-2]; - *d2++ = olds[-1]; - while (olds < *s) { - if (*olds == '\'') { - *d2++ = '\\'; - *d2++ = *olds++; + if (UNLIKELY(saw_tick && tick_warn && ckWARN2_d(WARN_SYNTAX, WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR))) { + if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) { + char *this_d; + char *d2; + Newx(this_d, *s - olds + saw_tick + 2, char); /* +2 for $# */ + d2 = this_d; + SAVEFREEPV(this_d); + + Perl_warner(aTHX_ packWARN2(WARN_SYNTAX, WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR), + "Old package separator used in string"); + if (olds[-1] == '#') + *d2++ = olds[-2]; + *d2++ = olds[-1]; + while (olds < *s) { + if (*olds == '\'') { + *d2++ = '\\'; + *d2++ = *olds++; + } + else + *d2++ = *olds++; } - else - *d2++ = *olds++; + Perl_warner(aTHX_ packWARN(WARN_SYNTAX), + "\t(Did you mean \"%" UTF8f "\" instead?)\n", + UTF8fARG(is_utf8, d2-this_d, this_d)); + } + else { + Perl_warner(aTHX_ packWARN2(WARN_SYNTAX, WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR), + "Old package separator \"'\" deprecated"); } - Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "\t(Did you mean \"%" UTF8f "\" instead?)\n", - UTF8fARG(is_utf8, d2-this_d, this_d)); } return; } /* Returns a NUL terminated string, with the length of the string written to *slp + + scan_word6() may be removed once ' in names is removed. */ char * -Perl_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp) +Perl_scan_word6(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp, bool warn_tick) { char *d = dest; char * const e = d + destlen - 3; /* two-character token, ending NUL */ bool is_utf8 = cBOOL(UTF); - PERL_ARGS_ASSERT_SCAN_WORD; + PERL_ARGS_ASSERT_SCAN_WORD6; - parse_ident(&s, &d, e, allow_package, is_utf8, TRUE, FALSE); + parse_ident(&s, &d, e, allow_package, is_utf8, TRUE, warn_tick); *d = '\0'; *slp = d - dest; return s; } -/* Is the byte 'd' a legal single character identifier name? 'u' is true - * iff Unicode semantics are to be used. The legal ones are any of: - * a) all ASCII characters except: - * 1) control and space-type ones, like NUL, SOH, \t, and SPACE; - * 2) '{' - * The final case currently doesn't get this far in the program, so we - * don't test for it. If that were to change, it would be ok to allow it. - * b) When not under Unicode rules, any upper Latin1 character - * c) Otherwise, when unicode rules are used, all XIDS characters. - * - * Because all ASCII characters have the same representation whether - * encoded in UTF-8 or not, we can use the foo_A macros below and '\0' and - * '{' without knowing if is UTF-8 or not. */ -#define VALID_LEN_ONE_IDENT(s, e, is_utf8) \ - (isGRAPH_A(*(s)) || ((is_utf8) \ - ? isIDFIRST_utf8_safe(s, e) \ - : (isGRAPH_L1(*s) \ - && LIKELY((U8) *(s) != LATIN1_TO_NATIVE(0xAD))))) +char * +Perl_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp) +{ + PERL_ARGS_ASSERT_SCAN_WORD; + return scan_word6(s, dest, destlen, allow_package, slp, FALSE); +} +/* scan s and extract an identifier ($var) from it if possible + * into dest. + * XXX: This function has subtle implications on parsing, and + * changing how it behaves can cause a variable to change from + * being a run time rv2sv call or a compile time binding to a + * specific variable name. + */ STATIC char * S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni) { @@ -10110,7 +10288,7 @@ S_scan_ident(pTHX_ char *s, char *dest, char *d = dest; char * const e = d + destlen - 3; /* two-character token, ending NUL */ bool is_utf8 = cBOOL(UTF); - I32 orig_copline = 0, tmp_copline = 0; + line_t orig_copline = 0, tmp_copline = 0; PERL_ARGS_ASSERT_SCAN_IDENT; @@ -10164,11 +10342,41 @@ S_scan_ident(pTHX_ char *s, char *dest, s = skipspace(s); } } + + + /* Extract the first character of the variable name from 's' and + * copy it, null terminated into 'd'. Note that this does not + * involve checking for just IDFIRST characters, as it allows the + * '^' for ${^FOO} type variable names, and it allows all the + * characters that are legal in a single character variable name. + * + * The legal ones are any of: + * a) all ASCII characters except: + * 1) control and space-type ones, like NUL, SOH, \t, and SPACE; + * 2) '{' + * The final case currently doesn't get this far in the program, so we + * don't test for it. If that were to change, it would be ok to allow it. + * b) When not under Unicode rules, any upper Latin1 character + * c) Otherwise, when unicode rules are used, all XIDS characters. + * + * Because all ASCII characters have the same representation whether + * encoded in UTF-8 or not, we can use the foo_A macros below and '\0' and + * '{' without knowing if is UTF-8 or not. */ + if ((s <= PL_bufend - ((is_utf8) ? UTF8SKIP(s) : 1)) - && VALID_LEN_ONE_IDENT(s, PL_bufend, is_utf8)) - { + && ( + isGRAPH_A(*s) + || + ( is_utf8 + ? isIDFIRST_utf8_safe(s, PL_bufend) + : (isGRAPH_L1(*s) + && LIKELY((U8) *s != LATIN1_TO_NATIVE(0xAD)) + ) + ) + ) + ){ if (is_utf8) { const STRLEN skip = UTF8SKIP(s); STRLEN i; @@ -10178,24 +10386,27 @@ S_scan_ident(pTHX_ char *s, char *dest, } else { *d = *s++; - /* special case to handle ${10}, ${11} the same way we handle ${1} etc */ - if (isDIGIT(*d)) { - bool is_zero= *d == '0' ? TRUE : FALSE; - char *digit_start= d; - while (s < PL_bufend && isDIGIT(*s)) { - d++; - if (d >= e) - Perl_croak(aTHX_ "%s", ident_too_long); - *d= *s++; - } - if (is_zero && d - digit_start > 1) - Perl_croak(aTHX_ ident_var_zero_multi_digit); - } d[1] = '\0'; } } + + /* special case to handle ${10}, ${11} the same way we handle ${1} etc */ + if (isDIGIT(*d)) { + bool is_zero= *d == '0' ? TRUE : FALSE; + char *digit_start= d; + while (s < PL_bufend && isDIGIT(*s)) { + d++; + if (d >= e) + Perl_croak(aTHX_ "%s", ident_too_long); + *d= *s++; + } + if (is_zero && d - digit_start >= 1) /* d points at the last digit */ + Perl_croak(aTHX_ ident_var_zero_multi_digit); + d[1] = '\0'; + } + /* Convert $^F, ${^F} and the ^F of ${^FOO} to control characters */ - if (*d == '^' && *s && isCONTROLVAR(*s)) { + else if (*d == '^' && *s && isCONTROLVAR(*s)) { *d = toCTRL(*s); s++; } @@ -10204,6 +10415,7 @@ S_scan_ident(pTHX_ char *s, char *dest, about when not to warn. */ else if (ck_uni && bracket == -1) check_uni(); + if (bracket != -1) { bool skip; char *s2; @@ -10462,9 +10674,12 @@ S_scan_pat(pTHX_ char *start, I32 type) char *e, *p = SvPV(PL_lex_stuff, len); e = p + len; for (; p < e; p++) { - if (p[0] == '(' && p[1] == '?' - && (p[2] == '{' || (p[2] == '?' && p[3] == '{'))) - { + if (p[0] == '(' && ( + (p[1] == '?' && (p[2] == '{' || + (p[2] == '?' && p[3] == '{'))) || + (p[1] == '*' && (p[2] == '{' || + (p[2] == '*' && p[3] == '{'))) + )){ pm->op_pmflags |= PMf_HAS_CV; break; } @@ -10757,7 +10972,6 @@ S_scan_heredoc(pTHX_ char *s) #endif tmpstr = newSV_type(SVt_PVIV); - SvGROW(tmpstr, 80); if (term == '\'') { op_type = OP_CONST; SvIV_set(tmpstr, -1); @@ -10868,7 +11082,7 @@ S_scan_heredoc(pTHX_ char *s) goto interminable; } - sv_setpvn(tmpstr,d+1,s-d); + sv_setpvn_fresh(tmpstr,d+1,s-d); s += len - 1; /* the preceding stmt passes a newline */ PL_parser->herelines++; @@ -10915,7 +11129,8 @@ S_scan_heredoc(pTHX_ char *s) char *oldbufptr_save; char *oldoldbufptr_save; streaming: - SvPVCLEAR(tmpstr); /* avoid "uninitialized" warning */ + sv_grow_fresh(tmpstr, 80); + SvPVCLEAR_FRESH(tmpstr); /* avoid "uninitialized" warning */ term = PL_tokenbuf[1]; len--; linestr_save = PL_linestr; /* must restore this afterwards */ @@ -11073,7 +11288,7 @@ S_scan_heredoc(pTHX_ char *s) } } /* while */ - /* avoid sv_setsv() as we dont wan't to COW here */ + /* avoid sv_setsv() as we don't want to COW here */ sv_setpvn(tmpstr,SvPVX(newstr),SvCUR(newstr)); Safefree(indent); SvREFCNT_dec_NN(newstr); @@ -11182,7 +11397,7 @@ S_scan_inputsymbol(pTHX_ char *start) return s; } else { - bool readline_overriden = FALSE; + bool readline_overridden = FALSE; GV *gv_readline; /* we're in a filehandle read situation */ d = PL_tokenbuf; @@ -11191,9 +11406,9 @@ S_scan_inputsymbol(pTHX_ char *start) if (!len) Copy("ARGV",d,5,char); - /* Check whether readline() is overriden */ + /* Check whether readline() is overridden */ if ((gv_readline = gv_override("readline",8))) - readline_overriden = TRUE; + readline_overridden = TRUE; /* if <$fh>, create the ops to turn the variable into a filehandle @@ -11207,16 +11422,15 @@ S_scan_inputsymbol(pTHX_ char *start) if (PAD_COMPNAME_FLAGS_isOUR(tmp)) { HV * const stash = PAD_COMPNAME_OURSTASH(tmp); HEK * const stashname = HvNAME_HEK(stash); - SV * const sym = sv_2mortal(newSVhek(stashname)); + SV * const sym = newSVhek_mortal(stashname); sv_catpvs(sym, "::"); sv_catpv(sym, d+1); d = SvPVX(sym); goto intro_sym; } else { - OP * const o = newOP(OP_PADSV, 0); - o->op_targ = tmp; - PL_lex_op = readline_overriden + OP * const o = newPADxVOP(OP_PADSV, 0, tmp); + PL_lex_op = readline_overridden ? newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, o, newCVREF(0, newGVOP(OP_GV,0,gv_readline)))) @@ -11230,7 +11444,7 @@ S_scan_inputsymbol(pTHX_ char *start) gv = gv_fetchpv(d, GV_ADDMULTI | ( UTF ? SVf_UTF8 : 0 ), SVt_PV); - PL_lex_op = readline_overriden + PL_lex_op = readline_overridden ? newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, newUNOP(OP_RV2SV, 0, newGVOP(OP_GV, 0, gv)), @@ -11247,7 +11461,7 @@ S_scan_inputsymbol(pTHX_ char *start) ( or ) so build a simple readline OP */ else { GV * const gv = gv_fetchpv(d, GV_ADD | ( UTF ? SVf_UTF8 : 0 ), SVt_PVIO); - PL_lex_op = readline_overriden + PL_lex_op = readline_overridden ? newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, newGVOP(OP_GV, 0, gv), @@ -11441,19 +11655,19 @@ Perl_scan_str(pTHX_ char *start, int kee : * (U8 *) close_delim_str; } else { /* Here, the delimiter isn't paired, hence the close is the same as - the open; and has aready been set up. But make sure it isn't + the open; and has already been set up. But make sure it isn't deprecated to use this particular delimiter, as we plan eventually to make it paired. */ if (ninstr(deprecated_opening_delims, deprecated_delims_end, open_delim_str, open_delim_str + delim_byte_len)) { - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), + Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED), "Use of '%" UTF8f "' is deprecated as a string delimiter", UTF8fARG(UTF, delim_byte_len, open_delim_str)); } /* Note that a NUL may be used as a delimiter, and this happens when - * delimitting an empty string, and no special handling for it is + * delimiting an empty string, and no special handling for it is * needed, as ninstr() calls are used */ } @@ -11466,7 +11680,7 @@ Perl_scan_str(pTHX_ char *start, int kee /* create a new SV to hold the contents. 79 is the SV's initial length. What a random number. */ sv = newSV_type(SVt_PVIV); - SvGROW(sv, 79); + sv_grow_fresh(sv, 79); SvIV_set(sv, close_delim_code); (void)SvPOK_only(sv); /* validate pointer */ @@ -11589,7 +11803,8 @@ Perl_scan_str(pTHX_ char *start, int kee COPLINE_INC_WITH_HERELINES; PL_bufptr = PL_bufend; if (!lex_next_chunk(0)) { - sv_free(sv); + ASSUME(sv); + SvREFCNT_dec(sv); CopLINE_set(PL_curcop, (line_t)PL_multi_start); return NULL; } @@ -11895,7 +12110,7 @@ Perl_scan_num(pTHX_ const char *start, Y NV nv_mult = 1.0; #endif bool accumulate = TRUE; - U8 b; + U8 b = 0; /* silence compiler warning */ int lim = 1 << shift; for (h++; ((isXDIGIT(*h) && (b = XDIGIT_VALUE(*h)) < lim) || *h == '_'); h++) { @@ -12341,8 +12556,12 @@ S_scan_formline(pTHX_ char *s) } } eol = (char *) memchr(s,'\n',PL_bufend-s); - if (!eol++) - eol = PL_bufend; + if (! eol) { + eol = PL_bufend; + } + else { + eol++; + } if (*s != '#') { char *t; for (t = s; t < eol; t++) { @@ -12393,7 +12612,7 @@ S_scan_formline(pTHX_ char *s) if (*s2 == '{') { PL_expect = XTERMBLOCK; NEXTVAL_NEXTTOKE.ival = 0; - force_next(DO); + force_next(KW_DO); } NEXTVAL_NEXTTOKE.ival = 0; force_next(FORMLBRACK); @@ -12413,11 +12632,33 @@ S_scan_formline(pTHX_ char *s) return s; } +/* +=for apidoc start_subparse + +Set things up for parsing a subroutine. + +If C is non-zero, the input is to be considered a format sub +(a specialised sub used to implement perl's C feature); else a +normal C. + +C are added to the flags for C. C may include the +C bit, which causes the new subroutine to be a method. + +This returns the value of C that was in effect upon entry to +the function; + +=cut +*/ + I32 Perl_start_subparse(pTHX_ I32 is_format, U32 flags) { const I32 oldsavestack_ix = PL_savestack_ix; CV* const outsidecv = PL_compcv; + bool is_method = flags & CVf_IsMETHOD; + + if (is_method) + croak_kw_unless_class("method"); SAVEI32(PL_subline); save_item(PL_subname); @@ -12432,10 +12673,98 @@ Perl_start_subparse(pTHX_ I32 is_format, CvOUTSIDE_SEQ(PL_compcv) = PL_cop_seqmax; if (outsidecv && CvPADLIST(outsidecv)) CvPADLIST(PL_compcv)->xpadl_outid = CvPADLIST(outsidecv)->xpadl_id; + if (is_method) + class_prepare_method_parse(PL_compcv); return oldsavestack_ix; } +/* If o represents a builtin attribute, apply it to cv and returns true. + * Otherwise does nothing and returns false + */ + +STATIC bool +S_apply_builtin_cv_attribute(pTHX_ CV *cv, OP *o) +{ + assert(o->op_type == OP_CONST); + SV *sv = cSVOPo_sv; + STRLEN len = SvCUR(sv); + + /* NOTE: any CV attrs applied here need to be part of + the CVf_BUILTIN_ATTRS define in cv.h! */ + + if(memEQs(SvPVX(sv), len, "lvalue")) + CvLVALUE_on(cv); + else if(memEQs(SvPVX(sv), len, "method")) + CvNOWARN_AMBIGUOUS_on(cv); + else if(memEQs(SvPVX(sv), len, "const")) { + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__CONST_ATTR), + ":const is experimental" + ); + CvANONCONST_on(cv); + if (!CvANON(cv)) + yyerror(":const is not permitted on named subroutines"); + } + else + return false; + + return true; +} + +/* +=for apidoc apply_builtin_cv_attributes + +Given an OP_LIST containing attribute definitions, filter it for known builtin +attributes to apply to the cv, returning a possibly-smaller list containing +just the remaining ones. + +=cut +*/ + +OP * +Perl_apply_builtin_cv_attributes(pTHX_ CV *cv, OP *attrlist) +{ + PERL_ARGS_ASSERT_APPLY_BUILTIN_CV_ATTRIBUTES; + + if(!attrlist) + return attrlist; + + if(attrlist->op_type != OP_LIST) { + /* Not in fact a list but just a single attribute */ + if(S_apply_builtin_cv_attribute(aTHX_ cv, attrlist)) { + op_free(attrlist); + return NULL; + } + + return attrlist; + } + + OP *prev = cLISTOPx(attrlist)->op_first; + assert(prev->op_type == OP_PUSHMARK); + OP *o = OpSIBLING(prev); + + OP *next; + for(; o; o = next) { + next = OpSIBLING(o); + + if(S_apply_builtin_cv_attribute(aTHX_ cv, o)) { + op_sibling_splice(attrlist, prev, 1, NULL); + op_free(o); + } + else { + prev = o; + } + } + + if(OpHAS_SIBLING(cLISTOPx(attrlist)->op_first)) + return attrlist; + + /* The list is now entirely empty, we might as well discard it */ + op_free(attrlist); + return NULL; +} + /* Do extra initialisation of a CV (typically one just created by * start_subparse()) if that CV is for a named sub @@ -12480,16 +12809,26 @@ S_yywarn(pTHX_ const char *const s, U32 } void -Perl_abort_execution(pTHX_ const char * const msg, const char * const name) +Perl_abort_execution(pTHX_ SV* msg_sv, const char * const name) { PERL_ARGS_ASSERT_ABORT_EXECUTION; - if (PL_minus_c) - Perl_croak(aTHX_ "%s%s had compilation errors.\n", msg, name); - else { - Perl_croak(aTHX_ - "%sExecution of %s aborted due to compilation errors.\n", msg, name); + if (msg_sv) { + if (PL_minus_c) + Perl_croak(aTHX_ "%" SVf "%s had compilation errors.\n", SVfARG(msg_sv), name); + else { + Perl_croak(aTHX_ + "%" SVf "Execution of %s aborted due to compilation errors.\n", SVfARG(msg_sv), name); + } + } else { + if (PL_minus_c) + Perl_croak(aTHX_ "%s had compilation errors.\n", name); + else { + Perl_croak(aTHX_ + "Execution of %s aborted due to compilation errors.\n", name); + } } + NOT_REACHED; /* NOTREACHED */ } @@ -12506,14 +12845,16 @@ int Perl_yyerror(pTHX_ const char *const s) { PERL_ARGS_ASSERT_YYERROR; - return yyerror_pvn(s, strlen(s), 0); + int r = yyerror_pvn(s, strlen(s), 0); + return r; } int Perl_yyerror_pv(pTHX_ const char *const s, U32 flags) { PERL_ARGS_ASSERT_YYERROR_PV; - return yyerror_pvn(s, strlen(s), flags); + int r = yyerror_pvn(s, strlen(s), flags); + return r; } int @@ -12576,9 +12917,9 @@ Perl_yyerror_pvn(pTHX_ const char *const Perl_sv_catpvf(aTHX_ where_sv, "\\%03o", yychar & 255); } msg = newSVpvn_flags(s, len, (flags & SVf_UTF8) | SVs_TEMP); - Perl_sv_catpvf(aTHX_ msg, " at %s line %" IVdf ", ", + Perl_sv_catpvf(aTHX_ msg, " at %s line %" LINE_Tf ", ", OutCopFILE(PL_curcop), - (IV)(PL_parser->preambling == NOLINE + (PL_parser->preambling == NOLINE ? CopLINE(PL_curcop) : PL_parser->preambling)); if (context) @@ -12591,8 +12932,8 @@ Perl_yyerror_pvn(pTHX_ const char *const { Perl_sv_catpvf(aTHX_ msg, " (Might be a runaway multi-line %c%c string starting on" - " line %" IVdf ")\n", - (int)PL_multi_open,(int)PL_multi_close,(IV)PL_multi_start); + " line %" LINE_Tf ")\n", + (int)PL_multi_open,(int)PL_multi_close,(line_t)PL_multi_start); PL_multi_end = 0; } if (PL_in_eval & EVAL_WARNONLY) { @@ -12603,24 +12944,11 @@ Perl_yyerror_pvn(pTHX_ const char *const qerror(msg); } } - if (s == NULL || PL_error_count >= 10) { - const char * msg = ""; - const char * const name = OutCopFILE(PL_curcop); - - if (PL_in_eval) { - SV * errsv = ERRSV; - if (SvCUR(errsv)) { - msg = Perl_form(aTHX_ "%" SVf, SVfARG(errsv)); - } - } + /* if there was no message then this is a yyquit(), which is actualy handled + * by qerror() with a NULL argument */ + if (s == NULL) + qerror(NULL); - if (s == NULL) { - abort_execution(msg, name); - } - else { - Perl_croak(aTHX_ "%s%s has too many errors.\n", msg, name); - } - } PL_in_my = 0; PL_in_my_stash = NULL; return 0; @@ -12983,6 +13311,18 @@ Perl_keyword_plugin_standard(pTHX_ return KEYWORD_PLUGIN_DECLINE; } +STRLEN +Perl_infix_plugin_standard(pTHX_ + char *operator_ptr, STRLEN operator_len, struct Perl_custom_infix **def) +{ + PERL_ARGS_ASSERT_INFIX_PLUGIN_STANDARD; + PERL_UNUSED_CONTEXT; + PERL_UNUSED_ARG(operator_ptr); + PERL_UNUSED_ARG(operator_len); + PERL_UNUSED_ARG(def); + return 0; +} + /* =for apidoc_section $lexer =for apidoc wrap_keyword_plugin @@ -13056,6 +13396,45 @@ Perl_wrap_keyword_plugin(pTHX_ KEYWORD_PLUGIN_MUTEX_UNLOCK; } +/* +=for apidoc wrap_infix_plugin + +B This API exists entirely for the purpose of making the CPAN module +C work. It is not expected that additional modules will make +use of it; rather, that they should use C to provide parsing +of new infix operators. + +Puts a C function into the chain of infix plugins. This is the preferred +way to manipulate the L variable. C is a +pointer to the C function that is to be added to the infix plugin chain, and +C points to a storage location where a pointer to the next +function in the chain will be stored. The value of C is written +into the L variable, while the value previously stored there +is written to C<*old_plugin_p>. + +Direct access to L should be avoided. + +=cut +*/ + +void +Perl_wrap_infix_plugin(pTHX_ + Perl_infix_plugin_t new_plugin, Perl_infix_plugin_t *old_plugin_p) +{ + + PERL_UNUSED_CONTEXT; + PERL_ARGS_ASSERT_WRAP_INFIX_PLUGIN; + if (*old_plugin_p) return; + /* We use the same mutex as for PL_keyword_plugin as it's so rare either + * of them is actually updated; no need for a dedicated one each */ + KEYWORD_PLUGIN_MUTEX_LOCK; + if (!*old_plugin_p) { + *old_plugin_p = PL_infix_plugin; + PL_infix_plugin = new_plugin; + } + KEYWORD_PLUGIN_MUTEX_UNLOCK; +} + #define parse_recdescent(g,p) S_parse_recdescent(aTHX_ g,p) static void S_parse_recdescent(pTHX_ int gramtype, I32 fakeeof) @@ -13352,7 +13731,7 @@ Perl_parse_label(pTHX_ U32 flags) t = s = PL_bufptr; if (!isIDFIRST_lazy_if_safe(s, PL_bufend, UTF)) goto no_label; - t = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &wlen); + t = scan_word6(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &wlen, FALSE); if (word_takes_any_delimiter(s, wlen)) goto no_label; bufptr_pos = s - SvPVX(PL_linestr); Index: gnu/usr.bin/perl/uconfig.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/uconfig.h,v diff -u -p -a -u -p -r1.12 uconfig.h --- gnu/usr.bin/perl/uconfig.h 15 Feb 2023 01:36:13 -0000 1.12 +++ gnu/usr.bin/perl/uconfig.h 21 Feb 2024 15:47:03 -0000 @@ -50,7 +50,7 @@ * This symbol, if defined, indicates that the chsize routine is available * to truncate files. You might need a -lx to get this routine. */ -/*#define HAS_CHSIZE / **/ +/*#define HAS_CHSIZE / **/ /* HAS_CRYPT: * This symbol, if defined, indicates that the crypt routine is available @@ -228,7 +228,7 @@ * This symbol, if defined, indicates that the mbstowcs routine is * available to convert a multibyte string into a wide character string. */ -/*#define HAS_MBSTOWCS / **/ +/*#define HAS_MBSTOWCS / **/ /* HAS_MBTOWC: * This symbol, if defined, indicates that the mbtowc routine is available @@ -596,7 +596,7 @@ * This symbol, if defined, indicates to the C program that it should * include to get inet_addr and friends declarations. */ -/*#define I_ARPA_INET / **/ +/*#define I_ARPA_INET / **/ /* I_DBM: * This symbol, if defined, indicates that exists and should @@ -630,7 +630,7 @@ * This symbol, if defined, indicates to the C program that it should * include . */ -/*#define I_LOCALE / **/ +/*#define I_LOCALE / **/ /* I_NETINET_IN: * This symbol, if defined, indicates to the C program that it should @@ -658,7 +658,7 @@ * This symbol, if defined, indicates the should be included * to get socket ioctl options, like SIOCATMARK. */ -/*#define I_SYS_IOCTL / **/ +/*#define I_SYS_IOCTL / **/ /*#define I_SYS_SOCKIO / **/ /* I_SYS_NDIR: @@ -696,19 +696,19 @@ * This symbol, if defined, indicates to the C program that it should * include . */ -#define I_SYS_STAT /**/ +#define I_SYS_STAT /**/ /* I_SYS_TIMES: * This symbol, if defined, indicates to the C program that it should * include . */ -/*#define I_SYS_TIMES / **/ +/*#define I_SYS_TIMES / **/ /* I_SYS_TYPES: * This symbol, if defined, indicates to the C program that it should * include . */ -/*#define I_SYS_TYPES / **/ +/*#define I_SYS_TYPES / **/ /* I_SYS_UN: * This symbol, if defined, indicates to the C program that it should @@ -862,7 +862,7 @@ * This symbol is defined if the C compiler can cast negative * or large floating point numbers to 32-bit ints. */ -/*#define CASTI32 / **/ +/*#define CASTI32 / **/ /* CASTNEGFLOAT: * This symbol is defined if the C compiler can cast negative @@ -876,7 +876,7 @@ * 2 = couldn't cast >= 0x80000000 * 4 = couldn't cast in argument expression list */ -/*#define CASTNEGFLOAT / **/ +/*#define CASTNEGFLOAT / **/ #define CASTFLAGS 0 /**/ /* VOID_CLOSEDIR: @@ -978,13 +978,13 @@ * This symbol, if defined, indicates that siginfo_t has the * si_value member */ -/*#define HAS_SIGINFO_SI_ERRNO / **/ -/*#define HAS_SIGINFO_SI_PID / **/ -/*#define HAS_SIGINFO_SI_UID / **/ -/*#define HAS_SIGINFO_SI_ADDR / **/ -/*#define HAS_SIGINFO_SI_STATUS / **/ -/*#define HAS_SIGINFO_SI_BAND / **/ -/*#define HAS_SIGINFO_SI_VALUE / **/ +/*#define HAS_SIGINFO_SI_ERRNO / **/ +/*#define HAS_SIGINFO_SI_PID / **/ +/*#define HAS_SIGINFO_SI_UID / **/ +/*#define HAS_SIGINFO_SI_ADDR / **/ +/*#define HAS_SIGINFO_SI_STATUS / **/ +/*#define HAS_SIGINFO_SI_BAND / **/ +/*#define HAS_SIGINFO_SI_VALUE / **/ /* HAS_SIGSETJMP: * This variable indicates to the C program that the sigsetjmp() @@ -1214,7 +1214,7 @@ * This symbol, if defined, indicates that this system uses * EBCDIC encoding. */ -/*#define EBCDIC / **/ +/*#define EBCDIC / **/ /* ARCHLIB: * This variable, if defined, holds the name of the directory in @@ -1229,8 +1229,8 @@ * This symbol contains the ~name expanded version of ARCHLIB, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -/*#define ARCHLIB "/usr/local/lib/perl5/5.36/unknown" / **/ -/*#define ARCHLIB_EXP "/usr/local/lib/perl5/5.36/unknown" / **/ +/*#define ARCHLIB "/usr/local/lib/perl5/5.38/unknown" / **/ +/*#define ARCHLIB_EXP "/usr/local/lib/perl5/5.38/unknown" / **/ /* BIN: * This symbol holds the path of the bin directory where the package will @@ -1283,8 +1283,8 @@ * This symbol contains the ~name expanded version of PRIVLIB, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -#define PRIVLIB "/usr/local/lib/perl5/5.36" /**/ -#define PRIVLIB_EXP "/usr/local/lib/perl5/5.36" /**/ +#define PRIVLIB "/usr/local/lib/perl5/5.38" /**/ +#define PRIVLIB_EXP "/usr/local/lib/perl5/5.38" /**/ /* SITEARCH: * This symbol contains the name of the private library for this package. @@ -1301,8 +1301,8 @@ * This symbol contains the ~name expanded version of SITEARCH, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -/*#define SITEARCH "/usr/local/lib/perl5/5.36/unknown" / **/ -/*#define SITEARCH_EXP "/usr/local/lib/perl5/5.36/unknown" / **/ +/*#define SITEARCH "/usr/local/lib/perl5/5.38/unknown" / **/ +/*#define SITEARCH_EXP "/usr/local/lib/perl5/5.38/unknown" / **/ /* SITELIB: * This symbol contains the name of the private library for this package. @@ -1324,8 +1324,8 @@ * removed. The elements in inc_version_list (inc_version_list.U) can * be tacked onto this variable to generate a list of directories to search. */ -#define SITELIB "/usr/local/lib/perl5/5.36" /**/ -#define SITELIB_EXP "/usr/local/lib/perl5/5.36" /**/ +#define SITELIB "/usr/local/lib/perl5/5.38" /**/ +#define SITELIB_EXP "/usr/local/lib/perl5/5.38" /**/ #define SITELIB_STEM "/usr/local/lib/perl5" /**/ /* PERL_VENDORARCH: @@ -1460,6 +1460,10 @@ * Can we handle GCC attribute for functions that should always be * inlined. */ +/* HASATTRIBUTE_VISIBILITY: + * Can we handle GCC attribute for functions that should have a + * different visibility. + */ /*#define HASATTRIBUTE_DEPRECATED / **/ /*#define HASATTRIBUTE_FORMAT / **/ /*#define PRINTF_FORMAT_NULL_OK / **/ @@ -1470,6 +1474,7 @@ /*#define HASATTRIBUTE_UNUSED / **/ /*#define HASATTRIBUTE_WARN_UNUSED_RESULT / **/ /*#define HASATTRIBUTE_ALWAYS_INLINE / **/ +/*#define HASATTRIBUTE_VISIBILITY / **/ /* HAS_BACKTRACE: * This symbol, if defined, indicates that the backtrace() routine is @@ -1556,7 +1561,7 @@ * This symbol, if defined, indicates that the system supports filenames * longer than 14 characters. */ -/*#define FLEXFILENAMES / **/ +/*#define FLEXFILENAMES / **/ /* HAS_GETGRENT: * This symbol, if defined, indicates that the getgrent routine is @@ -1935,16 +1940,16 @@ * This symbol, if defined, indicates the availability of * struct ipv6_mreq_source; */ -/*#define HAS_SOCKET / **/ -/*#define HAS_SOCKETPAIR / **/ -/*#define HAS_SOCKADDR_SA_LEN / **/ -/*#define HAS_SOCKADDR_IN6 / **/ -/*#define HAS_SOCKADDR_STORAGE / **/ -/*#define HAS_SIN6_SCOPE_ID / **/ -/*#define HAS_IP_MREQ / **/ -/*#define HAS_IP_MREQ_SOURCE / **/ -/*#define HAS_IPV6_MREQ / **/ -/*#define HAS_IPV6_MREQ_SOURCE / **/ +/*#define HAS_SOCKET / **/ +/*#define HAS_SOCKETPAIR / **/ +/*#define HAS_SOCKADDR_SA_LEN / **/ +/*#define HAS_SOCKADDR_IN6 / **/ +/*#define HAS_SOCKADDR_STORAGE / **/ +/*#define HAS_SIN6_SCOPE_ID / **/ +/*#define HAS_IP_MREQ / **/ +/*#define HAS_IP_MREQ_SOURCE / **/ +/*#define HAS_IPV6_MREQ / **/ +/*#define HAS_IPV6_MREQ_SOURCE / **/ /* USE_STAT_BLOCKS: * This symbol is defined if this system has a stat structure declaring @@ -2146,7 +2151,7 @@ * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SYSUIO / **/ +/*#define I_SYSUIO / **/ /* I_TERMIO: * This symbol, if defined, indicates that the program should include @@ -2245,8 +2250,8 @@ * Perl has been cross-compiled to. Undefined if not a cross-compile. */ #ifndef USE_CROSS_COMPILE -/*#define USE_CROSS_COMPILE / **/ -#define PERL_TARGETARCH "" /**/ +/*#define USE_CROSS_COMPILE / **/ +#define PERL_TARGETARCH "" /**/ #endif /* PERL_USE_DEVEL: @@ -2254,7 +2259,7 @@ * -Dusedevel, to enable development features. This should not be * done for production builds. */ -/*#define PERL_USE_DEVEL / **/ +/*#define PERL_USE_DEVEL / **/ /* HAS_ATOLF: * This symbol, if defined, indicates that the atolf routine is @@ -2340,7 +2345,7 @@ /* HAS_C99_VARIADIC_MACROS: * If defined, the compiler supports C99 variadic macros. */ -/*#define HAS_C99_VARIADIC_MACROS / **/ +/*#define HAS_C99_VARIADIC_MACROS / **/ /* HAS_CLASS: * This symbol, if defined, indicates that the class routine is @@ -2396,10 +2401,10 @@ * to the program to supply one. A good guess is * extern int dbminit(char *); */ -/*#define HAS_DBMINIT_PROTO / **/ +/*#define HAS_DBMINIT_PROTO / **/ /* HAS_DIR_DD_FD: - * This symbol, if defined, indicates that the the DIR* dirstream + * This symbol, if defined, indicates that the DIR* dirstream * structure contains a member variable named dd_fd. */ /*#define HAS_DIR_DD_FD / **/ @@ -2416,7 +2421,7 @@ * makes sense if you *have* dlsym, which we will presume is the * case if you're using dl_dlopen.xs. */ -/*#define DLSYM_NEEDS_UNDERSCORE / **/ +/*#define DLSYM_NEEDS_UNDERSCORE / **/ /* HAS_DUP3: * This symbol, if defined, indicates that the dup3 routine is @@ -2519,7 +2524,7 @@ * to the program to supply one. A good guess is * extern int flock(int, int); */ -/*#define HAS_FLOCK_PROTO / **/ +/*#define HAS_FLOCK_PROTO / **/ /* HAS_FMA: * This symbol, if defined, indicates that the fma routine is @@ -2605,8 +2610,8 @@ * FP_NAN NaN * */ -/*#define HAS_FPCLASSIFY / **/ -/*#define HAS_FP_CLASSIFY / **/ +/*#define HAS_FPCLASSIFY / **/ +/*#define HAS_FP_CLASSIFY / **/ /* HAS_FPCLASSL: * This symbol, if defined, indicates that the fpclassl routine is @@ -2635,7 +2640,7 @@ /* HAS_FPOS64_T: * This symbol will be defined if the C compiler supports fpos64_t. */ -/*#define HAS_FPOS64_T / **/ +/*#define HAS_FPOS64_T / **/ /* HAS_FREXPL: * This symbol, if defined, indicates that the frexpl routine is @@ -2665,11 +2670,11 @@ /* HAS_UNLINKAT: * This symbol is defined if the unlinkat() routine is available. */ -/*#define HAS_FCHMODAT / **/ -/*#define HAS_LINKAT / **/ -/*#define HAS_OPENAT / **/ -/*#define HAS_RENAMEAT / **/ -/*#define HAS_UNLINKAT / **/ +/*#define HAS_FCHMODAT / **/ +/*#define HAS_LINKAT / **/ +/*#define HAS_OPENAT / **/ +/*#define HAS_RENAMEAT / **/ +/*#define HAS_UNLINKAT / **/ /* HAS_FSEEKO: * This symbol, if defined, indicates that the fseeko routine is @@ -2877,8 +2882,8 @@ * j0l() function is available for Bessel functions of the first * kind of the order zero, for long doubles. */ -/*#define HAS_J0 / **/ -/*#define HAS_J0L / **/ +/*#define HAS_J0 / **/ +/*#define HAS_J0L / **/ /* HAS_LC_MONETARY_2008: * This symbol, if defined, indicates that the localeconv routine is @@ -3114,13 +3119,13 @@ * This symbol, if defined, indicates that the C program should * include to get newlocale() and its friends. */ -/*#define HAS_NEWLOCALE / **/ -/*#define HAS_FREELOCALE / **/ -/*#define HAS_USELOCALE / **/ -/*#define HAS_DUPLOCALE / **/ -/*#define HAS_QUERYLOCALE / **/ -/*#define NEED_XLOCALE_H / **/ -/*#define I_XLOCALE / **/ +/*#define HAS_NEWLOCALE / **/ +/*#define HAS_FREELOCALE / **/ +/*#define HAS_USELOCALE / **/ +/*#define HAS_DUPLOCALE / **/ +/*#define HAS_QUERYLOCALE / **/ +/*#define NEED_XLOCALE_H / **/ +/*#define I_XLOCALE / **/ /* HAS_NEXTAFTER: * This symbol, if defined, indicates that the nextafter routine is @@ -3146,7 +3151,7 @@ /* HAS_OFF64_T: * This symbol will be defined if the C compiler supports off64_t. */ -/*#define HAS_OFF64_T / **/ +/*#define HAS_OFF64_T / **/ /* HAS_PIPE2: * This symbol, if defined, indicates that the pipe2 routine is @@ -3191,7 +3196,7 @@ /* HAS_PTRDIFF_T: * This symbol will be defined if the C compiler supports ptrdiff_t. */ -#define HAS_PTRDIFF_T /**/ +#define HAS_PTRDIFF_T /**/ /* HAS_READV: * This symbol, if defined, indicates that the readv routine is @@ -3238,7 +3243,7 @@ * extern void* sbrk(int); * extern void* sbrk(size_t); */ -/*#define HAS_SBRK_PROTO / **/ +/*#define HAS_SBRK_PROTO / **/ /* HAS_SCALBN: * This symbol, if defined, indicates that the scalbn routine is @@ -3259,6 +3264,12 @@ */ /*#define HAS_SENDMSG / **/ +/* HAS_SETENV: + * This symbol, if defined, indicates that the setenv routine is + * available for use. + */ +/*#define HAS_SETENV / **/ + /* HAS_SETITIMER: * This symbol, if defined, indicates that the setitimer routine is * available to set interval timers. @@ -3304,7 +3315,7 @@ * be used. */ #ifndef USE_SITECUSTOMIZE -/*#define USE_SITECUSTOMIZE / **/ +/*#define USE_SITECUSTOMIZE / **/ #endif /* HAS_SNPRINTF: @@ -3330,7 +3341,7 @@ * to the program to supply one. A good guess is * extern int sockatmark(int); */ -/*#define HAS_SOCKATMARK_PROTO / **/ +/*#define HAS_SOCKATMARK_PROTO / **/ /* HAS_SOCKS5_INIT: * This symbol, if defined, indicates that the socks5_init routine is @@ -3350,7 +3361,7 @@ * to the program to supply one. Good guesses are * extern int setresgid(uid_t ruid, uid_t euid, uid_t suid); */ -/*#define HAS_SETRESGID_PROTO / **/ +/*#define HAS_SETRESGID_PROTO / **/ /* HAS_SETRESUID_PROTO: * This symbol, if defined, indicates that the system provides @@ -3358,7 +3369,7 @@ * to the program to supply one. Good guesses are * extern int setresuid(uid_t ruid, uid_t euid, uid_t suid); */ -/*#define HAS_SETRESUID_PROTO / **/ +/*#define HAS_SETRESUID_PROTO / **/ /* HAS_STRUCT_STATFS_F_FLAGS: * This symbol, if defined, indicates that the struct statfs @@ -3457,7 +3468,7 @@ * extern int syscall(int, ...); * extern int syscall(long, ...); */ -/*#define HAS_SYSCALL_PROTO / **/ +/*#define HAS_SYSCALL_PROTO / **/ /* HAS_TELLDIR_PROTO: * This symbol, if defined, indicates that the system provides @@ -3465,7 +3476,7 @@ * to the program to supply one. A good guess is * extern long telldir(DIR*); */ -/*#define HAS_TELLDIR_PROTO / **/ +/*#define HAS_TELLDIR_PROTO / **/ /* HAS_TGAMMA: * This symbol, if defined, indicates that the tgamma routine is @@ -3497,12 +3508,12 @@ * This symbol, if defined, indicates that the asctime64 () routine is * available to do the 64bit variant of asctime () */ -/*#define HAS_CTIME64 / **/ -/*#define HAS_LOCALTIME64 / **/ -/*#define HAS_GMTIME64 / **/ -/*#define HAS_MKTIME64 / **/ -/*#define HAS_DIFFTIME64 / **/ -/*#define HAS_ASCTIME64 / **/ +/*#define HAS_CTIME64 / **/ +/*#define HAS_LOCALTIME64 / **/ +/*#define HAS_GMTIME64 / **/ +/*#define HAS_MKTIME64 / **/ +/*#define HAS_DIFFTIME64 / **/ +/*#define HAS_ASCTIME64 / **/ /* HAS_TIMEGM: * This symbol, if defined, indicates that the timegm routine is @@ -3567,7 +3578,7 @@ * to the program to supply one. A good guess is * extern int usleep(useconds_t); */ -/*#define HAS_USLEEP_PROTO / **/ +/*#define HAS_USLEEP_PROTO / **/ /* HAS_USTAT: * This symbol, if defined, indicates that the ustat system call is @@ -3583,7 +3594,7 @@ /* HAS_WCSXFRM: * This symbol, if defined, indicates that the wcsxfrm routine is - * available to tranform a wide character string for wcscmp(). + * available to transform a wide character string for wcscmp(). */ /*#define HAS_WCSXFRM / **/ @@ -3618,20 +3629,20 @@ * Note that if fflushNULL is defined, fflushall will not * even be probed for and will be left undefined. */ -/*#define FFLUSH_NULL / **/ -/*#define FFLUSH_ALL / **/ +/*#define FFLUSH_NULL / **/ +/*#define FFLUSH_ALL / **/ /* I_BFD: * This symbol, if defined, indicates that exists and * can be included. */ -/*#define I_BFD / **/ +/*#define I_BFD / **/ /* I_CRYPT: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_CRYPT / **/ +/*#define I_CRYPT / **/ /* DB_Prefix_t: * This symbol contains the type of the prefix structure element @@ -3673,19 +3684,19 @@ * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_FP / **/ +/*#define I_FP / **/ /* I_FP_CLASS: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_FP_CLASS / **/ +/*#define I_FP_CLASS / **/ /* I_IEEEFP: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_IEEEFP / **/ +/*#define I_IEEEFP / **/ /* I_INTTYPES: * This symbol, if defined, indicates to the C program that it should @@ -3697,13 +3708,13 @@ * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_LANGINFO / **/ +/*#define I_LANGINFO / **/ /* I_LIBUTIL: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_LIBUTIL / **/ +/*#define I_LIBUTIL / **/ /* I_MALLOCMALLOC: * This symbol, if defined, indicates to the C program that it should @@ -3715,7 +3726,7 @@ * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_MNTENT / **/ +/*#define I_MNTENT / **/ /* I_NETINET_TCP: * This symbol, if defined, indicates to the C program that it should @@ -3727,37 +3738,37 @@ * This symbol, if defined, indicates that exists and * should be included. (see also HAS_POLL) */ -/*#define I_POLL / **/ +/*#define I_POLL / **/ /* I_PROT: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_PROT / **/ +/*#define I_PROT / **/ /* I_QUADMATH: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_QUADMATH / **/ +/*#define I_QUADMATH / **/ /* I_SHADOW: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SHADOW / **/ +/*#define I_SHADOW / **/ /* I_SOCKS: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SOCKS / **/ +/*#define I_SOCKS / **/ /* I_STDBOOL: * This symbol, if defined, indicates that exists and * can be included. */ -/*#define I_STDBOOL / **/ +/*#define I_STDBOOL / **/ /* I_STDINT: * This symbol, if defined, indicates that exists and @@ -3769,54 +3780,59 @@ * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SUNMATH / **/ +/*#define I_SUNMATH / **/ /* I_SYSLOG: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SYSLOG / **/ +/*#define I_SYSLOG / **/ /* I_SYSMODE: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SYSMODE / **/ +/*#define I_SYSMODE / **/ /* I_SYS_MOUNT: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SYS_MOUNT / **/ +/*#define I_SYS_MOUNT / **/ /* I_SYS_STATFS: * This symbol, if defined, indicates that exists. */ -/*#define I_SYS_STATFS / **/ +/*#define I_SYS_STATFS / **/ /* I_SYS_STATVFS: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SYS_STATVFS / **/ +/*#define I_SYS_STATVFS / **/ + +/* I_SYS_SYSCALL: + * This symbol, if defined, indicates that exists. + */ +/*#define I_SYS_SYSCALL / **/ /* I_SYSUTSNAME: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SYSUTSNAME / **/ +/*#define I_SYSUTSNAME / **/ /* I_SYS_VFS: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SYS_VFS / **/ +/*#define I_SYS_VFS / **/ /* I_USTAT: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_USTAT / **/ +/*#define I_USTAT / **/ /* I_WCHAR: * This symbol, if defined, indicates to the C program that @@ -3827,7 +3843,7 @@ /* I_WCTYPE: * This symbol, if defined, indicates that exists. */ -/*#define I_WCTYPE / **/ +/*#define I_WCTYPE / **/ /* DOUBLEINFBYTES: * This symbol, if defined, is a comma-separated list of @@ -3978,7 +3994,33 @@ * of copying mechanisms, handy.h defines a platform- * independent macro, Perl_va_copy(src, dst), to do the job. */ -#define NEED_VA_COPY /**/ +#define NEED_VA_COPY /**/ + +/* I32df: + * This symbol defines the format string used for printing a Perl I32 + * as a signed decimal integer. + */ +/* U32uf: + * This symbol defines the format string used for printing a Perl U32 + * as an unsigned decimal integer. + */ +/* U32of: + * This symbol defines the format string used for printing a Perl U32 + * as an unsigned octal integer. + */ +/* U32xf: + * This symbol defines the format string used for printing a Perl U32 + * as an unsigned hexadecimal integer in lowercase abcdef. + */ +/* U32Xf: + * This symbol defines the format string used for printing a Perl U32 + * as an unsigned hexadecimal integer in uppercase ABCDEF. + */ +#define I32df "ld" /**/ +#define U32of "lo" /**/ +#define U32uf "lu" /**/ +#define U32xf "lx" /**/ +#define U32Xf "lX" /**/ /* IVTYPE: * This symbol defines the C type used for Perl's IV. @@ -4069,35 +4111,35 @@ * This symbol, if defined, indicates that a variable of type NVTYPE * stores 0.0 in memory as all bits zero. */ -#define IVTYPE long /**/ -#define UVTYPE unsigned long /**/ -#define I8TYPE signed char /**/ -#define U8TYPE unsigned char /**/ -#define I16TYPE short /**/ -#define U16TYPE unsigned short /**/ -#define I32TYPE long /**/ -#define U32TYPE unsigned long /**/ +#define IVTYPE long /**/ +#define UVTYPE unsigned long /**/ +#define I8TYPE signed char /**/ +#define U8TYPE unsigned char /**/ +#define I16TYPE short /**/ +#define U16TYPE unsigned short /**/ +#define I32TYPE long /**/ +#define U32TYPE unsigned long /**/ #ifdef HAS_QUAD -#define I64TYPE int64_t /**/ -#define U64TYPE uint64_t /**/ +#define I64TYPE int64_t /**/ +#define U64TYPE uint64_t /**/ #endif -#define NVTYPE double /**/ -#define IVSIZE 4 /**/ -#define UVSIZE 4 /**/ -#define I8SIZE 1 /**/ -#define U8SIZE 1 /**/ -#define I16SIZE 2 /**/ -#define U16SIZE 2 /**/ -#define I32SIZE 4 /**/ -#define U32SIZE 4 /**/ +#define NVTYPE double /**/ +#define IVSIZE 4 /**/ +#define UVSIZE 4 /**/ +#define I8SIZE 1 /**/ +#define U8SIZE 1 /**/ +#define I16SIZE 2 /**/ +#define U16SIZE 2 /**/ +#define I32SIZE 4 /**/ +#define U32SIZE 4 /**/ #ifdef HAS_QUAD -#define I64SIZE 8 /**/ -#define U64SIZE 8 /**/ +#define I64SIZE 8 /**/ +#define U64SIZE 8 /**/ #endif -#define NVSIZE 8 /**/ +#define NVSIZE 8 /**/ #undef NV_PRESERVES_UV -#define NV_PRESERVES_UV_BITS 0 -#define NV_OVERFLOWS_INTEGERS_AT (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0) +#define NV_PRESERVES_UV_BITS 0 +#define NV_OVERFLOWS_INTEGERS_AT (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0) #undef NV_ZERO_IS_ALLBITS_ZERO #if UVSIZE == 8 # ifdef BYTEORDER @@ -4145,14 +4187,14 @@ * This symbol defines the format string used for printing a Perl NV * using %g-ish floating point format. */ -#define IVdf "ld" /**/ -#define UVuf "lu" /**/ -#define UVof "lo" /**/ -#define UVxf "lx" /**/ -#define UVXf "lX" /**/ -#define NVef "e" /**/ -#define NVff "f" /**/ -#define NVgf "g" /**/ +#define IVdf "ld" /**/ +#define UVuf "lu" /**/ +#define UVof "lo" /**/ +#define UVxf "lx" /**/ +#define UVXf "lX" /**/ +#define NVef "e" /**/ +#define NVff "f" /**/ +#define NVgf "g" /**/ /* SELECT_MIN_BITS: * This symbol holds the minimum number of bits operated by select. @@ -4198,7 +4240,7 @@ * This symbol tells the name of the array holding the stdio streams. * Usual values include _iob, __iob, and __sF. */ -/*#define HAS_STDIO_STREAM_ARRAY / **/ +/*#define HAS_STDIO_STREAM_ARRAY / **/ #ifdef HAS_STDIO_STREAM_ARRAY #define STDIO_STREAM_ARRAY #endif @@ -4243,10 +4285,10 @@ * you may need at least to reboot your OS to 64-bit mode. */ #ifndef USE_64_BIT_INT -/*#define USE_64_BIT_INT / **/ +/*#define USE_64_BIT_INT / **/ #endif #ifndef USE_64_BIT_ALL -/*#define USE_64_BIT_ALL / **/ +/*#define USE_64_BIT_ALL / **/ #endif /* USE_C_BACKTRACE: @@ -4273,7 +4315,7 @@ * Defaults to define in Perls 5.8 and earlier, to undef later. */ #ifndef USE_FAST_STDIO -/*#define USE_FAST_STDIO / **/ +/*#define USE_FAST_STDIO / **/ #endif /* USE_KERN_PROC_PATHNAME: @@ -4288,7 +4330,7 @@ * should be used when available. */ #ifndef USE_LARGE_FILES -/*#define USE_LARGE_FILES / **/ +/*#define USE_LARGE_FILES / **/ #endif /* USE_LONG_DOUBLE: @@ -4296,7 +4338,7 @@ * be used when available. */ #ifndef USE_LONG_DOUBLE -/*#define USE_LONG_DOUBLE / **/ +/*#define USE_LONG_DOUBLE / **/ #endif /* USE_MORE_BITS: @@ -4304,7 +4346,7 @@ * long doubles should be used when available. */ #ifndef USE_MORE_BITS -/*#define USE_MORE_BITS / **/ +/*#define USE_MORE_BITS / **/ #endif /* MULTIPLICITY: @@ -4312,7 +4354,7 @@ * be built to use multiplicity. */ #ifndef MULTIPLICITY -/*#define MULTIPLICITY / **/ +/*#define MULTIPLICITY / **/ #endif /* USE_NSGETEXECUTABLEPATH: @@ -4328,7 +4370,7 @@ * used in a fully backward compatible manner. */ #ifndef USE_PERLIO -/*#define USE_PERLIO / **/ +/*#define USE_PERLIO / **/ #endif /* USE_QUADMATH: @@ -4336,7 +4378,7 @@ * be used when available. */ #ifndef USE_QUADMATH -/*#define USE_QUADMATH / **/ +/*#define USE_QUADMATH / **/ #endif /* USE_SOCKS: @@ -4344,7 +4386,7 @@ * be built to use socks. */ #ifndef USE_SOCKS -/*#define USE_SOCKS / **/ +/*#define USE_SOCKS / **/ #endif /* HAS_DRAND48_PROTO: @@ -4353,7 +4395,7 @@ * to the program to supply one. A good guess is * extern double drand48(void); */ -/*#define HAS_DRAND48_PROTO / **/ +/*#define HAS_DRAND48_PROTO / **/ /* HAS_GETHOST_PROTOS: * This symbol, if defined, indicates that includes @@ -4361,7 +4403,7 @@ * gethostbyaddr(). Otherwise, it is up to the program to guess * them. See netdbtype.U for probing for various Netdb_xxx_t types. */ -/*#define HAS_GETHOST_PROTOS / **/ +/*#define HAS_GETHOST_PROTOS / **/ /* HAS_GETNET_PROTOS: * This symbol, if defined, indicates that includes @@ -4369,7 +4411,7 @@ * getnetbyaddr(). Otherwise, it is up to the program to guess * them. See netdbtype.U for probing for various Netdb_xxx_t types. */ -/*#define HAS_GETNET_PROTOS / **/ +/*#define HAS_GETNET_PROTOS / **/ /* HAS_GETPROTO_PROTOS: * This symbol, if defined, indicates that includes @@ -4377,7 +4419,7 @@ * getprotobyaddr(). Otherwise, it is up to the program to guess * them. See netdbtype.U for probing for various Netdb_xxx_t types. */ -/*#define HAS_GETPROTO_PROTOS / **/ +/*#define HAS_GETPROTO_PROTOS / **/ /* HAS_GETSERV_PROTOS: * This symbol, if defined, indicates that includes @@ -4385,7 +4427,7 @@ * getservbyaddr(). Otherwise, it is up to the program to guess * them. See netdbtype.U for probing for various Netdb_xxx_t types. */ -/*#define HAS_GETSERV_PROTOS / **/ +/*#define HAS_GETSERV_PROTOS / **/ /* HAS_LSEEK_PROTO: * This symbol, if defined, indicates that the system provides @@ -4393,7 +4435,7 @@ * to the program to supply one. A good guess is * extern off_t lseek(int, off_t, int); */ -/*#define HAS_LSEEK_PROTO / **/ +/*#define HAS_LSEEK_PROTO / **/ /* Netdb_host_t: * This symbol holds the type used for the 1st argument @@ -5216,10 +5258,10 @@ * try to use the various _r versions of library functions. * This is extremely experimental. */ -/*#define USE_ITHREADS / **/ -/*#define USE_THREADS / **/ -/*#define OLD_PTHREADS_API / **/ -/*#define USE_REENTRANT_API / **/ +/*#define USE_ITHREADS / **/ +/*#define USE_THREADS / **/ +/*#define OLD_PTHREADS_API / **/ +/*#define USE_REENTRANT_API / **/ /* HAS_TIME: * This symbol, if defined, indicates that the time() routine exists. @@ -5249,7 +5291,7 @@ /* Gid_t_f: * This symbol defines the format string used for printing a Gid_t. */ -#define Gid_t_f "lu" /**/ +#define Gid_t_f "lu" /**/ /* Gid_t_sign: * This symbol holds the signedness of a Gid_t. @@ -5317,7 +5359,7 @@ /* Uid_t_f: * This symbol defines the format string used for printing a Uid_t. */ -#define Uid_t_f "lu" /**/ +#define Uid_t_f "lu" /**/ /* Uid_t_sign: * This symbol holds the signedness of a Uid_t. @@ -5340,6 +5382,6 @@ #endif /* Generated from: - * 87e5998978daf803d19866c43bca24d7c01dc74119650db16f8d18d83f355da9 config_h.SH - * 1a5fe19cbcfd68ba70230580fd344189b5c78c11b2285efd5976366e51b3257e uconfig.sh - * ex: set ro: */ + * e17a83ff6ae98071d846d4a001f6ce1a669df08c357fe153c2370adc4910135e config_h.SH + * 8d785207fec43bbad5118a8125e625d1cc654455994f09a76c1625b2ae2ae2d0 uconfig.sh + * ex: set ro ft=c: */ Index: gnu/usr.bin/perl/uconfig.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/uconfig.sh,v diff -u -p -a -u -p -r1.12 uconfig.sh --- gnu/usr.bin/perl/uconfig.sh 15 Feb 2023 01:36:13 -0000 1.12 +++ gnu/usr.bin/perl/uconfig.sh 21 Feb 2024 15:47:03 -0000 @@ -6,8 +6,8 @@ afs='false' afsroot='/afs' alignbytes='4' aphostname='/bin/hostname' -archlib='/usr/local/lib/perl5/5.36/unknown' -archlibexp='/usr/local/lib/perl5/5.36/unknown' +archlib='/usr/local/lib/perl5/5.38/unknown' +archlibexp='/usr/local/lib/perl5/5.38/unknown' archname='unknown' asctime_r_proto='0' bin='/usr/local/bin' @@ -63,6 +63,7 @@ d_attribute_nonnull='undef' d_attribute_noreturn='undef' d_attribute_pure='undef' d_attribute_unused='undef' +d_attribute_visibility='undef' d_attribute_warn_unused_result='undef' d_backtrace='undef' d_bsd='undef' @@ -429,6 +430,7 @@ d_semget='undef' d_semop='undef' d_sendmsg='undef' d_setegid='undef' +d_setenv='undef' d_seteuid='undef' d_setgrent='undef' d_setgrent_r='undef' @@ -645,6 +647,7 @@ h_fcntl='false' h_sysfile='true' i16size='2' i16type='short' +i32dformat='"ld"' i32size='4' i32type='long' i64size='8' @@ -715,6 +718,7 @@ i_syssockio='undef' i_sysstat='define' i_sysstatfs='undef' i_sysstatvfs='undef' +i_syssyscall='undef' i_systime='undef' i_systimek='undef' i_systimes='undef' @@ -789,8 +793,8 @@ perl_static_inline='static' perl_thread_local='' phostname='hostname' pidtype=int -privlib='/usr/local/lib/perl5/5.36' -privlibexp='/usr/local/lib/perl5/5.36' +privlib='/usr/local/lib/perl5/5.38' +privlibexp='/usr/local/lib/perl5/5.38' procselfexe='' prototype='undef' ptrsize='4' @@ -840,11 +844,11 @@ sig_name_init='0' sig_num_init='0' sig_size='1' signal_t=int -sitearch='/usr/local/lib/perl5/5.36/unknown' -sitearchexp='/usr/local/lib/perl5/5.36/unknown' -sitelib='/usr/local/lib/perl5/5.36' +sitearch='/usr/local/lib/perl5/5.38/unknown' +sitearchexp='/usr/local/lib/perl5/5.38/unknown' +sitelib='/usr/local/lib/perl5/5.38' sitelib_stem='/usr/local/lib/perl5' -sitelibexp='/usr/local/lib/perl5/5.36' +sitelibexp='/usr/local/lib/perl5/5.38' sizesize=4 sizetype='size_t' socksizetype='int' @@ -873,8 +877,12 @@ touch='touch' ttyname_r_proto='0' u16size='2' u16type='unsigned short' +u32XUformat='"lX"' +u32oformat='"lo"' u32size='4' u32type='unsigned long' +u32uformat='"lu"' +u32xformat='"lx"' u64size='8' u64type='uint64_t' u8size='1' Index: gnu/usr.bin/perl/uconfig64.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/uconfig64.sh,v diff -u -p -a -u -p -r1.12 uconfig64.sh --- gnu/usr.bin/perl/uconfig64.sh 15 Feb 2023 01:36:13 -0000 1.12 +++ gnu/usr.bin/perl/uconfig64.sh 21 Feb 2024 15:47:03 -0000 @@ -6,8 +6,8 @@ afs='false' afsroot='/afs' alignbytes='8' aphostname='/bin/hostname' -archlib='/usr/local/lib/perl5/5.36/unknown' -archlibexp='/usr/local/lib/perl5/5.36/unknown' +archlib='/usr/local/lib/perl5/5.38/unknown' +archlibexp='/usr/local/lib/perl5/5.38/unknown' archname='unknown64' asctime_r_proto='0' bin='/usr/local/bin' @@ -63,6 +63,7 @@ d_attribute_nonnull='undef' d_attribute_noreturn='undef' d_attribute_pure='undef' d_attribute_unused='undef' +d_attribute_visibility='undef' d_attribute_warn_unused_result='undef' d_backtrace='undef' d_bsd='undef' @@ -429,6 +430,7 @@ d_semget='undef' d_semop='undef' d_sendmsg='undef' d_setegid='undef' +d_setenv='undef' d_seteuid='undef' d_setgrent='undef' d_setgrent_r='undef' @@ -645,6 +647,7 @@ h_fcntl='false' h_sysfile='true' i16size='2' i16type='short' +i32dformat='"d"' i32size='4' i32type='int' i64size='8' @@ -715,6 +718,7 @@ i_syssockio='undef' i_sysstat='define' i_sysstatfs='undef' i_sysstatvfs='undef' +i_syssyscall='undef' i_systime='undef' i_systimek='undef' i_systimes='undef' @@ -789,8 +793,8 @@ perl_static_inline='static' perl_thread_local='' phostname='hostname' pidtype=int -privlib='/usr/local/lib/perl5/5.36' -privlibexp='/usr/local/lib/perl5/5.36' +privlib='/usr/local/lib/perl5/5.38' +privlibexp='/usr/local/lib/perl5/5.38' procselfexe='' prototype='undef' ptrsize='8' @@ -840,11 +844,11 @@ sig_name_init='0' sig_num_init='0' sig_size='1' signal_t=int -sitearch='/usr/local/lib/perl5/5.36/unknown' -sitearchexp='/usr/local/lib/perl5/5.36/unknown' -sitelib='/usr/local/lib/perl5/5.36' +sitearch='/usr/local/lib/perl5/5.38/unknown' +sitearchexp='/usr/local/lib/perl5/5.38/unknown' +sitelib='/usr/local/lib/perl5/5.38' sitelib_stem='/usr/local/lib/perl5' -sitelibexp='/usr/local/lib/perl5/5.36' +sitelibexp='/usr/local/lib/perl5/5.38' sizesize=4 sizetype='size_t' socksizetype='int' @@ -873,8 +877,12 @@ touch='touch' ttyname_r_proto='0' u16size='2' u16type='unsigned short' +u32XUformat='"X"' +u32oformat='"o"' u32size='4' u32type='unsigned int' +u32uformat='"u"' +u32xformat='"x"' u64size='8' u64type='unsigned long' u8size='1' Index: gnu/usr.bin/perl/uni_keywords.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/uni_keywords.h,v diff -u -p -a -u -p -r1.1.1.4 uni_keywords.h --- gnu/usr.bin/perl/uni_keywords.h 15 Feb 2023 01:31:52 -0000 1.1.1.4 +++ gnu/usr.bin/perl/uni_keywords.h 21 Feb 2024 15:47:03 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! * This file is built by regen/mk_invlists.pl from mph.pl. * Any changes made here will be lost! @@ -10,152 +10,153 @@ #define MPH_VALt I16 /* -generator script: regen/mk_invlists.pl +generator script: ./regen/mk_invlists.pl split strategy: squeeze srand: 1785235451 -rows: 7420 -seed: 1348825710 -full length of keys: 104237 -blob length: 8635 -ref length: 59360 -data size: 67995 (%65.23) +rows: 7498 +seed: 1348825711 +full length of keys: 105417 +blob length: 8703 +ref length: 59984 +data size: 68687 (%65.16) */ STATIC const unsigned char mph_blob[] = - "l&cwlextgocrpcmadlmaghbahexahomarmiavstbatkbhksbuhdcakmcanschamch" - "rscpmncprtcwucyrldsrtgonggrekgujrguruhluwhmngzlkitskndalaoolatnme" - "dfmteimymrnarbnewaoryaosgeougrphlpphnxqaacrjngrohgrunrsamrsgnwsha" - "wtagstamltavttfngtglgtibttotowchoxpeoxsuxyiiizanbzyyyzzzzcntrlcwc" - "fcwcmcwkcfcwtzpgcb=b2h2jlxxnushu3040nv=90oriyapatwsprintqmarktail" - "evssupfsipdfcarianccc=118491vre=yeschakmasmlsqrgothicgrexthyphen3" - ".26.3415161miaoarmndiakgonmhanokhmrlinamroonkooogamolckorkhphlipl" - "rdprtiqaaishrdsogotnsavaiibehgafhahrehbunkhojkilydiannfdqcnv=3//5" - "nv=7patsynrejangsb=stangsaebg3.04.0age=56.07.08.09.052avestanccc=" - "22e=truedeseretdt=nonewideelbasanelymaicextpictgrbashanunoohst=lv" - "tadlambuhiddogralimbuoghamosagerunictakribatakisotheeemnoonseensh" - "inzainkannadakayahlilinearamandaicmarchennfkcqc-1/2/645/217/2olch" - "ikiosmanyahmnpkalilananbatsarbsyrczinhsharadashavianstermuaatagal" + "l&cwlocrpcmadlmaghbahexahomarmiavstbatkbhksbuhdcakmcanschamchrscp" + "mncprtcwucyrldsrtgonggrekgujrguruhluwhmngzlkawikitskndalaoolatnme" + "dfmteimymrnarbnewaoryaosgeougrphlpphnxqaacrjngrohgrunrsamrsgnwtag" + "stamltavttfngtglgtibttotowchoxpeoxsuxyiiizanbzyyyzzzzcntrlcwcfcwc" + "mcwkcfcwtzpgcb=b2h2jlxxnushu3040nv=90oriyapatwsprintqmarktailevss" + "upfsipdfcarianccc=1218491vre=yeschakmasmlsqrgothicgrexthyphen3.26" + ".3415161miaoarmndiakgonmhanokhmrlinamroonkooogamolckorkhphliplrdp" + "rtiqaaishawsogotnsavaiibehgafhahrehbunkhojkilydiannfdqcnv=3//5nv=" + "7patsynrejangsb=stangsaebg3.04.0age=56.07.08.09.052avestanccc=22e" + "=truedeseretdt=nonewideelbasanelymaicextpictgrbashanunoohst=lvtad" + "lambuhiddogralimbuoghamosagerunictakribatakisotheeemnoonseenshinz" + "ainkannadakayahlilinearamandaicmarchennfkcqc-1/2/645/27/2olchikio" + "smanyahmnpkalilananbatsarbshrdsyrczinhsharadashavianstermuaatagal" "ogtaithamtaiviettibetantirhutauideounknownage=10.0age=v1armenianb" "alinesebassavahbpt=opene=falsecompexsuperduployanextendergujarati" "gurmukhihiraganahatrankaithilepchalycianteluguwanchoyezidijamoext" "bgamalkhaphmahajaninfkdqcnv=1/31/12nv=2erlwordkthilinbmercnshuscx" "=talupecialstagbanwatifinaghvithkuqipfabhaiksuki2435nuktacircleme" - "dialea=narrowmoticonsbengaligranthainheritedinkanamakasarmultanin" - "oblockphagspasiddhamsoyombouablamadhkhudawadinabataeannewtailue16" - "00032000olditalicoldpermicoldturkicolduyghurpalmyrenepaucinhausam" - "aritanthaanawb=mixidstartbasiclatinboxdrawingccc=ccc1viramachoras" - "mianstrokesdeprecateddivesakuruorizspacebugineseingeorgiajamoexta" - "javanesebinduugariticiskanathinyehkharoshthiiscarrowsnt=oldpersia" - "nphoeniciansaurashtraolettermallformssoftdotteduprightwarangcitia" - "letternewlineerlspaceextdoverlaycyprominoandominotilesfractioniso" - "latedpfbextfisarabicisspaceisvertfarsiyehswashkaflinefeednextline" - "medefaidrinnfcqc=maybenv=10000pahawhhmongscript=mlymsorasompenger" - "andsubsylotinagriebasegazyisyllablesbidicontrolbidimirroredblk=ka" - "naucasextahesssymbolsambiguousgraphemebasegunjalagondiompatjamool" - "dsogdianvisargayiradicalsisposixsyriacwawjoiningtype=breakbothbkh" - "3jvmasaramgondiathalphanummendekikakui1.0.111e-01.250e-01.429e-01" - ".500e+00.562e-02.563e-02.667e-01.875e-01.500e-013.125e-02.333e-01" - ".750e-01nv=4.167e-01.688e-02.000e-02nv=5.833e-01nv=6.250e-02nv=8." - "333e-02oldhungarianphaistosdiscplayingcardspresentin=14wsegspacex" - "idcontinueegeannumbersblockelementscaseignorablunassignedreekexte" - "ndedvoweljamoincyrillicinethiopictakanaextiscsymbolsinmyanmarnand" - "inagariavagrahatonemarkipaextensionsiscasedletterisgeorgiajoincon" - "trolismyanmarisxposixblankjg=africanfehdalathrishknottedhehrevers" - "edpenonjoiningbreakafternonstarterwordjoinerowsurrogatesayannumer" - "alsisctechnical-5.000e-01patternsyntaxpresentin=56.1verticalforms" - "ncientsymbolsbc=righttoleftblk=arabichanreadingemojicomponentgc=o" - "thereekandcoptichighsurrogateslphabeticpfkhmersymbolsnonjoinerisc" - "yrillicisethiopicmahjongtilesrohingyayehstraightwawyehwithtaildua" - "ljoiningjoincausingleftjoiningjt=transparentbreakbeforeexclamatio" - "ninseparableinseperablenfcquickchecknumerictype=epresentin=v1psal" - "terpahlaviquotationmarkdoublequotesinglequoteany_foldsquotemetaas" - "ciihexdigitarabicletterotherneutralblk=georgiadoubleabovekanavoic" - "ingontrolpictureseastasianwidth=letternumbergraphemeextendeadingj" - "amoimperialaramaicoverstruckpurekillerdecimalnumberenclosingmarkf" - "inalsemkathverticaltailrightjoininghebrewletterinfixnumericmeroit" - "iccursiveiscpictographsnfdquickchecknumericvalue=236numericvalue=" - "4oldnortharabianoldsoutharabianextendnumletglueafterzwjzanabazars" - "quareblk=cyrillicblk=ethiopicblock=arabicnotreorderedcypriotsylla" - "barylineseparatorhalfandfullformshighpusurrogatestrailingjamocomp" - "atformsgxiradicalsinlatinextendedphoneticextsupislatinextendedlis" - "usupplementnonspacingmarklllajg=malayalamnnnamemtawprefixnumerici" - "nearbideogramsiscmathsymbolsanfkcquickchecknumericvalue=1/numeric" - "value=5/8numericvalue=70numericvalue=80numericvalue=9sentenceterm" - "inaltangutcomponentseuropeannumberanadiansyllabicscaucasianalbani" - "aniotasubscriptemojipresentationgmodifiersymbolspaceseparatornota" - "pplicableidsbinaryoperatorbraillepatternscurrencysymbolsindicsiya" - "qnumbersleftandrightnumberjoinervedicextensionsdashpunctuationdia" - "criticalsexthangulsyllableslowercaseletteropenpunctuationhamzaonh" - "ehgoalbethfivehethkaphqophreshyodhqaphtethkhitansmallscriptcarria" - "gereturncomplexcontextmandatorybreakpostfixnumericetterlikesymbol" - "slinebreak=zwspacenfkdquickchecknumericvalue=3/2regionalindicator" - "scriptextensions=mallformvariantsttonsignwritingboundaryneutralco" - "mmonseparatorblk=latinextendedblock=cyrillicextcopticepactnumbers" - "titlecaseletteruppercaseletteridstrinaryoperatorinitialpunctuatio" - "nlinearbsyllabaryiscmathsymbolsbbopomofoextendedclosepunctuationf" - "inalpunctuation1supplementyriacsupplementtangutsupplementalephgim" - "elsadhezayinlaphzhainadditionalcontingentbreaknumericvalue=6ornam" - "entaldingbatsparagraphseparatorpatternwhitespaceruminumeralsymbol" - "ssegmentseparatorbamumsupplementdiacriticalssuptamilsupplementblo" - "ck=kanaegyptianhieroglyphsemojimodifierbaselchemicalsymbolsgemina" - "tionmarkvoweldependenthanifirohingyapadalethlamedhsamekhjg=manich" - "aeantwentyyudhhe=closeparenthesisodifiertonelettersottomansiyaqnu" - "mbersatermarrowsawordbreak=mi_perl_charname_beanatolianhieroglyph" - "sblk=myanmarblock=latinextendedconnectorpunctuationextendedpictog" - "raphicombininghalfmarksneralpunctuationvisualorderleftmodifyingle" - "tterregistershifterinscriptionalpahlavitaixuanjingsymbolscherokee" - "supplementdevanagariextendedmallkanaextensiondhamedhhundrednyiake" - "ngpuachuehmongterminalpunctuationeuropeanterminatorfirststrongiso" - "lateattachedbelowleftchangeswhencasefoldedchangeswhencasemappedch" - "angeswhenlowercasedchangeswhentitlecasedchangeswhenuppercasedgrap" - "hemeclusterbreak=identifiertype=notncientgreeknumbersountingrodnu" - "meralsmeroitichieroglyphsantillationmarkinvisiblestackersyllablem" - "odifierinscriptionalparthianinsupplementalarrowsbnclosedalphanums" - "uphanguljamoextendedamongoliansupplementsundanesesupplementissupp" - "lementalarrowsclogicalorderexceptionnoncharactercodepointsinhalaa" - "rchaicnumbersvo=transformedrotatedyijinghexagramsymbolsoverridear" - "abicnumberbidipairedbrackettypeblock=ethiopicblock=georgianblock=" - "myanmarmathoperatorsfontdiacriticalsforsymbolsarlydynasticcuneifo" - "rminsc=consonantprefixedglagoliticsupplementburushaskiyehbarreebr" - "eaksymbolsnumericvalue=100000000.500e-02.125e-03.750e-02.250e-03b" - "c=lefttorightembeddingpopdirectionalformatblhanguljamoextendedbha" - "ngulcompatibilityjamoobsoletecompatibilityformsradicalssupplement" - "subjoinedjoininggroup=africanqafsentencebreak=shorthandformatcont" - "rolsznamennymusicalnotationhighprivateusesurrogatesstatus=allowed" - "inclusioncompatideographssupommonindicnumberformsiscellaneoustech" - "nicalinpc=topandbottomandleftbrahmijoiningnumberheadletterpacingm" - "odifierletterstransportandmapsymbolshanifirohingyakinnayajoiningg" - "roup=malayalamfolds_to_multi_charmeeteimayekextensionschangeswhen" - "nfkccasefoldeddefaultignorablecodepointfullcompositionexclusionli" - "mitedusebyzantinemusicalsymbolsplaceholderwithstackermetricshapes" - "extendederscriptsandsubscriptsymbolsforlegacycomputingcanonicalco" - "mbiningclass=27halfwidthandfullwidthformsrecommendeduncommonusein" - "arabicpresentationformsbcombiningmarksforsymbolsprependedconcaten" - "ationmarkis_in_multi_char_foldeuropeanseparatorblk=supplementalca" - "nonicalcombiningclass=128nclosedcjklettersandmonthsgeneralcategor" - "y=othestatus=restrictedymbolsandpictographsextanojoininggrouptehm" - "arbutagoalopticalcharacterrecognitionbidiclass=lefttorightbidicla" - "ss=righttoleftatarprecedingrephakatakanaphoneticextensionssupplem" - "entaryprivateuseareaacanonicalcombiningclass=ccc1succeedingrephal" - "phabeticpresentationformsancientgreekmusicalnotationlb=conditiona" - "ljapanesestarteriscellaneoussymbolsandarrowsdecompositiontype=non" - "hangulsyllabletype=lvtinitialpostfixedryprivateuseareabvariations" - "electorssupplementjoininggroup=manichaeantpopdirectionalisolatenc" - "losedideographicsupplementathematicalalphanumericsymbolsideograph" - "icdescriptioncharactersincjkunifiedideographsextensnclosedalphanu" - "mericsupplementiscjkunifiedideographsextensuneiformnumbersandpunc" - "tuationymbolsandpictographsextendedaaboveleftiscellaneousmathemat" - "icalsymbolsablk=cjkunifiedideographsextensbelowrightgyptianhierog" - "lyphformatcontrolsideographicsymbolsandpunctuationmathematicalalp" - "habeticsymbolsdoublebelowombiningdiacriticalmarksextendedindicpos" - "itionalcategory=topandiscellaneousmathematicalsymbolsbblock=cjkun" - "ifiedideographsextensindicsyllabiccategory=consonantiscellaneouss" - "ymbolsandpictographsombiningdiacriticalmarksforsymbols_perl_probl" - "ematic_locale_foldeds_compatibilityideographssupplementbottomandr" - "ightvowelindependentverticalorientation=transformombiningdiacriti" - "calmarkssupplementblock=supplementalmathematicaloperatorsattached" - "aboverightisunifiedcanadianaboriginalsyllabicsextendeda"; -/* mph_blob length: 8635 */ + "dialea=narrowmoticonsbengaliincjkexgranthainheritedinkanamakasarm" + "ultaninoblockphagspasiddhamsoyombouabiscjkexlamadhkhudawadinabata" + "eannewtailue1600032000olditalicoldpermicoldturkicolduyghurpalmyre" + "nepaucinhausamaritanthaanawb=mixidstartbasiclatinboxdrawingccc=cc" + "c1viramachorasmianstrokesdeprecateddivesakuruorizspacebugineseing" + "eorgiajamoextajavanesebinduugariticiskanathinyehkharoshthiiscarro" + "wsnagmundarioldpersianphoeniciansaurashtraolettermallformssoftdot" + "teduprightwarangcitialetternewlineerlspaceblk=cjkextdoverlaycypro" + "minoandominotilesfractionisolatedpfbisarabicisspaceisvertfarsiyeh" + "swashkaflinefeednextlinemedefaidrinnfcqc=maybenv=10000000pahawhhm" + "ongscript=mlymsorasompengerandsubsylotinagriebasegazyisyllablesbi" + "dicontrolbidimirroredblk=kanaucasextahesssymbolsambiguousgrapheme" + "basegunjalagondiompatjamooldsogdianvisargayiradicalsisposixsyriac" + "wawjoiningtype=breakbothbkh3jvmasaramgondiathalphanummendekikakui" + "1.0.111e-01.250e-01.429e-01.500e+00.562e-02.563e-02.667e-01.875e-" + "01.500e-013.125e-02.333e-01.750e-01nv=4.167e-01.688e-02.000e-02nv" + "=5.833e-01nv=6.250e-02nv=8.333e-02oldhungarianphaistosdiscplaying" + "cardspresentin=14wsegspacexidcontinueegeannumbersblock=cjkexblock" + "elementscaseignorablunassignedreekextendedvoweljamoincyrillicinet" + "hiopickatakanaextiscsymbolsinmyanmarnandinagariavagrahatonemarkip" + "aextensionsiscasedletterisgeorgiajoincontrolismyanmarisxposixblan" + "kjg=africanfehdalathrishknottedhehreversedpenonjoiningbreakaftern" + "onstarterwordjoinerowsurrogatesayannumeralsisctechnical-5.000e-01" + "patternsyntaxpresentin=56.1verticalformsncientsymbolsbc=righttole" + "ftblk=arabichanreadingemojicomponentgc=othereekandcoptichighsurro" + "gateslphabeticpfkhmersymbolsnonjoineriscyrillicisethiopicmahjongt" + "ilesrohingyayehstraightwawyehwithtaildualjoiningjoincausingleftjo" + "iningjt=transparentbreakbeforeexclamationinseparableinseperablenf" + "cquickchecknumerictype=epresentin=v1psalterpahlaviquotationmarkdo" + "ublequotesinglequoteany_foldsquotemetaasciihexdigitarabicletterot" + "herneutralblk=georgiadoubleabovekanavoicingontrolpictureseastasia" + "nwidth=letternumbergraphemeextendeadingjamoimperialaramaicoverstr" + "uckpurekillerdecimalnumberenclosingmarkfinalsemkathverticaltailri" + "ghtjoininghebrewletterinfixnumericmeroiticcursiveiscpictographsnf" + "dquickchecknumericvalue=236numericvalue=4oldnortharabianoldsoutha" + "rabianextendnumletglueafterzwjzanabazarsquareblk=cyrillicblk=ethi" + "opicblock=arabicnotreorderedcypriotsyllabarylineseparatorhalfandf" + "ullformshighpusurrogatestrailingjamocompatformsgxiradicalsinlatin" + "extendeddphoneticextsupdevanagariextaislatinextendedlisusupplemen" + "tnonspacingmarklllajg=malayalamnnnamemtawktoviknumeralsprefixnume" + "ricinearbideogramsiscmathsymbolsanfkcquickchecknumericvalue=1/num" + "ericvalue=5/8numericvalue=70numericvalue=80numericvalue=9sentence" + "terminaltangutcomponentseuropeannumberanadiansyllabicscaucasianal" + "banianiotasubscriptemojipresentationgmodifiersymbolspaceseparator" + "notapplicableidsbinaryoperatorbraillepatternscurrencysymbolsindic" + "siyaqnumbersleftandrightnumberjoinervedicextensionsdashpunctuatio" + "ndiacriticalsexthangulsyllableslowercaseletteropenpunctuationhamz" + "aonhehgoalbethfivehethkaphqophreshyodhqaphtethkhitansmallscriptca" + "rriagereturncomplexcontextmandatorybreakpostfixnumericetterlikesy" + "mbolslinebreak=zwspacenfkdquickchecknumericvalue=3/2regionalindic" + "atorscriptextensions=mallformvariantsttonsignwritingboundaryneutr" + "alcommonseparatorblk=latinextendedblock=cyrillicextcopticepactnum" + "berstitlecaseletteruppercaseletteridstrinaryoperatorinitialpunctu" + "ationlinearbsyllabaryiscmathsymbolsbbopomofoextendedclosepunctuat" + "ionfinalpunctuation1supplementyriacsupplementtangutsupplementalep" + "hgimelsadhezayinlaphzhainadditionalcontingentbreaknumericvalue=6o" + "rnamentaldingbatsparagraphseparatorpatternwhitespaceruminumeralsy" + "mbolssegmentseparatorbamumsupplementdiacriticalssuptamilsupplemen" + "tblock=kanaegyptianhieroglyphsemojimodifierbaselchemicalsymbolsge" + "minationmarkvoweldependenthanifirohingyapadalethlamedhsamekhjg=ma" + "nichaeantwentyyudhhe=closeparenthesisodifiertonelettersottomansiy" + "aqnumbersatermarrowsawordbreak=mi_perl_charname_beanatolianhierog" + "lyphsblk=myanmarblock=latinextendedconnectorpunctuationextendedpi" + "ctographicombininghalfmarksneralpunctuationvisualorderleftmodifyi" + "ngletterregistershifterinscriptionalpahlavitaixuanjingsymbolscher" + "okeesupplementmallkanaextensiondhamedhhundrednyiakengpuachuehmong" + "terminalpunctuationeuropeanterminatorfirststrongisolateattachedbe" + "lowleftchangeswhencasefoldedchangeswhencasemappedchangeswhenlower" + "casedchangeswhentitlecasedchangeswhenuppercasedgraphemeclusterbre" + "ak=identifiertype=notncientgreeknumbersountingrodnumeralsmeroitic" + "hieroglyphsantillationmarkinvisiblestackersyllablemodifierinscrip" + "tionalparthianinsupplementalarrowsbnclosedalphanumsuphanguljamoex" + "tendedamongoliansupplementsundanesesupplementissupplementalarrows" + "clogicalorderexceptionnoncharactercodepointsinhalaarchaicnumbersv" + "o=transformedrotatedyijinghexagramsymbolsoverridearabicnumberbidi" + "pairedbrackettypeblock=ethiopicblock=georgianblock=myanmarmathope" + "ratorsfontdiacriticalsforsymbolsarlydynasticcuneiforminsc=consona" + "ntprefixedglagoliticsupplementburushaskiyehbarreebreaksymbolsnume" + "ricvalue=100000.500e-02.125e-03.750e-02.250e-03bc=lefttorightembe" + "ddingpopdirectionalformatblhanguljamoextendedbhangulcompatibility" + "jamoobsoletecompatibilityformsradicalssupplementsubjoinedjoiningg" + "roup=africanqafsentencebreak=shorthandformatcontrolsznamennymusic" + "alnotationhighprivateusesurrogatesstatus=allowedinclusioncompatid" + "eographssupommonindicnumberformsiscellaneoustechnicalinpc=topandb" + "ottomandleftbrahmijoiningnumberheadletterpacingmodifierletterstra" + "nsportandmapsymbolshanifirohingyakinnayajoininggroup=malayalamfol" + "ds_to_multi_charmeeteimayekextensionsdevanagariextendedachangeswh" + "ennfkccasefoldeddefaultignorablecodepointfullcompositionexclusion" + "limitedusebyzantinemusicalsymbolsplaceholderwithstackermetricshap" + "esextendederscriptsandsubscriptsymbolsforlegacycomputingcanonical" + "combiningclass=2halfwidthandfullwidthformsrecommendeduncommonusei" + "narabicpresentationformsbcombiningmarksforsymbolsprependedconcate" + "nationmarkis_in_multi_char_foldeuropeanseparatorblk=supplementalc" + "anonicalcombiningclass=128nclosedcjklettersandmonthsgeneralcatego" + "ry=othestatus=restrictedymbolsandpictographsextanojoininggroupteh" + "marbutagoalopticalcharacterrecognitionbidiclass=lefttorightbidicl" + "ass=righttoleftatarprecedingrephatakanaphoneticextensionssuppleme" + "ntaryprivateuseareaacanonicalcombiningclass=ccc1succeedingrephalp" + "habeticpresentationformsancientgreekmusicalnotationlb=conditional" + "japanesestarteriscellaneoussymbolsandarrowsdecompositiontype=nonh" + "angulsyllabletype=lvtinitialpostfixedryprivateuseareabvariationse" + "lectorssupplementjoininggroup=manichaeantpopdirectionalisolatencl" + "osedideographicsupplementathematicalalphanumericsymbolsideographi" + "cdescriptioncharactersincjkunifiedideographsextensnclosedalphanum" + "ericsupplementiscjkunifiedideographsextensuneiformnumbersandpunct" + "uationymbolsandpictographsextendedaaboveleftiscellaneousmathemati" + "calsymbolsablk=cjkunifiedideographsextensbelowrightgyptianhierogl" + "yphformatcontrolsideographicsymbolsandpunctuationmathematicalalph" + "abeticsymbolsdoublebelowombiningdiacriticalmarksextendedindicposi" + "tionalcategory=topandinmiscellaneousmathematicalsymbolsbblock=cjk" + "unifiedideographsextensindicsyllabiccategory=consonantiscellaneou" + "ssymbolsandpictographsombiningdiacriticalmarksforsymbols_perl_pro" + "blematic_locale_foldeds_compatibilityideographssupplement=bottoma" + "ndrightvowelindependentverticalorientation=transformombiningdiacr" + "iticalmarkssupplementblock=supplementalmathematicaloperatorsattac" + "hedaboverightisunifiedcanadianaboriginalsyllabicsextendeda"; +/* mph_blob length: 8703 */ struct mph_struct { U16 seed2; @@ -167,7433 +168,7511 @@ struct mph_struct { }; #define MPH_RSHIFT 8 -#define MPH_BUCKETS 7420 +#define MPH_BUCKETS 7498 -STATIC const U32 MPH_SEED1 = 0x5065726e; +STATIC const U32 MPH_SEED1 = 0x5065726f; STATIC const U32 MPH_FNV32_PRIME = 0x01000193; /* The comments give the input key for the row it is in */ STATIC const struct mph_struct mph_table[MPH_BUCKETS] = { - { 0, 6025, 6878, 9, 12, UNI_GEOMETRICSHAPES } /* block=geometricshapes */, - { 0, 1702, 6142, 6, 5, UNI_ARABICSUP } /* isarabicsup */, - { 0, 2726, 3061, 3, 5, UNI_XPOSIXDIGIT } /* gc=digit */, - { 1, 7688, 4687, 23, 5, UNI_JG__MANICHAEANZAYIN } /* joininggroup=manichaeanzayin */, - { 0, 3974, 602, 17, 3, -UNI_IDSB } /* idsbinaryoperator=no */, - { 1, 2, 8150, 1, 24, UNI_DIACRITICALS } /* combiningdiacriticalmarks */, - { 3, 3622, 129, 13, 3, UNI_LATINEXTF } /* islatinextendedf */, - { 0, 464, 625, 2, 7, UNI_EXTPICT } /* isextpict */, - { 0, 441, 779, 3, 4, UNI_OLCK } /* olchiki */, - { 8, 1516, 0, 6, 0, UNI_KANA } /* iskana */, - { 0, 6944, 2695, 23, 3, UNI_CCC__AR } /* canonicalcombiningclass=ar */, - { 0, 6114, 457, 3, 4, UNI_PRTI } /* sc=prti */, - { 1, 875, 934, 5, 6, -UNI_UIDEO } /* uideo=false */, - { 1, 1383, 934, 4, 6, -UNI_IDST } /* idst=false */, - { 0, 1879, 4827, 4, 5, UNI_INBAMUM } /* blk=bamum */, - { 4, 6114, 686, 3, 4, UNI_SC__TAKR } /* sc=takr */, - { 0, 275, 2728, 3, 6, UNI_GCB__XX } /* gcb=other */, - { 1, 4122, 278, 5, 1, UNI_lower_values_index } /* lower= */, - { 0, 5409, 588, 19, 5, UNI_TERM } /* terminalpunctuation=true */, - { 1, 7208, 0, 9, 2, UNI_CASEDLETTER } /* category=l& */, - { 1, 2496, 4174, 3, 4, UNI_JG__HETH } /* jg=heth */, - { 0, 7201, 4598, 16, 16, UNI_PE } /* generalcategory=closepunctuation */, - { 5, 1710, 1426, 3, 3, UNI_SORA } /* issora */, - { 3, 46, 5021, 2, 6, UNI_SB__CL } /* sb=close */, - { 0, 464, 1508, 2, 4, UNI_UGAR } /* isugar */, - { 1, 6112, 2783, 5, 9, UNI_INSC__NONJOINER } /* insc=nonjoiner */, - { 0, 464, 3396, 2, 15, UNI_SARB } /* isoldsoutharabian */, - { 1, 2926, 4372, 3, 16, UNI_SMALLFORMS } /* insmallformvariants */, - { 10, 6114, 3285, 3, 4, UNI_HEBR } /* sc=hebr */, - { 1, 6112, 2412, 5, 8, UNI_INSC__AVAGRAHA } /* insc=avagraha */, - { 0, 917, 0, 8, 0, UNI_BASS } /* bassavah */, - { 0, 3474, 4857, 6, 8, UNI_TAMILSUP } /* block=tamilsup */, - { 6, 54, 0, 2, 0, UNI_MC } /* mc */, - { 0, 343, 0, 6, 0, UNI_CCC__11 } /* ccc=11 */, - { 1, 1915, 355, 11, 3, UNI_GRBASE } /* graphemebase=y */, - { 1, 1102, 681, 4, 5, UNI_RUNR } /* scx=runic */, - { 3, 1796, 901, 7, 8, UNI_ARMN } /* script=armenian */, - { 5, 3053, 601, 12, 2, UNI_ahex_values_index } /* asciihexdigit= */, - { 1, 5481, 356, 21, 4, UNI_CWCF } /* changeswhencasefolded=yes */, - { 9, 6011, 4442, 14, 9, UNI_ETHIOPICEXTB } /* block=ethiopicextendedb */, - { 1, 2, 0, 1, 0, UNI_C } /* c */, - { 2, 2726, 3514, 3, 13, UNI_ZL } /* gc=lineseparator */, - { 2, 326, 0, 5, 0, UNI_VSSUP } /* vssup */, - { 0, 464, 5397, 2, 3, UNI_PUA } /* ispua */, - { 1, 5147, 2579, 7, 12, UNI_LOWSURROGATES } /* block=lowsurrogates */, - { 0, 313, 4582, 2, 8, UNI_INBOPOMOFO } /* inbopomofo */, - { 0, 7584, 1679, 18, 8, UNI_DT__FRA } /* decompositiontype=fraction */, - { 2, 7208, 4137, 9, 15, UNI_PS } /* category=openpunctuation */, - { 1, 555, 2195, 3, 4, UNI_AGE__6_DOT_2 } /* age=6.2 */, - { 0, 2726, 3947, 3, 14, UNI_ZS } /* gc=spaceseparator */, - { 1, 464, 256, 2, 2, UNI_CASEDLETTER } /* islc */, - { 1, 6803, 588, 20, 2, UNI_CE } /* compositionexclusion=t */, - { 0, 343, 6280, 4, 3, UNI_CCC__202 } /* ccc=atb */, - { 11, 4450, 6104, 7, 8, UNI_INCUNEIFORM } /* block=cuneiform */, - { 7, 4355, 120, 17, 4, UNI_LAO } /* scriptextensions=laoo */, - { 2, 6944, 2138, 25, 2, UNI_CCC__DB } /* canonicalcombiningclass=233 */, - { 0, 644, 3178, 5, 10, UNI_GCB__L } /* hst=leadingjamo */, - { 1, 8182, 3203, 24, 10, UNI_INPC__OVERSTRUCK } /* indicpositionalcategory=overstruck */, - { 1, 7740, 602, 11, 2, -UNI_IDEO } /* ideographic=n */, - { 4, 7732, 7857, 7, 23, UNI_ENCLOSEDALPHANUMSUP } /* enclosedalphanumericsupplement */, - { 0, 34, 867, 1, 8, UNI_INTIRHUTA } /* intirhuta */, - { 0, 7020, 0, 24, 0, UNI_ARABICPFB } /* arabicpresentationformsb */, - { 1, 3474, 3527, 6, 16, UNI_HALFANDFULLFORMS } /* block=halfandfullforms */, - { 0, 3974, 588, 4, 5, UNI_IDSB } /* idsb=true */, - { 1, 1440, 934, 2, 6, -UNI_SD } /* sd=false */, - { 0, 823, 602, 4, 2, -UNI_DASH } /* dash=n */, - { 1, 4999, 0, 10, 0, UNI_MANI } /* manichaean */, - { 2, 464, 1027, 2, 6, UNI_YEZI } /* isyezidi */, - { 3, 1867, 356, 5, 2, UNI_BIDIM } /* bidim=y */, - { 1, 1796, 8599, 7, 18, UNI_CANS } /* script=canadianaboriginal */, - { 3, 7208, 3654, 9, 11, UNI_MC } /* category=spacingmark */, - { 6, 1102, 236, 4, 2, UNI_YI } /* scx=yi */, - { 0, 311, 0, 5, 0, UNI_XPOSIXPRINT } /* print */, - { 0, 959, 356, 8, 4, UNI_EXT } /* extender=yes */, - { 1, 2496, 5015, 3, 4, UNI_JG__YUDH } /* jg=yudh */, - { 0, 464, 5888, 2, 5, UNI__PERL_NCHAR } /* isnchar */, - { 3, 296, 6199, 4, 5, UNI_NV__900000 } /* nv=900000 */, - { 0, 1879, 4467, 4, 18, UNI_COPTICEPACTNUMBERS } /* blk=copticepactnumbers */, - { 0, 2353, 5643, 3, 10, UNI_COUNTINGROD } /* incountingrod */, - { 12, 302, 588, 2, 2, UNI_RI } /* ri=t */, - { 0, 464, 4077, 2, 15, UNI_PD } /* isdashpunctuation */, - { 2, 8533, 1262, 10, 3, UNI_SUPPUAB } /* block=suppuab */, - { 1, 1796, 4551, 7, 7, UNI_SC__LINB } /* script=linearb */, - { 1, 6114, 120, 3, 3, UNI_LAO } /* sc=lao */, - { 5, 6114, 530, 3, 6, UNI_RJNG } /* sc=rejang */, - { 1, 5748, 1262, 6, 3, UNI_SUPPUAB } /* insuppuab */, - { 0, 1102, 337, 4, 4, UNI_CARI } /* scx=cari */, - { 0, 895, 294, 5, 2, UNI_AGE__4 } /* age=v40 */, - { 2, 426, 2285, 3, 12, UNI_AEGEANNUMBERS } /* inaegeannumbers */, - { 2, 4901, 588, 13, 2, UNI_EMOD } /* emojimodifier=t */, - { 8, 464, 3285, 2, 4, UNI_HEBR } /* ishebr */, - { 2, 1879, 4062, 4, 8, UNI_VEDICEXT } /* blk=vedicext */, - { 0, 464, 2290, 2, 6, UNI_N } /* isnumber */, - { 1, 6379, 3261, 13, 12, UNI_JG__VERTICALTAIL } /* joininggroup=verticaltail */, - { 3, 6114, 4962, 3, 4, UNI_SC__HAN } /* sc=hani */, - { 0, 12, 1638, 1, 8, UNI_POSIXSPACE } /* perlspace */, - { 1, 2454, 957, 8, 5, UNI_GEORGIANEXT } /* isgeorgianext */, - { 0, 4533, 0, 18, 0, UNI_PI } /* initialpunctuation */, - { 0, 1879, 997, 4, 6, UNI_INKAITHI } /* blk=kaithi */, - { 3, 6039, 402, 7, 3, UNI_INMIAO } /* block=miao */, - { 2, 1764, 1290, 3, 8, UNI_INNEWTAILUE } /* innewtailue */, - { 1, 7132, 4081, 16, 11, UNI_SUPPUNCTUATION } /* blk=supplementalpunctuation */, - { 1, 464, 224, 2, 4, UNI_WCHO } /* iswcho */, - { 1, 1065, 1303, 5, 3, UNI_NV__1_SLASH_320 } /* nv=1/320 */, - { 12, 313, 1965, 2, 10, UNI_YIRADICALS } /* inyiradicals */, - { 0, 1102, 1280, 4, 9, UNI_NBAT } /* scx=nabataean */, - { 1, 1879, 1248, 4, 7, UNI_INSIDDHAM } /* blk=siddham */, - { 1, 188, 0, 4, 0, UNI_SGNW } /* sgnw */, - { 17, 464, 1033, 2, 4, UNI_JAMO } /* isjamo */, - { 2, 464, 593, 2, 7, UNI_DSRT } /* isdeseret */, - { 0, 6114, 2220, 3, 4, UNI_HUNG } /* sc=hung */, - { 3, 1991, 16, 12, 1, UNI_JT__D } /* joiningtype=d */, - { 1, 4291, 2890, 10, 2, UNI_GCB__T } /* linebreak=jt */, - { 2, 666, 0, 4, 0, UNI_LIMB } /* limb */, - { 1, 2382, 0, 4, 0, UNI__PERL_SURROGATE } /* iscs */, - { 1, 3474, 1326, 6, 9, UNI_INOLDTURKIC } /* block=oldturkic */, - { 0, 6039, 8212, 7, 32, UNI_MISCMATHSYMBOLSB } /* block=miscellaneousmathematicalsymbolsb */, - { 2, 7431, 1070, 27, 2, UNI_CCC__31 } /* canonicalcombiningclass=ccc31 */, - { 0, 4996, 5376, 14, 6, UNI_JG__MANICHAEANTHAMEDH } /* jg=manichaeanthamedh */, - { 3, 3164, 356, 14, 2, UNI_GREXT } /* graphemeextend=y */, - { 2, 1796, 429, 7, 4, UNI_MRO } /* script=mroo */, - { 2, 4901, 602, 13, 2, -UNI_EMOD } /* emojimodifier=n */, - { 3, 5865, 602, 21, 2, -UNI_LOE } /* logicalorderexception=n */, - { 1, 3351, 2127, 13, 2, UNI_NV__13 } /* numericvalue=13 */, - { 1, 464, 2322, 2, 10, UNI_CN } /* isunassigned */, - { 1, 313, 2652, 2, 13, UNI_VERTICALFORMS } /* inverticalforms */, - { 4, 4500, 933, 8, 7, -UNI_XPOSIXUPPER } /* uppercase=false */, - { 11, 1856, 602, 5, 2, -UNI_BIDIC } /* bidic=n */, - { 1, 27, 0, 4, 0, UNI_AHOM } /* ahom */, - { 1, 832, 356, 5, 2, UNI_STERM } /* sterm=y */, - { 3, 3622, 74, 9, 2, UNI_LATINEXTC } /* islatinextc */, - { 2, 2153, 2617, 4, 8, UNI_NV__2_SLASH_5 } /* nv=4.000e-01 */, - { 0, 6114, 4107, 3, 6, UNI_SC__HANG } /* sc=hangul */, - { 0, 1102, 1311, 4, 4, UNI_ITAL } /* scx=ital */, - { 0, 34, 7790, 1, 12, UNI_IDEO } /* isideographic */, - { 2, 7201, 4485, 16, 15, UNI_TITLE } /* generalcategory=titlecaseletter */, - { 2, 2890, 2257, 11, 3, UNI_JT__T } /* jt=transparent */, - { 1, 313, 1470, 2, 8, UNI_INBUGINESE } /* inbuginese */, - { 0, 7473, 602, 10, 2, -UNI_XPOSIXALPHA } /* alphabetic=n */, - { 0, 1704, 3721, 5, 5, UNI_ARABICMATH } /* arabicmath */, - { 1, 1796, 909, 7, 4, UNI_BALI } /* script=bali */, - { 0, 916, 355, 4, 3, UNI_EBASE } /* ebase=y */, - { 4, 6570, 5239, 5, 15, UNI_LOE } /* inpc=visualorderleft */, - { 0, 7208, 259, 9, 2, UNI_CF } /* category=cf */, - { 0, 3809, 0, 14, 0, UNI_NV__9 } /* numericvalue=9 */, - { 4, 6114, 360, 3, 6, UNI_SC__CAKM } /* sc=chakma */, - { 6, 2802, 5769, 3, 18, UNI_ENCLOSEDALPHANUMSUP } /* isenclosedalphanumsup */, - { 1, 4500, 0, 9, 0, UNI_XPOSIXUPPER } /* uppercase */, - { 4, 1796, 749, 7, 4, UNI_MARC } /* script=marc */, - { 0, 12, 1345, 1, 3, UNI_PALM } /* palm */, - { 2, 508, 602, 5, 2, UNI_DT__CAN } /* nfdqc=n */, - { 0, 696, 6635, 5, 8, UNI_LO } /* isotherletter */, - { 2, 7208, 1582, 9, 6, UNI_L } /* category=letter */, - { 2, 1702, 3721, 7, 5, UNI_ARABICMATH } /* isarabicmath */, - { 1, 2678, 87, 3, 2, UNI_BC__ON } /* bc=on */, - { 1, 508, 356, 5, 4, UNI_NFDQC__Y } /* nfdqc=yes */, - { 0, 5, 7175, 1, 10, UNI_ENCLOSEDCJK } /* enclosedcjk */, - { 2, 4355, 4857, 17, 5, UNI_TAML } /* scriptextensions=tamil */, - { 6, 3474, 3396, 6, 15, UNI_SARB } /* block=oldsoutharabian */, - { 2, 313, 1529, 2, 10, UNI_INKHAROSHTHI } /* inkharoshthi */, - { 0, 2973, 602, 5, 2, -UNI_EPRES } /* epres=n */, - { 1, 5087, 2729, 10, 5, UNI_WB__XX } /* wordbreak=other */, - { 3, 343, 1302, 5, 2, UNI_CCC__103 } /* ccc=103 */, - { 2, 1856, 588, 11, 2, UNI_BIDIC } /* bidicontrol=t */, - { 6, 5949, 0, 6, 0, UNI_YIJING } /* yijing */, - { 0, 2365, 4442, 8, 9, UNI_ETHIOPICEXTB } /* ethiopicextendedb */, - { 1, 2474, 3324, 3, 14, UNI_MISCPICTOGRAPHS } /* ismiscpictographs */, - { 1, 1508, 0, 4, 0, UNI_UGAR } /* ugar */, - { 5, 464, 7290, 2, 27, UNI_OCR } /* isopticalcharacterrecognition */, - { 1, 4872, 3582, 9, 11, UNI_KANGXI } /* block=kangxiradicals */, - { 0, 6114, 208, 3, 4, UNI_TFNG } /* sc=tfng */, - { 2, 464, 3594, 2, 2, UNI_NL } /* isnl */, - { 0, 4793, 0, 18, 0, UNI_RUMI } /* ruminumeralsymbols */, - { 1, 464, 3236, 2, 13, UNI_ME } /* isenclosingmark */, - { 0, 7828, 588, 16, 2, UNI_UIDEO } /* unifiedideograph=t */, - { 2, 1102, 502, 4, 4, UNI_LYDI } /* scx=lydi */, - { 4, 4291, 4581, 10, 2, UNI_LB__BB } /* linebreak=bb */, - { 2, 8244, 6509, 9, 16, UNI_CJKCOMPATIDEOGRAPHS } /* block=cjkcompatideographs */, - { 1, 3061, 0, 5, 0, UNI_XPOSIXDIGIT } /* digit */, - { 1, 940, 5644, 2, 9, UNI_COUNTINGROD } /* countingrod */, - { 1, 1796, 1807, 7, 4, UNI_SORA } /* script=sora */, - { 4, 3351, 6199, 14, 5, UNI_NV__200000 } /* numericvalue=200000 */, - { 1, 2926, 6623, 3, 21, UNI_MODIFIERLETTERS } /* inspacingmodifierletters */, - { 2, 6379, 2846, 13, 11, UNI_JG__YEHWITHTAIL } /* joininggroup=yehwithtail */, - { 0, 2181, 6199, 4, 5, UNI_NV__500000 } /* nv=500000 */, - { 0, 1879, 7020, 4, 24, UNI_ARABICPFB } /* blk=arabicpresentationformsb */, - { 0, 302, 934, 2, 2, -UNI_RI } /* ri=f */, - { 6, 4355, 449, 17, 4, UNI_PHLI } /* scriptextensions=phli */, - { 1, 1766, 602, 5, 3, UNI_COMPEX } /* nfcqc=no */, - { 0, 2712, 588, 5, 2, UNI_EMOJI } /* emoji=t */, - { 0, 112, 0, 4, 0, UNI_KITS } /* kits */, - { 1, 4355, 1657, 17, 11, UNI_CPMN } /* scriptextensions=cyprominoan */, - { 0, 1597, 934, 10, 6, -UNI_SD } /* softdotted=false */, - { 3, 4355, 1117, 17, 4, UNI_TAGB } /* scriptextensions=tagb */, - { 1, 6379, 2835, 13, 11, UNI_JG__STRAIGHTWAW } /* joininggroup=straightwaw */, - { 1, 2973, 588, 5, 2, UNI_EPRES } /* epres=t */, - { 1, 1102, 991, 4, 4, UNI_HATR } /* scx=hatr */, - { 0, 464, 6416, 2, 23, UNI_SHORTHANDFORMATCONTROLS } /* isshorthandformatcontrols */, - { 1, 2153, 523, 4, 1, UNI_NV__47 } /* nv=47 */, - { 3, 612, 2680, 2, 3, UNI_RI } /* lb=ri */, - { 3, 5523, 278, 21, 1, UNI_cwl_values_index } /* changeswhenlowercased= */, - { 2, 1879, 5806, 4, 19, UNI_MONGOLIANSUP } /* blk=mongoliansupplement */, - { 0, 2961, 2961, 12, 7, UNI_NT__NU } /* numerictype=numeric */, - { 3, 1796, 39, 7, 4, UNI_BATK } /* script=batk */, - { 0, 1879, 1015, 4, 6, UNI_INTELUGU } /* blk=telugu */, - { 11, 5136, 7761, 5, 30, UNI_MATHALPHANUM } /* blk=mathematicalalphanumericsymbols */, - { 4, 14, 3719, 1, 15, UNI_MISCMATHSYMBOLSA } /* miscmathsymbolsa */, - { 0, 34, 1898, 1, 7, UNI_S } /* issymbol */, - { 4, 1879, 2297, 4, 13, UNI_BLOCKELEMENTS } /* blk=blockelements */, - { 0, 464, 4582, 2, 8, UNI_BOPO } /* isbopomofo */, - { 0, 7431, 347, 27, 2, UNI_CCC__11 } /* canonicalcombiningclass=ccc11 */, - { 1, 1102, 3991, 4, 7, UNI_BRAI } /* scx=braille */, - { 0, 1702, 2285, 3, 12, UNI_AEGEANNUMBERS } /* isaegeannumbers */, - { 0, 600, 3571, 3, 6, UNI_DT__COM } /* dt=compat */, - { 1, 3722, 588, 4, 5, UNI_MATH } /* math=true */, - { 0, 6103, 0, 9, 0, UNI_XSUX } /* cuneiform */, - { 3, 6114, 868, 3, 7, UNI_SC__TIRH } /* sc=tirhuta */, - { 0, 8276, 4050, 22, 12, UNI_INSC__NUMBERJOINER } /* indicsyllabiccategory=numberjoiner */, - { 3, 1021, 0, 6, 0, UNI_WCHO } /* wancho */, - { 1, 6379, 5015, 13, 6, UNI_JG__YUDHHE } /* joininggroup=yudhhe */, - { 1, 3474, 637, 6, 7, UNI_INHANUNOO } /* block=hanunoo */, - { 1, 464, 7377, 2, 8, UNI_KANA } /* iskatakana */, - { 1, 1390, 0, 10, 0, UNI_ASCII } /* basiclatin */, - { 5, 1796, 1792, 7, 4, UNI_SC__MONG } /* script=mong */, - { 2, 4322, 766, 14, 3, UNI_NV__3_SLASH_64 } /* numericvalue=3/64 */, - { 1, 464, 2986, 2, 2, UNI_PS } /* isps */, - { 2, 6114, 1807, 3, 4, UNI_SORA } /* sc=sora */, - { 4, 2726, 469, 3, 2, UNI_SO } /* gc=so */, - { 0, 7018, 8110, 8, 29, UNI_ARABICMATH } /* inarabicmathematicalalphabeticsymbols */, - { 0, 1102, 574, 4, 7, UNI_AVST } /* scx=avestan */, - { 0, 6833, 0, 14, 0, UNI_BYZANTINEMUSIC } /* byzantinemusic */, - { 1, 2496, 481, 3, 3, UNI_JG__BEH } /* jg=beh */, - { 1, 3474, 120, 6, 3, UNI_INLAO } /* block=lao */, - { 4, 24, 934, 3, 6, -UNI_XPOSIXXDIGIT } /* hex=false */, - { 0, 4355, 47, 17, 4, UNI_BUHD } /* scriptextensions=buhd */, - { 1, 5806, 0, 19, 0, UNI_MONGOLIANSUP } /* mongoliansupplement */, - { 0, 742, 0, 4, 0, UNI_MAND } /* mand */, - { 1, 3351, 1070, 13, 2, UNI_NV__31 } /* numericvalue=31 */, - { 1, 1383, 356, 4, 2, UNI_IDST } /* idst=y */, - { 2, 5607, 6814, 15, 9, UNI_IDENTIFIERTYPE__EXCLUSION } /* identifiertype=exclusion */, - { 2, 464, 4467, 2, 18, UNI_COPTICEPACTNUMBERS } /* iscopticepactnumbers */, - { 3, 5949, 0, 21, 0, UNI_YIJING } /* yijinghexagramsymbols */, - { 0, 5523, 356, 21, 2, UNI_CWL } /* changeswhenlowercased=y */, - { 4, 313, 1845, 2, 11, UNI_YISYLLABLES } /* inyisyllables */, - { 1, 313, 847, 2, 7, UNI_INTAITHAM } /* intaitham */, - { 1, 1879, 3637, 4, 4, UNI_INLISU } /* blk=lisu */, - { 2, 1597, 934, 10, 2, -UNI_SD } /* softdotted=f */, - { 7, 464, 140, 2, 4, UNI_NARB } /* isnarb */, - { 1, 4726, 2080, 14, 8, UNI_NV__13_SLASH_2 } /* numericvalue=6.500e+00 */, - { 5, 7431, 351, 27, 2, UNI_CCC__91 } /* canonicalcombiningclass=ccc91 */, - { 0, 378, 934, 5, 6, -UNI_GREXT } /* grext=false */, - { 1, 4322, 523, 14, 1, UNI_NV__37 } /* numericvalue=37 */, - { 0, 4776, 933, 16, 3, -UNI__PERL_PATWS } /* patternwhitespace=f */, - { 0, 464, 1241, 2, 7, UNI_PHAG } /* isphagspa */, - { 4, 1967, 602, 7, 3, -UNI_RADICAL } /* radical=no */, - { 1, 7132, 5358, 5, 11, UNI_SMALLKANAEXT } /* blk=smallkanaext */, - { 1, 4418, 0, 6, 0, UNI_ZYYY } /* common */, - { 0, 3474, 3637, 6, 14, UNI_LISUSUP } /* block=lisusupplement */, - { 0, 524, 602, 6, 3, -UNI_PATSYN } /* patsyn=no */, - { 4, 6114, 2217, 3, 12, UNI_HUNG } /* sc=oldhungarian */, - { 0, 520, 2080, 4, 8, UNI_NV__15_SLASH_2 } /* nv=7.500e+00 */, - { 7, 313, 5661, 2, 19, UNI_MERO } /* inmeroitichieroglyphs */, - { 2, 2974, 2098, 11, 2, UNI_IN__6_DOT_3 } /* presentin=v63 */, - { 0, 1879, 2428, 4, 13, UNI_IPAEXT } /* blk=ipaextensions */, - { 1, 4291, 4137, 10, 15, UNI_LB__OP } /* linebreak=openpunctuation */, - { 1, 4355, 4882, 17, 4, UNI_EGYP } /* scriptextensions=egyp */, - { 0, 2232, 1145, 3, 3, UNI_THAI } /* isthai */, - { 0, 1102, 469, 4, 4, UNI_SOGO } /* scx=sogo */, - { 0, 15, 36, 1, 3, UNI_AVST } /* avst */, - { 0, 7880, 1491, 5, 4, UNI_CJKEXTA } /* iscjkexta */, - { 0, 3058, 588, 8, 2, UNI_XPOSIXXDIGIT } /* hexdigit=t */, - { 0, 2712, 356, 14, 4, UNI_ECOMP } /* emojicomponent=yes */, - { 1, 4081, 0, 5, 0, UNI_P } /* punct */, - { 3, 1317, 0, 9, 0, UNI_PERM } /* oldpermic */, - { 0, 3474, 1887, 6, 7, UNI_UCASEXT } /* block=ucasext */, - { 1, 6379, 4152, 13, 14, UNI_JG__HAMZAONHEHGOAL } /* joininggroup=hamzaonhehgoal */, - { 0, 5147, 4629, 10, 12, UNI_LATIN1 } /* block=latin1supplement */, - { 0, 464, 4656, 2, 9, UNI_TANGUTSUP } /* istangutsup */, - { 0, 5099, 306, 6, 5, UNI__PERL_PATWS } /* _perl_patws */, - { 3, 1102, 457, 4, 4, UNI_PRTI } /* scx=prti */, - { 12, 7527, 703, 3, 2, UNI_EMOD } /* lb=em */, - { 2, 3474, 2428, 6, 6, UNI_IPAEXT } /* block=ipaext */, - { 8, 1102, 1508, 4, 8, UNI_UGAR } /* scx=ugaritic */, - { 4, 1382, 356, 4, 2, UNI_XIDS } /* xids=y */, - { 5, 1548, 409, 3, 2, UNI_NT__DI } /* nt=di */, - { 0, 1395, 0, 5, 0, UNI_LATN } /* latin */, - { 1, 7688, 4198, 23, 4, UNI_JG__MANICHAEANTETH } /* joininggroup=manichaeanteth */, - { 16, 2181, 1072, 4, 3, UNI_NV__5_SLASH_12 } /* nv=5/12 */, - { 0, 1796, 1614, 7, 4, UNI_WARA } /* script=wara */, - { 1, 6379, 4194, 13, 4, UNI_JG__QAPH } /* joininggroup=qaph */, - { 0, 2712, 934, 5, 2, -UNI_EMOJI } /* emoji=f */, - { 6, 78, 3500, 2, 14, UNI_CYPRIOTSYLLABARY } /* cypriotsyllabary */, - { 3, 1382, 6573, 3, 3, UNI_XIDC } /* xidc=t */, - { 9, 1102, 3885, 4, 17, UNI_AGHB } /* scx=caucasianalbanian */, - { 0, 4872, 2373, 8, 9, UNI_KATAKANAEXT } /* block=katakanaext */, - { 0, 6039, 3324, 7, 14, UNI_MISCPICTOGRAPHS } /* block=miscpictographs */, - { 8, 3474, 6833, 6, 23, UNI_BYZANTINEMUSIC } /* block=byzantinemusicalsymbols */, - { 0, 464, 2740, 2, 4, UNI_COPT } /* iscopt */, - { 0, 2496, 4962, 3, 16, UNI_JG__HANIFIROHINGYAPA } /* jg=hanifirohingyapa */, - { 0, 940, 1104, 5, 2, UNI_compex_values_index } /* compex= */, - { 4, 1879, 735, 4, 7, UNI_INLINEARA } /* blk=lineara */, - { 0, 612, 8010, 2, 3, UNI_LB__CJ } /* lb=cj */, - { 2, 6011, 7175, 7, 10, UNI_ENCLOSEDCJK } /* block=enclosedcjk */, - { 1, 5888, 602, 5, 2, -UNI__PERL_NCHAR } /* nchar=n */, - { 8, 2, 587, 1, 6, UNI_CE } /* ce=true */, - { 1, 7208, 2322, 9, 10, UNI_CN } /* category=unassigned */, - { 1, 7201, 4006, 16, 14, UNI_SC } /* generalcategory=currencysymbol */, - { 2, 4092, 6573, 8, 3, UNI_DIA } /* diacritic=t */, - { 0, 1440, 588, 2, 2, UNI_SD } /* sd=t */, - { 0, 2463, 602, 11, 2, -UNI_JOINC } /* joincontrol=n */, - { 2, 1796, 473, 7, 4, UNI_TNSA } /* script=tnsa */, - { 0, 1796, 991, 7, 4, UNI_HATR } /* script=hatr */, - { 0, 469, 8, 2, 2, UNI_SOGO } /* sogo */, - { 1, 4355, 4998, 16, 11, UNI_MANI } /* scriptextensions=manichaean */, - { 3, 464, 252, 2, 5, UNI_XPOSIXCNTRL } /* iscntrl */, - { 2, 1102, 671, 4, 5, UNI_OGAM } /* scx=ogham */, - { 2, 1059, 602, 6, 2, UNI_NFKDQC__N } /* nfkdqc=n */, - { 8, 1102, 1807, 4, 4, UNI_SORA } /* scx=sora */, - { 0, 4355, 983, 17, 4, UNI_HIRA } /* scriptextensions=hira */, - { 0, 1410, 351, 7, 2, UNI_CCC__91 } /* ccc=ccc91 */, - { 1, 296, 1304, 3, 2, UNI_NV__20 } /* nv=20 */, - { 0, 7688, 5382, 23, 7, UNI_JG__MANICHAEANHUNDRED } /* joininggroup=manichaeanhundred */, - { 0, 5136, 4442, 11, 9, UNI_MYANMAREXTB } /* blk=myanmarextendedb */, - { 1, 1879, 4882, 4, 19, UNI_INEGYPTIANHIEROGLYPHS } /* blk=egyptianhieroglyphs */, - { 1, 2253, 523, 10, 1, UNI_IN__7 } /* presentin=7 */, - { 0, 895, 2090, 5, 2, UNI_AGE__6_DOT_2 } /* age=v62 */, + { 12, 2732, 4987, 5, 9, UNI_ALCHEMICAL } /* blk=alchemical */, + { 1, 2, 8214, 1, 32, UNI_DIACRITICALSEXT } /* combiningdiacriticalmarksextended */, + { 2, 517, 1072, 4, 3, UNI_NV__7_SLASH_12 } /* nv=7/12 */, + { 0, 1823, 1385, 7, 6, UNI_SC__THAA } /* script=thaana */, + { 5, 895, 569, 5, 2, UNI_AGE__5_DOT_2 } /* age=v52 */, + { 0, 1823, 137, 8, 3, UNI_SC__MYMR } /* script=mymr */, + { 1, 292, 2655, 3, 10, UNI_NV___MINUS_1_SLASH_2 } /* nv=-5.000e-01 */, + { 0, 5658, 5940, 18, 9, UNI_IDENTIFIERTYPE__NOTCHARACTER } /* identifiertype=notcharacter */, + { 0, 2324, 991, 6, 6, UNI_INHATRAN } /* block=hatran */, + { 3, 339, 582, 5, 2, UNI_CCC__122 } /* ccc=122 */, + { 1, 1397, 585, 4, 5, UNI_IDST } /* idst=true */, + { 0, 5937, 585, 21, 5, UNI__PERL_NCHAR } /* noncharactercodepoint=true */, + { 3, 461, 208, 2, 4, UNI_TGLG } /* istglg */, + { 0, 3633, 5635, 13, 3, UNI_LATINEXTG } /* inlatinextendedg */, + { 5, 1396, 6621, 3, 3, UNI_XIDC } /* xidc=t */, + { 0, 2766, 2483, 3, 11, UNI_CASEDLETTER } /* gc=casedletter */, + { 5, 4002, 0, 14, 0, UNI_SK } /* modifiersymbol */, + { 1, 4043, 599, 4, 2, -UNI_IDSB } /* idsb=n */, + { 0, 6165, 2009, 3, 6, UNI_SC__SYRC } /* sc=syriac */, + { 2, 4970, 933, 16, 7, -UNI_EBASE } /* emojimodifierbase=false */, + { 3, 1492, 6945, 5, 12, UNI_GEOMETRICSHAPES } /* ingeometricshapes */, + { 0, 2324, 1376, 6, 9, UNI_INSAMARITAN } /* block=samaritan */, + { 1, 339, 2735, 3, 3, UNI_CCC__AR } /* ccc=ar */, + { 3, 8601, 4441, 7, 16, UNI_SMALLFORMS } /* block=smallformvariants */, + { 1, 7274, 3554, 9, 13, UNI_ZL } /* category=lineseparator */, + { 0, 339, 288, 5, 2, UNI_CCC__130 } /* ccc=130 */, + { 0, 461, 248, 2, 5, UNI_XPOSIXCNTRL } /* iscntrl */, + { 0, 1823, 369, 7, 6, UNI_GOTH } /* script=gothic */, + { 0, 10, 2631, 1, 12, UNI_MAYANNUMERALS } /* mayannumerals */, + { 6, 309, 3954, 2, 17, UNI_INCAUCASIANALBANIAN } /* incaucasianalbanian */, + { 0, 1396, 934, 8, 6, -UNI_XIDS } /* xidstart=false */, + { 6, 1396, 341, 3, 2, UNI_xidc_values_index } /* xidc= */, + { 0, 1102, 430, 4, 4, UNI_NKO } /* scx=nkoo */, + { 5, 339, 295, 4, 1, UNI_CCC__9 } /* ccc=9 */, + { 0, 1671, 0, 7, 0, UNI_CJKEXTD } /* cjkextd */, + { 0, 735, 2538, 2, 2, UNI_EA__A } /* ea=a */, + { 0, 461, 3026, 2, 2, UNI_PS } /* isps */, + { 1, 2324, 5958, 6, 21, UNI_SINHALAARCHAICNUMBERS } /* block=sinhalaarchaicnumbers */, + { 2, 1823, 790, 7, 4, UNI_SC__KALI } /* script=kali */, + { 0, 7495, 388, 27, 2, UNI_CCC__26 } /* canonicalcombiningclass=ccc26 */, + { 10, 3633, 4659, 7, 9, UNI_LATINEXTC } /* inlatinextendedc */, + { 1, 4896, 0, 8, 0, UNI_BAMUMSUP } /* bamumsup */, + { 4, 172, 0, 4, 0, UNI_RJNG } /* rjng */, + { 1, 1397, 934, 7, 2, -UNI_IDS } /* idstart=f */, + { 1, 11, 2312, 1, 12, UNI_AEGEANNUMBERS } /* aegeannumbers */, + { 1, 6163, 6661, 14, 10, UNI_INSC__CONSONANTHEADLETTER } /* insc=consonantheadletter */, + { 1, 406, 599, 2, 3, -UNI_DI } /* di=no */, + { 0, 257, 934, 4, 6, -UNI_CWCM } /* cwcm=false */, + { 8, 292, 2090, 3, 9, UNI_NV__1_SLASH_8 } /* nv=1.250e-01 */, + { 1, 1409, 4698, 4, 12, UNI_LATIN1 } /* latin1supplement */, + { 0, 4360, 1479, 10, 5, UNI_LB__SP } /* linebreak=space */, + { 0, 1223, 0, 4, 0, UNI_KANA } /* kana */, + { 1, 4360, 2043, 10, 2, UNI_GCB__V } /* linebreak=jv */, + { 2, 216, 216, 2, 2, UNI_TOTO } /* toto */, + { 0, 1494, 5863, 5, 6, UNI_GEORGIANSUP } /* georgiansup */, + { 1, 16, 2773, 1, 13, UNI_INGREEK } /* greekandcoptic */, + { 3, 1667, 1914, 4, 4, UNI_UCAS } /* blk=ucas */, + { 1, 1667, 5778, 4, 21, UNI_ININSCRIPTIONALPARTHIAN } /* blk=inscriptionalparthian */, + { 0, 2256, 0, 12, 0, UNI_PHAISTOS } /* phaistosdisc */, + { 0, 1102, 4271, 4, 17, UNI_KITS } /* scx=khitansmallscript */, + { 0, 6165, 1322, 3, 9, UNI_ITAL } /* sc=olditalic */, + { 0, 940, 934, 6, 6, -UNI_COMPEX } /* compex=false */, + { 0, 6450, 306, 14, 2, UNI_SB__SP } /* sentencebreak=sp */, + { 0, 1906, 1037, 8, 4, UNI_KANAEXTB } /* blk=kanaextb */, + { 2, 1667, 5712, 4, 19, UNI_MERO } /* blk=meroitichieroglyphs */, + { 0, 7274, 5235, 9, 20, UNI_PC } /* category=connectorpunctuation */, + { 0, 1404, 1409, 5, 5, UNI_ASCII } /* basiclatin */, + { 3, 2232, 1314, 4, 3, UNI_NV__8000 } /* nv=8000 */, + { 2, 5939, 599, 5, 2, -UNI__PERL_NCHAR } /* nchar=n */, + { 0, 7495, 346, 27, 2, UNI_CCC__84 } /* canonicalcombiningclass=ccc84 */, + { 0, 4424, 1978, 17, 4, UNI_SOGD } /* scriptextensions=sogd */, + { 1, 1667, 967, 4, 8, UNI_INGUJARATI } /* blk=gujarati */, + { 0, 4424, 406, 17, 4, UNI_DIAK } /* scriptextensions=diak */, + { 0, 461, 4845, 2, 17, UNI__PERL_PATWS } /* ispatternwhitespace */, + { 0, 4424, 1331, 17, 9, UNI_PERM } /* scriptextensions=oldpermic */, + { 0, 309, 499, 2, 6, UNI_INLYDIAN } /* inlydian */, + { 1, 2503, 599, 5, 2, -UNI_JOINC } /* joinc=n */, + { 1, 2324, 7086, 6, 24, UNI_ARABICPFB } /* block=arabicpresentationformsb */, + { 0, 2324, 746, 6, 7, UNI_INMARCHEN } /* block=marchen */, + { 0, 4191, 585, 5, 2, UNI_XPOSIXLOWER } /* lower=t */, + { 3, 2208, 0, 12, 0, UNI_NV__7_SLASH_12 } /* nv=5.833e-01 */, + { 0, 309, 6487, 2, 23, UNI_ZNAMENNYMUSIC } /* inznamennymusicalnotation */, + { 2, 6165, 779, 3, 7, UNI_OSMA } /* sc=osmanya */, + { 4, 1391, 3191, 2, 3, UNI_WB__LE } /* wb=le */, + { 0, 1667, 4725, 4, 16, UNI_TANGUTSUP } /* blk=tangutsupplement */, + { 0, 832, 353, 5, 2, UNI_STERM } /* sterm=y */, + { 5, 1102, 1829, 3, 5, UNI_MLYM } /* scx=mlym */, + { 3, 1667, 3421, 4, 15, UNI_NARB } /* blk=oldnortharabian */, + { 1, 1726, 6193, 6, 12, UNI_ARABICSUP } /* isarabicsupplement */, + { 0, 1667, 430, 4, 3, UNI_INNKO } /* blk=nko */, + { 1, 3984, 353, 17, 4, UNI_EPRES } /* emojipresentation=yes */, + { 19, 6163, 1985, 5, 7, UNI_INSC__VISARGA } /* insc=visarga */, + { 1, 309, 8660, 2, 42, UNI_UCASEXT } /* inunifiedcanadianaboriginalsyllabicsextended */, + { 2, 521, 8556, 5, 3, UNI_PATSYN } /* patsyn=t */, + { 0, 461, 168, 2, 4, UNI_COPT } /* isqaac */, + { 1, 1582, 0, 10, 0, UNI_PHNX } /* phoenician */, + { 6, 2432, 4511, 9, 9, UNI_MYANMAREXTB } /* inmyanmarextendedb */, + { 3, 4424, 216, 17, 4, UNI_TOTO } /* scriptextensions=toto */, + { 2, 2324, 861, 6, 7, UNI_INTIBETAN } /* block=tibetan */, + { 2, 8, 0, 3, 0, UNI_PCM } /* pcm */, + { 4, 7134, 1669, 25, 2, UNI_pcm_values_index } /* prependedconcatenationmark= */, + { 0, 1823, 4620, 7, 7, UNI_SC__LINB } /* script=linearb */, + { 0, 1272, 1037, 5, 4, UNI_CJKEXTB } /* iscjkextb */, + { 2, 4424, 493, 17, 4, UNI_KHOJ } /* scriptextensions=khoj */, + { 1, 5205, 1553, 5, 9, UNI_MISCARROWS } /* blk=miscarrows */, + { 1, 2324, 6228, 8, 8, UNI_CJKSYMBOLS } /* block=cjksymbols */, + { 1, 3677, 589, 13, 3, UNI_LATINEXTE } /* islatinextendede */, + { 1, 7537, 934, 10, 6, -UNI_XPOSIXALPHA } /* alphabetic=false */, + { 3, 380, 0, 6, 0, UNI_HYPHEN } /* hyphen */, + { 2, 375, 585, 5, 5, UNI_GREXT } /* grext=true */, + { 2, 461, 4620, 2, 7, UNI_LINB } /* islinearb */, + { 0, 4360, 209, 10, 2, UNI_LB__GL } /* linebreak=gl */, + { 1, 232, 0, 2, 0, UNI_YI } /* yi */, + { 1, 5595, 934, 21, 6, -UNI_CWT } /* changeswhentitlecased=false */, + { 2, 3502, 7241, 5, 26, UNI_ENCLOSEDCJK } /* blk=enclosedcjklettersandmonths */, + { 9, 7274, 8, 9, 1, UNI_P } /* category=p */, + { 0, 298, 599, 2, 2, -UNI_RI } /* ri=n */, + { 0, 1994, 0, 7, 0, UNI_RADICAL } /* radical */, + { 0, 2324, 847, 6, 7, UNI_INTAITHAM } /* block=taitham */, + { 0, 4941, 324, 10, 3, UNI_KANASUP } /* block=kanasup */, + { 1, 6165, 658, 3, 4, UNI_SC__DOGR } /* sc=dogr */, + { 9, 2324, 1834, 6, 11, UNI_INSORASOMPENG } /* block=sorasompeng */, + { 4, 21, 2931, 2, 3, UNI_EXT } /* ext=t */, + { 2, 4845, 352, 16, 3, UNI__PERL_PATWS } /* patternwhitespace=y */, + { 0, 7267, 535, 15, 2, UNI_S } /* generalcategory=s */, + { 0, 4360, 2955, 10, 11, UNI_LB__EX } /* linebreak=exclamation */, + { 0, 2718, 6312, 3, 3, UNI_BC__PDI } /* bc=pdi */, + { 0, 30, 4209, 1, 12, UNI_INPUNCTUATION } /* inpunctuation */, + { 4, 1667, 683, 4, 5, UNI_INTAKRI } /* blk=takri */, + { 0, 1823, 615, 7, 4, UNI_ELYM } /* script=elym */, + { 0, 16, 1426, 1, 4, UNI_XPOSIXCNTRL } /* gc=cc */, + { 3, 2514, 2046, 3, 11, UNI_GONM } /* ismasaramgondi */, + { 2, 4424, 499, 17, 4, UNI_LYDI } /* scriptextensions=lydi */, + { 5, 1823, 1572, 7, 10, UNI_XPEO } /* script=oldpersian */, + { 9, 423, 2800, 3, 11, UNI_ALPHABETICPF } /* inalphabeticpf */, + { 0, 2842, 5848, 10, 9, UNI_ETHIOPICEXTA } /* isethiopicextendeda */, + { 2, 309, 668, 2, 5, UNI_INOGHAM } /* inogham */, + { 4, 1509, 0, 4, 0, UNI_JAVA } /* java */, + { 7, 6165, 1484, 3, 4, UNI_SC__BUGI } /* sc=bugi */, + { 16, 6427, 6447, 13, 3, UNI_JG__QAF } /* joininggroup=qaf */, + { 0, 59, 0, 4, 0, UNI_CHRS } /* chrs */, + { 2, 7591, 283, 3, 2, UNI_LB__NU } /* lb=nu */, + { 2, 2324, 3692, 6, 7, UNI_LISUSUP } /* block=lisusup */, + { 0, 7274, 4206, 9, 15, UNI_PS } /* category=openpunctuation */, + { 2, 461, 6642, 2, 6, UNI_BRAH } /* isbrahmi */, + { 1, 5216, 1505, 11, 4, UNI_LATINEXTA } /* block=latinexta */, + { 3, 1776, 1184, 4, 7, UNI_EMOTICONS } /* inemoticons */, + { 2, 292, 2084, 3, 2, UNI_NV__11 } /* nv=11 */, + { 1, 2536, 6447, 3, 3, UNI_JG__QAF } /* jg=qaf */, + { 2, 2324, 1914, 6, 4, UNI_UCAS } /* block=ucas */, + { 0, 6076, 2773, 7, 13, UNI_INGREEK } /* block=greekandcoptic */, + { 0, 11, 2705, 1, 13, UNI_ANCIENTSYMBOLS } /* ancientsymbols */, + { 1, 339, 288, 4, 2, UNI_CCC__30 } /* ccc=30 */, + { 2, 3391, 1070, 13, 2, UNI_NV__31 } /* numericvalue=31 */, + { 0, 3502, 1037, 12, 4, UNI_ETHIOPICEXTB } /* blk=ethiopicextb */, + { 0, 1391, 281, 3, 2, UNI_WB__XX } /* wb=xx */, + { 2, 7591, 1864, 3, 5, UNI_EBASE } /* lb=ebase */, + { 8, 6165, 1205, 3, 7, UNI_SC__GRAN } /* sc=grantha */, + { 3, 2536, 702, 10, 4, UNI_JG__AFRICANNOON } /* jg=africannoon */, + { 5, 2842, 2374, 10, 8, UNI_ETHIOPICEXT } /* isethiopicextended */, + { 2, 1198, 6557, 5, 19, UNI_CJKCOMPATIDEOGRAPHSSUP } /* incjkcompatideographssup */, + { 0, 6165, 608, 3, 4, UNI_ELBA } /* sc=elba */, + { 0, 30, 6486, 1, 14, UNI_ZNAMENNYMUSIC } /* isznamennymusic */, + { 1, 1823, 1834, 7, 11, UNI_SORA } /* script=sorasompeng */, + { 1, 6816, 585, 25, 5, UNI_CWKCF } /* changeswhennfkccasefolded=true */, + { 3, 2324, 967, 6, 8, UNI_INGUJARATI } /* block=gujarati */, + { 0, 7274, 2814, 12, 8, UNI_SO } /* category=othersymbol */, + { 9, 2302, 933, 9, 7, -UNI_IDC } /* idcontinue=false */, + { 1, 461, 6692, 2, 15, UNI_TRANSPORTANDMAP } /* istransportandmap */, + { 1, 578, 0, 6, 0, UNI_CCC__22 } /* ccc=22 */, + { 2, 7134, 353, 26, 4, UNI_PCM } /* prependedconcatenationmark=yes */, + { 2, 1790, 0, 11, 0, UNI_NFCQC__M } /* nfcqc=maybe */, + { 1, 2324, 4951, 6, 19, UNI_INEGYPTIANHIEROGLYPHS } /* block=egyptianhieroglyphs */, + { 0, 1479, 584, 4, 6, UNI_XPOSIXSPACE } /* space=true */, + { 0, 5168, 5939, 6, 5, UNI__PERL_NCHAR } /* _perl_nchar */, + { 12, 461, 1975, 2, 10, UNI_SOGO } /* isoldsogdian */, + { 0, 4502, 70, 11, 2, UNI_LATINEXTC } /* blk=latinextc */, + { 0, 1823, 991, 7, 4, UNI_HATR } /* script=hatr */, + { 2, 30, 1454, 1, 11, UNI_DEP } /* isdeprecated */, + { 1, 1728, 7545, 4, 20, UNI_ARABICPFA } /* arabicpresentationformsa */, + { 1, 1102, 1909, 3, 5, UNI_KANA } /* scx=kana */, + { 0, 2, 7972, 1, 15, UNI_CUNEIFORMNUMBERS } /* cuneiformnumbers */, + { 3, 4424, 1205, 17, 7, UNI_GRAN } /* scriptextensions=grantha */, + { 1, 7011, 2538, 23, 2, UNI_CCC__A } /* canonicalcombiningclass=a */, + { 0, 11, 0, 4, 0, UNI_ADLM } /* adlm */, + { 2, 6165, 1248, 3, 4, UNI_SC__PHAG } /* sc=phag */, + { 0, 7214, 345, 25, 2, UNI_CCC__118 } /* canonicalcombiningclass=118 */, + { 1, 461, 54, 2, 2, UNI_SC } /* issc */, + { 9, 2324, 739, 6, 7, UNI_INMANDAIC } /* block=mandaic */, + { 2, 4506, 0, 14, 0, UNI_LATINEXTB } /* latinextendedb */, + { 1, 4896, 0, 4, 0, UNI_BAMU } /* bamu */, + { 1, 1667, 8660, 4, 43, UNI_UCASEXTA } /* blk=unifiedcanadianaboriginalsyllabicsextendeda */, + { 12, 1823, 232, 7, 4, UNI_SC__YI } /* script=yiii */, + { 0, 461, 1015, 2, 6, UNI_TELU } /* istelugu */, + { 0, 0, 273, 1, 4, UNI_LB__B2 } /* lb=b2 */, + { 3, 2, 5694, 1, 10, UNI_COUNTINGROD } /* countingrod */, + { 0, 7752, 2270, 23, 4, UNI_JG__MANICHAEANAYIN } /* joininggroup=manichaeanayin */, + { 0, 991, 0, 6, 0, UNI_HATR } /* hatran */, + { 0, 1015, 0, 4, 0, UNI_TELU } /* telu */, + { 0, 271, 2768, 3, 6, UNI_GCB__XX } /* gcb=other */, + { 0, 5769, 599, 4, 2, -UNI_EMOD } /* emod=n */, + { 0, 3391, 2107, 14, 8, UNI_NV__5_SLASH_2 } /* numericvalue=2.500e+00 */, + { 0, 7011, 1678, 24, 2, UNI_CCC__1 } /* canonicalcombiningclass=ov */, + { 17, 2324, 6120, 6, 22, UNI_DIACRITICALSFORSYMBOLS } /* block=diacriticalsforsymbols */, + { 1, 1823, 156, 7, 4, UNI_SC__OUGR } /* script=ougr */, + { 7, 5916, 934, 21, 6, -UNI_LOE } /* logicalorderexception=false */, + { 0, 30, 1941, 1, 13, UNI_GRBASE } /* isgraphemebase */, + { 0, 2434, 1037, 7, 4, UNI_MYANMAREXTB } /* myanmarextb */, + { 0, 1830, 0, 4, 0, UNI_MLYM } /* mlym */, + { 1, 4191, 5671, 8, 3, -UNI_XPOSIXLOWER } /* lowercase=n */, + { 1, 32, 353, 2, 4, UNI_VS } /* vs=yes */, + { 11, 1823, 3436, 7, 15, UNI_SARB } /* script=oldsoutharabian */, + { 2, 6427, 4761, 14, 4, UNI_JG__ALAPH } /* joininggroup=alaph */, + { 0, 2220, 2107, 4, 8, UNI_NV__13_SLASH_2 } /* nv=6.500e+00 */, + { 7, 5574, 599, 21, 3, -UNI_CWL } /* changeswhenlowercased=no */, + { 3, 533, 959, 3, 6, UNI_SB__EX } /* sb=extend */, + { 0, 461, 176, 2, 4, UNI_ROHG } /* isrohg */, + { 0, 2324, 297, 6, 5, UNI_INORIYA } /* block=oriya */, + { 4, 4360, 4206, 10, 15, UNI_LB__OP } /* linebreak=openpunctuation */, + { 0, 309, 3228, 2, 15, UNI_INIMPERIALARAMAIC } /* inimperialaramaic */, + { 2, 271, 585, 3, 2, UNI_GCB__T } /* gcb=t */, + { 1, 2324, 3349, 6, 15, UNI_INMEROITICCURSIVE } /* block=meroiticcursive */, + { 17, 1479, 933, 4, 3, -UNI_XPOSIXSPACE } /* space=f */, + { 0, 34, 4726, 1, 8, UNI_TANGUTSUP } /* tangutsup */, + { 1, 2324, 1914, 6, 7, UNI_UCASEXT } /* block=ucasext */, + { 4, 6165, 4089, 3, 4, UNI_SC__SIND } /* sc=sind */, + { 3, 3014, 343, 11, 3, UNI_IN__12_DOT_1 } /* presentin=v121 */, + { 1, 461, 1241, 2, 7, UNI_NB } /* isnoblock */, + { 0, 2302, 352, 9, 3, UNI_IDC } /* idcontinue=y */, + { 1, 1455, 274, 10, 1, UNI_dep_values_index } /* deprecated= */, + { 1, 309, 917, 2, 8, UNI_INBASSAVAH } /* inbassavah */, + { 13, 380, 934, 6, 2, -UNI_HYPHEN } /* hyphen=f */, + { 2, 997, 0, 6, 0, UNI_KTHI } /* kaithi */, + { 1, 2, 7972, 1, 29, UNI_CUNEIFORMNUMBERS } /* cuneiformnumbersandpunctuation */, + { 1, 2536, 20, 3, 2, UNI_JG__HE } /* jg=he */, + { 2, 7011, 391, 24, 2, UNI_CCC__34 } /* canonicalcombiningclass=34 */, + { 4, 4424, 571, 17, 7, UNI_AVST } /* scriptextensions=avestan */, + { 2, 6165, 1978, 3, 7, UNI_SC__SOGD } /* sc=sogdian */, + { 4, 1456, 4439, 4, 2, UNI_epres_values_index } /* epres= */, { 2, 1102, 951, 4, 4, UNI_DUPL } /* scx=dupl */, - { 0, 1102, 417, 4, 4, UNI_HANO } /* scx=hano */, - { 6, 316, 588, 5, 5, UNI_QMARK } /* qmark=true */, - { 3, 1879, 144, 4, 4, UNI_INNEWA } /* blk=newa */, - { 2, 3474, 1141, 12, 3, UNI_ARABICPFA } /* block=arabicpfa */, - { 1, 1796, 1371, 7, 6, UNI_SC__THAA } /* script=thaana */, - { 1, 1991, 11, 12, 1, UNI_JT__R } /* joiningtype=r */, - { 1, 3474, 7044, 6, 24, UNI_DIACRITICALSFORSYMBOLS } /* block=combiningmarksforsymbols */, - { 4, 7500, 0, 17, 0, UNI_ANCIENTGREEKMUSIC } /* ancientgreekmusic */, - { 1, 3748, 766, 14, 3, UNI_NV__1_SLASH_64 } /* numericvalue=1/64 */, - { 0, 6114, 1614, 3, 4, UNI_WARA } /* sc=wara */, - { 4, 1796, 1090, 7, 4, UNI_SC__LINB } /* script=linb */, - { 1, 2033, 934, 5, 2, -UNI_XPOSIXALPHA } /* alpha=f */, - { 2, 7527, 67, 3, 2, UNI_LB__CP } /* lb=cp */, - { 0, 3794, 1781, 14, 4, UNI_NV__80000 } /* numericvalue=80000 */, - { 3, 1796, 1326, 7, 9, UNI_ORKH } /* script=oldturkic */, - { 4, 4355, 1982, 17, 6, UNI_SYRC } /* scriptextensions=syriac */, - { 0, 2581, 0, 9, 0, UNI__PERL_SURROGATE } /* surrogate */, - { 7, 204, 0, 4, 0, UNI_TAVT } /* tavt */, - { 5, 2181, 2080, 4, 8, UNI_NV__11_SLASH_2 } /* nv=5.500e+00 */, - { 4, 1796, 5322, 7, 8, UNI_CHER } /* script=cherokee */, - { 6, 8276, 1503, 22, 5, UNI_INSC__BINDU } /* indicsyllabiccategory=bindu */, - { 2, 464, 1003, 2, 6, UNI_LEPC } /* islepcha */, - { 2, 1597, 588, 10, 2, UNI_SD } /* softdotted=t */, - { 2, 1480, 5812, 5, 6, UNI_GEORGIANSUP } /* georgiansup */, - { 2, 4355, 4418, 17, 6, UNI_ZYYY } /* scriptextensions=common */, - { 0, 464, 7660, 2, 18, UNI_INVS } /* isvariationselectors */, - { 0, 5087, 3024, 10, 11, UNI_WB__SQ } /* wordbreak=singlequote */, - { 1, 1410, 347, 7, 2, UNI_CCC__11 } /* ccc=ccc11 */, - { 1, 2253, 549, 10, 3, UNI_IN__3 } /* presentin=3.0 */, - { 0, 4726, 6231, 14, 8, UNI_NV__1_SLASH_160 } /* numericvalue=6.250e-03 */, - { 1, 1548, 593, 3, 2, UNI_XPOSIXDIGIT } /* nt=de */, - { 2, 1879, 917, 4, 8, UNI_INBASSAVAH } /* blk=bassavah */, - { 0, 1548, 2961, 3, 7, UNI_NT__NU } /* nt=numeric */, - { 2, 1796, 4882, 7, 19, UNI_EGYP } /* script=egyptianhieroglyphs */, - { 0, 2392, 1037, 9, 4, UNI_MYANMAREXTB } /* inmyanmarextb */, - { 9, 2253, 298, 9, 2, UNI_IN__9 } /* presentin=9 */, - { 0, 1102, 473, 4, 4, UNI_TNSA } /* scx=tnsa */, - { 5, 4776, 587, 16, 3, UNI__PERL_PATWS } /* patternwhitespace=t */, - { 1, 2394, 1037, 7, 4, UNI_MYANMAREXTB } /* myanmarextb */, - { 8, 1102, 116, 4, 4, UNI_KNDA } /* scx=knda */, - { 8, 1539, 1939, 3, 9, UNI_COMPATJAMO } /* iscompatjamo */, - { 2, 6114, 1241, 3, 7, UNI_SC__PHAG } /* sc=phagspa */, - { 0, 2253, 2172, 10, 3, UNI_IN__2 } /* presentin=2.0 */, - { 1, 1516, 328, 6, 3, UNI_KANASUP } /* iskanasup */, - { 0, 4291, 3285, 10, 12, UNI_LB__HL } /* linebreak=hebrewletter */, - { 2, 6039, 6549, 7, 21, UNI_MISCTECHNICAL } /* block=miscellaneoustechnical */, - { 3, 343, 1155, 4, 2, UNI_CCC__35 } /* ccc=35 */, - { 3, 2033, 588, 5, 2, UNI_XPOSIXALPHA } /* alpha=t */, - { 1, 236, 0, 2, 0, UNI_YI } /* yi */, - { 1, 6114, 1785, 3, 11, UNI_HMNG } /* sc=pahawhhmong */, - { 5, 600, 940, 3, 3, UNI_DT__COM } /* dt=com */, - { 0, 464, 3061, 2, 5, UNI_XPOSIXDIGIT } /* isdigit */, - { 11, 4355, 3465, 16, 5, UNI_ETHI } /* scriptextensions=ethi */, - { 1, 7688, 639, 23, 3, UNI_JG__MANICHAEANNUN } /* joininggroup=manichaeannun */, - { 0, 2981, 2090, 4, 2, UNI_IN__6_DOT_2 } /* in=v62 */, - { 0, 8007, 4089, 30, 4, UNI_CJKEXTD } /* blk=cjkunifiedideographsextensiond */, - { 0, 2274, 602, 4, 2, -UNI_XIDC } /* xidc=n */, - { 4, 4355, 1792, 17, 4, UNI_MONG } /* scriptextensions=mong */, - { 1, 4355, 1882, 16, 5, UNI_KANA } /* scriptextensions=kana */, - { 3, 7201, 1413, 15, 2, UNI_C } /* generalcategory=c */, - { 4, 1796, 0, 11, 0, UNI_SC__MLYM } /* script=mlym */, - { 1, 2491, 0, 5, 0, UNI_XPOSIXBLANK } /* blank */, - { 0, 2033, 2762, 3, 9, UNI_ALPHABETICPF } /* alphabeticpf */, - { 4, 1879, 1495, 4, 8, UNI_INJAVANESE } /* blk=javanese */, - { 1, 464, 4614, 2, 16, UNI_PF } /* isfinalpunctuation */, - { 6, 7208, 4533, 9, 18, UNI_PI } /* category=initialpunctuation */, - { 0, 6379, 2529, 13, 10, UNI_JG__REVERSEDPE } /* joininggroup=reversedpe */, - { 1, 3474, 1289, 6, 9, UNI_INNEWTAILUE } /* block=newtailue */, - { 0, 555, 552, 4, 3, UNI_AGE__4 } /* age=4.0 */, - { 1, 1102, 2217, 4, 12, UNI_HUNG } /* scx=oldhungarian */, - { 5, 4783, 587, 9, 6, UNI_XPOSIXSPACE } /* whitespace=true */, - { 1, 464, 252, 2, 2, UNI_CN } /* iscn */, - { 0, 4355, 951, 17, 8, UNI_DUPL } /* scriptextensions=duployan */, - { 0, 8533, 8319, 18, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* block=supplementalsymbolsandpictographs */, - { 4, 7132, 5858, 7, 7, UNI_SUPARROWSC } /* blk=suparrowsc */, - { 2, 464, 248, 2, 4, UNI_ZZZZ } /* iszzzz */, - { 0, 4901, 355, 16, 3, UNI_EBASE } /* emojimodifierbase=y */, - { 1, 4322, 1300, 14, 2, UNI_NV__300 } /* numericvalue=300 */, - { 0, 1065, 2096, 4, 8, UNI_NV__1_SLASH_64 } /* nv=1.563e-02 */, - { 6, 1308, 0, 9, 0, UNI_ITAL } /* olditalic */, - { 0, 1879, 6728, 4, 14, UNI_MEETEIMAYEKEXT } /* blk=meeteimayekext */, - { 0, 3474, 7481, 10, 20, UNI_ARABICPFA } /* block=arabicpresentationformsa */, - { 10, 555, 2616, 4, 3, UNI_AGE__5 } /* age=5.0 */, - { 1, 7880, 6505, 27, 5, UNI_CJKEXTC } /* iscjkunifiedideographsextensionc */, - { 0, 6114, 749, 3, 7, UNI_MARC } /* sc=marchen */, - { 0, 8276, 2290, 22, 6, UNI_INSC__NUMBER } /* indicsyllabiccategory=number */, - { 0, 1796, 1098, 7, 4, UNI_NSHU } /* script=nshu */, - { 2, 4355, 3839, 17, 6, UNI_TANG } /* scriptextensions=tangut */, - { 3, 7201, 1379, 15, 2, UNI_M } /* generalcategory=m */, - { 9, 4355, 1003, 17, 6, UNI_LEPC } /* scriptextensions=lepcha */, - { 0, 3915, 588, 17, 2, UNI_EPRES } /* emojipresentation=t */, - { 1, 2, 1939, 1, 9, UNI_COMPATJAMO } /* compatjamo */, - { 0, 6114, 164, 3, 4, UNI_PHNX } /* sc=phnx */, - { 0, 1065, 523, 5, 1, UNI_NV__1_SLASH_7 } /* nv=1/7 */, - { 2, 4433, 6771, 14, 4, UNI_LATINEXTD } /* blk=latinextendedd */, - { 2, 8590, 5898, 5, 4, UNI_ANY } /* isunicode */, - { 16, 6114, 71, 3, 4, UNI_SC__CPRT } /* sc=cprt */, - { 1, 2496, 4682, 3, 3, UNI_JG__SAD } /* jg=sad */, - { 1, 1410, 1070, 7, 2, UNI_CCC__31 } /* ccc=ccc31 */, - { 4, 959, 602, 8, 3, -UNI_EXT } /* extender=no */, - { 7, 58, 5139, 2, 8, UNI_SC__MYMR } /* sc=myanmar */, - { 0, 1796, 1353, 7, 4, UNI_PAUC } /* script=pauc */, - { 0, 1465, 933, 4, 7, -UNI_XPOSIXSPACE } /* space=false */, - { 3, 4827, 0, 4, 0, UNI_BAMU } /* bamu */, - { 1, 940, 1104, 5, 3, UNI_COMPEX } /* compex=t */, - { 0, 3367, 292, 14, 1, UNI_NV__43 } /* numericvalue=43 */, - { 19, 7182, 1434, 3, 7, UNI_CJKSTROKES } /* cjkstrokes */, - { 0, 4355, 868, 17, 4, UNI_TIRH } /* scriptextensions=tirh */, - { 1, 1796, 5322, 7, 4, UNI_CHER } /* script=cher */, - { 2, 296, 1781, 4, 4, UNI_NV__90000 } /* nv=90000 */, - { 0, 2802, 0, 10, 0, UNI_ETHI } /* isethiopic */, - { 6, 2153, 2060, 8, 4, UNI_NV__5_SLASH_12 } /* nv=4.167e-01 */, - { 4, 1879, 3991, 4, 7, UNI_BRAI } /* blk=braille */, - { 0, 524, 602, 6, 2, -UNI_PATSYN } /* patsyn=n */, - { 4, 3722, 0, 10, 0, UNI_SM } /* mathsymbol */, - { 1, 6402, 5075, 14, 5, UNI_SB__AT } /* sentencebreak=aterm */, - { 0, 24, 356, 3, 2, UNI_XPOSIXXDIGIT } /* hex=y */, - { 5, 5607, 6500, 15, 9, UNI_IDENTIFIERTYPE__INCLUSION } /* identifiertype=inclusion */, - { 2, 7201, 4614, 16, 16, UNI_PF } /* generalcategory=finalpunctuation */, - { 0, 6114, 236, 3, 4, UNI_SC__YI } /* sc=yiii */, - { 1, 6114, 909, 3, 4, UNI_BALI } /* sc=bali */, - { 11, 3915, 934, 17, 2, -UNI_EPRES } /* emojipresentation=f */, - { 1, 464, 110, 2, 2, UNI_ZL } /* iszl */, - { 0, 4355, 951, 17, 4, UNI_DUPL } /* scriptextensions=dupl */, - { 1, 321, 0, 5, 0, UNI_TALE } /* taile */, - { 0, 464, 3974, 2, 4, UNI_IDSB } /* isidsb */, - { 1, 2260, 2616, 3, 3, UNI_IN__5 } /* in=5.0 */, - { 3, 4433, 0, 18, 0, UNI_LATINEXTB } /* blk=latinextendedb */, - { 2, 1879, 7377, 4, 26, UNI_KATAKANAEXT } /* blk=katakanaphoneticextensions */, - { 0, 4092, 588, 9, 5, UNI_DIA } /* diacritic=true */, - { 1, 6379, 639, 13, 3, UNI_JG__NUN } /* joininggroup=nun */, - { 2, 1879, 1027, 4, 6, UNI_INYEZIDI } /* blk=yezidi */, - { 0, 939, 934, 5, 6, -UNI_ECOMP } /* ecomp=false */, - { 1, 4355, 409, 17, 4, UNI_DIAK } /* scriptextensions=diak */, - { 0, 6774, 934, 25, 6, -UNI_DI } /* defaultignorablecodepoint=false */, - { 0, 2678, 387, 3, 2, UNI_BC__EN } /* bc=en */, - { 1, 6114, 4882, 3, 4, UNI_EGYP } /* sc=egyp */, - { 2, 2454, 6878, 5, 20, UNI_GEOMETRICSHAPESEXT } /* isgeometricshapesextended */, - { 0, 409, 356, 3, 2, UNI_DIA } /* dia=y */, - { 1, 1796, 82, 7, 4, UNI_DSRT } /* script=dsrt */, - { 0, 2, 355, 1, 3, UNI_CE } /* ce=y */, - { 0, 3474, 3933, 6, 4, UNI_INMODI } /* block=modi */, - { 1, 7527, 1990, 3, 2, UNI_LB__WJ } /* lb=wj */, - { 0, 6944, 294, 25, 2, UNI_CCC__IS } /* canonicalcombiningclass=240 */, - { 8, 464, 5846, 2, 19, UNI_SUPARROWSC } /* issupplementalarrowsc */, - { 5, 2485, 1915, 6, 5, UNI_XPOSIXGRAPH } /* xposixgraph */, - { 1, 1975, 3060, 7, 6, UNI_POSIXXDIGIT } /* isposixxdigit */, - { 0, 1106, 0, 4, 0, UNI_TALU } /* talu */, - { 4, 6114, 818, 3, 7, UNI_SC__SHRD } /* sc=sharada */, - { 0, 34, 539, 1, 7, UNI_TNSA } /* istangsa */, - { 0, 7208, 54, 9, 2, UNI_MC } /* category=mc */, - { 0, 7201, 3651, 16, 14, UNI_MN } /* generalcategory=nonspacingmark */, - { 0, 2974, 292, 12, 2, UNI_IN__13 } /* presentin=v130 */, - { 0, 378, 601, 4, 4, -UNI_GREXT } /* grext=no */, - { 0, 2260, 6214, 3, 3, UNI_IN__2_DOT_1 } /* in=2.1 */, - { 0, 132, 0, 4, 0, UNI_MTEI } /* mtei */, - { 5, 6114, 321, 3, 5, UNI_SC__TALE } /* sc=taile */, - { 2, 2260, 292, 4, 1, UNI_IN__13 } /* in=13 */, - { 0, 2392, 0, 9, 0, UNI_INMYANMAR } /* inmyanmar */, - { 0, 6039, 5038, 7, 18, UNI_MODIFIERTONELETTERS } /* block=modifiertoneletters */, - { 0, 2253, 569, 10, 3, UNI_IN__9 } /* presentin=9.0 */, - { 1, 34, 7499, 1, 18, UNI_ANCIENTGREEKMUSIC } /* isancientgreekmusic */, - { 0, 296, 2081, 3, 3, UNI_NV__500 } /* nv=500 */, - { 1, 721, 730, 2, 5, UNI_KALI } /* kayahli */, - { 4, 5990, 928, 21, 2, UNI_BPT__O } /* bidipairedbrackettype=o */, - { 0, 2974, 1304, 11, 2, UNI_IN__2 } /* presentin=v20 */, - { 1, 1065, 2197, 4, 8, UNI_NV__1_SLASH_80 } /* nv=1.250e-02 */, - { 1, 4308, 356, 14, 4, UNI_DT__NONE } /* nfkdquickcheck=yes */, - { 5, 1102, 1227, 4, 7, UNI_MULT } /* scx=multani */, - { 15, 313, 967, 2, 8, UNI_INGUJARATI } /* ingujarati */, - { 0, 2496, 717, 3, 4, UNI_JG__ZAIN } /* jg=zain */, - { 4, 3474, 4918, 7, 9, UNI_ALCHEMICAL } /* block=alchemical */, - { 7, 1102, 6134, 4, 10, UNI_GLAG } /* scx=glagolitic */, - { 0, 1102, 1051, 4, 8, UNI_MAHJ } /* scx=mahajani */, - { 1, 296, 3365, 3, 2, UNI_NV__36 } /* nv=36 */, - { 1, 1879, 909, 4, 8, UNI_INBALINESE } /* blk=balinese */, - { 1, 7740, 356, 11, 4, UNI_IDEO } /* ideographic=yes */, - { 0, 4355, 1125, 17, 8, UNI_TFNG } /* scriptextensions=tifinagh */, - { 5, 7208, 128, 9, 2, UNI_ME } /* category=me */, - { 3, 1102, 5907, 4, 7, UNI_SINH } /* scx=sinhala */, - { 1, 887, 2053, 5, 3, UNI_AGE__11 } /* age=11.0 */, - { 0, 3474, 4551, 6, 16, UNI_LINEARBSYLLABARY } /* block=linearbsyllabary */, - { 0, 1410, 292, 8, 2, UNI_CCC__130 } /* ccc=ccc130 */, - { 0, 1102, 1826, 4, 11, UNI_SYLO } /* scx=sylotinagri */, - { 2, 5888, 278, 5, 1, UNI_nchar_values_index } /* nchar= */, - { 5, 7605, 897, 17, 3, UNI_GCB__V } /* hangulsyllabletype=v */, - { 3, 3351, 2079, 13, 9, UNI_NV__3_SLASH_2 } /* numericvalue=1.500e+00 */, - { 0, 4783, 5620, 9, 3, -UNI_XPOSIXSPACE } /* whitespace=n */, - { 6, 2678, 278, 2, 2, UNI_BC__B } /* bc=b */, - { 0, 2792, 4590, 10, 9, UNI_CYRILLICEXTC } /* iscyrillicextendedc */, - { 0, 2392, 5807, 3, 11, UNI_MONGOLIANSUP } /* inmongoliansup */, - { 1, 464, 3435, 2, 15, UNI_ZANB } /* iszanabazarsquare */, - { 2, 6114, 1508, 3, 8, UNI_UGAR } /* sc=ugaritic */, - { 5, 8276, 1157, 22, 5, UNI_INSC__NUKTA } /* indicsyllabiccategory=nukta */, - { 3, 4308, 3477, 12, 3, UNI_nfkdqc_values_index } /* nfkdquickcheck= */, - { 0, 313, 1227, 2, 7, UNI_INMULTANI } /* inmultani */, - { 2, 6402, 287, 14, 2, UNI_SB__NU } /* sentencebreak=nu */, - { 7, 3474, 5806, 6, 19, UNI_MONGOLIANSUP } /* block=mongoliansupplement */, - { 4, 34, 5660, 1, 5, UNI_MERO } /* ismero */, - { 3, 464, 496, 2, 4, UNI_KHOJ } /* iskhoj */, - { 2, 876, 934, 4, 2, -UNI_IDEO } /* ideo=f */, - { 2, 1539, 52, 3, 3, UNI_CAKM } /* iscakm */, - { 1, 3622, 3638, 3, 13, UNI_LISUSUP } /* islisusupplement */, - { 7, 2260, 2053, 4, 3, UNI_IN__11 } /* in=11.0 */, - { 1, 8276, 1958, 22, 7, UNI_INSC__VISARGA } /* indicsyllabiccategory=visarga */, - { 3, 2974, 771, 12, 2, UNI_IN__12_DOT_1 } /* presentin=v121 */, - { 1, 875, 356, 5, 2, UNI_UIDEO } /* uideo=y */, - { 3, 3474, 728, 6, 7, UNI_KALI } /* block=kayahli */, - { 5, 296, 6197, 2, 10, UNI_NV__100000000 } /* nv=100000000 */, - { 0, 275, 588, 3, 2, UNI_GCB__T } /* gcb=t */, - { 8, 6687, 1849, 22, 3, UNI_JG__MALAYALAMLLA } /* joininggroup=malayalamlla */, - { 1, 313, 5846, 2, 19, UNI_SUPARROWSC } /* insupplementalarrowsc */, - { 16, 1710, 7937, 3, 29, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* issymbolsandpictographsextendeda */, - { 0, 3367, 1781, 14, 4, UNI_NV__40000 } /* numericvalue=40000 */, - { 0, 464, 5502, 2, 21, UNI_CWCM } /* ischangeswhencasemapped */, - { 0, 6239, 0, 4, 0, UNI_BC__L } /* bc=l */, - { 2, 3474, 735, 6, 7, UNI_INLINEARA } /* block=lineara */, - { 10, 3474, 1561, 6, 10, UNI_INPHOENICIAN } /* block=phoenician */, - { 0, 464, 2771, 2, 5, UNI_KHMR } /* iskhmer */, - { 8, 4355, 1353, 17, 4, UNI_PAUC } /* scriptextensions=pauc */, - { 4, 7182, 1037, 3, 4, UNI_CJKEXTB } /* cjkextb */, - { 8, 3474, 1390, 6, 10, UNI_ASCII } /* block=basiclatin */, - { 0, 8, 6115, 1, 4, UNI_CO } /* gc=co */, - { 0, 1102, 4582, 4, 8, UNI_BOPO } /* scx=bopomofo */, - { 2, 8276, 6370, 31, 9, UNI_INSC__CONSONANTSUBJOINED } /* indicsyllabiccategory=consonantsubjoined */, - { 7, 5087, 4338, 10, 17, UNI_RI } /* wordbreak=regionalindicator */, - { 3, 5565, 278, 21, 1, UNI_cwu_values_index } /* changeswhenuppercased= */, - { 0, 4450, 1491, 14, 4, UNI_CYRILLICEXTA } /* block=cyrillicexta */, - { 0, 7132, 7238, 5, 24, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* blk=symbolsandpictographsexta */, - { 0, 1065, 1303, 5, 2, UNI_NV__1_SLASH_32 } /* nv=1/32 */, - { 4, 464, 43, 2, 4, UNI_BHKS } /* isbhks */, - { 4, 925, 601, 2, 3, UNI_BPT__N } /* bpt=n */, - { 2, 7317, 0, 21, 0, UNI_BC__L } /* bidiclass=lefttoright */, - { 1, 8244, 3571, 9, 6, UNI_CJKCOMPAT } /* block=cjkcompat */, - { 1, 464, 721, 2, 7, UNI_KNDA } /* iskannada */, - { 0, 6114, 172, 3, 4, UNI_RJNG } /* sc=rjng */, - { 2, 4783, 587, 9, 3, UNI_XPOSIXSPACE } /* whitespace=t */, - { 0, 433, 122, 2, 2, UNI_NKO } /* nkoo */, - { 2, 1796, 681, 7, 5, UNI_RUNR } /* script=runic */, - { 2, 7148, 1303, 25, 2, UNI_CCC__132 } /* canonicalcombiningclass=132 */, - { 0, 1796, 1133, 7, 4, UNI_VITH } /* script=vith */, - { 4, 7823, 3571, 5, 11, UNI_CJKCOMPATFORMS } /* incjkcompatforms */, - { 1, 2981, 771, 4, 2, UNI_IN__2_DOT_1 } /* in=v21 */, - { 2, 1879, 4582, 4, 16, UNI_BOPOMOFOEXT } /* blk=bopomofoextended */, - { 0, 1796, 4107, 7, 4, UNI_SC__HANG } /* script=hang */, - { 3, 1255, 0, 4, 0, UNI_SOYO } /* soyo */, - { 1, 6114, 1003, 3, 4, UNI_LEPC } /* sc=lepc */, - { 4, 313, 4107, 2, 15, UNI_INHANGUL } /* inhangulsyllables */, - { 6, 14, 5038, 1, 18, UNI_MODIFIERTONELETTERS } /* modifiertoneletters */, - { 0, 2890, 3273, 3, 12, UNI_JT__R } /* jt=rightjoining */, - { 4, 3474, 5825, 6, 9, UNI_INSUNDANESE } /* block=sundanese */, - { 4, 1102, 1451, 4, 10, UNI_DIAK } /* scx=divesakuru */, - { 0, 2443, 0, 11, 0, UNI_CASEDLETTER } /* casedletter */, - { 7, 8182, 5239, 24, 15, UNI_LOE } /* indicpositionalcategory=visualorderleft */, - { 0, 7527, 213, 3, 2, UNI_LB__GL } /* lb=gl */, - { 1, 555, 2262, 3, 3, UNI_AGE__14 } /* age=14 */, - { 0, 3450, 3869, 5, 16, UNI_UCAS } /* blk=canadiansyllabics */, - { 5, 815, 2747, 3, 13, UNI_HIGHSURROGATES } /* inhighsurrogates */, - { 1, 1975, 1915, 7, 5, UNI_POSIXGRAPH } /* isposixgraph */, - { 0, 661, 0, 4, 0, UNI_DOGR } /* dogr */, - { 0, 4355, 3188, 17, 15, UNI_ARMI } /* scriptextensions=imperialaramaic */, - { 3, 4872, 1037, 10, 4, UNI_KANAEXTB } /* block=kanaextb */, - { 2, 6114, 3435, 3, 15, UNI_ZANB } /* sc=zanabazarsquare */, - { 0, 464, 1755, 2, 11, UNI_MEDF } /* ismedefaidrin */, - { 0, 6011, 1491, 14, 4, UNI_ETHIOPICEXTA } /* block=ethiopicexta */, - { 3, 3974, 356, 4, 2, UNI_IDSB } /* idsb=y */, - { 0, 34, 1570, 1, 11, UNI_INSAURASHTRA } /* insaurashtra */, - { 16, 1133, 0, 4, 0, UNI_VITH } /* vith */, - { 0, 464, 4107, 2, 6, UNI_HANG } /* ishangul */, - { 0, 6570, 0, 24, 0, UNI_INPC__TOPANDBOTTOMANDLEFT } /* inpc=topandbottomandleft */, - { 0, 1796, 983, 7, 8, UNI_SC__HIRA } /* script=hiragana */, - { 2, 464, 951, 2, 8, UNI_DUPL } /* isduployan */, - { 1, 600, 696, 3, 3, UNI_DT__ISO } /* dt=iso */, - { 6, 8007, 3571, 7, 11, UNI_CJKCOMPATFORMS } /* blk=cjkcompatforms */, - { 1, 783, 0, 4, 0, UNI_OSMA } /* osma */, + { 1, 6165, 3421, 3, 15, UNI_NARB } /* sc=oldnortharabian */, + { 3, 1728, 1037, 6, 4, UNI_ARABICEXTB } /* arabicextb */, + { 0, 1200, 3611, 3, 6, UNI_CJKCOMPAT } /* cjkcompat */, + { 0, 991, 0, 4, 0, UNI_HATR } /* hatr */, + { 0, 4424, 1133, 17, 8, UNI_VITH } /* scriptextensions=vithkuqi */, + { 3, 1823, 3228, 7, 15, UNI_ARMI } /* script=imperialaramaic */, + { 2, 4424, 6185, 17, 10, UNI_GLAG } /* scriptextensions=glagolitic */, + { 1, 2432, 8039, 3, 32, UNI_MISCMATHSYMBOLSA } /* inmiscellaneousmathematicalsymbolsa */, + { 0, 30, 6796, 1, 19, UNI_DEVANAGARIEXT } /* isdevanagariextended */, + { 15, 7267, 4667, 16, 16, UNI_PE } /* generalcategory=closepunctuation */, + { 0, 4424, 951, 17, 4, UNI_DUPL } /* scriptextensions=dupl */, + { 35658, 6165, 3436, 3, 15, UNI_SARB } /* sc=oldsoutharabian */, + { 2, 2324, 8660, 6, 34, UNI_UCAS } /* block=unifiedcanadianaboriginalsyllabics */, + { 0, 7011, 1243, 24, 2, UNI_CCC__BL } /* canonicalcombiningclass=bl */, + { 1, 2966, 2767, 3, 7, UNI_INSC__OTHER } /* insc=other */, + { 0, 1102, 1294, 4, 9, UNI_NBAT } /* scx=nabataean */, + { 7, 2766, 269, 3, 2, UNI_ZP } /* gc=zp */, + { 1, 1823, 160, 7, 4, UNI_SC__PHLP } /* script=phlp */, + { 0, 309, 854, 2, 7, UNI_INTAIVIET } /* intaiviet */, + { 9, 959, 599, 8, 2, -UNI_EXT } /* extender=n */, + { 0, 461, 3892, 2, 16, UNI_STERM } /* issentenceterminal */, + { 1, 6427, 1046, 13, 5, UNI_JG__KHAPH } /* joininggroup=khaph */, + { 1, 8658, 5949, 5, 4, UNI_ANY } /* isunicode */, + { 4, 7669, 0, 19, 0, UNI_hst_values_index } /* hangulsyllabletype= */, + { 0, 1409, 1674, 5, 4, UNI_LATINEXTD } /* latinextd */, + { 2, 461, 1543, 2, 4, UNI_KHAR } /* iskhar */, + { 1, 2324, 1033, 6, 4, UNI_JAMO } /* block=jamo */, + { 5, 54, 5067, 2, 11, UNI_SC__MANI } /* sc=manichaean */, + { 3, 6165, 82, 3, 4, UNI_SC__GONG } /* sc=gong */, + { 0, 6163, 0, 14, 0, UNI_INSC__CONSONANT } /* insc=consonant */, + { 0, 1479, 5671, 4, 4, -UNI_XPOSIXSPACE } /* space=no */, + { 1, 1102, 180, 4, 4, UNI_RUNR } /* scx=runr */, + { 4, 6427, 2875, 13, 11, UNI_JG__STRAIGHTWAW } /* joininggroup=straightwaw */, + { 0, 271, 7134, 4, 7, UNI_GCB__PP } /* gcb=prepend */, + { 2, 1823, 2244, 7, 12, UNI_HUNG } /* script=oldhungarian */, + { 0, 406, 0, 4, 0, UNI_DIAK } /* diak */, + { 5, 1102, 1027, 4, 6, UNI_YEZI } /* scx=yezidi */, + { 3, 8343, 7692, 32, 15, UNI_INSC__CONSONANTINITIALPOSTFIXED } /* indicsyllabiccategory=consonantinitialpostfixed */, + { 0, 309, 1572, 2, 10, UNI_INOLDPERSIAN } /* inoldpersian */, + { 0, 461, 1144, 2, 9, UNI_BHKS } /* isbhaiksuki */, + { 0, 2832, 6193, 8, 12, UNI_CYRILLICSUP } /* iscyrillicsupplement */, + { 1, 4502, 590, 16, 2, UNI_LATINEXTE } /* blk=latinextendede */, + { 0, 2514, 2643, 3, 12, UNI_MISCTECHNICAL } /* ismisctechnical */, + { 0, 1883, 934, 11, 2, -UNI_BIDIC } /* bidicontrol=f */, + { 2, 4845, 352, 16, 2, UNI_patws_values_index } /* patternwhitespace= */, + { 6, 2324, 7796, 6, 22, UNI_ENCLOSEDIDEOGRAPHICSUP } /* block=enclosedideographicsup */, + { 17, 4424, 4176, 17, 4, UNI_HANG } /* scriptextensions=hang */, + { 3, 622, 934, 7, 6, -UNI_EXTPICT } /* extpict=false */, + { 1, 2324, 1349, 6, 9, UNI_INOLDUYGHUR } /* block=olduyghur */, + { 0, 6165, 1819, 3, 4, UNI_SC__MONG } /* sc=mong */, + { 1, 3817, 2123, 14, 8, UNI_NV__1_SLASH_64 } /* numericvalue=1.563e-02 */, + { 0, 6450, 281, 14, 2, UNI_SB__XX } /* sentencebreak=xx */, + { 0, 4970, 584, 16, 3, UNI_EBASE } /* emojimodifierbase=t */, + { 7, 3391, 1805, 14, 4, UNI_NV__20000 } /* numericvalue=20000 */, + { 2, 5637, 4407, 21, 17, UNI_RI } /* graphemeclusterbreak=regionalindicator */, + { 0, 2324, 1117, 6, 8, UNI_INTAGBANWA } /* block=tagbanwa */, + { 3, 597, 1743, 3, 4, UNI_DT__VERT } /* dt=vert */, + { 2, 6041, 599, 21, 2, UNI_BPT__N } /* bidipairedbrackettype=n */, + { 16, 6165, 5857, 3, 9, UNI_SC__MONG } /* sc=mongolian */, + { 0, 5532, 934, 21, 2, -UNI_CWCF } /* changeswhencasefolded=f */, + { 1, 2766, 50, 3, 2, UNI_MC } /* gc=mc */, + { 1, 718, 490, 3, 3, UNI_KANBUN } /* kanbun */, + { 0, 257, 0, 4, 0, UNI_CWCM } /* cwcm */, + { 0, 3130, 5863, 9, 6, UNI_GEORGIANSUP } /* blk=georgiansup */, + { 0, 1823, 450, 7, 4, UNI_MIAO } /* script=plrd */, + { 2, 552, 557, 4, 3, UNI_AGE__6 } /* age=6.0 */, + { 0, 1102, 6185, 4, 10, UNI_GLAG } /* scx=glagolitic */, + { 1, 6062, 1183, 7, 8, UNI_EMOTICONS } /* block=emoticons */, + { 57317, 1075, 0, 4, 0, UNI_NV__2 } /* nv=2 */, + { 0, 1174, 1933, 3, 9, UNI_EA__A } /* ea=ambiguous */, + { 0, 30, 4553, 1, 10, UNI_TITLE } /* istitlecase */, + { 0, 4043, 0, 4, 0, UNI_IDSB } /* idsb */, + { 3, 466, 82, 2, 2, UNI_SOGO } /* sogo */, + { 1, 1667, 3475, 4, 15, UNI_INZANABAZARSQUARE } /* blk=zanabazarsquare */, + { 0, 7011, 1905, 24, 2, UNI_CCC__DB } /* canonicalcombiningclass=db */, + { 0, 461, 1894, 2, 12, UNI_BIDIM } /* isbidimirrored */, + { 0, 309, 1779, 2, 11, UNI_INMEDEFAIDRIN } /* inmedefaidrin */, + { 0, 5637, 6, 21, 2, UNI_LB__CR } /* graphemeclusterbreak=cr */, + { 2, 725, 0, 7, 0, UNI_KALI } /* kayahli */, + { 5, 1200, 377, 3, 4, UNI_CJKEXTH } /* cjkexth */, + { 8, 4043, 934, 17, 2, -UNI_IDSB } /* idsbinaryoperator=f */, + { 0, 2324, 8214, 7, 32, UNI_DIACRITICALSEXT } /* block=combiningdiacriticalmarksextended */, + { 1, 6165, 236, 3, 4, UNI_ZANB } /* sc=zanb */, + { 3, 2832, 1037, 10, 4, UNI_CYRILLICEXTB } /* iscyrillicextb */, + { 2, 4424, 137, 18, 3, UNI_MYMR } /* scriptextensions=mymr */, + { 4, 4360, 7804, 10, 11, UNI_LB__ID } /* linebreak=ideographic */, + { 5, 2401, 0, 10, 0, UNI_INETHIOPIC } /* inethiopic */, + { 0, 461, 1872, 2, 11, UNI_YISYLLABLES } /* isyisyllables */, + { 2, 3502, 4511, 12, 9, UNI_ETHIOPICEXTB } /* blk=ethiopicextendedb */, + { 3, 7495, 345, 27, 2, UNI_CCC__18 } /* canonicalcombiningclass=ccc18 */, + { 5, 4651, 0, 16, 0, UNI_BOPOMOFOEXT } /* bopomofoextended */, + { 0, 1667, 5373, 4, 11, UNI_TAIXUANJING } /* blk=taixuanjing */, + { 0, 4206, 0, 15, 0, UNI_PS } /* openpunctuation */, + { 0, 1667, 7449, 4, 28, UNI_PHONETICEXTSUP } /* blk=phoneticextensionssupplement */, + { 3, 1102, 790, 4, 4, UNI_KALI } /* scx=kali */, + { 1, 7383, 6310, 10, 20, UNI_BC__PDF } /* bidiclass=popdirectionalformat */, + { 1, 1272, 8474, 5, 23, UNI_CJKCOMPATIDEOGRAPHS } /* iscjkcompatibilityideographs */, + { 1, 1102, 39, 4, 4, UNI_BHKS } /* scx=bhks */, + { 1, 6185, 0, 4, 0, UNI_GLAG } /* glag */, + { 2, 5353, 0, 20, 0, UNI_PHLI } /* inscriptionalpahlavi */, + { 0, 2766, 3709, 3, 11, UNI_MC } /* gc=spacingmark */, + { 0, 4360, 4667, 10, 16, UNI_LB__CL } /* linebreak=closepunctuation */, + { 2, 30, 1925, 1, 7, UNI_S } /* issymbol */, + { 0, 3391, 759, 13, 4, UNI_NV___MINUS_1_SLASH_2 } /* numericvalue=-1/2 */, + { 2, 1942, 584, 11, 3, UNI_GRBASE } /* graphemebase=t */, + { 1, 3093, 585, 13, 5, UNI_POSIXXDIGIT } /* asciihexdigit=true */, + { 3, 1102, 1209, 4, 4, UNI_THAI } /* scx=thai */, + { 3, 3013, 585, 5, 2, UNI_EPRES } /* epres=t */, + { 0, 7274, 3191, 8, 13, UNI_NL } /* category=letternumber */, + { 0, 3817, 769, 14, 3, UNI_NV__17_SLASH_2 } /* numericvalue=17/2 */, + { 4, 1667, 5897, 4, 19, UNI_SUPARROWSC } /* blk=supplementalarrowsc */, + { 0, 461, 283, 2, 5, UNI_NSHU } /* isnushu */, + { 1, 2018, 584, 10, 3, UNI_JT__T } /* joiningtype=t */, + { 1, 309, 1367, 2, 9, UNI_INPAUCINHAU } /* inpaucinhau */, + { 0, 597, 693, 3, 3, UNI_DT__ISO } /* dt=iso */, + { 0, 7383, 6291, 11, 19, UNI_BC__LRE } /* bidiclass=lefttorightembedding */, + { 2, 5156, 5769, 10, 9, UNI_WB__EB } /* wordbreak=emodifier */, + { 0, 5156, 3064, 10, 11, UNI_WB__SQ } /* wordbreak=singlequote */, + { 5, 2391, 7467, 10, 13, UNI_CYRILLICSUP } /* incyrillicsupplementary */, + { 7, 3633, 4698, 6, 5, UNI_LATIN1 } /* inlatin1sup */, + { 1, 6165, 6642, 3, 6, UNI_BRAH } /* sc=brahmi */, + { 3, 1102, 1465, 4, 10, UNI_DIAK } /* scx=divesakuru */, + { 1, 1102, 402, 4, 4, UNI_ARMN } /* scx=armn */, + { 2, 2766, 225, 3, 2, UNI_PE } /* gc=pe */, + { 1, 6735, 661, 22, 2, UNI_JG__MALAYALAMRA } /* joininggroup=malayalamra */, + { 3, 461, 6776, 2, 21, UNI_MEETEIMAYEKEXT } /* ismeeteimayekextensions */, + { 4, 5216, 0, 15, 0, UNI_LATINEXTE } /* block=latinexte */, + { 0, 1391, 1645, 3, 7, UNI_WB__LE } /* wb=aletter */, + { 2, 461, 1696, 2, 11, UNI_DOMINO } /* isdominotiles */, + { 1, 461, 951, 2, 4, UNI_DUPL } /* isdupl */, + { 7, 4424, 673, 17, 5, UNI_OSGE } /* scriptextensions=osage */, + { 2, 4519, 4511, 14, 9, UNI_CYRILLICEXTB } /* block=cyrillicextendedb */, + { 10, 7648, 3276, 18, 3, UNI_DT__ENC } /* decompositiontype=enc */, + { 2, 4424, 668, 17, 5, UNI_OGAM } /* scriptextensions=ogham */, + { 3, 2301, 933, 10, 7, -UNI_XIDC } /* xidcontinue=false */, + { 0, 6735, 783, 22, 3, UNI_JG__MALAYALAMNYA } /* joininggroup=malayalamnya */, + { 12, 1102, 909, 4, 8, UNI_BALI } /* scx=balinese */, + { 0, 2665, 599, 13, 3, -UNI_PATSYN } /* patternsyntax=no */, + { 1, 271, 3191, 2, 7, UNI_L } /* gc=letter */, + { 0, 461, 663, 2, 5, UNI_LIMB } /* islimbu */, + { 0, 461, 6103, 2, 13, UNI_MATHOPERATORS } /* ismathoperators */, + { 0, 2536, 4235, 3, 4, UNI_JG__BETH } /* jg=beth */, + { 0, 753, 1792, 3, 5, UNI_NFCQC__M } /* nfkcqc=m */, + { 5, 2966, 5409, 3, 17, UNI_SMALLKANAEXT } /* insmallkanaextension */, + { 10, 7011, 2290, 25, 2, UNI_CCC__214 } /* canonicalcombiningclass=214 */, + { 2, 7274, 3709, 9, 11, UNI_MC } /* category=spacingmark */, + { 1, 7274, 199, 9, 2, UNI_TITLE } /* category=lt */, + { 0, 7404, 1715, 21, 7, UNI_BC__RLI } /* bidiclass=righttoleftisolate */, + { 0, 3391, 1803, 12, 9, UNI_NV__10000000 } /* numericvalue=10000000 */, + { 4, 1102, 1438, 4, 10, UNI_CHRS } /* scx=chorasmian */, + { 16, 6450, 325, 14, 2, UNI_SB__UP } /* sentencebreak=up */, + { 3, 2732, 1037, 10, 4, UNI_ARABICEXTB } /* blk=arabicextb */, + { 1, 3817, 389, 14, 1, UNI_NV__16 } /* numericvalue=16 */, + { 1, 4845, 5671, 16, 3, -UNI__PERL_PATWS } /* patternwhitespace=n */, + { 1, 2, 3938, 1, 16, UNI_UCAS } /* canadiansyllabics */, + { 2, 1823, 1205, 7, 4, UNI_SC__GRAN } /* script=gran */, + { 0, 2536, 2566, 3, 3, UNI_JG__HEH } /* jg=heh */, + { 0, 410, 0, 4, 0, UNI_GONM } /* gonm */, + { 5, 2514, 2057, 3, 11, UNI_MATHALPHANUM } /* ismathalphanum */, + { 0, 1198, 8214, 3, 32, UNI_DIACRITICALSEXT } /* incombiningdiacriticalmarksextended */, + { 2, 309, 6693, 3, 21, UNI_TRANSPORTANDMAP } /* intransportandmapsymbols */, + { 0, 7591, 3001, 3, 7, UNI_LB__NU } /* lb=numeric */, + { 2, 6427, 7328, 13, 14, UNI_JG__NOJOININGGROUP } /* joininggroup=nojoininggroup */, + { 2, 65, 0, 2, 0, UNI_MN } /* mn */, + { 0, 1823, 333, 7, 4, UNI_CARI } /* script=cari */, + { 1, 33, 463, 1, 3, UNI_SHAW } /* shaw */, + { 0, 1906, 3622, 7, 3, UNI_KANGXI } /* blk=kangxi */, + { 0, 6427, 7342, 13, 14, UNI_JG__HAMZAONHEHGOAL } /* joininggroup=tehmarbutagoal */, + { 0, 5937, 2931, 20, 3, UNI__PERL_NCHAR } /* noncharactercodepoint=t */, + { 1, 461, 4620, 2, 16, UNI_LINEARBSYLLABARY } /* islinearbsyllabary */, + { 4, 461, 3984, 2, 17, UNI_EPRES } /* isemojipresentation */, + { 10, 2766, 3706, 3, 14, UNI_MN } /* gc=nonspacingmark */, + { 1, 2536, 6205, 3, 19, UNI_JG__BURUSHASKIYEHBARREE } /* jg=burushaskiyehbarree */, + { 2, 1823, 1223, 7, 4, UNI_SC__KANA } /* script=kana */, + { 0, 6165, 5440, 3, 20, UNI_HMNP } /* sc=nyiakengpuachuehmong */, + { 4, 1272, 1214, 3, 3, UNI_CHER } /* ischer */, + { 1, 1715, 440, 4, 2, UNI_OLCK } /* isolck */, + { 0, 292, 1318, 3, 3, UNI_NV__200 } /* nv=200 */, + { 0, 461, 1397, 2, 4, UNI_IDST } /* isidst */, + { 1, 461, 5068, 2, 4, UNI_MANI } /* ismani */, + { 0, 2280, 2656, 10, 3, UNI_IN__5 } /* presentin=5.0 */, + { 0, 1059, 599, 6, 2, UNI_NFKDQC__N } /* nfkdqc=n */, + { 0, 552, 386, 4, 3, UNI_AGE__3_DOT_2 } /* age=3.2 */, + { 1, 6185, 0, 20, 0, UNI_GLAGOLITICSUP } /* glagoliticsupplement */, + { 0, 1667, 825, 4, 7, UNI_SHAW } /* blk=shavian */, + { 1, 916, 584, 4, 3, UNI_EBASE } /* ebase=t */, + { 0, 6165, 1144, 3, 9, UNI_BHKS } /* sc=bhaiksuki */, + { 0, 1396, 353, 8, 2, UNI_XIDS } /* xidstart=y */, + { 1, 1102, 120, 4, 4, UNI_LAO } /* scx=laoo */, + { 4, 1667, 746, 4, 7, UNI_INMARCHEN } /* blk=marchen */, + { 1, 30, 1591, 1, 11, UNI_INSAURASHTRA } /* insaurashtra */, + { 2, 3349, 0, 15, 0, UNI_MERC } /* meroiticcursive */, + { 6, 339, 8030, 4, 9, UNI_CCC__AL } /* ccc=aboveleft */, + { 16, 1424, 2290, 7, 2, UNI_CCC__14 } /* ccc=ccc14 */, + { 1, 461, 1212, 2, 9, UNI_QAAI } /* isinherited */, + { 1, 6450, 5090, 13, 6, UNI_SB__CL } /* sentencebreak=close */, + { 3, 1011, 599, 2, 2, -UNI_CI } /* ci=n */, + { 0, 4424, 3692, 17, 4, UNI_LISU } /* scriptextensions=lisu */, + { 0, 257, 934, 4, 2, -UNI_CWCM } /* cwcm=f */, + { 0, 1102, 1572, 4, 10, UNI_XPEO } /* scx=oldpersian */, + { 2, 292, 393, 3, 2, UNI_NV__15 } /* nv=15 */, + { 2, 7669, 32, 20, 1, UNI_LB__H2 } /* hangulsyllabletype=lv */, + { 1, 261, 353, 5, 4, UNI_CWKCF } /* cwkcf=yes */, + { 3, 6165, 732, 3, 7, UNI_SC__LINA } /* sc=lineara */, + { 2, 7648, 363, 18, 3, UNI_DT__SML } /* decompositiontype=sml */, + { 0, 339, 388, 4, 2, UNI_CCC__26 } /* ccc=26 */, + { 3, 309, 8619, 2, 21, UNI_MATHOPERATORS } /* inmathematicaloperators */, + { 8, 3514, 2705, 7, 13, UNI_ANCIENTSYMBOLS } /* block=ancientsymbols */, + { 0, 8343, 2613, 22, 6, UNI_LB__ZWJ } /* indicsyllabiccategory=joiner */, + { 2, 609, 928, 2, 3, UNI_LB__OP } /* lb=op */, + { 0, 2483, 585, 5, 2, UNI_CASED } /* cased=t */, + { 3, 5460, 934, 19, 6, -UNI_TERM } /* terminalpunctuation=false */, + { 0, 21, 7241, 1, 10, UNI_ENCLOSEDCJK } /* enclosedcjk */, + { 8, 3021, 295, 4, 2, UNI_IN__9 } /* in=v90 */, + { 16, 7591, 2944, 3, 11, UNI_LB__BB } /* lb=breakbefore */, + { 1, 4360, 63, 10, 2, UNI_LB__CP } /* linebreak=cp */, + { 3, 4941, 1037, 10, 4, UNI_KANAEXTB } /* block=kanaextb */, + { 0, 6165, 1465, 3, 10, UNI_DIAK } /* sc=divesakuru */, + { 0, 3013, 934, 5, 6, -UNI_EPRES } /* epres=false */, + { 0, 1667, 3093, 4, 5, UNI_ASCII } /* blk=ascii */, + { 0, 1191, 0, 4, 0, UNI_BENG } /* beng */, + { 4, 1397, 598, 3, 3, -UNI_IDST } /* idst=n */, + { 2, 309, 2222, 2, 2, UNI_IN__6 } /* in=6 */, + { 0, 4360, 9, 10, 2, UNI_LB__CM } /* linebreak=cm */, + { 7, 461, 2468, 2, 13, UNI_IPAEXT } /* isipaextensions */, + { 1, 3490, 1037, 12, 4, UNI_CYRILLICEXTB } /* blk=cyrillicextb */, + { 1, 4424, 430, 17, 4, UNI_NKO } /* scriptextensions=nkoo */, + { 0, 1667, 4176, 4, 15, UNI_INHANGUL } /* blk=hangulsyllables */, + { 0, 2766, 6677, 3, 14, UNI_LM } /* gc=modifierletter */, + { 1, 19, 599, 4, 2, -UNI_POSIXXDIGIT } /* ahex=n */, + { 7, 6427, 484, 13, 3, UNI_JG__HAH } /* joininggroup=hah */, + { 5, 6165, 527, 3, 6, UNI_RJNG } /* sc=rejang */, + { 4, 1086, 0, 4, 0, UNI_KTHI } /* kthi */, + { 4, 7011, 6289, 23, 5, UNI_CCC__L } /* canonicalcombiningclass=left */, + { 4, 7752, 225, 23, 2, UNI_JG__MANICHAEANPE } /* joininggroup=manichaeanpe */, + { 0, 6165, 369, 3, 6, UNI_GOTH } /* sc=gothic */, + { 2, 1667, 5185, 4, 20, UNI_INANATOLIANHIEROGLYPHS } /* blk=anatolianhieroglyphs */, + { 2, 1391, 1652, 3, 7, UNI_WB__NL } /* wb=newline */, + { 2, 1065, 2083, 4, 8, UNI_NV__1_SLASH_9 } /* nv=1.111e-01 */, + { 0, 5156, 1645, 10, 7, UNI_WB__LE } /* wordbreak=aletter */, + { 0, 2232, 2119, 8, 4, UNI_NV__1_SLASH_12 } /* nv=8.333e-02 */, + { 0, 292, 2106, 3, 9, UNI_NV__3_SLASH_2 } /* nv=1.500e+00 */, + { 4, 6870, 353, 20, 2, UNI_CE } /* compositionexclusion=y */, + { 4, 3817, 3876, 15, 2, UNI_NV__1_SLASH_80 } /* numericvalue=1/80 */, + { 0, 4424, 5876, 17, 9, UNI_SUND } /* scriptextensions=sundanese */, + { 2, 7537, 353, 10, 2, UNI_XPOSIXALPHA } /* alphabetic=y */, + { 0, 1272, 7972, 3, 29, UNI_CUNEIFORMNUMBERS } /* iscuneiformnumbersandpunctuation */, + { 8, 1455, 934, 3, 2, -UNI_DEP } /* dep=f */, + { 1, 1823, 5958, 7, 7, UNI_SC__SINH } /* script=sinhala */, + { 0, 5065, 4255, 13, 4, UNI_JG__MANICHAEANRESH } /* jg=manichaeanresh */, + { 0, 7274, 4602, 9, 18, UNI_PI } /* category=initialpunctuation */, + { 2, 1102, 369, 4, 4, UNI_GOTH } /* scx=goth */, + { 5, 2348, 5671, 12, 4, -UNI_CI } /* caseignorable=no */, + { 1, 2718, 327, 3, 3, UNI_BC__FSI } /* bc=fsi */, + { 1, 3021, 3861, 4, 2, UNI_IN__7 } /* in=v70 */, + { 4, 6165, 414, 3, 3, UNI_SC__HAN } /* sc=han */, + { 1, 4043, 353, 4, 4, UNI_IDSB } /* idsb=yes */, + { 2, 2002, 1479, 7, 5, UNI_POSIXSPACE } /* isposixspace */, + { 4, 8246, 5308, 24, 15, UNI_LOE } /* indicpositionalcategory=visualorderleft */, + { 2, 4424, 462, 17, 4, UNI_SHAW } /* scriptextensions=shaw */, + { 4, 2220, 0, 12, 0, UNI_NV__1_SLASH_16 } /* nv=6.250e-02 */, + { 4, 1455, 353, 3, 2, UNI_DEP } /* dep=y */, + { 0, 3791, 585, 4, 5, UNI_MATH } /* math=true */, + { 0, 2280, 2080, 11, 3, UNI_IN__11 } /* presentin=11.0 */, + { 1, 622, 934, 7, 2, -UNI_EXTPICT } /* extpict=f */, + { 2, 2068, 0, 4, 0, UNI_MEND } /* mend */, + { 0, 6427, 6205, 13, 19, UNI_JG__BURUSHASKIYEHBARREE } /* joininggroup=burushaskiyehbarree */, + { 0, 461, 3101, 2, 5, UNI_XPOSIXDIGIT } /* isdigit */, + { 2, 3817, 891, 15, 2, UNI_NV__1_SLASH_10 } /* numericvalue=1/10 */, + { 0, 2324, 3228, 6, 15, UNI_INIMPERIALARAMAIC } /* block=imperialaramaic */, + { 0, 2, 1966, 1, 9, UNI_COMPATJAMO } /* compatjamo */, + { 0, 30, 5124, 1, 20, UNI_OTTOMANSIYAQNUMBERS } /* isottomansiyaqnumbers */, + { 3, 6062, 5848, 14, 9, UNI_ETHIOPICEXTA } /* block=ethiopicextendeda */, + { 7, 4407, 274, 17, 1, UNI_ri_values_index } /* regionalindicator= */, + { 0, 7011, 2735, 23, 3, UNI_CCC__AR } /* canonicalcombiningclass=ar */, + { 1, 30, 2263, 1, 3, UNI_DI } /* isdi */, + { 0, 7011, 288, 24, 2, UNI_CCC__30 } /* canonicalcombiningclass=30 */, + { 1, 6866, 353, 24, 4, UNI_COMPEX } /* fullcompositionexclusion=yes */, + { 0, 7537, 353, 10, 4, UNI_XPOSIXALPHA } /* alphabetic=yes */, + { 0, 1667, 499, 4, 6, UNI_INLYDIAN } /* blk=lydian */, + { 1, 597, 1127, 3, 3, UNI_DT__FIN } /* dt=fin */, + { 0, 298, 274, 2, 1, UNI_ri_values_index } /* ri= */, + { 0, 1223, 5848, 4, 9, UNI_KANAEXTA } /* kanaextendeda */, + { 2, 1823, 1975, 7, 10, UNI_SOGO } /* script=oldsogdian */, + { 1, 271, 363, 4, 2, UNI_GCB__SM } /* gcb=sm */, + { 1, 3848, 0, 14, 0, UNI_NV__7 } /* numericvalue=7 */, + { 0, 309, 3663, 2, 10, UNI_INDEVANAGARI } /* indevanagari */, + { 2, 622, 598, 6, 2, UNI_extpict_values_index } /* extpict= */, + { 0, 2324, 4176, 6, 6, UNI_INHANGUL } /* block=hangul */, + { 0, 1065, 2131, 4, 8, UNI_NV__1_SLASH_6 } /* nv=1.667e-01 */, + { 0, 461, 236, 2, 4, UNI_ZANB } /* iszanb */, + { 0, 2018, 2908, 12, 11, UNI_JT__C } /* joiningtype=joincausing */, + { 0, 461, 13, 2, 2, UNI_LM } /* islm */, + { 1, 3130, 5292, 6, 16, UNI_INPUNCTUATION } /* blk=generalpunctuation */, + { 0, 461, 3098, 2, 8, UNI_XPOSIXXDIGIT } /* ishexdigit */, + { 1, 1823, 414, 7, 3, UNI_SC__HAN } /* script=han */, + { 0, 4360, 2599, 10, 10, UNI_LB__NS } /* linebreak=nonstarter */, + { 1, 6120, 0, 22, 0, UNI_DIACRITICALSFORSYMBOLS } /* diacriticalsforsymbols */, + { 0, 7383, 4827, 10, 18, UNI_BC__B } /* bidiclass=paragraphseparator */, + { 1, 7591, 4667, 3, 16, UNI_LB__CL } /* lb=closepunctuation */, + { 0, 1243, 8073, 4, 22, UNI_CJK } /* block=cjkunifiedideographs */, + { 1, 5658, 6374, 15, 8, UNI_IDENTIFIERTYPE__OBSOLETE } /* identifiertype=obsolete */, + { 1, 887, 546, 5, 3, UNI_AGE__13 } /* age=13.0 */, + { 1, 1801, 0, 8, 0, UNI_NV__10000 } /* nv=10000 */, + { 0, 2324, 2068, 6, 12, UNI_INMENDEKIKAKUI } /* block=mendekikakui */, + { 0, 1102, 658, 4, 5, UNI_DOGR } /* scx=dogra */, + { 0, 5916, 353, 21, 2, UNI_LOE } /* logicalorderexception=y */, + { 2, 1823, 5067, 6, 5, UNI_SC__MANI } /* script=mani */, + { 2, 8601, 837, 10, 3, UNI_SUPPUAA } /* block=suppuaa */, + { 2, 253, 353, 4, 4, UNI_CWCF } /* cwcf=yes */, + { 16, 1823, 673, 7, 5, UNI_OSGE } /* script=osage */, + { 0, 30, 4089, 1, 18, UNI_INDICSIYAQNUMBERS } /* isindicsiyaqnumbers */, + { 1, 152, 0, 4, 0, UNI_OSGE } /* osge */, + { 0, 641, 644, 3, 4, UNI_LB__H3 } /* hst=lvt */, + { 2, 2287, 2199, 4, 3, UNI_IN__12 } /* in=12.0 */, + { 3, 5156, 1829, 9, 3, UNI_WB__ML } /* wordbreak=ml */, + { 2, 461, 3093, 2, 13, UNI_POSIXXDIGIT } /* isasciihexdigit */, + { 4, 3391, 2155, 13, 9, UNI_NV__1_SLASH_32 } /* numericvalue=3.125e-02 */, + { 0, 1102, 446, 4, 4, UNI_PHLI } /* scx=phli */, + { 10, 2324, 4896, 6, 8, UNI_BAMUMSUP } /* block=bamumsup */, + { 0, 309, 8142, 2, 32, UNI_IDEOGRAPHICSYMBOLS } /* inideographicsymbolsandpunctuation */, + { 1, 1272, 6228, 4, 8, UNI_CJKSYMBOLS } /* iscjksymbols */, + { 0, 461, 967, 2, 8, UNI_GUJR } /* isgujarati */, + { 0, 3724, 919, 12, 3, UNI_JG__MALAYALAMSSA } /* jg=malayalamssa */, + { 0, 461, 5769, 2, 4, UNI_EMOD } /* isemod */, + { 4, 4502, 5848, 9, 9, UNI_LATINEXTA } /* blk=latinextendeda */, + { 1, 2766, 1611, 3, 2, UNI_LOWERCASELETTER } /* gc=ll */, + { 2, 7495, 582, 28, 2, UNI_CCC__122 } /* canonicalcombiningclass=ccc122 */, + { 1, 4043, 934, 4, 6, -UNI_IDSB } /* idsb=false */, + { 5, 6165, 840, 3, 7, UNI_SC__TGLG } /* sc=tagalog */, + { 3, 461, 1610, 2, 3, UNI_ALL } /* isall */, + { 0, 2842, 6142, 3, 21, UNI_EARLYDYNASTICCUNEIFORM } /* isearlydynasticcuneiform */, + { 0, 461, 454, 2, 4, UNI_PRTI } /* isprti */, + { 0, 2766, 3263, 3, 13, UNI_XPOSIXDIGIT } /* gc=decimalnumber */, + { 0, 3817, 2091, 14, 8, UNI_NV__1_SLASH_8 } /* numericvalue=1.250e-01 */, + { 3, 1424, 288, 8, 2, UNI_CCC__130 } /* ccc=ccc130 */, + { 0, 309, 32, 2, 2, UNI_INVS } /* invs */, + { 0, 499, 0, 4, 0, UNI_LYDI } /* lydi */, + { 2, 5065, 3740, 13, 3, UNI_JG__MANICHAEANMEM } /* jg=manichaeanmem */, + { 4, 597, 604, 3, 4, UNI_EA__F } /* dt=wide */, + { 0, 6103, 0, 13, 0, UNI_MATHOPERATORS } /* mathoperators */, + { 1, 2403, 4511, 8, 9, UNI_ETHIOPICEXTB } /* ethiopicextendedb */, + { 0, 309, 1562, 2, 10, UNI_INNAGMUNDARI } /* innagmundari */, + { 0, 32, 353, 2, 2, UNI_VS } /* vs=y */, + { 3, 7274, 117, 9, 2, UNI_XPOSIXDIGIT } /* category=nd */, + { 8, 7804, 599, 11, 2, -UNI_IDEO } /* ideographic=n */, + { 1, 7084, 4659, 8, 9, UNI_ARABICEXTC } /* inarabicextendedc */, + { 2, 1823, 1358, 7, 4, UNI_PALM } /* script=palm */, + { 29636, 309, 3663, 2, 13, UNI_DEVANAGARIEXT } /* indevanagariext */, + { 0, 3391, 0, 13, 0, UNI_nv_values_index } /* numericvalue= */, + { 8, 461, 5876, 2, 4, UNI_SUND } /* issund */, + { 2, 2718, 5497, 3, 18, UNI_BC__FSI } /* bc=firststrongisolate */, + { 0, 7752, 636, 23, 3, UNI_JG__MANICHAEANNUN } /* joininggroup=manichaeannun */, + { 3, 461, 537, 2, 6, UNI_TNSA } /* istangsa */, + { 0, 6510, 0, 24, 0, UNI_HIGHPUSURROGATES } /* highprivateusesurrogates */, + { 0, 1102, 1125, 4, 8, UNI_TFNG } /* scx=tifinagh */, + { 2, 2220, 0, 4, 0, UNI_NV__6 } /* nv=6 */, + { 0, 7480, 0, 14, 0, UNI_PUA } /* privateusearea */, + { 0, 1823, 3538, 7, 7, UNI_SC__CPRT } /* script=cypriot */, + { 2, 1530, 1505, 6, 4, UNI_KANAEXTA } /* iskanaexta */, + { 0, 461, 2301, 2, 11, UNI_XIDC } /* isxidcontinue */, + { 6, 1667, 3649, 4, 11, UNI_PHONETICEXT } /* blk=phoneticext */, + { 6, 3803, 599, 14, 3, UNI_NFKCQC__N } /* nfkcquickcheck=no */, + { 2, 7669, 3218, 20, 10, UNI_GCB__L } /* hangulsyllabletype=leadingjamo */, + { 0, 461, 132, 2, 4, UNI_MTEI } /* ismtei */, + { 2, 3490, 5848, 12, 9, UNI_CYRILLICEXTA } /* blk=cyrillicextendeda */, + { 0, 6076, 5292, 8, 16, UNI_INPUNCTUATION } /* block=generalpunctuation */, + { 4, 4424, 2780, 17, 6, UNI_COPT } /* scriptextensions=coptic */, + { 0, 309, 2009, 2, 6, UNI_INSYRIAC } /* insyriac */, + { 0, 461, 2301, 2, 4, UNI_XIDC } /* isxidc */, + { 2, 1823, 1582, 7, 10, UNI_PHNX } /* script=phoenician */, + { 0, 1102, 1107, 5, 3, UNI_TALU } /* scx=talu */, + { 14, 5958, 0, 4, 0, UNI_SINH } /* sinh */, + { 0, 3724, 699, 4, 3, UNI_JG__MEEM } /* jg=meem */, + { 0, 309, 5876, 2, 12, UNI_SUNDANESESUP } /* insundanesesup */, + { 8, 2324, 2335, 6, 13, UNI_BLOCKELEMENTS } /* block=blockelements */, + { 0, 1994, 585, 7, 5, UNI_RADICAL } /* radical=true */, + { 4, 3677, 4770, 15, 10, UNI_LATINEXTADDITIONAL } /* islatinextendedadditional */, + { 0, 6165, 1592, 3, 10, UNI_SAUR } /* sc=saurashtra */, + { 3, 253, 274, 4, 1, UNI_cwcf_values_index } /* cwcf= */, + { 0, 6163, 4119, 5, 12, UNI_INSC__NUMBERJOINER } /* insc=numberjoiner */, + { 0, 2018, 5089, 10, 3, UNI_JT__C } /* joiningtype=c */, + { 0, 732, 5652, 4, 8, UNI_LB__ID } /* linebreak=id */, + { 0, 2514, 129, 3, 3, UNI_MEDF } /* ismedf */, + { 0, 406, 0, 3, 0, UNI_DIA } /* dia */, + { 0, 3633, 1674, 7, 4, UNI_LATINEXTD } /* inlatinextd */, + { 0, 1102, 4896, 4, 5, UNI_BAMU } /* scx=bamum */, + { 1, 7198, 4457, 6, 15, UNI_SUTTONSIGNWRITING } /* blk=suttonsignwriting */, + { 1, 4941, 4511, 10, 9, UNI_KANAEXTB } /* block=kanaextendedb */, + { 0, 461, 32, 2, 2, UNI_VS } /* isvs */, + { 0, 2324, 5876, 6, 19, UNI_SUNDANESESUP } /* block=sundanesesupplement */, + { 2, 6165, 1262, 3, 7, UNI_SOYO } /* sc=soyombo */, + { 0, 1396, 0, 4, 0, UNI_XIDS } /* xids */, + { 0, 1823, 653, 7, 5, UNI_SC__BUHD } /* script=buhid */, + { 2, 533, 54, 3, 2, UNI_SB__SC } /* sb=sc */, + { 4, 4424, 3436, 17, 15, UNI_SARB } /* scriptextensions=oldsoutharabian */, + { 2, 5799, 837, 6, 3, UNI_SUPPUAA } /* insuppuaa */, + { 1, 4970, 352, 16, 2, UNI_ebase_values_index } /* emojimodifierbase= */, + { 5, 1667, 2852, 4, 7, UNI_MAHJONG } /* blk=mahjong */, + { 0, 2391, 4659, 10, 9, UNI_CYRILLICEXTC } /* incyrillicextendedc */, + { 1, 2766, 625, 3, 2, UNI_PI } /* gc=pi */, + { 0, 2930, 2919, 3, 11, UNI_JT__L } /* jt=leftjoining */, + { 4, 309, 3349, 2, 15, UNI_INMEROITICCURSIVE } /* inmeroiticcursive */, + { 0, 7084, 0, 26, 0, UNI_ARABICPFB } /* inarabicpresentationformsb */, + { 0, 7011, 3526, 24, 12, UNI_CCC__0 } /* canonicalcombiningclass=notreordered */, + { 1, 5939, 934, 5, 2, -UNI__PERL_NCHAR } /* nchar=f */, + { 2, 1823, 909, 7, 4, UNI_BALI } /* script=bali */, + { 0, 1200, 6557, 3, 19, UNI_CJKCOMPATIDEOGRAPHSSUP } /* cjkcompatideographssup */, + { 2, 2494, 3639, 9, 9, UNI_GEORGIANEXT } /* isgeorgianextended */, + { 0, 2324, 6900, 6, 14, UNI_BYZANTINEMUSIC } /* block=byzantinemusic */, + { 1, 6816, 599, 25, 2, -UNI_CWKCF } /* changeswhennfkccasefolded=n */, + { 0, 5065, 2015, 13, 3, UNI_JG__MANICHAEANWAW } /* jg=manichaeanwaw */, + { 4, 5205, 1505, 11, 4, UNI_MYANMAREXTA } /* blk=myanmarexta */, + { 0, 3677, 204, 9, 2, UNI_LATINEXTF } /* islatinextf */, + { 0, 292, 295, 3, 2, UNI_NV__90 } /* nv=90 */, + { 0, 4360, 2609, 10, 10, UNI_LB__WJ } /* linebreak=wordjoiner */, + { 3, 5595, 585, 21, 2, UNI_CWT } /* changeswhentitlecased=t */, + { 3, 7011, 344, 24, 3, UNI_CCC__BL } /* canonicalcombiningclass=218 */, + { 0, 6165, 499, 3, 6, UNI_LYDI } /* sc=lydian */, + { 0, 461, 7537, 2, 27, UNI_ALPHABETICPF } /* isalphabeticpresentationforms */, + { 1, 4407, 353, 17, 4, UNI_RI } /* regionalindicator=yes */, + { 1, 461, 6332, 2, 19, UNI_JAMOEXTB } /* ishanguljamoextendedb */, + { 4, 309, 283, 2, 5, UNI_INNUSHU } /* innushu */, + { 0, 5274, 8575, 9, 26, UNI_DIACRITICALSSUP } /* combiningdiacriticalmarkssupplement */, + { 3, 2536, 1536, 3, 7, UNI_JG__THINYEH } /* jg=thinyeh */, + { 3, 8276, 4639, 6, 12, UNI_MISCMATHSYMBOLSB } /* inmiscmathsymbolsb */, + { 0, 1102, 67, 4, 4, UNI_CPRT } /* scx=cprt */, + { 0, 4424, 1191, 17, 4, UNI_BENG } /* scriptextensions=beng */, + { 1, 4424, 4951, 17, 4, UNI_EGYP } /* scriptextensions=egyp */, + { 1, 15, 4806, 2, 3, UNI_AGE__6 } /* age=6 */, + { 0, 1243, 1669, 4, 9, UNI_CJKEXTD } /* block=cjkextd */, + { 0, 510, 395, 5, 2, UNI_NV__3_SLASH_16 } /* nv=3/16 */, + { 1, 2732, 2705, 5, 13, UNI_ANCIENTSYMBOLS } /* blk=ancientsymbols */, + { 0, 1667, 6576, 5, 21, UNI_INDICNUMBERFORMS } /* blk=commonindicnumberforms */, + { 3, 6165, 4176, 3, 6, UNI_SC__HANG } /* sc=hangul */, + { 4, 1212, 0, 9, 0, UNI_QAAI } /* inherited */, + { 1, 3391, 342, 12, 3, UNI_NV__12 } /* numericvalue=12 */, + { 0, 1414, 0, 10, 0, UNI_BOXDRAWING } /* boxdrawing */, + { 1, 8246, 140, 24, 2, UNI_INPC__NA } /* indicpositionalcategory=na */, + { 0, 2, 6576, 1, 21, UNI_INDICNUMBERFORMS } /* commonindicnumberforms */, + { 1, 2503, 353, 11, 2, UNI_JOINC } /* joincontrol=y */, + { 1, 7404, 0, 11, 0, UNI_BC__R } /* bidiclass=r */, + { 8, 4424, 1098, 17, 4, UNI_NSHU } /* scriptextensions=nshu */, + { 1, 1667, 3026, 4, 14, UNI_INPSALTERPAHLAVI } /* blk=psalterpahlavi */, + { 15, 461, 1484, 2, 4, UNI_BUGI } /* isbugi */, + { 8, 298, 934, 2, 2, -UNI_RI } /* ri=f */, + { 1, 5065, 4741, 13, 5, UNI_JG__MANICHAEANALEPH } /* jg=manichaeanaleph */, + { 4, 1331, 0, 9, 0, UNI_PERM } /* oldpermic */, + { 3, 2766, 4150, 3, 5, UNI_P } /* gc=punct */, + { 4, 6618, 6629, 5, 13, UNI_INPC__BOTTOMANDLEFT } /* inpc=bottomandleft */, + { 5, 5216, 4770, 14, 10, UNI_LATINEXTADDITIONAL } /* block=latinextadditional */, + { 5, 1102, 454, 4, 4, UNI_PRTI } /* scx=prti */, + { 1, 271, 644, 2, 2, UNI_L } /* gc=l */, + { 2, 2503, 599, 11, 3, -UNI_JOINC } /* joincontrol=no */, + { 0, 1334, 0, 4, 0, UNI_PERM } /* perm */, + { 2, 7752, 4235, 23, 4, UNI_JG__MANICHAEANBETH } /* joininggroup=manichaeanbeth */, + { 1, 292, 3860, 2, 3, UNI_NV__70 } /* nv=70 */, + { 1, 461, 4176, 2, 15, UNI_INHANGUL } /* ishangulsyllables */, + { 3, 2324, 8142, 6, 32, UNI_IDEOGRAPHICSYMBOLS } /* block=ideographicsymbolsandpunctuation */, + { 12, 6427, 3743, 13, 3, UNI_JG__TAW } /* joininggroup=taw */, + { 0, 7198, 4150, 7, 11, UNI_SUPPUNCTUATION } /* blk=suppunctuation */, + { 0, 461, 673, 2, 5, UNI_OSGE } /* isosage */, + { 2, 3502, 0, 12, 0, UNI_INETHIOPIC } /* blk=ethiopic */, + { 1, 1823, 802, 7, 4, UNI_SARB } /* script=sarb */, + { 11, 3863, 1805, 14, 5, UNI_NV__800000 } /* numericvalue=800000 */, + { 0, 1272, 3611, 5, 6, UNI_CJKCOMPAT } /* iscjkcompat */, + { 0, 8601, 5909, 9, 7, UNI_SUPARROWSC } /* block=suparrowsc */, + { 0, 4360, 7110, 10, 13, UNI_LB__CM } /* linebreak=combiningmark */, + { 4, 339, 350, 4, 2, UNI_CCC__9 } /* ccc=vr */, + { 1, 13, 0, 2, 0, UNI_LM } /* lm */, + { 5, 8607, 0, 33, 0, UNI_SUPMATHOPERATORS } /* supplementalmathematicaloperators */, + { 2, 2, 8214, 1, 24, UNI_DIACRITICALS } /* combiningdiacriticalmarks */, + { 2, 4371, 933, 5, 7, -UNI_XPOSIXSPACE } /* wspace=false */, + { 0, 339, 430, 4, 2, UNI_CCC__7 } /* ccc=nk */, + { 0, 1424, 891, 7, 2, UNI_CCC__10 } /* ccc=ccc10 */, + { 2, 30, 6486, 1, 24, UNI_ZNAMENNYMUSIC } /* isznamennymusicalnotation */, + { 2, 6165, 63, 3, 4, UNI_SC__CPMN } /* sc=cpmn */, + { 0, 7648, 7011, 21, 5, UNI_DT__NONCANON } /* decompositiontype=noncanon */, + { 0, 6165, 1133, 3, 8, UNI_VITH } /* sc=vithkuqi */, + { 1, 6165, 1358, 3, 9, UNI_PALM } /* sc=palmyrene */, + { 2, 461, 7889, 2, 20, UNI_CJK } /* iscjkunifiedideographs */, + { 1, 5460, 599, 19, 2, -UNI_TERM } /* terminalpunctuation=n */, + { 0, 2324, 3908, 6, 16, UNI_TANGUTCOMPONENTS } /* block=tangutcomponents */, + { 0, 461, 2441, 2, 4, UNI_NAND } /* isnand */, + { 1, 7449, 3696, 18, 10, UNI_PHONETICEXTSUP } /* phoneticextensionssupplement */, + { 0, 6062, 6193, 12, 5, UNI_ETHIOPICSUP } /* block=ethiopicsup */, + { 2, 1102, 1191, 4, 4, UNI_BENG } /* scx=beng */, + { 2, 5205, 0, 11, 0, UNI_INMYANMAR } /* blk=myanmar */, + { 1, 461, 5448, 2, 3, UNI_PUA } /* ispua */, + { 3, 309, 4819, 2, 8, UNI_DINGBATS } /* indingbats */, + { 2, 461, 4896, 2, 4, UNI_BAMU } /* isbamu */, + { 0, 339, 348, 4, 2, UNI_CCC__91 } /* ccc=91 */, + { 0, 2766, 4002, 3, 14, UNI_SK } /* gc=modifiersymbol */, + { 0, 6165, 4951, 3, 19, UNI_EGYP } /* sc=egyptianhieroglyphs */, + { 0, 7537, 341, 9, 2, UNI_alpha_values_index } /* alphabetic= */, + { 4, 7669, 2382, 19, 9, UNI_GCB__V } /* hangulsyllabletype=voweljamo */, + { 1, 3514, 4511, 12, 9, UNI_ARABICEXTB } /* block=arabicextendedb */, + { 4, 339, 345, 4, 2, UNI_CCC__18 } /* ccc=18 */, + { 0, 5616, 585, 21, 5, UNI_CWU } /* changeswhenuppercased=true */, + { 0, 8601, 8386, 9, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* block=supsymbolsandpictographs */, + { 8, 7011, 3152, 24, 11, UNI_CCC__8 } /* canonicalcombiningclass=kanavoicing */, + { 0, 461, 2811, 2, 12, UNI_KHMERSYMBOLS } /* iskhmersymbols */, + { 0, 1823, 1322, 7, 9, UNI_ITAL } /* script=olditalic */, + { 0, 2280, 6262, 10, 3, UNI_IN__2_DOT_1 } /* presentin=2.1 */, + { 1, 6163, 6923, 14, 11, UNI_INSC__CONSONANTPLACEHOLDER } /* insc=consonantplaceholder */, + { 0, 3014, 290, 12, 2, UNI_IN__14 } /* presentin=v140 */, + { 1, 1823, 1015, 7, 4, UNI_SC__TELU } /* script=telu */, + { 0, 2718, 4472, 3, 15, UNI_BC__BN } /* bc=boundaryneutral */, + { 2, 1102, 3505, 3, 9, UNI_ETHI } /* scx=ethiopic */, + { 0, 4360, 5090, 9, 17, UNI_LB__CP } /* linebreak=closeparenthesis */, + { 1, 1272, 0, 5, 0, UNI_CJK } /* iscjk */, + { 6, 1011, 0, 2, 0, UNI_CI } /* ci */, + { 8, 517, 761, 4, 2, UNI_NV__7_SLASH_2 } /* nv=7/2 */, + { 1, 309, 581, 2, 2, UNI_IN__2 } /* in=2 */, + { 0, 461, 20, 2, 3, UNI_XPOSIXXDIGIT } /* ishex */, + { 0, 2811, 0, 5, 0, UNI_KHMR } /* khmer */, + { 3, 6165, 1562, 3, 4, UNI_NAGM } /* sc=nagm */, + { 1, 1102, 232, 4, 2, UNI_YI } /* scx=yi */, + { 2, 1102, 1358, 4, 4, UNI_PALM } /* scx=palm */, + { 0, 2732, 2312, 5, 12, UNI_AEGEANNUMBERS } /* blk=aegeannumbers */, + { 3, 461, 1285, 2, 9, UNI_SIND } /* iskhudawadi */, + { 1, 1396, 585, 8, 5, UNI_XIDS } /* xidstart=true */, + { 25, 3848, 1805, 14, 5, UNI_NV__700000 } /* numericvalue=700000 */, + { 0, 875, 934, 5, 2, -UNI_UIDEO } /* uideo=f */, + { 1, 2503, 0, 5, 0, UNI_JOINC } /* joinc */, + { 0, 6450, 1612, 14, 2, UNI_LB__LF } /* sentencebreak=lf */, + { 0, 1391, 3451, 3, 12, UNI_WB__EX } /* wb=extendnumlet */, + { 0, 2732, 1723, 10, 3, UNI_ARABICPFB } /* blk=arabicpfb */, + { 3, 634, 0, 7, 0, UNI_HANO } /* hanunoo */, + { 0, 2004, 3100, 5, 6, UNI_POSIXXDIGIT } /* posixxdigit */, + { 2, 6841, 598, 24, 4, -UNI_DI } /* defaultignorablecodepoint=no */, + { 0, 887, 2080, 5, 3, UNI_AGE__11 } /* age=11.0 */, + { 1, 7591, 2043, 3, 2, UNI_GCB__V } /* lb=jv */, + { 0, 6090, 2643, 7, 12, UNI_MISCTECHNICAL } /* block=misctechnical */, + { 5, 1823, 2780, 7, 6, UNI_SC__COPT } /* script=coptic */, + { 1, 1726, 0, 6, 0, UNI_ARAB } /* isarab */, + { 2, 4424, 6642, 17, 6, UNI_BRAH } /* scriptextensions=brahmi */, + { 0, 30, 8141, 1, 33, UNI_IDEOGRAPHICSYMBOLS } /* isideographicsymbolsandpunctuation */, + { 8, 461, 200, 2, 4, UNI_TAVT } /* istavt */, + { 10, 461, 5172, 2, 2, UNI_CASEDLETTER } /* isl_ */, + { 3, 3984, 599, 17, 3, -UNI_EPRES } /* emojipresentation=no */, + { 6, 7011, 8101, 24, 10, UNI_CCC__BR } /* canonicalcombiningclass=belowright */, + { 4, 5065, 4235, 13, 4, UNI_JG__MANICHAEANBETH } /* jg=manichaeanbeth */, + { 5, 895, 392, 5, 2, UNI_AGE__4_DOT_1 } /* age=v41 */, + { 3, 461, 1582, 2, 10, UNI_PHNX } /* isphoenician */, + { 0, 6062, 5820, 7, 18, UNI_ENCLOSEDALPHANUMSUP } /* block=enclosedalphanumsup */, + { 0, 3633, 4698, 6, 12, UNI_LATIN1 } /* inlatin1supplement */, + { 1, 430, 0, 4, 0, UNI_NKO } /* nkoo */, + { 0, 461, 152, 2, 4, UNI_OSGE } /* isosge */, + { 0, 461, 4150, 2, 11, UNI_P } /* ispunctuation */, + { 4, 552, 2656, 4, 3, UNI_AGE__5 } /* age=5.0 */, + { 14, 1823, 5682, 7, 5, UNI_SC__GREK } /* script=greek */, + { 1, 3040, 934, 13, 6, -UNI_QMARK } /* quotationmark=false */, + { 0, 2302, 934, 3, 2, -UNI_IDC } /* idc=f */, + { 2, 1396, 934, 4, 6, -UNI_XIDS } /* xids=false */, + { 7, 590, 6438, 2, 2, UNI_dep_values_index } /* dep= */, + { 1, 7591, 6, 3, 2, UNI_LB__CR } /* lb=cr */, + { 2, 5, 0, 3, 0, UNI_OCR } /* ocr */, + { 1, 461, 148, 2, 4, UNI_ORYA } /* isorya */, + { 1, 6427, 6714, 13, 21, UNI_JG__HANIFIROHINGYAKINNAYA } /* joininggroup=hanifirohingyakinnaya */, + { 3, 3021, 2117, 4, 2, UNI_IN__6_DOT_2 } /* in=v62 */, + { 1, 461, 1117, 2, 8, UNI_TAGB } /* istagbanwa */, + { 0, 4391, 0, 14, 0, UNI_NV__3 } /* numericvalue=3 */, + { 4, 1059, 1793, 4, 3, UNI_nfkdqc_values_index } /* nfkdqc= */, + { 1, 1385, 0, 4, 0, UNI_THAA } /* thaa */, + { 1, 1667, 1992, 4, 10, UNI_YIRADICALS } /* blk=yiradicals */, + { 0, 3677, 2619, 3, 12, UNI_LOWSURROGATES } /* islowsurrogates */, + { 1, 1102, 132, 4, 4, UNI_MTEI } /* scx=mtei */, + { 0, 1790, 353, 5, 2, UNI_NFCQC__Y } /* nfcqc=y */, + { 5, 4731, 8386, 12, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* supplementalsymbolsandpictographs */, + { 6, 3832, 1314, 14, 3, UNI_NV__5000 } /* numericvalue=5000 */, + { 3, 302, 934, 5, 2, -UNI__PERL_PATWS } /* patws=f */, + { 1, 1065, 0, 6, 0, UNI_NV__1_SLASH_3 } /* nv=1/3 */, + { 2, 461, 608, 2, 7, UNI_ELBA } /* iselbasan */, + { 0, 2766, 313, 3, 4, UNI_M } /* gc=mark */, + { 1, 461, 339, 2, 2, UNI_XPOSIXCNTRL } /* iscc */, + { 1, 406, 353, 2, 4, UNI_DI } /* di=yes */, + { 1, 3021, 2093, 4, 2, UNI_IN__5 } /* in=v50 */, + { 3, 8505, 590, 3, 2, UNI_XPOSIXDIGIT } /* nt=de */, + { 0, 461, 4016, 2, 14, UNI_ZS } /* isspaceseparator */, + { 0, 2766, 2424, 3, 2, UNI__PERL_SURROGATE } /* gc=cs */, + { 1, 2259, 216, 4, 2, UNI_TOTO } /* istoto */, + { 1, 461, 6586, 2, 11, UNI_NUMBERFORMS } /* isnumberforms */, + { 9, 1065, 760, 4, 3, UNI_NV__11_SLASH_2 } /* nv=11/2 */, + { 4, 6163, 7523, 14, 15, UNI_INSC__CONSONANTSUCCEEDINGREPHA } /* insc=consonantsucceedingrepha */, + { 3, 461, 3100, 2, 6, UNI_XPOSIXXDIGIT } /* isxdigit */, + { 1, 1667, 8153, 7, 21, UNI_CJKSYMBOLS } /* blk=cjksymbolsandpunctuation */, + { 2, 4424, 772, 17, 7, UNI_OLCK } /* scriptextensions=olchiki */, + { 4, 5895, 5149, 5, 7, UNI_SUPARROWSA } /* issuparrowsa */, + { 1, 6165, 3026, 3, 14, UNI_SC__PHLP } /* sc=psalterpahlavi */, + { 0, 1667, 7564, 4, 27, UNI_ANCIENTGREEKMUSIC } /* blk=ancientgreekmusicalnotation */, + { 2, 17, 415, 1, 3, UNI_HANO } /* hano */, + { 6, 1667, 1303, 4, 9, UNI_INNEWTAILUE } /* blk=newtailue */, + { 3, 461, 140, 2, 4, UNI_NARB } /* isnarb */, + { 12, 2324, 825, 6, 7, UNI_SHAW } /* block=shavian */, + { 0, 3514, 5676, 7, 18, UNI_ANCIENTGREEKNUMBERS } /* block=ancientgreeknumbers */, + { 0, 1823, 5391, 7, 4, UNI_CHER } /* script=cher */, + { 2, 6165, 951, 3, 4, UNI_SC__DUPL } /* sc=dupl */, + { 6, 461, 6776, 2, 14, UNI_MEETEIMAYEKEXT } /* ismeeteimayekext */, + { 0, 1102, 4951, 4, 4, UNI_EGYP } /* scx=egyp */, + { 0, 1726, 903, 4, 6, UNI_ARMN } /* isarmenian */, + { 3, 1667, 493, 4, 6, UNI_INKHOJKI } /* blk=khojki */, + { 3, 461, 2256, 2, 8, UNI_PHAISTOS } /* isphaistos */, + { 0, 309, 2411, 2, 11, UNI_KATAKANAEXT } /* inkatakanaext */, + { 0, 597, 1168, 3, 6, UNI_DT__MED } /* dt=medial */, + { 6, 1667, 6776, 4, 11, UNI_INMEETEIMAYEK } /* blk=meeteimayek */, + { 0, 4424, 414, 17, 4, UNI_HANO } /* scriptextensions=hano */, + { 0, 4584, 353, 18, 2, UNI_IDST } /* idstrinaryoperator=y */, + { 3, 1102, 2735, 3, 5, UNI_ARAB } /* scx=arab */, + { 0, 10, 7825, 1, 30, UNI_MATHALPHANUM } /* mathematicalalphanumericsymbols */, + { 1, 5979, 1626, 12, 9, UNI_VO__TU } /* vo=transformedupright */, + { 4, 312, 585, 5, 2, UNI_QMARK } /* qmark=t */, + { 1, 7591, 3760, 3, 13, UNI_LB__PR } /* lb=prefixnumeric */, + { 0, 4424, 725, 17, 7, UNI_KALI } /* scriptextensions=kayahli */, + { 0, 3677, 1037, 7, 4, UNI_LATINEXTB } /* islatinextb */, + { 1, 1667, 216, 4, 4, UNI_INTOTO } /* blk=toto */, + { 9, 1883, 599, 11, 2, -UNI_BIDIC } /* bidicontrol=n */, + { 5, 461, 1086, 2, 4, UNI_KTHI } /* iskthi */, + { 0, 1065, 4404, 4, 3, UNI_NV__13_SLASH_2 } /* nv=13/2 */, + { 0, 1823, 1117, 7, 4, UNI_SC__TAGB } /* script=tagb */, + { 5, 4391, 1805, 14, 5, UNI_NV__300000 } /* numericvalue=300000 */, + { 0, 4424, 2247, 17, 4, UNI_HUNG } /* scriptextensions=hung */, + { 1, 6076, 0, 14, 0, UNI_INGEORGIAN } /* block=georgian */, + { 0, 7669, 585, 18, 2, UNI_GCB__T } /* hangulsyllabletype=t */, + { 8, 5205, 2057, 5, 11, UNI_MATHALPHANUM } /* blk=mathalphanum */, + { 2, 10, 4636, 1, 15, UNI_MISCMATHSYMBOLSB } /* miscmathsymbolsb */, + { 4, 4043, 599, 17, 2, -UNI_IDSB } /* idsbinaryoperator=n */, + { 14, 6450, 592, 14, 2, UNI_SB__SE } /* sentencebreak=se */, + { 1, 3706, 3282, 7, 7, UNI_MN } /* nonspacingmark */, + { 5, 1391, 3053, 3, 11, UNI_WB__DQ } /* wb=doublequote */, + { 0, 1823, 4002, 7, 4, UNI_SC__MODI } /* script=modi */, + { 2, 461, 8667, 2, 18, UNI_CANS } /* iscanadianaboriginal */, + { 0, 2324, 673, 6, 5, UNI_INOSAGE } /* block=osage */, + { 2, 3263, 0, 13, 0, UNI_XPOSIXDIGIT } /* decimalnumber */, + { 1, 5799, 6965, 5, 22, UNI_SUPERANDSUB } /* insuperscriptsandsubscripts */, + { 0, 3892, 274, 16, 1, UNI_sterm_values_index } /* sentenceterminal= */, + { 0, 461, 2503, 2, 5, UNI_JOINC } /* isjoinc */, + { 1, 1391, 3456, 5, 7, UNI_WB__MB } /* wb=midnumlet */, + { 1, 2483, 585, 5, 5, UNI_CASED } /* cased=true */, + { 0, 5255, 341, 19, 2, UNI_extpict_values_index } /* extendedpictographic= */, + { 0, 1823, 2247, 7, 4, UNI_HUNG } /* script=hung */, + { 1, 53, 598, 1, 2, UNI_nt_values_index } /* nt= */, { 1, 814, 0, 4, 0, UNI_QAAI } /* zinh */, - { 0, 6944, 1155, 24, 2, UNI_CCC__35 } /* canonicalcombiningclass=35 */, - { 1, 313, 6069, 2, 22, UNI_DIACRITICALSFORSYMBOLS } /* indiacriticalsforsymbols */, - { 0, 1796, 1755, 7, 11, UNI_MEDF } /* script=medefaidrin */, - { 1, 3450, 0, 12, 0, UNI_INCYRILLIC } /* blk=cyrillic */, - { 1, 4355, 405, 17, 4, UNI_ARMN } /* scriptextensions=armn */, - { 0, 967, 972, 5, 3, UNI_GUJR } /* gujarati */, - { 0, 5607, 6486, 10, 7, UNI_identifierstatus_values_index } /* identifierstatus= */, - { 2, 1102, 360, 4, 6, UNI_CAKM } /* scx=chakma */, - { 1, 75, 602, 3, 3, -UNI_CWU } /* cwu=no */, - { 0, 374, 322, 2, 2, UNI_THAI } /* thai */, - { 3, 313, 5787, 2, 19, UNI_JAMOEXTA } /* inhanguljamoextendeda */, - { 2, 296, 6197, 2, 7, UNI_NV__100000 } /* nv=100000 */, - { 1, 2961, 0, 12, 0, UNI_nt_values_index } /* numerictype= */, - { 1, 3474, 1965, 6, 10, UNI_YIRADICALS } /* block=yiradicals */, - { 4, 464, 1951, 2, 4, UNI_SOGD } /* issogd */, - { 0, 520, 3777, 4, 2, UNI_NV__7_SLASH_8 } /* nv=7/8 */, - { 1, 8276, 5711, 22, 16, UNI_INSC__SYLLABLEMODIFIER } /* indicsyllabiccategory=syllablemodifier */, - { 0, 1977, 1082, 5, 4, UNI_POSIXWORD } /* posixword */, - { 2, 313, 728, 2, 7, UNI_KALI } /* inkayahli */, - { 0, 4355, 1255, 17, 4, UNI_SOYO } /* scriptextensions=soyo */, - { 16, 7527, 4247, 3, 14, UNI_LB__BK } /* lb=mandatorybreak */, - { 2, 895, 2066, 5, 2, UNI_AGE__5 } /* age=v50 */, - { 0, 6112, 5695, 5, 16, UNI_INSC__INVISIBLESTACKER } /* insc=invisiblestacker */, - { 9, 1796, 1470, 7, 8, UNI_SC__BUGI } /* script=buginese */, - { 4, 1102, 240, 4, 4, UNI_ZANB } /* scx=zanb */, - { 1, 14, 1052, 1, 7, UNI_MAHJ } /* mahajani */, - { 2, 2310, 933, 12, 3, -UNI_CI } /* caseignorable=f */, - { 0, 2253, 140, 10, 2, UNI_IN__NA } /* presentin=na */, - { 0, 524, 588, 6, 5, UNI_PATSYN } /* patsyn=true */, - { 0, 3474, 2771, 6, 5, UNI_INKHMER } /* block=khmer */, - { 3, 3543, 0, 16, 0, UNI_HIGHPUSURROGATES } /* highpusurrogates */, - { 12, 696, 4138, 3, 14, UNI_PS } /* isopenpunctuation */, - { 5, 5718, 356, 4, 4, UNI_EMOD } /* emod=yes */, - { 0, 581, 1300, 5, 2, UNI_WB__EB } /* ccc=200 */, - { 2, 464, 7660, 2, 28, UNI_VSSUP } /* isvariationselectorssupplement */, - { 2, 6944, 2138, 24, 2, UNI_CCC__33 } /* canonicalcombiningclass=33 */, - { 0, 719, 493, 5, 3, UNI_KANBUN } /* inkanbun */, - { 2, 3450, 8150, 5, 24, UNI_DIACRITICALS } /* blk=combiningdiacriticalmarks */, - { 10, 1015, 0, 6, 0, UNI_TELU } /* telugu */, - { 0, 313, 1144, 2, 9, UNI_INBHAIKSUKI } /* inbhaiksuki */, - { 1, 6114, 5806, 3, 9, UNI_SC__MONG } /* sc=mongolian */, - { 2, 2310, 933, 12, 7, -UNI_CI } /* caseignorable=false */, - { 4, 464, 691, 2, 5, UNI_BATK } /* isbatak */, - { 5, 3474, 1826, 6, 11, UNI_INSYLOTINAGRI } /* block=sylotinagri */, - { 0, 5990, 5020, 20, 3, UNI_BPT__C } /* bidipairedbrackettype=c */, - { 1, 1102, 3188, 4, 15, UNI_ARMI } /* scx=imperialaramaic */, - { 0, 4291, 10, 10, 2, UNI_LB__CR } /* linebreak=cr */, - { 0, 1529, 0, 10, 0, UNI_KHAR } /* kharoshthi */, - { 3, 2890, 1413, 2, 2, UNI_JT__C } /* jt=c */, - { 2, 1796, 1826, 7, 4, UNI_SC__SYLO } /* script=sylo */, - { 1, 7201, 4081, 16, 5, UNI_P } /* generalcategory=punct */, - { 1, 313, 197, 3, 3, UNI_TAGS } /* intags */, - { 0, 464, 6134, 2, 20, UNI_GLAGOLITICSUP } /* isglagoliticsupplement */, - { 2, 8533, 5858, 9, 7, UNI_SUPARROWSC } /* block=suparrowsc */, - { 0, 5565, 356, 21, 2, UNI_CWU } /* changeswhenuppercased=y */, - { 0, 7208, 6629, 9, 14, UNI_LM } /* category=modifierletter */, - { 2, 1879, 2018, 4, 12, UNI_INMASARAMGONDI } /* blk=masaramgondi */, - { 0, 1702, 8110, 8, 29, UNI_ARABICMATH } /* isarabicmathematicalalphabeticsymbols */, - { 0, 7201, 5174, 20, 12, UNI_PO } /* generalcategory=otherpunctuation */, - { 0, 2241, 0, 12, 0, UNI_PLAYINGCARDS } /* playingcards */, - { 7, 2496, 6666, 3, 21, UNI_JG__HANIFIROHINGYAKINNAYA } /* jg=hanifirohingyakinnaya */, - { 0, 58, 3093, 2, 5, UNI_SC__GEOR } /* sc=geor */, - { 3, 4355, 3381, 17, 15, UNI_NARB } /* scriptextensions=oldnortharabian */, - { 2, 343, 349, 4, 2, UNI_CCC__84 } /* ccc=84 */, - { 0, 3474, 1400, 6, 10, UNI_BOXDRAWING } /* block=boxdrawing */, - { 1, 3608, 0, 11, 0, UNI_PHONETICEXT } /* phoneticext */, - { 0, 296, 346, 2, 3, UNI_NV__11 } /* nv=11 */, - { 0, 1879, 1668, 4, 6, UNI_DOMINO } /* blk=domino */, - { 0, 464, 2401, 2, 4, UNI_NAND } /* isnand */, - { 4, 7431, 1153, 27, 2, UNI_CCC__24 } /* canonicalcombiningclass=ccc24 */, - { 2, 275, 647, 3, 2, UNI_GCB__L } /* gcb=l */, - { 0, 4355, 228, 17, 4, UNI_XPEO } /* scriptextensions=xpeo */, - { 0, 1796, 1125, 7, 8, UNI_TFNG } /* script=tifinagh */, - { 1, 7317, 4811, 10, 16, UNI_BC__S } /* bidiclass=segmentseparator */, - { 3, 6114, 1021, 3, 6, UNI_WCHO } /* sc=wancho */, - { 2, 6379, 481, 13, 3, UNI_JG__BEH } /* joininggroup=beh */, - { 0, 4355, 5389, 17, 20, UNI_HMNP } /* scriptextensions=nyiakengpuachuehmong */, - { 0, 6114, 728, 3, 7, UNI_SC__KALI } /* sc=kayahli */, - { 4, 1478, 5812, 7, 13, UNI_GEORGIANSUP } /* ingeorgiansupplement */, - { 2, 8250, 5887, 27, 3, UNI_CJKEXTC } /* cjkunifiedideographsextensionc */, - { 2, 3351, 350, 13, 2, UNI_NV__49 } /* numericvalue=49 */, - { 4, 296, 2157, 4, 8, UNI_NV__11_SLASH_12 } /* nv=9.167e-01 */, - { 0, 6112, 1168, 14, 6, UNI_INSC__CONSONANTMEDIAL } /* insc=consonantmedial */, - { 1, 6039, 1539, 7, 9, UNI_MISCARROWS } /* block=miscarrows */, - { 0, 34, 1596, 1, 11, UNI_SD } /* issoftdotted */, - { 0, 7825, 5183, 26, 4, UNI_CJKEXTE } /* cjkunifiedideographsextensione */, - { 0, 2392, 8307, 3, 33, UNI_MISCPICTOGRAPHS } /* inmiscellaneoussymbolsandpictographs */, - { 3, 2802, 5769, 3, 15, UNI_ENCLOSEDALPHANUM } /* isenclosedalphanum */, - { 0, 2692, 5625, 5, 18, UNI_ANCIENTGREEKNUMBERS } /* blk=ancientgreeknumbers */, - { 6, 6011, 5769, 7, 18, UNI_ENCLOSEDALPHANUMSUP } /* block=enclosedalphanumsup */, - { 0, 313, 2195, 2, 4, UNI_IN__6_DOT_2 } /* in=6.2 */, - { 1, 1102, 152, 4, 4, UNI_OSGE } /* scx=osge */, - { 5, 425, 0, 4, 0, UNI_LINA } /* lina */, - { 8, 464, 7068, 2, 26, UNI_PCM } /* isprependedconcatenationmark */, - { 0, 7688, 5376, 24, 6, UNI_JG__MANICHAEANTHAMEDH } /* joininggroup=manichaeanthamedh */, - { 4, 6039, 3719, 7, 15, UNI_MISCMATHSYMBOLSA } /* block=miscmathsymbolsa */, - { 0, 7527, 2951, 3, 2, UNI_LB__QU } /* lb=qu */, - { 0, 7201, 602, 15, 3, UNI_NO } /* generalcategory=no */, - { 1, 719, 0, 9, 0, UNI_INKANNADA } /* inkannada */, - { 1, 1614, 0, 4, 0, UNI_WARA } /* wara */, - { 2, 1102, 63, 4, 4, UNI_CHRS } /* scx=chrs */, - { 1, 832, 588, 5, 5, UNI_STERM } /* sterm=true */, - { 0, 1879, 651, 4, 5, UNI_INADLAM } /* blk=adlam */, - { 0, 7132, 5762, 16, 7, UNI_SUPARROWSB } /* blk=supplementalarrowsb */, - { 1, 581, 1304, 5, 2, UNI_CCC__B } /* ccc=220 */, - { 0, 2692, 7501, 5, 16, UNI_ANCIENTGREEKMUSIC } /* blk=ancientgreekmusic */, - { 1, 3474, 4656, 6, 16, UNI_TANGUTSUP } /* block=tangutsupplement */, - { 0, 464, 530, 2, 6, UNI_RJNG } /* isrejang */, - { 15, 4355, 63, 17, 4, UNI_CHRS } /* scriptextensions=chrs */, - { 0, 313, 2365, 2, 8, UNI_INETHIOPIC } /* inethiopic */, - { 2, 2726, 12, 3, 1, UNI_P } /* gc=p */, - { 0, 3060, 0, 6, 0, UNI_XPOSIXXDIGIT } /* xdigit */, - { 0, 7527, 2937, 3, 11, UNI_LB__IN } /* lb=inseperable */, - { 1, 313, 4793, 2, 4, UNI_RUMI } /* inrumi */, - { 0, 7823, 3929, 28, 4, UNI_CJKEXTG } /* incjkunifiedideographsextensiong */, - { 1, 7201, 2581, 16, 9, UNI__PERL_SURROGATE } /* generalcategory=surrogate */, - { 0, 4355, 1614, 17, 4, UNI_WARA } /* scriptextensions=wara */, - { 6, 24, 588, 3, 5, UNI_XPOSIXXDIGIT } /* hex=true */, - { 0, 2353, 1939, 3, 9, UNI_COMPATJAMO } /* incompatjamo */, - { 3, 3351, 0, 14, 0, UNI_NV__2 } /* numericvalue=2 */, - { 0, 7208, 117, 9, 2, UNI_XPOSIXDIGIT } /* category=nd */, - { 0, 1879, 951, 4, 8, UNI_INDUPLOYAN } /* blk=duployan */, - { 0, 464, 1470, 2, 8, UNI_BUGI } /* isbuginese */, - { 1, 2981, 294, 4, 2, UNI_IN__4 } /* in=v40 */, - { 0, 4355, 721, 17, 7, UNI_KNDA } /* scriptextensions=kannada */, - { 1, 59, 0, 4, 0, UNI_CHAM } /* cham */, - { 0, 464, 5340, 2, 18, UNI_DEVANAGARIEXT } /* isdevanagariextended */, - { 6, 1441, 588, 3, 5, UNI_DEP } /* dep=true */, - { 2, 3450, 5643, 5, 10, UNI_COUNTINGROD } /* blk=countingrod */, - { 6, 464, 477, 2, 4, UNI_VAI } /* isvaii */, - { 3, 676, 0, 5, 0, UNI_OSGE } /* osage */, - { 4, 6379, 484, 13, 3, UNI_JG__GAF } /* joininggroup=gaf */, - { 19, 2678, 7712, 3, 21, UNI_BC__PDI } /* bc=popdirectionalisolate */, - { 1, 4355, 1098, 17, 4, UNI_NSHU } /* scriptextensions=nshu */, - { 2, 34, 6438, 1, 14, UNI_ZNAMENNYMUSIC } /* isznamennymusic */, - { 3, 1516, 3582, 5, 3, UNI_KANGXI } /* iskangxi */, - { 0, 2496, 1522, 3, 7, UNI_JG__THINYEH } /* jg=thinyeh */, - { 0, 261, 356, 4, 2, UNI_CWCM } /* cwcm=y */, - { 0, 313, 4021, 2, 17, UNI_INDICSIYAQNUMBERS } /* inindicsiyaqnumbers */, - { 0, 1440, 0, 2, 0, UNI_SD } /* sd */, - { 3, 3351, 768, 13, 2, UNI_NV__45 } /* numericvalue=45 */, - { 0, 3474, 691, 6, 5, UNI_INBATAK } /* block=batak */, - { 0, 464, 3223, 2, 13, UNI_XPOSIXDIGIT } /* isdecimalnumber */, - { 4, 6114, 3285, 3, 6, UNI_HEBR } /* sc=hebrew */, - { 3, 844, 587, 2, 6, UNI_LOE } /* loe=true */, - { 5, 6799, 356, 24, 2, UNI_COMPEX } /* fullcompositionexclusion=y */, - { 0, 2353, 5797, 10, 9, UNI_CYRILLICEXTA } /* incyrillicextendeda */, - { 3, 3514, 0, 13, 0, UNI_ZL } /* lineseparator */, - { 17, 916, 355, 4, 2, UNI_ebase_values_index } /* ebase= */, - { 0, 464, 2401, 2, 11, UNI_NAND } /* isnandinagari */, - { 3, 3137, 934, 14, 2, UNI_EA__F } /* eastasianwidth=f */, - { 0, 2726, 5166, 3, 20, UNI_PC } /* gc=connectorpunctuation */, - { 1, 6114, 742, 3, 4, UNI_SC__MAND } /* sc=mand */, - { 0, 464, 3651, 2, 14, UNI_MN } /* isnonspacingmark */, - { 0, 1075, 6207, 4, 8, UNI_NV__1_SLASH_40 } /* nv=2.500e-02 */, - { 1, 2802, 5797, 10, 9, UNI_ETHIOPICEXTA } /* isethiopicextendeda */, - { 4, 343, 6280, 4, 4, UNI_WB__EB } /* ccc=atbl */, - { 4, 3474, 868, 6, 7, UNI_INTIRHUTA } /* block=tirhuta */, - { 1, 2253, 2056, 11, 2, UNI_IN__1_DOT_1 } /* presentin=1.1 */, - { 0, 1796, 3396, 7, 15, UNI_SARB } /* script=oldsoutharabian */, - { 6, 2726, 4533, 3, 18, UNI_PI } /* gc=initialpunctuation */, - { 4, 1065, 398, 5, 2, UNI_NV__1_SLASH_16 } /* nv=1/16 */, - { 3, 464, 160, 2, 4, UNI_PHLP } /* isphlp */, - { 0, 7201, 3236, 16, 13, UNI_ME } /* generalcategory=enclosingmark */, - { 7, 1879, 1125, 4, 8, UNI_INTIFINAGH } /* blk=tifinagh */, - { 0, 6402, 310, 14, 2, UNI_SB__SP } /* sentencebreak=sp */, - { 0, 6114, 814, 3, 4, UNI_SC__QAAI } /* sc=zinh */, - { 4, 4092, 356, 9, 4, UNI_DIA } /* diacritic=yes */, - { 0, 1887, 0, 8, 0, UNI_UCASEXTA } /* ucasexta */, - { 9, 5186, 6573, 19, 3, UNI_EXTPICT } /* extendedpictographic=t */, - { 0, 3593, 129, 13, 3, UNI_LATINEXTF } /* inlatinextendedf */, - { 0, 4291, 928, 9, 3, UNI_LB__OP } /* linebreak=op */, - { 0, 1796, 1117, 7, 8, UNI_SC__TAGB } /* script=tagbanwa */, - { 6, 1480, 3599, 7, 9, UNI_GEORGIANEXT } /* georgianextended */, - { 1, 6114, 1027, 3, 4, UNI_SC__YEZI } /* sc=yezi */, - { 1, 313, 854, 2, 7, UNI_INTAIVIET } /* intaiviet */, - { 0, 2275, 587, 9, 6, UNI_IDC } /* idcontinue=true */, - { 4, 3474, 1668, 6, 11, UNI_DOMINO } /* block=dominotiles */, - { 0, 6114, 5322, 3, 4, UNI_CHER } /* sc=cher */, - { 0, 4355, 4998, 16, 5, UNI_MANI } /* scriptextensions=mani */, - { 6, 520, 1300, 4, 3, UNI_NV__7000 } /* nv=7000 */, - { 0, 6570, 8440, 5, 14, UNI_INPC__BOTTOMANDRIGHT } /* inpc=bottomandright */, - { 4, 7823, 1037, 5, 4, UNI_CJKEXTB } /* incjkextb */, - { 20, 1382, 356, 8, 2, UNI_XIDS } /* xidstart=y */, - { 0, 1796, 5116, 7, 20, UNI_HLUW } /* script=anatolianhieroglyphs */, - { 4, 2355, 0, 8, 0, UNI_CYRL } /* cyrillic */, - { 0, 1102, 1216, 4, 4, UNI_KANA } /* scx=kana */, - { 0, 1102, 742, 4, 4, UNI_MAND } /* scx=mand */, - { 1, 7732, 0, 22, 0, UNI_ENCLOSEDIDEOGRAPHICSUP } /* enclosedideographicsup */, - { 1, 6114, 983, 3, 4, UNI_SC__HIRA } /* sc=hira */, - { 0, 4996, 4672, 13, 5, UNI_JG__MANICHAEANALEPH } /* jg=manichaeanaleph */, - { 0, 3474, 2018, 6, 12, UNI_INMASARAMGONDI } /* block=masaramgondi */, - { 0, 2496, 0, 3, 0, UNI_jg_values_index } /* jg= */, - { 1, 909, 0, 8, 0, UNI_BALI } /* balinese */, - { 0, 6944, 398, 24, 2, UNI_CCC__16 } /* canonicalcombiningclass=16 */, - { 35, 5990, 5021, 21, 6, UNI_BPT__C } /* bidipairedbrackettype=close */, - { 2, 2454, 2332, 3, 12, UNI_GREEKEXT } /* isgreekextended */, - { 8, 5136, 2591, 5, 12, UNI_MAYANNUMERALS } /* blk=mayannumerals */, - { 11, 1102, 6728, 4, 11, UNI_MTEI } /* scx=meeteimayek */, - { 5, 1065, 891, 5, 2, UNI_NV__1_SLASH_10 } /* nv=1/10 */, - { 0, 464, 4793, 2, 4, UNI_RUMI } /* isrumi */, - { 1, 8244, 5, 9, 4, UNI_CJKEXTG } /* block=cjkextg */, - { 22, 1796, 2220, 7, 4, UNI_HUNG } /* script=hung */, - { 1, 464, 1320, 2, 4, UNI_PERM } /* isperm */, - { 0, 844, 5620, 2, 3, -UNI_LOE } /* loe=n */, - { 1, 3622, 4629, 6, 2, UNI_LATIN1 } /* islatin1 */, - { 6, 4322, 2080, 14, 8, UNI_NV__7_SLASH_2 } /* numericvalue=3.500e+00 */, - { 13, 464, 473, 2, 4, UNI_TNSA } /* istnsa */, - { 0, 5, 5769, 1, 15, UNI_ENCLOSEDALPHANUM } /* enclosedalphanum */, - { 2, 257, 356, 4, 4, UNI_CWCF } /* cwcf=yes */, - { 7, 0, 4123, 1, 14, UNI_LOWERCASELETTER } /* lowercaseletter */, - { 1, 2310, 587, 12, 6, UNI_CI } /* caseignorable=true */, - { 1, 6114, 1015, 3, 6, UNI_SC__TELU } /* sc=telugu */, - { 2, 7823, 1646, 5, 4, UNI_CJKEXTD } /* incjkextd */, - { 1, 3748, 1303, 15, 2, UNI_NV__1_SLASH_32 } /* numericvalue=1/32 */, - { 0, 464, 2041, 2, 4, UNI_MEND } /* ismend */, - { 16, 464, 7020, 2, 24, UNI_ARABICPFB } /* isarabicpresentationformsb */, - { 1, 5565, 588, 21, 5, UNI_CWU } /* changeswhenuppercased=true */, - { 0, 756, 1768, 3, 9, UNI_NFCQC__M } /* nfkcqc=maybe */, - { 0, 464, 5949, 2, 6, UNI_YIJING } /* isyijing */, - { 1, 3641, 1262, 4, 3, UNI_SUPPUAB } /* suppuab */, - { 0, 1102, 1344, 4, 4, UNI_PALM } /* scx=palm */, - { 2, 6114, 2018, 3, 12, UNI_SC__GONM } /* sc=masaramgondi */, - { 12, 1965, 0, 10, 0, UNI_YIRADICALS } /* yiradicals */, - { 1, 1441, 602, 10, 3, -UNI_DEP } /* deprecated=no */, - { 2, 2726, 2290, 3, 6, UNI_N } /* gc=number */, - { 11, 383, 588, 6, 5, UNI_HYPHEN } /* hyphen=true */, - { 0, 3462, 623, 10, 5, UNI_ETHIOPICEXT } /* blk=ethiopicext */, - { 0, 6114, 102, 3, 4, UNI_HLUW } /* sc=hluw */, - { 3, 1879, 3641, 8, 10, UNI_KANASUP } /* blk=kanasupplement */, - { 16, 7208, 2986, 9, 2, UNI_PS } /* category=ps */, - { 12, 3309, 0, 4, 0, UNI_MERO } /* mero */, - { 0, 6379, 229, 13, 2, UNI_JG__PE } /* joininggroup=pe */, - { 5, 6185, 0, 22, 0, UNI_NV__100000000 } /* numericvalue=100000000 */, - { 0, 2483, 4081, 8, 5, UNI_XPOSIXPUNCT } /* isxposixpunct */, - { 5, 2726, 5174, 7, 12, UNI_PO } /* gc=otherpunctuation */, - { 1, 1879, 721, 4, 7, UNI_INKANNADA } /* blk=kannada */, - { 1, 464, 686, 2, 4, UNI_TAKR } /* istakr */, - { 1, 1879, 5631, 4, 5, UNI_INGREEK } /* blk=greek */, - { 1, 3474, 901, 6, 8, UNI_INARMENIAN } /* block=armenian */, - { 0, 1710, 1110, 3, 7, UNI_SPECIALS } /* isspecials */, - { 4, 3748, 1303, 15, 3, UNI_NV__1_SLASH_320 } /* numericvalue=1/320 */, - { 1, 4515, 934, 18, 6, -UNI_IDST } /* idstrinaryoperator=false */, - { 1, 1796, 3381, 7, 15, UNI_NARB } /* script=oldnortharabian */, - { 1, 7208, 844, 9, 2, UNI_LO } /* category=lo */, - { 0, 1702, 2760, 3, 11, UNI_ALPHABETICPF } /* isalphabeticpf */, - { 1, 6379, 713, 13, 4, UNI_JG__SHIN } /* joininggroup=shin */, - { 0, 644, 140, 4, 2, UNI_HST__NA } /* hst=na */, - { 0, 625, 601, 6, 3, -UNI_EXTPICT } /* extpict=n */, - { 3, 3474, 1927, 6, 12, UNI_INGUNJALAGONDI } /* block=gunjalagondi */, - { 0, 1539, 6528, 3, 21, UNI_INDICNUMBERFORMS } /* iscommonindicnumberforms */, - { 0, 1796, 128, 7, 4, UNI_MEDF } /* script=medf */, - { 9, 1065, 2080, 4, 8, UNI_NV__3_SLASH_2 } /* nv=1.500e+00 */, - { 6, 4433, 3704, 5, 15, UNI_LINEARBIDEOGRAMS } /* blk=linearbideograms */, - { 0, 6114, 1015, 3, 4, UNI_SC__TELU } /* sc=telu */, - { 1, 3462, 4442, 12, 9, UNI_ETHIOPICEXTB } /* blk=ethiopicextendedb */, - { 2, 313, 1033, 2, 4, UNI_JAMO } /* injamo */, - { 2, 6114, 94, 3, 4, UNI_SC__GUJR } /* sc=gujr */, - { 0, 756, 602, 6, 2, UNI_NFKCQC__N } /* nfkcqc=n */, - { 0, 313, 6728, 2, 11, UNI_INMEETEIMAYEK } /* inmeeteimayek */, - { 3, 1102, 4202, 4, 17, UNI_KITS } /* scx=khitansmallscript */, - { 0, 2355, 6142, 6, 5, UNI_CYRILLICSUP } /* cyrillicsup */, - { 8, 7208, 628, 9, 2, UNI_PI } /* category=pi */, - { 2, 4355, 496, 17, 4, UNI_KHOJ } /* scriptextensions=khoj */, - { 18, 7317, 5970, 21, 8, UNI_BC__LRO } /* bidiclass=lefttorightoverride */, - { 8, 1796, 3453, 6, 9, UNI_SC__CYRL } /* script=cyrillic */, - { 7, 5586, 703, 21, 2, UNI_WB__EB } /* graphemeclusterbreak=em */, - { 4, 6570, 3203, 5, 10, UNI_INPC__OVERSTRUCK } /* inpc=overstruck */, - { 5, 464, 4827, 2, 8, UNI_BAMUMSUP } /* isbamumsup */, - { 1, 6114, 1353, 3, 4, UNI_PAUC } /* sc=pauc */, - { 1, 1879, 6439, 4, 23, UNI_ZNAMENNYMUSIC } /* blk=znamennymusicalnotation */, - { 1, 5586, 285, 21, 2, UNI_GCB__XX } /* graphemeclusterbreak=xx */, - { 8, 1236, 1550, 5, 11, UNI_INOLDPERSIAN } /* block=oldpersian */, - { 0, 4291, 4338, 10, 17, UNI_RI } /* linebreak=regionalindicator */, - { 0, 1796, 1105, 6, 5, UNI_TALU } /* script=talu */, - { 6, 5186, 934, 20, 2, -UNI_EXTPICT } /* extendedpictographic=f */, - { 1, 464, 840, 2, 7, UNI_TGLG } /* istagalog */, - { 2, 959, 588, 8, 5, UNI_EXT } /* extender=true */, - { 57, 2678, 358, 3, 2, UNI_BC__ES } /* bc=es */, - { 5, 2802, 1037, 10, 4, UNI_ETHIOPICEXTB } /* isethiopicextb */, - { 0, 14, 1095, 1, 3, UNI_MERC } /* merc */, - { 0, 6114, 401, 3, 4, UNI_MIAO } /* sc=miao */, - { 0, 4322, 1300, 14, 3, UNI_NV__3000 } /* numericvalue=3000 */, - { 0, 1796, 3309, 7, 4, UNI_MERO } /* script=mero */, - { 3, 555, 2322, 4, 10, UNI_IN__NA } /* age=unassigned */, - { 3, 7201, 6466, 16, 10, UNI_CO } /* generalcategory=privateuse */, - { 1, 6114, 4827, 3, 4, UNI_BAMU } /* sc=bamu */, - { 0, 2712, 602, 5, 3, -UNI_EMOJI } /* emoji=no */, - { 7, 2193, 2067, 7, 5, UNI_NV__5_SLASH_8 } /* nv=6.250e-01 */, - { 0, 464, 4750, 2, 8, UNI_DINGBATS } /* isdingbats */, - { 0, 1796, 825, 7, 7, UNI_SHAW } /* script=shavian */, - { 0, 2232, 862, 3, 6, UNI_TIBT } /* istibetan */, - { 0, 7431, 1302, 28, 2, UNI_CCC__103 } /* canonicalcombiningclass=ccc103 */, - { 10, 1441, 602, 3, 3, -UNI_DEP } /* dep=no */, - { 1, 58, 3465, 2, 9, UNI_ETHI } /* sc=ethiopic */, - { 4, 3474, 5304, 6, 11, UNI_TAIXUANJING } /* block=taixuanjing */, - { 0, 1702, 0, 6, 0, UNI_ARAB } /* isarab */, - { 1, 296, 2066, 3, 2, UNI_NV__50 } /* nv=50 */, - { 1, 4122, 356, 5, 2, UNI_XPOSIXLOWER } /* lower=y */, - { 1, 1704, 4442, 6, 9, UNI_ARABICEXTB } /* arabicextendedb */, - { 1, 7201, 3722, 16, 10, UNI_SM } /* generalcategory=mathsymbol */, - { 0, 513, 6199, 4, 5, UNI_NV__300000 } /* nv=300000 */, - { 8, 1102, 1198, 4, 4, UNI_GRAN } /* scx=gran */, - { 2, 1102, 847, 4, 7, UNI_LANA } /* scx=taitham */, - { 0, 1879, 611, 4, 7, UNI_INELBASAN } /* blk=elbasan */, - { 2, 1879, 671, 4, 5, UNI_INOGHAM } /* blk=ogham */, - { 0, 555, 0, 4, 0, UNI_age_values_index } /* age= */, - { 2, 5409, 356, 19, 4, UNI_TERM } /* terminalpunctuation=yes */, - { 3, 8276, 5680, 23, 15, UNI_INSC__CANTILLATIONMARK } /* indicsyllabiccategory=cantillationmark */, - { 7, 8276, 5695, 22, 16, UNI_INSC__INVISIBLESTACKER } /* indicsyllabiccategory=invisiblestacker */, - { 7, 5, 601, 2, 2, UNI_ext_values_index } /* ext= */, - { 0, 2365, 1037, 8, 4, UNI_ETHIOPICEXTB } /* ethiopicextb */, - { 2, 1410, 347, 7, 3, UNI_CCC__118 } /* ccc=ccc118 */, - { 2, 1144, 0, 9, 0, UNI_BHKS } /* bhaiksuki */, - { 0, 929, 4081, 4, 11, UNI_PS } /* openpunctuation */, - { 1, 1879, 4998, 3, 11, UNI_INMANICHAEAN } /* blk=manichaean */, - { 6, 7201, 1413, 15, 3, UNI_XPOSIXCNTRL } /* generalcategory=cc */, - { 0, 2193, 2617, 4, 8, UNI_NV__3_SLASH_5 } /* nv=6.000e-01 */, - { 0, 4355, 1289, 17, 9, UNI_TALU } /* scriptextensions=newtailue */, - { 0, 7688, 4682, 23, 5, UNI_JG__MANICHAEANSADHE } /* joininggroup=manichaeansadhe */, - { 0, 1879, 8078, 4, 32, UNI_IDEOGRAPHICSYMBOLS } /* blk=ideographicsymbolsandpunctuation */, - { 0, 7431, 349, 27, 2, UNI_CCC__84 } /* canonicalcombiningclass=ccc84 */, - { 0, 7201, 7044, 16, 13, UNI_M } /* generalcategory=combiningmark */, - { 1, 1879, 1308, 4, 9, UNI_INOLDITALIC } /* blk=olditalic */, - { 8, 313, 120, 2, 3, UNI_INLAO } /* inlao */, - { 5, 2253, 2155, 9, 4, UNI_IN__4_DOT_1 } /* presentin=4.1 */, - { 0, 1102, 180, 4, 4, UNI_RUNR } /* scx=runr */, - { 0, 5787, 0, 10, 0, UNI_JAMO } /* hanguljamo */, - { 4, 1796, 861, 7, 7, UNI_TIBT } /* script=tibetan */, - { 1, 8244, 4611, 32, 4, UNI_CJKEXTF } /* block=cjkunifiedideographsextensionf */, - { 0, 296, 0, 5, 0, UNI_NV__90 } /* nv=90 */, - { 1, 4355, 27, 17, 4, UNI_AHOM } /* scriptextensions=ahom */, - { 9, 464, 4081, 2, 5, UNI_P } /* ispunct */, - { 1, 1888, 6781, 4, 9, UNI_CI } /* caseignorable */, - { 0, 464, 409, 2, 4, UNI_DIAK } /* isdiak */, - { 1, 4500, 602, 9, 3, -UNI_XPOSIXUPPER } /* uppercase=no */, - { 5469, 261, 588, 4, 5, UNI_CWCM } /* cwcm=true */, - { 0, 5748, 8550, 13, 22, UNI_SUPMATHOPERATORS } /* insupplementalmathematicaloperators */, - { 0, 1867, 588, 12, 2, UNI_BIDIM } /* bidimirrored=t */, - { 0, 1102, 1248, 4, 7, UNI_SIDD } /* scx=siddham */, - { 1, 1480, 0, 4, 0, UNI_GEOR } /* geor */, - { 0, 7208, 6276, 9, 6, UNI_CF } /* category=format */, - { 1, 464, 2220, 2, 4, UNI_HUNG } /* ishung */, - { 20, 1248, 0, 4, 0, UNI_SIDD } /* sidd */, - { 2, 3915, 602, 17, 3, -UNI_EPRES } /* emojipresentation=no */, - { 15, 1174, 3, 3, 1, UNI_EA__W } /* ea=w */, - { 0, 4355, 1133, 17, 8, UNI_VITH } /* scriptextensions=vithkuqi */, - { 9, 1102, 4827, 4, 4, UNI_BAMU } /* scx=bamu */, - { 0, 8533, 6052, 9, 13, UNI_SUPMATHOPERATORS } /* block=supmathoperators */, - { 4, 7132, 8319, 7, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* blk=supsymbolsandpictographs */, - { 0, 1539, 7908, 3, 29, UNI_CUNEIFORMNUMBERS } /* iscuneiformnumbersandpunctuation */, - { 0, 2692, 1141, 10, 3, UNI_ARABICPFA } /* blk=arabicpfa */, - { 12, 6239, 0, 14, 0, UNI_BC__L } /* bc=lefttoright */, - { 1, 4901, 934, 13, 6, -UNI_EMOD } /* emojimodifier=false */, - { 2, 3351, 2065, 13, 2, UNI_NV__25 } /* numericvalue=25 */, - { 2, 4355, 1105, 16, 5, UNI_TALU } /* scriptextensions=talu */, - { 0, 8276, 2344, 22, 5, UNI_INSC__VOWEL } /* indicsyllabiccategory=vowel */, - { 1, 7208, 3518, 9, 9, UNI_Z } /* category=separator */, - { 1, 2, 8499, 1, 34, UNI_DIACRITICALSSUP } /* combiningdiacriticalmarkssupplement */, - { 2, 464, 1133, 2, 4, UNI_VITH } /* isvith */, - { 1, 1796, 917, 7, 4, UNI_BASS } /* script=bass */, - { 2, 343, 2679, 2, 3, UNI_CCC__R } /* ccc=r */, - { 0, 8470, 588, 19, 3, UNI_VO__TR } /* verticalorientation=tr */, - { 3, 4355, 2217, 17, 12, UNI_HUNG } /* scriptextensions=oldhungarian */, - { 1, 343, 182, 4, 2, UNI_CCC__0 } /* ccc=nr */, - { 1, 513, 2137, 4, 8, UNI_NV__1_SLASH_3 } /* nv=3.333e-01 */, - { 1, 2443, 0, 5, 0, UNI_CASED } /* cased */, - { 1, 644, 1847, 7, 8, UNI_LB__H3 } /* hst=lvtsyllable */, - { 8, 1710, 3518, 7, 9, UNI_ZS } /* isspaceseparator */, - { 1, 5147, 5584, 17, 3, UNI_LATINEXTG } /* block=latinextendedg */, - { 1, 270, 356, 3, 2, UNI_CWT } /* cwt=y */, - { 2, 1102, 7377, 4, 8, UNI_KANA } /* scx=katakana */, - { 1, 8533, 0, 39, 0, UNI_SUPMATHOPERATORS } /* block=supplementalmathematicaloperators */, - { 8, 313, 6728, 2, 14, UNI_MEETEIMAYEKEXT } /* inmeeteimayekext */, - { 0, 1102, 425, 4, 4, UNI_LINA } /* scx=lina */, - { 1, 3000, 934, 13, 2, -UNI_QMARK } /* quotationmark=f */, - { 1, 1102, 880, 4, 7, UNI_ZZZZ } /* scx=unknown */, - { 5, 34, 1116, 1, 5, UNI_TAGB } /* istagb */, - { 0, 7527, 281, 3, 2, UNI_LB__H2 } /* lb=h2 */, - { 3, 536, 2729, 3, 5, UNI_SB__XX } /* sb=other */, - { 1, 34, 3884, 1, 18, UNI_AGHB } /* iscaucasianalbanian */, - { 8, 0, 4275, 1, 16, UNI_LETTERLIKESYMBOLS } /* letterlikesymbols */, - { 5, 5087, 655, 10, 2, UNI_WB__MB } /* wordbreak=mb */, - { 0, 1075, 0, 4, 0, UNI_NV__2 } /* nv=2 */, - { 3, 4355, 1371, 17, 4, UNI_THAA } /* scriptextensions=thaa */, - { 0, 8276, 4948, 22, 14, UNI_INSC__VOWELDEPENDENT } /* indicsyllabiccategory=voweldependent */, - { 0, 1102, 15, 4, 4, UNI_ADLM } /* scx=adlm */, - { 0, 2392, 2591, 3, 12, UNI_MAYANNUMERALS } /* inmayannumerals */, - { 0, 4355, 1308, 17, 9, UNI_ITAL } /* scriptextensions=olditalic */, - { 4, 5631, 0, 5, 0, UNI_GREK } /* greek */, - { 0, 6112, 0, 5, 0, UNI_insc_values_index } /* insc= */, - { 1, 5565, 602, 21, 3, -UNI_CWU } /* changeswhenuppercased=no */, - { 4, 464, 2297, 2, 13, UNI_BLOCKELEMENTS } /* isblockelements */, - { 2, 2275, 3361, 8, 3, UNI_idc_values_index } /* idcontinue= */, - { 0, 464, 1382, 2, 8, UNI_XIDS } /* isxidstart */, - { 3, 3748, 1071, 14, 4, UNI_NV__11_SLASH_12 } /* numericvalue=11/12 */, - { 5, 5147, 1491, 11, 4, UNI_LATINEXTA } /* block=latinexta */, - { 1, 2392, 1539, 3, 9, UNI_MISCARROWS } /* inmiscarrows */, - { 0, 1796, 975, 7, 8, UNI_SC__GURU } /* script=gurmukhi */, - { 0, 1410, 2065, 7, 2, UNI_CCC__25 } /* ccc=ccc25 */, - { 1, 2726, 3651, 3, 14, UNI_MN } /* gc=nonspacingmark */, - { 0, 464, 502, 2, 4, UNI_LYDI } /* islydi */, - { 2, 5136, 3324, 5, 14, UNI_MISCPICTOGRAPHS } /* blk=miscpictographs */, - { 10, 4450, 5797, 14, 9, UNI_CYRILLICEXTA } /* block=cyrillicextendeda */, - { 0, 555, 549, 4, 3, UNI_AGE__3 } /* age=3.0 */, - { 3, 6114, 1371, 3, 4, UNI_SC__THAA } /* sc=thaa */, - { 16, 464, 5166, 2, 20, UNI_PC } /* isconnectorpunctuation */, - { 0, 4355, 3453, 16, 9, UNI_CYRL } /* scriptextensions=cyrillic */, - { 1, 4355, 2695, 16, 5, UNI_ARAB } /* scriptextensions=arab */, - { 0, 3474, 575, 7, 6, UNI_INAVESTAN } /* block=avestan */, - { 0, 4962, 0, 14, 0, UNI_ROHG } /* hanifirohingya */, - { 0, 625, 934, 7, 6, -UNI_EXTPICT } /* extpict=false */, - { 6, 2812, 0, 7, 0, UNI_MAHJONG } /* mahjong */, - { 3, 1777, 6199, 8, 8, UNI_NV__1000000000000 } /* nv=1000000000000 */, - { 4, 1710, 4641, 3, 8, UNI_SYRIACSUP } /* issyriacsup */, - { 2, 248, 0, 4, 0, UNI_ZZZZ } /* zzzz */, - { 2, 34, 636, 1, 4, UNI_HAN } /* ishan */, - { 1, 2153, 0, 4, 0, UNI_NV__4 } /* nv=4 */, - { 4, 464, 4107, 2, 4, UNI_HANG } /* ishang */, - { 2, 1383, 934, 3, 6, -UNI_IDS } /* ids=false */, - { 3, 7605, 0, 19, 0, UNI_hst_values_index } /* hangulsyllabletype= */, - { 5, 1548, 3223, 3, 7, UNI_XPOSIXDIGIT } /* nt=decimal */, - { 0, 2260, 552, 3, 3, UNI_IN__4 } /* in=4.0 */, - { 2, 4355, 847, 17, 7, UNI_LANA } /* scriptextensions=taitham */, - { 4, 34, 7402, 1, 29, UNI_SUPPUAA } /* issupplementaryprivateuseareaa */, - { 64182, 6944, 522, 23, 2, UNI_CCC__7 } /* canonicalcombiningclass=7 */, - { 3, 464, 1951, 2, 7, UNI_SOGD } /* issogdian */, - { 2, 313, 1198, 2, 7, UNI_INGRANTHA } /* ingrantha */, - { 6, 7338, 1687, 21, 7, UNI_BC__RLI } /* bidiclass=righttoleftisolate */, - { 0, 5147, 5, 11, 4, UNI_LATINEXTG } /* block=latinextg */, - { 0, 5748, 7643, 13, 17, UNI_SUPPUAB } /* insupplementaryprivateuseareab */, - { 2, 581, 349, 5, 1, UNI_CCC__28 } /* ccc=28 */, - { 1, 2974, 2066, 11, 2, UNI_IN__5 } /* presentin=v50 */, - { 18, 2153, 2166, 5, 7, UNI_NV__3_SLASH_64 } /* nv=4.688e-02 */, - { 0, 8470, 1605, 29, 9, UNI_VO__TU } /* verticalorientation=transformedupright */, - { 4, 1102, 1098, 4, 4, UNI_NSHU } /* scx=nshu */, - { 0, 6402, 5021, 13, 3, UNI_SB__CL } /* sentencebreak=cl */, - { 1, 4291, 285, 10, 2, UNI_LB__XX } /* linebreak=xx */, - { 19, 1102, 4998, 3, 11, UNI_MANI } /* scx=manichaean */, - { 0, 2205, 6199, 4, 5, UNI_NV__800000 } /* nv=800000 */, - { 0, 313, 5340, 2, 18, UNI_DEVANAGARIEXT } /* indevanagariextended */, - { 0, 6185, 0, 19, 0, UNI_NV__100000 } /* numericvalue=100000 */, - { 0, 3474, 8078, 6, 18, UNI_IDEOGRAPHICSYMBOLS } /* block=ideographicsymbols */, - { 3, 1879, 4740, 4, 18, UNI_ORNAMENTALDINGBATS } /* blk=ornamentaldingbats */, - { 5, 2496, 2509, 3, 10, UNI_JG__DALATHRISH } /* jg=dalathrish */, - { 8, 3450, 6142, 10, 5, UNI_CYRILLICSUP } /* blk=cyrillicsup */, - { 0, 4355, 1003, 17, 4, UNI_LEPC } /* scriptextensions=lepc */, - { 5, 8289, 4007, 10, 13, UNI_SC } /* category=currencysymbol */, - { 46464, 296, 762, 3, 4, UNI_NV___MINUS_1_SLASH_2 } /* nv=-1/2 */, - { 5, 1377, 1592, 3, 2, UNI_WB__FO } /* wb=fo */, - { 3, 5886, 601, 20, 3, -UNI__PERL_NCHAR } /* noncharactercodepoint=n */, - { 0, 296, 1304, 3, 3, UNI_NV__200 } /* nv=200 */, - { 2, 6114, 224, 3, 4, UNI_WCHO } /* sc=wcho */, - { 0, 6944, 1157, 24, 5, UNI_CCC__7 } /* canonicalcombiningclass=nukta */, - { 1, 6402, 2928, 14, 3, UNI_SB__SE } /* sentencebreak=sep */, - { 0, 6114, 128, 3, 4, UNI_MEDF } /* sc=medf */, - { 1, 313, 1353, 2, 9, UNI_INPAUCINHAU } /* inpaucinhau */, - { 0, 313, 2207, 2, 2, UNI_IN__8 } /* in=8 */, - { 9, 3474, 3839, 6, 6, UNI_INTANGUT } /* block=tangut */, - { 0, 6114, 136, 3, 4, UNI_SC__MYMR } /* sc=mymr */, - { 11, 464, 409, 2, 3, UNI_DIA } /* isdia */, - { 1, 1102, 461, 4, 4, UNI_QAAI } /* scx=qaai */, - { 1, 1102, 35, 4, 4, UNI_AVST } /* scx=avst */, + { 1, 2280, 2083, 11, 2, UNI_IN__1_DOT_1 } /* presentin=1.1 */, + { 0, 605, 4439, 2, 2, UNI_ids_values_index } /* ids= */, + { 2, 2752, 274, 5, 1, UNI_emoji_values_index } /* emoji= */, + { 2, 7274, 4667, 9, 16, UNI_PE } /* category=closepunctuation */, + { 1, 1667, 120, 4, 3, UNI_INLAO } /* blk=lao */, + { 1, 309, 725, 2, 7, UNI_KALI } /* inkayahli */, + { 5, 5065, 5059, 13, 6, UNI_JG__MANICHAEANSAMEKH } /* jg=manichaeansamekh */, + { 0, 132, 0, 4, 0, UNI_MTEI } /* mtei */, + { 0, 1823, 590, 7, 7, UNI_DSRT } /* script=deseret */, + { 8, 2324, 901, 6, 8, UNI_INARMENIAN } /* block=armenian */, + { 0, 2324, 6185, 6, 13, UNI_GLAGOLITICSUP } /* block=glagoliticsup */, + { 16, 6090, 0, 13, 0, UNI_INMYANMAR } /* block=myanmar */, + { 0, 2324, 493, 6, 6, UNI_INKHOJKI } /* block=khojki */, + { 1, 461, 521, 2, 6, UNI_PATSYN } /* ispatsyn */, + { 3, 461, 8278, 2, 33, UNI_MISCMATHSYMBOLSB } /* ismiscellaneousmathematicalsymbolsb */, + { 3, 1823, 3349, 7, 4, UNI_MERO } /* script=mero */, + { 0, 7011, 5515, 24, 13, UNI_CCC__202 } /* canonicalcombiningclass=attachedbelow */, + { 2, 292, 0, 3, 0, UNI_nv_values_index } /* nv= */, + { 1, 30, 1302, 1, 10, UNI_INNEWTAILUE } /* innewtailue */, + { 3, 4424, 357, 17, 6, UNI_CAKM } /* scriptextensions=chakma */, + { 3, 2391, 1037, 10, 4, UNI_CYRILLICEXTB } /* incyrillicextb */, + { 3, 461, 369, 2, 6, UNI_GOTH } /* isgothic */, + { 8, 6427, 487, 13, 3, UNI_JG__REH } /* joininggroup=reh */, + { 0, 30, 7466, 1, 29, UNI_SUPPUAA } /* issupplementaryprivateuseareaa */, + { 0, 1102, 6776, 4, 11, UNI_MTEI } /* scx=meeteimayek */, + { 0, 2324, 5712, 6, 19, UNI_MERO } /* block=meroitichieroglyphs */, + { 1, 6165, 1385, 3, 4, UNI_SC__THAA } /* sc=thaa */, + { 17, 309, 5391, 2, 18, UNI_CHEROKEESUP } /* incherokeesupplement */, + { 1, 4941, 490, 9, 3, UNI_KANBUN } /* block=kanbun */, + { 0, 461, 917, 2, 8, UNI_BASS } /* isbassavah */, + { 1, 7495, 288, 27, 2, UNI_CCC__30 } /* canonicalcombiningclass=ccc30 */, + { 1, 7383, 6312, 10, 3, UNI_BC__PDI } /* bidiclass=pdi */, + { 2, 8142, 0, 32, 0, UNI_IDEOGRAPHICSYMBOLS } /* ideographicsymbolsandpunctuation */, + { 1, 4191, 934, 5, 6, -UNI_XPOSIXLOWER } /* lower=false */, + { 0, 2766, 3196, 6, 8, UNI_NO } /* gc=othernumber */, + { 0, 2324, 4651, 6, 16, UNI_BOPOMOFOEXT } /* block=bopomofoextended */, + { 8, 461, 1367, 2, 9, UNI_PAUC } /* ispaucinhau */, + { 0, 1102, 3692, 4, 4, UNI_LISU } /* scx=lisu */, + { 6, 1241, 0, 7, 0, UNI_NB } /* noblock */, + { 3, 3040, 585, 13, 2, UNI_QMARK } /* quotationmark=t */, + { 3, 6165, 1975, 3, 10, UNI_SOGO } /* sc=oldsogdian */, + { 6, 2494, 6945, 5, 12, UNI_GEOMETRICSHAPES } /* isgeometricshapes */, + { 2, 1734, 7304, 3, 24, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* issymbolsandpictographsexta */, + { 3, 4569, 0, 9, 0, UNI_XPOSIXUPPER } /* uppercase */, + { 2, 6165, 2068, 3, 12, UNI_MEND } /* sc=mendekikakui */, + { 0, 8, 0, 2, 0, UNI_PC } /* pc */, + { 1, 6165, 4740, 3, 4, UNI_SC__TALE } /* sc=tale */, + { 0, 2766, 6683, 6, 8, UNI_LO } /* gc=otherletter */, + { 1, 309, 5185, 2, 20, UNI_INANATOLIANHIEROGLYPHS } /* inanatolianhieroglyphs */, + { 1, 1823, 493, 7, 6, UNI_SC__KHOJ } /* script=khojki */, + { 13, 2483, 934, 5, 6, -UNI_CASED } /* cased=false */, + { 0, 6165, 1125, 3, 8, UNI_TFNG } /* sc=tifinagh */, + { 2, 1618, 599, 10, 2, -UNI_SD } /* softdotted=n */, + { 11, 6062, 6142, 7, 21, UNI_EARLYDYNASTICCUNEIFORM } /* block=earlydynasticcuneiform */, + { 8, 8278, 7632, 13, 16, UNI_MISCARROWS } /* miscellaneoussymbolsandarrows */, + { 3, 5553, 353, 21, 4, UNI_CWCM } /* changeswhencasemapped=yes */, + { 0, 15, 3402, 2, 3, UNI_AGE__2 } /* age=2 */, + { 7, 1667, 1812, 4, 11, UNI_INPAHAWHHMONG } /* blk=pahawhhmong */, + { 2, 2, 352, 1, 2, UNI_ce_values_index } /* ce= */, + { 7, 4043, 599, 4, 3, -UNI_IDSB } /* idsb=no */, + { 2, 4360, 880, 10, 7, UNI_LB__XX } /* linebreak=unknown */, + { 0, 6165, 1212, 3, 9, UNI_SC__QAAI } /* sc=inherited */, + { 3, 7274, 1611, 9, 2, UNI_LOWERCASELETTER } /* category=ll */, + { 2, 2009, 0, 6, 0, UNI_SYRC } /* syriac */, + { 5, 597, 3276, 3, 3, UNI_DT__ENC } /* dt=enc */, + { 0, 1667, 4161, 4, 12, UNI_DIACRITICALS } /* blk=diacriticals */, + { 0, 2536, 7342, 3, 14, UNI_JG__HAMZAONHEHGOAL } /* jg=tehmarbutagoal */, + { 1, 1726, 2800, 3, 11, UNI_ALPHABETICPF } /* isalphabeticpf */, + { 2, 1424, 3405, 7, 2, UNI_CCC__36 } /* ccc=ccc36 */, + { 6, 1823, 3421, 7, 15, UNI_NARB } /* script=oldnortharabian */, + { 3, 1823, 3908, 7, 6, UNI_TANG } /* script=tangut */, + { 1, 309, 1027, 2, 6, UNI_INYEZIDI } /* inyezidi */, + { 3, 309, 5958, 2, 21, UNI_SINHALAARCHAICNUMBERS } /* insinhalaarchaicnumbers */, + { 4, 7267, 330, 16, 2, UNI_PD } /* generalcategory=pd */, + { 12, 406, 274, 2, 1, UNI_di_values_index } /* di= */, + { 9, 1102, 634, 4, 7, UNI_HANO } /* scx=hanunoo */, + { 5, 7591, 21, 3, 2, UNI_LB__EX } /* lb=ex */, + { 6, 7944, 6554, 28, 4, UNI_CJKEXTC } /* iscjkunifiedideographsextensionc */, + { 1, 2852, 0, 7, 0, UNI_MAHJONG } /* mahjong */, + { 1, 693, 6683, 5, 8, UNI_LO } /* isotherletter */, + { 2, 1102, 5391, 4, 4, UNI_CHER } /* scx=cher */, + { 1, 818, 0, 7, 0, UNI_SHRD } /* sharada */, + { 6, 1823, 23, 7, 4, UNI_AHOM } /* script=ahom */, + { 1, 1396, 599, 4, 3, -UNI_XIDS } /* xids=no */, + { 0, 2842, 5820, 3, 18, UNI_ENCLOSEDALPHANUMSUP } /* isenclosedalphanumsup */, + { 0, 6427, 2566, 13, 3, UNI_JG__HEH } /* joininggroup=heh */, + { 0, 1823, 74, 7, 4, UNI_SC__CYRL } /* script=cyrl */, + { 0, 309, 7449, 2, 18, UNI_PHONETICEXT } /* inphoneticextensions */, + { 0, 3391, 1313, 13, 2, UNI_NV__60 } /* numericvalue=60 */, + { 0, 7011, 7239, 25, 2, UNI_CCC__AL } /* canonicalcombiningclass=228 */, + { 1, 292, 759, 3, 4, UNI_NV___MINUS_1_SLASH_2 } /* nv=-1/2 */, + { 0, 1734, 8001, 3, 29, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* issymbolsandpictographsextendeda */, + { 0, 6165, 1227, 3, 4, UNI_MAKA } /* sc=maka */, + { 2, 292, 761, 4, 2, UNI_NV__9_SLASH_2 } /* nv=9/2 */, + { 0, 71, 934, 3, 2, -UNI_CWU } /* cwu=f */, + { 5, 1667, 6986, 4, 25, UNI_SYMBOLSFORLEGACYCOMPUTING } /* blk=symbolsforlegacycomputing */, + { 5, 6165, 1592, 3, 4, UNI_SAUR } /* sc=saur */, + { 3, 1894, 274, 5, 1, UNI_bidim_values_index } /* bidim= */, + { 4, 1102, 814, 4, 4, UNI_QAAI } /* scx=zinh */, + { 2, 1102, 917, 4, 4, UNI_BASS } /* scx=bass */, + { 0, 1102, 1227, 4, 4, UNI_MAKA } /* scx=maka */, + { 1, 4731, 5149, 12, 7, UNI_SUPARROWSA } /* supplementalarrowsa */, + { 4, 1667, 4862, 4, 4, UNI_RUMI } /* blk=rumi */, + { 1, 1667, 653, 4, 5, UNI_INBUHID } /* blk=buhid */, + { 0, 5156, 3634, 10, 2, UNI_WB__NL } /* wordbreak=nl */, + { 9, 5769, 274, 4, 1, UNI_emod_values_index } /* emod= */, + { 4, 461, 120, 2, 3, UNI_LAO } /* islao */, + { 6, 6165, 1385, 3, 6, UNI_SC__THAA } /* sc=thaana */, + { 5, 5065, 4239, 13, 4, UNI_JG__MANICHAEANFIVE } /* jg=manichaeanfive */, + { 2, 6062, 0, 14, 0, UNI_INETHIOPIC } /* block=ethiopic */, + { 4, 292, 2100, 3, 2, UNI_NV__42 } /* nv=42 */, + { 0, 7889, 5252, 26, 4, UNI_CJKEXTE } /* cjkunifiedideographsextensione */, + { 0, 461, 312, 2, 5, UNI_QMARK } /* isqmark */, + { 0, 4941, 3696, 10, 10, UNI_KANASUP } /* block=kanasupplement */, + { 5, 7591, 4316, 3, 14, UNI_LB__BK } /* lb=mandatorybreak */, + { 3, 909, 0, 8, 0, UNI_BALI } /* balinese */, + { 0, 461, 1522, 2, 8, UNI_UGAR } /* isugaritic */, + { 0, 257, 599, 4, 2, -UNI_CWCM } /* cwcm=n */, + { 6, 552, 6262, 4, 3, UNI_AGE__2_DOT_1 } /* age=2.1 */, + { 0, 2324, 4176, 6, 15, UNI_INHANGUL } /* block=hangulsyllables */, + { 2, 1391, 1864, 3, 5, UNI_WB__EB } /* wb=ebase */, + { 0, 8343, 8522, 22, 16, UNI_INSC__VOWELINDEPENDENT } /* indicsyllabiccategory=vowelindependent */, + { 0, 292, 581, 2, 3, UNI_NV__22 } /* nv=22 */, + { 0, 5876, 0, 12, 0, UNI_SUNDANESESUP } /* sundanesesup */, + { 3, 1726, 1505, 8, 4, UNI_ARABICEXTA } /* isarabicexta */, + { 1, 461, 1978, 2, 7, UNI_SOGD } /* issogdian */, + { 1, 6163, 5746, 5, 16, UNI_INSC__INVISIBLESTACKER } /* insc=invisiblestacker */, + { 0, 21, 7915, 1, 20, UNI_ENCLOSEDALPHANUM } /* enclosedalphanumerics */, + { 3, 1424, 582, 7, 2, UNI_CCC__22 } /* ccc=ccc22 */, + { 2, 4502, 0, 13, 0, UNI_LATINEXTE } /* blk=latinexte */, + { 0, 1726, 649, 3, 4, UNI_ADLM } /* isadlam */, + { 0, 0, 4344, 1, 16, UNI_LETTERLIKESYMBOLS } /* letterlikesymbols */, + { 3, 1667, 1414, 4, 10, UNI_BOXDRAWING } /* blk=boxdrawing */, + { 2, 1823, 983, 7, 4, UNI_SC__HIRA } /* script=hira */, + { 3, 5156, 281, 10, 2, UNI_WB__XX } /* wordbreak=xx */, + { 0, 2393, 6193, 6, 5, UNI_CYRILLICSUP } /* cyrillicsup */, + { 0, 4424, 1117, 17, 8, UNI_TAGB } /* scriptextensions=tagbanwa */, + { 0, 4424, 283, 17, 5, UNI_NSHU } /* scriptextensions=nushu */, + { 0, 7591, 3337, 3, 12, UNI_LB__IS } /* lb=infixnumeric */, + { 0, 2842, 1037, 10, 4, UNI_ETHIOPICEXTB } /* isethiopicextb */, + { 8, 3021, 392, 4, 2, UNI_IN__4_DOT_1 } /* in=v41 */, + { 1, 5637, 585, 20, 2, UNI_GCB__T } /* graphemeclusterbreak=t */, + { 0, 292, 2093, 3, 2, UNI_NV__50 } /* nv=50 */, + { 0, 4424, 212, 17, 4, UNI_TIBT } /* scriptextensions=tibt */, + { 1, 2752, 585, 5, 2, UNI_EMOJI } /* emoji=t */, + { 0, 1198, 1922, 3, 11, UNI_CHESSSYMBOLS } /* inchesssymbols */, + { 4, 1102, 5031, 4, 14, UNI_ROHG } /* scx=hanifirohingya */, + { 6, 1906, 324, 8, 3, UNI_KANASUP } /* blk=kanasup */, + { 0, 8658, 0, 36, 0, UNI_UCAS } /* isunifiedcanadianaboriginalsyllabics */, + { 0, 461, 2852, 2, 4, UNI_MAHJ } /* ismahj */, + { 0, 823, 0, 4, 0, UNI_DASH } /* dash */, + { 1, 461, 4926, 2, 15, UNI_TAMILSUP } /* istamilsupplement */, + { 3, 4424, 27, 17, 4, UNI_ARMI } /* scriptextensions=armi */, + { 6, 3021, 1070, 4, 2, UNI_IN__3_DOT_1 } /* in=v31 */, + { 0, 461, 6154, 2, 9, UNI_XSUX } /* iscuneiform */, + { 1, 1102, 967, 4, 8, UNI_GUJR } /* scx=gujarati */, + { 2, 309, 2468, 2, 13, UNI_IPAEXT } /* inipaextensions */, + { 0, 8311, 3998, 32, 4, UNI_CJKEXTG } /* block=cjkunifiedideographsextensiong */, + { 2, 1102, 4651, 4, 8, UNI_BOPO } /* scx=bopomofo */, + { 0, 1455, 599, 3, 2, -UNI_DEP } /* dep=n */, + { 0, 1102, 2441, 4, 11, UNI_NAND } /* scx=nandinagari */, + { 0, 8538, 2720, 19, 2, UNI_VO__R } /* verticalorientation=r */, + { 0, 2324, 6400, 9, 18, UNI_CJKRADICALSSUP } /* block=cjkradicalssupplement */, + { 0, 461, 7796, 2, 29, UNI_ENCLOSEDIDEOGRAPHICSUP } /* isenclosedideographicsupplement */, + { 10, 240, 0, 4, 0, UNI_ZYYY } /* zyyy */, + { 0, 6165, 6185, 3, 10, UNI_SC__GLAG } /* sc=glagolitic */, + { 3, 6165, 571, 3, 7, UNI_AVST } /* sc=avestan */, + { 3, 7274, 4146, 9, 15, UNI_PD } /* category=dashpunctuation */, + { 2, 317, 5376, 3, 8, UNI_TAIXUANJING } /* taixuanjing */, + { 0, 461, 302, 2, 5, UNI__PERL_PATWS } /* ispatws */, + { 1, 940, 353, 6, 2, UNI_COMPEX } /* compex=y */, + { 0, 4502, 4698, 8, 5, UNI_LATIN1 } /* blk=latin1sup */, + { 4, 4360, 184, 10, 2, UNI_LB__SA } /* linebreak=sa */, + { 8, 1102, 200, 4, 4, UNI_TAVT } /* scx=tavt */, + { 0, 1065, 520, 5, 1, UNI_NV__1_SLASH_7 } /* nv=1/7 */, + { 10, 309, 297, 2, 5, UNI_INORIYA } /* inoriya */, + { 3, 510, 1318, 5, 2, UNI_NV__3_SLASH_20 } /* nv=3/20 */, + { 2, 1198, 8474, 5, 23, UNI_CJKCOMPATIDEOGRAPHS } /* incjkcompatibilityideographs */, + { 0, 461, 3436, 2, 15, UNI_SARB } /* isoldsoutharabian */, + { 2, 1894, 0, 5, 0, UNI_BIDIM } /* bidim */, + { 3, 2324, 499, 6, 6, UNI_INLYDIAN } /* block=lydian */, + { 1, 2287, 2155, 3, 3, UNI_IN__3_DOT_1 } /* in=3.1 */, + { 15, 1728, 6193, 4, 5, UNI_ARABICSUP } /* arabicsup */, + { 1, 5156, 700, 10, 2, UNI_WB__EB } /* wordbreak=em */, + { 1, 4424, 333, 17, 6, UNI_CARI } /* scriptextensions=carian */, + { 0, 461, 7356, 2, 27, UNI_OCR } /* isopticalcharacterrecognition */, + { 1, 1102, 5958, 4, 7, UNI_SINH } /* scx=sinhala */, + { 0, 461, 746, 2, 4, UNI_MARC } /* ismarc */, + { 2, 5553, 0, 21, 0, UNI_CWCM } /* changeswhencasemapped */, + { 0, 6487, 0, 13, 0, UNI_ZNAMENNYMUSIC } /* znamennymusic */, + { 0, 6427, 702, 13, 4, UNI_JG__NOON } /* joininggroup=noon */, + { 5, 1823, 184, 7, 4, UNI_SAMR } /* script=samr */, + { 0, 1894, 585, 12, 2, UNI_BIDIM } /* bidimirrored=t */, + { 3, 533, 2968, 3, 3, UNI_SB__SE } /* sb=sep */, + { 16, 1823, 6642, 7, 4, UNI_BRAH } /* script=brah */, + { 1, 4424, 653, 17, 5, UNI_BUHD } /* scriptextensions=buhid */, + { 0, 446, 0, 4, 0, UNI_PHLI } /* phli */, + { 0, 461, 50, 2, 2, UNI_MC } /* ismc */, + { 0, 292, 1313, 3, 4, UNI_NV__6000 } /* nv=6000 */, + { 0, 1667, 2256, 4, 12, UNI_PHAISTOS } /* blk=phaistosdisc */, + { 3, 7267, 4207, 17, 14, UNI_PS } /* generalcategory=openpunctuation */, + { 2, 7011, 393, 24, 2, UNI_CCC__15 } /* canonicalcombiningclass=15 */, + { 0, 4845, 584, 16, 6, UNI__PERL_PATWS } /* patternwhitespace=true */, + { 0, 6427, 3294, 13, 7, UNI_JG__SEMKATH } /* joininggroup=semkath */, + { 0, 461, 615, 2, 7, UNI_ELYM } /* iselymaic */, + { 5, 4424, 112, 17, 4, UNI_KITS } /* scriptextensions=kits */, + { 3, 2287, 2689, 3, 3, UNI_IN__6_DOT_1 } /* in=6.1 */, + { 13, 2842, 1183, 3, 8, UNI_EMOTICONS } /* isemoticons */, + { 1, 6163, 1168, 14, 6, UNI_INSC__CONSONANTMEDIAL } /* insc=consonantmedial */, + { 0, 895, 396, 5, 2, UNI_AGE__6_DOT_1 } /* age=v61 */, + { 1, 4191, 4196, 5, 10, UNI_LOWERCASELETTER } /* lowercaseletter */, + { 2, 3848, 2107, 14, 8, UNI_NV__15_SLASH_2 } /* numericvalue=7.500e+00 */, + { 2, 5156, 0, 10, 0, UNI_wb_values_index } /* wordbreak= */, + { 11, 5637, 1869, 21, 3, UNI_WB__EB } /* graphemeclusterbreak=gaz */, + { 24, 2259, 848, 3, 6, UNI_LANA } /* istaitham */, + { 4, 4424, 51, 17, 4, UNI_CANS } /* scriptextensions=cans */, + { 0, 2302, 3401, 8, 3, UNI_idc_values_index } /* idcontinue= */, + { 0, 309, 7855, 2, 32, UNI_INIDC } /* inideographicdescriptioncharacters */, + { 2, 461, 991, 2, 4, UNI_HATR } /* ishatr */, + { 1, 20, 353, 3, 2, UNI_XPOSIXXDIGIT } /* hex=y */, + { 7, 1667, 6400, 7, 18, UNI_CJKRADICALSSUP } /* blk=cjkradicalssupplement */, + { 1, 895, 343, 6, 1, UNI_IN__1_DOT_1 } /* age=v11 */, + { 0, 2434, 4511, 7, 9, UNI_MYANMAREXTB } /* myanmarextendedb */, + { 6, 5553, 585, 21, 2, UNI_CWCM } /* changeswhencasemapped=t */, + { 2, 8071, 3998, 30, 4, UNI_CJKEXTG } /* blk=cjkunifiedideographsextensiong */, + { 0, 339, 1432, 4, 6, UNI_CCC__9 } /* ccc=virama */, + { 0, 6165, 1376, 3, 9, UNI_SAMR } /* sc=samaritan */, + { 2, 1823, 772, 7, 7, UNI_OLCK } /* script=olchiki */, + { 4, 4424, 951, 17, 8, UNI_DUPL } /* scriptextensions=duployan */, + { 0, 5156, 6324, 10, 6, UNI_WB__FO } /* wordbreak=format */, + { 3, 6062, 7915, 7, 29, UNI_ENCLOSEDALPHANUMSUP } /* block=enclosedalphanumericsupplement */, + { 1, 4424, 5876, 17, 4, UNI_SUND } /* scriptextensions=sund */, + { 0, 339, 2101, 5, 2, UNI_CCC__129 } /* ccc=129 */, + { 0, 2324, 1241, 6, 7, UNI_NB } /* block=noblock */, + { 2, 2514, 1037, 9, 4, UNI_MYANMAREXTB } /* ismyanmarextb */, + { 6, 1801, 1805, 9, 7, UNI_NV__1000000000000 } /* nv=1000000000000 */, + { 5, 309, 3093, 2, 5, UNI_ASCII } /* inascii */, + { 0, 8343, 1432, 22, 6, UNI_INSC__VIRAMA } /* indicsyllabiccategory=virama */, + { 2, 4424, 683, 17, 4, UNI_TAKR } /* scriptextensions=takr */, + { 0, 1102, 466, 4, 4, UNI_SOGO } /* scx=sogo */, + { 0, 2324, 537, 6, 6, UNI_INTANGSA } /* block=tangsa */, + { 4, 4407, 0, 17, 0, UNI_RI } /* regionalindicator */, + { 1, 4424, 2046, 18, 11, UNI_GONM } /* scriptextensions=masaramgondi */, + { 3, 6427, 783, 13, 3, UNI_JG__NYA } /* joininggroup=nya */, + { 1, 4424, 3133, 16, 5, UNI_GEOR } /* scriptextensions=geor */, + { 0, 4424, 317, 17, 5, UNI_TALE } /* scriptextensions=taile */, + { 2, 1667, 868, 4, 7, UNI_INTIRHUTA } /* blk=tirhuta */, + { 0, 5156, 3456, 12, 7, UNI_WB__MB } /* wordbreak=midnumlet */, + { 0, 4424, 1954, 17, 12, UNI_GONG } /* scriptextensions=gunjalagondi */, + { 0, 7648, 1850, 18, 3, UNI_DT__SUB } /* decompositiontype=sub */, + { 0, 1667, 238, 4, 2, UNI_NB } /* blk=nb */, + { 1, 6450, 4569, 14, 5, UNI_SB__UP } /* sentencebreak=upper */, + { 0, 5574, 274, 21, 1, UNI_cwl_values_index } /* changeswhenlowercased= */, + { 0, 2208, 1072, 4, 3, UNI_NV__5_SLASH_12 } /* nv=5/12 */, + { 0, 30, 4826, 1, 19, UNI_ZP } /* isparagraphseparator */, + { 0, 32, 934, 2, 2, -UNI_VS } /* vs=f */, + { 1, 7214, 1317, 25, 2, UNI_CCC__132 } /* canonicalcombiningclass=132 */, + { 0, 695, 5243, 4, 12, UNI_PO } /* otherpunctuation */, + { 2, 1011, 353, 2, 4, UNI_CI } /* ci=yes */, + { 5, 1667, 3611, 7, 6, UNI_CJKCOMPAT } /* blk=cjkcompat */, + { 5, 688, 0, 5, 0, UNI_BATK } /* batak */, + { 0, 4043, 353, 4, 2, UNI_IDSB } /* idsb=y */, + { 6, 3177, 7036, 15, 9, UNI_EA__H } /* eastasianwidth=halfwidth */, + { 0, 4360, 0, 17, 0, UNI_LB__ZW } /* linebreak=zwspace */, + { 1, 1223, 1037, 4, 4, UNI_KANAEXTB } /* kanaextb */, + { 6, 1667, 739, 4, 7, UNI_INMANDAIC } /* blk=mandaic */, + { 0, 7804, 934, 11, 2, -UNI_IDEO } /* ideographic=f */, + { 1, 3514, 2800, 7, 11, UNI_ALPHABETICPF } /* block=alphabeticpf */, + { 1, 6870, 353, 20, 4, UNI_CE } /* compositionexclusion=yes */, + { 4, 7274, 3634, 9, 2, UNI_NL } /* category=nl */, + { 0, 2324, 4161, 6, 12, UNI_DIACRITICALS } /* block=diacriticals */, + { 2, 6165, 1349, 3, 9, UNI_SC__OUGR } /* sc=olduyghur */, + { 1, 461, 5031, 2, 4, UNI_HAN } /* ishani */, + { 0, 4371, 599, 6, 3, -UNI_XPOSIXSPACE } /* wspace=no */, + { 4, 4424, 5391, 17, 8, UNI_CHER } /* scriptextensions=cherokee */, + { 1, 6062, 6193, 12, 12, UNI_ETHIOPICSUP } /* block=ethiopicsupplement */, + { 0, 4569, 0, 15, 0, UNI_UPPERCASELETTER } /* uppercaseletter */, + { 0, 1667, 6357, 7, 13, UNI_CJKCOMPAT } /* blk=cjkcompatibility */, + { 1, 1478, 0, 2, 0, UNI_ZS } /* zs */, + { 8, 7267, 269, 16, 2, UNI_ZP } /* generalcategory=zp */, + { 2, 4161, 353, 9, 2, UNI_DIA } /* diacritic=y */, + { 1, 2, 274, 3, 1, UNI_cwl_values_index } /* cwl= */, + { 14, 1696, 1704, 8, 3, UNI_DOMINO } /* dominotiles */, + { 0, 6082, 0, 8, 0, UNI_GEOR } /* georgian */, + { 0, 6642, 0, 4, 0, UNI_BRAH } /* brah */, + { 2, 4424, 790, 17, 4, UNI_KALI } /* scriptextensions=kali */, + { 0, 461, 590, 2, 7, UNI_DSRT } /* isdeseret */, + { 2, 2324, 4725, 6, 9, UNI_TANGUTSUP } /* block=tangutsup */, + { 1, 2301, 599, 4, 3, -UNI_XIDC } /* xidc=no */, + { 1, 309, 144, 2, 4, UNI_INNEWA } /* innewa */, + { 3, 5916, 8553, 17, 5, UNI_loe_values_index } /* logicalorderexception= */, + { 0, 33, 5409, 1, 17, UNI_SMALLKANAEXT } /* smallkanaextension */, + { 1, 1174, 604, 3, 4, UNI_EA__W } /* ea=wide */, + { 1, 4424, 67, 17, 4, UNI_CPRT } /* scriptextensions=cprt */, + { 6, 8246, 4107, 30, 12, UNI_INPC__TOPANDLEFTANDRIGHT } /* indicpositionalcategory=topandleftandright */, + { 1, 1102, 1009, 4, 6, UNI_LYCI } /* scx=lycian */, + { 0, 875, 585, 5, 5, UNI_UIDEO } /* uideo=true */, + { 2, 271, 1864, 4, 5, UNI_WB__EB } /* gcb=ebase */, + { 0, 7267, 106, 16, 2, UNI_ZL } /* generalcategory=zl */, + { 0, 4424, 683, 17, 5, UNI_TAKR } /* scriptextensions=takri */, + { 0, 3724, 135, 4, 2, UNI_JG__MIM } /* jg=mim */, + { 8, 1065, 1071, 4, 4, UNI_NV__11_SLASH_12 } /* nv=11/12 */, + { 0, 1102, 172, 4, 4, UNI_RJNG } /* scx=rjng */, + { 4, 1454, 585, 2, 5, UNI_SD } /* sd=true */, + { 11, 521, 353, 6, 2, UNI_PATSYN } /* patsyn=y */, + { 0, 1397, 934, 3, 2, -UNI_IDS } /* ids=f */, + { 1, 1102, 136, 4, 4, UNI_MYMR } /* scx=mymr */, + { 7, 2752, 0, 5, 0, UNI_EMOJI } /* emoji */, + { 32394, 1102, 4089, 4, 4, UNI_SIND } /* scx=sind */, + { 1, 6427, 5031, 13, 16, UNI_JG__HANIFIROHINGYAPA } /* joininggroup=hanifirohingyapa */, + { 2, 2324, 5801, 6, 19, UNI_SUPARROWSB } /* block=supplementalarrowsb */, + { 3, 5637, 5769, 21, 9, UNI_WB__EB } /* graphemeclusterbreak=emodifier */, + { 1, 847, 0, 7, 0, UNI_LANA } /* taitham */, + { 2, 1391, 3634, 3, 2, UNI_WB__NL } /* wb=nl */, + { 3, 2523, 3100, 8, 6, UNI_XPOSIXXDIGIT } /* isxposixxdigit */, + { 1, 939, 585, 5, 2, UNI_ECOMP } /* ecomp=t */, + { 8, 533, 6, 3, 2, UNI_LB__CR } /* sb=cr */, + { 3, 1618, 353, 10, 2, UNI_SD } /* softdotted=y */, + { 4, 54, 6081, 2, 9, UNI_SC__GEOR } /* sc=georgian */, + { 0, 6816, 934, 25, 2, -UNI_CWKCF } /* changeswhennfkccasefolded=f */, + { 2, 461, 4150, 2, 5, UNI_P } /* ispunct */, + { 2, 4424, 983, 17, 8, UNI_HIRA } /* scriptextensions=hiragana */, + { 2, 7267, 3192, 16, 12, UNI_NL } /* generalcategory=letternumber */, + { 5, 1221, 1505, 6, 4, UNI_KANAEXTA } /* inkanaexta */, + { 7, 1994, 599, 7, 2, -UNI_RADICAL } /* radical=n */, + { 0, 6618, 2728, 20, 4, UNI_INPC__TOPANDBOTTOMANDLEFT } /* inpc=topandbottomandleft */, + { 3, 3848, 3846, 14, 2, UNI_NV__7_SLASH_8 } /* numericvalue=7/8 */, + { 1, 7495, 520, 28, 1, UNI_CCC__17 } /* canonicalcombiningclass=ccc17 */, + { 0, 2324, 6000, 6, 6, UNI_YIJING } /* block=yijing */, + { 6, 3633, 3773, 3, 15, UNI_LINEARBIDEOGRAMS } /* inlinearbideograms */, + { 0, 461, 4569, 2, 15, UNI_UPPERCASELETTER } /* isuppercaseletter */, + { 14, 196, 0, 4, 0, UNI_TAML } /* taml */, + { 0, 1823, 840, 7, 7, UNI_SC__TGLG } /* script=tagalog */, + { 3, 1823, 232, 7, 2, UNI_SC__YI } /* script=yi */, + { 0, 1102, 1325, 4, 4, UNI_ITAL } /* scx=ital */, + { 1, 3848, 1314, 14, 3, UNI_NV__7000 } /* numericvalue=7000 */, + { 1, 5065, 4746, 13, 5, UNI_JG__MANICHAEANGIMEL } /* jg=manichaeangimel */, + { 9, 6165, 220, 3, 4, UNI_WCHO } /* sc=wcho */, + { 19, 7495, 3405, 27, 2, UNI_CCC__36 } /* canonicalcombiningclass=ccc36 */, + { 1, 309, 6464, 2, 23, UNI_SHORTHANDFORMATCONTROLS } /* inshorthandformatcontrols */, { 0, 0, 1036, 1, 2, UNI_LOE } /* loe */, - { 8, 4355, 98, 17, 4, UNI_GURU } /* scriptextensions=guru */, - { 18, 2474, 4442, 9, 9, UNI_MYANMAREXTB } /* ismyanmarextendedb */, - { 3, 1033, 0, 8, 0, UNI_JAMOEXTB } /* jamoextb */, - { 1, 7431, 292, 28, 2, UNI_CCC__130 } /* canonicalcombiningclass=ccc130 */, - { 1, 6114, 1133, 3, 8, UNI_VITH } /* sc=vithkuqi */, - { 8, 625, 601, 6, 2, UNI_extpict_values_index } /* extpict= */, - { 1, 1395, 6890, 5, 9, UNI_LATINEXTE } /* latinextendede */, - { 1, 426, 4918, 3, 9, UNI_ALCHEMICAL } /* inalchemical */, - { 6, 1241, 0, 7, 0, UNI_PHAG } /* phagspa */, - { 0, 555, 2172, 4, 3, UNI_AGE__2 } /* age=2.0 */, - { 0, 313, 5825, 2, 9, UNI_INSUNDANESE } /* insundanese */, - { 1, 343, 8139, 4, 11, UNI_CCC__DB } /* ccc=doublebelow */, - { 0, 6025, 0, 14, 0, UNI_INGEORGIAN } /* block=georgian */, - { 5, 328, 8319, 3, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* supsymbolsandpictographs */, - { 3, 1856, 602, 11, 3, -UNI_BIDIC } /* bidicontrol=no */, - { 3, 2454, 2332, 3, 7, UNI_GREEKEXT } /* isgreekext */, - { 0, 6112, 6594, 5, 19, UNI_INSC__BRAHMIJOININGNUMBER } /* insc=brahmijoiningnumber */, - { 2, 6799, 0, 24, 0, UNI_COMPEX } /* fullcompositionexclusion */, - { 8, 5322, 5329, 7, 4, UNI_CHEROKEESUP } /* cherokeesup */, - { 16, 513, 3807, 5, 2, UNI_NV__3_SLASH_80 } /* nv=3/80 */, - { 0, 925, 5021, 3, 6, UNI_BPT__C } /* bpt=close */, - { 2, 4291, 4233, 10, 14, UNI_LB__SA } /* linebreak=complexcontext */, - { 12, 7182, 8089, 3, 21, UNI_CJKSYMBOLS } /* cjksymbolsandpunctuation */, - { 4, 5340, 0, 13, 0, UNI_DEVANAGARIEXT } /* devanagariext */, - { 1, 3474, 8592, 6, 42, UNI_UCASEXT } /* block=unifiedcanadianaboriginalsyllabicsextended */, - { 0, 6114, 983, 3, 8, UNI_SC__HIRA } /* sc=hiragana */, - { 1, 275, 3423, 4, 12, UNI_WB__EB } /* gcb=glueafterzwj */, - { 0, 343, 1153, 4, 2, UNI_CCC__24 } /* ccc=24 */, - { 3, 3351, 7171, 12, 3, UNI_NV__12 } /* numericvalue=12 */, - { 0, 6944, 298, 23, 2, UNI_CCC__9 } /* canonicalcombiningclass=9 */, - { 2, 313, 584, 2, 2, UNI_IN__2 } /* in=2 */, - { 4, 3991, 0, 7, 0, UNI_BRAI } /* braille */, - { 0, 1383, 0, 3, 0, UNI_IDS } /* ids */, - { 10, 1991, 2879, 12, 11, UNI_JT__L } /* joiningtype=leftjoining */, - { 11, 313, 4827, 2, 5, UNI_INBAMUM } /* inbamum */, - { 1, 4355, 1220, 17, 7, UNI_MAKA } /* scriptextensions=makasar */, - { 2, 6114, 413, 3, 4, UNI_SC__GONM } /* sc=gonm */, - { 3, 2181, 1781, 4, 4, UNI_NV__50000 } /* nv=50000 */, - { 9, 5748, 4388, 4, 15, UNI_SUTTONSIGNWRITING } /* insuttonsignwriting */, - { 1, 4515, 356, 18, 2, UNI_IDST } /* idstrinaryoperator=y */, - { 0, 6114, 661, 3, 5, UNI_SC__DOGR } /* sc=dogra */, - { 0, 8592, 0, 43, 0, UNI_UCASEXTA } /* unifiedcanadianaboriginalsyllabicsextendeda */, - { 8, 2496, 118, 3, 3, UNI_JG__DAL } /* jg=dal */, - { 0, 464, 405, 2, 4, UNI_ARMN } /* isarmn */, - { 2, 464, 1317, 2, 9, UNI_PERM } /* isoldpermic */, - { 0, 6114, 1220, 3, 7, UNI_MAKA } /* sc=makasar */, - { 0, 2678, 143, 3, 2, UNI_BC__BN } /* bc=bn */, - { 1, 5544, 602, 21, 2, -UNI_CWT } /* changeswhentitlecased=n */, - { 5, 6687, 135, 14, 2, UNI_JG__MIM } /* joininggroup=mim */, - { 3, 2496, 1046, 3, 5, UNI_JG__KHAPH } /* jg=khaph */, - { 7, 4783, 0, 10, 0, UNI_XPOSIXSPACE } /* whitespace */, - { 1, 833, 934, 4, 2, -UNI_TERM } /* term=f */, - { 1, 6114, 90, 3, 4, UNI_SC__GREK } /* sc=grek */, - { 0, 1796, 637, 7, 7, UNI_SC__HANO } /* script=hanunoo */, - { 1, 6944, 4947, 24, 2, UNI_CCC__8 } /* canonicalcombiningclass=kv */, - { 1, 8007, 6352, 7, 11, UNI_CJKRADICALSSUP } /* blk=cjkradicalssup */, - { 0, 7317, 4418, 10, 15, UNI_BC__CS } /* bidiclass=commonseparator */, - { 1, 2474, 1052, 3, 7, UNI_MAHJ } /* ismahajani */, - { 1, 3474, 5806, 6, 9, UNI_INMONGOLIAN } /* block=mongolian */, - { 1, 6114, 473, 3, 4, UNI_TNSA } /* sc=tnsa */, - { 1, 3748, 769, 14, 3, UNI_NV__15_SLASH_2 } /* numericvalue=15/2 */, - { 0, 409, 602, 2, 3, -UNI_DI } /* di=no */, - { 0, 313, 2155, 2, 2, UNI_IN__4 } /* in=4 */, - { 3, 1236, 4998, 5, 11, UNI_INMANICHAEAN } /* block=manichaean */, - { 2, 6728, 0, 14, 0, UNI_MEETEIMAYEKEXT } /* meeteimayekext */, - { 0, 313, 1021, 2, 6, UNI_INWANCHO } /* inwancho */, - { 0, 1441, 278, 10, 1, UNI_dep_values_index } /* deprecated= */, - { 20, 6944, 3101, 24, 11, UNI_CCC__DA } /* canonicalcombiningclass=doubleabove */, - { 0, 1879, 5949, 4, 6, UNI_YIJING } /* blk=yijing */, - { 0, 4291, 3432, 10, 3, UNI_LB__ZWJ } /* linebreak=zwj */, - { 2, 7660, 602, 17, 3, -UNI_VS } /* variationselector=no */, - { 0, 1879, 1033, 4, 4, UNI_JAMO } /* blk=jamo */, - { 2, 1710, 6623, 3, 21, UNI_MODIFIERLETTERS } /* isspacingmodifierletters */, - { 0, 409, 602, 2, 2, -UNI_DI } /* di=n */, - { 0, 4291, 2569, 10, 10, UNI_LB__WJ } /* linebreak=wordjoiner */, - { 0, 1915, 5620, 11, 3, -UNI_GRBASE } /* graphemebase=n */, - { 1, 1856, 345, 4, 2, UNI_bidic_values_index } /* bidic= */, - { 0, 464, 24, 2, 3, UNI_XPOSIXXDIGIT } /* ishex */, - { 5, 7527, 1837, 3, 5, UNI_EBASE } /* lb=ebase */, - { 3, 3474, 1255, 6, 7, UNI_INSOYOMBO } /* block=soyombo */, - { 0, 378, 356, 5, 4, UNI_GREXT } /* grext=yes */, - { 0, 3137, 1906, 15, 9, UNI_EA__A } /* eastasianwidth=ambiguous */, - { 0, 6114, 4202, 3, 17, UNI_KITS } /* sc=khitansmallscript */, - { 0, 4355, 1191, 17, 7, UNI_BENG } /* scriptextensions=bengali */, - { 3, 296, 2071, 3, 9, UNI_NV__1_SLASH_7 } /* nv=1.429e-01 */, - { 1, 6114, 86, 3, 4, UNI_SC__GONG } /* sc=gong */, - { 1, 7880, 8089, 5, 21, UNI_CJKSYMBOLS } /* iscjksymbolsandpunctuation */, - { 9, 313, 3637, 2, 14, UNI_LISUSUP } /* inlisusupplement */, - { 1, 1796, 1308, 7, 9, UNI_ITAL } /* script=olditalic */, - { 3, 600, 607, 3, 4, UNI_EA__F } /* dt=wide */, - { 2, 313, 7044, 2, 24, UNI_DIACRITICALSFORSYMBOLS } /* incombiningmarksforsymbols */, - { 0, 1033, 0, 4, 0, UNI_JAMO } /* jamo */, - { 3, 6379, 4682, 13, 3, UNI_JG__SAD } /* joininggroup=sad */, - { 4, 313, 4999, 2, 10, UNI_INMANICHAEAN } /* inmanichaean */, - { 1, 1377, 285, 3, 2, UNI_WB__XX } /* wb=xx */, - { 1, 313, 6919, 2, 25, UNI_SYMBOLSFORLEGACYCOMPUTING } /* insymbolsforlegacycomputing */, - { 2, 895, 1304, 5, 2, UNI_AGE__2 } /* age=v20 */, - { 4, 5409, 934, 19, 6, -UNI_TERM } /* terminalpunctuation=false */, - { 0, 7385, 0, 18, 0, UNI_PHONETICEXT } /* phoneticextensions */, - { 0, 7584, 3571, 18, 6, UNI_DT__COM } /* decompositiontype=compat */, - { 1, 464, 2275, 2, 10, UNI_IDC } /* isidcontinue */, - { 20, 2, 934, 3, 2, -UNI_CWL } /* cwl=f */, - { 4, 7208, 5103, 9, 2, UNI_CASEDLETTER } /* category=l_ */, - { 0, 6114, 200, 3, 4, UNI_SC__TAML } /* sc=taml */, - { 1, 2253, 563, 10, 3, UNI_IN__7 } /* presentin=7.0 */, - { 0, 7208, 3151, 8, 13, UNI_NL } /* category=letternumber */, - { 0, 1382, 602, 4, 3, -UNI_XIDS } /* xids=no */, - { 0, 3779, 1781, 14, 4, UNI_NV__70000 } /* numericvalue=70000 */, - { 0, 5409, 0, 19, 0, UNI_TERM } /* terminalpunctuation */, - { 5, 3462, 6142, 10, 12, UNI_ETHIOPICSUP } /* blk=ethiopicsupplement */, - { 1, 2678, 3066, 3, 12, UNI_BC__AL } /* bc=arabicletter */, - { 2, 1102, 502, 4, 6, UNI_LYDI } /* scx=lydian */, - { 0, 8533, 7643, 17, 17, UNI_SUPPUAB } /* block=supplementaryprivateuseareab */, - { 0, 12, 0, 1, 0, UNI_P } /* p */, - { 3, 8007, 1037, 7, 4, UNI_CJKEXTB } /* blk=cjkextb */, - { 0, 940, 588, 6, 5, UNI_COMPEX } /* compex=true */, - { 0, 1879, 5205, 4, 18, UNI_HALFMARKS } /* blk=combininghalfmarks */, - { 2, 6944, 771, 24, 2, UNI_CCC__21 } /* canonicalcombiningclass=21 */, - { 2, 7527, 4235, 5, 12, UNI_LB__SA } /* lb=complexcontext */, - { 0, 1441, 356, 3, 2, UNI_DEP } /* dep=y */, - { 3, 4338, 602, 17, 2, -UNI_RI } /* regionalindicator=n */, - { 0, 1879, 7473, 4, 27, UNI_ALPHABETICPF } /* blk=alphabeticpresentationforms */, - { 2, 2726, 3518, 3, 9, UNI_Z } /* gc=separator */, - { 15, 1102, 666, 4, 5, UNI_LIMB } /* scx=limbu */, - { 4, 6114, 132, 3, 4, UNI_MTEI } /* sc=mtei */, - { 1, 4996, 1988, 13, 3, UNI_JG__MANICHAEANWAW } /* jg=manichaeanwaw */, - { 0, 1383, 602, 3, 3, -UNI_IDS } /* ids=no */, - { 9, 4355, 5116, 17, 20, UNI_HLUW } /* scriptextensions=anatolianhieroglyphs */, - { 0, 313, 7385, 2, 18, UNI_PHONETICEXT } /* inphoneticextensions */, - { 1, 1102, 1982, 4, 6, UNI_SYRC } /* scx=syriac */, - { 2, 1796, 3498, 7, 7, UNI_SC__CPRT } /* script=cypriot */, - { 1, 3823, 588, 16, 5, UNI_STERM } /* sentenceterminal=true */, - { 0, 75, 602, 3, 2, -UNI_CWU } /* cwu=n */, - { 6, 5607, 1441, 15, 10, UNI_DEP } /* identifiertype=deprecated */, - { 2, 464, 1668, 2, 6, UNI_DOMINO } /* isdomino */, - { 1, 2726, 2581, 3, 9, UNI__PERL_SURROGATE } /* gc=surrogate */, - { 0, 2253, 2195, 9, 4, UNI_IN__6_DOT_2 } /* presentin=6.2 */, - { 5, 464, 3527, 2, 16, UNI_HALFANDFULLFORMS } /* ishalfandfullforms */, - { 1, 1879, 7044, 4, 24, UNI_DIACRITICALSFORSYMBOLS } /* blk=combiningmarksforsymbols */, - { 0, 6379, 7276, 13, 10, UNI_JG__TEHMARBUTA } /* joininggroup=tehmarbuta */, - { 2, 7208, 273, 9, 2, UNI_ZP } /* category=zp */, - { 2, 1571, 0, 4, 0, UNI_SAUR } /* saur */, - { 4, 464, 1125, 2, 8, UNI_TFNG } /* istifinagh */, - { 3, 1102, 433, 4, 3, UNI_NKO } /* scx=nko */, - { 0, 1214, 1491, 6, 4, UNI_KANAEXTA } /* inkanaexta */, - { 0, 1879, 1965, 4, 10, UNI_YIRADICALS } /* blk=yiradicals */, - { 4, 8244, 6352, 9, 11, UNI_CJKRADICALSSUP } /* block=cjkradicalssup */, - { 2, 1867, 934, 5, 2, -UNI_BIDIM } /* bidim=f */, - { 13, 2678, 6262, 3, 20, UNI_BC__PDF } /* bc=popdirectionalformat */, - { 4, 736, 7851, 3, 29, UNI_ENCLOSEDALPHANUMSUP } /* inenclosedalphanumericsupplement */, - { 3, 7740, 356, 11, 2, UNI_IDEO } /* ideographic=y */, - { 0, 3518, 0, 9, 0, UNI_Z } /* separator */, - { 9, 6114, 1289, 3, 9, UNI_TALU } /* sc=newtailue */, - { 0, 3763, 6199, 14, 5, UNI_NV__500000 } /* numericvalue=500000 */, - { 1, 33, 2383, 2, 9, UNI_MISCSYMBOLS } /* miscsymbols */, - { 8, 7605, 1847, 21, 8, UNI_LB__H2 } /* hangulsyllabletype=lvsyllable */, - { 0, 6803, 356, 20, 2, UNI_CE } /* compositionexclusion=y */, - { 1, 3474, 3435, 6, 15, UNI_INZANABAZARSQUARE } /* block=zanabazarsquare */, - { 1, 2678, 5446, 3, 18, UNI_BC__FSI } /* bc=firststrongisolate */, - { 5, 4291, 0, 12, 0, UNI_LB__ZW } /* linebreak=zw */, - { 9, 1529, 0, 4, 0, UNI_KHAR } /* khar */, - { 4, 19, 3790, 2, 3, UNI_AGE__7 } /* age=7 */, - { 0, 3462, 7733, 5, 28, UNI_ENCLOSEDIDEOGRAPHICSUP } /* blk=enclosedideographicsupplement */, - { 7, 2496, 4178, 3, 4, UNI_JG__KAPH } /* jg=kaph */, - { 5, 1465, 933, 4, 3, -UNI_XPOSIXSPACE } /* space=f */, - { 3, 313, 6538, 2, 11, UNI_NUMBERFORMS } /* innumberforms */, - { 0, 618, 0, 4, 0, UNI_ELYM } /* elym */, - { 0, 1879, 5907, 4, 21, UNI_SINHALAARCHAICNUMBERS } /* blk=sinhalaarchaicnumbers */, - { 1, 7208, 366, 9, 2, UNI_SM } /* category=sm */, - { 0, 1915, 355, 11, 2, UNI_grbase_values_index } /* graphemebase= */, - { 0, 275, 5, 4, 2, UNI_GCB__EX } /* gcb=ex */, - { 8, 6944, 6280, 24, 4, UNI_WB__EB } /* canonicalcombiningclass=atbl */, - { 1, 1879, 1887, 4, 7, UNI_UCASEXT } /* blk=ucasext */, - { 0, 2496, 1731, 3, 8, UNI_JG__SWASHKAF } /* jg=swashkaf */, - { 0, 6114, 618, 3, 4, UNI_ELYM } /* sc=elym */, - { 0, 4500, 5620, 8, 3, -UNI_XPOSIXUPPER } /* uppercase=n */, - { 5, 6944, 394, 25, 2, UNI_CCC__DA } /* canonicalcombiningclass=234 */, - { 0, 1236, 6414, 4, 25, UNI_SHORTHANDFORMATCONTROLS } /* block=shorthandformatcontrols */, - { 1, 343, 2262, 3, 3, UNI_CCC__14 } /* ccc=14 */, - { 2, 3474, 5284, 6, 20, UNI_ININSCRIPTIONALPAHLAVI } /* block=inscriptionalpahlavi */, - { 0, 1516, 4442, 6, 9, UNI_KANAEXTB } /* iskanaextendedb */, - { 0, 3622, 5584, 13, 3, UNI_LATINEXTG } /* islatinextendedg */, - { 56, 3474, 7385, 6, 18, UNI_PHONETICEXT } /* block=phoneticextensions */, - { 1, 1796, 413, 7, 4, UNI_SC__GONM } /* script=gonm */, - { 7, 1879, 1561, 4, 10, UNI_INPHOENICIAN } /* blk=phoenician */, - { 6, 3474, 967, 6, 8, UNI_INGUJARATI } /* block=gujarati */, - { 3, 854, 0, 7, 0, UNI_TAVT } /* taiviet */, - { 5, 313, 735, 2, 7, UNI_INLINEARA } /* inlineara */, - { 1, 464, 5340, 2, 4, UNI_DEVA } /* isdeva */, - { 9, 1465, 5620, 4, 4, -UNI_XPOSIXSPACE } /* space=no */, - { 2, 5502, 356, 21, 2, UNI_CWCM } /* changeswhencasemapped=y */, - { 8, 1102, 1255, 4, 4, UNI_SOYO } /* scx=soyo */, - { 0, 3164, 602, 14, 2, -UNI_GREXT } /* graphemeextend=n */, - { 5, 1796, 3188, 7, 15, UNI_ARMI } /* script=imperialaramaic */, - { 12, 1236, 2302, 5, 8, UNI_BLOCKELEMENTS } /* blockelements */, - { 40, 6114, 1003, 3, 6, UNI_LEPC } /* sc=lepcha */, - { 0, 3669, 919, 12, 3, UNI_JG__MALAYALAMSSA } /* jg=malayalamssa */, - { 1, 313, 2428, 2, 6, UNI_IPAEXT } /* inipaext */, - { 17, 2981, 2066, 4, 2, UNI_IN__5 } /* in=v50 */, - { 1, 2802, 1491, 10, 4, UNI_ETHIOPICEXTA } /* isethiopicexta */, - { 1, 1879, 1191, 4, 7, UNI_INBENGALI } /* blk=bengali */, - { 0, 581, 292, 5, 2, UNI_CCC__A } /* ccc=230 */, - { 3, 2726, 2322, 3, 10, UNI_CN } /* gc=unassigned */, - { 0, 2355, 1491, 8, 4, UNI_CYRILLICEXTA } /* cyrillicexta */, - { 0, 464, 4827, 2, 5, UNI_BAMU } /* isbamum */, - { 3, 1796, 5389, 7, 20, UNI_HMNP } /* script=nyiakengpuachuehmong */, - { 3, 4962, 0, 4, 0, UNI_HAN } /* hani */, - { 0, 464, 3839, 2, 16, UNI_TANGUTCOMPONENTS } /* istangutcomponents */, - { 1, 6944, 5472, 24, 5, UNI_CCC__B } /* canonicalcombiningclass=below */, - { 3, 1371, 0, 6, 0, UNI_THAA } /* thaana */, - { 8, 3474, 1280, 6, 9, UNI_INNABATAEAN } /* block=nabataean */, - { 11, 6114, 783, 3, 7, UNI_OSMA } /* sc=osmanya */, - { 0, 6114, 1982, 3, 6, UNI_SC__SYRC } /* sc=syriac */, - { 1, 343, 0, 2, 0, UNI_XPOSIXCNTRL } /* cc */, - { 0, 34, 8077, 1, 33, UNI_IDEOGRAPHICSYMBOLS } /* isideographicsymbolsandpunctuation */, - { 0, 7208, 58, 9, 2, UNI_SC } /* category=sc */, - { 12, 343, 7171, 3, 3, UNI_CCC__12 } /* ccc=12 */, - { 1, 343, 2702, 4, 4, UNI_CCC__6 } /* ccc=hanr */, - { 3, 3474, 818, 6, 7, UNI_SC__SHRD } /* block=sharada */, - { 2, 8276, 6856, 31, 11, UNI_INSC__CONSONANTPLACEHOLDER } /* indicsyllabiccategory=consonantplaceholder */, - { 0, 1796, 86, 7, 4, UNI_SC__GONG } /* script=gong */, - { 0, 3164, 588, 14, 2, UNI_GREXT } /* graphemeextend=t */, - { 3, 3058, 601, 7, 4, -UNI_XPOSIXXDIGIT } /* hexdigit=no */, - { 0, 296, 2119, 3, 9, UNI_NV__3_SLASH_20 } /* nv=1.500e-01 */, - { 2, 464, 5825, 2, 19, UNI_SUNDANESESUP } /* issundanesesupplement */, - { 0, 1879, 4021, 4, 17, UNI_INDICSIYAQNUMBERS } /* blk=indicsiyaqnumbers */, - { 1, 6944, 647, 23, 2, UNI_CCC__L } /* canonicalcombiningclass=l */, - { 0, 555, 2649, 4, 3, UNI_AGE__6_DOT_1 } /* age=6.1 */, - { 0, 2443, 588, 5, 5, UNI_CASED } /* cased=true */, - { 1, 2363, 6142, 8, 12, UNI_ETHIOPICSUP } /* inethiopicsupplement */, - { 1, 1879, 6284, 4, 19, UNI_JAMOEXTB } /* blk=hanguljamoextendedb */, - { 4, 6944, 1303, 25, 2, UNI_CCC__AR } /* canonicalcombiningclass=232 */, - { 6, 1383, 601, 6, 4, -UNI_IDS } /* idstart=no */, - { 0, 4433, 1491, 9, 4, UNI_LATINEXTA } /* blk=latinexta */, - { 1, 6749, 602, 25, 2, -UNI_CWKCF } /* changeswhennfkccasefolded=n */, - { 1, 1102, 1371, 4, 6, UNI_THAA } /* scx=thaana */, - { 9, 1796, 868, 7, 4, UNI_SC__TIRH } /* script=tirh */, - { 0, 3779, 2080, 14, 8, UNI_NV__15_SLASH_2 } /* numericvalue=7.500e+00 */, - { 0, 2678, 56, 3, 2, UNI_BC__AN } /* bc=an */, - { 7, 6011, 6142, 12, 5, UNI_ETHIOPICSUP } /* block=ethiopicsup */, - { 1, 612, 5606, 2, 3, UNI_LB__ID } /* lb=id */, - { 1, 7688, 4677, 23, 5, UNI_JG__MANICHAEANGIMEL } /* joininggroup=manichaeangimel */, - { 0, 991, 0, 4, 0, UNI_HATR } /* hatr */, - { 0, 7823, 3571, 5, 6, UNI_CJKCOMPAT } /* incjkcompat */, - { 0, 7740, 0, 11, 0, UNI_IDEO } /* ideographic */, - { 2, 1236, 3671, 5, 10, UNI_INMALAYALAM } /* block=malayalam */, - { 0, 916, 933, 4, 3, -UNI_EBASE } /* ebase=f */, - { 4, 464, 776, 2, 7, UNI_OLCK } /* isolchiki */, - { 1, 1766, 602, 5, 2, UNI_COMPEX } /* nfcqc=n */, - { 2, 313, 1308, 2, 9, UNI_INOLDITALIC } /* inolditalic */, - { 0, 1879, 967, 4, 8, UNI_INGUJARATI } /* blk=gujarati */, - { 4, 313, 593, 2, 7, UNI_DSRT } /* indeseret */, - { 1, 8007, 5183, 30, 4, UNI_CJKEXTE } /* blk=cjkunifiedideographsextensione */, - { 4, 5544, 356, 21, 4, UNI_CWT } /* changeswhentitlecased=yes */, - { 4, 6114, 1424, 3, 10, UNI_CHRS } /* sc=chorasmian */, - { 1, 0, 0, 2, 0, UNI_CASEDLETTER } /* l& */, - { 3, 1102, 6134, 4, 4, UNI_GLAG } /* scx=glag */, - { 5, 756, 356, 6, 4, UNI_NFKCQC__Y } /* nfkcqc=yes */, - { 1, 275, 647, 3, 3, UNI_LB__H2 } /* gcb=lv */, - { 0, 8533, 837, 10, 3, UNI_SUPPUAA } /* block=suppuaa */, - { 0, 4500, 355, 8, 2, UNI_upper_values_index } /* uppercase= */, - { 2, 464, 4882, 2, 19, UNI_EGYP } /* isegyptianhieroglyphs */, - { 8, 302, 356, 2, 4, UNI_RI } /* ri=yes */, - { 0, 1975, 1345, 3, 3, UNI_PALM } /* ispalm */, - { 1, 6379, 4166, 13, 4, UNI_JG__BETH } /* joininggroup=beth */, - { 9, 4996, 4166, 13, 4, UNI_JG__MANICHAEANBETH } /* jg=manichaeanbeth */, - { 1, 6114, 1280, 3, 9, UNI_NBAT } /* sc=nabataean */, - { 3, 6114, 1051, 3, 8, UNI_SC__MAHJ } /* sc=mahajani */, - { 0, 1377, 2447, 5, 7, UNI_WB__ML } /* wb=midletter */, - { 5, 6114, 453, 3, 4, UNI_MIAO } /* sc=plrd */, - { 7, 1704, 1491, 6, 4, UNI_ARABICEXTA } /* arabicexta */, - { 6, 7880, 6177, 4, 8, UNI_CJKSYMBOLS } /* iscjksymbols */, - { 4, 7208, 1413, 8, 3, UNI_XPOSIXCNTRL } /* category=cc */, - { 0, 67, 69, 2, 2, UNI_CPMN } /* cpmn */, - { 0, 4355, 540, 17, 4, UNI_TANG } /* scriptextensions=tang */, - { 1, 6011, 7851, 7, 29, UNI_ENCLOSEDALPHANUMSUP } /* block=enclosedalphanumericsupplement */, - { 0, 37, 5358, 1, 11, UNI_SMALLKANAEXT } /* smallkanaext */, - { 3, 3450, 4007, 5, 14, UNI_CURRENCYSYMBOLS } /* blk=currencysymbols */, - { 3, 464, 3152, 2, 12, UNI_NL } /* isletternumber */, - { 1, 3474, 4827, 6, 5, UNI_INBAMUM } /* block=bamum */, - { 1, 1289, 0, 9, 0, UNI_TALU } /* newtailue */, - { 1, 8276, 3213, 22, 10, UNI_INSC__PUREKILLER } /* indicsyllabiccategory=purekiller */, - { 2, 1687, 1950, 4, 8, UNI_SOGO } /* isoldsogdian */, - { 0, 1796, 4582, 7, 8, UNI_SC__BOPO } /* script=bopomofo */, - { 0, 3593, 4701, 10, 10, UNI_LATINEXTADDITIONAL } /* inlatinextadditional */, - { 7, 4355, 248, 17, 4, UNI_ZZZZ } /* scriptextensions=zzzz */, - { 0, 313, 661, 2, 5, UNI_INDOGRA } /* indogra */, - { 0, 1796, 5825, 7, 9, UNI_SUND } /* script=sundanese */, - { 24, 57, 0, 1, 0, UNI_N } /* n */, - { 0, 8533, 5358, 7, 11, UNI_SMALLKANAEXT } /* block=smallkanaext */, - { 1, 343, 3112, 4, 11, UNI_CCC__8 } /* ccc=kanavoicing */, - { 6, 4355, 5340, 17, 4, UNI_DEVA } /* scriptextensions=deva */, - { 0, 1702, 36, 3, 3, UNI_AVST } /* isavst */, - { 1, 261, 602, 4, 3, -UNI_CWCM } /* cwcm=no */, - { 1, 7208, 4081, 9, 11, UNI_P } /* category=punctuation */, - { 0, 1879, 2812, 4, 7, UNI_MAHJONG } /* blk=mahjong */, - { 4, 7018, 0, 8, 0, UNI_INARABIC } /* inarabic */, - { 1, 1796, 5806, 7, 9, UNI_SC__MONG } /* script=mongolian */, - { 8, 7431, 394, 27, 2, UNI_CCC__34 } /* canonicalcombiningclass=ccc34 */, - { 0, 2, 3123, 1, 14, UNI_CONTROLPICTURES } /* controlpictures */, - { 0, 3474, 2275, 6, 3, UNI_INIDC } /* block=idc */, - { 5, 313, 1191, 2, 7, UNI_INBENGALI } /* inbengali */, - { 8, 3622, 1646, 7, 4, UNI_LATINEXTD } /* islatinextd */, - { 1, 7605, 3559, 19, 12, UNI_GCB__T } /* hangulsyllabletype=trailingjamo */, - { 0, 313, 4750, 2, 8, UNI_DINGBATS } /* indingbats */, - { 2, 2428, 0, 13, 0, UNI_IPAEXT } /* ipaextensions */, - { 4, 464, 2712, 2, 14, UNI_ECOMP } /* isemojicomponent */, - { 9, 296, 1299, 3, 2, UNI_NV__60 } /* nv=60 */, - { 0, 7132, 6898, 7, 22, UNI_SUPERANDSUB } /* blk=superscriptsandsubscripts */, - { 4, 600, 6065, 3, 4, UNI_DT__FONT } /* dt=font */, - { 0, 464, 991, 2, 4, UNI_HATR } /* ishatr */, - { 2, 464, 1495, 2, 4, UNI_JAVA } /* isjava */, - { 3, 1205, 1211, 6, 3, UNI_QAAI } /* inherited */, - { 1, 721, 3582, 3, 11, UNI_KANGXI } /* kangxiradicals */, - { 1, 5586, 4435, 19, 3, UNI_GCB__L } /* graphemeclusterbreak=l */, - { 1, 313, 4857, 2, 8, UNI_TAMILSUP } /* intamilsup */, - { 1, 7403, 0, 28, 0, UNI_SUPPUAA } /* supplementaryprivateuseareaa */, - { 0, 1191, 0, 7, 0, UNI_BENG } /* bengali */, - { 0, 7584, 6065, 18, 4, UNI_DT__FONT } /* decompositiontype=font */, - { 8, 3474, 854, 6, 7, UNI_INTAIVIET } /* block=taiviet */, - { 1, 7828, 356, 16, 2, UNI_UIDEO } /* unifiedideograph=y */, - { 3, 409, 0, 3, 0, UNI_DIA } /* dia */, - { 6, 3474, 4740, 6, 18, UNI_ORNAMENTALDINGBATS } /* block=ornamentaldingbats */, - { 2, 1796, 405, 7, 4, UNI_ARMN } /* script=armn */, - { 3, 6112, 7364, 15, 13, UNI_INSC__CONSONANTPRECEDINGREPHA } /* insc=consonantprecedingrepha */, - { 9, 1796, 132, 7, 4, UNI_MTEI } /* script=mtei */, - { 0, 1442, 4370, 4, 2, UNI_epres_values_index } /* epres= */, - { 1, 1102, 405, 4, 4, UNI_ARMN } /* scx=armn */, - { 2, 154, 6878, 3, 15, UNI_GEOMETRICSHAPESEXT } /* geometricshapesext */, - { 0, 34, 617, 1, 8, UNI_INELYMAIC } /* inelymaic */, - { 1, 7317, 331, 10, 3, UNI_BC__FSI } /* bidiclass=fsi */, - { 4, 6114, 43, 3, 4, UNI_BHKS } /* sc=bhks */, - { 0, 2353, 7908, 3, 15, UNI_CUNEIFORMNUMBERS } /* incuneiformnumbers */, - { 3, 4355, 1255, 17, 7, UNI_SOYO } /* scriptextensions=soyombo */, - { 3, 464, 330, 2, 2, UNI_PF } /* ispf */, - { 0, 4355, 1807, 17, 4, UNI_SORA } /* scriptextensions=sora */, - { 10, 536, 287, 3, 2, UNI_SB__NU } /* sb=nu */, - { 0, 3462, 7175, 5, 10, UNI_ENCLOSEDCJK } /* blk=enclosedcjk */, - { 15, 2441, 0, 7, 0, UNI_CASED } /* iscased */, - { 5, 1899, 0, 6, 0, UNI_S } /* symbol */, - { 17, 1377, 3285, 3, 12, UNI_LB__HL } /* wb=hebrewletter */, - { 8, 1796, 1495, 7, 4, UNI_SC__JAVA } /* script=java */, - { 4, 2926, 7238, 3, 24, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* insymbolsandpictographsexta */, - { 1, 6644, 1899, 15, 7, UNI_TRANSPORTANDMAP } /* transportandmapsymbols */, - { 3, 3351, 2066, 13, 2, UNI_NV__50 } /* numericvalue=50 */, - { 2, 1353, 0, 9, 0, UNI_PAUC } /* paucinhau */, - { 4, 1879, 1033, 4, 8, UNI_JAMOEXTB } /* blk=jamoextb */, - { 1, 6379, 2972, 12, 2, UNI_JG__E } /* joininggroup=e */, - { 2, 6728, 0, 11, 0, UNI_MTEI } /* meeteimayek */, - { 0, 5523, 934, 21, 2, -UNI_CWL } /* changeswhenlowercased=f */, - { 5, 1383, 934, 4, 2, -UNI_IDST } /* idst=f */, - { 2, 600, 1178, 4, 5, UNI_DT__NAR } /* dt=narrow */, - { 0, 2948, 1771, 13, 6, UNI_NFCQC__M } /* nfcquickcheck=maybe */, - { 0, 4291, 22, 10, 2, UNI_LB__BA } /* linebreak=ba */, - { 13, 2253, 2127, 10, 2, UNI_IN__13 } /* presentin=13 */, - { 0, 7431, 294, 28, 1, UNI_CCC__14 } /* canonicalcombiningclass=ccc14 */, - { 0, 6402, 3151, 13, 3, UNI_SB__LE } /* sentencebreak=le */, - { 11, 4291, 7529, 9, 27, UNI_LB__CJ } /* linebreak=conditionaljapanesestarter */, - { 9, 1796, 55, 7, 4, UNI_CANS } /* script=cans */, - { 0, 6944, 118, 24, 2, UNI_CCC__DA } /* canonicalcombiningclass=da */, - { 5, 1879, 1887, 4, 4, UNI_UCAS } /* blk=ucas */, - { 0, 1102, 67, 4, 4, UNI_CPMN } /* scx=cpmn */, - { 0, 4355, 176, 17, 4, UNI_ROHG } /* scriptextensions=rohg */, - { 8, 959, 934, 8, 2, -UNI_EXT } /* extender=f */, - { 0, 1102, 465, 4, 4, UNI_SHRD } /* scx=shrd */, - { 0, 7880, 6352, 5, 11, UNI_CJKRADICALSSUP } /* iscjkradicalssup */, - { 3, 7018, 935, 9, 2, UNI_ARABICPFA } /* inarabicpfa */, - { 0, 1589, 0, 3, 0, UNI_ALL } /* all */, - { 7, 3669, 1193, 12, 3, UNI_JG__MALAYALAMNGA } /* jg=malayalamnga */, - { 7, 2974, 347, 11, 2, UNI_IN__1_DOT_1 } /* presentin=v11 */, - { 5, 2463, 356, 11, 2, UNI_JOINC } /* joincontrol=y */, - { 8, 3058, 356, 8, 2, UNI_XPOSIXXDIGIT } /* hexdigit=y */, - { 4, 4999, 0, 4, 0, UNI_MANI } /* mani */, - { 8, 1470, 0, 8, 0, UNI_BUGI } /* buginese */, - { 8, 4827, 0, 15, 0, UNI_BAMUMSUP } /* bamumsupplement */, - { 0, 313, 3933, 2, 4, UNI_INMODI } /* inmodi */, - { 2, 51, 0, 4, 0, UNI_CAKM } /* cakm */, - { 0, 1377, 2728, 2, 6, UNI_WB__XX } /* wb=other */, - { 1, 296, 294, 3, 2, UNI_NV__40 } /* nv=40 */, - { 1, 1102, 776, 4, 7, UNI_OLCK } /* scx=olchiki */, - { 1, 5136, 7556, 5, 28, UNI_MISCARROWS } /* blk=miscellaneoussymbolsandarrows */, - { 7, 1879, 3608, 4, 14, UNI_PHONETICEXTSUP } /* blk=phoneticextsup */, - { 0, 2726, 128, 3, 2, UNI_ME } /* gc=me */, - { 5, 6439, 0, 23, 0, UNI_ZNAMENNYMUSIC } /* znamennymusicalnotation */, - { 0, 4291, 7740, 10, 11, UNI_LB__ID } /* linebreak=ideographic */, - { 12, 7431, 1073, 27, 2, UNI_CCC__12 } /* canonicalcombiningclass=ccc12 */, - { 0, 1796, 1826, 7, 11, UNI_SC__SYLO } /* script=sylotinagri */, - { 0, 3474, 8592, 6, 43, UNI_UCASEXTA } /* block=unifiedcanadianaboriginalsyllabicsextendeda */, - { 21, 6185, 6199, 16, 8, UNI_NV__10000000000 } /* numericvalue=10000000000 */, - { 8, 3474, 1033, 6, 4, UNI_JAMO } /* block=jamo */, - { 0, 4291, 2012, 10, 2, UNI_LB__BK } /* linebreak=bk */, - { 0, 1377, 1837, 3, 5, UNI_WB__EB } /* wb=ebase */, - { 1, 2678, 538, 2, 2, UNI_BC__S } /* bc=s */, - { 0, 1879, 2812, 4, 12, UNI_MAHJONG } /* blk=mahjongtiles */, - { 3, 2926, 5358, 3, 17, UNI_SMALLKANAEXT } /* insmallkanaextension */, - { 1, 3474, 4062, 6, 8, UNI_VEDICEXT } /* block=vedicext */, - { 8, 876, 0, 4, 0, UNI_IDEO } /* ideo */, - { 0, 464, 3498, 2, 7, UNI_CPRT } /* iscypriot */, - { 1, 1102, 1927, 4, 12, UNI_GONG } /* scx=gunjalagondi */, - { 14, 1879, 496, 4, 6, UNI_INKHOJKI } /* blk=khojki */, - { 2, 5322, 0, 4, 0, UNI_CHER } /* cher */, - { 1, 2746, 2581, 4, 10, UNI_HIGHSURROGATES } /* highsurrogates */, - { 2, 644, 2344, 4, 9, UNI_GCB__V } /* hst=voweljamo */, - { 1, 464, 2018, 2, 12, UNI_GONM } /* ismasaramgondi */, - { 3, 7880, 1646, 5, 4, UNI_CJKEXTD } /* iscjkextd */, - { 0, 1796, 880, 7, 7, UNI_ZZZZ } /* script=unknown */, - { 0, 5865, 356, 21, 2, UNI_LOE } /* logicalorderexception=y */, - { 2, 464, 2581, 2, 9, UNI__PERL_SURROGATE } /* issurrogate */, - { 0, 832, 934, 5, 2, -UNI_STERM } /* sterm=f */, - { 0, 3474, 2771, 6, 12, UNI_KHMERSYMBOLS } /* block=khmersymbols */, - { 10, 3351, 292, 13, 2, UNI_NV__30 } /* numericvalue=30 */, - { 2, 2193, 2080, 4, 8, UNI_NV__13_SLASH_2 } /* nv=6.500e+00 */, - { 2, 7201, 4500, 16, 15, UNI_UPPERCASELETTER } /* generalcategory=uppercaseletter */, - { 4, 612, 6492, 2, 3, UNI_LB__AL } /* lb=al */, - { 1, 4092, 356, 9, 2, UNI_DIA } /* diacritic=y */, - { 20, 1102, 0, 4, 0, UNI_scx_values_index } /* scx= */, - { 0, 5502, 602, 21, 3, -UNI_CWCM } /* changeswhencasemapped=no */, - { 11, 6114, 337, 3, 6, UNI_CARI } /* sc=carian */, - { 22, 3474, 6728, 6, 11, UNI_INMEETEIMAYEK } /* block=meeteimayek */, - { 7, 464, 1371, 2, 6, UNI_THAA } /* isthaana */, - { 3, 7201, 6276, 16, 6, UNI_CF } /* generalcategory=format */, - { 2, 7431, 348, 27, 2, UNI_CCC__18 } /* canonicalcombiningclass=ccc18 */, - { 5, 2033, 0, 5, 0, UNI_XPOSIXALPHA } /* alpha */, - { 41851, 540, 184, 4, 2, UNI_TNSA } /* tangsa */, - { 0, 6944, 1300, 25, 2, UNI_WB__EB } /* canonicalcombiningclass=200 */, - { 3, 4355, 967, 17, 8, UNI_GUJR } /* scriptextensions=gujarati */, - { 0, 4291, 2014, 10, 2, UNI_LB__H3 } /* linebreak=h3 */, - { 0, 7338, 844, 11, 2, UNI_BC__RLO } /* bidiclass=rlo */, - { 0, 464, 2274, 2, 11, UNI_XIDC } /* isxidcontinue */, - { 8, 464, 940, 2, 2, UNI_CO } /* isco */, - { 4, 7317, 424, 10, 3, UNI_BC__RLI } /* bidiclass=rli */, - { 41, 536, 1592, 3, 2, UNI_SB__FO } /* sb=fo */, - { 0, 1796, 661, 7, 4, UNI_SC__DOGR } /* script=dogr */, - { 0, 823, 588, 4, 5, UNI_DASH } /* dash=true */, - { 0, 1879, 1826, 4, 11, UNI_INSYLOTINAGRI } /* blk=sylotinagri */, - { 0, 7880, 1037, 5, 4, UNI_CJKEXTB } /* iscjkextb */, - { 0, 464, 656, 2, 5, UNI_BUHD } /* isbuhid */, - { 17, 1102, 666, 4, 4, UNI_LIMB } /* scx=limb */, - { 4, 4355, 802, 17, 4, UNI_NBAT } /* scriptextensions=nbat */, - { 9, 1879, 5949, 4, 21, UNI_YIJING } /* blk=yijinghexagramsymbols */, - { 0, 4355, 1027, 17, 4, UNI_YEZI } /* scriptextensions=yezi */, - { 4, 343, 1650, 4, 2, UNI_CCC__1 } /* ccc=ov */, - { 0, 5, 588, 3, 5, UNI_EXT } /* ext=true */, - { 7, 464, 2463, 2, 11, UNI_JOINC } /* isjoincontrol */, - { 0, 2974, 1299, 11, 2, UNI_IN__6 } /* presentin=v60 */, - { 3, 3351, 3365, 13, 2, UNI_NV__36 } /* numericvalue=36 */, - { 0, 1796, 224, 7, 4, UNI_WCHO } /* script=wcho */, - { 0, 4355, 1470, 17, 8, UNI_BUGI } /* scriptextensions=buginese */, - { 3, 917, 0, 4, 0, UNI_BASS } /* bass */, - { 0, 58, 3465, 2, 5, UNI_ETHI } /* sc=ethi */, - { 5, 464, 4901, 2, 13, UNI_EMOD } /* isemojimodifier */, - { 1, 374, 169, 2, 2, UNI_THAA } /* thaa */, - { 2, 1879, 4842, 4, 15, UNI_DIACRITICALSSUP } /* blk=diacriticalssup */, - { 3, 5586, 588, 20, 2, UNI_GCB__T } /* graphemeclusterbreak=t */, - { 10, 1879, 3582, 7, 3, UNI_KANGXI } /* blk=kangxi */, - { 0, 464, 1657, 2, 11, UNI_CPMN } /* iscyprominoan */, - { 1, 3593, 3704, 3, 15, UNI_LINEARBIDEOGRAMS } /* inlinearbideograms */, - { 1, 2181, 1300, 4, 3, UNI_NV__5000 } /* nv=5000 */, - { 16, 7828, 588, 16, 5, UNI_UIDEO } /* unifiedideograph=true */, - { 1, 1465, 5100, 5, 4, UNI_XPOSIXSPACE } /* spaceperl */, - { 37, 939, 356, 5, 2, UNI_ECOMP } /* ecomp=y */, - { 5, 464, 1133, 2, 8, UNI_VITH } /* isvithkuqi */, - { 5, 464, 749, 2, 4, UNI_MARC } /* ismarc */, - { 0, 2253, 584, 9, 2, UNI_IN__2 } /* presentin=2 */, - { 0, 6114, 1951, 3, 4, UNI_SC__SOGD } /* sc=sogd */, - { 10, 6549, 0, 4, 0, UNI_CE } /* isce */, - { 0, 8276, 6116, 21, 18, UNI_INSC__CONSONANTPREFIXED } /* indicsyllabiccategory=consonantprefixed */, - { 0, 464, 1529, 2, 4, UNI_KHAR } /* iskhar */, - { 0, 2355, 6142, 6, 12, UNI_CYRILLICSUP } /* cyrillicsupplement */, - { 0, 2726, 1899, 3, 6, UNI_S } /* gc=symbol */, - { 0, 1441, 934, 10, 6, -UNI_DEP } /* deprecated=false */, - { 22, 832, 602, 5, 3, -UNI_STERM } /* sterm=no */, - { 17, 5, 934, 3, 2, -UNI_EXT } /* ext=f */, - { 56593, 3474, 1353, 6, 9, UNI_INPAUCINHAU } /* block=paucinhau */, - { 9, 409, 934, 3, 6, -UNI_DIA } /* dia=false */, - { 0, 34, 7986, 1, 5, UNI_MATH } /* ismath */, - { 0, 1879, 6644, 4, 15, UNI_TRANSPORTANDMAP } /* blk=transportandmap */, - { 6, 2726, 6466, 3, 10, UNI_CO } /* gc=privateuse */, - { 9, 216, 0, 4, 0, UNI_TIBT } /* tibt */, - { 9, 4433, 4629, 8, 5, UNI_LATIN1 } /* blk=latin1sup */, - { 4, 1003, 0, 6, 0, UNI_LEPC } /* lepcha */, - { 2, 1102, 120, 4, 4, UNI_LAO } /* scx=laoo */, - { 16, 8244, 1434, 9, 7, UNI_CJKSTROKES } /* block=cjkstrokes */, - { 1, 1879, 1845, 4, 11, UNI_YISYLLABLES } /* blk=yisyllables */, - { 4, 5544, 0, 21, 0, UNI_CWT } /* changeswhentitlecased */, - { 0, 464, 1198, 2, 7, UNI_GRAN } /* isgrantha */, - { 1, 7880, 5366, 22, 10, UNI_CJKEXTD } /* iscjkunifiedideographsextensiond */, - { 8, 464, 1464, 2, 2, UNI_ZS } /* iszs */, - { 5, 3474, 4793, 6, 4, UNI_RUMI } /* block=rumi */, - { 1, 2726, 6629, 3, 14, UNI_LM } /* gc=modifierletter */, - { 3, 1597, 588, 10, 5, UNI_SD } /* softdotted=true */, - { 0, 1465, 5620, 4, 3, -UNI_XPOSIXSPACE } /* space=n */, - { 2, 3000, 934, 13, 6, -UNI_QMARK } /* quotationmark=false */, - { 16, 8078, 0, 18, 0, UNI_IDEOGRAPHICSYMBOLS } /* ideographicsymbols */, - { 11, 3053, 601, 12, 3, -UNI_POSIXXDIGIT } /* asciihexdigit=n */, - { 1, 1214, 4442, 6, 9, UNI_KANAEXTB } /* inkanaextendedb */, - { 0, 4355, 67, 17, 4, UNI_CPMN } /* scriptextensions=cpmn */, - { 0, 2253, 2155, 9, 2, UNI_IN__4 } /* presentin=4 */, - { 5, 296, 771, 3, 2, UNI_NV__21 } /* nv=21 */, - { 1, 464, 343, 2, 2, UNI_XPOSIXCNTRL } /* iscc */, - { 0, 3351, 2617, 14, 8, UNI_NV__1_SLASH_5 } /* numericvalue=2.000e-01 */, - { 0, 895, 399, 5, 2, UNI_AGE__6_DOT_1 } /* age=v61 */, - { 0, 6379, 6154, 13, 19, UNI_JG__BURUSHASKIYEHBARREE } /* joininggroup=burushaskiyehbarree */, - { 0, 464, 19, 2, 4, UNI_AGHB } /* isaghb */, - { 8, 2, 5620, 1, 3, -UNI_CE } /* ce=n */, - { 1, 7688, 4170, 23, 4, UNI_JG__MANICHAEANFIVE } /* joininggroup=manichaeanfive */, - { 0, 2974, 3792, 11, 2, UNI_IN__7 } /* presentin=v70 */, - { 0, 1086, 0, 4, 0, UNI_KTHI } /* kthi */, - { 0, 2974, 294, 11, 2, UNI_IN__4 } /* presentin=v40 */, - { 11, 24, 0, 3, 0, UNI_XPOSIXXDIGIT } /* hex */, - { 6, 2465, 6529, 4, 20, UNI_INDICNUMBERFORMS } /* incommonindicnumberforms */, - { 2, 313, 5322, 2, 11, UNI_CHEROKEESUP } /* incherokeesup */, - { 0, 4062, 0, 8, 0, UNI_VEDICEXT } /* vedicext */, - { 1, 24, 934, 3, 2, -UNI_XPOSIXXDIGIT } /* hex=f */, - { 1, 34, 1116, 1, 9, UNI_TAGB } /* istagbanwa */, - { 0, 3474, 5907, 6, 21, UNI_SINHALAARCHAICNUMBERS } /* block=sinhalaarchaicnumbers */, - { 0, 3090, 6878, 7, 15, UNI_GEOMETRICSHAPESEXT } /* blk=geometricshapesext */, - { 7, 464, 1845, 2, 11, UNI_YISYLLABLES } /* isyisyllables */, - { 0, 5631, 2737, 5, 9, UNI_INGREEK } /* greekandcoptic */, - { 0, 4450, 5643, 7, 10, UNI_COUNTINGROD } /* block=countingrod */, - { 31, 4901, 933, 16, 3, -UNI_EBASE } /* emojimodifierbase=f */, - { 2, 1102, 6103, 4, 9, UNI_XSUX } /* scx=cuneiform */, - { 0, 1383, 356, 3, 4, UNI_IDS } /* ids=yes */, - { 0, 4355, 43, 17, 4, UNI_BHKS } /* scriptextensions=bhks */, - { 2, 3351, 2195, 12, 10, UNI_NV__1_SLASH_16 } /* numericvalue=6.250e-02 */, - { 2, 4355, 59, 17, 4, UNI_CHAM } /* scriptextensions=cham */, - { 6, 1796, 611, 7, 7, UNI_ELBA } /* script=elbasan */, - { 1, 3622, 503, 3, 5, UNI_LYDI } /* islydian */, - { 2, 1766, 356, 5, 4, UNI_NFCQC__Y } /* nfcqc=yes */, - { 8, 1410, 891, 7, 2, UNI_CCC__10 } /* ccc=ccc10 */, - { 0, 296, 4334, 2, 4, UNI_NV__3_SLASH_2 } /* nv=3/2 */, - { 0, 1879, 1807, 4, 11, UNI_INSORASOMPENG } /* blk=sorasompeng */, - { 2, 1796, 3093, 6, 5, UNI_SC__GEOR } /* script=geor */, - { 0, 2274, 356, 4, 2, UNI_XIDC } /* xidc=y */, - { 8, 441, 0, 4, 0, UNI_OLCK } /* olck */, - { 8, 343, 1303, 4, 2, UNI_CCC__32 } /* ccc=32 */, - { 2, 34, 1855, 1, 6, UNI_BIDIC } /* isbidic */, - { 0, 6112, 4934, 5, 14, UNI_INSC__GEMINATIONMARK } /* insc=geminationmark */, - { 0, 6114, 4418, 3, 6, UNI_SC__ZYYY } /* sc=common */, - { 6, 2890, 2868, 3, 11, UNI_JT__C } /* jt=joincausing */, - { 8, 6774, 601, 24, 3, -UNI_DI } /* defaultignorablecodepoint=n */, - { 0, 1382, 602, 4, 2, -UNI_XIDS } /* xids=n */, - { 2, 940, 356, 6, 2, UNI_COMPEX } /* compex=y */, - { 17, 6379, 6164, 13, 9, UNI_JG__YEHBARREE } /* joininggroup=yehbarree */, - { 2, 4857, 3641, 5, 10, UNI_TAMILSUP } /* tamilsupplement */, - { 0, 2253, 6214, 10, 3, UNI_IN__2_DOT_1 } /* presentin=2.1 */, - { 2, 1879, 2229, 4, 12, UNI_PHAISTOS } /* blk=phaistosdisc */, - { 1, 3474, 5846, 6, 19, UNI_SUPARROWSC } /* block=supplementalarrowsc */, - { 1, 464, 240, 2, 4, UNI_ZANB } /* iszanb */, - { 20, 3474, 1202, 6, 4, UNI_INTHAI } /* block=thai */, - { 1, 2394, 1491, 7, 4, UNI_MYANMAREXTA } /* myanmarexta */, - { 5, 1597, 0, 10, 0, UNI_SD } /* softdotted */, - { 1, 464, 1826, 2, 4, UNI_SYLO } /* issylo */, - { 2, 6803, 356, 20, 4, UNI_CE } /* compositionexclusion=yes */, - { 0, 2483, 3060, 8, 6, UNI_XPOSIXXDIGIT } /* isxposixxdigit */, - { 33, 600, 1168, 3, 6, UNI_DT__MED } /* dt=medial */, - { 2, 208, 0, 4, 0, UNI_TFNG } /* tfng */, - { 14, 7201, 4122, 16, 15, UNI_LOWERCASELETTER } /* generalcategory=lowercaseletter */, - { 0, 3608, 0, 14, 0, UNI_PHONETICEXTSUP } /* phoneticextsup */, - { 0, 2973, 934, 5, 6, -UNI_EPRES } /* epres=false */, - { 0, 2474, 2591, 3, 12, UNI_MAYANNUMERALS } /* ismayannumerals */, - { 0, 939, 0, 5, 0, UNI_ECOMP } /* ecomp */, - { 0, 6944, 2002, 23, 3, UNI_CCC__BR } /* canonicalcombiningclass=br */, - { 3, 409, 934, 3, 2, -UNI_DIA } /* dia=f */, - { 8, 2981, 399, 4, 2, UNI_IN__6_DOT_1 } /* in=v61 */, - { 1, 513, 3777, 4, 2, UNI_NV__3_SLASH_8 } /* nv=3/8 */, - { 0, 5136, 8307, 5, 33, UNI_MISCPICTOGRAPHS } /* blk=miscellaneoussymbolsandpictographs */, - { 4, 5888, 356, 5, 2, UNI__PERL_NCHAR } /* nchar=y */, - { 2, 5523, 588, 21, 5, UNI_CWL } /* changeswhenlowercased=true */, - { 0, 6379, 2526, 13, 3, UNI_JG__HEH } /* joininggroup=heh */, - { 2, 7132, 5762, 7, 7, UNI_SUPARROWSB } /* blk=suparrowsb */, - { 2, 1102, 1571, 4, 4, UNI_SAUR } /* scx=saur */, - { 6, 4662, 5080, 12, 7, UNI_SUPARROWSA } /* supplementalarrowsa */, - { 21, 275, 163, 4, 2, UNI_GCB__PP } /* gcb=pp */, - { 1, 2275, 602, 3, 3, -UNI_IDC } /* idc=no */, - { 1, 1879, 1241, 4, 7, UNI_INPHAGSPA } /* blk=phagspa */, - { 2, 34, 5321, 1, 9, UNI_CHER } /* ischerokee */, - { 0, 2260, 549, 3, 3, UNI_IN__3 } /* in=3.0 */, - { 1, 3474, 6644, 6, 22, UNI_TRANSPORTANDMAP } /* block=transportandmapsymbols */, - { 6, 3474, 9, 6, 3, UNI_OCR } /* block=ocr */, - { 0, 464, 2274, 2, 4, UNI_XIDC } /* isxidc */, - { 1, 2890, 0, 3, 0, UNI_jt_values_index } /* jt= */, - { 0, 7208, 2290, 9, 6, UNI_N } /* category=number */, - { 0, 1059, 602, 6, 3, UNI_NFKDQC__N } /* nfkdqc=no */, - { 4, 895, 3807, 5, 2, UNI_AGE__8 } /* age=v80 */, - { 3, 1011, 602, 2, 3, -UNI_CI } /* ci=no */, - { 1, 555, 2056, 5, 2, UNI_AGE__5_DOT_1 } /* age=5.1 */, - { 12, 1377, 287, 3, 2, UNI_WB__NU } /* wb=nu */, - { 10, 313, 1335, 2, 9, UNI_INOLDUYGHUR } /* inolduyghur */, - { 5, 1796, 192, 7, 4, UNI_SHAW } /* script=shaw */, - { 0, 296, 1304, 3, 4, UNI_NV__2000 } /* nv=2000 */, - { 21, 4302, 0, 6, 0, UNI_XPOSIXSPACE } /* wspace */, - { 8, 7584, 140, 18, 3, UNI_DT__NAR } /* decompositiontype=nar */, - { 5, 4433, 6890, 9, 9, UNI_LATINEXTE } /* blk=latinextendede */, - { 0, 3474, 6069, 6, 22, UNI_DIACRITICALSFORSYMBOLS } /* block=diacriticalsforsymbols */, - { 5, 1102, 4020, 4, 4, UNI_SIND } /* scx=sind */, - { 4, 1597, 356, 10, 2, UNI_SD } /* softdotted=y */, - { 0, 4355, 5907, 17, 7, UNI_SINH } /* scriptextensions=sinhala */, - { 2, 1065, 294, 5, 1, UNI_NV__1_SLASH_4 } /* nv=1/4 */, - { 0, 3164, 602, 14, 3, -UNI_GREXT } /* graphemeextend=no */, - { 0, 3593, 5, 7, 4, UNI_LATINEXTG } /* inlatinextg */, - { 4, 464, 6538, 2, 11, UNI_NUMBERFORMS } /* isnumberforms */, - { 0, 1410, 292, 7, 2, UNI_CCC__30 } /* ccc=ccc30 */, - { 0, 464, 1383, 2, 7, UNI_IDS } /* isidstart */, - { 0, 3351, 1299, 13, 3, UNI_NV__600 } /* numericvalue=600 */, - { 1, 4291, 0, 17, 0, UNI_LB__ZW } /* linebreak=zwspace */, - { 9, 5565, 0, 21, 0, UNI_CWU } /* changeswhenuppercased */, - { 0, 6114, 59, 3, 4, UNI_CHAM } /* sc=cham */, - { 2, 1102, 1424, 4, 10, UNI_CHRS } /* scx=chorasmian */, - { 0, 1796, 1549, 5, 12, UNI_XPEO } /* script=oldpersian */, - { 1, 464, 265, 2, 5, UNI_CWKCF } /* iscwkcf */, - { 1, 1879, 4062, 4, 15, UNI_VEDICEXT } /* blk=vedicextensions */, - { 1, 1879, 5825, 4, 9, UNI_INSUNDANESE } /* blk=sundanese */, - { 0, 2, 3869, 1, 16, UNI_UCAS } /* canadiansyllabics */, - { 74, 4355, 200, 17, 4, UNI_TAML } /* scriptextensions=taml */, - { 16, 1377, 959, 3, 6, UNI_WB__EXTEND } /* wb=extend */, - { 13, 34, 996, 1, 7, UNI_INKAITHI } /* inkaithi */, - { 7, 6112, 7627, 14, 16, UNI_INSC__CONSONANTINITIALPOSTFIXED } /* insc=consonantinitialpostfixed */, - { 1, 1879, 6842, 4, 14, UNI_MUSIC } /* blk=musicalsymbols */, - { 1, 1582, 0, 6, 0, UNI_L } /* letter */, - { 2, 6114, 8599, 3, 18, UNI_CANS } /* sc=canadianaboriginal */, - { 1, 6114, 1451, 3, 10, UNI_DIAK } /* sc=divesakuru */, - { 1, 464, 86, 2, 4, UNI_GONG } /* isgong */, - { 4, 2496, 3254, 3, 7, UNI_JG__SEMKATH } /* jg=semkath */, - { 0, 464, 69, 2, 2, UNI_MN } /* ismn */, - { 0, 6114, 1317, 3, 9, UNI_SC__PERM } /* sc=oldpermic */, - { 8, 2981, 3807, 4, 2, UNI_IN__8 } /* in=v80 */, - { 25, 7584, 369, 18, 3, UNI_DT__SQR } /* decompositiontype=sqr */, - { 1, 1796, 1052, 8, 7, UNI_SC__MAHJ } /* script=mahajani */, - { 6, 2645, 2056, 4, 2, UNI_IN__5_DOT_1 } /* in=5.1 */, - { 0, 2638, 390, 11, 2, UNI_IN__5_DOT_2 } /* presentin=5.2 */, - { 3, 313, 3309, 2, 15, UNI_INMEROITICCURSIVE } /* inmeroiticcursive */, - { 4, 4433, 4590, 9, 9, UNI_LATINEXTC } /* blk=latinextendedc */, - { 0, 1879, 0, 4, 0, UNI_blk_values_index } /* blk= */, - { 9, 600, 4533, 3, 4, UNI_DT__INIT } /* dt=init */, - { 0, 343, 1878, 4, 2, UNI_CCC__DB } /* ccc=db */, - { 0, 419, 1236, 2, 5, UNI_NB } /* noblock */, - { 6, 895, 292, 5, 2, UNI_AGE__3 } /* age=v30 */, - { 0, 2260, 2172, 3, 3, UNI_IN__2 } /* in=2.0 */, - { 10, 313, 242, 2, 2, UNI_NB } /* innb */, - { 0, 3809, 1781, 14, 4, UNI_NV__90000 } /* numericvalue=90000 */, - { 0, 1542, 0, 6, 0, UNI_ARROWS } /* arrows */, - { 4, 6803, 8486, 17, 4, UNI_ce_values_index } /* compositionexclusion= */, - { 3, 6114, 2401, 3, 4, UNI_SC__NAND } /* sc=nand */, - { 5, 1796, 1241, 7, 7, UNI_SC__PHAG } /* script=phagspa */, - { 4, 786, 0, 3, 0, UNI_ANY } /* any */, - { 17, 343, 8572, 4, 13, UNI_CCC__214 } /* ccc=attachedabove */, - { 1, 6570, 2679, 3, 7, UNI_INPC__RIGHT } /* inpc=right */, - { 14, 5844, 5762, 14, 7, UNI_SUPARROWSB } /* issupplementalarrowsb */, - { 17, 3839, 0, 6, 0, UNI_TANG } /* tangut */, - { 1, 895, 1780, 5, 3, UNI_AGE__10 } /* age=v100 */, - { 0, 464, 1614, 2, 4, UNI_WARA } /* iswara */, - { 7, 6114, 27, 3, 4, UNI_AHOM } /* sc=ahom */, - { 0, 36, 588, 2, 5, UNI_VS } /* vs=true */, - { 4, 4776, 355, 16, 5, UNI__PERL_PATWS } /* patternwhitespace=yes */, - { 1, 5661, 0, 19, 0, UNI_MERO } /* meroitichieroglyphs */, - { 0, 6379, 3671, 12, 14, UNI_JG__MALAYALAMNNNA } /* joininggroup=malayalamnnna */, - { 0, 313, 4793, 2, 18, UNI_RUMI } /* inruminumeralsymbols */, - { 0, 313, 5340, 2, 13, UNI_DEVANAGARIEXT } /* indevanagariext */, - { 0, 2153, 1303, 4, 5, UNI_NV__432000 } /* nv=432000 */, - { 4, 464, 1571, 2, 4, UNI_SAUR } /* issaur */, - { 14, 313, 5322, 2, 18, UNI_CHEROKEESUP } /* incherokeesupplement */, - { 0, 6114, 124, 3, 4, UNI_SC__LATN } /* sc=latn */, - { 0, 2260, 294, 4, 1, UNI_IN__14 } /* in=14 */, - { 8, 2726, 4758, 3, 18, UNI_ZP } /* gc=paragraphseparator */, - { 0, 296, 2615, 3, 10, UNI_NV___MINUS_1_SLASH_2 } /* nv=-5.000e-01 */, - { 0, 1441, 602, 3, 2, -UNI_DEP } /* dep=n */, - { 10, 6114, 1826, 3, 11, UNI_SC__SYLO } /* sc=sylotinagri */, - { 8, 756, 602, 6, 3, UNI_NFKCQC__N } /* nfkcqc=no */, - { 8, 925, 1413, 3, 2, UNI_BPT__C } /* bpt=c */, - { 0, 464, 413, 2, 4, UNI_GONM } /* isgonm */, - { 16, 4355, 5284, 17, 20, UNI_PHLI } /* scriptextensions=inscriptionalpahlavi */, - { 0, 3474, 3608, 6, 11, UNI_PHONETICEXT } /* block=phoneticext */, - { 0, 7208, 110, 9, 1, UNI_Z } /* category=z */, - { 2, 2974, 771, 11, 2, UNI_IN__2_DOT_1 } /* presentin=v21 */, - { 1, 464, 5907, 2, 21, UNI_SINHALAARCHAICNUMBERS } /* issinhalaarchaicnumbers */, - { 0, 1879, 4962, 4, 14, UNI_INHANIFIROHINGYA } /* blk=hanifirohingya */, - { 3, 4500, 602, 5, 3, -UNI_XPOSIXUPPER } /* upper=no */, - { 1, 2726, 252, 3, 2, UNI_CN } /* gc=cn */, - { 3, 4355, 6030, 16, 9, UNI_GEOR } /* scriptextensions=georgian */, - { 3, 1879, 4857, 4, 5, UNI_INTAMIL } /* blk=tamil */, - { 1, 3839, 0, 16, 0, UNI_TANGUTCOMPONENTS } /* tangutcomponents */, - { 3, 3474, 2285, 7, 12, UNI_AEGEANNUMBERS } /* block=aegeannumbers */, - { 0, 2981, 1780, 4, 3, UNI_IN__10 } /* in=v100 */, - { 0, 296, 1070, 3, 2, UNI_NV__31 } /* nv=31 */, - { 9, 2792, 4442, 10, 9, UNI_CYRILLICEXTB } /* iscyrillicextendedb */, - { 33, 1796, 457, 7, 4, UNI_PRTI } /* script=prti */, - { 3, 4901, 588, 13, 5, UNI_EMOD } /* emojimodifier=true */, - { 8, 1803, 0, 4, 0, UNI_MLYM } /* mlym */, - { 4, 464, 184, 2, 4, UNI_SAMR } /* issamr */, - { 12, 2443, 934, 5, 6, -UNI_CASED } /* cased=false */, - { 6, 4355, 1451, 17, 10, UNI_DIAK } /* scriptextensions=divesakuru */, - { 1, 7208, 3651, 9, 14, UNI_MN } /* category=nonspacingmark */, - { 4, 7208, 2774, 12, 8, UNI_SO } /* category=othersymbol */, - { 1, 3474, 5214, 6, 9, UNI_HALFMARKS } /* block=halfmarks */, - { 0, 1220, 0, 4, 0, UNI_MAKA } /* maka */, - { 1, 1796, 618, 7, 4, UNI_ELYM } /* script=elym */, - { 3, 464, 847, 2, 7, UNI_LANA } /* istaitham */, - { 0, 3474, 1335, 6, 9, UNI_INOLDUYGHUR } /* block=olduyghur */, - { 2, 2474, 0, 9, 0, UNI_MYMR } /* ismyanmar */, - { 0, 3823, 934, 16, 6, -UNI_STERM } /* sentenceterminal=false */, - { 4, 4355, 1198, 17, 4, UNI_GRAN } /* scriptextensions=gran */, - { 4, 3223, 0, 13, 0, UNI_XPOSIXDIGIT } /* decimalnumber */, - { 12, 1796, 1561, 7, 10, UNI_PHNX } /* script=phoenician */, - { 4, 37, 4641, 1, 8, UNI_SYRIACSUP } /* syriacsup */, - { 4, 1785, 1791, 6, 5, UNI_HMNG } /* pahawhhmong */, - { 4, 34, 1370, 1, 7, UNI_INTHAANA } /* inthaana */, - { 2, 1102, 686, 4, 5, UNI_TAKR } /* scx=takri */, - { 0, 4355, 2771, 17, 5, UNI_KHMR } /* scriptextensions=khmer */, - { 2, 2974, 1304, 12, 2, UNI_IN__12 } /* presentin=v120 */, - { 0, 2310, 355, 12, 3, UNI_CI } /* caseignorable=y */, - { 2, 1796, 3933, 7, 4, UNI_SC__MODI } /* script=modi */, - { 5, 7527, 1465, 3, 5, UNI_LB__SP } /* lb=space */, - { 1, 1796, 184, 7, 4, UNI_SAMR } /* script=samr */, - { 0, 2443, 278, 5, 1, UNI_cased_values_index } /* cased= */, - { 26, 3974, 934, 17, 6, -UNI_IDSB } /* idsbinaryoperator=false */, - { 1, 1539, 8150, 3, 32, UNI_DIACRITICALSEXT } /* iscombiningdiacriticalmarksextended */, - { 5, 4355, 413, 17, 4, UNI_GONM } /* scriptextensions=gonm */, - { 0, 3748, 766, 14, 2, UNI_NV__1_SLASH_6 } /* numericvalue=1/6 */, - { 1, 464, 6629, 2, 15, UNI_MODIFIERLETTERS } /* ismodifierletters */, - { 4, 464, 1234, 2, 7, UNI_NB } /* isnoblock */, - { 8, 5, 356, 3, 4, UNI_EXT } /* ext=yes */, - { 0, 7182, 4464, 3, 4, UNI_CJKEXTC } /* cjkextc */, - { 4, 1214, 328, 6, 3, UNI_KANASUP } /* inkanasup */, - { 0, 2274, 602, 11, 3, -UNI_XIDC } /* xidcontinue=no */, - { 0, 530, 0, 6, 0, UNI_RJNG } /* rejang */, - { 1, 343, 298, 3, 2, UNI_CCC__9 } /* ccc=9 */, - { 0, 6114, 144, 3, 4, UNI_NEWA } /* sc=newa */, - { 1, 844, 5620, 2, 4, -UNI_LOE } /* loe=no */, - { 2, 925, 0, 5, 0, UNI_BPT__O } /* bpt=o */, - { 1, 464, 1015, 2, 4, UNI_TELU } /* istelu */, - { 1, 6011, 623, 12, 5, UNI_ETHIOPICEXT } /* block=ethiopicext */, - { 2, 3474, 5949, 6, 21, UNI_YIJING } /* block=yijinghexagramsymbols */, - { 0, 6944, 1236, 24, 2, UNI_CCC__BL } /* canonicalcombiningclass=bl */, - { 2, 536, 2961, 3, 7, UNI_SB__NU } /* sb=numeric */, - { 0, 275, 1860, 4, 7, UNI_GCB__CN } /* gcb=control */, - { 0, 7208, 602, 8, 2, UNI_N } /* category=n */, - { 8, 7148, 2138, 25, 2, UNI_WB__EB } /* canonicalcombiningclass=133 */, - { 0, 464, 4515, 2, 18, UNI_IDST } /* isidstrinaryoperator */, - { 0, 2726, 273, 3, 2, UNI_ZP } /* gc=zp */, - { 0, 7201, 4137, 16, 15, UNI_PS } /* generalcategory=openpunctuation */, - { 2, 6114, 676, 3, 5, UNI_OSGE } /* sc=osage */, - { 0, 2890, 2680, 2, 2, UNI_JT__R } /* jt=r */, - { 0, 5888, 602, 5, 3, -UNI__PERL_NCHAR } /* nchar=no */, - { 18, 5586, 252, 21, 2, UNI_GCB__CN } /* graphemeclusterbreak=cn */, - { 2, 2981, 1304, 4, 2, UNI_IN__2 } /* in=v20 */, - { 0, 4500, 588, 5, 5, UNI_XPOSIXUPPER } /* upper=true */, - { 1, 3474, 5787, 6, 10, UNI_JAMO } /* block=hanguljamo */, - { 1, 6944, 1418, 24, 6, UNI_CCC__9 } /* canonicalcombiningclass=virama */, - { 0, 265, 356, 5, 4, UNI_CWKCF } /* cwkcf=yes */, - { 1, 6944, 391, 25, 2, UNI_CCC__R } /* canonicalcombiningclass=226 */, - { 0, 313, 651, 2, 5, UNI_INADLAM } /* inadlam */, - { 3, 5502, 934, 21, 6, -UNI_CWCM } /* changeswhencasemapped=false */, - { 0, 6114, 5284, 3, 20, UNI_PHLI } /* sc=inscriptionalpahlavi */, - { 0, 12, 934, 3, 2, -UNI_PCM } /* pcm=f */, - { 11, 8182, 6581, 24, 13, UNI_INPC__BOTTOMANDLEFT } /* indicpositionalcategory=bottomandleft */, - { 17, 1796, 1571, 7, 4, UNI_SAUR } /* script=saur */, - { 15, 3000, 317, 9, 4, UNI_QMARK } /* quotationmark */, - { 20, 6944, 2688, 24, 4, UNI_CCC__L } /* canonicalcombiningclass=left */, - { 1, 2802, 8047, 3, 31, UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS } /* isegyptianhieroglyphformatcontrols */, - { 6, 1102, 951, 4, 8, UNI_DUPL } /* scx=duployan */, - { 1, 5748, 8319, 14, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* insupplementalsymbolsandpictographs */, - { 1, 3474, 5397, 6, 3, UNI_PUA } /* block=pua */, - { 5, 2792, 1491, 10, 4, UNI_CYRILLICEXTA } /* iscyrillicexta */, - { 1, 1011, 588, 2, 5, UNI_CI } /* ci=true */, - { 0, 1867, 588, 12, 5, UNI_BIDIM } /* bidimirrored=true */, - { 3, 5565, 588, 21, 2, UNI_CWU } /* changeswhenuppercased=t */, - { 0, 1796, 437, 7, 4, UNI_OGAM } /* script=ogam */, - { 0, 6114, 671, 3, 5, UNI_OGAM } /* sc=ogham */, - { 1, 1879, 287, 4, 5, UNI_INNUSHU } /* blk=nushu */, - { 3, 4081, 0, 11, 0, UNI_P } /* punctuation */, - { 4, 302, 588, 2, 5, UNI_RI } /* ri=true */, - { 0, 2463, 934, 5, 2, -UNI_JOINC } /* joinc=f */, - { 1, 6687, 1193, 22, 3, UNI_JG__MALAYALAMNGA } /* joininggroup=malayalamnga */, - { 4, 6944, 394, 24, 2, UNI_CCC__34 } /* canonicalcombiningclass=34 */, - { 0, 6239, 0, 23, 0, UNI_BC__LRE } /* bc=lefttorightembedding */, - { 4, 2324, 0, 8, 0, UNI_ASSIGNED } /* assigned */, - { 8, 313, 1785, 2, 11, UNI_INPAHAWHHMONG } /* inpahawhhmong */, - { 0, 1102, 204, 4, 4, UNI_TAVT } /* scx=tavt */, - { 22, 736, 7733, 3, 21, UNI_ENCLOSEDIDEOGRAPHICSUP } /* inenclosedideographicsup */, - { 4, 1102, 224, 4, 4, UNI_WCHO } /* scx=wcho */, - { 0, 5990, 5617, 17, 6, UNI_BPT__N } /* bidipairedbrackettype=n */, - { 2, 36, 934, 2, 6, -UNI_VS } /* vs=false */, - { 0, 1879, 901, 4, 8, UNI_INARMENIAN } /* blk=armenian */, - { 0, 1879, 540, 4, 6, UNI_INTANGSA } /* blk=tangsa */, - { 0, 3351, 1300, 14, 2, UNI_NV__200 } /* numericvalue=200 */, - { 15, 1233, 4741, 3, 17, UNI_ORNAMENTALDINGBATS } /* inornamentaldingbats */, - { 0, 1102, 3285, 4, 4, UNI_HEBR } /* scx=hebr */, - { 2, 3474, 5825, 6, 19, UNI_SUNDANESESUP } /* block=sundanesesupplement */, - { 3, 313, 4437, 2, 14, UNI_LATINEXTB } /* inlatinextendedb */, - { 1, 313, 4827, 2, 15, UNI_BAMUMSUP } /* inbamumsupplement */, + { 0, 461, 4569, 2, 9, UNI_XPOSIXUPPER } /* isuppercase */, + { 9, 1801, 0, 10, 0, UNI_NV__1000000 } /* nv=1000000 */, + { 0, 461, 402, 2, 4, UNI_ARMN } /* isarmn */, + { 0, 7944, 3998, 28, 4, UNI_CJKEXTG } /* iscjkunifiedideographsextensiong */, + { 1, 302, 599, 5, 2, -UNI__PERL_PATWS } /* patws=n */, + { 0, 4819, 0, 8, 0, UNI_DINGBATS } /* dingbats */, + { 2, 5916, 599, 21, 3, -UNI_LOE } /* logicalorderexception=no */, + { 0, 1424, 1317, 7, 2, UNI_CCC__32 } /* ccc=ccc32 */, + { 5, 1667, 4075, 4, 15, UNI_CURRENCYSYMBOLS } /* blk=currencysymbols */, + { 5, 3130, 3639, 11, 9, UNI_GEORGIANEXT } /* blk=georgianextended */, + { 0, 461, 3554, 2, 13, UNI_ZL } /* islineseparator */, + { 1, 1823, 438, 7, 4, UNI_OLCK } /* script=olck */, + { 8, 641, 644, 3, 3, UNI_LB__H2 } /* hst=lv */, + { 5, 6581, 0, 16, 0, UNI_INDICNUMBERFORMS } /* indicnumberforms */, + { 9, 1894, 585, 5, 2, UNI_BIDIM } /* bidim=t */, + { 0, 1667, 5694, 5, 18, UNI_COUNTINGROD } /* blk=countingrodnumerals */, + { 2, 2280, 512, 9, 2, UNI_IN__3 } /* presentin=3 */, + { 0, 1667, 398, 4, 4, UNI_INMIAO } /* blk=miao */, + { 17, 1075, 6255, 4, 8, UNI_NV__1_SLASH_40 } /* nv=2.500e-02 */, + { 3, 2324, 1015, 6, 6, UNI_INTELUGU } /* block=telugu */, + { 0, 339, 1678, 4, 2, UNI_CCC__1 } /* ccc=ov */, + { 2, 5979, 1628, 3, 7, UNI_VO__U } /* vo=upright */, + { 4, 4424, 1009, 17, 6, UNI_LYCI } /* scriptextensions=lycian */, + { 2, 8343, 6642, 22, 19, UNI_INSC__BRAHMIJOININGNUMBER } /* indicsyllabiccategory=brahmijoiningnumber */, + { 0, 3391, 346, 14, 1, UNI_NV__28 } /* numericvalue=28 */, + { 0, 1667, 1635, 4, 10, UNI_INWARANGCITI } /* blk=warangciti */, + { 0, 8601, 1845, 9, 8, UNI_SUPERANDSUB } /* block=superandsub */, + { 2, 4075, 0, 15, 0, UNI_CURRENCYSYMBOLS } /* currencysymbols */, + { 2, 8343, 6661, 31, 10, UNI_INSC__CONSONANTHEADLETTER } /* indicsyllabiccategory=consonantheadletter */, + { 12, 7274, 330, 9, 2, UNI_PD } /* category=pd */, + { 9, 5156, 283, 10, 2, UNI_WB__NU } /* wordbreak=nu */, + { 2, 1102, 1205, 4, 7, UNI_GRAN } /* scx=grantha */, + { 1, 6427, 2015, 13, 3, UNI_JG__WAW } /* joininggroup=waw */, + { 8, 533, 2304, 4, 8, UNI_SB__SC } /* sb=scontinue */, + { 0, 4360, 2029, 9, 10, UNI_LB__B2 } /* linebreak=breakboth */, + { 0, 6076, 976, 7, 7, UNI_INGURMUKHI } /* block=gurmukhi */, + { 7, 5460, 353, 19, 2, UNI_TERM } /* terminalpunctuation=y */, + { 3, 1102, 5440, 4, 20, UNI_HMNP } /* scx=nyiakengpuachuehmong */, + { 8, 1530, 7443, 4, 24, UNI_KATAKANAEXT } /* iskatakanaphoneticextensions */, + { 0, 5460, 934, 19, 2, -UNI_TERM } /* terminalpunctuation=f */, + { 0, 1102, 1234, 4, 7, UNI_MULT } /* scx=multani */, + { 1, 2766, 2317, 3, 6, UNI_N } /* gc=number */, + { 1, 30, 4160, 1, 16, UNI_DIACRITICALSEXT } /* indiacriticalsext */, + { 6, 2324, 1914, 6, 8, UNI_UCASEXTA } /* block=ucasexta */, + { 20, 641, 2931, 2, 3, UNI_GCB__T } /* hst=t */, + { 0, 4424, 59, 17, 4, UNI_CHRS } /* scriptextensions=chrs */, + { 0, 309, 6000, 2, 21, UNI_YIJING } /* inyijinghexagramsymbols */, + { 0, 1102, 1562, 4, 10, UNI_NAGM } /* scx=nagmundari */, + { 2, 2411, 0, 11, 0, UNI_KATAKANAEXT } /* katakanaext */, + { 1, 99, 0, 2, 0, UNI_UPPERCASELETTER } /* lu */, + { 4, 2180, 389, 4, 1, UNI_NV__46 } /* nv=46 */, + { 0, 2766, 117, 3, 2, UNI_XPOSIXDIGIT } /* gc=nd */, + { 2, 510, 1805, 4, 5, UNI_NV__300000 } /* nv=300000 */, + { 2, 1424, 345, 7, 2, UNI_CCC__18 } /* ccc=ccc18 */, + { 2, 309, 1954, 2, 12, UNI_INGUNJALAGONDI } /* ingunjalagondi */, + { 2, 7889, 4410, 26, 4, UNI_CJKEXTA } /* cjkunifiedideographsextensiona */, + { 0, 309, 4060, 2, 15, UNI_BRAI } /* inbraillepatterns */, + { 0, 309, 7724, 2, 18, UNI_INVS } /* invariationselectors */, + { 0, 461, 7449, 2, 18, UNI_PHONETICEXT } /* isphoneticextensions */, + { 1, 1125, 0, 8, 0, UNI_TFNG } /* tifinagh */, + { 0, 6618, 6288, 3, 6, UNI_INPC__LEFT } /* inpc=left */, + { 0, 2004, 4569, 5, 5, UNI_POSIXUPPER } /* posixupper */, + { 0, 292, 1071, 3, 4, UNI_NV__1_SLASH_12 } /* nv=1/12 */, + { 1, 406, 934, 2, 6, -UNI_DI } /* di=false */, + { 0, 1667, 7356, 4, 27, UNI_OCR } /* blk=opticalcharacterrecognition */, + { 1, 1102, 4060, 4, 4, UNI_BRAI } /* scx=brai */, + { 4, 7591, 281, 3, 2, UNI_LB__XX } /* lb=xx */, + { 1, 2302, 353, 3, 4, UNI_IDC } /* idc=yes */, + { 0, 1424, 388, 7, 2, UNI_CCC__26 } /* ccc=ccc26 */, + { 2, 461, 1021, 2, 6, UNI_WCHO } /* iswancho */, + { 16, 2525, 3100, 5, 6, UNI_XPOSIXDIGIT } /* xposixdigit */, + { 1, 19, 353, 4, 2, UNI_POSIXXDIGIT } /* ahex=y */, + { 0, 3908, 0, 16, 0, UNI_TANGUTCOMPONENTS } /* tangutcomponents */, + { 6, 339, 890, 3, 3, UNI_CCC__10 } /* ccc=10 */, + { 2, 909, 0, 4, 0, UNI_BALI } /* bali */, + { 0, 309, 1262, 2, 7, UNI_INSOYOMBO } /* insoyombo */, + { 0, 339, 2719, 2, 7, UNI_CCC__R } /* ccc=right */, + { 16, 309, 4896, 2, 15, UNI_BAMUMSUP } /* inbamumsupplement */, + { 9, 253, 353, 4, 2, UNI_CWCF } /* cwcf=y */, + { 2, 8311, 6554, 32, 4, UNI_CJKEXTC } /* block=cjkunifiedideographsextensionc */, + { 1, 3677, 4698, 6, 5, UNI_LATIN1 } /* islatin1sup */, + { 1, 5156, 1864, 10, 5, UNI_WB__EB } /* wordbreak=ebase */, + { 17, 4, 933, 2, 7, -UNI_LOE } /* loe=false */, + { 5, 6165, 798, 3, 4, UNI_NBAT } /* sc=nbat */, + { 0, 2988, 599, 13, 3, UNI_COMPEX } /* nfcquickcheck=no */, + { 0, 521, 934, 6, 6, -UNI_PATSYN } /* patsyn=false */, + { 1, 461, 74, 2, 4, UNI_CYRL } /* iscyrl */, + { 0, 7648, 4602, 18, 4, UNI_DT__INIT } /* decompositiontype=init */, + { 3, 823, 599, 4, 3, -UNI_DASH } /* dash=no */, + { 1, 552, 342, 3, 3, UNI_AGE__12 } /* age=12 */, + { 0, 292, 388, 3, 2, UNI_NV__26 } /* nv=26 */, + { 0, 7267, 1611, 16, 2, UNI_LOWERCASELETTER } /* generalcategory=ll */, + { 0, 6165, 868, 3, 4, UNI_SC__TIRH } /* sc=tirh */, + { 1, 7855, 0, 32, 0, UNI_INIDC } /* ideographicdescriptioncharacters */, + { 2, 1853, 0, 4, 0, UNI_SYLO } /* sylo */, + { 1, 2287, 2084, 3, 2, UNI_IN__11 } /* in=11 */, + { 4, 1823, 658, 7, 5, UNI_SC__DOGR } /* script=dogra */, + { 8, 271, 1864, 4, 8, UNI_WB__EB } /* gcb=ebasegaz */, + { 6, 1667, 4533, 7, 4, UNI_CJKEXTC } /* blk=cjkextc */, + { 11, 271, 959, 4, 6, UNI_GCB__EX } /* gcb=extend */, + { 4, 5205, 6597, 5, 21, UNI_MISCTECHNICAL } /* blk=miscellaneoustechnical */, + { 1, 1102, 493, 4, 6, UNI_KHOJ } /* scx=khojki */, + { 0, 4424, 438, 17, 4, UNI_OLCK } /* scriptextensions=olck */, + { 1, 116, 0, 4, 0, UNI_KNDA } /* knda */, + { 0, 875, 599, 5, 2, -UNI_UIDEO } /* uideo=n */, + { 0, 5205, 5107, 5, 18, UNI_MODIFIERTONELETTERS } /* blk=modifiertoneletters */, + { 14, 3021, 344, 4, 2, UNI_IN__2_DOT_1 } /* in=v21 */, + { 2, 7648, 1743, 18, 4, UNI_DT__VERT } /* decompositiontype=vert */, + { 0, 461, 238, 2, 2, UNI_NB } /* isnb */, + { 0, 7887, 4218, 28, 4, UNI_CJKEXTH } /* incjkunifiedideographsextensionh */, + { 1, 2002, 1942, 7, 5, UNI_POSIXGRAPH } /* isposixgraph */, + { 3, 6618, 5308, 5, 15, UNI_LOE } /* inpc=visualorderleft */, + { 6, 4424, 997, 17, 6, UNI_KTHI } /* scriptextensions=kaithi */, + { 0, 406, 1175, 2, 2, UNI_dia_values_index } /* dia= */, + { 0, 1667, 3611, 7, 11, UNI_CJKCOMPATFORMS } /* blk=cjkcompatforms */, + { 4, 6163, 2460, 5, 8, UNI_INSC__TONEMARK } /* insc=tonemark */, + { 4, 4360, 3337, 10, 12, UNI_LB__IS } /* linebreak=infixnumeric */, + { 0, 4424, 224, 17, 4, UNI_XPEO } /* scriptextensions=xpeo */, + { 0, 4424, 6081, 16, 9, UNI_GEOR } /* scriptextensions=georgian */, + { 10, 30, 7563, 1, 28, UNI_ANCIENTGREEKMUSIC } /* isancientgreekmusicalnotation */, + { 2, 3407, 1314, 14, 3, UNI_NV__4000 } /* numericvalue=4000 */, + { 0, 3677, 0, 7, 0, UNI_LATN } /* islatin */, + { 0, 2324, 6557, 9, 16, UNI_CJKCOMPATIDEOGRAPHS } /* block=cjkcompatideographs */, + { 2, 4424, 31, 17, 4, UNI_AVST } /* scriptextensions=avst */, + { 5, 6866, 0, 24, 0, UNI_COMPEX } /* fullcompositionexclusion */, + { 1, 2930, 44, 3, 1, UNI_JT__U } /* jt=u */, + { 1, 533, 1602, 3, 7, UNI_SB__LE } /* sb=oletter */, + { 1, 1424, 2101, 8, 2, UNI_CCC__129 } /* ccc=ccc129 */, + { 0, 461, 1834, 2, 11, UNI_SORA } /* issorasompeng */, + { 5, 1790, 599, 5, 2, UNI_COMPEX } /* nfcqc=n */, + { 0, 1667, 673, 4, 5, UNI_INOSAGE } /* blk=osage */, + { 6, 2302, 599, 3, 2, -UNI_IDC } /* idc=n */, + { 0, 4424, 39, 17, 4, UNI_BHKS } /* scriptextensions=bhks */, + { 0, 1834, 0, 11, 0, UNI_SORA } /* sorasompeng */, + { 4, 1209, 0, 4, 0, UNI_THAI } /* thai */, + { 0, 339, 7425, 4, 4, UNI_CCC__216 } /* ccc=atar */, + { 0, 7011, 2084, 24, 2, UNI_CCC__11 } /* canonicalcombiningclass=11 */, + { 0, 461, 1294, 2, 9, UNI_NBAT } /* isnabataean */, + { 1, 292, 4403, 2, 4, UNI_NV__3_SLASH_2 } /* nv=3/2 */, + { 13, 1894, 353, 12, 4, UNI_BIDIM } /* bidimirrored=yes */, + { 0, 1198, 5694, 3, 10, UNI_COUNTINGROD } /* incountingrod */, + { 0, 298, 585, 2, 5, UNI_RI } /* ri=true */, + { 0, 11, 649, 1, 4, UNI_ADLM } /* adlam */, + { 1, 4569, 353, 5, 2, UNI_XPOSIXUPPER } /* upper=y */, + { 3, 5799, 6103, 5, 13, UNI_SUPMATHOPERATORS } /* insupmathoperators */, + { 0, 7267, 6324, 16, 6, UNI_CF } /* generalcategory=format */, + { 1, 1102, 825, 4, 7, UNI_SHAW } /* scx=shavian */, + { 8, 292, 2184, 4, 8, UNI_NV__11_SLASH_12 } /* nv=9.167e-01 */, + { 1, 4, 5671, 2, 4, -UNI_LOE } /* loe=no */, + { 0, 461, 718, 2, 7, UNI_KNDA } /* iskannada */, + { 2, 1102, 1522, 4, 8, UNI_UGAR } /* scx=ugaritic */, + { 2, 1198, 81, 7, 2, UNI_CJKEXTG } /* incjkextg */, + { 0, 7011, 344, 24, 2, UNI_CCC__21 } /* canonicalcombiningclass=21 */, + { 2, 2665, 1104, 12, 2, UNI_patsyn_values_index } /* patternsyntax= */, + { 3, 309, 3421, 2, 15, UNI_NARB } /* inoldnortharabian */, + { 1, 887, 2656, 5, 3, UNI_AGE__15 } /* age=15.0 */, + { 2, 5553, 274, 21, 1, UNI_cwcm_values_index } /* changeswhencasemapped= */, + { 4, 5637, 959, 21, 6, UNI_GCB__EX } /* graphemeclusterbreak=extend */, + { 5, 271, 700, 4, 2, UNI_WB__EB } /* gcb=em */, + { 25, 30, 5390, 1, 9, UNI_CHER } /* ischerokee */, + { 1, 2494, 5292, 4, 16, UNI_INPUNCTUATION } /* isgeneralpunctuation */, + { 2, 6165, 1509, 3, 8, UNI_SC__JAVA } /* sc=javanese */, + { 12, 4424, 244, 17, 4, UNI_ZZZZ } /* scriptextensions=zzzz */, + { 2, 8071, 6554, 30, 4, UNI_CJKEXTC } /* blk=cjkunifiedideographsextensionc */, + { 0, 2324, 4651, 6, 8, UNI_INBOPOMOFO } /* block=bopomofo */, + { 0, 2324, 5876, 6, 9, UNI_INSUNDANESE } /* block=sundanese */, + { 0, 753, 599, 6, 3, UNI_NFKCQC__N } /* nfkcqc=no */, + { 0, 3892, 585, 16, 5, UNI_STERM } /* sentenceterminal=true */, + { 9, 1021, 0, 6, 0, UNI_WCHO } /* wancho */, + { 0, 1667, 2411, 4, 8, UNI_INKATAKANA } /* blk=katakana */, + { 0, 5895, 1269, 6, 3, UNI_SUPPUAB } /* issuppuab */, + { 2, 1494, 3639, 7, 9, UNI_GEORGIANEXT } /* georgianextended */, + { 5, 641, 1874, 6, 8, UNI_LB__H2 } /* hst=lvsyllable */, + { 8, 30, 1882, 1, 12, UNI_BIDIC } /* isbidicontrol */, + { 0, 4176, 0, 4, 0, UNI_HANG } /* hang */, + { 3, 1243, 6462, 4, 25, UNI_SHORTHANDFORMATCONTROLS } /* block=shorthandformatcontrols */, + { 3, 2, 585, 3, 5, UNI_CWL } /* cwl=true */, + { 16, 2494, 2370, 3, 12, UNI_GREEKEXT } /* isgreekextended */, + { 0, 6041, 5089, 20, 3, UNI_BPT__C } /* bidipairedbrackettype=c */, + { 3, 7495, 345, 28, 2, UNI_CCC__118 } /* canonicalcombiningclass=ccc118 */, + { 5, 461, 1556, 2, 6, UNI_ARROWS } /* isarrows */, + { 10, 4519, 1505, 14, 4, UNI_CYRILLICEXTA } /* block=cyrillicexta */, + { 4, 1823, 446, 7, 4, UNI_PHLI } /* script=phli */, + { 0, 461, 1033, 2, 8, UNI_JAMOEXTB } /* isjamoextb */, + { 0, 261, 585, 5, 5, UNI_CWKCF } /* cwkcf=true */, + { 0, 3391, 290, 14, 1, UNI_NV__24 } /* numericvalue=24 */, + { 5, 5216, 2619, 7, 12, UNI_LOWSURROGATES } /* block=lowsurrogates */, + { 2, 1102, 51, 4, 4, UNI_CANS } /* scx=cans */, + { 3, 292, 295, 3, 1, UNI_NV__9 } /* nv=9 */, + { 1, 298, 353, 2, 4, UNI_RI } /* ri=yes */, + { 0, 1667, 6776, 4, 14, UNI_MEETEIMAYEKEXT } /* blk=meeteimayekext */, + { 0, 1198, 8474, 5, 33, UNI_CJKCOMPATIDEOGRAPHSSUP } /* incjkcompatibilityideographssupplement */, + { 0, 4941, 4272, 7, 16, UNI_INKHITANSMALLSCRIPT } /* block=khitansmallscript */, + { 6, 1823, 430, 7, 3, UNI_SC__NKO } /* script=nko */, + { 0, 3040, 353, 13, 4, UNI_QMARK } /* quotationmark=yes */, + { 4, 339, 2222, 3, 2, UNI_CCC__6 } /* ccc=6 */, + { 1, 1726, 3790, 7, 5, UNI_ARABICMATH } /* isarabicmath */, + { 2, 1667, 6351, 4, 23, UNI_COMPATJAMO } /* blk=hangulcompatibilityjamo */, + { 1, 2324, 6557, 9, 19, UNI_CJKCOMPATIDEOGRAPHSSUP } /* block=cjkcompatideographssup */, + { 8, 2324, 6900, 6, 23, UNI_BYZANTINEMUSIC } /* block=byzantinemusicalsymbols */, + { 2, 4461, 0, 11, 0, UNI_SGNW } /* signwriting */, + { 4, 3407, 1805, 14, 5, UNI_NV__400000 } /* numericvalue=400000 */, + { 8, 1174, 17, 3, 1, UNI_EA__H } /* ea=h */, + { 2, 8660, 0, 34, 0, UNI_UCAS } /* unifiedcanadianaboriginalsyllabics */, + { 30, 3633, 0, 16, 0, UNI_LATINEXTD } /* inlatinextendedd */, + { 8, 5799, 4150, 5, 11, UNI_SUPPUNCTUATION } /* insuppunctuation */, + { 0, 6816, 934, 25, 6, -UNI_CWKCF } /* changeswhennfkccasefolded=false */, + { 0, 5391, 0, 18, 0, UNI_CHEROKEESUP } /* cherokeesupplement */, + { 0, 3817, 3846, 14, 2, UNI_NV__1_SLASH_8 } /* numericvalue=1/8 */, + { 1, 1667, 2786, 4, 14, UNI_HIGHSURROGATES } /* blk=highsurrogates */, + { 2, 1823, 5876, 7, 9, UNI_SUND } /* script=sundanese */, + { 2, 461, 779, 2, 4, UNI_OSMA } /* isosma */, + { 8, 1102, 108, 4, 4, UNI_KAWI } /* scx=kawi */, + { 8, 6618, 4107, 5, 12, UNI_INPC__LEFTANDRIGHT } /* inpc=leftandright */, + { 0, 7011, 8640, 24, 13, UNI_CCC__214 } /* canonicalcombiningclass=attachedabove */, + { 0, 2692, 0, 13, 0, UNI_VERTICALFORMS } /* verticalforms */, + { 0, 4424, 90, 17, 4, UNI_GUJR } /* scriptextensions=gujr */, + { 0, 3863, 1314, 14, 2, UNI_NV__800 } /* numericvalue=800 */, + { 2, 5205, 8374, 5, 33, UNI_MISCPICTOGRAPHS } /* blk=miscellaneoussymbolsandpictographs */, + { 1, 7011, 290, 25, 2, UNI_CCC__IS } /* canonicalcombiningclass=240 */, + { 4, 4360, 119, 10, 2, UNI_LB__AL } /* linebreak=al */, + { 2, 7495, 348, 27, 2, UNI_CCC__91 } /* canonicalcombiningclass=ccc91 */, + { 0, 2766, 4191, 3, 15, UNI_LOWERCASELETTER } /* gc=lowercaseletter */, + { 2, 6165, 2244, 3, 12, UNI_HUNG } /* sc=oldhungarian */, + { 4, 5979, 5993, 3, 7, UNI_VO__R } /* vo=rotated */, + { 1, 7892, 599, 16, 3, -UNI_UIDEO } /* unifiedideograph=no */, + { 2, 8, 934, 3, 2, -UNI_PCM } /* pcm=f */, + { 0, 2718, 384, 3, 2, UNI_BC__EN } /* bc=en */, + { 0, 2832, 3640, 10, 9, UNI_CYRILLICEXTD } /* iscyrillicextendedd */, + { 0, 578, 2165, 5, 2, UNI_CCC__DB } /* ccc=233 */, + { 8, 5637, 543, 21, 2, UNI_WB__EB } /* graphemeclusterbreak=eb */, + { 2, 461, 3584, 3, 15, UNI_HIGHPUSURROGATES } /* ishighpusurrogates */, + { 3, 461, 1853, 2, 11, UNI_SYLO } /* issylotinagri */, + { 0, 6165, 5185, 3, 20, UNI_HLUW } /* sc=anatolianhieroglyphs */, + { 0, 1667, 5694, 5, 10, UNI_COUNTINGROD } /* blk=countingrod */, + { 1, 2536, 2728, 4, 3, UNI_JG__ALEF } /* jg=alef */, + { 0, 2401, 6193, 8, 5, UNI_ETHIOPICSUP } /* inethiopicsup */, + { 0, 4424, 880, 17, 7, UNI_ZZZZ } /* scriptextensions=unknown */, + { 4, 6165, 1209, 3, 4, UNI_THAI } /* sc=thai */, + { 1, 7267, 2317, 16, 6, UNI_N } /* generalcategory=number */, + { 9, 716, 3746, 4, 14, UNI_KAKTOVIKNUMERALS } /* inkaktoviknumerals */, + { 0, 1255, 0, 4, 0, UNI_SIDD } /* sidd */, + { 1, 3177, 2538, 14, 2, UNI_EA__A } /* eastasianwidth=a */, + { 6, 5216, 5635, 17, 3, UNI_LATINEXTG } /* block=latinextendedg */, + { 0, 309, 683, 2, 5, UNI_INTAKRI } /* intakri */, + { 2, 4424, 1543, 17, 4, UNI_KHAR } /* scriptextensions=khar */, + { 2, 461, 678, 2, 5, UNI_RUNR } /* isrunic */, + { 1, 6076, 2370, 7, 7, UNI_GREEKEXT } /* block=greekext */, + { 2, 2514, 3788, 3, 15, UNI_MISCMATHSYMBOLSA } /* ismiscmathsymbolsa */, + { 0, 4391, 289, 16, 1, UNI_NV__3_SLASH_20 } /* numericvalue=3/20 */, + { 1, 1102, 5958, 4, 4, UNI_SINH } /* scx=sinh */, + { 1, 2002, 3268, 7, 5, UNI_POSIXALNUM } /* isposixalnum */, + { 12, 6165, 917, 3, 8, UNI_BASS } /* sc=bassavah */, + { 9, 5532, 353, 21, 4, UNI_CWCF } /* changeswhencasefolded=yes */, + { 0, 6165, 11, 3, 4, UNI_SC__ADLM } /* sc=adlm */, + { 4, 2301, 352, 10, 3, UNI_XIDC } /* xidcontinue=y */, + { 9, 6797, 0, 18, 0, UNI_DEVANAGARIEXT } /* devanagariextended */, + { 2, 3407, 389, 14, 1, UNI_NV__46 } /* numericvalue=46 */, + { 8, 7274, 128, 9, 2, UNI_ME } /* category=me */, + { 41562, 5916, 585, 21, 5, UNI_LOE } /* logicalorderexception=true */, + { 1, 1272, 2373, 4, 5, UNI_CJKEXTE } /* iscjkexte */, + { 1, 1174, 0, 3, 0, UNI_ea_values_index } /* ea= */, + { 3, 2401, 620, 8, 5, UNI_ETHIOPICEXT } /* inethiopicext */, + { 16, 461, 4002, 2, 14, UNI_SK } /* ismodifiersymbol */, + { 1, 6165, 997, 3, 6, UNI_SC__KTHI } /* sc=kaithi */, + { 1, 1102, 82, 4, 4, UNI_GONG } /* scx=gong */, + { 6, 1102, 47, 4, 4, UNI_CAKM } /* scx=cakm */, + { 2, 6427, 3301, 13, 12, UNI_JG__VERTICALTAIL } /* joininggroup=verticaltail */, + { 1, 779, 0, 4, 0, UNI_OSMA } /* osma */, + { 1, 7011, 1153, 25, 2, UNI_CCC__L } /* canonicalcombiningclass=224 */, + { 10, 6165, 60, 4, 3, UNI_CHRS } /* sc=chrs */, + { 6, 4424, 1543, 17, 10, UNI_KHAR } /* scriptextensions=kharoshthi */, + { 0, 7752, 5427, 24, 6, UNI_JG__MANICHAEANTHAMEDH } /* joininggroup=manichaeanthamedh */, + { 1, 2180, 2193, 5, 7, UNI_NV__3_SLASH_64 } /* nv=4.688e-02 */, + { 0, 6076, 5863, 11, 13, UNI_GEORGIANSUP } /* block=georgiansupplement */, + { 3, 1618, 934, 10, 2, -UNI_SD } /* softdotted=f */, + { 4, 1667, 1872, 4, 11, UNI_YISYLLABLES } /* blk=yisyllables */, + { 1, 2208, 1805, 4, 4, UNI_NV__50000 } /* nv=50000 */, + { 8, 4424, 369, 17, 4, UNI_GOTH } /* scriptextensions=goth */, + { 1, 4845, 352, 16, 5, UNI__PERL_PATWS } /* patternwhitespace=yes */, + { 1, 7648, 4602, 18, 7, UNI_DT__INIT } /* decompositiontype=initial */, + { 0, 2280, 343, 11, 1, UNI_IN__11 } /* presentin=11 */, + { 0, 292, 2165, 3, 2, UNI_NV__33 } /* nv=33 */, + { 6, 5156, 2768, 9, 6, UNI_WB__XX } /* wordbreak=other */, + { 5, 0, 0, 1, 0, UNI_L } /* l */, + { 0, 1391, 283, 3, 2, UNI_WB__NU } /* wb=nu */, + { 4, 461, 2483, 2, 5, UNI_CASED } /* iscased */, + { 21, 2752, 8504, 11, 4, UNI_ecomp_values_index } /* emojicomponent= */, + { 0, 3130, 2370, 5, 7, UNI_GREEKEXT } /* blk=greekext */, + { 0, 7198, 5409, 5, 17, UNI_SMALLKANAEXT } /* blk=smallkanaextension */, + { 3, 461, 8, 2, 3, UNI_PCM } /* ispcm */, + { 2, 5616, 0, 21, 0, UNI_CWU } /* changeswhenuppercased */, + { 11, 2324, 8660, 6, 43, UNI_UCASEXTA } /* block=unifiedcanadianaboriginalsyllabicsextendeda */, + { 1, 4360, 3634, 10, 2, UNI_LB__NL } /* linebreak=nl */, + { 2, 2280, 519, 9, 2, UNI_IN__7 } /* presentin=7 */, + { 2, 2324, 1484, 6, 8, UNI_INBUGINESE } /* block=buginese */, + { 8, 6165, 663, 3, 5, UNI_SC__LIMB } /* sc=limbu */, + { 1, 5255, 599, 20, 3, -UNI_EXTPICT } /* extendedpictographic=no */, + { 2, 510, 2164, 4, 8, UNI_NV__1_SLASH_3 } /* nv=3.333e-01 */, + { 8, 6165, 806, 3, 4, UNI_SC__SHRD } /* sc=shrd */, + { 12, 1102, 493, 4, 4, UNI_KHOJ } /* scx=khoj */, + { 0, 3633, 4770, 15, 10, UNI_LATINEXTADDITIONAL } /* inlatinextendedadditional */, + { 0, 4620, 0, 16, 0, UNI_LINEARBSYLLABARY } /* linearbsyllabary */, + { 0, 2287, 2656, 4, 3, UNI_IN__15 } /* in=15.0 */, + { 0, 1102, 2735, 3, 7, UNI_ARAB } /* scx=arabic */, + { 0, 2718, 3106, 3, 12, UNI_BC__AL } /* bc=arabicletter */, + { 3, 939, 599, 5, 3, -UNI_ECOMP } /* ecomp=no */, + { 0, 1102, 1285, 4, 9, UNI_SIND } /* scx=khudawadi */, + { 17, 6287, 0, 14, 0, UNI_BC__L } /* bc=lefttoright */, + { 19, 461, 1914, 2, 7, UNI_UCASEXT } /* isucasext */, + { 0, 4651, 0, 11, 0, UNI_BOPOMOFOEXT } /* bopomofoext */, + { 0, 7011, 1318, 25, 2, UNI_CCC__B } /* canonicalcombiningclass=220 */, + { 0, 2324, 4926, 6, 8, UNI_TAMILSUP } /* block=tamilsup */, + { 14, 1102, 2068, 4, 12, UNI_MEND } /* scx=mendekikakui */, + { 1, 7724, 599, 17, 3, -UNI_VS } /* variationselector=no */, + { 8, 71, 599, 3, 2, -UNI_CWU } /* cwu=n */, + { 4, 4554, 0, 5, 0, UNI_TITLE } /* title */, + { 2, 33, 4441, 1, 16, UNI_SMALLFORMS } /* smallformvariants */, + { 11, 1823, 1027, 7, 4, UNI_SC__YEZI } /* script=yezi */, + { 0, 7591, 2041, 3, 2, UNI_LB__H3 } /* lb=h3 */, + { 0, 5065, 5047, 13, 6, UNI_JG__MANICHAEANDALETH } /* jg=manichaeandaleth */, + { 0, 4360, 3325, 10, 12, UNI_LB__HL } /* linebreak=hebrewletter */, + { 2, 3407, 1314, 14, 2, UNI_NV__400 } /* numericvalue=400 */, + { 1, 1102, 86, 4, 4, UNI_GREK } /* scx=grek */, + { 2, 1667, 1227, 4, 7, UNI_INMAKASAR } /* blk=makasar */, + { 0, 2514, 1095, 3, 3, UNI_MERC } /* ismerc */, + { 3, 1102, 35, 4, 4, UNI_BATK } /* scx=batk */, + { 3, 261, 934, 5, 6, -UNI_CWKCF } /* cwkcf=false */, + { 0, 1823, 51, 7, 4, UNI_CANS } /* script=cans */, + { 0, 6618, 4111, 8, 8, UNI_INPC__TOPANDRIGHT } /* inpc=topandright */, + { 0, 1823, 1262, 7, 7, UNI_SOYO } /* script=soyombo */, + { 1, 1102, 571, 4, 7, UNI_AVST } /* scx=avestan */, + { 0, 7267, 3709, 16, 11, UNI_MC } /* generalcategory=spacingmark */, + { 1, 461, 5274, 2, 18, UNI_HALFMARKS } /* iscombininghalfmarks */, + { 1, 4424, 236, 17, 4, UNI_ZANB } /* scriptextensions=zanb */, + { 0, 1823, 176, 7, 4, UNI_SC__ROHG } /* script=rohg */, + { 0, 1409, 6957, 5, 9, UNI_LATINEXTE } /* latinextendede */, + { 4, 33, 1609, 1, 9, UNI_SMALLFORMS } /* smallforms */, + { 6, 3014, 891, 12, 2, UNI_IN__11 } /* presentin=v110 */, + { 0, 3633, 4770, 10, 10, UNI_LATINEXTADDITIONAL } /* inlatinextadditional */, + { 2, 1322, 0, 9, 0, UNI_ITAL } /* olditalic */, + { 1, 1667, 1522, 4, 8, UNI_INUGARITIC } /* blk=ugaritic */, + { 0, 1883, 585, 11, 5, UNI_BIDIC } /* bidicontrol=true */, + { 2, 7274, 2483, 9, 11, UNI_CASEDLETTER } /* category=casedletter */, + { 0, 7274, 2621, 9, 9, UNI__PERL_SURROGATE } /* category=surrogate */, + { 3, 1667, 81, 9, 2, UNI_CJKEXTG } /* blk=cjkextg */, + { 3, 2503, 353, 5, 4, UNI_JOINC } /* joinc=yes */, + { 11, 1065, 395, 5, 2, UNI_NV__1_SLASH_16 } /* nv=1/16 */, + { 3, 438, 0, 4, 0, UNI_OLCK } /* olck */, + { 1, 339, 2289, 3, 3, UNI_CCC__14 } /* ccc=14 */, + { 0, 2536, 3294, 3, 7, UNI_JG__SEMKATH } /* jg=semkath */, + { 0, 2324, 0, 9, 0, UNI_CJK } /* block=cjk */, + { 2, 5068, 0, 4, 0, UNI_MANI } /* mani */, + { 1, 2302, 352, 9, 5, UNI_IDC } /* idcontinue=yes */, + { 2, 1102, 144, 4, 4, UNI_NEWA } /* scx=newa */, + { 0, 3014, 295, 11, 2, UNI_IN__9 } /* presentin=v90 */, + { 0, 1667, 1562, 4, 10, UNI_INNAGMUNDARI } /* blk=nagmundari */, + { 3, 4970, 585, 13, 2, UNI_EMOD } /* emojimodifier=t */, + { 5, 461, 5857, 2, 9, UNI_MONG } /* ismongolian */, + { 0, 3014, 2117, 11, 2, UNI_IN__6_DOT_2 } /* presentin=v62 */, + { 1, 6866, 599, 24, 3, -UNI_COMPEX } /* fullcompositionexclusion=no */, + { 0, 1726, 4531, 6, 6, UNI_ARABICEXTC } /* isarabicextc */, + { 4, 461, 4371, 2, 6, UNI_XPOSIXSPACE } /* iswspace */, + { 2, 2324, 1294, 6, 9, UNI_INNABATAEAN } /* block=nabataean */, + { 1, 5156, 543, 10, 2, UNI_WB__EB } /* wordbreak=eb */, + { 16, 461, 786, 2, 4, UNI_HMNP } /* ishmnp */, + { 2, 3803, 353, 14, 2, UNI_NFKCQC__Y } /* nfkcquickcheck=y */, + { 1, 5065, 4751, 13, 5, UNI_JG__MANICHAEANSADHE } /* jg=manichaeansadhe */, + { 4, 1102, 148, 4, 4, UNI_ORYA } /* scx=orya */, + { 3, 5658, 1455, 15, 10, UNI_DEP } /* identifiertype=deprecated */, + { 0, 3391, 1805, 14, 7, UNI_NV__20000000 } /* numericvalue=20000000 */, + { 0, 2324, 6382, 9, 18, UNI_CJKCOMPATFORMS } /* block=cjkcompatibilityforms */, + { 4, 1391, 543, 3, 3, UNI_WB__EB } /* wb=ebg */, + { 0, 1790, 353, 5, 4, UNI_NFCQC__Y } /* nfcqc=yes */, + { 1, 461, 917, 2, 4, UNI_BASS } /* isbass */, + { 0, 621, 0, 2, 0, UNI_CE } /* ce */, + { 1, 292, 796, 3, 3, UNI_NV__NAN } /* nv=nan */, + { 0, 309, 322, 2, 5, UNI_VSSUP } /* invssup */, + { 0, 2287, 393, 3, 2, UNI_IN__15 } /* in=15 */, + { 2, 1424, 346, 7, 2, UNI_CCC__84 } /* ccc=ccc84 */, + { 0, 2180, 1805, 4, 4, UNI_NV__40000 } /* nv=40000 */, + { 0, 74, 1687, 2, 9, UNI_CPMN } /* cyprominoan */, + { 2, 2324, 653, 6, 5, UNI_INBUHID } /* block=buhid */, + { 6, 1823, 1484, 7, 8, UNI_SC__BUGI } /* script=buginese */, + { 1, 2718, 0, 3, 0, UNI_bc_values_index } /* bc= */, + { 1, 1102, 1248, 4, 7, UNI_PHAG } /* scx=phagspa */, + { 5, 4424, 1592, 17, 4, UNI_SAUR } /* scriptextensions=saur */, + { 0, 6165, 648, 3, 5, UNI_SC__ADLM } /* sc=adlam */, + { 0, 4424, 5440, 17, 20, UNI_HMNP } /* scriptextensions=nyiakengpuachuehmong */, + { 0, 7887, 4158, 28, 4, UNI_CJKEXTD } /* incjkunifiedideographsextensiond */, + { 0, 461, 90, 2, 4, UNI_GUJR } /* isgujr */, + { 2, 1894, 599, 12, 3, -UNI_BIDIM } /* bidimirrored=no */, + { 1, 5255, 6621, 19, 3, UNI_EXTPICT } /* extendedpictographic=t */, + { 0, 292, 2155, 3, 9, UNI_NV__1_SLASH_32 } /* nv=3.125e-02 */, + { 0, 8246, 6622, 23, 20, UNI_INPC__TOPANDBOTTOMANDLEFT } /* indicpositionalcategory=topandbottomandleft */, + { 1, 6165, 779, 3, 4, UNI_OSMA } /* sc=osma */, + { 0, 8246, 6629, 24, 13, UNI_INPC__BOTTOMANDLEFT } /* indicpositionalcategory=bottomandleft */, + { 1, 5799, 5813, 5, 7, UNI_SUPARROWSB } /* insuparrowsb */, + { 0, 309, 5897, 2, 19, UNI_SUPARROWSC } /* insupplementalarrowsc */, + { 1, 7591, 153, 3, 2, UNI_LB__SG } /* lb=sg */, + { 1, 8343, 1168, 31, 6, UNI_INSC__CONSONANTMEDIAL } /* indicsyllabiccategory=consonantmedial */, + { 0, 533, 0, 3, 0, UNI_sb_values_index } /* sb= */, + { 3, 2324, 5353, 6, 20, UNI_ININSCRIPTIONALPAHLAVI } /* block=inscriptionalpahlavi */, + { 4, 2432, 5848, 9, 9, UNI_MYANMAREXTA } /* inmyanmarextendeda */, + { 1, 832, 599, 5, 3, -UNI_STERM } /* sterm=no */, + { 2, 2280, 546, 10, 3, UNI_IN__3 } /* presentin=3.0 */, + { 0, 1667, 6909, 4, 14, UNI_MUSIC } /* blk=musicalsymbols */, + { 0, 461, 313, 2, 4, UNI_M } /* ismark */, + { 24, 1200, 8474, 3, 33, UNI_CJKCOMPATIDEOGRAPHSSUP } /* cjkcompatibilityideographssupplement */, + { 5, 1823, 168, 7, 4, UNI_SC__COPT } /* script=qaac */, + { 2, 1667, 1009, 4, 6, UNI_INLYCIAN } /* blk=lycian */, + { 8, 461, 7086, 2, 24, UNI_ARABICPFB } /* isarabicpresentationformsb */, + { 0, 6163, 3217, 14, 4, UNI_INSC__CONSONANTDEAD } /* insc=consonantdead */, + { 0, 2348, 933, 12, 7, -UNI_CI } /* caseignorable=false */, + { 0, 1667, 5857, 4, 9, UNI_INMONGOLIAN } /* blk=mongolian */, + { 3, 4424, 458, 17, 4, UNI_QAAI } /* scriptextensions=qaai */, + { 3, 5156, 507, 10, 2, UNI_WB__DQ } /* wordbreak=dq */, + { 2, 5799, 4607, 12, 13, UNI_SUPPUNCTUATION } /* insupplementalpunctuation */, + { 0, 2766, 106, 3, 2, UNI_ZL } /* gc=zl */, + { 3, 4060, 0, 7, 0, UNI_BRAI } /* braille */, + { 0, 2752, 353, 5, 4, UNI_EMOJI } /* emoji=yes */, + { 8, 2280, 557, 10, 3, UNI_IN__6 } /* presentin=6.0 */, + { 0, 8278, 1926, 13, 7, UNI_MISCSYMBOLS } /* miscellaneoussymbols */, + { 0, 2752, 934, 14, 2, -UNI_ECOMP } /* emojicomponent=f */, + { 16, 5637, 363, 21, 2, UNI_GCB__SM } /* graphemeclusterbreak=sm */, + { 3, 7267, 4075, 16, 14, UNI_SC } /* generalcategory=currencysymbol */, + { 0, 2324, 3567, 6, 16, UNI_HALFANDFULLFORMS } /* block=halfandfullforms */, + { 1, 5205, 3788, 5, 15, UNI_MISCMATHSYMBOLSA } /* blk=miscmathsymbolsa */, + { 1, 1883, 0, 11, 0, UNI_BIDIC } /* bidicontrol */, + { 0, 6450, 1602, 14, 7, UNI_SB__LE } /* sentencebreak=oletter */, + { 0, 1823, 1285, 7, 9, UNI_SC__SIND } /* script=khudawadi */, + { 0, 6618, 6635, 8, 7, UNI_INPC__TOPANDLEFT } /* inpc=topandleft */, + { 0, 1198, 4533, 5, 4, UNI_CJKEXTC } /* incjkextc */, + { 2, 2324, 192, 6, 4, UNI_TAGS } /* block=tags */, + { 0, 5799, 8386, 14, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* insupplementalsymbolsandpictographs */, + { 0, 1102, 1015, 4, 6, UNI_TELU } /* scx=telugu */, + { 0, 309, 6677, 2, 15, UNI_MODIFIERLETTERS } /* inmodifierletters */, + { 3, 461, 668, 2, 5, UNI_OGAM } /* isogham */, + { 3, 7011, 2092, 24, 2, UNI_CCC__25 } /* canonicalcombiningclass=25 */, + { 1, 4424, 3325, 17, 4, UNI_HEBR } /* scriptextensions=hebr */, + { 1, 1102, 418, 4, 4, UNI_KHMR } /* scx=khmr */, + { 0, 6165, 462, 3, 4, UNI_SHAW } /* sc=shaw */, + { 1, 461, 164, 2, 4, UNI_PHNX } /* isphnx */, + { 0, 6165, 772, 3, 7, UNI_OLCK } /* sc=olchiki */, + { 0, 7011, 348, 24, 2, UNI_CCC__91 } /* canonicalcombiningclass=91 */, + { 2, 292, 2098, 3, 9, UNI_NV__1_SLASH_7 } /* nv=1.429e-01 */, + { 2, 2324, 5694, 7, 18, UNI_COUNTINGROD } /* block=countingrodnumerals */, + { 1, 339, 1678, 4, 7, UNI_CCC__1 } /* ccc=overlay */, + { 6, 4569, 352, 8, 5, UNI_XPOSIXUPPER } /* uppercase=yes */, + { 0, 4150, 0, 11, 0, UNI_P } /* punctuation */, + { 0, 1823, 5857, 7, 9, UNI_SC__MONG } /* script=mongolian */, + { 0, 7267, 1393, 15, 2, UNI_M } /* generalcategory=m */, + { 0, 1734, 189, 3, 3, UNI_SGNW } /* issgnw */, + { 0, 461, 991, 2, 6, UNI_HATR } /* ishatran */, + { 6, 1667, 6557, 7, 16, UNI_CJKCOMPATIDEOGRAPHS } /* blk=cjkcompatideographs */, + { 1, 461, 1834, 2, 4, UNI_SORA } /* issora */, + { 0, 7804, 0, 11, 0, UNI_IDEO } /* ideographic */, + { 4, 2362, 0, 8, 0, UNI_ASSIGNED } /* assigned */, + { 1, 32, 585, 2, 5, UNI_VS } /* vs=true */, + { 1, 2324, 4896, 6, 5, UNI_INBAMUM } /* block=bamum */, + { 0, 7274, 3263, 9, 13, UNI_XPOSIXDIGIT } /* category=decimalnumber */, + { 8, 6495, 0, 5, 0, UNI_MUSIC } /* music */, + { 1, 1823, 1248, 7, 7, UNI_SC__PHAG } /* script=phagspa */, + { 2, 6165, 43, 3, 4, UNI_SC__BUHD } /* sc=buhd */, + { 1, 7648, 940, 18, 3, UNI_DT__COM } /* decompositiontype=com */, + { 5, 309, 1176, 2, 3, UNI_IN__NA } /* in=na */, + { 2, 4926, 0, 5, 0, UNI_TAML } /* tamil */, + { 16, 510, 2172, 4, 8, UNI_NV__3_SLASH_8 } /* nv=3.750e-01 */, + { 1, 309, 3727, 2, 9, UNI_INMALAYALAM } /* inmalayalam */, + { 0, 3892, 0, 16, 0, UNI_STERM } /* sentenceterminal */, + { 1, 578, 290, 5, 2, UNI_CCC__IS } /* ccc=240 */, + { 0, 7267, 3791, 16, 10, UNI_SM } /* generalcategory=mathsymbol */, + { 4, 7495, 3404, 27, 2, UNI_CCC__23 } /* canonicalcombiningclass=ccc23 */, + { 6, 4043, 0, 17, 0, UNI_IDSB } /* idsbinaryoperator */, + { 4, 7267, 363, 16, 2, UNI_SM } /* generalcategory=sm */, + { 10, 363, 0, 2, 0, UNI_SM } /* sm */, + { 2, 6450, 2768, 13, 6, UNI_SB__XX } /* sentencebreak=other */, + { 0, 1200, 70, 5, 2, UNI_CJKEXTC } /* cjkextc */, + { 14, 7383, 3505, 9, 3, UNI_BC__ET } /* bidiclass=et */, + { 11, 32, 599, 2, 2, -UNI_VS } /* vs=n */, + { 3, 1823, 1635, 7, 4, UNI_WARA } /* script=wara */, + { 1, 521, 585, 6, 5, UNI_PATSYN } /* patsyn=true */, + { 4, 2, 3539, 1, 6, UNI_CPRT } /* cypriot */, + { 5, 1667, 357, 4, 6, UNI_INCHAKMA } /* blk=chakma */, + { 2, 1823, 5440, 7, 20, UNI_HMNP } /* script=nyiakengpuachuehmong */, + { 1, 1823, 5208, 6, 8, UNI_SC__MYMR } /* script=myanmar */, + { 0, 6618, 1630, 20, 5, UNI_INPC__TOPANDBOTTOMANDRIGHT } /* inpc=topandbottomandright */, + { 0, 1823, 991, 7, 6, UNI_HATR } /* script=hatran */, + { 0, 6165, 1086, 3, 4, UNI_SC__KTHI } /* sc=kthi */, + { 4, 6165, 156, 3, 4, UNI_SC__OUGR } /* sc=ougr */, + { 3, 3817, 290, 15, 1, UNI_NV__1_SLASH_4 } /* numericvalue=1/4 */, + { 4, 1479, 5169, 5, 4, UNI_XPOSIXSPACE } /* spaceperl */, + { 5, 4424, 806, 17, 4, UNI_SHRD } /* scriptextensions=shrd */, + { 2, 461, 5939, 2, 5, UNI__PERL_NCHAR } /* isnchar */, + { 5, 6165, 5391, 3, 8, UNI_CHER } /* sc=cherokee */, + { 0, 615, 0, 4, 0, UNI_ELYM } /* elym */, + { 0, 2301, 353, 4, 4, UNI_XIDC } /* xidc=yes */, + { 0, 1102, 3325, 4, 6, UNI_HEBR } /* scx=hebrew */, + { 1, 20, 934, 3, 6, -UNI_XPOSIXXDIGIT } /* hex=false */, + { 1, 1823, 1685, 7, 11, UNI_SC__CPMN } /* script=cyprominoan */, + { 0, 339, 6288, 2, 3, UNI_CCC__L } /* ccc=l */, + { 1, 7495, 2154, 27, 2, UNI_CCC__13 } /* canonicalcombiningclass=ccc13 */, + { 0, 309, 2302, 2, 3, UNI_INIDC } /* inidc */, + { 8, 733, 6142, 3, 21, UNI_EARLYDYNASTICCUNEIFORM } /* inearlydynasticcuneiform */, + { 36, 2432, 0, 9, 0, UNI_INMYANMAR } /* inmyanmar */, + { 4, 4424, 1484, 17, 4, UNI_BUGI } /* scriptextensions=bugi */, + { 0, 4360, 461, 10, 2, UNI_LB__IS } /* linebreak=is */, + { 5, 309, 2393, 2, 8, UNI_INCYRILLIC } /* incyrillic */, + { 2, 2514, 0, 3, 0, UNI_M } /* ism */, + { 0, 1823, 140, 7, 4, UNI_NARB } /* script=narb */, + { 5, 4360, 7537, 10, 10, UNI_LB__AL } /* linebreak=alphabetic */, + { 0, 148, 0, 4, 0, UNI_ORYA } /* orya */, + { 3, 4424, 1234, 17, 4, UNI_MULT } /* scriptextensions=mult */, + { 5, 1823, 1095, 8, 3, UNI_MERC } /* script=merc */, + { 1, 2718, 4880, 3, 16, UNI_BC__S } /* bc=segmentseparator */, + { 13, 2685, 387, 4, 2, UNI_IN__5_DOT_2 } /* in=5.2 */, + { 4, 4424, 1582, 17, 10, UNI_PHNX } /* scriptextensions=phoenician */, + { 0, 3514, 7545, 10, 20, UNI_ARABICPFA } /* block=arabicpresentationformsa */, + { 5, 1994, 599, 7, 3, -UNI_RADICAL } /* radical=no */, + { 0, 4424, 82, 17, 4, UNI_GONG } /* scriptextensions=gong */, + { 1, 5216, 4659, 11, 9, UNI_LATINEXTC } /* block=latinextendedc */, + { 1, 1823, 732, 7, 7, UNI_SC__LINA } /* script=lineara */, + { 5, 1397, 934, 4, 6, -UNI_IDST } /* idst=false */, + { 8, 7267, 128, 16, 2, UNI_ME } /* generalcategory=me */, + { 0, 2514, 2631, 3, 12, UNI_MAYANNUMERALS } /* ismayannumerals */, + { 3, 30, 6486, 1, 2, UNI_Z } /* isz */, + { 2, 1455, 353, 3, 4, UNI_DEP } /* dep=yes */, + { 0, 2930, 2938, 8, 6, UNI_JT__T } /* jt=transparent */, + { 3, 309, 608, 2, 7, UNI_INELBASAN } /* inelbasan */, + { 5, 1726, 0, 8, 0, UNI_ARAB } /* isarabic */, + { 1, 3391, 2100, 13, 2, UNI_NV__42 } /* numericvalue=42 */, + { 13, 1397, 599, 3, 2, -UNI_IDS } /* ids=n */, + { 11, 2966, 5409, 3, 11, UNI_SMALLKANAEXT } /* insmallkanaext */, + { 2, 2432, 7825, 3, 30, UNI_MATHALPHANUM } /* inmathematicalalphanumericsymbols */, + { 0, 1667, 1003, 4, 6, UNI_INLEPCHA } /* blk=lepcha */, + { 3, 74, 0, 4, 0, UNI_CYRL } /* cyrl */, + { 4, 1823, 1191, 7, 7, UNI_SC__BENG } /* script=bengali */, + { 0, 5595, 353, 21, 2, UNI_CWT } /* changeswhentitlecased=y */, + { 0, 1102, 11, 4, 4, UNI_ADLM } /* scx=adlm */, + { 3, 461, 39, 2, 4, UNI_BHKS } /* isbhks */, + { 3, 1102, 90, 4, 4, UNI_GUJR } /* scx=gujr */, + { 0, 1272, 1505, 5, 4, UNI_CJKEXTA } /* iscjkexta */, + { 0, 7267, 4607, 5, 13, UNI_INPUNCTUATION } /* generalpunctuation */, + { 1, 6165, 1027, 3, 6, UNI_SC__YEZI } /* sc=yezidi */, + { 5, 461, 940, 2, 6, UNI_COMPEX } /* iscompex */, + { 2, 461, 732, 2, 7, UNI_LINA } /* islineara */, + { 1, 2004, 2060, 5, 5, UNI_POSIXALPHA } /* posixalpha */, + { 0, 7383, 3118, 10, 12, UNI_BC__ON } /* bidiclass=otherneutral */, + { 3, 1667, 6487, 4, 13, UNI_ZNAMENNYMUSIC } /* blk=znamennymusic */, + { 0, 309, 5712, 2, 19, UNI_MERO } /* inmeroitichieroglyphs */, + { 1, 1994, 934, 7, 2, -UNI_RADICAL } /* radical=f */, + { 1, 5156, 3325, 10, 12, UNI_LB__HL } /* wordbreak=hebrewletter */, + { 8, 825, 0, 7, 0, UNI_SHAW } /* shavian */, + { 3, 4360, 283, 10, 2, UNI_LB__NU } /* linebreak=nu */, + { 9, 309, 6909, 2, 14, UNI_MUSIC } /* inmusicalsymbols */, + { 4, 7383, 6021, 21, 8, UNI_BC__LRO } /* bidiclass=lefttorightoverride */, + { 4, 2324, 6510, 6, 24, UNI_HIGHPUSURROGATES } /* block=highprivateusesurrogates */, + { 0, 6165, 4926, 3, 5, UNI_SC__TAML } /* sc=tamil */, + { 0, 510, 520, 4, 1, UNI_NV__37 } /* nv=37 */, + { 2, 2280, 2182, 9, 4, UNI_IN__4_DOT_1 } /* presentin=4.1 */, + { 9, 1667, 3692, 4, 14, UNI_LISUSUP } /* blk=lisusupplement */, + { 1, 4620, 0, 7, 0, UNI_LINB } /* linearb */, + { 1, 1530, 3696, 6, 10, UNI_KANASUP } /* iskanasupplement */, + { 2, 4424, 1027, 17, 4, UNI_YEZI } /* scriptextensions=yezi */, + { 0, 2324, 4620, 6, 16, UNI_LINEARBSYLLABARY } /* block=linearbsyllabary */, + { 0, 2718, 143, 3, 2, UNI_BC__BN } /* bc=bn */, + { 2, 1823, 4896, 7, 4, UNI_BAMU } /* script=bamu */, + { 8, 6165, 1334, 3, 4, UNI_SC__PERM } /* sc=perm */, + { 0, 3325, 0, 6, 0, UNI_HEBR } /* hebrew */, + { 2, 4424, 11, 17, 4, UNI_ADLM } /* scriptextensions=adlm */, + { 4, 1272, 5617, 3, 20, UNI_CWU } /* ischangeswhenuppercased */, + { 0, 533, 21, 3, 2, UNI_SB__EX } /* sb=ex */, + { 2, 461, 192, 2, 4, UNI_TAGS } /* istags */, + { 1, 1391, 2411, 3, 8, UNI_WB__KA } /* wb=katakana */, + { 1, 1223, 324, 4, 3, UNI_KANASUP } /* kanasup */, + { 4, 1102, 8667, 4, 18, UNI_CANS } /* scx=canadianaboriginal */, + { 5, 3391, 1318, 13, 2, UNI_NV__20 } /* numericvalue=20 */, + { 0, 1667, 725, 4, 7, UNI_KALI } /* blk=kayahli */, + { 3, 6165, 991, 3, 4, UNI_HATR } /* sc=hatr */, + { 1, 309, 5838, 2, 10, UNI_JAMO } /* inhanguljamo */, + { 4, 2004, 0, 2, 0, UNI_PO } /* po */, + { 7, 3177, 1933, 15, 9, UNI_EA__A } /* eastasianwidth=ambiguous */, + { 0, 1667, 4150, 4, 11, UNI_INPUNCTUATION } /* blk=punctuation */, + { 0, 537, 0, 4, 0, UNI_TANG } /* tang */, + { 0, 309, 8660, 2, 34, UNI_UCAS } /* inunifiedcanadianaboriginalsyllabics */, + { 0, 4424, 102, 17, 4, UNI_HMNG } /* scriptextensions=hmng */, + { 0, 7383, 18, 10, 1, UNI_BC__B } /* bidiclass=b */, + { 1, 521, 353, 6, 4, UNI_PATSYN } /* patsyn=yes */, + { 0, 2324, 3692, 6, 14, UNI_LISUSUP } /* block=lisusupplement */, + { 1, 597, 7011, 6, 5, UNI_DT__NONCANON } /* dt=noncanon */, + { 9, 1823, 975, 7, 8, UNI_SC__GURU } /* script=gurmukhi */, + { 4, 4424, 5682, 17, 5, UNI_GREK } /* scriptextensions=greek */, + { 1, 6165, 678, 3, 5, UNI_RUNR } /* sc=runic */, + { 1, 3391, 3405, 13, 2, UNI_NV__36 } /* numericvalue=36 */, + { 0, 108, 3746, 2, 14, UNI_KAKTOVIKNUMERALS } /* kaktoviknumerals */, + { 1, 7011, 1317, 25, 2, UNI_CCC__AR } /* canonicalcombiningclass=232 */, + { 0, 1823, 90, 7, 4, UNI_SC__GUJR } /* script=gujr */, + { 1, 1823, 1635, 7, 10, UNI_WARA } /* script=warangciti */, + { 11, 5937, 598, 20, 2, UNI_nchar_values_index } /* noncharactercodepoint= */, + { 14, 6165, 1248, 3, 7, UNI_SC__PHAG } /* sc=phagspa */, + { 0, 30, 1917, 1, 4, UNI_EXT } /* isext */, + { 9, 461, 232, 2, 4, UNI_YI } /* isyiii */, + { 1, 1883, 934, 5, 2, -UNI_BIDIC } /* bidic=f */, + { 1, 2324, 772, 6, 7, UNI_OLCK } /* block=olchiki */, + { 0, 7267, 4002, 16, 14, UNI_SK } /* generalcategory=modifiersymbol */, + { 7, 292, 342, 2, 3, UNI_NV__12 } /* nv=12 */, + { 2, 7274, 54, 9, 2, UNI_SC } /* category=sc */, + { 0, 4502, 4344, 5, 16, UNI_LETTERLIKESYMBOLS } /* blk=letterlikesymbols */, + { 0, 8441, 1399, 33, 5, UNI__PERL_PROBLEMATIC_LOCALE_FOLDEDS_START } /* _perl_problematic_locale_foldeds_start */, + { 6, 309, 1853, 2, 11, UNI_INSYLOTINAGRI } /* insylotinagri */, + { 0, 4371, 352, 5, 3, UNI_XPOSIXSPACE } /* wspace=y */, + { 4, 6427, 225, 13, 2, UNI_JG__PE } /* joininggroup=pe */, + { 0, 271, 281, 4, 2, UNI_GCB__XX } /* gcb=xx */, + { 2, 6163, 2382, 5, 5, UNI_INSC__VOWEL } /* insc=vowel */, + { 4, 1726, 2705, 3, 13, UNI_ANCIENTSYMBOLS } /* isancientsymbols */, + { 17, 2514, 747, 3, 6, UNI_MARC } /* ismarchen */, + { 4, 1823, 1015, 7, 6, UNI_SC__TELU } /* script=telugu */, + { 2, 7011, 1318, 24, 3, UNI_WB__EB } /* canonicalcombiningclass=200 */, + { 0, 7267, 5172, 16, 2, UNI_CASEDLETTER } /* generalcategory=l_ */, + { 0, 4424, 0, 17, 0, UNI_scx_values_index } /* scriptextensions= */, + { 5, 2766, 3634, 3, 2, UNI_NL } /* gc=nl */, + { 0, 2842, 0, 6, 0, UNI_ETHI } /* isethi */, + { 0, 42, 3191, 2, 3, UNI_SB__LE } /* sb=le */, + { 0, 597, 3289, 3, 5, UNI_DT__FIN } /* dt=final */, + { 3, 6866, 8554, 21, 4, UNI_compex_values_index } /* fullcompositionexclusion= */, + { 0, 7591, 380, 3, 2, UNI_LB__HY } /* lb=hy */, + { 1, 6062, 8111, 7, 31, UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS } /* block=egyptianhieroglyphformatcontrols */, + { 2, 30, 1014, 1, 7, UNI_INTELUGU } /* intelugu */, + { 1, 7274, 6683, 12, 8, UNI_LO } /* category=otherletter */, + { 13, 1667, 1922, 5, 11, UNI_CHESSSYMBOLS } /* blk=chesssymbols */, + { 0, 6165, 232, 3, 2, UNI_SC__YI } /* sc=yi */, + { 3, 1102, 1635, 4, 10, UNI_WARA } /* scx=warangciti */, + { 1, 1667, 2411, 4, 11, UNI_KATAKANAEXT } /* blk=katakanaext */, + { 2, 1667, 5391, 4, 8, UNI_INCHEROKEE } /* blk=cherokee */, + { 1, 6165, 430, 3, 3, UNI_SC__NKO } /* sc=nko */, + { 0, 2432, 3364, 3, 14, UNI_MISCPICTOGRAPHS } /* inmiscpictographs */, + { 17, 1409, 5848, 5, 9, UNI_LATINEXTA } /* latinextendeda */, + { 2, 7591, 2991, 3, 2, UNI_LB__QU } /* lb=qu */, + { 64, 1823, 55, 7, 4, UNI_CHAM } /* script=cham */, + { 1, 7198, 6965, 7, 22, UNI_SUPERANDSUB } /* blk=superscriptsandsubscripts */, + { 0, 309, 537, 2, 6, UNI_INTANGSA } /* intangsa */, + { 1, 875, 0, 5, 0, UNI_UIDEO } /* uideo */, + { 1, 7648, 1176, 17, 7, UNI_DT__NAR } /* decompositiontype=narrow */, + { 1, 1823, 6081, 6, 9, UNI_SC__GEOR } /* script=georgian */, + { 0, 3325, 0, 4, 0, UNI_HEBR } /* hebr */, + { 0, 605, 5980, 3, 2, UNI_ideo_values_index } /* ideo= */, + { 6, 1726, 8174, 8, 29, UNI_ARABICMATH } /* isarabicmathematicalalphabeticsymbols */, + { 0, 309, 663, 2, 5, UNI_INLIMBU } /* inlimbu */, + { 0, 7267, 199, 16, 2, UNI_TITLE } /* generalcategory=lt */, + { 2, 3391, 2093, 13, 2, UNI_NV__50 } /* numericvalue=50 */, + { 2, 461, 5235, 2, 20, UNI_PC } /* isconnectorpunctuation */, + { 0, 2324, 1812, 6, 11, UNI_INPAHAWHHMONG } /* block=pahawhhmong */, + { 0, 292, 1805, 4, 5, UNI_NV__900000 } /* nv=900000 */, + { 5, 8505, 3001, 3, 7, UNI_NT__NU } /* nt=numeric */, + { 0, 7591, 4206, 3, 15, UNI_LB__OP } /* lb=openpunctuation */, + { 1, 2393, 5848, 8, 9, UNI_CYRILLICEXTA } /* cyrillicextendeda */, + { 0, 3663, 0, 4, 0, UNI_DEVA } /* deva */, + { 0, 6163, 2317, 5, 6, UNI_INSC__NUMBER } /* insc=number */, + { 16, 2324, 3663, 6, 14, UNI_DEVANAGARIEXTA } /* block=devanagariexta */, + { 7, 7383, 6289, 9, 12, UNI_BC__L } /* bidiclass=lefttoright */, + { 0, 1667, 1509, 4, 8, UNI_INJAVANESE } /* blk=javanese */, + { 16, 6165, 128, 3, 4, UNI_MEDF } /* sc=medf */, + { 17, 461, 6776, 2, 11, UNI_MTEI } /* ismeeteimayek */, + { 0, 2324, 5391, 6, 8, UNI_INCHEROKEE } /* block=cherokee */, + { 0, 1221, 4511, 6, 9, UNI_KANAEXTB } /* inkanaextendedb */, + { 1, 1667, 2302, 4, 3, UNI_INIDC } /* blk=idc */, + { 1, 2988, 1795, 13, 6, UNI_NFCQC__M } /* nfcquickcheck=maybe */, + { 2, 4424, 1133, 17, 4, UNI_VITH } /* scriptextensions=vith */, + { 1, 8601, 4710, 7, 15, UNI_SYRIACSUP } /* block=syriacsupplement */, + { 2, 461, 798, 2, 4, UNI_NBAT } /* isnbat */, + { 1, 3014, 3861, 11, 2, UNI_IN__7 } /* presentin=v70 */, + { 1, 1823, 112, 7, 4, UNI_KITS } /* script=kits */, + { 0, 6841, 353, 25, 2, UNI_DI } /* defaultignorablecodepoint=y */, + { 3, 244, 0, 4, 0, UNI_ZZZZ } /* zzzz */, + { 10, 3040, 1669, 12, 2, UNI_qmark_values_index } /* quotationmark= */, + { 4, 461, 1033, 2, 4, UNI_JAMO } /* isjamo */, + { 1, 1667, 688, 4, 5, UNI_INBATAK } /* blk=batak */, + { 0, 4424, 1385, 17, 4, UNI_THAA } /* scriptextensions=thaa */, + { 0, 271, 644, 3, 2, UNI_GCB__L } /* gcb=l */, + { 0, 8343, 3253, 22, 10, UNI_INSC__PUREKILLER } /* indicsyllabiccategory=purekiller */, + { 0, 5216, 4698, 10, 2, UNI_LATIN1 } /* block=latin1 */, + { 7, 1728, 1505, 6, 4, UNI_ARABICEXTA } /* arabicexta */, + { 5, 1823, 144, 7, 4, UNI_NEWA } /* script=newa */, + { 0, 1102, 1117, 4, 4, UNI_TAGB } /* scx=tagb */, + { 0, 3021, 290, 5, 2, UNI_IN__14 } /* in=v140 */, + { 0, 4424, 5712, 17, 19, UNI_MERO } /* scriptextensions=meroitichieroglyphs */, + { 1, 6165, 333, 3, 4, UNI_CARI } /* sc=cari */, + { 14, 6165, 1509, 3, 4, UNI_SC__JAVA } /* sc=java */, + { 1, 1455, 599, 3, 3, -UNI_DEP } /* dep=no */, + { 8, 2988, 599, 13, 2, UNI_COMPEX } /* nfcquickcheck=n */, + { 6, 2324, 5682, 6, 5, UNI_INGREEK } /* block=greek */, + { 3, 2324, 1556, 6, 6, UNI_ARROWS } /* block=arrows */, + { 6, 19, 1104, 3, 2, UNI_ahex_values_index } /* ahex= */, + { 4, 4970, 599, 13, 3, -UNI_EMOD } /* emojimodifier=no */, + { 2, 1391, 5769, 3, 9, UNI_WB__EB } /* wb=emodifier */, + { 0, 8276, 0, 35, 0, UNI_MISCMATHSYMBOLSB } /* inmiscellaneousmathematicalsymbolsb */, + { 0, 1894, 585, 5, 5, UNI_BIDIM } /* bidim=true */, + { 0, 6427, 1755, 13, 8, UNI_JG__SWASHKAF } /* joininggroup=swashkaf */, + { 0, 7214, 295, 25, 1, UNI_CCC__19 } /* canonicalcombiningclass=19 */, + { 1, 461, 248, 2, 2, UNI_CN } /* iscn */, + { 12, 4424, 1227, 17, 4, UNI_MAKA } /* scriptextensions=maka */, + { 0, 461, 6514, 2, 10, UNI_CO } /* isprivateuse */, + { 10, 1409, 4533, 5, 4, UNI_LATINEXTC } /* latinextc */, + { 0, 309, 1125, 2, 8, UNI_INTIFINAGH } /* intifinagh */, + { 1, 461, 5532, 2, 21, UNI_CWCF } /* ischangeswhencasefolded */, + { 3, 309, 1248, 2, 7, UNI_INPHAGSPA } /* inphagspa */, + { 0, 8, 599, 3, 2, -UNI_PCM } /* pcm=n */, + { 3, 7537, 0, 10, 0, UNI_XPOSIXALPHA } /* alphabetic */, + { 0, 6427, 715, 13, 3, UNI_JG__AIN } /* joininggroup=ain */, + { 3, 1102, 1543, 4, 10, UNI_KHAR } /* scx=kharoshthi */, + { 0, 2422, 0, 4, 0, UNI__PERL_SURROGATE } /* iscs */, + { 1, 2208, 2200, 4, 8, UNI_NV__1_SLASH_20 } /* nv=5.000e-02 */, + { 2, 895, 394, 5, 2, UNI_AGE__5_DOT_1 } /* age=v51 */, + { 9, 1667, 2009, 4, 6, UNI_INSYRIAC } /* blk=syriac */, + { 1, 7591, 1763, 3, 8, UNI_LB__LF } /* lb=linefeed */, + { 9, 7011, 2101, 24, 2, UNI_CCC__29 } /* canonicalcombiningclass=29 */, + { 6, 4519, 1687, 8, 9, UNI_INCYPROMINOAN } /* block=cyprominoan */, + { 1, 461, 298, 2, 2, UNI_RI } /* isri */, + { 9, 3817, 1318, 15, 2, UNI_NV__1_SLASH_20 } /* numericvalue=1/20 */, + { 1, 8538, 1628, 20, 7, UNI_VO__U } /* verticalorientation=upright */, + { 0, 1823, 1385, 7, 4, UNI_SC__THAA } /* script=thaa */, + { 1, 370, 3196, 3, 8, UNI_NO } /* othernumber */, + { 0, 916, 933, 4, 7, -UNI_EBASE } /* ebase=false */, + { 9, 3204, 934, 14, 6, -UNI_GREXT } /* graphemeextend=false */, + { 0, 940, 353, 6, 4, UNI_COMPEX } /* compex=yes */, + { 0, 533, 3001, 3, 7, UNI_SB__NU } /* sb=numeric */, + { 5, 1823, 63, 7, 4, UNI_SC__CPMN } /* script=cpmn */, + { 1, 2324, 6154, 6, 9, UNI_INCUNEIFORM } /* block=cuneiform */, + { 0, 6165, 204, 3, 4, UNI_TFNG } /* sc=tfng */, + { 1, 959, 599, 8, 3, -UNI_EXT } /* extender=no */, + { 1, 2766, 252, 3, 2, UNI_CASEDLETTER } /* gc=lc */, + { 2, 7267, 2768, 15, 6, UNI_C } /* generalcategory=other */, + { 3, 4424, 1834, 17, 11, UNI_SORA } /* scriptextensions=sorasompeng */, + { 0, 1667, 7972, 5, 15, UNI_CUNEIFORMNUMBERS } /* blk=cuneiformnumbers */, + { 0, 895, 288, 6, 2, UNI_AGE__13 } /* age=v130 */, + { 4, 4970, 934, 13, 6, -UNI_EMOD } /* emojimodifier=false */, + { 2, 1823, 410, 7, 4, UNI_SC__GONM } /* script=gonm */, + { 0, 609, 4369, 2, 8, UNI_LB__ZW } /* lb=zwspace */, + { 0, 7198, 1110, 5, 7, UNI_SPECIALS } /* blk=specials */, + { 0, 6165, 1853, 3, 4, UNI_SC__SYLO } /* sc=sylo */, + { 5, 461, 5031, 2, 14, UNI_ROHG } /* ishanifirohingya */, + { 2, 1823, 124, 7, 4, UNI_SC__LATN } /* script=latn */, + { 0, 5574, 0, 21, 0, UNI_CWL } /* changeswhenlowercased */, + { 0, 4602, 4150, 7, 11, UNI_PI } /* initialpunctuation */, + { 5, 4360, 524, 10, 2, UNI_LB__SY } /* linebreak=sy */, + { 2, 7383, 4276, 10, 3, UNI_BC__NSM } /* bidiclass=nsm */, + { 11, 7591, 2017, 3, 2, UNI_LB__WJ } /* lb=wj */, + { 5, 2324, 4862, 6, 18, UNI_RUMI } /* block=ruminumeralsymbols */, + { 0, 461, 3276, 2, 13, UNI_ME } /* isenclosingmark */, + { 2, 6450, 36, 14, 2, UNI_SB__AT } /* sentencebreak=at */, + { 0, 1667, 3938, 5, 16, UNI_UCAS } /* blk=canadiansyllabics */, + { 4, 309, 2692, 2, 13, UNI_VERTICALFORMS } /* inverticalforms */, + { 0, 461, 3325, 2, 6, UNI_HEBR } /* ishebrew */, + { 0, 7669, 4030, 19, 13, UNI_HST__NA } /* hangulsyllabletype=notapplicable */, + { 18, 4360, 279, 10, 2, UNI_GCB__L } /* linebreak=jl */, + { 1, 7495, 768, 27, 2, UNI_CCC__27 } /* canonicalcombiningclass=ccc27 */, + { 5, 7404, 4, 11, 2, UNI_BC__RLO } /* bidiclass=rlo */, + { 0, 1200, 81, 5, 2, UNI_CJKEXTG } /* cjkextg */, + { 0, 1065, 0, 4, 0, UNI_NV__1 } /* nv=1 */, + { 6, 895, 290, 6, 2, UNI_AGE__14 } /* age=v140 */, + { 0, 7669, 202, 20, 2, UNI_LB__H3 } /* hangulsyllabletype=lvt */, + { 2, 7267, 6683, 19, 8, UNI_LO } /* generalcategory=otherletter */, + { 0, 1102, 1509, 4, 8, UNI_JAVA } /* scx=javanese */, + { 72, 2403, 0, 8, 0, UNI_ETHI } /* ethiopic */, + { 0, 2324, 8567, 7, 34, UNI_DIACRITICALSSUP } /* block=combiningdiacriticalmarkssupplement */, + { 1, 5205, 2643, 5, 12, UNI_MISCTECHNICAL } /* blk=misctechnical */, + { 0, 309, 8607, 2, 33, UNI_SUPMATHOPERATORS } /* insupplementalmathematicaloperators */, + { 0, 7724, 353, 17, 2, UNI_VS } /* variationselector=y */, + { 0, 8343, 1157, 22, 5, UNI_INSC__NUKTA } /* indicsyllabiccategory=nukta */, + { 0, 309, 357, 2, 6, UNI_INCHAKMA } /* inchakma */, + { 0, 6427, 1536, 13, 7, UNI_JG__THINYEH } /* joininggroup=thinyeh */, + { 2, 4667, 0, 16, 0, UNI_PE } /* closepunctuation */, + { 0, 71, 599, 3, 3, -UNI_CWU } /* cwu=no */, + { 2, 1102, 653, 4, 5, UNI_BUHD } /* scx=buhid */, + { 8, 3791, 599, 4, 3, -UNI_MATH } /* math=no */, + { 1, 925, 1427, 3, 2, UNI_BPT__C } /* bpt=c */, + { 1, 1819, 0, 4, 0, UNI_MONG } /* mong */, + { 4, 6090, 2631, 7, 12, UNI_MAYANNUMERALS } /* block=mayannumerals */, + { 0, 6165, 67, 3, 4, UNI_SC__CPRT } /* sc=cprt */, + { 3, 1102, 683, 4, 4, UNI_TAKR } /* scx=takr */, + { 0, 1102, 5712, 4, 19, UNI_MERO } /* scx=meroitichieroglyphs */, + { 0, 6165, 1015, 3, 6, UNI_SC__TELU } /* sc=telugu */, + { 3, 461, 975, 2, 8, UNI_GURU } /* isgurmukhi */, + { 3, 292, 3844, 2, 4, UNI_NV__5_SLASH_8 } /* nv=5/8 */, + { 0, 1618, 585, 10, 5, UNI_SD } /* softdotted=true */, + { 0, 1667, 1262, 4, 7, UNI_INSOYOMBO } /* blk=soyombo */, + { 9, 3013, 353, 5, 2, UNI_EPRES } /* epres=y */, + { 12, 3192, 0, 12, 0, UNI_NL } /* letternumber */, + { 18, 4941, 3746, 8, 14, UNI_KAKTOVIKNUMERALS } /* block=kaktoviknumerals */, + { 3, 7134, 0, 26, 0, UNI_PCM } /* prependedconcatenationmark */, + { 7, 1726, 5848, 8, 9, UNI_ARABICEXTA } /* isarabicextendeda */, + { 0, 6427, 4228, 13, 7, UNI_JG__HEHGOAL } /* joininggroup=hehgoal */, + { 0, 4191, 599, 5, 3, -UNI_XPOSIXLOWER } /* lower=no */, + { 0, 7267, 4369, 15, 2, UNI_Z } /* generalcategory=z */, + { 9, 7198, 8001, 5, 29, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* blk=symbolsandpictographsextendeda */, + { 5, 4502, 4698, 8, 12, UNI_LATIN1 } /* blk=latin1supplement */, + { 2, 3724, 783, 12, 3, UNI_JG__MALAYALAMNYA } /* jg=malayalamnya */, + { 1, 6165, 1522, 3, 8, UNI_UGAR } /* sc=ugaritic */, + { 17, 3502, 7915, 5, 20, UNI_ENCLOSEDALPHANUM } /* blk=enclosedalphanumerics */, + { 1, 461, 806, 2, 4, UNI_SHRD } /* isshrd */, + { 0, 461, 1027, 2, 4, UNI_YEZI } /* isyezi */, + { 0, 1391, 1612, 3, 2, UNI_LB__LF } /* wb=lf */, + { 1, 832, 934, 5, 2, -UNI_STERM } /* sterm=f */, + { 0, 1102, 4002, 4, 4, UNI_MODI } /* scx=modi */, + { 0, 461, 959, 2, 8, UNI_EXT } /* isextender */, + { 4, 7267, 117, 16, 2, UNI_XPOSIXDIGIT } /* generalcategory=nd */, + { 1, 309, 6986, 2, 25, UNI_SYMBOLSFORLEGACYCOMPUTING } /* insymbolsforlegacycomputing */, + { 0, 4424, 442, 17, 4, UNI_ORKH } /* scriptextensions=orkh */, + { 2, 3663, 0, 14, 0, UNI_DEVANAGARIEXTA } /* devanagariexta */, + { 3, 6165, 4620, 3, 7, UNI_SC__LINB } /* sc=linearb */, + { 0, 312, 585, 5, 5, UNI_QMARK } /* qmark=true */, + { 6, 7648, 128, 18, 3, UNI_DT__MED } /* decompositiontype=med */, + { 12, 6163, 5114, 5, 10, UNI_INSC__TONELETTER } /* insc=toneletter */, + { 1, 1823, 2009, 7, 6, UNI_SC__SYRC } /* script=syriac */, + { 3, 1906, 7443, 6, 24, UNI_KATAKANAEXT } /* blk=katakanaphoneticextensions */, + { 0, 4424, 128, 17, 4, UNI_MEDF } /* scriptextensions=medf */, + { 0, 1198, 6400, 5, 18, UNI_CJKRADICALSSUP } /* incjkradicalssupplement */, + { 0, 6165, 1133, 3, 4, UNI_VITH } /* sc=vith */, + { 0, 1823, 0, 7, 0, UNI_sc_values_index } /* script= */, + { 0, 2280, 393, 10, 2, UNI_IN__15 } /* presentin=15 */, + { 17, 461, 1978, 2, 4, UNI_SOGD } /* issogd */, + { 0, 461, 4896, 2, 8, UNI_BAMUMSUP } /* isbamumsup */, + { 2, 641, 3218, 5, 10, UNI_GCB__L } /* hst=leadingjamo */, + { 0, 6487, 0, 23, 0, UNI_ZNAMENNYMUSIC } /* znamennymusicalnotation */, + { 1, 5156, 959, 10, 6, UNI_WB__EXTEND } /* wordbreak=extend */, + { 0, 4424, 418, 17, 4, UNI_KHMR } /* scriptextensions=khmr */, + { 0, 461, 3635, 2, 14, UNI_LATINEXTD } /* islatinextendedd */, + { 2, 3001, 599, 11, 5, UNI_NV__NAN } /* numerictype=none */, + { 0, 2766, 1926, 3, 6, UNI_S } /* gc=symbol */, + { 1, 1272, 8407, 3, 34, UNI_DIACRITICALSFORSYMBOLS } /* iscombiningdiacriticalmarksforsymbols */, + { 1, 3663, 334, 7, 3, UNI_DEVA } /* devanagari */, + { 0, 5156, 3191, 9, 3, UNI_WB__LE } /* wordbreak=le */, + { 12, 8246, 6289, 23, 5, UNI_INPC__LEFT } /* indicpositionalcategory=left */, + { 0, 7274, 535, 8, 2, UNI_S } /* category=s */, + { 2, 679, 5949, 3, 4, UNI_ANY } /* unicode */, + { 8, 939, 0, 5, 0, UNI_ECOMP } /* ecomp */, + { 3, 461, 4926, 2, 8, UNI_TAMILSUP } /* istamilsup */, + { 0, 8343, 2317, 22, 6, UNI_INSC__NUMBER } /* indicsyllabiccategory=number */, + { 2, 1102, 2780, 4, 6, UNI_COPT } /* scx=coptic */, + { 3, 3677, 4770, 10, 10, UNI_LATINEXTADDITIONAL } /* islatinextadditional */, + { 0, 6165, 810, 3, 4, UNI_SC__SYRC } /* sc=syrc */, + { 10, 2732, 4659, 10, 9, UNI_ARABICEXTC } /* blk=arabicextendedc */, + { 0, 1102, 739, 4, 7, UNI_MAND } /* scx=mandaic */, + { 0, 1994, 274, 7, 1, UNI_radical_values_index } /* radical= */, + { 0, 4569, 352, 8, 3, UNI_XPOSIXUPPER } /* uppercase=y */, + { 16, 917, 0, 8, 0, UNI_BASS } /* bassavah */, + { 0, 2180, 0, 12, 0, UNI_NV__5_SLASH_12 } /* nv=4.167e-01 */, + { 13, 5937, 353, 21, 2, UNI__PERL_NCHAR } /* noncharactercodepoint=y */, + { 6, 53, 18, 1, 1, UNI_NB } /* nb */, + { 0, 1455, 934, 10, 6, -UNI_DEP } /* deprecated=false */, + { 2, 4424, 4461, 17, 11, UNI_SGNW } /* scriptextensions=signwriting */, + { 0, 1075, 515, 4, 2, UNI_NV__2_SLASH_5 } /* nv=2/5 */, + { 1, 461, 5916, 2, 21, UNI_LOE } /* islogicalorderexception */, + { 1, 4424, 2244, 17, 12, UNI_HUNG } /* scriptextensions=oldhungarian */, + { 2, 1272, 8214, 3, 24, UNI_DIACRITICALS } /* iscombiningdiacriticalmarks */, + { 0, 309, 688, 2, 5, UNI_INBATAK } /* inbatak */, + { 1, 4569, 934, 5, 6, -UNI_XPOSIXUPPER } /* upper=false */, + { 2, 312, 353, 5, 4, UNI_QMARK } /* qmark=yes */, + { 0, 1667, 333, 4, 6, UNI_INCARIAN } /* blk=carian */, + { 0, 2842, 4511, 10, 9, UNI_ETHIOPICEXTB } /* isethiopicextendedb */, + { 0, 4424, 470, 17, 4, UNI_TNSA } /* scriptextensions=tnsa */, + { 3, 1823, 806, 7, 4, UNI_SC__SHRD } /* script=shrd */, + { 11, 4176, 0, 15, 0, UNI_INHANGUL } /* hangulsyllables */, + { 0, 7214, 0, 25, 0, UNI_CCC__1 } /* canonicalcombiningclass=1 */, + { 3, 7274, 269, 9, 2, UNI_ZP } /* category=zp */, + { 1, 1479, 3282, 4, 7, UNI_MC } /* spacingmark */, + { 0, 2766, 8, 3, 1, UNI_P } /* gc=p */, + { 1, 510, 764, 5, 2, UNI_NV__3_SLASH_64 } /* nv=3/64 */, + { 1, 6427, 4765, 13, 5, UNI_JG__ZHAIN } /* joininggroup=zhain */, + { 16, 2324, 732, 6, 7, UNI_INLINEARA } /* block=lineara */, + { 6, 4424, 1212, 17, 9, UNI_QAAI } /* scriptextensions=inherited */, + { 22, 2393, 1674, 8, 4, UNI_CYRILLICEXTD } /* cyrillicextd */, + { 3, 339, 2165, 4, 2, UNI_CCC__33 } /* ccc=33 */, + { 2, 309, 474, 2, 3, UNI_INVAI } /* invai */, + { 2, 1667, 658, 4, 5, UNI_INDOGRA } /* blk=dogra */, + { 0, 461, 1509, 2, 8, UNI_JAVA } /* isjavanese */, + { 2, 5799, 4457, 4, 15, UNI_SUTTONSIGNWRITING } /* insuttonsignwriting */, + { 1, 6076, 6945, 9, 12, UNI_GEOMETRICSHAPES } /* block=geometricshapes */, + { 12, 1823, 1349, 7, 9, UNI_SC__OUGR } /* script=olduyghur */, + { 5, 1494, 5863, 5, 13, UNI_GEORGIANSUP } /* georgiansupplement */, + { 1, 370, 2814, 3, 8, UNI_SO } /* othersymbol */, + { 2, 4424, 825, 17, 7, UNI_SHAW } /* scriptextensions=shavian */, + { 0, 461, 4584, 2, 18, UNI_IDST } /* isidstrinaryoperator */, + { 0, 1396, 934, 4, 2, -UNI_XIDS } /* xids=f */, + { 0, 7274, 466, 9, 2, UNI_SO } /* category=so */, + { 0, 3098, 598, 7, 3, -UNI_XPOSIXXDIGIT } /* hexdigit=n */, + { 0, 292, 395, 3, 2, UNI_NV__16 } /* nv=16 */, + { 5, 461, 406, 2, 4, UNI_DIAK } /* isdiak */, + { 0, 2966, 4441, 3, 16, UNI_SMALLFORMS } /* insmallformvariants */, + { 9, 339, 3403, 3, 3, UNI_CCC__23 } /* ccc=23 */, + { 1, 4391, 276, 14, 1, UNI_NV__32 } /* numericvalue=32 */, + { 2, 3130, 6945, 7, 20, UNI_GEOMETRICSHAPESEXT } /* blk=geometricshapesextended */, + { 0, 6427, 2546, 13, 3, UNI_JG__FEH } /* joininggroup=feh */, + { 0, 6870, 585, 20, 2, UNI_CE } /* compositionexclusion=t */, + { 0, 1667, 1051, 4, 8, UNI_INMAHAJANI } /* blk=mahajani */, + { 4, 1823, 4089, 7, 4, UNI_SC__SIND } /* script=sind */, + { 4, 2324, 32, 6, 2, UNI_INVS } /* block=vs */, + { 7, 1883, 353, 5, 2, UNI_BIDIC } /* bidic=y */, + { 2, 6163, 0, 5, 0, UNI_insc_values_index } /* insc= */, + { 3, 939, 585, 5, 5, UNI_ECOMP } /* ecomp=true */, + { 35, 833, 0, 4, 0, UNI_TERM } /* term */, + { 1, 6163, 5003, 5, 14, UNI_INSC__GEMINATIONMARK } /* insc=geminationmark */, + { 2, 5156, 98, 10, 2, UNI_LB__HL } /* wordbreak=hl */, + { 0, 2766, 1478, 3, 2, UNI_ZS } /* gc=zs */, + { 1, 2287, 2080, 4, 3, UNI_IN__11 } /* in=11.0 */, + { 0, 1667, 1358, 4, 9, UNI_PALM } /* blk=palmyrene */, + { 1, 4, 933, 2, 3, -UNI_LOE } /* loe=f */, + { 0, 2842, 5820, 3, 15, UNI_ENCLOSEDALPHANUM } /* isenclosedalphanum */, + { 8, 3514, 8174, 12, 29, UNI_ARABICMATH } /* block=arabicmathematicalalphabeticsymbols */, + { 1, 3021, 2084, 4, 2, UNI_IN__1_DOT_1 } /* in=v11 */, + { 1, 2324, 6692, 6, 15, UNI_TRANSPORTANDMAP } /* block=transportandmap */, + { 1, 7134, 934, 26, 6, -UNI_PCM } /* prependedconcatenationmark=false */, + { 1, 2301, 934, 4, 6, -UNI_XIDC } /* xidc=false */, + { 1, 7274, 1887, 9, 7, UNI_XPOSIXCNTRL } /* category=control */, + { 2, 2523, 1479, 8, 5, UNI_XPOSIXSPACE } /* isxposixspace */, + { 0, 3832, 0, 16, 0, UNI_NV__5_SLASH_8 } /* numericvalue=5/8 */, + { 2, 5637, 2720, 20, 3, UNI_RI } /* graphemeclusterbreak=ri */, + { 1, 4377, 353, 14, 4, UNI_DT__NONE } /* nfkdquickcheck=yes */, + { 0, 1823, 499, 7, 6, UNI_LYDI } /* script=lydian */, + { 2, 1667, 5838, 4, 10, UNI_JAMO } /* blk=hanguljamo */, + { 0, 5574, 353, 21, 4, UNI_CWL } /* changeswhenlowercased=yes */, + { 0, 1102, 590, 4, 7, UNI_DSRT } /* scx=deseret */, + { 0, 1102, 3663, 4, 10, UNI_DEVA } /* scx=devanagari */, + { 3, 375, 0, 5, 0, UNI_GREXT } /* grext */, + { 0, 108, 0, 4, 0, UNI_KAWI } /* kawi */, + { 0, 609, 5657, 2, 3, UNI_LB__ID } /* lb=id */, + { 5, 6165, 1117, 3, 4, UNI_SC__TAGB } /* sc=tagb */, + { 19, 7404, 6021, 21, 8, UNI_BC__RLO } /* bidiclass=righttoleftoverride */, + { 8, 609, 2720, 2, 3, UNI_RI } /* lb=ri */, + { 2, 1102, 74, 4, 4, UNI_CYRL } /* scx=cyrl */, + { 4, 2, 599, 3, 2, -UNI_CWL } /* cwl=n */, + { 1, 1198, 3611, 5, 6, UNI_CJKCOMPAT } /* incjkcompat */, + { 1, 2287, 566, 3, 3, UNI_IN__9 } /* in=9.0 */, + { 0, 377, 353, 3, 4, UNI_EXT } /* ext=yes */, + { 0, 5637, 248, 21, 2, UNI_GCB__CN } /* graphemeclusterbreak=cn */, + { 0, 5574, 585, 21, 2, UNI_CWL } /* changeswhenlowercased=t */, + { 4, 292, 347, 3, 2, UNI_NV__49 } /* nv=49 */, + { 19, 369, 0, 4, 0, UNI_GOTH } /* goth */, + { 4, 7724, 274, 17, 1, UNI_vs_values_index } /* variationselector= */, + { 46, 1102, 1592, 4, 10, UNI_SAUR } /* scx=saurashtra */, + { 0, 461, 3692, 2, 7, UNI_LISUSUP } /* islisusup */, + { 0, 1102, 6154, 4, 9, UNI_XSUX } /* scx=cuneiform */, + { 0, 1823, 240, 7, 4, UNI_SC__ZYYY } /* script=zyyy */, + { 3, 959, 585, 8, 2, UNI_EXT } /* extender=t */, + { 0, 5979, 44, 3, 1, UNI_VO__U } /* vo=u */, + { 0, 2324, 3421, 6, 15, UNI_NARB } /* block=oldnortharabian */, + { 0, 823, 934, 4, 6, -UNI_DASH } /* dash=false */, + { 6, 1823, 132, 7, 4, UNI_MTEI } /* script=mtei */, + { 9, 7591, 306, 3, 2, UNI_LB__SP } /* lb=sp */, + { 3, 597, 4277, 3, 5, UNI_DT__SML } /* dt=small */, + { 0, 461, 1248, 2, 7, UNI_PHAG } /* isphagspa */, + { 6, 4360, 2039, 10, 2, UNI_LB__BK } /* linebreak=bk */, + { 0, 292, 2108, 3, 3, UNI_NV__500 } /* nv=500 */, + { 0, 7669, 3599, 19, 12, UNI_GCB__T } /* hangulsyllabletype=trailingjamo */, + { 0, 1823, 779, 7, 7, UNI_OSMA } /* script=osmanya */, + { 1, 629, 933, 5, 7, -UNI_GRBASE } /* grbase=false */, + { 0, 2525, 2060, 6, 5, UNI_XPOSIXALPHA } /* xposixalpha */, + { 9, 7011, 1155, 24, 2, UNI_CCC__35 } /* canonicalcombiningclass=35 */, + { 0, 2302, 353, 3, 2, UNI_IDC } /* idc=y */, + { 0, 2301, 352, 10, 5, UNI_XIDC } /* xidcontinue=yes */, + { 6, 5895, 6103, 5, 13, UNI_SUPMATHOPERATORS } /* issupmathoperators */, + { 0, 1823, 854, 7, 7, UNI_TAVT } /* script=taiviet */, + { 5, 7648, 4277, 18, 5, UNI_DT__SML } /* decompositiontype=small */, + { 0, 597, 1707, 3, 3, UNI_DT__FRA } /* dt=fra */, + { 10, 2665, 353, 13, 4, UNI_PATSYN } /* patternsyntax=yes */, + { 0, 749, 1924, 3, 9, UNI_CHESSSYMBOLS } /* chesssymbols */, + { 2, 461, 4131, 2, 15, UNI_VEDICEXT } /* isvedicextensions */, + { 1, 2752, 598, 13, 3, -UNI_ECOMP } /* emojicomponent=n */, + { 1, 1102, 1635, 4, 4, UNI_WARA } /* scx=wara */, + { 0, 4424, 144, 17, 4, UNI_NEWA } /* scriptextensions=newa */, + { 0, 6165, 673, 3, 5, UNI_OSGE } /* sc=osage */, + { 0, 2002, 307, 7, 5, UNI_POSIXPRINT } /* isposixprint */, + { 1, 1424, 2165, 8, 2, UNI_WB__EB } /* ccc=ccc133 */, + { 0, 461, 1385, 2, 6, UNI_THAA } /* isthaana */, + { 0, 461, 2360, 2, 10, UNI_CN } /* isunassigned */, + { 0, 7267, 5235, 16, 20, UNI_PC } /* generalcategory=connectorpunctuation */, + { 2, 1667, 1340, 4, 9, UNI_INOLDTURKIC } /* blk=oldturkic */, + { 0, 271, 1612, 4, 2, UNI_LB__LF } /* gcb=lf */, + { 0, 590, 6843, 2, 23, UNI_DI } /* defaultignorablecodepoint */, + { 2, 8601, 1269, 10, 3, UNI_SUPPUAB } /* block=suppuab */, + { 0, 19, 585, 4, 5, UNI_POSIXXDIGIT } /* ahex=true */, + { 5, 3635, 81, 7, 2, UNI_LATINEXTG } /* latinextg */, + { 2, 6735, 720, 22, 3, UNI_JG__MALAYALAMNNA } /* joininggroup=malayalamnna */, + { 8, 552, 563, 4, 3, UNI_AGE__8 } /* age=8.0 */, + { 0, 5937, 353, 21, 4, UNI__PERL_NCHAR } /* noncharactercodepoint=yes */, + { 1, 1667, 4060, 4, 15, UNI_BRAI } /* blk=braillepatterns */, + { 4, 1272, 60, 3, 3, UNI_CHRS } /* ischrs */, + { 9, 1667, 322, 4, 5, UNI_VSSUP } /* blk=vssup */, + { 10, 3130, 2773, 5, 13, UNI_INGREEK } /* blk=greekandcoptic */, + { 7, 339, 6328, 4, 4, UNI_WB__EB } /* ccc=atbl */, + { 3, 21, 598, 2, 2, UNI_ext_values_index } /* ext= */, + { 8, 1494, 957, 6, 5, UNI_GEORGIANEXT } /* georgianext */, + { 0, 693, 2814, 5, 8, UNI_SO } /* isothersymbol */, + { 0, 1009, 0, 6, 0, UNI_LYCI } /* lycian */, + { 0, 3791, 1926, 4, 6, UNI_SM } /* mathsymbol */, + { 2, 309, 1051, 2, 8, UNI_INMAHAJANI } /* inmahajani */, + { 17, 333, 0, 4, 0, UNI_CARI } /* cari */, + { 6, 3817, 1317, 15, 2, UNI_NV__1_SLASH_32 } /* numericvalue=1/32 */, + { 0, 4584, 934, 18, 6, -UNI_IDST } /* idstrinaryoperator=false */, + { 1, 1667, 3635, 4, 14, UNI_LATINEXTD } /* blk=latinextendedd */, + { 1, 461, 2692, 2, 13, UNI_VERTICALFORMS } /* isverticalforms */, + { 4, 375, 2931, 4, 3, UNI_GREXT } /* grext=t */, + { 4, 1492, 958, 9, 4, UNI_GEORGIANEXT } /* ingeorgianext */, + { 3, 2526, 0, 10, 0, UNI_POSIXBLANK } /* posixblank */, + { 0, 30, 6580, 1, 17, UNI_INDICNUMBERFORMS } /* inindicnumberforms */, + { 0, 1667, 7086, 4, 24, UNI_ARABICPFB } /* blk=arabicpresentationformsb */, + { 2, 1942, 584, 11, 6, UNI_GRBASE } /* graphemebase=true */, + { 4, 2536, 1920, 3, 3, UNI_JG__TAH } /* jg=tah */, + { 1, 461, 688, 2, 5, UNI_BATK } /* isbatak */, + { 1, 4191, 352, 8, 5, UNI_XPOSIXLOWER } /* lowercase=yes */, + { 12, 2766, 4, 3, 2, UNI_LO } /* gc=lo */, + { 1, 2832, 0, 10, 0, UNI_CYRL } /* iscyrillic */, + { 0, 3177, 3123, 15, 7, UNI_EA__N } /* eastasianwidth=neutral */, + { 4, 2468, 0, 6, 0, UNI_IPAEXT } /* ipaext */, + { 3, 6041, 928, 21, 2, UNI_BPT__O } /* bidipairedbrackettype=o */, + { 0, 302, 4439, 4, 2, UNI_patws_values_index } /* patws= */, + { 0, 2324, 779, 6, 7, UNI_INOSMANYA } /* block=osmanya */, + { 8, 4424, 4896, 17, 4, UNI_BAMU } /* scriptextensions=bamu */, + { 0, 3021, 288, 5, 2, UNI_IN__13 } /* in=v130 */, + { 1, 6165, 1205, 3, 4, UNI_SC__GRAN } /* sc=gran */, + { 2, 2514, 5107, 3, 18, UNI_MODIFIERTONELETTERS } /* ismodifiertoneletters */, + { 1, 461, 1779, 2, 11, UNI_MEDF } /* ismedefaidrin */, + { 1, 1667, 3649, 4, 14, UNI_PHONETICEXTSUP } /* blk=phoneticextsup */, + { 0, 375, 353, 5, 4, UNI_GREXT } /* grext=yes */, + { 0, 309, 7537, 2, 27, UNI_ALPHABETICPF } /* inalphabeticpresentationforms */, + { 14, 3204, 585, 14, 2, UNI_GREXT } /* graphemeextend=t */, + { 0, 1667, 4896, 4, 15, UNI_BAMUMSUP } /* blk=bamumsupplement */, + { 2, 6427, 1540, 13, 3, UNI_JG__YEH } /* joininggroup=yeh */, + { 0, 1667, 4926, 4, 15, UNI_TAMILSUP } /* blk=tamilsupplement */, + { 1, 552, 2689, 4, 3, UNI_AGE__6_DOT_1 } /* age=6.1 */, + { 0, 1102, 648, 4, 5, UNI_ADLM } /* scx=adlam */, + { 0, 7011, 118, 24, 2, UNI_CCC__DA } /* canonicalcombiningclass=da */, + { 1, 4043, 585, 4, 2, UNI_IDSB } /* idsb=t */, + { 0, 54, 3726, 2, 10, UNI_SC__MLYM } /* sc=malayalam */, + { 0, 2208, 0, 4, 0, UNI_NV__5 } /* nv=5 */, + { 4, 3093, 0, 13, 0, UNI_POSIXXDIGIT } /* asciihexdigit */, + { 1, 6165, 1117, 3, 8, UNI_SC__TAGB } /* sc=tagbanwa */, + { 1, 4424, 1009, 17, 4, UNI_LYCI } /* scriptextensions=lyci */, + { 1, 1454, 585, 2, 2, UNI_SD } /* sd=t */, + { 0, 1102, 3954, 4, 17, UNI_AGHB } /* scx=caucasianalbanian */, + { 6, 3633, 4344, 3, 16, UNI_LETTERLIKESYMBOLS } /* inletterlikesymbols */, + { 0, 678, 0, 5, 0, UNI_RUNR } /* runic */, + { 2, 1102, 1009, 4, 4, UNI_LYCI } /* scx=lyci */, + { 3, 1198, 0, 5, 0, UNI_CJK } /* incjk */, + { 3, 3490, 4511, 12, 9, UNI_CYRILLICEXTB } /* blk=cyrillicextendedb */, + { 0, 261, 353, 5, 2, UNI_CWKCF } /* cwkcf=y */, + { 3, 951, 0, 4, 0, UNI_DUPL } /* dupl */, + { 3, 461, 4525, 2, 12, UNI_CYRILLICEXTC } /* iscyrillicextc */, + { 3, 1914, 0, 7, 0, UNI_UCASEXT } /* ucasext */, + { 0, 1823, 527, 7, 6, UNI_RJNG } /* script=rejang */, + { 0, 406, 934, 2, 2, -UNI_DI } /* di=f */, + { 0, 1198, 1966, 3, 9, UNI_COMPATJAMO } /* incompatjamo */, + { 2, 2852, 0, 12, 0, UNI_MAHJONG } /* mahjongtiles */, + { 2, 1530, 1037, 6, 4, UNI_KANAEXTB } /* iskanaextb */, + { 0, 461, 4131, 2, 8, UNI_VEDICEXT } /* isvedicext */, + { 10, 7724, 934, 17, 6, -UNI_VS } /* variationselector=false */, + { 2, 5769, 0, 4, 0, UNI_EMOD } /* emod */, + { 11, 925, 0, 5, 0, UNI_BPT__O } /* bpt=o */, + { 13, 4424, 333, 17, 4, UNI_CARI } /* scriptextensions=cari */, + { 2, 7198, 4710, 5, 15, UNI_SYRIACSUP } /* blk=syriacsupplement */, + { 10, 967, 0, 8, 0, UNI_GUJR } /* gujarati */, + { 9, 3633, 1505, 7, 4, UNI_LATINEXTA } /* inlatinexta */, + { 3, 4424, 466, 17, 4, UNI_SOGO } /* scriptextensions=sogo */, + { 10, 309, 5373, 2, 18, UNI_TAIXUANJING } /* intaixuanjingsymbols */, + { 32, 1823, 1117, 7, 8, UNI_SC__TAGB } /* script=tagbanwa */, + { 1, 4424, 132, 17, 4, UNI_MTEI } /* scriptextensions=mtei */, + { 2, 5216, 4698, 10, 5, UNI_LATIN1 } /* block=latin1sup */, + { 3, 339, 1157, 4, 5, UNI_CCC__7 } /* ccc=nukta */, + { 0, 324, 4150, 3, 11, UNI_SUPPUNCTUATION } /* suppunctuation */, + { 0, 3984, 934, 17, 2, -UNI_EPRES } /* emojipresentation=f */, + { 1, 4424, 537, 17, 4, UNI_TANG } /* scriptextensions=tang */, + { 0, 461, 3649, 2, 11, UNI_PHONETICEXT } /* isphoneticext */, + { 6, 4502, 1037, 9, 4, UNI_LATINEXTB } /* blk=latinextb */, + { 1, 309, 3663, 2, 14, UNI_DEVANAGARIEXTA } /* indevanagariexta */, + { 0, 339, 3147, 4, 5, UNI_CCC__A } /* ccc=above */, + { 8, 2324, 5392, 7, 17, UNI_CHEROKEESUP } /* block=cherokeesupplement */, + { 1, 2232, 1805, 4, 5, UNI_NV__800000 } /* nv=800000 */, + { 0, 2494, 5800, 9, 11, UNI_GEORGIANSUP } /* isgeorgiansupplement */, + { 28, 6090, 1553, 7, 9, UNI_MISCARROWS } /* block=miscarrows */, + { 16, 461, 2362, 2, 8, UNI_ASSIGNED } /* isassigned */, + { 2, 2766, 330, 3, 2, UNI_PD } /* gc=pd */, + { 0, 309, 4536, 2, 18, UNI_COPTICEPACTNUMBERS } /* incopticepactnumbers */, + { 1, 5216, 1674, 11, 4, UNI_LATINEXTD } /* block=latinextd */, + { 2, 7752, 5047, 23, 6, UNI_JG__MANICHAEANDALETH } /* joininggroup=manichaeandaleth */, + { 3, 1667, 818, 4, 7, UNI_SC__SHRD } /* blk=sharada */, + { 10, 5065, 4247, 13, 4, UNI_JG__MANICHAEANKAPH } /* jg=manichaeankaph */, + { 32, 3514, 6193, 10, 5, UNI_ARABICSUP } /* block=arabicsup */, + { 3, 1883, 599, 5, 3, -UNI_BIDIC } /* bidic=no */, + { 0, 309, 678, 2, 5, UNI_INRUNIC } /* inrunic */, + { 0, 2718, 4, 4, 2, UNI_BC__RLO } /* bc=rlo */, + { 13, 1667, 5876, 4, 12, UNI_SUNDANESESUP } /* blk=sundanesesup */, + { 7, 4519, 4659, 14, 9, UNI_CYRILLICEXTC } /* block=cyrillicextendedc */, + { 9, 2766, 3554, 3, 13, UNI_ZL } /* gc=lineseparator */, + { 1, 2324, 4533, 9, 4, UNI_CJKEXTC } /* block=cjkextc */, + { 0, 3677, 0, 11, 0, UNI_LATINEXTE } /* islatinexte */, + { 2, 1823, 1090, 7, 4, UNI_SC__LINB } /* script=linb */, + { 0, 1667, 377, 7, 4, UNI_CJKEXTH } /* blk=cjkexth */, + { 0, 454, 0, 4, 0, UNI_PRTI } /* prti */, + { 18, 1823, 4896, 7, 5, UNI_BAMU } /* script=bamum */, + { 9, 309, 6120, 2, 22, UNI_DIACRITICALSFORSYMBOLS } /* indiacriticalsforsymbols */, + { 2, 461, 5838, 2, 19, UNI_JAMOEXTA } /* ishanguljamoextendeda */, + { 3, 1438, 0, 10, 0, UNI_CHRS } /* chorasmian */, + { 3, 2514, 1553, 3, 9, UNI_MISCARROWS } /* ismiscarrows */, + { 0, 3663, 0, 13, 0, UNI_DEVANAGARIEXT } /* devanagariext */, + { 11, 19, 1104, 3, 3, UNI_POSIXXDIGIT } /* ahex=t */, + { 5, 1942, 0, 12, 0, UNI_GRBASE } /* graphemebase */, + { 1, 6165, 168, 3, 4, UNI_SC__COPT } /* sc=qaac */, + { 35, 461, 1248, 2, 4, UNI_PHAG } /* isphag */, + { 1, 6165, 317, 3, 5, UNI_SC__TALE } /* sc=taile */, + { 0, 1667, 991, 4, 6, UNI_INHATRAN } /* blk=hatran */, + { 0, 6165, 1635, 3, 4, UNI_WARA } /* sc=wara */, + { 0, 629, 933, 5, 3, -UNI_GRBASE } /* grbase=f */, + { 1, 3817, 520, 14, 1, UNI_NV__17 } /* numericvalue=17 */, + { 0, 2732, 1505, 10, 4, UNI_ARABICEXTA } /* blk=arabicexta */, + { 1, 6165, 55, 3, 4, UNI_CHAM } /* sc=cham */, + { 0, 7267, 8, 16, 2, UNI_PC } /* generalcategory=pc */, + { 0, 461, 4487, 2, 6, UNI_ZYYY } /* iscommon */, + { 17, 5205, 2046, 5, 11, UNI_INMASARAMGONDI } /* blk=masaramgondi */, + { 0, 7198, 5149, 7, 7, UNI_SUPARROWSA } /* blk=suparrowsa */, + { 0, 4161, 585, 9, 5, UNI_DIA } /* diacritic=true */, + { 0, 461, 1133, 2, 4, UNI_VITH } /* isvith */, + { 0, 6165, 880, 3, 7, UNI_ZZZZ } /* sc=unknown */, + { 30, 461, 1349, 2, 9, UNI_OUGR } /* isolduyghur */, + { 0, 7383, 305, 10, 2, UNI_BC__WS } /* bidiclass=ws */, + { 0, 2280, 890, 9, 5, UNI_IN__10 } /* presentin=10.0 */, + { 2, 7892, 585, 16, 2, UNI_UIDEO } /* unifiedideograph=t */, + { 5, 2718, 7776, 3, 21, UNI_BC__PDI } /* bc=popdirectionalisolate */, + { 1, 1823, 4740, 7, 4, UNI_SC__TALE } /* script=tale */, + { 0, 1522, 0, 8, 0, UNI_UGAR } /* ugaritic */, + { 6, 5658, 6890, 15, 10, UNI_IDENTIFIERTYPE__LIMITEDUSE } /* identifiertype=limiteduse */, + { 6, 590, 0, 7, 0, UNI_DSRT } /* deseret */, + { 0, 1102, 244, 4, 4, UNI_ZZZZ } /* scx=zzzz */, + { 0, 1198, 6400, 5, 11, UNI_CJKRADICALSSUP } /* incjkradicalssup */, + { 1, 1065, 769, 4, 3, UNI_NV__17_SLASH_2 } /* nv=17/2 */, + { 1, 4407, 599, 17, 3, -UNI_RI } /* regionalindicator=no */, + { 1, 1823, 220, 7, 4, UNI_WCHO } /* script=wcho */, + { 0, 4407, 599, 17, 2, -UNI_RI } /* regionalindicator=n */, + { 16, 1391, 366, 3, 2, UNI_WB__SQ } /* wb=sq */, + { 1, 7752, 5053, 23, 6, UNI_JG__MANICHAEANLAMEDH } /* joininggroup=manichaeanlamedh */, + { 3, 2678, 2083, 11, 2, UNI_IN__5_DOT_1 } /* presentin=5.1 */, + { 4, 552, 2155, 4, 3, UNI_AGE__3_DOT_1 } /* age=3.1 */, + { 0, 1823, 2780, 7, 4, UNI_SC__COPT } /* script=copt */, + { 0, 6090, 5107, 7, 18, UNI_MODIFIERTONELETTERS } /* block=modifiertoneletters */, + { 19, 4970, 585, 13, 5, UNI_EMOD } /* emojimodifier=true */, + { 6, 4424, 983, 17, 4, UNI_HIRA } /* scriptextensions=hira */, + { 9, 2244, 0, 12, 0, UNI_HUNG } /* oldhungarian */, + { 2, 461, 369, 2, 4, UNI_GOTH } /* isgoth */, + { 1, 5637, 3463, 21, 12, UNI_WB__EB } /* graphemeclusterbreak=glueafterzwj */, + { 0, 309, 5391, 2, 8, UNI_INCHEROKEE } /* incherokee */, + { 2, 2060, 934, 5, 6, -UNI_XPOSIXALPHA } /* alpha=false */, + { 0, 369, 0, 6, 0, UNI_GOTH } /* gothic */, + { 1, 380, 2288, 5, 2, UNI_hyphen_values_index } /* hyphen= */, + { 0, 1102, 2811, 4, 5, UNI_KHMR } /* scx=khmer */, + { 0, 1667, 1975, 4, 10, UNI_INOLDSOGDIAN } /* blk=oldsogdian */, + { 0, 876, 0, 4, 0, UNI_IDEO } /* ideo */, + { 4, 2280, 549, 11, 3, UNI_IN__14 } /* presentin=14.0 */, + { 7, 292, 1313, 3, 3, UNI_NV__600 } /* nv=600 */, + { 1, 1424, 393, 7, 2, UNI_CCC__15 } /* ccc=ccc15 */, + { 0, 6586, 0, 11, 0, UNI_NUMBERFORMS } /* numberforms */, + { 0, 1667, 3163, 5, 14, UNI_CONTROLPICTURES } /* blk=controlpictures */, + { 7, 3514, 4531, 10, 6, UNI_ARABICEXTC } /* block=arabicextc */, + { 0, 4424, 1021, 17, 6, UNI_WCHO } /* scriptextensions=wancho */, + { 6, 668, 0, 5, 0, UNI_OGAM } /* ogham */, + { 10, 8246, 6635, 27, 7, UNI_INPC__TOPANDLEFT } /* indicpositionalcategory=topandleft */, + { 8, 1914, 0, 8, 0, UNI_UCASEXTA } /* ucasexta */, + { 0, 7752, 4243, 23, 4, UNI_JG__MANICHAEANHETH } /* joininggroup=manichaeanheth */, + { 2, 1883, 599, 5, 2, -UNI_BIDIC } /* bidic=n */, + { 1, 7274, 115, 9, 2, UNI_SK } /* category=sk */, + { 13, 30, 5711, 1, 5, UNI_MERO } /* ismero */, + { 3, 6427, 2864, 13, 11, UNI_JG__ROHINGYAYEH } /* joininggroup=rohingyayeh */, + { 4, 5616, 585, 21, 2, UNI_CWU } /* changeswhenuppercased=t */, + { 0, 3391, 1803, 12, 6, UNI_NV__10000 } /* numericvalue=10000 */, + { 1, 339, 768, 4, 2, UNI_CCC__27 } /* ccc=27 */, + { 0, 98, 0, 4, 0, UNI_HLUW } /* hluw */, + { 3, 309, 4911, 2, 15, UNI_DIACRITICALSSUP } /* indiacriticalssup */, + { 35, 6427, 3012, 12, 2, UNI_JG__E } /* joininggroup=e */, + { 0, 4407, 934, 17, 6, -UNI_RI } /* regionalindicator=false */, + { 16, 3514, 5848, 12, 9, UNI_ARABICEXTA } /* block=arabicextendeda */, + { 1, 3001, 590, 12, 2, UNI_XPOSIXDIGIT } /* numerictype=de */, + { 2, 716, 4272, 3, 16, UNI_INKHITANSMALLSCRIPT } /* inkhitansmallscript */, + { 0, 4360, 5090, 9, 3, UNI_LB__CL } /* linebreak=cl */, + { 6, 4424, 3663, 17, 10, UNI_DEVA } /* scriptextensions=devanagari */, + { 1, 154, 6945, 3, 12, UNI_GEOMETRICSHAPES } /* geometricshapes */, + { 19, 7011, 7387, 18, 7, UNI_CCC__L } /* canonicalcombiningclass=l */, + { 0, 461, 1819, 2, 4, UNI_MONG } /* ismong */, + { 1, 5769, 585, 4, 2, UNI_EMOD } /* emod=t */, + { 4, 4424, 1015, 17, 6, UNI_TELU } /* scriptextensions=telugu */, + { 0, 461, 2852, 2, 12, UNI_MAHJONG } /* ismahjongtiles */, + { 2, 1243, 4523, 2, 14, UNI_CYRILLICEXTC } /* blk=cyrillicextc */, + { 0, 1823, 1367, 7, 9, UNI_PAUC } /* script=paucinhau */, + { 0, 461, 6324, 2, 6, UNI_CF } /* isformat */, + { 0, 7267, 2360, 16, 10, UNI_CN } /* generalcategory=unassigned */, + { 0, 309, 519, 2, 2, UNI_IN__7 } /* in=7 */, + { 1, 7648, 51, 18, 3, UNI_DT__CAN } /* decompositiontype=can */, + { 0, 1667, 1027, 4, 6, UNI_INYEZIDI } /* blk=yezidi */, + { 14, 1065, 1318, 5, 2, UNI_NV__1_SLASH_20 } /* nv=1/20 */, + { 0, 2, 353, 3, 2, UNI_CWL } /* cwl=y */, + { 0, 5769, 585, 4, 5, UNI_EMOD } /* emod=true */, + { 0, 7274, 106, 9, 2, UNI_ZL } /* category=zl */, + { 0, 7537, 599, 10, 3, -UNI_XPOSIXALPHA } /* alphabetic=no */, + { 21, 7724, 0, 17, 0, UNI_VS } /* variationselector */, + { 3, 6163, 3257, 14, 6, UNI_INSC__CONSONANTKILLER } /* insc=consonantkiller */, + { 38, 5373, 0, 18, 0, UNI_TAIXUANJING } /* taixuanjingsymbols */, + { 0, 4391, 6263, 14, 8, UNI_NV__1_SLASH_320 } /* numericvalue=3.125e-03 */, + { 6, 2536, 2549, 3, 10, UNI_JG__DALATHRISH } /* jg=dalathrish */, + { 18, 380, 353, 6, 4, UNI_HYPHEN } /* hyphen=yes */, + { 0, 1102, 3349, 4, 4, UNI_MERO } /* scx=mero */, + { 13, 6870, 0, 20, 0, UNI_CE } /* compositionexclusion */, + { 4, 1102, 725, 4, 7, UNI_KALI } /* scx=kayahli */, + { 3, 1734, 4441, 3, 16, UNI_SMALLFORMS } /* issmallformvariants */, + { 2, 6450, 0, 14, 0, UNI_sb_values_index } /* sentencebreak= */, + { 4, 1823, 474, 7, 4, UNI_VAI } /* script=vaii */, + { 0, 309, 6586, 2, 11, UNI_NUMBERFORMS } /* innumberforms */, + { 1, 2324, 1853, 6, 11, UNI_INSYLOTINAGRI } /* block=sylotinagri */, + { 0, 257, 599, 4, 3, -UNI_CWCM } /* cwcm=no */, + { 7, 1479, 3558, 5, 9, UNI_ZS } /* spaceseparator */, + { 0, 2483, 353, 5, 4, UNI_CASED } /* cased=yes */, + { 5, 2302, 584, 9, 3, UNI_IDC } /* idcontinue=t */, + { 0, 6841, 934, 25, 2, -UNI_DI } /* defaultignorablecodepoint=f */, + { 2, 309, 4651, 2, 16, UNI_BOPOMOFOEXT } /* inbopomofoextended */, + { 0, 7267, 4554, 16, 15, UNI_TITLE } /* generalcategory=titlecaseletter */, + { 1, 406, 934, 3, 6, -UNI_DIA } /* dia=false */, + { 1, 1391, 0, 3, 0, UNI_wb_values_index } /* wb= */, + { 0, 6165, 991, 3, 6, UNI_HATR } /* sc=hatran */, + { 0, 1102, 1978, 4, 4, UNI_SOGD } /* scx=sogd */, + { 1, 6163, 5762, 5, 16, UNI_INSC__SYLLABLEMODIFIER } /* insc=syllablemodifier */, + { 1, 1667, 6185, 4, 20, UNI_GLAGOLITICSUP } /* blk=glagoliticsupplement */, + { 0, 1075, 1805, 4, 5, UNI_NV__200000 } /* nv=200000 */, + { 3, 1823, 1592, 7, 4, UNI_SAUR } /* script=saur */, + { 2, 6618, 4107, 11, 12, UNI_INPC__TOPANDLEFTANDRIGHT } /* inpc=topandleftandright */, + { 2, 6062, 4511, 14, 9, UNI_ETHIOPICEXTB } /* block=ethiopicextendedb */, + { 17, 1102, 5778, 4, 21, UNI_PRTI } /* scx=inscriptionalparthian */, + { 0, 7724, 585, 17, 5, UNI_VS } /* variationselector=true */, + { 2, 16, 2370, 1, 12, UNI_GREEKEXT } /* greekextended */, + { 2, 6236, 1805, 17, 7, UNI_NV__10000000000 } /* numericvalue=10000000000 */, + { 0, 7011, 1070, 24, 2, UNI_CCC__31 } /* canonicalcombiningclass=31 */, + { 2, 7011, 1432, 24, 6, UNI_CCC__9 } /* canonicalcombiningclass=virama */, + { 1, 2220, 6279, 4, 8, UNI_NV__1_SLASH_160 } /* nv=6.250e-03 */, + { 0, 5799, 7707, 13, 17, UNI_SUPPUAB } /* insupplementaryprivateuseareab */, + { 4, 1942, 933, 11, 7, -UNI_GRBASE } /* graphemebase=false */, + { 0, 1223, 4511, 4, 9, UNI_KANAEXTB } /* kanaextendedb */, + { 0, 1823, 1227, 7, 7, UNI_MAKA } /* script=makasar */, + { 3, 2401, 4511, 10, 9, UNI_ETHIOPICEXTB } /* inethiopicextendedb */, + { 1, 2766, 4667, 3, 16, UNI_PE } /* gc=closepunctuation */, + { 7, 4424, 1209, 17, 4, UNI_THAI } /* scriptextensions=thai */, + { 0, 7724, 0, 18, 0, UNI_INVS } /* variationselectors */, + { 0, 4795, 0, 14, 0, UNI_NV__6 } /* numericvalue=6 */, + { 2, 339, 3971, 4, 13, UNI_CCC__IS } /* ccc=iotasubscript */, + { 3, 4424, 1367, 17, 4, UNI_PAUC } /* scriptextensions=pauc */, + { 0, 461, 255, 2, 2, UNI_CF } /* iscf */, + { 0, 2280, 560, 10, 3, UNI_IN__7 } /* presentin=7.0 */, + { 0, 7383, 52, 10, 2, UNI_BC__AN } /* bidiclass=an */, + { 1, 461, 3192, 2, 12, UNI_NL } /* isletternumber */, + { 1, 2324, 144, 6, 4, UNI_INNEWA } /* block=newa */, + { 0, 4424, 2735, 16, 5, UNI_ARAB } /* scriptextensions=arab */, + { 4, 5205, 7620, 5, 19, UNI_MISCSYMBOLS } /* blk=miscellaneoussymbols */, + { 0, 5553, 599, 21, 3, -UNI_CWCM } /* changeswhencasemapped=no */, + { 1, 6165, 0, 3, 0, UNI_sc_values_index } /* sc= */, + { 1, 461, 3263, 2, 13, UNI_XPOSIXDIGIT } /* isdecimalnumber */, + { 0, 2018, 2579, 12, 10, UNI_JT__U } /* joiningtype=nonjoining */, + { 1, 3817, 1317, 15, 3, UNI_NV__1_SLASH_320 } /* numericvalue=1/320 */, + { 5, 2324, 909, 6, 8, UNI_INBALINESE } /* block=balinese */, + { 2, 2966, 6671, 3, 21, UNI_MODIFIERLETTERS } /* inspacingmodifierletters */, + { 0, 2324, 6581, 6, 16, UNI_INDICNUMBERFORMS } /* block=indicnumberforms */, + { 0, 6163, 1157, 5, 5, UNI_INSC__NUKTA } /* insc=nukta */, + { 3, 6165, 136, 3, 4, UNI_SC__MYMR } /* sc=mymr */, + { 1, 597, 6116, 3, 4, UNI_DT__FONT } /* dt=font */, + { 1, 461, 5373, 2, 11, UNI_TAIXUANJING } /* istaixuanjing */, + { 4, 6165, 184, 3, 4, UNI_SAMR } /* sc=samr */, + { 0, 8601, 6965, 9, 22, UNI_SUPERANDSUB } /* block=superscriptsandsubscripts */, + { 0, 3724, 720, 13, 3, UNI_JG__MALAYALAMNNNA } /* jg=malayalamnnna */, + { 9, 3791, 585, 4, 2, UNI_MATH } /* math=t */, + { 7, 2002, 308, 3, 4, UNI_XPOSIXPRINT } /* isprint */, + { 8, 1667, 5125, 4, 19, UNI_OTTOMANSIYAQNUMBERS } /* blk=ottomansiyaqnumbers */, + { 22, 2324, 7972, 7, 15, UNI_CUNEIFORMNUMBERS } /* block=cuneiformnumbers */, + { 0, 1667, 474, 4, 3, UNI_INVAI } /* blk=vai */, + { 0, 4424, 1812, 17, 11, UNI_HMNG } /* scriptextensions=pahawhhmong */, + { 7, 7648, 6116, 18, 4, UNI_DT__FONT } /* decompositiontype=font */, + { 0, 8343, 1985, 22, 7, UNI_INSC__VISARGA } /* indicsyllabiccategory=visarga */, + { 1, 6165, 1015, 3, 4, UNI_SC__TELU } /* sc=telu */, + { 9, 2301, 934, 4, 2, -UNI_XIDC } /* xidc=f */, + { 9, 1421, 2370, 3, 12, UNI_GREEKEXT } /* ingreekextended */, + { 1, 4424, 204, 17, 4, UNI_TFNG } /* scriptextensions=tfng */, + { 0, 4970, 5671, 16, 3, -UNI_EBASE } /* emojimodifierbase=n */, + { 8, 2718, 3924, 3, 14, UNI_BC__EN } /* bc=europeannumber */, + { 4, 1007, 3570, 3, 13, UNI_HALFANDFULLFORMS } /* halfandfullforms */, + { 0, 6165, 430, 3, 4, UNI_SC__NKO } /* sc=nkoo */, + { 11, 4131, 0, 8, 0, UNI_VEDICEXT } /* vedicext */, + { 1, 1397, 598, 3, 4, -UNI_IDST } /* idst=no */, + { 21, 1391, 3472, 3, 3, UNI_LB__ZWJ } /* wb=zwj */, + { 0, 533, 832, 3, 5, UNI_SB__ST } /* sb=sterm */, + { 0, 716, 0, 9, 0, UNI_INKANNADA } /* inkannada */, + { 3, 6165, 608, 3, 7, UNI_ELBA } /* sc=elbasan */, + { 0, 8343, 0, 31, 0, UNI_INSC__CONSONANT } /* indicsyllabiccategory=consonant */, + { 2, 3391, 2106, 13, 9, UNI_NV__3_SLASH_2 } /* numericvalue=1.500e+00 */, + { 5, 339, 119, 4, 2, UNI_CCC__AL } /* ccc=al */, + { 0, 7804, 599, 11, 3, -UNI_IDEO } /* ideographic=no */, + { 14, 1397, 0, 4, 0, UNI_IDST } /* idst */, + { 0, 2324, 6797, 6, 19, UNI_DEVANAGARIEXTA } /* block=devanagariextendeda */, + { 3, 1823, 1051, 7, 8, UNI_SC__MAHJ } /* script=mahajani */, + { 0, 1667, 5, 4, 3, UNI_OCR } /* blk=ocr */, + { 0, 1455, 585, 10, 2, UNI_DEP } /* deprecated=t */, + { 8, 1200, 0, 3, 0, UNI_CJK } /* cjk */, + { 4, 3502, 4952, 5, 18, UNI_INEGYPTIANHIEROGLYPHS } /* blk=egyptianhieroglyphs */, + { 0, 461, 225, 2, 2, UNI_PE } /* ispe */, + { 3, 1198, 1448, 5, 7, UNI_CJKSTROKES } /* incjkstrokes */, + { 0, 1234, 0, 4, 0, UNI_MULT } /* mult */, + { 0, 622, 598, 6, 4, -UNI_EXTPICT } /* extpict=no */, + { 0, 2523, 229, 3, 3, UNI_XSUX } /* isxsux */, + { 5, 7591, 7537, 3, 10, UNI_LB__AL } /* lb=alphabetic */, + { 1, 2068, 0, 12, 0, UNI_MEND } /* mendekikakui */, + { 0, 2302, 599, 10, 3, -UNI_IDC } /* idcontinue=no */, + { 18, 2002, 161, 3, 3, UNI_PHLP } /* isphlp */, + { 0, 1823, 3475, 7, 15, UNI_ZANB } /* script=zanabazarsquare */, + { 0, 4424, 3493, 16, 9, UNI_CYRL } /* scriptextensions=cyrillic */, + { 3, 309, 6185, 2, 10, UNI_INGLAGOLITIC } /* inglagolitic */, + { 3, 1272, 1966, 3, 9, UNI_COMPATJAMO } /* iscompatjamo */, + { 9, 309, 1914, 2, 7, UNI_UCASEXT } /* inucasext */, + { 5, 1530, 3622, 5, 3, UNI_KANGXI } /* iskangxi */, + { 18, 2018, 2897, 12, 11, UNI_JT__D } /* joiningtype=dualjoining */, + { 0, 461, 380, 2, 6, UNI_HYPHEN } /* ishyphen */, + { 2, 2481, 6848, 6, 9, UNI_CI } /* iscaseignorable */, + { 44, 6427, 4263, 13, 4, UNI_JG__QAPH } /* joininggroup=qaph */, + { 3, 3391, 1803, 12, 5, UNI_NV__1000 } /* numericvalue=1000 */, + { 18, 30, 78, 1, 2, UNI_IDS } /* ids */, + { 9, 10, 3788, 1, 15, UNI_MISCMATHSYMBOLSA } /* miscmathsymbolsa */, + { 0, 959, 585, 8, 5, UNI_EXT } /* extender=true */, + { 0, 1102, 3505, 3, 5, UNI_ETHI } /* scx=ethi */, + { 0, 2732, 4987, 5, 16, UNI_ALCHEMICAL } /* blk=alchemicalsymbols */, + { 16, 7267, 3101, 16, 5, UNI_XPOSIXDIGIT } /* generalcategory=digit */, + { 0, 7267, 3634, 16, 2, UNI_NL } /* generalcategory=nl */, + { 44, 6165, 4271, 3, 17, UNI_KITS } /* sc=khitansmallscript */, + { 0, 2324, 6400, 9, 11, UNI_CJKRADICALSSUP } /* block=cjkradicalssup */, + { 6, 2208, 2107, 4, 8, UNI_NV__11_SLASH_2 } /* nv=5.500e+00 */, + { 3, 1823, 951, 7, 4, UNI_SC__DUPL } /* script=dupl */, + { 1, 1102, 27, 4, 4, UNI_ARMI } /* scx=armi */, + { 0, 3724, 1144, 12, 3, UNI_JG__MALAYALAMBHA } /* jg=malayalambha */, + { 8, 571, 0, 7, 0, UNI_AVST } /* avestan */, + { 1, 2536, 4247, 3, 4, UNI_JG__KAPH } /* jg=kaph */, + { 1, 2514, 8039, 3, 32, UNI_MISCMATHSYMBOLSA } /* ismiscellaneousmathematicalsymbolsa */, + { 0, 2324, 317, 6, 5, UNI_INTAILE } /* block=taile */, + { 0, 1102, 4060, 4, 7, UNI_BRAI } /* scx=braille */, + { 0, 30, 4190, 1, 6, UNI_XPOSIXLOWER } /* islower */, + { 18, 461, 1954, 2, 12, UNI_GONG } /* isgunjalagondi */, + { 0, 3633, 0, 11, 0, UNI_LATINEXTE } /* inlatinexte */, + { 2, 6427, 1041, 13, 5, UNI_JG__GAMAL } /* joininggroup=gamal */, + { 0, 3378, 2327, 11, 3, UNI_nfdqc_values_index } /* nfdquickcheck= */, + { 1, 2393, 7467, 8, 13, UNI_CYRILLICSUP } /* cyrillicsupplementary */, + { 6, 5958, 0, 7, 0, UNI_SINH } /* sinhala */, + { 1, 2766, 3026, 3, 2, UNI_PS } /* gc=ps */, + { 2, 1102, 236, 4, 4, UNI_ZANB } /* scx=zanb */, + { 5, 1102, 5208, 3, 8, UNI_MYMR } /* scx=myanmar */, + { 0, 2536, 702, 3, 4, UNI_JG__NOON } /* jg=noon */, + { 1, 5895, 7707, 13, 17, UNI_SUPPUAB } /* issupplementaryprivateuseareab */, + { 1, 3514, 1141, 12, 3, UNI_ARABICPFA } /* block=arabicpfa */, + { 8, 1198, 6557, 5, 16, UNI_CJKCOMPATIDEOGRAPHS } /* incjkcompatideographs */, + { 3, 3803, 353, 14, 4, UNI_NFKCQC__Y } /* nfkcquickcheck=yes */, + { 0, 6165, 909, 3, 8, UNI_BALI } /* sc=balinese */, + { 0, 2766, 4554, 3, 15, UNI_TITLE } /* gc=titlecaseletter */, + { 0, 2391, 4511, 10, 9, UNI_CYRILLICEXTB } /* incyrillicextendedb */, + { 0, 339, 1243, 4, 2, UNI_CCC__BL } /* ccc=bl */, + { 1, 5637, 21, 21, 2, UNI_GCB__EX } /* graphemeclusterbreak=ex */, + { 0, 2525, 4569, 6, 5, UNI_XPOSIXUPPER } /* xposixupper */, + { 5, 6041, 2025, 17, 5, UNI_bpt_values_index } /* bidipairedbrackettype= */, + { 0, 823, 353, 4, 2, UNI_DASH } /* dash=y */, + { 0, 19, 934, 4, 6, -UNI_POSIXXDIGIT } /* ahex=false */, + { 3, 7274, 65, 9, 2, UNI_MN } /* category=mn */, + { 2, 7752, 5059, 23, 6, UNI_JG__MANICHAEANSAMEKH } /* joininggroup=manichaeansamekh */, + { 1, 94, 0, 4, 0, UNI_GURU } /* guru */, + { 1, 4424, 1303, 17, 9, UNI_TALU } /* scriptextensions=newtailue */, + { 4, 832, 599, 5, 2, -UNI_STERM } /* sterm=n */, + { 3, 1102, 1322, 4, 9, UNI_ITAL } /* scx=olditalic */, + { 0, 1823, 5876, 7, 4, UNI_SUND } /* script=sund */, + { 8, 1667, 678, 4, 5, UNI_INRUNIC } /* blk=runic */, + { 0, 5205, 1037, 11, 4, UNI_MYANMAREXTB } /* blk=myanmarextb */, + { 3, 33, 1110, 1, 7, UNI_SPECIALS } /* specials */, + { 1, 2536, 484, 3, 3, UNI_JG__HAH } /* jg=hah */, + { 0, 2324, 8474, 9, 23, UNI_CJKCOMPATIDEOGRAPHS } /* block=cjkcompatibilityideographs */, + { 0, 15, 3859, 2, 3, UNI_AGE__7 } /* age=7 */, + { 2, 2324, 81, 11, 2, UNI_CJKEXTG } /* block=cjkextg */, + { 2, 3391, 2098, 13, 9, UNI_NV__1_SLASH_7 } /* numericvalue=1.429e-01 */, + { 1, 6165, 2441, 3, 4, UNI_SC__NAND } /* sc=nand */, + { 0, 333, 0, 6, 0, UNI_CARI } /* carian */, + { 0, 7267, 313, 16, 4, UNI_M } /* generalcategory=mark */, + { 0, 309, 7564, 2, 17, UNI_ANCIENTGREEKMUSIC } /* inancientgreekmusic */, + { 0, 7011, 1157, 24, 5, UNI_CCC__7 } /* canonicalcombiningclass=nukta */, + { 0, 2514, 1235, 3, 6, UNI_MULT } /* ismultani */, + { 3, 3817, 288, 14, 1, UNI_NV__13 } /* numericvalue=13 */, + { 3, 1667, 1834, 4, 11, UNI_INSORASOMPENG } /* blk=sorasompeng */, + { 1, 377, 934, 3, 2, -UNI_EXT } /* ext=f */, + { 0, 4002, 5111, 5, 14, UNI_MODIFIERTONELETTERS } /* modifiertoneletters */, + { 45719, 7011, 8030, 24, 9, UNI_CCC__AL } /* canonicalcombiningclass=aboveleft */, + { 1, 7383, 3106, 10, 12, UNI_BC__AL } /* bidiclass=arabicletter */, + { 0, 3677, 1505, 7, 4, UNI_LATINEXTA } /* islatinexta */, + { 1, 6165, 208, 3, 4, UNI_SC__TGLG } /* sc=tglg */, + { 2, 4795, 6279, 14, 8, UNI_NV__1_SLASH_160 } /* numericvalue=6.250e-03 */, + { 9, 2, 584, 1, 3, UNI_CE } /* ce=t */, + { 4, 461, 330, 2, 2, UNI_PD } /* ispd */, + { 3, 597, 4602, 3, 7, UNI_DT__INIT } /* dt=initial */, + { 0, 3984, 8549, 9, 9, UNI_epres_values_index } /* emojipresentation= */, + { 3, 461, 19, 2, 4, UNI_POSIXXDIGIT } /* isahex */, + { 1, 292, 392, 3, 2, UNI_NV__41 } /* nv=41 */, + { 8, 4407, 353, 17, 2, UNI_RI } /* regionalindicator=y */, + { 0, 4424, 615, 17, 7, UNI_ELYM } /* scriptextensions=elymaic */, + { 5, 7591, 4330, 3, 14, UNI_LB__PO } /* lb=postfixnumeric */, + { 2, 975, 0, 8, 0, UNI_GURU } /* gurmukhi */, + { 9, 461, 2268, 2, 12, UNI_PLAYINGCARDS } /* isplayingcards */, + { 0, 940, 0, 6, 0, UNI_COMPEX } /* compex */, + { 0, 1530, 662, 3, 3, UNI_KALI } /* iskali */, + { 22, 461, 868, 2, 4, UNI_TIRH } /* istirh */, + { 0, 959, 274, 8, 1, UNI_ext_values_index } /* extender= */, + { 12, 309, 1340, 2, 9, UNI_INOLDTURKIC } /* inoldturkic */, + { 0, 7591, 880, 3, 7, UNI_LB__XX } /* lb=unknown */, + { 16, 6090, 1505, 13, 4, UNI_MYANMAREXTA } /* block=myanmarexta */, + { 8, 6076, 3448, 11, 6, UNI_GEORGIANEXT } /* block=georgianext */, + { 0, 1887, 0, 7, 0, UNI_XPOSIXCNTRL } /* control */, + { 2, 6041, 5090, 21, 6, UNI_BPT__C } /* bidipairedbrackettype=close */, + { 1, 16, 1426, 1, 3, UNI_C } /* gc=c */, + { 0, 4424, 1562, 17, 10, UNI_NAGM } /* scriptextensions=nagmundari */, + { 2, 7752, 600, 22, 4, UNI_JG__MANICHAEANONE } /* joininggroup=manichaeanone */, + { 0, 6165, 132, 3, 4, UNI_MTEI } /* sc=mtei */, + { 0, 7011, 8203, 24, 11, UNI_CCC__DB } /* canonicalcombiningclass=doublebelow */, + { 5, 1391, 2292, 3, 9, UNI_WB__WSEGSPACE } /* wb=wsegspace */, + { 0, 7011, 294, 23, 2, UNI_CCC__9 } /* canonicalcombiningclass=9 */, + { 23, 3803, 6093, 12, 4, UNI_NFCQC__M } /* nfkcquickcheck=m */, + { 0, 6450, 5144, 14, 5, UNI_SB__AT } /* sentencebreak=aterm */, + { 10, 1823, 3663, 7, 10, UNI_SC__DEVA } /* script=devanagari */, + { 0, 8505, 3101, 3, 5, UNI_NT__DI } /* nt=digit */, + { 0, 1391, 4407, 3, 17, UNI_RI } /* wb=regionalindicator */, + { 0, 3407, 515, 14, 2, UNI_NV__4_SLASH_5 } /* numericvalue=4/5 */, + { 10, 461, 3093, 2, 5, UNI_ASCII } /* isascii */, + { 0, 2324, 1227, 6, 7, UNI_INMAKASAR } /* block=makasar */, + { 0, 2718, 18, 3, 1, UNI_BC__B } /* bc=b */, + { 0, 7892, 3190, 15, 2, UNI_uideo_values_index } /* unifiedideograph= */, + { 0, 3378, 353, 13, 4, UNI_NFDQC__Y } /* nfdquickcheck=yes */, + { 18, 5205, 3364, 5, 14, UNI_MISCPICTOGRAPHS } /* blk=miscpictographs */, + { 1, 128, 0, 2, 0, UNI_ME } /* me */, + { 2, 7274, 3791, 9, 10, UNI_SM } /* category=mathsymbol */, + { 2, 5939, 274, 5, 1, UNI_nchar_values_index } /* nchar= */, + { 16, 1424, 2084, 7, 2, UNI_CCC__11 } /* ccc=ccc11 */, + { 0, 168, 0, 4, 0, UNI_COPT } /* qaac */, + { 0, 3098, 934, 8, 2, -UNI_XPOSIXXDIGIT } /* hexdigit=f */, + { 4, 1618, 274, 10, 1, UNI_sd_values_index } /* softdotted= */, + { 0, 2536, 3012, 2, 2, UNI_JG__E } /* jg=e */, + { 39, 6165, 402, 3, 4, UNI_ARMN } /* sc=armn */, + { 0, 1349, 0, 9, 0, UNI_OUGR } /* olduyghur */, + { 2, 6464, 0, 23, 0, UNI_SHORTHANDFORMATCONTROLS } /* shorthandformatcontrols */, + { 0, 2324, 238, 6, 2, UNI_NB } /* block=nb */, + { 0, 6427, 1767, 13, 2, UNI_JG__FE } /* joininggroup=fe */, + { 1, 7591, 2966, 3, 11, UNI_LB__IN } /* lb=inseparable */, + { 2, 1424, 344, 7, 2, UNI_CCC__21 } /* ccc=ccc21 */, + { 12, 461, 82, 2, 4, UNI_GONG } /* isgong */, + { 1, 2348, 584, 12, 3, UNI_CI } /* caseignorable=t */, + { 7, 1396, 599, 4, 2, -UNI_XIDS } /* xids=n */, + { 0, 3098, 598, 7, 2, UNI_hex_values_index } /* hexdigit= */, + { 0, 1823, 4505, 6, 6, UNI_SC__LATN } /* script=latin */, + { 7, 7011, 350, 24, 2, UNI_CCC__9 } /* canonicalcombiningclass=vr */, + { 0, 6165, 5712, 3, 19, UNI_MERO } /* sc=meroitichieroglyphs */, + { 0, 1102, 3663, 4, 4, UNI_DEVA } /* scx=deva */, + { 0, 309, 2068, 2, 12, UNI_INMENDEKIKAKUI } /* inmendekikakui */, + { 1, 7404, 0, 21, 0, UNI_BC__R } /* bidiclass=righttoleft */, + { 0, 2280, 2199, 10, 3, UNI_IN__2 } /* presentin=2.0 */, + { 0, 2324, 2302, 6, 3, UNI_INIDC } /* block=idc */, + { 8, 35, 0, 4, 0, UNI_BATK } /* batk */, + { 4, 1823, 297, 7, 5, UNI_SC__ORYA } /* script=oriya */, + { 0, 6165, 466, 3, 4, UNI_SOGO } /* sc=sogo */, + { 9, 271, 5769, 4, 9, UNI_WB__EB } /* gcb=emodifier */, + { 8, 1102, 2780, 4, 4, UNI_COPT } /* scx=copt */, + { 1, 3391, 2182, 12, 10, UNI_NV__5_SLASH_12 } /* numericvalue=4.167e-01 */, + { 2, 8246, 1630, 30, 5, UNI_INPC__TOPANDRIGHT } /* indicpositionalcategory=topandright */, + { 0, 663, 0, 4, 0, UNI_LIMB } /* limb */, + { 1, 461, 4852, 2, 10, UNI_XPOSIXSPACE } /* iswhitespace */, + { 0, 7267, 248, 16, 2, UNI_CN } /* generalcategory=cn */, + { 0, 1823, 1133, 7, 8, UNI_VITH } /* script=vithkuqi */, + { 2, 54, 5208, 2, 8, UNI_SC__MYMR } /* sc=myanmar */, + { 2, 309, 512, 2, 2, UNI_IN__3 } /* in=3 */, + { 11, 7591, 5769, 3, 9, UNI_EMOD } /* lb=emodifier */, + { 2, 7267, 252, 16, 2, UNI_CASEDLETTER } /* generalcategory=lc */, + { 0, 7495, 2165, 27, 2, UNI_CCC__33 } /* canonicalcombiningclass=ccc33 */, + { 0, 1823, 1212, 7, 9, UNI_SC__QAAI } /* script=inherited */, + { 6, 128, 130, 2, 2, UNI_MEDF } /* medf */, + { 0, 1667, 8619, 4, 21, UNI_MATHOPERATORS } /* blk=mathematicaloperators */, + { 2, 5637, 4504, 19, 3, UNI_GCB__L } /* graphemeclusterbreak=l */, + { 5, 1492, 6945, 5, 15, UNI_GEOMETRICSHAPESEXT } /* ingeometricshapesext */, + { 11, 4951, 0, 4, 0, UNI_EGYP } /* egyp */, + { 0, 1065, 1317, 5, 2, UNI_NV__1_SLASH_32 } /* nv=1/32 */, + { 4, 380, 599, 6, 3, -UNI_HYPHEN } /* hyphen=no */, + { 0, 8538, 44, 20, 1, UNI_VO__U } /* verticalorientation=u */, + { 1, 8601, 5409, 7, 17, UNI_SMALLKANAEXT } /* block=smallkanaextension */, + { 5, 1144, 1147, 3, 6, UNI_BHKS } /* bhaiksuki */, + { 0, 2432, 7620, 3, 19, UNI_MISCSYMBOLS } /* inmiscellaneoussymbols */, + { 14, 4191, 585, 5, 5, UNI_XPOSIXLOWER } /* lower=true */, + { 1, 2018, 0, 12, 0, UNI_jt_values_index } /* joiningtype= */, + { 0, 1102, 94, 4, 4, UNI_GURU } /* scx=guru */, + { 5, 5658, 7287, 10, 17, UNI_IDENTIFIERSTATUS__RESTRICTED } /* identifierstatus=restricted */, + { 5, 2, 934, 3, 2, -UNI_CWL } /* cwl=f */, + { 3, 8343, 6934, 31, 11, UNI_INSC__CONSONANTWITHSTACKER } /* indicsyllabiccategory=consonantwithstacker */, + { 32, 6450, 3191, 13, 3, UNI_SB__LE } /* sentencebreak=le */, + { 2, 4424, 172, 17, 4, UNI_RJNG } /* scriptextensions=rjng */, + { 2, 7274, 248, 9, 5, UNI_XPOSIXCNTRL } /* category=cntrl */, + { 3, 1424, 582, 8, 2, UNI_CCC__122 } /* ccc=ccc122 */, + { 4, 1102, 196, 4, 4, UNI_TAML } /* scx=taml */, + { 2, 292, 760, 3, 3, UNI_NV__1_SLASH_2 } /* nv=1/2 */, + { 0, 380, 585, 6, 2, UNI_HYPHEN } /* hyphen=t */, + { 5, 71, 274, 3, 1, UNI_cwu_values_index } /* cwu= */, + { 0, 21, 6142, 1, 21, UNI_EARLYDYNASTICCUNEIFORM } /* earlydynasticcuneiform */, + { 0, 4424, 108, 17, 4, UNI_KAWI } /* scriptextensions=kawi */, + { 0, 1479, 352, 4, 3, UNI_XPOSIXSPACE } /* space=y */, + { 8, 1667, 108, 4, 4, UNI_INKAWI } /* blk=kawi */, + { 9, 2301, 933, 10, 3, -UNI_XIDC } /* xidcontinue=f */, + { 8, 8278, 0, 33, 0, UNI_MISCMATHSYMBOLSB } /* miscellaneousmathematicalsymbolsb */, + { 1, 5065, 4251, 13, 4, UNI_JG__MANICHAEANQOPH } /* jg=manichaeanqoph */, + { 0, 2766, 0, 8, 0, UNI_C } /* gc=other */, + { 3, 1883, 341, 4, 2, UNI_bidic_values_index } /* bidic= */, + { 5, 3696, 1269, 4, 3, UNI_SUPPUAB } /* suppuab */, + { 1, 6165, 398, 3, 4, UNI_MIAO } /* sc=miao */, + { 0, 6165, 3954, 3, 17, UNI_AGHB } /* sc=caucasianalbanian */, + { 1, 895, 3861, 5, 2, UNI_AGE__7 } /* age=v70 */, + { 2, 1726, 6193, 6, 5, UNI_ARABICSUP } /* isarabicsup */, + { 0, 307, 0, 5, 0, UNI_XPOSIXPRINT } /* print */, + { 2, 3021, 2125, 4, 2, UNI_IN__6_DOT_3 } /* in=v63 */, + { 0, 1667, 2852, 4, 12, UNI_MAHJONG } /* blk=mahjongtiles */, + { 0, 461, 3475, 2, 15, UNI_ZANB } /* iszanabazarsquare */, + { 0, 4424, 779, 17, 7, UNI_OSMA } /* scriptextensions=osmanya */, + { 1, 406, 585, 3, 5, UNI_DIA } /* dia=true */, + { 5, 42, 2768, 2, 6, UNI_SB__XX } /* sb=other */, + { 1, 6332, 0, 19, 0, UNI_JAMOEXTB } /* hanguljamoextendedb */, + { 0, 461, 4667, 2, 16, UNI_PE } /* isclosepunctuation */, + { 18, 1102, 1303, 4, 9, UNI_TALU } /* scx=newtailue */, + { 0, 3391, 0, 14, 0, UNI_NV__2 } /* numericvalue=2 */, + { 0, 895, 2117, 5, 2, UNI_AGE__6_DOT_2 } /* age=v62 */, + { 0, 1174, 7036, 3, 9, UNI_EA__H } /* ea=halfwidth */, + { 2, 733, 7241, 3, 10, UNI_ENCLOSEDCJK } /* inenclosedcjk */, + { 0, 1102, 1685, 4, 11, UNI_CPMN } /* scx=cyprominoan */, + { 9, 2766, 4569, 3, 15, UNI_UPPERCASELETTER } /* gc=uppercaseletter */, + { 0, 461, 4161, 2, 9, UNI_DIA } /* isdiacritic */, + { 0, 257, 585, 4, 2, UNI_CWCM } /* cwcm=t */, + { 0, 271, 644, 3, 3, UNI_LB__H2 } /* gcb=lv */, + { 8, 1667, 1255, 4, 7, UNI_INSIDDHAM } /* blk=siddham */, + { 3, 1198, 6576, 3, 21, UNI_INDICNUMBERFORMS } /* incommonindicnumberforms */, + { 5, 7084, 0, 8, 0, UNI_INARABIC } /* inarabic */, + { 0, 1823, 196, 7, 4, UNI_SC__TAML } /* script=taml */, + { 2, 2324, 4896, 6, 15, UNI_BAMUMSUP } /* block=bamumsupplement */, + { 1, 2766, 4146, 3, 15, UNI_PD } /* gc=dashpunctuation */, + { 1, 4554, 0, 9, 0, UNI_TITLE } /* titlecase */, + { 0, 3803, 2327, 12, 3, UNI_nfkcqc_values_index } /* nfkcquickcheck= */, + { 2, 461, 474, 2, 4, UNI_VAI } /* isvaii */, + { 11, 6165, 1834, 3, 11, UNI_SORA } /* sc=sorasompeng */, + { 2, 597, 1850, 3, 3, UNI_DT__SUB } /* dt=sub */, + { 19, 6165, 124, 3, 4, UNI_SC__LATN } /* sc=latn */, + { 0, 6735, 4724, 22, 3, UNI_JG__MALAYALAMTTA } /* joininggroup=malayalamtta */, + { 1, 2324, 615, 6, 7, UNI_INELYMAIC } /* block=elymaic */, + { 2, 683, 0, 4, 0, UNI_TAKR } /* takr */, + { 0, 6165, 3325, 3, 6, UNI_HEBR } /* sc=hebrew */, + { 6, 6165, 1009, 3, 6, UNI_LYCI } /* sc=lycian */, + { 2, 5895, 5813, 5, 7, UNI_SUPARROWSB } /* issuparrowsb */, + { 0, 6427, 2559, 13, 10, UNI_JG__KNOTTEDHEH } /* joininggroup=knottedheh */, + { 2, 461, 1003, 2, 6, UNI_LEPC } /* islepcha */, + { 1, 1883, 353, 11, 4, UNI_BIDIC } /* bidicontrol=yes */, + { 0, 309, 6642, 2, 6, UNI_INBRAHMI } /* inbrahmi */, + { 0, 1667, 6797, 4, 18, UNI_DEVANAGARIEXT } /* blk=devanagariextended */, + { 0, 2324, 1696, 6, 6, UNI_DOMINO } /* block=domino */, + { 0, 1667, 1978, 4, 7, UNI_INSOGDIAN } /* blk=sogdian */, + { 6, 6287, 176, 4, 2, UNI_BC__LRO } /* bc=lro */, + { 1, 1075, 2657, 4, 8, UNI_NV__1_SLASH_5 } /* nv=2.000e-01 */, + { 11, 1667, 3908, 4, 6, UNI_INTANGUT } /* blk=tangut */, + { 1, 4271, 0, 17, 0, UNI_KITS } /* khitansmallscript */, + { 0, 1102, 3133, 3, 5, UNI_GEOR } /* scx=geor */, + { 1, 1102, 5067, 3, 11, UNI_MANI } /* scx=manichaean */, + { 0, 309, 3692, 2, 7, UNI_LISUSUP } /* inlisusup */, + { 5, 461, 1812, 2, 11, UNI_HMNG } /* ispahawhhmong */, + { 0, 309, 4161, 2, 12, UNI_DIACRITICALS } /* indiacriticals */, + { 25, 6165, 1562, 3, 10, UNI_NAGM } /* sc=nagmundari */, + { 0, 1823, 1209, 7, 4, UNI_THAI } /* script=thai */, + { 0, 3001, 3101, 12, 5, UNI_NT__DI } /* numerictype=digit */, + { 4, 461, 1696, 2, 6, UNI_DOMINO } /* isdomino */, + { 11, 309, 3583, 2, 16, UNI_HIGHPUSURROGATES } /* inhighpusurrogates */, + { 14, 7495, 7239, 27, 2, UNI_CCC__28 } /* canonicalcombiningclass=ccc28 */, + { 2, 3502, 5820, 5, 15, UNI_ENCLOSEDALPHANUM } /* blk=enclosedalphanum */, + { 3, 2280, 295, 10, 1, UNI_IN__9 } /* presentin=9 */, + { 2, 2732, 3790, 9, 5, UNI_ARABICMATH } /* blk=arabicmath */, + { 0, 2301, 585, 4, 5, UNI_XIDC } /* xidc=true */, + { 1, 266, 353, 3, 4, UNI_CWT } /* cwt=yes */, + { 0, 7274, 599, 8, 3, UNI_NO } /* category=no */, + { 0, 1397, 2931, 6, 3, UNI_IDS } /* idstart=t */, + { 0, 4424, 5958, 17, 7, UNI_SINH } /* scriptextensions=sinhala */, + { 0, 1391, 1864, 3, 8, UNI_WB__EB } /* wb=ebasegaz */, + { 3, 1102, 909, 4, 4, UNI_BALI } /* scx=bali */, + { 0, 86, 2372, 3, 5, UNI_GREEKEXT } /* greekext */, + { 0, 1102, 112, 4, 4, UNI_KITS } /* scx=kits */, + { 13, 357, 0, 6, 0, UNI_CAKM } /* chakma */, + { 0, 5156, 3451, 10, 12, UNI_WB__EX } /* wordbreak=extendnumlet */, + { 0, 461, 406, 2, 3, UNI_DIA } /* isdia */, + { 0, 1272, 8567, 3, 34, UNI_DIACRITICALSSUP } /* iscombiningdiacriticalmarkssupplement */, + { 4, 1102, 537, 4, 6, UNI_TNSA } /* scx=tangsa */, + { 0, 4360, 3040, 10, 9, UNI_LB__QU } /* linebreak=quotation */, + { 0, 309, 6082, 2, 8, UNI_INGEORGIAN } /* ingeorgian */, + { 65, 2324, 5876, 6, 12, UNI_SUNDANESESUP } /* block=sundanesesup */, + { 2, 716, 490, 5, 3, UNI_KANBUN } /* inkanbun */, + { 0, 1823, 798, 7, 4, UNI_NBAT } /* script=nbat */, + { 1, 4161, 6621, 8, 3, UNI_DIA } /* diacritic=t */, + { 2, 54, 5067, 2, 5, UNI_SC__MANI } /* sc=mani */, + { 4, 269, 0, 2, 0, UNI_ZP } /* zp */, + { 3, 552, 560, 4, 3, UNI_AGE__7 } /* age=7.0 */, + { 1, 2324, 3163, 7, 14, UNI_CONTROLPICTURES } /* block=controlpictures */, + { 0, 339, 2538, 3, 2, UNI_CCC__A } /* ccc=a */, + { 0, 292, 1314, 4, 2, UNI_NV__900 } /* nv=900 */, + { 3, 4424, 160, 17, 4, UNI_PHLP } /* scriptextensions=phlp */, + { 0, 38, 7442, 1, 25, UNI_KATAKANAEXT } /* katakanaphoneticextensions */, + { 17, 1734, 5409, 3, 17, UNI_SMALLKANAEXT } /* issmallkanaextension */, + { 41, 2536, 3289, 3, 12, UNI_JG__FINALSEMKATH } /* jg=finalsemkath */, + { 0, 6165, 422, 3, 4, UNI_SC__LINA } /* sc=lina */, + { 1, 1033, 0, 8, 0, UNI_JAMOEXTB } /* jamoextb */, + { 2, 309, 369, 2, 6, UNI_INGOTHIC } /* ingothic */, + { 8, 1667, 6776, 4, 21, UNI_MEETEIMAYEKEXT } /* blk=meeteimayekextensions */, + { 0, 461, 8619, 2, 21, UNI_MATHOPERATORS } /* ismathematicaloperators */, + { 0, 1272, 6557, 5, 16, UNI_CJKCOMPATIDEOGRAPHS } /* iscjkcompatideographs */, + { 0, 406, 599, 2, 2, -UNI_DI } /* di=n */, + { 22, 7134, 934, 26, 2, -UNI_PCM } /* prependedconcatenationmark=f */, + { 17, 140, 0, 4, 0, UNI_NARB } /* narb */, + { 0, 1102, 1367, 4, 4, UNI_PAUC } /* scx=pauc */, + { 4, 7274, 5172, 9, 2, UNI_CASEDLETTER } /* category=l_ */, + { 9, 6165, 4896, 3, 4, UNI_BAMU } /* sc=bamu */, + { 0, 461, 1914, 2, 4, UNI_UCAS } /* isucas */, + { 14, 4620, 3779, 7, 9, UNI_LINEARBIDEOGRAMS } /* linearbideograms */, + { 0, 30, 195, 1, 5, UNI_TAML } /* istaml */, + { 0, 2391, 1505, 10, 4, UNI_CYRILLICEXTA } /* incyrillicexta */, + { 4, 4191, 934, 5, 2, -UNI_XPOSIXLOWER } /* lower=f */, + { 0, 461, 2503, 2, 11, UNI_JOINC } /* isjoincontrol */, + { 2, 3984, 599, 17, 2, -UNI_EPRES } /* emojipresentation=n */, + { 8, 4424, 615, 17, 4, UNI_ELYM } /* scriptextensions=elym */, + { 1, 7669, 140, 19, 2, UNI_HST__NA } /* hangulsyllabletype=na */, + { 12, 4424, 1144, 17, 9, UNI_BHKS } /* scriptextensions=bhaiksuki */, + { 0, 6062, 2374, 14, 8, UNI_ETHIOPICEXT } /* block=ethiopicextended */, + { 1, 6163, 129, 20, 2, UNI_INSC__CONSONANTPREFIXED } /* insc=consonantprefixed */, + { 0, 2180, 1314, 4, 2, UNI_NV__400 } /* nv=400 */, + { 1, 4191, 353, 5, 2, UNI_XPOSIXLOWER } /* lower=y */, + { 0, 3177, 599, 14, 2, UNI_EA__N } /* eastasianwidth=n */, + { 0, 6165, 35, 3, 4, UNI_BATK } /* sc=batk */, + { 1, 3378, 353, 13, 2, UNI_NFDQC__Y } /* nfdquickcheck=y */, + { 0, 324, 8386, 3, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* supsymbolsandpictographs */, + { 1, 1667, 6400, 7, 11, UNI_CJKRADICALSSUP } /* blk=cjkradicalssup */, + { 0, 2324, 357, 6, 6, UNI_INCHAKMA } /* block=chakma */, + { 4, 3391, 347, 13, 2, UNI_NV__49 } /* numericvalue=49 */, + { 0, 2324, 6909, 6, 14, UNI_MUSIC } /* block=musicalsymbols */, + { 0, 1667, 8407, 5, 34, UNI_DIACRITICALSFORSYMBOLS } /* blk=combiningdiacriticalmarksforsymbols */, + { 1, 1667, 1685, 4, 11, UNI_INCYPROMINOAN } /* blk=cyprominoan */, + { 0, 5125, 0, 19, 0, UNI_OTTOMANSIYAQNUMBERS } /* ottomansiyaqnumbers */, + { 0, 339, 342, 3, 2, UNI_CCC__1 } /* ccc=1 */, + { 0, 461, 3663, 2, 14, UNI_DEVANAGARIEXTA } /* isdevanagariexta */, + { 0, 7198, 1845, 7, 8, UNI_SUPERANDSUB } /* blk=superandsub */, + { 0, 2324, 7480, 6, 14, UNI_PUA } /* block=privateusearea */, + { 0, 2718, 2424, 3, 2, UNI_BC__CS } /* bc=cs */, + { 0, 2220, 1805, 4, 4, UNI_NV__60000 } /* nv=60000 */, + { 5, 3098, 353, 8, 4, UNI_XPOSIXXDIGIT } /* hexdigit=yes */, + { 8, 1823, 1294, 7, 9, UNI_NBAT } /* script=nabataean */, + { 0, 6165, 1954, 3, 12, UNI_SC__GONG } /* sc=gunjalagondi */, + { 0, 1240, 6, 3, 2, UNI_OCR } /* inocr */, + { 12, 1823, 4951, 7, 4, UNI_EGYP } /* script=egyp */, + { 0, 50, 0, 2, 0, UNI_MC } /* mc */, + { 10, 1397, 934, 7, 6, -UNI_IDS } /* idstart=false */, + { 4, 15, 4402, 2, 3, UNI_AGE__3 } /* age=3 */, + { 1, 4424, 1978, 17, 7, UNI_SOGD } /* scriptextensions=sogdian */, + { 0, 1455, 0, 10, 0, UNI_DEP } /* deprecated */, + { 0, 2324, 2256, 6, 8, UNI_PHAISTOS } /* block=phaistos */, + { 0, 7274, 4, 9, 2, UNI_LO } /* category=lo */, + { 0, 5065, 2270, 13, 4, UNI_JG__MANICHAEANAYIN } /* jg=manichaeanayin */, + { 0, 144, 1306, 3, 6, UNI_TALU } /* newtailue */, + { 4, 1823, 2045, 7, 12, UNI_SC__GONM } /* script=masaramgondi */, + { 7, 1823, 2811, 7, 5, UNI_KHMR } /* script=khmer */, + { 0, 461, 1367, 2, 4, UNI_PAUC } /* ispauc */, + { 0, 629, 5671, 5, 3, -UNI_GRBASE } /* grbase=n */, + { 0, 2324, 6351, 6, 23, UNI_COMPATJAMO } /* block=hangulcompatibilityjamo */, + { 0, 4795, 2091, 14, 8, UNI_NV__5_SLASH_8 } /* numericvalue=6.250e-01 */, + { 0, 7944, 7380, 28, 4, UNI_CJKEXTB } /* iscjkunifiedideographsextensionb */, + { 2, 5658, 2646, 15, 9, UNI_IDENTIFIERTYPE__TECHNICAL } /* identifiertype=technical */, + { 0, 4161, 341, 8, 2, UNI_dia_values_index } /* diacritic= */, + { 3, 1823, 120, 7, 3, UNI_LAO } /* script=lao */, + { 0, 3391, 515, 14, 2, UNI_NV__2_SLASH_5 } /* numericvalue=2/5 */, + { 0, 1102, 861, 4, 7, UNI_TIBT } /* scx=tibetan */, + { 6, 6165, 454, 3, 4, UNI_PRTI } /* sc=prti */, + { 16, 5205, 2422, 5, 10, UNI_MISCSYMBOLS } /* blk=miscsymbols */, + { 0, 1823, 5958, 7, 4, UNI_SC__SINH } /* script=sinh */, + { 0, 4424, 1349, 17, 9, UNI_OUGR } /* scriptextensions=olduyghur */, + { 0, 461, 4043, 2, 4, UNI_IDSB } /* isidsb */, + { 1, 1894, 353, 5, 2, UNI_BIDIM } /* bidim=y */, + { 0, 4391, 0, 16, 0, UNI_NV__3_SLASH_2 } /* numericvalue=3/2 */, + { 1, 2732, 6193, 8, 5, UNI_ARABICSUP } /* blk=arabicsup */, + { 0, 2718, 330, 3, 3, UNI_BC__PDF } /* bc=pdf */, + { 0, 4424, 917, 17, 4, UNI_BASS } /* scriptextensions=bass */, + { 0, 7274, 8, 9, 2, UNI_PC } /* category=pc */, + { 1, 33, 4710, 1, 8, UNI_SYRIACSUP } /* syriacsup */, + { 2, 2324, 2780, 6, 6, UNI_INCOPTIC } /* block=coptic */, + { 0, 2324, 3538, 6, 16, UNI_CYPRIOTSYLLABARY } /* block=cypriotsyllabary */, + { 0, 1272, 1448, 5, 7, UNI_CJKSTROKES } /* iscjkstrokes */, + { 1, 7383, 6029, 10, 12, UNI_BC__AN } /* bidiclass=arabicnumber */, + { 1, 641, 2382, 4, 9, UNI_GCB__V } /* hst=voweljamo */, + { 12, 868, 0, 7, 0, UNI_TIRH } /* tirhuta */, + { 0, 4424, 1322, 17, 9, UNI_ITAL } /* scriptextensions=olditalic */, + { 7, 8, 585, 3, 5, UNI_PCM } /* pcm=true */, + { 8, 4407, 934, 17, 2, -UNI_RI } /* regionalindicator=f */, + { 3, 19, 599, 4, 3, -UNI_POSIXXDIGIT } /* ahex=no */, + { 0, 1823, 917, 7, 4, UNI_BASS } /* script=bass */, + { 3, 5801, 0, 19, 0, UNI_SUPARROWSB } /* supplementalarrowsb */, + { 0, 7110, 0, 13, 0, UNI_M } /* combiningmark */, + { 9, 309, 238, 2, 2, UNI_NB } /* innb */, + { 5, 1667, 1209, 4, 4, UNI_INTHAI } /* blk=thai */, + { 29, 461, 2468, 2, 6, UNI_IPAEXT } /* isipaext */, + { 0, 192, 319, 2, 3, UNI_TALE } /* taile */, + { 10, 7198, 6671, 5, 21, UNI_MODIFIERLETTERS } /* blk=spacingmodifierletters */, + { 16, 5168, 7160, 6, 21, UNI__PERL_IS_IN_MULTI_CHAR_FOLD } /* _perl_is_in_multi_char_fold */, + { 0, 1102, 1834, 4, 11, UNI_SORA } /* scx=sorasompeng */, + { 6, 505, 599, 5, 3, UNI_DT__CAN } /* nfdqc=no */, + { 0, 1198, 8153, 5, 21, UNI_CJKSYMBOLS } /* incjksymbolsandpunctuation */, + { 1, 292, 765, 3, 2, UNI_NV__45 } /* nv=45 */, + { 1, 5031, 150, 12, 2, UNI_ROHG } /* hanifirohingya */, + { 1, 2, 599, 3, 3, -UNI_CWL } /* cwl=no */, + { 1, 7889, 5417, 20, 10, UNI_CJKEXTD } /* cjkunifiedideographsextensiond */, + { 0, 4502, 733, 5, 6, UNI_INLINEARA } /* blk=lineara */, + { 2, 1011, 353, 2, 2, UNI_CI } /* ci=y */, + { 7, 6163, 1432, 5, 6, UNI_INSC__VIRAMA } /* insc=virama */, + { 1, 4391, 1314, 14, 3, UNI_NV__3000 } /* numericvalue=3000 */, + { 4, 641, 644, 3, 2, UNI_GCB__L } /* hst=l */, + { 1, 339, 8640, 4, 13, UNI_CCC__214 } /* ccc=attachedabove */, + { 4, 8601, 4710, 7, 8, UNI_SYRIACSUP } /* block=syriacsup */, + { 1, 2280, 890, 9, 3, UNI_IN__10 } /* presentin=10 */, + { 0, 54, 4505, 2, 6, UNI_SC__LATN } /* sc=latin */, + { 18, 629, 5671, 5, 4, -UNI_GRBASE } /* grbase=no */, + { 5, 4424, 402, 17, 4, UNI_ARMN } /* scriptextensions=armn */, + { 0, 1823, 212, 7, 4, UNI_TIBT } /* script=tibt */, + { 1, 4502, 1674, 9, 4, UNI_LATINEXTD } /* blk=latinextd */, + { 0, 7591, 98, 3, 2, UNI_LB__HL } /* lb=hl */, + { 11, 6427, 1747, 13, 8, UNI_JG__FARSIYEH } /* joininggroup=farsiyeh */, + { 16, 4191, 933, 8, 3, -UNI_XPOSIXLOWER } /* lowercase=f */, + { 20, 228, 0, 4, 0, UNI_XSUX } /* xsux */, + { 0, 6735, 529, 22, 2, UNI_JG__MALAYALAMJA } /* joininggroup=malayalamja */, + { 0, 1424, 2092, 7, 2, UNI_CCC__25 } /* ccc=ccc25 */, + { 3, 339, 2154, 4, 2, UNI_CCC__13 } /* ccc=13 */, + { 3, 6165, 152, 3, 4, UNI_OSGE } /* sc=osge */, + { 0, 309, 1438, 2, 10, UNI_INCHORASMIAN } /* inchorasmian */, + { 0, 8311, 4680, 32, 4, UNI_CJKEXTF } /* block=cjkunifiedideographsextensionf */, + { 0, 2536, 2546, 3, 3, UNI_JG__FEH } /* jg=feh */, + { 0, 5895, 4150, 5, 11, UNI_SUPPUNCTUATION } /* issuppunctuation */, + { 0, 292, 344, 3, 2, UNI_NV__21 } /* nv=21 */, + { 4, 7752, 4259, 23, 4, UNI_JG__MANICHAEANYODH } /* joininggroup=manichaeanyodh */, + { 1, 309, 2268, 2, 12, UNI_PLAYINGCARDS } /* inplayingcards */, + { 1, 2505, 5276, 4, 16, UNI_HALFMARKS } /* incombininghalfmarks */, + { 0, 2441, 0, 11, 0, UNI_NAND } /* nandinagari */, + { 0, 1667, 590, 4, 7, UNI_DSRT } /* blk=deseret */, + { 17, 2324, 1191, 6, 7, UNI_INBENGALI } /* block=bengali */, + { 0, 1102, 1376, 4, 9, UNI_SAMR } /* scx=samaritan */, + { 5, 1667, 6495, 4, 5, UNI_MUSIC } /* blk=music */, + { 4, 461, 120, 2, 4, UNI_LAO } /* islaoo */, + { 1, 552, 393, 4, 2, UNI_AGE__15 } /* age=15 */, + { 23, 1667, 3955, 5, 16, UNI_INCAUCASIANALBANIAN } /* blk=caucasianalbanian */, + { 8, 3014, 2093, 11, 2, UNI_IN__5 } /* presentin=v50 */, + { 1, 3391, 2655, 13, 10, UNI_NV___MINUS_1_SLASH_2 } /* numericvalue=-5.000e-01 */, + { 27, 7267, 4, 16, 2, UNI_LO } /* generalcategory=lo */, + { 0, 1102, 1133, 4, 8, UNI_VITH } /* scx=vithkuqi */, + { 2, 2525, 4191, 6, 5, UNI_XPOSIXLOWER } /* xposixlower */, + { 0, 1667, 615, 4, 7, UNI_INELYMAIC } /* blk=elymaic */, + { 0, 1667, 4131, 4, 8, UNI_VEDICEXT } /* blk=vedicext */, + { 1, 461, 1562, 2, 4, UNI_NAGM } /* isnagm */, + { 1, 3021, 288, 4, 2, UNI_IN__3 } /* in=v30 */, + { 9, 1455, 585, 3, 5, UNI_DEP } /* dep=true */, + { 2, 461, 416, 2, 2, UNI_NO } /* isno */, + { 37, 5156, 3472, 10, 3, UNI_LB__ZWJ } /* wordbreak=zwj */, + { 2, 8246, 0, 27, 0, UNI_INPC__TOP } /* indicpositionalcategory=top */, + { 0, 4424, 1358, 17, 4, UNI_PALM } /* scriptextensions=palm */, + { 1, 1102, 802, 4, 4, UNI_SARB } /* scx=sarb */, + { 0, 309, 634, 2, 7, UNI_INHANUNOO } /* inhanunoo */, + { 2, 1728, 0, 4, 0, UNI_ARAB } /* arab */, + { 3, 4519, 0, 14, 0, UNI_INCYRILLIC } /* block=cyrillic */, + { 0, 7011, 1678, 24, 7, UNI_CCC__1 } /* canonicalcombiningclass=overlay */, + { 3, 2718, 4852, 3, 10, UNI_BC__WS } /* bc=whitespace */, + { 17, 2002, 3100, 7, 6, UNI_POSIXXDIGIT } /* isposixxdigit */, + { 2, 4424, 1227, 17, 7, UNI_MAKA } /* scriptextensions=makasar */, + { 11, 2324, 1562, 6, 10, UNI_INNAGMUNDARI } /* block=nagmundari */, + { 1, 461, 1003, 2, 4, UNI_LEPC } /* islepc */, + { 0, 1065, 389, 5, 1, UNI_NV__1_SLASH_6 } /* nv=1/6 */, + { 0, 1823, 458, 7, 4, UNI_SC__QAAI } /* script=qaai */, + { 0, 8356, 0, 10, 0, UNI_C } /* category=c */, + { 0, 2324, 7036, 6, 26, UNI_HALFANDFULLFORMS } /* block=halfwidthandfullwidthforms */, + { 4, 1823, 658, 7, 4, UNI_SC__DOGR } /* script=dogr */, + { 10, 3021, 3876, 4, 2, UNI_IN__8 } /* in=v80 */, + { 2, 7274, 3558, 9, 9, UNI_Z } /* category=separator */, + { 21, 6841, 599, 25, 2, -UNI_DI } /* defaultignorablecodepoint=n */, + { 20, 1065, 2123, 4, 8, UNI_NV__1_SLASH_64 } /* nv=1.563e-02 */, + { 1, 7404, 6300, 20, 10, UNI_BC__RLE } /* bidiclass=righttoleftembedding */, + { 5, 2348, 584, 12, 6, UNI_CI } /* caseignorable=true */, + { 0, 7267, 0, 16, 0, UNI_gc_values_index } /* generalcategory= */, + { 1, 144, 0, 4, 0, UNI_NEWA } /* newa */, + { 3, 1391, 1869, 3, 3, UNI_WB__EB } /* wb=gaz */, + { 5, 916, 352, 4, 2, UNI_ebase_values_index } /* ebase= */, + { 0, 1667, 297, 4, 5, UNI_INORIYA } /* blk=oriya */, + { 0, 5895, 5149, 14, 7, UNI_SUPARROWSA } /* issupplementalarrowsa */, + { 1, 552, 549, 4, 3, UNI_AGE__4 } /* age=4.0 */, + { 0, 1102, 4505, 3, 6, UNI_LATN } /* scx=latin */, + { 1, 510, 515, 4, 2, UNI_NV__3_SLASH_5 } /* nv=3/5 */, + { 11, 4424, 2068, 17, 12, UNI_MEND } /* scriptextensions=mendekikakui */, + { 0, 1198, 6228, 4, 8, UNI_CJKSYMBOLS } /* incjksymbols */, + { 4, 6090, 5848, 13, 9, UNI_MYANMAREXTA } /* block=myanmarextendeda */, + { 1, 2, 598, 2, 2, UNI_cwt_values_index } /* cwt= */, + { 5, 30, 1208, 1, 5, UNI_INTHAI } /* inthai */, + { 9, 4569, 585, 5, 2, UNI_XPOSIXUPPER } /* upper=t */, + { 9, 1102, 1853, 4, 11, UNI_SYLO } /* scx=sylotinagri */, + { 0, 7892, 0, 16, 0, UNI_UIDEO } /* unifiedideograph */, + { 0, 7011, 395, 24, 2, UNI_CCC__16 } /* canonicalcombiningclass=16 */, + { 1, 1102, 160, 4, 4, UNI_PHLP } /* scx=phlp */, + { 0, 2287, 2223, 3, 3, UNI_IN__6_DOT_2 } /* in=6.2 */, + { 0, 461, 854, 2, 7, UNI_TAVT } /* istaiviet */, + { 0, 6165, 244, 3, 4, UNI_ZZZZ } /* sc=zzzz */, + { 2, 2324, 3663, 6, 10, UNI_INDEVANAGARI } /* block=devanagari */, + { 3, 2324, 6776, 6, 14, UNI_MEETEIMAYEKEXT } /* block=meeteimayekext */, + { 1, 2324, 3649, 6, 14, UNI_PHONETICEXTSUP } /* block=phoneticextsup */, + { 0, 2536, 2569, 3, 10, UNI_JG__REVERSEDPE } /* jg=reversedpe */, + { 0, 8, 353, 3, 2, UNI_PCM } /* pcm=y */, + { 0, 2301, 599, 4, 2, -UNI_XIDC } /* xidc=n */, + { 4, 2503, 934, 11, 6, -UNI_JOINC } /* joincontrol=false */, + { 1, 461, 3663, 2, 13, UNI_DEVANAGARIEXT } /* isdevanagariext */, + { 0, 271, 543, 4, 2, UNI_WB__EB } /* gcb=eb */, + { 5, 8071, 4680, 30, 4, UNI_CJKEXTF } /* blk=cjkunifiedideographsextensionf */, + { 2, 461, 5838, 2, 10, UNI_JAMO } /* ishanguljamo */, + { 1, 2766, 363, 3, 2, UNI_SM } /* gc=sm */, + { 0, 6165, 1853, 3, 11, UNI_SC__SYLO } /* sc=sylotinagri */, + { 0, 5658, 6548, 15, 9, UNI_IDENTIFIERTYPE__INCLUSION } /* identifiertype=inclusion */, + { 4, 5205, 5848, 11, 9, UNI_MYANMAREXTA } /* blk=myanmarextendeda */, + { 0, 1883, 585, 11, 2, UNI_BIDIC } /* bidicontrol=t */, + { 0, 461, 1009, 2, 6, UNI_LYCI } /* islycian */, + { 10, 4970, 274, 13, 1, UNI_emod_values_index } /* emojimodifier= */, + { 1, 2494, 4982, 3, 5, UNI_GRBASE } /* isgrbase */, + { 0, 1102, 798, 4, 4, UNI_NBAT } /* scx=nbat */, + { 1, 30, 633, 1, 4, UNI_HAN } /* ishan */, + { 1, 309, 1975, 2, 10, UNI_INOLDSOGDIAN } /* inoldsogdian */, + { 0, 1102, 450, 4, 4, UNI_MIAO } /* scx=plrd */, + { 0, 461, 47, 2, 4, UNI_CAKM } /* iscakm */, + { 0, 2536, 3743, 3, 3, UNI_JG__TAW } /* jg=taw */, + { 1, 21, 7915, 1, 29, UNI_ENCLOSEDALPHANUMSUP } /* enclosedalphanumericsupplement */, + { 5, 1906, 3746, 6, 14, UNI_KAKTOVIKNUMERALS } /* blk=kaktoviknumerals */, + { 6, 6165, 120, 3, 3, UNI_LAO } /* sc=lao */, + { 3, 461, 6510, 2, 24, UNI_HIGHPUSURROGATES } /* ishighprivateusesurrogates */, + { 0, 2432, 2422, 3, 10, UNI_MISCSYMBOLS } /* inmiscsymbols */, + { 2, 1823, 3325, 7, 6, UNI_HEBR } /* script=hebrew */, + { 2, 4970, 933, 16, 3, -UNI_EBASE } /* emojimodifierbase=f */, + { 38, 30, 4969, 1, 14, UNI_EMOD } /* isemojimodifier */, + { 12, 2766, 3791, 3, 10, UNI_SM } /* gc=mathsymbol */, + { 0, 4043, 585, 17, 2, UNI_IDSB } /* idsbinaryoperator=t */, + { 0, 5532, 585, 21, 2, UNI_CWCF } /* changeswhencasefolded=t */, + { 0, 4519, 1037, 14, 4, UNI_CYRILLICEXTB } /* block=cyrillicextb */, + { 20, 2536, 1279, 3, 6, UNI_JG__LAMADH } /* jg=lamadh */, + { 16, 7495, 2101, 28, 2, UNI_CCC__129 } /* canonicalcombiningclass=ccc129 */, + { 16, 6735, 1876, 22, 3, UNI_JG__MALAYALAMLLA } /* joininggroup=malayalamlla */, + { 16, 309, 5125, 2, 19, UNI_OTTOMANSIYAQNUMBERS } /* inottomansiyaqnumbers */, + { 1, 7267, 1478, 16, 2, UNI_ZS } /* generalcategory=zs */, + { 1, 2514, 5848, 9, 9, UNI_MYANMAREXTA } /* ismyanmarextendeda */, + { 0, 7591, 2955, 3, 11, UNI_LB__EX } /* lb=exclamation */, + { 9, 7804, 585, 11, 5, UNI_IDEO } /* ideographic=true */, + { 0, 6450, 959, 14, 6, UNI_SB__EX } /* sentencebreak=extend */, + { 0, 8505, 283, 3, 2, UNI_NT__NU } /* nt=nu */, + { 9, 6165, 108, 3, 4, UNI_KAWI } /* sc=kawi */, + { 0, 7011, 8640, 24, 18, UNI_CCC__216 } /* canonicalcombiningclass=attachedaboveright */, + { 0, 578, 395, 5, 2, UNI_CCC__216 } /* ccc=216 */, + { 1, 4424, 208, 17, 4, UNI_TGLG } /* scriptextensions=tglg */, + { 5, 1102, 1812, 4, 11, UNI_HMNG } /* scx=pahawhhmong */, + { 5, 339, 1905, 4, 2, UNI_CCC__DB } /* ccc=db */, + { 0, 450, 0, 4, 0, UNI_MIAO } /* plrd */, + { 0, 423, 4987, 3, 9, UNI_ALCHEMICAL } /* inalchemical */, + { 1, 2766, 7110, 3, 13, UNI_M } /* gc=combiningmark */, + { 0, 3391, 796, 13, 3, UNI_NV__NAN } /* numericvalue=nan */, + { 0, 8601, 4457, 8, 15, UNI_SUTTONSIGNWRITING } /* block=suttonsignwriting */, + { 3, 493, 0, 4, 0, UNI_KHOJ } /* khoj */, + { 40, 5876, 0, 4, 0, UNI_SUND } /* sund */, + { 26, 1667, 6797, 4, 19, UNI_DEVANAGARIEXTA } /* blk=devanagariextendeda */, + { 8, 4926, 0, 8, 0, UNI_TAMILSUP } /* tamilsup */, + { 3, 7383, 3312, 10, 3, UNI_BC__LRI } /* bidiclass=lri */, + { 4, 2301, 584, 10, 6, UNI_XIDC } /* xidcontinue=true */, + { 0, 2536, 5031, 3, 16, UNI_JG__HANIFIROHINGYAPA } /* jg=hanifirohingyapa */, + { 1, 1102, 779, 4, 4, UNI_OSMA } /* scx=osma */, + { 1, 474, 0, 3, 0, UNI_VAI } /* vai */, + { 0, 578, 1314, 5, 2, UNI_WB__EB } /* ccc=200 */, + { 0, 257, 353, 4, 4, UNI_CWCM } /* cwcm=yes */, + { 1, 6076, 6945, 9, 15, UNI_GEOMETRICSHAPESEXT } /* block=geometricshapesext */, + { 16, 2004, 1082, 5, 4, UNI_POSIXWORD } /* posixword */, + { 3, 1823, 1105, 6, 5, UNI_TALU } /* script=talu */, + { 4, 1618, 599, 10, 3, -UNI_SD } /* softdotted=no */, + { 0, 67, 0, 4, 0, UNI_CPRT } /* cprt */, + { 0, 5216, 4698, 10, 12, UNI_LATIN1 } /* block=latin1supplement */, + { 1, 925, 0, 4, 0, UNI_bpt_values_index } /* bpt= */, + { 1, 2324, 7972, 7, 29, UNI_CUNEIFORMNUMBERS } /* block=cuneiformnumbersandpunctuation */, + { 1, 1667, 8142, 4, 18, UNI_IDEOGRAPHICSYMBOLS } /* blk=ideographicsymbols */, + { 16, 1198, 3611, 5, 11, UNI_CJKCOMPATFORMS } /* incjkcompatforms */, + { 0, 1823, 5185, 7, 20, UNI_HLUW } /* script=anatolianhieroglyphs */, + { 2, 2832, 5848, 10, 9, UNI_CYRILLICEXTA } /* iscyrillicextendeda */, + { 16, 7892, 585, 16, 5, UNI_UIDEO } /* unifiedideograph=true */, + { 8, 339, 3526, 4, 12, UNI_CCC__0 } /* ccc=notreordered */, + { 5, 5168, 2621, 6, 9, UNI__PERL_SURROGATE } /* _perl_surrogate */, + { 0, 6165, 537, 3, 6, UNI_TNSA } /* sc=tangsa */, + { 1, 5156, 3456, 12, 4, UNI_WB__MN } /* wordbreak=midnum */, + { 13, 2536, 481, 3, 3, UNI_JG__GAF } /* jg=gaf */, + { 1, 6165, 1009, 3, 4, UNI_LYCI } /* sc=lyci */, + { 0, 6427, 650, 13, 3, UNI_JG__LAM } /* joininggroup=lam */, + { 1, 461, 1887, 2, 7, UNI_XPOSIXCNTRL } /* iscontrol */, + { 2, 3502, 7915, 5, 29, UNI_ENCLOSEDALPHANUMSUP } /* blk=enclosedalphanumericsupplement */, + { 5, 309, 772, 2, 7, UNI_OLCK } /* inolchiki */, + { 0, 4377, 599, 14, 2, UNI_NFKDQC__N } /* nfkdquickcheck=n */, + { 1, 309, 5373, 2, 11, UNI_TAIXUANJING } /* intaixuanjing */, + { 9, 7274, 599, 8, 2, UNI_N } /* category=n */, + { 2, 2324, 1009, 6, 6, UNI_INLYCIAN } /* block=lycian */, + { 5, 1102, 2852, 4, 4, UNI_MAHJ } /* scx=mahj */, + { 0, 154, 6945, 3, 15, UNI_GEOMETRICSHAPESEXT } /* geometricshapesext */, + { 3, 5712, 0, 19, 0, UNI_MERO } /* meroitichieroglyphs */, + { 10, 4424, 608, 17, 7, UNI_ELBA } /* scriptextensions=elbasan */, + { 1, 1823, 59, 7, 4, UNI_CHRS } /* script=chrs */, + { 8, 1102, 688, 4, 5, UNI_BATK } /* scx=batak */, + { 0, 6165, 725, 3, 7, UNI_SC__KALI } /* sc=kayahli */, + { 0, 3407, 2107, 14, 8, UNI_NV__9_SLASH_2 } /* numericvalue=4.500e+00 */, + { 10, 4377, 2327, 12, 3, UNI_nfkdqc_values_index } /* nfkdquickcheck= */, + { 9, 4845, 933, 16, 7, -UNI__PERL_PATWS } /* patternwhitespace=false */, + { 0, 2536, 6714, 3, 21, UNI_JG__HANIFIROHINGYAKINNAYA } /* jg=hanifirohingyakinnaya */, + { 0, 2842, 7241, 3, 26, UNI_ENCLOSEDCJK } /* isenclosedcjklettersandmonths */, + { 0, 2324, 5897, 6, 19, UNI_SUPARROWSC } /* block=supplementalarrowsc */, + { 18, 5939, 353, 5, 2, UNI__PERL_NCHAR } /* nchar=y */, + { 0, 3040, 353, 13, 2, UNI_QMARK } /* quotationmark=y */, + { 0, 2483, 0, 11, 0, UNI_CASEDLETTER } /* casedletter */, + { 0, 1272, 377, 5, 4, UNI_CJKEXTH } /* iscjkexth */, + { 0, 510, 1314, 4, 3, UNI_NV__3000 } /* nv=3000 */, + { 2, 2536, 650, 3, 3, UNI_JG__LAM } /* jg=lam */, + { 0, 3391, 765, 13, 2, UNI_NV__45 } /* numericvalue=45 */, + { 9, 1272, 0, 3, 0, UNI_C } /* isc */, + { 0, 5937, 598, 20, 4, -UNI__PERL_NCHAR } /* noncharactercodepoint=no */, + { 4, 6165, 1331, 3, 9, UNI_SC__PERM } /* sc=oldpermic */, + { 1, 330, 0, 2, 0, UNI_PD } /* pd */, + { 32, 2324, 3093, 6, 5, UNI_ASCII } /* block=ascii */, + { 0, 461, 252, 2, 2, UNI_CASEDLETTER } /* islc */, + { 20, 7198, 6103, 7, 13, UNI_SUPMATHOPERATORS } /* blk=supmathoperators */, + { 1, 4391, 2107, 14, 8, UNI_NV__7_SLASH_2 } /* numericvalue=3.500e+00 */, + { 3, 7198, 1609, 5, 9, UNI_SMALLFORMS } /* blk=smallforms */, + { 0, 2280, 581, 9, 2, UNI_IN__2 } /* presentin=2 */, + { 0, 1667, 4002, 4, 4, UNI_INMODI } /* blk=modi */, + { 1, 3177, 3, 15, 1, UNI_EA__W } /* eastasianwidth=w */, + { 1, 461, 499, 2, 4, UNI_LYDI } /* islydi */, + { 0, 5460, 599, 19, 3, -UNI_TERM } /* terminalpunctuation=no */, + { 4, 1102, 1227, 4, 7, UNI_MAKA } /* scx=makasar */, + { 0, 3391, 1313, 13, 3, UNI_NV__600 } /* numericvalue=600 */, + { 1, 1667, 2268, 4, 12, UNI_PLAYINGCARDS } /* blk=playingcards */, + { 0, 1102, 124, 4, 4, UNI_LATN } /* scx=latn */, + { 6, 6062, 7241, 7, 10, UNI_ENCLOSEDCJK } /* block=enclosedcjk */, + { 2, 1424, 2165, 7, 2, UNI_CCC__33 } /* ccc=ccc33 */, + { 1, 4360, 3001, 10, 7, UNI_LB__NU } /* linebreak=numeric */, + { 0, 1396, 4439, 3, 2, UNI_xids_values_index } /* xids= */, + { 2, 416, 0, 2, 0, UNI_NO } /* no */, + { 12, 21, 598, 2, 3, -UNI_EXT } /* ext=n */, + { 0, 6165, 406, 3, 4, UNI_DIAK } /* sc=diak */, + { 1, 292, 288, 3, 2, UNI_NV__30 } /* nv=30 */, + { 0, 461, 5682, 2, 5, UNI_GREK } /* isgreek */, + { 4, 3204, 353, 14, 4, UNI_GREXT } /* graphemeextend=yes */, + { 0, 156, 0, 4, 0, UNI_OUGR } /* ougr */, + { 2, 1667, 4896, 4, 8, UNI_BAMUMSUP } /* blk=bamumsup */, + { 0, 3391, 294, 12, 3, UNI_NV__90 } /* numericvalue=90 */, + { 1, 7944, 4680, 28, 4, UNI_CJKEXTF } /* iscjkunifiedideographsextensionf */, + { 1, 7267, 2004, 16, 2, UNI_PO } /* generalcategory=po */, + { 19, 6427, 20, 13, 2, UNI_JG__HE } /* joininggroup=he */, + { 13, 1823, 4271, 7, 17, UNI_KITS } /* script=khitansmallscript */, + { 0, 3391, 768, 13, 2, UNI_NV__27 } /* numericvalue=27 */, + { 4, 1102, 1212, 4, 9, UNI_QAAI } /* scx=inherited */, + { 0, 1667, 8474, 7, 33, UNI_CJKCOMPATIDEOGRAPHSSUP } /* blk=cjkcompatibilityideographssupplement */, + { 0, 1391, 1613, 3, 2, UNI_WB__FO } /* wb=fo */, + { 4, 6165, 2247, 3, 4, UNI_HUNG } /* sc=hung */, + { 1, 2060, 353, 5, 4, UNI_XPOSIXALPHA } /* alpha=yes */, + { 0, 1667, 668, 4, 5, UNI_INOGHAM } /* blk=ogham */, + { 17, 7267, 0, 16, 2, UNI_CASEDLETTER } /* generalcategory=l& */, + { 1, 1667, 1404, 4, 10, UNI_ASCII } /* blk=basiclatin */, + { 1, 7648, 7011, 21, 9, UNI_DT__NONCANON } /* decompositiontype=noncanonical */, + { 1, 1667, 1376, 4, 9, UNI_INSAMARITAN } /* blk=samaritan */, + { 7, 324, 5149, 3, 7, UNI_SUPARROWSA } /* suparrowsa */, + { 1, 4424, 232, 17, 2, UNI_YI } /* scriptextensions=yi */, + { 8, 30, 2255, 1, 13, UNI_PHAISTOS } /* inphaistosdisc */, + { 16, 1823, 2852, 7, 4, UNI_SC__MAHJ } /* script=mahj */, + { 0, 309, 890, 2, 5, UNI_IN__10 } /* in=10.0 */, + { 1, 1397, 598, 6, 2, UNI_ids_values_index } /* idstart= */, + { 0, 2536, 1760, 3, 3, UNI_JG__KAF } /* jg=kaf */, + { 18, 2324, 1635, 6, 10, UNI_INWARANGCITI } /* block=warangciti */, + { 4, 6165, 493, 3, 4, UNI_SC__KHOJ } /* sc=khoj */, + { 2, 5172, 0, 2, 0, UNI_CASEDLETTER } /* l_ */, + { 0, 1396, 598, 7, 3, -UNI_XIDS } /* xidstart=n */, + { 1, 461, 4176, 2, 6, UNI_HANG } /* ishangul */, + { 0, 6324, 0, 6, 0, UNI_CF } /* format */, + { 0, 5895, 8386, 5, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* issupsymbolsandpictographs */, + { 0, 3098, 353, 8, 2, UNI_XPOSIXXDIGIT } /* hexdigit=y */, + { 4, 309, 2468, 2, 6, UNI_IPAEXT } /* inipaext */, + { 1, 30, 4553, 1, 6, UNI_TITLE } /* istitle */, + { 0, 1396, 353, 4, 2, UNI_XIDS } /* xids=y */, + { 8, 1667, 917, 4, 8, UNI_INBASSAVAH } /* blk=bassavah */, + { 3, 868, 0, 4, 0, UNI_TIRH } /* tirh */, + { 3, 11, 4987, 1, 16, UNI_ALCHEMICAL } /* alchemicalsymbols */, + { 8, 3177, 0, 15, 0, UNI_ea_values_index } /* eastasianwidth= */, + { 3, 461, 1325, 2, 4, UNI_ITAL } /* isital */, + { 1, 2536, 478, 3, 3, UNI_JG__BEH } /* jg=beh */, + { 3, 7796, 0, 22, 0, UNI_ENCLOSEDIDEOGRAPHICSUP } /* enclosedideographicsup */, + { 5, 461, 172, 2, 4, UNI_RJNG } /* isrjng */, + { 0, 1667, 369, 4, 6, UNI_INGOTHIC } /* blk=gothic */, + { 3, 309, 2441, 2, 11, UNI_INNANDINAGARI } /* innandinagari */, + { 0, 1391, 2720, 2, 3, UNI_RI } /* wb=ri */, + { 0, 7591, 209, 3, 2, UNI_LB__GL } /* lb=gl */, + { 2, 1823, 786, 7, 4, UNI_HMNP } /* script=hmnp */, + { 0, 5216, 4770, 19, 10, UNI_LATINEXTADDITIONAL } /* block=latinextendedadditional */, + { 0, 309, 1033, 2, 8, UNI_JAMOEXTB } /* injamoextb */, + { 1, 1667, 1037, 7, 4, UNI_CJKEXTB } /* blk=cjkextb */, + { 0, 6165, 74, 3, 4, UNI_SC__CYRL } /* sc=cyrl */, + { 6, 1102, 983, 4, 8, UNI_HIRA } /* scx=hiragana */, + { 1, 533, 283, 3, 2, UNI_SB__NU } /* sb=nu */, + { 3, 7591, 2589, 3, 10, UNI_LB__BA } /* lb=breakafter */, + { 6, 1424, 2101, 7, 2, UNI_CCC__29 } /* ccc=ccc29 */, + { 0, 2324, 5392, 7, 10, UNI_CHEROKEESUP } /* block=cherokeesup */, + { 1, 339, 520, 5, 1, UNI_CCC__17 } /* ccc=17 */, + { 37, 3204, 585, 14, 5, UNI_GREXT } /* graphemeextend=true */, + { 0, 2324, 8607, 6, 33, UNI_SUPMATHOPERATORS } /* block=supplementalmathematicaloperators */, + { 0, 309, 1003, 2, 6, UNI_INLEPCHA } /* inlepcha */, + { 0, 8311, 7380, 32, 4, UNI_CJKEXTB } /* block=cjkunifiedideographsextensionb */, + { 0, 1285, 0, 9, 0, UNI_SIND } /* khudawadi */, + { 14, 7274, 313, 9, 4, UNI_M } /* category=mark */, + { 1, 1667, 1501, 4, 8, UNI_JAMOEXTA } /* blk=jamoexta */, + { 2, 6165, 196, 3, 4, UNI_SC__TAML } /* sc=taml */, + { 1, 3001, 406, 12, 2, UNI_NT__DI } /* numerictype=di */, + { 1, 292, 2092, 3, 2, UNI_NV__25 } /* nv=25 */, + { 0, 1667, 4176, 4, 6, UNI_INHANGUL } /* blk=hangul */, + { 2, 5959, 3570, 5, 13, UNI_HALFANDFULLFORMS } /* inhalfandfullforms */, + { 3, 1726, 5676, 3, 18, UNI_ANCIENTGREEKNUMBERS } /* isancientgreeknumbers */, + { 0, 3984, 0, 17, 0, UNI_EPRES } /* emojipresentation */, + { 8, 1667, 2692, 4, 13, UNI_VERTICALFORMS } /* blk=verticalforms */, + { 0, 4424, 3421, 17, 15, UNI_NARB } /* scriptextensions=oldnortharabian */, { 1, 1102, 1094, 4, 4, UNI_MERC } /* scx=merc */, - { 3, 313, 7660, 2, 28, UNI_VSSUP } /* invariationselectorssupplement */, - { 4, 343, 3107, 4, 5, UNI_CCC__A } /* ccc=above */, - { 0, 464, 1571, 2, 10, UNI_SAUR } /* issaurashtra */, - { 1, 7473, 356, 10, 4, UNI_XPOSIXALPHA } /* alphabetic=yes */, - { 3, 8276, 7363, 31, 14, UNI_INSC__CONSONANTPRECEDINGREPHA } /* indicsyllabiccategory=consonantprecedingrepha */, - { 0, 2740, 0, 6, 0, UNI_COPT } /* coptic */, - { 1, 895, 397, 5, 2, UNI_AGE__5_DOT_1 } /* age=v51 */, - { 0, 1539, 4007, 3, 13, UNI_SC } /* iscurrencysymbol */, - { 2, 4291, 184, 10, 2, UNI_LB__SA } /* linebreak=sa */, - { 0, 176, 0, 4, 0, UNI_ROHG } /* rohg */, - { 3, 4901, 933, 16, 7, -UNI_EBASE } /* emojimodifierbase=false */, - { 3, 6944, 7173, 25, 2, UNI_CCC__AL } /* canonicalcombiningclass=228 */, - { 2, 464, 5389, 2, 20, UNI_HMNP } /* isnyiakengpuachuehmong */, - { 3, 520, 6199, 4, 5, UNI_NV__700000 } /* nv=700000 */, - { 10, 1796, 4962, 7, 14, UNI_SC__ROHG } /* script=hanifirohingya */, - { 1, 4776, 355, 16, 2, UNI_patws_values_index } /* patternwhitespace= */, - { 3, 1377, 3416, 5, 7, UNI_WB__MB } /* wb=midnumlet */, - { 0, 524, 2261, 5, 2, UNI_patsyn_values_index } /* patsyn= */, - { 0, 1478, 5223, 4, 16, UNI_INPUNCTUATION } /* ingeneralpunctuation */, - { 2, 6944, 1303, 24, 2, UNI_CCC__32 } /* canonicalcombiningclass=32 */, - { 1, 464, 6594, 2, 4, UNI_BRAH } /* isbrah */, - { 5, 1102, 0, 8, 0, UNI_TALU } /* scx=talu */, - { 0, 7431, 771, 27, 2, UNI_CCC__21 } /* canonicalcombiningclass=ccc21 */, - { 3, 3474, 1887, 6, 8, UNI_UCASEXTA } /* block=ucasexta */, - { 5, 1796, 176, 7, 4, UNI_SC__ROHG } /* script=rohg */, - { 1, 7068, 1881, 25, 2, UNI_pcm_values_index } /* prependedconcatenationmark= */, - { 0, 464, 997, 2, 6, UNI_KTHI } /* iskaithi */, - { 0, 1796, 140, 7, 4, UNI_NARB } /* script=narb */, - { 0, 1796, 854, 7, 7, UNI_TAVT } /* script=taiviet */, - { 3, 464, 983, 2, 8, UNI_HIRA } /* ishiragana */, - { 3, 7825, 4611, 26, 4, UNI_CJKEXTF } /* cjkunifiedideographsextensionf */, - { 1, 3137, 3, 15, 1, UNI_EA__W } /* eastasianwidth=w */, - { 0, 2232, 201, 3, 3, UNI_TAML } /* istaml */, - { 2, 1879, 1133, 4, 8, UNI_INVITHKUQI } /* blk=vithkuqi */, - { 1, 1382, 2891, 7, 3, UNI_XIDS } /* xidstart=t */, - { 8, 1796, 1982, 7, 6, UNI_SC__SYRC } /* script=syriac */, - { 0, 513, 1300, 4, 2, UNI_NV__300 } /* nv=300 */, - { 10, 2890, 16, 3, 1, UNI_JT__D } /* jt=d */, - { 1, 1977, 3060, 4, 6, UNI_POSIXDIGIT } /* posixdigit */, - { 12, 2474, 6549, 3, 21, UNI_MISCTECHNICAL } /* ismiscellaneoustechnical */, - { 2, 7317, 3066, 10, 12, UNI_BC__AL } /* bidiclass=arabicletter */, - { 1, 2260, 2649, 3, 3, UNI_IN__6_DOT_1 } /* in=6.1 */, - { 9, 8533, 5762, 9, 7, UNI_SUPARROWSB } /* block=suparrowsb */, - { 0, 1879, 1508, 4, 8, UNI_INUGARITIC } /* blk=ugaritic */, - { 0, 3351, 0, 13, 0, UNI_nv_values_index } /* numericvalue= */, - { 4, 4355, 212, 17, 4, UNI_TGLG } /* scriptextensions=tglg */, - { 4, 3474, 4882, 6, 19, UNI_INEGYPTIANHIEROGLYPHS } /* block=egyptianhieroglyphs */, - { 9, 34, 8077, 1, 19, UNI_IDEOGRAPHICSYMBOLS } /* isideographicsymbols */, - { 3, 58, 1550, 2, 11, UNI_XPEO } /* sc=oldpersian */, - { 6, 802, 0, 4, 0, UNI_NBAT } /* nbat */, - { 11, 6944, 3486, 24, 12, UNI_CCC__0 } /* canonicalcombiningclass=notreordered */, - { 2, 1796, 997, 7, 6, UNI_SC__KTHI } /* script=kaithi */, - { 2, 313, 637, 2, 7, UNI_INHANUNOO } /* inhanunoo */, - { 0, 2, 0, 3, 0, UNI_CWL } /* cwl */, - { 2, 1777, 0, 5, 0, UNI_NV__10 } /* nv=10 */, - { 0, 7431, 6968, 27, 2, UNI_CCC__27 } /* canonicalcombiningclass=ccc27 */, - { 8, 6114, 1090, 3, 4, UNI_SC__LINB } /* sc=linb */, - { 2, 4291, 2904, 10, 11, UNI_LB__BB } /* linebreak=breakbefore */, - { 3, 1766, 0, 11, 0, UNI_NFCQC__M } /* nfcqc=maybe */, - { 0, 6379, 4696, 13, 5, UNI_JG__ZHAIN } /* joininggroup=zhain */, - { 7, 261, 934, 4, 2, -UNI_CWCM } /* cwcm=f */, - { 1, 2974, 1070, 11, 2, UNI_IN__3_DOT_1 } /* presentin=v31 */, - { 1, 1102, 3309, 4, 4, UNI_MERO } /* scx=mero */, - { 0, 313, 1826, 2, 11, UNI_INSYLOTINAGRI } /* insylotinagri */, - { 0, 317, 0, 4, 0, UNI_M } /* mark */, - { 0, 1796, 35, 7, 4, UNI_AVST } /* script=avst */, - { 13, 464, 5949, 2, 21, UNI_YIJING } /* isyijinghexagramsymbols */, - { 0, 7317, 6262, 10, 20, UNI_BC__PDF } /* bidiclass=popdirectionalformat */, - { 6, 1441, 356, 10, 2, UNI_DEP } /* deprecated=y */, - { 6, 7201, 1977, 16, 2, UNI_PO } /* generalcategory=po */, - { 0, 4302, 587, 5, 6, UNI_XPOSIXSPACE } /* wspace=true */, - { 7, 1236, 4454, 2, 14, UNI_CYRILLICEXTC } /* blk=cyrillicextc */, - { 1, 464, 1424, 2, 10, UNI_CHRS } /* ischorasmian */, - { 1, 6114, 951, 3, 8, UNI_SC__DUPL } /* sc=duployan */, - { 8, 464, 7732, 2, 29, UNI_ENCLOSEDIDEOGRAPHICSUP } /* isenclosedideographicsupplement */, - { 10, 2496, 4159, 3, 7, UNI_JG__HEHGOAL } /* jg=hehgoal */, - { 0, 6379, 1743, 13, 2, UNI_JG__FE } /* joininggroup=fe */, - { 2, 464, 1082, 2, 4, UNI_XPOSIXWORD } /* isword */, - { 0, 5748, 6898, 5, 22, UNI_SUPERANDSUB } /* insuperscriptsandsubscripts */, - { 0, 6687, 919, 22, 3, UNI_JG__MALAYALAMSSA } /* joininggroup=malayalamssa */, - { 4, 5565, 934, 21, 2, -UNI_CWU } /* changeswhenuppercased=f */, - { 1, 3474, 7473, 6, 27, UNI_ALPHABETICPF } /* block=alphabeticpresentationforms */, - { 0, 313, 1982, 2, 6, UNI_INSYRIAC } /* insyriac */, - { 0, 464, 4999, 2, 4, UNI_MANI } /* ismani */, - { 0, 3474, 5322, 6, 18, UNI_CHEROKEESUP } /* block=cherokeesupplement */, - { 0, 5340, 0, 4, 0, UNI_DEVA } /* deva */, - { 0, 6114, 216, 3, 4, UNI_TIBT } /* sc=tibt */, - { 2, 7201, 3594, 16, 2, UNI_NL } /* generalcategory=nl */, - { 0, 1879, 7660, 4, 18, UNI_INVS } /* blk=variationselectors */, - { 8, 3351, 294, 13, 2, UNI_NV__40 } /* numericvalue=40 */, - { 4, 7377, 0, 26, 0, UNI_KATAKANAEXT } /* katakanaphoneticextensions */, - { 0, 5825, 0, 9, 0, UNI_SUND } /* sundanese */, - { 1, 3474, 5907, 6, 7, UNI_INSINHALA } /* block=sinhala */, - { 4, 469, 0, 2, 0, UNI_SO } /* so */, - { 0, 343, 5464, 4, 17, UNI_WB__EB } /* ccc=attachedbelowleft */, - { 7, 7132, 5080, 16, 7, UNI_SUPARROWSA } /* blk=supplementalarrowsa */, - { 2, 6114, 794, 3, 4, UNI_SC__KALI } /* sc=kali */, - { 8, 4582, 0, 8, 0, UNI_BOPO } /* bopomofo */, - { 0, 8276, 7459, 31, 15, UNI_INSC__CONSONANTSUCCEEDINGREPHA } /* indicsyllabiccategory=consonantsucceedingrepha */, - { 0, 6039, 2042, 7, 11, UNI_INMENDEKIKAKUI } /* block=mendekikakui */, - { 2, 152, 0, 4, 0, UNI_OSGE } /* osge */, - { 0, 6025, 5812, 11, 6, UNI_GEORGIANSUP } /* block=georgiansup */, - { 0, 736, 6091, 3, 21, UNI_EARLYDYNASTICCUNEIFORM } /* inearlydynasticcuneiform */, - { 8, 4322, 0, 14, 0, UNI_NV__3 } /* numericvalue=3 */, - { 1, 7823, 4611, 28, 4, UNI_CJKEXTF } /* incjkunifiedideographsextensionf */, - { 0, 7148, 299, 25, 1, UNI_CCC__19 } /* canonicalcombiningclass=19 */, - { 1, 5586, 1837, 21, 8, UNI_WB__EB } /* graphemeclusterbreak=ebasegaz */, - { 2, 1102, 1657, 4, 11, UNI_CPMN } /* scx=cyprominoan */, - { 5, 1102, 1508, 4, 4, UNI_UGAR } /* scx=ugar */, - { 34, 34, 46, 1, 5, UNI_BUHD } /* isbuhd */, - { 0, 1879, 991, 4, 6, UNI_INHATRAN } /* blk=hatran */, - { 1, 23, 934, 4, 6, -UNI_POSIXXDIGIT } /* ahex=false */, - { 1, 148, 0, 4, 0, UNI_ORYA } /* orya */, - { 4, 3474, 656, 6, 5, UNI_INBUHID } /* block=buhid */, - { 2, 1102, 433, 4, 4, UNI_NKO } /* scx=nkoo */, - { 3, 464, 1383, 2, 3, UNI_IDS } /* isids */, - { 0, 536, 0, 3, 0, UNI_sb_values_index } /* sb= */, - { 2, 4355, 691, 17, 5, UNI_BATK } /* scriptextensions=batak */, - { 1, 409, 0, 2, 0, UNI_DI } /* di */, - { 1, 1796, 112, 7, 4, UNI_KITS } /* script=kits */, - { 21, 6134, 0, 4, 0, UNI_GLAG } /* glag */, - { 2, 4355, 2220, 17, 4, UNI_HUNG } /* scriptextensions=hung */, - { 0, 844, 355, 2, 5, UNI_LOE } /* loe=yes */, - { 1, 313, 686, 2, 5, UNI_INTAKRI } /* intakri */, - { 0, 296, 3792, 3, 2, UNI_NV__70 } /* nv=70 */, - { 12, 6114, 1792, 3, 4, UNI_SC__MONG } /* sc=mong */, - { 8, 3367, 392, 14, 1, UNI_NV__46 } /* numericvalue=46 */, - { 2, 4122, 588, 5, 5, UNI_XPOSIXLOWER } /* lower=true */, - { 2, 1975, 252, 7, 5, UNI_POSIXCNTRL } /* isposixcntrl */, - { 0, 2392, 2382, 3, 10, UNI_MISCSYMBOLS } /* inmiscsymbols */, - { 0, 2260, 563, 3, 3, UNI_IN__7 } /* in=7.0 */, - { 0, 7208, 602, 8, 3, UNI_NO } /* category=no */, - { 2, 464, 144, 2, 4, UNI_NEWA } /* isnewa */, - { 50, 3367, 2165, 14, 8, UNI_NV__3_SLASH_64 } /* numericvalue=4.688e-02 */, - { 4, 3137, 2498, 14, 2, UNI_EA__A } /* eastasianwidth=a */, - { 7, 1879, 3839, 4, 16, UNI_TANGUTCOMPONENTS } /* blk=tangutcomponents */, - { 3, 1102, 975, 4, 8, UNI_GURU } /* scx=gurmukhi */, - { 9, 6799, 588, 24, 2, UNI_COMPEX } /* fullcompositionexclusion=t */, - { 11, 4355, 402, 18, 3, UNI_MIAO } /* scriptextensions=miao */, - { 3, 3474, 618, 6, 7, UNI_INELYMAIC } /* block=elymaic */, - { 6, 6379, 2506, 13, 3, UNI_JG__FEH } /* joininggroup=feh */, - { 4, 4355, 1495, 17, 8, UNI_JAVA } /* scriptextensions=javanese */, - { 1, 1796, 676, 7, 5, UNI_OSGE } /* script=osage */, - { 1, 4355, 4827, 17, 5, UNI_BAMU } /* scriptextensions=bamum */, - { 1, 1975, 3060, 6, 6, UNI_POSIXDIGIT } /* isposixdigit */, - { 2, 34, 6351, 1, 8, UNI_RADICAL } /* isradical */, - { 45, 608, 4370, 2, 2, UNI_ids_values_index } /* ids= */, - { 1, 6944, 2127, 24, 2, UNI_CCC__13 } /* canonicalcombiningclass=13 */, - { 1, 8374, 1385, 33, 5, UNI__PERL_PROBLEMATIC_LOCALE_FOLDEDS_START } /* _perl_problematic_locale_foldeds_start */, - { 3, 3593, 6890, 7, 9, UNI_LATINEXTE } /* inlatinextendede */, - { 13, 5718, 588, 4, 5, UNI_EMOD } /* emod=true */, - { 0, 4355, 4551, 17, 7, UNI_LINB } /* scriptextensions=linearb */, - { 5, 4996, 4178, 13, 4, UNI_JG__MANICHAEANKAPH } /* jg=manichaeankaph */, - { 0, 2443, 934, 5, 2, -UNI_CASED } /* cased=f */, - { 4, 3474, 825, 6, 7, UNI_SHAW } /* block=shavian */, - { 18, 464, 790, 2, 4, UNI_HMNP } /* ishmnp */, - { 2, 110, 12, 1, 1, UNI_ZP } /* zp */, - { 13, 2353, 5643, 3, 18, UNI_COUNTINGROD } /* incountingrodnumerals */, - { 0, 3474, 0, 6, 0, UNI_blk_values_index } /* block= */, - { 1, 6379, 3249, 13, 12, UNI_JG__FINALSEMKATH } /* joininggroup=finalsemkath */, - { 0, 2961, 3223, 12, 7, UNI_XPOSIXDIGIT } /* numerictype=decimal */, - { 1, 4500, 356, 5, 4, UNI_XPOSIXUPPER } /* upper=yes */, - { 5, 337, 0, 6, 0, UNI_CARI } /* carian */, - { 4, 7823, 1491, 5, 4, UNI_CJKEXTA } /* incjkexta */, - { 1, 4355, 1424, 17, 10, UNI_CHRS } /* scriptextensions=chorasmian */, - { 0, 3474, 5322, 6, 11, UNI_CHEROKEESUP } /* block=cherokeesup */, - { 2, 6039, 7556, 7, 19, UNI_MISCSYMBOLS } /* block=miscellaneoussymbols */, - { 4, 296, 1299, 3, 4, UNI_NV__6000 } /* nv=6000 */, - { 2, 6379, 4159, 13, 7, UNI_JG__HEHGOAL } /* joininggroup=hehgoal */, - { 0, 2496, 4696, 3, 5, UNI_JG__ZHAIN } /* jg=zhain */, - { 9, 2678, 3651, 3, 14, UNI_BC__NSM } /* bc=nonspacingmark */, - { 1, 6114, 742, 3, 7, UNI_SC__MAND } /* sc=mandaic */, - { 1, 3748, 891, 15, 2, UNI_NV__1_SLASH_10 } /* numericvalue=1/10 */, - { 0, 464, 1461, 3, 9, UNI_XPOSIXBLANK } /* ishorizspace */, - { 0, 6799, 602, 24, 2, -UNI_COMPEX } /* fullcompositionexclusion=n */, - { 39, 7317, 176, 11, 2, UNI_BC__LRO } /* bidiclass=lro */, - { 0, 2474, 0, 3, 0, UNI_M } /* ism */, - { 2, 4355, 372, 17, 4, UNI_GOTH } /* scriptextensions=goth */, - { 1, 3974, 0, 17, 0, UNI_IDSB } /* idsbinaryoperator */, - { 0, 4122, 602, 5, 2, -UNI_XPOSIXLOWER } /* lower=n */, - { 3, 4901, 355, 16, 2, UNI_ebase_values_index } /* emojimodifierbase= */, - { 0, 464, 449, 2, 4, UNI_PHLI } /* isphli */, - { 1, 5186, 345, 19, 2, UNI_extpict_values_index } /* extendedpictographic= */, - { 0, 3164, 588, 14, 5, UNI_GREXT } /* graphemeextend=true */, - { 14, 1102, 1202, 4, 4, UNI_THAI } /* scx=thai */, - { 0, 2974, 299, 11, 2, UNI_IN__9 } /* presentin=v90 */, - { 4, 6944, 396, 24, 2, UNI_CCC__15 } /* canonicalcombiningclass=15 */, - { 0, 2726, 4077, 3, 15, UNI_PD } /* gc=dashpunctuation */, - { 9, 4450, 8150, 7, 24, UNI_DIACRITICALS } /* block=combiningdiacriticalmarks */, - { 2, 1796, 7377, 7, 8, UNI_SC__KANA } /* script=katakana */, - { 0, 4355, 1951, 17, 7, UNI_SOGD } /* scriptextensions=sogdian */, - { 0, 5087, 3423, 10, 12, UNI_WB__EB } /* wordbreak=glueafterzwj */, - { 2, 4355, 124, 17, 4, UNI_LATN } /* scriptextensions=latn */, - { 0, 4355, 5727, 17, 21, UNI_PRTI } /* scriptextensions=inscriptionalparthian */, - { 0, 464, 4092, 2, 9, UNI_DIA } /* isdiacritic */, - { 1, 3000, 356, 13, 4, UNI_QMARK } /* quotationmark=yes */, - { 3, 4355, 168, 17, 4, UNI_COPT } /* scriptextensions=qaac */, - { 0, 3794, 2137, 14, 8, UNI_NV__5_SLASH_6 } /* numericvalue=8.333e-01 */, - { 6, 3641, 837, 4, 3, UNI_SUPPUAA } /* suppuaa */, - { 0, 1216, 1491, 4, 4, UNI_KANAEXTA } /* kanaexta */, - { 1, 3474, 2740, 6, 6, UNI_INCOPTIC } /* block=coptic */, - { 3, 5607, 6486, 10, 14, UNI_IDENTIFIERSTATUS__ALLOWED } /* identifierstatus=allowed */, - { 0, 3058, 601, 7, 2, UNI_hex_values_index } /* hexdigit= */, - { 1, 313, 4467, 2, 18, UNI_COPTICEPACTNUMBERS } /* incopticepactnumbers */, - { 1, 2712, 278, 5, 1, UNI_emoji_values_index } /* emoji= */, - { 3, 7317, 3272, 10, 3, UNI_BC__LRI } /* bidiclass=lri */, - { 3, 464, 661, 2, 4, UNI_DOGR } /* isdogr */, - { 0, 3450, 5643, 5, 18, UNI_COUNTINGROD } /* blk=countingrodnumerals */, - { 0, 4302, 355, 5, 3, UNI_XPOSIXSPACE } /* wspace=y */, - { 0, 1796, 496, 7, 6, UNI_SC__KHOJ } /* script=khojki */, - { 2, 6114, 4882, 3, 19, UNI_EGYP } /* sc=egyptianhieroglyphs */, - { 15, 6629, 0, 14, 0, UNI_LM } /* modifierletter */, - { 4, 7018, 1037, 8, 4, UNI_ARABICEXTB } /* inarabicextb */, - { 3, 1102, 248, 4, 4, UNI_ZZZZ } /* scx=zzzz */, - { 0, 5, 0, 3, 0, UNI_EXT } /* ext */, - { 2, 6112, 5711, 5, 16, UNI_INSC__SYLLABLEMODIFIER } /* insc=syllablemodifier */, - { 0, 1796, 1657, 7, 11, UNI_SC__CPMN } /* script=cyprominoan */, - { 1, 464, 4533, 2, 18, UNI_PI } /* isinitialpunctuation */, - { 0, 313, 2771, 2, 12, UNI_KHMERSYMBOLS } /* inkhmersymbols */, - { 0, 3474, 4918, 7, 16, UNI_ALCHEMICAL } /* block=alchemicalsymbols */, - { 1, 5186, 356, 20, 2, UNI_EXTPICT } /* extendedpictographic=y */, - { 16, 1879, 574, 4, 7, UNI_INAVESTAN } /* blk=avestan */, - { 1, 464, 5284, 2, 20, UNI_PHLI } /* isinscriptionalpahlavi */, - { 2, 1383, 601, 3, 4, -UNI_IDST } /* idst=no */, - { 9, 103, 0, 2, 0, UNI_UPPERCASELETTER } /* lu */, - { 2, 4122, 588, 5, 2, UNI_XPOSIXLOWER } /* lower=t */, - { 0, 7823, 6309, 5, 13, UNI_CJKCOMPAT } /* incjkcompatibility */, - { 3, 1382, 356, 8, 4, UNI_XIDS } /* xidstart=yes */, - { 2, 2692, 5797, 10, 9, UNI_ARABICEXTA } /* blk=arabicextendeda */, - { 8, 6039, 2813, 7, 6, UNI_MAHJONG } /* block=mahjong */, - { 9, 464, 2463, 2, 5, UNI_JOINC } /* isjoinc */, - { 0, 1271, 0, 9, 0, UNI_SIND } /* khudawadi */, - { 2, 2033, 602, 5, 3, -UNI_XPOSIXALPHA } /* alpha=no */, - { 0, 2253, 552, 11, 3, UNI_IN__14 } /* presentin=14.0 */, - { 1, 5888, 356, 5, 4, UNI__PERL_NCHAR } /* nchar=yes */, - { 1, 7208, 3933, 9, 14, UNI_SK } /* category=modifiersymbol */, - { 1, 464, 287, 2, 5, UNI_NSHU } /* isnushu */, - { 8, 3474, 2986, 6, 14, UNI_INPSALTERPAHLAVI } /* block=psalterpahlavi */, - { 18, 7880, 0, 5, 0, UNI_CJK } /* iscjk */, - { 2, 4355, 742, 17, 4, UNI_MAND } /* scriptextensions=mand */, - { 0, 7828, 602, 16, 3, -UNI_UIDEO } /* unifiedideograph=no */, - { 8, 1377, 655, 3, 2, UNI_WB__MB } /* wb=mb */, - { 0, 1796, 1255, 7, 4, UNI_SOYO } /* script=soyo */, - { 0, 5844, 8319, 5, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* issupsymbolsandpictographs */, - { 11, 4355, 469, 17, 4, UNI_SOGO } /* scriptextensions=sogo */, - { 1, 3462, 5797, 12, 9, UNI_ETHIOPICEXTA } /* blk=ethiopicextendeda */, - { 0, 6114, 991, 3, 4, UNI_HATR } /* sc=hatr */, - { 7, 464, 7385, 2, 18, UNI_PHONETICEXT } /* isphoneticextensions */, - { 6, 7605, 0, 21, 0, UNI_LB__H2 } /* hangulsyllabletype=lv */, - { 5, 8533, 4388, 8, 15, UNI_SUTTONSIGNWRITING } /* block=suttonsignwriting */, - { 2, 6025, 6878, 9, 20, UNI_GEOMETRICSHAPESEXT } /* block=geometricshapesextended */, - { 1, 600, 1679, 3, 3, UNI_DT__FRA } /* dt=fra */, - { 4, 5099, 2275, 6, 6, UNI__PERL_IDCONT } /* _perl_idcont */, - { 1, 275, 10, 4, 2, UNI_LB__CR } /* gcb=cr */, - { 6, 2473, 3640, 3, 4, UNI_LISUSUP } /* lisusup */, - { 0, 232, 0, 4, 0, UNI_XSUX } /* xsux */, - { 0, 3823, 356, 16, 4, UNI_STERM } /* sentenceterminal=yes */, - { 8, 23, 602, 4, 2, -UNI_POSIXXDIGIT } /* ahex=n */, - { 6, 464, 6134, 2, 13, UNI_GLAGOLITICSUP } /* isglagoliticsup */, - { 1, 313, 671, 2, 5, UNI_INOGHAM } /* inogham */, - { 0, 378, 934, 5, 2, -UNI_GREXT } /* grext=f */, - { 12, 1011, 588, 2, 2, UNI_CI } /* ci=t */, - { 0, 464, 1248, 2, 4, UNI_SIDD } /* issidd */, - { 0, 608, 645, 2, 3, UNI_idst_values_index } /* idst= */, - { 1, 7688, 2243, 23, 4, UNI_JG__MANICHAEANAYIN } /* joininggroup=manichaeanayin */, - { 0, 1879, 6134, 4, 13, UNI_GLAGOLITICSUP } /* blk=glagoliticsup */, - { 1, 3474, 3637, 6, 7, UNI_LISUSUP } /* block=lisusup */, - { 3, 464, 5787, 2, 19, UNI_JAMOEXTA } /* ishanguljamoextendeda */, - { 1, 1102, 1009, 4, 4, UNI_LYCI } /* scx=lyci */, - { 4, 1441, 934, 3, 6, -UNI_DEP } /* dep=false */, - { 12, 1516, 4203, 3, 16, UNI_KITS } /* iskhitansmallscript */, - { 0, 2926, 1110, 3, 7, UNI_SPECIALS } /* inspecials */, - { 0, 6114, 244, 3, 4, UNI_SC__ZYYY } /* sc=zyyy */, - { 0, 5888, 934, 5, 6, -UNI__PERL_NCHAR } /* nchar=false */, - { 7, 2253, 2322, 10, 10, UNI_IN__NA } /* presentin=unassigned */, - { 10, 464, 1927, 2, 12, UNI_GONG } /* isgunjalagondi */, - { 0, 4450, 8340, 7, 34, UNI_DIACRITICALSFORSYMBOLS } /* block=combiningdiacriticalmarksforsymbols */, - { 0, 7584, 1719, 18, 4, UNI_DT__VERT } /* decompositiontype=vert */, - { 0, 1879, 429, 4, 3, UNI_INMRO } /* blk=mro */, - { 0, 464, 132, 2, 4, UNI_MTEI } /* ismtei */, - { 40, 5147, 4701, 14, 10, UNI_LATINEXTADDITIONAL } /* block=latinextadditional */, - { 1, 7201, 256, 16, 2, UNI_CASEDLETTER } /* generalcategory=lc */, - { 10, 296, 1155, 3, 2, UNI_NV__35 } /* nv=35 */, - { 0, 887, 2056, 5, 2, UNI_IN__1_DOT_1 } /* age=1.1 */, - { 1, 6114, 1198, 3, 4, UNI_SC__GRAN } /* sc=gran */, - { 0, 1796, 1882, 6, 5, UNI_SC__KANA } /* script=kana */, - { 1, 7208, 69, 9, 2, UNI_MN } /* category=mn */, - { 8, 3000, 356, 13, 2, UNI_QMARK } /* quotationmark=y */, - { 4, 5136, 2603, 5, 12, UNI_MISCTECHNICAL } /* blk=misctechnical */, - { 7, 3823, 588, 16, 2, UNI_STERM } /* sentenceterminal=t */, - { 0, 270, 934, 3, 2, -UNI_CWT } /* cwt=f */, - { 0, 2973, 0, 5, 0, UNI_EPRES } /* epres */, - { 1, 6114, 6103, 3, 9, UNI_XSUX } /* sc=cuneiform */, - { 1, 4355, 1550, 16, 11, UNI_XPEO } /* scriptextensions=oldpersian */, - { 28, 2463, 278, 11, 1, UNI_joinc_values_index } /* joincontrol= */, - { 2, 275, 2680, 3, 3, UNI_RI } /* gcb=ri */, - { 0, 1011, 602, 2, 2, -UNI_CI } /* ci=n */, - { 0, 3351, 7173, 13, 2, UNI_NV__28 } /* numericvalue=28 */, - { 1, 313, 1927, 2, 12, UNI_INGUNJALAGONDI } /* ingunjalagondi */, - { 2, 925, 601, 2, 6, UNI_BPT__N } /* bpt=none */, - { 41, 2275, 934, 3, 2, -UNI_IDC } /* idc=f */, - { 0, 3748, 2104, 14, 8, UNI_NV__1_SLASH_6 } /* numericvalue=1.667e-01 */, - { 2, 464, 2771, 2, 12, UNI_KHMERSYMBOLS } /* iskhmersymbols */, - { 1, 6114, 967, 3, 8, UNI_SC__GUJR } /* sc=gujarati */, - { 4, 6114, 776, 3, 7, UNI_OLCK } /* sc=olchiki */, - { 3, 4355, 661, 17, 5, UNI_DOGR } /* scriptextensions=dogra */, - { 0, 8244, 4341, 32, 4, UNI_CJKEXTA } /* block=cjkunifiedideographsextensiona */, - { 6, 7317, 4758, 10, 18, UNI_BC__B } /* bidiclass=paragraphseparator */, - { 1, 313, 5214, 2, 9, UNI_HALFMARKS } /* inhalfmarks */, - { 3, 1597, 602, 10, 3, -UNI_SD } /* softdotted=no */, - { 1, 3351, 2081, 13, 3, UNI_NV__500 } /* numericvalue=500 */, - { 7, 313, 3285, 2, 6, UNI_INHEBREW } /* inhebrew */, - { 1, 798, 0, 4, 0, UNI_LANA } /* lana */, - { 0, 5205, 0, 18, 0, UNI_HALFMARKS } /* combininghalfmarks */, - { 0, 7317, 5978, 10, 12, UNI_BC__AN } /* bidiclass=arabicnumber */, - { 0, 257, 278, 4, 1, UNI_cwcf_values_index } /* cwcf= */, - { 0, 464, 98, 2, 4, UNI_GURU } /* isguru */, - { 0, 1377, 57, 4, 1, UNI_WB__MN } /* wb=mn */, - { 10, 8533, 5358, 7, 17, UNI_SMALLKANAEXT } /* block=smallkanaextension */, - { 0, 4355, 473, 17, 4, UNI_TNSA } /* scriptextensions=tnsa */, - { 3, 3474, 1614, 6, 10, UNI_INWARANGCITI } /* block=warangciti */, - { 7, 5147, 4441, 10, 10, UNI_LATINEXTB } /* block=latinextendedb */, - { 0, 3474, 287, 6, 5, UNI_INNUSHU } /* block=nushu */, - { 0, 3351, 584, 12, 3, UNI_NV__22 } /* numericvalue=22 */, - { 4, 1440, 278, 2, 1, UNI_sd_values_index } /* sd= */, - { 2, 4355, 1009, 17, 6, UNI_LYCI } /* scriptextensions=lycian */, - { 0, 5586, 7068, 21, 7, UNI_GCB__PP } /* graphemeclusterbreak=prepend */, - { 1, 6570, 6240, 3, 6, UNI_INPC__LEFT } /* inpc=left */, - { 6, 1102, 868, 4, 4, UNI_TIRH } /* scx=tirh */, - { 8, 6402, 4122, 14, 5, UNI_SB__LO } /* sentencebreak=lower */, - { 9, 313, 6416, 2, 23, UNI_SHORTHANDFORMATCONTROLS } /* inshorthandformatcontrols */, - { 0, 736, 5769, 3, 18, UNI_ENCLOSEDALPHANUMSUP } /* inenclosedalphanumsup */, - { 4, 2625, 356, 13, 4, UNI_PATSYN } /* patternsyntax=yes */, - { 1, 6011, 6142, 12, 12, UNI_ETHIOPICSUP } /* block=ethiopicsupplement */, - { 0, 426, 5625, 3, 18, UNI_ANCIENTGREEKNUMBERS } /* inancientgreeknumbers */, - { 3, 895, 299, 5, 2, UNI_AGE__9 } /* age=v90 */, - { 5, 2260, 2056, 4, 2, UNI_IN__1_DOT_1 } /* in=1.1 */, - { 16, 48, 1888, 1, 3, UNI_UCAS } /* ucas */, - { 3, 3474, 1982, 6, 6, UNI_INSYRIAC } /* block=syriac */, - { 18, 5136, 2042, 5, 11, UNI_INMENDEKIKAKUI } /* blk=mendekikakui */, - { 52631, 8244, 3929, 32, 4, UNI_CJKEXTG } /* block=cjkunifiedideographsextensiong */, - { 25, 1796, 120, 7, 4, UNI_LAO } /* script=laoo */, - { 1, 313, 326, 2, 5, UNI_VSSUP } /* invssup */, - { 0, 4901, 602, 13, 3, -UNI_EMOD } /* emojimodifier=no */, - { 1, 1102, 656, 4, 5, UNI_BUHD } /* scx=buhid */, - { 0, 2496, 1736, 3, 3, UNI_JG__KAF } /* jg=kaf */, - { 1, 1102, 2041, 4, 12, UNI_MEND } /* scx=mendekikakui */, - { 14, 3474, 909, 6, 8, UNI_INBALINESE } /* block=balinese */, - { 8, 180, 0, 4, 0, UNI_RUNR } /* runr */, - { 1, 738, 934, 2, 2, UNI_EA__F } /* ea=f */, - { 0, 7201, 844, 16, 2, UNI_LO } /* generalcategory=lo */, - { 0, 1410, 1304, 7, 2, UNI_CCC__20 } /* ccc=ccc20 */, - { 0, 1102, 540, 4, 6, UNI_TNSA } /* scx=tangsa */, - { 3, 4355, 4107, 17, 4, UNI_HANG } /* scriptextensions=hang */, - { 3, 8007, 0, 24, 0, UNI_CJK } /* blk=cjkunifiedideographs */, - { 0, 7208, 4485, 9, 15, UNI_TITLE } /* category=titlecaseletter */, - { 1, 5147, 3704, 7, 15, UNI_LINEARBIDEOGRAMS } /* block=linearbideograms */, - { 0, 6114, 232, 3, 4, UNI_XSUX } /* sc=xsux */, - { 101, 1796, 240, 7, 4, UNI_ZANB } /* script=zanb */, - { 8, 5147, 660, 18, 2, UNI_LATINEXTD } /* block=latinextendedd */, - { 2, 6112, 6856, 14, 11, UNI_INSC__CONSONANTPLACEHOLDER } /* insc=consonantplaceholder */, - { 9, 7527, 2014, 3, 2, UNI_LB__H3 } /* lb=h3 */, - { 0, 1059, 1769, 4, 3, UNI_nfkdqc_values_index } /* nfkdqc= */, - { 2, 1915, 959, 8, 6, UNI_GREXT } /* graphemeextend */, - { 0, 378, 588, 5, 2, UNI_GREXT } /* grext=t */, - { 32, 2678, 4418, 3, 15, UNI_BC__CS } /* bc=commonseparator */, - { 7, 306, 588, 5, 5, UNI__PERL_PATWS } /* patws=true */, - { 0, 1796, 220, 7, 4, UNI_TOTO } /* script=toto */, - { 0, 4122, 933, 8, 7, -UNI_XPOSIXLOWER } /* lowercase=false */, - { 8, 2692, 1491, 10, 4, UNI_ARABICEXTA } /* blk=arabicexta */, - { 1, 3474, 372, 6, 6, UNI_INGOTHIC } /* block=gothic */, - { 4, 833, 0, 4, 0, UNI_TERM } /* term */, - { 0, 513, 0, 4, 0, UNI_NV__3 } /* nv=3 */, - { 2, 464, 1227, 2, 7, UNI_MULT } /* ismultani */, - { 12, 600, 4208, 3, 5, UNI_DT__SML } /* dt=small */, - { 17, 2181, 2060, 8, 4, UNI_NV__7_SLASH_12 } /* nv=5.833e-01 */, - { 0, 7740, 345, 10, 2, UNI_ideo_values_index } /* ideographic= */, - { 0, 6112, 4050, 5, 12, UNI_INSC__NUMBERJOINER } /* insc=numberjoiner */, - { 0, 4355, 3435, 17, 15, UNI_ZANB } /* scriptextensions=zanabazarsquare */, - { 0, 2981, 299, 4, 2, UNI_IN__9 } /* in=v90 */, - { 18, 6114, 39, 3, 4, UNI_BATK } /* sc=batk */, - { 0, 1410, 391, 7, 2, UNI_CCC__26 } /* ccc=ccc26 */, - { 0, 1977, 4500, 5, 5, UNI_POSIXUPPER } /* posixupper */, - { 0, 2274, 0, 4, 0, UNI_XIDC } /* xidc */, - { 0, 502, 0, 4, 0, UNI_LYDI } /* lydi */, - { 79, 1879, 4827, 4, 15, UNI_BAMUMSUP } /* blk=bamumsupplement */, - { 0, 2483, 3228, 8, 5, UNI_XPOSIXALNUM } /* isxposixalnum */, - { 3, 3462, 1037, 12, 4, UNI_ETHIOPICEXTB } /* blk=ethiopicextb */, - { 19, 3338, 602, 13, 3, UNI_DT__CAN } /* nfdquickcheck=no */, - { 8, 1867, 602, 12, 3, -UNI_BIDIM } /* bidimirrored=no */, - { 0, 6114, 1308, 3, 9, UNI_ITAL } /* sc=olditalic */, - { 0, 6114, 188, 3, 4, UNI_SGNW } /* sc=sgnw */, - { 0, 5147, 1037, 11, 4, UNI_LATINEXTB } /* block=latinextb */, - { 0, 3594, 0, 2, 0, UNI_NL } /* nl */, - { 0, 555, 2128, 4, 3, UNI_AGE__3_DOT_1 } /* age=3.1 */, - { 0, 464, 1915, 2, 5, UNI_XPOSIXGRAPH } /* isgraph */, - { 0, 3915, 0, 17, 0, UNI_EPRES } /* emojipresentation */, - { 0, 34, 1190, 1, 8, UNI_BENG } /* isbengali */, - { 1, 1796, 661, 7, 5, UNI_SC__DOGR } /* script=dogra */, - { 0, 5718, 602, 4, 2, -UNI_EMOD } /* emod=n */, - { 2, 637, 0, 7, 0, UNI_HANO } /* hanunoo */, - { 0, 1796, 1248, 7, 4, UNI_SIDD } /* script=sidd */, - { 22, 275, 959, 4, 6, UNI_GCB__EX } /* gcb=extend */, - { 0, 1879, 493, 7, 3, UNI_KANBUN } /* blk=kanbun */, - { 4, 1539, 64, 3, 3, UNI_CHRS } /* ischrs */, - { 0, 1796, 244, 7, 4, UNI_SC__ZYYY } /* script=zyyy */, - { 0, 2181, 0, 4, 0, UNI_NV__5 } /* nv=5 */, - { 0, 3823, 934, 16, 2, -UNI_STERM } /* sentenceterminal=f */, - { 1, 313, 5806, 2, 19, UNI_MONGOLIANSUP } /* inmongoliansupplement */, - { 0, 736, 8047, 3, 31, UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS } /* inegyptianhieroglyphformatcontrols */, - { 1, 6039, 8307, 7, 33, UNI_MISCPICTOGRAPHS } /* block=miscellaneoussymbolsandpictographs */, - { 12, 4355, 749, 17, 7, UNI_MARC } /* scriptextensions=marchen */, - { 3, 2625, 602, 13, 2, -UNI_PATSYN } /* patternsyntax=n */, - { 10, 464, 1003, 2, 4, UNI_LEPC } /* islepc */, - { 13, 1879, 618, 4, 7, UNI_INELYMAIC } /* blk=elymaic */, - { 0, 2363, 1491, 10, 4, UNI_ETHIOPICEXTA } /* inethiopicexta */, - { 1, 4291, 3594, 10, 2, UNI_LB__NL } /* linebreak=nl */, - { 0, 5087, 1591, 10, 2, UNI_LB__LF } /* wordbreak=lf */, - { 0, 3474, 6439, 6, 13, UNI_ZNAMENNYMUSIC } /* block=znamennymusic */, - { 0, 464, 6134, 2, 10, UNI_GLAG } /* isglagolitic */, - { 4, 8599, 0, 18, 0, UNI_CANS } /* canadianaboriginal */, - { 2, 464, 148, 2, 4, UNI_ORYA } /* isorya */, - { 1, 220, 0, 4, 0, UNI_TOTO } /* toto */, - { 0, 3669, 3665, 12, 4, UNI_JG__MALAYALAMLLLA } /* jg=malayalamllla */, - { 1, 5544, 356, 21, 2, UNI_CWT } /* changeswhentitlecased=y */, - { 0, 1102, 661, 4, 4, UNI_DOGR } /* scx=dogr */, - { 1, 6114, 106, 3, 4, UNI_HMNG } /* sc=hmng */, - { 2, 229, 0, 2, 0, UNI_PE } /* pe */, - { 11, 6379, 4962, 13, 16, UNI_JG__HANIFIROHINGYAPA } /* joininggroup=hanifirohingyapa */, - { 4, 4500, 602, 5, 2, -UNI_XPOSIXUPPER } /* upper=n */, - { 0, 4355, 156, 17, 4, UNI_OUGR } /* scriptextensions=ougr */, - { 0, 1102, 94, 4, 4, UNI_GUJR } /* scx=gujr */, - { 10, 313, 6103, 2, 9, UNI_INCUNEIFORM } /* incuneiform */, - { 1, 2726, 117, 3, 2, UNI_XPOSIXDIGIT } /* gc=nd */, - { 3, 6402, 2728, 13, 6, UNI_SB__XX } /* sentencebreak=other */, - { 16, 7201, 1582, 16, 6, UNI_L } /* generalcategory=letter */, - { 14, 1410, 1302, 8, 2, UNI_CCC__103 } /* ccc=ccc103 */, - { 0, 1702, 5797, 8, 9, UNI_ARABICEXTA } /* isarabicextendeda */, - { 3, 6402, 0, 14, 0, UNI_sb_values_index } /* sentencebreak= */, - { 5, 7201, 115, 16, 2, UNI_SK } /* generalcategory=sk */, - { 1, 2474, 5797, 9, 9, UNI_MYANMAREXTA } /* ismyanmarextendeda */, - { 4, 2496, 2824, 3, 11, UNI_JG__ROHINGYAYEH } /* jg=rohingyayeh */, - { 0, 343, 771, 4, 2, UNI_CCC__21 } /* ccc=21 */, - { 20, 4355, 94, 17, 4, UNI_GUJR } /* scriptextensions=gujr */, - { 1, 2474, 2603, 3, 12, UNI_MISCTECHNICAL } /* ismisctechnical */, - { 0, 2712, 0, 14, 0, UNI_ECOMP } /* emojicomponent */, - { 4, 4776, 933, 16, 7, -UNI__PERL_PATWS } /* patternwhitespace=false */, - { 0, 4615, 2762, 5, 9, UNI_ALPHABETICPF } /* inalphabeticpf */, - { 1, 409, 602, 3, 3, -UNI_DIA } /* dia=no */, - { 4, 3164, 278, 14, 1, UNI_grext_values_index } /* graphemeextend= */, - { 3, 3474, 1027, 6, 6, UNI_INYEZIDI } /* block=yezidi */, - { 2, 1856, 278, 11, 1, UNI_bidic_values_index } /* bidicontrol= */, - { 0, 2625, 1104, 12, 3, UNI_PATSYN } /* patternsyntax=t */, - { 11, 1796, 78, 7, 4, UNI_SC__CYRL } /* script=cyrl */, - { 3, 6114, 31, 3, 4, UNI_ARMI } /* sc=armi */, - { 2, 4437, 0, 14, 0, UNI_LATINEXTB } /* latinextendedb */, - { 8, 23, 588, 4, 5, UNI_POSIXXDIGIT } /* ahex=true */, - { 14, 8276, 2783, 22, 9, UNI_INSC__NONJOINER } /* indicsyllabiccategory=nonjoiner */, - { 1, 12, 0, 2, 0, UNI_PC } /* pc */, - { 21, 6025, 2332, 7, 12, UNI_GREEKEXT } /* block=greekextended */, - { 1, 313, 3839, 2, 16, UNI_TANGUTCOMPONENTS } /* intangutcomponents */, - { 0, 3450, 4590, 12, 9, UNI_CYRILLICEXTC } /* blk=cyrillicextendedc */, - { 1, 313, 2401, 2, 11, UNI_INNANDINAGARI } /* innandinagari */, - { 1, 2496, 2688, 4, 3, UNI_JG__ALEF } /* jg=alef */, - { 0, 7201, 4533, 16, 18, UNI_PI } /* generalcategory=initialpunctuation */, - { 1, 4783, 933, 9, 7, -UNI_XPOSIXSPACE } /* whitespace=false */, - { 0, 7527, 2581, 3, 9, UNI_LB__SG } /* lb=surrogate */, - { 0, 464, 1326, 2, 9, UNI_ORKH } /* isoldturkic */, - { 1, 536, 595, 3, 2, UNI_SB__SE } /* sb=se */, - { 1, 5607, 6996, 15, 11, UNI_IDENTIFIERTYPE__RECOMMENDED } /* identifiertype=recommended */, - { 2, 6114, 19, 3, 4, UNI_AGHB } /* sc=aghb */, - { 3, 1704, 6142, 4, 12, UNI_ARABICSUP } /* arabicsupplement */, - { 3, 1879, 1289, 4, 9, UNI_INNEWTAILUE } /* blk=newtailue */, - { 15, 7208, 3514, 9, 13, UNI_ZL } /* category=lineseparator */, - { 0, 3351, 772, 13, 2, UNI_NV__17 } /* numericvalue=17 */, - { 0, 7740, 602, 11, 3, -UNI_IDEO } /* ideographic=no */, - { 1, 7527, 57, 3, 2, UNI_LB__NS } /* lb=ns */, - { 0, 7584, 6944, 21, 5, UNI_DT__NONCANON } /* decompositiontype=noncanon */, - { 0, 343, 6967, 3, 3, UNI_CCC__27 } /* ccc=27 */, - { 21, 1879, 6103, 4, 9, UNI_INCUNEIFORM } /* blk=cuneiform */, - { 1, 313, 2217, 2, 12, UNI_INOLDHUNGARIAN } /* inoldhungarian */, - { 1, 651, 0, 5, 0, UNI_ADLM } /* adlam */, - { 0, 8276, 0, 22, 0, UNI_insc_values_index } /* indicsyllabiccategory= */, - { 0, 2926, 4641, 3, 8, UNI_SYRIACSUP } /* insyriacsup */, - { 0, 464, 3991, 2, 7, UNI_BRAI } /* isbraille */, - { 0, 875, 588, 5, 5, UNI_UIDEO } /* uideo=true */, - { 14, 343, 3902, 4, 13, UNI_CCC__IS } /* ccc=iotasubscript */, - { 3, 7338, 6252, 20, 10, UNI_BC__RLE } /* bidiclass=righttoleftembedding */, - { 0, 5748, 4538, 12, 13, UNI_SUPPUNCTUATION } /* insupplementalpunctuation */, - { 0, 7688, 4178, 23, 4, UNI_JG__MANICHAEANKAPH } /* joininggroup=manichaeankaph */, - { 1, 265, 588, 5, 2, UNI_CWKCF } /* cwkcf=t */, - { 4, 1977, 3060, 5, 6, UNI_POSIXXDIGIT } /* posixxdigit */, - { 2, 1395, 4629, 4, 12, UNI_LATIN1 } /* latin1supplement */, - { 12, 383, 356, 6, 4, UNI_HYPHEN } /* hyphen=yes */, - { 1, 625, 601, 6, 4, -UNI_EXTPICT } /* extpict=no */, - { 0, 5523, 356, 21, 4, UNI_CWL } /* changeswhenlowercased=yes */, - { 0, 2726, 4081, 3, 11, UNI_P } /* gc=punctuation */, - { 1, 628, 0, 2, 0, UNI_PI } /* pi */, - { 1, 1441, 588, 3, 2, UNI_DEP } /* dep=t */, - { 1, 1216, 5797, 4, 9, UNI_KANAEXTA } /* kanaextendeda */, - { 0, 4582, 0, 16, 0, UNI_BOPOMOFOEXT } /* bopomofoextended */, - { 1, 6039, 743, 7, 6, UNI_INMANDAIC } /* block=mandaic */, - { 0, 4355, 783, 17, 4, UNI_OSMA } /* scriptextensions=osma */, - { 1, 7791, 0, 32, 0, UNI_INIDC } /* ideographicdescriptioncharacters */, - { 10, 6114, 2041, 3, 4, UNI_MEND } /* sc=mend */, - { 14, 7823, 8407, 5, 23, UNI_CJKCOMPATIDEOGRAPHS } /* incjkcompatibilityideographs */, - { 0, 3351, 346, 12, 3, UNI_NV__11 } /* numericvalue=11 */, - { 18, 6379, 6399, 13, 3, UNI_JG__QAF } /* joininggroup=qaf */, - { 5, 1657, 0, 11, 0, UNI_CPMN } /* cyprominoan */, - { 1, 1495, 0, 4, 0, UNI_JAVA } /* java */, - { 1, 313, 1508, 2, 8, UNI_INUGARITIC } /* inugaritic */, - { 0, 3763, 0, 16, 0, UNI_NV__5_SLASH_8 } /* numericvalue=5/8 */, - { 4, 313, 6833, 2, 23, UNI_BYZANTINEMUSIC } /* inbyzantinemusicalsymbols */, - { 1, 608, 5929, 3, 2, UNI_ideo_values_index } /* ideo= */, - { 2, 464, 212, 2, 4, UNI_TGLG } /* istglg */, - { 3, 6114, 502, 3, 6, UNI_LYDI } /* sc=lydian */, - { 0, 513, 6215, 4, 8, UNI_NV__1_SLASH_320 } /* nv=3.125e-03 */, - { 15, 75, 934, 3, 6, -UNI_CWU } /* cwu=false */, - { 56, 2205, 2092, 8, 4, UNI_NV__1_SLASH_12 } /* nv=8.333e-02 */, - { 0, 868, 0, 7, 0, UNI_TIRH } /* tirhuta */, - { 0, 464, 2986, 2, 14, UNI_PHLP } /* ispsalterpahlavi */, - { 0, 2981, 292, 4, 2, UNI_IN__3 } /* in=v30 */, - { 0, 508, 602, 5, 3, UNI_DT__CAN } /* nfdqc=no */, - { 4, 4726, 2617, 14, 8, UNI_NV__3_SLASH_5 } /* numericvalue=6.000e-01 */, - { 0, 313, 1657, 2, 11, UNI_INCYPROMINOAN } /* incyprominoan */, - { 0, 2792, 6142, 8, 5, UNI_CYRILLICSUP } /* iscyrillicsup */, - { 3, 464, 5886, 2, 21, UNI__PERL_NCHAR } /* isnoncharactercodepoint */, - { 5, 686, 0, 5, 0, UNI_TAKR } /* takri */, - { 49, 306, 356, 5, 4, UNI__PERL_PATWS } /* patws=yes */, - { 1, 275, 7068, 4, 7, UNI_GCB__PP } /* gcb=prepend */, - { 10, 1102, 5727, 4, 21, UNI_PRTI } /* scx=inscriptionalparthian */, - { 0, 1796, 409, 7, 4, UNI_DIAK } /* script=diak */, - { 0, 34, 4140, 1, 12, UNI_INPUNCTUATION } /* inpunctuation */, - { 4, 464, 103, 2, 2, UNI_UPPERCASELETTER } /* islu */, - { 3, 3763, 764, 14, 2, UNI_NV__5_SLASH_2 } /* numericvalue=5/2 */, - { 6, 6803, 602, 20, 2, -UNI_CE } /* compositionexclusion=n */, - { 2, 1125, 0, 8, 0, UNI_TFNG } /* tifinagh */, - { 16, 7823, 0, 22, 0, UNI_CJK } /* incjkunifiedideographs */, - { 1, 4122, 0, 5, 0, UNI_XPOSIXLOWER } /* lower */, - { 0, 6749, 278, 25, 1, UNI_cwkcf_values_index } /* changeswhennfkccasefolded= */, - { 4, 1102, 1009, 4, 6, UNI_LYCI } /* scx=lycian */, - { 7, 4291, 383, 10, 2, UNI_LB__HY } /* linebreak=hy */, - { 0, 4355, 372, 17, 6, UNI_GOTH } /* scriptextensions=gothic */, - { 2, 6402, 6276, 14, 6, UNI_SB__FO } /* sentencebreak=format */, - { 0, 464, 2486, 2, 10, UNI_POSIXBLANK } /* isposixblank */, - { 9, 6025, 5223, 8, 16, UNI_INPUNCTUATION } /* block=generalpunctuation */, - { 0, 6114, 502, 3, 4, UNI_LYDI } /* sc=lydi */, - { 1, 5, 601, 2, 3, -UNI_EXT } /* ext=n */, - { 1, 7740, 6573, 10, 3, UNI_IDEO } /* ideographic=t */, - { 0, 5481, 0, 21, 0, UNI_CWCF } /* changeswhencasefolded */, - { 2, 313, 6970, 2, 26, UNI_HALFANDFULLFORMS } /* inhalfwidthandfullwidthforms */, - { 6, 1102, 1027, 4, 6, UNI_YEZI } /* scx=yezidi */, - { 0, 6749, 356, 25, 2, UNI_CWKCF } /* changeswhennfkccasefolded=y */, - { 8, 3090, 957, 10, 5, UNI_GEORGIANEXT } /* blk=georgianext */, - { 0, 1395, 1491, 5, 4, UNI_LATINEXTA } /* latinexta */, - { 0, 4515, 588, 18, 2, UNI_IDST } /* idstrinaryoperator=t */, - { 0, 5544, 278, 21, 1, UNI_cwt_values_index } /* changeswhentitlecased= */, - { 0, 464, 2625, 2, 13, UNI_PATSYN } /* ispatternsyntax */, - { 0, 7880, 6334, 5, 18, UNI_CJKCOMPATFORMS } /* iscjkcompatibilityforms */, - { 1, 6944, 391, 24, 2, UNI_CCC__26 } /* canonicalcombiningclass=26 */, - { 1, 464, 136, 2, 4, UNI_MYMR } /* ismymr */, - { 1, 2441, 6781, 6, 9, UNI_CI } /* iscaseignorable */, - { 1, 3053, 601, 12, 4, -UNI_POSIXXDIGIT } /* asciihexdigit=no */, - { 0, 5502, 602, 21, 2, -UNI_CWCM } /* changeswhencasemapped=n */, - { 0, 1102, 997, 4, 6, UNI_KTHI } /* scx=kaithi */, - { 1, 4450, 4645, 13, 11, UNI_CYRILLICSUP } /* block=cyrillicsupplement */, - { 0, 37, 0, 1, 0, UNI_S } /* s */, - { 9, 6114, 909, 3, 8, UNI_BALI } /* sc=balinese */, - { 10, 1102, 917, 4, 4, UNI_BASS } /* scx=bass */, - { 3, 3474, 5797, 12, 9, UNI_ARABICEXTA } /* block=arabicextendeda */, - { 0, 4355, 1561, 17, 10, UNI_PHNX } /* scriptextensions=phoenician */, - { 9, 257, 602, 4, 2, -UNI_CWCF } /* cwcf=n */, - { 0, 34, 66, 1, 5, UNI_CPMN } /* iscpmn */, - { 0, 464, 786, 2, 3, UNI_ANY } /* isany */, - { 0, 3915, 2261, 16, 2, UNI_epres_values_index } /* emojipresentation= */, - { 1, 4450, 7908, 7, 15, UNI_CUNEIFORMNUMBERS } /* block=cuneiformnumbers */, - { 0, 5166, 0, 20, 0, UNI_PC } /* connectorpunctuation */, - { 3, 3351, 2207, 12, 10, UNI_NV__1_SLASH_12 } /* numericvalue=8.333e-02 */, - { 5, 15, 32, 1, 3, UNI_ARMI } /* armi */, - { 1, 5886, 0, 21, 0, UNI__PERL_NCHAR } /* noncharactercodepoint */, - { 0, 464, 5544, 2, 21, UNI_CWT } /* ischangeswhentitlecased */, - { 9, 1102, 176, 4, 4, UNI_ROHG } /* scx=rohg */, - { 0, 6114, 1826, 3, 4, UNI_SC__SYLO } /* sc=sylo */, - { 6, 372, 0, 4, 0, UNI_GOTH } /* goth */, - { 1, 1879, 666, 4, 5, UNI_INLIMBU } /* blk=limbu */, - { 2, 7208, 3947, 9, 14, UNI_ZS } /* category=spaceseparator */, - { 1, 2712, 588, 5, 5, UNI_EMOJI } /* emoji=true */, - { 2, 2253, 392, 10, 3, UNI_IN__6_DOT_3 } /* presentin=6.3 */, - { 1, 464, 7377, 2, 26, UNI_KATAKANAEXT } /* iskatakanaphoneticextensions */, - { 0, 8007, 4464, 7, 4, UNI_CJKEXTC } /* blk=cjkextc */, - { 0, 3474, 4793, 6, 18, UNI_RUMI } /* block=ruminumeralsymbols */, - { 14, 1214, 1037, 6, 4, UNI_KANAEXTB } /* inkanaextb */, - { 7, 7317, 7115, 10, 17, UNI_BC__ES } /* bidiclass=europeanseparator */, - { 3, 6944, 349, 25, 1, UNI_CCC__28 } /* canonicalcombiningclass=28 */, - { 2, 464, 4062, 2, 15, UNI_VEDICEXT } /* isvedicextensions */, - { 1, 4515, 602, 18, 2, -UNI_IDST } /* idstrinaryoperator=n */, - { 7, 2712, 356, 14, 2, UNI_ECOMP } /* emojicomponent=y */, - { 1, 464, 4437, 2, 14, UNI_LATINEXTB } /* islatinextendedb */, - { 0, 2474, 1037, 9, 4, UNI_MYANMAREXTB } /* ismyanmarextb */, - { 2, 7527, 72, 3, 2, UNI_LB__PR } /* lb=pr */, - { 16, 916, 587, 4, 6, UNI_EBASE } /* ebase=true */, - { 0, 1967, 356, 7, 4, UNI_RADICAL } /* radical=yes */, - { 1, 464, 2428, 2, 13, UNI_IPAEXT } /* isipaextensions */, - { 3, 1796, 983, 7, 4, UNI_SC__HIRA } /* script=hira */, - { 2, 1102, 1495, 4, 8, UNI_JAVA } /* scx=javanese */, - { 0, 19, 4737, 2, 3, UNI_AGE__6 } /* age=6 */, - { 0, 5502, 588, 21, 2, UNI_CWCM } /* changeswhencasemapped=t */, - { 1, 3462, 7175, 5, 26, UNI_ENCLOSEDCJK } /* blk=enclosedcjklettersandmonths */, - { 0, 6944, 6491, 22, 3, UNI_CCC__A } /* canonicalcombiningclass=a */, - { 8, 296, 800, 3, 3, UNI_NV__NAN } /* nv=nan */, - { 1, 6112, 129, 20, 2, UNI_INSC__CONSONANTPREFIXED } /* insc=consonantprefixed */, - { 0, 5087, 3416, 12, 4, UNI_WB__MN } /* wordbreak=midnum */, - { 9, 343, 2702, 4, 10, UNI_CCC__6 } /* ccc=hanreading */, - { 30, 3722, 588, 4, 2, UNI_MATH } /* math=t */, - { 0, 7584, 1162, 18, 6, UNI_DT__ENC } /* decompositiontype=circle */, - { 0, 4355, 2041, 17, 4, UNI_MEND } /* scriptextensions=mend */, - { 0, 464, 6803, 2, 20, UNI_CE } /* iscompositionexclusion */, - { 1, 1856, 6573, 4, 3, UNI_BIDIC } /* bidic=t */, - { 0, 3779, 1300, 14, 3, UNI_NV__7000 } /* numericvalue=7000 */, - { 0, 1102, 3498, 4, 7, UNI_CPRT } /* scx=cypriot */, - { 0, 2729, 0, 5, 0, UNI_C } /* other */, - { 0, 1867, 588, 5, 5, UNI_BIDIM } /* bidim=true */, - { 0, 1441, 588, 10, 2, UNI_DEP } /* deprecated=t */, - { 0, 1102, 3285, 4, 6, UNI_HEBR } /* scx=hebrew */, - { 2, 3381, 0, 15, 0, UNI_NARB } /* oldnortharabian */, - { 0, 3474, 3543, 6, 16, UNI_HIGHPUSURROGATES } /* block=highpusurrogates */, - { 7, 8007, 0, 7, 0, UNI_CJK } /* blk=cjk */, - { 1, 3779, 0, 15, 0, UNI_NV__70 } /* numericvalue=70 */, - { 2, 313, 1003, 2, 6, UNI_INLEPCHA } /* inlepcha */, - { 2, 252, 0, 2, 0, UNI_CN } /* cn */, - { 2, 1879, 1451, 4, 10, UNI_INDIVESAKURU } /* blk=divesakuru */, - { 1, 464, 469, 2, 4, UNI_SOGO } /* issogo */, - { 0, 343, 396, 4, 2, UNI_CCC__15 } /* ccc=15 */, - { 0, 7132, 1262, 8, 3, UNI_SUPPUAB } /* blk=suppuab */, - { 14, 1879, 1614, 4, 10, UNI_INWARANGCITI } /* blk=warangciti */, - { 1, 6025, 2332, 7, 7, UNI_GREEKEXT } /* block=greekext */, - { 0, 3622, 6771, 12, 4, UNI_LATINEXTD } /* islatinextendedd */, - { 2, 4355, 1320, 17, 4, UNI_PERM } /* scriptextensions=perm */, - { 1, 7527, 3297, 3, 12, UNI_LB__IS } /* lb=infixnumeric */, - { 0, 4107, 0, 6, 0, UNI_HANG } /* hangul */, - { 6, 1796, 618, 7, 7, UNI_ELYM } /* script=elymaic */, - { 6, 6114, 854, 3, 7, UNI_TAVT } /* sc=taiviet */, - { 10, 3748, 763, 14, 3, UNI_NV__11_SLASH_2 } /* numericvalue=11/2 */, - { 0, 1075, 1069, 4, 2, UNI_NV__2_SLASH_3 } /* nv=2/3 */, - { 15, 1102, 749, 4, 7, UNI_MARC } /* scx=marchen */, - { 8, 313, 1887, 2, 4, UNI_UCAS } /* inucas */, - { 5, 2483, 0, 13, 0, UNI_XPOSIXBLANK } /* isxposixblank */, - { 2, 3474, 749, 6, 7, UNI_INMARCHEN } /* block=marchen */, - { 0, 3474, 6629, 6, 15, UNI_MODIFIERLETTERS } /* block=modifierletters */, - { 1, 2253, 2053, 11, 3, UNI_IN__11 } /* presentin=11.0 */, - { 2, 6114, 4107, 3, 4, UNI_SC__HANG } /* sc=hang */, - { 1, 3367, 1303, 14, 5, UNI_NV__432000 } /* numericvalue=432000 */, - { 4, 2981, 397, 4, 2, UNI_IN__5_DOT_1 } /* in=v51 */, - { 2, 4355, 6103, 17, 9, UNI_XSUX } /* scriptextensions=cuneiform */, - { 0, 3474, 6466, 6, 10, UNI_PUA } /* block=privateuse */, - { 16, 4355, 232, 17, 4, UNI_XSUX } /* scriptextensions=xsux */, - { 0, 6114, 2740, 3, 4, UNI_SC__COPT } /* sc=copt */, - { 0, 5186, 602, 20, 3, -UNI_EXTPICT } /* extendedpictographic=no */, - { 0, 2496, 7262, 3, 14, UNI_JG__NOJOININGGROUP } /* jg=nojoininggroup */, - { 6, 1879, 3285, 4, 6, UNI_INHEBREW } /* blk=hebrew */, - { 14, 2392, 3324, 3, 14, UNI_MISCPICTOGRAPHS } /* inmiscpictographs */, - { 11, 1102, 4882, 4, 19, UNI_EGYP } /* scx=egyptianhieroglyphs */, - { 0, 120, 0, 3, 0, UNI_LAO } /* lao */, - { 0, 1382, 356, 4, 4, UNI_XIDS } /* xids=yes */, - { 5, 1982, 0, 6, 0, UNI_SYRC } /* syriac */, - { 2, 611, 0, 7, 0, UNI_ELBA } /* elbasan */, - { 2, 343, 2127, 4, 2, UNI_CCC__13 } /* ccc=13 */, - { 4, 7828, 602, 16, 2, -UNI_UIDEO } /* unifiedideograph=n */, - { 0, 7527, 3423, 3, 4, UNI_LB__GL } /* lb=glue */, - { 0, 7201, 4081, 16, 11, UNI_P } /* generalcategory=punctuation */, - { 2, 2454, 994, 3, 3, UNI_GRAN } /* isgran */, - { 0, 4355, 1009, 17, 4, UNI_LYCI } /* scriptextensions=lyci */, - { 0, 464, 17, 2, 2, UNI_LM } /* islm */, - { 7, 1174, 6982, 3, 9, UNI_EA__F } /* ea=fullwidth */, - { 3, 2726, 3236, 3, 13, UNI_ME } /* gc=enclosingmark */, - { 0, 4355, 184, 17, 4, UNI_SAMR } /* scriptextensions=samr */, - { 3, 37, 5358, 1, 17, UNI_SMALLKANAEXT } /* smallkanaextension */, - { 2, 6114, 637, 3, 7, UNI_SC__HANO } /* sc=hanunoo */, - { 0, 555, 560, 4, 3, UNI_AGE__6 } /* age=6.0 */, - { 8, 4433, 2579, 5, 12, UNI_LOWSURROGATES } /* blk=lowsurrogates */, - { 0, 1102, 5340, 4, 10, UNI_DEVA } /* scx=devanagari */, - { 16, 1102, 372, 4, 6, UNI_GOTH } /* scx=gothic */, - { 5, 6749, 0, 25, 0, UNI_CWKCF } /* changeswhennfkccasefolded */, - { 0, 2275, 5620, 9, 3, -UNI_IDC } /* idcontinue=n */, - { 0, 6379, 705, 20, 4, UNI_JG__AFRICANNOON } /* joininggroup=africannoon */, - { 2, 4322, 349, 14, 1, UNI_NV__38 } /* numericvalue=38 */, - { 0, 3722, 934, 4, 2, -UNI_MATH } /* math=f */, - { 0, 959, 278, 8, 1, UNI_ext_values_index } /* extender= */, - { 1, 4433, 1698, 9, 4, UNI_LATINEXTF } /* blk=latinextf */, - { 0, 464, 496, 2, 6, UNI_KHOJ } /* iskhojki */, - { 1, 3474, 360, 6, 6, UNI_INCHAKMA } /* block=chakma */, - { 4, 313, 220, 2, 4, UNI_INTOTO } /* intoto */, - { 10, 1248, 0, 7, 0, UNI_SIDD } /* siddham */, - { 1, 1011, 934, 2, 6, -UNI_CI } /* ci=false */, - { 2, 4996, 4687, 13, 5, UNI_JG__MANICHAEANZAYIN } /* jg=manichaeanzayin */, - { 5, 1102, 2041, 4, 4, UNI_MEND } /* scx=mend */, - { 3, 12, 356, 3, 4, UNI_PCM } /* pcm=yes */, - { 1, 464, 4598, 2, 16, UNI_PE } /* isclosepunctuation */, - { 4, 4996, 4990, 13, 6, UNI_JG__MANICHAEANSAMEKH } /* jg=manichaeansamekh */, - { 0, 313, 1133, 2, 8, UNI_INVITHKUQI } /* invithkuqi */, - { 2, 7584, 6944, 21, 9, UNI_DT__NONCANON } /* decompositiontype=noncanonical */, - { 0, 464, 117, 2, 2, UNI_XPOSIXDIGIT } /* isnd */, - { 1, 0, 4552, 1, 15, UNI_LINEARBSYLLABARY } /* linearbsyllabary */, - { 6, 1241, 0, 4, 0, UNI_PHAG } /* phag */, - { 1, 464, 3518, 2, 9, UNI_Z } /* isseparator */, - { 0, 4122, 934, 5, 6, -UNI_XPOSIXLOWER } /* lower=false */, - { 3, 313, 287, 2, 5, UNI_INNUSHU } /* innushu */, - { 8, 4355, 611, 17, 4, UNI_ELBA } /* scriptextensions=elba */, - { 1, 464, 12, 2, 2, UNI_PC } /* ispc */, - { 0, 313, 5397, 2, 3, UNI_PUA } /* inpua */, - { 0, 6011, 7175, 7, 26, UNI_ENCLOSEDCJK } /* block=enclosedcjklettersandmonths */, - { 0, 464, 1220, 2, 7, UNI_MAKA } /* ismakasar */, - { 12, 212, 0, 4, 0, UNI_TGLG } /* tglg */, - { 2, 7527, 3432, 3, 2, UNI_LB__ZW } /* lb=zw */, - { 1, 735, 0, 7, 0, UNI_LINA } /* lineara */, - { 0, 4338, 602, 17, 3, -UNI_RI } /* regionalindicator=no */, - { 47, 4355, 666, 17, 5, UNI_LIMB } /* scriptextensions=limbu */, - { 3, 1102, 4827, 4, 5, UNI_BAMU } /* scx=bamum */, - { 0, 2353, 1491, 10, 4, UNI_CYRILLICEXTA } /* incyrillicexta */, - { 0, 313, 337, 2, 6, UNI_INCARIAN } /* incarian */, - { 0, 1102, 810, 4, 4, UNI_SYRC } /* scx=syrc */, - { 32, 6799, 2261, 23, 2, UNI_compex_values_index } /* fullcompositionexclusion= */, - { 1, 823, 934, 4, 2, -UNI_DASH } /* dash=f */, - { 3, 464, 172, 2, 4, UNI_RJNG } /* isrjng */, - { 1, 3474, 2229, 6, 8, UNI_PHAISTOS } /* block=phaistos */, - { 7, 2253, 890, 9, 5, UNI_IN__10 } /* presentin=10.0 */, - { 0, 261, 356, 4, 4, UNI_CWCM } /* cwcm=yes */, - { 2, 4355, 5322, 17, 4, UNI_CHER } /* scriptextensions=cher */, - { 0, 2974, 3807, 11, 2, UNI_IN__8 } /* presentin=v80 */, - { 1, 2712, 0, 5, 0, UNI_EMOJI } /* emoji */, - { 1, 1102, 148, 4, 4, UNI_ORYA } /* scx=orya */, - { 5, 7605, 2344, 19, 9, UNI_GCB__V } /* hangulsyllabletype=voweljamo */, - { 5, 7201, 3061, 16, 5, UNI_XPOSIXDIGIT } /* generalcategory=digit */, - { 1, 1075, 6199, 4, 7, UNI_NV__20000000 } /* nv=20000000 */, - { 12, 1879, 4857, 4, 15, UNI_TAMILSUP } /* blk=tamilsupplement */, - { 28, 7431, 1155, 27, 2, UNI_CCC__35 } /* canonicalcombiningclass=ccc35 */, - { 0, 1465, 355, 4, 3, UNI_XPOSIXSPACE } /* space=y */, - { 1, 1377, 3151, 2, 3, UNI_WB__LE } /* wb=le */, - { 0, 275, 703, 4, 2, UNI_WB__EB } /* gcb=em */, - { 0, 2652, 0, 13, 0, UNI_VERTICALFORMS } /* verticalforms */, - { 9, 265, 602, 5, 3, -UNI_CWKCF } /* cwkcf=no */, - { 1, 6402, 1591, 14, 2, UNI_LB__LF } /* sentencebreak=lf */, - { 0, 2496, 2506, 3, 3, UNI_JG__FEH } /* jg=feh */, - { 6, 1867, 0, 12, 0, UNI_BIDIM } /* bidimirrored */, - { 0, 1879, 818, 4, 7, UNI_SC__SHRD } /* blk=sharada */, - { 1, 7317, 119, 10, 2, UNI_BC__AL } /* bidiclass=al */, - { 0, 2948, 356, 13, 2, UNI_NFCQC__Y } /* nfcquickcheck=y */, - { 0, 1441, 588, 10, 5, UNI_DEP } /* deprecated=true */, - { 2, 4291, 3000, 10, 9, UNI_LB__QU } /* linebreak=quotation */, - { 0, 306, 602, 5, 2, -UNI__PERL_PATWS } /* patws=n */, - { 1, 4355, 1362, 17, 9, UNI_SAMR } /* scriptextensions=samaritan */, - { 1, 464, 433, 2, 4, UNI_NKO } /* isnkoo */, - { 0, 313, 1145, 3, 3, UNI_INTHAI } /* inthai */, - { 12, 7880, 8407, 5, 33, UNI_CJKCOMPATIDEOGRAPHSSUP } /* iscjkcompatibilityideographssupplement */, - { 1, 3058, 601, 7, 3, -UNI_XPOSIXXDIGIT } /* hexdigit=n */, - { 0, 7527, 464, 3, 2, UNI_LB__IS } /* lb=is */, - { 0, 5099, 6709, 6, 19, UNI__PERL_FOLDS_TO_MULTI_CHAR } /* _perl_folds_to_multi_char */, - { 0, 4355, 4962, 17, 14, UNI_ROHG } /* scriptextensions=hanifirohingya */, - { 6, 313, 4006, 2, 15, UNI_CURRENCYSYMBOLS } /* incurrencysymbols */, - { 1, 2274, 587, 10, 3, UNI_XIDC } /* xidcontinue=t */, - { 0, 464, 3595, 2, 9, UNI_LATINEXTE } /* islatinexte */, - { 1, 464, 671, 2, 5, UNI_OGAM } /* isogham */, - { 0, 2692, 8110, 10, 29, UNI_ARABICMATH } /* blk=arabicmathematicalalphabeticsymbols */, - { 7, 34, 58, 1, 5, UNI_CHAM } /* ischam */, - { 1, 1102, 1792, 4, 4, UNI_MONG } /* scx=mong */, - { 0, 464, 1033, 2, 8, UNI_JAMOEXTB } /* isjamoextb */, + { 3, 916, 933, 4, 3, -UNI_EBASE } /* ebase=f */, + { 6, 7267, 255, 16, 2, UNI_CF } /* generalcategory=cf */, + { 0, 1823, 4926, 7, 5, UNI_SC__TAML } /* script=tamil */, + { 1, 552, 2084, 4, 2, UNI_AGE__11 } /* age=11 */, + { 0, 537, 0, 6, 0, UNI_TNSA } /* tangsa */, + { 1, 3832, 1805, 14, 5, UNI_NV__500000 } /* numericvalue=500000 */, + { 1, 4970, 352, 16, 5, UNI_EBASE } /* emojimodifierbase=yes */, + { 5, 309, 890, 2, 3, UNI_IN__10 } /* in=10 */, + { 0, 33, 5409, 1, 11, UNI_SMALLKANAEXT } /* smallkanaext */, + { 1, 7383, 4852, 10, 10, UNI_BC__WS } /* bidiclass=whitespace */, + { 3, 597, 1707, 3, 8, UNI_DT__FRA } /* dt=fraction */, + { 0, 1667, 909, 4, 8, UNI_INBALINESE } /* blk=balinese */, + { 4, 2514, 3364, 3, 14, UNI_MISCPICTOGRAPHS } /* ismiscpictographs */, + { 6, 7537, 934, 10, 2, -UNI_XPOSIXALPHA } /* alphabetic=f */, + { 13, 1543, 0, 4, 0, UNI_KHAR } /* khar */, + { 0, 3391, 1318, 13, 3, UNI_NV__200 } /* numericvalue=200 */, + { 2, 461, 65, 2, 2, UNI_MN } /* ismn */, + { 16, 629, 584, 5, 6, UNI_GRBASE } /* grbase=true */, + { 1, 461, 2009, 2, 6, UNI_SYRC } /* issyriac */, + { 0, 1102, 2244, 4, 12, UNI_HUNG } /* scx=oldhungarian */, + { 14, 1801, 1805, 5, 6, UNI_NV__10000000 } /* nv=10000000 */, + { 0, 1743, 1479, 4, 5, UNI_VERTSPACE } /* vertspace */, + { 0, 733, 5820, 3, 15, UNI_ENCLOSEDALPHANUM } /* inenclosedalphanum */, + { 7, 3848, 1805, 14, 4, UNI_NV__70000 } /* numericvalue=70000 */, + { 5, 1102, 164, 4, 4, UNI_PHNX } /* scx=phnx */, + { 0, 461, 1234, 2, 4, UNI_MULT } /* ismult */, + { 0, 1667, 1125, 4, 8, UNI_INTIFINAGH } /* blk=tifinagh */, + { 5, 7591, 2039, 3, 2, UNI_LB__BK } /* lb=bk */, + { 2, 5799, 5149, 5, 7, UNI_SUPARROWSA } /* insuparrowsa */, + { 3, 7591, 1165, 3, 2, UNI_LB__CL } /* lb=cl */, + { 0, 1667, 6000, 4, 21, UNI_YIJING } /* blk=yijinghexagramsymbols */, + { 0, 2930, 0, 4, 0, UNI_JT__T } /* jt=t */, + { 0, 2256, 0, 8, 0, UNI_PHAISTOS } /* phaistos */, + { 17, 2324, 369, 6, 6, UNI_INGOTHIC } /* block=gothic */, + { 2, 8343, 6416, 29, 11, UNI_INSC__CONSONANTSUBJOINED } /* indicsyllabiccategory=consonantsubjoined */, + { 1, 7011, 3147, 24, 5, UNI_CCC__A } /* canonicalcombiningclass=above */, + { 0, 6165, 1255, 3, 4, UNI_SIDD } /* sc=sidd */, + { 4, 5532, 0, 21, 0, UNI_CWCF } /* changeswhencasefolded */, + { 0, 8, 599, 3, 3, -UNI_PCM } /* pcm=no */, + { 11, 461, 2317, 2, 6, UNI_N } /* isnumber */, + { 1, 1883, 274, 11, 1, UNI_bidic_values_index } /* bidicontrol= */, + { 54, 1726, 7545, 6, 20, UNI_ARABICPFA } /* isarabicpresentationformsa */, + { 0, 1424, 345, 8, 2, UNI_CCC__118 } /* ccc=ccc118 */, + { 1, 1102, 414, 4, 4, UNI_HANO } /* scx=hano */, + { 0, 605, 6621, 2, 3, UNI_IDC } /* idc=t */, + { 3, 2324, 6514, 6, 10, UNI_PUA } /* block=privateuse */, + { 2, 2523, 1659, 4, 8, UNI_XPOSIXSPACE } /* isxperlspace */, + { 0, 3014, 288, 11, 2, UNI_IN__3 } /* presentin=v30 */, + { 12, 7214, 0, 26, 0, UNI_CCC__12 } /* canonicalcombiningclass=12 */, + { 6, 271, 3472, 4, 3, UNI_LB__ZWJ } /* gcb=zwj */, + { 3, 2280, 389, 10, 3, UNI_IN__6_DOT_3 } /* presentin=6.3 */, + { 1, 4424, 4620, 17, 7, UNI_LINB } /* scriptextensions=linearb */, + { 1, 6076, 6945, 9, 20, UNI_GEOMETRICSHAPESEXT } /* block=geometricshapesextended */, + { 2, 309, 4060, 2, 7, UNI_BRAI } /* inbraille */, + { 0, 1492, 3639, 9, 9, UNI_GEORGIANEXT } /* ingeorgianextended */, + { 3, 2832, 7467, 10, 13, UNI_CYRILLICSUP } /* iscyrillicsupplementary */, + { 1, 1823, 108, 7, 4, UNI_KAWI } /* script=kawi */, + { 1, 309, 7110, 2, 24, UNI_DIACRITICALSFORSYMBOLS } /* incombiningmarksforsymbols */, + { 0, 461, 15, 2, 4, UNI_AGHB } /* isaghb */, + { 0, 1734, 1609, 3, 9, UNI_SMALLFORMS } /* issmallforms */, + { 0, 1102, 537, 4, 4, UNI_TANG } /* scx=tang */, + { 0, 1198, 3938, 3, 16, UNI_UCAS } /* incanadiansyllabics */, + { 1, 3014, 3876, 11, 2, UNI_IN__8 } /* presentin=v80 */, + { 0, 8658, 0, 45, 0, UNI_UCASEXTA } /* isunifiedcanadianaboriginalsyllabicsextendeda */, + { 9, 2324, 6986, 6, 25, UNI_SYMBOLSFORLEGACYCOMPUTING } /* block=symbolsforlegacycomputing */, + { 3, 6236, 0, 16, 0, UNI_NV__100 } /* numericvalue=100 */, + { 0, 7011, 289, 25, 1, UNI_CCC__20 } /* canonicalcombiningclass=20 */, + { 0, 309, 1671, 2, 7, UNI_CJKEXTD } /* incjkextd */, + { 16, 6450, 6324, 14, 6, UNI_SB__FO } /* sentencebreak=format */, + { 0, 6165, 414, 3, 4, UNI_SC__HANO } /* sc=hano */, + { 0, 7591, 2599, 3, 10, UNI_LB__NS } /* lb=nonstarter */, + { 27, 1102, 1562, 4, 4, UNI_NAGM } /* scx=nagm */, + { 2, 1272, 6576, 3, 21, UNI_INDICNUMBERFORMS } /* iscommonindicnumberforms */, + { 2, 1667, 8278, 4, 33, UNI_MISCMATHSYMBOLSB } /* blk=miscellaneousmathematicalsymbolsb */, + { 0, 4519, 7467, 14, 13, UNI_CYRILLICSUP } /* block=cyrillicsupplementary */, + { 0, 8071, 7380, 30, 4, UNI_CJKEXTB } /* blk=cjkunifiedideographsextensionb */, + { 0, 2220, 1805, 4, 5, UNI_NV__600000 } /* nv=600000 */, + { 3, 4424, 1779, 17, 11, UNI_MEDF } /* scriptextensions=medefaidrin */, + { 2, 7495, 1317, 28, 2, UNI_CCC__132 } /* canonicalcombiningclass=ccc132 */, + { 16, 5778, 0, 21, 0, UNI_PRTI } /* inscriptionalparthian */, + { 15, 377, 934, 3, 6, -UNI_EXT } /* ext=false */, + { 0, 833, 353, 4, 2, UNI_TERM } /* term=y */, + { 4, 309, 4896, 2, 5, UNI_INBAMUM } /* inbamum */, + { 1, 461, 156, 2, 4, UNI_OUGR } /* isougr */, + { 2, 4424, 450, 17, 4, UNI_MIAO } /* scriptextensions=plrd */, + { 22, 7648, 0, 18, 0, UNI_dt_values_index } /* decompositiontype= */, + { 0, 1102, 4896, 4, 4, UNI_BAMU } /* scx=bamu */, + { 0, 7267, 5243, 20, 12, UNI_PO } /* generalcategory=otherpunctuation */, + { 16, 7084, 6193, 6, 5, UNI_ARABICSUP } /* inarabicsup */, + { 3, 461, 1465, 2, 10, UNI_DIAK } /* isdivesakuru */, + { 4, 339, 8648, 4, 10, UNI_CCC__AR } /* ccc=aboveright */, + { 1, 1667, 1592, 4, 10, UNI_INSAURASHTRA } /* blk=saurashtra */, + { 21, 6163, 8522, 5, 16, UNI_INSC__VOWELINDEPENDENT } /* insc=vowelindependent */, + { 1, 1667, 4161, 4, 15, UNI_DIACRITICALSEXT } /* blk=diacriticalsext */, + { 1, 309, 5876, 2, 19, UNI_SUNDANESESUP } /* insundanesesupplement */, + { 0, 2287, 546, 3, 3, UNI_IN__3 } /* in=3.0 */, + { 0, 309, 1009, 2, 6, UNI_INLYCIAN } /* inlycian */, + { 0, 309, 55, 2, 4, UNI_INCHAM } /* incham */, + { 0, 4360, 306, 10, 2, UNI_LB__SP } /* linebreak=sp */, + { 0, 4424, 15, 17, 4, UNI_AGHB } /* scriptextensions=aghb */, + { 0, 1530, 5848, 6, 9, UNI_KANAEXTA } /* iskanaextendeda */, + { 1, 339, 519, 3, 2, UNI_CCC__7 } /* ccc=7 */, + { 0, 2324, 8660, 6, 42, UNI_UCASEXT } /* block=unifiedcanadianaboriginalsyllabicsextended */, + { 31, 2287, 2199, 3, 3, UNI_IN__2 } /* in=2.0 */, + { 12, 940, 1104, 5, 3, UNI_COMPEX } /* compex=t */, + { 20, 2, 8407, 1, 34, UNI_DIACRITICALSFORSYMBOLS } /* combiningdiacriticalmarksforsymbols */, + { 0, 2324, 5694, 7, 10, UNI_COUNTINGROD } /* block=countingrod */, + { 0, 1391, 1829, 2, 3, UNI_WB__ML } /* wb=ml */, + { 0, 2232, 0, 4, 0, UNI_NV__8 } /* nv=8 */, + { 3, 510, 6271, 4, 8, UNI_NV__3_SLASH_80 } /* nv=3.750e-02 */, + { 12, 3633, 6957, 7, 9, UNI_LATINEXTE } /* inlatinextendede */, + { 0, 2, 584, 1, 6, UNI_CE } /* ce=true */, + { 6, 461, 909, 2, 8, UNI_BALI } /* isbalinese */, + { 2, 1942, 0, 5, 0, UNI_XPOSIXGRAPH } /* graph */, + { 6, 461, 625, 2, 2, UNI_PI } /* ispi */, + { 0, 1823, 1367, 7, 4, UNI_PAUC } /* script=pauc */, + { 9, 461, 1376, 2, 9, UNI_SAMR } /* issamaritan */, + { 2, 309, 120, 2, 3, UNI_INLAO } /* inlao */, + { 0, 6076, 5863, 11, 6, UNI_GEORGIANSUP } /* block=georgiansup */, + { 0, 309, 2811, 2, 12, UNI_KHMERSYMBOLS } /* inkhmersymbols */, + { 6, 461, 1830, 2, 4, UNI_MLYM } /* ismlym */, + { 4, 939, 6438, 4, 2, UNI_ecomp_values_index } /* ecomp= */, + { 6, 1454, 353, 2, 2, UNI_SD } /* sd=y */, + { 3, 1823, 3133, 6, 5, UNI_SC__GEOR } /* script=geor */, + { 1, 4360, 2720, 9, 3, UNI_RI } /* linebreak=ri */, + { 0, 461, 6677, 2, 15, UNI_MODIFIERLETTERS } /* ismodifierletters */, + { 3, 7383, 87, 11, 2, UNI_BC__LRE } /* bidiclass=lre */, + { 2, 4424, 414, 17, 3, UNI_HAN } /* scriptextensions=han */, + { 3, 164, 0, 4, 0, UNI_PHNX } /* phnx */, + { 0, 4424, 1635, 17, 4, UNI_WARA } /* scriptextensions=wara */, + { 0, 461, 5283, 2, 9, UNI_HALFMARKS } /* ishalfmarks */, + { 9, 7495, 395, 27, 2, UNI_CCC__16 } /* canonicalcombiningclass=ccc16 */, + { 10, 2514, 0, 9, 0, UNI_MYMR } /* ismyanmar */, + { 0, 895, 1804, 5, 3, UNI_AGE__10 } /* age=v100 */, + { 1, 5916, 8553, 17, 6, UNI_LOE } /* logicalorderexception=t */, + { 0, 4424, 47, 17, 4, UNI_CAKM } /* scriptextensions=cakm */, + { 2, 597, 7011, 6, 9, UNI_DT__NONCANON } /* dt=noncanonical */, + { 8, 1102, 5067, 3, 5, UNI_MANI } /* scx=mani */, + { 0, 802, 0, 4, 0, UNI_SARB } /* sarb */, + { 1, 1823, 442, 7, 4, UNI_ORKH } /* script=orkh */, + { 2, 578, 1317, 5, 2, UNI_CCC__AR } /* ccc=232 */, + { 0, 1667, 317, 4, 5, UNI_INTAILE } /* blk=taile */, + { 0, 1667, 5391, 4, 11, UNI_CHEROKEESUP } /* blk=cherokeesup */, + { 0, 7011, 182, 24, 2, UNI_CCC__0 } /* canonicalcombiningclass=nr */, + { 0, 30, 996, 1, 7, UNI_INKAITHI } /* inkaithi */, + { 0, 2324, 658, 6, 5, UNI_INDOGRA } /* block=dogra */, + { 0, 8343, 3217, 31, 4, UNI_INSC__CONSONANTDEAD } /* indicsyllabiccategory=consonantdead */, + { 6, 1942, 5671, 11, 4, -UNI_GRBASE } /* graphemebase=no */, + { 0, 2732, 6193, 8, 12, UNI_ARABICSUP } /* blk=arabicsupplement */, + { 6, 6165, 739, 3, 7, UNI_SC__MAND } /* sc=mandaic */, + { 1, 7648, 238, 18, 2, UNI_DT__NB } /* decompositiontype=nb */, + { 0, 2324, 2811, 6, 12, UNI_KHMERSYMBOLS } /* block=khmersymbols */, + { 1, 5216, 129, 17, 3, UNI_LATINEXTF } /* block=latinextendedf */, + { 0, 6165, 148, 3, 4, UNI_SC__ORYA } /* sc=orya */, + { 0, 4424, 739, 17, 4, UNI_MAND } /* scriptextensions=mand */, + { 0, 4360, 98, 10, 2, UNI_LB__HL } /* linebreak=hl */, + { 0, 4191, 599, 5, 2, -UNI_XPOSIXLOWER } /* lower=n */, + { 1, 1667, 983, 4, 8, UNI_INHIRAGANA } /* blk=hiragana */, + { 6, 8538, 0, 22, 0, UNI_VO__TR } /* verticalorientation=tr */, + { 7, 1102, 779, 4, 7, UNI_OSMA } /* scx=osmanya */, + { 1, 578, 1318, 5, 2, UNI_CCC__B } /* ccc=220 */, + { 4, 3177, 934, 14, 2, UNI_EA__F } /* eastasianwidth=f */, + { 8, 1823, 128, 7, 4, UNI_MEDF } /* script=medf */, + { 0, 1102, 1385, 4, 6, UNI_THAA } /* scx=thaana */, + { 1, 7134, 599, 26, 2, -UNI_PCM } /* prependedconcatenationmark=n */, + { 0, 7892, 934, 16, 6, -UNI_UIDEO } /* unifiedideograph=false */, + { 3, 1424, 295, 8, 1, UNI_CCC__19 } /* ccc=ccc19 */, + { 4, 461, 3908, 2, 16, UNI_TANGUTCOMPONENTS } /* istangutcomponents */, + { 0, 2324, 608, 6, 7, UNI_INELBASAN } /* block=elbasan */, + { 0, 309, 658, 2, 5, UNI_INDOGRA } /* indogra */, + { 0, 3391, 392, 13, 2, UNI_NV__41 } /* numericvalue=41 */, + { 0, 1102, 297, 4, 5, UNI_ORYA } /* scx=oriya */, + { 0, 461, 1671, 2, 7, UNI_CJKEXTD } /* iscjkextd */, + { 0, 2002, 4191, 7, 5, UNI_POSIXLOWER } /* isposixlower */, + { 4, 7495, 1318, 27, 2, UNI_CCC__20 } /* canonicalcombiningclass=ccc20 */, + { 0, 461, 317, 2, 5, UNI_TALE } /* istaile */, + { 2, 461, 1205, 2, 4, UNI_GRAN } /* isgran */, + { 0, 2718, 119, 3, 2, UNI_BC__AL } /* bc=al */, { 0, 832, 934, 5, 6, -UNI_STERM } /* sterm=false */, - { 0, 939, 602, 5, 2, -UNI_ECOMP } /* ecomp=n */, - { 1, 5099, 1383, 6, 7, UNI__PERL_IDSTART } /* _perl_idstart */, - { 0, 7018, 0, 26, 0, UNI_ARABICPFB } /* inarabicpresentationformsb */, - { 0, 464, 6134, 2, 4, UNI_GLAG } /* isglag */, - { 1, 2275, 355, 9, 5, UNI_IDC } /* idcontinue=yes */, - { 1, 313, 3527, 2, 16, UNI_HALFANDFULLFORMS } /* inhalfandfullforms */, - { 4, 4450, 8499, 7, 34, UNI_DIACRITICALSSUP } /* block=combiningdiacriticalmarkssupplement */, - { 1, 1796, 31, 7, 4, UNI_ARMI } /* script=armi */, - { 1, 2474, 619, 3, 3, UNI_MLYM } /* ismlym */, - { 8, 3053, 356, 13, 2, UNI_POSIXXDIGIT } /* asciihexdigit=y */, - { 0, 34, 6643, 1, 16, UNI_TRANSPORTANDMAP } /* istransportandmap */, - { 0, 7431, 396, 27, 2, UNI_CCC__15 } /* canonicalcombiningclass=ccc15 */, - { 1, 4006, 0, 14, 0, UNI_SC } /* currencysymbol */, - { 11, 1710, 5358, 3, 11, UNI_SMALLKANAEXT } /* issmallkanaext */, - { 1, 4901, 934, 13, 2, -UNI_EMOD } /* emojimodifier=f */, - { 1, 6114, 148, 3, 4, UNI_SC__ORYA } /* sc=orya */, - { 0, 925, 0, 4, 0, UNI_bpt_values_index } /* bpt= */, - { 0, 5865, 934, 21, 2, -UNI_LOE } /* logicalorderexception=f */, - { 1, 6011, 1183, 7, 8, UNI_EMOTICONS } /* block=emoticons */, - { 2, 951, 0, 4, 0, UNI_DUPL } /* dupl */, - { 0, 1796, 686, 7, 4, UNI_SC__TAKR } /* script=takr */, - { 1, 464, 611, 2, 7, UNI_ELBA } /* iselbasan */, - { 69, 3748, 2096, 14, 8, UNI_NV__1_SLASH_64 } /* numericvalue=1.563e-02 */, - { 5, 8007, 8407, 7, 23, UNI_CJKCOMPATIDEOGRAPHS } /* blk=cjkcompatibilityideographs */, - { 0, 34, 2228, 1, 13, UNI_PHAISTOS } /* inphaistosdisc */, - { 1, 2274, 5620, 10, 3, -UNI_XIDC } /* xidcontinue=n */, - { 0, 4092, 602, 9, 2, -UNI_DIA } /* diacritic=n */, - { 5, 1102, 55, 4, 4, UNI_CANS } /* scx=cans */, - { 0, 464, 242, 2, 2, UNI_NB } /* isnb */, - { 2, 6025, 3599, 13, 9, UNI_GEORGIANEXT } /* block=georgianextended */, - { 1, 3462, 7851, 5, 29, UNI_ENCLOSEDALPHANUMSUP } /* blk=enclosedalphanumericsupplement */, - { 9, 1102, 728, 4, 7, UNI_KALI } /* scx=kayahli */, - { 44, 7688, 3688, 23, 3, UNI_JG__MANICHAEANTAW } /* joininggroup=manichaeantaw */, - { 1, 328, 4081, 3, 11, UNI_SUPPUNCTUATION } /* suppunctuation */, - { 0, 2726, 69, 3, 2, UNI_MN } /* gc=mn */, - { 0, 464, 1362, 2, 9, UNI_SAMR } /* issamaritan */, - { 0, 1879, 1487, 4, 8, UNI_JAMOEXTA } /* blk=jamoexta */, - { 0, 1796, 721, 7, 7, UNI_SC__KNDA } /* script=kannada */, - { 34, 343, 2695, 3, 3, UNI_CCC__AR } /* ccc=ar */, - { 4, 2253, 7171, 9, 3, UNI_IN__12 } /* presentin=12 */, - { 3, 1102, 1353, 4, 9, UNI_PAUC } /* scx=paucinhau */, - { 1, 8533, 4081, 9, 11, UNI_SUPPUNCTUATION } /* block=suppunctuation */, - { 1, 7473, 934, 10, 2, -UNI_XPOSIXALPHA } /* alphabetic=f */, - { 0, 2, 588, 3, 5, UNI_CWL } /* cwl=true */, - { 0, 343, 562, 5, 2, UNI_CCC__107 } /* ccc=107 */, - { 20, 2, 7908, 1, 15, UNI_CUNEIFORMNUMBERS } /* cuneiformnumbers */, - { 8, 2948, 6042, 11, 4, UNI_NFCQC__M } /* nfcquickcheck=m */, - { 0, 3474, 5787, 6, 19, UNI_JAMOEXTA } /* block=hanguljamoextendeda */, - { 1, 7018, 1696, 9, 2, UNI_ARABICPFB } /* inarabicpfb */, - { 0, 464, 5340, 2, 10, UNI_DEVA } /* isdevanagari */, - { 1, 6944, 1878, 24, 2, UNI_CCC__DB } /* canonicalcombiningclass=db */, - { 0, 2726, 115, 3, 2, UNI_SK } /* gc=sk */, - { 0, 1102, 721, 4, 7, UNI_KNDA } /* scx=kannada */, - { 0, 4355, 152, 17, 4, UNI_OSGE } /* scriptextensions=osge */, - { 0, 4355, 5322, 17, 8, UNI_CHER } /* scriptextensions=cherokee */, - { 0, 2474, 8307, 3, 33, UNI_MISCPICTOGRAPHS } /* ismiscellaneoussymbolsandpictographs */, - { 9, 313, 59, 2, 4, UNI_INCHAM } /* incham */, - { 8, 6114, 3991, 3, 4, UNI_BRAI } /* sc=brai */, - { 5, 823, 588, 4, 2, UNI_DASH } /* dash=t */, - { 1, 4776, 5620, 16, 3, -UNI__PERL_PATWS } /* patternwhitespace=n */, - { 1, 2483, 252, 8, 5, UNI_XPOSIXCNTRL } /* isxposixcntrl */, - { 1, 296, 395, 3, 2, UNI_NV__41 } /* nv=41 */, - { 0, 7527, 322, 3, 2, UNI_LB__AI } /* lb=ai */, - { 1, 43, 0, 4, 0, UNI_BHKS } /* bhks */, - { 0, 7688, 4672, 23, 5, UNI_JG__MANICHAEANALEPH } /* joininggroup=manichaeanaleph */, - { 0, 313, 5727, 2, 21, UNI_ININSCRIPTIONALPARTHIAN } /* ininscriptionalparthian */, - { 0, 7068, 0, 26, 0, UNI_PCM } /* prependedconcatenationmark */, - { 10, 464, 102, 2, 4, UNI_HLUW } /* ishluw */, - { 1, 2253, 0, 12, 0, UNI_IN__14 } /* presentin=14 */, - { 0, 464, 991, 2, 6, UNI_HATR } /* ishatran */, - { 0, 7431, 2127, 27, 2, UNI_CCC__13 } /* canonicalcombiningclass=ccc13 */, - { 1, 3474, 1271, 6, 9, UNI_INKHUDAWADI } /* block=khudawadi */, - { 0, 2454, 1916, 3, 11, UNI_GRBASE } /* isgraphemebase */, - { 32, 313, 5389, 2, 20, UNI_INNYIAKENGPUACHUEHMONG } /* innyiakengpuachuehmong */, - { 8, 302, 602, 2, 2, -UNI_RI } /* ri=n */, - { 5, 4122, 356, 5, 4, UNI_XPOSIXLOWER } /* lower=yes */, - { 0, 1597, 602, 10, 2, -UNI_SD } /* softdotted=n */, - { 8, 6774, 356, 25, 2, UNI_DI } /* defaultignorablecodepoint=y */, - { 65, 6114, 1198, 3, 7, UNI_SC__GRAN } /* sc=grantha */, - { 3, 1102, 445, 4, 4, UNI_ORKH } /* scx=orkh */, - { 0, 1102, 618, 4, 4, UNI_ELYM } /* scx=elym */, - { 0, 3474, 671, 6, 5, UNI_INOGHAM } /* block=ogham */, - { 9, 3058, 588, 8, 5, UNI_XPOSIXXDIGIT } /* hexdigit=true */, - { 1, 6944, 7359, 24, 4, UNI_CCC__216 } /* canonicalcombiningclass=atar */, - { 4, 1102, 2771, 4, 5, UNI_KHMR } /* scx=khmer */, - { 1, 313, 975, 2, 8, UNI_INGURMUKHI } /* ingurmukhi */, - { 0, 2181, 2173, 4, 8, UNI_NV__1_SLASH_20 } /* nv=5.000e-02 */, - { 4, 3669, 723, 12, 3, UNI_JG__MALAYALAMNNA } /* jg=malayalamnna */, - { 0, 2463, 0, 5, 0, UNI_JOINC } /* joinc */, - { 0, 7880, 2335, 4, 5, UNI_CJKEXTE } /* iscjkexte */, - { 2, 3351, 2138, 13, 2, UNI_NV__33 } /* numericvalue=33 */, - { 0, 1856, 934, 11, 2, -UNI_BIDIC } /* bidicontrol=f */, - { 1, 1796, 4202, 7, 17, UNI_KITS } /* script=khitansmallscript */, - { 2, 464, 378, 2, 5, UNI_GREXT } /* isgrext */, - { 4, 28, 1462, 2, 8, UNI_XPOSIXBLANK } /* horizspace */, - { 6, 6114, 6134, 3, 4, UNI_SC__GLAG } /* sc=glag */, - { 2, 2229, 1539, 9, 3, UNI_PHAISTOS } /* phaistosdisc */, - { 2, 2726, 366, 3, 2, UNI_SM } /* gc=sm */, - { 1, 3734, 356, 14, 4, UNI_NFKCQC__Y } /* nfkcquickcheck=yes */, - { 17, 3474, 2297, 6, 13, UNI_BLOCKELEMENTS } /* block=blockelements */, - { 0, 1879, 3435, 4, 15, UNI_INZANABAZARSQUARE } /* blk=zanabazarsquare */, - { 8, 3137, 6970, 15, 9, UNI_EA__H } /* eastasianwidth=halfwidth */, - { 3, 7823, 8089, 5, 21, UNI_CJKSYMBOLS } /* incjksymbolsandpunctuation */, - { 0, 1796, 1807, 7, 11, UNI_SORA } /* script=sorasompeng */, - { 0, 464, 3991, 2, 15, UNI_BRAI } /* isbraillepatterns */, - { 8, 1879, 5397, 4, 3, UNI_PUA } /* blk=pua */, - { 4, 4355, 840, 17, 7, UNI_TGLG } /* scriptextensions=tagalog */, - { 2, 4291, 281, 10, 2, UNI_LB__H2 } /* linebreak=h2 */, - { 13, 7317, 1687, 21, 7, UNI_BC__LRI } /* bidiclass=lefttorightisolate */, - { 1, 959, 0, 8, 0, UNI_EXT } /* extender */, - { 3, 7431, 299, 28, 1, UNI_CCC__19 } /* canonicalcombiningclass=ccc19 */, - { 2, 2496, 1265, 3, 6, UNI_JG__LAMADH } /* jg=lamadh */, - { 2, 313, 4062, 2, 8, UNI_VEDICEXT } /* invedicext */, - { 9, 2812, 0, 12, 0, UNI_MAHJONG } /* mahjongtiles */, - { 0, 7732, 7772, 8, 13, UNI_ENCLOSEDALPHANUM } /* enclosedalphanumerics */, - { 1, 5586, 1860, 21, 7, UNI_GCB__CN } /* graphemeclusterbreak=control */, - { 0, 1879, 1424, 4, 10, UNI_INCHORASMIAN } /* blk=chorasmian */, - { 6, 3474, 144, 6, 4, UNI_INNEWA } /* block=newa */, - { 0, 1102, 611, 4, 4, UNI_ELBA } /* scx=elba */, - { 4, 696, 5174, 6, 12, UNI_PO } /* isotherpunctuation */, - { 18, 2463, 588, 11, 2, UNI_JOINC } /* joincontrol=t */, - { 2, 3164, 934, 14, 6, -UNI_GREXT } /* graphemeextend=false */, - { 9, 4291, 1990, 10, 2, UNI_LB__WJ } /* linebreak=wj */, - { 1, 2974, 399, 11, 2, UNI_IN__6_DOT_1 } /* presentin=v61 */, - { 4, 1796, 1003, 7, 4, UNI_LEPC } /* script=lepc */, - { 0, 464, 983, 2, 4, UNI_HIRA } /* ishira */, - { 1, 7132, 1818, 7, 8, UNI_SUPERANDSUB } /* blk=superandsub */, - { 0, 6114, 421, 3, 4, UNI_KHMR } /* sc=khmr */, - { 18, 464, 6774, 2, 25, UNI_DI } /* isdefaultignorablecodepoint */, - { 5, 1377, 3594, 3, 2, UNI_WB__NL } /* wb=nl */, - { 5, 6025, 5812, 11, 13, UNI_GEORGIANSUP } /* block=georgiansupplement */, - { 1, 306, 602, 5, 3, -UNI__PERL_PATWS } /* patws=no */, - { 0, 4322, 299, 14, 1, UNI_NV__39 } /* numericvalue=39 */, - { 1, 2726, 3152, 3, 12, UNI_NL } /* gc=letternumber */, - { 4, 7473, 6573, 9, 3, UNI_XPOSIXALPHA } /* alphabetic=t */, - { 0, 2678, 0, 14, 0, UNI_BC__R } /* bc=righttoleft */, - { 2, 2365, 0, 4, 0, UNI_ETHI } /* ethi */, - { 0, 1796, 1495, 7, 8, UNI_SC__JAVA } /* script=javanese */, - { 15, 4500, 587, 8, 6, UNI_XPOSIXUPPER } /* uppercase=true */, - { 4, 5087, 1592, 10, 2, UNI_WB__FO } /* wordbreak=fo */, - { 1, 5409, 588, 19, 2, UNI_TERM } /* terminalpunctuation=t */, - { 2, 5607, 5889, 18, 9, UNI_IDENTIFIERTYPE__NOTCHARACTER } /* identifiertype=notcharacter */, - { 2, 3474, 6644, 6, 15, UNI_TRANSPORTANDMAP } /* block=transportandmap */, - { 0, 328, 6052, 3, 13, UNI_SUPMATHOPERATORS } /* supmathoperators */, - { 0, 1879, 3885, 4, 17, UNI_INCAUCASIANALBANIAN } /* blk=caucasianalbanian */, - { 0, 2712, 934, 5, 6, -UNI_EMOJI } /* emoji=false */, - { 3, 1796, 1311, 7, 4, UNI_ITAL } /* script=ital */, - { 5, 6114, 120, 3, 4, UNI_LAO } /* sc=laoo */, - { 0, 4092, 0, 12, 0, UNI_DIACRITICALS } /* diacriticals */, - { 0, 313, 322, 3, 4, UNI_INTAILE } /* intaile */, - { 0, 2253, 515, 9, 2, UNI_IN__3 } /* presentin=3 */, - { 0, 1796, 1344, 7, 4, UNI_PALM } /* script=palm */, - { 0, 2392, 2030, 3, 11, UNI_MATHALPHANUM } /* inmathalphanum */, - { 49, 1440, 356, 2, 4, UNI_SD } /* sd=yes */, - { 0, 1879, 1948, 4, 10, UNI_INOLDSOGDIAN } /* blk=oldsogdian */, - { 16, 4485, 0, 15, 0, UNI_TITLE } /* titlecaseletter */, - { 0, 3622, 4701, 15, 10, UNI_LATINEXTADDITIONAL } /* islatinextendedadditional */, - { 0, 940, 602, 6, 2, -UNI_COMPEX } /* compex=n */, - { 43, 4355, 1015, 17, 6, UNI_TELU } /* scriptextensions=telugu */, - { 0, 6774, 0, 25, 0, UNI_DI } /* defaultignorablecodepoint */, - { 0, 6114, 372, 3, 6, UNI_GOTH } /* sc=gothic */, - { 11, 4872, 4442, 10, 9, UNI_KANAEXTB } /* block=kanaextendedb */, - { 2, 1796, 5727, 7, 21, UNI_PRTI } /* script=inscriptionalparthian */, - { 6, 2726, 4006, 3, 14, UNI_SC } /* gc=currencysymbol */, - { 0, 7182, 6309, 3, 13, UNI_CJKCOMPAT } /* cjkcompatibility */, - { 4, 4450, 1895, 7, 11, UNI_CHESSSYMBOLS } /* block=chesssymbols */, - { 2, 464, 1021, 2, 6, UNI_WCHO } /* iswancho */, - { 17, 6114, 1326, 3, 9, UNI_ORKH } /* sc=oldturkic */, - { 0, 5136, 7556, 5, 19, UNI_MISCSYMBOLS } /* blk=miscellaneoussymbols */, - { 21, 5147, 4275, 7, 16, UNI_LETTERLIKESYMBOLS } /* block=letterlikesymbols */, - { 0, 5409, 602, 19, 2, -UNI_TERM } /* terminalpunctuation=n */, - { 21, 2392, 5797, 9, 9, UNI_MYANMAREXTA } /* inmyanmarextendeda */, - { 0, 3722, 356, 4, 4, UNI_MATH } /* math=yes */, - { 1, 5186, 356, 20, 4, UNI_EXTPICT } /* extendedpictographic=yes */, - { 0, 313, 36, 2, 2, UNI_INVS } /* invs */, - { 5, 5523, 0, 21, 0, UNI_CWL } /* changeswhenlowercased */, - { 0, 302, 278, 2, 1, UNI_ri_values_index } /* ri= */, - { 8, 1102, 1951, 4, 7, UNI_SOGD } /* scx=sogdian */, - { 2, 7660, 934, 17, 2, -UNI_VS } /* variationselector=f */, - { 0, 1879, 1362, 4, 9, UNI_INSAMARITAN } /* blk=samaritan */, - { 1, 296, 391, 3, 2, UNI_NV__26 } /* nv=26 */, - { 1, 1495, 0, 8, 0, UNI_JAVA } /* javanese */, - { 6, 1410, 396, 7, 2, UNI_CCC__15 } /* ccc=ccc15 */, - { 0, 464, 540, 2, 4, UNI_TANG } /* istang */, - { 1, 2463, 588, 5, 5, UNI_JOINC } /* joinc=true */, - { 2, 1102, 4962, 4, 4, UNI_HAN } /* scx=hani */, - { 0, 2638, 0, 11, 0, UNI_IN__5 } /* presentin=5 */, - { 5, 608, 5929, 3, 3, UNI_IDEO } /* ideo=t */, - { 0, 513, 2080, 4, 8, UNI_NV__7_SLASH_2 } /* nv=3.500e+00 */, - { 0, 5136, 743, 5, 6, UNI_INMANDAIC } /* blk=mandaic */, - { 0, 2974, 395, 11, 2, UNI_IN__4_DOT_1 } /* presentin=v41 */, - { 7, 464, 3637, 2, 4, UNI_LISU } /* islisu */, - { 64, 6112, 5254, 5, 15, UNI_INSC__MODIFYINGLETTER } /* insc=modifyingletter */, - { 0, 8007, 6509, 7, 16, UNI_CJKCOMPATIDEOGRAPHS } /* blk=cjkcompatideographs */, - { 0, 6114, 1344, 3, 4, UNI_PALM } /* sc=palm */, - { 1, 1796, 1353, 7, 9, UNI_PAUC } /* script=paucinhau */, - { 0, 2712, 602, 5, 2, -UNI_EMOJI } /* emoji=n */, - { 2, 1796, 287, 7, 5, UNI_NSHU } /* script=nushu */, - { 4, 1102, 735, 4, 7, UNI_LINA } /* scx=lineara */, - { 0, 7317, 3465, 9, 3, UNI_BC__ET } /* bidiclass=et */, - { 12, 2496, 3688, 3, 3, UNI_JG__TAW } /* jg=taw */, - { 0, 895, 1299, 5, 2, UNI_AGE__6 } /* age=v60 */, - { 12, 624, 602, 2, 3, -UNI_CE } /* ce=no */, - { 0, 6774, 588, 25, 5, UNI_DI } /* defaultignorablecodepoint=true */, - { 0, 5888, 934, 5, 2, -UNI__PERL_NCHAR } /* nchar=f */, - { 0, 1879, 6052, 4, 13, UNI_MATHOPERATORS } /* blk=mathoperators */, - { 0, 7201, 2443, 16, 11, UNI_CASEDLETTER } /* generalcategory=casedletter */, - { 0, 4355, 1094, 17, 4, UNI_MERC } /* scriptextensions=merc */, - { 5, 1879, 1202, 4, 4, UNI_INTHAI } /* blk=thai */, - { 0, 8276, 1418, 22, 6, UNI_INSC__VIRAMA } /* indicsyllabiccategory=virama */, - { 6, 1102, 2401, 4, 4, UNI_NAND } /* scx=nand */, - { 0, 2974, 294, 12, 2, UNI_IN__14 } /* presentin=v140 */, - { 1, 6114, 433, 3, 3, UNI_SC__NKO } /* sc=nko */, - { 0, 555, 569, 4, 3, UNI_AGE__9 } /* age=9.0 */, - { 0, 296, 7173, 3, 2, UNI_NV__28 } /* nv=28 */, - { 1, 1410, 2127, 7, 2, UNI_CCC__13 } /* ccc=ccc13 */, - { 0, 818, 0, 7, 0, UNI_SHRD } /* sharada */, - { 16, 7473, 345, 9, 2, UNI_alpha_values_index } /* alphabetic= */, - { 3, 7201, 4077, 16, 15, UNI_PD } /* generalcategory=dashpunctuation */, - { 1, 313, 7377, 2, 26, UNI_KATAKANAEXT } /* inkatakanaphoneticextensions */, - { 30, 464, 4740, 2, 18, UNI_ORNAMENTALDINGBATS } /* isornamentaldingbats */, - { 0, 343, 2138, 4, 2, UNI_CCC__33 } /* ccc=33 */, - { 0, 316, 356, 5, 4, UNI_QMARK } /* qmark=yes */, - { 2, 3474, 1487, 6, 8, UNI_JAMOEXTA } /* block=jamoexta */, - { 35, 1440, 934, 2, 2, -UNI_SD } /* sd=f */, - { 23, 3338, 356, 13, 4, UNI_NFDQC__Y } /* nfdquickcheck=yes */, - { 0, 2981, 1299, 4, 2, UNI_IN__6 } /* in=v60 */, - { 0, 8276, 5254, 22, 15, UNI_INSC__MODIFYINGLETTER } /* indicsyllabiccategory=modifyingletter */, - { 0, 4392, 0, 11, 0, UNI_SGNW } /* signwriting */, - { 1, 2463, 934, 11, 2, -UNI_JOINC } /* joincontrol=f */, - { 4, 4092, 602, 9, 3, -UNI_DIA } /* diacritic=no */, - { 1, 2474, 7556, 3, 19, UNI_MISCSYMBOLS } /* ismiscellaneoussymbols */, - { 20, 464, 128, 2, 4, UNI_MEDF } /* ismedf */, - { 5, 1102, 1021, 4, 6, UNI_WCHO } /* scx=wancho */, - { 71, 6114, 1755, 3, 11, UNI_MEDF } /* sc=medefaidrin */, - { 1, 464, 54, 2, 2, UNI_MC } /* ismc */, - { 8, 3474, 3991, 6, 15, UNI_BRAI } /* block=braillepatterns */, - { 2, 1102, 4418, 4, 6, UNI_ZYYY } /* scx=common */, - { 0, 6114, 1255, 3, 4, UNI_SOYO } /* sc=soyo */, - { 5, 8007, 7314, 30, 4, UNI_CJKEXTB } /* blk=cjkunifiedideographsextensionb */, - { 40, 1879, 5787, 4, 10, UNI_JAMO } /* blk=hanguljamo */, - { 0, 8182, 4042, 27, 8, UNI_INPC__TOPANDRIGHT } /* indicpositionalcategory=topandright */, - { 18, 445, 0, 4, 0, UNI_ORKH } /* orkh */, - { 1, 1102, 1948, 4, 10, UNI_SOGO } /* scx=oldsogdian */, - { 3, 1102, 5825, 4, 9, UNI_SUND } /* scx=sundanese */, - { 22, 343, 585, 5, 2, UNI_CCC__122 } /* ccc=122 */, - { 0, 8533, 4372, 7, 16, UNI_SMALLFORMS } /* block=smallformvariants */, - { 1, 313, 7385, 2, 28, UNI_PHONETICEXTSUP } /* inphoneticextensionssupplement */, - { 0, 6114, 1951, 3, 7, UNI_SC__SOGD } /* sc=sogdian */, - { 8, 6114, 574, 3, 7, UNI_AVST } /* sc=avestan */, - { 6, 2474, 176, 3, 2, UNI_MRO } /* ismro */, - { 0, 3351, 2063, 13, 9, UNI_NV__1_SLASH_8 } /* numericvalue=1.250e-01 */, - { 10, 1879, 5322, 4, 8, UNI_INCHEROKEE } /* blk=cherokee */, - { 0, 8244, 6334, 9, 18, UNI_CJKCOMPATFORMS } /* block=cjkcompatibilityforms */, - { 0, 1796, 5631, 7, 5, UNI_SC__GREK } /* script=greek */, - { 5, 7880, 4464, 5, 4, UNI_CJKEXTC } /* iscjkextc */, - { 1, 2260, 569, 3, 3, UNI_IN__9 } /* in=9.0 */, - { 0, 5865, 356, 21, 4, UNI_LOE } /* logicalorderexception=yes */, - { 21, 313, 611, 2, 7, UNI_INELBASAN } /* inelbasan */, - { 1, 3351, 1304, 13, 4, UNI_NV__2000 } /* numericvalue=2000 */, - { 0, 959, 602, 8, 2, -UNI_EXT } /* extender=n */, - { 0, 6944, 6280, 24, 3, UNI_CCC__202 } /* canonicalcombiningclass=atb */, - { 5, 1796, 477, 7, 4, UNI_VAI } /* script=vaii */, - { 8, 2260, 2128, 3, 3, UNI_IN__3_DOT_1 } /* in=3.1 */, - { 0, 6114, 1117, 3, 4, UNI_SC__TAGB } /* sc=tagb */, - { 1, 5586, 546, 21, 2, UNI_WB__EB } /* graphemeclusterbreak=eb */, - { 7, 555, 390, 5, 2, UNI_AGE__5_DOT_2 } /* age=5.2 */, - { 0, 275, 5718, 4, 9, UNI_WB__EB } /* gcb=emodifier */, - { 0, 1236, 3452, 4, 10, UNI_INCYRILLIC } /* block=cyrillic */, - { 0, 2678, 0, 4, 0, UNI_BC__R } /* bc=r */, - { 0, 313, 1344, 2, 9, UNI_PALM } /* inpalmyrene */, - { 0, 313, 676, 2, 5, UNI_INOSAGE } /* inosage */, - { 0, 7880, 5183, 28, 4, UNI_CJKEXTE } /* iscjkunifiedideographsextensione */, - { 0, 1796, 6728, 7, 11, UNI_MTEI } /* script=meeteimayek */, - { 0, 7584, 1687, 18, 8, UNI_DT__ISO } /* decompositiontype=isolated */, - { 5, 1796, 790, 7, 4, UNI_HMNP } /* script=hmnp */, - { 0, 302, 602, 2, 3, -UNI_RI } /* ri=no */, - { 0, 3593, 1698, 7, 4, UNI_LATINEXTF } /* inlatinextf */, - { 3, 1879, 1400, 4, 10, UNI_BOXDRAWING } /* blk=boxdrawing */, - { 8, 1065, 397, 5, 1, UNI_NV__1_SLASH_5 } /* nv=1/5 */, - { 3, 313, 2018, 2, 12, UNI_INMASARAMGONDI } /* inmasaramgondi */, - { 0, 4433, 129, 15, 3, UNI_LATINEXTF } /* blk=latinextendedf */, - { 2, 876, 602, 4, 2, -UNI_IDEO } /* ideo=n */, - { 1, 7416, 0, 14, 0, UNI_PUA } /* privateusearea */, - { 0, 7317, 7712, 10, 21, UNI_BC__PDI } /* bidiclass=popdirectionalisolate */, - { 20, 7201, 1464, 16, 2, UNI_ZS } /* generalcategory=zs */, - { 0, 316, 356, 5, 2, UNI_QMARK } /* qmark=y */, - { 0, 1102, 6594, 4, 6, UNI_BRAH } /* scx=brahmi */, - { 4, 7527, 310, 3, 2, UNI_LB__SP } /* lb=sp */, - { 5, 464, 259, 2, 2, UNI_CF } /* iscf */, - { 3, 1796, 1117, 7, 4, UNI_SC__TAGB } /* script=tagb */, - { 18, 3137, 1176, 14, 7, UNI_EA__NA } /* eastasianwidth=narrow */, - { 0, 464, 437, 2, 4, UNI_OGAM } /* isogam */, - { 19, 1102, 611, 4, 7, UNI_ELBA } /* scx=elbasan */, - { 0, 1796, 321, 7, 5, UNI_SC__TALE } /* script=taile */, - { 53, 3474, 5750, 6, 19, UNI_SUPARROWSB } /* block=supplementalarrowsb */, - { 0, 6944, 2702, 24, 10, UNI_CCC__6 } /* canonicalcombiningclass=hanreading */, - { 20, 513, 2145, 4, 8, UNI_NV__3_SLASH_8 } /* nv=3.750e-01 */, - { 1, 1704, 0, 4, 0, UNI_ARAB } /* arab */, - { 4, 1879, 1550, 3, 11, UNI_INOLDPERSIAN } /* blk=oldpersian */, - { 8, 581, 294, 5, 2, UNI_CCC__IS } /* ccc=240 */, - { 0, 343, 118, 4, 2, UNI_CCC__DA } /* ccc=da */, - { 4, 2692, 4918, 5, 16, UNI_ALCHEMICAL } /* blk=alchemicalsymbols */, - { 2, 3351, 1299, 13, 4, UNI_NV__6000 } /* numericvalue=6000 */, - { 6, 1796, 2986, 7, 14, UNI_SC__PHLP } /* script=psalterpahlavi */, - { 3, 313, 3608, 2, 11, UNI_PHONETICEXT } /* inphoneticext */, - { 1, 1102, 1470, 4, 8, UNI_BUGI } /* scx=buginese */, - { 2, 5087, 1631, 10, 7, UNI_WB__NL } /* wordbreak=newline */, - { 2, 6112, 3249, 14, 5, UNI_INSC__CONSONANTFINAL } /* insc=consonantfinal */, - { 4, 3309, 0, 15, 0, UNI_MERC } /* meroiticcursive */, - { 0, 464, 23, 2, 4, UNI_POSIXXDIGIT } /* isahex */, - { 66, 5322, 0, 8, 0, UNI_CHER } /* cherokee */, - { 10, 4355, 1198, 17, 7, UNI_GRAN } /* scriptextensions=grantha */, - { 4, 7208, 3156, 12, 8, UNI_NO } /* category=othernumber */, - { 2, 3474, 2746, 6, 14, UNI_HIGHSURROGATES } /* block=highsurrogates */, - { 0, 2645, 390, 4, 2, UNI_IN__5_DOT_2 } /* in=5.2 */, - { 2, 6114, 681, 3, 5, UNI_RUNR } /* sc=runic */, - { 0, 5844, 4081, 5, 11, UNI_SUPPUNCTUATION } /* issuppunctuation */, - { 0, 895, 1070, 5, 2, UNI_AGE__3_DOT_1 } /* age=v31 */, - { 1, 3351, 298, 12, 3, UNI_NV__90 } /* numericvalue=90 */, - { 1, 4793, 0, 4, 0, UNI_RUMI } /* rumi */, - { 16, 1975, 311, 7, 5, UNI_POSIXPRINT } /* isposixprint */, - { 0, 2678, 4207, 3, 3, UNI_BC__NSM } /* bc=nsm */, - { 9567, 1967, 588, 7, 2, UNI_RADICAL } /* radical=t */, - { 9, 1879, 5825, 4, 19, UNI_SUNDANESESUP } /* blk=sundanesesupplement */, - { 4, 3058, 934, 8, 6, -UNI_XPOSIXXDIGIT } /* hexdigit=false */, - { 0, 37, 1588, 1, 9, UNI_SMALLFORMS } /* smallforms */, - { 0, 7527, 383, 3, 6, UNI_LB__HY } /* lb=hyphen */, - { 0, 7208, 6466, 9, 10, UNI_CO } /* category=privateuse */, - { 0, 5865, 8485, 17, 5, UNI_loe_values_index } /* logicalorderexception= */, - { 0, 34, 5660, 1, 3, UNI_ME } /* isme */, - { 4, 4355, 1344, 17, 9, UNI_PALM } /* scriptextensions=palmyrene */, - { 2, 4355, 3285, 17, 4, UNI_HEBR } /* scriptextensions=hebr */, - { 5, 1991, 2868, 12, 11, UNI_JT__C } /* joiningtype=joincausing */, - { 0, 524, 934, 6, 2, -UNI_PATSYN } /* patsyn=f */, - { 0, 4355, 1015, 17, 4, UNI_TELU } /* scriptextensions=telu */, - { 6, 34, 5660, 1, 20, UNI_MERO } /* ismeroitichieroglyphs */, - { 0, 464, 1015, 2, 6, UNI_TELU } /* istelugu */, - { 2, 7527, 1906, 3, 9, UNI_LB__AI } /* lb=ambiguous */, - { 0, 106, 0, 4, 0, UNI_HMNG } /* hmng */, - { 0, 1796, 180, 7, 4, UNI_RUNR } /* script=runr */, - { 0, 3236, 5771, 3, 16, UNI_ENCLOSEDALPHANUMSUP } /* enclosedalphanumsup */, - { 7, 3474, 7377, 6, 26, UNI_KATAKANAEXT } /* block=katakanaphoneticextensions */, - { 4, 4450, 3500, 8, 14, UNI_CYPRIOTSYLLABARY } /* block=cypriotsyllabary */, - { 0, 464, 383, 2, 6, UNI_HYPHEN } /* ishyphen */, - { 12, 555, 563, 4, 3, UNI_AGE__7 } /* age=7.0 */, - { 3, 3351, 2615, 13, 10, UNI_NV___MINUS_1_SLASH_2 } /* numericvalue=-5.000e-01 */, - { 4, 3351, 2120, 14, 8, UNI_NV__1_SLASH_4 } /* numericvalue=2.500e-01 */, - { 0, 5087, 1881, 8, 4, UNI_WB__KA } /* wordbreak=ka */, - { 0, 7132, 1110, 5, 7, UNI_SPECIALS } /* blk=specials */, - { 1, 2274, 933, 10, 7, -UNI_XIDC } /* xidcontinue=false */, - { 0, 1344, 931, 6, 3, UNI_PALM } /* palmyrene */, - { 8, 2712, 601, 13, 4, -UNI_ECOMP } /* emojicomponent=no */, - { 0, 58, 4436, 2, 6, UNI_SC__LATN } /* sc=latin */, - { 3, 8182, 8440, 24, 14, UNI_INPC__BOTTOMANDRIGHT } /* indicpositionalcategory=bottomandright */, - { 4, 1441, 0, 3, 0, UNI_DEP } /* dep */, - { 21, 2392, 6053, 3, 12, UNI_MATHOPERATORS } /* inmathoperators */, - { 1, 1796, 3465, 6, 5, UNI_ETHI } /* script=ethi */, - { 2, 2, 933, 1, 7, -UNI_CE } /* ce=false */, - { 3, 316, 0, 5, 0, UNI_QMARK } /* qmark */, - { 1, 600, 3236, 3, 3, UNI_DT__ENC } /* dt=enc */, - { 0, 275, 602, 2, 3, UNI_NO } /* gc=no */, - { 10, 464, 5340, 2, 13, UNI_DEVANAGARIEXT } /* isdevanagariext */, - { 1, 2496, 4692, 4, 4, UNI_JG__ALAPH } /* jg=alaph */, - { 4, 1410, 1303, 8, 2, UNI_CCC__132 } /* ccc=ccc132 */, - { 0, 313, 783, 2, 7, UNI_INOSMANYA } /* inosmanya */, - { 3, 6944, 0, 24, 0, UNI_ccc_values_index } /* canonicalcombiningclass= */, - { 1, 2726, 0, 3, 2, UNI_CASEDLETTER } /* gc=l& */, - { 1, 296, 292, 3, 2, UNI_NV__30 } /* nv=30 */, - { 6, 5481, 602, 21, 3, -UNI_CWCF } /* changeswhencasefolded=no */, - { 21, 464, 176, 2, 4, UNI_ROHG } /* isrohg */, - { 3, 4355, 1133, 17, 4, UNI_VITH } /* scriptextensions=vith */, - { 3, 6749, 602, 25, 3, -UNI_CWKCF } /* changeswhennfkccasefolded=no */, - { 68, 3622, 4701, 10, 10, UNI_LATINEXTADDITIONAL } /* islatinextadditional */, - { 0, 4302, 355, 5, 5, UNI_XPOSIXSPACE } /* wspace=yes */, - { 13, 3090, 6878, 7, 12, UNI_GEOMETRICSHAPES } /* blk=geometricshapes */, - { 2, 6114, 5322, 3, 8, UNI_CHER } /* sc=cherokee */, - { 1, 2229, 0, 8, 0, UNI_PHAISTOS } /* phaistos */, - { 0, 4291, 310, 10, 2, UNI_LB__SP } /* linebreak=sp */, - { 1, 7132, 8319, 16, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* blk=supplementalsymbolsandpictographs */, - { 1, 2483, 4500, 8, 5, UNI_XPOSIXUPPER } /* isxposixupper */, - { 3, 821, 1970, 3, 4, UNI_RADICAL } /* radical */, - { 2, 496, 0, 6, 0, UNI_KHOJ } /* khojki */, - { 0, 5099, 2277, 15, 8, UNI__PERL_CHARNAME_CONTINUE } /* _perl_charname_continue */, - { 0, 3734, 602, 14, 3, UNI_NFKCQC__N } /* nfkcquickcheck=no */, - { 65, 4355, 917, 17, 8, UNI_BASS } /* scriptextensions=bassavah */, - { 1, 738, 2498, 2, 2, UNI_EA__A } /* ea=a */, - { 2, 6112, 5269, 5, 15, UNI_INSC__REGISTERSHIFTER } /* insc=registershifter */, - { 0, 1102, 112, 4, 4, UNI_KITS } /* scx=kits */, - { 3, 7688, 3825, 22, 4, UNI_JG__MANICHAEANTEN } /* joininggroup=manichaeanten */, - { 2, 4355, 429, 17, 4, UNI_MRO } /* scriptextensions=mroo */, - { 1, 4291, 2951, 10, 2, UNI_LB__QU } /* linebreak=qu */, - { 1, 6112, 2290, 5, 6, UNI_INSC__NUMBER } /* insc=number */, - { 2, 343, 3365, 4, 2, UNI_CCC__36 } /* ccc=36 */, - { 3, 1796, 798, 7, 4, UNI_LANA } /* script=lana */, - { 0, 1796, 372, 7, 6, UNI_GOTH } /* script=gothic */, - { 1, 5, 934, 3, 6, -UNI_EXT } /* ext=false */, - { 36, 2496, 490, 3, 3, UNI_JG__REH } /* jg=reh */, - { 3, 3474, 8592, 6, 34, UNI_UCAS } /* block=unifiedcanadianaboriginalsyllabics */, - { 6, 8470, 5930, 19, 19, UNI_VO__TR } /* verticalorientation=transformedrotated */, - { 6, 5748, 5080, 14, 7, UNI_SUPARROWSA } /* insupplementalarrowsa */, - { 24, 4355, 1807, 17, 11, UNI_SORA } /* scriptextensions=sorasompeng */, - { 0, 6112, 5680, 6, 15, UNI_INSC__CANTILLATIONMARK } /* insc=cantillationmark */, - { 1, 3090, 2332, 5, 12, UNI_GREEKEXT } /* blk=greekextended */, - { 0, 4291, 276, 10, 2, UNI_LB__CB } /* linebreak=cb */, - { 0, 3351, 1299, 13, 2, UNI_NV__60 } /* numericvalue=60 */, - { 0, 296, 1300, 4, 2, UNI_NV__900 } /* nv=900 */, - { 1, 5481, 934, 21, 2, -UNI_CWCF } /* changeswhencasefolded=f */, - { 1, 7182, 1646, 3, 4, UNI_CJKEXTD } /* cjkextd */, - { 5, 5886, 1548, 19, 3, UNI_nchar_values_index } /* noncharactercodepoint= */, - { 3, 3474, 4656, 6, 9, UNI_TANGUTSUP } /* block=tangutsup */, - { 0, 887, 0, 6, 0, UNI_AGE__10 } /* age=10 */, - { 3, 1377, 1837, 3, 8, UNI_WB__EB } /* wb=ebasegaz */, - { 0, 465, 0, 4, 0, UNI_SHRD } /* shrd */, - { 5, 1710, 5358, 3, 17, UNI_SMALLKANAEXT } /* issmallkanaextension */, - { 0, 5409, 356, 19, 2, UNI_TERM } /* terminalpunctuation=y */, - { 0, 343, 2207, 3, 2, UNI_CCC__8 } /* ccc=8 */, - { 3, 136, 0, 4, 0, UNI_MYMR } /* mymr */, - { 0, 7148, 292, 25, 2, UNI_CCC__130 } /* canonicalcombiningclass=130 */, - { 0, 6114, 5825, 3, 9, UNI_SUND } /* sc=sundanese */, - { 0, 1440, 602, 2, 3, -UNI_SD } /* sd=no */, - { 1, 3915, 602, 17, 2, -UNI_EPRES } /* emojipresentation=n */, - { 1, 464, 457, 2, 4, UNI_PRTI } /* isprti */, - { 1, 1383, 588, 7, 5, UNI_IDS } /* idstart=true */, - { 7, 600, 55, 3, 3, UNI_DT__CAN } /* dt=can */, - { 8, 1102, 749, 4, 4, UNI_MARC } /* scx=marc */, - { 8, 5844, 4538, 12, 13, UNI_SUPPUNCTUATION } /* issupplementalpunctuation */, - { 8, 3593, 4629, 6, 5, UNI_LATIN1 } /* inlatin1sup */, - { 0, 2496, 1743, 3, 2, UNI_JG__FE } /* jg=fe */, - { 1, 875, 602, 5, 3, -UNI_UIDEO } /* uideo=no */, - { 8, 1879, 4656, 4, 16, UNI_TANGUTSUP } /* blk=tangutsupplement */, - { 16, 4322, 1781, 14, 4, UNI_NV__30000 } /* numericvalue=30000 */, - { 1, 1967, 934, 7, 2, -UNI_RADICAL } /* radical=f */, - { 1, 1796, 4962, 7, 4, UNI_SC__HAN } /* script=hani */, - { 10, 1879, 868, 4, 7, UNI_INTIRHUTA } /* blk=tirhuta */, - { 4, 3462, 1183, 5, 8, UNI_EMOTICONS } /* blk=emoticons */, - { 0, 3748, 523, 15, 1, UNI_NV__1_SLASH_7 } /* numericvalue=1/7 */, - { 1, 1796, 814, 7, 4, UNI_SC__QAAI } /* script=zinh */, - { 0, 736, 7175, 3, 10, UNI_ENCLOSEDCJK } /* inenclosedcjk */, - { 5, 3527, 0, 16, 0, UNI_HALFANDFULLFORMS } /* halfandfullforms */, - { 4, 1796, 1191, 7, 4, UNI_SC__BENG } /* script=beng */, - { 0, 2802, 3641, 10, 10, UNI_ETHIOPICSUP } /* isethiopicsupplement */, - { 57, 4857, 0, 5, 0, UNI_TAML } /* tamil */, - { 0, 3474, 2428, 6, 13, UNI_IPAEXT } /* block=ipaextensions */, - { 1, 4450, 4457, 7, 11, UNI_CYRILLICEXTC } /* block=cyrillicextc */, - { 1, 37, 7238, 1, 24, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* symbolsandpictographsexta */, - { 2, 464, 6052, 2, 13, UNI_MATHOPERATORS } /* ismathoperators */, - { 1, 313, 818, 2, 7, UNI_SC__SHRD } /* insharada */, - { 6, 6570, 140, 5, 2, UNI_INPC__NA } /* inpc=na */, - { 0, 8, 6240, 1, 3, UNI_L } /* gc=l */, - { 8, 343, 1418, 4, 6, UNI_CCC__9 } /* ccc=virama */, - { 0, 1977, 1465, 5, 5, UNI_POSIXSPACE } /* posixspace */, - { 1, 7828, 934, 16, 6, -UNI_UIDEO } /* unifiedideograph=false */, - { 2, 2496, 1041, 3, 5, UNI_JG__GAMAL } /* jg=gamal */, - { 1, 313, 3608, 2, 14, UNI_PHONETICEXTSUP } /* inphoneticextsup */, - { 0, 4322, 2145, 14, 8, UNI_NV__3_SLASH_8 } /* numericvalue=3.750e-01 */, - { 4, 4355, 1090, 17, 4, UNI_LINB } /* scriptextensions=linb */, - { 0, 4355, 4020, 17, 4, UNI_SIND } /* scriptextensions=sind */, - { 0, 7182, 6509, 3, 16, UNI_CJKCOMPATIDEOGRAPHS } /* cjkcompatideographs */, - { 3, 1879, 6833, 4, 23, UNI_BYZANTINEMUSIC } /* blk=byzantinemusicalsymbols */, - { 2, 464, 39, 2, 4, UNI_BATK } /* isbatk */, - { 7, 1102, 676, 4, 5, UNI_OSGE } /* scx=osage */, - { 4, 6114, 1353, 3, 9, UNI_PAUC } /* sc=paucinhau */, - { 0, 464, 666, 2, 4, UNI_LIMB } /* islimb */, - { 0, 5928, 5942, 3, 7, UNI_VO__R } /* vo=rotated */, - { 0, 1796, 417, 7, 4, UNI_SC__HANO } /* script=hano */, - { 1, 6185, 6199, 18, 8, UNI_NV__1000000000000 } /* numericvalue=1000000000000 */, - { 17, 5136, 8212, 5, 32, UNI_MISCMATHSYMBOLSB } /* blk=miscellaneousmathematicalsymbolsb */, - { 0, 7584, 696, 18, 3, UNI_DT__ISO } /* decompositiontype=iso */, - { 0, 1102, 1015, 4, 6, UNI_TELU } /* scx=telugu */, - { 5, 5565, 356, 21, 4, UNI_CWU } /* changeswhenuppercased=yes */, - { 8, 343, 1650, 4, 7, UNI_CCC__1 } /* ccc=overlay */, - { 16, 1441, 934, 10, 2, -UNI_DEP } /* deprecated=f */, - { 0, 524, 0, 6, 0, UNI_PATSYN } /* patsyn */, - { 13, 4355, 236, 17, 2, UNI_YI } /* scriptextensions=yi */, - { 1, 313, 5787, 2, 10, UNI_JAMO } /* inhanguljamo */, - { 1, 6114, 112, 3, 4, UNI_KITS } /* sc=kits */, - { 0, 7201, 334, 16, 2, UNI_PD } /* generalcategory=pd */, - { 8, 1102, 172, 4, 4, UNI_RJNG } /* scx=rjng */, - { 1, 1879, 1755, 4, 11, UNI_INMEDEFAIDRIN } /* blk=medefaidrin */, - { 1, 833, 588, 4, 5, UNI_TERM } /* term=true */, - { 0, 1879, 1037, 8, 4, UNI_KANAEXTB } /* blk=kanaextb */, - { 0, 5087, 2680, 9, 3, UNI_RI } /* wordbreak=ri */, - { 1, 4291, 4711, 10, 15, UNI_LB__CB } /* linebreak=contingentbreak */, - { 1, 3748, 1304, 15, 2, UNI_NV__1_SLASH_20 } /* numericvalue=1/20 */, - { 5, 1879, 1353, 4, 9, UNI_INPAUCINHAU } /* blk=paucinhau */, - { 2, 6112, 3217, 14, 6, UNI_INSC__CONSONANTKILLER } /* insc=consonantkiller */, - { 1, 2678, 5970, 14, 8, UNI_BC__RLO } /* bc=righttoleftoverride */, - { 0, 6114, 691, 3, 5, UNI_BATK } /* sc=batak */, - { 0, 7208, 1413, 8, 2, UNI_C } /* category=c */, - { 0, 2678, 4403, 3, 15, UNI_BC__BN } /* bc=boundaryneutral */, - { 0, 2678, 5428, 3, 18, UNI_BC__ET } /* bc=europeanterminator */, - { 0, 464, 3991, 2, 4, UNI_BRAI } /* isbrai */, - { 11, 7431, 1304, 27, 2, UNI_CCC__20 } /* canonicalcombiningclass=ccc20 */, - { 0, 581, 2094, 5, 2, UNI_CCC__202 } /* ccc=202 */, - { 0, 1102, 967, 4, 8, UNI_GUJR } /* scx=gujarati */, - { 0, 4355, 1335, 17, 9, UNI_OUGR } /* scriptextensions=olduyghur */, - { 0, 1879, 1571, 4, 10, UNI_INSAURASHTRA } /* blk=saurashtra */, - { 2, 2353, 3869, 3, 16, UNI_UCAS } /* incanadiansyllabics */, - { 1, 2485, 1465, 6, 5, UNI_XPOSIXSPACE } /* xposixspace */, - { 6, 464, 1792, 2, 4, UNI_MONG } /* ismong */, - { 1, 7132, 4641, 5, 15, UNI_SYRIACSUP } /* blk=syriacsupplement */, - { 24, 4355, 35, 17, 4, UNI_AVST } /* scriptextensions=avst */, - { 4, 3595, 4701, 8, 10, UNI_LATINEXTADDITIONAL } /* latinextadditional */, - { 0, 464, 940, 2, 6, UNI_COMPEX } /* iscompex */, - { 0, 464, 6303, 2, 23, UNI_COMPATJAMO } /* ishangulcompatibilityjamo */, - { 0, 240, 3438, 3, 12, UNI_ZANB } /* zanabazarsquare */, - { 1, 1879, 4442, 8, 9, UNI_KANAEXTB } /* blk=kanaextendedb */, - { 0, 5481, 588, 21, 2, UNI_CWCF } /* changeswhencasefolded=t */, - { 0, 4355, 1508, 17, 8, UNI_UGAR } /* scriptextensions=ugaritic */, - { 4, 7290, 0, 27, 0, UNI_OCR } /* opticalcharacterrecognition */, - { 5, 1377, 2961, 3, 7, UNI_WB__NU } /* wb=numeric */, - { 1, 2363, 5797, 10, 9, UNI_ETHIOPICEXTA } /* inethiopicextendeda */, - { 0, 4092, 0, 15, 0, UNI_DIACRITICALSEXT } /* diacriticalsext */, - { 1, 2310, 5620, 12, 3, -UNI_CI } /* caseignorable=n */, - { 0, 7825, 3929, 26, 4, UNI_CJKEXTG } /* cjkunifiedideographsextensiong */, - { 0, 464, 4783, 2, 10, UNI_XPOSIXSPACE } /* iswhitespace */, - { 0, 8533, 5080, 9, 7, UNI_SUPARROWSA } /* block=suparrowsa */, - { 0, 1702, 2760, 3, 9, UNI_XPOSIXALPHA } /* isalphabetic */, - { 2, 2726, 2384, 3, 2, UNI__PERL_SURROGATE } /* gc=cs */, - { 1, 6114, 1227, 3, 7, UNI_SC__MULT } /* sc=multani */, - { 7, 6039, 2591, 7, 12, UNI_MAYANNUMERALS } /* block=mayannumerals */, - { 0, 7208, 4598, 9, 16, UNI_PE } /* category=closepunctuation */, - { 0, 7018, 4442, 8, 9, UNI_ARABICEXTB } /* inarabicextendedb */, - { 4, 4355, 0, 17, 0, UNI_scx_values_index } /* scriptextensions= */, - { 0, 1846, 237, 3, 3, UNI_YI } /* isyiii */, - { 0, 1796, 1529, 7, 10, UNI_KHAR } /* script=kharoshthi */, - { 0, 23, 1104, 3, 2, UNI_ahex_values_index } /* ahex= */, - { 0, 296, 772, 3, 2, UNI_NV__17 } /* nv=17 */, - { 1, 4355, 1227, 17, 4, UNI_MULT } /* scriptextensions=mult */, - { 1, 939, 6390, 4, 2, UNI_ecomp_values_index } /* ecomp= */, - { 0, 464, 208, 2, 4, UNI_TFNG } /* istfng */, - { 8, 23, 602, 4, 3, -UNI_POSIXXDIGIT } /* ahex=no */, - { 6, 7431, 391, 27, 2, UNI_CCC__26 } /* canonicalcombiningclass=ccc26 */, - { 0, 2890, 2539, 3, 10, UNI_JT__U } /* jt=nonjoining */, - { 2, 1796, 847, 7, 7, UNI_LANA } /* script=taitham */, - { 1, 464, 27, 2, 4, UNI_AHOM } /* isahom */, - { 5, 19, 3362, 2, 3, UNI_AGE__2 } /* age=2 */, - { 5, 138, 122, 2, 2, UNI_MRO } /* mroo */, - { 2, 2678, 191, 3, 2, UNI_BC__WS } /* bc=ws */, - { 0, 7208, 4614, 9, 16, UNI_PF } /* category=finalpunctuation */, - { 2, 464, 2491, 2, 5, UNI_XPOSIXBLANK } /* isblank */, - { 4, 4355, 204, 17, 4, UNI_TAVT } /* scriptextensions=tavt */, - { 2, 2474, 3719, 3, 15, UNI_MISCMATHSYMBOLSA } /* ismiscmathsymbolsa */, - { 0, 2974, 292, 11, 2, UNI_IN__3 } /* presentin=v30 */, - { 3, 4355, 192, 17, 4, UNI_SHAW } /* scriptextensions=shaw */, - { 0, 721, 3582, 3, 3, UNI_KANGXI } /* kangxi */, - { 0, 464, 4656, 2, 16, UNI_TANGUTSUP } /* istangutsupplement */, - { 8, 1879, 4656, 4, 9, UNI_TANGUTSUP } /* blk=tangutsup */, - { 0, 4726, 0, 14, 0, UNI_NV__6 } /* numericvalue=6 */, - { 0, 3474, 4062, 6, 15, UNI_VEDICEXT } /* block=vedicextensions */, - { 0, 34, 6643, 1, 23, UNI_TRANSPORTANDMAP } /* istransportandmapsymbols */, - { 0, 1879, 6466, 4, 10, UNI_PUA } /* blk=privateuse */, - { 1, 2260, 560, 3, 3, UNI_IN__6 } /* in=6.0 */, - { 1, 275, 1591, 4, 2, UNI_LB__LF } /* gcb=lf */, - { 1, 3450, 1037, 12, 4, UNI_CYRILLICEXTB } /* blk=cyrillicextb */, - { 0, 1470, 0, 4, 0, UNI_BUGI } /* bugi */, - { 1, 666, 0, 5, 0, UNI_LIMB } /* limbu */, - { 3, 3474, 1003, 6, 6, UNI_INLEPCHA } /* block=lepcha */, - { 5, 4827, 0, 5, 0, UNI_BAMU } /* bamum */, - { 2, 3474, 8078, 6, 32, UNI_IDEOGRAPHICSYMBOLS } /* block=ideographicsymbolsandpunctuation */, - { 2, 1383, 602, 3, 2, -UNI_IDS } /* ids=n */, - { 0, 1102, 164, 4, 4, UNI_PHNX } /* scx=phnx */, - { 5, 1377, 10, 3, 2, UNI_LB__CR } /* wb=cr */, - { 4, 581, 392, 6, 1, UNI_CCC__R } /* ccc=226 */, - { 0, 464, 6069, 2, 22, UNI_DIACRITICALSFORSYMBOLS } /* isdiacriticalsforsymbols */, - { 16, 7584, 128, 18, 3, UNI_DT__MED } /* decompositiontype=med */, - { 1, 3351, 395, 13, 2, UNI_NV__41 } /* numericvalue=41 */, - { 0, 2153, 6199, 4, 5, UNI_NV__400000 } /* nv=400000 */, - { 0, 2274, 355, 10, 5, UNI_XIDC } /* xidcontinue=yes */, - { 0, 4355, 1052, 18, 7, UNI_MAHJ } /* scriptextensions=mahajani */, - { 16, 6114, 3991, 3, 7, UNI_BRAI } /* sc=braille */, - { 0, 6114, 7377, 3, 8, UNI_SC__KANA } /* sc=katakana */, - { 0, 7, 5305, 1, 17, UNI_TAIXUANJING } /* taixuanjingsymbols */, - { 8, 7823, 4341, 28, 4, UNI_CJKEXTA } /* incjkunifiedideographsextensiona */, - { 0, 5136, 2030, 5, 11, UNI_MATHALPHANUM } /* blk=mathalphanum */, - { 0, 1796, 1248, 7, 7, UNI_SIDD } /* script=siddham */, - { 0, 4302, 933, 5, 3, -UNI_XPOSIXSPACE } /* wspace=f */, - { 3, 343, 2002, 3, 3, UNI_CCC__BR } /* ccc=br */, - { 0, 296, 772, 3, 4, UNI_NV__17_SLASH_2 } /* nv=17/2 */, - { 4, 313, 901, 2, 8, UNI_INARMENIAN } /* inarmenian */, - { 2, 7201, 1899, 16, 6, UNI_S } /* generalcategory=symbol */, - { 17, 1927, 0, 12, 0, UNI_GONG } /* gunjalagondi */, - { 0, 5136, 1037, 11, 4, UNI_MYANMAREXTB } /* blk=myanmarextb */, - { 3, 409, 356, 3, 4, UNI_DIA } /* dia=yes */, - { 1, 3351, 293, 13, 1, UNI_NV__0 } /* numericvalue=0 */, + { 0, 2432, 2057, 3, 11, UNI_MATHALPHANUM } /* inmathalphanum */, + { 1, 7495, 1155, 27, 2, UNI_CCC__35 } /* canonicalcombiningclass=ccc35 */, + { 8, 2280, 342, 9, 3, UNI_IN__12 } /* presentin=12 */, + { 40, 2514, 8374, 3, 33, UNI_MISCPICTOGRAPHS } /* ismiscellaneoussymbolsandpictographs */, + { 0, 1728, 4659, 6, 9, UNI_ARABICEXTC } /* arabicextendedc */, + { 4, 2324, 1954, 6, 12, UNI_INGUNJALAGONDI } /* block=gunjalagondi */, + { 30, 302, 585, 5, 2, UNI__PERL_PATWS } /* patws=t */, + { 1, 5895, 8386, 14, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* issupplementalsymbolsandpictographs */, + { 8, 3407, 1805, 14, 4, UNI_NV__40000 } /* numericvalue=40000 */, + { 0, 1102, 3538, 4, 7, UNI_CPRT } /* scx=cypriot */, + { 0, 7752, 4741, 23, 5, UNI_JG__MANICHAEANALEPH } /* joininggroup=manichaeanaleph */, + { 0, 4424, 180, 17, 4, UNI_RUNR } /* scriptextensions=runr */, + { 0, 1823, 1438, 7, 10, UNI_CHRS } /* script=chorasmian */, + { 27, 1248, 0, 4, 0, UNI_PHAG } /* phag */, + { 0, 2002, 3100, 6, 6, UNI_POSIXDIGIT } /* isposixdigit */, + { 0, 3502, 2374, 12, 8, UNI_ETHIOPICEXT } /* blk=ethiopicextended */, + { 16, 1734, 5409, 3, 11, UNI_SMALLKANAEXT } /* issmallkanaext */, + { 16, 461, 204, 2, 4, UNI_TFNG } /* istfng */, + { 0, 292, 391, 3, 2, UNI_NV__34 } /* nv=34 */, + { 1, 3892, 585, 16, 2, UNI_STERM } /* sentenceterminal=t */, + { 37, 517, 1805, 4, 4, UNI_NV__70000 } /* nv=70000 */, + { 2, 292, 2138, 3, 9, UNI_NV__3_SLASH_16 } /* nv=1.875e-01 */, + { 0, 7892, 353, 16, 2, UNI_UIDEO } /* unifiedideograph=y */, + { 0, 1734, 5169, 7, 4, UNI_XPOSIXSPACE } /* isspaceperl */, + { 30, 2, 352, 1, 5, UNI_CE } /* ce=yes */, + { 3, 461, 1090, 2, 4, UNI_LINB } /* islinb */, + { 3, 4424, 748, 19, 5, UNI_MARC } /* scriptextensions=marchen */, + { 20, 2280, 2222, 9, 2, UNI_IN__6 } /* presentin=6 */, + { 2, 7267, 3026, 16, 2, UNI_PS } /* generalcategory=ps */, + { 9, 7591, 3472, 3, 3, UNI_LB__ZWJ } /* lb=zwj */, + { 0, 1133, 0, 4, 0, UNI_VITH } /* vith */, + { 8, 5637, 644, 20, 4, UNI_LB__H3 } /* graphemeclusterbreak=lvt */, + { 0, 71, 585, 3, 2, UNI_CWU } /* cwu=t */, + { 7, 6165, 5958, 3, 7, UNI_SC__SINH } /* sc=sinhala */, + { 0, 6427, 5084, 13, 6, UNI_JG__YUDHHE } /* joininggroup=yudhhe */, + { 0, 3490, 6193, 10, 12, UNI_CYRILLICSUP } /* blk=cyrillicsupplement */, + { 3, 4862, 0, 18, 0, UNI_RUMI } /* ruminumeralsymbols */, + { 1, 3391, 0, 15, 0, UNI_NV__23 } /* numericvalue=23 */, + { 0, 2, 933, 1, 7, -UNI_CE } /* ce=false */, + { 0, 2324, 668, 6, 5, UNI_INOGHAM } /* block=ogham */, + { 10, 4424, 2441, 17, 4, UNI_NAND } /* scriptextensions=nand */, + { 1, 0, 733, 1, 6, UNI_LINA } /* lineara */, + { 0, 377, 353, 3, 2, UNI_EXT } /* ext=y */, + { 1, 461, 1592, 2, 4, UNI_SAUR } /* issaur */, + { 4, 6165, 983, 3, 8, UNI_SC__HIRA } /* sc=hiragana */, + { 4, 309, 2780, 2, 6, UNI_INCOPTIC } /* incoptic */, + { 43, 184, 0, 4, 0, UNI_SAMR } /* samr */, + { 3, 2503, 0, 11, 0, UNI_JOINC } /* joincontrol */, + { 2, 3130, 1955, 5, 11, UNI_INGUNJALAGONDI } /* blk=gunjalagondi */, + { 0, 2324, 5125, 6, 19, UNI_OTTOMANSIYAQNUMBERS } /* block=ottomansiyaqnumbers */, + { 1, 3391, 1318, 13, 4, UNI_NV__2000 } /* numericvalue=2000 */, + { 0, 6776, 0, 11, 0, UNI_MTEI } /* meeteimayek */, + { 5, 7591, 277, 3, 2, UNI_LB__H2 } /* lb=h2 */, + { 1, 54, 1909, 2, 5, UNI_SC__KANA } /* sc=kana */, + { 6, 6165, 3538, 3, 7, UNI_SC__CPRT } /* sc=cypriot */, + { 2, 4371, 933, 5, 3, -UNI_XPOSIXSPACE } /* wspace=f */, + { 3, 6165, 39, 3, 4, UNI_BHKS } /* sc=bhks */, + { 0, 1823, 1262, 7, 4, UNI_SOYO } /* script=soyo */, + { 2, 11, 4987, 1, 9, UNI_ALCHEMICAL } /* alchemical */, + { 4, 4926, 0, 15, 0, UNI_TAMILSUP } /* tamilsupplement */, + { 9, 1391, 98, 3, 2, UNI_LB__HL } /* wb=hl */, + { 2, 2324, 1696, 6, 11, UNI_DOMINO } /* block=dominotiles */, + { 0, 2324, 4150, 6, 11, UNI_INPUNCTUATION } /* block=punctuation */, + { 10, 4651, 0, 8, 0, UNI_BOPO } /* bopomofo */, + { 2, 1667, 1914, 4, 8, UNI_UCASEXTA } /* blk=ucasexta */, + { 0, 3502, 8111, 5, 31, UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS } /* blk=egyptianhieroglyphformatcontrols */, + { 0, 6165, 653, 3, 5, UNI_SC__BUHD } /* sc=buhid */, + { 1, 2483, 599, 5, 2, -UNI_CASED } /* cased=n */, + { 2, 1102, 156, 4, 4, UNI_OUGR } /* scx=ougr */, + { 0, 1667, 2335, 4, 13, UNI_BLOCKELEMENTS } /* blk=blockelements */, + { 3, 1102, 3726, 3, 10, UNI_MLYM } /* scx=malayalam */, + { 7, 4424, 3026, 17, 14, UNI_PHLP } /* scriptextensions=psalterpahlavi */, + { 0, 1492, 5863, 7, 6, UNI_GEORGIANSUP } /* ingeorgiansup */, + { 0, 951, 956, 5, 3, UNI_DUPL } /* duployan */, + { 7, 461, 499, 2, 6, UNI_LYDI } /* islydian */, + { 1, 1823, 794, 7, 4, UNI_LANA } /* script=lana */, + { 0, 1667, 204, 9, 2, UNI_CJKEXTF } /* blk=cjkextf */, + { 0, 5156, 3001, 10, 7, UNI_WB__NU } /* wordbreak=numeric */, + { 3, 3378, 599, 13, 3, UNI_DT__CAN } /* nfdquickcheck=no */, + { 2, 2324, 5373, 6, 11, UNI_TAIXUANJING } /* block=taixuanjing */, + { 5, 1667, 7796, 4, 22, UNI_ENCLOSEDIDEOGRAPHICSUP } /* blk=enclosedideographicsup */, + { 20, 1823, 668, 7, 5, UNI_OGAM } /* script=ogham */, + { 0, 2324, 7855, 6, 32, UNI_INIDC } /* block=ideographicdescriptioncharacters */, + { 0, 505, 353, 5, 4, UNI_NFDQC__Y } /* nfdqc=yes */, + { 2, 2301, 5671, 10, 4, -UNI_XIDC } /* xidcontinue=no */, + { 0, 4360, 2977, 10, 11, UNI_LB__IN } /* linebreak=inseperable */, + { 4, 4795, 2107, 14, 8, UNI_NV__13_SLASH_2 } /* numericvalue=6.500e+00 */, + { 1, 1667, 3436, 4, 15, UNI_SARB } /* blk=oldsoutharabian */, + { 3, 3635, 0, 14, 0, UNI_LATINEXTD } /* latinextendedd */, + { 34, 292, 2101, 3, 2, UNI_NV__29 } /* nv=29 */, + { 0, 1726, 1037, 8, 4, UNI_ARABICEXTB } /* isarabicextb */, + { 0, 1667, 6382, 7, 18, UNI_CJKCOMPATFORMS } /* blk=cjkcompatibilityforms */, + { 4, 895, 295, 5, 2, UNI_AGE__9 } /* age=v90 */, + { 12, 3863, 2172, 14, 8, UNI_NV__7_SLASH_8 } /* numericvalue=8.750e-01 */, + { 0, 302, 1814, 2, 9, UNI_HMNG } /* pahawhhmong */, + { 0, 4424, 3908, 17, 6, UNI_TANG } /* scriptextensions=tangut */, + { 1, 309, 6351, 2, 23, UNI_COMPATJAMO } /* inhangulcompatibilityjamo */, + { 9, 461, 7724, 2, 17, UNI_VS } /* isvariationselector */, + { 1, 1102, 1191, 4, 7, UNI_BENG } /* scx=bengali */, + { 1, 4043, 274, 17, 1, UNI_idsb_values_index } /* idsbinaryoperator= */, + { 0, 1102, 772, 4, 7, UNI_OLCK } /* scx=olchiki */, + { 0, 3817, 2083, 14, 8, UNI_NV__1_SLASH_9 } /* numericvalue=1.111e-01 */, + { 3, 3014, 396, 11, 2, UNI_IN__6_DOT_1 } /* presentin=v61 */, + { 1, 1667, 3663, 4, 13, UNI_DEVANAGARIEXT } /* blk=devanagariext */, + { 39, 2002, 1659, 3, 8, UNI_POSIXSPACE } /* isperlspace */, + { 2, 1667, 5958, 4, 7, UNI_INSINHALA } /* blk=sinhala */, + { 1, 597, 0, 3, 0, UNI_dt_values_index } /* dt= */, + { 0, 124, 0, 4, 0, UNI_LATN } /* latn */, + { 0, 2324, 3611, 9, 11, UNI_CJKCOMPATFORMS } /* block=cjkcompatforms */, + { 2, 2287, 0, 5, 0, UNI_IN__14 } /* in=14 */, + { 3, 8343, 0, 22, 0, UNI_insc_values_index } /* indicsyllabiccategory= */, + { 1, 6841, 934, 25, 6, -UNI_DI } /* defaultignorablecodepoint=false */, + { 0, 1102, 176, 4, 4, UNI_ROHG } /* scx=rohg */, + { 10, 6165, 86, 3, 4, UNI_SC__GREK } /* sc=grek */, + { 2, 5255, 599, 20, 2, -UNI_EXTPICT } /* extendedpictographic=n */, + { 1, 8601, 8386, 18, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* block=supplementalsymbolsandpictographs */, + { 0, 6165, 668, 3, 5, UNI_OGAM } /* sc=ogham */, + { 0, 5937, 0, 21, 0, UNI__PERL_NCHAR } /* noncharactercodepoint */, + { 2, 4424, 608, 17, 4, UNI_ELBA } /* scriptextensions=elba */, + { 1, 4424, 426, 17, 3, UNI_MRO } /* scriptextensions=mro */, + { 16, 4424, 474, 17, 3, UNI_VAI } /* scriptextensions=vai */, + { 0, 3093, 2931, 12, 3, UNI_POSIXXDIGIT } /* asciihexdigit=t */, + { 0, 4970, 599, 17, 3, -UNI_EBASE } /* emojimodifierbase=no */, + { 33, 510, 6263, 4, 8, UNI_NV__1_SLASH_320 } /* nv=3.125e-03 */, + { 1, 7804, 353, 11, 4, UNI_IDEO } /* ideographic=yes */, + { 1, 51, 0, 4, 0, UNI_CANS } /* cans */, + { 0, 1102, 2009, 4, 6, UNI_SYRC } /* scx=syriac */, + { 4, 7887, 5252, 28, 4, UNI_CJKEXTE } /* incjkunifiedideographsextensione */, + { 1, 271, 644, 3, 4, UNI_LB__H3 } /* gcb=lvt */, + { 0, 6090, 2057, 7, 11, UNI_MATHALPHANUM } /* block=mathalphanum */, + { 21, 7591, 524, 3, 2, UNI_LB__SY } /* lb=sy */, + { 7, 5799, 0, 21, 0, UNI_SUPARROWSB } /* insupplementalarrowsb */, + { 0, 4951, 6473, 18, 14, UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS } /* egyptianhieroglyphformatcontrols */, + { 0, 461, 4651, 2, 11, UNI_BOPOMOFOEXT } /* isbopomofoext */, + { 4, 4424, 3663, 17, 4, UNI_DEVA } /* scriptextensions=deva */, + { 0, 5168, 2304, 15, 8, UNI__PERL_CHARNAME_CONTINUE } /* _perl_charname_continue */, + { 1, 2020, 5354, 3, 19, UNI_ININSCRIPTIONALPAHLAVI } /* ininscriptionalpahlavi */, + { 0, 925, 0, 8, 0, UNI_BPT__O } /* bpt=open */, + { 32, 2280, 2155, 10, 3, UNI_IN__3_DOT_1 } /* presentin=3.1 */, + { 0, 7669, 1874, 22, 8, UNI_LB__H3 } /* hangulsyllabletype=lvtsyllable */, + { 32, 2002, 2060, 7, 5, UNI_POSIXALPHA } /* isposixalpha */, + { 18, 30, 1106, 1, 3, UNI_ITAL } /* ital */, + { 0, 10, 0, 1, 0, UNI_M } /* m */, + { 0, 6427, 1279, 13, 6, UNI_JG__LAMADH } /* joininggroup=lamadh */, + { 1, 6450, 283, 14, 2, UNI_SB__NU } /* sentencebreak=nu */, + { 8, 7274, 255, 9, 2, UNI_CF } /* category=cf */, + { 7, 1272, 7972, 3, 15, UNI_CUNEIFORMNUMBERS } /* iscuneiformnumbers */, + { 12, 1915, 6848, 4, 9, UNI_CI } /* caseignorable */, + { 10, 4424, 4060, 17, 4, UNI_BRAI } /* scriptextensions=brai */, + { 10, 4424, 196, 17, 4, UNI_TAML } /* scriptextensions=taml */, + { 9, 6165, 3325, 3, 4, UNI_HEBR } /* sc=hebr */, + { 13, 1075, 1805, 4, 4, UNI_NV__20000 } /* nv=20000 */, + { 2, 6165, 4060, 3, 7, UNI_BRAI } /* sc=braille */, + { 0, 33, 4710, 1, 15, UNI_SYRIACSUP } /* syriacsupplement */, + { 0, 6165, 6642, 3, 4, UNI_BRAH } /* sc=brah */, + { 1, 7383, 5479, 10, 18, UNI_BC__ET } /* bidiclass=europeanterminator */, + { 1, 2766, 4206, 3, 15, UNI_PS } /* gc=openpunctuation */, + { 5, 7752, 109, 24, 2, UNI_JG__MANICHAEANTAW } /* joininggroup=manichaeantaw */, + { 3, 5682, 0, 5, 0, UNI_GREK } /* greek */, + { 0, 4360, 6224, 10, 12, UNI_LB__SY } /* linebreak=breaksymbols */, + { 20, 605, 8144, 2, 16, UNI_IDEOGRAPHICSYMBOLS } /* ideographicsymbols */, + { 1, 517, 1314, 4, 3, UNI_NV__7000 } /* nv=7000 */, + { 0, 309, 983, 2, 8, UNI_INHIRAGANA } /* inhiragana */, + { 2, 1667, 4537, 5, 17, UNI_COPTICEPACTNUMBERS } /* blk=copticepactnumbers */, + { 0, 2324, 1543, 6, 10, UNI_INKHAROSHTHI } /* block=kharoshthi */, + { 4, 718, 3622, 3, 11, UNI_KANGXI } /* kangxiradicals */, + { 1, 1391, 6, 3, 2, UNI_LB__CR } /* wb=cr */, + { 8, 4424, 4176, 17, 6, UNI_HANG } /* scriptextensions=hangul */, + { 3, 461, 363, 2, 2, UNI_SM } /* issm */, + { 0, 7011, 1153, 24, 2, UNI_CCC__24 } /* canonicalcombiningclass=24 */, + { 18, 33, 8001, 1, 29, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* symbolsandpictographsextendeda */, + { 0, 461, 779, 2, 7, UNI_OSMA } /* isosmanya */, + { 8, 1227, 0, 7, 0, UNI_MAKA } /* makasar */, + { 0, 1102, 3908, 4, 6, UNI_TANG } /* scx=tangut */, + { 0, 895, 343, 5, 3, UNI_AGE__12_DOT_1 } /* age=v121 */, + { 3, 2766, 5235, 3, 20, UNI_PC } /* gc=connectorpunctuation */, + { 40, 1102, 1975, 4, 10, UNI_SOGO } /* scx=oldsogdian */, + { 0, 7214, 559, 25, 2, UNI_CCC__107 } /* canonicalcombiningclass=107 */, + { 10, 27, 29, 2, 2, UNI_ARMI } /* armi */, + { 17, 7267, 644, 15, 2, UNI_L } /* generalcategory=l */, + { 1, 461, 3013, 2, 5, UNI_EPRES } /* isepres */, + { 1, 6076, 3639, 13, 9, UNI_GEORGIANEXT } /* block=georgianextended */, + { 0, 309, 7796, 2, 29, UNI_ENCLOSEDIDEOGRAPHICSUP } /* inenclosedideographicsupplement */, + { 1, 2324, 1255, 6, 7, UNI_INSIDDHAM } /* block=siddham */, + { 5, 1198, 7972, 3, 29, UNI_CUNEIFORMNUMBERS } /* incuneiformnumbersandpunctuation */, + { 2, 2301, 0, 11, 0, UNI_XIDC } /* xidcontinue */, + { 3, 309, 3649, 2, 14, UNI_PHONETICEXTSUP } /* inphoneticextsup */, + { 0, 1102, 615, 4, 4, UNI_ELYM } /* scx=elym */, + { 3, 6165, 180, 3, 4, UNI_RUNR } /* sc=runr */, + { 0, 2766, 128, 3, 2, UNI_ME } /* gc=me */, + { 1, 418, 0, 4, 0, UNI_KHMR } /* khmr */, + { 10, 7274, 2424, 9, 2, UNI__PERL_SURROGATE } /* category=cs */, + { 10, 3514, 6193, 10, 12, UNI_ARABICSUP } /* block=arabicsupplement */, + { 11, 4584, 599, 18, 2, -UNI_IDST } /* idstrinaryoperator=n */, + { 2, 1823, 27, 7, 4, UNI_ARMI } /* script=armi */, + { 1, 7591, 2977, 3, 11, UNI_LB__IN } /* lb=inseperable */, + { 0, 5255, 934, 20, 6, -UNI_EXTPICT } /* extendedpictographic=false */, + { 0, 339, 1317, 5, 2, UNI_CCC__132 } /* ccc=132 */, + { 2, 2536, 6439, 2, 11, UNI_JG__AFRICANQAF } /* jg=africanqaf */, + { 10, 2060, 1175, 4, 2, UNI_alpha_values_index } /* alpha= */, + { 0, 4424, 1003, 17, 6, UNI_LEPC } /* scriptextensions=lepcha */, + { 32, 6165, 144, 3, 4, UNI_NEWA } /* sc=newa */, + { 40, 3878, 1314, 14, 2, UNI_NV__900 } /* numericvalue=900 */, + { 1, 461, 4896, 2, 15, UNI_BAMUMSUP } /* isbamumsupplement */, + { 0, 3832, 2107, 14, 8, UNI_NV__11_SLASH_2 } /* numericvalue=5.500e+00 */, + { 2, 4424, 1367, 17, 9, UNI_PAUC } /* scriptextensions=paucinhau */, + { 1, 6165, 1051, 3, 8, UNI_SC__MAHJ } /* sc=mahajani */, + { 2, 7495, 1153, 27, 2, UNI_CCC__24 } /* canonicalcombiningclass=ccc24 */, + { 1, 461, 1322, 2, 9, UNI_ITAL } /* isolditalic */, + { 4, 6062, 1505, 14, 4, UNI_ETHIOPICEXTA } /* block=ethiopicexta */, + { 1, 30, 4969, 1, 18, UNI_EBASE } /* isemojimodifierbase */, + { 1, 1200, 1037, 3, 4, UNI_CJKEXTB } /* cjkextb */, + { 14, 2536, 710, 3, 4, UNI_JG__SHIN } /* jg=shin */, + { 6, 7889, 0, 20, 0, UNI_CJK } /* cjkunifiedideographs */, + { 8, 309, 6776, 2, 21, UNI_MEETEIMAYEKEXT } /* inmeeteimayekextensions */, + { 0, 7036, 0, 26, 0, UNI_HALFANDFULLFORMS } /* halfwidthandfullwidthforms */, + { 1, 3633, 5848, 7, 9, UNI_LATINEXTA } /* inlatinextendeda */, + { 0, 7724, 585, 17, 2, UNI_VS } /* variationselector=t */, + { 64, 6090, 6597, 7, 21, UNI_MISCTECHNICAL } /* block=miscellaneoustechnical */, + { 18, 4360, 2930, 10, 2, UNI_GCB__T } /* linebreak=jt */, + { 0, 4424, 527, 17, 6, UNI_RJNG } /* scriptextensions=rejang */, + { 9, 3817, 520, 15, 1, UNI_NV__1_SLASH_7 } /* numericvalue=1/7 */, + { 12, 875, 599, 5, 3, -UNI_UIDEO } /* uideo=no */, + { 2, 2301, 3401, 9, 3, UNI_xidc_values_index } /* xidcontinue= */, + { 4, 2324, 678, 6, 5, UNI_INRUNIC } /* block=runic */, + { 0, 442, 0, 4, 0, UNI_ORKH } /* orkh */, + { 3, 7495, 343, 27, 2, UNI_CCC__12 } /* canonicalcombiningclass=ccc12 */, + { 12, 30, 1561, 1, 2, UNI_N } /* isn */, + { 1, 4360, 2991, 10, 2, UNI_LB__QU } /* linebreak=qu */, + { 1, 1102, 1133, 4, 4, UNI_VITH } /* scx=vith */, + { 0, 3490, 0, 12, 0, UNI_INCYRILLIC } /* blk=cyrillic */, + { 2, 1853, 298, 9, 2, UNI_SYLO } /* sylotinagri */, + { 0, 2232, 2107, 4, 8, UNI_NV__17_SLASH_2 } /* nv=8.500e+00 */, + { 34, 2732, 5676, 5, 18, UNI_ANCIENTGREEKNUMBERS } /* blk=ancientgreeknumbers */, + { 4, 6165, 6154, 3, 9, UNI_XSUX } /* sc=cuneiform */, + { 0, 4424, 1635, 17, 10, UNI_WARA } /* scriptextensions=warangciti */, + { 0, 2302, 0, 3, 0, UNI_IDC } /* idc */, + { 0, 1667, 6510, 4, 24, UNI_HIGHPUSURROGATES } /* blk=highprivateusesurrogates */, + { 2, 6866, 585, 24, 2, UNI_COMPEX } /* fullcompositionexclusion=t */, + { 0, 461, 1082, 2, 4, UNI_XPOSIXWORD } /* isword */, + { 4, 1823, 663, 7, 4, UNI_SC__LIMB } /* script=limb */, + { 0, 823, 585, 4, 2, UNI_DASH } /* dash=t */, + { 0, 461, 261, 2, 5, UNI_CWKCF } /* iscwkcf */, + { 1, 2232, 1805, 4, 4, UNI_NV__80000 } /* nv=80000 */, + { 1, 1667, 7796, 4, 29, UNI_ENCLOSEDIDEOGRAPHICSUP } /* blk=enclosedideographicsupplement */, + { 4, 1102, 991, 4, 4, UNI_HATR } /* scx=hatr */, + { 4, 2665, 1104, 12, 3, UNI_PATSYN } /* patternsyntax=t */, + { 0, 1243, 4504, 4, 16, UNI_LATINEXTB } /* block=latinextendedb */, + { 0, 2685, 2083, 4, 2, UNI_IN__5_DOT_1 } /* in=5.1 */, + { 0, 4360, 2589, 10, 10, UNI_LB__BA } /* linebreak=breakafter */, + { 0, 4519, 3642, 16, 7, UNI_CYRILLICEXTD } /* block=cyrillicextendedd */, + { 0, 1102, 458, 4, 4, UNI_QAAI } /* scx=qaai */, + { 0, 1823, 983, 7, 8, UNI_SC__HIRA } /* script=hiragana */, + { 0, 1572, 0, 10, 0, UNI_XPEO } /* oldpersian */, + { 31, 1741, 1479, 6, 5, UNI_VERTSPACE } /* isvertspace */, + { 0, 309, 2335, 2, 13, UNI_BLOCKELEMENTS } /* inblockelements */, + { 9, 1667, 5031, 4, 14, UNI_INHANIFIROHINGYA } /* blk=hanifirohingya */, + { 7, 1823, 216, 7, 4, UNI_TOTO } /* script=toto */, + { 0, 2766, 8, 3, 2, UNI_PC } /* gc=pc */, + { 1, 4090, 0, 17, 0, UNI_INDICSIYAQNUMBERS } /* indicsiyaqnumbers */, + { 0, 2718, 3706, 3, 14, UNI_BC__NSM } /* bc=nonspacingmark */, + { 1, 1198, 6357, 5, 13, UNI_CJKCOMPAT } /* incjkcompatibility */, + { 2, 6816, 585, 25, 2, UNI_CWKCF } /* changeswhennfkccasefolded=t */, + { 0, 4424, 164, 17, 4, UNI_PHNX } /* scriptextensions=phnx */, + { 0, 20, 585, 3, 5, UNI_XPOSIXXDIGIT } /* hex=true */, + { 1, 578, 1153, 5, 2, UNI_CCC__L } /* ccc=224 */, + { 0, 30, 1882, 1, 6, UNI_BIDIC } /* isbidic */, + { 2, 309, 6776, 2, 11, UNI_INMEETEIMAYEK } /* inmeeteimayek */, + { 16, 309, 1294, 2, 9, UNI_INNABATAEAN } /* innabataean */, + { 0, 7267, 248, 16, 5, UNI_XPOSIXCNTRL } /* generalcategory=cntrl */, + { 1, 6866, 934, 24, 6, -UNI_COMPEX } /* fullcompositionexclusion=false */, + { 9, 461, 4683, 2, 16, UNI_PF } /* isfinalpunctuation */, + { 4, 4845, 5671, 16, 4, -UNI__PERL_PATWS } /* patternwhitespace=no */, + { 8, 2018, 2720, 11, 2, UNI_JT__R } /* joiningtype=r */, + { 0, 6165, 3908, 3, 6, UNI_TANG } /* sc=tangut */, + { 2, 4360, 928, 9, 3, UNI_LB__OP } /* linebreak=op */, + { 1, 2536, 5084, 3, 6, UNI_JG__YUDHHE } /* jg=yudhhe */, + { 0, 461, 6677, 2, 14, UNI_LM } /* ismodifierletter */, + { 3, 2665, 0, 13, 0, UNI_PATSYN } /* patternsyntax */, + { 4, 663, 0, 5, 0, UNI_LIMB } /* limbu */, + { 0, 5065, 4756, 13, 5, UNI_JG__MANICHAEANZAYIN } /* jg=manichaeanzayin */, + { 33, 1102, 746, 4, 4, UNI_MARC } /* scx=marc */, + { 0, 3677, 4659, 7, 9, UNI_LATINEXTC } /* islatinextendedc */, + { 0, 887, 549, 5, 3, UNI_AGE__14 } /* age=14.0 */, + { 0, 1667, 5274, 4, 18, UNI_HALFMARKS } /* blk=combininghalfmarks */, + { 1, 2503, 599, 5, 3, -UNI_JOINC } /* joinc=no */, + { 11, 1102, 333, 4, 4, UNI_CARI } /* scx=cari */, + { 0, 2302, 599, 3, 3, -UNI_IDC } /* idc=no */, + { 4, 2930, 2908, 3, 11, UNI_JT__C } /* jt=joincausing */, + { 1, 7274, 252, 9, 2, UNI_CASEDLETTER } /* category=lc */, + { 16, 6090, 1235, 7, 6, UNI_INMULTANI } /* block=multani */, + { 35, 7752, 4751, 23, 5, UNI_JG__MANICHAEANSADHE } /* joininggroup=manichaeansadhe */, + { 6, 2280, 549, 10, 3, UNI_IN__4 } /* presentin=4.0 */, + { 1, 1823, 688, 7, 5, UNI_BATK } /* script=batak */, + { 3, 2536, 118, 3, 3, UNI_JG__DAL } /* jg=dal */, + { 9, 30, 3435, 1, 16, UNI_SARB } /* inoldsoutharabian */, + { 0, 7591, 3634, 3, 2, UNI_LB__NL } /* lb=nl */, + { 1, 2324, 1003, 6, 6, UNI_INLEPCHA } /* block=lepcha */, + { 14, 510, 346, 4, 1, UNI_NV__38 } /* nv=38 */, + { 0, 7011, 8648, 24, 10, UNI_CCC__AR } /* canonicalcombiningclass=aboveright */, + { 0, 1272, 3938, 3, 16, UNI_UCAS } /* iscanadiansyllabics */, + { 11, 2536, 706, 3, 4, UNI_JG__SEEN } /* jg=seen */, + { 0, 533, 325, 3, 2, UNI_SB__UP } /* sb=up */, + { 2, 7591, 700, 3, 2, UNI_EMOD } /* lb=em */, + { 0, 5799, 8386, 5, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* insupsymbolsandpictographs */, + { 19, 4, 352, 2, 3, UNI_LOE } /* loe=y */, + { 10, 2324, 6576, 7, 21, UNI_INDICNUMBERFORMS } /* block=commonindicnumberforms */, + { 35, 2432, 747, 3, 6, UNI_INMARCHEN } /* inmarchen */, + { 7, 1823, 188, 7, 4, UNI_SGNW } /* script=sgnw */, + { 1, 10, 2422, 1, 10, UNI_MISCSYMBOLS } /* miscsymbols */, + { 55, 1906, 1544, 5, 9, UNI_INKHAROSHTHI } /* blk=kharoshthi */, + { 1, 461, 474, 2, 3, UNI_VAI } /* isvai */, + { 20, 461, 6464, 2, 23, UNI_SHORTHANDFORMATCONTROLS } /* isshorthandformatcontrols */, + { 2, 533, 1612, 3, 2, UNI_LB__LF } /* sb=lf */, + { 0, 1102, 1098, 4, 4, UNI_NSHU } /* scx=nshu */, + { 0, 1397, 353, 3, 4, UNI_IDS } /* ids=yes */, + { 36, 7591, 53, 3, 2, UNI_LB__NS } /* lb=ns */, + { 0, 7274, 1478, 9, 2, UNI_ZS } /* category=zs */, + { 0, 32, 599, 2, 3, -UNI_VS } /* vs=no */, + { 0, 271, 535, 2, 2, UNI_S } /* gc=s */, + { 0, 7084, 1505, 8, 4, UNI_ARABICEXTA } /* inarabicexta */, + { 0, 4584, 0, 18, 0, UNI_IDST } /* idstrinaryoperator */, + { 4, 1823, 3505, 6, 5, UNI_ETHI } /* script=ethi */, + { 4, 7274, 2004, 9, 2, UNI_PO } /* category=po */, + { 17, 192, 18, 3, 1, UNI_TAGB } /* tagb */, + { 2, 2536, 1041, 3, 5, UNI_JG__GAMAL } /* jg=gamal */, + { 0, 78, 0, 4, 0, UNI_DSRT } /* dsrt */, + { 39, 4970, 353, 13, 4, UNI_EMOD } /* emojimodifier=yes */, + { 1, 339, 3405, 4, 2, UNI_CCC__36 } /* ccc=36 */, + { 6, 2525, 1942, 6, 5, UNI_XPOSIXGRAPH } /* xposixgraph */, + { 0, 1033, 0, 4, 0, UNI_JAMO } /* jamo */, + { 0, 4525, 192, 10, 2, UNI_CYRILLICEXTA } /* cyrillicexta */, + { 20, 1667, 854, 4, 7, UNI_INTAIVIET } /* blk=taiviet */, + { 0, 1396, 934, 8, 2, -UNI_XIDS } /* xidstart=f */, + { 1, 1823, 102, 7, 4, UNI_HMNG } /* script=hmng */, + { 0, 461, 3663, 2, 10, UNI_DEVA } /* isdevanagari */, + { 0, 1728, 3790, 5, 5, UNI_ARABICMATH } /* arabicmath */, + { 1, 876, 585, 4, 2, UNI_IDEO } /* ideo=t */, + { 4, 7011, 2165, 25, 2, UNI_CCC__DB } /* canonicalcombiningclass=233 */, + { 1, 461, 333, 2, 4, UNI_CARI } /* iscari */, + { 1, 3177, 140, 15, 2, UNI_EA__NA } /* eastasianwidth=na */, + { 1, 309, 4176, 2, 6, UNI_INHANGUL } /* inhangul */, + { 24, 739, 0, 7, 0, UNI_MAND } /* mandaic */, + { 1, 7889, 4218, 26, 4, UNI_CJKEXTH } /* cjkunifiedideographsextensionh */, + { 0, 2718, 0, 4, 0, UNI_BC__R } /* bc=r */, + { 0, 1065, 288, 4, 1, UNI_NV__13 } /* nv=13 */, + { 3, 4970, 584, 16, 6, UNI_EBASE } /* emojimodifierbase=true */, + { 26, 1198, 3163, 3, 14, UNI_CONTROLPICTURES } /* incontrolpictures */, + { 0, 2348, 352, 12, 3, UNI_CI } /* caseignorable=y */, + { 38, 4424, 6776, 17, 11, UNI_MTEI } /* scriptextensions=meeteimayek */, + { 2, 257, 353, 4, 2, UNI_CWCM } /* cwcm=y */, + { 0, 271, 599, 2, 3, UNI_NO } /* gc=no */, + { 12, 533, 1613, 3, 2, UNI_SB__FO } /* sb=fo */, + { 0, 6165, 847, 3, 7, UNI_LANA } /* sc=taitham */, + { 16, 2324, 1051, 6, 8, UNI_INMAHAJANI } /* block=mahajani */, + { 13, 4391, 520, 14, 1, UNI_NV__37 } /* numericvalue=37 */, + { 0, 53, 35, 1, 3, UNI_NBAT } /* nbat */, + { 1, 1823, 414, 7, 4, UNI_SC__HANO } /* script=hano */, + { 0, 4424, 1334, 17, 4, UNI_PERM } /* scriptextensions=perm */, + { 13, 4852, 5671, 9, 4, -UNI_XPOSIXSPACE } /* whitespace=no */, + { 0, 3204, 599, 14, 3, -UNI_GREXT } /* graphemeextend=no */, + { 4, 5156, 2487, 12, 7, UNI_WB__ML } /* wordbreak=midletter */, + { 1, 4424, 98, 17, 4, UNI_HLUW } /* scriptextensions=hluw */, + { 3, 2424, 0, 2, 0, UNI__PERL_SURROGATE } /* cs */, + { 0, 4360, 92, 12, 1, UNI_LB__ZWJ } /* linebreak=zwj */, + { 1, 6427, 710, 13, 4, UNI_JG__SHIN } /* joininggroup=shin */, + { 1, 3013, 353, 5, 4, UNI_EPRES } /* epres=yes */, + { 74, 1102, 810, 4, 4, UNI_SYRC } /* scx=syrc */, + { 0, 916, 5671, 4, 3, -UNI_EBASE } /* ebase=n */, + { 2, 461, 1227, 2, 4, UNI_MAKA } /* ismaka */, + { 0, 2, 5671, 1, 4, -UNI_CE } /* ce=no */, + { 1, 7267, 2424, 16, 2, UNI__PERL_SURROGATE } /* generalcategory=cs */, + { 0, 2832, 6193, 8, 5, UNI_CYRILLICSUP } /* iscyrillicsup */, + { 12, 6986, 0, 25, 0, UNI_SYMBOLSFORLEGACYCOMPUTING } /* symbolsforlegacycomputing */, + { 0, 4970, 353, 13, 2, UNI_EMOD } /* emojimodifier=y */, + { 9, 1397, 353, 4, 2, UNI_IDST } /* idst=y */, + { 14, 3391, 2657, 14, 8, UNI_NV__1_SLASH_5 } /* numericvalue=2.000e-01 */, + { 64, 2393, 0, 8, 0, UNI_CYRL } /* cyrillic */, + { 3, 2280, 0, 10, 0, UNI_in_values_index } /* presentin= */, + { 10, 2752, 934, 14, 6, -UNI_ECOMP } /* emojicomponent=false */, + { 7, 54, 3505, 2, 9, UNI_ETHI } /* sc=ethiopic */, + { 2, 916, 584, 4, 6, UNI_EBASE } /* ebase=true */, + { 34, 1391, 3463, 3, 12, UNI_WB__EB } /* wb=glueafterzwj */, + { 1, 1823, 1465, 7, 10, UNI_DIAK } /* script=divesakuru */, + { 0, 2393, 4511, 8, 9, UNI_CYRILLICEXTB } /* cyrillicextendedb */, + { 5, 4852, 584, 9, 3, UNI_XPOSIXSPACE } /* whitespace=t */, + { 13, 6427, 3726, 12, 14, UNI_JG__MALAYALAMNNNA } /* joininggroup=malayalamnnna */, + { 0, 7591, 279, 3, 2, UNI_GCB__L } /* lb=jl */, + { 4, 840, 0, 7, 0, UNI_TGLG } /* tagalog */, + { 0, 6165, 663, 3, 4, UNI_SC__LIMB } /* sc=limb */, + { 0, 609, 4369, 2, 3, UNI_LB__ZW } /* lb=zw */, + { 0, 7537, 599, 10, 2, -UNI_XPOSIXALPHA } /* alphabetic=n */, + { 0, 1823, 3505, 6, 9, UNI_ETHI } /* script=ethiopic */, + { 0, 1823, 1834, 7, 4, UNI_SORA } /* script=sora */, + { 2, 1543, 0, 10, 0, UNI_KHAR } /* kharoshthi */, + { 0, 20, 353, 3, 4, UNI_XPOSIXXDIGIT } /* hex=yes */, + { 0, 1823, 5353, 7, 20, UNI_PHLI } /* script=inscriptionalpahlavi */, + { 1, 1221, 5848, 6, 9, UNI_KANAEXTA } /* inkanaextendeda */, + { 0, 875, 353, 5, 2, UNI_UIDEO } /* uideo=y */, + { 0, 2852, 0, 4, 0, UNI_MAHJ } /* mahj */, + { 1, 3014, 392, 11, 2, UNI_IN__4_DOT_1 } /* presentin=v41 */, + { 3, 6450, 21, 14, 2, UNI_SB__EX } /* sentencebreak=ex */, + { 1, 7887, 4410, 28, 4, UNI_CJKEXTA } /* incjkunifiedideographsextensiona */, + { 0, 3817, 395, 15, 2, UNI_NV__1_SLASH_16 } /* numericvalue=1/16 */, + { 13, 5274, 5283, 9, 9, UNI_HALFMARKS } /* combininghalfmarks */, + { 0, 461, 51, 2, 4, UNI_CANS } /* iscans */, + { 0, 1823, 5067, 6, 11, UNI_SC__MANI } /* script=manichaean */, + { 2, 895, 1317, 5, 2, UNI_AGE__3_DOT_2 } /* age=v32 */, + { 0, 339, 8203, 4, 11, UNI_CCC__DB } /* ccc=doublebelow */, + { 1, 6427, 0, 23, 0, UNI_JG__AFRICANQAF } /* joininggroup=africanqaf */, + { 1, 7011, 3405, 24, 2, UNI_CCC__36 } /* canonicalcombiningclass=36 */, + { 0, 309, 7356, 2, 27, UNI_OCR } /* inopticalcharacterrecognition */, + { 12, 92, 643, 1, 3, UNI_JT__L } /* jt=l */, + { 0, 6165, 4896, 3, 5, UNI_BAMU } /* sc=bamum */, + { 0, 8246, 2720, 23, 6, UNI_INPC__RIGHT } /* indicpositionalcategory=right */, + { 1, 2988, 5164, 12, 3, UNI_NFCQC__M } /* nfcquickcheck=m */, + { 0, 5156, 21, 10, 2, UNI_WB__EX } /* wordbreak=ex */, + { 3, 3878, 0, 14, 0, UNI_NV__9 } /* numericvalue=9 */, + { 2, 1823, 148, 7, 4, UNI_SC__ORYA } /* script=orya */, + { 0, 1102, 4176, 4, 4, UNI_HANG } /* scx=hang */, + { 2, 6165, 4176, 3, 4, UNI_SC__HANG } /* sc=hang */, + { 0, 876, 585, 4, 5, UNI_IDEO } /* ideo=true */, + { 0, 1191, 0, 7, 0, UNI_BENG } /* bengali */, + { 0, 895, 1318, 5, 2, UNI_AGE__2 } /* age=v20 */, + { 0, 461, 1255, 2, 7, UNI_SIDD } /* issiddham */, + { 0, 2324, 2244, 6, 12, UNI_INOLDHUNGARIAN } /* block=oldhungarian */, + { 0, 7267, 1887, 16, 7, UNI_XPOSIXCNTRL } /* generalcategory=control */, + { 2, 4161, 599, 9, 3, -UNI_DIA } /* diacritic=no */, + { 0, 1397, 353, 7, 4, UNI_IDS } /* idstart=yes */, + { 36, 309, 317, 2, 5, UNI_INTAILE } /* intaile */, + { 19, 2324, 398, 6, 4, UNI_INMIAO } /* block=miao */, + { 1, 1823, 6185, 7, 4, UNI_SC__GLAG } /* script=glag */, + { 12, 1409, 1037, 5, 4, UNI_LATINEXTB } /* latinextb */, + { 0, 2411, 0, 8, 0, UNI_KANA } /* katakana */, + { 72, 2, 4076, 1, 13, UNI_SC } /* currencysymbol */, + { 2, 5637, 3472, 21, 3, UNI_LB__ZWJ } /* graphemeclusterbreak=zwj */, + { 3, 43, 0, 4, 0, UNI_BUHD } /* buhd */, + { 7, 7383, 7776, 10, 21, UNI_BC__PDI } /* bidiclass=popdirectionalisolate */, + { 4, 1102, 116, 4, 4, UNI_KNDA } /* scx=knda */, + { 0, 7356, 0, 27, 0, UNI_OCR } /* opticalcharacterrecognition */, + { 0, 1439, 1477, 3, 7, UNI_XPOSIXBLANK } /* horizspace */, + { 0, 30, 492, 1, 7, UNI_INKHOJKI } /* inkhojki */, + { 2, 1667, 7467, 4, 28, UNI_SUPPUAA } /* blk=supplementaryprivateuseareaa */, + { 1, 4584, 353, 18, 4, UNI_IDST } /* idstrinaryoperator=yes */, + { 0, 4360, 1771, 10, 8, UNI_LB__NL } /* linebreak=nextline */, + { 6, 7011, 5016, 24, 2, UNI_CCC__8 } /* canonicalcombiningclass=kv */, + { 4, 461, 1396, 2, 8, UNI_XIDS } /* isxidstart */, + { 6, 3014, 288, 12, 2, UNI_IN__13 } /* presentin=v130 */, + { 15, 3421, 0, 15, 0, UNI_NARB } /* oldnortharabian */, + { 1, 895, 2093, 5, 2, UNI_AGE__5 } /* age=v50 */, + { 9, 7011, 346, 25, 1, UNI_CCC__28 } /* canonicalcombiningclass=28 */, + { 0, 7214, 1316, 25, 2, UNI_CCC__103 } /* canonicalcombiningclass=103 */, + { 0, 3130, 5863, 9, 13, UNI_GEORGIANSUP } /* blk=georgiansupplement */, + { 1, 461, 1478, 2, 2, UNI_ZS } /* iszs */, + { 6, 1272, 6357, 5, 13, UNI_CJKCOMPAT } /* iscjkcompatibility */, + { 1, 2766, 2621, 3, 9, UNI__PERL_SURROGATE } /* gc=surrogate */, + { 3, 1734, 819, 3, 6, UNI_SHRD } /* issharada */, + { 4, 3021, 343, 4, 3, UNI_IN__12_DOT_1 } /* in=v121 */, + { 24, 4502, 5635, 15, 3, UNI_LATINEXTG } /* blk=latinextendedg */, + { 9, 1823, 283, 7, 5, UNI_NSHU } /* script=nushu */, + { 0, 271, 898, 3, 2, UNI_GCB__V } /* gcb=v */, + { 28, 2324, 2009, 6, 6, UNI_INSYRIAC } /* block=syriac */, + { 0, 597, 1715, 3, 8, UNI_DT__ISO } /* dt=isolated */, + { 19, 2324, 4926, 6, 15, UNI_TAMILSUP } /* block=tamilsupplement */, + { 4, 461, 1404, 2, 10, UNI_ASCII } /* isbasiclatin */, + { 3, 4424, 909, 17, 4, UNI_BALI } /* scriptextensions=bali */, + { 4, 2324, 3611, 9, 6, UNI_CJKCOMPAT } /* block=cjkcompat */, + { 0, 461, 1191, 2, 7, UNI_BENG } /* isbengali */, + { 3, 6427, 3289, 13, 12, UNI_JG__FINALSEMKATH } /* joininggroup=finalsemkath */, + { 4, 2324, 5857, 6, 9, UNI_INMONGOLIAN } /* block=mongolian */, + { 0, 8601, 1609, 7, 9, UNI_SMALLFORMS } /* block=smallforms */, + { 2, 7198, 7304, 5, 24, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* blk=symbolsandpictographsexta */, + { 6, 6165, 909, 3, 4, UNI_BALI } /* sc=bali */, + { 0, 4424, 658, 17, 5, UNI_DOGR } /* scriptextensions=dogra */, + { 5, 6165, 1543, 3, 10, UNI_KHAR } /* sc=kharoshthi */, + { 9, 423, 5676, 3, 18, UNI_ANCIENTGREEKNUMBERS } /* inancientgreeknumbers */, + { 25, 1102, 991, 4, 6, UNI_HATR } /* scx=hatran */, + { 1, 20, 934, 3, 2, -UNI_XPOSIXXDIGIT } /* hex=f */, + { 0, 6165, 746, 3, 7, UNI_MARC } /* sc=marchen */, + { 0, 1397, 353, 7, 2, UNI_IDS } /* idstart=y */, + { 12, 7804, 6621, 10, 3, UNI_IDEO } /* ideographic=t */, + { 2, 1671, 131, 6, 1, UNI_CJKEXTF } /* cjkextf */, + { 0, 552, 2222, 3, 4, UNI_AGE__6_DOT_2 } /* age=6.2 */, + { 1, 461, 446, 2, 4, UNI_PHLI } /* isphli */, + { 2, 3724, 720, 12, 3, UNI_JG__MALAYALAMNNA } /* jg=malayalamnna */, + { 5, 4424, 4651, 17, 8, UNI_BOPO } /* scriptextensions=bopomofo */, + { 0, 2432, 1037, 9, 4, UNI_MYANMAREXTB } /* inmyanmarextb */, + { 0, 292, 289, 3, 1, UNI_NV__0 } /* nv=0 */, + { 0, 5156, 1869, 10, 3, UNI_WB__EB } /* wordbreak=gaz */, + { 2, 6735, 3720, 22, 4, UNI_JG__MALAYALAMLLLA } /* joininggroup=malayalamllla */, + { 12, 461, 1051, 2, 8, UNI_MAHJ } /* ismahajani */, + { 0, 309, 2786, 2, 14, UNI_HIGHSURROGATES } /* inhighsurrogates */, + { 5, 3391, 2165, 13, 2, UNI_NV__33 } /* numericvalue=33 */, + { 2, 30, 4190, 1, 16, UNI_LOWERCASELETTER } /* islowercaseletter */, + { 0, 7537, 585, 10, 5, UNI_XPOSIXALPHA } /* alphabetic=true */, + { 18, 1667, 1582, 4, 10, UNI_INPHOENICIAN } /* blk=phoenician */, + { 0, 7383, 0, 10, 0, UNI_bc_values_index } /* bidiclass= */, + { 0, 2832, 1674, 10, 4, UNI_CYRILLICEXTD } /* iscyrillicextd */, + { 11, 3863, 2107, 14, 8, UNI_NV__17_SLASH_2 } /* numericvalue=8.500e+00 */, + { 42, 2324, 1978, 6, 7, UNI_INSOGDIAN } /* block=sogdian */, + { 2, 1883, 934, 5, 6, -UNI_BIDIC } /* bidic=false */, + { 14, 1484, 0, 8, 0, UNI_BUGI } /* buginese */, + { 3, 309, 1543, 2, 10, UNI_INKHAROSHTHI } /* inkharoshthi */, + { 7, 4424, 4926, 17, 5, UNI_TAML } /* scriptextensions=tamil */, + { 32, 1117, 0, 8, 0, UNI_TAGB } /* tagbanwa */, + { 0, 6165, 15, 3, 4, UNI_AGHB } /* sc=aghb */, + { 4, 3391, 1067, 12, 4, UNI_NV__1_SLASH_3 } /* numericvalue=1/3 */, + { 5, 3633, 1037, 7, 4, UNI_LATINEXTB } /* inlatinextb */, + { 8, 673, 0, 5, 0, UNI_OSGE } /* osage */, + { 1, 2514, 2422, 3, 10, UNI_MISCSYMBOLS } /* ismiscsymbols */, + { 0, 461, 1358, 2, 9, UNI_PALM } /* ispalmyrene */, + { 3, 339, 5016, 4, 2, UNI_CCC__8 } /* ccc=kv */, + { 1, 1667, 4651, 4, 11, UNI_BOPOMOFOEXT } /* blk=bopomofoext */, + { 0, 6165, 1340, 3, 9, UNI_ORKH } /* sc=oldturkic */, + { 0, 2280, 140, 10, 2, UNI_IN__NA } /* presentin=na */, + { 0, 461, 1414, 2, 10, UNI_BOXDRAWING } /* isboxdrawing */, + { 2, 298, 0, 2, 0, UNI_RI } /* ri */, + { 0, 2523, 4191, 8, 5, UNI_XPOSIXLOWER } /* isxposixlower */, + { 8, 461, 825, 2, 7, UNI_SHAW } /* isshavian */, + { 6, 4191, 933, 8, 7, -UNI_XPOSIXLOWER } /* lowercase=false */, + { 1, 461, 3569, 4, 14, UNI_HALFANDFULLFORMS } /* ishalfandfullforms */, + { 3, 3093, 353, 13, 4, UNI_POSIXXDIGIT } /* asciihexdigit=yes */, + { 0, 2324, 6776, 6, 11, UNI_INMEETEIMAYEK } /* block=meeteimayek */, + { 24, 461, 4060, 2, 4, UNI_BRAI } /* isbrai */, + { 1, 3696, 837, 4, 3, UNI_SUPPUAA } /* suppuaa */, + { 1, 2348, 352, 12, 5, UNI_CI } /* caseignorable=yes */, + { 0, 4424, 739, 17, 7, UNI_MAND } /* scriptextensions=mandaic */, + { 7, 20, 1104, 2, 2, UNI_hex_values_index } /* hex= */, + { 0, 1667, 5283, 4, 9, UNI_HALFMARKS } /* blk=halfmarks */, + { 0, 6163, 6934, 14, 11, UNI_INSC__CONSONANTWITHSTACKER } /* insc=consonantwithstacker */, + { 0, 3276, 0, 13, 0, UNI_ME } /* enclosingmark */, + { 35, 461, 1475, 3, 9, UNI_XPOSIXBLANK } /* ishorizspace */, + { 2, 517, 1805, 4, 5, UNI_NV__700000 } /* nv=700000 */, + { 2, 533, 592, 3, 2, UNI_SB__SE } /* sb=se */, + { 23, 6450, 5090, 13, 3, UNI_SB__CL } /* sentencebreak=cl */, + { 0, 2324, 1205, 6, 7, UNI_INGRANTHA } /* block=grantha */, + { 2, 5216, 4533, 11, 4, UNI_LATINEXTC } /* block=latinextc */, + { 0, 578, 346, 6, 1, UNI_CCC__AL } /* ccc=228 */, + { 0, 4424, 1248, 17, 7, UNI_PHAG } /* scriptextensions=phagspa */, + { 2, 3791, 934, 4, 6, -UNI_MATH } /* math=false */, + { 3, 3093, 0, 5, 0, UNI_ASCII } /* ascii */, + { 0, 461, 6351, 2, 23, UNI_COMPATJAMO } /* ishangulcompatibilityjamo */, + { 0, 2468, 0, 13, 0, UNI_IPAEXT } /* ipaextensions */, + { 1, 2232, 1314, 4, 2, UNI_NV__800 } /* nv=800 */, + { 8, 2324, 1448, 9, 7, UNI_CJKSTROKES } /* block=cjkstrokes */, + { 0, 5065, 3894, 12, 4, UNI_JG__MANICHAEANTEN } /* jg=manichaeanten */, + { 49, 461, 244, 2, 4, UNI_ZZZZ } /* iszzzz */, + { 10, 1823, 422, 7, 4, UNI_SC__LINA } /* script=lina */, + { 0, 552, 2360, 4, 10, UNI_IN__NA } /* age=unassigned */, + { 34, 1618, 585, 10, 2, UNI_SD } /* softdotted=t */, + { 1, 1667, 5958, 4, 21, UNI_SINHALAARCHAICNUMBERS } /* blk=sinhalaarchaicnumbers */, + { 0, 3878, 1314, 14, 3, UNI_NV__9000 } /* numericvalue=9000 */, + { 1, 597, 7011, 3, 9, UNI_DT__CAN } /* dt=canonical */, + { 0, 1667, 634, 4, 7, UNI_INHANUNOO } /* blk=hanunoo */, + { 1, 3130, 976, 5, 7, UNI_INGURMUKHI } /* blk=gurmukhi */, + { 0, 6618, 8507, 4, 7, UNI_INPC__BOTTOM } /* inpc=bottom */, + { 21, 1667, 3228, 4, 15, UNI_INIMPERIALARAMAIC } /* blk=imperialaramaic */, + { 0, 2732, 4511, 10, 9, UNI_ARABICEXTB } /* blk=arabicextendedb */, + { 4, 5939, 585, 5, 5, UNI__PERL_NCHAR } /* nchar=true */, + { 12, 3436, 0, 15, 0, UNI_SARB } /* oldsoutharabian */, + { 5, 309, 1205, 2, 7, UNI_INGRANTHA } /* ingrantha */, + { 2, 309, 7564, 2, 27, UNI_ANCIENTGREEKMUSIC } /* inancientgreekmusicalnotation */, + { 1, 3677, 5635, 13, 3, UNI_LATINEXTG } /* islatinextendedg */, + { 0, 106, 0, 1, 0, UNI_Z } /* z */, + { 0, 2060, 1175, 4, 3, -UNI_XPOSIXALPHA } /* alpha=n */, + { 0, 1790, 599, 5, 3, UNI_COMPEX } /* nfcqc=no */, + { 7, 7198, 5813, 7, 7, UNI_SUPARROWSB } /* blk=suparrowsb */, + { 0, 5637, 2768, 20, 6, UNI_GCB__XX } /* graphemeclusterbreak=other */, + { 1, 4424, 4951, 17, 19, UNI_EGYP } /* scriptextensions=egyptianhieroglyphs */, + { 3, 5156, 1612, 10, 2, UNI_LB__LF } /* wordbreak=lf */, + { 1, 1635, 0, 10, 0, UNI_WARA } /* warangciti */, + { 2, 3724, 529, 12, 2, UNI_JG__MALAYALAMJA } /* jg=malayalamja */, + { 1, 2525, 248, 6, 5, UNI_XPOSIXCNTRL } /* xposixcntrl */, + { 1, 4424, 2441, 17, 11, UNI_NAND } /* scriptextensions=nandinagari */, + { 3, 1823, 357, 7, 6, UNI_SC__CAKM } /* script=chakma */, + { 97, 2966, 7304, 3, 24, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* insymbolsandpictographsexta */, + { 2, 5979, 1343, 3, 2, UNI_VO__TU } /* vo=tu */, + { 0, 7011, 395, 25, 2, UNI_CCC__216 } /* canonicalcombiningclass=216 */, + { 33, 3407, 1317, 14, 5, UNI_NV__432000 } /* numericvalue=432000 */, + { 17, 2002, 4150, 7, 5, UNI_POSIXPUNCT } /* isposixpunct */, + { 76, 597, 2692, 3, 8, UNI_DT__VERT } /* dt=vertical */, + { 14, 309, 5391, 2, 11, UNI_CHEROKEESUP } /* incherokeesup */, + { 3, 6165, 5876, 3, 9, UNI_SUND } /* sc=sundanese */, + { 1, 5658, 7073, 15, 11, UNI_IDENTIFIERTYPE__UNCOMMONUSE } /* identifiertype=uncommonuse */, + { 1, 32, 0, 2, 0, UNI_VS } /* vs */, + { 0, 30, 1561, 1, 11, UNI_NAGM } /* isnagmundari */, + { 1, 1823, 94, 7, 4, UNI_SC__GURU } /* script=guru */, + { 2, 2324, 683, 6, 5, UNI_INTAKRI } /* block=takri */, + { 0, 2259, 1126, 3, 7, UNI_TFNG } /* istifinagh */, + { 0, 1667, 951, 4, 8, UNI_INDUPLOYAN } /* blk=duployan */, + { 2, 4424, 3228, 17, 15, UNI_ARMI } /* scriptextensions=imperialaramaic */, + { 1, 3677, 4344, 3, 16, UNI_LETTERLIKESYMBOLS } /* isletterlikesymbols */, + { 0, 2503, 599, 11, 2, -UNI_JOINC } /* joincontrol=n */, + { 1, 4043, 599, 17, 3, -UNI_IDSB } /* idsbinaryoperator=no */, + { 0, 7011, 289, 24, 1, UNI_CCC__0 } /* canonicalcombiningclass=0 */, + { 2, 605, 341, 2, 2, UNI_idc_values_index } /* idc= */, + { 40, 285, 452, 2, 2, UNI_SHRD } /* shrd */, + { 5, 1102, 369, 4, 6, UNI_GOTH } /* scx=gothic */, + { 1, 1667, 3583, 4, 16, UNI_HIGHPUSURROGATES } /* blk=highpusurrogates */, + { 8, 7274, 3026, 9, 2, UNI_PS } /* category=ps */, + { 15, 1883, 353, 5, 4, UNI_BIDIC } /* bidic=yes */, + { 2, 7011, 3971, 24, 13, UNI_CCC__IS } /* canonicalcombiningclass=iotasubscript */, + { 2, 2324, 5185, 6, 20, UNI_INANATOLIANHIEROGLYPHS } /* block=anatolianhieroglyphs */, + { 0, 916, 352, 4, 5, UNI_EBASE } /* ebase=yes */, + { 2, 6165, 1635, 3, 10, UNI_WARA } /* sc=warangciti */, + { 0, 2180, 346, 4, 1, UNI_NV__48 } /* nv=48 */, + { 6, 2401, 1037, 10, 4, UNI_ETHIOPICEXTB } /* inethiopicextb */, + { 3, 309, 4131, 2, 8, UNI_VEDICEXT } /* invedicext */, + { 7, 30, 938, 1, 6, UNI_ECOMP } /* isecomp */, + { 13, 339, 1317, 4, 2, UNI_CCC__32 } /* ccc=32 */, + { 11, 1823, 228, 7, 4, UNI_XSUX } /* script=xsux */, + { 0, 252, 0, 2, 0, UNI_CASEDLETTER } /* lc */, + { 0, 16, 4982, 1, 5, UNI_GRBASE } /* grbase */, + { 0, 4502, 1505, 9, 4, UNI_LATINEXTA } /* blk=latinexta */, + { 11, 876, 353, 4, 4, UNI_IDEO } /* ideo=yes */, + { 0, 1065, 520, 4, 1, UNI_NV__17 } /* nv=17 */, + { 32, 5460, 585, 19, 2, UNI_TERM } /* terminalpunctuation=t */, + { 0, 1667, 7564, 4, 17, UNI_ANCIENTGREEKMUSIC } /* blk=ancientgreekmusic */, + { 4, 5616, 353, 21, 2, UNI_CWU } /* changeswhenuppercased=y */, + { 0, 339, 1318, 4, 2, UNI_CCC__20 } /* ccc=20 */, + { 0, 6165, 6185, 3, 4, UNI_SC__GLAG } /* sc=glag */, + { 2, 6165, 90, 3, 4, UNI_SC__GUJR } /* sc=gujr */, + { 2, 309, 825, 2, 7, UNI_SHAW } /* inshavian */, + { 0, 4360, 6, 10, 2, UNI_LB__CR } /* linebreak=cr */, + { 17, 6427, 706, 13, 4, UNI_JG__SEEN } /* joininggroup=seen */, + { 2, 6163, 5731, 6, 15, UNI_INSC__CANTILLATIONMARK } /* insc=cantillationmark */, + { 0, 6165, 917, 3, 4, UNI_BASS } /* sc=bass */, + { 0, 6165, 438, 3, 4, UNI_OLCK } /* sc=olck */, + { 1, 5205, 2631, 5, 12, UNI_MAYANNUMERALS } /* blk=mayannumerals */, + { 0, 3514, 0, 12, 0, UNI_INARABIC } /* block=arabic */, + { 1, 3908, 0, 6, 0, UNI_TANG } /* tangut */, + { 0, 309, 4896, 2, 8, UNI_BAMUMSUP } /* inbamumsup */, + { 0, 4569, 585, 5, 5, UNI_XPOSIXUPPER } /* upper=true */, + { 2, 339, 5523, 4, 9, UNI_CCC__BL } /* ccc=belowleft */, + { 2, 1102, 430, 4, 3, UNI_NKO } /* scx=nko */, + { 2, 3817, 4404, 14, 3, UNI_NV__13_SLASH_2 } /* numericvalue=13/2 */, + { 12, 253, 934, 4, 2, -UNI_CWCF } /* cwcf=f */, + { 0, 5205, 7825, 5, 30, UNI_MATHALPHANUM } /* blk=mathematicalalphanumericsymbols */, + { 0, 6165, 5031, 3, 14, UNI_SC__ROHG } /* sc=hanifirohingya */, + { 1, 1667, 1117, 4, 8, UNI_INTAGBANWA } /* blk=tagbanwa */, + { 6, 4970, 934, 13, 2, -UNI_EMOD } /* emojimodifier=f */, + { 0, 1823, 470, 7, 4, UNI_TNSA } /* script=tnsa */, + { 4, 309, 2182, 2, 2, UNI_IN__4 } /* in=4 */, + { 8, 517, 3846, 4, 2, UNI_NV__7_SLASH_8 } /* nv=7/8 */, + { 0, 1102, 1255, 4, 7, UNI_SIDD } /* scx=siddham */, + { 4, 3514, 4987, 7, 16, UNI_ALCHEMICAL } /* block=alchemicalsymbols */, + { 4, 309, 7796, 2, 22, UNI_ENCLOSEDIDEOGRAPHICSUP } /* inenclosedideographicsup */, + { 1, 1823, 634, 7, 7, UNI_SC__HANO } /* script=hanunoo */, + { 0, 5895, 6965, 5, 22, UNI_SUPERANDSUB } /* issuperscriptsandsubscripts */, + { 27, 461, 1340, 2, 9, UNI_ORKH } /* isoldturkic */, + { 2, 2434, 1505, 7, 4, UNI_MYANMAREXTA } /* myanmarexta */, + { 3, 1102, 1592, 4, 4, UNI_SAUR } /* scx=saur */, + { 0, 6165, 1003, 3, 4, UNI_LEPC } /* sc=lepc */, + { 3, 6163, 3289, 14, 5, UNI_INSC__CONSONANTFINAL } /* insc=consonantfinal */, + { 3, 1726, 1141, 8, 3, UNI_ARABICPFA } /* isarabicpfa */, + { 2, 1667, 426, 4, 3, UNI_INMRO } /* blk=mro */, + { 2, 6165, 4651, 3, 8, UNI_SC__BOPO } /* sc=bopomofo */, + { 36, 4424, 975, 17, 8, UNI_GURU } /* scriptextensions=gurmukhi */, + { 1, 8538, 5981, 19, 19, UNI_VO__TR } /* verticalorientation=transformedrotated */, + { 0, 10, 2643, 1, 12, UNI_MISCTECHNICAL } /* misctechnical */, + { 2, 8343, 6923, 31, 11, UNI_INSC__CONSONANTPLACEHOLDER } /* indicsyllabiccategory=consonantplaceholder */, + { 2, 6816, 353, 25, 4, UNI_CWKCF } /* changeswhennfkccasefolded=yes */, + { 20, 30, 2255, 1, 9, UNI_PHAISTOS } /* inphaistos */, + { 40, 1102, 220, 4, 4, UNI_WCHO } /* scx=wcho */, + { 5, 2287, 2083, 4, 2, UNI_IN__1_DOT_1 } /* in=1.1 */, + { 16, 339, 5515, 4, 13, UNI_CCC__202 } /* ccc=attachedbelow */, + { 6, 7383, 2424, 10, 2, UNI_BC__CS } /* bidiclass=cs */, + { 5, 1530, 324, 6, 3, UNI_KANASUP } /* iskanasup */, + { 0, 1102, 55, 4, 4, UNI_CHAM } /* scx=cham */, + { 1, 7591, 119, 3, 2, UNI_LB__AL } /* lb=al */, + { 18, 5255, 934, 20, 2, -UNI_EXTPICT } /* extendedpictographic=f */, + { 2, 552, 140, 4, 2, UNI_IN__NA } /* age=na */, + { 28, 1667, 6581, 4, 16, UNI_INDICNUMBERFORMS } /* blk=indicnumberforms */, + { 72, 2494, 958, 9, 4, UNI_GEORGIANEXT } /* isgeorgianext */, + { 0, 4424, 868, 17, 4, UNI_TIRH } /* scriptextensions=tirh */, + { 1, 6062, 7915, 7, 20, UNI_ENCLOSEDALPHANUM } /* block=enclosedalphanumerics */, + { 3, 4424, 4271, 17, 17, UNI_KITS } /* scriptextensions=khitansmallscript */, + { 1, 4424, 5958, 17, 4, UNI_SINH } /* scriptextensions=sinh */, + { 8, 309, 4926, 2, 15, UNI_TAMILSUP } /* intamilsupplement */, + { 80, 833, 934, 4, 6, -UNI_TERM } /* term=false */, + { 0, 1396, 585, 4, 5, UNI_XIDS } /* xids=true */, + { 3, 4424, 86, 17, 4, UNI_GREK } /* scriptextensions=grek */, + { 2, 224, 1660, 3, 7, UNI_XPOSIXSPACE } /* xperlspace */, + { 1, 3391, 1071, 13, 4, UNI_NV__1_SLASH_12 } /* numericvalue=1/12 */, { 0, 1102, 854, 4, 7, UNI_TAVT } /* scx=taiviet */, - { 2, 1879, 1982, 4, 6, UNI_INSYRIAC } /* blk=syriac */, - { 0, 6944, 348, 24, 2, UNI_CCC__18 } /* canonicalcombiningclass=18 */, - { 1, 1796, 5340, 7, 10, UNI_SC__DEVA } /* script=devanagari */, - { 2, 5586, 5718, 21, 9, UNI_WB__EB } /* graphemeclusterbreak=emodifier */, - { 1, 5304, 0, 11, 0, UNI_TAIXUANJING } /* taixuanjing */, - { 9, 464, 2747, 3, 13, UNI_HIGHSURROGATES } /* ishighsurrogates */, - { 1, 154, 6878, 3, 20, UNI_GEOMETRICSHAPESEXT } /* geometricshapesextended */, - { 0, 6379, 2519, 13, 10, UNI_JG__KNOTTEDHEH } /* joininggroup=knottedheh */, - { 5, 1516, 493, 5, 3, UNI_KANBUN } /* iskanbun */, - { 0, 1102, 3991, 4, 4, UNI_BRAI } /* scx=brai */, - { 37, 313, 6462, 2, 24, UNI_HIGHPUSURROGATES } /* inhighprivateusesurrogates */, - { 0, 581, 349, 6, 1, UNI_CCC__AL } /* ccc=228 */, - { 3, 1198, 0, 4, 0, UNI_GRAN } /* gran */, - { 5, 3367, 523, 14, 1, UNI_NV__47 } /* numericvalue=47 */, - { 0, 464, 6799, 2, 24, UNI_COMPEX } /* isfullcompositionexclusion */, - { 0, 4355, 1241, 17, 7, UNI_PHAG } /* scriptextensions=phagspa */, - { 0, 7208, 252, 9, 2, UNI_CN } /* category=cn */, - { 0, 4355, 136, 17, 4, UNI_MYMR } /* scriptextensions=mymr */, - { 1, 5607, 7007, 15, 11, UNI_IDENTIFIERTYPE__UNCOMMONUSE } /* identifiertype=uncommonuse */, - { 0, 2726, 3722, 3, 10, UNI_SM } /* gc=mathsymbol */, - { 0, 4996, 229, 13, 2, UNI_JG__MANICHAEANPE } /* jg=manichaeanpe */, - { 1, 2802, 7175, 3, 26, UNI_ENCLOSEDCJK } /* isenclosedcjklettersandmonths */, - { 4, 313, 983, 2, 8, UNI_INHIRAGANA } /* inhiragana */, - { 3, 7208, 3594, 9, 2, UNI_NL } /* category=nl */, - { 0, 3462, 6142, 10, 5, UNI_ETHIOPICSUP } /* blk=ethiopicsup */, - { 4, 464, 2041, 2, 12, UNI_MEND } /* ismendekikakui */, - { 0, 1879, 4582, 4, 8, UNI_INBOPOMOFO } /* blk=bopomofo */, - { 3, 1102, 1529, 4, 10, UNI_KHAR } /* scx=kharoshthi */, - { 6, 7584, 2003, 20, 5, UNI_DT__NB } /* decompositiontype=nobreak */, - { 2, 1867, 588, 5, 2, UNI_BIDIM } /* bidim=t */, - { 0, 224, 0, 4, 0, UNI_WCHO } /* wcho */, - { 1, 4450, 8150, 7, 32, UNI_DIACRITICALSEXT } /* block=combiningdiacriticalmarksextended */, - { 1, 6114, 4392, 3, 11, UNI_SGNW } /* sc=signwriting */, - { 1, 6944, 398, 25, 2, UNI_CCC__216 } /* canonicalcombiningclass=216 */, - { 1, 1383, 588, 3, 5, UNI_IDS } /* ids=true */, - { 5, 6025, 3408, 11, 6, UNI_GEORGIANEXT } /* block=georgianext */, - { 0, 4355, 1802, 16, 5, UNI_MLYM } /* scriptextensions=mlym */, - { 1, 6944, 3902, 24, 13, UNI_CCC__IS } /* canonicalcombiningclass=iotasubscript */, - { 0, 1102, 136, 4, 4, UNI_MYMR } /* scx=mymr */, - { 8, 313, 6439, 2, 23, UNI_ZNAMENNYMUSIC } /* inznamennymusicalnotation */, - { 7, 7148, 0, 26, 0, UNI_CCC__12 } /* canonicalcombiningclass=12 */, - { 5, 4433, 4701, 17, 10, UNI_LATINEXTADDITIONAL } /* blk=latinextendedadditional */, - { 0, 3593, 6771, 12, 4, UNI_LATINEXTD } /* inlatinextendedd */, - { 12, 4355, 4107, 17, 6, UNI_HANG } /* scriptextensions=hangul */, - { 2, 3779, 6199, 14, 5, UNI_NV__700000 } /* numericvalue=700000 */, - { 0, 1796, 4671, 7, 4, UNI_SC__TALE } /* script=tale */, - { 4, 3474, 593, 6, 7, UNI_DSRT } /* block=deseret */, - { 0, 464, 4582, 2, 11, UNI_BOPOMOFOEXT } /* isbopomofoext */, - { 0, 1879, 1144, 4, 9, UNI_INBHAIKSUKI } /* blk=bhaiksuki */, - { 1, 3974, 934, 4, 6, -UNI_IDSB } /* idsb=false */, - { 0, 7584, 3444, 18, 6, UNI_DT__SQR } /* decompositiontype=square */, - { 0, 2465, 8500, 4, 33, UNI_DIACRITICALSSUP } /* incombiningdiacriticalmarkssupplement */, - { 2, 343, 7966, 4, 9, UNI_CCC__AL } /* ccc=aboveleft */, - { 1, 5748, 5762, 5, 7, UNI_SUPARROWSB } /* insuparrowsb */, - { 24, 1478, 5812, 7, 6, UNI_GEORGIANSUP } /* ingeorgiansup */, - { 0, 3622, 0, 3, 0, UNI_L } /* isl */, - { 80, 5147, 4629, 10, 5, UNI_LATIN1 } /* block=latin1sup */, - { 19, 1597, 356, 10, 4, UNI_SD } /* softdotted=yes */, - { 3, 5748, 1818, 5, 8, UNI_SUPERANDSUB } /* insuperandsub */, - { 0, 34, 495, 1, 7, UNI_INKHOJKI } /* inkhojki */, - { 4, 2355, 7403, 8, 13, UNI_CYRILLICSUP } /* cyrillicsupplementary */, - { 0, 4996, 4682, 13, 5, UNI_JG__MANICHAEANSADHE } /* jg=manichaeansadhe */, - { 0, 4308, 602, 14, 2, UNI_NFKDQC__N } /* nfkdquickcheck=n */, - { 0, 2792, 6142, 8, 12, UNI_CYRILLICSUP } /* iscyrillicsupplement */, - { 0, 600, 1162, 3, 6, UNI_DT__ENC } /* dt=circle */, - { 8, 3090, 5223, 6, 16, UNI_INPUNCTUATION } /* blk=generalpunctuation */, - { 4, 1879, 7377, 4, 8, UNI_INKATAKANA } /* blk=katakana */, - { 5, 7527, 2890, 3, 2, UNI_GCB__T } /* lb=jt */, - { 1, 1796, 868, 7, 7, UNI_SC__TIRH } /* script=tirhuta */, - { 3, 7987, 6056, 12, 9, UNI_MATHOPERATORS } /* mathematicaloperators */, - { 2, 313, 502, 2, 6, UNI_INLYDIAN } /* inlydian */, - { 4, 6570, 6581, 5, 6, UNI_INPC__BOTTOM } /* inpc=bottom */, - { 1, 6944, 2262, 23, 3, UNI_CCC__14 } /* canonicalcombiningclass=14 */, - { 1, 1796, 1202, 7, 4, UNI_THAI } /* script=thai */, - { 3, 4291, 4219, 10, 14, UNI_LB__CR } /* linebreak=carriagereturn */, - { 2, 3763, 1300, 14, 3, UNI_NV__5000 } /* numericvalue=5000 */, - { 0, 1719, 1465, 4, 5, UNI_VERTSPACE } /* vertspace */, - { 1, 6114, 184, 3, 4, UNI_SAMR } /* sc=samr */, - { 1, 6687, 3665, 22, 4, UNI_JG__MALAYALAMLLLA } /* joininggroup=malayalamllla */, - { 0, 7825, 0, 20, 0, UNI_CJK } /* cjkunifiedideographs */, - { 0, 2, 602, 3, 3, -UNI_CWL } /* cwl=no */, - { 2, 236, 0, 4, 0, UNI_YI } /* yiii */, - { 0, 4355, 1191, 17, 4, UNI_BENG } /* scriptextensions=beng */, - { 3, 1879, 1198, 4, 7, UNI_INGRANTHA } /* blk=grantha */, - { 4, 2463, 588, 11, 5, UNI_JOINC } /* joincontrol=true */, - { 0, 825, 0, 7, 0, UNI_SHAW } /* shavian */, - { 1, 1796, 1271, 7, 9, UNI_SC__SIND } /* script=khudawadi */, - { 1, 1011, 356, 2, 2, UNI_CI } /* ci=y */, - { 0, 2692, 2285, 5, 12, UNI_AEGEANNUMBERS } /* blk=aegeannumbers */, - { 2, 4355, 991, 17, 6, UNI_HATR } /* scriptextensions=hatran */, - { 64, 1710, 1249, 3, 6, UNI_SIDD } /* issiddham */, - { 1, 1102, 840, 4, 7, UNI_TGLG } /* scx=tagalog */, - { 0, 6114, 212, 3, 4, UNI_SC__TGLG } /* sc=tglg */, - { 2, 1879, 6533, 4, 16, UNI_INDICNUMBERFORMS } /* blk=indicnumberforms */, - { 0, 464, 4092, 2, 15, UNI_DIACRITICALSEXT } /* isdiacriticalsext */, - { 0, 2726, 6635, 6, 8, UNI_LO } /* gc=otherletter */, - { 3, 3474, 1241, 6, 7, UNI_INPHAGSPA } /* block=phagspa */, - { 0, 313, 2771, 2, 5, UNI_INKHMER } /* inkhmer */, - { 2, 2355, 5797, 8, 9, UNI_CYRILLICEXTA } /* cyrillicextendeda */, - { 0, 3474, 2401, 6, 11, UNI_INNANDINAGARI } /* block=nandinagari */, - { 64, 4107, 1676, 12, 3, UNI_INHANGUL } /* hangulsyllables */, - { 4, 3285, 0, 6, 0, UNI_HEBR } /* hebrew */, - { 35, 3474, 540, 6, 6, UNI_INTANGSA } /* block=tangsa */, - { 0, 7132, 6623, 5, 21, UNI_MODIFIERLETTERS } /* blk=spacingmodifierletters */, - { 1, 7018, 1491, 8, 4, UNI_ARABICEXTA } /* inarabicexta */, - { 0, 2692, 2760, 5, 11, UNI_ALPHABETICPF } /* blk=alphabeticpf */, - { 0, 8244, 1491, 9, 4, UNI_CJKEXTA } /* block=cjkexta */, - { 5, 203, 0, 2, 0, UNI_TITLE } /* lt */, - { 0, 275, 3432, 4, 3, UNI_LB__ZWJ } /* gcb=zwj */, - { 17, 464, 6462, 2, 24, UNI_HIGHPUSURROGATES } /* ishighprivateusesurrogates */, - { 4, 844, 933, 2, 3, -UNI_LOE } /* loe=f */, - { 1, 5928, 1605, 12, 9, UNI_VO__TU } /* vo=transformedupright */, - { 16, 39, 42, 3, 1, UNI_BATK } /* batk */, - { 2, 7527, 2904, 3, 11, UNI_LB__BB } /* lb=breakbefore */, - { 0, 833, 934, 4, 6, -UNI_TERM } /* term=false */, - { 0, 464, 1451, 2, 10, UNI_DIAK } /* isdivesakuru */, - { 1, 632, 587, 5, 3, UNI_GRBASE } /* grbase=t */, - { 4, 2, 355, 1, 2, UNI_ce_values_index } /* ce= */, - { 4, 464, 4020, 2, 4, UNI_SIND } /* issind */, - { 0, 2365, 6142, 6, 12, UNI_ETHIOPICSUP } /* ethiopicsupplement */, - { 0, 644, 1847, 6, 8, UNI_LB__H2 } /* hst=lvsyllable */, - { 7, 3474, 1951, 6, 7, UNI_INSOGDIAN } /* block=sogdian */, - { 0, 464, 94, 2, 4, UNI_GUJR } /* isgujr */, - { 0, 1796, 666, 7, 5, UNI_SC__LIMB } /* script=limbu */, - { 1, 464, 107, 3, 3, UNI_HMNG } /* ishmng */, - { 8, 7317, 0, 11, 0, UNI_BC__L } /* bidiclass=l */, - { 4, 810, 0, 4, 0, UNI_SYRC } /* syrc */, - { 0, 4355, 4671, 17, 4, UNI_TALE } /* scriptextensions=tale */, - { 2, 1174, 6970, 3, 9, UNI_EA__H } /* ea=halfwidth */, - { 6, 1879, 2241, 4, 12, UNI_PLAYINGCARDS } /* blk=playingcards */, - { 0, 3622, 4629, 6, 12, UNI_LATIN1 } /* islatin1supplement */, - { 13, 1796, 1320, 7, 4, UNI_SC__PERM } /* script=perm */, - { 8, 464, 1144, 2, 9, UNI_BHKS } /* isbhaiksuki */, - { 4, 7431, 562, 28, 2, UNI_CCC__107 } /* canonicalcombiningclass=ccc107 */, - { 1, 4355, 172, 17, 4, UNI_RJNG } /* scriptextensions=rjng */, - { 0, 4355, 997, 17, 6, UNI_KTHI } /* scriptextensions=kaithi */, - { 0, 895, 3792, 5, 2, UNI_AGE__7 } /* age=v70 */, - { 1, 343, 278, 3, 2, UNI_CCC__B } /* ccc=b */, - { 5, 7660, 0, 18, 0, UNI_INVS } /* variationselectors */, - { 2, 2726, 330, 3, 2, UNI_PF } /* gc=pf */, - { 0, 8007, 3571, 7, 6, UNI_CJKCOMPAT } /* blk=cjkcompat */, - { 17, 2205, 1300, 4, 2, UNI_NV__800 } /* nv=800 */, - { 8, 36, 602, 2, 2, -UNI_VS } /* vs=n */, - { 4, 4355, 120, 17, 3, UNI_LAO } /* scriptextensions=lao */, - { 0, 1796, 4827, 7, 5, UNI_BAMU } /* script=bamum */, - { 1, 464, 2652, 2, 13, UNI_VERTICALFORMS } /* isverticalforms */, - { 0, 6114, 1807, 3, 11, UNI_SORA } /* sc=sorasompeng */, - { 4, 632, 5620, 5, 3, -UNI_GRBASE } /* grbase=n */, - { 10, 1879, 1271, 4, 9, UNI_INKHUDAWADI } /* blk=khudawadi */, - { 1, 5718, 356, 4, 2, UNI_EMOD } /* emod=y */, - { 0, 5718, 278, 4, 1, UNI_emod_values_index } /* emod= */, - { 19, 6379, 1522, 13, 7, UNI_JG__THINYEH } /* joininggroup=thinyeh */, - { 1, 1102, 19, 4, 4, UNI_AGHB } /* scx=aghb */, - { 17, 625, 934, 7, 2, -UNI_EXTPICT } /* extpict=f */, - { 5, 895, 294, 6, 2, UNI_AGE__14 } /* age=v140 */, - { 8, 3474, 6142, 10, 5, UNI_ARABICSUP } /* block=arabicsup */, - { 0, 464, 1529, 2, 10, UNI_KHAR } /* iskharoshthi */, - { 1, 6114, 477, 3, 4, UNI_VAI } /* sc=vaii */, - { 15, 464, 6284, 2, 19, UNI_JAMOEXTB } /* ishanguljamoextendedb */, - { 3, 7338, 0, 11, 0, UNI_BC__R } /* bidiclass=r */, - { 16, 895, 347, 5, 2, UNI_IN__1_DOT_1 } /* age=v11 */, - { 0, 6570, 8440, 11, 14, UNI_INPC__TOPANDBOTTOMANDRIGHT } /* inpc=topandbottomandright */, - { 2, 1796, 749, 7, 7, UNI_MARC } /* script=marchen */, - { 0, 1561, 0, 10, 0, UNI_PHNX } /* phoenician */, - { 0, 1879, 2652, 4, 13, UNI_VERTICALFORMS } /* blk=verticalforms */, - { 1, 383, 588, 6, 2, UNI_HYPHEN } /* hyphen=t */, - { 4, 2193, 6219, 8, 4, UNI_NV__1_SLASH_160 } /* nv=6.250e-03 */, - { 0, 14, 402, 1, 3, UNI_MIAO } /* miao */, - { 2, 2485, 3060, 5, 6, UNI_XPOSIXDIGIT } /* xposixdigit */, - { 0, 313, 2986, 2, 14, UNI_INPSALTERPAHLAVI } /* inpsalterpahlavi */, - { 0, 6114, 465, 3, 4, UNI_SC__SHRD } /* sc=shrd */, - { 0, 4122, 602, 5, 3, -UNI_XPOSIXLOWER } /* lower=no */, - { 9, 2678, 3855, 3, 14, UNI_BC__EN } /* bc=europeannumber */, - { 0, 4355, 1614, 17, 10, UNI_WARA } /* scriptextensions=warangciti */, - { 0, 58, 1882, 2, 5, UNI_SC__KANA } /* sc=kana */, - { 7, 228, 0, 4, 0, UNI_XPEO } /* xpeo */, - { 2, 4291, 703, 10, 2, UNI_EMOD } /* linebreak=em */, - { 33, 2496, 2835, 3, 11, UNI_JG__STRAIGHTWAW } /* jg=straightwaw */, - { 65, 756, 1768, 3, 4, UNI_nfkcqc_values_index } /* nfkcqc= */, - { 1, 2981, 294, 5, 2, UNI_IN__14 } /* in=v140 */, - { 7, 2275, 0, 10, 0, UNI_IDC } /* idcontinue */, - { 59, 1796, 449, 7, 4, UNI_PHLI } /* script=phli */, - { 0, 2981, 3792, 4, 2, UNI_IN__7 } /* in=v70 */, - { 25, 1879, 5304, 4, 11, UNI_TAIXUANJING } /* blk=taixuanjing */, - { 0, 7338, 0, 21, 0, UNI_BC__R } /* bidiclass=righttoleft */, - { 8, 3794, 2145, 14, 8, UNI_NV__7_SLASH_8 } /* numericvalue=8.750e-01 */, - { 4, 34, 5321, 1, 19, UNI_CHEROKEESUP } /* ischerokeesupplement */, - { 1, 1796, 6594, 7, 4, UNI_BRAH } /* script=brah */, - { 1, 1597, 278, 10, 1, UNI_sd_values_index } /* softdotted= */, - { 1, 5186, 602, 20, 2, -UNI_EXTPICT } /* extendedpictographic=n */, - { 2, 464, 1508, 2, 8, UNI_UGAR } /* isugaritic */, - { 1, 464, 4107, 2, 15, UNI_INHANGUL } /* ishangulsyllables */, - { 0, 3058, 356, 8, 4, UNI_XPOSIXXDIGIT } /* hexdigit=yes */, - { 14, 3351, 2074, 13, 2, UNI_NV__29 } /* numericvalue=29 */, - { 0, 8244, 7315, 33, 3, UNI_CJKEXTB } /* block=cjkunifiedideographsextensionb */, - { 30, 6114, 3396, 3, 15, UNI_SARB } /* sc=oldsoutharabian */, - { 0, 383, 602, 6, 2, -UNI_HYPHEN } /* hyphen=n */, - { 8, 1102, 413, 4, 4, UNI_GONM } /* scx=gonm */, - { 1, 7584, 946, 18, 5, UNI_DT__SUP } /* decompositiontype=super */, - { 14, 1796, 5907, 7, 7, UNI_SC__SINH } /* script=sinhala */, - { 0, 4996, 3825, 12, 4, UNI_JG__MANICHAEANTEN } /* jg=manichaeanten */, - { 2, 296, 293, 3, 1, UNI_NV__0 } /* nv=0 */, - { 19, 8590, 0, 36, 0, UNI_UCAS } /* isunifiedcanadianaboriginalsyllabics */, - { 16, 3351, 0, 15, 0, UNI_NV__23 } /* numericvalue=23 */, - { 1, 6114, 656, 3, 5, UNI_SC__BUHD } /* sc=buhid */, - { 0, 6114, 1248, 3, 4, UNI_SIDD } /* sc=sidd */, - { 11, 2726, 3156, 6, 8, UNI_NO } /* gc=othernumber */, - { 0, 656, 0, 5, 0, UNI_BUHD } /* buhid */, - { 0, 844, 587, 2, 3, UNI_LOE } /* loe=t */, - { 0, 5147, 4590, 11, 9, UNI_LATINEXTC } /* block=latinextendedc */, - { 0, 7527, 283, 3, 2, UNI_GCB__L } /* lb=jl */, - { 0, 6114, 160, 3, 4, UNI_SC__PHLP } /* sc=phlp */, - { 3, 5, 8047, 1, 31, UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS } /* egyptianhieroglyphformatcontrols */, - { 1, 4872, 328, 10, 3, UNI_KANASUP } /* block=kanasup */, - { 3, 1383, 0, 7, 0, UNI_IDS } /* idstart */, - { 4, 409, 934, 2, 6, -UNI_DI } /* di=false */, - { 1, 876, 602, 4, 3, -UNI_IDEO } /* ideo=no */, - { 0, 1796, 1424, 7, 10, UNI_CHRS } /* script=chorasmian */, - { 7, 4500, 356, 5, 2, UNI_XPOSIXUPPER } /* upper=y */, - { 0, 3974, 588, 17, 5, UNI_IDSB } /* idsbinaryoperator=true */, - { 1, 1856, 602, 5, 3, -UNI_BIDIC } /* bidic=no */, - { 4, 7527, 2559, 3, 10, UNI_LB__NS } /* lb=nonstarter */, - { 0, 4433, 4552, 5, 15, UNI_LINEARBSYLLABARY } /* blk=linearbsyllabary */, - { 17, 3474, 4092, 6, 15, UNI_DIACRITICALSEXT } /* block=diacriticalsext */, - { 2, 6379, 4692, 14, 4, UNI_JG__ALAPH } /* joininggroup=alaph */, - { 0, 1879, 372, 4, 6, UNI_INGOTHIC } /* blk=gothic */, - { 0, 6114, 1495, 3, 8, UNI_SC__JAVA } /* sc=javanese */, - { 0, 2485, 4500, 6, 5, UNI_XPOSIXUPPER } /* xposixupper */, - { 0, 1796, 840, 7, 7, UNI_SC__TGLG } /* script=tagalog */, - { 4, 6114, 1271, 3, 9, UNI_SC__SIND } /* sc=khudawadi */, - { 9, 1796, 4020, 7, 4, UNI_SC__SIND } /* script=sind */, - { 3, 1879, 5304, 4, 18, UNI_TAIXUANJING } /* blk=taixuanjingsymbols */, - { 66, 4901, 0, 17, 0, UNI_EBASE } /* emojimodifierbase */, - { 4, 6379, 653, 13, 3, UNI_JG__LAM } /* joininggroup=lam */, - { 9, 8, 4913, 1, 5, UNI_GRBASE } /* grbase */, - { 0, 1867, 934, 5, 6, -UNI_BIDIM } /* bidim=false */, - { 0, 3474, 4107, 6, 6, UNI_INHANGUL } /* block=hangul */, - { 0, 2726, 6276, 3, 6, UNI_CF } /* gc=format */, - { 2, 5147, 6890, 11, 9, UNI_LATINEXTE } /* block=latinextendede */, - { 0, 1410, 771, 7, 2, UNI_CCC__21 } /* ccc=ccc21 */, - { 0, 3474, 4092, 6, 12, UNI_DIACRITICALS } /* block=diacriticals */, - { 0, 8182, 2680, 23, 6, UNI_INPC__RIGHT } /* indicpositionalcategory=right */, - { 0, 5544, 588, 21, 2, UNI_CWT } /* changeswhentitlecased=t */, - { 29, 1548, 3061, 3, 5, UNI_NT__DI } /* nt=digit */, - { 1, 3474, 3721, 11, 5, UNI_ARABICMATH } /* block=arabicmath */, - { 7, 4291, 213, 10, 2, UNI_LB__GL } /* linebreak=gl */, - { 1, 1102, 86, 4, 4, UNI_GONG } /* scx=gong */, - { 0, 2496, 229, 3, 2, UNI_JG__PE } /* jg=pe */, - { 1, 409, 588, 2, 5, UNI_DI } /* di=true */, - { 8, 1102, 802, 4, 4, UNI_NBAT } /* scx=nbat */, - { 26, 5087, 1802, 9, 3, UNI_WB__ML } /* wordbreak=ml */, - { 0, 508, 1768, 2, 4, UNI_nfcqc_values_index } /* nfcqc= */, - { 9, 4355, 810, 17, 4, UNI_SYRC } /* scriptextensions=syrc */, - { 5, 536, 37, 3, 2, UNI_SB__ST } /* sb=st */, - { 4, 7527, 3594, 3, 2, UNI_LB__NL } /* lb=nl */, - { 3, 37, 7937, 1, 29, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* symbolsandpictographsextendeda */, - { 0, 625, 588, 7, 2, UNI_EXTPICT } /* extpict=t */, - { 0, 5586, 3423, 21, 12, UNI_WB__EB } /* graphemeclusterbreak=glueafterzwj */, - { 4, 4355, 749, 17, 4, UNI_MARC } /* scriptextensions=marc */, - { 1, 4355, 301, 17, 5, UNI_ORYA } /* scriptextensions=oriya */, - { 0, 5586, 959, 21, 6, UNI_GCB__EX } /* graphemeclusterbreak=extend */, - { 0, 4355, 1248, 17, 7, UNI_SIDD } /* scriptextensions=siddham */, - { 0, 3474, 917, 6, 8, UNI_INBASSAVAH } /* block=bassavah */, - { 0, 1410, 6968, 7, 2, UNI_CCC__27 } /* ccc=ccc27 */, - { 0, 1102, 144, 4, 4, UNI_NEWA } /* scx=newa */, - { 1, 2802, 0, 6, 0, UNI_ETHI } /* isethi */, - { 0, 2205, 1781, 4, 4, UNI_NV__80000 } /* nv=80000 */, - { 0, 1796, 469, 7, 4, UNI_SOGO } /* script=sogo */, - { 5, 7527, 22, 4, 1, UNI_LB__CB } /* lb=cb */, - { 3, 5147, 74, 13, 2, UNI_LATINEXTC } /* block=latinextc */, - { 0, 1879, 854, 4, 7, UNI_INTAIVIET } /* blk=taiviet */, - { 16, 71, 0, 4, 0, UNI_CPRT } /* cprt */, - { 3, 3779, 2120, 14, 8, UNI_NV__3_SLASH_4 } /* numericvalue=7.500e-01 */, - { 3, 1102, 168, 4, 4, UNI_COPT } /* scx=qaac */, - { 1, 1102, 1802, 3, 5, UNI_MLYM } /* scx=mlym */, - { 3, 464, 4857, 2, 8, UNI_TAMILSUP } /* istamilsup */, - { 0, 2275, 0, 3, 0, UNI_IDC } /* idc */, - { 1, 6114, 847, 3, 7, UNI_LANA } /* sc=taitham */, - { 3, 3462, 1491, 12, 4, UNI_ETHIOPICEXTA } /* blk=ethiopicexta */, - { 2, 1102, 4962, 4, 14, UNI_ROHG } /* scx=hanifirohingya */, - { 0, 4450, 4590, 14, 9, UNI_CYRILLICEXTC } /* block=cyrillicextendedc */, - { 1, 2692, 1037, 10, 4, UNI_ARABICEXTB } /* blk=arabicextb */, - { 11, 6114, 1362, 3, 9, UNI_SAMR } /* sc=samaritan */, - { 0, 301, 0, 5, 0, UNI_ORYA } /* oriya */, - { 1, 1867, 934, 12, 2, -UNI_BIDIM } /* bidimirrored=f */, - { 0, 6687, 664, 22, 2, UNI_JG__MALAYALAMRA } /* joininggroup=malayalamra */, - { 1, 5136, 1539, 5, 9, UNI_MISCARROWS } /* blk=miscarrows */, - { 0, 1796, 666, 7, 4, UNI_SC__LIMB } /* script=limb */, - { 0, 313, 6842, 2, 14, UNI_MUSIC } /* inmusicalsymbols */, - { 0, 4355, 3285, 17, 6, UNI_HEBR } /* scriptextensions=hebrew */, - { 8, 8007, 8407, 7, 33, UNI_CJKCOMPATIDEOGRAPHSSUP } /* blk=cjkcompatibilityideographssupplement */, - { 0, 6114, 6134, 3, 10, UNI_SC__GLAG } /* sc=glagolitic */, - { 0, 1991, 2892, 11, 12, UNI_JT__T } /* joiningtype=transparent */, - { 4, 36, 0, 2, 0, UNI_VS } /* vs */, - { 0, 4355, 1227, 17, 7, UNI_MULT } /* scriptextensions=multani */, - { 4, 7660, 588, 17, 2, UNI_VS } /* variationselector=t */, - { 5, 1879, 1344, 4, 9, UNI_PALM } /* blk=palmyrene */, - { 0, 265, 356, 5, 2, UNI_CWKCF } /* cwkcf=y */, - { 2, 1796, 5907, 7, 4, UNI_SC__SINH } /* script=sinh */, - { 0, 8182, 140, 24, 2, UNI_INPC__NA } /* indicpositionalcategory=na */, - { 0, 313, 3991, 2, 7, UNI_BRAI } /* inbraille */, - { 1, 6069, 0, 22, 0, UNI_DIACRITICALSFORSYMBOLS } /* diacriticalsforsymbols */, - { 1, 2363, 1037, 10, 4, UNI_ETHIOPICEXTB } /* inethiopicextb */, - { 43, 4291, 57, 10, 2, UNI_LB__NS } /* linebreak=ns */, - { 12, 2344, 2680, 2, 2, UNI_VO__R } /* vo=r */, - { 2, 5087, 3151, 9, 3, UNI_WB__LE } /* wordbreak=le */, - { 0, 1102, 2740, 4, 4, UNI_COPT } /* scx=copt */, - { 0, 1796, 6103, 7, 9, UNI_XSUX } /* script=cuneiform */, - { 10, 2981, 347, 4, 2, UNI_IN__1_DOT_1 } /* in=v11 */, - { 7, 7823, 6352, 5, 18, UNI_CJKRADICALSSUP } /* incjkradicalssupplement */, - { 9, 1879, 3608, 4, 11, UNI_PHONETICEXT } /* blk=phoneticext */, - { 0, 3474, 1495, 6, 8, UNI_INJAVANESE } /* block=javanese */, - { 3, 6114, 4827, 3, 5, UNI_BAMU } /* sc=bamum */, - { 0, 464, 417, 2, 4, UNI_HANO } /* ishano */, - { 1, 1102, 200, 4, 4, UNI_TAML } /* scx=taml */, - { 4, 1796, 4418, 7, 6, UNI_SC__ZYYY } /* script=common */, - { 21, 464, 433, 2, 3, UNI_NKO } /* isnko */, - { 0, 334, 0, 2, 0, UNI_PD } /* pd */, - { 11, 3474, 4021, 6, 17, UNI_INDICSIYAQNUMBERS } /* block=indicsiyaqnumbers */, - { 1, 600, 2003, 5, 5, UNI_DT__NB } /* dt=nobreak */, - { 6, 1702, 4442, 8, 9, UNI_ARABICEXTB } /* isarabicextendedb */, - { 33, 7068, 602, 26, 3, -UNI_PCM } /* prependedconcatenationmark=no */, - { 2, 313, 1887, 2, 7, UNI_UCASEXT } /* inucasext */, - { 5, 2, 7908, 1, 29, UNI_CUNEIFORMNUMBERS } /* cuneiformnumbersandpunctuation */, - { 0, 1027, 0, 4, 0, UNI_YEZI } /* yezi */, - { 1, 1796, 208, 7, 4, UNI_TFNG } /* script=tfng */, - { 0, 1796, 98, 7, 4, UNI_SC__GURU } /* script=guru */, - { 0, 1796, 372, 7, 4, UNI_GOTH } /* script=goth */, - { 9, 343, 2138, 5, 2, UNI_WB__EB } /* ccc=133 */, - { 0, 464, 1227, 2, 4, UNI_MULT } /* ismult */, - { 0, 313, 7290, 2, 27, UNI_OCR } /* inopticalcharacterrecognition */, - { 3, 464, 875, 2, 5, UNI_UIDEO } /* isuideo */, - { 32, 6114, 5661, 3, 19, UNI_MERO } /* sc=meroitichieroglyphs */, - { 1, 3748, 4335, 14, 3, UNI_NV__13_SLASH_2 } /* numericvalue=13/2 */, - { 6, 3474, 530, 6, 6, UNI_INREJANG } /* block=rejang */, - { 6, 343, 1304, 4, 2, UNI_CCC__20 } /* ccc=20 */, - { 1, 5727, 0, 21, 0, UNI_PRTI } /* inscriptionalparthian */, - { 6, 4433, 4701, 12, 10, UNI_LATINEXTADDITIONAL } /* blk=latinextadditional */, - { 6, 4355, 540, 17, 6, UNI_TNSA } /* scriptextensions=tangsa */, - { 1, 1796, 1027, 7, 6, UNI_SC__YEZI } /* script=yezidi */, - { 0, 4355, 825, 17, 7, UNI_SHAW } /* scriptextensions=shavian */, - { 3, 6970, 0, 26, 0, UNI_HALFANDFULLFORMS } /* halfwidthandfullwidthforms */, - { 101, 1508, 0, 8, 0, UNI_UGAR } /* ugaritic */, - { 0, 6114, 301, 3, 5, UNI_SC__ORYA } /* sc=oriya */, - { 0, 4291, 102, 10, 2, UNI_LB__HL } /* linebreak=hl */, - { 0, 1879, 6134, 4, 20, UNI_GLAGOLITICSUP } /* blk=glagoliticsupplement */, - { 2, 536, 6276, 3, 6, UNI_SB__FO } /* sb=format */, - { 1, 8244, 6509, 9, 19, UNI_CJKCOMPATIDEOGRAPHSSUP } /* block=cjkcompatideographssup */, - { 2, 409, 278, 2, 1, UNI_di_values_index } /* di= */, - { 10, 1539, 8340, 3, 34, UNI_DIACRITICALSFORSYMBOLS } /* iscombiningdiacriticalmarksforsymbols */, - { 1, 313, 917, 2, 8, UNI_INBASSAVAH } /* inbassavah */, - { 56, 6944, 464, 24, 2, UNI_CCC__IS } /* canonicalcombiningclass=is */, - { 0, 464, 4500, 2, 15, UNI_UPPERCASELETTER } /* isuppercaseletter */, - { 0, 4291, 2549, 10, 10, UNI_LB__BA } /* linebreak=breakafter */, - { 2, 8007, 1434, 7, 7, UNI_CJKSTROKES } /* blk=cjkstrokes */, - { 1, 1065, 4335, 4, 3, UNI_NV__13_SLASH_2 } /* nv=13/2 */, - { 2, 2948, 602, 13, 3, UNI_COMPEX } /* nfcquickcheck=no */, - { 30, 8533, 4641, 7, 15, UNI_SYRIACSUP } /* block=syriacsupplement */, - { 0, 3351, 398, 13, 2, UNI_NV__16 } /* numericvalue=16 */, - { 0, 6114, 1191, 3, 7, UNI_SC__BENG } /* sc=bengali */, - { 1, 5886, 934, 21, 6, -UNI__PERL_NCHAR } /* noncharactercodepoint=false */, - { 1, 6114, 433, 3, 4, UNI_SC__NKO } /* sc=nkoo */, - { 0, 464, 4551, 2, 16, UNI_LINEARBSYLLABARY } /* islinearbsyllabary */, - { 2, 3450, 4442, 12, 9, UNI_CYRILLICEXTB } /* blk=cyrillicextendedb */, - { 6, 316, 602, 5, 3, -UNI_QMARK } /* qmark=no */, - { 0, 2981, 1070, 4, 2, UNI_IN__3_DOT_1 } /* in=v31 */, - { 0, 1377, 1624, 3, 7, UNI_WB__LE } /* wb=aletter */, - { 2, 464, 4962, 2, 4, UNI_HAN } /* ishani */, - { 0, 343, 391, 4, 2, UNI_CCC__26 } /* ccc=26 */, - { 1, 4291, 287, 10, 2, UNI_LB__NU } /* linebreak=nu */, - { 0, 4872, 3582, 9, 3, UNI_KANGXI } /* block=kangxi */, - { 0, 464, 1470, 2, 4, UNI_BUGI } /* isbugi */, - { 1, 1796, 421, 7, 4, UNI_KHMR } /* script=khmr */, - { 35, 2463, 934, 5, 6, -UNI_JOINC } /* joinc=false */, - { 1, 5116, 0, 20, 0, UNI_HLUW } /* anatolianhieroglyphs */, - { 6, 1879, 2986, 4, 14, UNI_INPSALTERPAHLAVI } /* blk=psalterpahlavi */, - { 6, 1879, 1657, 4, 11, UNI_INCYPROMINOAN } /* blk=cyprominoan */, - { 33, 6439, 0, 13, 0, UNI_ZNAMENNYMUSIC } /* znamennymusic */, - { 0, 257, 602, 4, 3, -UNI_CWCF } /* cwcf=no */, - { 5, 6379, 705, 13, 4, UNI_JG__NOON } /* joininggroup=noon */, - { 20, 1465, 355, 4, 2, UNI_wspace_values_index } /* space= */, - { 0, 2496, 705, 3, 4, UNI_JG__NOON } /* jg=noon */, - { 0, 1395, 4590, 5, 9, UNI_LATINEXTC } /* latinextendedc */, - { 17, 4355, 651, 17, 5, UNI_ADLM } /* scriptextensions=adlam */, - { 1, 2712, 934, 14, 2, -UNI_ECOMP } /* emojicomponent=f */, - { 7, 6114, 1133, 3, 4, UNI_VITH } /* sc=vith */, - { 0, 4500, 588, 9, 2, UNI_XPOSIXUPPER } /* uppercase=t */, - { 11, 343, 7359, 4, 4, UNI_CCC__216 } /* ccc=atar */, - { 2, 7068, 356, 26, 4, UNI_PCM } /* prependedconcatenationmark=yes */, - { 4, 875, 278, 5, 1, UNI_uideo_values_index } /* uideo= */, - { 4, 1879, 1326, 4, 9, UNI_INOLDTURKIC } /* blk=oldturkic */, - { 0, 21, 418, 1, 3, UNI_HANO } /* hano */, - { 0, 3474, 5825, 6, 12, UNI_SUNDANESESUP } /* block=sundanesesup */, - { 0, 5186, 588, 20, 5, UNI_EXTPICT } /* extendedpictographic=true */, - { 12, 6570, 2242, 3, 11, UNI_PLAYINGCARDS } /* inplayingcards */, - { 1, 1102, 1480, 4, 4, UNI_GEOR } /* scx=geor */, - { 1, 6011, 7851, 7, 20, UNI_ENCLOSEDALPHANUM } /* block=enclosedalphanumerics */, - { 10, 6379, 1982, 13, 9, UNI_JG__SYRIACWAW } /* joininggroup=syriacwaw */, - { 2, 3351, 891, 13, 2, UNI_NV__10 } /* numericvalue=10 */, - { 6, 5087, 369, 10, 2, UNI_WB__SQ } /* wordbreak=sq */, - { 0, 4996, 4170, 13, 4, UNI_JG__MANICHAEANFIVE } /* jg=manichaeanfive */, - { 4, 6025, 2733, 7, 13, UNI_INGREEK } /* block=greekandcoptic */, - { 1, 3669, 1144, 12, 3, UNI_JG__MALAYALAMBHA } /* jg=malayalambha */, - { 3, 6379, 7276, 13, 14, UNI_JG__HAMZAONHEHGOAL } /* joininggroup=tehmarbutagoal */, - { 1, 4291, 1465, 10, 5, UNI_LB__SP } /* linebreak=space */, - { 0, 3474, 721, 6, 7, UNI_INKANNADA } /* block=kannada */, - { 6, 4433, 5, 9, 4, UNI_LATINEXTG } /* blk=latinextg */, - { 12, 1395, 1646, 5, 4, UNI_LATINEXTD } /* latinextd */, - { 34, 8244, 8407, 9, 33, UNI_CJKCOMPATIDEOGRAPHSSUP } /* block=cjkcompatibilityideographssupplement */, - { 0, 6114, 1220, 3, 4, UNI_MAKA } /* sc=maka */, - { 0, 3474, 1037, 12, 4, UNI_ARABICEXTB } /* block=arabicextb */, - { 1, 464, 75, 2, 3, UNI_CWU } /* iscwu */, - { 2, 1011, 0, 2, 0, UNI_CI } /* ci */, - { 0, 8007, 1698, 7, 4, UNI_CJKEXTF } /* blk=cjkextf */, - { 4, 6114, 540, 3, 6, UNI_TNSA } /* sc=tangsa */, - { 0, 4355, 975, 17, 8, UNI_GURU } /* scriptextensions=gurmukhi */, - { 8, 464, 203, 2, 2, UNI_TITLE } /* islt */, - { 0, 2353, 7403, 10, 13, UNI_CYRILLICSUP } /* incyrillicsupplementary */, - { 0, 1410, 2074, 8, 2, UNI_CCC__129 } /* ccc=ccc129 */, - { 0, 2692, 3721, 9, 5, UNI_ARABICMATH } /* blk=arabicmath */, - { 0, 1879, 7385, 4, 28, UNI_PHONETICEXTSUP } /* blk=phoneticextensionssupplement */, - { 2, 7527, 383, 3, 2, UNI_LB__HY } /* lb=hy */, - { 0, 6114, 2740, 3, 6, UNI_SC__COPT } /* sc=coptic */, - { 0, 2353, 361, 3, 5, UNI_INCHAKMA } /* inchakma */, - { 0, 34, 3395, 1, 16, UNI_SARB } /* inoldsoutharabian */, - { 2, 7208, 2384, 9, 2, UNI__PERL_SURROGATE } /* category=cs */, - { 2, 1867, 602, 5, 2, -UNI_BIDIM } /* bidim=n */, - { 3, 7068, 934, 26, 6, -UNI_PCM } /* prependedconcatenationmark=false */, - { 1, 1879, 840, 4, 7, UNI_INTAGALOG } /* blk=tagalog */, - { 2, 1102, 421, 4, 4, UNI_KHMR } /* scx=khmr */, - { 20, 6774, 601, 24, 4, -UNI_DI } /* defaultignorablecodepoint=no */, - { 0, 1915, 933, 11, 3, -UNI_GRBASE } /* graphemebase=f */, - { 3, 464, 3309, 2, 15, UNI_MERC } /* ismeroiticcursive */, - { 18, 1102, 5322, 4, 4, UNI_CHER } /* scx=cher */, - { 1, 19, 3820, 2, 3, UNI_AGE__9 } /* age=9 */, - { 8, 6185, 0, 20, 0, UNI_NV__1000000 } /* numericvalue=1000000 */, - { 1, 887, 552, 5, 3, UNI_AGE__14 } /* age=14.0 */, - { 5, 2181, 766, 4, 2, UNI_NV__5_SLASH_6 } /* nv=5/6 */, - { 39, 1395, 1037, 5, 4, UNI_LATINEXTB } /* latinextb */, - { 0, 302, 0, 2, 0, UNI_RI } /* ri */, - { 0, 2441, 0, 13, 0, UNI_CASEDLETTER } /* iscasedletter */, - { 0, 7201, 0, 16, 0, UNI_gc_values_index } /* generalcategory= */, - { 0, 1377, 3411, 3, 12, UNI_WB__EX } /* wb=extendnumlet */, - { 1, 1879, 861, 4, 7, UNI_INTIBETAN } /* blk=tibetan */, - { 0, 3474, 6134, 6, 13, UNI_GLAGOLITICSUP } /* block=glagoliticsup */, - { 4, 3474, 5949, 6, 6, UNI_YIJING } /* block=yijing */, - { 1, 1383, 0, 4, 0, UNI_IDST } /* idst */, - { 0, 7317, 87, 10, 2, UNI_BC__ON } /* bidiclass=on */, - { 0, 1879, 301, 4, 5, UNI_INORIYA } /* blk=oriya */, - { 23, 6114, 735, 3, 7, UNI_SC__LINA } /* sc=lineara */, - { 1, 581, 398, 5, 2, UNI_CCC__216 } /* ccc=216 */, - { 0, 632, 933, 5, 7, -UNI_GRBASE } /* grbase=false */, - { 6, 6944, 0, 26, 0, UNI_CCC__27 } /* canonicalcombiningclass=27 */, - { 67, 5886, 356, 21, 4, UNI__PERL_NCHAR } /* noncharactercodepoint=yes */, - { 0, 600, 128, 3, 3, UNI_DT__MED } /* dt=med */, - { 0, 1879, 242, 4, 2, UNI_NB } /* blk=nb */, - { 0, 464, 425, 2, 4, UNI_LINA } /* islina */, - { 1, 464, 4122, 2, 9, UNI_XPOSIXLOWER } /* islowercase */, - { 0, 2973, 602, 5, 3, -UNI_EPRES } /* epres=no */, - { 7, 3474, 4442, 12, 9, UNI_ARABICEXTB } /* block=arabicextendedb */, - { 1, 7823, 0, 5, 0, UNI_CJK } /* incjk */, - { 0, 833, 588, 4, 2, UNI_TERM } /* term=t */, - { 0, 313, 1951, 2, 7, UNI_INSOGDIAN } /* insogdian */, - { 27, 3474, 242, 6, 2, UNI_NB } /* block=nb */, - { 0, 2310, 355, 12, 5, UNI_CI } /* caseignorable=yes */, - { 2, 1539, 3123, 3, 14, UNI_CONTROLPICTURES } /* iscontrolpictures */, - { 0, 2678, 0, 3, 0, UNI_bc_values_index } /* bc= */, - { 0, 7208, 1860, 9, 7, UNI_XPOSIXCNTRL } /* category=control */, - { 41, 2260, 552, 4, 3, UNI_IN__14 } /* in=14.0 */, - { 1, 4021, 0, 17, 0, UNI_INDICSIYAQNUMBERS } /* indicsiyaqnumbers */, - { 2, 3763, 2173, 14, 8, UNI_NV__1_SLASH_20 } /* numericvalue=5.000e-02 */, - { 1, 7132, 7937, 5, 29, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* blk=symbolsandpictographsextendeda */, - { 0, 2926, 1588, 3, 9, UNI_SMALLFORMS } /* insmallforms */, - { 65, 464, 244, 2, 4, UNI_ZYYY } /* iszyyy */, - { 0, 3474, 975, 6, 8, UNI_INGURMUKHI } /* block=gurmukhi */, - { 1, 2253, 560, 10, 3, UNI_IN__6 } /* presentin=6.0 */, - { 0, 8470, 48, 20, 1, UNI_VO__U } /* verticalorientation=u */, - { 4, 1102, 477, 4, 3, UNI_VAI } /* scx=vai */, - { 0, 536, 1591, 3, 2, UNI_LB__LF } /* sb=lf */, - { 0, 464, 188, 2, 4, UNI_SGNW } /* issgnw */, - { 0, 19, 4333, 2, 3, UNI_AGE__3 } /* age=3 */, - { 19, 2, 602, 3, 2, -UNI_CWL } /* cwl=n */, - { 1, 1710, 5100, 7, 4, UNI_XPOSIXSPACE } /* isspaceperl */, - { 5, 343, 348, 4, 2, UNI_CCC__18 } /* ccc=18 */, - { 1, 719, 3582, 5, 11, UNI_KANGXI } /* inkangxiradicals */, - { 0, 6944, 2074, 24, 2, UNI_CCC__29 } /* canonicalcombiningclass=29 */, - { 0, 2474, 1491, 9, 4, UNI_MYANMAREXTA } /* ismyanmarexta */, - { 2, 6114, 4582, 3, 8, UNI_SC__BOPO } /* sc=bopomofo */, - { 1, 1879, 433, 4, 3, UNI_INNKO } /* blk=nko */, - { 1, 3622, 4590, 7, 9, UNI_LATINEXTC } /* islatinextendedc */, - { 2, 1879, 6629, 4, 15, UNI_MODIFIERLETTERS } /* blk=modifierletters */, - { 3, 2726, 3223, 3, 13, UNI_XPOSIXDIGIT } /* gc=decimalnumber */, - { 5, 464, 524, 2, 6, UNI_PATSYN } /* ispatsyn */, - { 0, 2253, 566, 10, 3, UNI_IN__8 } /* presentin=8.0 */, - { 17, 313, 5806, 2, 9, UNI_INMONGOLIAN } /* inmongolian */, - { 4, 6239, 5970, 14, 8, UNI_BC__LRO } /* bc=lefttorightoverride */, - { 1, 154, 6878, 3, 12, UNI_GEOMETRICSHAPES } /* geometricshapes */, - { 1, 5990, 602, 21, 5, UNI_BPT__N } /* bidipairedbrackettype=none */, - { 2, 1102, 2986, 4, 14, UNI_PHLP } /* scx=psalterpahlavi */, - { 0, 3450, 8499, 5, 34, UNI_DIACRITICALSSUP } /* blk=combiningdiacriticalmarkssupplement */, - { 129, 1796, 951, 7, 8, UNI_SC__DUPL } /* script=duployan */, - { 0, 3474, 1371, 6, 6, UNI_INTHAANA } /* block=thaana */, - { 4, 4355, 666, 17, 4, UNI_LIMB } /* scriptextensions=limb */, - { 9, 409, 588, 3, 5, UNI_DIA } /* dia=true */, - { 0, 524, 934, 6, 6, -UNI_PATSYN } /* patsyn=false */, - { 2, 7208, 2581, 9, 9, UNI__PERL_SURROGATE } /* category=surrogate */, - { 0, 7208, 469, 9, 2, UNI_SO } /* category=so */, - { 0, 1879, 8078, 4, 18, UNI_IDEOGRAPHICSYMBOLS } /* blk=ideographicsymbols */, - { 1, 128, 0, 4, 0, UNI_MEDF } /* medf */, - { 2, 2392, 4567, 3, 15, UNI_MISCMATHSYMBOLSB } /* inmiscmathsymbolsb */, - { 0, 555, 0, 5, 0, UNI_AGE__5 } /* age=5 */, - { 0, 6944, 1650, 24, 7, UNI_CCC__1 } /* canonicalcombiningclass=overlay */, - { 0, 4355, 1326, 17, 9, UNI_ORKH } /* scriptextensions=oldturkic */, - { 8, 2496, 718, 3, 3, UNI_JG__AIN } /* jg=ain */, - { 0, 4355, 1220, 17, 4, UNI_MAKA } /* scriptextensions=maka */, - { 5, 1102, 1086, 4, 4, UNI_KTHI } /* scx=kthi */, - { 0, 75, 934, 3, 2, -UNI_CWU } /* cwu=f */, - { 0, 464, 421, 2, 4, UNI_KHMR } /* iskhmr */, - { 3, 513, 1781, 4, 4, UNI_NV__30000 } /* nv=30000 */, - { 4, 1796, 3435, 7, 15, UNI_ZANB } /* script=zanabazarsquare */, - { 2, 940, 0, 2, 0, UNI_CO } /* co */, - { 1, 6011, 8047, 7, 31, UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS } /* block=egyptianhieroglyphformatcontrols */, - { 4, 3622, 6890, 7, 9, UNI_LATINEXTE } /* islatinextendede */, - { 9, 2, 588, 3, 2, UNI_CWL } /* cwl=t */, - { 1, 1102, 4392, 4, 11, UNI_SGNW } /* scx=signwriting */, - { 3, 6011, 5797, 14, 9, UNI_ETHIOPICEXTA } /* block=ethiopicextendeda */, - { 1, 1702, 1695, 8, 3, UNI_ARABICPFB } /* isarabicpfb */, - { 2, 6379, 4998, 12, 17, UNI_JG__MANICHAEANTWENTY } /* joininggroup=manichaeantwenty */, - { 7, 3474, 1755, 6, 11, UNI_INMEDEFAIDRIN } /* block=medefaidrin */, - { 0, 7527, 880, 3, 7, UNI_LB__XX } /* lb=unknown */, - { 1, 464, 1344, 2, 9, UNI_PALM } /* ispalmyrene */, - { 13, 2802, 7851, 3, 20, UNI_ENCLOSEDALPHANUM } /* isenclosedalphanumerics */, - { 0, 3367, 2080, 14, 8, UNI_NV__9_SLASH_2 } /* numericvalue=4.500e+00 */, - { 1, 1702, 7474, 3, 26, UNI_ALPHABETICPF } /* isalphabeticpresentationforms */, - { 0, 4355, 901, 17, 8, UNI_ARMN } /* scriptextensions=armenian */, - { 0, 6114, 1657, 3, 11, UNI_SC__CPMN } /* sc=cyprominoan */, - { 0, 1796, 917, 7, 8, UNI_BASS } /* script=bassavah */, - { 1, 1796, 502, 7, 4, UNI_LYDI } /* script=lydi */, - { 19, 1879, 7290, 4, 27, UNI_OCR } /* blk=opticalcharacterrecognition */, - { 7, 4456, 0, 12, 0, UNI_CYRILLICEXTC } /* cyrillicextc */, - { 0, 5928, 1607, 3, 7, UNI_VO__U } /* vo=upright */, - { 3, 7473, 588, 10, 5, UNI_XPOSIXALPHA } /* alphabetic=true */, - { 2, 464, 36, 2, 2, UNI_VS } /* isvs */, - { 0, 7317, 3855, 10, 14, UNI_BC__EN } /* bidiclass=europeannumber */, - { 0, 1792, 0, 4, 0, UNI_MONG } /* mong */, - { 1, 1710, 1808, 3, 10, UNI_SORA } /* issorasompeng */, - { 9, 3474, 861, 6, 7, UNI_INTIBETAN } /* block=tibetan */, - { 2, 6570, 2688, 11, 4, UNI_INPC__TOPANDLEFT } /* inpc=topandleft */, - { 9, 47, 0, 4, 0, UNI_BUHD } /* buhd */, - { 21, 7201, 0, 16, 2, UNI_CASEDLETTER } /* generalcategory=l& */, - { 8, 3974, 0, 4, 0, UNI_IDSB } /* idsb */, - { 0, 1102, 983, 4, 4, UNI_HIRA } /* scx=hira */, - { 2, 5397, 0, 3, 0, UNI_PUA } /* pua */, - { 0, 8007, 6177, 6, 8, UNI_CJKSYMBOLS } /* blk=cjksymbols */, - { 0, 624, 0, 2, 0, UNI_CE } /* ce */, - { 0, 4355, 3637, 17, 4, UNI_LISU } /* scriptextensions=lisu */, - { 0, 1879, 2229, 4, 8, UNI_PHAISTOS } /* blk=phaistos */, - { 2, 464, 1590, 2, 2, UNI_LOWERCASELETTER } /* isll */, - { 3, 4355, 1144, 17, 9, UNI_BHKS } /* scriptextensions=bhaiksuki */, - { 0, 3462, 2336, 12, 8, UNI_ETHIOPICEXT } /* blk=ethiopicextended */, - { 2, 1687, 1310, 4, 7, UNI_ITAL } /* isolditalic */, - { 4, 1915, 588, 12, 2, UNI_GRBASE } /* graphemebase=t */, - { 13, 313, 1016, 3, 5, UNI_INTELUGU } /* intelugu */, - { 0, 3474, 7385, 6, 28, UNI_PHONETICEXTSUP } /* block=phoneticextensionssupplement */, - { 0, 7201, 3933, 16, 14, UNI_SK } /* generalcategory=modifiersymbol */, - { 1, 343, 692, 4, 3, UNI_CCC__214 } /* ccc=ata */, - { 5, 6114, 1571, 3, 10, UNI_SAUR } /* sc=saurashtra */, - { 9, 4355, 1086, 17, 4, UNI_KTHI } /* scriptextensions=kthi */, - { 19, 3474, 3309, 6, 15, UNI_INMEROITICCURSIVE } /* block=meroiticcursive */, - { 1, 6687, 1144, 22, 3, UNI_JG__MALAYALAMBHA } /* joininggroup=malayalambha */, - { 0, 1796, 3285, 7, 6, UNI_HEBR } /* script=hebrew */, - { 4, 3722, 356, 4, 2, UNI_MATH } /* math=y */, - { 1, 34, 4091, 1, 13, UNI_DIACRITICALS } /* indiacriticals */, - { 4, 313, 6439, 2, 13, UNI_ZNAMENNYMUSIC } /* inznamennymusic */, - { 28, 6944, 7342, 18, 7, UNI_CCC__R } /* canonicalcombiningclass=r */, - { 5, 7208, 5166, 9, 20, UNI_PC } /* category=connectorpunctuation */, - { 2, 1879, 502, 4, 6, UNI_INLYDIAN } /* blk=lydian */, - { 8, 6114, 1227, 3, 4, UNI_SC__MULT } /* sc=mult */, - { 0, 6114, 1344, 3, 9, UNI_PALM } /* sc=palmyrene */, - { 9, 1102, 618, 4, 7, UNI_ELYM } /* scx=elymaic */, - { 4, 1465, 587, 4, 3, UNI_XPOSIXSPACE } /* space=t */, - { 2, 1704, 7481, 4, 20, UNI_ARABICPFA } /* arabicpresentationformsa */, - { 2, 612, 4300, 2, 8, UNI_LB__ZW } /* lb=zwspace */, - { 0, 2712, 1548, 12, 3, UNI_ecomp_values_index } /* emojicomponent= */, - { 9, 464, 2729, 2, 5, UNI_C } /* isother */, - { 0, 8289, 0, 11, 0, UNI_CO } /* category=co */, - { 1, 3338, 3477, 11, 3, UNI_nfdqc_values_index } /* nfdquickcheck= */, - { 37, 302, 356, 2, 2, UNI_RI } /* ri=y */, - { 4, 1796, 15, 7, 4, UNI_SC__ADLM } /* script=adlm */, - { 0, 2496, 6164, 3, 9, UNI_JG__YEHBARREE } /* jg=yehbarree */, - { 0, 1102, 3396, 4, 15, UNI_SARB } /* scx=oldsoutharabian */, - { 80, 5586, 1591, 21, 2, UNI_LB__LF } /* graphemeclusterbreak=lf */, - { 0, 464, 4671, 2, 4, UNI_TALE } /* istale */, - { 0, 2392, 5038, 3, 18, UNI_MODIFIERTONELETTERS } /* inmodifiertoneletters */, - { 0, 7201, 259, 16, 2, UNI_CF } /* generalcategory=cf */, - { 5, 2496, 2972, 2, 2, UNI_JG__E } /* jg=e */, - { 0, 7823, 6352, 5, 11, UNI_CJKRADICALSSUP } /* incjkradicalssup */, - { 5, 2625, 934, 13, 6, -UNI_PATSYN } /* patternsyntax=false */, - { 36, 4355, 5661, 17, 19, UNI_MERO } /* scriptextensions=meroitichieroglyphs */, - { 1, 9, 0, 3, 0, UNI_OCR } /* ocr */, - { 3, 313, 5322, 2, 8, UNI_INCHEROKEE } /* incherokee */, - { 0, 3974, 588, 17, 2, UNI_IDSB } /* idsbinaryoperator=t */, - { 0, 7148, 562, 25, 2, UNI_CCC__107 } /* canonicalcombiningclass=107 */, - { 3, 1879, 681, 4, 5, UNI_INRUNIC } /* blk=runic */, - { 0, 2353, 1037, 10, 4, UNI_CYRILLICEXTB } /* incyrillicextb */, - { 4, 4355, 854, 17, 7, UNI_TAVT } /* scriptextensions=taiviet */, - { 3, 4450, 3123, 7, 14, UNI_CONTROLPICTURES } /* block=controlpictures */, - { 18, 4551, 0, 7, 0, UNI_LINB } /* linearb */, - { 8, 7688, 4990, 23, 6, UNI_JG__MANICHAEANSAMEKH } /* joininggroup=manichaeansamekh */, - { 9, 719, 2373, 4, 9, UNI_KATAKANAEXT } /* inkatakanaext */, - { 0, 1102, 5825, 4, 4, UNI_SUND } /* scx=sund */, - { 0, 343, 398, 4, 2, UNI_CCC__16 } /* ccc=16 */, - { 1, 581, 1303, 5, 2, UNI_CCC__AR } /* ccc=232 */, - { 0, 1777, 0, 7, 0, UNI_NV__1000 } /* nv=1000 */, - { 5, 3462, 8047, 5, 31, UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS } /* blk=egyptianhieroglyphformatcontrols */, - { 0, 4092, 0, 9, 0, UNI_DIA } /* diacritic */, - { 0, 6039, 2603, 7, 12, UNI_MISCTECHNICAL } /* block=misctechnical */, - { 6, 1796, 776, 7, 7, UNI_OLCK } /* script=olchiki */, - { 4, 3462, 6091, 5, 21, UNI_EARLYDYNASTICCUNEIFORM } /* blk=earlydynasticcuneiform */, - { 6, 2726, 3933, 3, 14, UNI_SK } /* gc=modifiersymbol */, - { 9, 3915, 934, 17, 6, -UNI_EPRES } /* emojipresentation=false */, - { 3, 4857, 0, 8, 0, UNI_TAMILSUP } /* tamilsup */, - { 0, 464, 4338, 2, 17, UNI_RI } /* isregionalindicator */, - { 2, 7823, 6509, 5, 16, UNI_CJKCOMPATIDEOGRAPHS } /* incjkcompatideographs */, - { 0, 3809, 1300, 14, 3, UNI_NV__9000 } /* numericvalue=9000 */, - { 3, 58, 2695, 2, 5, UNI_SC__ARAB } /* sc=arab */, - { 0, 34, 1667, 1, 12, UNI_DOMINO } /* indominotiles */, - { 0, 3974, 602, 17, 2, -UNI_IDSB } /* idsbinaryoperator=n */, - { 1, 1879, 6728, 4, 21, UNI_MEETEIMAYEKEXT } /* blk=meeteimayekextensions */, - { 1, 7431, 1303, 27, 2, UNI_CCC__32 } /* canonicalcombiningclass=ccc32 */, - { 5, 1102, 1614, 4, 4, UNI_WARA } /* scx=wara */, - { 0, 4355, 90, 17, 4, UNI_GREK } /* scriptextensions=grek */, - { 0, 1796, 909, 7, 8, UNI_BALI } /* script=balinese */, - { 1, 343, 4947, 4, 2, UNI_CCC__8 } /* ccc=kv */, - { 3, 7605, 0, 22, 0, UNI_LB__H3 } /* hangulsyllabletype=lvt */, - { 13, 6447, 0, 5, 0, UNI_MUSIC } /* music */, - { 0, 6114, 409, 3, 4, UNI_DIAK } /* sc=diak */, - { 5, 6379, 1736, 13, 3, UNI_JG__KAF } /* joininggroup=kaf */, - { 96, 5147, 4701, 19, 10, UNI_LATINEXTADDITIONAL } /* block=latinextendedadditional */, - { 69, 1796, 200, 7, 4, UNI_SC__TAML } /* script=taml */, - { 23, 6114, 192, 3, 4, UNI_SHAW } /* sc=shaw */, - { 11, 2205, 2145, 4, 8, UNI_NV__7_SLASH_8 } /* nv=8.750e-01 */, - { 0, 3823, 602, 16, 3, -UNI_STERM } /* sentenceterminal=no */, - { 0, 3748, 2617, 14, 8, UNI_NV__1_SLASH_10 } /* numericvalue=1.000e-01 */, - { 11, 2365, 5797, 8, 9, UNI_ETHIOPICEXTA } /* ethiopicextendeda */, - { 7, 4355, 618, 17, 7, UNI_ELYM } /* scriptextensions=elymaic */, - { 5, 3622, 1698, 7, 4, UNI_LATINEXTF } /* islatinextf */, - { 7, 7132, 1588, 5, 9, UNI_SMALLFORMS } /* blk=smallforms */, - { 14, 5087, 3594, 10, 2, UNI_WB__NL } /* wordbreak=nl */, - { 5, 756, 356, 6, 2, UNI_NFKCQC__Y } /* nfkcqc=y */, - { 0, 287, 0, 5, 0, UNI_NSHU } /* nushu */, - { 15, 8244, 0, 9, 0, UNI_CJK } /* block=cjk */, - { 1, 34, 2782, 1, 3, UNI_NO } /* isno */, - { 3, 313, 574, 2, 7, UNI_INAVESTAN } /* inavestan */, - { 1, 2428, 0, 6, 0, UNI_IPAEXT } /* ipaext */, - { 3, 1796, 27, 7, 4, UNI_AHOM } /* script=ahom */, - { 1, 3474, 1317, 6, 9, UNI_INOLDPERMIC } /* block=oldpermic */, - { 4, 2454, 5223, 4, 16, UNI_INPUNCTUATION } /* isgeneralpunctuation */, - { 1, 464, 7828, 2, 16, UNI_UIDEO } /* isunifiedideograph */, - { 0, 78, 80, 2, 2, UNI_CYRL } /* cyrl */, - { 0, 7018, 7481, 6, 20, UNI_ARABICPFA } /* inarabicpresentationformsa */, - { 17, 6402, 959, 14, 6, UNI_SB__EX } /* sentencebreak=extend */, - { 8, 296, 2128, 3, 9, UNI_NV__1_SLASH_32 } /* nv=3.125e-02 */, - { 21, 2, 8340, 1, 34, UNI_DIACRITICALSFORSYMBOLS } /* combiningdiacriticalmarksforsymbols */, - { 4, 6803, 0, 20, 0, UNI_CE } /* compositionexclusion */, - { 0, 14, 57, 1, 1, UNI_MN } /* mn */, - { 1, 1796, 735, 7, 7, UNI_SC__LINA } /* script=lineara */, - { 8, 2033, 356, 5, 4, UNI_XPOSIXALPHA } /* alpha=yes */, - { 3, 2474, 2382, 3, 10, UNI_MISCSYMBOLS } /* ismiscsymbols */, - { 2, 916, 587, 4, 3, UNI_EBASE } /* ebase=t */, - { 16, 2153, 1300, 4, 2, UNI_NV__400 } /* nv=400 */, - { 1, 5087, 3432, 10, 3, UNI_LB__ZWJ } /* wordbreak=zwj */, - { 1, 343, 464, 4, 2, UNI_CCC__IS } /* ccc=is */, - { 2, 24, 356, 3, 4, UNI_XPOSIXXDIGIT } /* hex=yes */, - { 0, 2454, 2733, 3, 13, UNI_INGREEK } /* isgreekandcoptic */, - { 27, 3474, 3885, 6, 17, UNI_INCAUCASIANALBANIAN } /* block=caucasianalbanian */, - { 8, 2153, 294, 4, 1, UNI_NV__44 } /* nv=44 */, - { 1, 916, 355, 4, 5, UNI_EBASE } /* ebase=yes */, - { 0, 6114, 3839, 3, 6, UNI_TANG } /* sc=tangut */, - { 5, 1548, 0, 3, 0, UNI_nt_values_index } /* nt= */, - { 11, 6011, 6091, 7, 21, UNI_EARLYDYNASTICCUNEIFORM } /* block=earlydynasticcuneiform */, - { 4, 644, 898, 3, 2, UNI_GCB__V } /* hst=v */, - { 0, 7132, 6052, 7, 13, UNI_SUPMATHOPERATORS } /* blk=supmathoperators */, - { 0, 3794, 6199, 14, 5, UNI_NV__800000 } /* numericvalue=800000 */, - { 1, 2253, 346, 9, 3, UNI_IN__11 } /* presentin=11 */, - { 14, 8276, 2728, 21, 6, UNI_INSC__OTHER } /* indicsyllabiccategory=other */, - { 18, 1867, 602, 5, 3, -UNI_BIDIM } /* bidim=no */, - { 41459, 6114, 593, 3, 7, UNI_DSRT } /* sc=deseret */, - { 5, 3474, 2229, 6, 12, UNI_PHAISTOS } /* block=phaistosdisc */, - { 0, 4355, 1344, 17, 4, UNI_PALM } /* scriptextensions=palm */, - { 1, 7431, 398, 27, 2, UNI_CCC__16 } /* canonicalcombiningclass=ccc16 */, - { 1, 6944, 353, 24, 2, UNI_CCC__9 } /* canonicalcombiningclass=vr */, - { 1, 1065, 294, 5, 2, UNI_NV__1_SLASH_40 } /* nv=1/40 */, - { 14, 1220, 0, 7, 0, UNI_MAKA } /* makasar */, - { 96, 2496, 6392, 3, 10, UNI_JG__AFRICANQAF } /* jg=africanqaf */, - { 10, 736, 5769, 3, 15, UNI_ENCLOSEDALPHANUM } /* inenclosedalphanum */, - { 0, 464, 4793, 2, 18, UNI_RUMI } /* isruminumeralsymbols */, - { 29, 5087, 2961, 10, 7, UNI_WB__NU } /* wordbreak=numeric */, - { 2, 1879, 3188, 4, 15, UNI_INIMPERIALARAMAIC } /* blk=imperialaramaic */, - { 9, 1216, 3641, 4, 10, UNI_KANASUP } /* kanasupplement */, - { 0, 3474, 7416, 6, 14, UNI_PUA } /* block=privateusearea */, - { 2, 313, 4962, 2, 14, UNI_INHANIFIROHINGYA } /* inhanifirohingya */, - { 11, 4355, 798, 17, 4, UNI_LANA } /* scriptextensions=lana */, - { 2, 1991, 1413, 11, 2, UNI_JT__C } /* joiningtype=c */, - { 1, 2363, 2336, 10, 8, UNI_ETHIOPICEXT } /* inethiopicextended */, - { 0, 464, 3285, 2, 6, UNI_HEBR } /* ishebrew */, - { 4, 3474, 6284, 6, 19, UNI_JAMOEXTB } /* block=hanguljamoextendedb */, - { 7, 4322, 294, 15, 1, UNI_NV__3_SLASH_4 } /* numericvalue=3/4 */, - { 49, 1879, 328, 8, 3, UNI_KANASUP } /* blk=kanasup */, - { 5, 464, 228, 2, 4, UNI_XPEO } /* isxpeo */, - { 0, 306, 356, 5, 2, UNI__PERL_PATWS } /* patws=y */, - { 1, 1102, 1951, 4, 4, UNI_SOGD } /* scx=sogd */, - { 4, 508, 1769, 3, 3, UNI_nfdqc_values_index } /* nfdqc= */, - { 2, 2802, 7851, 3, 29, UNI_ENCLOSEDALPHANUMSUP } /* isenclosedalphanumericsupplement */, - { 6, 6114, 6594, 3, 4, UNI_BRAH } /* sc=brah */, - { 0, 7201, 1860, 16, 7, UNI_XPOSIXCNTRL } /* generalcategory=control */, - { 0, 4783, 355, 9, 2, UNI_wspace_values_index } /* whitespace= */, - { 1, 3450, 7908, 5, 29, UNI_CUNEIFORMNUMBERS } /* blk=cuneiformnumbersandpunctuation */, - { 1, 3669, 0, 16, 0, UNI_JG__MALAYALAMNNNA } /* jg=malayalamnnna */, - { 0, 1383, 601, 6, 2, UNI_ids_values_index } /* idstart= */, - { 1, 296, 2073, 3, 2, UNI_NV__42 } /* nv=42 */, - { 0, 4322, 0, 16, 0, UNI_NV__3_SLASH_2 } /* numericvalue=3/2 */, - { 1, 6944, 5472, 24, 9, UNI_CCC__BL } /* canonicalcombiningclass=belowleft */, - { 3, 4006, 0, 15, 0, UNI_CURRENCYSYMBOLS } /* currencysymbols */, - { 32, 4355, 160, 17, 4, UNI_PHLP } /* scriptextensions=phlp */, - { 3, 7208, 2728, 8, 6, UNI_C } /* category=other */, - { 0, 7584, 3236, 18, 3, UNI_DT__ENC } /* decompositiontype=enc */, - { 0, 464, 302, 2, 2, UNI_RI } /* isri */, - { 2, 1879, 27, 4, 4, UNI_INAHOM } /* blk=ahom */, - { 1, 6749, 356, 25, 4, UNI_CWKCF } /* changeswhennfkccasefolded=yes */, - { 4, 1879, 1280, 4, 9, UNI_INNABATAEAN } /* blk=nabataean */, - { 9, 1977, 311, 5, 5, UNI_POSIXPRINT } /* posixprint */, - { 9, 8, 2332, 1, 7, UNI_GREEKEXT } /* greekext */, - { 5, 3053, 588, 13, 2, UNI_POSIXXDIGIT } /* asciihexdigit=t */, - { 33, 34, 4900, 1, 6, UNI_EMOJI } /* isemoji */, - { 2, 464, 681, 2, 5, UNI_RUNR } /* isrunic */, - { 40, 14, 6549, 1, 21, UNI_MISCTECHNICAL } /* miscellaneoustechnical */, - { 5, 1377, 0, 3, 0, UNI_wb_values_index } /* wb= */, - { 2, 1796, 1027, 7, 4, UNI_SC__YEZI } /* script=yezi */, - { 0, 5544, 934, 21, 6, -UNI_CWT } /* changeswhentitlecased=false */, - { 89, 3933, 2774, 6, 8, UNI_SK } /* modifiersymbol */, - { 2, 3654, 0, 11, 0, UNI_MC } /* spacingmark */, - { 1, 1975, 4500, 7, 5, UNI_POSIXUPPER } /* isposixupper */, - { 25, 275, 1837, 4, 8, UNI_WB__EB } /* gcb=ebasegaz */, - { 6, 6114, 437, 3, 4, UNI_OGAM } /* sc=ogam */, - { 4, 7880, 1698, 5, 4, UNI_CJKEXTF } /* iscjkextf */, - { 10, 6114, 1529, 3, 10, UNI_KHAR } /* sc=kharoshthi */, - { 0, 2153, 349, 4, 1, UNI_NV__48 } /* nv=48 */, - { 71, 12, 934, 3, 6, -UNI_PCM } /* pcm=false */, - { 1, 5099, 1472, 17, 3, UNI__PERL_CHARNAME_BEGIN } /* _perl_charname_begin */, - { 1, 1102, 3309, 4, 15, UNI_MERC } /* scx=meroiticcursive */, - { 8, 296, 2616, 3, 9, UNI_NV__1_SLASH_2 } /* nv=5.000e-01 */, - { 8, 3474, 6919, 6, 25, UNI_SYMBOLSFORLEGACYCOMPUTING } /* block=symbolsforlegacycomputing */, - { 0, 6944, 2094, 25, 2, UNI_CCC__202 } /* canonicalcombiningclass=202 */, - { 20, 5523, 588, 21, 2, UNI_CWL } /* changeswhenlowercased=t */, - { 2, 14, 2813, 1, 3, UNI_MAHJ } /* mahj */, - { 1, 1796, 530, 7, 6, UNI_RJNG } /* script=rejang */, - { 6, 4450, 60, 7, 3, UNI_INCHAM } /* block=cham */, - { 0, 959, 934, 8, 6, -UNI_EXT } /* extender=false */, - { 1, 1796, 4857, 7, 5, UNI_SC__TAML } /* script=tamil */, - { 4, 7473, 356, 10, 2, UNI_XPOSIXALPHA } /* alphabetic=y */, - { 0, 3351, 1069, 14, 2, UNI_NV__2_SLASH_3 } /* numericvalue=2/3 */, - { 8, 1383, 588, 4, 2, UNI_IDST } /* idst=t */, - { 2, 6114, 783, 3, 4, UNI_OSMA } /* sc=osma */, - { 0, 6379, 709, 13, 4, UNI_JG__SEEN } /* joininggroup=seen */, - { 5, 5607, 7221, 10, 17, UNI_IDENTIFIERSTATUS__RESTRICTED } /* identifierstatus=restricted */, - { 17, 4355, 3991, 17, 7, UNI_BRAI } /* scriptextensions=braille */, - { 0, 1879, 6833, 4, 14, UNI_BYZANTINEMUSIC } /* blk=byzantinemusic */, - { 1, 2692, 4918, 5, 9, UNI_ALCHEMICAL } /* blk=alchemical */, - { 4, 4355, 794, 17, 4, UNI_KALI } /* scriptextensions=kali */, - { 80, 464, 959, 2, 8, UNI_EXT } /* isextender */, - { 4, 464, 783, 2, 7, UNI_OSMA } /* isosmanya */, - { 0, 696, 5057, 3, 18, UNI_OTTOMANSIYAQNUMBERS } /* isottomansiyaqnumbers */, - { 15, 1796, 1280, 7, 9, UNI_NBAT } /* script=nabataean */, - { 33, 34, 3054, 1, 3, UNI_CI } /* isci */, - { 0, 5087, 3411, 10, 12, UNI_WB__EX } /* wordbreak=extendnumlet */, - { 4, 4355, 1529, 17, 10, UNI_KHAR } /* scriptextensions=kharoshthi */, - { 10, 600, 3249, 3, 5, UNI_DT__FIN } /* dt=final */, - { 8, 8182, 6574, 23, 20, UNI_INPC__TOPANDBOTTOMANDLEFT } /* indicpositionalcategory=topandbottomandleft */, - { 0, 5523, 934, 21, 6, -UNI_CWL } /* changeswhenlowercased=false */, - { 3, 536, 2928, 3, 3, UNI_SB__SE } /* sb=sep */, - { 0, 6379, 787, 13, 3, UNI_JG__NYA } /* joininggroup=nya */, - { 0, 661, 0, 5, 0, UNI_DOGR } /* dogra */, - { 0, 3351, 1303, 13, 2, UNI_NV__32 } /* numericvalue=32 */, - { 1, 6114, 868, 3, 4, UNI_SC__TIRH } /* sc=tirh */, - { 0, 3763, 1073, 15, 2, UNI_NV__5_SLASH_12 } /* numericvalue=5/12 */, - { 20, 3474, 840, 6, 7, UNI_INTAGALOG } /* block=tagalog */, - { 3, 3809, 1300, 14, 2, UNI_NV__900 } /* numericvalue=900 */, - { 1, 313, 5305, 3, 10, UNI_TAIXUANJING } /* intaixuanjing */, - { 41, 7660, 588, 17, 5, UNI_VS } /* variationselector=true */, - { 0, 1879, 477, 4, 3, UNI_INVAI } /* blk=vai */, - { 8, 7527, 546, 3, 2, UNI_EBASE } /* lb=eb */, - { 5, 6114, 1009, 3, 6, UNI_LYCI } /* sc=lycian */, - { 5, 1233, 5057, 3, 18, UNI_OTTOMANSIYAQNUMBERS } /* inottomansiyaqnumbers */, - { 0, 7688, 4186, 23, 4, UNI_JG__MANICHAEANRESH } /* joininggroup=manichaeanresh */, - { 0, 5, 6091, 1, 21, UNI_EARLYDYNASTICCUNEIFORM } /* earlydynasticcuneiform */, - { 0, 520, 1300, 4, 2, UNI_NV__700 } /* nv=700 */, - { 3, 3474, 681, 6, 5, UNI_INRUNIC } /* block=runic */, - { 0, 464, 1009, 2, 6, UNI_LYCI } /* islycian */, - { 0, 951, 0, 8, 0, UNI_DUPL } /* duployan */, - { 1, 4355, 5139, 16, 8, UNI_MYMR } /* scriptextensions=myanmar */, - { 9, 5136, 5797, 11, 9, UNI_MYANMAREXTA } /* blk=myanmarextendeda */, - { 1, 1102, 1271, 4, 9, UNI_SIND } /* scx=khudawadi */, - { 4, 4515, 0, 18, 0, UNI_IDST } /* idstrinaryoperator */, - { 34, 3651, 0, 14, 0, UNI_MN } /* nonspacingmark */, - { 9, 296, 6198, 3, 8, UNI_NV__10000000 } /* nv=10000000 */, - { 16, 7527, 153, 3, 2, UNI_LB__SG } /* lb=sg */, - { 66, 7828, 3150, 15, 2, UNI_uideo_values_index } /* unifiedideograph= */, - { 0, 7688, 4174, 23, 4, UNI_JG__MANICHAEANHETH } /* joininggroup=manichaeanheth */, - { 4, 3748, 1298, 15, 3, UNI_NV__1_SLASH_160 } /* numericvalue=1/160 */, - { 0, 1102, 1198, 4, 7, UNI_GRAN } /* scx=grantha */, - { 6, 6774, 588, 25, 2, UNI_DI } /* defaultignorablecodepoint=t */, - { 0, 437, 0, 4, 0, UNI_OGAM } /* ogam */, - { 2, 1102, 5139, 3, 8, UNI_MYMR } /* scx=myanmar */, - { 0, 600, 6944, 6, 5, UNI_DT__NONCANON } /* dt=noncanon */, - { 1, 7317, 3651, 10, 14, UNI_BC__NSM } /* bidiclass=nonspacingmark */, - { 0, 8007, 6334, 7, 18, UNI_CJKCOMPATFORMS } /* blk=cjkcompatibilityforms */, - { 5, 2463, 602, 5, 3, -UNI_JOINC } /* joinc=no */, - { 0, 1102, 1320, 4, 4, UNI_PERM } /* scx=perm */, - { 17, 1796, 1021, 7, 6, UNI_WCHO } /* script=wancho */, - { 12, 1102, 429, 4, 4, UNI_MRO } /* scx=mroo */, - { 16, 313, 2740, 2, 6, UNI_INCOPTIC } /* incoptic */, - { 0, 4355, 1571, 17, 4, UNI_SAUR } /* scriptextensions=saur */, - { 0, 464, 261, 2, 4, UNI_CWCM } /* iscwcm */, - { 1, 1796, 106, 7, 4, UNI_HMNG } /* script=hmng */, - { 7, 313, 4062, 2, 15, UNI_VEDICEXT } /* invedicextensions */, - { 0, 3351, 772, 13, 4, UNI_NV__17_SLASH_2 } /* numericvalue=17/2 */, - { 4, 1975, 4081, 7, 5, UNI_POSIXPUNCT } /* isposixpunct */, - { 26, 1440, 356, 2, 2, UNI_SD } /* sd=y */, - { 0, 3474, 1668, 6, 6, UNI_DOMINO } /* block=domino */, - { 10, 6112, 7459, 14, 15, UNI_INSC__CONSONANTSUCCEEDINGREPHA } /* insc=consonantsucceedingrepha */, - { 73, 3474, 7732, 6, 29, UNI_ENCLOSEDIDEOGRAPHICSUP } /* block=enclosedideographicsupplement */, - { 5, 2692, 6142, 8, 5, UNI_ARABICSUP } /* blk=arabicsup */, - { 22, 34, 4757, 1, 19, UNI_ZP } /* isparagraphseparator */, - { 0, 3809, 2157, 14, 8, UNI_NV__11_SLASH_12 } /* numericvalue=9.167e-01 */, - { 37, 296, 6967, 2, 3, UNI_NV__27 } /* nv=27 */, - { 1, 1516, 1037, 6, 4, UNI_KANAEXTB } /* iskanaextb */, - { 0, 608, 536, 2, 3, UNI_idsb_values_index } /* idsb= */, - { 4, 3053, 934, 13, 2, -UNI_POSIXXDIGIT } /* asciihexdigit=f */, - { 1, 37, 1256, 1, 6, UNI_SOYO } /* soyombo */, - { 2, 1410, 2263, 7, 2, UNI_CCC__14 } /* ccc=ccc14 */, - { 5, 7527, 184, 3, 2, UNI_LB__SA } /* lb=sa */, - { 1, 2392, 1052, 3, 7, UNI_INMAHAJANI } /* inmahajani */, - { 0, 1102, 1220, 4, 4, UNI_MAKA } /* scx=maka */, - { 0, 1383, 934, 7, 6, -UNI_IDS } /* idstart=false */, - { 1, 7527, 13, 3, 2, UNI_LB__CM } /* lb=cm */, - { 7, 464, 4392, 2, 11, UNI_SGNW } /* issignwriting */, - { 7, 1539, 1895, 3, 11, UNI_CHESSSYMBOLS } /* ischesssymbols */, - { 4, 1796, 1470, 7, 4, UNI_SC__BUGI } /* script=bugi */, - { 0, 1704, 8110, 6, 29, UNI_ARABICMATH } /* arabicmathematicalalphabeticsymbols */, - { 0, 24, 602, 3, 3, -UNI_XPOSIXXDIGIT } /* hex=no */, - { 1, 4355, 224, 17, 4, UNI_WCHO } /* scriptextensions=wcho */, - { 2, 5087, 703, 10, 2, UNI_WB__EB } /* wordbreak=em */, - { 0, 3474, 5117, 7, 19, UNI_INANATOLIANHIEROGLYPHS } /* block=anatolianhieroglyphs */, - { 2, 2392, 6549, 3, 21, UNI_MISCTECHNICAL } /* inmiscellaneoustechnical */, - { 0, 3474, 7500, 6, 17, UNI_ANCIENTGREEKMUSIC } /* block=ancientgreekmusic */, - { 3, 600, 369, 3, 3, UNI_DT__SQR } /* dt=sqr */, - { 1, 2033, 356, 5, 2, UNI_XPOSIXALPHA } /* alpha=y */, - { 1, 1710, 1588, 3, 9, UNI_SMALLFORMS } /* issmallforms */, - { 0, 2274, 587, 10, 6, UNI_XIDC } /* xidcontinue=true */, - { 2, 4322, 6215, 14, 8, UNI_NV__1_SLASH_320 } /* numericvalue=3.125e-03 */, - { 4, 4355, 4202, 17, 17, UNI_KITS } /* scriptextensions=khitansmallscript */, - { 0, 7182, 0, 3, 0, UNI_CJK } /* cjk */, - { 65, 1807, 0, 4, 0, UNI_SORA } /* sora */, - { 0, 3000, 602, 13, 2, -UNI_QMARK } /* quotationmark=n */, - { 5, 1879, 4081, 4, 11, UNI_INPUNCTUATION } /* blk=punctuation */, - { 0, 4291, 278, 9, 3, UNI_LB__B2 } /* linebreak=b2 */, - { 0, 5607, 0, 15, 0, UNI_identifiertype_values_index } /* identifiertype= */, - { 0, 1410, 1073, 7, 2, UNI_CCC__12 } /* ccc=ccc12 */, - { 1, 7201, 110, 16, 2, UNI_ZL } /* generalcategory=zl */, - { 17, 875, 934, 5, 2, -UNI_UIDEO } /* uideo=f */, - { 0, 1102, 220, 4, 4, UNI_TOTO } /* scx=toto */, - { 0, 296, 2074, 3, 2, UNI_NV__29 } /* nv=29 */, - { 41, 1879, 1390, 4, 10, UNI_ASCII } /* blk=basiclatin */, - { 7, 4776, 355, 16, 3, UNI__PERL_PATWS } /* patternwhitespace=y */, - { 1, 5087, 2265, 10, 9, UNI_WB__WSEGSPACE } /* wordbreak=wsegspace */, - { 0, 2726, 4122, 3, 15, UNI_LOWERCASELETTER } /* gc=lowercaseletter */, - { 1, 343, 292, 4, 2, UNI_CCC__30 } /* ccc=30 */, + { 2, 7011, 1317, 24, 2, UNI_CCC__32 } /* canonicalcombiningclass=32 */, + { 34, 1823, 35, 7, 4, UNI_BATK } /* script=batk */, + { 0, 6165, 537, 3, 4, UNI_TANG } /* sc=tang */, + { 1, 5156, 65, 10, 2, UNI_WB__MN } /* wordbreak=mn */, + { 0, 4360, 2966, 10, 11, UNI_LB__IN } /* linebreak=inseparable */, + { 0, 54, 1829, 2, 5, UNI_SC__MLYM } /* sc=mlym */, + { 8, 1667, 3325, 4, 6, UNI_INHEBREW } /* blk=hebrew */, + { 0, 220, 0, 4, 0, UNI_WCHO } /* wcho */, + { 1, 461, 4536, 2, 18, UNI_COPTICEPACTNUMBERS } /* iscopticepactnumbers */, + { 2, 4424, 663, 17, 5, UNI_LIMB } /* scriptextensions=limbu */, + { 1, 33, 189, 1, 3, UNI_SGNW } /* sgnw */, + { 0, 3490, 6193, 10, 5, UNI_CYRILLICSUP } /* blk=cyrillicsup */, + { 0, 6163, 2823, 5, 9, UNI_INSC__NONJOINER } /* insc=nonjoiner */, + { 3, 309, 590, 2, 7, UNI_DSRT } /* indeseret */, + { 0, 1667, 4819, 4, 8, UNI_DINGBATS } /* blk=dingbats */, + { 0, 5156, 366, 10, 2, UNI_WB__SQ } /* wordbreak=sq */, + { 1, 6618, 5125, 12, 5, UNI_INPC__TOPANDBOTTOM } /* inpc=topandbottom */, + { 0, 3832, 0, 14, 0, UNI_NV__5 } /* numericvalue=5 */, + { 5, 6165, 746, 3, 4, UNI_MARC } /* sc=marc */, + { 1, 940, 599, 6, 3, -UNI_COMPEX } /* compex=no */, + { 0, 1823, 5391, 7, 8, UNI_CHER } /* script=cherokee */, + { 0, 1994, 934, 7, 6, -UNI_RADICAL } /* radical=false */, + { 1, 7274, 248, 9, 2, UNI_CN } /* category=cn */, + { 16, 30, 4190, 1, 3, UNI_LO } /* islo */, + { 1, 461, 3706, 2, 14, UNI_MN } /* isnonspacingmark */, + { 3, 7591, 1479, 3, 5, UNI_LB__SP } /* lb=space */, + { 0, 8246, 0, 24, 0, UNI_inpc_values_index } /* indicpositionalcategory= */, + { 0, 6450, 1613, 14, 2, UNI_SB__FO } /* sentencebreak=fo */, + { 4, 30, 3094, 1, 3, UNI_CI } /* isci */, + { 0, 2432, 5107, 3, 18, UNI_MODIFIERTONELETTERS } /* inmodifiertoneletters */, + { 0, 2494, 5863, 7, 6, UNI_GEORGIANSUP } /* isgeorgiansup */, + { 0, 608, 0, 4, 0, UNI_ELBA } /* elba */, + { 2, 7267, 1926, 16, 6, UNI_S } /* generalcategory=symbol */, + { 0, 3635, 204, 7, 2, UNI_LATINEXTF } /* latinextf */, + { 3, 683, 0, 5, 0, UNI_TAKR } /* takri */, + { 1, 339, 1316, 5, 2, UNI_CCC__103 } /* ccc=103 */, + { 1, 6427, 6215, 13, 9, UNI_JG__YEHBARREE } /* joininggroup=yehbarree */, + { 1, 6165, 446, 3, 4, UNI_PHLI } /* sc=phli */, + { 0, 309, 1509, 2, 8, UNI_INJAVANESE } /* injavanese */, + { 6, 1198, 377, 5, 4, UNI_CJKEXTH } /* incjkexth */, + { 5, 8246, 8507, 23, 7, UNI_INPC__BOTTOM } /* indicpositionalcategory=bottom */, + { 2, 1102, 216, 4, 4, UNI_TOTO } /* scx=toto */, + { 1, 1801, 0, 6, 0, UNI_NV__100 } /* nv=100 */, + { 0, 1272, 358, 3, 5, UNI_CAKM } /* ischakma */, + { 4, 1102, 868, 4, 4, UNI_TIRH } /* scx=tirh */, + { 16, 1823, 3325, 7, 4, UNI_HEBR } /* script=hebr */, + { 24, 7887, 0, 22, 0, UNI_CJK } /* incjkunifiedideographs */, + { 3, 461, 6581, 2, 16, UNI_INDICNUMBERFORMS } /* isindicnumberforms */, + { 14, 5031, 0, 4, 0, UNI_HAN } /* hani */, + { 0, 3001, 3001, 12, 7, UNI_NT__NU } /* numerictype=numeric */, + { 32464, 4502, 4659, 9, 9, UNI_LATINEXTC } /* blk=latinextendedc */, + { 4, 8601, 8001, 7, 29, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* block=symbolsandpictographsextendeda */, + { 2, 2718, 305, 3, 2, UNI_BC__WS } /* bc=ws */, { 0, 2, 933, 1, 3, -UNI_CE } /* ce=f */, - { 2, 3474, 997, 6, 6, UNI_INKAITHI } /* block=kaithi */, - { 0, 5607, 6774, 15, 16, UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE } /* identifiertype=defaultignorable */, - { 6, 5748, 6052, 5, 13, UNI_SUPMATHOPERATORS } /* insupmathoperators */, - { 0, 7431, 585, 28, 2, UNI_CCC__122 } /* canonicalcombiningclass=ccc122 */, - { 2, 2726, 4598, 3, 16, UNI_PE } /* gc=closepunctuation */, - { 1, 464, 2973, 2, 5, UNI_EPRES } /* isepres */, - { 0, 3593, 4464, 7, 4, UNI_LATINEXTC } /* inlatinextc */, - { 0, 2463, 356, 11, 4, UNI_JOINC } /* joincontrol=yes */, - { 2, 313, 4827, 2, 8, UNI_BAMUMSUP } /* inbamumsup */, - { 0, 4355, 2740, 17, 6, UNI_COPT } /* scriptextensions=coptic */, - { 21, 24, 602, 3, 2, -UNI_XPOSIXXDIGIT } /* hex=n */, - { 12, 3474, 7020, 6, 24, UNI_ARABICPFB } /* block=arabicpresentationformsb */, - { 0, 313, 6031, 2, 8, UNI_INGEORGIAN } /* ingeorgian */, - { 0, 6114, 666, 3, 4, UNI_SC__LIMB } /* sc=limb */, - { 0, 464, 6970, 2, 26, UNI_HALFANDFULLFORMS } /* ishalfwidthandfullwidthforms */, - { 0, 8007, 6505, 29, 5, UNI_CJKEXTC } /* blk=cjkunifiedideographsextensionc */, - { 2, 464, 3915, 2, 17, UNI_EPRES } /* isemojipresentation */, - { 18, 5087, 5718, 10, 9, UNI_WB__EB } /* wordbreak=emodifier */, - { 0, 1796, 1144, 7, 9, UNI_BHKS } /* script=bhaiksuki */, - { 1, 8533, 4538, 16, 13, UNI_SUPPUNCTUATION } /* block=supplementalpunctuation */, - { 0, 7527, 5, 3, 2, UNI_LB__EX } /* lb=ex */, - { 1, 7201, 602, 15, 2, UNI_N } /* generalcategory=n */, - { 10, 4355, 6728, 17, 11, UNI_MTEI } /* scriptextensions=meeteimayek */, - { 8, 1065, 3777, 4, 2, UNI_NV__1_SLASH_8 } /* nv=1/8 */, - { 1, 313, 3885, 2, 17, UNI_INCAUCASIANALBANIAN } /* incaucasianalbanian */, - { 6, 2496, 2519, 3, 10, UNI_JG__KNOTTEDHEH } /* jg=knottedheh */, - { 3, 3722, 602, 4, 3, -UNI_MATH } /* math=no */, - { 1, 1879, 4582, 4, 11, UNI_BOPOMOFOEXT } /* blk=bopomofoext */, - { 0, 316, 588, 5, 2, UNI_QMARK } /* qmark=t */, - { 0, 252, 0, 5, 0, UNI_XPOSIXCNTRL } /* cntrl */, - { 3, 6944, 692, 24, 3, UNI_CCC__214 } /* canonicalcombiningclass=ata */, - { 2, 7605, 3178, 20, 10, UNI_GCB__L } /* hangulsyllabletype=leadingjamo */, - { 0, 2485, 3060, 6, 6, UNI_XPOSIXXDIGIT } /* xposixxdigit */, - { 2, 3450, 7908, 5, 15, UNI_CUNEIFORMNUMBERS } /* blk=cuneiformnumbers */, - { 0, 6774, 934, 25, 2, -UNI_DI } /* defaultignorablecodepoint=f */, - { 1, 464, 180, 2, 4, UNI_RUNR } /* isrunr */, - { 67, 7201, 3654, 16, 11, UNI_MC } /* generalcategory=spacingmark */, - { 0, 5846, 0, 19, 0, UNI_SUPARROWSC } /* supplementalarrowsc */, - { 2, 313, 477, 2, 3, UNI_INVAI } /* invai */, - { 24, 7208, 4758, 9, 18, UNI_ZP } /* category=paragraphseparator */, - { 10, 464, 6629, 2, 14, UNI_LM } /* ismodifierletter */, - { 1, 1975, 1638, 3, 8, UNI_POSIXSPACE } /* isperlspace */, - { 0, 4077, 0, 15, 0, UNI_PD } /* dashpunctuation */, - { 1, 24, 1104, 2, 3, UNI_XPOSIXXDIGIT } /* hex=t */, - { 8, 6114, 469, 3, 4, UNI_SOGO } /* sc=sogo */, - { 1, 600, 946, 3, 5, UNI_DT__SUP } /* dt=super */, - { 0, 464, 8592, 2, 43, UNI_UCASEXTA } /* isunifiedcanadianaboriginalsyllabicsextendeda */, - { 1, 4901, 587, 16, 3, UNI_EBASE } /* emojimodifierbase=t */, - { 8, 3794, 1300, 14, 2, UNI_NV__800 } /* numericvalue=800 */, - { 0, 7880, 4611, 28, 4, UNI_CJKEXTF } /* iscjkunifiedideographsextensionf */, - { 18, 3722, 0, 4, 0, UNI_MATH } /* math */, - { 0, 6379, 7262, 13, 14, UNI_JG__NOJOININGGROUP } /* joininggroup=nojoininggroup */, - { 22, 887, 0, 8, 0, UNI_AGE__10 } /* age=10.0 */, - { 2, 409, 4844, 2, 13, UNI_DIACRITICALSSUP } /* diacriticalssup */, - { 0, 184, 0, 4, 0, UNI_SAMR } /* samr */, - { 0, 6039, 2030, 7, 11, UNI_MATHALPHANUM } /* block=mathalphanum */, - { 8, 1410, 3365, 7, 2, UNI_CCC__36 } /* ccc=ccc36 */, - { 0, 4433, 5584, 15, 3, UNI_LATINEXTG } /* blk=latinextendedg */, - { 72, 1539, 8150, 3, 24, UNI_DIACRITICALS } /* iscombiningdiacriticalmarks */, - { 0, 3593, 0, 11, 0, UNI_LATINEXTE } /* inlatinexte */, - { 9, 794, 0, 4, 0, UNI_KALI } /* kali */, - { 0, 464, 1867, 2, 5, UNI_BIDIM } /* isbidim */, - { 3, 7201, 273, 16, 2, UNI_ZP } /* generalcategory=zp */, - { 0, 1796, 540, 7, 6, UNI_TNSA } /* script=tangsa */, - { 32, 1382, 601, 7, 2, UNI_xids_values_index } /* xidstart= */, - { 16, 1065, 764, 4, 2, UNI_NV__1_SLASH_2 } /* nv=1/2 */, - { 7, 1796, 120, 7, 3, UNI_LAO } /* script=lao */, - { 4, 1977, 2033, 5, 5, UNI_POSIXALPHA } /* posixalpha */, - { 6, 464, 2812, 2, 4, UNI_MAHJ } /* ismahj */, - { 4, 1102, 437, 4, 4, UNI_OGAM } /* scx=ogam */, - { 0, 3474, 4582, 6, 8, UNI_INBOPOMOFO } /* block=bopomofo */, - { 0, 8244, 0, 26, 0, UNI_CJK } /* block=cjkunifiedideographs */, - { 6, 2, 601, 2, 2, UNI_cwt_values_index } /* cwt= */, - { 0, 3228, 0, 5, 0, UNI_XPOSIXALNUM } /* alnum */, - { 0, 464, 1965, 2, 10, UNI_YIRADICALS } /* isyiradicals */, - { 0, 34, 1190, 1, 5, UNI_BENG } /* isbeng */, - { 4, 313, 5949, 2, 21, UNI_YIJING } /* inyijinghexagramsymbols */, - { 0, 2310, 5620, 12, 4, -UNI_CI } /* caseignorable=no */, - { 5, 1102, 184, 4, 4, UNI_SAMR } /* scx=samr */, - { 1, 6379, 1046, 13, 5, UNI_JG__KHAPH } /* joininggroup=khaph */, - { 0, 1796, 465, 7, 4, UNI_SC__SHRD } /* script=shrd */, - { 1, 536, 285, 3, 2, UNI_SB__XX } /* sb=xx */, - { 6, 464, 6594, 2, 6, UNI_BRAH } /* isbrahmi */, - { 0, 313, 890, 2, 5, UNI_IN__10 } /* in=10.0 */, - { 0, 3474, 3637, 6, 4, UNI_INLISU } /* block=lisu */, - { 0, 1915, 0, 5, 0, UNI_XPOSIXGRAPH } /* graph */, - { 0, 6011, 2336, 14, 8, UNI_ETHIOPICEXT } /* block=ethiopicextended */, - { 3, 3474, 2217, 6, 12, UNI_INOLDHUNGARIAN } /* block=oldhungarian */, - { 1, 2726, 4137, 3, 15, UNI_PS } /* gc=openpunctuation */, - { 1, 3474, 7377, 6, 8, UNI_INKATAKANA } /* block=katakana */, - { 14, 5844, 5858, 5, 7, UNI_SUPARROWSC } /* issuparrowsc */, - { 41, 1102, 82, 4, 4, UNI_DSRT } /* scx=dsrt */, - { 1, 6114, 220, 3, 4, UNI_TOTO } /* sc=toto */, - { 21, 895, 1303, 5, 2, UNI_AGE__3_DOT_2 } /* age=v32 */, - { 17, 916, 5620, 4, 4, -UNI_EBASE } /* ebase=no */, - { 0, 1702, 0, 8, 0, UNI_ARAB } /* isarabic */, - { 20, 1102, 5340, 4, 4, UNI_DEVA } /* scx=deva */, - { 2, 409, 588, 3, 2, UNI_DIA } /* dia=t */, - { 9, 313, 890, 2, 3, UNI_IN__10 } /* in=10 */, - { 1, 4355, 51, 17, 4, UNI_CAKM } /* scriptextensions=cakm */, - { 50, 1059, 356, 6, 2, UNI_DT__NONE } /* nfkdqc=y */, - { 2, 6114, 917, 3, 4, UNI_BASS } /* sc=bass */, - { 1, 7044, 2775, 16, 8, UNI_DIACRITICALSFORSYMBOLS } /* combiningmarksforsymbols */, - { 0, 464, 1887, 2, 4, UNI_UCAS } /* isucas */, - { 0, 4291, 3691, 10, 13, UNI_LB__PR } /* linebreak=prefixnumeric */, - { 0, 3794, 0, 15, 0, UNI_NV__80 } /* numericvalue=80 */, - { 6, 4355, 861, 17, 7, UNI_TIBT } /* scriptextensions=tibetan */, - { 4, 6114, 47, 3, 4, UNI_SC__BUHD } /* sc=buhd */, - { 0, 3474, 1845, 6, 11, UNI_YISYLLABLES } /* block=yisyllables */, - { 1, 3474, 6303, 6, 23, UNI_COMPATJAMO } /* block=hangulcompatibilityjamo */, - { 1, 1539, 3869, 3, 16, UNI_UCAS } /* iscanadiansyllabics */, - { 1, 3462, 5769, 5, 18, UNI_ENCLOSEDALPHANUMSUP } /* blk=enclosedalphanumsup */, - { 82, 2474, 1539, 3, 9, UNI_MISCARROWS } /* ismiscarrows */, - { 10, 5340, 0, 18, 0, UNI_DEVANAGARIEXT } /* devanagariextended */, - { 11, 7584, 4533, 18, 7, UNI_DT__INIT } /* decompositiontype=initial */, - { 21, 4355, 4436, 16, 6, UNI_LATN } /* scriptextensions=latin */, - { 35, 3474, 1657, 6, 11, UNI_INCYPROMINOAN } /* block=cyprominoan */, - { 0, 464, 880, 2, 7, UNI_ZZZZ } /* isunknown */, - { 1, 343, 351, 4, 2, UNI_CCC__91 } /* ccc=91 */, - { 0, 4901, 5620, 16, 4, -UNI_EBASE } /* emojimodifierbase=no */, - { 5, 3474, 6142, 10, 12, UNI_ARABICSUP } /* block=arabicsupplement */, - { 0, 1879, 1021, 4, 6, UNI_INWANCHO } /* blk=wancho */, - { 0, 4355, 5907, 17, 4, UNI_SINH } /* scriptextensions=sinh */, - { 6, 2454, 5812, 7, 13, UNI_GEORGIANSUP } /* isgeorgiansupplement */, - { 0, 313, 3672, 2, 9, UNI_INMALAYALAM } /* inmalayalam */, - { 0, 3748, 294, 15, 2, UNI_NV__1_SLASH_40 } /* numericvalue=1/40 */, - { 9, 1796, 337, 7, 4, UNI_CARI } /* script=cari */, - { 72, 313, 1125, 2, 8, UNI_INTIFINAGH } /* intifinagh */, - { 1, 343, 0, 4, 0, UNI_ccc_values_index } /* ccc= */, - { 0, 6114, 1205, 3, 9, UNI_SC__QAAI } /* sc=inherited */, - { 20, 1796, 1205, 7, 9, UNI_SC__QAAI } /* script=inherited */, - { 1, 3748, 3777, 14, 2, UNI_NV__1_SLASH_8 } /* numericvalue=1/8 */, - { 1, 2712, 356, 5, 4, UNI_EMOJI } /* emoji=yes */, - { 3, 1102, 742, 4, 7, UNI_MAND } /* scx=mandaic */, - { 17, 6112, 6368, 12, 11, UNI_INSC__CONSONANTSUBJOINED } /* insc=consonantsubjoined */, - { 0, 316, 934, 5, 2, -UNI_QMARK } /* qmark=f */, - { 2, 1102, 132, 4, 4, UNI_MTEI } /* scx=mtei */, - { 0, 3474, 4582, 6, 16, UNI_BOPOMOFOEXT } /* block=bopomofoextended */, - { 2, 3474, 6538, 6, 11, UNI_NUMBERFORMS } /* block=numberforms */, - { 0, 464, 1785, 2, 11, UNI_HMNG } /* ispahawhhmong */, - { 9, 7208, 3061, 9, 5, UNI_XPOSIXDIGIT } /* category=digit */, - { 8, 296, 2138, 3, 2, UNI_NV__33 } /* nv=33 */, - { 4, 1796, 19, 7, 4, UNI_AGHB } /* script=aghb */, - { 0, 5718, 602, 4, 3, -UNI_EMOD } /* emod=no */, - { 5, 875, 356, 5, 4, UNI_UIDEO } /* uideo=yes */, - { 0, 4355, 1927, 17, 12, UNI_GONG } /* scriptextensions=gunjalagondi */, - { 0, 2678, 1687, 14, 7, UNI_BC__RLI } /* bc=righttoleftisolate */, - { 0, 1410, 2138, 8, 2, UNI_WB__EB } /* ccc=ccc133 */, - { 9, 6114, 140, 3, 4, UNI_NARB } /* sc=narb */, - { 0, 464, 337, 2, 6, UNI_CARI } /* iscarian */, - { 0, 6114, 429, 3, 4, UNI_MRO } /* sc=mroo */, - { 0, 464, 6447, 2, 5, UNI_MUSIC } /* ismusic */, - { 2, 2217, 0, 12, 0, UNI_HUNG } /* oldhungarian */, - { 4, 1102, 1495, 4, 4, UNI_JAVA } /* scx=java */, - { 0, 8182, 6574, 23, 13, UNI_INPC__TOPANDBOTTOM } /* indicpositionalcategory=topandbottom */, - { 0, 3351, 1781, 14, 4, UNI_NV__20000 } /* numericvalue=20000 */, - { 9, 1796, 1951, 7, 7, UNI_SC__SOGD } /* script=sogdian */, - { 2, 4092, 934, 9, 6, -UNI_DIA } /* diacritic=false */, - { 0, 296, 2063, 3, 9, UNI_NV__1_SLASH_8 } /* nv=1.250e-01 */, - { 13, 328, 5858, 3, 7, UNI_SUPARROWSC } /* suparrowsc */, - { 0, 4355, 321, 17, 5, UNI_TALE } /* scriptextensions=taile */, - { 3, 1879, 1335, 4, 9, UNI_INOLDUYGHUR } /* blk=olduyghur */, - { 8, 3474, 4962, 6, 14, UNI_INHANIFIROHINGYA } /* block=hanifirohingya */, - { 0, 1796, 742, 7, 7, UNI_SC__MAND } /* script=mandaic */, - { 1, 4996, 4182, 13, 4, UNI_JG__MANICHAEANQOPH } /* jg=manichaeanqoph */, - { 0, 6114, 338, 4, 3, UNI_CARI } /* sc=cari */, - { 1, 832, 0, 5, 0, UNI_STERM } /* sterm */, - { 20, 2729, 1899, 5, 6, UNI_SO } /* othersymbol */, - { 0, 6114, 721, 3, 7, UNI_SC__KNDA } /* sc=kannada */, - { 2, 1967, 356, 7, 2, UNI_RADICAL } /* radical=y */, - { 0, 2726, 110, 3, 2, UNI_ZL } /* gc=zl */, - { 11, 3474, 6533, 6, 16, UNI_INDICNUMBERFORMS } /* block=indicnumberforms */, - { 0, 6749, 588, 25, 5, UNI_CWKCF } /* changeswhennfkccasefolded=true */, - { 1, 296, 0, 3, 0, UNI_nv_values_index } /* nv= */, - { 0, 7688, 4182, 23, 4, UNI_JG__MANICHAEANQOPH } /* joininggroup=manichaeanqoph */, - { 1, 3351, 763, 13, 3, UNI_NV__1_SLASH_2 } /* numericvalue=1/2 */, - { 0, 6944, 182, 24, 2, UNI_CCC__0 } /* canonicalcombiningclass=nr */, - { 0, 6114, 496, 3, 6, UNI_SC__KHOJ } /* sc=khojki */, - { 1, 4726, 6199, 14, 5, UNI_NV__600000 } /* numericvalue=600000 */, - { 51, 513, 299, 4, 1, UNI_NV__39 } /* nv=39 */, - { 3, 7182, 2335, 2, 5, UNI_CJKEXTE } /* cjkexte */, - { 2, 1548, 287, 3, 2, UNI_NT__NU } /* nt=nu */, - { 6, 1879, 6462, 4, 24, UNI_HIGHPUSURROGATES } /* blk=highprivateusesurrogates */, - { 17, 1796, 47, 7, 4, UNI_SC__BUHD } /* script=buhd */, - { 2, 343, 522, 3, 2, UNI_CCC__7 } /* ccc=7 */, - { 1, 555, 346, 3, 3, UNI_AGE__11 } /* age=11 */, - { 3, 1879, 4827, 4, 8, UNI_BAMUMSUP } /* blk=bamumsup */, - { 0, 7208, 647, 8, 2, UNI_L } /* category=l */, - { 11, 2890, 588, 2, 2, UNI_JT__T } /* jt=t */, - { 6, 4450, 1037, 14, 4, UNI_CYRILLICEXTB } /* block=cyrillicextb */, - { 4, 4872, 1491, 10, 4, UNI_KANAEXTA } /* block=kanaexta */, - { 6, 1879, 8592, 4, 42, UNI_UCASEXT } /* blk=unifiedcanadianaboriginalsyllabicsextended */, - { 0, 6114, 5907, 3, 4, UNI_SC__SINH } /* sc=sinh */, - { 0, 6944, 585, 25, 2, UNI_CCC__BR } /* canonicalcombiningclass=222 */, - { 2, 4827, 328, 5, 3, UNI_BAMUMSUP } /* bamumsup */, - { 3, 823, 0, 4, 0, UNI_DASH } /* dash */, - { 18, 600, 1823, 3, 3, UNI_DT__SUB } /* dt=sub */, - { 34, 7605, 1847, 22, 8, UNI_LB__H3 } /* hangulsyllabletype=lvtsyllable */, - { 1, 8244, 3571, 9, 11, UNI_CJKCOMPATFORMS } /* block=cjkcompatforms */, - { 1, 1377, 1882, 2, 3, UNI_WB__KA } /* wb=ka */, - { 1, 3915, 588, 17, 5, UNI_EPRES } /* emojipresentation=true */, - { 0, 1075, 2080, 4, 8, UNI_NV__5_SLASH_2 } /* nv=2.500e+00 */, - { 8, 6944, 3107, 24, 5, UNI_CCC__A } /* canonicalcombiningclass=above */, - { 1, 6402, 2961, 14, 7, UNI_SB__NU } /* sentencebreak=numeric */, - { 2, 691, 0, 5, 0, UNI_BATK } /* batak */, - { 17, 2483, 311, 8, 5, UNI_XPOSIXPRINT } /* isxposixprint */, - { 64, 7527, 2569, 3, 10, UNI_LB__WJ } /* lb=wordjoiner */, - { 1, 464, 901, 2, 8, UNI_ARMN } /* isarmenian */, - { 17, 409, 356, 2, 4, UNI_DI } /* di=yes */, - { 0, 2153, 518, 4, 2, UNI_NV__4_SLASH_5 } /* nv=4/5 */, - { 18, 1867, 934, 12, 6, -UNI_BIDIM } /* bidimirrored=false */, - { 0, 2726, 4614, 3, 16, UNI_PF } /* gc=finalpunctuation */, - { 6, 464, 5116, 2, 20, UNI_HLUW } /* isanatolianhieroglyphs */, - { 21, 4355, 445, 17, 4, UNI_ORKH } /* scriptextensions=orkh */, - { 0, 8244, 6309, 9, 13, UNI_CJKCOMPAT } /* block=cjkcompatibility */, - { 0, 58, 1105, 2, 5, UNI_TALU } /* sc=talu */, - { 176, 383, 2261, 5, 2, UNI_hyphen_values_index } /* hyphen= */, - { 0, 4355, 1470, 17, 4, UNI_BUGI } /* scriptextensions=bugi */, - { 1, 6114, 1009, 3, 4, UNI_LYCI } /* sc=lyci */, - { 50, 3748, 294, 15, 1, UNI_NV__1_SLASH_4 } /* numericvalue=1/4 */, - { 9, 2, 587, 1, 3, UNI_CE } /* ce=t */, - { 2, 2474, 7975, 3, 32, UNI_MISCMATHSYMBOLSA } /* ismiscellaneousmathematicalsymbolsa */, - { 1, 6011, 1037, 14, 4, UNI_ETHIOPICEXTB } /* block=ethiopicextb */, - { 1, 261, 934, 4, 6, -UNI_CWCM } /* cwcm=false */, - { 0, 4322, 1304, 15, 2, UNI_NV__3_SLASH_20 } /* numericvalue=3/20 */, - { 0, 464, 7416, 2, 14, UNI_PUA } /* isprivateusearea */, - { 5, 6011, 0, 14, 0, UNI_INETHIOPIC } /* block=ethiopic */, - { 68, 1571, 0, 10, 0, UNI_SAUR } /* saurashtra */, - { 0, 3974, 588, 4, 2, UNI_IDSB } /* idsb=t */, - { 35, 275, 1379, 2, 2, UNI_M } /* gc=m */, - { 2, 7660, 934, 17, 6, -UNI_VS } /* variationselector=false */, - { 4, 6944, 1153, 25, 2, UNI_CCC__L } /* canonicalcombiningclass=224 */, - { 0, 1796, 1015, 7, 6, UNI_SC__TELU } /* script=telugu */, - { 2, 1027, 0, 6, 0, UNI_YEZI } /* yezidi */, - { 1, 3622, 4123, 3, 14, UNI_LOWERCASELETTER } /* islowercaseletter */, - { 4, 5087, 10, 10, 2, UNI_LB__CR } /* wordbreak=cr */, - { 9, 719, 4203, 3, 16, UNI_INKHITANSMALLSCRIPT } /* inkhitansmallscript */, - { 0, 6114, 477, 3, 3, UNI_VAI } /* sc=vai */, - { 12, 3474, 6447, 6, 5, UNI_MUSIC } /* block=music */, - { 0, 1102, 1289, 4, 9, UNI_TALU } /* scx=newtailue */, - { 1, 102, 104, 2, 2, UNI_HLUW } /* hluw */, - { 0, 6944, 3365, 24, 2, UNI_CCC__36 } /* canonicalcombiningclass=36 */, - { 10, 1879, 1491, 8, 4, UNI_KANAEXTA } /* blk=kanaexta */, - { 17, 1796, 1451, 7, 10, UNI_DIAK } /* script=divesakuru */, - { 0, 5544, 588, 21, 5, UNI_CWT } /* changeswhentitlecased=true */, - { 1, 7317, 5446, 10, 18, UNI_BC__FSI } /* bidiclass=firststrongisolate */, - { 2, 2726, 3654, 3, 11, UNI_MC } /* gc=spacingmark */, - { 0, 6570, 2230, 3, 7, UNI_PHAISTOS } /* inphaistos */, - { 11, 3351, 2155, 12, 10, UNI_NV__5_SLASH_12 } /* numericvalue=4.167e-01 */, - { 8, 1174, 1906, 3, 9, UNI_EA__A } /* ea=ambiguous */, - { 4, 34, 4550, 1, 17, UNI_LINEARBSYLLABARY } /* inlinearbsyllabary */, - { 0, 6112, 3213, 5, 10, UNI_INSC__PUREKILLER } /* insc=purekiller */, - { 7, 4783, 355, 9, 3, UNI_XPOSIXSPACE } /* whitespace=y */, - { 7, 343, 0, 5, 0, UNI_CCC__1 } /* ccc=1 */, - { 0, 4355, 360, 17, 6, UNI_CAKM } /* scriptextensions=chakma */, - { 26, 3090, 2733, 5, 13, UNI_INGREEK } /* blk=greekandcoptic */, - { 0, 12, 602, 3, 2, -UNI_PCM } /* pcm=n */, - { 0, 6114, 4582, 3, 4, UNI_SC__BOPO } /* sc=bopo */, - { 1, 275, 538, 2, 2, UNI_S } /* gc=s */, - { 20, 4355, 1495, 17, 4, UNI_JAVA } /* scriptextensions=java */, - { 10, 4996, 194, 14, 2, UNI_JG__MANICHAEANTAW } /* jg=manichaeantaw */, - { 1, 1879, 220, 4, 4, UNI_INTOTO } /* blk=toto */, - { 1, 3974, 602, 4, 2, -UNI_IDSB } /* idsb=n */, - { 3, 1879, 6069, 4, 22, UNI_DIACRITICALSFORSYMBOLS } /* blk=diacriticalsforsymbols */, - { 2, 3450, 6142, 10, 12, UNI_CYRILLICSUP } /* blk=cyrillicsupplement */, - { 1, 2485, 1082, 6, 4, UNI_XPOSIXWORD } /* xposixword */, - { 0, 1879, 5284, 4, 20, UNI_ININSCRIPTIONALPAHLAVI } /* blk=inscriptionalpahlavi */, - { 0, 6114, 991, 3, 6, UNI_HATR } /* sc=hatran */, - { 0, 2260, 0, 3, 0, UNI_in_values_index } /* in= */, - { 1, 270, 934, 3, 6, -UNI_CWT } /* cwt=false */, - { 18, 4355, 465, 17, 4, UNI_SHRD } /* scriptextensions=shrd */, - { 8, 3450, 3123, 5, 14, UNI_CONTROLPICTURES } /* blk=controlpictures */, - { 0, 1377, 1842, 3, 3, UNI_WB__EB } /* wb=gaz */, - { 8, 477, 0, 3, 0, UNI_VAI } /* vai */, - { 5, 736, 7175, 3, 26, UNI_ENCLOSEDCJK } /* inenclosedcjklettersandmonths */, - { 20, 5586, 10, 21, 2, UNI_LB__CR } /* graphemeclusterbreak=cr */, - { 0, 6114, 2041, 3, 12, UNI_MEND } /* sc=mendekikakui */, - { 6, 2353, 4442, 10, 9, UNI_CYRILLICEXTB } /* incyrillicextendedb */, - { 21, 4291, 6173, 10, 12, UNI_LB__SY } /* linebreak=breaksymbols */, - { 33, 15, 575, 1, 6, UNI_AVST } /* avestan */, - { 2, 1382, 588, 8, 5, UNI_XIDS } /* xidstart=true */, - { 67, 600, 7135, 2, 4, UNI_DT__SUP } /* dt=sup */, - { 4, 2726, 5103, 3, 2, UNI_CASEDLETTER } /* gc=l_ */, - { 0, 536, 5, 3, 2, UNI_SB__EX } /* sb=ex */, - { 33, 4901, 356, 13, 4, UNI_EMOD } /* emojimodifier=yes */, - { 7, 3595, 4701, 13, 10, UNI_LATINEXTADDITIONAL } /* latinextendedadditional */, - { 6, 7068, 588, 26, 2, UNI_PCM } /* prependedconcatenationmark=t */, - { 0, 8533, 4641, 7, 8, UNI_SYRIACSUP } /* block=syriacsup */, - { 0, 2, 356, 3, 4, UNI_CWL } /* cwl=yes */, - { 0, 7201, 12, 16, 2, UNI_PC } /* generalcategory=pc */, - { 1, 1011, 356, 2, 4, UNI_CI } /* ci=yes */, - { 0, 1704, 6142, 4, 5, UNI_ARABICSUP } /* arabicsup */, - { 2, 1796, 1198, 7, 7, UNI_SC__GRAN } /* script=grantha */, - { 1, 1796, 67, 7, 4, UNI_SC__CPMN } /* script=cpmn */, - { 0, 6462, 0, 24, 0, UNI_HIGHPUSURROGATES } /* highprivateusesurrogates */, - { 8, 1796, 1220, 7, 7, UNI_MAKA } /* script=makasar */, - { 1, 7018, 5797, 8, 9, UNI_ARABICEXTA } /* inarabicextendeda */, - { 4, 464, 1867, 2, 12, UNI_BIDIM } /* isbidimirrored */, - { 26, 1991, 3273, 12, 12, UNI_JT__R } /* joiningtype=rightjoining */, - { 1, 1090, 0, 4, 0, UNI_LINB } /* linb */, - { 1, 2463, 0, 11, 0, UNI_JOINC } /* joincontrol */, - { 0, 1991, 6573, 4, 3, UNI_JOINC } /* joinc=t */, - { 3, 6039, 4567, 7, 15, UNI_MISCMATHSYMBOLSB } /* block=miscmathsymbolsb */, - { 0, 6402, 58, 14, 2, UNI_SB__SC } /* sentencebreak=sc */, - { 2, 1440, 588, 2, 5, UNI_SD } /* sd=true */, - { 0, 4355, 441, 17, 4, UNI_OLCK } /* scriptextensions=olck */, - { 17, 895, 891, 6, 2, UNI_AGE__11 } /* age=v110 */, - { 0, 6114, 1086, 3, 4, UNI_SC__KTHI } /* sc=kthi */, - { 4, 115, 0, 2, 0, UNI_SK } /* sk */, - { 56, 7431, 2074, 27, 2, UNI_CCC__29 } /* canonicalcombiningclass=ccc29 */, - { 1, 7431, 3364, 27, 2, UNI_CCC__23 } /* canonicalcombiningclass=ccc23 */, - { 64, 1879, 6303, 4, 23, UNI_COMPATJAMO } /* blk=hangulcompatibilityjamo */, - { 3, 3462, 5769, 5, 15, UNI_ENCLOSEDALPHANUM } /* blk=enclosedalphanum */, - { 12, 1796, 1009, 7, 4, UNI_LYCI } /* script=lyci */, - { 1, 940, 602, 6, 3, -UNI_COMPEX } /* compex=no */, - { 1, 536, 2277, 4, 8, UNI_SB__SC } /* sb=scontinue */, - { 4, 4355, 776, 17, 7, UNI_OLCK } /* scriptextensions=olchiki */, - { 9, 313, 1551, 2, 10, UNI_INOLDPERSIAN } /* inoldpersian */, - { 2, 3474, 2812, 6, 12, UNI_MAHJONG } /* block=mahjongtiles */, - { 1, 1879, 6538, 4, 11, UNI_NUMBERFORMS } /* blk=numberforms */, - { 0, 7201, 628, 16, 2, UNI_PI } /* generalcategory=pi */, - { 0, 96, 646, 1, 3, UNI_JT__L } /* jt=l */, - { 1, 464, 651, 2, 5, UNI_ADLM } /* isadlam */, - { 73, 4355, 735, 17, 7, UNI_LINA } /* scriptextensions=lineara */, - { 20, 1102, 3465, 3, 9, UNI_ETHI } /* scx=ethiopic */, - { 0, 7688, 4166, 23, 4, UNI_JG__MANICHAEANBETH } /* joininggroup=manichaeanbeth */, - { 0, 2353, 3123, 3, 14, UNI_CONTROLPICTURES } /* incontrolpictures */, - { 0, 7208, 3722, 9, 10, UNI_SM } /* category=mathsymbol */, - { 0, 3351, 523, 13, 1, UNI_NV__7 } /* numericvalue=7 */, - { 24, 313, 3053, 2, 5, UNI_ASCII } /* inascii */, - { 1, 3450, 1491, 12, 4, UNI_CYRILLICEXTA } /* blk=cyrillicexta */, - { 2, 2353, 6142, 8, 5, UNI_CYRILLICSUP } /* incyrillicsup */, - { 2, 7823, 1434, 5, 7, UNI_CJKSTROKES } /* incjkstrokes */, - { 1, 14, 5807, 1, 11, UNI_MONGOLIANSUP } /* mongoliansup */, - { 131, 4355, 116, 17, 4, UNI_KNDA } /* scriptextensions=knda */, - { 2, 1398, 1407, 9, 3, UNI_BOXDRAWING } /* inboxdrawing */, - { 0, 313, 3637, 2, 4, UNI_INLISU } /* inlisu */, - { 0, 296, 398, 3, 2, UNI_NV__16 } /* nv=16 */, - { 59, 3474, 502, 6, 6, UNI_INLYDIAN } /* block=lydian */, - { 12, 464, 1551, 2, 10, UNI_XPEO } /* isoldpersian */, - { 54, 1879, 686, 4, 5, UNI_INTAKRI } /* blk=takri */, - { 8, 3351, 2073, 13, 2, UNI_NV__42 } /* numericvalue=42 */, - { 5, 2496, 7276, 3, 10, UNI_JG__TEHMARBUTA } /* jg=tehmarbuta */, - { 0, 8244, 8089, 9, 21, UNI_CJKSYMBOLS } /* block=cjksymbolsandpunctuation */, - { 1, 1796, 1015, 7, 4, UNI_SC__TELU } /* script=telu */, - { 0, 7688, 4978, 23, 6, UNI_JG__MANICHAEANDALETH } /* joininggroup=manichaeandaleth */, - { 2, 464, 3164, 2, 14, UNI_GREXT } /* isgraphemeextend */, - { 36, 464, 115, 2, 2, UNI_SK } /* issk */, - { 3, 1075, 2120, 4, 8, UNI_NV__1_SLASH_4 } /* nv=2.500e-01 */, - { 1, 2365, 623, 6, 5, UNI_ETHIOPICEXT } /* ethiopicext */, - { 49, 1102, 1353, 4, 4, UNI_PAUC } /* scx=pauc */, - { 0, 6538, 0, 11, 0, UNI_NUMBERFORMS } /* numberforms */, - { 20, 4355, 728, 17, 7, UNI_KALI } /* scriptextensions=kayahli */, - { 19, 6379, 3254, 13, 7, UNI_JG__SEMKATH } /* joininggroup=semkath */, - { 5, 3622, 1036, 3, 2, UNI_LOE } /* isloe */, - { 4, 265, 588, 5, 5, UNI_CWKCF } /* cwkcf=true */, - { 0, 6799, 934, 24, 6, -UNI_COMPEX } /* fullcompositionexclusion=false */, - { 75, 1441, 356, 10, 4, UNI_DEP } /* deprecated=yes */, - { 7, 7132, 4641, 5, 8, UNI_SYRIACSUP } /* blk=syriacsup */, - { 0, 625, 356, 7, 4, UNI_EXTPICT } /* extpict=yes */, - { 0, 8078, 0, 32, 0, UNI_IDEOGRAPHICSYMBOLS } /* ideographicsymbolsandpunctuation */, - { 3, 1975, 4122, 7, 5, UNI_POSIXLOWER } /* isposixlower */, - { 0, 4996, 4186, 13, 4, UNI_JG__MANICHAEANRESH } /* jg=manichaeanresh */, - { 1, 464, 124, 2, 4, UNI_LATN } /* islatn */, - { 0, 6774, 356, 25, 4, UNI_DI } /* defaultignorablecodepoint=yes */, - { 0, 5844, 1262, 6, 3, UNI_SUPPUAB } /* issuppuab */, - { 0, 6114, 2986, 3, 14, UNI_SC__PHLP } /* sc=psalterpahlavi */, - { 0, 3748, 2088, 14, 8, UNI_NV__1_SLASH_64 } /* numericvalue=1.562e-02 */, - { 2, 7527, 2012, 3, 2, UNI_LB__BK } /* lb=bk */, - { 2, 5565, 602, 21, 2, -UNI_CWU } /* changeswhenuppercased=n */, - { 0, 7201, 117, 16, 2, UNI_XPOSIXDIGIT } /* generalcategory=nd */, - { 52, 5586, 2729, 21, 5, UNI_GCB__XX } /* graphemeclusterbreak=other */, - { 0, 4355, 461, 17, 4, UNI_QAAI } /* scriptextensions=qaai */, - { 1, 343, 1157, 4, 5, UNI_CCC__7 } /* ccc=nukta */, - { 0, 110, 0, 2, 0, UNI_ZL } /* zl */, - { 1, 1102, 798, 4, 4, UNI_LANA } /* scx=lana */, - { 2, 464, 7044, 2, 24, UNI_DIACRITICALSFORSYMBOLS } /* iscombiningmarksforsymbols */, - { 3, 6031, 0, 8, 0, UNI_GEOR } /* georgian */, - { 4, 261, 588, 4, 2, UNI_CWCM } /* cwcm=t */, - { 12, 5607, 1382, 18, 3, UNI_IDENTIFIERTYPE__NOTXID } /* identifiertype=notxid */, - { 10, 1796, 502, 7, 6, UNI_LYDI } /* script=lydian */, - { 0, 464, 4062, 2, 8, UNI_VEDICEXT } /* isvedicext */, - { 1, 313, 6594, 2, 6, UNI_INBRAHMI } /* inbrahmi */, - { 6, 6114, 1191, 3, 4, UNI_SC__BENG } /* sc=beng */, - { 0, 7044, 0, 13, 0, UNI_M } /* combiningmark */, - { 0, 6114, 5825, 3, 4, UNI_SUND } /* sc=sund */, - { 0, 7068, 934, 26, 2, -UNI_PCM } /* prependedconcatenationmark=f */, - { 10, 2771, 0, 12, 0, UNI_KHMERSYMBOLS } /* khmersymbols */, - { 0, 1382, 934, 4, 6, -UNI_XIDS } /* xids=false */, - { 0, 3637, 0, 14, 0, UNI_LISUSUP } /* lisusupplement */, - { 0, 34, 7790, 1, 33, UNI_INIDC } /* isideographicdescriptioncharacters */, - { 32, 3058, 0, 8, 0, UNI_XPOSIXXDIGIT } /* hexdigit */, - { 1, 313, 3839, 2, 6, UNI_INTANGUT } /* intangut */, - { 46, 632, 5620, 5, 4, -UNI_GRBASE } /* grbase=no */, - { 1, 464, 1582, 2, 6, UNI_L } /* isletter */, - { 1, 1796, 3285, 7, 4, UNI_HEBR } /* script=hebr */, - { 0, 464, 477, 2, 3, UNI_VAI } /* isvai */, - { 0, 5907, 0, 21, 0, UNI_SINHALAARCHAICNUMBERS } /* sinhalaarchaicnumbers */, - { 1, 7527, 22, 3, 2, UNI_LB__BA } /* lb=ba */, - { 1, 2802, 4442, 10, 9, UNI_ETHIOPICEXTB } /* isethiopicextendedb */, - { 0, 1383, 601, 6, 3, -UNI_IDS } /* idstart=n */, - { 0, 6944, 346, 23, 3, UNI_CCC__11 } /* canonicalcombiningclass=11 */, - { 3, 1796, 51, 7, 4, UNI_SC__CAKM } /* script=cakm */, - { 6, 464, 152, 2, 4, UNI_OSGE } /* isosge */, - { 34, 3593, 4590, 7, 9, UNI_LATINEXTC } /* inlatinextendedc */, - { 0, 1796, 3839, 7, 6, UNI_TANG } /* script=tangut */, - { 3, 1102, 1317, 4, 9, UNI_PERM } /* scx=oldpermic */, - { 1, 3748, 398, 15, 2, UNI_NV__1_SLASH_16 } /* numericvalue=1/16 */, - { 0, 2474, 7556, 3, 28, UNI_MISCARROWS } /* ismiscellaneoussymbolsandarrows */, - { 0, 1796, 160, 7, 4, UNI_SC__PHLP } /* script=phlp */, - { 0, 261, 0, 4, 0, UNI_CWCM } /* cwcm */, - { 0, 6944, 8572, 24, 18, UNI_CCC__216 } /* canonicalcombiningclass=attachedaboveright */, - { 0, 6402, 329, 14, 2, UNI_SB__UP } /* sentencebreak=up */, - { 0, 5748, 5858, 5, 7, UNI_SUPARROWSC } /* insuparrowsc */, - { 7, 540, 0, 4, 0, UNI_TANG } /* tang */, - { 1, 2974, 1780, 11, 3, UNI_IN__10 } /* presentin=v100 */, - { 0, 4355, 287, 17, 5, UNI_NSHU } /* scriptextensions=nushu */, - { 0, 3474, 27, 6, 4, UNI_INAHOM } /* block=ahom */, - { 1, 3474, 651, 6, 5, UNI_INADLAM } /* block=adlam */, - { 9, 1704, 1695, 6, 3, UNI_ARABICPFB } /* arabicpfb */, - { 32, 1539, 72, 3, 3, UNI_CPRT } /* iscprt */, - { 4, 1975, 1082, 7, 4, UNI_POSIXWORD } /* isposixword */, - { 22, 1382, 934, 8, 2, -UNI_XIDS } /* xidstart=f */, - { 0, 7182, 6177, 2, 8, UNI_CJKSYMBOLS } /* cjksymbols */, - { 0, 6114, 1311, 3, 4, UNI_ITAL } /* sc=ital */, - { 8, 383, 0, 6, 0, UNI_HYPHEN } /* hyphen */, - { 0, 464, 1542, 2, 6, UNI_ARROWS } /* isarrows */, - { 0, 464, 372, 2, 4, UNI_GOTH } /* isgoth */, - { 0, 644, 0, 7, 0, UNI_LB__H3 } /* hst=lvt */, - { 2, 3474, 5340, 6, 13, UNI_DEVANAGARIEXT } /* block=devanagariext */, - { 4, 4500, 0, 5, 0, UNI_XPOSIXUPPER } /* upper */, - { 0, 464, 1098, 2, 4, UNI_NSHU } /* isnshu */, - { 9, 8244, 1646, 9, 4, UNI_CJKEXTD } /* block=cjkextd */, - { 80, 4355, 3885, 17, 17, UNI_AGHB } /* scriptextensions=caucasianalbanian */, - { 33, 7823, 5, 5, 4, UNI_CJKEXTG } /* incjkextg */, - { 0, 1879, 4202, 4, 17, UNI_INKHITANSMALLSCRIPT } /* blk=khitansmallscript */, - { 0, 464, 5186, 2, 20, UNI_EXTPICT } /* isextendedpictographic */, - { 0, 4500, 934, 5, 6, -UNI_XPOSIXUPPER } /* upper=false */, - { 4, 7317, 3078, 10, 12, UNI_BC__ON } /* bidiclass=otherneutral */, - { 3, 464, 4962, 2, 14, UNI_ROHG } /* ishanifirohingya */, - { 24, 7208, 1590, 9, 2, UNI_LOWERCASELETTER } /* category=ll */, - { 5, 1879, 2771, 4, 5, UNI_INKHMER } /* blk=khmer */, - { 22, 2443, 602, 5, 2, -UNI_CASED } /* cased=n */, - { 1, 1879, 6644, 4, 22, UNI_TRANSPORTANDMAP } /* blk=transportandmapsymbols */, - { 0, 3474, 5056, 6, 19, UNI_OTTOMANSIYAQNUMBERS } /* block=ottomansiyaqnumbers */, - { 2, 3000, 1881, 12, 2, UNI_qmark_values_index } /* quotationmark= */, - { 0, 2496, 7276, 3, 14, UNI_JG__HAMZAONHEHGOAL } /* jg=tehmarbutagoal */, - { 0, 464, 6031, 2, 8, UNI_GEOR } /* isgeorgian */, - { 0, 1377, 3013, 3, 11, UNI_WB__DQ } /* wb=doublequote */, - { 0, 6239, 176, 4, 2, UNI_BC__LRO } /* bc=lro */, - { 1, 1102, 192, 4, 4, UNI_SHAW } /* scx=shaw */, - { 0, 2726, 628, 3, 2, UNI_PI } /* gc=pi */, - { 1, 464, 5409, 2, 19, UNI_TERM } /* isterminalpunctuation */, - { 12, 4355, 593, 17, 7, UNI_DSRT } /* scriptextensions=deseret */, - { 6, 2802, 7175, 3, 10, UNI_ENCLOSEDCJK } /* isenclosedcjk */, - { 144, 1702, 7481, 6, 20, UNI_ARABICPFA } /* isarabicpresentationformsa */, - { 9, 296, 1300, 4, 3, UNI_NV__9000 } /* nv=9000 */, - { 6, 3622, 0, 7, 0, UNI_LATN } /* islatin */, - { 0, 5409, 602, 19, 3, -UNI_TERM } /* terminalpunctuation=no */, - { 0, 4355, 1027, 17, 6, UNI_YEZI } /* scriptextensions=yezidi */, - { 1, 1102, 1550, 3, 11, UNI_XPEO } /* scx=oldpersian */, - { 0, 181, 2324, 2, 8, UNI_CN } /* unassigned */, - { 0, 1879, 1371, 4, 6, UNI_INTHAANA } /* blk=thaana */, - { 0, 6799, 934, 24, 2, -UNI_COMPEX } /* fullcompositionexclusion=f */, - { 9, 1796, 4107, 7, 6, UNI_SC__HANG } /* script=hangul */, - { 3, 600, 1719, 3, 4, UNI_DT__VERT } /* dt=vert */, - { 0, 600, 242, 3, 2, UNI_DT__NB } /* dt=nb */, - { 0, 3474, 951, 6, 8, UNI_INDUPLOYAN } /* block=duployan */, - { 104, 1065, 2617, 4, 8, UNI_NV__1_SLASH_10 } /* nv=1.000e-01 */, - { 0, 1102, 1371, 4, 4, UNI_THAA } /* scx=thaa */, - { 1, 313, 7377, 2, 8, UNI_INKATAKANA } /* inkatakana */, - { 0, 1102, 3465, 3, 5, UNI_ETHI } /* scx=ethi */, - { 0, 464, 2229, 2, 12, UNI_PHAISTOS } /* isphaistosdisc */, - { 24, 1102, 1133, 4, 8, UNI_VITH } /* scx=vithkuqi */, - { 1, 8244, 1037, 9, 4, UNI_CJKEXTB } /* block=cjkextb */, - { 0, 275, 252, 4, 2, UNI_GCB__CN } /* gcb=cn */, - { 5, 313, 5825, 2, 19, UNI_SUNDANESESUP } /* insundanesesupplement */, - { 32, 1796, 1086, 7, 4, UNI_SC__KTHI } /* script=kthi */, - { 1, 6402, 5021, 13, 6, UNI_SB__CL } /* sentencebreak=close */, - { 10, 6402, 5, 14, 2, UNI_SB__EX } /* sentencebreak=ex */, - { 64, 1102, 228, 4, 4, UNI_XPEO } /* scx=xpeo */, - { 0, 6379, 1526, 13, 3, UNI_JG__YEH } /* joininggroup=yeh */, - { 36, 3351, 6199, 14, 7, UNI_NV__20000000 } /* numericvalue=20000000 */, - { 19, 7880, 3571, 5, 11, UNI_CJKCOMPATFORMS } /* iscjkcompatforms */, - { 0, 464, 4081, 2, 11, UNI_P } /* ispunctuation */, - { 0, 7527, 1591, 3, 2, UNI_LB__LF } /* lb=lf */, - { 0, 3351, 762, 13, 4, UNI_NV___MINUS_1_SLASH_2 } /* numericvalue=-1/2 */, - { 68, 6112, 1418, 5, 6, UNI_INSC__VIRAMA } /* insc=virama */, - { 0, 608, 345, 2, 2, UNI_idc_values_index } /* idc= */, - { 0, 1796, 236, 7, 2, UNI_SC__YI } /* script=yi */, - { 0, 34, 636, 1, 8, UNI_HANO } /* ishanunoo */, - { 1, 536, 4122, 3, 5, UNI_SB__LO } /* sb=lower */, - { 5, 4355, 909, 17, 8, UNI_BALI } /* scriptextensions=balinese */, - { 4, 1539, 0, 3, 0, UNI_C } /* isc */, - { 1, 5825, 0, 12, 0, UNI_SUNDANESESUP } /* sundanesesup */, - { 0, 3734, 356, 14, 2, UNI_NFKCQC__Y } /* nfkcquickcheck=y */, - { 0, 1377, 1631, 3, 7, UNI_WB__NL } /* wb=newline */, - { 3, 275, 1842, 4, 3, UNI_WB__EB } /* gcb=gaz */, - { 2, 2463, 934, 11, 6, -UNI_JOINC } /* joincontrol=false */, - { 105, 343, 2498, 3, 2, UNI_CCC__A } /* ccc=a */, - { 6, 2496, 709, 3, 4, UNI_JG__SEEN } /* jg=seen */, - { 0, 313, 6629, 2, 15, UNI_MODIFIERLETTERS } /* inmodifierletters */, - { 1, 1539, 5566, 3, 20, UNI_CWU } /* ischangeswhenuppercased */, - { 6, 7208, 334, 9, 2, UNI_PD } /* category=pd */, - { 4, 3474, 429, 6, 3, UNI_INMRO } /* block=mro */, - { 0, 844, 355, 2, 3, UNI_LOE } /* loe=y */, - { 40, 2496, 2529, 3, 10, UNI_JG__REVERSEDPE } /* jg=reversedpe */, - { 0, 1377, 1802, 2, 3, UNI_WB__ML } /* wb=ml */, - { 3, 7317, 538, 9, 2, UNI_BC__S } /* bidiclass=s */, - { 0, 4355, 2042, 18, 11, UNI_MEND } /* scriptextensions=mendekikakui */, - { 0, 7605, 140, 19, 2, UNI_HST__NA } /* hangulsyllabletype=na */, - { 0, 1796, 1289, 7, 9, UNI_TALU } /* script=newtailue */, - { 5, 536, 40, 3, 2, UNI_SB__AT } /* sb=at */, - { 0, 1879, 1220, 4, 7, UNI_INMAKASAR } /* blk=makasar */, - { 0, 1860, 0, 7, 0, UNI_XPOSIXCNTRL } /* control */, - { 25, 1539, 8499, 3, 34, UNI_DIACRITICALSSUP } /* iscombiningdiacriticalmarkssupplement */, - { 0, 5087, 3285, 10, 12, UNI_LB__HL } /* wordbreak=hebrewletter */, - { 2, 2365, 1491, 8, 4, UNI_ETHIOPICEXTA } /* ethiopicexta */, - { 1, 17, 0, 2, 0, UNI_LM } /* lm */, - { 0, 6114, 445, 3, 4, UNI_ORKH } /* sc=orkh */, - { 3, 823, 602, 4, 3, -UNI_DASH } /* dash=no */, - { 0, 1702, 4918, 3, 9, UNI_ALCHEMICAL } /* isalchemical */, - { 12, 6114, 1248, 3, 7, UNI_SIDD } /* sc=siddham */, - { 18, 1102, 3381, 4, 15, UNI_NARB } /* scx=oldnortharabian */, - { 1, 3474, 6052, 6, 13, UNI_MATHOPERATORS } /* block=mathoperators */, - { 1, 513, 766, 4, 3, UNI_NV__3_SLASH_64 } /* nv=3/64 */, - { 0, 6114, 1470, 3, 4, UNI_SC__BUGI } /* sc=bugi */, - { 148, 7527, 4137, 3, 15, UNI_LB__OP } /* lb=openpunctuation */, - { 2, 1796, 337, 7, 6, UNI_CARI } /* script=carian */, - { 16, 1395, 4629, 4, 5, UNI_LATIN1 } /* latin1sup */, - { 0, 2193, 2199, 6, 6, UNI_NV__1_SLASH_16 } /* nv=6.250e-02 */, - { 47, 1382, 0, 4, 0, UNI_XIDS } /* xids */, - { 2, 7880, 3571, 5, 6, UNI_CJKCOMPAT } /* iscjkcompat */, - { 1, 343, 433, 4, 2, UNI_CCC__7 } /* ccc=nk */, - { 1, 1796, 3991, 7, 4, UNI_BRAI } /* script=brai */, - { 0, 3974, 356, 4, 4, UNI_IDSB } /* idsb=yes */, - { 1, 383, 602, 6, 3, -UNI_HYPHEN } /* hyphen=no */, - { 0, 2726, 844, 3, 2, UNI_LO } /* gc=lo */, - { 0, 256, 0, 2, 0, UNI_CASEDLETTER } /* lc */, - { 0, 1102, 6594, 4, 4, UNI_BRAH } /* scx=brah */, - { 2, 4500, 588, 5, 2, UNI_XPOSIXUPPER } /* upper=t */, - { 3, 4450, 7908, 7, 29, UNI_CUNEIFORMNUMBERS } /* block=cuneiformnumbersandpunctuation */, - { 129, 464, 1887, 2, 7, UNI_UCASEXT } /* isucasext */, - { 0, 8592, 0, 34, 0, UNI_UCAS } /* unifiedcanadianaboriginalsyllabics */, - { 20, 464, 3060, 2, 6, UNI_XPOSIXXDIGIT } /* isxdigit */, - { 6, 1796, 360, 7, 6, UNI_SC__CAKM } /* script=chakma */, - { 4, 464, 806, 2, 4, UNI_SARB } /* issarb */, - { 47, 3933, 0, 4, 0, UNI_MODI } /* modi */, - { 0, 7584, 1679, 18, 3, UNI_DT__FRA } /* decompositiontype=fra */, - { 36, 464, 55, 2, 4, UNI_CANS } /* iscans */, - { 0, 4996, 3685, 13, 3, UNI_JG__MANICHAEANMEM } /* jg=manichaeanmem */, - { 1, 3351, 391, 13, 2, UNI_NV__26 } /* numericvalue=26 */, - { 1, 6114, 35, 3, 4, UNI_AVST } /* sc=avst */, - { 9, 7527, 2926, 3, 11, UNI_LB__IN } /* lb=inseparable */, - { 0, 4355, 421, 17, 4, UNI_KHMR } /* scriptextensions=khmr */, - { 1, 4355, 5825, 17, 4, UNI_SUND } /* scriptextensions=sund */, - { 0, 5087, 1624, 10, 7, UNI_WB__LE } /* wordbreak=aletter */, - { 0, 8244, 6505, 31, 5, UNI_CJKEXTC } /* block=cjkunifiedideographsextensionc */, - { 2, 4355, 2401, 17, 11, UNI_NAND } /* scriptextensions=nandinagari */, - { 11, 3474, 1948, 6, 10, UNI_INOLDSOGDIAN } /* block=oldsogdian */, - { 0, 464, 4999, 2, 10, UNI_MANI } /* ismanichaean */, - { 80, 265, 934, 5, 6, -UNI_CWKCF } /* cwkcf=false */, - { 0, 7584, 940, 18, 3, UNI_DT__COM } /* decompositiontype=com */, - { 0, 618, 0, 7, 0, UNI_ELYM } /* elymaic */, - { 59, 7473, 0, 10, 0, UNI_XPOSIXALPHA } /* alphabetic */, - { 0, 1796, 1951, 7, 4, UNI_SC__SOGD } /* script=sogd */, - { 0, 275, 546, 4, 3, UNI_WB__EB } /* gcb=ebg */, - { 1, 8244, 1899, 9, 7, UNI_CJKSYMBOLS } /* block=cjksymbols */, - { 2, 464, 1561, 2, 10, UNI_PHNX } /* isphoenician */, - { 30, 1796, 540, 7, 4, UNI_TANG } /* script=tang */, - { 1, 36, 356, 2, 2, UNI_VS } /* vs=y */, - { 0, 6799, 588, 24, 5, UNI_COMPEX } /* fullcompositionexclusion=true */, - { 0, 1856, 934, 11, 6, -UNI_BIDIC } /* bidicontrol=false */, - { 8, 313, 7416, 2, 14, UNI_PUA } /* inprivateusearea */, - { 0, 536, 832, 3, 5, UNI_SB__ST } /* sb=sterm */, - { 0, 1102, 530, 4, 6, UNI_RJNG } /* scx=rejang */, - { 2, 7431, 347, 27, 3, UNI_CCC__118 } /* canonicalcombiningclass=ccc118 */, - { 4, 1614, 0, 10, 0, UNI_WARA } /* warangciti */, - { 1, 5718, 588, 4, 2, UNI_EMOD } /* emod=t */, - { 2, 2485, 42, 10, 1, UNI_XPOSIXBLANK } /* xposixblank */, - { 1, 8244, 6352, 9, 18, UNI_CJKRADICALSSUP } /* block=cjkradicalssupplement */, - { 0, 464, 2324, 2, 8, UNI_ASSIGNED } /* isassigned */, - { 3, 4291, 1906, 10, 9, UNI_LB__AI } /* linebreak=ambiguous */, - { 2, 34, 4484, 1, 16, UNI_TITLE } /* istitlecaseletter */, - { 0, 1011, 934, 2, 2, -UNI_CI } /* ci=f */, - { 2, 3351, 1304, 13, 2, UNI_NV__20 } /* numericvalue=20 */, - { 0, 1879, 321, 4, 5, UNI_INTAILE } /* blk=taile */, - { 0, 2692, 1695, 10, 3, UNI_ARABICPFB } /* blk=arabicpfb */, - { 1, 2726, 2986, 3, 2, UNI_PS } /* gc=ps */, - { 37, 7208, 203, 9, 2, UNI_TITLE } /* category=lt */, - { 0, 86, 0, 4, 0, UNI_GONG } /* gong */, - { 3, 1102, 3637, 4, 4, UNI_LISU } /* scx=lisu */, - { 46, 1856, 0, 5, 0, UNI_BIDIC } /* bidic */, - { 2, 625, 356, 7, 2, UNI_EXTPICT } /* extpict=y */, - { 1, 3722, 934, 4, 6, -UNI_MATH } /* math=false */, - { 10, 1410, 585, 7, 2, UNI_CCC__22 } /* ccc=ccc22 */, - { 0, 1796, 593, 7, 7, UNI_DSRT } /* script=deseret */, - { 5, 7132, 7643, 15, 17, UNI_SUPPUAB } /* blk=supplementaryprivateuseareab */, - { 0, 2726, 4500, 3, 15, UNI_UPPERCASELETTER } /* gc=uppercaseletter */, - { 0, 3474, 6970, 6, 26, UNI_HALFANDFULLFORMS } /* block=halfwidthandfullwidthforms */, - { 9, 4355, 112, 17, 4, UNI_KITS } /* scriptextensions=kits */, - { 1, 7317, 143, 10, 2, UNI_BC__BN } /* bidiclass=bn */, - { 0, 4122, 355, 8, 2, UNI_lower_values_index } /* lowercase= */, - { 0, 265, 602, 5, 2, -UNI_CWKCF } /* cwkcf=n */, - { 3, 3637, 0, 4, 0, UNI_LISU } /* lisu */, - { 0, 7527, 3432, 3, 3, UNI_LB__ZWJ } /* lb=zwj */, - { 1, 7527, 1739, 3, 8, UNI_LB__LF } /* lb=linefeed */, - { 0, 6379, 718, 13, 3, UNI_JG__AIN } /* joininggroup=ain */, - { 6, 4355, 2986, 17, 14, UNI_PHLP } /* scriptextensions=psalterpahlavi */, - { 24, 1102, 1090, 4, 4, UNI_LINB } /* scx=linb */, - { 8, 313, 1451, 2, 10, UNI_INDIVESAKURU } /* indivesakuru */, - { 25, 2, 2891, 2, 3, UNI_CWT } /* cwt=t */, - { 0, 7527, 3000, 3, 9, UNI_LB__QU } /* lb=quotation */, - { 0, 2726, 252, 3, 5, UNI_XPOSIXCNTRL } /* gc=cntrl */, - { 3, 4355, 453, 17, 4, UNI_MIAO } /* scriptextensions=plrd */, - { 35, 1102, 783, 4, 7, UNI_OSMA } /* scx=osmanya */, - { 0, 1879, 3839, 4, 6, UNI_INTANGUT } /* blk=tangut */, - { 147, 6185, 0, 16, 0, UNI_NV__100 } /* numericvalue=100 */, - { 1, 343, 3486, 4, 12, UNI_CCC__0 } /* ccc=notreordered */, - { 2, 5825, 0, 19, 0, UNI_SUNDANESESUP } /* sundanesesupplement */, - { 9, 313, 861, 2, 7, UNI_INTIBETAN } /* intibetan */, - { 0, 608, 6573, 2, 3, UNI_IDC } /* idc=t */, - { 12, 464, 1390, 2, 10, UNI_ASCII } /* isbasiclatin */, - { 18, 1065, 0, 4, 0, UNI_NV__1 } /* nv=1 */, - { 14, 6134, 0, 10, 0, UNI_GLAG } /* glagolitic */, - { 0, 1879, 401, 4, 4, UNI_INMIAO } /* blk=miao */, - { 1, 464, 366, 2, 2, UNI_SM } /* issm */, - { 1, 464, 967, 2, 8, UNI_GUJR } /* isgujarati */, - { 38, 1856, 356, 11, 4, UNI_BIDIC } /* bidicontrol=yes */, - { 0, 6402, 40, 14, 2, UNI_SB__AT } /* sentencebreak=at */, - { 1, 1879, 5340, 4, 13, UNI_DEVANAGARIEXT } /* blk=devanagariext */, - { 72, 313, 3543, 2, 16, UNI_HIGHPUSURROGATES } /* inhighpusurrogates */, - { 1, 5147, 1646, 11, 4, UNI_LATINEXTD } /* block=latinextd */, - { 64, 3474, 5304, 6, 18, UNI_TAIXUANJING } /* block=taixuanjingsymbols */, - { 24, 6402, 285, 14, 2, UNI_SB__XX } /* sentencebreak=xx */, - { 2, 1410, 7173, 7, 2, UNI_CCC__28 } /* ccc=ccc28 */, - { 20, 1879, 2217, 4, 12, UNI_INOLDHUNGARIAN } /* blk=oldhungarian */, - { 1, 7688, 4984, 23, 6, UNI_JG__MANICHAEANLAMEDH } /* joininggroup=manichaeanlamedh */, - { 1, 275, 3654, 4, 11, UNI_GCB__SM } /* gcb=spacingmark */, - { 0, 464, 4827, 2, 15, UNI_BAMUMSUP } /* isbamumsupplement */, - { 0, 5907, 0, 4, 0, UNI_SINH } /* sinh */, - { 1, 4996, 603, 12, 4, UNI_JG__MANICHAEANONE } /* jg=manichaeanone */, - { 4, 2392, 2603, 3, 12, UNI_MISCTECHNICAL } /* inmisctechnical */, - { 0, 4450, 4442, 14, 9, UNI_CYRILLICEXTB } /* block=cyrillicextendedb */, - { 1, 1465, 355, 4, 5, UNI_XPOSIXSPACE } /* space=yes */, - { 1, 4355, 433, 17, 4, UNI_NKO } /* scriptextensions=nkoo */, - { 30, 313, 4582, 2, 11, UNI_BOPOMOFOEXT } /* inbopomofoext */, - { 0, 464, 5103, 2, 2, UNI_CASEDLETTER } /* isl_ */, - { 9, 7208, 3236, 9, 13, UNI_ME } /* category=enclosingmark */, - { 0, 1856, 588, 5, 5, UNI_BIDIC } /* bidic=true */, - { 1, 5844, 1818, 5, 8, UNI_SUPERANDSUB } /* issuperandsub */, - { 0, 7605, 0, 20, 0, UNI_GCB__L } /* hangulsyllabletype=l */, - { 39, 6025, 6878, 9, 15, UNI_GEOMETRICSHAPESEXT } /* block=geometricshapesext */, - { 2, 5586, 3654, 21, 11, UNI_GCB__SM } /* graphemeclusterbreak=spacingmark */, - { 12, 4758, 0, 18, 0, UNI_ZP } /* paragraphseparator */, - { 4, 464, 3823, 2, 16, UNI_STERM } /* issentenceterminal */, - { 2, 6379, 0, 13, 0, UNI_jg_values_index } /* joininggroup= */, - { 0, 3669, 1849, 12, 3, UNI_JG__MALAYALAMLLA } /* jg=malayalamlla */, - { 1, 464, 1400, 2, 10, UNI_BOXDRAWING } /* isboxdrawing */, - { 1, 464, 4092, 2, 12, UNI_DIACRITICALS } /* isdiacriticals */, - { 48, 6944, 293, 24, 1, UNI_CCC__0 } /* canonicalcombiningclass=0 */, - { 1, 4662, 8551, 12, 21, UNI_SUPMATHOPERATORS } /* supplementalmathematicaloperators */, - { 0, 5844, 7643, 13, 17, UNI_SUPPUAB } /* issupplementaryprivateuseareab */, - { 187, 1845, 0, 11, 0, UNI_YISYLLABLES } /* yisyllables */, - { 1, 4776, 5620, 16, 4, -UNI__PERL_PATWS } /* patternwhitespace=no */, - { 145, 3053, 588, 13, 5, UNI_POSIXXDIGIT } /* asciihexdigit=true */, - { 1, 1796, 43, 7, 4, UNI_BHKS } /* script=bhks */, - { 2, 6112, 6613, 14, 10, UNI_INSC__CONSONANTHEADLETTER } /* insc=consonantheadletter */, - { 0, 1075, 6199, 4, 5, UNI_NV__200000 } /* nv=200000 */, - { 32, 6114, 5727, 3, 21, UNI_PRTI } /* sc=inscriptionalparthian */, - { 4, 117, 0, 2, 0, UNI_XPOSIXDIGIT } /* nd */, - { 0, 7431, 2138, 28, 2, UNI_WB__EB } /* canonicalcombiningclass=ccc133 */, - { 1, 3595, 129, 11, 3, UNI_LATINEXTF } /* latinextendedf */, - { 32, 1977, 4122, 5, 5, UNI_POSIXLOWER } /* posixlower */, - { 3, 8276, 3217, 31, 6, UNI_INSC__CONSONANTKILLER } /* indicsyllabiccategory=consonantkiller */, - { 2, 5136, 3719, 5, 15, UNI_MISCMATHSYMBOLSA } /* blk=miscmathsymbolsa */, - { 5, 1915, 0, 12, 0, UNI_GRBASE } /* graphemebase */, - { 20, 1487, 0, 8, 0, UNI_JAMOEXTA } /* jamoexta */, - { 0, 4355, 244, 17, 4, UNI_ZYYY } /* scriptextensions=zyyy */, - { 1, 1382, 601, 7, 4, -UNI_XIDS } /* xidstart=no */, - { 5, 3823, 602, 16, 2, -UNI_STERM } /* sentenceterminal=n */, - { 8, 5718, 934, 4, 2, -UNI_EMOD } /* emod=f */, - { 1, 3474, 36, 6, 2, UNI_INVS } /* block=vs */, - { 0, 7201, 366, 16, 2, UNI_SM } /* generalcategory=sm */, - { 5, 1879, 6594, 4, 6, UNI_INBRAHMI } /* blk=brahmi */, - { 1, 464, 196, 2, 4, UNI_TAGS } /* istags */, - { 3, 373, 6635, 3, 8, UNI_LO } /* otherletter */, - { 77, 3474, 6728, 6, 21, UNI_MEETEIMAYEKEXT } /* block=meeteimayekextensions */, - { 1, 4783, 5620, 9, 4, -UNI_XPOSIXSPACE } /* whitespace=no */, - { 4, 1065, 769, 4, 3, UNI_NV__15_SLASH_2 } /* nv=15/2 */, - { 46, 2678, 4783, 3, 10, UNI_BC__WS } /* bc=whitespace */, - { 3, 343, 1303, 5, 2, UNI_CCC__132 } /* ccc=132 */, - { 0, 464, 1027, 2, 4, UNI_YEZI } /* isyezi */, - { 38, 270, 356, 3, 4, UNI_CWT } /* cwt=yes */, - { 3, 1198, 850, 4, 3, UNI_GRAN } /* grantha */, - { 0, 4308, 602, 14, 3, UNI_NFKDQC__N } /* nfkdquickcheck=no */, - { 1, 7584, 1127, 18, 3, UNI_DT__FIN } /* decompositiontype=fin */, - { 0, 4901, 355, 16, 5, UNI_EBASE } /* emojimodifierbase=yes */, - { 1, 343, 3363, 3, 3, UNI_CCC__23 } /* ccc=23 */, - { 17, 7201, 3223, 16, 13, UNI_XPOSIXDIGIT } /* generalcategory=decimalnumber */, - { 0, 3474, 1198, 6, 7, UNI_INGRANTHA } /* block=grantha */, - { 5, 464, 441, 2, 4, UNI_OLCK } /* isolck */, - { 22, 168, 170, 2, 2, UNI_COPT } /* qaac */, - { 1, 2496, 4152, 3, 14, UNI_JG__HAMZAONHEHGOAL } /* jg=hamzaonhehgoal */, - { 21, 3474, 301, 6, 5, UNI_INORIYA } /* block=oriya */, - { 5, 600, 6944, 3, 9, UNI_DT__CAN } /* dt=canonical */, - { 0, 313, 429, 2, 3, UNI_INMRO } /* inmro */, - { 0, 1879, 7791, 4, 32, UNI_INIDC } /* blk=ideographicdescriptioncharacters */, - { 8, 4122, 587, 8, 6, UNI_XPOSIXLOWER } /* lowercase=true */, - { 0, 1879, 691, 4, 5, UNI_INBATAK } /* blk=batak */, - { 56, 34, 1890, 1, 4, UNI_EXT } /* isext */, - { 0, 1702, 32, 3, 3, UNI_ARMI } /* isarmi */, - { 2, 4355, 216, 17, 4, UNI_TIBT } /* scriptextensions=tibt */, - { 24, 6379, 6666, 13, 21, UNI_JG__HANIFIROHINGYAKINNAYA } /* joininggroup=hanifirohingyakinnaya */, - { 0, 1796, 2041, 7, 4, UNI_MEND } /* script=mend */, - { 0, 449, 0, 4, 0, UNI_PHLI } /* phli */, - { 8, 4291, 5718, 10, 9, UNI_EMOD } /* linebreak=emodifier */, - { 4, 1879, 6439, 4, 13, UNI_ZNAMENNYMUSIC } /* blk=znamennymusic */, - { 21, 5056, 0, 19, 0, UNI_OTTOMANSIYAQNUMBERS } /* ottomansiyaqnumbers */, - { 0, 464, 453, 2, 4, UNI_MIAO } /* isplrd */, - { 40, 313, 5340, 2, 10, UNI_INDEVANAGARI } /* indevanagari */, - { 2, 3351, 396, 13, 2, UNI_NV__15 } /* numericvalue=15 */, - { 67, 1102, 661, 4, 5, UNI_DOGR } /* scx=dogra */, - { 1, 464, 3053, 2, 5, UNI_ASCII } /* isascii */, - { 0, 7880, 6352, 5, 18, UNI_CJKRADICALSSUP } /* iscjkradicalssupplement */, - { 89, 1236, 5138, 4, 9, UNI_INMYANMAR } /* block=myanmar */, - { 4, 644, 3559, 4, 12, UNI_GCB__T } /* hst=trailingjamo */, - { 1, 3450, 5797, 12, 9, UNI_CYRILLICEXTA } /* blk=cyrillicextendeda */, - { 0, 1102, 991, 4, 6, UNI_HATR } /* scx=hatran */, - { 1, 7660, 356, 17, 2, UNI_VS } /* variationselector=y */, - { 4, 313, 522, 2, 2, UNI_IN__7 } /* in=7 */, - { 129, 7018, 3722, 8, 4, UNI_ARABICMATH } /* inarabicmath */, - { 3, 464, 6103, 2, 9, UNI_XSUX } /* iscuneiform */, - { 16, 7740, 934, 11, 6, -UNI_IDEO } /* ideographic=false */, - { 0, 939, 356, 5, 4, UNI_ECOMP } /* ecomp=yes */, - { 4, 4355, 686, 17, 5, UNI_TAKR } /* scriptextensions=takri */, - { 80, 895, 292, 6, 2, UNI_AGE__13 } /* age=v130 */, - { 1, 3885, 0, 17, 0, UNI_AGHB } /* caucasianalbanian */, - { 59, 7317, 6264, 10, 3, UNI_BC__PDI } /* bidiclass=pdi */, - { 7, 3474, 4827, 6, 8, UNI_BAMUMSUP } /* block=bamumsup */, - { 4, 15, 2665, 1, 13, UNI_ANCIENTSYMBOLS } /* ancientsymbols */, - { 3, 1796, 144, 7, 4, UNI_NEWA } /* script=newa */, - { 3, 2981, 1303, 4, 2, UNI_IN__3_DOT_2 } /* in=v32 */, - { 0, 313, 991, 2, 6, UNI_INHATRAN } /* inhatran */, - { 5, 2253, 6214, 11, 3, UNI_IN__12_DOT_1 } /* presentin=12.1 */, - { 4, 1879, 825, 4, 7, UNI_SHAW } /* blk=shavian */, - { 2, 6112, 2573, 5, 6, UNI_LB__ZWJ } /* insc=joiner */, - { 0, 1102, 71, 4, 4, UNI_CPRT } /* scx=cprt */, - { 7, 1717, 327, 3, 4, UNI_VSSUP } /* isvssup */, - { 10, 3763, 392, 15, 1, UNI_NV__5_SLASH_6 } /* numericvalue=5/6 */, - { 1, 313, 301, 2, 5, UNI_INORIYA } /* inoriya */, - { 0, 1102, 1326, 4, 9, UNI_ORKH } /* scx=oldturkic */, - { 0, 7527, 287, 3, 2, UNI_LB__NU } /* lb=nu */, - { 128, 880, 0, 7, 0, UNI_ZZZZ } /* unknown */, - { 4, 2392, 743, 3, 6, UNI_INMANDAIC } /* inmandaic */, - { 32, 313, 6134, 2, 10, UNI_INGLAGOLITIC } /* inglagolitic */, - { 0, 265, 0, 5, 0, UNI_CWKCF } /* cwkcf */, - { 44, 1879, 36, 4, 2, UNI_INVS } /* blk=vs */, - { 0, 3641, 4538, 10, 13, UNI_SUPPUNCTUATION } /* supplementalpunctuation */, - { 0, 0, 2579, 1, 12, UNI_LOWSURROGATES } /* lowsurrogates */, - { 6, 3474, 847, 6, 7, UNI_INTAITHAM } /* block=taitham */, - { 0, 1879, 1887, 4, 8, UNI_UCASEXTA } /* blk=ucasexta */, - { 5, 3474, 4750, 6, 8, UNI_DINGBATS } /* block=dingbats */, - { 4, 464, 2217, 2, 12, UNI_HUNG } /* isoldhungarian */, - { 0, 1102, 5631, 4, 5, UNI_GREK } /* scx=greek */, - { 0, 6114, 861, 3, 7, UNI_TIBT } /* sc=tibetan */, - { 0, 4433, 4275, 5, 16, UNI_LETTERLIKESYMBOLS } /* blk=letterlikesymbols */, - { 0, 3474, 4827, 6, 15, UNI_BAMUMSUP } /* block=bamumsupplement */, - { 0, 464, 3058, 2, 8, UNI_XPOSIXXDIGIT } /* ishexdigit */, - { 0, 1991, 2539, 12, 10, UNI_JT__U } /* joiningtype=nonjoining */, - { 0, 1991, 345, 4, 2, UNI_joinc_values_index } /* joinc= */, - { 0, 6114, 461, 3, 4, UNI_SC__QAAI } /* sc=qaai */, - { 0, 3595, 0, 9, 0, UNI_LATINEXTE } /* latinexte */, - { 6, 124, 0, 4, 0, UNI_LATN } /* latn */, - { 0, 7823, 6177, 4, 8, UNI_CJKSYMBOLS } /* incjksymbols */, - { 7, 5099, 7094, 6, 21, UNI__PERL_IS_IN_MULTI_CHAR_FOLD } /* _perl_is_in_multi_char_fold */, - { 0, 6944, 584, 23, 3, UNI_CCC__22 } /* canonicalcombiningclass=22 */, - { 1, 8007, 5, 7, 4, UNI_CJKEXTG } /* blk=cjkextg */, - { 0, 313, 8078, 2, 18, UNI_IDEOGRAPHICSYMBOLS } /* inideographicsymbols */, - { 1, 3474, 7403, 6, 28, UNI_SUPPUAA } /* block=supplementaryprivateuseareaa */, - { 1, 6112, 1958, 5, 7, UNI_INSC__VISARGA } /* insc=visarga */, - { 0, 4355, 5806, 17, 9, UNI_MONG } /* scriptextensions=mongolian */, - { 0, 6112, 2344, 5, 5, UNI_INSC__VOWEL } /* insc=vowel */, - { 4, 7201, 252, 16, 5, UNI_XPOSIXCNTRL } /* generalcategory=cntrl */, - { 30, 3474, 5727, 6, 21, UNI_ININSCRIPTIONALPARTHIAN } /* block=inscriptionalparthian */, - { 0, 2275, 934, 3, 6, -UNI_IDC } /* idc=false */, - { 2, 2474, 7761, 3, 30, UNI_MATHALPHANUM } /* ismathematicalalphanumericsymbols */, - { 24, 3351, 2111, 13, 9, UNI_NV__3_SLASH_16 } /* numericvalue=1.875e-01 */, - { 8, 7201, 2728, 15, 6, UNI_C } /* generalcategory=other */, - { 1, 2973, 356, 5, 4, UNI_EPRES } /* epres=yes */, - { 1, 7317, 5428, 10, 18, UNI_BC__ET } /* bidiclass=europeanterminator */, - { 4, 464, 4500, 2, 5, UNI_XPOSIXUPPER } /* isupper */, - { 1, 3367, 1300, 14, 3, UNI_NV__4000 } /* numericvalue=4000 */, - { 1, 4355, 574, 17, 7, UNI_AVST } /* scriptextensions=avestan */, - { 81, 58, 3453, 2, 9, UNI_SC__CYRL } /* sc=cyrillic */, - { 88, 5886, 356, 21, 2, UNI__PERL_NCHAR } /* noncharactercodepoint=y */, - { 161, 1102, 301, 4, 5, UNI_ORYA } /* scx=oriya */, - { 0, 19, 3805, 2, 3, UNI_AGE__8 } /* age=8 */, - { 1, 313, 2428, 2, 13, UNI_IPAEXT } /* inipaextensions */, - { 2, 4291, 2581, 10, 9, UNI_LB__SG } /* linebreak=surrogate */, - { 1, 1102, 1807, 4, 11, UNI_SORA } /* scx=sorasompeng */, - { 0, 1410, 585, 8, 2, UNI_CCC__122 } /* ccc=ccc122 */, - { 1, 5481, 934, 21, 6, -UNI_CWCF } /* changeswhencasefolded=false */, - { 0, 464, 78, 2, 4, UNI_CYRL } /* iscyrl */, - { 0, 1102, 1241, 4, 4, UNI_PHAG } /* scx=phag */, - { 0, 464, 728, 2, 7, UNI_KALI } /* iskayahli */, - { 4, 1395, 4464, 5, 4, UNI_LATINEXTC } /* latinextc */, - { 2, 4355, 1508, 17, 4, UNI_UGAR } /* scriptextensions=ugar */, - { 0, 6687, 723, 22, 3, UNI_JG__MALAYALAMNNA } /* joininggroup=malayalamnna */, - { 87, 3474, 3053, 6, 5, UNI_ASCII } /* block=ascii */, - { 0, 6803, 934, 20, 6, -UNI_CE } /* compositionexclusion=false */, - { 2, 593, 0, 7, 0, UNI_DSRT } /* deseret */, - { 1, 7317, 191, 10, 2, UNI_BC__WS } /* bidiclass=ws */, - { 0, 4355, 1311, 17, 4, UNI_ITAL } /* scriptextensions=ital */, - { 17, 8007, 1491, 7, 4, UNI_CJKEXTA } /* blk=cjkexta */, - { 3, 2205, 2617, 4, 8, UNI_NV__4_SLASH_5 } /* nv=8.000e-01 */, - { 2, 6944, 294, 25, 1, UNI_CCC__24 } /* canonicalcombiningclass=24 */, - { 1, 1796, 417, 7, 3, UNI_SC__HAN } /* script=han */, - { 0, 6803, 934, 20, 2, -UNI_CE } /* compositionexclusion=f */, - { 0, 3474, 7500, 6, 27, UNI_ANCIENTGREEKMUSIC } /* block=ancientgreekmusicalnotation */, - { 0, 1796, 1927, 7, 12, UNI_SC__GONG } /* script=gunjalagondi */, - { 1, 464, 445, 2, 4, UNI_ORKH } /* isorkh */, - { 20, 4291, 3297, 10, 12, UNI_LB__IS } /* linebreak=infixnumeric */, - { 2, 464, 5825, 2, 12, UNI_SUNDANESESUP } /* issundanesesup */, - { 1, 1065, 3807, 5, 2, UNI_NV__1_SLASH_80 } /* nv=1/80 */, - { 18, 940, 934, 6, 6, -UNI_COMPEX } /* compex=false */, - { 1, 6112, 2420, 5, 8, UNI_INSC__TONEMARK } /* insc=tonemark */, - { 0, 343, 2679, 2, 7, UNI_CCC__R } /* ccc=right */, - { 5, 464, 5631, 2, 5, UNI_GREK } /* isgreek */, - { 1, 464, 6728, 2, 21, UNI_MEETEIMAYEKEXT } /* ismeeteimayekextensions */, - { 0, 2353, 1895, 3, 11, UNI_CHESSSYMBOLS } /* inchesssymbols */, - { 0, 4500, 355, 8, 3, UNI_XPOSIXUPPER } /* uppercase=y */, - { 0, 8470, 2680, 19, 2, UNI_VO__R } /* verticalorientation=r */, - { 7, 3351, 2616, 13, 9, UNI_NV__1_SLASH_2 } /* numericvalue=5.000e-01 */, - { 15, 2355, 1037, 8, 4, UNI_CYRILLICEXTB } /* cyrillicextb */, - { 0, 296, 6197, 2, 8, UNI_NV__1000000 } /* nv=1000000 */, - { 4, 1879, 2771, 4, 12, UNI_KHMERSYMBOLS } /* blk=khmersymbols */, - { 0, 8533, 7238, 7, 24, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* block=symbolsandpictographsexta */, - { 1, 2253, 2649, 10, 3, UNI_IN__6_DOT_1 } /* presentin=6.1 */, - { 0, 7182, 6334, 3, 18, UNI_CJKCOMPATFORMS } /* cjkcompatibilityforms */, - { 0, 3474, 326, 6, 5, UNI_VSSUP } /* block=vssup */, - { 6, 6114, 611, 3, 7, UNI_ELBA } /* sc=elbasan */, - { 0, 5865, 602, 21, 3, -UNI_LOE } /* logicalorderexception=no */, - { 0, 6687, 532, 22, 2, UNI_JG__MALAYALAMJA } /* joininggroup=malayalamja */, - { 3, 464, 735, 2, 7, UNI_LINA } /* islineara */, - { 1, 555, 140, 4, 2, UNI_IN__NA } /* age=na */, - { 4, 1516, 5797, 6, 9, UNI_KANAEXTA } /* iskanaextendeda */, - { 0, 464, 270, 2, 3, UNI_CWT } /* iscwt */, - { 177, 1382, 588, 4, 5, UNI_XIDS } /* xids=true */, - { 18, 1826, 0, 4, 0, UNI_SYLO } /* sylo */, - { 1, 1102, 417, 4, 3, UNI_HAN } /* scx=han */, - { 2, 257, 934, 4, 2, -UNI_CWCF } /* cwcf=f */, - { 0, 1102, 27, 4, 4, UNI_AHOM } /* scx=ahom */, - { 0, 464, 229, 2, 2, UNI_PE } /* ispe */, - { 24, 4450, 6142, 12, 5, UNI_CYRILLICSUP } /* block=cyrillicsup */, - { 6, 343, 299, 5, 1, UNI_CCC__19 } /* ccc=19 */, - { 1, 1879, 6919, 4, 25, UNI_SYMBOLSFORLEGACYCOMPUTING } /* blk=symbolsforlegacycomputing */, - { 0, 2981, 292, 5, 2, UNI_IN__13 } /* in=v130 */, - { 10, 3748, 299, 14, 1, UNI_NV__19 } /* numericvalue=19 */, - { 12, 464, 5825, 2, 4, UNI_SUND } /* issund */, - { 2, 1796, 4998, 6, 5, UNI_SC__MANI } /* script=mani */, - { 23, 581, 2138, 5, 2, UNI_CCC__DB } /* ccc=233 */, - { 64, 94, 11, 3, 1, UNI_GUJR } /* gujr */, - { 0, 1879, 1927, 4, 12, UNI_INGUNJALAGONDI } /* blk=gunjalagondi */, - { 1, 19, 3378, 2, 3, UNI_AGE__4 } /* age=4 */, - { 1, 4450, 7403, 14, 13, UNI_CYRILLICSUP } /* block=cyrillicsupplementary */, - { 36, 4122, 355, 8, 3, UNI_XPOSIXLOWER } /* lowercase=y */, - { 7, 4355, 637, 17, 7, UNI_HANO } /* scriptextensions=hanunoo */, - { 4, 6114, 1320, 3, 4, UNI_SC__PERM } /* sc=perm */, - { 8, 7527, 4261, 3, 14, UNI_LB__PO } /* lb=postfixnumeric */, - { 3, 2205, 1300, 4, 3, UNI_NV__8000 } /* nv=8000 */, - { 1, 7740, 934, 11, 2, -UNI_IDEO } /* ideographic=f */, - { 0, 75, 356, 3, 2, UNI_CWU } /* cwu=y */, - { 5, 536, 844, 3, 2, UNI_SB__LO } /* sb=lo */, - { 5, 7208, 317, 9, 4, UNI_M } /* category=mark */, - { 4, 1102, 429, 4, 3, UNI_MRO } /* scx=mro */, - { 0, 686, 0, 4, 0, UNI_TAKR } /* takr */, - { 0, 313, 1390, 2, 10, UNI_ASCII } /* inbasiclatin */, - { 0, 128, 0, 2, 0, UNI_ME } /* me */, - { 1, 5147, 4629, 10, 2, UNI_LATIN1 } /* block=latin1 */, - { 8, 1879, 2740, 4, 6, UNI_INCOPTIC } /* blk=coptic */, - { 69, 343, 772, 4, 2, UNI_CCC__17 } /* ccc=17 */, - { 5, 2961, 593, 12, 2, UNI_XPOSIXDIGIT } /* numerictype=de */, - { 2, 2392, 3719, 3, 15, UNI_MISCMATHSYMBOLSA } /* inmiscmathsymbolsa */, - { 2, 4355, 78, 17, 4, UNI_CYRL } /* scriptextensions=cyrl */, - { 0, 5099, 3044, 6, 9, UNI__PERL_QUOTEMETA } /* _perl_quotemeta */, - { 0, 3622, 799, 3, 3, UNI_LANA } /* islana */, - { 42, 7584, 4533, 18, 4, UNI_DT__INIT } /* decompositiontype=init */, - { 2, 6114, 1529, 3, 4, UNI_KHAR } /* sc=khar */, - { 64, 4355, 814, 17, 4, UNI_QAAI } /* scriptextensions=zinh */, - { 2, 7208, 4077, 9, 15, UNI_PD } /* category=dashpunctuation */, - { 33, 409, 356, 2, 2, UNI_DI } /* di=y */, - { 0, 2961, 602, 11, 5, UNI_NV__NAN } /* numerictype=none */, - { 0, 1702, 1141, 8, 3, UNI_ARABICPFA } /* isarabicpfa */, - { 132, 2678, 334, 3, 3, UNI_BC__PDF } /* bc=pdf */, - { 4, 7338, 5970, 21, 8, UNI_BC__RLO } /* bidiclass=righttoleftoverride */, - { 0, 464, 82, 2, 4, UNI_DSRT } /* isdsrt */, - { 0, 1075, 518, 4, 2, UNI_NV__2_SLASH_5 } /* nv=2/5 */, - { 2, 2310, 355, 12, 2, UNI_ci_values_index } /* caseignorable= */, - { 2, 14, 0, 1, 0, UNI_M } /* m */, - { 1, 296, 1299, 3, 3, UNI_NV__600 } /* nv=600 */, - { 0, 7148, 585, 25, 2, UNI_CCC__122 } /* canonicalcombiningclass=122 */, - { 0, 6114, 686, 3, 5, UNI_SC__TAKR } /* sc=takri */, - { 0, 840, 0, 7, 0, UNI_TGLG } /* tagalog */, - { 0, 464, 4827, 2, 4, UNI_BAMU } /* isbamu */, - { 193, 4433, 1037, 9, 4, UNI_LATINEXTB } /* blk=latinextb */, - { 2, 1887, 1890, 3, 4, UNI_UCASEXT } /* ucasext */, - { 3, 600, 3444, 3, 6, UNI_DT__SQR } /* dt=square */, - { 58, 1796, 0, 7, 0, UNI_sc_values_index } /* script= */, - { 1, 4355, 6594, 17, 4, UNI_BRAH } /* scriptextensions=brah */, - { 1, 5087, 1837, 10, 5, UNI_WB__EB } /* wordbreak=ebase */, - { 6, 2981, 891, 5, 2, UNI_IN__11 } /* in=v110 */, - { 0, 3474, 5631, 6, 5, UNI_INGREEK } /* block=greek */, - { 22, 3462, 7851, 5, 20, UNI_ENCLOSEDALPHANUM } /* blk=enclosedalphanumerics */, - { 0, 14, 962, 1, 3, UNI_MEND } /* mend */, - { 0, 1102, 1003, 4, 4, UNI_LEPC } /* scx=lepc */, - { 1, 313, 1220, 2, 7, UNI_INMAKASAR } /* inmakasar */, - { 0, 6944, 2702, 24, 4, UNI_CCC__6 } /* canonicalcombiningclass=hanr */, - { 168, 3974, 356, 17, 2, UNI_IDSB } /* idsbinaryoperator=y */, - { 7, 259, 0, 2, 0, UNI_CF } /* cf */, - { 1, 34, 1440, 1, 11, UNI_DEP } /* isdeprecated */, - { 1, 6944, 349, 24, 2, UNI_CCC__84 } /* canonicalcombiningclass=84 */, - { 1, 8470, 1607, 20, 7, UNI_VO__U } /* verticalorientation=upright */, - { 0, 1082, 0, 4, 0, UNI_XPOSIXWORD } /* word */, - { 0, 464, 5727, 2, 21, UNI_PRTI } /* isinscriptionalparthian */, - { 5, 1102, 1344, 4, 9, UNI_PALM } /* scx=palmyrene */, - { 2, 464, 844, 2, 2, UNI_LO } /* islo */, - { 7, 3672, 0, 9, 0, UNI_MLYM } /* malayalam */, - { 217, 464, 628, 2, 2, UNI_PI } /* ispi */, - { 1, 1796, 228, 7, 4, UNI_XPEO } /* script=xpeo */, - { 2, 1102, 686, 4, 4, UNI_TAKR } /* scx=takr */, - { 0, 5888, 0, 5, 0, UNI__PERL_NCHAR } /* nchar */, - { 9, 1867, 356, 12, 4, UNI_BIDIM } /* bidimirrored=yes */, - { 1, 1796, 445, 7, 4, UNI_ORKH } /* script=orkh */, - { 0, 12, 602, 3, 3, -UNI_PCM } /* pcm=no */, - { 3, 7201, 3947, 16, 14, UNI_ZS } /* generalcategory=spaceseparator */, - { 0, 4433, 1646, 9, 4, UNI_LATINEXTD } /* blk=latinextd */, - { 2, 3474, 1220, 6, 7, UNI_INMAKASAR } /* block=makasar */, - { 8, 1879, 5787, 4, 19, UNI_JAMOEXTA } /* blk=hanguljamoextendeda */, - { 2, 5, 588, 3, 2, UNI_EXT } /* ext=t */, - { 0, 313, 7732, 2, 29, UNI_ENCLOSEDIDEOGRAPHICSUP } /* inenclosedideographicsupplement */, - { 5, 1856, 934, 5, 2, -UNI_BIDIC } /* bidic=f */, - { 32, 4740, 0, 18, 0, UNI_ORNAMENTALDINGBATS } /* ornamentaldingbats */, - { 8, 7527, 285, 3, 2, UNI_LB__XX } /* lb=xx */, - { 0, 1704, 1037, 6, 4, UNI_ARABICEXTB } /* arabicextb */, - { 1, 464, 8599, 2, 18, UNI_CANS } /* iscanadianaboriginal */, - { 145, 15, 5625, 1, 18, UNI_ANCIENTGREEKNUMBERS } /* ancientgreeknumbers */, - { 1, 313, 4107, 2, 6, UNI_INHANGUL } /* inhangul */, - { 2, 6011, 5769, 7, 15, UNI_ENCLOSEDALPHANUM } /* block=enclosedalphanum */, - { 0, 3474, 6833, 6, 14, UNI_BYZANTINEMUSIC } /* block=byzantinemusic */, - { 0, 257, 588, 4, 2, UNI_CWCF } /* cwcf=t */, - { 4, 233, 4388, 2, 15, UNI_SUTTONSIGNWRITING } /* suttonsignwriting */, - { 0, 3748, 0, 14, 0, UNI_NV__1 } /* numericvalue=1 */, - { 0, 7828, 934, 16, 2, -UNI_UIDEO } /* unifiedideograph=f */, - { 2, 3474, 1021, 6, 6, UNI_INWANCHO } /* block=wancho */, - { 0, 2974, 891, 12, 2, UNI_IN__11 } /* presentin=v110 */, - { 2, 4291, 2016, 10, 2, UNI_GCB__V } /* linebreak=jv */, - { 3, 2353, 4457, 3, 11, UNI_CYRILLICEXTC } /* incyrillicextc */, - { 218, 2961, 409, 12, 2, UNI_NT__DI } /* numerictype=di */, - { 26, 6114, 3381, 3, 15, UNI_NARB } /* sc=oldnortharabian */, - { 1, 1796, 783, 7, 4, UNI_OSMA } /* script=osma */, - { 3, 1102, 496, 4, 4, UNI_KHOJ } /* scx=khoj */, - { 0, 464, 1289, 2, 9, UNI_TALU } /* isnewtailue */, - { 5, 4355, 818, 17, 7, UNI_SHRD } /* scriptextensions=sharada */, - { 0, 901, 0, 8, 0, UNI_ARMN } /* armenian */, - { 74, 6379, 4198, 13, 4, UNI_JG__TETH } /* joininggroup=teth */, - { 1, 1975, 0, 4, 0, UNI_PO } /* ispo */, - { 66, 2353, 8150, 3, 24, UNI_DIACRITICALS } /* incombiningdiacriticalmarks */, - { 28, 3779, 1072, 14, 3, UNI_NV__7_SLASH_12 } /* numericvalue=7/12 */, - { 1, 464, 1668, 2, 11, UNI_DOMINO } /* isdominotiles */, - { 0, 4291, 7044, 10, 13, UNI_LB__CM } /* linebreak=combiningmark */, - { 1, 1102, 794, 4, 4, UNI_KALI } /* scx=kali */, - { 67, 313, 951, 2, 8, UNI_INDUPLOYAN } /* induployan */, - { 5, 1102, 1362, 4, 9, UNI_SAMR } /* scx=samaritan */, - { 67, 5322, 5329, 7, 11, UNI_CHEROKEESUP } /* cherokeesupplement */, - { 18, 1796, 783, 7, 7, UNI_OSMA } /* script=osmanya */, - { 2, 464, 2, 2, 3, UNI_CWL } /* iscwl */, - { 7, 1796, 574, 7, 7, UNI_AVST } /* script=avestan */, - { 8, 3622, 1491, 7, 4, UNI_LATINEXTA } /* islatinexta */, - { 16, 1174, 1178, 4, 5, UNI_EA__NA } /* ea=narrow */, - { 0, 1102, 496, 4, 6, UNI_KHOJ } /* scx=khojki */, - { 1, 7201, 4758, 16, 18, UNI_ZP } /* generalcategory=paragraphseparator */, - { 0, 3474, 7732, 6, 22, UNI_ENCLOSEDIDEOGRAPHICSUP } /* block=enclosedideographicsup */, - { 3, 7431, 2138, 27, 2, UNI_CCC__33 } /* canonicalcombiningclass=ccc33 */, - { 1, 4662, 7643, 11, 17, UNI_SUPPUAB } /* supplementaryprivateuseareab */, - { 0, 1796, 5661, 7, 19, UNI_MERO } /* script=meroitichieroglyphs */, - { 1, 313, 691, 2, 5, UNI_INBATAK } /* inbatak */, - { 0, 8276, 8454, 22, 16, UNI_INSC__VOWELINDEPENDENT } /* indicsyllabiccategory=vowelindependent */, - { 0, 6379, 2688, 14, 3, UNI_JG__ALEF } /* joininggroup=alef */, - { 0, 7201, 8289, 7, 11, UNI_CO } /* generalcategory=co */, - { 0, 1102, 1785, 4, 11, UNI_HMNG } /* scx=pahawhhmong */, - { 1, 1879, 593, 4, 7, UNI_DSRT } /* blk=deseret */, - { 0, 4355, 671, 17, 5, UNI_OGAM } /* scriptextensions=ogham */, - { 2, 4500, 4127, 5, 10, UNI_UPPERCASELETTER } /* uppercaseletter */, - { 4, 3474, 7660, 6, 28, UNI_VSSUP } /* block=variationselectorssupplement */, - { 0, 257, 588, 4, 5, UNI_CWCF } /* cwcf=true */, - { 7, 1407, 2332, 3, 7, UNI_GREEKEXT } /* ingreekext */, - { 0, 1879, 5116, 4, 20, UNI_INANATOLIANHIEROGLYPHS } /* blk=anatolianhieroglyphs */, - { 8, 82, 0, 4, 0, UNI_DSRT } /* dsrt */, - { 0, 959, 356, 8, 2, UNI_EXT } /* extender=y */, - { 192, 464, 1589, 2, 3, UNI_ALL } /* isall */, - { 1, 7317, 56, 10, 2, UNI_BC__AN } /* bidiclass=an */, - { 0, 2443, 356, 5, 4, UNI_CASED } /* cased=yes */, - { 6, 7880, 6509, 5, 19, UNI_CJKCOMPATIDEOGRAPHSSUP } /* iscjkcompatideographssup */, - { 174, 313, 1495, 2, 8, UNI_INJAVANESE } /* injavanese */, - { 24, 1796, 2740, 7, 6, UNI_SC__COPT } /* script=coptic */, - { 0, 1102, 3671, 3, 10, UNI_MLYM } /* scx=malayalam */, - { 1, 6039, 1052, 7, 7, UNI_INMAHAJANI } /* block=mahajani */, - { 1, 1879, 4793, 4, 18, UNI_RUMI } /* blk=ruminumeralsymbols */, - { 4, 1796, 136, 7, 4, UNI_SC__MYMR } /* script=mymr */, - { 0, 3622, 5, 7, 4, UNI_LATINEXTG } /* islatinextg */, - { 0, 1102, 140, 4, 4, UNI_NARB } /* scx=narb */, - { 0, 6379, 2498, 12, 11, UNI_JG__AFRICANFEH } /* joininggroup=africanfeh */, - { 6, 6114, 1125, 3, 8, UNI_TFNG } /* sc=tifinagh */, - { 113, 313, 1271, 2, 9, UNI_INKHUDAWADI } /* inkhudawadi */, - { 4, 1796, 124, 7, 4, UNI_SC__LATN } /* script=latn */, - { 0, 7527, 2961, 3, 7, UNI_LB__NU } /* lb=numeric */, - { 0, 3474, 4202, 6, 17, UNI_INKHITANSMALLSCRIPT } /* block=khitansmallscript */, - { 0, 2, 64, 1, 3, UNI_CHRS } /* chrs */, - { 2, 1796, 4436, 6, 6, UNI_SC__LATN } /* script=latin */, - { 0, 2496, 787, 3, 3, UNI_JG__NYA } /* jg=nya */, - { 1, 1796, 156, 7, 4, UNI_SC__OUGR } /* script=ougr */, - { 0, 405, 0, 4, 0, UNI_ARMN } /* armn */, - { 3, 1326, 0, 9, 0, UNI_ORKH } /* oldturkic */, - { 0, 6919, 0, 25, 0, UNI_SYMBOLSFORLEGACYCOMPUTING } /* symbolsforlegacycomputing */, - { 8, 1480, 958, 7, 4, UNI_GEORGIANEXT } /* georgianext */, - { 0, 823, 934, 4, 6, -UNI_DASH } /* dash=false */, - { 4, 2973, 934, 5, 2, -UNI_EPRES } /* epres=f */, - { 8, 4355, 1248, 17, 4, UNI_SIDD } /* scriptextensions=sidd */, - { 0, 6114, 417, 3, 4, UNI_SC__HANO } /* sc=hano */, - { 0, 2193, 6199, 4, 5, UNI_NV__600000 } /* nv=600000 */, - { 4, 1102, 31, 4, 4, UNI_ARMI } /* scx=armi */, - { 17, 2220, 0, 4, 0, UNI_HUNG } /* hung */, - { 0, 2483, 1638, 4, 8, UNI_XPOSIXSPACE } /* isxperlspace */, - { 0, 3236, 0, 13, 0, UNI_ME } /* enclosingmark */, - { 0, 833, 278, 4, 1, UNI_term_values_index } /* term= */, - { 0, 8276, 6867, 31, 11, UNI_INSC__CONSONANTWITHSTACKER } /* indicsyllabiccategory=consonantwithstacker */, - { 76, 5087, 3416, 12, 7, UNI_WB__MB } /* wordbreak=midnumlet */, - { 142, 1991, 647, 11, 2, UNI_JT__L } /* joiningtype=l */, - { 1, 464, 868, 2, 7, UNI_TIRH } /* istirhuta */, - { 6, 306, 934, 5, 2, -UNI__PERL_PATWS } /* patws=f */, - { 1, 2496, 484, 3, 3, UNI_JG__GAF } /* jg=gaf */, - { 2, 3058, 934, 8, 2, -UNI_XPOSIXXDIGIT } /* hexdigit=f */, - { 0, 296, 768, 3, 2, UNI_NV__45 } /* nv=45 */, - { 0, 3053, 934, 13, 6, -UNI_POSIXXDIGIT } /* asciihexdigit=false */, - { 2, 3474, 5389, 6, 20, UNI_INNYIAKENGPUACHUEHMONG } /* block=nyiakengpuachuehmong */, - { 13, 1133, 0, 8, 0, UNI_VITH } /* vithkuqi */, - { 3, 6803, 602, 20, 3, -UNI_CE } /* compositionexclusion=no */, - { 77, 3809, 764, 14, 2, UNI_NV__9_SLASH_2 } /* numericvalue=9/2 */, - { 0, 5087, 287, 10, 2, UNI_WB__NU } /* wordbreak=nu */, - { 0, 57, 601, 1, 6, UNI_NV__NAN } /* nt=none */, - { 12, 1102, 909, 4, 4, UNI_BALI } /* scx=bali */, - { 5, 2678, 4758, 3, 18, UNI_BC__B } /* bc=paragraphseparator */, - { 5, 939, 934, 5, 2, -UNI_ECOMP } /* ecomp=f */, - { 0, 7431, 772, 27, 2, UNI_CCC__17 } /* canonicalcombiningclass=ccc17 */, - { 2, 19, 0, 4, 0, UNI_AGHB } /* aghb */, - { 5, 343, 119, 4, 2, UNI_CCC__AL } /* ccc=al */, - { 0, 1710, 466, 3, 3, UNI_SHRD } /* isshrd */, - { 4, 6114, 78, 3, 4, UNI_SC__CYRL } /* sc=cyrl */, - { 137, 2253, 890, 9, 3, UNI_IN__10 } /* presentin=10 */, - { 1, 1516, 2373, 4, 9, UNI_KATAKANAEXT } /* iskatakanaext */, - { 8, 1383, 356, 7, 4, UNI_IDS } /* idstart=yes */, - { 0, 5907, 0, 7, 0, UNI_SINH } /* sinhala */, - { 0, 3669, 787, 12, 3, UNI_JG__MALAYALAMNYA } /* jg=malayalamnya */, - { 18, 5186, 934, 20, 6, -UNI_EXTPICT } /* extendedpictographic=false */, - { 0, 2205, 2060, 8, 4, UNI_NV__5_SLASH_6 } /* nv=8.333e-01 */, - { 4, 3351, 2071, 13, 9, UNI_NV__1_SLASH_7 } /* numericvalue=1.429e-01 */, - { 1, 2274, 934, 4, 2, -UNI_XIDC } /* xidc=f */, - { 1, 36, 4370, 1, 2, UNI_vs_values_index } /* vs= */, - { 192, 2, 356, 3, 2, UNI_CWL } /* cwl=y */, - { 0, 7880, 0, 22, 0, UNI_CJK } /* iscjkunifiedideographs */, - { 0, 1102, 43, 4, 4, UNI_BHKS } /* scx=bhks */, - { 0, 3474, 1125, 6, 8, UNI_INTIFINAGH } /* block=tifinagh */, - { 11, 313, 2355, 2, 8, UNI_INCYRILLIC } /* incyrillic */, - { 6, 3474, 1571, 6, 10, UNI_INSAURASHTRA } /* block=saurashtra */, - { 0, 4355, 8599, 17, 18, UNI_CANS } /* scriptextensions=canadianaboriginal */, - { 0, 6114, 825, 3, 7, UNI_SHAW } /* sc=shavian */, - { 2, 4656, 0, 16, 0, UNI_TANGUTSUP } /* tangutsupplement */, - { 1, 2153, 292, 4, 1, UNI_NV__43 } /* nv=43 */, - { 3, 464, 1371, 2, 4, UNI_THAA } /* isthaa */, - { 74, 6114, 997, 3, 6, UNI_SC__KTHI } /* sc=kaithi */, - { 17, 4092, 934, 9, 2, -UNI_DIA } /* diacritic=f */, - { 16, 2274, 933, 10, 3, -UNI_XIDC } /* xidcontinue=f */, - { 0, 4322, 518, 14, 2, UNI_NV__3_SLASH_5 } /* numericvalue=3/5 */, - { 0, 8533, 6898, 9, 22, UNI_SUPERANDSUB } /* block=superscriptsandsubscripts */, - { 0, 2033, 1175, 4, 3, -UNI_XPOSIXALPHA } /* alpha=n */, - { 1, 1796, 671, 7, 5, UNI_OGAM } /* script=ogham */, - { 0, 600, 1176, 2, 4, UNI_DT__NAR } /* dt=nar */, - { 2, 2353, 8150, 3, 32, UNI_DIACRITICALSEXT } /* incombiningdiacriticalmarksextended */, - { 0, 1796, 2695, 6, 7, UNI_SC__ARAB } /* script=arabic */, - { 0, 7828, 0, 16, 0, UNI_UIDEO } /* unifiedideograph */, - { 1, 5586, 366, 21, 2, UNI_GCB__SM } /* graphemeclusterbreak=sm */, - { 2, 2463, 356, 5, 4, UNI_JOINC } /* joinc=yes */, - { 0, 2678, 6253, 14, 9, UNI_BC__RLE } /* bc=righttoleftembedding */, - { 3, 1879, 5797, 8, 9, UNI_KANAEXTA } /* blk=kanaextendeda */, - { 198, 5087, 285, 10, 2, UNI_WB__XX } /* wordbreak=xx */, - { 1, 5087, 959, 10, 6, UNI_WB__EXTEND } /* wordbreak=extend */, - { 209, 644, 0, 4, 0, UNI_hst_values_index } /* hst= */, - { 0, 464, 6276, 2, 6, UNI_CF } /* isformat */, - { 197, 1065, 766, 4, 3, UNI_NV__1_SLASH_64 } /* nv=1/64 */, - { 7, 3748, 3807, 15, 2, UNI_NV__1_SLASH_80 } /* numericvalue=1/80 */, - { 0, 1059, 356, 6, 4, UNI_DT__NONE } /* nfkdqc=yes */, - { 6, 6114, 2771, 3, 5, UNI_KHMR } /* sc=khmer */, - { 11, 464, 5806, 2, 9, UNI_MONG } /* ismongolian */, - { 5, 1879, 5727, 4, 21, UNI_ININSCRIPTIONALPARTHIAN } /* blk=inscriptionalparthian */, - { 0, 2726, 58, 3, 2, UNI_SC } /* gc=sc */, - { 0, 5865, 588, 21, 2, UNI_LOE } /* logicalorderexception=t */, - { 5, 7880, 5, 5, 4, UNI_CJKEXTG } /* iscjkextg */, - { 1, 8470, 1329, 20, 2, UNI_VO__TU } /* verticalorientation=tu */, - { 0, 1102, 39, 4, 4, UNI_BATK } /* scx=batk */, - { 0, 6112, 1157, 5, 5, UNI_INSC__NUKTA } /* insc=nukta */, - { 39, 1117, 0, 4, 0, UNI_TAGB } /* tagb */, - { 0, 3351, 800, 13, 3, UNI_NV__NAN } /* numericvalue=nan */, - { 0, 1796, 1508, 7, 4, UNI_UGAR } /* script=ugar */, - { 0, 296, 350, 3, 2, UNI_NV__49 } /* nv=49 */, - { 1, 1879, 1529, 4, 10, UNI_INKHAROSHTHI } /* blk=kharoshthi */, - { 1, 464, 3000, 2, 13, UNI_QMARK } /* isquotationmark */, - { 2, 6114, 67, 3, 4, UNI_SC__CPMN } /* sc=cpmn */, - { 0, 4322, 397, 14, 1, UNI_NV__35 } /* numericvalue=35 */, - { 40, 8007, 6352, 7, 18, UNI_CJKRADICALSSUP } /* blk=cjkradicalssupplement */, - { 0, 3351, 518, 14, 2, UNI_NV__2_SLASH_5 } /* numericvalue=2/5 */, - { 1, 464, 257, 2, 4, UNI_CWCF } /* iscwcf */, - { 5, 4291, 2937, 10, 11, UNI_LB__IN } /* linebreak=inseperable */, - { 1, 1102, 124, 4, 4, UNI_LATN } /* scx=latn */, - { 33, 8182, 0, 24, 0, UNI_inpc_values_index } /* indicpositionalcategory= */, - { 0, 1102, 1561, 4, 10, UNI_PHNX } /* scx=phoenician */, - { 5, 3809, 6199, 14, 5, UNI_NV__900000 } /* numericvalue=900000 */, - { 1, 3794, 2617, 14, 8, UNI_NV__4_SLASH_5 } /* numericvalue=8.000e-01 */, - { 25, 5990, 1998, 17, 5, UNI_bpt_values_index } /* bidipairedbrackettype= */, - { 0, 5087, 102, 10, 2, UNI_LB__HL } /* wordbreak=hl */, - { 13, 6944, 5464, 24, 17, UNI_WB__EB } /* canonicalcombiningclass=attachedbelowleft */, - { 0, 1102, 909, 4, 8, UNI_BALI } /* scx=balinese */, - { 0, 1796, 5825, 7, 4, UNI_SUND } /* script=sund */, - { 4, 5099, 2581, 6, 9, UNI__PERL_SURROGATE } /* _perl_surrogate */, - { 0, 1377, 510, 3, 2, UNI_WB__DQ } /* wb=dq */, - { 0, 1102, 4107, 4, 4, UNI_HANG } /* scx=hang */, - { 0, 4872, 3641, 10, 10, UNI_KANASUP } /* block=kanasupplement */, - { 1, 6687, 787, 22, 3, UNI_JG__MALAYALAMNYA } /* joininggroup=malayalamnya */, - { 1, 1102, 208, 4, 4, UNI_TFNG } /* scx=tfng */, - { 1, 6570, 4042, 8, 8, UNI_INPC__TOPANDRIGHT } /* inpc=topandright */, - { 27, 3474, 1424, 6, 10, UNI_INCHORASMIAN } /* block=chorasmian */, - { 0, 5214, 0, 9, 0, UNI_HALFMARKS } /* halfmarks */, - { 32, 306, 588, 5, 2, UNI__PERL_PATWS } /* patws=t */, - { 5, 520, 2120, 4, 8, UNI_NV__3_SLASH_4 } /* nv=7.500e-01 */, - { 36, 1879, 3053, 4, 5, UNI_ASCII } /* blk=ascii */, - { 0, 6114, 156, 3, 4, UNI_SC__OUGR } /* sc=ougr */, - { 0, 6379, 2824, 13, 11, UNI_JG__ROHINGYAYEH } /* joininggroup=rohingyayeh */, - { 8, 1856, 602, 11, 2, -UNI_BIDIC } /* bidicontrol=n */, - { 1, 464, 4302, 2, 6, UNI_XPOSIXSPACE } /* iswspace */, - { 0, 3474, 5661, 6, 19, UNI_MERO } /* block=meroitichieroglyphs */, - { 1, 7208, 0, 9, 0, UNI_gc_values_index } /* category= */, - { 2, 1377, 5, 3, 2, UNI_WB__EX } /* wb=ex */, - { 5, 6379, 1265, 13, 6, UNI_JG__LAMADH } /* joininggroup=lamadh */, - { 0, 1796, 1228, 8, 6, UNI_SC__MULT } /* script=multani */, - { 32, 313, 1280, 2, 9, UNI_INNABATAEAN } /* innabataean */, - { 0, 75, 588, 3, 5, UNI_CWU } /* cwu=true */, - { 0, 426, 5117, 3, 19, UNI_INANATOLIANHIEROGLYPHS } /* inanatolianhieroglyphs */, - { 5, 4355, 71, 17, 4, UNI_CPRT } /* scriptextensions=cprt */, - { 0, 464, 7044, 2, 13, UNI_M } /* iscombiningmark */, - { 3, 939, 588, 5, 2, UNI_ECOMP } /* ecomp=t */, - { 52, 1796, 728, 7, 7, UNI_SC__KALI } /* script=kayahli */, - { 0, 632, 355, 5, 2, UNI_grbase_values_index } /* grbase= */, - { 3, 5748, 4081, 5, 11, UNI_SUPPUNCTUATION } /* insuppunctuation */, - { 5, 2463, 602, 11, 3, -UNI_JOINC } /* joincontrol=no */, - { 2, 296, 584, 2, 3, UNI_NV__22 } /* nv=22 */, - { 1, 1410, 299, 8, 1, UNI_CCC__19 } /* ccc=ccc19 */, - { 0, 6379, 3688, 13, 3, UNI_JG__TAW } /* joininggroup=taw */, - { 0, 4355, 433, 17, 3, UNI_NKO } /* scriptextensions=nko */, - { 2, 833, 602, 4, 3, -UNI_TERM } /* term=no */, - { 0, 296, 1153, 3, 2, UNI_NV__24 } /* nv=24 */, - { 50, 1879, 7732, 4, 22, UNI_ENCLOSEDIDEOGRAPHICSUP } /* blk=enclosedideographicsup */, - { 9, 4355, 1117, 17, 8, UNI_TAGB } /* scriptextensions=tagbanwa */, - { 0, 1377, 7377, 3, 8, UNI_WB__KA } /* wb=katakana */, - { 74, 7527, 10, 3, 2, UNI_LB__CR } /* lb=cr */, - { 46, 34, 4005, 1, 16, UNI_CURRENCYSYMBOLS } /* iscurrencysymbols */, - { 1, 4338, 356, 17, 4, UNI_RI } /* regionalindicator=yes */, - { 0, 1991, 588, 11, 2, UNI_JT__T } /* joiningtype=t */, - { 0, 5586, 1837, 21, 5, UNI_WB__EB } /* graphemeclusterbreak=ebase */, - { 1, 172, 0, 4, 0, UNI_RJNG } /* rjng */, - { 1, 343, 5472, 4, 9, UNI_CCC__BL } /* ccc=belowleft */, - { 0, 2, 6528, 1, 21, UNI_INDICNUMBERFORMS } /* commonindicnumberforms */, - { 27, 1796, 2771, 7, 5, UNI_KHMR } /* script=khmer */, - { 0, 313, 1234, 2, 7, UNI_NB } /* innoblock */, - { 0, 1516, 3641, 6, 10, UNI_KANASUP } /* iskanasupplement */, - { 0, 4355, 496, 17, 6, UNI_KHOJ } /* scriptextensions=khojki */, - { 2, 464, 676, 2, 5, UNI_OSGE } /* isosage */, - { 0, 464, 1887, 2, 8, UNI_UCASEXTA } /* isucasexta */, - { 0, 3622, 3704, 3, 15, UNI_LINEARBIDEOGRAMS } /* islinearbideograms */, - { 1, 2890, 2879, 3, 11, UNI_JT__L } /* jt=leftjoining */, - { 0, 3474, 1470, 6, 8, UNI_INBUGINESE } /* block=buginese */, - { 0, 1214, 5797, 6, 9, UNI_KANAEXTA } /* inkanaextendeda */, - { 130, 464, 3654, 2, 11, UNI_MC } /* isspacingmark */, - { 0, 2392, 8212, 3, 32, UNI_MISCMATHSYMBOLSB } /* inmiscellaneousmathematicalsymbolsb */, - { 1, 5087, 7377, 10, 8, UNI_WB__KA } /* wordbreak=katakana */, - { 183, 4355, 3309, 17, 4, UNI_MERO } /* scriptextensions=mero */, - { 0, 3351, 2119, 13, 9, UNI_NV__3_SLASH_20 } /* numericvalue=1.500e-01 */, - { 11, 2253, 389, 10, 3, UNI_IN__3_DOT_2 } /* presentin=3.2 */, - { 233, 1796, 3465, 6, 9, UNI_ETHI } /* script=ethiopic */, - { 4, 464, 112, 2, 4, UNI_KITS } /* iskits */, - { 1, 7317, 2384, 10, 2, UNI_BC__CS } /* bidiclass=cs */, - { 147, 7068, 588, 26, 5, UNI_PCM } /* prependedconcatenationmark=true */, - { 0, 4355, 983, 17, 8, UNI_HIRA } /* scriptextensions=hiragana */, - { 6, 464, 273, 2, 2, UNI_ZP } /* iszp */, - { 1, 3474, 1227, 6, 7, UNI_INMULTANI } /* block=multani */, - { 2, 373, 3156, 3, 8, UNI_NO } /* othernumber */, - { 3, 313, 4656, 2, 9, UNI_TANGUTSUP } /* intangutsup */, - { 0, 1410, 772, 7, 2, UNI_CCC__17 } /* ccc=ccc17 */, - { 0, 3396, 0, 15, 0, UNI_SARB } /* oldsoutharabian */, - { 3, 4291, 2961, 10, 7, UNI_LB__NU } /* linebreak=numeric */, - { 0, 464, 301, 2, 5, UNI_ORYA } /* isoriya */, - { 6, 3474, 433, 6, 3, UNI_INNKO } /* block=nko */, - { 1, 612, 5021, 2, 3, UNI_LB__CL } /* lb=cl */, - { 1, 4726, 2064, 14, 8, UNI_NV__5_SLASH_8 } /* numericvalue=6.250e-01 */, - { 2, 1796, 5340, 7, 4, UNI_SC__DEVA } /* script=deva */, - { 136, 6594, 0, 6, 0, UNI_BRAH } /* brahmi */, - { 89, 5481, 278, 21, 1, UNI_cwcf_values_index } /* changeswhencasefolded= */, - { 0, 192, 194, 2, 2, UNI_SHAW } /* shaw */, - { 6, 1796, 818, 7, 7, UNI_SC__SHRD } /* script=sharada */, - { 5, 3090, 5812, 9, 13, UNI_GEORGIANSUP } /* blk=georgiansupplement */, - { 1, 34, 1440, 1, 4, UNI_DEP } /* isdep */, - { 0, 3474, 1191, 6, 7, UNI_INBENGALI } /* block=bengali */, - { 9, 4322, 3807, 15, 2, UNI_NV__3_SLASH_80 } /* numericvalue=3/80 */, - { 4, 3915, 356, 17, 4, UNI_EPRES } /* emojipresentation=yes */, - { 1, 8007, 4611, 30, 4, UNI_CJKEXTF } /* blk=cjkunifiedideographsextensionf */, - { 0, 3734, 1771, 14, 6, UNI_NFCQC__M } /* nfkcquickcheck=maybe */, - { 0, 7182, 8407, 3, 33, UNI_CJKCOMPATIDEOGRAPHSSUP } /* cjkcompatibilityideographssupplement */, - { 2, 1879, 4750, 4, 8, UNI_DINGBATS } /* blk=dingbats */, - { 68, 5409, 934, 19, 2, -UNI_TERM } /* terminalpunctuation=f */, - { 52, 5928, 0, 21, 0, UNI_VO__TR } /* vo=transformedrotated */, - { 1, 1796, 2401, 7, 4, UNI_SC__NAND } /* script=nand */, - { 10, 3351, 2128, 13, 9, UNI_NV__1_SLASH_32 } /* numericvalue=3.125e-02 */, - { 0, 6466, 0, 10, 0, UNI_CO } /* privateuse */, - { 143, 1796, 991, 7, 6, UNI_HATR } /* script=hatran */, - { 37, 513, 518, 4, 2, UNI_NV__3_SLASH_5 } /* nv=3/5 */, - { 3, 464, 6833, 2, 14, UNI_BYZANTINEMUSIC } /* isbyzantinemusic */, - { 8, 34, 4484, 1, 10, UNI_TITLE } /* istitlecase */, - { 0, 3593, 4275, 3, 16, UNI_LETTERLIKESYMBOLS } /* inletterlikesymbols */, - { 32, 7660, 602, 17, 2, -UNI_VS } /* variationselector=n */, - { 0, 343, 1070, 4, 2, UNI_CCC__31 } /* ccc=31 */, - { 8, 6570, 0, 5, 0, UNI_inpc_values_index } /* inpc= */, - { 0, 1879, 2394, 4, 7, UNI_INMYANMAR } /* blk=myanmar */, - { 2, 1879, 1785, 4, 11, UNI_INPAHAWHHMONG } /* blk=pahawhhmong */, - { 3, 7132, 5080, 7, 7, UNI_SUPARROWSA } /* blk=suparrowsa */, - { 0, 1879, 5389, 4, 20, UNI_INNYIAKENGPUACHUEHMONG } /* blk=nyiakengpuachuehmong */, - { 9, 4355, 31, 17, 4, UNI_ARMI } /* scriptextensions=armi */, - { 1, 6114, 540, 3, 4, UNI_TANG } /* sc=tang */, - { 18, 7182, 6509, 3, 19, UNI_CJKCOMPATIDEOGRAPHSSUP } /* cjkcompatideographssup */, - { 1, 2726, 259, 3, 2, UNI_CF } /* gc=cf */, - { 130, 997, 0, 6, 0, UNI_KTHI } /* kaithi */, - { 0, 1233, 10, 3, 2, UNI_OCR } /* inocr */, - { 112, 7208, 3223, 9, 13, UNI_XPOSIXDIGIT } /* category=decimalnumber */, - { 11, 6570, 4038, 5, 12, UNI_INPC__LEFTANDRIGHT } /* inpc=leftandright */, - { 3, 1879, 4107, 4, 6, UNI_INHANGUL } /* blk=hangul */, - { 4, 7880, 4341, 28, 4, UNI_CJKEXTA } /* iscjkunifiedideographsextensiona */, - { 2, 34, 7790, 1, 5, UNI_IDEO } /* isideo */, - { 1, 328, 6898, 3, 22, UNI_SUPERANDSUB } /* superscriptsandsubscripts */, - { 138, 536, 329, 3, 2, UNI_SB__UP } /* sb=up */, - { 7, 1480, 5812, 5, 13, UNI_GEORGIANSUP } /* georgiansupplement */, - { 16, 464, 1241, 2, 4, UNI_PHAG } /* isphag */, - { 57, 1796, 1614, 7, 10, UNI_WARA } /* script=warangciti */, - { 0, 6114, 236, 3, 2, UNI_SC__YI } /* sc=yi */, - { 7, 2638, 2056, 11, 2, UNI_IN__5_DOT_1 } /* presentin=5.1 */, - { 1, 34, 115, 1, 5, UNI_KNDA } /* isknda */, - { 97, 524, 356, 6, 4, UNI_PATSYN } /* patsyn=yes */, - { 69, 3474, 220, 6, 4, UNI_INTOTO } /* block=toto */, - { 1, 1065, 299, 5, 1, UNI_NV__1_SLASH_9 } /* nv=1/9 */, - { 0, 1410, 2138, 7, 2, UNI_CCC__33 } /* ccc=ccc33 */, - { 12, 3593, 1037, 7, 4, UNI_LATINEXTB } /* inlatinextb */, - { 51, 464, 783, 2, 4, UNI_OSMA } /* isosma */, - { 58, 6402, 832, 14, 5, UNI_SB__ST } /* sentencebreak=sterm */, - { 104, 46, 5021, 2, 3, UNI_SB__CL } /* sb=cl */, - { 0, 313, 2297, 2, 13, UNI_BLOCKELEMENTS } /* inblockelements */, - { 0, 5087, 546, 10, 2, UNI_WB__EB } /* wordbreak=eb */, - { 0, 7201, 3518, 16, 9, UNI_Z } /* generalcategory=separator */, - { 1, 1879, 7416, 4, 14, UNI_PUA } /* blk=privateusearea */, - { 0, 4662, 5762, 12, 7, UNI_SUPARROWSB } /* supplementalarrowsb */, - { 0, 5502, 278, 21, 1, UNI_cwcm_values_index } /* changeswhencasemapped= */, - { 6, 3474, 676, 6, 5, UNI_INOSAGE } /* block=osage */, - { 1, 7431, 2074, 28, 2, UNI_CCC__129 } /* canonicalcombiningclass=ccc129 */, - { 4, 1102, 1248, 4, 4, UNI_SIDD } /* scx=sidd */, - { 2, 5888, 588, 5, 2, UNI__PERL_NCHAR } /* nchar=t */, - { 0, 5087, 1842, 10, 3, UNI_WB__EB } /* wordbreak=gaz */, - { 4, 144, 0, 4, 0, UNI_NEWA } /* newa */, - { 0, 7880, 3929, 28, 4, UNI_CJKEXTG } /* iscjkunifiedideographsextensiong */, - { 4, 4500, 278, 5, 1, UNI_upper_values_index } /* upper= */, - { 105, 6114, 840, 3, 7, UNI_SC__TGLG } /* sc=tagalog */, - { 0, 1102, 6030, 3, 9, UNI_GEOR } /* scx=georgian */, - { 144, 1191, 0, 4, 0, UNI_BENG } /* beng */, - { 2, 1796, 188, 7, 4, UNI_SGNW } /* script=sgnw */, - { 10, 14, 7975, 1, 32, UNI_MISCMATHSYMBOLSA } /* miscellaneousmathematicalsymbolsa */, - { 2, 5607, 6823, 15, 10, UNI_IDENTIFIERTYPE__LIMITEDUSE } /* identifiertype=limiteduse */, - { 128, 2926, 5358, 3, 11, UNI_SMALLKANAEXT } /* insmallkanaext */, - { 0, 3351, 2080, 14, 8, UNI_NV__5_SLASH_2 } /* numericvalue=2.500e+00 */, - { 0, 6114, 749, 3, 4, UNI_MARC } /* sc=marc */, - { 2, 1440, 602, 2, 2, -UNI_SD } /* sd=n */, - { 13, 6114, 5340, 3, 4, UNI_SC__DEVA } /* sc=deva */, - { 0, 3593, 1646, 7, 4, UNI_LATINEXTD } /* inlatinextd */, - { 6, 313, 5907, 2, 7, UNI_INSINHALA } /* insinhala */, - { 1, 1065, 0, 6, 0, UNI_NV__1_SLASH_3 } /* nv=1/3 */, - { 15, 8533, 7937, 7, 29, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* block=symbolsandpictographsextendeda */, - { 10, 1879, 776, 4, 7, UNI_OLCK } /* blk=olchiki */, - { 8, 464, 429, 2, 4, UNI_MRO } /* ismroo */, - { 3, 6379, 5015, 13, 4, UNI_JG__YUDH } /* joininggroup=yudh */, - { 0, 1410, 1155, 7, 2, UNI_CCC__35 } /* ccc=ccc35 */, - { 0, 6114, 611, 3, 4, UNI_ELBA } /* sc=elba */, - { 0, 6114, 449, 3, 4, UNI_PHLI } /* sc=phli */, - { 0, 4355, 208, 17, 4, UNI_TFNG } /* scriptextensions=tfng */, - { 1, 8533, 1110, 7, 7, UNI_SPECIALS } /* block=specials */, - { 2, 7208, 1379, 8, 2, UNI_M } /* category=m */, - { 11, 1441, 356, 3, 4, UNI_DEP } /* dep=yes */, - { 0, 3474, 3991, 6, 7, UNI_BRAI } /* block=braille */, - { 0, 5844, 5080, 14, 7, UNI_SUPARROWSA } /* issupplementalarrowsa */, - { 0, 16, 601, 1, 2, UNI_dt_values_index } /* dt= */, - { 0, 275, 1837, 4, 5, UNI_WB__EB } /* gcb=ebase */, - { 1, 4291, 5021, 9, 17, UNI_LB__CP } /* linebreak=closeparenthesis */, - { 0, 8182, 2688, 30, 4, UNI_INPC__TOPANDLEFT } /* indicpositionalcategory=topandleft */, - { 202, 4355, 477, 17, 4, UNI_VAI } /* scriptextensions=vaii */, - { 2, 6570, 4038, 11, 12, UNI_INPC__TOPANDLEFTANDRIGHT } /* inpc=topandleftandright */, - { 32, 6114, 1144, 3, 9, UNI_BHKS } /* sc=bhaiksuki */, - { 2, 5087, 5, 10, 2, UNI_WB__EX } /* wordbreak=ex */, - { 5, 313, 5305, 3, 17, UNI_TAIXUANJING } /* intaixuanjingsymbols */, - { 0, 6379, 4178, 13, 4, UNI_JG__KAPH } /* joininggroup=kaph */, - { 0, 360, 0, 6, 0, UNI_CAKM } /* chakma */, - { 98, 1102, 593, 4, 7, UNI_DSRT } /* scx=deseret */, - { 0, 2496, 713, 3, 4, UNI_JG__SHIN } /* jg=shin */, - { 0, 464, 4857, 2, 5, UNI_TAML } /* istamil */, - { 0, 832, 278, 5, 1, UNI_sterm_values_index } /* sterm= */, - { 0, 536, 10, 3, 2, UNI_LB__CR } /* sb=cr */, - { 2, 4783, 933, 9, 3, -UNI_XPOSIXSPACE } /* whitespace=f */, - { 0, 7688, 229, 23, 2, UNI_JG__MANICHAEANPE } /* joininggroup=manichaeanpe */, - { 0, 7201, 538, 15, 2, UNI_S } /* generalcategory=s */, - { 3, 313, 346, 2, 3, UNI_IN__11 } /* in=11 */, - { 17, 2485, 4081, 6, 5, UNI_XPOSIXPUNCT } /* xposixpunct */, - { 0, 2802, 6091, 3, 21, UNI_EARLYDYNASTICCUNEIFORM } /* isearlydynasticcuneiform */, - { 0, 1915, 587, 11, 6, UNI_GRBASE } /* graphemebase=true */, - { 1, 6039, 4442, 13, 9, UNI_MYANMAREXTB } /* block=myanmarextendedb */, - { 8, 5844, 5762, 5, 7, UNI_SUPARROWSB } /* issuparrowsb */, - { 0, 2474, 2030, 3, 11, UNI_MATHALPHANUM } /* ismathalphanum */, - { 2, 461, 0, 4, 0, UNI_QAAI } /* qaai */, - { 1, 1879, 1668, 4, 11, UNI_DOMINO } /* blk=dominotiles */, - { 0, 513, 398, 5, 2, UNI_NV__3_SLASH_16 } /* nv=3/16 */, - { 6, 8276, 6594, 22, 19, UNI_INSC__BRAHMIJOININGNUMBER } /* indicsyllabiccategory=brahmijoiningnumber */, - { 1, 313, 5825, 2, 12, UNI_SUNDANESESUP } /* insundanesesup */, - { 6, 12, 0, 3, 0, UNI_PCM } /* pcm */, - { 3, 2792, 1037, 10, 4, UNI_CYRILLICEXTB } /* iscyrillicextb */, - { 1, 464, 3498, 2, 16, UNI_CYPRIOTSYLLABARY } /* iscypriotsyllabary */, - { 147, 313, 681, 2, 5, UNI_INRUNIC } /* inrunic */, - { 12, 600, 6944, 6, 9, UNI_DT__NONCANON } /* dt=noncanonical */, - { 0, 343, 353, 4, 2, UNI_CCC__9 } /* ccc=vr */, - { 0, 3000, 602, 13, 3, -UNI_QMARK } /* quotationmark=no */, - { 10, 296, 394, 3, 2, UNI_NV__34 } /* nv=34 */, - { 0, 372, 0, 6, 0, UNI_GOTH } /* gothic */, - { 1, 7605, 587, 17, 3, UNI_GCB__T } /* hangulsyllabletype=t */, - { 0, 895, 572, 5, 2, UNI_AGE__5_DOT_2 } /* age=v52 */, - { 7, 2792, 5797, 10, 9, UNI_CYRILLICEXTA } /* iscyrillicextendeda */, - { 4, 7208, 2443, 9, 11, UNI_CASEDLETTER } /* category=casedletter */, - { 2, 3722, 602, 4, 2, -UNI_MATH } /* math=n */, - { 0, 4355, 1571, 17, 10, UNI_SAUR } /* scriptextensions=saurashtra */, - { 1, 14, 4567, 1, 15, UNI_MISCMATHSYMBOLSB } /* miscmathsymbolsb */, - { 0, 275, 602, 2, 2, UNI_N } /* gc=n */, - { 16, 6944, 890, 23, 3, UNI_CCC__10 } /* canonicalcombiningclass=10 */, - { 0, 1879, 2373, 6, 9, UNI_KATAKANAEXT } /* blk=katakanaext */, - { 13, 7317, 387, 10, 2, UNI_BC__EN } /* bidiclass=en */, - { 128, 464, 5825, 2, 9, UNI_SUND } /* issundanese */, - { 444, 2033, 588, 5, 5, UNI_XPOSIXALPHA } /* alpha=true */, - { 0, 1879, 783, 4, 7, UNI_INOSMANYA } /* blk=osmanya */, - { 0, 876, 934, 4, 6, -UNI_IDEO } /* ideo=false */, - { 249, 895, 1304, 6, 2, UNI_AGE__12 } /* age=v120 */, - { 25, 2401, 0, 4, 0, UNI_NAND } /* nand */, - { 0, 4355, 6594, 17, 6, UNI_BRAH } /* scriptextensions=brahmi */, - { 0, 464, 2428, 2, 6, UNI_IPAEXT } /* isipaext */, - { 0, 4291, 464, 10, 2, UNI_LB__IS } /* linebreak=is */, - { 5, 1407, 2332, 3, 12, UNI_GREEKEXT } /* ingreekextended */, - { 65, 0, 277, 1, 4, UNI_LB__B2 } /* lb=b2 */, - { 1, 1796, 216, 7, 4, UNI_TIBT } /* script=tibt */, - { 20, 2041, 0, 12, 0, UNI_MEND } /* mendekikakui */, - { 3, 6687, 702, 14, 3, UNI_JG__MEEM } /* joininggroup=meem */, - { 4, 2712, 588, 14, 5, UNI_ECOMP } /* emojicomponent=true */, - { 0, 34, 4091, 1, 16, UNI_DIACRITICALSEXT } /* indiacriticalsext */, - { 0, 2353, 7908, 3, 29, UNI_CUNEIFORMNUMBERS } /* incuneiformnumbersandpunctuation */, - { 8, 3748, 299, 15, 1, UNI_NV__1_SLASH_9 } /* numericvalue=1/9 */, - { 4, 7132, 4372, 5, 16, UNI_SMALLFORMS } /* blk=smallformvariants */, - { 14, 275, 898, 3, 2, UNI_GCB__V } /* gcb=v */, - { 2, 343, 2688, 4, 4, UNI_CCC__L } /* ccc=left */, - { 0, 296, 1303, 3, 2, UNI_NV__32 } /* nv=32 */, - { 5, 581, 294, 6, 1, UNI_CCC__L } /* ccc=224 */, - { 0, 696, 2774, 5, 8, UNI_SO } /* isothersymbol */, - { 76, 313, 6466, 2, 10, UNI_PUA } /* inprivateuse */, - { 0, 12, 356, 3, 2, UNI_PCM } /* pcm=y */, - { 0, 316, 1881, 4, 2, UNI_qmark_values_index } /* qmark= */, - { 386, 296, 3775, 2, 4, UNI_NV__5_SLASH_8 } /* nv=5/8 */, - { 76, 2981, 1304, 5, 2, UNI_IN__12 } /* in=v120 */, - { 1, 7201, 5166, 16, 20, UNI_PC } /* generalcategory=connectorpunctuation */, - { 52, 1102, 917, 4, 8, UNI_BASS } /* scx=bassavah */, - { 0, 6112, 8454, 5, 16, UNI_INSC__VOWELINDEPENDENT } /* insc=vowelindependent */, - { 4, 328, 5762, 3, 7, UNI_SUPARROWSB } /* suparrowsb */, - { 82, 3474, 1133, 6, 8, UNI_INVITHKUQI } /* block=vithkuqi */, - { 5, 2310, 587, 12, 3, UNI_CI } /* caseignorable=t */, - { 0, 2496, 4682, 3, 5, UNI_JG__SADHE } /* jg=sadhe */, - { 65, 7688, 3685, 23, 3, UNI_JG__MANICHAEANMEM } /* joininggroup=manichaeanmem */, - { 20, 1796, 6030, 6, 9, UNI_SC__GEOR } /* script=georgian */, - { 4, 1796, 102, 7, 4, UNI_HLUW } /* script=hluw */, - { 8, 1478, 3599, 9, 9, UNI_GEORGIANEXT } /* ingeorgianextended */, - { 209, 1065, 1071, 4, 4, UNI_NV__11_SLASH_12 } /* nv=11/12 */, - { 6, 612, 928, 2, 3, UNI_LB__OP } /* lb=op */, - { 182, 8276, 2412, 22, 8, UNI_INSC__AVAGRAHA } /* indicsyllabiccategory=avagraha */, - { 12, 7208, 538, 8, 2, UNI_S } /* category=s */, - { 0, 1796, 967, 7, 8, UNI_SC__GUJR } /* script=gujarati */, - { 1, 464, 1255, 2, 7, UNI_SOYO } /* issoyombo */, - { 3, 3351, 1067, 12, 4, UNI_NV__1_SLASH_3 } /* numericvalue=1/3 */, - { 7, 7132, 5358, 5, 17, UNI_SMALLKANAEXT } /* blk=smallkanaextension */, - { 80, 4996, 4198, 13, 4, UNI_JG__MANICHAEANTETH } /* jg=manichaeanteth */, - { 0, 2726, 2729, 3, 5, UNI_C } /* gc=other */, - { 0, 513, 349, 4, 1, UNI_NV__38 } /* nv=38 */, - { 0, 464, 1826, 2, 11, UNI_SYLO } /* issylotinagri */, - { 14, 0, 3704, 1, 15, UNI_LINEARBIDEOGRAMS } /* linearbideograms */, - { 64, 5409, 8484, 14, 6, UNI_term_values_index } /* terminalpunctuation= */, - { 6, 4671, 0, 4, 0, UNI_TALE } /* tale */, - { 1, 7317, 4783, 10, 10, UNI_BC__WS } /* bidiclass=whitespace */, - { 0, 7182, 1698, 3, 4, UNI_CJKEXTF } /* cjkextf */, - { 0, 5586, 5, 21, 2, UNI_GCB__EX } /* graphemeclusterbreak=ex */, - { 11, 316, 934, 5, 6, -UNI_QMARK } /* qmark=false */, - { 85, 2890, 48, 3, 1, UNI_JT__U } /* jt=u */, - { 81, 1102, 449, 4, 4, UNI_PHLI } /* scx=phli */, - { 37, 2726, 1464, 3, 2, UNI_ZS } /* gc=zs */, - { 14, 4291, 5021, 9, 3, UNI_LB__CL } /* linebreak=cl */, - { 13, 555, 7171, 3, 3, UNI_AGE__12 } /* age=12 */, - { 0, 1796, 441, 7, 4, UNI_OLCK } /* script=olck */, - { 204, 3474, 4857, 6, 5, UNI_INTAMIL } /* block=tamil */, - { 0, 1879, 5661, 4, 19, UNI_MERO } /* blk=meroitichieroglyphs */, - { 0, 1009, 0, 4, 0, UNI_LYCI } /* lyci */, - { 270, 524, 8488, 5, 3, UNI_PATSYN } /* patsyn=t */, - { 0, 1879, 1470, 4, 8, UNI_INBUGINESE } /* blk=buginese */, - { 1, 4355, 880, 17, 7, UNI_ZZZZ } /* scriptextensions=unknown */, - { 26, 8, 1412, 1, 4, UNI_XPOSIXCNTRL } /* gc=cc */, - { 11, 7201, 2290, 16, 6, UNI_N } /* generalcategory=number */, - { 2, 343, 2195, 3, 2, UNI_CCC__6 } /* ccc=6 */, - { 32, 6114, 1117, 3, 8, UNI_SC__TAGB } /* sc=tagbanwa */, - { 1, 6114, 618, 3, 7, UNI_ELYM } /* sc=elymaic */, - { 20, 3474, 991, 6, 6, UNI_INHATRAN } /* block=hatran */, - { 2, 275, 4338, 4, 17, UNI_RI } /* gcb=regionalindicator */, - { 0, 464, 1383, 2, 4, UNI_IDST } /* isidst */, - { 0, 7880, 8407, 5, 23, UNI_CJKCOMPATIDEOGRAPHS } /* iscjkcompatibilityideographs */, - { 1, 3748, 518, 14, 2, UNI_NV__1_SLASH_5 } /* numericvalue=1/5 */, - { 0, 156, 0, 4, 0, UNI_OUGR } /* ougr */, - { 2, 1478, 957, 8, 5, UNI_GEORGIANEXT } /* ingeorgianext */, - { 1, 1856, 356, 5, 4, UNI_BIDIC } /* bidic=yes */, - { 0, 313, 7473, 2, 27, UNI_ALPHABETICPF } /* inalphabeticpresentationforms */, - { 5, 3474, 1887, 6, 4, UNI_UCAS } /* block=ucas */, - { 4, 6379, 4682, 13, 5, UNI_JG__SADHE } /* joininggroup=sadhe */, - { 3, 313, 372, 2, 6, UNI_INGOTHIC } /* ingothic */, - { 157, 313, 825, 2, 7, UNI_SHAW } /* inshavian */, - { 3, 3474, 1117, 6, 8, UNI_INTAGBANWA } /* block=tagbanwa */, - { 0, 1796, 691, 7, 5, UNI_BATK } /* script=batak */, - { 5, 1796, 794, 7, 4, UNI_SC__KALI } /* script=kali */, - { 41, 4355, 3465, 16, 9, UNI_ETHI } /* scriptextensions=ethiopic */, - { 135, 343, 1236, 4, 2, UNI_CCC__BL } /* ccc=bl */, - { 144, 6570, 1242, 3, 6, UNI_INPHAGSPA } /* inphagspa */, - { 62, 4355, 1241, 17, 4, UNI_PHAG } /* scriptextensions=phag */, - { 9, 4291, 8009, 8, 4, UNI_LB__CJ } /* linebreak=cj */, - { 4, 2193, 2104, 4, 8, UNI_NV__2_SLASH_3 } /* nv=6.667e-01 */, - { 2, 1382, 4370, 3, 2, UNI_xids_values_index } /* xids= */, - { 0, 313, 3381, 2, 15, UNI_NARB } /* inoldnortharabian */, - { 4, 343, 293, 4, 1, UNI_CCC__0 } /* ccc=0 */, - { 5, 3498, 0, 7, 0, UNI_CPRT } /* cypriot */, - { 1, 2926, 1808, 3, 10, UNI_INSORASOMPENG } /* insorasompeng */, - { 144, 6402, 1592, 14, 2, UNI_SB__FO } /* sentencebreak=fo */, - { 1, 464, 232, 2, 4, UNI_XSUX } /* isxsux */, - { 8, 4355, 39, 17, 4, UNI_BATK } /* scriptextensions=batk */, - { 19, 6114, 1255, 3, 7, UNI_SOYO } /* sc=soyombo */, - { 0, 5481, 602, 21, 2, -UNI_CWCF } /* changeswhencasefolded=n */, - { 1, 4355, 611, 17, 7, UNI_ELBA } /* scriptextensions=elbasan */, - { 76, 4515, 934, 18, 2, -UNI_IDST } /* idstrinaryoperator=f */, - { 3, 1991, 2857, 12, 11, UNI_JT__D } /* joiningtype=dualjoining */, - { 0, 5087, 2447, 12, 7, UNI_WB__ML } /* wordbreak=midletter */, - { 0, 3367, 1300, 14, 2, UNI_NV__400 } /* numericvalue=400 */, - { 1, 4202, 0, 17, 0, UNI_KITS } /* khitansmallscript */, - { 22, 1065, 299, 4, 1, UNI_NV__19 } /* nv=19 */, - { 1, 4355, 1353, 17, 9, UNI_PAUC } /* scriptextensions=paucinhau */, - { 39, 2474, 8212, 3, 32, UNI_MISCMATHSYMBOLSB } /* ismiscellaneousmathematicalsymbolsb */, - { 2, 75, 0, 3, 0, UNI_CWU } /* cwu */, - { 0, 6944, 1070, 24, 2, UNI_CCC__31 } /* canonicalcombiningclass=31 */, - { 20, 313, 8078, 2, 32, UNI_IDEOGRAPHICSYMBOLS } /* inideographicsymbolsandpunctuation */, - { 1, 5928, 1329, 3, 2, UNI_VO__TU } /* vo=tu */, - { 6, 1796, 3991, 7, 7, UNI_BRAI } /* script=braille */, - { 80, 1102, 540, 4, 4, UNI_TANG } /* scx=tang */, - { 2, 1879, 4092, 4, 12, UNI_DIACRITICALS } /* blk=diacriticals */, - { 3, 939, 588, 5, 5, UNI_ECOMP } /* ecomp=true */, - { 23, 6112, 4948, 5, 14, UNI_INSC__VOWELDEPENDENT } /* insc=voweldependent */, - { 21, 3474, 6134, 6, 10, UNI_INGLAGOLITIC } /* block=glagolitic */, - { 1, 4355, 4827, 17, 4, UNI_BAMU } /* scriptextensions=bamu */, - { 0, 1764, 434, 3, 2, UNI_INNKO } /* innko */, - { 7, 313, 5949, 2, 6, UNI_YIJING } /* inyijing */, - { 1, 1879, 2275, 4, 3, UNI_INIDC } /* blk=idc */, - { 2, 2496, 2846, 3, 11, UNI_JG__YEHWITHTAIL } /* jg=yehwithtail */, - { 0, 4291, 67, 10, 2, UNI_LB__CP } /* linebreak=cp */, - { 4, 3823, 0, 16, 0, UNI_STERM } /* sentenceterminal */, - { 0, 1102, 8599, 4, 18, UNI_CANS } /* scx=canadianaboriginal */, - { 0, 2232, 5305, 3, 17, UNI_TAIXUANJING } /* istaixuanjingsymbols */, - { 1, 2275, 933, 9, 3, -UNI_IDC } /* idcontinue=f */, - { 200, 464, 4857, 2, 15, UNI_TAMILSUP } /* istamilsupplement */, - { 43, 6114, 806, 3, 4, UNI_SARB } /* sc=sarb */, - { 1, 313, 6447, 2, 5, UNI_MUSIC } /* inmusic */, - { 9, 1755, 0, 11, 0, UNI_MEDF } /* medefaidrin */, - { 2, 1102, 2812, 4, 4, UNI_MAHJ } /* scx=mahj */, - { 10, 2496, 3261, 3, 12, UNI_JG__VERTICALTAIL } /* jg=verticaltail */, - { 6, 1796, 232, 7, 4, UNI_XSUX } /* script=xsux */, - { 163, 34, 529, 1, 7, UNI_INREJANG } /* inrejang */, - { 0, 6114, 240, 3, 4, UNI_ZANB } /* sc=zanb */, - { 0, 2463, 356, 5, 2, UNI_JOINC } /* joinc=y */, - { 25, 1383, 588, 3, 2, UNI_IDS } /* ids=t */, - { 1, 3474, 5322, 6, 8, UNI_INCHEROKEE } /* block=cherokee */, - { 1, 4291, 2915, 10, 11, UNI_LB__EX } /* linebreak=exclamation */, - { 273, 5523, 602, 21, 3, -UNI_CWL } /* changeswhenlowercased=no */, - { 1, 296, 2127, 3, 2, UNI_NV__13 } /* nv=13 */, - { 0, 3474, 5806, 6, 12, UNI_MONGOLIANSUP } /* block=mongoliansup */, - { 0, 464, 1353, 2, 9, UNI_PAUC } /* ispaucinhau */, - { 0, 1975, 3228, 7, 5, UNI_POSIXALNUM } /* isposixalnum */, - { 3, 116, 0, 4, 0, UNI_KNDA } /* knda */, - { 33, 7431, 585, 27, 2, UNI_CCC__22 } /* canonicalcombiningclass=ccc22 */, - { 1, 313, 6303, 2, 23, UNI_COMPATJAMO } /* inhangulcompatibilityjamo */, - { 40, 4122, 0, 9, 0, UNI_XPOSIXLOWER } /* lowercase */, - { 6, 939, 602, 5, 3, -UNI_ECOMP } /* ecomp=no */, - { 0, 8276, 2420, 22, 8, UNI_INSC__TONEMARK } /* indicsyllabiccategory=tonemark */, - { 0, 1102, 1191, 4, 7, UNI_BENG } /* scx=bengali */, - { 1, 7825, 4341, 26, 4, UNI_CJKEXTA } /* cjkunifiedideographsextensiona */, - { 0, 3351, 1298, 14, 5, UNI_NV__216000 } /* numericvalue=216000 */, - { 5, 1441, 602, 10, 2, -UNI_DEP } /* deprecated=n */, - { 4, 4291, 2559, 10, 10, UNI_LB__NS } /* linebreak=nonstarter */, - { 0, 6114, 176, 3, 4, UNI_SC__ROHG } /* sc=rohg */, - { 0, 296, 773, 3, 3, UNI_NV__7_SLASH_2 } /* nv=7/2 */, - { 33, 5586, 2680, 20, 3, UNI_RI } /* graphemeclusterbreak=ri */, - { 5, 2353, 4590, 10, 9, UNI_CYRILLICEXTC } /* incyrillicextendedc */, - { 1, 2018, 0, 12, 0, UNI_GONM } /* masaramgondi */, - { 90, 2678, 4811, 3, 16, UNI_BC__S } /* bc=segmentseparator */, - { 3, 3137, 140, 15, 2, UNI_EA__NA } /* eastasianwidth=na */, - { 0, 3462, 0, 12, 0, UNI_INETHIOPIC } /* blk=ethiopic */, - { 47, 275, 4300, 2, 2, UNI_Z } /* gc=z */, - { 5, 3474, 3839, 6, 16, UNI_TANGUTCOMPONENTS } /* block=tangutcomponents */, - { 170, 6114, 372, 3, 4, UNI_GOTH } /* sc=goth */, - { 291, 464, 3839, 2, 6, UNI_TANG } /* istangut */, - { 1, 464, 742, 2, 4, UNI_MAND } /* ismand */, - { 6, 12, 1079, 1, 7, UNI_POSIXWORD } /* perlword */, - { 2, 4355, 1785, 17, 11, UNI_HMNG } /* scriptextensions=pahawhhmong */, - { 0, 426, 4918, 3, 16, UNI_ALCHEMICAL } /* inalchemicalsymbols */, - { 0, 7527, 3691, 3, 13, UNI_LB__PR } /* lb=prefixnumeric */, - { 4, 6944, 346, 23, 4, UNI_CCC__118 } /* canonicalcombiningclass=118 */, - { 71, 464, 810, 2, 4, UNI_SYRC } /* issyrc */, - { 29, 581, 585, 5, 2, UNI_CCC__BR } /* ccc=222 */, - { 14, 296, 396, 3, 2, UNI_NV__15 } /* nv=15 */, - { 25, 4355, 743, 18, 6, UNI_MAND } /* scriptextensions=mandaic */, - { 124, 7201, 3151, 15, 13, UNI_NL } /* generalcategory=letternumber */, - { 8, 536, 5075, 3, 5, UNI_SB__AT } /* sb=aterm */, - { 2, 464, 2033, 2, 5, UNI_XPOSIXALPHA } /* isalpha */, - { 33, 2974, 1303, 11, 2, UNI_IN__3_DOT_2 } /* presentin=v32 */, - { 2, 4355, 790, 17, 4, UNI_HMNP } /* scriptextensions=hmnp */, - { 2, 6039, 1037, 13, 4, UNI_MYANMAREXTB } /* block=myanmarextb */, - { 2, 7823, 5183, 28, 4, UNI_CJKEXTE } /* incjkunifiedideographsextensione */, - { 4, 1102, 1614, 4, 10, UNI_WARA } /* scx=warangciti */, - { 40, 6114, 3933, 3, 4, UNI_SC__MODI } /* sc=modi */, - { 26, 5087, 1837, 10, 8, UNI_WB__EB } /* wordbreak=ebasegaz */, - { 7, 464, 818, 2, 7, UNI_SHRD } /* issharada */, - { 0, 1102, 244, 4, 4, UNI_ZYYY } /* scx=zyyy */, - { 12, 313, 1009, 2, 6, UNI_INLYCIAN } /* inlycian */, - { 169, 1102, 212, 4, 4, UNI_TGLG } /* scx=tglg */, - { 0, 4322, 2137, 14, 8, UNI_NV__1_SLASH_3 } /* numericvalue=3.333e-01 */, - { 5, 4355, 2812, 17, 4, UNI_MAHJ } /* scriptextensions=mahj */, - { 129, 6944, 433, 24, 2, UNI_CCC__7 } /* canonicalcombiningclass=nk */, - { 66, 1377, 703, 3, 2, UNI_WB__EB } /* wb=em */, - { 0, 3367, 0, 14, 0, UNI_NV__4 } /* numericvalue=4 */, - { 17, 2274, 934, 4, 6, -UNI_XIDC } /* xidc=false */, - { 8, 600, 0, 7, 0, UNI_DT__NONE } /* dt=none */, - { 33, 464, 3381, 2, 15, UNI_NARB } /* isoldnortharabian */, - { 0, 5099, 5888, 6, 5, UNI__PERL_NCHAR } /* _perl_nchar */, - { 1, 7880, 1434, 5, 7, UNI_CJKSTROKES } /* iscjkstrokes */, - { 35, 2275, 356, 3, 4, UNI_IDC } /* idc=yes */, - { 32, 2, 258, 1, 3, UNI_CWCF } /* cwcf */, - { 5, 4355, 180, 17, 4, UNI_RUNR } /* scriptextensions=runr */, - { 0, 4783, 355, 9, 5, UNI_XPOSIXSPACE } /* whitespace=yes */, - { 34, 1796, 1094, 7, 4, UNI_MERC } /* script=merc */, - { 1, 3669, 135, 4, 2, UNI_JG__MIM } /* jg=mim */, - { 0, 1879, 4793, 4, 4, UNI_RUMI } /* blk=rumi */, - { 18, 313, 5631, 2, 5, UNI_INGREEK } /* ingreek */, - { 12, 2948, 3477, 11, 3, UNI_nfcqc_values_index } /* nfcquickcheck= */, - { 1, 7823, 6505, 27, 5, UNI_CJKEXTC } /* incjkunifiedideographsextensionc */, - { 0, 34, 832, 1, 5, UNI_TERM } /* isterm */, - { 73, 6114, 425, 3, 4, UNI_SC__LINA } /* sc=lina */, - { 13, 1102, 477, 4, 4, UNI_VAI } /* scx=vaii */, - { 2, 1796, 2740, 7, 4, UNI_SC__COPT } /* script=copt */, - { 66, 1102, 806, 4, 4, UNI_SARB } /* scx=sarb */, - { 3, 6944, 351, 24, 2, UNI_CCC__91 } /* canonicalcombiningclass=91 */, - { 1, 7527, 3285, 3, 12, UNI_LB__HL } /* lb=hebrewletter */, - { 1, 2926, 2727, 3, 7, UNI_INSC__OTHER } /* insc=other */, - { 3, 464, 2812, 2, 12, UNI_MAHJONG } /* ismahjongtiles */, - { 4, 313, 1487, 2, 8, UNI_JAMOEXTA } /* injamoexta */, - { 148, 34, 6438, 1, 2, UNI_Z } /* isz */, - { 0, 313, 4582, 2, 16, UNI_BOPOMOFOEXT } /* inbopomofoextended */, - { 0, 4776, 587, 16, 6, UNI__PERL_PATWS } /* patternwhitespace=true */, - { 0, 7068, 356, 26, 2, UNI_PCM } /* prependedconcatenationmark=y */, - { 22, 4996, 5375, 13, 7, UNI_JG__MANICHAEANDHAMEDH } /* jg=manichaeandhamedh */, - { 0, 464, 909, 2, 8, UNI_BALI } /* isbalinese */, - { 4, 681, 0, 5, 0, UNI_RUNR } /* runic */, - { 0, 2275, 587, 9, 3, UNI_IDC } /* idcontinue=t */, - { 0, 5844, 837, 6, 3, UNI_SUPPUAA } /* issuppuaa */, - { 2, 6570, 6581, 5, 13, UNI_INPC__BOTTOMANDLEFT } /* inpc=bottomandleft */, - { 0, 1796, 3637, 7, 4, UNI_LISU } /* script=lisu */, - { 29, 1796, 1220, 7, 4, UNI_MAKA } /* script=maka */, - { 15, 4355, 3498, 17, 7, UNI_CPRT } /* scriptextensions=cypriot */, - { 0, 2443, 356, 5, 2, UNI_CASED } /* cased=y */, - { 134, 383, 934, 6, 6, -UNI_HYPHEN } /* hyphen=false */, - { 0, 1478, 6878, 5, 12, UNI_GEOMETRICSHAPES } /* ingeometricshapes */, - { 12, 6944, 5464, 24, 13, UNI_CCC__202 } /* canonicalcombiningclass=attachedbelow */, - { 139, 6011, 612, 7, 6, UNI_INELBASAN } /* block=elbasan */, - { 0, 7431, 7173, 27, 2, UNI_CCC__28 } /* canonicalcombiningclass=ccc28 */, - { 2, 2496, 705, 10, 4, UNI_JG__AFRICANNOON } /* jg=africannoon */, - { 0, 1464, 0, 2, 0, UNI_ZS } /* zs */, - { 2, 7584, 1823, 18, 3, UNI_DT__SUB } /* decompositiontype=sub */, - { 0, 1383, 934, 3, 2, -UNI_IDS } /* ids=f */, - { 0, 4355, 132, 17, 4, UNI_MTEI } /* scriptextensions=mtei */, - { 3, 5, 3933, 1, 3, UNI_EMOD } /* emod */, - { 0, 3450, 6528, 5, 21, UNI_INDICNUMBERFORMS } /* blk=commonindicnumberforms */, - { 1, 1879, 5340, 4, 10, UNI_INDEVANAGARI } /* blk=devanagari */, - { 1, 6379, 24, 13, 2, UNI_JG__HE } /* joininggroup=he */, - { 128, 3779, 1300, 14, 2, UNI_NV__700 } /* numericvalue=700 */, - { 1, 1796, 164, 7, 4, UNI_PHNX } /* script=phnx */, - { 0, 2454, 3599, 9, 9, UNI_GEORGIANEXT } /* isgeorgianextended */, - { 1, 4996, 639, 13, 3, UNI_JG__MANICHAEANNUN } /* jg=manichaeannun */, - { 3, 2692, 2665, 5, 13, UNI_ANCIENTSYMBOLS } /* blk=ancientsymbols */, - { 138, 698, 5174, 4, 12, UNI_PO } /* otherpunctuation */, - { 0, 1975, 0, 3, 0, UNI_P } /* isp */, - { 67, 4355, 19, 17, 4, UNI_AGHB } /* scriptextensions=aghb */, - { 2, 464, 854, 2, 7, UNI_TAVT } /* istaiviet */, - { 263, 464, 909, 2, 4, UNI_BALI } /* isbali */, - { 131, 3474, 2652, 6, 13, UNI_VERTICALFORMS } /* block=verticalforms */, - { 0, 4302, 5620, 5, 3, -UNI_XPOSIXSPACE } /* wspace=n */, - { 2, 4338, 0, 17, 0, UNI_RI } /* regionalindicator */, - { 2, 1879, 326, 4, 5, UNI_VSSUP } /* blk=vssup */, - { 2, 337, 0, 4, 0, UNI_CARI } /* cari */, - { 1, 2483, 1082, 8, 4, UNI_XPOSIXWORD } /* isxposixword */, - { 1, 3794, 2080, 14, 8, UNI_NV__17_SLASH_2 } /* numericvalue=8.500e+00 */, - { 1, 1796, 1529, 7, 4, UNI_KHAR } /* script=khar */, - { 2, 1879, 5825, 4, 12, UNI_SUNDANESESUP } /* blk=sundanesesup */, - { 1, 296, 1071, 3, 4, UNI_NV__1_SLASH_12 } /* nv=1/12 */, - { 36, 7201, 330, 16, 2, UNI_PF } /* generalcategory=pf */, - { 8, 6379, 6392, 13, 10, UNI_JG__AFRICANQAF } /* joininggroup=africanqaf */, - { 5, 1102, 453, 4, 4, UNI_MIAO } /* scx=plrd */, - { 8, 7208, 4122, 9, 15, UNI_LOWERCASELETTER } /* category=lowercaseletter */, - { 0, 4515, 356, 18, 4, UNI_IDST } /* idstrinaryoperator=yes */, - { 89, 4291, 4261, 10, 14, UNI_LB__PO } /* linebreak=postfixnumeric */, - { 207, 6402, 37, 14, 2, UNI_SB__ST } /* sentencebreak=st */, - { 0, 7201, 3514, 16, 13, UNI_ZL } /* generalcategory=lineseparator */, - { 2, 1951, 0, 7, 0, UNI_SOGD } /* sogdian */, - { 222, 6114, 441, 3, 4, UNI_OLCK } /* sc=olck */, - { 0, 7660, 356, 17, 4, UNI_VS } /* variationselector=yes */, - { 29, 313, 3188, 2, 15, UNI_INIMPERIALARAMAIC } /* inimperialaramaic */, - { 259, 4996, 4677, 13, 5, UNI_JG__MANICHAEANGIMEL } /* jg=manichaeangimel */, - { 0, 12, 458, 1, 3, UNI_PRTI } /* prti */, - { 158, 464, 6728, 2, 11, UNI_MTEI } /* ismeeteimayek */, - { 3, 3823, 356, 16, 2, UNI_STERM } /* sentenceterminal=y */, - { 2, 3669, 702, 4, 3, UNI_JG__MEEM } /* jg=meem */, - { 1, 2726, 203, 3, 2, UNI_TITLE } /* gc=lt */, - { 0, 1704, 1141, 6, 3, UNI_ARABICPFA } /* arabicpfa */, - { 16, 7317, 278, 9, 2, UNI_BC__B } /* bidiclass=b */, - { 5, 313, 144, 2, 4, UNI_INNEWA } /* innewa */, - { 129, 3137, 21, 15, 1, UNI_EA__H } /* eastasianwidth=h */, - { 4, 34, 1547, 1, 2, UNI_N } /* isn */, - { 0, 464, 5304, 2, 11, UNI_TAIXUANJING } /* istaixuanjing */, - { 0, 7823, 1698, 5, 4, UNI_CJKEXTF } /* incjkextf */, - { 2, 1539, 7908, 3, 15, UNI_CUNEIFORMNUMBERS } /* iscuneiformnumbers */, - { 0, 4122, 355, 8, 5, UNI_XPOSIXLOWER } /* lowercase=yes */, - { 36, 2355, 4590, 8, 9, UNI_CYRILLICEXTC } /* cyrillicextendedc */, - { 33, 4302, 587, 5, 3, UNI_XPOSIXSPACE } /* wspace=t */, - { 0, 464, 5718, 2, 4, UNI_EMOD } /* isemod */, - { 24, 7201, 203, 16, 2, UNI_TITLE } /* generalcategory=lt */, - { 0, 15, 4918, 1, 16, UNI_ALCHEMICAL } /* alchemicalsymbols */, - { 1, 1879, 847, 4, 7, UNI_INTAITHAM } /* blk=taitham */, - { 0, 7584, 242, 18, 2, UNI_DT__NB } /* decompositiontype=nb */, - { 0, 15, 2285, 1, 12, UNI_AEGEANNUMBERS } /* aegeannumbers */, - { 5, 7527, 2016, 3, 2, UNI_GCB__V } /* lb=jv */, - { 139, 8244, 2335, 8, 5, UNI_CJKEXTE } /* block=cjkexte */, - { 8, 6402, 2277, 15, 8, UNI_SB__SC } /* sentencebreak=scontinue */, - { 1, 2625, 588, 13, 5, UNI_PATSYN } /* patternsyntax=true */, - { 0, 313, 1117, 2, 8, UNI_INTAGBANWA } /* intagbanwa */, - { 4, 464, 5907, 2, 4, UNI_SINH } /* issinh */, - { 5, 632, 587, 5, 6, UNI_GRBASE } /* grbase=true */, - { 0, 3367, 6199, 14, 5, UNI_NV__400000 } /* numericvalue=400000 */, - { 3, 1879, 4107, 4, 15, UNI_INHANGUL } /* blk=hangulsyllables */, - { 158, 6114, 15, 3, 4, UNI_SC__ADLM } /* sc=adlm */, - { 132, 7208, 17, 9, 2, UNI_LM } /* category=lm */, - { 0, 887, 549, 5, 3, UNI_AGE__13 } /* age=13.0 */, - { 4, 1102, 1027, 4, 4, UNI_YEZI } /* scx=yezi */, - { 0, 1383, 356, 4, 4, UNI_IDST } /* idst=yes */, - { 0, 3474, 7290, 6, 27, UNI_OCR } /* block=opticalcharacterrecognition */, - { 1, 2486, 0, 10, 0, UNI_POSIXBLANK } /* posixblank */, - { 24, 1216, 1037, 4, 4, UNI_KANAEXTB } /* kanaextb */, - { 2, 1777, 0, 6, 0, UNI_NV__100 } /* nv=100 */, - { 0, 4515, 602, 18, 3, -UNI_IDST } /* idstrinaryoperator=no */, - { 6, 3188, 0, 15, 0, UNI_ARMI } /* imperialaramaic */, - { 1, 8533, 8319, 9, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* block=supsymbolsandpictographs */, - { 0, 343, 6240, 2, 3, UNI_CCC__L } /* ccc=l */, - { 521, 1796, 1371, 7, 4, UNI_SC__THAA } /* script=thaa */, - { 12, 2692, 4442, 10, 9, UNI_ARABICEXTB } /* blk=arabicextendedb */, - { 16, 4302, 933, 5, 7, -UNI_XPOSIXSPACE } /* wspace=false */, - { 1, 925, 0, 8, 0, UNI_BPT__O } /* bpt=open */, - { 10, 887, 2172, 5, 3, UNI_AGE__12 } /* age=12.0 */, - { 0, 3474, 1015, 6, 6, UNI_INTELUGU } /* block=telugu */, - { 0, 844, 933, 2, 7, -UNI_LOE } /* loe=false */, - { 0, 3474, 3381, 6, 15, UNI_NARB } /* block=oldnortharabian */, - { 1, 7208, 1977, 9, 2, UNI_PO } /* category=po */, - { 51, 8244, 4464, 9, 4, UNI_CJKEXTC } /* block=cjkextc */, - { 0, 7208, 256, 9, 2, UNI_CASEDLETTER } /* category=lc */, - { 19, 1796, 4392, 7, 11, UNI_SGNW } /* script=signwriting */, - { 0, 671, 0, 5, 0, UNI_OGAM } /* ogham */, - { 0, 1383, 356, 7, 2, UNI_IDS } /* idstart=y */, - { 33, 464, 1353, 2, 4, UNI_PAUC } /* ispauc */, - { 0, 3090, 5812, 9, 6, UNI_GEORGIANSUP } /* blk=georgiansup */, - { 0, 2260, 549, 4, 3, UNI_IN__13 } /* in=13.0 */, - { 0, 1796, 204, 7, 4, UNI_TAVT } /* script=tavt */, - { 1, 126, 184, 2, 2, UNI_TNSA } /* tnsa */, - { 1, 1065, 2088, 4, 8, UNI_NV__1_SLASH_64 } /* nv=1.562e-02 */, - { 4, 7688, 4190, 23, 4, UNI_JG__MANICHAEANYODH } /* joininggroup=manichaeanyodh */, - { 0, 5586, 163, 21, 2, UNI_GCB__PP } /* graphemeclusterbreak=pp */, - { 2, 2033, 934, 5, 6, -UNI_XPOSIXALPHA } /* alpha=false */, - { 7, 7584, 7135, 17, 4, UNI_DT__SUP } /* decompositiontype=sup */, - { 257, 7208, 6635, 12, 8, UNI_LO } /* category=otherletter */, - { 0, 536, 959, 3, 6, UNI_SB__EX } /* sb=extend */, - { 0, 5502, 0, 21, 0, UNI_CWCM } /* changeswhencasemapped */, - { 9, 3474, 1234, 6, 7, UNI_NB } /* block=noblock */, - { 28, 3474, 4582, 6, 11, UNI_BOPOMOFOEXT } /* block=bopomofoext */, - { 1, 5136, 5038, 5, 18, UNI_MODIFIERTONELETTERS } /* blk=modifiertoneletters */, - { 0, 3000, 588, 13, 2, UNI_QMARK } /* quotationmark=t */, - { 30, 4433, 4629, 8, 12, UNI_LATIN1 } /* blk=latin1supplement */, - { 72, 2260, 2172, 4, 3, UNI_IN__12 } /* in=12.0 */, - { 0, 34, 1560, 1, 11, UNI_INPHOENICIAN } /* inphoenician */, - { 201, 5186, 0, 20, 0, UNI_EXTPICT } /* extendedpictographic */, - { 98, 8590, 0, 44, 0, UNI_UCASEXT } /* isunifiedcanadianaboriginalsyllabicsextended */, - { 0, 3669, 4655, 12, 3, UNI_JG__MALAYALAMTTA } /* jg=malayalamtta */, - { 6, 343, 0, 7, 0, UNI_CCC__118 } /* ccc=118 */, - { 0, 496, 0, 4, 0, UNI_KHOJ } /* khoj */, - { 0, 4355, 128, 17, 4, UNI_MEDF } /* scriptextensions=medf */, - { 32, 6594, 0, 4, 0, UNI_BRAH } /* brah */, - { 68, 5502, 356, 21, 4, UNI_CWCM } /* changeswhencasemapped=yes */, - { 57, 6402, 10, 14, 2, UNI_LB__CR } /* sentencebreak=cr */, - { 305, 7527, 2549, 3, 10, UNI_LB__BA } /* lb=breakafter */, - { 0, 8182, 0, 27, 0, UNI_INPC__TOP } /* indicpositionalcategory=top */, - { 4, 1879, 3933, 4, 4, UNI_INMODI } /* blk=modi */, - { 329, 1102, 287, 4, 5, UNI_NSHU } /* scx=nushu */, - { 24, 2726, 334, 3, 2, UNI_PD } /* gc=pd */, - { 4, 7208, 229, 9, 2, UNI_PE } /* category=pe */, - { 33, 464, 0, 2, 2, UNI_CASEDLETTER } /* isl& */, - { 0, 1796, 152, 7, 4, UNI_OSGE } /* script=osge */, - { 0, 1879, 5340, 4, 18, UNI_DEVANAGARIEXT } /* blk=devanagariextended */, - { 0, 5844, 8319, 14, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* issupplementalsymbolsandpictographs */, - { 242, 464, 5214, 2, 9, UNI_HALFMARKS } /* ishalfmarks */, - { 14, 14, 1539, 1, 9, UNI_MISCARROWS } /* miscarrows */, - { 3, 6944, 348, 25, 2, UNI_CCC__BL } /* canonicalcombiningclass=218 */, - { 0, 502, 0, 6, 0, UNI_LYDI } /* lydian */, - { 0, 1539, 5643, 3, 10, UNI_COUNTINGROD } /* iscountingrod */, - { 1, 2153, 1300, 4, 3, UNI_NV__4000 } /* nv=4000 */, - { 28, 661, 1662, 2, 4, UNI_DOMINO } /* domino */, - { 0, 5481, 588, 21, 5, UNI_CWCF } /* changeswhencasefolded=true */, - { 1, 1590, 0, 2, 0, UNI_LOWERCASELETTER } /* ll */, - { 1, 5748, 8319, 5, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* insupsymbolsandpictographs */, - { 1024, 2363, 623, 8, 5, UNI_ETHIOPICEXT } /* inethiopicext */, - { 1, 1102, 120, 4, 3, UNI_LAO } /* scx=lao */, - { 0, 6112, 1503, 5, 5, UNI_INSC__BINDU } /* insc=bindu */, - { 790, 1465, 3517, 4, 10, UNI_ZS } /* spaceseparator */, - { 13, 1377, 546, 3, 3, UNI_WB__EB } /* wb=ebg */, - { 0, 6944, 1650, 24, 2, UNI_CCC__1 } /* canonicalcombiningclass=ov */, - { 0, 313, 3435, 2, 15, UNI_INZANABAZARSQUARE } /* inzanabazarsquare */, - { 13, 4355, 676, 17, 5, UNI_OSGE } /* scriptextensions=osage */, - { 1032, 7208, 12, 9, 2, UNI_PC } /* category=pc */, - { 121, 3338, 602, 13, 2, UNI_DT__CAN } /* nfdquickcheck=n */, - { 1032, 464, 316, 2, 5, UNI_QMARK } /* isqmark */, - { 0, 1117, 0, 8, 0, UNI_TAGB } /* tagbanwa */, - { 131, 6114, 790, 3, 4, UNI_HMNP } /* sc=hmnp */, - { 35, 3474, 983, 6, 8, UNI_INHIRAGANA } /* block=hiragana */, - { 1, 1796, 1003, 7, 6, UNI_LEPC } /* script=lepcha */, - { 128, 1796, 2042, 8, 11, UNI_MEND } /* script=mendekikakui */, - { 78, 1879, 1317, 4, 9, UNI_INOLDPERMIC } /* blk=oldpermic */, - { 5, 1796, 429, 7, 3, UNI_MRO } /* script=mro */, - { 0, 313, 1326, 2, 9, UNI_INOLDTURKIC } /* inoldturkic */, - { 34, 6114, 1561, 3, 10, UNI_PHNX } /* sc=phoenician */, - { 0, 464, 3188, 2, 15, UNI_ARMI } /* isimperialaramaic */, - { 1, 644, 0, 6, 0, UNI_LB__H2 } /* hst=lv */, - { 0, 464, 5523, 2, 21, UNI_CWL } /* ischangeswhenlowercased */, - { 0, 36, 934, 2, 2, -UNI_VS } /* vs=f */, - { 0, 4450, 5206, 7, 17, UNI_HALFMARKS } /* block=combininghalfmarks */, - { 3, 4355, 1951, 17, 4, UNI_SOGD } /* scriptextensions=sogd */, - { 0, 2961, 3061, 12, 5, UNI_NT__DI } /* numerictype=digit */, - { 0, 6114, 1027, 3, 6, UNI_SC__YEZI } /* sc=yezidi */, - { 1550, 8244, 5366, 26, 10, UNI_CJKEXTD } /* block=cjkunifiedideographsextensiond */, - { 1, 2275, 356, 3, 2, UNI_IDC } /* idc=y */, - { 32, 3351, 523, 14, 1, UNI_NV__27 } /* numericvalue=27 */, - { 0, 313, 1424, 2, 10, UNI_INCHORASMIAN } /* inchorasmian */, - { 257, 34, 5321, 1, 5, UNI_CHER } /* ischer */, - { 0, 632, 933, 5, 3, -UNI_GRBASE } /* grbase=f */, - { 4, 2726, 1590, 3, 2, UNI_LOWERCASELETTER } /* gc=ll */, - { 581, 6134, 6142, 8, 12, UNI_GLAGOLITICSUP } /* glagoliticsupplement */, - { 2, 1102, 901, 4, 8, UNI_ARMN } /* scx=armenian */, - { 3, 5087, 546, 10, 3, UNI_WB__EB } /* wordbreak=ebg */, - { 256, 4355, 1202, 17, 4, UNI_THAI } /* scriptextensions=thai */, - { 0, 3669, 532, 12, 2, UNI_JG__MALAYALAMJA } /* jg=malayalamja */, - { 2, 1796, 301, 7, 5, UNI_SC__ORYA } /* script=oriya */, - { 4, 160, 0, 4, 0, UNI_PHLP } /* phlp */, - { 2, 2394, 4442, 7, 9, UNI_MYANMAREXTB } /* myanmarextendedb */, - { 4, 464, 1280, 2, 9, UNI_NBAT } /* isnabataean */, - { 2, 1441, 0, 10, 0, UNI_DEP } /* deprecated */, - { 62, 464, 236, 2, 2, UNI_YI } /* isyi */, - { 9, 6379, 1988, 13, 3, UNI_JG__WAW } /* joininggroup=waw */, - { 820, 477, 0, 4, 0, UNI_VAI } /* vaii */, - { 10, 7201, 1590, 16, 2, UNI_LOWERCASELETTER } /* generalcategory=ll */, - { 5, 270, 588, 3, 5, UNI_CWT } /* cwt=true */, - { 0, 4355, 1021, 17, 6, UNI_WCHO } /* scriptextensions=wancho */, - { 13, 383, 934, 6, 2, -UNI_HYPHEN } /* hyphen=f */, - { 44, 719, 3582, 5, 3, UNI_KANGXI } /* inkangxi */, - { 513, 6114, 1202, 3, 4, UNI_THAI } /* sc=thai */, - { 3, 14, 3149, 2, 3, UNI_math_values_index } /* math= */, - { 1, 7527, 4598, 3, 16, UNI_LB__CL } /* lb=closepunctuation */, - { 0, 5147, 5797, 11, 9, UNI_LATINEXTA } /* block=latinextendeda */, - { 157, 23, 356, 4, 2, UNI_POSIXXDIGIT } /* ahex=y */, - { 1, 4355, 236, 17, 4, UNI_YI } /* scriptextensions=yiii */, - { 0, 378, 356, 5, 2, UNI_GREXT } /* grext=y */, - { 6, 7201, 317, 16, 4, UNI_M } /* generalcategory=mark */, - { 1137, 1102, 3453, 3, 9, UNI_CYRL } /* scx=cyrillic */, - { 0, 343, 5464, 4, 13, UNI_CCC__202 } /* ccc=attachedbelow */, - { 1081, 3351, 771, 13, 2, UNI_NV__21 } /* numericvalue=21 */, - { 1031, 257, 934, 4, 6, -UNI_CWCF } /* cwcf=false */, - { 0, 7132, 4388, 6, 15, UNI_SUTTONSIGNWRITING } /* blk=suttonsignwriting */, - { 0, 7182, 3571, 3, 11, UNI_CJKCOMPATFORMS } /* cjkcompatforms */, - { 32, 3285, 0, 4, 0, UNI_HEBR } /* hebr */, - { 0, 7208, 103, 9, 2, UNI_UPPERCASELETTER } /* category=lu */, - { 0, 3622, 2579, 3, 12, UNI_LOWSURROGATES } /* islowsurrogates */, - { 0, 1102, 322, 5, 4, UNI_TALE } /* scx=taile */, - { 0, 6570, 0, 8, 0, UNI_INPC__TOP } /* inpc=top */, - { 1217, 536, 310, 3, 2, UNI_SB__SP } /* sb=sp */, - { 0, 3053, 0, 5, 0, UNI_ASCII } /* ascii */, - { 0, 4355, 4392, 17, 11, UNI_SGNW } /* scriptextensions=signwriting */, - { 25, 4291, 1747, 10, 8, UNI_LB__NL } /* linebreak=nextline */, - { 1, 2253, 0, 10, 0, UNI_in_values_index } /* presentin= */, - { 1, 1879, 7403, 4, 28, UNI_SUPPUAA } /* blk=supplementaryprivateuseareaa */, - { 0, 7527, 7740, 3, 11, UNI_LB__ID } /* lb=ideographic */, - { 0, 58, 6030, 2, 9, UNI_SC__GEOR } /* sc=georgian */, - { 6, 1410, 3364, 7, 2, UNI_CCC__23 } /* ccc=ccc23 */, - { 24, 4433, 3638, 5, 6, UNI_LISUSUP } /* blk=lisusup */, - { 235, 313, 1027, 2, 6, UNI_INYEZIDI } /* inyezidi */, - { 0, 555, 389, 4, 3, UNI_AGE__3_DOT_2 } /* age=3.2 */, - { 1, 4433, 4629, 8, 2, UNI_LATIN1 } /* blk=latin1 */, - { 705, 1102, 790, 4, 4, UNI_HMNP } /* scx=hmnp */, - { 1, 7201, 54, 16, 2, UNI_MC } /* generalcategory=mc */, - { 1, 464, 5787, 2, 10, UNI_JAMO } /* ishanguljamo */, - { 15, 34, 6532, 1, 17, UNI_INDICNUMBERFORMS } /* inindicnumberforms */, - { 0, 5502, 588, 21, 5, UNI_CWCM } /* changeswhencasemapped=true */, - { 0, 7584, 607, 18, 4, UNI_EA__F } /* decompositiontype=wide */, - { 16, 464, 951, 2, 4, UNI_DUPL } /* isdupl */, - { 0, 5087, 57, 11, 1, UNI_WB__MN } /* wordbreak=mn */, - { 0, 5, 7733, 1, 28, UNI_ENCLOSEDIDEOGRAPHICSUP } /* enclosedideographicsupplement */, - { 887, 7527, 7473, 3, 10, UNI_LB__AL } /* lb=alphabetic */, - { 0, 1796, 802, 7, 4, UNI_NBAT } /* script=nbat */, - { 148, 3474, 496, 6, 6, UNI_INKHOJKI } /* block=khojki */, - { 7, 847, 0, 7, 0, UNI_LANA } /* taitham */, - { 1, 5607, 6326, 15, 8, UNI_IDENTIFIERTYPE__OBSOLETE } /* identifiertype=obsolete */, - { 0, 2485, 311, 6, 5, UNI_XPOSIXPRINT } /* xposixprint */, - { 70, 2193, 0, 4, 0, UNI_NV__6 } /* nv=6 */, - { 2, 1102, 983, 4, 8, UNI_HIRA } /* scx=hiragana */, - { 0, 5886, 934, 21, 2, -UNI__PERL_NCHAR } /* noncharactercodepoint=f */, - { 1027, 296, 2111, 3, 9, UNI_NV__3_SLASH_16 } /* nv=1.875e-01 */, - { 0, 1879, 7385, 4, 18, UNI_PHONETICEXT } /* blk=phoneticextensions */, - { 724, 464, 3672, 2, 9, UNI_MLYM } /* ismalayalam */, - { 0, 7201, 128, 16, 2, UNI_ME } /* generalcategory=me */, - { 130, 1977, 252, 5, 5, UNI_POSIXCNTRL } /* posixcntrl */, - { 6, 6114, 951, 3, 4, UNI_SC__DUPL } /* sc=dupl */, - { 3, 1410, 2074, 7, 2, UNI_CCC__29 } /* ccc=ccc29 */, - { 2, 2974, 572, 11, 2, UNI_IN__5_DOT_2 } /* presentin=v52 */, - { 1, 36, 588, 2, 2, UNI_VS } /* vs=t */, - { 3, 55, 0, 4, 0, UNI_CANS } /* cans */, - { 129, 4726, 2104, 14, 8, UNI_NV__2_SLASH_3 } /* numericvalue=6.667e-01 */, - { 0, 3734, 602, 14, 2, UNI_NFKCQC__N } /* nfkcquickcheck=n */, - { 4, 1967, 934, 7, 6, -UNI_RADICAL } /* radical=false */, - { 1027, 3474, 6842, 6, 14, UNI_MUSIC } /* block=musicalsymbols */, - { 0, 6114, 1470, 3, 8, UNI_SC__BUGI } /* sc=buginese */, - { 5, 3474, 2241, 6, 12, UNI_PLAYINGCARDS } /* block=playingcards */, - { 35, 2474, 3723, 3, 9, UNI_SM } /* ismathsymbol */, - { 10, 1796, 611, 7, 4, UNI_ELBA } /* script=elba */, - { 0, 4355, 1371, 17, 6, UNI_THAA } /* scriptextensions=thaana */, - { 3, 2193, 1781, 4, 4, UNI_NV__60000 } /* nv=60000 */, - { 11, 1796, 2018, 7, 12, UNI_SC__GONM } /* script=masaramgondi */, - { 0, 3053, 0, 13, 0, UNI_POSIXXDIGIT } /* asciihexdigit */, - { 35, 1879, 1003, 4, 6, UNI_INLEPCHA } /* blk=lepcha */, - { 0, 6833, 0, 23, 0, UNI_BYZANTINEMUSIC } /* byzantinemusicalsymbols */, - { 128, 4338, 588, 17, 2, UNI_RI } /* regionalindicator=t */, - { 0, 6114, 248, 3, 4, UNI_ZZZZ } /* sc=zzzz */, - { 2, 4450, 4007, 7, 14, UNI_CURRENCYSYMBOLS } /* block=currencysymbols */, - { 0, 12, 588, 3, 5, UNI_PCM } /* pcm=true */, - { 520, 4355, 868, 17, 7, UNI_TIRH } /* scriptextensions=tirhuta */, - { 42, 6114, 287, 3, 5, UNI_NSHU } /* sc=nushu */, - { 0, 6402, 1581, 14, 7, UNI_SB__LE } /* sentencebreak=oletter */, - { 1, 2392, 2042, 3, 11, UNI_INMENDEKIKAKUI } /* inmendekikakui */, - { 1056, 5136, 4567, 5, 15, UNI_MISCMATHSYMBOLSB } /* blk=miscmathsymbolsb */, - { 39, 4355, 2740, 17, 4, UNI_COPT } /* scriptextensions=copt */, - { 0, 1879, 3543, 4, 16, UNI_HIGHPUSURROGATES } /* blk=highpusurrogates */, - { 518, 4355, 5825, 17, 9, UNI_SUND } /* scriptextensions=sundanese */, - { 1537, 1702, 5625, 3, 18, UNI_ANCIENTGREEKNUMBERS } /* isancientgreeknumbers */, - { 560, 464, 1440, 2, 2, UNI_SD } /* issd */, - { 8, 7385, 0, 28, 0, UNI_PHONETICEXTSUP } /* phoneticextensionssupplement */, - { 1, 464, 794, 2, 4, UNI_KALI } /* iskali */, - { 9, 3474, 3188, 6, 15, UNI_INIMPERIALARAMAIC } /* block=imperialaramaic */, - { 2, 4355, 909, 17, 4, UNI_BALI } /* scriptextensions=bali */, - { 0, 6114, 405, 3, 4, UNI_ARMN } /* sc=armn */, - { 0, 4355, 337, 17, 4, UNI_CARI } /* scriptextensions=cari */, - { 0, 6379, 487, 13, 3, UNI_JG__HAH } /* joininggroup=hah */, - { 3, 1879, 3991, 4, 15, UNI_BRAI } /* blk=braillepatterns */, - { 645, 7431, 1303, 28, 2, UNI_CCC__132 } /* canonicalcombiningclass=ccc132 */, - { 0, 3763, 2080, 14, 8, UNI_NV__11_SLASH_2 } /* numericvalue=5.500e+00 */, - { 4, 453, 0, 4, 0, UNI_MIAO } /* plrd */, - { 0, 330, 0, 2, 0, UNI_PF } /* pf */, - { 769, 3450, 1895, 5, 11, UNI_CHESSSYMBOLS } /* blk=chesssymbols */, - { 0, 5544, 934, 21, 2, -UNI_CWT } /* changeswhentitlecased=f */, - { 0, 2260, 2322, 3, 10, UNI_IN__NA } /* in=unassigned */, - { 2, 3595, 5584, 11, 3, UNI_LATINEXTG } /* latinextendedg */, - { 0, 4355, 783, 17, 7, UNI_OSMA } /* scriptextensions=osmanya */, - { 0, 1867, 602, 12, 2, -UNI_BIDIM } /* bidimirrored=n */, - { 777, 2483, 2033, 8, 5, UNI_XPOSIXALPHA } /* isxposixalpha */, - { 0, 6944, 3112, 24, 11, UNI_CCC__8 } /* canonicalcombiningclass=kanavoicing */, - { 1282, 6114, 661, 3, 4, UNI_SC__DOGR } /* sc=dogr */, - { 4, 4355, 240, 17, 4, UNI_ZANB } /* scriptextensions=zanb */, - { 0, 7527, 4711, 3, 15, UNI_LB__CB } /* lb=contingentbreak */, - { 5, 6114, 1508, 3, 4, UNI_UGAR } /* sc=ugar */, - { 1, 7688, 1988, 23, 3, UNI_JG__MANICHAEANWAW } /* joininggroup=manichaeanwaw */, - { 29, 833, 602, 4, 2, -UNI_TERM } /* term=n */, - { 1, 7182, 8407, 3, 23, UNI_CJKCOMPATIDEOGRAPHS } /* cjkcompatibilityideographs */, - { 2, 313, 6134, 2, 13, UNI_GLAGOLITICSUP } /* inglagoliticsup */, - { 1, 1102, 651, 4, 5, UNI_ADLM } /* scx=adlam */, - { 0, 1702, 575, 3, 6, UNI_AVST } /* isavestan */, - { 1, 1539, 6750, 3, 24, UNI_CWKCF } /* ischangeswhennfkccasefolded */, - { 1, 1879, 749, 4, 7, UNI_INMARCHEN } /* blk=marchen */, - { 3, 4291, 72, 10, 2, UNI_LB__PR } /* linebreak=pr */, - { 6, 3000, 588, 13, 5, UNI_QMARK } /* quotationmark=true */, - { 526, 581, 0, 6, 0, UNI_CCC__22 } /* ccc=22 */, - { 128, 6944, 8139, 24, 11, UNI_CCC__DB } /* canonicalcombiningclass=doublebelow */, - { 0, 5865, 588, 21, 5, UNI_LOE } /* logicalorderexception=true */, - { 1, 520, 1781, 4, 4, UNI_NV__70000 } /* nv=70000 */, - { 0, 2483, 3060, 7, 6, UNI_XPOSIXDIGIT } /* isxposixdigit */, - { 9, 2274, 602, 4, 3, -UNI_XIDC } /* xidc=no */, - { 0, 1065, 1304, 5, 2, UNI_NV__1_SLASH_20 } /* nv=1/20 */, - { 0, 8, 99, 1, 3, UNI_GURU } /* guru */, - { 128, 1710, 4641, 3, 15, UNI_SYRIACSUP } /* issyriacsupplement */, - { 0, 1102, 861, 4, 7, UNI_TIBT } /* scx=tibetan */, - { 0, 409, 934, 2, 2, -UNI_DI } /* di=f */, - { 0, 2625, 356, 13, 2, UNI_PATSYN } /* patternsyntax=y */, - { 4, 464, 2229, 2, 8, UNI_PHAISTOS } /* isphaistos */, - { 0, 1395, 5797, 5, 9, UNI_LATINEXTA } /* latinextendeda */, - { 800, 1879, 656, 4, 5, UNI_INBUHID } /* blk=buhid */, - { 1, 426, 2665, 3, 13, UNI_ANCIENTSYMBOLS } /* inancientsymbols */, - { 0, 8276, 4934, 22, 14, UNI_INSC__GEMINATIONMARK } /* indicsyllabiccategory=geminationmark */, - { 1029, 296, 1780, 3, 5, UNI_NV__10000 } /* nv=10000 */, - { 2, 4355, 530, 17, 6, UNI_RJNG } /* scriptextensions=rejang */, - { 0, 2802, 623, 8, 5, UNI_ETHIOPICEXT } /* isethiopicext */, - { 0, 1796, 2401, 7, 11, UNI_SC__NAND } /* script=nandinagari */, - { 4, 6944, 8572, 24, 13, UNI_CCC__214 } /* canonicalcombiningclass=attachedabove */, - { 7, 4355, 1271, 17, 9, UNI_SIND } /* scriptextensions=khudawadi */, - { 1, 464, 666, 2, 5, UNI_LIMB } /* islimbu */, - { 2, 909, 0, 4, 0, UNI_BALI } /* bali */, - { 0, 8182, 4038, 24, 12, UNI_INPC__LEFTANDRIGHT } /* indicpositionalcategory=leftandright */, - { 1, 313, 1948, 2, 10, UNI_INOLDSOGDIAN } /* inoldsogdian */, - { 1, 6114, 3885, 3, 17, UNI_AGHB } /* sc=caucasianalbanian */, - { 1, 464, 6919, 2, 25, UNI_SYMBOLSFORLEGACYCOMPUTING } /* issymbolsforlegacycomputing */, - { 0, 8244, 8407, 9, 23, UNI_CJKCOMPATIDEOGRAPHS } /* block=cjkcompatibilityideographs */, - { 0, 3351, 2262, 12, 3, UNI_NV__14 } /* numericvalue=14 */, - { 384, 5886, 588, 21, 2, UNI__PERL_NCHAR } /* noncharactercodepoint=t */, - { 3, 721, 493, 3, 3, UNI_KANBUN } /* kanbun */, - { 3, 464, 661, 2, 5, UNI_DOGR } /* isdogra */, - { 208, 2232, 205, 3, 3, UNI_TAVT } /* istavt */, - { 1, 6570, 0, 17, 0, UNI_INPC__TOPANDBOTTOM } /* inpc=topandbottom */, - { 0, 4291, 322, 10, 2, UNI_LB__AI } /* linebreak=ai */, - { 0, 313, 2195, 2, 2, UNI_IN__6 } /* in=6 */, - { 0, 600, 1127, 3, 3, UNI_DT__FIN } /* dt=fin */, - { 0, 1796, 172, 7, 4, UNI_RJNG } /* script=rjng */, - { 1, 875, 0, 5, 0, UNI_UIDEO } /* uideo */, - { 0, 4872, 493, 9, 3, UNI_KANBUN } /* block=kanbun */, - { 7, 1796, 1198, 7, 4, UNI_SC__GRAN } /* script=gran */, - { 1545, 421, 138, 2, 2, UNI_KHMR } /* khmr */, - { 0, 7584, 4208, 18, 5, UNI_DT__SML } /* decompositiontype=small */, - { 849, 3164, 356, 14, 4, UNI_GREXT } /* graphemeextend=yes */, - { 40, 302, 934, 2, 6, -UNI_RI } /* ri=false */, - { 74, 2253, 2172, 11, 3, UNI_IN__12 } /* presentin=12.0 */, - { 1679, 1478, 6878, 5, 20, UNI_GEOMETRICSHAPESEXT } /* ingeometricshapesextended */, - { 2, 1796, 2695, 6, 5, UNI_SC__ARAB } /* script=arab */, - { 5, 2260, 140, 3, 2, UNI_IN__NA } /* in=na */, - { 25, 1867, 356, 5, 4, UNI_BIDIM } /* bidim=yes */, - { 0, 4291, 3423, 10, 4, UNI_LB__GL } /* linebreak=glue */, - { 17, 6114, 3637, 3, 4, UNI_LISU } /* sc=lisu */, - { 4, 5586, 647, 20, 4, UNI_LB__H3 } /* graphemeclusterbreak=lvt */, - { 2, 1102, 409, 4, 4, UNI_DIAK } /* scx=diak */, - { 21, 343, 5472, 4, 5, UNI_CCC__B } /* ccc=below */, - { 1, 1879, 5322, 4, 18, UNI_CHEROKEESUP } /* blk=cherokeesupplement */, - { 0, 7317, 0, 10, 0, UNI_bc_values_index } /* bidiclass= */, - { 0, 313, 5907, 2, 21, UNI_SINHALAARCHAICNUMBERS } /* insinhalaarchaicnumbers */, - { 0, 4338, 934, 17, 2, -UNI_RI } /* regionalindicator=f */, - { 8, 6114, 5631, 3, 5, UNI_SC__GREK } /* sc=greek */, - { 1, 1382, 934, 8, 6, -UNI_XIDS } /* xidstart=false */, - { 1, 6114, 3309, 3, 4, UNI_MERO } /* sc=mero */, - { 3, 721, 2373, 2, 9, UNI_KATAKANAEXT } /* katakanaext */, - { 840, 1377, 3416, 5, 4, UNI_WB__MN } /* wb=midnum */, - { 14, 6749, 588, 25, 2, UNI_CWKCF } /* changeswhennfkccasefolded=t */, - { 0, 6799, 356, 24, 4, UNI_COMPEX } /* fullcompositionexclusion=yes */, - { 2, 1879, 975, 4, 8, UNI_INGURMUKHI } /* blk=gurmukhi */, - { 14, 1796, 477, 7, 3, UNI_VAI } /* script=vai */, - { 0, 4355, 3396, 17, 15, UNI_SARB } /* scriptextensions=oldsoutharabian */, - { 0, 8276, 0, 31, 0, UNI_INSC__CONSONANT } /* indicsyllabiccategory=consonant */, - { 0, 1377, 2265, 3, 9, UNI_WB__WSEGSPACE } /* wb=wsegspace */, - { 2, 464, 917, 2, 4, UNI_BASS } /* isbass */, - { 0, 1102, 78, 4, 4, UNI_CYRL } /* scx=cyrl */, - { 0, 409, 1175, 2, 2, UNI_dia_values_index } /* dia= */, - { 0, 1395, 1698, 5, 4, UNI_LATINEXTF } /* latinextf */, - { 0, 313, 7791, 2, 32, UNI_INIDC } /* inideographicdescriptioncharacters */, - { 4, 7182, 3571, 3, 6, UNI_CJKCOMPAT } /* cjkcompat */, - { 2, 313, 7660, 2, 18, UNI_INVS } /* invariationselectors */, - { 0, 7201, 6629, 16, 14, UNI_LM } /* generalcategory=modifierletter */, - { 0, 1102, 372, 4, 4, UNI_GOTH } /* scx=goth */, - { 2, 2485, 252, 6, 5, UNI_XPOSIXCNTRL } /* xposixcntrl */, - { 4, 2181, 764, 4, 2, UNI_NV__5_SLASH_2 } /* nv=5/2 */, - { 0, 8007, 1646, 7, 4, UNI_CJKEXTD } /* blk=cjkextd */, - { 7, 1879, 9, 4, 3, UNI_OCR } /* blk=ocr */, - { 1, 3474, 321, 6, 5, UNI_INTAILE } /* block=taile */, - { 0, 313, 3991, 2, 15, UNI_BRAI } /* inbraillepatterns */, - { 4, 581, 348, 5, 2, UNI_CCC__BL } /* ccc=218 */, - { 136, 2205, 0, 4, 0, UNI_NV__8 } /* nv=8 */, - { 2, 2712, 601, 13, 3, -UNI_ECOMP } /* emojicomponent=n */, - { 0, 14, 2591, 1, 12, UNI_MAYANNUMERALS } /* mayannumerals */, - { 7, 4291, 2680, 9, 3, UNI_RI } /* linebreak=ri */, - { 1, 3474, 1362, 6, 9, UNI_INSAMARITAN } /* block=samaritan */, - { 0, 1102, 232, 4, 4, UNI_XSUX } /* scx=xsux */, - { 290, 3474, 196, 6, 4, UNI_TAGS } /* block=tags */, - { 256, 1407, 2733, 3, 13, UNI_INGREEK } /* ingreekandcoptic */, - { 3, 1796, 433, 7, 3, UNI_SC__NKO } /* script=nko */, - { 1, 3351, 348, 13, 2, UNI_NV__18 } /* numericvalue=18 */, - { 0, 1320, 0, 4, 0, UNI_PERM } /* perm */, - { 7, 7823, 6509, 5, 19, UNI_CJKCOMPATIDEOGRAPHSSUP } /* incjkcompatideographssup */, - { 1, 4882, 0, 4, 0, UNI_EGYP } /* egyp */, - { 1137, 1796, 1362, 7, 9, UNI_SAMR } /* script=samaritan */, - { 0, 4107, 0, 4, 0, UNI_HANG } /* hang */, - { 0, 1377, 5718, 3, 9, UNI_WB__EB } /* wb=emodifier */, - { 519, 1102, 236, 4, 4, UNI_YI } /* scx=yiii */, - { 0, 2, 355, 1, 5, UNI_CE } /* ce=yes */, - { 1, 1796, 6134, 7, 4, UNI_SC__GLAG } /* script=glag */, - { 0, 1879, 3637, 4, 14, UNI_LISUSUP } /* blk=lisusupplement */, - { 1, 4355, 144, 17, 4, UNI_NEWA } /* scriptextensions=newa */, - { 2, 1879, 2401, 4, 11, UNI_INNANDINAGARI } /* blk=nandinagari */, - { 0, 6944, 397, 25, 1, UNI_CCC__25 } /* canonicalcombiningclass=25 */, - { 21, 34, 4076, 1, 5, UNI_DASH } /* isdash */, - { 0, 1796, 1009, 7, 6, UNI_LYCI } /* script=lycian */, - { 1536, 2726, 2774, 6, 8, UNI_SO } /* gc=othersymbol */, - { 1564, 5087, 510, 10, 2, UNI_WB__DQ } /* wordbreak=dq */, - { 4, 581, 2263, 5, 2, UNI_CCC__214 } /* ccc=214 */, - { 1039, 4500, 933, 8, 3, -UNI_XPOSIXUPPER } /* uppercase=f */, - { 222, 2712, 588, 14, 2, UNI_ECOMP } /* emojicomponent=t */, - { 0, 409, 588, 2, 2, UNI_DI } /* di=t */, - { 2, 4308, 356, 14, 2, UNI_DT__NONE } /* nfkdquickcheck=y */, - { 0, 6114, 1094, 3, 4, UNI_MERC } /* sc=merc */, - { 0, 3474, 666, 6, 5, UNI_INLIMBU } /* block=limbu */, - { 37, 464, 611, 2, 4, UNI_ELBA } /* iselba */, - { 2, 3974, 602, 4, 3, -UNI_IDSB } /* idsb=no */, - { 0, 3474, 661, 6, 5, UNI_INDOGRA } /* block=dogra */, - { 5, 3164, 934, 14, 2, -UNI_GREXT } /* graphemeextend=f */, - { 0, 6944, 278, 23, 2, UNI_CCC__B } /* canonicalcombiningclass=b */, - { 0, 4485, 0, 9, 0, UNI_TITLE } /* titlecase */, - { 2, 6114, 901, 3, 8, UNI_ARMN } /* sc=armenian */, - { 2, 7182, 6352, 3, 18, UNI_CJKRADICALSSUP } /* cjkradicalssupplement */, - { 1536, 2678, 6264, 3, 3, UNI_BC__PDI } /* bc=pdi */, - { 1, 419, 0, 2, 0, UNI_NO } /* no */, - { 0, 7148, 2074, 25, 2, UNI_CCC__129 } /* canonicalcombiningclass=129 */, - { 1, 4355, 917, 17, 4, UNI_BASS } /* scriptextensions=bass */, - { 0, 2802, 6142, 8, 5, UNI_ETHIOPICSUP } /* isethiopicsup */, - { 1, 1879, 3582, 7, 11, UNI_KANGXI } /* blk=kangxiradicals */, - { 0, 2, 934, 3, 6, -UNI_CWL } /* cwl=false */, - { 24, 464, 401, 2, 4, UNI_MIAO } /* ismiao */, - { 0, 6114, 429, 3, 3, UNI_MRO } /* sc=mro */, - { 6, 464, 3974, 2, 17, UNI_IDSB } /* isidsbinaryoperator */, - { 0, 1967, 602, 7, 2, -UNI_RADICAL } /* radical=n */, - { 148, 4355, 102, 17, 4, UNI_HLUW } /* scriptextensions=hluw */, - { 2, 3474, 3285, 6, 6, UNI_INHEBREW } /* block=hebrew */, - { 29, 4322, 398, 15, 2, UNI_NV__3_SLASH_16 } /* numericvalue=3/16 */, - { 788, 1102, 1571, 4, 10, UNI_SAUR } /* scx=saurashtra */, - { 39, 1796, 1344, 7, 9, UNI_PALM } /* script=palmyrene */, - { 2, 742, 0, 7, 0, UNI_MAND } /* mandaic */, - { 98, 464, 4551, 2, 7, UNI_LINB } /* islinearb */, - { 0, 7208, 110, 9, 2, UNI_ZL } /* category=zl */, - { 517, 306, 934, 5, 6, -UNI__PERL_PATWS } /* patws=false */, - { 3, 7688, 5374, 22, 8, UNI_JG__MANICHAEANDHAMEDH } /* joininggroup=manichaeandhamedh */, - { 5, 1102, 441, 4, 4, UNI_OLCK } /* scx=olck */, - { 2, 34, 6438, 1, 24, UNI_ZNAMENNYMUSIC } /* isznamennymusicalnotation */, - { 1, 378, 0, 5, 0, UNI_GREXT } /* grext */, - { 6, 1382, 345, 3, 2, UNI_xidc_values_index } /* xidc= */, - { 0, 110, 0, 1, 0, UNI_Z } /* z */, - { 0, 7132, 837, 8, 3, UNI_SUPPUAA } /* blk=suppuaa */, - { 133, 3622, 5797, 7, 9, UNI_LATINEXTA } /* islatinextendeda */, - { 0, 313, 656, 2, 5, UNI_INBUHID } /* inbuhid */, - { 0, 7317, 4403, 10, 15, UNI_BC__BN } /* bidiclass=boundaryneutral */, - { 0, 36, 602, 2, 3, -UNI_VS } /* vs=no */, - { 0, 4901, 356, 13, 2, UNI_EMOD } /* emojimodifier=y */, - { 3, 1465, 0, 5, 0, UNI_XPOSIXSPACE } /* space */, - { 20, 464, 1106, 2, 4, UNI_TALU } /* istalu */, - { 0, 600, 1679, 3, 8, UNI_DT__FRA } /* dt=fraction */, - { 7, 6944, 8580, 24, 10, UNI_CCC__AR } /* canonicalcombiningclass=aboveright */, - { 0, 4433, 121, 5, 2, UNI_INLAO } /* blk=lao */, - { 0, 7473, 602, 10, 3, -UNI_XPOSIXALPHA } /* alphabetic=no */, - { 2, 5586, 647, 20, 3, UNI_LB__H2 } /* graphemeclusterbreak=lv */, - { 6, 6749, 934, 25, 2, -UNI_CWKCF } /* changeswhennfkccasefolded=f */, - { 6, 464, 90, 2, 4, UNI_GREK } /* isgrek */, - { 2, 2454, 6878, 5, 15, UNI_GEOMETRICSHAPESEXT } /* isgeometricshapesext */, - { 196, 1796, 1317, 7, 9, UNI_SC__PERM } /* script=oldpermic */, - { 0, 3474, 4467, 6, 18, UNI_COPTICEPACTNUMBERS } /* block=copticepactnumbers */, - { 0, 4338, 278, 17, 1, UNI_ri_values_index } /* regionalindicator= */, - { 0, 1856, 356, 5, 2, UNI_BIDIC } /* bidic=y */, - { 0, 464, 4122, 2, 5, UNI_XPOSIXLOWER } /* islower */, - { 1, 4355, 661, 17, 4, UNI_DOGR } /* scriptextensions=dogr */, - { 0, 736, 7851, 3, 20, UNI_ENCLOSEDALPHANUM } /* inenclosedalphanumerics */, - { 36, 464, 4500, 2, 9, UNI_XPOSIXUPPER } /* isuppercase */, - { 3, 3367, 518, 14, 2, UNI_NV__4_SLASH_5 } /* numericvalue=4/5 */, - { 0, 1796, 1255, 7, 7, UNI_SOYO } /* script=soyombo */, - { 1, 313, 6833, 2, 14, UNI_BYZANTINEMUSIC } /* inbyzantinemusic */, - { 1825, 1400, 0, 10, 0, UNI_BOXDRAWING } /* boxdrawing */, - { 5, 2981, 572, 4, 2, UNI_IN__5_DOT_2 } /* in=v52 */, - { 0, 916, 5620, 4, 3, -UNI_EBASE } /* ebase=n */, - { 0, 581, 394, 5, 2, UNI_CCC__DA } /* ccc=234 */, - { 89, 343, 891, 4, 2, UNI_CCC__10 } /* ccc=10 */, - { 0, 7740, 588, 11, 5, UNI_IDEO } /* ideographic=true */, - { 2, 3152, 0, 12, 0, UNI_NL } /* letternumber */, - { 0, 7182, 6352, 3, 11, UNI_CJKRADICALSSUP } /* cjkradicalssup */, - { 0, 15, 4918, 1, 9, UNI_ALCHEMICAL } /* alchemical */, - { 35, 2, 1895, 1, 11, UNI_CHESSSYMBOLS } /* chesssymbols */, - { 0, 4355, 55, 17, 4, UNI_CANS } /* scriptextensions=cans */, - { 1, 1102, 2220, 4, 4, UNI_HUNG } /* scx=hung */, - { 513, 959, 588, 8, 2, UNI_EXT } /* extender=t */, - { 0, 2496, 639, 3, 3, UNI_JG__NUN } /* jg=nun */, - { 6, 6944, 292, 25, 1, UNI_CCC__23 } /* canonicalcombiningclass=23 */, - { 1056, 555, 392, 4, 3, UNI_AGE__6_DOT_3 } /* age=6.3 */, - { 0, 7527, 6173, 3, 12, UNI_LB__SY } /* lb=breaksymbols */, - { 0, 2454, 5812, 7, 6, UNI_GEORGIANSUP } /* isgeorgiansup */, - { 3, 7208, 115, 9, 2, UNI_SK } /* category=sk */, - { 0, 6944, 292, 25, 2, UNI_CCC__A } /* canonicalcombiningclass=230 */, - { 7, 7201, 229, 16, 2, UNI_PE } /* generalcategory=pe */, - { 52, 3474, 4107, 6, 15, UNI_INHANGUL } /* block=hangulsyllables */, - { 0, 5, 356, 3, 2, UNI_EXT } /* ext=y */, - { 0, 940, 934, 6, 2, -UNI_COMPEX } /* compex=f */, - { 21, 1879, 1009, 4, 6, UNI_INLYCIAN } /* blk=lycian */, - { 5, 4433, 4464, 9, 4, UNI_LATINEXTC } /* blk=latinextc */, - { 0, 749, 0, 7, 0, UNI_MARC } /* marchen */, - { 2, 2678, 6492, 2, 3, UNI_BC__AL } /* bc=al */, - { 4, 513, 294, 5, 1, UNI_NV__3_SLASH_4 } /* nv=3/4 */, - { 0, 682, 5898, 3, 4, UNI_ANY } /* unicode */, - { 0, 464, 6842, 2, 14, UNI_MUSIC } /* ismusicalsymbols */, - { 522, 6944, 346, 23, 2, UNI_CCC__1 } /* canonicalcombiningclass=1 */, - { 0, 823, 356, 4, 4, UNI_DASH } /* dash=yes */, - { 5, 5787, 0, 19, 0, UNI_JAMOEXTA } /* hanguljamoextendeda */, - { 0, 7584, 0, 18, 0, UNI_dt_values_index } /* decompositiontype= */, - { 0, 3474, 1009, 6, 6, UNI_INLYCIAN } /* block=lycian */, - { 4, 6185, 0, 17, 0, UNI_NV__1000 } /* numericvalue=1000 */, - { 0, 1377, 4338, 3, 17, UNI_RI } /* wb=regionalindicator */, - { 1, 257, 356, 4, 2, UNI_CWCF } /* cwcf=y */, - { 133, 1796, 651, 7, 5, UNI_SC__ADLM } /* script=adlam */, - { 0, 2678, 7115, 3, 17, UNI_BC__ES } /* bc=europeanseparator */, - { 1, 328, 1818, 3, 8, UNI_SUPERANDSUB } /* superandsub */, - { 0, 378, 601, 4, 2, UNI_grext_values_index } /* grext= */, - { 0, 895, 395, 5, 2, UNI_AGE__4_DOT_1 } /* age=v41 */, - { 5, 4355, 3991, 17, 4, UNI_BRAI } /* scriptextensions=brai */, - { 0, 520, 1072, 4, 3, UNI_NV__7_SLASH_12 } /* nv=7/12 */, - { 8, 2275, 5620, 9, 4, -UNI_IDC } /* idcontinue=no */, - { 51, 4355, 220, 17, 4, UNI_TOTO } /* scriptextensions=toto */, - { 0, 1710, 0, 7, 0, UNI_XPOSIXSPACE } /* isspace */, - { 65, 5748, 837, 6, 3, UNI_SUPPUAA } /* insuppuaa */, - { 0, 464, 1086, 2, 4, UNI_KTHI } /* iskthi */, - { 55, 5136, 1052, 5, 7, UNI_INMAHAJANI } /* blk=mahajani */, - { 19, 3474, 477, 6, 3, UNI_INVAI } /* block=vai */, - { 672, 1796, 5284, 7, 20, UNI_PHLI } /* script=inscriptionalpahlavi */, - { 200, 7148, 1302, 25, 2, UNI_CCC__103 } /* canonicalcombiningclass=103 */, - { 0, 4122, 587, 8, 3, UNI_XPOSIXLOWER } /* lowercase=t */, - { 0, 940, 5644, 2, 17, UNI_COUNTINGROD } /* countingrodnumerals */, - { 0, 1377, 3423, 3, 12, UNI_WB__EB } /* wb=glueafterzwj */, - { 1847, 7208, 4081, 9, 5, UNI_P } /* category=punct */, - { 16, 1102, 1117, 4, 8, UNI_TAGB } /* scx=tagbanwa */, - { 27, 2678, 5978, 3, 12, UNI_BC__AN } /* bc=arabicnumber */, - { 0, 4433, 0, 13, 0, UNI_LATINEXTE } /* blk=latinexte */, - { 4, 6774, 1548, 23, 3, UNI_di_values_index } /* defaultignorablecodepoint= */, - { 2, 75, 588, 3, 2, UNI_CWU } /* cwu=t */, - { 16, 2771, 0, 5, 0, UNI_KHMR } /* khmer */, - { 0, 1102, 1529, 4, 4, UNI_KHAR } /* scx=khar */, - { 1, 464, 686, 2, 5, UNI_TAKR } /* istakri */, - { 0, 5586, 546, 21, 3, UNI_WB__EB } /* graphemeclusterbreak=ebg */, - { 5, 1377, 2680, 2, 3, UNI_RI } /* wb=ri */, - { 0, 1102, 1191, 4, 4, UNI_BENG } /* scx=beng */, - { 20, 464, 321, 2, 5, UNI_TALE } /* istaile */, - { 1, 7527, 1977, 3, 2, UNI_LB__PO } /* lb=po */, - { 98, 1796, 742, 7, 4, UNI_SC__MAND } /* script=mand */, - { 1, 6379, 118, 13, 3, UNI_JG__DAL } /* joininggroup=dal */, - { 1152, 464, 4582, 2, 4, UNI_BOPO } /* isbopo */, - { 6, 4355, 1826, 17, 11, UNI_SYLO } /* scriptextensions=sylotinagri */, - { 3, 7584, 1168, 18, 6, UNI_DT__MED } /* decompositiontype=medial */, - { 519, 4355, 618, 17, 4, UNI_ELYM } /* scriptextensions=elym */, - { 2, 464, 1614, 2, 10, UNI_WARA } /* iswarangciti */, - { 28, 0, 0, 1, 0, UNI_L } /* l */, - { 2, 2890, 2857, 3, 11, UNI_JT__D } /* jt=dualjoining */, - { 4, 6039, 7975, 7, 32, UNI_MISCMATHSYMBOLSA } /* block=miscellaneousmathematicalsymbolsa */, - { 0, 6114, 917, 3, 8, UNI_BASS } /* sc=bassavah */, - { 6, 2496, 1723, 3, 8, UNI_JG__FARSIYEH } /* jg=farsiyeh */, - { 0, 3474, 7791, 6, 32, UNI_INIDC } /* block=ideographicdescriptioncharacters */, - { 29, 464, 3514, 2, 13, UNI_ZL } /* islineseparator */, - { 8, 8276, 3249, 31, 5, UNI_INSC__CONSONANTFINAL } /* indicsyllabiccategory=consonantfinal */, - { 1, 313, 1255, 2, 7, UNI_INSOYOMBO } /* insoyombo */, - { 1273, 1174, 0, 3, 0, UNI_ea_values_index } /* ea= */, - { 0, 7431, 3365, 27, 2, UNI_CCC__36 } /* canonicalcombiningclass=ccc36 */, - { 4, 1311, 0, 4, 0, UNI_ITAL } /* ital */, - { 0, 6114, 1571, 3, 4, UNI_SAUR } /* sc=saur */, - { 0, 1451, 0, 10, 0, UNI_DIAK } /* divesakuru */, - { 18, 34, 4900, 1, 18, UNI_EBASE } /* isemojimodifierbase */, - { 744, 3622, 1037, 7, 4, UNI_LATINEXTB } /* islatinextb */, - { 1, 7527, 313, 3, 2, UNI_LB__IN } /* lb=in */, - { 0, 2274, 355, 10, 3, UNI_XIDC } /* xidcontinue=y */, - { 0, 464, 5907, 2, 7, UNI_SINH } /* issinhala */, - { 790, 8007, 6509, 7, 19, UNI_CJKCOMPATIDEOGRAPHSSUP } /* blk=cjkcompatideographssup */, - { 2, 5523, 602, 21, 2, -UNI_CWL } /* changeswhenlowercased=n */, - { 0, 1377, 102, 3, 2, UNI_LB__HL } /* wb=hl */, - { 7, 3823, 278, 16, 1, UNI_sterm_values_index } /* sentenceterminal= */, - { 0, 1383, 601, 3, 3, -UNI_IDST } /* idst=n */, - { 10, 464, 1487, 2, 8, UNI_JAMOEXTA } /* isjamoexta */, - { 0, 313, 4857, 2, 15, UNI_TAMILSUP } /* intamilsupplement */, - { 6, 4355, 656, 17, 5, UNI_BUHD } /* scriptextensions=buhid */, - { 314, 7431, 292, 27, 2, UNI_CCC__30 } /* canonicalcombiningclass=ccc30 */, - { 1, 4291, 2002, 9, 10, UNI_LB__B2 } /* linebreak=breakboth */, - { 4, 2384, 0, 2, 0, UNI__PERL_SURROGATE } /* cs */, - { 0, 1948, 0, 10, 0, UNI_SOGO } /* oldsogdian */, - { 1, 275, 546, 4, 2, UNI_WB__EB } /* gcb=eb */, - { 66, 1377, 1591, 3, 2, UNI_LB__LF } /* wb=lf */, - { 32, 1102, 1826, 4, 4, UNI_SYLO } /* scx=sylo */, - { 58, 2485, 3228, 6, 5, UNI_XPOSIXALNUM } /* xposixalnum */, - { 3, 1879, 3309, 4, 15, UNI_INMEROITICCURSIVE } /* blk=meroiticcursive */, - { 0, 7201, 252, 16, 2, UNI_CN } /* generalcategory=cn */, - { 1, 1214, 3641, 6, 10, UNI_KANASUP } /* inkanasupplement */, - { 0, 3794, 0, 14, 0, UNI_NV__8 } /* numericvalue=8 */, - { 0, 464, 334, 2, 2, UNI_PD } /* ispd */, - { 262, 3137, 607, 15, 4, UNI_EA__W } /* eastasianwidth=wide */, - { 0, 1796, 248, 7, 4, UNI_ZZZZ } /* script=zzzz */, - { 1, 1102, 1755, 4, 11, UNI_MEDF } /* scx=medefaidrin */, - { 0, 3474, 4857, 6, 15, UNI_TAMILSUP } /* block=tamilsupplement */, - { 0, 1879, 6134, 4, 10, UNI_INGLAGOLITIC } /* blk=glagolitic */, - { 7, 4996, 5382, 13, 7, UNI_JG__MANICHAEANHUNDRED } /* jg=manichaeanhundred */, - { 0, 6114, 651, 3, 5, UNI_SC__ADLM } /* sc=adlam */, - { 4, 4996, 4174, 13, 4, UNI_JG__MANICHAEANHETH } /* jg=manichaeanheth */, - { 0, 832, 588, 5, 2, UNI_STERM } /* sterm=t */, - { 1, 7, 197, 1, 3, UNI_TAGS } /* tags */, - { 142, 4062, 0, 15, 0, UNI_VEDICEXT } /* vedicextensions */, - { 0, 409, 0, 4, 0, UNI_DIAK } /* diak */, - { 0, 2496, 6399, 3, 3, UNI_JG__QAF } /* jg=qaf */, - { 0, 1102, 1227, 4, 4, UNI_MULT } /* scx=mult */, - { 14, 426, 7501, 3, 26, UNI_ANCIENTGREEKMUSIC } /* inancientgreekmusicalnotation */, - { 1, 8276, 5269, 22, 15, UNI_INSC__REGISTERSHIFTER } /* indicsyllabiccategory=registershifter */, - { 0, 14, 7556, 1, 19, UNI_MISCSYMBOLS } /* miscellaneoussymbols */, - { 1, 3137, 602, 14, 2, UNI_EA__N } /* eastasianwidth=n */, - { 0, 7317, 4207, 10, 3, UNI_BC__NSM } /* bidiclass=nsm */, - { 0, 1102, 2740, 4, 6, UNI_COPT } /* scx=coptic */, - { 0, 2792, 0, 10, 0, UNI_CYRL } /* iscyrillic */, - { 3, 6039, 7761, 7, 30, UNI_MATHALPHANUM } /* block=mathematicalalphanumericsymbols */, - { 0, 131, 4615, 1, 15, UNI_PF } /* finalpunctuation */, - { 1, 5340, 0, 10, 0, UNI_DEVA } /* devanagari */, - { 0, 3474, 1248, 6, 7, UNI_INSIDDHAM } /* block=siddham */, - { 1, 12, 278, 3, 1, UNI_pcm_values_index } /* pcm= */, - { 525, 983, 0, 4, 0, UNI_HIRA } /* hira */, - { 0, 4355, 429, 17, 3, UNI_MRO } /* scriptextensions=mro */, - { 0, 3974, 934, 17, 2, -UNI_IDSB } /* idsbinaryoperator=f */, - { 0, 600, 2652, 3, 8, UNI_DT__VERT } /* dt=vertical */, - { 0, 2692, 7481, 8, 20, UNI_ARABICPFA } /* blk=arabicpresentationformsa */, - { 0, 2483, 4122, 8, 5, UNI_XPOSIXLOWER } /* isxposixlower */, - { 1, 6114, 810, 3, 4, UNI_SC__SYRC } /* sc=syrc */, - { 75, 1796, 401, 7, 4, UNI_MIAO } /* script=miao */, - { 1, 2948, 602, 13, 2, UNI_COMPEX } /* nfcquickcheck=n */, - { 1365, 8276, 1168, 31, 6, UNI_INSC__CONSONANTMEDIAL } /* indicsyllabiccategory=consonantmedial */, - { 1, 464, 618, 2, 7, UNI_ELYM } /* iselymaic */, - { 2, 3474, 686, 6, 5, UNI_INTAKRI } /* block=takri */, - { 0, 6114, 0, 3, 0, UNI_sc_values_index } /* sc= */, - { 674, 8374, 3039, 25, 5, UNI__PERL_PROBLEMATIC_LOCALE_FOLDS } /* _perl_problematic_locale_folds */, - { 34, 1377, 3432, 3, 3, UNI_LB__ZWJ } /* wb=zwj */, - { 0, 2153, 392, 4, 1, UNI_NV__46 } /* nv=46 */, - { 280, 1915, 355, 11, 5, UNI_GRBASE } /* graphemebase=yes */, - { 0, 1383, 588, 4, 5, UNI_IDST } /* idst=true */, - { 28, 2394, 0, 7, 0, UNI_MYMR } /* myanmar */, - { 1, 1796, 656, 7, 5, UNI_SC__BUHD } /* script=buhid */, - { 0, 832, 602, 5, 2, -UNI_STERM } /* sterm=n */, - { 663, 3474, 6728, 6, 14, UNI_MEETEIMAYEKEXT } /* block=meeteimayekext */, - { 165, 823, 356, 4, 2, UNI_DASH } /* dash=y */, - { 0, 644, 588, 3, 2, UNI_GCB__T } /* hst=t */, - { 2, 2726, 7044, 3, 13, UNI_M } /* gc=combiningmark */, - { 66, 4901, 278, 13, 1, UNI_emod_values_index } /* emojimodifier= */, - { 16, 4515, 588, 18, 5, UNI_IDST } /* idstrinaryoperator=true */, - { 762, 7431, 891, 27, 2, UNI_CCC__10 } /* canonicalcombiningclass=ccc10 */, - { 5, 6402, 4500, 14, 5, UNI_SB__UP } /* sentencebreak=upper */, - { 0, 1879, 728, 4, 7, UNI_KALI } /* blk=kayahli */, - { 0, 7823, 6334, 5, 18, UNI_CJKCOMPATFORMS } /* incjkcompatibilityforms */, - { 27, 2726, 54, 3, 2, UNI_MC } /* gc=mc */, - { 0, 464, 1495, 2, 8, UNI_JAVA } /* isjavanese */, - { 1, 4122, 933, 8, 3, -UNI_XPOSIXLOWER } /* lowercase=f */, - { 2, 1796, 4998, 6, 11, UNI_SC__MANI } /* script=manichaean */, - { 0, 4901, 587, 16, 6, UNI_EBASE } /* emojimodifierbase=true */, - { 0, 6799, 602, 24, 3, -UNI_COMPEX } /* fullcompositionexclusion=no */, - { 8, 7584, 366, 18, 3, UNI_DT__SML } /* decompositiontype=sml */, - { 515, 1174, 3083, 3, 7, UNI_EA__N } /* ea=neutral */, - { 1, 464, 4456, 2, 12, UNI_CYRILLICEXTC } /* iscyrillicextc */, - { 0, 4322, 3777, 14, 2, UNI_NV__3_SLASH_8 } /* numericvalue=3/8 */, - { 3, 343, 8037, 4, 10, UNI_CCC__BR } /* ccc=belowright */, - { 259, 4355, 1280, 17, 9, UNI_NBAT } /* scriptextensions=nabataean */, - { 3, 2712, 356, 5, 2, UNI_EMOJI } /* emoji=y */, - { 0, 1102, 47, 4, 4, UNI_BUHD } /* scx=buhd */, - { 33, 313, 7500, 2, 17, UNI_ANCIENTGREEKMUSIC } /* inancientgreekmusic */, - { 1716, 1856, 934, 5, 6, -UNI_BIDIC } /* bidic=false */, - { 0, 4291, 1739, 10, 8, UNI_LB__LF } /* linebreak=linefeed */, - { 11, 1382, 588, 4, 2, UNI_XIDS } /* xids=t */, - { 8, 1856, 356, 11, 2, UNI_BIDIC } /* bidicontrol=y */, - { 1, 5087, 3013, 10, 11, UNI_WB__DQ } /* wordbreak=doublequote */, - { 37, 5844, 5080, 5, 7, UNI_SUPARROWSA } /* issuparrowsa */, - { 1652, 7317, 334, 10, 3, UNI_BC__PDF } /* bidiclass=pdf */, - { 68, 2712, 934, 14, 6, -UNI_ECOMP } /* emojicomponent=false */, - { 0, 5844, 8550, 13, 22, UNI_SUPMATHOPERATORS } /* issupplementalmathematicaloperators */, - { 98, 3474, 6594, 6, 6, UNI_INBRAHMI } /* block=brahmi */, - { 9, 1102, 337, 4, 6, UNI_CARI } /* scx=carian */, - { 0, 2290, 0, 6, 0, UNI_N } /* number */, - { 32, 861, 0, 7, 0, UNI_TIBT } /* tibetan */, - { 22, 1796, 1335, 7, 9, UNI_SC__OUGR } /* script=olduyghur */, - { 520, 58, 1802, 2, 5, UNI_SC__MLYM } /* sc=mlym */, - { 57, 6114, 496, 3, 4, UNI_SC__KHOJ } /* sc=khoj */, - { 1832, 3474, 776, 6, 7, UNI_OLCK } /* block=olchiki */, - { 1, 4291, 383, 10, 6, UNI_LB__HY } /* linebreak=hyphen */, - { 15, 58, 4998, 2, 11, UNI_SC__MANI } /* sc=manichaean */, - { 137, 6114, 1948, 3, 10, UNI_SOGO } /* sc=oldsogdian */, - { 1553, 6114, 4857, 3, 5, UNI_SC__TAML } /* sc=tamil */, - { 2, 2353, 6142, 8, 12, UNI_CYRILLICSUP } /* incyrillicsupplement */, - { 0, 6402, 844, 14, 2, UNI_SB__LO } /* sentencebreak=lo */, - { 1063, 1075, 2617, 4, 8, UNI_NV__1_SLASH_5 } /* nv=2.000e-01 */, - { 20, 464, 1335, 2, 9, UNI_OUGR } /* isolduyghur */, - { 0, 464, 317, 2, 4, UNI_M } /* ismark */, - { 608, 2678, 3465, 2, 3, UNI_BC__ET } /* bc=et */, - { 109, 313, 6644, 2, 22, UNI_TRANSPORTANDMAP } /* intransportandmapsymbols */, - { 16, 2974, 2090, 11, 2, UNI_IN__6_DOT_2 } /* presentin=v62 */, - { 4, 868, 0, 4, 0, UNI_TIRH } /* tirh */, - { 0, 464, 4776, 2, 17, UNI__PERL_PATWS } /* ispatternwhitespace */, - { 3, 2973, 356, 5, 2, UNI_EPRES } /* epres=y */, - { 0, 2496, 653, 3, 3, UNI_JG__LAM } /* jg=lam */, - { 54, 1796, 4582, 7, 4, UNI_SC__BOPO } /* script=bopo */, - { 0, 4302, 5620, 5, 4, -UNI_XPOSIXSPACE } /* wspace=no */, - { 1, 1879, 59, 4, 4, UNI_INCHAM } /* blk=cham */, - { 5, 1975, 1079, 3, 7, UNI_POSIXWORD } /* isperlword */, - { 0, 417, 0, 3, 0, UNI_HAN } /* han */, - { 4, 6114, 2401, 3, 11, UNI_SC__NAND } /* sc=nandinagari */, - { 1906, 1102, 98, 4, 4, UNI_GURU } /* scx=guru */, - { 0, 2496, 4198, 3, 4, UNI_JG__TETH } /* jg=teth */, - { 3, 1951, 0, 4, 0, UNI_SOGD } /* sogd */, - { 1, 6114, 798, 3, 4, UNI_LANA } /* sc=lana */, - { 0, 1102, 102, 4, 4, UNI_HLUW } /* scx=hluw */, - { 0, 3351, 394, 13, 2, UNI_NV__34 } /* numericvalue=34 */, - { 5, 4901, 5620, 16, 3, -UNI_EBASE } /* emojimodifierbase=n */, - { 0, 1102, 5284, 4, 20, UNI_PHLI } /* scx=inscriptionalpahlavi */, - { 0, 2474, 2813, 3, 6, UNI_MAHJONG } /* ismahjong */, - { 0, 2392, 7556, 3, 19, UNI_MISCSYMBOLS } /* inmiscellaneoussymbols */, - { 90, 8276, 2573, 22, 6, UNI_LB__ZWJ } /* indicsyllabiccategory=joiner */, - { 0, 7527, 5718, 3, 9, UNI_EMOD } /* lb=emodifier */, - { 0, 3593, 1491, 7, 4, UNI_LATINEXTA } /* inlatinexta */, - { 0, 8470, 0, 20, 0, UNI_vo_values_index } /* verticalorientation= */, - { 1, 58, 3671, 2, 10, UNI_SC__MLYM } /* sc=malayalam */, - { 0, 1796, 1191, 7, 7, UNI_SC__BENG } /* script=bengali */, - { 0, 5586, 898, 20, 2, UNI_GCB__V } /* graphemeclusterbreak=v */, - { 0, 1879, 196, 4, 4, UNI_TAGS } /* blk=tags */, - { 1, 1977, 1915, 5, 5, UNI_POSIXGRAPH } /* posixgraph */, - { 261, 6944, 7966, 24, 9, UNI_CCC__AL } /* canonicalcombiningclass=aboveleft */, + { 0, 2732, 7545, 8, 20, UNI_ARABICPFA } /* blk=arabicpresentationformsa */, + { 0, 5532, 353, 21, 2, UNI_CWCF } /* changeswhencasefolded=y */, + { 0, 2018, 6621, 4, 3, UNI_JOINC } /* joinc=t */, + { 0, 1667, 1966, 5, 9, UNI_COMPATJAMO } /* blk=compatjamo */, + { 3, 461, 1635, 2, 4, UNI_WARA } /* iswara */, + { 0, 4360, 153, 10, 2, UNI_LB__SG } /* linebreak=sg */, + { 2, 3490, 4659, 12, 9, UNI_CYRILLICEXTC } /* blk=cyrillicextendedc */, + { 10, 1823, 1543, 7, 4, UNI_KHAR } /* script=khar */, + { 0, 1424, 1317, 8, 2, UNI_CCC__132 } /* ccc=ccc132 */, + { 0, 1492, 6945, 5, 20, UNI_GEOMETRICSHAPESEXT } /* ingeometricshapesextended */, + { 2, 2752, 598, 13, 4, -UNI_ECOMP } /* emojicomponent=no */, + { 0, 2, 5694, 1, 18, UNI_COUNTINGROD } /* countingrodnumerals */, + { 5, 2324, 5283, 6, 9, UNI_HALFMARKS } /* block=halfmarks */, + { 0, 4584, 934, 18, 2, -UNI_IDST } /* idstrinaryoperator=f */, + { 3, 1455, 353, 10, 2, UNI_DEP } /* deprecated=y */, + { 0, 292, 1314, 4, 3, UNI_NV__9000 } /* nv=9000 */, + { 0, 7274, 2768, 8, 6, UNI_C } /* category=other */, + { 3, 309, 653, 2, 5, UNI_INBUHID } /* inbuhid */, + { 17, 406, 353, 3, 4, UNI_DIA } /* dia=yes */, + { 0, 1409, 4698, 4, 5, UNI_LATIN1 } /* latin1sup */, + { 1, 2324, 7356, 6, 27, UNI_OCR } /* block=opticalcharacterrecognition */, + { 7, 30, 6796, 1, 5, UNI_DEVA } /* isdeva */, + { 40, 2004, 1942, 5, 5, UNI_POSIXGRAPH } /* posixgraph */, + { 4, 5637, 0, 21, 0, UNI_gcb_values_index } /* graphemeclusterbreak= */, + { 2, 1454, 0, 2, 0, UNI_SD } /* sd */, + { 9, 3677, 3773, 3, 15, UNI_LINEARBIDEOGRAMS } /* islinearbideograms */, + { 2, 461, 326, 2, 2, UNI_PF } /* ispf */, + { 6, 2180, 0, 4, 0, UNI_NV__4 } /* nv=4 */, + { 15, 4795, 1805, 14, 5, UNI_NV__600000 } /* numericvalue=600000 */, + { 4, 461, 4176, 2, 4, UNI_HANG } /* ishang */, + { 1, 6165, 1227, 3, 7, UNI_MAKA } /* sc=makasar */, + { 3, 2536, 2886, 3, 11, UNI_JG__YEHWITHTAIL } /* jg=yehwithtail */, + { 5, 1367, 0, 4, 0, UNI_PAUC } /* pauc */, + { 0, 1667, 5440, 4, 20, UNI_INNYIAKENGPUACHUEHMONG } /* blk=nyiakengpuachuehmong */, + { 3, 1823, 608, 7, 7, UNI_ELBA } /* script=elbasan */, + { 3, 0, 2619, 1, 12, UNI_LOWSURROGATES } /* lowsurrogates */, + { 20, 6090, 1037, 13, 4, UNI_MYANMAREXTB } /* block=myanmarextb */, + { 0, 1667, 2468, 4, 6, UNI_IPAEXT } /* blk=ipaext */, + { 32, 339, 5515, 4, 17, UNI_WB__EB } /* ccc=attachedbelowleft */, + { 1, 309, 6185, 2, 13, UNI_GLAGOLITICSUP } /* inglagoliticsup */, + { 0, 4424, 3954, 17, 17, UNI_AGHB } /* scriptextensions=caucasianalbanian */, + { 9, 1667, 283, 4, 5, UNI_INNUSHU } /* blk=nushu */, + { 1, 2287, 546, 4, 3, UNI_IN__13 } /* in=13.0 */, + { 2, 5216, 4344, 7, 16, UNI_LETTERLIKESYMBOLS } /* block=letterlikesymbols */, + { 3, 30, 5390, 1, 19, UNI_CHEROKEESUP } /* ischerokeesupplement */, + { 1, 6165, 5391, 3, 4, UNI_CHER } /* sc=cher */, + { 1, 4424, 3325, 17, 6, UNI_HEBR } /* scriptextensions=hebrew */, + { 0, 6165, 357, 3, 6, UNI_SC__CAKM } /* sc=chakma */, + { 1, 461, 1334, 2, 4, UNI_PERM } /* isperm */, + { 1, 3554, 0, 13, 0, UNI_ZL } /* lineseparator */, + { 2, 7274, 0, 9, 2, UNI_CASEDLETTER } /* category=l& */, + { 8, 1667, 4131, 4, 15, UNI_VEDICEXT } /* blk=vedicextensions */, + { 1, 3633, 204, 9, 2, UNI_LATINEXTF } /* inlatinextf */, + { 1, 430, 0, 3, 0, UNI_NKO } /* nko */, + { 14, 339, 2029, 3, 3, UNI_CCC__BR } /* ccc=br */, + { 4, 461, 2531, 2, 5, UNI_XPOSIXBLANK } /* isblank */, + { 2, 1667, 5857, 4, 19, UNI_MONGOLIANSUP } /* blk=mongoliansupplement */, + { 0, 925, 598, 2, 3, UNI_BPT__N } /* bpt=n */, + { 0, 7198, 5149, 16, 7, UNI_SUPARROWSA } /* blk=supplementalarrowsa */, + { 4, 6165, 825, 3, 7, UNI_SHAW } /* sc=shavian */, + { 17, 1823, 4060, 7, 7, UNI_BRAI } /* script=braille */, + { 2, 6165, 1303, 3, 9, UNI_TALU } /* sc=newtailue */, + { 2, 2536, 636, 3, 3, UNI_JG__NUN } /* jg=nun */, + { 10, 7383, 143, 10, 2, UNI_BC__BN } /* bidiclass=bn */, + { 0, 832, 353, 5, 4, UNI_STERM } /* sterm=yes */, + { 0, 4502, 2619, 5, 12, UNI_LOWSURROGATES } /* blk=lowsurrogates */, + { 0, 2324, 590, 6, 7, UNI_DSRT } /* block=deseret */, + { 51, 6165, 818, 3, 7, UNI_SC__SHRD } /* sc=sharada */, + { 1, 2766, 6324, 3, 6, UNI_CF } /* gc=format */, + { 0, 3130, 2370, 5, 12, UNI_GREEKEXT } /* blk=greekextended */, + { 5, 552, 2234, 3, 2, UNI_AGE__8 } /* age=8 */, + { 1, 3514, 1723, 12, 3, UNI_ARABICPFB } /* block=arabicpfb */, + { 18, 6165, 814, 3, 4, UNI_SC__QAAI } /* sc=zinh */, + { 0, 786, 0, 4, 0, UNI_HMNP } /* hmnp */, + { 0, 7267, 65, 16, 2, UNI_MN } /* generalcategory=mn */, + { 0, 461, 6841, 2, 25, UNI_DI } /* isdefaultignorablecodepoint */, + { 15, 1618, 353, 10, 4, UNI_SD } /* softdotted=yes */, + { 15, 597, 128, 3, 3, UNI_DT__MED } /* dt=med */, + { 5, 406, 599, 3, 2, -UNI_DIA } /* dia=n */, + { 3, 309, 3538, 2, 16, UNI_CYPRIOTSYLLABARY } /* incypriotsyllabary */, + { 37, 5216, 81, 13, 2, UNI_LATINEXTG } /* block=latinextg */, + { 3, 8538, 1626, 29, 9, UNI_VO__TU } /* verticalorientation=transformedupright */, + { 2, 6427, 2549, 13, 10, UNI_JG__DALATHRISH } /* joininggroup=dalathrish */, + { 8, 160, 162, 2, 2, UNI_PHLP } /* phlp */, + { 5, 2752, 585, 5, 5, UNI_EMOJI } /* emoji=true */, + { 0, 2324, 1037, 9, 4, UNI_CJKEXTB } /* block=cjkextb */, + { 42, 1667, 1367, 4, 9, UNI_INPAUCINHAU } /* blk=paucinhau */, + { 0, 3677, 1674, 7, 4, UNI_LATINEXTD } /* islatinextd */, + { 8, 2324, 1303, 6, 9, UNI_INNEWTAILUE } /* block=newtailue */, + { 0, 1562, 0, 10, 0, UNI_NAGM } /* nagmundari */, + { 1, 4360, 2017, 10, 2, UNI_LB__WJ } /* linebreak=wj */, + { 0, 7274, 1926, 9, 6, UNI_S } /* category=symbol */, + { 0, 8538, 5993, 20, 7, UNI_VO__R } /* verticalorientation=rotated */, + { 4, 1667, 1021, 4, 6, UNI_INWANCHO } /* blk=wancho */, + { 5, 1667, 7111, 5, 23, UNI_DIACRITICALSFORSYMBOLS } /* blk=combiningmarksforsymbols */, + { 0, 1823, 1376, 7, 9, UNI_SAMR } /* script=samaritan */, + { 0, 229, 4457, 2, 15, UNI_SUTTONSIGNWRITING } /* suttonsignwriting */, + { 0, 1734, 0, 3, 0, UNI_S } /* iss */, + { 0, 30, 6691, 1, 23, UNI_TRANSPORTANDMAP } /* istransportandmapsymbols */, + { 0, 2301, 584, 10, 3, UNI_XIDC } /* xidcontinue=t */, + { 5, 2324, 1975, 6, 10, UNI_INOLDSOGDIAN } /* block=oldsogdian */, + { 5, 4360, 277, 10, 2, UNI_LB__H2 } /* linebreak=h2 */, + { 61144, 3514, 1037, 12, 4, UNI_ARABICEXTB } /* block=arabicextb */, + { 0, 38, 662, 1, 3, UNI_KALI } /* kali */, + { 3, 1994, 353, 7, 2, UNI_RADICAL } /* radical=y */, + { 1, 21, 598, 2, 4, -UNI_EXT } /* ext=no */, + { 1, 2503, 274, 11, 1, UNI_joinc_values_index } /* joincontrol= */, + { 0, 4424, 967, 17, 8, UNI_GUJR } /* scriptextensions=gujarati */, + { 0, 3391, 2289, 12, 3, UNI_NV__14 } /* numericvalue=14 */, + { 3, 1102, 880, 4, 7, UNI_ZZZZ } /* scx=unknown */, + { 0, 461, 3791, 2, 4, UNI_MATH } /* ismath */, + { 18, 1200, 8474, 3, 23, UNI_CJKCOMPATIDEOGRAPHS } /* cjkcompatibilityideographs */, + { 4, 1667, 1205, 4, 7, UNI_INGRANTHA } /* blk=grantha */, + { 4, 3391, 2146, 13, 9, UNI_NV__3_SLASH_20 } /* numericvalue=1.500e-01 */, + { 1, 461, 658, 2, 5, UNI_DOGR } /* isdogra */, + { 4, 1198, 8407, 3, 34, UNI_DIACRITICALSFORSYMBOLS } /* incombiningdiacriticalmarksforsymbols */, + { 0, 3514, 2312, 7, 12, UNI_AEGEANNUMBERS } /* block=aegeannumbers */, + { 3, 7564, 0, 27, 0, UNI_ANCIENTGREEKMUSIC } /* ancientgreekmusicalnotation */, + { 0, 1102, 1509, 4, 4, UNI_JAVA } /* scx=java */, + { 4, 1102, 983, 4, 4, UNI_HIRA } /* scx=hira */, + { 2, 8343, 5003, 22, 14, UNI_INSC__GEMINATIONMARK } /* indicsyllabiccategory=geminationmark */, + { 0, 309, 4090, 2, 17, UNI_INDICSIYAQNUMBERS } /* inindicsiyaqnumbers */, + { 0, 4569, 584, 8, 3, UNI_XPOSIXUPPER } /* uppercase=t */, + { 0, 1942, 352, 11, 5, UNI_GRBASE } /* graphemebase=yes */, + { 4, 461, 4862, 2, 4, UNI_RUMI } /* isrumi */, + { 9, 6090, 8374, 7, 33, UNI_MISCPICTOGRAPHS } /* block=miscellaneoussymbolsandpictographs */, + { 3, 271, 599, 2, 2, UNI_N } /* gc=n */, + { 1, 880, 0, 7, 0, UNI_ZZZZ } /* unknown */, + { 2, 461, 3908, 2, 6, UNI_TANG } /* istangut */, + { 0, 1065, 2147, 4, 8, UNI_NV__3_SLASH_20 } /* nv=1.500e-01 */, + { 0, 6450, 3001, 14, 7, UNI_SB__NU } /* sentencebreak=numeric */, + { 0, 4424, 6154, 17, 9, UNI_XSUX } /* scriptextensions=cuneiform */, + { 1, 398, 0, 4, 0, UNI_MIAO } /* miao */, + { 0, 5156, 1652, 10, 7, UNI_WB__NL } /* wordbreak=newline */, + { 1, 552, 546, 4, 3, UNI_AGE__3 } /* age=3.0 */, + { 1, 4424, 5391, 17, 4, UNI_CHER } /* scriptextensions=cher */, + { 2, 4424, 901, 17, 8, UNI_ARMN } /* scriptextensions=armenian */, + { 0, 2766, 3276, 3, 13, UNI_ME } /* gc=enclosingmark */, + { 6, 2678, 387, 11, 2, UNI_IN__5_DOT_2 } /* presentin=5.2 */, + { 18, 6165, 98, 3, 4, UNI_HLUW } /* sc=hluw */, + { 0, 461, 4461, 2, 11, UNI_SGNW } /* issignwriting */, + { 0, 7648, 1715, 18, 8, UNI_DT__ISO } /* decompositiontype=isolated */, + { 8, 7591, 7111, 4, 12, UNI_LB__CM } /* lb=combiningmark */, + { 0, 2536, 714, 3, 4, UNI_JG__ZAIN } /* jg=zain */, + { 1, 5168, 6757, 6, 19, UNI__PERL_FOLDS_TO_MULTI_CHAR } /* _perl_folds_to_multi_char */, + { 3, 1667, 1484, 4, 8, UNI_INBUGINESE } /* blk=buginese */, + { 2, 461, 1572, 2, 10, UNI_XPEO } /* isoldpersian */, + { 2, 4424, 1358, 17, 9, UNI_PALM } /* scriptextensions=palmyrene */, + { 1, 309, 3908, 2, 16, UNI_TANGUTCOMPONENTS } /* intangutcomponents */, + { 56, 4, 0, 2, 0, UNI_LO } /* lo */, + { 0, 7591, 6224, 3, 12, UNI_LB__SY } /* lb=breaksymbols */, + { 24, 1424, 395, 7, 2, UNI_CCC__16 } /* ccc=ccc16 */, + { 0, 6165, 333, 3, 6, UNI_CARI } /* sc=carian */, + { 49, 8601, 5149, 9, 7, UNI_SUPARROWSA } /* block=suparrowsa */, + { 5, 493, 0, 6, 0, UNI_KHOJ } /* khojki */, + { 0, 5939, 599, 5, 3, -UNI__PERL_NCHAR } /* nchar=no */, + { 2, 3724, 1876, 12, 3, UNI_JG__MALAYALAMLLA } /* jg=malayalamlla */, + { 7, 2280, 2234, 9, 2, UNI_IN__8 } /* presentin=8 */, + { 3, 7274, 2317, 9, 6, UNI_N } /* category=number */, + { 5, 533, 4569, 3, 5, UNI_SB__UP } /* sb=upper */, + { 0, 1494, 0, 4, 0, UNI_GEOR } /* geor */, + { 2, 1823, 4651, 7, 4, UNI_SC__BOPO } /* script=bopo */, + { 0, 4371, 5671, 5, 3, -UNI_XPOSIXSPACE } /* wspace=n */, + { 1, 578, 290, 5, 1, UNI_CCC__24 } /* ccc=24 */, + { 0, 461, 725, 2, 7, UNI_KALI } /* iskayahli */, + { 45931, 7267, 4569, 16, 15, UNI_UPPERCASELETTER } /* generalcategory=uppercaseletter */, + { 0, 4191, 274, 5, 1, UNI_lower_values_index } /* lower= */, + { 0, 1734, 4710, 3, 8, UNI_SYRIACSUP } /* issyriacsup */, + { 3, 266, 934, 3, 2, -UNI_CWT } /* cwt=f */, + { 0, 1272, 56, 3, 3, UNI_CHAM } /* ischam */, + { 1, 309, 5857, 2, 12, UNI_MONGOLIANSUP } /* inmongoliansup */, + { 3, 517, 2147, 4, 8, UNI_NV__3_SLASH_4 } /* nv=7.500e-01 */, + { 0, 339, 8640, 4, 18, UNI_CCC__216 } /* ccc=attachedaboveright */, + { 2, 6870, 599, 20, 3, -UNI_CE } /* compositionexclusion=no */, + { 34, 3101, 0, 5, 0, UNI_XPOSIXDIGIT } /* digit */, + { 1, 1728, 1141, 6, 3, UNI_ARABICPFA } /* arabicpfa */, + { 21, 7648, 946, 18, 5, UNI_DT__SUP } /* decompositiontype=super */, + { 21, 2324, 1021, 6, 6, UNI_INWANCHO } /* block=wancho */, + { 10, 1391, 2487, 5, 7, UNI_WB__ML } /* wb=midletter */, + { 0, 4161, 0, 15, 0, UNI_DIACRITICALSEXT } /* diacriticalsext */, + { 0, 3490, 1674, 12, 4, UNI_CYRILLICEXTD } /* blk=cyrillicextd */, + { 0, 7011, 5523, 24, 5, UNI_CCC__B } /* canonicalcombiningclass=below */, + { 14, 461, 5068, 2, 10, UNI_MANI } /* ismanichaean */, + { 1, 1102, 901, 4, 8, UNI_ARMN } /* scx=armenian */, + { 0, 1823, 4176, 7, 4, UNI_SC__HANG } /* script=hang */, + { 0, 1102, 3475, 4, 15, UNI_ZANB } /* scx=zanabazarsquare */, + { 0, 1667, 4620, 4, 16, UNI_LINEARBSYLLABARY } /* blk=linearbsyllabary */, + { 2, 1102, 1051, 4, 8, UNI_MAHJ } /* scx=mahajani */, + { 2, 10, 137, 1, 3, UNI_MYMR } /* mymr */, + { 12, 4424, 868, 17, 7, UNI_TIRH } /* scriptextensions=tirhuta */, + { 1, 2018, 3313, 12, 12, UNI_JT__R } /* joiningtype=rightjoining */, + { 12, 4487, 0, 6, 0, UNI_ZYYY } /* common */, + { 32, 5574, 599, 21, 2, -UNI_CWL } /* changeswhenlowercased=n */, + { 3, 461, 2256, 2, 12, UNI_PHAISTOS } /* isphaistosdisc */, + { 56, 1090, 0, 4, 0, UNI_LINB } /* linb */, + { 0, 2988, 353, 13, 4, UNI_NFCQC__Y } /* nfcquickcheck=yes */, + { 0, 1667, 56, 5, 3, UNI_INCHAM } /* blk=cham */, + { 0, 533, 36, 3, 2, UNI_SB__AT } /* sb=at */, + { 3, 1102, 5876, 4, 9, UNI_SUND } /* scx=sundanese */, + { 6, 4191, 584, 8, 3, UNI_XPOSIXLOWER } /* lowercase=t */, + { 0, 30, 5711, 1, 3, UNI_ME } /* isme */, + { 3, 6165, 2782, 5, 4, UNI_SC__COPT } /* sc=coptic */, + { 10, 1667, 2068, 4, 12, UNI_INMENDEKIKAKUI } /* blk=mendekikakui */, + { 3, 7467, 0, 28, 0, UNI_SUPPUAA } /* supplementaryprivateuseareaa */, + { 0, 3803, 599, 14, 2, UNI_NFKCQC__N } /* nfkcquickcheck=n */, + { 0, 1102, 15, 4, 4, UNI_AGHB } /* scx=aghb */, + { 2, 309, 5778, 2, 21, UNI_ININSCRIPTIONALPARTHIAN } /* ininscriptionalparthian */, + { 0, 302, 524, 3, 3, UNI_PATSYN } /* patsyn */, + { 24, 1667, 7449, 4, 18, UNI_PHONETICEXT } /* blk=phoneticextensions */, + { 0, 1823, 3954, 7, 17, UNI_AGHB } /* script=caucasianalbanian */, + { 1, 1954, 0, 12, 0, UNI_GONG } /* gunjalagondi */, + { 1, 2382, 2720, 2, 2, UNI_VO__R } /* vo=r */, + { 0, 461, 398, 2, 4, UNI_MIAO } /* ismiao */, + { 5, 7591, 2930, 3, 2, UNI_GCB__T } /* lb=jt */, { 0, 1174, 140, 3, 2, UNI_EA__NA } /* ea=na */, - { 8, 4355, 15, 17, 4, UNI_ADLM } /* scriptextensions=adlm */, - { 0, 6239, 1687, 14, 7, UNI_BC__LRI } /* bc=lefttorightisolate */, - { 0, 4302, 355, 5, 2, UNI_wspace_values_index } /* wspace= */, - { 0, 1065, 2056, 4, 8, UNI_NV__1_SLASH_9 } /* nv=1.111e-01 */, - { 186, 6728, 0, 21, 0, UNI_MEETEIMAYEKEXT } /* meeteimayekextensions */, - { 0, 2496, 4194, 3, 4, UNI_JG__QAPH } /* jg=qaph */, - { 292, 2496, 5015, 3, 6, UNI_JG__YUDHHE } /* jg=yudhhe */, - { 1, 6114, 1098, 3, 4, UNI_NSHU } /* sc=nshu */, - { 5, 6687, 4655, 22, 3, UNI_JG__MALAYALAMTTA } /* joininggroup=malayalamtta */, - { 512, 275, 366, 4, 2, UNI_GCB__SM } /* gcb=sm */, - { 3, 1879, 3381, 4, 15, UNI_NARB } /* blk=oldnortharabian */, - { 2, 464, 1860, 2, 7, UNI_XPOSIXCNTRL } /* iscontrol */, - { 0, 1879, 5806, 4, 9, UNI_INMONGOLIAN } /* blk=mongolian */, - { 0, 4872, 5797, 10, 9, UNI_KANAEXTA } /* block=kanaextendeda */, - { 0, 3622, 121, 3, 2, UNI_LAO } /* islao */, - { 0, 6114, 204, 3, 4, UNI_TAVT } /* sc=tavt */, - { 42, 1382, 934, 4, 2, -UNI_XIDS } /* xids=f */, - { 54, 7527, 1747, 3, 8, UNI_LB__NL } /* lb=nextline */, - { 132, 5865, 934, 21, 6, -UNI_LOE } /* logicalorderexception=false */, - { 66, 464, 3933, 2, 4, UNI_MODI } /* ismodi */, - { 0, 2253, 549, 11, 3, UNI_IN__13 } /* presentin=13.0 */, - { 74, 3474, 5625, 7, 18, UNI_ANCIENTGREEKNUMBERS } /* block=ancientgreeknumbers */, - { 0, 2392, 4442, 9, 9, UNI_MYANMAREXTB } /* inmyanmarextendedb */, - { 21, 464, 814, 2, 4, UNI_QAAI } /* iszinh */, - { 0, 464, 3637, 2, 7, UNI_LISUSUP } /* islisusup */, - { 9, 1879, 1542, 4, 6, UNI_ARROWS } /* blk=arrows */, - { 0, 895, 2098, 5, 2, UNI_AGE__6_DOT_3 } /* age=v63 */, - { 1, 6114, 51, 3, 4, UNI_SC__CAKM } /* sc=cakm */, - { 92, 3474, 1695, 12, 3, UNI_ARABICPFB } /* block=arabicpfb */, - { 1548, 1879, 1227, 4, 7, UNI_INMULTANI } /* blk=multani */, - { 0, 1465, 587, 4, 6, UNI_XPOSIXSPACE } /* space=true */, - { 11, 1478, 6878, 5, 15, UNI_GEOMETRICSHAPESEXT } /* ingeometricshapesext */, - { 40, 2253, 2195, 9, 2, UNI_IN__6 } /* presentin=6 */, - { 2, 7317, 5249, 10, 3, UNI_BC__RLE } /* bidiclass=rle */, - { 0, 1410, 348, 7, 2, UNI_CCC__18 } /* ccc=ccc18 */, - { 1, 2392, 2813, 3, 6, UNI_MAHJONG } /* inmahjong */, - { 0, 1796, 425, 7, 4, UNI_SC__LINA } /* script=lina */, - { 12, 296, 3363, 2, 3, UNI_NV__23 } /* nv=23 */, - { 1, 2496, 487, 3, 3, UNI_JG__HAH } /* jg=hah */, - { 0, 5087, 6276, 10, 6, UNI_WB__FO } /* wordbreak=format */, - { 1, 2726, 317, 3, 4, UNI_M } /* gc=mark */, - { 0, 1102, 2401, 4, 11, UNI_NAND } /* scx=nandinagari */, - { 0, 3748, 2056, 14, 8, UNI_NV__1_SLASH_9 } /* numericvalue=1.111e-01 */, - { 764, 1102, 814, 4, 4, UNI_QAAI } /* scx=zinh */, - { 6, 7584, 602, 17, 5, UNI_DT__NONE } /* decompositiontype=none */, - { 6, 2205, 2080, 4, 8, UNI_NV__17_SLASH_2 } /* nv=8.500e+00 */, - { 260, 1102, 1003, 4, 6, UNI_LEPC } /* scx=lepcha */, - { 1, 6944, 2263, 25, 2, UNI_CCC__214 } /* canonicalcombiningclass=214 */, - { 0, 464, 3228, 2, 5, UNI_XPOSIXALNUM } /* isalnum */, - { 0, 1015, 0, 4, 0, UNI_TELU } /* telu */, - { 4, 6114, 6728, 3, 11, UNI_MTEI } /* sc=meeteimayek */, - { 2, 644, 0, 5, 0, UNI_GCB__L } /* hst=l */, - { 0, 1702, 4918, 3, 16, UNI_ALCHEMICAL } /* isalchemicalsymbols */, - { 0, 4291, 1591, 10, 2, UNI_LB__LF } /* linebreak=lf */, - { 1, 5087, 0, 10, 0, UNI_wb_values_index } /* wordbreak= */, - { 26, 7317, 358, 10, 2, UNI_BC__ES } /* bidiclass=es */, - { 1294, 2392, 7975, 3, 32, UNI_MISCMATHSYMBOLSA } /* inmiscellaneousmathematicalsymbolsa */, - { 96, 1867, 278, 5, 1, UNI_bidim_values_index } /* bidim= */, - { 2074, 306, 4370, 4, 2, UNI_patws_values_index } /* patws= */, - { 265, 7201, 3156, 19, 8, UNI_NO } /* generalcategory=othernumber */, - { 1137, 1879, 4857, 4, 8, UNI_TAMILSUP } /* blk=tamilsup */, - { 3, 7527, 7044, 3, 13, UNI_LB__CM } /* lb=combiningmark */, - { 1, 6114, 802, 3, 4, UNI_NBAT } /* sc=nbat */, - { 2, 464, 5865, 2, 21, UNI_LOE } /* islogicalorderexception */, - { 2347, 7527, 0, 29, 0, UNI_LB__CJ } /* lb=conditionaljapanesestarter */, - { 80, 1796, 6594, 7, 6, UNI_BRAH } /* script=brahmi */, - { 1, 1227, 0, 4, 0, UNI_MULT } /* mult */, - { 4, 1410, 398, 7, 2, UNI_CCC__16 } /* ccc=ccc16 */, - { 16, 296, 2065, 3, 2, UNI_NV__25 } /* nv=25 */, - { 0, 2253, 2128, 10, 3, UNI_IN__3_DOT_1 } /* presentin=3.1 */, - { 16, 2678, 2384, 3, 2, UNI_BC__CS } /* bc=cs */, - { 993, 4656, 0, 9, 0, UNI_TANGUTSUP } /* tangutsup */, - { 0, 343, 394, 4, 2, UNI_CCC__34 } /* ccc=34 */, - { 1, 876, 356, 4, 2, UNI_IDEO } /* ideo=y */, - { 8, 2253, 2207, 9, 2, UNI_IN__8 } /* presentin=8 */, - { 1, 4750, 0, 8, 0, UNI_DINGBATS } /* dingbats */, - { 4, 593, 6390, 2, 2, UNI_dep_values_index } /* dep= */, - { 195, 2392, 1491, 9, 4, UNI_MYANMAREXTA } /* inmyanmarexta */, - { 33, 1102, 1335, 4, 9, UNI_OUGR } /* scx=olduyghur */, - { 139, 4122, 5620, 8, 4, -UNI_XPOSIXLOWER } /* lowercase=no */, - { 256, 313, 4857, 2, 5, UNI_INTAMIL } /* intamil */, - { 116, 2981, 2098, 4, 2, UNI_IN__6_DOT_3 } /* in=v63 */, - { 8, 4355, 437, 17, 4, UNI_OGAM } /* scriptextensions=ogam */, - { 1, 5844, 4388, 4, 15, UNI_SUTTONSIGNWRITING } /* issuttonsignwriting */, - { 1, 8470, 5942, 20, 7, UNI_VO__R } /* verticalorientation=rotated */, - { 4, 5, 7175, 1, 26, UNI_ENCLOSEDCJK } /* enclosedcjklettersandmonths */, - { 71, 343, 2074, 5, 2, UNI_CCC__129 } /* ccc=129 */, - { 1, 8007, 3929, 30, 4, UNI_CJKEXTG } /* blk=cjkunifiedideographsextensiong */, - { 0, 3748, 2197, 14, 8, UNI_NV__1_SLASH_80 } /* numericvalue=1.250e-02 */, - { 0, 464, 1837, 2, 5, UNI_EBASE } /* isebase */, - { 0, 1102, 4551, 4, 7, UNI_LINB } /* scx=linearb */, - { 0, 6379, 1731, 13, 8, UNI_JG__SWASHKAF } /* joininggroup=swashkaf */, - { 0, 7527, 0, 3, 0, UNI_lb_values_index } /* lb= */, - { 17, 3474, 5340, 6, 10, UNI_INDEVANAGARI } /* block=devanagari */, - { 2, 4485, 0, 5, 0, UNI_TITLE } /* title */, - { 3, 2275, 588, 3, 5, UNI_IDC } /* idc=true */, - { 0, 3474, 8551, 6, 21, UNI_MATHOPERATORS } /* block=mathematicaloperators */, - { 72, 1796, 1571, 7, 10, UNI_SAUR } /* script=saurashtra */, - { 20, 1975, 165, 3, 3, UNI_PHNX } /* isphnx */, - { 833, 409, 1175, 2, 3, -UNI_DIA } /* dia=n */, - { 0, 1879, 337, 4, 6, UNI_INCARIAN } /* blk=carian */, - { 70, 275, 3151, 2, 7, UNI_L } /* gc=letter */, - { 3, 3654, 6629, 7, 15, UNI_MODIFIERLETTERS } /* spacingmodifierletters */, - { 0, 7880, 7314, 28, 4, UNI_CJKEXTB } /* iscjkunifiedideographsextensionb */, - { 0, 1915, 5620, 11, 4, -UNI_GRBASE } /* graphemebase=no */, - { 7, 555, 2155, 3, 4, UNI_AGE__4_DOT_1 } /* age=4.1 */, - { 40, 7527, 527, 3, 2, UNI_LB__SY } /* lb=sy */, - { 0, 1098, 0, 4, 0, UNI_NSHU } /* nshu */, - { 1, 2363, 6142, 8, 5, UNI_ETHIOPICSUP } /* inethiopicsup */, - { 3, 3351, 2183, 12, 10, UNI_NV__7_SLASH_12 } /* numericvalue=5.833e-01 */, - { 1, 6114, 417, 3, 3, UNI_SC__HAN } /* sc=han */, - { 1280, 6114, 975, 3, 8, UNI_SC__GURU } /* sc=gurmukhi */, - { 0, 2153, 2080, 4, 8, UNI_NV__9_SLASH_2 } /* nv=4.500e+00 */, - { 0, 783, 0, 7, 0, UNI_OSMA } /* osmanya */, - { 0, 240, 0, 4, 0, UNI_ZANB } /* zanb */, - { 0, 2260, 389, 3, 3, UNI_IN__3_DOT_2 } /* in=3.2 */, - { 15, 1967, 278, 7, 1, UNI_radical_values_index } /* radical= */, - { 0, 4291, 4247, 10, 14, UNI_LB__BK } /* linebreak=mandatorybreak */, - { 2, 2948, 356, 13, 4, UNI_NFCQC__Y } /* nfcquickcheck=yes */, - { 2177, 4291, 0, 10, 0, UNI_lb_values_index } /* linebreak= */, - { 1, 2496, 1893, 3, 3, UNI_JG__TAH } /* jg=tah */, - { 0, 464, 7660, 2, 17, UNI_VS } /* isvariationselector */, - { 0, 4996, 2243, 13, 4, UNI_JG__MANICHAEANAYIN } /* jg=manichaeanayin */, - { 7, 6114, 5907, 3, 7, UNI_SC__SINH } /* sc=sinhala */, - { 1, 661, 1670, 2, 9, UNI_DOMINO } /* dominotiles */, - { 12, 2365, 6142, 6, 5, UNI_ETHIOPICSUP } /* ethiopicsup */, - { 2, 296, 6222, 3, 9, UNI_NV__3_SLASH_80 } /* nv=3.750e-02 */, - { 66, 1879, 661, 4, 5, UNI_INDOGRA } /* blk=dogra */, - { 2, 2, 278, 3, 1, UNI_cwl_values_index } /* cwl= */, - { 2, 3474, 1033, 6, 8, UNI_JAMOEXTB } /* block=jamoextb */, - { 0, 2692, 6142, 8, 12, UNI_ARABICSUP } /* blk=arabicsupplement */, - { 92, 7201, 647, 15, 2, UNI_L } /* generalcategory=l */, - { 2, 8007, 4341, 30, 4, UNI_CJKEXTA } /* blk=cjkunifiedideographsextensiona */, - { 2, 90, 92, 2, 2, UNI_GREK } /* grek */, - { 939, 275, 0, 4, 0, UNI_gcb_values_index } /* gcb= */, - { 2, 1102, 2018, 4, 12, UNI_GONM } /* scx=masaramgondi */, - { 0, 3474, 6462, 6, 24, UNI_HIGHPUSURROGATES } /* block=highprivateusesurrogates */, - { 12, 1410, 1303, 7, 2, UNI_CCC__32 } /* ccc=ccc32 */, - { 3, 555, 566, 4, 3, UNI_AGE__8 } /* age=8.0 */, - { 3, 875, 602, 5, 2, -UNI_UIDEO } /* uideo=n */, - { 16, 1424, 340, 7, 3, UNI_CHRS } /* chorasmian */, - { 0, 1102, 818, 4, 7, UNI_SHRD } /* scx=sharada */, - { 9, 1796, 236, 7, 4, UNI_SC__YI } /* script=yiii */, - { 0, 6039, 7556, 7, 28, UNI_MISCARROWS } /* block=miscellaneoussymbolsandarrows */, - { 2161, 1879, 5322, 4, 11, UNI_CHEROKEESUP } /* blk=cherokeesup */, - { 0, 75, 356, 3, 4, UNI_CWU } /* cwu=yes */, - { 0, 3351, 6198, 13, 8, UNI_NV__10000000 } /* numericvalue=10000000 */, - { 29, 1796, 5139, 6, 8, UNI_SC__MYMR } /* script=myanmar */, - { 17, 8, 2332, 1, 12, UNI_GREEKEXT } /* greekextended */, - { 405, 275, 285, 4, 2, UNI_GCB__XX } /* gcb=xx */, - { 1, 2, 8150, 1, 32, UNI_DIACRITICALSEXT } /* combiningdiacriticalmarksextended */, - { 360, 313, 3637, 2, 7, UNI_LISUSUP } /* inlisusup */, - { 4, 4776, 0, 17, 0, UNI__PERL_PATWS } /* patternwhitespace */, - { 2, 464, 3608, 2, 11, UNI_PHONETICEXT } /* isphoneticext */, - { 0, 4996, 4190, 13, 4, UNI_JG__MANICHAEANYODH } /* jg=manichaeanyodh */, - { 0, 1796, 1133, 7, 8, UNI_VITH } /* script=vithkuqi */, - { 145, 33, 8213, 2, 31, UNI_MISCMATHSYMBOLSB } /* miscellaneousmathematicalsymbolsb */, - { 0, 4291, 880, 10, 7, UNI_LB__XX } /* linebreak=unknown */, - { 0, 4355, 457, 17, 4, UNI_PRTI } /* scriptextensions=prti */, - { 0, 1796, 3309, 7, 15, UNI_MERC } /* script=meroiticcursive */, - { 39, 5806, 0, 9, 0, UNI_MONG } /* mongolian */, - { 0, 1879, 2746, 4, 14, UNI_HIGHSURROGATES } /* blk=highsurrogates */, - { 16, 3090, 3599, 11, 9, UNI_GEORGIANEXT } /* blk=georgianextended */, - { 171, 3474, 1451, 6, 10, UNI_INDIVESAKURU } /* block=divesakuru */, - { 8, 464, 6466, 2, 10, UNI_CO } /* isprivateuse */, - { 1304, 1796, 1241, 7, 4, UNI_SC__PHAG } /* script=phag */, - { 0, 4355, 1317, 17, 9, UNI_PERM } /* scriptextensions=oldpermic */, - { 0, 2365, 0, 8, 0, UNI_ETHI } /* ethiopic */, - { 1, 464, 4418, 2, 6, UNI_ZYYY } /* iscommon */, - { 0, 37, 4641, 1, 15, UNI_SYRIACSUP } /* syriacsupplement */, - { 0, 4433, 5797, 9, 9, UNI_LATINEXTA } /* blk=latinextendeda */, - { 1068, 4322, 6199, 14, 5, UNI_NV__300000 } /* numericvalue=300000 */, - { 1, 6379, 1893, 13, 3, UNI_JG__TAH } /* joininggroup=tah */, - { 113, 2961, 287, 12, 2, UNI_NT__NU } /* numerictype=nu */, - { 1, 2274, 356, 4, 4, UNI_XIDC } /* xidc=yes */, - { 0, 4291, 7473, 10, 10, UNI_LB__AL } /* linebreak=alphabetic */, - { 0, 1102, 5907, 4, 4, UNI_SINH } /* scx=sinh */, - { 530, 1796, 71, 7, 4, UNI_SC__CPRT } /* script=cprt */, - { 1, 1410, 394, 7, 2, UNI_CCC__34 } /* ccc=ccc34 */, - { 6, 1867, 278, 12, 1, UNI_bidim_values_index } /* bidimirrored= */, - { 0, 14, 2030, 1, 11, UNI_MATHALPHANUM } /* mathalphanum */, - { 1, 464, 6833, 2, 23, UNI_BYZANTINEMUSIC } /* isbyzantinemusicalsymbols */, - { 1, 875, 588, 5, 2, UNI_UIDEO } /* uideo=t */, - { 0, 3137, 3083, 15, 7, UNI_EA__N } /* eastasianwidth=neutral */, - { 32, 1102, 2695, 3, 5, UNI_ARAB } /* scx=arab */, - { 147, 3593, 4629, 6, 2, UNI_LATIN1 } /* inlatin1 */, - { 1, 4355, 1755, 17, 11, UNI_MEDF } /* scriptextensions=medefaidrin */, - { 0, 1102, 3933, 4, 4, UNI_MODI } /* scx=modi */, - { 1, 1065, 766, 4, 2, UNI_NV__1_SLASH_6 } /* nv=1/6 */, - { 17, 1991, 48, 12, 1, UNI_JT__U } /* joiningtype=u */, - { 25, 1879, 6728, 4, 11, UNI_INMEETEIMAYEK } /* blk=meeteimayek */, - { 3, 429, 0, 3, 0, UNI_MRO } /* mro */, - { 0, 313, 6134, 2, 20, UNI_GLAGOLITICSUP } /* inglagoliticsupplement */, - { 1, 6114, 666, 3, 5, UNI_SC__LIMB } /* sc=limbu */, - { 133, 3915, 356, 17, 2, UNI_EPRES } /* emojipresentation=y */, - { 0, 1879, 5907, 4, 7, UNI_INSINHALA } /* blk=sinhala */, - { 1056, 1879, 4092, 4, 15, UNI_DIACRITICALSEXT } /* blk=diacriticalsext */, - { 0, 313, 7171, 2, 3, UNI_IN__12 } /* in=12 */, - { 0, 3474, 8110, 12, 29, UNI_ARABICMATH } /* block=arabicmathematicalalphabeticsymbols */, - { 0, 3974, 356, 17, 4, UNI_IDSB } /* idsbinaryoperator=yes */, - { 8, 1977, 4081, 5, 5, UNI_POSIXPUNCT } /* posixpunct */, - { 1, 1102, 4857, 4, 5, UNI_TAML } /* scx=tamil */, - { 5, 1879, 5214, 4, 9, UNI_HALFMARKS } /* blk=halfmarks */, - { 3134, 6114, 2812, 3, 4, UNI_SC__MAHJ } /* sc=mahj */, - { 8, 2260, 566, 3, 3, UNI_IN__8 } /* in=8.0 */, - { 0, 6039, 5797, 13, 9, UNI_MYANMAREXTA } /* block=myanmarextendeda */, - { 3, 6114, 4671, 3, 4, UNI_SC__TALE } /* sc=tale */, - { 201, 6303, 0, 23, 0, UNI_COMPATJAMO } /* hangulcompatibilityjamo */, - { 0, 4467, 0, 18, 0, UNI_COPTICEPACTNUMBERS } /* copticepactnumbers */, - { 0, 2253, 2616, 10, 3, UNI_IN__5 } /* presentin=5.0 */, - { 0, 261, 278, 4, 1, UNI_cwcm_values_index } /* cwcm= */, - { 67, 7201, 12, 16, 1, UNI_P } /* generalcategory=p */, - { 21, 464, 4582, 2, 16, UNI_BOPOMOFOEXT } /* isbopomofoextended */, - { 2, 8182, 8440, 30, 14, UNI_INPC__TOPANDBOTTOMANDRIGHT } /* indicpositionalcategory=topandbottomandright */, - { 1, 464, 168, 2, 4, UNI_COPT } /* isqaac */, - { 1, 1102, 4882, 4, 4, UNI_EGYP } /* scx=egyp */, - { 1, 7208, 4500, 9, 15, UNI_UPPERCASELETTER } /* category=uppercaseletter */, - { 2179, 1102, 4436, 3, 6, UNI_LATN } /* scx=latin */, - { 1, 1702, 6142, 6, 12, UNI_ARABICSUP } /* isarabicsupplement */, - { 0, 6114, 180, 3, 4, UNI_RUNR } /* sc=runr */, - { 32, 464, 1382, 2, 4, UNI_XIDS } /* isxids */, - { 1954, 5825, 0, 4, 0, UNI_SUND } /* sund */, - { 76, 513, 523, 4, 1, UNI_NV__37 } /* nv=37 */, - { 2123, 14, 2603, 1, 12, UNI_MISCTECHNICAL } /* misctechnical */, - { 0, 7584, 1178, 19, 5, UNI_DT__NAR } /* decompositiontype=narrow */, - { 2, 644, 3961, 4, 13, UNI_HST__NA } /* hst=notapplicable */, - { 0, 7473, 934, 10, 6, -UNI_XPOSIXALPHA } /* alphabetic=false */, - { 1, 7201, 110, 16, 1, UNI_Z } /* generalcategory=z */, - { 0, 1879, 3498, 4, 16, UNI_CYPRIOTSYLLABARY } /* blk=cypriotsyllabary */, - { 0, 1102, 51, 4, 4, UNI_CAKM } /* scx=cakm */, - { 95, 12, 588, 3, 2, UNI_PCM } /* pcm=t */, - { 2416, 3474, 1144, 6, 9, UNI_INBHAIKSUKI } /* block=bhaiksuki */, - { 0, 1879, 3671, 3, 10, UNI_INMALAYALAM } /* blk=malayalam */, - { 3, 343, 8580, 4, 10, UNI_CCC__AR } /* ccc=aboveright */, - { 1427, 313, 8592, 2, 42, UNI_UCASEXT } /* inunifiedcanadianaboriginalsyllabicsextended */, - { 2, 464, 1009, 2, 4, UNI_LYCI } /* islyci */, - { 106, 14, 8307, 1, 33, UNI_MISCPICTOGRAPHS } /* miscellaneoussymbolsandpictographs */, - { 2791, 313, 1755, 2, 11, UNI_INMEDEFAIDRIN } /* inmedefaidrin */, - { 6, 464, 461, 2, 4, UNI_QAAI } /* isqaai */, - { 46617, 895, 771, 6, 2, UNI_AGE__12_DOT_1 } /* age=v121 */, - { 0, 3351, 6207, 14, 8, UNI_NV__1_SLASH_40 } /* numericvalue=2.500e-02 */, - { 3, 2392, 402, 3, 3, UNI_INMIAO } /* inmiao */, - { 42, 1395, 4629, 4, 2, UNI_LATIN1 } /* latin1 */, - { 1, 3991, 2626, 8, 7, UNI_BRAI } /* braillepatterns */, - { 0, 34, 7499, 1, 28, UNI_ANCIENTGREEKMUSIC } /* isancientgreekmusicalnotation */, - { 2053, 524, 356, 6, 2, UNI_PATSYN } /* patsyn=y */, - { 0, 5886, 588, 21, 5, UNI__PERL_NCHAR } /* noncharactercodepoint=true */, - { 0, 2802, 1183, 3, 8, UNI_EMOTICONS } /* isemoticons */, - { 624, 2, 601, 2, 4, -UNI_CWT } /* cwt=no */, - { 2, 7527, 2915, 3, 11, UNI_LB__EX } /* lb=exclamation */, - { 0, 5099, 3035, 6, 9, UNI__PERL_ANY_FOLDS } /* _perl_any_folds */, - { 17, 2496, 2526, 3, 3, UNI_JG__HEH } /* jg=heh */, - { 65, 2474, 8552, 3, 20, UNI_MATHOPERATORS } /* ismathematicaloperators */, - { 0, 2496, 4166, 3, 4, UNI_JG__BETH } /* jg=beth */, - { 2157, 7208, 5174, 13, 12, UNI_PO } /* category=otherpunctuation */, - { 2019, 2926, 4641, 3, 15, UNI_SYRIACSUP } /* insyriacsupplement */, - { 11, 6114, 880, 3, 7, UNI_ZZZZ } /* sc=unknown */, - { 1, 7182, 1491, 3, 4, UNI_CJKEXTA } /* cjkexta */, - { 0, 1879, 637, 4, 7, UNI_INHANUNOO } /* blk=hanunoo */, - { 1, 2474, 743, 3, 6, UNI_MAND } /* ismandaic */, - { 19, 1227, 0, 7, 0, UNI_MULT } /* multani */, - { 0, 464, 6728, 2, 14, UNI_MEETEIMAYEKEXT } /* ismeeteimayekext */, - { 0, 7377, 0, 8, 0, UNI_KANA } /* katakana */, - { 4, 2981, 771, 5, 2, UNI_IN__12_DOT_1 } /* in=v121 */, - { 0, 58, 2695, 2, 7, UNI_SC__ARAB } /* sc=arabic */, - { 0, 328, 5080, 3, 7, UNI_SUPARROWSA } /* suparrowsa */, - { 2337, 37, 1110, 1, 7, UNI_SPECIALS } /* specials */, - { 2, 4355, 148, 17, 4, UNI_ORYA } /* scriptextensions=orya */, - { 0, 7208, 12, 9, 1, UNI_P } /* category=p */, - { 0, 1102, 5806, 4, 9, UNI_MONG } /* scx=mongolian */, - { 1026, 1236, 6029, 2, 10, UNI_INGEORGIAN } /* blk=georgian */, - { 20, 313, 8592, 2, 43, UNI_UCASEXTA } /* inunifiedcanadianaboriginalsyllabicsextendeda */, - { 4, 1102, 1308, 4, 9, UNI_ITAL } /* scx=olditalic */, - { 16, 6114, 4020, 3, 4, UNI_SC__SIND } /* sc=sind */, - { 8, 313, 6728, 2, 21, UNI_MEETEIMAYEKEXT } /* inmeeteimayekextensions */, - { 14, 8, 1412, 1, 3, UNI_C } /* gc=c */, - { 0, 4450, 6528, 7, 21, UNI_INDICNUMBERFORMS } /* block=commonindicnumberforms */, - { 0, 1879, 6970, 4, 26, UNI_HALFANDFULLFORMS } /* blk=halfwidthandfullwidthforms */, - { 32, 1796, 461, 7, 4, UNI_SC__QAAI } /* script=qaai */, - { 0, 991, 0, 6, 0, UNI_HATR } /* hatran */, - { 0, 1879, 983, 4, 8, UNI_INHIRAGANA } /* blk=hiragana */, - { 0, 2463, 602, 5, 2, -UNI_JOINC } /* joinc=n */, - { 1144, 316, 602, 5, 2, -UNI_QMARK } /* qmark=n */, - { 386, 7605, 3961, 19, 13, UNI_HST__NA } /* hangulsyllabletype=notapplicable */, - { 1, 15, 0, 4, 0, UNI_ADLM } /* adlm */, - { 9, 4355, 337, 17, 6, UNI_CARI } /* scriptextensions=carian */, - { 256, 2274, 0, 11, 0, UNI_XIDC } /* xidcontinue */, - { 0, 2496, 24, 3, 2, UNI_JG__HE } /* jg=he */, - { 0, 7182, 5, 3, 4, UNI_CJKEXTG } /* cjkextg */, - { 0, 4291, 13, 10, 2, UNI_LB__CM } /* linebreak=cm */, - { 8, 14, 6053, 1, 12, UNI_MATHOPERATORS } /* mathoperators */, - { 0, 4355, 7377, 17, 8, UNI_KANA } /* scriptextensions=katakana */, - { 0, 3474, 1542, 6, 6, UNI_ARROWS } /* block=arrows */, - { 0, 4996, 4978, 13, 6, UNI_JG__MANICHAEANDALETH } /* jg=manichaeandaleth */, - { 0, 4291, 2926, 10, 11, UNI_LB__IN } /* linebreak=inseparable */, - { 277, 1362, 0, 9, 0, UNI_SAMR } /* samaritan */, - { 1, 7201, 2986, 16, 2, UNI_PS } /* generalcategory=ps */, - { 20, 887, 292, 5, 1, UNI_AGE__13 } /* age=13 */, - { 1158, 6629, 0, 15, 0, UNI_MODIFIERLETTERS } /* modifierletters */, - { 0, 4662, 8319, 12, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* supplementalsymbolsandpictographs */, - { 0, 4291, 527, 10, 2, UNI_LB__SY } /* linebreak=sy */, - { 1570, 4355, 188, 17, 4, UNI_SGNW } /* scriptextensions=sgnw */, - { 640, 1441, 934, 3, 2, -UNI_DEP } /* dep=f */, - { 19, 5748, 0, 21, 0, UNI_SUPARROWSB } /* insupplementalarrowsb */, - { 0, 1796, 3885, 7, 17, UNI_AGHB } /* script=caucasianalbanian */, - { 1, 6114, 5340, 3, 10, UNI_SC__DEVA } /* sc=devanagari */, - { 0, 1383, 356, 3, 2, UNI_IDS } /* ids=y */, - { 0, 1704, 0, 6, 0, UNI_ARAB } /* arabic */, - { 0, 6944, 1304, 25, 2, UNI_CCC__B } /* canonicalcombiningclass=220 */, - { 0, 983, 0, 8, 0, UNI_HIRA } /* hiragana */, - { 1, 735, 5601, 4, 8, UNI_LB__ID } /* linebreak=id */, - { 129, 8182, 4038, 30, 12, UNI_INPC__TOPANDLEFTANDRIGHT } /* indicpositionalcategory=topandleftandright */, - { 16, 34, 908, 1, 9, UNI_INBALINESE } /* inbalinese */, - { 0, 600, 4533, 3, 7, UNI_DT__INIT } /* dt=initial */, - { 148, 1796, 168, 7, 4, UNI_SC__COPT } /* script=qaac */, - { 21, 4355, 6134, 17, 4, UNI_GLAG } /* scriptextensions=glag */, - { 14, 3794, 1300, 14, 3, UNI_NV__8000 } /* numericvalue=8000 */, - { 0, 14, 7556, 1, 28, UNI_MISCARROWS } /* miscellaneoussymbolsandarrows */, - { 1, 1879, 1234, 4, 7, UNI_NB } /* blk=noblock */, - { 0, 5928, 0, 5, 0, UNI_VO__TR } /* vo=tr */, - { 0, 4355, 417, 17, 3, UNI_HAN } /* scriptextensions=han */, - { 1061, 1102, 5322, 4, 8, UNI_CHER } /* scx=cherokee */, - { 3195, 7201, 2322, 16, 10, UNI_CN } /* generalcategory=unassigned */, - { 0, 1102, 160, 4, 4, UNI_PHLP } /* scx=phlp */, - { 1, 4355, 86, 17, 4, UNI_GONG } /* scriptextensions=gong */, - { 0, 7018, 6142, 6, 5, UNI_ARABICSUP } /* inarabicsup */, - { 1272, 1377, 369, 3, 2, UNI_WB__SQ } /* wb=sq */, - { 3, 1102, 1125, 4, 8, UNI_TFNG } /* scx=tifinagh */, - { 2, 1357, 6286, 4, 17, UNI_JAMOEXTB } /* inhanguljamoextendedb */, - { 11, 1102, 783, 4, 4, UNI_OSMA } /* scx=osma */, - { 0, 1796, 496, 7, 4, UNI_SC__KHOJ } /* script=khoj */, - { 1, 1796, 59, 7, 4, UNI_CHAM } /* script=cham */, - { 1550, 5103, 0, 2, 0, UNI_CASEDLETTER } /* l_ */, - { 0, 1879, 1951, 4, 7, UNI_INSOGDIAN } /* blk=sogdian */, - { 1, 313, 840, 2, 7, UNI_INTAGALOG } /* intagalog */, - { 0, 4291, 153, 10, 2, UNI_LB__SG } /* linebreak=sg */, - { 0, 2033, 1175, 4, 2, UNI_alpha_values_index } /* alpha= */, - { 2, 106, 792, 2, 2, UNI_HMNP } /* hmnp */, - { 0, 1796, 686, 7, 5, UNI_SC__TAKR } /* script=takri */, - { 2132, 261, 602, 4, 2, -UNI_CWCM } /* cwcm=n */, - { 0, 3734, 3477, 12, 3, UNI_nfkcqc_values_index } /* nfkcquickcheck= */, - { 0, 4355, 425, 17, 4, UNI_LINA } /* scriptextensions=lina */, - { 2064, 4021, 4844, 4, 13, UNI_DIACRITICALSSUP } /* indiacriticalssup */, - { 0, 464, 1982, 2, 6, UNI_SYRC } /* issyriac */, - { 3, 4291, 313, 10, 2, UNI_LB__IN } /* linebreak=in */, - { 2074, 4355, 1948, 17, 10, UNI_SOGO } /* scriptextensions=oldsogdian */, - { 1, 5136, 7975, 5, 32, UNI_MISCMATHSYMBOLSA } /* blk=miscellaneousmathematicalsymbolsa */, - { 2, 296, 348, 3, 2, UNI_NV__18 } /* nv=18 */, - { 0, 1879, 5056, 4, 19, UNI_OTTOMANSIYAQNUMBERS } /* blk=ottomansiyaqnumbers */, - { 0, 7208, 1899, 9, 6, UNI_S } /* category=symbol */, - { 0, 6944, 292, 24, 2, UNI_CCC__30 } /* canonicalcombiningclass=30 */, - { 1056, 1102, 691, 4, 5, UNI_BATK } /* scx=batak */, - { 288, 806, 0, 4, 0, UNI_SARB } /* sarb */, - { 0, 275, 647, 3, 4, UNI_LB__H3 } /* gcb=lvt */, - { 0, 6114, 5116, 3, 20, UNI_HLUW } /* sc=anatolianhieroglyphs */, - { 518, 749, 0, 4, 0, UNI_MARC } /* marc */, - { 25, 4996, 4984, 13, 6, UNI_JG__MANICHAEANLAMEDH } /* jg=manichaeanlamedh */, - { 0, 4355, 4582, 17, 8, UNI_BOPO } /* scriptextensions=bopomofo */, - { 0, 270, 0, 3, 0, UNI_CWT } /* cwt */, - { 0, 464, 832, 2, 5, UNI_STERM } /* issterm */, - { 133, 1796, 212, 7, 4, UNI_SC__TGLG } /* script=tglg */, - { 1, 464, 372, 2, 6, UNI_GOTH } /* isgothic */, - { 1, 7825, 5366, 20, 10, UNI_CJKEXTD } /* cjkunifiedideographsextensiond */, - { 1, 2363, 4442, 10, 9, UNI_ETHIOPICEXTB } /* inethiopicextendedb */, - { 257, 464, 12, 2, 3, UNI_PCM } /* ispcm */, - { 8, 6114, 228, 3, 4, UNI_XPEO } /* sc=xpeo */, - { 0, 2454, 0, 6, 0, UNI_GEOR } /* isgeor */, - { 0, 1102, 128, 4, 4, UNI_MEDF } /* scx=medf */, - { 0, 37, 4372, 1, 16, UNI_SMALLFORMS } /* smallformvariants */, - { 1, 464, 120, 2, 4, UNI_LAO } /* islaoo */, - { 0, 2353, 5206, 3, 17, UNI_HALFMARKS } /* incombininghalfmarks */, - { 0, 5284, 0, 20, 0, UNI_PHLI } /* inscriptionalpahlavi */, - { 0, 4322, 6223, 14, 8, UNI_NV__3_SLASH_80 } /* numericvalue=3.750e-02 */, - { 4197, 4450, 1939, 7, 9, UNI_COMPATJAMO } /* block=compatjamo */, - { 32, 34, 1855, 1, 12, UNI_BIDIC } /* isbidicontrol */, - { 14, 6114, 1614, 3, 10, UNI_WARA } /* sc=warangciti */, - { 0, 1796, 94, 7, 4, UNI_SC__GUJR } /* script=gujr */, - { 0, 916, 933, 4, 7, -UNI_EBASE } /* ebase=false */, - { 0, 844, 355, 2, 2, UNI_loe_values_index } /* loe= */, - { 0, 313, 749, 2, 7, UNI_INMARCHEN } /* inmarchen */, - { 2052, 4355, 140, 17, 4, UNI_NARB } /* scriptextensions=narb */, - { 1, 7660, 278, 17, 1, UNI_vs_values_index } /* variationselector= */, - { 4151, 7500, 0, 27, 0, UNI_ANCIENTGREEKMUSIC } /* ancientgreekmusicalnotation */, - { 0, 3367, 349, 14, 1, UNI_NV__48 } /* numericvalue=48 */, - { 0, 1796, 4827, 7, 4, UNI_BAMU } /* script=bamu */, - { 4, 296, 7171, 2, 3, UNI_NV__12 } /* nv=12 */, - { 14, 7431, 2065, 27, 2, UNI_CCC__25 } /* canonicalcombiningclass=ccc25 */, - { 0, 2275, 355, 9, 3, UNI_IDC } /* idcontinue=y */, - { 22, 6039, 1491, 13, 4, UNI_MYANMAREXTA } /* block=myanmarexta */, - { 161, 4355, 1205, 17, 9, UNI_QAAI } /* scriptextensions=inherited */, - { 0, 1102, 1470, 4, 4, UNI_BUGI } /* scx=bugi */, - { 4224, 313, 1887, 2, 8, UNI_UCASEXTA } /* inucasexta */, - { 0, 1539, 5643, 3, 18, UNI_COUNTINGROD } /* iscountingrodnumerals */, - { 0, 2926, 7937, 3, 29, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* insymbolsandpictographsextendeda */, - { 0, 228, 1638, 2, 8, UNI_XPOSIXSPACE } /* xperlspace */, - { 0, 5481, 356, 21, 2, UNI_CWCF } /* changeswhencasefolded=y */, - { 85, 7825, 7314, 26, 4, UNI_CJKEXTB } /* cjkunifiedideographsextensionb */, - { 517, 4598, 0, 16, 0, UNI_PE } /* closepunctuation */, - { 3, 464, 1255, 2, 4, UNI_SOYO } /* issoyo */, - { 2060, 2392, 2813, 3, 11, UNI_MAHJONG } /* inmahjongtiles */, - { 3, 2474, 4567, 3, 15, UNI_MISCMATHSYMBOLSB } /* ismiscmathsymbolsb */, - { 27, 4355, 6134, 17, 10, UNI_GLAG } /* scriptextensions=glagolitic */, - { 90, 4355, 4882, 17, 19, UNI_EGYP } /* scriptextensions=egyptianhieroglyphs */, - { 0, 6114, 98, 3, 4, UNI_SC__GURU } /* sc=guru */, - { 0, 4092, 345, 8, 2, UNI_dia_values_index } /* diacritic= */, - { 4, 2726, 1860, 3, 7, UNI_XPOSIXCNTRL } /* gc=control */, - { 0, 2260, 392, 3, 3, UNI_IN__6_DOT_3 } /* in=6.3 */, - { 5, 1796, 1948, 7, 10, UNI_SOGO } /* script=oldsogdian */, - { 3595, 4355, 1826, 17, 4, UNI_SYLO } /* scriptextensions=sylo */, - { 1, 3974, 934, 4, 2, -UNI_IDSB } /* idsb=f */, - { 0, 6803, 588, 20, 5, UNI_CE } /* compositionexclusion=true */, - { 1025, 4996, 4638, 15, 4, UNI_JG__MANICHAEANTWENTY } /* jg=manichaeantwenty */, - { 86, 6402, 595, 14, 2, UNI_SB__SE } /* sentencebreak=se */, - { 65, 940, 356, 6, 4, UNI_COMPEX } /* compex=yes */, - { 923, 6416, 0, 23, 0, UNI_SHORTHANDFORMATCONTROLS } /* shorthandformatcontrols */, - { 0, 2443, 588, 5, 2, UNI_CASED } /* cased=t */, - { 0, 464, 337, 2, 4, UNI_CARI } /* iscari */, - { 1794, 366, 0, 2, 0, UNI_SM } /* sm */, - { 0, 3450, 8150, 5, 32, UNI_DIACRITICALSEXT } /* blk=combiningdiacriticalmarksextended */, - { 0, 1879, 5846, 4, 19, UNI_SUPARROWSC } /* blk=supplementalarrowsc */, - { 528, 464, 5806, 2, 12, UNI_MONGOLIANSUP } /* ismongoliansup */, - { 0, 2275, 933, 9, 7, -UNI_IDC } /* idcontinue=false */, - { 0, 464, 5322, 2, 11, UNI_CHEROKEESUP } /* ischerokeesup */, - { 163, 1967, 588, 7, 5, UNI_RADICAL } /* radical=true */, - { 7, 7688, 603, 22, 4, UNI_JG__MANICHAEANONE } /* joininggroup=manichaeanone */, - { 5, 2625, 1104, 12, 2, UNI_patsyn_values_index } /* patternsyntax= */, - { 0, 6114, 1241, 3, 4, UNI_SC__PHAG } /* sc=phag */, - { 1, 296, 2262, 2, 3, UNI_NV__14 } /* nv=14 */, - { 5, 876, 588, 4, 5, UNI_IDEO } /* ideo=true */, - { 3, 24, 1104, 2, 2, UNI_hex_values_index } /* hex= */, - { 0, 7823, 5366, 22, 10, UNI_CJKEXTD } /* incjkunifiedideographsextensiond */, - { 138, 4355, 1529, 17, 4, UNI_KHAR } /* scriptextensions=khar */, - { 0, 5136, 1491, 11, 4, UNI_MYANMAREXTA } /* blk=myanmarexta */, - { 0, 3474, 2665, 7, 13, UNI_ANCIENTSYMBOLS } /* block=ancientsymbols */, - { 11, 7880, 6309, 5, 13, UNI_CJKCOMPAT } /* iscjkcompatibility */, - { 0, 2981, 395, 4, 2, UNI_IN__4_DOT_1 } /* in=v41 */, - { 0, 1102, 5116, 4, 20, UNI_HLUW } /* scx=anatolianhieroglyphs */, - { 0, 1377, 546, 3, 2, UNI_WB__EB } /* wb=eb */, - { 0, 3763, 0, 14, 0, UNI_NV__5 } /* numericvalue=5 */, - { 65, 5565, 934, 21, 6, -UNI_CWU } /* changeswhenuppercased=false */, - { 1, 5718, 934, 4, 6, -UNI_EMOD } /* emod=false */, - { 2312, 464, 3053, 2, 13, UNI_POSIXXDIGIT } /* isasciihexdigit */, - { 2, 464, 4842, 2, 15, UNI_DIACRITICALSSUP } /* isdiacriticalssup */, - { 3131, 4355, 502, 17, 4, UNI_LYDI } /* scriptextensions=lydi */, - { 1, 3474, 7660, 6, 18, UNI_INVS } /* block=variationselectors */, - { 0, 1102, 4671, 4, 4, UNI_TALE } /* scx=tale */, - { 0, 4355, 3309, 17, 15, UNI_MERC } /* scriptextensions=meroiticcursive */, - { 1, 2496, 1526, 3, 3, UNI_JG__YEH } /* jg=yeh */, - { 1, 823, 3150, 3, 2, UNI_dash_values_index } /* dash= */, - { 0, 612, 5021, 2, 17, UNI_LB__CP } /* lb=closeparenthesis */, - { 0, 1879, 3527, 4, 16, UNI_HALFANDFULLFORMS } /* blk=halfandfullforms */, - { 1605, 1102, 1117, 4, 4, UNI_TAGB } /* scx=tagb */, - { 0, 8533, 1808, 7, 10, UNI_INSORASOMPENG } /* block=sorasompeng */, - { 521, 464, 220, 2, 4, UNI_TOTO } /* istoto */, - { 0, 1102, 1241, 4, 7, UNI_PHAG } /* scx=phagspa */, - { 3592, 1377, 3024, 3, 11, UNI_WB__SQ } /* wb=singlequote */, - { 2091, 3367, 294, 14, 1, UNI_NV__44 } /* numericvalue=44 */, - { 0, 464, 4882, 2, 4, UNI_EGYP } /* isegyp */, - { 32, 58, 0, 2, 0, UNI_SC } /* sc */, - { 0, 611, 0, 4, 0, UNI_ELBA } /* elba */, - { 0, 464, 917, 2, 8, UNI_BASS } /* isbassavah */, - { 0, 2496, 1982, 3, 9, UNI_JG__SYRIACWAW } /* jg=syriacwaw */, - { 6, 3669, 664, 12, 2, UNI_JG__MALAYALAMRA } /* jg=malayalamra */, - { 1, 313, 1033, 2, 8, UNI_JAMOEXTB } /* injamoextb */, - { 2049, 7823, 7314, 28, 4, UNI_CJKEXTB } /* incjkunifiedideographsextensionb */, - { 1606, 4901, 0, 13, 0, UNI_EMOD } /* emojimodifier */, - { 0, 2726, 4081, 3, 5, UNI_P } /* gc=punct */, - { 4, 1879, 8592, 4, 43, UNI_UCASEXTA } /* blk=unifiedcanadianaboriginalsyllabicsextendeda */, - { 17, 2392, 7556, 3, 28, UNI_MISCARROWS } /* inmiscellaneoussymbolsandarrows */, - { 0, 120, 122, 2, 2, UNI_LAO } /* laoo */, - { 10, 12, 165, 1, 3, UNI_PHNX } /* phnx */, - { 0, 600, 366, 3, 3, UNI_DT__SML } /* dt=sml */, - { 2, 1065, 763, 4, 3, UNI_NV__11_SLASH_2 } /* nv=11/2 */, - { 4, 4355, 2695, 16, 7, UNI_ARAB } /* scriptextensions=arabic */, - { 5, 2802, 7733, 3, 21, UNI_ENCLOSEDIDEOGRAPHICSUP } /* isenclosedideographicsup */, - { 24, 536, 1581, 3, 7, UNI_SB__LE } /* sb=oletter */, - { 2069, 6114, 3188, 3, 15, UNI_ARMI } /* sc=imperialaramaic */, - { 0, 4122, 934, 5, 2, -UNI_XPOSIXLOWER } /* lower=f */, - { 33, 7208, 252, 9, 5, UNI_XPOSIXCNTRL } /* category=cntrl */, - { 0, 4882, 0, 19, 0, UNI_EGYP } /* egyptianhieroglyphs */, - { 56, 1879, 2428, 4, 6, UNI_IPAEXT } /* blk=ipaext */, - { 0, 34, 1667, 1, 7, UNI_DOMINO } /* indomino */, - { 20, 6944, 7342, 18, 11, UNI_CCC__R } /* canonicalcombiningclass=right */, - { 274, 464, 1311, 2, 4, UNI_ITAL } /* isital */, - { 0, 7584, 55, 18, 3, UNI_DT__CAN } /* decompositiontype=can */, - { 13, 3593, 5584, 13, 3, UNI_LATINEXTG } /* inlatinextendedg */, - { 1, 4291, 4598, 10, 16, UNI_LB__CL } /* linebreak=closepunctuation */, - { 4, 1236, 6414, 2, 25, UNI_SHORTHANDFORMATCONTROLS } /* blk=shorthandformatcontrols */, - { 0, 4582, 0, 11, 0, UNI_BOPOMOFOEXT } /* bopomofoext */, - { 2, 1796, 63, 7, 4, UNI_CHRS } /* script=chrs */, - { 4096, 34, 938, 1, 6, UNI_ECOMP } /* isecomp */, - { 1, 1102, 216, 4, 4, UNI_TIBT } /* scx=tibt */, - { 0, 5147, 0, 15, 0, UNI_LATINEXTE } /* block=latinexte */, - { 1, 6644, 0, 15, 0, UNI_TRANSPORTANDMAP } /* transportandmap */, - { 0, 1796, 116, 7, 4, UNI_SC__KNDA } /* script=knda */, - { 0, 1710, 0, 3, 0, UNI_S } /* iss */, + { 16, 2324, 474, 6, 3, UNI_INVAI } /* block=vai */, + { 36, 2324, 648, 6, 5, UNI_INADLAM } /* block=adlam */, + { 2, 1883, 0, 5, 0, UNI_BIDIC } /* bidic */, + { 16, 1667, 537, 4, 6, UNI_INTANGSA } /* blk=tangsa */, + { 3, 309, 5857, 2, 9, UNI_INMONGOLIAN } /* inmongolian */, + { 14, 4424, 1090, 17, 4, UNI_LINB } /* scriptextensions=linb */, + { 29, 6165, 1191, 3, 7, UNI_SC__BENG } /* sc=bengali */, + { 1, 208, 0, 4, 0, UNI_TGLG } /* tglg */, + { 12, 2324, 4161, 6, 15, UNI_DIACRITICALSEXT } /* block=diacriticalsext */, + { 1, 8343, 3289, 31, 5, UNI_INSC__CONSONANTFINAL } /* indicsyllabiccategory=consonantfinal */, + { 0, 7449, 0, 18, 0, UNI_PHONETICEXT } /* phoneticextensions */, + { 0, 6163, 3253, 5, 10, UNI_INSC__PUREKILLER } /* insc=purekiller */, + { 0, 10, 8039, 1, 32, UNI_MISCMATHSYMBOLSA } /* miscellaneousmathematicalsymbolsa */, + { 0, 2324, 430, 6, 3, UNI_INNKO } /* block=nko */, + { 3, 5156, 652, 10, 2, UNI_WB__MB } /* wordbreak=mb */, + { 3, 1823, 1325, 7, 4, UNI_ITAL } /* script=ital */, + { 3, 461, 199, 2, 2, UNI_TITLE } /* islt */, + { 1, 19, 353, 4, 4, UNI_POSIXXDIGIT } /* ahex=yes */, + { 0, 2505, 8568, 4, 33, UNI_DIACRITICALSSUP } /* incombiningdiacriticalmarkssupplement */, + { 5, 3021, 891, 5, 2, UNI_IN__11 } /* in=v110 */, + { 0, 2930, 12, 3, 1, UNI_JT__D } /* jt=d */, + { 3, 309, 7467, 2, 28, UNI_SUPPUAA } /* insupplementaryprivateuseareaa */, + { 32, 3021, 1313, 4, 2, UNI_IN__6 } /* in=v60 */, + { 2, 2360, 2367, 7, 3, UNI_CN } /* unassigned */, + { 0, 5838, 0, 19, 0, UNI_JAMOEXTA } /* hanguljamoextendeda */, + { 3, 2752, 2931, 13, 3, UNI_ECOMP } /* emojicomponent=t */, + { 0, 461, 663, 2, 4, UNI_LIMB } /* islimb */, + { 1, 2401, 5848, 10, 9, UNI_ETHIOPICEXTA } /* inethiopicextendeda */, + { 2, 3817, 0, 14, 0, UNI_NV__1 } /* numericvalue=1 */, + { 15, 309, 1322, 2, 9, UNI_INOLDITALIC } /* inolditalic */, + { 1, 2769, 0, 5, 0, UNI_C } /* other */, + { 1, 10, 1235, 1, 6, UNI_MULT } /* multani */, + { 1, 2324, 4911, 6, 15, UNI_DIACRITICALSSUP } /* block=diacriticalssup */, + { 6, 1102, 732, 4, 7, UNI_LINA } /* scx=lineara */, + { 0, 1133, 0, 8, 0, UNI_VITH } /* vithkuqi */, + { 4, 7011, 2029, 23, 3, UNI_CCC__BR } /* canonicalcombiningclass=br */, + { 1, 309, 6514, 2, 10, UNI_PUA } /* inprivateuse */, + { 0, 6597, 0, 4, 0, UNI_CE } /* isce */, + { 2, 461, 782, 2, 3, UNI_ANY } /* isany */, + { 2, 461, 3692, 2, 14, UNI_LISUSUP } /* islisusupplement */, + { 0, 1102, 283, 4, 5, UNI_NSHU } /* scx=nushu */, + { 0, 461, 7796, 2, 22, UNI_ENCLOSEDIDEOGRAPHICSUP } /* isenclosedideographicsup */, + { 6, 6165, 861, 3, 7, UNI_TIBT } /* sc=tibetan */, + { 16, 1102, 232, 4, 4, UNI_YI } /* scx=yiii */, + { 0, 3514, 3790, 11, 5, UNI_ARABICMATH } /* block=arabicmath */, + { 0, 261, 585, 5, 2, UNI_CWKCF } /* cwkcf=t */, + { 0, 5637, 7134, 21, 7, UNI_GCB__PP } /* graphemeclusterbreak=prepend */, + { 1, 2536, 487, 3, 3, UNI_JG__REH } /* jg=reh */, + { 1, 283, 0, 5, 0, UNI_NSHU } /* nushu */, + { 1, 32, 323, 1, 4, UNI_VSSUP } /* vssup */, + { 1, 1065, 295, 5, 1, UNI_NV__1_SLASH_9 } /* nv=1/9 */, + { 0, 5658, 1396, 18, 3, UNI_IDENTIFIERTYPE__NOTXID } /* identifiertype=notxid */, + { 0, 6236, 0, 19, 0, UNI_NV__100000 } /* numericvalue=100000 */, + { 0, 7267, 3276, 16, 13, UNI_ME } /* generalcategory=enclosingmark */, + { 0, 833, 585, 4, 2, UNI_TERM } /* term=t */, + { 0, 7648, 140, 18, 3, UNI_DT__NAR } /* decompositiontype=nar */, + { 0, 4651, 0, 4, 0, UNI_BOPO } /* bopo */, + { 1, 317, 857, 3, 4, UNI_TAVT } /* taiviet */, + { 1, 2766, 99, 3, 2, UNI_UPPERCASELETTER } /* gc=lu */, + { 0, 309, 5068, 2, 10, UNI_INMANICHAEAN } /* inmanichaean */, + { 8, 2718, 1715, 14, 7, UNI_BC__RLI } /* bc=righttoleftisolate */, + { 32, 461, 1635, 2, 10, UNI_WARA } /* iswarangciti */, + { 1, 5939, 0, 5, 0, UNI__PERL_NCHAR } /* nchar */, + { 5, 505, 599, 5, 2, UNI_DT__CAN } /* nfdqc=n */, + { 0, 2324, 663, 6, 5, UNI_INLIMBU } /* block=limbu */, + { 0, 3093, 934, 13, 6, -UNI_POSIXXDIGIT } /* asciihexdigit=false */, + { 0, 54, 3505, 2, 5, UNI_ETHI } /* sc=ethi */, + { 0, 1667, 861, 4, 7, UNI_INTIBETAN } /* blk=tibetan */, + { 4, 20, 0, 3, 0, UNI_XPOSIXXDIGIT } /* hex */, + { 4, 6165, 794, 3, 4, UNI_LANA } /* sc=lana */, + { 0, 1421, 2370, 3, 7, UNI_GREEKEXT } /* ingreekext */, + { 3, 1397, 934, 3, 6, -UNI_IDS } /* ids=false */, + { 0, 4424, 5031, 17, 4, UNI_HAN } /* scriptextensions=hani */, + { 2, 309, 1144, 2, 9, UNI_INBHAIKSUKI } /* inbhaiksuki */, + { 5, 339, 559, 5, 2, UNI_CCC__107 } /* ccc=107 */, + { 1, 6090, 2422, 7, 10, UNI_MISCSYMBOLS } /* block=miscsymbols */, + { 0, 4191, 5671, 8, 4, -UNI_XPOSIXLOWER } /* lowercase=no */, + { 0, 86, 0, 4, 0, UNI_GREK } /* grek */, + { 17, 925, 5090, 3, 6, UNI_BPT__C } /* bpt=close */, + { 1, 7669, 897, 17, 3, UNI_GCB__V } /* hangulsyllabletype=v */, + { 0, 1454, 599, 2, 2, -UNI_SD } /* sd=n */, + { 6, 461, 2411, 2, 11, UNI_KATAKANAEXT } /* iskatakanaext */, + { 50, 6165, 160, 3, 4, UNI_SC__PHLP } /* sc=phlp */, + { 0, 20, 599, 3, 2, -UNI_XPOSIXXDIGIT } /* hex=n */, + { 0, 7267, 3263, 16, 13, UNI_XPOSIXDIGIT } /* generalcategory=decimalnumber */, + { 0, 3204, 353, 14, 2, UNI_GREXT } /* graphemeextend=y */, + { 4, 939, 934, 5, 6, -UNI_ECOMP } /* ecomp=false */, + { 49, 4951, 0, 19, 0, UNI_EGYP } /* egyptianhieroglyphs */, + { 11, 2514, 7825, 3, 30, UNI_MATHALPHANUM } /* ismathematicalalphanumericsymbols */, + { 1, 6165, 1367, 3, 9, UNI_PAUC } /* sc=paucinhau */, + { 4, 3677, 81, 9, 2, UNI_LATINEXTG } /* islatinextg */, + { 5, 1174, 3, 3, 1, UNI_EA__W } /* ea=w */, + { 2, 3863, 1805, 14, 4, UNI_NV__80000 } /* numericvalue=80000 */, + { 1, 5616, 934, 21, 6, -UNI_CWU } /* changeswhenuppercased=false */, + { 5, 1864, 0, 5, 0, UNI_EBASE } /* ebase */, + { 3, 7944, 5252, 28, 4, UNI_CJKEXTE } /* iscjkunifiedideographsextensione */, + { 1, 5616, 274, 21, 1, UNI_cwu_values_index } /* changeswhenuppercased= */, + { 8, 461, 683, 2, 4, UNI_TAKR } /* istakr */, + { 1, 4424, 2411, 17, 8, UNI_KANA } /* scriptextensions=katakana */, + { 5, 4360, 0, 12, 0, UNI_LB__ZW } /* linebreak=zw */, + { 1, 1667, 4725, 4, 9, UNI_TANGUTSUP } /* blk=tangutsup */, + { 131, 6165, 739, 3, 4, UNI_SC__MAND } /* sc=mand */, + { 18, 4424, 1015, 17, 4, UNI_TELU } /* scriptextensions=telu */, + { 38, 339, 18, 4, 1, UNI_CCC__B } /* ccc=b */, + { 1, 7084, 5848, 8, 9, UNI_ARABICEXTA } /* inarabicextendeda */, + { 0, 7011, 346, 24, 2, UNI_CCC__84 } /* canonicalcombiningclass=84 */, + { 3, 461, 2302, 2, 3, UNI_IDC } /* isidc */, + { 0, 1823, 6777, 8, 10, UNI_MTEI } /* script=meeteimayek */, + { 13, 1102, 410, 4, 4, UNI_GONM } /* scx=gonm */, + { 0, 2811, 2815, 4, 8, UNI_KHMERSYMBOLS } /* khmersymbols */, + { 5, 6450, 54, 14, 2, UNI_SB__SC } /* sentencebreak=sc */, + { 0, 1340, 0, 9, 0, UNI_ORKH } /* oldturkic */, + { 1, 461, 240, 2, 4, UNI_ZYYY } /* iszyyy */, + { 0, 4424, 840, 17, 7, UNI_TGLG } /* scriptextensions=tagalog */, + { 3, 18, 6901, 1, 13, UNI_BYZANTINEMUSIC } /* byzantinemusic */, + { 18, 309, 840, 2, 7, UNI_INTAGALOG } /* intagalog */, + { 0, 2718, 3505, 2, 3, UNI_BC__ET } /* bc=et */, + { 0, 1823, 11, 7, 4, UNI_SC__ADLM } /* script=adlm */, + { 0, 4502, 3773, 5, 15, UNI_LINEARBIDEOGRAMS } /* blk=linearbideograms */, + { 2, 2514, 7620, 3, 28, UNI_MISCARROWS } /* ismiscellaneoussymbolsandarrows */, + { 0, 4391, 2164, 14, 8, UNI_NV__1_SLASH_3 } /* numericvalue=3.333e-01 */, + { 0, 2766, 4075, 3, 14, UNI_SC } /* gc=currencysymbol */, + { 0, 7752, 4746, 23, 5, UNI_JG__MANICHAEANGIMEL } /* joininggroup=manichaeangimel */, + { 40, 54, 2735, 2, 5, UNI_SC__ARAB } /* sc=arab */, + { 0, 309, 527, 2, 6, UNI_INREJANG } /* inrejang */, + { 2, 2391, 1674, 10, 4, UNI_CYRILLICEXTD } /* incyrillicextd */, + { 1, 1102, 1262, 4, 7, UNI_SOYO } /* scx=soyombo */, + { 1, 3863, 2164, 14, 8, UNI_NV__5_SLASH_6 } /* numericvalue=8.333e-01 */, + { 9, 4424, 1205, 17, 4, UNI_GRAN } /* scriptextensions=gran */, + { 0, 4360, 1763, 10, 8, UNI_LB__LF } /* linebreak=linefeed */, + { 3, 4424, 5067, 16, 5, UNI_MANI } /* scriptextensions=mani */, + { 0, 8, 353, 3, 4, UNI_PCM } /* pcm=yes */, + { 6, 1696, 0, 6, 0, UNI_DOMINO } /* domino */, + { 0, 7495, 1317, 27, 2, UNI_CCC__32 } /* canonicalcombiningclass=ccc32 */, + { 0, 2391, 5848, 10, 9, UNI_CYRILLICEXTA } /* incyrillicextendeda */, + { 14, 7134, 353, 26, 2, UNI_PCM } /* prependedconcatenationmark=y */, + { 2, 1102, 357, 4, 6, UNI_CAKM } /* scx=chakma */, + { 0, 461, 861, 2, 7, UNI_TIBT } /* istibetan */, + { 4, 1667, 1285, 4, 9, UNI_INKHUDAWADI } /* blk=khudawadi */, + { 3, 1102, 499, 4, 6, UNI_LYDI } /* scx=lydian */, + { 1, 1906, 3622, 7, 11, UNI_KANGXI } /* blk=kangxiradicals */, + { 1, 2525, 1479, 6, 5, UNI_XPOSIXSPACE } /* xposixspace */, + { 1, 2766, 2004, 3, 2, UNI_PO } /* gc=po */, + { 0, 54, 3133, 2, 5, UNI_SC__GEOR } /* sc=geor */, + { 4, 461, 880, 2, 7, UNI_ZZZZ } /* isunknown */, + { 0, 510, 3876, 5, 2, UNI_NV__3_SLASH_80 } /* nv=3/80 */, + { 2, 3502, 324, 12, 3, UNI_ETHIOPICSUP } /* blk=ethiopicsup */, + { 4, 6165, 688, 3, 5, UNI_BATK } /* sc=batak */, + { 56, 1174, 7048, 3, 9, UNI_EA__F } /* ea=fullwidth */, + { 0, 7267, 599, 15, 3, UNI_NO } /* generalcategory=no */, + { 1, 7274, 6677, 9, 14, UNI_LM } /* category=modifierletter */, + { 2, 3391, 3876, 13, 2, UNI_NV__80 } /* numericvalue=80 */, + { 2, 2324, 204, 11, 2, UNI_CJKEXTF } /* block=cjkextf */, + { 2, 461, 458, 2, 4, UNI_QAAI } /* isqaai */, + { 3, 4502, 4770, 17, 10, UNI_LATINEXTADDITIONAL } /* blk=latinextendedadditional */, + { 3, 1106, 0, 4, 0, UNI_TALU } /* talu */, + { 0, 2324, 1501, 6, 8, UNI_JAMOEXTA } /* block=jamoexta */, + { 3, 2060, 353, 5, 2, UNI_XPOSIXALPHA } /* alpha=y */, + { 1, 1823, 398, 7, 4, UNI_MIAO } /* script=miao */, + { 2, 15, 3418, 2, 3, UNI_AGE__4 } /* age=4 */, + { 2, 7383, 327, 10, 3, UNI_BC__FSI } /* bidiclass=fsi */, + { 0, 1667, 1331, 4, 9, UNI_INOLDPERMIC } /* blk=oldpermic */, + { 0, 1667, 5857, 4, 12, UNI_MONGOLIANSUP } /* blk=mongoliansup */, + { 1, 7564, 0, 17, 0, UNI_ANCIENTGREEKMUSIC } /* ancientgreekmusic */, + { 3, 4424, 23, 17, 4, UNI_AHOM } /* scriptextensions=ahom */, + { 2, 30, 536, 1, 5, UNI_TANG } /* istang */, + { 0, 7752, 2403, 24, 3, UNI_JG__MANICHAEANTETH } /* joininggroup=manichaeanteth */, + { 0, 7274, 4369, 8, 2, UNI_Z } /* category=z */, + { 1, 2060, 934, 5, 2, -UNI_XPOSIXALPHA } /* alpha=f */, + { 0, 2287, 549, 3, 3, UNI_IN__4 } /* in=4.0 */, + { 42, 1102, 975, 4, 8, UNI_GURU } /* scx=gurmukhi */, + { 14, 423, 2312, 3, 12, UNI_AEGEANNUMBERS } /* inaegeannumbers */, + { 1, 4391, 763, 14, 3, UNI_NV__3_SLASH_64 } /* numericvalue=3/64 */, + { 0, 2324, 2852, 6, 7, UNI_MAHJONG } /* block=mahjong */, + { 4, 6236, 0, 15, 0, UNI_NV__10 } /* numericvalue=10 */, + { 3, 887, 0, 8, 0, UNI_AGE__10 } /* age=10.0 */, + { 0, 7267, 326, 16, 2, UNI_PF } /* generalcategory=pf */, + { 1, 7752, 4239, 23, 4, UNI_JG__MANICHAEANFIVE } /* joininggroup=manichaeanfive */, + { 3, 82, 0, 4, 0, UNI_GONG } /* gong */, + { 0, 1906, 5848, 8, 9, UNI_KANAEXTA } /* blk=kanaextendeda */, + { 3, 3093, 598, 12, 4, -UNI_POSIXXDIGIT } /* asciihexdigit=no */, + { 0, 309, 4506, 2, 14, UNI_LATINEXTB } /* inlatinextendedb */, + { 3, 7267, 4150, 16, 5, UNI_P } /* generalcategory=punct */, + { 0, 5937, 598, 20, 3, -UNI__PERL_NCHAR } /* noncharactercodepoint=n */, + { 0, 1823, 4461, 7, 11, UNI_SGNW } /* script=signwriting */, + { 0, 1823, 3349, 7, 15, UNI_MERC } /* script=meroiticcursive */, + { 5, 3407, 2192, 14, 8, UNI_NV__3_SLASH_64 } /* numericvalue=4.688e-02 */, + { 0, 236, 0, 4, 0, UNI_ZANB } /* zanb */, + { 6, 782, 0, 3, 0, UNI_ANY } /* any */, + { 1, 3228, 0, 15, 0, UNI_ARMI } /* imperialaramaic */, + { 0, 1454, 599, 2, 3, -UNI_SD } /* sd=no */, + { 2, 2324, 0, 6, 0, UNI_blk_values_index } /* block= */, + { 9, 1102, 1340, 4, 9, UNI_ORKH } /* scx=oldturkic */, + { 1, 1102, 4461, 4, 11, UNI_SGNW } /* scx=signwriting */, + { 4, 5595, 0, 21, 0, UNI_CWT } /* changeswhentitlecased */, + { 20, 2503, 934, 11, 2, -UNI_JOINC } /* joincontrol=f */, + { 3, 4424, 746, 17, 4, UNI_MARC } /* scriptextensions=marc */, + { 0, 2324, 1385, 6, 6, UNI_INTHAANA } /* block=thaana */, + { 0, 6090, 7825, 7, 30, UNI_MATHALPHANUM } /* block=mathematicalalphanumericsymbols */, + { 0, 339, 182, 4, 2, UNI_CCC__0 } /* ccc=nr */, + { 22, 2268, 0, 12, 0, UNI_PLAYINGCARDS } /* playingcards */, + { 1, 3391, 2223, 13, 9, UNI_NV__1_SLASH_16 } /* numericvalue=6.250e-02 */, + { 0, 7011, 2234, 23, 2, UNI_CCC__8 } /* canonicalcombiningclass=8 */, + { 0, 1667, 663, 4, 5, UNI_INLIMBU } /* blk=limbu */, + { 0, 8071, 0, 24, 0, UNI_CJK } /* blk=cjkunifiedideographs */, + { 1, 8246, 8508, 24, 14, UNI_INPC__BOTTOMANDRIGHT } /* indicpositionalcategory=bottomandright */, + { 16, 6165, 1779, 3, 11, UNI_MEDF } /* sc=medefaidrin */, + { 0, 622, 0, 7, 0, UNI_EXTPICT } /* extpict */, + { 1, 21, 7241, 1, 26, UNI_ENCLOSEDCJK } /* enclosedcjklettersandmonths */, + { 0, 2324, 5, 6, 3, UNI_OCR } /* block=ocr */, + { 65, 6165, 1255, 3, 7, UNI_SIDD } /* sc=siddham */, + { 0, 5616, 599, 21, 2, -UNI_CWU } /* changeswhenuppercased=n */, + { 1, 192, 0, 4, 0, UNI_TAGS } /* tags */, + { 0, 833, 353, 4, 4, UNI_TERM } /* term=yes */, + { 9, 15, 0, 4, 0, UNI_AGHB } /* aghb */, + { 4, 2348, 5671, 12, 3, -UNI_CI } /* caseignorable=n */, + { 2, 1424, 343, 7, 2, UNI_CCC__12 } /* ccc=ccc12 */, + { 0, 309, 1033, 2, 4, UNI_JAMO } /* injamo */, + { 0, 7889, 3998, 26, 4, UNI_CJKEXTG } /* cjkunifiedideographsextensiong */, + { 1, 1011, 585, 2, 2, UNI_CI } /* ci=t */, + { 3, 292, 290, 3, 2, UNI_NV__40 } /* nv=40 */, + { 66, 1391, 6324, 3, 6, UNI_WB__FO } /* wb=format */, + { 1, 6165, 27, 3, 4, UNI_ARMI } /* sc=armi */, + { 0, 461, 3268, 2, 5, UNI_XPOSIXALNUM } /* isalnum */, + { 6, 6165, 51, 3, 4, UNI_CANS } /* sc=cans */, + { 21, 4970, 599, 13, 2, -UNI_EMOD } /* emojimodifier=n */, + { 2, 1396, 0, 8, 0, UNI_XIDS } /* xidstart */, + { 6, 517, 1314, 4, 2, UNI_NV__700 } /* nv=700 */, + { 0, 339, 7239, 4, 2, UNI_CCC__28 } /* ccc=28 */, + { 1, 1424, 1318, 7, 2, UNI_CCC__20 } /* ccc=ccc20 */, + { 64, 753, 1792, 3, 9, UNI_NFCQC__M } /* nfkcqc=maybe */, + { 0, 7084, 6193, 6, 12, UNI_ARABICSUP } /* inarabicsupplement */, + { 1, 339, 5523, 4, 5, UNI_CCC__B } /* ccc=below */, + { 0, 1272, 7111, 3, 23, UNI_DIACRITICALSFORSYMBOLS } /* iscombiningmarksforsymbols */, + { 1, 7011, 7408, 18, 7, UNI_CCC__R } /* canonicalcombiningclass=r */, + { 2, 2536, 5084, 3, 4, UNI_JG__YUDH } /* jg=yudh */, + { 0, 2766, 4683, 3, 16, UNI_PF } /* gc=finalpunctuation */, + { 0, 552, 0, 4, 0, UNI_age_values_index } /* age= */, + { 17, 461, 2769, 2, 5, UNI_C } /* isother */, + { 1, 3791, 2060, 4, 8, UNI_MATHALPHANUM } /* mathalphanum */, + { 0, 2403, 620, 6, 5, UNI_ETHIOPICEXT } /* ethiopicext */, + { 1, 8343, 5762, 22, 16, UNI_INSC__SYLLABLEMODIFIER } /* indicsyllabiccategory=syllablemodifier */, + { 2, 2324, 6332, 6, 19, UNI_JAMOEXTB } /* block=hanguljamoextendedb */, + { 26, 4502, 81, 11, 2, UNI_LATINEXTG } /* blk=latinextg */, + { 5, 5532, 274, 21, 1, UNI_cwcf_values_index } /* changeswhencasefolded= */, + { 2, 2494, 2773, 3, 13, UNI_INGREEK } /* isgreekandcoptic */, + { 0, 1823, 1027, 7, 6, UNI_SC__YEZI } /* script=yezidi */, + { 65, 940, 0, 2, 0, UNI_CO } /* co */, + { 1, 615, 0, 7, 0, UNI_ELYM } /* elymaic */, + { 64, 1240, 1332, 3, 8, UNI_INOLDPERMIC } /* inoldpermic */, + { 0, 6165, 78, 3, 4, UNI_DSRT } /* sc=dsrt */, + { 0, 5769, 353, 4, 2, UNI_EMOD } /* emod=y */, + { 46, 4795, 1805, 14, 4, UNI_NV__60000 } /* numericvalue=60000 */, + { 2, 6165, 868, 3, 7, UNI_SC__TIRH } /* sc=tirhuta */, + { 1, 6870, 934, 20, 2, -UNI_CE } /* compositionexclusion=f */, + { 0, 1082, 0, 4, 0, UNI_XPOSIXWORD } /* word */, + { 3, 253, 599, 4, 2, -UNI_CWCF } /* cwcf=n */, + { 0, 1823, 430, 7, 4, UNI_SC__NKO } /* script=nkoo */, + { 0, 2718, 6300, 13, 10, UNI_BC__RLE } /* bc=righttoleftembedding */, + { 2, 1823, 608, 7, 4, UNI_ELBA } /* script=elba */, + { 3, 7267, 8356, 7, 11, UNI_CO } /* generalcategory=co */, + { 1, 1823, 15, 7, 4, UNI_AGHB } /* script=aghb */, + { 0, 8278, 1556, 4, 6, UNI_MISCARROWS } /* miscarrows */, + { 8, 461, 7449, 2, 28, UNI_PHONETICEXTSUP } /* isphoneticextensionssupplement */, + { 10, 7134, 585, 26, 5, UNI_PCM } /* prependedconcatenationmark=true */, + { 0, 4424, 124, 17, 4, UNI_LATN } /* scriptextensions=latn */, + { 9, 1823, 1205, 7, 7, UNI_SC__GRAN } /* script=grantha */, + { 16, 461, 3634, 2, 2, UNI_NL } /* isnl */, + { 7, 1102, 5353, 4, 20, UNI_PHLI } /* scx=inscriptionalpahlavi */, + { 0, 552, 387, 5, 2, UNI_AGE__5_DOT_2 } /* age=5.2 */, + { 0, 461, 0, 2, 2, UNI_CASEDLETTER } /* isl& */, + { 4, 309, 398, 2, 4, UNI_INMIAO } /* inmiao */, + { 2, 7274, 3196, 12, 8, UNI_NO } /* category=othernumber */, + { 1, 7274, 5243, 13, 12, UNI_PO } /* category=otherpunctuation */, + { 0, 1102, 3421, 4, 15, UNI_NARB } /* scx=oldnortharabian */, + { 0, 1479, 0, 5, 0, UNI_XPOSIXSPACE } /* space */, + { 1, 461, 4002, 2, 4, UNI_MODI } /* ismodi */, + { 5, 1667, 7724, 4, 18, UNI_INVS } /* blk=variationselectors */, + { 8, 2403, 6193, 6, 5, UNI_ETHIOPICSUP } /* ethiopicsup */, + { 18, 3093, 353, 13, 2, UNI_POSIXXDIGIT } /* asciihexdigit=y */, + { 0, 1734, 467, 3, 3, UNI_SOGO } /* issogo */, + { 25, 1790, 0, 6, 0, UNI_nfcqc_values_index } /* nfcqc= */, + { 2, 3848, 1072, 14, 3, UNI_NV__7_SLASH_12 } /* numericvalue=7/12 */, + { 83, 1823, 1340, 7, 9, UNI_ORKH } /* script=oldturkic */, + { 2, 833, 585, 4, 5, UNI_TERM } /* term=true */, + { 0, 6427, 4751, 13, 3, UNI_JG__SAD } /* joininggroup=sad */, + { 26, 895, 2125, 5, 2, UNI_AGE__6_DOT_3 } /* age=v63 */, + { 3, 1065, 394, 5, 1, UNI_NV__1_SLASH_5 } /* nv=1/5 */, + { 0, 1412, 0, 12, 0, UNI_BOXDRAWING } /* inboxdrawing */, + { 72, 1102, 868, 4, 7, UNI_TIRH } /* scx=tirhuta */, + { 0, 1409, 4698, 4, 2, UNI_LATIN1 } /* latin1 */, + { 2, 7274, 4683, 9, 16, UNI_PF } /* category=finalpunctuation */, + { 1, 2280, 546, 11, 3, UNI_IN__13 } /* presentin=13.0 */, + { 7, 3817, 764, 15, 2, UNI_NV__1_SLASH_64 } /* numericvalue=1/64 */, + { 2, 1667, 4651, 4, 8, UNI_INBOPOMOFO } /* blk=bopomofo */, + { 3, 7591, 63, 3, 2, UNI_LB__CP } /* lb=cp */, + { 65, 1667, 4911, 4, 15, UNI_DIACRITICALSSUP } /* blk=diacriticalssup */, + { 70, 510, 3846, 4, 2, UNI_NV__3_SLASH_8 } /* nv=3/8 */, + { 1, 597, 2030, 5, 5, UNI_DT__NB } /* dt=nobreak */, + { 1, 693, 5243, 6, 12, UNI_PO } /* isotherpunctuation */, + { 12, 2536, 2015, 3, 3, UNI_JG__WAW } /* jg=waw */, + { 8, 6427, 478, 13, 3, UNI_JG__BEH } /* joininggroup=beh */, + { 0, 5065, 636, 13, 3, UNI_JG__MANICHAEANNUN } /* jg=manichaeannun */, + { 4, 5574, 585, 21, 5, UNI_CWL } /* changeswhenlowercased=true */, + { 50, 4424, 3726, 16, 10, UNI_MLYM } /* scriptextensions=malayalam */, + { 11, 1102, 63, 4, 4, UNI_CPMN } /* scx=cpmn */, + { 0, 1823, 1003, 7, 6, UNI_LEPC } /* script=lepcha */, + { 1, 6427, 1760, 13, 3, UNI_JG__KAF } /* joininggroup=kaf */, + { 1, 7724, 0, 28, 0, UNI_VSSUP } /* variationselectorssupplement */, + { 1, 4584, 274, 18, 1, UNI_idst_values_index } /* idstrinaryoperator= */, + { 1, 1223, 3696, 4, 10, UNI_KANASUP } /* kanasupplement */, + { 0, 1102, 1003, 4, 6, UNI_LEPC } /* scx=lepcha */, + { 0, 2324, 6677, 6, 15, UNI_MODIFIERLETTERS } /* block=modifierletters */, + { 0, 1667, 3908, 4, 16, UNI_TANGUTCOMPONENTS } /* blk=tangutcomponents */, + { 1, 2324, 6692, 6, 22, UNI_TRANSPORTANDMAP } /* block=transportandmapsymbols */, + { 2, 876, 934, 4, 6, -UNI_IDEO } /* ideo=false */, + { 2, 5168, 1397, 6, 7, UNI__PERL_IDSTART } /* _perl_idstart */, + { 19, 1227, 0, 4, 0, UNI_MAKA } /* maka */, + { 3, 7274, 6324, 9, 6, UNI_CF } /* category=format */, + { 0, 1667, 6000, 4, 6, UNI_YIJING } /* blk=yijing */, + { 24, 716, 3622, 5, 3, UNI_KANGXI } /* inkangxi */, + { 0, 461, 571, 2, 7, UNI_AVST } /* isavestan */, + { 1, 5065, 5427, 14, 6, UNI_JG__MANICHAEANTHAMEDH } /* jg=manichaeanthamedh */, + { 1, 7383, 3924, 10, 14, UNI_BC__EN } /* bidiclass=europeannumber */, + { 1, 3502, 6193, 10, 12, UNI_ETHIOPICSUP } /* blk=ethiopicsupplement */, + { 3, 8071, 5252, 30, 4, UNI_CJKEXTE } /* blk=cjkunifiedideographsextensione */, + { 0, 7011, 5515, 24, 17, UNI_WB__EB } /* canonicalcombiningclass=attachedbelowleft */, + { 4, 6165, 410, 3, 4, UNI_SC__GONM } /* sc=gonm */, + { 1, 5895, 5909, 5, 7, UNI_SUPARROWSC } /* issuparrowsc */, + { 2, 8, 1079, 1, 7, UNI_POSIXWORD } /* perlword */, + { 2, 461, 4651, 2, 8, UNI_BOPO } /* isbopomofo */, + { 34, 2441, 0, 4, 0, UNI_NAND } /* nand */, + { 1, 5205, 4511, 11, 9, UNI_MYANMAREXTB } /* blk=myanmarextendedb */, + { 18, 3391, 1803, 12, 8, UNI_NV__1000000 } /* numericvalue=1000000 */, + { 3, 292, 1805, 4, 4, UNI_NV__90000 } /* nv=90000 */, + { 9, 309, 3475, 2, 15, UNI_INZANABAZARSQUARE } /* inzanabazarsquare */, + { 0, 1667, 5353, 4, 20, UNI_ININSCRIPTIONALPAHLAVI } /* blk=inscriptionalpahlavi */, + { 0, 6165, 212, 3, 4, UNI_TIBT } /* sc=tibt */, + { 4, 2503, 353, 11, 4, UNI_JOINC } /* joincontrol=yes */, + { 0, 1102, 997, 4, 6, UNI_KTHI } /* scx=kaithi */, + { 1, 658, 0, 5, 0, UNI_DOGR } /* dogra */, + { 0, 5065, 4259, 13, 4, UNI_JG__MANICHAEANYODH } /* jg=manichaeanyodh */, + { 4, 733, 8111, 3, 31, UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS } /* inegyptianhieroglyphformatcontrols */, + { 56, 324, 6103, 3, 13, UNI_SUPMATHOPERATORS } /* supmathoperators */, + { 1, 3696, 4607, 10, 13, UNI_SUPPUNCTUATION } /* supplementalpunctuation */, + { 0, 5460, 353, 19, 4, UNI_TERM } /* terminalpunctuation=yes */, + { 1, 3021, 569, 4, 2, UNI_IN__5_DOT_2 } /* in=v52 */, + { 0, 658, 0, 4, 0, UNI_DOGR } /* dogr */, + { 0, 461, 527, 2, 6, UNI_RJNG } /* isrejang */, + { 8, 6427, 7342, 13, 10, UNI_JG__TEHMARBUTA } /* joininggroup=tehmarbuta */, + { 2, 5916, 353, 21, 4, UNI_LOE } /* logicalorderexception=yes */, + { 0, 2324, 4809, 6, 18, UNI_ORNAMENTALDINGBATS } /* block=ornamentaldingbats */, + { 11, 1667, 1133, 4, 8, UNI_INVITHKUQI } /* blk=vithkuqi */, + { 9, 735, 599, 2, 2, UNI_EA__N } /* ea=n */, + { 7, 3204, 934, 14, 2, -UNI_GREXT } /* graphemeextend=f */, + { 17, 3817, 2115, 14, 8, UNI_NV__1_SLASH_64 } /* numericvalue=1.562e-02 */, + { 84, 309, 1914, 2, 8, UNI_UCASEXTA } /* inucasexta */, + { 3, 1823, 1144, 7, 9, UNI_BHKS } /* script=bhaiksuki */, + { 0, 7495, 2101, 27, 2, UNI_CCC__29 } /* canonicalcombiningclass=ccc29 */, + { 1, 925, 598, 2, 6, UNI_BPT__N } /* bpt=none */, + { 4, 5637, 1864, 21, 8, UNI_WB__EB } /* graphemeclusterbreak=ebasegaz */, + { 0, 309, 4651, 2, 11, UNI_BOPOMOFOEXT } /* inbopomofoext */, + { 2, 939, 353, 5, 4, UNI_ECOMP } /* ecomp=yes */, + { 0, 4424, 5857, 17, 9, UNI_MONG } /* scriptextensions=mongolian */, + { 5, 1455, 934, 3, 6, -UNI_DEP } /* dep=false */, + { 0, 1391, 543, 3, 2, UNI_WB__EB } /* wb=eb */, + { 0, 1667, 1926, 7, 7, UNI_CJKSYMBOLS } /* blk=cjksymbols */, + { 3, 2324, 108, 6, 4, UNI_INKAWI } /* block=kawi */, + { 2, 2324, 1414, 6, 10, UNI_BOXDRAWING } /* block=boxdrawing */, + { 10, 6427, 118, 13, 3, UNI_JG__DAL } /* joininggroup=dal */, + { 0, 461, 414, 2, 4, UNI_HANO } /* ishano */, + { 0, 6427, 4247, 13, 4, UNI_JG__KAPH } /* joininggroup=kaph */, + { 20, 461, 1262, 2, 7, UNI_SOYO } /* issoyombo */, + { 3, 1823, 1191, 7, 4, UNI_SC__BENG } /* script=beng */, + { 0, 8343, 2823, 22, 9, UNI_INSC__NONJOINER } /* indicsyllabiccategory=nonjoiner */, + { 1, 2766, 2814, 6, 8, UNI_SO } /* gc=othersymbol */, + { 4, 7383, 384, 10, 2, UNI_BC__EN } /* bidiclass=en */, + { 3, 461, 2060, 2, 5, UNI_XPOSIXALPHA } /* isalpha */, + { 33, 1823, 4487, 7, 6, UNI_SC__ZYYY } /* script=common */, + { 34, 2536, 3301, 3, 12, UNI_JG__VERTICALTAIL } /* jg=verticaltail */, + { 0, 4424, 2009, 17, 6, UNI_SYRC } /* scriptextensions=syriac */, + { 3, 406, 585, 2, 2, UNI_DI } /* di=t */, + { 32, 533, 6324, 3, 6, UNI_SB__FO } /* sb=format */, + { 0, 2324, 1248, 6, 7, UNI_INPHAGSPA } /* block=phagspa */, + { 80, 1102, 683, 4, 5, UNI_TAKR } /* scx=takri */, + { 0, 461, 2786, 2, 14, UNI_HIGHSURROGATES } /* ishighsurrogates */, + { 3, 1883, 585, 5, 5, UNI_BIDIC } /* bidic=true */, + { 0, 597, 1178, 4, 5, UNI_DT__NAR } /* dt=narrow */, + { 68, 8246, 3243, 24, 10, UNI_INPC__OVERSTRUCK } /* indicpositionalcategory=overstruck */, + { 40, 6165, 1090, 3, 4, UNI_SC__LINB } /* sc=linb */, + { 0, 461, 983, 2, 8, UNI_HIRA } /* ishiragana */, + { 24, 2732, 24, 5, 3, UNI_INAHOM } /* blk=ahom */, + { 4, 1102, 3493, 3, 9, UNI_CYRL } /* scx=cyrillic */, + { 2, 309, 5958, 2, 7, UNI_INSINHALA } /* insinhala */, + { 1, 106, 0, 2, 0, UNI_ZL } /* zl */, + { 0, 2842, 6193, 8, 12, UNI_ETHIOPICSUP } /* isethiopicsupplement */, + { 35, 4360, 4316, 10, 14, UNI_LB__BK } /* linebreak=mandatorybreak */, + { 0, 1823, 499, 7, 4, UNI_LYDI } /* script=lydi */, + { 4, 641, 3599, 4, 12, UNI_GCB__T } /* hst=trailingjamo */, + { 25, 461, 6866, 2, 24, UNI_COMPEX } /* isfullcompositionexclusion */, + { 13, 5769, 934, 4, 6, -UNI_EMOD } /* emod=false */, + { 0, 1272, 8153, 5, 21, UNI_CJKSYMBOLS } /* iscjksymbolsandpunctuation */, + { 69, 5637, 644, 20, 3, UNI_LB__H2 } /* graphemeclusterbreak=lv */, + { 33, 2324, 6495, 6, 5, UNI_MUSIC } /* block=music */, + { 0, 959, 353, 8, 4, UNI_EXT } /* extender=yes */, + { 0, 3013, 599, 5, 2, -UNI_EPRES } /* epres=n */, + { 1, 2324, 2268, 6, 12, UNI_PLAYINGCARDS } /* block=playingcards */, + { 0, 1221, 3696, 6, 10, UNI_KANASUP } /* inkanasupplement */, + { 6, 1396, 353, 8, 4, UNI_XIDS } /* xidstart=yes */, + { 0, 1894, 274, 12, 1, UNI_bidim_values_index } /* bidimirrored= */, + { 5, 832, 585, 5, 2, UNI_STERM } /* sterm=t */, + { 134, 1397, 353, 3, 2, UNI_IDS } /* ids=y */, + { 0, 6427, 5084, 13, 4, UNI_JG__YUDH } /* joininggroup=yudh */, + { 6, 1391, 507, 3, 2, UNI_WB__DQ } /* wb=dq */, + { 0, 3093, 598, 12, 2, UNI_ahex_values_index } /* asciihexdigit= */, + { 4, 1823, 1853, 7, 4, UNI_SC__SYLO } /* script=sylo */, + { 0, 6776, 0, 21, 0, UNI_MEETEIMAYEKEXT } /* meeteimayekextensions */, + { 0, 2536, 4751, 3, 3, UNI_JG__SAD } /* jg=sad */, + { 3, 6427, 4235, 13, 4, UNI_JG__BETH } /* joininggroup=beth */, + { 0, 461, 67, 2, 4, UNI_CPRT } /* iscprt */, + { 0, 2752, 585, 14, 5, UNI_ECOMP } /* emojicomponent=true */, + { 4, 7198, 8386, 7, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* blk=supsymbolsandpictographs */, + { 1, 2180, 1317, 4, 5, UNI_NV__432000 } /* nv=432000 */, + { 34, 7274, 50, 9, 2, UNI_MC } /* category=mc */, + { 4, 3407, 346, 14, 1, UNI_NV__48 } /* numericvalue=48 */, + { 7, 1823, 2735, 6, 7, UNI_SC__ARAB } /* script=arabic */, + { 4, 8660, 0, 43, 0, UNI_UCASEXTA } /* unifiedcanadianaboriginalsyllabicsextendeda */, + { 2, 309, 732, 2, 7, UNI_INLINEARA } /* inlineara */, + { 3, 4941, 7442, 7, 25, UNI_KATAKANAEXT } /* block=katakanaphoneticextensions */, + { 9, 1479, 352, 4, 5, UNI_XPOSIXSPACE } /* space=yes */, + { 0, 309, 7449, 2, 28, UNI_PHONETICEXTSUP } /* inphoneticextensionssupplement */, + { 1, 271, 0, 4, 0, UNI_gcb_values_index } /* gcb= */, + { 5, 5595, 599, 21, 2, -UNI_CWT } /* changeswhentitlecased=n */, + { 0, 1823, 683, 7, 4, UNI_SC__TAKR } /* script=takr */, + { 2, 32, 4439, 1, 2, UNI_vs_values_index } /* vs= */, + { 1, 4424, 398, 17, 4, UNI_MIAO } /* scriptextensions=miao */, + { 3, 406, 934, 3, 2, -UNI_DIA } /* dia=f */, + { 5, 4424, 410, 17, 4, UNI_GONM } /* scriptextensions=gonm */, + { 0, 1243, 6462, 2, 25, UNI_SHORTHANDFORMATCONTROLS } /* blk=shorthandformatcontrols */, + { 66, 461, 4651, 2, 4, UNI_BOPO } /* isbopo */, + { 1, 3268, 0, 5, 0, UNI_XPOSIXALNUM } /* alnum */, + { 1, 4161, 0, 9, 0, UNI_DIA } /* diacritic */, + { 120, 2324, 2692, 6, 13, UNI_VERTICALFORMS } /* block=verticalforms */, + { 1, 7198, 8386, 16, 21, UNI_SUPSYMBOLSANDPICTOGRAPHS } /* blk=supplementalsymbolsandpictographs */, + { 2, 7274, 1393, 8, 2, UNI_M } /* category=m */, + { 1, 2018, 2932, 11, 12, UNI_JT__T } /* joiningtype=transparent */, + { 0, 257, 274, 4, 1, UNI_cwcm_values_index } /* cwcm= */, + { 1, 1424, 391, 7, 2, UNI_CCC__34 } /* ccc=ccc34 */, + { 0, 1102, 658, 4, 4, UNI_DOGR } /* scx=dogr */, + { 1, 6165, 901, 3, 8, UNI_ARMN } /* sc=armenian */, + { 3, 1102, 1015, 4, 4, UNI_TELU } /* scx=telu */, + { 2, 4845, 584, 16, 3, UNI__PERL_PATWS } /* patternwhitespace=t */, + { 12, 3634, 0, 2, 0, UNI_NL } /* nl */, + { 32, 313, 0, 4, 0, UNI_M } /* mark */, + { 1, 2766, 0, 3, 0, UNI_gc_values_index } /* gc= */, + { 0, 309, 2852, 2, 12, UNI_MAHJONG } /* inmahjongtiles */, + { 0, 7944, 4410, 28, 4, UNI_CJKEXTA } /* iscjkunifiedideographsextensiona */, + { 24, 1667, 8142, 4, 32, UNI_IDEOGRAPHICSYMBOLS } /* blk=ideographicsymbolsandpunctuation */, + { 7, 4360, 4288, 10, 14, UNI_LB__CR } /* linebreak=carriagereturn */, + { 0, 6165, 1234, 3, 7, UNI_SC__MULT } /* sc=multani */, + { 5, 1823, 1954, 7, 12, UNI_SC__GONG } /* script=gunjalagondi */, + { 3, 461, 658, 2, 4, UNI_DOGR } /* isdogr */, + { 0, 4360, 5769, 10, 9, UNI_EMOD } /* linebreak=emodifier */, + { 0, 6165, 1438, 3, 10, UNI_CHRS } /* sc=chorasmian */, + { 0, 5876, 0, 19, 0, UNI_SUNDANESESUP } /* sundanesesupplement */, + { 0, 1102, 951, 4, 8, UNI_DUPL } /* scx=duployan */, + { 48, 6618, 140, 5, 2, UNI_INPC__NA } /* inpc=na */, + { 4, 461, 6870, 2, 20, UNI_CE } /* iscompositionexclusion */, + { 0, 6165, 6776, 3, 11, UNI_MTEI } /* sc=meeteimayek */, + { 2, 5897, 0, 19, 0, UNI_SUPARROWSC } /* supplementalarrowsc */, + { 67, 30, 7854, 1, 5, UNI_IDEO } /* isideo */, + { 24, 461, 4271, 2, 17, UNI_KITS } /* iskhitansmallscript */, + { 1, 4424, 499, 17, 6, UNI_LYDI } /* scriptextensions=lydian */, + { 0, 2, 5671, 1, 3, -UNI_CE } /* ce=n */, + { 2, 2718, 6029, 3, 12, UNI_BC__AN } /* bc=arabicnumber */, + { 0, 200, 0, 4, 0, UNI_TAVT } /* tavt */, + { 0, 6165, 1003, 3, 6, UNI_LEPC } /* sc=lepcha */, + { 53, 461, 1522, 2, 4, UNI_UGAR } /* isugar */, + { 0, 7889, 6553, 25, 5, UNI_CJKEXTC } /* cjkunifiedideographsextensionc */, + { 1, 4360, 4780, 10, 15, UNI_LB__CB } /* linebreak=contingentbreak */, + { 49, 833, 599, 4, 3, -UNI_TERM } /* term=no */, + { 22, 309, 430, 2, 3, UNI_INNKO } /* innko */, + { 8, 6165, 8667, 3, 18, UNI_CANS } /* sc=canadianaboriginal */, + { 0, 5916, 0, 21, 0, UNI_LOE } /* logicalorderexception */, + { 6, 309, 847, 2, 7, UNI_INTAITHAM } /* intaitham */, + { 4, 641, 898, 3, 2, UNI_GCB__V } /* hst=v */, + { 3, 5939, 353, 5, 4, UNI__PERL_NCHAR } /* nchar=yes */, + { 6, 4360, 1612, 10, 2, UNI_LB__LF } /* linebreak=lf */, + { 0, 2324, 7537, 6, 27, UNI_ALPHABETICPF } /* block=alphabeticpresentationforms */, + { 0, 6165, 94, 3, 4, UNI_SC__GURU } /* sc=guru */, + { 69, 1198, 7972, 3, 15, UNI_CUNEIFORMNUMBERS } /* incuneiformnumbers */, + { 0, 641, 4030, 4, 13, UNI_HST__NA } /* hst=notapplicable */, + { 0, 1396, 585, 4, 2, UNI_XIDS } /* xids=t */, + { 0, 2060, 585, 5, 5, UNI_XPOSIXALPHA } /* alpha=true */, + { 11, 1294, 0, 9, 0, UNI_NBAT } /* nabataean */, + { 0, 1823, 1003, 7, 4, UNI_LEPC } /* script=lepc */, + { 0, 2180, 290, 4, 1, UNI_NV__44 } /* nv=44 */, + { 5, 3863, 1314, 14, 3, UNI_NV__8000 } /* numericvalue=8000 */, + { 0, 7796, 0, 29, 0, UNI_ENCLOSEDIDEOGRAPHICSUP } /* enclosedideographicsupplement */, + { 0, 3848, 0, 15, 0, UNI_NV__70 } /* numericvalue=70 */, + { 1, 2, 598, 2, 3, -UNI_CWT } /* cwt=n */, + { 69, 8343, 6167, 21, 18, UNI_INSC__CONSONANTPREFIXED } /* indicsyllabiccategory=consonantprefixed */, + { 4, 1397, 585, 3, 5, UNI_IDS } /* ids=true */, + { 4, 1667, 3692, 4, 4, UNI_INLISU } /* blk=lisu */, + { 1, 1667, 779, 4, 7, UNI_INOSMANYA } /* blk=osmanya */, + { 3, 309, 2852, 2, 7, UNI_MAHJONG } /* inmahjong */, + { 8, 2718, 5479, 3, 18, UNI_BC__ET } /* bc=europeanterminator */, + { 5, 1424, 1153, 7, 2, UNI_CCC__24 } /* ccc=ccc24 */, + { 4, 1823, 120, 7, 4, UNI_LAO } /* script=laoo */, + { 5, 6165, 2411, 3, 8, UNI_SC__KANA } /* sc=katakana */, + { 1, 4, 584, 2, 3, UNI_LOE } /* loe=t */, + { 32, 5065, 3743, 13, 3, UNI_JG__MANICHAEANTAW } /* jg=manichaeantaw */, + { 0, 2335, 0, 13, 0, UNI_BLOCKELEMENTS } /* blockelements */, + { 24, 4424, 590, 17, 7, UNI_DSRT } /* scriptextensions=deseret */, + { 3, 4424, 810, 17, 4, UNI_SYRC } /* scriptextensions=syrc */, + { 0, 5637, 898, 20, 2, UNI_GCB__V } /* graphemeclusterbreak=v */, + { 3, 339, 0, 6, 0, UNI_CCC__12 } /* ccc=12 */, + { 0, 8311, 5252, 32, 4, UNI_CJKEXTE } /* block=cjkunifiedideographsextensione */, + { 5, 6165, 854, 3, 7, UNI_TAVT } /* sc=taiviet */, + { 0, 461, 4725, 2, 16, UNI_TANGUTSUP } /* istangutsupplement */, + { 4, 4424, 297, 17, 5, UNI_ORYA } /* scriptextensions=oriya */, + { 3, 3391, 1805, 14, 5, UNI_NV__200000 } /* numericvalue=200000 */, + { 4, 1102, 1262, 4, 4, UNI_SOYO } /* scx=soyo */, + { 6, 292, 1318, 3, 2, UNI_NV__20 } /* nv=20 */, + { 50, 2180, 1805, 4, 5, UNI_NV__400000 } /* nv=400000 */, + { 0, 597, 366, 3, 3, UNI_DT__SQR } /* dt=sqr */, + { 0, 470, 0, 4, 0, UNI_TNSA } /* tnsa */, + { 0, 7267, 2483, 16, 11, UNI_CASEDLETTER } /* generalcategory=casedletter */, + { 0, 1823, 1509, 7, 4, UNI_SC__JAVA } /* script=java */, + { 0, 7267, 1427, 15, 3, UNI_XPOSIXCNTRL } /* generalcategory=cc */, + { 1, 6165, 1978, 3, 4, UNI_SC__SOGD } /* sc=sogd */, + { 0, 1397, 2931, 3, 3, UNI_IDST } /* idst=t */, + { 1, 552, 2289, 3, 3, UNI_AGE__14 } /* age=14 */, + { 4, 1065, 763, 4, 3, UNI_NV__1_SLASH_64 } /* nv=1/64 */, + { 1, 7267, 50, 16, 2, UNI_MC } /* generalcategory=mc */, + { 1, 1823, 1255, 7, 4, UNI_SIDD } /* script=sidd */, + { 0, 3391, 2210, 12, 10, UNI_NV__7_SLASH_12 } /* numericvalue=5.833e-01 */, + { 2, 309, 1685, 2, 11, UNI_INCYPROMINOAN } /* incyprominoan */, + { 3, 3014, 394, 11, 2, UNI_IN__5_DOT_1 } /* presentin=v51 */, + { 2, 2324, 3583, 6, 16, UNI_HIGHPUSURROGATES } /* block=highpusurrogates */, + { 0, 6076, 2370, 7, 12, UNI_GREEKEXT } /* block=greekextended */, + { 2, 309, 6103, 2, 13, UNI_MATHOPERATORS } /* inmathoperators */, + { 0, 5574, 934, 21, 2, -UNI_CWL } /* changeswhenlowercased=f */, + { 0, 309, 192, 2, 4, UNI_TAGS } /* intags */, + { 129, 339, 0, 2, 0, UNI_XPOSIXCNTRL } /* cc */, + { 0, 1248, 0, 7, 0, UNI_PHAG } /* phagspa */, + { 0, 3817, 1071, 14, 4, UNI_NV__11_SLASH_12 } /* numericvalue=11/12 */, + { 3, 1667, 0, 4, 0, UNI_blk_values_index } /* blk= */, + { 25, 7648, 1162, 18, 6, UNI_DT__ENC } /* decompositiontype=circle */, + { 1, 461, 5460, 2, 19, UNI_TERM } /* isterminalpunctuation */, + { 0, 1479, 352, 4, 2, UNI_wspace_values_index } /* space= */, + { 0, 2842, 8111, 3, 31, UNI_EGYPTIANHIEROGLYPHFORMATCONTROLS } /* isegyptianhieroglyphformatcontrols */, + { 0, 1102, 4176, 4, 6, UNI_HANG } /* scx=hangul */, + { 0, 1823, 418, 7, 4, UNI_KHMR } /* script=khmr */, + { 6, 271, 248, 4, 2, UNI_GCB__CN } /* gcb=cn */, + { 64, 2324, 1592, 6, 10, UNI_INSAURASHTRA } /* block=saurashtra */, + { 43, 1205, 0, 4, 0, UNI_GRAN } /* gran */, + { 6, 1823, 1812, 7, 11, UNI_HMNG } /* script=pahawhhmong */, + { 6, 1823, 1133, 7, 4, UNI_VITH } /* script=vith */, + { 81, 1479, 584, 4, 3, UNI_XPOSIXSPACE } /* space=t */, + { 2, 1479, 933, 4, 7, -UNI_XPOSIXSPACE } /* space=false */, + { 5, 5637, 1887, 21, 7, UNI_GCB__CN } /* graphemeclusterbreak=control */, + { 17, 1823, 663, 7, 5, UNI_SC__LIMB } /* script=limbu */, + { 0, 608, 0, 7, 0, UNI_ELBA } /* elbasan */, + { 1, 5156, 3463, 10, 12, UNI_WB__EB } /* wordbreak=glueafterzwj */, + { 0, 1667, 4896, 4, 5, UNI_INBAMUM } /* blk=bamum */, + { 0, 3014, 344, 11, 2, UNI_IN__2_DOT_1 } /* presentin=v21 */, + { 2, 30, 1695, 1, 7, UNI_DOMINO } /* indomino */, + { 1, 461, 2780, 2, 6, UNI_COPT } /* iscoptic */, + { 2, 4424, 4089, 17, 4, UNI_SIND } /* scriptextensions=sind */, + { 0, 461, 7036, 2, 26, UNI_HALFANDFULLFORMS } /* ishalfwidthandfullwidthforms */, + { 0, 5065, 5425, 12, 8, UNI_JG__MANICHAEANDHAMEDH } /* jg=manichaeandhamedh */, + { 1, 2287, 389, 3, 3, UNI_IN__6_DOT_3 } /* in=6.3 */, + { 0, 2483, 274, 5, 1, UNI_cased_values_index } /* cased= */, + { 1, 5895, 4607, 12, 13, UNI_SUPPUNCTUATION } /* issupplementalpunctuation */, + { 3, 1667, 7855, 4, 32, UNI_INIDC } /* blk=ideographicdescriptioncharacters */, + { 0, 4827, 0, 18, 0, UNI_ZP } /* paragraphseparator */, + { 0, 1823, 1522, 7, 4, UNI_UGAR } /* script=ugar */, + { 4, 6165, 116, 3, 4, UNI_SC__KNDA } /* sc=knda */, + { 0, 461, 5801, 2, 19, UNI_SUPARROWSB } /* issupplementalarrowsb */, + { 4, 510, 290, 5, 1, UNI_NV__3_SLASH_4 } /* nv=3/4 */, + { 65, 7214, 520, 25, 1, UNI_CCC__17 } /* canonicalcombiningclass=17 */, + { 0, 552, 2182, 3, 4, UNI_AGE__4_DOT_1 } /* age=4.1 */, + { 0, 959, 353, 8, 2, UNI_EXT } /* extender=y */, + { 0, 6090, 4511, 13, 9, UNI_MYANMAREXTB } /* block=myanmarextendedb */, + { 4, 1667, 7972, 5, 29, UNI_CUNEIFORMNUMBERS } /* blk=cuneiformnumbersandpunctuation */, + { 0, 4424, 168, 17, 4, UNI_COPT } /* scriptextensions=qaac */, + { 0, 261, 599, 5, 3, -UNI_CWKCF } /* cwkcf=no */, + { 3, 2494, 6945, 5, 15, UNI_GEOMETRICSHAPESEXT } /* isgeometricshapesext */, + { 1, 2766, 248, 3, 2, UNI_CN } /* gc=cn */, + { 0, 8071, 4410, 30, 4, UNI_CJKEXTA } /* blk=cjkunifiedideographsextensiona */, + { 4, 2514, 7620, 3, 19, UNI_MISCSYMBOLS } /* ismiscellaneoussymbols */, + { 0, 1102, 2068, 4, 4, UNI_MEND } /* scx=mend */, + { 81, 1102, 818, 4, 7, UNI_SHRD } /* scx=sharada */, + { 4, 510, 1805, 4, 4, UNI_NV__30000 } /* nv=30000 */, + { 24, 5460, 0, 19, 0, UNI_TERM } /* terminalpunctuation */, + { 33, 505, 353, 5, 2, UNI_NFDQC__Y } /* nfdqc=y */, + { 2, 1102, 1358, 4, 9, UNI_PALM } /* scx=palmyrene */, + { 0, 1200, 6382, 3, 18, UNI_CJKCOMPATFORMS } /* cjkcompatibilityforms */, + { 4, 6450, 4191, 14, 5, UNI_SB__LO } /* sentencebreak=lower */, + { 0, 2432, 1553, 3, 9, UNI_MISCARROWS } /* inmiscarrows */, + { 17, 1243, 6080, 2, 10, UNI_INGEORGIAN } /* blk=georgian */, + { 1, 298, 599, 2, 3, -UNI_RI } /* ri=no */, + { 7, 2536, 1540, 3, 3, UNI_JG__YEH } /* jg=yeh */, + { 256, 4424, 779, 17, 4, UNI_OSMA } /* scriptextensions=osma */, + { 2, 6165, 1191, 3, 4, UNI_SC__BENG } /* sc=beng */, + { 4, 6236, 1805, 19, 7, UNI_NV__1000000000000 } /* numericvalue=1000000000000 */, + { 13, 5595, 353, 21, 4, UNI_CWT } /* changeswhentitlecased=yes */, + { 0, 2494, 2370, 3, 7, UNI_GREEKEXT } /* isgreekext */, + { 62, 7267, 4827, 16, 18, UNI_ZP } /* generalcategory=paragraphseparator */, + { 0, 7804, 341, 10, 2, UNI_ideo_values_index } /* ideographic= */, + { 2, 4970, 352, 16, 3, UNI_EBASE } /* emojimodifierbase=y */, + { 0, 8343, 3257, 31, 6, UNI_INSC__CONSONANTKILLER } /* indicsyllabiccategory=consonantkiller */, + { 0, 1823, 31, 7, 4, UNI_AVST } /* script=avst */, + { 0, 5156, 543, 10, 3, UNI_WB__EB } /* wordbreak=ebg */, + { 5, 5168, 1486, 17, 3, UNI__PERL_CHARNAME_BEGIN } /* _perl_charname_begin */, + { 0, 461, 5857, 2, 19, UNI_MONGOLIANSUP } /* ismongoliansupplement */, + { 1, 6165, 2811, 3, 5, UNI_KHMR } /* sc=khmer */, + { 0, 6163, 2613, 5, 6, UNI_LB__ZWJ } /* insc=joiner */, + { 2, 597, 1162, 3, 6, UNI_DT__ENC } /* dt=circle */, + { 1, 4519, 0, 18, 0, UNI_CYRILLICEXTC } /* block=cyrillicextc */, + { 14, 461, 7724, 2, 28, UNI_VSSUP } /* isvariationselectorssupplement */, + { 14, 2004, 248, 5, 5, UNI_POSIXCNTRL } /* posixcntrl */, + { 3, 4391, 2172, 14, 8, UNI_NV__3_SLASH_8 } /* numericvalue=3.750e-01 */, + { 1, 0, 3693, 1, 3, UNI_LISU } /* lisu */, + { 9, 2002, 4569, 7, 5, UNI_POSIXUPPER } /* isposixupper */, + { 0, 2324, 2441, 6, 11, UNI_INNANDINAGARI } /* block=nandinagari */, + { 86, 5769, 599, 4, 3, -UNI_EMOD } /* emod=no */, + { 4, 7724, 353, 17, 4, UNI_VS } /* variationselector=yes */, + { 0, 461, 909, 2, 4, UNI_BALI } /* isbali */, + { 0, 2403, 0, 4, 0, UNI_ETHI } /* ethi */, + { 1, 1102, 2441, 4, 4, UNI_NAND } /* scx=nand */, + { 0, 115, 0, 2, 0, UNI_SK } /* sk */, + { 1, 5979, 0, 3, 0, UNI_vo_values_index } /* vo= */, + { 0, 5574, 934, 21, 6, -UNI_CWL } /* changeswhenlowercased=false */, + { 40, 339, 289, 4, 1, UNI_CCC__0 } /* ccc=0 */, + { 1, 2180, 2657, 4, 8, UNI_NV__2_SLASH_5 } /* nv=4.000e-01 */, + { 0, 309, 7480, 2, 14, UNI_PUA } /* inprivateusearea */, + { 1, 7214, 288, 25, 2, UNI_CCC__130 } /* canonicalcombiningclass=130 */, + { 25, 1667, 5682, 4, 5, UNI_INGREEK } /* blk=greek */, + { 1, 461, 4060, 2, 15, UNI_BRAI } /* isbraillepatterns */, + { 0, 7804, 353, 11, 2, UNI_IDEO } /* ideographic=y */, + { 0, 1454, 934, 2, 2, -UNI_SD } /* sd=f */, + { 94, 7267, 115, 16, 2, UNI_SK } /* generalcategory=sk */, + { 0, 1667, 7480, 4, 14, UNI_PUA } /* blk=privateusearea */, + { 0, 5658, 6881, 15, 9, UNI_IDENTIFIERTYPE__EXCLUSION } /* identifiertype=exclusion */, + { 115, 1801, 1805, 7, 5, UNI_NV__100000000 } /* nv=100000000 */, + { 2, 1667, 3692, 4, 7, UNI_LISUSUP } /* blk=lisusup */, + { 0, 8343, 2382, 22, 5, UNI_INSC__VOWEL } /* indicsyllabiccategory=vowel */, + { 2, 1667, 6332, 4, 19, UNI_JAMOEXTB } /* blk=hanguljamoextendedb */, + { 0, 309, 1834, 2, 11, UNI_INSORASOMPENG } /* insorasompeng */, + { 1, 2324, 1509, 6, 8, UNI_INJAVANESE } /* block=javanese */, + { 1, 4391, 3876, 15, 2, UNI_NV__3_SLASH_80 } /* numericvalue=3/80 */, + { 0, 7495, 393, 27, 2, UNI_CCC__15 } /* canonicalcombiningclass=ccc15 */, + { 1, 461, 98, 2, 4, UNI_HLUW } /* ishluw */, + { 1, 6165, 176, 3, 4, UNI_SC__ROHG } /* sc=rohg */, + { 0, 5658, 6534, 10, 14, UNI_IDENTIFIERSTATUS__ALLOWED } /* identifierstatus=allowed */, + { 0, 339, 2742, 4, 4, UNI_CCC__6 } /* ccc=hanr */, + { 0, 3490, 7467, 12, 13, UNI_CYRILLICSUP } /* blk=cyrillicsupplementary */, + { 3, 1667, 1322, 4, 9, UNI_INOLDITALIC } /* blk=olditalic */, + { 1, 4424, 4060, 17, 7, UNI_BRAI } /* scriptextensions=braille */, + { 2, 1102, 1205, 4, 4, UNI_GRAN } /* scx=gran */, + { 2, 3391, 2108, 13, 3, UNI_NV__500 } /* numericvalue=500 */, + { 1, 716, 7443, 4, 24, UNI_KATAKANAEXT } /* inkatakanaphoneticextensions */, + { 0, 423, 24, 3, 3, UNI_INAHOM } /* inahom */, + { 0, 1728, 8174, 6, 29, UNI_ARABICMATH } /* arabicmathematicalalphabeticsymbols */, + { 0, 4424, 917, 17, 8, UNI_BASS } /* scriptextensions=bassavah */, + { 0, 2432, 6597, 3, 21, UNI_MISCTECHNICAL } /* inmiscellaneoustechnical */, + { 0, 309, 6900, 2, 14, UNI_BYZANTINEMUSIC } /* inbyzantinemusic */, + { 0, 6841, 8505, 23, 3, UNI_di_values_index } /* defaultignorablecodepoint= */, + { 7, 253, 585, 4, 5, UNI_CWCF } /* cwcf=true */, + { 0, 339, 3141, 4, 11, UNI_CCC__DA } /* ccc=doubleabove */, + { 22, 6450, 2968, 14, 3, UNI_SB__SE } /* sentencebreak=sep */, + { 1, 2525, 0, 11, 0, UNI_XPOSIXBLANK } /* xposixblank */, + { 1, 2832, 4511, 10, 9, UNI_CYRILLICEXTB } /* iscyrillicextendedb */, + { 85, 309, 333, 2, 6, UNI_INCARIAN } /* incarian */, + { 2, 2280, 2199, 11, 3, UNI_IN__12 } /* presentin=12.0 */, + { 3, 6165, 3475, 3, 15, UNI_ZANB } /* sc=zanabazarsquare */, + { 17, 461, 1027, 2, 6, UNI_YEZI } /* isyezidi */, + { 86, 2732, 649, 5, 4, UNI_INADLAM } /* blk=adlam */, + { 4, 1102, 152, 4, 4, UNI_OSGE } /* scx=osge */, + { 0, 461, 4725, 2, 9, UNI_TANGUTSUP } /* istangutsup */, + { 3, 309, 6495, 2, 5, UNI_MUSIC } /* inmusic */, + { 0, 5216, 6957, 11, 9, UNI_LATINEXTE } /* block=latinextendede */, + { 0, 10, 2046, 1, 11, UNI_GONM } /* masaramgondi */, + { 70, 5895, 5878, 4, 17, UNI_SUNDANESESUP } /* issundanesesupplement */, + { 8, 2536, 4228, 3, 7, UNI_JG__HEHGOAL } /* jg=hehgoal */, + { 2, 375, 934, 5, 6, -UNI_GREXT } /* grext=false */, + { 1, 461, 426, 2, 4, UNI_MRO } /* ismroo */, + { 5, 1243, 995, 2, 3, UNI_XPOSIXBLANK } /* blank */, + { 0, 4360, 309, 10, 2, UNI_LB__IN } /* linebreak=in */, + { 17, 4852, 584, 9, 6, UNI_XPOSIXSPACE } /* whitespace=true */, + { 1, 4360, 1933, 10, 9, UNI_LB__AI } /* linebreak=ambiguous */, + { 1, 8667, 0, 18, 0, UNI_CANS } /* canadianaboriginal */, + { 2, 309, 216, 2, 4, UNI_INTOTO } /* intoto */, + { 2, 461, 43, 2, 4, UNI_BUHD } /* isbuhd */, + { 20, 2432, 2046, 3, 11, UNI_INMASARAMGONDI } /* inmasaramgondi */, + { 0, 1823, 1086, 7, 4, UNI_SC__KTHI } /* script=kthi */, + { 2, 2514, 4511, 9, 9, UNI_MYANMAREXTB } /* ismyanmarextendedb */, + { 0, 1397, 0, 7, 0, UNI_IDS } /* idstart */, + { 4, 1667, 6103, 4, 13, UNI_MATHOPERATORS } /* blk=mathoperators */, + { 1, 3098, 598, 7, 4, -UNI_XPOSIXXDIGIT } /* hexdigit=no */, + { 0, 461, 422, 2, 4, UNI_LINA } /* islina */, + { 0, 4424, 474, 17, 4, UNI_VAI } /* scriptextensions=vaii */, + { 2, 3407, 290, 14, 1, UNI_NV__44 } /* numericvalue=44 */, + { 0, 7752, 4251, 23, 4, UNI_JG__MANICHAEANQOPH } /* joininggroup=manichaeanqoph */, + { 0, 406, 353, 3, 2, UNI_DIA } /* dia=y */, + { 6, 225, 0, 2, 0, UNI_PE } /* pe */, + { 0, 6090, 4636, 7, 15, UNI_MISCMATHSYMBOLSB } /* block=miscmathsymbolsb */, + { 0, 2324, 1572, 6, 10, UNI_INOLDPERSIAN } /* block=oldpersian */, + { 4, 461, 3040, 2, 13, UNI_QMARK } /* isquotationmark */, + { 1, 6618, 0, 8, 0, UNI_INPC__TOP } /* inpc=top */, + { 0, 6165, 474, 3, 4, UNI_VAI } /* sc=vaii */, + { 0, 1823, 1562, 7, 10, UNI_NAGM } /* script=nagmundari */, + { 0, 2324, 7467, 6, 28, UNI_SUPPUAA } /* block=supplementaryprivateuseareaa */, + { 2, 1102, 1779, 4, 11, UNI_MEDF } /* scx=medefaidrin */, + { 0, 461, 434, 2, 4, UNI_OGAM } /* isogam */, + { 3, 1272, 3163, 3, 14, UNI_CONTROLPICTURES } /* iscontrolpictures */, + { 0, 2002, 1079, 3, 7, UNI_POSIXWORD } /* isperlword */, + { 4, 2842, 6193, 8, 5, UNI_ETHIOPICSUP } /* isethiopicsup */, + { 0, 1823, 3026, 7, 14, UNI_SC__PHLP } /* script=psalterpahlavi */, + { 0, 2324, 4651, 6, 11, UNI_BOPOMOFOEXT } /* block=bopomofoext */, + { 1, 1376, 0, 9, 0, UNI_SAMR } /* samaritan */, + { 6, 4360, 272, 10, 2, UNI_LB__CB } /* linebreak=cb */, + { 1, 7267, 4191, 16, 15, UNI_LOWERCASELETTER } /* generalcategory=lowercaseletter */, + { 65, 339, 0, 4, 0, UNI_ccc_values_index } /* ccc= */, + { 0, 461, 608, 2, 4, UNI_ELBA } /* iselba */, + { 6, 292, 1070, 3, 2, UNI_NV__31 } /* nv=31 */, + { 12, 1424, 288, 7, 2, UNI_CCC__30 } /* ccc=ccc30 */, + { 0, 1823, 43, 7, 4, UNI_SC__BUHD } /* script=buhd */, + { 8, 1823, 78, 7, 4, UNI_DSRT } /* script=dsrt */, + { 4, 3984, 934, 17, 6, -UNI_EPRES } /* emojipresentation=false */, + { 16, 3892, 353, 16, 2, UNI_STERM } /* sentenceterminal=y */, + { 0, 1255, 0, 7, 0, UNI_SIDD } /* siddham */, + { 2, 7011, 689, 24, 3, UNI_CCC__214 } /* canonicalcombiningclass=ata */, + { 6, 3391, 345, 13, 2, UNI_NV__18 } /* numericvalue=18 */, + { 2, 4424, 991, 17, 6, UNI_HATR } /* scriptextensions=hatran */, + { 1, 3391, 388, 13, 2, UNI_NV__26 } /* numericvalue=26 */, + { 2, 2536, 4221, 3, 14, UNI_JG__HAMZAONHEHGOAL } /* jg=hamzaonhehgoal */, + { 36, 1823, 917, 7, 8, UNI_BASS } /* script=bassavah */, + { 10, 309, 5448, 2, 3, UNI_PUA } /* inpua */, + { 0, 154, 6945, 3, 20, UNI_GEOMETRICSHAPESEXT } /* geometricshapesextended */, { 0, 1102, 1144, 4, 9, UNI_BHKS } /* scx=bhaiksuki */, - { 0, 6749, 934, 25, 6, -UNI_CWKCF } /* changeswhennfkccasefolded=false */, - { 2240, 7823, 4464, 5, 4, UNI_CJKEXTC } /* incjkextc */, - { 8, 8276, 7627, 31, 16, UNI_INSC__CONSONANTINITIALPOSTFIXED } /* indicsyllabiccategory=consonantinitialpostfixed */, - { 1, 343, 2065, 4, 2, UNI_CCC__25 } /* ccc=25 */, - { 642, 3351, 1071, 13, 4, UNI_NV__1_SLASH_12 } /* numericvalue=1/12 */, - { 3, 58, 4998, 2, 5, UNI_SC__MANI } /* sc=mani */, - { 2, 3338, 356, 13, 2, UNI_NFDQC__Y } /* nfdquickcheck=y */, - { 812, 1102, 4107, 4, 6, UNI_HANG } /* scx=hangul */, - { 3, 2392, 7761, 3, 30, UNI_MATHALPHANUM } /* inmathematicalalphanumericsymbols */, - { 2, 3593, 4701, 15, 10, UNI_LATINEXTADDITIONAL } /* inlatinextendedadditional */, - { 1160, 1796, 951, 7, 4, UNI_SC__DUPL } /* script=dupl */, - { 273, 464, 825, 2, 7, UNI_SHAW } /* isshavian */, - { 1, 2443, 602, 5, 3, -UNI_CASED } /* cased=no */, - { 128, 5748, 5080, 5, 7, UNI_SUPARROWSA } /* insuparrowsa */, - { 0, 6944, 772, 24, 2, UNI_CCC__17 } /* canonicalcombiningclass=17 */, - { 600, 313, 1248, 2, 7, UNI_INSIDDHAM } /* insiddham */, - { 2412, 8007, 6309, 7, 13, UNI_CJKCOMPAT } /* blk=cjkcompatibility */, - { 18, 5787, 4442, 10, 9, UNI_JAMOEXTB } /* hanguljamoextendedb */, - { 322, 5, 1183, 1, 8, UNI_EMOTICONS } /* emoticons */, - { 31, 1102, 1255, 4, 7, UNI_SOYO } /* scx=soyombo */, - { 0, 4355, 106, 17, 4, UNI_HMNG } /* scriptextensions=hmng */, - { 142, 1075, 1298, 4, 5, UNI_NV__216000 } /* nv=216000 */, - { 3075, 4291, 5, 10, 2, UNI_LB__EX } /* linebreak=ex */, - { 24, 1009, 0, 6, 0, UNI_LYCI } /* lycian */, - { 3, 1856, 0, 11, 0, UNI_BIDIC } /* bidicontrol */, - { 0, 2485, 2033, 6, 5, UNI_XPOSIXALPHA } /* xposixalpha */, - { 0, 1879, 360, 4, 6, UNI_INCHAKMA } /* blk=chakma */, - { 3, 464, 156, 2, 4, UNI_OUGR } /* isougr */, - { 9, 6842, 0, 14, 0, UNI_MUSIC } /* musicalsymbols */, - { 0, 1353, 0, 4, 0, UNI_PAUC } /* pauc */, - { 7, 313, 540, 2, 6, UNI_INTANGSA } /* intangsa */, - { 0, 464, 4485, 2, 5, UNI_TITLE } /* istitle */, - { 13, 1879, 5806, 4, 12, UNI_MONGOLIANSUP } /* blk=mongoliansup */, - { 0, 3474, 2760, 7, 11, UNI_ALPHABETICPF } /* block=alphabeticpf */, - { 1333, 2726, 103, 3, 2, UNI_UPPERCASELETTER } /* gc=lu */, - { 2, 6114, 6594, 3, 6, UNI_BRAH } /* sc=brahmi */, - { 0, 1102, 868, 4, 7, UNI_TIRH } /* scx=tirhuta */, - { 250, 7823, 2335, 4, 5, UNI_CJKEXTE } /* incjkexte */, - { 0, 313, 1542, 2, 6, UNI_ARROWS } /* inarrows */, - { 1, 1102, 4998, 3, 5, UNI_MANI } /* scx=mani */, - { 1, 464, 868, 2, 4, UNI_TIRH } /* istirh */, - { 5, 1796, 148, 7, 4, UNI_SC__ORYA } /* script=orya */, - { 90, 7660, 0, 28, 0, UNI_VSSUP } /* variationselectorssupplement */, - { 2109, 7201, 103, 16, 2, UNI_UPPERCASELETTER } /* generalcategory=lu */, - { 2, 8276, 5045, 22, 10, UNI_INSC__TONELETTER } /* indicsyllabiccategory=toneletter */, - { 1, 6114, 1927, 3, 12, UNI_SC__GONG } /* sc=gunjalagondi */, - { 0, 1102, 637, 4, 7, UNI_HANO } /* scx=hanunoo */, - { 2589, 4291, 546, 10, 2, UNI_EBASE } /* linebreak=eb */, - { 129, 632, 355, 5, 3, UNI_GRBASE } /* grbase=y */, - { 0, 625, 588, 7, 5, UNI_EXTPICT } /* extpict=true */, - { 2141, 3474, 783, 6, 7, UNI_INOSMANYA } /* block=osmanya */, - { 1, 1383, 934, 7, 2, -UNI_IDS } /* idstart=f */, - { 3235, 8244, 1698, 9, 4, UNI_CJKEXTF } /* block=cjkextf */, - { 0, 464, 2275, 2, 3, UNI_IDC } /* isidc */, - { 0, 5586, 0, 21, 0, UNI_gcb_values_index } /* graphemeclusterbreak= */, - { 0, 6114, 3498, 3, 7, UNI_SC__CPRT } /* sc=cypriot */, - { 71, 378, 601, 4, 3, -UNI_GREXT } /* grext=n */, - { 2848, 23, 934, 4, 2, -UNI_POSIXXDIGIT } /* ahex=f */, - { 38, 464, 618, 2, 4, UNI_ELYM } /* iselym */, - { 0, 464, 1205, 2, 9, UNI_QAAI } /* isinherited */, - { 0, 7132, 1256, 5, 6, UNI_INSOYOMBO } /* blk=soyombo */, - { 1, 3474, 0, 12, 0, UNI_INARABIC } /* block=arabic */, - { 0, 3474, 4842, 6, 15, UNI_DIACRITICALSSUP } /* block=diacriticalssup */, - { 308, 2355, 4442, 8, 9, UNI_CYRILLICEXTB } /* cyrillicextendedb */, - { 4, 3593, 4629, 6, 12, UNI_LATIN1 } /* inlatin1supplement */, - { 0, 1065, 1298, 5, 3, UNI_NV__1_SLASH_160 } /* nv=1/160 */, - { 8, 6112, 5045, 5, 10, UNI_INSC__TONELETTER } /* insc=toneletter */, - { 4103, 1382, 601, 7, 3, -UNI_XIDS } /* xidstart=n */, - { 4, 8533, 6623, 7, 21, UNI_MODIFIERLETTERS } /* block=spacingmodifierletters */, - { 0, 1102, 5389, 4, 20, UNI_HMNP } /* scx=nyiakengpuachuehmong */, - { 3, 3593, 5797, 7, 9, UNI_LATINEXTA } /* inlatinextendeda */, - { 2575, 244, 0, 4, 0, UNI_ZYYY } /* zyyy */, - { 0, 7068, 602, 26, 2, -UNI_PCM } /* prependedconcatenationmark=n */, - { 0, 6379, 1723, 13, 8, UNI_JG__FARSIYEH } /* joininggroup=farsiyeh */, - { 7, 7317, 91, 11, 2, UNI_BC__LRE } /* bidiclass=lre */, - { 3, 6039, 2382, 7, 10, UNI_MISCSYMBOLS } /* block=miscsymbols */, - { 0, 1710, 7238, 3, 24, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* issymbolsandpictographsexta */, - { 474, 1702, 1491, 8, 4, UNI_ARABICEXTA } /* isarabicexta */, - { 26, 6944, 8037, 24, 10, UNI_CCC__BR } /* canonicalcombiningclass=belowright */, - { 1, 1975, 1465, 7, 5, UNI_POSIXSPACE } /* isposixspace */, - { 0, 756, 1768, 3, 5, UNI_NFCQC__M } /* nfkcqc=m */, - { 0, 887, 6214, 5, 3, UNI_AGE__12_DOT_1 } /* age=12.1 */, - { 0, 7, 201, 1, 3, UNI_TAML } /* taml */, - { 262, 4355, 3933, 17, 4, UNI_MODI } /* scriptextensions=modi */, - { 0, 5844, 6052, 5, 13, UNI_SUPMATHOPERATORS } /* issupmathoperators */, - { 0, 2726, 12, 3, 2, UNI_PC } /* gc=pc */, - { 1, 4122, 5620, 8, 3, -UNI_XPOSIXLOWER } /* lowercase=n */, - { 2244, 7880, 6509, 5, 16, UNI_CJKCOMPATIDEOGRAPHS } /* iscjkcompatideographs */, - { 1, 2, 601, 2, 3, -UNI_CWT } /* cwt=n */, - { 1, 4726, 1781, 14, 4, UNI_NV__60000 } /* numericvalue=60000 */, - { 1121, 313, 5284, 2, 20, UNI_ININSCRIPTIONALPAHLAVI } /* ininscriptionalpahlavi */, - { 12, 4355, 806, 17, 4, UNI_SARB } /* scriptextensions=sarb */, - { 1, 1796, 433, 7, 4, UNI_SC__NKO } /* script=nkoo */, - { 1, 1551, 0, 10, 0, UNI_XPEO } /* oldpersian */, - { 306, 5389, 0, 20, 0, UNI_HMNP } /* nyiakengpuachuehmong */, - { 8, 632, 355, 5, 5, UNI_GRBASE } /* grbase=yes */, - { 12, 2275, 602, 3, 2, -UNI_IDC } /* idc=n */, - { 0, 2454, 4913, 3, 5, UNI_GRBASE } /* isgrbase */, - { 0, 7317, 6241, 9, 21, UNI_BC__LRE } /* bidiclass=lefttorightembedding */, - { 0, 8533, 5080, 18, 7, UNI_SUPARROWSA } /* block=supplementalarrowsa */, - { 29, 508, 356, 5, 2, UNI_NFDQC__Y } /* nfdqc=y */, - { 2184, 1879, 3396, 4, 15, UNI_SARB } /* blk=oldsoutharabian */, - { 2, 4021, 6538, 5, 11, UNI_INDICNUMBERFORMS } /* indicnumberforms */, - { 2050, 1796, 4882, 7, 4, UNI_EGYP } /* script=egyp */, - { 0, 1837, 0, 5, 0, UNI_EBASE } /* ebase */, - { 0, 1102, 106, 4, 4, UNI_HMNG } /* scx=hmng */, - { 0, 383, 356, 6, 2, UNI_HYPHEN } /* hyphen=y */, - { 2, 1410, 349, 7, 2, UNI_CCC__84 } /* ccc=ccc84 */, - { 0, 2260, 6214, 4, 3, UNI_IN__12_DOT_1 } /* in=12.1 */, - { 1, 2792, 7403, 10, 13, UNI_CYRILLICSUP } /* iscyrillicsupplementary */, - { 2177, 1174, 21, 3, 1, UNI_EA__H } /* ea=h */, - { 512, 7527, 4581, 3, 2, UNI_LB__BB } /* lb=bb */, - { 5, 4500, 355, 8, 5, UNI_XPOSIXUPPER } /* uppercase=yes */, - { 0, 7208, 330, 9, 2, UNI_PF } /* category=pf */, - { 0, 1216, 4442, 4, 9, UNI_KANAEXTB } /* kanaextendedb */, - { 2067, 3474, 337, 6, 6, UNI_INCARIAN } /* block=carian */, - { 6, 8007, 8089, 7, 21, UNI_CJKSYMBOLS } /* blk=cjksymbolsandpunctuation */, - { 0, 1704, 5797, 6, 9, UNI_ARABICEXTA } /* arabicextendeda */, - { 1077, 2274, 3361, 9, 3, UNI_xidc_values_index } /* xidcontinue= */, - { 0, 3991, 0, 4, 0, UNI_BRAI } /* brai */, - { 17, 2726, 229, 3, 2, UNI_PE } /* gc=pe */, - { 393, 265, 934, 5, 2, -UNI_CWKCF } /* cwkcf=f */, - { 1, 844, 0, 2, 0, UNI_LO } /* lo */, - { 0, 1991, 0, 12, 0, UNI_jt_values_index } /* joiningtype= */, - { 266, 464, 802, 2, 4, UNI_NBAT } /* isnbat */, - { 2, 2625, 602, 13, 3, -UNI_PATSYN } /* patternsyntax=no */, - { 112, 34, 310, 1, 6, UNI_XPOSIXPRINT } /* isprint */, - { 0, 1879, 8551, 4, 21, UNI_MATHOPERATORS } /* blk=mathematicaloperators */, + { 0, 5937, 934, 21, 2, -UNI__PERL_NCHAR } /* noncharactercodepoint=f */, + { 0, 6618, 0, 5, 0, UNI_inpc_values_index } /* inpc= */, + { 0, 4043, 585, 17, 5, UNI_IDSB } /* idsbinaryoperator=true */, + { 1, 6427, 702, 20, 4, UNI_JG__AFRICANNOON } /* joininggroup=africannoon */, + { 5, 533, 4, 3, 2, UNI_SB__LO } /* sb=lo */, + { 5, 4424, 2811, 17, 5, UNI_KHMR } /* scriptextensions=khmer */, + { 2, 461, 7537, 2, 10, UNI_XPOSIXALPHA } /* isalphabetic */, + { 12, 6287, 6021, 14, 8, UNI_BC__LRO } /* bc=lefttorightoverride */, + { 0, 7011, 582, 25, 2, UNI_CCC__BR } /* canonicalcombiningclass=222 */, + { 2, 7274, 326, 9, 2, UNI_PF } /* category=pf */, + { 1, 4391, 394, 15, 1, UNI_NV__3_SLASH_5 } /* numericvalue=3/5 */, + { 0, 5065, 4267, 13, 4, UNI_JG__MANICHAEANTETH } /* jg=manichaeanteth */, + { 132, 5185, 0, 20, 0, UNI_HLUW } /* anatolianhieroglyphs */, + { 3, 1492, 5863, 7, 13, UNI_GEORGIANSUP } /* ingeorgiansupplement */, + { 5, 461, 840, 2, 7, UNI_TGLG } /* istagalog */, + { 12, 271, 4369, 2, 2, UNI_Z } /* gc=z */, + { 1, 1894, 599, 5, 3, -UNI_BIDIM } /* bidim=no */, + { 1, 4360, 543, 10, 2, UNI_EBASE } /* linebreak=eb */, + { 3, 324, 5813, 3, 7, UNI_SUPARROWSB } /* suparrowsb */, + { 9, 2348, 933, 12, 3, -UNI_CI } /* caseignorable=f */, + { 1, 6165, 369, 3, 4, UNI_GOTH } /* sc=goth */, + { 9, 2523, 1942, 8, 5, UNI_XPOSIXGRAPH } /* isxposixgraph */, + { 33, 204, 84, 2, 2, UNI_TFNG } /* tfng */, + { 2, 7591, 380, 3, 6, UNI_LB__HY } /* lb=hyphen */, + { 7, 266, 353, 3, 2, UNI_CWT } /* cwt=y */, + { 17, 5283, 0, 9, 0, UNI_HALFMARKS } /* halfmarks */, + { 0, 461, 1303, 2, 9, UNI_TALU } /* isnewtailue */, + { 2, 2324, 2852, 6, 12, UNI_MAHJONG } /* block=mahjongtiles */, + { 0, 292, 345, 3, 2, UNI_NV__18 } /* nv=18 */, + { 0, 309, 4862, 2, 4, UNI_RUMI } /* inrumi */, + { 18, 6870, 599, 20, 2, -UNI_CE } /* compositionexclusion=n */, + { 0, 5616, 934, 21, 2, -UNI_CWU } /* changeswhenuppercased=f */, + { 26, 1102, 1003, 4, 4, UNI_LEPC } /* scx=lepc */, + { 2, 6165, 634, 3, 7, UNI_SC__HANO } /* sc=hanunoo */, + { 4, 1667, 32, 4, 2, UNI_INVS } /* blk=vs */, + { 6, 309, 426, 2, 3, UNI_INMRO } /* inmro */, + { 2, 1065, 891, 5, 2, UNI_NV__1_SLASH_10 } /* nv=1/10 */, + { 8, 2324, 3938, 7, 16, UNI_UCAS } /* block=canadiansyllabics */, + { 4, 4424, 794, 17, 4, UNI_LANA } /* scriptextensions=lana */, + { 2, 461, 6000, 2, 21, UNI_YIJING } /* isyijinghexagramsymbols */, + { 0, 4569, 0, 5, 0, UNI_XPOSIXUPPER } /* upper */, + { 1, 1667, 1505, 7, 4, UNI_CJKEXTA } /* blk=cjkexta */, + { 2, 30, 1384, 1, 7, UNI_INTHAANA } /* inthaana */, + { 0, 370, 6683, 3, 8, UNI_LO } /* otherletter */, + { 1, 309, 1501, 2, 8, UNI_JAMOEXTA } /* injamoexta */, + { 3, 461, 794, 2, 4, UNI_LANA } /* islana */, + { 1, 1667, 1033, 4, 8, UNI_JAMOEXTB } /* blk=jamoextb */, + { 1, 1667, 4926, 4, 5, UNI_INTAMIL } /* blk=tamil */, + { 6, 248, 0, 5, 0, UNI_XPOSIXCNTRL } /* cntrl */, + { 0, 4360, 18, 10, 2, UNI_LB__BA } /* linebreak=ba */, + { 8, 309, 1234, 2, 7, UNI_INMULTANI } /* inmultani */, + { 1, 1424, 7239, 7, 2, UNI_CCC__28 } /* ccc=ccc28 */, + { 5, 461, 6185, 2, 13, UNI_GLAGOLITICSUP } /* isglagoliticsup */, + { 1, 339, 389, 5, 1, UNI_CCC__16 } /* ccc=16 */, + { 1, 6692, 0, 22, 0, UNI_TRANSPORTANDMAP } /* transportandmapsymbols */, + { 0, 5065, 0, 19, 0, UNI_JG__MANICHAEANTWENTY } /* jg=manichaeantwenty */, + { 15, 8311, 4410, 32, 4, UNI_CJKEXTA } /* block=cjkunifiedideographsextensiona */, + { 99, 30, 4553, 1, 16, UNI_TITLE } /* istitlecaseletter */, + { 2, 292, 1153, 3, 2, UNI_NV__24 } /* nv=24 */, + { 0, 32, 934, 2, 6, -UNI_VS } /* vs=false */, + { 5, 887, 0, 6, 0, UNI_AGE__10 } /* age=10 */, + { 0, 461, 4951, 2, 4, UNI_EGYP } /* isegyp */, + { 0, 4391, 346, 14, 1, UNI_NV__38 } /* numericvalue=38 */, + { 1, 271, 2720, 3, 3, UNI_RI } /* gcb=ri */, + { 1, 1667, 1696, 4, 11, UNI_DOMINO } /* blk=dominotiles */, + { 0, 30, 867, 1, 8, UNI_INTIRHUTA } /* intirhuta */, + { 2, 375, 598, 4, 2, UNI_grext_values_index } /* grext= */, + { 4, 2280, 563, 10, 3, UNI_IN__8 } /* presentin=8.0 */, + { 11, 1667, 6677, 4, 15, UNI_MODIFIERLETTERS } /* blk=modifierletters */, + { 5, 1667, 6900, 4, 14, UNI_BYZANTINEMUSIC } /* blk=byzantinemusic */, + { 0, 4424, 4487, 17, 6, UNI_ZYYY } /* scriptextensions=common */, + { 15, 461, 683, 2, 5, UNI_TAKR } /* istakri */, + { 1, 461, 117, 2, 2, UNI_XPOSIXDIGIT } /* isnd */, + { 0, 1823, 1098, 7, 4, UNI_NSHU } /* script=nshu */, + { 46, 1102, 188, 4, 4, UNI_SGNW } /* scx=sgnw */, + { 1, 461, 3649, 2, 14, UNI_PHONETICEXTSUP } /* isphoneticextsup */, + { 0, 2287, 2154, 3, 2, UNI_IN__13 } /* in=13 */, + { 2, 940, 585, 6, 5, UNI_COMPEX } /* compex=true */, + { 0, 309, 6487, 2, 13, UNI_ZNAMENNYMUSIC } /* inznamennymusic */, + { 1, 2324, 917, 6, 8, UNI_INBASSAVAH } /* block=bassavah */, + { 0, 1391, 3001, 3, 7, UNI_WB__NU } /* wb=numeric */, + { 14, 5216, 3773, 7, 15, UNI_LINEARBIDEOGRAMS } /* block=linearbideograms */, + { 1, 4002, 0, 4, 0, UNI_MODI } /* modi */, + { 8, 1455, 585, 3, 2, UNI_DEP } /* dep=t */, + { 36, 1823, 718, 7, 7, UNI_SC__KNDA } /* script=kannada */, + { 0, 4146, 0, 15, 0, UNI_PD } /* dashpunctuation */, + { 2, 2324, 951, 6, 8, UNI_INDUPLOYAN } /* block=duployan */, + { 0, 271, 6, 4, 2, UNI_LB__CR } /* gcb=cr */, + { 4, 7887, 4680, 28, 4, UNI_CJKEXTF } /* incjkunifiedideographsextensionf */, + { 23, 2324, 3649, 6, 11, UNI_PHONETICEXT } /* block=phoneticext */, + { 1, 5156, 2292, 10, 9, UNI_WB__WSEGSPACE } /* wordbreak=wsegspace */, + { 2, 1883, 599, 11, 3, -UNI_BIDIC } /* bidicontrol=no */, + { 1, 2324, 4075, 6, 15, UNI_CURRENCYSYMBOLS } /* block=currencysymbols */, + { 1, 2324, 333, 6, 6, UNI_INCARIAN } /* block=carian */, + { 8, 1102, 208, 4, 4, UNI_TGLG } /* scx=tglg */, + { 80, 6618, 2719, 3, 7, UNI_INPC__RIGHT } /* inpc=right */, + { 4, 2324, 1209, 6, 4, UNI_INTHAI } /* block=thai */, + { 0, 1102, 6642, 4, 6, UNI_BRAH } /* scx=brahmi */, + { 0, 4424, 5185, 17, 20, UNI_HLUW } /* scriptextensions=anatolianhieroglyphs */, + { 2, 1823, 810, 7, 4, UNI_SC__SYRC } /* script=syrc */, + { 1, 4424, 1572, 17, 10, UNI_XPEO } /* scriptextensions=oldpersian */, + { 3, 21, 5820, 1, 15, UNI_ENCLOSEDALPHANUM } /* enclosedalphanum */, + { 0, 3014, 1070, 11, 2, UNI_IN__3_DOT_1 } /* presentin=v31 */, + { 8, 7591, 9, 3, 2, UNI_LB__CM } /* lb=cm */, + { 0, 2280, 386, 10, 3, UNI_IN__3_DOT_2 } /* presentin=3.2 */, + { 0, 1102, 1522, 4, 4, UNI_UGAR } /* scx=ugar */, + { 0, 5205, 8039, 5, 32, UNI_MISCMATHSYMBOLSA } /* blk=miscellaneousmathematicalsymbolsa */, + { 3, 3391, 2656, 13, 9, UNI_NV__1_SLASH_2 } /* numericvalue=5.000e-01 */, + { 0, 1667, 3349, 4, 15, UNI_INMEROITICCURSIVE } /* blk=meroiticcursive */, + { 0, 1894, 0, 12, 0, UNI_BIDIM } /* bidimirrored */, + { 0, 339, 6328, 4, 3, UNI_CCC__202 } /* ccc=atb */, + { 0, 30, 1695, 1, 12, UNI_DOMINO } /* indominotiles */, + { 2, 2525, 4150, 6, 5, UNI_XPOSIXPUNCT } /* xposixpunct */, + { 58, 2324, 1331, 6, 9, UNI_INOLDPERMIC } /* block=oldpermic */, + { 0, 4424, 184, 17, 4, UNI_SAMR } /* scriptextensions=samr */, + { 9, 309, 3692, 2, 14, UNI_LISUSUP } /* inlisusupplement */, + { 0, 7495, 2165, 28, 2, UNI_WB__EB } /* canonicalcombiningclass=ccc133 */, + { 0, 4424, 732, 17, 7, UNI_LINA } /* scriptextensions=lineara */, + { 0, 7267, 2815, 20, 7, UNI_SO } /* generalcategory=othersymbol */, + { 15, 6165, 172, 3, 4, UNI_RJNG } /* sc=rjng */, + { 0, 2280, 2222, 9, 4, UNI_IN__6_DOT_2 } /* presentin=6.2 */, + { 2, 7011, 2154, 24, 2, UNI_CCC__13 } /* canonicalcombiningclass=13 */, + { 0, 2988, 353, 13, 2, UNI_NFCQC__Y } /* nfcquickcheck=y */, + { 0, 7591, 184, 3, 2, UNI_LB__SA } /* lb=sa */, + { 6, 1823, 3663, 7, 4, UNI_SC__DEVA } /* script=deva */, + { 1, 1102, 43, 4, 4, UNI_BUHD } /* scx=buhd */, + { 20, 1823, 1978, 7, 7, UNI_SC__SOGD } /* script=sogdian */, + { 5, 1198, 5694, 3, 18, UNI_COUNTINGROD } /* incountingrodnumerals */, + { 1, 1011, 934, 2, 6, -UNI_CI } /* ci=false */, + { 0, 2324, 1144, 6, 9, UNI_INBHAIKSUKI } /* block=bhaiksuki */, + { 1, 7011, 5523, 24, 9, UNI_CCC__BL } /* canonicalcombiningclass=belowleft */, + { 0, 7495, 1316, 28, 2, UNI_CCC__103 } /* canonicalcombiningclass=ccc103 */, + { 0, 2324, 868, 6, 7, UNI_INTIRHUTA } /* block=tirhuta */, + { 1, 7011, 3403, 23, 3, UNI_CCC__23 } /* canonicalcombiningclass=23 */, + { 0, 916, 5671, 4, 4, -UNI_EBASE } /* ebase=no */, + { 10, 1942, 933, 11, 3, -UNI_GRBASE } /* graphemebase=f */, + { 1, 3954, 0, 17, 0, UNI_AGHB } /* caucasianalbanian */, + { 0, 7198, 4607, 14, 13, UNI_SUPPUNCTUATION } /* blk=supplementalpunctuation */, + { 0, 1075, 2107, 4, 8, UNI_NV__5_SLASH_2 } /* nv=2.500e+00 */, + { 32, 2, 585, 3, 2, UNI_CWL } /* cwl=t */, + { 1, 597, 324, 3, 3, UNI_DT__SUP } /* dt=sup */, + { 2, 7274, 4191, 9, 15, UNI_LOWERCASELETTER } /* category=lowercaseletter */, + { 20, 1272, 6557, 5, 19, UNI_CJKCOMPATIDEOGRAPHSSUP } /* iscjkcompatideographssup */, + { 137, 1883, 353, 11, 2, UNI_BIDIC } /* bidicontrol=y */, + { 2, 1198, 2373, 4, 5, UNI_CJKEXTE } /* incjkexte */, + { 3, 641, 1874, 7, 8, UNI_LB__H3 } /* hst=lvtsyllable */, + { 0, 375, 598, 4, 4, -UNI_GREXT } /* grext=no */, + { 0, 6427, 4751, 13, 5, UNI_JG__SADHE } /* joininggroup=sadhe */, + { 0, 461, 5440, 2, 20, UNI_HMNP } /* isnyiakengpuachuehmong */, + { 0, 309, 5283, 2, 9, UNI_HALFMARKS } /* inhalfmarks */, + { 0, 3633, 2619, 3, 12, UNI_LOWSURROGATES } /* inlowsurrogates */, + { 64, 7267, 3191, 15, 7, UNI_L } /* generalcategory=letter */, + { 0, 3407, 2657, 14, 8, UNI_NV__2_SLASH_5 } /* numericvalue=4.000e-01 */, + { 0, 309, 3026, 2, 14, UNI_INPSALTERPAHLAVI } /* inpsalterpahlavi */, + { 0, 309, 571, 2, 7, UNI_INAVESTAN } /* inavestan */, + { 2, 3514, 24, 7, 3, UNI_INAHOM } /* block=ahom */, + { 7, 2324, 4819, 6, 8, UNI_DINGBATS } /* block=dingbats */, + { 51, 4896, 0, 15, 0, UNI_BAMUMSUP } /* bamumsupplement */, + { 2, 1823, 1255, 7, 7, UNI_SIDD } /* script=siddham */, + { 0, 461, 266, 2, 3, UNI_CWT } /* iscwt */, + { 1, 309, 6797, 2, 18, UNI_DEVANAGARIEXT } /* indevanagariextended */, + { 8, 6351, 0, 23, 0, UNI_COMPATJAMO } /* hangulcompatibilityjamo */, + { 12, 1102, 1853, 4, 4, UNI_SYLO } /* scx=sylo */, + { 0, 7198, 837, 8, 3, UNI_SUPPUAA } /* blk=suppuaa */, + { 4, 6909, 0, 14, 0, UNI_MUSIC } /* musicalsymbols */, + { 1, 2523, 3268, 8, 5, UNI_XPOSIXALNUM } /* isxposixalnum */, + { 11, 466, 0, 2, 0, UNI_SO } /* so */, + { 1, 3349, 0, 4, 0, UNI_MERO } /* mero */, + { 1, 3204, 599, 14, 2, -UNI_GREXT } /* graphemeextend=n */, + { 0, 8601, 1110, 7, 7, UNI_SPECIALS } /* block=specials */, + { 0, 4377, 599, 14, 3, UNI_NFKDQC__N } /* nfkdquickcheck=no */, + { 0, 1667, 1465, 4, 10, UNI_INDIVESAKURU } /* blk=divesakuru */, + { 0, 2287, 6262, 3, 3, UNI_IN__2_DOT_1 } /* in=2.1 */, + { 0, 1530, 4511, 6, 9, UNI_KANAEXTB } /* iskanaextendedb */, + { 0, 7752, 4255, 23, 4, UNI_JG__MANICHAEANRESH } /* joininggroup=manichaeanresh */, + { 0, 7383, 5318, 10, 3, UNI_BC__RLE } /* bidiclass=rle */, + { 32, 6062, 1037, 14, 4, UNI_ETHIOPICEXTB } /* block=ethiopicextb */, + { 1, 7267, 466, 16, 2, UNI_SO } /* generalcategory=so */, + { 34, 1200, 1505, 3, 4, UNI_CJKEXTA } /* cjkexta */, + { 0, 887, 6262, 5, 3, UNI_AGE__12_DOT_1 } /* age=12.1 */, + { 0, 3633, 130, 14, 2, UNI_LATINEXTF } /* inlatinextendedf */, + { 0, 7383, 5497, 10, 18, UNI_BC__FSI } /* bidiclass=firststrongisolate */, + { 2, 5460, 585, 19, 5, UNI_TERM } /* terminalpunctuation=true */, + { 0, 3878, 1805, 14, 5, UNI_NV__900000 } /* numericvalue=900000 */, + { 4, 735, 934, 2, 2, UNI_EA__F } /* ea=f */, + { 1, 1391, 959, 3, 6, UNI_WB__EXTEND } /* wb=extend */, + { 3, 521, 599, 6, 2, -UNI_PATSYN } /* patsyn=n */, + { 0, 30, 8141, 1, 19, UNI_IDEOGRAPHICSYMBOLS } /* isideographicsymbols */, + { 0, 2403, 1505, 8, 4, UNI_ETHIOPICEXTA } /* ethiopicexta */, + { 68, 3803, 1795, 14, 6, UNI_NFCQC__M } /* nfkcquickcheck=maybe */, + { 0, 625, 0, 2, 0, UNI_PI } /* pi */, + { 0, 7495, 344, 27, 2, UNI_CCC__21 } /* canonicalcombiningclass=ccc21 */, + { 0, 7495, 343, 28, 1, UNI_CCC__11 } /* canonicalcombiningclass=ccc11 */, + { 0, 461, 4896, 2, 5, UNI_BAMU } /* isbamum */, + { 0, 5595, 934, 21, 2, -UNI_CWT } /* changeswhentitlecased=f */, + { 0, 3100, 0, 6, 0, UNI_XPOSIXXDIGIT } /* xdigit */, + { 3, 7383, 4880, 10, 16, UNI_BC__S } /* bidiclass=segmentseparator */, + { 1, 4424, 446, 17, 4, UNI_PHLI } /* scriptextensions=phli */, + { 25, 6165, 1021, 3, 6, UNI_WCHO } /* sc=wancho */, + { 4, 2503, 585, 11, 5, UNI_JOINC } /* joincontrol=true */, + { 36, 605, 533, 2, 3, UNI_idsb_values_index } /* idsb= */, + { 12, 6165, 1098, 3, 4, UNI_NSHU } /* sc=nshu */, + { 9, 271, 543, 4, 3, UNI_WB__EB } /* gcb=ebg */, + { 0, 4424, 1285, 17, 9, UNI_SIND } /* scriptextensions=khudawadi */, + { 2, 309, 1358, 2, 9, UNI_PALM } /* inpalmyrene */, + { 0, 2324, 527, 6, 6, UNI_INREJANG } /* block=rejang */, + { 192, 1272, 6382, 5, 18, UNI_CJKCOMPATFORMS } /* iscjkcompatibilityforms */, + { 147, 6165, 164, 3, 4, UNI_PHNX } /* sc=phnx */, + { 26, 1011, 599, 2, 3, -UNI_CI } /* ci=no */, + { 6, 3391, 769, 13, 3, UNI_NV__7_SLASH_2 } /* numericvalue=7/2 */, + { 0, 2324, 3026, 6, 14, UNI_INPSALTERPAHLAVI } /* block=psalterpahlavi */, + { 7, 1397, 353, 4, 4, UNI_IDST } /* idst=yes */, + { 0, 7134, 599, 26, 3, -UNI_PCM } /* prependedconcatenationmark=no */, + { 33, 7267, 4016, 16, 14, UNI_ZS } /* generalcategory=spaceseparator */, + { 3, 1823, 1235, 8, 6, UNI_SC__MULT } /* script=multani */, + { 12, 533, 281, 3, 2, UNI_SB__XX } /* sb=xx */, + { 17, 6165, 499, 3, 4, UNI_LYDI } /* sc=lydi */, + { 0, 2536, 4263, 3, 4, UNI_JG__QAPH } /* jg=qaph */, + { 0, 4407, 585, 17, 2, UNI_RI } /* regionalindicator=t */, + { 103, 7495, 391, 27, 2, UNI_CCC__34 } /* canonicalcombiningclass=ccc34 */, + { 9, 7274, 3101, 9, 5, UNI_XPOSIXDIGIT } /* category=digit */, + { 4, 4424, 1853, 17, 4, UNI_SYLO } /* scriptextensions=sylo */, + { 17, 5216, 5848, 11, 9, UNI_LATINEXTA } /* block=latinextendeda */, + { 0, 1734, 4710, 3, 15, UNI_SYRIACSUP } /* issyriacsupplement */, + { 1, 3013, 934, 5, 2, -UNI_EPRES } /* epres=f */, + { 9, 339, 118, 4, 2, UNI_CCC__DA } /* ccc=da */, + { 34, 309, 951, 2, 8, UNI_INDUPLOYAN } /* induployan */, + { 80, 1102, 1334, 4, 4, UNI_PERM } /* scx=perm */, + { 0, 6816, 353, 25, 2, UNI_CWKCF } /* changeswhennfkccasefolded=y */, + { 5, 1823, 847, 7, 7, UNI_LANA } /* script=taitham */, + { 79, 2766, 2360, 3, 10, UNI_CN } /* gc=unassigned */, + { 154, 461, 4569, 2, 5, UNI_XPOSIXUPPER } /* isupper */, + { 12, 6165, 802, 3, 4, UNI_SARB } /* sc=sarb */, + { 1, 3391, 290, 13, 2, UNI_NV__40 } /* numericvalue=40 */, + { 0, 1667, 1033, 4, 4, UNI_JAMO } /* blk=jamo */, + { 1, 733, 5820, 3, 18, UNI_ENCLOSEDALPHANUMSUP } /* inenclosedalphanumsup */, + { 5, 6735, 919, 22, 3, UNI_JG__MALAYALAMSSA } /* joininggroup=malayalamssa */, + { 1, 2, 34, 2, 1, UNI_CWT } /* cwt */, + { 0, 3001, 0, 12, 0, UNI_nt_values_index } /* numerictype= */, + { 78, 414, 0, 3, 0, UNI_HAN } /* han */, + { 0, 5857, 0, 12, 0, UNI_MONGOLIANSUP } /* mongoliansup */, + { 0, 7267, 3196, 19, 8, UNI_NO } /* generalcategory=othernumber */, + { 22, 5939, 585, 5, 2, UNI__PERL_NCHAR } /* nchar=t */, + { 22, 1272, 81, 7, 2, UNI_CJKEXTG } /* iscjkextg */, + { 0, 2766, 5243, 7, 12, UNI_PO } /* gc=otherpunctuation */, + { 4, 4424, 454, 17, 4, UNI_PRTI } /* scriptextensions=prti */, + { 2, 1102, 0, 4, 0, UNI_scx_values_index } /* scx= */, + { 1, 1726, 4987, 3, 16, UNI_ALCHEMICAL } /* isalchemicalsymbols */, + { 4, 339, 1155, 4, 2, UNI_CCC__35 } /* ccc=35 */, + { 0, 53, 0, 1, 0, UNI_N } /* n */, + { 1, 3724, 661, 12, 2, UNI_JG__MALAYALAMRA } /* jg=malayalamra */, + { 6, 3892, 599, 16, 2, -UNI_STERM } /* sentenceterminal=n */, + { 0, 2280, 2154, 10, 2, UNI_IN__13 } /* presentin=13 */, + { 2, 4862, 0, 4, 0, UNI_RUMI } /* rumi */, + { 69, 6165, 1834, 3, 4, UNI_SORA } /* sc=sora */, + { 0, 1728, 4511, 6, 9, UNI_ARABICEXTB } /* arabicextendedb */, + { 66, 7591, 2602, 22, 7, UNI_LB__CJ } /* lb=conditionaljapanesestarter */, + { 141, 2525, 307, 6, 5, UNI_XPOSIXPRINT } /* xposixprint */, + { 1, 2786, 0, 14, 0, UNI_HIGHSURROGATES } /* highsurrogates */, + { 6, 1667, 3726, 3, 10, UNI_INMALAYALAM } /* blk=malayalam */, + { 67, 1667, 6185, 4, 13, UNI_GLAGOLITICSUP } /* blk=glagoliticsup */, + { 1, 1823, 8667, 7, 18, UNI_CANS } /* script=canadianaboriginal */, + { 65, 4424, 232, 17, 4, UNI_YI } /* scriptextensions=yiii */, + { 4, 6427, 4267, 13, 4, UNI_JG__TETH } /* joininggroup=teth */, + { 16, 5979, 0, 5, 0, UNI_VO__TR } /* vo=tr */, + { 2, 10, 747, 1, 3, UNI_MARC } /* marc */, + { 10, 292, 1155, 3, 2, UNI_NV__35 } /* nv=35 */, + { 73, 6165, 297, 3, 5, UNI_SC__ORYA } /* sc=oriya */, + { 104, 3502, 6142, 5, 21, UNI_EARLYDYNASTICCUNEIFORM } /* blk=earlydynasticcuneiform */, + { 1, 823, 3190, 3, 2, UNI_dash_values_index } /* dash= */, + { 39, 7274, 4016, 9, 14, UNI_ZS } /* category=spaceseparator */, + { 8, 117, 0, 2, 0, UNI_XPOSIXDIGIT } /* nd */, + { 0, 1667, 901, 4, 8, UNI_INARMENIAN } /* blk=armenian */, + { 0, 2259, 869, 3, 6, UNI_TIRH } /* istirhuta */, + { 5, 6165, 4002, 3, 4, UNI_SC__MODI } /* sc=modi */, + { 0, 861, 0, 7, 0, UNI_TIBT } /* tibetan */, + { 0, 4569, 933, 8, 7, -UNI_XPOSIXUPPER } /* uppercase=false */, + { 24, 3391, 581, 12, 3, UNI_NV__22 } /* numericvalue=22 */, + { 48, 7591, 3040, 3, 9, UNI_LB__QU } /* lb=quotation */, + { 1, 8343, 5114, 22, 10, UNI_INSC__TONELETTER } /* indicsyllabiccategory=toneletter */, + { 0, 4424, 1340, 17, 9, UNI_ORKH } /* scriptextensions=oldturkic */, + { 0, 461, 1592, 2, 10, UNI_SAUR } /* issaurashtra */, + { 0, 461, 6185, 2, 20, UNI_GLAGOLITICSUP } /* isglagoliticsupplement */, + { 2, 983, 0, 8, 0, UNI_HIRA } /* hiragana */, + { 0, 6841, 353, 25, 4, UNI_DI } /* defaultignorablecodepoint=yes */, + { 4, 7011, 519, 23, 2, UNI_CCC__7 } /* canonicalcombiningclass=7 */, + { 48, 7011, 388, 25, 2, UNI_CCC__R } /* canonicalcombiningclass=226 */, + { 5, 6165, 590, 3, 7, UNI_DSRT } /* sc=deseret */, + { 3, 2324, 3692, 6, 4, UNI_INLISU } /* block=lisu */, + { 12, 1102, 663, 4, 4, UNI_LIMB } /* scx=limb */, + { 0, 1015, 90, 4, 2, UNI_TELU } /* telugu */, + { 0, 2434, 2437, 3, 4, UNI_MYMR } /* myanmar */, + { 0, 2393, 1037, 8, 4, UNI_CYRILLICEXTB } /* cyrillicextb */, + { 0, 2536, 2875, 3, 11, UNI_JG__STRAIGHTWAW } /* jg=straightwaw */, + { 52, 6618, 8507, 4, 15, UNI_INPC__BOTTOMANDRIGHT } /* inpc=bottomandright */, + { 2, 3391, 391, 13, 2, UNI_NV__34 } /* numericvalue=34 */, + { 74, 6287, 0, 4, 0, UNI_BC__L } /* bc=l */, + { 0, 10, 8374, 1, 33, UNI_MISCPICTOGRAPHS } /* miscellaneoussymbolsandpictographs */, + { 0, 1823, 537, 7, 6, UNI_TNSA } /* script=tangsa */, + { 1, 597, 140, 3, 3, UNI_DT__NAR } /* dt=nar */, + { 33, 1174, 1178, 4, 5, UNI_EA__NA } /* ea=narrow */, + { 3, 1823, 1303, 7, 9, UNI_TALU } /* script=newtailue */, + { 24, 1823, 236, 7, 4, UNI_ZANB } /* script=zanb */, + { 0, 3098, 2931, 7, 3, UNI_XPOSIXXDIGIT } /* hexdigit=t */, + { 10, 7591, 3463, 3, 4, UNI_LB__GL } /* lb=glue */, + { 2, 1027, 0, 6, 0, UNI_YEZI } /* yezidi */, + { 86, 309, 1465, 2, 10, UNI_INDIVESAKURU } /* indivesakuru */, + { 108, 309, 6693, 3, 14, UNI_TRANSPORTANDMAP } /* intransportandmap */, + { 1, 3649, 0, 11, 0, UNI_PHONETICEXT } /* phoneticext */, + { 0, 380, 585, 6, 5, UNI_HYPHEN } /* hyphen=true */, + { 0, 1397, 598, 6, 4, -UNI_IDS } /* idstart=no */, + { 3, 4424, 120, 17, 3, UNI_LAO } /* scriptextensions=lao */, + { 1, 7011, 288, 25, 2, UNI_CCC__A } /* canonicalcombiningclass=230 */, + { 5, 1667, 772, 4, 7, UNI_OLCK } /* blk=olchiki */, + { 9, 1667, 2373, 6, 5, UNI_CJKEXTE } /* blk=cjkexte */, + { 6, 271, 1869, 4, 3, UNI_WB__EB } /* gcb=gaz */, + { 0, 1667, 1779, 4, 11, UNI_INMEDEFAIDRIN } /* blk=medefaidrin */, + { 0, 309, 1117, 2, 8, UNI_INTAGBANWA } /* intagbanwa */, + { 37, 3791, 0, 4, 0, UNI_MATH } /* math */, + { 0, 8343, 2768, 21, 6, UNI_INSC__OTHER } /* indicsyllabiccategory=other */, + { 172, 5769, 353, 4, 4, UNI_EMOD } /* emod=yes */, + { 16, 772, 0, 7, 0, UNI_OLCK } /* olchiki */, + { 2, 2324, 5274, 6, 18, UNI_HALFMARKS } /* block=combininghalfmarks */, + { 0, 4424, 4002, 17, 4, UNI_MODI } /* scriptextensions=modi */, + { 9, 461, 6909, 2, 14, UNI_MUSIC } /* ismusicalsymbols */, + { 33, 5440, 1818, 15, 5, UNI_HMNP } /* nyiakengpuachuehmong */, + { 2, 5065, 5433, 13, 7, UNI_JG__MANICHAEANHUNDRED } /* jg=manichaeanhundred */, + { 5, 746, 0, 7, 0, UNI_MARC } /* marchen */, + { 4, 1059, 353, 6, 4, UNI_DT__NONE } /* nfkdqc=yes */, + { 0, 309, 4726, 3, 8, UNI_TANGUTSUP } /* intangutsup */, + { 3, 1667, 8474, 7, 23, UNI_CJKCOMPATIDEOGRAPHS } /* blk=cjkcompatibilityideographs */, + { 1, 1102, 184, 4, 4, UNI_SAMR } /* scx=samr */, + { 1, 3635, 5635, 11, 3, UNI_LATINEXTG } /* latinextendedg */, + { 0, 2324, 55, 6, 4, UNI_INCHAM } /* block=cham */, + { 13, 6165, 615, 3, 7, UNI_ELYM } /* sc=elymaic */, + { 1, 461, 5958, 2, 7, UNI_SINH } /* issinhala */, + { 8, 292, 7239, 3, 2, UNI_NV__28 } /* nv=28 */, + { 4, 3391, 766, 13, 3, UNI_NV__5_SLASH_2 } /* numericvalue=5/2 */, + { 0, 1667, 608, 4, 7, UNI_INELBASAN } /* blk=elbasan */, + { 0, 4424, 94, 17, 4, UNI_GURU } /* scriptextensions=guru */, + { 9, 1272, 6400, 5, 18, UNI_CJKRADICALSSUP } /* iscjkradicalssupplement */, + { 1, 30, 5390, 1, 12, UNI_CHEROKEESUP } /* ischerokeesup */, + { 34, 3014, 1804, 11, 3, UNI_IN__10 } /* presentin=v100 */, + { 1, 2678, 0, 11, 0, UNI_IN__5 } /* presentin=5 */, + { 0, 6000, 0, 6, 0, UNI_YIJING } /* yijing */, + { 6, 6776, 0, 14, 0, UNI_MEETEIMAYEKEXT } /* meeteimayekext */, + { 0, 33, 0, 1, 0, UNI_S } /* s */, + { 1, 5156, 2411, 10, 8, UNI_WB__KA } /* wordbreak=katakana */, + { 0, 309, 4926, 2, 5, UNI_INTAMIL } /* intamil */, + { 2, 1635, 0, 4, 0, UNI_WARA } /* wara */, + { 0, 3724, 1193, 12, 3, UNI_JG__MALAYALAMNGA } /* jg=malayalamnga */, + { 1, 3014, 1313, 11, 2, UNI_IN__6 } /* presentin=v60 */, + { 0, 309, 1635, 2, 10, UNI_INWARANGCITI } /* inwarangciti */, + { 4, 6870, 585, 20, 5, UNI_CE } /* compositionexclusion=true */, + { 6, 2536, 2864, 3, 11, UNI_JG__ROHINGYAYEH } /* jg=rohingyayeh */, + { 1, 7591, 309, 3, 2, UNI_LB__IN } /* lb=in */, + { 1, 461, 220, 2, 4, UNI_WCHO } /* iswcho */, + { 100, 1396, 598, 7, 4, -UNI_XIDS } /* xidstart=no */, + { 35, 1823, 2068, 7, 12, UNI_MEND } /* script=mendekikakui */, + { 3, 1823, 152, 7, 4, UNI_OSGE } /* script=osge */, + { 0, 2302, 0, 10, 0, UNI_IDC } /* idcontinue */, + { 0, 4424, 6185, 17, 4, UNI_GLAG } /* scriptextensions=glag */, + { 0, 1421, 2773, 3, 13, UNI_INGREEK } /* ingreekandcoptic */, + { 2, 339, 3152, 4, 11, UNI_CCC__8 } /* ccc=kanavoicing */, + { 13, 6165, 5682, 3, 5, UNI_SC__GREK } /* sc=greek */, + { 0, 875, 5980, 4, 3, UNI_UIDEO } /* uideo=t */, + { 0, 7887, 7380, 28, 4, UNI_CJKEXTB } /* incjkunifiedideographsextensionb */, + { 64, 5553, 934, 21, 6, -UNI_CWCM } /* changeswhencasemapped=false */, + { 47, 4519, 6193, 12, 5, UNI_CYRILLICSUP } /* block=cyrillicsup */, + { 0, 23, 0, 4, 0, UNI_AHOM } /* ahom */, + { 0, 5168, 3075, 6, 9, UNI__PERL_ANY_FOLDS } /* _perl_any_folds */, + { 49, 5799, 5149, 14, 7, UNI_SUPARROWSA } /* insupplementalarrowsa */, + { 2, 7274, 4827, 9, 18, UNI_ZP } /* category=paragraphseparator */, + { 1, 5391, 0, 11, 0, UNI_CHEROKEESUP } /* cherokeesup */, + { 0, 6427, 0, 13, 0, UNI_jg_values_index } /* joininggroup= */, + { 0, 895, 1070, 5, 2, UNI_AGE__3_DOT_1 } /* age=v31 */, + { 1, 3817, 290, 15, 2, UNI_NV__1_SLASH_40 } /* numericvalue=1/40 */, + { 68, 7648, 366, 18, 3, UNI_DT__SQR } /* decompositiontype=sqr */, + { 5, 461, 4060, 2, 7, UNI_BRAI } /* isbraille */, + { 3, 1667, 1385, 4, 6, UNI_INTHAANA } /* blk=thaana */, + { 13, 2324, 5031, 6, 14, UNI_INHANIFIROHINGYA } /* block=hanifirohingya */, + { 30, 622, 2931, 6, 3, UNI_EXTPICT } /* extpict=t */, + { 2, 1726, 4659, 8, 9, UNI_ARABICEXTC } /* isarabicextendedc */, + { 17, 4424, 1117, 17, 4, UNI_TAGB } /* scriptextensions=tagb */, + { 0, 1065, 290, 5, 2, UNI_NV__1_SLASH_40 } /* nv=1/40 */, + { 21, 2324, 8278, 6, 33, UNI_MISCMATHSYMBOLSB } /* block=miscellaneousmathematicalsymbolsb */, + { 1, 309, 1241, 2, 7, UNI_NB } /* innoblock */, + { 0, 461, 5876, 2, 12, UNI_SUNDANESESUP } /* issundanesesup */, + { 0, 309, 2411, 2, 8, UNI_INKATAKANA } /* inkatakana */, + { 33, 6165, 718, 3, 7, UNI_SC__KNDA } /* sc=kannada */, + { 0, 2536, 715, 3, 3, UNI_JG__AIN } /* jg=ain */, + { 13, 2004, 3268, 5, 5, UNI_POSIXALNUM } /* posixalnum */, + { 0, 1667, 3663, 4, 14, UNI_DEVANAGARIEXTA } /* blk=devanagariexta */, + { 3, 4569, 934, 5, 2, -UNI_XPOSIXUPPER } /* upper=f */, + { 0, 7011, 119, 24, 2, UNI_CCC__AL } /* canonicalcombiningclass=al */, + { 105, 461, 2247, 2, 4, UNI_HUNG } /* ishung */, + { 121, 4424, 6642, 17, 4, UNI_BRAH } /* scriptextensions=brah */, + { 6, 2766, 255, 3, 2, UNI_CF } /* gc=cf */, + { 38, 1823, 1484, 7, 4, UNI_SC__BUGI } /* script=bugi */, + { 1, 2317, 0, 6, 0, UNI_N } /* number */, + { 0, 339, 345, 5, 2, UNI_CCC__118 } /* ccc=118 */, + { 10, 4424, 1685, 17, 11, UNI_CPMN } /* scriptextensions=cyprominoan */, + { 0, 3878, 1805, 14, 4, UNI_NV__90000 } /* numericvalue=90000 */, + { 2, 5916, 599, 21, 2, -UNI_LOE } /* logicalorderexception=n */, + { 0, 6165, 4060, 3, 4, UNI_BRAI } /* sc=brai */, + { 0, 1409, 1505, 5, 4, UNI_LATINEXTA } /* latinexta */, + { 1, 6165, 216, 3, 4, UNI_TOTO } /* sc=toto */, + { 136, 6165, 1367, 3, 4, UNI_PAUC } /* sc=pauc */, + { 0, 1667, 7036, 4, 26, UNI_HALFANDFULLFORMS } /* blk=halfwidthandfullwidthforms */, + { 2, 6165, 47, 3, 4, UNI_SC__CAKM } /* sc=cakm */, + { 48, 1823, 244, 7, 4, UNI_ZZZZ } /* script=zzzz */, + { 0, 7495, 559, 28, 2, UNI_CCC__107 } /* canonicalcombiningclass=ccc107 */, + { 2, 120, 122, 2, 2, UNI_LAO } /* laoo */, + { 36, 1734, 1854, 3, 3, UNI_SYLO } /* issylo */, + { 0, 461, 1015, 2, 4, UNI_TELU } /* istelu */, + { 1, 1198, 1505, 5, 4, UNI_CJKEXTA } /* incjkexta */, + { 93, 1823, 1819, 7, 4, UNI_SC__MONG } /* script=mong */, + { 0, 6165, 1358, 3, 4, UNI_PALM } /* sc=palm */, + { 0, 895, 1318, 6, 2, UNI_AGE__12 } /* age=v120 */, + { 2, 461, 269, 2, 2, UNI_ZP } /* iszp */, + { 2, 1454, 274, 2, 1, UNI_sd_values_index } /* sd= */, + { 0, 309, 1522, 2, 8, UNI_INUGARITIC } /* inugaritic */, + { 0, 2536, 4761, 4, 4, UNI_JG__ALAPH } /* jg=alaph */, + { 0, 2324, 1966, 7, 9, UNI_COMPATJAMO } /* block=compatjamo */, + { 0, 7011, 768, 24, 2, UNI_CCC__27 } /* canonicalcombiningclass=27 */, + { 4, 5156, 3053, 10, 11, UNI_WB__DQ } /* wordbreak=doublequote */, + { 0, 6427, 4221, 13, 14, UNI_JG__HAMZAONHEHGOAL } /* joininggroup=hamzaonhehgoal */, + { 0, 2324, 322, 6, 5, UNI_VSSUP } /* block=vssup */, + { 0, 1667, 1144, 4, 9, UNI_INBHAIKSUKI } /* blk=bhaiksuki */, + { 2, 1823, 4651, 7, 8, UNI_SC__BOPO } /* script=bopomofo */, + { 0, 7011, 7425, 24, 4, UNI_CCC__216 } /* canonicalcombiningclass=atar */, + { 0, 7267, 8356, 7, 10, UNI_C } /* generalcategory=c */, + { 0, 2324, 6487, 6, 13, UNI_ZNAMENNYMUSIC } /* block=znamennymusic */, + { 84, 6165, 188, 3, 4, UNI_SGNW } /* sc=sgnw */, + { 2, 2259, 1107, 3, 3, UNI_TALU } /* istalu */, + { 3, 1734, 6671, 3, 21, UNI_MODIFIERLETTERS } /* isspacingmodifierletters */, + { 1, 6165, 4461, 3, 11, UNI_SGNW } /* sc=signwriting */, + { 0, 4360, 380, 10, 6, UNI_LB__HY } /* linebreak=hyphen */, + { 20, 2752, 599, 5, 3, -UNI_EMOJI } /* emoji=no */, + { 0, 461, 1255, 2, 4, UNI_SIDD } /* issidd */, + { 4, 7267, 3558, 16, 9, UNI_Z } /* generalcategory=separator */, + { 45, 339, 2165, 5, 2, UNI_WB__EB } /* ccc=133 */, + { 7, 4360, 2944, 10, 11, UNI_LB__BB } /* linebreak=breakbefore */, + { 3, 253, 0, 4, 0, UNI_CWCF } /* cwcf */, + { 134, 4569, 353, 5, 4, UNI_XPOSIXUPPER } /* upper=yes */, + { 0, 3892, 599, 16, 3, -UNI_STERM } /* sentenceterminal=no */, + { 2, 3692, 0, 7, 0, UNI_LISUSUP } /* lisusup */, + { 1, 2966, 819, 3, 6, UNI_SC__SHRD } /* insharada */, + { 1, 4424, 1975, 17, 10, UNI_SOGO } /* scriptextensions=oldsogdian */, + { 13, 7404, 422, 11, 2, UNI_BC__RLI } /* bidiclass=rli */, + { 1, 2287, 2360, 3, 10, UNI_IN__NA } /* in=unassigned */, + { 0, 339, 2234, 3, 2, UNI_CCC__8 } /* ccc=8 */, + { 0, 54, 0, 2, 0, UNI_SC } /* sc */, + { 6, 7495, 2092, 27, 2, UNI_CCC__25 } /* canonicalcombiningclass=ccc25 */, + { 0, 6165, 2068, 3, 4, UNI_MEND } /* sc=mend */, + { 0, 1667, 4060, 4, 7, UNI_BRAI } /* blk=braille */, + { 0, 1200, 2373, 2, 5, UNI_CJKEXTE } /* cjkexte */, + { 64, 5391, 0, 8, 0, UNI_CHER } /* cherokee */, + { 25, 4809, 0, 18, 0, UNI_ORNAMENTALDINGBATS } /* ornamentaldingbats */, + { 3, 8601, 5409, 7, 11, UNI_SMALLKANAEXT } /* block=smallkanaext */, + { 67, 461, 5553, 2, 21, UNI_CWCM } /* ischangeswhencasemapped */, + { 0, 21, 5820, 1, 18, UNI_ENCLOSEDALPHANUMSUP } /* enclosedalphanumsup */, + { 0, 6165, 5353, 3, 20, UNI_PHLI } /* sc=inscriptionalpahlavi */, + { 0, 6165, 470, 3, 4, UNI_TNSA } /* sc=tnsa */, + { 0, 302, 353, 5, 4, UNI__PERL_PATWS } /* patws=yes */, + { 0, 4161, 934, 9, 2, -UNI_DIA } /* diacritic=f */, + { 0, 6870, 934, 20, 6, -UNI_CE } /* compositionexclusion=false */, + { 0, 309, 5838, 2, 19, UNI_JAMOEXTA } /* inhanguljamoextendeda */, + { 6, 3817, 389, 15, 1, UNI_NV__1_SLASH_6 } /* numericvalue=1/6 */, + { 0, 2280, 566, 10, 3, UNI_IN__9 } /* presentin=9.0 */, + { 0, 7198, 7707, 15, 17, UNI_SUPPUAB } /* blk=supplementaryprivateuseareab */, + { 0, 1065, 2115, 4, 8, UNI_NV__1_SLASH_64 } /* nv=1.562e-02 */, + { 49, 2004, 1479, 5, 5, UNI_POSIXSPACE } /* posixspace */, + { 1, 4424, 369, 17, 6, UNI_GOTH } /* scriptextensions=gothic */, + { 0, 8343, 1517, 22, 5, UNI_INSC__BINDU } /* indicsyllabiccategory=bindu */, + { 49, 2180, 515, 4, 2, UNI_NV__4_SLASH_5 } /* nv=4/5 */, + { 95, 4424, 1465, 17, 10, UNI_DIAK } /* scriptextensions=divesakuru */, + { 0, 1065, 766, 4, 3, UNI_NV__15_SLASH_2 } /* nv=15/2 */, + { 1, 2324, 1125, 6, 8, UNI_INTIFINAGH } /* block=tifinagh */, + { 4, 1906, 1505, 8, 4, UNI_KANAEXTA } /* blk=kanaexta */, + { 0, 1667, 3567, 4, 16, UNI_HALFANDFULLFORMS } /* blk=halfandfullforms */, + { 0, 7274, 4554, 9, 15, UNI_TITLE } /* category=titlecaseletter */, + { 0, 461, 1397, 2, 3, UNI_IDS } /* isids */, + { 8, 2324, 7449, 6, 18, UNI_PHONETICEXT } /* block=phoneticextensions */, + { 0, 339, 2719, 2, 3, UNI_CCC__R } /* ccc=r */, + { 8, 3878, 2184, 14, 8, UNI_NV__11_SLASH_12 } /* numericvalue=9.167e-01 */, + { 0, 1200, 6400, 3, 11, UNI_CJKRADICALSSUP } /* cjkradicalssup */, + { 0, 2324, 7564, 6, 17, UNI_ANCIENTGREEKMUSIC } /* block=ancientgreekmusic */, + { 1, 7267, 54, 16, 2, UNI_SC } /* generalcategory=sc */, + { 1, 1102, 739, 4, 4, UNI_MAND } /* scx=mand */, + { 1, 7011, 274, 23, 2, UNI_CCC__B } /* canonicalcombiningclass=b */, + { 0, 461, 94, 2, 4, UNI_GURU } /* isguru */, + { 2, 4424, 1255, 17, 4, UNI_SIDD } /* scriptextensions=sidd */, + { 18, 4424, 688, 17, 5, UNI_BATK } /* scriptextensions=batak */, + { 58, 6450, 2304, 15, 8, UNI_SB__SC } /* sentencebreak=scontinue */, + { 1, 2287, 2656, 3, 3, UNI_IN__5 } /* in=5.0 */, + { 0, 309, 6510, 2, 24, UNI_HIGHPUSURROGATES } /* inhighprivateusesurrogates */, + { 0, 7134, 585, 26, 2, UNI_PCM } /* prependedconcatenationmark=t */, + { 0, 1102, 438, 4, 4, UNI_OLCK } /* scx=olck */, + { 116, 1726, 2312, 3, 12, UNI_AEGEANNUMBERS } /* isaegeannumbers */, + { 1, 33, 6671, 1, 21, UNI_MODIFIERLETTERS } /* spacingmodifierletters */, + { 3, 4424, 1191, 17, 7, UNI_BENG } /* scriptextensions=bengali */, + { 2, 10, 6597, 1, 21, UNI_MISCTECHNICAL } /* miscellaneoustechnical */, + { 0, 5553, 585, 21, 5, UNI_CWCM } /* changeswhencasemapped=true */, + { 101, 2432, 1505, 9, 4, UNI_MYANMAREXTA } /* inmyanmarexta */, + { 1, 1823, 2735, 6, 5, UNI_SC__ARAB } /* script=arab */, + { 1, 8538, 1343, 20, 2, UNI_VO__TU } /* verticalorientation=tu */, + { 134, 4424, 4896, 17, 5, UNI_BAMU } /* scriptextensions=bamum */, + { 22, 6866, 585, 24, 5, UNI_COMPEX } /* fullcompositionexclusion=true */, + { 3, 5746, 1135, 4, 6, UNI_INVITHKUQI } /* invithkuqi */, + { 5, 8246, 4107, 24, 12, UNI_INPC__LEFTANDRIGHT } /* indicpositionalcategory=leftandright */, + { 0, 30, 7854, 1, 33, UNI_INIDC } /* isideographicdescriptioncharacters */, + { 2, 1823, 3493, 6, 9, UNI_SC__CYRL } /* script=cyrillic */, + { 1, 1667, 1914, 4, 7, UNI_UCASEXT } /* blk=ucasext */, + { 1, 2324, 2468, 6, 6, UNI_IPAEXT } /* block=ipaext */, + { 18, 7274, 3276, 9, 13, UNI_ME } /* category=enclosingmark */, + { 3, 461, 4407, 2, 17, UNI_RI } /* isregionalindicator */, + { 0, 2718, 5318, 3, 3, UNI_BC__RLE } /* bc=rle */, + { 0, 3040, 934, 13, 2, -UNI_QMARK } /* quotationmark=f */, + { 75, 1272, 4533, 5, 4, UNI_CJKEXTC } /* iscjkextc */, + { 82, 4424, 152, 17, 4, UNI_OSGE } /* scriptextensions=osge */, + { 0, 1522, 0, 4, 0, UNI_UGAR } /* ugar */, + { 0, 1667, 5876, 4, 19, UNI_SUNDANESESUP } /* blk=sundanesesupplement */, + { 0, 461, 78, 2, 4, UNI_DSRT } /* isdsrt */, + { 24, 339, 1070, 4, 2, UNI_CCC__31 } /* ccc=31 */, + { 129, 1102, 3228, 4, 15, UNI_ARMI } /* scx=imperialaramaic */, + { 0, 2766, 4150, 3, 11, UNI_P } /* gc=punctuation */, + { 0, 4424, 1325, 17, 4, UNI_ITAL } /* scriptextensions=ital */, + { 0, 1102, 1021, 4, 6, UNI_WCHO } /* scx=wancho */, + { 24, 1914, 0, 4, 0, UNI_UCAS } /* ucas */, + { 1, 2514, 6597, 3, 21, UNI_MISCTECHNICAL } /* ismiscellaneoustechnical */, + { 13, 461, 4506, 2, 14, UNI_LATINEXTB } /* islatinextendedb */, + { 0, 4740, 0, 4, 0, UNI_TALE } /* tale */, + { 0, 1065, 1312, 5, 3, UNI_NV__1_SLASH_160 } /* nv=1/160 */, + { 0, 1102, 128, 4, 4, UNI_MEDF } /* scx=medf */, + { 26, 6165, 683, 3, 4, UNI_SC__TAKR } /* sc=takr */, + { 0, 2324, 3475, 6, 15, UNI_INZANABAZARSQUARE } /* block=zanabazarsquare */, + { 10, 302, 353, 5, 2, UNI__PERL_PATWS } /* patws=y */, + { 0, 5255, 353, 20, 4, UNI_EXTPICT } /* extendedpictographic=yes */, + { 2, 3817, 766, 14, 3, UNI_NV__15_SLASH_2 } /* numericvalue=15/2 */, + { 0, 2324, 5857, 6, 19, UNI_MONGOLIANSUP } /* block=mongoliansupplement */, + { 0, 1823, 1234, 7, 4, UNI_SC__MULT } /* script=mult */, + { 24, 510, 295, 4, 1, UNI_NV__39 } /* nv=39 */, + { 0, 1667, 2811, 4, 5, UNI_INKHMER } /* blk=khmer */, + { 7, 1027, 0, 4, 0, UNI_YEZI } /* yezi */, + { 17, 733, 7241, 3, 26, UNI_ENCLOSEDCJK } /* inenclosedcjklettersandmonths */, + { 0, 2324, 688, 6, 5, UNI_INBATAK } /* block=batak */, + { 3, 7267, 4150, 16, 11, UNI_P } /* generalcategory=punctuation */, + { 1, 2324, 634, 6, 7, UNI_INHANUNOO } /* block=hanunoo */, + { 5, 832, 274, 5, 1, UNI_sterm_values_index } /* sterm= */, + { 0, 1823, 2068, 7, 4, UNI_MEND } /* script=mend */, + { 56, 309, 4002, 2, 4, UNI_INMODI } /* inmodi */, + { 23, 1455, 585, 10, 5, UNI_DEP } /* deprecated=true */, + { 258, 1894, 599, 5, 2, -UNI_BIDIM } /* bidim=n */, + { 7, 2391, 6193, 8, 12, UNI_CYRILLICSUP } /* incyrillicsupplement */, + { 0, 1455, 0, 3, 0, UNI_DEP } /* dep */, + { 0, 298, 585, 2, 2, UNI_RI } /* ri=t */, + { 4, 7383, 0, 11, 0, UNI_BC__L } /* bidiclass=l */, + { 0, 2, 3163, 1, 14, UNI_CONTROLPICTURES } /* controlpictures */, + { 0, 2, 352, 1, 3, UNI_CE } /* ce=y */, + { 7, 426, 0, 4, 0, UNI_MRO } /* mroo */, + { 3, 1065, 2657, 4, 8, UNI_NV__1_SLASH_10 } /* nv=1.000e-01 */, + { 0, 461, 739, 2, 4, UNI_MAND } /* ismand */, + { 0, 4424, 1294, 17, 9, UNI_NBAT } /* scriptextensions=nabataean */, + { 2, 1102, 840, 4, 7, UNI_TGLG } /* scx=tagalog */, + { 18, 1102, 102, 4, 4, UNI_HMNG } /* scx=hmng */, + { 3, 292, 3875, 2, 3, UNI_NV__80 } /* nv=80 */, + { 0, 1272, 5694, 3, 18, UNI_COUNTINGROD } /* iscountingrodnumerals */, + { 214, 1102, 608, 4, 7, UNI_ELBA } /* scx=elbasan */, + { 6, 6165, 102, 3, 4, UNI_HMNG } /* sc=hmng */, + { 1, 1823, 1978, 7, 4, UNI_SC__SOGD } /* script=sogd */, + { 14, 3391, 288, 13, 2, UNI_NV__30 } /* numericvalue=30 */, + { 3, 461, 4043, 2, 17, UNI_IDSB } /* isidsbinaryoperator */, + { 7, 1823, 2441, 7, 4, UNI_SC__NAND } /* script=nand */, + { 13, 4424, 3475, 17, 15, UNI_ZANB } /* scriptextensions=zanabazarsquare */, + { 1, 7084, 1037, 8, 4, UNI_ARABICEXTB } /* inarabicextb */, + { 0, 1262, 0, 7, 0, UNI_SOYO } /* soyombo */, + { 0, 2432, 7620, 3, 28, UNI_MISCARROWS } /* inmiscellaneoussymbolsandarrows */, + { 32, 4360, 0, 10, 0, UNI_lb_values_index } /* linebreak= */, + { 0, 2324, 997, 6, 6, UNI_INKAITHI } /* block=kaithi */, + { 159, 3502, 1505, 12, 4, UNI_ETHIOPICEXTA } /* blk=ethiopicexta */, + { 0, 1098, 0, 4, 0, UNI_NSHU } /* nshu */, + { 24, 7591, 1933, 3, 9, UNI_LB__AI } /* lb=ambiguous */, + { 0, 2766, 4602, 3, 18, UNI_PI } /* gc=initialpunctuation */, + { 0, 1667, 997, 4, 6, UNI_INKAITHI } /* blk=kaithi */, + { 0, 7011, 391, 25, 2, UNI_CCC__DA } /* canonicalcombiningclass=234 */, + { 0, 7274, 363, 9, 2, UNI_SM } /* category=sm */, + { 195, 461, 2780, 2, 4, UNI_COPT } /* iscopt */, + { 0, 309, 5031, 2, 14, UNI_INHANIFIROHINGYA } /* inhanifirohingya */, + { 0, 887, 2083, 5, 2, UNI_IN__1_DOT_1 } /* age=1.1 */, + { 12, 461, 7480, 2, 14, UNI_PUA } /* isprivateusearea */, + { 31, 4424, 1509, 17, 4, UNI_JAVA } /* scriptextensions=java */, + { 1, 7198, 4441, 5, 16, UNI_SMALLFORMS } /* blk=smallformvariants */, + { 0, 309, 6776, 2, 14, UNI_MEETEIMAYEKEXT } /* inmeeteimayekext */, + { 0, 1667, 6514, 4, 10, UNI_PUA } /* blk=privateuse */, + { 0, 1391, 3064, 3, 11, UNI_WB__SQ } /* wb=singlequote */, + { 3, 1618, 0, 10, 0, UNI_SD } /* softdotted */, + { 42, 1801, 0, 5, 0, UNI_NV__10 } /* nv=10 */, + { 1, 7011, 2121, 25, 2, UNI_CCC__202 } /* canonicalcombiningclass=202 */, + { 0, 1102, 422, 4, 4, UNI_LINA } /* scx=lina */, + { 2, 461, 5876, 2, 9, UNI_SUND } /* issundanese */, + { 18, 3832, 343, 15, 2, UNI_NV__5_SLASH_12 } /* numericvalue=5/12 */, + { 1, 3391, 1312, 14, 5, UNI_NV__216000 } /* numericvalue=216000 */, + { 11, 7648, 1168, 18, 6, UNI_DT__MED } /* decompositiontype=medial */, + { 0, 4424, 63, 17, 4, UNI_CPMN } /* scriptextensions=cpmn */, + { 0, 253, 599, 4, 3, -UNI_CWCF } /* cwcf=no */, + { 32, 4360, 1669, 8, 4, UNI_LB__CJ } /* linebreak=cj */, + { 0, 2718, 535, 2, 2, UNI_BC__S } /* bc=s */, + { 0, 6163, 2452, 5, 8, UNI_INSC__AVAGRAHA } /* insc=avagraha */, + { 14, 6163, 5323, 5, 15, UNI_INSC__MODIFYINGLETTER } /* insc=modifyingletter */, + { 0, 292, 1313, 3, 2, UNI_NV__60 } /* nv=60 */, + { 136, 7084, 1723, 8, 3, UNI_ARABICPFB } /* inarabicpfb */, + { 96, 2523, 4150, 8, 5, UNI_XPOSIXPUNCT } /* isxposixpunct */, + { 3, 5616, 353, 21, 4, UNI_CWU } /* changeswhenuppercased=yes */, + { 2, 3832, 763, 14, 2, UNI_NV__5_SLASH_6 } /* numericvalue=5/6 */, + { 34, 1409, 4659, 5, 9, UNI_LATINEXTC } /* latinextendedc */, + { 4, 4424, 3538, 17, 7, UNI_CPRT } /* scriptextensions=cypriot */, + { 2, 1823, 67, 7, 4, UNI_SC__CPRT } /* script=cprt */, + { 0, 3391, 2147, 14, 8, UNI_NV__1_SLASH_4 } /* numericvalue=2.500e-01 */, + { 0, 2324, 571, 6, 7, UNI_INAVESTAN } /* block=avestan */, + { 194, 30, 4969, 1, 6, UNI_EMOJI } /* isemoji */, + { 0, 1726, 1723, 8, 3, UNI_ARABICPFB } /* isarabicpfb */, + { 1, 377, 0, 3, 0, UNI_EXT } /* ext */, + { 2, 7537, 6621, 9, 3, UNI_XPOSIXALPHA } /* alphabetic=t */, + { 4, 653, 0, 5, 0, UNI_BUHD } /* buhid */, + { 1, 2393, 4659, 8, 9, UNI_CYRILLICEXTC } /* cyrillicextendedc */, + { 1, 6450, 4, 14, 2, UNI_SB__LO } /* sentencebreak=lo */, + { 0, 7804, 934, 11, 6, -UNI_IDEO } /* ideographic=false */, + { 1, 1734, 1110, 3, 7, UNI_SPECIALS } /* isspecials */, + { 1, 1823, 180, 7, 4, UNI_RUNR } /* script=runr */, + { 89, 1102, 1834, 4, 4, UNI_SORA } /* scx=sora */, + { 0, 461, 375, 2, 5, UNI_GREXT } /* isgrext */, + { 0, 3204, 0, 14, 0, UNI_GREXT } /* graphemeextend */, + { 19, 461, 6900, 2, 14, UNI_BYZANTINEMUSIC } /* isbyzantinemusic */, + { 104, 4795, 2657, 14, 8, UNI_NV__3_SLASH_5 } /* numericvalue=6.000e-01 */, + { 2, 7274, 2360, 9, 10, UNI_CN } /* category=unassigned */, + { 2, 733, 7915, 3, 29, UNI_ENCLOSEDALPHANUMSUP } /* inenclosedalphanumericsupplement */, + { 42, 5156, 298, 10, 2, UNI_RI } /* wordbreak=ri */, + { 2, 4424, 5353, 17, 20, UNI_PHLI } /* scriptextensions=inscriptionalpahlavi */, + { 0, 6165, 1582, 3, 10, UNI_PHNX } /* sc=phoenician */, + { 0, 3093, 598, 12, 3, -UNI_POSIXXDIGIT } /* asciihexdigit=n */, + { 8, 1667, 6487, 4, 23, UNI_ZNAMENNYMUSIC } /* blk=znamennymusicalnotation */, + { 4, 7591, 318, 3, 2, UNI_LB__AI } /* lb=ai */, + { 38, 1009, 0, 4, 0, UNI_LYCI } /* lyci */, + { 0, 3014, 1318, 12, 2, UNI_IN__12 } /* presentin=v120 */, + { 0, 1667, 1448, 7, 7, UNI_CJKSTROKES } /* blk=cjkstrokes */, + { 48, 1667, 6692, 4, 22, UNI_TRANSPORTANDMAP } /* blk=transportandmapsymbols */, + { 0, 309, 1992, 2, 10, UNI_YIRADICALS } /* inyiradicals */, + { 22, 2930, 1427, 2, 2, UNI_JT__C } /* jt=c */, + { 0, 1667, 5392, 5, 17, UNI_CHEROKEESUP } /* blk=cherokeesupplement */, + { 1, 2208, 1314, 4, 3, UNI_NV__5000 } /* nv=5000 */, + { 7, 4424, 847, 17, 7, UNI_LANA } /* scriptextensions=taitham */, + { 0, 90, 0, 4, 0, UNI_GUJR } /* gujr */, + { 0, 1823, 172, 7, 4, UNI_RJNG } /* script=rjng */, + { 0, 4424, 1592, 17, 10, UNI_SAUR } /* scriptextensions=saurashtra */, + { 32, 461, 1209, 2, 4, UNI_THAI } /* isthai */, + { 3, 7591, 4650, 3, 2, UNI_LB__BB } /* lb=bb */, + { 2, 461, 3228, 2, 15, UNI_ARMI } /* isimperialaramaic */, + { 0, 2393, 6193, 6, 12, UNI_CYRILLICSUP } /* cyrillicsupplement */, + { 5, 1728, 4531, 4, 6, UNI_ARABICEXTC } /* arabicextc */, + { 22, 3014, 290, 11, 2, UNI_IN__4 } /* presentin=v40 */, + { 272, 4391, 1805, 14, 4, UNI_NV__30000 } /* numericvalue=30000 */, + { 0, 7214, 2101, 25, 2, UNI_CCC__129 } /* canonicalcombiningclass=129 */, + { 1, 461, 31, 2, 4, UNI_AVST } /* isavst */, + { 0, 461, 6185, 2, 10, UNI_GLAG } /* isglagolitic */, + { 0, 461, 4161, 2, 15, UNI_DIACRITICALSEXT } /* isdiacriticalsext */, + { 12, 3863, 0, 14, 0, UNI_NV__8 } /* numericvalue=8 */, + { 0, 1102, 414, 4, 3, UNI_HAN } /* scx=han */, + { 28, 1823, 4176, 7, 6, UNI_SC__HANG } /* script=hangul */, + { 1, 895, 344, 5, 2, UNI_AGE__2_DOT_1 } /* age=v21 */, + { 146, 1823, 648, 7, 5, UNI_SC__ADLM } /* script=adlam */, + { 0, 3014, 2093, 12, 2, UNI_IN__15 } /* presentin=v150 */, + { 0, 2403, 2374, 8, 8, UNI_ETHIOPICEXT } /* ethiopicextended */, + { 17, 4371, 584, 5, 6, UNI_XPOSIXSPACE } /* wspace=true */, + { 0, 3177, 7048, 15, 9, UNI_EA__F } /* eastasianwidth=fullwidth */, + { 13, 7274, 1427, 8, 3, UNI_XPOSIXCNTRL } /* category=cc */, + { 3, 5168, 2302, 6, 6, UNI__PERL_IDCONT } /* _perl_idcont */, + { 0, 1823, 683, 7, 5, UNI_SC__TAKR } /* script=takri */, + { 3, 1454, 934, 2, 6, -UNI_SD } /* sd=false */, + { 33, 461, 136, 2, 4, UNI_MYMR } /* ismymr */, + { 35, 517, 2107, 4, 8, UNI_NV__15_SLASH_2 } /* nv=7.500e+00 */, + { 17, 55, 0, 4, 0, UNI_CHAM } /* cham */, + { 8, 1728, 4714, 5, 11, UNI_ARABICSUP } /* arabicsupplement */, + { 114, 4424, 1909, 16, 5, UNI_KANA } /* scriptextensions=kana */, + { 1, 3021, 2093, 5, 2, UNI_IN__15 } /* in=v150 */, + { 0, 3635, 0, 9, 0, UNI_LATINEXTE } /* latinexte */, + { 4, 461, 1262, 2, 4, UNI_SOYO } /* issoyo */, + { 0, 6165, 120, 3, 4, UNI_LAO } /* sc=laoo */, + { 4, 1667, 2256, 4, 8, UNI_PHAISTOS } /* blk=phaistos */, + { 1, 309, 5857, 2, 19, UNI_MONGOLIANSUP } /* inmongoliansupplement */, + { 22, 2324, 5373, 6, 18, UNI_TAIXUANJING } /* block=taixuanjingsymbols */, + { 36, 1942, 5671, 11, 3, -UNI_GRBASE } /* graphemebase=n */, + { 0, 4424, 1234, 17, 7, UNI_MULT } /* scriptextensions=multani */, + { 264, 2324, 854, 6, 7, UNI_INTAIVIET } /* block=taiviet */, + { 1, 2324, 4725, 6, 16, UNI_TANGUTSUP } /* block=tangutsupplement */, + { 9, 5637, 281, 21, 2, UNI_GCB__XX } /* graphemeclusterbreak=xx */, + { 12, 2232, 2172, 4, 8, UNI_NV__7_SLASH_8 } /* nv=8.750e-01 */, + { 1, 2525, 3100, 6, 6, UNI_XPOSIXXDIGIT } /* xposixxdigit */, + { 8, 1823, 1853, 7, 11, UNI_SC__SYLO } /* script=sylotinagri */, + { 0, 461, 144, 2, 4, UNI_NEWA } /* isnewa */, + { 2, 1102, 120, 4, 3, UNI_LAO } /* scx=lao */, + { 22, 1823, 1779, 7, 11, UNI_MEDF } /* script=medefaidrin */, + { 65, 402, 0, 4, 0, UNI_ARMN } /* armn */, + { 0, 461, 3349, 2, 15, UNI_MERC } /* ismeroiticcursive */, + { 1, 3021, 1318, 5, 2, UNI_IN__12 } /* in=v120 */, + { 64, 461, 1543, 2, 10, UNI_KHAR } /* iskharoshthi */, + { 0, 2536, 4765, 3, 5, UNI_JG__ZHAIN } /* jg=zhain */, + { 38, 2, 934, 3, 6, -UNI_CWL } /* cwl=false */, + { 39, 6163, 7429, 14, 14, UNI_INSC__CONSONANTPRECEDINGREPHA } /* insc=consonantprecedingrepha */, + { 138, 1823, 474, 7, 3, UNI_VAI } /* script=vai */, + { 0, 461, 814, 2, 4, UNI_QAAI } /* iszinh */, + { 4, 7591, 5092, 4, 15, UNI_LB__CP } /* lb=closeparenthesis */, + { 0, 4569, 599, 5, 3, -UNI_XPOSIXUPPER } /* upper=no */, + { 0, 4371, 352, 5, 5, UNI_XPOSIXSPACE } /* wspace=yes */, + { 90, 2523, 0, 13, 0, UNI_XPOSIXBLANK } /* isxposixblank */, + { 0, 4502, 129, 15, 3, UNI_LATINEXTF } /* blk=latinextendedf */, + { 7, 271, 3463, 4, 12, UNI_WB__EB } /* gcb=glueafterzwj */, + { 22, 461, 2, 2, 3, UNI_CWL } /* iscwl */, + { 0, 940, 934, 6, 2, -UNI_COMPEX } /* compex=f */, + { 2, 2301, 353, 4, 2, UNI_XIDC } /* xidc=y */, + { 0, 461, 2068, 2, 4, UNI_MEND } /* ismend */, + { 1, 5799, 1845, 5, 8, UNI_SUPERANDSUB } /* insuperandsub */, + { 2, 1823, 402, 7, 4, UNI_ARMN } /* script=armn */, + { 0, 6062, 5820, 7, 15, UNI_ENCLOSEDALPHANUM } /* block=enclosedalphanum */, + { 0, 7084, 3791, 8, 4, UNI_ARABICMATH } /* inarabicmath */, + { 0, 2483, 599, 5, 3, -UNI_CASED } /* cased=no */, + { 8, 1978, 0, 7, 0, UNI_SOGD } /* sogdian */, + { 2, 641, 0, 4, 0, UNI_hst_values_index } /* hst= */, + { 131, 312, 934, 5, 2, -UNI_QMARK } /* qmark=f */, + { 86, 552, 389, 4, 3, UNI_AGE__6_DOT_3 } /* age=6.3 */, + { 2, 5235, 2961, 15, 5, UNI_PC } /* connectorpunctuation */, + { 33, 1003, 0, 6, 0, UNI_LEPC } /* lepcha */, + { 3, 32, 585, 2, 2, UNI_VS } /* vs=t */, + { 0, 1272, 8214, 3, 32, UNI_DIACRITICALSEXT } /* iscombiningdiacriticalmarksextended */, + { 2, 176, 178, 2, 2, UNI_ROHG } /* rohg */, + { 1, 4043, 353, 17, 2, UNI_IDSB } /* idsbinaryoperator=y */, + { 6, 1823, 317, 7, 5, UNI_SC__TALE } /* script=taile */, + { 15, 2536, 2559, 3, 10, UNI_JG__KNOTTEDHEH } /* jg=knottedheh */, + { 1, 5658, 6534, 10, 7, UNI_identifierstatus_values_index } /* identifierstatus= */, + { 5, 510, 0, 4, 0, UNI_NV__3 } /* nv=3 */, + { 13, 2718, 6021, 14, 8, UNI_BC__RLO } /* bc=righttoleftoverride */, + { 5, 309, 4951, 2, 19, UNI_INEGYPTIANHIEROGLYPHS } /* inegyptianhieroglyphs */, + { 0, 4424, 2852, 17, 4, UNI_MAHJ } /* scriptextensions=mahj */, + { 6, 3538, 0, 16, 0, UNI_CYPRIOTSYLLABARY } /* cypriotsyllabary */, + { 0, 521, 934, 6, 2, -UNI_PATSYN } /* patsyn=f */, + { 2, 6165, 418, 3, 4, UNI_KHMR } /* sc=khmr */, + { 50, 309, 8142, 2, 18, UNI_IDEOGRAPHICSYMBOLS } /* inideographicsymbols */, + { 3, 1667, 5801, 4, 19, UNI_SUPARROWSB } /* blk=supplementalarrowsb */, + { 18, 3391, 760, 13, 3, UNI_NV__1_SLASH_2 } /* numericvalue=1/2 */, + { 143, 1102, 474, 4, 4, UNI_VAI } /* scx=vaii */, + { 36, 1198, 4076, 3, 14, UNI_CURRENCYSYMBOLS } /* incurrencysymbols */, + { 3, 1065, 2224, 4, 8, UNI_NV__1_SLASH_80 } /* nv=1.250e-02 */, + { 2, 7495, 295, 28, 1, UNI_CCC__19 } /* canonicalcombiningclass=ccc19 */, + { 0, 31, 0, 4, 0, UNI_AVST } /* avst */, + { 2, 1728, 1723, 6, 3, UNI_ARABICPFB } /* arabicpfb */, + { 8, 895, 2093, 6, 2, UNI_AGE__15 } /* age=v150 */, + { 0, 3130, 6945, 7, 12, UNI_GEOMETRICSHAPES } /* blk=geometricshapes */, + { 169, 2324, 7564, 6, 27, UNI_ANCIENTGREEKMUSIC } /* block=ancientgreekmusicalnotation */, + { 0, 4424, 228, 17, 4, UNI_XSUX } /* scriptextensions=xsux */, + { 1, 8538, 0, 20, 0, UNI_vo_values_index } /* verticalorientation= */, + { 1, 2324, 4862, 6, 4, UNI_RUMI } /* block=rumi */, + { 0, 6163, 6642, 5, 19, UNI_INSC__BRAHMIJOININGNUMBER } /* insc=brahmijoiningnumber */, + { 128, 533, 4667, 3, 5, UNI_SB__CL } /* sb=close */, + { 66, 1391, 21, 3, 2, UNI_WB__EX } /* wb=ex */, + { 6, 6090, 2046, 7, 11, UNI_INMASARAMGONDI } /* block=masaramgondi */, + { 0, 3633, 4533, 7, 4, UNI_LATINEXTC } /* inlatinextc */, + { 392, 2621, 0, 9, 0, UNI__PERL_SURROGATE } /* surrogate */, + { 0, 4424, 140, 17, 4, UNI_NARB } /* scriptextensions=narb */, + { 0, 2324, 6586, 6, 11, UNI_NUMBERFORMS } /* block=numberforms */, + { 0, 2002, 248, 7, 5, UNI_POSIXCNTRL } /* isposixcntrl */, + { 4, 1102, 1543, 4, 4, UNI_KHAR } /* scx=khar */, + { 9, 271, 4407, 4, 17, UNI_RI } /* gcb=regionalindicator */, + { 0, 1823, 4951, 7, 19, UNI_EGYP } /* script=egyptianhieroglyphs */, + { 3, 309, 2811, 2, 5, UNI_INKHMER } /* inkhmer */, + { 1, 4424, 678, 17, 5, UNI_RUNR } /* scriptextensions=runic */, + { 0, 5637, 1612, 21, 2, UNI_LB__LF } /* graphemeclusterbreak=lf */, + { 0, 3984, 353, 17, 2, UNI_EPRES } /* emojipresentation=y */, + { 0, 2018, 44, 12, 1, UNI_JT__U } /* joiningtype=u */, + { 1, 461, 6642, 2, 4, UNI_BRAH } /* isbrah */, + { 0, 461, 2068, 2, 12, UNI_MEND } /* ismendekikakui */, + { 3, 4377, 353, 14, 2, UNI_DT__NONE } /* nfkdquickcheck=y */, + { 1, 1397, 585, 3, 2, UNI_IDS } /* ids=t */, + { 22, 461, 333, 2, 6, UNI_CARI } /* iscarian */, + { 69, 4360, 68, 10, 2, UNI_LB__PR } /* linebreak=pr */, + { 4, 4002, 5118, 8, 7, UNI_MODIFIERLETTERS } /* modifierletters */, + { 3, 2766, 326, 3, 2, UNI_PF } /* gc=pf */, + { 1, 693, 4810, 3, 17, UNI_ORNAMENTALDINGBATS } /* isornamentaldingbats */, + { 1, 30, 6399, 1, 8, UNI_RADICAL } /* isradical */, + { 2, 461, 1358, 2, 4, UNI_PALM } /* ispalm */, + { 10, 5216, 1037, 11, 4, UNI_LATINEXTB } /* block=latinextb */, + { 10, 2324, 5857, 6, 12, UNI_MONGOLIANSUP } /* block=mongoliansup */, + { 2, 4424, 854, 17, 7, UNI_TAVT } /* scriptextensions=taiviet */, + { 48, 2324, 1505, 9, 4, UNI_CJKEXTA } /* block=cjkexta */, + { 0, 8, 274, 3, 1, UNI_pcm_values_index } /* pcm= */, + { 117, 2208, 1805, 4, 5, UNI_NV__500000 } /* nv=500000 */, + { 2, 1823, 369, 7, 4, UNI_GOTH } /* script=goth */, + { 0, 2718, 421, 3, 3, UNI_BC__RLI } /* bc=rli */, + { 1, 1823, 82, 7, 4, UNI_SC__GONG } /* script=gong */, + { 0, 4519, 5848, 14, 9, UNI_CYRILLICEXTA } /* block=cyrillicextendeda */, + { 0, 2324, 7724, 6, 28, UNI_VSSUP } /* block=variationselectorssupplement */, + { 0, 7274, 99, 9, 2, UNI_UPPERCASELETTER } /* category=lu */, + { 1, 1667, 8567, 5, 34, UNI_DIACRITICALSSUP } /* blk=combiningdiacriticalmarkssupplement */, + { 4, 3724, 3720, 12, 4, UNI_JG__MALAYALAMLLLA } /* jg=malayalamllla */, + { 0, 6165, 426, 3, 4, UNI_MRO } /* sc=mroo */, + { 2, 2002, 0, 3, 0, UNI_P } /* isp */, + { 3, 753, 599, 6, 2, UNI_NFKCQC__N } /* nfkcqc=n */, + { 0, 6041, 928, 21, 5, UNI_BPT__O } /* bidipairedbrackettype=open */, + { 268, 2732, 4531, 8, 6, UNI_ARABICEXTC } /* blk=arabicextc */, + { 0, 7591, 1612, 3, 2, UNI_LB__LF } /* lb=lf */, + { 10, 2180, 1314, 4, 3, UNI_NV__4000 } /* nv=4000 */, + { 0, 7198, 5909, 7, 7, UNI_SUPARROWSC } /* blk=suparrowsc */, + { 100, 2732, 5848, 10, 9, UNI_ARABICEXTA } /* blk=arabicextendeda */, + { 0, 2401, 1505, 10, 4, UNI_ETHIOPICEXTA } /* inethiopicexta */, + { 0, 1455, 353, 10, 4, UNI_DEP } /* deprecated=yes */, + { 1, 4360, 53, 10, 2, UNI_LB__NS } /* linebreak=ns */, + { 1, 1667, 2780, 4, 6, UNI_INCOPTIC } /* blk=coptic */, + { 0, 1667, 5067, 3, 11, UNI_INMANICHAEAN } /* blk=manichaean */, + { 0, 3892, 934, 16, 2, -UNI_STERM } /* sentenceterminal=f */, + { 52, 461, 4911, 2, 15, UNI_DIACRITICALSSUP } /* isdiacriticalssup */, + { 0, 1530, 3622, 5, 11, UNI_KANGXI } /* iskangxiradicals */, + { 0, 1075, 1069, 4, 2, UNI_NV__2_SLASH_3 } /* nv=2/3 */, + { 1, 1618, 934, 10, 6, -UNI_SD } /* softdotted=false */, + { 0, 6816, 0, 25, 0, UNI_CWKCF } /* changeswhennfkccasefolded */, + { 1, 339, 6288, 2, 6, UNI_CCC__L } /* ccc=left */, + { 2, 6427, 2728, 14, 3, UNI_JG__ALEF } /* joininggroup=alef */, + { 1, 629, 352, 5, 3, UNI_GRBASE } /* grbase=y */, + { 2, 1205, 0, 7, 0, UNI_GRAN } /* grantha */, + { 0, 7383, 7181, 10, 17, UNI_BC__ES } /* bidiclass=europeanseparator */, + { 1, 4424, 861, 17, 7, UNI_TIBT } /* scriptextensions=tibetan */, + { 33, 4424, 1125, 17, 8, UNI_TFNG } /* scriptextensions=tifinagh */, + { 192, 510, 1314, 4, 2, UNI_NV__300 } /* nv=300 */, + { 0, 6062, 620, 12, 5, UNI_ETHIOPICEXT } /* block=ethiopicext */, + { 2, 5460, 8552, 14, 6, UNI_term_values_index } /* terminalpunctuation= */, + { 2, 6735, 1144, 22, 3, UNI_JG__MALAYALAMBHA } /* joininggroup=malayalambha */, + { 258, 6165, 1522, 3, 4, UNI_UGAR } /* sc=ugar */, + { 159, 1823, 5031, 7, 14, UNI_SC__ROHG } /* script=hanifirohingya */, { 0, 1003, 0, 4, 0, UNI_LEPC } /* lepc */, - { 0, 413, 0, 4, 0, UNI_GONM } /* gonm */, - { 100, 2353, 8340, 3, 34, UNI_DIACRITICALSFORSYMBOLS } /* incombiningdiacriticalmarksforsymbols */, - { 15, 464, 5481, 2, 21, UNI_CWCF } /* ischangeswhencasefolded */, - { 1462, 4338, 934, 17, 6, -UNI_RI } /* regionalindicator=false */, - { 0, 3474, 1344, 6, 9, UNI_PALM } /* block=palmyrene */, - { 4, 1796, 453, 7, 4, UNI_MIAO } /* script=plrd */, - { 26, 3053, 356, 13, 4, UNI_POSIXXDIGIT } /* asciihexdigit=yes */, - { 0, 2253, 552, 10, 3, UNI_IN__4 } /* presentin=4.0 */, - { 0, 1216, 0, 4, 0, UNI_KANA } /* kana */, - { 0, 1867, 0, 5, 0, UNI_BIDIM } /* bidim */, - { 0, 1796, 90, 7, 4, UNI_SC__GREK } /* script=grek */, - { 0, 14, 3324, 1, 14, UNI_MISCPICTOGRAPHS } /* miscpictographs */, - { 0, 313, 4656, 2, 16, UNI_TANGUTSUP } /* intangutsupplement */, - { 0, 7527, 4338, 3, 17, UNI_RI } /* lb=regionalindicator */, - { 3628, 5990, 928, 21, 5, UNI_BPT__O } /* bidipairedbrackettype=open */, - { 0, 4355, 5340, 17, 10, UNI_DEVA } /* scriptextensions=devanagari */, - { 4, 2726, 256, 3, 2, UNI_CASEDLETTER } /* gc=lc */, - { 0, 1102, 825, 4, 7, UNI_SHAW } /* scx=shavian */, - { 0, 3090, 2332, 5, 7, UNI_GREEKEXT } /* blk=greekext */, - { 0, 3137, 6982, 15, 9, UNI_EA__F } /* eastasianwidth=fullwidth */, - { 6, 4355, 477, 17, 3, UNI_VAI } /* scriptextensions=vai */, - { 1050, 4355, 417, 17, 4, UNI_HANO } /* scriptextensions=hano */, - { 1, 738, 602, 2, 2, UNI_EA__N } /* ea=n */, - { 2051, 1766, 0, 7, 0, UNI_NFCQC__M } /* nfcqc=m */, - { 6, 313, 298, 2, 2, UNI_IN__9 } /* in=9 */, - { 4, 1975, 2033, 7, 5, UNI_POSIXALPHA } /* isposixalpha */, - { 2, 306, 2628, 3, 10, UNI_PATSYN } /* patternsyntax */, - { 21, 313, 6644, 2, 15, UNI_TRANSPORTANDMAP } /* intransportandmap */, - { 440, 2726, 1977, 3, 2, UNI_PO } /* gc=po */, - { 1, 6114, 64, 4, 3, UNI_CHRS } /* sc=chrs */, - { 0, 464, 749, 2, 7, UNI_MARC } /* ismarchen */, - { 7, 1879, 676, 4, 5, UNI_INOSAGE } /* blk=osage */, - { 0, 1383, 2891, 6, 3, UNI_IDS } /* idstart=t */, - { 647, 3474, 4081, 6, 11, UNI_INPUNCTUATION } /* block=punctuation */, - { 0, 6379, 4174, 13, 4, UNI_JG__HETH } /* joininggroup=heth */, - { 0, 3351, 294, 14, 1, UNI_NV__24 } /* numericvalue=24 */, - { 0, 3474, 1308, 6, 9, UNI_INOLDITALIC } /* block=olditalic */, - { 0, 6239, 91, 4, 2, UNI_BC__LRE } /* bc=lre */, - { 13, 23, 1104, 3, 3, UNI_POSIXXDIGIT } /* ahex=t */, - { 0, 34, 3542, 1, 17, UNI_HIGHPUSURROGATES } /* ishighpusurrogates */, - { 600, 2394, 5797, 7, 9, UNI_MYANMAREXTA } /* myanmarextendeda */, - { 31, 8244, 5183, 32, 4, UNI_CJKEXTE } /* block=cjkunifiedideographsextensione */, - { 28, 464, 216, 2, 4, UNI_TIBT } /* istibt */, - { 2266, 1539, 361, 3, 5, UNI_CAKM } /* ischakma */, - { 0, 34, 1596, 1, 3, UNI_SO } /* isso */, - { 0, 3474, 3608, 6, 14, UNI_PHONETICEXTSUP } /* block=phoneticextsup */, - { 453, 2726, 17, 3, 2, UNI_LM } /* gc=lm */, - { 2, 1702, 1037, 8, 4, UNI_ARABICEXTB } /* isarabicextb */, - { 0, 7828, 356, 16, 4, UNI_UIDEO } /* unifiedideograph=yes */, - { 0, 5147, 129, 17, 3, UNI_LATINEXTF } /* block=latinextendedf */, - { 1329, 7201, 17, 16, 2, UNI_LM } /* generalcategory=lm */, - { 2082, 6379, 1041, 13, 5, UNI_JG__GAMAL } /* joininggroup=gamal */, - { 0, 4355, 502, 17, 6, UNI_LYDI } /* scriptextensions=lydian */, - { 0, 2986, 0, 14, 0, UNI_PHLP } /* psalterpahlavi */, - { 0, 4355, 4582, 17, 4, UNI_BOPO } /* scriptextensions=bopo */, - { 1, 876, 356, 4, 4, UNI_IDEO } /* ideo=yes */, - { 3, 464, 975, 2, 8, UNI_GURU } /* isgurmukhi */, - { 4, 2365, 2336, 8, 8, UNI_ETHIOPICEXT } /* ethiopicextended */, - { 0, 4355, 4962, 17, 4, UNI_HAN } /* scriptextensions=hani */, - { 167, 625, 0, 7, 0, UNI_EXTPICT } /* extpict */, - { 1703, 1102, 5661, 4, 19, UNI_MERO } /* scx=meroitichieroglyphs */, - { 22, 6114, 82, 3, 4, UNI_DSRT } /* sc=dsrt */, - { 9, 2740, 0, 4, 0, UNI_COPT } /* copt */, - { 0, 265, 278, 5, 1, UNI_cwkcf_values_index } /* cwkcf= */, - { 0, 1516, 1491, 6, 4, UNI_KANAEXTA } /* iskanaexta */, - { 0, 3450, 7403, 12, 13, UNI_CYRILLICSUP } /* blk=cyrillicsupplementary */, - { 0, 1867, 356, 12, 2, UNI_BIDIM } /* bidimirrored=y */, - { 1, 5928, 48, 3, 1, UNI_VO__U } /* vo=u */, - { 3, 1102, 3435, 4, 15, UNI_ZANB } /* scx=zanabazarsquare */, - { 2, 464, 15, 2, 4, UNI_ADLM } /* isadlm */, - { 0, 6114, 1335, 3, 9, UNI_SC__OUGR } /* sc=olduyghur */, - { 261, 1102, 3839, 4, 6, UNI_TANG } /* scx=tangut */, - { 3008, 1410, 1153, 7, 2, UNI_CCC__24 } /* ccc=ccc24 */, - { 98, 1796, 810, 7, 4, UNI_SC__SYRC } /* script=syrc */, - { 520, 343, 8572, 4, 18, UNI_CCC__216 } /* ccc=attachedaboveright */, - { 1, 736, 1183, 3, 8, UNI_EMOTICONS } /* inemoticons */, - { 302, 4355, 5631, 17, 5, UNI_GREK } /* scriptextensions=greek */, - { 1, 4291, 1837, 10, 5, UNI_EBASE } /* linebreak=ebase */, - { 1, 6114, 1495, 3, 4, UNI_SC__JAVA } /* sc=java */, - { 0, 7018, 4645, 7, 11, UNI_ARABICSUP } /* inarabicsupplement */, - { 3953, 7584, 3249, 18, 5, UNI_DT__FIN } /* decompositiontype=final */, - { 106, 1702, 2665, 3, 13, UNI_ANCIENTSYMBOLS } /* isancientsymbols */, - { 0, 5844, 6898, 5, 22, UNI_SUPERANDSUB } /* issuperscriptsandsubscripts */, - { 88, 3974, 278, 17, 1, UNI_idsb_values_index } /* idsbinaryoperator= */, - { 2258, 4582, 0, 4, 0, UNI_BOPO } /* bopo */, - { 15, 1102, 1133, 4, 4, UNI_VITH } /* scx=vith */, - { 0, 2625, 934, 13, 2, -UNI_PATSYN } /* patternsyntax=f */, - { 35, 1102, 1220, 4, 7, UNI_MAKA } /* scx=makasar */, - { 2, 3734, 6042, 12, 4, UNI_NFCQC__M } /* nfkcquickcheck=m */, - { 3, 1766, 356, 5, 2, UNI_NFCQC__Y } /* nfcqc=y */, - { 0, 4450, 3869, 7, 16, UNI_UCAS } /* block=canadiansyllabics */, - { 2, 4020, 0, 4, 0, UNI_SIND } /* sind */, - { 0, 4355, 3671, 16, 10, UNI_MLYM } /* scriptextensions=malayalam */, - { 0, 600, 1687, 3, 8, UNI_DT__ISO } /* dt=isolated */, - { 0, 4500, 934, 5, 2, -UNI_XPOSIXUPPER } /* upper=f */, - { 0, 5544, 602, 21, 3, -UNI_CWT } /* changeswhentitlecased=no */, - { 4, 313, 8551, 2, 21, UNI_MATHOPERATORS } /* inmathematicaloperators */, - { 10, 75, 278, 3, 1, UNI_cwu_values_index } /* cwu= */, - { 2, 1102, 59, 4, 4, UNI_CHAM } /* scx=cham */, - { 1, 5, 601, 2, 4, -UNI_EXT } /* ext=no */, - { 1, 6114, 55, 3, 4, UNI_CANS } /* sc=cans */, - { 0, 4355, 2401, 17, 4, UNI_NAND } /* scriptextensions=nand */, - { 0, 1102, 1205, 4, 9, UNI_QAAI } /* scx=inherited */, - { 0, 313, 4882, 2, 19, UNI_INEGYPTIANHIEROGLYPHS } /* inegyptianhieroglyphs */, - { 0, 2973, 588, 5, 5, UNI_EPRES } /* epres=true */, - { 0, 1879, 8592, 4, 34, UNI_UCAS } /* blk=unifiedcanadianaboriginalsyllabics */, - { 233, 520, 0, 4, 0, UNI_NV__7 } /* nv=7 */, - { 4, 7584, 6944, 18, 9, UNI_DT__CAN } /* decompositiontype=canonical */, - { 0, 1377, 6276, 3, 6, UNI_WB__FO } /* wb=format */, - { 194, 6239, 302, 4, 2, UNI_BC__LRI } /* bc=lri */, - { 0, 1796, 6134, 7, 10, UNI_SC__GLAG } /* script=glagolitic */, - { 191, 1777, 6199, 6, 8, UNI_NV__10000000000 } /* nv=10000000000 */, - { 150, 313, 7403, 2, 28, UNI_SUPPUAA } /* insupplementaryprivateuseareaa */, - { 0, 313, 1362, 2, 9, UNI_INSAMARITAN } /* insamaritan */, - { 0, 343, 2074, 4, 2, UNI_CCC__29 } /* ccc=29 */, - { 0, 2726, 3594, 3, 2, UNI_NL } /* gc=nl */, - { 0, 3367, 2617, 14, 8, UNI_NV__2_SLASH_5 } /* numericvalue=4.000e-01 */, - { 77, 5147, 1698, 11, 4, UNI_LATINEXTF } /* block=latinextf */, - { 0, 464, 58, 2, 2, UNI_SC } /* issc */, - { 0, 1280, 0, 9, 0, UNI_NBAT } /* nabataean */, - { 0, 5136, 2382, 5, 10, UNI_MISCSYMBOLS } /* blk=miscsymbols */, - { 0, 6185, 0, 18, 0, UNI_NV__10000 } /* numericvalue=10000 */, - { 13, 313, 2155, 2, 4, UNI_IN__4_DOT_1 } /* in=4.1 */, - { 1, 2974, 397, 11, 2, UNI_IN__5_DOT_1 } /* presentin=v51 */, - { 1, 7201, 58, 16, 2, UNI_SC } /* generalcategory=sc */, - { 4, 833, 356, 4, 4, UNI_TERM } /* term=yes */, - { 0, 1879, 6447, 4, 5, UNI_MUSIC } /* blk=music */, - { 2259, 1102, 156, 4, 4, UNI_OUGR } /* scx=ougr */, - { 2, 5888, 588, 5, 5, UNI__PERL_NCHAR } /* nchar=true */, - { 0, 5136, 6549, 5, 21, UNI_MISCTECHNICAL } /* blk=miscellaneoustechnical */, - { 0, 6276, 0, 6, 0, UNI_CF } /* format */, - { 0, 3474, 6439, 6, 23, UNI_ZNAMENNYMUSIC } /* block=znamennymusicalnotation */, - { 2779, 721, 0, 7, 0, UNI_KNDA } /* kannada */, - { 500, 3474, 6134, 6, 20, UNI_GLAGOLITICSUP } /* block=glagoliticsupplement */, - { 0, 2483, 1915, 8, 5, UNI_XPOSIXGRAPH } /* isxposixgraph */, - { 1667, 513, 1300, 4, 3, UNI_NV__3000 } /* nv=3000 */, - { 1624, 313, 776, 2, 7, UNI_OLCK } /* inolchiki */, - { 4544, 2726, 4485, 3, 15, UNI_TITLE } /* gc=titlecaseletter */, - { 7, 378, 588, 5, 5, UNI_GREXT } /* grext=true */, - { 230, 5607, 2606, 15, 9, UNI_IDENTIFIERTYPE__TECHNICAL } /* identifiertype=technical */, - { 1, 1216, 328, 4, 3, UNI_KANASUP } /* kanasup */, - { 16, 296, 0, 4, 0, UNI_NV__9 } /* nv=9 */, - { 98, 8592, 0, 42, 0, UNI_UCASEXT } /* unifiedcanadianaboriginalsyllabicsextended */, - { 4694, 464, 2740, 2, 6, UNI_COPT } /* iscoptic */, - { 2187, 1516, 3582, 5, 11, UNI_KANGXI } /* iskangxiradicals */, - { 1090, 7201, 69, 16, 2, UNI_MN } /* generalcategory=mn */, - { 0, 2496, 1988, 3, 3, UNI_JG__WAW } /* jg=waw */, - { 6, 313, 8592, 2, 34, UNI_UCAS } /* inunifiedcanadianaboriginalsyllabics */, - { 953, 6944, 2195, 23, 2, UNI_CCC__6 } /* canonicalcombiningclass=6 */, - { 1, 3622, 4275, 3, 16, UNI_LETTERLIKESYMBOLS } /* isletterlikesymbols */, - { 1, 1879, 1117, 4, 8, UNI_INTAGBANWA } /* blk=tagbanwa */, - { 18, 2802, 2336, 10, 8, UNI_ETHIOPICEXT } /* isethiopicextended */, - { 1024, 2401, 0, 11, 0, UNI_NAND } /* nandinagari */, - { 2184, 242, 0, 2, 0, UNI_NB } /* nb */, - { 1317, 7660, 0, 17, 0, UNI_VS } /* variationselector */, - { 199, 6112, 6867, 14, 11, UNI_INSC__CONSONANTWITHSTACKER } /* insc=consonantwithstacker */, - { 0, 1826, 0, 11, 0, UNI_SYLO } /* sylotinagri */, - { 4, 464, 2241, 2, 12, UNI_PLAYINGCARDS } /* isplayingcards */, - { 1, 7201, 5103, 16, 2, UNI_CASEDLETTER } /* generalcategory=l_ */, - { 2116, 7132, 8550, 15, 22, UNI_SUPMATHOPERATORS } /* blk=supplementalmathematicaloperators */, - { 0, 3595, 6771, 10, 4, UNI_LATINEXTD } /* latinextendedd */, - { 11, 2496, 6154, 3, 19, UNI_JG__BURUSHASKIYEHBARREE } /* jg=burushaskiyehbarree */, - { 4608, 555, 6214, 4, 3, UNI_AGE__2_DOT_1 } /* age=2.1 */, - { 2, 8289, 7045, 10, 12, UNI_M } /* category=combiningmark */, - { 3816, 696, 3156, 5, 8, UNI_NO } /* isothernumber */, - { 0, 1102, 188, 4, 4, UNI_SGNW } /* scx=sgnw */, - { 1, 296, 3806, 2, 3, UNI_NV__80 } /* nv=80 */, - { 7, 3474, 1529, 6, 10, UNI_INKHAROSHTHI } /* block=kharoshthi */, - { 2832, 975, 0, 8, 0, UNI_GURU } /* gurmukhi */, - { 1, 536, 58, 3, 2, UNI_SB__SC } /* sb=sc */, - { 0, 343, 292, 5, 2, UNI_CCC__130 } /* ccc=130 */, - { 2208, 1915, 933, 11, 7, -UNI_GRBASE } /* graphemebase=false */, - { 577, 3351, 773, 13, 3, UNI_NV__7_SLASH_2 } /* numericvalue=7/2 */, - { 0, 1410, 562, 8, 2, UNI_CCC__107 } /* ccc=ccc107 */, - { 0, 4355, 3093, 16, 5, UNI_GEOR } /* scriptextensions=geor */, - { 2, 8182, 6241, 23, 5, UNI_INPC__LEFT } /* indicpositionalcategory=left */, - { 0, 7201, 469, 16, 2, UNI_SO } /* generalcategory=so */, - { 0, 5586, 4338, 21, 17, UNI_RI } /* graphemeclusterbreak=regionalindicator */, - { 0, 1796, 1785, 7, 11, UNI_HMNG } /* script=pahawhhmong */, - { 4416, 34, 2236, 1, 3, UNI_DI } /* isdi */, - { 2209, 464, 1220, 2, 4, UNI_MAKA } /* ismaka */, - { 0, 6944, 2207, 23, 2, UNI_CCC__8 } /* canonicalcombiningclass=8 */, - { 0, 4291, 119, 10, 2, UNI_LB__AL } /* linebreak=al */, - { 0, 6114, 168, 3, 4, UNI_SC__COPT } /* sc=qaac */, - { 6170, 313, 515, 2, 2, UNI_IN__3 } /* in=3 */, - { 70, 7527, 102, 3, 2, UNI_LB__HL } /* lb=hl */, - { 0, 2726, 0, 3, 0, UNI_gc_values_index } /* gc= */, - { 2063, 1879, 530, 4, 6, UNI_INREJANG } /* blk=rejang */, - { 3, 940, 0, 6, 0, UNI_COMPEX } /* compex */, - { 0, 3137, 0, 15, 0, UNI_ea_values_index } /* eastasianwidth= */, - { 5, 464, 1094, 2, 4, UNI_MERC } /* ismerc */, - { 0, 1796, 3671, 6, 10, UNI_SC__MLYM } /* script=malayalam */, - { 2200, 6114, 3309, 3, 15, UNI_MERC } /* sc=meroiticcursive */, - { 3, 6114, 5389, 3, 20, UNI_HMNP } /* sc=nyiakengpuachuehmong */, - { 2724, 4355, 82, 17, 4, UNI_DSRT } /* scriptextensions=dsrt */, - { 0, 3763, 1781, 14, 4, UNI_NV__50000 } /* numericvalue=50000 */, - { 0, 6112, 3177, 14, 4, UNI_INSC__CONSONANTDEAD } /* insc=consonantdead */, - { 2, 4355, 681, 17, 5, UNI_RUNR } /* scriptextensions=runic */, - { 2954, 1977, 0, 2, 0, UNI_PO } /* po */, - { 4, 1856, 588, 11, 5, UNI_BIDIC } /* bidicontrol=true */, - { 4, 2454, 6878, 5, 12, UNI_GEOMETRICSHAPES } /* isgeometricshapes */, - { 0, 1102, 401, 4, 4, UNI_MIAO } /* scx=miao */, - { 1738, 464, 9, 2, 3, UNI_OCR } /* isocr */, - { 0, 3474, 5340, 6, 18, UNI_DEVANAGARIEXT } /* block=devanagariextended */, - { 0, 464, 3933, 2, 14, UNI_SK } /* ismodifiersymbol */, - { 4873, 8276, 6613, 31, 10, UNI_INSC__CONSONANTHEADLETTER } /* indicsyllabiccategory=consonantheadletter */, - { 0, 4338, 588, 17, 5, UNI_RI } /* regionalindicator=true */, - { 0, 4338, 356, 17, 2, UNI_RI } /* regionalindicator=y */, - { 3657, 3779, 3777, 14, 2, UNI_NV__7_SLASH_8 } /* numericvalue=7/8 */, - { 0, 4355, 2018, 17, 12, UNI_GONM } /* scriptextensions=masaramgondi */, - { 0, 8533, 1818, 9, 8, UNI_SUPERANDSUB } /* block=superandsub */, - { 4, 612, 2002, 2, 10, UNI_LB__B2 } /* lb=breakboth */, - { 8, 1102, 1016, 5, 3, UNI_TELU } /* scx=telu */, - { 0, 2726, 2443, 3, 11, UNI_CASEDLETTER } /* gc=casedletter */, - { 1258, 2678, 424, 3, 3, UNI_BC__RLI } /* bc=rli */, - { 6, 2645, 0, 4, 0, UNI_IN__5 } /* in=5 */, - { 0, 5928, 0, 3, 0, UNI_vo_values_index } /* vo= */, - { 5253, 1879, 7500, 4, 27, UNI_ANCIENTGREEKMUSIC } /* blk=ancientgreekmusicalnotation */, - { 6, 4515, 278, 18, 1, UNI_idst_values_index } /* idstrinaryoperator= */, - { 2721, 2496, 3249, 3, 12, UNI_JG__FINALSEMKATH } /* jg=finalsemkath */, - { 2, 1102, 90, 4, 4, UNI_GREK } /* scx=grek */, - { 0, 1710, 4372, 3, 16, UNI_SMALLFORMS } /* issmallformvariants */, - { 3332, 6379, 2509, 13, 10, UNI_JG__DALATHRISH } /* joininggroup=dalathrish */, - { 4, 4291, 1977, 10, 2, UNI_LB__PO } /* linebreak=po */, - { 1156, 1102, 4582, 4, 4, UNI_BOPO } /* scx=bopo */, - { 5381, 3474, 1508, 6, 8, UNI_INUGARITIC } /* block=ugaritic */, - { 2, 2485, 4122, 6, 5, UNI_XPOSIXLOWER } /* xposixlower */, - { 0, 1796, 2217, 7, 12, UNI_HUNG } /* script=oldhungarian */, - { 1, 8276, 3177, 31, 4, UNI_INSC__CONSONANTDEAD } /* indicsyllabiccategory=consonantdead */, - { 892, 1174, 607, 3, 4, UNI_EA__W } /* ea=wide */, - { 2, 1382, 0, 8, 0, UNI_XIDS } /* xidstart */, - { 489, 14, 7761, 1, 30, UNI_MATHALPHANUM } /* mathematicalalphanumericsymbols */, - { 0, 5886, 601, 20, 4, -UNI__PERL_NCHAR } /* noncharactercodepoint=no */, - { 0, 464, 6533, 2, 16, UNI_INDICNUMBERFORMS } /* isindicnumberforms */, - { 0, 6944, 6491, 22, 4, UNI_CCC__AL } /* canonicalcombiningclass=al */, - { 4, 313, 666, 2, 5, UNI_INLIMBU } /* inlimbu */, - { 2883, 464, 306, 2, 5, UNI__PERL_PATWS } /* ispatws */, - { 454, 6114, 4962, 3, 14, UNI_SC__ROHG } /* sc=hanifirohingya */, - { 320, 313, 3498, 2, 16, UNI_CYPRIOTSYLLABARY } /* incypriotsyllabary */, - { 3166, 1717, 1465, 6, 5, UNI_VERTSPACE } /* isvertspace */, - { 0, 7473, 0, 27, 0, UNI_ALPHABETICPF } /* alphabeticpresentationforms */, - { 2250, 2678, 3078, 3, 12, UNI_BC__ON } /* bc=otherneutral */, - { 2629, 464, 7385, 2, 28, UNI_PHONETICEXTSUP } /* isphoneticextensionssupplement */, - { 0, 5502, 934, 21, 2, -UNI_CWCM } /* changeswhencasemapped=f */, - { 3846, 464, 5205, 2, 18, UNI_HALFMARKS } /* iscombininghalfmarks */, - { 12, 433, 0, 3, 0, UNI_NKO } /* nko */, - { 136, 3622, 4629, 6, 5, UNI_LATIN1 } /* islatin1sup */, - { 0, 1879, 7660, 4, 28, UNI_VSSUP } /* blk=variationselectorssupplement */, - { 2664, 7201, 2774, 19, 8, UNI_SO } /* generalcategory=othersymbol */, - { 530, 1796, 2812, 7, 4, UNI_SC__MAHJ } /* script=mahj */, - { 1678, 3593, 2579, 3, 12, UNI_LOWSURROGATES } /* inlowsurrogates */, - { 0, 2678, 844, 4, 2, UNI_BC__RLO } /* bc=rlo */, - { 3072, 895, 771, 5, 2, UNI_AGE__2_DOT_1 } /* age=v21 */, - { 2, 8182, 6581, 24, 6, UNI_INPC__BOTTOM } /* indicpositionalcategory=bottom */, - { 1, 154, 5223, 2, 16, UNI_INPUNCTUATION } /* generalpunctuation */, - { 129, 1796, 806, 7, 4, UNI_SARB } /* script=sarb */, - { 2146, 2678, 331, 3, 3, UNI_BC__FSI } /* bc=fsi */, - { 0, 2496, 0, 13, 0, UNI_JG__AFRICANFEH } /* jg=africanfeh */, - { 1157, 3090, 6878, 7, 20, UNI_GEOMETRICSHAPESEXT } /* blk=geometricshapesextended */, - { 0, 1796, 1227, 7, 4, UNI_SC__MULT } /* script=mult */, - { 202, 3474, 1491, 12, 4, UNI_ARABICEXTA } /* block=arabicexta */, - { 0, 343, 3101, 4, 11, UNI_CCC__DA } /* ccc=doubleabove */, - { 0, 313, 1317, 2, 9, UNI_INOLDPERMIC } /* inoldpermic */, - { 0, 1395, 5, 5, 4, UNI_LATINEXTG } /* latinextg */, - { 24, 2274, 588, 4, 5, UNI_XIDC } /* xidc=true */, - { 2168, 12, 37, 1, 1, UNI_PS } /* ps */, - { 0, 8007, 2335, 6, 5, UNI_CJKEXTE } /* blk=cjkexte */, - { 3459, 7527, 4219, 3, 14, UNI_LB__CR } /* lb=carriagereturn */, - { 22, 5586, 1842, 21, 3, UNI_WB__EB } /* graphemeclusterbreak=gaz */, - { 652, 1102, 2695, 3, 7, UNI_ARAB } /* scx=arabic */, - { 1047, 6114, 116, 3, 4, UNI_SC__KNDA } /* sc=knda */, - { 0, 536, 4500, 3, 5, UNI_SB__UP } /* sb=upper */, - { 4107, 2474, 5038, 3, 18, UNI_MODIFIERTONELETTERS } /* ismodifiertoneletters */, - { 6704, 464, 1090, 2, 4, UNI_LINB } /* islinb */, - { 0, 4355, 164, 17, 4, UNI_PHNX } /* scriptextensions=phnx */, - { 4160, 1335, 0, 9, 0, UNI_OUGR } /* olduyghur */, - { 0, 833, 356, 4, 2, UNI_TERM } /* term=y */, - { 1, 464, 1271, 2, 9, UNI_SIND } /* iskhudawadi */, - { 0, 7132, 4081, 7, 11, UNI_SUPPUNCTUATION } /* blk=suppunctuation */, - { 1, 6379, 717, 13, 4, UNI_JG__ZAIN } /* joininggroup=zain */, - { 0, 8533, 1588, 7, 9, UNI_SMALLFORMS } /* block=smallforms */, - { 0, 306, 0, 5, 0, UNI__PERL_PATWS } /* patws */, - { 2568, 6379, 490, 13, 3, UNI_JG__REH } /* joininggroup=reh */, - { 0, 23, 356, 4, 4, UNI_POSIXXDIGIT } /* ahex=yes */, - { 0, 464, 4021, 2, 17, UNI_INDICSIYAQNUMBERS } /* isindicsiyaqnumbers */, - { 2210, 2678, 5249, 3, 3, UNI_BC__RLE } /* bc=rle */, - { 17, 1065, 2104, 4, 8, UNI_NV__1_SLASH_6 } /* nv=1.667e-01 */, - { 0, 6112, 0, 14, 0, UNI_INSC__CONSONANT } /* insc=consonant */, - { 13, 6134, 0, 13, 0, UNI_GLAGOLITICSUP } /* glagoliticsup */, - { 3, 313, 1614, 2, 10, UNI_INWARANGCITI } /* inwarangciti */, - { 0, 23, 0, 4, 0, UNI_POSIXXDIGIT } /* ahex */, - { 0, 3474, 1785, 6, 11, UNI_INPAHAWHHMONG } /* block=pahawhhmong */, - { 0, 46, 3151, 2, 3, UNI_SB__LE } /* sb=le */, - { 0, 3450, 1939, 5, 9, UNI_COMPATJAMO } /* blk=compatjamo */, - { 4513, 7823, 8407, 5, 33, UNI_CJKCOMPATIDEOGRAPHSSUP } /* incjkcompatibilityideographssupplement */, - { 4390, 1075, 1781, 4, 4, UNI_NV__20000 } /* nv=20000 */, - { 5, 5586, 3432, 21, 3, UNI_LB__ZWJ } /* graphemeclusterbreak=zwj */, - { 0, 6114, 4551, 3, 7, UNI_SC__LINB } /* sc=linearb */, - { 2, 4355, 686, 17, 4, UNI_TAKR } /* scriptextensions=takr */, - { 1, 5607, 756, 18, 4, UNI_IDENTIFIERTYPE__NOTNFKC } /* identifiertype=notnfkc */, - { 4308, 313, 27, 2, 4, UNI_INAHOM } /* inahom */, - { 2321, 1796, 1508, 7, 8, UNI_UGAR } /* script=ugaritic */, - { 6912, 464, 192, 2, 4, UNI_SHAW } /* isshaw */, - { 24, 7201, 2384, 16, 2, UNI__PERL_SURROGATE } /* generalcategory=cs */, - { 0, 6944, 1304, 24, 2, UNI_CCC__20 } /* canonicalcombiningclass=20 */, - { 3, 140, 0, 4, 0, UNI_NARB } /* narb */, - { 2, 4291, 283, 10, 2, UNI_GCB__L } /* linebreak=jl */, - { 0, 464, 5806, 2, 19, UNI_MONGOLIANSUP } /* ismongoliansupplement */, - { 1, 296, 764, 4, 2, UNI_NV__9_SLASH_2 } /* nv=9/2 */, - { 0, 832, 356, 5, 4, UNI_STERM } /* sterm=yes */, - { 3, 7584, 2652, 18, 8, UNI_DT__VERT } /* decompositiontype=vertical */, - { 85, 4450, 5643, 7, 18, UNI_COUNTINGROD } /* block=countingrodnumerals */, - { 18, 2153, 1781, 4, 4, UNI_NV__40000 } /* nv=40000 */, - { 2980, 313, 2275, 2, 3, UNI_INIDC } /* inidc */, - { 0, 36, 356, 2, 4, UNI_VS } /* vs=yes */, - { 0, 7201, 6636, 20, 7, UNI_LO } /* generalcategory=otherletter */, - { 292, 2483, 1465, 8, 5, UNI_XPOSIXSPACE } /* isxposixspace */, - { 1, 464, 3608, 2, 14, UNI_PHONETICEXTSUP } /* isphoneticextsup */, - { 0, 6114, 1371, 3, 6, UNI_SC__THAA } /* sc=thaana */, - { 0, 3450, 8340, 5, 34, UNI_DIACRITICALSFORSYMBOLS } /* blk=combiningdiacriticalmarksforsymbols */, - { 0, 2692, 0, 10, 0, UNI_INARABIC } /* blk=arabic */, - { 3667, 1011, 278, 2, 1, UNI_ci_values_index } /* ci= */, - { 26, 1807, 0, 11, 0, UNI_SORA } /* sorasompeng */, - { 6, 4355, 991, 17, 4, UNI_HATR } /* scriptextensions=hatr */, - { 0, 1977, 3228, 5, 5, UNI_POSIXALNUM } /* posixalnum */, - { 0, 5865, 0, 21, 0, UNI_LOE } /* logicalorderexception */, - { 0, 7208, 1464, 9, 2, UNI_ZS } /* category=zs */, - { 0, 6114, 152, 3, 4, UNI_OSGE } /* sc=osge */, - { 1, 513, 1304, 5, 2, UNI_NV__3_SLASH_20 } /* nv=3/20 */ + { 37, 2766, 4016, 3, 14, UNI_ZS } /* gc=spaceseparator */, + { 0, 6165, 442, 3, 4, UNI_ORKH } /* sc=orkh */, + { 0, 309, 3649, 2, 11, UNI_PHONETICEXT } /* inphoneticext */, + { 8, 1667, 7537, 4, 27, UNI_ALPHABETICPF } /* blk=alphabeticpresentationforms */, + { 2, 521, 2288, 5, 2, UNI_patsyn_values_index } /* patsyn= */, + { 32, 1823, 1334, 7, 4, UNI_SC__PERM } /* script=perm */, + { 0, 1556, 0, 6, 0, UNI_ARROWS } /* arrows */, + { 77, 3514, 1505, 12, 4, UNI_ARABICEXTA } /* block=arabicexta */, + { 161, 30, 1617, 1, 11, UNI_SD } /* issoftdotted */, + { 0, 1102, 398, 4, 4, UNI_MIAO } /* scx=miao */, + { 0, 597, 51, 3, 3, UNI_DT__CAN } /* dt=can */, + { 1, 6165, 5876, 3, 4, UNI_SUND } /* sc=sund */, + { 0, 1059, 599, 6, 3, UNI_NFKDQC__N } /* nfkdqc=no */, + { 7, 1728, 0, 6, 0, UNI_ARAB } /* arabic */, + { 23, 30, 1581, 1, 11, UNI_INPHOENICIAN } /* inphoenician */, + { 29, 7383, 4472, 10, 15, UNI_BC__BN } /* bidiclass=boundaryneutral */, + { 35, 1823, 740, 8, 6, UNI_SC__MAND } /* script=mandaic */, + { 0, 1823, 333, 7, 6, UNI_CARI } /* script=carian */, + { 60, 5857, 0, 19, 0, UNI_MONGOLIANSUP } /* mongoliansupplement */, + { 2, 4360, 4407, 10, 17, UNI_RI } /* linebreak=regionalindicator */, + { 0, 2324, 5440, 6, 20, UNI_INNYIAKENGPUACHUEHMONG } /* block=nyiakengpuachuehmong */, + { 26, 1102, 663, 4, 5, UNI_LIMB } /* scx=limbu */, + { 0, 168, 318, 2, 2, UNI_QAAI } /* qaai */, + { 266, 8343, 7429, 31, 14, UNI_INSC__CONSONANTPRECEDINGREPHA } /* indicsyllabiccategory=consonantprecedingrepha */, + { 0, 53, 598, 1, 6, UNI_NV__NAN } /* nt=none */, + { 3, 261, 0, 5, 0, UNI_CWKCF } /* cwkcf */, + { 200, 2324, 1027, 6, 6, UNI_INYEZIDI } /* block=yezidi */, + { 0, 3727, 0, 9, 0, UNI_MLYM } /* malayalam */, + { 25, 406, 0, 2, 0, UNI_DI } /* di */, + { 0, 4360, 3760, 10, 13, UNI_LB__PR } /* linebreak=prefixnumeric */, + { 6, 1667, 5448, 4, 3, UNI_PUA } /* blk=pua */, + { 0, 461, 102, 2, 4, UNI_HMNG } /* ishmng */, + { 0, 3677, 130, 14, 2, UNI_LATINEXTF } /* islatinextendedf */, + { 2, 7086, 0, 24, 0, UNI_ARABICPFB } /* arabicpresentationformsb */, + { 0, 718, 0, 7, 0, UNI_KNDA } /* kannada */, + { 16, 312, 934, 5, 6, -UNI_QMARK } /* qmark=false */, + { 5, 6165, 4951, 3, 4, UNI_EGYP } /* sc=egyp */, + { 1, 1667, 6120, 4, 22, UNI_DIACRITICALSFORSYMBOLS } /* blk=diacriticalsforsymbols */, + { 0, 461, 5574, 2, 21, UNI_CWL } /* ischangeswhenlowercased */, + { 34, 1391, 2768, 2, 6, UNI_WB__XX } /* wb=other */, + { 0, 1667, 1572, 4, 10, UNI_INOLDPERSIAN } /* blk=oldpersian */, + { 64, 5895, 4457, 4, 15, UNI_SUTTONSIGNWRITING } /* issuttonsignwriting */, + { 0, 2403, 6193, 6, 12, UNI_ETHIOPICSUP } /* ethiopicsupplement */, + { 0, 5637, 1864, 21, 5, UNI_WB__EB } /* graphemeclusterbreak=ebase */, + { 6, 1102, 474, 4, 3, UNI_VAI } /* scx=vai */, + { 0, 4043, 934, 17, 6, -UNI_IDSB } /* idsbinaryoperator=false */, + { 34, 461, 6185, 2, 4, UNI_GLAG } /* isglag */, + { 1, 3098, 934, 8, 6, -UNI_XPOSIXXDIGIT } /* hexdigit=false */, + { 1, 2324, 1779, 6, 11, UNI_INMEDEFAIDRIN } /* block=medefaidrin */, + { 3, 2324, 725, 6, 7, UNI_KALI } /* block=kayahli */, + { 2, 1823, 3728, 8, 8, UNI_SC__MLYM } /* script=malayalam */, + { 6, 309, 991, 2, 6, UNI_INHATRAN } /* inhatran */, + { 1, 5595, 585, 21, 5, UNI_CWT } /* changeswhentitlecased=true */, + { 0, 461, 6082, 2, 8, UNI_GEOR } /* isgeorgian */, + { 2, 461, 410, 2, 4, UNI_GONM } /* isgonm */, + { 0, 1391, 3456, 5, 4, UNI_WB__MN } /* wb=midnum */, + { 0, 422, 0, 4, 0, UNI_LINA } /* lina */, + { 3, 7267, 3706, 16, 14, UNI_MN } /* generalcategory=nonspacingmark */, + { 2, 3490, 1505, 12, 4, UNI_CYRILLICEXTA } /* blk=cyrillicexta */, + { 0, 2232, 2164, 4, 8, UNI_NV__5_SLASH_6 } /* nv=8.333e-01 */, + { 58, 7267, 6677, 16, 14, UNI_LM } /* generalcategory=modifierletter */, + { 0, 7537, 131, 11, 1, UNI_ALPHABETICPF } /* alphabeticpf */, + { 0, 6287, 0, 23, 0, UNI_BC__LRE } /* bc=lefttorightembedding */, + { 1, 7752, 3894, 22, 4, UNI_JG__MANICHAEANTEN } /* joininggroup=manichaeanten */, + { 3, 1667, 144, 4, 4, UNI_INNEWA } /* blk=newa */, + { 10, 6000, 1926, 14, 7, UNI_YIJING } /* yijinghexagramsymbols */, + { 133, 309, 3325, 2, 6, UNI_INHEBREW } /* inhebrew */, + { 14, 2752, 934, 5, 2, -UNI_EMOJI } /* emoji=f */, + { 1, 5156, 1908, 8, 4, UNI_WB__KA } /* wordbreak=ka */, + { 2, 4176, 0, 6, 0, UNI_HANG } /* hangul */, + { 0, 1530, 0, 6, 0, UNI_KANA } /* iskana */, + { 0, 716, 3622, 5, 11, UNI_KANGXI } /* inkangxiradicals */, + { 0, 309, 555, 2, 2, UNI_IN__5 } /* in=5 */, + { 0, 7467, 1143, 26, 2, UNI_SUPPUAB } /* supplementaryprivateuseareab */, + { 1, 1102, 1484, 4, 8, UNI_BUGI } /* scx=buginese */, + { 1, 6165, 200, 3, 4, UNI_TAVT } /* sc=tavt */, + { 0, 2018, 2919, 12, 11, UNI_JT__L } /* joiningtype=leftjoining */, + { 1, 622, 353, 7, 4, UNI_EXTPICT } /* extpict=yes */, + { 0, 4569, 599, 5, 2, -UNI_XPOSIXUPPER } /* upper=n */, + { 4, 1102, 847, 4, 7, UNI_LANA } /* scx=taitham */, + { 0, 461, 1509, 2, 4, UNI_JAVA } /* isjava */, + { 0, 461, 2811, 2, 5, UNI_KHMR } /* iskhmer */, + { 1, 3130, 6945, 7, 15, UNI_GEOMETRICSHAPESEXT } /* blk=geometricshapesext */, + { 1, 4424, 1255, 17, 7, UNI_SIDD } /* scriptextensions=siddham */, + { 1, 1823, 909, 7, 8, UNI_BALI } /* script=balinese */, + { 0, 309, 1376, 2, 9, UNI_INSAMARITAN } /* insamaritan */, + { 13, 1823, 0, 11, 0, UNI_SC__MLYM } /* script=mlym */, + { 1, 1823, 426, 7, 3, UNI_MRO } /* script=mro */, + { 194, 2536, 4267, 3, 4, UNI_JG__TETH } /* jg=teth */, + { 66, 1994, 353, 7, 4, UNI_RADICAL } /* radical=yes */, + { 5, 7011, 0, 24, 0, UNI_ccc_values_index } /* canonicalcombiningclass= */, + { 110, 4360, 2621, 10, 9, UNI_LB__SG } /* linebreak=surrogate */, + { 1, 597, 946, 3, 5, UNI_DT__SUP } /* dt=super */, + { 5, 4424, 74, 17, 4, UNI_CYRL } /* scriptextensions=cyrl */, + { 23, 1667, 1294, 4, 9, UNI_INNABATAEAN } /* blk=nabataean */, + { 70, 6165, 2045, 3, 12, UNI_SC__GONM } /* sc=masaramgondi */, + { 0, 1102, 1027, 4, 4, UNI_YEZI } /* scx=yezi */, + { 34, 2180, 2107, 4, 8, UNI_NV__9_SLASH_2 } /* nv=4.500e+00 */, + { 0, 5255, 0, 20, 0, UNI_EXTPICT } /* extendedpictographic */, + { 124, 7011, 2165, 24, 2, UNI_CCC__33 } /* canonicalcombiningclass=33 */, + { 0, 2287, 6262, 4, 3, UNI_IN__12_DOT_1 } /* in=12.1 */, + { 44, 3407, 0, 14, 0, UNI_NV__4 } /* numericvalue=4 */, + { 0, 1102, 4487, 4, 6, UNI_ZYYY } /* scx=common */, + { 13410, 6165, 1686, 4, 10, UNI_SC__CPMN } /* sc=cyprominoan */, + { 1, 832, 585, 5, 5, UNI_STERM } /* sterm=true */, + { 0, 7274, 4150, 9, 11, UNI_P } /* category=punctuation */, + { 2, 6797, 0, 19, 0, UNI_DEVANAGARIEXTA } /* devanagariextendeda */, + { 0, 461, 253, 2, 4, UNI_CWCF } /* iscwcf */, + { 1, 5637, 163, 21, 2, UNI_GCB__PP } /* graphemeclusterbreak=pp */, + { 0, 4424, 1086, 17, 4, UNI_KTHI } /* scriptextensions=kthi */, + { 0, 7011, 461, 24, 2, UNI_CCC__IS } /* canonicalcombiningclass=is */, + { 10, 7648, 1707, 18, 3, UNI_DT__FRA } /* decompositiontype=fra */, + { 2, 461, 2665, 2, 13, UNI_PATSYN } /* ispatternsyntax */, + { 0, 6165, 3692, 3, 4, UNI_LISU } /* sc=lisu */, + { 0, 6165, 615, 3, 4, UNI_ELYM } /* sc=elym */, + { 81, 2766, 4827, 3, 18, UNI_ZP } /* gc=paragraphseparator */, + { 30, 7591, 3325, 3, 12, UNI_LB__HL } /* lb=hebrewletter */, + { 8, 461, 951, 2, 8, UNI_DUPL } /* isduployan */, + { 7, 461, 1611, 2, 2, UNI_LOWERCASELETTER } /* isll */, + { 34, 461, 3709, 2, 11, UNI_MC } /* isspacingmark */, + { 5, 7267, 8, 16, 1, UNI_P } /* generalcategory=p */, + { 28, 533, 5144, 3, 5, UNI_SB__AT } /* sb=aterm */, + { 0, 2324, 4090, 6, 17, UNI_INDICSIYAQNUMBERS } /* block=indicsiyaqnumbers */, + { 0, 5205, 7620, 5, 28, UNI_MISCARROWS } /* blk=miscellaneoussymbolsandarrows */, + { 1, 8356, 0, 11, 0, UNI_CO } /* category=co */, + { 0, 6165, 450, 3, 4, UNI_MIAO } /* sc=plrd */, + { 6, 4424, 3505, 16, 5, UNI_ETHI } /* scriptextensions=ethi */, + { 0, 2324, 5838, 6, 10, UNI_JAMO } /* block=hanguljamo */, + { 38, 2752, 1185, 3, 6, UNI_EMOTICONS } /* emoticons */, + { 0, 5916, 934, 21, 2, -UNI_LOE } /* logicalorderexception=f */, + { 0, 271, 21, 4, 2, UNI_GCB__EX } /* gcb=ex */, + { 21, 4161, 934, 9, 6, -UNI_DIA } /* diacritic=false */, + { 64, 461, 1438, 2, 10, UNI_CHRS } /* ischorasmian */, + { 0, 3013, 0, 5, 0, UNI_EPRES } /* epres */, + { 0, 4161, 353, 9, 4, UNI_DIA } /* diacritic=yes */, + { 3, 2324, 8142, 6, 18, UNI_IDEOGRAPHICSYMBOLS } /* block=ideographicsymbols */, + { 0, 120, 0, 3, 0, UNI_LAO } /* lao */, + { 259, 1992, 0, 10, 0, UNI_YIRADICALS } /* yiradicals */, + { 1, 2503, 585, 5, 5, UNI_JOINC } /* joinc=true */, + { 48, 5255, 585, 20, 5, UNI_EXTPICT } /* extendedpictographic=true */, + { 110, 461, 1454, 2, 2, UNI_SD } /* issd */, + { 2, 6287, 87, 4, 2, UNI_BC__LRE } /* bc=lre */, + { 2, 629, 352, 5, 2, UNI_grbase_values_index } /* grbase= */, + { 0, 7383, 83, 10, 2, UNI_BC__ON } /* bidiclass=on */, + { 0, 2324, 8214, 7, 24, UNI_DIACRITICALS } /* block=combiningdiacriticalmarks */, + { 205, 4502, 0, 18, 0, UNI_LATINEXTB } /* blk=latinextendedb */, + { 24, 7648, 7201, 17, 4, UNI_DT__SUP } /* decompositiontype=sup */, + { 10, 4852, 0, 10, 0, UNI_XPOSIXSPACE } /* whitespace */, + { 57, 309, 1978, 2, 7, UNI_INSOGDIAN } /* insogdian */, + { 0, 6735, 1193, 22, 3, UNI_JG__MALAYALAMNGA } /* joininggroup=malayalamnga */, + { 0, 7591, 0, 3, 0, UNI_lb_values_index } /* lb= */, + { 3, 7752, 5433, 23, 7, UNI_JG__MANICHAEANHUNDRED } /* joininggroup=manichaeanhundred */, + { 1, 4424, 1376, 17, 9, UNI_SAMR } /* scriptextensions=samaritan */, + { 7, 2324, 8474, 9, 33, UNI_CJKCOMPATIDEOGRAPHSSUP } /* block=cjkcompatibilityideographssupplement */, + { 1, 1391, 652, 3, 2, UNI_WB__MB } /* wb=mb */, + { 0, 309, 4725, 2, 16, UNI_TANGUTSUP } /* intangutsupplement */, + { 0, 2766, 13, 3, 2, UNI_LM } /* gc=lm */, + { 1, 461, 27, 2, 4, UNI_ARMI } /* isarmi */, + { 1, 2766, 65, 3, 2, UNI_MN } /* gc=mn */, + { 0, 1562, 0, 4, 0, UNI_NAGM } /* nagm */, + { 0, 2752, 353, 14, 4, UNI_ECOMP } /* emojicomponent=yes */, + { 1, 6165, 240, 3, 4, UNI_SC__ZYYY } /* sc=zyyy */, + { 13, 4424, 220, 17, 4, UNI_WCHO } /* scriptextensions=wcho */, + { 5, 2403, 5848, 8, 9, UNI_ETHIOPICEXTA } /* ethiopicextendeda */, + { 0, 1667, 1556, 4, 6, UNI_ARROWS } /* blk=arrows */, + { 2, 1102, 794, 4, 4, UNI_LANA } /* scx=lana */, + { 7, 309, 1556, 2, 6, UNI_ARROWS } /* inarrows */, + { 6, 1823, 3692, 7, 4, UNI_LISU } /* script=lisu */, + { 0, 339, 344, 4, 3, UNI_CCC__BL } /* ccc=218 */, + { 0, 461, 3325, 2, 4, UNI_HEBR } /* ishebr */, + { 0, 1094, 0, 4, 0, UNI_MERC } /* merc */, + { 1, 33, 7304, 1, 24, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* symbolsandpictographsexta */, + { 0, 7274, 3191, 8, 7, UNI_L } /* category=letter */, + { 4, 1102, 5876, 4, 4, UNI_SUND } /* scx=sund */, + { 2, 309, 6185, 2, 20, UNI_GLAGOLITICSUP } /* inglagoliticsupplement */, + { 0, 7274, 3706, 9, 14, UNI_MN } /* category=nonspacingmark */, + { 22, 5553, 934, 21, 2, -UNI_CWCM } /* changeswhencasemapped=f */, + { 0, 2324, 3325, 6, 6, UNI_INHEBREW } /* block=hebrew */, + { 6, 461, 5958, 2, 21, UNI_SINHALAARCHAICNUMBERS } /* issinhalaarchaicnumbers */, + { 0, 7084, 4511, 8, 9, UNI_ARABICEXTB } /* inarabicextendedb */, + { 28, 2324, 4131, 6, 8, UNI_VEDICEXT } /* block=vedicext */, + { 15, 5979, 1461, 17, 4, UNI_VO__TR } /* vo=transformedrotated */, + { 0, 2483, 0, 5, 0, UNI_CASED } /* cased */, + { 0, 517, 0, 4, 0, UNI_NV__7 } /* nv=7 */, + { 7, 1823, 1009, 7, 6, UNI_LYCI } /* script=lycian */, + { 0, 2966, 8001, 3, 29, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* insymbolsandpictographsextendeda */, + { 0, 4852, 352, 9, 5, UNI_XPOSIXSPACE } /* whitespace=yes */, + { 262, 3021, 1314, 5, 2, UNI_IN__10 } /* in=v100 */, + { 76, 4161, 599, 9, 2, -UNI_DIA } /* diacritic=n */, + { 3, 2832, 1505, 10, 4, UNI_CYRILLICEXTA } /* iscyrillicexta */, + { 0, 339, 2742, 4, 10, UNI_CCC__6 } /* ccc=hanreading */, + { 34, 3558, 0, 9, 0, UNI_Z } /* separator */, + { 7, 1734, 811, 3, 3, UNI_SYRC } /* issyrc */, + { 151, 3502, 5848, 12, 9, UNI_ETHIOPICEXTA } /* blk=ethiopicextendeda */, + { 80, 2536, 7342, 3, 10, UNI_JG__TEHMARBUTA } /* jg=tehmarbuta */, + { 165, 6165, 434, 3, 4, UNI_OGAM } /* sc=ogam */, + { 4, 4424, 909, 17, 8, UNI_BALI } /* scriptextensions=balinese */, + { 10, 1906, 4511, 8, 9, UNI_KANAEXTB } /* blk=kanaextendedb */, + { 6, 6165, 3663, 3, 10, UNI_SC__DEVA } /* sc=devanagari */, + { 6, 2208, 763, 4, 2, UNI_NV__5_SLASH_6 } /* nv=5/6 */, + { 0, 1530, 109, 3, 3, UNI_KAWI } /* iskawi */, + { 3, 8601, 6671, 7, 21, UNI_MODIFIERLETTERS } /* block=spacingmodifierletters */, + { 1, 3001, 3263, 12, 7, UNI_XPOSIXDIGIT } /* numerictype=decimal */, + { 53, 7724, 934, 17, 2, -UNI_VS } /* variationselector=f */, + { 0, 3633, 81, 9, 2, UNI_LATINEXTG } /* inlatinextg */, + { 0, 4424, 1003, 17, 4, UNI_LEPC } /* scriptextensions=lepc */, + { 4, 6450, 6, 14, 2, UNI_LB__CR } /* sentencebreak=cr */, + { 0, 7648, 3484, 18, 6, UNI_DT__SQR } /* decompositiontype=square */, + { 82, 2280, 2656, 11, 3, UNI_IN__15 } /* presentin=15.0 */, + { 2, 1823, 1125, 7, 8, UNI_TFNG } /* script=tifinagh */, + { 0, 7274, 0, 9, 0, UNI_gc_values_index } /* category= */, + { 3, 2018, 7683, 7, 6, UNI_JT__L } /* joiningtype=l */, + { 1, 2232, 2657, 4, 8, UNI_NV__4_SLASH_5 } /* nv=8.000e-01 */, + { 2, 7084, 7545, 6, 20, UNI_ARABICPFA } /* inarabicpresentationformsa */, + { 1, 1102, 442, 4, 4, UNI_ORKH } /* scx=orkh */, + { 0, 6165, 1812, 3, 11, UNI_HMNG } /* sc=pahawhhmong */, + { 87, 4941, 3622, 9, 11, UNI_KANGXI } /* block=kangxiradicals */, + { 0, 1530, 490, 5, 3, UNI_KANBUN } /* iskanbun */, + { 0, 3013, 585, 5, 5, UNI_EPRES } /* epres=true */, + { 0, 461, 450, 2, 4, UNI_MIAO } /* isplrd */, + { 0, 312, 0, 5, 0, UNI_QMARK } /* qmark */, + { 0, 718, 3622, 3, 3, UNI_KANGXI } /* kangxi */, + { 4, 3724, 4724, 12, 3, UNI_JG__MALAYALAMTTA } /* jg=malayalamtta */, + { 0, 2301, 5671, 10, 3, -UNI_XIDC } /* xidcontinue=n */, + { 258, 4360, 380, 10, 2, UNI_LB__HY } /* linebreak=hy */, + { 6, 3040, 599, 13, 2, -UNI_QMARK } /* quotationmark=n */, + { 0, 461, 3421, 2, 15, UNI_NARB } /* isoldnortharabian */, + { 8, 461, 1098, 2, 4, UNI_NSHU } /* isnshu */, + { 1, 4360, 2041, 10, 2, UNI_LB__H3 } /* linebreak=h3 */, + { 12, 4424, 176, 17, 4, UNI_ROHG } /* scriptextensions=rohg */, + { 0, 3378, 599, 13, 2, UNI_DT__CAN } /* nfdquickcheck=n */, + { 3, 2324, 1033, 6, 8, UNI_JAMOEXTB } /* block=jamoextb */, + { 0, 5216, 204, 13, 2, UNI_LATINEXTF } /* block=latinextf */, + { 26, 2523, 4569, 8, 5, UNI_XPOSIXUPPER } /* isxposixupper */, + { 0, 7591, 2609, 3, 10, UNI_LB__WJ } /* lb=wordjoiner */, + { 0, 2324, 2373, 8, 5, UNI_CJKEXTE } /* block=cjkexte */, + { 138, 5065, 225, 13, 2, UNI_JG__MANICHAEANPE } /* jg=manichaeanpe */, + { 0, 2324, 2411, 6, 11, UNI_KATAKANAEXT } /* block=katakanaext */, + { 1, 1823, 725, 7, 7, UNI_SC__KALI } /* script=kayahli */, + { 2, 609, 2029, 2, 10, UNI_LB__B2 } /* lb=breakboth */, + { 27, 533, 1165, 3, 2, UNI_SB__CL } /* sb=cl */, + { 4, 6163, 6416, 12, 11, UNI_INSC__CONSONANTSUBJOINED } /* insc=consonantsubjoined */, + { 9, 6735, 135, 14, 2, UNI_JG__MIM } /* joininggroup=mim */, + { 132, 7274, 4569, 9, 15, UNI_UPPERCASELETTER } /* category=uppercaseletter */, + { 3, 15, 3889, 2, 3, UNI_AGE__9 } /* age=9 */, + { 4, 8619, 0, 21, 0, UNI_MATHOPERATORS } /* mathematicaloperators */, + { 0, 5658, 753, 18, 4, UNI_IDENTIFIERTYPE__NOTNFKC } /* identifiertype=notnfkc */, + { 14, 1102, 1367, 4, 9, UNI_PAUC } /* scx=paucinhau */, + { 0, 2432, 3788, 3, 15, UNI_MISCMATHSYMBOLSA } /* inmiscmathsymbolsa */, + { 0, 6163, 7690, 13, 17, UNI_INSC__CONSONANTINITIALPOSTFIXED } /* insc=consonantinitialpostfixed */, + { 65, 461, 7892, 2, 16, UNI_UIDEO } /* isunifiedideograph */, + { 33, 2766, 1887, 3, 7, UNI_XPOSIXCNTRL } /* gc=control */, + { 0, 2060, 599, 5, 3, -UNI_XPOSIXALPHA } /* alpha=no */, + { 50, 2324, 8407, 7, 34, UNI_DIACRITICALSFORSYMBOLS } /* block=combiningdiacriticalmarksforsymbols */, + { 0, 1823, 462, 7, 4, UNI_SHAW } /* script=shaw */, + { 3, 1726, 4987, 3, 9, UNI_ALCHEMICAL } /* isalchemical */, + { 0, 6677, 0, 14, 0, UNI_LM } /* modifierletter */, + { 103, 461, 5255, 2, 20, UNI_EXTPICT } /* isextendedpictographic */, + { 16, 4941, 5848, 10, 9, UNI_KANAEXTA } /* block=kanaextendeda */, + { 1, 7383, 535, 9, 2, UNI_BC__S } /* bidiclass=s */, + { 0, 461, 1685, 2, 11, UNI_CPMN } /* iscyprominoan */, + { 54, 6165, 1543, 3, 4, UNI_KHAR } /* sc=khar */, + { 0, 3391, 393, 13, 2, UNI_NV__15 } /* numericvalue=15 */, + { 4, 3391, 1069, 14, 2, UNI_NV__2_SLASH_3 } /* numericvalue=2/3 */, + { 3, 1198, 6382, 5, 18, UNI_CJKCOMPATFORMS } /* incjkcompatibilityforms */, + { 389, 4060, 0, 15, 0, UNI_BRAI } /* braillepatterns */, + { 0, 6427, 2009, 13, 9, UNI_JG__SYRIACWAW } /* joininggroup=syriacwaw */, + { 2, 16, 1794, 1, 3, UNI_M } /* gc=m */, + { 3, 2718, 6310, 3, 20, UNI_BC__PDF } /* bc=popdirectionalformat */, + { 1, 4683, 0, 16, 0, UNI_PF } /* finalpunctuation */, + { 10, 4360, 7593, 9, 27, UNI_LB__CJ } /* linebreak=conditionaljapanesestarter */, + { 71, 461, 4089, 2, 4, UNI_SIND } /* issind */, + { 69, 2004, 3100, 4, 6, UNI_POSIXDIGIT } /* posixdigit */, + { 2, 4391, 346, 15, 1, UNI_NV__3_SLASH_8 } /* numericvalue=3/8 */, + { 0, 533, 4191, 3, 5, UNI_SB__LO } /* sb=lower */, + { 69, 2324, 6776, 6, 21, UNI_MEETEIMAYEKEXT } /* block=meeteimayekextensions */, + { 1, 4569, 352, 8, 2, UNI_upper_values_index } /* uppercase= */, + { 3, 1894, 934, 5, 2, -UNI_BIDIM } /* bidim=f */, + { 29, 6450, 832, 14, 5, UNI_SB__ST } /* sentencebreak=sterm */, + { 21, 3098, 585, 8, 5, UNI_XPOSIXXDIGIT } /* hexdigit=true */, + { 1, 2483, 934, 5, 2, -UNI_CASED } /* cased=f */, + { 1, 6514, 0, 10, 0, UNI_CO } /* privateuse */, + { 0, 71, 353, 3, 2, UNI_CWU } /* cwu=y */, + { 1, 7383, 1715, 21, 7, UNI_BC__LRI } /* bidiclass=lefttorightisolate */, + { 5, 6427, 1920, 13, 3, UNI_JG__TAH } /* joininggroup=tah */, + { 0, 3583, 0, 16, 0, UNI_HIGHPUSURROGATES } /* highpusurrogates */, + { 0, 7267, 7110, 16, 13, UNI_M } /* generalcategory=combiningmark */, + { 8, 6165, 3349, 3, 15, UNI_MERC } /* sc=meroiticcursive */, + { 2, 1667, 847, 4, 7, UNI_INTAITHAM } /* blk=taitham */, + { 1, 1396, 2931, 7, 3, UNI_XIDS } /* xidstart=t */, + { 5, 2494, 6945, 5, 20, UNI_GEOMETRICSHAPESEXT } /* isgeometricshapesextended */, + { 0, 1272, 6400, 5, 11, UNI_CJKRADICALSSUP } /* iscjkradicalssup */, + { 7, 1823, 5778, 7, 21, UNI_PRTI } /* script=inscriptionalparthian */, + { 0, 641, 140, 4, 2, UNI_HST__NA } /* hst=na */, + { 0, 461, 6986, 2, 25, UNI_SYMBOLSFORLEGACYCOMPUTING } /* issymbolsforlegacycomputing */, + { 73, 2302, 585, 10, 5, UNI_IDC } /* idcontinue=true */, + { 19, 30, 1116, 1, 5, UNI_TAGB } /* istagb */, + { 2, 461, 7110, 2, 13, UNI_M } /* iscombiningmark */, + { 0, 3677, 4698, 6, 12, UNI_LATIN1 } /* islatin1supplement */, + { 13, 1424, 520, 8, 1, UNI_CCC__17 } /* ccc=ccc17 */, + { 13, 1667, 0, 7, 0, UNI_CJK } /* blk=cjk */, + { 38, 461, 1992, 2, 10, UNI_YIRADICALS } /* isyiradicals */, + { 3, 1611, 0, 2, 0, UNI_LOWERCASELETTER } /* ll */, + { 0, 7648, 7011, 18, 9, UNI_DT__CAN } /* decompositiontype=canonical */, + { 0, 8601, 5813, 9, 7, UNI_SUPARROWSB } /* block=suparrowsb */, + { 30, 1823, 615, 7, 7, UNI_ELYM } /* script=elymaic */, + { 29, 1823, 1248, 7, 4, UNI_SC__PHAG } /* script=phag */, + { 29, 1174, 3123, 3, 7, UNI_EA__N } /* ea=neutral */, + { 0, 4424, 1262, 17, 4, UNI_SOYO } /* scriptextensions=soyo */, + { 0, 6165, 23, 3, 4, UNI_AHOM } /* sc=ahom */, + { 65, 1102, 4926, 4, 5, UNI_TAML } /* scx=tamil */, + { 38, 339, 2092, 4, 2, UNI_CCC__25 } /* ccc=25 */, + { 2, 1424, 348, 7, 2, UNI_CCC__91 } /* ccc=ccc91 */, + { 2, 4941, 1505, 10, 4, UNI_KANAEXTA } /* block=kanaexta */, + { 5, 5658, 0, 15, 0, UNI_identifiertype_values_index } /* identifiertype= */, + { 130, 309, 6900, 2, 23, UNI_BYZANTINEMUSIC } /* inbyzantinemusicalsymbols */, + { 62, 4584, 599, 18, 3, -UNI_IDST } /* idstrinaryoperator=no */, + { 2, 3514, 4659, 12, 9, UNI_ARABICEXTC } /* block=arabicextendedc */, + { 71, 4569, 5671, 8, 3, -UNI_XPOSIXUPPER } /* uppercase=n */, + { 11, 339, 295, 5, 1, UNI_CCC__19 } /* ccc=19 */, + { 2, 7648, 2030, 20, 5, UNI_DT__NB } /* decompositiontype=nobreak */, + { 0, 6090, 7620, 7, 19, UNI_MISCSYMBOLS } /* block=miscellaneoussymbols */, + { 8, 3908, 3696, 6, 10, UNI_TANGUTSUP } /* tangutsupplement */, + { 0, 2324, 1872, 6, 11, UNI_YISYLLABLES } /* block=yisyllables */, + { 1, 876, 934, 4, 2, -UNI_IDEO } /* ideo=f */, + { 118, 461, 802, 2, 4, UNI_SARB } /* issarb */, + { 224, 309, 8660, 2, 43, UNI_UCASEXTA } /* inunifiedcanadianaboriginalsyllabicsextendeda */, + { 211, 4941, 1286, 7, 8, UNI_INKHUDAWADI } /* block=khudawadi */, + { 70, 0, 0, 2, 0, UNI_CASEDLETTER } /* l& */, + { 0, 461, 5778, 2, 21, UNI_PRTI } /* isinscriptionalparthian */, + { 1, 2002, 1082, 7, 4, UNI_POSIXWORD } /* isposixword */, + { 204, 8, 1659, 1, 8, UNI_POSIXSPACE } /* perlspace */, + { 0, 2718, 7181, 3, 17, UNI_BC__ES } /* bc=europeanseparator */, + { 2, 461, 184, 2, 4, UNI_SAMR } /* issamr */, + { 1, 4424, 1853, 17, 11, UNI_SYLO } /* scriptextensions=sylotinagri */, + { 0, 1906, 3696, 8, 10, UNI_KANASUP } /* blk=kanasupplement */, + { 67, 2324, 2411, 6, 8, UNI_INKATAKANA } /* block=katakana */, + { 0, 4852, 933, 9, 3, -UNI_XPOSIXSPACE } /* whitespace=f */, + { 0, 8343, 2452, 22, 8, UNI_INSC__AVAGRAHA } /* indicsyllabiccategory=avagraha */, + { 1, 461, 2411, 2, 8, UNI_KANA } /* iskatakana */, + { 3, 17, 984, 1, 3, UNI_HIRA } /* hira */, + { 2, 266, 934, 3, 6, -UNI_CWT } /* cwt=false */, + { 1, 4424, 200, 17, 4, UNI_TAVT } /* scriptextensions=tavt */, + { 0, 4424, 8667, 17, 18, UNI_CANS } /* scriptextensions=canadianaboriginal */, + { 69, 4043, 585, 4, 5, UNI_IDSB } /* idsb=true */, + { 194, 1198, 8214, 3, 24, UNI_DIACRITICALS } /* incombiningdiacriticalmarks */, + { 67, 5068, 0, 10, 0, UNI_MANI } /* manichaean */, + { 0, 7648, 604, 18, 4, UNI_EA__F } /* decompositiontype=wide */, + { 0, 8071, 4218, 30, 4, UNI_CJKEXTH } /* blk=cjkunifiedideographsextensionh */, + { 144, 1823, 204, 7, 4, UNI_TFNG } /* script=tfng */, + { 1, 461, 322, 2, 5, UNI_VSSUP } /* isvssup */, + { 3, 605, 642, 2, 3, UNI_idst_values_index } /* idst= */, + { 140, 2324, 1262, 6, 7, UNI_INSOYOMBO } /* block=soyombo */, + { 2, 2732, 1141, 10, 3, UNI_ARABICPFA } /* blk=arabicpfa */, + { 0, 7267, 3554, 16, 13, UNI_ZL } /* generalcategory=lineseparator */, + { 193, 1102, 426, 4, 4, UNI_MRO } /* scx=mroo */, + { 1, 1823, 537, 7, 4, UNI_TANG } /* script=tang */, + { 1, 406, 585, 2, 5, UNI_DI } /* di=true */, + { 0, 461, 1385, 2, 4, UNI_THAA } /* isthaa */, + { 2, 552, 2083, 5, 2, UNI_AGE__5_DOT_1 } /* age=5.1 */, + { 0, 3791, 353, 4, 4, UNI_MATH } /* math=yes */, + { 12, 1102, 5682, 4, 5, UNI_GREK } /* scx=greek */, + { 1, 4424, 422, 17, 4, UNI_LINA } /* scriptextensions=lina */, + { 0, 3093, 934, 13, 2, -UNI_POSIXXDIGIT } /* asciihexdigit=f */, + { 3, 3635, 4770, 13, 10, UNI_LATINEXTADDITIONAL } /* latinextendedadditional */, + { 66, 5255, 353, 20, 2, UNI_EXTPICT } /* extendedpictographic=y */, + { 0, 895, 290, 5, 2, UNI_AGE__4 } /* age=v40 */, + { 17, 2324, 283, 6, 5, UNI_INNUSHU } /* block=nushu */, + { 20, 2718, 2728, 10, 4, UNI_BC__R } /* bc=righttoleft */, + { 7, 1823, 454, 7, 4, UNI_PRTI } /* script=prti */, + { 1, 4424, 78, 17, 4, UNI_DSRT } /* scriptextensions=dsrt */, + { 1, 2220, 2091, 4, 8, UNI_NV__5_SLASH_8 } /* nv=6.250e-01 */, + { 0, 4424, 55, 17, 4, UNI_CHAM } /* scriptextensions=cham */, + { 0, 8343, 5731, 23, 15, UNI_INSC__CANTILLATIONMARK } /* indicsyllabiccategory=cantillationmark */, + { 1, 2988, 2327, 11, 3, UNI_nfcqc_values_index } /* nfcquickcheck= */, + { 30, 1065, 3876, 5, 2, UNI_NV__1_SLASH_80 } /* nv=1/80 */, + { 15, 7274, 4002, 9, 14, UNI_SK } /* category=modifiersymbol */, + { 0, 2324, 5958, 6, 7, UNI_INSINHALA } /* block=sinhala */, + { 0, 4424, 802, 17, 4, UNI_SARB } /* scriptextensions=sarb */, + { 169, 71, 585, 3, 5, UNI_CWU } /* cwu=true */, + { 1, 3021, 394, 4, 2, UNI_IN__5_DOT_1 } /* in=v51 */, + { 0, 1102, 4620, 4, 7, UNI_LINB } /* scx=linearb */, + { 1, 8505, 3263, 3, 7, UNI_XPOSIXDIGIT } /* nt=decimal */, + { 82, 4424, 1105, 16, 5, UNI_TALU } /* scriptextensions=talu */, + { 0, 7383, 119, 10, 2, UNI_BC__AL } /* bidiclass=al */, + { 259, 3391, 289, 13, 1, UNI_NV__0 } /* numericvalue=0 */, + { 0, 3021, 396, 4, 2, UNI_IN__6_DOT_1 } /* in=v61 */, + { 32, 4, 352, 2, 2, UNI_loe_values_index } /* loe= */, + { 10, 309, 4862, 2, 18, UNI_RUMI } /* inruminumeralsymbols */, + { 0, 1396, 353, 4, 4, UNI_XIDS } /* xids=yes */, + { 1, 6165, 790, 3, 4, UNI_SC__KALI } /* sc=kali */, + { 0, 8601, 819, 7, 6, UNI_SC__SHRD } /* block=sharada */, + { 51, 1823, 39, 7, 4, UNI_BHKS } /* script=bhks */, + { 1, 4424, 663, 17, 4, UNI_LIMB } /* scriptextensions=limb */, + { 1, 7267, 4602, 16, 18, UNI_PI } /* generalcategory=initialpunctuation */, + { 0, 5876, 0, 9, 0, UNI_SUND } /* sundanese */, + { 0, 1102, 806, 4, 4, UNI_SHRD } /* scx=shrd */, + { 1, 461, 3727, 2, 9, UNI_MLYM } /* ismalayalam */, + { 2, 2718, 3118, 3, 12, UNI_BC__ON } /* bc=otherneutral */, + { 142, 1823, 98, 7, 4, UNI_HLUW } /* script=hluw */, + { 1, 2766, 3101, 3, 5, UNI_XPOSIXDIGIT } /* gc=digit */, + { 3, 461, 5373, 2, 18, UNI_TAIXUANJING } /* istaixuanjingsymbols */, + { 4, 461, 653, 2, 5, UNI_BUHD } /* isbuhid */, + { 1, 1200, 1448, 3, 7, UNI_CJKSTROKES } /* cjkstrokes */, + { 0, 30, 1190, 1, 5, UNI_BENG } /* isbeng */, + { 135, 2766, 115, 3, 2, UNI_SK } /* gc=sk */, + { 11, 1102, 668, 4, 5, UNI_OGAM } /* scx=ogham */, + { 3, 2766, 5172, 3, 2, UNI_CASEDLETTER } /* gc=l_ */, + { 2, 4424, 1522, 17, 8, UNI_UGAR } /* scriptextensions=ugaritic */, + { 0, 1823, 739, 7, 4, UNI_SC__MAND } /* script=mand */, + { 8, 1272, 5694, 3, 10, UNI_COUNTINGROD } /* iscountingrod */, + { 263, 1667, 8214, 5, 32, UNI_DIACRITICALSEXT } /* blk=combiningdiacriticalmarksextended */, + { 0, 2324, 426, 6, 3, UNI_INMRO } /* block=mro */, + { 147, 8660, 0, 42, 0, UNI_UCASEXT } /* unifiedcanadianaboriginalsyllabicsextended */, + { 140, 1894, 599, 12, 2, -UNI_BIDIM } /* bidimirrored=n */, + { 1, 4852, 352, 9, 2, UNI_wspace_values_index } /* whitespace= */, + { 38, 4970, 0, 13, 0, UNI_EMOD } /* emojimodifier */, + { 1, 7648, 1707, 18, 8, UNI_DT__FRA } /* decompositiontype=fraction */, + { 0, 375, 598, 4, 3, -UNI_GREXT } /* grext=n */, + { 0, 2324, 216, 6, 4, UNI_INTOTO } /* block=toto */, + { 132, 5939, 934, 5, 6, -UNI__PERL_NCHAR } /* nchar=false */, + { 36, 3817, 2224, 14, 8, UNI_NV__1_SLASH_80 } /* numericvalue=1.250e-02 */, + { 4, 4424, 798, 17, 4, UNI_NBAT } /* scriptextensions=nbat */, + { 2, 2766, 199, 3, 2, UNI_TITLE } /* gc=lt */, + { 0, 309, 1404, 2, 10, UNI_ASCII } /* inbasiclatin */, + { 6, 6287, 298, 4, 2, UNI_BC__LRI } /* bc=lri */, + { 2, 461, 622, 2, 7, UNI_EXTPICT } /* isextpict */, + { 2, 2324, 2468, 6, 13, UNI_IPAEXT } /* block=ipaextensions */, + { 35, 6165, 31, 3, 4, UNI_AVST } /* sc=avst */, + { 18, 6165, 1262, 3, 4, UNI_SOYO } /* sc=soyo */, + { 0, 4424, 188, 17, 4, UNI_SGNW } /* scriptextensions=sgnw */, + { 40, 3984, 585, 17, 5, UNI_EPRES } /* emojipresentation=true */, + { 4, 461, 7724, 2, 18, UNI_INVS } /* isvariationselectors */, + { 0, 461, 2335, 2, 13, UNI_BLOCKELEMENTS } /* isblockelements */, + { 9, 1396, 598, 7, 2, UNI_xids_values_index } /* xidstart= */, + { 6, 309, 5876, 2, 9, UNI_INSUNDANESE } /* insundanese */, + { 37, 20, 1104, 2, 3, UNI_XPOSIXXDIGIT } /* hex=t */, + { 70, 4970, 0, 17, 0, UNI_EBASE } /* emojimodifierbase */, + { 139, 30, 4190, 1, 10, UNI_XPOSIXLOWER } /* islowercase */, + { 812, 940, 599, 6, 2, -UNI_COMPEX } /* compex=n */, + { 0, 1102, 499, 4, 4, UNI_LYDI } /* scx=lydi */, + { 228, 4424, 634, 17, 7, UNI_HANO } /* scriptextensions=hanunoo */, + { 0, 1102, 1117, 4, 8, UNI_TAGB } /* scx=tagbanwa */, + { 1, 461, 875, 2, 5, UNI_UIDEO } /* isuideo */, + { 0, 7198, 4710, 5, 8, UNI_SYRIACSUP } /* blk=syriacsup */, + { 0, 232, 0, 4, 0, UNI_YI } /* yiii */, + { 56, 1391, 700, 3, 2, UNI_WB__EB } /* wb=em */, + { 0, 461, 4161, 2, 12, UNI_DIACRITICALS } /* isdiacriticals */, + { 0, 112, 114, 2, 2, UNI_KITS } /* kits */, + { 3, 1102, 1582, 4, 10, UNI_PHNX } /* scx=phoenician */, + { 0, 461, 8, 2, 2, UNI_PC } /* ispc */, + { 0, 2324, 1367, 6, 9, UNI_INPAUCINHAU } /* block=paucinhau */, + { 320, 6185, 0, 10, 0, UNI_GLAG } /* glagolitic */, + { 11, 1667, 2811, 4, 12, UNI_KHMERSYMBOLS } /* blk=khmersymbols */, + { 29, 4502, 4770, 12, 10, UNI_LATINEXTADDITIONAL } /* blk=latinextadditional */, + { 177, 7383, 176, 11, 2, UNI_BC__LRO } /* bidiclass=lro */, + { 3, 2732, 2800, 5, 11, UNI_ALPHABETICPF } /* blk=alphabeticpf */, + { 0, 6427, 4243, 13, 4, UNI_JG__HETH } /* joininggroup=heth */, + { 5, 4360, 3463, 10, 4, UNI_LB__GL } /* linebreak=glue */, + { 4, 461, 6120, 2, 22, UNI_DIACRITICALSFORSYMBOLS } /* isdiacriticalsforsymbols */, + { 34, 1978, 0, 4, 0, UNI_SOGD } /* sogd */, + { 0, 312, 599, 5, 2, -UNI_QMARK } /* qmark=n */, + { 0, 6090, 7620, 7, 28, UNI_MISCARROWS } /* block=miscellaneoussymbolsandarrows */, + { 0, 8601, 4150, 9, 11, UNI_SUPPUNCTUATION } /* block=suppunctuation */, + { 0, 2287, 0, 3, 0, UNI_in_values_index } /* in= */, + { 3, 939, 599, 5, 2, -UNI_ECOMP } /* ecomp=n */, + { 1, 3490, 3640, 12, 9, UNI_CYRILLICEXTD } /* blk=cyrillicextendedd */, + { 33, 1801, 1805, 7, 7, UNI_NV__10000000000 } /* nv=10000000000 */, + { 0, 8601, 6103, 9, 13, UNI_SUPMATHOPERATORS } /* block=supmathoperators */, + { 1, 2324, 4060, 6, 7, UNI_BRAI } /* block=braille */, + { 259, 30, 4074, 1, 16, UNI_CURRENCYSYMBOLS } /* iscurrencysymbols */, + { 0, 499, 0, 6, 0, UNI_LYDI } /* lydian */, + { 16, 7591, 4783, 6, 12, UNI_LB__CB } /* lb=contingentbreak */, + { 356, 4424, 1829, 16, 5, UNI_MLYM } /* scriptextensions=mlym */, + { 0, 2004, 307, 5, 5, UNI_POSIXPRINT } /* posixprint */, + { 4, 292, 766, 3, 3, UNI_NV__5_SLASH_2 } /* nv=5/2 */, + { 3, 7752, 2015, 23, 3, UNI_JG__MANICHAEANWAW } /* joininggroup=manichaeanwaw */, + { 3, 7648, 3289, 18, 5, UNI_DT__FIN } /* decompositiontype=final */, + { 0, 6165, 493, 3, 6, UNI_SC__KHOJ } /* sc=khojki */, + { 469, 4360, 4330, 10, 14, UNI_LB__PO } /* linebreak=postfixnumeric */, + { 0, 823, 934, 4, 2, -UNI_DASH } /* dash=f */, + { 96, 7198, 5409, 5, 11, UNI_SMALLKANAEXT } /* blk=smallkanaext */, + { 2, 1823, 747, 8, 3, UNI_MARC } /* script=marc */, + { 0, 1823, 434, 7, 4, UNI_OGAM } /* script=ogam */, + { 0, 5799, 1269, 6, 3, UNI_SUPPUAB } /* insuppuab */, + { 0, 6165, 658, 3, 5, UNI_SC__DOGR } /* sc=dogra */, + { 101, 309, 4525, 2, 12, UNI_CYRILLICEXTC } /* incyrillicextc */, + { 77, 4424, 434, 17, 4, UNI_OGAM } /* scriptextensions=ogam */, + { 0, 6866, 353, 24, 2, UNI_COMPEX } /* fullcompositionexclusion=y */, + { 16, 2780, 0, 4, 0, UNI_COPT } /* copt */, + { 0, 6236, 1805, 15, 7, UNI_NV__100000000 } /* numericvalue=100000000 */, + { 192, 7669, 1874, 21, 8, UNI_LB__H2 } /* hangulsyllabletype=lvsyllable */, + { 0, 1455, 599, 10, 3, -UNI_DEP } /* deprecated=no */, + { 0, 7495, 1070, 27, 2, UNI_CCC__31 } /* canonicalcombiningclass=ccc31 */, + { 7, 3391, 2234, 12, 10, UNI_NV__1_SLASH_12 } /* numericvalue=8.333e-02 */, + { 1, 4131, 0, 15, 0, UNI_VEDICEXT } /* vedicextensions */, + { 0, 4360, 2004, 10, 2, UNI_LB__PO } /* linebreak=po */, + { 1, 1102, 317, 4, 5, UNI_TALE } /* scx=taile */, + { 0, 1823, 967, 7, 8, UNI_SC__GUJR } /* script=gujarati */, + { 2, 7383, 330, 10, 3, UNI_BC__PDF } /* bidiclass=pdf */, + { 0, 2665, 353, 13, 2, UNI_PATSYN } /* patternsyntax=y */, + { 35, 939, 353, 5, 2, UNI_ECOMP } /* ecomp=y */, + { 0, 1272, 4076, 3, 13, UNI_SC } /* iscurrencysymbol */, + { 294, 1221, 324, 6, 3, UNI_KANASUP } /* inkanasup */, + { 66, 3177, 17, 15, 1, UNI_EA__H } /* eastasianwidth=h */, + { 2, 30, 614, 1, 8, UNI_INELYMAIC } /* inelymaic */, + { 13, 2665, 934, 13, 2, -UNI_PATSYN } /* patternsyntax=f */, + { 0, 8658, 0, 44, 0, UNI_UCASEXT } /* isunifiedcanadianaboriginalsyllabicsextended */, + { 669, 6165, 1234, 3, 4, UNI_SC__MULT } /* sc=mult */, + { 0, 1667, 2244, 4, 12, UNI_INOLDHUNGARIAN } /* blk=oldhungarian */, + { 3, 6692, 0, 15, 0, UNI_TRANSPORTANDMAP } /* transportandmap */, + { 0, 2324, 1438, 6, 10, UNI_INCHORASMIAN } /* block=chorasmian */, + { 0, 6816, 274, 25, 1, UNI_cwkcf_values_index } /* changeswhennfkccasefolded= */, + { 0, 302, 585, 5, 5, UNI__PERL_PATWS } /* patws=true */, + { 2, 810, 0, 4, 0, UNI_SYRC } /* syrc */, + { 7, 461, 11, 2, 4, UNI_ADLM } /* isadlm */, + { 0, 1102, 406, 4, 4, UNI_DIAK } /* scx=diak */, + { 1, 1102, 3436, 4, 15, UNI_SARB } /* scx=oldsoutharabian */, + { 1, 3677, 4533, 7, 4, UNI_LATINEXTC } /* islatinextc */, + { 0, 1667, 1696, 4, 6, UNI_DOMINO } /* blk=domino */, + { 49, 1102, 240, 4, 4, UNI_ZYYY } /* scx=zyyy */, + { 1, 6165, 283, 3, 5, UNI_NSHU } /* sc=nushu */, + { 580, 4424, 1248, 17, 4, UNI_PHAG } /* scriptextensions=phag */, + { 178, 4424, 4505, 16, 6, UNI_LATN } /* scriptextensions=latin */, + { 282, 15, 554, 2, 3, UNI_AGE__5 } /* age=5 */, + { 0, 324, 6965, 3, 22, UNI_SUPERANDSUB } /* superscriptsandsubscripts */, + { 0, 4569, 584, 8, 6, UNI_XPOSIXUPPER } /* uppercase=true */, + { 2, 7274, 13, 9, 2, UNI_LM } /* category=lm */, + { 1, 629, 352, 5, 5, UNI_GRBASE } /* grbase=yes */, + { 1, 461, 5937, 2, 21, UNI__PERL_NCHAR } /* isnoncharactercodepoint */, + { 0, 4424, 4651, 17, 4, UNI_BOPO } /* scriptextensions=bopo */, + { 1, 5637, 3709, 21, 11, UNI_GCB__SM } /* graphemeclusterbreak=spacingmark */, + { 17, 2324, 4131, 6, 15, UNI_VEDICEXT } /* block=vedicextensions */, + { 0, 309, 2182, 2, 4, UNI_IN__4_DOT_1 } /* in=4.1 */, + { 1, 3677, 1036, 3, 2, UNI_LOE } /* isloe */, + { 39, 461, 493, 2, 6, UNI_KHOJ } /* iskhojki */, + { 0, 2, 0, 1, 0, UNI_C } /* c */, + { 389, 309, 901, 2, 8, UNI_INARMENIAN } /* inarmenian */, + { 0, 2324, 6185, 6, 20, UNI_GLAGOLITICSUP } /* block=glagoliticsupplement */, + { 0, 63, 0, 4, 0, UNI_CPMN } /* cpmn */, + { 6, 461, 5958, 2, 4, UNI_SINH } /* issinh */, + { 1, 4569, 5671, 8, 4, -UNI_XPOSIXUPPER } /* uppercase=no */, + { 0, 3391, 2084, 13, 2, UNI_NV__11 } /* numericvalue=11 */, + { 0, 461, 772, 2, 7, UNI_OLCK } /* isolchiki */, + { 384, 7267, 225, 16, 2, UNI_PE } /* generalcategory=pe */, + { 1, 3848, 2147, 14, 8, UNI_NV__3_SLASH_4 } /* numericvalue=7.500e-01 */, + { 9, 6165, 474, 3, 3, UNI_VAI } /* sc=vai */, + { 0, 1734, 0, 7, 0, UNI_XPOSIXSPACE } /* isspace */, + { 11, 5895, 1845, 5, 8, UNI_SUPERANDSUB } /* issuperandsub */, + { 1, 7892, 599, 16, 2, -UNI_UIDEO } /* unifiedideograph=n */, + { 0, 1823, 1331, 7, 9, UNI_SC__PERM } /* script=oldpermic */, + { 1, 7267, 4683, 16, 16, UNI_PF } /* generalcategory=finalpunctuation */, + { 0, 8343, 5323, 22, 15, UNI_INSC__MODIFYINGLETTER } /* indicsyllabiccategory=modifyingletter */, + { 4, 2536, 1755, 3, 8, UNI_JG__SWASHKAF } /* jg=swashkaf */, + { 0, 7084, 8174, 8, 29, UNI_ARABICMATH } /* inarabicmathematicalalphabeticsymbols */, + { 0, 2966, 4710, 3, 15, UNI_SYRIACSUP } /* insyriacsupplement */, + { 2, 4, 352, 2, 5, UNI_LOE } /* loe=yes */, + { 2, 7648, 1127, 18, 3, UNI_DT__FIN } /* decompositiontype=fin */, + { 0, 7591, 543, 3, 2, UNI_EBASE } /* lb=eb */, + { 1, 6165, 228, 3, 4, UNI_XSUX } /* sc=xsux */, + { 0, 1823, 1522, 7, 8, UNI_UGAR } /* script=ugaritic */, + { 0, 4360, 700, 10, 2, UNI_EMOD } /* linebreak=em */, + { 0, 4150, 0, 5, 0, UNI_P } /* punct */, + { 1, 302, 599, 5, 3, -UNI__PERL_PATWS } /* patws=no */, + { 2, 292, 1154, 3, 2, UNI_NV__43 } /* nv=43 */, + { 0, 1667, 7724, 4, 28, UNI_VSSUP } /* blk=variationselectorssupplement */, + { 14, 5937, 934, 21, 6, -UNI__PERL_NCHAR } /* noncharactercodepoint=false */, + { 1, 1667, 4809, 4, 18, UNI_ORNAMENTALDINGBATS } /* blk=ornamentaldingbats */, + { 103, 6165, 1484, 3, 8, UNI_SC__BUGI } /* sc=buginese */, + { 1, 7383, 3706, 10, 14, UNI_BC__NSM } /* bidiclass=nonspacingmark */, + { 12, 3892, 934, 16, 6, -UNI_STERM } /* sentenceterminal=false */, + { 0, 4424, 818, 17, 7, UNI_SHRD } /* scriptextensions=sharada */, + { 2, 1358, 0, 4, 0, UNI_PALM } /* palm */, + { 86, 6165, 3663, 3, 4, UNI_SC__DEVA } /* sc=deva */, + { 3, 2324, 6797, 6, 18, UNI_DEVANAGARIEXT } /* block=devanagariextended */, + { 0, 461, 1397, 2, 7, UNI_IDS } /* isidstart */, + { 14, 461, 6000, 2, 6, UNI_YIJING } /* isyijing */, + { 2, 4424, 3349, 17, 15, UNI_MERC } /* scriptextensions=meroiticcursive */, + { 1, 7889, 4680, 26, 4, UNI_CJKEXTF } /* cjkunifiedideographsextensionf */, + { 9, 4371, 584, 5, 3, UNI_XPOSIXSPACE } /* wspace=t */, + { 29, 1424, 2154, 7, 2, UNI_CCC__13 } /* ccc=ccc13 */, + { 619, 4424, 718, 17, 7, UNI_KNDA } /* scriptextensions=kannada */, + { 6, 2324, 5448, 6, 3, UNI_PUA } /* block=pua */, + { 10, 1823, 6185, 7, 10, UNI_SC__GLAG } /* script=glagolitic */, + { 3, 339, 461, 4, 2, UNI_CCC__IS } /* ccc=is */, + { 7, 2766, 3192, 3, 12, UNI_NL } /* gc=letternumber */, + { 610, 552, 2199, 4, 3, UNI_AGE__2 } /* age=2.0 */, + { 19, 4424, 537, 17, 6, UNI_TNSA } /* scriptextensions=tangsa */, + { 1, 6287, 1715, 14, 7, UNI_BC__LRI } /* bc=lefttorightisolate */, + { 3, 1994, 585, 7, 2, UNI_RADICAL } /* radical=t */, + { 4, 876, 353, 4, 2, UNI_IDEO } /* ideo=y */, + { 2, 2930, 0, 3, 0, UNI_jt_values_index } /* jt= */, + { 0, 578, 295, 5, 1, UNI_CCC__29 } /* ccc=29 */, + { 1, 461, 1603, 2, 6, UNI_L } /* isletter */, + { 7, 2732, 0, 10, 0, UNI_INARABIC } /* blk=arabic */, + { 2, 8343, 2460, 22, 8, UNI_INSC__TONEMARK } /* indicsyllabiccategory=tonemark */, + { 8, 1667, 2468, 4, 13, UNI_IPAEXT } /* blk=ipaextensions */, + { 9, 1424, 3404, 7, 2, UNI_CCC__23 } /* ccc=ccc23 */, + { 0, 1667, 6154, 4, 9, UNI_INCUNEIFORM } /* blk=cuneiform */, + { 0, 597, 3484, 3, 6, UNI_DT__SQR } /* dt=square */, + { 0, 2324, 120, 6, 3, UNI_INLAO } /* block=lao */, + { 105, 461, 4951, 2, 19, UNI_EGYP } /* isegyptianhieroglyphs */, + { 1, 597, 940, 3, 3, UNI_DT__COM } /* dt=com */, + { 0, 253, 585, 4, 2, UNI_CWCF } /* cwcf=t */, + { 6, 6165, 4651, 3, 4, UNI_SC__BOPO } /* sc=bopo */, + { 16, 3021, 290, 4, 2, UNI_IN__4 } /* in=v40 */, + { 0, 4502, 204, 11, 2, UNI_LATINEXTF } /* blk=latinextf */, + { 0, 8311, 4218, 32, 4, UNI_CJKEXTH } /* block=cjkunifiedideographsextensionh */, + { 0, 1391, 3325, 3, 12, UNI_LB__HL } /* wb=hebrewletter */, + { 3, 4519, 6193, 12, 12, UNI_CYRILLICSUP } /* block=cyrillicsupplement */, + { 0, 1667, 4926, 4, 8, UNI_TAMILSUP } /* blk=tamilsup */, + { 0, 292, 2289, 2, 3, UNI_NV__14 } /* nv=14 */, + { 0, 2324, 3663, 6, 13, UNI_DEVANAGARIEXT } /* block=devanagariext */, + { 3, 248, 0, 2, 0, UNI_CN } /* cn */, + { 1, 292, 3403, 2, 3, UNI_NV__23 } /* nv=23 */, + { 3, 6165, 232, 3, 4, UNI_SC__YI } /* sc=yiii */, + { 2, 1894, 934, 12, 6, -UNI_BIDIM } /* bidimirrored=false */, + { 10, 2348, 352, 12, 2, UNI_ci_values_index } /* caseignorable= */, + { 1, 7591, 461, 3, 2, UNI_LB__IS } /* lb=is */, + { 58, 4424, 2068, 17, 4, UNI_MEND } /* scriptextensions=mend */, + { 13, 4584, 585, 18, 5, UNI_IDST } /* idstrinaryoperator=true */, + { 321, 3014, 569, 11, 2, UNI_IN__5_DOT_2 } /* presentin=v52 */, + { 3, 3021, 1317, 4, 2, UNI_IN__3_DOT_2 } /* in=v32 */, + { 106, 1272, 3539, 3, 6, UNI_CPRT } /* iscypriot */, + { 0, 1262, 0, 4, 0, UNI_SOYO } /* soyo */, + { 272, 2752, 599, 5, 2, -UNI_EMOJI } /* emoji=n */, + { 0, 1667, 1234, 4, 7, UNI_INMULTANI } /* blk=multani */, + { 0, 461, 470, 2, 4, UNI_TNSA } /* istnsa */, + { 371, 30, 3953, 1, 18, UNI_AGHB } /* iscaucasianalbanian */, + { 8, 7274, 4075, 9, 14, UNI_SC } /* category=currencysymbol */, + { 0, 4852, 352, 9, 3, UNI_XPOSIXSPACE } /* whitespace=y */, + { 4, 597, 3611, 3, 6, UNI_DT__COM } /* dt=compat */, + { 84, 4191, 352, 8, 3, UNI_XPOSIXLOWER } /* lowercase=y */, + { 2, 1667, 8660, 4, 34, UNI_UCAS } /* blk=unifiedcanadianaboriginalsyllabics */, + { 0, 6427, 714, 13, 4, UNI_JG__ZAIN } /* joininggroup=zain */, + { 135, 4424, 5067, 16, 11, UNI_MANI } /* scriptextensions=manichaean */, + { 0, 2324, 4002, 6, 4, UNI_INMODI } /* block=modi */, + { 1, 1667, 571, 4, 7, UNI_INAVESTAN } /* blk=avestan */, + { 1, 1102, 527, 4, 6, UNI_RJNG } /* scx=rejang */, + { 224, 3677, 4698, 6, 2, UNI_LATIN1 } /* islatin1 */, + { 3, 1102, 140, 4, 4, UNI_NARB } /* scx=narb */, + { 0, 1667, 4651, 4, 16, UNI_BOPOMOFOEXT } /* blk=bopomofoextended */, + { 2, 309, 7724, 2, 28, UNI_VSSUP } /* invariationselectorssupplement */, + { 0, 1592, 0, 10, 0, UNI_SAUR } /* saurashtra */, + { 1, 833, 274, 4, 1, UNI_term_values_index } /* term= */, + { 0, 2324, 5778, 6, 21, UNI_ININSCRIPTIONALPARTHIAN } /* block=inscriptionalparthian */, + { 0, 1065, 290, 5, 1, UNI_NV__1_SLASH_4 } /* nv=1/4 */, + { 1, 2536, 225, 3, 2, UNI_JG__PE } /* jg=pe */, + { 3, 609, 1670, 2, 3, UNI_LB__CJ } /* lb=cj */, + { 5, 622, 353, 7, 2, UNI_EXTPICT } /* extpict=y */, + { 46, 1102, 1234, 4, 4, UNI_MULT } /* scx=mult */, + { 3, 461, 23, 2, 4, UNI_AHOM } /* isahom */, + { 6, 2287, 557, 3, 3, UNI_IN__6 } /* in=6.0 */, + { 0, 875, 5980, 4, 2, UNI_uideo_values_index } /* uideo= */, + { 0, 1592, 0, 4, 0, UNI_SAUR } /* saur */, + { 132, 3817, 2131, 14, 8, UNI_NV__1_SLASH_6 } /* numericvalue=1.667e-01 */, + { 0, 6165, 5031, 3, 4, UNI_SC__HAN } /* sc=hani */, + { 1, 6165, 3228, 3, 15, UNI_ARMI } /* sc=imperialaramaic */, + { 2, 30, 908, 1, 9, UNI_INBALINESE } /* inbalinese */, + { 10, 1102, 31, 4, 4, UNI_AVST } /* scx=avst */, + { 1, 7011, 7408, 18, 11, UNI_CCC__R } /* canonicalcombiningclass=right */, + { 103, 2718, 4276, 3, 3, UNI_BC__NSM } /* bc=nsm */, + { 0, 2766, 6514, 3, 10, UNI_CO } /* gc=privateuse */, + { 8, 1975, 0, 10, 0, UNI_SOGO } /* oldsogdian */, + { 71, 19, 0, 4, 0, UNI_POSIXXDIGIT } /* ahex */, + { 0, 7011, 2289, 23, 3, UNI_CCC__14 } /* canonicalcombiningclass=14 */, + { 0, 309, 1914, 2, 4, UNI_UCAS } /* inucas */, + { 0, 1823, 4060, 7, 4, UNI_BRAI } /* script=brai */, + { 2, 1823, 678, 7, 5, UNI_RUNR } /* script=runic */, + { 13, 7752, 3740, 23, 3, UNI_JG__MANICHAEANMEM } /* joininggroup=manichaeanmem */, + { 7, 6427, 2569, 13, 10, UNI_JG__REVERSEDPE } /* joininggroup=reversedpe */, + { 0, 7591, 7804, 3, 11, UNI_LB__ID } /* lb=ideographic */, + { 2, 2766, 0, 3, 2, UNI_CASEDLETTER } /* gc=l& */, + { 0, 1823, 224, 7, 4, UNI_XPEO } /* script=xpeo */, + { 1, 7267, 6514, 16, 10, UNI_CO } /* generalcategory=privateuse */, + { 0, 1942, 352, 11, 3, UNI_GRBASE } /* graphemebase=y */, + { 0, 895, 1313, 5, 2, UNI_AGE__6 } /* age=v60 */, + { 0, 5448, 0, 3, 0, UNI_PUA } /* pua */, + { 1, 6165, 3349, 3, 4, UNI_MERO } /* sc=mero */, + { 25, 461, 1455, 2, 3, UNI_DEP } /* isdep */, + { 0, 261, 599, 5, 2, -UNI_CWKCF } /* cwkcf=n */, + { 2, 4191, 0, 9, 0, UNI_XPOSIXLOWER } /* lowercase */, + { 3, 309, 1255, 2, 7, UNI_INSIDDHAM } /* insiddham */, + { 1, 461, 6816, 2, 25, UNI_CWKCF } /* ischangeswhennfkccasefolded */, + { 325, 1894, 353, 12, 2, UNI_BIDIM } /* bidimirrored=y */, + { 418, 461, 2621, 2, 9, UNI__PERL_SURROGATE } /* issurrogate */, + { 44, 30, 4145, 1, 5, UNI_DASH } /* isdash */, + { 0, 8343, 4119, 22, 12, UNI_INSC__NUMBERJOINER } /* indicsyllabiccategory=numberjoiner */, + { 3, 2434, 5848, 7, 9, UNI_MYANMAREXTA } /* myanmarextendeda */, + { 0, 2766, 466, 3, 2, UNI_SO } /* gc=so */, + { 1, 2324, 8153, 9, 21, UNI_CJKSYMBOLS } /* block=cjksymbolsandpunctuation */, + { 1, 2220, 2131, 4, 8, UNI_NV__2_SLASH_3 } /* nv=6.667e-01 */, + { 0, 461, 1864, 2, 5, UNI_EBASE } /* isebase */, + { 0, 597, 4602, 3, 4, UNI_DT__INIT } /* dt=init */, + { 0, 8601, 7304, 7, 24, UNI_SYMBOLSANDPICTOGRAPHSEXTA } /* block=symbolsandpictographsexta */, + { 15, 8071, 4158, 30, 4, UNI_CJKEXTD } /* blk=cjkunifiedideographsextensiond */, + { 11, 1424, 559, 8, 2, UNI_CCC__107 } /* ccc=ccc107 */, + { 0, 3791, 599, 4, 2, -UNI_MATH } /* math=n */, + { 0, 1894, 934, 12, 2, -UNI_BIDIM } /* bidimirrored=f */, + { 17, 2324, 4926, 6, 5, UNI_INTAMIL } /* block=tamil */, + { 0, 3391, 6270, 13, 9, UNI_NV__3_SLASH_80 } /* numericvalue=3.750e-02 */, + { 66, 461, 99, 2, 2, UNI_UPPERCASELETTER } /* islu */, + { 0, 1272, 1922, 3, 11, UNI_CHESSSYMBOLS } /* ischesssymbols */, + { 0, 3848, 1314, 14, 2, UNI_NV__700 } /* numericvalue=700 */, + { 0, 2718, 83, 3, 2, UNI_BC__ON } /* bc=on */, + { 4, 2324, 6642, 6, 6, UNI_INBRAHMI } /* block=brahmi */, + { 68, 309, 6000, 2, 6, UNI_YIJING } /* inyijing */, + { 0, 2930, 7, 3, 1, UNI_JT__R } /* jt=r */, + { 192, 309, 2234, 2, 2, UNI_IN__8 } /* in=8 */, + { 68, 4584, 585, 18, 2, UNI_IDST } /* idstrinaryoperator=t */, + { 2, 2324, 3955, 7, 16, UNI_INCAUCASIANALBANIAN } /* block=caucasianalbanian */, + { 68, 2523, 1082, 8, 4, UNI_XPOSIXWORD } /* isxposixword */, + { 7, 7669, 644, 18, 2, UNI_GCB__L } /* hangulsyllabletype=l */, + { 1029, 7011, 6328, 24, 4, UNI_WB__EB } /* canonicalcombiningclass=atbl */, + { 0, 4569, 274, 5, 1, UNI_upper_values_index } /* upper= */, + { 220, 309, 1349, 2, 9, UNI_INOLDUYGHUR } /* inolduyghur */, + { 6, 2324, 7110, 6, 24, UNI_DIACRITICALSFORSYMBOLS } /* block=combiningmarksforsymbols */, + { 546, 1894, 934, 5, 6, -UNI_BIDIM } /* bidim=false */, + { 0, 1823, 164, 7, 4, UNI_PHNX } /* script=phnx */, + { 16, 6165, 1572, 3, 10, UNI_XPEO } /* sc=oldpersian */, + { 3, 1102, 1954, 4, 12, UNI_GONG } /* scx=gunjalagondi */, + { 144, 7084, 4531, 6, 6, UNI_ARABICEXTC } /* inarabicextc */, + { 54, 7214, 2165, 25, 2, UNI_WB__EB } /* canonicalcombiningclass=133 */, + { 4, 1455, 599, 10, 2, -UNI_DEP } /* deprecated=n */, + { 480, 6642, 0, 6, 0, UNI_BRAH } /* brahmi */, + { 4, 1102, 470, 4, 4, UNI_TNSA } /* scx=tnsa */, + { 21, 4424, 240, 17, 4, UNI_ZYYY } /* scriptextensions=zyyy */, + { 72, 6866, 934, 24, 2, -UNI_COMPEX } /* fullcompositionexclusion=f */, + { 0, 6165, 140, 3, 4, UNI_NARB } /* sc=narb */, + { 0, 7724, 599, 17, 2, -UNI_VS } /* variationselector=n */, + { 10, 1240, 4810, 3, 17, UNI_ORNAMENTALDINGBATS } /* inornamentaldingbats */, + { 0, 266, 585, 3, 5, UNI_CWT } /* cwt=true */, + { 17, 4391, 395, 15, 2, UNI_NV__3_SLASH_16 } /* numericvalue=3/16 */, + { 92, 5553, 599, 21, 2, -UNI_CWCM } /* changeswhencasemapped=n */, + { 432, 2002, 0, 4, 0, UNI_PO } /* ispo */, + { 18, 2060, 0, 5, 0, UNI_XPOSIXALPHA } /* alpha */, + { 16, 1823, 1509, 7, 8, UNI_SC__JAVA } /* script=javanese */, + { 50, 1102, 1978, 4, 7, UNI_SOGD } /* scx=sogdian */, + { 40, 5658, 6841, 15, 16, UNI_IDENTIFIERTYPE__DEFAULTIGNORABLE } /* identifiertype=defaultignorable */, + { 2, 832, 0, 5, 0, UNI_STERM } /* sterm */, + { 6, 4845, 0, 17, 0, UNI__PERL_PATWS } /* patternwhitespace */, + { 0, 2432, 8374, 3, 33, UNI_MISCPICTOGRAPHS } /* inmiscellaneoussymbolsandpictographs */, + { 1, 1823, 901, 7, 8, UNI_ARMN } /* script=armenian */, + { 1, 4060, 0, 4, 0, UNI_BRAI } /* brai */, + { 0, 2018, 341, 4, 2, UNI_joinc_values_index } /* joinc= */, + { 569, 3649, 0, 14, 0, UNI_PHONETICEXTSUP } /* phoneticextsup */, + { 1, 6165, 975, 3, 8, UNI_SC__GURU } /* sc=gurmukhi */, + { 4, 6165, 112, 3, 4, UNI_KITS } /* sc=kits */, + { 67, 3878, 761, 14, 2, UNI_NV__9_SLASH_2 } /* numericvalue=9/2 */, + { 0, 2324, 2811, 6, 5, UNI_INKHMER } /* block=khmer */, + { 0, 4424, 5208, 16, 8, UNI_MYMR } /* scriptextensions=myanmar */, + { 706, 5616, 599, 21, 3, -UNI_CWU } /* changeswhenuppercased=no */, + { 0, 4424, 1027, 17, 6, UNI_YEZI } /* scriptextensions=yezidi */, + { 2, 7752, 4247, 23, 4, UNI_JG__MANICHAEANKAPH } /* joininggroup=manichaeankaph */, + { 0, 6185, 0, 13, 0, UNI_GLAGOLITICSUP } /* glagoliticsup */, + { 6, 1667, 6642, 4, 6, UNI_INBRAHMI } /* blk=brahmi */, + { 0, 461, 3692, 2, 4, UNI_LISU } /* islisu */, + { 524, 2718, 355, 3, 2, UNI_BC__ES } /* bc=es */, + { 0, 271, 1887, 4, 7, UNI_GCB__CN } /* gcb=control */, + { 11, 578, 391, 5, 2, UNI_CCC__DA } /* ccc=234 */, + { 1, 4424, 1509, 17, 8, UNI_JAVA } /* scriptextensions=javanese */, + { 258, 2930, 3313, 3, 12, UNI_JT__R } /* jt=rightjoining */, + { 0, 1102, 917, 4, 8, UNI_BASS } /* scx=bassavah */, + { 176, 2018, 12, 12, 1, UNI_JT__D } /* joiningtype=d */, + { 2, 1102, 78, 4, 4, UNI_DSRT } /* scx=dsrt */, + { 17, 423, 4987, 3, 16, UNI_ALCHEMICAL } /* inalchemicalsymbols */, + { 1168, 7274, 4150, 9, 5, UNI_P } /* category=punct */, + { 5, 2536, 4243, 3, 4, UNI_JG__HETH } /* jg=heth */, + { 0, 1823, 814, 7, 4, UNI_SC__QAAI } /* script=zinh */, + { 0, 30, 4619, 1, 17, UNI_LINEARBSYLLABARY } /* inlinearbsyllabary */, + { 6, 2324, 983, 6, 8, UNI_INHIRAGANA } /* block=hiragana */, + { 1, 1051, 0, 8, 0, UNI_MAHJ } /* mahajani */, + { 1592, 2302, 934, 3, 6, -UNI_IDC } /* idc=false */, + { 199, 309, 1285, 2, 9, UNI_INKHUDAWADI } /* inkhudawadi */, + { 0, 1243, 3726, 5, 10, UNI_INMALAYALAM } /* block=malayalam */, + { 322, 1667, 3663, 4, 10, UNI_INDEVANAGARI } /* blk=devanagari */, + { 0, 6090, 3788, 7, 15, UNI_MISCMATHSYMBOLSA } /* block=miscmathsymbolsa */, + { 0, 2324, 7449, 6, 28, UNI_PHONETICEXTSUP } /* block=phoneticextensionssupplement */, + { 29, 2391, 3640, 10, 9, UNI_CYRILLICEXTD } /* incyrillicextendedd */, + { 8, 461, 6797, 2, 19, UNI_DEVANAGARIEXTA } /* isdevanagariextendeda */, + { 0, 1823, 746, 7, 7, UNI_MARC } /* script=marchen */, + { 296, 298, 934, 2, 6, -UNI_RI } /* ri=false */, + { 0, 2665, 934, 13, 6, -UNI_PATSYN } /* patternsyntax=false */, + { 3, 3013, 599, 5, 3, -UNI_EPRES } /* epres=no */, + { 0, 8601, 5149, 18, 7, UNI_SUPARROWSA } /* block=supplementalarrowsa */, + { 0, 510, 2107, 4, 8, UNI_NV__7_SLASH_2 } /* nv=3.500e+00 */, + { 36, 18, 918, 1, 3, UNI_BASS } /* bass */, + { 0, 6165, 951, 3, 8, UNI_SC__DUPL } /* sc=duployan */, + { 6, 4360, 281, 10, 2, UNI_LB__XX } /* linebreak=xx */, + { 22, 1823, 200, 7, 4, UNI_TAVT } /* script=tavt */, + { 0, 1221, 1037, 6, 4, UNI_KANAEXTB } /* inkanaextb */, + { 0, 461, 224, 2, 4, UNI_XPEO } /* isxpeo */, + { 0, 326, 0, 2, 0, UNI_PF } /* pf */, + { 0, 2324, 1582, 6, 10, UNI_INPHOENICIAN } /* block=phoenician */, + { 0, 30, 115, 1, 5, UNI_KNDA } /* isknda */, + { 260, 2842, 7915, 3, 29, UNI_ENCLOSEDALPHANUMSUP } /* isenclosedalphanumericsupplement */, + { 0, 8601, 7707, 17, 17, UNI_SUPPUAB } /* block=supplementaryprivateuseareab */, + { 0, 7752, 5425, 22, 8, UNI_JG__MANICHAEANDHAMEDH } /* joininggroup=manichaeandhamedh */, + { 276, 1272, 3539, 3, 15, UNI_CYPRIOTSYLLABARY } /* iscypriotsyllabary */, + { 0, 7274, 644, 8, 2, UNI_L } /* category=l */, + { 0, 6165, 1325, 3, 4, UNI_ITAL } /* sc=ital */, + { 0, 3391, 2138, 13, 9, UNI_NV__3_SLASH_16 } /* numericvalue=1.875e-01 */, + { 0, 339, 344, 4, 2, UNI_CCC__21 } /* ccc=21 */, + { 771, 1397, 585, 7, 5, UNI_IDS } /* idstart=true */, + { 1, 18, 6901, 1, 22, UNI_BYZANTINEMUSIC } /* byzantinemusicalsymbols */, + { 1, 7267, 625, 16, 2, UNI_PI } /* generalcategory=pi */, + { 16, 474, 0, 4, 0, UNI_VAI } /* vaii */, + { 565, 6090, 3364, 7, 14, UNI_MISCPICTOGRAPHS } /* block=miscpictographs */, + { 5, 2842, 7915, 3, 20, UNI_ENCLOSEDALPHANUM } /* isenclosedalphanumerics */, + { 868, 4391, 1314, 14, 2, UNI_NV__300 } /* numericvalue=300 */, + { 0, 1011, 274, 2, 1, UNI_ci_values_index } /* ci= */, + { 0, 2966, 1110, 3, 7, UNI_SPECIALS } /* inspecials */, + { 1, 1894, 353, 5, 4, UNI_BIDIM } /* bidim=yes */, + { 1, 1424, 1155, 7, 2, UNI_CCC__35 } /* ccc=ccc35 */, + { 1, 6165, 458, 3, 4, UNI_SC__QAAI } /* sc=qaai */, + { 0, 7011, 6328, 24, 3, UNI_CCC__202 } /* canonicalcombiningclass=atb */, + { 1, 823, 353, 4, 4, UNI_DASH } /* dash=yes */, + { 0, 4424, 786, 17, 4, UNI_HMNP } /* scriptextensions=hmnp */, + { 0, 20, 599, 3, 3, -UNI_XPOSIXXDIGIT } /* hex=no */, + { 136, 461, 4862, 2, 18, UNI_RUMI } /* isruminumeralsymbols */, + { 7, 298, 353, 2, 2, UNI_RI } /* ri=y */, + { 1, 309, 2244, 2, 12, UNI_INOLDHUNGARIAN } /* inoldhungarian */, + { 0, 461, 212, 2, 4, UNI_TIBT } /* istibt */, + { 1, 4569, 933, 8, 3, -UNI_XPOSIXUPPER } /* uppercase=f */, + { 9, 552, 566, 4, 3, UNI_AGE__9 } /* age=9.0 */, + { 0, 434, 0, 4, 0, UNI_OGAM } /* ogam */, + { 2, 7648, 3611, 18, 6, UNI_DT__COM } /* decompositiontype=compat */, + { 770, 4424, 3505, 16, 9, UNI_ETHI } /* scriptextensions=ethiopic */, + { 902, 3391, 2101, 13, 2, UNI_NV__29 } /* numericvalue=29 */, + { 260, 7892, 353, 16, 4, UNI_UIDEO } /* unifiedideograph=yes */, + { 80, 1102, 1248, 4, 4, UNI_PHAG } /* scx=phag */, + { 0, 309, 648, 2, 5, UNI_INADLAM } /* inadlam */, + { 0, 1501, 0, 8, 0, UNI_JAMOEXTA } /* jamoexta */, + { 1, 1102, 212, 4, 4, UNI_TIBT } /* scx=tibt */, + { 86, 461, 983, 2, 4, UNI_HIRA } /* ishira */, + { 3, 7274, 225, 9, 2, UNI_PE } /* category=pe */, + { 189, 5156, 1613, 10, 2, UNI_WB__FO } /* wordbreak=fo */, + { 5, 461, 35, 2, 4, UNI_BATK } /* isbatk */, + { 1, 1272, 8474, 5, 33, UNI_CJKCOMPATIDEOGRAPHSSUP } /* iscjkcompatibilityideographssupplement */, + { 0, 3130, 3448, 9, 6, UNI_GEORGIANEXT } /* blk=georgianext */, + { 104, 5156, 4407, 10, 17, UNI_RI } /* wordbreak=regionalindicator */, + { 523, 1059, 353, 6, 2, UNI_DT__NONE } /* nfkdqc=y */, + { 0, 1102, 786, 4, 4, UNI_HMNP } /* scx=hmnp */, + { 273, 1823, 208, 7, 4, UNI_SC__TGLG } /* script=tglg */, + { 0, 2, 353, 3, 4, UNI_CWL } /* cwl=yes */, + { 19, 7648, 693, 18, 3, UNI_DT__ISO } /* decompositiontype=iso */, + { 0, 1667, 4862, 4, 18, UNI_RUMI } /* blk=ruminumeralsymbols */, + { 0, 339, 8101, 4, 10, UNI_CCC__BR } /* ccc=belowright */, + { 26, 7591, 4288, 3, 14, UNI_LB__CR } /* lb=carriagereturn */, + { 0, 4424, 1562, 17, 4, UNI_NAGM } /* scriptextensions=nagm */, + { 848, 2220, 2657, 4, 8, UNI_NV__3_SLASH_5 } /* nv=6.000e-01 */, + { 59, 2, 2931, 2, 3, UNI_CWT } /* cwt=t */, + { 0, 1075, 1312, 4, 5, UNI_NV__216000 } /* nv=216000 */, + { 0, 3817, 2657, 14, 8, UNI_NV__1_SLASH_10 } /* numericvalue=1.000e-01 */, + { 265, 4191, 352, 8, 2, UNI_lower_values_index } /* lowercase= */, + { 0, 2180, 520, 4, 1, UNI_NV__47 } /* nv=47 */, + { 2, 4896, 0, 5, 0, UNI_BAMU } /* bamum */, + { 1, 876, 599, 4, 2, -UNI_IDEO } /* ideo=n */, + { 2, 1102, 228, 4, 4, UNI_XSUX } /* scx=xsux */, + { 1, 3502, 7241, 5, 10, UNI_ENCLOSEDCJK } /* blk=enclosedcjk */, + { 290, 7889, 7380, 26, 4, UNI_CJKEXTB } /* cjkunifiedideographsextensionb */, + { 16, 199, 0, 2, 0, UNI_TITLE } /* lt */, + { 0, 6618, 3243, 5, 10, UNI_INPC__OVERSTRUCK } /* inpc=overstruck */, + { 20, 8278, 3367, 4, 11, UNI_MISCPICTOGRAPHS } /* miscpictographs */, + { 12, 461, 5857, 2, 12, UNI_MONGOLIANSUP } /* ismongoliansup */, + { 0, 3817, 1312, 15, 3, UNI_NV__1_SLASH_160 } /* numericvalue=1/160 */, + { 2, 2324, 1922, 7, 11, UNI_CHESSSYMBOLS } /* block=chesssymbols */, + { 3, 8343, 5746, 22, 16, UNI_INSC__INVISIBLESTACKER } /* indicsyllabiccategory=invisiblestacker */, + { 2, 1883, 6621, 4, 3, UNI_BIDIC } /* bidic=t */, + { 23, 4191, 584, 8, 6, UNI_XPOSIXLOWER } /* lowercase=true */, + { 0, 309, 1484, 2, 8, UNI_INBUGINESE } /* inbuginese */, + { 1, 6062, 7241, 7, 26, UNI_ENCLOSEDCJK } /* block=enclosedcjklettersandmonths */, + { 0, 7591, 68, 3, 2, UNI_LB__PR } /* lb=pr */, + { 80, 461, 3204, 2, 14, UNI_GREXT } /* isgraphemeextend */, + { 128, 309, 1872, 2, 11, UNI_YISYLLABLES } /* inyisyllables */, + { 128, 1823, 868, 7, 4, UNI_SC__TIRH } /* script=tirh */, + { 1, 1102, 6642, 4, 4, UNI_BRAH } /* scx=brah */, + { 0, 2483, 353, 5, 2, UNI_CASED } /* cased=y */, + { 0, 8246, 6622, 23, 13, UNI_INPC__TOPANDBOTTOM } /* indicpositionalcategory=topandbottom */, + { 0, 339, 2084, 4, 2, UNI_CCC__11 } /* ccc=11 */, + { 19, 7944, 4218, 28, 4, UNI_CJKEXTH } /* iscjkunifiedideographsextensionh */, + { 0, 2432, 2631, 3, 12, UNI_MAYANNUMERALS } /* inmayannumerals */, + { 1, 292, 768, 3, 2, UNI_NV__27 } /* nv=27 */, + { 0, 7591, 2004, 3, 2, UNI_LB__PO } /* lb=po */, + { 0, 1667, 6900, 4, 23, UNI_BYZANTINEMUSIC } /* blk=byzantinemusicalsymbols */, + { 3, 8311, 5417, 26, 10, UNI_CJKEXTD } /* block=cjkunifiedideographsextensiond */, + { 100, 71, 353, 3, 4, UNI_CWU } /* cwu=yes */, + { 0, 461, 615, 2, 4, UNI_ELYM } /* iselym */, + { 27, 2842, 1505, 10, 4, UNI_ETHIOPICEXTA } /* isethiopicexta */, + { 16, 2324, 1358, 6, 9, UNI_PALM } /* block=palmyrene */, + { 1, 2324, 1322, 6, 9, UNI_INOLDITALIC } /* block=olditalic */, + { 2, 339, 346, 4, 2, UNI_CCC__84 } /* ccc=84 */, + { 1, 461, 493, 2, 4, UNI_KHOJ } /* iskhoj */, + { 1, 309, 294, 2, 2, UNI_IN__9 } /* in=9 */, + { 0, 426, 0, 3, 0, UNI_MRO } /* mro */, + { 146, 552, 2154, 4, 2, UNI_AGE__13 } /* age=13 */, + { 6, 461, 442, 2, 4, UNI_ORKH } /* isorkh */, + { 3, 7267, 13, 16, 2, UNI_LM } /* generalcategory=lm */, + { 1, 4852, 5671, 9, 3, -UNI_XPOSIXSPACE } /* whitespace=n */, + { 1234, 3633, 4698, 6, 2, UNI_LATIN1 } /* inlatin1 */, + { 134, 302, 0, 5, 0, UNI__PERL_PATWS } /* patws */, + { 20, 5574, 353, 21, 2, UNI_CWL } /* changeswhenlowercased=y */, + { 0, 2523, 3100, 7, 6, UNI_XPOSIXDIGIT } /* isxposixdigit */, + { 11, 5156, 6, 10, 2, UNI_LB__CR } /* wordbreak=cr */, + { 0, 4424, 658, 17, 4, UNI_DOGR } /* scriptextensions=dogr */, + { 7, 2503, 934, 5, 6, -UNI_JOINC } /* joinc=false */, + { 3, 4, 5671, 2, 3, -UNI_LOE } /* loe=n */, + { 0, 2930, 2897, 3, 11, UNI_JT__D } /* jt=dualjoining */, + { 1, 916, 352, 4, 3, UNI_EBASE } /* ebase=y */, + { 0, 377, 585, 3, 5, UNI_EXT } /* ext=true */, + { 0, 1102, 1349, 4, 9, UNI_OUGR } /* scx=olduyghur */, + { 18, 1102, 4651, 4, 4, UNI_BOPO } /* scx=bopo */, + { 5, 3021, 1318, 4, 2, UNI_IN__2 } /* in=v20 */, + { 172, 6816, 599, 25, 3, -UNI_CWKCF } /* changeswhennfkccasefolded=no */, + { 1, 779, 0, 7, 0, UNI_OSMA } /* osmanya */, + { 0, 693, 3196, 5, 8, UNI_NO } /* isothernumber */, + { 0, 1102, 333, 4, 6, UNI_CARI } /* scx=carian */, + { 103, 2966, 1609, 3, 9, UNI_SMALLFORMS } /* insmallforms */, + { 3, 309, 3908, 2, 6, UNI_INTANGUT } /* intangut */, + { 1, 1102, 6185, 4, 4, UNI_GLAG } /* scx=glag */, + { 0, 3014, 1318, 11, 2, UNI_IN__2 } /* presentin=v20 */, + { 110, 1065, 3846, 4, 2, UNI_NV__1_SLASH_8 } /* nv=1/8 */, + { 120, 1823, 997, 7, 6, UNI_SC__KTHI } /* script=kaithi */, + { 77, 461, 6495, 2, 5, UNI_MUSIC } /* ismusic */, + { 0, 1102, 5391, 4, 8, UNI_CHER } /* scx=cherokee */, + { 4, 1102, 4740, 4, 4, UNI_TALE } /* scx=tale */, + { 377, 8343, 7523, 31, 15, UNI_INSC__CONSONANTSUCCEEDINGREPHA } /* indicsyllabiccategory=consonantsucceedingrepha */, + { 820, 7383, 4487, 10, 15, UNI_BC__CS } /* bidiclass=commonseparator */, + { 0, 6427, 636, 13, 3, UNI_JG__NUN } /* joininggroup=nun */, + { 0, 7495, 288, 28, 2, UNI_CCC__130 } /* canonicalcombiningclass=ccc130 */, + { 4, 2302, 5671, 9, 3, -UNI_IDC } /* idcontinue=n */, + { 0, 4424, 1819, 17, 4, UNI_MONG } /* scriptextensions=mong */, + { 0, 461, 4819, 2, 8, UNI_DINGBATS } /* isdingbats */, + { 0, 5065, 5053, 13, 6, UNI_JG__MANICHAEANLAMEDH } /* jg=manichaeanlamedh */, + { 0, 4424, 5031, 17, 14, UNI_ROHG } /* scriptextensions=hanifirohingya */, + { 0, 1823, 6154, 7, 9, UNI_XSUX } /* script=cuneiform */, + { 0, 30, 7563, 1, 18, UNI_ANCIENTGREEKMUSIC } /* isancientgreekmusic */, + { 16, 1102, 5031, 4, 4, UNI_HAN } /* scx=hani */, + { 7, 30, 5711, 1, 20, UNI_MERO } /* ismeroitichieroglyphs */, + { 0, 4, 584, 2, 6, UNI_LOE } /* loe=true */, + { 3, 1454, 353, 2, 4, UNI_SD } /* sd=yes */, + { 84, 6165, 2441, 3, 11, UNI_SC__NAND } /* sc=nandinagari */, + { 29, 1790, 0, 7, 0, UNI_NFCQC__M } /* nfcqc=m */, + { 3, 5749, 5354, 3, 19, UNI_PHLI } /* isinscriptionalpahlavi */, + { 3, 5895, 0, 21, 0, UNI_SUPARROWSC } /* issupplementalarrowsc */, + { 1, 1102, 2247, 4, 4, UNI_HUNG } /* scx=hung */, + { 1036, 6841, 585, 25, 5, UNI_DI } /* defaultignorablecodepoint=true */, + { 213, 7011, 890, 23, 3, UNI_CCC__10 } /* canonicalcombiningclass=10 */, + { 6, 3892, 353, 16, 4, UNI_STERM } /* sentenceterminal=yes */, + { 2, 16, 6166, 1, 4, UNI_CO } /* gc=co */, + { 2, 1367, 0, 9, 0, UNI_PAUC } /* paucinhau */, + { 39, 1823, 493, 7, 4, UNI_SC__KHOJ } /* script=khoj */, + { 0, 2324, 1992, 6, 10, UNI_YIRADICALS } /* block=yiradicals */, + { 1, 1834, 0, 4, 0, UNI_SORA } /* sora */, + { 1, 1102, 5857, 4, 9, UNI_MONG } /* scx=mongolian */, + { 0, 8, 934, 3, 6, -UNI_PCM } /* pcm=false */, + { 5, 461, 4146, 2, 15, UNI_PD } /* isdashpunctuation */, + { 11, 876, 599, 4, 3, -UNI_IDEO } /* ideo=no */, + { 0, 6165, 1094, 3, 4, UNI_MERC } /* sc=merc */, + { 50, 2287, 547, 5, 2, UNI_IN__14 } /* in=14.0 */, + { 0, 1509, 0, 8, 0, UNI_JAVA } /* javanese */, + { 2, 4424, 3349, 17, 4, UNI_MERO } /* scriptextensions=mero */, + { 1, 1823, 116, 7, 4, UNI_SC__KNDA } /* script=knda */, + { 0, 1200, 6400, 3, 18, UNI_CJKRADICALSSUP } /* cjkradicalssupplement */, + { 5, 1198, 204, 7, 2, UNI_CJKEXTF } /* incjkextf */, + { 35, 833, 934, 4, 2, -UNI_TERM } /* term=f */, + { 16, 2401, 2374, 10, 8, UNI_ETHIOPICEXT } /* inethiopicextended */, + { 385, 1424, 1316, 8, 2, UNI_CCC__103 } /* ccc=ccc103 */, + { 18, 1243, 8605, 2, 35, UNI_SUPMATHOPERATORS } /* blk=supplementalmathematicaloperators */, + { 0, 2842, 7241, 3, 10, UNI_ENCLOSEDCJK } /* isenclosedcjk */, + { 0, 2766, 54, 3, 2, UNI_SC } /* gc=sc */, + { 651, 5168, 302, 6, 5, UNI__PERL_PATWS } /* _perl_patws */, + { 9, 753, 353, 6, 4, UNI_NFKCQC__Y } /* nfkcqc=yes */, + { 1057, 4424, 1385, 17, 6, UNI_THAA } /* scriptextensions=thaana */, + { 0, 1779, 0, 11, 0, UNI_MEDF } /* medefaidrin */, + { 103, 5895, 837, 6, 3, UNI_SUPPUAA } /* issuppuaa */, + { 20, 1667, 2441, 4, 11, UNI_INNANDINAGARI } /* blk=nandinagari */, + { 17, 2324, 1465, 6, 10, UNI_INDIVESAKURU } /* block=divesakuru */, + { 0, 4424, 814, 17, 4, UNI_QAAI } /* scriptextensions=zinh */, + { 1307, 4424, 426, 17, 4, UNI_MRO } /* scriptextensions=mroo */, + { 0, 375, 934, 5, 2, -UNI_GREXT } /* grext=f */, + { 0, 2514, 1505, 9, 4, UNI_MYANMAREXTA } /* ismyanmarexta */, + { 1, 1823, 818, 7, 7, UNI_SC__SHRD } /* script=sharada */, + { 518, 212, 0, 4, 0, UNI_TIBT } /* tibt */, + { 1390, 461, 106, 2, 2, UNI_ZL } /* iszl */, + { 14, 1102, 3026, 4, 14, UNI_PHLP } /* scx=psalterpahlavi */, + { 2, 461, 232, 2, 2, UNI_YI } /* isyi */, + { 0, 1102, 3325, 4, 4, UNI_HEBR } /* scx=hebr */, + { 0, 3040, 585, 13, 5, UNI_QMARK } /* quotationmark=true */, + { 6, 5595, 274, 21, 1, UNI_cwt_values_index } /* changeswhentitlecased= */, + { 168, 1102, 4951, 4, 19, UNI_EGYP } /* scx=egyptianhieroglyphs */, + { 0, 309, 861, 2, 7, UNI_INTIBETAN } /* intibetan */, + { 0, 309, 739, 2, 7, UNI_INMANDAIC } /* inmandaic */, + { 4, 54, 3493, 2, 9, UNI_SC__CYRL } /* sc=cyrillic */, + { 2, 5553, 353, 21, 2, UNI_CWCM } /* changeswhencasemapped=y */, + { 776, 5637, 700, 21, 2, UNI_WB__EB } /* graphemeclusterbreak=em */, + { 1284, 2324, 5838, 6, 19, UNI_JAMOEXTA } /* block=hanguljamoextendeda */, + { 0, 1667, 4271, 4, 17, UNI_INKHITANSMALLSCRIPT } /* blk=khitansmallscript */, + { 16, 939, 934, 5, 2, -UNI_ECOMP } /* ecomp=f */, + { 0, 2324, 2256, 6, 12, UNI_PHAISTOS } /* block=phaistosdisc */, + { 28, 1391, 65, 3, 2, UNI_WB__MN } /* wb=mn */, + { 136, 257, 585, 4, 5, UNI_CWCM } /* cwcm=true */, + { 513, 2324, 2786, 6, 14, UNI_HIGHSURROGATES } /* block=highsurrogates */, + { 841, 4360, 4302, 10, 14, UNI_LB__SA } /* linebreak=complexcontext */, + { 1, 578, 2290, 5, 2, UNI_CCC__214 } /* ccc=214 */, + { 1, 1823, 571, 7, 7, UNI_AVST } /* script=avestan */, + { 23, 2966, 4710, 3, 8, UNI_SYRIACSUP } /* insyriacsup */, + { 0, 1200, 6557, 3, 16, UNI_CJKCOMPATIDEOGRAPHS } /* cjkcompatideographs */, + { 581, 1223, 1505, 4, 4, UNI_KANAEXTA } /* kanaexta */, + { 1073, 1823, 6642, 7, 6, UNI_BRAH } /* script=brahmi */, + { 52, 6163, 5338, 5, 15, UNI_INSC__REGISTERSHIFTER } /* insc=registershifter */, + { 0, 1102, 224, 4, 4, UNI_XPEO } /* scx=xpeo */, + { 0, 1397, 598, 6, 3, -UNI_IDS } /* idstart=n */, + { 0, 1667, 5838, 4, 19, UNI_JAMOEXTA } /* blk=hanguljamoextendeda */, + { 0, 4424, 148, 17, 4, UNI_ORYA } /* scriptextensions=orya */, + { 0, 2403, 1037, 8, 4, UNI_ETHIOPICEXTB } /* ethiopicextb */, + { 1, 312, 1669, 4, 2, UNI_qmark_values_index } /* qmark= */, + { 0, 7495, 2290, 27, 2, UNI_CCC__14 } /* canonicalcombiningclass=ccc14 */, + { 0, 461, 1396, 2, 4, UNI_XIDS } /* isxids */, + { 1, 3817, 295, 15, 1, UNI_NV__1_SLASH_9 } /* numericvalue=1/9 */, + { 0, 309, 5682, 2, 5, UNI_INGREEK } /* ingreek */, + { 39, 7383, 355, 10, 2, UNI_BC__ES } /* bidiclass=es */, + { 0, 1823, 426, 7, 4, UNI_MRO } /* script=mroo */, + { 5, 1823, 880, 7, 7, UNI_ZZZZ } /* script=unknown */, + { 13, 380, 934, 6, 6, -UNI_HYPHEN } /* hyphen=false */, + { 99, 6427, 2886, 13, 11, UNI_JG__YEHWITHTAIL } /* joininggroup=yehwithtail */, + { 0, 406, 599, 3, 3, -UNI_DIA } /* dia=no */, + { 18, 461, 124, 2, 4, UNI_LATN } /* islatn */, + { 10, 461, 430, 2, 3, UNI_NKO } /* isnko */, + { 0, 1801, 0, 9, 0, UNI_NV__100000 } /* nv=100000 */, + { 3, 578, 2121, 5, 2, UNI_CCC__202 } /* ccc=202 */, + { 1, 6165, 786, 3, 4, UNI_HMNP } /* sc=hmnp */, + { 224, 2930, 2579, 3, 10, UNI_JT__U } /* jt=nonjoining */, + { 3, 1610, 0, 3, 0, UNI_ALL } /* all */, + { 0, 309, 1812, 2, 11, UNI_INPAHAWHHMONG } /* inpahawhhmong */, + { 1500, 6866, 599, 24, 2, -UNI_COMPEX } /* fullcompositionexclusion=n */, + { 11, 1823, 1009, 7, 4, UNI_LYCI } /* script=lyci */, + { 1051, 1823, 2411, 7, 8, UNI_SC__KANA } /* script=katakana */, + { 0, 578, 288, 5, 2, UNI_CCC__A } /* ccc=230 */, + { 291, 3040, 599, 13, 3, -UNI_QMARK } /* quotationmark=no */, + { 0, 823, 599, 4, 2, -UNI_DASH } /* dash=n */, + { 0, 2301, 0, 4, 0, UNI_XIDC } /* xidc */, + { 0, 2832, 4659, 10, 9, UNI_CYRILLICEXTC } /* iscyrillicextendedc */, + { 656, 8343, 5017, 22, 14, UNI_INSC__VOWELDEPENDENT } /* indicsyllabiccategory=voweldependent */, + { 4, 461, 462, 2, 4, UNI_SHAW } /* isshaw */, + { 296, 2503, 934, 5, 2, -UNI_JOINC } /* joinc=f */, + { 0, 3391, 1313, 13, 4, UNI_NV__6000 } /* numericvalue=6000 */, + { 0, 875, 353, 5, 4, UNI_UIDEO } /* uideo=yes */, + { 7, 7011, 3141, 24, 11, UNI_CCC__DA } /* canonicalcombiningclass=doubleabove */, + { 16, 2665, 599, 13, 2, -UNI_PATSYN } /* patternsyntax=n */, + { 14, 3026, 0, 14, 0, UNI_PHLP } /* psalterpahlavi */, + { 0, 1102, 168, 4, 4, UNI_COPT } /* scx=qaac */, + { 648, 2280, 6262, 11, 3, UNI_IN__12_DOT_1 } /* presentin=12.1 */, + { 1074, 578, 582, 5, 2, UNI_CCC__BR } /* ccc=222 */, + { 0, 406, 1467, 2, 8, UNI_DIAK } /* divesakuru */, + { 71, 3984, 585, 17, 2, UNI_EPRES } /* emojipresentation=t */, + { 2, 6163, 5017, 5, 14, UNI_INSC__VOWELDEPENDENT } /* insc=voweldependent */, + { 1152, 5838, 0, 10, 0, UNI_JAMO } /* hanguljamo */, + { 0, 2324, 6357, 9, 13, UNI_CJKCOMPAT } /* block=cjkcompatibility */, + { 1548, 533, 33, 3, 2, UNI_SB__ST } /* sb=st */, + { 0, 6165, 967, 3, 8, UNI_SC__GUJR } /* sc=gujarati */, + { 0, 2503, 353, 5, 2, UNI_JOINC } /* joinc=y */, + { 0, 406, 353, 2, 2, UNI_DI } /* di=y */, + { 0, 1421, 976, 3, 7, UNI_INGURMUKHI } /* ingurmukhi */, + { 6, 2324, 6000, 6, 21, UNI_YIJING } /* block=yijinghexagramsymbols */, + { 0, 1200, 3611, 3, 11, UNI_CJKCOMPATFORMS } /* cjkcompatforms */, + { 26, 461, 1009, 2, 4, UNI_LYCI } /* islyci */, + { 0, 461, 3791, 2, 10, UNI_SM } /* ismathsymbol */, + { 0, 3407, 520, 14, 1, UNI_NV__47 } /* numericvalue=47 */, + { 4, 6041, 599, 21, 5, UNI_BPT__N } /* bidipairedbrackettype=none */, + { 571, 461, 4602, 2, 18, UNI_PI } /* isinitialpunctuation */, + { 0, 3098, 0, 8, 0, UNI_XPOSIXXDIGIT } /* hexdigit */, + { 0, 102, 0, 4, 0, UNI_HMNG } /* hmng */, + { 15, 2324, 3635, 6, 14, UNI_LATINEXTD } /* block=latinextendedd */, + { 1763, 753, 353, 6, 2, UNI_NFKCQC__Y } /* nfkcqc=y */, + { 0, 2780, 0, 6, 0, UNI_COPT } /* coptic */, + { 1096, 1102, 2411, 4, 8, UNI_KANA } /* scx=katakana */, + { 0, 8, 0, 1, 0, UNI_P } /* p */, + { 0, 622, 585, 7, 5, UNI_EXTPICT } /* extpict=true */, + { 0, 2, 0, 3, 0, UNI_CWL } /* cwl */, + { 6, 461, 5, 2, 3, UNI_OCR } /* isocr */, + { 360, 3475, 0, 15, 0, UNI_ZANB } /* zanabazarsquare */, + { 0, 1728, 5848, 6, 9, UNI_ARABICEXTA } /* arabicextendeda */, + { 0, 1823, 1592, 7, 10, UNI_SAUR } /* script=saurashtra */, + { 0, 1823, 825, 7, 7, UNI_SHAW } /* script=shavian */, + { 1, 309, 967, 2, 8, UNI_INGUJARATI } /* ingujarati */, + { 5, 1198, 6155, 3, 8, UNI_INCUNEIFORM } /* incuneiform */, + { 302, 3040, 0, 13, 0, UNI_QMARK } /* quotationmark */, + { 157, 3817, 295, 14, 1, UNI_NV__19 } /* numericvalue=19 */, + { 1545, 1102, 1255, 4, 4, UNI_SIDD } /* scx=sidd */, + { 65, 292, 1317, 3, 2, UNI_NV__32 } /* nv=32 */, + { 0, 629, 584, 5, 3, UNI_GRBASE } /* grbase=t */, + { 9, 5637, 543, 21, 3, UNI_WB__EB } /* graphemeclusterbreak=ebg */, + { 0, 2324, 3436, 6, 15, UNI_SARB } /* block=oldsoutharabian */, + { 1, 8441, 3078, 24, 6, UNI__PERL_PROBLEMATIC_LOCALE_FOLDS } /* _perl_problematic_locale_folds */, + { 31, 1424, 1070, 7, 2, UNI_CCC__31 } /* ccc=ccc31 */, + { 5, 4554, 0, 15, 0, UNI_TITLE } /* titlecaseletter */, + { 1, 309, 108, 2, 4, UNI_INKAWI } /* inkawi */, + { 0, 1906, 490, 7, 3, UNI_KANBUN } /* blk=kanbun */, + { 0, 1075, 2147, 4, 8, UNI_NV__1_SLASH_4 } /* nv=2.500e-01 */, + { 47, 6165, 983, 3, 4, UNI_SC__HIRA } /* sc=hira */, + { 0, 1872, 0, 11, 0, UNI_YISYLLABLES } /* yisyllables */, + { 6, 3502, 620, 10, 5, UNI_ETHIOPICEXT } /* blk=ethiopicext */, + { 17, 1667, 1438, 4, 10, UNI_INCHORASMIAN } /* blk=chorasmian */, + { 7, 2718, 4827, 3, 18, UNI_BC__B } /* bc=paragraphseparator */, + { 1, 3391, 2092, 13, 2, UNI_NV__25 } /* numericvalue=25 */, + { 692, 2503, 585, 11, 2, UNI_JOINC } /* joincontrol=t */, + { 0, 461, 6900, 2, 23, UNI_BYZANTINEMUSIC } /* isbyzantinemusicalsymbols */, + { 790, 4360, 274, 9, 3, UNI_LB__B2 } /* linebreak=b2 */, + { 0, 4360, 21, 10, 2, UNI_LB__EX } /* linebreak=ex */, + { 3, 7944, 4158, 28, 4, UNI_CJKEXTD } /* iscjkunifiedideographsextensiond */, + { 1178, 2523, 2060, 8, 5, UNI_XPOSIXALPHA } /* isxposixalpha */, + { 1, 7892, 934, 16, 2, -UNI_UIDEO } /* unifiedideograph=f */, + { 0, 1823, 2441, 7, 11, UNI_SC__NAND } /* script=nandinagari */, + { 4, 6165, 1285, 3, 9, UNI_SC__SIND } /* sc=khudawadi */, + { 0, 1823, 466, 7, 4, UNI_SOGO } /* script=sogo */, + { 55, 6165, 683, 3, 5, UNI_SC__TAKR } /* sc=takri */, + { 3, 4391, 290, 15, 1, UNI_NV__3_SLASH_4 } /* numericvalue=3/4 */, + { 0, 7274, 625, 9, 2, UNI_PI } /* category=pi */, + { 134, 4391, 295, 14, 1, UNI_NV__39 } /* numericvalue=39 */, + { 0, 324, 5909, 3, 7, UNI_SUPARROWSC } /* suparrowsc */, + { 0, 4424, 1834, 17, 4, UNI_SORA } /* scriptextensions=sora */, + { 1, 2004, 4150, 5, 5, UNI_POSIXPUNCT } /* posixpunct */, + { 647, 1823, 779, 7, 4, UNI_OSMA } /* script=osma */, + { 73, 1823, 1227, 7, 4, UNI_MAKA } /* script=maka */, + { 3, 2732, 8174, 10, 29, UNI_ARABICMATH } /* blk=arabicmathematicalalphabeticsymbols */, + { 8, 1102, 434, 4, 4, UNI_OGAM } /* scx=ogam */, + { 18, 1823, 951, 7, 8, UNI_SC__DUPL } /* script=duployan */, + { 1, 309, 1191, 2, 7, UNI_INBENGALI } /* inbengali */, + { 0, 11, 5676, 1, 18, UNI_ANCIENTGREEKNUMBERS } /* ancientgreeknumbers */, + { 0, 1424, 768, 7, 2, UNI_CCC__27 } /* ccc=ccc27 */, + { 1, 461, 4926, 2, 5, UNI_TAML } /* istamil */, + { 0, 4360, 1864, 10, 5, UNI_EBASE } /* linebreak=ebase */, + { 154, 1065, 295, 4, 1, UNI_NV__19 } /* nv=19 */, + { 0, 2523, 307, 8, 5, UNI_XPOSIXPRINT } /* isxposixprint */, + { 556, 461, 180, 2, 4, UNI_RUNR } /* isrunr */, + { 650, 1102, 746, 4, 7, UNI_MARC } /* scx=marchen */, + { 0, 4424, 35, 17, 4, UNI_BATK } /* scriptextensions=batk */, + { 74, 2536, 7328, 3, 14, UNI_JG__NOJOININGGROUP } /* jg=nojoininggroup */, + { 0, 5168, 3084, 6, 9, UNI__PERL_QUOTEMETA } /* _perl_quotemeta */, + { 0, 255, 0, 2, 0, UNI_CF } /* cf */, + { 0, 4191, 353, 5, 4, UNI_XPOSIXLOWER } /* lower=yes */, + { 0, 54, 2735, 2, 7, UNI_SC__ARAB } /* sc=arabic */, + { 0, 1667, 1248, 4, 7, UNI_INPHAGSPA } /* blk=phagspa */, + { 6, 940, 1104, 5, 2, UNI_compex_values_index } /* compex= */, + { 0, 461, 4206, 2, 15, UNI_PS } /* isopenpunctuation */, + { 1079, 6165, 926, 5, 2, UNI_SC__COPT } /* sc=copt */, + { 142, 1823, 1562, 7, 4, UNI_NAGM } /* script=nagm */, + { 29, 959, 934, 8, 6, -UNI_EXT } /* extender=false */, + { 0, 7648, 601, 19, 3, UNI_DT__NONE } /* decompositiontype=none */, + { 1, 1823, 406, 7, 4, UNI_DIAK } /* script=diak */, + { 1096, 959, 0, 8, 0, UNI_EXT } /* extender */, + { 0, 1200, 1926, 3, 7, UNI_CJKSYMBOLS } /* cjksymbols */, + { 1, 3391, 1154, 13, 2, UNI_NV__43 } /* numericvalue=43 */, + { 0, 4360, 4650, 10, 2, UNI_LB__BB } /* linebreak=bb */, + { 1, 1272, 3611, 5, 11, UNI_CJKCOMPATFORMS } /* iscjkcompatforms */, + { 1, 1102, 23, 4, 4, UNI_AHOM } /* scx=ahom */, + { 546, 461, 1914, 2, 8, UNI_UCASEXTA } /* isucasexta */, + { 0, 2287, 560, 3, 3, UNI_IN__7 } /* in=7.0 */, + { 0, 1823, 5031, 7, 4, UNI_SC__HAN } /* script=hani */, + { 132, 339, 393, 4, 2, UNI_CCC__15 } /* ccc=15 */, + { 2, 2324, 718, 6, 7, UNI_INKANNADA } /* block=kannada */, + { 0, 5595, 599, 21, 3, -UNI_CWT } /* changeswhentitlecased=no */, + { 0, 7274, 7110, 9, 13, UNI_M } /* category=combiningmark */, + { 0, 180, 0, 4, 0, UNI_RUNR } /* runr */, + { 2, 597, 238, 3, 2, UNI_DT__NB } /* dt=nb */, + { 21, 461, 4651, 2, 16, UNI_BOPOMOFOEXT } /* isbopomofoextended */, + { 128, 4424, 1484, 17, 8, UNI_BUGI } /* scriptextensions=buginese */, + { 10, 5769, 934, 4, 2, -UNI_EMOD } /* emod=f */, + { 3, 4502, 4698, 8, 2, UNI_LATIN1 } /* blk=latin1 */, + { 0, 4407, 585, 17, 5, UNI_RI } /* regionalindicator=true */, + { 0, 2536, 6215, 3, 9, UNI_JG__YEHBARREE } /* jg=yehbarree */, + { 411, 6870, 8554, 17, 4, UNI_ce_values_index } /* compositionexclusion= */, + { 1705, 2393, 3640, 8, 9, UNI_CYRILLICEXTD } /* cyrillicextendedd */, + { 0, 1065, 1317, 5, 3, UNI_NV__1_SLASH_320 } /* nv=1/320 */, + { 1089, 6427, 2546, 20, 3, UNI_JG__AFRICANFEH } /* joininggroup=africanfeh */, + { 124, 1102, 462, 4, 4, UNI_SHAW } /* scx=shaw */, + { 0, 3014, 2125, 11, 2, UNI_IN__6_DOT_3 } /* presentin=v63 */, + { 0, 3817, 760, 14, 3, UNI_NV__11_SLASH_2 } /* numericvalue=11/2 */, + { 1, 2665, 585, 13, 5, UNI_PATSYN } /* patternsyntax=true */, + { 2, 1102, 426, 4, 3, UNI_MRO } /* scx=mro */, + { 144, 1492, 5292, 4, 16, UNI_INPUNCTUATION } /* ingeneralpunctuation */, + { 0, 2536, 1747, 3, 8, UNI_JG__FARSIYEH } /* jg=farsiyeh */, + { 115, 3204, 274, 14, 1, UNI_grext_values_index } /* graphemeextend= */, + { 0, 2324, 6185, 6, 10, UNI_INGLAGOLITIC } /* block=glagolitic */, + { 0, 461, 3026, 2, 14, UNI_PHLP } /* ispsalterpahlavi */, + { 1, 309, 342, 2, 3, UNI_IN__12 } /* in=12 */, + { 0, 461, 8607, 2, 33, UNI_SUPMATHOPERATORS } /* issupplementalmathematicaloperators */, + { 167, 4941, 3622, 9, 3, UNI_KANGXI } /* block=kangxi */, + { 0, 461, 426, 2, 3, UNI_MRO } /* ismro */, + { 0, 1102, 718, 4, 7, UNI_KNDA } /* scx=kannada */, + { 0, 1479, 5671, 4, 3, -UNI_XPOSIXSPACE } /* space=n */, + { 3, 4161, 0, 12, 0, UNI_DIACRITICALS } /* diacriticals */, + { 11, 461, 2852, 2, 7, UNI_MAHJONG } /* ismahjong */, + { 2, 7887, 3998, 28, 4, UNI_CJKEXTG } /* incjkunifiedideographsextensiong */, + { 0, 4852, 933, 9, 7, -UNI_XPOSIXSPACE } /* whitespace=false */, + { 4, 8343, 5338, 22, 15, UNI_INSC__REGISTERSHIFTER } /* indicsyllabiccategory=registershifter */, + { 163, 30, 7133, 1, 27, UNI_PCM } /* isprependedconcatenationmark */, + { 1, 339, 689, 4, 3, UNI_CCC__214 } /* ccc=ata */, + { 257, 4424, 1522, 17, 4, UNI_UGAR } /* scriptextensions=ugar */, + { 1, 1385, 0, 6, 0, UNI_THAA } /* thaana */, + { 23, 5065, 4243, 13, 4, UNI_JG__MANICHAEANHETH } /* jg=manichaeanheth */, + { 1131, 4371, 352, 5, 2, UNI_wspace_values_index } /* wspace= */, + { 5, 6090, 8039, 7, 32, UNI_MISCMATHSYMBOLSA } /* block=miscellaneousmathematicalsymbolsa */, + { 2, 6841, 2931, 24, 3, UNI_DI } /* defaultignorablecodepoint=t */, + { 22, 5156, 1864, 10, 8, UNI_WB__EB } /* wordbreak=ebasegaz */, + { 0, 1102, 98, 4, 4, UNI_HLUW } /* scx=hluw */, + { 349, 2324, 3908, 6, 6, UNI_INTANGUT } /* block=tangut */, + { 209, 1926, 0, 6, 0, UNI_S } /* symbol */, + { 1, 7591, 272, 3, 2, UNI_LB__CB } /* lb=cb */, + { 1, 5799, 5909, 5, 7, UNI_SUPARROWSC } /* insuparrowsc */, + { 2429, 461, 257, 2, 4, UNI_CWCM } /* iscwcm */, + { 1113, 1200, 8153, 3, 21, UNI_CJKSYMBOLS } /* cjksymbolsandpunctuation */, + { 6, 3014, 1317, 11, 2, UNI_IN__3_DOT_2 } /* presentin=v32 */, + { 1054, 733, 7915, 3, 20, UNI_ENCLOSEDALPHANUM } /* inenclosedalphanumerics */, + { 0, 1667, 6185, 4, 10, UNI_INGLAGOLITIC } /* blk=glagolitic */, + { 1, 7214, 582, 25, 2, UNI_CCC__122 } /* canonicalcombiningclass=122 */, + { 2, 6427, 481, 13, 3, UNI_JG__GAF } /* joininggroup=gaf */, + { 112, 1667, 6692, 4, 15, UNI_TRANSPORTANDMAP } /* blk=transportandmap */, + { 1565, 380, 599, 6, 2, -UNI_HYPHEN } /* hyphen=n */, + { 0, 794, 0, 4, 0, UNI_LANA } /* lana */, + { 115, 3177, 604, 15, 4, UNI_EA__W } /* eastasianwidth=wide */, + { 0, 309, 4131, 2, 15, UNI_VEDICEXT } /* invedicextensions */, + { 0, 461, 3558, 2, 9, UNI_Z } /* isseparator */, + { 3, 1102, 1331, 4, 9, UNI_PERM } /* scx=oldpermic */, + { 0, 2324, 1133, 6, 8, UNI_INVITHKUQI } /* block=vithkuqi */, + { 1671, 2324, 1340, 6, 9, UNI_INOLDTURKIC } /* block=oldturkic */, + { 0, 2324, 7796, 6, 29, UNI_ENCLOSEDIDEOGRAPHICSUP } /* block=enclosedideographicsupplement */, + { 1, 3832, 2200, 14, 8, UNI_NV__1_SLASH_20 } /* numericvalue=5.000e-02 */, + { 0, 2752, 353, 14, 2, UNI_ECOMP } /* emojicomponent=y */, + { 0, 1102, 1484, 4, 4, UNI_BUGI } /* scx=bugi */, + { 11, 7591, 2621, 3, 9, UNI_LB__SG } /* lb=surrogate */, + { 0, 3633, 3693, 3, 3, UNI_INLISU } /* inlisu */, + { 329, 5532, 585, 21, 5, UNI_CWCF } /* changeswhencasefolded=true */, + { 4, 1102, 678, 4, 5, UNI_RUNR } /* scx=runic */, + { 1, 4424, 1094, 17, 4, UNI_MERC } /* scriptextensions=merc */, + { 515, 3635, 4770, 8, 10, UNI_LATINEXTADDITIONAL } /* latinextadditional */, + { 1, 261, 934, 5, 2, -UNI_CWKCF } /* cwkcf=f */, + { 901, 5205, 4636, 5, 15, UNI_MISCMATHSYMBOLSB } /* blk=miscmathsymbolsb */, + { 1, 3791, 353, 4, 2, UNI_MATH } /* math=y */, + { 1, 7198, 1269, 8, 3, UNI_SUPPUAB } /* blk=suppuab */, + { 0, 1198, 1037, 5, 4, UNI_CJKEXTB } /* incjkextb */, + { 3, 1102, 608, 4, 4, UNI_ELBA } /* scx=elba */, + { 1172, 2280, 2689, 10, 3, UNI_IN__6_DOT_1 } /* presentin=6.1 */, + { 1796, 4191, 0, 5, 0, UNI_XPOSIXLOWER } /* lower */, + { 1, 1102, 59, 4, 4, UNI_CHRS } /* scx=chrs */, + { 1003, 30, 1617, 1, 3, UNI_SO } /* isso */, + { 18, 5658, 7062, 15, 11, UNI_IDENTIFIERTYPE__RECOMMENDED } /* identifiertype=recommended */, + { 2, 47, 0, 4, 0, UNI_CAKM } /* cakm */, + { 273, 521, 599, 6, 3, -UNI_PATSYN } /* patsyn=no */, + { 3, 597, 363, 3, 3, UNI_DT__SML } /* dt=sml */, + { 516, 3177, 1176, 14, 7, UNI_EA__NA } /* eastasianwidth=narrow */, + { 1200, 7011, 581, 23, 3, UNI_CCC__22 } /* canonicalcombiningclass=22 */, + { 260, 7267, 4146, 16, 15, UNI_PD } /* generalcategory=dashpunctuation */, + { 800, 7648, 2692, 18, 8, UNI_DT__VERT } /* decompositiontype=vertical */, + { 0, 959, 934, 8, 2, -UNI_EXT } /* extender=f */, + { 0, 7267, 599, 15, 2, UNI_N } /* generalcategory=n */, + { 6, 6165, 1027, 3, 4, UNI_SC__YEZI } /* sc=yezi */, + { 0, 753, 1792, 3, 4, UNI_nfkcqc_values_index } /* nfkcqc= */, + { 0, 461, 71, 2, 3, UNI_CWU } /* iscwu */, + { 0, 4424, 2780, 17, 4, UNI_COPT } /* scriptextensions=copt */, + { 6, 6165, 2852, 3, 4, UNI_SC__MAHJ } /* sc=mahj */, + { 149, 312, 353, 5, 2, UNI_QMARK } /* qmark=y */, + { 5, 4519, 1674, 14, 4, UNI_CYRILLICEXTD } /* block=cyrillicextd */, + { 31, 2, 598, 2, 4, -UNI_CWT } /* cwt=no */, + { 3, 309, 779, 2, 7, UNI_INOSMANYA } /* inosmanya */, + { 385, 7267, 2621, 16, 9, UNI__PERL_SURROGATE } /* generalcategory=surrogate */, + { 0, 10, 3189, 2, 3, UNI_math_values_index } /* math= */, + { 644, 1102, 615, 4, 7, UNI_ELYM } /* scx=elymaic */, + { 410, 5532, 599, 21, 2, -UNI_CWCF } /* changeswhencasefolded=n */, + { 5, 2287, 386, 3, 3, UNI_IN__3_DOT_2 } /* in=3.2 */, + { 1348, 309, 4176, 2, 15, UNI_INHANGUL } /* inhangulsyllables */, + { 0, 2842, 620, 8, 5, UNI_ETHIOPICEXT } /* isethiopicext */, + { 7, 1667, 4090, 4, 17, UNI_INDICSIYAQNUMBERS } /* blk=indicsiyaqnumbers */, + { 32, 461, 1484, 2, 8, UNI_BUGI } /* isbuginese */, + { 423, 1011, 585, 2, 5, UNI_CI } /* ci=true */, + { 838, 4424, 430, 17, 3, UNI_NKO } /* scriptextensions=nko */, + { 2, 253, 934, 4, 6, -UNI_CWCF } /* cwcf=false */, + { 896, 461, 1501, 2, 8, UNI_JAMOEXTA } /* isjamoexta */, + { 0, 3863, 2657, 14, 8, UNI_NV__4_SLASH_5 } /* numericvalue=8.000e-01 */, + { 32, 1484, 0, 4, 0, UNI_BUGI } /* bugi */, + { 258, 309, 1227, 2, 7, UNI_INMAKASAR } /* inmakasar */, + { 0, 1397, 599, 3, 3, -UNI_IDS } /* ids=no */, + { 138, 887, 2199, 5, 3, UNI_AGE__12 } /* age=12.0 */, + { 642, 1455, 934, 10, 2, -UNI_DEP } /* deprecated=f */, + { 2, 461, 2441, 2, 11, UNI_NAND } /* isnandinagari */, + { 15, 7495, 582, 27, 2, UNI_CCC__22 } /* canonicalcombiningclass=ccc22 */, + { 0, 3791, 934, 4, 2, -UNI_MATH } /* math=f */, + { 262, 4043, 934, 4, 2, -UNI_IDSB } /* idsb=f */, + { 0, 1883, 934, 11, 6, -UNI_BIDIC } /* bidicontrol=false */, + { 954, 7011, 2742, 24, 10, UNI_CCC__6 } /* canonicalcombiningclass=hanreading */, + { 5, 8601, 4607, 16, 13, UNI_SUPPUNCTUATION } /* block=supplementalpunctuation */, + { 3658, 1102, 2045, 4, 12, UNI_GONM } /* scx=masaramgondi */, + { 0, 1358, 0, 9, 0, UNI_PALM } /* palmyrene */, + { 130, 224, 0, 4, 0, UNI_XPEO } /* xpeo */, + { 2199, 3817, 515, 14, 2, UNI_NV__1_SLASH_5 } /* numericvalue=1/5 */, + { 1, 309, 6332, 2, 19, UNI_JAMOEXTB } /* inhanguljamoextendedb */, + { 7, 4424, 1262, 17, 7, UNI_SOYO } /* scriptextensions=soyombo */, + { 476, 2525, 3268, 6, 5, UNI_XPOSIXALNUM } /* xposixalnum */, + { 3, 7495, 891, 27, 2, UNI_CCC__10 } /* canonicalcombiningclass=ccc10 */, + { 4116, 7591, 1771, 3, 8, UNI_LB__NL } /* lb=nextline */, + { 0, 7011, 430, 24, 2, UNI_CCC__7 } /* canonicalcombiningclass=nk */, + { 4, 2324, 6103, 6, 13, UNI_MATHOPERATORS } /* block=mathoperators */, + { 1921, 4795, 2131, 14, 8, UNI_NV__2_SLASH_3 } /* numericvalue=6.667e-01 */, + { 516, 4089, 0, 4, 0, UNI_SIND } /* sind */, + { 0, 4424, 991, 17, 4, UNI_HATR } /* scriptextensions=hatr */, + { 4097, 2536, 2009, 3, 9, UNI_JG__SYRIACWAW } /* jg=syriacwaw */, + { 0, 423, 2705, 3, 13, UNI_ANCIENTSYMBOLS } /* inancientsymbols */, + { 108, 4360, 318, 10, 2, UNI_LB__AI } /* linebreak=ai */, + { 1, 461, 112, 2, 4, UNI_KITS } /* iskits */, + { 0, 1102, 1819, 4, 4, UNI_MONG } /* scx=mong */, + { 0, 1667, 527, 4, 6, UNI_INREJANG } /* blk=rejang */, + { 1, 6450, 535, 13, 3, UNI_SB__ST } /* sentencebreak=st */, + { 5294, 4424, 2735, 16, 7, UNI_ARAB } /* scriptextensions=arabic */, + { 14, 2514, 740, 3, 6, UNI_MAND } /* ismandaic */, + { 8, 2391, 6193, 8, 5, UNI_CYRILLICSUP } /* incyrillicsup */, + { 4140, 2766, 3558, 3, 9, UNI_Z } /* gc=separator */, + { 233, 3677, 0, 3, 0, UNI_L } /* isl */, + { 3, 1102, 1385, 4, 4, UNI_THAA } /* scx=thaa */, + { 8, 6163, 1517, 5, 5, UNI_INSC__BINDU } /* insc=bindu */, + { 0, 339, 391, 4, 2, UNI_CCC__34 } /* ccc=34 */, + { 0, 895, 891, 6, 2, UNI_AGE__11 } /* age=v110 */, + { 0, 6165, 224, 3, 4, UNI_XPEO } /* sc=xpeo */, + { 1, 461, 2483, 2, 11, UNI_CASEDLETTER } /* iscasedletter */, + { 0, 30, 1941, 1, 6, UNI_XPOSIXGRAPH } /* isgraph */, + { 0, 461, 1331, 2, 9, UNI_PERM } /* isoldpermic */, + { 0, 533, 306, 3, 2, UNI_SB__SP } /* sb=sp */, + { 2762, 4911, 0, 15, 0, UNI_DIACRITICALSSUP } /* diacriticalssup */, + { 0, 461, 4740, 2, 4, UNI_TALE } /* istale */, + { 1043, 2536, 4751, 3, 5, UNI_JG__SADHE } /* jg=sadhe */, + { 0, 1667, 6586, 4, 11, UNI_NUMBERFORMS } /* blk=numberforms */, + { 9, 578, 388, 5, 2, UNI_CCC__R } /* ccc=226 */, + { 0, 1075, 1805, 4, 7, UNI_NV__20000000 } /* nv=20000000 */, + { 2057, 2302, 585, 3, 5, UNI_IDC } /* idc=true */, + { 0, 1667, 718, 4, 7, UNI_INKANNADA } /* blk=kannada */, + { 0, 2287, 563, 3, 3, UNI_IN__8 } /* in=8.0 */, + { 2060, 2514, 4636, 3, 15, UNI_MISCMATHSYMBOLSB } /* ismiscmathsymbolsb */, + { 81, 1894, 585, 12, 5, UNI_BIDIM } /* bidimirrored=true */, + { 25, 4424, 1051, 17, 8, UNI_MAHJ } /* scriptextensions=mahajani */, + { 4097, 3026, 0, 2, 0, UNI_PS } /* ps */, + { 1178, 1667, 1191, 4, 7, UNI_INBENGALI } /* blk=bengali */, + { 0, 461, 2244, 2, 12, UNI_HUNG } /* isoldhungarian */, + { 10, 2324, 377, 9, 4, UNI_CJKEXTH } /* block=cjkexth */, + { 0, 461, 1894, 2, 5, UNI_BIDIM } /* isbidim */, + { 1735, 406, 585, 3, 2, UNI_DIA } /* dia=t */, + { 0, 6165, 1294, 3, 9, UNI_NBAT } /* sc=nabataean */, + { 0, 292, 1318, 3, 4, UNI_NV__2000 } /* nv=2000 */, + { 151, 2718, 4487, 3, 15, UNI_BC__CS } /* bc=commonseparator */, + { 0, 3677, 5848, 7, 9, UNI_LATINEXTA } /* islatinextendeda */, + { 298, 4845, 933, 16, 3, -UNI__PERL_PATWS } /* patternwhitespace=f */, + { 4163, 309, 1021, 2, 6, UNI_INWANCHO } /* inwancho */, + { 0, 1272, 204, 7, 2, UNI_CJKEXTF } /* iscjkextf */, + { 0, 54, 1105, 2, 5, UNI_TALU } /* sc=talu */, + { 0, 6165, 4487, 3, 6, UNI_SC__ZYYY } /* sc=common */, + { 8, 2718, 52, 3, 2, UNI_BC__AN } /* bc=an */, + { 38, 461, 2302, 2, 10, UNI_IDC } /* isidcontinue */, + { 0, 7752, 4756, 23, 5, UNI_JG__MANICHAEANZAYIN } /* joininggroup=manichaeanzayin */, + { 4336, 1667, 8214, 5, 24, UNI_DIACRITICALS } /* blk=combiningdiacriticalmarks */, + { 2, 2060, 585, 5, 2, UNI_XPOSIXALPHA } /* alpha=t */, + { 2254, 1530, 3746, 4, 14, UNI_KAKTOVIKNUMERALS } /* iskaktoviknumerals */, + { 2088, 1667, 1241, 4, 7, UNI_NB } /* blk=noblock */, + { 4098, 71, 0, 3, 0, UNI_CWU } /* cwu */, + { 0, 2324, 1404, 6, 10, UNI_ASCII } /* block=basiclatin */, + { 2, 1823, 861, 7, 7, UNI_TIBT } /* script=tibetan */, + { 0, 1667, 192, 4, 4, UNI_TAGS } /* blk=tags */, + { 1, 39, 0, 4, 0, UNI_BHKS } /* bhks */, + { 4494, 2004, 4191, 5, 5, UNI_POSIXLOWER } /* posixlower */, + { 0, 461, 2752, 2, 14, UNI_ECOMP } /* isemojicomponent */, + { 2096, 297, 0, 5, 0, UNI_ORYA } /* oriya */, + { 4160, 2536, 0, 3, 0, UNI_jg_values_index } /* jg= */, + { 5, 1667, 5876, 4, 9, UNI_INSUNDANESE } /* blk=sundanese */, + { 0, 292, 3405, 3, 2, UNI_NV__36 } /* nv=36 */, + { 0, 1667, 1853, 4, 11, UNI_INSYLOTINAGRI } /* blk=sylotinagri */, + { 2154, 6165, 426, 3, 3, UNI_MRO } /* sc=mro */, + { 4, 6735, 699, 14, 3, UNI_JG__MEEM } /* joininggroup=meem */, + { 0, 2401, 6193, 8, 12, UNI_ETHIOPICSUP } /* inethiopicsupplement */, + { 1024, 2280, 0, 12, 0, UNI_IN__14 } /* presentin=14 */, + { 1323, 1823, 868, 7, 7, UNI_SC__TIRH } /* script=tirhuta */, + { 5635, 2766, 248, 3, 5, UNI_XPOSIXCNTRL } /* gc=cntrl */, + { 0, 2536, 1046, 3, 5, UNI_JG__KHAPH } /* jg=khaph */, + { 0, 2494, 0, 6, 0, UNI_GEOR } /* isgeor */, + { 1, 6154, 0, 9, 0, UNI_XSUX } /* cuneiform */, + { 2689, 3391, 344, 13, 2, UNI_NV__21 } /* numericvalue=21 */, + { 2155, 2752, 934, 5, 6, -UNI_EMOJI } /* emoji=false */, + { 0, 2280, 2182, 9, 2, UNI_IN__4 } /* presentin=4 */, + { 3081, 1603, 0, 6, 0, UNI_L } /* letter */, + { 3, 1942, 352, 11, 2, UNI_grbase_values_index } /* graphemebase= */, + { 2224, 461, 430, 2, 4, UNI_NKO } /* isnkoo */, + { 15, 461, 5595, 2, 21, UNI_CWT } /* ischangeswhentitlecased */, + { 10, 7591, 4304, 5, 12, UNI_LB__SA } /* lb=complexcontext */, + { 4096, 1801, 0, 7, 0, UNI_NV__1000 } /* nv=1000 */, + { 7, 4424, 1438, 17, 10, UNI_CHRS } /* scriptextensions=chorasmian */, + { 364, 309, 4651, 2, 8, UNI_INBOPOMOFO } /* inbopomofo */, + { 4281, 1391, 1909, 2, 3, UNI_WB__KA } /* wb=ka */, + { 0, 2432, 2643, 3, 12, UNI_MISCTECHNICAL } /* inmisctechnical */, + { 1, 8246, 8508, 30, 14, UNI_INPC__TOPANDBOTTOMANDRIGHT } /* indicpositionalcategory=topandbottomandright */, + { 0, 309, 5440, 2, 20, UNI_INNYIAKENGPUACHUEHMONG } /* innyiakengpuachuehmong */, + { 2375, 2536, 783, 3, 3, UNI_JG__NYA } /* jg=nya */, + { 5, 1667, 1349, 4, 9, UNI_INOLDUYGHUR } /* blk=olduyghur */, + { 0, 1102, 5185, 4, 20, UNI_HLUW } /* scx=anatolianhieroglyphs */, + { 0, 4525, 0, 12, 0, UNI_CYRILLICEXTC } /* cyrillicextc */, + { 28, 7011, 2222, 23, 2, UNI_CCC__6 } /* canonicalcombiningclass=6 */, + { 1050, 4043, 353, 17, 4, UNI_IDSB } /* idsbinaryoperator=yes */, + { 23, 901, 0, 8, 0, UNI_ARMN } /* armenian */, + { 13, 3391, 1155, 13, 2, UNI_NV__35 } /* numericvalue=35 */, + { 0, 7011, 2742, 24, 4, UNI_CCC__6 } /* canonicalcombiningclass=hanr */, + { 4192, 597, 0, 7, 0, UNI_DT__NONE } /* dt=none */, + { 0, 1823, 5712, 7, 19, UNI_MERO } /* script=meroitichieroglyphs */, + { 0, 302, 934, 5, 6, -UNI__PERL_PATWS } /* patws=false */, + { 4116, 2324, 1522, 6, 8, UNI_INUGARITIC } /* block=ugaritic */, + { 0, 5532, 934, 21, 6, -UNI_CWCF } /* changeswhencasefolded=false */, + { 2061, 4424, 116, 17, 4, UNI_KNDA } /* scriptextensions=knda */, + { 0, 1530, 419, 3, 3, UNI_KHMR } /* iskhmr */, + { 2, 505, 1793, 3, 3, UNI_nfdqc_values_index } /* nfdqc= */, + { 5, 1011, 934, 2, 2, -UNI_CI } /* ci=f */, + { 2507, 309, 7036, 2, 26, UNI_HALFANDFULLFORMS } /* inhalfwidthandfullwidthforms */, + { 7, 461, 832, 2, 5, UNI_STERM } /* issterm */, + { 0, 2324, 840, 6, 7, UNI_INTAGALOG } /* block=tagalog */, + { 32, 1667, 1015, 4, 6, UNI_INTELUGU } /* blk=telugu */, + { 0, 3692, 0, 14, 0, UNI_LISUSUP } /* lisusupplement */, + { 295, 1667, 840, 4, 7, UNI_INTAGALOG } /* blk=tagalog */, + { 8, 3502, 1183, 5, 8, UNI_EMOTICONS } /* blk=emoticons */, + { 6172, 5532, 599, 21, 3, -UNI_CWCF } /* changeswhencasefolded=no */, + { 0, 461, 86, 2, 4, UNI_GREK } /* isgrek */, + { 0, 4424, 120, 17, 4, UNI_LAO } /* scriptextensions=laoo */, + { 459, 271, 3709, 4, 11, UNI_GCB__SM } /* gcb=spacingmark */, + { 9, 2525, 1082, 6, 4, UNI_XPOSIXWORD } /* xposixword */, + { 1, 875, 934, 5, 6, -UNI_UIDEO } /* uideo=false */, + { 0, 461, 997, 2, 6, UNI_KTHI } /* iskaithi */, + { 2056, 1667, 0, 11, 0, UNI_CJKEXTD } /* blk=cjkextd */, + { 3079, 312, 599, 5, 3, -UNI_QMARK } /* qmark=no */, + { 0, 1102, 1090, 4, 4, UNI_LINB } /* scx=linb */, + { 1, 271, 163, 4, 2, UNI_GCB__PP } /* gcb=pp */, + { 15, 7084, 1141, 8, 3, UNI_ARABICPFA } /* inarabicpfa */, + { 0, 30, 7854, 1, 12, UNI_IDEO } /* isideographic */, + { 4103, 461, 297, 2, 5, UNI_ORYA } /* isoriya */, + { 4527, 3014, 343, 12, 1, UNI_IN__1_DOT_1 } /* presentin=v11 */, + { 0, 19, 934, 4, 2, -UNI_POSIXXDIGIT } /* ahex=f */, + { 0, 2324, 4060, 6, 15, UNI_BRAI } /* block=braillepatterns */, + { 909, 2324, 8619, 6, 21, UNI_MATHOPERATORS } /* block=mathematicaloperators */, + { 4997, 1397, 934, 4, 2, -UNI_IDST } /* idst=f */, + { 0, 3635, 129, 11, 3, UNI_LATINEXTF } /* latinextendedf */, + { 1, 1823, 86, 7, 4, UNI_SC__GREK } /* script=grek */, + { 527, 4424, 493, 17, 6, UNI_KHOJ } /* scriptextensions=khojki */, + { 0, 1200, 6357, 3, 13, UNI_CJKCOMPAT } /* cjkcompatibility */, + { 2132, 3391, 6255, 14, 8, UNI_NV__1_SLASH_40 } /* numericvalue=2.500e-02 */, + { 2358, 6165, 5778, 3, 21, UNI_PRTI } /* sc=inscriptionalparthian */, + { 2912, 2324, 7724, 6, 18, UNI_INVS } /* block=variationselectors */, + { 0, 309, 673, 2, 5, UNI_INOSAGE } /* inosage */, + { 1682, 7537, 0, 27, 0, UNI_ALPHABETICPF } /* alphabeticpresentationforms */, + { 131, 261, 274, 5, 1, UNI_cwkcf_values_index } /* cwkcf= */, + { 0, 1102, 1086, 4, 4, UNI_KTHI } /* scx=kthi */, + { 0, 2, 1214, 1, 3, UNI_CHER } /* cher */, + { 0, 461, 1227, 2, 7, UNI_MAKA } /* ismakasar */, + { 1, 2752, 353, 5, 2, UNI_EMOJI } /* emoji=y */, + { 1, 2752, 0, 14, 0, UNI_ECOMP } /* emojicomponent */, + { 6218, 71, 934, 3, 6, -UNI_CWU } /* cwu=false */, + { 6, 895, 3876, 5, 2, UNI_AGE__8 } /* age=v80 */, + { 5511, 7267, 99, 16, 2, UNI_UPPERCASELETTER } /* generalcategory=lu */, + { 0, 1667, 6557, 7, 19, UNI_CJKCOMPATIDEOGRAPHSSUP } /* blk=cjkcompatideographssup */, + { 3, 739, 0, 4, 0, UNI_MAND } /* mand */, + { 2066, 30, 62, 1, 5, UNI_CPMN } /* iscpmn */, + { 0, 30, 832, 1, 5, UNI_TERM } /* isterm */, + { 0, 2842, 0, 10, 0, UNI_ETHI } /* isethiopic */, + { 0, 1667, 3538, 4, 16, UNI_CYPRIOTSYLLABARY } /* blk=cypriotsyllabary */, + { 1, 1667, 8660, 4, 42, UNI_UCASEXT } /* blk=unifiedcanadianaboriginalsyllabicsextended */, + { 0, 30, 633, 1, 8, UNI_HANO } /* ishanunoo */, + { 2188, 4536, 0, 18, 0, UNI_COPTICEPACTNUMBERS } /* copticepactnumbers */, + { 4936, 461, 1205, 2, 7, UNI_GRAN } /* isgrantha */, + { 0, 380, 353, 6, 2, UNI_HYPHEN } /* hyphen=y */, + { 2, 1726, 4511, 8, 9, UNI_ARABICEXTB } /* isarabicextendedb */, + { 0, 622, 598, 6, 3, -UNI_EXTPICT } /* extpict=n */, + { 0, 1102, 6082, 4, 8, UNI_GEOR } /* scx=georgian */, + { 0, 7591, 4407, 3, 17, UNI_RI } /* lb=regionalindicator */, + { 2486, 4424, 648, 17, 5, UNI_ADLM } /* scriptextensions=adlam */, + { 3, 5065, 600, 12, 4, UNI_JG__MANICHAEANONE } /* jg=manichaeanone */, + { 6356, 6165, 5958, 3, 4, UNI_SC__SINH } /* sc=sinh */, + { 0, 5857, 0, 9, 0, UNI_MONG } /* mongolian */, + { 20, 2324, 4536, 6, 18, UNI_COPTICEPACTNUMBERS } /* block=copticepactnumbers */, + { 4196, 1823, 1543, 7, 10, UNI_KHAR } /* script=kharoshthi */, + { 4864, 7752, 5079, 24, 5, UNI_JG__MANICHAEANTWENTY } /* joininggroup=manichaeantwenty */, + { 4160, 1102, 205, 5, 3, UNI_TFNG } /* scx=tfng */, + { 9, 7110, 0, 24, 0, UNI_DIACRITICALSFORSYMBOLS } /* combiningmarksforsymbols */, + { 3265, 1823, 1358, 7, 9, UNI_PALM } /* script=palmyrene */, + { 1, 7887, 6553, 27, 5, UNI_CJKEXTC } /* incjkunifiedideographsextensionc */, + { 5507, 4371, 0, 6, 0, UNI_XPOSIXSPACE } /* wspace */, + { 6145, 3001, 283, 12, 2, UNI_NT__NU } /* numerictype=nu */, + { 1550, 461, 1133, 2, 8, UNI_VITH } /* isvithkuqi */, + { 0, 895, 288, 5, 2, UNI_AGE__3 } /* age=v30 */, + { 2, 823, 585, 4, 5, UNI_DASH } /* dash=true */, + { 4615, 4424, 43, 17, 4, UNI_BUHD } /* scriptextensions=buhd */, + { 0, 2302, 933, 9, 3, -UNI_IDC } /* idcontinue=f */, + { 2068, 2536, 2539, 3, 10, UNI_JG__AFRICANFEH } /* jg=africanfeh */, + { 8, 461, 2526, 2, 10, UNI_POSIXBLANK } /* isposixblank */, + { 2325, 1243, 5067, 5, 11, UNI_INMANICHAEAN } /* block=manichaean */, + { 0, 8, 585, 3, 2, UNI_PCM } /* pcm=t */, + { 0, 4424, 5778, 17, 21, UNI_PRTI } /* scriptextensions=inscriptionalparthian */, + { 20, 1102, 673, 4, 5, UNI_OSGE } /* scx=osage */, + { 8, 4424, 156, 17, 4, UNI_OUGR } /* scriptextensions=ougr */, + { 0, 1823, 47, 7, 4, UNI_SC__CAKM } /* script=cakm */, + { 4112, 1667, 5373, 4, 18, UNI_TAIXUANJING } /* blk=taixuanjingsymbols */, + { 8, 7591, 18, 3, 2, UNI_LB__BA } /* lb=ba */, + { 1, 4424, 4740, 17, 4, UNI_TALE } /* scriptextensions=tale */, + { 0, 309, 4926, 2, 8, UNI_TAMILSUP } /* intamilsup */, + { 0, 7011, 345, 24, 2, UNI_CCC__18 } /* canonicalcombiningclass=18 */, + { 0, 2324, 6487, 6, 23, UNI_ZNAMENNYMUSIC } /* block=znamennymusicalnotation */, + { 14, 2247, 0, 4, 0, UNI_HUNG } /* hung */, + { 0, 527, 0, 6, 0, UNI_RJNG } /* rejang */, + { 2313, 461, 940, 2, 2, UNI_CO } /* isco */, + { 0, 309, 6797, 2, 19, UNI_DEVANAGARIEXTA } /* indevanagariextendeda */, + { 2946, 2536, 1767, 3, 2, UNI_JG__FE } /* jg=fe */, + { 0, 1102, 3349, 4, 15, UNI_MERC } /* scx=meroiticcursive */, + { 0, 2280, 2360, 10, 10, UNI_IN__NA } /* presentin=unassigned */, + { 1, 3514, 4987, 7, 9, UNI_ALCHEMICAL } /* block=alchemical */, + { 0, 461, 5185, 2, 20, UNI_HLUW } /* isanatolianhieroglyphs */, + { 1196, 946, 1847, 5, 6, UNI_SUPERANDSUB } /* superandsub */, + { 2226, 7274, 6514, 9, 10, UNI_CO } /* category=privateuse */, + { 7, 3502, 5820, 5, 18, UNI_ENCLOSEDALPHANUMSUP } /* blk=enclosedalphanumsup */, + { 3164, 2523, 248, 8, 5, UNI_XPOSIXCNTRL } /* isxposixcntrl */, + { 0, 292, 2656, 3, 9, UNI_NV__1_SLASH_2 } /* nv=5.000e-01 */, + { 4234, 3832, 1805, 14, 4, UNI_NV__50000 } /* numericvalue=50000 */, + { 0, 7011, 388, 24, 2, UNI_CCC__26 } /* canonicalcombiningclass=26 */, + { 711, 1823, 1021, 7, 6, UNI_WCHO } /* script=wancho */, + { 2144, 5958, 0, 21, 0, UNI_SINHALAARCHAICNUMBERS } /* sinhalaarchaicnumbers */, + { 2, 461, 115, 2, 2, UNI_SK } /* issk */, + { 4297, 833, 599, 4, 2, -UNI_TERM } /* term=n */, + { 20, 1409, 0, 5, 0, UNI_LATN } /* latin */, + { 0, 375, 353, 5, 2, UNI_GREXT } /* grext=y */, + { 2, 8505, 406, 3, 2, UNI_NT__DI } /* nt=di */ }; MPH_VALt @@ -7629,57 +7708,58 @@ match_uniprop( const unsigned char * con /* Generated from: * 688d673ec947f7ccf898b4eae9848139d4d33676b688dee54f449f8bf9d3bbd2 lib/Unicode/UCD.pm - * c7698811e9adb6cc98fb996a7de4be2b6532f2ac67e76055cc8afdbf6ee18af3 lib/unicore/ArabicShaping.txt - * 24a74555f918bbe99f5b3f1b83cf36fc0e205bb8a600a6a3aa539c710a3dcf27 lib/unicore/BidiBrackets.txt - * 7a5c74cedc1616a9af0a9d22e108ae592d86fe93649c144ae6ba49f193a44122 lib/unicore/BidiMirroring.txt - * 598870dddef7b34b5a972916528c456aff2765b79cd4f9647fb58ceb767e7f17 lib/unicore/Blocks.txt - * a566cd48687b2cd897e02501118b2413c14ae86d318f9abbbba97feb84189f0f lib/unicore/CaseFolding.txt - * 3360762fc3295cea54ab251c31df621d05ba4b94d46c60eaac29aa16d70ad1e0 lib/unicore/CompositionExclusions.txt - * 7e058dec02147098bc9c28d86209f0f251bba0538f3b5a705ad02ea3bb709fe0 lib/unicore/DAge.txt - * e3eddd7d469cd1b0feed7528defad1a1cc7c6a9ceb0ae4446a6d10921ed2e7bc lib/unicore/DCoreProperties.txt - * b2c444c20730b097787fdf50bd7d6dd3fc5256ab8084f5b35b11c8776eca674c lib/unicore/DNormalizationProps.txt - * f901ac011aa32a09224d6555da71e2532c59c1d3381322829de0e3b880507250 lib/unicore/EastAsianWidth.txt - * 5995522f01633073911dad1edb74d13aa832f42862c0392a79627b85d52f2391 lib/unicore/EquivalentUnifiedIdeograph.txt - * cd1c9367cba438afa965fcb5edc6ed3ec6e685fd5dd21c0cc20c026f04beb0e5 lib/unicore/HangulSyllableType.txt - * 3f3f368fccdb37f350ecedc20b37fa71ab31c04e847884c77780d34283539f73 lib/unicore/IdStatus.txt - * 45a150c23961b58d7784704af6c4daccd6517d97b6489e53d13bbdbf9e4f065f lib/unicore/IdType.txt - * d8704c8725568813a947ff2ef38bcf1f05e2a6fbea6876ba384890f187a8bf61 lib/unicore/IndicPositionalCategory.txt - * c7b969b653dc278fb66ab4136223d320e30ad19367eb791ae60dcc6d92071b16 lib/unicore/IndicSyllabicCategory.txt - * 39ff89e0a329e1ccce6d54fad8cf82e90926901928c0ca9b9a2ad5681f330dd9 lib/unicore/Jamo.txt - * 9e06e9f35c6959fb91dcc7993f90d58523c3079bc62c6b25f828b4cdebc5d70c lib/unicore/LineBreak.txt - * 14b3b677d33f95c51423dce6eef4a6a28b4b160451ecedee4b91edb6745cf4a3 lib/unicore/NameAliases.txt - * db5745688affcdc0c3927a1ee0667018a96a7b24513f866d5235e98fef6c2436 lib/unicore/NamedSequences.txt - * 6bddfdb850417a5bee6deff19290fd1b138589909afb50f5a049f343bf2c6722 lib/unicore/PropList.txt - * eb755757e20b72b330b2948df3cf2ff7adb0e31bb060140dc09dafb132ace2cd lib/unicore/PropValueAliases.txt - * 859d7225f2d2a460b3ccb1d61a7945f8cc219acdf5aa53b66b7a1e4bf6ebfc87 lib/unicore/PropertyAliases.txt - * d37eedf63ff9c48bac863d5f76862373d6cf5269fd21253d499e2430d638c01d lib/unicore/ScriptExtensions.txt - * 52db475c4ec445e73b0b16915448c357614946ad7062843c563e00d7535c6510 lib/unicore/Scripts.txt - * c667b45908fd269af25fd55d2fc5bbc157fb1b77675936e25c513ce32e080334 lib/unicore/SpecialCasing.txt - * 36018e68657fdcb3485f636630ffe8c8532e01c977703d2803f5b89d6c5feafb lib/unicore/UnicodeData.txt - * 869ff43dd012f924d03c89fc268c88f0e7eea72f0228b91ca30455afdb84f8fd lib/unicore/VerticalOrientation.txt - * ddc7d4d1f3838573b94fc5d83ff7217e63c47b22ae1cd40c5fe1a54efc15589b lib/unicore/auxiliary/GCBTest.txt - * 97e79f1f8d9cd76d120f2420381a01abc00a7c78a2aa583fa3f9627264a99742 lib/unicore/auxiliary/GraphemeBreakProperty.txt - * 488dbb6a7e1d0070d4aa7c175352c818ff6425172850d1b40c6177726658cb05 lib/unicore/auxiliary/LBTest.txt - * 7e42dd749dbb94aa44b13faf9df6319d9a16ce2ea09a3a094fcfbb5962168040 lib/unicore/auxiliary/SBTest.txt - * 7092ca4117cec891c25c7724132efc519e1dece01ae9fd6068035a9db04d526e lib/unicore/auxiliary/SentenceBreakProperty.txt - * 8094b544ec1580c7e41ac0187805cc1aeb330a90301ec7505563e1a59318284e lib/unicore/auxiliary/WBTest.txt - * 7716752aad296d4ab23ff4ed0a2746fc5328750ff84e9e7d6f3828ee9eaef742 lib/unicore/auxiliary/WordBreakProperty.txt - * b597836124298b8f7fa076273802840cfc3271a25f5c397a082e120954b82c3c lib/unicore/emoji/emoji.txt - * e5fe51acc74e3e83b4fb4c7b25f3c34491d6eb8095c9955d0712dafbca7b3c2b lib/unicore/extracted/DBidiClass.txt - * cd0a14176d93bf440b77a582a0d678190fc0688b15442d4cfb250bf2e27956af lib/unicore/extracted/DBinaryProperties.txt - * 12b0c3af9b600b49488d66545a3e7844ea980809627201bf9afeebe1c9f16f4e lib/unicore/extracted/DCombiningClass.txt - * f76064b298cfbd715ba542e7894f7a507d32da2f011070d1d01df95cad9817d6 lib/unicore/extracted/DDecompositionType.txt - * f9bef074cc916db57fece99d54a4505f8e7c7b17481619e3f0005211f7717d4b lib/unicore/extracted/DEastAsianWidth.txt - * cde679c8461976ed40d7edf61ae98cbb947540831f06f5bc7da7decbf91a1420 lib/unicore/extracted/DGeneralCategory.txt - * 9bb891831328713603a486a4a03df7f7987c3e1e8144a6d1ac71fd061ef3f732 lib/unicore/extracted/DJoinGroup.txt - * e97c65bbea0a69d2fae6ec4182b09e519e13232e20bd804b3004edc0f36bb0d4 lib/unicore/extracted/DJoinType.txt - * 43f6df50e4878f501b417e366b0ee097ae5ccb2d4ce942026bed3d62d78e7887 lib/unicore/extracted/DLineBreak.txt - * a04502ebb36a45d83cbe48a7d8132ea8143edb7b3d34d0aa6afe4a9685049741 lib/unicore/extracted/DNumType.txt - * 11075771b112e8e7ccf6ffa637c4c91eadc3ef3db0517b24e605df8fd3624239 lib/unicore/extracted/DNumValues.txt - * 1e514199c3fa46f5df6148d272db7bddbfd5e89c9710e39773ef9d734f344a2f lib/unicore/mktables - * c72bbdeda99714db1c8024d3311da4aef3c0db3b9b9f11455a7cfe10d5e9aba3 lib/unicore/version + * eb840f36e0a7446293578c684a54c6d83d249abde7bdd4dfa89794af1d7fe9e9 lib/unicore/ArabicShaping.txt + * 333ae1e99db0504ca8a046a07dc45b5e7aa91869c685e6bf955ebe674804827a lib/unicore/BidiBrackets.txt + * b4b9e1d87d8ea273613880de9d2b2f0b0b696244b42152bfa0a3106e7d983a20 lib/unicore/BidiMirroring.txt + * 529dc5d0f6386d52f2f56e004bbfab48ce2d587eea9d38ba546c4052491bd820 lib/unicore/Blocks.txt + * cdd49e55eae3bbf1f0a3f6580c974a0263cb86a6a08daa10fbf705b4808a56f7 lib/unicore/CaseFolding.txt + * 3b019c0a33c3140cbc920c078f4f9af2680ba4f71869c8d4de5190667c70b6a3 lib/unicore/CompositionExclusions.txt + * 7570877e0fa197c45338f7c41a02636da4e14c8dba6a3611a01cd30bf329d5ca lib/unicore/DAge.txt + * d367290bc0867e6b484c68370530bdd1a08b6b32404601b8c7accaf83e05628d lib/unicore/DCoreProperties.txt + * d5687a48c95c7d6e1ec59cb29c0f2e8b052018eb069a4371b7368d0561e12a29 lib/unicore/DNormalizationProps.txt + * 743e7bc435c04ab1a8459710b1c3cad56eedced5b806b4659b6e69b85d0adf2a lib/unicore/EastAsianWidth.txt + * f2e04bae8c856fad3a16353a99d4cc2de6c72770260379f5e4974a97548aad2a lib/unicore/EquivalentUnifiedIdeograph.txt + * 9a3ab36d36a22bdb84de7a17b17e9b9c242134f0080f0a8b4b28d209465a8fc8 lib/unicore/HangulSyllableType.txt + * 790bc9595795c0e0a3860a21a7f97157a134b61a4fc4ab03c7d315d07c9a6eb7 lib/unicore/IdStatus.txt + * 71d3ed8f15cd5d8cd00cdebe62015ff26356462774b261b4a2b83d3bf46b1639 lib/unicore/IdType.txt + * 0ce56c1294da405c0a0a0071582ac839fd229bbf97bdd260462ee571309d4ec4 lib/unicore/IndicPositionalCategory.txt + * ffae561a51b47ddbbe267fdd8505ac3776b85b2932268809127acee84200b573 lib/unicore/IndicSyllabicCategory.txt + * 14733bcb6731ae0c07485bf59a41cb3db08785a50bd2b46b836b4341eab7ee46 lib/unicore/Jamo.txt + * 012bca868e2c4e59a5a10a7546baf0c6fb1b2ef458c277f054915c8a49d292bf lib/unicore/LineBreak.txt + * 3e39509e8fae3e5d50ba73759d0b97194501d14a9c63107a6372a46b38be18e8 lib/unicore/NameAliases.txt + * 1d5202155f14841973aa540b1625f4befbde185ac77ce5aceaaaa0501a68bd66 lib/unicore/NamedSequences.txt + * fb9ac8cc154a80cad6caac9897af55a4e75176af6f4e2bb6edc2bf8b1d57f326 lib/unicore/NormTest.txt + * e05c0a2811d113dae4abd832884199a3ea8d187ee1b872d8240a788a96540bfd lib/unicore/PropList.txt + * 13a7666843abea5c6b7eb8c057c57ab9bb2ba96cfc936e204224dd67d71cafad lib/unicore/PropValueAliases.txt + * e4935149af407fa455901832b710bccb63d2453e46d09190e234d019bcfbba45 lib/unicore/PropertyAliases.txt + * 7e07313d9d0bee42220c476b64485995130ae30917bbcf7780b602d677d7e33f lib/unicore/ScriptExtensions.txt + * cca85d830f46aece2e7c1459ef1249993dca8f2e46d51e869255be140d7ea4b0 lib/unicore/Scripts.txt + * 78b29c64b5840d25c11a9f31b665ee551b8a499eca6c70d770fcad7dd710f494 lib/unicore/SpecialCasing.txt + * 806e9aed65037197f1ec85e12be6e8cd870fc5608b4de0fffd990f689f376a73 lib/unicore/UnicodeData.txt + * ca6d332f485a6f5f452b29b4a74146af0f2c17b7577aa4c821d597210f70611a lib/unicore/VerticalOrientation.txt + * 0d2080d0def294a4b7660801cc03ddfe5866ff300c789c2cc1b50fd7802b2d97 lib/unicore/auxiliary/GCBTest.txt + * 5a0f8748575432f8ff95e1dd5bfaa27bda1a844809e17d6939ee912bba6568a1 lib/unicore/auxiliary/GraphemeBreakProperty.txt + * 371bde4052aa593b108684ae292d8ea2dbb93c19990e0cdf416fa7239557aac3 lib/unicore/auxiliary/LBTest.txt + * f62279d8fd10935ba0cf0d8417a1dcbe7ab0d4e62f59c17e02cbe40f580c4162 lib/unicore/auxiliary/SBTest.txt + * 61e4ba975b0a5bc1a76ee931b94914395d7289ef624e3c0d4d6b9460ee387bea lib/unicore/auxiliary/SentenceBreakProperty.txt + * 2a676130c71194245e7c74a837e58330f202600d8ddcf4518129dd476f26e18e lib/unicore/auxiliary/WBTest.txt + * 5188a56e91593467c2e912601ebc78750e6adc9b04541b8c5becb5441e388ce2 lib/unicore/auxiliary/WordBreakProperty.txt + * 29071dba22c72c27783a73016afb8ffaeb025866740791f9c2d0b55cc45a3470 lib/unicore/emoji/emoji.txt + * 4841f2090c2dbc592d3ce43bb74c2191b3da50fb9a0d00274f1448c202851b02 lib/unicore/extracted/DBidiClass.txt + * f10a35451429137f7348825f22d624b6390c526ead3d8e756d2af9e5ed5b2b67 lib/unicore/extracted/DBinaryProperties.txt + * ca54f6360cd288ad92113415bf1f77749015abe11cbd6798d21f7fa81f04205d lib/unicore/extracted/DCombiningClass.txt + * db059ce45e3cec49bfda56e262fa658b3a5561b1648de266c818d2a08a85b78a lib/unicore/extracted/DDecompositionType.txt + * d62e6950f086e53f47c593a38342621f8838f48c49a1de070cf83d3959bd1688 lib/unicore/extracted/DEastAsianWidth.txt + * fe29a45c0882500e591140aaa5c4f5067e6a5d746806148af34400c48b9c06f9 lib/unicore/extracted/DGeneralCategory.txt + * e13ca1344b16023aa38c6ada39f9658536fc6bb7c3c24d579f0bc316a4f4f1e0 lib/unicore/extracted/DJoinGroup.txt + * c4870b11e2b8b7d0eb70b99ce85608e5c28a399efa316cca97238a58ae160e5e lib/unicore/extracted/DJoinType.txt + * 3f4f32ed2a577344a508114527e721d7a8b633d32f38945d47fe0c743650c585 lib/unicore/extracted/DLineBreak.txt + * 710abf2d581ac9c57f244c0834f9d9969d9781e0396adccd330eaae658ac7d6b lib/unicore/extracted/DNumType.txt + * 6bd30f385f3baf3ab5d5308c111a81de87bea5f494ba0ba69e8ab45263b8c34d lib/unicore/extracted/DNumValues.txt + * f7265069b38ba9a0675a18600e241b1ec6fc8c55fd806fe4c13bc5d8cb0dc508 lib/unicore/mktables + * 55d90fdc3f902e5c0b16b3378f9eaa36e970a1c09723c33de7d47d0370044012 lib/unicore/version * 0a6b5ab33bb1026531f816efe81aea1a8ffcd34a27cbea37dd6a70a63d73c844 regen/charset_translations.pl - * 5f8520d3a17ade6317fc0c423f5091470924b1ef425bca0c41ce8e4a9f8460fe regen/mk_PL_charclass.pl - * 1c73795f9150bd556573e7ae982789377289e22b6a7f3db0a05c36852e8d749f regen/mk_invlists.pl + * c7ff8e0d207d3538c7feb4a1a152b159e5e902d20293b303569ea8323e84633e regen/mk_PL_charclass.pl + * cdbafee25193032242e77f2a6332b731d8392ce342fa616dbabc2c14c7b44eb6 regen/mk_invlists.pl * d6987e01ad538d1567394851cf199f99815f7701bebd6092be4bc7a6d8f147c6 regen/mph.pl - * ex: set ro: */ + * ex: set ro ft=c: */ Index: gnu/usr.bin/perl/unicode_constants.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/unicode_constants.h,v diff -u -p -a -u -p -r1.6 unicode_constants.h --- gnu/usr.bin/perl/unicode_constants.h 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/unicode_constants.h 21 Feb 2024 15:47:03 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- * !!!!!!! DO NOT EDIT THIS FILE !!!!!!! * This file is built by regen/unicode_constants.pl from Unicode data. * Any changes made here will be lost! @@ -45,7 +45,7 @@ bytes. =cut */ -#define UNICODE_MAJOR_VERSION 14 +#define UNICODE_MAJOR_VERSION 15 #define UNICODE_DOT_VERSION 0 #define UNICODE_DOT_DOT_VERSION 0 @@ -103,7 +103,7 @@ bytes. # define DEPRECATED_OPENING_NON_UTF8_BRACKETS "\xAB\xBB" # endif -# ifdef PERL_IN_REGCOMP_C +# ifdef PERL_IN_REGCOMP_ANY # define MAX_PRINT_A 0x7E /* The max code point that isPRINT_A */ # endif #endif /* ASCII/Latin1 */ @@ -164,7 +164,7 @@ bytes. # define DEPRECATED_OPENING_NON_UTF8_BRACKETS "\x8A\x8B" # endif -# ifdef PERL_IN_REGCOMP_C +# ifdef PERL_IN_REGCOMP_ANY # define MAX_PRINT_A 0xF9 /* The max code point that isPRINT_A */ # endif #endif /* EBCDIC 1047 */ @@ -225,14 +225,14 @@ bytes. # define DEPRECATED_OPENING_NON_UTF8_BRACKETS "\x8A\x8B" # endif -# ifdef PERL_IN_REGCOMP_C +# ifdef PERL_IN_REGCOMP_ANY # define MAX_PRINT_A 0xF9 /* The max code point that isPRINT_A */ # endif #endif /* EBCDIC 037 */ /* The number of code points not matching \pC */ -#ifdef PERL_IN_REGCOMP_C -# define NON_OTHER_COUNT 144534 +#ifdef PERL_IN_REGCOMP_ANY +# define NON_OTHER_COUNT 149016 #endif /* The highest code point that has any type of case change */ @@ -242,4 +242,4 @@ bytes. #endif /* PERL_UNICODE_CONSTANTS_H_ */ -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/universal.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/universal.c,v diff -u -p -a -u -p -r1.22 universal.c --- gnu/usr.bin/perl/universal.c 15 Feb 2023 01:36:13 -0000 1.22 +++ gnu/usr.bin/perl/universal.c 21 Feb 2024 15:47:03 -0000 @@ -189,6 +189,27 @@ Perl_sv_derived_from_pvn(pTHX_ SV *sv, c } /* +=for apidoc sv_derived_from_hv + +Exactly like L, but takes the name string as the +C of the given HV (which would presumably represent a stash). + +=cut +*/ + +bool +Perl_sv_derived_from_hv(pTHX_ SV *sv, HV *hv) +{ + PERL_ARGS_ASSERT_SV_DERIVED_FROM_HV; + + const char *hvname = HvNAME(hv); + if(!hvname) + return FALSE; + + return sv_derived_from_svpvn(sv, NULL, hvname, HvNAMELEN(hv), HvNAMEUTF8(hv) ? SVf_UTF8 : 0); +} + +/* =for apidoc sv_isa_sv Returns a boolean indicating whether the SV is an object reference and is @@ -572,11 +593,21 @@ XS(XS_utf8_upgrade) croak_xs_usage(cv, "sv"); else { SV * const sv = ST(0); - STRLEN RETVAL; + STRLEN RETVAL = 0; dXSTARG; - RETVAL = sv_utf8_upgrade(sv); - XSprePUSH; PUSHi((IV)RETVAL); + XSprePUSH; + if (UNLIKELY(! sv)) { + XSRETURN_UNDEF; + } + + SvGETMAGIC(sv); + if (UNLIKELY(! SvOK(sv))) { + XSRETURN_UNDEF; + } + + RETVAL = sv_utf8_upgrade_nomg(sv); + PUSHi( (IV) RETVAL); } XSRETURN(1); } @@ -732,7 +763,7 @@ XS(XS_PerlIO_get_layers) { SV * sv; GV * gv; - IO * io; + IO * io = NULL; bool input = TRUE; bool details = FALSE; @@ -775,12 +806,16 @@ XS(XS_PerlIO_get_layers) } sv = POPs; - gv = MAYBE_DEREF_GV(sv); - if (!gv && !SvROK(sv)) - gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO); + /* MAYBE_DEREF_GV will call get magic */ + if ((gv = MAYBE_DEREF_GV(sv))) + io = GvIO(gv); + else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) + io = (IO*)SvRV(sv); + else if (!SvROK(sv) && (gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO))) + io = GvIO(gv); - if (gv && (io = GvIO(gv))) { + if (io) { AV* const av = PerlIO_get_layers(aTHX_ input ? IoIFP(io) : IoOFP(io)); SSize_t i; Index: gnu/usr.bin/perl/unixish.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/unixish.h,v diff -u -p -a -u -p -r1.17 unixish.h --- gnu/usr.bin/perl/unixish.h 15 Feb 2023 01:36:13 -0000 1.17 +++ gnu/usr.bin/perl/unixish.h 21 Feb 2024 15:47:03 -0000 @@ -21,7 +21,7 @@ * This symbol, if defined, indicates that the ioctl() routine is * available to set I/O characteristics */ -#define HAS_IOCTL /**/ +#define HAS_IOCTL /**/ /* HAS_UTIME: * This symbol, if defined, indicates that the routine utime() is @@ -136,28 +136,34 @@ int afstat(int fd, struct stat *statb); #define Mkdir(path,mode) mkdir((path),(mode)) #if defined(__amigaos4__) -# define PERL_SYS_INIT_BODY(c,v) \ - MALLOC_CHECK_TAINT2(*c,*v) PERL_FPU_INIT; PERLIO_INIT; MALLOC_INIT; amigaos4_init_fork_array(); amigaos4_init_environ_sema(); -# define PERL_SYS_TERM_BODY() \ - HINTS_REFCNT_TERM; KEYWORD_PLUGIN_MUTEX_TERM; \ - OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM; PERLIO_TERM; \ - MALLOC_TERM; LOCALE_TERM; USER_PROP_MUTEX_TERM; \ - ENV_TERM; \ - amigaos4_dispose_fork_array(); +# define PLATFORM_SYS_TERM_ amigaos4_dispose_fork_array() +# define PLATFORM_SYS_INIT_ STMT_START { \ + amigaos4_init_fork_array(); \ + amigaos4_init_environ_sema(); \ + } STMT_END +#else +# define PLATFORM_SYS_TERM_ NOOP +# define PLATFORM_SYS_INIT_ NOOP #endif #ifndef PERL_SYS_INIT_BODY -# define PERL_SYS_INIT_BODY(c,v) \ - MALLOC_CHECK_TAINT2(*c,*v) PERL_FPU_INIT; PERLIO_INIT; MALLOC_INIT +#define PERL_SYS_INIT_BODY(c,v) \ + MALLOC_CHECK_TAINT2(*c,*v) PERL_FPU_INIT; PERLIO_INIT; \ + MALLOC_INIT; PLATFORM_SYS_INIT_; #endif +/* Generally add things last-in first-terminated. IO and memory terminations + * need to be generally last + * + * BEWARE that using PerlIO in these will be using freed memory, so may appear + * to work, but must NOT be retained in production code. */ #ifndef PERL_SYS_TERM_BODY -# define PERL_SYS_TERM_BODY() \ - HINTS_REFCNT_TERM; KEYWORD_PLUGIN_MUTEX_TERM; \ - OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM; PERLIO_TERM; \ - MALLOC_TERM; LOCALE_TERM; USER_PROP_MUTEX_TERM; \ - ENV_TERM; - +# define PERL_SYS_TERM_BODY() \ + ENV_TERM; USER_PROP_MUTEX_TERM; LOCALE_TERM; \ + HINTS_REFCNT_TERM; KEYWORD_PLUGIN_MUTEX_TERM; \ + OP_CHECK_MUTEX_TERM; OP_REFCNT_TERM; \ + PERLIO_TERM; MALLOC_TERM; \ + PLATFORM_SYS_TERM_; #endif #define BIT_BUCKET "/dev/null" Index: gnu/usr.bin/perl/utf8.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/utf8.c,v diff -u -p -a -u -p -r1.6 utf8.c --- gnu/usr.bin/perl/utf8.c 15 Feb 2023 01:36:13 -0000 1.6 +++ gnu/usr.bin/perl/utf8.c 21 Feb 2024 15:47:03 -0000 @@ -37,11 +37,6 @@ static const char malformed_text[] = "Ma static const char unees[] = "Malformed UTF-8 character (unexpected end of string)"; -/* strlen() of a literal string constant. We might want this more general, - * but using it in just this file for now. A problem with more generality is - * the compiler warnings about comparing unlike signs */ -#define STRLENs(s) (sizeof("" s "") - 1) - /* These are various utility functions for manipulating UTF8-encoded strings. For the uninitiated, this is a method of representing arbitrary @@ -50,17 +45,6 @@ characters in the ASCII range are unmodi within non-zero characters. */ -/* helper for Perl__force_out_malformed_utf8_message(). Like - * SAVECOMPILEWARNINGS(), but works with PL_curcop rather than - * PL_compiling */ - -static void -S_restore_cop_warnings(pTHX_ void *p) -{ - free_and_set_cop_warnings(PL_curcop, (STRLEN*) p); -} - - void Perl__force_out_malformed_utf8_message(pTHX_ const U8 *const p, /* First byte in UTF-8 sequence */ @@ -92,10 +76,7 @@ Perl__force_out_malformed_utf8_message(p PL_dowarn = G_WARN_ALL_ON|G_WARN_ON; if (PL_curcop) { - /* this is like SAVECOMPILEWARNINGS() except with PL_curcop rather - * than PL_compiling */ - SAVEDESTRUCTOR_X(S_restore_cop_warnings, - (void*)PL_curcop->cop_warnings); + SAVECURCOPWARNINGS(); PL_curcop->cop_warnings = pWARN_ALL; } @@ -700,7 +681,7 @@ S_does_utf8_overflow(const U8 * const s, return 1; } - /* Here, it could be the overlong malformation, and might not actuallly + /* Here, it could be the overlong malformation, and might not actually * overflow if you were to calculate it out. * * See if it actually is overlong */ @@ -1530,7 +1511,7 @@ Perl__utf8n_to_uvchr_msgs_helper(const U /* A well-formed UTF-8 character, as the vast majority of calls to this * function will be for, has this expected length. For efficiency, set - * things up here to return it. It will be overriden only in those rare + * things up here to return it. It will be overridden only in those rare * cases where a malformation is found */ if (retlen) { *retlen = expectlen; @@ -1729,10 +1710,10 @@ Perl__utf8n_to_uvchr_msgs_helper(const U * uv contains the code point the input sequence * represents; or if there is a problem that prevents * a well-defined value from being computed, it is - * some subsitute value, typically the REPLACEMENT + * some substitute value, typically the REPLACEMENT * CHARACTER. * s0 points to the first byte of the character - * s points to just after were we left off processing + * s points to just after where we left off processing * the character * send points to just after where that character should * end, based on how many bytes the start byte tells @@ -2122,7 +2103,7 @@ Perl__utf8n_to_uvchr_msgs_helper(const U /* Since there was a possible problem, the returned length may need to * be changed from the one stored at the beginning of this function. - * Instead of trying to figure out if that's needed, just do it. */ + * Instead of trying to figure out if it has changed, just do it. */ if (retlen) { *retlen = curlen; } @@ -2169,43 +2150,6 @@ Perl_utf8_to_uvchr_buf(pTHX_ const U8 *s return utf8_to_uvchr_buf_helper(s, send, retlen); } -/* This is marked as deprecated - * -=for apidoc utf8_to_uvuni_buf - -Only in very rare circumstances should code need to be dealing in Unicode -(as opposed to native) code points. In those few cases, use -C> instead. -If you are not absolutely sure this is one of those cases, then assume it isn't -and use plain C instead. - -Returns the Unicode (not-native) code point of the first character in the -string C which -is assumed to be in UTF-8 encoding; C points to 1 beyond the end of C. -C will be set to the length, in bytes, of that character. - -If C does not point to a well-formed UTF-8 character and UTF8 warnings are -enabled, zero is returned and C<*retlen> is set (if C isn't -NULL) to -1. If those warnings are off, the computed value if well-defined (or -the Unicode REPLACEMENT CHARACTER, if not) is silently returned, and C<*retlen> -is set (if C isn't NULL) so that (S + C<*retlen>>) is the -next possible position in C that could begin a non-malformed character. -See L for details on when the REPLACEMENT CHARACTER is -returned. - -=cut -*/ - -UV -Perl_utf8_to_uvuni_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen) -{ - PERL_ARGS_ASSERT_UTF8_TO_UVUNI_BUF; - - assert(send > s); - - return NATIVE_TO_UNI(utf8_to_uvchr_buf(s, send, retlen)); -} - /* =for apidoc utf8_length @@ -2217,44 +2161,154 @@ If C s> or if the scan would end and returns the number of valid characters. =cut + + For long strings we process the input word-at-a-time, and count + continuations, instead of otherwise counting characters and using UTF8SKIP + to find the next one. If our input were 13-byte characters, the per-word + would be a loser, as we would be doing things in 8 byte chunks (or 4 on a + 32-bit platform). But the maximum legal Unicode code point is 4 bytes, and + most text will have a significant number of 1 and 2 byte characters, so the + per-word is generally a winner. + + There are start-up and finish costs with the per-word method, so we use the + standard method unless the input has a relatively large length. */ STRLEN -Perl_utf8_length(pTHX_ const U8 *s, const U8 *e) +Perl_utf8_length(pTHX_ const U8 * const s0, const U8 * const e) { + STRLEN continuations = 0; STRLEN len = 0; + const U8 * s = s0; PERL_ARGS_ASSERT_UTF8_LENGTH; - /* Note: cannot use UTF8_IS_...() too eagerly here since e.g. - * the bitops (especially ~) can create illegal UTF-8. - * In other words: in Perl UTF-8 is not just for Unicode. */ + /* For EBCDCIC and short strings, we count the characters. The boundary + * was determined by eyeballing the output of Porting/bench.pl and + * choosing a number where the continuations method gave better results (on + * a 64 bit system, khw not having access to a 32 bit system with + * cachegrind). The number isn't critical, as at these sizes, the total + * time spent isn't large either way */ - while (s < e) { - Ptrdiff_t expected_byte_count = UTF8SKIP(s); +#ifndef EBCDIC + + if (e - s0 < 96) + +#endif + + { + while (s < e) { /* Count characters directly */ - if (UNLIKELY(e - s < expected_byte_count)) { - goto warn_and_return; + /* Take extra care to not exceed 'e' (which would be undefined + * behavior) should the input be malformed, with a partial + * character at the end */ + Ptrdiff_t expected_byte_count = UTF8SKIP(s); + if (UNLIKELY(e - s < expected_byte_count)) { + goto warn_and_return; + } + + len++; + s += expected_byte_count; + } + + if (LIKELY(e == s)) { + return len; } - len++; - s += expected_byte_count; + warn_and_return: + if (ckWARN_d(WARN_UTF8)) { + if (PL_op) + Perl_warner(aTHX_ packWARN(WARN_UTF8), + "%s in %s", unees, OP_DESC(PL_op)); + else + Perl_warner(aTHX_ packWARN(WARN_UTF8), "%s", unees); + } + + return s - s0; } - if (LIKELY(e == s)) { - return len; +#ifndef EBCDIC + + /* Count continuations, word-at-a-time. + * + * We need to stop before the final start character in order to + * preserve the limited error checking that's always been done */ + const U8 * e_limit = e - UTF8_MAXBYTES; + + /* Points to the first byte >=s which is positioned at a word boundary. If + * s is on a word boundary, it is s, otherwise it is to the next word. */ + const U8 * partial_word_end = s + PERL_WORDSIZE * PERL_IS_SUBWORD_ADDR(s) + - (PTR2nat(s) & PERL_WORD_BOUNDARY_MASK); + + /* Process up to a full word boundary. */ + while (s < partial_word_end) { + const Size_t skip = UTF8SKIP(s); + + continuations += skip - 1; + s += skip; + } + + /* Adjust back down any overshoot */ + continuations -= s - partial_word_end; + s = partial_word_end; + + do { /* Process per-word */ + + /* The idea for counting continuation bytes came from + * http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html + * One thing it does that this doesn't is to prefetch the buffer + * __builtin_prefetch(&s[256], 0, 0); + * + * A continuation byte has the upper 2 bits be '10', and the rest + * dont-cares. The VARIANTS mask zeroes out all but the upper bit of + * each byte in the word. That gets shifted to the byte's lowest bit, + * and 'anded' with the complement of the 2nd highest bit of the byte, + * which has also been shifted to that position. Hence the bit in that + * position will be 1 iff the upper bit is 1 and the next one is 0. We + * then use the same integer multiplcation and shifting that are used + * in variant_under_utf8_count() to count how many of those are set in + * the word. */ + + continuations += (((((* (const PERL_UINTMAX_T *) s) + & PERL_VARIANTS_WORD_MASK) >> 7) + & (((~ (* (const PERL_UINTMAX_T *) s))) >> 6)) + * PERL_COUNT_MULTIPLIER) + >> ((PERL_WORDSIZE - 1) * CHARBITS); + s += PERL_WORDSIZE; + } while (s + PERL_WORDSIZE <= e_limit); + + /* Process remainder per-byte */ + while (s < e) { + if (UTF8_IS_CONTINUATION(*s)) { + continuations++; + s++; + continue; + } + + /* Here is a starter byte. Use UTF8SKIP from now on */ + do { + Ptrdiff_t expected_byte_count = UTF8SKIP(s); + if (UNLIKELY(e - s < expected_byte_count)) { + break; + } + + continuations += expected_byte_count- 1; + s += expected_byte_count; + } while (s < e); + + break; } - /* Here, s > e on entry */ +# endif + + if (LIKELY(e == s)) { + return s - s0 - continuations; + } - warn_and_return: - if (PL_op) - Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), - "%s in %s", unees, OP_DESC(PL_op)); - else - Perl_ck_warner_d(aTHX_ packWARN(WARN_UTF8), "%s", unees); + /* Convert to characters */ + s -= continuations; - return len; + goto warn_and_return; } /* @@ -2353,41 +2407,207 @@ Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN * return s; } - { - U8 * const save = s; - U8 * const send = s + *lenp; - U8 * d; - - /* Nothing before the first variant needs to be changed, so start the real - * work there */ - s = first_variant; - while (s < send) { + /* Nothing before 'first_variant' needs to be changed, so start the real + * work there */ + + U8 * const save = s; + U8 * const send = s + *lenp; + U8 * d; + +#ifndef EBCDIC /* The below relies on the bit patterns of UTF-8 */ + + /* There is some start-up/tear-down overhead with this, so no real gain + * unless the string is long enough. The current value is just a + * guess. */ + if (*lenp > 5 * PERL_WORDSIZE) { + + /* First, go through the string a word at-a-time to verify that it is + * downgradable. If it contains any start byte besides C2 and C3, then + * it isn't. */ + + const PERL_UINTMAX_T C0_mask = PERL_COUNT_MULTIPLIER * 0xC0; + const PERL_UINTMAX_T C2_mask = PERL_COUNT_MULTIPLIER * 0xC2; + const PERL_UINTMAX_T FE_mask = PERL_COUNT_MULTIPLIER * 0xFE; + + /* Points to the first byte >=s which is positioned at a word boundary. + * If s is on a word boundary, it is s, otherwise it is the first byte + * of the next word. */ + U8 * partial_word_end = s + PERL_WORDSIZE * PERL_IS_SUBWORD_ADDR(s) + - (PTR2nat(s) & PERL_WORD_BOUNDARY_MASK); + + /* Here there is at least a full word beyond the first word boundary. + * Process up to that boundary. */ + while (s < partial_word_end) { if (! UTF8_IS_INVARIANT(*s)) { if (! UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, send)) { *lenp = ((STRLEN) -1); - return 0; + return NULL; } s++; } s++; } - /* Is downgradable, so do it */ - d = s = first_variant; - while (s < send) { - U8 c = *s++; - if (! UVCHR_IS_INVARIANT(c)) { - /* Then it is two-byte encoded */ - c = EIGHT_BIT_UTF8_TO_NATIVE(c, *s); - s++; + /* Adjust back down any overshoot */ + s = partial_word_end; + + /* Process per-word */ + do { + + PERL_UINTMAX_T C2_C3_start_bytes; + + /* First find the bytes that are start bytes. ANDing with + * C0C0...C0 causes any start byte to become C0; any other byte + * becomes something else. Then XORing with C0 causes any start + * byte to become 0; all other bytes non-zero. */ + PERL_UINTMAX_T start_bytes + = ((* (PERL_UINTMAX_T *) s) & C0_mask) ^ C0_mask; + + /* These shifts causes the most significant bit to be set to 1 for + * any bytes in the word that aren't completely 0. Hence after + * these, only the start bytes have 0 in their msb */ + start_bytes |= start_bytes << 1; + start_bytes |= start_bytes << 2; + start_bytes |= start_bytes << 4; + + /* When we complement, then AND with 8080...80, the start bytes + * will have 1 in their msb, and all other bits are 0 */ + start_bytes = ~ start_bytes & PERL_VARIANTS_WORD_MASK; + + /* Now repeat the procedure, but look for bytes that match only + * C2-C3. */ + C2_C3_start_bytes = ((* (PERL_UINTMAX_T *) s) & FE_mask) + ^ C2_mask; + C2_C3_start_bytes |= C2_C3_start_bytes << 1; + C2_C3_start_bytes |= C2_C3_start_bytes << 2; + C2_C3_start_bytes |= C2_C3_start_bytes << 4; + C2_C3_start_bytes = ~ C2_C3_start_bytes + & PERL_VARIANTS_WORD_MASK; + + /* Here, start_bytes has a 1 in the msb of each byte that has a + * start_byte; And + * C2_C3_start_bytes has a 1 in the msb of each byte that has a + * start_byte of C2 or C3 + * If they're not equal, there are start bytes that aren't C2 + * nor C3, hence this is not downgradable */ + if (start_bytes != C2_C3_start_bytes) { + *lenp = ((STRLEN) -1); + return NULL; } - *d++ = c; + + s += PERL_WORDSIZE; + } while (s + PERL_WORDSIZE <= send); + + /* If the final byte was a start byte, it means that the character + * straddles two words, so back off one to start looking below at the + * first byte of the character */ + if (s > first_variant && UTF8_IS_START(*(s-1))) { + s--; } - *d = '\0'; - *lenp = d - save; + } - return save; +#endif + + /* Do the straggler bytes beyond the final word boundary (or all bytes + * in the case of EBCDIC) */ + while (s < send) { + if (! UTF8_IS_INVARIANT(*s)) { + if (! UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(s, send)) { + *lenp = ((STRLEN) -1); + return NULL; + } + s++; + } + s++; + } + + /* Here, we passed the tests above. For the EBCDIC case, everything + * was well-formed and can be downgraded to non-UTF8. For non-EBCDIC, + * it means only that all start bytes were C2 or C3, hence any + * well-formed sequences are downgradable. But we didn't test, for + * example, that there weren't two C2's in a row. That means that in + * the loop below, we have to be sure things are well-formed. Because + * this is very very likely, and we don't care about having speedy + * handling of malformed input, the loop proceeds as if well formed, + * and should a malformed one come along, it undoes what it already has + * done */ + + d = s = first_variant; + + while (s < send) { + U8 * s1; + + if (UVCHR_IS_INVARIANT(*s)) { + *d++ = *s++; + continue; + } + + /* Here it is two-byte encoded. */ + if ( LIKELY(UTF8_IS_DOWNGRADEABLE_START(*s)) + && LIKELY(UTF8_IS_CONTINUATION((s[1])))) + { + U8 first_byte = *s++; + *d++ = EIGHT_BIT_UTF8_TO_NATIVE(first_byte, *s); + s++; + continue; + } + + /* Here, it is malformed. This shouldn't happen on EBCDIC, and on + * ASCII platforms, we know that the only start bytes in the text + * are C2 and C3, and the code above has made sure that it doesn't + * end with a start byte. That means the only malformations that + * are possible are a start byte without a continuation (either + * followed by another start byte or an invariant) or an unexpected + * continuation. + * + * We have to undo all we've done before, back down to the first + * UTF-8 variant. Note that each 2-byte variant we've done so far + * (converted to single byte) slides things to the left one byte, + * and so we have bytes that haven't been written over. + * + * Here, 'd' points to the next position to overwrite, and 's' + * points to the first invalid byte. That means 'd's contents + * haven't been changed yet, nor has anything else beyond it in the + * string. In restoring to the original contents, we don't need to + * do anything past (d-1). + * + * In particular, the bytes from 'd' to 's' have not been changed. + * This loop uses a new variable 's1' (to avoid confusing 'source' + * and 'destination') set to 'd', and moves 's' and 's1' in lock + * step back so that afterwards, 's1' points to the first changed + * byte that will be the source for the first byte (or bytes) at + * 's' that need to be changed back. Note that s1 can expand to + * two bytes */ + s1 = d; + while (s >= d) { + s--; + if (! UVCHR_IS_INVARIANT(*s1)) { + s--; + } + s1--; + } + + /* Do the changing back */ + while (s1 >= first_variant) { + if (UVCHR_IS_INVARIANT(*s1)) { + *s-- = *s1--; + } + else { + *s-- = UTF8_EIGHT_BIT_LO(*s1); + *s-- = UTF8_EIGHT_BIT_HI(*s1); + s1--; + } + } + + *lenp = ((STRLEN) -1); + return NULL; } + + /* Success! */ + *d = '\0'; + *lenp = d - save; + + return save; } /* @@ -3042,8 +3262,8 @@ Perl__to_uni_fold_flags(pTHX_ UV c, U8* if (flags & FOLD_FLAGS_LOCALE) { /* Treat a non-Turkic UTF-8 locale as not being in locale at all, * except for potentially warning */ - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; - if (IN_UTF8_CTYPE_LOCALE && ! PL_in_utf8_turkic_locale) { + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; + if (IN_UTF8_CTYPE_LOCALE && ! IN_UTF8_TURKIC_LOCALE) { flags &= ~FOLD_FLAGS_LOCALE; } else { @@ -3096,7 +3316,8 @@ S_is_utf8_common(pTHX_ const U8 *const p PERLVAR(I, seen_deprecated_macro, HV *) STATIC void -S_warn_on_first_deprecated_use(pTHX_ const char * const name, +S_warn_on_first_deprecated_use(pTHX_ U32 category, + const char * const name, const char * const alternative, const bool use_locale, const char * const file, @@ -3106,7 +3327,7 @@ S_warn_on_first_deprecated_use(pTHX_ con PERL_ARGS_ASSERT_WARN_ON_FIRST_DEPRECATED_USE; - if (ckWARN_d(WARN_DEPRECATED)) { + if (ckWARN_d(category)) { key = Perl_form(aTHX_ "%s;%d;%s;%d", name, use_locale, file, line); if (! hv_fetch(PL_seen_deprecated_macro, key, strlen(key), 0)) { @@ -3120,14 +3341,14 @@ S_warn_on_first_deprecated_use(pTHX_ con } if (instr(file, "mathoms.c")) { - Perl_warner(aTHX_ WARN_DEPRECATED, + Perl_warner(aTHX_ category, "In %s, line %d, starting in Perl v5.32, %s()" " will be removed. Avoid this message by" " converting to use %s().\n", file, line, name, alternative); } else { - Perl_warner(aTHX_ WARN_DEPRECATED, + Perl_warner(aTHX_ category, "In %s, line %d, starting in Perl v5.32, %s() will" " require an additional parameter. Avoid this" " message by converting to use %s().\n", @@ -3594,9 +3815,9 @@ S_turkic_uc(pTHX_ const U8 * const p, co L1_func_extra_param, turkic) \ \ if (flags & (locale_flags)) { \ - _CHECK_AND_WARN_PROBLEMATIC_LOCALE; \ + CHECK_AND_WARN_PROBLEMATIC_LOCALE_; \ if (IN_UTF8_CTYPE_LOCALE) { \ - if (UNLIKELY(PL_in_utf8_turkic_locale)) { \ + if (UNLIKELY(IN_UTF8_TURKIC_LOCALE)) { \ UV ret = turkic(p, e, ustrp, lenp); \ if (ret) return ret; \ } \ @@ -4175,7 +4396,7 @@ Perl_foldEQ_utf8_flags(pTHX_ const char if (flags & FOLDEQ_LOCALE) { if (IN_UTF8_CTYPE_LOCALE) { - if (UNLIKELY(PL_in_utf8_turkic_locale)) { + if (UNLIKELY(IN_UTF8_TURKIC_LOCALE)) { flags_for_folder |= FOLD_FLAGS_LOCALE; } else { Index: gnu/usr.bin/perl/utf8.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/utf8.h,v diff -u -p -a -u -p -r1.9 utf8.h --- gnu/usr.bin/perl/utf8.h 15 Feb 2023 01:38:21 -0000 1.9 +++ gnu/usr.bin/perl/utf8.h 21 Feb 2024 15:47:03 -0000 @@ -32,6 +32,83 @@ #ifndef PERL_UTF8_H_ /* Guard against recursive inclusion */ #define PERL_UTF8_H_ 1 +/* +=for apidoc Ay||utf8ness_t + +This typedef is used by several core functions that return PV strings, to +indicate the UTF-8ness of those strings. + +(If you write a new function, you probably should instead return the PV in an +SV with the UTF-8 flag of the SV properly set, rather than use this mechanism.) + +The possible values this can be are: + +=over + +=item C + +This means the string definitely should be treated as a sequence of +UTF-8-encoded characters. + +Most code that needs to handle this typedef should be of the form: + + if (utf8ness_flag == UTF8NESS_YES) { + treat as utf8; // like turning on an SV UTF-8 flag + } + +=item C + +This means the string definitely should be treated as a sequence of bytes, not +encoded as UTF-8. + +=item C + +This means it is equally valid to treat the string as bytes, or as UTF-8 +characters; use whichever way you want. This happens when the string consists +entirely of characters which have the same representation whether encoded in +UTF-8 or not. + +=item C + +This means it is unknown how the string should be treated. No core function +will ever return this value to a non-core caller. Instead, it is used by the +caller to initialize a variable to a non-legal value. A typical call will look like: + + utf8ness_t string_is_utf8 = UTF8NESS_UNKNOWN + const char * string = foo(arg1, arg2, ..., &string_is_utf8); + if (string_is_utf8 == UTF8NESS_YES) { + do something for UTF-8; + } + +=back + +The following relationships hold between the enum values: + +=over + +=item S= I E= UTF8NESS_IMMATERIAL>> + +the string may be treated in code as non-UTF8 + +=item S= >> + +the string may be treated in code as encoded in UTF-8 + +=back + +=cut +*/ + +typedef enum { + UTF8NESS_NO = 0, /* Definitely not UTF-8 */ + UTF8NESS_IMMATERIAL = 1, /* Representation is the same in UTF-8 as + not, so the UTF8ness doesn't actually + matter */ + UTF8NESS_YES = 2, /* Defintely is UTF-8, wideness + unspecified */ + UTF8NESS_UNKNOWN = -1, /* Undetermined so far */ +} utf8ness_t; + /* Use UTF-8 as the default script encoding? * Turning this on will break scripts having non-UTF-8 binary * data (such as Latin-1) in string literals. */ @@ -664,7 +741,7 @@ uppercase/lowercase/titlecase/fold into. #define TWO_BYTE_UTF8_TO_NATIVE(HI, LO) \ (__ASSERT_(FITS_IN_8_BITS(HI)) \ __ASSERT_(FITS_IN_8_BITS(LO)) \ - __ASSERT_(PL_utf8skip[HI] == 2) \ + __ASSERT_(PL_utf8skip[(U8) HI] == 2) \ __ASSERT_(UTF8_IS_CONTINUATION(LO)) \ UNI_TO_NATIVE(UTF8_ACCUMULATE((NATIVE_UTF8_TO_I8(HI) & UTF_START_MASK(2)), \ (LO)))) @@ -866,8 +943,8 @@ case any call to string overloading upda /* Should all strings be treated as Unicode, and not just UTF-8 encoded ones? * Is so within 'feature unicode_strings' or 'locale :not_characters', and not - * within 'use bytes'. UTF-8 locales are not tested for here, but perhaps - * could be */ + * within 'use bytes'. UTF-8 locales are not tested for here, because it gets + * complicated by the probability of having categories in different locales. */ #define IN_UNI_8_BIT \ (( ( (CopHINTS_get(PL_curcop) & HINT_UNI_8_BIT)) \ || ( CopHINTS_get(PL_curcop) & HINT_LOCALE_PARTIAL \ Index: gnu/usr.bin/perl/utfebcdic.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/utfebcdic.h,v diff -u -p -a -u -p -r1.5 utfebcdic.h --- gnu/usr.bin/perl/utfebcdic.h 15 Feb 2023 01:36:14 -0000 1.5 +++ gnu/usr.bin/perl/utfebcdic.h 21 Feb 2024 15:47:03 -0000 @@ -12,7 +12,7 @@ * * To summarize, the way it works is: * To convert an EBCDIC code point to UTF-EBCDIC: - * 1) convert to Unicode. No conversion is necesary for code points above + * 1) convert to Unicode. No conversion is necessary for code points above * 255, as Unicode and EBCDIC are identical in this range. For smaller * code points, the conversion is done by lookup in the PL_e2a table (with * inverse PL_a2e) in the generated file 'ebcdic_tables.h'. The 'a' @@ -73,7 +73,7 @@ * macro NATIVE_TO_I8(). However, one "shadow", or parallel table, * PL_utf8skip, has been constructed that doesn't require undoing things. It * is such that for each byte, it says how long the sequence is if that -* (UTF-EBCDIC) byte were to begin it + * (UTF-EBCDIC) byte were to begin it. * * There are actually 3 slightly different UTF-EBCDIC encodings in * ebcdic_tables.h, one for each of the code pages recognized by Perl. That Index: gnu/usr.bin/perl/util.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/util.c,v diff -u -p -a -u -p -r1.42 util.c --- gnu/usr.bin/perl/util.c 8 Jul 2023 14:18:36 -0000 1.42 +++ gnu/usr.bin/perl/util.c 21 Feb 2024 15:47:03 -0000 @@ -242,6 +242,7 @@ Perl_safesysrealloc(Malloc_t where,MEM_S } else { dSAVE_ERRNO; + PERL_DEB(UV was_where = PTR2UV(where)); /* used in diags below */ #ifdef USE_MDH where = (Malloc_t)((char*)where-PERL_MEMORY_DEBUG_HEADER_SIZE); if (size + PERL_MEMORY_DEBUG_HEADER_SIZE < size) @@ -326,7 +327,7 @@ Perl_safesysrealloc(Malloc_t where,MEM_S /* In particular, must do that fixup above before logging anything via *printf(), as it can reallocate memory, which can cause SEGVs. */ - DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) rfree\n",PTR2UV(where),(long)PL_an++)); + DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) rfree\n",was_where,(long)PL_an++)); DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%" UVxf ": (%05ld) realloc %ld bytes\n",PTR2UV(ptr),(long)PL_an++,(long)size)); if (ptr == NULL) { @@ -557,7 +558,7 @@ Free_t Perl_mfree (Malloc_t where) /* This is the value stored in *retlen in the two delimcpy routines below when * there wasn't enough room in the destination to store everything it was asked * to. The value is deliberately very large so that hopefully if code uses it - * unquestioninly to access memory, it will likely segfault. And it is small + * unquestioningly to access memory, it will likely segfault. And it is small * enough that if the caller does some arithmetic on it before accessing, it * won't overflow into a small legal number. */ #define DELIMCPY_OUT_OF_BOUNDS_RET I32_MAX @@ -1319,77 +1320,6 @@ Perl_cntrl_to_mnemonic(const U8 c) return NULL; } -/* copy a string to a safe spot */ - -/* -=for apidoc_section $string -=for apidoc savepv - -Perl's version of C. Returns a pointer to a newly allocated -string which is a duplicate of C. The size of the string is -determined by C, which means it may not contain embedded C -characters and must have a trailing C. To prevent memory leaks, the -memory allocated for the new string needs to be freed when no longer needed. -This can be done with the C> function, or -L|perlguts/SAVEFREEPV(p)>. - -On some platforms, Windows for example, all allocated memory owned by a thread -is deallocated when that thread ends. So if you need that not to happen, you -need to use the shared memory functions, such as C>. - -=cut -*/ - -char * -Perl_savepv(pTHX_ const char *pv) -{ - PERL_UNUSED_CONTEXT; - if (!pv) - return NULL; - else { - char *newaddr; - const STRLEN pvlen = strlen(pv)+1; - Newx(newaddr, pvlen, char); - return (char*)memcpy(newaddr, pv, pvlen); - } -} - -/* same thing but with a known length */ - -/* -=for apidoc savepvn - -Perl's version of what C would be if it existed. Returns a -pointer to a newly allocated string which is a duplicate of the first -C bytes from C, plus a trailing -C byte. The memory allocated for -the new string can be freed with the C function. - -On some platforms, Windows for example, all allocated memory owned by a thread -is deallocated when that thread ends. So if you need that not to happen, you -need to use the shared memory functions, such as C>. - -=cut -*/ - -char * -Perl_savepvn(pTHX_ const char *pv, Size_t len) -{ - char *newaddr; - PERL_UNUSED_CONTEXT; - - Newx(newaddr,len+1,char); - /* Give a meaning to NULL pointer mainly for the use in sv_magic() */ - if (pv) { - /* might not be null terminated */ - newaddr[len] = '\0'; - return (char *) CopyD(pv,newaddr,len,char); - } - else { - return (char *) ZeroD(newaddr,len+1,char); - } -} - /* =for apidoc savesharedpv @@ -1441,53 +1371,6 @@ Perl_savesharedpvn(pTHX_ const char *con return (char*)memcpy(newaddr, pv, len); } -/* -=for apidoc savesvpv - -A version of C/C which gets the string to duplicate from -the passed in SV using C - -On some platforms, Windows for example, all allocated memory owned by a thread -is deallocated when that thread ends. So if you need that not to happen, you -need to use the shared memory functions, such as C>. - -=cut -*/ - -char * -Perl_savesvpv(pTHX_ SV *sv) -{ - STRLEN len; - const char * const pv = SvPV_const(sv, len); - char *newaddr; - - PERL_ARGS_ASSERT_SAVESVPV; - - ++len; - Newx(newaddr,len,char); - return (char *) CopyD(pv,newaddr,len,char); -} - -/* -=for apidoc savesharedsvpv - -A version of C which allocates the duplicate string in -memory which is shared between threads. - -=cut -*/ - -char * -Perl_savesharedsvpv(pTHX_ SV *sv) -{ - STRLEN len; - const char * const pv = SvPV_const(sv, len); - - PERL_ARGS_ASSERT_SAVESHAREDSVPV; - - return savesharedpvn(pv, len); -} - /* the SV for Perl_form() and mess() is not kept in an arena */ STATIC SV * @@ -1742,8 +1625,8 @@ Perl_mess_sv(pTHX_ SV *basemsg, bool con cop = PL_curcop; if (CopLINE(cop)) - Perl_sv_catpvf(aTHX_ sv, " at %s line %" IVdf, - OutCopFILE(cop), (IV)CopLINE(cop)); + Perl_sv_catpvf(aTHX_ sv, " at %s line %" LINE_Tf, + OutCopFILE(cop), CopLINE(cop)); } /* Seems that GvIO() can be untrustworthy during global destruction. */ @@ -1756,7 +1639,7 @@ Perl_mess_sv(pTHX_ SV *basemsg, bool con Perl_sv_catpvf(aTHX_ sv, ", <%" SVf "> %s %" IVdf, SVfARG(PL_last_in_gv == PL_argvgv ? &PL_sv_no - : sv_2mortal(newSVhek(GvNAME_HEK(PL_last_in_gv)))), + : newSVhek_mortal(GvNAME_HEK(PL_last_in_gv))), line_mode ? "line" : "chunk", (IV)IoLINES(GvIOp(PL_last_in_gv))); } @@ -1834,8 +1717,8 @@ S_with_queued_errors(pTHX_ SV *ex) return ex; } -STATIC bool -S_invoke_exception_hook(pTHX_ SV *ex, bool warn) +bool +Perl_invoke_exception_hook(pTHX_ SV *ex, bool warn) { HV *stash; GV *gv; @@ -2054,15 +1937,6 @@ Perl_croak_nocontext(const char *pat, .. } #endif /* MULTIPLICITY */ -/* saves machine code for a common noreturn idiom typically used in Newx*() */ -GCC_DIAG_IGNORE_DECL(-Wunused-function); -void -Perl_croak_memory_wrap(void) -{ - Perl_croak_nocontext("%s",PL_memory_wrap); -} -GCC_DIAG_RESTORE_DECL; - void Perl_croak(pTHX_ const char *pat, ...) { @@ -2391,23 +2265,19 @@ S_ckwarn_common(pTHX_ U32 w) return FALSE; } -/* Set buffer=NULL to get a new one. */ -STRLEN * -Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits, +char * +Perl_new_warnings_bitfield(pTHX_ char *buffer, const char *const bits, STRLEN size) { - const MEM_SIZE len_wanted = - sizeof(STRLEN) + (size > WARNsize ? size : WARNsize); + const MEM_SIZE len_wanted = (size > WARNsize ? size : WARNsize); PERL_UNUSED_CONTEXT; PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD; - buffer = (STRLEN*) - (specialWARN(buffer) ? - PerlMemShared_malloc(len_wanted) : - PerlMemShared_realloc(buffer, len_wanted)); - buffer[0] = size; - Copy(bits, (buffer + 1), size, char); + /* pass in null as the source string as we will do the + * copy ourselves. */ + buffer = rcpv_new(NULL, len_wanted, RCPVf_NO_COPY); + Copy(bits, buffer, size, char); if (size < WARNsize) - Zero((char *)(buffer + 1) + size, WARNsize - size, char); + Zero(buffer + size, WARNsize - size, char); return buffer; } @@ -2423,22 +2293,14 @@ Perl_new_warnings_bitfield(pTHX_ STRLEN -#ifdef USE_ENVIRON_ARRAY +#if defined(USE_ENVIRON_ARRAY) || defined(WIN32) /* NB: VMS' my_setenv() is in vms.c */ -/* Configure doesn't test for HAS_SETENV yet, so decide based on platform. - * For Solaris, setenv() and unsetenv() were introduced in Solaris 9, so - * testing for HAS UNSETENV is sufficient. - */ -# if defined(__CYGWIN__)|| defined(__riscos__) || (defined(__sun) && defined(HAS_UNSETENV)) || defined(PERL_DARWIN) -# define MY_HAS_SETENV -# endif - /* small wrapper for use by Perl_my_setenv that mallocs, or reallocs if * 'current' is non-null, with up to three sizes that are added together. * It handles integer overflow. */ -# ifndef MY_HAS_SETENV +# ifndef HAS_SETENV static char * S_env_alloc(void *current, Size_t l1, Size_t l2, Size_t l3, Size_t size) { @@ -2465,9 +2327,6 @@ S_env_alloc(void *current, Size_t l1, Si } # endif - -# if !defined(WIN32) - /* =for apidoc_section $utility =for apidoc my_setenv @@ -2481,156 +2340,54 @@ version has desirable safeguards void Perl_my_setenv(pTHX_ const char *nam, const char *val) { -# ifdef __amigaos4__ - amigaos4_obtain_environ(__FUNCTION__); -# endif - -# ifdef USE_ITHREADS - /* only parent thread can modify process environment, so no need to use a - * mutex */ - if (PL_curinterp == aTHX) -# endif - { - -# ifndef PERL_USE_SAFE_PUTENV - if (!PL_use_safe_putenv) { - /* most putenv()s leak, so we manipulate environ directly */ - UV i; - Size_t vlen, nlen = strlen(nam); - - /* where does it go? */ - for (i = 0; environ[i]; i++) { - if (strnEQ(environ[i], nam, nlen) && environ[i][nlen] == '=') - break; - } - - if (environ == PL_origenviron) { /* need we copy environment? */ - UV j, max; - char **tmpenv; - - max = i; - while (environ[max]) - max++; - - /* XXX shouldn't that be max+1 rather than max+2 ??? - DAPM */ - tmpenv = (char**)S_env_alloc(NULL, max, 2, 0, sizeof(char*)); - - for (j=0; j>, which you should use instead. - -=cut -*/ - -void * -Perl_get_context(void) -{ -#if defined(USE_ITHREADS) -# ifdef OLD_PTHREADS_API - pthread_addr_t t; - int error = pthread_getspecific(PL_thr_key, &t); - if (error) - Perl_croak_nocontext("panic: pthread_getspecific, error=%d", error); - return (void*)t; -# elif defined(I_MACH_CTHREADS) - return (void*)cthread_data(cthread_self()); -# else - return (void*)PTHREAD_GETSPECIFIC(PL_thr_key); -# endif -#else - return (void*)NULL; -#endif -} - -/* -=for apidoc_section $embedding =for apidoc set_context Implements L>, which you should use instead. @@ -3853,7 +3581,7 @@ Perl_set_context(void *t) cthread_set_data(cthread_self(), t); # else /* We set thread-specific value always, as C++ code has to read it with - * pthreads, beacuse the declaration syntax for thread local storage for C11 + * pthreads, because the declaration syntax for thread local storage for C11 * is incompatible with C++, meaning that we can't expose the thread local * variable to C++ code. */ { @@ -3862,6 +3590,9 @@ Perl_set_context(void *t) Perl_croak_nocontext("panic: pthread_setspecific, error=%d", error); } # endif + + PERL_SET_NON_tTHX_CONTEXT(t); + #else PERL_UNUSED_ARG(t); #endif @@ -3869,6 +3600,16 @@ Perl_set_context(void *t) #endif /* !PERL_GET_CONTEXT_DEFINED */ +/* +=for apidoc get_op_names + +Return a pointer to the array of all the names of the various OPs +Given an opcode from the enum in F, C returns a +pointer to a C language string giving its name. + +=cut +*/ + char ** Perl_get_op_names(pTHX) { @@ -3876,6 +3617,16 @@ Perl_get_op_names(pTHX) return (char **)PL_op_name; } +/* +=for apidoc get_op_descs + +Return a pointer to the array of all the descriptions of the various OPs +Given an opcode from the enum in F, C returns a +pointer to a C language string giving its description. + +=cut +*/ + char ** Perl_get_op_descs(pTHX) { @@ -3917,16 +3668,6 @@ Perl_getenv_len(pTHX_ const char *env_el } #endif - -MGVTBL* -Perl_get_vtbl(pTHX_ int vtbl_id) -{ - PERL_UNUSED_CONTEXT; - - return (vtbl_id < 0 || vtbl_id >= magic_vtable_max) - ? NULL : (MGVTBL*)PL_magic_vtables + vtbl_id; -} - /* =for apidoc_section $io =for apidoc my_fflush_all @@ -4018,7 +3759,7 @@ Perl_report_evil_fh(pTHX_ const GV *gv) if (ckWARN(warn_type)) { SV * const name = gv && isGV_with_GP(gv) && GvENAMELEN(gv) ? - sv_2mortal(newSVhek(GvENAME_HEK(gv))) : NULL; + newSVhek_mortal(GvENAME_HEK(gv)) : NULL; const char * const pars = (const char *)(OP_IS_FILETEST(op) ? "" : "()"); const char * const func = @@ -4077,11 +3818,12 @@ Perl_init_tm(pTHX_ struct tm *ptm) /* se PERL_UNUSED_CONTEXT; PERL_ARGS_ASSERT_INIT_TM; (void)time(&now); - ENV_LOCALE_READ_LOCK; + + LOCALTIME_LOCK; my_tm = localtime(&now); if (my_tm) Copy(my_tm, ptm, 1, struct tm); - ENV_LOCALE_READ_UNLOCK; + LOCALTIME_UNLOCK; #else PERL_UNUSED_CONTEXT; PERL_ARGS_ASSERT_INIT_TM; @@ -4107,19 +3849,19 @@ Perl_mini_mktime(struct tm *ptm) PERL_ARGS_ASSERT_MINI_MKTIME; -#define DAYS_PER_YEAR 365 -#define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1) -#define DAYS_PER_CENT (25*DAYS_PER_QYEAR-1) -#define DAYS_PER_QCENT (4*DAYS_PER_CENT+1) -#define SECS_PER_HOUR (60*60) -#define SECS_PER_DAY (24*SECS_PER_HOUR) +#define DAYS_PER_YEAR 365 +#define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1) +#define DAYS_PER_CENT (25*DAYS_PER_QYEAR-1) +#define DAYS_PER_QCENT (4*DAYS_PER_CENT+1) +#define SECS_PER_HOUR (60*60) +#define SECS_PER_DAY (24*SECS_PER_HOUR) /* parentheses deliberately absent on these two, otherwise they don't work */ -#define MONTH_TO_DAYS 153/5 -#define DAYS_TO_MONTH 5/153 +#define MONTH_TO_DAYS 153/5 +#define DAYS_TO_MONTH 5/153 /* offset to bias by March (month 4) 1st between month/mday & year finding */ -#define YEAR_ADJUST (4*MONTH_TO_DAYS+1) +#define YEAR_ADJUST (4*MONTH_TO_DAYS+1) /* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */ -#define WEEKDAY_BIAS 6 /* (1+6)%7 makes Sunday 0 again */ +#define WEEKDAY_BIAS 6 /* (1+6)%7 makes Sunday 0 again */ /* * Year/day algorithm notes: @@ -4284,128 +4026,6 @@ Perl_mini_mktime(struct tm *ptm) ptm->tm_wday = (jday + WEEKDAY_BIAS) % 7; } -char * -Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst) -{ -#ifdef HAS_STRFTIME - -/* -=for apidoc_section $time -=for apidoc my_strftime -strftime(), but with a different API so that the return value is a pointer -to the formatted result (which MUST be arranged to be FREED BY THE -CALLER). This allows this function to increase the buffer size as needed, -so that the caller doesn't have to worry about that. - -Note that yday and wday effectively are ignored by this function, as -mini_mktime() overwrites them - -Also note that this is always executed in the underlying locale of the program, -giving localized results. - -=cut - */ - - char *buf; - int buflen; - struct tm mytm; - int len; - - PERL_ARGS_ASSERT_MY_STRFTIME; - - init_tm(&mytm); /* XXX workaround - see init_tm() above */ - mytm.tm_sec = sec; - mytm.tm_min = min; - mytm.tm_hour = hour; - mytm.tm_mday = mday; - mytm.tm_mon = mon; - mytm.tm_year = year; - mytm.tm_wday = wday; - mytm.tm_yday = yday; - mytm.tm_isdst = isdst; - mini_mktime(&mytm); - /* use libc to get the values for tm_gmtoff and tm_zone [perl #18238] */ -#if defined(HAS_MKTIME) && (defined(HAS_TM_TM_GMTOFF) || defined(HAS_TM_TM_ZONE)) - STMT_START { - struct tm mytm2; - mytm2 = mytm; - mktime(&mytm2); -#ifdef HAS_TM_TM_GMTOFF - mytm.tm_gmtoff = mytm2.tm_gmtoff; -#endif -#ifdef HAS_TM_TM_ZONE - mytm.tm_zone = mytm2.tm_zone; -#endif - } STMT_END; -#endif - buflen = 64; - Newx(buf, buflen, char); - - GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); /* fmt checked by caller */ - - len = strftime(buf, buflen, fmt, &mytm); - - GCC_DIAG_RESTORE_STMT; - - /* - ** The following is needed to handle the situation where - ** tmpbuf overflows. Basically we want to allocate a buffer - ** and try repeatedly, until it's large enough. The reason why it is so - ** complicated ** is that getting a return value of 0 from strftime can - ** indicate one of the following: - ** 1. buffer overflowed, - ** 2. illegal conversion specifier, or - ** 3. the format string specifies nothing to be returned (which isn't an - ** an error). This could be because the format is an empty string - ** or it specifies %p which yields an empty string in some locales. - ** If there is a better way to make it portable, go ahead by - ** all means. - */ - if (inRANGE(len, 1, buflen - 1) || (len == 0 && *fmt == '\0')) - return buf; - else { - /* Possibly buf overflowed - try again with a bigger buf */ - const int fmtlen = strlen(fmt); - int bufsize = fmtlen + buflen; - - Renew(buf, bufsize, char); - while (buf) { - - GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); /* fmt checked by caller */ - buflen = strftime(buf, bufsize, fmt, &mytm); - GCC_DIAG_RESTORE_STMT; - - if (inRANGE(buflen, 1, bufsize - 1)) - break; - /* heuristic to prevent out-of-memory errors */ - if (bufsize > 100*fmtlen) { - - /* "%p" can legally return nothing, assume that was the case if we - * can't make the buffer large enough to get a non-zero return. For - * any other formats, assume it is an error (probably it is an illegal - * conversion specifier.) */ - if (strEQ(fmt, "%p")) { - Renew(buf, 1, char); - *buf = '\0'; - } - else { - Safefree(buf); - buf = NULL; - } - break; - } - bufsize *= 2; - Renew(buf, bufsize, char); - } - return buf; - } -#else - Perl_croak(aTHX_ "panic: no strftime"); - return NULL; -#endif -} - - #define SV_CWD_RETURN_UNDEF \ sv_set_undef(sv); \ return FALSE @@ -4604,7 +4224,7 @@ S_socketpair_udp (int fd[2]) { addresses[i].sin_family = AF_INET; addresses[i].sin_addr.s_addr = htonl(INADDR_LOOPBACK); - addresses[i].sin_port = 0; /* kernel choses port. */ + addresses[i].sin_port = 0; /* kernel chooses port. */ if (PerlSock_bind(sockets[i], (struct sockaddr *) &addresses[i], sizeof(struct sockaddr_in)) == -1) goto tidy_up_and_fail; @@ -4776,7 +4396,7 @@ Perl_my_socketpair (int family, int type memset(&listen_addr, 0, sizeof(listen_addr)); listen_addr.sin_family = AF_INET; listen_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - listen_addr.sin_port = 0; /* kernel choses port. */ + listen_addr.sin_port = 0; /* kernel chooses port. */ if (PerlSock_bind(listener, (struct sockaddr *) &listen_addr, sizeof(listen_addr)) == -1) goto tidy_up_and_fail; @@ -4972,6 +4592,39 @@ Perl_parse_unicode_opts(pTHX_ const char # include #endif +/* hash a pointer and return a U32 + * + * this code was derived from Sereal, which was derived from autobox. + */ + +PERL_STATIC_INLINE U32 S_ptr_hash(PTRV u) { +#if PTRSIZE == 8 + /* + * This is one of Thomas Wang's hash functions for 64-bit integers from: + * http://www.concentric.net/~Ttwang/tech/inthash.htm + */ + u = (~u) + (u << 18); + u = u ^ (u >> 31); + u = u * 21; + u = u ^ (u >> 11); + u = u + (u << 6); + u = u ^ (u >> 22); +#else + /* + * This is one of Bob Jenkins' hash functions for 32-bit integers + * from: http://burtleburtle.net/bob/hash/integer.html + */ + u = (u + 0x7ed55d16) + (u << 12); + u = (u ^ 0xc761c23c) ^ (u >> 19); + u = (u + 0x165667b1) + (u << 5); + u = (u + 0xd3a2646c) ^ (u << 9); + u = (u + 0xfd7046c5) + (u << 3); + u = (u ^ 0xb55a4f09) ^ (u >> 16); +#endif + return (U32)u; +} + + U32 Perl_seed(pTHX) { @@ -5043,7 +4696,8 @@ Perl_seed(pTHX) u += SEED_C3 * (U32)PerlProc_getpid(); u += SEED_C4 * (U32)PTR2UV(PL_stack_sp); #ifndef PLAN9 /* XXX Plan9 assembler chokes on this; fix needed */ - u += SEED_C5 * (U32)PTR2UV(&when); + UV ptruv = PTR2UV(&when); + u += SEED_C5 * ptr_hash(ptruv); #endif return u; #endif @@ -5213,7 +4867,7 @@ Perl_debug_hash_seed(pTHX_ bool via_debu /* -DPERL_MEM_LOG_SPRINTF_BUF_SIZE=X: size of a (stack-allocated) buffer * the Perl_mem_log_...() will use (either via sprintf or snprintf). */ -#define PERL_MEM_LOG_SPRINTF_BUF_SIZE 128 +#define PERL_MEM_LOG_SPRINTF_BUF_SIZE 256 /* -DPERL_MEM_LOG_FD=N: the file descriptor the Perl_mem_log_...() * writes to. In the default logger, this is settable at runtime. @@ -5322,6 +4976,33 @@ S_mem_log_common(enum mem_log_type mlt, len = 0; } PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len)); +#ifdef USE_C_BACKTRACE + if(strchr(pmlenv,'c') && (mlt == MLT_NEW_SV)) { + len = my_snprintf(buf, sizeof(buf), + " caller %s at %s line %" LINE_Tf "\n", + /* CopSTASHPV can crash early on startup; use CopFILE to check */ + CopFILE(PL_curcop) ? CopSTASHPV(PL_curcop) : "", + CopFILE(PL_curcop), CopLINE(PL_curcop)); + PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len)); + + Perl_c_backtrace *bt = Perl_get_c_backtrace(aTHX_ 3, 3); + Perl_c_backtrace_frame *frame; + UV i; + for (i = 0, frame = bt->frame_info; + i < bt->header.frame_count; + i++, frame++) { + len = my_snprintf(buf, sizeof(buf), + " frame[%" UVuf "]: %p %s at %s +0x%lx\n", + i, + frame->addr, + frame->symbol_name_size && frame->symbol_name_offset ? (char *)bt + frame->symbol_name_offset : "-", + frame->object_name_size && frame->object_name_offset ? (char *)bt + frame->object_name_offset : "?", + (char *)frame->addr - (char *)frame->object_base_addr); + PERL_UNUSED_RESULT(PerlLIO_write(fd, buf, len)); + } + Perl_free_c_backtrace(bt); + } +#endif /* USE_C_BACKTRACE */ } } } @@ -5512,11 +5193,14 @@ getting C. =cut */ + int Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...) { int retval = -1; va_list ap; + dTHX; + PERL_ARGS_ASSERT_MY_SNPRINTF; #ifndef HAS_VSNPRINTF PERL_UNUSED_VAR(len); @@ -5525,9 +5209,12 @@ Perl_my_snprintf(char *buffer, const Siz #ifdef USE_QUADMATH { bool quadmath_valid = FALSE; + if (quadmath_format_valid(format)) { /* If the format looked promising, use it as quadmath. */ - retval = quadmath_snprintf(buffer, len, format, va_arg(ap, NV)); + WITH_LC_NUMERIC_SET_TO_NEEDED( + retval = quadmath_snprintf(buffer, len, format, va_arg(ap, NV)); + ); if (retval == -1) { Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s\"", format); } @@ -5559,12 +5246,20 @@ Perl_my_snprintf(char *buffer, const Siz } #endif - if (retval == -1) + if (retval == -1) { + #ifdef HAS_VSNPRINTF - retval = vsnprintf(buffer, len, format, ap); -#else - retval = vsprintf(buffer, format, ap); + WITH_LC_NUMERIC_SET_TO_NEEDED( + retval = vsnprintf(buffer, len, format, ap); + ); +#else + WITH_LC_NUMERIC_SET_TO_NEEDED( + retval = vsprintf(buffer, format, ap); + ); #endif + + } + va_end(ap); /* vsprintf() shows failure with < 0 */ if (retval < 0 @@ -5589,6 +5284,7 @@ C instead, or getting C= len */ || (len > 0 && (Size_t)retval >= len) -#endif +# endif ) Perl_croak_nocontext("panic: my_vsnprintf buffer overflow"); + return retval; #endif } @@ -5646,44 +5356,31 @@ Perl_my_clearenv(pTHX) # if defined(USE_ITHREADS) /* only the parent thread can clobber the process environment, so no need * to use a mutex */ - if (PL_curinterp == aTHX) + if (PL_curinterp != aTHX) + return; # endif /* USE_ITHREADS */ - { -# if ! defined(PERL_USE_SAFE_PUTENV) - if ( !PL_use_safe_putenv) { - I32 i; - if (environ == PL_origenviron) - environ = (char**)safesysmalloc(sizeof(char*)); - else - for (i = 0; environ[i]; i++) - (void)safesysfree(environ[i]); - } - environ[0] = NULL; -# else /* PERL_USE_SAFE_PUTENV */ -# if defined(HAS_CLEARENV) - (void)clearenv(); -# elif defined(HAS_UNSETENV) +# if defined(HAS_CLEARENV) + clearenv(); +# elif defined(HAS_UNSETENV) int bsiz = 80; /* Most envvar names will be shorter than this. */ char *buf = (char*)safesysmalloc(bsiz); while (*environ != NULL) { - char *e = strchr(*environ, '='); - int l = e ? e - *environ : (int)strlen(*environ); - if (bsiz < l + 1) { - (void)safesysfree(buf); - bsiz = l + 1; /* + 1 for the \0. */ - buf = (char*)safesysmalloc(bsiz); - } - memcpy(buf, *environ, l); - buf[l] = '\0'; - (void)unsetenv(buf); + char *e = strchr(*environ, '='); + int l = e ? e - *environ : (int)strlen(*environ); + if (bsiz < l + 1) { + safesysfree(buf); + bsiz = l + 1; /* + 1 for the \0. */ + buf = (char*)safesysmalloc(bsiz); + } + memcpy(buf, *environ, l); + buf[l] = '\0'; + unsetenv(buf); } - (void)safesysfree(buf); -# else /* ! HAS_CLEARENV && ! HAS_UNSETENV */ + safesysfree(buf); +# else /* ! HAS_CLEARENV && ! HAS_UNSETENV */ /* Just null environ and accept the leakage. */ *environ = NULL; -# endif /* HAS_CLEARENV || HAS_UNSETENV */ -# endif /* ! PERL_USE_SAFE_PUTENV */ - } +# endif /* HAS_CLEARENV || HAS_UNSETENV */ # endif /* USE_ENVIRON_ARRAY */ # endif /* PERL_IMPLICIT_SYS || WIN32 */ #endif /* PERL_MICRO */ @@ -5876,9 +5573,9 @@ Perl_xs_handshake(const U32 key, void * } } { - U32 xsverlen; - assert(HS_GETXSVERLEN(key) <= UCHAR_MAX && HS_GETXSVERLEN(key) <= HS_APIVERLEN_MAX); - if((xsverlen = HS_GETXSVERLEN(key))) + U32 xsverlen = HS_GETXSVERLEN(key); + assert(xsverlen <= UCHAR_MAX && xsverlen <= HS_APIVERLEN_MAX); + if(xsverlen) S_xs_version_bootcheck(aTHX_ items, ax, va_arg(args, char*), xsverlen); } @@ -5935,86 +5632,12 @@ S_xs_version_bootcheck(pTHX_ U32 items, } } -/* -=for apidoc my_strlcat - -The C library C if available, or a Perl implementation of it. -This operates on C C-terminated strings. - -C appends string C to the end of C. It will append at -most S> characters. It will then C-terminate, -unless C is 0 or the original C string was longer than C (in -practice this should not happen as it means that either C is incorrect or -that C is not a proper C-terminated string). - -Note that C is the full size of the destination buffer and -the result is guaranteed to be C-terminated if there is room. Note that -room for the C should be included in C. - -The return value is the total length that C would have if C is -sufficiently large. Thus it is the initial length of C plus the length of -C. If C is smaller than the return, the excess was not appended. - -=cut - -Description stolen from http://man.openbsd.org/strlcat.3 -*/ -#ifndef HAS_STRLCAT -Size_t -Perl_my_strlcat(char *dst, const char *src, Size_t size) -{ - Size_t used, length, copy; - - used = strlen(dst); - length = strlen(src); - if (size > 0 && used < size - 1) { - copy = (length >= size - used) ? size - used - 1 : length; - memcpy(dst + used, src, copy); - dst[used + copy] = '\0'; - } - return used + length; -} -#endif - - -/* -=for apidoc my_strlcpy - -The C library C if available, or a Perl implementation of it. -This operates on C C-terminated strings. - -C copies up to S> characters from the string C -to C, C-terminating the result if C is not 0. - -The return value is the total length C would be if the copy completely -succeeded. If it is larger than C, the excess was not copied. - -=cut - -Description stolen from http://man.openbsd.org/strlcpy.3 -*/ -#ifndef HAS_STRLCPY -Size_t -Perl_my_strlcpy(char *dst, const char *src, Size_t size) -{ - Size_t length, copy; - - length = strlen(src); - if (size > 0) { - copy = (length >= size) ? size - 1 : length; - memcpy(dst, src, copy); - dst[copy] = '\0'; - } - return length; -} -#endif - PERL_STATIC_INLINE bool S_gv_has_usable_name(pTHX_ GV *gv) { GV **gvp; return GvSTASH(gv) - && HvENAME(GvSTASH(gv)) + && HvHasENAME(GvSTASH(gv)) && (gvp = (GV **)hv_fetchhek( GvSTASH(gv), GvNAME_HEK(gv), 0 )) @@ -6311,7 +5934,7 @@ typedef struct { bfd* abfd; /* bfd_syms is the BFD symbol table. */ asymbol** bfd_syms; - /* bfd_text is handle to the the ".text" section of the object file. */ + /* bfd_text is handle to the ".text" section of the object file. */ asection* bfd_text; /* Since opening the executable and scanning its symbols is quite * heavy operation, we remember the filename we used the last time, @@ -6560,8 +6183,13 @@ static void atos_symbolize(atos_context* return; } } - cnt = snprintf(cmd, sizeof(cmd), ctx->format, - ctx->fname, ctx->object_base_addr, raw_frame); + + dTHX; + WITH_LC_NUMERIC_SET_TO_NEEDED( + cnt = snprintf(cmd, sizeof(cmd), ctx->format, + ctx->fname, ctx->object_base_addr, raw_frame); + ); + if (cnt < sizeof(cmd)) { /* Undo nostdio.h #defines that disable stdio. * This is somewhat naughty, but is used elsewhere Index: gnu/usr.bin/perl/util.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/util.h,v diff -u -p -a -u -p -r1.18 util.h --- gnu/usr.bin/perl/util.h 15 Feb 2023 01:36:14 -0000 1.18 +++ gnu/usr.bin/perl/util.h 21 Feb 2024 15:47:03 -0000 @@ -184,7 +184,7 @@ typedef struct { /* uses var file to set default filename for newXS_deffile to use for CvFILE */ #define HSf_SETXSUBFN 0x00000020 #define HSf_POPMARK 0x00000040 /* popmark mode or you must supply ax and items */ -#define HSf_IMP_CXT 0x00000080 /* ABI, threaded/MULTIPLICITY, pTHX_ present */ +#define HSf_IMP_CXT 0x00000080 /* ABI, threaded, MULTIPLICITY, pTHX_ present */ #define HSm_INTRPSIZE 0xFFFF0000 /* ABI, interp struct size */ /* A mask of bits in the key which must always match between a XS mod and interp. Also if all ABI bits in a key are true, skip all ABI checks, it is very @@ -247,7 +247,9 @@ returning NULL if not found. The termin #ifdef HAS_MEMMEM # define ninstr(big, bigend, little, lend) \ - ((char *) memmem((big), (bigend) - (big), \ + (__ASSERT_(bigend >= big) \ + __ASSERT_(lend >= little) \ + (char *) memmem((big), (bigend) - (big), \ (little), (lend) - (little))) #else # define ninstr(a,b,c,d) Perl_ninstr(a,b,c,d) Index: gnu/usr.bin/perl/warnings.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/warnings.h,v diff -u -p -a -u -p -r1.7 warnings.h --- gnu/usr.bin/perl/warnings.h 15 Feb 2023 01:36:14 -0000 1.7 +++ gnu/usr.bin/perl/warnings.h 21 Feb 2024 15:47:03 -0000 @@ -1,4 +1,4 @@ -/* -*- buffer-read-only: t -*- +/* -*- mode: C; buffer-read-only: t -*- !!!!!!! DO NOT EDIT THIS FILE !!!!!!! This file is built by regen/warnings.pl. Any changes made here will be lost! @@ -9,7 +9,6 @@ #define Perl_Warn_Bit_(x) (1 << ((x) % 8)) #define PerlWarnIsSet_(a, x) ((a)[Perl_Warn_Off_(x)] & Perl_Warn_Bit_(x)) - #define G_WARN_OFF 0 /* $^W == 0 */ #define G_WARN_ON 1 /* -w flag and $^W != 0 */ #define G_WARN_ALL_ON 2 /* -W flag */ @@ -18,8 +17,8 @@ #define G_WARN_ALL_MASK (G_WARN_ALL_ON|G_WARN_ALL_OFF) #define pWARN_STD NULL -#define pWARN_ALL (STRLEN *) &PL_WARN_ALL /* use warnings 'all' */ -#define pWARN_NONE (STRLEN *) &PL_WARN_NONE /* no warnings 'all' */ +#define pWARN_ALL &PL_WARN_ALL /* use warnings 'all' */ +#define pWARN_NONE &PL_WARN_NONE /* no warnings 'all' */ #define specialWARN(x) ((x) == pWARN_STD || (x) == pWARN_ALL || \ (x) == pWARN_NONE) @@ -81,67 +80,85 @@ #define WARN_IMPRECISION 46 #define WARN_ILLEGALPROTO 47 +/* Warnings Categories added in Perl 5.011003 */ + +#define WARN_DEPRECATED__GOTO_CONSTRUCT 48 +#define WARN_DEPRECATED__UNICODE_PROPERTY_NAME 49 + /* Warnings Categories added in Perl 5.013 */ -#define WARN_NON_UNICODE 48 -#define WARN_NONCHAR 49 -#define WARN_SURROGATE 50 +#define WARN_NON_UNICODE 50 +#define WARN_NONCHAR 51 +#define WARN_SURROGATE 52 /* Warnings Categories added in Perl 5.017 */ -#define WARN_EXPERIMENTAL 51 -#define WARN_EXPERIMENTAL__LEXICAL_SUBS 52 -#define WARN_EXPERIMENTAL__REGEX_SETS 53 -#define WARN_EXPERIMENTAL__SMARTMATCH 54 +#define WARN_EXPERIMENTAL 53 +#define WARN_EXPERIMENTAL__REGEX_SETS 54 /* Warnings Categories added in Perl 5.019 */ -#define WARN_EXPERIMENTAL__POSTDEREF 55 -#define WARN_EXPERIMENTAL__SIGNATURES 56 -#define WARN_SYSCALLS 57 +#define WARN_SYSCALLS 55 /* Warnings Categories added in Perl 5.021 */ -#define WARN_EXPERIMENTAL__BITWISE 58 -#define WARN_EXPERIMENTAL__CONST_ATTR 59 -#define WARN_EXPERIMENTAL__RE_STRICT 60 -#define WARN_EXPERIMENTAL__REFALIASING 61 -#define WARN_LOCALE 62 -#define WARN_MISSING 63 -#define WARN_REDUNDANT 64 +#define WARN_EXPERIMENTAL__CONST_ATTR 56 +#define WARN_EXPERIMENTAL__RE_STRICT 57 +#define WARN_EXPERIMENTAL__REFALIASING 58 +#define WARN_LOCALE 59 +#define WARN_MISSING 60 +#define WARN_REDUNDANT 61 /* Warnings Categories added in Perl 5.025 */ -#define WARN_EXPERIMENTAL__DECLARED_REFS 65 +#define WARN_EXPERIMENTAL__DECLARED_REFS 62 -/* Warnings Categories added in Perl 5.027 */ +/* Warnings Categories added in Perl 5.025011 */ -#define WARN_EXPERIMENTAL__ALPHA_ASSERTIONS 66 -#define WARN_EXPERIMENTAL__SCRIPT_RUN 67 -#define WARN_SHADOW 68 +#define WARN_DEPRECATED__DOT_IN_INC 63 -/* Warnings Categories added in Perl 5.029 */ +/* Warnings Categories added in Perl 5.027 */ -#define WARN_EXPERIMENTAL__PRIVATE_USE 69 -#define WARN_EXPERIMENTAL__UNIPROP_WILDCARDS 70 -#define WARN_EXPERIMENTAL__VLB 71 +#define WARN_SHADOW 64 -/* Warnings Categories added in Perl 5.031 */ +/* Warnings Categories added in Perl 5.029 */ -#define WARN_EXPERIMENTAL__ISA 72 +#define WARN_EXPERIMENTAL__PRIVATE_USE 65 +#define WARN_EXPERIMENTAL__UNIPROP_WILDCARDS 66 +#define WARN_EXPERIMENTAL__VLB 67 /* Warnings Categories added in Perl 5.033 */ -#define WARN_EXPERIMENTAL__TRY 73 +#define WARN_EXPERIMENTAL__TRY 68 /* Warnings Categories added in Perl 5.035 */ -#define WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES 74 -#define WARN_EXPERIMENTAL__BUILTIN 75 -#define WARN_EXPERIMENTAL__DEFER 76 -#define WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS 77 -#define WARN_EXPERIMENTAL__FOR_LIST 78 -#define WARN_SCALAR 79 +#define WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES 69 +#define WARN_EXPERIMENTAL__BUILTIN 70 +#define WARN_EXPERIMENTAL__DEFER 71 +#define WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS 72 +#define WARN_EXPERIMENTAL__FOR_LIST 73 +#define WARN_SCALAR 74 + +/* Warnings Categories added in Perl 5.035009 */ + +#define WARN_DEPRECATED__VERSION_DOWNGRADE 75 + +/* Warnings Categories added in Perl 5.03501 */ + +#define WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED 76 + +/* Warnings Categories added in Perl 5.037 */ + +#define WARN_EXPERIMENTAL__CLASS 77 + +/* Warnings Categories added in Perl 5.037009 */ + +#define WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR 78 + +/* Warnings Categories added in Perl 5.03701 */ + +#define WARN_DEPRECATED__SMARTMATCH 79 #define WARNsize 20 #define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" #define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" @@ -151,13 +168,18 @@ #define isLEXWARN_off \ cBOOL(!PL_curcop || PL_curcop->cop_warnings == pWARN_STD) #define isWARN_ONCE (PL_dowarn & (G_WARN_ON|G_WARN_ONCE)) -#define isWARN_on(c,x) (PerlWarnIsSet_((U8 *)(c + 1), 2*(x))) -#define isWARNf_on(c,x) (PerlWarnIsSet_((U8 *)(c + 1), 2*(x)+1)) +#define hasWARNBIT(c,x) (RCPV_LEN(c) > (2*(x)/8)) +#define isWARN_on(c,x) (hasWARNBIT(c,x) \ + ? PerlWarnIsSet_((U8 *)(c), 2*(x)) \ + : 0) +#define isWARNf_on(c,x) (hasWARNBIT(c,x) \ + ? PerlWarnIsSet_((U8 *)(c), 2*(x)+1) \ + : 0) #define DUP_WARNINGS(p) Perl_dup_warnings(aTHX_ p) #define free_and_set_cop_warnings(cmp,w) STMT_START { \ - if (!specialWARN((cmp)->cop_warnings)) PerlMemShared_free((cmp)->cop_warnings); \ + if (!specialWARN((cmp)->cop_warnings)) rcpv_free((cmp)->cop_warnings); \ (cmp)->cop_warnings = w; \ } STMT_END @@ -299,17 +321,14 @@ category parameters passed. =for apidoc Amnh||WARN_VOID =for apidoc Amnh||WARN_IMPRECISION =for apidoc Amnh||WARN_ILLEGALPROTO +=for apidoc Amnh||WARN_DEPRECATED__GOTO_CONSTRUCT +=for apidoc Amnh||WARN_DEPRECATED__UNICODE_PROPERTY_NAME =for apidoc Amnh||WARN_NON_UNICODE =for apidoc Amnh||WARN_NONCHAR =for apidoc Amnh||WARN_SURROGATE =for apidoc Amnh||WARN_EXPERIMENTAL -=for apidoc Amnh||WARN_EXPERIMENTAL__LEXICAL_SUBS =for apidoc Amnh||WARN_EXPERIMENTAL__REGEX_SETS -=for apidoc Amnh||WARN_EXPERIMENTAL__SMARTMATCH -=for apidoc Amnh||WARN_EXPERIMENTAL__POSTDEREF -=for apidoc Amnh||WARN_EXPERIMENTAL__SIGNATURES =for apidoc Amnh||WARN_SYSCALLS -=for apidoc Amnh||WARN_EXPERIMENTAL__BITWISE =for apidoc Amnh||WARN_EXPERIMENTAL__CONST_ATTR =for apidoc Amnh||WARN_EXPERIMENTAL__RE_STRICT =for apidoc Amnh||WARN_EXPERIMENTAL__REFALIASING @@ -317,13 +336,11 @@ category parameters passed. =for apidoc Amnh||WARN_MISSING =for apidoc Amnh||WARN_REDUNDANT =for apidoc Amnh||WARN_EXPERIMENTAL__DECLARED_REFS -=for apidoc Amnh||WARN_EXPERIMENTAL__ALPHA_ASSERTIONS -=for apidoc Amnh||WARN_EXPERIMENTAL__SCRIPT_RUN +=for apidoc Amnh||WARN_DEPRECATED__DOT_IN_INC =for apidoc Amnh||WARN_SHADOW =for apidoc Amnh||WARN_EXPERIMENTAL__PRIVATE_USE =for apidoc Amnh||WARN_EXPERIMENTAL__UNIPROP_WILDCARDS =for apidoc Amnh||WARN_EXPERIMENTAL__VLB -=for apidoc Amnh||WARN_EXPERIMENTAL__ISA =for apidoc Amnh||WARN_EXPERIMENTAL__TRY =for apidoc Amnh||WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES =for apidoc Amnh||WARN_EXPERIMENTAL__BUILTIN @@ -331,10 +348,15 @@ category parameters passed. =for apidoc Amnh||WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS =for apidoc Amnh||WARN_EXPERIMENTAL__FOR_LIST =for apidoc Amnh||WARN_SCALAR +=for apidoc Amnh||WARN_DEPRECATED__VERSION_DOWNGRADE +=for apidoc Amnh||WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED +=for apidoc Amnh||WARN_EXPERIMENTAL__CLASS +=for apidoc Amnh||WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR +=for apidoc Amnh||WARN_DEPRECATED__SMARTMATCH =cut */ /* end of file warnings.h */ -/* ex: set ro: */ +/* ex: set ro ft=c: */ Index: gnu/usr.bin/perl/zaphod32_hash.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/zaphod32_hash.h,v diff -u -p -a -u -p -r1.1.1.3 zaphod32_hash.h --- gnu/usr.bin/perl/zaphod32_hash.h 15 Feb 2023 01:31:52 -0000 1.1.1.3 +++ gnu/usr.bin/perl/zaphod32_hash.h 21 Feb 2024 15:47:03 -0000 @@ -133,12 +133,17 @@ void zaphod32_seed_state ( const U32 *seed= (const U32 *)seed_ch; U32 *state= (U32 *)state_ch; - /* hex expansion of pi, skipping first two digits. pi= 3.2[43f6...]*/ - /* pi value in hex from here: - * http://turner.faculty.swau.edu/mathematics/materialslibrary/pi/pibases.html*/ - /* Ensure that the three state vectors are nonzero regardless of the seed. */ - /* The idea of these two steps is to ensure that the 0 state comes from a seed - * utterly unlike that of the value we replace it with.*/ + /* hex expansion of PI, skipping first two digits. PI= 3.2[43f6...] + * + * PI value in hex from here: + * + * http://turner.faculty.swau.edu/mathematics/materialslibrary/pi/pibases.html + * + * Ensure that the three state vectors are nonzero regardless of + * the seed. The idea of these two steps is to ensure that the 0 + * state comes from a seed utterly unlike that of the value we + * replace it with. + */ state[0]= seed[0] ^ 0x43f6a888; state[1]= seed[1] ^ 0x5a308d31; state[2]= seed[2] ^ 0x3198a2e0; @@ -178,7 +183,7 @@ U32 zaphod32_hash_with_state( const U8 *key, const STRLEN key_len ) { - U32 *state= (U32 *)state_ch; + const U32 *state= (const U32 *)state_ch; const U8 *end; STRLEN len = key_len; U32 v0= state[0]; Index: gnu/usr.bin/perl/Cross/README.new =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Cross/README.new,v diff -u -p -a -u -p -r1.1.1.3 README.new --- gnu/usr.bin/perl/Cross/README.new 1 Mar 2021 23:15:43 -0000 1.1.1.3 +++ gnu/usr.bin/perl/Cross/README.new 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + You're reading ./Cross/README.new, describing Perl cross-compilation process. NOTE: this file will replace ./Cross/README, after the cross-compilation scheme is stabilized. Index: gnu/usr.bin/perl/Cross/config.sh-arm-linux =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Cross/config.sh-arm-linux,v diff -u -p -a -u -p -r1.17 config.sh-arm-linux --- gnu/usr.bin/perl/Cross/config.sh-arm-linux 23 Dec 2023 21:02:20 -0000 1.17 +++ gnu/usr.bin/perl/Cross/config.sh-arm-linux 21 Feb 2024 15:47:00 -0000 @@ -32,11 +32,11 @@ alignbytes='4' aphostname='/bin/hostname' api_revision='5' api_subversion='0' -api_version='36' -api_versionstring='5.36.0' +api_version='38' +api_versionstring='5.38.0' ar='ar' -archlib='/usr/lib/perl5/5.36.3/armv4l-linux' -archlibexp='/usr/lib/perl5/5.36.3/armv4l-linux' +archlib='/usr/lib/perl5/5.38.2/armv4l-linux' +archlibexp='/usr/lib/perl5/5.38.2/armv4l-linux' archname64='' archname='armv4l-linux' archobjs='' @@ -55,7 +55,7 @@ castflags='0' cat='cat' cc='cc' cccdlflags='-fpic' -ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.36.3/armv4l-linux/CORE' +ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.38.2/armv4l-linux/CORE' ccflags='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' ccname='arm-linux-gcc' @@ -124,6 +124,7 @@ d_attribute_nonnull='undef' d_attribute_noreturn='undef' d_attribute_pure='undef' d_attribute_unused='undef' +d_attribute_visibility='undef' d_attribute_warn_unused_result='undef' d_backtrace='undef' d_bsd='undef' @@ -489,6 +490,7 @@ d_semget='define' d_semop='define' d_sendmsg='define' d_setegid='define' +d_setenv='undef' d_seteuid='define' d_setgrent='define' d_setgrent_r='undef' @@ -737,6 +739,7 @@ html3dir=' ' html3direxp='' i16size='2' i16type='short' +i32dformat='"ld"' i32size='4' i32type='long' i64size='8' @@ -807,6 +810,7 @@ i_syssockio='undef' i_sysstat='define' i_sysstatfs='define' i_sysstatvfs='define' +i_syssyscall='undef' i_systime='define' i_systimek='undef' i_systimes='define' @@ -831,7 +835,7 @@ inc_version_list=' ' inc_version_list_init='0' incpath='' inews='' -installarchlib='./install_me_here/usr/lib/perl5/5.36.3/armv4l-linux' +installarchlib='./install_me_here/usr/lib/perl5/5.38.2/armv4l-linux' installbin='./install_me_here/usr/bin' installhtml1dir='' installhtml3dir='' @@ -839,13 +843,13 @@ installman1dir='./install_me_here/usr/sh installman3dir='./install_me_here/usr/share/man/man3' installprefix='./install_me_here/usr' installprefixexp='./install_me_here/usr' -installprivlib='./install_me_here/usr/lib/perl5/5.36.3' +installprivlib='./install_me_here/usr/lib/perl5/5.38.2' installscript='./install_me_here/usr/bin' -installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.36.3/armv4l-linux' +installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.38.2/armv4l-linux' installsitebin='./install_me_here/usr/bin' installsitehtml1dir='' installsitehtml3dir='' -installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.36.3' +installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.38.2' installsiteman1dir='./install_me_here/usr/share/man/man1' installsiteman3dir='./install_me_here/usr/share/man/man3' installsitescript='./install_me_here/usr/bin' @@ -980,8 +984,8 @@ pmake='' pr='' prefix='/usr' prefixexp='/usr' -privlib='/usr/lib/perl5/5.36.3' -privlibexp='/usr/lib/perl5/5.36.3' +privlib='/usr/lib/perl5/5.38.2' +privlibexp='/usr/lib/perl5/5.38.2' procselfexe='"/proc/self/exe"' prototype='define' ptrsize='4' @@ -1046,17 +1050,17 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 6, 17, 29, 31, 0' sig_size='68' signal_t='void' -sitearch='/usr/lib/perl5/site_perl/5.36.3/armv4l-linux' -sitearchexp='/usr/lib/perl5/site_perl/5.36.3/armv4l-linux' +sitearch='/usr/lib/perl5/site_perl/5.38.2/armv4l-linux' +sitearchexp='/usr/lib/perl5/site_perl/5.38.2/armv4l-linux' sitebin='/usr/bin' sitebinexp='/usr/bin' sitehtml1dir='' sitehtml1direxp='' sitehtml3dir='' sitehtml3direxp='' -sitelib='/usr/lib/perl5/site_perl/5.36.3' +sitelib='/usr/lib/perl5/site_perl/5.38.2' sitelib_stem='/usr/lib/perl5/site_perl' -sitelibexp='/usr/lib/perl5/site_perl/5.36.3' +sitelibexp='/usr/lib/perl5/site_perl/5.38.2' siteman1dir='/usr/share/man/man1' siteman1direxp='/usr/share/man/man1' siteman3dir='/usr/share/man/man3' @@ -1097,7 +1101,7 @@ stdio_stream_array='' strerror_r_proto='0' strings='/usr/include/string.h' submit='' -subversion='3' +subversion='2' sysman='/usr/share/man/man1' tail='' tar='' @@ -1117,8 +1121,12 @@ troff='' ttyname_r_proto='0' u16size='2' u16type='unsigned short' +u32XUformat='"lX"' +u32oformat='"lo"' u32size='4' u32type='unsigned long' +u32uformat='"lu"' +u32xformat='"lx"' u64size='8' u64type='unsigned long long' u8size='1' @@ -1188,8 +1196,8 @@ vendorprefix='' vendorprefixexp='' vendorscript='' vendorscriptexp='' -version='5.36.3' -version_patchlevel_string='version 36 subversion 3' +version='5.38.2' +version_patchlevel_string='version 38 subversion 2' versiononly='undef' vi='' xlibpth='/usr/lib/386 /lib/386' @@ -1203,10 +1211,10 @@ config_arg0='Configure' config_args='' config_argc=0 PERL_REVISION=5 -PERL_VERSION=36 -PERL_SUBVERSION=3 +PERL_VERSION=38 +PERL_SUBVERSION=2 PERL_API_REVISION=5 -PERL_API_VERSION=36 +PERL_API_VERSION=38 PERL_API_SUBVERSION=0 PERL_PATCHLEVEL= PERL_CONFIG_SH=true Index: gnu/usr.bin/perl/Cross/config.sh-arm-linux-n770 =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Cross/config.sh-arm-linux-n770,v diff -u -p -a -u -p -r1.14 config.sh-arm-linux-n770 --- gnu/usr.bin/perl/Cross/config.sh-arm-linux-n770 23 Dec 2023 21:02:20 -0000 1.14 +++ gnu/usr.bin/perl/Cross/config.sh-arm-linux-n770 21 Feb 2024 15:47:00 -0000 @@ -32,11 +32,11 @@ alignbytes='4' aphostname='/bin/hostname' api_revision='5' api_subversion='0' -api_version='36' -api_versionstring='5.36.0' +api_version='38' +api_versionstring='5.38.0' ar='ar' -archlib='/usr/lib/perl5/5.36.3/armv4l-linux' -archlibexp='/usr/lib/perl5/5.36.3/armv4l-linux' +archlib='/usr/lib/perl5/5.38.2/armv4l-linux' +archlibexp='/usr/lib/perl5/5.38.2/armv4l-linux' archname64='' archname='armv4l-linux' archobjs='' @@ -54,7 +54,7 @@ castflags='0' cat='cat' cc='arm-none-linux-gnueabi-gcc' cccdlflags='-fpic' -ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.36.3/armv4l-linux/CORE' +ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.38.2/armv4l-linux/CORE' ccflags='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' ccname='arm-linux-gcc' @@ -123,6 +123,7 @@ d_attribute_nonnull='undef' d_attribute_noreturn='undef' d_attribute_pure='undef' d_attribute_unused='undef' +d_attribute_visibility='undef' d_attribute_warn_unused_result='undef' d_backtrace='undef' d_bsd='undef' @@ -488,6 +489,7 @@ d_semget='define' d_semop='define' d_sendmsg='define' d_setegid='define' +d_setenv='undef' d_seteuid='define' d_setgrent='define' d_setgrent_r='undef' @@ -735,6 +737,7 @@ html3dir=' ' html3direxp='' i16size='2' i16type='short' +i32dformat='"ld"' i32size='4' i32type='long' i64size='8' @@ -805,6 +808,7 @@ i_syssockio='undef' i_sysstat='define' i_sysstatfs='define' i_sysstatvfs='define' +i_syssyscall='undef' i_systime='define' i_systimek='undef' i_systimes='define' @@ -829,7 +833,7 @@ inc_version_list=' ' inc_version_list_init='0' incpath='' inews='' -installarchlib='./install_me_here/usr/lib/perl5/5.36.3/armv4l-linux' +installarchlib='./install_me_here/usr/lib/perl5/5.38.2/armv4l-linux' installbin='./install_me_here/usr/bin' installhtml1dir='' installhtml3dir='' @@ -837,13 +841,13 @@ installman1dir='./install_me_here/usr/sh installman3dir='./install_me_here/usr/share/man/man3' installprefix='./install_me_here/usr' installprefixexp='./install_me_here/usr' -installprivlib='./install_me_here/usr/lib/perl5/5.36.3' +installprivlib='./install_me_here/usr/lib/perl5/5.38.2' installscript='./install_me_here/usr/bin' -installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.36.3/armv4l-linux' +installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.38.2/armv4l-linux' installsitebin='./install_me_here/usr/bin' installsitehtml1dir='' installsitehtml3dir='' -installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.36.3' +installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.38.2' installsiteman1dir='./install_me_here/usr/share/man/man1' installsiteman3dir='./install_me_here/usr/share/man/man3' installsitescript='./install_me_here/usr/bin' @@ -978,8 +982,8 @@ pmake='' pr='' prefix='/usr' prefixexp='/usr' -privlib='/usr/lib/perl5/5.36.3' -privlibexp='/usr/lib/perl5/5.36.3' +privlib='/usr/lib/perl5/5.38.2' +privlibexp='/usr/lib/perl5/5.38.2' procselfexe='"/proc/self/exe"' prototype='define' ptrsize='4' @@ -1044,17 +1048,17 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 6, 17, 29, 31, 0' sig_size='68' signal_t='void' -sitearch='/usr/lib/perl5/site_perl/5.36.3/armv4l-linux' -sitearchexp='/usr/lib/perl5/site_perl/5.36.3/armv4l-linux' +sitearch='/usr/lib/perl5/site_perl/5.38.2/armv4l-linux' +sitearchexp='/usr/lib/perl5/site_perl/5.38.2/armv4l-linux' sitebin='/usr/bin' sitebinexp='/usr/bin' sitehtml1dir='' sitehtml1direxp='' sitehtml3dir='' sitehtml3direxp='' -sitelib='/usr/lib/perl5/site_perl/5.36.3' +sitelib='/usr/lib/perl5/site_perl/5.38.2' sitelib_stem='/usr/lib/perl5/site_perl' -sitelibexp='/usr/lib/perl5/site_perl/5.36.3' +sitelibexp='/usr/lib/perl5/site_perl/5.38.2' siteman1dir='/usr/share/man/man1' siteman1direxp='/usr/share/man/man1' siteman3dir='/usr/share/man/man3' @@ -1095,7 +1099,7 @@ stdio_stream_array='' strerror_r_proto='0' strings='/usr/include/string.h' submit='' -subversion='3' +subversion='2' sysman='/usr/share/man/man1' tail='' tar='' @@ -1115,8 +1119,12 @@ troff='' ttyname_r_proto='0' u16size='2' u16type='unsigned short' +u32XUformat='"lX"' +u32oformat='"lo"' u32size='4' u32type='unsigned long' +u32uformat='"lu"' +u32xformat='"lx"' u64size='8' u64type='unsigned long long' u8size='1' @@ -1186,8 +1194,8 @@ vendorprefix='' vendorprefixexp='' vendorscript='' vendorscriptexp='' -version='5.36.3' -version_patchlevel_string='version 36 subversion 3' +version='5.38.2' +version_patchlevel_string='version 38 subversion 2' versiononly='undef' vi='' xlibpth='/usr/lib/386 /lib/386' @@ -1201,10 +1209,10 @@ config_arg0='Configure' config_args='' config_argc=0 PERL_REVISION=5 -PERL_VERSION=36 -PERL_SUBVERSION=3 +PERL_VERSION=38 +PERL_SUBVERSION=2 PERL_API_REVISION=5 -PERL_API_VERSION=36 +PERL_API_VERSION=38 PERL_API_SUBVERSION=0 PERL_PATCHLEVEL= PERL_CONFIG_SH=true Index: gnu/usr.bin/perl/Porting/Glossary =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/Glossary,v diff -u -p -a -u -p -r1.19 Glossary --- gnu/usr.bin/perl/Porting/Glossary 15 Feb 2023 01:36:14 -0000 1.19 +++ gnu/usr.bin/perl/Porting/Glossary 21 Feb 2024 15:47:00 -0000 @@ -493,6 +493,10 @@ d_attribute_unused (d_attribut.U): and arguments may not always be used, and to not throw warnings if they don't get used. +d_attribute_visibility (d_attribut.U): + This variable conditionally defines the HASATTRIBUTE_VISIBILITY symbol, + and indicates different GCC attribute visibility + d_attribute_warn_unused_result (d_attribut.U): This variable conditionally defines HASATTRIBUTE_WARN_UNUSED_RESULT, which indicates that the C @@ -2279,6 +2283,10 @@ d_setegid (d_setegid.U): indicates to the C program that the setegid() routine is available to change the effective gid of the current program. +d_setenv (d_setenv.U): + This variable conditionally defines the HAS_SETENV symbol, which + indicates to the C program that the setenv routine is available. + d_seteuid (d_seteuid.U): This variable conditionally defines the HAS_SETEUID symbol, which indicates to the C program that the seteuid() routine is available @@ -3501,6 +3509,10 @@ i16size (perlxv.U): i16type (perlxv.U): This variable contains the C type used for Perl's I16. +i32dformat (perlx32f.U): + This variable contains the format string used for printing + a Perl I32 as a signed decimal integer. + i32size (perlxv.U): This variable is the size of an I32 in bytes. @@ -3795,6 +3807,10 @@ i_sysstatvfs (i_sysstatvfs.U): This variable conditionally defines the I_SYSSTATVFS symbol, and indicates whether a C program should include . +i_syssyscall (i_syssyscall.U): + This variable conditionally defines the I_SYS_SYSCALL symbol, + and indicates whether a C program should include . + i_systime (i_time.U): This variable conditionally defines I_SYS_TIME, which indicates to the C program that it should include . @@ -5518,11 +5534,27 @@ u16size (perlxv.U): u16type (perlxv.U): This variable contains the C type used for Perl's U16. +u32oformat (perlx32f.U): + This variable contains the format string used for printing + a Perl U32 as an unsigned octal integer. + u32size (perlxv.U): This variable is the size of an U32 in bytes. u32type (perlxv.U): This variable contains the C type used for Perl's U32. + +u32uformat (perlx32f.U): + This variable contains the format string used for printing + a Perl U32 as an unsigned decimal integer. + +u32xformat (perlx32f.U): + This variable contains the format string used for printing + a Perl U32 as an unsigned hexadecimal integer in lowercase abcdef. + +u32XUformat (perlx32f.U): + This variable contains the format string used for printing + a Perl U32 as an unsigned hexadecimal integer in uppercase ABCDEF. u64size (perlxv.U): This variable is the size of an U64 in bytes. Index: gnu/usr.bin/perl/Porting/Maintainers.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/Maintainers.pl,v diff -u -p -a -u -p -r1.24 Maintainers.pl --- gnu/usr.bin/perl/Porting/Maintainers.pl 15 Feb 2023 01:38:21 -0000 1.24 +++ gnu/usr.bin/perl/Porting/Maintainers.pl 21 Feb 2024 15:47:00 -0000 @@ -142,7 +142,7 @@ use File::Glob qw(:case); }, 'autodie' => { - 'DISTRIBUTION' => 'TODDR/autodie-2.34.tar.gz', + 'DISTRIBUTION' => 'TODDR/autodie-2.36.tar.gz', 'FILES' => q[cpan/autodie], 'EXCLUDED' => [ qr{benchmarks}, @@ -172,6 +172,7 @@ use File::Glob qw(:case); 'DISTRIBUTION' => 'SMUELLER/AutoLoader-5.74.tar.gz', 'FILES' => q[cpan/AutoLoader], 'EXCLUDED' => ['t/00pod.t'], + 'CUSTOMIZED' => ['t/02AutoSplit.t'], }, 'autouse' => { @@ -186,7 +187,7 @@ use File::Glob qw(:case); }, 'bignum' => { - 'DISTRIBUTION' => 'PJACKLAM/bignum-0.65.tar.gz', + 'DISTRIBUTION' => 'PJACKLAM/bignum-0.66.tar.gz', 'FILES' => q[cpan/bignum], 'EXCLUDED' => [ qr{^xt/}, @@ -204,7 +205,7 @@ use File::Glob qw(:case); }, 'Compress::Raw::Bzip2' => { - 'DISTRIBUTION' => 'PMQS/Compress-Raw-Bzip2-2.103.tar.gz', + 'DISTRIBUTION' => 'PMQS/Compress-Raw-Bzip2-2.204.tar.gz', 'FILES' => q[cpan/Compress-Raw-Bzip2], 'EXCLUDED' => [ qr{^t/Test/}, @@ -213,10 +214,15 @@ use File::Glob qw(:case); 'bzip2-src/bzip2-cpp.patch', 'bzip2-src/bzip2-unsigned.patch', ], + 'CUSTOMIZED' => [ + # https://github.com/pmqs/Compress-Raw-Bzip2/issues/11 + 'Bzip2.xs', + 'lib/Compress/Raw/Bzip.pm' + ], }, 'Compress::Raw::Zlib' => { - 'DISTRIBUTION' => 'PMQS/Compress-Raw-Zlib-2.105.tar.gz', + 'DISTRIBUTION' => 'PMQS/Compress-Raw-Zlib-2.204.tar.gz', 'FILES' => q[cpan/Compress-Raw-Zlib], 'EXCLUDED' => [ qr{^examples/}, @@ -226,10 +232,16 @@ use File::Glob qw(:case); t/99pod.t ), ], + 'CUSTOMIZED' => [ + # https://github.com/pmqs/Compress-Raw-Zlib/issues/23 + 'lib/Compress/Raw/Zlib.pm', + 'Zlib.xs' + ], }, 'Config::Perl::V' => { - 'DISTRIBUTION' => 'HMBRAND/Config-Perl-V-0.33.tgz', + 'DISTRIBUTION' => 'HMBRAND/Config-Perl-V-0.36.tgz', + 'SYNCINFO' => 'yorton on Sat Mar 4 10:43:06 2023', 'FILES' => q[cpan/Config-Perl-V], 'EXCLUDED' => [qw( examples/show-v.pl @@ -250,7 +262,7 @@ use File::Glob qw(:case); }, 'CPAN' => { - 'DISTRIBUTION' => 'ANDK/CPAN-2.33-TRIAL.tar.gz', + 'DISTRIBUTION' => 'ANDK/CPAN-2.36.tar.gz', 'FILES' => q[cpan/CPAN], 'EXCLUDED' => [ qr{^distroprefs/}, @@ -330,7 +342,7 @@ use File::Glob qw(:case); }, 'DB_File' => { - 'DISTRIBUTION' => 'PMQS/DB_File-1.857.tar.gz', + 'DISTRIBUTION' => 'PMQS/DB_File-1.858.tar.gz', 'FILES' => q[cpan/DB_File], 'EXCLUDED' => [ qr{^patches/}, @@ -367,10 +379,15 @@ use File::Glob qw(:case); 'DISTRIBUTION' => 'TODDR/Digest-MD5-2.58.tar.gz', 'FILES' => q[cpan/Digest-MD5], 'EXCLUDED' => [ 'rfc1321.txt', 'bin/md5sum.pl' ], + 'CUSTOMIZED' => [ + # https://github.com/Dual-Life/digest-md5/pull/24 + 'MD5.pm', + 'MD5.xs' + ], }, 'Digest::SHA' => { - 'DISTRIBUTION' => 'MSHELOR/Digest-SHA-6.02.tar.gz', + 'DISTRIBUTION' => 'MSHELOR/Digest-SHA-6.04.tar.gz', 'FILES' => q[cpan/Digest-SHA], 'EXCLUDED' => [ qw( t/pod.t @@ -387,7 +404,7 @@ use File::Glob qw(:case); }, 'Encode' => { - 'DISTRIBUTION' => 'DANKOGAI/Encode-3.17.tar.gz', + 'DISTRIBUTION' => 'DANKOGAI/Encode-3.19.tar.gz', 'FILES' => q[cpan/Encode], 'EXCLUDED' => [ qw( t/whatwg-aliases.json @@ -412,13 +429,13 @@ use File::Glob qw(:case); }, 'experimental' => { - 'DISTRIBUTION' => 'LEONT/experimental-0.027.tar.gz', + 'DISTRIBUTION' => 'LEONT/experimental-0.031.tar.gz', 'FILES' => q[cpan/experimental], 'EXCLUDED' => [qr{^xt/}], }, 'Exporter' => { - 'DISTRIBUTION' => 'TODDR/Exporter-5.74.tar.gz', + 'DISTRIBUTION' => 'TODDR/Exporter-5.77.tar.gz', 'FILES' => q[dist/Exporter], 'EXCLUDED' => [ qw( t/pod.t @@ -457,7 +474,7 @@ use File::Glob qw(:case); }, 'ExtUtils::Install' => { - 'DISTRIBUTION' => 'BINGOS/ExtUtils-Install-2.20.tar.gz', + 'DISTRIBUTION' => 'BINGOS/ExtUtils-Install-2.22.tar.gz', 'FILES' => q[cpan/ExtUtils-Install], 'EXCLUDED' => [ qw( t/lib/Test/Builder.pm @@ -471,7 +488,8 @@ use File::Glob qw(:case); }, 'ExtUtils::MakeMaker' => { - 'DISTRIBUTION' => 'BINGOS/ExtUtils-MakeMaker-7.64.tar.gz', + 'DISTRIBUTION' => 'BINGOS/ExtUtils-MakeMaker-7.70.tar.gz', + 'SYNCINFO' => 'yorton on Sun Mar 26 16:20:23 2023', 'FILES' => q[cpan/ExtUtils-MakeMaker], 'EXCLUDED' => [ qr{^t/lib/Test/}, @@ -486,7 +504,7 @@ use File::Glob qw(:case); }, 'ExtUtils::PL2Bat' => { - 'DISTRIBUTION' => 'LEONT/ExtUtils-PL2Bat-0.004.tar.gz', + 'DISTRIBUTION' => 'LEONT/ExtUtils-PL2Bat-0.005.tar.gz', 'FILES' => q[cpan/ExtUtils-PL2Bat], 'EXCLUDED' => [ 't/00-compile.t', @@ -544,7 +562,7 @@ use File::Glob qw(:case); }, 'Filter::Util::Call' => { - 'DISTRIBUTION' => 'RURBAN/Filter-1.60.tar.gz', + 'DISTRIBUTION' => 'RURBAN/Filter-1.64.tar.gz', 'FILES' => q[cpan/Filter-Util-Call pod/perlfilter.pod ], @@ -555,6 +573,8 @@ use File::Glob qw(:case); qr{^lib/Filter/}, qr{^tee/}, qw( .appveyor.yml + .cirrus.yml + .github/workflows/testsuite.yml .whitesource Call/Makefile.PL Call/ppport.h @@ -587,12 +607,12 @@ use File::Glob qw(:case); }, 'FindBin' => { - 'DISTRIBUTION' => 'TODDR/FindBin-1.52.tar.gz', + 'DISTRIBUTION' => 'TODDR/FindBin-1.53.tar.gz', 'FILES' => q[dist/FindBin], }, 'Getopt::Long' => { - 'DISTRIBUTION' => 'JV/Getopt-Long-2.52.tar.gz', + 'DISTRIBUTION' => 'JV/Getopt-Long-2.54.tar.gz', 'FILES' => q[cpan/Getopt-Long], 'EXCLUDED' => [ qr{^examples/}, @@ -603,9 +623,10 @@ use File::Glob qw(:case); }, 'HTTP::Tiny' => { - 'DISTRIBUTION' => 'DAGOLDEN/HTTP-Tiny-0.080.tar.gz', + 'DISTRIBUTION' => 'DAGOLDEN/HTTP-Tiny-0.086.tar.gz', 'FILES' => q[cpan/HTTP-Tiny], 'EXCLUDED' => [ + 'corpus/snake-oil.crt', # only used by 210_live_ssl.t 't/00-report-prereqs.t', 't/00-report-prereqs.dd', 't/200_live.t', @@ -632,13 +653,13 @@ use File::Glob qw(:case); }, 'IO' => { - 'DISTRIBUTION' => 'TODDR/IO-1.50.tar.gz', + 'DISTRIBUTION' => 'TODDR/IO-1.51.tar.gz', 'FILES' => q[dist/IO], 'EXCLUDED' => ['t/test.pl'], }, 'IO-Compress' => { - 'DISTRIBUTION' => 'PMQS/IO-Compress-2.106.tar.gz', + 'DISTRIBUTION' => 'PMQS/IO-Compress-2.204.tar.gz', 'MAIN_MODULE' => 'IO::Compress::Base', 'FILES' => q[cpan/IO-Compress], 'EXCLUDED' => [ @@ -657,10 +678,14 @@ use File::Glob qw(:case); 'EXCLUDED' => [ qr{^examples/}, ], + 'CUSTOMIZED' => [ + # https://rt.cpan.org/Ticket/Display.html?id=148293 + 'lib/IO/Socket/IP.pm' + ], }, 'IO::Zlib' => { - 'DISTRIBUTION' => 'TOMHUGHES/IO-Zlib-1.11.tar.gz', + 'DISTRIBUTION' => 'TOMHUGHES/IO-Zlib-1.14.tar.gz', 'FILES' => q[cpan/IO-Zlib], }, @@ -680,7 +705,7 @@ use File::Glob qw(:case); }, 'JSON::PP' => { - 'DISTRIBUTION' => 'ISHIGAKI/JSON-PP-4.07.tar.gz', + 'DISTRIBUTION' => 'ISHIGAKI/JSON-PP-4.16.tar.gz', 'FILES' => q[cpan/JSON-PP], }, @@ -695,7 +720,8 @@ use File::Glob qw(:case); }, 'libnet' => { - 'DISTRIBUTION' => 'SHAY/libnet-3.13.tar.gz', + 'DISTRIBUTION' => 'SHAY/libnet-3.15.tar.gz', + 'SYNCINFO' => 'yorton on Mon Mar 20 20:48:38 2023', 'MAIN_MODULE' => 'Net::Cmd', 'FILES' => q[cpan/libnet], 'EXCLUDED' => [ @@ -708,27 +734,10 @@ use File::Glob qw(:case); qr(^demos/), qr(^t/external/), ], - # https://github.com/steve-m-hay/perl-libnet/pull/45 - 'CUSTOMIZED' => [ - 'lib/Net/Cmd.pm', - 'lib/Net/Config.pm', - 'lib/Net/Domain.pm', - 'lib/Net/FTP.pm', - 'lib/Net/FTP/A.pm', - 'lib/Net/FTP/E.pm', - 'lib/Net/FTP/I.pm', - 'lib/Net/FTP/L.pm', - 'lib/Net/FTP/dataconn.pm', - 'lib/Net/NNTP.pm', - 'lib/Net/Netrc.pm', - 'lib/Net/POP3.pm', - 'lib/Net/SMTP.pm', - 'lib/Net/Time.pm', - ], }, 'Locale::Maketext' => { - 'DISTRIBUTION' => 'TODDR/Locale-Maketext-1.29.tar.gz', + 'DISTRIBUTION' => 'TODDR/Locale-Maketext-1.32.tar.gz', 'FILES' => q[dist/Locale-Maketext], 'EXCLUDED' => [ qw( @@ -749,7 +758,7 @@ use File::Glob qw(:case); }, 'Math::BigInt' => { - 'DISTRIBUTION' => 'PJACKLAM/Math-BigInt-1.999830.tar.gz', + 'DISTRIBUTION' => 'PJACKLAM/Math-BigInt-1.999837.tar.gz', 'FILES' => q[cpan/Math-BigInt], 'EXCLUDED' => [ qr{^xt/}, @@ -763,7 +772,7 @@ use File::Glob qw(:case); }, 'Math::BigInt::FastCalc' => { - 'DISTRIBUTION' => 'PJACKLAM/Math-BigInt-FastCalc-0.5012.tar.gz', + 'DISTRIBUTION' => 'PJACKLAM/Math-BigInt-FastCalc-0.5013.tar.gz', 'FILES' => q[cpan/Math-BigInt-FastCalc], 'EXCLUDED' => [ qr{^inc/}, @@ -788,7 +797,7 @@ use File::Glob qw(:case); }, 'Math::BigRat' => { - 'DISTRIBUTION' => 'PJACKLAM/Math-BigRat-0.2621.tar.gz', + 'DISTRIBUTION' => 'PJACKLAM/Math-BigRat-0.2624.tar.gz', 'FILES' => q[cpan/Math-BigRat], 'EXCLUDED' => [ qr{^xt/}, @@ -803,13 +812,7 @@ use File::Glob qw(:case); 'Math::Complex' => { 'DISTRIBUTION' => 'ZEFRAM/Math-Complex-1.59.tar.gz', - 'FILES' => q[cpan/Math-Complex], - 'CUSTOMIZED' => [ - 'lib/Math/Complex.pm', # CPAN RT 118467 - 't/Complex.t', # CPAN RT 118467 - 't/Trig.t', # CPAN RT 118467 - 't/underbar.t', - ], + 'FILES' => q[dist/Math-Complex], 'EXCLUDED' => [ qw( t/pod.t t/pod-coverage.t @@ -818,29 +821,25 @@ use File::Glob qw(:case); }, 'Memoize' => { - 'DISTRIBUTION' => 'MJD/Memoize-1.03.tgz', + 'DISTRIBUTION' => 'ARISTOTLE/Memoize-1.16.tar.gz', 'FILES' => q[cpan/Memoize], - 'EXCLUDED' => ['article.html'], - 'CUSTOMIZED' => [ - # CVE-2016-1238 - qw( Memoize.pm ), - - # CPAN RT 108382 - qw( t/expmod_t.t t/speed.t ), - - # CPAN RT 139736 - qw( t/errors.t t/tie_gdbm.t ), - ], + 'EXCLUDED' => [ qr{^inc/} ], }, 'MIME::Base64' => { 'DISTRIBUTION' => 'CAPOEIRAB/MIME-Base64-3.16.tar.gz', 'FILES' => q[cpan/MIME-Base64], 'EXCLUDED' => [ qr{^xt/}, 'benchmark', 'benchmark-qp', qr{^t/00-report-prereqs} ], + 'CUSTOMIZED' => [ + # https://github.com/Dual-Life/mime-base64/pull/17 + 'Base64.xs', + 'lib/MIME/Base64.pm' + ], }, 'Module::CoreList' => { - 'DISTRIBUTION' => 'BINGOS/Module-CoreList-5.20220320.tar.gz', + 'DISTRIBUTION' => 'BINGOS/Module-CoreList-5.20230320.tar.gz', + 'SYNCINFO' => 'yorton on Tue Mar 21 11:46:02 2023', 'FILES' => q[dist/Module-CoreList], }, @@ -871,7 +870,7 @@ use File::Glob qw(:case); }, 'Net::Ping' => { - 'DISTRIBUTION' => 'RURBAN/Net-Ping-2.74.tar.gz', + 'DISTRIBUTION' => 'RURBAN/Net-Ping-2.75.tar.gz', 'FILES' => q[dist/Net-Ping], 'EXCLUDED' => [ qr{^\.[awc]}, @@ -885,16 +884,6 @@ use File::Glob qw(:case); qw(t/appveyor-test.bat), ], - 'CUSTOMIZED' => [ - qw{ - t/000_load.t - t/001_new.t - t/010_pingecho.t - t/450_service.t - t/500_ping_icmp.t - t/501_ping_icmpv6.t - } - ], }, 'NEXT' => { @@ -909,7 +898,7 @@ use File::Glob qw(:case); }, 'parent' => { - 'DISTRIBUTION' => 'CORION/parent-0.238.tar.gz', + 'DISTRIBUTION' => 'CORION/parent-0.241.tar.gz', 'FILES' => q[cpan/parent], 'EXCLUDED' => [ qr{^xt} @@ -939,12 +928,12 @@ use File::Glob qw(:case); }, 'PerlIO::via::QuotedPrint' => { - 'DISTRIBUTION' => 'SHAY/PerlIO-via-QuotedPrint-0.09.tar.gz', + 'DISTRIBUTION' => 'SHAY/PerlIO-via-QuotedPrint-0.10.tar.gz', 'FILES' => q[cpan/PerlIO-via-QuotedPrint], }, 'Pod::Checker' => { - 'DISTRIBUTION' => 'MAREKR/Pod-Checker-1.74.tar.gz', + 'DISTRIBUTION' => 'MAREKR/Pod-Checker-1.75.tar.gz', 'FILES' => q[cpan/Pod-Checker], }, @@ -987,7 +976,7 @@ use File::Glob qw(:case); }, 'Pod::Usage' => { - 'DISTRIBUTION' => 'ATOOMIC/Pod-Usage-2.01.tar.gz', + 'DISTRIBUTION' => 'MAREKR/Pod-Usage-2.03.tar.gz', 'FILES' => q[cpan/Pod-Usage], 'EXCLUDED' => [ qr{^t/00-}, @@ -996,19 +985,12 @@ use File::Glob qw(:case); }, 'podlators' => { - 'DISTRIBUTION' => 'RRA/podlators-4.14.tar.gz', + 'DISTRIBUTION' => 'RRA/podlators-5.01.tar.gz', 'MAIN_MODULE' => 'Pod::Man', 'FILES' => q[cpan/podlators pod/perlpodstyle.pod], 'EXCLUDED' => [ - qr{^docs/metadata/}, - ], - - # https://github.com/rra/podlators/pull/15 - 'CUSTOMIZED' => [ - 't/general/basic.t', - 't/man/empty.t', - 't/man/no-encode.t', - 't/text/invalid.t', + qr{^\.github/dependabot\.yml}, + qr{^\.github/workflows/build\.yaml}, ], 'MAP' => { @@ -1024,7 +1006,7 @@ use File::Glob qw(:case); }, 'Scalar::Util' => { - 'DISTRIBUTION' => 'PEVANS/Scalar-List-Utils-1.62.tar.gz', + 'DISTRIBUTION' => 'PEVANS/Scalar-List-Utils-1.63.tar.gz', 'FILES' => q[cpan/Scalar-List-Utils], }, @@ -1040,14 +1022,8 @@ use File::Glob qw(:case); }, 'Socket' => { - 'DISTRIBUTION' => 'PEVANS/Socket-2.032.tar.gz', + 'DISTRIBUTION' => 'PEVANS/Socket-2.036.tar.gz', 'FILES' => q[cpan/Socket], - # https://rt.cpan.org/Ticket/Display.html?id=142470&results=b81893fab36c7e48a07b4b763c03731a - # maybe others - 'CUSTOMIZED' => [ - 'Socket.pm', - 'Socket.xs', - ], }, 'Storable' => { @@ -1089,7 +1065,7 @@ use File::Glob qw(:case); }, 'Term::Cap' => { - 'DISTRIBUTION' => 'JSTOWE/Term-Cap-1.17.tar.gz', + 'DISTRIBUTION' => 'JSTOWE/Term-Cap-1.18.tar.gz', 'FILES' => q[cpan/Term-Cap], }, @@ -1130,7 +1106,9 @@ use File::Glob qw(:case); }, 'Test::Simple' => { - 'DISTRIBUTION' => 'EXODIST/Test-Simple-1.302190.tar.gz', + 'DISTRIBUTION' => 'EXODIST/Test-Simple-1.302194.tar.gz', + 'SYNCINFO' => 'yorton on Tue Mar 14 13:43:38 2023', + 'SYNCINFO' => 'yorton on Mon Mar 6 19:16:42 2023', 'FILES' => q[cpan/Test-Simple], 'EXCLUDED' => [ qr{^examples/}, @@ -1150,14 +1128,8 @@ use File::Glob qw(:case); }, 'Text::Balanced' => { - 'DISTRIBUTION' => 'SHAY/Text-Balanced-2.04.tar.gz', + 'DISTRIBUTION' => 'SHAY/Text-Balanced-2.06.tar.gz', 'FILES' => q[cpan/Text-Balanced], - 'EXCLUDED' => [ - qw( t/97_meta.t - t/98_pod.t - t/99_pmv.t - ), - ], }, 'Text::ParseWords' => { @@ -1215,7 +1187,6 @@ use File::Glob qw(:case); qr{^examples/}, qw( t/pod.t t/test.pl - threads.h ), ], }, @@ -1225,7 +1196,6 @@ use File::Glob qw(:case); 'FILES' => q[dist/threads-shared], 'EXCLUDED' => [ qw( examples/class.pl - shared.h t/pod.t t/test.pl ), @@ -1233,7 +1203,7 @@ use File::Glob qw(:case); }, 'Tie::File' => { - 'DISTRIBUTION' => 'TODDR/Tie-File-1.05.tar.gz', + 'DISTRIBUTION' => 'TODDR/Tie-File-1.07.tar.gz', 'FILES' => q[dist/Tie-File], }, @@ -1271,6 +1241,11 @@ use File::Glob qw(:case); 'DISTRIBUTION' => 'ESAYM/Time-Piece-1.3401.tar.gz', 'FILES' => q[cpan/Time-Piece], 'EXCLUDED' => [ qw[reverse_deps.txt] ], + 'CUSTOMIZED' => [ + # https://github.com/Dual-Life/Time-Piece/pull/64 + 'Piece.pm', + 'Piece.xs' + ], }, 'Unicode::Collate' => { @@ -1316,7 +1291,9 @@ use File::Glob qw(:case); # to delete an entire block out of lib/version.pm, since that code is # only necessary with the CPAN release. 'CUSTOMIZED' => [ - 'lib/version.pm' + 'lib/version.pm', + + 't/07locale.t' ], 'MAP' => { @@ -1335,7 +1312,7 @@ use File::Glob qw(:case); }, 'Win32' => { - 'DISTRIBUTION' => "JDB/Win32-0.58.tar.gz", + 'DISTRIBUTION' => "JDB/Win32-0.59.tar.gz", 'FILES' => q[cpan/Win32], }, @@ -1468,6 +1445,7 @@ use File::Glob qw(:case); lib/Time/tm.pm lib/UNIVERSAL.pm lib/Unicode/README + lib/Unicode/testnorm.t lib/Unicode/UCD.{pm,t} lib/User/grent.{pm,t} lib/User/pwent.{pm,t} @@ -1512,9 +1490,16 @@ use File::Glob qw(:case); }, ); + # legacy CPAN flag -for ( values %Modules ) { - $_->{CPAN} = !!$_->{DISTRIBUTION}; +for my $mod_name ( keys %Modules ) { + my $data = $Modules{$mod_name}; + $data->{CPAN} = !!$data->{DISTRIBUTION}; + my (@files)= split /\s+/, $data->{FILES}; + if (@files and $files[0]=~s!^(cpan|dist)/!!) { + $DistName{$files[0]} = $mod_name; + $DistName{"$1/$files[0]"} = $mod_name; + } } # legacy UPSTREAM flag Index: gnu/usr.bin/perl/Porting/README.pod =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/README.pod,v diff -u -p -a -u -p -r1.6 README.pod --- gnu/usr.bin/perl/Porting/README.pod 15 Feb 2023 01:36:14 -0000 1.6 +++ gnu/usr.bin/perl/Porting/README.pod 21 Feb 2024 15:47:00 -0000 @@ -37,12 +37,6 @@ number in various files within the perl Check source code for ANSI-C violations. -=head2 F - -Used by F to ensure the F list is up to -date. See also L<< /"F" >> for a way to automatically -fix issues found by this tool. - =head2 F Check where the symbols defined in the various F-clones @@ -146,6 +140,11 @@ The charter of the Perl Documentation Te List of Perl release epigraphs. +=head2 F + +List of base 64 encoded SHA256 digests of C<< "name " >> data +which should be ignored by F. + =head2 F This file contains a list of files that F will ensure get an @@ -360,6 +359,11 @@ and case are ignored, as explained in L< Script to help out with syncing cpan distros. +=head2 F + +Test modules in F against the perl in C. Used in the +github workflow to test against older perls. + =head2 F A little program to test the limits of your system's time functions. See @@ -381,10 +385,15 @@ any previous attempts. =head2 F This script will automatically update AUTHORS and create .mailmap entries -based on the git commit log history. If F complains +based on the git commit log history. If F complains during testing you should run this. It will automatically fix most if not all AUTHORS related test fails. +=head2 F + +The class used by F to do its business. Package name +C. + =head2 F A post-processor for C. F is a @@ -398,4 +407,3 @@ leaks. Guide for Vote Administrators for running Steering Council elections. =cut - Index: gnu/usr.bin/perl/Porting/acknowledgements.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/acknowledgements.pl,v diff -u -p -a -u -p -r1.1.1.5 acknowledgements.pl --- gnu/usr.bin/perl/Porting/acknowledgements.pl 15 Feb 2023 01:33:12 -0000 1.1.1.5 +++ gnu/usr.bin/perl/Porting/acknowledgements.pl 21 Feb 2024 15:47:00 -0000 @@ -163,5 +163,5 @@ sub commify { # returns a list of the authors sub authors { return - qx(git log --pretty=fuller $since_until | $^X Porting/checkAUTHORS.pl --who -); + qx($^X Porting/updateAUTHORS.pl --who $since_until); } Index: gnu/usr.bin/perl/Porting/bench.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/bench.pl,v diff -u -p -a -u -p -r1.4 bench.pl --- gnu/usr.bin/perl/Porting/bench.pl 15 Feb 2023 01:36:14 -0000 1.4 +++ gnu/usr.bin/perl/Porting/bench.pl 21 Feb 2024 15:47:00 -0000 @@ -902,22 +902,22 @@ sub parse_cachegrind { die "Error: while executing $id:\n" . "unexpected code or cachegrind output:\n$_\n"; } - if (/I refs:\s+([\d,]+)/) { + if (/I\s+refs:\s+([\d,]+)/) { $res{Ir} = $1; } - elsif (/I1 misses:\s+([\d,]+)/) { + elsif (/I1\s+misses:\s+([\d,]+)/) { $res{Ir_m1} = $1; } - elsif (/LLi misses:\s+([\d,]+)/) { + elsif (/LLi\s+misses:\s+([\d,]+)/) { $res{Ir_mm} = $1; } - elsif (/D refs:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) { + elsif (/D\s+refs:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) { @res{qw(Dr Dw)} = ($1,$2); } - elsif (/D1 misses:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) { + elsif (/D1\s+misses:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) { @res{qw(Dr_m1 Dw_m1)} = ($1,$2); } - elsif (/LLd misses:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) { + elsif (/LLd\s+misses:\s+.*?([\d,]+) rd .*?([\d,]+) wr/) { @res{qw(Dr_mm Dw_mm)} = ($1,$2); } elsif (/Branches:\s+.*?([\d,]+) cond .*?([\d,]+) ind/) { @@ -1185,7 +1185,7 @@ sub grind_run { $envstr .= "$_=$env->{$_} " for sort keys %$env; } my $cmd = "PERL_HASH_SEED=0 $envstr" - . "valgrind --tool=cachegrind --branch-sim=yes " + . "valgrind --tool=cachegrind --branch-sim=yes --cache-sim=yes " . "--cachegrind-out-file=/dev/null " . "$OPTS{grindargs} " . "$perl $OPTS{perlargs} $args - $counts->[$j] 2>&1"; Index: gnu/usr.bin/perl/Porting/bisect-runner.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/bisect-runner.pl,v diff -u -p -a -u -p -r1.5 bisect-runner.pl --- gnu/usr.bin/perl/Porting/bisect-runner.pl 15 Feb 2023 01:36:14 -0000 1.5 +++ gnu/usr.bin/perl/Porting/bisect-runner.pl 21 Feb 2024 15:47:00 -0000 @@ -54,39 +54,56 @@ my %defines = push @paths, qw(/usr/local/lib /lib /usr/lib) unless $linux64; -unless(GetOptions(\%options, - 'target=s', 'make=s', 'jobs|j=i', 'crash', 'expect-pass=i', - 'expect-fail' => sub { $options{'expect-pass'} = 0; }, - 'clean!', 'one-liner|e=s@', 'c', 'l', 'w', 'match=s', - 'no-match=s' => sub { - $options{match} = $_[1]; - $options{'expect-pass'} = 0; - }, - 'force-manifest', 'force-regen', 'setpgrp!', 'timeout=i', - 'test-build', 'validate', - 'all-fixups', 'early-fixup=s@', 'late-fixup=s@', 'valgrind', - 'check-args', 'check-shebang!', 'usage|help|?', 'gold=s', - 'module=s', 'with-module=s', 'cpan-config-dir=s', - 'test-module=s', 'no-module-tests', - 'A=s@', - 'D=s@' => sub { - my (undef, $val) = @_; - if ($val =~ /\A([^=]+)=(.*)/s) { - $defines{$1} = length $2 ? $2 : "\0"; - } else { - $defines{$val} = ''; - } - }, - 'U=s@' => sub { - $defines{$_[1]} = undef; - }, - )) { - pod2usage(exitval => 255, verbose => 1); -} +my $rv = GetOptions( + \%options, + 'target=s', 'make=s', 'jobs|j=i', 'crash', 'expect-pass=i', + 'expect-fail' => sub { $options{'expect-pass'} = 0; }, + 'clean!', 'one-liner|e=s@', 'c', 'l', 'w', 'match=s', + 'no-match=s' => sub { + $options{match} = $_[1]; + $options{'expect-pass'} = 0; + }, + 'force-manifest', 'force-regen', 'setpgrp!', 'timeout=i', + 'test-build', 'validate', + 'all-fixups', 'early-fixup=s@', 'late-fixup=s@', 'valgrind', + 'check-args', 'check-shebang!', 'usage|help|?', 'gold=s', + 'module=s', 'with-module=s', 'cpan-config-dir=s', + 'test-module=s', 'no-module-tests', + 'A=s@', + 'D=s@' => sub { + my (undef, $val) = @_; + if ($val =~ /\A([^=]+)=(.*)/s) { + $defines{$1} = length $2 ? $2 : "\0"; + } else { + $defines{$val} = ''; + } + }, + 'U=s@' => sub { + $defines{$_[1]} = undef; + }, +); +exit 255 unless $rv; my ($target, $match) = @options{qw(target match)}; -@ARGV = ('sh', '-c', 'cd t && ./perl TEST base/*.t') +# El Capitan (OS X 10.11) (and later) strip DYLD_LIBRARY_PATH +# from the environment of /bin/sh +# https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/RuntimeProtections/RuntimeProtections.html +# +# (They *could* have chosen instead to ignore it and pass it through. It would +# have the same direct effect, but maybe needing more coding. I suspect the +# choice to strip it was deliberate, as it will also eliminate a bunch more +# attack vectors, because it prevents you sneaking an override "into" something +# else you convince the user to run.) + +my $aggressive_apple_security = ""; +if ($^O eq 'darwin') { + require Cwd; + my $cwd = quotemeta Cwd::getcwd(); + $aggressive_apple_security = "DYLD_LIBRARY_PATH=$cwd "; +} + +@ARGV = ('sh', '-c', "cd t && $aggressive_apple_security./perl TEST base/*.t") if $options{validate} && !@ARGV; pod2usage(exitval => 0, verbose => 2) if $options{usage}; @@ -123,7 +140,7 @@ if (defined $target && $target =~ /\.t\z unless ($target =~ s!\At/!!) { $target = "../$target"; } - @ARGV = ('sh', '-c', "cd t && ./perl TEST " . quotemeta $target); + @ARGV = ('sh', '-c', "cd t && $aggressive_apple_security./perl TEST " . quotemeta $target); $target = 'test_prep'; } @@ -844,6 +861,29 @@ Display the usage information and exit. =back +=head1 ABOUT BISECTION + +The process is all about identifying the commit that caused some change +in behaviour - maybe good, maybe bad. But it is built around C, +which is much more specifically aimed at finding "what broke the build". +C terminology embeds that assumption - commits earlier than the +target commit are "good" commits, those at or later than the target commit +are "bad" commits. + +The default behaviour of F mimics this - you supply some code +that I with a perl built B the target commit and +I with a perl built B the target commit, and F +will find the target commit. + +The F option C<--expect-fail> reverses those expectations +(and changes nothing else). So with C<--expect-fail>, you should supply +code that I only with a perl built B the target commit, +and I with a perl built B the target commit. + +By default, I is a piece of perl code that terminates with +a non-zero exit code, e.g. by calling C. Options that change what +is interpreted as failure include C<--crash>, C<--test-build> and C<--match>. + =head1 EXAMPLES =head2 Code has started to crash under C @@ -1062,6 +1102,90 @@ L), we got no +segfault. So the next question we faced was: At what commit did the +segfaulting cease? + +=item * Solution + +Because the code in question loaded no libraries, it was amenable to bisection +with C, thereby shortening bisection time considerably. + + perl Porting/bisect.pl \ + --start=v5.36.0 \ + --target=miniperl \ + --expect-fail -e '@a = sort{eval"("}1,2' + +=item * Reference + +L + +=back + +=head2 When did perl stop emitting warnings when running on certain code? + +=over 4 + +=item * Background + +Most of the time, we bisect in order to identify the first "bad" commit: the +first time code failed to compile; the first time the code emitted warnings; +and so forth. + +Some times, however, we want to identify the first "good" commit: the point +where the code began to compile; the point where the code no longer emitted +warnings; etc. + +We can use this program for that purpose, but we have to reverse our sense of +"good" and "bad" commits. We use the C<--expect-fail> option to do that +reversal. + +=item * Problem + +It was reported that in an older version of Perl, a warning was being emitted +when a program was using the F module and +C was called passing a non-integral number +(I a rational). + + $ perl -wE 'use Scalar::Util; use bigrat; + say "mercy" if Scalar::Util::looks_like_number(1/9);' + +In perl-5.32, this emitted: + + $ Argument "1/9" isn't numeric in addition (+) at + /usr/local/lib/perl5/5.32/Math/BigRat.pm line 1955. + mercy + +But it was observed that there was no warning in perl-5.36. + +=item * Solution + + $ perl Porting/bisect.pl \ + --start=5624cfff8f \ + --end=b80b9f7fc6 \ + --expect-fail \ + -we 'use Scalar::Util; use bigrat; my @w; + local $SIG{__WARN__} = sub { die }; + print "mercy\n" if Scalar::Util::looks_like_number(1/9)' + +=item * Reference + +L + +=back + =cut # Ensure we always exit with 255, to cause git bisect to abort. @@ -1226,9 +1350,11 @@ sub extract_from_file { sub edit_file { my ($file, $munger) = @_; - local $/; my $fh = open_or_die($file); - my $orig = <$fh>; + my $orig = do { + local $/; + <$fh>; + }; die_255("Can't read $file: $!") unless defined $orig && close $fh; my $new = $munger->($orig); return if $new eq $orig; @@ -1379,7 +1505,9 @@ sub apply_patch { my ($patch, $what, $files) = @_; $what = 'patch' unless defined $what; unless (defined $files) { - $patch =~ m!^--- [ab]/(\S+)\n\+\+\+ [ba]/\1!sm; + # Handle context diffs (*** ---) and unified diffs (+++ ---) + # and ignore trailing "garbage" after the filenames + $patch =~ m!^[-*]{3} [ab]/(\S+)[^\n]*\n[-+]{3} [ba]/\1!sm; $files = " $1"; } my $patch_to_use = placate_patch_prog($patch); @@ -1582,6 +1710,7 @@ if ($options{'all-fixups'}) { patch_SH(); patch_C(); patch_ext(); + patch_t(); } apply_fixups($options{'early-fixup'}); @@ -1623,8 +1752,11 @@ unless (extract_from_file('Configure', ' $defines{libs} = \@libs unless exists $defines{libs}; } +# a4f3eea9be6bcf3c added a test for GNU libc to Configure +# Prior to that we really don't get much choice but to force usenm off +# everywhere (and modern systems are fast enough that this doesn't matter) $defines{usenm} = undef - if $major < 2 && !exists $defines{usenm}; + if $major < 4 && !exists $defines{usenm}; my ($missing, $created_dirs); ($missing, $created_dirs) = force_manifest() @@ -1692,8 +1824,10 @@ if ($target =~ /config\.s?h/) { run_report_and_exit(@ARGV); } elsif (!-f 'config.sh') { - # Skip if something went wrong with Configure + report_and_exit(undef, 'PLEASE REPORT BUG', 'could not build', 'config.sh') + if $options{'test-build'}; + # Skip if something went wrong with Configure skip('could not build config.sh'); } @@ -1710,6 +1844,7 @@ if($options{'force-regen'} unless ($options{'all-fixups'}) { patch_C(); patch_ext(); + patch_t(); } # Parallel build for miniperl is safe @@ -2156,6 +2291,124 @@ index 53649d5..0635a6e 100755 EOPATCH } + if ($major < 4 && extract_from_file('Configure', + qr/: see which flavor of setpgrp is in use/)) { + edit_file('Configure', sub { + my $code = shift; + my $new = <<'EOT'; +if $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1; then +EOT + chomp $new; + + # before commit ecfc54246c2a6f42: + # before commit 8e07c86ebc651fe9: + my @old = (<<'EOT', <<'EOT'); +if $cc $ccflags -o set $ldflags set.c $libs >/dev/null 2>&1; then +EOT +if $cc $ccflags -o set set.c $ldflags $libs >/dev/null 2>&1; then +EOT + for my $was (@old) { + # Yes, this modifies @old. No problem here: + chomp $was; + $was = quotemeta $was; + $code =~ s/$was/$new/; + } + + # also commit ecfc54246c2a6f42: + $code =~ s!\tif usg; then!\tif ./usg; then!; + + return $code; + }); + + # We need the new probe from 2afac517c48c20de, which has prototypes + # (but include the various C headers unconditionally) + apply_patch(<<'EOPATCH'); +diff --git a/Configure b/Configure +index 18f2172435..5a75ebd767 100755 +--- a/Configure ++++ b/Configure +@@ -4986,45 +5055,61 @@ eval $inlibc + set setpgrp d_setpgrp + eval $inlibc + +-: see which flavor of setpgrp is in use ++echo "Checking to see which flavor of setpgrp is in use . . . " + case "$d_setpgrp" in + "$define") + echo " " + $cat >set.c < ++#include ++#include + main() + { + if (getuid() == 0) { + printf("(I see you are running Configure as super-user...)\n"); + setuid(1); + } ++#ifdef TRY_BSD_PGRP + if (-1 == setpgrp(1, 1)) +- exit(1); +- exit(0); ++ exit(0); ++#else ++ if (setpgrp() != -1) ++ exit(0); ++#endif ++ exit(1); + } + EOP +- if $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1; then +- ./set 2>/dev/null +- case $? in +- 0) echo "You have to use setpgrp() instead of setpgrp(pid, pgrp)." >&4 +- val="$undef";; +- *) echo "You have to use setpgrp(pid, pgrp) instead of setpgrp()." >&4 +- val="$define";; +- esac ++ if $cc -DTRY_BSD_PGRP $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then ++ echo 'You have to use setpgrp(pid,pgrp) instead of setpgrp().' >&4 ++ val="$define" ++ elif $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then ++ echo 'You have to use setpgrp() instead of setpgrp(pid,pgrp).' >&4 ++ val="$undef" + else ++ echo "I can't seem to compile and run the test program." + if ./usg; then +- xxx="USG one, i.e. you use setpgrp()." +- val="$undef" ++ xxx="a USG one, i.e. you use setpgrp()." + else +- xxx="BSD one, i.e. you use setpgrp(pid, pgrp)." +- val="$define" ++ # SVR4 systems can appear rather BSD-ish. ++ case "$i_unistd" in ++ $undef) ++ xxx="a BSD one, i.e. you use setpgrp(pid,pgrp)." ++ val="$define" ++ ;; ++ $define) ++ xxx="probably a USG one, i.e. you use setpgrp()." ++ val="$undef" ++ ;; ++ esac + fi +- echo "Assuming your setpgrp is a $xxx" >&4 ++ echo "Assuming your setpgrp is $xxx" >&4 + fi + ;; + *) val="$undef";; + esac +-set d_bsdpgrp ++set d_bsdsetpgrp + eval $setvar ++d_bsdpgrp=$d_bsdsetpgrp + $rm -f set set.c + + : see if bzero exists +EOPATCH + } + if ($major == 4 && extract_from_file('Configure', qr/^d_gethbynam=/)) { # Fixes a bug introduced in 4599a1dedd47b916 apply_commit('3cbc818d1d0ac470'); @@ -2227,6 +2480,76 @@ EOPATCH } } + if ($major < 5) { + my $what = extract_from_file('Configure', qr!(\s+)return __libc_main!); + if ($what) { + # To add to the fun commit commit dfe9444ca7881e71 in Feb 1988 + # changed several things: + if ($what !~ /\t/) { + apply_patch(<<'EOPATCH'); +--- a/Configure ++++ b/Configure +@@ -3854,11 +3911,12 @@ n) echo "OK, that should do.";; + int + main() + { +- return __libc_main(); ++ return __libc_main(); + } + EOM +-if $cc $ccflags $ldflags -o gnulibc gnulibc.c $libs >/dev/null 2>&1 && \ +- ./gnulibc | $contains '^GNU C Library' >/dev/null 2>&1; then ++set gnulibc ++if eval $compile && \ ++ ./gnulibc | $contains '^GNU C Library' >/dev/null 2>&1; then + val="$define" + echo "You are using the GNU C Library" + else +EOPATCH + } + + # And commit dc45a647708b6c54 tweaks 1 line in April 1998 + edit_file('Configure', sub { + my $code = shift; + $code =~ s{contains '\^GNU C Library' >/dev/null 2>&1; then} + {contains '^GNU C Library'; then}; + return $code; + }); + + # This is part of aebf16e7cdbc86ec from June 1998 + # but with compiles_ok inlined + apply_patch(<<'EOPATCH'); +diff --git a/Configure b/Configure +index 38072f0e5e..43735feacf 100755 +--- a/Configure ++++ b/Configure +@@ -4024,15 +4024,19 @@ $cc $optimize $ccflags $ldflags -o ${mc_file} $* ${mc_file}.c $libs;' + echo " " + echo "Checking for GNU C Library..." >&4 + cat >gnulibc.c < + int + main() + { +- return __libc_main(); ++#ifdef __GLIBC__ ++ exit(0); ++#else ++ exit(1); ++#endif + } + EOM + set gnulibc +-if eval $compile && \ +- ./gnulibc | $contains '^GNU C Library'; then ++if $cc $ccflags $ldflags -o gnulibc gnulibc.c $libs && ./gnulibc; then + val="$define" + echo "You are using the GNU C Library" + else +EOPATCH + } + } + if ($major < 6 && !extract_from_file('Configure', qr!^\t-A\)$!)) { # This adds the -A option to Configure, which is incredibly useful @@ -2325,6 +2648,18 @@ index 4b55fa6..60c3c64 100755 EOPATCH } + if ($major < 6) { + edit_file('Configure', sub { + my $code = shift; + # This will cause a build failure, but it will stop + # Configure looping endlessly trying to get a different + # answer: + $code =~ s{(dflt=)n(\n\s+rp="Function \$ans does not exist)} + {$1y$2}; + return $code; + }); + } + if ($major < 8 && $^O eq 'aix') { edit_file('Configure', sub { my $code = shift; @@ -2353,18 +2688,120 @@ EOPATCH }); } - if ($major == 8 || $major == 9) { + if ($major < 32) { + edit_file('Configure', sub { + my $code = shift; + + # A lot of the probes used to be written assuming no need + # for prototypes for exit(), printf() etc. + # Curiously also the code was written to call exit() + # rather than return from main - early portability? + # + # Commit 55954f198635e488 did most of the work in ensuring + # that there was always a prototype for exit, by adding + # #include in many probes. However the last + # missing prototype was only addressed by f16c94bc75aefb81 + # (for futimes), and the last missing prototypes a few + # commits later in f82f0f36c7188b6d + # + # As an aside, commit dc45a647708b6c54 fixes the signal + # name probe (etc) - the commit tagged as perl-5.004_01 + # *seems* to fix the signal name probe, but actually it + # fixes an error in the fallback awk code, not the C + # probe's missing prototype. + # + # With current C compilers there is no correctness risk + # from including a header more than once, so the easiest + # approach to making this all work is to add includes + # "to be sure to be sure" + # + # The trick is not to break *working* probes by + # accidentally including a header *within* a construction. + # So we need to have some confidence that it's the start + # of a file (or somewhere safe) + + my $headers = <<'EOFIX'; +#include +#include +#include +EOFIX + + # This handles $cat and plain cat: + $code =~ s{([\$\t\n ]cat > *[a-z0-9]+\.c <<[^\n]*\n)} + {$1$headers}g; + # Of course, there's always one that's backwards: + $code =~ s{([\$\t\n ]cat <<[^\n]* > *[a-z0-9]+\.c\n)} + {$1$headers}g; + + # and >> used to *create* a file. + # We have to be careful to distinguish those from >> used + # to append to a file. All the first lines have #include + # or #ifdef. Except the few that don't... + $code =~ s{ + ([\$\t\n ]cat\ >>\ *[a-z]+\.c\ <<[^\n]*\n) + ( + # #include/#ifdef ... + \# + | + # The non-blocking IO probe + (?:int\ )?main\(\) + | + # The alignment constraint probe + struct\ foobar + ) + } + {$1$headers$2}gx; + + # This is part of commit c727eafaa06ca49a: + $code =~ s{\(int\)exit\(0\);} + {\(void\)exit\(0\);}; + + return $code; + }); + } + + if ($major < 10) { # Fix symbol detection to that of commit 373dfab3839ca168 if it's any # intermediate version 5129fff43c4fe08c or later, as the intermediate # versions don't work correctly on (at least) Sparc Linux. # 5129fff43c4fe08c adds the first mention of mistrustnm. # 373dfab3839ca168 removes the last mention of lc="" + # + # Fix symbol detection prior to 5129fff43c4fe08c to use the same + # approach, where we don't call printf without a prototype + # We can't include to get its prototype, as the way this works + # is to create a (wrong) prototype for the probed functions, and those + # conflict if the function in question is in stdio.h. edit_file('Configure', sub { my $code = shift; return $code if $code !~ /\btc="";/; # 373dfab3839ca168 or later - return $code - if $code !~ /\bmistrustnm\b/; # before 5129fff43c4fe08c + if ($code !~ /\bmistrustnm\b/) { + # doing this as a '' heredoc seems to be the easiest + # way to avoid confusing levels of backslashes: + my $now = <<'EOT'; +void *(*(p()))$tdc { extern void *$1$tdc; return &$1; } int main() { if(p()) return(0); else return(1); } +EOT + chomp $now; + + # before 5129fff43c4fe08c + # befure 16d20bd98cd29be7 + my @old = (<<'EOT', <<'EOT'); +main() { extern short $1$tdc; printf(\"%hd\", $1$tc); } +EOT +main() { extern int $1$tdc; printf(\"%d\", $1$tc); } +EOT + for my $was (@old) { + chomp $was; + $was = quotemeta $was; + + # Prior to commit d674cd6de52ff38b there was no + # 'int ' for 'int main' + $code =~ s/(?:int )?$was/$now/; + } + return $code; + } + my $fixed = <<'EOC'; : is a C symbol defined? @@ -2450,6 +2887,13 @@ index 3d2e8b9..6ce7766 100755 EOPATCH } + + if ($major < 38 && !extract_from_file('Configure', qr/Too many attempts asking the same question/)) { + # Without this, myread can loop infinitely trying to get a valid answer, + # and hence Configure gets stuck in a loop, outputting the same question + # repeatedly. This isn't what we need. + apply_commit('46bfb3c49f22629a'); + } } sub patch_hints { @@ -2508,6 +2952,66 @@ sub patch_hints { return $code; }); } + + if ($major < 8 || + ($major < 10 && !extract_from_file('ext/DynaLoader/Makefile.PL', + qr/sub MY::static /))) { + edit_file('hints/darwin.sh', sub { + my $code = shift; + # As above, the build fails if version of code in op.o + # is linked to, instead of opmini.o + # We don't need this after commit 908fcb8bef8cbab8, + # which moves DynaLoader.o into the shared perl + # library, as it *also* redoes the build so that + # miniperl is linked against all the object files + # (explicitly excluding op.o), instead of against the + # shared library (and reyling on "flat namespaces" + # - ie make Mach-O behave like ELF - to end up with + # objects in the library linking against opmini.o) + $code .= <<'EOHACK'; + +# Force a flat namespace everywhere: +echo $ldflags | grep flat_namespace || ldflags=`echo \$lddflags -flat_namespace` +echo $lddlflags | grep flat_namespace || lddlflags=`echo \$lddlflags -flat_namespace` +EOHACK + return $code; + }); + } + + if ($major < 16) { + edit_file('hints/darwin.sh', sub { + my $code = shift; + # This is commit 60a655a1ee05c577 + $code =~ s/usenm='true'/usenm='false'/; + + # With the Configure probes fixed (in patch_Configure) + # the "d_stdstdio" logic now concludes "define". + # Unfortunately that is not correct - attempting to + # build 5.8.0 without this override results in SEGVs + # or similar chaos. + # + # The problem is introduced by commit 5a3a8a022aa61cba + # which enables perlio by default. + # The problem is hidden after 15b61c98f82f3010, which + # adds "d_faststdio" and defaults it to "undef" from + # that commit onwards, but override that and the build + # would break, up until "turning off perlio" was + # disabled by commit dd35fa16610ef2fa + $code .= "\nd_stdstdio='undef'\n"; + + return $code; + }); + } + + if ($major < 34) { + edit_file('hints/darwin.sh', sub { + my $code = shift; + # This is commits aadc6422eaec39c2 and 54d41b60822734cf + # rolled into one: + $code =~ s/ 10\.\*(?: \| 11\.\*)?\)/ [1-9][0-9].*)/g; + return $code; + }); + } } elsif ($^O eq 'netbsd') { if ($major < 6) { # These are part of commit 099685bc64c7dbce @@ -2922,6 +3426,15 @@ $2!; } } + if ($major == 3) { + # This is part of commit f0efd8cf98c95b42: + edit_file('Makefile.SH', sub { + my $code = shift; + $code =~ s/<'); + print $fh <<"EOT"; +#!/bin/sh +${aggressive_apple_security}exec $cwd/miniperl "\$\@" +EOT + close_or_die($fh); + chmod 0755, $wrapper + or die "Couldn't chmod 0755 $wrapper: $!"; + + edit_file('ext/util/make_ext', sub { + my $code = shift; + # This is shell expansion syntax + $code =~ s{ (\.\./\$depth/miniperl) } + { $1.sh }; + # This is actually the same line as edited above. + # We need this because (yay), without this EU::MM will + # default to searching for a working perl binary + # (sensible plan) but due to macOS stripping + # DYLD_LIBRARY_PATH during system(...), .../miniperl + # (as found from $^X) *isn't* going to work. + $code =~ s{ (Makefile\.PL INSTALLDIRS=perl) } + { $1 PERL=\.\./\$depth/miniperl.sh }; + return $code; + }); + } + if ($^O eq 'aix' && $major >= 8 && $major < 28 && extract_from_file('Makefile.SH', qr!\Q./$(MINIPERLEXP) makedef.pl\E.*aix!)) { # This is a variant the AIX part of commit 72bbce3da5eeffde: @@ -2999,6 +3544,23 @@ sub patch_C { # This is ordered by $major, as it's likely that different platforms may # well want to share code. + if ($major == 0) { + apply_patch(<<'EOPATCH'); +diff --git a/proto.h b/proto.h +index 9ffc6bbabc..16da198342 100644 +--- a/proto.h ++++ b/proto.h +@@ -8,6 +8,7 @@ + #endif + #ifdef OVERLOAD + SV* amagic_call _((SV* left,SV* right,int method,int dir)); ++bool Gv_AMupdate _((HV* stash)); + #endif /* OVERLOAD */ + OP* append_elem _((I32 optype, OP* head, OP* tail)); + OP* append_list _((I32 optype, LISTOP* first, LISTOP* last)); +EOPATCH + } + if ($major == 2 && extract_from_file('perl.c', qr/^\tfclose\(e_fp\);$/)) { # need to patch perl.c to avoid calling fclose() twice on e_fp when # using -e @@ -3087,6 +3649,36 @@ index 4608a2a..f0c9d1d 100644 EOPATCH } + # _(( was the macro wrapper for hiding ANSI prototypes from K&R C compilers: + if ($major == 3 && !extract_from_file('proto.h', qr/\bsafemalloc\s+_\(\(/)) { + # This is part of commit bbce6d69784bf43b: + # [inseparable changes from patch from perl5.003_08 to perl5.003_09] + # This only affects a few versions, but without this safemalloc etc get + # an implicit return type (of int), and that is truncating addresses on + # 64 bit systems. (And these days, seems that x86_64 linux has a memory + # map which causes malloc to return addresses >= 2**32) + apply_patch(<<'EOPATCH'); +diff --git a/proto.h b/proto.h +index 851567b340..e650c8b07d 100644 +--- a/proto.h ++++ b/proto.h +@@ -479,6 +479,13 @@ Malloc_t realloc _((Malloc_t where, MEM_SIZE nbytes)); + Free_t free _((Malloc_t where)); + #endif + ++#ifndef MYMALLOC ++Malloc_t safemalloc _((MEM_SIZE nbytes)); ++Malloc_t safecalloc _((MEM_SIZE elements, MEM_SIZE size)); ++Malloc_t saferealloc _((Malloc_t where, MEM_SIZE nbytes)); ++Free_t safefree _((Malloc_t where)); ++#endif ++ + #ifdef LEAKTEST + Malloc_t safexmalloc _((I32 x, MEM_SIZE size)); + Malloc_t safexcalloc _((I32 x, MEM_SIZE elements, MEM_SIZE size)); +EOPATCH + } + if ($major < 4 && $^O eq 'openbsd') { my $bad; # Need changes from commit a6e633defa583ad5. @@ -3627,6 +4219,38 @@ index 2a6cbcd..eab2de1 100644 EOPATCH } + if ($major < 6 && extract_from_file('perl.h', qr/PL_uuemap\[\]/)) { + # That [] needs to be [65]: + apply_commit('7575fa06ca7baf15'); + } + + if ($major < 6 && $^O eq 'darwin' + && !extract_from_file('perl.h', qr/ifdef I_FCNTL/)) { + # This is part of commit 9a34ef1dede5fef4, but in a stable part of the + # file: + apply_patch(<<'EOPATCH') +diff --git a/perl.h b/perl.h +index 0d3f0b8333..19f6684894 100644 +--- a/perl.h ++++ b/perl.h +@@ -310,6 +310,14 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER)); + # define BYTEORDER 0x1234 + #endif + ++#ifdef I_FCNTL ++# include ++#endif ++ ++#ifdef I_SYS_FILE ++# include ++#endif ++ + /* Overall memory policy? */ + #ifndef CONSERVATIVE + # define LIBERAL 1 +EOPATCH + } + if ($major == 7 && $^O eq 'aix' && -f 'ext/List/Util/Util.xs' && extract_from_file('ext/List/Util/Util.xs', qr/PUSHBLOCK/) && !extract_from_file('makedef.pl', qr/^Perl_cxinc/)) { @@ -3693,8 +4317,26 @@ index 900b491..6251a0b 100644 EOPATCH } - if ($major < 8 && $^O eq 'openbsd' - && !extract_from_file('perl.h', qr/include /)) { + if ($major < 8 && !extract_from_file('perl.h', qr/\bshort htovs\b/)) { + # This is part of commit c623ac675720b314 + apply_patch(<<'EOPATCH'); +diff --git a/perl.h b/perl.h +index 023b90b7ea..59a21faecd 100644 +--- a/perl.h ++++ b/perl.h +@@ -2279,4 +2279,8 @@ struct ptr_tbl { + # endif + /* otherwise default to functions in util.c */ ++short htovs(short n); ++short vtohs(short n); ++long htovl(long n); ++long vtohl(long n); + #endif + +EOPATCH + } + + if ($major < 8 && !extract_from_file('perl.h', qr/include /)) { # This is part of commit 3f270f98f9305540, applied at a slightly # different location in perl.h, where the context is stable back to # 5.000 @@ -3716,6 +4358,50 @@ index 9418b52..b8b1a7c 100644 #if defined(STANDARD_C) && defined(I_STDLIB) EOPATCH } + + if ($major < 10) { + # This is commit 731e259481f36b35, but adapted to remove all the + # variations of guards around the inclusion of + # Whilst we only hit this as a problem on arm64 macOS (so far), because + # it insists on prototypes for everything, I'm assuming that doing this + # everywhere and unconditionally might solve similar problems on other + # platforms. Certainly, it *ought* to be safe to include a C89 header + # these days. + for my $file (qw(doop.c mg.c mpeix/mpeixish.h plan9/plan9ish.h unixish.h util.c)) { + next + unless -f $file; + edit_file($file, sub { + my $code = shift; + $code =~ s{ + \n + \#if \s+ [^\n]+ + \n + \# \s* include \s+ + \n + \#endif + \n + } + {\n#include \n}x; + return $code; + }); + } + } + + if ($major == 15) { + # This affects a small range of commits around July 2011, but build + # failures here get in the way of bisecting other problems: + + my $line = extract_from_file('embed.fnc', qr/^X?pR\t\|I32\t\|was_lvalue_sub$/); + if ($line) { + # Need to export Perl_was_lvalue_sub: + apply_commit('7b70e8177801df4e') + unless $line =~ /X/; + + # It needs to be 'ApR' not 'XpR', to be visible to List::Util + # (arm64 macOS treats the missing prototypes as errors) + apply_commit('c73b0699db4d0b8b'); + } + } } sub patch_ext { @@ -3744,7 +4430,7 @@ sub patch_ext { checkout_file('ext/DynaLoader/dl_dyld.xs', 'f556e5b971932902'); apply_patch(<<'EOPATCH'); diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs ---- a/ext/DynaLoader/dl_dyld.xs~ 2011-10-11 21:41:27.000000000 +0100 +--- a/ext/DynaLoader/dl_dyld.xs 2011-10-11 21:41:27.000000000 +0100 +++ b/ext/DynaLoader/dl_dyld.xs 2011-10-11 21:42:20.000000000 +0100 @@ -41,6 +41,35 @@ #include "perl.h" @@ -3782,20 +4468,36 @@ diff -u a/ext/DynaLoader/dl_dyld.xs~ a/e #define DL_LOADONCEONLY #include "dlutils.c" /* SaveError() etc */ -@@ -185,7 +191,7 @@ +@@ -104,7 +145,7 @@ + dl_last_error = savepv(error); + } + +-static char *dlopen(char *path, int mode /* mode is ignored */) ++static char *dlopen(char *path) + { + int dyld_result; + NSObjectFileImage ofile; +@@ -161,13 +202,11 @@ + dl_load_file(filename, flags=0) + char * filename + int flags +- PREINIT: +- int mode = 1; CODE: DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags)); if (flags & 0x01) - Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename); +- RETVAL = dlopen(filename, mode) ; + Perl_warn_nocontext("Can't make loaded symbols global on this platform while loading %s",filename); - RETVAL = dlopen(filename, mode) ; ++ RETVAL = dlopen(filename); DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%x\n", RETVAL)); ST(0) = sv_newmortal() ; + if (RETVAL == NULL) EOPATCH if ($major < 4 && !extract_from_file('util.c', qr/^form/m)) { apply_patch(<<'EOPATCH'); diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs ---- a/ext/DynaLoader/dl_dyld.xs~ 2011-10-11 21:56:25.000000000 +0100 +--- a/ext/DynaLoader/dl_dyld.xs 2011-10-11 21:56:25.000000000 +0100 +++ b/ext/DynaLoader/dl_dyld.xs 2011-10-11 22:00:00.000000000 +0100 @@ -60,6 +60,18 @@ # define get_av perl_get_av @@ -3823,12 +4525,13 @@ EOPATCH if ($major < 10) { if ($unfixable_db_file) { # Nothing we can do. - } elsif (!extract_from_file('ext/DB_File/DB_File.xs', - qr/^#ifdef AT_LEAST_DB_4_1$/)) { - # This line is changed by commit 3245f0580c13b3ab - my $line = extract_from_file('ext/DB_File/DB_File.xs', - qr/^( status = \(?RETVAL->dbp->open\)?\(RETVAL->dbp, name, NULL, RETVAL->type, $)/); - apply_patch(<<"EOPATCH"); + } else { + if (!extract_from_file('ext/DB_File/DB_File.xs', + qr/^#ifdef AT_LEAST_DB_4_1$/)) { + # This line is changed by commit 3245f0580c13b3ab + my $line = extract_from_file('ext/DB_File/DB_File.xs', + qr/^( status = \(?RETVAL->dbp->open\)?\(RETVAL->dbp, name, NULL, RETVAL->type, $)/); + apply_patch(<<"EOPATCH"); diff --git a/ext/DB_File/DB_File.xs b/ext/DB_File/DB_File.xs index 489ba96..fba8ded 100644 --- a/ext/DB_File/DB_File.xs @@ -3855,6 +4558,13 @@ index 489ba96..fba8ded 100644 /* printf("open returned %d %s\\n", status, db_strerror(status)) ; */ EOPATCH + } + + if (!extract_from_file('ext/DB_File/DB_File.xs', + qr/\bextern void __getBerkeleyDBInfo\b/)) { + # A prototype for __getBerkeleyDBInfo(); + apply_commit('b92372bcedd4cbc4'); + } } } @@ -3897,6 +4607,28 @@ EOFIX }); } + if ($major < 10 and -f 'ext/Digest/MD5/MD5.xs') { + require Digest::MD5; + my ($was, $now); + # The edit to the XS is commit 9ee8e69ab2318ba3, but the testcase fixup + # needs to work for several earlier commits. + edit_file('ext/Digest/MD5/MD5.xs', sub { + my $xs = shift; + $was = Digest::MD5::md5_hex($xs); + $xs =~ s{\Q#if PATCHLEVEL <= 4 && !defined(PL_dowarn)} + {#if PERL_VERSION <= 4 && !defined(PL_dowarn)}; + $now = Digest::MD5::md5_hex($xs); + return $xs; + }); + + edit_file('ext/Digest/MD5/t/files.t', sub { + my $testcase = shift; + $testcase =~ s/$was/$now/g; + return $testcase; + }) + if $was ne $now; + } + if ($major >= 10 && $major < 20 && !extract_from_file('ext/SDBM_File/Makefile.PL', qr/MY::subdir_x/)) { # Parallel make fix for SDBM_File @@ -3905,6 +4637,75 @@ EOFIX # other bugs. # So far, only AIX make has come acropper on this bug. apply_commit('4d106cc5d8fd328d', 'ext/SDBM_File/Makefile.PL'); + } + + if (-f 'ext/Errno/Errno_pm.PL') { + if ($major < 22 && !extract_from_file('ext/Errno/Errno_pm.PL', + qr/RT#123784/)) { + my $gcc_major = extract_from_file('config.sh', + qr/^gccversion='([0-9]+)\./, + 0); + if ($gcc_major >= 5) { + # This is the fix of commit 816b056ffb99ae54, but implemented in + # a way that should work back to the earliest versions of Errno: + edit_file('ext/Errno/Errno_pm.PL', sub { + my $code = shift; + $code =~ s/( \$Config\{cppflags\})/$1 -P/g; + return $code; + }); + } + } + if ($major < 8 && !extract_from_file('ext/Errno/Errno_pm.PL', + qr/With the -dM option, gcc/)) { + # This is the fix of commit 9ae2e8df64ee1443 re-ordered slightly so + # that it should work back to the earliest versions of Errno: + apply_patch(<<'EOPATCH'); +diff --git a/ext/Errno/Errno_pm.PL b/ext/Errno/Errno_pm.PL +index b669790314..c00d6c1a86 100644 +--- a/ext/Errno/Errno_pm.PL ++++ b/ext/Errno/Errno_pm.PL +@@ -30,6 +30,12 @@ sub process_file { + warn "Cannot open '$file'"; + return; + } ++ } elsif ($Config{gccversion} ne '') { ++ # With the -dM option, gcc outputs every #define it finds ++ unless(open(FH,"$Config{cc} -E -dM $file |")) { ++ warn "Cannot open '$file'"; ++ return; ++ } + } else { + unless(open(FH,"< $file")) { + warn "Cannot open '$file'"; +@@ -45,8 +51,12 @@ sub process_file { + + sub get_files { + my %file = (); +- # VMS keeps its include files in system libraries (well, except for Gcc) +- if ($^O eq 'VMS') { ++ if ($^O eq 'linux') { ++ # Some Linuxes have weird errno.hs which generate ++ # no #file or #line directives ++ $file{'/usr/include/errno.h'} = 1; ++ } elsif ($^O eq 'VMS') { ++ # VMS keeps its include files in system libraries (well, except for Gcc) + if ($Config{vms_cc_type} eq 'decc') { + $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1; + } elsif ($Config{vms_cc_type} eq 'vaxc') { +EOPATCH + } + } +} + +sub patch_t { + if ($^O eq 'darwin') { + # This has # $x = `$^X -le "print 'hi there'"`; + # and it needs to pass for the automated validation self-test: + edit_file('t/base/term.t', sub { + my $code = shift; + $code =~ s/`(\$\^X )/`$aggressive_apple_security$1/; + return $code; + }); } } Index: gnu/usr.bin/perl/Porting/checkAUTHORS.pl =================================================================== RCS file: gnu/usr.bin/perl/Porting/checkAUTHORS.pl diff -N gnu/usr.bin/perl/Porting/checkAUTHORS.pl --- gnu/usr.bin/perl/Porting/checkAUTHORS.pl 15 Feb 2023 01:36:14 -0000 1.8 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,1270 +0,0 @@ -#!/usr/bin/perl -w -package Porting::checkAUTHORS; -use strict; -use warnings; - -use v5.026; - -use utf8; -use Getopt::Long; -use Unicode::Collate; -use Text::Wrap; -$Text::Wrap::columns = 80; - -my ($committer, $patch, $author); -my ($rank, $ta, $ack, $who, $tap, $update) = (0) x 6; -my ($percentage, $cumulative, $reverse); -my (%authors, %untraced, %patchers, %committers, %real_names); -my ( $from_commit, $to_commit ); -my ( $map, $preferred_email_or_github ); -my $AUTHORS_header; -my $author_file= './AUTHORS'; - -sub main { - my $result = GetOptions ( - # modes - "who" => \$who, - "rank" => \$rank, - "thanks-applied" => \$ta, - "missing" => \$ack , - "tap" => \$tap, - "update" => \$update, - - # modifiers - "authors=s" => \$author_file, - "percentage" => \$percentage, # show as %age - "cumulative" => \$cumulative, - "reverse" => \$reverse, - "from=s" => \$from_commit, - "to=s" => \$to_commit, - - ); - - - my $has_from_commit = defined $from_commit ? 1 : 0; - - if ( !$result # GetOptions failed - or ( $rank + $ta + $who + $ack + $tap + $update != 1 ) # use one and one exactly 'mode' - or !( scalar @ARGV + $has_from_commit ) # gitlog provided from --from or stdin - ) { - usage(); - } - - die "Can't locate '$author_file'. Specify it with '--authors '." - unless -f $author_file; - - ( $map, $preferred_email_or_github ) = generate_known_author_map(); - - my $preserve_case = $update ? 1 : 0; - my $AUTHORS_header = read_authors_file($author_file, $preserve_case); - - if ($rank) { - parse_commits(); - display_ordered(\%patchers); - } elsif ($ta) { - parse_commits(); - display_ordered(\%committers); - } elsif ($tap) { - parse_commits_authors(); - display_test_output(\%patchers, \%authors, \%real_names); - } elsif ($ack) { - parse_commits(); - display_missing_authors(\%patchers, \%authors, \%real_names); - } elsif ($who) { - parse_commits(); - list_authors(\%patchers, \%authors); - } elsif ( $update ) { - update_authors_files( \%authors, $map, $preferred_email_or_github, $author_file ); - } else { - die "unknown mode"; - } - - exit(0); -} - -main() unless caller; - -sub usage { - - die <<"EOS"; -Usage: $0 [modes] [modifiers] - -Modes (use only one): - --who # show list of unique authors by full name - --rank # rank authors by patches - --thanks-applied # ranks committers of others' patches - --missing # display authors not in AUTHORS - --tap # show authors present/missing as TAP - --update # update the AUTHORS file with missing - -Modifiers: - --authors # path to authors file (default: ./AUTHORS) - --percentage # show rankings as percentages - --cumulative # show rankings cumulatively - --reverse # show rankings in reverse - --from # git commit ID used for 'git log' source (use file from STDIN when missing) - --to[=HEAD] # git commit ID used for 'git log' destination, default to HEAD. - -Sample Usages: - - \$ perl Porting/checkAUTHORS.pl --who --from=v5.31.6 --to=v5.31.7 - \$ perl Porting/checkAUTHORS.pl --rank --percentage --from=v5.31.6 - \$ perl Porting/checkAUTHORS.pl --thanks-applied --from=v5.31.6 - \$ perl Porting/checkAUTHORS.pl --missing --from=v5.31.6 - \$ perl Porting/checkAUTHORS.pl --tap --from=v5.31.6 - \$ perl Porting/checkAUTHORS.pl --update --from=v5.31.6 - -or the split int two and generate your own git log output - -Generate git-log-output-file with git log --pretty=fuller rev1..rev2 -(or pipe by specifying '-' for stdin). For example: - \$ git log --pretty=fuller v5.31.6..v5.31.7 > gitlog - \$ perl Porting/checkAUTHORS.pl --rank --percentage gitlog - - -EOS -} - -sub list_authors { - my ($patchers, $authors) = @_; - binmode(STDOUT, ":utf8"); - print wrap '', '', join(', ', Unicode::Collate->new(level => 1)->sort( - map { $authors->{$_} } - grep { length $_ > 1 } # skip the exception '!' and '?' - keys %$patchers)) . ".\n"; -} - -# use --from [and --to] if provided -# otherwise fallback to stdin for backward compatibility -sub _git_log { - if ( length $from_commit ) { - my ( $from, $to ) = ( $from_commit, $to_commit ); - $to //= 'HEAD'; - my $gitlog = [ qx{git log --pretty=fuller $from..$to} ]; - die "git log failed: $!" unless $? == 0; - return $gitlog; - } - - return [ <> ]; -} - -sub parse_commits { - my ( $process ) = @_; - - $process //= \&process; # default processor - - my $git_log = _git_log(); - - my @lines = split( /^commit\s*/sm, join( '', $git_log->@* ) ); - foreach (@lines) { - next if m/^$/; - next if m/^(\S*?)^Merge:/ism; # skip merge commits - if (m/^(.*?)^Author:\s*(.*?)^AuthorDate:\s*.*?^Commit:\s*(.*?)^(.*)$/gism) { - - # new patch - ( $patch, $author, $committer ) = ( $1, $2, $3 ); - chomp($author); - unless ($author) { die $_ } - chomp($committer); - unless ($committer) { die $_ } - - $process->( $committer, $patch, $author ); - } else { - die "XXX $_ did not match"; - } - } - - return; -} - -# just grab authors. Quicker than parse_commits - -sub parse_commits_authors { - - my $git_log = _git_log(); - - foreach ($git_log->@*) { - next unless /^Author:\s*(.*)$/; - my $author = $1; - $author = _raw_address($author); - $patchers{$author}++; - } - - return; -} - -sub generate_known_author_map { - my %map; - - my %preferred_email_or_github; - - my $previous_name = ""; - my $previous_preferred_contact = ""; - while () { - next if m{^\s*#}; - - chomp; - s/\\100/\@/g; - - $_ = lc; - if ( my ( $name, $contact ) = /^\s*([^#\s]\S*)\s+(.*\S)/ ) { - - $name =~ s/^\\043/#/; - # use the previous stored email if the line starts by a '+' - if ( $name eq '+' ) { - $name = $previous_name; - } - else { - $previous_name = $name; - $previous_preferred_contact = $contact; - if ( index($name, '@' ) > 0 ) { - # if name is an email, then this is our preferred email... legacy list - $previous_preferred_contact = $name; - } - } - - $map{$contact} = $name; - - if ( $contact ne $previous_preferred_contact ) { - $preferred_email_or_github{$contact} = $previous_preferred_contact; - } - if ( $name ne '+' ) { - $preferred_email_or_github{$name} = $previous_preferred_contact; - } - } - } - - # - # Email addresses for we do not have names. - # - $map{$_} = "?" - for - "bah\100longitude.com", - "bbucklan\100jpl-devvax.jpl.nasa.gov", - "bilbo\100ua.fm", - "bob\100starlabs.net", - "cygwin\100cygwin.com", - "david\100dhaller.de", "erik\100cs.uni-jena.de", "info\100lingo.kiev.ua", # Lingo Translation agency - "jms\100mathras.comcast.net", - "premchai21\100yahoo.com", - "pxm\100nubz.org", - "raf\100tradingpost.com.au", - "smoketst\100hp46t243.cup.hp.com", "root\100chronos.fi.muni.cz", # no clue - jrv 20090803 - "gomar\100md.media-web.de", # no clue - jrv 20090803 - "data-drift\100so.uio.no", # no data. originally private message from 199701282014.VAA12645@selters.uio.no - "arbor\100al37al08.telecel.pt" - , # reported perlbug ticket 5196 - no actual code contribution. no real name - jrv 20091006 - "oracle\100pcr8.pcr.com", # Reported perlbug ticket 1015 - no patch - Probably Ed Eddington ed@pcr.com - "snaury\100gmail.com", # Reported cpan ticket 35943, with patch for fix - ; - - # - # Email addresses for people that don't have an email address in AUTHORS - # Presumably deliberately? - # - - $map{$_} = '!' for - - # Nick Ing-Simmons has passed away (2006-09-25). - "nick\100ing-simmons.net", - "nik\100tiuk.ti.com", - "nick.ing-simmons\100elixent.com", - "nick\100ni-s.u-net.com", - "nick.ing-simmons\100tiuk.ti.com", - - # Iain Truskett has passed away (2003-12-29). - "perl\100dellah.anu.edu.au", "spoon\100dellah.org", "spoon\100cpan.org", - - # Ton Hospel - "me-02\100ton.iguana.be", "perl-5.8.0\100ton.iguana.be", "perl5-porters\100ton.iguana.be", - - # Beau Cox - "beau\100beaucox.com", - - # Randy W. Sims - "ml-perl\100thepierianspring.org", - - # Jason Hord - "pravus\100cpan.org", - - # perl internal addresses - "perl5-porters\100africa.nicoh.com", - "perlbug\100perl.org",, - "perl5-porters.nicoh.com", - "perlbug-followup\100perl.org", - "perlbug-comment\100perl.org", - "bug-module-corelist\100rt.cpan.org", - "bug-storable\100rt.cpan.org", - "bugs-perl5\100bugs6.perl.org", - "unknown", - "unknown\100unknown", - "unknown\100longtimeago", - "unknown\100perl.org", - "", - "(none)", - ; - - return ( \%map, \%preferred_email_or_github ); -} - -sub read_authors_file { - my ( $filename, $preserve_case ) = @_; - return unless defined $filename; - - my @headers; - - my (%count, %raw); - { - open my $fh, '<', $filename or die "Can't open $filename: $!"; - binmode $fh, ':encoding(UTF-8)'; - my $in_header = 1; - while (<$fh>) { - next if /^\#/; - do { $in_header = 0; next } if /^-- /; - if (/^([^<]+)<([^>]+)>/) { - # Easy line. - my ($name, $email) = ($1, $2); - $name =~ s/\s*\z//; - $raw{$email} = $name; - $count{$email}++; - } elsif ( /^([^@]+)\s+(\@\S+)\s*$/ ) { - my ($name, $github) = ($1, $2); - $name =~ s/\s*\z//; - $raw{$github} = $name; - $count{$github}++; - } elsif (/^([- .'\w]+)[\t\n]/) { - - # Name only - $untraced{$1}++; - } elsif ( length $_ ) { - chomp; - warn "Can't parse line '$_'"; - } else { - next; - } - } - continue { - push @headers, $_ if $in_header; - } - } - foreach my $contact ( sort keys %raw ) { - print "E-mail $contact occurs $count{$contact} times\n" if $count{$contact} > 1; - my $lc = lc $contact; - my $key = $preserve_case ? $contact : $lc; - $authors{ $map->{$lc} || $key } = $raw{$contact}; - } - $authors{$_} = $_ for qw(? !); - - push @headers, '-- ', "\n"; - - return join( '', @headers ); -} - -sub update_authors_files { - my ( $authors, $known_authors, $preferred_email_or_github, $author_file ) = @_; - - die qq[Cannot find AUTHORS file '$author_file'] unless -f $author_file; - binmode(STDOUT, ":utf8"); - - # add missing authors from the recent commits - _detect_new_authors_from_recent_commit( $authors, $known_authors ); - - my @author_names = sort { $a cmp $b } values %$authors; - my $maxlen = length [ sort { length $b <=> length $a } @author_names ]->[0]; - - my @list; - foreach my $github_or_email ( sort keys %authors ) { - - next if length $github_or_email == 1; - - my $name = $authors{$github_or_email}; - $name =~ s{\s+$}{}; - - #$github_or_email = $known_authors->{ $github_or_email } // $github_or_email; - $github_or_email = $preferred_email_or_github->{ $github_or_email } // $github_or_email; - - if ( index( $github_or_email, '@' ) != 0 ) { # preserve '<>' for unicode consortium - $github_or_email = '<' . $github_or_email . '>'; - } - - push @list, sprintf( "%-${maxlen}s %s\n", $name, $github_or_email); - } - - # preserve the untraced authors :-) [without email or GitHub account] - push @list, map { "$_\n" } keys %untraced; - - { - open my $fh, '>', $author_file or die "Can't open $author_file: $!"; - binmode $fh, ':raw:encoding(UTF-8)'; - - print {$fh} $AUTHORS_header; - - map { print {$fh} $_ } sort { lc $a cmp lc $b } @list; - - close $fh; - - } - - return; -} - -# read all recent commits and check if the author email is known -# if the email is unknown add the author's GitHub account if possible or his email -sub _detect_new_authors_from_recent_commit { - my ( $authors, $known_authors ) = @_; - - my $check_if_email_known = sub { - my ( $email ) = @_; - - my $preferred = $map->{$email} // $map->{lc $email} - // $preferred_email_or_github->{$email} - // $preferred_email_or_github->{lc $email} - // $email; - - return $authors{$preferred} || $authors{ lc $preferred } ? 1 : 0; - }; - - my $already_checked = {}; - my $process = sub { - my ( $committer, $patch, $author ) = @_; - - foreach my $person ( $author, $committer ) { - next unless length $person; - next if $already_checked->{$person}; - $already_checked->{$person} = 1; - - my $is_author = $person eq $author; - - if ( $person =~ m{^(.+)\s+<(.+)>$} ) { - my ( $name, $email ) = ( $1, $2 ); - - # skip unicode consortium and bad emails - if ( index( $email, '@' ) <= 0 ) { - warn "# Skipping new author: $person - bad email"; - next; - } - - next if $check_if_email_known->( $email ); - - # for new users we would prefer using the GitHub account - my $github_or_email = _commit_to_github_id( $patch, $is_author ) // $email; - - next if $check_if_email_known->( $github_or_email ); - - print "# Detected a new author: $name using email $email [ $github_or_email ]\n"; - $authors{$github_or_email} = $name; # add it to the list of authors - } else { - warn "Fail to parse author: $person"; - } - } - }; - - parse_commits( $process ); - - return; -} - -sub _commit_to_github_id { - my ( $commit, $is_author ) = @_; - - chomp $commit if defined $commit; - return unless length $commit; - - eval { require HTTP::Tiny; 1 } or do { - warn "HTTP::Tiny is missing, cannot detect GitHub account from commit id."; - no warnings; - *_commit_to_github_id = sub {}; - return; - }; - - my $github_url_for_commit = q[https://github.com/Perl/perl5/commit/] . $commit; - my $response = HTTP::Tiny->new->get( $github_url_for_commit ); - - if ( ! $response->{success} ) { - warn "HTTP Request Failed: '$github_url_for_commit'"; - return; - } - - my $content = $response->{content} // ''; - - # poor man scrapping - probably have to be improved over time - # try to parse something like: 2; - - return $github_ids[0] if $is_author; - if ( !$is_author && scalar @github_ids >= 2 ) { - return $github_ids[1]; # committer is the second entry - } - - return $github_ids[0]; -} - - -sub display_test_output { - my $patchers = shift; - my $authors = shift; - my $real_names = shift; - my $count = 0; - printf "1..%d\n", scalar keys %$patchers; - - foreach my $email ( sort keys %$patchers ) { - $count++; - if ($authors->{$email}) { - print "ok $count - ".$real_names->{$email} ." $email\n"; - } else { - print "not ok $count - Contributor not found in AUTHORS. ", - ($real_names->{$email} || '???' )." $email\n", - "# To fix run Porting/updateAUTHORS.pl and then review", - " and commit the result.\n"; - print STDERR "# ", ($real_names->{$email} || '???' ), " <$email>", - " not found in AUTHORS.\n", - "# To fix run Porting/updateAUTHORS.pl and then review", - " and commit the result.\n"; - } - } - - return; -} - -sub display_missing_authors { - my $patchers = shift; - my $authors = shift; - my $real_names = shift; - my %missing; - foreach ( sort keys %$patchers ) { - next if $authors->{$_}; - - # Sort by number of patches, then name. - $missing{ $patchers{$_} }->{$_}++; - } - foreach my $patches ( sort { $b <=> $a } keys %missing ) { - print "\n\n=head1 $patches patch(es)\n\n"; - foreach my $author ( sort keys %{ $missing{$patches} } ) { - my $xauthor = $author; - $xauthor =~ s/@/\\100/g; # xxx temp hack - print "" . ( $real_names->{$author} || $author ) . "\t\t\t<" . $xauthor . ">\n"; - } - } - - return; -} - -sub display_ordered { - my $what = shift; - my @sorted; - my $total; - - while ( my ( $name, $count ) = each %$what ) { - push @{ $sorted[$count] }, $name; - $total += $count; - } - - my $i = @sorted; - return unless @sorted; - my $sum = 0; - foreach my $i ( $reverse ? 0 .. $#sorted : reverse 0 .. $#sorted ) { - next unless $sorted[$i]; - my $prefix; - $sum += $i * @{ $sorted[$i] }; - - # Value to display is either this one, or the cumulative sum. - my $value = $cumulative ? $sum : $i; - if ($percentage) { - $prefix = sprintf "%6.2f:\t", 100 * $value / $total; - } else { - $prefix = "$value:\t"; - } - print wrap ( $prefix, "\t", join( " ", sort @{ $sorted[$i] } ), "\n" ); - } - - return; -} - -sub process { - my ( $committer, $patch, $author ) = @_; - return unless $author; - return unless $committer; - - $author = _raw_address($author); - $patchers{$author}++; - - $committer = _raw_address($committer); - if ( $committer ne $author ) { - - # separate commit credit only if committing someone else's patch - $committers{$committer}++; - } - - return; -} - -sub _raw_address { - my $addr = shift; - my $real_name; - if ($addr =~ /(?:\\?")?\s*\(via RT\) $/p) { - my $name = ${^PREMATCH}; - $addr = 'perlbug-followup@perl.org'; - # - # Try to find the author - # - if (exists $map->{$name}) { - $addr = $map->{$name}; - $real_name = $authors{$addr}; - } - else { - while (my ($email, $author_name) = each %authors) { - if ($name eq $author_name) { - $addr = $email; - $real_name = $name; - last; - } - } - } - } - elsif ( $addr =~ /<.*>/ ) { - $addr =~ s/^\s*(.*)\s*<\s*(.*?)\s*>.*$/$2/; - $real_name = $1; - } - $addr =~ s/\[mailto://; - $addr =~ s/\]//; - $addr = lc $addr; - $addr = $map->{$addr} || $addr; - $addr =~ s/\\100/@/g; # Sometimes, there are encoded @ signs in the git log. - - if ($real_name) { $real_names{$addr} = $real_name } - - return $addr; -} - -1; # make sure we return true in case we are required. -__DATA__ - -# -# List of mappings. First entry the "correct" email address or GitHub account, -# as appears in the AUTHORS file. Other lines are "alias" mapped to it. -# -# If the "correct" email address is a '+', the entry above it is reused; -# this for addresses with more than one alias. -# -# Note that all entries are in lowercase. Further, no '@' signs should -# appear; use \100 instead. -# -# -# Committers. -# -adamh \100BytesGuy -+ bytesguy\100users.noreply.github.com -+ git\100ahartley.com -adi enache\100rdslink.ro -alanbur alan.burlison\100sun.com -+ alan.burlison\100uk.sun.com -+ aburlison\100cix.compulink.co.uk -ams ams\100toroid.org -+ ams\100wiw.org -atoomic \100atoomic -+ atoomic\100cpan.org -+ cpan\100atoomic.org -+ nicolas\100atoomic.org -chip chip\100pobox.com -+ chip\100perl.com -+ salzench\100nielsenmedia.com -+ chip\100atlantic.net -+ chip\100rio.atlantic.net -+ salzench\100dun.nielsen.com -+ chip\100ci005.sv2.upperbeyond.com -craigb craigberry\100mac.com -+ craig.berry\100metamorgs.com -+ craig.berry\100signaltreesolutions.com -+ craig.berry\100psinetcs.com -+ craig.a.berry\100gmail.com -+ craig a. berry) -davem davem\100iabyn.nospamdeletethisbit.com -+ davem\100fdgroup.com -+ davem\100iabyn.com -+ davem\100fdgroup.co.uk -+ davem\100fdisolutions.com -+ davem\100iabyn.com -demerphq demerphq\100gmail.com -+ yves.orton\100de.mci.com -+ yves.orton\100mciworldcom.de -+ yves.orton\100booking.com -+ demerphq\100dromedary.booking.com -+ demerphq\100gemini.(none) -+ demerphq\100camel.booking.com -+ demerphq\100hotmail.com -doughera doughera\100lafayette.edu -+ doughera\100lafcol.lafayette.edu -+ doughera\100fractal.phys.lafayette.edu -+ doughera.lafayette.edu -+ doughera\100newton.phys.lafayette.edu - -gbarr gbarr\100pobox.com -+ bodg\100tiuk.ti.com -+ gbarr\100ti.com -+ graham.barr\100tiuk.ti.com -+ gbarr\100monty.mutatus.co.uk -gisle gisle\100aas.no -+ gisle\100activestate.com -+ aas\100aas.no -+ aas\100bergen.sn.no -gsar gsar\100cpan.org -+ gsar\100activestate.com -+ gsar\100engin.umich.edu -hv hv\100crypt.org -+ hv\100crypt.compulink.co.uk -+ hv\100iii.co.uk -jhi jhi\100iki.fi -+ jhietaniemi\100gmail.com -+ jhi\100kosh.hut.fi -+ jhi\100alpha.hut.fi -+ jhi\100cc.hut.fi -+ jhi\100hut.fi -+ jarkko.hietaniemi\100nokia.com -+ jarkko.hietaniemi\100cc.hut.fi -+ jarkko.hietaniemi\100booking.com -jesse jesse\100fsck.com -+ jesse\100bestpractical.com -+ jesse\100perl.org -merijn h.m.brand\100xs4all.nl -+ h.m.brand\100procura.nl -+ merijn.brand\100procura.nl -+ h.m.brand\100hccnet.nl -+ merijn\100l1.procura.nl -+ merijn\100a5.(none) -+ perl5\100tux.freedom.nl -mhx mhx-perl\100gmx.net -+ mhx\100r2d2.(none) -+ mhx\100cpan.org -mst mst\100shadowcat.co.uk -+ matthewt\100hercule.scsys.co.uk -nicholas nick\100ccl4.org -+ nick\100unfortu.net -+ nick\100talking.bollo.cx -+ nick\100plum.flirble.org -+ nick\100babyhippo.co.uk -+ nick\100bagpuss.unfortu.net -+ nick\100babyhippo.com -+ nicholas\100dromedary.ams6.corp.booking.com -+ Nicholas Clark (sans From field in mail header) -pudge pudge\100pobox.com -rgs rgs@consttype.org -+ rgarciasuarez\100free.fr -+ rgarciasuarez\100mandrakesoft.com -+ rgarciasuarez\100mandriva.com -+ rgarciasuarez\100gmail.com -+ raphel.garcia-suarez\100hexaflux.com -sky artur\100contiller.se -+ sky\100nanisky.com -+ arthur\100contiller.se -smueller smueller\100cpan.org -+ 7k8lrvf02\100sneakemail.com -+ kjx9zthh3001\100sneakemail.com -+ dtr8sin02\100sneakemail.com -+ rt8363b02\100sneakemail.com -+ o6hhmk002\100sneakemail.com -+ l2ot9pa02\100sneakemail.com -+ wyp3rlx02\100sneakemail.com -+ 0mgwtfbbq\100sneakemail.com -+ xyey9001\100sneakemail.com -steveh steve.m.hay\100googlemail.com -+ stevehay\100planit.com -+ steve.hay\100uk.radan.com -stevep steve\100fisharerojo.org -+ steve.peters\100gmail.com -+ root\100dixie.cscaper.com -timb Tim.Bunce\100pobox.com -+ tim.bunce\100ig.co.uk -tonyc tony\100develop-help.com -+ tony\100openbsd32.tony.develop-help.com -+ tony\100saturn.(none) - -# -# Mere mortals. -# -\043####\100juerd.nl juerd\100cpan.org -+ juerd\100c3.convolution.nl -+ juerd\100convolution.nl -a.r.ferreira\100gmail.com aferreira\100shopzilla.com -abe\100ztreet.demon.nl abeltje\100cpan.org -abela\100hsc.fr abela\100geneanet.org -abigail\100abigail.be abigail\100foad.org -+ abigail\100abigail.nl -+ abigail\100fnx.com -aburt\100isis.cs.du.edu isis!aburt -ach\100mpe.mpg.de ach\100rosat.mpe-garching.mpg.de -adavies\100ptc.com alex.davies\100talktalk.net -ajohnson\100nvidia.com ajohnson\100wischip.com -+ anders\100broadcom.com -alexm\100netli.com alexm\100w-m.ru -alex-p5p\100earth.li alex\100rcon.rog -alexmv\100mit.edu alex\100chmrr.net -alian\100cpan.org alian\100alianwebserver.com -allen\100grumman.com allen\100gateway.grumman.com -allen\100huarp.harvard.edu nort\100bottesini.harvard.edu -+ nort\100qnx.com -allens\100cpan.org easmith\100beatrice.rutgers.edu -+ root\100dogberry.rutgers.edu -ambs\100cpan.org hashashin\100gmail.com -andrea a.koenig@mind.de -+ andreas.koenig\100anima.de -+ andreas.koenig.gmwojprw\100franz.ak.mind.de -+ andreas.koenig.7os6vvqr\100franz.ak.mind.de -+ a.koenig\100mind.de -+ k\100anna.in-berlin.de -+ andk\100cpan.org -+ koenig\100anna.mind.de -+ k\100anna.mind.de -+ root\100ak-71.mind.de -+ root\100ak-75.mind.de -+ k\100sissy.in-berlin.de -+ a.koenig\100kulturbox.de -+ k\100sissy.in-berlin.de -+ root\100dubravka.in-berlin.de -anno4000\100lublin.zrz.tu-berlin.de anno4000\100mailbox.tu-berlin.de -+ siegel\100zrz.tu-berlin.de -apocal@cpan.org perl\1000ne.us -arnold\100gnu.ai.mit.edu arnold\100emoryu2.arpa -+ gatech!skeeve!arnold -arodland\100cpan.org andrew\100hbslabs.com -arussell\100cs.uml.edu adam\100adam-pc.(none) -ash\100cpan.org ash_cpan\100firemirror.com -avar avar\100cpan.org -+ avarab\100gmail.com -bailey\100newman.upenn.edu bailey\100hmivax.humgen.upenn.edu -+ bailey\100genetics.upenn.edu -+ bailey.charles\100gmail.com -bah\100ecnvantage.com bholzman\100longitude.com -barries\100slaysys.com root\100jester.slaysys.com -bkedryna\100home.com bart\100cg681574-a.adubn1.nj.home.com -bcarter\100gumdrop.flyinganvil.org q.eibcartereio.=~m-b.{6}-cgimosx\100gumdrop.flyinganvil.org -ben_tilly\100operamail.com btilly\100gmail.com -+ ben_tilly\100hotmail.com -ben\100morrow.me.uk mauzo\100csv.warwick.ac.uk -+ mauzo\100.(none) -bepi\100perl.it enrico.sorcinelli\100gmail.com -bert\100alum.mit.edu bert\100genscan.com -bigbang7\100gmail.com ddascalescu+github\100gmail.com -blgl\100stacken.kth.se blgl\100hagernas.com -+ 2bfjdsla52kztwejndzdstsxl9athp\100gmail.com -b@os13.org brad+github\10013os.net -khw\100cpan.org khw\100karl.(none) -brian.d.foy\100gmail.com bdfoy\100cpan.org -BQW10602\100nifty.com sadahiro\100cpan.org -bulk88\100hotmail.com bulk88 - -chad.granum\100dreamhost.com exodist7\100gmail.com -choroba\100cpan.org choroba\100weed.(none) -+ choroba\100matfyz.cz -chromatic\100wgz.org chromatic\100rmci.net -ckuskie\100cadence.com colink\100perldreamer.com -claes\100surfar.nu claes\100versed.se -clintp\100geeksalad.org cpierce1\100ford.com -clkao\100clkao.org clkao\100bestpractical.com -corion\100corion.net corion\100cpan.org -+ github@corion.net -cp\100onsitetech.com publiustemp-p5p\100yahoo.com -+ publiustemp-p5p3\100yahoo.com -+ ovid\100cpan.org -cpan\100audreyt.org autrijus\100egb.elixus.org -+ autrijus\100geb.elixus.org -+ autrijus\100gmail.com -+ autrijus\100ossf.iis.sinica.edu.tw -+ autrijus\100autrijus.org -+ audreyt\100audreyt.org -cpan\100ton.iguana.be me-01\100ton.iguana.be -crt\100kiski.net perl\100ctweten.amsite.com -cp\100onsitetech.com ovid\100cpan.org -dairiki\100dairiki.org dairiki at dairiki.org -dagolden\100cpan.org xdaveg\100gmail.com -+ xdg\100xdg.me -damian\100conway.org damian\100cs.monash.edu.au -dan\100sidhe.org sugalsd\100lbcc.cc.or.us -+ sugalskd\100osshe.edu -daniel\100bitpusher.com daniel\100biz.bitpusher.com -dave\100mag-sol.com dave\100dave.org.uk -+ dave\100perlhacks.com -david.dyck\100fluke.com dcd\100tc.fluke.com -david\100justatheory.com david\100wheeler.net -+ david\100kineticode.com -+ david\100wheeler.com -+ david\100wheeler.net -whatever\100davidnicol.com davidnicol\100gmail.com -dennis\100booking.com dennis\100camel.ams6.corp.booking.com -+ dennis.kaarsemaker\100booking.com -+ dennis\100kaarsemaker.net -dev-perl\100pimb.org knew-p5p\100pimb.org -+ lists-p5p\100pimb.org -djberg86\100attbi.com djberg96\100attbi.com -dk\100tetsuo.karasik.eu.org dmitry\100karasik.eu.org -dma+github@stripysock.com dominichamon@users.noreply.github.com -dom\100earth.li dom\100semmle.com -domo\100computer.org shouldbedomo\100mac.com -+ domo\100slipper.ip.lu -+ domo\100tcp.ip.lu -dougm\100covalent.net dougm\100opengroup.org -+ dougm\100osf.org -dougw\100cpan.org doug_wilson\100intuit.com -dwegscheid\100qtm.net wegscd\100whirlpool.com -edwardp\100excitehome.net epeschko\100den-mdev1 -+ epeschko\100elmer.tci.com -+ esp5\100pge.com -egf7\100columbia.edu efifer\100sanwaint.com -eggert\100twinsun.com eggert\100sea.sm.unisys.com -etj\100cpan.org mohawk2\100users.noreply.github.com - -fugazi\100zyx.net larrysh\100cpan.org -+ lshatzer\100islanddata.com - -gbacon\100itsc.uah.edu gbacon\100adtrn-srv4.adtran.com -gerberb\100zenez.com root\100devsys0.zenez.com -gfuji\100cpan.org g.psy.va\100gmail.com -genesullivan50\100yahoo.com gsullivan\100cpan.org -gerard\100ggoossen.net gerard\100tty.nl -gibreel\100pobox.com stephen.zander\100interlock.mckesson.com -+ srz\100loopback -gideon\100cpan.org gidisrael\100gmail.com -gnat\100frii.com gnat\100prometheus.frii.com -gp\100familiehaase.de gerrit\100familiehaase.de -grazz\100pobox.com grazz\100nyc.rr.com -gward\100ase.com greg\100bic.mni.mcgill.ca -haggai\100cpan.org alanhaggai\100alanhaggai.org -+ alanhaggai\100gmail.com -hansmu\100xs4all.nl hansm\100icgroup.nl -+ hansm\100icgned.nl -+ hans\100icgned.nl -+ hans\100icgroup.nl -+ hansm\100euronet.nl -+ hansm\100euro.net -hio\100ymir.co.jp hio\100hio.jp -hops\100sco.com hops\100scoot.pdev.sco.com - -ian.goodacre\100xtra.co.nz ian\100debian.lan -ingo_weinhold\100gmx.de bonefish\100cs.tu-berlin.de - -james\100mastros.biz theorb\100desert-island.me.uk -jan\100jandubois.com jand\100activestate.com -+ jan.dubois\100ibm.net -japhy\100pobox.com japhy\100pobox.org -+ japhy\100perlmonk.org -+ japhy\100cpan.org -+ jeffp\100crusoe.net -jari.aalto\100poboxes.com jari.aalto\100cante.net -jarausch\100numa1.igpm.rwth-aachen.de helmutjarausch\100unknown -jasons\100cs.unm.edu jasons\100sandy-home.arc.unm.edu -jbuehler\100hekimian.com jhpb\100hekimian.com -jcromie\100cpan.org jcromie\100100divsol.com -+ jim.cromie\100gmail.com -jd\100cpanel.net lightsey\100debian.org -+ john\10004755.net -+ john\100nixnuts.net -jdhedden\100cpan.org jerry\100hedden.us -+ jdhedden\1001979.usna.com -+ jdhedden\100gmail.com -+ jdhedden\100yahoo.com -+ jhedden\100pn100-02-2-356p.corp.bloomberg.com -+ jdhedden\100solydxk -jeremy\100zawodny.com jzawodn\100wcnet.org -jesse\100sig.bsh.com jesse\100ginger -jfriedl\100yahoo.com jfriedl\100yahoo-inc.com -jfs\100fluent.com jfs\100jfs.fluent.com -jhannah\100mutationgrid.com jay\100jays.net -+ jhannah\100omnihotels.com -jidanni\100jidanni.org jidanni\100hoffa.dreamhost.com -jjore\100cpan.org twists\100gmail.com -jkeenan\100cpan.org jkeen\100verizon.net -+ jkeenan\100dromedary-001.ams6.corp.booking.com -jns\100integration-house.com jns\100gellyfish.com -+ gellyfish\100gellyfish.com -john\100atlantech.com john\100titanic.atlantech.com -john\100johnwright.org john.wright\100hp.com -joseph\100cscaper.com joseph\1005sigma.com -joshua\100rodd.us jrodd\100pbs.org -jtobey\100john-edwin-tobey.org jtobey\100user1.channel1.com -jpeacock\100messagesystems.com john.peacock\100havurah-software.org -+ jpeacock\100havurah-software.org -+ jpeacock\100dsl092-147-156.wdc1.dsl.speakeasy.net -+ jpeacock\100jpeacock-hp.doesntexist.org -+ jpeacock\100cpan.org -+ jpeacock\100rowman.com -james.schneider\100db.com jschneid\100netilla.com -jpl.jpl\100gmail.com jpl\100research.att.com -jql\100accessone.com jql\100jql.accessone.com -jsm28\100hermes.cam.ac.uk jsm28\100cam.ac.uk - -kane\100dwim.org kane\100xs4all.net -+ kane\100cpan.org -+ kane\100xs4all.nl -+ jos\100dwim.org -+ jib\100ripe.net -keith.s.thompson\100gmail.com kst\100mib.org -ken\100mathforum.org kenahoo\100gmail.com -+ ken.williams\100thomsonreuters.com -kentfredric\100gmail.com kentnl\100cpan.org -kmx\100volny.cz kmx\100volny.cz -+ kmx\100cpan.org -kroepke\100dolphin-services.de kay\100dolphin-services.de -kst\100mib.org kst\100cts.com -+ kst\100SDSC.EDU -kstar\100wolfetech.com kstar\100cpan.org -+ kurt_starsinic\100ml.com -+ kstar\100www.chapin.edu -+ kstar\100chapin.edu -larry\100wall.org lwall\100jpl-devvax.jpl.nasa.gov -+ lwall\100netlabs.com -+ larry\100netlabs.com -+ lwall\100sems.com -+ lwall\100scalpel.netlabs.com -laszlo.molnar\100eth.ericsson.se molnarl\100cdata.tvnet.hu -+ ml1050\100freemail.hu -lewart\100uiuc.edu lewart\100vadds.cvm.uiuc.edu -+ d-lewart\100uiuc.edu -lindblad@gmx.com 52227507+apparluk\100users.noreply.github.com -lkundrak\100v3.sk lubo.rintel\100gooddata.com -lstein\100cshl.org lstein\100formaggio.cshl.org -+ lstein\100genome.wi.mit.edu -l.mai\100web.de plokinom\100gmail.com -lupe\100lupe-christoph.de lupe\100alanya.m.isar.de -lutherh\100stratcom.com lutherh\100infinet.com -mab\100wdl.loral.com markb\100rdcf.sm.unisys.com -marcel\100codewerk.com gr\100univie.ac.at -+ hanekomu\100gmail.com -marcgreen\100cpan.org marcgreen\100wpi.edu -markleightonfisher\100gmail.com fisherm\100tce.com -+ mark-fisher\100mindspring.com -mark.p.lutz\100boeing.com tecmpl1\100triton.ca.boeing.com -marnix\100gmail.com pttesac!marnix!vanam -marty+p5p\100kasei.com marty\100martian.org -mats\100sm6sxl.net mats\100sm5sxl.net -mbarbon\100dsi.unive.it mattia.barbon\100libero.it -+ mattia\100barbon.org -mcmahon\100ibiblio.org mcmahon\100metalab.unc.edu -me\100davidglasser.net glasser\100tang-eleven-seventy-nine.mit.edu -merijnb\100iloquent.nl merijnb\100ms.com -+ merijnb\100iloquent.com -merlyn\100stonehenge.com merlyn\100gadget.cscaper.com -mestre.smash\100gmail.com smash\100cpan.org -mgjv\100comdyn.com.au mgjv\100tradingpost.com.au -mlh\100swl.msd.ray.com webtools\100uewrhp03.msd.ray.com -michael.schroeder\100informatik.uni-erlangen.de mls\100suse.de -mike\100stok.co.uk mike\100exegenix.com -61100689+mikefultondev\100users.noreply.github.com mikefultonpersonal\100gmail.com -miyagawa\100bulknews.net miyagawa\100edge.co.jp -mjtg\100cam.ac.uk mjtg\100cus.cam.ac.uk -mikedlr\100tardis.ed.ac.uk mikedlr\100it.com.pl -moritz\100casella.verplant.org moritz\100faui2k3.org -+ moritz lenz - -neale\100VMA.TABNSW.COM.AU neale\100pucc.princeton.edu -neeracher\100mac.com neeri\100iis.ee.ethz.ch -neilb\100neilb.org neilb\100cre.canon.co.uk -+ neil\100bowers.com - -nospam-abuse\100bloodgate.com tels\100bloodgate.com -+ perl_dummy\100bloodgate.com - -ian.phillipps\100iname.com ian_phillipps\100yahoo.co.uk -+ ian\100dial.pipex.com -ignasi.roca\100fujitsu-siemens.com ignasi.roca\100fujitsu.siemens.es -ikegami\100adaelis.com eric\100fmdev10.(none) -ilmari\100ilmari.org ilmari\100vesla.ilmari.org -illpide\100telecel.pt arbor\100al37al08.telecel.pt -# see http://www.nntp.perl.org/group/perl.perl5.porters/2001/01/msg28925.html -# -ilya\100math.berkeley.edu ilya\100math.ohio-state.edu -+ nospam-abuse\100ilyaz.org -+ [9]ilya\100math.ohio-state.edu -ilya\100martynov.org ilya\100juil.nonet - -joshua\100paloalto.com joshua.pritikin\100db.com - -litt\100acm.org tlhackque\100yahoo.com - -meyering@asic.sc.ti.com jim\100meyering.net - -okamoto\100corp.hp.com okamoto\100hpcc123.corp.hp.com -orwant\100oreilly.com orwant\100media.mit.edu - -p5-authors\100crystalflame.net perl\100crystalflame.net -+ rs\100crystalflame.net -+ coral\100eekeek.org -+ coral\100moonlight.crystalflame.net -+ rs\100oregonnet.com -+ rs\100topsy.com -paul.green\100stratus.com paul_greenvos\100vos.stratus.com -+ pgreen\100seussnt.stratus.com -pmqs pmqs\100cpan.org -+ paul.marquess\100btinternet.com -+ paul_marquess\100yahoo.co.uk -+ paul.marquess\100ntlworld.com -+ paul.marquess\100openwave.com -+ pmarquess\100bfsec.bt.co.uk -+ pmqs\100cpan.org -+ paul\100paul-desktop.(none) -Pavel.Zakouril\100mff.cuni.cz root\100egg.karlov.mff.cuni.cz -pcg\100goof.com schmorp\100schmorp.de -perl\100cadop.com cdp\100hpescdp.fc.hp.com -perl\100greerga.m-l.org greerga\100m-l.org -perl\100profvince.com vince\100profvince.com -perl-rt\100wizbit.be p5p\100perl.wizbit.be -# Maybe we should special case this to get real names out? -Peter.Dintelmann\100Dresdner-Bank.com peter.dintelmann\100dresdner-bank.com -# NOTE: There is an intentional trailing space in the line above -pfeifer\100wait.de pfeifer\100charly.informatik.uni-dortmund.de -+ upf\100de.uu.net -pjacklam\100online.no pjacklam\100gmail.com -ribasushi@cpan.org rabbit\100rabbit.us -+ rabbit+bugs\100rabbit.us -arc\100cpan.org perl\100aaroncrane.co.uk -+ arc@users.noreply.github.com -phil\100perkpartners.com phil\100finchcomputer.com -pimlott\100idiomtech.com andrew\100pimlott.net -+ pimlott\100abel.math.harvard.edu -pixel\100mandriva.com pixel\100mandrakesoft.com -pne\100cpan.org philip.newton\100gmx.net -+ philip.newton\100datenrevision.de -+ pnewton\100gmx.de -pprymmer\100factset.com pvhp\100forte.com -khw\100cpan.org khw\100karl.(none) -+ public\100khwilliamson.com -+ khw\100khw-desktop.(none) - -radu\100netsoft.ro rgreab\100fx.ro -raiph \100raiph -+ raiph.mellor\100gmail.com -rajagopa\100pauline.schrodinger.com rajagopa\100schrodinger.com -raphael.manfredi\100pobox.com raphael_manfredi\100grenoble.hp.com -info\100perl-services.de renee.baecker\100smart-websolutions.de -+ reneeb\100reneeb-desktop.(none) -+ github\100renee-baecker.de -+ otrs\100ubuntu.(none) -+ perl\100renee-baecker.de -+ reb\100perl-services.de -+ module\100renee-baecker.de -rich+perl\100hyphen-dash-hyphen.info richardleach\100users.noreply.github.com -richard.foley\100rfi.net richard.foley\100t-online.de -+ richard.foley\100ubs.com -+ richard.foley\100ubsw.com -rick\100consumercontact.com rick\100bort.ca -+ rick.delaney\100rogers.com -+ rick\100bort.ca -+ rick.delaney\100home.com -rjbs\100cpan.org rjbs-perl-p5p\100lists.manxome.org -+ perl.p5p\100rjbs.manxome.org -+ rjbs\100semiotic.systems -+ rjbs\100users.noreply.github.com -rjk\100linguist.dartmouth.edu rjk\100linguist.thayer.dartmouth.edu -+ rjk-perl-p5p\100tamias.net -+ rjk\100tamias.net -rjray\100redhat.com rjray\100uswest.com -rmgiroux\100acm.org rmgiroux\100hotmail.com -+ mgiroux\100bear.com -rmbarker\100cpan.org rmb1\100cise.npl.co.uk -+ robin.barker\100npl.co.uk -+ rmb\100cise.npl.co.uk -+ robin\100spade-ubuntu.(none) -+ r.m.barker\100btinternet.com -+ rmbarker.cpan\100btinternet.com -robertmay\100cpan.org rob\100themayfamily.me.uk -roberto\100keltia.freenix.fr roberto\100eurocontrol.fr -robin\100cpan.org robin\100kitsite.com -roderick\100argon.org roderick\100gate.net -+ roderick\100ibcinc.com -argrath\100ub32.org root\100ub32.org -rootbeer\100teleport.com rootbeer\100redcat.com -+ tomphoenix\100unknown -rra\100stanford.edu rra\100cpan.org -rurban\100cpan.org rurban\100x-ray.at -+ rurban\100cpanel.net -rvtol+news\100isolution.nl rvtol\100isolution.nl -sartak\100gmail.com sartak\100bestpractical.com -+ code\100sartak.org -danny-cpan\100sadinoff.com sadinoff\100olf.com -schubiger\100cpan.org steven\100accognoscere.org -+ sts\100accognoscere.org -+ schubiger\100gmail.com -+ stsc\100refcnt.org -schwern\100pobox.com schwern\100gmail.com -+ schwern\100athens.arena-i.com -+ schwern\100blackrider.aocn.com -+ schwern\100ool-18b93024.dyn.optonline.net -scop\100cs132170.pp.htv.fi ville.skytta\100iki.fi -scotth\100sgi.com author scotth\100sgi.com 842220273 +0000 -+ schotth\100sgi.com -schwab\100suse.de schwab\100issan.informatik.uni-dortmund.de -+ schwab\100ls5.informatik.uni-dortmund.de -sebastien\100aperghis.net maddingue\100free.fr -+ saper\100cpan.org -shigeya\100wide.ad.jp shigeya\100foretune.co.jp -shlomif\100cpan.org shlomif\100vipe.technion.ac.il -+ shlomif\100iglu.org.il -+ shlomif+processed-by-perl\100gmail.com -+ shlomif\100shlomifish.org -simon\100netthink.co.uk simon\100simon-cozens.org -+ simon\100pembro4.pmb.ox.ac.uk -+ simon\100brecon.co.uk -+ simon\100othersideofthe.earth.li -+ simon\100cozens.net -+ -sisyphus\100cpan.org sisyphus1\100optusnet.com.au -+ sisyphus359\100gmail.com -lannings\100who.int lannings\100gmail.com -+ slanning\100cpan.org -slaven\100rezic.de slaven.rezic\100berlin.de -+ srezic\100iconmobile.com -+ srezic\100cpan.org -+ eserte\100cs.tu-berlin.de -+ eserte\100vran.herceg.de -smcc\100mit.edu smcc\100ocf.berkeley.edu -+ smcc\100csua.berkeley.edu -+ alias\100mcs.com -+ smccam\100uclink4.berkeley.edu -spider\100orb.nashua.nh.us spider\100web.zk3.dec.com -+ spider\100leggy.zk3.dec.com -+ spider-perl\100orb.nashua.nh.us -+ spider\100peano.zk3.dec.com -+ spider.boardman\100orb.nashua.nh.us> -+ spidb\100cpan.org -+ spider.boardman\100orb.nashua.nh.us -+ root\100peano.zk3.dec.com -s.denaxas\100gmail.com spiros\100lokku.com -spp\100ds.net spp\100psa.pencom.com -+ spp\100psasolar.colltech.com -+ spp\100spotter.yi.org -stef\100mongueurs.net stef\100payrard.net -+ s.payrard\100wanadoo.fr -+ properler\100freesurf.fr -+ stef\100francenet.fr -stevan\100cpan.org stevan.little\100gmail.com -+ stevan.little\100iinteractive.com -sthoenna\100efn.org ysth\100raven.shiftboard.com - -tassilo.parseval\100post.rwth-aachen.de tassilo.von.parseval\100rwth-aachen.de -tchrist\100perl.com tchrist\100mox.perl.com -+ tchrist\100jhereg.perl.com -thomas.dorner\100start.de tdorner\100amadeus.net -tjenness\100cpan.org t.jenness\100jach.hawaii.edu -+ timj\100jach.hawaii.edu -tobez\100tobez.org tobez\100plab.ku.dk -toddr\100cpan.org toddr\100cpanel.net -tom\100compton.nu thh\100cyberscience.com -tom.horsley\100mail.ccur.com tom.horsley\100ccur.com -+ tom\100amber.ssd.hcsc.com - -vkonovalov\100lucent.com vkonovalov\100peterstar.ru -+ konovalo\100mail.wplus.net -+ vadim\100vkonovalov.ru -+ vkonovalov\100spb.lucent.com -+ vkonovalov\100alcatel-lucent.com -+ vadim.konovalov\100alcatel-lucent.com - -whatever\100davidnicol.com davidnicol\100gmail.com -wolfgang.laun\100alcatel.at wolfgang.laun\100chello.at -+ wolfgang.laun\100thalesgroup.com -+ wolfgang.laun\100gmail.com -wolfsage\100gmail.com mhorsfall\100darmstadtium.(none) -yath\100yath.de yath-perlbug\100yath.de Index: gnu/usr.bin/perl/Porting/checkcfgvar.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/checkcfgvar.pl,v diff -u -p -a -u -p -r1.5 checkcfgvar.pl --- gnu/usr.bin/perl/Porting/checkcfgvar.pl 15 Feb 2023 01:36:14 -0000 1.5 +++ gnu/usr.bin/perl/Porting/checkcfgvar.pl 21 Feb 2024 15:47:00 -0000 @@ -7,34 +7,29 @@ # # VMS is probably not handled properly here, due to their own # rather elaborate DCL scripting. -# use strict; use warnings; use autodie; -sub usage -{ +sub usage { my $err = shift and select STDERR; print "usage: $0 [--list] [--regen] [--default=value]\n"; exit $err; } # usage -use Getopt::Long; -my $opt_l = 0; -my $opt_r = 0; -my $default; -my $tap = 0; -my $test; +use Getopt::Long qw(:config bundling); GetOptions ( - "help|?" => sub { usage (0); }, - "l|list!" => \$opt_l, - "regen" => \$opt_r, - "default=s" => \$default, - "tap" => \$tap, + "help|?" => sub { usage (0); }, + "l|list!" => \(my $opt_l = 0), + "regen" => \(my $opt_r = 0), + "default=s" => \ my $default, + "tap" => \(my $tap = 0), + "v|verbose:1" => \(my $opt_v = 0), ) or usage (1); $default and $default =~ s/^'(.*)'$/$1/; # Will be quoted on generation +my $test; require './regen/regen_lib.pl' if $opt_r; @@ -61,6 +56,7 @@ my @CFG = ( my @MASTER_CFG; { my %seen; + $opt_v and warn "Reading $MASTER_CFG ...\n"; open my $fh, '<', $MASTER_CFG; while (<$fh>) { while (/[^\\]\$([a-z]\w+)/g) { @@ -76,6 +72,7 @@ my @MASTER_CFG; my %MANIFEST; { + $opt_v and warn "Reading MANIFEST ...\n"; open my $fh, '<', 'MANIFEST'; while (<$fh>) { $MANIFEST{$1}++ if /^(.+?)\t/; @@ -87,14 +84,15 @@ printf "1..%d\n", 2 * @CFG if $tap; for my $cfg (sort @CFG) { unless (exists $MANIFEST{$cfg}) { - print STDERR "[skipping not-expected '$cfg']\n"; + warn "[skipping not-expected '$cfg']\n"; next; } my %cfg; my $section = 0; my @lines; - open my $fh, '<', $cfg; + $opt_v and warn "Reading $cfg ...\n"; + open my $fh, '<', $cfg or die "$cfg: $!\n"; if ($cfg eq 'configure.com') { ++$cfg{startperl}; # Cheat. Index: gnu/usr.bin/perl/Porting/cmpVERSION.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/cmpVERSION.pl,v diff -u -p -a -u -p -r1.6 cmpVERSION.pl --- gnu/usr.bin/perl/Porting/cmpVERSION.pl 15 Feb 2023 01:36:14 -0000 1.6 +++ gnu/usr.bin/perl/Porting/cmpVERSION.pl 21 Feb 2024 15:47:00 -0000 @@ -19,13 +19,14 @@ use 5.006; use ExtUtils::MakeMaker; use File::Spec::Functions qw(devnull); use Getopt::Long; +use Time::Local qw(timelocal_posix); my ($diffs, $exclude_upstream, $tag_to_compare, $tap); unless (GetOptions('diffs' => \$diffs, - 'exclude|x' => \$exclude_upstream, - 'tag=s' => \$tag_to_compare, - 'tap' => \$tap, - ) && @ARGV == 0) { + 'exclude|x' => \$exclude_upstream, + 'tag=s' => \$tag_to_compare, + 'tap' => \$tap, + ) && @ARGV == 0) { die "usage: $0 [ -d -x --tag TAG --tap]"; } @@ -39,12 +40,12 @@ if (-d ".git" || (exists $ENV{GIT_DIR} & my $found; if (-f '.git') { # the hash of the initial commit in perl.git (perl-1.0) - my $commit = '8d063cd8450e59ea1c611a2f4f5a21059a2804f1'; - my $out = `git rev-parse --verify --quiet '$commit^{commit}'`; - chomp $out; - if($out eq $commit) { + my $commit = '8d063cd8450e59ea1c611a2f4f5a21059a2804f1'; + my $out = `git rev-parse --verify --quiet '$commit^{commit}'`; + chomp $out; + if($out eq $commit) { ++$found; - } + } } die "$0: This is a Perl directory but does not look like Git working directory\n" @@ -68,7 +69,7 @@ unless (defined $tag_to_compare) { unless (length $tag_to_compare) { die "$0: Git found, but no Git tags found\n" - unless $tap; + unless $tap; print "1..0 # SKIP: Git found, but no Git tags found\n"; exit 0; } @@ -82,15 +83,45 @@ unless ($tag_exists eq $tag_to_compare) exit 0; } +my $commit_epoch = `git log -1 --format="%ct"`; +chomp($commit_epoch); +# old git versions dont support taggerdate:unix. so use :iso8601 and then +# use timelocal_posix() to convert to an epoch. +my $tag_date = `git for-each-ref --format="%(taggerdate:iso8601)" refs/tags/$tag_to_compare`; +chomp($tag_date); +my $tag_epoch= do { + my ($Y,$M,$D,$h,$m,$s) = split /[- :]/, $tag_date; # 2023-03-20 22:49:09 + timelocal_posix($s,$m,$h,$D,$M,$Y); +}; + +if ($commit_epoch - $tag_epoch > 60 * 24 * 60 * 60) { + my $months = sprintf "%.2f", ($commit_epoch - $tag_epoch) / (30 * 24 * 60 * 60); + my $message= + "Tag '$tag_to_compare' is very old compared to the most recent commit.\n" + . "We normally release a new version every month, and this one is $months months\n" + . "older than the current commit. You probably have not synchronized your tags.\n" + . "This is common with github clones. You can try the following:\n" + . "\n" + . " git remote add -f upstream git\@github.com:Perl/perl5.git\n" + . "\n" + . "to fix your checkout.\n"; + die "$0: $message" unless $tap; + $message= "$message"; + $message=~s/^/# /mg; + print STDERR "\n$message"; + print "1..0 # SKIP: Tag '$tag_to_compare' is $months months old. Update your tags!\n"; + exit 0; +} + my %upstream_files; if ($exclude_upstream) { unshift @INC, 'Porting'; require Maintainers; for my $m (grep {!defined $Maintainers::Modules{$_}{UPSTREAM} - or $Maintainers::Modules{$_}{UPSTREAM} ne 'blead'} - keys %Maintainers::Modules) { - $upstream_files{$_} = 1 for Maintainers::get_module_files($m); + or $Maintainers::Modules{$_}{UPSTREAM} ne 'blead'} + keys %Maintainers::Modules) { + $upstream_files{$_} = 1 for Maintainers::get_module_files($m); } } @@ -140,8 +171,8 @@ my %skip; # usually due to some # mix-up my %skip_versions = ( - # 'some/sample/file.pm' => [ '1.23', '1.24' ], - ); + # 'some/sample/file.pm' => [ '1.23', '1.24' ], +); my $skip_dirs = qr|^t/lib|; @@ -149,30 +180,30 @@ sub pm_file_from_xs { my $xs = shift; foreach my $try (sub { - # First try a .pm at the same level as the .xs file - # with the same basename - return shift =~ s/\.xs\z//r; - }, - sub { - # Try for a (different) .pm at the same level, based - # on the directory name: - my ($path) = shift =~ m!^(.*)/!; - my ($last) = $path =~ m!([^-/]+)\z!; - return "$path/$last"; - }, - sub { - # Try to work out the extension's full package, and - # look for a .pm in lib/ based on that: - my ($path) = shift =~ m!^(.*)/!; - my ($last) = $path =~ m!([^/]+)\z!; - $last = 'List-Util' if $last eq 'Scalar-List-Utils'; - $last =~ tr !-!/!; - return "$path/lib/$last"; - }) { - # For all cases, first look to see if the .pm file is generated. - my $base = $try->($xs); - return "${base}_pm.PL" if -f "${base}_pm.PL"; - return "${base}.pm" if -f "${base}.pm"; + # First try a .pm at the same level as the .xs file + # with the same basename + return shift =~ s/\.xs\z//r; + }, + sub { + # Try for a (different) .pm at the same level, based + # on the directory name: + my ($path) = shift =~ m!^(.*)/!; + my ($last) = $path =~ m!([^-/]+)\z!; + return "$path/$last"; + }, + sub { + # Try to work out the extension's full package, and + # look for a .pm in lib/ based on that: + my ($path) = shift =~ m!^(.*)/!; + my ($last) = $path =~ m!([^/]+)\z!; + $last = 'List-Util' if $last eq 'Scalar-List-Utils'; + $last =~ tr !-!/!; + return "$path/lib/$last"; + }) { + # For all cases, first look to see if the .pm file is generated. + my $base = $try->($xs); + return "${base}_pm.PL" if -f "${base}_pm.PL"; + return "${base}.pm" if -f "${base}.pm"; } die "No idea which .pm file corresponds to '$xs', so aborting"; @@ -185,6 +216,7 @@ sub pm_file_from_xs { # with XS modules with more than one XS file, and "interesting" layouts. my %module_diffs; +my %dist_diffs; foreach (`git --no-pager diff --name-only $tag_to_compare --diff-filter=ACMRTUXB`) { chomp; @@ -193,24 +225,27 @@ foreach (`git --no-pager diff --name-onl next if $this_dir =~ $skip_dirs || exists $skip{$_}; next if exists $upstream_files{$_}; if (/\.pm\z/ || m|^lib/.*\.pl\z| || /_pm\.PL\z/) { - push @{$module_diffs{$_}}, $_; + push @{$module_diffs{$_}}, $_; } elsif (/\.xs\z/ && !/\bt\b/) { - push @{$module_diffs{pm_file_from_xs($_)}}, $_; + push @{$module_diffs{pm_file_from_xs($_)}}, $_; + } elsif (!/\bt\b/ && /\.[ch]\z/ && m!^((?:dist|ext|cpan)/[^/]+)/!) { + push @{ $dist_diffs{$1} }, $_; } } -unless (%module_diffs) { +unless (%module_diffs || %dist_diffs) { print "1..1\nok 1 - No difference found\n" if $tap; exit; } -printf "1..%d\n" => scalar keys %module_diffs if $tap; +printf "1..%d\n" => (keys(%module_diffs) + keys (%dist_diffs)) if $tap; print "#\n# Comparing against $tag_to_compare ....\n#\n" if $tap; my $count; my $diff_cmd = "git --no-pager diff $tag_to_compare "; my $q = ($^O eq 'MSWin32' || $^O eq 'VMS') ? '"' : "'"; my (@diff); +my %dist_bumped; foreach my $pm_file (sort keys %module_diffs) { # git has already told us that the files differ, so no need to grab each as @@ -223,34 +258,59 @@ foreach my $pm_file (sort keys %module_d if (!defined $orig_pm_version || $orig_pm_version eq 'undef') { # sigh print "ok $count - SKIP Can't parse \$VERSION in $pm_file\n" if $tap; + + # Behave like a version bump if the orig version could not be parsed, + # but the current file could + if (defined $pm_version && $pm_version ne 'undef' && $pm_file =~ m!^((?:dist|ext|cpan)/[^/]+)/!) { + $dist_bumped{$1}++; + } } elsif (!defined $pm_version || $pm_version eq 'undef') { my $nok = "not ok $count - in $pm_file version was $orig_pm_version, now unparsable\n"; print $nok if $tap; print STDERR "# $nok\n"; } elsif ($pm_version ne $orig_pm_version) { # good print "ok $count - $pm_file\n" if $tap; + if ($pm_file =~ m!^((?:dist|ext|cpan)/[^/]+)/!) { + $dist_bumped{$1}++; + } } else { - if ($tap) { + if ($tap) { print "#\n# " . '-' x 75 . "\n" . "# Version number ($pm_version) unchanged since" . " $tag_to_compare, but contents have changed:\n#\n"; - foreach (sort @{$module_diffs{$pm_file}}) { - print "# $_" for `$diff_cmd $q$_$q`; - } + foreach (sort @{$module_diffs{$pm_file}}) { + print "# $_" for `$diff_cmd $q$_$q`; + } print "# " . '-' x 75 . "\n"; - if (exists $skip_versions{$pm_file} - and grep $pm_version eq $_, @{$skip_versions{$pm_file}}) { - print "ok $count - SKIP $pm_file version $pm_version\n"; - } else { - my $nok = "not ok $count - $pm_file version $pm_version\n"; - print $nok; - print STDERR "# $nok"; - } - } else { - push @diff, @{$module_diffs{$pm_file}}; - print "$pm_file version $pm_version\n"; - } + if (exists $skip_versions{$pm_file} + and grep $pm_version eq $_, @{$skip_versions{$pm_file}}) { + print "ok $count - SKIP $pm_file version $pm_version\n"; + } else { + my $nok = "not ok $count - $pm_file version $pm_version\n"; + print $nok; + print STDERR "# $nok"; + } + } else { + push @diff, @{$module_diffs{$pm_file}}; + print "$pm_file version $pm_version\n"; + } + } +} + +foreach my $dist (sort keys %dist_diffs) { + my $file_count = @{ $dist_diffs{$dist} }; + my $msg = $file_count == 1 ? "file was" : "files were"; + ++$count; + + if ($dist_bumped{$dist}) { + print "ok $count - in $dist $file_count $msg modified and a version was bumped\n"; + } else { + my $nok = "not ok $count - in $dist $file_count $msg modified but no versions were bumped\n"; + print "# No versions bumped in $dist but $file_count $msg modified\n"; + print "# $_\n" for (sort @{$dist_diffs{$dist}}); + print $nok if $tap; + print STDERR "# $nok\n"; } } @@ -264,7 +324,7 @@ sub get_file_from_git { if ($diffs) { for (sort @diff) { - print "\n"; - system "$diff_cmd $q$_$q"; + print "\n"; + system "$diff_cmd $q$_$q"; } } Index: gnu/usr.bin/perl/Porting/config.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/config.sh,v diff -u -p -a -u -p -r1.17 config.sh --- gnu/usr.bin/perl/Porting/config.sh 23 Dec 2023 21:02:20 -0000 1.17 +++ gnu/usr.bin/perl/Porting/config.sh 21 Feb 2024 15:47:00 -0000 @@ -8,25 +8,20 @@ # Package name : perl5 # Source directory : . -# Configuration time: Sat Aug 22 16:03:38 CEST 2020 -# Configured by : yourname -# Target system : linux lx09 5.8.0-1-default #1 smp tue aug 4 07:30:59 utc 2020 (9bc0044) x86_64 x86_64 x86_64 gnulinux +# Configuration time: Fri Apr 28 15:57:25 CEST 2023 +# Configured by : merijn +# Target system : linux lx09 6.2.12-1-default #1 smp preempt_dynamic thu apr 20 11:01:10 utc 2023 (eb3255d) x86_64 x86_64 x86_64 gnulinux : Configure command line arguments. -config_arg0='Configure' -config_args='-Dprefix=/opt/perl -Dcf_by=yourname -Dcf_email=yourname@yourhost.yourplace.com -Dperladmin=yourname@yourhost.yourplace.com -Dmydomain=.yourplace.com -Dmyhostname=yourhost -Duse64bitint -Duselongdouble -Dusethreads -Dusedevel -des' -config_argc=11 -config_arg1='-Dprefix=/opt/perl' -config_arg2='-Dcf_by=yourname' -config_arg3='-Dcf_email=yourname@yourhost.yourplace.com' -config_arg4='-Dperladmin=yourname@yourhost.yourplace.com' -config_arg5='-Dmydomain=.yourplace.com' -config_arg6='-Dmyhostname=yourhost' -config_arg7='-Duse64bitint' -config_arg8='-Duselongdouble' -config_arg9='-Dusethreads' -config_arg10='-Dusedevel' -config_arg11='-des' +config_arg0='./Configure' +config_args='-Dusedevel -Duse64bitall -Dusequadmath -Dusethreads -Duseithreads -des' +config_argc=6 +config_arg1='-Dusedevel' +config_arg2='-Duse64bitall' +config_arg3='-Dusequadmath' +config_arg4='-Dusethreads' +config_arg5='-Duseithreads' +config_arg6='-des' Author='' Date='' @@ -44,24 +39,24 @@ _o='.o' afs='false' afsroot='/afs' alignbytes='16' -aphostname='' +aphostname='/usr/bin/hostname' api_revision='5' api_subversion='0' -api_version='36' -api_versionstring='5.36.0' +api_version='38' +api_versionstring='5.38.0' ar='ar' -archlib='/opt/perl/lib/5.36.3/x86_64-linux-thread-multi-ld' -archlibexp='/opt/perl/lib/5.36.3/x86_64-linux-thread-multi-ld' +archlib='/pro/lib/perl5/5.38.2/x86_64-linux-thread-multi-quadmath' +archlibexp='/pro/lib/perl5/5.38.2/x86_64-linux-thread-multi-quadmath' archname64='' -archname='x86_64-linux-thread-multi-ld' +archname='x86_64-linux-thread-multi-quadmath' archobjs='' asctime_r_proto='REENTRANT_PROTO_B_SB' awk='awk' baserev='5.0' bash='' -bin='/opt/perl/bin' +bin='/pro/bin' bin_ELF='define' -binexp='/opt/perl/bin' +binexp='/pro/bin' bison='bison' byacc='byacc' byteorder='12345678' @@ -71,14 +66,14 @@ cat='cat' cc='cc' cccdlflags='-fPIC' ccdlflags='-Wl,-E' -ccflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2' +ccflags='-D_REENTRANT -D_GNU_SOURCE -pie -fPIE -fPIC -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2' ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' ccname='gcc' ccsymbols='' ccversion='' -cf_by='yourname' -cf_email='yourname@yourhost.yourplace.com' -cf_time='Sat Aug 22 16:03:38 CEST 2020' +cf_by='merijn' +cf_email='hmbrand@cpan.org' +cf_time='Fri Apr 28 15:57:25 CEST 2023' charbits='8' charsize='1' chgrp='' @@ -94,18 +89,18 @@ cpio='' cpp='cpp' cpp_stuff='42' cppccsymbols='' -cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include' +cppflags='-D_REENTRANT -D_GNU_SOURCE -pie -fPIE -fPIC -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include' cpplast='-' cppminus='-' cpprun='cc -E' cppstdin='cc -E' -cppsymbols='__amd64=1 __amd64__=1 __ATOMIC_ACQ_REL=4 __ATOMIC_ACQUIRE=2 __ATOMIC_CONSUME=1 __ATOMIC_HLE_ACQUIRE=65536 __ATOMIC_HLE_RELEASE=131072 __ATOMIC_RELAXED=0 __ATOMIC_RELEASE=3 __ATOMIC_SEQ_CST=5 __BIGGEST_ALIGNMENT__=16 __BYTE_ORDER__=1234 __CHAR16_TYPE__=short\ unsigned\ int __CHAR32_TYPE__=unsigned\ int __CHAR_BIT__=8 __code_model_small__=1 __DBL_DECIMAL_DIG__=17 __DBL_DENORM_MIN__=((double)4.94065645841246544176568792868221372e-324L) __DBL_DIG__=15 __DBL_EPSILON__=((double)2.22044604925031308084726333618164062e-16L) __DBL_HAS_DENORM__=1 __DBL_HAS_INFINITY__=1 __DBL_HAS_QUIET_NAN__=1 __DBL_MANT_DIG__=53 __DBL_MAX_10_EXP__=308 __DBL_MAX__=((double)1.79769313486231570814527423731704357e+308L) __DBL_MAX_EXP__=1024 __DBL_MIN_10_EXP__=(-307) __DBL_MIN__=((double)2.22507385850720138309023271733240406e-308L) __DBL_MIN_EXP__=(-1021) __DBL_NORM_MAX__=((double)1.79769313486231570814527423731704357e+308L) __DEC128_EPSILON__=1E-33DL __DEC128_MANT_DIG__=34 __DEC128_MAX__=9.999999999999999999999999999999999E6144DL __DEC128_MAX_EXP__=6145 __DEC128_MIN__=1E-6143DL __DEC128_MIN_EXP__=(-6142) __DEC128_SUBNORMAL_MIN__=0.000000000000000000000000000000001E-6143DL __DEC32_EPSILON__=1E-6DF __DEC32_MANT_DIG__=7 __DEC32_MAX__=9.999999E96DF __DEC32_MAX_EXP__=97 __DEC32_MIN__=1E-95DF __DEC32_MIN_EXP__=(-94) __DEC32_SUBNORMAL_MIN__=0.000001E-95DF __DEC64_EPSILON__=1E-15DD __DEC64_MANT_DIG__=16 __DEC64_MAX__=9.999999999999999E384DD __DEC64_MAX_EXP__=385 __DEC64_MIN__=1E-383DD __DEC64_MIN_EXP__=(-382) __DEC64_SUBNORMAL_MIN__=0.000000000000001E-383DD __DEC_EVAL_METHOD__=2 __DECIMAL_BID_FORMAT__=1 __DECIMAL_DIG__=21 __ELF__=1 _FILE_OFFSET_BITS=64 __FINITE_MATH_ONLY__=0 __FLOAT_WORD_ORDER__=1234 __FLT128_DECIMAL_DIG__=36 __FLT128_DENORM_MIN__=6.47517511943802511092443895822764655e-4966F128 __FLT128_DIG__=33 __FLT128_EPSILON__=1.92592994438723585305597794258492732e-34F128 __FLT128_HAS_DENORM__=1 __FLT128_HAS_INFINITY__=1 __FLT128_HAS_QUIET_NAN__=1 __FLT128_MANT_DIG__=113 __FLT128_MAX_10_EXP__=4932 __FLT128_MAX__=1.18973149535723176508575932662800702e+4932F128 __FLT128_MAX_EXP__=16384 __FLT128_MIN_10_EXP__=(-4931) __FLT128_MIN__=3.36210314311209350626267781732175260e-4932F128 __FLT128_MIN_EXP__=(-16381) __FLT128_NORM_MAX__=1.18973149535723176508575932662800702e+4932F128 __FLT32_DECIMAL_DIG__=9 __FLT32_DENORM_MIN__=1.40129846432481707092372958328991613e-45F32 __FLT32_DIG__=6 __FLT32_EPSILON__=1.19209289550781250000000000000000000e-7F32 __FLT32_HAS_DENORM__=1 __FLT32_HAS_INFINITY__=1 __FLT32_HAS_QUIET_NAN__=1 __FLT32_MANT_DIG__=24 __FLT32_MAX_10_EXP__=38 __FLT32_MAX__=3.40282346638528859811704183484516925e+38F32 __FLT32_MAX_EXP__=128 __FLT32_MIN_10_EXP__=(-37) __FLT32_MIN__=1.17549435082228750796873653722224568e-38F32 __FLT32_MIN_EXP__=(-125) __FLT32_NORM_MAX__=3.40282346638528859811704183484516925e+38F32 __FLT32X_DECIMAL_DIG__=17 __FLT32X_DENORM_MIN__=4.94065645841246544176568792868221372e-324F32x __FLT32X_DIG__=15 __FLT32X_EPSILON__=2.22044604925031308084726333618164062e-16F32x __FLT32X_HAS_DENORM__=1 __FLT32X_HAS_INFINITY__=1 __FLT32X_HAS_QUIET_NAN__=1 __FLT32X_MANT_DIG__=53 __FLT32X_MAX_10_EXP__=308 __FLT32X_MAX__=1.79769313486231570814527423731704357e+308F32x __FLT32X_MAX_EXP__=1024 __FLT32X_MIN_10_EXP__=(-307) __FLT32X_MIN__=2.22507385850720138309023271733240406e-308F32x __FLT32X_MIN_EXP__=(-1021) __FLT32X_NORM_MAX__=1.79769313486231570814527423731704357e+308F32x __FLT64_DECIMAL_DIG__=17 __FLT64_DENORM_MIN__=4.94065645841246544176568792868221372e-324F64 __FLT64_DIG__=15 __FLT64_EPSILON__=2.22044604925031308084726333618164062e-16F64 __FLT64_HAS_DENORM__=1 __FLT64_HAS_INFINITY__=1 __FLT64_HAS_QUIET_NAN__=1 __FLT64_MANT_DIG__=53 __FLT64_MAX_10_EXP__=308 __FLT64_MAX__=1.79769313486231570814527423731704357e+308F64 __FLT64_MAX_EXP__=1024 __FLT64_MIN_10_EXP__=(-307) __FLT64_MIN__=2.22507385850720138309023271733240406e-308F64 __FLT64_MIN_EXP__=(-1021) __FLT64_NORM_MAX__=1.79769313486231570814527423731704357e+308F64 __FLT64X_DECIMAL_DIG__=21 __FLT64X_DENORM_MIN__=3.64519953188247460252840593361941982e-4951F64x __FLT64X_DIG__=18 __FLT64X_EPSILON__=1.08420217248550443400745280086994171e-19F64x __FLT64X_HAS_DENORM__=1 __FLT64X_HAS_INFINITY__=1 __FLT64X_HAS_QUIET_NAN__=1 __FLT64X_MANT_DIG__=64 __FLT64X_MAX_10_EXP__=4932 __FLT64X_MAX__=1.18973149535723176502126385303097021e+4932F64x __FLT64X_MAX_EXP__=16384 __FLT64X_MIN_10_EXP__=(-4931) __FLT64X_MIN__=3.36210314311209350626267781732175260e-4932F64x __FLT64X_MIN_EXP__=(-16381) __FLT64X_NORM_MAX__=1.18973149535723176502126385303097021e+4932F64x __FLT_DECIMAL_DIG__=9 __FLT_DENORM_MIN__=1.40129846432481707092372958328991613e-45F __FLT_DIG__=6 __FLT_EPSILON__=1.19209289550781250000000000000000000e-7F __FLT_EVAL_METHOD__=0 __FLT_EVAL_METHOD_TS_18661_3__=0 __FLT_HAS_DENORM__=1 __FLT_HAS_INFINITY__=1 __FLT_HAS_QUIET_NAN__=1 __FLT_MANT_DIG__=24 __FLT_MAX_10_EXP__=38 __FLT_MAX__=3.40282346638528859811704183484516925e+38F __FLT_MAX_EXP__=128 __FLT_MIN_10_EXP__=(-37) __FLT_MIN__=1.17549435082228750796873653722224568e-38F __FLT_MIN_EXP__=(-125) __FLT_NORM_MAX__=3.40282346638528859811704183484516925e+38F __FLT_RADIX__=2 __FXSR__=1 __GCC_ASM_FLAG_OUTPUTS__=1 __GCC_ATOMIC_BOOL_LOCK_FREE=2 __GCC_ATOMIC_CHAR16_T_LOCK_FREE=2 __GCC_ATOMIC_CHAR32_T_LOCK_FREE=2 __GCC_ATOMIC_CHAR_LOCK_FREE=2 __GCC_ATOMIC_INT_LOCK_FREE=2 __GCC_ATOMIC_LLONG_LOCK_FREE=2 __GCC_ATOMIC_LONG_LOCK_FREE=2 __GCC_ATOMIC_POINTER_LOCK_FREE=2 __GCC_ATOMIC_SHORT_LOCK_FREE=2 __GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1 __GCC_ATOMIC_WCHAR_T_LOCK_FREE=2 __GCC_HAVE_DWARF2_CFI_ASM=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8=1 __GCC_IEC_559=2 __GCC_IEC_559_COMPLEX=2 __GLIBC__=2 __GLIBC_MINOR__=31 __GNUC__=10 __GNUC_MINOR__=2 __GNUC_PATCHLEVEL__=1 __GNUC_STDC_INLINE__=1 __GNU_LIBRARY__=6 __gnu_linux__=1 _GNU_SOURCE=1 __GXX_ABI_VERSION=1014 __HAVE_SPECULATION_SAFE_VALUE=1 __INT16_C=__INT16_C __INT16_MAX__=0x7fff __INT16_TYPE__=short\ int __INT32_C=__INT32_C __INT32_MAX__=0x7fffffff __INT32_TYPE__=int __INT64_C=__INT64_C __INT64_MAX__=0x7fffffffffffffffL __INT64_TYPE__=long\ int __INT8_C=__INT8_C __INT8_MAX__=0x7f __INT8_TYPE__=signed\ char __INT_FAST16_MAX__=0x7fffffffffffffffL __INT_FAST16_TYPE__=long\ int __INT_FAST16_WIDTH__=64 __INT_FAST32_MAX__=0x7fffffffffffffffL __INT_FAST32_TYPE__=long\ int __INT_FAST32_WIDTH__=64 __INT_FAST64_MAX__=0x7fffffffffffffffL __INT_FAST64_TYPE__=long\ int __INT_FAST64_WIDTH__=64 __INT_FAST8_MAX__=0x7f __INT_FAST8_TYPE__=signed\ char __INT_FAST8_WIDTH__=8 __INT_LEAST16_MAX__=0x7fff __INT_LEAST16_TYPE__=short\ int __INT_LEAST16_WIDTH__=16 __INT_LEAST32_MAX__=0x7fffffff __INT_LEAST32_TYPE__=int __INT_LEAST32_WIDTH__=32 __INT_LEAST64_MAX__=0x7fffffffffffffffL __INT_LEAST64_TYPE__=long\ int __INT_LEAST64_WIDTH__=64 __INT_LEAST8_MAX__=0x7f __INT_LEAST8_TYPE__=signed\ char __INT_LEAST8_WIDTH__=8 __INT_MAX__=0x7fffffff __INTMAX_C=__INTMAX_C __INTMAX_MAX__=0x7fffffffffffffffL __INTMAX_TYPE__=long\ int __INTMAX_WIDTH__=64 __INTPTR_MAX__=0x7fffffffffffffffL __INTPTR_TYPE__=long\ int __INTPTR_WIDTH__=64 __INT_WIDTH__=32 __k8=1 __k8__=1 _LARGEFILE64_SOURCE=1 _LARGEFILE_SOURCE=1 __LDBL_DECIMAL_DIG__=21 __LDBL_DENORM_MIN__=3.64519953188247460252840593361941982e-4951L __LDBL_DIG__=18 __LDBL_EPSILON__=1.08420217248550443400745280086994171e-19L __LDBL_HAS_DENORM__=1 __LDBL_HAS_INFINITY__=1 __LDBL_HAS_QUIET_NAN__=1 __LDBL_MANT_DIG__=64 __LDBL_MAX_10_EXP__=4932 __LDBL_MAX__=1.18973149535723176502126385303097021e+4932L __LDBL_MAX_EXP__=16384 __LDBL_MIN_10_EXP__=(-4931) __LDBL_MIN__=3.36210314311209350626267781732175260e-4932L __LDBL_MIN_EXP__=(-16381) __LDBL_NORM_MAX__=1.18973149535723176502126385303097021e+4932L __linux=1 __linux__=1 linux=1 __LONG_LONG_MAX__=0x7fffffffffffffffLL __LONG_LONG_WIDTH__=64 __LONG_MAX__=0x7fffffffffffffffL __LONG_WIDTH__=64 __LP64__=1 _LP64=1 __MMX__=1 __MMX_WITH_SSE__=1 __ORDER_BIG_ENDIAN__=4321 __ORDER_LITTLE_ENDIAN__=1234 __ORDER_PDP_ENDIAN__=3412 _POSIX_C_SOURCE=200809L _POSIX_SOURCE=1 __PRAGMA_REDEFINE_EXTNAME=1 __PTRDIFF_MAX__=0x7fffffffffffffffL __PTRDIFF_TYPE__=long\ int __PTRDIFF_WIDTH__=64 _REENTRANT=1 __REGISTER_PREFIX__= __SCHAR_MAX__=0x7f __SCHAR_WIDTH__=8 __SEG_FS=1 __SEG_GS=1 __SHRT_MAX__=0x7fff __SHRT_WIDTH__=16 __SIG_ATOMIC_MAX__=0x7fffffff __SIG_ATOMIC_MIN__=(-0x7fffffff\ -\ 1) __SIG_ATOMIC_TYPE__=int __SIG_ATOMIC_WIDTH__=32 __SIZE_MAX__=0xffffffffffffffffUL __SIZEOF_DOUBLE__=8 __SIZEOF_FLOAT128__=16 __SIZEOF_FLOAT__=4 __SIZEOF_FLOAT80__=16 __SIZEOF_INT128__=16 __SIZEOF_INT__=4 __SIZEOF_LONG__=8 __SIZEOF_LONG_DOUBLE__=16 __SIZEOF_LONG_LONG__=8 __SIZEOF_POINTER__=8 __SIZEOF_PTRDIFF_T__=8 __SIZEOF_SHORT__=2 __SIZEOF_SIZE_T__=8 __SIZEOF_WCHAR_T__=4 __SIZEOF_WINT_T__=4 __SIZE_TYPE__=long\ unsigned\ int __SIZE_WIDTH__=64 __SSE__=1 __SSE2__=1 __SSE2_MATH__=1 __SSE_MATH__=1 __STDC__=1 __STDC_HOSTED__=1 __STDC_IEC_559__=1 __STDC_IEC_559_COMPLEX__=1 __STDC_ISO_10646__=201706L _STDC_PREDEF_H=1 __STDC_UTF_16__=1 __STDC_UTF_32__=1 __STDC_VERSION__=201710L __UINT16_C=__UINT16_C __UINT16_MAX__=0xffff __UINT16_TYPE__=short\ unsigned\ int __UINT32_C=__UINT32_C __UINT32_MAX__=0xffffffffU __UINT32_TYPE__=unsigned\ int __UINT64_C=__UINT64_C __UINT64_MAX__=0xffffffffffffffffUL __UINT64_TYPE__=long\ unsigned\ int __UINT8_C=__UINT8_C __UINT8_MAX__=0xff __UINT8_TYPE__=unsigned\ char __UINT_FAST16_MAX__=0xffffffffffffffffUL __UINT_FAST16_TYPE__=long\ unsigned\ int __UINT_FAST32_MAX__=0xffffffffffffffffUL __UINT_FAST32_TYPE__=long\ unsigned\ int __UINT_FAST64_MAX__=0xffffffffffffffffUL __UINT_FAST64_TYPE__=long\ unsigned\ int __UINT_FAST8_MAX__=0xff __UINT_FAST8_TYPE__=unsigned\ char __UINT_LEAST16_MAX__=0xffff __UINT_LEAST16_TYPE__=short\ unsigned\ int __UINT_LEAST32_MAX__=0xffffffffU __UINT_LEAST32_TYPE__=unsigned\ int __UINT_LEAST64_MAX__=0xffffffffffffffffUL __UINT_LEAST64_TYPE__=long\ unsigned\ int __UINT_LEAST8_MAX__=0xff __UINT_LEAST8_TYPE__=unsigned\ char __UINTMAX_C=__UINTMAX_C __UINTMAX_MAX__=0xffffffffffffffffUL __UINTMAX_TYPE__=long\ unsigned\ int __UINTPTR_MAX__=0xffffffffffffffffUL __UINTPTR_TYPE__=long\ unsigned\ int __unix=1 __unix__=1 unix=1 __USE_FILE_OFFSET64=1 __USE_GNU=1 __USE_LARGEFILE=1 __USE_LARGEFILE64=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USER_LABEL_PREFIX__= __USE_UNIX98=1 __USE_XOPEN=1 __USE_XOPEN_EXTENDED=1 __VERSION__="10.2.1\ 20200805\ [revision\ dda1e9d08434def88ed86557d08b23251332c5aa]" __WCHAR_MAX__=0x7fffffff __WCHAR_MIN__=(-0x7fffffff\ -\ 1) __WCHAR_TYPE__=int __WCHAR_WIDTH__=32 __WINT_MAX__=0xffffffffU __WINT_MIN__=0U __WINT_TYPE__=unsigned\ int __WINT_WIDTH__=32 __x86_64=1 __x86_64__=1 _XOPEN_SOURCE=700 _XOPEN_SOURCE_EXTENDED=1' +cppsymbols='__amd64=1 __amd64__=1 __ATOMIC_ACQ_REL=4 __ATOMIC_ACQUIRE=2 __ATOMIC_CONSUME=1 __ATOMIC_HLE_ACQUIRE=65536 __ATOMIC_HLE_RELEASE=131072 __ATOMIC_RELAXED=0 __ATOMIC_RELEASE=3 __ATOMIC_SEQ_CST=5 __BFLT16_DECIMAL_DIG__=4 __BFLT16_DENORM_MIN__=9.18354961579912115600575419704879436e-41BF16 __BFLT16_DIG__=2 __BFLT16_EPSILON__=7.81250000000000000000000000000000000e-3BF16 __BFLT16_HAS_DENORM__=1 __BFLT16_HAS_INFINITY__=1 __BFLT16_HAS_QUIET_NAN__=1 __BFLT16_IS_IEC_60559__=0 __BFLT16_MANT_DIG__=8 __BFLT16_MAX_10_EXP__=38 __BFLT16_MAX__=3.38953138925153547590470800371487867e+38BF16 __BFLT16_MAX_EXP__=128 __BFLT16_MIN_10_EXP__=(-37) __BFLT16_MIN__=1.17549435082228750796873653722224568e-38BF16 __BFLT16_MIN_EXP__=(-125) __BFLT16_NORM_MAX__=3.38953138925153547590470800371487867e+38BF16 __BIGGEST_ALIGNMENT__=16 __BYTE_ORDER__=1234 __CHAR16_TYPE__=short\ unsigned\ int __CHAR32_TYPE__=unsigned\ int __CHAR_BIT__=8 __code_model_small__=1 __DBL_DECIMAL_DIG__=17 __DBL_DENORM_MIN__=((double)4.94065645841246544176568792868221372e-324L) __DBL_DIG__=15 __DBL_EPSILON__=((double)2.22044604925031308084726333618164062e-16L) __DBL_HAS_DENORM__=1 __DBL_HAS_INFINITY__=1 __DBL_HAS_QUIET_NAN__=1 __DBL_IS_IEC_60559__=1 __DBL_MANT_DIG__=53 __DBL_MAX_10_EXP__=308 __DBL_MAX__=((double)1.79769313486231570814527423731704357e+308L) __DBL_MAX_EXP__=1024 __DBL_MIN_10_EXP__=(-307) __DBL_MIN__=((double)2.22507385850720138309023271733240406e-308L) __DBL_MIN_EXP__=(-1021) __DBL_NORM_MAX__=((double)1.79769313486231570814527423731704357e+308L) __DEC128_EPSILON__=1E-33DL __DEC128_MANT_DIG__=34 __DEC128_MAX__=9.999999999999999999999999999999999E6144DL __DEC128_MAX_EXP__=6145 __DEC128_MIN__=1E-6143DL __DEC128_MIN_EXP__=(-6142) __DEC128_SUBNORMAL_MIN__=0.000000000000000000000000000000001E-6143DL __DEC32_EPSILON__=1E-6DF __DEC32_MANT_DIG__=7 __DEC32_MAX__=9.999999E96DF __DEC32_MAX_EXP__=97 __DEC32_MIN__=1E-95DF __DEC32_MIN_EXP__=(-94) __DEC32_SUBNORMAL_MIN__=0.000001E-95DF __DEC64_EPSILON__=1E-15DD __DEC64_MANT_DIG__=16 __DEC64_MAX__=9.999999999999999E384DD __DEC64_MAX_EXP__=385 __DEC64_MIN__=1E-383DD __DEC64_MIN_EXP__=(-382) __DEC64_SUBNORMAL_MIN__=0.000000000000001E-383DD __DEC_EVAL_METHOD__=2 __DECIMAL_BID_FORMAT__=1 __DECIMAL_DIG__=21 __ELF__=1 _FILE_OFFSET_BITS=64 __FINITE_MATH_ONLY__=0 __FLOAT_WORD_ORDER__=1234 __FLT128_DECIMAL_DIG__=36 __FLT128_DENORM_MIN__=6.47517511943802511092443895822764655e-4966F128 __FLT128_DIG__=33 __FLT128_EPSILON__=1.92592994438723585305597794258492732e-34F128 __FLT128_HAS_DENORM__=1 __FLT128_HAS_INFINITY__=1 __FLT128_HAS_QUIET_NAN__=1 __FLT128_IS_IEC_60559__=1 __FLT128_MANT_DIG__=113 __FLT128_MAX_10_EXP__=4932 __FLT128_MAX__=1.18973149535723176508575932662800702e+4932F128 __FLT128_MAX_EXP__=16384 __FLT128_MIN_10_EXP__=(-4931) __FLT128_MIN__=3.36210314311209350626267781732175260e-4932F128 __FLT128_MIN_EXP__=(-16381) __FLT128_NORM_MAX__=1.18973149535723176508575932662800702e+4932F128 __FLT16_DECIMAL_DIG__=5 __FLT16_DENORM_MIN__=5.96046447753906250000000000000000000e-8F16 __FLT16_DIG__=3 __FLT16_EPSILON__=9.76562500000000000000000000000000000e-4F16 __FLT16_HAS_DENORM__=1 __FLT16_HAS_INFINITY__=1 __FLT16_HAS_QUIET_NAN__=1 __FLT16_IS_IEC_60559__=1 __FLT16_MANT_DIG__=11 __FLT16_MAX_10_EXP__=4 __FLT16_MAX__=6.55040000000000000000000000000000000e+4F16 __FLT16_MAX_EXP__=16 __FLT16_MIN_10_EXP__=(-4) __FLT16_MIN__=6.10351562500000000000000000000000000e-5F16 __FLT16_MIN_EXP__=(-13) __FLT16_NORM_MAX__=6.55040000000000000000000000000000000e+4F16 __FLT32_DECIMAL_DIG__=9 __FLT32_DENORM_MIN__=1.40129846432481707092372958328991613e-45F32 __FLT32_DIG__=6 __FLT32_EPSILON__=1.19209289550781250000000000000000000e-7F32 __FLT32_HAS_DENORM__=1 __FLT32_HAS_INFINITY__=1 __FLT32_HAS_QUIET_NAN__=1 __FLT32_IS_IEC_60559__=1 __FLT32_MANT_DIG__=24 __FLT32_MAX_10_EXP__=38 __FLT32_MAX__=3.40282346638528859811704183484516925e+38F32 __FLT32_MAX_EXP__=128 __FLT32_MIN_10_EXP__=(-37) __FLT32_MIN__=1.17549435082228750796873653722224568e-38F32 __FLT32_MIN_EXP__=(-125) __FLT32_NORM_MAX__=3.40282346638528859811704183484516925e+38F32 __FLT32X_DECIMAL_DIG__=17 __FLT32X_DENORM_MIN__=4.94065645841246544176568792868221372e-324F32x __FLT32X_DIG__=15 __FLT32X_EPSILON__=2.22044604925031308084726333618164062e-16F32x __FLT32X_HAS_DENORM__=1 __FLT32X_HAS_INFINITY__=1 __FLT32X_HAS_QUIET_NAN__=1 __FLT32X_IS_IEC_60559__=1 __FLT32X_MANT_DIG__=53 __FLT32X_MAX_10_EXP__=308 __FLT32X_MAX__=1.79769313486231570814527423731704357e+308F32x __FLT32X_MAX_EXP__=1024 __FLT32X_MIN_10_EXP__=(-307) __FLT32X_MIN__=2.22507385850720138309023271733240406e-308F32x __FLT32X_MIN_EXP__=(-1021) __FLT32X_NORM_MAX__=1.79769313486231570814527423731704357e+308F32x __FLT64_DECIMAL_DIG__=17 __FLT64_DENORM_MIN__=4.94065645841246544176568792868221372e-324F64 __FLT64_DIG__=15 __FLT64_EPSILON__=2.22044604925031308084726333618164062e-16F64 __FLT64_HAS_DENORM__=1 __FLT64_HAS_INFINITY__=1 __FLT64_HAS_QUIET_NAN__=1 __FLT64_IS_IEC_60559__=1 __FLT64_MANT_DIG__=53 __FLT64_MAX_10_EXP__=308 __FLT64_MAX__=1.79769313486231570814527423731704357e+308F64 __FLT64_MAX_EXP__=1024 __FLT64_MIN_10_EXP__=(-307) __FLT64_MIN__=2.22507385850720138309023271733240406e-308F64 __FLT64_MIN_EXP__=(-1021) __FLT64_NORM_MAX__=1.79769313486231570814527423731704357e+308F64 __FLT64X_DECIMAL_DIG__=21 __FLT64X_DENORM_MIN__=3.64519953188247460252840593361941982e-4951F64x __FLT64X_DIG__=18 __FLT64X_EPSILON__=1.08420217248550443400745280086994171e-19F64x __FLT64X_HAS_DENORM__=1 __FLT64X_HAS_INFINITY__=1 __FLT64X_HAS_QUIET_NAN__=1 __FLT64X_IS_IEC_60559__=1 __FLT64X_MANT_DIG__=64 __FLT64X_MAX_10_EXP__=4932 __FLT64X_MAX__=1.18973149535723176502126385303097021e+4932F64x __FLT64X_MAX_EXP__=16384 __FLT64X_MIN_10_EXP__=(-4931) __FLT64X_MIN__=3.36210314311209350626267781732175260e-4932F64x __FLT64X_MIN_EXP__=(-16381) __FLT64X_NORM_MAX__=1.18973149535723176502126385303097021e+4932F64x __FLT_DECIMAL_DIG__=9 __FLT_DENORM_MIN__=1.40129846432481707092372958328991613e-45F __FLT_DIG__=6 __FLT_EPSILON__=1.19209289550781250000000000000000000e-7F __FLT_EVAL_METHOD__=0 __FLT_EVAL_METHOD_TS_18661_3__=0 __FLT_HAS_DENORM__=1 __FLT_HAS_INFINITY__=1 __FLT_HAS_QUIET_NAN__=1 __FLT_IS_IEC_60559__=1 __FLT_MANT_DIG__=24 __FLT_MAX_10_EXP__=38 __FLT_MAX__=3.40282346638528859811704183484516925e+38F __FLT_MAX_EXP__=128 __FLT_MIN_10_EXP__=(-37) __FLT_MIN__=1.17549435082228750796873653722224568e-38F __FLT_MIN_EXP__=(-125) __FLT_NORM_MAX__=3.40282346638528859811704183484516925e+38F __FLT_RADIX__=2 __FXSR__=1 __GCC_ASM_FLAG_OUTPUTS__=1 __GCC_ATOMIC_BOOL_LOCK_FREE=2 __GCC_ATOMIC_CHAR16_T_LOCK_FREE=2 __GCC_ATOMIC_CHAR32_T_LOCK_FREE=2 __GCC_ATOMIC_CHAR_LOCK_FREE=2 __GCC_ATOMIC_INT_LOCK_FREE=2 __GCC_ATOMIC_LLONG_LOCK_FREE=2 __GCC_ATOMIC_LONG_LOCK_FREE=2 __GCC_ATOMIC_POINTER_LOCK_FREE=2 __GCC_ATOMIC_SHORT_LOCK_FREE=2 __GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1 __GCC_ATOMIC_WCHAR_T_LOCK_FREE=2 __GCC_CONSTRUCTIVE_SIZE=64 __GCC_DESTRUCTIVE_SIZE=64 __GCC_HAVE_DWARF2_CFI_ASM=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4=1 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8=1 __GCC_IEC_559=2 __GCC_IEC_559_COMPLEX=2 __GLIBC__=2 __GLIBC_MINOR__=37 __GNUC__=13 __GNUC_EXECUTION_CHARSET_NAME="UTF-8" __GNUC_MINOR__=0 __GNUC_PATCHLEVEL__=1 __GNUC_STDC_INLINE__=1 __GNUC_WIDE_EXECUTION_CHARSET_NAME="UTF-32LE" __GNU_LIBRARY__=6 __gnu_linux__=1 _GNU_SOURCE=1 __GXX_ABI_VERSION=1018 __HAVE_SPECULATION_SAFE_VALUE=1 __INT16_C=__INT16_C __INT16_MAX__=0x7fff __INT16_TYPE__=short\ int __INT32_C=__INT32_C __INT32_MAX__=0x7fffffff __INT32_TYPE__=int __INT64_C=__INT64_C __INT64_MAX__=0x7fffffffffffffffL __INT64_TYPE__=long\ int __INT8_C=__INT8_C __INT8_MAX__=0x7f __INT8_TYPE__=signed\ char __INT_FAST16_MAX__=0x7fffffffffffffffL __INT_FAST16_TYPE__=long\ int __INT_FAST16_WIDTH__=64 __INT_FAST32_MAX__=0x7fffffffffffffffL __INT_FAST32_TYPE__=long\ int __INT_FAST32_WIDTH__=64 __INT_FAST64_MAX__=0x7fffffffffffffffL __INT_FAST64_TYPE__=long\ int __INT_FAST64_WIDTH__=64 __INT_FAST8_MAX__=0x7f __INT_FAST8_TYPE__=signed\ char __INT_FAST8_WIDTH__=8 __INT_LEAST16_MAX__=0x7fff __INT_LEAST16_TYPE__=short\ int __INT_LEAST16_WIDTH__=16 __INT_LEAST32_MAX__=0x7fffffff __INT_LEAST32_TYPE__=int __INT_LEAST32_WIDTH__=32 __INT_LEAST64_MAX__=0x7fffffffffffffffL __INT_LEAST64_TYPE__=long\ int __INT_LEAST64_WIDTH__=64 __INT_LEAST8_MAX__=0x7f __INT_LEAST8_TYPE__=signed\ char __INT_LEAST8_WIDTH__=8 __INT_MAX__=0x7fffffff __INTMAX_C=__INTMAX_C __INTMAX_MAX__=0x7fffffffffffffffL __INTMAX_TYPE__=long\ int __INTMAX_WIDTH__=64 __INTPTR_MAX__=0x7fffffffffffffffL __INTPTR_TYPE__=long\ int __INTPTR_WIDTH__=64 __INT_WIDTH__=32 __k8=1 __k8__=1 _LARGEFILE64_SOURCE=1 _LARGEFILE_SOURCE=1 __LDBL_DECIMAL_DIG__=21 __LDBL_DENORM_MIN__=3.64519953188247460252840593361941982e-4951L __LDBL_DIG__=18 __LDBL_EPSILON__=1.08420217248550443400745280086994171e-19L __LDBL_HAS_DENORM__=1 __LDBL_HAS_INFINITY__=1 __LDBL_HAS_QUIET_NAN__=1 __LDBL_IS_IEC_60559__=1 __LDBL_MANT_DIG__=64 __LDBL_MAX_10_EXP__=4932 __LDBL_MAX__=1.18973149535723176502126385303097021e+4932L __LDBL_MAX_EXP__=16384 __LDBL_MIN_10_EXP__=(-4931) __LDBL_MIN__=3.36210314311209350626267781732175260e-4932L __LDBL_MIN_EXP__=(-16381) __LDBL_NORM_MAX__=1.18973149535723176502126385303097021e+4932L __linux=1 __linux__=1 linux=1 __LONG_LONG_MAX__=0x7fffffffffffffffLL __LONG_LONG_WIDTH__=64 __LONG_MAX__=0x7fffffffffffffffL __LONG_WIDTH__=64 __LP64__=1 _LP64=1 __MMX__=1 __MMX_WITH_SSE__=1 __ORDER_BIG_ENDIAN__=4321 __ORDER_LITTLE_ENDIAN__=1234 __ORDER_PDP_ENDIAN__=3412 __pic__=2 __PIC__=2 _POSIX_C_SOURCE=200809L _POSIX_SOURCE=1 __PRAGMA_REDEFINE_EXTNAME=1 __PTRDIFF_MAX__=0x7fffffffffffffffL __PTRDIFF_TYPE__=long\ int __PTRDIFF_WIDTH__=64 _REENTRANT=1 __REGISTER_PREFIX__= __SCHAR_MAX__=0x7f __SCHAR_WIDTH__=8 __SEG_FS=1 __SEG_GS=1 __SHRT_MAX__=0x7fff __SHRT_WIDTH__=16 __SIG_ATOMIC_MAX__=0x7fffffff __SIG_ATOMIC_MIN__=(-0x7fffffff\ -\ 1) __SIG_ATOMIC_TYPE__=int __SIG_ATOMIC_WIDTH__=32 __SIZE_MAX__=0xffffffffffffffffUL __SIZEOF_DOUBLE__=8 __SIZEOF_FLOAT128__=16 __SIZEOF_FLOAT__=4 __SIZEOF_FLOAT80__=16 __SIZEOF_INT128__=16 __SIZEOF_INT__=4 __SIZEOF_LONG__=8 __SIZEOF_LONG_DOUBLE__=16 __SIZEOF_LONG_LONG__=8 __SIZEOF_POINTER__=8 __SIZEOF_PTRDIFF_T__=8 __SIZEOF_SHORT__=2 __SIZEOF_SIZE_T__=8 __SIZEOF_WCHAR_T__=4 __SIZEOF_WINT_T__=4 __SIZE_TYPE__=long\ unsigned\ int __SIZE_WIDTH__=64 __SSE__=1 __SSE2__=1 __SSE2_MATH__=1 __SSE_MATH__=1 __STDC__=1 __STDC_HOSTED__=1 __STDC_IEC_559__=1 __STDC_IEC_559_COMPLEX__=1 __STDC_IEC_60559_BFP__=201404L __STDC_IEC_60559_COMPLEX__=201404L __STDC_ISO_10646__=201706L _STDC_PREDEF_H=1 __STDC_UTF_16__=1 __STDC_UTF_32__=1 __STDC_VERSION__=201710L __UINT16_C=__UINT16_C __UINT16_MAX__=0xffff __UINT16_TYPE__=short\ unsigned\ int __UINT32_C=__UINT32_C __UINT32_MAX__=0xffffffffU __UINT32_TYPE__=unsigned\ int __UINT64_C=__UINT64_C __UINT64_MAX__=0xffffffffffffffffUL __UINT64_TYPE__=long\ unsigned\ int __UINT8_C=__UINT8_C __UINT8_MAX__=0xff __UINT8_TYPE__=unsigned\ char __UINT_FAST16_MAX__=0xffffffffffffffffUL __UINT_FAST16_TYPE__=long\ unsigned\ int __UINT_FAST32_MAX__=0xffffffffffffffffUL __UINT_FAST32_TYPE__=long\ unsigned\ int __UINT_FAST64_MAX__=0xffffffffffffffffUL __UINT_FAST64_TYPE__=long\ unsigned\ int __UINT_FAST8_MAX__=0xff __UINT_FAST8_TYPE__=unsigned\ char __UINT_LEAST16_MAX__=0xffff __UINT_LEAST16_TYPE__=short\ unsigned\ int __UINT_LEAST32_MAX__=0xffffffffU __UINT_LEAST32_TYPE__=unsigned\ int __UINT_LEAST64_MAX__=0xffffffffffffffffUL __UINT_LEAST64_TYPE__=long\ unsigned\ int __UINT_LEAST8_MAX__=0xff __UINT_LEAST8_TYPE__=unsigned\ char __UINTMAX_C=__UINTMAX_C __UINTMAX_MAX__=0xffffffffffffffffUL __UINTMAX_TYPE__=long\ unsigned\ int __UINTPTR_MAX__=0xffffffffffffffffUL __UINTPTR_TYPE__=long\ unsigned\ int __unix=1 __unix__=1 unix=1 __USE_FILE_OFFSET64=1 __USE_GNU=1 __USE_LARGEFILE=1 __USE_LARGEFILE64=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USER_LABEL_PREFIX__= __USE_UNIX98=1 __USE_XOPEN=1 __USE_XOPEN_EXTENDED=1 __VERSION__="13.0.1\ 20230421\ (prerelease)\ [revision\ f980561c60b0446cc427595198d7f3f4f90e0924]" __WCHAR_MAX__=0x7fffffff __WCHAR_MIN__=(-0x7fffffff\ -\ 1) __WCHAR_TYPE__=int __WCHAR_WIDTH__=32 __WINT_MAX__=0xffffffffU __WINT_MIN__=0U __WINT_TYPE__=unsigned\ int __WINT_WIDTH__=32 __x86_64=1 __x86_64__=1 _XOPEN_SOURCE=700 _XOPEN_SOURCE_EXTENDED=1' crypt_r_proto='REENTRANT_PROTO_B_CCS' cryptlib='' -csh='csh' +csh='tcsh' ctermid_r_proto='0' ctime_r_proto='REENTRANT_PROTO_B_SB' -d_Gconvert='qgcvt((x),(n),(b))' +d_Gconvert='sprintf((b),"%.*g",(n),(x))' d_PRIEUldbl='define' d_PRIFUldbl='define' d_PRIGUldbl='define' @@ -141,6 +136,7 @@ d_attribute_nonnull='define' d_attribute_noreturn='define' d_attribute_pure='define' d_attribute_unused='define' +d_attribute_visibility='define' d_attribute_warn_unused_result='define' d_backtrace='define' d_bsd='undef' @@ -229,8 +225,8 @@ d_fdclose='undef' d_fdim='define' d_fds_bits='define' d_fegetround='define' -d_ffs='undef' -d_ffsl='undef' +d_ffs='define' +d_ffsl='define' d_fgetpos='define' d_finite='define' d_finitel='define' @@ -438,10 +434,10 @@ d_nextafter='define' d_nexttoward='define' d_nice='define' d_nl_langinfo='define' -d_nl_langinfo_l='undef' +d_nl_langinfo_l='define' d_non_int_bitfields='define' d_nv_preserves_uv='define' -d_nv_zero_is_allbits_zero='undef' +d_nv_zero_is_allbits_zero='define' d_off64_t='define' d_old_pthread_create_joinable='undef' d_oldpthreads='undef' @@ -509,6 +505,7 @@ d_semget='define' d_semop='define' d_sendmsg='define' d_setegid='define' +d_setenv='define' d_seteuid='define' d_setgrent='define' d_setgrent_r='undef' @@ -607,21 +604,21 @@ d_strtoul='define' d_strtoull='define' d_strtouq='define' d_strxfrm='define' -d_strxfrm_l='undef' +d_strxfrm_l='define' d_suidsafe='undef' d_symlink='define' d_syscall='define' d_syscallproto='define' d_sysconf='define' d_sysernlst='' -d_syserrlst='define' +d_syserrlst='undef' d_system='define' d_tcgetpgrp='define' d_tcsetpgrp='define' d_telldir='define' d_telldirproto='define' d_tgamma='define' -d_thread_local='undef' +d_thread_local='define' d_thread_safe_nl_langinfo_l='define' d_time='define' d_timegm='define' @@ -714,11 +711,11 @@ fpostype='fpos_t' freetype='void' from=':' full_ar='/usr/bin/ar' -full_csh='/usr/bin/csh' +full_csh='/usr/bin/tcsh' full_sed='/usr/bin/sed' gccansipedantic='' gccosandvers='' -gccversion='10.2.1 20200805 [revision dda1e9d08434def88ed86557d08b23251332c5aa]' +gccversion='13.0.1 20230421 (prerelease) [revision f980561c60b0446cc427595198d7f3f4f90e0924]' getgrent_r_proto='REENTRANT_PROTO_I_SBWR' getgrgid_r_proto='REENTRANT_PROTO_I_TSBWR' getgrnam_r_proto='REENTRANT_PROTO_I_CSBWR' @@ -746,7 +743,7 @@ gidtype='gid_t' glibpth='/usr/shlib /lib /usr/lib /usr/lib/386 /lib/386 /usr/ccs/lib /usr/ucblib /usr/local/lib /lib64 /usr/lib64 /usr/local/lib64 ' gmake='gmake' gmtime_r_proto='REENTRANT_PROTO_S_TS' -gnulibc_version='2.31' +gnulibc_version='2.37' grep='grep' groupcat='cat /etc/group' groupstype='gid_t' @@ -764,6 +761,7 @@ html3dir=' ' html3direxp='' i16size='2' i16type='short' +i32dformat='"d"' i32size='4' i32type='int' i64size='8' @@ -834,6 +832,7 @@ i_syssockio='undef' i_sysstat='define' i_sysstatfs='define' i_sysstatvfs='define' +i_syssyscall='define' i_systime='define' i_systimek='undef' i_systimes='define' @@ -857,28 +856,28 @@ ignore_versioned_solibs='y' inc_version_list='' inc_version_list_init='0' incpath='' -incpth='/usr/lib64/gcc/x86_64-suse-linux/10/include /usr/local/include /usr/lib64/gcc/x86_64-suse-linux/10/include-fixed /usr/lib64/gcc/x86_64-suse-linux/10/../../../../x86_64-suse-linux/include /usr/include' +incpth='/usr/lib64/gcc/x86_64-suse-linux/13/include /usr/local/include /usr/lib64/gcc/x86_64-suse-linux/13/include-fixed /usr/x86_64-suse-linux/include /usr/include' inews='' -initialinstalllocation='/opt/perl/bin' -installarchlib='/opt/perl/lib/5.36.3/x86_64-linux-thread-multi-ld' -installbin='/opt/perl/bin' +initialinstalllocation='/pro/bin' +installarchlib='/pro/lib/perl5/5.38.2/x86_64-linux-thread-multi-quadmath' +installbin='/pro/bin' installhtml1dir='' installhtml3dir='' -installman1dir='/opt/perl/man/man1' -installman3dir='/opt/perl/man/man3' -installprefix='/opt/perl' -installprefixexp='/opt/perl' -installprivlib='/opt/perl/lib/5.36.3' -installscript='/opt/perl/bin' -installsitearch='/opt/perl/lib/site_perl/5.36.3/x86_64-linux-thread-multi-ld' -installsitebin='/opt/perl/bin' +installman1dir='/pro/local/man/man1' +installman3dir='/pro/local/man/man3' +installprefix='/pro' +installprefixexp='/pro' +installprivlib='/pro/lib/perl5/5.38.2' +installscript='/pro/bin' +installsitearch='/pro/lib/perl5/site_perl/5.38.2/x86_64-linux-thread-multi-quadmath' +installsitebin='/pro/bin' installsitehtml1dir='' installsitehtml3dir='' -installsitelib='/opt/perl/lib/site_perl/5.36.3' -installsiteman1dir='/opt/perl/man/man1' -installsiteman3dir='/opt/perl/man/man3' -installsitescript='/opt/perl/bin' -installstyle='lib' +installsitelib='/pro/lib/perl5/site_perl/5.38.2' +installsiteman1dir='/pro/local/man/man1' +installsiteman3dir='/pro/local/man/man3' +installsitescript='/pro/bin' +installstyle='lib/perl5' installusrbinperl='undef' installvendorarch='' installvendorbin='' @@ -897,21 +896,21 @@ known_extensions='Amiga/ARexx Amiga/Exec ksh='' ld='cc' ld_can_script='define' -lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector-strong' -ldflags=' -fstack-protector-strong -L/usr/local/lib' +lddlflags='-shared -O2 -L/pro/local/lib -fstack-protector-strong' +ldflags='-L/pro/local/lib -fstack-protector-strong' ldflags_uselargefiles='' ldlibpthname='LD_LIBRARY_PATH' less='less' lib_ext='.a' -libc='libc-2.31.so' +libc='/lib/../lib64/libc.so.6' libperl='libperl.a' -libpth='/usr/local/lib /usr/lib64/gcc/x86_64-suse-linux/10/include-fixed /usr/lib64/gcc/x86_64-suse-linux/10/../../../../x86_64-suse-linux/lib /usr/lib /lib/../lib64 /usr/lib/../lib64 /lib /lib64 /usr/lib64 /usr/local/lib64' -libs='-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat' -libsdirs=' /usr/lib/../lib64' -libsfiles=' libpthread.so libnsl.so libgdbm.so libdb.so libdl.so libm.so libcrypt.so libutil.so libc.so libgdbm_compat.so' -libsfound=' /usr/lib/../lib64/libpthread.so /usr/lib/../lib64/libnsl.so /usr/lib/../lib64/libgdbm.so /usr/lib/../lib64/libdb.so /usr/lib/../lib64/libdl.so /usr/lib/../lib64/libm.so /usr/lib/../lib64/libcrypt.so /usr/lib/../lib64/libutil.so /usr/lib/../lib64/libc.so /usr/lib/../lib64/libgdbm_compat.so' -libspath=' /usr/local/lib /usr/lib64/gcc/x86_64-suse-linux/10/include-fixed /usr/lib64/gcc/x86_64-suse-linux/10/../../../../x86_64-suse-linux/lib /usr/lib /lib/../lib64 /usr/lib/../lib64 /lib /lib64 /usr/lib64 /usr/local/lib64' -libswanted='cl pthread cl pthread socket inet nsl gdbm dbm db malloc dl ld sun m crypt sec util c cposix posix ucb BSD gdbm_compat' +libpth='/usr/local/lib /usr/x86_64-suse-linux/lib /usr/lib /data/pro/local/lib /usr/lib64 /usr/local/lib64' +libs='-lpthread -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat -lquadmath' +libsdirs=' /usr/lib64' +libsfiles=' libpthread.a libgdbm.so libdb.so libdl.a libm.so libcrypt.so libutil.a libc.so libgdbm_compat.so' +libsfound=' /usr/lib64/libpthread.a /usr/lib64/libgdbm.so /usr/lib64/libdb.so /usr/lib64/libdl.a /usr/lib64/libm.so /usr/lib64/libcrypt.so /usr/lib64/libutil.a /usr/lib64/libc.so /usr/lib64/libgdbm_compat.so' +libspath=' /usr/local/lib /usr/x86_64-suse-linux/lib /usr/lib /data/pro/local/lib /usr/lib64 /usr/local/lib64 /usr/lib64/gcc/x86_64-suse-linux/13 /usr/lib64/gcc/x86_64-suse-linux/13/../../../../lib64 /usr/lib64/gcc/x86_64-suse-linux/13/../../..' +libswanted='cl pthread socket inet gdbm dbm db malloc dl ld sun m crypt sec util c cposix posix ucb BSD gdbm_compat' libswanted_uselargefiles='' line='' lint='' @@ -919,8 +918,8 @@ lkflags='' ln='ln' lns='/usr/bin/ln -s' localtime_r_proto='REENTRANT_PROTO_S_TS' -locincpth='/usr/local/include /opt/local/include /usr/gnu/include /opt/gnu/include /usr/GNU/include /opt/GNU/include' -loclibpth='/usr/local/lib /opt/local/lib /usr/gnu/lib /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib' +locincpth='/pro/local/include' +loclibpth='/pro/local/lib' longdblinfbytes='0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00' longdblkind='3' longdblmantbits='64' @@ -940,11 +939,11 @@ make_set_make='#' mallocobj='' mallocsrc='' malloctype='void *' -man1dir='/opt/perl/man/man1' -man1direxp='/opt/perl/man/man1' +man1dir='/pro/local/man/man1' +man1direxp='/pro/local/man/man1' man1ext='1' -man3dir='/opt/perl/man/man3' -man3direxp='/opt/perl/man/man3' +man3dir='/pro/local/man/man3' +man3direxp='/pro/local/man/man3' man3ext='3' mips_type='' mistrustnm='' @@ -955,9 +954,9 @@ more='more' multiarch='undef' mv='' myarchname='x86_64-linux' -mydomain='.yourplace.com' -myhostname='yourhost' -myuname='linux lx09 5.8.0-1-default #1 smp tue aug 4 07:30:59 utc 2020 (9bc0044) x86_64 x86_64 x86_64 gnulinux ' +mydomain='.procura.nl' +myhostname='lx09' +myuname='linux lx09 6.2.12-1-default #1 smp preempt_dynamic thu apr 20 11:01:10 utc 2023 (eb3255d) x86_64 x86_64 x86_64 gnulinux ' n='-n' need_va_copy='define' netdb_hlen_type='size_t' @@ -969,48 +968,48 @@ nm_opt='' nm_so_opt='--dynamic' nonxs_ext='Archive/Tar Attribute/Handlers autodie AutoLoader autouse base bignum Carp Config/Perl/V constant CPAN CPAN/Meta CPAN/Meta/Requirements CPAN/Meta/YAML Devel/SelfStubber Digest Dumpvalue encoding/warnings Env Errno experimental Exporter ExtUtils/CBuilder ExtUtils/Constant ExtUtils/Install ExtUtils/MakeMaker ExtUtils/Manifest ExtUtils/Miniperl ExtUtils/ParseXS ExtUtils/PL2Bat FileCache File/Fetch File/Find File/Path File/Temp Filter/Simple FindBin Getopt/Long HTTP/Tiny I18N/Collate I18N/LangTags if IO/Compress IO/Socket/IP IO/Zlib IPC/Cmd IPC/Open3 JSON/PP lib libnet Locale/Maketext Locale/Maketext/Simple Math/BigInt Math/BigRat Math/Complex Memoize Module/CoreList Module/Load Module/Load/Conditional Module/Loaded Module/Metadata Net/Ping NEXT Params/Check parent perlfaq PerlIO/via/QuotedPrint Perl/OSType Pod/Checker Pod/Escapes Pod/Functions Pod/Html podlators Pod/Perldoc Pod/Simple Pod/Usage Safe Search/Dict SelfLoader Term/ANSIColor Term/Cap Term/Complete Term/ReadLine Test Test/Harness Test/Simple Text/Abbrev Text/Balanced Text/ParseWords Text/Tabs Thread/Queue Thread/Semaphore Tie/File Tie/Hash/NamedCapture Tie/Memoize Tie/RefHash Time/Local version XSLoader' nroff='nroff' -nvEUformat='"LE"' -nvFUformat='"LF"' -nvGUformat='"LG"' -nv_overflows_integers_at='256.0*256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0*2.0*2.0*2.0' +nvEUformat='"QE"' +nvFUformat='"QF"' +nvGUformat='"QG"' +nv_overflows_integers_at='256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*256.0*2.0' nv_preserves_uv_bits='64' -nveformat='"Le"' -nvfformat='"Lf"' -nvgformat='"Lg"' -nvmantbits='64' +nveformat='"Qe"' +nvfformat='"Qf"' +nvgformat='"Qg"' +nvmantbits='112' nvsize='16' -nvtype='long double' +nvtype='__float128' o_nonblock='O_NONBLOCK' obj_ext='.o' old_pthread_create_joinable='' optimize='-O2' orderlib='false' osname='linux' -osvers='5.8.0-1-default' +osvers='6.2.12-1-default' otherlibdirs=' ' package='perl5' -pager='/usr/bin/less -R' +pager='/pro/bin/less -R' passcat='cat /etc/passwd' -patchlevel='33' +patchlevel='37' path_sep=':' -perl5='/usr/bin/perl' +perl5='/pro/bin/perl' perl='perl' perl_patchlevel='' perl_static_inline='static __inline__' -perl_thread_local='' -perladmin='yourname@yourhost.yourplace.com' -perllibs='-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc' -perlpath='/opt/perl/bin/perl5.36.3' +perl_thread_local='_Thread_local' +perladmin='hmbrand@cpan.org' +perllibs='-lpthread -ldl -lm -lcrypt -lutil -lc -lquadmath' +perlpath='/pro/bin/perl5.38.2' pg='pg' -phostname='' +phostname='hostname' pidtype='pid_t' -plibpth='/lib/x86_64-suse-linux/10 /lib/../lib64 /usr/lib/x86_64-suse-linux/10 /usr/lib/../lib64 /lib /usr/lib' +plibpth='/lib/x86_64-suse-linux/13 /lib/../lib64 /usr/lib/x86_64-suse-linux/13 /usr/lib/../lib64 /lib /usr/lib' pmake='' pr='' -prefix='/opt/perl' -prefixexp='/opt/perl' -privlib='/opt/perl/lib/5.36.3' -privlibexp='/opt/perl/lib/5.36.3' +prefix='/pro' +prefixexp='/pro' +privlib='/pro/lib/perl5/5.38.2' +privlibexp='/pro/lib/perl5/5.38.2' procselfexe='"/proc/self/exe"' ptrsize='8' quadkind='2' @@ -1032,7 +1031,7 @@ runnm='false' sGMTIME_max='67768036191676799' sGMTIME_min='-62167219200' sLOCALTIME_max='67768036191673199' -sLOCALTIME_min='-62167220372' +sLOCALTIME_min='-62167220250' sPRIEUldbl='"LE"' sPRIFUldbl='"LF"' sPRIGUldbl='"LG"' @@ -1047,8 +1046,8 @@ sPRIu64='"lu"' sPRIx64='"lx"' sSCNfldbl='"Lf"' sched_yield='sched_yield()' -scriptdir='/opt/perl/bin' -scriptdirexp='/opt/perl/bin' +scriptdir='/pro/bin' +scriptdirexp='/pro/bin' sed='sed' seedfunc='Perl_drand48_init' selectminbits='64' @@ -1075,25 +1074,25 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 6, 17, 29, 0' sig_size='68' signal_t='void' -sitearch='/opt/perl/lib/site_perl/5.36.3/x86_64-linux-thread-multi-ld' -sitearchexp='/opt/perl/lib/site_perl/5.36.3/x86_64-linux-thread-multi-ld' -sitebin='/opt/perl/bin' -sitebinexp='/opt/perl/bin' +sitearch='/pro/lib/perl5/site_perl/5.38.2/x86_64-linux-thread-multi-quadmath' +sitearchexp='/pro/lib/perl5/site_perl/5.38.2/x86_64-linux-thread-multi-quadmath' +sitebin='/pro/bin' +sitebinexp='/pro/bin' sitehtml1dir='' sitehtml1direxp='' sitehtml3dir='' sitehtml3direxp='' -sitelib='/opt/perl/lib/site_perl/5.36.3' -sitelib_stem='/opt/perl/lib/site_perl' -sitelibexp='/opt/perl/lib/site_perl/5.36.3' -siteman1dir='/opt/perl/man/man1' -siteman1direxp='/opt/perl/man/man1' -siteman3dir='/opt/perl/man/man3' -siteman3direxp='/opt/perl/man/man3' -siteprefix='/opt/perl' -siteprefixexp='/opt/perl' -sitescript='/opt/perl/bin' -sitescriptexp='/opt/perl/bin' +sitelib='/pro/lib/perl5/site_perl/5.38.2' +sitelib_stem='/pro/lib/perl5/site_perl' +sitelibexp='/pro/lib/perl5/site_perl/5.38.2' +siteman1dir='/pro/local/man/man1' +siteman1direxp='/pro/local/man/man1' +siteman3dir='/pro/local/man/man3' +siteman3direxp='/pro/local/man/man3' +siteprefix='/pro' +siteprefixexp='/pro' +sitescript='/pro/bin' +sitescriptexp='/pro/bin' sizesize='8' sizetype='size_t' sleep='' @@ -1110,10 +1109,10 @@ srandom_r_proto='REENTRANT_PROTO_I_TS' src='.' ssizetype='ssize_t' st_dev_sign='1' -st_dev_size='4' +st_dev_size='8' st_ino_sign='1' st_ino_size='8' -startperl='#!/opt/perl/bin/perl5.36.3' +startperl='#!/pro/bin/perl5.38.2' startsh='#!/bin/sh' static_ext=' ' stdchar='char' @@ -1125,7 +1124,7 @@ stdio_ptr='((fp)->_ptr)' stdio_stream_array='' strerror_r_proto='REENTRANT_PROTO_B_IBW' submit='' -subversion='3' +subversion='2' sysman='/usr/share/man/man1' sysroot='' tail='' @@ -1151,8 +1150,12 @@ troff='' ttyname_r_proto='REENTRANT_PROTO_I_IBW' u16size='2' u16type='unsigned short' +u32XUformat='"X"' +u32oformat='"o"' u32size='4' u32type='unsigned int' +u32uformat='"u"' +u32xformat='"x"' u64size='8' u64type='unsigned long' u8size='1' @@ -1177,7 +1180,7 @@ useithreads='define' usekernprocpathname='undef' uselanginfo='true' uselargefiles='define' -uselongdouble='define' +uselongdouble='undef' usemallocwrap='define' usemorebits='undef' usemultiplicity='define' @@ -1187,7 +1190,7 @@ usensgetexecutablepath='undef' useopcode='true' useperlio='define' useposix='true' -usequadmath='undef' +usequadmath='define' usereentrant='undef' userelocatableinc='undef' useshrplib='false' @@ -1224,23 +1227,24 @@ vendorprefix='' vendorprefixexp='' vendorscript='' vendorscriptexp='' -version='5.36.3' -version_patchlevel_string='version 36 subversion 3' +version='5.38.2' +version_patchlevel_string='version 38 subversion 2' versiononly='define' vi='' -xlibpth='/usr/lib/386 /lib/386' +xlibpth='/usr/lib/386 /lib/386 /usr/lib64/gcc/x86_64-suse-linux/13 /usr/lib64/gcc/x86_64-suse-linux/13/../../../../lib64 /usr/lib64/gcc/x86_64-suse-linux/13/../../..' xlocale_needed='undef' -yacc='yacc' +yacc='/pro/3gl/CPAN/bin/byacc' yaccflags='' zcat='' zip='zip' PERL_REVISION=5 -PERL_VERSION=36 -PERL_SUBVERSION=3 +PERL_VERSION=38 +PERL_SUBVERSION=2 PERL_API_REVISION=5 -PERL_API_VERSION=36 +PERL_API_VERSION=38 PERL_API_SUBVERSION=0 PERL_PATCHLEVEL='' PERL_CONFIG_SH=true : Variables propagated from previous config.sh file. libdb_needs_pthread='N' +libdirs=' /lib /pro/local/lib' Index: gnu/usr.bin/perl/Porting/config_H =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/config_H,v diff -u -p -a -u -p -r1.29 config_H --- gnu/usr.bin/perl/Porting/config_H 23 Dec 2023 21:02:20 -0000 1.29 +++ gnu/usr.bin/perl/Porting/config_H 21 Feb 2024 15:47:00 -0000 @@ -54,7 +54,7 @@ * This symbol, if defined, indicates that the chsize routine is available * to truncate files. You might need a -lx to get this routine. */ -/*#define HAS_CHSIZE / **/ +/*#define HAS_CHSIZE / **/ /* HAS_CRYPT: * This symbol, if defined, indicates that the crypt routine is available @@ -232,7 +232,7 @@ * This symbol, if defined, indicates that the mbstowcs routine is * available to convert a multibyte string into a wide character string. */ -#define HAS_MBSTOWCS /**/ +#define HAS_MBSTOWCS /**/ /* HAS_MBTOWC: * This symbol, if defined, indicates that the mbtowc routine is available @@ -606,7 +606,7 @@ * This symbol, if defined, indicates to the C program that it should * include to get inet_addr and friends declarations. */ -#define I_ARPA_INET /**/ +#define I_ARPA_INET /**/ /* I_DBM: * This symbol, if defined, indicates that exists and should @@ -640,7 +640,7 @@ * This symbol, if defined, indicates to the C program that it should * include . */ -#define I_LOCALE /**/ +#define I_LOCALE /**/ /* I_NETINET_IN: * This symbol, if defined, indicates to the C program that it should @@ -668,7 +668,7 @@ * This symbol, if defined, indicates the should be included * to get socket ioctl options, like SIOCATMARK. */ -#define I_SYS_IOCTL /**/ +#define I_SYS_IOCTL /**/ /*#define I_SYS_SOCKIO / **/ /* I_SYS_NDIR: @@ -706,19 +706,19 @@ * This symbol, if defined, indicates to the C program that it should * include . */ -#define I_SYS_STAT /**/ +#define I_SYS_STAT /**/ /* I_SYS_TIMES: * This symbol, if defined, indicates to the C program that it should * include . */ -#define I_SYS_TIMES /**/ +#define I_SYS_TIMES /**/ /* I_SYS_TYPES: * This symbol, if defined, indicates to the C program that it should * include . */ -#define I_SYS_TYPES /**/ +#define I_SYS_TYPES /**/ /* I_SYS_UN: * This symbol, if defined, indicates to the C program that it should @@ -872,7 +872,7 @@ * This symbol is defined if the C compiler can cast negative * or large floating point numbers to 32-bit ints. */ -/*#define CASTI32 / **/ +/*#define CASTI32 / **/ /* CASTNEGFLOAT: * This symbol is defined if the C compiler can cast negative @@ -886,7 +886,7 @@ * 2 = couldn't cast >= 0x80000000 * 4 = couldn't cast in argument expression list */ -#define CASTNEGFLOAT /**/ +#define CASTNEGFLOAT /**/ #define CASTFLAGS 0 /**/ /* VOID_CLOSEDIR: @@ -988,13 +988,13 @@ * This symbol, if defined, indicates that siginfo_t has the * si_value member */ -#define HAS_SIGINFO_SI_ERRNO /**/ -#define HAS_SIGINFO_SI_PID /**/ -#define HAS_SIGINFO_SI_UID /**/ -#define HAS_SIGINFO_SI_ADDR /**/ -#define HAS_SIGINFO_SI_STATUS /**/ -#define HAS_SIGINFO_SI_BAND /**/ -#define HAS_SIGINFO_SI_VALUE /**/ +#define HAS_SIGINFO_SI_ERRNO /**/ +#define HAS_SIGINFO_SI_PID /**/ +#define HAS_SIGINFO_SI_UID /**/ +#define HAS_SIGINFO_SI_ADDR /**/ +#define HAS_SIGINFO_SI_STATUS /**/ +#define HAS_SIGINFO_SI_BAND /**/ +#define HAS_SIGINFO_SI_VALUE /**/ /* HAS_SIGSETJMP: * This variable indicates to the C program that the sigsetjmp() @@ -1224,7 +1224,7 @@ * This symbol, if defined, indicates that this system uses * EBCDIC encoding. */ -/*#define EBCDIC / **/ +/*#define EBCDIC / **/ /* ARCHLIB: * This variable, if defined, holds the name of the directory in @@ -1239,8 +1239,8 @@ * This symbol contains the ~name expanded version of ARCHLIB, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -#define ARCHLIB "/opt/perl/lib/5.36.3/x86_64-linux" /**/ -#define ARCHLIB_EXP "/opt/perl/lib/5.36.3/x86_64-linux" /**/ +#define ARCHLIB "/opt/perl/lib/5.38.2/x86_64-linux" /**/ +#define ARCHLIB_EXP "/opt/perl/lib/5.38.2/x86_64-linux" /**/ /* BIN: * This symbol holds the path of the bin directory where the package will @@ -1293,8 +1293,8 @@ * This symbol contains the ~name expanded version of PRIVLIB, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -#define PRIVLIB "/opt/perl/lib/5.36.3" /**/ -#define PRIVLIB_EXP "/opt/perl/lib/5.36.3" /**/ +#define PRIVLIB "/opt/perl/lib/5.38.2" /**/ +#define PRIVLIB_EXP "/opt/perl/lib/5.38.2" /**/ /* SITEARCH: * This symbol contains the name of the private library for this package. @@ -1311,8 +1311,8 @@ * This symbol contains the ~name expanded version of SITEARCH, to be used * in programs that are not prepared to deal with ~ expansion at run-time. */ -#define SITEARCH "/opt/perl/lib/site_perl/5.36.3/x86_64-linux" /**/ -#define SITEARCH_EXP "/opt/perl/lib/site_perl/5.36.3/x86_64-linux" /**/ +#define SITEARCH "/opt/perl/lib/site_perl/5.38.2/x86_64-linux" /**/ +#define SITEARCH_EXP "/opt/perl/lib/site_perl/5.38.2/x86_64-linux" /**/ /* SITELIB: * This symbol contains the name of the private library for this package. @@ -1334,8 +1334,8 @@ * removed. The elements in inc_version_list (inc_version_list.U) can * be tacked onto this variable to generate a list of directories to search. */ -#define SITELIB "/opt/perl/lib/site_perl/5.36.3" /**/ -#define SITELIB_EXP "/opt/perl/lib/site_perl/5.36.3" /**/ +#define SITELIB "/opt/perl/lib/site_perl/5.38.2" /**/ +#define SITELIB_EXP "/opt/perl/lib/site_perl/5.38.2" /**/ #define SITELIB_STEM "/opt/perl/lib/site_perl" /**/ /* PERL_VENDORARCH: @@ -1561,7 +1561,7 @@ * This symbol, if defined, indicates that the system supports filenames * longer than 14 characters. */ -#define FLEXFILENAMES /**/ +#define FLEXFILENAMES /**/ /* HAS_GETGRENT: * This symbol, if defined, indicates that the getgrent routine is @@ -1934,15 +1934,15 @@ * This symbol, if defined, indicates the availability of * struct ipv6_mreq_source; */ -#define HAS_SOCKET /**/ -#define HAS_SOCKETPAIR /**/ -/*#define HAS_SOCKADDR_SA_LEN / **/ -#define HAS_SOCKADDR_IN6 /**/ -#define HAS_SIN6_SCOPE_ID /**/ -#define HAS_IP_MREQ /**/ -#define HAS_IP_MREQ_SOURCE /**/ -#define HAS_IPV6_MREQ /**/ -/*#define HAS_IPV6_MREQ_SOURCE / **/ +#define HAS_SOCKET /**/ +#define HAS_SOCKETPAIR /**/ +/*#define HAS_SOCKADDR_SA_LEN / **/ +#define HAS_SOCKADDR_IN6 /**/ +#define HAS_SIN6_SCOPE_ID /**/ +#define HAS_IP_MREQ /**/ +#define HAS_IP_MREQ_SOURCE /**/ +#define HAS_IPV6_MREQ /**/ +/*#define HAS_IPV6_MREQ_SOURCE / **/ /* USE_STAT_BLOCKS: * This symbol is defined if this system has a stat structure declaring @@ -2144,7 +2144,7 @@ * This symbol, if defined, indicates that exists and * should be included. */ -#define I_SYSUIO /**/ +#define I_SYSUIO /**/ /* I_TERMIO: * This symbol, if defined, indicates that the program should include @@ -2243,8 +2243,8 @@ * Perl has been cross-compiled to. Undefined if not a cross-compile. */ #ifndef USE_CROSS_COMPILE -/*#define USE_CROSS_COMPILE / **/ -#define PERL_TARGETARCH "" /**/ +/*#define USE_CROSS_COMPILE / **/ +#define PERL_TARGETARCH "" /**/ #endif /* PERL_USE_DEVEL: @@ -2252,7 +2252,7 @@ * -Dusedevel, to enable development features. This should not be * done for production builds. */ -#define PERL_USE_DEVEL /**/ +#define PERL_USE_DEVEL /**/ /* HAS_ATOLF: * This symbol, if defined, indicates that the atolf routine is @@ -2331,7 +2331,7 @@ /* HAS_C99_VARIADIC_MACROS: * If defined, the compiler supports C99 variadic macros. */ -#define HAS_C99_VARIADIC_MACROS /**/ +#define HAS_C99_VARIADIC_MACROS /**/ /* HAS_CLASS: * This symbol, if defined, indicates that the class routine is @@ -2387,10 +2387,10 @@ * to the program to supply one. A good guess is * extern int dbminit(char *); */ -#define HAS_DBMINIT_PROTO /**/ +#define HAS_DBMINIT_PROTO /**/ /* HAS_DIR_DD_FD: - * This symbol, if defined, indicates that the the DIR* dirstream + * This symbol, if defined, indicates that the DIR* dirstream * structure contains a member variable named dd_fd. */ /*#define HAS_DIR_DD_FD / **/ @@ -2497,7 +2497,7 @@ * to the program to supply one. A good guess is * extern int flock(int, int); */ -#define HAS_FLOCK_PROTO /**/ +#define HAS_FLOCK_PROTO /**/ /* HAS_FMA: * This symbol, if defined, indicates that the fma routine is @@ -2583,8 +2583,8 @@ * FP_NAN NaN * */ -#define HAS_FPCLASSIFY /**/ -/*#define HAS_FP_CLASSIFY / **/ +#define HAS_FPCLASSIFY /**/ +/*#define HAS_FP_CLASSIFY / **/ /* HAS_FPCLASSL: * This symbol, if defined, indicates that the fpclassl routine is @@ -2613,7 +2613,7 @@ /* HAS_FPOS64_T: * This symbol will be defined if the C compiler supports fpos64_t. */ -/*#define HAS_FPOS64_T / **/ +/*#define HAS_FPOS64_T / **/ /* HAS_FREXPL: * This symbol, if defined, indicates that the frexpl routine is @@ -2643,11 +2643,11 @@ /* HAS_UNLINKAT: * This symbol is defined if the unlinkat() routine is available. */ -#define HAS_FCHMODAT /**/ -#define HAS_LINKAT /**/ -#define HAS_OPENAT /**/ -#define HAS_RENAMEAT /**/ -#define HAS_UNLINKAT /**/ +#define HAS_FCHMODAT /**/ +#define HAS_LINKAT /**/ +#define HAS_OPENAT /**/ +#define HAS_RENAMEAT /**/ +#define HAS_UNLINKAT /**/ /* HAS_FSEEKO: * This symbol, if defined, indicates that the fseeko routine is @@ -2855,8 +2855,8 @@ * j0l() function is available for Bessel functions of the first * kind of the order zero, for long doubles. */ -#define HAS_J0 /**/ -#define HAS_J0L /**/ +#define HAS_J0 /**/ +#define HAS_J0L /**/ /* HAS_LC_MONETARY_2008: * This symbol, if defined, indicates that the localeconv routine is @@ -3081,11 +3081,11 @@ * This symbol, if defined, indicates to the C program that it should * include to get uselocale() and its friends. */ -#define HAS_NEWLOCALE /**/ -#define HAS_FREELOCALE /**/ -#define HAS_USELOCALE /**/ -/*#define HAS_QUERYLOCALE / **/ -#define I_XLOCALE /**/ +#define HAS_NEWLOCALE /**/ +#define HAS_FREELOCALE /**/ +#define HAS_USELOCALE /**/ +/*#define HAS_QUERYLOCALE / **/ +#define I_XLOCALE /**/ /* HAS_NEXTAFTER: * This symbol, if defined, indicates that the nextafter routine is @@ -3111,7 +3111,7 @@ /* HAS_OFF64_T: * This symbol will be defined if the C compiler supports off64_t. */ -/*#define HAS_OFF64_T / **/ +/*#define HAS_OFF64_T / **/ /* HAS_PIPE2: * This symbol, if defined, indicates that the pipe2 @@ -3156,7 +3156,7 @@ /* HAS_PTRDIFF_T: * This symbol will be defined if the C compiler supports ptrdiff_t. */ -#define HAS_PTRDIFF_T /**/ +#define HAS_PTRDIFF_T /**/ /* HAS_READV: * This symbol, if defined, indicates that the readv routine is @@ -3203,7 +3203,7 @@ * extern void* sbrk(int); * extern void* sbrk(size_t); */ -#define HAS_SBRK_PROTO /**/ +#define HAS_SBRK_PROTO /**/ /* HAS_SCALBN: * This symbol, if defined, indicates that the scalbn routine is @@ -3258,7 +3258,7 @@ * be used. */ #ifndef USE_SITECUSTOMIZE -/*#define USE_SITECUSTOMIZE / **/ +/*#define USE_SITECUSTOMIZE / **/ #endif /* HAS_SNPRINTF: @@ -3284,7 +3284,7 @@ * to the program to supply one. A good guess is * extern int sockatmark(int); */ -#define HAS_SOCKATMARK_PROTO /**/ +#define HAS_SOCKATMARK_PROTO /**/ /* HAS_SOCKS5_INIT: * This symbol, if defined, indicates that the socks5_init routine is @@ -3304,7 +3304,7 @@ * to the program to supply one. Good guesses are * extern int setresgid(uid_t ruid, uid_t euid, uid_t suid); */ -/*#define HAS_SETRESGID_PROTO / **/ +/*#define HAS_SETRESGID_PROTO / **/ /* HAS_SETRESUID_PROTO: * This symbol, if defined, indicates that the system provides @@ -3312,7 +3312,7 @@ * to the program to supply one. Good guesses are * extern int setresuid(uid_t ruid, uid_t euid, uid_t suid); */ -/*#define HAS_SETRESUID_PROTO / **/ +/*#define HAS_SETRESUID_PROTO / **/ /* HAS_STRUCT_STATFS_F_FLAGS: * This symbol, if defined, indicates that the struct statfs @@ -3405,7 +3405,7 @@ * extern int syscall(int, ...); * extern int syscall(long, ...); */ -#define HAS_SYSCALL_PROTO /**/ +#define HAS_SYSCALL_PROTO /**/ /* HAS_TELLDIR_PROTO: * This symbol, if defined, indicates that the system provides @@ -3413,7 +3413,7 @@ * to the program to supply one. A good guess is * extern long telldir(DIR*); */ -#define HAS_TELLDIR_PROTO /**/ +#define HAS_TELLDIR_PROTO /**/ /* HAS_TGAMMA: * This symbol, if defined, indicates that the tgamma routine is @@ -3445,12 +3445,12 @@ * This symbol, if defined, indicates that the asctime64 () routine is * available to do the 64bit variant of asctime () */ -/*#define HAS_CTIME64 / **/ -/*#define HAS_LOCALTIME64 / **/ -/*#define HAS_GMTIME64 / **/ -/*#define HAS_MKTIME64 / **/ -/*#define HAS_DIFFTIME64 / **/ -/*#define HAS_ASCTIME64 / **/ +/*#define HAS_CTIME64 / **/ +/*#define HAS_LOCALTIME64 / **/ +/*#define HAS_GMTIME64 / **/ +/*#define HAS_MKTIME64 / **/ +/*#define HAS_DIFFTIME64 / **/ +/*#define HAS_ASCTIME64 / **/ /* HAS_TIMEGM: * This symbol, if defined, indicates that the timegm routine is @@ -3503,7 +3503,7 @@ * to the program to supply one. A good guess is * extern int usleep(useconds_t); */ -#define HAS_USLEEP_PROTO /**/ +#define HAS_USLEEP_PROTO /**/ /* HAS_USTAT: * This symbol, if defined, indicates that the ustat system call is @@ -3519,7 +3519,7 @@ /* HAS_WCSXFRM: * This symbol, if defined, indicates that the wcsxfrm routine is - * available to tranform a wide character string for wcscmp(). + * available to transform a wide character string for wcscmp(). */ #define HAS_WCSXFRM /**/ @@ -3554,20 +3554,20 @@ * Note that if fflushNULL is defined, fflushall will not * even be probed for and will be left undefined. */ -#define FFLUSH_NULL /**/ -/*#define FFLUSH_ALL / **/ +#define FFLUSH_NULL /**/ +/*#define FFLUSH_ALL / **/ /* I_BFD: * This symbol, if defined, indicates that exists and * can be included. */ -/*#define I_BFD / **/ +/*#define I_BFD / **/ /* I_CRYPT: * This symbol, if defined, indicates that exists and * should be included. */ -#define I_CRYPT /**/ +#define I_CRYPT /**/ /* DB_Prefix_t: * This symbol contains the type of the prefix structure element @@ -3609,19 +3609,19 @@ * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_FP / **/ +/*#define I_FP / **/ /* I_FP_CLASS: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_FP_CLASS / **/ +/*#define I_FP_CLASS / **/ /* I_IEEEFP: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_IEEEFP / **/ +/*#define I_IEEEFP / **/ /* I_INTTYPES: * This symbol, if defined, indicates to the C program that it should @@ -3633,13 +3633,13 @@ * This symbol, if defined, indicates that exists and * should be included. */ -#define I_LANGINFO /**/ +#define I_LANGINFO /**/ /* I_LIBUTIL: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_LIBUTIL / **/ +/*#define I_LIBUTIL / **/ /* I_MALLOCMALLOC: * This symbol, if defined, indicates to the C program that it should @@ -3651,7 +3651,7 @@ * This symbol, if defined, indicates that exists and * should be included. */ -#define I_MNTENT /**/ +#define I_MNTENT /**/ /* I_NETINET_TCP: * This symbol, if defined, indicates to the C program that it should @@ -3663,37 +3663,37 @@ * This symbol, if defined, indicates that exists and * should be included. (see also HAS_POLL) */ -#define I_POLL /**/ +#define I_POLL /**/ /* I_PROT: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_PROT / **/ +/*#define I_PROT / **/ /* I_QUADMATH: * This symbol, if defined, indicates that exists and * should be included. */ -#define I_QUADMATH /**/ +#define I_QUADMATH /**/ /* I_SHADOW: * This symbol, if defined, indicates that exists and * should be included. */ -#define I_SHADOW /**/ +#define I_SHADOW /**/ /* I_SOCKS: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SOCKS / **/ +/*#define I_SOCKS / **/ /* I_STDBOOL: * This symbol, if defined, indicates that exists and * can be included. */ -#define I_STDBOOL /**/ +#define I_STDBOOL /**/ /* I_STDINT: * This symbol, if defined, indicates that exists and @@ -3705,54 +3705,54 @@ * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SUNMATH / **/ +/*#define I_SUNMATH / **/ /* I_SYSLOG: * This symbol, if defined, indicates that exists and * should be included. */ -#define I_SYSLOG /**/ +#define I_SYSLOG /**/ /* I_SYSMODE: * This symbol, if defined, indicates that exists and * should be included. */ -/*#define I_SYSMODE / **/ +/*#define I_SYSMODE / **/ /* I_SYS_MOUNT: * This symbol, if defined, indicates that exists and * should be included. */ -#define I_SYS_MOUNT /**/ +#define I_SYS_MOUNT /**/ /* I_SYS_STATFS: * This symbol, if defined, indicates that exists. */ -#define I_SYS_STATFS /**/ +#define I_SYS_STATFS /**/ /* I_SYS_STATVFS: * This symbol, if defined, indicates that exists and * should be included. */ -#define I_SYS_STATVFS /**/ +#define I_SYS_STATVFS /**/ /* I_SYSUTSNAME: * This symbol, if defined, indicates that exists and * should be included. */ -#define I_SYSUTSNAME /**/ +#define I_SYSUTSNAME /**/ /* I_SYS_VFS: * This symbol, if defined, indicates that exists and * should be included. */ -#define I_SYS_VFS /**/ +#define I_SYS_VFS /**/ /* I_USTAT: * This symbol, if defined, indicates that exists and * should be included. */ -#define I_USTAT /**/ +#define I_USTAT /**/ /* I_WCHAR: * This symbol, if defined, indicates to the C program that @@ -3909,7 +3909,7 @@ * of copying mechanisms, handy.h defines a platform- * independent macro, Perl_va_copy(src, dst), to do the job. */ -#define NEED_VA_COPY /**/ +#define NEED_VA_COPY /**/ /* IVTYPE: * This symbol defines the C type used for Perl's IV. @@ -4000,36 +4000,36 @@ * This symbol, if defined, indicates that a variable of type NVTYPE * stores 0.0 in memory as all bits zero. */ -#define IVTYPE long /**/ -#define UVTYPE unsigned long /**/ -#define I8TYPE signed char /**/ -#define U8TYPE unsigned char /**/ -#define I16TYPE short /**/ -#define U16TYPE unsigned short /**/ -#define I32TYPE int /**/ -#define U32TYPE unsigned int /**/ +#define IVTYPE long /**/ +#define UVTYPE unsigned long /**/ +#define I8TYPE signed char /**/ +#define U8TYPE unsigned char /**/ +#define I16TYPE short /**/ +#define U16TYPE unsigned short /**/ +#define I32TYPE int /**/ +#define U32TYPE unsigned int /**/ #ifdef HAS_QUAD -#define I64TYPE long /**/ -#define U64TYPE unsigned long /**/ +#define I64TYPE long /**/ +#define U64TYPE unsigned long /**/ #endif -#define NVTYPE double /**/ -#define IVSIZE 8 /**/ -#define UVSIZE 8 /**/ -#define I8SIZE 1 /**/ -#define U8SIZE 1 /**/ -#define I16SIZE 2 /**/ -#define U16SIZE 2 /**/ -#define I32SIZE 4 /**/ -#define U32SIZE 4 /**/ +#define NVTYPE double /**/ +#define IVSIZE 8 /**/ +#define UVSIZE 8 /**/ +#define I8SIZE 1 /**/ +#define U8SIZE 1 /**/ +#define I16SIZE 2 /**/ +#define U16SIZE 2 /**/ +#define I32SIZE 4 /**/ +#define U32SIZE 4 /**/ #ifdef HAS_QUAD -#define I64SIZE 8 /**/ -#define U64SIZE 8 /**/ +#define I64SIZE 8 /**/ +#define U64SIZE 8 /**/ #endif -#define NVSIZE 8 /**/ +#define NVSIZE 8 /**/ #undef NV_PRESERVES_UV -#define NV_PRESERVES_UV_BITS 53 -#define NV_OVERFLOWS_INTEGERS_AT (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0) -#define NV_ZERO_IS_ALLBITS_ZERO +#define NV_PRESERVES_UV_BITS 53 +#define NV_OVERFLOWS_INTEGERS_AT (256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0) +#define NV_ZERO_IS_ALLBITS_ZERO #if UVSIZE == 8 # ifdef BYTEORDER # if BYTEORDER == 0x1234 @@ -4076,14 +4076,14 @@ * This symbol defines the format string used for printing a Perl NV * using %g-ish floating point format. */ -#define IVdf "ld" /**/ -#define UVuf "lu" /**/ -#define UVof "lo" /**/ -#define UVxf "lx" /**/ -#define UVXf "lX" /**/ -#define NVef "e" /**/ -#define NVff "f" /**/ -#define NVgf "g" /**/ +#define IVdf "ld" /**/ +#define UVuf "lu" /**/ +#define UVof "lo" /**/ +#define UVxf "lx" /**/ +#define UVXf "lX" /**/ +#define NVef "e" /**/ +#define NVff "f" /**/ +#define NVgf "g" /**/ /* SELECT_MIN_BITS: * This symbol holds the minimum number of bits operated by select. @@ -4109,7 +4109,7 @@ * script to make sure (one hopes) that it runs with perl and not * some shell. */ -#define STARTPERL "#!/opt/perl/bin/perl5.36.3" /**/ +#define STARTPERL "#!/opt/perl/bin/perl5.38.2" /**/ /* HAS_STDIO_STREAM_ARRAY: * This symbol, if defined, tells that there is an array @@ -4119,7 +4119,7 @@ * This symbol tells the name of the array holding the stdio streams. * Usual values include _iob, __iob, and __sF. */ -/*#define HAS_STDIO_STREAM_ARRAY / **/ +/*#define HAS_STDIO_STREAM_ARRAY / **/ #ifdef HAS_STDIO_STREAM_ARRAY #define STDIO_STREAM_ARRAY #endif @@ -4164,10 +4164,10 @@ * you may need at least to reboot your OS to 64-bit mode. */ #ifndef USE_64_BIT_INT -#define USE_64_BIT_INT /**/ +#define USE_64_BIT_INT /**/ #endif #ifndef USE_64_BIT_ALL -#define USE_64_BIT_ALL /**/ +#define USE_64_BIT_ALL /**/ #endif /* USE_C_BACKTRACE: @@ -4188,7 +4188,7 @@ * Defaults to define in Perls 5.8 and earlier, to undef later. */ #ifndef USE_FAST_STDIO -/*#define USE_FAST_STDIO / **/ +/*#define USE_FAST_STDIO / **/ #endif /* USE_KERN_PROC_PATHNAME: @@ -4203,7 +4203,7 @@ * should be used when available. */ #ifndef USE_LARGE_FILES -#define USE_LARGE_FILES /**/ +#define USE_LARGE_FILES /**/ #endif /* USE_LONG_DOUBLE: @@ -4211,7 +4211,7 @@ * be used when available. */ #ifndef USE_LONG_DOUBLE -/*#define USE_LONG_DOUBLE / **/ +/*#define USE_LONG_DOUBLE / **/ #endif /* USE_MORE_BITS: @@ -4219,7 +4219,7 @@ * long doubles should be used when available. */ #ifndef USE_MORE_BITS -/*#define USE_MORE_BITS / **/ +/*#define USE_MORE_BITS / **/ #endif /* MULTIPLICITY: @@ -4227,7 +4227,7 @@ * be built to use multiplicity. */ #ifndef MULTIPLICITY -/*#define MULTIPLICITY / **/ +/*#define MULTIPLICITY / **/ #endif /* USE_NSGETEXECUTABLEPATH: @@ -4243,7 +4243,7 @@ * used in a fully backward compatible manner. */ #ifndef USE_PERLIO -#define USE_PERLIO /**/ +#define USE_PERLIO /**/ #endif /* USE_QUADMATH: @@ -4251,7 +4251,7 @@ * be used when available. */ #ifndef USE_QUADMATH -/*#define USE_QUADMATH / **/ +/*#define USE_QUADMATH / **/ #endif /* USE_SOCKS: @@ -4259,7 +4259,7 @@ * be built to use socks. */ #ifndef USE_SOCKS -/*#define USE_SOCKS / **/ +/*#define USE_SOCKS / **/ #endif /* HAS_DRAND48_PROTO: @@ -4268,7 +4268,7 @@ * to the program to supply one. A good guess is * extern double drand48(void); */ -#define HAS_DRAND48_PROTO /**/ +#define HAS_DRAND48_PROTO /**/ /* HAS_GETHOST_PROTOS: * This symbol, if defined, indicates that includes @@ -4276,7 +4276,7 @@ * gethostbyaddr(). Otherwise, it is up to the program to guess * them. See netdbtype.U for probing for various Netdb_xxx_t types. */ -#define HAS_GETHOST_PROTOS /**/ +#define HAS_GETHOST_PROTOS /**/ /* HAS_GETNET_PROTOS: * This symbol, if defined, indicates that includes @@ -4284,7 +4284,7 @@ * getnetbyaddr(). Otherwise, it is up to the program to guess * them. See netdbtype.U for probing for various Netdb_xxx_t types. */ -#define HAS_GETNET_PROTOS /**/ +#define HAS_GETNET_PROTOS /**/ /* HAS_GETPROTO_PROTOS: * This symbol, if defined, indicates that includes @@ -4292,7 +4292,7 @@ * getprotobyaddr(). Otherwise, it is up to the program to guess * them. See netdbtype.U for probing for various Netdb_xxx_t types. */ -#define HAS_GETPROTO_PROTOS /**/ +#define HAS_GETPROTO_PROTOS /**/ /* HAS_GETSERV_PROTOS: * This symbol, if defined, indicates that includes @@ -4300,7 +4300,7 @@ * getservbyaddr(). Otherwise, it is up to the program to guess * them. See netdbtype.U for probing for various Netdb_xxx_t types. */ -#define HAS_GETSERV_PROTOS /**/ +#define HAS_GETSERV_PROTOS /**/ /* HAS_LSEEK_PROTO: * This symbol, if defined, indicates that the system provides @@ -4308,7 +4308,7 @@ * to the program to supply one. A good guess is * extern off_t lseek(int, off_t, int); */ -#define HAS_LSEEK_PROTO /**/ +#define HAS_LSEEK_PROTO /**/ /* Netdb_host_t: * This symbol holds the type used for the 1st argument @@ -5080,10 +5080,10 @@ * try to use the various _r versions of library functions. * This is extremely experimental. */ -/*#define USE_ITHREADS / **/ -/*#define USE_THREADS / **/ -/*#define OLD_PTHREADS_API / **/ -/*#define USE_REENTRANT_API / **/ +/*#define USE_ITHREADS / **/ +/*#define USE_THREADS / **/ +/*#define OLD_PTHREADS_API / **/ +/*#define USE_REENTRANT_API / **/ /* HAS_TIME: * This symbol, if defined, indicates that the time() routine exists. @@ -5113,7 +5113,7 @@ /* Gid_t_f: * This symbol defines the format string used for printing a Gid_t. */ -#define Gid_t_f "u" /**/ +#define Gid_t_f "u" /**/ /* Gid_t_sign: * This symbol holds the signedness of a Gid_t. @@ -5181,7 +5181,7 @@ /* Uid_t_f: * This symbol defines the format string used for printing a Uid_t. */ -#define Uid_t_f "u" /**/ +#define Uid_t_f "u" /**/ /* Uid_t_sign: * This symbol holds the signedness of a Uid_t. Index: gnu/usr.bin/perl/Porting/config_h.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/config_h.pl,v diff -u -p -a -u -p -r1.1.1.6 config_h.pl --- gnu/usr.bin/perl/Porting/config_h.pl 15 Feb 2023 01:33:12 -0000 1.1.1.6 +++ gnu/usr.bin/perl/Porting/config_h.pl 21 Feb 2024 15:47:00 -0000 @@ -78,6 +78,8 @@ unless ($ch[0] =~ m/THIS IS A GENERATED push @ch, ";;\nesac\n"; } +s/^(\s*)#(\s*)define\t\s*/${1}#${2}define /gm for @ch; + open $ch, ">", $cSH or die "Cannot write $cSH: $!\n"; print $ch @ch; close $ch; Index: gnu/usr.bin/perl/Porting/core-cpan-diff =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/core-cpan-diff,v diff -u -p -a -u -p -r1.3 core-cpan-diff --- gnu/usr.bin/perl/Porting/core-cpan-diff 15 Feb 2023 01:36:14 -0000 1.3 +++ gnu/usr.bin/perl/Porting/core-cpan-diff 21 Feb 2024 15:47:00 -0000 @@ -53,7 +53,7 @@ Usage: $0 [opts] [ -d | -v | -x ] [ -a | -d/--diff Display file differences using diff(1), rather than just listing which files have changed. ---diffopts Options to pass to the diff command. Defaults to '-u --binary' +--diffopts Options to pass to the diff command. Defaults to '-u --text' (except on *BSD, where it's just '-u'). -f|force Force download from CPAN of new 02packages.details.txt file @@ -126,9 +126,9 @@ sub run { if ( $reverse || $use_diff || $diff_opts ); } else { - #$diff_opts = '-u --binary' unless defined $diff_opts; + #$diff_opts = '-u --text' unless defined $diff_opts; if (! defined $diff_opts) { - $diff_opts = ($^O =~ m/bsd$/i) ? '-u' : '-u --binary'; + $diff_opts = ($^O =~ m/bsd$/i) ? '-u' : '-u --text'; }; usage("can't use -f without --crosscheck") if $force; } Index: gnu/usr.bin/perl/Porting/core-team.json =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/core-team.json,v diff -u -p -a -u -p -r1.1.1.1 core-team.json --- gnu/usr.bin/perl/Porting/core-team.json 15 Feb 2023 01:33:12 -0000 1.1.1.1 +++ gnu/usr.bin/perl/Porting/core-team.json 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,9 @@ "ams@toroid.org", "doughera@lafayette.edu", "jan@jandubois.com", - "jesse@fsck.com" + "jesse@fsck.com", + "jmac@jmac.org", + "xdg@xdg.me" ], "active": [ "book@cpan.org", @@ -11,13 +13,14 @@ "cpan@corion.net", "craigberry@mac.com", "davem@iabyn.com", + "demerphq@gmail.com", "ether@cpan.org", "exodist7@gmail.com", "fawaka@gmail.com", "hv@crypt.org", "ilmari@ilmari.org", "jkeenan@cpan.org", - "jmac@jmac.org", + "haarg@haarg.org", "khw@cpan.org", "leonerd@leonerd.org.uk", "neilb@neilb.org", @@ -29,7 +32,6 @@ "stuart@perlfoundation.org", "toddr@cpanel.net", "tony@develop-help.com", - "wolfsage@gmail.com", - "xdg@xdg.me" + "wolfsage@gmail.com" ] } Index: gnu/usr.bin/perl/Porting/deparse-skips.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/deparse-skips.txt,v diff -u -p -a -u -p -r1.4 deparse-skips.txt --- gnu/usr.bin/perl/Porting/deparse-skips.txt 15 Feb 2023 01:36:14 -0000 1.4 +++ gnu/usr.bin/perl/Porting/deparse-skips.txt 21 Feb 2024 15:47:00 -0000 @@ -32,6 +32,16 @@ __DEPARSE_FAILURES__ base/lex.t # checks regexp stringification +# class/*.t generally failing because OP_METHSTART not recognised +class/class.t +class/construct.t +class/destruct.t +class/field.t +class/inherit.t +class/method.t +class/phasers.t +class/threads.t +# comp/final_line_num.t # tests syntax error after BEGIN block comp/fold.t # mutability of folded constants comp/parser.t # crazy #line directives ==> shell syntax errors @@ -44,7 +54,6 @@ op/attrhand.t # Custom attrs op/caller.t op/goto.t op/gv.t # glob copy constants -op/hexfp.t op/index.t op/join.t # mutability of folded constants op/length.t # utf8ness of deparsed strings @@ -63,14 +72,17 @@ op/sub.t op/switch.t op/symbolcache.t op/taint.t +op/undef.t # keys%{($h=undef)||{}} becomes keys%{{} unless .. } op/vec.t op/warn.t op/write.t +perf/opcount.t # keys%{($h=undef)||{}} becomes keys%{{} unless .. } porting/globvar.t re/overload.t # [perl #123385] %^H output re/pat_advanced.t # [perl #123417] re/pat_rt_report.t # malformed utf8 constant; also /\c@/ -> /\c\@/ re/pat.t # [perl #90590] +re/pat_re_eval.t # the new /(*{...})/ forms don't deparse re/regex_sets.t re/reg_fold.t # [perl #123385] %^H output re/rxcode.t # checks regexp stringification @@ -154,31 +166,46 @@ uni/variables.t # } ../cpan/bignum/t/bigexp.t +../cpan/bignum/t/bigfloat.t ../cpan/bignum/t/bigint.t ../cpan/bignum/t/bignum.t ../cpan/bignum/t/bigrat.t +../cpan/bignum/t/const-bigfloat.t ../cpan/bignum/t/const-bigint.t ../cpan/bignum/t/const-bignum.t ../cpan/bignum/t/const-bigrat.t +../cpan/bignum/t/down-mbi-up-mbf.t +../cpan/bignum/t/down-mbi-up-mbr.t +../cpan/bignum/t/down-mbi-up-undef.t +../cpan/bignum/t/down-undef-up-mbf.t +../cpan/bignum/t/e_pi-bigfloat.t ../cpan/bignum/t/e_pi-bigint.t ../cpan/bignum/t/e_pi-bignum.t ../cpan/bignum/t/e_pi-bigrat.t +../cpan/bignum/t/import-bigfloat.t ../cpan/bignum/t/import-bigint.t ../cpan/bignum/t/import-bignum.t ../cpan/bignum/t/import-bigrat.t ../cpan/bignum/t/in_effect.t +../cpan/bignum/t/infnan-bigfloat.t ../cpan/bignum/t/infnan-bigint.t -../cpan/bignum/t/infnan-bignum.t +../cpan/bignum/t/infnan-bignum-mbf.t +../cpan/bignum/t/infnan-bignum-mbr.t ../cpan/bignum/t/infnan-bigrat.t +../cpan/bignum/t/option_a-bignum.t ../cpan/bignum/t/option_a.t -../cpan/bignum/t/option_l.t +../cpan/bignum/t/option_l-bigfloat.t +../cpan/bignum/t/option_l-bigint.t +../cpan/bignum/t/option_l-bignum.t +../cpan/bignum/t/option_l-bigrat.t +../cpan/bignum/t/option_p-bignum.t ../cpan/bignum/t/option_p.t ../cpan/bignum/t/overrides.t ../cpan/bignum/t/ratopt_a.t +../cpan/bignum/t/scope-bigfloat.t ../cpan/bignum/t/scope-bigint.t ../cpan/bignum/t/scope-bignum.t ../cpan/bignum/t/scope-bigrat.t -../cpan/bignum/t/scope-nested-const.t # ------------- @@ -188,10 +215,6 @@ uni/variables.t ../cpan/ExtUtils-MakeMaker/t/MM_VMS.t # see comment above about bignum failures -../cpan/Math-BigInt/t/const-mbf.t -../cpan/Math-BigInt/t/const-mbi.t - -# see comment above about bignum failures ../cpan/Math-BigRat/t/const-mbr.t @@ -233,7 +256,6 @@ uni/variables.t ../ext/XS-APItest/t/call_checker.t ../ext/XS-APItest/t/cleanup.t ../ext/XS-APItest/t/fetch_pad_names.t -../ext/XS-APItest/t/svpeek.t ../ext/XS-APItest/t/synthetic_scope.t ../lib/Config.t # Config_heavy.pl fns getting output ../lib/charnames.t Index: gnu/usr.bin/perl/Porting/exclude_contrib.txt =================================================================== RCS file: gnu/usr.bin/perl/Porting/exclude_contrib.txt diff -N gnu/usr.bin/perl/Porting/exclude_contrib.txt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/Porting/exclude_contrib.txt 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,23 @@ +########################################################################## +# This file is managed by `Porting/updateAUTHORS.pl` +# +# It contains the base 64 SHA-256 of the name and email details of the +# contributors who have requested that their gracious contributions go +# unnoted in our AUTHORS file, and who choose not to be listed in our +# .mailmap files either. +# +# For example the user details +# +# Joe +# +# would be excluded via entry +# +# UkM6tKuf79Ra0HH7wQj6YUXumpjWy6Qd3aB5+HoNoGM +# +# To update this file you should use one of the --exclude options to +# `Porting/updateAUTHORS.pl`, but if you *must* manually edit it then make +# sure you run the tool afterwards to ensure it is correctly formatted and +# sorted. +########################################################################## +dXO3142iRNcbpIKO2qxc1o3lNX8+oOCoyG5si+Sb2Ck +QvzD7VskxHgLvOy3GdB9zvcqWIH9uM347jNLQS8QfFs Index: gnu/usr.bin/perl/Porting/exec-bit.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/exec-bit.txt,v diff -u -p -a -u -p -r1.6 exec-bit.txt --- gnu/usr.bin/perl/Porting/exec-bit.txt 15 Feb 2023 01:36:14 -0000 1.6 +++ gnu/usr.bin/perl/Porting/exec-bit.txt 21 Feb 2024 15:47:00 -0000 @@ -20,6 +20,8 @@ dist/Devel-PPPort/devel/regenerate dist/Devel-PPPort/devel/scanprov dist/Devel-PPPort/devel/update_release_date.pl dist/Devel-PPPort/soak +dist/Thread-Queue/examples/callback.pl +dist/Thread-Queue/examples/queue.pl installperl installman makedepend.SH @@ -42,7 +44,6 @@ Porting/bench.pl Porting/bisect.pl Porting/bisect-example.sh Porting/bisect-runner.pl -Porting/checkAUTHORS.pl Porting/checkURL.pl Porting/checkVERSION.pl Porting/checkansi.pl @@ -69,3 +70,4 @@ Porting/updateAUTHORS.pl Porting/valgrindpp.pl Cross/generate_config_sh Cross/warp +dist/Thread-Semaphore/examples/semaphore.pl Index: gnu/usr.bin/perl/Porting/make-rmg-checklist =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/make-rmg-checklist,v diff -u -p -a -u -p -r1.3 make-rmg-checklist --- gnu/usr.bin/perl/Porting/make-rmg-checklist 23 Dec 2023 21:02:20 -0000 1.3 +++ gnu/usr.bin/perl/Porting/make-rmg-checklist 21 Feb 2024 15:47:00 -0000 @@ -148,7 +148,7 @@ my $passthru_headers = qr/^= (?: over | # version used when generating diffs (acknowledgements, Module::CoreList etc) # 5.36.0 -> 5.34.0 -# 5.36.3 -> 5.36.0 +# 5.36.1 -> 5.36.0 my ($major, $minor, $point) = split(/\./, $version); my $last_version = join('.', $major, ($point == 0 ? ($minor - 2, 0) : ($minor, $point-1))); @@ -188,7 +188,7 @@ foreach my $line (@pod_lines) { $line =~ s/\Q5.X.Y\E/$version/g; $line =~ s/\Q5.LAST\E/$last_version/g; - $line =~ s/\Q5.X\E-b/$major.$minor/g; + $line =~ s/\Q5.X\E\b/$major.$minor/g; $current_element->{'content'} .= "\n" . $line; } Index: gnu/usr.bin/perl/Porting/makerel =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/makerel,v diff -u -p -a -u -p -r1.17 makerel --- gnu/usr.bin/perl/Porting/makerel 15 Feb 2023 01:36:14 -0000 1.17 +++ gnu/usr.bin/perl/Porting/makerel 21 Feb 2024 15:47:00 -0000 @@ -24,7 +24,7 @@ use warnings; # # Tim Bunce, June 1997 -use ExtUtils::Manifest qw(fullcheck); +use ExtUtils::Manifest qw(manicheck); $ExtUtils::Manifest::Quiet = 1; use Getopt::Std; use Digest::SHA; @@ -87,26 +87,12 @@ print "\nMaking a release for $perl in $ cleanup($relroot, $reldir) if $opts{c}; print "Cross-checking the MANIFEST...\n"; -my ($missfile, $missentry) = fullcheck(); -@$missentry - = grep {$_ !~ m!^\.(?:git|github|mailmap)! and $_ !~ m!(?:/|^)\.gitignore!} @$missentry; -if (@$missfile ) { +my @missfile = manicheck(); +if (@missfile) { warn "Can't make a release with MANIFEST files missing:\n"; - warn "\t".$_."\n" for (@$missfile); + warn "\t".$_."\n" for (@missfile); } -if (@$missentry ) { - warn "Can't make a release with files not listed in MANIFEST\n"; - warn "\t".$_."\n" for (@$missentry); - -} -if ("@$missentry" =~ m/\.orig\b/) { - # Handy listing of find command and .orig files from patching work. - # I tend to run 'xargs rm' and copy and paste the file list. - my $cmd = "find . -name '*.orig' -print"; - print "$cmd\n"; - system($cmd); -} -die "Aborted.\n" if @$missentry or @$missfile; +die "Aborted.\n" if @missfile; print "\n"; # VMS no longer has hardcoded version numbers descrip.mms Index: gnu/usr.bin/perl/Porting/manifest_lib.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/manifest_lib.pl,v diff -u -p -a -u -p -r1.1.1.2 manifest_lib.pl --- gnu/usr.bin/perl/Porting/manifest_lib.pl 15 Feb 2023 01:33:12 -0000 1.1.1.2 +++ gnu/usr.bin/perl/Porting/manifest_lib.pl 21 Feb 2024 15:47:00 -0000 @@ -1,6 +1,8 @@ #!/usr/bin/perl use strict; +use warnings; +use Text::Tabs qw(expand unexpand); =head1 NAME @@ -27,16 +29,77 @@ listed sorted appropriately. # and so that lib/Foo/Bar.pm sorts before lib/Foo/Bar/Alpha.pm # and so that configure and Configure sort together. sub sort_manifest { - return + my @lines = @_; + + # first we ensure that the descriptions for the files + # are lined up reasonably. + my %pfx_len; + my @line_tuples; + foreach my $idx (0 .. $#lines) { + my $line = $lines[$idx]; + # clean up tab/space issues + $line =~ s/\t[ ]+/\t/; + if ($line =~ s/^(\S+)([ ]\s+)(\S+.*)/$1\t/) { + my $descr = $2; + $descr =~ s/\t+/ /g; + $line .= $descr; + } + $line =~ s/\s+\z//; + $line =~ /^(\S+)(?:\t+([^\t]*))?\z/ + or do { + $line =~ s/\t/\\t/g; + die "Malformed content in MANIFEST at line $idx: '$line'\n", + "Note: tabs have been encoded as \\t in this message.\n"; + }; + my ($file, $descr) = ($1, $2); + my $pfx; + if ($file =~ m!^((?:[^/]+/){1,2})!) { + $pfx = $1; + } else { + $pfx = ""; + } + #print "'$pfx': $file\n"; + push @line_tuples, [$pfx, $file, $descr]; + $pfx_len{$pfx} //= 40; + + # ensure we have at least one "space" (really tab) + my $flen = 1 + length $file; + $pfx_len{$pfx} = $flen + if $pfx_len{$pfx} < $flen; + } + + # round up to the next tab stop + $_ % 8 and $_ += (8 - ($_ % 8)) for values %pfx_len; + + my @pretty_lines; + foreach my $tuple (@line_tuples) { + my ($pfx, $file, $descr) = @$tuple; + my $str = sprintf "%*s", -$pfx_len{$pfx}, $file; + ($str) = unexpand($str); + # I do not understand why this is necessary. Bug in unexpand()? + # See https://github.com/ap/Text-Tabs/issues/5 + $str =~ s/[ ]+/\t/; + if ($descr) { + $str =~ s/\t?\z/\t/; + $str .= $descr; + } + $str =~ s/\s+\z//; + push @pretty_lines, $str; + } + + @pretty_lines = # case insensitive sorting of directory components independently. map { $_->[0] } # extract the full line sort { + $a->[2] cmp $b->[2] || # sort by the first directory $a->[1] cmp $b->[1] || # sort in order of munged filename $a->[0] cmp $b->[0] # then by the exact text in full line } map { # split out the filename and the description my ($f) = split /\s+/, $_, 2; + # extract out the first directory + my $d = $f=~m!^(\w+/)! ? lc $1 : ""; # lc the filename so Configure and configure sort together in the list my $m= lc $f; # $m for munged # replace slashes by nulls, this makes short directory names sort before @@ -46,9 +109,11 @@ sub sort_manifest { # this puts any foo/blah.ext before any files in foo/blah/ $m =~ s{(? has been upgraded from version A.xx to B.yy. -If there was something important to note about this change, include that here. +XXX If there was something important to note about this change, include that here. =back @@ -137,7 +137,7 @@ If there was something important to note =item * -XXX +XXX Remove this section if Porting/corelist-perldelta.pl did not add any content here. =back @@ -357,6 +357,9 @@ XXX XXX Important bug fixes in the core language are summarized here. Bug fixes in files in F and F are best summarized in L. +Include references to GitHub issues and PRs as: [GH #12345] and the release +manager will later use a regex to expand these into links. + [ List each fix as an =item entry ] =over 4 @@ -403,7 +406,7 @@ died, add a short obituary here. XXX Generate this with: - perl Porting/acknowledgements.pl v5.36.3..HEAD + perl Porting/acknowledgements.pl v5.37.12..HEAD =head1 Reporting Bugs Index: gnu/usr.bin/perl/Porting/release_announcement_template.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/release_announcement_template.txt,v diff -u -p -a -u -p -r1.6 release_announcement_template.txt --- gnu/usr.bin/perl/Porting/release_announcement_template.txt 15 Feb 2023 01:36:14 -0000 1.6 +++ gnu/usr.bin/perl/Porting/release_announcement_template.txt 21 Feb 2024 15:47:00 -0000 @@ -23,6 +23,6 @@ https://metacpan.org/pod/release/[AUTHOR [ACKNOWLEDGEMENTS SECTION FROM PERLDELTA] We expect to release version [NEXT BLEAD VERSION.SUBVERSION] on [FUTURE DATE]. -The next major stable release of Perl should appear in the first half of 2022. +The next major stable release of Perl should appear in the first half of 2023. [YOUR SALUTATION HERE] Index: gnu/usr.bin/perl/Porting/release_managers_guide.pod =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/release_managers_guide.pod,v diff -u -p -a -u -p -r1.11 release_managers_guide.pod --- gnu/usr.bin/perl/Porting/release_managers_guide.pod 8 Jul 2023 14:18:36 -0000 1.11 +++ gnu/usr.bin/perl/Porting/release_managers_guide.pod 21 Feb 2024 15:47:00 -0000 @@ -512,23 +512,10 @@ blead release, so you may find nothing t =head3 update AUTHORS The AUTHORS file can be updated by running F. - -(The old method was C and -it's still used under the hood, but you should use the -F update.) - -In the old method, for MAINT and BLEAD-FINAL releases, C needs to -refer to the last release in the previous development cycle (so for -example, for a 5.14.x release, this would be 5.13.11). - -In the old method, for BLEAD-POINT releases, it needs to refer to the -previous BLEAD-POINT release (so for 5.15.3 this would be 5.15.2). - -Note: It should not be harmful to use a wider range. - -Note: If you have uncommitted changes this could cause some warnings, -and you might like to use the additional argument C<--to=upstream/blead> -to use the last known git commit by GitHub. +This shouldn't really be necessary anymore, and in theory nothing should +change as our CI should not pass if a commit would result in AUTHORS +needing to change, but do it anyway to be sure. Make sure all your changes +are committed first. Review the changes to the AUTHORS file, be sure you are not adding duplicate entries or removing any entries, then commit your changes. Index: gnu/usr.bin/perl/Porting/sync-with-cpan =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/sync-with-cpan,v diff -u -p -a -u -p -r1.6 sync-with-cpan --- gnu/usr.bin/perl/Porting/sync-with-cpan 15 Feb 2023 01:36:14 -0000 1.6 +++ gnu/usr.bin/perl/Porting/sync-with-cpan 21 Feb 2024 15:47:00 -0000 @@ -97,7 +97,40 @@ from the filename -- but can be overwrit =item C<--jobs> I -When running C, pass a C<< -jI >> option to it. +When running C, pass a C<< -jI >> option to it to enable +parallel building. + +Note that you can also set C<< TEST_JOBS=I >> in the environment +to enable parallel *testing* on top of parallel *building*. + +=item C<--yes> + +Just continue at all places where we would normally ask for the user +to hit enter or hit CTL-C, with the exception of cases related to +CUSTOMIZED distributions, where this option will cause the update to +exit immediately unless the C<--force> option has also been used. + +=item C<--force> + +Do things we normally would refuse to do. + +=item C<--tarball> + +Use a predownloaded tarball and not one from CPAN. + +=item C<--version> + +Sync with a specific version, not the latest on CPAN. + +=item C<--no-test> + +=item C<--nt> + +Do not run tests. This is helpful for bulk updates. + +=item C<--help> + +Show help. =back @@ -154,14 +187,17 @@ die "This does not look like a top level die "Please run Configure before using $0\n" if !WIN32 && !-f "Makefile"; +#these are populated by Porting/Maintainers.pl our @IGNORABLE; our %Modules; +our %DistName; use autodie; require "./Porting/Maintainers.pl"; my $MAKE_LOG = 'make.log'; +unlink $MAKE_LOG if -e $MAKE_LOG; my %IGNORABLE = map {$_ => 1} @IGNORABLE; @@ -170,9 +206,10 @@ my $tmpdir = tmpdir(); my $package = "02packages.details.txt"; my $package_url = "http://www.cpan.org/modules/$package"; my $package_file = "$tmpdir/$package"; # this is a cache +my $type_dir = "cpan"; my @problematic = ( - 'podlators', # weird CUSTOMIZED section due to .PL files + # no current entries as of perl-5.38.2 (Jun 2023) ); @@ -186,11 +223,14 @@ sub usage GetOptions ('tarball=s' => \my $tarball, 'version=s' => \my $version, 'jobs=i' => \my $make_jobs, - force => \my $force, - help => sub { usage 0; }, - ) or die "Failed to parse arguments"; + 'yes' => \my $yes_to_all, + 'force' => \my $force, + 'no-test|nt' => \my $no_test, + 'help' => sub { usage 0; }, + 'type=s' => \$type_dir, + ) or die "Failed to parse arguments"; -usage 1 unless @ARGV == 1 || @ARGV == 2; +usage 1 unless @ARGV == 1; sub find_type_f { my @res; @@ -220,22 +260,74 @@ sub make_writable { } } -sub make { - my @args= @_; +my $SEP_LINE = ("-" x 79) . "\n"; + +sub cat_make_log { + my ($message) = @_; + print $message, $message=~/Starting/ + ? " and saving its output to '$MAKE_LOG' ...\n" + : "\n"; + + open my $ofh, ">>", $MAKE_LOG + or die "Failed to open '$MAKE_LOG' for append\n"; + print $ofh $SEP_LINE,"$message at ", + scalar(localtime),"\n",$SEP_LINE; + close $ofh; +} + +sub run_make { + my @args = @_; unshift @args, "-j$make_jobs" if defined $make_jobs; + cat_make_log("Starting `make @args`"); + my $errored; if (WIN32) { chdir "Win32"; - system "$Config{make} @args> ..\\$MAKE_LOG 2>&1" - and die "Running make failed, see $MAKE_LOG"; + $errored = system "$Config{make} @args >> ..\\$MAKE_LOG 2>&1"; chdir '..'; } else { - system "$Config{make} @args> $MAKE_LOG 2>&1" - and die "Running make failed, see $MAKE_LOG"; + $errored = system "$Config{make} @args >> $MAKE_LOG 2>&1"; }; -}; + cat_make_log("Finished `make @args`"); + if ($errored) { + if ($args[0] ne "test-prep") { + # see if we can extract the last Test Summary Report from + # the $MAKE_LOG file, + if (open my $ifh, "<", $MAKE_LOG) { + my @report; + my $in_summary; + while (<$ifh>) { + if (/^Test Summary Report/) { + @report = (); + $in_summary = 1; + } elsif ($_ eq $SEP_LINE) { + $in_summary = 0; + } + push @report, $_ if $in_summary; + } + print for @report; + } else { + warn "Failed to open $MAKE_LOG for reading: $!"; + } + } + die "Running `make` failed, see '$MAKE_LOG' for more details\n"; + } +} -my ($module) = shift; +sub pause_for_input { + my ($after_message) = @_; + print "Hit to continue; ^C to abort "; + if ($yes_to_all) { + print "\n--yes was used on command line, continuing.\n"; + } else { + my $noop = ; + } + print $after_message if $after_message; +} +my ($module) = shift @ARGV; +if (my $mod_name = $DistName{$module}) { + $module = $mod_name; +} my $info = $Modules{$module}; if (!$info) { # Maybe the user said "Test-Simple" instead of "Test::Simple", or @@ -266,8 +358,33 @@ for $module in Porting/Maintainers.pl (a t/porting/customized.dat in that case; see t/porting/customized.t). EOF - print "Hit return to continue; ^C to abort "; ; -} + if ($yes_to_all and !$force) { + die "This distribution is marked as CUSTOMIZED\n", + "You used --yes on the command line, but without --force.\n", + "Bailing out. Use --force to go ahead anyway.\n"; + } + pause_for_input("\n"); +} + +if (!$ENV{TEST_JOBS} and !WIN32) { + print "*** NOTE *** For speedups you can set TEST_JOBS=N in the env before running this script.\n"; +} +if (!$make_jobs and !WIN32) { + print "*** NOTE *** For speedups you can pass --jobs=N as an arg to this script.\n" +} +print "About to clean the $type_dir/ directory, and ensure its contents is up to date.\n"; +print "Will also checkout -f on $type_dir/, MANIFEST and Porting/Maintainers.pl\n"; +print "*** WARNING *** - this may DELETE uncommitted changes. Hit ^C if you have ANY doubts!\n"; +pause_for_input("\n"); +# clean out the cpan directory, this cleans up any temporary files that might be +# in the way, or other issues that might come up if the user bails out of the sync +# script and then runs it again. +my $clean_out= `git clean -dfx $type_dir`; # use backticks to hide the output +system git => 'checkout -f', + $type_dir, + 'MANIFEST', + 'Porting/Maintainers.pl'; # let the user see the output +print "the $type_dir/ directory is now clean and up to date\n---\n"; my $distribution = $$info {DISTRIBUTION}; @@ -284,12 +401,18 @@ if (!-d $files [0] || grep { $_ eq $modu use Cwd 'cwd'; my $orig_pwd = cwd(); -chdir "cpan"; +chdir "$type_dir"; my $pkg_dir = $files[0]; $pkg_dir =~ s!.*/!!; -my ($old_version) = $distribution =~ /-([0-9.]+(?:-TRIAL[0-9]*)?)\.tar\.gz/; +my $tail_pat = qr/(?:\.tar\.gz|\.tgz|\.zip)\z/; + +my ($old_version) = $distribution =~ /-([0-9._]+(?:-TRIAL[0-9]*)?)$tail_pat/; + +if (!$old_version) { + die "WTF: failed to parse old version from '$distribution'\n"; +} sub wget { my ($url, $saveas) = @_; @@ -324,12 +447,13 @@ sub wget { # my $new_file; my $new_version; +my $re_update = ""; if (defined $tarball) { $tarball = rel2abs( $tarball, $orig_pwd ) ; die "Tarball $tarball does not exist\n" if !-e $tarball; die "Tarball $tarball is not a plain file\n" if !-f _; $new_file = $tarball; - $new_version = $version // ($new_file =~ /-([0-9._]+(?:-TRIAL[0-9]*)?)\.tar\.gz/) [0]; + $new_version = $version // ($new_file =~ /-([0-9._]+(?:-TRIAL[0-9]*)?)$tail_pat/) [0]; die "Blead and that tarball both have version $new_version of $module\n" if $new_version eq $old_version; } @@ -352,8 +476,13 @@ else { } $new_file = (split '/', $new_path) [-1]; - die "The latest version of $module is $new_version, but blead already has it\n" - if $new_version eq $old_version; + if ($old_version eq $new_version) { + $re_update = "Re-"; + print "The latest version of $module is $new_version, but blead already has it.\n"; + print "Continuing may update MANIFEST or other metadata so it may make sense to continue anyway.\n"; + print "Are you sure you want to continue?\n"; + pause_for_input(); + } my $url = "https://cpan.metacpan.org/authors/id/$new_path"; say "Fetching $url"; @@ -363,7 +492,7 @@ else { wget $url, $new_file; } -my $old_dir = "$pkg_dir-$old_version"; +my $old_dir = "$pkg_dir-$old_version-OLD"; say "Cleaning out old directory"; system git => 'clean', '-dfxq', $pkg_dir; @@ -371,7 +500,7 @@ system git => 'clean', '-dfxq', $pkg_dir say "Unpacking $new_file"; Archive::Tar->extract_archive( $new_file ); -(my $new_dir = basename($new_file)) =~ s/\.tar\.gz//; +(my $new_dir = basename($new_file)) =~ s/$tail_pat//; # ensure 'make' will update all files my $t= time; for my $file (find_type_f($new_dir)) { @@ -415,8 +544,8 @@ FILE: for my $file ( find_type_f( $new_d $file = $files[0] . '/' . $file; } - if ( $file =~ m{^cpan/} ) { - $file =~ s{^cpan/}{}; + if ( $file =~ m{^$type_dir/} ) { + $file =~ s{^$type_dir/}{}; } else { $file = '../' . $file; @@ -453,10 +582,17 @@ my %old_files = map {$_ => 1} @old_files my @delete; my @commit; my @gone; +my $changes_file; FILE: foreach my $file (@new_files) { next if -d "$pkg_dir/$file"; # Ignore directories. next if $old_files {$file}; # It's already there. + if ($file=~/Changes/i or $file=~/Changelog/) { + if ($changes_file) { + die "More than one changes file? $file and $changes_file both exist?"; + } + $changes_file = "$pkg_dir/$file"; + } if ($IGNORABLE {$file}) { push @delete => $file; next; @@ -469,6 +605,54 @@ foreach my $file (@old_files) { push @gone => $file; } +my @changes_info; +if (!$changes_file) { + print "Could not find a changes file!\n", + "If this is not correct and there is one, please consider updating this script!\n"; +} else { + open my $ifh, "<", $changes_file + or die "Failed to open '$changes_file':$!"; + chomp(my @lines = <$ifh>); + close $ifh; + my $seen_new_version; + my $is_update = $new_version ne $old_version; + + for(my $idx = 0; $idx < @lines; $idx++) { + if ($lines[$idx] =~ /$new_version/ || + ($pkg_dir eq "CPAN" and $lines[$idx] =~/^\d{4}-\d{2}-\d{2}/ + && $lines[$idx+2] + && $lines[$idx+2] =~ /release $new_version/) + ){ + $seen_new_version = 1; + push @changes_info, $lines[$idx]; + } elsif ($seen_new_version) { + if ($is_update && $pkg_dir eq "ExtUtils-MakeMaker") { + if ($lines[$idx] =~/$old_version/) { + last; + } + } + elsif (($lines[$idx]=~/\d\.\d/ and $lines[$idx]=~/20\d\d/) || + ($lines[$idx]=~/---------------------------------/) || + ($pkg_dir eq "CPAN" and $lines[$idx] =~/^\d{4}-\d{2}-\d{2}/) || + ($pkg_dir eq "version" and $lines[$idx] =~/^\d\.\d+/) || + ($pkg_dir eq "Getopt-Long" and $lines[$idx] =~/Changes in version/) || + ($pkg_dir eq "ExtUtils-Install" and $lines[$idx] =~/^\d+\.\d+/) || + 0 # less commit churn if we have to tweak the heuristics above + ){ + last; + } + push @changes_info, $lines[$idx]; + + } + } + if (!@changes_info) { + die "No changes?"; + } else { + print "Changes from $changes_file\n"; + print $_,"\n" for @changes_info; + } +} + # # Find all files with an exec bit # @@ -504,15 +688,18 @@ if (@de_exec && @delete) { if (@de_exec) { my %permitted = map { (my $x = $_) =~ tr/\n//d; $x => 1 } grep !/^#/, do { local @ARGV = '../Porting/exec-bit.txt'; <> }; - @de_exec = grep !$permitted{"cpan/$pkg_dir/$_"}, @de_exec; + @de_exec = grep !$permitted{"$type_dir/$pkg_dir/$_"}, @de_exec; } +@$_ = sort @$_ for \@delete, \@commit, \@gone, \@de_exec; say "unlink $pkg_dir/$_" for @delete; say "git add $pkg_dir/$_" for @commit; say "git rm -f $pkg_dir/$_" for @gone; say "chmod a-x $pkg_dir/$_" for @de_exec; -print "Hit return to continue; ^C to abort "; ; +print "--\nWill perform the above steps and then start testing.\n"; +print "You may want to `tail -F $MAKE_LOG` in another window\n"; +pause_for_input("\n"); unlink "$pkg_dir/$_" for @delete; system git => 'add', "$pkg_dir/$_" for @commit; @@ -532,8 +719,11 @@ if ($$info {CUSTOMIZED}) { } chdir ".."; -if (@commit || @gone) { - say "Fixing MANIFEST"; +{ + # we update the MANIFEST file always now, so that we can + # ensure each file from this sync is updated to say that we + # got it from the latest version. + say "Updating the MANIFEST file"; my $MANIFEST = "MANIFEST"; my $MANIFEST_NEW = "$MANIFEST.new"; @@ -541,14 +731,37 @@ if (@commit || @gone) { or die "Failed to open $MANIFEST for reading: $!\n"; open my $new, ">", $MANIFEST_NEW or die "Failed to open $MANIFEST_NEW for writing: $!\n"; - my %gone = map +("cpan/$pkg_dir/$_" => 1), @gone; + my %keep = map +("$type_dir/$pkg_dir/$_" => 1), keys %new_files; + my %gone = map +("$type_dir/$pkg_dir/$_" => 1), @gone; while (my $line = <$orig>) { - my ($file) = $line =~ /^(\S+)/ - or die "Can't parse MANIFEST line: $line"; - print $new $line if !$gone{$file}; + chomp $line; + my ($file, $descr) = split /\t+/, $line; + if (!$file) { + die "Can't parse MANIFEST line: '$line' at line $.\n"; + } + if ($keep{$file} and !$descr) { + # make sure we have at least one tab, old versions of + # this script would add lines to MANIFEST with no tab. + $line =~ s/^(\S+)\z/$1\t\t/; + + my $file_descr = ""; + if ( $file =~ /\.t/ ) { + $file_descr = "Test file"; + } + elsif ( $file =~ /\.pm/ ) { + $file_descr = "Module"; + } + elsif ( $file =~ /\.pl/ ) { + $file_descr = "Script"; + } + $file_descr .= " related to " if $file_descr; + # and update the line to show where the file came from. + $line =~ s/(\t+).*/$1$file_descr$module/; + } + say $new $line if !$gone{$file}; } - say $new "cpan/$pkg_dir/$_" for @commit; + say $new "$type_dir/$pkg_dir/$_\t\t$pkg_dir" for @commit; close $new or die "Can't close $MANIFEST: $!\n"; @@ -558,10 +771,11 @@ if (@commit || @gone) { } -print "Running a make and saving its output to $MAKE_LOG ... "; -# Prepare for running (selected) tests -make 'test-prep'; -print "done\n"; + +# Prepare for running (selected) tests - strictly speaking this isn't +# necessary, as we run the tests with "run_make" now, but this allows +# us to separate build issues from test issues. +run_make 'test-prep' unless $no_test; # The build system installs code from CPAN dists into the lib/ directory, # creating directories as needed. This means that the cleaning-related rules @@ -588,64 +802,49 @@ if (@commit || @gone) { # Must clean up, or else t/porting/FindExt.t will fail. # Note that we can always retrieve the original directory with a git checkout. # -print "About to clean up; hit return or abort (^C) "; ; - -remove_tree( "cpan/$old_dir" ); -unlink "cpan/$new_file" unless $tarball; - -# -# Run the tests. First the test belonging to the module, followed by the -# tests in t/porting -# -chdir "t"; -say "Running module tests"; -my @test_files = grep { /\.t$/ } find_type_f( "../cpan/$pkg_dir" ); -my $exe_dir = WIN32 ? "..\\" : './'; -my $output = `${exe_dir}perl$Config{_exe} TEST @test_files`; -unless ($output =~ /All tests successful/) { - say $output; - exit 1; -} - -print "Running tests in t/porting "; -my @tests = glob 'porting/*.t'; -chomp @tests; -my @failed; -foreach my $t (@tests) { - my @not = grep {!/# TODO/ } - grep { /^not/ } - `${exe_dir}perl -I../lib -I.. $t`; - print @not ? '!' : '.'; - push @failed => $t if @not; -} -print "\n"; -say "Failed tests: @failed" if @failed; +print "About to clean up the old version, update Maintainers.pl and start tests\n"; +pause_for_input("\n"); +remove_tree( "$type_dir/$old_dir" ); +unlink "$type_dir/$new_file" unless $tarball; -chdir '..'; open my $Maintainers_pl, '<', 'Porting/Maintainers.pl'; open my $new_Maintainers_pl, '>', 'Maintainers.pl'; -my $found; +my $found = 0; my $in_mod_section; while (<$Maintainers_pl>) { - if (!$found) { - if ($in_mod_section) { - if (/DISTRIBUTION/) { - if (s/\Q$old_version/$new_version/) { - $found = 1; - } + if ($in_mod_section) { + if ($found == 1) { + # Keep track of when and who did the sync. + # This must be before the DISTRIBUTION check. + # This ensures that *something* is updated when we re-update. + my $date = localtime; + my $user = $ENV{USER} ? "$ENV{USER} on " : ""; + my $key = "SYNCINFO"; + if ( /^'([A-Z_]+)'\s+=>/ and $1 eq $key) { + s/(=>\s+)'[^']+'/$1'$user$date'/; } - - if (/^ \}/) { - $in_mod_section = 0; + else { + print $new_Maintainers_pl + " '$key' => '$user$date',\n"; } + $found = 2; + $in_mod_section = 0; } - - if (/\Q$module/) { - $in_mod_section = 1; + if (/DISTRIBUTION/) { + if (s/\Q$old_version/$new_version/) { + $found = 1; + } } + if (/^\s*\}/) { # sanity + $in_mod_section = 0; + } + } + + if (/\Q$module\E/ and !$found) { + $in_mod_section = 1; } print $new_Maintainers_pl $_; @@ -662,6 +861,28 @@ else { say "Make sure you update this by hand before committing."; } +# Run the tests. First the test belonging to the module, followed by the +# tests in t/porting + +my $shell_quote = WIN32 ? '"' : "'"; +if ($no_test) { + print "*** NOT RUNNING TESTS ***\n"; +} else { + run_make "test-harness TEST_ARGS=$shell_quote-re $pkg_dir$shell_quote"; + run_make "test-porting"; +} + +my $committed; +if (@changes_info) { + system git => 'commit', + join("\n", + "-m$type_dir/$pkg_dir - ${re_update}Update to version $new_version", + "",@changes_info), + "$type_dir/$pkg_dir", "MANIFEST", "Porting/Maintainers.pl" + or $committed = 1; # note system returns true for an error! +} + + print <<"EOF"; ======================================================================= @@ -676,11 +897,37 @@ has added an XS dependency - even if the Hopefully all will complete successfully, but if not, you can make any changes you need to get the tests to pass. Don't forget that you'll need a "CUSTOMIZED" entry in Porting/Maintainers.pl if you change any of the -files under cpan/$pkg_dir. +files under $type_dir/$pkg_dir. + +EOF + +if ($committed) { + print <<"EOF"; +The changes have already been committed. If the tests above fail you can +discard this patch with -Once all tests pass, you can "git add -u" and "git commit" the changes -with a message along the lines of "Update Foo::Bar to v1.234". + git reset --hard HEAD^. + +You may also want to review the commit message and alter it with + + git commit --amend + +Regardless you still need to push this commit upstream with something like + + git push origin HEAD:$ENV{USER}/update_${pkg_dir}_v_$new_version EOF +} else { + print <<"EOF"; +Once all tests pass, you can commit it with a command like: + + git commit -m${shell_quote}$type_dir/$pkg_dir - Update to version $new_version${shell_quote} $type_dir/$pkg_dir + +and then push it upstream with a command like + + git push origin HEAD:$ENV{USER}/update_${pkg_dir}_v_$new_version + +EOF +} __END__ Index: gnu/usr.bin/perl/Porting/test-dist-modules.pl =================================================================== RCS file: gnu/usr.bin/perl/Porting/test-dist-modules.pl diff -N gnu/usr.bin/perl/Porting/test-dist-modules.pl --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/Porting/test-dist-modules.pl 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,1307 @@ +#!perl +# this should be perl 5.8 compatible, since it will be used +# with old perls while testing dist modules on those perls +use strict; +use warnings; +use File::Temp "tempdir"; +use ExtUtils::Manifest "maniread"; +use Cwd "getcwd"; +use Getopt::Long; +use Config; + +my $continue; +my $separate; +GetOptions("c|continue" => \$continue, + "s|separate" => \$separate, + "h|help" => \&usage) + or die "Unknown options\n"; + +$|++; + +-f "Configure" + or die "Expected to be run from a perl checkout"; + +my $github_ci = $ENV{'GITHUB_SHA'} ? 1 : 0; + +my $manifest = maniread(); +my @failures = (); + +my @config; +my $install_path; +if ($separate) { + # require EU::MM 6.31 or later + my $install_base = tempdir( CLEANUP => 1 ); + push @config, "INSTALL_BASE=$install_base"; + $ENV{PERL5LIB} .= $Config{path_sep} if $ENV{PERL5LIB}; + $ENV{PERL5LIB} .= join $Config{path_sep}, + "$install_base/lib/perl5/$Config{archname}", + "$install_base/lib/perl5"; +} + +my %dist_config = ( + # these are defined by the modules as distributed on CPAN + # I don't know why their Makefile.PLs aren't in core + "threads" => [ "DEFINE=-DHAS_PPPORT_H" ], + "threads-shared" => [ "DEFINE=-DHAS_PPPORT_H" ], + ); + +my $start = getcwd() + or die "Cannot fetch current directory: $!\n"; + +# get ppport.h +my $pppdir = test_dist("Devel-PPPort"); + +if (@failures) { + if ($github_ci) { + # GitHub may show STDERR before STDOUT.. despite autoflush + # being enabled.. Make sure it detects the 'endgroup' before + # the `die` statement. + print STDERR "::endgroup::\n"; + } + die "Devel-PPPort failed, aborting other tests.\n"; +} + +my $pppfile = "$pppdir/ppport.h"; + +-f $pppfile + or die "No ppport.h found in $pppdir\n"; + +# Devel-PPPort is manually processed before anything else to ensure we +# have an up to date ppport.h +my @dists = @ARGV; +if (@dists) { + for my $dist (@dists) { + -d "dist/$dist" or die "dist/$dist not a directory\n"; + } +} +else { + opendir my $distdir, "dist" + or die "Cannot opendir 'dist': $!\n"; + @dists = sort { lc $a cmp lc $b } grep { /^\w/ && $_ ne "Devel-PPPort" } readdir $distdir; + closedir $distdir; +} + +# These may end up being included if their problems are resolved +{ + # https://github.com/Perl/version.pm claims CPAN is upstream + @dists = grep { $_ ne "version" } @dists; + + # Safe is tied pretty heavily to core + # in any case it didn't seem simple to fix + @dists = grep { $_ ne "Safe" } @dists; +} + +for my $dist (@dists) { + test_dist($dist); +} + +if (@failures) { + if ($github_ci) { + # GitHub may show STDERR before STDOUT.. despite autoflush + # being enabled.. Make sure it detects the 'endgroup' before + # the `die` statement. + print STDERR "::endgroup::\n"; + } + my $msg = join("\n", map { "\t'$_->[0]' failed at $_->[1]" } @failures); + die "Following dists had failures:\n$msg\n"; +} + +sub test_dist { + my ($name) = @_; + + print "::group::Testing $name\n" if $github_ci; + print "*** Testing $name ***\n"; + my $dir = tempdir( CLEANUP => 1); + run("cp", "-a", "dist/$name/.", "$dir/.") + or die "Cannot copy dist files to working directory\n"; + chdir $dir + or die "Cannot chdir to dist working directory '$dir': $!\n"; + if ($pppfile) { + run("cp", $pppfile, ".") + or die "Cannot copy $pppfile to .\n"; + } + if ($name eq "IO" || $name eq "threads" || $name eq "threads-shared") { + write_testpl(); + } + if ($name eq "threads" || $name eq "threads-shared") { + write_threads_h(); + } + if ($name eq "threads-shared") { + write_shared_h(); + } + unless (-f "Makefile.PL") { + print " Creating Makefile.PL for $name\n"; + my $key = "ABSTRACT_FROM"; + my @parts = split /-/, $name; + my $last = $parts[-1]; + my $module = join "::", @parts; + my $fromname; + for my $check ("$last.pm", join("/", "lib", @parts) . ".pm") { + if (-f $check) { + $fromname = $check; + last; + } + } + $fromname + or die "Cannot find ABSTRACT_FROM for $name\n"; + my $value = $fromname; + open my $fh, ">", "Makefile.PL" + or die "Cannot create Makefile.PL: $!\n"; + # adapted from make_ext.pl + printf $fh <<'EOM', $module, $fromname, $key, $value; +use strict; +use ExtUtils::MakeMaker; + +# This is what the .PL extracts to. Not the ultimate file that is installed. +# (ie Win32 runs pl2bat after this) + +# Doing this here avoids all sort of quoting issues that would come from +# attempting to write out perl source with literals to generate the arrays and +# hash. +my @temps = 'Makefile.PL'; +foreach (glob('scripts/pod*.PL')) { + # The various pod*.PL extractors change directory. Doing that with relative + # paths in @INC breaks. It seems the lesser of two evils to copy (to avoid) + # the chdir doing anything, than to attempt to convert lib paths to + # absolute, and potentially run into problems with quoting special + # characters in the path to our build dir (such as spaces) + require File::Copy; + + my $temp = $_; + $temp =~ s!scripts/!!; + File::Copy::copy($_, $temp) or die "Can't copy $temp to $_: $!"; + push @temps, $temp; +} + +my $script_ext = $^O eq 'VMS' ? '.com' : ''; +my %%pod_scripts; +foreach (glob('pod*.PL')) { + my $script = $_; + s/.PL$/$script_ext/i; + $pod_scripts{$script} = $_; +} +my @exe_files = values %%pod_scripts; + +WriteMakefile( + NAME => '%s', + VERSION_FROM => '%s', + %-13s => '%s', + realclean => { FILES => "@temps" }, + (%%pod_scripts ? ( + PL_FILES => \%%pod_scripts, + EXE_FILES => \@exe_files, + clean => { FILES => "@exe_files" }, + ) : ()), +); + +EOM + close $fh; + } + + my $verbose = $github_ci && $ENV{'RUNNER_DEBUG'} ? 1 : 0; + my $failed = ""; + my @my_config = @config; + if (my $cfg = $dist_config{$name}) { + push @my_config, @$cfg; + } + if (!run($^X, "Makefile.PL", @my_config)) { + $failed = "Makefile.PL"; + die "$name: Makefile.PL failed\n" unless $continue; + } + elsif (!run("make", "test", "TEST_VERBOSE=$verbose")) { + $failed = "make test"; + die "$name: make test failed\n" unless $continue; + } + elsif (!run("make", "install")) { + $failed = "make install"; + die "$name: make install failed\n" unless $continue; + } + + chdir $start + or die "Cannot return to $start: $!\n"; + + if ($github_ci) { + print "::endgroup::\n"; + } + if ($continue && $failed) { + print "::error ::$name failed at $failed\n" if $github_ci; + push @failures, [ $name, $failed ]; + } + + $dir; +} + +# IO, threads and threads-shared use the blead t/test.pl when tested in core +# and bundle their own test.pl when distributed on CPAN. +# The test.pl source below is from the IO distribution but so far seems sufficient +# for threads and threads-shared. +sub write_testpl { + _write_from_data("t/test.pl"); +} + +# threads and threads-shared bundle this file, which isn't needed in core +sub write_threads_h { + _write_from_data("threads.h"); +} + +# threads-shared bundles this file, which isn't needed in core +sub write_shared_h { + _write_from_data("shared.h"); +} + +# file data read from +my %file_data; + +sub _write_from_data { + my ($want_name) = @_; + + unless (keys %file_data) { + my $name; + while () { + if (/^-- (\S+) --/) { + $name = $1; + } + else { + $file_data{$name} .= $_; + } + } + close DATA; + } + + my $data = $file_data{$want_name} or die "No data found for $want_name"; + open my $fh, ">", $want_name + or die "Cannot create $want_name: $!\n"; + print $fh $data; + close $fh + or die "Cannot close $want_name: $!\n"; +} + +sub run { + my (@cmd) = @_; + + print "\$ @cmd\n"; + my $result = system(@cmd); + if ($result < 0) { + print "Failed: $!\n"; + } + elsif ($result) { + printf "Failed: %d (%#x)\n", $result, $?; + } + return $result == 0; +} + +sub usage { + print < 255) { + $y .= sprintf "\\x{%x}", $c; + } elsif ($backslash_escape{$c}) { + $y .= $backslash_escape{$c}; + } else { + my $z = chr $c; # Maybe we can get away with a literal... + $z = sprintf "\\%03o", $c if $z =~ /[[:^print:]]/; + $y .= $z; + } + } + $x = $y; + } + return $x unless wantarray; + push @result, $x; + } + return @result; +} + +sub is ($$@) { + my ($got, $expected, $name, @mess) = @_; + + my $pass; + if( !defined $got || !defined $expected ) { + # undef only matches undef + $pass = !defined $got && !defined $expected; + } + else { + $pass = $got eq $expected; + } + + unless ($pass) { + unshift(@mess, "# got "._q($got)."\n", + "# expected "._q($expected)."\n"); + } + _ok($pass, _where(), $name, @mess); +} + +sub isnt ($$@) { + my ($got, $isnt, $name, @mess) = @_; + + my $pass; + if( !defined $got || !defined $isnt ) { + # undef only matches undef + $pass = defined $got || defined $isnt; + } + else { + $pass = $got ne $isnt; + } + + unless( $pass ) { + unshift(@mess, "# it should not be "._q($got)."\n", + "# but it is.\n"); + } + _ok($pass, _where(), $name, @mess); +} + +sub cmp_ok ($$$@) { + my($got, $type, $expected, $name, @mess) = @_; + + my $pass; + { + local $^W = 0; + local($@,$!); # don't interfere with $@ + # eval() sometimes resets $! + $pass = eval "\$got $type \$expected"; + } + unless ($pass) { + # It seems Irix long doubles can have 2147483648 and 2147483648 + # that stringify to the same thing but are acutally numerically + # different. Display the numbers if $type isn't a string operator, + # and the numbers are stringwise the same. + # (all string operators have alphabetic names, so tr/a-z// is true) + # This will also show numbers for some uneeded cases, but will + # definately be helpful for things such as == and <= that fail + if ($got eq $expected and $type !~ tr/a-z//) { + unshift @mess, "# $got - $expected = " . ($got - $expected) . "\n"; + } + unshift(@mess, "# got "._q($got)."\n", + "# expected $type "._q($expected)."\n"); + } + _ok($pass, _where(), $name, @mess); +} + +# Check that $got is within $range of $expected +# if $range is 0, then check it's exact +# else if $expected is 0, then $range is an absolute value +# otherwise $range is a fractional error. +# Here $range must be numeric, >= 0 +# Non numeric ranges might be a useful future extension. (eg %) +sub within ($$$@) { + my ($got, $expected, $range, $name, @mess) = @_; + my $pass; + if (!defined $got or !defined $expected or !defined $range) { + # This is a fail, but doesn't need extra diagnostics + } elsif ($got !~ tr/0-9// or $expected !~ tr/0-9// or $range !~ tr/0-9//) { + # This is a fail + unshift @mess, "# got, expected and range must be numeric\n"; + } elsif ($range < 0) { + # This is also a fail + unshift @mess, "# range must not be negative\n"; + } elsif ($range == 0) { + # Within 0 is == + $pass = $got == $expected; + } elsif ($expected == 0) { + # If expected is 0, treat range as absolute + $pass = ($got <= $range) && ($got >= - $range); + } else { + my $diff = $got - $expected; + $pass = abs ($diff / $expected) < $range; + } + unless ($pass) { + if ($got eq $expected) { + unshift @mess, "# $got - $expected = " . ($got - $expected) . "\n"; + } + unshift@mess, "# got "._q($got)."\n", + "# expected "._q($expected)." (within "._q($range).")\n"; + } + _ok($pass, _where(), $name, @mess); +} + +# Note: this isn't quite as fancy as Test::More::like(). + +sub like ($$@) { like_yn (0,@_) }; # 0 for - +sub unlike ($$@) { like_yn (1,@_) }; # 1 for un- + +sub like_yn ($$$@) { + my ($flip, $got, $expected, $name, @mess) = @_; + my $pass; + $pass = $got =~ /$expected/ if !$flip; + $pass = $got !~ /$expected/ if $flip; + unless ($pass) { + unshift(@mess, "# got '$got'\n", + $flip + ? "# expected !~ /$expected/\n" : "# expected /$expected/\n"); + } + local $Level = $Level + 1; + _ok($pass, _where(), $name, @mess); +} + +sub pass { + _ok(1, '', @_); +} + +sub fail { + _ok(0, _where(), @_); +} + +sub curr_test { + $test = shift if @_; + return $test; +} + +sub next_test { + my $retval = $test; + $test = $test + 1; # don't use ++ + $retval; +} + +# Note: can't pass multipart messages since we try to +# be compatible with Test::More::skip(). +sub skip { + my $why = shift; + my $n = @_ ? shift : 1; + for (1..$n) { + _print "ok $test # skip $why\n"; + $test = $test + 1; + } + local $^W = 0; + last SKIP; +} + +sub todo_skip { + my $why = shift; + my $n = @_ ? shift : 1; + + for (1..$n) { + _print "not ok $test # TODO & SKIP $why\n"; + $test = $test + 1; + } + local $^W = 0; + last TODO; +} + +sub eq_array { + my ($ra, $rb) = @_; + return 0 unless $#$ra == $#$rb; + for my $i (0..$#$ra) { + next if !defined $ra->[$i] && !defined $rb->[$i]; + return 0 if !defined $ra->[$i]; + return 0 if !defined $rb->[$i]; + return 0 unless $ra->[$i] eq $rb->[$i]; + } + return 1; +} + +sub eq_hash { + my ($orig, $suspect) = @_; + my $fail; + while (my ($key, $value) = each %$suspect) { + # Force a hash recompute if this perl's internals can cache the hash key. + $key = "" . $key; + if (exists $orig->{$key}) { + if ($orig->{$key} ne $value) { + _print "# key ", _qq($key), " was ", _qq($orig->{$key}), + " now ", _qq($value), "\n"; + $fail = 1; + } + } else { + _print "# key ", _qq($key), " is ", _qq($value), + ", not in original.\n"; + $fail = 1; + } + } + foreach (keys %$orig) { + # Force a hash recompute if this perl's internals can cache the hash key. + $_ = "" . $_; + next if (exists $suspect->{$_}); + _print "# key ", _qq($_), " was ", _qq($orig->{$_}), " now missing.\n"; + $fail = 1; + } + !$fail; +} + +sub require_ok ($) { + my ($require) = @_; + eval < [ command-line switches ] +# nolib => 1 # don't use -I../lib (included by default) +# prog => one-liner (avoid quotes) +# progs => [ multi-liner (avoid quotes) ] +# progfile => perl script +# stdin => string to feed the stdin +# stderr => redirect stderr to stdout +# args => [ command-line arguments to the perl program ] +# verbose => print the command line + +my $is_mswin = $^O eq 'MSWin32'; +my $is_netware = $^O eq 'NetWare'; +my $is_macos = $^O eq 'MacOS'; +my $is_vms = $^O eq 'VMS'; +my $is_cygwin = $^O eq 'cygwin'; + +sub _quote_args { + my ($runperl, $args) = @_; + + foreach (@$args) { + # In VMS protect with doublequotes because otherwise + # DCL will lowercase -- unless already doublequoted. + $_ = q(").$_.q(") if $is_vms && !/^\"/ && length($_) > 0; + $$runperl .= ' ' . $_; + } +} + +sub _create_runperl { # Create the string to qx in runperl(). + my %args = @_; + my $runperl = which_perl(); + if ($runperl =~ m/\s/) { + $runperl = qq{"$runperl"}; + } + #- this allows, for example, to set PERL_RUNPERL_DEBUG=/usr/bin/valgrind + if ($ENV{PERL_RUNPERL_DEBUG}) { + $runperl = "$ENV{PERL_RUNPERL_DEBUG} $runperl"; + } + unless ($args{nolib}) { + if ($is_macos) { + $runperl .= ' -I::lib'; + # Use UNIX style error messages instead of MPW style. + $runperl .= ' -MMac::err=unix' if $args{stderr}; + } + else { + $runperl .= ' "-I../lib"'; # doublequotes because of VMS + } + } + if ($args{switches}) { + local $Level = 2; + die "test.pl:runperl(): 'switches' must be an ARRAYREF " . _where() + unless ref $args{switches} eq "ARRAY"; + _quote_args(\$runperl, $args{switches}); + } + if (defined $args{prog}) { + die "test.pl:runperl(): both 'prog' and 'progs' cannot be used " . _where() + if defined $args{progs}; + $args{progs} = [$args{prog}] + } + if (defined $args{progs}) { + die "test.pl:runperl(): 'progs' must be an ARRAYREF " . _where() + unless ref $args{progs} eq "ARRAY"; + foreach my $prog (@{$args{progs}}) { + if ($is_mswin || $is_netware || $is_vms) { + $runperl .= qq ( -e "$prog" ); + } + else { + $runperl .= qq ( -e '$prog' ); + } + } + } elsif (defined $args{progfile}) { + $runperl .= qq( "$args{progfile}"); + } else { + # You probaby didn't want to be sucking in from the upstream stdin + die "test.pl:runperl(): none of prog, progs, progfile, args, " + . " switches or stdin specified" + unless defined $args{args} or defined $args{switches} + or defined $args{stdin}; + } + if (defined $args{stdin}) { + # so we don't try to put literal newlines and crs onto the + # command line. + $args{stdin} =~ s/\n/\\n/g; + $args{stdin} =~ s/\r/\\r/g; + + if ($is_mswin || $is_netware || $is_vms) { + $runperl = qq{$Perl -e "print qq(} . + $args{stdin} . q{)" | } . $runperl; + } + elsif ($is_macos) { + # MacOS can only do two processes under MPW at once; + # the test itself is one; we can't do two more, so + # write to temp file + my $stdin = qq{$Perl -e 'print qq(} . $args{stdin} . qq{)' > teststdin; }; + if ($args{verbose}) { + my $stdindisplay = $stdin; + $stdindisplay =~ s/\n/\n\#/g; + _print_stderr "# $stdindisplay\n"; + } + `$stdin`; + $runperl .= q{ < teststdin }; + } + else { + $runperl = qq{$Perl -e 'print qq(} . + $args{stdin} . q{)' | } . $runperl; + } + } + if (defined $args{args}) { + _quote_args(\$runperl, $args{args}); + } + $runperl .= ' 2>&1' if $args{stderr} && !$is_macos; + $runperl .= " \xB3 Dev:Null" if !$args{stderr} && $is_macos; + if ($args{verbose}) { + my $runperldisplay = $runperl; + $runperldisplay =~ s/\n/\n\#/g; + _print_stderr "# $runperldisplay\n"; + } + return $runperl; +} + +sub runperl { + die "test.pl:runperl() does not take a hashref" + if ref $_[0] and ref $_[0] eq 'HASH'; + my $runperl = &_create_runperl; + my $result; + + my $tainted = ${^TAINT}; + my %args = @_; + exists $args{switches} && grep m/^-T$/, @{$args{switches}} and $tainted = $tainted + 1; + + if ($tainted) { + # We will assume that if you're running under -T, you really mean to + # run a fresh perl, so we'll brute force launder everything for you + my $sep; + + if (! eval 'require Config; 1') { + warn "test.pl had problems loading Config: $@"; + $sep = ':'; + } else { + $sep = $Config::Config{path_sep}; + } + + my @keys = grep {exists $ENV{$_}} qw(CDPATH IFS ENV BASH_ENV); + local @ENV{@keys} = (); + # Untaint, plus take out . and empty string: + local $ENV{'DCL$PATH'} = $1 if $is_vms && ($ENV{'DCL$PATH'} =~ /(.*)/s); + $ENV{PATH} =~ /(.*)/s; + local $ENV{PATH} = + join $sep, grep { $_ ne "" and $_ ne "." and -d $_ and + ($is_mswin or $is_vms or !(stat && (stat _)[2]&0022)) } + split quotemeta ($sep), $1; + $ENV{PATH} .= "$sep/bin" if $is_cygwin; # Must have /bin under Cygwin + + $runperl =~ /(.*)/s; + $runperl = $1; + + $result = `$runperl`; + } else { + $result = `$runperl`; + } + $result =~ s/\n\n/\n/ if $is_vms; # XXX pipes sometimes double these + return $result; +} + +*run_perl = \&runperl; # Nice alias. + +sub DIE { + _print_stderr "# @_\n"; + exit 1; +} + +# A somewhat safer version of the sometimes wrong $^X. +sub which_perl { + unless (defined $Perl) { + $Perl = $^X; + + # VMS should have 'perl' aliased properly + return $Perl if $^O eq 'VMS'; + + my $exe; + if (! eval 'require Config; 1') { + warn "test.pl had problems loading Config: $@"; + $exe = ''; + } else { + $exe = $Config::Config{_exe}; + } + $exe = '' unless defined $exe; + + # This doesn't absolutize the path: beware of future chdirs(). + # We could do File::Spec->abs2rel() but that does getcwd()s, + # which is a bit heavyweight to do here. + + if ($Perl =~ /^perl\Q$exe\E$/i) { + my $perl = "perl$exe"; + if (! eval 'require File::Spec; 1') { + warn "test.pl had problems loading File::Spec: $@"; + $Perl = "./$perl"; + } else { + $Perl = File::Spec->catfile(File::Spec->curdir(), $perl); + } + } + + # Build up the name of the executable file from the name of + # the command. + + if ($Perl !~ /\Q$exe\E$/i) { + $Perl .= $exe; + } + + warn "which_perl: cannot find $Perl from $^X" unless -f $Perl; + + # For subcommands to use. + $ENV{PERLEXE} = $Perl; + } + return $Perl; +} + +sub unlink_all { + foreach my $file (@_) { + 1 while unlink $file; + _print_stderr "# Couldn't unlink '$file': $!\n" if -f $file; + } +} + +my %tmpfiles; +END { unlink_all keys %tmpfiles } + +# A regexp that matches the tempfile names +$::tempfile_regexp = 'tmp\d+[A-Z][A-Z]?'; + +# Avoid ++, avoid ranges, avoid split // +my @letters = qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z); +sub tempfile { + my $count = 0; + do { + my $temp = $count; + my $try = "tmp$$"; + do { + $try .= $letters[$temp % 26]; + $temp = int ($temp / 26); + } while $temp; + # Need to note all the file names we allocated, as a second request may + # come before the first is created. + if (!-e $try && !$tmpfiles{$try}) { + # We have a winner + $tmpfiles{$try}++; + return $try; + } + $count = $count + 1; + } while $count < 26 * 26; + die "Can't find temporary file name starting 'tmp$$'"; +} + +# This is the temporary file for _fresh_perl +my $tmpfile = tempfile(); + +# +# _fresh_perl +# +# The $resolve must be a subref that tests the first argument +# for success, or returns the definition of success (e.g. the +# expected scalar) if given no arguments. +# + +sub _fresh_perl { + my($prog, $resolve, $runperl_args, $name) = @_; + + $runperl_args ||= {}; + $runperl_args->{progfile} = $tmpfile; + $runperl_args->{stderr} = 1; + + open TEST, ">$tmpfile" or die "Cannot open $tmpfile: $!"; + + # VMS adjustments + if( $^O eq 'VMS' ) { + $prog =~ s#/dev/null#NL:#; + + # VMS file locking + $prog =~ s{if \(-e _ and -f _ and -r _\)} + {if (-e _ and -f _)} + } + + print TEST $prog; + close TEST or die "Cannot close $tmpfile: $!"; + + my $results = runperl(%$runperl_args); + my $status = $?; + + # Clean up the results into something a bit more predictable. + $results =~ s/\n+$//; + $results =~ s/at\s+$::tempfile_regexp\s+line/at - line/g; + $results =~ s/of\s+$::tempfile_regexp\s+aborted/of - aborted/g; + + # bison says 'parse error' instead of 'syntax error', + # various yaccs may or may not capitalize 'syntax'. + $results =~ s/^(syntax|parse) error/syntax error/mig; + + if ($^O eq 'VMS') { + # some tests will trigger VMS messages that won't be expected + $results =~ s/\n?%[A-Z]+-[SIWEF]-[A-Z]+,.*//; + + # pipes double these sometimes + $results =~ s/\n\n/\n/g; + } + + my $pass = $resolve->($results); + unless ($pass) { + _diag "# PROG: \n$prog\n"; + _diag "# EXPECTED:\n", $resolve->(), "\n"; + _diag "# GOT:\n$results\n"; + _diag "# STATUS: $status\n"; + } + + # Use the first line of the program as a name if none was given + unless( $name ) { + ($first_line, $name) = $prog =~ /^((.{1,50}).*)/; + $name .= '...' if length $first_line > length $name; + } + + _ok($pass, _where(), "fresh_perl - $name"); +} + +# +# fresh_perl_is +# +# Combination of run_perl() and is(). +# + +sub fresh_perl_is { + my($prog, $expected, $runperl_args, $name) = @_; + local $Level = 2; + _fresh_perl($prog, + sub { @_ ? $_[0] eq $expected : $expected }, + $runperl_args, $name); +} + +# +# fresh_perl_like +# +# Combination of run_perl() and like(). +# + +sub fresh_perl_like { + my($prog, $expected, $runperl_args, $name) = @_; + local $Level = 2; + _fresh_perl($prog, + sub { @_ ? + $_[0] =~ (ref $expected ? $expected : /$expected/) : + $expected }, + $runperl_args, $name); +} + +sub can_ok ($@) { + my($proto, @methods) = @_; + my $class = ref $proto || $proto; + + unless( @methods ) { + return _ok( 0, _where(), "$class->can(...)" ); + } + + my @nok = (); + foreach my $method (@methods) { + local($!, $@); # don't interfere with caller's $@ + # eval sometimes resets $! + eval { $proto->can($method) } || push @nok, $method; + } + + my $name; + $name = @methods == 1 ? "$class->can('$methods[0]')" + : "$class->can(...)"; + + _ok( !@nok, _where(), $name ); +} + +sub isa_ok ($$;$) { + my($object, $class, $obj_name) = @_; + + my $diag; + $obj_name = 'The object' unless defined $obj_name; + my $name = "$obj_name isa $class"; + if( !defined $object ) { + $diag = "$obj_name isn't defined"; + } + elsif( !ref $object ) { + $diag = "$obj_name isn't a reference"; + } + else { + # We can't use UNIVERSAL::isa because we want to honor isa() overrides + local($@, $!); # eval sometimes resets $! + my $rslt = eval { $object->isa($class) }; + if( $@ ) { + if( $@ =~ /^Can't call method "isa" on unblessed reference/ ) { + if( !UNIVERSAL::isa($object, $class) ) { + my $ref = ref $object; + $diag = "$obj_name isn't a '$class' it's a '$ref'"; + } + } else { + die <isa on your object and got some weird error. +This should never happen. Please contact the author immediately. +Here's the error. +$@ +WHOA + } + } + elsif( !$rslt ) { + my $ref = ref $object; + $diag = "$obj_name isn't a '$class' it's a '$ref'"; + } + } + + _ok( !$diag, _where(), $name ); +} + +# Set a watchdog to timeout the entire test file +# NOTE: If the test file uses 'threads', then call the watchdog() function +# _AFTER_ the 'threads' module is loaded. +sub watchdog ($) +{ + my $timeout = shift; + my $timeout_msg = 'Test process timed out - terminating'; + + my $pid_to_kill = $$; # PID for this process + + # Don't use a watchdog process if 'threads' is loaded - + # use a watchdog thread instead + if (! $threads::threads) { + + # On Windows and VMS, try launching a watchdog process + # using system(1, ...) (see perlport.pod) + if (($^O eq 'MSWin32') || ($^O eq 'VMS')) { + # On Windows, try to get the 'real' PID + if ($^O eq 'MSWin32') { + eval { require Win32; }; + if (defined(&Win32::GetCurrentProcessId)) { + $pid_to_kill = Win32::GetCurrentProcessId(); + } + } + + # If we still have a fake PID, we can't use this method at all + return if ($pid_to_kill <= 0); + + # Launch watchdog process + my $watchdog; + eval { + local $SIG{'__WARN__'} = sub { + _diag("Watchdog warning: $_[0]"); + }; + my $sig = $^O eq 'VMS' ? 'TERM' : 'KILL'; + $watchdog = system(1, which_perl(), '-e', + "sleep($timeout);" . + "warn('# $timeout_msg\n');" . + "kill($sig, $pid_to_kill);"); + }; + if ($@ || ($watchdog <= 0)) { + _diag('Failed to start watchdog'); + _diag($@) if $@; + undef($watchdog); + return; + } + + # Add END block to parent to terminate and + # clean up watchdog process + eval "END { local \$! = 0; local \$? = 0; + wait() if kill('KILL', $watchdog); };"; + return; + } + + # Try using fork() to generate a watchdog process + my $watchdog; + eval { $watchdog = fork() }; + if (defined($watchdog)) { + if ($watchdog) { # Parent process + # Add END block to parent to terminate and + # clean up watchdog process + eval "END { local \$! = 0; local \$? = 0; + wait() if kill('KILL', $watchdog); };"; + return; + } + + ### Watchdog process code + + # Load POSIX if available + eval { require POSIX; }; + + # Execute the timeout + sleep($timeout - 2) if ($timeout > 2); # Workaround for perlbug #49073 + sleep(2); + + # Kill test process if still running + if (kill(0, $pid_to_kill)) { + _diag($timeout_msg); + kill('KILL', $pid_to_kill); + } + + # Don't execute END block (added at beginning of this file) + $NO_ENDING = 1; + + # Terminate ourself (i.e., the watchdog) + POSIX::_exit(1) if (defined(&POSIX::_exit)); + exit(1); + } + + # fork() failed - fall through and try using a thread + } + + # Use a watchdog thread because either 'threads' is loaded, + # or fork() failed + if (eval 'require threads; 1') { + threads->create(sub { + # Load POSIX if available + eval { require POSIX; }; + + # Execute the timeout + my $time_left = $timeout; + do { + $time_left -= sleep($time_left); + } while ($time_left > 0); + + # Kill the parent (and ourself) + select(STDERR); $| = 1; + _diag($timeout_msg); + POSIX::_exit(1) if (defined(&POSIX::_exit)); + my $sig = $^O eq 'VMS' ? 'TERM' : 'KILL'; + kill($sig, $pid_to_kill); + })->detach(); + return; + } + + # If everything above fails, then just use an alarm timeout + if (eval { alarm($timeout); 1; }) { + # Load POSIX if available + eval { require POSIX; }; + + # Alarm handler will do the actual 'killing' + $SIG{'ALRM'} = sub { + select(STDERR); $| = 1; + _diag($timeout_msg); + POSIX::_exit(1) if (defined(&POSIX::_exit)); + my $sig = $^O eq 'VMS' ? 'TERM' : 'KILL'; + kill($sig, $pid_to_kill); + }; + } +} + +1; +-- threads.h -- +#ifndef _THREADS_H_ +#define _THREADS_H_ + +/* Needed for 5.8.0 */ +#ifndef CLONEf_JOIN_IN +# define CLONEf_JOIN_IN 8 +#endif +#ifndef SAVEBOOL +# define SAVEBOOL(a) +#endif + +/* Added in 5.11.x */ +#ifndef G_WANT +# define G_WANT (128|1) +#endif + +/* Added in 5.24.x */ +#ifndef PERL_TSA_RELEASE +# define PERL_TSA_RELEASE(x) +#endif +#ifndef PERL_TSA_EXCLUDES +# define PERL_TSA_EXCLUDES(x) +#endif +#ifndef CLANG_DIAG_IGNORE +# define CLANG_DIAG_IGNORE(x) +#endif +#ifndef CLANG_DIAG_RESTORE +# define CLANG_DIAG_RESTORE +#endif + +/* Added in 5.38 */ +#ifndef PERL_SRAND_OVERRIDE_NEXT_PARENT +# define PERL_SRAND_OVERRIDE_NEXT_PARENT() +#endif + +#endif +-- shared.h -- +#ifndef _SHARED_H_ +#define _SHARED_H_ + +#include "ppport.h" + +#ifndef HvNAME_get +# define HvNAME_get(hv) (0 + ((XPVHV*)SvANY(hv))->xhv_name) +#endif + +#endif Index: gnu/usr.bin/perl/Porting/todo.pod =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/todo.pod,v diff -u -p -a -u -p -r1.12 todo.pod --- gnu/usr.bin/perl/Porting/todo.pod 23 Dec 2023 21:02:20 -0000 1.12 +++ gnu/usr.bin/perl/Porting/todo.pod 21 Feb 2024 15:47:00 -0000 @@ -137,7 +137,7 @@ for example POSIX passes Exporter some v =head2 makedef.pl and conditional compilation -The script F that generates the list of exported symbols on +The script F generates the list of exported symbols on platforms which need this. Functions are declared in F, variables in F. Quite a few of the functions and variables are conditionally declared there, using C<#ifdef>. However, F doesn't understand the @@ -486,7 +486,7 @@ Natively 64-bit systems need neither -Du On these systems, it might be the default compilation mode, and there is currently no guarantee that passing no use64bitall option to the Configure process will build a 32bit perl. Implementing -Duse32bit* -options would be nice for perl 5.36.3. +options would be nice for a future version. =head2 Profile Perl - am I hot or not? @@ -1183,7 +1183,7 @@ L "author_name", - "aN" => "author_name_mm", - "ae" => "author_email", - "aE" => "author_email_mm", - "cn" => "committer_name", - "cN" => "committer_name_mm", - "ce" => "committer_email", - "cE" => "committer_email_mm", - "H" => "commit_hash", - "h" => "abbrev_hash", - "s" => "commit_subject", +my @OPTSPEC= qw( + help|? + man + authors_file=s + mailmap_file=s + + validate|tap + verbose+ + exclude_missing|exclude + exclude_contrib=s@ + exclude_me + dump_opts + + show_rank|rank + show_applied|thanks_applied|applied + show_stats|stats + show_who|who + show_files|files + show_file_changes|activity + show_file_chainsaw|chainsaw + + as_percentage|percentage + as_cumulative|cumulative + as_list|old_style + + in_reverse|reverse + with_rank_numbers|numbered|num + + from_commit|from=s + to_commit|to=s + + numstat + no_update + + change_name_for_name|change_name=s% + change_name_for_email=s% + change_email_for_name=s% + change_email_for_email|change_email=s% ); -my @field_codes= sort keys %field_spec; -my @field_names= map { $field_spec{$_} } @field_codes; -my $tformat= join "%x00", map { "%" . $_ } @field_codes; - -sub _make_name_author_info { - my ($author_info, $commit_info, $name_key)= @_; - (my $email_key= $name_key) =~ s/name/email/; - my $email= $commit_info->{$email_key}; - my $name= $commit_info->{$name_key}; - - my $line= $author_info->{"email2line"}{$email} - // $author_info->{"name2line"}{$name}; - - $line //= sprintf "%-31s<%s>", - $commit_info->{$name_key}, $commit_info->{$email_key}; - return $line; -} +my %implies_numstat= ( + show_files => 1, + show_file_changes => 1, + show_file_chainsaw => 1, +); -sub _make_name_simple { - my ($commit_info, $key)= @_; - my $name_key= $key . "_name"; - my $email_key= $key . "_email"; - return sprintf "%s <%s>", $commit_info->{$name_key}, - lc($commit_info->{$email_key}); -} +sub main { + local $Data::Dumper::Sortkeys= 1; + my %opts= ( + authors_file => "AUTHORS", + mailmap_file => ".mailmap", + exclude_file => "Porting/exclude_contrib.txt", + from => "", + to => "", + exclude_contrib => [], + ); -sub read_commit_log { - my ($author_info, $mailmap_info)= @_; - $author_info ||= {}; - open my $fh, qq(git log --pretty='tformat:$tformat' |); - - while (defined(my $line= <$fh>)) { - chomp $line; - $line= decode_utf8($line); - my $commit_info= {}; - @{$commit_info}{@field_names}= split /\0/, $line, 0 + @field_names; - - my $author_name_mm= _make_name_author_info($author_info, $commit_info, - "author_name_mm"); - - my $committer_name_mm= - _make_name_author_info($author_info, $commit_info, - "committer_name_mm"); - - my $author_name_real= _make_name_simple($commit_info, "author"); - - my $committer_name_real= _make_name_simple($commit_info, "committer"); - - _check_name_mailmap( - $mailmap_info, $author_name_mm, $author_name_real, - $commit_info, "author name" - ); - _check_name_mailmap($mailmap_info, $committer_name_mm, - $committer_name_real, $commit_info, "committer name"); + ## Parse options and print usage if there is a syntax error, + ## or if usage was explicitly requested. + GetOptions( + \%opts, + map { + # support hyphens as well as underbars, + # underbars must be first. Only handles two + # part words right now. + ref $_ ? $_ : s/\b([a-z]+)_([a-z]+)\b/${1}_${2}|${1}-${2}/gr + } @OPTSPEC, + ) or pod2usage(2); + $opts{commit_range}= join " ", @ARGV; + if (!$opts{commit_range}) { + if ($opts{from_commit}) { + $opts{to_commit} ||= "HEAD"; + $opts{$_} =~ s/\.+\z// for qw(from_commit to_commit); + $opts{commit_range}= "$opts{from_commit}..$opts{to_commit}"; + } + } + pod2usage(1) if $opts{help}; + pod2usage(-verbose => 2) if $opts{man}; + + foreach my $opt (keys %opts) { + $opts{numstat}++ if $implies_numstat{$opt}; + $opts{no_update}++ if $opt =~ /^show_/ or $opt eq "validate"; + } + + if (delete $opts{exclude_me}) { + my ($author_full)= + Porting::updateAUTHORS->current_author_name_email("full"); + my ($committer_full)= + Porting::updateAUTHORS->current_committer_name_email("full"); + + push @{ $opts{exclude_contrib} }, $author_full + if $author_full; + push @{ $opts{exclude_contrib} }, $committer_full + if $committer_full + and (!$author_full + or $committer_full ne $author_full); + } + + my $self= Porting::updateAUTHORS->new(%opts); + + my $changed= $self->read_and_update(); + + if ($self->{validate}) { + for my $file_type (qw(authors_file mailmap_file exclude_file)) { + my $file= $self->{$file_type}; + my $changes= $self->changed_file($file); + ok(!$changes, "Is $file_type '$file' up to date?") + or diag $self->_diff_diag($file); + } + my $dupe_info= $self->dupe_info(); + ok(!$dupe_info, "No dupes in AUTHORS") + or diag $dupe_info; + + ok( + !$self->{missing_author}{$_}, + sprintf "%s is listed in AUTHORS", + _clean_name($_)) for sort keys %{ $self->{missing_author} || {} }; + + SKIP: { + # What is tested in this block: + # - check if there uncommitted changes in the git-tree + # - if so: is the (configured) author a known contributor? + + skip "AUTOMATED_TESTING is set" if ($ENV{AUTOMATED_TESTING}); + + # Test::Smoke leaves some files in the build dir which causes + # this code to (correctly) conclude that there are uncommitted + # files which then proceeds to check the author name/email. + # + # On several smokers: + # - there is *no* git config; + # - a different name/address is configured then the one listed + # in AUTHORS; + # which causes the test to fail. + # + # Unfortunately Test::Smoke doesn't set the AUTOMATED_TESTING + # env-var.. Therefor check if mktest.out exist, it's one of the + # first files Test::Smoke creates in the build directory. + skip "Test::Smoke running" if (-e "./mktest.out"); + + my $uncommitted_files= $self->git_status_porcelain; + if ($uncommitted_files) { + my ($author_name, $author_email)= + $self->current_author_name_email(); + my ($committer_name, $committer_email)= + $self->current_committer_name_email(); + + ok($author_name && $author_email, + "git knows your author name and email."); + ok( + $committer_name && $committer_email, + "git knows your committer name and email." + ); + + my $author_known= + $self->known_contributor($author_name, $author_email); + my $committer_known= + $self->known_contributor($committer_name, $committer_email); + if ( + is( + $author_known && $committer_known, + 1, "Uncommitted changes are by a known contributor?" + )) + { + diag + "Testing uncommtted changes! Remember to commit before you push!" + if $ENV{TEST_VERBOSE}; + } + else { + diag error_advice_for_uncommitted_changes( + $author_name, $author_email, + $committer_name, $committer_email, + $uncommitted_files + ); + } + } + else { + # this will always pass... but it adds test output that is helpful + ok(!$uncommitted_files, + "git status --porcelain should be empty"); + } + } - $author_info->{"lines"}{$author_name_mm}++; - $author_info->{"lines"}{$committer_name_mm}++; + diag "\nFiles need updating! You probably just need to run\n\n", + " Porting/updateAUTHORS.pl\n\n", "and commit the results." + if $self->changed_count; + done_testing(); + return 0; } - return $author_info; -} - -sub read_authors { - my ($authors_file)= @_; - $authors_file ||= "AUTHORS"; - - my @authors_preamble; - open my $in_fh, "<", $authors_file - or die "Failed to open for read '$authors_file': $!"; - while (defined(my $line= <$in_fh>)) { - chomp $line; - push @authors_preamble, $line; - if ($line =~ /^--/) { - last; - } + elsif ($self->{show_rank}) { + $self->report_stats("who_stats", "author"); + return 0; } - my %author_info; - while (defined(my $line= <$in_fh>)) { - chomp $line; - $line= decode_utf8($line); - my ($name, $email); - my $copy= $line; - $copy =~ s/\s+\z//; - if ($copy =~ s/<([^<>]*)>//) { - $email= $1; - } - elsif ($copy =~ s/\s+(\@\w+)\z//) { - $email= $1; - } - $copy =~ s/\s+\z//; - $name= $copy; - $email //= "unknown"; - $email= lc($email); - - $author_info{"lines"}{$line}++; - $author_info{"email2line"}{$email}= $line - if $email and $email ne "unknown"; - $author_info{"name2line"}{$name}= $line - if $name and $name ne "unknown"; - $author_info{"email2name"}{ lc($email) }= $name - if $email - and $name - and $email ne "unknown"; - $author_info{"name2email"}{$name}= $email - if $name and $name ne "unknown"; - } - close $in_fh - or die "Failed to close '$authors_file': $!"; - return (\%author_info, \@authors_preamble); -} - -sub update_authors { - my ($author_info, $authors_preamble, $authors_file)= @_; - $authors_file ||= "AUTHORS"; - my $authors_file_new= $authors_file . ".new"; - open my $out_fh, ">", $authors_file_new - or die "Failed to open for write '$authors_file_new': $!"; - binmode $out_fh; - foreach my $line (@$authors_preamble) { - print $out_fh encode_utf8($line), "\n" - or die "Failed to print to '$authors_file_new': $!"; - } - foreach my $author (_sorted_hash_keys($author_info->{"lines"})) { - next if $author =~ /^unknown/; - if ($author =~ s/\s*\z//) { - next if $author =~ /^\w+$/; - } - print $out_fh encode_utf8($author), "\n" - or die "Failed to print to '$authors_file_new': $!"; + elsif ($self->{show_applied}) { + $self->report_stats("who_stats", "applied"); + return 0; + } + elsif ($self->{show_stats}) { + my @fields= ("author", "applied", "committer"); + push @fields, + ("num_files", "lines_added", "lines_removed", "lines_delta") + if $self->{numstat}; + $self->report_stats("who_stats", @fields); + return 0; + } + elsif ($self->{show_files}) { + $self->report_stats( + "file_stats", "commits", "lines_added", "lines_removed", + "lines_delta", "binary_change" + ); + return 0; } - close $out_fh - or die "Failed to close '$authors_file_new': $!"; - rename $authors_file_new, $authors_file - or die "Failed to rename '$authors_file_new' to '$authors_file':$!"; - return 1; # ok + elsif ($self->{show_file_changes}) { + $self->report_stats( + "file_stats", "lines_delta", "lines_added", "lines_removed", + "commits" + ); + return 0; + } + elsif ($self->{show_file_chainsaw}) { + $self->{in_reverse}= !$self->{in_reverse}; + $self->report_stats( + "file_stats", "lines_delta", "lines_added", "lines_removed", + "commits" + ); + return 0; + } + elsif ($self->{show_who}) { + $self->print_who(); + return 0; + } + return $changed; # 0 means nothing changed } -sub read_mailmap { - my ($mailmap_file)= @_; - $mailmap_file ||= ".mailmap"; - - open my $in, "<", $mailmap_file - or die "Failed to read '$mailmap_file': $!"; - my %mailmap_hash; - my @mailmap_preamble; - my $line_num= 0; - while (defined(my $line= <$in>)) { - ++$line_num; - next unless $line =~ /\S/; - chomp($line); - $line= decode_utf8($line); - if ($line =~ /^#/) { - if (!keys %mailmap_hash) { - push @mailmap_preamble, $line; - } - else { - die encode_utf8 "Not expecting comments after header ", - "finished at line $line_num!\nLine: $line\n"; - } - } - else { - $mailmap_hash{$line}= $line_num; - } +exit(main()) unless caller; + +sub error_advice_for_uncommitted_changes { + my ( + $author_name, $author_email, $committer_name, + $committer_email, $uncommitted_files + )= @_; + $_ //= "" + for $author_name, $author_email, $committer_name, $committer_email; + my $extra= ""; + my @git_env_keys= + map { /^GIT_(AUTHOR|COMMITTER)_(NAME|EMAIL)\z/ ? "$_='$ENV{$_}'" : () } + sort keys %ENV; + if (@git_env_keys) { + $extra .= "\n" . wrap "", "", + "Its seems that your environment has " + . join(", ", @git_env_keys) + . " defined. This may cause this test to fail.\n\n"; } - close $in; - return \%mailmap_hash, \@mailmap_preamble; -} -# this can be used to extract data from the checkAUTHORS data -sub merge_mailmap_with_AUTHORS_and_checkAUTHORS_data { - my ($mailmap_hash, $author_info)= @_; - require 'Porting/checkAUTHORS.pl' or die "No authors?"; - my ($map, $preferred_email_or_github)= - Porting::checkAUTHORS::generate_known_author_map(); - - foreach my $old (sort keys %$preferred_email_or_github) { - my $new= $preferred_email_or_github->{$old}; - next if $old !~ /\@/ or $new !~ /\@/ or $new eq $old; - my $name= $author_info->{"email2name"}{$new}; - if ($name) { - my $line= "$name <$new> <$old>"; - $mailmap_hash->{$line}++; - } + my $quote= $^O =~ /Win/ ? '"' : "'"; + my @config= map decode_utf8($_), + `git config --get-regexp $quote^(user|author|committer).(name|email)$quote`; + if (@config) { + + $extra .= + "\nYou have configured the following relevant git config settings:\n\n" + . join("", + map { sprintf " %-16s = %s", split /\s+/, $_, 2 } @config) + . "\n"; + } + else { + $extra .= + "\nYou do not have any git user config set up, consider using\n\n" + . " git config user.name 'Your Name'\n" + . " git config user.email 'your\@email.com'\n\n"; } - return 1; # ok -} -sub _sorted_hash_keys { - my ($hash)= @_; - my @sorted= sort { lc($a) cmp lc($b) || $a cmp $b } keys %$hash; - return @sorted; -} + my $props= ""; + if ( $author_name ne $committer_name + or $author_email ne $committer_email) + { + $props .= <", $mailmap_file_new - or die "Failed to write '$mailmap_file_new':$!"; - binmode $out; - foreach my $line (@$mailmap_preamble, _sorted_hash_keys($mailmap_hash),) { - print $out encode_utf8($line), "\n" - or die "Failed to print to '$mailmap_file': $!"; - } - close $out; - rename $mailmap_file_new, $mailmap_file - or die "Failed to rename '$mailmap_file_new' to '$mailmap_file':$!"; - return 1; # ok -} + Author Name = $author_name + Author Email = $author_email + Committer Name = $committer_name + Committer Email = $committer_email +EOF_PROPS -sub parse_mailmap_hash { - my ($mailmap_hash)= @_; - my @recs; - foreach my $line (sort keys %$mailmap_hash) { - my $line_num= $mailmap_hash->{$line}; - $line =~ /^ \s* (?: ( [^<>]*? ) \s+ )? <([^<>]*)> - (?: \s+ (?: ( [^<>]*? ) \s+ )? <([^<>]*)> )? \s* \z /x - or die encode_utf8 "Failed to parse line num $line_num: '$line'"; - if (!$1 or !$2) { - die encode_utf8 "Both preferred name and email are mandatory ", - "in line num $line_num: '$line'"; - } + $extra .= <{$root_key}{$key} //= $val; - my $prev= $hash->{$root_key}{$key}; - if ($prev ne $val) { - die encode_utf8 "Collision on mapping $root_key: " - . " '$key' maps to '$prev' and '$val'\n"; - } -} +EOF_EXTRA -my $O2P= "other2preferred"; -my $O2PN= "other2preferred_name"; -my $O2PE= "other2preferred_email"; -my $P2O= "preferred2other"; -my $N2P= "name2preferred"; -my $E2P= "email2preferred"; - -my $blurb= ""; # FIXME - replace with a nice message - -sub _check_name_mailmap { - my ($mailmap_info, $auth_name, $raw_name, $commit_info, $descr)= @_; - my $name= $auth_name; - $name =~ s/<([^<>]+)>/<\L$1\E>/ - or $name =~ s/(\s)(\@\w+)\z/$1<\L$2\E>/ - or $name .= " "; - - $name =~ s/\s+/ /g; - - if (!$mailmap_info->{$P2O}{$name}) { - warn encode_utf8 sprintf "Unknown %s '%s' in commit %s '%s'\n%s", - $descr, - $name, $commit_info->{"abbrev_hash"}, - $commit_info->{"commit_subject"}, - $blurb; - $mailmap_info->{add}{"$name $raw_name"}++; - return 0; } - elsif (!$mailmap_info->{$P2O}{$name}{$raw_name}) { - $mailmap_info->{add}{"$name $raw_name"}++; + else { + $props .= <{"name2email"}{$pname}; - if ($auth_email) { - ## this name exists in authors, so use its email data for pemail - $pemail= $auth_email; - } - my $auth_name= $authors_info->{"email2name"}{$pemail}; - if ($auth_name) { - ## this email exists in authors, so use its name data for pname - $pname= $auth_name; - } + return encode_utf8 <<"EOF_MESAGE"; - # neither name nor email exist in authors. - if ($pname ne "unknown") { - if (my $email= $seen_map{"name"}{$pname}) { - ## we have seen this pname before, check the pemail - ## is consistent - if ($email ne $pemail) { - warn encode_utf8 "Inconsistent emails for name '$pname'" - . " at line num $line_num: keeping '$email'," - . " ignoring '$pemail'\n"; - $pemail= $email; - } - } - else { - $seen_map{"name"}{$pname}= $pemail; - } - } - if ($pemail ne "unknown") { - if (my $name= $seen_map{"email"}{$pemail}) { - ## we have seen this preferred_email before, check the preferred_name - ## is consistent - if ($name ne $pname) { - warn encode_utf8 "Inconsistent name for email '$pemail'" - . " at line num $line_num: keeping '$name', ignoring" - . " '$pname'\n"; - $pname= $name; - } - } - else { - $seen_map{"email"}{$pemail}= $pname; - } - } +There are uncommitted changes in the working directory +$uncommitted_files +and your git credentials are new to us. We think that git thinks your +credentials are as follows (git may use defaults we don't guess +properly): +$props$extra +To resolve this you can perform one or more of these steps: - # Build an index of "preferred name/email" to other-email, other name - # we use this later to remove redundant entries missing a name. - $pref_groups{"$pname $pemail"}{$oemail}{ $oname || "" }= - [ $pname, $pemail, $oname, $oemail, $line_num ]; - } - - # this removes entries like - # Joe - # where there is a corresponding - # Joe Joe X - foreach my $pref (_sorted_hash_keys(\%pref_groups)) { - my $entries= $pref_groups{$pref}; - foreach my $email (_sorted_hash_keys($entries)) { - my @names= _sorted_hash_keys($entries->{$email}); - if ($names[0] eq "" and @names > 1) { - shift @names; - } - foreach my $name (@names) { - push @fixed, $entries->{$email}{$name}; - } - } - } + 1. Remove the uncommitted changes, including untracked files that + show up in - # final pass through the dataset, build up a database - # we will use later for checks and updates, and reconstruct - # the canonical entries. - my $new_mailmap_hash= {}; - my $mailmap_info= {}; - foreach my $rec (@fixed) { - my ($pname, $pemail, $oname, $oemail, $line_num)= @$rec; - my $preferred= "$pname <$pemail>"; - my $other; - if (defined $oemail) { - $other= $oname ? "$oname <$oemail>" : "<$oemail>"; - } - if ($other and $other ne "") { - _safe_set_key($mailmap_info, $O2P, $other, $preferred); - _safe_set_key($mailmap_info, $O2PN, $other, $pname); - _safe_set_key($mailmap_info, $O2PE, $other, $pemail); - } - $mailmap_info->{$P2O}{$preferred}{$other}++; - if ($pname ne "unknown") { - _safe_set_key($mailmap_info, $N2P, $pname, $preferred); - } - if ($pemail ne "unknown") { - _safe_set_key($mailmap_info, $E2P, $pemail, $preferred); - } - my $line= $preferred; - $line .= " $other" if $other; - $new_mailmap_hash->{$line}= $line_num; - } - return ($new_mailmap_hash, $mailmap_info); -} + git status -sub add_new_mailmap_entries { - my ($mailmap_hash, $mailmap_info, $mailmap_file)= @_; + if you wish to REMOVE UNTRACKED FILES and DELETE ANY CHANGES + you can - my $mailmap_add= $mailmap_info->{add} - or return 0; + git clean -dfx + git checkout -f - my $num= 0; - for my $new (sort keys %$mailmap_add) { - !$mailmap_hash->{$new}++ or next; - warn encode_utf8 "Updating '$mailmap_file' with: $new\n"; - $num++; - } - return $num; -} + BE WARNED: THIS MAY LOSE DATA. -sub read_and_update { - my ($authors_file, $mailmap_file)= @_; + 2. You are already configured in git and you just need to add + yourself to AUTHORS and other infra: commit the changes in the + working directory, including any untracked files that you plan to + add (the rest should be removed), and then run - # read the authors file and extract the info it contains - my ($author_info, $authors_preamble)= read_authors($authors_file); + Porting/updateAUTHORS.pl - # read the mailmap file. - my ($orig_mailmap_hash, $mailmap_preamble)= read_mailmap($mailmap_file); + to update the AUTHORS and .mailmap files automatically. Inspect + the changes it makes and then commit them once you are + satisfied. This is your option to decide who you will be known + as in the future! - # check and possibly fix the mailmap data, and build a set of precomputed - # datasets to work with it. - my ($mailmap_hash, $mailmap_info)= - check_fix_mailmap_hash($orig_mailmap_hash, $author_info); - - # update the mailmap based on any check or fixes we just did, - # we always write even if we did not do any changes. - update_mailmap($mailmap_hash, $mailmap_preamble, $mailmap_file); - - # read the commits names using git log, and compares and checks - # them against the data we have in authors. - read_commit_log($author_info, $mailmap_info); - - # update the authors file with any changes, we always write, - # but we may not change anything - update_authors($author_info, $authors_preamble, $authors_file); - - # check if we discovered new email data from the commits that - # we need to write back to disk. - add_new_mailmap_entries($mailmap_hash, $mailmap_info, $mailmap_file) - and update_mailmap($mailmap_hash, $mailmap_preamble, - $mailmap_file, $mailmap_info); + 3. You are already a contributor to the project but you are committing + changes on behalf of someone who is new. Run - return undef; -} + Porting/updateAUTHORS.pl -sub main { - local $Data::Dumper::Sortkeys= 1; - my $authors_file= "AUTHORS"; - my $mailmap_file= ".mailmap"; - my $show_man= 0; - my $show_help= 0; + to update the AUTHORS and .mailmap files automatically. Inspect + the changes it makes and then commit them once you are satisfied. + Make sure the conributor is ok with the decisions you make before + you merge. - ## Parse options and print usage if there is a syntax error, - ## or if usage was explicitly requested. - GetOptions( - 'help|?' => \$show_help, - 'man' => \$show_man, - 'authors_file|authors-file=s' => \$authors_file, - 'mailmap_file|mailmap-file=s' => \$mailmap_file, - ) or pod2usage(2); - pod2usage(1) if $show_help; - pod2usage(-verbose => 2) if $show_man; + 3. You are already an author but your git config is broken or + different from what you expect, or you are a new author but you + havent configured your git details properly, in which case you + can use something like the following commands: - read_and_update($authors_file, $mailmap_file); - return 0; # 0 for no error - intended for exit(); -} + git config user.name "Some Name" + git config user.email "somewhere\@provider" -exit(main()) unless caller; + If you are known to the project already this is all you need to + do. If you are not then you should perform option 2 or 4 as well + afterwards. + + 4. You do not want to be listed in AUTHORS: commit the changes, + including any untracked unignored files, and then run + Porting/updateAUTHORS.pl --exclude + + and commit the changes it creates. This test should pass once + those commits are created. Thank you for your contributions. +EOF_MESAGE +} 1; __END__ =head1 NAME -Porting/updateAUTHORS.pl - Automatically update AUTHORS and .mailmap -based on commit data. +F - Automatically update F and F<.mailmap> +and F based on commit data. =head1 SYNOPSIS -Porting/updateAUTHORS.pl +Porting/updateAUTHORS.pl [OPTIONS] [GIT_REF_RANGE] + +By default scans the commit history specified (or the entire history from the +current commit) and then updates F and F<.mailmap> so all contributors +are properly listed. Options: --help brief help message --man full documentation - --authors-file=FILE override default location of AUTHORS - --mailmap-file=FILE override default location of .mailmap + --verbose be verbose + + Commit Range: + --from=GIT_REF Select commits to use + --to=GIT_REF Select commits to use, defaults to HEAD + + File Locations: + --authors-file=FILE override default of 'AUTHORS' + --mailmap-file=FILE override default of '.mailmap' + + Action Modifiers + --no-update Do not update. + --validate output TAP about status and change nothing + --exclude-missing Add new names to the exclude file so they never + appear in AUTHORS or .mailmap. + + Details Changes + Update canonical name or email in AUTHORS and .mailmap properly. + --exclude-contrib NAME_AND_EMAIL + --exclude-me + --change-name OLD_NAME=NEW_NAME + --change-name-for-email OLD_ADDR=NEW_NAME + --change-email-for-name OLD_NAME=NEW_ADDR + --change-email OLD_ADDR=NEW_EMAIL + + Reports About People + --stats detailed report of authors and what they did + --who Sorted, wrapped list of who did what + --thanks-applied report who applied stuff for others + --rank report authors by number of commits created + + Reports About Files + --files detailed report files that were modified + --activity simple report of files that grew the most + --chainsaw simple report of files that shrank the most + + Report Modifiers + --percentage show percentages not counts + --cumulative show cumulative numbers not individual + --reverse show reports in reverse order + --numstat show additional file based data in some reports + (not needed for most reports) + --as-list show reports with names with common values + folded into a list like checkAUTHORS.pl used to + --numbered add rank numbers to reports where they are missing =head1 OPTIONS =over 4 -=item --help +=item C<--help> Print a brief help message and exits. -=item --man +=item C<--man> Prints the manual page and exits. -=item --authors-file=FILE +=item C<--verbose> -=item --authors_file=FILE +Be verbose about what is happening. Can be repeated more than once. -Override the default location of the authors file, which is "AUTHORS" in -the current directory. +=item C<--no-update> -=item --mailmap-file=FILE +Do not update files on disk even if they need to be changed. -=item --mailmap_file=FILE +=item C<--validate> -Override the default location of the mailmap file, which is ".mailmap" -in the current directory. +=item C<--tap> -=back +Instead of modifying files, test to see which would be modified and +output TAP test output about the validation. -=head1 DESCRIPTION +=item C<--authors-file=FILE> -This program will automatically manage updates to the AUTHORS file and -.mailmap file based on the data in our commits and the data in the files -themselves. It uses no other sources of data. Expects to be run from -the root a git repo of perl. +=item C<--authors_file=FILE> -In simple, execute the script and it will either die with a helpful -message or it will update the files as necessary, possibly not at all if -there is no need to do so. Note it will actually rewrite the files at -least once, but it may not actually make any changes to their content. -Thus to use the script is currently required that the files are -modifiable. - -Review the changes it makes to make sure they are sane. If they are -commit. If they are not then update the AUTHORS or .mailmap files as is -appropriate and run the tool again. Typically you shouldn't need to do -either unless you are changing the default name or email for a user. For -instance if a person currently listed in the AUTHORS file whishes to -change their preferred name or email then change it in the AUTHORS file -and run the script again. I am not sure when you might need to directly -modify .mailmap, usually modifying the AUTHORS file should suffice. - -=head1 FUNCTIONS - -Note that the file can also be used as a package. If you require the -file then you can access the functions located within the package -C. These are as follows: +Override the default location of the authors file, which is by default +the F file in the current directory. -=over 4 +=item C<--mailmap-file=FILE> + +=item C<--mailmap_file=FILE> + +Override the default location of the mailmap file, which is by default +the F<.mailmap> file in the current directory. + +=item C<--exclude-file=FILE> + +=item C<--exclude_file=FILE> + +Override the default location of the exclude file, which is by default +the F file reachable from the current +directory. + +=item C<--exclude-contrib=NAME_AND_EMAIL> + +=item C<--exclude_contrib=NAME_AND_EMAIL> + +Exclude a specific name/email combination from our contributor datasets. +Can be repeated multiple times on the command line to remove multiple +items at once. If the contributor details correspond to a canonical +identity of a contributor (one that is in the AUTHORS file or on the +left in the .mailmap file) then ALL records, including those linked to +that identity in .mailmap will be marked for exclusion. This is similar +to C<--exclude-missing> but it only affects the specifically named +users. Note that the format for NAME_AND_EMAIL is similar to that of the +.mailmap file, email addresses and C< @github > style identifiers should +be wrapped in angle brackets like this: C<< <@github> >>, users with no +email in the AUTHORS file should use C<< >>. + +For example: + + Porting/updateAUTHORS.pl --exclude-contrib="Joe B " + +Would remove all references to "Joe B" from F and F<.mailmap> +and add the required entires to F such that +the contributor would never be automatically added back, and would be +automatically removed should someone read them manually. + +=item C<--exclude-missing> + +=item C<--exclude_missing> + +=item C<--exclude> + +Normally when the tool is run it *adds* missing data only. If this +option is set then the reverse will happen, any author data missing will +be marked as intentionally missing in such a way that future "normal" +runs of the script ignore the author(s) that were excluded. + +The exclude data is stored in F as a SHA256 +digest (in base 64) of the user name and email being excluded so that +the list itself doesnt contain the contributor details in plain text. + +The general idea is that if you want to remove someone from F +and F<.mailmap> you delete their details manually, and then run this +tool with the C<--exclude> option. It is probably a good idea to run it +first without any arguments to make sure you dont exclude something or +someone you did not intend to. + +=item C<--stats> + +Show detailed stats about committers and the work they did in a tabular +form. If the C<--numstat> option is provided this report will provide +additional data about the files a developer worked on. May be slow the +first time it is used as git unpacks the relevant data. + +=item C<--who> -=item add_new_mailmap_entries($mailmap_hash, $mailmap_info, $mailmap_file) +Show a list of which committers and authors contributed to the project +in the selected range of commits. The list will contain the name only, +and will sorted according to unicode collation rules. This list is +suitable in release notes and similar contexts. -If any additions were identified while reading the commits this will -inject them into the mailmap_hash so they can be written out. Returns a -count of additions found. +=item C<--thanks-applied> -=item check_fix_mailmap_hash($mailmap_hash, $authors_info) +Show a report of which committers applied work on behalf of +someone else, including counts. Modified by the C<--as-list> and +C<--display-rank>. -Analyzes the data contained the in the .mailmap file and applies any -automated fixes which are required and which it can automatically -perform. Returns a hash of adjusted entries and a hash with additional -metadata about the mailmap entries. +=item C<--rank> -=item main() +Shows a report of which commits did the most work. Modified by the +C<--as-list> and C<--display-rank> options. -This implements the command line version of this module, handle command -line options, etc. +=item C<--files> -=item merge_mailmap_with_AUTHORS_and_checkAUTHORS_data +Show detailed stats about the files that have been modified in the +selected range of commits. Implies C<--numstat>. May be slow the first +time it is used as git unpacks the relevant data. -This is a utility function that combines data from this tool with data -contained in F it is not used directly, but was -used to cleanup and generate the current version of the .mailmap file. +=item C<--activity> -=item parse_mailmap_hash($mailmap_hash) +Show simple stats about which files had the most additions. Implies +C<--numstat>. May be slow the first time it is used as git unpacks the +relevant data. -Takes a mailmap_hash and parses it and returns it as an array of array -records with the contents: - [ $preferred_name, $preferred_email, - $other_name, $other_email, - $line_num ] +=item C<--chainsaw> -=item read_and_update($authors_file, $mailmap_file) +Show simple stats about whcih files had the most removals. Implies +C<--numstat>. May be slow the first time it is used as git unpacks the +relevant data. -Wraps the other functions in this library and implements the logic and -intent of this tool. Takes two arguments, the authors file name, and the -mailmap file name. Returns nothing but may modify the AUTHORS file -or the .mailmap file. Requires that both files are editable. +=item C<--percentage> -=item read_commit_log($authors_info, $mailmap_info) +Show numeric data as percentages of the total, not counts. -Read the commit log and find any new names it contains. +=item C<--cumulative> -=item read_authors($authors_file) +Show numeric data as cumulative counts in the reports. -Read the AUTHORS file and return data about it. +=item C<--reverse> -=item read_mailmap($mailmap_file) +Show the reports in reverse order to normal. -Read the .mailmap file and return data about it. +=item C<--numstat> -=item update_authors($authors_info, $authors_preamble, $authors_file) +Gather additional data about the files that were changed, not just the +authors who did the changes. This option currently is only necessary for +the C<--stats> option, which will display additional data when this +option is also provided. -Write out an updated AUTHORS file. This is done atomically -using a rename, we will not leave a half modified file in -the repo. +=item C<--as-list> -=item update_mailmap($mm_hash, $mm_preamble, $mailmap_file, $mm_info) +Show the reports with name data rolled up together into a list like the +older checkAUTHORS.pl script would have. -Write out an updated .mailmap file. This is done atomically -using a rename, we will not leave a half modified file in -the repo. +=item C<--numbered> + +Show an additional column with the rank number of a row in the report in +reports that do not normally show the rank number. + +=item C<--change-name OLD_NAME=NEW_NAME> + +=item C<--change-name-for-email OLD_EMAIL=NEW_NAME> + +=item C<--change-email OLD_EMAIL=NEW_EMAIL> + +=item C<--change-email-for-name OLD_NAME=NEW_EMAIL> + +Change email or name based on OLD_NAME or OLD_EMAIL. + +Eg, + + --change-name-for-email somebody@gmail.com="Bob Rob" + +would cause the preferred name for the person with the preferred email +C to change to "Bob Rob" in our records. If that +persons name was "Daniel Dude" then we might have done this as well: + + --change-name "Bob Rob"="Daniel Dude" =back -=head1 TODO +=head1 DESCRIPTION -More documentation and testing. +This program will automatically manage updates to the F file +and F<.mailmap> file based on the data in our commits and the data in +the files themselves. It uses no other sources of data. Expects to be +run from the root directory of a git repo of perl. + +In simple, execute the script and it will either die with a helpful +message or it will update the files as necessary, possibly not at all +if there is no need to do so. If the C<--validate> option is provided +the content will not be updated and instead the tool will act as a +test script validating that the F and F<.mailmap> files are +up to date. + +By default the script operates on the *entire* history of Perl +development that is reachable from HEAD. This can be overriden by using +the C<--from> and C<--to> options, or providing a git commit range as an +argument after the options just like you might do with C. + +The script can also be used to produce various reports and other content +about the commits it has analyzed. + +=head2 ADDING A NEW CONTRIBUTOR + +Commit your changes. Run the tool with no arguments. It will add +anything that is missing. Check the changes and then commit them. + +=head2 CHANGING A CONTRIBUTORS CANONICAL NAME OR EMAIL + +Use the C<--change-name-for-name> and related options. This will do +things "properly" and update all the files. -=head1 SEE ALSO +=head2 A CONTRIBUTOR WANTS TO BE FORGOTTEN -F +There are several ways to do this: + +=over 2 + +=item Manual Exclusion + +Manually modify F and F<.mailmap> so the user detals are +removed and then run this tool with the C<--exclude> option. This should +result in various SHA-256 digests (in base64) being added to +F. Commit the changes afterwards. + +=item Exclude Yourself + +Use the C<--exclude-me> option to the tool, review and commit the results. +This will use roughly the same rules that git would to figure out what your +name and email are. + +=item Exclude Someone Else + +Use the C<--exclude-contrib> option and specify their name and email. +For example + + --exclude-contrib="Their Name " + +Should exclude the person with this name from our files. + +=back + +Note that excluding a person by canonical details (that is the details +in the F file) will result in their .mailmap'ed names being +excluded as well. Excluding a persons secondary account details will +simply block that specific email from being listed, and is likely not +what you want to do most of the time. + +=head2 AFTER RUNNING THE TOOL + +Review the changes to make sure they are sane. If they are ok (and +they should be most of the time) commit. If they are not then update +the F or F<.mailmap> files as is appropriate and run the +tool again. + +Do not panic that your email details get added to F<.mailmap>, this is +by design so that your chosen name and email are displayed on GitHub and +in casual use of C and other C tooling. + +=head1 RECIPES + + perl Porting/updateAUTHORS.pl --who --from=v5.31.6 --to=v5.31.7 + perl Porting/updateAUTHORS.pl --who v5.31.6..v5.31.7 + perl Porting/updateAUTHORS.pl --rank --percentage --from=v5.31.6 + perl Porting/updateAUTHORS.pl --thanks-applied --from=v5.31.6 + perl Porting/updateAUTHORS.pl --tap --from=v5.31.6 + perl Porting/updateAUTHORS.pl --files --from=v5.31.6 + perl Porting/updateAUTHORS.pl --activity --from=v5.31.6 + perl Porting/updateAUTHORS.pl --chainsaw v5.31.6..HEAD + perl Porting/updateAUTHORS.pl --change-name "Old Name"="New Name" + perl Porting/updateAUTHORS.pl --change-name-for-email "x@y.com"="Name" + perl Porting/updateAUTHORS.pl --change-email-for-name "Name"="p@q.com" + +=head1 RELATED FILES + +F, F<.mailmap>, F + +=head1 TODO + +More documentation and testing. =head1 AUTHOR Yves Orton + +=head1 THANKS + +Loosely based on the older F script which this tool +replaced. Thanks to the contributors of that tool. See the Perl change log. =cut Index: gnu/usr.bin/perl/Porting/updateAUTHORS.pm =================================================================== RCS file: gnu/usr.bin/perl/Porting/updateAUTHORS.pm diff -N gnu/usr.bin/perl/Porting/updateAUTHORS.pm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/Porting/updateAUTHORS.pm 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,1377 @@ +package Porting::updateAUTHORS; +use strict; +use warnings; +use Data::Dumper; +use Encode qw(encode_utf8 decode_utf8 decode); +use Digest::SHA qw(sha256_base64); +use Text::Wrap qw(wrap); +use Unicode::Collate; +use feature 'fc'; +$Text::Wrap::columns= 80; + +# The style of this file is determined by: +# +# perltidy -w -ple -bbb -bbc -bbs -nolq -l=80 -noll -nola -nwls='=' \ +# -isbc -nolc -otr -kis -ci=4 -se -sot -sct -nsbl -pt=2 -fs \ +# -fsb='#start-no-tidy' -fse='#end-no-tidy' + +# Info and config for passing to git log. +# %an: author name +# %aN: author name (respecting .mailmap, see git-shortlog(1) or git-blame(1)) +# %ae: author email +# %aE: author email (respecting .mailmap, see git-shortlog(1) or git-blame(1)) +# %cn: committer name +# %cN: committer name (respecting .mailmap, see git-shortlog(1) or git-blame(1)) +# %ce: committer email +# %cE: committer email (respecting .mailmap, see git-shortlog(1) or git-blame(1)) +# %H: commit hash +# %h: abbreviated commit hash +# %s: subject +# %x00: print a byte from a hex code + +my %field_spec= ( + "an" => "author_name", + "aN" => "author_name_mm", + "ae" => "author_email", + "aE" => "author_email_mm", + "cn" => "committer_name", + "cN" => "committer_name_mm", + "ce" => "committer_email", + "cE" => "committer_email_mm", + "H" => "commit_hash", + "h" => "abbrev_hash", + "s" => "commit_subject", +); + +my $Collate= Unicode::Collate->new(level => 1, indentical => 1); +my @field_codes= sort keys %field_spec; +my @field_names= map { $field_spec{$_} } @field_codes; +my $tformat= "=" . join "%x09", map { "%" . $_ } @field_codes; + +sub _make_name_author_info { + my ($self, $commit_info, $name_key)= @_; + my $author_info= $self->{author_info}; + (my $email_key= $name_key) =~ s/name/email/; + my $email= $commit_info->{$email_key}; + my $name= $commit_info->{$name_key}; + + my $line= $author_info->{"email2line"}{$email} + // $author_info->{"name2line"}{ lc($name) }; + + $line //= sprintf "%-31s<%s>", + $commit_info->{$name_key}, $commit_info->{$email_key}; + $commit_info->{ $name_key . "_canon" }= $line; + return $line; +} + +sub _make_name_simple { + my ($self, $commit_info, $key)= @_; + my $name_key= $key . "_name"; + my $email_key= $key . "_email"; + return sprintf "%s <%s>", $commit_info->{$name_key}, + lc($commit_info->{$email_key}); +} + +sub __fold_trim_ws { + my ($munged)= @_; + $munged =~ s/\s+/ /g; + $munged =~ s/\A\s+//; + $munged =~ s/\s+\z//; + return $munged; +} + +sub _register_author { + my ($self, $name, $type)= @_; + + return if $self->_logical_exclude_author($name); + + my $digest= $self->_keeper_digest($name) + or return; + + $self->{who_stats}{$name}{$type}++; + + $self->{author_info}{"lines"}{$name} + and return; + + my $munged= __fold_trim_ws($name); + if ($self->{exclude_missing}) { + $self->_exclude_contrib($name, $digest); + } + else { + $self->{author_info}{"lines"}{$name}++; + + my $munged= __fold_trim_ws($name); + warn encode_utf8 sprintf + "New %s '%s' (%s) will be added to AUTHORS file.\n", + $type, $munged, $digest + if $self->{verbose}; + } +} + +sub git_conf_get { + my ($self, $setting)= @_; + chomp(my $value= `git config --get $setting`); + return decode_utf8 $value; +} + +sub current_git_user_name { + my ($self)= @_; + return $self->git_conf_get("user.name"); +} + +sub current_git_user_email { + my ($self)= @_; + return $self->git_conf_get("user.email"); +} + +sub current_git_name_email { + my ($self, $type)= @_; + my $name= + $ENV{"GIT_\U$type\E_NAME"} + || $self->git_conf_get("\L$type\E.name") + || $self->current_git_user_name(); + my $email= + $ENV{"GIT_\U$type\E_EMAIL"} + || $self->git_conf_get("\L$type\E.email") + || $self->current_git_user_email(); + return $name, $email; +} + +sub format_name_email { + my ($self, $name, $email)= @_; + return sprintf "%s <%s>", $name, $email; +} + +sub current_committer_name_email { + my ($self, $full)= @_; + my ($n, $e)= $self->current_git_name_email("committer"); + return $full ? $self->format_name_email($n, $e) : ($n, $e); +} + +sub current_author_name_email { + my ($self, $full)= @_; + my ($n, $e)= $self->current_git_name_email("author"); + return $full ? $self->format_name_email($n, $e) : ($n, $e); +} + +sub git_status_porcelain { + my ($self)= @_; + my $status= `git status --porcelain`; + return $status // ""; +} + +sub finalize_commit_info { + my ($self, $commit_info)= @_; + my $author= $commit_info->{author_name_mm_canon}; + my $author_stats= $self->{who_stats}{$author} ||= {}; + + my $file_info= $commit_info->{files} ||= {}; + foreach my $file (keys %{$file_info}) { + if (!$self->{file_stats}{$file}) { + $self->{summary_stats}{num_files}++; + } + my $fs= $self->{file_stats}{$file} ||= {}; + my $afs= $author_stats->{file_stats}{$file} ||= {}; + my $added= $file_info->{$file}{lines_added}; + my $removed= $file_info->{$file}{lines_removed}; + my $delta= $file_info->{$file}{lines_delta}; + defined $_ and $_ eq "-" and undef $_ for $added, $removed; + + if (defined $added) { + for my $h ($author_stats, $fs, $afs) { + $h->{lines_delta} += $delta; + $h->{lines_added} += $added; + $h->{lines_removed} += $removed; + } + } + else { + $author_stats->{binary_change}++; + $fs->{binary_change}++; + $afs->{binary_change}++; + } + $afs->{commits}++ + or $author_stats->{num_files}++; + + $fs->{commits}++ + or $self->{summary_stats}{num_files}++; + + $fs->{who}{$author}++ + or $self->{summary_stats}{authors}++; + } +} + +sub read_commit_log { + my ($self)= @_; + my $author_info= $self->{author_info} ||= {}; + my $mailmap_info= $self->{mailmap_info} ||= {}; + + my $commits_read= 0; + my @args= ("--pretty='format:$tformat'"); + push @args, "--numstat" if $self->{numstat}; + push @args, "'$self->{commit_range}'" if $self->{commit_range}; + + my $last_commit_info; + my $cmd= qq(git -c diff.algorithm=myers log @args); + $cmd =~ s/'/"/g if $^O =~ /Win/; + open my $fh, "-|", $cmd + or die "Failed to open git log pipe: $!"; + binmode($fh); + while (defined(my $line= <$fh>)) { + chomp $line; + $line= decode_utf8($line); + if ($line =~ s/^=//) { + $self->finalize_commit_info($last_commit_info) + if $last_commit_info; + } + elsif ($line =~ /\S/) { + my ($added, $removed, $file)= split /\s+/, $line; + if ($added ne "-") { + $last_commit_info->{files}{$file}= { + lines_added => $added, + lines_removed => $removed, + lines_delta => $added - $removed, + }; + } + else { + $last_commit_info->{files}{$file}{binary_changes}++; + } + next; + } + else { + # whitspace only or empty line + next; + } + $commits_read++; + my $commit_info= {}; + $last_commit_info= $commit_info; + @{$commit_info}{@field_names}= split /\t/, $line, 0 + @field_names; + + my $author_name_mm_canon= + $self->_make_name_author_info($commit_info, "author_name_mm"); + + my $committer_name_mm_canon= + $self->_make_name_author_info($commit_info, "committer_name_mm"); + + my $author_name_real= $self->_make_name_simple($commit_info, "author"); + + my $committer_name_real= + $self->_make_name_simple($commit_info, "committer"); + + my ($author_good, $committer_good); + + if ( $self->_keeper_digest($author_name_mm_canon) + && $self->_keeper_digest($author_name_real)) + { + $self->_check_name_mailmap($author_name_mm_canon, $author_name_real, + $commit_info, "author name"); + $self->_register_author($author_name_mm_canon, "author"); + $author_good= 1; + } + + if ( $self->_keeper_digest($committer_name_mm_canon) + && $self->_keeper_digest($committer_name_real)) + { + $self->_check_name_mailmap($committer_name_mm_canon, + $committer_name_real, $commit_info, "committer name"); + $self->_register_author($committer_name_mm_canon, "committer"); + $committer_good= 1; + } + if ( $author_good + and $committer_good + and $committer_name_mm_canon ne $author_name_mm_canon) + { + $self->{who_stats}{$committer_name_mm_canon}{applied}++; + } + } + $self->finalize_commit_info($last_commit_info) if $last_commit_info; + if (!$commits_read) { + if ($self->{commit_range}) { + die "No commits in range '$self->{commit_range}'\n"; + } + else { + die "Panic! There are no commits!\n"; + } + } + return $author_info; +} + +sub dupe_info { + my ($self)= @_; + my $msg= ""; + foreach my $type (sort keys %{ $self->{dupe} || {} }) { + $msg .= "Duplicate \u$type in $self->{authors_file}:\n"; + foreach my $key (sort keys %{ $self->{dupe}{$type} }) { + $msg .= " \u$type '$key'\n"; + foreach my $line (sort keys %{ $self->{dupe}{$type}{$key} }) { + $msg .= " $line\n"; + } + } + } + return $msg; +} + +sub read_authors_file { + my ($self)= @_; + my $authors_file= $self->{authors_file}; + + my @authors_preamble; + open my $in_fh, "<", $authors_file + or die "Failed to open for read '$authors_file': $!"; + my $raw_text= ""; + my $found_sep= 0; + while (defined(my $line= <$in_fh>)) { + $raw_text .= $line; + $line= decode_utf8($line); + chomp $line; + push @authors_preamble, $line; + if ($line =~ /^--/) { + $found_sep= 1; + last; + } + } + if (!$found_sep) { + die sprintf <<'EOFMT', $authors_file; +Possibly corrupted authors file '%s'. + +There should be a big '#' comment block at the start of the file +followed by "--" followed by a list of names and email/contact +details. We couldn't find the separator. Where did it go? + +Cowardly refusing to continue until this is fixed. +EOFMT + } + my %author_info; + while (defined(my $line= <$in_fh>)) { + $raw_text .= $line; + $line= decode_utf8($line); + chomp $line; + my ($name, $email); + my $copy= $line; + $copy =~ s/\s+\z//; + if ($copy =~ s/<([^<>]*)>//) { + $email= $1; + } + elsif ($copy =~ s/\s+(\@\w+)\z//) { + $email= $1; + } + $copy =~ s/\s+\z//; + $name= $copy; + $email //= "unknown"; + my $orig_name= $name; + my $orig_email= $email; + if (my $new_name= $self->{change_name_for_name}{$orig_name}) { + $name= $new_name; + } + if (my $new_name= $self->{change_name_for_email}{$orig_email}) { + $name= $new_name; + } + if (my $new_email= $self->{change_email_for_name}{$orig_name}) { + $email= $new_email; + } + if (my $new_email= $self->{change_email_for_email}{$orig_email}) { + $email= $new_email; + } + $line= sprintf "%-31s%s", $name, $email =~ /^\@/ ? $email : "<$email>"; + $line =~ s/\s+\z//; + $email= lc($email); + + $line =~ s/\s+\z//; + $author_info{"lines"}{$line}++; + if ($email and $email ne "unknown") { + if (my $other= $author_info{"email2line"}{$email}) { + $self->{dupe}{email}{$email}{$other}= 1; + $self->{dupe}{email}{$email}{$line}= 1; + } + else { + $author_info{"email2line"}{$email}= $line; + } + } + if ($name and $name ne "unknown") { + if (my $other= $author_info{"name2line"}{ lc($name) }) { + $self->{dupe}{name}{$name}{$other}= 1; + $self->{dupe}{name}{$name}{$line}= 1; + } + else { + $author_info{"name2line"}{ lc($name) }= $line; + } + } + $author_info{"email2name"}{$email} //= $name + if $email + and $name + and $email ne "unknown"; + $author_info{"name2email"}{$name} //= $email + if $name and $name ne "unknown"; + $author_info{"clean_full"}{ __fold_trim_ws($line) }= $line; + } + close $in_fh + or die "Failed to close '$authors_file': $!"; + + $self->{author_info}= \%author_info; + $self->{authors_preamble}= \@authors_preamble; + $self->{authors_raw_text}= $raw_text; + return (\%author_info, \@authors_preamble, $raw_text); +} + +sub update_authors_file { + my ($self)= @_; + + my $author_info= $self->{author_info}; + my $authors_preamble= $self->{authors_preamble}; + my $authors_file= $self->{authors_file}; + my $old_raw_text= $self->{authors_raw_text}; + + my $authors_file_new= $authors_file . ".new"; + my $new_raw_text= ""; + { + open my $out_fh, ">", \$new_raw_text + or die "Failed to open scalar buffer for write: $!"; + foreach my $line (@$authors_preamble) { + print $out_fh encode_utf8($line), "\n" + or die "Failed to print to scalar buffer handle: $!"; + } + foreach my $author (__sorted_hash_keys($author_info->{"lines"})) { + next if $self->_logical_exclude_author($author); + my $author_mm= $self->_author_to_mailmap($author); + if (!$self->_keeper_digest($author_mm)) { + next; + } + print $out_fh encode_utf8($author), "\n" + or die "Failed to print to scalar buffer handle: $!"; + } + close $out_fh + or die "Failed to close scalar buffer handle: $!"; + } + if ($new_raw_text ne $old_raw_text) { + $self->{changed_count}++; + $self->_log_file_changes_quick_and_dirty_diff($authors_file, + $old_raw_text, $new_raw_text); + + if ($self->{no_update}) { + return 1; + } + + warn "Updating '$authors_file'\n" if $self->{verbose}; + + open my $out_fh, ">", $authors_file_new + or die "Failed to open for write '$authors_file_new': $!"; + binmode $out_fh; + print $out_fh $new_raw_text; + close $out_fh + or die "Failed to close '$authors_file_new': $!"; + rename $authors_file_new, $authors_file + or die + "Failed to rename '$authors_file_new' to '$authors_file': $!"; + return 1; + } + else { + return 0; + } +} + +sub read_mailmap_file { + my ($self)= @_; + my $mailmap_file= $self->{mailmap_file}; + + open my $in, "<", $mailmap_file + or die "Failed to read '$mailmap_file': $!"; + my %mailmap_hash; + my @mailmap_preamble; + my $line_num= 0; + my $raw_text= ""; + while (defined(my $line= <$in>)) { + $raw_text .= $line; + $line= decode_utf8($line); + ++$line_num; + next unless $line =~ /\S/; + chomp($line); + if ($line =~ /^#/) { + if (!keys %mailmap_hash) { + push @mailmap_preamble, $line; + } + else { + die encode_utf8 "Not expecting comments after header ", + "finished at line $line_num!\nLine: $line\n"; + } + } + else { + $mailmap_hash{$line}= $line_num; + } + } + close $in + or die "Failed to close '$mailmap_file' after reading: $!"; + if (!@mailmap_preamble) { + die sprintf <<'EOFMT', $mailmap_file; +Possibly corrupted mailmap file '%s'. + +This file should have a preamble of '#' comments in it. + +Where did they go? + +Cowardly refusing to continue until this is fixed. +EOFMT + } + $self->{orig_mailmap_hash}= \%mailmap_hash; + $self->{mailmap_preamble}= \@mailmap_preamble; + $self->{mailmap_raw_text}= $raw_text; + return (\%mailmap_hash, \@mailmap_preamble, $raw_text); +} + +sub __sorted_hash_keys { + my ($hash)= @_; + return __sort_names(keys %$hash); +} + +sub __sort_names { + my @sorted= sort { fc($a) cmp fc($b) || $a cmp $b } @_; + return @sorted; +} + +# Returns 0 if the file needed to be changed, Return 1 if it does not. +sub update_mailmap_file { + my ($self)= @_; + my $mailmap_hash= $self->{new_mailmap_hash}; + my $mailmap_preamble= $self->{mailmap_preamble}; + my $mailmap_file= $self->{mailmap_file}; + my $old_raw_text= $self->{mailmap_raw_text}; + + my $new_raw_text= ""; + { + open my $out, ">", \$new_raw_text + or die "Failed to open scalar buffer for write: $!"; + foreach + my $line (@$mailmap_preamble, __sorted_hash_keys($mailmap_hash),) + { + next if $line =~ m!\A(.*) \1\z!; + print $out encode_utf8($line), "\n" + or die "Failed to print to scalar buffer handle: $!"; + } + close $out + or die "Failed to close scalar buffer handle: $!"; + } + if ($new_raw_text ne $old_raw_text) { + $self->{changed_count}++; + $self->_log_file_changes_quick_and_dirty_diff($mailmap_file, + $old_raw_text, $new_raw_text); + + if ($self->{no_update}) { + return 1; + } + + warn "Updating '$mailmap_file'\n" + if $self->{verbose}; + + my $mailmap_file_new= $mailmap_file . ".new"; + open my $out, ">", $mailmap_file_new + or die "Failed to write '$mailmap_file_new': $!"; + binmode $out + or die "Failed to binmode '$mailmap_file_new': $!"; + print $out $new_raw_text + or die "Failed to print to '$mailmap_file_new': $!"; + close $out + or die "Failed to close '$mailmap_file_new' after writing: $!"; + rename $mailmap_file_new, $mailmap_file + or die + "Failed to rename '$mailmap_file_new' to '$mailmap_file': $!"; + return 1; + } + else { + return 0; + } +} + +sub parse_orig_mailmap_hash { + my ($self)= @_; + my $mailmap_hash= $self->{orig_mailmap_hash}; + + my @recs; + foreach my $line (__sorted_hash_keys($mailmap_hash)) { + my $line_num= $mailmap_hash->{$line}; + $line =~ /^ \s* (?: ( [^<>]*? ) \s+ )? <([^<>]*)> + (?: \s+ (?: ( [^<>]*? ) \s+ )? <([^<>]*)> )? \s* \z /x + or die encode_utf8 + "Failed to parse '$self->{mailmap_file}' line num $line_num: '$line'\n"; + if (!$1 or !$2) { + die encode_utf8 "Both preferred name and email are mandatory ", + "in line num $line_num: '$line'"; + } + my ($name, $email, $other_name, $other_email)= ($1, $2, $3, $4); + my ($orig_name, $orig_email)= ($1, $2); + if (my $new_name= $self->{change_name_for_name}{$orig_name}) { + $name= $new_name; + } + if (my $new_name= $self->{change_name_for_email}{$orig_email}) { + $name= $new_name; + } + if (my $new_email= $self->{change_email_for_name}{$orig_name}) { + $email= $new_email; + } + if (my $new_email= $self->{change_email_for_email}{$orig_email}) { + $email= $new_email; + } + + push @recs, [ $name, $email, $other_name, $other_email, $line_num ]; + } + return \@recs; +} + +sub _safe_set_key { + my ($self, $hash, $root_key, $key, $val, $pretty_name)= @_; + $hash->{$root_key}{$key} //= $val; + my $prev= $hash->{$root_key}{$key}; + if ($prev ne $val) { + die encode_utf8 "Collision on mapping $root_key: " + . " '$key' maps to '$prev' and '$val'\n"; + } +} + +my $O2P= "other2preferred"; +my $O2PN= "other2preferred_name"; +my $O2PE= "other2preferred_email"; +my $P2O= "preferred2other"; +my $N2P= "name2preferred"; +my $E2P= "email2preferred"; + +my $blurb= ""; # FIXME - replace with a nice message + +sub known_contributor { + my ($self, $name, $email)= @_; + if (!$name or !$email) { return 0 } + my $combined= "$name <$email>"; + return (( + $self->{mailmap_info}{$O2P}{$combined} + && $self->_keeper_digest($combined) + ) ? 1 : 0 + ); +} + +sub _check_name_mailmap { + my ($self, $auth_name, $raw_name, $commit_info, $descr)= @_; + my $mailmap_info= $self->{mailmap_info}; + + my $name= $self->_author_to_mailmap($auth_name); + + my $digest= $self->_keeper_digest($name) + or return 1; # known but ignore + + my $name_info= $mailmap_info->{$P2O}{$name}; + + if (!$name_info || !$name_info->{$raw_name}) { + if ($self->{exclude_missing}) { + $self->_exclude_contrib($name, $digest); + } + else { + $mailmap_info->{add}{"$name $raw_name"}++; + + warn encode_utf8 sprintf + "Unknown %s '%s' in commit %s '%s'\n%s", + $descr, + $name, + $commit_info->{"abbrev_hash"}, + $commit_info->{"commit_subject"}, $blurb + if $self->{verbose}; + } + return 0; + } + return 1; +} + +sub _author_to_mailmap { + my ($self, $name)= @_; + $name =~ s/<([^<>]+)>/<\L$1\E>/ + or $name =~ s/(\s)(\@\w+)\z/$1<\L$2\E>/ + or $name .= " "; + + $name= __fold_trim_ws($name); + return $name; +} + +sub check_fix_mailmap_hash { + my ($self)= @_; + my $orig_mailmap_hash= $self->{orig_mailmap_hash}; + my $author_info= $self->{author_info}; + foreach my $key (keys %{ $author_info->{clean_full} }) { + $key .= " " + unless $key =~ /\s+(?:<[^>]+>|\@\w+)\z/; + $key =~ s/\s+(\@\w+)\z/ <$1>/; + $orig_mailmap_hash->{"$key $key"} //= -1; + } + my $parsed= $self->parse_orig_mailmap_hash(); + my @fixed; + my %seen_map; + my %pref_groups; + + my $remove_no_names_with_overlaps= 0; + + # first pass through the data, do any conversions, eg, LC + # the email address, decode any MIME-Header style email addresses. + # We also correct any preferred name entries so they match what + # we already have in AUTHORS, and check that there aren't collisions + # or other issues in the data. + foreach my $rec (@$parsed) { + my ($pname, $pemail, $oname, $oemail, $line_num)= @$rec; + $pemail= lc($pemail); + $oemail= lc($oemail) if defined $oemail; + if ($pname =~ /=\?UTF-8\?/) { + $pname= decode("MIME-Header", $pname); + } + my $auth_email= $author_info->{"name2email"}{$pname}; + if ($auth_email) { + ## this name exists in authors, so use its email data for pemail + $pemail= $auth_email; + } + my $auth_name= $author_info->{"email2name"}{$pemail}; + if ($auth_name) { + ## this email exists in authors, so use its name data for pname + $pname= $auth_name; + } + + # neither name nor email exist in authors. + if ($pname ne "unknown") { + if (my $email= $seen_map{"name"}{$pname}) { + ## we have seen this pname before, check the pemail + ## is consistent + if ($email ne $pemail) { + warn encode_utf8 "Inconsistent emails for name '$pname'" + . " at line num $line_num: keeping '$email'," + . " ignoring '$pemail'\n"; + $pemail= $email; + } + } + else { + $seen_map{"name"}{$pname}= $pemail; + } + } + if ($pemail ne "unknown") { + if (my $name= $seen_map{"email"}{$pemail}) { + ## we have seen this preferred_email before, check the preferred_name + ## is consistent + if ($name ne $pname) { + warn encode_utf8 "Inconsistent name for email '$pemail'" + . " at line num $line_num: keeping '$name', ignoring" + . " '$pname'\n"; + $pname= $name; + } + } + else { + $seen_map{"email"}{$pemail}= $pname; + } + } + + my $rec= [ $pname, $pemail, $oname, $oemail, $line_num ]; + if ($remove_no_names_with_overlaps) { + + # Build an index of "preferred name/email" to other-email, other name + # we use this later to remove redundant entries missing a name. + $pref_groups{"$pname $pemail"}{$oemail}{ $oname || "" }= $rec; + } + else { + push @fixed, $rec; + } + } + + if ($remove_no_names_with_overlaps) { + + # this removes entries like + # Joe + # where there is a corresponding + # Joe Joe X + foreach my $pref (__sorted_hash_keys(\%pref_groups)) { + my $entries= $pref_groups{$pref}; + foreach my $email (__sorted_hash_keys($entries)) { + my @names= __sorted_hash_keys($entries->{$email}); + if (0 and $names[0] eq "" and @names > 1) { + shift @names; + } + foreach my $name (@names) { + push @fixed, $entries->{$email}{$name}; + } + } + } + } + + # final pass through the dataset, build up a database + # we will use later for checks and updates, and reconstruct + # the canonical entries. + my $new_mailmap_hash= {}; + my $mailmap_info= {}; + foreach my $rec (@fixed) { + my ($pname, $pemail, $oname, $oemail, $line_num)= @$rec; + my $preferred= "$pname <$pemail>"; + my $other; + if (defined $oemail) { + $other= $oname ? "$oname <$oemail>" : "<$oemail>"; + } + if (!$self->_keeper_digest($preferred)) { + $self->_exclude_contrib($other); + next; + } + elsif (!$self->_keeper_digest($other)) { + next; + } + if ($other and $other ne "") { + $self->_safe_set_key($mailmap_info, $O2P, $other, $preferred); + $self->_safe_set_key($mailmap_info, $O2PN, $other, $pname); + $self->_safe_set_key($mailmap_info, $O2PE, $other, $pemail); + } + $mailmap_info->{$P2O}{$preferred}{$other}++; + if ($pname ne "unknown") { + $self->_safe_set_key($mailmap_info, $N2P, $pname, $preferred); + } + if ($pemail ne "unknown") { + $self->_safe_set_key($mailmap_info, $E2P, $pemail, $preferred); + } + my $line= $preferred; + $line .= " $other" if $other; + $new_mailmap_hash->{$line}= $line_num; + } + $self->{new_mailmap_hash}= $new_mailmap_hash; + $self->{mailmap_info}= $mailmap_info; + return ($new_mailmap_hash, $mailmap_info); +} + +sub add_new_mailmap_entries { + my ($self)= @_; + my $mailmap_hash= $self->{new_mailmap_hash}; + my $mailmap_info= $self->{mailmap_info}; + my $mailmap_file= $self->{mailmap_file}; + + my $mailmap_add= $mailmap_info->{add} + or return 0; + + my $num= 0; + for my $new (__sorted_hash_keys($mailmap_add)) { + !$mailmap_hash->{$new}++ or next; + warn encode_utf8 "Updating '$mailmap_file' with: $new\n" + if $self->{verbose}; + $num++; + } + return $num; +} + +sub read_and_update { + my ($self)= @_; + my ($authors_file, $mailmap_file)= + %{$self}{qw(authors_file mailmap_file)}; + + # read the authors file and extract the info it contains + $self->read_authors_file(); + + # read the mailmap file. + $self->read_mailmap_file(); + + # check and possibly fix the mailmap data, and build a set of precomputed + # datasets to work with it. + $self->check_fix_mailmap_hash(); + + # update the mailmap based on any check or fixes we just did. + $self->update_mailmap_file(); + + # read the commits names using git log, and compares and checks + # them against the data we have in authors. + $self->read_commit_log(); + + # update the authors file with any changes + $self->update_authors_file(); + + # check if we discovered new email data from the commits that + # we need to write back to disk. + $self->add_new_mailmap_entries() + and $self->update_mailmap_file(); + + $self->update_exclude_file(); + + return $self->changed_count(); +} + +sub read_exclude_file { + my ($self)= @_; + my $exclude_file= $self->{exclude_file}; + my $exclude_digest= $self->{exclude_digest} ||= {}; + + open my $in_fh, "<", $exclude_file + or do { + warn "Failed to open '$exclude_file': $!"; + return; + }; + my $head= ""; + my $orig= ""; + my $seen_data= 0; + while (defined(my $line= <$in_fh>)) { + $orig .= $line; + if ($line =~ /^\s*#/ || $line !~ /\S/) { + $head .= $line unless $seen_data; + next; + } + else { + $seen_data= 1; + } + chomp($line); + $line =~ s/\A\s+//; + $line =~ s/\s*(?:#.*)?\z//; + $exclude_digest->{$line}++ if length($line); + } + close $in_fh + or die "Failed to close '$exclude_file' after reading: $!"; + if (!$head) { + die sprintf <<'EOFMT', $exclude_file; +Possibly corrupted exclude file '%s'. + +This file should have a header of '#' comments in it. + +Where did they go? + +Cowardly refusing to continue until this is fixed. +EOFMT + } + $self->{exclude_file_text_head}= $head; + $self->{exclude_file_text_orig}= $orig; + + return $exclude_digest; +} + +sub update_exclude_file { + my ($self)= @_; + my $exclude_file= $self->{exclude_file}; + my $exclude_text= $self->{exclude_file_text_head}; + foreach my $digest (__sorted_hash_keys($self->{exclude_digest})) { + $exclude_text .= "$digest\n"; + } + if ($exclude_text ne $self->{exclude_file_text_orig}) { + $self->{changed_count}++; + $self->_log_file_changes_quick_and_dirty_diff($exclude_file, + $self->{exclude_file_text_orig}, + $exclude_text); + + if ($self->{no_update}) { + return 1; + } + + warn "Updating '$exclude_file'\n" if $self->{verbose}; + + my $tmp_file= "$exclude_file.new"; + open my $out_fh, ">", $tmp_file + or die "Cant open '$tmp_file' for write $!"; + print $out_fh $exclude_text + or die "Failed to print to '$tmp_file': $!"; + close $out_fh + or die "Failed to close '$tmp_file' after writing: $!"; + rename $tmp_file, $exclude_file + or die "Failed to rename '$tmp_file' to '$exclude_file': $!"; + + return 1; + } + else { + return 0; + } +} + +sub changed_count { + my ($self)= @_; + return $self->{changed_count}; +} + +sub changed_file { + my ($self, $name)= @_; + return $self->{changed_file}{$name}; +} + +sub unchanged_file { + my ($self, $name)= @_; + return $self->changed_file($name) ? 0 : 1; +} + +sub new { + my ($class, %self)= @_; + $self{changed_count}= 0; + for my $name (qw(authors_file mailmap_file exclude_file)) { + $self{$name} + or die "Property '$name' is mandatory in constructor"; + } + + my $self= bless \%self, $class; + + if (my $ary= $self->{exclude_contrib}) { + $self->_exclude_contrib($_) for @$ary; + } + + $self->read_exclude_file(); + + die Dumper(\%self) if $self{dump_opts}; + + return $self; +} + +sub __digest { + my $thing= $_[0]; + utf8::encode($thing); + return sha256_base64($thing); +} + +# if this name is a "keeper" then return its digest +# (if we know the digest and it is marked for exclusion +# then we return 0) +sub _keeper_digest { + my ($self, $real_name)= @_; + my $digest; + $digest= $self->{digest_cache}{$real_name}; + + if (!$digest) { + my $name= __fold_trim_ws($real_name); + + $digest= ($self->{digest_cache}{$name} //= __digest($name)); + $self->{digest_cache}{$real_name}= $digest; + } + + return $self->{exclude_digest}{$digest} ? 0 : $digest; +} + +# should we exclude this author from the AUTHORS file +# simply because of the form of their details? +sub _logical_exclude_author { + my ($self, $author)= @_; + + # don't know the persona + return 1 if $author =~ /^unknown/; + + # Someone at with a single word name. + # Eg, we wont list "Bob " + if ($author =~ s/\s*\z//) { + return 1 if $author =~ /^\w+$/; + } + return 0; +} + +# exclude this contributor by name, if digest isnt provided +# then it is computed using _digest. +sub _exclude_contrib { + my ($self, $name, $digest)= @_; + + # if we would exclude them anyway due to the logical + # naming rules then we do not need to add them to the exclude + # file. + return if $self->_logical_exclude_author($name); + $name= __fold_trim_ws($name); + $digest //= __digest($name); + $self->{exclude_digest}{$digest}++ + or warn "Excluding '$name' with '$digest'\n"; +} + +sub _log_file_changes_quick_and_dirty_diff { + my ($self, $file, $old_raw_text, $new_raw_text)= @_; + + my %old; + $old{$_}++ for split /\n/, $old_raw_text; + my %new; + $new{$_}++ for split /\n/, $new_raw_text; + foreach my $key (keys %new) { + delete $new{$key} if delete $old{$key}; + } + $self->{changed_file}{$file}{add}= \%new if keys %new; + $self->{changed_file}{$file}{del}= \%old if keys %old; + return $self->{changed_file}{$file}; +} + +sub _diff_diag { + my ($self, $want_file)= @_; + my $diag_str= ""; + foreach my $file (sort keys %{ $self->{changed_file} || {} }) { + next if $want_file and $file ne $want_file; + $diag_str .= " File '$file' changes:\n"; + foreach my $action (sort keys %{ $self->{changed_file}{$file} }) { + foreach + my $line (sort keys %{ $self->{changed_file}{$file}{$action} }) + { + $diag_str .= " would $action: $line\n"; + } + } + } + return $diag_str; +} + +my %pretty_name= ( + "author" => "Authored", + "committer" => "Committed", + "applied" => "Applied", + "name" => "Name", + "pos" => "Pos", + "num_files" => "NFiles", + "lines_added" => "L++", + "lines_removed" => "L--", + "lines_delta" => "L+-", + "binary_changed" => "Bin+-", +); + +sub report_stats { + my ($self, $stats_key, @types)= @_; + my @extra= "name"; + my @rows; + my @total; + foreach my $name (__sorted_hash_keys($self->{$stats_key})) { + my @data= map { $self->{$stats_key}{$name}{$_} // 0 } @types; + $total[$_] += $data[$_] for 0 .. $#data; + push @data, $name; + push @rows, \@data if $data[0]; + } + @rows= sort { + my $cmp= 0; + for (0 .. $#$a - 1) { + $cmp= $b->[$_] <=> $a->[$_]; + last if $cmp; + } + $cmp ||= $Collate->cmp($a->[-1], $b->[-1]); + $cmp + } @rows; + @rows= reverse @rows if $self->{in_reverse}; + + if ($self->{as_cumulative}) { + my $sum= []; + for my $row (@rows) { + do { + $sum->[$_] += $row->[$_]; + $row->[$_]= $sum->[$_]; + } + for 0 .. $#types; + } + } + + if ($self->{as_percentage}) { + for my $row (@rows) { + $row->[$_]= sprintf "%.2f", ($row->[$_] / $total[$_]) * 100 + for 0 .. $#types; + } + } + + foreach my $row (@rows) { + my $name= $row->[-1]; + $name =~ s/\s+<.*\z//; + $name =~ s/\s+\@.*\z//; + $row->[-1]= $name; + } + my @col_names= map { $pretty_name{$_} // $_ } @types; + if ($self->{as_percentage}) { + $_= "%$_" for @col_names; + } + push @col_names, map { $pretty_name{$_} // $_ } @extra; + + if ($self->{as_list} && @types == 1) { + $self->_report_list(\@rows, \@types, \@extra, \@col_names); + } + else { + $self->_report_table(\@rows, \@types, \@extra, \@col_names); + } +} + +sub _report_table { + my ($self, $rows, $types, $extra, $col_names)= @_; + my $pos= 1; + unshift @$_, $pos++ for @$rows; + unshift @$col_names, "Pos"; + my @width= (0) x @$col_names; + foreach my $row ($col_names, @$rows) { + for my $idx (0 .. $#$row) { + $width[$idx] < length($row->[$idx]) + and $width[$idx]= length($row->[$idx]); + } + } + $width[-1]= 40 if $width[-1] > 40; + $width[$_]= -$width[$_] for 0, -1; + my $fmt= "#" . join(" | ", ("%*s") x @$col_names) . "\n"; + my $bar_fmt= "#" . join("-+-", ("%*s") x @$col_names) . "\n"; + printf $fmt, map { $width[$_], $col_names->[$_] } 0 .. $#width; + printf $bar_fmt, map { $width[$_], "-" x abs($width[$_]) } 0 .. $#width; + for my $idx (0 .. $#$rows) { + my $row= $rows->[$idx]; + print encode_utf8 sprintf $fmt, + map { $width[$_], $row->[$_] } 0 .. $#width; + } +} + +sub _report_list { + my ($self, $rows, $types, $extra, $col_names)= @_; + my %hash; + foreach my $row (@$rows) { + $hash{ $row->[0] }{ $row->[-1] }++; + } + my @vals= sort { $b <=> $a } keys %hash; # numeric sort + my $width= length($col_names->[0]); + $width < length($_) and $width= length($_) for @vals; + @vals= reverse @vals if $self->{in_reverse}; + + my $hdr_str= sprintf "%*s | %s", $width, $col_names->[0], $col_names->[-1]; + my $sep_str= sprintf "%*s-+-%s", $width, "-" x $width, "-" x 40; + my $fmt= "%*s | %s"; + + if ($self->{with_rank_numbers}) { + $hdr_str= sprintf "#%*s | %s", -length(0 + @$rows), "Pos", $hdr_str; + $sep_str= sprintf "#%*s-+-%s", -length(0 + @$rows), + "-" x length(0 + @$rows), $hdr_str; + } + print $hdr_str, "\n"; + print $sep_str, "\n"; + my $pos= 1; + foreach my $val (@vals) { + my $val_f= sprintf "%*s | ", $width, $val; + $val_f= sprintf "#%*d | %s", -length(0 + @$rows), $pos++, $val_f + if $self->{with_rank_numbers}; + print encode_utf8 wrap $val_f, + " " x length($val_f), + join(", ", $Collate->sort(keys %{ $hash{$val} })) . "\n"; + } +} + +sub _filter_sort_who { + my ($self, $hash)= @_; + my @who; + foreach my $name ($Collate->sort(keys %$hash)) { + $name =~ s/\s+<.*\z//; + $name =~ s/\s+\@.*\z//; + push @who, $name if length $name and lc($name) ne "unknown"; + } + return @who; +} + +sub print_who { + my ($self)= @_; + my @who= $self->_filter_sort_who($self->{who_stats}); + print encode_utf8 wrap "", "", join(", ", @who) . ".\n"; +} + +1; +__END__ + +=head1 NAME + +Porting::updateAUTHORS - Library to automatically update AUTHORS and .mailmap based on commit data. + +=head1 SYNOPSIS + + use Porting::updateAUTHORS; + + my $updater= Porting::updateAUTHORS->new( + authors_file => "AUTHORS", + mailmap_file => ".mailmap", + exclude_file => "Porting/exclude_contrib.txt", + ); + $updater->read_and_update(); + +=head1 DESCRIPTION + +This the brain of the F script. It is expected +to be used B that script and B that script. Most features and +options are documented in the F and are not +explicitly documented here, read the F manpage +for more details. + +=head1 METHODS + +Porting::updateAUTHORS uses OO as way of managing its internal state. +This documents the public methods it exposes. + +=over 4 + +=item add_new_mailmap_entries() + +If any additions were identified while reading the commits this will +inject them into the mailmap_hash so they can be written out. Returns a +count of additions found. + +=item check_fix_mailmap_hash() + +Analyzes the data contained the in the .mailmap file and applies any +automated fixes which are required and which it can automatically +perform. Returns a hash of adjusted entries and a hash with additional +metadata about the mailmap entries. + +=item new(%opts) + +Create a new object. Required parameters are + + authors_file + mailmap_file + exclude_file + +Other supported parameters are as follows: + + verbose + commit_range + +this list is not exhaustive. See the code implementing the main() +function in F for an exhaustive list. + +=item parse_orig_mailmap_hash() + +Takes a mailmap_hash and parses it and returns it as an array of array +records with the contents: + + [ $preferred_name, $preferred_email, + $other_name, $other_email, + $line_num ] + +=item read_and_update() + +Wraps the other functions in this library and implements the logic and +intent of this tool. Takes two arguments, the authors file name, and the +mailmap file name. Returns nothing but may modify the AUTHORS file +or the .mailmap file. Requires that both files are editable. + +=item read_commit_log() + +Read the commit log specified by the property "commit_range" and find +any new names it contains. + +Normally used via C and not called directly. + +=item read_authors_file() + +Read the AUTHORS file into the object, and return data about it. + +Normally used via C and not called directly. + +=item read_mailmap_file() + +Read the .mailmap file into the object and return data about it. + +Normally used via C and not called directly. + +=item read_exclusion_file() + +Read the exclusion file into the object and return data about it. + +Normally used via C and not called directly. + +=item update_authors_file() + +Write out an updated AUTHORS file atomically if it has changed, +returns 0 if the file was actually updated, 1 if it was not. + +Normally used via C and not called directly. + +=item update_mailmap_file() + +Write out an updated .mailmap file atomically if it has changed, +returns 0 if the file was actually updated, 1 if it was not. + +Normally used via C and not called directly. + +=item update_exclusion_file() + +Write out an updated exclusion file atomically if it has changed, +returns 0 if the file was actually update, 1 if it was not. + +Normally used via C and not called directly. + +=back + +=head1 TODO + +More documentation and testing. + +=head1 SEE ALSO + +F + +=head1 AUTHOR + +Yves Orton + +=cut Index: gnu/usr.bin/perl/Porting/vote_admin_guide.pod =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/Porting/vote_admin_guide.pod,v diff -u -p -a -u -p -r1.1.1.1 vote_admin_guide.pod --- gnu/usr.bin/perl/Porting/vote_admin_guide.pod 15 Feb 2023 01:33:11 -0000 1.1.1.1 +++ gnu/usr.bin/perl/Porting/vote_admin_guide.pod 21 Feb 2024 15:47:00 -0000 @@ -172,11 +172,11 @@ edit the Perl Core mailing list admins t =item * -update the GitHub "steering" team to match incoming Steering Council +update the L to match incoming Steering Council =item * -request that the Perl NOC update the perl-security list to include all incoming +request that the L update the perl-security list to include all incoming Steering Council members (without removing outgoing members; the incoming Steering Council will decide whether this is needed) Index: gnu/usr.bin/perl/amigaos4/amigaio.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/amigaos4/amigaio.c,v diff -u -p -a -u -p -r1.4 amigaio.c --- gnu/usr.bin/perl/amigaos4/amigaio.c 15 Feb 2023 01:36:14 -0000 1.4 +++ gnu/usr.bin/perl/amigaos4/amigaio.c 21 Feb 2024 15:47:00 -0000 @@ -249,7 +249,7 @@ PerlIO *Perl_my_popen(pTHX_ const char * } /* Our new process is running and will close it streams etc - * once its done. All we need to is open the pipe via stdio + * once it's done. All we need to is open the pipe via stdio */ return result; Index: gnu/usr.bin/perl/cpan/AutoLoader/t/02AutoSplit.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/AutoLoader/t/02AutoSplit.t,v diff -u -p -a -u -p -r1.1.1.1 02AutoSplit.t --- gnu/usr.bin/perl/cpan/AutoLoader/t/02AutoSplit.t 24 Sep 2010 14:49:05 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/AutoLoader/t/02AutoSplit.t 21 Feb 2024 15:47:01 -0000 @@ -149,8 +149,12 @@ foreach (@tests) { if ($args{Files}) { $args{Files} =~ s!/!:!gs if $^O eq 'MacOS'; + $args{Files} =~ s!\\!/!g if $^O eq 'MSWin32'; my (%missing, %got); - find (sub {$got{$File::Find::name}++ unless -d $_}, $dir); + find( + sub { (my $f = $File::Find::name) =~ s!\\!/!g; $got{$f}++ unless -d $_ }, + $dir + ); foreach (split /\n/, $args{Files}) { next if /^#/; $_ = lc($_) if $Is_VMS_lc; Index: gnu/usr.bin/perl/cpan/CPAN/lib/CPAN.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/CPAN/lib/CPAN.pm,v diff -u -p -a -u -p -r1.7 CPAN.pm --- gnu/usr.bin/perl/cpan/CPAN/lib/CPAN.pm 15 Feb 2023 01:36:15 -0000 1.7 +++ gnu/usr.bin/perl/cpan/CPAN/lib/CPAN.pm 21 Feb 2024 15:47:00 -0000 @@ -2,7 +2,7 @@ # vim: ts=4 sts=4 sw=4: use strict; package CPAN; -$CPAN::VERSION = '2.33'; +$CPAN::VERSION = '2.36'; $CPAN::VERSION =~ s/_//; # we need to run chdir all over and we would get at wrong libraries Index: gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/Distribution.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/Distribution.pm,v diff -u -p -a -u -p -r1.7 Distribution.pm --- gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/Distribution.pm 15 Feb 2023 01:36:15 -0000 1.7 +++ gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/Distribution.pm 21 Feb 2024 15:47:00 -0000 @@ -9,7 +9,7 @@ use File::Path (); use POSIX ":sys_wait_h"; @CPAN::Distribution::ISA = qw(CPAN::InfoObj); use vars qw($VERSION); -$VERSION = "2.33"; +$VERSION = "2.34"; my $run_allow_installing_within_test = 1; # boolean; either in test or in install, there is no third option @@ -2950,7 +2950,7 @@ sub prereqs_for_slot { } if (-f "Build.PL" && ! -f File::Spec->catfile($self->{build_dir},"Makefile.PL") - && ! $merged->requirements_for_module("Module::Build") + && ! @{[ $merged->required_modules ]} && ! $CPAN::META->has_inst("Module::Build") ) { $CPAN::Frontend->mywarn( Index: gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/HTTP/Client.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/HTTP/Client.pm,v diff -u -p -a -u -p -r1.3 Client.pm --- gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/HTTP/Client.pm 5 Feb 2017 00:31:55 -0000 1.3 +++ gnu/usr.bin/perl/cpan/CPAN/lib/CPAN/HTTP/Client.pm 21 Feb 2024 15:47:00 -0000 @@ -6,7 +6,7 @@ use vars qw(@ISA); use CPAN::HTTP::Credentials; use HTTP::Tiny 0.005; -$CPAN::HTTP::Client::VERSION = $CPAN::HTTP::Client::VERSION = "1.9601"; +$CPAN::HTTP::Client::VERSION = $CPAN::HTTP::Client::VERSION = "1.9602"; # CPAN::HTTP::Client is adapted from parts of cpanm by Tatsuhiko Miyagawa # and parts of LWP by Gisle Aas @@ -32,6 +32,7 @@ sub mirror { my $want_proxy = $self->_want_proxy($uri); my $http = HTTP::Tiny->new( + verify_SSL => 1, $want_proxy ? (proxy => $self->{proxy}) : () ); Index: gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/Bzip2.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/Bzip2.xs,v diff -u -p -a -u -p -r1.5 Bzip2.xs --- gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/Bzip2.xs 15 Feb 2023 01:36:15 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/Bzip2.xs 21 Feb 2024 15:47:00 -0000 @@ -391,7 +391,7 @@ new(className, appendOut=1, blockSize100 SV* obj = sv_2mortal(newSViv(PTR2IV(s))) ; XPUSHs(obj); } - if (GIMME == G_ARRAY) { + if (GIMME_V == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); XPUSHs(sv) ; @@ -447,7 +447,7 @@ new(className, appendOut=1 , consume=1, SV* obj = sv_2mortal(newSViv(PTR2IV(s))) ; XPUSHs(obj); } - if (GIMME == G_ARRAY) { + if (GIMME_V == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); XPUSHs(sv) ; Index: gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/blocksort.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/blocksort.c,v diff -u -p -a -u -p -r1.4 blocksort.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/blocksort.c 9 Apr 2020 01:32:13 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/blocksort.c 21 Feb 2024 15:47:00 -0000 @@ -11,7 +11,7 @@ bzip2/libbzip2 version 1.0.8 of 13 July 2019 Copyright (C) 1996-2019 Julian Seward - Please read the WARNING, DISCLAIMER and PATENTS sections in the + Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained @@ -27,11 +27,11 @@ /*---------------------------------------------*/ /*---------------------------------------------*/ -static +static __inline__ -void fallbackSimpleSort ( UInt32* fmap, - UInt32* eclass, - Int32 lo, +void fallbackSimpleSort ( UInt32* fmap, + UInt32* eclass, + Int32 lo, Int32 hi ) { Int32 i, j, tmp; @@ -90,9 +90,9 @@ void fallbackSimpleSort ( UInt32* fmap, static -void fallbackQSort3 ( UInt32* fmap, +void fallbackQSort3 ( UInt32* fmap, UInt32* eclass, - Int32 loSt, + Int32 loSt, Int32 hiSt ) { Int32 unLo, unHi, ltLo, gtHi, n, m; @@ -117,9 +117,9 @@ void fallbackQSort3 ( UInt32* fmap, } /* Random partitioning. Median of 3 sometimes fails to - avoid bad cases. Median of 9 seems to help but + avoid bad cases. Median of 9 seems to help but looks rather expensive. This too seems to work but - is cheaper. Guidance for the magic constants + is cheaper. Guidance for the magic constants 7621 and 32768 is taken from Sedgewick's algorithms book, chapter 35. */ @@ -136,10 +136,10 @@ void fallbackQSort3 ( UInt32* fmap, while (1) { if (unLo > unHi) break; n = (Int32)eclass[fmap[unLo]] - (Int32)med; - if (n == 0) { - fswap(fmap[unLo], fmap[ltLo]); - ltLo++; unLo++; - continue; + if (n == 0) { + fswap(fmap[unLo], fmap[ltLo]); + ltLo++; unLo++; + continue; }; if (n > 0) break; unLo++; @@ -147,10 +147,10 @@ void fallbackQSort3 ( UInt32* fmap, while (1) { if (unLo > unHi) break; n = (Int32)eclass[fmap[unHi]] - (Int32)med; - if (n == 0) { - fswap(fmap[unHi], fmap[gtHi]); - gtHi--; unHi--; - continue; + if (n == 0) { + fswap(fmap[unHi], fmap[gtHi]); + gtHi--; unHi--; + continue; }; if (n < 0) break; unHi--; @@ -209,8 +209,8 @@ void fallbackQSort3 ( UInt32* fmap, #define UNALIGNED_BH(zz) ((zz) & 0x01f) static -void fallbackSort ( UInt32* fmap, - UInt32* eclass, +void fallbackSort ( UInt32* fmap, + UInt32* eclass, UInt32* bhtab, Int32 nblock, Int32 verb ) @@ -251,7 +251,7 @@ void fallbackSort ( UInt32* fmap, --*/ /*-- set sentinel bits for block-end detection --*/ - for (i = 0; i < 32; i++) { + for (i = 0; i < 32; i++) { SET_BH(nblock + 2*i); CLEAR_BH(nblock + 2*i + 1); } @@ -260,7 +260,7 @@ void fallbackSort ( UInt32* fmap, H = 1; while (1) { - if (verb >= 4) + if (verb >= 4) VPrintf1 ( " depth %6d has ", H ); j = 0; @@ -305,14 +305,14 @@ void fallbackSort ( UInt32* fmap, } } - if (verb >= 4) + if (verb >= 4) VPrintf1 ( "%6d unresolved strings\n", nNotDone ); H *= 2; if (H > nblock || nNotDone == 0) break; } - /*-- + /*-- Reconstruct the original block in eclass8 [0 .. nblock-1], since the previous phase destroyed it. @@ -344,9 +344,9 @@ void fallbackSort ( UInt32* fmap, /*---------------------------------------------*/ static __inline__ -Bool mainGtU ( UInt32 i1, +Bool mainGtU ( UInt32 i1, UInt32 i2, - UChar* block, + UChar* block, UInt16* quadrant, UInt32 nblock, Int32* budget ) @@ -486,8 +486,8 @@ void mainSimpleSort ( UInt32* ptr, UChar* block, UInt16* quadrant, Int32 nblock, - Int32 lo, - Int32 hi, + Int32 lo, + Int32 hi, Int32 d, Int32* budget ) { @@ -511,8 +511,8 @@ void mainSimpleSort ( UInt32* ptr, if (i > hi) break; v = ptr[i]; j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget + while ( mainGtU ( + ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; @@ -525,8 +525,8 @@ void mainSimpleSort ( UInt32* ptr, if (i > hi) break; v = ptr[i]; j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget + while ( mainGtU ( + ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; @@ -539,8 +539,8 @@ void mainSimpleSort ( UInt32* ptr, if (i > hi) break; v = ptr[i]; j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget + while ( mainGtU ( + ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; @@ -578,13 +578,13 @@ void mainSimpleSort ( UInt32* ptr, } \ } -static +static __inline__ UChar mmed3 ( UChar a, UChar b, UChar c ) { UChar t; if (a > b) { t = a; a = b; b = t; }; - if (b > c) { + if (b > c) { b = c; if (a > b) b = a; } @@ -622,8 +622,8 @@ void mainQSort3 ( UInt32* ptr, UChar* block, UInt16* quadrant, Int32 nblock, - Int32 loSt, - Int32 hiSt, + Int32 loSt, + Int32 hiSt, Int32 dSt, Int32* budget ) { @@ -646,14 +646,14 @@ void mainQSort3 ( UInt32* ptr, AssertH ( sp < MAIN_QSORT_STACK_SIZE - 2, 1001 ); mpop ( lo, hi, d ); - if (hi - lo < MAIN_QSORT_SMALL_THRESH || + if (hi - lo < MAIN_QSORT_SMALL_THRESH || d > MAIN_QSORT_DEPTH_THRESH) { mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); if (*budget < 0) return; continue; } - med = (Int32) + med = (Int32) mmed3 ( block[ptr[ lo ]+d], block[ptr[ hi ]+d], block[ptr[ (lo+hi)>>1 ]+d] ); @@ -665,9 +665,9 @@ void mainQSort3 ( UInt32* ptr, while (True) { if (unLo > unHi) break; n = ((Int32)block[ptr[unLo]+d]) - med; - if (n == 0) { - mswap(ptr[unLo], ptr[ltLo]); - ltLo++; unLo++; continue; + if (n == 0) { + mswap(ptr[unLo], ptr[ltLo]); + ltLo++; unLo++; continue; }; if (n > 0) break; unLo++; @@ -675,9 +675,9 @@ void mainQSort3 ( UInt32* ptr, while (True) { if (unLo > unHi) break; n = ((Int32)block[ptr[unHi]+d]) - med; - if (n == 0) { - mswap(ptr[unHi], ptr[gtHi]); - gtHi--; unHi--; continue; + if (n == 0) { + mswap(ptr[unHi], ptr[gtHi]); + gtHi--; unHi--; continue; }; if (n < 0) break; unHi--; @@ -748,9 +748,9 @@ void mainQSort3 ( UInt32* ptr, #define CLEARMASK (~(SETMASK)) static -void mainSort ( UInt32* ptr, +void mainSort ( UInt32* ptr, UChar* block, - UInt16* quadrant, + UInt16* quadrant, UInt32* ftab, Int32 nblock, Int32 verb, @@ -878,7 +878,7 @@ void mainSort ( UInt32* ptr, /*-- Step 1: Complete the big bucket [ss] by quicksorting - any unsorted small buckets [ss, j], for j != ss. + any unsorted small buckets [ss, j], for j != ss. Hopefully previous pointer-scanning phases have already completed many of the small buckets [ss, j], so we don't have to sort them at all. @@ -894,10 +894,10 @@ void mainSort ( UInt32* ptr, VPrintf4 ( " qsort [0x%x, 0x%x] " "done %d this %d\n", ss, j, numQSorted, hi - lo + 1 ); - mainQSort3 ( - ptr, block, quadrant, nblock, - lo, hi, BZ_N_RADIX, budget - ); + mainQSort3 ( + ptr, block, quadrant, nblock, + lo, hi, BZ_N_RADIX, budget + ); numQSorted += (hi - lo + 1); if (*budget < 0) return; } @@ -929,16 +929,16 @@ void mainSort ( UInt32* ptr, for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) { k = ptr[j]-1; if (k < 0) k += nblock; c1 = block[k]; - if (!bigDone[c1]) + if (!bigDone[c1]) ptr[ copyEnd[c1]-- ] = k; } } AssertH ( (copyStart[ss]-1 == copyEnd[ss]) - || + || /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1. - Necessity for this case is demonstrated by compressing - a sequence of approximately 48.5 million of character + Necessity for this case is demonstrated by compressing + a sequence of approximately 48.5 million of character 251; 1.0.0/1.0.1 will then die here. */ (copyStart[ss] == 0 && copyEnd[ss] == nblock-1), 1007 ) @@ -955,7 +955,7 @@ void mainSort ( UInt32* ptr, updating for the last bucket is pointless. The quadrant array provides a way to incrementally - cache sort orderings, as they appear, so as to + cache sort orderings, as they appear, so as to make subsequent comparisons in fullGtU() complete faster. For repetitive blocks this makes a big difference (but not big enough to be able to avoid @@ -965,9 +965,9 @@ void mainSort ( UInt32* ptr, for 0 <= i < nblock and 0 <= j <= nblock - if block[i] != block[j], + if block[i] != block[j], - then the relative values of quadrant[i] and + then the relative values of quadrant[i] and quadrant[j] are meaningless. else { @@ -1030,7 +1030,7 @@ void mainSort ( UInt32* ptr, */ void BZ2_blockSort ( EState* s ) { - UInt32* ptr = s->ptr; + UInt32* ptr = s->ptr; UChar* block = s->block; UInt32* ftab = s->ftab; Int32 nblock = s->nblock; @@ -1054,8 +1054,8 @@ void BZ2_blockSort ( EState* s ) quadrant = (UInt16*)(&(block[i])); /* (wfact-1) / 3 puts the default-factor-30 - transition point at very roughly the same place as - with v0.1 and v0.9.0. + transition point at very roughly the same place as + with v0.1 and v0.9.0. Not that it particularly matters any more, since the resulting compressed stream is now the same regardless of whether or not we use the main sort or fallback sort. @@ -1066,14 +1066,14 @@ void BZ2_blockSort ( EState* s ) budget = budgetInit; mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget ); - if (verb >= 3) + if (verb >= 3) VPrintf3 ( " %d work, %d block, ratio %5.2f\n", budgetInit - budget, - nblock, + nblock, (float)(budgetInit - budget) / - (float)(nblock==0 ? 1 : nblock) ); + (float)(nblock==0 ? 1 : nblock) ); if (budget < 0) { - if (verb >= 2) + if (verb >= 2) VPrintf0 ( " too repetitive; using fallback" " sorting algorithm\n" ); fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); Index: gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/bzlib.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/bzlib.c,v diff -u -p -a -u -p -r1.6 bzlib.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/bzlib.c 15 Feb 2023 01:36:15 -0000 1.6 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/bzlib.c 21 Feb 2024 15:47:00 -0000 @@ -1415,7 +1415,7 @@ BZFILE * bzopen_or_bzdopen case 's': smallMode = 1; break; default: - if (isdigit((int)(*mode))) { + if (isdigit((unsigned char)(*mode))) { blockSize100k = *mode-BZ_HDR_0; } } Index: gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/compress.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/compress.c,v diff -u -p -a -u -p -r1.7 compress.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/compress.c 15 Feb 2023 01:36:15 -0000 1.7 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/compress.c 21 Feb 2024 15:47:00 -0000 @@ -11,7 +11,7 @@ bzip2/libbzip2 version 1.0.8 of 13 July 2019 Copyright (C) 1996-2019 Julian Seward - Please read the WARNING, DISCLAIMER and PATENTS sections in the + Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained @@ -22,7 +22,7 @@ /* CHANGES 0.9.0 -- original version. 0.9.0a/b -- no changes in this file. - 0.9.0c -- changed setting of nGroups in sendMTFValues() + 0.9.0c -- changed setting of nGroups in sendMTFValues() so as to do a bit better on small files */ @@ -125,11 +125,11 @@ void generateMTFValues ( EState* s ) Int32 wr; Int32 EOB; - /* + /* After sorting (eg, here), s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, and - ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] + ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] holds the original block data. The first thing to do is generate the MTF values, @@ -144,7 +144,7 @@ void generateMTFValues ( EState* s ) (UChar*) (&((UChar*)s->arr2)[s->nblock]) These storage aliases are set up in bzCompressInit(), - except for the last one, which is arranged in + except for the last one, which is arranged in compressBlock(). */ UInt32* ptr = s->ptr; @@ -167,7 +167,7 @@ void generateMTFValues ( EState* s ) ll_i = s->unseqToSeq[block[j]]; AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" ); - if (yy[0] == ll_i) { + if (yy[0] == ll_i) { zPend++; } else { @@ -175,11 +175,11 @@ void generateMTFValues ( EState* s ) zPend--; while (True) { if (zPend & 1) { - mtfv[wr] = BZ_RUNB; wr++; - s->mtfFreq[BZ_RUNB]++; + mtfv[wr] = BZ_RUNB; wr++; + s->mtfFreq[BZ_RUNB]++; } else { - mtfv[wr] = BZ_RUNA; wr++; - s->mtfFreq[BZ_RUNA]++; + mtfv[wr] = BZ_RUNA; wr++; + s->mtfFreq[BZ_RUNA]++; } if (zPend < 2) break; zPend = (zPend - 2) / 2; @@ -187,15 +187,15 @@ void generateMTFValues ( EState* s ) zPend = 0; } { - register UChar rtmp; - register UChar* ryy_j; - register UChar rll_i; + UChar rtmp; + UChar* ryy_j; + UChar rll_i; rtmp = yy[1]; yy[1] = yy[0]; ryy_j = &(yy[1]); rll_i = ll_i; while ( rll_i != rtmp ) { - register UChar rtmp2; + UChar rtmp2; ryy_j++; rtmp2 = rtmp; rtmp = *ryy_j; @@ -213,11 +213,11 @@ void generateMTFValues ( EState* s ) zPend--; while (True) { if (zPend & 1) { - mtfv[wr] = BZ_RUNB; wr++; - s->mtfFreq[BZ_RUNB]++; + mtfv[wr] = BZ_RUNB; wr++; + s->mtfFreq[BZ_RUNB]++; } else { - mtfv[wr] = BZ_RUNA; wr++; - s->mtfFreq[BZ_RUNA]++; + mtfv[wr] = BZ_RUNA; wr++; + s->mtfFreq[BZ_RUNA]++; } if (zPend < 2) break; zPend = (zPend - 2) / 2; @@ -261,7 +261,7 @@ void sendMTFValues ( EState* s ) ((void)nBytes); /* Silence variable ‘nBytes’ set but not used warning */ if (s->verbosity >= 3) VPrintf3( " %d in block, %d after MTF & 1-2 coding, " - "%d+2 syms in use\n", + "%d+2 syms in use\n", s->nblock, s->nMTF, s->nInUse ); alphaSize = s->nInUse+2; @@ -278,7 +278,7 @@ void sendMTFValues ( EState* s ) nGroups = 6; /*--- Generate an initial set of coding tables ---*/ - { + { Int32 nPart, remF, tFreq, aFreq; nPart = nGroups; @@ -293,8 +293,8 @@ void sendMTFValues ( EState* s ) aFreq += s->mtfFreq[ge]; } - if (ge > gs - && nPart != nGroups && nPart != 1 + if (ge > gs + && nPart != nGroups && nPart != 1 && ((nGroups-nPart) % 2 == 1)) { aFreq -= s->mtfFreq[ge]; ge--; @@ -303,21 +303,21 @@ void sendMTFValues ( EState* s ) if (s->verbosity >= 3) VPrintf5( " initial group %d, [%d .. %d], " "has %d syms (%4.1f%%)\n", - nPart, gs, ge, aFreq, + nPart, gs, ge, aFreq, (100.0 * (float)aFreq) / (float)(s->nMTF) ); - + for (v = 0; v < alphaSize; v++) - if (v >= gs && v <= ge) + if (v >= gs && v <= ge) s->len[nPart-1][v] = BZ_LESSER_ICOST; else s->len[nPart-1][v] = BZ_GREATER_ICOST; - + nPart--; gs = ge+1; remF -= aFreq; } } - /*--- + /*--- Iterate up to BZ_N_ITERS times to improve the tables. ---*/ for (iter = 0; iter < BZ_N_ITERS; iter++) { @@ -330,7 +330,7 @@ void sendMTFValues ( EState* s ) /*--- Set up an auxiliary length table which is used to fast-track - the common case (nGroups == 6). + the common case (nGroups == 6). ---*/ if (nGroups == 6) { for (v = 0; v < alphaSize; v++) { @@ -347,10 +347,10 @@ void sendMTFValues ( EState* s ) /*--- Set group start & end marks. --*/ if (gs >= s->nMTF) break; - ge = gs + BZ_G_SIZE - 1; + ge = gs + BZ_G_SIZE - 1; if (ge >= s->nMTF) ge = s->nMTF-1; - /*-- + /*-- Calculate the cost of this group as coded by each of the coding tables. --*/ @@ -358,8 +358,8 @@ void sendMTFValues ( EState* s ) if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ - register UInt32 cost01, cost23, cost45; - register UInt16 icv; + UInt32 cost01, cost23, cost45; + UInt16 icv; cost01 = cost23 = cost45 = 0; # define BZ_ITER(nn) \ @@ -387,13 +387,13 @@ void sendMTFValues ( EState* s ) } else { /*--- slow version which correctly handles all situations ---*/ - for (i = gs; i <= ge; i++) { + for (i = gs; i <= ge; i++) { UInt16 icv = mtfv[i]; for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; } } - - /*-- + + /*-- Find the coding table which is best for this group, and record its identity in the selector table. --*/ @@ -405,7 +405,7 @@ void sendMTFValues ( EState* s ) s->selector[nSelectors] = bt; nSelectors++; - /*-- + /*-- Increment the symbol frequencies for the selected table. --*/ if (nGroups == 6 && 50 == ge-gs+1) { @@ -435,7 +435,7 @@ void sendMTFValues ( EState* s ) gs = ge+1; } if (s->verbosity >= 3) { - VPrintf2 ( " pass %d: size is %d, grp uses are ", + VPrintf2 ( " pass %d: size is %d, grp uses are ", iter+1, totc/8 ); for (t = 0; t < nGroups; t++) VPrintf1 ( "%d ", fave[t] ); @@ -445,10 +445,10 @@ void sendMTFValues ( EState* s ) /*-- Recompute the tables based on the accumulated frequencies. --*/ - /* maxLen was changed from 20 to 17 in bzip2-1.0.3. See + /* maxLen was changed from 20 to 17 in bzip2-1.0.3. See comment in huffman.c for details. */ for (t = 0; t < nGroups; t++) - BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), + BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), alphaSize, 17 /*20*/ ); } @@ -488,19 +488,19 @@ void sendMTFValues ( EState* s ) } AssertH ( !(maxLen > 17 /*20*/ ), 3004 ); AssertH ( !(minLen < 1), 3005 ); - BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), + BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), minLen, maxLen, alphaSize ); } /*--- Transmit the mapping table. ---*/ - { + { Bool inUse16[16]; for (i = 0; i < 16; i++) { inUse16[i] = False; for (j = 0; j < 16; j++) if (s->inUse[i * 16 + j]) inUse16[i] = True; } - + nBytes = s->numZ; for (i = 0; i < 16; i++) if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); @@ -511,7 +511,7 @@ void sendMTFValues ( EState* s ) if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); } - if (s->verbosity >= 3) + if (s->verbosity >= 3) VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes ); } @@ -519,7 +519,7 @@ void sendMTFValues ( EState* s ) nBytes = s->numZ; bsW ( s, 3, nGroups ); bsW ( s, 15, nSelectors ); - for (i = 0; i < nSelectors; i++) { + for (i = 0; i < nSelectors; i++) { for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); bsW(s,1,0); } @@ -548,14 +548,14 @@ void sendMTFValues ( EState* s ) gs = 0; while (True) { if (gs >= s->nMTF) break; - ge = gs + BZ_G_SIZE - 1; + ge = gs + BZ_G_SIZE - 1; if (ge >= s->nMTF) ge = s->nMTF-1; AssertH ( s->selector[selCtr] < nGroups, 3006 ); if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ UInt16 mtfv_i; - UChar* s_len_sel_selCtr + UChar* s_len_sel_selCtr = &(s->len[s->selector[selCtr]][0]); Int32* s_code_sel_selCtr = &(s->code[s->selector[selCtr]][0]); @@ -582,7 +582,7 @@ void sendMTFValues ( EState* s ) } else { /*--- slow version which correctly handles all situations ---*/ for (i = gs; i <= ge; i++) { - bsW ( s, + bsW ( s, s->len [s->selector[selCtr]] [mtfv[i]], s->code [s->selector[selCtr]] [mtfv[i]] ); } @@ -637,8 +637,8 @@ void BZ2_compressBlock ( EState* s, Bool /*-- Now the block's CRC, so it is in a known place. --*/ bsPutUInt32 ( s, s->blockCRC ); - /*-- - Now a single bit indicating (non-)randomisation. + /*-- + Now a single bit indicating (non-)randomisation. As of version 0.9.5, we use a better sorting algorithm which makes randomisation unnecessary. So always set the randomised bit to 'no'. Of course, the decoder Index: gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/crctable.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/crctable.c,v diff -u -p -a -u -p -r1.4 crctable.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/crctable.c 9 Apr 2020 01:32:13 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/crctable.c 21 Feb 2024 15:47:00 -0000 @@ -11,7 +11,7 @@ bzip2/libbzip2 version 1.0.8 of 13 July 2019 Copyright (C) 1996-2019 Julian Seward - Please read the WARNING, DISCLAIMER and PATENTS sections in the + Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained Index: gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/decompress.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/decompress.c,v diff -u -p -a -u -p -r1.4 decompress.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/decompress.c 1 Mar 2021 23:19:45 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/decompress.c 21 Feb 2024 15:47:00 -0000 @@ -11,7 +11,7 @@ bzip2/libbzip2 version 1.0.8 of 13 July 2019 Copyright (C) 1996-2019 Julian Seward - Please read the WARNING, DISCLAIMER and PATENTS sections in the + Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained @@ -128,7 +128,7 @@ Int32 BZ2_decompress ( DState* s ) Int32 N; Int32 curr; Int32 zt; - Int32 zn; + Int32 zn; Int32 zvec; Int32 zj; Int32 gSel; @@ -182,7 +182,7 @@ Int32 BZ2_decompress ( DState* s ) N = s->save_N; curr = s->save_curr; zt = s->save_zt; - zn = s->save_zn; + zn = s->save_zn; zvec = s->save_zvec; zj = s->save_zj; gSel = s->save_gSel; @@ -205,14 +205,14 @@ Int32 BZ2_decompress ( DState* s ) if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) - if (s->blockSize100k < (BZ_HDR_0 + 1) || + if (s->blockSize100k < (BZ_HDR_0 + 1) || s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); s->blockSize100k -= BZ_HDR_0; if (s->smallDecompress) { s->ll16 = (UInt16*) BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); - s->ll4 = (UChar*) BZALLOC( - ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) + s->ll4 = (UChar*) BZALLOC( + ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) ); if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); } else { @@ -238,7 +238,7 @@ Int32 BZ2_decompress ( DState* s ) s->currBlockNo++; if (s->verbosity >= 2) VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); - + s->storedBlockCRC = 0; GET_UCHAR(BZ_X_BCRC_1, uc); s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); @@ -261,14 +261,14 @@ Int32 BZ2_decompress ( DState* s ) if (s->origPtr < 0) RETURN(BZ_DATA_ERROR); - if (s->origPtr > 10 + 100000*s->blockSize100k) + if (s->origPtr > 10 + 100000*s->blockSize100k) RETURN(BZ_DATA_ERROR); /*--- Receive the mapping table ---*/ for (i = 0; i < 16; i++) { GET_BIT(BZ_X_MAPPING_1, uc); - if (uc == 1) - s->inUse16[i] = True; else + if (uc == 1) + s->inUse16[i] = True; else s->inUse16[i] = False; } @@ -310,7 +310,7 @@ Int32 BZ2_decompress ( DState* s ) { UChar pos[BZ_N_GROUPS], tmp, v; for (v = 0; v < nGroups; v++) pos[v] = v; - + for (i = 0; i < nSelectors; i++) { v = s->selectorMtf[i]; tmp = pos[v]; @@ -343,10 +343,10 @@ Int32 BZ2_decompress ( DState* s ) if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; if (s->len[t][i] < minLen) minLen = s->len[t][i]; } - BZ2_hbCreateDecodeTables ( - &(s->limit[t][0]), - &(s->base[t][0]), - &(s->perm[t][0]), + BZ2_hbCreateDecodeTables ( + &(s->limit[t][0]), + &(s->base[t][0]), + &(s->perm[t][0]), &(s->len[t][0]), minLen, maxLen, alphaSize ); @@ -445,23 +445,23 @@ Int32 BZ2_decompress ( DState* s ) s->mtfa[(z)-3] = s->mtfa[(z)-4]; nn -= 4; } - while (nn > 0) { - s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; + while (nn > 0) { + s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; }; s->mtfa[pp] = uc; - } else { + } else { /* general case */ lno = nn / MTFL_SIZE; off = nn % MTFL_SIZE; pp = s->mtfbase[lno] + off; uc = s->mtfa[pp]; - while (pp > s->mtfbase[lno]) { - s->mtfa[pp] = s->mtfa[pp-1]; pp--; + while (pp > s->mtfbase[lno]) { + s->mtfa[pp] = s->mtfa[pp-1]; pp--; }; s->mtfbase[lno]++; while (lno > 0) { s->mtfbase[lno]--; - s->mtfa[s->mtfbase[lno]] + s->mtfa[s->mtfbase[lno]] = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; lno--; } @@ -556,7 +556,7 @@ Int32 BZ2_decompress ( DState* s ) if (s->blockRandomised) { BZ_RAND_INIT_MASK; BZ_GET_SMALL(s->k0); s->nblock_used++; - BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; + BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; } else { BZ_GET_SMALL(s->k0); s->nblock_used++; } @@ -575,7 +575,7 @@ Int32 BZ2_decompress ( DState* s ) if (s->blockRandomised) { BZ_RAND_INIT_MASK; BZ_GET_FAST(s->k0); s->nblock_used++; - BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; + BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; } else { BZ_GET_FAST(s->k0); s->nblock_used++; } @@ -644,7 +644,7 @@ Int32 BZ2_decompress ( DState* s ) s->save_gBase = gBase; s->save_gPerm = gPerm; - return retVal; + return retVal; } Index: gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/huffman.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/huffman.c,v diff -u -p -a -u -p -r1.3 huffman.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/huffman.c 9 Apr 2020 01:32:13 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/huffman.c 21 Feb 2024 15:47:00 -0000 @@ -11,7 +11,7 @@ bzip2/libbzip2 version 1.0.8 of 13 July 2019 Copyright (C) 1996-2019 Julian Seward - Please read the WARNING, DISCLAIMER and PATENTS sections in the + Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained @@ -60,7 +60,7 @@ /*---------------------------------------------------*/ -void BZ2_hbMakeCodeLengths ( UChar *len, +void BZ2_hbMakeCodeLengths ( UChar *len, Int32 *freq, Int32 alphaSize, Int32 maxLen ) @@ -74,7 +74,7 @@ void BZ2_hbMakeCodeLengths ( UChar *len, Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; - Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; + Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; for (i = 0; i < alphaSize; i++) weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; @@ -96,7 +96,7 @@ void BZ2_hbMakeCodeLengths ( UChar *len, } AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); - + while (nHeap > 1) { n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); @@ -119,7 +119,7 @@ void BZ2_hbMakeCodeLengths ( UChar *len, len[i-1] = j; if (j > maxLen) tooLong = True; } - + if (! tooLong) break; /* 17 Oct 04: keep-going condition for the following loop used Index: gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/randtable.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/randtable.c,v diff -u -p -a -u -p -r1.4 randtable.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/randtable.c 9 Apr 2020 01:32:13 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/bzip2-src/randtable.c 21 Feb 2024 15:47:00 -0000 @@ -11,7 +11,7 @@ bzip2/libbzip2 version 1.0.8 of 13 July 2019 Copyright (C) 1996-2019 Julian Seward - Please read the WARNING, DISCLAIMER and PATENTS sections in the + Please read the WARNING, DISCLAIMER and PATENTS sections in the README file. This program is released under the terms of the license contained @@ -23,58 +23,58 @@ /*---------------------------------------------*/ -const Int32 BZ2_rNums[512] = { - 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, - 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, - 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, - 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, - 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, - 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, - 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, - 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, - 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, - 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, - 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, - 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, - 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, - 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, - 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, - 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, - 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, - 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, - 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, - 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, - 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, - 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, - 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, - 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, - 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, - 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, - 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, - 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, - 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, - 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, - 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, - 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, - 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, - 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, - 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, - 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, - 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, - 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, - 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, - 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, - 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, - 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, - 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, - 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, - 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, - 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, - 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, - 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, - 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, - 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, - 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, +const Int32 BZ2_rNums[512] = { + 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, + 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, + 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, + 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, + 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, + 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, + 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, + 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, + 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, + 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, + 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, + 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, + 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, + 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, + 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, + 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, + 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, + 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, + 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, + 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, + 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, + 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, + 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, + 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, + 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, + 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, + 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, + 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, + 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, + 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, + 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, + 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, + 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, + 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, + 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, + 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, + 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, + 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, + 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, + 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, + 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, + 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, + 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, + 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, + 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, + 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, + 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, + 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, + 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, + 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, + 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, 936, 638 }; Index: gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm,v diff -u -p -a -u -p -r1.11 Bzip2.pm --- gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm 15 Feb 2023 01:36:15 -0000 1.11 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm 21 Feb 2024 15:47:00 -0000 @@ -11,7 +11,7 @@ use Carp ; use bytes ; our ($VERSION, $XS_VERSION, @ISA, @EXPORT, $AUTOLOAD); -$VERSION = '2.103'; +$VERSION = '2.204_001'; $XS_VERSION = $VERSION; $VERSION = eval $VERSION; @@ -384,7 +384,7 @@ See the Changes file. =head1 COPYRIGHT AND LICENSE -Copyright (c) 2005-2022 Paul Marquess. All rights reserved. +Copyright (c) 2005-2023 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/t/000prereq.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/t/000prereq.t,v diff -u -p -a -u -p -r1.11 000prereq.t --- gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/t/000prereq.t 15 Feb 2023 01:36:15 -0000 1.11 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Bzip2/t/000prereq.t 21 Feb 2024 15:47:00 -0000 @@ -19,7 +19,7 @@ BEGIN if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; - my $VERSION = '2.103'; + my $VERSION = '2.204'; my @NAMES = qw( ); Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Changes =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Changes diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Changes --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Changes 15 Feb 2023 01:38:21 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,677 +0,0 @@ -CHANGES -------- - - 2.202 27 June 2022 - - * Z_NULL should be 'UV' rather than 'PV' - https://github.com/pmqs/Compress-Raw-Zlib/issues/17 - Sun Jun 26 22:02:04 2022 +0100 - de28f0335d3d605d696b19d43fc48de42272455c - - 2.201 25 June 2022 - - * 2.021 - Sat Jun 25 08:42:46 2022 +0100 - 85416cab509c18c5fa3f923de7b45b6c7c0f7a6f - - * 2.201 - Sat Jun 25 08:39:26 2022 +0100 - b3d63862b2ff4ac9d28e23be500c0d32ad69dd11 - - * More zlib-ng updates - Thu Jun 23 22:42:13 2022 +0100 - 313f626425181702b5fc80af2b6ea7eed41d5a9d - - * Fix test count regression in t/07bufsize.t (#16) - Wed Jun 22 09:45:11 2022 +0100 - 98dc5b4a2b30c26752b6f686462b06b8db72a5e4 - - 2.200 21 June 2022 - - * Added zlib-ng support - https://github.com/pmqs/Compress-Raw-Zlib/issues/9 - - * Only set Z_SOLO when building zlib sources https://github.com/pmqs/Compress-Raw-Zlib/issues/12 - Tue Jun 7 10:13:00 2022 +0100 - c44e0b732e214b7f77d42a3af6ae64ef944cee90 - - 2.105 14 April 2022 - - * Add Compress::Raw::Zlib::VERSION to output - Sat May 14 15:16:57 2022 +0100 - 3e22c93169a67986017f64d9a2e5085c417d8624 - - * Dump version info when running test harness - Sat May 14 15:10:17 2022 +0100 - ca9f33ba0323d0abc91a83800636f180b2b44162 - - * Fix use of ZLIB_INCLUDE/LIB - Sat May 14 09:01:38 2022 +0100 - 8a7d4a97d7441b61a8a888342766419044fa5a33 - - * More fixes for BUILD_ZLIB off - Sat May 14 08:54:04 2022 +0100 - 2d9650094dab90858ef58bfbda62f3bc60e159e4 - - * Add BUILD_ZLIB to the matrix - Sat May 14 08:31:54 2022 +0100 - b61b92fc9d06bf04f1adec337357ffbd39535901 - - * Merge branch 'master' of https://github.com/pmqs/Compress-Raw-Zlib - Sat May 14 08:27:14 2022 +0100 - 3ac7d0d3d45ae263402fab1ebb3835e2ae16c5a6 - - * Fix for BUILD_ZLIB disabled - Sat May 14 08:25:34 2022 +0100 - b0f04e37fb58a34ef01767ad16a8f63ca868eec6 - - * Add BUILD_ZLIB to the matrix - Sat May 14 08:22:56 2022 +0100 - aa8f5ff981c7305c995d4e2f798ae0d7d45866a5 - - 2.104 13 April 2022 - - * Merge pull request #11 from monkburger/symbol_fix_2 - Fri May 13 07:17:19 2022 +0100 - 64aea2d3f78946d7df4096eadfa0d7267f4439a5 - - * perl_crz -> Perl_crz - Tue May 3 18:19:24 2022 +0000 - 20502e6c2eba8ddcad80b20574e840457c0cb369 - - * This is a slightly different way to fix https://github.com/pmqs/Compress-Raw-Zlib/issues/8 - Tue May 3 18:06:48 2022 +0000 - d9cd27fb212da7455b6ba44729ca11bb441f3950 - - * add tests for crc32/adler32_combine - Mon May 2 16:18:13 2022 +0100 - dcfe9ef439790f1a4fae81cf3eac38cfeb848294 - - 2.103 3 April 2022 - - * Sync upstream fix for CVE-2018-25032 - https://github.com/advisories/GHSA-jc36-42cf-vqwj - - Update to Zlib 1.2.12 - d507f527768f6cbab5831ed3ec17fe741163785c - - Fix for inflateSync return code change - f47ea5f36c40fe19efe404dd75fd790b115de596 - - Fix for incorrect CRC from zlib 1.2.12.1 - https://github.com/madler/zlib/commit/ec3df00224d4b396e2ac6586ab5d25f673caa4c2 - 60104e3a162a116548303861ae0811fb850e65fd - - * AUTHOR doesn't contain the stated information - bf5a03c1b440c8d9e41cffb344bf889794cc532b - - - 2.101 20 February 2021 - - * fix version numbers in meta files - - 2.100 7 January 2021 - - * trim whitespace - 5de62cd3987c736c14d1aa804936808fbc1fe9cb - - 2.096 31 July 2020 - - * No changes - - 2.095 19 July 2020 - - * No changes - - 2.094 13 July 2020 - - * Issue with Append mode & SvOOK - https://github.com/pmqs/Compress-Raw-Zlib/issues/3 - 80ee0524012f46c5984c2d57649af0b07f82c750 - - 2.093 7 December 2019 - - * No Changes - - 2.092 4 December 2019 - - * No Changes - - 2.091 23 November 2019 - - * Silence "macro expands to multiple statements" warning - Change sourced upstream from https://github.com/Perl/perl5/issues/17013 - https://github.com/pmqs/Compress-Raw-Zlib/issues/2 - da2bd1fc765b80d01ed10a79b6c4a035e5095ed8 - - 2.090 9 November 2019 - - * No Changes - - 2.089 3 November 2019 - - * No Changes - - 2.088 31 October 2019 - - * Add SUPPORT section - d348ad76c2073a2973d094891fbd0c2e24bf397d - - * 000prereq.t: dump Perl version - e1afe502818cb1ccf5bad917b14b029b408f47f1 - - 2.087 10 August 2019 - - * clang warning in ppport.h - update to latest ppport.h - https://github.com/pmqs/Compress-Raw-Zlib/issues/1 - 664a5fbacf778acdd4cfbcc571997f3df5ee43d3 - - 2.086 31 March 2019 - - * Moved source to github https://github.com/pmqs/Compress-Raw-Zlib - - * Add META_MERGE to Makefile.PL - - * Added meta-json.t & meta-yaml.t - - 2.084 5 January 2019 - - * No Changes - - 2.083 30 December 2018 - - * No Changes - - 2.081 4 April 2018 - - * previous release used $^W instead of use warnings. Fixed. - - 2.080 2 April 2018 - - * No Changes - - 2.076 21 Nov 2017 - - * Zlib.xs - Silence gcc compiler warnings when -Wsign-compare is enabled - #123688: Compilation warnings with clang - - * zlib-src/inflate.c and zlib-src/infback.c - Silence gcc compiler warnings when -Wimplicit-fallthrough is enabled - #123358: Compilation warnings with gcc-7.* - - * Makefile.PL - Windows uses -lzlib. Linux uses -lz - #123699: wrong external zlib name used on Windows - - 2.075 14 Nov 2017 - - * Update zlib-src directory to use zlib 1.2.11 - #123245: perl 5.26.1 is vulnerable to CVE-2016-9843, CVE-2016-9841, CVE-2016-9840, CVE-2016-9842 - - * Zlib.xs - Don't allow offset to be greater than length of buffer in crc32. - - * Zlib.xs - Change my_zcalloc to use safecalloc. - The link, https://github.com/madler/zlib/issues/253, is the upstream report for the remaining - valgrind errors not already dealt with by 1.2.11. Using calloc in Zlib.xs for now as a workaround. - #121074: valgrind errors in the test suite - - 2.074 19 Feb 2017 - - * Fix bad 2.073 release - - 2.073 18 Feb 2017 - - * Zlib.xs - Comment out unused variables & remove C++-ism - #120272: [PATCH] Unbreak compilation - - 2.072 12 Feb 2017 - - * Makefile.PL - #120084: Need Fix for Makefile.PL depending on . in @INC - - * zlib-src - #120207: inflateUndermine: subvert arg conditionally used/unused - - * zlib-src - #112829: two gcc6-found problems - - * fix deflateParams for zlib > 1.2.8 - #119762: Tests broken with zlib-1.2.10 - - 2.071 30 Dec 2016 - - * #119580 (inflate.c: One (last?) compilation warning) - Identical issue reeported in upstream zlib - https://github.com/madler/zlib/issues/111 - - Fix checked into zlib dev codeline via - https://github.com/madler/zlib/commit/2edb94a3025d288dc251bc6cbb2c02e60fbd7438 - - 2.070 28 Dec 2016 - - * #107642: compilation warning from inflate.c - - * #119007: [PATCH] Wrong FLAG_APPEND logic analog to Bzip2 - - 2.069 26 Sept 2015 - - * reduce compiler warnings and stderr noise - [#101341] - - * amigaos4: cpan/Compress-Raw-Zlib: also __amigaos4__ - [#106799] - - * const all global data - https://github.com/madler/zlib/commit/82e9dc60932bf2ce5422a5e76e66e5a05abd26e3 - [#101298] - - * Coverity finding: Unused value - https://github.com/madler/zlib/commit/9859a94c1002484ee5f824c05683a5b2484cbf49 - [105414] - - * Coverity findings - [102399] - - * Coverity finding: Overlapping buffer in memory copy - [105413] - - 2.068 10 Dec 2014 - - * Silence more compiler warnings - - * Disable running of 07bufsize.y by default. - COMPRESS_ZLIB_RUN_MOST needs set to run them. Makes life more - bearable on legacy platforms - - - 2.067 8 Dec 2014 - - * Silence compiler warnings - - 2.066 21 Sept 2014 - - * Another COW violation - [#98069] - - * misleading nesting/indentation (found by Coverity) - [#95405] - - 2.065 3 February 2014 - - * [PATCH] resolve c++ build failure in core - [#92657] - - * gcc -g3: final link failed: Memory exhausted - [#88936] - - 2.064 1 February 2014 - - * [PATCH] Handle non-PVs better - [#91558] - - * Z_OK instead of Z_BUF_ERROR - [#92521] - - 2.063 23 October 2013 - - * gcc -g3: final link failed: Memory exhausted - [#88936] - - * Compress::Raw::Zlib uses AutoLoader for no reason - [#88260] - - * Typo in Compress::Zlib _combine function documentation - [#89305] - - 2.062 11 August 2013 - - * typo fix - [#86417] - - 2.061 19 May 2013 - - * Include zlib 1.2.8 source. - - * typo fix - [#85431] - - * silence compiler warning by making 2nd parameter to - DispStream a const char* - - * Mishandling of BUILD_ZLIB=0 option - [#85492] - - 2.060 7 January 2013 - - * Mention SimpleZip in POD - - 2.059 24 November 2012 - - * Copy-on-write support - [#81353] - - 2.058 12 November 2012 - - * No Changes - - 2.057 10 November 2012 - - * Compress::Raw::Zlib needs to use PERL_NO_GET_CONTEXT - [#80319] - - * Install to 'site' instead of 'perl' when perl version is 5.11+ - [#79812] - - * update to ppport.h that includes SvPV_nomg_nolen - [#78079] - - 2.056 10 August 2012 - - * Fix C++ build issue - Thanks to Karl Williamson for supplying the patch. - - 2.055 4 August 2012 - - * Fix misuse of magic in API - [#78079] - - 2.054 8 May 2012 - - * Build issue on Win32 - [#77030] - - 2.053 6 May 2012 - - * Include zlib 1.2.7 source. - - 2.052 29 April 2012 - - * Fixed build issue when Perl is built with C++ - - 2.051 20 February 2012 - - * Bug in Compress::Raw::Zlib on Windows - [#75222] - - 2.050 20 February 2012 - - * Build failure on Irix & Solaris. - [RT #69985] - - 2.049 18 February 2012 - - * Include zlib 1.2.6 source. - - 2.048 29 January 2012 - - * Set minimum zlib version to 1.2.0 - - 2.047 28 January 2012 - - * Allow flush to be called multiple times without any intermediate - call to deflate and still return Z_OK. - In the code below $status was Z_BUF_ERROR before this change. - - $def->flush(...); - $status = $def->flush(...); - - * Added support for zlibCompileFlags - - * Set minimum Perl version to 5.6 - - 2.045 3 December 2011 - - * Moved FAQ.pod into Zlib.pm - - 2.044 2 December 2011 - - * Moved FAQ.pod under the lib directory so it can get installed - - 2.043 20 November 2011 - - * No Changes - - 2.042 17 November 2011 - - * No Changes - - 2.040 28 October 2011 - - * No Changes - - 2.039 28 October 2011 - - * croak if attempt to freeze/thaw compression object - [RT #69985] - - 2.037 22 June 2011 - - * No Changes - - 2.036 6 May 2011 - - * Added offset patramter to CRC32 - - 2.035 6 May 2011 - - * No Changes - - 2.033 11 Jan 2011 - * Fixed typos & spelling errors. - [perl# 81782] - - 2.032 4 Jan 2011 - - * Document inflateReset - [RT #61082] - - 2.030 22 July 2010 - - * Ran the zlib2ansi script against the files in zlib-src. - Thanks to Nicholas Clark for the reminder. - - * Added "-DNO_VIZ" to DEFINE in Makefile.PL - [RT #65293] - - 2.027 24 April 2010 - - * Updated to include zlib 1.2.5 - - 2.026 7 April 2010 - - * Fixed definition of Z_TREES in Makefile.PL - [RT #65293] - - * Fixed build issue with definition of off64_t not found on Solaris - by modifying the zlib source - changed the symbol - _LARGEFILE64_SOURCE to _LARGEFILE64_SOURCE_dummy in zconf.h, - zlib.h and zutil.h - [RT #56108] - - 2.025 27 March 2010 - - * Updated to include zlib 1.2.4 - - * Allow zlib version check to be disabled by setting - TEST_SKIP_VERSION_CHECK environment variable. - [RT #54510] - - 2.023 9 November 2009 - - * fixed instance where $[ should have been $] in t/02zlib.t - Thanks to Robin Barker and zefram [RT #50765] for independently - spotting the issue. - - 2.021 30 August 2009 - - * Changed test harness so that it can cope with PERL5OPT=-MCarp=verbose - [RT# 47225] - - 2.020 3 June 2009 - - * Minor documentation update. - - 2.019 4 May 2009 - - * No Changes - - 2.018 3 May 2009 - - * No Changes - - 2.017 28 March 2009 - - * Added 'LimitOutput' option - - * Removed MAN3PODS from Makefile.PL - - * Fixed coring issue when LimitOutput was used. - - * Documented Compress::Raw::Zlib::zlib_version() - - * Documented Compress::Raw::Zlib::deflateReset() - [RT #40566] - - 2.015 3 September 2008 - - * Makefile.PL - Backout changes made in 2.014 - - 2.014 2 September 2008 - - * Makefile.PL - Updated to check for indirect dependencies. - - 2.012 15 July 2008 - - * Document the gzip flags that WindowBits can take. - - * Allow a dictionary to be used with a raw inflate. - Needs zlib 1.2.2.1 or better. - [RT #36046] - - 2.011 5 May 2008 - - * A C++-style comment sneaked in with the last update. Fixed. - [core patch #33828] - - 2.010 5 May 2008 - - * No Changes - - 2.009 20 April 2008 - - * No Changes - - 2.008 2 November 2007 - - * Minor documentation changes in README - - 2.006 1 September 2007 - - * Makefile.PL - Added INSTALLDIRS directive to install as a core module when built - on a perl >= 5.9. - - 2.005 18 June 2007 - - * Only include ppport.h when not being built with perl. - [core patch #30655] - - 2.004 3 March 2007 - - * Fixed lvalue substr issue - - * Remove redundant code from Zlib.xs - - 2.003 2 January 2007 - - * Added explicit version checking - - 2.002 29 December 2006 - - * Documentation updates. - - 2.001 1 November 2006 - - * Remove beta status. - - 2.000_14 26 October 2006 - - * Fixed memory leak on realloc. - - * Ticket #18986 says that ExtUtils::Install 1.39 fixes the in-use - issue on win32/cygwin, so make the code that checks whether trying - to install via the cpan shell conditional on the version of - ExtUtils::Install. - http://rt.cpan.org/Ticket/Display.html?id=18986 - - 2.000_10 13 March 2006 - - * Fixed a potential NULL pointer dereference problem in - Compress::Raw::Zlib::resetLastBlockByte. - Issue highlighted by David Dyck and reproduced by Marcus Holland-Moritz. - - 2.000_09 3 March 2006 - - * Released onto CPAN - - * Documentation updates. - - 2.000_08 2 March 2006 - - * Moved the IO::* modules out into their own distributions. - - * Breakout zlib specific code into separate modules. - - * Limited support for reading/writing zip files added. - - 2.000_06 5 October 2005 - - * Added eof parameter to Compress::Zlib::inflate method. - - * Fixed issue with 64-bit - - 2.000_05 4 October 2005 - - * Renamed IO::* to IO::Compress::* & IO::Uncompress::* - - 2.000_04 23 September 2005 - - * Fixed some more non-portable test that were failing on VMS. - - * fixed problem where error messages in the oneshot interface were - getting lost. - - 2.000_03 12 September 2005 - - * Fixed some non-portable test that were failing on VMS. - - * Fixed export of zlib constants from the IO::* classes - - 2.000_02 6 September 2005 - - * Split Append mode into Append and Merge - - * Fixed typos in the documentation. - - * Added pod/FAQ.pod - - * Added libscan to Makefile.PL - - * Added InputLength for IO::Gunzip et al - - 2.000_01 22 August 2005 - - * Fixed VERSION in Compress::Gzip::Constants - - * Removed Compress::Gzip::Info from the distribution. - - 2.000_00 21 August 2005 - - * First Beta relase of Compress::zlib rewrite. Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/MANIFEST =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/MANIFEST diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/MANIFEST --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/MANIFEST 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,51 +0,0 @@ -README -Changes -t/000prereq.t -t/01version.t -t/02zlib.t -t/07bufsize.t -t/09limitoutput.t -t/18lvalue.t -t/19nonpv.t -t/99pod.t -t/Test/Builder.pm -t/Test/More.pm -t/Test/Simple.pm -t/compress/CompTestUtils.pm -t/meta-json.t -t/meta-yaml.t -Zlib.xs -typemap -Makefile.PL -private/MakeUtil.pm -MANIFEST -ppport.h -config.in -zlib-src/adler32.c -zlib-src/compress.c -zlib-src/crc32.c -zlib-src/crc32.h -zlib-src/deflate.c -zlib-src/deflate.h -zlib-src/infback.c -zlib-src/inffast.c -zlib-src/inffast.h -zlib-src/inffixed.h -zlib-src/inflate.c -zlib-src/inflate.h -zlib-src/inftrees.c -zlib-src/inftrees.h -zlib-src/trees.c -zlib-src/trees.h -zlib-src/uncompr.c -zlib-src/zconf.h -zlib-src/zlib.h -zlib-src/zutil.c -zlib-src/zutil.h -fallback/constants.h -fallback/constants.xs -lib/Compress/Raw/Zlib.pm -examples/filtdef Perl -examples/filtinf Perl -META.yml Module meta-data (added by MakeMaker) -META.json Module JSON meta-data (added by MakeMaker) Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/META.json =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/META.json diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/META.json --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/META.json 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,50 +0,0 @@ -{ - "abstract" : "unknown", - "author" : [ - "unknown" - ], - "dynamic_config" : 1, - "generated_by" : "ExtUtils::MakeMaker version 7.34, CPAN::Meta::Converter version 2.150005", - "license" : [ - "perl_5" - ], - "meta-spec" : { - "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", - "version" : "2" - }, - "name" : "Compress-Raw-Zlib", - "no_index" : { - "directory" : [ - "t", - "inc", - "t", - "private" - ] - }, - "prereqs" : { - "build" : { - "requires" : { - "ExtUtils::MakeMaker" : "0" - } - }, - "configure" : { - "requires" : { - "ExtUtils::MakeMaker" : "0" - } - } - }, - "release_status" : "stable", - "resources" : { - "bugtracker" : { - "web" : "https://github.com/pmqs/Compress-Raw-Zlib/issues" - }, - "homepage" : "https://github.com/pmqs/Compress-Raw-Zlib", - "repository" : { - "type" : "git", - "url" : "git://github.com/pmqs/Compress-Raw-Zlib.git", - "web" : "https://github.com/pmqs/Compress-Raw-Zlib" - } - }, - "version" : "2.202", - "x_serialization_backend" : "JSON::PP version 2.27300" -} Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/README =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/README diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/README --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/README 15 Feb 2023 01:38:21 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,381 +0,0 @@ - - Compress-Raw-Zlib - - Version 2.202 - - 27 June 2022 - - Copyright (c) 2005-2022 Paul Marquess. All rights reserved. - This program is free software; you can redistribute it - and/or modify it under the same terms as Perl itself. - - The directory zlib-src contains a subset of the - source files copied directly from zlib version 1.2.13. - These files are Copyright(C) 1995-2022 - Jean-loup Gailly and Mark Adler. - Full source for the zlib library is available at - http://www.zlib.org - -DESCRIPTION ------------ - -This module provides a Perl interface to the zlib compression library. - -PREREQUISITES -------------- - -Before you can build Compress-Raw-Zlib you need to have the following -installed on your system: - - * A C compiler - - * Perl 5.006 or better. - -By default, Compress-Raw-Zlib will build its own private copy of the -zlib library. If you want to use a different version of -zlib, follow the instructions in the section called -"Controlling the version of zlib used by Compress-Raw-Zlib" -later in this document. - -BUILDING THE MODULE -------------------- - -Assuming you have met all the prerequisites, the module can now be built -using this sequence of commands: - - perl Makefile.PL - make - make test - -INSTALLATION ------------- - -To install Compress-Raw-Zlib, run the command below: - - make install - -Controlling the version of zlib used by Compress-Raw-Zlib ----------------------------------------------------------- - -Compress-Raw-Zlib interfaces to the zlib compression library. There -are three options available to control which version/instance of the -zlib library is used: - - 1. Build a private copy of the zlib library using the - zlib library source that is included with this module. - This is the default and recommended option. - - 2. Build a private copy of the zlib library using a standard - zlib source distribution. - - 3. Use a pre-built zlib library. - -Note that if you intend to use either Option 2 or 3, you need to have -zlib version 1.2.0 or better. - -The contents of the file config.in are used to control which of the -three options is actually used. This file is read during the - - perl Makefile.PL - -step of the build, so remember to make any required changes to config.in -before building this module. - - Option 1 - -------- - - For option 1, edit the file config.in and set the variables in it - as follows: - - BUILD_ZLIB = True - INCLUDE = ./zlib-src - LIB = ./zlib-src - OLD_ZLIB = False - GZIP_OS_CODE = AUTO_DETECT - - Option 2 - -------- - - For option 2, fetch a copy of the zlib source distribution from - http://www.zlib.org and unpack it into the Compress-Raw-Zlib source - directory. Assuming you have fetched zlib 1.2.13, - it will create a directory called zlib-1.2.13. - - Now set the variables in the file config.in as follows (if the version - you have fetched isn't 1.2.13, change the INCLUDE and LIB - variables appropriately): - - BUILD_ZLIB = True - INCLUDE = ./zlib-1.2.13 - LIB = ./zlib-1.2.13 - OLD_ZLIB = False - GZIP_OS_CODE = AUTO_DETECT - - Option 3 - -------- - - For option 3, you need to find out where zlib is stored on your - system. There are two parts to this. - - First, find the directory where the zlib library is stored (some - common names for the library are libz.a and libz.so). Set the LIB variable - in the config.in file to that directory. - - Secondly, find the directory where the file zlib.h is stored. Now set - the INCLUDE variable in the config.in file to that directory. - - Next set BUILD_ZLIB to False. - - Finally, if you are running zlib 1.0.5 or older, set the OLD_ZLIB - variable to True. Otherwise set it to False. - - As an example, if the zlib library on your system is in - /usr/local/lib, zlib.h is in /usr/local/include and zlib is more - recent than version 1.0.5, the variables in config.in should be set as - follows: - - BUILD_ZLIB = False - INCLUDE = /usr/local/include - LIB = /usr/local/lib - OLD_ZLIB = False - GZIP_OS_CODE = AUTO_DETECT - -Setting the Gzip OS Code ------------------------- - -Every gzip stream stores a byte in its header to identify the Operating -System that was used to create the gzip stream. When you build Compress-Raw-Zlib it will attempt to determine the value that is correct for -your Operating System. This will then be used by IO::Compress::Gzip as the -default value for the OS byte in all gzip headers it creates. - -The variable GZIP_OS_CODE in the config.in file controls the setting of -this value when building Compress-Raw-Zlib. If GZIP_OS_CODE is set to -AUTO_DETECT, Compress-Raw-Zlib will attempt to determine the correct value for -your Operating System. - -Alternatively, you can override auto-detection of the default OS code and -explicitly set it yourself. Set the GZIP_OS_CODE variable in the config.in -file to be a number between 0 and 255. For example - - GZIP_OS_CODE = 3 - -See RFC 1952 for valid OS codes that can be used. - -If you are running one of the less popular Operating Systems, it is -possible that the default value picked by this module is incorrect or the -default value (3) is used when there is a better value available. When -Compress-Raw-Zlib cannot determine what operating system you are running, it -will use the default value 3 for the OS code. - -If you find you have to change this value, because you think the value auto -detected is incorrect, please take a few moments to contact the author of -this module. - -TROUBLESHOOTING ---------------- - -Undefined Symbol gzsetparams ----------------------------- - -If you get the error shown below when you run the Compress-Raw-Zlib test -harness it probably means you are running a copy of zlib that is -version 1.0.5 or older. - -t/01version.........Can't load 'blib/arch/auto/Compress/Zlib/Zlib.so' for - module Compress::Raw::Zlib: blib/arch/auto/Compress/Raw/Zlib/Zlib.so: - undefined symbol: gzsetparams at ... - -There are two ways to fix this problem: - - 1. Upgrade to the latest version of zlib. - - 2. Edit config.in and set the OLD_ZLIB variable to True. - -Test Harness 01version fails ----------------------------- -If the 01version test harness fails, and the problem isn't covered by the -scenario above, it probably means that you have two versions of -zlib installed on your system. - -Run the command below to see if this is indeed the case - - make test TEST_VERBOSE=1 TEST_FILES=t/01version.t - -Try removing the one you don't want to use and rebuild. - -Solaris build fails with "language optional software package not installed" ---------------------------------------------------------------------------- - -If you are trying to build this module under Solaris and you get an -error message like this - - /usr/ucb/cc: language optional software package not installed - -it means that Perl cannot find the C compiler on your system. The cryptic -message is just Sun's way of telling you that you haven't bought their -C compiler. - -When you build a Perl module that needs a C compiler, the Perl build -system tries to use the same C compiler that was used to build perl -itself. In this case your Perl binary was built with a C compiler that -lived in /usr/ucb. - -To continue with building this module, you need to get a C compiler, -or tell Perl where your C compiler is, if you already have one. - -Assuming you have now got a C compiler, what you do next will be dependent -on what C compiler you have installed. If you have just installed Sun's -C compiler, you shouldn't have to do anything. Just try rebuilding -this module. - -If you have installed another C compiler, say gcc, you have to tell perl -how to use it instead of /usr/ucb/cc. - -This set of options seems to work if you want to use gcc. Your mileage -may vary. - - perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" " - make test - -If that doesn't work for you, it's time to make changes to the Makefile -by hand. Good luck! - -Solaris build fails with "gcc: unrecognized option `-KPIC'" ------------------------------------------------------------ - -You are running Solaris and you get an error like this when you try to -build this Perl module - - gcc: unrecognized option `-KPIC' - -This symptom usually means that you are using a Perl binary that has been -built with the Sun C compiler, but you are using gcc to build this module. - -When Perl builds modules that need a C compiler, it will attempt to use -the same C compiler and command line options that was used to build perl -itself. In this case "-KPIC" is a valid option for the Sun C compiler, -but not for gcc. The equivalent option for gcc is "-fPIC". - -The solution is either: - - 1. Build both Perl and this module with the same C compiler, either - by using the Sun C compiler for both or gcc for both. - - 2. Try generating the Makefile for this module like this perl - - perl Makefile.PL CC=gcc CCCDLFLAGS=-fPIC OPTIMIZE=" " LD=gcc - make test - - This second option seems to work when mixing a Perl binary built - with the Sun C compiler and this module built with gcc. Your - mileage may vary. - -HP-UX Notes ------------ - -I've had a report that when building Compress-Raw-Zlib under HP-UX that it -is necessary to have first built the zlib library with the -fpic -option. - -Linux Notes ------------ - -Although most Linux distributions already come with zlib, some -people report getting this error when they try to build this module: - -$ make -cp Zlib.pm blib/lib/Compress/Zlib.pm -AutoSplitting blib/lib/Compress/Zlib.pm (blib/lib/auto/Compress/Zlib) -/usr/bin/perl -I/usr/lib/perl5/5.6.1/i386-linux -I/usr/lib/perl5/5.6.1 /usr/lib/perl5/5.6.1/ExtUtils/xsubpp -typemap /usr/lib/perl5/5.6.1/ExtUtils/typemap -typemap typemap Zlib.xs > Zlib.xsc && mv Zlib.xsc Zlib.c -gcc -c -I/usr/local/include -fno-strict-aliasing -I/usr/local/include -O2 -march=i386 -mcpu=i686 -DVERSION=\"1.16\" -DXS_VERSION=\"1.16\" -fPIC -I/usr/lib/perl5/5.6.1/i386-linux/CORE Zlib.c -Zlib.xs:25:19: zlib.h: No such file or directory -make: *** [Zlib.o] Error 1 - -This usually means that you have not installed the development RPM -for zlib. Check for an RPM that start with "zlib-devel" in your Linux -distribution. - -Win32 Notes ------------ - -If you are running Activestate Perl (from http://www.activestate.com), -it ships with a pre-compiled version of Compress-Raw-Zlib. To check if a -newer version of Compress-Raw-Zlib is available run this from the command -prompt - - C:\> ppm verify -upgrade Compress-Raw-Zlib - -If you are not running Activestate Perl and you don't have access -to a C compiler, you will not be able to build and install this module. - -Win32 & Cygwin Notes --------------------- - -It is not possible to install Compress-Raw-Zlib using the CPAN shell. -This is because the Compress-Raw-Zlib DLL is itself used by the CPAN shell -and it is impossible to remove a DLL while it is already loaded under -Windows. - -The workaround is to install Compress-Raw-Zlib manually using the -instructions given at the start of this file. - -SUPPORT -------- - -General feedback/questions/bug reports should be sent to -https://github.com/pmqs/Compress-Raw-Zlib/issues (preferred) or -https://rt.cpan.org/Public/Dist/Display.html?Name=Compress-Raw-Zlib. - -FEEDBACK --------- - -How to report a problem with Compress-Raw-Zlib. - -To help me help you, I need all of the following information: - - 1. The Versions of everything relevant. - This includes: - - a. The *complete* output from running this - - perl -V - - Do not edit the output in any way. - Note, I want you to run "perl -V" and NOT "perl -v". - - If your perl does not understand the "-V" option it is too - old. This module needs Perl version 5.004 or better. - - b. The version of Compress-Raw-Zlib you have. - If you have successfully installed Compress-Raw-Zlib, this one-liner - will tell you: - - perl -MCompress::Raw::Zlib -e 'print qq[ver $Compress::Raw::Zlib::VERSION\n]' - - If you are running windows use this - - perl -MCompress::Raw::Zlib -e "print qq[ver $Compress::Raw::Zlib::VERSION\n]" - - If you haven't installed Compress-Raw-Zlib then search Compress::Raw::Zlib.pm - for a line like this: - - $VERSION = "2.202" ; - - c. The version of zlib you have used. - If you have successfully installed Compress-Raw-Zlib, this one-liner - will tell you: - - perl -MCompress::Raw::Zlib -e "print q[zlib ver ]. Compress::Raw::Zlib::ZLIB_VERSION.qq[\n]" - - If not, look at the beginning of the file zlib.h. - - 2. If you are having problems building Compress-Raw-Zlib, send me a - complete log of what happened. Start by unpacking the Compress-Raw-Zlib - module into a fresh directory and keep a log of all the steps - - [edit config.in, if necessary] - perl Makefile.PL - make - make test TEST_VERBOSE=1 - -Paul Marquess Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Zlib.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Zlib.xs,v diff -u -p -a -u -p -r1.5 Zlib.xs --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Zlib.xs 15 Feb 2023 01:38:21 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/Zlib.xs 21 Feb 2024 15:47:00 -0000 @@ -1103,7 +1103,7 @@ _deflateInit(flags,level, method, window "Compress::Raw::Zlib::deflateStream", (void*)s); XPUSHs(obj); } - if (GIMME == G_ARRAY) { + if (GIMME_V == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); XPUSHs(sv) ; @@ -1176,7 +1176,7 @@ _inflateInit(flags, windowBits, bufsize, (void*)s); XPUSHs(obj); } - if (GIMME == G_ARRAY) { + if (GIMME_V == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); XPUSHs(sv) ; @@ -2294,7 +2294,7 @@ _createDeflateStream(inf_s, flags,level, XPUSHs(sv_setref_pv(sv_newmortal(), "Compress::Raw::Zlib::deflateStream", (void*)s)); - if (GIMME == G_ARRAY) { + if (GIMME_V == G_ARRAY) { SV * sv = sv_2mortal(newSViv(err)) ; setDUALstatus(sv, err); XPUSHs(sv) ; Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/ppport.h =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/ppport.h diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/ppport.h --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/ppport.h 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,8641 +0,0 @@ -#if 0 -<<'SKIP'; -#endif -/* ----------------------------------------------------------------------- - - ppport.h -- Perl/Pollution/Portability Version 3.52 - - Automatically created by Devel::PPPort running under perl 5.024000. - - Do NOT edit this file directly! -- Edit PPPort_pm.PL and the - includes in parts/inc/ instead. - - Use 'perldoc ppport.h' to view the documentation below. - ----------------------------------------------------------------------- - -SKIP - -=pod - -=head1 NAME - -ppport.h - Perl/Pollution/Portability version 3.52 - -=head1 SYNOPSIS - - perl ppport.h [options] [source files] - - Searches current directory for files if no [source files] are given - - --help show short help - - --version show version - - --patch=file write one patch file with changes - --copy=suffix write changed copies with suffix - --diff=program use diff program and options - - --compat-version=version provide compatibility with Perl version - --cplusplus accept C++ comments - - --quiet don't output anything except fatal errors - --nodiag don't show diagnostics - --nohints don't show hints - --nochanges don't suggest changes - --nofilter don't filter input files - - --strip strip all script and doc functionality - from ppport.h - - --list-provided list provided API - --list-unsupported list unsupported API - --api-info=name show Perl API portability information - -=head1 COMPATIBILITY - -This version of F is designed to support operation with Perl -installations back to 5.003, and has been tested up to 5.30. - -=head1 OPTIONS - -=head2 --help - -Display a brief usage summary. - -=head2 --version - -Display the version of F. - -=head2 --patch=I - -If this option is given, a single patch file will be created if -any changes are suggested. This requires a working diff program -to be installed on your system. - -=head2 --copy=I - -If this option is given, a copy of each file will be saved with -the given suffix that contains the suggested changes. This does -not require any external programs. Note that this does not -automagically add a dot between the original filename and the -suffix. If you want the dot, you have to include it in the option -argument. - -If neither C<--patch> or C<--copy> are given, the default is to -simply print the diffs for each file. This requires either -C or a C program to be installed. - -=head2 --diff=I - -Manually set the diff program and options to use. The default -is to use C, when installed, and output unified -context diffs. - -=head2 --compat-version=I - -Tell F to check for compatibility with the given -Perl version. The default is to check for compatibility with Perl -version 5.003. You can use this option to reduce the output -of F if you intend to be backward compatible only -down to a certain Perl version. - -=head2 --cplusplus - -Usually, F will detect C++ style comments and -replace them with C style comments for portability reasons. -Using this option instructs F to leave C++ -comments untouched. - -=head2 --quiet - -Be quiet. Don't print anything except fatal errors. - -=head2 --nodiag - -Don't output any diagnostic messages. Only portability -alerts will be printed. - -=head2 --nohints - -Don't output any hints. Hints often contain useful portability -notes. Warnings will still be displayed. - -=head2 --nochanges - -Don't suggest any changes. Only give diagnostic output and hints -unless these are also deactivated. - -=head2 --nofilter - -Don't filter the list of input files. By default, files not looking -like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. - -=head2 --strip - -Strip all script and documentation functionality from F. -This reduces the size of F dramatically and may be useful -if you want to include F in smaller modules without -increasing their distribution size too much. - -The stripped F will have a C<--unstrip> option that allows -you to undo the stripping, but only if an appropriate C -module is installed. - -=head2 --list-provided - -Lists the API elements for which compatibility is provided by -F. Also lists if it must be explicitly requested, -if it has dependencies, and if there are hints or warnings for it. - -=head2 --list-unsupported - -Lists the API elements that are known not to be supported by -F and below which version of Perl they probably -won't be available or work. - -=head2 --api-info=I - -Show portability information for API elements matching I. -If I is surrounded by slashes, it is interpreted as a regular -expression. - -=head1 DESCRIPTION - -In order for a Perl extension (XS) module to be as portable as possible -across differing versions of Perl itself, certain steps need to be taken. - -=over 4 - -=item * - -Including this header is the first major one. This alone will give you -access to a large part of the Perl API that hasn't been available in -earlier Perl releases. Use - - perl ppport.h --list-provided - -to see which API elements are provided by ppport.h. - -=item * - -You should avoid using deprecated parts of the API. For example, using -global Perl variables without the C prefix is deprecated. Also, -some API functions used to have a C prefix. Using this form is -also deprecated. You can safely use the supported API, as F -will provide wrappers for older Perl versions. - -=item * - -If you use one of a few functions or variables that were not present in -earlier versions of Perl, and that can't be provided using a macro, you -have to explicitly request support for these functions by adding one or -more C<#define>s in your source code before the inclusion of F. - -These functions or variables will be marked C in the list shown -by C<--list-provided>. - -Depending on whether you module has a single or multiple files that -use such functions or variables, you want either C or global -variants. - -For a C function or variable (used only in a single source -file), use: - - #define NEED_function - #define NEED_variable - -For a global function or variable (used in multiple source files), -use: - - #define NEED_function_GLOBAL - #define NEED_variable_GLOBAL - -Note that you mustn't have more than one global request for the -same function or variable in your project. - - Function / Variable Static Request Global Request - ----------------------------------------------------------------------------------------- - PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL - PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL - SvRX() NEED_SvRX NEED_SvRX_GLOBAL - caller_cx() NEED_caller_cx NEED_caller_cx_GLOBAL - croak_xs_usage() NEED_croak_xs_usage NEED_croak_xs_usage_GLOBAL - die_sv() NEED_die_sv NEED_die_sv_GLOBAL - eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL - grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL - grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL - grok_number() NEED_grok_number NEED_grok_number_GLOBAL - grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL - grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL - gv_fetchpvn_flags() NEED_gv_fetchpvn_flags NEED_gv_fetchpvn_flags_GLOBAL - load_module() NEED_load_module NEED_load_module_GLOBAL - mess() NEED_mess NEED_mess_GLOBAL - mess_nocontext() NEED_mess_nocontext NEED_mess_nocontext_GLOBAL - mess_sv() NEED_mess_sv NEED_mess_sv_GLOBAL - mg_findext() NEED_mg_findext NEED_mg_findext_GLOBAL - my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL - my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL - my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL - my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL - my_strnlen() NEED_my_strnlen NEED_my_strnlen_GLOBAL - newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL - newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL - newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL - newSVpvn_flags() NEED_newSVpvn_flags NEED_newSVpvn_flags_GLOBAL - newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL - pv_display() NEED_pv_display NEED_pv_display_GLOBAL - pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL - pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL - sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL - sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL - sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL - sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL - sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL - sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL - sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL - sv_unmagicext() NEED_sv_unmagicext NEED_sv_unmagicext_GLOBAL - utf8_to_uvchr_buf() NEED_utf8_to_uvchr_buf NEED_utf8_to_uvchr_buf_GLOBAL - vload_module() NEED_vload_module NEED_vload_module_GLOBAL - vmess() NEED_vmess NEED_vmess_GLOBAL - vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL - warner() NEED_warner NEED_warner_GLOBAL - -To avoid namespace conflicts, you can change the namespace of the -explicitly exported functions / variables using the C -macro. Just C<#define> the macro before including C: - - #define DPPP_NAMESPACE MyOwnNamespace_ - #include "ppport.h" - -The default namespace is C. - -=back - -The good thing is that most of the above can be checked by running -F on your source code. See the next section for -details. - -=head1 EXAMPLES - -To verify whether F is needed for your module, whether you -should make any changes to your code, and whether any special defines -should be used, F can be run as a Perl script to check your -source code. Simply say: - - perl ppport.h - -The result will usually be a list of patches suggesting changes -that should at least be acceptable, if not necessarily the most -efficient solution, or a fix for all possible problems. - -If you know that your XS module uses features only available in -newer Perl releases, if you're aware that it uses C++ comments, -and if you want all suggestions as a single patch file, you could -use something like this: - - perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff - -If you only want your code to be scanned without any suggestions -for changes, use: - - perl ppport.h --nochanges - -You can specify a different C program or options, using -the C<--diff> option: - - perl ppport.h --diff='diff -C 10' - -This would output context diffs with 10 lines of context. - -If you want to create patched copies of your files instead, use: - - perl ppport.h --copy=.new - -To display portability information for the C function, -use: - - perl ppport.h --api-info=newSVpvn - -Since the argument to C<--api-info> can be a regular expression, -you can use - - perl ppport.h --api-info=/_nomg$/ - -to display portability information for all C<_nomg> functions or - - perl ppport.h --api-info=/./ - -to display information for all known API elements. - -=head1 BUGS - -If this version of F is causing failure during -the compilation of this module, please check if newer versions -of either this module or C are available on CPAN -before sending a bug report. - -If F was generated using the latest version of -C and is causing failure of this module, please -send a bug report to L. - -Please include the following information: - -=over 4 - -=item 1. - -The complete output from running "perl -V" - -=item 2. - -This file. - -=item 3. - -The name and version of the module you were trying to build. - -=item 4. - -A full log of the build that failed. - -=item 5. - -Any other information that you think could be relevant. - -=back - -For the latest version of this code, please get the C -module from CPAN. - -=head1 COPYRIGHT - -Version 3.x, Copyright (c) 2004-2013, Marcus Holland-Moritz. - -Version 2.x, Copyright (C) 2001, Paul Marquess. - -Version 1.x, Copyright (C) 1999, Kenneth Albanowski. - -This program is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -=head1 SEE ALSO - -See L. - -=cut - -use strict; - -# Disable broken TRIE-optimization -BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if "$]" >= 5.009004 && "$]" <= 5.009005 } - -my $VERSION = 3.52; - -my %opt = ( - quiet => 0, - diag => 1, - hints => 1, - changes => 1, - cplusplus => 0, - filter => 1, - strip => 0, - version => 0, -); - -my($ppport) = $0 =~ /([\w.]+)$/; -my $LF = '(?:\r\n|[\r\n])'; # line feed -my $HS = "[ \t]"; # horizontal whitespace - -# Never use C comments in this file! -my $ccs = '/'.'*'; -my $cce = '*'.'/'; -my $rccs = quotemeta $ccs; -my $rcce = quotemeta $cce; - -eval { - require Getopt::Long; - Getopt::Long::GetOptions(\%opt, qw( - help quiet diag! filter! hints! changes! cplusplus strip version - patch=s copy=s diff=s compat-version=s - list-provided list-unsupported api-info=s - )) or usage(); -}; - -if ($@ and grep /^-/, @ARGV) { - usage() if "@ARGV" =~ /^--?h(?:elp)?$/; - die "Getopt::Long not found. Please don't use any options.\n"; -} - -if ($opt{version}) { - print "This is $0 $VERSION.\n"; - exit 0; -} - -usage() if $opt{help}; -strip() if $opt{strip}; - -if (exists $opt{'compat-version'}) { - my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) }; - if ($@) { - die "Invalid version number format: '$opt{'compat-version'}'\n"; - } - die "Only Perl 5 is supported\n" if $r != 5; - die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000; - $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s; -} -else { - $opt{'compat-version'} = 5; -} - -my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ - ? ( $1 => { - ($2 ? ( base => $2 ) : ()), - ($3 ? ( todo => $3 ) : ()), - (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), - (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), - (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), - } ) - : die "invalid spec: $_" } qw( -AvFILLp|5.004050||p -AvFILL||| -BOM_UTF8||| -BhkDISABLE||5.024000| -BhkENABLE||5.024000| -BhkENTRY_set||5.024000| -BhkENTRY||| -BhkFLAGS||| -CALL_BLOCK_HOOKS||| -CLASS|||n -CPERLscope|5.005000||p -CX_CURPAD_SAVE||| -CX_CURPAD_SV||| -C_ARRAY_END|5.013002||p -C_ARRAY_LENGTH|5.008001||p -CopFILEAV|5.006000||p -CopFILEGV_set|5.006000||p -CopFILEGV|5.006000||p -CopFILESV|5.006000||p -CopFILE_set|5.006000||p -CopFILE|5.006000||p -CopSTASHPV_set|5.006000||p -CopSTASHPV|5.006000||p -CopSTASH_eq|5.006000||p -CopSTASH_set|5.006000||p -CopSTASH|5.006000||p -CopyD|5.009002|5.004050|p -Copy||| -CvPADLIST||5.008001| -CvSTASH||| -CvWEAKOUTSIDE||| -DECLARATION_FOR_LC_NUMERIC_MANIPULATION||5.021010|n -DEFSV_set|5.010001||p -DEFSV|5.004050||p -DO_UTF8||5.006000| -END_EXTERN_C|5.005000||p -ENTER||| -ERRSV|5.004050||p -EXTEND||| -EXTERN_C|5.005000||p -F0convert|||n -FREETMPS||| -GIMME_V||5.004000|n -GIMME|||n -GROK_NUMERIC_RADIX|5.007002||p -G_ARRAY||| -G_DISCARD||| -G_EVAL||| -G_METHOD|5.006001||p -G_NOARGS||| -G_SCALAR||| -G_VOID||5.004000| -GetVars||| -GvAV||| -GvCV||| -GvHV||| -GvSV||| -Gv_AMupdate||5.011000| -HEf_SVKEY|5.003070||p -HeHASH||5.003070| -HeKEY||5.003070| -HeKLEN||5.003070| -HePV||5.004000| -HeSVKEY_force||5.003070| -HeSVKEY_set||5.004000| -HeSVKEY||5.003070| -HeUTF8|5.010001|5.008000|p -HeVAL||5.003070| -HvENAMELEN||5.015004| -HvENAMEUTF8||5.015004| -HvENAME||5.013007| -HvNAMELEN_get|5.009003||p -HvNAMELEN||5.015004| -HvNAMEUTF8||5.015004| -HvNAME_get|5.009003||p -HvNAME||| -INT2PTR|5.006000||p -IN_LOCALE_COMPILETIME|5.007002||p -IN_LOCALE_RUNTIME|5.007002||p -IN_LOCALE|5.007002||p -IN_PERL_COMPILETIME|5.008001||p -IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p -IS_NUMBER_INFINITY|5.007002||p -IS_NUMBER_IN_UV|5.007002||p -IS_NUMBER_NAN|5.007003||p -IS_NUMBER_NEG|5.007002||p -IS_NUMBER_NOT_INT|5.007002||p -IVSIZE|5.006000||p -IVTYPE|5.006000||p -IVdf|5.006000||p -LEAVE||| -LIKELY|||p -LINKLIST||5.013006| -LVRET||| -MARK||| -MULTICALL||5.024000| -MUTABLE_PTR|5.010001||p -MUTABLE_SV|5.010001||p -MY_CXT_CLONE|5.009002||p -MY_CXT_INIT|5.007003||p -MY_CXT|5.007003||p -MoveD|5.009002|5.004050|p -Move||| -NOOP|5.005000||p -NUM2PTR|5.006000||p -NVTYPE|5.006000||p -NVef|5.006001||p -NVff|5.006001||p -NVgf|5.006001||p -Newxc|5.009003||p -Newxz|5.009003||p -Newx|5.009003||p -Nullav||| -Nullch||| -Nullcv||| -Nullhv||| -Nullsv||| -OP_CLASS||5.013007| -OP_DESC||5.007003| -OP_NAME||5.007003| -OP_TYPE_IS_OR_WAS||5.019010| -OP_TYPE_IS||5.019007| -ORIGMARK||| -OpHAS_SIBLING|5.021007||p -OpLASTSIB_set|5.021011||p -OpMAYBESIB_set|5.021011||p -OpMORESIB_set|5.021011||p -OpSIBLING|5.021007||p -PAD_BASE_SV||| -PAD_CLONE_VARS||| -PAD_COMPNAME_FLAGS||| -PAD_COMPNAME_GEN_set||| -PAD_COMPNAME_GEN||| -PAD_COMPNAME_OURSTASH||| -PAD_COMPNAME_PV||| -PAD_COMPNAME_TYPE||| -PAD_RESTORE_LOCAL||| -PAD_SAVE_LOCAL||| -PAD_SAVE_SETNULLPAD||| -PAD_SETSV||| -PAD_SET_CUR_NOSAVE||| -PAD_SET_CUR||| -PAD_SVl||| -PAD_SV||| -PERLIO_FUNCS_CAST|5.009003||p -PERLIO_FUNCS_DECL|5.009003||p -PERL_ABS|5.008001||p -PERL_ARGS_ASSERT_CROAK_XS_USAGE|||p -PERL_BCDVERSION|5.024000||p -PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p -PERL_HASH|5.003070||p -PERL_INT_MAX|5.003070||p -PERL_INT_MIN|5.003070||p -PERL_LONG_MAX|5.003070||p -PERL_LONG_MIN|5.003070||p -PERL_MAGIC_arylen|5.007002||p -PERL_MAGIC_backref|5.007002||p -PERL_MAGIC_bm|5.007002||p -PERL_MAGIC_collxfrm|5.007002||p -PERL_MAGIC_dbfile|5.007002||p -PERL_MAGIC_dbline|5.007002||p -PERL_MAGIC_defelem|5.007002||p -PERL_MAGIC_envelem|5.007002||p -PERL_MAGIC_env|5.007002||p -PERL_MAGIC_ext|5.007002||p -PERL_MAGIC_fm|5.007002||p -PERL_MAGIC_glob|5.024000||p -PERL_MAGIC_isaelem|5.007002||p -PERL_MAGIC_isa|5.007002||p -PERL_MAGIC_mutex|5.024000||p -PERL_MAGIC_nkeys|5.007002||p -PERL_MAGIC_overload_elem|5.024000||p -PERL_MAGIC_overload_table|5.007002||p -PERL_MAGIC_overload|5.024000||p -PERL_MAGIC_pos|5.007002||p -PERL_MAGIC_qr|5.007002||p -PERL_MAGIC_regdata|5.007002||p -PERL_MAGIC_regdatum|5.007002||p -PERL_MAGIC_regex_global|5.007002||p -PERL_MAGIC_shared_scalar|5.007003||p -PERL_MAGIC_shared|5.007003||p -PERL_MAGIC_sigelem|5.007002||p -PERL_MAGIC_sig|5.007002||p -PERL_MAGIC_substr|5.007002||p -PERL_MAGIC_sv|5.007002||p -PERL_MAGIC_taint|5.007002||p -PERL_MAGIC_tiedelem|5.007002||p -PERL_MAGIC_tiedscalar|5.007002||p -PERL_MAGIC_tied|5.007002||p -PERL_MAGIC_utf8|5.008001||p -PERL_MAGIC_uvar_elem|5.007003||p -PERL_MAGIC_uvar|5.007002||p -PERL_MAGIC_vec|5.007002||p -PERL_MAGIC_vstring|5.008001||p -PERL_PV_ESCAPE_ALL|5.009004||p -PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p -PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p -PERL_PV_ESCAPE_NOCLEAR|5.009004||p -PERL_PV_ESCAPE_QUOTE|5.009004||p -PERL_PV_ESCAPE_RE|5.009005||p -PERL_PV_ESCAPE_UNI_DETECT|5.009004||p -PERL_PV_ESCAPE_UNI|5.009004||p -PERL_PV_PRETTY_DUMP|5.009004||p -PERL_PV_PRETTY_ELLIPSES|5.010000||p -PERL_PV_PRETTY_LTGT|5.009004||p -PERL_PV_PRETTY_NOCLEAR|5.010000||p -PERL_PV_PRETTY_QUOTE|5.009004||p -PERL_PV_PRETTY_REGPROP|5.009004||p -PERL_QUAD_MAX|5.003070||p -PERL_QUAD_MIN|5.003070||p -PERL_REVISION|5.006000||p -PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p -PERL_SCAN_DISALLOW_PREFIX|5.007003||p -PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p -PERL_SCAN_SILENT_ILLDIGIT|5.008001||p -PERL_SHORT_MAX|5.003070||p -PERL_SHORT_MIN|5.003070||p -PERL_SIGNALS_UNSAFE_FLAG|5.008001||p -PERL_SUBVERSION|5.006000||p -PERL_SYS_INIT3||5.006000| -PERL_SYS_INIT||| -PERL_SYS_TERM||5.024000| -PERL_UCHAR_MAX|5.003070||p -PERL_UCHAR_MIN|5.003070||p -PERL_UINT_MAX|5.003070||p -PERL_UINT_MIN|5.003070||p -PERL_ULONG_MAX|5.003070||p -PERL_ULONG_MIN|5.003070||p -PERL_UNUSED_ARG|5.009003||p -PERL_UNUSED_CONTEXT|5.009004||p -PERL_UNUSED_DECL|5.007002||p -PERL_UNUSED_RESULT|5.021001||p -PERL_UNUSED_VAR|5.007002||p -PERL_UQUAD_MAX|5.003070||p -PERL_UQUAD_MIN|5.003070||p -PERL_USE_GCC_BRACE_GROUPS|5.009004||p -PERL_USHORT_MAX|5.003070||p -PERL_USHORT_MIN|5.003070||p -PERL_VERSION|5.006000||p -PL_DBsignal|5.005000||p -PL_DBsingle|||pn -PL_DBsub|||pn -PL_DBtrace|||pn -PL_Sv|5.005000||p -PL_bufend|5.024000||p -PL_bufptr|5.024000||p -PL_check||5.006000| -PL_compiling|5.004050||p -PL_comppad_name||5.017004| -PL_comppad||5.008001| -PL_copline|5.024000||p -PL_curcop|5.004050||p -PL_curpad||5.005000| -PL_curstash|5.004050||p -PL_debstash|5.004050||p -PL_defgv|5.004050||p -PL_diehook|5.004050||p -PL_dirty|5.004050||p -PL_dowarn|||pn -PL_errgv|5.004050||p -PL_error_count|5.024000||p -PL_expect|5.024000||p -PL_hexdigit|5.005000||p -PL_hints|5.005000||p -PL_in_my_stash|5.024000||p -PL_in_my|5.024000||p -PL_keyword_plugin||5.011002| -PL_last_in_gv|||n -PL_laststatval|5.005000||p -PL_lex_state|5.024000||p -PL_lex_stuff|5.024000||p -PL_linestr|5.024000||p -PL_modglobal||5.005000|n -PL_na|5.004050||pn -PL_no_modify|5.006000||p -PL_ofsgv|||n -PL_opfreehook||5.011000|n -PL_parser|5.009005||p -PL_peepp||5.007003|n -PL_perl_destruct_level|5.004050||p -PL_perldb|5.004050||p -PL_ppaddr|5.006000||p -PL_rpeepp||5.013005|n -PL_rsfp_filters|5.024000||p -PL_rsfp|5.024000||p -PL_rs|||n -PL_signals|5.008001||p -PL_stack_base|5.004050||p -PL_stack_sp|5.004050||p -PL_statcache|5.005000||p -PL_stdingv|5.004050||p -PL_sv_arenaroot|5.004050||p -PL_sv_no|5.004050||pn -PL_sv_undef|5.004050||pn -PL_sv_yes|5.004050||pn -PL_sv_zero|||n -PL_tainted|5.004050||p -PL_tainting|5.004050||p -PL_tokenbuf|5.024000||p -POP_MULTICALL||5.024000| -POPi|||n -POPl|||n -POPn|||n -POPpbytex||5.007001|n -POPpx||5.005030|n -POPp|||n -POPs|||n -POPul||5.006000|n -POPu||5.004000|n -PTR2IV|5.006000||p -PTR2NV|5.006000||p -PTR2UV|5.006000||p -PTR2nat|5.009003||p -PTR2ul|5.007001||p -PTRV|5.006000||p -PUSHMARK||| -PUSH_MULTICALL||5.024000| -PUSHi||| -PUSHmortal|5.009002||p -PUSHn||| -PUSHp||| -PUSHs||| -PUSHu|5.004000||p -PUTBACK||| -PadARRAY||5.024000| -PadMAX||5.024000| -PadlistARRAY||5.024000| -PadlistMAX||5.024000| -PadlistNAMESARRAY||5.024000| -PadlistNAMESMAX||5.024000| -PadlistNAMES||5.024000| -PadlistREFCNT||5.017004| -PadnameIsOUR||| -PadnameIsSTATE||| -PadnameLEN||5.024000| -PadnameOURSTASH||| -PadnameOUTER||| -PadnamePV||5.024000| -PadnameREFCNT_dec||5.024000| -PadnameREFCNT||5.024000| -PadnameSV||5.024000| -PadnameTYPE||| -PadnameUTF8||5.021007| -PadnamelistARRAY||5.024000| -PadnamelistMAX||5.024000| -PadnamelistREFCNT_dec||5.024000| -PadnamelistREFCNT||5.024000| -PerlIO_clearerr||5.007003| -PerlIO_close||5.007003| -PerlIO_context_layers||5.009004| -PerlIO_eof||5.007003| -PerlIO_error||5.007003| -PerlIO_fileno||5.007003| -PerlIO_fill||5.007003| -PerlIO_flush||5.007003| -PerlIO_get_base||5.007003| -PerlIO_get_bufsiz||5.007003| -PerlIO_get_cnt||5.007003| -PerlIO_get_ptr||5.007003| -PerlIO_read||5.007003| -PerlIO_restore_errno||| -PerlIO_save_errno||| -PerlIO_seek||5.007003| -PerlIO_set_cnt||5.007003| -PerlIO_set_ptrcnt||5.007003| -PerlIO_setlinebuf||5.007003| -PerlIO_stderr||5.007003| -PerlIO_stdin||5.007003| -PerlIO_stdout||5.007003| -PerlIO_tell||5.007003| -PerlIO_unread||5.007003| -PerlIO_write||5.007003| -PerlLIO_dup2_cloexec||| -PerlLIO_dup_cloexec||| -PerlLIO_open3_cloexec||| -PerlLIO_open_cloexec||| -PerlProc_pipe_cloexec||| -PerlSock_accept_cloexec||| -PerlSock_socket_cloexec||| -PerlSock_socketpair_cloexec||| -Perl_langinfo|||n -Perl_setlocale|||n -PoisonFree|5.009004||p -PoisonNew|5.009004||p -PoisonWith|5.009004||p -Poison|5.008000||p -READ_XDIGIT||5.017006| -REPLACEMENT_CHARACTER_UTF8||| -RESTORE_LC_NUMERIC||5.024000| -RETVAL|||n -Renewc||| -Renew||| -SAVECLEARSV||| -SAVECOMPPAD||| -SAVEPADSV||| -SAVETMPS||| -SAVE_DEFSV|5.004050||p -SPAGAIN||| -SP||| -START_EXTERN_C|5.005000||p -START_MY_CXT|5.007003||p -STMT_END|||p -STMT_START|||p -STORE_LC_NUMERIC_FORCE_TO_UNDERLYING||5.024000| -STORE_LC_NUMERIC_SET_TO_NEEDED||5.024000| -STR_WITH_LEN|5.009003||p -ST||| -SV_CONST_RETURN|5.009003||p -SV_COW_DROP_PV|5.008001||p -SV_COW_SHARED_HASH_KEYS|5.009005||p -SV_GMAGIC|5.007002||p -SV_HAS_TRAILING_NUL|5.009004||p -SV_IMMEDIATE_UNREF|5.007001||p -SV_MUTABLE_RETURN|5.009003||p -SV_NOSTEAL|5.009002||p -SV_SMAGIC|5.009003||p -SV_UTF8_NO_ENCODING|5.008001||p -SVfARG|5.009005||p -SVf_UTF8|5.006000||p -SVf|5.006000||p -SVt_INVLIST||5.019002| -SVt_IV||| -SVt_NULL||| -SVt_NV||| -SVt_PVAV||| -SVt_PVCV||| -SVt_PVFM||| -SVt_PVGV||| -SVt_PVHV||| -SVt_PVIO||| -SVt_PVIV||| -SVt_PVLV||| -SVt_PVMG||| -SVt_PVNV||| -SVt_PV||| -SVt_REGEXP||5.011000| -Safefree||| -Slab_Alloc||| -Slab_Free||| -Slab_to_ro||| -Slab_to_rw||| -StructCopy||| -SvCUR_set||| -SvCUR||| -SvEND||| -SvGAMAGIC||5.006001| -SvGETMAGIC|5.004050||p -SvGROW||| -SvIOK_UV||5.006000| -SvIOK_notUV||5.006000| -SvIOK_off||| -SvIOK_only_UV||5.006000| -SvIOK_only||| -SvIOK_on||| -SvIOKp||| -SvIOK||| -SvIVX||| -SvIV_nomg|5.009001||p -SvIV_set||| -SvIVx||| -SvIV||| -SvIsCOW_shared_hash||5.008003| -SvIsCOW||5.008003| -SvLEN_set||| -SvLEN||| -SvLOCK||5.007003| -SvMAGIC_set|5.009003||p -SvNIOK_off||| -SvNIOKp||| -SvNIOK||| -SvNOK_off||| -SvNOK_only||| -SvNOK_on||| -SvNOKp||| -SvNOK||| -SvNVX||| -SvNV_nomg||5.013002| -SvNV_set||| -SvNVx||| -SvNV||| -SvOK||| -SvOOK_offset||5.011000| -SvOOK||| -SvPOK_off||| -SvPOK_only_UTF8||5.006000| -SvPOK_only||| -SvPOK_on||| -SvPOKp||| -SvPOK||| -SvPVCLEAR||| -SvPVX_const|5.009003||p -SvPVX_mutable|5.009003||p -SvPVX||| -SvPV_const|5.009003||p -SvPV_flags_const_nolen|5.009003||p -SvPV_flags_const|5.009003||p -SvPV_flags_mutable|5.009003||p -SvPV_flags|5.007002||p -SvPV_force_flags_mutable|5.009003||p -SvPV_force_flags_nolen|5.009003||p -SvPV_force_flags|5.007002||p -SvPV_force_mutable|5.009003||p -SvPV_force_nolen|5.009003||p -SvPV_force_nomg_nolen|5.009003||p -SvPV_force_nomg|5.007002||p -SvPV_force|||p -SvPV_mutable|5.009003||p -SvPV_nolen_const|5.009003||p -SvPV_nolen|5.006000||p -SvPV_nomg_const_nolen|5.009003||p -SvPV_nomg_const|5.009003||p -SvPV_nomg_nolen|5.013007||p -SvPV_nomg|5.007002||p -SvPV_renew|5.009003||p -SvPV_set||| -SvPVbyte_force||5.009002| -SvPVbyte_nolen||5.006000| -SvPVbytex_force||5.006000| -SvPVbytex||5.006000| -SvPVbyte|5.006000||p -SvPVutf8_force||5.006000| -SvPVutf8_nolen||5.006000| -SvPVutf8x_force||5.006000| -SvPVutf8x||5.006000| -SvPVutf8||5.006000| -SvPVx||| -SvPV||| -SvREADONLY_off||| -SvREADONLY_on||| -SvREADONLY||| -SvREFCNT_dec_NN||5.017007| -SvREFCNT_dec||| -SvREFCNT_inc_NN|5.009004||p -SvREFCNT_inc_simple_NN|5.009004||p -SvREFCNT_inc_simple_void_NN|5.009004||p -SvREFCNT_inc_simple_void|5.009004||p -SvREFCNT_inc_simple|5.009004||p -SvREFCNT_inc_void_NN|5.009004||p -SvREFCNT_inc_void|5.009004||p -SvREFCNT_inc|||p -SvREFCNT||| -SvROK_off||| -SvROK_on||| -SvROK||| -SvRV_set|5.009003||p -SvRV||| -SvRXOK|5.009005||p -SvRX|5.009005||p -SvSETMAGIC||| -SvSHARED_HASH|5.009003||p -SvSHARE||5.007003| -SvSTASH_set|5.009003||p -SvSTASH||| -SvSetMagicSV_nosteal||5.004000| -SvSetMagicSV||5.004000| -SvSetSV_nosteal||5.004000| -SvSetSV||| -SvTAINTED_off||5.004000| -SvTAINTED_on||5.004000| -SvTAINTED||5.004000| -SvTAINT||| -SvTHINKFIRST||| -SvTRUE_nomg||5.013006| -SvTRUE||| -SvTYPE||| -SvUNLOCK||5.007003| -SvUOK|5.007001|5.006000|p -SvUPGRADE||| -SvUTF8_off||5.006000| -SvUTF8_on||5.006000| -SvUTF8||5.006000| -SvUVXx|5.004000||p -SvUVX|5.004000||p -SvUV_nomg|5.009001||p -SvUV_set|5.009003||p -SvUVx|5.004000||p -SvUV|5.004000||p -SvVOK||5.008001| -SvVSTRING_mg|5.009004||p -THIS|||n -UNDERBAR|5.009002||p -UNICODE_REPLACEMENT|||p -UNLIKELY|||p -UTF8SKIP||5.006000| -UTF8_IS_INVARIANT||| -UTF8_IS_NONCHAR||| -UTF8_IS_SUPER||| -UTF8_IS_SURROGATE||| -UTF8_MAXBYTES|5.009002||p -UTF8_SAFE_SKIP|||p -UVCHR_IS_INVARIANT||| -UVCHR_SKIP||5.022000| -UVSIZE|5.006000||p -UVTYPE|5.006000||p -UVXf|5.007001||p -UVof|5.006000||p -UVuf|5.006000||p -UVxf|5.006000||p -WARN_ALL|5.006000||p -WARN_AMBIGUOUS|5.006000||p -WARN_ASSERTIONS|5.024000||p -WARN_BAREWORD|5.006000||p -WARN_CLOSED|5.006000||p -WARN_CLOSURE|5.006000||p -WARN_DEBUGGING|5.006000||p -WARN_DEPRECATED|5.006000||p -WARN_DIGIT|5.006000||p -WARN_EXEC|5.006000||p -WARN_EXITING|5.006000||p -WARN_GLOB|5.006000||p -WARN_INPLACE|5.006000||p -WARN_INTERNAL|5.006000||p -WARN_IO|5.006000||p -WARN_LAYER|5.008000||p -WARN_MALLOC|5.006000||p -WARN_MISC|5.006000||p -WARN_NEWLINE|5.006000||p -WARN_NUMERIC|5.006000||p -WARN_ONCE|5.006000||p -WARN_OVERFLOW|5.006000||p -WARN_PACK|5.006000||p -WARN_PARENTHESIS|5.006000||p -WARN_PIPE|5.006000||p -WARN_PORTABLE|5.006000||p -WARN_PRECEDENCE|5.006000||p -WARN_PRINTF|5.006000||p -WARN_PROTOTYPE|5.006000||p -WARN_QW|5.006000||p -WARN_RECURSION|5.006000||p -WARN_REDEFINE|5.006000||p -WARN_REGEXP|5.006000||p -WARN_RESERVED|5.006000||p -WARN_SEMICOLON|5.006000||p -WARN_SEVERE|5.006000||p -WARN_SIGNAL|5.006000||p -WARN_SUBSTR|5.006000||p -WARN_SYNTAX|5.006000||p -WARN_TAINT|5.006000||p -WARN_THREADS|5.008000||p -WARN_UNINITIALIZED|5.006000||p -WARN_UNOPENED|5.006000||p -WARN_UNPACK|5.006000||p -WARN_UNTIE|5.006000||p -WARN_UTF8|5.006000||p -WARN_VOID|5.006000||p -WIDEST_UTYPE|5.015004||p -XCPT_CATCH|5.009002||p -XCPT_RETHROW|5.009002||p -XCPT_TRY_END|5.009002||p -XCPT_TRY_START|5.009002||p -XPUSHi||| -XPUSHmortal|5.009002||p -XPUSHn||| -XPUSHp||| -XPUSHs||| -XPUSHu|5.004000||p -XSPROTO|5.010000||p -XSRETURN_EMPTY||| -XSRETURN_IV||| -XSRETURN_NO||| -XSRETURN_NV||| -XSRETURN_PV||| -XSRETURN_UNDEF||| -XSRETURN_UV|5.008001||p -XSRETURN_YES||| -XSRETURN|||p -XST_mIV||| -XST_mNO||| -XST_mNV||| -XST_mPV||| -XST_mUNDEF||| -XST_mUV|5.008001||p -XST_mYES||| -XS_APIVERSION_BOOTCHECK||5.024000| -XS_EXTERNAL||5.024000| -XS_INTERNAL||5.024000| -XS_VERSION_BOOTCHECK||5.024000| -XS_VERSION||| -XSprePUSH|5.006000||p -XS||| -XopDISABLE||5.024000| -XopENABLE||5.024000| -XopENTRYCUSTOM||5.024000| -XopENTRY_set||5.024000| -XopENTRY||5.024000| -XopFLAGS||5.013007| -ZeroD|5.009002||p -Zero||| -__ASSERT_|||p -_aMY_CXT|5.007003||p -_inverse_folds||| -_is_grapheme||| -_is_in_locale_category||| -_new_invlist_C_array||| -_pMY_CXT|5.007003||p -_to_fold_latin1|||n -_to_upper_title_latin1||| -_to_utf8_case||| -_variant_byte_number|||n -_warn_problematic_locale|||n -aMY_CXT_|5.007003||p -aMY_CXT|5.007003||p -aTHXR_|5.024000||p -aTHXR|5.024000||p -aTHX_|5.006000||p -aTHX|5.006000||p -abort_execution||| -add_above_Latin1_folds||| -add_data|||n -add_multi_match||| -add_utf16_textfilter||| -adjust_size_and_find_bucket|||n -advance_one_LB||| -advance_one_SB||| -advance_one_WB||| -allocmy||| -amagic_call||| -amagic_cmp_locale||| -amagic_cmp||| -amagic_deref_call||5.013007| -amagic_i_ncmp||| -amagic_is_enabled||| -amagic_ncmp||| -anonymise_cv_maybe||| -any_dup||| -ao||| -apply_attrs_my||| -apply_attrs||| -apply||| -argvout_final||| -assert_uft8_cache_coherent||| -assignment_type||| -atfork_lock||5.007003|n -atfork_unlock||5.007003|n -av_arylen_p||5.009003| -av_clear||| -av_delete||5.006000| -av_exists||5.006000| -av_extend_guts||| -av_extend||| -av_fetch||| -av_fill||| -av_iter_p||5.011000| -av_len||| -av_make||| -av_nonelem||| -av_pop||| -av_push||| -av_reify||| -av_shift||| -av_store||| -av_tindex|5.017009|5.017009|p -av_top_index|5.017009|5.017009|p -av_undef||| -av_unshift||| -ax|||n -backup_one_GCB||| -backup_one_LB||| -backup_one_SB||| -backup_one_WB||| -bad_type_gv||| -bad_type_pv||| -bind_match||| -block_end||5.004000| -block_gimme||5.004000| -block_start||5.004000| -blockhook_register||5.013003| -boolSV|5.004000||p -boot_core_PerlIO||| -boot_core_UNIVERSAL||| -boot_core_mro||| -bytes_cmp_utf8||5.013007| -cBOOL|5.013000||p -call_argv|5.006000||p -call_atexit||5.006000| -call_list||5.004000| -call_method|5.006000||p -call_pv|5.006000||p -call_sv|5.006000||p -caller_cx|5.013005|5.006000|p -calloc||5.007002|n -cando||| -cast_i32||5.006000|n -cast_iv||5.006000|n -cast_ulong||5.006000|n -cast_uv||5.006000|n -category_name|||n -change_engine_size||| -check_and_deprecate||| -check_type_and_open||| -check_uni||| -checkcomma||| -ckWARN2_d||| -ckWARN2||| -ckWARN3_d||| -ckWARN3||| -ckWARN4_d||| -ckWARN4||| -ckWARN_d||| -ckWARN|5.006000||p -ck_entersub_args_core||| -ck_entersub_args_list||5.013006| -ck_entersub_args_proto_or_list||5.013006| -ck_entersub_args_proto||5.013006| -ck_warner_d||5.011001|v -ck_warner||5.011001|v -ckwarn_common||| -ckwarn_d||5.009003| -ckwarn||5.009003| -clear_defarray||5.023008| -clear_special_blocks||| -clone_params_del|||n -clone_params_new|||n -closest_cop||| -cntrl_to_mnemonic|||n -compute_EXACTish|||n -construct_ahocorasick_from_trie||| -cop_free||| -cop_hints_2hv||5.013007| -cop_hints_fetch_pvn||5.013007| -cop_hints_fetch_pvs||5.013007| -cop_hints_fetch_pv||5.013007| -cop_hints_fetch_sv||5.013007| -cophh_2hv||5.013007| -cophh_copy||5.013007| -cophh_delete_pvn||5.013007| -cophh_delete_pvs||5.013007| -cophh_delete_pv||5.013007| -cophh_delete_sv||5.013007| -cophh_fetch_pvn||5.013007| -cophh_fetch_pvs||5.013007| -cophh_fetch_pv||5.013007| -cophh_fetch_sv||5.013007| -cophh_free||5.013007| -cophh_new_empty||5.024000| -cophh_store_pvn||5.013007| -cophh_store_pvs||5.013007| -cophh_store_pv||5.013007| -cophh_store_sv||5.013007| -core_prototype||| -coresub_op||| -cr_textfilter||| -croak_caller|||vn -croak_memory_wrap|5.019003||pn -croak_no_mem|||n -croak_no_modify|5.013003||pn -croak_nocontext|||pvn -croak_popstack|||n -croak_sv|5.013001||p -croak_xs_usage|5.010001||pn -croak|||v -csighandler||5.009003|n -current_re_engine||| -curse||| -custom_op_desc||5.007003| -custom_op_get_field||| -custom_op_name||5.007003| -custom_op_register||5.013007| -custom_op_xop||5.013007| -cv_clone_into||| -cv_clone||| -cv_const_sv_or_av|||n -cv_const_sv||5.003070|n -cv_dump||| -cv_forget_slab||| -cv_get_call_checker_flags||| -cv_get_call_checker||5.013006| -cv_name||5.021005| -cv_set_call_checker_flags||5.021004| -cv_set_call_checker||5.013006| -cv_undef_flags||| -cv_undef||| -cvgv_from_hek||| -cvgv_set||| -cvstash_set||| -cx_dump||5.005000| -cx_dup||| -cxinc||| -dAXMARK|5.009003||p -dAX|5.007002||p -dITEMS|5.007002||p -dMARK||| -dMULTICALL||5.009003| -dMY_CXT_SV|5.007003||p -dMY_CXT|5.007003||p -dNOOP|5.006000||p -dORIGMARK||| -dSP||| -dTHR|5.004050||p -dTHXR|5.024000||p -dTHXa|5.006000||p -dTHXoa|5.006000||p -dTHX|5.006000||p -dUNDERBAR|5.009002||p -dVAR|5.009003||p -dXCPT|5.009002||p -dXSARGS||| -dXSI32||| -dXSTARG|5.006000||p -deb_curcv||| -deb_nocontext|||vn -deb_stack_all||| -deb_stack_n||| -debop||5.005000| -debprofdump||5.005000| -debprof||| -debstackptrs||5.007003| -debstack||5.007003| -debug_start_match||| -deb||5.007003|v -defelem_target||| -del_sv||| -delimcpy_no_escape|||n -delimcpy||5.004000|n -despatch_signals||5.007001| -destroy_matcher||| -die_nocontext|||vn -die_sv|5.013001||p -die_unwind||| -die|||v -dirp_dup||| -div128||| -djSP||| -do_aexec5||| -do_aexec||| -do_aspawn||| -do_binmode||5.004050| -do_chomp||| -do_close||| -do_delete_local||| -do_dump_pad||| -do_eof||| -do_exec3||| -do_exec||| -do_gv_dump||5.006000| -do_gvgv_dump||5.006000| -do_hv_dump||5.006000| -do_ipcctl||| -do_ipcget||| -do_join||| -do_magic_dump||5.006000| -do_msgrcv||| -do_msgsnd||| -do_ncmp||| -do_oddball||| -do_op_dump||5.006000| -do_open9||5.006000| -do_openn||5.007001| -do_open||5.003070| -do_pmop_dump||5.006000| -do_print||| -do_readline||| -do_seek||| -do_semop||| -do_shmio||| -do_smartmatch||| -do_spawn_nowait||| -do_spawn||| -do_sprintf||| -do_sv_dump||5.006000| -do_sysseek||| -do_tell||| -do_trans_complex_utf8||| -do_trans_complex||| -do_trans_count_utf8||| -do_trans_count||| -do_trans_simple_utf8||| -do_trans_simple||| -do_trans||| -do_vecget||| -do_vecset||| -do_vop||| -docatch||| -does_utf8_overflow|||n -doeval_compile||| -dofile||| -dofindlabel||| -doform||| -doing_taint||5.008001|n -dooneliner||| -doopen_pm||| -doparseform||| -dopoptoeval||| -dopoptogivenfor||| -dopoptolabel||| -dopoptoloop||| -dopoptosub_at||| -dopoptowhen||| -doref||5.009003| -dounwind||| -dowantarray||| -drand48_init_r|||n -drand48_r|||n -dtrace_probe_call||| -dtrace_probe_load||| -dtrace_probe_op||| -dtrace_probe_phase||| -dump_all_perl||| -dump_all||5.006000| -dump_c_backtrace||| -dump_eval||5.006000| -dump_exec_pos||| -dump_form||5.006000| -dump_indent||5.006000|v -dump_mstats||| -dump_packsubs_perl||| -dump_packsubs||5.006000| -dump_regex_sets_structures||| -dump_sub_perl||| -dump_sub||5.006000| -dump_sv_child||| -dump_trie_interim_list||| -dump_trie_interim_table||| -dump_trie||| -dump_vindent||5.006000| -dumpuntil||| -dup_attrlist||| -dup_warnings||| -edit_distance|||n -emulate_setlocale|||n -eval_pv|5.006000||p -eval_sv|5.006000||p -exec_failed||| -expect_number||| -fbm_compile||5.005000| -fbm_instr||5.005000| -feature_is_enabled||| -filter_add||| -filter_del||| -filter_gets||| -filter_read||| -finalize_optree||| -finalize_op||| -find_and_forget_pmops||| -find_array_subscript||| -find_beginning||| -find_byclass||| -find_default_stash||| -find_hash_subscript||| -find_in_my_stash||| -find_lexical_cv||| -find_next_masked|||n -find_runcv_where||| -find_runcv||5.008001| -find_rundefsv||5.013002| -find_script||| -find_span_end_mask|||n -find_span_end|||n -first_symbol|||n -fixup_errno_string||| -foldEQ_latin1_s2_folded|||n -foldEQ_latin1||5.013008|n -foldEQ_locale||5.013002|n -foldEQ_utf8||5.013002| -foldEQ||5.013002|n -fold_constants||| -forbid_setid||| -force_ident_maybe_lex||| -force_ident||| -force_list||| -force_next||| -force_strict_version||| -force_version||| -force_word||| -forget_pmop||| -form_nocontext|||vn -form||5.004000|v -fp_dup||| -fprintf_nocontext|||vn -free_c_backtrace||| -free_global_struct||| -free_tied_hv_pool||| -free_tmps||| -gen_constant_list||| -get_ANYOFM_contents||| -get_ANYOF_cp_list_for_ssc||| -get_and_check_backslash_N_name_wrapper||| -get_and_check_backslash_N_name||| -get_aux_mg||| -get_av|5.006000||p -get_c_backtrace_dump||| -get_c_backtrace||| -get_context||5.006000|n -get_cvn_flags||| -get_cvs|5.011000||p -get_cv|5.006000||p -get_db_sub||| -get_debug_opts||| -get_hash_seed||| -get_hv|5.006000||p -get_mstats||| -get_no_modify||| -get_num||| -get_op_descs||5.005000| -get_op_names||5.005000| -get_opargs||| -get_ppaddr||5.006000| -get_sv|5.006000||p -get_vtbl||5.005030| -getcwd_sv||5.007002| -getenv_len||| -glob_2number||| -glob_assign_glob||| -gp_dup||| -gp_free||| -gp_ref||| -grok_atoUV|||n -grok_bin|5.007003||p -grok_bslash_N||| -grok_hex|5.007003||p -grok_infnan||5.021004| -grok_number_flags||5.021002| -grok_number|5.007002||p -grok_numeric_radix|5.007002||p -grok_oct|5.007003||p -group_end||| -gv_AVadd||| -gv_HVadd||| -gv_IOadd||| -gv_SVadd||| -gv_add_by_type||5.011000| -gv_autoload4||5.004000| -gv_autoload_pvn||5.015004| -gv_autoload_pv||5.015004| -gv_autoload_sv||5.015004| -gv_check||| -gv_const_sv||5.009003| -gv_dump||5.006000| -gv_efullname3||5.003070| -gv_efullname4||5.006001| -gv_efullname||| -gv_fetchfile_flags||5.009005| -gv_fetchfile||| -gv_fetchmeth_autoload||5.007003| -gv_fetchmeth_internal||| -gv_fetchmeth_pv_autoload||5.015004| -gv_fetchmeth_pvn_autoload||5.015004| -gv_fetchmeth_pvn||5.015004| -gv_fetchmeth_pv||5.015004| -gv_fetchmeth_sv_autoload||5.015004| -gv_fetchmeth_sv||5.015004| -gv_fetchmethod_autoload||5.004000| -gv_fetchmethod||| -gv_fetchmeth||| -gv_fetchpvn_flags|5.009002||p -gv_fetchpvs|5.009004||p -gv_fetchpv||| -gv_fetchsv||| -gv_fullname3||5.003070| -gv_fullname4||5.006001| -gv_fullname||| -gv_handler||5.007001| -gv_init_pvn||| -gv_init_pv||5.015004| -gv_init_svtype||| -gv_init_sv||5.015004| -gv_init||| -gv_is_in_main||| -gv_magicalize_isa||| -gv_magicalize||| -gv_name_set||5.009004| -gv_override||| -gv_setref||| -gv_stashpvn_internal||| -gv_stashpvn|5.003070||p -gv_stashpvs|5.009003||p -gv_stashpv||| -gv_stashsvpvn_cached||| -gv_stashsv||| -handle_named_backref||| -handle_possible_posix||| -handle_regex_sets||| -handle_user_defined_property||| -he_dup||| -hek_dup||| -hfree_next_entry||| -hsplit||| -hv_assert||| -hv_auxinit_internal|||n -hv_auxinit||| -hv_clear_placeholders||5.009001| -hv_clear||| -hv_common_key_len||5.010000| -hv_common||5.010000| -hv_copy_hints_hv||5.009004| -hv_delayfree_ent||5.004000| -hv_delete_ent||5.003070| -hv_delete||| -hv_eiter_p||5.009003| -hv_eiter_set||5.009003| -hv_ename_add||| -hv_ename_delete||| -hv_exists_ent||5.003070| -hv_exists||| -hv_fetch_ent||5.003070| -hv_fetchs|5.009003||p -hv_fetch||| -hv_fill||5.013002| -hv_free_ent_ret||| -hv_free_entries||| -hv_free_ent||5.004000| -hv_iterinit||| -hv_iterkeysv||5.003070| -hv_iterkey||| -hv_iternextsv||| -hv_iternext||| -hv_iterval||| -hv_ksplit||5.003070| -hv_magic_check|||n -hv_magic||| -hv_name_set||5.009003| -hv_notallowed||| -hv_placeholders_get||5.009003| -hv_placeholders_p||| -hv_placeholders_set||5.009003| -hv_pushkv||| -hv_rand_set||5.018000| -hv_riter_p||5.009003| -hv_riter_set||5.009003| -hv_scalar||5.009001| -hv_store_ent||5.003070| -hv_stores|5.009004||p -hv_store||| -hv_undef_flags||| -hv_undef||| -ibcmp_locale||5.004000| -ibcmp_utf8||5.007003| -ibcmp||| -incline||| -incpush_if_exists||| -incpush_use_sep||| -incpush||| -ingroup||| -init_argv_symbols||| -init_constants||| -init_dbargs||| -init_debugger||| -init_global_struct||| -init_ids||| -init_interp||| -init_main_stash||| -init_named_cv||| -init_perllib||| -init_postdump_symbols||| -init_predump_symbols||| -init_stacks||5.005000| -init_tm||5.007002| -init_uniprops||| -inplace_aassign||| -instr|||n -intro_my||5.004000| -intuit_method||| -intuit_more||| -invert||| -invoke_exception_hook||| -io_close||| -isALNUMC_A|||p -isALNUMC|5.006000||p -isALNUM_A|||p -isALNUM|||p -isALPHANUMERIC_A|||p -isALPHANUMERIC|5.017008|5.017008|p -isALPHA_A|||p -isALPHA|||p -isASCII_A|||p -isASCII|5.006000||p -isBLANK_A|||p -isBLANK|5.006001||p -isC9_STRICT_UTF8_CHAR|||n -isCNTRL_A|||p -isCNTRL|5.006000||p -isDIGIT_A|||p -isDIGIT|||p -isFF_OVERLONG|||n -isFOO_utf8_lc||| -isGCB||| -isGRAPH_A|||p -isGRAPH|5.006000||p -isIDCONT_A|||p -isIDCONT|5.017008|5.017008|p -isIDFIRST_A|||p -isIDFIRST|||p -isLB||| -isLOWER_A|||p -isLOWER|||p -isOCTAL_A|||p -isOCTAL|5.013005|5.013005|p -isPRINT_A|||p -isPRINT|5.004000||p -isPSXSPC_A|||p -isPSXSPC|5.006001||p -isPUNCT_A|||p -isPUNCT|5.006000||p -isSB||| -isSCRIPT_RUN||| -isSPACE_A|||p -isSPACE|||p -isSTRICT_UTF8_CHAR|||n -isUPPER_A|||p -isUPPER|||p -isUTF8_CHAR_flags||| -isUTF8_CHAR||5.021001|n -isWB||| -isWORDCHAR_A|||p -isWORDCHAR|5.013006|5.013006|p -isXDIGIT_A|||p -isXDIGIT|5.006000||p -is_an_int||| -is_ascii_string||5.011000|n -is_c9strict_utf8_string_loclen|||n -is_c9strict_utf8_string_loc|||n -is_c9strict_utf8_string|||n -is_handle_constructor|||n -is_invariant_string||5.021007|n -is_lvalue_sub||5.007001| -is_safe_syscall||5.019004| -is_ssc_worth_it|||n -is_strict_utf8_string_loclen|||n -is_strict_utf8_string_loc|||n -is_strict_utf8_string|||n -is_utf8_char_buf||5.015008|n -is_utf8_common_with_len||| -is_utf8_common||| -is_utf8_cp_above_31_bits|||n -is_utf8_fixed_width_buf_flags|||n -is_utf8_fixed_width_buf_loc_flags|||n -is_utf8_fixed_width_buf_loclen_flags|||n -is_utf8_invariant_string_loc|||n -is_utf8_invariant_string|||n -is_utf8_non_invariant_string|||n -is_utf8_overlong_given_start_byte_ok|||n -is_utf8_string_flags|||n -is_utf8_string_loc_flags|||n -is_utf8_string_loclen_flags|||n -is_utf8_string_loclen||5.009003|n -is_utf8_string_loc||5.008001|n -is_utf8_string||5.006001|n -is_utf8_valid_partial_char_flags|||n -is_utf8_valid_partial_char|||n -isa_lookup||| -isinfnansv||| -isinfnan||5.021004|n -items|||n -ix|||n -jmaybe||| -join_exact||| -keyword_plugin_standard||| -keyword||| -leave_scope||| -lex_stuff_pvs||5.013005| -listkids||| -list||| -load_module_nocontext|||vn -load_module|5.006000||pv -localize||| -looks_like_bool||| -looks_like_number||| -lop||| -mPUSHi|5.009002||p -mPUSHn|5.009002||p -mPUSHp|5.009002||p -mPUSHs|5.010001||p -mPUSHu|5.009002||p -mXPUSHi|5.009002||p -mXPUSHn|5.009002||p -mXPUSHp|5.009002||p -mXPUSHs|5.010001||p -mXPUSHu|5.009002||p -magic_clear_all_env||| -magic_cleararylen_p||| -magic_clearenv||| -magic_clearhints||| -magic_clearhint||| -magic_clearisa||| -magic_clearpack||| -magic_clearsig||| -magic_copycallchecker||| -magic_dump||5.006000| -magic_existspack||| -magic_freearylen_p||| -magic_freeovrld||| -magic_getarylen||| -magic_getdebugvar||| -magic_getdefelem||| -magic_getnkeys||| -magic_getpack||| -magic_getpos||| -magic_getsig||| -magic_getsubstr||| -magic_gettaint||| -magic_getuvar||| -magic_getvec||| -magic_get||| -magic_killbackrefs||| -magic_methcall1||| -magic_methcall|||v -magic_methpack||| -magic_nextpack||| -magic_regdata_cnt||| -magic_regdatum_get||| -magic_regdatum_set||| -magic_scalarpack||| -magic_set_all_env||| -magic_setarylen||| -magic_setcollxfrm||| -magic_setdbline||| -magic_setdebugvar||| -magic_setdefelem||| -magic_setenv||| -magic_sethint||| -magic_setisa||| -magic_setlvref||| -magic_setmglob||| -magic_setnkeys||| -magic_setnonelem||| -magic_setpack||| -magic_setpos||| -magic_setregexp||| -magic_setsig||| -magic_setsubstr||| -magic_settaint||| -magic_setutf8||| -magic_setuvar||| -magic_setvec||| -magic_set||| -magic_sizepack||| -magic_wipepack||| -make_matcher||| -make_trie||| -malloc_good_size|||n -malloced_size|||n -malloc||5.007002|n -markstack_grow||5.021001| -matcher_matches_sv||| -maybe_multimagic_gv||| -mayberelocate||| -measure_struct||| -memEQs|5.009005||p -memEQ|5.004000||p -memNEs|5.009005||p -memNE|5.004000||p -mem_collxfrm||| -mem_log_alloc|||n -mem_log_common|||n -mem_log_free|||n -mem_log_realloc|||n -mess_alloc||| -mess_nocontext|||pvn -mess_sv|5.013001||p -mess|5.006000||pv -mfree||5.007002|n -mg_clear||| -mg_copy||| -mg_dup||| -mg_find_mglob||| -mg_findext|5.013008||pn -mg_find|||n -mg_free_type||5.013006| -mg_freeext||| -mg_free||| -mg_get||| -mg_localize||| -mg_magical|||n -mg_set||| -mg_size||5.005000| -mini_mktime||5.007002|n -minus_v||| -missingterm||| -mode_from_discipline||| -modkids||| -more_bodies||| -more_sv||| -moreswitches||| -move_proto_attr||| -mro_clean_isarev||| -mro_gather_and_rename||| -mro_get_from_name||5.010001| -mro_get_linear_isa_dfs||| -mro_get_linear_isa||5.009005| -mro_get_private_data||5.010001| -mro_isa_changed_in||| -mro_meta_dup||| -mro_meta_init||| -mro_method_changed_in||5.009005| -mro_package_moved||| -mro_register||5.010001| -mro_set_mro||5.010001| -mro_set_private_data||5.010001| -mul128||| -multiconcat_stringify||| -multideref_stringify||| -my_atof2||5.007002| -my_atof3||| -my_atof||5.006000| -my_attrs||| -my_bytes_to_utf8|||n -my_chsize||| -my_clearenv||| -my_cxt_index||| -my_cxt_init||| -my_dirfd||5.009005|n -my_exit_jump||| -my_exit||| -my_failure_exit||5.004000| -my_fflush_all||5.006000| -my_fork||5.007003|n -my_kid||| -my_lstat_flags||| -my_lstat||5.024000| -my_memrchr|||n -my_mkostemp|||n -my_mkstemp_cloexec|||n -my_mkstemp|||n -my_nl_langinfo|||n -my_pclose||5.003070| -my_popen_list||5.007001| -my_popen||5.003070| -my_setenv||| -my_snprintf|5.009004||pvn -my_socketpair||5.007003|n -my_sprintf|5.009003||pvn -my_stat_flags||| -my_stat||5.024000| -my_strerror||| -my_strftime||5.007002| -my_strlcat|5.009004||pn -my_strlcpy|5.009004||pn -my_strnlen|||pn -my_strtod|||n -my_unexec||| -my_vsnprintf||5.009004|n -need_utf8|||n -newANONATTRSUB||5.006000| -newANONHASH||| -newANONLIST||| -newANONSUB||| -newASSIGNOP||| -newATTRSUB_x||| -newATTRSUB||5.006000| -newAVREF||| -newAV||| -newBINOP||| -newCONDOP||| -newCONSTSUB_flags||5.015006| -newCONSTSUB|5.004050||p -newCVREF||| -newDEFSVOP||5.021006| -newFORM||| -newFOROP||5.013007| -newGIVENOP||5.009003| -newGIVWHENOP||| -newGVOP||| -newGVREF||| -newGVgen_flags||5.015004| -newGVgen||| -newHVREF||| -newHVhv||5.005000| -newHV||| -newIO||| -newLISTOP||| -newLOGOP||| -newLOOPEX||| -newLOOPOP||| -newMETHOP_internal||| -newMETHOP_named||5.021005| -newMETHOP||5.021005| -newMYSUB||5.017004| -newNULLLIST||| -newOP||| -newPADOP||| -newPMOP||| -newPROG||| -newPVOP||| -newRANGE||| -newRV_inc|5.004000||p -newRV_noinc|5.004000||p -newRV||| -newSLICEOP||| -newSTATEOP||| -newSTUB||| -newSUB||| -newSVOP||| -newSVREF||| -newSV_type|5.009005||p -newSVavdefelem||| -newSVhek||5.009003| -newSViv||| -newSVnv||| -newSVpadname||5.017004| -newSVpv_share||5.013006| -newSVpvf_nocontext|||vn -newSVpvf||5.004000|v -newSVpvn_flags|5.010001||p -newSVpvn_share|5.007001||p -newSVpvn_utf8|5.010001||p -newSVpvn|5.004050||p -newSVpvs_flags|5.010001||p -newSVpvs_share|5.009003||p -newSVpvs|5.009003||p -newSVpv||| -newSVrv||| -newSVsv_flags||| -newSVsv_nomg||| -newSVsv||| -newSVuv|5.006000||p -newSV||| -newUNOP_AUX||5.021007| -newUNOP||| -newWHENOP||5.009003| -newWHILEOP||5.013007| -newXS_deffile||| -newXS_len_flags||| -newXSproto||5.006000| -newXS||5.006000| -new_collate||| -new_constant||| -new_ctype||| -new_he||| -new_logop||| -new_msg_hv||| -new_numeric||| -new_regcurly|||n -new_stackinfo||5.005000| -new_version||5.009000| -next_symbol||| -nextargv||| -nextchar||| -ninstr|||n -no_bareword_allowed||| -no_fh_allowed||| -no_op||| -noperl_die|||vn -not_a_number||| -not_incrementable||| -nothreadhook||5.008000| -notify_parser_that_changed_to_utf8||| -nuke_stacks||| -num_overflow|||n -oopsAV||| -oopsHV||| -op_append_elem||5.013006| -op_append_list||5.013006| -op_class||| -op_clear||| -op_contextualize||5.013006| -op_convert_list||5.021006| -op_dump||5.006000| -op_free||| -op_integerize||| -op_linklist||5.013006| -op_lvalue_flags||| -op_null||5.007002| -op_parent|||n -op_prepend_elem||5.013006| -op_refcnt_lock||5.009002| -op_refcnt_unlock||5.009002| -op_relocate_sv||| -op_sibling_splice||5.021002|n -op_std_init||| -open_script||| -openn_cleanup||| -openn_setup||| -opmethod_stash||| -opslab_force_free||| -opslab_free_nopad||| -opslab_free||| -optimize_optree||| -optimize_op||| -output_posix_warnings||| -pMY_CXT_|5.007003||p -pMY_CXT|5.007003||p -pTHX_|5.006000||p -pTHX|5.006000||p -packWARN|5.007003||p -pack_cat||5.007003| -pack_rec||| -package_version||| -package||| -packlist||5.008001| -pad_add_anon||5.008001| -pad_add_name_pvn||5.015001| -pad_add_name_pvs||5.015001| -pad_add_name_pv||5.015001| -pad_add_name_sv||5.015001| -pad_add_weakref||| -pad_alloc_name||| -pad_block_start||| -pad_check_dup||| -pad_compname_type||5.009003| -pad_findlex||| -pad_findmy_pvn||5.015001| -pad_findmy_pvs||5.015001| -pad_findmy_pv||5.015001| -pad_findmy_sv||5.015001| -pad_fixup_inner_anons||| -pad_free||| -pad_leavemy||| -pad_new||5.008001| -pad_push||| -pad_reset||| -pad_setsv||| -pad_sv||| -pad_swipe||| -padlist_dup||| -padlist_store||| -padname_dup||| -padname_free||| -padnamelist_dup||| -padnamelist_free||| -parse_body||| -parse_gv_stash_name||| -parse_ident||| -parse_lparen_question_flags||| -parse_unicode_opts||| -parse_uniprop_string||| -parser_dup||| -parser_free_nexttoke_ops||| -parser_free||| -path_is_searchable|||n -peep||| -pending_ident||| -perl_alloc_using|||n -perl_alloc|||n -perl_clone_using|||n -perl_clone|||n -perl_construct|||n -perl_destruct||5.007003|n -perl_free|||n -perl_parse||5.006000|n -perl_run|||n -pidgone||| -pm_description||| -pmop_dump||5.006000| -pmruntime||| -pmtrans||| -pop_scope||| -populate_ANYOF_from_invlist||| -populate_isa|||v -pregcomp||5.009005| -pregexec||| -pregfree2||5.011000| -pregfree||| -prescan_version||5.011004| -print_bytes_for_locale||| -print_collxfrm_input_and_return||| -printbuf||| -printf_nocontext|||vn -process_special_blocks||| -ptr_hash|||n -ptr_table_fetch||5.009005| -ptr_table_find|||n -ptr_table_free||5.009005| -ptr_table_new||5.009005| -ptr_table_split||5.009005| -ptr_table_store||5.009005| -push_scope||| -put_charclass_bitmap_innards_common||| -put_charclass_bitmap_innards_invlist||| -put_charclass_bitmap_innards||| -put_code_point||| -put_range||| -pv_display|5.006000||p -pv_escape|5.009004||p -pv_pretty|5.009004||p -pv_uni_display||5.007003| -qerror||| -quadmath_format_needed|||n -quadmath_format_single|||n -re_compile||5.009005| -re_croak2||| -re_dup_guts||| -re_exec_indentf|||v -re_indentf|||v -re_intuit_start||5.019001| -re_intuit_string||5.006000| -re_op_compile||| -re_printf|||v -realloc||5.007002|n -reentrant_free||5.024000| -reentrant_init||5.024000| -reentrant_retry||5.024000|vn -reentrant_size||5.024000| -ref_array_or_hash||| -refcounted_he_chain_2hv||| -refcounted_he_fetch_pvn||| -refcounted_he_fetch_pvs||| -refcounted_he_fetch_pv||| -refcounted_he_fetch_sv||| -refcounted_he_free||| -refcounted_he_inc||| -refcounted_he_new_pvn||| -refcounted_he_new_pvs||| -refcounted_he_new_pv||| -refcounted_he_new_sv||| -refcounted_he_value||| -refkids||| -refto||| -ref||5.024000| -reg2Lanode||| -reg_check_named_buff_matched|||n -reg_named_buff_all||5.009005| -reg_named_buff_exists||5.009005| -reg_named_buff_fetch||5.009005| -reg_named_buff_firstkey||5.009005| -reg_named_buff_iter||| -reg_named_buff_nextkey||5.009005| -reg_named_buff_scalar||5.009005| -reg_named_buff||| -reg_node||| -reg_numbered_buff_fetch||| -reg_numbered_buff_length||| -reg_numbered_buff_store||| -reg_qr_package||| -reg_scan_name||| -reg_skipcomment|||n -reg_temp_copy||| -reganode||| -regatom||| -regbranch||| -regclass||| -regcp_restore||| -regcppop||| -regcppush||| -regcurly|||n -regdump_extflags||| -regdump_intflags||| -regdump||5.005000| -regdupe_internal||| -regex_set_precedence|||n -regexec_flags||5.005000| -regfree_internal||5.009005| -reghop3|||n -reghop4|||n -reghopmaybe3|||n -reginclass||| -reginitcolors||5.006000| -reginsert||| -regmatch||| -regnext||5.005000| -regnode_guts||| -regpiece||| -regprop||| -regrepeat||| -regtail_study||| -regtail||| -regtry||| -reg||| -repeatcpy|||n -report_evil_fh||| -report_redefined_cv||| -report_uninit||| -report_wrongway_fh||| -require_pv||5.006000| -require_tie_mod||| -restore_magic||| -restore_switched_locale||| -rninstr|||n -rpeep||| -rsignal_restore||| -rsignal_save||| -rsignal_state||5.004000| -rsignal||5.004000| -run_body||| -run_user_filter||| -runops_debug||5.005000| -runops_standard||5.005000| -rv2cv_op_cv||5.013006| -rvpv_dup||| -rxres_free||| -rxres_restore||| -rxres_save||| -safesyscalloc||5.006000|n -safesysfree||5.006000|n -safesysmalloc||5.006000|n -safesysrealloc||5.006000|n -same_dirent||| -save_I16||5.004000| -save_I32||| -save_I8||5.006000| -save_adelete||5.011000| -save_aelem_flags||5.011000| -save_aelem||5.004050| -save_alloc||5.006000| -save_aptr||| -save_ary||| -save_bool||5.008001| -save_clearsv||| -save_delete||| -save_destructor_x||5.006000| -save_destructor||5.006000| -save_freeop||| -save_freepv||| -save_freesv||| -save_generic_pvref||5.006001| -save_generic_svref||5.005030| -save_gp||5.004000| -save_hash||| -save_hdelete||5.011000| -save_hek_flags|||n -save_helem_flags||5.011000| -save_helem||5.004050| -save_hints||5.010001| -save_hptr||| -save_int||| -save_item||| -save_iv||5.005000| -save_lines||| -save_list||| -save_long||| -save_magic_flags||| -save_mortalizesv||5.007001| -save_nogv||| -save_op||5.005000| -save_padsv_and_mortalize||5.010001| -save_pptr||| -save_pushi32ptr||5.010001| -save_pushptri32ptr||| -save_pushptrptr||5.010001| -save_pushptr||5.010001| -save_re_context||5.006000| -save_scalar_at||| -save_scalar||| -save_set_svflags||5.009000| -save_shared_pvref||5.007003| -save_sptr||| -save_strlen||| -save_svref||| -save_to_buffer|||n -save_vptr||5.006000| -savepvn||| -savepvs||5.009003| -savepv||| -savesharedpvn||5.009005| -savesharedpvs||5.013006| -savesharedpv||5.007003| -savesharedsvpv||5.013006| -savestack_grow_cnt||5.008001| -savestack_grow||| -savesvpv||5.009002| -sawparens||| -scalar_mod_type|||n -scalarboolean||| -scalarkids||| -scalarseq||| -scalarvoid||| -scalar||| -scan_bin||5.006000| -scan_commit||| -scan_const||| -scan_formline||| -scan_heredoc||| -scan_hex||| -scan_ident||| -scan_inputsymbol||| -scan_num||5.007001| -scan_oct||| -scan_pat||| -scan_subst||| -scan_trans||| -scan_version||5.009001| -scan_vstring||5.009005| -search_const||| -seed||5.008001| -sequence_num||| -set_ANYOF_arg||| -set_caret_X||| -set_context||5.006000|n -set_numeric_radix||5.006000| -set_numeric_standard||5.006000| -set_numeric_underlying||| -set_padlist|||n -set_regex_pv||| -setdefout||| -setfd_cloexec_for_nonsysfd||| -setfd_cloexec_or_inhexec_by_sysfdness||| -setfd_cloexec|||n -setfd_inhexec_for_sysfd||| -setfd_inhexec|||n -setlocale_debug_string|||n -share_hek_flags||| -share_hek||5.004000| -should_warn_nl|||n -si_dup||| -sighandler|||n -simplify_sort||| -skip_to_be_ignored_text||| -softref2xv||| -sortcv_stacked||| -sortcv_xsub||| -sortcv||| -sortsv_flags||5.009003| -sortsv||5.007003| -space_join_names_mortal||| -ss_dup||| -ssc_add_range||| -ssc_and||| -ssc_anything||| -ssc_clear_locale|||n -ssc_cp_and||| -ssc_finalize||| -ssc_init||| -ssc_intersection||| -ssc_is_anything|||n -ssc_is_cp_posixl_init|||n -ssc_or||| -ssc_union||| -stack_grow||| -start_subparse||5.004000| -stdize_locale||| -strEQ||| -strGE||| -strGT||| -strLE||| -strLT||| -strNE||| -str_to_version||5.006000| -strip_return||| -strnEQ||| -strnNE||| -study_chunk||| -sub_crush_depth||| -sublex_done||| -sublex_push||| -sublex_start||| -sv_2bool_flags||5.013006| -sv_2bool||| -sv_2cv||| -sv_2io||| -sv_2iuv_common||| -sv_2iuv_non_preserve||| -sv_2iv_flags||5.009001| -sv_2iv||| -sv_2mortal||| -sv_2nv_flags||5.013001| -sv_2pv_flags|5.007002||p -sv_2pv_nolen|5.006000||p -sv_2pvbyte_nolen|5.006000||p -sv_2pvbyte|5.006000||p -sv_2pvutf8_nolen||5.006000| -sv_2pvutf8||5.006000| -sv_2pv||| -sv_2uv_flags||5.009001| -sv_2uv|5.004000||p -sv_add_arena||| -sv_add_backref||| -sv_backoff|||n -sv_bless||| -sv_buf_to_ro||| -sv_buf_to_rw||| -sv_cat_decode||5.008001| -sv_catpv_flags||5.013006| -sv_catpv_mg|5.004050||p -sv_catpv_nomg||5.013006| -sv_catpvf_mg_nocontext|||pvn -sv_catpvf_mg|5.006000|5.004000|pv -sv_catpvf_nocontext|||vn -sv_catpvf||5.004000|v -sv_catpvn_flags||5.007002| -sv_catpvn_mg|5.004050||p -sv_catpvn_nomg|5.007002||p -sv_catpvn||| -sv_catpvs_flags||5.013006| -sv_catpvs_mg||5.013006| -sv_catpvs_nomg||5.013006| -sv_catpvs|5.009003||p -sv_catpv||| -sv_catsv_flags||5.007002| -sv_catsv_mg|5.004050||p -sv_catsv_nomg|5.007002||p -sv_catsv||| -sv_chop||| -sv_clean_all||| -sv_clean_objs||| -sv_clear||| -sv_cmp_flags||5.013006| -sv_cmp_locale_flags||5.013006| -sv_cmp_locale||5.004000| -sv_cmp||| -sv_collxfrm_flags||5.013006| -sv_collxfrm||| -sv_copypv_flags||5.017002| -sv_copypv_nomg||5.017002| -sv_copypv||| -sv_dec_nomg||5.013002| -sv_dec||| -sv_del_backref||| -sv_derived_from_pvn||5.015004| -sv_derived_from_pv||5.015004| -sv_derived_from_sv||5.015004| -sv_derived_from||5.004000| -sv_destroyable||5.010000| -sv_display||| -sv_does_pvn||5.015004| -sv_does_pv||5.015004| -sv_does_sv||5.015004| -sv_does||5.009004| -sv_dump||| -sv_dup_common||| -sv_dup_inc_multiple||| -sv_dup_inc||| -sv_dup||| -sv_eq_flags||5.013006| -sv_eq||| -sv_exp_grow||| -sv_force_normal_flags||5.007001| -sv_force_normal||5.006000| -sv_free_arenas||| -sv_free||| -sv_gets||5.003070| -sv_grow||| -sv_i_ncmp||| -sv_inc_nomg||5.013002| -sv_inc||| -sv_insert_flags||5.010001| -sv_insert||| -sv_isa||| -sv_isobject||| -sv_iv||5.005000| -sv_len_utf8_nomg||| -sv_len_utf8||5.006000| -sv_len||| -sv_magic_portable|5.024000|5.004000|p -sv_magicext_mglob||| -sv_magicext||5.007003| -sv_magic||| -sv_mortalcopy_flags||| -sv_mortalcopy||| -sv_ncmp||| -sv_newmortal||| -sv_newref||| -sv_nolocking||5.007003| -sv_nosharing||5.007003| -sv_nounlocking||| -sv_nv||5.005000| -sv_only_taint_gmagic|||n -sv_or_pv_pos_u2b||| -sv_peek||5.005000| -sv_pos_b2u_flags||5.019003| -sv_pos_b2u_midway||| -sv_pos_b2u||5.006000| -sv_pos_u2b_cached||| -sv_pos_u2b_flags||5.011005| -sv_pos_u2b_forwards|||n -sv_pos_u2b_midway|||n -sv_pos_u2b||5.006000| -sv_pvbyten_force||5.006000| -sv_pvbyten||5.006000| -sv_pvbyte||5.006000| -sv_pvn_force_flags|5.007002||p -sv_pvn_force||| -sv_pvn_nomg|5.007003|5.005000|p -sv_pvn||5.005000| -sv_pvutf8n_force||5.006000| -sv_pvutf8n||5.006000| -sv_pvutf8||5.006000| -sv_pv||5.006000| -sv_recode_to_utf8||5.007003| -sv_reftype||| -sv_ref||5.015004| -sv_replace||| -sv_report_used||| -sv_resetpvn||| -sv_reset||| -sv_rvunweaken||| -sv_rvweaken||5.006000| -sv_set_undef||| -sv_sethek||| -sv_setiv_mg|5.004050||p -sv_setiv||| -sv_setnv_mg|5.006000||p -sv_setnv||| -sv_setpv_bufsize||| -sv_setpv_mg|5.004050||p -sv_setpvf_mg_nocontext|||pvn -sv_setpvf_mg|5.006000|5.004000|pv -sv_setpvf_nocontext|||vn -sv_setpvf||5.004000|v -sv_setpviv_mg||5.008001| -sv_setpviv||5.008001| -sv_setpvn_mg|5.004050||p -sv_setpvn||| -sv_setpvs_mg||5.013006| -sv_setpvs|5.009004||p -sv_setpv||| -sv_setref_iv||| -sv_setref_nv||| -sv_setref_pvn||| -sv_setref_pvs||5.024000| -sv_setref_pv||| -sv_setref_uv||5.007001| -sv_setsv_flags||5.007002| -sv_setsv_mg|5.004050||p -sv_setsv_nomg|5.007002||p -sv_setsv||| -sv_setuv_mg|5.004050||p -sv_setuv|5.004000||p -sv_string_from_errnum||| -sv_tainted||5.004000| -sv_taint||5.004000| -sv_true||5.005000| -sv_unglob||| -sv_uni_display||5.007003| -sv_unmagicext|5.013008||p -sv_unmagic||| -sv_unref_flags||5.007001| -sv_unref||| -sv_untaint||5.004000| -sv_upgrade||| -sv_usepvn_flags||5.009004| -sv_usepvn_mg|5.004050||p -sv_usepvn||| -sv_utf8_decode||| -sv_utf8_downgrade||| -sv_utf8_encode||5.006000| -sv_utf8_upgrade_flags_grow||5.011000| -sv_utf8_upgrade_flags||5.007002| -sv_utf8_upgrade_nomg||5.007002| -sv_utf8_upgrade||5.007001| -sv_uv|5.005000||p -sv_vcatpvf_mg|5.006000|5.004000|p -sv_vcatpvfn_flags||5.017002| -sv_vcatpvfn||5.004000| -sv_vcatpvf|5.006000|5.004000|p -sv_vsetpvf_mg|5.006000|5.004000|p -sv_vsetpvfn||5.004000| -sv_vsetpvf|5.006000|5.004000|p -svtype||| -swallow_bom||| -swatch_get||| -switch_category_locale_to_template||| -switch_to_global_locale|||n -sync_locale||5.021004|n -sys_init3||5.010000|n -sys_init||5.010000|n -sys_intern_clear||| -sys_intern_dup||| -sys_intern_init||| -sys_term||5.010000|n -taint_env||| -taint_proper||| -tied_method|||v -tmps_grow_p||| -toFOLD_utf8_safe||| -toFOLD_utf8||5.019001| -toFOLD_uvchr||5.023009| -toFOLD||5.019001| -toLOWER_L1||5.019001| -toLOWER_LC||5.004000| -toLOWER_utf8_safe||| -toLOWER_utf8||5.015007| -toLOWER_uvchr||5.023009| -toLOWER||| -toTITLE_utf8_safe||| -toTITLE_utf8||5.015007| -toTITLE_uvchr||5.023009| -toTITLE||5.019001| -toUPPER_utf8_safe||| -toUPPER_utf8||5.015007| -toUPPER_uvchr||5.023009| -toUPPER||| -to_byte_substr||| -to_lower_latin1|||n -to_utf8_substr||| -tokenize_use||| -tokeq||| -tokereport||| -too_few_arguments_pv||| -too_many_arguments_pv||| -translate_substr_offsets|||n -traverse_op_tree||| -try_amagic_bin||| -try_amagic_un||| -turkic_fc||| -turkic_lc||| -turkic_uc||| -uiv_2buf|||n -unlnk||| -unpack_rec||| -unpack_str||5.007003| -unpackstring||5.008001| -unreferenced_to_tmp_stack||| -unshare_hek_or_pvn||| -unshare_hek||| -unsharepvn||5.003070| -unwind_handler_stack||| -update_debugger_info||| -upg_version||5.009005| -usage||| -utf16_textfilter||| -utf16_to_utf8_reversed||5.006001| -utf16_to_utf8||5.006001| -utf8_distance||5.006000| -utf8_hop_back|||n -utf8_hop_forward|||n -utf8_hop_safe|||n -utf8_hop||5.006000|n -utf8_length||5.007001| -utf8_mg_len_cache_update||| -utf8_mg_pos_cache_update||| -utf8_to_uvchr_buf|5.015009|5.015009|p -utf8_to_uvchr|||p -utf8n_to_uvchr_error|||n -utf8n_to_uvchr||5.007001|n -utf8n_to_uvuni||5.007001| -utilize||| -uvchr_to_utf8_flags||5.007003| -uvchr_to_utf8||5.007001| -uvoffuni_to_utf8_flags||5.019004| -uvuni_to_utf8_flags||5.007003| -uvuni_to_utf8||5.007001| -valid_utf8_to_uvchr|||n -validate_suid||| -variant_under_utf8_count|||n -varname||| -vcmp||5.009000| -vcroak||5.006000| -vdeb||5.007003| -vform||5.006000| -visit||| -vivify_defelem||| -vivify_ref||| -vload_module|5.006000||p -vmess|5.006000|5.006000|p -vnewSVpvf|5.006000|5.004000|p -vnormal||5.009002| -vnumify||5.009000| -vstringify||5.009000| -vverify||5.009003| -vwarner||5.006000| -vwarn||5.006000| -wait4pid||| -warn_nocontext|||pvn -warn_on_first_deprecated_use||| -warn_sv|5.013001||p -warner_nocontext|||vn -warner|5.006000|5.004000|pv -warn|||v -was_lvalue_sub||| -watch||| -whichsig_pvn||5.015004| -whichsig_pv||5.015004| -whichsig_sv||5.015004| -whichsig||| -win32_croak_not_implemented|||n -win32_setlocale||| -with_queued_errors||| -wrap_op_checker||5.015008| -write_to_stderr||| -xs_boot_epilog||| -xs_handshake|||vn -xs_version_bootcheck||| -yyerror_pvn||| -yyerror_pv||| -yyerror||| -yylex||| -yyparse||| -yyquit||| -yyunlex||| -yywarn||| -); - -if (exists $opt{'list-unsupported'}) { - my $f; - for $f (sort { lc $a cmp lc $b } keys %API) { - next unless $API{$f}{todo}; - print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n"; - } - exit 0; -} - -# Scan for possible replacement candidates - -my(%replace, %need, %hints, %warnings, %depends); -my $replace = 0; -my($hint, $define, $function); - -sub find_api -{ - my $code = shift; - $code =~ s{ - / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) - | "[^"\\]*(?:\\.[^"\\]*)*" - | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx; - grep { exists $API{$_} } $code =~ /(\w+)/mg; -} - -while () { - if ($hint) { - my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings; - if (m{^\s*\*\s(.*?)\s*$}) { - for (@{$hint->[1]}) { - $h->{$_} ||= ''; # suppress warning with older perls - $h->{$_} .= "$1\n"; - } - } - else { undef $hint } - } - - $hint = [$1, [split /,?\s+/, $2]] - if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$}; - - if ($define) { - if ($define->[1] =~ /\\$/) { - $define->[1] .= $_; - } - else { - if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) { - my @n = find_api($define->[1]); - push @{$depends{$define->[0]}}, @n if @n - } - undef $define; - } - } - - $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)}; - - if ($function) { - if (/^}/) { - if (exists $API{$function->[0]}) { - my @n = find_api($function->[1]); - push @{$depends{$function->[0]}}, @n if @n - } - undef $function; - } - else { - $function->[1] .= $_; - } - } - - $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)}; - - $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; - $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; - $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; - $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$}; - - if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { - my @deps = map { s/\s+//g; $_ } split /,/, $3; - my $d; - for $d (map { s/\s+//g; $_ } split /,/, $1) { - push @{$depends{$d}}, @deps; - } - } - - $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; -} - -for (values %depends) { - my %s; - $_ = [sort grep !$s{$_}++, @$_]; -} - -if (exists $opt{'api-info'}) { - my $f; - my $count = 0; - my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; - for $f (sort { lc $a cmp lc $b } keys %API) { - next unless $f =~ /$match/; - print "\n=== $f ===\n\n"; - my $info = 0; - if ($API{$f}{base} || $API{$f}{todo}) { - my $base = format_version($API{$f}{base} || $API{$f}{todo}); - print "Supported at least starting from perl-$base.\n"; - $info++; - } - if ($API{$f}{provided}) { - my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003"; - print "Support by $ppport provided back to perl-$todo.\n"; - print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f}; - print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; - print "\n$hints{$f}" if exists $hints{$f}; - print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f}; - $info++; - } - print "No portability information available.\n" unless $info; - $count++; - } - $count or print "Found no API matching '$opt{'api-info'}'."; - print "\n"; - exit 0; -} - -if (exists $opt{'list-provided'}) { - my $f; - for $f (sort { lc $a cmp lc $b } keys %API) { - next unless $API{$f}{provided}; - my @flags; - push @flags, 'explicit' if exists $need{$f}; - push @flags, 'depend' if exists $depends{$f}; - push @flags, 'hint' if exists $hints{$f}; - push @flags, 'warning' if exists $warnings{$f}; - my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; - print "$f$flags\n"; - } - exit 0; -} - -my @files; -my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc ); -my $srcext = join '|', map { quotemeta $_ } @srcext; - -if (@ARGV) { - my %seen; - for (@ARGV) { - if (-e) { - if (-f) { - push @files, $_ unless $seen{$_}++; - } - else { warn "'$_' is not a file.\n" } - } - else { - my @new = grep { -f } glob $_ - or warn "'$_' does not exist.\n"; - push @files, grep { !$seen{$_}++ } @new; - } - } -} -else { - eval { - require File::Find; - File::Find::find(sub { - $File::Find::name =~ /($srcext)$/i - and push @files, $File::Find::name; - }, '.'); - }; - if ($@) { - @files = map { glob "*$_" } @srcext; - } -} - -if (!@ARGV || $opt{filter}) { - my(@in, @out); - my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; - for (@files) { - my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i; - push @{ $out ? \@out : \@in }, $_; - } - if (@ARGV && @out) { - warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); - } - @files = @in; -} - -die "No input files given!\n" unless @files; - -my(%files, %global, %revreplace); -%revreplace = reverse %replace; -my $filename; -my $patch_opened = 0; - -for $filename (@files) { - unless (open IN, "<$filename") { - warn "Unable to read from $filename: $!\n"; - next; - } - - info("Scanning $filename ..."); - - my $c = do { local $/; }; - close IN; - - my %file = (orig => $c, changes => 0); - - # Temporarily remove C/XS comments and strings from the code - my @ccom; - - $c =~ s{ - ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]* - | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* ) - | ( ^$HS*\#[^\r\n]* - | "[^"\\]*(?:\\.[^"\\]*)*" - | '[^'\\]*(?:\\.[^'\\]*)*' - | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) ) - }{ defined $2 and push @ccom, $2; - defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex; - - $file{ccom} = \@ccom; - $file{code} = $c; - $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m; - - my $func; - - for $func (keys %API) { - my $match = $func; - $match .= "|$revreplace{$func}" if exists $revreplace{$func}; - if ($c =~ /\b(?:Perl_)?($match)\b/) { - $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; - $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; - if (exists $API{$func}{provided}) { - $file{uses_provided}{$func}++; - if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) { - $file{uses}{$func}++; - my @deps = rec_depend($func); - if (@deps) { - $file{uses_deps}{$func} = \@deps; - for (@deps) { - $file{uses}{$_} = 0 unless exists $file{uses}{$_}; - } - } - for ($func, @deps) { - $file{needs}{$_} = 'static' if exists $need{$_}; - } - } - } - if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) { - if ($c =~ /\b$func\b/) { - $file{uses_todo}{$func}++; - } - } - } - } - - while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { - if (exists $need{$2}) { - $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; - } - else { warning("Possibly wrong #define $1 in $filename") } - } - - for (qw(uses needs uses_todo needed_global needed_static)) { - for $func (keys %{$file{$_}}) { - push @{$global{$_}{$func}}, $filename; - } - } - - $files{$filename} = \%file; -} - -# Globally resolve NEED_'s -my $need; -for $need (keys %{$global{needs}}) { - if (@{$global{needs}{$need}} > 1) { - my @targets = @{$global{needs}{$need}}; - my @t = grep $files{$_}{needed_global}{$need}, @targets; - @targets = @t if @t; - @t = grep /\.xs$/i, @targets; - @targets = @t if @t; - my $target = shift @targets; - $files{$target}{needs}{$need} = 'global'; - for (@{$global{needs}{$need}}) { - $files{$_}{needs}{$need} = 'extern' if $_ ne $target; - } - } -} - -for $filename (@files) { - exists $files{$filename} or next; - - info("=== Analyzing $filename ==="); - - my %file = %{$files{$filename}}; - my $func; - my $c = $file{code}; - my $warnings = 0; - - for $func (sort keys %{$file{uses_Perl}}) { - if ($API{$func}{varargs}) { - unless ($API{$func}{nothxarg}) { - my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} - { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); - if ($changes) { - warning("Doesn't pass interpreter argument aTHX to Perl_$func"); - $file{changes} += $changes; - } - } - } - else { - warning("Uses Perl_$func instead of $func"); - $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} - {$func$1(}g); - } - } - - for $func (sort keys %{$file{uses_replace}}) { - warning("Uses $func instead of $replace{$func}"); - $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); - } - - for $func (sort keys %{$file{uses_provided}}) { - if ($file{uses}{$func}) { - if (exists $file{uses_deps}{$func}) { - diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); - } - else { - diag("Uses $func"); - } - } - $warnings += hint($func); - } - - unless ($opt{quiet}) { - for $func (sort keys %{$file{uses_todo}}) { - print "*** WARNING: Uses $func, which may not be portable below perl ", - format_version($API{$func}{todo}), ", even with '$ppport'\n"; - $warnings++; - } - } - - for $func (sort keys %{$file{needed_static}}) { - my $message = ''; - if (not exists $file{uses}{$func}) { - $message = "No need to define NEED_$func if $func is never used"; - } - elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { - $message = "No need to define NEED_$func when already needed globally"; - } - if ($message) { - diag($message); - $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); - } - } - - for $func (sort keys %{$file{needed_global}}) { - my $message = ''; - if (not exists $global{uses}{$func}) { - $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; - } - elsif (exists $file{needs}{$func}) { - if ($file{needs}{$func} eq 'extern') { - $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; - } - elsif ($file{needs}{$func} eq 'static') { - $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; - } - } - if ($message) { - diag($message); - $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); - } - } - - $file{needs_inc_ppport} = keys %{$file{uses}}; - - if ($file{needs_inc_ppport}) { - my $pp = ''; - - for $func (sort keys %{$file{needs}}) { - my $type = $file{needs}{$func}; - next if $type eq 'extern'; - my $suffix = $type eq 'global' ? '_GLOBAL' : ''; - unless (exists $file{"needed_$type"}{$func}) { - if ($type eq 'global') { - diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); - } - else { - diag("File needs $func, adding static request"); - } - $pp .= "#define NEED_$func$suffix\n"; - } - } - - if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { - $pp = ''; - $file{changes}++; - } - - unless ($file{has_inc_ppport}) { - diag("Needs to include '$ppport'"); - $pp .= qq(#include "$ppport"\n) - } - - if ($pp) { - $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) - || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) - || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) - || ($c =~ s/^/$pp/); - } - } - else { - if ($file{has_inc_ppport}) { - diag("No need to include '$ppport'"); - $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); - } - } - - # put back in our C comments - my $ix; - my $cppc = 0; - my @ccom = @{$file{ccom}}; - for $ix (0 .. $#ccom) { - if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { - $cppc++; - $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; - } - else { - $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; - } - } - - if ($cppc) { - my $s = $cppc != 1 ? 's' : ''; - warning("Uses $cppc C++ style comment$s, which is not portable"); - } - - my $s = $warnings != 1 ? 's' : ''; - my $warn = $warnings ? " ($warnings warning$s)" : ''; - info("Analysis completed$warn"); - - if ($file{changes}) { - if (exists $opt{copy}) { - my $newfile = "$filename$opt{copy}"; - if (-e $newfile) { - error("'$newfile' already exists, refusing to write copy of '$filename'"); - } - else { - local *F; - if (open F, ">$newfile") { - info("Writing copy of '$filename' with changes to '$newfile'"); - print F $c; - close F; - } - else { - error("Cannot open '$newfile' for writing: $!"); - } - } - } - elsif (exists $opt{patch} || $opt{changes}) { - if (exists $opt{patch}) { - unless ($patch_opened) { - if (open PATCH, ">$opt{patch}") { - $patch_opened = 1; - } - else { - error("Cannot open '$opt{patch}' for writing: $!"); - delete $opt{patch}; - $opt{changes} = 1; - goto fallback; - } - } - mydiff(\*PATCH, $filename, $c); - } - else { -fallback: - info("Suggested changes:"); - mydiff(\*STDOUT, $filename, $c); - } - } - else { - my $s = $file{changes} == 1 ? '' : 's'; - info("$file{changes} potentially required change$s detected"); - } - } - else { - info("Looks good"); - } -} - -close PATCH if $patch_opened; - -exit 0; - - -sub try_use { eval "use @_;"; return $@ eq '' } - -sub mydiff -{ - local *F = shift; - my($file, $str) = @_; - my $diff; - - if (exists $opt{diff}) { - $diff = run_diff($opt{diff}, $file, $str); - } - - if (!defined $diff and try_use('Text::Diff')) { - $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); - $diff = <
$tmp") { - print F $str; - close F; - - if (open F, "$prog $file $tmp |") { - while () { - s/\Q$tmp\E/$file.patched/; - $diff .= $_; - } - close F; - unlink $tmp; - return $diff; - } - - unlink $tmp; - } - else { - error("Cannot open '$tmp' for writing: $!"); - } - - return undef; -} - -sub rec_depend -{ - my($func, $seen) = @_; - return () unless exists $depends{$func}; - $seen = {%{$seen||{}}}; - return () if $seen->{$func}++; - my %s; - grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}}; -} - -sub parse_version -{ - my $ver = shift; - - if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { - return ($1, $2, $3); - } - elsif ($ver !~ /^\d+\.[\d_]+$/) { - die "cannot parse version '$ver'\n"; - } - - $ver =~ s/_//g; - $ver =~ s/$/000000/; - - my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; - - $v = int $v; - $s = int $s; - - if ($r < 5 || ($r == 5 && $v < 6)) { - if ($s % 10) { - die "cannot parse version '$ver'\n"; - } - } - - return ($r, $v, $s); -} - -sub format_version -{ - my $ver = shift; - - $ver =~ s/$/000000/; - my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; - - $v = int $v; - $s = int $s; - - if ($r < 5 || ($r == 5 && $v < 6)) { - if ($s % 10) { - die "invalid version '$ver'\n"; - } - $s /= 10; - - $ver = sprintf "%d.%03d", $r, $v; - $s > 0 and $ver .= sprintf "_%02d", $s; - - return $ver; - } - - return sprintf "%d.%d.%d", $r, $v, $s; -} - -sub info -{ - $opt{quiet} and return; - print @_, "\n"; -} - -sub diag -{ - $opt{quiet} and return; - $opt{diag} and print @_, "\n"; -} - -sub warning -{ - $opt{quiet} and return; - print "*** ", @_, "\n"; -} - -sub error -{ - print "*** ERROR: ", @_, "\n"; -} - -my %given_hints; -my %given_warnings; -sub hint -{ - $opt{quiet} and return; - my $func = shift; - my $rv = 0; - if (exists $warnings{$func} && !$given_warnings{$func}++) { - my $warn = $warnings{$func}; - $warn =~ s!^!*** !mg; - print "*** WARNING: $func\n", $warn; - $rv++; - } - if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) { - my $hint = $hints{$func}; - $hint =~ s/^/ /mg; - print " --- hint for $func ---\n", $hint; - } - $rv; -} - -sub usage -{ - my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; - my %M = ( 'I' => '*' ); - $usage =~ s/^\s*perl\s+\S+/$^X $0/; - $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; - - print < }; - my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms; - $copy =~ s/^(?=\S+)/ /gms; - $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms; - $self =~ s/^SKIP.*(?=^__DATA__)/SKIP -if (\@ARGV && \$ARGV[0] eq '--unstrip') { - eval { require Devel::PPPort }; - \$@ and die "Cannot require Devel::PPPort, please install.\\n"; - if (eval \$Devel::PPPort::VERSION < $VERSION) { - die "$0 was originally generated with Devel::PPPort $VERSION.\\n" - . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n" - . "Please install a newer version, or --unstrip will not work.\\n"; - } - Devel::PPPort::WriteFile(\$0); - exit 0; -} -print <$0" or die "cannot strip $0: $!\n"; - print OUT "$pl$c\n"; - - exit 0; -} - -__DATA__ -*/ - -#ifndef _P_P_PORTABILITY_H_ -#define _P_P_PORTABILITY_H_ - -#ifndef DPPP_NAMESPACE -# define DPPP_NAMESPACE DPPP_ -#endif - -#define DPPP_CAT2(x,y) CAT2(x,y) -#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) - -#ifndef PERL_REVISION -# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) -# define PERL_PATCHLEVEL_H_IMPLICIT -# include -# endif -# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) -# include -# endif -# ifndef PERL_REVISION -# define PERL_REVISION (5) - /* Replace: 1 */ -# define PERL_VERSION PATCHLEVEL -# define PERL_SUBVERSION SUBVERSION - /* Replace PERL_PATCHLEVEL with PERL_VERSION */ - /* Replace: 0 */ -# endif -#endif - -#define D_PPP_DEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) -#define PERL_BCDVERSION ((D_PPP_DEC2BCD(PERL_REVISION)<<24)|(D_PPP_DEC2BCD(PERL_VERSION)<<12)|D_PPP_DEC2BCD(PERL_SUBVERSION)) - -/* It is very unlikely that anyone will try to use this with Perl 6 - (or greater), but who knows. - */ -#if PERL_REVISION != 5 -# error ppport.h only works with Perl version 5 -#endif /* PERL_REVISION != 5 */ -#ifndef dTHR -# define dTHR dNOOP -#endif -#ifndef dTHX -# define dTHX dNOOP -#endif - -#ifndef dTHXa -# define dTHXa(x) dNOOP -#endif -#ifndef pTHX -# define pTHX void -#endif - -#ifndef pTHX_ -# define pTHX_ -#endif - -#ifndef aTHX -# define aTHX -#endif - -#ifndef aTHX_ -# define aTHX_ -#endif - -#if (PERL_BCDVERSION < 0x5006000) -# ifdef USE_THREADS -# define aTHXR thr -# define aTHXR_ thr, -# else -# define aTHXR -# define aTHXR_ -# endif -# define dTHXR dTHR -#else -# define aTHXR aTHX -# define aTHXR_ aTHX_ -# define dTHXR dTHX -#endif -#ifndef dTHXoa -# define dTHXoa(x) dTHXa(x) -#endif - -#ifdef I_LIMITS -# include -#endif - -#ifndef PERL_UCHAR_MIN -# define PERL_UCHAR_MIN ((unsigned char)0) -#endif - -#ifndef PERL_UCHAR_MAX -# ifdef UCHAR_MAX -# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) -# else -# ifdef MAXUCHAR -# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) -# else -# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) -# endif -# endif -#endif - -#ifndef PERL_USHORT_MIN -# define PERL_USHORT_MIN ((unsigned short)0) -#endif - -#ifndef PERL_USHORT_MAX -# ifdef USHORT_MAX -# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) -# else -# ifdef MAXUSHORT -# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) -# else -# ifdef USHRT_MAX -# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) -# else -# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) -# endif -# endif -# endif -#endif - -#ifndef PERL_SHORT_MAX -# ifdef SHORT_MAX -# define PERL_SHORT_MAX ((short)SHORT_MAX) -# else -# ifdef MAXSHORT /* Often used in */ -# define PERL_SHORT_MAX ((short)MAXSHORT) -# else -# ifdef SHRT_MAX -# define PERL_SHORT_MAX ((short)SHRT_MAX) -# else -# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1)) -# endif -# endif -# endif -#endif - -#ifndef PERL_SHORT_MIN -# ifdef SHORT_MIN -# define PERL_SHORT_MIN ((short)SHORT_MIN) -# else -# ifdef MINSHORT -# define PERL_SHORT_MIN ((short)MINSHORT) -# else -# ifdef SHRT_MIN -# define PERL_SHORT_MIN ((short)SHRT_MIN) -# else -# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3)) -# endif -# endif -# endif -#endif - -#ifndef PERL_UINT_MAX -# ifdef UINT_MAX -# define PERL_UINT_MAX ((unsigned int)UINT_MAX) -# else -# ifdef MAXUINT -# define PERL_UINT_MAX ((unsigned int)MAXUINT) -# else -# define PERL_UINT_MAX (~(unsigned int)0) -# endif -# endif -#endif - -#ifndef PERL_UINT_MIN -# define PERL_UINT_MIN ((unsigned int)0) -#endif - -#ifndef PERL_INT_MAX -# ifdef INT_MAX -# define PERL_INT_MAX ((int)INT_MAX) -# else -# ifdef MAXINT /* Often used in */ -# define PERL_INT_MAX ((int)MAXINT) -# else -# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1)) -# endif -# endif -#endif - -#ifndef PERL_INT_MIN -# ifdef INT_MIN -# define PERL_INT_MIN ((int)INT_MIN) -# else -# ifdef MININT -# define PERL_INT_MIN ((int)MININT) -# else -# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3)) -# endif -# endif -#endif - -#ifndef PERL_ULONG_MAX -# ifdef ULONG_MAX -# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX) -# else -# ifdef MAXULONG -# define PERL_ULONG_MAX ((unsigned long)MAXULONG) -# else -# define PERL_ULONG_MAX (~(unsigned long)0) -# endif -# endif -#endif - -#ifndef PERL_ULONG_MIN -# define PERL_ULONG_MIN ((unsigned long)0L) -#endif - -#ifndef PERL_LONG_MAX -# ifdef LONG_MAX -# define PERL_LONG_MAX ((long)LONG_MAX) -# else -# ifdef MAXLONG -# define PERL_LONG_MAX ((long)MAXLONG) -# else -# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1)) -# endif -# endif -#endif - -#ifndef PERL_LONG_MIN -# ifdef LONG_MIN -# define PERL_LONG_MIN ((long)LONG_MIN) -# else -# ifdef MINLONG -# define PERL_LONG_MIN ((long)MINLONG) -# else -# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3)) -# endif -# endif -#endif - -#if defined(HAS_QUAD) && (defined(convex) || defined(uts)) -# ifndef PERL_UQUAD_MAX -# ifdef ULONGLONG_MAX -# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX) -# else -# ifdef MAXULONGLONG -# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG) -# else -# define PERL_UQUAD_MAX (~(unsigned long long)0) -# endif -# endif -# endif - -# ifndef PERL_UQUAD_MIN -# define PERL_UQUAD_MIN ((unsigned long long)0L) -# endif - -# ifndef PERL_QUAD_MAX -# ifdef LONGLONG_MAX -# define PERL_QUAD_MAX ((long long)LONGLONG_MAX) -# else -# ifdef MAXLONGLONG -# define PERL_QUAD_MAX ((long long)MAXLONGLONG) -# else -# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1)) -# endif -# endif -# endif - -# ifndef PERL_QUAD_MIN -# ifdef LONGLONG_MIN -# define PERL_QUAD_MIN ((long long)LONGLONG_MIN) -# else -# ifdef MINLONGLONG -# define PERL_QUAD_MIN ((long long)MINLONGLONG) -# else -# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) -# endif -# endif -# endif -#endif - -/* This is based on code from 5.003 perl.h */ -#ifdef HAS_QUAD -# ifdef cray -#ifndef IVTYPE -# define IVTYPE int -#endif - -#ifndef IV_MIN -# define IV_MIN PERL_INT_MIN -#endif - -#ifndef IV_MAX -# define IV_MAX PERL_INT_MAX -#endif - -#ifndef UV_MIN -# define UV_MIN PERL_UINT_MIN -#endif - -#ifndef UV_MAX -# define UV_MAX PERL_UINT_MAX -#endif - -# ifdef INTSIZE -#ifndef IVSIZE -# define IVSIZE INTSIZE -#endif - -# endif -# else -# if defined(convex) || defined(uts) -#ifndef IVTYPE -# define IVTYPE long long -#endif - -#ifndef IV_MIN -# define IV_MIN PERL_QUAD_MIN -#endif - -#ifndef IV_MAX -# define IV_MAX PERL_QUAD_MAX -#endif - -#ifndef UV_MIN -# define UV_MIN PERL_UQUAD_MIN -#endif - -#ifndef UV_MAX -# define UV_MAX PERL_UQUAD_MAX -#endif - -# ifdef LONGLONGSIZE -#ifndef IVSIZE -# define IVSIZE LONGLONGSIZE -#endif - -# endif -# else -#ifndef IVTYPE -# define IVTYPE long -#endif - -#ifndef IV_MIN -# define IV_MIN PERL_LONG_MIN -#endif - -#ifndef IV_MAX -# define IV_MAX PERL_LONG_MAX -#endif - -#ifndef UV_MIN -# define UV_MIN PERL_ULONG_MIN -#endif - -#ifndef UV_MAX -# define UV_MAX PERL_ULONG_MAX -#endif - -# ifdef LONGSIZE -#ifndef IVSIZE -# define IVSIZE LONGSIZE -#endif - -# endif -# endif -# endif -#ifndef IVSIZE -# define IVSIZE 8 -#endif - -#ifndef LONGSIZE -# define LONGSIZE 8 -#endif - -#ifndef PERL_QUAD_MIN -# define PERL_QUAD_MIN IV_MIN -#endif - -#ifndef PERL_QUAD_MAX -# define PERL_QUAD_MAX IV_MAX -#endif - -#ifndef PERL_UQUAD_MIN -# define PERL_UQUAD_MIN UV_MIN -#endif - -#ifndef PERL_UQUAD_MAX -# define PERL_UQUAD_MAX UV_MAX -#endif - -#else -#ifndef IVTYPE -# define IVTYPE long -#endif - -#ifndef LONGSIZE -# define LONGSIZE 4 -#endif - -#ifndef IV_MIN -# define IV_MIN PERL_LONG_MIN -#endif - -#ifndef IV_MAX -# define IV_MAX PERL_LONG_MAX -#endif - -#ifndef UV_MIN -# define UV_MIN PERL_ULONG_MIN -#endif - -#ifndef UV_MAX -# define UV_MAX PERL_ULONG_MAX -#endif - -#endif - -#ifndef IVSIZE -# ifdef LONGSIZE -# define IVSIZE LONGSIZE -# else -# define IVSIZE 4 /* A bold guess, but the best we can make. */ -# endif -#endif -#ifndef UVTYPE -# define UVTYPE unsigned IVTYPE -#endif - -#ifndef UVSIZE -# define UVSIZE IVSIZE -#endif -#ifndef cBOOL -# define cBOOL(cbool) ((cbool) ? (bool)1 : (bool)0) -#endif - -#ifndef OpHAS_SIBLING -# define OpHAS_SIBLING(o) (cBOOL((o)->op_sibling)) -#endif - -#ifndef OpSIBLING -# define OpSIBLING(o) (0 + (o)->op_sibling) -#endif - -#ifndef OpMORESIB_set -# define OpMORESIB_set(o, sib) ((o)->op_sibling = (sib)) -#endif - -#ifndef OpLASTSIB_set -# define OpLASTSIB_set(o, parent) ((o)->op_sibling = NULL) -#endif - -#ifndef OpMAYBESIB_set -# define OpMAYBESIB_set(o, sib, parent) ((o)->op_sibling = (sib)) -#endif - -#ifndef HEf_SVKEY -# define HEf_SVKEY -2 -#endif - -#if defined(DEBUGGING) && !defined(__COVERITY__) -#ifndef __ASSERT_ -# define __ASSERT_(statement) assert(statement), -#endif - -#else -#ifndef __ASSERT_ -# define __ASSERT_(statement) -#endif - -#endif - -#ifndef SvRX -#if defined(NEED_SvRX) -static void * DPPP_(my_SvRX)(pTHX_ SV *rv); -static -#else -extern void * DPPP_(my_SvRX)(pTHX_ SV *rv); -#endif - -#if defined(NEED_SvRX) || defined(NEED_SvRX_GLOBAL) - -#ifdef SvRX -# undef SvRX -#endif -#define SvRX(a) DPPP_(my_SvRX)(aTHX_ a) - - -void * -DPPP_(my_SvRX)(pTHX_ SV *rv) -{ - if (SvROK(rv)) { - SV *sv = SvRV(rv); - if (SvMAGICAL(sv)) { - MAGIC *mg = mg_find(sv, PERL_MAGIC_qr); - if (mg && mg->mg_obj) { - return mg->mg_obj; - } - } - } - return 0; -} -#endif -#endif -#ifndef SvRXOK -# define SvRXOK(sv) (!!SvRX(sv)) -#endif - -#ifndef PERL_UNUSED_DECL -# ifdef HASATTRIBUTE -# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER) -# define PERL_UNUSED_DECL -# else -# define PERL_UNUSED_DECL __attribute__((unused)) -# endif -# else -# define PERL_UNUSED_DECL -# endif -#endif - -#ifndef PERL_UNUSED_ARG -# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */ -# include -# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x)) -# else -# define PERL_UNUSED_ARG(x) ((void)x) -# endif -#endif - -#ifndef PERL_UNUSED_VAR -# define PERL_UNUSED_VAR(x) ((void)x) -#endif - -#ifndef PERL_UNUSED_CONTEXT -# ifdef USE_ITHREADS -# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl) -# else -# define PERL_UNUSED_CONTEXT -# endif -#endif - -#ifndef PERL_UNUSED_RESULT -# if defined(__GNUC__) && defined(HASATTRIBUTE_WARN_UNUSED_RESULT) -# define PERL_UNUSED_RESULT(v) STMT_START { __typeof__(v) z = (v); (void)sizeof(z); } STMT_END -# else -# define PERL_UNUSED_RESULT(v) ((void)(v)) -# endif -#endif -#ifndef NOOP -# define NOOP /*EMPTY*/(void)0 -#endif - -#ifndef dNOOP -# define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL -#endif - -#ifndef NVTYPE -# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) -# define NVTYPE long double -# else -# define NVTYPE double -# endif -typedef NVTYPE NV; -#endif - -#ifndef INT2PTR -# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) -# define PTRV UV -# define INT2PTR(any,d) (any)(d) -# else -# if PTRSIZE == LONGSIZE -# define PTRV unsigned long -# else -# define PTRV unsigned -# endif -# define INT2PTR(any,d) (any)(PTRV)(d) -# endif -#endif - -#ifndef PTR2ul -# if PTRSIZE == LONGSIZE -# define PTR2ul(p) (unsigned long)(p) -# else -# define PTR2ul(p) INT2PTR(unsigned long,p) -# endif -#endif -#ifndef PTR2nat -# define PTR2nat(p) (PTRV)(p) -#endif - -#ifndef NUM2PTR -# define NUM2PTR(any,d) (any)PTR2nat(d) -#endif - -#ifndef PTR2IV -# define PTR2IV(p) INT2PTR(IV,p) -#endif - -#ifndef PTR2UV -# define PTR2UV(p) INT2PTR(UV,p) -#endif - -#ifndef PTR2NV -# define PTR2NV(p) NUM2PTR(NV,p) -#endif - -#undef START_EXTERN_C -#undef END_EXTERN_C -#undef EXTERN_C -#ifdef __cplusplus -# define START_EXTERN_C extern "C" { -# define END_EXTERN_C } -# define EXTERN_C extern "C" -#else -# define START_EXTERN_C -# define END_EXTERN_C -# define EXTERN_C extern -#endif - -#if defined(PERL_GCC_PEDANTIC) -# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN -# define PERL_GCC_BRACE_GROUPS_FORBIDDEN -# endif -#endif - -#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus) -# ifndef PERL_USE_GCC_BRACE_GROUPS -# define PERL_USE_GCC_BRACE_GROUPS -# endif -#endif - -#undef STMT_START -#undef STMT_END -#ifdef PERL_USE_GCC_BRACE_GROUPS -# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ -# define STMT_END ) -#else -# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) -# define STMT_START if (1) -# define STMT_END else (void)0 -# else -# define STMT_START do -# define STMT_END while (0) -# endif -#endif -#ifndef boolSV -# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) -#endif - -/* DEFSV appears first in 5.004_56 */ -#ifndef DEFSV -# define DEFSV GvSV(PL_defgv) -#endif - -#ifndef SAVE_DEFSV -# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) -#endif - -#ifndef DEFSV_set -# define DEFSV_set(sv) (DEFSV = (sv)) -#endif - -/* Older perls (<=5.003) lack AvFILLp */ -#ifndef AvFILLp -# define AvFILLp AvFILL -#endif -#ifndef av_tindex -# define av_tindex AvFILL -#endif - -#ifndef av_top_index -# define av_top_index AvFILL -#endif -#ifndef ERRSV -# define ERRSV get_sv("@",FALSE) -#endif - -/* Hint: gv_stashpvn - * This function's backport doesn't support the length parameter, but - * rather ignores it. Portability can only be ensured if the length - * parameter is used for speed reasons, but the length can always be - * correctly computed from the string argument. - */ -#ifndef gv_stashpvn -# define gv_stashpvn(str,len,create) gv_stashpv(str,create) -#endif - -/* Replace: 1 */ -#ifndef get_cv -# define get_cv perl_get_cv -#endif - -#ifndef get_sv -# define get_sv perl_get_sv -#endif - -#ifndef get_av -# define get_av perl_get_av -#endif - -#ifndef get_hv -# define get_hv perl_get_hv -#endif - -/* Replace: 0 */ -#ifndef dUNDERBAR -# define dUNDERBAR dNOOP -#endif - -#ifndef UNDERBAR -# define UNDERBAR DEFSV -#endif -#ifndef dAX -# define dAX I32 ax = MARK - PL_stack_base + 1 -#endif - -#ifndef dITEMS -# define dITEMS I32 items = SP - MARK -#endif -#ifndef dXSTARG -# define dXSTARG SV * targ = sv_newmortal() -#endif -#ifndef dAXMARK -# define dAXMARK I32 ax = POPMARK; \ - register SV ** const mark = PL_stack_base + ax++ -#endif -#ifndef XSprePUSH -# define XSprePUSH (sp = PL_stack_base + ax - 1) -#endif - -#if (PERL_BCDVERSION < 0x5005000) -# undef XSRETURN -# define XSRETURN(off) \ - STMT_START { \ - PL_stack_sp = PL_stack_base + ax + ((off) - 1); \ - return; \ - } STMT_END -#endif -#ifndef XSPROTO -# define XSPROTO(name) void name(pTHX_ CV* cv) -#endif - -#ifndef SVfARG -# define SVfARG(p) ((void*)(p)) -#endif -#ifndef PERL_ABS -# define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) -#endif -#ifndef dVAR -# define dVAR dNOOP -#endif -#ifndef SVf -# define SVf "_" -#endif -#ifndef UTF8_MAXBYTES -# define UTF8_MAXBYTES UTF8_MAXLEN -#endif -#ifndef CPERLscope -# define CPERLscope(x) x -#endif -#ifndef PERL_HASH -# define PERL_HASH(hash,str,len) \ - STMT_START { \ - const char *s_PeRlHaSh = str; \ - I32 i_PeRlHaSh = len; \ - U32 hash_PeRlHaSh = 0; \ - while (i_PeRlHaSh--) \ - hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \ - (hash) = hash_PeRlHaSh; \ - } STMT_END -#endif - -#ifndef PERLIO_FUNCS_DECL -# ifdef PERLIO_FUNCS_CONST -# define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs -# define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs) -# else -# define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs -# define PERLIO_FUNCS_CAST(funcs) (funcs) -# endif -#endif - -/* provide these typedefs for older perls */ -#if (PERL_BCDVERSION < 0x5009003) - -# ifdef ARGSproto -typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto); -# else -typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX); -# endif - -typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*); - -#endif - -#ifndef WIDEST_UTYPE -# ifdef QUADKIND -# ifdef U64TYPE -# define WIDEST_UTYPE U64TYPE -# else -# define WIDEST_UTYPE Quad_t -# endif -# else -# define WIDEST_UTYPE U32 -# endif -#endif - -#ifdef EBCDIC - -/* This is the first version where these macros are fully correct. Relying on - * the C library functions, as earlier releases did, causes problems with - * locales */ -# if (PERL_BCDVERSION < 0x5022000) -# undef isALNUM -# undef isALNUM_A -# undef isALNUMC -# undef isALNUMC_A -# undef isALPHA -# undef isALPHA_A -# undef isALPHANUMERIC -# undef isALPHANUMERIC_A -# undef isASCII -# undef isASCII_A -# undef isBLANK -# undef isBLANK_A -# undef isCNTRL -# undef isCNTRL_A -# undef isDIGIT -# undef isDIGIT_A -# undef isGRAPH -# undef isGRAPH_A -# undef isIDCONT -# undef isIDCONT_A -# undef isIDFIRST -# undef isIDFIRST_A -# undef isLOWER -# undef isLOWER_A -# undef isOCTAL -# undef isOCTAL_A -# undef isPRINT -# undef isPRINT_A -# undef isPSXSPC -# undef isPSXSPC_A -# undef isPUNCT -# undef isPUNCT_A -# undef isSPACE -# undef isSPACE_A -# undef isUPPER -# undef isUPPER_A -# undef isWORDCHAR -# undef isWORDCHAR_A -# undef isXDIGIT -# undef isXDIGIT_A -# endif -#ifndef isASCII -# define isASCII(c) (isCNTRL(c) || isPRINT(c)) -#endif - - /* The below is accurate for all EBCDIC code pages supported by - * all the versions of Perl overridden by this */ -#ifndef isCNTRL -# define isCNTRL(c) ( (c) == '\0' || (c) == '\a' || (c) == '\b' \ - || (c) == '\f' || (c) == '\n' || (c) == '\r' \ - || (c) == '\t' || (c) == '\v' \ - || ((c) <= 3 && (c) >= 1) /* SOH, STX, ETX */ \ - || (c) == 7 /* U+7F DEL */ \ - || ((c) <= 0x13 && (c) >= 0x0E) /* SO, SI */ \ - /* DLE, DC[1-3] */ \ - || (c) == 0x18 /* U+18 CAN */ \ - || (c) == 0x19 /* U+19 EOM */ \ - || ((c) <= 0x1F && (c) >= 0x1C) /* [FGRU]S */ \ - || (c) == 0x26 /* U+17 ETB */ \ - || (c) == 0x27 /* U+1B ESC */ \ - || (c) == 0x2D /* U+05 ENQ */ \ - || (c) == 0x2E /* U+06 ACK */ \ - || (c) == 0x32 /* U+16 SYN */ \ - || (c) == 0x37 /* U+04 EOT */ \ - || (c) == 0x3C /* U+14 DC4 */ \ - || (c) == 0x3D /* U+15 NAK */ \ - || (c) == 0x3F /* U+1A SUB */ \ - ) -#endif - -/* The ordering of the tests in this and isUPPER are to exclude most characters - * early */ -#ifndef isLOWER -# define isLOWER(c) ( (c) >= 'a' && (c) <= 'z' \ - && ( (c) <= 'i' \ - || ((c) >= 'j' && (c) <= 'r') \ - || (c) >= 's')) -#endif - -#ifndef isUPPER -# define isUPPER(c) ( (c) >= 'A' && (c) <= 'Z' \ - && ( (c) <= 'I' \ - || ((c) >= 'J' && (c) <= 'R') \ - || (c) >= 'S')) -#endif - -#else /* Above is EBCDIC; below is ASCII */ - -# if (PERL_BCDVERSION < 0x5004000) -/* The implementation of these in older perl versions can give wrong results if - * the C program locale is set to other than the C locale */ -# undef isALNUM -# undef isALNUM_A -# undef isALPHA -# undef isALPHA_A -# undef isDIGIT -# undef isDIGIT_A -# undef isIDFIRST -# undef isIDFIRST_A -# undef isLOWER -# undef isLOWER_A -# undef isUPPER -# undef isUPPER_A -# endif - -# if (PERL_BCDVERSION < 0x5008000) -/* Hint: isCNTRL - * Earlier perls omitted DEL */ -# undef isCNTRL -# endif - -# if (PERL_BCDVERSION < 0x5010000) -/* Hint: isPRINT - * The implementation in older perl versions includes all of the - * isSPACE() characters, which is wrong. The version provided by - * Devel::PPPort always overrides a present buggy version. - */ -# undef isPRINT -# undef isPRINT_A -# endif - -# if (PERL_BCDVERSION < 0x5014000) -/* Hint: isASCII - * The implementation in older perl versions always returned true if the - * parameter was a signed char - */ -# undef isASCII -# undef isASCII_A -# endif - -# if (PERL_BCDVERSION < 0x5020000) -/* Hint: isSPACE - * The implementation in older perl versions didn't include \v */ -# undef isSPACE -# undef isSPACE_A -# endif -#ifndef isASCII -# define isASCII(c) ((WIDEST_UTYPE) (c) <= 127) -#endif - -#ifndef isCNTRL -# define isCNTRL(c) ((WIDEST_UTYPE) (c) < ' ' || (c) == 127) -#endif - -#ifndef isLOWER -# define isLOWER(c) ((c) >= 'a' && (c) <= 'z') -#endif - -#ifndef isUPPER -# define isUPPER(c) ((c) <= 'Z' && (c) >= 'A') -#endif - -#endif /* Below are definitions common to EBCDIC and ASCII */ -#ifndef isALNUM -# define isALNUM(c) isWORDCHAR(c) -#endif - -#ifndef isALNUMC -# define isALNUMC(c) isALPHANUMERIC(c) -#endif - -#ifndef isALPHA -# define isALPHA(c) (isUPPER(c) || isLOWER(c)) -#endif - -#ifndef isALPHANUMERIC -# define isALPHANUMERIC(c) (isALPHA(c) || isDIGIT(c)) -#endif - -#ifndef isBLANK -# define isBLANK(c) ((c) == ' ' || (c) == '\t') -#endif - -#ifndef isDIGIT -# define isDIGIT(c) ((c) <= '9' && (c) >= '0') -#endif - -#ifndef isGRAPH -# define isGRAPH(c) (isWORDCHAR(c) || isPUNCT(c)) -#endif - -#ifndef isIDCONT -# define isIDCONT(c) isWORDCHAR(c) -#endif - -#ifndef isIDFIRST -# define isIDFIRST(c) (isALPHA(c) || (c) == '_') -#endif - -#ifndef isOCTAL -# define isOCTAL(c) (((WIDEST_UTYPE)((c)) & ~7) == '0') -#endif - -#ifndef isPRINT -# define isPRINT(c) (isGRAPH(c) || (c) == ' ') -#endif - -#ifndef isPSXSPC -# define isPSXSPC(c) isSPACE(c) -#endif - -#ifndef isPUNCT -# define isPUNCT(c) ( (c) == '-' || (c) == '!' || (c) == '"' \ - || (c) == '#' || (c) == '$' || (c) == '%' \ - || (c) == '&' || (c) == '\'' || (c) == '(' \ - || (c) == ')' || (c) == '*' || (c) == '+' \ - || (c) == ',' || (c) == '.' || (c) == '/' \ - || (c) == ':' || (c) == ';' || (c) == '<' \ - || (c) == '=' || (c) == '>' || (c) == '?' \ - || (c) == '@' || (c) == '[' || (c) == '\\' \ - || (c) == ']' || (c) == '^' || (c) == '_' \ - || (c) == '`' || (c) == '{' || (c) == '|' \ - || (c) == '}' || (c) == '~') -#endif - -#ifndef isSPACE -# define isSPACE(c) ( isBLANK(c) || (c) == '\n' || (c) == '\r' \ - || (c) == '\v' || (c) == '\f') -#endif - -#ifndef isWORDCHAR -# define isWORDCHAR(c) (isALPHANUMERIC(c) || (c) == '_') -#endif - -#ifndef isXDIGIT -# define isXDIGIT(c) ( isDIGIT(c) \ - || ((c) >= 'a' && (c) <= 'f') \ - || ((c) >= 'A' && (c) <= 'F')) -#endif -#ifndef isALNUM_A -# define isALNUM_A isALNUM -#endif - -#ifndef isALNUMC_A -# define isALNUMC_A isALNUMC -#endif - -#ifndef isALPHA_A -# define isALPHA_A isALPHA -#endif - -#ifndef isALPHANUMERIC_A -# define isALPHANUMERIC_A isALPHANUMERIC -#endif - -#ifndef isASCII_A -# define isASCII_A isASCII -#endif - -#ifndef isBLANK_A -# define isBLANK_A isBLANK -#endif - -#ifndef isCNTRL_A -# define isCNTRL_A isCNTRL -#endif - -#ifndef isDIGIT_A -# define isDIGIT_A isDIGIT -#endif - -#ifndef isGRAPH_A -# define isGRAPH_A isGRAPH -#endif - -#ifndef isIDCONT_A -# define isIDCONT_A isIDCONT -#endif - -#ifndef isIDFIRST_A -# define isIDFIRST_A isIDFIRST -#endif - -#ifndef isLOWER_A -# define isLOWER_A isLOWER -#endif - -#ifndef isOCTAL_A -# define isOCTAL_A isOCTAL -#endif - -#ifndef isPRINT_A -# define isPRINT_A isPRINT -#endif - -#ifndef isPSXSPC_A -# define isPSXSPC_A isPSXSPC -#endif - -#ifndef isPUNCT_A -# define isPUNCT_A isPUNCT -#endif - -#ifndef isSPACE_A -# define isSPACE_A isSPACE -#endif - -#ifndef isUPPER_A -# define isUPPER_A isUPPER -#endif - -#ifndef isWORDCHAR_A -# define isWORDCHAR_A isWORDCHAR -#endif - -#ifndef isXDIGIT_A -# define isXDIGIT_A isXDIGIT -#endif - -/* Until we figure out how to support this in older perls... */ -#if (PERL_BCDVERSION >= 0x5008000) -#ifndef HeUTF8 -# define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \ - SvUTF8(HeKEY_sv(he)) : \ - (U32)HeKUTF8(he)) -#endif - -#endif -#ifndef C_ARRAY_LENGTH -# define C_ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0])) -#endif - -#ifndef C_ARRAY_END -# define C_ARRAY_END(a) ((a) + C_ARRAY_LENGTH(a)) -#endif -#ifndef LIKELY -# define LIKELY(x) (x) -#endif - -#ifndef UNLIKELY -# define UNLIKELY(x) (x) -#endif -#ifndef UNICODE_REPLACEMENT -# define UNICODE_REPLACEMENT 0xFFFD -#endif - -#ifndef MUTABLE_PTR -#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) -# define MUTABLE_PTR(p) ({ void *_p = (p); _p; }) -#else -# define MUTABLE_PTR(p) ((void *) (p)) -#endif -#endif -#ifndef MUTABLE_SV -# define MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p)) -#endif -#ifndef WARN_ALL -# define WARN_ALL 0 -#endif - -#ifndef WARN_CLOSURE -# define WARN_CLOSURE 1 -#endif - -#ifndef WARN_DEPRECATED -# define WARN_DEPRECATED 2 -#endif - -#ifndef WARN_EXITING -# define WARN_EXITING 3 -#endif - -#ifndef WARN_GLOB -# define WARN_GLOB 4 -#endif - -#ifndef WARN_IO -# define WARN_IO 5 -#endif - -#ifndef WARN_CLOSED -# define WARN_CLOSED 6 -#endif - -#ifndef WARN_EXEC -# define WARN_EXEC 7 -#endif - -#ifndef WARN_LAYER -# define WARN_LAYER 8 -#endif - -#ifndef WARN_NEWLINE -# define WARN_NEWLINE 9 -#endif - -#ifndef WARN_PIPE -# define WARN_PIPE 10 -#endif - -#ifndef WARN_UNOPENED -# define WARN_UNOPENED 11 -#endif - -#ifndef WARN_MISC -# define WARN_MISC 12 -#endif - -#ifndef WARN_NUMERIC -# define WARN_NUMERIC 13 -#endif - -#ifndef WARN_ONCE -# define WARN_ONCE 14 -#endif - -#ifndef WARN_OVERFLOW -# define WARN_OVERFLOW 15 -#endif - -#ifndef WARN_PACK -# define WARN_PACK 16 -#endif - -#ifndef WARN_PORTABLE -# define WARN_PORTABLE 17 -#endif - -#ifndef WARN_RECURSION -# define WARN_RECURSION 18 -#endif - -#ifndef WARN_REDEFINE -# define WARN_REDEFINE 19 -#endif - -#ifndef WARN_REGEXP -# define WARN_REGEXP 20 -#endif - -#ifndef WARN_SEVERE -# define WARN_SEVERE 21 -#endif - -#ifndef WARN_DEBUGGING -# define WARN_DEBUGGING 22 -#endif - -#ifndef WARN_INPLACE -# define WARN_INPLACE 23 -#endif - -#ifndef WARN_INTERNAL -# define WARN_INTERNAL 24 -#endif - -#ifndef WARN_MALLOC -# define WARN_MALLOC 25 -#endif - -#ifndef WARN_SIGNAL -# define WARN_SIGNAL 26 -#endif - -#ifndef WARN_SUBSTR -# define WARN_SUBSTR 27 -#endif - -#ifndef WARN_SYNTAX -# define WARN_SYNTAX 28 -#endif - -#ifndef WARN_AMBIGUOUS -# define WARN_AMBIGUOUS 29 -#endif - -#ifndef WARN_BAREWORD -# define WARN_BAREWORD 30 -#endif - -#ifndef WARN_DIGIT -# define WARN_DIGIT 31 -#endif - -#ifndef WARN_PARENTHESIS -# define WARN_PARENTHESIS 32 -#endif - -#ifndef WARN_PRECEDENCE -# define WARN_PRECEDENCE 33 -#endif - -#ifndef WARN_PRINTF -# define WARN_PRINTF 34 -#endif - -#ifndef WARN_PROTOTYPE -# define WARN_PROTOTYPE 35 -#endif - -#ifndef WARN_QW -# define WARN_QW 36 -#endif - -#ifndef WARN_RESERVED -# define WARN_RESERVED 37 -#endif - -#ifndef WARN_SEMICOLON -# define WARN_SEMICOLON 38 -#endif - -#ifndef WARN_TAINT -# define WARN_TAINT 39 -#endif - -#ifndef WARN_THREADS -# define WARN_THREADS 40 -#endif - -#ifndef WARN_UNINITIALIZED -# define WARN_UNINITIALIZED 41 -#endif - -#ifndef WARN_UNPACK -# define WARN_UNPACK 42 -#endif - -#ifndef WARN_UNTIE -# define WARN_UNTIE 43 -#endif - -#ifndef WARN_UTF8 -# define WARN_UTF8 44 -#endif - -#ifndef WARN_VOID -# define WARN_VOID 45 -#endif - -#ifndef WARN_ASSERTIONS -# define WARN_ASSERTIONS 46 -#endif -#ifndef packWARN -# define packWARN(a) (a) -#endif - -#ifndef ckWARN -# ifdef G_WARN_ON -# define ckWARN(a) (PL_dowarn & G_WARN_ON) -# else -# define ckWARN(a) PL_dowarn -# endif -#endif - -#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) -#if defined(NEED_warner) -static void DPPP_(my_warner)(U32 err, const char *pat, ...); -static -#else -extern void DPPP_(my_warner)(U32 err, const char *pat, ...); -#endif - -#if defined(NEED_warner) || defined(NEED_warner_GLOBAL) - -#define Perl_warner DPPP_(my_warner) - - -void -DPPP_(my_warner)(U32 err, const char *pat, ...) -{ - SV *sv; - va_list args; - - PERL_UNUSED_ARG(err); - - va_start(args, pat); - sv = vnewSVpvf(pat, &args); - va_end(args); - sv_2mortal(sv); - warn("%s", SvPV_nolen(sv)); -} - -#define warner Perl_warner - -#define Perl_warner_nocontext Perl_warner - -#endif -#endif - -#define _ppport_MIN(a,b) (((a) <= (b)) ? (a) : (b)) -#ifndef sv_setuv -# define sv_setuv(sv, uv) \ - STMT_START { \ - UV TeMpUv = uv; \ - if (TeMpUv <= IV_MAX) \ - sv_setiv(sv, TeMpUv); \ - else \ - sv_setnv(sv, (double)TeMpUv); \ - } STMT_END -#endif -#ifndef newSVuv -# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) -#endif -#ifndef sv_2uv -# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) -#endif - -#ifndef SvUVX -# define SvUVX(sv) ((UV)SvIVX(sv)) -#endif - -#ifndef SvUVXx -# define SvUVXx(sv) SvUVX(sv) -#endif - -#ifndef SvUV -# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) -#endif - -#ifndef SvUVx -# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) -#endif - -/* Hint: sv_uv - * Always use the SvUVx() macro instead of sv_uv(). - */ -#ifndef sv_uv -# define sv_uv(sv) SvUVx(sv) -#endif - -#if !defined(SvUOK) && defined(SvIOK_UV) -# define SvUOK(sv) SvIOK_UV(sv) -#endif -#ifndef XST_mUV -# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) -#endif - -#ifndef XSRETURN_UV -# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END -#endif -#ifndef PUSHu -# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END -#endif - -#ifndef XPUSHu -# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END -#endif - -#if defined UTF8SKIP - -/* Don't use official version because it uses MIN, which may not be available */ -#undef UTF8_SAFE_SKIP -#ifndef UTF8_SAFE_SKIP -# define UTF8_SAFE_SKIP(s, e) ( \ - ((((e) - (s)) <= 0) \ - ? 0 \ - : _ppport_MIN(((e) - (s)), UTF8SKIP(s)))) -#endif - -#endif - -#if !defined(my_strnlen) -#if defined(NEED_my_strnlen) -static STRLEN DPPP_(my_my_strnlen)(const char *str, Size_t maxlen); -static -#else -extern STRLEN DPPP_(my_my_strnlen)(const char *str, Size_t maxlen); -#endif - -#if defined(NEED_my_strnlen) || defined(NEED_my_strnlen_GLOBAL) - -#define my_strnlen DPPP_(my_my_strnlen) -#define Perl_my_strnlen DPPP_(my_my_strnlen) - - -STRLEN -DPPP_(my_my_strnlen)(const char *str, Size_t maxlen) -{ - const char *p = str; - - while(maxlen-- && *p) - p++; - - return p - str; -} - -#endif -#endif - -#if (PERL_BCDVERSION < 0x5031002) - /* Versions prior to this accepted things that are now considered - * malformations, and didn't return -1 on error with warnings enabled - * */ -# undef utf8_to_uvchr_buf -#endif - -/* This implementation brings modern, generally more restricted standards to - * utf8_to_uvchr_buf. Some of these are security related, and clearly must - * be done. But its arguable that the others need not, and hence should not. - * The reason they're here is that a module that intends to play with the - * latest perls shoud be able to work the same in all releases. An example is - * that perl no longer accepts any UV for a code point, but limits them to - * IV_MAX or below. This is for future internal use of the larger code points. - * If it turns out that some of these changes are breaking code that isn't - * intended to work with modern perls, the tighter restrictions could be - * relaxed. khw thinks this is unlikely, but has been wrong in the past. */ - -#ifndef utf8_to_uvchr_buf - /* Choose which underlying implementation to use. At least one must be - * present or the perl is too early to handle this function */ -# if defined(utf8n_to_uvchr) || defined(utf8_to_uv) -# if defined(utf8n_to_uvchr) /* This is the preferred implementation */ -# define _ppport_utf8_to_uvchr_buf_callee utf8n_to_uvchr -# else -# define _ppport_utf8_to_uvchr_buf_callee utf8_to_uv -# endif - -# endif - -#ifdef _ppport_utf8_to_uvchr_buf_callee -# if defined(NEED_utf8_to_uvchr_buf) -static UV DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 * s, const U8 * send, STRLEN * retlen); -static -#else -extern UV DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 * s, const U8 * send, STRLEN * retlen); -#endif - -#if defined(NEED_utf8_to_uvchr_buf) || defined(NEED_utf8_to_uvchr_buf_GLOBAL) - -#ifdef utf8_to_uvchr_buf -# undef utf8_to_uvchr_buf -#endif -#define utf8_to_uvchr_buf(a,b,c) DPPP_(my_utf8_to_uvchr_buf)(aTHX_ a,b,c) -#define Perl_utf8_to_uvchr_buf DPPP_(my_utf8_to_uvchr_buf) - - -UV -DPPP_(my_utf8_to_uvchr_buf)(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen) -{ - UV ret; - STRLEN curlen; - bool overflows = 0; - const U8 *cur_s = s; - const bool do_warnings = ckWARN_d(WARN_UTF8); - - if (send > s) { - curlen = send - s; - } - else { - assert(0); /* Modern perls die under this circumstance */ - curlen = 0; - if (! do_warnings) { /* Handle empty here if no warnings needed */ - if (retlen) *retlen = 0; - return UNICODE_REPLACEMENT; - } - } - - /* The modern version allows anything that evaluates to a legal UV, but not - * overlongs nor an empty input */ - ret = _ppport_utf8_to_uvchr_buf_callee( - s, curlen, retlen, (UTF8_ALLOW_ANYUV - & ~(UTF8_ALLOW_LONG|UTF8_ALLOW_EMPTY))); - - /* But actually, modern versions restrict the UV to being no more than what - * an IV can hold */ - if (ret > PERL_INT_MAX) { - overflows = 1; - } - -# if (PERL_BCDVERSION < 0x5026000) -# ifndef EBCDIC - - /* There are bugs in versions earlier than this on non-EBCDIC platforms - * in which it did not detect all instances of overflow, which could be - * a security hole. Also, earlier versions did not allow the overflow - * malformation under any circumstances, and modern ones do. So we - * need to check here. */ - - else if (curlen > 0 && *s >= 0xFE) { - - /* If the main routine detected overflow, great; it returned 0. But if the - * input's first byte indicates it could overflow, we need to verify. - * First, on a 32-bit machine the first byte being at least \xFE - * automatically is overflow */ - if (sizeof(ret) < 8) { - overflows = 1; - } - else { - const U8 highest[] = /* 2*63-1 */ - "\xFF\x80\x87\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF"; - const U8 *cur_h = highest; - - for (cur_s = s; cur_s < send; cur_s++, cur_h++) { - if (UNLIKELY(*cur_s == *cur_h)) { - continue; - } - - /* If this byte is larger than the corresponding highest UTF-8 - * byte, the sequence overflows; otherwise the byte is less than - * (as we handled the equality case above), and so the sequence - * doesn't overflow */ - overflows = *cur_s > *cur_h; - break; - - } - - /* Here, either we set the bool and broke out of the loop, or got - * to the end and all bytes are the same which indicates it doesn't - * overflow. */ - } - } - -# endif -# endif /* < 5.26 */ - - if (UNLIKELY(overflows)) { - if (! do_warnings) { - if (retlen) { - *retlen = _ppport_MIN(*retlen, UTF8SKIP(s)); - *retlen = _ppport_MIN(*retlen, curlen); - } - return UNICODE_REPLACEMENT; - } - else { - - /* On versions that correctly detect overflow, but forbid it - * always, 0 will be returned, but also a warning will have been - * raised. Don't repeat it */ - if (ret != 0) { - /* We use the error message in use from 5.8-5.14 */ - Perl_warner(aTHX_ packWARN(WARN_UTF8), - "Malformed UTF-8 character (overflow at 0x%" UVxf - ", byte 0x%02x, after start byte 0x%02x)", - ret, *cur_s, *s); - } - if (retlen) { - *retlen = (STRLEN) -1; - } - return 0; - } - } - - /* If failed and warnings are off, to emulate the behavior of the real - * utf8_to_uvchr(), try again, allowing anything. (Note a return of 0 is - * ok if the input was '\0') */ - if (UNLIKELY(ret == 0 && (curlen == 0 || *s != '\0'))) { - - /* If curlen is 0, we already handled the case where warnings are - * disabled, so this 'if' will be true, and we won't look at the - * contents of 's' */ - if (do_warnings) { - *retlen = (STRLEN) -1; - } - else { - ret = _ppport_utf8_to_uvchr_buf_callee( - s, curlen, retlen, UTF8_ALLOW_ANY); - /* Override with the REPLACEMENT character, as that is what the - * modern version of this function returns */ - ret = UNICODE_REPLACEMENT; - -# if (PERL_BCDVERSION < 0x5016000) - - /* Versions earlier than this don't necessarily return the proper - * length. It should not extend past the end of string, nor past - * what the first byte indicates the length is, nor past the - * continuation characters */ - if (retlen && *retlen >= 0) { - *retlen = _ppport_MIN(*retlen, curlen); - *retlen = _ppport_MIN(*retlen, UTF8SKIP(s)); - unsigned int i = 1; - do { - if (s[i] < 0x80 || s[i] > 0xBF) { - *retlen = i; - break; - } - } while (++i < *retlen); - } - -# endif - - } - } - - return ret; -} - -# endif -#endif -#endif - -#if defined(UTF8SKIP) && defined(utf8_to_uvchr_buf) -#undef utf8_to_uvchr /* Always redefine this unsafe function so that it refuses - to read past a NUL, making it much less likely to read - off the end of the buffer. A NUL indicates the start - of the next character anyway. If the input isn't - NUL-terminated, the function remains unsafe, as it - always has been. */ -#ifndef utf8_to_uvchr -# define utf8_to_uvchr(s, lp) \ - ((*(s) == '\0') \ - ? utf8_to_uvchr_buf(s,((s)+1), lp) /* Handle single NUL specially */ \ - : utf8_to_uvchr_buf(s, (s) + my_strnlen((char *) (s), UTF8SKIP(s)), (lp))) -#endif - -#endif - -#ifdef HAS_MEMCMP -#ifndef memNE -# define memNE(s1,s2,l) (memcmp(s1,s2,l)) -#endif - -#ifndef memEQ -# define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) -#endif - -#else -#ifndef memNE -# define memNE(s1,s2,l) (bcmp(s1,s2,l)) -#endif - -#ifndef memEQ -# define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) -#endif - -#endif -#ifndef memEQs -# define memEQs(s1, l, s2) \ - (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1))) -#endif - -#ifndef memNEs -# define memNEs(s1, l, s2) !memEQs(s1, l, s2) -#endif -#ifndef MoveD -# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) -#endif - -#ifndef CopyD -# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) -#endif - -#ifdef HAS_MEMSET -#ifndef ZeroD -# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) -#endif - -#else -#ifndef ZeroD -# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) -#endif - -#endif -#ifndef PoisonWith -# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) -#endif - -#ifndef PoisonNew -# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) -#endif - -#ifndef PoisonFree -# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) -#endif - -#ifndef Poison -# define Poison(d,n,t) PoisonFree(d,n,t) -#endif -#ifndef Newx -# define Newx(v,n,t) New(0,v,n,t) -#endif - -#ifndef Newxc -# define Newxc(v,n,t,c) Newc(0,v,n,t,c) -#endif - -#ifndef Newxz -# define Newxz(v,n,t) Newz(0,v,n,t) -#endif -#ifndef PERL_MAGIC_sv -# define PERL_MAGIC_sv '\0' -#endif - -#ifndef PERL_MAGIC_overload -# define PERL_MAGIC_overload 'A' -#endif - -#ifndef PERL_MAGIC_overload_elem -# define PERL_MAGIC_overload_elem 'a' -#endif - -#ifndef PERL_MAGIC_overload_table -# define PERL_MAGIC_overload_table 'c' -#endif - -#ifndef PERL_MAGIC_bm -# define PERL_MAGIC_bm 'B' -#endif - -#ifndef PERL_MAGIC_regdata -# define PERL_MAGIC_regdata 'D' -#endif - -#ifndef PERL_MAGIC_regdatum -# define PERL_MAGIC_regdatum 'd' -#endif - -#ifndef PERL_MAGIC_env -# define PERL_MAGIC_env 'E' -#endif - -#ifndef PERL_MAGIC_envelem -# define PERL_MAGIC_envelem 'e' -#endif - -#ifndef PERL_MAGIC_fm -# define PERL_MAGIC_fm 'f' -#endif - -#ifndef PERL_MAGIC_regex_global -# define PERL_MAGIC_regex_global 'g' -#endif - -#ifndef PERL_MAGIC_isa -# define PERL_MAGIC_isa 'I' -#endif - -#ifndef PERL_MAGIC_isaelem -# define PERL_MAGIC_isaelem 'i' -#endif - -#ifndef PERL_MAGIC_nkeys -# define PERL_MAGIC_nkeys 'k' -#endif - -#ifndef PERL_MAGIC_dbfile -# define PERL_MAGIC_dbfile 'L' -#endif - -#ifndef PERL_MAGIC_dbline -# define PERL_MAGIC_dbline 'l' -#endif - -#ifndef PERL_MAGIC_mutex -# define PERL_MAGIC_mutex 'm' -#endif - -#ifndef PERL_MAGIC_shared -# define PERL_MAGIC_shared 'N' -#endif - -#ifndef PERL_MAGIC_shared_scalar -# define PERL_MAGIC_shared_scalar 'n' -#endif - -#ifndef PERL_MAGIC_collxfrm -# define PERL_MAGIC_collxfrm 'o' -#endif - -#ifndef PERL_MAGIC_tied -# define PERL_MAGIC_tied 'P' -#endif - -#ifndef PERL_MAGIC_tiedelem -# define PERL_MAGIC_tiedelem 'p' -#endif - -#ifndef PERL_MAGIC_tiedscalar -# define PERL_MAGIC_tiedscalar 'q' -#endif - -#ifndef PERL_MAGIC_qr -# define PERL_MAGIC_qr 'r' -#endif - -#ifndef PERL_MAGIC_sig -# define PERL_MAGIC_sig 'S' -#endif - -#ifndef PERL_MAGIC_sigelem -# define PERL_MAGIC_sigelem 's' -#endif - -#ifndef PERL_MAGIC_taint -# define PERL_MAGIC_taint 't' -#endif - -#ifndef PERL_MAGIC_uvar -# define PERL_MAGIC_uvar 'U' -#endif - -#ifndef PERL_MAGIC_uvar_elem -# define PERL_MAGIC_uvar_elem 'u' -#endif - -#ifndef PERL_MAGIC_vstring -# define PERL_MAGIC_vstring 'V' -#endif - -#ifndef PERL_MAGIC_vec -# define PERL_MAGIC_vec 'v' -#endif - -#ifndef PERL_MAGIC_utf8 -# define PERL_MAGIC_utf8 'w' -#endif - -#ifndef PERL_MAGIC_substr -# define PERL_MAGIC_substr 'x' -#endif - -#ifndef PERL_MAGIC_defelem -# define PERL_MAGIC_defelem 'y' -#endif - -#ifndef PERL_MAGIC_glob -# define PERL_MAGIC_glob '*' -#endif - -#ifndef PERL_MAGIC_arylen -# define PERL_MAGIC_arylen '#' -#endif - -#ifndef PERL_MAGIC_pos -# define PERL_MAGIC_pos '.' -#endif - -#ifndef PERL_MAGIC_backref -# define PERL_MAGIC_backref '<' -#endif - -#ifndef PERL_MAGIC_ext -# define PERL_MAGIC_ext '~' -#endif - -#ifdef NEED_mess_sv -#define NEED_mess -#endif - -#ifdef NEED_mess -#define NEED_mess_nocontext -#define NEED_vmess -#endif - -#ifndef croak_sv -#if (PERL_BCDVERSION >= 0x5007003) || ( (PERL_BCDVERSION >= 0x5006001) && (PERL_BCDVERSION < 0x5007000) ) -# if ( (PERL_BCDVERSION >= 0x5008000) && (PERL_BCDVERSION < 0x5008009) ) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5010001) ) -# define D_PPP_FIX_UTF8_ERRSV(errsv, sv) \ - STMT_START { \ - if (sv != errsv) \ - SvFLAGS(errsv) = (SvFLAGS(errsv) & ~SVf_UTF8) | \ - (SvFLAGS(sv) & SVf_UTF8); \ - } STMT_END -# else -# define D_PPP_FIX_UTF8_ERRSV(errsv, sv) STMT_START {} STMT_END -# endif -# define croak_sv(sv) \ - STMT_START { \ - if (SvROK(sv)) { \ - sv_setsv(ERRSV, sv); \ - croak(NULL); \ - } else { \ - D_PPP_FIX_UTF8_ERRSV(ERRSV, sv); \ - croak("%" SVf, SVfARG(sv)); \ - } \ - } STMT_END -#elif (PERL_BCDVERSION >= 0x5004000) -# define croak_sv(sv) croak("%" SVf, SVfARG(sv)) -#else -# define croak_sv(sv) croak("%s", SvPV_nolen(sv)) -#endif -#endif - -#ifndef die_sv -#if defined(NEED_die_sv) -static OP * DPPP_(my_die_sv)(pTHX_ SV *sv); -static -#else -extern OP * DPPP_(my_die_sv)(pTHX_ SV *sv); -#endif - -#if defined(NEED_die_sv) || defined(NEED_die_sv_GLOBAL) - -#ifdef die_sv -# undef die_sv -#endif -#define die_sv(a) DPPP_(my_die_sv)(aTHX_ a) -#define Perl_die_sv DPPP_(my_die_sv) - -OP * -DPPP_(my_die_sv)(pTHX_ SV *sv) -{ - croak_sv(sv); - return (OP *)NULL; -} -#endif -#endif - -#ifndef warn_sv -#if (PERL_BCDVERSION >= 0x5004000) -# define warn_sv(sv) warn("%" SVf, SVfARG(sv)) -#else -# define warn_sv(sv) warn("%s", SvPV_nolen(sv)) -#endif -#endif - -#ifndef vmess -#if defined(NEED_vmess) -static SV * DPPP_(my_vmess)(pTHX_ const char * pat, va_list * args); -static -#else -extern SV * DPPP_(my_vmess)(pTHX_ const char * pat, va_list * args); -#endif - -#if defined(NEED_vmess) || defined(NEED_vmess_GLOBAL) - -#ifdef vmess -# undef vmess -#endif -#define vmess(a,b) DPPP_(my_vmess)(aTHX_ a,b) -#define Perl_vmess DPPP_(my_vmess) - -SV* -DPPP_(my_vmess)(pTHX_ const char* pat, va_list* args) -{ - mess(pat, args); - return PL_mess_sv; -} -#endif -#endif - -#if (PERL_BCDVERSION < 0x5006000) -#undef mess -#endif - -#if !defined(mess_nocontext) && !defined(Perl_mess_nocontext) -#if defined(NEED_mess_nocontext) -static SV * DPPP_(my_mess_nocontext)(const char * pat, ...); -static -#else -extern SV * DPPP_(my_mess_nocontext)(const char * pat, ...); -#endif - -#if defined(NEED_mess_nocontext) || defined(NEED_mess_nocontext_GLOBAL) - -#define mess_nocontext DPPP_(my_mess_nocontext) -#define Perl_mess_nocontext DPPP_(my_mess_nocontext) - -SV* -DPPP_(my_mess_nocontext)(const char* pat, ...) -{ - dTHX; - SV *sv; - va_list args; - va_start(args, pat); - sv = vmess(pat, &args); - va_end(args); - return sv; -} -#endif -#endif - -#ifndef mess -#if defined(NEED_mess) -static SV * DPPP_(my_mess)(pTHX_ const char * pat, ...); -static -#else -extern SV * DPPP_(my_mess)(pTHX_ const char * pat, ...); -#endif - -#if defined(NEED_mess) || defined(NEED_mess_GLOBAL) - -#define Perl_mess DPPP_(my_mess) - -SV* -DPPP_(my_mess)(pTHX_ const char* pat, ...) -{ - SV *sv; - va_list args; - va_start(args, pat); - sv = vmess(pat, &args); - va_end(args); - return sv; -} -#ifdef mess_nocontext -#define mess mess_nocontext -#else -#define mess Perl_mess_nocontext -#endif -#endif -#endif - -#ifndef mess_sv -#if defined(NEED_mess_sv) -static SV * DPPP_(my_mess_sv)(pTHX_ SV * basemsg, bool consume); -static -#else -extern SV * DPPP_(my_mess_sv)(pTHX_ SV * basemsg, bool consume); -#endif - -#if defined(NEED_mess_sv) || defined(NEED_mess_sv_GLOBAL) - -#ifdef mess_sv -# undef mess_sv -#endif -#define mess_sv(a,b) DPPP_(my_mess_sv)(aTHX_ a,b) -#define Perl_mess_sv DPPP_(my_mess_sv) - -SV * -DPPP_(my_mess_sv)(pTHX_ SV *basemsg, bool consume) -{ - SV *tmp; - SV *ret; - - if (SvPOK(basemsg) && SvCUR(basemsg) && *(SvEND(basemsg)-1) == '\n') { - if (consume) - return basemsg; - ret = mess(""); - SvSetSV_nosteal(ret, basemsg); - return ret; - } - - if (consume) { - sv_catsv(basemsg, mess("")); - return basemsg; - } - - ret = mess(""); - tmp = newSVsv(ret); - SvSetSV_nosteal(ret, basemsg); - sv_catsv(ret, tmp); - sv_dec(tmp); - return ret; -} -#endif -#endif - -#ifndef warn_nocontext -#define warn_nocontext warn -#endif - -#ifndef croak_nocontext -#define croak_nocontext croak -#endif - -#ifndef croak_no_modify -#define croak_no_modify() croak_nocontext("%s", PL_no_modify) -#define Perl_croak_no_modify() croak_no_modify() -#endif - -#ifndef croak_memory_wrap -#if (PERL_BCDVERSION >= 0x5009002) || ( (PERL_BCDVERSION >= 0x5008006) && (PERL_BCDVERSION < 0x5009000) ) -# define croak_memory_wrap() croak_nocontext("%s", PL_memory_wrap) -#else -# define croak_memory_wrap() croak_nocontext("panic: memory wrap") -#endif -#endif - -#ifndef croak_xs_usage -#if defined(NEED_croak_xs_usage) -static void DPPP_(my_croak_xs_usage)(const CV * const cv, const char * const params); -static -#else -extern void DPPP_(my_croak_xs_usage)(const CV * const cv, const char * const params); -#endif - -#if defined(NEED_croak_xs_usage) || defined(NEED_croak_xs_usage_GLOBAL) - -#define croak_xs_usage DPPP_(my_croak_xs_usage) -#define Perl_croak_xs_usage DPPP_(my_croak_xs_usage) - - -#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE -#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params) -#endif - -void -DPPP_(my_croak_xs_usage)(const CV *const cv, const char *const params) -{ - dTHX; - const GV *const gv = CvGV(cv); - - PERL_ARGS_ASSERT_CROAK_XS_USAGE; - - if (gv) { - const char *const gvname = GvNAME(gv); - const HV *const stash = GvSTASH(gv); - const char *const hvname = stash ? HvNAME(stash) : NULL; - - if (hvname) - croak("Usage: %s::%s(%s)", hvname, gvname, params); - else - croak("Usage: %s(%s)", gvname, params); - } else { - /* Pants. I don't think that it should be possible to get here. */ - croak("Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params); - } -} -#endif -#endif - -#ifndef PERL_SIGNALS_UNSAFE_FLAG - -#define PERL_SIGNALS_UNSAFE_FLAG 0x0001 - -#if (PERL_BCDVERSION < 0x5008000) -# define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG -#else -# define D_PPP_PERL_SIGNALS_INIT 0 -#endif - -#if defined(NEED_PL_signals) -static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; -#elif defined(NEED_PL_signals_GLOBAL) -U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; -#else -extern U32 DPPP_(my_PL_signals); -#endif -#define PL_signals DPPP_(my_PL_signals) - -#endif - -/* Hint: PL_ppaddr - * Calling an op via PL_ppaddr requires passing a context argument - * for threaded builds. Since the context argument is different for - * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will - * automatically be defined as the correct argument. - */ - -#if (PERL_BCDVERSION <= 0x5005005) -/* Replace: 1 */ -# define PL_ppaddr ppaddr -# define PL_no_modify no_modify -/* Replace: 0 */ -#endif - -#if (PERL_BCDVERSION <= 0x5004005) -/* Replace: 1 */ -# define PL_DBsignal DBsignal -# define PL_DBsingle DBsingle -# define PL_DBsub DBsub -# define PL_DBtrace DBtrace -# define PL_Sv Sv -# define PL_bufend bufend -# define PL_bufptr bufptr -# define PL_compiling compiling -# define PL_copline copline -# define PL_curcop curcop -# define PL_curstash curstash -# define PL_debstash debstash -# define PL_defgv defgv -# define PL_diehook diehook -# define PL_dirty dirty -# define PL_dowarn dowarn -# define PL_errgv errgv -# define PL_error_count error_count -# define PL_expect expect -# define PL_hexdigit hexdigit -# define PL_hints hints -# define PL_in_my in_my -# define PL_laststatval laststatval -# define PL_lex_state lex_state -# define PL_lex_stuff lex_stuff -# define PL_linestr linestr -# define PL_na na -# define PL_perl_destruct_level perl_destruct_level -# define PL_perldb perldb -# define PL_rsfp_filters rsfp_filters -# define PL_rsfp rsfp -# define PL_stack_base stack_base -# define PL_stack_sp stack_sp -# define PL_statcache statcache -# define PL_stdingv stdingv -# define PL_sv_arenaroot sv_arenaroot -# define PL_sv_no sv_no -# define PL_sv_undef sv_undef -# define PL_sv_yes sv_yes -# define PL_tainted tainted -# define PL_tainting tainting -# define PL_tokenbuf tokenbuf -/* Replace: 0 */ -#endif - -/* Warning: PL_parser - * For perl versions earlier than 5.9.5, this is an always - * non-NULL dummy. Also, it cannot be dereferenced. Don't - * use it if you can avoid is and unless you absolutely know - * what you're doing. - * If you always check that PL_parser is non-NULL, you can - * define DPPP_PL_parser_NO_DUMMY to avoid the creation of - * a dummy parser structure. - */ - -#if (PERL_BCDVERSION >= 0x5009005) -# ifdef DPPP_PL_parser_NO_DUMMY -# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ - (croak("panic: PL_parser == NULL in %s:%d", \ - __FILE__, __LINE__), (yy_parser *) NULL))->var) -# else -# ifdef DPPP_PL_parser_NO_DUMMY_WARNING -# define D_PPP_parser_dummy_warning(var) -# else -# define D_PPP_parser_dummy_warning(var) \ - warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__), -# endif -# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ - (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var) -#if defined(NEED_PL_parser) -static yy_parser DPPP_(dummy_PL_parser); -#elif defined(NEED_PL_parser_GLOBAL) -yy_parser DPPP_(dummy_PL_parser); -#else -extern yy_parser DPPP_(dummy_PL_parser); -#endif - -# endif - -/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */ -/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf - * Do not use this variable unless you know exactly what you're - * doing. It is internal to the perl parser and may change or even - * be removed in the future. As of perl 5.9.5, you have to check - * for (PL_parser != NULL) for this variable to have any effect. - * An always non-NULL PL_parser dummy is provided for earlier - * perl versions. - * If PL_parser is NULL when you try to access this variable, a - * dummy is being accessed instead and a warning is issued unless - * you define DPPP_PL_parser_NO_DUMMY_WARNING. - * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access - * this variable will croak with a panic message. - */ - -# define PL_expect D_PPP_my_PL_parser_var(expect) -# define PL_copline D_PPP_my_PL_parser_var(copline) -# define PL_rsfp D_PPP_my_PL_parser_var(rsfp) -# define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters) -# define PL_linestr D_PPP_my_PL_parser_var(linestr) -# define PL_bufptr D_PPP_my_PL_parser_var(bufptr) -# define PL_bufend D_PPP_my_PL_parser_var(bufend) -# define PL_lex_state D_PPP_my_PL_parser_var(lex_state) -# define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff) -# define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf) -# define PL_in_my D_PPP_my_PL_parser_var(in_my) -# define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash) -# define PL_error_count D_PPP_my_PL_parser_var(error_count) - - -#else - -/* ensure that PL_parser != NULL and cannot be dereferenced */ -# define PL_parser ((void *) 1) - -#endif -#ifndef mPUSHs -# define mPUSHs(s) PUSHs(sv_2mortal(s)) -#endif - -#ifndef PUSHmortal -# define PUSHmortal PUSHs(sv_newmortal()) -#endif - -#ifndef mPUSHp -# define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l)) -#endif - -#ifndef mPUSHn -# define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n)) -#endif - -#ifndef mPUSHi -# define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i)) -#endif - -#ifndef mPUSHu -# define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u)) -#endif -#ifndef mXPUSHs -# define mXPUSHs(s) XPUSHs(sv_2mortal(s)) -#endif - -#ifndef XPUSHmortal -# define XPUSHmortal XPUSHs(sv_newmortal()) -#endif - -#ifndef mXPUSHp -# define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END -#endif - -#ifndef mXPUSHn -# define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END -#endif - -#ifndef mXPUSHi -# define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END -#endif - -#ifndef mXPUSHu -# define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END -#endif - -/* Replace: 1 */ -#ifndef call_sv -# define call_sv perl_call_sv -#endif - -#ifndef call_pv -# define call_pv perl_call_pv -#endif - -#ifndef call_argv -# define call_argv perl_call_argv -#endif - -#ifndef call_method -# define call_method perl_call_method -#endif -#ifndef eval_sv -# define eval_sv perl_eval_sv -#endif - -/* Replace: 0 */ -#ifndef PERL_LOADMOD_DENY -# define PERL_LOADMOD_DENY 0x1 -#endif - -#ifndef PERL_LOADMOD_NOIMPORT -# define PERL_LOADMOD_NOIMPORT 0x2 -#endif - -#ifndef PERL_LOADMOD_IMPORT_OPS -# define PERL_LOADMOD_IMPORT_OPS 0x4 -#endif - -#ifndef G_METHOD -# define G_METHOD 64 -# ifdef call_sv -# undef call_sv -# endif -# if (PERL_BCDVERSION < 0x5006000) -# define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \ - (flags) & ~G_METHOD) : perl_call_sv(sv, flags)) -# else -# define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \ - (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags)) -# endif -#endif - -/* Replace perl_eval_pv with eval_pv */ - -#ifndef eval_pv -#if defined(NEED_eval_pv) -static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); -static -#else -extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); -#endif - -#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) - -#ifdef eval_pv -# undef eval_pv -#endif -#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) -#define Perl_eval_pv DPPP_(my_eval_pv) - - -SV* -DPPP_(my_eval_pv)(char *p, I32 croak_on_error) -{ - dSP; - SV* sv = newSVpv(p, 0); - - PUSHMARK(sp); - eval_sv(sv, G_SCALAR); - SvREFCNT_dec(sv); - - SPAGAIN; - sv = POPs; - PUTBACK; - - if (croak_on_error && SvTRUEx(ERRSV)) - croak_sv(ERRSV); - - return sv; -} - -#endif -#endif - -#ifndef vload_module -#if defined(NEED_vload_module) -static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); -static -#else -extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); -#endif - -#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) - -#ifdef vload_module -# undef vload_module -#endif -#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d) -#define Perl_vload_module DPPP_(my_vload_module) - - -void -DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args) -{ - dTHR; - dVAR; - OP *veop, *imop; - - OP * const modname = newSVOP(OP_CONST, 0, name); - /* 5.005 has a somewhat hacky force_normal that doesn't croak on - SvREADONLY() if PL_compling is true. Current perls take care in - ck_require() to correctly turn off SvREADONLY before calling - force_normal_flags(). This seems a better fix than fudging PL_compling - */ - SvREADONLY_off(((SVOP*)modname)->op_sv); - modname->op_private |= OPpCONST_BARE; - if (ver) { - veop = newSVOP(OP_CONST, 0, ver); - } - else - veop = NULL; - if (flags & PERL_LOADMOD_NOIMPORT) { - imop = sawparens(newNULLLIST()); - } - else if (flags & PERL_LOADMOD_IMPORT_OPS) { - imop = va_arg(*args, OP*); - } - else { - SV *sv; - imop = NULL; - sv = va_arg(*args, SV*); - while (sv) { - imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv)); - sv = va_arg(*args, SV*); - } - } - { - const line_t ocopline = PL_copline; - COP * const ocurcop = PL_curcop; - const int oexpect = PL_expect; - -#if (PERL_BCDVERSION >= 0x5004000) - utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0), - veop, modname, imop); -#elif (PERL_BCDVERSION > 0x5003000) - utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), - veop, modname, imop); -#else - utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), - modname, imop); -#endif - PL_expect = oexpect; - PL_copline = ocopline; - PL_curcop = ocurcop; - } -} - -#endif -#endif - -#ifndef load_module -#if defined(NEED_load_module) -static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); -static -#else -extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); -#endif - -#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) - -#ifdef load_module -# undef load_module -#endif -#define load_module DPPP_(my_load_module) -#define Perl_load_module DPPP_(my_load_module) - - -void -DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...) -{ - va_list args; - va_start(args, ver); - vload_module(flags, name, ver, &args); - va_end(args); -} - -#endif -#endif -#ifndef newRV_inc -# define newRV_inc(sv) newRV(sv) /* Replace */ -#endif - -#ifndef newRV_noinc -#if defined(NEED_newRV_noinc) -static SV * DPPP_(my_newRV_noinc)(SV *sv); -static -#else -extern SV * DPPP_(my_newRV_noinc)(SV *sv); -#endif - -#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) - -#ifdef newRV_noinc -# undef newRV_noinc -#endif -#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a) -#define Perl_newRV_noinc DPPP_(my_newRV_noinc) - -SV * -DPPP_(my_newRV_noinc)(SV *sv) -{ - SV *rv = (SV *)newRV(sv); - SvREFCNT_dec(sv); - return rv; -} -#endif -#endif - -/* Hint: newCONSTSUB - * Returns a CV* as of perl-5.7.1. This return value is not supported - * by Devel::PPPort. - */ - -/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ -#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005) -#if defined(NEED_newCONSTSUB) -static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); -static -#else -extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); -#endif - -#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) - -#ifdef newCONSTSUB -# undef newCONSTSUB -#endif -#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) -#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) - - -/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */ -/* (There's no PL_parser in perl < 5.005, so this is completely safe) */ -#define D_PPP_PL_copline PL_copline - -void -DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv) -{ - U32 oldhints = PL_hints; - HV *old_cop_stash = PL_curcop->cop_stash; - HV *old_curstash = PL_curstash; - line_t oldline = PL_curcop->cop_line; - PL_curcop->cop_line = D_PPP_PL_copline; - - PL_hints &= ~HINT_BLOCK_SCOPE; - if (stash) - PL_curstash = PL_curcop->cop_stash = stash; - - newSUB( - -#if (PERL_BCDVERSION < 0x5003022) - start_subparse(), -#elif (PERL_BCDVERSION == 0x5003022) - start_subparse(0), -#else /* 5.003_23 onwards */ - start_subparse(FALSE, 0), -#endif - - newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)), - newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ - newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) - ); - - PL_hints = oldhints; - PL_curcop->cop_stash = old_cop_stash; - PL_curstash = old_curstash; - PL_curcop->cop_line = oldline; -} -#endif -#endif - -/* - * Boilerplate macros for initializing and accessing interpreter-local - * data from C. All statics in extensions should be reworked to use - * this, if you want to make the extension thread-safe. See ext/re/re.xs - * for an example of the use of these macros. - * - * Code that uses these macros is responsible for the following: - * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" - * 2. Declare a typedef named my_cxt_t that is a structure that contains - * all the data that needs to be interpreter-local. - * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. - * 4. Use the MY_CXT_INIT macro such that it is called exactly once - * (typically put in the BOOT: section). - * 5. Use the members of the my_cxt_t structure everywhere as - * MY_CXT.member. - * 6. Use the dMY_CXT macro (a declaration) in all the functions that - * access MY_CXT. - */ - -#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \ - defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT) - -#ifndef START_MY_CXT - -/* This must appear in all extensions that define a my_cxt_t structure, - * right after the definition (i.e. at file scope). The non-threads - * case below uses it to declare the data as static. */ -#define START_MY_CXT - -#if (PERL_BCDVERSION < 0x5004068) -/* Fetches the SV that keeps the per-interpreter data. */ -#define dMY_CXT_SV \ - SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE) -#else /* >= perl5.004_68 */ -#define dMY_CXT_SV \ - SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ - sizeof(MY_CXT_KEY)-1, TRUE) -#endif /* < perl5.004_68 */ - -/* This declaration should be used within all functions that use the - * interpreter-local data. */ -#define dMY_CXT \ - dMY_CXT_SV; \ - my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv)) - -/* Creates and zeroes the per-interpreter data. - * (We allocate my_cxtp in a Perl SV so that it will be released when - * the interpreter goes away.) */ -#define MY_CXT_INIT \ - dMY_CXT_SV; \ - /* newSV() allocates one more than needed */ \ - my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ - Zero(my_cxtp, 1, my_cxt_t); \ - sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) - -/* This macro must be used to access members of the my_cxt_t structure. - * e.g. MYCXT.some_data */ -#define MY_CXT (*my_cxtp) - -/* Judicious use of these macros can reduce the number of times dMY_CXT - * is used. Use is similar to pTHX, aTHX etc. */ -#define pMY_CXT my_cxt_t *my_cxtp -#define pMY_CXT_ pMY_CXT, -#define _pMY_CXT ,pMY_CXT -#define aMY_CXT my_cxtp -#define aMY_CXT_ aMY_CXT, -#define _aMY_CXT ,aMY_CXT - -#endif /* START_MY_CXT */ - -#ifndef MY_CXT_CLONE -/* Clones the per-interpreter data. */ -#define MY_CXT_CLONE \ - dMY_CXT_SV; \ - my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ - Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\ - sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) -#endif - -#else /* single interpreter */ - -#ifndef START_MY_CXT - -#define START_MY_CXT static my_cxt_t my_cxt; -#define dMY_CXT_SV dNOOP -#define dMY_CXT dNOOP -#define MY_CXT_INIT NOOP -#define MY_CXT my_cxt - -#define pMY_CXT void -#define pMY_CXT_ -#define _pMY_CXT -#define aMY_CXT -#define aMY_CXT_ -#define _aMY_CXT - -#endif /* START_MY_CXT */ - -#ifndef MY_CXT_CLONE -#define MY_CXT_CLONE NOOP -#endif - -#endif - -#ifndef IVdf -# if IVSIZE == LONGSIZE -# define IVdf "ld" -# define UVuf "lu" -# define UVof "lo" -# define UVxf "lx" -# define UVXf "lX" -# elif IVSIZE == INTSIZE -# define IVdf "d" -# define UVuf "u" -# define UVof "o" -# define UVxf "x" -# define UVXf "X" -# else -# error "cannot define IV/UV formats" -# endif -#endif - -#ifndef NVef -# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ - defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000) - /* Not very likely, but let's try anyway. */ -# define NVef PERL_PRIeldbl -# define NVff PERL_PRIfldbl -# define NVgf PERL_PRIgldbl -# else -# define NVef "e" -# define NVff "f" -# define NVgf "g" -# endif -#endif - -#ifndef SvREFCNT_inc -# ifdef PERL_USE_GCC_BRACE_GROUPS -# define SvREFCNT_inc(sv) \ - ({ \ - SV * const _sv = (SV*)(sv); \ - if (_sv) \ - (SvREFCNT(_sv))++; \ - _sv; \ - }) -# else -# define SvREFCNT_inc(sv) \ - ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) -# endif -#endif - -#ifndef SvREFCNT_inc_simple -# ifdef PERL_USE_GCC_BRACE_GROUPS -# define SvREFCNT_inc_simple(sv) \ - ({ \ - if (sv) \ - (SvREFCNT(sv))++; \ - (SV *)(sv); \ - }) -# else -# define SvREFCNT_inc_simple(sv) \ - ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) -# endif -#endif - -#ifndef SvREFCNT_inc_NN -# ifdef PERL_USE_GCC_BRACE_GROUPS -# define SvREFCNT_inc_NN(sv) \ - ({ \ - SV * const _sv = (SV*)(sv); \ - SvREFCNT(_sv)++; \ - _sv; \ - }) -# else -# define SvREFCNT_inc_NN(sv) \ - (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) -# endif -#endif - -#ifndef SvREFCNT_inc_void -# ifdef PERL_USE_GCC_BRACE_GROUPS -# define SvREFCNT_inc_void(sv) \ - ({ \ - SV * const _sv = (SV*)(sv); \ - if (_sv) \ - (void)(SvREFCNT(_sv)++); \ - }) -# else -# define SvREFCNT_inc_void(sv) \ - (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) -# endif -#endif -#ifndef SvREFCNT_inc_simple_void -# define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END -#endif - -#ifndef SvREFCNT_inc_simple_NN -# define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) -#endif - -#ifndef SvREFCNT_inc_void_NN -# define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) -#endif - -#ifndef SvREFCNT_inc_simple_void_NN -# define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) -#endif - -#ifndef newSV_type - -#if defined(NEED_newSV_type) -static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); -static -#else -extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); -#endif - -#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL) - -#ifdef newSV_type -# undef newSV_type -#endif -#define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a) -#define Perl_newSV_type DPPP_(my_newSV_type) - - -SV* -DPPP_(my_newSV_type)(pTHX_ svtype const t) -{ - SV* const sv = newSV(0); - sv_upgrade(sv, t); - return sv; -} - -#endif - -#endif - -#if (PERL_BCDVERSION < 0x5006000) -# define D_PPP_CONSTPV_ARG(x) ((char *) (x)) -#else -# define D_PPP_CONSTPV_ARG(x) (x) -#endif -#ifndef newSVpvn -# define newSVpvn(data,len) ((data) \ - ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \ - : newSV(0)) -#endif -#ifndef newSVpvn_utf8 -# define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0) -#endif -#ifndef SVf_UTF8 -# define SVf_UTF8 0 -#endif - -#ifndef newSVpvn_flags - -#if defined(NEED_newSVpvn_flags) -static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); -static -#else -extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); -#endif - -#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL) - -#ifdef newSVpvn_flags -# undef newSVpvn_flags -#endif -#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c) -#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags) - - -SV * -DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags) -{ - SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len); - SvFLAGS(sv) |= (flags & SVf_UTF8); - return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv; -} - -#endif - -#endif - -/* Backwards compatibility stuff... :-( */ -#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen) -# define NEED_sv_2pv_flags -#endif -#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL) -# define NEED_sv_2pv_flags_GLOBAL -#endif - -/* Hint: sv_2pv_nolen - * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen(). - */ -#ifndef sv_2pv_nolen -# define sv_2pv_nolen(sv) SvPV_nolen(sv) -#endif - -#ifdef SvPVbyte - -/* Hint: SvPVbyte - * Does not work in perl-5.6.1, ppport.h implements a version - * borrowed from perl-5.7.3. - */ - -#if (PERL_BCDVERSION < 0x5007000) - -#if defined(NEED_sv_2pvbyte) -static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); -static -#else -extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); -#endif - -#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) - -#ifdef sv_2pvbyte -# undef sv_2pvbyte -#endif -#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b) -#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte) - - -char * -DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp) -{ - sv_utf8_downgrade(sv,0); - return SvPV(sv,*lp); -} - -#endif - -/* Hint: sv_2pvbyte - * Use the SvPVbyte() macro instead of sv_2pvbyte(). - */ - -#undef SvPVbyte - -#define SvPVbyte(sv, lp) \ - ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) - -#endif - -#else - -# define SvPVbyte SvPV -# define sv_2pvbyte sv_2pv - -#endif -#ifndef sv_2pvbyte_nolen -# define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv) -#endif - -/* Hint: sv_pvn - * Always use the SvPV() macro instead of sv_pvn(). - */ - -/* Hint: sv_pvn_force - * Always use the SvPV_force() macro instead of sv_pvn_force(). - */ - -/* If these are undefined, they're not handled by the core anyway */ -#ifndef SV_IMMEDIATE_UNREF -# define SV_IMMEDIATE_UNREF 0 -#endif - -#ifndef SV_GMAGIC -# define SV_GMAGIC 0 -#endif - -#ifndef SV_COW_DROP_PV -# define SV_COW_DROP_PV 0 -#endif - -#ifndef SV_UTF8_NO_ENCODING -# define SV_UTF8_NO_ENCODING 0 -#endif - -#ifndef SV_NOSTEAL -# define SV_NOSTEAL 0 -#endif - -#ifndef SV_CONST_RETURN -# define SV_CONST_RETURN 0 -#endif - -#ifndef SV_MUTABLE_RETURN -# define SV_MUTABLE_RETURN 0 -#endif - -#ifndef SV_SMAGIC -# define SV_SMAGIC 0 -#endif - -#ifndef SV_HAS_TRAILING_NUL -# define SV_HAS_TRAILING_NUL 0 -#endif - -#ifndef SV_COW_SHARED_HASH_KEYS -# define SV_COW_SHARED_HASH_KEYS 0 -#endif - -#if (PERL_BCDVERSION < 0x5007002) - -#if defined(NEED_sv_2pv_flags) -static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); -static -#else -extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); -#endif - -#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL) - -#ifdef sv_2pv_flags -# undef sv_2pv_flags -#endif -#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c) -#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags) - - -char * -DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) -{ - STRLEN n_a = (STRLEN) flags; - return sv_2pv(sv, lp ? lp : &n_a); -} - -#endif - -#if defined(NEED_sv_pvn_force_flags) -static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); -static -#else -extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); -#endif - -#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL) - -#ifdef sv_pvn_force_flags -# undef sv_pvn_force_flags -#endif -#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c) -#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags) - - -char * -DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) -{ - STRLEN n_a = (STRLEN) flags; - return sv_pvn_force(sv, lp ? lp : &n_a); -} - -#endif - -#endif - -#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) ) -# define D_PPP_SVPV_NOLEN_LP_ARG &PL_na -#else -# define D_PPP_SVPV_NOLEN_LP_ARG 0 -#endif -#ifndef SvPV_const -# define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) -#endif - -#ifndef SvPV_mutable -# define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC) -#endif -#ifndef SvPV_flags -# define SvPV_flags(sv, lp, flags) \ - ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags)) -#endif -#ifndef SvPV_flags_const -# define SvPV_flags_const(sv, lp, flags) \ - ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ - ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \ - (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN)) -#endif -#ifndef SvPV_flags_const_nolen -# define SvPV_flags_const_nolen(sv, flags) \ - ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ - ? SvPVX_const(sv) : \ - (const char*) sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN)) -#endif -#ifndef SvPV_flags_mutable -# define SvPV_flags_mutable(sv, lp, flags) \ - ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ - ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \ - sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) -#endif -#ifndef SvPV_force -# define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC) -#endif - -#ifndef SvPV_force_nolen -# define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) -#endif - -#ifndef SvPV_force_mutable -# define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC) -#endif - -#ifndef SvPV_force_nomg -# define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0) -#endif - -#ifndef SvPV_force_nomg_nolen -# define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) -#endif -#ifndef SvPV_force_flags -# define SvPV_force_flags(sv, lp, flags) \ - ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ - ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags)) -#endif -#ifndef SvPV_force_flags_nolen -# define SvPV_force_flags_nolen(sv, flags) \ - ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ - ? SvPVX(sv) : sv_pvn_force_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, flags)) -#endif -#ifndef SvPV_force_flags_mutable -# define SvPV_force_flags_mutable(sv, lp, flags) \ - ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ - ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \ - : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) -#endif -#ifndef SvPV_nolen -# define SvPV_nolen(sv) \ - ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ - ? SvPVX(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC)) -#endif -#ifndef SvPV_nolen_const -# define SvPV_nolen_const(sv) \ - ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ - ? SvPVX_const(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN)) -#endif -#ifndef SvPV_nomg -# define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) -#endif - -#ifndef SvPV_nomg_const -# define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0) -#endif - -#ifndef SvPV_nomg_const_nolen -# define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) -#endif - -#ifndef SvPV_nomg_nolen -# define SvPV_nomg_nolen(sv) ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ - ? SvPVX(sv) : sv_2pv_flags(sv, D_PPP_SVPV_NOLEN_LP_ARG, 0)) -#endif -#ifndef SvPV_renew -# define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \ - SvPV_set((sv), (char *) saferealloc( \ - (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \ - } STMT_END -#endif -#ifndef SvMAGIC_set -# define SvMAGIC_set(sv, val) \ - STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ - (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END -#endif - -#if (PERL_BCDVERSION < 0x5009003) -#ifndef SvPVX_const -# define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv))) -#endif - -#ifndef SvPVX_mutable -# define SvPVX_mutable(sv) (0 + SvPVX(sv)) -#endif -#ifndef SvRV_set -# define SvRV_set(sv, val) \ - STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ - (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END -#endif - -#else -#ifndef SvPVX_const -# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) -#endif - -#ifndef SvPVX_mutable -# define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv) -#endif -#ifndef SvRV_set -# define SvRV_set(sv, val) \ - STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ - ((sv)->sv_u.svu_rv = (val)); } STMT_END -#endif - -#endif -#ifndef SvSTASH_set -# define SvSTASH_set(sv, val) \ - STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ - (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END -#endif - -#if (PERL_BCDVERSION < 0x5004000) -#ifndef SvUV_set -# define SvUV_set(sv, val) \ - STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ - (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END -#endif - -#else -#ifndef SvUV_set -# define SvUV_set(sv, val) \ - STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ - (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END -#endif - -#endif - -#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf) -#if defined(NEED_vnewSVpvf) -static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); -static -#else -extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); -#endif - -#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) - -#ifdef vnewSVpvf -# undef vnewSVpvf -#endif -#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b) -#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf) - - -SV * -DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args) -{ - register SV *sv = newSV(0); - sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); - return sv; -} - -#endif -#endif - -#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf) -# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) -#endif - -#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf) -# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) -#endif - -#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg) -#if defined(NEED_sv_catpvf_mg) -static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); -static -#else -extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); -#endif - -#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) - -#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) - - -void -DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...) -{ - va_list args; - va_start(args, pat); - sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); - SvSETMAGIC(sv); - va_end(args); -} - -#endif -#endif - -#ifdef PERL_IMPLICIT_CONTEXT -#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext) -#if defined(NEED_sv_catpvf_mg_nocontext) -static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); -static -#else -extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); -#endif - -#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) - -#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) -#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) - - -void -DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...) -{ - dTHX; - va_list args; - va_start(args, pat); - sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); - SvSETMAGIC(sv); - va_end(args); -} - -#endif -#endif -#endif - -/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */ -#ifndef sv_catpvf_mg -# ifdef PERL_IMPLICIT_CONTEXT -# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext -# else -# define sv_catpvf_mg Perl_sv_catpvf_mg -# endif -#endif - -#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg) -# define sv_vcatpvf_mg(sv, pat, args) \ - STMT_START { \ - sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ - SvSETMAGIC(sv); \ - } STMT_END -#endif - -#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg) -#if defined(NEED_sv_setpvf_mg) -static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); -static -#else -extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); -#endif - -#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) - -#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) - - -void -DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...) -{ - va_list args; - va_start(args, pat); - sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); - SvSETMAGIC(sv); - va_end(args); -} - -#endif -#endif - -#ifdef PERL_IMPLICIT_CONTEXT -#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext) -#if defined(NEED_sv_setpvf_mg_nocontext) -static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); -static -#else -extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); -#endif - -#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) - -#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) -#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) - - -void -DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...) -{ - dTHX; - va_list args; - va_start(args, pat); - sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); - SvSETMAGIC(sv); - va_end(args); -} - -#endif -#endif -#endif - -/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */ -#ifndef sv_setpvf_mg -# ifdef PERL_IMPLICIT_CONTEXT -# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext -# else -# define sv_setpvf_mg Perl_sv_setpvf_mg -# endif -#endif - -#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg) -# define sv_vsetpvf_mg(sv, pat, args) \ - STMT_START { \ - sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ - SvSETMAGIC(sv); \ - } STMT_END -#endif - -/* Hint: newSVpvn_share - * The SVs created by this function only mimic the behaviour of - * shared PVs without really being shared. Only use if you know - * what you're doing. - */ - -#ifndef newSVpvn_share - -#if defined(NEED_newSVpvn_share) -static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); -static -#else -extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); -#endif - -#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) - -#ifdef newSVpvn_share -# undef newSVpvn_share -#endif -#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c) -#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share) - - -SV * -DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash) -{ - SV *sv; - if (len < 0) - len = -len; - if (!hash) - PERL_HASH(hash, (char*) src, len); - sv = newSVpvn((char *) src, len); - sv_upgrade(sv, SVt_PVIV); - SvIVX(sv) = hash; - SvREADONLY_on(sv); - SvPOK_on(sv); - return sv; -} - -#endif - -#endif -#ifndef SvSHARED_HASH -# define SvSHARED_HASH(sv) (0 + SvUVX(sv)) -#endif -#ifndef HvNAME_get -# define HvNAME_get(hv) HvNAME(hv) -#endif -#ifndef HvNAMELEN_get -# define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0) -#endif - -#ifndef gv_fetchpvn_flags -#if defined(NEED_gv_fetchpvn_flags) -static GV* DPPP_(my_gv_fetchpvn_flags)(pTHX_ const char* name, STRLEN len, int flags, int types); -static -#else -extern GV* DPPP_(my_gv_fetchpvn_flags)(pTHX_ const char* name, STRLEN len, int flags, int types); -#endif - -#if defined(NEED_gv_fetchpvn_flags) || defined(NEED_gv_fetchpvn_flags_GLOBAL) - -#ifdef gv_fetchpvn_flags -# undef gv_fetchpvn_flags -#endif -#define gv_fetchpvn_flags(a,b,c,d) DPPP_(my_gv_fetchpvn_flags)(aTHX_ a,b,c,d) -#define Perl_gv_fetchpvn_flags DPPP_(my_gv_fetchpvn_flags) - - -GV* -DPPP_(my_gv_fetchpvn_flags)(pTHX_ const char* name, STRLEN len, int flags, int types) { - char *namepv = savepvn(name, len); - GV* stash = gv_fetchpv(namepv, TRUE, SVt_PVHV); - Safefree(namepv); - return stash; -} - -#endif -#endif -#ifndef GvSVn -# define GvSVn(gv) GvSV(gv) -#endif - -#ifndef isGV_with_GP -# define isGV_with_GP(gv) isGV(gv) -#endif - -#ifndef gv_fetchsv -# define gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt) -#endif -#ifndef get_cvn_flags -# define get_cvn_flags(name, namelen, flags) get_cv(name, flags) -#endif - -#ifndef gv_init_pvn -# define gv_init_pvn(gv, stash, ptr, len, flags) gv_init(gv, stash, ptr, len, flags & GV_ADDMULTI ? TRUE : FALSE) -#endif - -/* concatenating with "" ensures that only literal strings are accepted as argument - * note that STR_WITH_LEN() can't be used as argument to macros or functions that - * under some configurations might be macros - */ -#ifndef STR_WITH_LEN -# define STR_WITH_LEN(s) (s ""), (sizeof(s)-1) -#endif -#ifndef newSVpvs -# define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1) -#endif - -#ifndef newSVpvs_flags -# define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags) -#endif - -#ifndef newSVpvs_share -# define newSVpvs_share(str) newSVpvn_share(str "", sizeof(str) - 1, 0) -#endif - -#ifndef sv_catpvs -# define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1) -#endif - -#ifndef sv_setpvs -# define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1) -#endif - -#ifndef hv_fetchs -# define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval) -#endif - -#ifndef hv_stores -# define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0) -#endif -#ifndef gv_fetchpvs -# define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt) -#endif - -#ifndef gv_stashpvs -# define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags) -#endif -#ifndef get_cvs -# define get_cvs(name, flags) get_cvn_flags(name "", sizeof(name)-1, flags) -#endif -#ifndef SvGETMAGIC -# define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END -#endif - -/* That's the best we can do... */ -#ifndef sv_catpvn_nomg -# define sv_catpvn_nomg sv_catpvn -#endif - -#ifndef sv_catsv_nomg -# define sv_catsv_nomg sv_catsv -#endif - -#ifndef sv_setsv_nomg -# define sv_setsv_nomg sv_setsv -#endif - -#ifndef sv_pvn_nomg -# define sv_pvn_nomg sv_pvn -#endif - -#ifndef SvIV_nomg -# define SvIV_nomg SvIV -#endif - -#ifndef SvUV_nomg -# define SvUV_nomg SvUV -#endif - -#ifndef sv_catpv_mg -# define sv_catpv_mg(sv, ptr) \ - STMT_START { \ - SV *TeMpSv = sv; \ - sv_catpv(TeMpSv,ptr); \ - SvSETMAGIC(TeMpSv); \ - } STMT_END -#endif - -#ifndef sv_catpvn_mg -# define sv_catpvn_mg(sv, ptr, len) \ - STMT_START { \ - SV *TeMpSv = sv; \ - sv_catpvn(TeMpSv,ptr,len); \ - SvSETMAGIC(TeMpSv); \ - } STMT_END -#endif - -#ifndef sv_catsv_mg -# define sv_catsv_mg(dsv, ssv) \ - STMT_START { \ - SV *TeMpSv = dsv; \ - sv_catsv(TeMpSv,ssv); \ - SvSETMAGIC(TeMpSv); \ - } STMT_END -#endif - -#ifndef sv_setiv_mg -# define sv_setiv_mg(sv, i) \ - STMT_START { \ - SV *TeMpSv = sv; \ - sv_setiv(TeMpSv,i); \ - SvSETMAGIC(TeMpSv); \ - } STMT_END -#endif - -#ifndef sv_setnv_mg -# define sv_setnv_mg(sv, num) \ - STMT_START { \ - SV *TeMpSv = sv; \ - sv_setnv(TeMpSv,num); \ - SvSETMAGIC(TeMpSv); \ - } STMT_END -#endif - -#ifndef sv_setpv_mg -# define sv_setpv_mg(sv, ptr) \ - STMT_START { \ - SV *TeMpSv = sv; \ - sv_setpv(TeMpSv,ptr); \ - SvSETMAGIC(TeMpSv); \ - } STMT_END -#endif - -#ifndef sv_setpvn_mg -# define sv_setpvn_mg(sv, ptr, len) \ - STMT_START { \ - SV *TeMpSv = sv; \ - sv_setpvn(TeMpSv,ptr,len); \ - SvSETMAGIC(TeMpSv); \ - } STMT_END -#endif - -#ifndef sv_setsv_mg -# define sv_setsv_mg(dsv, ssv) \ - STMT_START { \ - SV *TeMpSv = dsv; \ - sv_setsv(TeMpSv,ssv); \ - SvSETMAGIC(TeMpSv); \ - } STMT_END -#endif - -#ifndef sv_setuv_mg -# define sv_setuv_mg(sv, i) \ - STMT_START { \ - SV *TeMpSv = sv; \ - sv_setuv(TeMpSv,i); \ - SvSETMAGIC(TeMpSv); \ - } STMT_END -#endif - -#ifndef sv_usepvn_mg -# define sv_usepvn_mg(sv, ptr, len) \ - STMT_START { \ - SV *TeMpSv = sv; \ - sv_usepvn(TeMpSv,ptr,len); \ - SvSETMAGIC(TeMpSv); \ - } STMT_END -#endif -#ifndef SvVSTRING_mg -# define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL) -#endif - -/* Hint: sv_magic_portable - * This is a compatibility function that is only available with - * Devel::PPPort. It is NOT in the perl core. - * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when - * it is being passed a name pointer with namlen == 0. In that - * case, perl 5.8.0 and later store the pointer, not a copy of it. - * The compatibility can be provided back to perl 5.004. With - * earlier versions, the code will not compile. - */ - -#if (PERL_BCDVERSION < 0x5004000) - - /* code that uses sv_magic_portable will not compile */ - -#elif (PERL_BCDVERSION < 0x5008000) - -# define sv_magic_portable(sv, obj, how, name, namlen) \ - STMT_START { \ - SV *SvMp_sv = (sv); \ - char *SvMp_name = (char *) (name); \ - I32 SvMp_namlen = (namlen); \ - if (SvMp_name && SvMp_namlen == 0) \ - { \ - MAGIC *mg; \ - sv_magic(SvMp_sv, obj, how, 0, 0); \ - mg = SvMAGIC(SvMp_sv); \ - mg->mg_len = -42; /* XXX: this is the tricky part */ \ - mg->mg_ptr = SvMp_name; \ - } \ - else \ - { \ - sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \ - } \ - } STMT_END - -#else - -# define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e) - -#endif - -#if !defined(mg_findext) -#if defined(NEED_mg_findext) -static MAGIC * DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl); -static -#else -extern MAGIC * DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl); -#endif - -#if defined(NEED_mg_findext) || defined(NEED_mg_findext_GLOBAL) - -#define mg_findext DPPP_(my_mg_findext) -#define Perl_mg_findext DPPP_(my_mg_findext) - - -MAGIC * -DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl) { - if (sv) { - MAGIC *mg; - -#ifdef AvPAD_NAMELIST - assert(!(SvTYPE(sv) == SVt_PVAV && AvPAD_NAMELIST(sv))); -#endif - - for (mg = SvMAGIC (sv); mg; mg = mg->mg_moremagic) { - if (mg->mg_type == type && mg->mg_virtual == vtbl) - return mg; - } - } - - return NULL; -} - -#endif -#endif - -#if !defined(sv_unmagicext) -#if defined(NEED_sv_unmagicext) -static int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl); -static -#else -extern int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl); -#endif - -#if defined(NEED_sv_unmagicext) || defined(NEED_sv_unmagicext_GLOBAL) - -#ifdef sv_unmagicext -# undef sv_unmagicext -#endif -#define sv_unmagicext(a,b,c) DPPP_(my_sv_unmagicext)(aTHX_ a,b,c) -#define Perl_sv_unmagicext DPPP_(my_sv_unmagicext) - - -int -DPPP_(my_sv_unmagicext)(pTHX_ SV *const sv, const int type, MGVTBL *vtbl) -{ - MAGIC* mg; - MAGIC** mgp; - - if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv)) - return 0; - mgp = &(SvMAGIC(sv)); - for (mg = *mgp; mg; mg = *mgp) { - const MGVTBL* const virt = mg->mg_virtual; - if (mg->mg_type == type && virt == vtbl) { - *mgp = mg->mg_moremagic; - if (virt && virt->svt_free) - virt->svt_free(aTHX_ sv, mg); - if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) { - if (mg->mg_len > 0) - Safefree(mg->mg_ptr); - else if (mg->mg_len == HEf_SVKEY) /* Questionable on older perls... */ - SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr)); - else if (mg->mg_type == PERL_MAGIC_utf8) - Safefree(mg->mg_ptr); - } - if (mg->mg_flags & MGf_REFCOUNTED) - SvREFCNT_dec(mg->mg_obj); - Safefree(mg); - } - else - mgp = &mg->mg_moremagic; - } - if (SvMAGIC(sv)) { - if (SvMAGICAL(sv)) /* if we're under save_magic, wait for restore_magic; */ - mg_magical(sv); /* else fix the flags now */ - } - else { - SvMAGICAL_off(sv); - SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT; - } - return 0; -} - -#endif -#endif - -#ifdef USE_ITHREADS -#ifndef CopFILE -# define CopFILE(c) ((c)->cop_file) -#endif - -#ifndef CopFILEGV -# define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv) -#endif - -#ifndef CopFILE_set -# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) -#endif - -#ifndef CopFILESV -# define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv) -#endif - -#ifndef CopFILEAV -# define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav) -#endif - -#ifndef CopSTASHPV -# define CopSTASHPV(c) ((c)->cop_stashpv) -#endif - -#ifndef CopSTASHPV_set -# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch)) -#endif - -#ifndef CopSTASH -# define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv) -#endif - -#ifndef CopSTASH_set -# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch) -#endif - -#ifndef CopSTASH_eq -# define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \ - || (CopSTASHPV(c) && HvNAME(hv) \ - && strEQ(CopSTASHPV(c), HvNAME(hv))))) -#endif - -#else -#ifndef CopFILEGV -# define CopFILEGV(c) ((c)->cop_filegv) -#endif - -#ifndef CopFILEGV_set -# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) -#endif - -#ifndef CopFILE_set -# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) -#endif - -#ifndef CopFILESV -# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv) -#endif - -#ifndef CopFILEAV -# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav) -#endif - -#ifndef CopFILE -# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch) -#endif - -#ifndef CopSTASH -# define CopSTASH(c) ((c)->cop_stash) -#endif - -#ifndef CopSTASH_set -# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) -#endif - -#ifndef CopSTASHPV -# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch) -#endif - -#ifndef CopSTASHPV_set -# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD)) -#endif - -#ifndef CopSTASH_eq -# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv)) -#endif - -#endif /* USE_ITHREADS */ - -#if (PERL_BCDVERSION >= 0x5006000) -#ifndef caller_cx - -# if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL) -static I32 -DPPP_dopoptosub_at(const PERL_CONTEXT *cxstk, I32 startingblock) -{ - I32 i; - - for (i = startingblock; i >= 0; i--) { - register const PERL_CONTEXT * const cx = &cxstk[i]; - switch (CxTYPE(cx)) { - default: - continue; - case CXt_EVAL: - case CXt_SUB: - case CXt_FORMAT: - return i; - } - } - return i; -} -# endif - -# if defined(NEED_caller_cx) -static const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp); -static -#else -extern const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp); -#endif - -#if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL) - -#ifdef caller_cx -# undef caller_cx -#endif -#define caller_cx(a,b) DPPP_(my_caller_cx)(aTHX_ a,b) -#define Perl_caller_cx DPPP_(my_caller_cx) - - -const PERL_CONTEXT * -DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp) -{ - register I32 cxix = DPPP_dopoptosub_at(cxstack, cxstack_ix); - register const PERL_CONTEXT *cx; - register const PERL_CONTEXT *ccstack = cxstack; - const PERL_SI *top_si = PL_curstackinfo; - - for (;;) { - /* we may be in a higher stacklevel, so dig down deeper */ - while (cxix < 0 && top_si->si_type != PERLSI_MAIN) { - top_si = top_si->si_prev; - ccstack = top_si->si_cxstack; - cxix = DPPP_dopoptosub_at(ccstack, top_si->si_cxix); - } - if (cxix < 0) - return NULL; - /* caller() should not report the automatic calls to &DB::sub */ - if (PL_DBsub && GvCV(PL_DBsub) && cxix >= 0 && - ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub)) - count++; - if (!count--) - break; - cxix = DPPP_dopoptosub_at(ccstack, cxix - 1); - } - - cx = &ccstack[cxix]; - if (dbcxp) *dbcxp = cx; - - if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) { - const I32 dbcxix = DPPP_dopoptosub_at(ccstack, cxix - 1); - /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the - field below is defined for any cx. */ - /* caller() should not report the automatic calls to &DB::sub */ - if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub)) - cx = &ccstack[dbcxix]; - } - - return cx; -} - -# endif -#endif /* caller_cx */ -#endif /* 5.6.0 */ -#ifndef IN_PERL_COMPILETIME -# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling) -#endif - -#ifndef IN_LOCALE_RUNTIME -# define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE) -#endif - -#ifndef IN_LOCALE_COMPILETIME -# define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) -#endif - -#ifndef IN_LOCALE -# define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) -#endif -#ifndef IS_NUMBER_IN_UV -# define IS_NUMBER_IN_UV 0x01 -#endif - -#ifndef IS_NUMBER_GREATER_THAN_UV_MAX -# define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 -#endif - -#ifndef IS_NUMBER_NOT_INT -# define IS_NUMBER_NOT_INT 0x04 -#endif - -#ifndef IS_NUMBER_NEG -# define IS_NUMBER_NEG 0x08 -#endif - -#ifndef IS_NUMBER_INFINITY -# define IS_NUMBER_INFINITY 0x10 -#endif - -#ifndef IS_NUMBER_NAN -# define IS_NUMBER_NAN 0x20 -#endif -#ifndef GROK_NUMERIC_RADIX -# define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) -#endif -#ifndef PERL_SCAN_GREATER_THAN_UV_MAX -# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 -#endif - -#ifndef PERL_SCAN_SILENT_ILLDIGIT -# define PERL_SCAN_SILENT_ILLDIGIT 0x04 -#endif - -#ifndef PERL_SCAN_ALLOW_UNDERSCORES -# define PERL_SCAN_ALLOW_UNDERSCORES 0x01 -#endif - -#ifndef PERL_SCAN_DISALLOW_PREFIX -# define PERL_SCAN_DISALLOW_PREFIX 0x02 -#endif - -#ifndef grok_numeric_radix -#if defined(NEED_grok_numeric_radix) -static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); -static -#else -extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); -#endif - -#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) - -#ifdef grok_numeric_radix -# undef grok_numeric_radix -#endif -#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) -#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) - -bool -DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) -{ -#ifdef USE_LOCALE_NUMERIC -#ifdef PL_numeric_radix_sv - if (PL_numeric_radix_sv && IN_LOCALE) { - STRLEN len; - char* radix = SvPV(PL_numeric_radix_sv, len); - if (*sp + len <= send && memEQ(*sp, radix, len)) { - *sp += len; - return TRUE; - } - } -#else - /* older perls don't have PL_numeric_radix_sv so the radix - * must manually be requested from locale.h - */ -#include - dTHR; /* needed for older threaded perls */ - struct lconv *lc = localeconv(); - char *radix = lc->decimal_point; - if (radix && IN_LOCALE) { - STRLEN len = strlen(radix); - if (*sp + len <= send && memEQ(*sp, radix, len)) { - *sp += len; - return TRUE; - } - } -#endif -#endif /* USE_LOCALE_NUMERIC */ - /* always try "." if numeric radix didn't match because - * we may have data from different locales mixed */ - if (*sp < send && **sp == '.') { - ++*sp; - return TRUE; - } - return FALSE; -} -#endif -#endif - -#ifndef grok_number -#if defined(NEED_grok_number) -static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); -static -#else -extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); -#endif - -#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) - -#ifdef grok_number -# undef grok_number -#endif -#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) -#define Perl_grok_number DPPP_(my_grok_number) - -int -DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) -{ - const char *s = pv; - const char *send = pv + len; - const UV max_div_10 = UV_MAX / 10; - const char max_mod_10 = UV_MAX % 10; - int numtype = 0; - int sawinf = 0; - int sawnan = 0; - - while (s < send && isSPACE(*s)) - s++; - if (s == send) { - return 0; - } else if (*s == '-') { - s++; - numtype = IS_NUMBER_NEG; - } - else if (*s == '+') - s++; - - if (s == send) - return 0; - - /* next must be digit or the radix separator or beginning of infinity */ - if (isDIGIT(*s)) { - /* UVs are at least 32 bits, so the first 9 decimal digits cannot - overflow. */ - UV value = *s - '0'; - /* This construction seems to be more optimiser friendly. - (without it gcc does the isDIGIT test and the *s - '0' separately) - With it gcc on arm is managing 6 instructions (6 cycles) per digit. - In theory the optimiser could deduce how far to unroll the loop - before checking for overflow. */ - if (++s < send) { - int digit = *s - '0'; - if (digit >= 0 && digit <= 9) { - value = value * 10 + digit; - if (++s < send) { - digit = *s - '0'; - if (digit >= 0 && digit <= 9) { - value = value * 10 + digit; - if (++s < send) { - digit = *s - '0'; - if (digit >= 0 && digit <= 9) { - value = value * 10 + digit; - if (++s < send) { - digit = *s - '0'; - if (digit >= 0 && digit <= 9) { - value = value * 10 + digit; - if (++s < send) { - digit = *s - '0'; - if (digit >= 0 && digit <= 9) { - value = value * 10 + digit; - if (++s < send) { - digit = *s - '0'; - if (digit >= 0 && digit <= 9) { - value = value * 10 + digit; - if (++s < send) { - digit = *s - '0'; - if (digit >= 0 && digit <= 9) { - value = value * 10 + digit; - if (++s < send) { - digit = *s - '0'; - if (digit >= 0 && digit <= 9) { - value = value * 10 + digit; - if (++s < send) { - /* Now got 9 digits, so need to check - each time for overflow. */ - digit = *s - '0'; - while (digit >= 0 && digit <= 9 - && (value < max_div_10 - || (value == max_div_10 - && digit <= max_mod_10))) { - value = value * 10 + digit; - if (++s < send) - digit = *s - '0'; - else - break; - } - if (digit >= 0 && digit <= 9 - && (s < send)) { - /* value overflowed. - skip the remaining digits, don't - worry about setting *valuep. */ - do { - s++; - } while (s < send && isDIGIT(*s)); - numtype |= - IS_NUMBER_GREATER_THAN_UV_MAX; - goto skip_value; - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - numtype |= IS_NUMBER_IN_UV; - if (valuep) - *valuep = value; - - skip_value: - if (GROK_NUMERIC_RADIX(&s, send)) { - numtype |= IS_NUMBER_NOT_INT; - while (s < send && isDIGIT(*s)) /* optional digits after the radix */ - s++; - } - } - else if (GROK_NUMERIC_RADIX(&s, send)) { - numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */ - /* no digits before the radix means we need digits after it */ - if (s < send && isDIGIT(*s)) { - do { - s++; - } while (s < send && isDIGIT(*s)); - if (valuep) { - /* integer approximation is valid - it's 0. */ - *valuep = 0; - } - } - else - return 0; - } else if (*s == 'I' || *s == 'i') { - s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; - s++; if (s == send || (*s != 'F' && *s != 'f')) return 0; - s++; if (s < send && (*s == 'I' || *s == 'i')) { - s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; - s++; if (s == send || (*s != 'I' && *s != 'i')) return 0; - s++; if (s == send || (*s != 'T' && *s != 't')) return 0; - s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0; - s++; - } - sawinf = 1; - } else if (*s == 'N' || *s == 'n') { - /* XXX TODO: There are signaling NaNs and quiet NaNs. */ - s++; if (s == send || (*s != 'A' && *s != 'a')) return 0; - s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; - s++; - sawnan = 1; - } else - return 0; - - if (sawinf) { - numtype &= IS_NUMBER_NEG; /* Keep track of sign */ - numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT; - } else if (sawnan) { - numtype &= IS_NUMBER_NEG; /* Keep track of sign */ - numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT; - } else if (s < send) { - /* we can have an optional exponent part */ - if (*s == 'e' || *s == 'E') { - /* The only flag we keep is sign. Blow away any "it's UV" */ - numtype &= IS_NUMBER_NEG; - numtype |= IS_NUMBER_NOT_INT; - s++; - if (s < send && (*s == '-' || *s == '+')) - s++; - if (s < send && isDIGIT(*s)) { - do { - s++; - } while (s < send && isDIGIT(*s)); - } - else - return 0; - } - } - while (s < send && isSPACE(*s)) - s++; - if (s >= send) - return numtype; - if (len == 10 && memEQ(pv, "0 but true", 10)) { - if (valuep) - *valuep = 0; - return IS_NUMBER_IN_UV; - } - return 0; -} -#endif -#endif - -/* - * The grok_* routines have been modified to use warn() instead of - * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit, - * which is why the stack variable has been renamed to 'xdigit'. - */ - -#ifndef grok_bin -#if defined(NEED_grok_bin) -static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); -static -#else -extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); -#endif - -#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) - -#ifdef grok_bin -# undef grok_bin -#endif -#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) -#define Perl_grok_bin DPPP_(my_grok_bin) - -UV -DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) -{ - const char *s = start; - STRLEN len = *len_p; - UV value = 0; - NV value_nv = 0; - - const UV max_div_2 = UV_MAX / 2; - bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; - bool overflowed = FALSE; - - if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { - /* strip off leading b or 0b. - for compatibility silently suffer "b" and "0b" as valid binary - numbers. */ - if (len >= 1) { - if (s[0] == 'b') { - s++; - len--; - } - else if (len >= 2 && s[0] == '0' && s[1] == 'b') { - s+=2; - len-=2; - } - } - } - - for (; len-- && *s; s++) { - char bit = *s; - if (bit == '0' || bit == '1') { - /* Write it in this wonky order with a goto to attempt to get the - compiler to make the common case integer-only loop pretty tight. - With gcc seems to be much straighter code than old scan_bin. */ - redo: - if (!overflowed) { - if (value <= max_div_2) { - value = (value << 1) | (bit - '0'); - continue; - } - /* Bah. We're just overflowed. */ - warn("Integer overflow in binary number"); - overflowed = TRUE; - value_nv = (NV) value; - } - value_nv *= 2.0; - /* If an NV has not enough bits in its mantissa to - * represent a UV this summing of small low-order numbers - * is a waste of time (because the NV cannot preserve - * the low-order bits anyway): we could just remember when - * did we overflow and in the end just multiply value_nv by the - * right amount. */ - value_nv += (NV)(bit - '0'); - continue; - } - if (bit == '_' && len && allow_underscores && (bit = s[1]) - && (bit == '0' || bit == '1')) - { - --len; - ++s; - goto redo; - } - if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) - warn("Illegal binary digit '%c' ignored", *s); - break; - } - - if ( ( overflowed && value_nv > 4294967295.0) -#if UVSIZE > 4 - || (!overflowed && value > 0xffffffff ) -#endif - ) { - warn("Binary number > 0b11111111111111111111111111111111 non-portable"); - } - *len_p = s - start; - if (!overflowed) { - *flags = 0; - return value; - } - *flags = PERL_SCAN_GREATER_THAN_UV_MAX; - if (result) - *result = value_nv; - return UV_MAX; -} -#endif -#endif - -#ifndef grok_hex -#if defined(NEED_grok_hex) -static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); -static -#else -extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); -#endif - -#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) - -#ifdef grok_hex -# undef grok_hex -#endif -#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) -#define Perl_grok_hex DPPP_(my_grok_hex) - -UV -DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) -{ - const char *s = start; - STRLEN len = *len_p; - UV value = 0; - NV value_nv = 0; - - const UV max_div_16 = UV_MAX / 16; - bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; - bool overflowed = FALSE; - const char *xdigit; - - if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { - /* strip off leading x or 0x. - for compatibility silently suffer "x" and "0x" as valid hex numbers. - */ - if (len >= 1) { - if (s[0] == 'x') { - s++; - len--; - } - else if (len >= 2 && s[0] == '0' && s[1] == 'x') { - s+=2; - len-=2; - } - } - } - - for (; len-- && *s; s++) { - xdigit = strchr((char *) PL_hexdigit, *s); - if (xdigit) { - /* Write it in this wonky order with a goto to attempt to get the - compiler to make the common case integer-only loop pretty tight. - With gcc seems to be much straighter code than old scan_hex. */ - redo: - if (!overflowed) { - if (value <= max_div_16) { - value = (value << 4) | ((xdigit - PL_hexdigit) & 15); - continue; - } - warn("Integer overflow in hexadecimal number"); - overflowed = TRUE; - value_nv = (NV) value; - } - value_nv *= 16.0; - /* If an NV has not enough bits in its mantissa to - * represent a UV this summing of small low-order numbers - * is a waste of time (because the NV cannot preserve - * the low-order bits anyway): we could just remember when - * did we overflow and in the end just multiply value_nv by the - * right amount of 16-tuples. */ - value_nv += (NV)((xdigit - PL_hexdigit) & 15); - continue; - } - if (*s == '_' && len && allow_underscores && s[1] - && (xdigit = strchr((char *) PL_hexdigit, s[1]))) - { - --len; - ++s; - goto redo; - } - if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) - warn("Illegal hexadecimal digit '%c' ignored", *s); - break; - } - - if ( ( overflowed && value_nv > 4294967295.0) -#if UVSIZE > 4 - || (!overflowed && value > 0xffffffff ) -#endif - ) { - warn("Hexadecimal number > 0xffffffff non-portable"); - } - *len_p = s - start; - if (!overflowed) { - *flags = 0; - return value; - } - *flags = PERL_SCAN_GREATER_THAN_UV_MAX; - if (result) - *result = value_nv; - return UV_MAX; -} -#endif -#endif - -#ifndef grok_oct -#if defined(NEED_grok_oct) -static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); -static -#else -extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); -#endif - -#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) - -#ifdef grok_oct -# undef grok_oct -#endif -#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) -#define Perl_grok_oct DPPP_(my_grok_oct) - -UV -DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) -{ - const char *s = start; - STRLEN len = *len_p; - UV value = 0; - NV value_nv = 0; - - const UV max_div_8 = UV_MAX / 8; - bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; - bool overflowed = FALSE; - - for (; len-- && *s; s++) { - /* gcc 2.95 optimiser not smart enough to figure that this subtraction - out front allows slicker code. */ - int digit = *s - '0'; - if (digit >= 0 && digit <= 7) { - /* Write it in this wonky order with a goto to attempt to get the - compiler to make the common case integer-only loop pretty tight. - */ - redo: - if (!overflowed) { - if (value <= max_div_8) { - value = (value << 3) | digit; - continue; - } - /* Bah. We're just overflowed. */ - warn("Integer overflow in octal number"); - overflowed = TRUE; - value_nv = (NV) value; - } - value_nv *= 8.0; - /* If an NV has not enough bits in its mantissa to - * represent a UV this summing of small low-order numbers - * is a waste of time (because the NV cannot preserve - * the low-order bits anyway): we could just remember when - * did we overflow and in the end just multiply value_nv by the - * right amount of 8-tuples. */ - value_nv += (NV)digit; - continue; - } - if (digit == ('_' - '0') && len && allow_underscores - && (digit = s[1] - '0') && (digit >= 0 && digit <= 7)) - { - --len; - ++s; - goto redo; - } - /* Allow \octal to work the DWIM way (that is, stop scanning - * as soon as non-octal characters are seen, complain only iff - * someone seems to want to use the digits eight and nine). */ - if (digit == 8 || digit == 9) { - if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) - warn("Illegal octal digit '%c' ignored", *s); - } - break; - } - - if ( ( overflowed && value_nv > 4294967295.0) -#if UVSIZE > 4 - || (!overflowed && value > 0xffffffff ) -#endif - ) { - warn("Octal number > 037777777777 non-portable"); - } - *len_p = s - start; - if (!overflowed) { - *flags = 0; - return value; - } - *flags = PERL_SCAN_GREATER_THAN_UV_MAX; - if (result) - *result = value_nv; - return UV_MAX; -} -#endif -#endif - -#if !defined(my_snprintf) -#if defined(NEED_my_snprintf) -static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); -static -#else -extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); -#endif - -#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) - -#define my_snprintf DPPP_(my_my_snprintf) -#define Perl_my_snprintf DPPP_(my_my_snprintf) - - -int -DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) -{ - dTHX; - int retval; - va_list ap; - va_start(ap, format); -#ifdef HAS_VSNPRINTF - retval = vsnprintf(buffer, len, format, ap); -#else - retval = vsprintf(buffer, format, ap); -#endif - va_end(ap); - if (retval < 0 || (len > 0 && (Size_t)retval >= len)) - Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); - return retval; -} - -#endif -#endif - -#if !defined(my_sprintf) -#if defined(NEED_my_sprintf) -static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); -static -#else -extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); -#endif - -#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL) - -#define my_sprintf DPPP_(my_my_sprintf) -#define Perl_my_sprintf DPPP_(my_my_sprintf) - - -int -DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...) -{ - va_list args; - va_start(args, pat); - vsprintf(buffer, pat, args); - va_end(args); - return strlen(buffer); -} - -#endif -#endif - -#ifdef NO_XSLOCKS -# ifdef dJMPENV -# define dXCPT dJMPENV; int rEtV = 0 -# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) -# define XCPT_TRY_END JMPENV_POP; -# define XCPT_CATCH if (rEtV != 0) -# define XCPT_RETHROW JMPENV_JUMP(rEtV) -# else -# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 -# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) -# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); -# define XCPT_CATCH if (rEtV != 0) -# define XCPT_RETHROW Siglongjmp(top_env, rEtV) -# endif -#endif - -#if !defined(my_strlcat) -#if defined(NEED_my_strlcat) -static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); -static -#else -extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); -#endif - -#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) - -#define my_strlcat DPPP_(my_my_strlcat) -#define Perl_my_strlcat DPPP_(my_my_strlcat) - - -Size_t -DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) -{ - Size_t used, length, copy; - - used = strlen(dst); - length = strlen(src); - if (size > 0 && used < size - 1) { - copy = (length >= size - used) ? size - used - 1 : length; - memcpy(dst + used, src, copy); - dst[used + copy] = '\0'; - } - return used + length; -} -#endif -#endif - -#if !defined(my_strlcpy) -#if defined(NEED_my_strlcpy) -static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); -static -#else -extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); -#endif - -#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) - -#define my_strlcpy DPPP_(my_my_strlcpy) -#define Perl_my_strlcpy DPPP_(my_my_strlcpy) - - -Size_t -DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) -{ - Size_t length, copy; - - length = strlen(src); - if (size > 0) { - copy = (length >= size) ? size - 1 : length; - memcpy(dst, src, copy); - dst[copy] = '\0'; - } - return length; -} - -#endif -#endif -#ifndef PERL_PV_ESCAPE_QUOTE -# define PERL_PV_ESCAPE_QUOTE 0x0001 -#endif - -#ifndef PERL_PV_PRETTY_QUOTE -# define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE -#endif - -#ifndef PERL_PV_PRETTY_ELLIPSES -# define PERL_PV_PRETTY_ELLIPSES 0x0002 -#endif - -#ifndef PERL_PV_PRETTY_LTGT -# define PERL_PV_PRETTY_LTGT 0x0004 -#endif - -#ifndef PERL_PV_ESCAPE_FIRSTCHAR -# define PERL_PV_ESCAPE_FIRSTCHAR 0x0008 -#endif - -#ifndef PERL_PV_ESCAPE_UNI -# define PERL_PV_ESCAPE_UNI 0x0100 -#endif - -#ifndef PERL_PV_ESCAPE_UNI_DETECT -# define PERL_PV_ESCAPE_UNI_DETECT 0x0200 -#endif - -#ifndef PERL_PV_ESCAPE_ALL -# define PERL_PV_ESCAPE_ALL 0x1000 -#endif - -#ifndef PERL_PV_ESCAPE_NOBACKSLASH -# define PERL_PV_ESCAPE_NOBACKSLASH 0x2000 -#endif - -#ifndef PERL_PV_ESCAPE_NOCLEAR -# define PERL_PV_ESCAPE_NOCLEAR 0x4000 -#endif - -#ifndef PERL_PV_ESCAPE_RE -# define PERL_PV_ESCAPE_RE 0x8000 -#endif - -#ifndef PERL_PV_PRETTY_NOCLEAR -# define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR -#endif -#ifndef PERL_PV_PRETTY_DUMP -# define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE -#endif - -#ifndef PERL_PV_PRETTY_REGPROP -# define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE -#endif - -/* Hint: pv_escape - * Note that unicode functionality is only backported to - * those perl versions that support it. For older perl - * versions, the implementation will fall back to bytes. - */ - -#ifndef pv_escape -#if defined(NEED_pv_escape) -static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); -static -#else -extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); -#endif - -#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL) - -#ifdef pv_escape -# undef pv_escape -#endif -#define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f) -#define Perl_pv_escape DPPP_(my_pv_escape) - - -char * -DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str, - const STRLEN count, const STRLEN max, - STRLEN * const escaped, const U32 flags) -{ - const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\'; - const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc; - char octbuf[32] = "%123456789ABCDF"; - STRLEN wrote = 0; - STRLEN chsize = 0; - STRLEN readsize = 1; -#if defined(is_utf8_string) && defined(utf8_to_uvchr_buf) - bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0; -#endif - const char *pv = str; - const char * const end = pv + count; - octbuf[0] = esc; - - if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) - sv_setpvs(dsv, ""); - -#if defined(is_utf8_string) && defined(utf8_to_uvchr_buf) - if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) - isuni = 1; -#endif - - for (; pv < end && (!max || wrote < max) ; pv += readsize) { - const UV u = -#if defined(is_utf8_string) && defined(utf8_to_uvchr_buf) - isuni ? utf8_to_uvchr_buf((U8*)pv, end, &readsize) : -#endif - (U8)*pv; - const U8 c = (U8)u & 0xFF; - - if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) { - if (flags & PERL_PV_ESCAPE_FIRSTCHAR) - chsize = my_snprintf(octbuf, sizeof octbuf, - "%" UVxf, u); - else - chsize = my_snprintf(octbuf, sizeof octbuf, - "%cx{%" UVxf "}", esc, u); - } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) { - chsize = 1; - } else { - if (c == dq || c == esc || !isPRINT(c)) { - chsize = 2; - switch (c) { - case '\\' : /* fallthrough */ - case '%' : if (c == esc) - octbuf[1] = esc; - else - chsize = 1; - break; - case '\v' : octbuf[1] = 'v'; break; - case '\t' : octbuf[1] = 't'; break; - case '\r' : octbuf[1] = 'r'; break; - case '\n' : octbuf[1] = 'n'; break; - case '\f' : octbuf[1] = 'f'; break; - case '"' : if (dq == '"') - octbuf[1] = '"'; - else - chsize = 1; - break; - default: chsize = my_snprintf(octbuf, sizeof octbuf, - pv < end && isDIGIT((U8)*(pv+readsize)) - ? "%c%03o" : "%c%o", esc, c); - } - } else { - chsize = 1; - } - } - if (max && wrote + chsize > max) { - break; - } else if (chsize > 1) { - sv_catpvn(dsv, octbuf, chsize); - wrote += chsize; - } else { - char tmp[2]; - my_snprintf(tmp, sizeof tmp, "%c", c); - sv_catpvn(dsv, tmp, 1); - wrote++; - } - if (flags & PERL_PV_ESCAPE_FIRSTCHAR) - break; - } - if (escaped != NULL) - *escaped= pv - str; - return SvPVX(dsv); -} - -#endif -#endif - -#ifndef pv_pretty -#if defined(NEED_pv_pretty) -static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); -static -#else -extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); -#endif - -#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL) - -#ifdef pv_pretty -# undef pv_pretty -#endif -#define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g) -#define Perl_pv_pretty DPPP_(my_pv_pretty) - - -char * -DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count, - const STRLEN max, char const * const start_color, char const * const end_color, - const U32 flags) -{ - const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%'; - STRLEN escaped; - - if (!(flags & PERL_PV_PRETTY_NOCLEAR)) - sv_setpvs(dsv, ""); - - if (dq == '"') - sv_catpvs(dsv, "\""); - else if (flags & PERL_PV_PRETTY_LTGT) - sv_catpvs(dsv, "<"); - - if (start_color != NULL) - sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color)); - - pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR); - - if (end_color != NULL) - sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color)); - - if (dq == '"') - sv_catpvs(dsv, "\""); - else if (flags & PERL_PV_PRETTY_LTGT) - sv_catpvs(dsv, ">"); - - if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count) - sv_catpvs(dsv, "..."); - - return SvPVX(dsv); -} - -#endif -#endif - -#ifndef pv_display -#if defined(NEED_pv_display) -static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); -static -#else -extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); -#endif - -#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL) - -#ifdef pv_display -# undef pv_display -#endif -#define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e) -#define Perl_pv_display DPPP_(my_pv_display) - - -char * -DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) -{ - pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP); - if (len > cur && pv[cur] == '\0') - sv_catpvs(dsv, "\\0"); - return SvPVX(dsv); -} - -#endif -#endif - -#endif /* _P_P_PORTABILITY_H_ */ - -/* End of File ppport.h */ Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/suppressions.asan =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/suppressions.asan diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/suppressions.asan --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/suppressions.asan 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,10 +0,0 @@ -# suppressions file for address sanitizer - -leak:Perl_yylex -leak:Perl_yyparse -leak:Perl_init_i18nl10n -leak:Perl_newSTATEOP -leak:S_optimize_op -leak:Perl_re_op_compile -leak:S_doeval_compile -leak:Perl_re_dup_guts Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtdef =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtdef diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtdef --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtdef 15 Feb 2023 01:38:21 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,27 +0,0 @@ -#!/usr/local/bin/perl - -use Compress::Raw::Zlib ; - -use strict ; -use warnings ; - -binmode STDIN; -binmode STDOUT; - -my $x = new Compress::Raw::Zlib::Deflate() - or die "Cannot create a deflation stream\n" ; - -my $output = '' ; - -while (<>) -{ - $x->deflate($_, $output) == Z_OK - or die "deflate failed\n" ; - - print $output ; -} - -$x->flush($output) == Z_OK - or die "flush failed\n" ; - -print $output ; Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtinf =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtinf diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtinf --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/examples/filtinf 15 Feb 2023 01:38:21 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,29 +0,0 @@ -#!/usr/local/bin/perl - -use Compress::Raw::Zlib ; - -use strict ; -use warnings ; - -binmode STDIN; -binmode STDOUT; - -my $x = new Compress::Raw::Zlib::Inflate - or die "Cannot create a inflation stream\n" ; - -my $input = '' ; -my $output = '' ; -my $status ; - -while (read(STDIN, $input, 4096)) -{ - $status = $x->inflate($input, $output) ; - - print $output - if $status == Z_OK or $status == Z_STREAM_END ; - - last if $status != Z_OK ; -} - -die "inflation failed\n" - unless $status == Z_STREAM_END ; Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm,v diff -u -p -a -u -p -r1.7 Zlib.pm --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm 15 Feb 2023 01:38:21 -0000 1.7 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm 21 Feb 2024 15:47:00 -0000 @@ -10,7 +10,7 @@ use warnings ; use bytes ; our ($VERSION, $XS_VERSION, @ISA, @EXPORT, %EXPORT_TAGS, @EXPORT_OK, $AUTOLOAD, %DEFLATE_CONSTANTS, @DEFLATE_CONSTANTS); -$VERSION = '2.202'; +$VERSION = '2.204_001'; $XS_VERSION = $VERSION; $VERSION = eval $VERSION; @@ -1637,7 +1637,7 @@ See the Changes file. =head1 COPYRIGHT AND LICENSE -Copyright (c) 2005-2022 Paul Marquess. All rights reserved. +Copyright (c) 2005-2023 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/000prereq.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/000prereq.t diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/000prereq.t --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/000prereq.t 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,223 +0,0 @@ -BEGIN { - if ($ENV{PERL_CORE}) { - chdir 't' if -d 't'; - @INC = ("../lib", "lib/compress"); - } -} - -use lib qw(t t/compress); -use strict ; -use warnings ; - -use Test::More ; - -BEGIN -{ - - diag "Running Perl version $]\n"; - - # use Test::NoWarnings, if available - my $extra = 0 ; - $extra = 1 - if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; - - - my $VERSION = '2.202'; - my @NAMES = qw( - - ); - - my @OPT = qw( - - ); - - plan tests => 1 + @NAMES + @OPT + $extra ; - - ok 1; - - foreach my $name (@NAMES) - { - use_ok($name, $VERSION); - } - - - foreach my $name (@OPT) - { - eval " require $name " ; - if ($@) - { - ok 1, "$name not available" - } - else - { - my $ver = eval("\$${name}::VERSION"); - is $ver, $VERSION, "$name version should be $VERSION" - or diag "$name version is $ver, need $VERSION" ; - } - } - -} - -sub bit -{ - return 1 << $_[0]; -} - -{ - # Print our versions of all modules used - - use Compress::Raw::Zlib; - - my @results = ( [ 'Perl', $] ] ); - my @modules = qw( - Compress::Raw::Zlib - ); - - my %have = (); - - for my $module (@modules) - { - my $ver = packageVer($module) ; - my $v = defined $ver - ? $ver - : "Not Installed" ; - push @results, [$module, $v] ; - $have{$module} ++ - if $ver ; - } - - push @results, ['','']; - push @results, ["zlib_version (from zlib library)", Compress::Raw::Zlib::zlib_version() ]; - push @results, ["ZLIB_VERSION (from zlib.h)", Compress::Raw::Zlib::ZLIB_VERSION ]; - push @results, ["ZLIB_VERNUM", sprintf("0x%x", Compress::Raw::Zlib::ZLIB_VERNUM) ]; - push @results, ['','']; - - push @results, ['BUILD_ZLIB', $Compress::Raw::Zlib::BUILD_ZLIB]; - push @results, ['GZIP_OS_CODE', $Compress::Raw::Zlib::gzip_os_code]; - push @results, ['','']; - - if (Compress::Raw::Zlib::is_zlibng) - { - push @results, ["Using zlib-ng", "Yes" ]; - - push @results, ["zlibng_version", Compress::Raw::Zlib::zlibng_version() ]; - - if (Compress::Raw::Zlib::is_zlibng_compat) - { - push @results, ["zlib-ng Mode", "Compat" ]; - } - else - { - push @results, ["zlib-ng Mode", "Native" ]; - } - - my @ng = qw( - ZLIBNG_VERSION - ZLIBNG_VER_MAJOR - ZLIBNG_VER_MINOR - ZLIBNG_VER_REVISION - ZLIBNG_VER_STATUS - ZLIBNG_VER_MODIFIED - ); - - for my $n (@ng) - { - no strict 'refs'; - push @results, [" $n", &{ "Compress::Raw::Zlib::$n" } ]; - } - - no strict 'refs'; - push @results, [" ZLIBNG_VERNUM", sprintf("0x%x", &{ "Compress::Raw::Zlib::ZLIBNG_VERNUM" }) ]; - - } - else - { - push @results, ["Using zlib-ng", "No" ]; - } - - push @results, ['','']; - push @results, ["is_zlib_native", Compress::Raw::Zlib::is_zlib_native() ? 1 : 0 ]; - push @results, ["is_zlibng", Compress::Raw::Zlib::is_zlibng() ?1 : 0]; - push @results, ["is_zlibng_native", Compress::Raw::Zlib::is_zlibng_native() ? 1 : 0 ]; - push @results, ["is_zlibng_compat", Compress::Raw::Zlib::is_zlibng_compat() ? 1 : 0]; - - - my $zlib_h = ZLIB_VERSION ; - my $libz = Compress::Raw::Zlib::zlib_version; - my $ZLIB_VERNUM = sprintf ("0x%X", Compress::Raw::Zlib::ZLIB_VERNUM()) ; - my $flags = Compress::Raw::Zlib::zlibCompileFlags(); - - push @results, ['','']; - push @results, ['zlibCompileFlags', $flags]; - push @results, [' Type Sizes', '']; - - my %sizes = ( - 0 => '16 bit', - 1 => '32 bit', - 2 => '64 bit', - 3 => 'other' - ); - - push @results, [' size of uInt', $sizes{ ($flags >> 0) & 0x3 } ]; - push @results, [' size of uLong', $sizes{ ($flags >> 2) & 0x3 } ]; - push @results, [' size of pointer', $sizes{ ($flags >> 4) & 0x3 } ]; - push @results, [' size of z_off_t', $sizes{ ($flags >> 6) & 0x3 } ]; - - my @compiler_options; - push @compiler_options, 'ZLIB_DEBUG' if $flags & bit(8) ; - push @compiler_options, 'ASM' if $flags & bit(9) ; - push @compiler_options, 'ZLIB_WINAPI' if $flags & bit(10) ; - push @compiler_options, 'None' unless @compiler_options; - push @results, [' Compiler Options', join ", ", @compiler_options]; - - my @one_time; - push @one_time, 'BUILDFIXED' if $flags & bit(12) ; - push @one_time, 'DYNAMIC_CRC_TABLE' if $flags & bit(13) ; - push @one_time, 'None' unless @one_time; - push @results, [' One-time table building', join ", ", @one_time]; - - my @library; - push @library, 'NO_GZCOMPRESS' if $flags & bit(16) ; - push @library, 'NO_GZIP' if $flags & bit(17) ; - push @library, 'None' unless @library; - push @results, [' Library content', join ", ", @library]; - - my @operational; - push @operational, 'PKZIP_BUG_WORKAROUND' if $flags & bit(20) ; - push @operational, 'FASTEST' if $flags & bit(21) ; - push @operational, 'None' unless @operational; - push @results, [' Operation variations', join ", ", @operational]; - - - - if ($have{"Compress::Raw::Lzma"}) - { - my $ver = eval { Compress::Raw::Lzma::lzma_version_string(); } || "unknown"; - push @results, ["lzma", $ver] ; - } - - use List::Util qw(max); - my $width = max map { length $_->[0] } @results; - - diag "\n\n" ; - for my $m (@results) - { - my ($name, $ver) = @$m; - - my $b = " " x (1 + $width - length $name); - - diag $name . $b . $ver . "\n" ; - } - - diag "\n\n" ; -} - -sub packageVer -{ - no strict 'refs'; - my $package = shift; - - eval "use $package;"; - return ${ "${package}::VERSION" }; - -} \ No newline at end of file Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/99pod.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/99pod.t diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/99pod.t --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/99pod.t 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,15 +0,0 @@ -BEGIN { - if ($ENV{PERL_CORE}) { - chdir 't' if -d 't'; - @INC = ("../lib", "lib/compress"); - } -} - -use lib qw(t t/compress); -use Test::More; - -eval "use Test::Pod 1.00"; - -plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; - -all_pod_files_ok(); Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-json.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-json.t diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-json.t --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-json.t 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,12 +0,0 @@ -BEGIN { - if ($ENV{PERL_CORE}) { - chdir 't' if -d 't'; - @INC = ("../lib", "lib/compress"); - } -} - -use lib qw(t t/compress); -use Test::More; -eval "use Test::CPAN::Meta::JSON"; -plan skip_all => "Test::CPAN::Meta::JSON required for testing META.json" if $@; -meta_json_ok(); \ No newline at end of file Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-yaml.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-yaml.t diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-yaml.t --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/meta-yaml.t 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,12 +0,0 @@ -BEGIN { - if ($ENV{PERL_CORE}) { - chdir 't' if -d 't'; - @INC = ("../lib", "lib/compress"); - } -} - -use lib qw(t t/compress); -use Test::More; -eval "use Test::CPAN::Meta"; -plan skip_all => "Test::CPAN::Meta required for testing META.yml" if $@; -meta_yaml_ok(); \ No newline at end of file Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Builder.pm =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Builder.pm diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Builder.pm --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Builder.pm 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,1625 +0,0 @@ -package Test::Builder; - -use 5.004; - -# $^C was only introduced in 5.005-ish. We do this to prevent -# use of uninitialized value warnings in older perls. -$^C ||= 0; - -use strict; -our ($VERSION); -$VERSION = '0.30'; -$VERSION = eval $VERSION; # make the alpha version come out as a number - -# Make Test::Builder thread-safe for ithreads. -BEGIN { - use Config; - # Load threads::shared when threads are turned on - if( $] >= 5.008 && $Config{useithreads} && $INC{'threads.pm'}) { - require threads::shared; - - # Hack around YET ANOTHER threads::shared bug. It would - # occassionally forget the contents of the variable when sharing it. - # So we first copy the data, then share, then put our copy back. - *share = sub (\[$@%]) { - my $type = ref $_[0]; - my $data; - - if( $type eq 'HASH' ) { - %$data = %{$_[0]}; - } - elsif( $type eq 'ARRAY' ) { - @$data = @{$_[0]}; - } - elsif( $type eq 'SCALAR' ) { - $$data = ${$_[0]}; - } - else { - die "Unknown type: ".$type; - } - - $_[0] = &threads::shared::share($_[0]); - - if( $type eq 'HASH' ) { - %{$_[0]} = %$data; - } - elsif( $type eq 'ARRAY' ) { - @{$_[0]} = @$data; - } - elsif( $type eq 'SCALAR' ) { - ${$_[0]} = $$data; - } - else { - die "Unknown type: ".$type; - } - - return $_[0]; - }; - } - # 5.8.0's threads::shared is busted when threads are off. - # We emulate it here. - else { - *share = sub { return $_[0] }; - *lock = sub { 0 }; - } -} - - -=head1 NAME - -Test::Builder - Backend for building test libraries - -=head1 SYNOPSIS - - package My::Test::Module; - use Test::Builder; - require Exporter; - @ISA = qw(Exporter); - @EXPORT = qw(ok); - - my $Test = Test::Builder->new; - $Test->output('my_logfile'); - - sub import { - my($self) = shift; - my $pack = caller; - - $Test->exported_to($pack); - $Test->plan(@_); - - $self->export_to_level(1, $self, 'ok'); - } - - sub ok { - my($test, $name) = @_; - - $Test->ok($test, $name); - } - - -=head1 DESCRIPTION - -Test::Simple and Test::More have proven to be popular testing modules, -but they're not always flexible enough. Test::Builder provides the a -building block upon which to write your own test libraries I. - -=head2 Construction - -=over 4 - -=item B - - my $Test = Test::Builder->new; - -Returns a Test::Builder object representing the current state of the -test. - -Since you only run one test per program C always returns the same -Test::Builder object. No matter how many times you call new(), you're -getting the same object. This is called a singleton. This is done so that -multiple modules share such global information as the test counter and -where test output is going. - -If you want a completely new Test::Builder object different from the -singleton, use C. - -=cut - -my $Test = Test::Builder->new; -sub new { - my($class) = shift; - $Test ||= $class->create; - return $Test; -} - - -=item B - - my $Test = Test::Builder->create; - -Ok, so there can be more than one Test::Builder object and this is how -you get it. You might use this instead of C if you're testing -a Test::Builder based module, but otherwise you probably want C. - -B: the implementation is not complete. C, for example, is -still shared amongst B Test::Builder objects, even ones created using -this method. Also, the method name may change in the future. - -=cut - -sub create { - my $class = shift; - - my $self = bless {}, $class; - $self->reset; - - return $self; -} - -=item B - - $Test->reset; - -Reinitializes the Test::Builder singleton to its original state. -Mostly useful for tests run in persistent environments where the same -test might be run multiple times in the same process. - -=cut - -our ($Level); - -sub reset { - my ($self) = @_; - - # We leave this a global because it has to be localized and localizing - # hash keys is just asking for pain. Also, it was documented. - $Level = 1; - - $self->{Test_Died} = 0; - $self->{Have_Plan} = 0; - $self->{No_Plan} = 0; - $self->{Original_Pid} = $$; - - share($self->{Curr_Test}); - $self->{Curr_Test} = 0; - $self->{Test_Results} = &share([]); - - $self->{Exported_To} = undef; - $self->{Expected_Tests} = 0; - - $self->{Skip_All} = 0; - - $self->{Use_Nums} = 1; - - $self->{No_Header} = 0; - $self->{No_Ending} = 0; - - $self->_dup_stdhandles unless $^C; - - return undef; -} - -=back - -=head2 Setting up tests - -These methods are for setting up tests and declaring how many there -are. You usually only want to call one of these methods. - -=over 4 - -=item B - - my $pack = $Test->exported_to; - $Test->exported_to($pack); - -Tells Test::Builder what package you exported your functions to. -This is important for getting TODO tests right. - -=cut - -sub exported_to { - my($self, $pack) = @_; - - if( defined $pack ) { - $self->{Exported_To} = $pack; - } - return $self->{Exported_To}; -} - -=item B - - $Test->plan('no_plan'); - $Test->plan( skip_all => $reason ); - $Test->plan( tests => $num_tests ); - -A convenient way to set up your tests. Call this and Test::Builder -will print the appropriate headers and take the appropriate actions. - -If you call plan(), don't call any of the other methods below. - -=cut - -sub plan { - my($self, $cmd, $arg) = @_; - - return unless $cmd; - - if( $self->{Have_Plan} ) { - die sprintf "You tried to plan twice! Second plan at %s line %d\n", - ($self->caller)[1,2]; - } - - if( $cmd eq 'no_plan' ) { - $self->no_plan; - } - elsif( $cmd eq 'skip_all' ) { - return $self->skip_all($arg); - } - elsif( $cmd eq 'tests' ) { - if( $arg ) { - return $self->expected_tests($arg); - } - elsif( !defined $arg ) { - die "Got an undefined number of tests. Looks like you tried to ". - "say how many tests you plan to run but made a mistake.\n"; - } - elsif( !$arg ) { - die "You said to run 0 tests! You've got to run something.\n"; - } - } - else { - require Carp; - my @args = grep { defined } ($cmd, $arg); - Carp::croak("plan() doesn't understand @args"); - } - - return 1; -} - -=item B - - my $max = $Test->expected_tests; - $Test->expected_tests($max); - -Gets/sets the # of tests we expect this test to run and prints out -the appropriate headers. - -=cut - -sub expected_tests { - my $self = shift; - my($max) = @_; - - if( @_ ) { - die "Number of tests must be a postive integer. You gave it '$max'.\n" - unless $max =~ /^\+?\d+$/ and $max > 0; - - $self->{Expected_Tests} = $max; - $self->{Have_Plan} = 1; - - $self->_print("1..$max\n") unless $self->no_header; - } - return $self->{Expected_Tests}; -} - - -=item B - - $Test->no_plan; - -Declares that this test will run an indeterminate # of tests. - -=cut - -sub no_plan { - my $self = shift; - - $self->{No_Plan} = 1; - $self->{Have_Plan} = 1; -} - -=item B - - $plan = $Test->has_plan - -Find out whether a plan has been defined. $plan is either C (no plan has been set), C (indeterminate # of tests) or an integer (the number of expected tests). - -=cut - -sub has_plan { - my $self = shift; - - return($self->{Expected_Tests}) if $self->{Expected_Tests}; - return('no_plan') if $self->{No_Plan}; - return(undef); -}; - - -=item B - - $Test->skip_all; - $Test->skip_all($reason); - -Skips all the tests, using the given $reason. Exits immediately with 0. - -=cut - -sub skip_all { - my($self, $reason) = @_; - - my $out = "1..0"; - $out .= " # Skip $reason" if $reason; - $out .= "\n"; - - $self->{Skip_All} = 1; - - $self->_print($out) unless $self->no_header; - exit(0); -} - -=back - -=head2 Running tests - -These actually run the tests, analogous to the functions in -Test::More. - -$name is always optional. - -=over 4 - -=item B - - $Test->ok($test, $name); - -Your basic test. Pass if $test is true, fail if $test is false. Just -like Test::Simple's ok(). - -=cut - -sub ok { - my($self, $test, $name) = @_; - - # $test might contain an object which we don't want to accidentally - # store, so we turn it into a boolean. - $test = $test ? 1 : 0; - - unless( $self->{Have_Plan} ) { - require Carp; - Carp::croak("You tried to run a test without a plan! Gotta have a plan."); - } - - lock $self->{Curr_Test}; - $self->{Curr_Test}++; - - # In case $name is a string overloaded object, force it to stringify. - $self->_unoverload(\$name); - - $self->diag(<caller; - - my $todo = $self->todo($pack); - $self->_unoverload(\$todo); - - my $out; - my $result = &share({}); - - unless( $test ) { - $out .= "not "; - @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 ); - } - else { - @$result{ 'ok', 'actual_ok' } = ( 1, $test ); - } - - $out .= "ok"; - $out .= " $self->{Curr_Test}" if $self->use_numbers; - - if( defined $name ) { - $name =~ s|#|\\#|g; # # in a name can confuse Test::Harness. - $out .= " - $name"; - $result->{name} = $name; - } - else { - $result->{name} = ''; - } - - if( $todo ) { - $out .= " # TODO $todo"; - $result->{reason} = $todo; - $result->{type} = 'todo'; - } - else { - $result->{reason} = ''; - $result->{type} = ''; - } - - $self->{Test_Results}[$self->{Curr_Test}-1] = $result; - $out .= "\n"; - - $self->_print($out); - - unless( $test ) { - my $msg = $todo ? "Failed (TODO)" : "Failed"; - $self->_print_diag("\n") if $ENV{HARNESS_ACTIVE}; - $self->diag(" $msg test ($file at line $line)\n"); - } - - return $test ? 1 : 0; -} - - -sub _unoverload { - my $self = shift; - - local($@,$!); - - eval { require overload } || return; - - foreach my $thing (@_) { - eval { - if( defined $$thing ) { - if( my $string_meth = overload::Method($$thing, '""') ) { - $$thing = $$thing->$string_meth(); - } - } - }; - } -} - - -=item B - - $Test->is_eq($got, $expected, $name); - -Like Test::More's is(). Checks if $got eq $expected. This is the -string version. - -=item B - - $Test->is_num($got, $expected, $name); - -Like Test::More's is(). Checks if $got == $expected. This is the -numeric version. - -=cut - -sub is_eq { - my($self, $got, $expect, $name) = @_; - local $Level = $Level + 1; - - if( !defined $got || !defined $expect ) { - # undef only matches undef and nothing else - my $test = !defined $got && !defined $expect; - - $self->ok($test, $name); - $self->_is_diag($got, 'eq', $expect) unless $test; - return $test; - } - - return $self->cmp_ok($got, 'eq', $expect, $name); -} - -sub is_num { - my($self, $got, $expect, $name) = @_; - local $Level = $Level + 1; - - if( !defined $got || !defined $expect ) { - # undef only matches undef and nothing else - my $test = !defined $got && !defined $expect; - - $self->ok($test, $name); - $self->_is_diag($got, '==', $expect) unless $test; - return $test; - } - - return $self->cmp_ok($got, '==', $expect, $name); -} - -sub _is_diag { - my($self, $got, $type, $expect) = @_; - - foreach my $val (\$got, \$expect) { - if( defined $$val ) { - if( $type eq 'eq' ) { - # quote and force string context - $$val = "'$$val'" - } - else { - # force numeric context - $$val = $$val+0; - } - } - else { - $$val = 'undef'; - } - } - - return $self->diag(sprintf < - - $Test->isnt_eq($got, $dont_expect, $name); - -Like Test::More's isnt(). Checks if $got ne $dont_expect. This is -the string version. - -=item B - - $Test->is_num($got, $dont_expect, $name); - -Like Test::More's isnt(). Checks if $got ne $dont_expect. This is -the numeric version. - -=cut - -sub isnt_eq { - my($self, $got, $dont_expect, $name) = @_; - local $Level = $Level + 1; - - if( !defined $got || !defined $dont_expect ) { - # undef only matches undef and nothing else - my $test = defined $got || defined $dont_expect; - - $self->ok($test, $name); - $self->_cmp_diag($got, 'ne', $dont_expect) unless $test; - return $test; - } - - return $self->cmp_ok($got, 'ne', $dont_expect, $name); -} - -sub isnt_num { - my($self, $got, $dont_expect, $name) = @_; - local $Level = $Level + 1; - - if( !defined $got || !defined $dont_expect ) { - # undef only matches undef and nothing else - my $test = defined $got || defined $dont_expect; - - $self->ok($test, $name); - $self->_cmp_diag($got, '!=', $dont_expect) unless $test; - return $test; - } - - return $self->cmp_ok($got, '!=', $dont_expect, $name); -} - - -=item B - - $Test->like($this, qr/$regex/, $name); - $Test->like($this, '/$regex/', $name); - -Like Test::More's like(). Checks if $this matches the given $regex. - -You'll want to avoid qr// if you want your tests to work before 5.005. - -=item B - - $Test->unlike($this, qr/$regex/, $name); - $Test->unlike($this, '/$regex/', $name); - -Like Test::More's unlike(). Checks if $this B the -given $regex. - -=cut - -sub like { - my($self, $this, $regex, $name) = @_; - - local $Level = $Level + 1; - $self->_regex_ok($this, $regex, '=~', $name); -} - -sub unlike { - my($self, $this, $regex, $name) = @_; - - local $Level = $Level + 1; - $self->_regex_ok($this, $regex, '!~', $name); -} - -=item B - - $Test->maybe_regex(qr/$regex/); - $Test->maybe_regex('/$regex/'); - -Convenience method for building testing functions that take regular -expressions as arguments, but need to work before perl 5.005. - -Takes a quoted regular expression produced by qr//, or a string -representing a regular expression. - -Returns a Perl value which may be used instead of the corresponding -regular expression, or undef if it's argument is not recognised. - -For example, a version of like(), sans the useful diagnostic messages, -could be written as: - - sub laconic_like { - my ($self, $this, $regex, $name) = @_; - my $usable_regex = $self->maybe_regex($regex); - die "expecting regex, found '$regex'\n" - unless $usable_regex; - $self->ok($this =~ m/$usable_regex/, $name); - } - -=cut - - -sub maybe_regex { - my ($self, $regex) = @_; - my $usable_regex = undef; - - return $usable_regex unless defined $regex; - - my($re, $opts); - - # Check for qr/foo/ - if( ref $regex eq 'Regexp' ) { - $usable_regex = $regex; - } - # Check for '/foo/' or 'm,foo,' - elsif( ($re, $opts) = $regex =~ m{^ /(.*)/ (\w*) $ }sx or - (undef, $re, $opts) = $regex =~ m,^ m([^\w\s]) (.+) \1 (\w*) $,sx - ) - { - $usable_regex = length $opts ? "(?$opts)$re" : $re; - } - - return $usable_regex; -}; - -sub _regex_ok { - my($self, $this, $regex, $cmp, $name) = @_; - - local $Level = $Level + 1; - - my $ok = 0; - my $usable_regex = $self->maybe_regex($regex); - unless (defined $usable_regex) { - $ok = $self->ok( 0, $name ); - $self->diag(" '$regex' doesn't look much like a regex to me."); - return $ok; - } - - { - local $^W = 0; - my $test = $this =~ /$usable_regex/ ? 1 : 0; - $test = !$test if $cmp eq '!~'; - $ok = $self->ok( $test, $name ); - } - - unless( $ok ) { - $this = defined $this ? "'$this'" : 'undef'; - my $match = $cmp eq '=~' ? "doesn't match" : "matches"; - $self->diag(sprintf < - - $Test->cmp_ok($this, $type, $that, $name); - -Works just like Test::More's cmp_ok(). - - $Test->cmp_ok($big_num, '!=', $other_big_num); - -=cut - -sub cmp_ok { - my($self, $got, $type, $expect, $name) = @_; - - my $test; - { - local $^W = 0; - local($@,$!); # don't interfere with $@ - # eval() sometimes resets $! - $test = eval "\$got $type \$expect"; - } - local $Level = $Level + 1; - my $ok = $self->ok($test, $name); - - unless( $ok ) { - if( $type =~ /^(eq|==)$/ ) { - $self->_is_diag($got, $type, $expect); - } - else { - $self->_cmp_diag($got, $type, $expect); - } - } - return $ok; -} - -sub _cmp_diag { - my($self, $got, $type, $expect) = @_; - - $got = defined $got ? "'$got'" : 'undef'; - $expect = defined $expect ? "'$expect'" : 'undef'; - return $self->diag(sprintf < - - $Test->BAILOUT($reason); - -Indicates to the Test::Harness that things are going so badly all -testing should terminate. This includes running any additional test -scripts. - -It will exit with 255. - -=cut - -sub BAILOUT { - my($self, $reason) = @_; - - $self->_print("Bail out! $reason"); - exit 255; -} - -=item B - - $Test->skip; - $Test->skip($why); - -Skips the current test, reporting $why. - -=cut - -sub skip { - my($self, $why) = @_; - $why ||= ''; - $self->_unoverload(\$why); - - unless( $self->{Have_Plan} ) { - require Carp; - Carp::croak("You tried to run tests without a plan! Gotta have a plan."); - } - - lock($self->{Curr_Test}); - $self->{Curr_Test}++; - - $self->{Test_Results}[$self->{Curr_Test}-1] = &share({ - 'ok' => 1, - actual_ok => 1, - name => '', - type => 'skip', - reason => $why, - }); - - my $out = "ok"; - $out .= " $self->{Curr_Test}" if $self->use_numbers; - $out .= " # skip"; - $out .= " $why" if length $why; - $out .= "\n"; - - $self->_print($out); - - return 1; -} - - -=item B - - $Test->todo_skip; - $Test->todo_skip($why); - -Like skip(), only it will declare the test as failing and TODO. Similar -to - - print "not ok $tnum # TODO $why\n"; - -=cut - -sub todo_skip { - my($self, $why) = @_; - $why ||= ''; - - unless( $self->{Have_Plan} ) { - require Carp; - Carp::croak("You tried to run tests without a plan! Gotta have a plan."); - } - - lock($self->{Curr_Test}); - $self->{Curr_Test}++; - - $self->{Test_Results}[$self->{Curr_Test}-1] = &share({ - 'ok' => 1, - actual_ok => 0, - name => '', - type => 'todo_skip', - reason => $why, - }); - - my $out = "not ok"; - $out .= " $self->{Curr_Test}" if $self->use_numbers; - $out .= " # TODO & SKIP $why\n"; - - $self->_print($out); - - return 1; -} - - -=begin _unimplemented - -=item B - - $Test->skip_rest; - $Test->skip_rest($reason); - -Like skip(), only it skips all the rest of the tests you plan to run -and terminates the test. - -If you're running under no_plan, it skips once and terminates the -test. - -=end _unimplemented - -=back - - -=head2 Test style - -=over 4 - -=item B - - $Test->level($how_high); - -How far up the call stack should $Test look when reporting where the -test failed. - -Defaults to 1. - -Setting $Test::Builder::Level overrides. This is typically useful -localized: - - { - local $Test::Builder::Level = 2; - $Test->ok($test); - } - -=cut - -sub level { - my($self, $level) = @_; - - if( defined $level ) { - $Level = $level; - } - return $Level; -} - - -=item B - - $Test->use_numbers($on_or_off); - -Whether or not the test should output numbers. That is, this if true: - - ok 1 - ok 2 - ok 3 - -or this if false - - ok - ok - ok - -Most useful when you can't depend on the test output order, such as -when threads or forking is involved. - -Test::Harness will accept either, but avoid mixing the two styles. - -Defaults to on. - -=cut - -sub use_numbers { - my($self, $use_nums) = @_; - - if( defined $use_nums ) { - $self->{Use_Nums} = $use_nums; - } - return $self->{Use_Nums}; -} - -=item B - - $Test->no_header($no_header); - -If set to true, no "1..N" header will be printed. - -=item B - - $Test->no_ending($no_ending); - -Normally, Test::Builder does some extra diagnostics when the test -ends. It also changes the exit code as described below. - -If this is true, none of that will be done. - -=cut - -sub no_header { - my($self, $no_header) = @_; - - if( defined $no_header ) { - $self->{No_Header} = $no_header; - } - return $self->{No_Header}; -} - -sub no_ending { - my($self, $no_ending) = @_; - - if( defined $no_ending ) { - $self->{No_Ending} = $no_ending; - } - return $self->{No_Ending}; -} - - -=back - -=head2 Output - -Controlling where the test output goes. - -It's ok for your test to change where STDOUT and STDERR point to, -Test::Builder's default output settings will not be affected. - -=over 4 - -=item B - - $Test->diag(@msgs); - -Prints out the given @msgs. Like C, arguments are simply -appended together. - -Normally, it uses the failure_output() handle, but if this is for a -TODO test, the todo_output() handle is used. - -Output will be indented and marked with a # so as not to interfere -with test output. A newline will be put on the end if there isn't one -already. - -We encourage using this rather than calling print directly. - -Returns false. Why? Because diag() is often used in conjunction with -a failing test (C) it "passes through" the failure. - - return ok(...) || diag(...); - -=for blame transfer -Mark Fowler - -=cut - -sub diag { - my($self, @msgs) = @_; - return unless @msgs; - - # Prevent printing headers when compiling (i.e. -c) - return if $^C; - - # Smash args together like print does. - # Convert undef to 'undef' so its readable. - my $msg = join '', map { defined($_) ? $_ : 'undef' } @msgs; - - # Escape each line with a #. - $msg =~ s/^/# /gm; - - # Stick a newline on the end if it needs it. - $msg .= "\n" unless $msg =~ /\n\Z/; - - local $Level = $Level + 1; - $self->_print_diag($msg); - - return 0; -} - -=begin _private - -=item B<_print> - - $Test->_print(@msgs); - -Prints to the output() filehandle. - -=end _private - -=cut - -sub _print { - my($self, @msgs) = @_; - - # Prevent printing headers when only compiling. Mostly for when - # tests are deparsed with B::Deparse - return if $^C; - - my $msg = join '', @msgs; - - local($\, $", $,) = (undef, ' ', ''); - my $fh = $self->output; - - # Escape each line after the first with a # so we don't - # confuse Test::Harness. - $msg =~ s/\n(.)/\n# $1/sg; - - # Stick a newline on the end if it needs it. - $msg .= "\n" unless $msg =~ /\n\Z/; - - print $fh $msg; -} - - -=item B<_print_diag> - - $Test->_print_diag(@msg); - -Like _print, but prints to the current diagnostic filehandle. - -=cut - -sub _print_diag { - my $self = shift; - - local($\, $", $,) = (undef, ' ', ''); - my $fh = $self->todo ? $self->todo_output : $self->failure_output; - print $fh @_; -} - -=item B - - $Test->output($fh); - $Test->output($file); - -Where normal "ok/not ok" test output should go. - -Defaults to STDOUT. - -=item B - - $Test->failure_output($fh); - $Test->failure_output($file); - -Where diagnostic output on test failures and diag() should go. - -Defaults to STDERR. - -=item B - - $Test->todo_output($fh); - $Test->todo_output($file); - -Where diagnostics about todo test failures and diag() should go. - -Defaults to STDOUT. - -=cut - -sub output { - my($self, $fh) = @_; - - if( defined $fh ) { - $self->{Out_FH} = _new_fh($fh); - } - return $self->{Out_FH}; -} - -sub failure_output { - my($self, $fh) = @_; - - if( defined $fh ) { - $self->{Fail_FH} = _new_fh($fh); - } - return $self->{Fail_FH}; -} - -sub todo_output { - my($self, $fh) = @_; - - if( defined $fh ) { - $self->{Todo_FH} = _new_fh($fh); - } - return $self->{Todo_FH}; -} - - -sub _new_fh { - my($file_or_fh) = shift; - - my $fh; - if( _is_fh($file_or_fh) ) { - $fh = $file_or_fh; - } - else { - $fh = do { local *FH }; - open $fh, ">$file_or_fh" or - die "Can't open test output log $file_or_fh: $!"; - _autoflush($fh); - } - - return $fh; -} - - -sub _is_fh { - my $maybe_fh = shift; - - return 1 if ref \$maybe_fh eq 'GLOB'; # its a glob - - return UNIVERSAL::isa($maybe_fh, 'GLOB') || - UNIVERSAL::isa($maybe_fh, 'IO::Handle') || - - # 5.5.4's tied() and can() doesn't like getting undef - UNIVERSAL::can((tied($maybe_fh) || ''), 'TIEHANDLE'); -} - - -sub _autoflush { - my($fh) = shift; - my $old_fh = select $fh; - $| = 1; - select $old_fh; -} - - -sub _dup_stdhandles { - my $self = shift; - - $self->_open_testhandles; - - # Set everything to unbuffered else plain prints to STDOUT will - # come out in the wrong order from our own prints. - _autoflush(\*TESTOUT); - _autoflush(\*STDOUT); - _autoflush(\*TESTERR); - _autoflush(\*STDERR); - - $self->output(\*TESTOUT); - $self->failure_output(\*TESTERR); - $self->todo_output(\*TESTOUT); -} - - -my $Opened_Testhandles = 0; -sub _open_testhandles { - return if $Opened_Testhandles; - # We dup STDOUT and STDERR so people can change them in their - # test suites while still getting normal test output. - open(TESTOUT, ">&STDOUT") or die "Can't dup STDOUT: $!"; - open(TESTERR, ">&STDERR") or die "Can't dup STDERR: $!"; - $Opened_Testhandles = 1; -} - - -=back - - -=head2 Test Status and Info - -=over 4 - -=item B - - my $curr_test = $Test->current_test; - $Test->current_test($num); - -Gets/sets the current test number we're on. You usually shouldn't -have to set this. - -If set forward, the details of the missing tests are filled in as 'unknown'. -if set backward, the details of the intervening tests are deleted. You -can erase history if you really want to. - -=cut - -sub current_test { - my($self, $num) = @_; - - lock($self->{Curr_Test}); - if( defined $num ) { - unless( $self->{Have_Plan} ) { - require Carp; - Carp::croak("Can't change the current test number without a plan!"); - } - - $self->{Curr_Test} = $num; - - # If the test counter is being pushed forward fill in the details. - my $test_results = $self->{Test_Results}; - if( $num > @$test_results ) { - my $start = @$test_results ? @$test_results : 0; - for ($start..$num-1) { - $test_results->[$_] = &share({ - 'ok' => 1, - actual_ok => undef, - reason => 'incrementing test number', - type => 'unknown', - name => undef - }); - } - } - # If backward, wipe history. Its their funeral. - elsif( $num < @$test_results ) { - $#{$test_results} = $num - 1; - } - } - return $self->{Curr_Test}; -} - - -=item B - - my @tests = $Test->summary; - -A simple summary of the tests so far. True for pass, false for fail. -This is a logical pass/fail, so todos are passes. - -Of course, test #1 is $tests[0], etc... - -=cut - -sub summary { - my($self) = shift; - - return map { $_->{'ok'} } @{ $self->{Test_Results} }; -} - -=item B
- - my @tests = $Test->details; - -Like summary(), but with a lot more detail. - - $tests[$test_num - 1] = - { 'ok' => is the test considered a pass? - actual_ok => did it literally say 'ok'? - name => name of the test (if any) - type => type of test (if any, see below). - reason => reason for the above (if any) - }; - -'ok' is true if Test::Harness will consider the test to be a pass. - -'actual_ok' is a reflection of whether or not the test literally -printed 'ok' or 'not ok'. This is for examining the result of 'todo' -tests. - -'name' is the name of the test. - -'type' indicates if it was a special test. Normal tests have a type -of ''. Type can be one of the following: - - skip see skip() - todo see todo() - todo_skip see todo_skip() - unknown see below - -Sometimes the Test::Builder test counter is incremented without it -printing any test output, for example, when current_test() is changed. -In these cases, Test::Builder doesn't know the result of the test, so -it's type is 'unkown'. These details for these tests are filled in. -They are considered ok, but the name and actual_ok is left undef. - -For example "not ok 23 - hole count # TODO insufficient donuts" would -result in this structure: - - $tests[22] = # 23 - 1, since arrays start from 0. - { ok => 1, # logically, the test passed since it's todo - actual_ok => 0, # in absolute terms, it failed - name => 'hole count', - type => 'todo', - reason => 'insufficient donuts' - }; - -=cut - -sub details { - my $self = shift; - return @{ $self->{Test_Results} }; -} - -=item B - - my $todo_reason = $Test->todo; - my $todo_reason = $Test->todo($pack); - -todo() looks for a $TODO variable in your tests. If set, all tests -will be considered 'todo' (see Test::More and Test::Harness for -details). Returns the reason (ie. the value of $TODO) if running as -todo tests, false otherwise. - -todo() is about finding the right package to look for $TODO in. It -uses the exported_to() package to find it. If that's not set, it's -pretty good at guessing the right package to look at based on $Level. - -Sometimes there is some confusion about where todo() should be looking -for the $TODO variable. If you want to be sure, tell it explicitly -what $pack to use. - -=cut - -sub todo { - my($self, $pack) = @_; - - $pack = $pack || $self->exported_to || $self->caller($Level); - return 0 unless $pack; - - no strict 'refs'; - return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'} - : 0; -} - -=item B - - my $package = $Test->caller; - my($pack, $file, $line) = $Test->caller; - my($pack, $file, $line) = $Test->caller($height); - -Like the normal caller(), except it reports according to your level(). - -=cut - -sub caller { - my($self, $height) = @_; - $height ||= 0; - - my @caller = CORE::caller($self->level + $height + 1); - return wantarray ? @caller : $caller[0]; -} - -=back - -=cut - -=begin _private - -=over 4 - -=item B<_sanity_check> - - $self->_sanity_check(); - -Runs a bunch of end of test sanity checks to make sure reality came -through ok. If anything is wrong it will die with a fairly friendly -error message. - -=cut - -#'# -sub _sanity_check { - my $self = shift; - - _whoa($self->{Curr_Test} < 0, 'Says here you ran a negative number of tests!'); - _whoa(!$self->{Have_Plan} and $self->{Curr_Test}, - 'Somehow your tests ran without a plan!'); - _whoa($self->{Curr_Test} != @{ $self->{Test_Results} }, - 'Somehow you got a different number of results than tests ran!'); -} - -=item B<_whoa> - - _whoa($check, $description); - -A sanity check, similar to assert(). If the $check is true, something -has gone horribly wrong. It will die with the given $description and -a note to contact the author. - -=cut - -sub _whoa { - my($check, $desc) = @_; - if( $check ) { - die < - - _my_exit($exit_num); - -Perl seems to have some trouble with exiting inside an END block. 5.005_03 -and 5.6.1 both seem to do odd things. Instead, this function edits $? -directly. It should ONLY be called from inside an END block. It -doesn't actually exit, that's your job. - -=cut - -sub _my_exit { - $? = $_[0]; - - return 1; -} - - -=back - -=end _private - -=cut - -$SIG{__DIE__} = sub { - # We don't want to muck with death in an eval, but $^S isn't - # totally reliable. 5.005_03 and 5.6.1 both do the wrong thing - # with it. Instead, we use caller. This also means it runs under - # 5.004! - my $in_eval = 0; - for( my $stack = 1; my $sub = (CORE::caller($stack))[3]; $stack++ ) { - $in_eval = 1 if $sub =~ /^\(eval\)/; - } - $Test->{Test_Died} = 1 unless $in_eval; -}; - -sub _ending { - my $self = shift; - - $self->_sanity_check(); - - # Don't bother with an ending if this is a forked copy. Only the parent - # should do the ending. - # Exit if plan() was never called. This is so "require Test::Simple" - # doesn't puke. - if( ($self->{Original_Pid} != $$) or - (!$self->{Have_Plan} && !$self->{Test_Died}) ) - { - _my_exit($?); - return; - } - - # Figure out if we passed or failed and print helpful messages. - my $test_results = $self->{Test_Results}; - if( @$test_results ) { - # The plan? We have no plan. - if( $self->{No_Plan} ) { - $self->_print("1..$self->{Curr_Test}\n") unless $self->no_header; - $self->{Expected_Tests} = $self->{Curr_Test}; - } - - # Auto-extended arrays and elements which aren't explicitly - # filled in with a shared reference will puke under 5.8.0 - # ithreads. So we have to fill them in by hand. :( - my $empty_result = &share({}); - for my $idx ( 0..$self->{Expected_Tests}-1 ) { - $test_results->[$idx] = $empty_result - unless defined $test_results->[$idx]; - } - - my $num_failed = grep !$_->{'ok'}, - @{$test_results}[0..$self->{Expected_Tests}-1]; - $num_failed += abs($self->{Expected_Tests} - @$test_results); - - if( $self->{Curr_Test} < $self->{Expected_Tests} ) { - my $s = $self->{Expected_Tests} == 1 ? '' : 's'; - $self->diag(<<"FAIL"); -Looks like you planned $self->{Expected_Tests} test$s but only ran $self->{Curr_Test}. -FAIL - } - elsif( $self->{Curr_Test} > $self->{Expected_Tests} ) { - my $num_extra = $self->{Curr_Test} - $self->{Expected_Tests}; - my $s = $self->{Expected_Tests} == 1 ? '' : 's'; - $self->diag(<<"FAIL"); -Looks like you planned $self->{Expected_Tests} test$s but ran $num_extra extra. -FAIL - } - elsif ( $num_failed ) { - my $s = $num_failed == 1 ? '' : 's'; - $self->diag(<<"FAIL"); -Looks like you failed $num_failed test$s of $self->{Expected_Tests}. -FAIL - } - - if( $self->{Test_Died} ) { - $self->diag(<<"FAIL"); -Looks like your test died just after $self->{Curr_Test}. -FAIL - - _my_exit( 255 ) && return; - } - - _my_exit( $num_failed <= 254 ? $num_failed : 254 ) && return; - } - elsif ( $self->{Skip_All} ) { - _my_exit( 0 ) && return; - } - elsif ( $self->{Test_Died} ) { - $self->diag(<<'FAIL'); -Looks like your test died before it could output anything. -FAIL - _my_exit( 255 ) && return; - } - else { - $self->diag("No tests run!\n"); - _my_exit( 255 ) && return; - } -} - -END { - $Test->_ending if defined $Test and !$Test->no_ending; -} - -=head1 EXIT CODES - -If all your tests passed, Test::Builder will exit with zero (which is -normal). If anything failed it will exit with how many failed. If -you run less (or more) tests than you planned, the missing (or extras) -will be considered failures. If no tests were ever run Test::Builder -will throw a warning and exit with 255. If the test died, even after -having successfully completed all its tests, it will still be -considered a failure and will exit with 255. - -So the exit codes are... - - 0 all tests successful - 255 test died - any other number how many failed (including missing or extras) - -If you fail more than 254 tests, it will be reported as 254. - - -=head1 THREADS - -In perl 5.8.0 and later, Test::Builder is thread-safe. The test -number is shared amongst all threads. This means if one thread sets -the test number using current_test() they will all be effected. - -Test::Builder is only thread-aware if threads.pm is loaded I -Test::Builder. - -=head1 EXAMPLES - -CPAN can provide the best examples. Test::Simple, Test::More, -Test::Exception and Test::Differences all use Test::Builder. - -=head1 SEE ALSO - -Test::Simple, Test::More, Test::Harness - -=head1 AUTHORS - -Original code by chromatic, maintained by Michael G Schwern -Eschwern@pobox.comE - -=head1 COPYRIGHT - -Copyright 2002, 2004 by chromatic Echromatic@wgz.orgE and - Michael G Schwern Eschwern@pobox.comE. - -This program is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -See F - -=cut - -1; Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/More.pm =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/More.pm diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/More.pm --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/More.pm 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,1493 +0,0 @@ -package Test::More; - -use 5.004; - -use strict; -use Test::Builder; - - -# Can't use Carp because it might cause use_ok() to accidentally succeed -# even though the module being used forgot to use Carp. Yes, this -# actually happened. -sub _carp { - my($file, $line) = (caller(1))[1,2]; - warn @_, " at $file line $line\n"; -} - - - -require Exporter; -our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $TODO); -$VERSION = '0.60'; -$VERSION = eval $VERSION; # make the alpha version come out as a number - -@ISA = qw(Exporter); -@EXPORT = qw(ok use_ok require_ok - is isnt like unlike is_deeply - cmp_ok - skip todo todo_skip - pass fail - eq_array eq_hash eq_set - $TODO - plan - can_ok isa_ok - diag - ); - -my $Test = Test::Builder->new; -my $Show_Diag = 1; - - -# 5.004's Exporter doesn't have export_to_level. -sub _export_to_level -{ - my $pkg = shift; - my $level = shift; - (undef) = shift; # redundant arg - my $callpkg = caller($level); - $pkg->export($callpkg, @_); -} - - -=head1 NAME - -Test::More - yet another framework for writing test scripts - -=head1 SYNOPSIS - - use Test::More tests => $Num_Tests; - # or - use Test::More qw(no_plan); - # or - use Test::More skip_all => $reason; - - BEGIN { use_ok( 'Some::Module' ); } - require_ok( 'Some::Module' ); - - # Various ways to say "ok" - ok($this eq $that, $test_name); - - is ($this, $that, $test_name); - isnt($this, $that, $test_name); - - # Rather than print STDERR "# here's what went wrong\n" - diag("here's what went wrong"); - - like ($this, qr/that/, $test_name); - unlike($this, qr/that/, $test_name); - - cmp_ok($this, '==', $that, $test_name); - - is_deeply($complex_structure1, $complex_structure2, $test_name); - - SKIP: { - skip $why, $how_many unless $have_some_feature; - - ok( foo(), $test_name ); - is( foo(42), 23, $test_name ); - }; - - TODO: { - local $TODO = $why; - - ok( foo(), $test_name ); - is( foo(42), 23, $test_name ); - }; - - can_ok($module, @methods); - isa_ok($object, $class); - - pass($test_name); - fail($test_name); - - # UNIMPLEMENTED!!! - my @status = Test::More::status; - - # UNIMPLEMENTED!!! - BAIL_OUT($why); - - -=head1 DESCRIPTION - -B If you're just getting started writing tests, have a look at -Test::Simple first. This is a drop in replacement for Test::Simple -which you can switch to once you get the hang of basic testing. - -The purpose of this module is to provide a wide range of testing -utilities. Various ways to say "ok" with better diagnostics, -facilities to skip tests, test future features and compare complicated -data structures. While you can do almost anything with a simple -C function, it doesn't provide good diagnostic output. - - -=head2 I love it when a plan comes together - -Before anything else, you need a testing plan. This basically declares -how many tests your script is going to run to protect against premature -failure. - -The preferred way to do this is to declare a plan when you C. - - use Test::More tests => $Num_Tests; - -There are rare cases when you will not know beforehand how many tests -your script is going to run. In this case, you can declare that you -have no plan. (Try to avoid using this as it weakens your test.) - - use Test::More qw(no_plan); - -B: using no_plan requires a Test::Harness upgrade else it will -think everything has failed. See L) - -In some cases, you'll want to completely skip an entire testing script. - - use Test::More skip_all => $skip_reason; - -Your script will declare a skip with the reason why you skipped and -exit immediately with a zero (success). See L for -details. - -If you want to control what functions Test::More will export, you -have to use the 'import' option. For example, to import everything -but 'fail', you'd do: - - use Test::More tests => 23, import => ['!fail']; - -Alternatively, you can use the plan() function. Useful for when you -have to calculate the number of tests. - - use Test::More; - plan tests => keys %Stuff * 3; - -or for deciding between running the tests at all: - - use Test::More; - if( $^O eq 'MacOS' ) { - plan skip_all => 'Test irrelevant on MacOS'; - } - else { - plan tests => 42; - } - -=cut - -sub plan { - my(@plan) = @_; - - my $idx = 0; - my @cleaned_plan; - while( $idx <= $#plan ) { - my $item = $plan[$idx]; - - if( $item eq 'no_diag' ) { - $Show_Diag = 0; - } - else { - push @cleaned_plan, $item; - } - - $idx++; - } - - $Test->plan(@cleaned_plan); -} - -sub import { - my($class) = shift; - - my $caller = caller; - - $Test->exported_to($caller); - - my $idx = 0; - my @plan; - my @imports; - while( $idx <= $#_ ) { - my $item = $_[$idx]; - - if( $item eq 'import' ) { - push @imports, @{$_[$idx+1]}; - $idx++; - } - else { - push @plan, $item; - } - - $idx++; - } - - plan(@plan); - - __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports); -} - - -=head2 Test names - -By convention, each test is assigned a number in order. This is -largely done automatically for you. However, it's often very useful to -assign a name to each test. Which would you rather see: - - ok 4 - not ok 5 - ok 6 - -or - - ok 4 - basic multi-variable - not ok 5 - simple exponential - ok 6 - force == mass * acceleration - -The later gives you some idea of what failed. It also makes it easier -to find the test in your script, simply search for "simple -exponential". - -All test functions take a name argument. It's optional, but highly -suggested that you use it. - - -=head2 I'm ok, you're not ok. - -The basic purpose of this module is to print out either "ok #" or "not -ok #" depending on if a given test succeeded or failed. Everything -else is just gravy. - -All of the following print "ok" or "not ok" depending on if the test -succeeded or failed. They all also return true or false, -respectively. - -=over 4 - -=item B - - ok($this eq $that, $test_name); - -This simply evaluates any expression (C<$this eq $that> is just a -simple example) and uses that to determine if the test succeeded or -failed. A true expression passes, a false one fails. Very simple. - -For example: - - ok( $exp{9} == 81, 'simple exponential' ); - ok( Film->can('db_Main'), 'set_db()' ); - ok( $p->tests == 4, 'saw tests' ); - ok( !grep !defined $_, @items, 'items populated' ); - -(Mnemonic: "This is ok.") - -$test_name is a very short description of the test that will be printed -out. It makes it very easy to find a test in your script when it fails -and gives others an idea of your intentions. $test_name is optional, -but we B strongly encourage its use. - -Should an ok() fail, it will produce some diagnostics: - - not ok 18 - sufficient mucus - # Failed test 18 (foo.t at line 42) - -This is actually Test::Simple's ok() routine. - -=cut - -sub ok ($;$) { - my($test, $name) = @_; - $Test->ok($test, $name); -} - -=item B - -=item B - - is ( $this, $that, $test_name ); - isnt( $this, $that, $test_name ); - -Similar to ok(), is() and isnt() compare their two arguments -with C and C respectively and use the result of that to -determine if the test succeeded or failed. So these: - - # Is the ultimate answer 42? - is( ultimate_answer(), 42, "Meaning of Life" ); - - # $foo isn't empty - isnt( $foo, '', "Got some foo" ); - -are similar to these: - - ok( ultimate_answer() eq 42, "Meaning of Life" ); - ok( $foo ne '', "Got some foo" ); - -(Mnemonic: "This is that." "This isn't that.") - -So why use these? They produce better diagnostics on failure. ok() -cannot know what you are testing for (beyond the name), but is() and -isnt() know what the test was and why it failed. For example this -test: - - my $foo = 'waffle'; my $bar = 'yarblokos'; - is( $foo, $bar, 'Is foo the same as bar?' ); - -Will produce something like this: - - not ok 17 - Is foo the same as bar? - # Failed test (foo.t at line 139) - # got: 'waffle' - # expected: 'yarblokos' - -So you can figure out what went wrong without rerunning the test. - -You are encouraged to use is() and isnt() over ok() where possible, -however do not be tempted to use them to find out if something is -true or false! - - # XXX BAD! - is( exists $brooklyn{tree}, 1, 'A tree grows in Brooklyn' ); - -This does not check if C is true, it checks if -it returns 1. Very different. Similar caveats exist for false and 0. -In these cases, use ok(). - - ok( exists $brooklyn{tree}, 'A tree grows in Brooklyn' ); - -For those grammatical pedants out there, there's an C -function which is an alias of isnt(). - -=cut - -sub is ($$;$) { - $Test->is_eq(@_); -} - -sub isnt ($$;$) { - $Test->isnt_eq(@_); -} - -*isn't = \&isnt; - - -=item B - - like( $this, qr/that/, $test_name ); - -Similar to ok(), like() matches $this against the regex C. - -So this: - - like($this, qr/that/, 'this is like that'); - -is similar to: - - ok( $this =~ /that/, 'this is like that'); - -(Mnemonic "This is like that".) - -The second argument is a regular expression. It may be given as a -regex reference (i.e. C) or (for better compatibility with older -perls) as a string that looks like a regex (alternative delimiters are -currently not supported): - - like( $this, '/that/', 'this is like that' ); - -Regex options may be placed on the end (C<'/that/i'>). - -Its advantages over ok() are similar to that of is() and isnt(). Better -diagnostics on failure. - -=cut - -sub like ($$;$) { - $Test->like(@_); -} - - -=item B - - unlike( $this, qr/that/, $test_name ); - -Works exactly as like(), only it checks if $this B match the -given pattern. - -=cut - -sub unlike ($$;$) { - $Test->unlike(@_); -} - - -=item B - - cmp_ok( $this, $op, $that, $test_name ); - -Halfway between ok() and is() lies cmp_ok(). This allows you to -compare two arguments using any binary perl operator. - - # ok( $this eq $that ); - cmp_ok( $this, 'eq', $that, 'this eq that' ); - - # ok( $this == $that ); - cmp_ok( $this, '==', $that, 'this == that' ); - - # ok( $this && $that ); - cmp_ok( $this, '&&', $that, 'this && that' ); - ...etc... - -Its advantage over ok() is when the test fails you'll know what $this -and $that were: - - not ok 1 - # Failed test (foo.t at line 12) - # '23' - # && - # undef - -It's also useful in those cases where you are comparing numbers and -is()'s use of C will interfere: - - cmp_ok( $big_hairy_number, '==', $another_big_hairy_number ); - -=cut - -sub cmp_ok($$$;$) { - $Test->cmp_ok(@_); -} - - -=item B - - can_ok($module, @methods); - can_ok($object, @methods); - -Checks to make sure the $module or $object can do these @methods -(works with functions, too). - - can_ok('Foo', qw(this that whatever)); - -is almost exactly like saying: - - ok( Foo->can('this') && - Foo->can('that') && - Foo->can('whatever') - ); - -only without all the typing and with a better interface. Handy for -quickly testing an interface. - -No matter how many @methods you check, a single can_ok() call counts -as one test. If you desire otherwise, use: - - foreach my $meth (@methods) { - can_ok('Foo', $meth); - } - -=cut - -sub can_ok ($@) { - my($proto, @methods) = @_; - my $class = ref $proto || $proto; - - unless( @methods ) { - my $ok = $Test->ok( 0, "$class->can(...)" ); - $Test->diag(' can_ok() called with no methods'); - return $ok; - } - - my @nok = (); - foreach my $method (@methods) { - local($!, $@); # don't interfere with caller's $@ - # eval sometimes resets $! - eval { $proto->can($method) } || push @nok, $method; - } - - my $name; - $name = @methods == 1 ? "$class->can('$methods[0]')" - : "$class->can(...)"; - - my $ok = $Test->ok( !@nok, $name ); - - $Test->diag(map " $class->can('$_') failed\n", @nok); - - return $ok; -} - -=item B - - isa_ok($object, $class, $object_name); - isa_ok($ref, $type, $ref_name); - -Checks to see if the given C<< $object->isa($class) >>. Also checks to make -sure the object was defined in the first place. Handy for this sort -of thing: - - my $obj = Some::Module->new; - isa_ok( $obj, 'Some::Module' ); - -where you'd otherwise have to write - - my $obj = Some::Module->new; - ok( defined $obj && $obj->isa('Some::Module') ); - -to safeguard against your test script blowing up. - -It works on references, too: - - isa_ok( $array_ref, 'ARRAY' ); - -The diagnostics of this test normally just refer to 'the object'. If -you'd like them to be more specific, you can supply an $object_name -(for example 'Test customer'). - -=cut - -sub isa_ok ($$;$) { - my($object, $class, $obj_name) = @_; - - my $diag; - $obj_name = 'The object' unless defined $obj_name; - my $name = "$obj_name isa $class"; - if( !defined $object ) { - $diag = "$obj_name isn't defined"; - } - elsif( !ref $object ) { - $diag = "$obj_name isn't a reference"; - } - else { - # We can't use UNIVERSAL::isa because we want to honor isa() overrides - local($@, $!); # eval sometimes resets $! - my $rslt = eval { $object->isa($class) }; - if( $@ ) { - if( $@ =~ /^Can't call method "isa" on unblessed reference/ ) { - if( !UNIVERSAL::isa($object, $class) ) { - my $ref = ref $object; - $diag = "$obj_name isn't a '$class' it's a '$ref'"; - } - } else { - die <isa on your object and got some weird error. -This should never happen. Please contact the author immediately. -Here's the error. -$@ -WHOA - } - } - elsif( !$rslt ) { - my $ref = ref $object; - $diag = "$obj_name isn't a '$class' it's a '$ref'"; - } - } - - - - my $ok; - if( $diag ) { - $ok = $Test->ok( 0, $name ); - $Test->diag(" $diag\n"); - } - else { - $ok = $Test->ok( 1, $name ); - } - - return $ok; -} - - -=item B - -=item B - - pass($test_name); - fail($test_name); - -Sometimes you just want to say that the tests have passed. Usually -the case is you've got some complicated condition that is difficult to -wedge into an ok(). In this case, you can simply use pass() (to -declare the test ok) or fail (for not ok). They are synonyms for -ok(1) and ok(0). - -Use these very, very, very sparingly. - -=cut - -sub pass (;$) { - $Test->ok(1, @_); -} - -sub fail (;$) { - $Test->ok(0, @_); -} - -=back - -=head2 Diagnostics - -If you pick the right test function, you'll usually get a good idea of -what went wrong when it failed. But sometimes it doesn't work out -that way. So here we have ways for you to write your own diagnostic -messages which are safer than just C. - -=over 4 - -=item B - - diag(@diagnostic_message); - -Prints a diagnostic message which is guaranteed not to interfere with -test output. Like C @diagnostic_message is simply concatinated -together. - -Handy for this sort of thing: - - ok( grep(/foo/, @users), "There's a foo user" ) or - diag("Since there's no foo, check that /etc/bar is set up right"); - -which would produce: - - not ok 42 - There's a foo user - # Failed test (foo.t at line 52) - # Since there's no foo, check that /etc/bar is set up right. - -You might remember C with the mnemonic C. - -All diag()s can be made silent by passing the "no_diag" option to -Test::More. C 1, 'no_diag'>. This is useful -if you have diagnostics for personal testing but then wish to make -them silent for release without commenting out each individual -statement. - -B The exact formatting of the diagnostic output is still -changing, but it is guaranteed that whatever you throw at it it won't -interfere with the test. - -=cut - -sub diag { - return unless $Show_Diag; - $Test->diag(@_); -} - - -=back - -=head2 Module tests - -You usually want to test if the module you're testing loads ok, rather -than just vomiting if its load fails. For such purposes we have -C and C. - -=over 4 - -=item B - - BEGIN { use_ok($module); } - BEGIN { use_ok($module, @imports); } - -These simply use the given $module and test to make sure the load -happened ok. It's recommended that you run use_ok() inside a BEGIN -block so its functions are exported at compile-time and prototypes are -properly honored. - -If @imports are given, they are passed through to the use. So this: - - BEGIN { use_ok('Some::Module', qw(foo bar)) } - -is like doing this: - - use Some::Module qw(foo bar); - -Version numbers can be checked like so: - - # Just like "use Some::Module 1.02" - BEGIN { use_ok('Some::Module', 1.02) } - -Don't try to do this: - - BEGIN { - use_ok('Some::Module'); - - ...some code that depends on the use... - ...happening at compile time... - } - -because the notion of "compile-time" is relative. Instead, you want: - - BEGIN { use_ok('Some::Module') } - BEGIN { ...some code that depends on the use... } - - -=cut - -sub use_ok ($;@) { - my($module, @imports) = @_; - @imports = () unless @imports; - - my($pack,$filename,$line) = caller; - - local($@,$!); # eval sometimes interferes with $! - - if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) { - # probably a version check. Perl needs to see the bare number - # for it to work with non-Exporter based modules. - eval <ok( !$@, "use $module;" ); - - unless( $ok ) { - chomp $@; - $@ =~ s{^BEGIN failed--compilation aborted at .*$} - {BEGIN failed--compilation aborted at $filename line $line.}m; - $Test->diag(< - - require_ok($module); - require_ok($file); - -Like use_ok(), except it requires the $module or $file. - -=cut - -sub require_ok ($) { - my($module) = shift; - - my $pack = caller; - - # Try to deterine if we've been given a module name or file. - # Module names must be barewords, files not. - $module = qq['$module'] unless _is_module_name($module); - - local($!, $@); # eval sometimes interferes with $! - eval <ok( !$@, "require $module;" ); - - unless( $ok ) { - chomp $@; - $Test->diag(<. - -The way Test::More handles this is with a named block. Basically, a -block of tests which can be skipped over or made todo. It's best if I -just show you... - -=over 4 - -=item B - - SKIP: { - skip $why, $how_many if $condition; - - ...normal testing code goes here... - } - -This declares a block of tests that might be skipped, $how_many tests -there are, $why and under what $condition to skip them. An example is -the easiest way to illustrate: - - SKIP: { - eval { require HTML::Lint }; - - skip "HTML::Lint not installed", 2 if $@; - - my $lint = new HTML::Lint; - isa_ok( $lint, "HTML::Lint" ); - - $lint->parse( $html ); - is( $lint->errors, 0, "No errors found in HTML" ); - } - -If the user does not have HTML::Lint installed, the whole block of -code I. Test::More will output special ok's -which Test::Harness interprets as skipped, but passing, tests. - -It's important that $how_many accurately reflects the number of tests -in the SKIP block so the # of tests run will match up with your plan. -If your plan is C $how_many is optional and will default to 1. - -It's perfectly safe to nest SKIP blocks. Each SKIP block must have -the label C, or Test::More can't work its magic. - -You don't skip tests which are failing because there's a bug in your -program, or for which you don't yet have code written. For that you -use TODO. Read on. - -=cut - -#'# -sub skip { - my($why, $how_many) = @_; - - unless( defined $how_many ) { - # $how_many can only be avoided when no_plan is in use. - _carp "skip() needs to know \$how_many tests are in the block" - unless $Test->has_plan eq 'no_plan'; - $how_many = 1; - } - - for( 1..$how_many ) { - $Test->skip($why); - } - - local $^W = 0; - last SKIP; -} - - -=item B - - TODO: { - local $TODO = $why if $condition; - - ...normal testing code goes here... - } - -Declares a block of tests you expect to fail and $why. Perhaps it's -because you haven't fixed a bug or haven't finished a new feature: - - TODO: { - local $TODO = "URI::Geller not finished"; - - my $card = "Eight of clubs"; - is( URI::Geller->your_card, $card, 'Is THIS your card?' ); - - my $spoon; - URI::Geller->bend_spoon; - is( $spoon, 'bent', "Spoon bending, that's original" ); - } - -With a todo block, the tests inside are expected to fail. Test::More -will run the tests normally, but print out special flags indicating -they are "todo". Test::Harness will interpret failures as being ok. -Should anything succeed, it will report it as an unexpected success. -You then know the thing you had todo is done and can remove the -TODO flag. - -The nice part about todo tests, as opposed to simply commenting out a -block of tests, is it's like having a programmatic todo list. You know -how much work is left to be done, you're aware of what bugs there are, -and you'll know immediately when they're fixed. - -Once a todo test starts succeeding, simply move it outside the block. -When the block is empty, delete it. - -B: TODO tests require a Test::Harness upgrade else it will -treat it as a normal failure. See L) - - -=item B - - TODO: { - todo_skip $why, $how_many if $condition; - - ...normal testing code... - } - -With todo tests, it's best to have the tests actually run. That way -you'll know when they start passing. Sometimes this isn't possible. -Often a failing test will cause the whole program to die or hang, even -inside an C with and using C. In these extreme -cases you have no choice but to skip over the broken tests entirely. - -The syntax and behavior is similar to a C except the -tests will be marked as failing but todo. Test::Harness will -interpret them as passing. - -=cut - -sub todo_skip { - my($why, $how_many) = @_; - - unless( defined $how_many ) { - # $how_many can only be avoided when no_plan is in use. - _carp "todo_skip() needs to know \$how_many tests are in the block" - unless $Test->has_plan eq 'no_plan'; - $how_many = 1; - } - - for( 1..$how_many ) { - $Test->todo_skip($why); - } - - local $^W = 0; - last TODO; -} - -=item When do I use SKIP vs. TODO? - -B, use SKIP. -This includes optional modules that aren't installed, running under -an OS that doesn't have some feature (like fork() or symlinks), or maybe -you need an Internet connection and one isn't available. - -B, use TODO. This -is for any code you haven't written yet, or bugs you have yet to fix, -but want to put tests in your testing script (always a good idea). - - -=back - -=head2 Complex data structures - -Not everything is a simple eq check or regex. There are times you -need to see if two data structures are equivalent. For these -instances Test::More provides a handful of useful functions. - -B I'm not quite sure what will happen with filehandles. - -=over 4 - -=item B - - is_deeply( $this, $that, $test_name ); - -Similar to is(), except that if $this and $that are hash or array -references, it does a deep comparison walking each data structure to -see if they are equivalent. If the two structures are different, it -will display the place where they start differing. - -Test::Differences and Test::Deep provide more in-depth functionality -along these lines. - -=back - -=cut - -our (@Data_Stack, %Refs_Seen); -my $DNE = bless [], 'Does::Not::Exist'; -sub is_deeply { - unless( @_ == 2 or @_ == 3 ) { - my $msg = <ok(0); - } - - my($this, $that, $name) = @_; - - my $ok; - if( !ref $this and !ref $that ) { # neither is a reference - $ok = $Test->is_eq($this, $that, $name); - } - elsif( !ref $this xor !ref $that ) { # one's a reference, one isn't - $ok = $Test->ok(0, $name); - $Test->diag( _format_stack({ vals => [ $this, $that ] }) ); - } - else { # both references - local @Data_Stack = (); - if( _deep_check($this, $that) ) { - $ok = $Test->ok(1, $name); - } - else { - $ok = $Test->ok(0, $name); - $Test->diag(_format_stack(@Data_Stack)); - } - } - - return $ok; -} - -sub _format_stack { - my(@Stack) = @_; - - my $var = '$FOO'; - my $did_arrow = 0; - foreach my $entry (@Stack) { - my $type = $entry->{type} || ''; - my $idx = $entry->{'idx'}; - if( $type eq 'HASH' ) { - $var .= "->" unless $did_arrow++; - $var .= "{$idx}"; - } - elsif( $type eq 'ARRAY' ) { - $var .= "->" unless $did_arrow++; - $var .= "[$idx]"; - } - elsif( $type eq 'REF' ) { - $var = "\${$var}"; - } - } - - my @vals = @{$Stack[-1]{vals}}[0,1]; - my @vars = (); - ($vars[0] = $var) =~ s/\$FOO/ \$got/; - ($vars[1] = $var) =~ s/\$FOO/\$expected/; - - my $out = "Structures begin differing at:\n"; - foreach my $idx (0..$#vals) { - my $val = $vals[$idx]; - $vals[$idx] = !defined $val ? 'undef' : - $val eq $DNE ? "Does not exist" : - ref $val ? "$val" : - "'$val'"; - } - - $out .= "$vars[0] = $vals[0]\n"; - $out .= "$vars[1] = $vals[1]\n"; - - $out =~ s/^/ /msg; - return $out; -} - - -sub _type { - my $thing = shift; - - return '' if !ref $thing; - - for my $type (qw(ARRAY HASH REF SCALAR GLOB Regexp)) { - return $type if UNIVERSAL::isa($thing, $type); - } - - return ''; -} - - -=head2 Discouraged comparison functions - -The use of the following functions is discouraged as they are not -actually testing functions and produce no diagnostics to help figure -out what went wrong. They were written before is_deeply() existed -because I couldn't figure out how to display a useful diff of two -arbitrary data structures. - -These functions are usually used inside an ok(). - - ok( eq_array(\@this, \@that) ); - -C can do that better and with diagnostics. - - is_deeply( \@this, \@that ); - -They may be deprecated in future versions. - -=over 4 - -=item B - - my $is_eq = eq_array(\@this, \@that); - -Checks if two arrays are equivalent. This is a deep check, so -multi-level structures are handled correctly. - -=cut - -#'# -sub eq_array { - local @Data_Stack; - _deep_check(@_); -} - -sub _eq_array { - my($a1, $a2) = @_; - - if( grep !_type($_) eq 'ARRAY', $a1, $a2 ) { - warn "eq_array passed a non-array ref"; - return 0; - } - - return 1 if $a1 eq $a2; - - my $ok = 1; - my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2; - for (0..$max) { - my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_]; - my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_]; - - push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [$e1, $e2] }; - $ok = _deep_check($e1,$e2); - pop @Data_Stack if $ok; - - last unless $ok; - } - - return $ok; -} - -sub _deep_check { - my($e1, $e2) = @_; - my $ok = 0; - - # Effectively turn %Refs_Seen into a stack. This avoids picking up - # the same referenced used twice (such as [\$a, \$a]) to be considered - # circular. - local %Refs_Seen = %Refs_Seen; - - { - # Quiet uninitialized value warnings when comparing undefs. - local $^W = 0; - - $Test->_unoverload(\$e1, \$e2); - - # Either they're both references or both not. - my $same_ref = !(!ref $e1 xor !ref $e2); - my $not_ref = (!ref $e1 and !ref $e2); - - if( defined $e1 xor defined $e2 ) { - $ok = 0; - } - elsif ( $e1 == $DNE xor $e2 == $DNE ) { - $ok = 0; - } - elsif ( $same_ref and ($e1 eq $e2) ) { - $ok = 1; - } - elsif ( $not_ref ) { - push @Data_Stack, { type => '', vals => [$e1, $e2] }; - $ok = 0; - } - else { - if( $Refs_Seen{$e1} ) { - return $Refs_Seen{$e1} eq $e2; - } - else { - $Refs_Seen{$e1} = "$e2"; - } - - my $type = _type($e1); - $type = 'DIFFERENT' unless _type($e2) eq $type; - - if( $type eq 'DIFFERENT' ) { - push @Data_Stack, { type => $type, vals => [$e1, $e2] }; - $ok = 0; - } - elsif( $type eq 'ARRAY' ) { - $ok = _eq_array($e1, $e2); - } - elsif( $type eq 'HASH' ) { - $ok = _eq_hash($e1, $e2); - } - elsif( $type eq 'REF' ) { - push @Data_Stack, { type => $type, vals => [$e1, $e2] }; - $ok = _deep_check($$e1, $$e2); - pop @Data_Stack if $ok; - } - elsif( $type eq 'SCALAR' ) { - push @Data_Stack, { type => 'REF', vals => [$e1, $e2] }; - $ok = _deep_check($$e1, $$e2); - pop @Data_Stack if $ok; - } - else { - _whoa(1, "No type in _deep_check"); - } - } - } - - return $ok; -} - - -sub _whoa { - my($check, $desc) = @_; - if( $check ) { - die < - - my $is_eq = eq_hash(\%this, \%that); - -Determines if the two hashes contain the same keys and values. This -is a deep check. - -=cut - -sub eq_hash { - local @Data_Stack; - return _deep_check(@_); -} - -sub _eq_hash { - my($a1, $a2) = @_; - - if( grep !_type($_) eq 'HASH', $a1, $a2 ) { - warn "eq_hash passed a non-hash ref"; - return 0; - } - - return 1 if $a1 eq $a2; - - my $ok = 1; - my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2; - foreach my $k (keys %$bigger) { - my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE; - my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE; - - push @Data_Stack, { type => 'HASH', idx => $k, vals => [$e1, $e2] }; - $ok = _deep_check($e1, $e2); - pop @Data_Stack if $ok; - - last unless $ok; - } - - return $ok; -} - -=item B - - my $is_eq = eq_set(\@this, \@that); - -Similar to eq_array(), except the order of the elements is B -important. This is a deep check, but the irrelevancy of order only -applies to the top level. - - ok( eq_set(\@this, \@that) ); - -Is better written: - - is_deeply( [sort @this], [sort @that] ); - -B By historical accident, this is not a true set comparision. -While the order of elements does not matter, duplicate elements do. - -Test::Deep contains much better set comparison functions. - -=cut - -sub eq_set { - my($a1, $a2) = @_; - return 0 unless @$a1 == @$a2; - - # There's faster ways to do this, but this is easiest. - local $^W = 0; - - # We must make sure that references are treated neutrally. It really - # doesn't matter how we sort them, as long as both arrays are sorted - # with the same algorithm. - # Have to inline the sort routine due to a threading/sort bug. - # See [rt.cpan.org 6782] - return eq_array( - [sort { ref $a ? -1 : ref $b ? 1 : $a cmp $b } @$a1], - [sort { ref $a ? -1 : ref $b ? 1 : $a cmp $b } @$a2] - ); -} - -=back - - -=head2 Extending and Embedding Test::More - -Sometimes the Test::More interface isn't quite enough. Fortunately, -Test::More is built on top of Test::Builder which provides a single, -unified backend for any test library to use. This means two test -libraries which both use Test::Builder B. - -If you simply want to do a little tweaking of how the tests behave, -you can access the underlying Test::Builder object like so: - -=over 4 - -=item B - - my $test_builder = Test::More->builder; - -Returns the Test::Builder object underlying Test::More for you to play -with. - -=cut - -sub builder { - return Test::Builder->new; -} - -=back - - -=head1 EXIT CODES - -If all your tests passed, Test::Builder will exit with zero (which is -normal). If anything failed it will exit with how many failed. If -you run less (or more) tests than you planned, the missing (or extras) -will be considered failures. If no tests were ever run Test::Builder -will throw a warning and exit with 255. If the test died, even after -having successfully completed all its tests, it will still be -considered a failure and will exit with 255. - -So the exit codes are... - - 0 all tests successful - 255 test died - any other number how many failed (including missing or extras) - -If you fail more than 254 tests, it will be reported as 254. - -B This behavior may go away in future versions. - - -=head1 CAVEATS and NOTES - -=over 4 - -=item Backwards compatibility - -Test::More works with Perls as old as 5.004_05. - - -=item Overloaded objects - -String overloaded objects are compared B. This prevents -Test::More from piercing an object's interface allowing better blackbox -testing. So if a function starts returning overloaded objects instead of -bare strings your tests won't notice the difference. This is good. - -However, it does mean that functions like is_deeply() cannot be used to -test the internals of string overloaded objects. In this case I would -suggest Test::Deep which contains more flexible testing functions for -complex data structures. - - -=item Threads - -Test::More will only be aware of threads if "use threads" has been done -I Test::More is loaded. This is ok: - - use threads; - use Test::More; - -This may cause problems: - - use Test::More - use threads; - - -=item Test::Harness upgrade - -no_plan and todo depend on new Test::Harness features and fixes. If -you're going to distribute tests that use no_plan or todo your -end-users will have to upgrade Test::Harness to the latest one on -CPAN. If you avoid no_plan and TODO tests, the stock Test::Harness -will work fine. - -Installing Test::More should also upgrade Test::Harness. - -=back - - -=head1 HISTORY - -This is a case of convergent evolution with Joshua Pritikin's Test -module. I was largely unaware of its existence when I'd first -written my own ok() routines. This module exists because I can't -figure out how to easily wedge test names into Test's interface (along -with a few other problems). - -The goal here is to have a testing utility that's simple to learn, -quick to use and difficult to trip yourself up with while still -providing more flexibility than the existing Test.pm. As such, the -names of the most common routines are kept tiny, special cases and -magic side-effects are kept to a minimum. WYSIWYG. - - -=head1 SEE ALSO - -L if all this confuses you and you just want to write -some tests. You can upgrade to Test::More later (it's forward -compatible). - -L is the old testing module. Its main benefit is that it has -been distributed with Perl since 5.004_05. - -L for details on how your test results are interpreted -by Perl. - -L for more ways to test complex data structures. -And it plays well with Test::More. - -L is like XUnit but more perlish. - -L gives you more powerful complex data structure testing. - -L is XUnit style testing. - -L shows the idea of embedded testing. - -L installs a whole bunch of useful test modules. - - -=head1 AUTHORS - -Michael G Schwern Eschwern@pobox.comE with much inspiration -from Joshua Pritikin's Test module and lots of help from Barrie -Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and -the perl-qa gang. - - -=head1 BUGS - -See F to report and view bugs. - - -=head1 COPYRIGHT - -Copyright 2001, 2002, 2004 by Michael G Schwern Eschwern@pobox.comE. - -This program is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -See F - -=cut - -1; Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Simple.pm =================================================================== RCS file: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Simple.pm diff -N gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Simple.pm --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/Test/Simple.pm 15 Feb 2023 01:38:21 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,236 +0,0 @@ -package Test::Simple; - -use 5.004; - -use strict 'vars'; -our ($VERSION); -$VERSION = '0.60'; -$VERSION = eval $VERSION; # make the alpha version come out as a number - - -use Test::Builder; -my $Test = Test::Builder->new; - -sub import { - my $self = shift; - my $caller = caller; - *{$caller.'::ok'} = \&ok; - - $Test->exported_to($caller); - $Test->plan(@_); -} - - -=head1 NAME - -Test::Simple - Basic utilities for writing tests. - -=head1 SYNOPSIS - - use Test::Simple tests => 1; - - ok( $foo eq $bar, 'foo is bar' ); - - -=head1 DESCRIPTION - -** If you are unfamiliar with testing B first! ** - -This is an extremely simple, extremely basic module for writing tests -suitable for CPAN modules and other pursuits. If you wish to do more -complicated testing, use the Test::More module (a drop-in replacement -for this one). - -The basic unit of Perl testing is the ok. For each thing you want to -test your program will print out an "ok" or "not ok" to indicate pass -or fail. You do this with the ok() function (see below). - -The only other constraint is you must pre-declare how many tests you -plan to run. This is in case something goes horribly wrong during the -test and your test program aborts, or skips a test or whatever. You -do this like so: - - use Test::Simple tests => 23; - -You must have a plan. - - -=over 4 - -=item B - - ok( $foo eq $bar, $name ); - ok( $foo eq $bar ); - -ok() is given an expression (in this case C<$foo eq $bar>). If it's -true, the test passed. If it's false, it didn't. That's about it. - -ok() prints out either "ok" or "not ok" along with a test number (it -keeps track of that for you). - - # This produces "ok 1 - Hell not yet frozen over" (or not ok) - ok( get_temperature($hell) > 0, 'Hell not yet frozen over' ); - -If you provide a $name, that will be printed along with the "ok/not -ok" to make it easier to find your test when if fails (just search for -the name). It also makes it easier for the next guy to understand -what your test is for. It's highly recommended you use test names. - -All tests are run in scalar context. So this: - - ok( @stuff, 'I have some stuff' ); - -will do what you mean (fail if stuff is empty) - -=cut - -sub ok ($;$) { - $Test->ok(@_); -} - - -=back - -Test::Simple will start by printing number of tests run in the form -"1..M" (so "1..5" means you're going to run 5 tests). This strange -format lets Test::Harness know how many tests you plan on running in -case something goes horribly wrong. - -If all your tests passed, Test::Simple will exit with zero (which is -normal). If anything failed it will exit with how many failed. If -you run less (or more) tests than you planned, the missing (or extras) -will be considered failures. If no tests were ever run Test::Simple -will throw a warning and exit with 255. If the test died, even after -having successfully completed all its tests, it will still be -considered a failure and will exit with 255. - -So the exit codes are... - - 0 all tests successful - 255 test died - any other number how many failed (including missing or extras) - -If you fail more than 254 tests, it will be reported as 254. - -This module is by no means trying to be a complete testing system. -It's just to get you started. Once you're off the ground its -recommended you look at L. - - -=head1 EXAMPLE - -Here's an example of a simple .t file for the fictional Film module. - - use Test::Simple tests => 5; - - use Film; # What you're testing. - - my $btaste = Film->new({ Title => 'Bad Taste', - Director => 'Peter Jackson', - Rating => 'R', - NumExplodingSheep => 1 - }); - ok( defined($btaste) && ref $btaste eq 'Film, 'new() works' ); - - ok( $btaste->Title eq 'Bad Taste', 'Title() get' ); - ok( $btaste->Director eq 'Peter Jackson', 'Director() get' ); - ok( $btaste->Rating eq 'R', 'Rating() get' ); - ok( $btaste->NumExplodingSheep == 1, 'NumExplodingSheep() get' ); - -It will produce output like this: - - 1..5 - ok 1 - new() works - ok 2 - Title() get - ok 3 - Director() get - not ok 4 - Rating() get - # Failed test (t/film.t at line 14) - ok 5 - NumExplodingSheep() get - # Looks like you failed 1 tests of 5 - -Indicating the Film::Rating() method is broken. - - -=head1 CAVEATS - -Test::Simple will only report a maximum of 254 failures in its exit -code. If this is a problem, you probably have a huge test script. -Split it into multiple files. (Otherwise blame the Unix folks for -using an unsigned short integer as the exit status). - -Because VMS's exit codes are much, much different than the rest of the -universe, and perl does horrible mangling to them that gets in my way, -it works like this on VMS. - - 0 SS$_NORMAL all tests successful - 4 SS$_ABORT something went wrong - -Unfortunately, I can't differentiate any further. - - -=head1 NOTES - -Test::Simple is B tested all the way back to perl 5.004. - -Test::Simple is thread-safe in perl 5.8.0 and up. - -=head1 HISTORY - -This module was conceived while talking with Tony Bowden in his -kitchen one night about the problems I was having writing some really -complicated feature into the new Testing module. He observed that the -main problem is not dealing with these edge cases but that people hate -to write tests B. What was needed was a dead simple module -that took all the hard work out of testing and was really, really easy -to learn. Paul Johnson simultaneously had this idea (unfortunately, -he wasn't in Tony's kitchen). This is it. - - -=head1 SEE ALSO - -=over 4 - -=item L - -More testing functions! Once you outgrow Test::Simple, look at -Test::More. Test::Simple is 100% forward compatible with Test::More -(i.e. you can just use Test::More instead of Test::Simple in your -programs and things will still work). - -=item L - -The original Perl testing module. - -=item L - -Elaborate unit testing. - -=item L, L - -Embed tests in your code! - -=item L - -Interprets the output of your test program. - -=back - - -=head1 AUTHORS - -Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern -Eschwern@pobox.comE, wardrobe by Calvin Klein. - - -=head1 COPYRIGHT - -Copyright 2001, 2002, 2004 by Michael G Schwern Eschwern@pobox.comE. - -This program is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -See F - -=cut - -1; Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/crc32.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/crc32.c,v diff -u -p -a -u -p -r1.6 crc32.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/crc32.c 15 Feb 2023 01:36:15 -0000 1.6 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/crc32.c 21 Feb 2024 15:47:00 -0000 @@ -98,13 +98,22 @@ # endif #endif +/* If available, use the ARM processor CRC32 instruction. */ +#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8 +# define ARMCRC32 +#endif + /* Local functions. */ local z_crc_t multmodp OF((z_crc_t a, z_crc_t b)); local z_crc_t x2nmodp OF((z_off64_t n, unsigned k)); -/* If available, use the ARM processor CRC32 instruction. */ -#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8 -# define ARMCRC32 +#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) + local z_word_t byte_swap OF((z_word_t word)); +#endif + +#if defined(W) && !defined(ARMCRC32) + local z_crc_t crc_word OF((z_word_t data)); + local z_word_t crc_word_big OF((z_word_t data)); #endif #if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) @@ -645,8 +654,8 @@ unsigned long ZEXPORT crc32_z( len &= 7; /* Do three interleaved CRCs to realize the throughput of one crc32x - instruction per cycle. Each CRC is calcuated on Z_BATCH words. The three - CRCs are combined into a single CRC after each set of batches. */ + instruction per cycle. Each CRC is calculated on Z_BATCH words. The + three CRCs are combined into a single CRC after each set of batches. */ while (num >= 3 * Z_BATCH) { crc1 = 0; crc2 = 0; @@ -1086,7 +1095,7 @@ uLong ZEXPORT crc32_combine( uLong crc2, z_off_t len2) { - return crc32_combine64(crc1, crc2, len2); + return crc32_combine64(crc1, crc2, (z_off64_t)len2); } /* ========================================================================= */ @@ -1103,7 +1112,7 @@ uLong ZEXPORT crc32_combine_gen64( uLong ZEXPORT crc32_combine_gen( z_off_t len2) { - return crc32_combine_gen64(len2); + return crc32_combine_gen64((z_off64_t)len2); } /* ========================================================================= */ Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/deflate.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/deflate.c,v diff -u -p -a -u -p -r1.10 deflate.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/deflate.c 15 Feb 2023 01:36:15 -0000 1.10 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/deflate.c 21 Feb 2024 15:47:00 -0000 @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.12 Copyright 1995-2022 Jean-loup Gailly and Mark Adler "; + " deflate 1.2.13 Copyright 1995-2022 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -87,13 +87,7 @@ local void lm_init OF((deflate_st local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifdef ASMV -# pragma message("Assembler code may have bugs -- use at your own risk") - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif #ifdef ZLIB_DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, @@ -160,7 +154,7 @@ local const config configuration_table[1 * characters, so that a running hash key can be computed from the previous * key instead of complete recalculation each time. */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) +#define UPDATE_HASH(s,h,c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== @@ -191,9 +185,9 @@ local const config configuration_table[1 */ #define CLEAR_HASH(s) \ do { \ - s->head[s->hash_size-1] = NIL; \ + s->head[s->hash_size - 1] = NIL; \ zmemzero((Bytef *)s->head, \ - (unsigned)(s->hash_size-1)*sizeof(*s->head)); \ + (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \ } while (0) /* =========================================================================== @@ -284,6 +278,8 @@ int ZEXPORT deflateInit2_( if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; + if (windowBits < -15) + return Z_STREAM_ERROR; windowBits = -windowBits; } #ifdef GZIP @@ -313,7 +309,7 @@ int ZEXPORT deflateInit2_( s->hash_bits = (uInt)memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + s->hash_shift = ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); @@ -339,11 +335,11 @@ int ZEXPORT deflateInit2_( * sym_buf value to read moves forward three bytes. From that symbol, up to * 31 bits are written to pending_buf. The closest the written pending_buf * bits gets to the next sym_buf symbol to read is just before the last - * code is written. At that time, 31*(n-2) bits have been written, just - * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at - * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 + * code is written. At that time, 31*(n - 2) bits have been written, just + * after 24*(n - 2) bits have been consumed from sym_buf. sym_buf starts at + * 8*n bits into pending_buf. (Note that the symbol buffer fills when n - 1 * symbols are written.) The closest the writing gets to what is unread is - * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and + * then n + 14 bits. Here n is lit_bufsize, which is 16384 by default, and * can range from 128 to 32768. * * Therefore, at a minimum, there are 142 bits of space between what is @@ -673,36 +669,50 @@ int ZEXPORT deflateTune( } /* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. + * For the default windowBits of 15 and memLevel of 8, this function returns a + * close to exact, as well as small, upper bound on the compressed size. This + * is an expansion of ~0.03%, plus a small constant. + * + * For any setting other than those defaults for windowBits and memLevel, one + * of two worst case bounds is returned. This is at most an expansion of ~4% or + * ~13%, plus a small constant. * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. + * Both the 0.03% and 4% derive from the overhead of stored blocks. The first + * one is for stored blocks of 16383 bytes (memLevel == 8), whereas the second + * is for stored blocks of 127 bytes (the worst case memLevel == 1). The + * expansion results from five bytes of header for each stored block. * - * This function could be more sophisticated to provide closer upper bounds for - * every combination of windowBits and memLevel. But even the conservative - * upper bound of about 14% expansion does not seem onerous for output buffer - * allocation. + * The larger expansion of 13% results from a window size less than or equal to + * the symbols buffer size (windowBits <= memLevel + 7). In that case some of + * the data being compressed may have slid out of the sliding window, impeding + * a stored block from being emitted. Then the only choice is a fixed or + * dynamic block, where a fixed block limits the maximum expansion to 9 bits + * per 8-bit byte, plus 10 bits for every block. The smallest block size for + * which this can occur is 255 (memLevel == 2). + * + * Shifts are used to approximate divisions, for speed. */ uLong ZEXPORT deflateBound( z_streamp strm, uLong sourceLen) { deflate_state *s; - uLong complen, wraplen; + uLong fixedlen, storelen, wraplen; - /* conservative upper bound for compressed data */ - complen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + /* upper bound for fixed blocks with 9-bit literals and length 255 + (memLevel == 2, which is the lowest that may not use stored blocks) -- + ~13% overhead plus a small constant */ + fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) + + (sourceLen >> 9) + 4; + + /* upper bound for stored blocks with length 127 (memLevel == 1) -- + ~4% overhead plus a small constant */ + storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) + + (sourceLen >> 11) + 7; - /* if can't get parameters, return conservative bound plus zlib wrapper */ + /* if can't get parameters, return larger bound plus a zlib wrapper */ if (deflateStateCheck(strm)) - return complen + 6; + return (fixedlen > storelen ? fixedlen : storelen) + 6; /* compute wrapper length */ s = strm->state; @@ -739,11 +749,12 @@ uLong ZEXPORT deflateBound( wraplen = 6; } - /* if not default parameters, return conservative bound */ + /* if not default parameters, return one of the conservative bounds */ if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return complen + wraplen; + return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen; - /* default settings: return tight bound for that case */ + /* default settings: return tight bound for that case -- ~0.03% overhead + plus a small constant */ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13 - 6 + wraplen; } @@ -855,7 +866,7 @@ int ZEXPORT deflate ( s->status = BUSY_STATE; if (s->status == INIT_STATE) { /* zlib header */ - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) @@ -1251,11 +1262,6 @@ local void lm_init ( s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif } #ifndef FASTEST @@ -1268,18 +1274,14 @@ local void lm_init ( * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ local uInt longest_match( deflate_state *s, IPos cur_match) { unsigned chain_length = s->max_chain_length;/* max hash chain length */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ + Bytef *scan = s->window + s->strstart; /* current string */ + Bytef *match; /* matched string */ + int len; /* length of current match */ int best_len = (int)s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? @@ -1294,13 +1296,13 @@ local uInt longest_match( /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); + Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + ush scan_start = *(ushf*)scan; + ush scan_end = *(ushf*)(scan + best_len - 1); #else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; - register Byte scan_end = scan[best_len]; + Bytef *strend = s->window + s->strstart + MAX_MATCH; + Byte scan_end1 = scan[best_len - 1]; + Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. @@ -1317,7 +1319,8 @@ local uInt longest_match( */ if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); @@ -1335,43 +1338,44 @@ local uInt longest_match( /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ - if (*(ushf*)(match+best_len-1) != scan_end || + if (*(ushf*)(match + best_len - 1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient + * strstart + 3, + 5, up to strstart + 257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * at strstart + 257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + } while (*(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + /* Here, scan <= window + strstart + 257 */ + Assert(scan <= s->window + (unsigned)(s->window_size - 1), + "wild scan"); if (*scan == *match) scan++; - len = (MAX_MATCH - 1) - (int)(strend-scan); + len = (MAX_MATCH - 1) - (int)(strend - scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; + if (match[best_len] != scan_end || + match[best_len - 1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; - /* The check at best_len-1 can be removed because it will be made + /* The check at best_len - 1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that @@ -1381,7 +1385,7 @@ local uInt longest_match( Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. + * the 256th check will be made at strstart + 258. */ do { } while (*++scan == *++match && *++scan == *++match && @@ -1390,7 +1394,8 @@ local uInt longest_match( *++scan == *++match && *++scan == *++match && scan < strend); - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (unsigned)(s->window_size - 1), + "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; @@ -1402,9 +1407,9 @@ local uInt longest_match( best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); + scan_end = *(ushf*)(scan + best_len - 1); #else - scan_end1 = scan[best_len-1]; + scan_end1 = scan[best_len - 1]; scan_end = scan[best_len]; #endif } @@ -1414,7 +1419,6 @@ local uInt longest_match( if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } -#endif /* ASMV */ #else /* FASTEST */ @@ -1425,17 +1429,18 @@ local uInt longest_match( deflate_state *s, IPos cur_match) { - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH; + Bytef *scan = s->window + s->strstart; /* current string */ + Bytef *match; /* matched string */ + int len; /* length of current match */ + Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "need lookahead"); Assert(cur_match < s->strstart, "no future"); @@ -1445,7 +1450,7 @@ local uInt longest_match( */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - /* The check at best_len-1 can be removed because it will be made + /* The check at best_len - 1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that @@ -1455,7 +1460,7 @@ local uInt longest_match( Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. + * the 256th check will be made at strstart + 258. */ do { } while (*++scan == *++match && *++scan == *++match && @@ -1464,7 +1469,7 @@ local uInt longest_match( *++scan == *++match && *++scan == *++match && scan < strend); - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); @@ -1501,7 +1506,7 @@ local void check_match( z_error("invalid match"); } if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); + fprintf(stderr,"\\[%d,%d]", start - match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } @@ -1547,9 +1552,9 @@ local void fill_window( /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ - if (s->strstart >= wsize+MAX_DIST(s)) { + if (s->strstart >= wsize + MAX_DIST(s)) { - zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); + zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; @@ -1680,7 +1685,7 @@ local void fill_window( * * deflate_stored() is written to minimize the number of times an input byte is * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. + * maximizes the opportunities to have a single copy from next_in to next_out. */ local block_state deflate_stored( deflate_state *s, @@ -1890,7 +1895,7 @@ local block_state deflate_fast( if (s->lookahead == 0) break; /* flush the current block */ } - /* Insert the string window[strstart .. strstart+2] in the + /* Insert the string window[strstart .. strstart + 2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; @@ -1938,7 +1943,7 @@ local block_state deflate_fast( s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); + UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif @@ -1949,7 +1954,7 @@ local block_state deflate_fast( } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } @@ -1993,7 +1998,7 @@ local block_state deflate_slow( if (s->lookahead == 0) break; /* flush the current block */ } - /* Insert the string window[strstart .. strstart+2] in the + /* Insert the string window[strstart .. strstart + 2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; @@ -2035,17 +2040,17 @@ local block_state deflate_slow( uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ - check_match(s, s->strstart-1, s->prev_match, s->prev_length); + check_match(s, s->strstart - 1, s->prev_match, s->prev_length); - _tr_tally_dist(s, s->strstart -1 - s->prev_match, + _tr_tally_dist(s, s->strstart - 1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not + * strstart - 1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ - s->lookahead -= s->prev_length-1; + s->lookahead -= s->prev_length - 1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { @@ -2063,8 +2068,8 @@ local block_state deflate_slow( * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); + Tracevv((stderr,"%c", s->window[s->strstart - 1])); + _tr_tally_lit(s, s->window[s->strstart - 1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } @@ -2082,8 +2087,8 @@ local block_state deflate_slow( } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); + Tracevv((stderr,"%c", s->window[s->strstart - 1])); + _tr_tally_lit(s, s->window[s->strstart - 1], bflush); s->match_available = 0; } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; @@ -2140,7 +2145,8 @@ local block_state deflate_rle( if (s->match_length > s->lookahead) s->match_length = s->lookahead; } - Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (uInt)(s->window_size - 1), + "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ @@ -2155,7 +2161,7 @@ local block_state deflate_rle( } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } @@ -2195,7 +2201,7 @@ local block_state deflate_huff( /* Output a literal byte */ s->match_length = 0; Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/deflate.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/deflate.h,v diff -u -p -a -u -p -r1.9 deflate.h --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/deflate.h 15 Feb 2023 01:36:15 -0000 1.9 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/deflate.h 21 Feb 2024 15:47:00 -0000 @@ -329,8 +329,8 @@ void ZLIB_INTERNAL _tr_stored_block OF(( # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (uch)(length); \ ush dist = (ush)(distance); \ - s->sym_buf[s->sym_next++] = dist; \ - s->sym_buf[s->sym_next++] = dist >> 8; \ + s->sym_buf[s->sym_next++] = (uch)dist; \ + s->sym_buf[s->sym_next++] = (uch)(dist >> 8); \ s->sym_buf[s->sym_next++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/infback.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/infback.c,v diff -u -p -a -u -p -r1.1.1.6 infback.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/infback.c 15 Feb 2023 01:32:40 -0000 1.1.1.6 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/infback.c 21 Feb 2024 15:47:00 -0000 @@ -66,6 +66,7 @@ int ZEXPORT inflateBackInit_( state->window = window; state->wnext = 0; state->whave = 0; + state->sane = 1; return Z_OK; } @@ -605,25 +606,27 @@ int ZEXPORT inflateBack( break; case DONE: - /* inflate stream terminated properly -- write leftover output */ + /* inflate stream terminated properly */ ret = Z_STREAM_END; - if (left < state->wsize) { - if (out(out_desc, state->window, state->wsize - left)) - ret = Z_BUF_ERROR; - } goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; - default: /* can't happen, but makes compilers happy */ + default: + /* can't happen, but makes compilers happy */ ret = Z_STREAM_ERROR; goto inf_leave; } - /* Return unused input */ + /* Write leftover output and return unused input */ inf_leave: + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left) && + ret == Z_STREAM_END) + ret = Z_BUF_ERROR; + } strm->next_in = next; strm->avail_in = have; return ret; Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inflate.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inflate.c,v diff -u -p -a -u -p -r1.5 inflate.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inflate.c 15 Feb 2023 01:36:15 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inflate.c 21 Feb 2024 15:47:00 -0000 @@ -168,6 +168,8 @@ int ZEXPORT inflateReset2( /* extract wrap request from windowBits parameter */ if (windowBits < 0) { + if (windowBits < -15) + return Z_STREAM_ERROR; wrap = 0; windowBits = -windowBits; } @@ -764,8 +766,9 @@ int ZEXPORT inflate( if (copy > have) copy = have; if (copy) { if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; + state->head->extra != Z_NULL && + (len = state->head->extra_len - state->length) < + state->head->extra_max) { zmemcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? state->head->extra_max - len : copy); Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.c,v diff -u -p -a -u -p -r1.1.1.6 inftrees.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.c 15 Feb 2023 01:32:40 -0000 1.1.1.6 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.c 21 Feb 2024 15:47:00 -0000 @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.12 Copyright 1995-2022 Mark Adler "; + " inflate 1.2.13 Copyright 1995-2022 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -62,7 +62,7 @@ int ZLIB_INTERNAL inflate_table( 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 202}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 194, 65}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.h,v diff -u -p -a -u -p -r1.1.1.2 inftrees.h --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.h 25 Mar 2013 20:06:49 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/inftrees.h 21 Feb 2024 15:47:00 -0000 @@ -38,7 +38,7 @@ typedef struct { /* Maximum size of the dynamic table. The maximum number of code structures is 1444, which is the sum of 852 for literal/length codes and 592 for distance codes. These values were found by exhaustive searches using the program - examples/enough.c found in the zlib distribtution. The arguments to that + examples/enough.c found in the zlib distribution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes returns returns 852, and "enough 30 6 15" for distance codes returns 592. Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/trees.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/trees.c,v diff -u -p -a -u -p -r1.9 trees.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/trees.c 15 Feb 2023 01:36:15 -0000 1.9 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/trees.c 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,4 @@ + /* trees.c -- output deflated data using Huffman coding * Copyright (C) 1995-2021 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 @@ -193,7 +194,7 @@ local void send_bits( s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * (16 - bi_valid) bits from value, leaving (width - (16 - bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { @@ -256,7 +257,7 @@ local void tr_static_init() length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { _dist_code[256 + dist++] = (uch)code; } } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); + Assert (dist == 256, "tr_static_init: 256 + dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; @@ -312,7 +313,7 @@ local void tr_static_init() } /* =========================================================================== - * Genererate the file trees.h describing the static trees. + * Generate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef ZLIB_DEBUG @@ -321,7 +322,7 @@ local void tr_static_init() # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) + ((i) % (width) == (width) - 1 ? ",\n" : ", ")) void gen_trees_header() { @@ -458,7 +459,7 @@ local void pqdownheap( while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + smaller(tree, s->heap[j + 1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ @@ -507,7 +508,7 @@ local void gen_bitlen( */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + for (h = s->heap_max + 1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; @@ -518,7 +519,7 @@ local void gen_bitlen( s->bl_count[bits]++; xbits = 0; - if (n >= base) xbits = extra[n-base]; + if (n >= base) xbits = extra[n - base]; f = tree[n].Freq; s->opt_len += (ulg)f * (unsigned)(bits + xbits); if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); @@ -530,10 +531,10 @@ local void gen_bitlen( /* Find the first bit length which could increase: */ do { - bits = max_length-1; + bits = max_length - 1; while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits + 1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] @@ -583,13 +584,13 @@ local void gen_codes ( * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { - code = (code + bl_count[bits-1]) << 1; + code = (code + bl_count[bits - 1]) << 1; next_code[bits] = (ush)code; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ - Assert (code + bl_count[MAX_BITS]-1 == (1<heap_len = 0, s->heap_max = HEAP_SIZE; @@ -652,7 +653,7 @@ local void build_tree( } desc->max_code = max_code; - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + /* The elements heap[heap_len/2 + 1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); @@ -714,10 +715,10 @@ local void scan_tree ( int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ + tree[max_code + 1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; + curlen = nextlen; nextlen = tree[n + 1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { @@ -758,11 +759,11 @@ local void send_tree ( int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ - /* tree[max_code+1].Len = -1; */ /* guard already set */ + /* tree[max_code + 1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; + curlen = nextlen; nextlen = tree[n + 1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { @@ -773,13 +774,13 @@ local void send_tree ( send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count - 3, 2); } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count - 3, 3); } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count - 11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { @@ -807,8 +808,8 @@ local int build_bl_tree( /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + /* opt_len now includes the length of the tree representations, except the + * lengths of the bit lengths codes and the 5 + 5 + 4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format @@ -819,7 +820,7 @@ local int build_bl_tree( if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; + s->opt_len += 3*((ulg)max_blindex + 1) + 5 + 5 + 4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); @@ -843,19 +844,19 @@ local void send_all_trees( Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } @@ -868,7 +869,7 @@ void ZLIB_INTERNAL _tr_stored_block( ulg stored_len, int last) { - send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ + send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */ bi_windup(s); /* align on byte boundary */ put_short(s, (ush)stored_len); put_short(s, (ush)~stored_len); @@ -879,7 +880,7 @@ void ZLIB_INTERNAL _tr_stored_block( s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; s->bits_sent += 2*16; - s->bits_sent += stored_len<<3; + s->bits_sent += stored_len << 3; #endif } @@ -945,14 +946,17 @@ void ZLIB_INTERNAL _tr_flush_block( max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; + opt_lenb = (s->opt_len + 3 + 7) >> 3; + static_lenb = (s->static_len + 3 + 7) >> 3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->sym_next / 3)); - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; +#ifndef FORCE_STATIC + if (static_lenb <= opt_lenb || s->strategy == Z_FIXED) +#endif + opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); @@ -962,7 +966,7 @@ void ZLIB_INTERNAL _tr_flush_block( #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { + if (stored_len + 4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. @@ -973,21 +977,17 @@ void ZLIB_INTERNAL _tr_flush_block( */ _tr_stored_block(s, buf, stored_len, last); -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+last, 3); + } else if (static_lenb == opt_lenb) { + send_bits(s, (STATIC_TREES<<1) + last, 3); compress_block(s, (const ct_data *)static_ltree, (const ct_data *)static_dtree); #ifdef ZLIB_DEBUG s->compressed_len += 3 + s->static_len; #endif } else { - send_bits(s, (DYN_TREES<<1)+last, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); + send_bits(s, (DYN_TREES<<1) + last, 3); + send_all_trees(s, s->l_desc.max_code + 1, s->d_desc.max_code + 1, + max_blindex + 1); compress_block(s, (const ct_data *)s->dyn_ltree, (const ct_data *)s->dyn_dtree); #ifdef ZLIB_DEBUG @@ -1006,8 +1006,8 @@ void ZLIB_INTERNAL _tr_flush_block( s->compressed_len += 7; /* align on byte boundary */ #endif } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*last)); + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len >> 3, + s->compressed_len - 7*last)); } /* =========================================================================== @@ -1019,9 +1019,9 @@ int ZLIB_INTERNAL _tr_tally ( unsigned dist, unsigned lc) { - s->sym_buf[s->sym_next++] = dist; - s->sym_buf[s->sym_next++] = dist >> 8; - s->sym_buf[s->sym_next++] = lc; + s->sym_buf[s->sym_next++] = (uch)dist; + s->sym_buf[s->sym_next++] = (uch)(dist >> 8); + s->sym_buf[s->sym_next++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; @@ -1033,7 +1033,7 @@ int ZLIB_INTERNAL _tr_tally ( (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_ltree[_length_code[lc] + LITERALS + 1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } return (s->sym_next == s->sym_end); @@ -1063,7 +1063,7 @@ local void compress_block( } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ + send_code(s, code + LITERALS + 1, ltree); /* send length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; @@ -1140,7 +1140,7 @@ local unsigned bi_reverse( unsigned code, int len) { - register unsigned res = 0; + unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; @@ -1179,6 +1179,6 @@ local void bi_windup( s->bi_buf = 0; s->bi_valid = 0; #ifdef ZLIB_DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; + s->bits_sent = (s->bits_sent + 7) & ~7; #endif } Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zconf.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zconf.h,v diff -u -p -a -u -p -r1.7 zconf.h --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zconf.h 15 Feb 2023 01:36:15 -0000 1.7 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zconf.h 21 Feb 2024 15:47:00 -0000 @@ -349,6 +349,9 @@ # ifdef FAR # undef FAR # endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ @@ -467,11 +470,18 @@ typedef uLong FAR uLongf; # undef _LARGEFILE64_SOURCE #endif -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif #endif #ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zlib.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zlib.h,v diff -u -p -a -u -p -r1.1.1.6 zlib.h --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zlib.h 15 Feb 2023 01:32:40 -0000 1.1.1.6 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zlib.h 21 Feb 2024 15:47:00 -0000 @@ -1,5 +1,5 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.12, March 11th, 2022 + version 1.2.13, October 13th, 2022 Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.12" -#define ZLIB_VERNUM 0x12c0 +#define ZLIB_VERSION "1.2.13" +#define ZLIB_VERNUM 0x12d0 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 12 +#define ZLIB_VER_REVISION 13 #define ZLIB_VER_SUBREVISION 0 /* @@ -276,7 +276,7 @@ ZEXTERN int ZEXPORT deflate OF((z_stream == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. See deflatePending(), - which can be used if desired to determine whether or not there is more ouput + which can be used if desired to determine whether or not there is more output in that case. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to @@ -660,7 +660,7 @@ ZEXTERN int ZEXPORT deflateGetDictionary to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If deflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. deflateGetDictionary() may return a length less than the window size, even when more than the window size in input has been provided. It may return up @@ -915,7 +915,7 @@ ZEXTERN int ZEXPORT inflateGetDictionary to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If inflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the stream state is inconsistent. @@ -1437,12 +1437,12 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voi In the event that the end of file is reached and only a partial item is available at the end, i.e. the remaining uncompressed data length is not a - multiple of size, then the final partial item is nevetheless read into buf + multiple of size, then the final partial item is nevertheless read into buf and the end-of-file flag is set. The length of the partial item read is not provided, but could be inferred from the result of gztell(). This behavior is the same as the behavior of fread() implementations in common libraries, but it prevents the direct use of gzfread() to read a concurrently written - file, reseting and retrying on end-of-file, when size is not 1. + file, resetting and retrying on end-of-file, when size is not 1. */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); @@ -1913,7 +1913,7 @@ ZEXTERN int ZEXPORT inflateSy ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF((z_streamp)); ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); #if defined(_WIN32) && !defined(Z_SOLO) Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zutil.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zutil.c,v diff -u -p -a -u -p -r1.7 zutil.c --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zutil.c 15 Feb 2023 01:36:16 -0000 1.7 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zutil.c 21 Feb 2024 15:47:00 -0000 @@ -61,9 +61,11 @@ uLong ZEXPORT zlibCompileFlags() #ifdef ZLIB_DEBUG flags += 1 << 8; #endif + /* #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif + */ #ifdef ZLIB_WINAPI flags += 1 << 10; #endif @@ -214,7 +216,7 @@ local ptr_table table[MAX_PTR]; * a protected system like OS/2. Use Microsoft C instead. */ -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { voidpf buf; ulg bsize = (ulg)items*size; @@ -240,7 +242,7 @@ voidpf ZLIB_INTERNAL zcalloc (voidpf opa return buf; } -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { int n; @@ -277,13 +279,13 @@ void ZLIB_INTERNAL zcfree (voidpf opaque # define _hfree hfree #endif -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) { (void)opaque; return _halloc((long)items, size); } -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { (void)opaque; _hfree(ptr); Index: gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zutil.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zutil.h,v diff -u -p -a -u -p -r1.7 zutil.h --- gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zutil.h 15 Feb 2023 01:36:16 -0000 1.7 +++ gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/zlib-src/zutil.h 21 Feb 2024 15:47:00 -0000 @@ -197,6 +197,7 @@ extern z_const char * const z_errmsg[10] (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); #endif /* common defaults */ Index: gnu/usr.bin/perl/cpan/Config-Perl-V/V.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/V.pm,v diff -u -p -a -u -p -r1.5 V.pm --- gnu/usr.bin/perl/cpan/Config-Perl-V/V.pm 15 Feb 2023 01:36:16 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/V.pm 21 Feb 2024 15:47:00 -0000 @@ -6,7 +6,7 @@ use warnings; use Config; use Exporter; use vars qw($VERSION @ISA @EXPORT_OK %EXPORT_TAGS); -$VERSION = "0.33"; +$VERSION = "0.36"; @ISA = qw( Exporter ); @EXPORT_OK = qw( plv2hash summary myconfig signature ); %EXPORT_TAGS = ( @@ -29,6 +29,8 @@ my %BTD = map {( $_ => 0 )} qw( DEBUGGING NO_HASH_SEED NO_MATHOMS + NO_PERL_INTERNAL_RAND_SEED + NO_PERL_RAND_SEED NO_TAINT_SUPPORT PERL_BOOL_AS_CHAR PERL_COPY_ON_WRITE @@ -57,9 +59,11 @@ my %BTD = map {( $_ => 0 )} qw( PERL_PERTURB_KEYS_DISABLED PERL_PERTURB_KEYS_RANDOM PERL_PRESERVE_IVUV + PERL_RC_STACK PERL_RELOCATABLE_INCPUSH PERL_USE_DEVEL PERL_USE_SAFE_PUTENV + PERL_USE_UNSHARED_KEYS_IN_LARGE_HASHES SILENT_NO_TAINT_SUPPORT UNLINK_ALL_VERSIONS USE_ATTRIBUTES_FOR_PERLIO @@ -81,10 +85,13 @@ my %BTD = map {( $_ => 0 )} qw( HAVE_INTERP_INTERN MULTIPLICITY MYMALLOC + NO_HASH_SEED PERL_DEBUG_READONLY_COW PERL_DEBUG_READONLY_OPS PERL_GLOBAL_STRUCT PERL_GLOBAL_STRUCT_PRIVATE + PERL_HASH_NO_SBOX32 + PERL_HASH_USE_SBOX32 PERL_IMPLICIT_CONTEXT PERL_IMPLICIT_SYS PERLIO_LAYERS @@ -263,7 +270,10 @@ sub plv2hash { $config{$k} = $v; } - if (my %kv = ($pv =~ m{\b + my %kv; + if ($pv =~ m{\S,? (?:osvers|archname)=}) { # attr is not the first on the line + # up to and including 5.24, a line could have multiple kv pairs + %kv = ($pv =~ m{\b (\w+) # key \s*= # assign ( '\s*[^']*?\s*' # quoted value @@ -271,17 +281,27 @@ sub plv2hash { | \S+ # unquoted value | \s*\n # empty ) - (?:,?\s+|\s*\n)? # separator (5.8.x reports did not have a ',' - }gx)) { # between every kv pair + (?:,?\s+|\s*\n)? # optional separator (5.8.x reports did + }gx); # not have a ',' between every kv pair) + } + else { + # as of 5.25, each kv pair is listed on its own line + %kv = ($pv =~ m{^ + \s+ + (\w+) # key + \s*=\s* # assign + (.*?) # value + \s*,?\s*$ + }gmx); + } - while (my ($k, $v) = each %kv) { - $k =~ s{\s+$} {}; - $v =~ s{\s*\n\z} {}; - $v =~ s{,$} {}; - $v =~ m{^'(.*)'$} and $v = $1; - $v =~ s{\s+$} {}; - $config{$k} = $v; - } + while (my ($k, $v) = each %kv) { + $k =~ s{\s+$} {}; + $v =~ s{\s*\n\z} {}; + $v =~ s{,$} {}; + $v =~ m{^'(.*)'$} and $v = $1; + $v =~ s{\s+$} {}; + $config{$k} = $v; } my $build = { %empty_build }; @@ -554,7 +574,7 @@ H.Merijn Brand =head1 COPYRIGHT AND LICENSE -Copyright (C) 2009-2020 H.Merijn Brand +Copyright (C) 2009-2023 H.Merijn Brand This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/20_plv56.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/20_plv56.t,v diff -u -p -a -u -p -r1.4 20_plv56.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/20_plv56.t 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/20_plv56.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 100; + my $tests = 106; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -39,7 +39,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "9dc187182be100c1713f210a8c6d9f45"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } __END__ Summary of my perl5 (revision 5.0 version 6 subversion 2) configuration: Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/21_plv58.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/21_plv58.t,v diff -u -p -a -u -p -r1.4 21_plv58.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/21_plv58.t 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/21_plv58.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 100; + my $tests = 106; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -42,7 +42,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "df48dce1adaaf63855d8acd455c51818"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } __END__ Summary of my perl5 (revision 5 version 8 subversion 9) configuration: Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/22_plv510.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/22_plv510.t,v diff -u -p -a -u -p -r1.4 22_plv510.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/22_plv510.t 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/22_plv510.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 99; + my $tests = 105; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -32,7 +32,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "ce0a7871dfddbbed0a6c685c0f52dbf9"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } __END__ Summary of my perl5 (revision 5 version 10 subversion 0) configuration: Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/23_plv512.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/23_plv512.t,v diff -u -p -a -u -p -r1.4 23_plv512.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/23_plv512.t 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/23_plv512.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 101; + my $tests = 107; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -42,7 +42,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "a2c38153cc47d340bc140d0bfe294afb"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } __END__ Summary of my perl5 (revision 5 version 12 subversion 2) configuration: Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/24_plv514.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/24_plv514.t,v diff -u -p -a -u -p -r1.4 24_plv514.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/24_plv514.t 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/24_plv514.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 101; + my $tests = 107; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -43,7 +43,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "778815a670c0c454738aedf0c88930ba"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } __END__ Summary of my perl5 (revision 5 version 14 subversion 2) configuration: Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/25_plv516.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/25_plv516.t,v diff -u -p -a -u -p -r1.4 25_plv516.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/25_plv516.t 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/25_plv516.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 100; + my $tests = 106; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -43,7 +43,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "7b00cf3b306d96fa802892e6ad4b070f"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } __END__ Summary of my perl5 (revision 5 version 16 subversion 3) configuration: Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/25_plv5162.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/25_plv5162.t,v diff -u -p -a -u -p -r1.4 25_plv5162.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/25_plv5162.t 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/25_plv5162.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 158; + my $tests = 164; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -45,7 +45,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "2917ca2a97b6db1ab8fb08798f53c0bb"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [ "/Library/Perl/Updates/ comes before system perl directories", Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/26_plv518.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/26_plv518.t,v diff -u -p -a -u -p -r1.4 26_plv518.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/26_plv518.t 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/26_plv518.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 119; + my $tests = 125; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -43,7 +43,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "8f46b07a7775e6a92347d4cd564b8f03"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/26_plv5182.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/26_plv5182.t,v diff -u -p -a -u -p -r1.4 26_plv5182.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/26_plv5182.t 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/26_plv5182.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 119; + my $tests = 125; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -43,7 +43,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "874325856acfea3dab7e7c944660f398"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5200.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5200.t,v diff -u -p -a -u -p -r1.4 27_plv5200.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5200.t 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5200.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 119; + my $tests = 125; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -46,7 +46,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "3e7b4513cd80c6ef00fcd77e5e16f8b4"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5202.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5202.t,v diff -u -p -a -u -p -r1.3 27_plv5202.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5202.t 30 Dec 2019 02:13:43 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/27_plv5202.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 120; + my $tests = 126; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -46,7 +46,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "9f954ebc2be7b1d7e151ab28dbdf7062"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv5220.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv5220.t,v diff -u -p -a -u -p -r1.3 28_plv5220.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv5220.t 30 Dec 2019 02:13:43 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv5220.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 120; + my $tests = 126; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -46,7 +46,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "ddcc2d51e43bf18f5234ba66529068ef"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv52201w.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv52201w.t,v diff -u -p -a -u -p -r1.3 28_plv52201w.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv52201w.t 30 Dec 2019 02:13:43 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/28_plv52201w.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 120; + my $tests = 126; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -46,7 +46,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "dfb32b8299b66e8bdb2712934f700d94"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/29_plv5235w.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/29_plv5235w.t,v diff -u -p -a -u -p -r1.1.1.2 29_plv5235w.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/29_plv5235w.t 30 Dec 2019 02:10:26 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/29_plv5235w.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 120; + my $tests = 126; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -46,7 +46,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "bccd5d78dfebd48b89faf7f1fe711733"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/30_plv5240.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/30_plv5240.t,v diff -u -p -a -u -p -r1.1.1.2 30_plv5240.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/30_plv5240.t 30 Dec 2019 02:10:26 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/30_plv5240.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 128; + my $tests = 134; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -44,7 +44,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "3dffae79f6d2c74073f0d64646709101"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/31_plv52511.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/31_plv52511.t,v diff -u -p -a -u -p -r1.1.1.2 31_plv52511.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/31_plv52511.t 30 Dec 2019 02:10:26 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/31_plv52511.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 128; + my $tests = 134; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -44,7 +44,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "f0e463400e40ca35b67cec3834b5b9b7"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [ "SMOKEaa9ac6cf00899a6f55881d4ca6c1214215dc83ee" ], "Local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/32_plv5261rc1.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/32_plv5261rc1.t,v diff -u -p -a -u -p -r1.1.1.2 32_plv5261rc1.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/32_plv5261rc1.t 30 Dec 2019 02:10:26 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/32_plv5261rc1.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 128; + my $tests = 134; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -44,7 +44,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "dd710670fec7d2e260414648dcc94e89"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [ "RC1" ], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/33_plv52711r.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/33_plv52711r.t,v diff -u -p -a -u -p -r1.1.1.2 33_plv52711r.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/33_plv52711r.t 30 Dec 2019 02:10:26 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/33_plv52711r.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 128; + my $tests = 134; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -44,7 +44,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "bd9cf7a142ddbb434adea5b08eaefdc8"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [], "Local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/34_plv5280.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/34_plv5280.t,v diff -u -p -a -u -p -r1.1.1.1 34_plv5280.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/34_plv5280.t 30 Dec 2019 02:10:26 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/34_plv5280.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 128; + my $tests = 134; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -43,7 +43,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "4add7fd04b60c2048a46ff47087e6952"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/35_plv52910g.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/35_plv52910g.t,v diff -u -p -a -u -p -r1.1.1.1 35_plv52910g.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/35_plv52910g.t 15 Feb 2023 01:32:48 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/35_plv52910g.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 128; + my $tests = 134; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -43,7 +43,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "8404b533829bd9752df7f662a710f993"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [ "SMOKEdfba4714a9dc4c35123b4df0a5e1721ccb081d97" ], "No local patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/36_plv5300.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/36_plv5300.t,v diff -u -p -a -u -p -r1.1.1.1 36_plv5300.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/36_plv5300.t 15 Feb 2023 01:32:48 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/36_plv5300.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 128; + my $tests = 134; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -44,7 +44,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "b1138522685da4fff74f7b1118128d02"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [ ], "No patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/37_plv53111qm.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/37_plv53111qm.t,v diff -u -p -a -u -p -r1.1.1.1 37_plv53111qm.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/37_plv53111qm.t 15 Feb 2023 01:32:48 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/37_plv53111qm.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 128; + my $tests = 134; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -44,7 +44,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "146e648c6239f623b8a8242fc8b5759f"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [ ], "No patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/38_plv5320tld.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Config-Perl-V/t/38_plv5320tld.t,v diff -u -p -a -u -p -r1.1.1.1 38_plv5320tld.t --- gnu/usr.bin/perl/cpan/Config-Perl-V/t/38_plv5320tld.t 15 Feb 2023 01:32:48 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/38_plv5320tld.t 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; BEGIN { use Test::More; - my $tests = 128; + my $tests = 134; unless ($ENV{PERL_CORE}) { require Test::NoWarnings; Test::NoWarnings->import (); @@ -44,7 +44,11 @@ foreach my $o (sort keys %$opt) { eval { require Digest::MD5; }; my $md5 = $@ ? "0" x 32 : "901df8463a7bda6075bd75539214e75e"; ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); -is ($sig, $md5, "MD5"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } is_deeply ($conf->{build}{patches}, [ ], "No patches"); Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/39_plv5340tqm.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Config-Perl-V/t/39_plv5340tqm.t diff -N gnu/usr.bin/perl/cpan/Config-Perl-V/t/39_plv5340tqm.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/39_plv5340tqm.t 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,181 @@ +#!/pro/bin/perl + +use strict; +use warnings; + +BEGIN { + use Test::More; + my $tests = 134; + unless ($ENV{PERL_CORE}) { + require Test::NoWarnings; + Test::NoWarnings->import (); + $tests++; + } + + plan tests => $tests; + } + +use Config::Perl::V qw( summary ); + +ok (my $conf = Config::Perl::V::plv2hash (), "Read perl -v block"); +ok (exists $conf->{$_}, "Has $_ entry") for qw( build environment config inc ); + +is ($conf->{build}{osname}, $conf->{config}{osname}, "osname"); +is ($conf->{build}{stamp}, "Jun 19 2021 15:51:32", "Build time"); +is ($conf->{config}{version}, "5.34.0", "reconstructed \$Config{version}"); + +my $opt = Config::Perl::V::plv2hash ("")->{build}{options}; +foreach my $o (sort qw( + HAS_TIMES MULTIPLICITY PERLIO_LAYERS PERL_COPY_ON_WRITE + PERL_DONT_CREATE_GVSV PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP + PERL_OP_PARENT PERL_PRESERVE_IVUV USE_THREAD_SAFE_LOCALE + USE_64_BIT_ALL USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES + USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC + USE_LOCALE_TIME USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API USE_QUADMATH + )) { + is ($conf->{build}{options}{$o}, 1, "Runtime option $o set"); + delete $opt->{$o}; + } +foreach my $o (sort keys %$opt) { + is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset"); + } + +eval { require Digest::MD5; }; +my $md5 = $@ ? "0" x 32 : "12cfb15586bf005d29ff4c7ce770aefe"; +ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); +is ($sig, $md5, "MD5"); + +is_deeply ($conf->{build}{patches}, [ ], "No patches"); + +my %check = ( + alignbytes => 16, + api_version => 34, + bincompat5005 => undef, + byteorder => 12345678, + cc => "cc", + cccdlflags => "-fPIC", + ccdlflags => "-Wl,-E -Wl,-rpath,/pro/lib/perl5/5.34.0/x86_64-linux-thread-multi-quadmath/CORE", + config_args => "-Uversiononly -Dinc_version_list=none -Duse64bitall -Dusethreads -Duseithreads -Dusequadmath -Duseshrplib -des", + gccversion => "7.5.0", + gnulibc_version => "2.26", + ivsize => 8, + ivtype => "long", + ld => "cc", + lddlflags => "-shared -O2 -L/pro/local/lib -fstack-protector-strong", + ldflags => "-L/pro/local/lib -fstack-protector-strong", + libc => "libc-2.26.so", + lseektype => "off_t", + osvers => "5.3.18-lp152.78-preempt", + use64bitall => "define", + use64bitint => "define", + usemymalloc => "n", + default_inc_excludes_dot + => "define", + ); +is ($conf->{config}{$_}, $check{$_}, "reconstructed \$Config{$_}") for sort keys %check; + +ok (my $info = summary ($conf), "A summary"); +ok (exists $info->{$_}, "Summary has $_") for qw( cc config_args usemymalloc default_inc_excludes_dot ); +is ($info->{default_inc_excludes_dot}, "define", "This build has . NOT in INC"); + +__END__ +Summary of my perl5 (revision 5 version 34 subversion 0) configuration: + + Platform: + osname=linux + osvers=5.3.18-lp152.78-preempt + archname=x86_64-linux-thread-multi-quadmath + uname='linux pc09 5.3.18-lp152.78-preempt #1 smp preempt tue jun 1 14:53:21 utc 2021 (556d823) x86_64 x86_64 x86_64 gnulinux ' + config_args='-Uversiononly -Dinc_version_list=none -Duse64bitall -Dusethreads -Duseithreads -Dusequadmath -Duseshrplib -des' + hint=recommended + useposix=true + d_sigaction=define + useithreads=define + usemultiplicity=define + use64bitint=define + use64bitall=define + uselongdouble=undef + usemymalloc=n + default_inc_excludes_dot=define + Compiler: + cc='cc' + ccflags ='-D_REENTRANT -D_GNU_SOURCE -fPIC -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2' + optimize='-O2' + cppflags='-D_REENTRANT -D_GNU_SOURCE -fPIC -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include' + ccversion='' + gccversion='7.5.0' + gccosandvers='' + intsize=4 + longsize=8 + ptrsize=8 + doublesize=8 + byteorder=12345678 + doublekind=3 + d_longlong=define + longlongsize=8 + d_longdbl=define + longdblsize=16 + longdblkind=3 + ivtype='long' + ivsize=8 + nvtype='__float128' + nvsize=16 + Off_t='off_t' + lseeksize=8 + alignbytes=16 + prototype=define + Linker and Libraries: + ld='cc' + ldflags ='-L/pro/local/lib -fstack-protector-strong' + libpth=/usr/local/lib /usr/x86_64-suse-linux/lib /usr/lib /pro/local/lib /lib64 /usr/lib64 /lib /usr/local/lib64 + libs=-lpthread -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat -lquadmath + perllibs=-lpthread -ldl -lm -lcrypt -lutil -lc -lquadmath + libc=libc-2.26.so + so=so + useshrplib=true + libperl=libperl.so + gnulibc_version='2.26' + Dynamic Linking: + dlsrc=dl_dlopen.xs + dlext=so + d_dlsymun=undef + ccdlflags='-Wl,-E -Wl,-rpath,/pro/lib/perl5/5.34.0/x86_64-linux-thread-multi-quadmath/CORE' + cccdlflags='-fPIC' + lddlflags='-shared -O2 -L/pro/local/lib -fstack-protector-strong' + + +Characteristics of this binary (from libperl): + Compile-time options: + HAS_TIMES + MULTIPLICITY + PERLIO_LAYERS + PERL_COPY_ON_WRITE + PERL_DONT_CREATE_GVSV + PERL_IMPLICIT_CONTEXT + PERL_MALLOC_WRAP + PERL_OP_PARENT + PERL_PRESERVE_IVUV + USE_64_BIT_ALL + USE_64_BIT_INT + USE_ITHREADS + USE_LARGE_FILES + USE_LOCALE + USE_LOCALE_COLLATE + USE_LOCALE_CTYPE + USE_LOCALE_NUMERIC + USE_LOCALE_TIME + USE_PERLIO + USE_PERL_ATOF + USE_QUADMATH + USE_REENTRANT_API + USE_THREAD_SAFE_LOCALE + Built under linux + Compiled at Jun 19 2021 15:51:32 + %ENV: + PERL6LIB="inst#/pro/3gl/CPAN/rakudo/install" + @INC: + lib + /pro/lib/perl5/site_perl/5.34.0/x86_64-linux-thread-multi-quadmath + /pro/lib/perl5/site_perl/5.34.0 + /pro/lib/perl5/5.34.0/x86_64-linux-thread-multi-quadmath + /pro/lib/perl5/5.34.0 Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/40_plv5358dnqm.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Config-Perl-V/t/40_plv5358dnqm.t diff -N gnu/usr.bin/perl/cpan/Config-Perl-V/t/40_plv5358dnqm.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/40_plv5358dnqm.t 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,176 @@ +#!/pro/bin/perl + +use strict; +use warnings; + +BEGIN { + use Test::More; + my $tests = 134; + unless ($ENV{PERL_CORE}) { + require Test::NoWarnings; + Test::NoWarnings->import (); + $tests++; + } + + plan tests => $tests; + } + +use Config::Perl::V qw( summary ); + +ok (my $conf = Config::Perl::V::plv2hash (), "Read perl -v block"); +ok (exists $conf->{$_}, "Has $_ entry") for qw( build environment config inc ); + +is ($conf->{build}{osname}, $conf->{config}{osname}, "osname"); +is ($conf->{build}{stamp}, "Jan 1 2022 11:18:27", "Build time"); +is ($conf->{config}{version}, "5.35.8", "reconstructed \$Config{version}"); + +my $opt = Config::Perl::V::plv2hash ("")->{build}{options}; +foreach my $o (sort qw( + HAS_TIMES PERLIO_LAYERS PERL_COPY_ON_WRITE PERL_DONT_CREATE_GVSV + PERL_MALLOC_WRAP PERL_OP_PARENT PERL_PRESERVE_IVUV PERL_USE_DEVEL + USE_64_BIT_ALL USE_64_BIT_INT USE_LARGE_FILES USE_LOCALE + USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC + USE_LOCALE_TIME USE_PERLIO USE_PERL_ATOF USE_QUADMATH + )) { + is ($conf->{build}{options}{$o}, 1, "Runtime option $o set"); + delete $opt->{$o}; + } +foreach my $o (sort keys %$opt) { + is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset"); + } + +eval { require Digest::MD5; }; +my $md5 = $@ ? "0" x 32 : "3a52d65d54ee1032f878b51fb20c8efd"; +ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); +is ($sig, $md5, "MD5"); + +is_deeply ($conf->{build}{patches}, [ ], "No patches"); + +my %check = ( + alignbytes => 16, + api_version => 35, + bincompat5005 => undef, + byteorder => 12345678, + cc => "cc", + cccdlflags => "-fPIC", + ccdlflags => "-Wl,-E", + config_args => "-Dusedevel -Duse64bitall -Dusequadmath -Uuseperlio -des", + gccversion => "11.2.1 20211124 [revision 7510c23c1ec53aa4a62705f0384079661342ff7b]", + gnulibc_version => "2.34", + ivsize => 8, + ivtype => "long", + ld => "cc", + lddlflags => "-shared -O2 -L/pro/local/lib -fstack-protector-strong", + ldflags => "-L/pro/local/lib -fstack-protector-strong", + libc => "/lib/../lib64/libc.so.6", + lseektype => "off_t", + osvers => "5.15.8-1-default", + use64bitall => "define", + use64bitint => "define", + usemymalloc => "n", + default_inc_excludes_dot + => "define", + ); +is ($conf->{config}{$_}, $check{$_}, "reconstructed \$Config{$_}") for sort keys %check; + +ok (my $info = summary ($conf), "A summary"); +ok (exists $info->{$_}, "Summary has $_") for qw( cc config_args usemymalloc default_inc_excludes_dot ); +is ($info->{default_inc_excludes_dot}, "define", "This build has . NOT in INC"); + +__END__ +Summary of my perl5 (revision 5 version 35 subversion 8) configuration: + Snapshot of: 0ccfd062e2cfd32efe146d4c16faf3cae9e3cc84 + Platform: + osname=linux + osvers=5.15.8-1-default + archname=x86_64-linux-quadmath + uname='linux lx09 5.15.8-1-default #1 smp wed dec 15 08:12:54 utc 2021 (0530e5c) x86_64 x86_64 x86_64 gnulinux ' + config_args='-Dusedevel -Duse64bitall -Dusequadmath -Uuseperlio -des' + hint=recommended + useposix=true + d_sigaction=define + useithreads=undef + usemultiplicity=undef + use64bitint=define + use64bitall=define + uselongdouble=undef + usemymalloc=n + default_inc_excludes_dot=define + Compiler: + cc='cc' + ccflags ='-pie -fPIE -fPIC -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2' + optimize='-O2' + cppflags='-pie -fPIE -fPIC -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include' + ccversion='' + gccversion='11.2.1 20211124 [revision 7510c23c1ec53aa4a62705f0384079661342ff7b]' + gccosandvers='' + intsize=4 + longsize=8 + ptrsize=8 + doublesize=8 + byteorder=12345678 + doublekind=3 + d_longlong=define + longlongsize=8 + d_longdbl=define + longdblsize=16 + longdblkind=3 + ivtype='long' + ivsize=8 + nvtype='__float128' + nvsize=16 + Off_t='off_t' + lseeksize=8 + alignbytes=16 + prototype=define + Linker and Libraries: + ld='cc' + ldflags ='-L/pro/local/lib -fstack-protector-strong' + libpth=/usr/local/lib /usr/x86_64-suse-linux/lib /usr/lib /data/pro/local/lib /usr/lib64 /usr/local/lib64 + libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat -lquadmath + perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc -lquadmath + libc=/lib/../lib64/libc.so.6 + so=so + useshrplib=false + libperl=libperl.a + gnulibc_version='2.34' + Dynamic Linking: + dlsrc=dl_dlopen.xs + dlext=so + d_dlsymun=undef + ccdlflags='-Wl,-E' + cccdlflags='-fPIC' + lddlflags='-shared -O2 -L/pro/local/lib -fstack-protector-strong' + + +Characteristics of this binary (from libperl): + Compile-time options: + HAS_TIMES + PERLIO_LAYERS + PERL_COPY_ON_WRITE + PERL_DONT_CREATE_GVSV + PERL_MALLOC_WRAP + PERL_OP_PARENT + PERL_PRESERVE_IVUV + PERL_USE_DEVEL + USE_64_BIT_ALL + USE_64_BIT_INT + USE_LARGE_FILES + USE_LOCALE + USE_LOCALE_COLLATE + USE_LOCALE_CTYPE + USE_LOCALE_NUMERIC + USE_LOCALE_TIME + USE_PERLIO + USE_PERL_ATOF + USE_QUADMATH + Built under linux + Compiled at Jan 1 2022 11:18:27 + %ENV: + PERL6LIB="inst#/pro/3gl/CPAN/rakudo/install" + @INC: + lib + /pro/lib/perl5/site_perl/5.35.8/x86_64-linux-quadmath + /pro/lib/perl5/site_perl/5.35.8 + /pro/lib/perl5/5.35.8/x86_64-linux-quadmath + /pro/lib/perl5/5.35.8 Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/41_plv5360dnqm.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Config-Perl-V/t/41_plv5360dnqm.t diff -N gnu/usr.bin/perl/cpan/Config-Perl-V/t/41_plv5360dnqm.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/41_plv5360dnqm.t 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,179 @@ +#!/pro/bin/perl + +use strict; +use warnings; + +BEGIN { + use Test::More; + my $tests = 134; + unless ($ENV{PERL_CORE}) { + require Test::NoWarnings; + Test::NoWarnings->import (); + $tests++; + } + + plan tests => $tests; + } + +use Config::Perl::V qw( summary ); + +ok (my $conf = Config::Perl::V::plv2hash (), "Read perl -v block"); +ok (exists $conf->{$_}, "Has $_ entry") for qw( build environment config inc ); + +is ($conf->{build}{osname}, $conf->{config}{osname}, "osname"); +is ($conf->{build}{stamp}, "Jun 10 2022 14:46:57", "Build time"); +is ($conf->{config}{version}, "5.36.0", "reconstructed \$Config{version}"); + +my $opt = Config::Perl::V::plv2hash ("")->{build}{options}; +foreach my $o (sort qw( + HAS_TIMES MULTIPLICITY PERLIO_LAYERS PERL_COPY_ON_WRITE + PERL_DONT_CREATE_GVSV PERL_MALLOC_WRAP PERL_OP_PARENT + PERL_PRESERVE_IVUV USE_64_BIT_ALL USE_64_BIT_INT USE_ITHREADS + USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE + USE_LOCALE_NUMERIC USE_LOCALE_TIME USE_PERLIO USE_PERL_ATOF + USE_QUADMATH USE_REENTRANT_API USE_THREAD_SAFE_LOCALE + )) { + is ($conf->{build}{options}{$o}, 1, "Runtime option $o set"); + delete $opt->{$o}; + } +foreach my $o (sort keys %$opt) { + is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset"); + } + +eval { require Digest::MD5; }; +my $md5 = $@ ? "0" x 32 : "e8348134908b3d371c277aff6da654b8"; +ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); +is ($sig, $md5, "MD5"); + +is_deeply ($conf->{build}{patches}, [ ], "No patches"); + +my %check = ( + alignbytes => 16, + api_version => 36, + bincompat5005 => undef, + byteorder => 12345678, + cc => "cc", + cccdlflags => "-fPIC", + ccdlflags => "-Wl,-E -Wl,-rpath,/pro/lib/perl5/5.36.0/x86_64-linux-thread-multi-quadmath/CORE", + config_args => "-Uversiononly -Dinc_version_list=none -Duse64bitall -Dusethreads -Duseithreads -Dusequadmath -Duseshrplib -des", + gccversion => "12.1.0", + gnulibc_version => "2.35", + ivsize => 8, + ivtype => "long", + ld => "cc", + lddlflags => "-shared -O2 -L/pro/local/lib -fstack-protector-strong", + ldflags => "-L/pro/local/lib -fstack-protector-strong", + libc => "/lib/../lib64/libc.so.6", + lseektype => "off_t", + osvers => "5.18.1-1-default", + use64bitall => "define", + use64bitint => "define", + usemymalloc => "n", + default_inc_excludes_dot + => "define", + ); +is ($conf->{config}{$_}, $check{$_}, "reconstructed \$Config{$_}") for sort keys %check; + +ok (my $info = summary ($conf), "A summary"); +ok (exists $info->{$_}, "Summary has $_") for qw( cc config_args usemymalloc default_inc_excludes_dot ); +is ($info->{default_inc_excludes_dot}, "define", "This build has . NOT in INC"); + +__END__ +Summary of my perl5 (revision 5 version 36 subversion 0) configuration: + + Platform: + osname=linux + osvers=5.18.1-1-default + archname=x86_64-linux-thread-multi-quadmath + uname='linux lx09 5.18.1-1-default #1 smp preempt_dynamic mon may 30 07:49:01 utc 2022 (d00e88d) x86_64 x86_64 x86_64 gnulinux ' + config_args='-Uversiononly -Dinc_version_list=none -Duse64bitall -Dusethreads -Duseithreads -Dusequadmath -Duseshrplib -des' + hint=recommended + useposix=true + d_sigaction=define + useithreads=define + usemultiplicity=define + use64bitint=define + use64bitall=define + uselongdouble=undef + usemymalloc=n + default_inc_excludes_dot=define + Compiler: + cc='cc' + ccflags ='-D_REENTRANT -D_GNU_SOURCE -pie -fPIE -fPIC -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2' + optimize='-O2' + cppflags='-D_REENTRANT -D_GNU_SOURCE -pie -fPIE -fPIC -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include' + ccversion='' + gccversion='12.1.0' + gccosandvers='' + intsize=4 + longsize=8 + ptrsize=8 + doublesize=8 + byteorder=12345678 + doublekind=3 + d_longlong=define + longlongsize=8 + d_longdbl=define + longdblsize=16 + longdblkind=3 + ivtype='long' + ivsize=8 + nvtype='__float128' + nvsize=16 + Off_t='off_t' + lseeksize=8 + alignbytes=16 + prototype=define + Linker and Libraries: + ld='cc' + ldflags ='-L/pro/local/lib -fstack-protector-strong' + libpth=/usr/local/lib /usr/x86_64-suse-linux/lib /usr/lib /data/pro/local/lib /usr/lib64 /usr/local/lib64 + libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat -lquadmath + perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc -lquadmath + libc=/lib/../lib64/libc.so.6 + so=so + useshrplib=true + libperl=libperl.so + gnulibc_version='2.35' + Dynamic Linking: + dlsrc=dl_dlopen.xs + dlext=so + d_dlsymun=undef + ccdlflags='-Wl,-E -Wl,-rpath,/pro/lib/perl5/5.36.0/x86_64-linux-thread-multi-quadmath/CORE' + cccdlflags='-fPIC' + lddlflags='-shared -O2 -L/pro/local/lib -fstack-protector-strong' + + +Characteristics of this binary (from libperl): + Compile-time options: + HAS_TIMES + MULTIPLICITY + PERLIO_LAYERS + PERL_COPY_ON_WRITE + PERL_DONT_CREATE_GVSV + PERL_MALLOC_WRAP + PERL_OP_PARENT + PERL_PRESERVE_IVUV + USE_64_BIT_ALL + USE_64_BIT_INT + USE_ITHREADS + USE_LARGE_FILES + USE_LOCALE + USE_LOCALE_COLLATE + USE_LOCALE_CTYPE + USE_LOCALE_NUMERIC + USE_LOCALE_TIME + USE_PERLIO + USE_PERL_ATOF + USE_QUADMATH + USE_REENTRANT_API + USE_THREAD_SAFE_LOCALE + Built under linux + Compiled at Jun 10 2022 14:46:57 + %ENV: + PERL6LIB="inst#/pro/3gl/CPAN/rakudo/install" + @INC: + /pro/lib/perl5/site_perl/5.36.0/x86_64-linux-thread-multi-quadmath + /pro/lib/perl5/site_perl/5.36.0 + /pro/lib/perl5/5.36.0/x86_64-linux-thread-multi-quadmath + /pro/lib/perl5/5.36.0 Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/42_plv5373tld.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Config-Perl-V/t/42_plv5373tld.t diff -N gnu/usr.bin/perl/cpan/Config-Perl-V/t/42_plv5373tld.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/42_plv5373tld.t 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,191 @@ +#!/pro/bin/perl + +use strict; +use warnings; + +BEGIN { + use Test::More; + my $tests = 135; + unless ($ENV{PERL_CORE}) { + require Test::NoWarnings; + Test::NoWarnings->import (); + $tests++; + } + + plan tests => $tests; + } + +use Config::Perl::V qw( summary ); + +ok (my $conf = Config::Perl::V::plv2hash (), "Read perl -v block"); +ok (exists $conf->{$_}, "Has $_ entry") for qw( build environment config inc ); + +is ($conf->{build}{osname}, $conf->{config}{osname}, "osname"); +is ($conf->{build}{stamp}, "Aug 21 2022 08:56:37", "Build time"); +is ($conf->{config}{version}, "5.37.3", "reconstructed \$Config{version}"); + +my $opt = Config::Perl::V::plv2hash ("")->{build}{options}; +foreach my $o (sort qw( + DEBUGGING HAS_TIMES MULTIPLICITY PERL_COPY_ON_WRITE + PERL_DONT_CREATE_GVSV PERL_HASH_FUNC_SIPHASH13 PERL_HASH_USE_SBOX32 + PERLIO_LAYERS PERL_MALLOC_WRAP PERL_OP_PARENT PERL_PRESERVE_IVUV + PERL_TRACK_MEMPOOL PERL_USE_DEVEL PERL_USE_SAFE_PUTENV USE_64_BIT_ALL + USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_LOCALE + USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME + USE_LONG_DOUBLE USE_PERL_ATOF USE_PERLIO USE_REENTRANT_API + USE_THREAD_SAFE_LOCALE + )) { + is ($conf->{build}{options}{$o}, 1, "Runtime option $o set"); + delete $opt->{$o}; + } +foreach my $o (sort keys %$opt) { + is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset"); + } + +eval { require Digest::MD5; }; +my $md5 = $@ ? "0" x 32 : "ff4175ca52fccf9c03c33d34af942b0d"; +ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } + +is_deeply ($conf->{build}{patches}, [ ], "No patches"); + +my %check = ( + alignbytes => 16, + api_version => 37, + bincompat5005 => undef, # GONE, chainsawed + byteorder => 12345678, + cc => "cc", + cccdlflags => "-fPIC", + ccdlflags => "-Wl,-E", + config_args => "-Dusedevel -Dusethreads -Duseithreads -Duse64bitall -Duselongdouble -desr -Dusedevel -Uinstallusrbinperl -Dprefix=/media/Tux/perls-t", + gccversion => "12.1.1 20220812 [revision 6b7d570a5001bb79e34c0d1626a8c7f55386dac7]", + gnulibc_version => "2.35", + ivsize => 8, + ivtype => "long", + ld => "cc", + lddlflags => "-shared -O2 -L/pro/local/lib -fstack-protector-strong", + ldflags => "-L/pro/local/lib -fstack-protector-strong", + libc => "/lib/../lib64/libc.so.6", + lseektype => "off_t", + osvers => "5.19.1-1-default", + use64bitall => "define", + use64bitint => "define", + usemymalloc => "n", + default_inc_excludes_dot + => "define", + ); +is ($conf->{config}{$_}, $check{$_}, "reconstructed \$Config{$_}") for sort keys %check; + +ok (my $info = summary ($conf), "A summary"); +ok (exists $info->{$_}, "Summary has $_") for qw( cc config_args usemymalloc default_inc_excludes_dot ); +is ($info->{default_inc_excludes_dot}, "define", "This build has . NOT in INC"); + +__END__ +Summary of my perl5 (revision 5 version 37 subversion 3) configuration: + + Platform: + osname=linux + osvers=5.19.1-1-default + archname=x86_64-linux-thread-multi-ld + uname='linux lx09 5.19.1-1-default #1 smp preempt_dynamic thu aug 11 11:32:52 utc 2022 (a5bf6c0) x86_64 x86_64 x86_64 gnulinux ' + config_args='-Dusedevel -Dusethreads -Duseithreads -Duse64bitall -Duselongdouble -desr -Dusedevel -Uinstallusrbinperl -Dprefix=/media/Tux/perls-t' + hint=recommended + useposix=true + d_sigaction=define + useithreads=define + usemultiplicity=define + use64bitint=define + use64bitall=define + uselongdouble=define + usemymalloc=n + default_inc_excludes_dot=define + Compiler: + cc='cc' + ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2' + optimize='-O2' + cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBUGGING -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include' + ccversion='' + gccversion='12.1.1 20220812 [revision 6b7d570a5001bb79e34c0d1626a8c7f55386dac7]' + gccosandvers='' + intsize=4 + longsize=8 + ptrsize=8 + doublesize=8 + byteorder=12345678 + doublekind=3 + d_longlong=define + longlongsize=8 + d_longdbl=define + longdblsize=16 + longdblkind=3 + ivtype='long' + ivsize=8 + nvtype='long double' + nvsize=16 + Off_t='off_t' + lseeksize=8 + alignbytes=16 + prototype=define + Linker and Libraries: + ld='cc' + ldflags ='-L/pro/local/lib -fstack-protector-strong' + libpth=/usr/local/lib /usr/x86_64-suse-linux/lib /usr/lib /data/pro/local/lib /usr/lib64 /usr/local/lib64 + libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat + perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc + libc=/lib/../lib64/libc.so.6 + so=so + useshrplib=false + libperl=libperl.a + gnulibc_version='2.35' + Dynamic Linking: + dlsrc=dl_dlopen.xs + dlext=so + d_dlsymun=undef + ccdlflags='-Wl,-E' + cccdlflags='-fPIC' + lddlflags='-shared -O2 -L/pro/local/lib -fstack-protector-strong' + + +Characteristics of this binary (from libperl): + Compile-time options: + DEBUGGING + HAS_TIMES + MULTIPLICITY + PERLIO_LAYERS + PERL_COPY_ON_WRITE + PERL_DONT_CREATE_GVSV + PERL_HASH_FUNC_SIPHASH13 + PERL_HASH_USE_SBOX32 + PERL_MALLOC_WRAP + PERL_OP_PARENT + PERL_PRESERVE_IVUV + PERL_TRACK_MEMPOOL + PERL_USE_DEVEL + PERL_USE_SAFE_PUTENV + USE_64_BIT_ALL + USE_64_BIT_INT + USE_ITHREADS + USE_LARGE_FILES + USE_LOCALE + USE_LOCALE_COLLATE + USE_LOCALE_CTYPE + USE_LOCALE_NUMERIC + USE_LOCALE_TIME + USE_LONG_DOUBLE + USE_PERLIO + USE_PERL_ATOF + USE_REENTRANT_API + USE_THREAD_SAFE_LOCALE + Built under linux + Compiled at Aug 21 2022 08:56:37 + %ENV: + PERL6LIB="inst#/pro/3gl/CPAN/rakudo/install" + @INC: + /media/Tux/perls-t/lib/site_perl/5.37.3/x86_64-linux-thread-multi-ld + /media/Tux/perls-t/lib/site_perl/5.37.3 + /media/Tux/perls-t/lib/5.37.3/x86_64-linux-thread-multi-ld + /media/Tux/perls-t/lib/5.37.3 Index: gnu/usr.bin/perl/cpan/Config-Perl-V/t/43_plv53710rcs.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Config-Perl-V/t/43_plv53710rcs.t diff -N gnu/usr.bin/perl/cpan/Config-Perl-V/t/43_plv53710rcs.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Config-Perl-V/t/43_plv53710rcs.t 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,202 @@ +#!/pro/bin/perl + +use strict; +use warnings; + +BEGIN { + use Test::More; + my $tests = 135; + unless ($ENV{PERL_CORE}) { + require Test::NoWarnings; + Test::NoWarnings->import (); + $tests++; + } + + plan tests => $tests; + } + +use Config::Perl::V qw( summary ); + +ok (my $conf = Config::Perl::V::plv2hash (), "Read perl -v block"); +ok (exists $conf->{$_}, "Has $_ entry") for qw( build environment config inc ); + +is ($conf->{build}{osname}, $conf->{config}{osname}, "osname"); +is ($conf->{build}{stamp}, "Feb 28 2023 18:30:03", "Build time"); +is ($conf->{config}{version}, "5.37.10", "reconstructed \$Config{version}"); + +my $opt = Config::Perl::V::plv2hash ("")->{build}{options}; +foreach my $o (sort qw( + DEBUGGING HAS_TIMES MULTIPLICITY PERL_COPY_ON_WRITE PERL_RC_STACK + PERL_DONT_CREATE_GVSV PERL_HASH_FUNC_SIPHASH13 PERL_HASH_USE_SBOX32 + PERLIO_LAYERS PERL_MALLOC_WRAP PERL_OP_PARENT PERL_PRESERVE_IVUV + PERL_TRACK_MEMPOOL PERL_USE_DEVEL PERL_USE_SAFE_PUTENV USE_64_BIT_ALL + USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_LOCALE + USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME + USE_LONG_DOUBLE USE_PERL_ATOF USE_PERLIO USE_REENTRANT_API + USE_THREAD_SAFE_LOCALE + )) { + is ($conf->{build}{options}{$o}, 1, "Runtime option $o set"); + delete $opt->{$o}; + } +foreach my $o (sort keys %$opt) { + is ($conf->{build}{options}{$o}, 0, "Runtime option $o unset"); + } + +eval { require Digest::MD5; }; +my $md5 = $@ ? "0" x 32 : "964776ac5595a8a584dfba7ee063e4b9"; +ok (my $sig = Config::Perl::V::signature ($conf), "Get signature"); + +SKIP: { + ord "A" == 65 or skip "ASCII-centric test", 1; + is ($sig, $md5, "MD5"); + } + +is_deeply ($conf->{build}{patches}, [ "uncommitted-changes" ], "No patches"); + +my %check = ( + alignbytes => 16, + api_version => 37, + bincompat5005 => undef, # GONE, chainsawed + byteorder => 12345678, + cc => "cc", + cccdlflags => "-fPIC", + ccdlflags => "-Wl,-E", + config_args => "-Dusedevel -Duse64bitall -Dusethreads -Duseithreads -Duselongdouble -Doptimize='-O0\\ -g' -Accflags=-DPERL_RC_STACK -des", + gccversion => "12.2.1 20230124 [revision 193f7e62815b4089dfaed4c2bd34fd4f10209e27]", + gnulibc_version => "2.37", + ivsize => 8, + ivtype => "long", + ld => "cc", + lddlflags => "-shared -O0 -g -L/pro/local/lib -fstack-protector-strong", + ldflags => "-L/pro/local/lib -fstack-protector-strong", + libc => "/lib/../lib64/libc.so.6", + lseektype => "off_t", + osvers => "6.1.12-1-default", + use64bitall => "define", + use64bitint => "define", + usemymalloc => "n", + default_inc_excludes_dot + => "define", + ); +is ($conf->{config}{$_}, $check{$_}, "reconstructed \$Config{$_}") for sort keys %check; + +ok (my $info = summary ($conf), "A summary"); +ok (exists $info->{$_}, "Summary has $_") for qw( cc config_args usemymalloc default_inc_excludes_dot ); +is ($info->{default_inc_excludes_dot}, "define", "This build has . NOT in INC"); + +__END__ +Summary of my perl5 (revision 5 version 37 subversion 10) configuration: + Derived from: f0cf813c73daf1ae652b454fc8bc4828aec1f049 + Platform: + osname=linux + osvers=6.1.12-1-default + archname=x86_64-linux-thread-multi-ld + uname='linux lx09 6.1.12-1-default #1 smp preempt_dynamic wed feb 15 05:31:41 utc 2023 (373f017) x86_64 x86_64 x86_64 gnulinux ' + config_args='-Dusedevel -Duse64bitall -Dusethreads -Duseithreads -Duselongdouble -Doptimize='-O0\ -g' -Accflags=-DPERL_RC_STACK -des' + hint=recommended + useposix=true + d_sigaction=define + useithreads=define + usemultiplicity=define + use64bitint=define + use64bitall=define + uselongdouble=define + usemymalloc=n + default_inc_excludes_dot=define + Compiler: + cc='cc' + ccflags ='-D_REENTRANT -D_GNU_SOURCE -pie -fPIE -fPIC -DDEBUGGING -DPERL_RC_STACK -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2' + optimize='-O0 -g' + cppflags='-D_REENTRANT -D_GNU_SOURCE -pie -fPIE -fPIC -DDEBUGGING -DPERL_RC_STACK -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -I/pro/local/include' + ccversion='' + gccversion='12.2.1 20230124 [revision 193f7e62815b4089dfaed4c2bd34fd4f10209e27]' + gccosandvers='' + intsize=4 + longsize=8 + ptrsize=8 + doublesize=8 + byteorder=12345678 + doublekind=3 + d_longlong=define + longlongsize=8 + d_longdbl=define + longdblsize=16 + longdblkind=3 + ivtype='long' + ivsize=8 + nvtype='long double' + nvsize=16 + Off_t='off_t' + lseeksize=8 + alignbytes=16 + prototype=define + Linker and Libraries: + ld='cc' + ldflags ='-L/pro/local/lib -fstack-protector-strong' + libpth=/usr/local/lib /usr/x86_64-suse-linux/lib /usr/lib /data/pro/local/lib /usr/lib64 /usr/local/lib64 + libs=-lpthread -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat + perllibs=-lpthread -ldl -lm -lcrypt -lutil -lc + libc=/lib/../lib64/libc.so.6 + so=so + useshrplib=false + libperl=libperl.a + gnulibc_version='2.37' + Dynamic Linking: + dlsrc=dl_dlopen.xs + dlext=so + d_dlsymun=undef + ccdlflags='-Wl,-E' + cccdlflags='-fPIC' + lddlflags='-shared -O0 -g -L/pro/local/lib -fstack-protector-strong' + + +Characteristics of this binary (from libperl): + Compile-time options: + DEBUGGING + HAS_TIMES + MULTIPLICITY + PERLIO_LAYERS + PERL_COPY_ON_WRITE + PERL_DONT_CREATE_GVSV + PERL_HASH_FUNC_SIPHASH13 + PERL_HASH_USE_SBOX32 + PERL_MALLOC_WRAP + PERL_OP_PARENT + PERL_PRESERVE_IVUV + PERL_RC_STACK + PERL_TRACK_MEMPOOL + PERL_USE_DEVEL + PERL_USE_SAFE_PUTENV + USE_64_BIT_ALL + USE_64_BIT_INT + USE_ITHREADS + USE_LARGE_FILES + USE_LOCALE + USE_LOCALE_COLLATE + USE_LOCALE_CTYPE + USE_LOCALE_NUMERIC + USE_LOCALE_TIME + USE_LONG_DOUBLE + USE_PERLIO + USE_PERL_ATOF + USE_REENTRANT_API + USE_THREAD_SAFE_LOCALE + Locally applied patches: + uncommitted-changes + Built under linux + Compiled at Feb 28 2023 18:30:03 + %ENV: + PERL5LIB="/pro/3gl/CPAN/perl-git/lib" + PERL6LIB="inst#/pro/3gl/CPAN/rakudo/install" + PERL_ARCHLIB="/pro/3gl/CPAN/perl-git" + PERL_CORE="1" + PERL_INC="/pro/3gl/CPAN/perl-git" + PERL_LIB="/pro/3gl/CPAN/perl-git/lib" + PERL_SRC="/pro/3gl/CPAN/perl-git" + @INC: + /pro/3gl/CPAN/perl-git/lib + /pro/3gl/CPAN/perl-git/lib + /pro/lib/perl5/site_perl/5.37.10/x86_64-linux-thread-multi-ld + /pro/lib/perl5/site_perl/5.37.10 + /pro/lib/perl5/5.37.10/x86_64-linux-thread-multi-ld + /pro/lib/perl5/5.37.10 Index: gnu/usr.bin/perl/cpan/DB_File/DB_File.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/DB_File/DB_File.pm,v diff -u -p -a -u -p -r1.6 DB_File.pm --- gnu/usr.bin/perl/cpan/DB_File/DB_File.pm 15 Feb 2023 01:36:16 -0000 1.6 +++ gnu/usr.bin/perl/cpan/DB_File/DB_File.pm 21 Feb 2024 15:47:00 -0000 @@ -165,7 +165,7 @@ use Carp; # Module not thread safe, so don't clone sub CLONE_SKIP { 1 } -$VERSION = "1.857" ; +$VERSION = "1.858" ; $VERSION = eval $VERSION; # needed for dev releases { @@ -2331,23 +2331,9 @@ same terms as Perl itself. Although B is covered by the Perl license, the library it makes use of, namely Berkeley DB, is not. Berkeley DB has its own -copyright and its own license. Please take the time to read it. - -Here are a few words taken from the Berkeley DB FAQ (at -L) regarding the license: - - Do I have to license DB to use it in Perl scripts? - - No. The Berkeley DB license requires that software that uses - Berkeley DB be freely redistributable. In the case of Perl, that - software is Perl, and not your scripts. Any Perl scripts that you - write are your property, including scripts that make use of - Berkeley DB. Neither the Perl license nor the Berkeley DB license - place any restriction on what you may do with them. - -If you are in any doubt about the license situation, contact either the -Berkeley DB authors or the author of DB_File. See L<"AUTHOR"> for details. - +copyright and its own license. +See L for more details. +Please take the time to read the Berkeley DB license and decide how it impacts your use of this Perl module. =head1 SEE ALSO Index: gnu/usr.bin/perl/cpan/Digest-MD5/MD5.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Digest-MD5/MD5.pm,v diff -u -p -a -u -p -r1.5 MD5.pm --- gnu/usr.bin/perl/cpan/Digest-MD5/MD5.pm 15 Feb 2023 01:36:16 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Digest-MD5/MD5.pm 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,7 @@ package Digest::MD5; use strict; use warnings; -our $VERSION = '2.58'; +our $VERSION = '2.58_01'; require Exporter; *import = \&Exporter::import; Index: gnu/usr.bin/perl/cpan/Digest-MD5/MD5.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Digest-MD5/MD5.xs,v diff -u -p -a -u -p -r1.23 MD5.xs --- gnu/usr.bin/perl/cpan/Digest-MD5/MD5.xs 15 Feb 2023 01:38:21 -0000 1.23 +++ gnu/usr.bin/perl/cpan/Digest-MD5/MD5.xs 21 Feb 2024 15:47:00 -0000 @@ -32,18 +32,12 @@ * documentation and/or software. */ -#ifdef __cplusplus -extern "C" { -#endif #define PERL_NO_GET_CONTEXT /* we want efficiency */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #include -#ifdef __cplusplus -} -#endif #ifndef PERL_UNUSED_VAR # define PERL_UNUSED_VAR(x) ((void)x) Index: gnu/usr.bin/perl/cpan/Digest-MD5/t/files.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Digest-MD5/t/files.t,v diff -u -p -a -u -p -r1.22 files.t --- gnu/usr.bin/perl/cpan/Digest-MD5/t/files.t 15 Feb 2023 01:38:21 -0000 1.22 +++ gnu/usr.bin/perl/cpan/Digest-MD5/t/files.t 21 Feb 2024 15:47:00 -0000 @@ -22,7 +22,7 @@ EOT # This is the output of: 'md5sum README MD5.xs rfc1321.txt' $EXPECT = <: =head1 AUTHOR -Copyright (C) 2003-2018 Mark Shelor . +Copyright (C) 2003-2023 Mark Shelor . =head1 SEE ALSO @@ -107,7 +107,7 @@ I is implemented using the Perl END_OF_POD -my $VERSION = "6.02"; +my $VERSION = "6.04"; sub usage { my($err, $msg) = @_; Index: gnu/usr.bin/perl/cpan/Digest-SHA/lib/Digest/SHA.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Digest-SHA/lib/Digest/SHA.pm,v diff -u -p -a -u -p -r1.5 SHA.pm --- gnu/usr.bin/perl/cpan/Digest-SHA/lib/Digest/SHA.pm 30 Dec 2019 02:13:43 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Digest-SHA/lib/Digest/SHA.pm 21 Feb 2024 15:47:01 -0000 @@ -6,9 +6,10 @@ use strict; use warnings; use vars qw($VERSION @ISA @EXPORT_OK $errmsg); use Fcntl qw(O_RDONLY O_RDWR); +use Cwd qw(getcwd); use integer; -$VERSION = '6.02'; +$VERSION = '6.04'; require Exporter; @ISA = qw(Exporter); @@ -120,9 +121,18 @@ sub addfile { ## by attempting to open with mode O_RDWR local *FH; - $file eq '-' and open(FH, '< -') - or sysopen(FH, $file, -d $file ? O_RDWR : O_RDONLY) + if ($file eq '-') { + if (-d STDIN) { + sysopen(FH, getcwd(), O_RDWR) + or _bail('Open failed'); + } + open(FH, '< -') + or _bail('Open failed'); + } + else { + sysopen(FH, $file, -d $file ? O_RDWR : O_RDONLY) or _bail('Open failed'); + } if ($BITS) { my ($n, $buf) = (0, ""); @@ -810,7 +820,7 @@ darkness and moored it in so perfect a c =head1 COPYRIGHT AND LICENSE -Copyright (C) 2003-2018 Mark Shelor +Copyright (C) 2003-2022 Mark Shelor This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.c,v diff -u -p -a -u -p -r1.4 sha.c --- gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.c 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.c 21 Feb 2024 15:47:01 -0000 @@ -3,10 +3,10 @@ * * Ref: NIST FIPS PUB 180-4 Secure Hash Standard * - * Copyright (C) 2003-2018 Mark Shelor, All Rights Reserved + * Copyright (C) 2003-2023 Mark Shelor, All Rights Reserved * - * Version: 6.02 - * Fri Apr 20 16:25:30 MST 2018 + * Version: 6.04 + * Sat Feb 25 12:00:50 PM MST 2023 * */ @@ -279,14 +279,11 @@ static UCHR *statecpy(SHA *s, UCHR *buf) return(buf); } -#define SHA_INIT(s, algo, transform) \ +#define SHA_INIT(s, algo, transform, state, state_t) \ do { \ Zero(s, 1, SHA); \ s->alg = algo; s->sha = sha ## transform; \ - if (s->alg <= SHA256) \ - Copy(H0 ## algo, s->H32, 8, SHA32); \ - else \ - Copy(H0 ## algo, s->H64, 8, SHA64); \ + Copy(H0 ## algo, s->state, 8, state_t); \ s->blocksize = SHA ## algo ## _BLOCK_BITS; \ s->digestlen = SHA ## algo ## _DIGEST_BITS >> 3; \ } while (0) @@ -294,13 +291,13 @@ static UCHR *statecpy(SHA *s, UCHR *buf) /* sharewind: resets digest object */ static void sharewind(SHA *s) { - if (s->alg == SHA1) SHA_INIT(s, 1, 1); - else if (s->alg == SHA224) SHA_INIT(s, 224, 256); - else if (s->alg == SHA256) SHA_INIT(s, 256, 256); - else if (s->alg == SHA384) SHA_INIT(s, 384, 512); - else if (s->alg == SHA512) SHA_INIT(s, 512, 512); - else if (s->alg == SHA512224) SHA_INIT(s, 512224, 512); - else if (s->alg == SHA512256) SHA_INIT(s, 512256, 512); + if (s->alg == SHA1) SHA_INIT(s, 1, 1, H32, SHA32); + else if (s->alg == SHA224) SHA_INIT(s, 224, 256, H32, SHA32); + else if (s->alg == SHA256) SHA_INIT(s, 256, 256, H32, SHA32); + else if (s->alg == SHA384) SHA_INIT(s, 384, 512, H64, SHA64); + else if (s->alg == SHA512) SHA_INIT(s, 512, 512, H64, SHA64); + else if (s->alg == SHA512224) SHA_INIT(s, 512224, 512, H64, SHA64); + else if (s->alg == SHA512256) SHA_INIT(s, 512256, 512, H64, SHA64); } /* shainit: initializes digest object */ Index: gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.h,v diff -u -p -a -u -p -r1.4 sha.h --- gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.h 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.h 21 Feb 2024 15:47:01 -0000 @@ -3,10 +3,10 @@ * * Ref: NIST FIPS PUB 180-4 Secure Hash Standard * - * Copyright (C) 2003-2018 Mark Shelor, All Rights Reserved + * Copyright (C) 2003-2023 Mark Shelor, All Rights Reserved * - * Version: 6.02 - * Fri Apr 20 16:25:30 MST 2018 + * Version: 6.04 + * Sat Feb 25 12:00:50 PM MST 2023 * */ Index: gnu/usr.bin/perl/cpan/Digest-SHA/src/sha64bit.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Digest-SHA/src/sha64bit.c,v diff -u -p -a -u -p -r1.4 sha64bit.c --- gnu/usr.bin/perl/cpan/Digest-SHA/src/sha64bit.c 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Digest-SHA/src/sha64bit.c 21 Feb 2024 15:47:01 -0000 @@ -3,10 +3,10 @@ * * Ref: NIST FIPS PUB 180-4 Secure Hash Standard * - * Copyright (C) 2003-2018 Mark Shelor, All Rights Reserved + * Copyright (C) 2003-2023 Mark Shelor, All Rights Reserved * - * Version: 6.02 - * Fri Apr 20 16:25:30 MST 2018 + * Version: 6.04 + * Sat Feb 25 12:00:50 PM MST 2023 * */ Index: gnu/usr.bin/perl/cpan/Digest-SHA/src/sha64bit.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Digest-SHA/src/sha64bit.h,v diff -u -p -a -u -p -r1.4 sha64bit.h --- gnu/usr.bin/perl/cpan/Digest-SHA/src/sha64bit.h 30 Dec 2019 02:13:43 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Digest-SHA/src/sha64bit.h 21 Feb 2024 15:47:01 -0000 @@ -3,10 +3,10 @@ * * Ref: NIST FIPS PUB 180-4 Secure Hash Standard * - * Copyright (C) 2003-2018 Mark Shelor, All Rights Reserved + * Copyright (C) 2003-2023 Mark Shelor, All Rights Reserved * - * Version: 6.02 - * Fri Apr 20 16:25:30 MST 2018 + * Version: 6.04 + * Sat Feb 25 12:00:50 PM MST 2023 * * The following macros supply placeholder values that enable the * sha.c module to successfully compile when 64-bit integer types Index: gnu/usr.bin/perl/cpan/Encode/Encode.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/Encode.pm,v diff -u -p -a -u -p -r1.12 Encode.pm --- gnu/usr.bin/perl/cpan/Encode/Encode.pm 15 Feb 2023 01:36:16 -0000 1.12 +++ gnu/usr.bin/perl/cpan/Encode/Encode.pm 21 Feb 2024 15:47:00 -0000 @@ -1,5 +1,5 @@ # -# $Id: Encode.pm,v 3.17 2022/04/07 03:05:51 dankogai Exp $ +# $Id: Encode.pm,v 3.19 2022/08/04 04:42:30 dankogai Exp $ # package Encode; use strict; @@ -7,7 +7,7 @@ use warnings; use constant DEBUG => !!$ENV{PERL_ENCODE_DEBUG}; our $VERSION; BEGIN { - $VERSION = sprintf "%d.%02d", q$Revision: 3.17 $ =~ /(\d+)/g; + $VERSION = sprintf "%d.%02d", q$Revision: 3.19 $ =~ /(\d+)/g; require XSLoader; XSLoader::load( __PACKAGE__, $VERSION ); } Index: gnu/usr.bin/perl/cpan/Encode/Makefile.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/Makefile.PL,v diff -u -p -a -u -p -r1.7 Makefile.PL --- gnu/usr.bin/perl/cpan/Encode/Makefile.PL 15 Feb 2023 01:36:16 -0000 1.7 +++ gnu/usr.bin/perl/cpan/Encode/Makefile.PL 21 Feb 2024 15:47:00 -0000 @@ -1,5 +1,5 @@ # -# $Id: Makefile.PL,v 2.24 2021/10/13 08:29:13 dankogai Exp $ +# $Id: Makefile.PL,v 2.25 2022/06/25 01:58:57 dankogai Exp $ # use 5.007003; use strict; @@ -17,6 +17,8 @@ $ENV{PERL_CORE} ||= $ARGV{PERL_CORE} if my $ccflags = $Config{ccflags}; if (!$ENV{PERL_CORE}) { if (my $gccver = $Config{gccversion}) { + # no more 'Argument "Apple" isn't numeric in addition (+)' + no warnings 'numeric'; $gccver =~ s/\.//g; $gccver =~ s/ .*//; $gccver .= "0" while length $gccver < 3; $gccver = 0+$gccver; Index: gnu/usr.bin/perl/cpan/Encode/lib/Encode/Alias.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/lib/Encode/Alias.pm,v diff -u -p -a -u -p -r1.8 Alias.pm --- gnu/usr.bin/perl/cpan/Encode/lib/Encode/Alias.pm 13 Feb 2019 21:15:10 -0000 1.8 +++ gnu/usr.bin/perl/cpan/Encode/lib/Encode/Alias.pm 21 Feb 2024 15:47:00 -0000 @@ -1,7 +1,7 @@ package Encode::Alias; use strict; use warnings; -our $VERSION = do { my @r = ( q$Revision: 2.24 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; +our $VERSION = do { my @r = ( q$Revision: 2.25 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; use constant DEBUG => !!$ENV{PERL_ENCODE_DEBUG}; use Exporter 'import'; @@ -161,6 +161,10 @@ sub init_aliases { # Allow variants of iso-8859-1 etc. define_alias( qr/\biso[-_]?(\d+)[-_](\d+)$/i => '"iso-$1-$2"' ); + + # ISO-8859-8-I => ISO-8859-8 + # https://en.wikipedia.org/wiki/ISO-8859-8-I + define_alias( qr/\biso[-_]8859[-_]8[-_]I$/i => '"iso-8859-8"' ); # At least HP-UX has these. define_alias( qr/\biso8859(\d+)$/i => '"iso-8859-$1"' ); Index: gnu/usr.bin/perl/cpan/Encode/lib/Encode/MIME/Header.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/lib/Encode/MIME/Header.pm,v diff -u -p -a -u -p -r1.6 Header.pm --- gnu/usr.bin/perl/cpan/Encode/lib/Encode/MIME/Header.pm 13 Feb 2019 21:15:10 -0000 1.6 +++ gnu/usr.bin/perl/cpan/Encode/lib/Encode/MIME/Header.pm 21 Feb 2024 15:47:00 -0000 @@ -2,7 +2,7 @@ package Encode::MIME::Header; use strict; use warnings; -our $VERSION = do { my @r = ( q$Revision: 2.28 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; +our $VERSION = do { my @r = ( q$Revision: 2.29 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; use Carp (); use Encode (); @@ -55,7 +55,7 @@ my $re_capture_encoded_word_split = qr/= # in strict mode check also for valid base64 characters and also for valid quoted printable codes my $re_encoding_strict_b = qr/[Bb]/; my $re_encoding_strict_q = qr/[Qq]/; -my $re_encoded_text_strict_b = qr/[0-9A-Za-z\+\/]*={0,2}/; +my $re_encoded_text_strict_b = qr/(?:[0-9A-Za-z\+\/]{4})*(?:[0-9A-Za-z\+\/]{2}==|[0-9A-Za-z\+\/]{3}=|)/; my $re_encoded_text_strict_q = qr/(?:[\x21-\x3C\x3E\x40-\x7E]|=[0-9A-Fa-f]{2})*/; # NOTE: first part are printable US-ASCII except ?, =, SPACE and TAB my $re_encoded_word_strict = qr/=\?$re_charset(?:\*$re_language)?\?(?:$re_encoding_strict_b\?$re_encoded_text_strict_b|$re_encoding_strict_q\?$re_encoded_text_strict_q)\?=/; my $re_capture_encoded_word_strict = qr/=\?($re_charset)((?:\*$re_language)?)\?($re_encoding_strict_b\?$re_encoded_text_strict_b|$re_encoding_strict_q\?$re_encoded_text_strict_q)\?=/; @@ -93,6 +93,10 @@ sub decode($$;$) { my $sep = defined $2 ? $2 : ''; $stop = 1 unless length($line) or length($sep); + + # in non strict mode append missing '=' padding characters for b words + # fixes below concatenation of consecutive encoded mime words + 1 while not $STRICT_DECODE and $line =~ s/(=\?$re_charset(?:\*$re_language)?\?[Bb]\?)((?:[^\?]{4})*[^\?]{1,3})(\?=)/$1.$2.('='x(4-length($2)%4)).$3/se; # NOTE: this code partially could break $chk support # in non strict mode concat consecutive encoded mime words with same charset, language and encoding Index: gnu/usr.bin/perl/cpan/Encode/t/Aliases.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/t/Aliases.t,v diff -u -p -a -u -p -r1.3 Aliases.t --- gnu/usr.bin/perl/cpan/Encode/t/Aliases.t 13 Feb 2019 21:15:10 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Encode/t/Aliases.t 21 Feb 2024 15:47:00 -0000 @@ -42,6 +42,7 @@ sub init_a2c{ 'arabic' => 'iso-8859-6', 'greek' => 'iso-8859-7', 'hebrew' => 'iso-8859-8', + 'iso-8859-8-I' => 'iso-8859-8', 'thai' => 'iso-8859-11', 'tis620' => 'iso-8859-11', 'tis-620' => 'iso-8859-11', Index: gnu/usr.bin/perl/cpan/Encode/t/Unicode_trailing_nul.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/t/Unicode_trailing_nul.t,v diff -u -p -a -u -p -r1.1.1.1 Unicode_trailing_nul.t --- gnu/usr.bin/perl/cpan/Encode/t/Unicode_trailing_nul.t 15 Feb 2023 01:32:37 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Encode/t/Unicode_trailing_nul.t 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,9 @@ +BEGIN { + if ( $] < 5.009 ) { + print "1..0 # Skip: Perl <= 5.9 or later required\n"; + exit 0; + } +} use strict; use Test::More; Index: gnu/usr.bin/perl/cpan/Encode/t/enc_data.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/t/enc_data.t,v diff -u -p -a -u -p -r1.5 enc_data.t --- gnu/usr.bin/perl/cpan/Encode/t/enc_data.t 15 Feb 2023 01:36:16 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Encode/t/enc_data.t 21 Feb 2024 15:47:00 -0000 @@ -1,4 +1,4 @@ -# $Id: enc_data.t,v 2.6 2022/04/07 03:06:40 dankogai Exp dankogai $ +# $Id: enc_data.t,v 2.6 2022/04/07 03:06:40 dankogai Exp $ BEGIN { require Config; import Config; Index: gnu/usr.bin/perl/cpan/Encode/t/enc_module.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/t/enc_module.t,v diff -u -p -a -u -p -r1.5 enc_module.t --- gnu/usr.bin/perl/cpan/Encode/t/enc_module.t 15 Feb 2023 01:36:16 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Encode/t/enc_module.t 21 Feb 2024 15:47:00 -0000 @@ -1,4 +1,4 @@ -# $Id: enc_module.t,v 2.6 2022/04/07 03:06:40 dankogai Exp dankogai $ +# $Id: enc_module.t,v 2.6 2022/04/07 03:06:40 dankogai Exp $ # This file is in euc-jp BEGIN { require Config; import Config; Index: gnu/usr.bin/perl/cpan/Encode/t/jperl.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/t/jperl.t,v diff -u -p -a -u -p -r1.5 jperl.t --- gnu/usr.bin/perl/cpan/Encode/t/jperl.t 15 Feb 2023 01:36:16 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Encode/t/jperl.t 21 Feb 2024 15:47:00 -0000 @@ -1,5 +1,5 @@ # -# $Id: jperl.t,v 2.6 2022/04/07 03:06:40 dankogai Exp dankogai $ +# $Id: jperl.t,v 2.6 2022/04/07 03:06:40 dankogai Exp $ # # This script is written in euc-jp Index: gnu/usr.bin/perl/cpan/Encode/t/mime-header.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/t/mime-header.t,v diff -u -p -a -u -p -r1.6 mime-header.t --- gnu/usr.bin/perl/cpan/Encode/t/mime-header.t 13 Feb 2019 21:15:10 -0000 1.6 +++ gnu/usr.bin/perl/cpan/Encode/t/mime-header.t 21 Feb 2024 15:47:00 -0000 @@ -1,5 +1,5 @@ # -# $Id: mime-header.t,v 2.15 2017/07/18 07:15:29 dankogai Exp $ +# $Id: mime-header.t,v 2.16 2022/06/25 01:58:57 dankogai Exp $ # This script is written in utf8 # BEGIN { @@ -24,7 +24,7 @@ use strict; use utf8; use charnames ":full"; -use Test::More tests => 266; +use Test::More tests => 274; BEGIN { use_ok("Encode::MIME::Header"); @@ -138,6 +138,11 @@ my @decode_default_tests = ( "=?utf-8-strict?Q?=C3=A1=f9=80=80=80=80?=" => "á�", # allow non-ASCII characters in q word "=?UTF-8?Q?\x{C3}\x{A1}?=" => "á", + # allow missing padding characters '=' in b word + "=?UTF-8?B?JQ?=" => "%", + "=?UTF-8?B?JQ?= =?UTF-8?B?JQ?=" => "%%", + "=?UTF-8?B?YWI?=" => "ab", + "=?UTF-8?B?YWI?= =?UTF-8?B?YWI?=" => "abab", ); my @decode_strict_tests = ( @@ -159,6 +164,11 @@ my @decode_strict_tests = ( "=?utf-8-strict?Q?=C3=A1?=" => "=?utf-8-strict?Q?=C3=A1?=", # do not allow non-ASCII characters in q word "=?UTF-8?Q?\x{C3}\x{A1}?=" => "=?UTF-8?Q?\x{C3}\x{A1}?=", + # do not allow missing padding characters '=' in b word + "=?UTF-8?B?JQ?=" => "=?UTF-8?B?JQ?=", + "=?UTF-8?B?JQ?= =?UTF-8?B?JQ?=" => "=?UTF-8?B?JQ?= =?UTF-8?B?JQ?=", + "=?UTF-8?B?YWI?=" => "=?UTF-8?B?YWI?=", + "=?UTF-8?B?YWI?= =?UTF-8?B?YWI?=" => "=?UTF-8?B?YWI?= =?UTF-8?B?YWI?=", ); my @encode_tests = ( Index: gnu/usr.bin/perl/cpan/Encode/t/truncated_utf8.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/t/truncated_utf8.t,v diff -u -p -a -u -p -r1.1.1.1 truncated_utf8.t --- gnu/usr.bin/perl/cpan/Encode/t/truncated_utf8.t 13 Feb 2019 21:10:51 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Encode/t/truncated_utf8.t 21 Feb 2024 15:47:00 -0000 @@ -12,6 +12,10 @@ BEGIN { print "1..0 # Skip: EBCDIC\n"; exit 0; } + if ( $] < 5.009 ) { + print "1..0 # Skip: Perl <= 5.9 or later required\n"; + exit 0; + } $| = 1; } Index: gnu/usr.bin/perl/cpan/Encode/t/utf32warnings.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/t/utf32warnings.t,v diff -u -p -a -u -p -r1.1.1.1 utf32warnings.t --- gnu/usr.bin/perl/cpan/Encode/t/utf32warnings.t 15 Feb 2023 01:32:37 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Encode/t/utf32warnings.t 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,9 @@ +BEGIN { + if ( $] < 5.009 ) { + print "1..0 # Skip: Perl <= 5.9 or later required\n"; + exit 0; + } +} use strict; use warnings; Index: gnu/usr.bin/perl/cpan/Encode/t/xml.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Encode/t/xml.t,v diff -u -p -a -u -p -r1.1.1.1 xml.t --- gnu/usr.bin/perl/cpan/Encode/t/xml.t 30 Dec 2019 02:10:28 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Encode/t/xml.t 21 Feb 2024 15:47:00 -0000 @@ -1,3 +1,9 @@ +BEGIN { + if ( $] < 5.009 ) { + print "1..0 # Skip: Perl <= 5.9 or later required\n"; + exit 0; + } +} use strict; use warnings; @@ -8,7 +14,7 @@ my $content = String->new("--\x{30c6}--" my $text = Encode::encode('latin1', $content, Encode::FB_XMLCREF); is $text, "--テ--"; -done_testing; +done_testing(); package String; use overload Index: gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm,v diff -u -p -a -u -p -r1.14 Install.pm --- gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm 15 Feb 2023 01:38:21 -0000 1.14 +++ gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Install.pm 21 Feb 2024 15:47:00 -0000 @@ -32,11 +32,11 @@ ExtUtils::Install - install files from h =head1 VERSION -2.20 +2.22 =cut -our $VERSION = '2.20'; # <-- do not forget to update the POD section just above this line! +our $VERSION = '2.22'; # <-- do not forget to update the POD section just above this line! $VERSION = eval $VERSION; =pod Index: gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm,v diff -u -p -a -u -p -r1.3 Installed.pm --- gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm 15 Feb 2023 01:36:16 -0000 1.3 +++ gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Installed.pm 21 Feb 2024 15:47:00 -0000 @@ -15,7 +15,7 @@ my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|do require VMS::Filespec if $Is_VMS; -our $VERSION = '2.20'; +our $VERSION = '2.22'; $VERSION = eval $VERSION; sub _is_prefix { Index: gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm,v diff -u -p -a -u -p -r1.3 Packlist.pm --- gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm 15 Feb 2023 01:36:16 -0000 1.3 +++ gnu/usr.bin/perl/cpan/ExtUtils-Install/lib/ExtUtils/Packlist.pm 21 Feb 2024 15:47:00 -0000 @@ -4,7 +4,7 @@ use strict; use Carp qw(); use Config; our $Relocations; -our $VERSION = '2.20'; +our $VERSION = '2.22'; $VERSION = eval $VERSION; # Used for generating filehandle globs. IO::File might not be available! Index: gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installapi2.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installapi2.t,v diff -u -p -a -u -p -r1.2 Installapi2.t --- gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installapi2.t 15 Feb 2023 01:36:16 -0000 1.2 +++ gnu/usr.bin/perl/cpan/ExtUtils-Install/t/Installapi2.t 21 Feb 2024 15:47:00 -0000 @@ -11,6 +11,7 @@ use TieOut; use File::Path; use File::Spec; use File::Temp qw[tempdir]; +use File::Compare; use Test::More tests => 70; Index: gnu/usr.bin/perl/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm,v diff -u -p -a -u -p -r1.3 BFD.pm --- gnu/usr.bin/perl/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm 15 Feb 2023 01:36:17 -0000 1.3 +++ gnu/usr.bin/perl/cpan/ExtUtils-Install/t/lib/MakeMaker/Test/Setup/BFD.pm 21 Feb 2024 15:47:00 -0000 @@ -35,6 +35,7 @@ WriteMakefile( VERSION_FROM => 'lib/Big/Dummy.pm', EXE_FILES => [qw(bin/program)], PREREQ_PM => { strict => 0 }, + BUILD_REQUIRES => { warnings => 0 }, ABSTRACT_FROM => 'lib/Big/Dummy.pm', AUTHOR => 'Michael G Schwern ', ); @@ -104,12 +105,23 @@ END ); +my $tmpdir; +# if given args, those are inserted as components in resulting path, eg: +# setup_recurs('dir') means instead of creating Big-Dummy/*, dir/Big-Dummy/* sub setup_recurs { - - while(my($file, $text) = each %Files) { + my @chrs = ( "A" .. "Z", 0 .. 9 ); + # annoyingly we cant use File::Temp here as it drags in XS code + # and we run under blocks to prevent XS code loads. This is a minimal + # patch to fix the issue. + $tmpdir = join "", "./temp-$$-", map { $chrs[rand(@chrs)] } 1..8; + mkdir($tmpdir) or die "Failed to create '$tmpdir': $!"; + chdir($tmpdir) or die "Failed to chdir '$tmpdir': $!"; + foreach my $file (sort keys %Files) { + my $text = $Files{$file}; # Convert to a relative, native file path. - $file = File::Spec->catfile(File::Spec->curdir, split m{\/}, $file); + $file = File::Spec->catfile(File::Spec->curdir, @_, split m{\/}, $file); + $file = File::Spec->rel2abs($file); my $dir = dirname($file); mkpath $dir; @@ -126,13 +138,15 @@ sub setup_recurs { return 1; } -sub teardown_recurs { +sub teardown_recurs { foreach my $file (keys %Files) { my $dir = dirname($file); if( -e $dir ) { - rmtree($dir) || return; + rmtree($dir) or next; } } + chdir(".."); + rmtree($tmpdir); return 1; } Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm,v diff -u -p -a -u -p -r1.4 Command.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm 15 Feb 2023 01:36:17 -0000 1.4 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command.pm 21 Feb 2024 15:47:00 -0000 @@ -4,11 +4,10 @@ use 5.00503; use strict; use warnings; require Exporter; -use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION); -@ISA = qw(Exporter); -@EXPORT = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f test_d chmod - dos2unix); -$VERSION = '7.64'; +our @ISA = qw(Exporter); +our @EXPORT = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f test_d chmod + dos2unix); +our $VERSION = '7.70'; $VERSION =~ tr/_//d; my $Is_VMS = $^O eq 'VMS'; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist.pm,v diff -u -p -a -u -p -r1.6 Liblist.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist.pm 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,7 @@ package ExtUtils::Liblist; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; use File::Spec; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM.pm,v diff -u -p -a -u -p -r1.6 MM.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM.pm 21 Feb 2024 15:47:00 -0000 @@ -4,7 +4,7 @@ use strict; use warnings; use ExtUtils::MakeMaker::Config; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; require ExtUtils::Liblist; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_AIX.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_AIX.pm,v diff -u -p -a -u -p -r1.6 MM_AIX.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_AIX.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_AIX.pm 21 Feb 2024 15:47:00 -0000 @@ -2,7 +2,7 @@ package ExtUtils::MM_AIX; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; use ExtUtils::MakeMaker::Config; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm,v diff -u -p -a -u -p -r1.13 MM_Any.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm 15 Feb 2023 01:36:17 -0000 1.13 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm 21 Feb 2024 15:47:00 -0000 @@ -2,7 +2,7 @@ package ExtUtils::MM_Any; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; use Carp; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_BeOS.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_BeOS.pm,v diff -u -p -a -u -p -r1.6 MM_BeOS.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_BeOS.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_BeOS.pm 21 Feb 2024 15:47:00 -0000 @@ -27,7 +27,7 @@ require ExtUtils::MM_Any; require ExtUtils::MM_Unix; our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix ); -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm,v diff -u -p -a -u -p -r1.6 MM_Cygwin.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm 21 Feb 2024 15:47:00 -0000 @@ -10,7 +10,7 @@ require ExtUtils::MM_Unix; require ExtUtils::MM_Win32; our @ISA = qw( ExtUtils::MM_Unix ); -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_DOS.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_DOS.pm,v diff -u -p -a -u -p -r1.6 MM_DOS.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_DOS.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_DOS.pm 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,7 @@ package ExtUtils::MM_DOS; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; require ExtUtils::MM_Any; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Darwin.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Darwin.pm,v diff -u -p -a -u -p -r1.6 MM_Darwin.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Darwin.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Darwin.pm 21 Feb 2024 15:47:00 -0000 @@ -8,7 +8,7 @@ BEGIN { our @ISA = qw( ExtUtils::MM_Unix ); } -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_MacOS.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_MacOS.pm,v diff -u -p -a -u -p -r1.6 MM_MacOS.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_MacOS.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_MacOS.pm 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,7 @@ package ExtUtils::MM_MacOS; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; sub new { Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_NW5.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_NW5.pm,v diff -u -p -a -u -p -r1.6 MM_NW5.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_NW5.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_NW5.pm 21 Feb 2024 15:47:00 -0000 @@ -23,7 +23,7 @@ use warnings; use ExtUtils::MakeMaker::Config; use File::Basename; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; require ExtUtils::MM_Win32; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS2.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS2.pm,v diff -u -p -a -u -p -r1.6 MM_OS2.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS2.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS2.pm 21 Feb 2024 15:47:00 -0000 @@ -6,7 +6,7 @@ use warnings; use ExtUtils::MakeMaker qw(neatvalue); use File::Spec; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; require ExtUtils::MM_Any; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS390.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS390.pm,v diff -u -p -a -u -p -r1.1.1.1 MM_OS390.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS390.pm 15 Feb 2023 01:32:34 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_OS390.pm 21 Feb 2024 15:47:00 -0000 @@ -2,7 +2,7 @@ package ExtUtils::MM_OS390; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; use ExtUtils::MakeMaker::Config; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_QNX.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_QNX.pm,v diff -u -p -a -u -p -r1.6 MM_QNX.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_QNX.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_QNX.pm 21 Feb 2024 15:47:00 -0000 @@ -2,7 +2,7 @@ package ExtUtils::MM_QNX; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; require ExtUtils::MM_Unix; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_UWIN.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_UWIN.pm,v diff -u -p -a -u -p -r1.6 MM_UWIN.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_UWIN.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_UWIN.pm 21 Feb 2024 15:47:00 -0000 @@ -2,7 +2,7 @@ package ExtUtils::MM_UWIN; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; require ExtUtils::MM_Unix; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm,v diff -u -p -a -u -p -r1.24 MM_Unix.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm 15 Feb 2023 01:38:21 -0000 1.24 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Unix.pm 21 Feb 2024 15:47:00 -0000 @@ -13,10 +13,11 @@ our %Config_Override; use ExtUtils::MakeMaker qw($Verbose neatvalue _sprintf562); -# If we make $VERSION an our variable parse_version() breaks -use vars qw($VERSION); -$VERSION = '7.64'; +# If $VERSION is in scope, parse_version() breaks +{ +our $VERSION = '7.70'; $VERSION =~ tr/_//d; +} require ExtUtils::MM_Any; our @ISA = qw(ExtUtils::MM_Any); @@ -34,13 +35,16 @@ BEGIN { $Is{SunOS4} = $^O eq 'sunos'; $Is{Solaris} = $^O eq 'solaris'; $Is{SunOS} = $Is{SunOS4} || $Is{Solaris}; - $Is{BSD} = ($^O =~ /^(?:free|net|open)bsd$/ or + $Is{BSD} = ($^O =~ /^(?:free|midnight|net|open)bsd$/ or grep( $^O eq $_, qw(bsdos interix dragonfly) ) ); $Is{Android} = $^O =~ /android/; - if ( $^O eq 'darwin' && $^X eq '/usr/bin/perl' ) { + if ( $^O eq 'darwin' ) { my @osvers = split /\./, $Config{osvers}; - $Is{ApplCor} = ( $osvers[0] >= 18 ); + if ( $^X eq '/usr/bin/perl' ) { + $Is{ApplCor} = ( $osvers[0] >= 18 ); + } + $Is{AppleRPath} = ( $osvers[0] >= 9 ); } } @@ -1054,7 +1058,7 @@ sub xs_make_dynamic_lib { if ( $Is{IRIX} ) { $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"}; } - elsif ( $^O eq 'darwin' ) { + elsif ( $^O eq 'darwin' && $Is{AppleRPath} ) { # both clang and gcc support -Wl,-rpath, but only clang supports # -rpath so by using -Wl,-rpath we avoid having to check for the # type of compiler @@ -2193,7 +2197,7 @@ Add MM_Unix_VERSION. sub init_platform { my($self) = shift; - $self->{MM_Unix_VERSION} = $VERSION; + $self->{MM_Unix_VERSION} = our $VERSION; $self->{PERL_MALLOC_DEF} = '-DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc '. '-Dfree=Perl_mfree -Drealloc=Perl_realloc '. '-Dcalloc=Perl_calloc'; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VMS.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VMS.pm,v diff -u -p -a -u -p -r1.6 MM_VMS.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VMS.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VMS.pm 21 Feb 2024 15:47:00 -0000 @@ -16,7 +16,7 @@ BEGIN { use File::Basename; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; require ExtUtils::MM_Any; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VOS.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VOS.pm,v diff -u -p -a -u -p -r1.6 MM_VOS.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VOS.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_VOS.pm 21 Feb 2024 15:47:00 -0000 @@ -2,7 +2,7 @@ package ExtUtils::MM_VOS; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; require ExtUtils::MM_Unix; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win32.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win32.pm,v diff -u -p -a -u -p -r1.6 MM_Win32.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win32.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win32.pm 21 Feb 2024 15:47:00 -0000 @@ -27,7 +27,7 @@ use ExtUtils::MakeMaker qw(neatvalue _sp require ExtUtils::MM_Any; require ExtUtils::MM_Unix; our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix ); -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; $ENV{EMXSHELL} = 'sh'; # to run `commands` Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win95.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win95.pm,v diff -u -p -a -u -p -r1.6 MM_Win95.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win95.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Win95.pm 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,7 @@ package ExtUtils::MM_Win95; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; require ExtUtils::MM_Win32; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MY.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MY.pm,v diff -u -p -a -u -p -r1.6 MY.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MY.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MY.pm 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,7 @@ package ExtUtils::MY; use strict; require ExtUtils::MM; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; our @ISA = qw(ExtUtils::MM); @@ -30,7 +30,7 @@ ExtUtils::MY - ExtUtils::MakeMaker subcl B -ExtUtils::MY is a subclass of L. Its provided in your +ExtUtils::MY is a subclass of L. It is provided in your Makefile.PL for you to add and override MakeMaker functionality. It also provides a convenient alias via the MY class. Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm,v diff -u -p -a -u -p -r1.10 MakeMaker.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm 15 Feb 2023 01:36:17 -0000 1.10 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm 21 Feb 2024 15:47:00 -0000 @@ -25,7 +25,7 @@ my %Recognized_Att_Keys; our %macro_fsentity; # whether a macro is a filesystem name our %macro_dep; # whether a macro is a dependency -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; # Emulate something resembling CVS $Revision$ @@ -525,7 +525,10 @@ sub new { # simulate "use warnings FATAL => 'all'" for vintage perls die @_; }; - version->new( $perl_version )->numify; + my $v = version->new($perl_version); + # we care about parse issues, not numify warnings + no warnings; + $v->numify; }; $perl_version =~ tr/_//d if defined $perl_version; @@ -1151,19 +1154,20 @@ sub check_hints { } sub _run_hintfile { - my ($self, $hint_file) = @_; + our $self; + local($self) = shift; # make $self available to the hint file. + my($hint_file) = shift; local($@, $!); print "Processing hints file $hint_file\n" if $Verbose; - if(open(my $fh, '<', $hint_file)) { - my $hints_content = do { local $/; <$fh> }; - no strict; - eval $hints_content; - warn "Failed to run hint file $hint_file: $@" if $@; - } - else { - warn "Could not open $hint_file for read: $!"; + # Just in case the ./ isn't on the hint file, which File::Spec can + # often strip off, we bung the curdir into @INC + local @INC = (File::Spec->curdir, @INC); + my $ret = do $hint_file; + if( !defined $ret ) { + my $error = $@ || $!; + warn $error; } } @@ -1262,6 +1266,7 @@ sub write_file_via_tmp { die "write_file_via_tmp: 2nd arg must be ref" unless ref $contents; for my $chunk (@$contents) { my $to_write = $chunk; + $to_write = '' unless defined $to_write; utf8::encode $to_write if !$CAN_DECODE && "$]" > 5.008; print $fh "$to_write\n" or die "Can't write to MakeMaker.tmp: $!"; } @@ -1331,26 +1336,6 @@ sub neatvalue { return "{ ".join(', ',@m)." }"; } -sub _find_magic_vstring { - my $value = shift; - return $value if $UNDER_CORE; - my $tvalue = ''; - require B; - my $sv = B::svref_2object(\$value); - my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef; - while ( $magic ) { - if ( $magic->TYPE eq 'V' ) { - $tvalue = $magic->PTR; - $tvalue =~ s/^v?(.+)$/v$1/; - last; - } - else { - $magic = $magic->MOREMAGIC; - } - } - return $tvalue; -} - sub selfdocument { my($self) = @_; my(@m); @@ -3297,7 +3282,7 @@ are generated when F genera is installed). Clients like L or L will read these files to see what prerequisites must be fulfilled before building or testing the distribution. If you wish to shut this feature off, set the C -C flag to true. +C flag to true. =head2 Disabling an extension Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mkbootstrap.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mkbootstrap.pm,v diff -u -p -a -u -p -r1.6 Mkbootstrap.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mkbootstrap.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mkbootstrap.pm 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,7 @@ package ExtUtils::Mkbootstrap; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; require Exporter; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mksymlists.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mksymlists.pm,v diff -u -p -a -u -p -r1.6 Mksymlists.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mksymlists.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Mksymlists.pm 21 Feb 2024 15:47:00 -0000 @@ -11,7 +11,7 @@ use Config; our @ISA = qw(Exporter); our @EXPORT = qw(&Mksymlists); -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; sub Mksymlists { Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/testlib.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/testlib.pm,v diff -u -p -a -u -p -r1.6 testlib.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/testlib.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/testlib.pm 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,7 @@ package ExtUtils::testlib; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; use Cwd; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command/MM.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command/MM.pm,v diff -u -p -a -u -p -r1.6 MM.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command/MM.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Command/MM.pm 21 Feb 2024 15:47:00 -0000 @@ -10,7 +10,7 @@ our @ISA = qw(Exporter); our @EXPORT = qw(test_harness pod2man perllocal_install uninstall warn_if_old_packlist test_s cp_nonempty); -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; my $Is_VMS = $^O eq 'VMS'; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm,v diff -u -p -a -u -p -r1.6 Kid.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/Liblist/Kid.pm 21 Feb 2024 15:47:00 -0000 @@ -11,7 +11,7 @@ use 5.006; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; use ExtUtils::MakeMaker::Config; @@ -62,6 +62,7 @@ sub _unix_os2_ext { chomp(my @incpath = grep s/^ //, grep { /^#include &1 >/dev/null`); unshift @libpath, map { s{/include[^/]*}{/lib}; $_ } @incpath } + @libpath = grep -d, @libpath; if ( $^O eq 'darwin' or $^O eq 'next' ) { # 'escape' Mach-O ld -framework and -F flags, so they aren't dropped later on Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Config.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Config.pm,v diff -u -p -a -u -p -r1.6 Config.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Config.pm 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Config.pm 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,7 @@ package ExtUtils::MakeMaker::Config; use strict; use warnings; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; use Config (); Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/FAQ.pod =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/FAQ.pod,v diff -u -p -a -u -p -r1.10 FAQ.pod --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/FAQ.pod 15 Feb 2023 01:36:17 -0000 1.10 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/FAQ.pod 21 Feb 2024 15:47:00 -0000 @@ -1,6 +1,6 @@ package ExtUtils::MakeMaker::FAQ; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; 1; @@ -129,7 +129,7 @@ Let's take the following test directory t/bar/othertest.t t/bar/baz/anothertest.t -Now, inside of the C function in your F, specify +Now, inside of the C function in your F, specify where your tests are located with the C directive: test => {TESTS => 't/*.t t/*/*.t t/*/*/*.t'} @@ -536,8 +536,7 @@ And of course a very basic test: t/cool.t: -------- - use Test; - BEGIN { plan tests => 1 }; + use Test::More tests => 1; use Cool::Foo; use Cool::Bar; Cool::Foo::perl_rules(); Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm,v diff -u -p -a -u -p -r1.4 Locale.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm 15 Feb 2023 01:36:17 -0000 1.4 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Locale.pm 21 Feb 2024 15:47:00 -0000 @@ -2,7 +2,7 @@ package ExtUtils::MakeMaker::Locale; use strict; use warnings; -our $VERSION = "7.64"; +our $VERSION = "7.70"; $VERSION =~ tr/_//d; use base 'Exporter'; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Tutorial.pod =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Tutorial.pod,v diff -u -p -a -u -p -r1.6 Tutorial.pod --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Tutorial.pod 15 Feb 2023 01:36:17 -0000 1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/Tutorial.pod 21 Feb 2024 15:47:00 -0000 @@ -1,6 +1,6 @@ package ExtUtils::MakeMaker::Tutorial; -our $VERSION = '7.64'; +our $VERSION = '7.70'; $VERSION =~ tr/_//d; @@ -112,7 +112,7 @@ example: t/foo/subdir_test.t -To do this, you need to inform C in your I file +To do this, you need to inform C in your I file in the following fashion: test => {TESTS => 't/*.t t/*/*.t'} Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm,v diff -u -p -a -u -p -r1.4 version.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm 15 Feb 2023 01:36:17 -0000 1.4 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version.pm 21 Feb 2024 15:47:00 -0000 @@ -16,7 +16,7 @@ use warnings; use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv); -$VERSION = '7.64'; +$VERSION = '7.70'; $VERSION =~ tr/_//d; $CLASS = 'version'; Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm,v diff -u -p -a -u -p -r1.4 regex.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm 15 Feb 2023 01:36:17 -0000 1.4 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker/version/regex.pm 21 Feb 2024 15:47:00 -0000 @@ -11,7 +11,7 @@ use warnings; use vars qw($VERSION $CLASS $STRICT $LAX); -$VERSION = '7.64'; +$VERSION = '7.70'; $VERSION =~ tr/_//d; #--------------------------------------------------------------------------# Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST.t,v diff -u -p -a -u -p -r1.1.1.5 INST.t --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST.t 15 Feb 2023 01:32:33 -0000 1.1.1.5 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST.t 21 Feb 2024 15:47:00 -0000 @@ -76,7 +76,7 @@ is( !!$mm->{PERL_CORE}, !!$ENV{PERL_CORE my($perl_src, $mm_perl_src); if( $ENV{PERL_CORE} ) { - $perl_src = File::Spec->catdir($Updir, $Updir, $Updir, $Updir, $Updir); + $perl_src = File::Spec->catdir($Updir, $Updir, $Updir, $Updir, $Updir, $Updir); $perl_src = File::Spec->canonpath($perl_src); $mm_perl_src = File::Spec->canonpath($mm->{PERL_SRC}); } @@ -84,7 +84,7 @@ else { $mm_perl_src = $mm->{PERL_SRC}; } -is( $mm_perl_src, $perl_src, 'PERL_SRC' ); +is( $mm_perl_src, $perl_src, "PERL_SRC" ); # PERM_* Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t,v diff -u -p -a -u -p -r1.1.1.5 INST_PREFIX.t --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t 15 Feb 2023 01:32:33 -0000 1.1.1.5 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/INST_PREFIX.t 21 Feb 2024 15:47:00 -0000 @@ -109,7 +109,7 @@ is( !!$mm->{PERL_CORE}, !!$ENV{PERL_CORE my($perl_src, $mm_perl_src); if( $ENV{PERL_CORE} ) { - $perl_src = File::Spec->catdir($Updir, $Updir, $Updir, $Updir, $Updir); + $perl_src = File::Spec->catdir($Updir, $Updir, $Updir, $Updir, $Updir, $Updir); $perl_src = File::Spec->canonpath($perl_src); $mm_perl_src = File::Spec->canonpath($mm->{PERL_SRC}); } Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/eu_command.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/eu_command.t,v diff -u -p -a -u -p -r1.5 eu_command.t --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/eu_command.t 15 Feb 2023 01:36:17 -0000 1.5 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/eu_command.t 21 Feb 2024 15:47:00 -0000 @@ -67,7 +67,14 @@ BEGIN { my ($now) = time; utime ($now, $now, $ARGV[0]); - sleep 2; + + sleep 3; # note this affects the "newer file created" + # we used to sleep 2, but with the vagaries of sleep + # this meant that occasionally that test would fail + # on cygwin, by virtue of seeing only a one second + # difference. Sleeping 3 seconds should ensure + # that we get at least 2 seconds difference for + # that test. # Just checking modify time stamp, access time stamp is set # to the beginning of the day in Win95. Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/hints.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/hints.t,v diff -u -p -a -u -p -r1.1.1.5 hints.t --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/hints.t 15 Feb 2023 01:32:34 -0000 1.1.1.5 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/hints.t 21 Feb 2024 15:47:00 -0000 @@ -61,8 +61,9 @@ CLOO local $SIG{__WARN__} = sub { $stderr .= join '', @_ }; $mm->check_hints; - my $Escaped_Hint_File = quotemeta($Hint_File); - like( $stderr, qr{^Failed to run hint file $Escaped_Hint_File: Argh!\n\z}, 'hint files produce errors' ); + is( $stderr, <can_run(make()) && $ENV{PERL_CORE} && $Config{'usecrosscompile'} ? (skip_all => "cross-compiling and make not available") - : (tests => 35); + : (tests => 37); use File::Path; use ExtUtils::MakeMaker; @@ -121,6 +121,17 @@ note "Argument verification"; { ); }; is( $warnings, '', 'MIN_PERL_VERSION=X.Y.Z does not trigger a warning' ); + is( $@, '', ' nor a hard failure' ); + + + $warnings = ''; + eval { + WriteMakefile( + NAME => 'Min::PerlVers', + MIN_PERL_VERSION => '5.005_04', + ); + }; + is( $warnings, '', 'MIN_PERL_VERSION=5.005_04 does not trigger a warning' ); is( $@, '', ' nor a hard failure' ); Index: gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm,v diff -u -p -a -u -p -r1.1.1.6 BFD.pm --- gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm 15 Feb 2023 01:32:34 -0000 1.1.1.6 +++ gnu/usr.bin/perl/cpan/ExtUtils-MakeMaker/t/lib/MakeMaker/Test/Setup/BFD.pm 21 Feb 2024 15:47:00 -0000 @@ -103,11 +103,20 @@ END ); +my $tmpdir; # if given args, those are inserted as components in resulting path, eg: # setup_recurs('dir') means instead of creating Big-Dummy/*, dir/Big-Dummy/* sub setup_recurs { - while(my($file, $text) = each %Files) { + my @chrs = ( "A" .. "Z", 0 .. 9 ); + # annoyingly we cant use File::Temp here as it drags in XS code + # and we run under blocks to prevent XS code loads. This is a minimal + # patch to fix the issue. + $tmpdir = join "", "./temp-$$-", map { $chrs[rand(@chrs)] } 1..8; + mkdir($tmpdir) or die "Failed to create '$tmpdir': $!"; + chdir($tmpdir) or die "Failed to chdir '$tmpdir': $!"; + foreach my $file (sort keys %Files) { + my $text = $Files{$file}; # Convert to a relative, native file path. $file = File::Spec->catfile(File::Spec->curdir, @_, split m{\/}, $file); $file = File::Spec->rel2abs($file); @@ -131,9 +140,11 @@ sub teardown_recurs { foreach my $file (keys %Files) { my $dir = dirname($file); if( -e $dir ) { - rmtree($dir) || return; + rmtree($dir) or next; } } + chdir(".."); + rmtree($tmpdir); return 1; } Index: gnu/usr.bin/perl/cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm,v diff -u -p -a -u -p -r1.1.1.1 PL2Bat.pm --- gnu/usr.bin/perl/cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm 15 Feb 2023 01:32:36 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm 21 Feb 2024 15:47:00 -0000 @@ -1,5 +1,5 @@ package ExtUtils::PL2Bat; -$ExtUtils::PL2Bat::VERSION = '0.004'; +$ExtUtils::PL2Bat::VERSION = '0.005'; use strict; use warnings; @@ -122,7 +122,7 @@ ExtUtils::PL2Bat - Batch file creation t =head1 VERSION -version 0.004 +version 0.005 =head1 OVERVIEW Index: gnu/usr.bin/perl/cpan/ExtUtils-PL2Bat/t/make_executable.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/ExtUtils-PL2Bat/t/make_executable.t,v diff -u -p -a -u -p -r1.1.1.1 make_executable.t --- gnu/usr.bin/perl/cpan/ExtUtils-PL2Bat/t/make_executable.t 15 Feb 2023 01:32:36 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/ExtUtils-PL2Bat/t/make_executable.t 21 Feb 2024 15:47:00 -0000 @@ -13,6 +13,11 @@ my @test_vals = ( 0, 1, 2, 3, -1, -2, 65 plan($OSNAME eq 'MSWin32' ? ( tests => (($#test_vals+1)*5)+2 ) : ( skip_all => 'Only usable on Windows' )); +# the method of execution of the test script is geared to cmd.exe so ensure +# this is used in case the user have some non-standard shell. +# E.g. TCC/4NT doesn't quite handle the invocation correctly producing errors. +$ENV{COMSPEC} = "$ENV{SystemRoot}\\System32\\cmd.exe"; + my $perl_in_fname = 'test_perl_source'; open my $out, '>', $perl_in_fname or die qq{Couldn't create source file ("$perl_in_fname"): $!}; Index: gnu/usr.bin/perl/cpan/Filter-Util-Call/Call.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Filter-Util-Call/Call.pm,v diff -u -p -a -u -p -r1.5 Call.pm --- gnu/usr.bin/perl/cpan/Filter-Util-Call/Call.pm 15 Feb 2023 01:36:18 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Filter-Util-Call/Call.pm 21 Feb 2024 15:47:01 -0000 @@ -1,7 +1,7 @@ # Call.pm # # Copyright (c) 1995-2011 Paul Marquess. All rights reserved. -# Copyright (c) 2011-2014 Reini Urban. All rights reserved. +# Copyright (c) 2011-2014, 2018-2022 Reini Urban. All rights reserved. # Copyright (c) 2014-2017 cPanel Inc. All rights reserved. # # This program is free software; you can redistribute it and/or @@ -18,7 +18,7 @@ use warnings; our @ISA = qw(Exporter); our @EXPORT = qw( filter_add filter_del filter_read filter_read_exact) ; -our $VERSION = "1.60" ; +our $VERSION = "1.64" ; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; @@ -528,7 +528,7 @@ Paul Marquess =head1 LICENSE Copyright (c) 1995-2011 Paul Marquess. All rights reserved. -Copyright (c) 2011-2014 Reini Urban. All rights reserved. +Copyright (c) 2011-2014, 2018-2022 Reini Urban. All rights reserved. Copyright (c) 2014-2017 cPanel Inc. All rights reserved. This program is free software; you can redistribute it and/or Index: gnu/usr.bin/perl/cpan/Filter-Util-Call/Call.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Filter-Util-Call/Call.xs,v diff -u -p -a -u -p -r1.5 Call.xs --- gnu/usr.bin/perl/cpan/Filter-Util-Call/Call.xs 15 Feb 2023 01:36:18 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Filter-Util-Call/Call.xs 21 Feb 2024 15:47:01 -0000 @@ -1,12 +1,12 @@ /* * Filename : Call.xs * - * Author : Paul Marquess - * Date : 2014-12-09 02:48:44 rurban - * Version : 1.60 + * Author : Reini Urban + * Date : Di 16. Aug 7:59:10 CEST 2022 + * Version : 1.64 * * Copyright (c) 1995-2011 Paul Marquess. All rights reserved. - * Copyright (c) 2011-2014 Reini Urban. All rights reserved. + * Copyright (c) 2011-2014, 2018 Reini Urban. All rights reserved. * This program is free software; you can redistribute it and/or * modify it under the same terms as Perl itself. * Index: gnu/usr.bin/perl/cpan/Getopt-Long/lib/Getopt/Long.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Getopt-Long/lib/Getopt/Long.pm,v diff -u -p -a -u -p -r1.8 Long.pm --- gnu/usr.bin/perl/cpan/Getopt-Long/lib/Getopt/Long.pm 15 Feb 2023 01:36:18 -0000 1.8 +++ gnu/usr.bin/perl/cpan/Getopt-Long/lib/Getopt/Long.pm 21 Feb 2024 15:47:00 -0000 @@ -4,12 +4,14 @@ # Author : Johan Vromans # Created On : Tue Sep 11 15:00:12 1990 # Last Modified By: Johan Vromans -# Last Modified On: Tue Aug 18 14:48:05 2020 -# Update Count : 1739 +# Last Modified On: Thu Nov 17 17:45:27 2022 +# Update Count : 1777 # Status : Released ################ Module Preamble ################ +# There are no CPAN testers for very old versions of Perl. +# Getopt::Long is reported to run under 5.8. use 5.004; use strict; @@ -18,10 +20,10 @@ use warnings; package Getopt::Long; use vars qw($VERSION); -$VERSION = 2.52; +$VERSION = 2.54; # For testing versions only. use vars qw($VERSION_STRING); -$VERSION_STRING = "2.52"; +$VERSION_STRING = "2.54"; use Exporter; use vars qw(@ISA @EXPORT @EXPORT_OK); @@ -258,9 +260,9 @@ use constant PAT_XINT => ")"; use constant PAT_FLOAT => "[-+]?". # optional sign - "(?=[0-9.])". # must start with digit or dec.point + "(?=\\.?[0-9])". # must start with digit or dec.point "[0-9_]*". # digits before the dec.point - "(\.[0-9_]+)?". # optional fraction + "(\\.[0-9_]*)?". # optional fraction "([eE][-+]?[0-9_]+)?"; # optional exponent sub GetOptions(@) { @@ -525,8 +527,9 @@ sub GetOptionsFromArray(@) { my $key; # key (if hash type) my $arg; # option argument my $ctl; # the opctl entry + my $starter; # the actual starter character(s) - ($found, $opt, $ctl, $arg, $key) = + ($found, $opt, $ctl, $starter, $arg, $key) = FindOption ($argv, $prefix, $argend, $opt, \%opctl); if ( $found ) { @@ -606,12 +609,13 @@ sub GetOptionsFromArray(@) { eval { &{$linkage{$opt}} (Getopt::Long::CallBack->new - (name => $opt, - given => $given, - ctl => $ctl, - opctl => \%opctl, - linkage => \%linkage, - prefix => $prefix, + (name => $opt, + given => $given, + ctl => $ctl, + opctl => \%opctl, + linkage => \%linkage, + prefix => $prefix, + starter => $starter, ), $ctl->[CTL_DEST] == CTL_DEST_HASH ? ($key) : (), $arg); @@ -818,7 +822,7 @@ sub ParseOptionSpec ($$) { [=:] [ionfs] [@%]? (?: \{\d*,?\d*\} )? | # ... or an optional-with-default spec - : (?: -?\d+ | \+ ) [@%]? + : (?: 0[0-7]+ | 0[xX][0-9a-fA-F]+ | 0[bB][01]+ | -?\d+ | \+ ) [@%]? )? $;x ) { return (undef, "Error in option spec: \"$opt\"\n"); @@ -851,10 +855,23 @@ sub ParseOptionSpec ($$) { # Fields are hard-wired here. $entry = [$spec,$orig,undef,CTL_DEST_SCALAR,0,0]; } - elsif ( $spec =~ /^:(-?\d+|\+)([@%])?$/ ) { + elsif ( $spec =~ /^:(0[0-7]+|0x[0-9a-f]+|0b[01]+|-?\d+|\+)([@%])?$/i ) { my $def = $1; my $dest = $2; - my $type = $def eq '+' ? 'I' : 'i'; + my $type = 'i'; # assume integer + if ( $def eq '+' ) { + # Increment. + $type = 'I'; + } + elsif ( $def =~ /^(0[0-7]+|0[xX][0-9a-fA-F]+|0[bB][01]+)$/ ) { + # Octal, binary or hex. + $type = 'o'; + $def = oct($def); + } + elsif ( $def =~ /^-?\d+$/ ) { + # Integer. + $def = 0 + $def; + } $dest ||= '$'; $dest = $dest eq '@' ? CTL_DEST_ARRAY : $dest eq '%' ? CTL_DEST_HASH : CTL_DEST_SCALAR; @@ -923,7 +940,7 @@ sub ParseOptionSpec ($$) { # Option lookup. sub FindOption ($$$$$) { - # returns (1, $opt, $ctl, $arg, $key) if okay, + # returns (1, $opt, $ctl, $starter, $arg, $key) if okay, # returns (1, undef) if option in error, # returns (0) otherwise. @@ -1104,7 +1121,7 @@ sub FindOption ($$$$$) { $arg = 0; # supply explicit value } unshift (@$argv, $starter.$rest) if defined $rest; - return (1, $opt, $ctl, $arg); + return (1, $opt, $ctl, $starter, $arg); } # Get mandatory status and type info. @@ -1127,15 +1144,15 @@ sub FindOption ($$$$$) { # Fake incremental type. my @c = @$ctl; $c[CTL_TYPE] = '+'; - return (1, $opt, \@c, 1); + return (1, $opt, \@c, $starter, 1); } my $val = defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : $type eq 's' ? '' : 0; - return (1, $opt, $ctl, $val); + return (1, $opt, $ctl, $starter, $val); } - return (1, $opt, $ctl, $type eq 's' ? '' : 0) + return (1, $opt, $ctl, $starter, $type eq 's' ? '' : 0) if $optargtype == 1; # --foo= -> return nothing } @@ -1155,9 +1172,9 @@ sub FindOption ($$$$$) { # Fake incremental type. my @c = @$ctl; $c[CTL_TYPE] = '+'; - return (1, $opt, \@c, 1); + return (1, $opt, \@c, $starter, 1); } - return (1, $opt, $ctl, + return (1, $opt, $ctl, $starter, defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : $type eq 's' ? '' : 0); } @@ -1187,16 +1204,16 @@ sub FindOption ($$$$$) { if ( $type eq 's' ) { # string # A mandatory string takes anything. - return (1, $opt, $ctl, $arg, $key) if $mand; + return (1, $opt, $ctl, $starter, $arg, $key) if $mand; # Same for optional string as a hash value - return (1, $opt, $ctl, $arg, $key) + return (1, $opt, $ctl, $starter, $arg, $key) if $ctl->[CTL_DEST] == CTL_DEST_HASH; # An optional string takes almost anything. - return (1, $opt, $ctl, $arg, $key) + return (1, $opt, $ctl, $starter, $arg, $key) if defined $optarg || defined $rest; - return (1, $opt, $ctl, $arg, $key) if $arg eq "-"; # ?? + return (1, $opt, $ctl, $starter, $arg, $key) if $arg eq "-"; # ?? # Check for option or option list terminator. if ($arg eq $argend || @@ -1248,7 +1265,7 @@ sub FindOption ($$$$$) { # Fake incremental type. my @c = @$ctl; $c[CTL_TYPE] = '+'; - return (1, $opt, \@c, 1); + return (1, $opt, \@c, $starter, 1); } # Supply default value. $arg = defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : 0; @@ -1293,7 +1310,7 @@ sub FindOption ($$$$$) { else { die("Getopt::Long internal error (Can't happen)\n"); } - return (1, $opt, $ctl, $arg, $key); + return (1, $opt, $ctl, $starter, $arg, $key); } sub ValidValue ($$$$$) { @@ -1529,8 +1546,9 @@ sub setup_pa_args($@) { if ( UNIVERSAL::isa($pa, 'HASH') ) { # Get rid of -msg vs. -message ambiguity. - $pa->{-message} = $pa->{-msg}; - delete($pa->{-msg}); + if (!defined $pa->{-message}) { + $pa->{-message} = delete($pa->{-msg}); + } } elsif ( $pa =~ /^-?\d+$/ ) { $pa = { -exitval => $pa }; @@ -1714,6 +1732,9 @@ disable C<$verbose> by setting its value default value, the program can find out whether C<$verbose> is false by default, or disabled by using C<--noverbose>. +(If both C<--verbose> and C<--noverbose> are given, whichever is given +last takes precedence.) + An incremental option is specified with a plus C<+> after the option name: @@ -1766,6 +1787,10 @@ of the equals sign indicates that the op this case, if no suitable value is supplied, string valued options get an empty string C<''> assigned, while numeric options are set to C<0>. +(If the same option appears more than once on the command line, the +last given value is used. If you want to take all the values, see +below.) + =head2 Options with multiple values Options sometimes take several values. For example, a program could @@ -2009,6 +2034,8 @@ considered an option on itself. =item : I [ I ] Like C<:i>, but if the value is omitted, the I will be assigned. + +If the I is octal, hexadecimal or binary, behaves like C<:o>. =item : + [ I ] Index: gnu/usr.bin/perl/cpan/Getopt-Long/t/gol-basic.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Getopt-Long/t/gol-basic.t,v diff -u -p -a -u -p -r1.1.1.2 gol-basic.t --- gnu/usr.bin/perl/cpan/Getopt-Long/t/gol-basic.t 15 Feb 2023 01:32:48 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Getopt-Long/t/gol-basic.t 21 Feb 2024 15:47:00 -0000 @@ -15,7 +15,7 @@ die("Getopt::Long version $want_version $Getopt::Long::VERSION) unless $Getopt::Long::VERSION ge $want_version; -print "1..12\n"; +print "1..18\n"; @ARGV = qw(-Foo -baR --foo bar); undef $opt_baR; @@ -43,3 +43,26 @@ print ($rv ? "" : "not "); print "ok 10\ print ("@ARGV" eq 'file' ? "" : "not ", "ok 11\n"); ( $HELP && $FOO && !$BAR && $FILE eq 'foo' && $NO == 5 ) ? print "" : print "not "; print "ok 12\n"; + +# Test behaviour when the same option name is given twice, but not an multi-value option. +# The option given later on the command line is used. +# +{ + my $foo; + + @ARGV = qw(--foo a --foo b); + $rd = GetOptions('foo=s' => \$foo); + print ($rv ? "" : "not "); print "ok 13\n"; + print ($foo eq 'b' ? "" : "not ", "ok 14\n"); + + @ARGV = qw(--no-foo --foo); + $rd = GetOptions('foo!' => \$foo); + print ($rv ? "" : "not "); print "ok 15\n"; + print ($foo eq '1' ? "" : "not ", "ok 16\n"); + + @ARGV = qw(--foo --no-foo); + $rd = GetOptions('foo!' => \$foo); + print ($rv ? "" : "not "); print "ok 17\n"; + # Check it is set to an explicit 0. + print ($foo eq '0' ? "" : "not ", "ok 18\n"); +} Index: gnu/usr.bin/perl/cpan/HTTP-Tiny/lib/HTTP/Tiny.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/HTTP-Tiny/lib/HTTP/Tiny.pm,v diff -u -p -a -u -p -r1.6 Tiny.pm --- gnu/usr.bin/perl/cpan/HTTP-Tiny/lib/HTTP/Tiny.pm 15 Feb 2023 01:36:18 -0000 1.6 +++ gnu/usr.bin/perl/cpan/HTTP-Tiny/lib/HTTP/Tiny.pm 21 Feb 2024 15:47:00 -0000 @@ -4,7 +4,7 @@ use strict; use warnings; # ABSTRACT: A small, simple, correct HTTP/1.1 client -our $VERSION = '0.080'; +our $VERSION = '0.086'; sub _croak { require Carp; Carp::croak(@_) } @@ -40,10 +40,15 @@ sub _croak { require Carp; Carp::croak(@ #pod * C — Request timeout in seconds (default is 60) If a socket open, #pod read or write takes longer than the timeout, the request response status code #pod will be 599. -#pod * C — A boolean that indicates whether to validate the SSL -#pod certificate of an C — connection (default is false) +#pod * C — A boolean that indicates whether to validate the TLS/SSL +#pod certificate of an C — connection (default is true). Changed from false +#pod to true in version 0.083. #pod * C — A hashref of C — options to pass through to #pod L +#pod * C<$ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT}> - Changes the default +#pod certificate verification behavior to not check server identity if set to 1. +#pod Only effective if C is not set. Added in version 0.083. +#pod #pod #pod An accessor/mutator method exists for each attribute. #pod @@ -111,11 +116,17 @@ sub timeout { sub new { my($class, %args) = @_; + # Support lower case verify_ssl argument, but only if verify_SSL is not + # true. + if ( exists $args{verify_ssl} ) { + $args{verify_SSL} ||= $args{verify_ssl}; + } + my $self = { max_redirect => 5, timeout => defined $args{timeout} ? $args{timeout} : 60, keep_alive => 1, - verify_SSL => $args{verify_SSL} || $args{verify_ssl} || 0, # no verification by default + verify_SSL => defined $args{verify_SSL} ? $args{verify_SSL} : _verify_SSL_default(), no_proxy => $ENV{no_proxy}, }; @@ -134,6 +145,13 @@ sub new { return $self; } +sub _verify_SSL_default { + my ($self) = @_; + # Check if insecure default certificate verification behaviour has been + # changed by the user by setting PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT=1 + return (($ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT} || '') eq '1') ? 0 : 1; +} + sub _set_proxies { my ($self) = @_; @@ -245,9 +263,10 @@ sub post_form { while ( my ($key, $value) = each %{$args->{headers} || {}} ) { $headers->{lc $key} = $value; } - delete $args->{headers}; return $self->request('POST', $url, { + # Any existing 'headers' key in $args will be overridden with a + # normalized version below. %$args, content => $self->www_form_urlencode($data), headers => { @@ -389,6 +408,10 @@ sub mirror { #pod customizing the action of the callback based on the C or C #pod received prior to the content body.) #pod +#pod Content data in the request/response is handled as "raw bytes". Any +#pod encoding/decoding (with associated headers) are the responsibility of the +#pod caller. +#pod #pod The C method returns a hashref containing the response. The hashref #pod will have the following keys: #pod @@ -1055,7 +1078,7 @@ sub new { timeout => 60, max_line_size => 16384, max_header_lines => 64, - verify_SSL => 0, + verify_SSL => HTTP::Tiny::_verify_SSL_default(), SSL_options => {}, %args }, $class; @@ -1704,7 +1727,7 @@ HTTP::Tiny - A small, simple, correct HT =head1 VERSION -version 0.080 +version 0.086 =head1 SYNOPSIS @@ -1797,12 +1820,16 @@ C — Request timeout in second =item * -C — A boolean that indicates whether to validate the SSL certificate of an C — connection (default is false) +C — A boolean that indicates whether to validate the TLS/SSL certificate of an C — connection (default is true). Changed from false to true in version 0.083. =item * C — A hashref of C — options to pass through to L +=item * + +C<$ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT}> - Changes the default certificate verification behavior to not check server identity if set to 1. Only effective if C is not set. Added in version 0.083. + =back An accessor/mutator method exists for each attribute. @@ -1943,6 +1970,10 @@ in-progress response hash reference, as customizing the action of the callback based on the C or C received prior to the content body.) +Content data in the request/response is handled as "raw bytes". Any +encoding/decoding (with associated headers) are the responsibility of the +caller. + The C method returns a hashref containing the response. The hashref will have the following keys: @@ -2043,11 +2074,11 @@ proxy timeout verify_SSL -=head1 SSL SUPPORT +=head1 TLS/SSL SUPPORT Direct C connections are supported only if L 1.56 or greater and L 1.49 or greater are installed. An error will occur -if new enough versions of these modules are not installed or if the SSL +if new enough versions of these modules are not installed or if the TLS encryption fails. You can also use C utility function that returns boolean to see if the required modules are installed. @@ -2055,7 +2086,7 @@ An C connection may be made via a command (i.e. RFC 2817). You may not proxy C via a proxy that itself requires C to communicate. -SSL provides two distinct capabilities: +TLS/SSL provides two distinct capabilities: =over 4 @@ -2069,24 +2100,17 @@ Verification of server identity =back -B. +B. -Server identity verification is controversial and potentially tricky because it -depends on a (usually paid) third-party Certificate Authority (CA) trust model -to validate a certificate as legitimate. This discriminates against servers -with self-signed certificates or certificates signed by free, community-driven -CA's such as L. - -By default, HTTP::Tiny does not make any assumptions about your trust model, -threat level or risk tolerance. It just aims to give you an encrypted channel -when you need one. - -Setting the C attribute to a true value will make HTTP::Tiny verify -that an SSL connection has a valid SSL certificate corresponding to the host -name of the connection and that the SSL certificate has been verified by a CA. -Assuming you trust the CA, this will protect against a L. If you are -concerned about security, you should enable this option. +This was changed in version 0.083 due to security concerns. The previous default +behavior can be enabled by setting C<$ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT}> +to 1. + +Verification is done by checking that that the TLS/SSL connection has a valid +certificate corresponding to the host name of the connection and that the +certificate has been verified by a CA. Assuming you trust the CA, this will +protect against L. Certificate verification requires a file containing trusted CA certificates. @@ -2094,9 +2118,7 @@ If the environment variable C module is installed, HTTP::Tiny will use the CA file -included with it as a source of trusted CA's. (This means you trust Mozilla, -the author of Mozilla::CA, the CPAN mirror where you got Mozilla::CA, the -toolchain used to install it, and your operating system security, right?) +included with it as a source of trusted CA's. If that module is not available, then HTTP::Tiny will search several system-specific default locations for a CA certificate file: @@ -2115,13 +2137,33 @@ system-specific default locations for a /etc/ssl/ca-bundle.pem +=item * + +/etc/openssl/certs/ca-certificates.crt + +=item * + +/etc/ssl/cert.pem + +=item * + +/usr/local/share/certs/ca-root-nss.crt + +=item * + +/etc/pki/tls/cacert.pem + +=item * + +/etc/certs/ca-certificates.crt + =back An error will be occur if C is true and no CA certificate file is available. -If you desire complete control over SSL connections, the C attribute -lets you provide a hash reference that will be passed through to +If you desire complete control over TLS/SSL connections, the C +attribute lets you provide a hash reference that will be passed through to C, overriding any options set by HTTP::Tiny. For example, to provide your own trusted CA file: @@ -2131,7 +2173,7 @@ example, to provide your own trusted CA The C attribute could also be used for such things as providing a client certificate for authentication to a server or controlling the choice of -cipher used for the SSL connection. See L documentation for +cipher used for the TLS/SSL connection. See L documentation for details. =head1 PROXY SUPPORT @@ -2337,7 +2379,7 @@ David Golden =head1 CONTRIBUTORS -=for stopwords Alan Gardner Alessandro Ghedini A. Sinan Unur Brad Gilbert brian m. carlson Chris Nehren Weyl Claes Jakobsson Clinton Gormley Craig Berry David Golden Mitchell Dean Pearce Edward Zborowski Felipe Gasper Greg Kennedy James E Keenan Raspass Jeremy Mates Jess Robinson Karen Etheridge Lukas Eklund Martin J. Evans Martin-Louis Bright Matthew Horsfall Michael R. Davis Mike Doherty Nicolas Rochelemagne Olaf Alders Olivier Mengué Petr Písař sanjay-cpu Serguei Trouchelle Shoichi Kaji SkyMarshal Sören Kornetzki Steve Grazzini Syohei YOSHIDA Tatsuhiko Miyagawa Tom Hukins Tony Cook Xavier Guimard +=for stopwords Alan Gardner Alessandro Ghedini A. Sinan Unur Brad Gilbert brian m. carlson Chris Nehren Weyl Claes Jakobsson Clinton Gormley Craig Berry David Golden Mitchell Dean Pearce Edward Zborowski Felipe Gasper Graham Knop Greg Kennedy James E Keenan Raspass Jeremy Mates Jess Robinson Karen Etheridge Lukas Eklund Martin J. Evans Martin-Louis Bright Matthew Horsfall Michael R. Davis Mike Doherty Nicolas Rochelemagne Olaf Alders Olivier Mengué Petr Písař sanjay-cpu Serguei Trouchelle Shoichi Kaji SkyMarshal Sören Kornetzki Steve Grazzini Stig Palmquist Syohei YOSHIDA Tatsuhiko Miyagawa Tom Hukins Tony Cook Xavier Guimard =over 4 @@ -2407,6 +2449,10 @@ Felipe Gasper =item * +Graham Knop + +=item * + Greg Kennedy =item * @@ -2495,6 +2541,10 @@ Steve Grazzini + +=item * + Syohei YOSHIDA =item * @@ -2517,7 +2567,7 @@ Xavier Guimard =head1 COPYRIGHT AND LICENSE -This software is copyright (c) 2021 by Christian Hansen. +This software is copyright (c) 2023 by Christian Hansen. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Index: gnu/usr.bin/perl/cpan/HTTP-Tiny/t/180_verify_SSL.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/HTTP-Tiny/t/180_verify_SSL.t diff -N gnu/usr.bin/perl/cpan/HTTP-Tiny/t/180_verify_SSL.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/HTTP-Tiny/t/180_verify_SSL.t 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,109 @@ +#!perl + +use strict; +use warnings; +use Test::More 0.88; +use lib 't'; + +use HTTP::Tiny; + +delete $ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT}; + +{ + my $ht = HTTP::Tiny->new(); + is($ht->verify_SSL, 1, "verify_SSL is 1 by default"); +} + +{ + my $ht = HTTP::Tiny->new( + verify_SSL => 0 + ); + is($ht->verify_SSL, 0, "verify_SSL=>0 sets 0"); +} + +{ + my $ht = HTTP::Tiny->new( + verify_ssl => 0 + ); + is($ht->verify_SSL, 0, "verify_ssl=>0 sets 0"); +} + +{ + my $ht = HTTP::Tiny->new( + verify_SSL => 1, + verify_ssl => 0 + ); + is($ht->verify_SSL, 1, "verify_SSL=>1 and verify_ssl=>0 sets 1"); +} + +{ + my $ht = HTTP::Tiny->new( + verify_SSL => 0, + verify_ssl => 1 + ); + is($ht->verify_SSL, 1, "verify_SSL=>0 and verify_ssl=>1 sets 1"); +} + +{ + my $ht = HTTP::Tiny->new( + verify_SSL => 0, + verify_ssl => 0 + ); + is($ht->verify_SSL, 0, "verify_SSL=>0 and verify_ssl=>0 sets 0"); +} + +{ + local $ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT} = "1"; + my $ht = HTTP::Tiny->new(); + is($ht->verify_SSL, 0, "PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT=1 changes verify_SSL default to 0"); +} + +{ + local $ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT} = "0"; + my $ht = HTTP::Tiny->new(); + is($ht->verify_SSL, 1, "PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT=0 keeps verify_SSL default at 1"); +} + +{ + local $ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT} = "False"; + my $ht = HTTP::Tiny->new(); + is($ht->verify_SSL, 1, "Unsupported PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT=False keeps verify_SSL default at 1"); +} + +{ + local $ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT} = "1"; + my $ht = HTTP::Tiny->new(verify_SSL=>1); + is($ht->verify_SSL, 1, "PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT=1 does not override verify_SSL attribute set to 1"); +} + +{ + local $ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT} = "1"; + my $ht = HTTP::Tiny->new( + verify_SSL => 1, + verify_ssl => 1 + ); + is($ht->verify_SSL, 1, "PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT=1, verify_SSL=>1 and verify_ssl=>1 sets 1"); +} + +{ + local $ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT} = "1"; + my $ht = HTTP::Tiny->new( + verify_SSL => 1, + verify_ssl => 0 + ); + is($ht->verify_SSL, 1, "PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT=1, verify_SSL=>1 and verify_ssl=>0 sets 1"); +} + +{ + local $ENV{PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT} = "1"; + my $ht = HTTP::Tiny->new( + verify_SSL => 0, + verify_ssl => 0 + ); + is($ht->verify_SSL, 0, "PERL_HTTP_TINY_SSL_INSECURE_BY_DEFAULT=1, verify_SSL=>0 and verify_ssl=>0 sets 0"); +} + + + +done_testing; + Index: gnu/usr.bin/perl/cpan/IO-Compress/Makefile.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/Makefile.PL,v diff -u -p -a -u -p -r1.7 Makefile.PL --- gnu/usr.bin/perl/cpan/IO-Compress/Makefile.PL 15 Feb 2023 01:36:18 -0000 1.7 +++ gnu/usr.bin/perl/cpan/IO-Compress/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -3,8 +3,8 @@ use strict ; require 5.006 ; -$::VERSION = '2.106' ; -$::DEP_VERSION = '2.103'; +$::VERSION = '2.204' ; +$::DEP_VERSION = '2.204'; use lib '.'; use private::MakeUtil; @@ -29,6 +29,7 @@ WriteMakefile( 'Compress::Raw::Zlib' => $::DEP_VERSION, 'Scalar::Util' => 0, 'Encode' => 0, + 'Time::Local' => 0, $] >= 5.005 && $] < 5.006 ? ('File::BSDGlob' => 0) : () } Index: gnu/usr.bin/perl/cpan/IO-Compress/bin/streamzip =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/bin/streamzip,v diff -u -p -a -u -p -r1.1.1.2 streamzip --- gnu/usr.bin/perl/cpan/IO-Compress/bin/streamzip 15 Feb 2023 01:32:41 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/IO-Compress/bin/streamzip 21 Feb 2024 15:47:01 -0000 @@ -12,7 +12,7 @@ use IO::Compress::Zip qw(zip use Getopt::Long; -my $VERSION = '1.002'; +my $VERSION = '1.00'; my $compression_method = ZIP_CM_DEFLATE; my $stream = 0; @@ -51,6 +51,10 @@ if ($compression_method == ZIP_CM_DEFLAT push @extraOpts, (Level => $level) } +# force streaming zip file when writing to stdout. +$stream = 1 + if $zipfile eq '-'; + zip '-' => $zipfile, Name => $memberName, Zip64 => $zip64, @@ -107,7 +111,8 @@ Usage: producer | streamzip [OPTIONS] | consumer producer | streamzip [OPTIONS] -zipfile output.zip -Stream data from stdin, compress into a Zip container, and stream to stdout. +Stream data from stdin, compress into a Zip container, and either stream to stdout, or +write to a named file. OPTIONS @@ -131,7 +136,7 @@ OPTIONS zstd Use LZMA compression [needs IO::Compress::Zstd] -version Display version number [$VERSION] -Copyright (c) 2019-2021 Paul Marquess. All rights reserved. +Copyright (c) 2019-2022 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. @@ -287,7 +292,7 @@ Paul Marquess F. =head1 COPYRIGHT -Copyright (c) 2019-2021 Paul Marquess. All rights reserved. +Copyright (c) 2019-2022 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/Compress/Zlib.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/Compress/Zlib.pm,v diff -u -p -a -u -p -r1.7 Zlib.pm --- gnu/usr.bin/perl/cpan/IO-Compress/lib/Compress/Zlib.pm 15 Feb 2023 01:36:18 -0000 1.7 +++ gnu/usr.bin/perl/cpan/IO-Compress/lib/Compress/Zlib.pm 21 Feb 2024 15:47:01 -0000 @@ -7,17 +7,17 @@ use Carp ; use IO::Handle ; use Scalar::Util qw(dualvar); -use IO::Compress::Base::Common 2.106 ; -use Compress::Raw::Zlib 2.103 ; -use IO::Compress::Gzip 2.106 ; -use IO::Uncompress::Gunzip 2.106 ; +use IO::Compress::Base::Common 2.204 ; +use Compress::Raw::Zlib 2.204 ; +use IO::Compress::Gzip 2.204 ; +use IO::Uncompress::Gunzip 2.204 ; use strict ; use warnings ; use bytes ; our ($VERSION, $XS_VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); -$VERSION = '2.106'; +$VERSION = '2.204'; $XS_VERSION = $VERSION; $VERSION = eval $VERSION; @@ -461,7 +461,7 @@ sub inflate package Compress::Zlib ; -use IO::Compress::Gzip::Constants 2.106 ; +use IO::Compress::Gzip::Constants 2.204 ; sub memGzip($) { @@ -1494,6 +1494,9 @@ C and Mark Adler C The primary site for the I compression library is L. +The primary site for the I compression library is +L. + The primary site for gzip is L. =head1 AUTHOR @@ -1506,7 +1509,7 @@ See the Changes file. =head1 COPYRIGHT AND LICENSE -Copyright (c) 1995-2022 Paul Marquess. All rights reserved. +Copyright (c) 1995-2023 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Base.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Base.pm,v diff -u -p -a -u -p -r1.7 Base.pm --- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Base.pm 15 Feb 2023 01:36:18 -0000 1.7 +++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Base.pm 21 Feb 2024 15:47:01 -0000 @@ -6,7 +6,7 @@ require 5.006 ; use strict ; use warnings; -use IO::Compress::Base::Common 2.106 ; +use IO::Compress::Base::Common 2.204 ; use IO::File (); ; use Scalar::Util (); @@ -20,7 +20,7 @@ use Symbol(); our (@ISA, $VERSION); @ISA = qw(IO::File Exporter); -$VERSION = '2.106'; +$VERSION = '2.204'; #Can't locate object method "SWASHNEW" via package "utf8" (perhaps you forgot to load "utf8"?) at .../ext/Compress-Zlib/Gzip/blib/lib/Compress/Zlib/Common.pm line 16. @@ -1051,7 +1051,7 @@ See the Changes file. =head1 COPYRIGHT AND LICENSE -Copyright (c) 2005-2022 Paul Marquess. All rights reserved. +Copyright (c) 2005-2023 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Bzip2.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Bzip2.pm,v diff -u -p -a -u -p -r1.7 Bzip2.pm --- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Bzip2.pm 15 Feb 2023 01:36:18 -0000 1.7 +++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Bzip2.pm 21 Feb 2024 15:47:01 -0000 @@ -5,16 +5,16 @@ use warnings; use bytes; require Exporter ; -use IO::Compress::Base 2.106 ; +use IO::Compress::Base 2.204 ; -use IO::Compress::Base::Common 2.106 qw(); -use IO::Compress::Adapter::Bzip2 2.106 ; +use IO::Compress::Base::Common 2.204 qw(); +use IO::Compress::Adapter::Bzip2 2.204 ; our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bzip2Error); -$VERSION = '2.106'; +$VERSION = '2.204'; $Bzip2Error = ''; @ISA = qw(IO::Compress::Base Exporter); @@ -51,7 +51,7 @@ sub getExtraParams { my $self = shift ; - use IO::Compress::Base::Common 2.106 qw(:Parse); + use IO::Compress::Base::Common 2.204 qw(:Parse); return ( 'blocksize100k' => [IO::Compress::Base::Common::Parse_unsigned, 1], @@ -818,7 +818,7 @@ See the Changes file. =head1 COPYRIGHT AND LICENSE -Copyright (c) 2005-2022 Paul Marquess. All rights reserved. +Copyright (c) 2005-2023 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Deflate.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Deflate.pm,v diff -u -p -a -u -p -r1.7 Deflate.pm --- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Deflate.pm 15 Feb 2023 01:36:18 -0000 1.7 +++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Deflate.pm 21 Feb 2024 15:47:01 -0000 @@ -8,16 +8,16 @@ use bytes; require Exporter ; -use IO::Compress::RawDeflate 2.106 (); -use IO::Compress::Adapter::Deflate 2.106 ; +use IO::Compress::RawDeflate 2.204 (); +use IO::Compress::Adapter::Deflate 2.204 ; -use IO::Compress::Zlib::Constants 2.106 ; -use IO::Compress::Base::Common 2.106 qw(); +use IO::Compress::Zlib::Constants 2.204 ; +use IO::Compress::Base::Common 2.204 qw(); our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $DeflateError); -$VERSION = '2.106'; +$VERSION = '2.204'; $DeflateError = ''; @ISA = qw(IO::Compress::RawDeflate Exporter); @@ -42,92 +42,35 @@ sub deflate return $obj->_def(@_); } - -sub bitmask($$$$) -{ - my $into = shift ; - my $value = shift ; - my $offset = shift ; - my $mask = shift ; - - return $into | (($value & $mask) << $offset ) ; -} - -sub mkDeflateHdr($$$;$) -{ - my $method = shift ; - my $cinfo = shift; - my $level = shift; - my $fdict_adler = shift ; - - my $cmf = 0; - my $flg = 0; - my $fdict = 0; - $fdict = 1 if defined $fdict_adler; - - $cmf = bitmask($cmf, $method, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS); - $cmf = bitmask($cmf, $cinfo, ZLIB_CMF_CINFO_OFFSET, ZLIB_CMF_CINFO_BITS); - - $flg = bitmask($flg, $fdict, ZLIB_FLG_FDICT_OFFSET, ZLIB_FLG_FDICT_BITS); - $flg = bitmask($flg, $level, ZLIB_FLG_LEVEL_OFFSET, ZLIB_FLG_LEVEL_BITS); - - my $fcheck = 31 - ($cmf * 256 + $flg) % 31 ; - $flg = bitmask($flg, $fcheck, ZLIB_FLG_FCHECK_OFFSET, ZLIB_FLG_FCHECK_BITS); - - my $hdr = pack("CC", $cmf, $flg) ; - $hdr .= pack("N", $fdict_adler) if $fdict ; - - return $hdr; -} - -sub mkHeader +sub mkComp { my $self = shift ; - my $param = shift ; + my $got = shift ; - my $level = $param->getValue('level'); - my $strategy = $param->getValue('strategy'); + my ($obj, $errstr, $errno) = IO::Compress::Adapter::Deflate::mkCompObject1( + $got->getValue('crc32'), + $got->getValue('adler32'), + $got->getValue('level'), + $got->getValue('strategy') + ); - my $lflag ; - $level = 6 - if $level == Z_DEFAULT_COMPRESSION ; + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; - if (ZLIB_VERNUM >= 0x1210) - { - if ($strategy >= Z_HUFFMAN_ONLY || $level < 2) - { $lflag = ZLIB_FLG_LEVEL_FASTEST } - elsif ($level < 6) - { $lflag = ZLIB_FLG_LEVEL_FAST } - elsif ($level == 6) - { $lflag = ZLIB_FLG_LEVEL_DEFAULT } - else - { $lflag = ZLIB_FLG_LEVEL_SLOWEST } - } - else - { - $lflag = ($level - 1) >> 1 ; - $lflag = 3 if $lflag > 3 ; - } - - #my $wbits = (MAX_WBITS - 8) << 4 ; - my $wbits = 7; - mkDeflateHdr(ZLIB_CMF_CM_DEFLATED, $wbits, $lflag); + return $obj; } -sub ckParams + +sub mkHeader { my $self = shift ; - my $got = shift; - - $got->setValue('adler32' => 1); - return 1 ; + return ''; } - sub mkTrailer { my $self = shift ; - return pack("N", *$self->{Compress}->adler32()) ; + return ''; } sub mkFinalTrailer @@ -135,12 +78,6 @@ sub mkFinalTrailer return ''; } -#sub newHeader -#{ -# my $self = shift ; -# return *$self->{Header}; -#} - sub getExtraParams { my $self = shift ; @@ -940,6 +877,9 @@ C and Mark Adler C The primary site for the I compression library is L. +The primary site for the I compression library is +L. + The primary site for gzip is L. =head1 AUTHOR @@ -952,7 +892,7 @@ See the Changes file. =head1 COPYRIGHT AND LICENSE -Copyright (c) 2005-2022 Paul Marquess. All rights reserved. +Copyright (c) 2005-2023 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/FAQ.pod =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/FAQ.pod,v diff -u -p -a -u -p -r1.6 FAQ.pod --- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/FAQ.pod 15 Feb 2023 01:36:18 -0000 1.6 +++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/FAQ.pod 21 Feb 2024 15:47:01 -0000 @@ -682,7 +682,7 @@ See the Changes file. =head1 COPYRIGHT AND LICENSE -Copyright (c) 2005-2022 Paul Marquess. All rights reserved. +Copyright (c) 2005-2023 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Gzip.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Gzip.pm,v diff -u -p -a -u -p -r1.7 Gzip.pm --- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Gzip.pm 15 Feb 2023 01:36:18 -0000 1.7 +++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Gzip.pm 21 Feb 2024 15:47:01 -0000 @@ -8,12 +8,12 @@ use bytes; require Exporter ; -use IO::Compress::RawDeflate 2.106 () ; -use IO::Compress::Adapter::Deflate 2.106 ; +use IO::Compress::RawDeflate 2.204 () ; +use IO::Compress::Adapter::Deflate 2.204 ; -use IO::Compress::Base::Common 2.106 qw(:Status ); -use IO::Compress::Gzip::Constants 2.106 ; -use IO::Compress::Zlib::Extra 2.106 ; +use IO::Compress::Base::Common 2.204 qw(:Status ); +use IO::Compress::Gzip::Constants 2.204 ; +use IO::Compress::Zlib::Extra 2.204 ; BEGIN { @@ -25,7 +25,7 @@ BEGIN our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $GzipError); -$VERSION = '2.106'; +$VERSION = '2.204'; $GzipError = '' ; @ISA = qw(IO::Compress::RawDeflate Exporter); @@ -1252,6 +1252,9 @@ C and Mark Adler C The primary site for the I compression library is L. +The primary site for the I compression library is +L. + The primary site for gzip is L. =head1 AUTHOR @@ -1264,7 +1267,7 @@ See the Changes file. =head1 COPYRIGHT AND LICENSE -Copyright (c) 2005-2022 Paul Marquess. All rights reserved. +Copyright (c) 2005-2023 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm,v diff -u -p -a -u -p -r1.7 RawDeflate.pm --- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm 15 Feb 2023 01:36:18 -0000 1.7 +++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/RawDeflate.pm 21 Feb 2024 15:47:01 -0000 @@ -6,16 +6,16 @@ use strict ; use warnings; use bytes; -use IO::Compress::Base 2.106 ; -use IO::Compress::Base::Common 2.106 qw(:Status :Parse); -use IO::Compress::Adapter::Deflate 2.106 ; -use Compress::Raw::Zlib 2.103 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY); +use IO::Compress::Base 2.204 ; +use IO::Compress::Base::Common 2.204 qw(:Status :Parse); +use IO::Compress::Adapter::Deflate 2.204 ; +use Compress::Raw::Zlib 2.204 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY); require Exporter ; our ($VERSION, @ISA, @EXPORT_OK, %DEFLATE_CONSTANTS, %EXPORT_TAGS, $RawDeflateError); -$VERSION = '2.106'; +$VERSION = '2.204'; $RawDeflateError = ''; @ISA = qw(IO::Compress::Base Exporter); @@ -995,6 +995,9 @@ C and Mark Adler C The primary site for the I compression library is L. +The primary site for the I compression library is +L. + The primary site for gzip is L. =head1 AUTHOR @@ -1007,7 +1010,7 @@ See the Changes file. =head1 COPYRIGHT AND LICENSE -Copyright (c) 2005-2022 Paul Marquess. All rights reserved. +Copyright (c) 2005-2023 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zip.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zip.pm,v diff -u -p -a -u -p -r1.7 Zip.pm --- gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zip.pm 15 Feb 2023 01:36:18 -0000 1.7 +++ gnu/usr.bin/perl/cpan/IO-Compress/lib/IO/Compress/Zip.pm 21 Feb 2024 15:47:01 -0000 @@ -4,41 +4,41 @@ use strict ; use warnings; use bytes; -use IO::Compress::Base::Common 2.106 qw(:Status ); -use IO::Compress::RawDeflate 2.106 (); -use IO::Compress::Adapter::Deflate 2.106 ; -use IO::Compress::Adapter::Identity 2.106 ; -use IO::Compress::Zlib::Extra 2.106 ; -use IO::Compress::Zip::Constants 2.106 ; +use IO::Compress::Base::Common 2.204 qw(:Status ); +use IO::Compress::RawDeflate 2.204 (); +use IO::Compress::Adapter::Deflate 2.204 ; +use IO::Compress::Adapter::Identity 2.204 ; +use IO::Compress::Zlib::Extra 2.204 ; +use IO::Compress::Zip::Constants 2.204 ; use File::Spec(); use Config; -use Compress::Raw::Zlib 2.103 (); +use Compress::Raw::Zlib 2.204 (); BEGIN { eval { require IO::Compress::Adapter::Bzip2 ; - IO::Compress::Adapter::Bzip2->import( 2.103 ); + IO::Compress::Adapter::Bzip2->import( 2.201 ); require IO::Compress::Bzip2 ; - IO::Compress::Bzip2->import( 2.103 ); + IO::Compress::Bzip2->import( 2.201 ); } ; eval { require IO::Compress::Adapter::Lzma ; - IO::Compress::Adapter::Lzma->import( 2.103 ); + IO::Compress::Adapter::Lzma->import( 2.201 ); require IO::Compress::Lzma ; - IO::Compress::Lzma->import( 2.103 ); + IO::Compress::Lzma->import( 2.201 ); } ; eval { require IO::Compress::Adapter::Xz ; - IO::Compress::Adapter::Xz->import( 2.103 ); + IO::Compress::Adapter::Xz->import( 2.201 ); require IO::Compress::Xz ; - IO::Compress::Xz->import( 2.103 ); + IO::Compress::Xz->import( 2.201 ); } ; eval { require IO::Compress::Adapter::Zstd ; - IO::Compress::Adapter::Zstd->import( 2.103 ); + IO::Compress::Adapter::Zstd->import( 2.201 ); require IO::Compress::Zstd ; - IO::Compress::Zstd->import( 2.103 ); + IO::Compress::Zstd->import( 2.201 ); } ; } @@ -47,7 +47,7 @@ require Exporter ; our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $ZipError); -$VERSION = '2.106'; +$VERSION = '2.204'; $ZipError = ''; @ISA = qw(IO::Compress::RawDeflate Exporter); @@ -85,20 +85,24 @@ sub isMethodAvailable if $method == ZIP_CM_STORE || $method == ZIP_CM_DEFLATE ; return 1 - if $method == ZIP_CM_BZIP2 and - defined $IO::Compress::Adapter::Bzip2::VERSION; + if $method == ZIP_CM_BZIP2 && + defined $IO::Compress::Adapter::Bzip2::VERSION && + defined &{ "IO::Compress::Adapter::Bzip2::mkRawZipCompObject" }; return 1 - if $method == ZIP_CM_LZMA and - defined $IO::Compress::Adapter::Lzma::VERSION; + if $method == ZIP_CM_LZMA && + defined $IO::Compress::Adapter::Lzma::VERSION && + defined &{ "IO::Compress::Adapter::Lzma::mkRawZipCompObject" }; return 1 - if $method == ZIP_CM_XZ and - defined $IO::Compress::Adapter::Xz::VERSION; + if $method == ZIP_CM_XZ && + defined $IO::Compress::Adapter::Xz::VERSION && + defined &{ "IO::Compress::Adapter::Xz::mkRawZipCompObject" }; return 1 - if $method == ZIP_CM_ZSTD and - defined $IO::Compress::Adapter::ZSTD::VERSION; + if $method == ZIP_CM_ZSTD && + defined $IO::Compress::Adapter::ZSTD::VERSION && + defined &{ "IO::Compress::Adapter::ZSTD::mkRawZipCompObject" }; return 0; } @@ -566,6 +570,8 @@ sub mkFinalTrailer $z64e .= U64::pack_V64 $entries ; # entries in central dir $z64e .= U64::pack_V64 $cd_len ; # size of central dir $z64e .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to start central dir + $z64e .= *$self->{ZipData}{extrafieldzip64} # otional extra field + if defined *$self->{ZipData}{extrafieldzip64} ; $z64e = pack("V", ZIP64_END_CENTRAL_REC_HDR_SIG) # signature . U64::pack_V64(length $z64e) @@ -638,7 +644,7 @@ sub ckParams } *$self->{ZipData}{AnyZip64} = 1 - if $got->getValue('zip64'); + if $got->getValue('zip64') || $got->getValue('extrafieldzip64') ; *$self->{ZipData}{Zip64} = $got->getValue('zip64'); *$self->{ZipData}{Stream} = $got->getValue('stream'); @@ -658,7 +664,7 @@ sub ckParams *$self->{ZipData}{ZipComment} = $got->getValue('zipcomment') ; - for my $name (qw( extrafieldlocal extrafieldcentral )) + for my $name (qw( extrafieldlocal extrafieldcentral extrafieldzip64)) { my $data = $got->getValue($name) ; if (defined $data) { @@ -667,6 +673,7 @@ sub ckParams if $bad ; $got->setValue($name, $data) ; + *$self->{ZipData}{$name} = $data; } } @@ -731,6 +738,7 @@ our %PARAMS = ( 'textflag' => [IO::Compress::Base::Common::Parse_boolean, 0], 'extrafieldlocal' => [IO::Compress::Base::Common::Parse_any, undef], 'extrafieldcentral'=> [IO::Compress::Base::Common::Parse_any, undef], + 'extrafieldzip64' => [IO::Compress::Base::Common::Parse_any, undef], # Lzma 'preset' => [IO::Compress::Base::Common::Parse_unsigned, 6], @@ -1053,12 +1061,24 @@ See L If the C<$input_filename_or_reference> parameter is any other type, C will be returned. -In addition, if C<$input_filename_or_reference> is a simple filename, -the default values for -the C, C is the I part and C is the I part. The -arithmetic with complex numbers is straightforward. You have to -keep track of the real and the imaginary parts, but otherwise the -rules used for real numbers just apply: - - (4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i - (2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i - -A graphical representation of complex numbers is possible in a plane -(also called the I, but it's really a 2D plane). -The number - - z = a + bi - -is the point whose coordinates are (a, b). Actually, it would -be the vector originating from (0, 0) to (a, b). It follows that the addition -of two complex numbers is a vectorial addition. - -Since there is a bijection between a point in the 2D plane and a complex -number (i.e. the mapping is unique and reciprocal), a complex number -can also be uniquely identified with polar coordinates: - - [rho, theta] - -where C is the distance to the origin, and C the angle between -the vector and the I axis. There is a notation for this using the -exponential form, which is: - - rho * exp(i * theta) - -where I is the famous imaginary number introduced above. Conversion -between this form and the cartesian form C is immediate: - - a = rho * cos(theta) - b = rho * sin(theta) - -which is also expressed by this formula: - - z = rho * exp(i * theta) = rho * (cos theta + i * sin theta) - -In other words, it's the projection of the vector onto the I and I -axes. Mathematicians call I the I or I and I -the I of the complex number. The I of C is -marked here as C. - -The polar notation (also known as the trigonometric representation) is -much more handy for performing multiplications and divisions of -complex numbers, whilst the cartesian notation is better suited for -additions and subtractions. Real numbers are on the I axis, and -therefore I or I is zero or I. - -All the common operations that can be performed on a real number have -been defined to work on complex numbers as well, and are merely -I of the operations defined on real numbers. This means -they keep their natural meaning when there is no imaginary part, provided -the number is within their definition set. - -For instance, the C routine which computes the square root of -its argument is only defined for non-negative real numbers and yields a -non-negative real number (it is an application from B to B). -If we allow it to return a complex number, then it can be extended to -negative real numbers to become an application from B to B (the -set of complex numbers): - - sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i - -It can also be extended to be an application from B to B, -whilst its restriction to B behaves as defined above by using -the following definition: - - sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2) - -Indeed, a negative real number can be noted C<[x,pi]> (the modulus -I is always non-negative, so C<[x,pi]> is really C<-x>, a negative -number) and the above definition states that - - sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i - -which is exactly what we had defined for negative real numbers above. -The C returns only one of the solutions: if you want the both, -use the C function. - -All the common mathematical functions defined on real numbers that -are extended to complex numbers share that same property of working -I when the imaginary part is zero (otherwise, it would not -be called an extension, would it?). - -A I operation possible on a complex number that is -the identity for real numbers is called the I, and is noted -with a horizontal bar above the number, or C<~z> here. - - z = a + bi - ~z = a - bi - -Simple... Now look: - - z * ~z = (a + bi) * (a - bi) = a*a + b*b - -We saw that the norm of C was noted C and was defined as the -distance to the origin, also known as: - - rho = abs(z) = sqrt(a*a + b*b) - -so - - z * ~z = abs(z) ** 2 - -If z is a pure real number (i.e. C), then the above yields: - - a * a = abs(a) ** 2 - -which is true (C has the regular meaning for real number, i.e. stands -for the absolute value). This example explains why the norm of C is -noted C: it extends the C function to complex numbers, yet -is the regular C we know when the complex number actually has no -imaginary part... This justifies I our use of the C -notation for the norm. - -=head1 OPERATIONS - -Given the following notations: - - z1 = a + bi = r1 * exp(i * t1) - z2 = c + di = r2 * exp(i * t2) - z = - -the following (overloaded) operations are supported on complex numbers: - - z1 + z2 = (a + c) + i(b + d) - z1 - z2 = (a - c) + i(b - d) - z1 * z2 = (r1 * r2) * exp(i * (t1 + t2)) - z1 / z2 = (r1 / r2) * exp(i * (t1 - t2)) - z1 ** z2 = exp(z2 * log z1) - ~z = a - bi - abs(z) = r1 = sqrt(a*a + b*b) - sqrt(z) = sqrt(r1) * exp(i * t/2) - exp(z) = exp(a) * exp(i * b) - log(z) = log(r1) + i*t - sin(z) = 1/2i (exp(i * z1) - exp(-i * z)) - cos(z) = 1/2 (exp(i * z1) + exp(-i * z)) - atan2(y, x) = atan(y / x) # Minding the right quadrant, note the order. - -The definition used for complex arguments of atan2() is - - -i log((x + iy)/sqrt(x*x+y*y)) - -Note that atan2(0, 0) is not well-defined. - -The following extra operations are supported on both real and complex -numbers: - - Re(z) = a - Im(z) = b - arg(z) = t - abs(z) = r - - cbrt(z) = z ** (1/3) - log10(z) = log(z) / log(10) - logn(z, n) = log(z) / log(n) - - tan(z) = sin(z) / cos(z) - - csc(z) = 1 / sin(z) - sec(z) = 1 / cos(z) - cot(z) = 1 / tan(z) - - asin(z) = -i * log(i*z + sqrt(1-z*z)) - acos(z) = -i * log(z + i*sqrt(1-z*z)) - atan(z) = i/2 * log((i+z) / (i-z)) - - acsc(z) = asin(1 / z) - asec(z) = acos(1 / z) - acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i)) - - sinh(z) = 1/2 (exp(z) - exp(-z)) - cosh(z) = 1/2 (exp(z) + exp(-z)) - tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z)) - - csch(z) = 1 / sinh(z) - sech(z) = 1 / cosh(z) - coth(z) = 1 / tanh(z) - - asinh(z) = log(z + sqrt(z*z+1)) - acosh(z) = log(z + sqrt(z*z-1)) - atanh(z) = 1/2 * log((1+z) / (1-z)) - - acsch(z) = asinh(1 / z) - asech(z) = acosh(1 / z) - acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1)) - -I, I, I, I, I, I, I, I, -I, I, I, have aliases I, I, I, -I, I, I, I, I, I, -I, I, respectively. C, C, C, C, -C, and C can be used also as mutators. The C -returns only one of the solutions: if you want all three, use the -C function. - -The I function is available to compute all the I -roots of some complex, where I is a strictly positive integer. -There are exactly I such roots, returned as a list. Getting the -number mathematicians call C such that: - - 1 + j + j*j = 0; - -is a simple matter of writing: - - $j = ((root(1, 3))[1]; - -The Ith root for C is given by: - - (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n) - -You can return the Ith root directly by C, -indexing starting from I and ending at I. - -The I numeric comparison operator, E=E, is also -defined. In order to ensure its restriction to real numbers is conform -to what you would expect, the comparison is run on the real part of -the complex number first, and imaginary parts are compared only when -the real parts match. - -=head1 CREATION - -To create a complex number, use either: - - $z = Math::Complex->make(3, 4); - $z = cplx(3, 4); - -if you know the cartesian form of the number, or - - $z = 3 + 4*i; - -if you like. To create a number using the polar form, use either: - - $z = Math::Complex->emake(5, pi/3); - $x = cplxe(5, pi/3); - -instead. The first argument is the modulus, the second is the angle -(in radians, the full circle is 2*pi). (Mnemonic: C is used as a -notation for complex numbers in the polar form). - -It is possible to write: - - $x = cplxe(-3, pi/4); - -but that will be silently converted into C<[3,-3pi/4]>, since the -modulus must be non-negative (it represents the distance to the origin -in the complex plane). - -It is also possible to have a complex number as either argument of the -C, C, C, and C: the appropriate component of -the argument will be used. - - $z1 = cplx(-2, 1); - $z2 = cplx($z1, 4); - -The C, C, C, C, and C will also -understand a single (string) argument of the forms - - 2-3i - -3i - [2,3] - [2,-3pi/4] - [2] - -in which case the appropriate cartesian and exponential components -will be parsed from the string and used to create new complex numbers. -The imaginary component and the theta, respectively, will default to zero. - -The C, C, C, C, and C will also -understand the case of no arguments: this means plain zero or (0, 0). - -=head1 DISPLAYING - -When printed, a complex number is usually shown under its cartesian -style I, but there are legitimate cases where the polar style -I<[r,t]> is more appropriate. The process of converting the complex -number into a string that can be displayed is known as I. - -By calling the class method C and -supplying either C<"polar"> or C<"cartesian"> as an argument, you -override the default display style, which is C<"cartesian">. Not -supplying any argument returns the current settings. - -This default can be overridden on a per-number basis by calling the -C method instead. As before, not supplying any argument -returns the current display style for this number. Otherwise whatever you -specify will be the new display style for I particular number. - -For instance: - - use Math::Complex; - - Math::Complex::display_format('polar'); - $j = (root(1, 3))[1]; - print "j = $j\n"; # Prints "j = [1,2pi/3]" - $j->display_format('cartesian'); - print "j = $j\n"; # Prints "j = -0.5+0.866025403784439i" - -The polar style attempts to emphasize arguments like I -(where I is a positive integer and I an integer within [-9, +9]), -this is called I. - -For the reverse of stringifying, see the C and C. - -=head2 CHANGED IN PERL 5.6 - -The C class method and the corresponding -C object method can now be called using -a parameter hash instead of just a one parameter. - -The old display format style, which can have values C<"cartesian"> or -C<"polar">, can be changed using the C<"style"> parameter. - - $j->display_format(style => "polar"); - -The one parameter calling convention also still works. - - $j->display_format("polar"); - -There are two new display parameters. - -The first one is C<"format">, which is a sprintf()-style format string -to be used for both numeric parts of the complex number(s). The is -somewhat system-dependent but most often it corresponds to C<"%.15g">. -You can revert to the default by setting the C to C. - - # the $j from the above example - - $j->display_format('format' => '%.5f'); - print "j = $j\n"; # Prints "j = -0.50000+0.86603i" - $j->display_format('format' => undef); - print "j = $j\n"; # Prints "j = -0.5+0.86603i" - -Notice that this affects also the return values of the -C methods: in list context the whole parameter hash -will be returned, as opposed to only the style parameter value. -This is a potential incompatibility with earlier versions if you -have been calling the C method in list context. - -The second new display parameter is C<"polar_pretty_print">, which can -be set to true or false, the default being true. See the previous -section for what this means. - -=head1 USAGE - -Thanks to overloading, the handling of arithmetics with complex numbers -is simple and almost transparent. - -Here are some examples: - - use Math::Complex; - - $j = cplxe(1, 2*pi/3); # $j ** 3 == 1 - print "j = $j, j**3 = ", $j ** 3, "\n"; - print "1 + j + j**2 = ", 1 + $j + $j**2, "\n"; - - $z = -16 + 0*i; # Force it to be a complex - print "sqrt($z) = ", sqrt($z), "\n"; - - $k = exp(i * 2*pi/3); - print "$j - $k = ", $j - $k, "\n"; - - $z->Re(3); # Re, Im, arg, abs, - $j->arg(2); # (the last two aka rho, theta) - # can be used also as mutators. - -=head1 CONSTANTS - -=head2 PI - -The constant C and some handy multiples of it (pi2, pi4, -and pip2 (pi/2) and pip4 (pi/4)) are also available if separately -exported: - - use Math::Complex ':pi'; - $third_of_circle = pi2 / 3; - -=head2 Inf - -The floating point infinity can be exported as a subroutine Inf(): - - use Math::Complex qw(Inf sinh); - my $AlsoInf = Inf() + 42; - my $AnotherInf = sinh(1e42); - print "$AlsoInf is $AnotherInf\n" if $AlsoInf == $AnotherInf; - -Note that the stringified form of infinity varies between platforms: -it can be for example any of - - inf - infinity - INF - 1.#INF - -or it can be something else. - -Also note that in some platforms trying to use the infinity in -arithmetic operations may result in Perl crashing because using -an infinity causes SIGFPE or its moral equivalent to be sent. -The way to ignore this is - - local $SIG{FPE} = sub { }; - -=head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO - -The division (/) and the following functions - - log ln log10 logn - tan sec csc cot - atan asec acsc acot - tanh sech csch coth - atanh asech acsch acoth - -cannot be computed for all arguments because that would mean dividing -by zero or taking logarithm of zero. These situations cause fatal -runtime errors looking like this - - cot(0): Division by zero. - (Because in the definition of cot(0), the divisor sin(0) is 0) - Died at ... - -or - - atanh(-1): Logarithm of zero. - Died at... - -For the C, C, C, C, C, C, C, -C, C, the argument cannot be C<0> (zero). For the -logarithmic functions and the C, C, the argument cannot -be C<1> (one). For the C, C, the argument cannot be -C<-1> (minus one). For the C, C, the argument cannot be -C (the imaginary unit). For the C, C, the argument -cannot be C<-i> (the negative imaginary unit). For the C, -C, C, the argument cannot be I, where I -is any integer. atan2(0, 0) is undefined, and if the complex arguments -are used for atan2(), a division by zero will happen if z1**2+z2**2 == 0. - -Note that because we are operating on approximations of real numbers, -these errors can happen when merely `too close' to the singularities -listed above. - -=head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS - -The C and C accept both real and complex arguments. -When they cannot recognize the arguments they will die with error -messages like the following - - Math::Complex::make: Cannot take real part of ... - Math::Complex::make: Cannot take real part of ... - Math::Complex::emake: Cannot take rho of ... - Math::Complex::emake: Cannot take theta of ... - -=head1 BUGS - -Saying C exports many mathematical routines in the -caller environment and even overrides some (C, C, C). -This is construed as a feature by the Authors, actually... ;-) - -All routines expect to be given real or complex numbers. Don't attempt to -use BigFloat, since Perl has currently no rule to disambiguate a '+' -operation (for instance) between two overloaded entities. - -In Cray UNICOS there is some strange numerical instability that results -in root(), cos(), sin(), cosh(), sinh(), losing accuracy fast. Beware. -The bug may be in UNICOS math libs, in UNICOS C compiler, in Math::Complex. -Whatever it is, it does not manifest itself anywhere else where Perl runs. - -=head1 SEE ALSO - -L - -=head1 AUTHORS - -Daniel S. Lewart >, -Jarkko Hietaniemi >, -Raphael Manfredi >, -Zefram - -=head1 LICENSE - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. - -=cut - -1; - -# eof Index: gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Trig.pm =================================================================== RCS file: gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Trig.pm diff -N gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Trig.pm --- gnu/usr.bin/perl/cpan/Math-Complex/lib/Math/Trig.pm 25 Mar 2013 20:07:50 -0000 1.1.1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,761 +0,0 @@ -# -# Trigonometric functions, mostly inherited from Math::Complex. -# -- Jarkko Hietaniemi, since April 1997 -# -- Raphael Manfredi, September 1996 (indirectly: because of Math::Complex) -# - -package Math::Trig; - -{ use 5.006; } -use strict; - -use Math::Complex 1.59; -use Math::Complex qw(:trig :pi); -require Exporter; - -our @ISA = qw(Exporter); - -our $VERSION = 1.23; - -my @angcnv = qw(rad2deg rad2grad - deg2rad deg2grad - grad2rad grad2deg); - -my @areal = qw(asin_real acos_real); - -our @EXPORT = (@{$Math::Complex::EXPORT_TAGS{'trig'}}, - @angcnv, @areal); - -my @rdlcnv = qw(cartesian_to_cylindrical - cartesian_to_spherical - cylindrical_to_cartesian - cylindrical_to_spherical - spherical_to_cartesian - spherical_to_cylindrical); - -my @greatcircle = qw( - great_circle_distance - great_circle_direction - great_circle_bearing - great_circle_waypoint - great_circle_midpoint - great_circle_destination - ); - -my @pi = qw(pi pi2 pi4 pip2 pip4); - -our @EXPORT_OK = (@rdlcnv, @greatcircle, @pi, 'Inf'); - -# See e.g. the following pages: -# http://www.movable-type.co.uk/scripts/LatLong.html -# http://williams.best.vwh.net/avform.htm - -our %EXPORT_TAGS = ('radial' => [ @rdlcnv ], - 'great_circle' => [ @greatcircle ], - 'pi' => [ @pi ]); - -sub _DR () { pi2/360 } -sub _RD () { 360/pi2 } -sub _DG () { 400/360 } -sub _GD () { 360/400 } -sub _RG () { 400/pi2 } -sub _GR () { pi2/400 } - -# -# Truncating remainder. -# - -sub _remt ($$) { - # Oh yes, POSIX::fmod() would be faster. Possibly. If it is available. - $_[0] - $_[1] * int($_[0] / $_[1]); -} - -# -# Angle conversions. -# - -sub rad2rad($) { _remt($_[0], pi2) } - -sub deg2deg($) { _remt($_[0], 360) } - -sub grad2grad($) { _remt($_[0], 400) } - -sub rad2deg ($;$) { my $d = _RD * $_[0]; $_[1] ? $d : deg2deg($d) } - -sub deg2rad ($;$) { my $d = _DR * $_[0]; $_[1] ? $d : rad2rad($d) } - -sub grad2deg ($;$) { my $d = _GD * $_[0]; $_[1] ? $d : deg2deg($d) } - -sub deg2grad ($;$) { my $d = _DG * $_[0]; $_[1] ? $d : grad2grad($d) } - -sub rad2grad ($;$) { my $d = _RG * $_[0]; $_[1] ? $d : grad2grad($d) } - -sub grad2rad ($;$) { my $d = _GR * $_[0]; $_[1] ? $d : rad2rad($d) } - -# -# acos and asin functions which always return a real number -# - -sub acos_real { - return 0 if $_[0] >= 1; - return pi if $_[0] <= -1; - return acos($_[0]); -} - -sub asin_real { - return &pip2 if $_[0] >= 1; - return -&pip2 if $_[0] <= -1; - return asin($_[0]); -} - -sub cartesian_to_spherical { - my ( $x, $y, $z ) = @_; - - my $rho = sqrt( $x * $x + $y * $y + $z * $z ); - - return ( $rho, - atan2( $y, $x ), - $rho ? acos_real( $z / $rho ) : 0 ); -} - -sub spherical_to_cartesian { - my ( $rho, $theta, $phi ) = @_; - - return ( $rho * cos( $theta ) * sin( $phi ), - $rho * sin( $theta ) * sin( $phi ), - $rho * cos( $phi ) ); -} - -sub spherical_to_cylindrical { - my ( $x, $y, $z ) = spherical_to_cartesian( @_ ); - - return ( sqrt( $x * $x + $y * $y ), $_[1], $z ); -} - -sub cartesian_to_cylindrical { - my ( $x, $y, $z ) = @_; - - return ( sqrt( $x * $x + $y * $y ), atan2( $y, $x ), $z ); -} - -sub cylindrical_to_cartesian { - my ( $rho, $theta, $z ) = @_; - - return ( $rho * cos( $theta ), $rho * sin( $theta ), $z ); -} - -sub cylindrical_to_spherical { - return ( cartesian_to_spherical( cylindrical_to_cartesian( @_ ) ) ); -} - -sub great_circle_distance { - my ( $theta0, $phi0, $theta1, $phi1, $rho ) = @_; - - $rho = 1 unless defined $rho; # Default to the unit sphere. - - my $lat0 = pip2 - $phi0; - my $lat1 = pip2 - $phi1; - - return $rho * - acos_real( cos( $lat0 ) * cos( $lat1 ) * cos( $theta0 - $theta1 ) + - sin( $lat0 ) * sin( $lat1 ) ); -} - -sub great_circle_direction { - my ( $theta0, $phi0, $theta1, $phi1 ) = @_; - - my $lat0 = pip2 - $phi0; - my $lat1 = pip2 - $phi1; - - return rad2rad(pi2 - - atan2(sin($theta0-$theta1) * cos($lat1), - cos($lat0) * sin($lat1) - - sin($lat0) * cos($lat1) * cos($theta0-$theta1))); -} - -*great_circle_bearing = \&great_circle_direction; - -sub great_circle_waypoint { - my ( $theta0, $phi0, $theta1, $phi1, $point ) = @_; - - $point = 0.5 unless defined $point; - - my $d = great_circle_distance( $theta0, $phi0, $theta1, $phi1 ); - - return undef if $d == pi; - - my $sd = sin($d); - - return ($theta0, $phi0) if $sd == 0; - - my $A = sin((1 - $point) * $d) / $sd; - my $B = sin( $point * $d) / $sd; - - my $lat0 = pip2 - $phi0; - my $lat1 = pip2 - $phi1; - - my $x = $A * cos($lat0) * cos($theta0) + $B * cos($lat1) * cos($theta1); - my $y = $A * cos($lat0) * sin($theta0) + $B * cos($lat1) * sin($theta1); - my $z = $A * sin($lat0) + $B * sin($lat1); - - my $theta = atan2($y, $x); - my $phi = acos_real($z); - - return ($theta, $phi); -} - -sub great_circle_midpoint { - great_circle_waypoint(@_[0..3], 0.5); -} - -sub great_circle_destination { - my ( $theta0, $phi0, $dir0, $dst ) = @_; - - my $lat0 = pip2 - $phi0; - - my $phi1 = asin_real(sin($lat0)*cos($dst) + - cos($lat0)*sin($dst)*cos($dir0)); - - my $theta1 = $theta0 + atan2(sin($dir0)*sin($dst)*cos($lat0), - cos($dst)-sin($lat0)*sin($phi1)); - - my $dir1 = great_circle_bearing($theta1, $phi1, $theta0, $phi0) + pi; - - $dir1 -= pi2 if $dir1 > pi2; - - return ($theta1, $phi1, $dir1); -} - -1; - -__END__ -=pod - -=head1 NAME - -Math::Trig - trigonometric functions - -=head1 SYNOPSIS - - use Math::Trig; - - $x = tan(0.9); - $y = acos(3.7); - $z = asin(2.4); - - $halfpi = pi/2; - - $rad = deg2rad(120); - - # Import constants pi2, pip2, pip4 (2*pi, pi/2, pi/4). - use Math::Trig ':pi'; - - # Import the conversions between cartesian/spherical/cylindrical. - use Math::Trig ':radial'; - - # Import the great circle formulas. - use Math::Trig ':great_circle'; - -=head1 DESCRIPTION - -C defines many trigonometric functions not defined by the -core Perl which defines only the C and C. The constant -B is also defined as are a few convenience functions for angle -conversions, and I for spherical movement. - -=head1 TRIGONOMETRIC FUNCTIONS - -The tangent - -=over 4 - -=item B - -=back - -The cofunctions of the sine, cosine, and tangent (cosec/csc and cotan/cot -are aliases) - -B, B, B, B, B, B - -The arcus (also known as the inverse) functions of the sine, cosine, -and tangent - -B, B, B - -The principal value of the arc tangent of y/x - -B(y, x) - -The arcus cofunctions of the sine, cosine, and tangent (acosec/acsc -and acotan/acot are aliases). Note that atan2(0, 0) is not well-defined. - -B, B, B, B, B - -The hyperbolic sine, cosine, and tangent - -B, B, B - -The cofunctions of the hyperbolic sine, cosine, and tangent (cosech/csch -and cotanh/coth are aliases) - -B, B, B, B, B - -The area (also known as the inverse) functions of the hyperbolic -sine, cosine, and tangent - -B, B, B - -The area cofunctions of the hyperbolic sine, cosine, and tangent -(acsch/acosech and acoth/acotanh are aliases) - -B, B, B, B, B - -The trigonometric constant B and some of handy multiples -of it are also defined. - -B - -=head2 ERRORS DUE TO DIVISION BY ZERO - -The following functions - - acoth - acsc - acsch - asec - asech - atanh - cot - coth - csc - csch - sec - sech - tan - tanh - -cannot be computed for all arguments because that would mean dividing -by zero or taking logarithm of zero. These situations cause fatal -runtime errors looking like this - - cot(0): Division by zero. - (Because in the definition of cot(0), the divisor sin(0) is 0) - Died at ... - -or - - atanh(-1): Logarithm of zero. - Died at... - -For the C, C, C, C, C, C, C, -C, C, the argument cannot be C<0> (zero). For the -C, C, the argument cannot be C<1> (one). For the -C, C, the argument cannot be C<-1> (minus one). For the -C, C, C, C, the argument cannot be I, where I is any integer. - -Note that atan2(0, 0) is not well-defined. - -=head2 SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS - -Please note that some of the trigonometric functions can break out -from the B into the B. For example -C has no definition for plain real numbers but it has -definition for complex numbers. - -In Perl terms this means that supplying the usual Perl numbers (also -known as scalars, please see L) as input for the -trigonometric functions might produce as output results that no more -are simple real numbers: instead they are complex numbers. - -The C handles this by using the C package -which knows how to handle complex numbers, please see L -for more information. In practice you need not to worry about getting -complex numbers as results because the C takes care of -details like for example how to display complex numbers. For example: - - print asin(2), "\n"; - -should produce something like this (take or leave few last decimals): - - 1.5707963267949-1.31695789692482i - -That is, a complex number with the real part of approximately C<1.571> -and the imaginary part of approximately C<-1.317>. - -=head1 PLANE ANGLE CONVERSIONS - -(Plane, 2-dimensional) angles may be converted with the following functions. - -=over - -=item deg2rad - - $radians = deg2rad($degrees); - -=item grad2rad - - $radians = grad2rad($gradians); - -=item rad2deg - - $degrees = rad2deg($radians); - -=item grad2deg - - $degrees = grad2deg($gradians); - -=item deg2grad - - $gradians = deg2grad($degrees); - -=item rad2grad - - $gradians = rad2grad($radians); - -=back - -The full circle is 2 I radians or I<360> degrees or I<400> gradians. -The result is by default wrapped to be inside the [0, {2pi,360,400}[ circle. -If you don't want this, supply a true second argument: - - $zillions_of_radians = deg2rad($zillions_of_degrees, 1); - $negative_degrees = rad2deg($negative_radians, 1); - -You can also do the wrapping explicitly by rad2rad(), deg2deg(), and -grad2grad(). - -=over 4 - -=item rad2rad - - $radians_wrapped_by_2pi = rad2rad($radians); - -=item deg2deg - - $degrees_wrapped_by_360 = deg2deg($degrees); - -=item grad2grad - - $gradians_wrapped_by_400 = grad2grad($gradians); - -=back - -=head1 RADIAL COORDINATE CONVERSIONS - -B are the B and the B -systems, explained shortly in more detail. - -You can import radial coordinate conversion functions by using the -C<:radial> tag: - - use Math::Trig ':radial'; - - ($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z); - ($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z); - ($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z); - ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z); - ($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi); - ($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi); - -B. - -=head2 COORDINATE SYSTEMS - -B coordinates are the usual rectangular I<(x, y, z)>-coordinates. - -Spherical coordinates, I<(rho, theta, pi)>, are three-dimensional -coordinates which define a point in three-dimensional space. They are -based on a sphere surface. The radius of the sphere is B, also -known as the I coordinate. The angle in the I-plane -(around the I-axis) is B, also known as the I -coordinate. The angle from the I-axis is B, also known as the -I coordinate. The North Pole is therefore I<0, 0, rho>, and -the Gulf of Guinea (think of the missing big chunk of Africa) I<0, -pi/2, rho>. In geographical terms I is latitude (northward -positive, southward negative) and I is longitude (eastward -positive, westward negative). - -B: some texts define I and I the other way round, -some texts define the I to start from the horizontal plane, some -texts use I in place of I. - -Cylindrical coordinates, I<(rho, theta, z)>, are three-dimensional -coordinates which define a point in three-dimensional space. They are -based on a cylinder surface. The radius of the cylinder is B, -also known as the I coordinate. The angle in the I-plane -(around the I-axis) is B, also known as the I -coordinate. The third coordinate is the I, pointing up from the -B-plane. - -=head2 3-D ANGLE CONVERSIONS - -Conversions to and from spherical and cylindrical coordinates are -available. Please notice that the conversions are not necessarily -reversible because of the equalities like I angles being equal to -I<-pi> angles. - -=over 4 - -=item cartesian_to_cylindrical - - ($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z); - -=item cartesian_to_spherical - - ($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z); - -=item cylindrical_to_cartesian - - ($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z); - -=item cylindrical_to_spherical - - ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z); - -Notice that when C<$z> is not 0 C<$rho_s> is not equal to C<$rho_c>. - -=item spherical_to_cartesian - - ($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi); - -=item spherical_to_cylindrical - - ($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi); - -Notice that when C<$z> is not 0 C<$rho_c> is not equal to C<$rho_s>. - -=back - -=head1 GREAT CIRCLE DISTANCES AND DIRECTIONS - -A great circle is section of a circle that contains the circle -diameter: the shortest distance between two (non-antipodal) points on -the spherical surface goes along the great circle connecting those two -points. - -=head2 great_circle_distance - -You can compute spherical distances, called B, -by importing the great_circle_distance() function: - - use Math::Trig 'great_circle_distance'; - - $distance = great_circle_distance($theta0, $phi0, $theta1, $phi1, [, $rho]); - -The I is the shortest distance between two -points on a sphere. The distance is in C<$rho> units. The C<$rho> is -optional, it defaults to 1 (the unit sphere), therefore the distance -defaults to radians. - -If you think geographically the I are longitudes: zero at the -Greenwhich meridian, eastward positive, westward negative -- and the -I are latitudes: zero at the North Pole, northward positive, -southward negative. B: this formula thinks in mathematics, not -geographically: the I zero is at the North Pole, not at the -Equator on the west coast of Africa (Bay of Guinea). You need to -subtract your geographical coordinates from I (also known as 90 -degrees). - - $distance = great_circle_distance($lon0, pi/2 - $lat0, - $lon1, pi/2 - $lat1, $rho); - -=head2 great_circle_direction - -The direction you must follow the great circle (also known as I) -can be computed by the great_circle_direction() function: - - use Math::Trig 'great_circle_direction'; - - $direction = great_circle_direction($theta0, $phi0, $theta1, $phi1); - -=head2 great_circle_bearing - -Alias 'great_circle_bearing' for 'great_circle_direction' is also available. - - use Math::Trig 'great_circle_bearing'; - - $direction = great_circle_bearing($theta0, $phi0, $theta1, $phi1); - -The result of great_circle_direction is in radians, zero indicating -straight north, pi or -pi straight south, pi/2 straight west, and --pi/2 straight east. - -=head2 great_circle_destination - -You can inversely compute the destination if you know the -starting point, direction, and distance: - - use Math::Trig 'great_circle_destination'; - - # $diro is the original direction, - # for example from great_circle_bearing(). - # $distance is the angular distance in radians, - # for example from great_circle_distance(). - # $thetad and $phid are the destination coordinates, - # $dird is the final direction at the destination. - - ($thetad, $phid, $dird) = - great_circle_destination($theta, $phi, $diro, $distance); - -or the midpoint if you know the end points: - -=head2 great_circle_midpoint - - use Math::Trig 'great_circle_midpoint'; - - ($thetam, $phim) = - great_circle_midpoint($theta0, $phi0, $theta1, $phi1); - -The great_circle_midpoint() is just a special case of - -=head2 great_circle_waypoint - - use Math::Trig 'great_circle_waypoint'; - - ($thetai, $phii) = - great_circle_waypoint($theta0, $phi0, $theta1, $phi1, $way); - -Where the $way is a value from zero ($theta0, $phi0) to one ($theta1, -$phi1). Note that antipodal points (where their distance is I -radians) do not have waypoints between them (they would have an an -"equator" between them), and therefore C is returned for -antipodal points. If the points are the same and the distance -therefore zero and all waypoints therefore identical, the first point -(either point) is returned. - -The thetas, phis, direction, and distance in the above are all in radians. - -You can import all the great circle formulas by - - use Math::Trig ':great_circle'; - -Notice that the resulting directions might be somewhat surprising if -you are looking at a flat worldmap: in such map projections the great -circles quite often do not look like the shortest routes -- but for -example the shortest possible routes from Europe or North America to -Asia do often cross the polar regions. (The common Mercator projection -does B show great circles as straight lines: straight lines in the -Mercator projection are lines of constant bearing.) - -=head1 EXAMPLES - -To calculate the distance between London (51.3N 0.5W) and Tokyo -(35.7N 139.8E) in kilometers: - - use Math::Trig qw(great_circle_distance deg2rad); - - # Notice the 90 - latitude: phi zero is at the North Pole. - sub NESW { deg2rad($_[0]), deg2rad(90 - $_[1]) } - my @L = NESW( -0.5, 51.3); - my @T = NESW(139.8, 35.7); - my $km = great_circle_distance(@L, @T, 6378); # About 9600 km. - -The direction you would have to go from London to Tokyo (in radians, -straight north being zero, straight east being pi/2). - - use Math::Trig qw(great_circle_direction); - - my $rad = great_circle_direction(@L, @T); # About 0.547 or 0.174 pi. - -The midpoint between London and Tokyo being - - use Math::Trig qw(great_circle_midpoint); - - my @M = great_circle_midpoint(@L, @T); - -or about 69 N 89 E, in the frozen wastes of Siberia. - -B: you B get from A to B like this: - - Dist = great_circle_distance(A, B) - Dir = great_circle_direction(A, B) - C = great_circle_destination(A, Dist, Dir) - -and expect C to be B, because the bearing constantly changes when -going from A to B (except in some special case like the meridians or -the circles of latitudes) and in great_circle_destination() one gives -a B bearing to follow. - -=head2 CAVEAT FOR GREAT CIRCLE FORMULAS - -The answers may be off by few percentages because of the irregular -(slightly aspherical) form of the Earth. The errors are at worst -about 0.55%, but generally below 0.3%. - -=head2 Real-valued asin and acos - -For small inputs asin() and acos() may return complex numbers even -when real numbers would be enough and correct, this happens because of -floating-point inaccuracies. You can see these inaccuracies for -example by trying theses: - - print cos(1e-6)**2+sin(1e-6)**2 - 1,"\n"; - printf "%.20f", cos(1e-6)**2+sin(1e-6)**2,"\n"; - -which will print something like this - - -1.11022302462516e-16 - 0.99999999999999988898 - -even though the expected results are of course exactly zero and one. -The formulas used to compute asin() and acos() are quite sensitive to -this, and therefore they might accidentally slip into the complex -plane even when they should not. To counter this there are two -interfaces that are guaranteed to return a real-valued output. - -=over 4 - -=item asin_real - - use Math::Trig qw(asin_real); - - $real_angle = asin_real($input_sin); - -Return a real-valued arcus sine if the input is between [-1, 1], -B the endpoints. For inputs greater than one, pi/2 -is returned. For inputs less than minus one, -pi/2 is returned. - -=item acos_real - - use Math::Trig qw(acos_real); - - $real_angle = acos_real($input_cos); - -Return a real-valued arcus cosine if the input is between [-1, 1], -B the endpoints. For inputs greater than one, zero -is returned. For inputs less than minus one, pi is returned. - -=back - -=head1 BUGS - -Saying C exports many mathematical routines in the -caller environment and even overrides some (C, C). This is -construed as a feature by the Authors, actually... ;-) - -The code is not optimized for speed, especially because we use -C and thus go quite near complex numbers while doing -the computations even when the arguments are not. This, however, -cannot be completely avoided if we want things like C to give -an answer instead of giving a fatal runtime error. - -Do not attempt navigation using these formulas. - -L - -=head1 AUTHORS - -Jarkko Hietaniemi >, -Raphael Manfredi >, -Zefram - -=head1 LICENSE - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. - -=cut - -# eof Index: gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t diff -N gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t --- gnu/usr.bin/perl/cpan/Math-Complex/t/Complex.t 15 Feb 2023 01:32:43 -0000 1.1.1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,1160 +0,0 @@ -#!./perl - -# -# Regression tests for the Math::Complex pacakge -# -- Raphael Manfredi since Sep 1996 -# -- Jarkko Hietaniemi since Mar 1997 -# -- Daniel S. Lewart since Sep 1997 - -use strict; -use warnings; - -use Math::Complex 1.54; - -# they are used later in the test and not exported by Math::Complex -*_stringify_cartesian = \&Math::Complex::_stringify_cartesian; -*_stringify_polar = \&Math::Complex::_stringify_polar; - -our $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/); -our $has_inf = !$vax_float; - -my ($args, $op, $target, $test, $test_set, $try, $val, $zvalue, @set, @val); -my ($bad, $z); - -$test = 0; -$| = 1; -my @script = ( - 'my ($res, $s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$z0,$z1,$z2);' . - "\n\n" -); -my $eps = 1e-13; - -if ($^O eq 'unicos') { # For some reason root() produces very inaccurate - $eps = 1e-10; # results in Cray UNICOS, and occasionally also -} # cos(), sin(), cosh(), sinh(). The division - # of doubles is the current suspect. - -$test++; -push @script, "{ my \$t=$test; ".q{ - my $a = Math::Complex->new(1); - my $b = $a; - $a += 2; - print "not " unless "$a" eq "3" && "$b" eq "1"; - print "ok $t\n"; -}."}"; - -while () { - s/^\s+//; - next if $_ eq '' || /^\#/; - chomp; - $test_set = 0; # Assume not a test over a set of values - if (/^&(.+)/) { - $op = $1; - next; - } - elsif (/^\{(.+)\}/) { - set($1, \@set, \@val); - next; - } - elsif (s/^\|//) { - $test_set = 1; # Requests we loop over the set... - } - my @args = split(/:/); - if ($test_set == 1) { - my $i; - for ($i = 0; $i < @set; $i++) { - # complex number - $target = $set[$i]; - # textual value as found in set definition - $zvalue = $val[$i]; - test($zvalue, $target, @args); - } - } else { - test($op, undef, @args); - } -} - -# - -sub test_mutators { - my $op; - - $test++; -push(@script, <<'EOT'); -{ - my $z = cplx( 1, 1); - $z->Re(2); - $z->Im(3); - print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n"; - print 'not ' unless Re($z) == 2 and Im($z) == 3; -EOT - push(@script, qq(print "ok $test\\n"}\n)); - - $test++; -push(@script, <<'EOT'); -{ - my $z = cplx( 1, 1); - $z->abs(3 * sqrt(2)); - print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n"; - print 'not ' unless (abs($z) - 3 * sqrt(2)) < $eps and - (arg($z) - pi / 4 ) < $eps and - (Re($z) - 3 ) < $eps and - (Im($z) - 3 ) < $eps; -EOT - push(@script, qq(print "ok $test\\n"}\n)); - - $test++; -push(@script, <<'EOT'); -{ - my $z = cplx( 1, 1); - $z->arg(-3 / 4 * pi); - print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n"; - print 'not ' unless (arg($z) + 3 / 4 * pi) < $eps and - (abs($z) - sqrt(2) ) < $eps and - (Re($z) + 1 ) < $eps and - (Im($z) + 1 ) < $eps; -EOT - push(@script, qq(print "ok $test\\n"}\n)); -} - -test_mutators(); - -my $constants = ' -my $i = cplx(0, 1); -my $pi = cplx(pi, 0); -my $pii = cplx(0, pi); -my $pip2 = cplx(pi/2, 0); -my $pip4 = cplx(pi/4, 0); -my $zero = cplx(0, 0); -'; - -if ($has_inf) { - $constants .= <<'EOF'; -my $inf = 9**9**9; -EOF -} - -push(@script, $constants); - - -# test the divbyzeros - -sub test_dbz { - for my $op (@_) { - $test++; - push(@script, <display_format eq 'cartesian'; - print "ok $test\n"; -EOS - - push @script, <display_format('polar'); -EOS - - $test++; - push @script, <display_format eq 'polar'; - print "ok $test\n"; -EOS - - $test++; - push @script, <display_format; -EOS - - $test++; - push @script, <display_format('style' => 'cartesian', 'format' => '%.5f'); -EOS - - $test++; - push @script, <display_format; -EOS - - $test++; - push @script, <display_format('format' => undef); -EOS - - $test++; - push @script, <display_format('style' => 'polar', 'polar_pretty_print' => 0); -EOS - - $test++; - push @script, <display_format('style' => 'polar', 'format' => "%.4g"); -EOS - - $test++; - push @script, <display_format('style' => 'cartesian', 'format' => '(%.5g)'); -EOS - - $test++; - push @script, <display_format eq 'cartesian'; - print "ok $test\n"; -EOS -} - -test_display_format(); - -sub test_remake { - $test++; - push @script, <make(2,3); - print "ok $test\n"; -EOS - - $test++; - push @script, <make('3i'); - print "not " unless \$z == cplx(0,3); - print "ok $test\n"; -EOS - - $test++; - push @script, <emake('[2,3]'); - print "not " unless \$z == cplxe(2,3); - print "ok $test\n"; -EOS - - $test++; - push @script, <make('(2,3)'); - print "not " unless \$z == cplx(2,3); - print "ok $test\n"; -EOS - - $test++; - push @script, <emake('[2,3pi/8]'); - print "not " unless \$z == cplxe(2,3*\$pi/8); - print "ok $test\n"; -EOS - - $test++; - push @script, <emake('[2]'); - print "not " unless \$z == cplxe(2); - print "ok $test\n"; -EOS -} - -sub test_no_args { - push @script, <<'EOS'; -{ - print "# cplx, cplxe, make, emake without arguments\n"; -EOS - - $test++; - push @script, <Re() == 0) ? "ok $test\n" : "not ok $test\n"); -EOS - - $test++; - push @script, <Im() == 0) ? "ok $test\n" : "not ok $test\n"); -EOS - - $test++; - push @script, <rho() == 0) ? "ok $test\n" : "not ok $test\n"); -EOS - - $test++; - push @script, <theta() == 0) ? "ok $test\n" : "not ok $test\n"); -EOS - - $test++; - push @script, <make(); - print ((\$z2->Re() == 0) ? "ok $test\n" : "not ok $test\n"); -EOS - - $test++; - push @script, <Im() == 0) ? "ok $test\n" : "not ok $test\n"); -EOS - - $test++; - push @script, <emake(); - print ((\$z3->rho() == 0) ? "ok $test\n" : "not ok $test\n"); -EOS - - $test++; - push @script, <theta() == 0) ? "ok $test\n" : "not ok $test\n"); -} -EOS -} - -sub test_atan2 { - push @script, <<'EOS'; -print "# atan2() with some real arguments\n"; -EOS - my @real = (-1, 0, 1); - for my $x (@real) { - for my $y (@real) { - next if $x == 0 && $y == 0; - $test++; - push @script, < 2 and $baop) { # binary assignment ops - $test++; - # check the op= works - push @script, <_cartesian} : (\$z0, 0)); - - my (\$z1r, \$z1i) = ref \$z1 ? \@{\$z1->_cartesian} : (\$z1, 0); - - my \$zb = cplx(\$z1r, \$z1i); - - \$za $op= \$zb; - my (\$zbr, \$zbi) = \@{\$zb->_cartesian}; - - check($test, '\$z0 $op= \$z1', \$za, \$z$#args, $args); -EOB - $test++; - # check that the rhs has not changed - push @script, qq(print "not " unless (\$zbr == \$z1r and \$zbi == \$z1i);); - push @script, qq(print "ok $test\\n";\n); - push @script, "}\n"; - } - } -} - -sub set { - my ($set, $setref, $valref) = @_; - @{$setref} = (); - @{$valref} = (); - my @set = split(/;\s*/, $set); - my @res; - my $i; - for ($i = 0; $i < @set; $i++) { - push(@{$valref}, $set[$i]); - my $val = value($set[$i]); - push @script, "\$s$i = $val;\n"; - push @{$setref}, "\$s$i"; - } -} - -sub value { - local ($_) = @_; - if (/^\s*\((.*),(.*)\)/) { - return "cplx($1,$2)"; - } - elsif (/^\s*([\-\+]?(?:\d+(\.\d+)?|\.\d+)(?:[e[\-\+]\d+])?)/) { - return "cplx($1,0)"; - } - elsif (/^\s*\[(.*),(.*)\]/) { - return "cplxe($1,$2)"; - } - elsif (/^\s*'(.*)'/) { - my $ex = $1; - $ex =~ s/\bz\b/$target/g; - $ex =~ s/\br\b/abs($target)/g; - $ex =~ s/\bt\b/arg($target)/g; - $ex =~ s/\ba\b/Re($target)/g; - $ex =~ s/\bb\b/Im($target)/g; - return $ex; - } - elsif (/^\s*"(.*)"/) { - return "\"$1\""; - } - return $_; -} - -sub check { - my ($test, $try, $got, $expected, @z) = @_; - - print "# @_\n"; - - if ("$got" eq "$expected" - || - ($expected =~ /^-?\d/ && $got == $expected) - || - (abs(Math::Complex->make($got) - Math::Complex->make($expected)) < $eps) - || - (abs($got - $expected) < $eps) - ) { - print "ok $test\n"; - } else { - print "not ok $test\n"; - my $args = (@z == 1) ? "z = $z[0]" : "z0 = $z[0], z1 = $z[1]"; - print "# '$try' expected: '$expected' got: '$got' for $args\n"; - } -} - -sub addsq { - my ($z1, $z2) = @_; - return ($z1 + i*$z2) * ($z1 - i*$z2); -} - -sub subsq { - my ($z1, $z2) = @_; - return ($z1 + $z2) * ($z1 - $z2); -} - -__END__ -&+;= -(3,4):(3,4):(6,8) -(-3,4):(3,-4):(0,0) -(3,4):-3:(0,4) -1:(4,2):(5,2) -[2,0]:[2,pi]:(0,0) - -&++ -(2,1):(3,1) - -&-;= -(2,3):(-2,-3) -[2,pi/2]:[2,-(pi)/2] -2:[2,0]:(0,0) -[3,0]:2:(1,0) -3:(4,5):(-1,-5) -(4,5):3:(1,5) -(2,1):(3,5):(-1,-4) - -&-- -(1,2):(0,2) -[2,pi]:[3,pi] - -&*;= -(0,1):(0,1):(-1,0) -(4,5):(1,0):(4,5) -[2,2*pi/3]:(1,0):[2,2*pi/3] -2:(0,1):(0,2) -(0,1):3:(0,3) -(0,1):(4,1):(-1,4) -(2,1):(4,-1):(9,2) - -&/;= -(3,4):(3,4):(1,0) -(4,-5):1:(4,-5) -1:(0,1):(0,-1) -(0,6):(0,2):(3,0) -(9,2):(4,-1):(2,1) -[4,pi]:[2,pi/2]:[2,pi/2] -[2,pi/2]:[4,pi]:[0.5,-(pi)/2] - -&**;= -(2,0):(3,0):(8,0) -(3,0):(2,0):(9,0) -(2,3):(4,0):(-119,-120) -(0,0):(1,0):(0,0) -(0,0):(2,3):(0,0) -(1,0):(0,0):(1,0) -(1,0):(1,0):(1,0) -(1,0):(2,3):(1,0) -(2,3):(0,0):(1,0) -(2,3):(1,0):(2,3) -(0,0):(0,0):(1,0) - -&Re -(3,4):3 -(-3,4):-3 -[1,pi/2]:0 - -&Im -(3,4):4 -(3,-4):-4 -[1,pi/2]:1 - -&abs -(3,4):5 -(-3,4):5 - -&arg -[2,0]:0 -[-2,0]:pi - -&~ -(4,5):(4,-5) -(-3,4):(-3,-4) -[2,pi/2]:[2,-(pi)/2] - -&< -(3,4):(1,2):0 -(3,4):(3,2):0 -(3,4):(3,8):1 -(4,4):(5,129):1 - -&== -(3,4):(4,5):0 -(3,4):(3,5):0 -(3,4):(2,4):0 -(3,4):(3,4):1 - -&sqrt --9:(0,3) -(-100,0):(0,10) -(16,-30):(5,-3) - -&_stringify_cartesian -(-100,0):"-100" -(0,1):"i" -(4,-3):"4-3i" -(4,0):"4" -(-4,0):"-4" -(-2,4):"-2+4i" -(-2,-1):"-2-i" - -&_stringify_polar -[-1, 0]:"[1,pi]" -[1, pi/3]:"[1,pi/3]" -[6, -2*pi/3]:"[6,-2pi/3]" -[0.5, -9*pi/11]:"[0.5,-9pi/11]" -[1, 0.5]:"[1, 0.5]" - -{ (4,3); [3,2]; (-3,4); (0,2); [2,1] } - -|'z + ~z':'2*Re(z)' -|'z - ~z':'2*i*Im(z)' -|'z * ~z':'abs(z) * abs(z)' - -{ (0.5, 0); (-0.5, 0); (2,3); [3,2]; (-3,2); (0,2); 3; 1.2; (-3, 0); (-2, -1); [2,1] } - -|'(root(z, 4))[1] ** 4':'z' -|'(root(z, 5))[3] ** 5':'z' -|'(root(z, 8))[7] ** 8':'z' -|'(root(z, 8, 0)) ** 8':'z' -|'(root(z, 8, 7)) ** 8':'z' -|'abs(z)':'r' -|'acot(z)':'acotan(z)' -|'acsc(z)':'acosec(z)' -|'acsc(z)':'asin(1 / z)' -|'asec(z)':'acos(1 / z)' -|'cbrt(z)':'cbrt(r) * exp(i * t/3)' -|'cos(acos(z))':'z' -|'addsq(cos(z), sin(z))':1 -|'cos(z)':'cosh(i*z)' -|'subsq(cosh(z), sinh(z))':1 -|'cot(acot(z))':'z' -|'cot(z)':'1 / tan(z)' -|'cot(z)':'cotan(z)' -|'csc(acsc(z))':'z' -|'csc(z)':'1 / sin(z)' -|'csc(z)':'cosec(z)' -|'exp(log(z))':'z' -|'exp(z)':'exp(a) * exp(i * b)' -|'ln(z)':'log(z)' -|'log(exp(z))':'z' -|'log(z)':'log(r) + i*t' -|'log10(z)':'log(z) / log(10)' -|'logn(z, 2)':'log(z) / log(2)' -|'logn(z, 3)':'log(z) / log(3)' -|'sec(asec(z))':'z' -|'sec(z)':'1 / cos(z)' -|'sin(asin(z))':'z' -|'sin(i * z)':'i * sinh(z)' -|'sqrt(z) * sqrt(z)':'z' -|'sqrt(z)':'sqrt(r) * exp(i * t/2)' -|'tan(atan(z))':'z' -|'z**z':'exp(z * log(z))' - -{ (1,1); [1,0.5]; (-2, -1); 2; -3; (-1,0.5); (0,0.5); 0.5; (2, 0); (-1, -2) } - -|'cosh(acosh(z))':'z' -|'coth(acoth(z))':'z' -|'coth(z)':'1 / tanh(z)' -|'coth(z)':'cotanh(z)' -|'csch(acsch(z))':'z' -|'csch(z)':'1 / sinh(z)' -|'csch(z)':'cosech(z)' -|'sech(asech(z))':'z' -|'sech(z)':'1 / cosh(z)' -|'sinh(asinh(z))':'z' -|'tanh(atanh(z))':'z' - -{ (0.2,-0.4); [1,0.5]; -1.2; (-1,0.5); 0.5; (1.1, 0) } - -|'acos(cos(z)) ** 2':'z * z' -|'acosh(cosh(z)) ** 2':'z * z' -|'acoth(z)':'acotanh(z)' -|'acoth(z)':'atanh(1 / z)' -|'acsch(z)':'acosech(z)' -|'acsch(z)':'asinh(1 / z)' -|'asech(z)':'acosh(1 / z)' -|'asin(sin(z))':'z' -|'asinh(sinh(z))':'z' -|'atan(tan(z))':'z' -|'atanh(tanh(z))':'z' - -&log -(-2.0,0):( 0.69314718055995, 3.14159265358979) -(-1.0,0):( 0 , 3.14159265358979) -(-0.5,0):( -0.69314718055995, 3.14159265358979) -( 0.5,0):( -0.69314718055995, 0 ) -( 1.0,0):( 0 , 0 ) -( 2.0,0):( 0.69314718055995, 0 ) - -&log -( 2, 3):( 1.28247467873077, 0.98279372324733) -(-2, 3):( 1.28247467873077, 2.15879893034246) -(-2,-3):( 1.28247467873077, -2.15879893034246) -( 2,-3):( 1.28247467873077, -0.98279372324733) - -&sin -(-2.0,0):( -0.90929742682568, 0 ) -(-1.0,0):( -0.84147098480790, 0 ) -(-0.5,0):( -0.47942553860420, 0 ) -( 0.0,0):( 0 , 0 ) -( 0.5,0):( 0.47942553860420, 0 ) -( 1.0,0):( 0.84147098480790, 0 ) -( 2.0,0):( 0.90929742682568, 0 ) - -&sin -( 2, 3):( 9.15449914691143, -4.16890695996656) -(-2, 3):( -9.15449914691143, -4.16890695996656) -(-2,-3):( -9.15449914691143, 4.16890695996656) -( 2,-3):( 9.15449914691143, 4.16890695996656) - -&cos -(-2.0,0):( -0.41614683654714, 0 ) -(-1.0,0):( 0.54030230586814, 0 ) -(-0.5,0):( 0.87758256189037, 0 ) -( 0.0,0):( 1 , 0 ) -( 0.5,0):( 0.87758256189037, 0 ) -( 1.0,0):( 0.54030230586814, 0 ) -( 2.0,0):( -0.41614683654714, 0 ) - -&cos -( 2, 3):( -4.18962569096881, -9.10922789375534) -(-2, 3):( -4.18962569096881, 9.10922789375534) -(-2,-3):( -4.18962569096881, -9.10922789375534) -( 2,-3):( -4.18962569096881, 9.10922789375534) - -&tan -(-2.0,0):( 2.18503986326152, 0 ) -(-1.0,0):( -1.55740772465490, 0 ) -(-0.5,0):( -0.54630248984379, 0 ) -( 0.0,0):( 0 , 0 ) -( 0.5,0):( 0.54630248984379, 0 ) -( 1.0,0):( 1.55740772465490, 0 ) -( 2.0,0):( -2.18503986326152, 0 ) - -&tan -( 2, 3):( -0.00376402564150, 1.00323862735361) -(-2, 3):( 0.00376402564150, 1.00323862735361) -(-2,-3):( 0.00376402564150, -1.00323862735361) -( 2,-3):( -0.00376402564150, -1.00323862735361) - -&sec -(-2.0,0):( -2.40299796172238, 0 ) -(-1.0,0):( 1.85081571768093, 0 ) -(-0.5,0):( 1.13949392732455, 0 ) -( 0.0,0):( 1 , 0 ) -( 0.5,0):( 1.13949392732455, 0 ) -( 1.0,0):( 1.85081571768093, 0 ) -( 2.0,0):( -2.40299796172238, 0 ) - -&sec -( 2, 3):( -0.04167496441114, 0.09061113719624) -(-2, 3):( -0.04167496441114, -0.09061113719624) -(-2,-3):( -0.04167496441114, 0.09061113719624) -( 2,-3):( -0.04167496441114, -0.09061113719624) - -&csc -(-2.0,0):( -1.09975017029462, 0 ) -(-1.0,0):( -1.18839510577812, 0 ) -(-0.5,0):( -2.08582964293349, 0 ) -( 0.5,0):( 2.08582964293349, 0 ) -( 1.0,0):( 1.18839510577812, 0 ) -( 2.0,0):( 1.09975017029462, 0 ) - -&csc -( 2, 3):( 0.09047320975321, 0.04120098628857) -(-2, 3):( -0.09047320975321, 0.04120098628857) -(-2,-3):( -0.09047320975321, -0.04120098628857) -( 2,-3):( 0.09047320975321, -0.04120098628857) - -&cot -(-2.0,0):( 0.45765755436029, 0 ) -(-1.0,0):( -0.64209261593433, 0 ) -(-0.5,0):( -1.83048772171245, 0 ) -( 0.5,0):( 1.83048772171245, 0 ) -( 1.0,0):( 0.64209261593433, 0 ) -( 2.0,0):( -0.45765755436029, 0 ) - -&cot -( 2, 3):( -0.00373971037634, -0.99675779656936) -(-2, 3):( 0.00373971037634, -0.99675779656936) -(-2,-3):( 0.00373971037634, 0.99675779656936) -( 2,-3):( -0.00373971037634, 0.99675779656936) - -&asin -(-2.0,0):( -1.57079632679490, 1.31695789692482) -(-1.0,0):( -1.57079632679490, 0 ) -(-0.5,0):( -0.52359877559830, 0 ) -( 0.0,0):( 0 , 0 ) -( 0.5,0):( 0.52359877559830, 0 ) -( 1.0,0):( 1.57079632679490, 0 ) -( 2.0,0):( 1.57079632679490, -1.31695789692482) - -&asin -( 2, 3):( 0.57065278432110, 1.98338702991654) -(-2, 3):( -0.57065278432110, 1.98338702991654) -(-2,-3):( -0.57065278432110, -1.98338702991654) -( 2,-3):( 0.57065278432110, -1.98338702991654) - -&acos -(-2.0,0):( 3.14159265358979, -1.31695789692482) -(-1.0,0):( 3.14159265358979, 0 ) -(-0.5,0):( 2.09439510239320, 0 ) -( 0.0,0):( 1.57079632679490, 0 ) -( 0.5,0):( 1.04719755119660, 0 ) -( 1.0,0):( 0 , 0 ) -( 2.0,0):( 0 , 1.31695789692482) - -&acos -( 2, 3):( 1.00014354247380, -1.98338702991654) -(-2, 3):( 2.14144911111600, -1.98338702991654) -(-2,-3):( 2.14144911111600, 1.98338702991654) -( 2,-3):( 1.00014354247380, 1.98338702991654) - -&atan -(-2.0,0):( -1.10714871779409, 0 ) -(-1.0,0):( -0.78539816339745, 0 ) -(-0.5,0):( -0.46364760900081, 0 ) -( 0.0,0):( 0 , 0 ) -( 0.5,0):( 0.46364760900081, 0 ) -( 1.0,0):( 0.78539816339745, 0 ) -( 2.0,0):( 1.10714871779409, 0 ) - -&atan -( 2, 3):( 1.40992104959658, 0.22907268296854) -(-2, 3):( -1.40992104959658, 0.22907268296854) -(-2,-3):( -1.40992104959658, -0.22907268296854) -( 2,-3):( 1.40992104959658, -0.22907268296854) - -&asec -(-2.0,0):( 2.09439510239320, 0 ) -(-1.0,0):( 3.14159265358979, 0 ) -(-0.5,0):( 3.14159265358979, -1.31695789692482) -( 0.5,0):( 0 , 1.31695789692482) -( 1.0,0):( 0 , 0 ) -( 2.0,0):( 1.04719755119660, 0 ) - -&asec -( 2, 3):( 1.42041072246703, 0.23133469857397) -(-2, 3):( 1.72118193112276, 0.23133469857397) -(-2,-3):( 1.72118193112276, -0.23133469857397) -( 2,-3):( 1.42041072246703, -0.23133469857397) - -&acsc -(-2.0,0):( -0.52359877559830, 0 ) -(-1.0,0):( -1.57079632679490, 0 ) -(-0.5,0):( -1.57079632679490, 1.31695789692482) -( 0.5,0):( 1.57079632679490, -1.31695789692482) -( 1.0,0):( 1.57079632679490, 0 ) -( 2.0,0):( 0.52359877559830, 0 ) - -&acsc -( 2, 3):( 0.15038560432786, -0.23133469857397) -(-2, 3):( -0.15038560432786, -0.23133469857397) -(-2,-3):( -0.15038560432786, 0.23133469857397) -( 2,-3):( 0.15038560432786, 0.23133469857397) - -&acot -(-2.0,0):( -0.46364760900081, 0 ) -(-1.0,0):( -0.78539816339745, 0 ) -(-0.5,0):( -1.10714871779409, 0 ) -( 0.5,0):( 1.10714871779409, 0 ) -( 1.0,0):( 0.78539816339745, 0 ) -( 2.0,0):( 0.46364760900081, 0 ) - -&acot -( 2, 3):( 0.16087527719832, -0.22907268296854) -(-2, 3):( -0.16087527719832, -0.22907268296854) -(-2,-3):( -0.16087527719832, 0.22907268296854) -( 2,-3):( 0.16087527719832, 0.22907268296854) - -&sinh -(-2.0,0):( -3.62686040784702, 0 ) -(-1.0,0):( -1.17520119364380, 0 ) -(-0.5,0):( -0.52109530549375, 0 ) -( 0.0,0):( 0 , 0 ) -( 0.5,0):( 0.52109530549375, 0 ) -( 1.0,0):( 1.17520119364380, 0 ) -( 2.0,0):( 3.62686040784702, 0 ) - -&sinh -( 2, 3):( -3.59056458998578, 0.53092108624852) -(-2, 3):( 3.59056458998578, 0.53092108624852) -(-2,-3):( 3.59056458998578, -0.53092108624852) -( 2,-3):( -3.59056458998578, -0.53092108624852) - -&cosh -(-2.0,0):( 3.76219569108363, 0 ) -(-1.0,0):( 1.54308063481524, 0 ) -(-0.5,0):( 1.12762596520638, 0 ) -( 0.0,0):( 1 , 0 ) -( 0.5,0):( 1.12762596520638, 0 ) -( 1.0,0):( 1.54308063481524, 0 ) -( 2.0,0):( 3.76219569108363, 0 ) - -&cosh -( 2, 3):( -3.72454550491532, 0.51182256998738) -(-2, 3):( -3.72454550491532, -0.51182256998738) -(-2,-3):( -3.72454550491532, 0.51182256998738) -( 2,-3):( -3.72454550491532, -0.51182256998738) - -&tanh -(-2.0,0):( -0.96402758007582, 0 ) -(-1.0,0):( -0.76159415595576, 0 ) -(-0.5,0):( -0.46211715726001, 0 ) -( 0.0,0):( 0 , 0 ) -( 0.5,0):( 0.46211715726001, 0 ) -( 1.0,0):( 0.76159415595576, 0 ) -( 2.0,0):( 0.96402758007582, 0 ) - -&tanh -( 2, 3):( 0.96538587902213, -0.00988437503832) -(-2, 3):( -0.96538587902213, -0.00988437503832) -(-2,-3):( -0.96538587902213, 0.00988437503832) -( 2,-3):( 0.96538587902213, 0.00988437503832) - -&sech -(-2.0,0):( 0.26580222883408, 0 ) -(-1.0,0):( 0.64805427366389, 0 ) -(-0.5,0):( 0.88681888397007, 0 ) -( 0.0,0):( 1 , 0 ) -( 0.5,0):( 0.88681888397007, 0 ) -( 1.0,0):( 0.64805427366389, 0 ) -( 2.0,0):( 0.26580222883408, 0 ) - -&sech -( 2, 3):( -0.26351297515839, -0.03621163655877) -(-2, 3):( -0.26351297515839, 0.03621163655877) -(-2,-3):( -0.26351297515839, -0.03621163655877) -( 2,-3):( -0.26351297515839, 0.03621163655877) - -&csch -(-2.0,0):( -0.27572056477178, 0 ) -(-1.0,0):( -0.85091812823932, 0 ) -(-0.5,0):( -1.91903475133494, 0 ) -( 0.5,0):( 1.91903475133494, 0 ) -( 1.0,0):( 0.85091812823932, 0 ) -( 2.0,0):( 0.27572056477178, 0 ) - -&csch -( 2, 3):( -0.27254866146294, -0.04030057885689) -(-2, 3):( 0.27254866146294, -0.04030057885689) -(-2,-3):( 0.27254866146294, 0.04030057885689) -( 2,-3):( -0.27254866146294, 0.04030057885689) - -&coth -(-2.0,0):( -1.03731472072755, 0 ) -(-1.0,0):( -1.31303528549933, 0 ) -(-0.5,0):( -2.16395341373865, 0 ) -( 0.5,0):( 2.16395341373865, 0 ) -( 1.0,0):( 1.31303528549933, 0 ) -( 2.0,0):( 1.03731472072755, 0 ) - -&coth -( 2, 3):( 1.03574663776500, 0.01060478347034) -(-2, 3):( -1.03574663776500, 0.01060478347034) -(-2,-3):( -1.03574663776500, -0.01060478347034) -( 2,-3):( 1.03574663776500, -0.01060478347034) - -&asinh -(-2.0,0):( -1.44363547517881, 0 ) -(-1.0,0):( -0.88137358701954, 0 ) -(-0.5,0):( -0.48121182505960, 0 ) -( 0.0,0):( 0 , 0 ) -( 0.5,0):( 0.48121182505960, 0 ) -( 1.0,0):( 0.88137358701954, 0 ) -( 2.0,0):( 1.44363547517881, 0 ) - -&asinh -( 2, 3):( 1.96863792579310, 0.96465850440760) -(-2, 3):( -1.96863792579310, 0.96465850440761) -(-2,-3):( -1.96863792579310, -0.96465850440761) -( 2,-3):( 1.96863792579310, -0.96465850440760) - -&acosh -(-2.0,0):( 1.31695789692482, 3.14159265358979) -(-1.0,0):( 0, 3.14159265358979) -(-0.5,0):( 0, 2.09439510239320) -( 0.0,0):( 0, 1.57079632679490) -( 0.5,0):( 0, 1.04719755119660) -( 1.0,0):( 0 , 0 ) -( 2.0,0):( 1.31695789692482, 0 ) - -&acosh -( 2, 3):( 1.98338702991654, 1.00014354247380) -(-2, 3):( 1.98338702991653, 2.14144911111600) -(-2,-3):( 1.98338702991653, -2.14144911111600) -( 2,-3):( 1.98338702991654, -1.00014354247380) - -&atanh -(-2.0,0):( -0.54930614433405, 1.57079632679490) -(-0.5,0):( -0.54930614433405, 0 ) -( 0.0,0):( 0 , 0 ) -( 0.5,0):( 0.54930614433405, 0 ) -( 2.0,0):( 0.54930614433405, 1.57079632679490) - -&atanh -( 2, 3):( 0.14694666622553, 1.33897252229449) -(-2, 3):( -0.14694666622553, 1.33897252229449) -(-2,-3):( -0.14694666622553, -1.33897252229449) -( 2,-3):( 0.14694666622553, -1.33897252229449) - -&asech -(-2.0,0):( 0 , 2.09439510239320) -(-1.0,0):( 0 , 3.14159265358979) -(-0.5,0):( 1.31695789692482, 3.14159265358979) -( 0.5,0):( 1.31695789692482, 0 ) -( 1.0,0):( 0 , 0 ) -( 2.0,0):( 0 , 1.04719755119660) - -&asech -( 2, 3):( 0.23133469857397, -1.42041072246703) -(-2, 3):( 0.23133469857397, -1.72118193112276) -(-2,-3):( 0.23133469857397, 1.72118193112276) -( 2,-3):( 0.23133469857397, 1.42041072246703) - -&acsch -(-2.0,0):( -0.48121182505960, 0 ) -(-1.0,0):( -0.88137358701954, 0 ) -(-0.5,0):( -1.44363547517881, 0 ) -( 0.5,0):( 1.44363547517881, 0 ) -( 1.0,0):( 0.88137358701954, 0 ) -( 2.0,0):( 0.48121182505960, 0 ) - -&acsch -( 2, 3):( 0.15735549884499, -0.22996290237721) -(-2, 3):( -0.15735549884499, -0.22996290237721) -(-2,-3):( -0.15735549884499, 0.22996290237721) -( 2,-3):( 0.15735549884499, 0.22996290237721) - -&acoth -(-2.0,0):( -0.54930614433405, 0 ) -(-0.5,0):( -0.54930614433405, 1.57079632679490) -( 0.5,0):( 0.54930614433405, 1.57079632679490) -( 2.0,0):( 0.54930614433405, 0 ) - -&acoth -( 2, 3):( 0.14694666622553, -0.23182380450040) -(-2, 3):( -0.14694666622553, -0.23182380450040) -(-2,-3):( -0.14694666622553, 0.23182380450040) -( 2,-3):( 0.14694666622553, 0.23182380450040) - -# eof Index: gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t diff -N gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t --- gnu/usr.bin/perl/cpan/Math-Complex/t/Trig.t 15 Feb 2023 01:32:43 -0000 1.1.1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,387 +0,0 @@ -#!./perl - -# -# Regression tests for the Math::Trig package -# -# The tests here are quite modest as the Math::Complex tests exercise -# these interfaces quite vigorously. -# -# -- Jarkko Hietaniemi, April 1997 - -use strict; -use warnings; -use Test::More tests => 153; - -use Math::Trig 1.18; -use Math::Trig 1.18 qw(:pi Inf); - -our $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/); -our $has_inf = !$vax_float; - -my $pip2 = pi / 2; - -use strict; - -our($x, $y, $z); - -my $eps = 1e-11; - -if ($^O eq 'unicos') { # See lib/Math/Complex.pm and t/lib/complex.t. - $eps = 1e-10; -} - -sub near { - my $e = defined $_[2] ? $_[2] : $eps; - my $d = $_[1] ? abs($_[0]/$_[1] - 1) : abs($_[0]); - print "# near? $_[0] $_[1] : $d : $e\n"; - $_[1] ? ($d < $e) : abs($_[0]) < $e; -} - -print "# Sanity checks\n"; - -ok(near(sin(1), 0.841470984807897)); -ok(near(cos(1), 0.54030230586814)); -ok(near(tan(1), 1.5574077246549)); - -ok(near(sec(1), 1.85081571768093)); -ok(near(csc(1), 1.18839510577812)); -ok(near(cot(1), 0.642092615934331)); - -ok(near(asin(1), 1.5707963267949)); -ok(near(acos(1), 0)); -ok(near(atan(1), 0.785398163397448)); - -ok(near(asec(1), 0)); -ok(near(acsc(1), 1.5707963267949)); -ok(near(acot(1), 0.785398163397448)); - -ok(near(sinh(1), 1.1752011936438)); -ok(near(cosh(1), 1.54308063481524)); -ok(near(tanh(1), 0.761594155955765)); - -ok(near(sech(1), 0.648054273663885)); -ok(near(csch(1), 0.850918128239322)); -ok(near(coth(1), 1.31303528549933)); - -ok(near(asinh(1), 0.881373587019543)); -ok(near(acosh(1), 0)); -ok(near(atanh(0.9), 1.47221948958322)); # atanh(1.0) would be an error. - -ok(near(asech(0.9), 0.467145308103262)); -ok(near(acsch(2), 0.481211825059603)); -ok(near(acoth(2), 0.549306144334055)); - -print "# Basics\n"; - -$x = 0.9; -ok(near(tan($x), sin($x) / cos($x))); - -ok(near(sinh(2), 3.62686040784702)); - -ok(near(acsch(0.1), 2.99822295029797)); - -$x = asin(2); -is(ref $x, 'Math::Complex'); - -# avoid using Math::Complex here -$x =~ /^([^-]+)(-[^i]+)i$/; -($y, $z) = ($1, $2); -ok(near($y, 1.5707963267949)); -ok(near($z, -1.31695789692482)); - -ok(near(deg2rad(90), pi/2)); - -ok(near(rad2deg(pi), 180)); - -use Math::Trig ':radial'; - -{ - my ($r,$t,$z) = cartesian_to_cylindrical(1,1,1); - - ok(near($r, sqrt(2))); - ok(near($t, deg2rad(45))); - ok(near($z, 1)); - - ($x,$y,$z) = cylindrical_to_cartesian($r, $t, $z); - - ok(near($x, 1)); - ok(near($y, 1)); - ok(near($z, 1)); - - ($r,$t,$z) = cartesian_to_cylindrical(1,1,0); - - ok(near($r, sqrt(2))); - ok(near($t, deg2rad(45))); - ok(near($z, 0)); - - ($x,$y,$z) = cylindrical_to_cartesian($r, $t, $z); - - ok(near($x, 1)); - ok(near($y, 1)); - ok(near($z, 0)); -} - -{ - my ($r,$t,$f) = cartesian_to_spherical(1,1,1); - - ok(near($r, sqrt(3))); - ok(near($t, deg2rad(45))); - ok(near($f, atan2(sqrt(2), 1))); - - ($x,$y,$z) = spherical_to_cartesian($r, $t, $f); - - ok(near($x, 1)); - ok(near($y, 1)); - ok(near($z, 1)); - - ($r,$t,$f) = cartesian_to_spherical(1,1,0); - - ok(near($r, sqrt(2))); - ok(near($t, deg2rad(45))); - ok(near($f, deg2rad(90))); - - ($x,$y,$z) = spherical_to_cartesian($r, $t, $f); - - ok(near($x, 1)); - ok(near($y, 1)); - ok(near($z, 0)); -} - -{ - my ($r,$t,$z) = cylindrical_to_spherical(spherical_to_cylindrical(1,1,1)); - - ok(near($r, 1)); - ok(near($t, 1)); - ok(near($z, 1)); - - ($r,$t,$z) = spherical_to_cylindrical(cylindrical_to_spherical(1,1,1)); - - ok(near($r, 1)); - ok(near($t, 1)); - ok(near($z, 1)); -} - -{ - use Math::Trig 'great_circle_distance'; - - ok(near(great_circle_distance(0, 0, 0, pi/2), pi/2)); - - ok(near(great_circle_distance(0, 0, pi, pi), pi)); - - # London to Tokyo. - my @L = (deg2rad(-0.5), deg2rad(90 - 51.3)); - my @T = (deg2rad(139.8), deg2rad(90 - 35.7)); - - my $km = great_circle_distance(@L, @T, 6378); - - ok(near($km, 9605.26637021388)); -} - -{ - my $R2D = 57.295779513082320876798154814169; - - sub frac { $_[0] - int($_[0]) } - - my $lotta_radians = deg2rad(1E+20, 1); - ok(near($lotta_radians, 1E+20/$R2D)); - - my $negat_degrees = rad2deg(-1E20, 1); - ok(near($negat_degrees, -1E+20*$R2D)); - - my $posit_degrees = rad2deg(-10000, 1); - ok(near($posit_degrees, -10000*$R2D)); -} - -{ - use Math::Trig 'great_circle_direction'; - - ok(near(great_circle_direction(0, 0, 0, pi/2), pi)); - -# Retired test: Relies on atan2(0, 0), which is not portable. -# ok(near(great_circle_direction(0, 0, pi, pi), -pi()/2)); - - my @London = (deg2rad( -0.167), deg2rad(90 - 51.3)); - my @Tokyo = (deg2rad( 139.5), deg2rad(90 - 35.7)); - my @Berlin = (deg2rad ( 13.417), deg2rad(90 - 52.533)); - my @Paris = (deg2rad ( 2.333), deg2rad(90 - 48.867)); - - ok(near(rad2deg(great_circle_direction(@London, @Tokyo)), - 31.791945393073)); - - ok(near(rad2deg(great_circle_direction(@Tokyo, @London)), - 336.069766430326)); - - ok(near(rad2deg(great_circle_direction(@Berlin, @Paris)), - 246.800348034667)); - - ok(near(rad2deg(great_circle_direction(@Paris, @Berlin)), - 58.2079877553156)); - - use Math::Trig 'great_circle_bearing'; - - ok(near(rad2deg(great_circle_bearing(@Paris, @Berlin)), - 58.2079877553156)); - - use Math::Trig 'great_circle_waypoint'; - use Math::Trig 'great_circle_midpoint'; - - my ($lon, $lat); - - ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.0); - - ok(near($lon, $London[0])); - - ok(near($lat, $London[1])); - - ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 1.0); - - ok(near($lon, $Tokyo[0])); - - ok(near($lat, $Tokyo[1])); - - ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.5); - - ok(near($lon, 1.55609593577679)); # 89.16 E - - ok(near($lat, 0.36783532946162)); # 68.93 N - - ($lon, $lat) = great_circle_midpoint(@London, @Tokyo); - - ok(near($lon, 1.55609593577679)); # 89.16 E - - ok(near($lat, 0.367835329461615)); # 68.93 N - - ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.25); - - ok(near($lon, 0.516073562850837)); # 29.57 E - - ok(near($lat, 0.400231313403387)); # 67.07 N - - ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.75); - - ok(near($lon, 2.17494903805952)); # 124.62 E - - ok(near($lat, 0.617809294053591)); # 54.60 N - - use Math::Trig 'great_circle_destination'; - - my $dir1 = great_circle_direction(@London, @Tokyo); - my $dst1 = great_circle_distance(@London, @Tokyo); - - ($lon, $lat) = great_circle_destination(@London, $dir1, $dst1); - - ok(near($lon, $Tokyo[0])); - - ok(near($lat, $pip2 - $Tokyo[1])); - - my $dir2 = great_circle_direction(@Tokyo, @London); - my $dst2 = great_circle_distance(@Tokyo, @London); - - ($lon, $lat) = great_circle_destination(@Tokyo, $dir2, $dst2); - - ok(near($lon, $London[0])); - - ok(near($lat, $pip2 - $London[1])); - - my $dir3 = (great_circle_destination(@London, $dir1, $dst1))[2]; - - ok(near($dir3, 2.69379263839118)); # about 154.343 deg - - my $dir4 = (great_circle_destination(@Tokyo, $dir2, $dst2))[2]; - - ok(near($dir4, 3.6993902625701)); # about 211.959 deg - - ok(near($dst1, $dst2)); -} - -SKIP: { -# With netbsd-vax (or any vax) there is neither Inf, nor 1e40. -skip("different float range", 42) if $vax_float; -skip("no inf", 42) unless $has_inf; - -print "# Infinity\n"; - -my $BigDouble = eval '1e40'; - -# E.g. netbsd-alpha core dumps on Inf arith without this. -local $SIG{FPE} = sub { }; - -ok(Inf() > $BigDouble); # This passes in netbsd-alpha. -ok(Inf() + $BigDouble > $BigDouble); # This coredumps in netbsd-alpha. -ok(Inf() + $BigDouble == Inf()); -ok(Inf() - $BigDouble > $BigDouble); -ok(Inf() - $BigDouble == Inf()); -ok(Inf() * $BigDouble > $BigDouble); -ok(Inf() * $BigDouble == Inf()); -ok(Inf() / $BigDouble > $BigDouble); -ok(Inf() / $BigDouble == Inf()); - -ok(-Inf() < -$BigDouble); -ok(-Inf() + $BigDouble < $BigDouble); -ok(-Inf() + $BigDouble == -Inf()); -ok(-Inf() - $BigDouble < -$BigDouble); -ok(-Inf() - $BigDouble == -Inf()); -ok(-Inf() * $BigDouble < -$BigDouble); -ok(-Inf() * $BigDouble == -Inf()); -ok(-Inf() / $BigDouble < -$BigDouble); -ok(-Inf() / $BigDouble == -Inf()); - -print "# sinh/sech/cosh/csch/tanh/coth unto infinity\n"; - -ok(near(sinh(100), eval '1.3441e+43', 1e-3)); -ok(near(sech(100), eval '7.4402e-44', 1e-3)); -ok(near(cosh(100), eval '1.3441e+43', 1e-3)); -ok(near(csch(100), eval '7.4402e-44', 1e-3)); -ok(near(tanh(100), 1)); -ok(near(coth(100), 1)); - -ok(near(sinh(-100), eval '-1.3441e+43', 1e-3)); -ok(near(sech(-100), eval ' 7.4402e-44', 1e-3)); -ok(near(cosh(-100), eval ' 1.3441e+43', 1e-3)); -ok(near(csch(-100), eval '-7.4402e-44', 1e-3)); -ok(near(tanh(-100), -1)); -ok(near(coth(-100), -1)); - -cmp_ok(sinh(1e5), '==', Inf()); -cmp_ok(sech(1e5), '==', 0); -cmp_ok(cosh(1e5), '==', Inf()); -cmp_ok(csch(1e5), '==', 0); -cmp_ok(tanh(1e5), '==', 1); -cmp_ok(coth(1e5), '==', 1); - -cmp_ok(sinh(-1e5), '==', -Inf()); -cmp_ok(sech(-1e5), '==', 0); -cmp_ok(cosh(-1e5), '==', Inf()); -cmp_ok(csch(-1e5), '==', 0); -cmp_ok(tanh(-1e5), '==', -1); -cmp_ok(coth(-1e5), '==', -1); - -} - -print "# great_circle_distance with small angles\n"; - -for my $e (qw(1e-2 1e-3 1e-4 1e-5)) { - # Can't assume == 0 because of floating point fuzz, - # but let's hope for at least < $e. - cmp_ok(great_circle_distance(0, $e, 0, $e), '<', $e); -} - -print "# asin_real, acos_real\n"; - -is(acos_real(-2.0), pi); -is(acos_real(-1.0), pi); -is(acos_real(-0.5), acos(-0.5)); -is(acos_real( 0.0), acos( 0.0)); -is(acos_real( 0.5), acos( 0.5)); -is(acos_real( 1.0), 0); -is(acos_real( 2.0), 0); - -is(asin_real(-2.0), -&pip2); -is(asin_real(-1.0), -&pip2); -is(asin_real(-0.5), asin(-0.5)); -is(asin_real( 0.0), asin( 0.0)); -is(asin_real( 0.5), asin( 0.5)); -is(asin_real( 1.0), pip2); -is(asin_real( 2.0), pip2); - -# eof Index: gnu/usr.bin/perl/cpan/Math-Complex/t/underbar.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Math-Complex/t/underbar.t diff -N gnu/usr.bin/perl/cpan/Math-Complex/t/underbar.t --- gnu/usr.bin/perl/cpan/Math-Complex/t/underbar.t 15 Feb 2023 01:32:43 -0000 1.1.1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,28 +0,0 @@ -# -# Tests that the standard Perl 5 functions that we override -# that operate on the $_ will work correctly [perl #62412] -# - -use Test::More; - -use strict; -use warnings; - -my @f = qw(abs cos exp log sin sqrt); - -plan tests => scalar @f; - -use Math::Complex; - -my %CORE; - -for my $f (@f) { - local $_ = 0.5; - $CORE{$f} = eval "CORE::$f"; -} - -for my $f (@f) { - local $_ = 0.5; - is(eval "Math::Complex::$f", $CORE{$f}, $f); -} - Index: gnu/usr.bin/perl/cpan/Memoize/Memoize.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/Memoize.pm,v diff -u -p -a -u -p -r1.5 Memoize.pm --- gnu/usr.bin/perl/cpan/Memoize/Memoize.pm 25 Jul 2016 10:53:02 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Memoize/Memoize.pm 21 Feb 2024 15:47:01 -0000 @@ -1,207 +1,120 @@ # -*- mode: perl; perl-indent-level: 2; -*- +# vim: ts=8 sw=2 sts=2 noexpandtab + # Memoize.pm # -# Transparent memoization of idempotent functions -# # Copyright 1998, 1999, 2000, 2001, 2012 M. J. Dominus. # You may copy and distribute this program under the -# same terms as Perl itself. If in doubt, -# write to mjd-perl-memoize+@plover.com for a license. - -package Memoize; -$VERSION = '1.03_01'; - -# Compile-time constants -sub SCALAR () { 0 } -sub LIST () { 1 } +# same terms as Perl itself. +use strict; use warnings; -# -# Usage memoize(functionname/ref, -# { NORMALIZER => coderef, INSTALL => name, -# LIST_CACHE => descriptor, SCALAR_CACHE => descriptor } -# +package Memoize; +our $VERSION = '1.16'; use Carp; -use Exporter; -use vars qw($DEBUG); -use Config; # Dammit. -@ISA = qw(Exporter); -@EXPORT = qw(memoize); -@EXPORT_OK = qw(unmemoize flush_cache); -use strict; +use Scalar::Util 1.11 (); # for set_prototype -my %memotable; -my %revmemotable; -my @CONTEXT_TAGS = qw(MERGE TIE MEMORY FAULT HASH); -my %IS_CACHE_TAG = map {($_ => 1)} @CONTEXT_TAGS; +BEGIN { require Exporter; *import = \&Exporter::import } +our @EXPORT = qw(memoize); +our @EXPORT_OK = qw(unmemoize flush_cache); -# Raise an error if the user tries to specify one of thesepackage as a -# tie for LIST_CACHE +my %memotable; -my %scalar_only = map {($_ => 1)} qw(DB_File GDBM_File SDBM_File ODBM_File NDBM_File); +sub CLONE { + my @info = values %memotable; + %memotable = map +($_->{WRAPPER} => $_), @info; +} sub memoize { my $fn = shift; my %options = @_; - my $options = \%options; - + unless (defined($fn) && (ref $fn eq 'CODE' || ref $fn eq '')) { croak "Usage: memoize 'functionname'|coderef {OPTIONS}"; } my $uppack = caller; # TCL me Elmo! - my $cref; # Code reference to original function my $name = (ref $fn ? undef : $fn); - - # Convert function names to code references - $cref = &_make_cref($fn, $uppack); - - # Locate function prototype, if any - my $proto = prototype $cref; - if (defined $proto) { $proto = "($proto)" } - else { $proto = "" } - - # I would like to get rid of the eval, but there seems not to be any - # other way to set the prototype properly. The switch here for - # 'usethreads' works around a bug in threadperl having to do with - # magic goto. It would be better to fix the bug and use the magic - # goto version everywhere. - my $wrapper = - $Config{usethreads} - ? eval "sub $proto { &_memoizer(\$cref, \@_); }" - : eval "sub $proto { unshift \@_, \$cref; goto &_memoizer; }"; + my $cref = _make_cref($fn, $uppack); my $normalizer = $options{NORMALIZER}; if (defined $normalizer && ! ref $normalizer) { $normalizer = _make_cref($normalizer, $uppack); } - - my $install_name; - if (defined $options->{INSTALL}) { - # INSTALL => name - $install_name = $options->{INSTALL}; - } elsif (! exists $options->{INSTALL}) { - # No INSTALL option provided; use original name if possible - $install_name = $name; - } else { - # INSTALL => undef means don't install - } + + my $install_name = exists $options{INSTALL} + ? $options{INSTALL} # use given name (or, if undef: do not install) + : $name; # no INSTALL option provided: default to original name if possible if (defined $install_name) { $install_name = $uppack . '::' . $install_name unless $install_name =~ /::/; - no strict; - local($^W) = 0; # ``Subroutine $install_name redefined at ...'' - *{$install_name} = $wrapper; # Install memoized version } - $revmemotable{$wrapper} = "" . $cref; # Turn code ref into hash key + # convert LIST_CACHE => MERGE to SCALAR_CACHE => MERGE + # to ensure TIE/HASH will always be checked by _check_suitable + if (($options{LIST_CACHE} || '') eq 'MERGE') { + $options{LIST_CACHE} = $options{SCALAR_CACHE}; + $options{SCALAR_CACHE} = 'MERGE'; + } # These will be the caches my %caches; - for my $context (qw(SCALAR LIST)) { - # suppress subsequent 'uninitialized value' warnings - $options{"${context}_CACHE"} ||= ''; - - my $cache_opt = $options{"${context}_CACHE"}; - my @cache_opt_args; - if (ref $cache_opt) { - @cache_opt_args = @$cache_opt; - $cache_opt = shift @cache_opt_args; - } + for my $context (qw(LIST SCALAR)) { # SCALAR_CACHE must be last, to process MERGE + my $fullopt = $options{"${context}_CACHE"} ||= 'MEMORY'; + my ($cache_opt, @cache_opt_args) = ref $fullopt ? @$fullopt : $fullopt; if ($cache_opt eq 'FAULT') { # no cache $caches{$context} = undef; } elsif ($cache_opt eq 'HASH') { # user-supplied hash my $cache = $cache_opt_args[0]; - my $package = ref(tied %$cache); - if ($context eq 'LIST' && $scalar_only{$package}) { - croak("You can't use $package for LIST_CACHE because it can only store scalars"); - } + _check_suitable($context, ref tied %$cache); $caches{$context} = $cache; - } elsif ($cache_opt eq '' || $IS_CACHE_TAG{$cache_opt}) { - # default is that we make up an in-memory hash + } elsif ($cache_opt eq 'TIE') { + carp("TIE option to memoize() is deprecated; use HASH instead") + if warnings::enabled('all'); + my $module = shift(@cache_opt_args) || ''; + _check_suitable($context, $module); + my $hash = $caches{$context} = {}; + (my $modulefile = $module . '.pm') =~ s{::}{/}g; + require $modulefile; + tie(%$hash, $module, @cache_opt_args) + or croak "Couldn't tie memoize hash to `$module': $!"; + } elsif ($cache_opt eq 'MEMORY') { $caches{$context} = {}; - # (this might get tied later, or MERGEd away) + } elsif ($cache_opt eq 'MERGE' and not ref $fullopt) { # ['MERGE'] was never supported + die "cannot MERGE $context\_CACHE" if $context ne 'SCALAR'; # should never happen + die 'bad cache setup order' if not exists $caches{LIST}; # should never happen + $options{MERGED} = 1; + $caches{SCALAR} = $caches{LIST}; } else { - croak "Unrecognized option to `${context}_CACHE': `$cache_opt' should be one of (@CONTEXT_TAGS); aborting"; + croak "Unrecognized option to `${context}_CACHE': `$cache_opt' should be one of (MERGE TIE MEMORY FAULT HASH)"; } } - # Perhaps I should check here that you didn't supply *both* merge - # options. But if you did, it does do something reasonable: They - # both get merged to the same in-memory hash. - if ($options{SCALAR_CACHE} eq 'MERGE' || $options{LIST_CACHE} eq 'MERGE') { - $options{MERGED} = 1; - $caches{SCALAR} = $caches{LIST}; - } + my $wrapper = _wrap($install_name, $cref, $normalizer, $options{MERGED}, \%caches); - # Now deal with the TIE options - { - my $context; - foreach $context (qw(SCALAR LIST)) { - # If the relevant option wasn't `TIE', this call does nothing. - _my_tie($context, $caches{$context}, $options); # Croaks on failure - } + if (defined $install_name) { + no strict; + no warnings 'redefine'; + *{$install_name} = $wrapper; } - - # We should put some more stuff in here eventually. - # We've been saying that for serveral versions now. - # And you know what? More stuff keeps going in! - $memotable{$cref} = - { - O => $options, # Short keys here for things we need to access frequently - N => $normalizer, + + $memotable{$wrapper} = { + L => $caches{LIST}, + S => $caches{SCALAR}, U => $cref, - MEMOIZED => $wrapper, - PACKAGE => $uppack, NAME => $install_name, - S => $caches{SCALAR}, - L => $caches{LIST}, + WRAPPER => $wrapper, }; $wrapper # Return just memoized version } -# This function tries to load a tied hash class and tie the hash to it. -sub _my_tie { - my ($context, $hash, $options) = @_; - my $fullopt = $options->{"${context}_CACHE"}; - - # We already checked to make sure that this works. - my $shortopt = (ref $fullopt) ? $fullopt->[0] : $fullopt; - - return unless defined $shortopt && $shortopt eq 'TIE'; - carp("TIE option to memoize() is deprecated; use HASH instead") - if $^W; - - my @args = ref $fullopt ? @$fullopt : (); - shift @args; - my $module = shift @args; - if ($context eq 'LIST' && $scalar_only{$module}) { - croak("You can't use $module for LIST_CACHE because it can only store scalars"); - } - my $modulefile = $module . '.pm'; - $modulefile =~ s{::}{/}g; - eval { - local @INC = @INC; - pop @INC if $INC[-1] eq '.'; - require $modulefile - }; - if ($@) { - croak "Memoize: Couldn't load hash tie module `$module': $@; aborting"; - } - my $rc = (tie %$hash => $module, @args); - unless ($rc) { - croak "Memoize: Couldn't tie hash to `$module': $!; aborting"; - } - 1; -} - sub flush_cache { my $func = _make_cref($_[0], scalar caller); - my $info = $memotable{$revmemotable{$func}}; + my $info = $memotable{$func}; die "$func not memoized" unless defined $info; for my $context (qw(S L)) { my $cache = $info->{$context}; @@ -216,58 +129,39 @@ sub flush_cache { } } -# This is the function that manages the memo tables. -sub _memoizer { - my $orig = shift; # stringized version of ref to original func. - my $info = $memotable{$orig}; - my $normalizer = $info->{N}; - - my $argstr; - my $context = (wantarray() ? LIST : SCALAR); - - if (defined $normalizer) { - no strict; - if ($context == SCALAR) { - $argstr = &{$normalizer}(@_); - } elsif ($context == LIST) { - ($argstr) = &{$normalizer}(@_); - } else { - croak "Internal error \#41; context was neither LIST nor SCALAR\n"; - } - } else { # Default normalizer - local $^W = 0; - $argstr = join chr(28),@_; - } - - if ($context == SCALAR) { - my $cache = $info->{S}; - _crap_out($info->{NAME}, 'scalar') unless $cache; - if (exists $cache->{$argstr}) { - return $info->{O}{MERGED} - ? $cache->{$argstr}[0] : $cache->{$argstr}; +sub _wrap { + my ($name, $orig, $normalizer, $merged, $caches) = @_; + my ($cache_L, $cache_S) = @$caches{qw(LIST SCALAR)}; + undef $caches; # keep the pad from keeping the hash alive forever + Scalar::Util::set_prototype(sub { + my $argstr = do { + no warnings 'uninitialized'; + defined $normalizer + ? ( wantarray ? ( $normalizer->( @_ ) )[0] : $normalizer->( @_ ) ) + . '' # coerce undef to string while the warning is off + : join chr(28), @_; + }; + + if (wantarray) { + _crap_out($name, 'list') unless $cache_L; + exists $cache_L->{$argstr} ? ( + @{$cache_L->{$argstr}} + ) : do { + my @q = do { no warnings 'recursion'; &$orig }; + $cache_L->{$argstr} = \@q; + @q; + }; } else { - my $val = &{$info->{U}}(@_); - # Scalars are considered to be lists; store appropriately - if ($info->{O}{MERGED}) { - $cache->{$argstr} = [$val]; - } else { - $cache->{$argstr} = $val; - } - $val; + _crap_out($name, 'scalar') unless $cache_S; + exists $cache_S->{$argstr} ? ( + $merged ? $cache_S->{$argstr}[0] : $cache_S->{$argstr} + ) : do { + my $val = do { no warnings 'recursion'; &$orig }; + $cache_S->{$argstr} = $merged ? [$val] : $val; + $val; + }; } - } elsif ($context == LIST) { - my $cache = $info->{L}; - _crap_out($info->{NAME}, 'list') unless $cache; - if (exists $cache->{$argstr}) { - return @{$cache->{$argstr}}; - } else { - my @q = &{$info->{U}}(@_); - $cache->{$argstr} = \@q; - @q; - } - } else { - croak "Internal error \#42; context was neither LIST nor SCALAR\n"; - } + }, prototype $orig); } sub unmemoize { @@ -275,35 +169,21 @@ sub unmemoize { my $uppack = caller; my $cref = _make_cref($f, $uppack); - unless (exists $revmemotable{$cref}) { + unless (exists $memotable{$cref}) { croak "Could not unmemoize function `$f', because it was not memoized to begin with"; } - - my $tabent = $memotable{$revmemotable{$cref}}; + + my $tabent = $memotable{$cref}; unless (defined $tabent) { croak "Could not figure out how to unmemoize function `$f'"; } my $name = $tabent->{NAME}; if (defined $name) { no strict; - local($^W) = 0; # ``Subroutine $install_name redefined at ...'' + no warnings 'redefine'; *{$name} = $tabent->{U}; # Replace with original function } - undef $memotable{$revmemotable{$cref}}; - undef $revmemotable{$cref}; - - # This removes the last reference to the (possibly tied) memo tables - # my ($old_function, $memotabs) = @{$tabent}{'U','S','L'}; - # undef $tabent; - -# # Untie the memo tables if they were tied. -# my $i; -# for $i (0,1) { -# if (tied %{$memotabs->[$i]}) { -# warn "Untying hash #$i\n"; -# untie %{$memotabs->[$i]}; -# } -# } + delete $memotable{$cref}; $tabent->{U}; } @@ -332,7 +212,7 @@ sub _make_cref { my $parent = (caller(1))[3]; # Function that called _make_cref croak "Usage: argument 1 to `$parent' must be a function name or reference.\n"; } - $DEBUG and warn "${name}($fn) => $cref in _make_cref\n"; + our $DEBUG and warn "${name}($fn) => $cref in _make_cref\n"; $cref; } @@ -345,11 +225,20 @@ sub _crap_out { } } -1; - +# Raise an error if the user tries to specify one of these packages as a +# tie for LIST_CACHE +my %scalar_only = map {($_ => 1)} qw(DB_File GDBM_File SDBM_File ODBM_File), map +($_, "Memoize::$_"), qw(AnyDBM_File NDBM_File); +sub _check_suitable { + my ($context, $package) = @_; + croak "You can't use $package for LIST_CACHE because it can only store scalars" + if $context eq 'LIST' and $scalar_only{$package}; +} +1; +__END__ +=pod =head1 NAME @@ -357,7 +246,6 @@ Memoize - Make functions faster by tradi =head1 SYNOPSIS - # This is the documentation for Memoize 1.03 use Memoize; memoize('slow_function'); slow_function(arguments); # Is faster than it was before @@ -384,12 +272,14 @@ Options include: =head1 DESCRIPTION -`Memoizing' a function makes it faster by trading space for time. It +I a function makes it faster by trading space for time. It does this by caching the return values of the function in a table. If you call the function again with the same arguments, C jumps in and gives you the value out of the table, instead of letting the function compute the value all over again. +=head1 EXAMPLE + Here is an extreme example. Consider the Fibonacci sequence, defined by the following function: @@ -412,14 +302,14 @@ run---fib(14) makes 1,200 extra recursiv and recompute things that it already computed. This function is a good candidate for memoization. If you memoize the -`fib' function above, it will compute fib(14) exactly once, the first +C function above, it will compute fib(14) exactly once, the first time it needs to, and then save the result in a table. Then if you ask for fib(14) again, it gives you the result out of the table. While computing fib(14), instead of computing fib(12) twice, it does it once; the second time it needs the value it gets it from the table. It doesn't compute fib(11) four times; it computes it once, getting it from the table the next three times. Instead of making 1,200 -recursive calls to `fib', it makes 15. This makes the function about +recursive calls to C, it makes 15. This makes the function about 150 times faster. You could do the memoization yourself, by rewriting the function, like @@ -446,8 +336,8 @@ This makes it easy to turn memoizing on Here's an even simpler example: I wrote a simple ray tracer; the program would look in a certain direction, figure out what it was -looking at, and then convert the `color' value (typically a string -like `red') of that object to a red, green, and blue pixel value, like +looking at, and then convert the C value (typically a string +like C) of that object to a red, green, and blue pixel value, like this: for ($direction = 0; $direction < 300; $direction++) { @@ -718,7 +608,7 @@ should abort the program. The error mes =item C C normally means that the memoized function does not -distinguish between list and sclar context, and that return values in +distinguish between list and scalar context, and that return values in both contexts should be stored together. Both C MERGE> and C MERGE> mean the same thing. @@ -740,7 +630,7 @@ if C is memoized: $z = complicated(142); The first call will cache the result, say 37, in the scalar cache; the -second will cach the list C<(37)> in the list cache. The third call +second will cache the list C<(37)> in the list cache. The third call doesn't call the real C function; it gets the value 37 from the scalar cache. @@ -749,9 +639,11 @@ storing its return value is a waste of s =E MERGE> will make C use the same cache for scalar and list context return values, so that the second call uses the scalar cache that was populated by the first call. C ends up -being called only once, and both subsequent calls return C<3> from the +being called only once, and both subsequent calls return C<37> from the cache, regardless of the calling context. +=back + =head3 List values in scalar context Consider this function: @@ -783,7 +675,8 @@ stored in the same disk file; this saves two disk files instead of one. You can use a normalizer function to keep the two sets of return values separate. For example: - tie my %cache => 'MLDBM', 'DB_File', $filename, ...; + local $MLDBM::UseDB = 'DB_File'; + tie my %cache => 'MLDBM', $filename, ...; memoize 'myfunc', NORMALIZER => 'n', @@ -801,8 +694,6 @@ This normalizer function will store scal the disk file under keys that begin with C, and list context return values under keys that begin with C. -=back - =head1 OTHER FACILITIES =head2 C @@ -877,7 +768,7 @@ Do not memoize a function with side effe } This function accepts two arguments, adds them, and prints their sum. -Its return value is the numuber of characters it printed, but you +Its return value is the number of characters it printed, but you probably didn't care about that. But C doesn't understand that. If you memoize this function, you will get the result you expect the first time you ask it to print the sum of 2 and 3, but @@ -984,8 +875,8 @@ function (or when your program exits): tie my %cache => 'Memoize::Storable', $filename, 'nstore'; memoize 'function', SCALAR_CACHE => [HASH => \%cache]; -Include the `nstore' option to have the C database written -in `network order'. (See L for more details about this.) +Include the C option to have the C database written +in I. (See L for more details about this.) The C function will raise a run-time error unless the tied package provides a C method. @@ -1016,38 +907,17 @@ C (C called with no arguments) w is a big problem, you can supply a normalizer function that prepends C<"x"> to every key. -=head1 MAILING LIST - -To join a very low-traffic mailing list for announcements about -C, send an empty note to C. - -=head1 AUTHOR +=head1 SEE ALSO -Mark-Jason Dominus (C), Plover Systems co. - -See the C Page at http://perl.plover.com/Memoize/ -for news and upgrades. Near this page, at -http://perl.plover.com/MiniMemoize/ there is an article about +At L there is an article about memoization and about the internals of Memoize that appeared in The -Perl Journal, issue #13. (This article is also included in the -Memoize distribution as `article.html'.) +Perl Journal, issue #13. -The author's book I (2005, ISBN 1558607013, published +Mark-Jason Dominus's book I (2005, ISBN 1558607013, +published by Morgan Kaufmann) discusses memoization (and many other topics) in tremendous detail. It is available on-line for free. -For more information, visit http://hop.perl.plover.com/ . - -To join a mailing list for announcements about C, send an -empty message to C. This mailing -list is for announcements only and has extremely low traffic---fewer than -two messages per year. - -=head1 COPYRIGHT AND LICENSE - -Copyright 1998, 1999, 2000, 2001, 2012 by Mark Jason Dominus - -This library is free software; you may redistribute it and/or modify -it under the same terms as Perl itself. +For more information, visit L. =head1 THANK YOU @@ -1073,5 +943,16 @@ being a light in the world. Special thanks to Jarkko Hietaniemi, the 5.8.0 pumpking, for including this module in the core and for his patient and helpful guidance during the integration process. + +=head1 AUTHOR + +Mark Jason Dominus + +=head1 COPYRIGHT AND LICENSE + +This software is copyright (c) 2012 by Mark Jason Dominus. + +This is free software; you can redistribute it and/or modify it under +the same terms as the Perl 5 programming language system itself. =cut Index: gnu/usr.bin/perl/cpan/Memoize/Memoize/AnyDBM_File.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/Memoize/AnyDBM_File.pm,v diff -u -p -a -u -p -r1.3 AnyDBM_File.pm --- gnu/usr.bin/perl/cpan/Memoize/Memoize/AnyDBM_File.pm 5 Feb 2017 00:32:01 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Memoize/Memoize/AnyDBM_File.pm 21 Feb 2024 15:47:01 -0000 @@ -1,4 +1,26 @@ +use strict; use warnings; + package Memoize::AnyDBM_File; +our $VERSION = '1.16'; + +our @ISA = qw(DB_File GDBM_File Memoize::NDBM_File SDBM_File ODBM_File) unless @ISA; + +for my $mod (@ISA) { + if (eval "require $mod") { + $mod = 'NDBM_File' + if $mod eq 'Memoize::NDBM_File' + and eval { NDBM_File->VERSION( '1.16' ) }; + print STDERR "AnyDBM_File => Selected $mod.\n" if our $Verbose; + @ISA = $mod; + return 1; + } +} + +die "No DBM package was successfully found or installed"; + +__END__ + +=pod =head1 NAME @@ -6,26 +28,10 @@ Memoize::AnyDBM_File - glue to provide E =head1 DESCRIPTION -See L. +This class does the same thing as L, except that instead of +L itself it loads L if L lacks +L> support. -=cut +Code which requires perl 5.37.3 or newer should simply use L directly. -use vars qw(@ISA $VERSION); -$VERSION = '1.03'; -@ISA = qw(DB_File GDBM_File Memoize::NDBM_File Memoize::SDBM_File ODBM_File) unless @ISA; - -my $verbose = 1; - -my $mod; -for $mod (@ISA) { -# (my $truemod = $mod) =~ s/^Memoize:://; -# my $file = "$mod.pm"; -# $file =~ s{::}{/}g; - if (eval "require $mod") { - print STDERR "AnyDBM_File => Selected $mod.\n" if $Verbose; - @ISA = ($mod); # if we leave @ISA alone, warnings abound - return 1; - } -} - -die "No DBM package was successfully found or installed"; +=cut Index: gnu/usr.bin/perl/cpan/Memoize/Memoize/Expire.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/Memoize/Expire.pm,v diff -u -p -a -u -p -r1.3 Expire.pm --- gnu/usr.bin/perl/cpan/Memoize/Memoize/Expire.pm 5 Feb 2017 00:32:01 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Memoize/Memoize/Expire.pm 21 Feb 2024 15:47:01 -0000 @@ -1,23 +1,16 @@ +use strict; use warnings; package Memoize::Expire; -# require 5.00556; +our $VERSION = '1.16'; + use Carp; -$DEBUG = 0; -$VERSION = '1.03'; +our $DEBUG; -# This package will implement expiration by prepending a fixed-length header -# to the font of the cached data. The format of the header will be: +# The format of the metadata is: # (4-byte number of last-access-time) (For LRU when I implement it) # (4-byte expiration time: unsigned seconds-since-unix-epoch) # (2-byte number-of-uses-before-expire) -sub _header_fmt () { "N N n" } -sub _header_size () { length(_header_fmt) } - -# Usage: memoize func -# TIE => [Memoize::Expire, LIFETIME => sec, NUM_USES => n, -# TIE => [...] ] - BEGIN { eval {require Time::HiRes}; unless ($@) { @@ -43,7 +36,7 @@ sub TIEHASH { } $args{LIFETIME} ||= 0; $args{NUM_USES} ||= 0; - $args{C} = \%cache; + $args{C} = delete $args{HASH} || \%cache; bless \%args => $package; } @@ -54,27 +47,25 @@ sub STORE { # The call that results in a value to store into the cache is the # first of the NUM_USES allowed calls. my $header = _make_header(time, $expire_time, $self->{NUM_USES}-1); - $self->{C}{$key} = $header . $value; + @{$self->{C}}{"H$key", "V$key"} = ($header, $value); $value; } sub FETCH { $DEBUG and print STDERR " >> Fetch cached value for $_[1]\n"; - my ($data, $last_access, $expire_time, $num_uses_left) = _get_item($_[0]{C}{$_[1]}); + my ($last_access, $expire_time, $num_uses_left) = _get_header($_[0]{C}{"H$_[1]"}); $DEBUG and print STDERR " >> (ttl: ", ($expire_time-time()), ", nuses: $num_uses_left)\n"; - $num_uses_left--; - $last_access = time; - _set_header(@_, $data, $last_access, $expire_time, $num_uses_left); - $data; + $_[0]{C}{"H$_[1]"} = _make_header(time, $expire_time, --$num_uses_left); + $_[0]{C}{"V$_[1]"}; } sub EXISTS { $DEBUG and print STDERR " >> Exists $_[1]\n"; - unless (exists $_[0]{C}{$_[1]}) { + unless (exists $_[0]{C}{"V$_[1]"}) { $DEBUG and print STDERR " Not in underlying hash at all.\n"; return 0; } - my $item = $_[0]{C}{$_[1]}; + my $item = $_[0]{C}{"H$_[1]"}; my ($last_access, $expire_time, $num_uses_left) = _get_header($item); my $ttl = $expire_time - time; if ($DEBUG) { @@ -91,26 +82,21 @@ sub EXISTS { } } -# Arguments: last access time, expire time, number of uses remaining -sub _make_header { - pack "N N n", @_; +sub FIRSTKEY { + scalar keys %{$_[0]{C}}; + &NEXTKEY; } -sub _strip_header { - substr($_[0], 10); +sub NEXTKEY { + while (defined(my $key = each %{$_[0]{C}})) { + return substr $key, 1 if 'V' eq substr $key, 0, 1; + } + undef; } # Arguments: last access time, expire time, number of uses remaining -sub _set_header { - my ($self, $key, $data, @header) = @_; - $self->{C}{$key} = _make_header(@header) . $data; -} - -sub _get_item { - my $data = substr($_[0], 10); - my @header = unpack "N N n", substr($_[0], 0, 10); -# print STDERR " >> _get_item: $data => $data @header\n"; - ($data, @header); +sub _make_header { + pack "N N n", @_; } # Return last access time, expire time, number of uses remaining @@ -120,6 +106,10 @@ sub _get_header { 1; +__END__ + +=pod + =head1 NAME Memoize::Expire - Plug-in module for automatic expiration of memoized values @@ -249,7 +239,7 @@ the cache, and it should return the cach For example, MyExpirePolicy::TIEHASH might create an object that contains a regular Perl hash (which it will to store the cached values) and some extra information about the arguments and how old the -data is and things like that. Let us call this object `C'. +data is and things like that. Let us call this object I>. When Memoize needs to check to see if an entry is in the cache already, it will invoke C<< C->EXISTS(key) >>. C is the normalized @@ -282,7 +272,7 @@ cache item after ten seconds. $cache->{$key}{EXPIRE_TIME} > time) { return 1 } else { - return 0; # Do NOT return `undef' here. + return 0; # Do NOT return undef here } } @@ -318,11 +308,10 @@ See the documentation for details. =head1 ALTERNATIVES -Brent Powers has a C module that was designed to +Brent Powers has a L module that was designed to work with Memoize and provides expiration of least-recently-used data. The cache is held at a fixed number of entries, and when new data -comes in, the least-recently used data is expired. See -L. +comes in, the least-recently used data is expired. Joshua Chamas's Tie::Cache module may be useful as an expiration manager. (If you try this, let me know how it works out.) @@ -349,7 +338,7 @@ C installed. =head1 AUTHOR -Mark-Jason Dominus (mjd-perl-memoize+@plover.com) +Mark-Jason Dominus Mike Cariaso provided valuable insight into the best way to solve this problem. @@ -359,12 +348,5 @@ problem. perl(1) The Memoize man page. - -http://www.plover.com/~mjd/perl/Memoize/ (for news and updates) - -I maintain a mailing list on which I occasionally announce new -versions of Memoize. The list is for announcements only, not -discussion. To join, send an empty message to -mjd-perl-memoize-request@Plover.com. =cut Index: gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireFile.pm =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireFile.pm diff -N gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireFile.pm --- gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireFile.pm 5 Feb 2017 00:32:01 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,52 +0,0 @@ -package Memoize::ExpireFile; - -=head1 NAME - -Memoize::ExpireFile - test for Memoize expiration semantics - -=head1 DESCRIPTION - -See L. - -=cut - -$VERSION = '1.03'; -use Carp; - -my $Zero = pack("N", 0); - -sub TIEHASH { - my ($package, %args) = @_; - my $cache = $args{HASH} || {}; - bless {ARGS => \%args, C => $cache} => $package; -} - - -sub STORE { -# print "Expiry manager STORE handler\n"; - my ($self, $key, $data) = @_; - my $cache = $self->{C}; - my $cur_date = pack("N", (stat($key))[9]); - $cache->{"C$key"} = $data; - $cache->{"T$key"} = $cur_date; -} - -sub FETCH { - my ($self, $key) = @_; - $self->{C}{"C$key"}; -} - -sub EXISTS { -# print "Expiry manager EXISTS handler\n"; - my ($self, $key) = @_; - my $cache_date = $self->{C}{"T$key"} || $Zero; - my $file_date = pack("N", (stat($key))[9]);# -# if ($self->{ARGS}{CHECK_DATE} && $old_date gt $cur_date) { -# return $self->{ARGS}{CHECK_DATE}->($key, $old_date, $cur_date); -# } - my $res = $cache_date ge $file_date; -# print $res ? "... still good\n" : "... expired\n"; - $res; -} - -1; Index: gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireTest.pm =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireTest.pm diff -N gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireTest.pm --- gnu/usr.bin/perl/cpan/Memoize/Memoize/ExpireTest.pm 5 Feb 2017 00:32:01 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,49 +0,0 @@ -package Memoize::ExpireTest; - -=head1 NAME - -Memoize::ExpireTest - test for Memoize expiration semantics - -=head1 DESCRIPTION - -This module is just for testing expiration semantics. It's not a very -good example of how to write an expiration module. - -If you are looking for an example, I recommend that you look at the -simple example in the Memoize::Expire documentation, or at the code -for Memoize::Expire itself. - -If you have questions, I will be happy to answer them if you send them -to mjd-perl-memoize+@plover.com. - -=cut - -$VERSION = '1.03'; -my %cache; - -sub TIEHASH { - my ($pack) = @_; - bless \%cache => $pack; -} - -sub EXISTS { - my ($cache, $key) = @_; - exists $cache->{$key} ? 1 : 0; -} - -sub FETCH { - my ($cache, $key) = @_; - $cache->{$key}; -} - -sub STORE { - my ($cache, $key, $val) = @_; - $cache->{$key} = $val; -} - -sub expire { - my ($key) = @_; - delete $cache{$key}; -} - -1; Index: gnu/usr.bin/perl/cpan/Memoize/Memoize/NDBM_File.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/Memoize/NDBM_File.pm,v diff -u -p -a -u -p -r1.3 NDBM_File.pm --- gnu/usr.bin/perl/cpan/Memoize/Memoize/NDBM_File.pm 5 Feb 2017 00:32:01 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Memoize/Memoize/NDBM_File.pm 21 Feb 2024 15:47:01 -0000 @@ -1,77 +1,38 @@ -package Memoize::NDBM_File; - -=head1 NAME - -Memoize::NDBM_File - glue to provide EXISTS for NDBM_File for Storable use - -=head1 DESCRIPTION +use strict; use warnings; -See L. - -=cut +package Memoize::NDBM_File; +our $VERSION = '1.16'; use NDBM_File; -@ISA = qw(NDBM_File); -$VERSION = '1.03'; - -$Verbose = 0; +our @ISA = qw(NDBM_File); -sub AUTOLOAD { - warn "Nonexistent function $AUTOLOAD invoked in Memoize::NDBM_File\n"; -} - -sub import { - warn "Importing Memoize::NDBM_File\n" if $Verbose; +# NDBM_File cannot store undef and will store an empty string if you try +# but it does return undef if you try to read a non-existent key +# so we can emulate exists() using defined() +sub EXISTS { + defined shift->FETCH(@_); } +# Perl 5.37.3 adds this EXISTS emulation to NDBM_File itself +delete $Memoize::NDBM_File::{'EXISTS'} + if eval { NDBM_File->VERSION( '1.16' ) }; -my %keylist; - -# This is so ridiculous... -sub _backhash { - my $self = shift; - my %fakehash; - my $k; - for ($k = $self->FIRSTKEY(); defined $k; $k = $self->NEXTKEY($k)) { - $fakehash{$k} = undef; - } - $keylist{$self} = \%fakehash; -} - -sub EXISTS { - warn "Memoize::NDBM_File EXISTS (@_)\n" if $Verbose; - my $self = shift; - _backhash($self) unless exists $keylist{$self}; - my $r = exists $keylist{$self}{$_[0]}; - warn "Memoize::NDBM_File EXISTS (@_) ==> $r\n" if $Verbose; - $r; -} +1; -sub DEFINED { - warn "Memoize::NDBM_File DEFINED (@_)\n" if $Verbose; - my $self = shift; - _backhash($self) unless exists $keylist{$self}; - defined $keylist{$self}{$_[0]}; -} +__END__ -sub DESTROY { - warn "Memoize::NDBM_File DESTROY (@_)\n" if $Verbose; - my $self = shift; - delete $keylist{$self}; # So much for reference counting... - $self->SUPER::DESTROY(@_); -} +=pod -# Maybe establish the keylist at TIEHASH time instead? +=head1 NAME -sub STORE { - warn "Memoize::NDBM_File STORE (@_)\n" if $VERBOSE; - my $self = shift; - $keylist{$self}{$_[0]} = undef; - $self->SUPER::STORE(@_); -} +Memoize::NDBM_File - glue to provide EXISTS for NDBM_File for Storable use +=head1 DESCRIPTION +This class provides L> support for L. -# Inherit FETCH and TIEHASH +L, +support for C was added to L itself. +Code which requires such a perl should simply use L directly. -1; +=cut Index: gnu/usr.bin/perl/cpan/Memoize/Memoize/SDBM_File.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/Memoize/SDBM_File.pm,v diff -u -p -a -u -p -r1.3 SDBM_File.pm --- gnu/usr.bin/perl/cpan/Memoize/Memoize/SDBM_File.pm 5 Feb 2017 00:32:01 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Memoize/Memoize/SDBM_File.pm 21 Feb 2024 15:47:01 -0000 @@ -1,75 +1,27 @@ +use strict; use warnings; + package Memoize::SDBM_File; +our $VERSION = '1.16'; -=head1 NAME +use SDBM_File 1.01; # for EXISTS support +our @ISA = qw(SDBM_File); -Memoize::SDBM_File - glue to provide EXISTS for SDBM_File for Storable use +1; -=head1 DESCRIPTION +__END__ -See L. +=pod -=cut +=head1 NAME -use SDBM_File; -@ISA = qw(SDBM_File); -$VERSION = '1.03'; - -$Verbose = 0; - -sub AUTOLOAD { - warn "Nonexistent function $AUTOLOAD invoked in Memoize::SDBM_File\n"; -} - -sub import { - warn "Importing Memoize::SDBM_File\n" if $Verbose; -} - - -my %keylist; - -# This is so ridiculous... -sub _backhash { - my $self = shift; - my %fakehash; - my $k; - for ($k = $self->FIRSTKEY(); defined $k; $k = $self->NEXTKEY($k)) { - $fakehash{$k} = undef; - } - $keylist{$self} = \%fakehash; -} - -sub EXISTS { - warn "Memoize::SDBM_File EXISTS (@_)\n" if $Verbose; - my $self = shift; - _backhash($self) unless exists $keylist{$self}; - my $r = exists $keylist{$self}{$_[0]}; - warn "Memoize::SDBM_File EXISTS (@_) ==> $r\n" if $Verbose; - $r; -} - -sub DEFINED { - warn "Memoize::SDBM_File DEFINED (@_)\n" if $Verbose; - my $self = shift; - _backhash($self) unless exists $keylist{$self}; - defined $keylist{$self}{$_[0]}; -} - -sub DESTROY { - warn "Memoize::SDBM_File DESTROY (@_)\n" if $Verbose; - my $self = shift; - delete $keylist{$self}; # So much for reference counting... - $self->SUPER::DESTROY(@_); -} - -# Maybe establish the keylist at TIEHASH time instead? - -sub STORE { - warn "Memoize::SDBM_File STORE (@_)\n" if $VERBOSE; - my $self = shift; - $keylist{$self}{$_[0]} = undef; - $self->SUPER::STORE(@_); -} +Memoize::SDBM_File - DEPRECATED compability shim -# Inherit FETCH and TIEHASH +=head1 DESCRIPTION -1; +This class used to provide L> support for L +before support for C was added to L itself +L. + +Any code still using this class should be rewritten to use L directly. + +=cut Index: gnu/usr.bin/perl/cpan/Memoize/Memoize/Storable.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/Memoize/Storable.pm,v diff -u -p -a -u -p -r1.3 Storable.pm --- gnu/usr.bin/perl/cpan/Memoize/Memoize/Storable.pm 5 Feb 2017 00:32:01 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Memoize/Memoize/Storable.pm 21 Feb 2024 15:47:01 -0000 @@ -1,27 +1,19 @@ -package Memoize::Storable; - -=head1 NAME - -Memoize::Storable - store Memoized data in Storable database - -=head1 DESCRIPTION +use strict; use warnings; -See L. +package Memoize::Storable; +our $VERSION = '1.16'; -=cut +use Storable 1.002 (); # for lock_* function variants -use Storable (); -$VERSION = '1.03'; -$Verbose = 0; +our $Verbose; sub TIEHASH { - require Carp if $Verbose; my $package = shift; my $filename = shift; - my $truehash = (-e $filename) ? Storable::retrieve($filename) : {}; + my $truehash = (-e $filename) ? Storable::lock_retrieve($filename) : {}; my %options; print STDERR "Memoize::Storable::TIEHASH($filename, @_)\n" if $Verbose; - @options{@_} = (); + @options{@_} = (1) x @_; my $self = {FILENAME => $filename, H => $truehash, @@ -31,34 +23,30 @@ sub TIEHASH { } sub STORE { - require Carp if $Verbose; my $self = shift; print STDERR "Memoize::Storable::STORE(@_)\n" if $Verbose; $self->{H}{$_[0]} = $_[1]; } sub FETCH { - require Carp if $Verbose; my $self = shift; print STDERR "Memoize::Storable::FETCH(@_)\n" if $Verbose; $self->{H}{$_[0]}; } sub EXISTS { - require Carp if $Verbose; my $self = shift; print STDERR "Memoize::Storable::EXISTS(@_)\n" if $Verbose; exists $self->{H}{$_[0]}; } sub DESTROY { - require Carp if $Verbose; my $self= shift; print STDERR "Memoize::Storable::DESTROY(@_)\n" if $Verbose; if ($self->{OPTIONS}{'nstore'}) { - Storable::nstore($self->{H}, $self->{FILENAME}); + Storable::lock_nstore($self->{H}, $self->{FILENAME}); } else { - Storable::store($self->{H}, $self->{FILENAME}); + Storable::lock_store($self->{H}, $self->{FILENAME}); } } @@ -69,4 +57,19 @@ sub FIRSTKEY { sub NEXTKEY { undef; } + 1; + +__END__ + +=pod + +=head1 NAME + +Memoize::Storable - store Memoized data in Storable database + +=head1 DESCRIPTION + +See L. + +=cut Index: gnu/usr.bin/perl/cpan/Memoize/t/array.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/array.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/array.t --- gnu/usr.bin/perl/cpan/Memoize/t/array.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,68 +0,0 @@ -#!/usr/bin/perl - -use lib '..'; -use Memoize; - - -print "1..11\n"; - -sub timelist { - return (time) x $_[0]; -} - -memoize('timelist'); - -@t1 = &timelist(1); -sleep 2; -@u1 = &timelist(1); -print ((("@t1" eq "@u1") ? '' : 'not '), "ok 1\n"); - -@t7 = &timelist(7); -print (((@t7 == 7) ? '' : 'not '), "ok 2\n"); -$BAD = 0; -for ($i = 1; $i < 7; $i++) { - $BAD++ unless $t7[$i-1] == $t7[$i]; -} -print (($BAD ? 'not ' : ''), "ok 3\n"); - -sleep 2; -@u7 = &timelist(7); -print (((@u7 == 7) ? '' : 'not '), "ok 4\n"); -$BAD = 0; -for ($i = 1; $i < 7; $i++) { - $BAD++ unless $u7[$i-1] == $u7[$i]; -} -print (($BAD ? 'not ' : ''), "ok 5\n"); -# Properly memoized? -print ((("@t7" eq "@u7") ? '' : 'not '), "ok 6\n"); - -sub con { - return wantarray() -} - -# Same arguments yield different results in different contexts? -memoize('con'); -$s = con(1); -@a = con(1); -print ((($s == $a[0]) ? 'not ' : ''), "ok 7\n"); - -# Context propagated correctly? -print ((($s eq '') ? '' : 'not '), "ok 8\n"); # Scalar context -print ((("@a" eq '1' && @a == 1) ? '' : 'not '), "ok 9\n"); # List context - -# Context propagated correctly to normalizer? -sub n { - my $arg = shift; - my $test = shift; - if (wantarray) { - print ((($arg eq ARRAY) ? '' : 'not '), "ok $test\n"); # List context - } else { - print ((($arg eq SCALAR) ? '' : 'not '), "ok $test\n"); # Scalar context - } -} - -sub f { 1 } -memoize('f', NORMALIZER => 'n'); -$s = f('SCALAR', 10); # Test 10 -@a = f('ARRAY' , 11); # Test 11 - Index: gnu/usr.bin/perl/cpan/Memoize/t/array_confusion.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/array_confusion.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/array_confusion.t --- gnu/usr.bin/perl/cpan/Memoize/t/array_confusion.t 24 Mar 2014 14:58:55 -0000 1.1.1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,47 +0,0 @@ -#!/usr/bin/perl - -use lib '..'; -use Memoize 'memoize', 'unmemoize'; -use Test::More; - -sub reff { - return [1,2,3]; - -} - -sub listf { - return (1,2,3); -} - -sub f17 { return 17 } - -plan tests => 7; - -memoize 'reff', LIST_CACHE => 'MERGE'; -memoize 'listf'; - -$s = reff(); -@a = reff(); -is(scalar(@a), 1, "reff list context"); - -$s = listf(); -@a = listf(); -is(scalar(@a), 3, "listf list context"); - -unmemoize 'reff'; -memoize 'reff', LIST_CACHE => 'MERGE'; -unmemoize 'listf'; -memoize 'listf'; - -@a = reff(); -$s = reff(); -is(scalar @a, 1, "reff list context"); - -@a = listf(); -$s = listf(); -is(scalar @a, 3, "listf list context"); - -memoize 'f17', SCALAR_CACHE => 'MERGE'; -is(f17(), 17, "f17 first call"); -is(f17(), 17, "f17 second call"); -is(scalar(f17()), 17, "f17 scalar context call"); Index: gnu/usr.bin/perl/cpan/Memoize/t/basic.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/basic.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/basic.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Memoize/t/basic.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,90 @@ +use strict; use warnings; +use Memoize; +use Test::More tests => 27; + +# here we test memoize() itself i.e. whether it sets everything up as requested +# (except for the (LIST|SCALAR)_CACHE options which are tested elsewhere) + +my ( $sub, $wrapped ); + +sub dummy {1} +$sub = \&dummy; +$wrapped = memoize 'dummy'; +isnt \&dummy, $sub, 'memoizing replaces the sub'; +is ref $wrapped, 'CODE', '... and returns a coderef'; +is \&dummy, $wrapped, '... which is the replacement'; + +sub dummy_i {1} +$sub = \&dummy_i; +$wrapped = memoize 'dummy_i', INSTALL => 'another'; +is \&dummy_i, $sub, 'INSTALL does not replace the sub'; +is \&another, $wrapped, '... but installs the memoized version where requested'; + +sub dummy_p {1} +$sub = \&dummy_p; +$wrapped = memoize 'dummy_p', INSTALL => 'another::package::too'; +is \&another::package::too, $wrapped, '... even if that is a whole other package'; + +sub find_sub { + my ( $needle, $symtbl ) = ( @_, *main::{'HASH'} ); + while ( my ( $name, $glob ) = each %$symtbl ) { + if ( $name =~ /::\z/ ) { + find_sub( $needle, *$glob{'HASH'} ) unless *$glob{'HASH'} == $symtbl; + } elsif ( defined( my $sub = eval { *$glob{'CODE'} } ) ) { + return 1 if $needle == $sub; + } + } + return !1; +} + +sub dummy_u {1} +$sub = \&dummy_u; +$wrapped = memoize 'dummy_u', INSTALL => undef; +is \&dummy_u, $sub, '... unless the passed name is undef'; +ok !find_sub( $wrapped ), '... which does not install the memoized version anywhere'; + +$sub = sub {1}; +$wrapped = memoize $sub; +is ref $wrapped, 'CODE', 'memoizing a $coderef wraps it'; +ok !find_sub( $wrapped ), '... without installing the memoized version anywhere'; + +$sub = sub {1}; +$wrapped = memoize $sub, INSTALL => 'another'; +is \&another, $wrapped, '... unless requested using INSTALL'; + +my $num_args; +sub fake_normalize { $num_args = @_ } +$wrapped = memoize sub {1}, NORMALIZER => 'fake_normalize'; +$wrapped->( ('x') x 7 ); +is $num_args, 7, 'NORMALIZER installs the requested normalizer; both by name'; +$wrapped = memoize sub {1}, NORMALIZER => \&fake_normalize; +$wrapped->( ('x') x 23 ); +is $num_args, 23, '... as well as by reference'; + +$wrapped = eval { memoize 'dummy_none' }; +is $wrapped, undef, 'memoizing a non-existent function fails'; +like $@, qr/^Cannot operate on nonexistent function `dummy_none'/, '... with the expected error'; + +for my $nonsub ({}, [], \my $x) { + is eval { memoize $nonsub }, undef, "memoizing ${\ref $nonsub} ref fails"; + like $@, qr/^Usage: memoize 'functionname'\|coderef \{OPTIONS\}/, '... with the expected error'; +} + +sub no_warnings_ok (&$) { + my $w; + local $SIG{'__WARN__'} = sub { push @$w, @_; &diag }; + shift->(); + local $Test::Builder::Level = $Test::Builder::Level + 1; + is( $w, undef, shift ) or diag join '', @$w; +} + +sub q1 ($) { $_[0] + 1 } +sub q2 () { time } +sub q3 { join "--", @_ } + +no_warnings_ok { memoize 'q1' } 'no warnings with $ protype'; +no_warnings_ok { memoize 'q2' } 'no warnings with empty protype'; +no_warnings_ok { memoize 'q3' } 'no warnings without protype'; +is q1(@{['a'..'z']}), 27, '$ prototype is honored'; +is eval('q2("test")'), undef, 'empty prototype is honored'; +like $@, qr/^Too many arguments for main::q2 /, '... with the expected error'; Index: gnu/usr.bin/perl/cpan/Memoize/t/cache.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/cache.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/cache.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Memoize/t/cache.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,148 @@ +use strict; use warnings; +use Memoize 0.45 qw(memoize unmemoize); +use Fcntl; +use Test::More tests => 65; + +sub list { wantarray ? @_ : $_[-1] } + +# Test FAULT +sub ns {} +sub na {} +ok eval { memoize 'ns', SCALAR_CACHE => 'FAULT'; 1 }, 'SCALAR_CACHE => FAULT'; +ok eval { memoize 'na', LIST_CACHE => 'FAULT'; 1 }, 'LIST_CACHE => FAULT'; +is eval { scalar(ns()) }, undef, 'exception in scalar context'; +is eval { list(na()) }, undef, 'exception in list context'; + +# Test FAULT/FAULT +sub dummy {1} +for ([qw(FAULT FAULT)], [qw(FAULT MERGE)], [qw(MERGE FAULT)]) { + my ($l_opt, $s_opt) = @$_; + my $memodummy = memoize 'dummy', LIST_CACHE => $l_opt, SCALAR_CACHE => $s_opt, INSTALL => undef; + my ($ret, $e); + { local $@; $ret = eval { scalar $memodummy->() }; $e = $@ } + is $ret, undef, "scalar context fails under $l_opt/$s_opt"; + like $e, qr/^Anonymous function called in forbidden scalar context/, '... with the right error message'; + { local $@; $ret = eval { +($memodummy->())[0] }; $e = $@ } + is $ret, undef, "list context fails under $l_opt/$s_opt"; + like $e, qr/^Anonymous function called in forbidden list context/, '... with the right error message'; + unmemoize $memodummy; +} + +# Test HASH +my (%s, %l); +sub nul {} +ok eval { memoize 'nul', SCALAR_CACHE => [HASH => \%s], LIST_CACHE => [HASH => \%l]; 1 }, '*_CACHE => HASH'; +nul('x'); +nul('y'); +is_deeply [sort keys %s], [qw(x y)], 'scalar context calls populate SCALAR_CACHE'; +is_deeply \%l, {}, '... and does not touch the LIST_CACHE'; +%s = (); +() = nul('p'); +() = nul('q'); +is_deeply [sort keys %l], [qw(p q)], 'list context calls populate LIST_CACHE'; +is_deeply \%s, {}, '... and does not touch the SCALAR_CACHE'; + +# Test MERGE +sub xx { wantarray } +ok !scalar(xx()), 'false in scalar context'; +ok list(xx()), 'true in list context'; +ok eval { memoize 'xx', LIST_CACHE => 'MERGE'; 1 }, 'LIST_CACHE => MERGE'; +ok !scalar(xx()), 'false in scalar context again'; +# Should return cached false value from previous invocation +ok !list(xx()), 'still false in list context'; + +sub reff { [1,2,3] } +sub listf { (1,2,3) } + +memoize 'reff', LIST_CACHE => 'MERGE'; +memoize 'listf'; + +scalar reff(); +is_deeply [reff()], [[1,2,3]], 'reff list context after scalar context'; + +scalar listf(); +is_deeply [listf()], [1,2,3], 'listf list context after scalar context'; + +unmemoize 'reff'; +memoize 'reff', LIST_CACHE => 'MERGE'; +unmemoize 'listf'; +memoize 'listf'; + +is_deeply [reff()], [[1,2,3]], 'reff list context'; + +is_deeply [listf()], [1,2,3], 'listf list context'; + +sub f17 { return 17 } +memoize 'f17', SCALAR_CACHE => 'MERGE'; +is_deeply [f17()], [17], 'f17 first call'; +is_deeply [f17()], [17], 'f17 second call'; +is scalar(f17()), 17, 'f17 scalar context call'; + +my (%cache, $num_cache_misses); +sub cacheit { + ++$num_cache_misses; + "cacheit result"; +} +sub test_cacheit { + is scalar(cacheit()), 'cacheit result', 'scalar context'; + is $num_cache_misses, 1, 'function called once'; + + is +(cacheit())[0], 'cacheit result', 'list context'; + is $num_cache_misses, 1, 'function not called again'; + + is_deeply [values %cache], [['cacheit result']], 'expected cached value'; + + %cache = (); + + is +(cacheit())[0], 'cacheit result', 'list context'; + is $num_cache_misses, 2, 'function again called after clearing the cache'; + + is scalar(cacheit()), 'cacheit result', 'scalar context'; + is $num_cache_misses, 2, 'function not called again'; +} + +memoize 'cacheit', LIST_CACHE => [HASH => \%cache], SCALAR_CACHE => 'MERGE'; +test_cacheit; +unmemoize 'cacheit'; +( $num_cache_misses, %cache ) = (); +memoize 'cacheit', SCALAR_CACHE => [HASH => \%cache], LIST_CACHE => 'MERGE'; +test_cacheit; + +# Test errors +my @w; +my $sub = eval { + local $SIG{'__WARN__'} = sub { push @w, @_ }; + memoize(sub {}, LIST_CACHE => ['TIE', 'WuggaWugga']); +}; +is $sub, undef, 'bad TIE fails'; +like $@, qr/^Can't locate WuggaWugga.pm in \@INC/, '... with the expected error'; +like $w[0], qr/^TIE option to memoize\(\) is deprecated; use HASH instead/, '... and the expected deprecation warning'; +is @w, 1, '... and no other warnings'; + +is eval { memoize sub {}, LIST_CACHE => 'YOB GORGLE' }, undef, 'bad LIST_CACHE fails'; +like $@, qr/^Unrecognized option to `LIST_CACHE': `YOB GORGLE'/, '... with the expected error'; + +is eval { memoize sub {}, SCALAR_CACHE => ['YOB GORGLE'] }, undef, 'bad SCALAR_CACHE fails'; +like $@, qr/^Unrecognized option to `SCALAR_CACHE': `YOB GORGLE'/, '... with the expected error'; + +for my $option (qw(LIST_CACHE SCALAR_CACHE)) { + is eval { memoize sub {}, $option => ['MERGE'] }, undef, "$option=>['MERGE'] fails"; + like $@, qr/^Unrecognized option to `$option': `MERGE'/, '... with the expected error'; +} + +# this test needs a DBM which +# a) Memoize knows is scalar-only +# b) is always available (on all platforms, perl configs etc) +# c) never fails to load +# so we use AnyDBM_File (which fulfills (a) & (b)) +# on top of a fake dummy DBM (ditto (b) & (c)) +sub DummyDBM::TIEHASH { bless {}, shift } +$INC{'DummyDBM.pm'} = 1; +@AnyDBM_File::ISA = 'DummyDBM'; +$sub = eval { + no warnings; + memoize sub {}, SCALAR_CACHE => [ TIE => 'AnyDBM_File' ], LIST_CACHE => 'MERGE'; +}; +is $sub, undef, 'smuggling in a scalar-only LIST_CACHE via MERGE fails'; +like $@, qr/^You can't use AnyDBM_File for LIST_CACHE because it can only store scalars/, + '... with the expected error'; Index: gnu/usr.bin/perl/cpan/Memoize/t/correctness.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/t/correctness.t,v diff -u -p -a -u -p -r1.1.1.1 correctness.t --- gnu/usr.bin/perl/cpan/Memoize/t/correctness.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Memoize/t/correctness.t 21 Feb 2024 15:47:01 -0000 @@ -1,129 +1,103 @@ -#!/usr/bin/perl - -use lib '..'; +use strict; use warnings; use Memoize; +use Test::More tests => 17; -print "1..25\n"; - -print "# Basic\n"; - -# A function that should only be called once. -{ my $COUNT = 0; - sub no_args { - $FAIL++ if $COUNT++; - 11; - } -} - -# -memoize('no_args'); - -$c1 = &no_args(); -print (($c1 == 11) ? "ok 1\n" : "not ok 1\n"); -$c2 = &no_args(); -print (($c2 == 11) ? "ok 2\n" : "not ok 2\n"); -print $FAIL ? "not ok 3\n" : "ok 3\n"; # Was it really memoized? - -$FAIL = 0; -$f = do { my $COUNT = 0; sub { $FAIL++ if $COUNT++; 12 } }; -$fm = memoize($f); - -$c1 = &$fm(); -print (($c1 == 12) ? "ok 4\n" : "not ok 4\n"); -$c2 = &$fm(); -print (($c2 == 12) ? "ok 5\n" : "not ok 5\n"); -print $FAIL ? "not ok 6\n" : "ok 6\n"; # Was it really memoized? - -$f = do { my $COUNT = 0; sub { $FAIL++ if $COUNT++; 13 } }; -$fm = memoize($f, INSTALL => 'another'); - -$c1 = &another(); # Was it really installed? -print (($c1 == 13) ? "ok 7\n" : "not ok 7\n"); -$c2 = &another(); -print (($c2 == 13) ? "ok 8\n" : "not ok 8\n"); -print $FAIL ? "not ok 9\n" : "ok 9\n"; # Was it really memoized? -$c3 = &$fm(); # Call memoized version through returned ref -print (($c3 == 13) ? "ok 10\n" : "not ok 10\n"); -print $FAIL ? "not ok 11\n" : "ok 11\n"; # Was it really memoized? -$c4 = &$f(); # Call original version again -print (($c4 == 13) ? "ok 12\n" : "not ok 12\n"); -print $FAIL ? "ok 13\n" : "not ok 13\n"; # Did we get the original? - -print "# Fibonacci\n"; - -sub mt1 { # Fibonacci - my $n = shift; - return $n if $n < 2; - mt1($n-1) + mt2($n-2); -} -sub mt2 { - my $n = shift; - return $n if $n < 2; - mt1($n-1) + mt2($n-2); -} - -@f1 = map { mt1($_) } (0 .. 15); -@f2 = map { mt2($_) } (0 .. 15); -memoize('mt1'); -@f3 = map { mt1($_) } (0 .. 15); -@f4 = map { mt1($_) } (0 .. 15); -@arrays = (\@f1, \@f2, \@f3, \@f4); -$n = 13; -for ($i=0; $i<3; $i++) { - for ($j=$i+1; $j<3; $j++) { - $n++; - print ((@{$arrays[$i]} == @{$arrays[$j]}) ? "ok $n\n" : "not ok $n\n"); - $n++; - for ($k=0; $k < @{$arrays[$i]}; $k++) { - (print "not ok $n\n", next) if $arrays[$i][$k] != $arrays[$j][$k]; - } - print "ok $n\n"; - } -} - - - -print "# Normalizers\n"; - -sub fake_normalize { - return ''; -} +# here we test whether memoization actually has the desired effect -sub f1 { - return shift; +my ($fib, $ns1_calls, $ns2_calls, $total_calls) = ([0,1], 1, 1, 1+1); +while (@$fib < 23) { + push @$fib, $$fib[-1] + $$fib[-2]; + my $n_calls = 1 + $ns1_calls + $ns2_calls; + $total_calls += $n_calls; + ($ns2_calls, $ns1_calls) = ($ns1_calls, $n_calls); +} + +my $num_calls; +sub fib { + ++$num_calls; + my $n = shift; + return $n if $n < 2; + fib($n-1) + fib($n-2); +} + +my @s1 = map 0+fib($_), 0 .. $#$fib; +is_deeply \@s1, $fib, 'unmemoized Fibonacci works'; +is $num_calls, $total_calls, '... with the expected amount of calls'; + +undef $num_calls; +memoize 'fib'; + +my @f1 = map 0+fib($_), 0 .. $#$fib; +my @f2 = map 0+fib($_), 0 .. $#$fib; +is_deeply \@f1, $fib, 'memoized Fibonacci works'; +is $num_calls, @$fib, '... with a minimal amount of calls'; + +######################################################################## + +my $timestamp; +sub timelist { (++$timestamp) x $_[0] } + +memoize('timelist'); + +my $t1 = [timelist(1)]; +is_deeply [timelist(1)], $t1, 'memoizing a volatile function makes it stable'; +my $t7 = [timelist(7)]; +isnt @$t1, @$t7, '... unless the arguments change'; +is_deeply $t7, [($$t7[0]) x 7], '... which leads to the expected new return value'; +is_deeply [timelist(7)], $t7, '... which then also stays stable'; + +sub con { wantarray ? 'list' : 'scalar' } +memoize('con'); +is scalar(con(1)), 'scalar', 'scalar context propgates properly'; +is_deeply [con(1)], ['list'], 'list context propgates properly'; + +######################################################################## + +my %underlying; +sub ExpireTest::TIEHASH { bless \%underlying, shift } +sub ExpireTest::EXISTS { exists $_[0]{$_[1]} } +sub ExpireTest::FETCH { $_[0]{$_[1]} } +sub ExpireTest::STORE { $_[0]{$_[1]} = $_[2] } + +my %CALLS; +sub id { + my($arg) = @_; + ++$CALLS{$arg}; + $arg; +} + +tie my %cache => 'ExpireTest'; +memoize 'id', + SCALAR_CACHE => [HASH => \%cache], + LIST_CACHE => 'FAULT'; + +my $arg = [1..3, 1, 2, 1]; +is_deeply [map scalar(id($_)), @$arg], $arg, 'memoized function sanity check'; +is_deeply \%CALLS, {1=>1,2=>1,3=>1}, 'amount of initial calls per arg as expected'; + +delete $underlying{1}; +$arg = [1..3]; +is_deeply [map scalar(id($_)), @$arg], $arg, 'memoized function sanity check'; +is_deeply \%CALLS, {1=>2,2=>1,3=>1}, 'amount of calls per arg after expiring 1 as expected'; + +delete @underlying{1,2}; +is_deeply [map scalar(id($_)), @$arg], $arg, 'memoized function sanity check'; +is_deeply \%CALLS, {1=>3,2=>2,3=>1}, 'amount of calls per arg after expiring 1 & 2 as expected'; + +######################################################################## + +my $fail; +$SIG{__WARN__} = sub { if ( $_[0] =~ /^Deep recursion/ ) { $fail = 1 } else { warn $_[0] } }; + +my $limit; +sub deep_probe { deep_probe() if ++$limit < 100_000 and not $fail } +sub deep_test { no warnings "recursion"; deep_test() if $limit-- > 0 } +memoize "deep_test"; + +SKIP: { + deep_probe(); + skip "no warning after $limit recursive calls (maybe PERL_SUB_DEPTH_WARN was raised?)", 1 if not $fail; + undef $fail; + deep_test(); + ok !$fail, 'no recursion warning thrown from Memoize'; } -sub f2 { - return shift; -} -sub f3 { - return shift; -} -&memoize('f1'); -&memoize('f2', NORMALIZER => 'fake_normalize'); -&memoize('f3', NORMALIZER => \&fake_normalize); -@f1r = map { f1($_) } (1 .. 10); -@f2r = map { f2($_) } (1 .. 10); -@f3r = map { f3($_) } (1 .. 10); -$n++; -print (("@f1r" eq "1 2 3 4 5 6 7 8 9 10") ? "ok $n\n" : "not ok $n\n"); -$n++; -print (("@f2r" eq "1 1 1 1 1 1 1 1 1 1") ? "ok $n\n" : "not ok $n\n"); -$n++; -print (("@f3r" eq "1 1 1 1 1 1 1 1 1 1") ? "ok $n\n" : "not ok $n\n"); - -print "# INSTALL => undef option.\n"; -{ my $i = 1; - sub u1 { $i++ } -} -my $um = memoize('u1', INSTALL => undef); -@umr = (&$um, &$um, &$um); -@u1r = (&u1, &u1, &u1 ); # Did *not* clobber &u1 -$n++; -print (("@umr" eq "1 1 1") ? "ok $n\n" : "not ok $n\n"); # Increment once -$n++; -print (("@u1r" eq "2 3 4") ? "ok $n\n" : "not ok $n\n"); # Increment thrice -$n++; -print ((defined &{"undef"}) ? "not ok $n\n" : "ok $n\n"); # Just in case - -print "# $n tests in all.\n"; - Index: gnu/usr.bin/perl/cpan/Memoize/t/errors.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/errors.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/errors.t --- gnu/usr.bin/perl/cpan/Memoize/t/errors.t 15 Feb 2023 01:32:38 -0000 1.1.1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,55 +0,0 @@ -#!/usr/bin/perl - -use lib '..'; -use Memoize; -use Config; - -$|=1; -print "1..11\n"; - -eval { memoize({}) }; -print $@ ? "ok 1\n" : "not ok 1 # $@\n"; - -eval { memoize([]) }; -print $@ ? "ok 2\n" : "not ok 2 # $@\n"; - -eval { my $x; memoize(\$x) }; -print $@ ? "ok 3\n" : "not ok 3 # $@\n"; - -# 4--8 -$n = 4; -my $dummyfile = './dummydb'; -use Fcntl; -my %args = ( DB_File => [], - GDBM_File => [$dummyfile, \&GDBM_File::GDBM_NEWDB, 0666], - ODBM_File => [$dummyfile, O_RDWR|O_CREAT, 0666], - NDBM_File => [$dummyfile, O_RDWR|O_CREAT, 0666], - SDBM_File => [$dummyfile, O_RDWR|O_CREAT, 0666], - ); -for $mod (qw(DB_File GDBM_File SDBM_File ODBM_File NDBM_File)) { - eval { - require "$mod.pm"; - tie my %cache => $mod, map { (ref($_) eq 'CODE') ? &$_ : $_ } @{$args{$mod}}; - memoize(sub {}, LIST_CACHE => [HASH => \%cache ]); - }; - print $@ =~ /can only store scalars/ - || $@ =~ /Can't locate.*in \@INC/ - || $@ =~ /Can't load '.*?' for module/ ? "ok $n\n" : "not ok $n # $@\n"; - 1 while unlink $dummyfile, "$dummyfile.dir", "$dummyfile.pag", "$dummyfile.db"; - $n++; -} - -# 9 -eval { local $^W = 0; - memoize(sub {}, LIST_CACHE => ['TIE', 'WuggaWugga']) - }; -print $@ ? "ok 9\n" : "not ok 9 # $@\n"; - -# 10 -eval { memoize(sub {}, LIST_CACHE => 'YOB GORGLE') }; -print $@ ? "ok 10\n" : "not ok 10 # $@\n"; - -# 11 -eval { memoize(sub {}, SCALAR_CACHE => ['YOB GORGLE']) }; -print $@ ? "ok 11\n" : "not ok 11 # $@\n"; - Index: gnu/usr.bin/perl/cpan/Memoize/t/expfile.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/expfile.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/expfile.t --- gnu/usr.bin/perl/cpan/Memoize/t/expfile.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,75 +0,0 @@ -#!/usr/bin/perl - -use lib '..'; -use Memoize; - -my $n = 0; -$|=1; - - -if (-e '.fast') { - print "1..0\n"; - exit 0; -} - -print "1..12\n"; -# (1) -++$n; print "ok $n\n"; - -my $READFILE_CALLS = 0; -my $FILE = './TESTFILE'; - -sub writefile { - my $FILE = shift; - open F, "> $FILE" or die "Couldn't write temporary file $FILE: $!"; - print F scalar(localtime), "\n"; - close F; -} - -sub readfile { - $READFILE_CALLS++; - my $FILE = shift; - open F, "< $FILE" or die "Couldn't write temporary file $FILE: $!"; - my $data = ; - close F; - $data; -} - -require Memoize::ExpireFile; -# (2) -++$n; print "ok $n\n"; - -tie my %cache => 'Memoize::ExpireFile'; -memoize 'readfile', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT' - ; - -# (3) -++$n; print "ok $n\n"; - -# (4) -writefile($FILE); -++$n; print "ok $n\n"; -sleep 4; - -# (5-6) -my $t1 = readfile($FILE); -++$n; print "ok $n\n"; -++$n; print ((($READFILE_CALLS == 1) ? '' : 'not '), "ok $n\n"); - -# (7-9) -my $t2 = readfile($FILE); -++$n; print "ok $n\n"; -++$n; print ((($READFILE_CALLS == 1) ? '' : 'not '), "ok $n\n"); -++$n; print ((($t1 eq $t2) ? '' : 'not '), "ok $n\n"); - -# (10-12) -sleep 4; -writefile($FILE); -my $t3 = readfile($FILE); -++$n; print "ok $n\n"; -++$n; print ((($READFILE_CALLS == 2) ? '' : 'not '), "ok $n\n"); -++$n; print ((($t1 ne $t3) ? '' : 'not '), "ok $n\n"); - -END { 1 while unlink $FILE } Index: gnu/usr.bin/perl/cpan/Memoize/t/expire.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/expire.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/expire.t --- gnu/usr.bin/perl/cpan/Memoize/t/expire.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,72 +0,0 @@ -#!/usr/bin/perl - -use lib '..'; -use Memoize; -use Memoize::ExpireTest; - -my $n = 0; - -print "1..17\n"; - -$n++; print "ok $n\n"; - -my %CALLS; -sub id { - my($arg) = @_; - ++$CALLS{$arg}; - $arg; -} - -tie my %cache => 'Memoize::ExpireTest'; -memoize 'id', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT'; -$n++; print "ok $n\n"; - -for $i (1, 2, 3, 1, 2, 1) { - $n++; - unless ($i == id($i)) { - print "not "; - } - print "ok $n\n"; -} - -for $i (1, 2, 3) { - $n++; - unless ($CALLS{$i} == 1) { - print "not "; - } - print "ok $n\n"; -} - -Memoize::ExpireTest::expire(1); - -for $i (1, 2, 3) { - my $v = id($i); -} - -for $i (1, 2, 3) { - $n++; - unless ($CALLS{$i} == 1 + ($i == 1)) { - print "not "; - } - print "ok $n\n"; -} - -Memoize::ExpireTest::expire(1); -Memoize::ExpireTest::expire(2); - -for $i (1, 2, 3) { - my $v = id($i); -} - -for $i (1, 2, 3) { - $n++; - unless ($CALLS{$i} == 4 - $i) { - print "not "; - } - print "ok $n\n"; -} - -exit 0; - Index: gnu/usr.bin/perl/cpan/Memoize/t/expmod.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/expmod.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/expmod.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Memoize/t/expmod.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,57 @@ +use strict; use warnings; +use Memoize; +use Memoize::Expire; +use Test::More tests => 22; + +tie my %h => 'Memoize::Expire', HASH => \my %backing; + +$h{foo} = 1; +my $num_keys = keys %backing; +my $num_refs = grep ref, values %backing; + +is $h{foo}, 1, 'setting and getting a plain scalar value works'; +cmp_ok $num_keys, '>', 0, 'HASH option is effective'; +is $num_refs, 0, 'backing storage contains only plain scalars'; + +$h{bar} = my $bar = {}; +my $num_keys_step2 = keys %backing; +$num_refs = grep ref, values %backing; + +is ref($h{bar}), ref($bar), 'setting and getting a reference value works'; +cmp_ok $num_keys, '<', $num_keys_step2, 'HASH option is effective'; +is $num_refs, 1, 'backing storage contains only one reference'; + +my $contents = eval { +{ %h } }; + +ok defined $contents, 'dumping the tied hash works'; +is_deeply $contents, { foo => 1, bar => $bar }, ' ... with the expected contents'; + +######################################################################## + +my $RETURN = 1; +my %CALLS; + +tie my %cache => 'Memoize::Expire', NUM_USES => 2; +memoize sub { ++$CALLS{$_[0]}; $RETURN }, + SCALAR_CACHE => [ HASH => \%cache ], + LIST_CACHE => 'FAULT', + INSTALL => 'call'; + +is call($_), 1, "$_ gets new val" for 0..3; + +is_deeply \%CALLS, {0=>1,1=>1,2=>1,3=>1}, 'memoized function called once per argument'; + +$RETURN = 2; +is call(1), 1, '1 expires'; +is call(1), 2, '1 gets new val'; +is call(2), 1, '2 expires'; + +is_deeply \%CALLS, {0=>1,1=>2,2=>1,3=>1}, 'memoized function called for expired argument'; + +$RETURN = 3; +is call(0), 1, '0 expires'; +is call(1), 2, '1 expires'; +is call(2), 3, '2 gets new val'; +is call(3), 1, '3 expires'; + +is_deeply \%CALLS, {0=>1,1=>2,2=>2,3=>1}, 'memoized function called for other expired argument'; Index: gnu/usr.bin/perl/cpan/Memoize/t/expmod_n.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/expmod_n.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/expmod_n.t --- gnu/usr.bin/perl/cpan/Memoize/t/expmod_n.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,62 +0,0 @@ -#!/usr/bin/perl - -use lib '..'; -use Memoize; - -my $n = 0; - - -print "1..22\n"; - -++$n; print "ok $n\n"; - -$RETURN = 1; - -%CALLS = (); -sub call { -# print "CALL $_[0] => $RETURN\n"; - ++$CALLS{$_[0]}; - $RETURN; -} - -require Memoize::Expire; -++$n; print "ok $n\n"; - -tie my %cache => 'Memoize::Expire', NUM_USES => 2; -memoize 'call', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT'; - -# $Memoize::Expire::DEBUG = 1; -++$n; print "ok $n\n"; - -# 3--6 -for (0,1,2,3) { - print "not " unless call($_) == 1; - ++$n; print "ok $n\n"; -} - -# 7--10 -for (keys %CALLS) { - print "not " unless $CALLS{$_} == (1,1,1,1)[$_]; - ++$n; print "ok $n\n"; -} - -# 11--13 -$RETURN = 2; -++$n; print ((call(1) == 1 ? '' : 'not '), "ok $n\n"); # 1 expires -++$n; print ((call(1) == 2 ? '' : 'not '), "ok $n\n"); # 1 gets new val -++$n; print ((call(2) == 1 ? '' : 'not '), "ok $n\n"); # 2 expires - -# 14--17 -$RETURN = 3; -for (0,1,2,3) { - # 0 expires, 1 expires, 2 gets new val, 3 expires - print "not " unless call($_) == (1,2,3,1)[$_]; - ++$n; print "ok $n\n"; -} - -for (0,1,2,3) { - print "not " unless $CALLS{$_} == (1,2,2,1)[$_]; - ++$n; print "ok $n\n"; -} Index: gnu/usr.bin/perl/cpan/Memoize/t/expmod_t.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/t/expmod_t.t,v diff -u -p -a -u -p -r1.1.1.2 expmod_t.t --- gnu/usr.bin/perl/cpan/Memoize/t/expmod_t.t 1 Mar 2021 23:15:31 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Memoize/t/expmod_t.t 21 Feb 2024 15:47:01 -0000 @@ -1,9 +1,6 @@ -#!/usr/bin/perl - -# test caching timeout - -use lib '..'; +use strict; use warnings; use Memoize; +use Memoize::Expire; my $DEBUG = 0; my $LIFETIME = 15; @@ -11,32 +8,21 @@ my $LIFETIME = 15; my $test = 0; $| = 1; -if (-e '.fast') { - print "1..0\n"; +if ($ENV{PERL_MEMOIZE_TESTS_FAST_ONLY}) { + print "1..0 # Skipped: Slow tests disabled\n"; exit 0; } print "# Testing the timed expiration policy.\n"; print "# This will take about thirty seconds.\n"; -print "1..26\n"; - -require Memoize::Expire; -++$test; print "ok $test - Expire loaded\n"; - -sub now { -# print "NOW: @_ ", time(), "\n"; - time; -} +print "1..24\n"; tie my %cache => 'Memoize::Expire', LIFETIME => $LIFETIME; - -memoize 'now', - SCALAR_CACHE => [HASH => \%cache ], - LIST_CACHE => 'FAULT' - ; - -++$test; print "ok $test - function memoized\n"; +memoize sub { time }, + SCALAR_CACHE => [ HASH => \%cache ], + LIST_CACHE => 'FAULT', + INSTALL => 'now'; my (@before, @after, @now); Index: gnu/usr.bin/perl/cpan/Memoize/t/flush.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/t/flush.t,v diff -u -p -a -u -p -r1.1.1.1 flush.t --- gnu/usr.bin/perl/cpan/Memoize/t/flush.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Memoize/t/flush.t 21 Feb 2024 15:47:01 -0000 @@ -1,42 +1,24 @@ -#!/usr/bin/perl - -use lib '..'; -use Memoize 'flush_cache', 'memoize'; -print "1..8\n"; -print "ok 1\n"; - - +use strict; use warnings; +use Memoize qw(flush_cache memoize); +use Test::More tests => 9; my $V = 100; sub VAL { $V } -memoize 'VAL'; -print "ok 2\n"; - -my $c1 = VAL(); -print (($c1 == 100) ? "ok 3\n" : "not ok 3\n"); +ok eval { memoize('VAL'); 1 }, 'memozing the test function'; +is VAL(), 100, '... with the expected return value'; $V = 200; -$c1 = VAL(); -print (($c1 == 100) ? "ok 4\n" : "not ok 4\n"); +is VAL(), 100, '... which is expectedly sticky'; -flush_cache('VAL'); -$c1 = VAL(); -print (($c1 == 200) ? "ok 5\n" : "not ok 5\n"); +ok eval { flush_cache('VAL'); 1 }, 'flusing the cache by name works'; +is VAL(), 200, '... with the expected new return value'; $V = 300; -$c1 = VAL(); -print (($c1 == 200) ? "ok 6\n" : "not ok 6\n"); +is VAL(), 200, '... which is expectedly sticky'; -flush_cache(\&VAL); -$c1 = VAL(); -print (($c1 == 300) ? "ok 7\n" : "not ok 7\n"); +ok eval { flush_cache(\&VAL); 1 }, 'flusing the cache by name works'; +is VAL(), 300, '... with the expected new return value'; $V = 400; -$c1 = VAL(); -print (($c1 == 300) ? "ok 8\n" : "not ok 8\n"); - - - - - +is VAL(), 300, '... which is expectedly sticky'; Index: gnu/usr.bin/perl/cpan/Memoize/t/normalize.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/t/normalize.t,v diff -u -p -a -u -p -r1.1.1.1 normalize.t --- gnu/usr.bin/perl/cpan/Memoize/t/normalize.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Memoize/t/normalize.t 21 Feb 2024 15:47:01 -0000 @@ -1,10 +1,6 @@ -#!/usr/bin/perl - -use lib '..'; +use strict; use warnings; use Memoize; - -print "1..7\n"; - +use Test::More tests => 11; sub n_null { '' } @@ -24,34 +20,47 @@ my $a_normal = memoize('a1', INSTALL => my $a_nomemo = memoize('a2', INSTALL => undef, NORMALIZER => 'n_diff'); my $a_allmemo = memoize('a3', INSTALL => undef, NORMALIZER => 'n_null'); +my @ARGS; @ARGS = (1, 2, 3, 2, 1); -@res = map { &$a_normal($_) } @ARGS; -print ((("@res" eq "1-1 2-2 3-3 2-2 1-1") ? '' : 'not '), "ok 1\n"); - -@res = map { &$a_nomemo($_) } @ARGS; -print ((("@res" eq "1-1 2-2 3-3 2-4 1-5") ? '' : 'not '), "ok 2\n"); +is_deeply [map $a_normal->($_), @ARGS], [qw(1-1 2-2 3-3 2-2 1-1)], 'no normalizer'; +is_deeply [map $a_nomemo->($_), @ARGS], [qw(1-1 2-2 3-3 2-4 1-5)], 'n_diff'; +is_deeply [map $a_allmemo->($_), @ARGS], [qw(1-1 1-1 1-1 1-1 1-1)], 'n_null'; -@res = map { &$a_allmemo($_) } @ARGS; -print ((("@res" eq "1-1 1-1 1-1 1-1 1-1") ? '' : 'not '), "ok 3\n"); - - - # Test fully-qualified name and installation +my $COUNT; $COUNT = 0; sub parity { $COUNT++; $_[0] % 2 } sub parnorm { $_[0] % 2 } memoize('parity', NORMALIZER => 'main::parnorm'); -@res = map { &parity($_) } @ARGS; -print ((("@res" eq "1 0 1 0 1") ? '' : 'not '), "ok 4\n"); -print (( ($COUNT == 2) ? '' : 'not '), "ok 5\n"); +is_deeply [map parity($_), @ARGS], [qw(1 0 1 0 1)], 'parity normalizer'; +is $COUNT, 2, '... with the expected number of calls'; # Test normalization with reference to normalizer function $COUNT = 0; sub par2 { $COUNT++; $_[0] % 2 } memoize('par2', NORMALIZER => \&parnorm); -@res = map { &par2($_) } @ARGS; -print ((("@res" eq "1 0 1 0 1") ? '' : 'not '), "ok 6\n"); -print (( ($COUNT == 2) ? '' : 'not '), "ok 7\n"); - +is_deeply [map par2($_), @ARGS], [qw(1 0 1 0 1)], '... also installable by coderef'; +is $COUNT, 2, '... still with the expected number of calls'; +$COUNT = 0; +sub count_uninitialized { $COUNT += join('', @_) =~ /\AUse of uninitialized value / } +my $war1 = memoize(sub {1}, NORMALIZER => sub {undef}); +{ local $SIG{__WARN__} = \&count_uninitialized; $war1->() } +is $COUNT, 0, 'no warning when normalizer returns undef'; + +# Context propagated correctly to normalizer? +sub n { + my $which = wantarray ? 'list' : 'scalar'; + local $Test::Builder::Level = $Test::Builder::Level + 2; + is $_[0], $which, "$which context propagates properly"; +} +sub f { 1 } +memoize('f', NORMALIZER => 'n'); +my $s = f 'scalar'; +my @a = f 'list'; + +sub args { scalar @_ } +sub null_args { join chr(28), splice @_ } +memoize('args', NORMALIZER => 'null_args'); +ok args(1), 'original @_ is protected from normalizer'; Index: gnu/usr.bin/perl/cpan/Memoize/t/prototype.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/prototype.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/prototype.t --- gnu/usr.bin/perl/cpan/Memoize/t/prototype.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,36 +0,0 @@ -#!/usr/bin/perl - -use lib '..'; -use Memoize; -$EXPECTED_WARNING = '(no warning expected)'; - - -print "1..4\n"; - -sub q1 ($) { $_[0] + 1 } -sub q2 () { time } -sub q3 { join "--", @_ } - -$SIG{__WARN__} = \&handle_warnings; - -$RES = 'ok'; -memoize 'q1'; -print "$RES 1\n"; - -$RES = 'ok'; -memoize 'q2'; -print "$RES 2\n"; - -$RES = 'ok'; -memoize 'q3'; -print "$RES 3\n"; - -# Let's see if the prototype is actually honored -@q = (1..5); -$r = q1(@q); -print (($r == 6) ? '' : 'not ', "ok 4\n"); - -sub handle_warnings { - print $_[0]; - $RES = 'not ok' unless $_[0] eq $EXPECTED_WARNING; -} Index: gnu/usr.bin/perl/cpan/Memoize/t/speed.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/speed.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/speed.t --- gnu/usr.bin/perl/cpan/Memoize/t/speed.t 1 Mar 2021 23:15:31 -0000 1.1.1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,108 +0,0 @@ -#!/usr/bin/perl - -use lib '..'; -use Memoize; - -if (-e '.fast') { - print "1..0\n"; - exit 0; -} -$| = 1; - -# If we don't say anything, maybe nobody will notice. -# print STDERR "\nWarning: I'm testing the speedup. This might take up to thirty seconds.\n "; - -my $COARSE_TIME = 1; - -sub times_to_time { my ($u) = times; $u; } -if ($^O eq 'riscos') { - eval {require Time::HiRes; *my_time = \&Time::HiRes::time }; - if ($@) { *my_time = sub { time }; $COARSE_TIME = 1 } -} else { - *my_time = \×_to_time; -} - - -print "1..6\n"; - - - -# This next test finds an example that takes a long time to run, then -# checks to make sure that the run is actually speeded up by memoization. -# In some sense, this is the most essential correctness test in the package. -# -# We do this by running the fib() function with successfily larger -# arguments until we find one that tales at least $LONG_RUN seconds -# to execute. Then we memoize fib() and run the same call cagain. If -# it doesn't produce the same test in less than one-tenth the time, -# something is seriously wrong. -# -# $LONG_RUN is the number of seconds that the function call must last -# in order for the call to be considered sufficiently long. - - -sub fib { - my $n = shift; - $COUNT++; - return $n if $n < 2; - fib($n-1) + fib($n-2); -} - -sub max { $_[0] > $_[1] ? - $_[0] : $_[1] - } - -$N = 1; - -$ELAPSED = 0; - -my $LONG_RUN = 11; - -while (1) { - my $start = time; - $COUNT=0; - $RESULT = fib($N); - $ELAPSED = time - $start; - last if $ELAPSED >= $LONG_RUN; - if ($ELAPSED > 1) { - print "# fib($N) took $ELAPSED seconds.\n" if $N % 1 == 0; - # we'd expect that fib(n+1) takes about 1.618 times as long as fib(n) - # so now that we have a longish run, let's estimate the value of $N - # that will get us a sufficiently long run. - $N += 1 + int(log($LONG_RUN/$ELAPSED)/log(1.618)); - print "# OK, N=$N ought to do it.\n"; - # It's important not to overshoot here because the running time - # is exponential in $N. If we increase $N too aggressively, - # the user will be forced to wait a very long time. - } else { - $N++; - } -} - -print "# OK, fib($N) was slow enough; it took $ELAPSED seconds.\n"; -print "# Total calls: $COUNT.\n"; - -&memoize('fib'); - -$COUNT=0; -$start = time; -$RESULT2 = fib($N); -$ELAPSED2 = time - $start + .001; # prevent division by 0 errors -print (($RESULT == $RESULT2) ? "ok 1\n" : "not ok 1\n"); -# If it's not ten times as fast, something is seriously wrong. -print "# ELAPSED2=$ELAPSED2 seconds.\n"; -print (($ELAPSED/$ELAPSED2 > 10) ? "ok 2\n" : "not ok 2\n"); - -# If it called the function more than $N times, it wasn't memoized properly -print (($COUNT > $N) ? "ok 3\n" : "not ok 3\n"); - -# Do it again. Should be even faster this time. -$COUNT = 0; -$start = time; -$RESULT2 = fib($N); -$ELAPSED2 = time - $start + .001; # prevent division by 0 errors -print (($RESULT == $RESULT2) ? "ok 4\n" : "not ok 4\n"); -print "# ELAPSED2=$ELAPSED2 seconds.\n"; -print (($ELAPSED/$ELAPSED2 > 10) ? "ok 5\n" : "not ok 5\n"); -# This time it shouldn't have called the function at all. -print ($COUNT == 0 ? "ok 6\n" : "not ok 6\n"); Index: gnu/usr.bin/perl/cpan/Memoize/t/st_concurrency =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/st_concurrency diff -N gnu/usr.bin/perl/cpan/Memoize/t/st_concurrency --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Memoize/t/st_concurrency 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,36 @@ +#!/bin/sh + +# running this script intermittently yields +# +# Magic number checking on storable file failed at ... +# +# but it is difficult to trigger this error 100% reliably +# as would be needed to turn this script into an actual test + +perl -I. -x t/st_concurrency st_shared & +perl -I. -x t/st_concurrency st_shared & +perl -I. -x t/st_concurrency st_shared & +perl -I. -x t/st_concurrency st_shared & +wait && exec rm st_shared + +#!perl +use strict; use warnings; + +use Memoize::Storable; +use Fcntl 'LOCK_EX'; + +sub rand32 () { int rand 1<<32 } + +# the script locks itself to increase the likelihood of the error: +# after releasing the lock, the first process writes to the file +# just as another process acquires the lock and starts to read it +# (but this still does not trigger the error reliably) + +open my $fh, $0 or die $!; +flock $fh, LOCK_EX or die $!; + +tie my %cache => 'Memoize::Storable', $ARGV[0]; +$cache{(rand32)} = rand32; + +close $fh; +# vim: ft=perl Index: gnu/usr.bin/perl/cpan/Memoize/t/threadsafe.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/threadsafe.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/threadsafe.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Memoize/t/threadsafe.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,37 @@ +use strict; use warnings; + +use Memoize qw(memoize unmemoize); +use Test::More + ("$]" < 5.009 || "$]" >= 5.010001) && eval { require threads; 1 } + ? ( tests => 8 ) + : ( skip_all => $@ ); + +my $i; +sub count_up { ++$i } + +memoize('count_up'); +my $cached = count_up(); + +is count_up(), $cached, 'count_up() is memoized'; + +my $got = threads->new(sub { + local $@ = ''; + my $v = eval { count_up() }; + +{ E => $@, V => $v }; +})->join; + +is $got->{E}, '', 'calling count_up() in another thread works'; +is $got->{V}, $cached, '... and returns the same result'; +is count_up(), $cached, '... whereas count_up() on the main thread is unaffected'; + +$got = threads->new(sub { + local $@ = ''; + my $u = eval { unmemoize('count_up') }; + my $v = eval { count_up() }; + +{ E => $@, U => $u, V => $v }; +})->join; + +is $got->{E}, '', 'unmemoizing count_up() in another thread works'; +is ref($got->{U}), 'CODE', '... and returns a coderef as expected'; +is $got->{V}, 1+$cached, '... and does in fact unmemoize the function'; +is count_up(), $cached, '... whereas count_up() on the main thread is unaffected'; Index: gnu/usr.bin/perl/cpan/Memoize/t/tie.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/t/tie.t,v diff -u -p -a -u -p -r1.1.1.1 tie.t --- gnu/usr.bin/perl/cpan/Memoize/t/tie.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Memoize/t/tie.t 21 Feb 2024 15:47:01 -0000 @@ -1,80 +1,8 @@ -#!/usr/bin/perl - -use lib qw(. ..); -use Memoize 0.52 qw(memoize unmemoize); +use strict; use warnings; use Fcntl; -eval {require Memoize::AnyDBM_File}; -if ($@) { - print "1..0\n"; - exit 0; -} - - - -print "1..4\n"; - -sub i { - $_[0]; -} - -$ARG = 'Keith Bostic is a pinhead'; - -sub c119 { 119 } -sub c7 { 7 } -sub c43 { 43 } -sub c23 { 23 } -sub c5 { 5 } - -sub n { - $_[0]+1; -} - -$file = "md$$"; -@files = ($file, "$file.db", "$file.dir", "$file.pag"); -1 while unlink @files; - - -tryout('Memoize::AnyDBM_File', $file, 1); # Test 1..4 -# tryout('DB_File', $file, 1); # Test 1..4 -1 while unlink $file, "$file.dir", "$file.pag"; - -sub tryout { - my ($tiepack, $file, $testno) = @_; - - tie my %cache => $tiepack, $file, O_RDWR | O_CREAT, 0666 - or die $!; - - memoize 'c5', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT' - ; - my $t1 = c5($ARG); - my $t2 = c5($ARG); - print (($t1 == 5) ? "ok $testno\n" : "not ok $testno\n"); - $testno++; - print (($t2 == 5) ? "ok $testno\n" : "not ok $testno\n"); - unmemoize 'c5'; - - # Now something tricky---we'll memoize c23 with the wrong table that - # has the 5 already cached. - memoize 'c23', - SCALAR_CACHE => ['HASH', \%cache], - LIST_CACHE => 'FAULT' - ; - - my $t3 = c23($ARG); - my $t4 = c23($ARG); - $testno++; - print (($t3 == 5) ? "ok $testno\n" : "not ok $testno # Result $t3\n"); - $testno++; - print (($t4 == 5) ? "ok $testno\n" : "not ok $testno # Result $t4\n"); - unmemoize 'c23'; -} +use lib 't/lib'; +use DBMTest 'Memoize::AnyDBM_File', is_scalar_only => 1; -{ - my @present = grep -e, @files; - if (@present && (@failed = grep { not unlink } @present)) { - warn "Can't unlink @failed! ($!)"; - } -} +test_dbm $file, O_RDWR | O_CREAT, 0666; +cleanup; Index: gnu/usr.bin/perl/cpan/Memoize/t/tie_db.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/tie_db.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/tie_db.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Memoize/t/tie_db.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,8 @@ +use strict; use warnings; +use Fcntl; + +use lib 't/lib'; +use DBMTest 'DB_File', is_scalar_only => 1; + +test_dbm $file, O_RDWR | O_CREAT, 0666; +cleanup; Index: gnu/usr.bin/perl/cpan/Memoize/t/tie_gdbm.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/t/tie_gdbm.t,v diff -u -p -a -u -p -r1.1.1.2 tie_gdbm.t --- gnu/usr.bin/perl/cpan/Memoize/t/tie_gdbm.t 15 Feb 2023 01:32:38 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Memoize/t/tie_gdbm.t 21 Feb 2024 15:47:01 -0000 @@ -1,68 +1,8 @@ -#!/usr/bin/perl - -use lib qw(. ..); -use Memoize 0.45 qw(memoize unmemoize); +use strict; use warnings; use Fcntl; -sub i { - $_[0]; -} - -sub c119 { 119 } -sub c7 { 7 } -sub c43 { 43 } -sub c23 { 23 } -sub c5 { 5 } - -sub n { - $_[0]+1; -} - -eval {require GDBM_File}; -if ($@) { - print "1..0\n"; - exit 0; -} - -print "1..4\n"; - -$file = "md$$"; -1 while unlink $file, "$file.dir", "$file.pag"; -tryout('GDBM_File', $file, 1); # Test 1..4 -1 while unlink $file, "$file.dir", "$file.pag"; - -sub tryout { - require GDBM_File; - my ($tiepack, $file, $testno) = @_; - - tie my %cache => $tiepack, $file, &GDBM_File::GDBM_NEWDB, 0666 - or die $!; - - memoize 'c5', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT' - ; - - my $t1 = c5(); - my $t2 = c5(); - print (($t1 == 5) ? "ok $testno\n" : "not ok $testno\n"); - $testno++; - print (($t2 == 5) ? "ok $testno\n" : "not ok $testno\n"); - unmemoize 'c5'; - - # Now something tricky---we'll memoize c23 with the wrong table that - # has the 5 already cached. - memoize 'c23', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT' - ; - - my $t3 = c23(); - my $t4 = c23(); - $testno++; - print (($t3 == 5) ? "ok $testno\n" : "not ok $testno\n"); - $testno++; - print (($t4 == 5) ? "ok $testno\n" : "not ok $testno\n"); - unmemoize 'c23'; -} +use lib 't/lib'; +use DBMTest 'GDBM_File', is_scalar_only => 1; +test_dbm $file, &GDBM_File::GDBM_WRCREAT, 0666; +cleanup; Index: gnu/usr.bin/perl/cpan/Memoize/t/tie_ndbm.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/t/tie_ndbm.t,v diff -u -p -a -u -p -r1.1.1.1 tie_ndbm.t --- gnu/usr.bin/perl/cpan/Memoize/t/tie_ndbm.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Memoize/t/tie_ndbm.t 21 Feb 2024 15:47:01 -0000 @@ -1,70 +1,8 @@ -#!/usr/bin/perl - -use lib qw(. ..); -use Memoize 0.45 qw(memoize unmemoize); +use strict; use warnings; use Fcntl; -# use Memoize::NDBM_File; -# $Memoize::NDBM_File::Verbose = 0; - -sub i { - $_[0]; -} - -sub c119 { 119 } -sub c7 { 7 } -sub c43 { 43 } -sub c23 { 23 } -sub c5 { 5 } - -sub n { - $_[0]+1; -} - -eval {require Memoize::NDBM_File}; -if ($@) { - print "1..0\n"; - exit 0; -} - -print "1..4\n"; - -$file = "md$$"; -1 while unlink $file, "$file.dir", "$file.pag", "$file.db"; -tryout('Memoize::NDBM_File', $file, 1); # Test 1..4 -1 while unlink $file, "$file.dir", "$file.pag", "$file.db"; - -sub tryout { - my ($tiepack, $file, $testno) = @_; - - - tie my %cache => $tiepack, $file, O_RDWR | O_CREAT, 0666 - or die $!; - - memoize 'c5', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT' - ; - my $t1 = c5(); - my $t2 = c5(); - print (($t1 == 5) ? "ok $testno\n" : "not ok $testno\n"); - $testno++; - print (($t2 == 5) ? "ok $testno\n" : "not ok $testno\n"); - unmemoize 'c5'; - - # Now something tricky---we'll memoize c23 with the wrong table that - # has the 5 already cached. - memoize 'c23', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT' - ; - - my $t3 = c23(); - my $t4 = c23(); - $testno++; - print (($t3 == 5) ? "ok $testno\n" : "not ok $testno\n"); - $testno++; - print (($t4 == 5) ? "ok $testno\n" : "not ok $testno\n"); - unmemoize 'c23'; -} +use lib 't/lib'; +use DBMTest 'Memoize::NDBM_File', is_scalar_only => 1; +test_dbm $file, O_RDWR | O_CREAT, 0666; +cleanup; Index: gnu/usr.bin/perl/cpan/Memoize/t/tie_odbm.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/tie_odbm.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/tie_odbm.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Memoize/t/tie_odbm.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,8 @@ +use strict; use warnings; +use Fcntl; + +use lib 't/lib'; +use DBMTest 'ODBM_File', is_scalar_only => 1; + +test_dbm $file, O_RDWR | O_CREAT, 0666; +cleanup; Index: gnu/usr.bin/perl/cpan/Memoize/t/tie_sdbm.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/t/tie_sdbm.t,v diff -u -p -a -u -p -r1.1.1.1 tie_sdbm.t --- gnu/usr.bin/perl/cpan/Memoize/t/tie_sdbm.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Memoize/t/tie_sdbm.t 21 Feb 2024 15:47:01 -0000 @@ -1,75 +1,8 @@ -#!/usr/bin/perl - -use lib qw(. ..); -use Memoize 0.45 qw(memoize unmemoize); +use strict; use warnings; use Fcntl; -# use Memoize::SDBM_File; -# $Memoize::GDBM_File::Verbose = 0; - -sub i { - $_[0]; -} - -sub c119 { 119 } -sub c7 { 7 } -sub c43 { 43 } -sub c23 { 23 } -sub c5 { 5 } - -sub n { - $_[0]+1; -} - -eval {require Memoize::SDBM_File}; -if ($@) { - print "1..0\n"; - exit 0; -} - -print "1..4\n"; - -$file = "md$$"; -1 while unlink $file, "$file.dir", "$file.pag"; -if ( $^O eq 'VMS' ) { - 1 while unlink "$file.sdbm_dir"; -} -tryout('Memoize::SDBM_File', $file, 1); # Test 1..4 -1 while unlink $file, "$file.dir", "$file.pag"; -if ( $^O eq 'VMS' ) { - 1 while unlink "$file.sdbm_dir"; -} - -sub tryout { - my ($tiepack, $file, $testno) = @_; - - tie my %cache => $tiepack, $file, O_RDWR | O_CREAT, 0666 - or die $!; - - memoize 'c5', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT' - ; - my $t1 = c5(); - my $t2 = c5(); - print (($t1 == 5) ? "ok $testno\n" : "not ok $testno\n"); - $testno++; - print (($t2 == 5) ? "ok $testno\n" : "not ok $testno\n"); - unmemoize 'c5'; - - # Now something tricky---we'll memoize c23 with the wrong table that - # has the 5 already cached. - memoize 'c23', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT' - ; - - my $t3 = c23(); - my $t4 = c23(); - $testno++; - print (($t3 == 5) ? "ok $testno\n" : "not ok $testno\n"); - $testno++; - print (($t4 == 5) ? "ok $testno\n" : "not ok $testno\n"); - unmemoize 'c23'; -} +use lib 't/lib'; +use DBMTest 'SDBM_File', is_scalar_only => 1; +test_dbm $file, O_RDWR | O_CREAT, 0666; +cleanup; Index: gnu/usr.bin/perl/cpan/Memoize/t/tie_storable.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/t/tie_storable.t,v diff -u -p -a -u -p -r1.1.1.1 tie_storable.t --- gnu/usr.bin/perl/cpan/Memoize/t/tie_storable.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Memoize/t/tie_storable.t 21 Feb 2024 15:47:01 -0000 @@ -1,76 +1,16 @@ -#!/usr/bin/perl -# -*- mode: perl; perl-indent-level: 2 -*- +use strict; use warnings; +use Test::More; -use lib qw(. ..); -use Memoize 0.45 qw(memoize unmemoize); -# $Memoize::Storable::Verbose = 0; +use lib 't/lib'; +use DBMTest 'Memoize::Storable', extra_tests => 1; -eval {require Memoize::Storable}; -if ($@) { - print "1..0\n"; - exit 0; -} - -sub i { - $_[0]; -} - -sub c119 { 119 } -sub c7 { 7 } -sub c43 { 43 } -sub c23 { 23 } -sub c5 { 5 } +test_dbm $file; +cleanup; -sub n { - $_[0]+1; +SKIP: { + skip "skip Storable $Storable::VERSION too old for last_op_in_netorder", 1 + unless eval { Storable->VERSION('0.609') }; + { tie my %cache, 'Memoize::Storable', $file, 'nstore' or die $! } + ok Storable::last_op_in_netorder(), 'nstore option works'; + cleanup; } - -eval {require Storable}; -if ($@) { - print "1..0\n"; - exit 0; -} - -print "1..4\n"; - -$file = "storable$$"; -1 while unlink $file; -tryout('Memoize::Storable', $file, 1); # Test 1..4 -1 while unlink $file; - -sub tryout { - my ($tiepack, $file, $testno) = @_; - - tie my %cache => $tiepack, $file - or die $!; - - memoize 'c5', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT' - ; - - my $t1 = c5(); - my $t2 = c5(); - print (($t1 == 5) ? "ok $testno\n" : "not ok $testno\n"); - $testno++; - print (($t2 == 5) ? "ok $testno\n" : "not ok $testno\n"); - unmemoize 'c5'; - 1; - 1; - - # Now something tricky---we'll memoize c23 with the wrong table that - # has the 5 already cached. - memoize 'c23', - SCALAR_CACHE => [HASH => \%cache], - LIST_CACHE => 'FAULT' - ; - - my $t3 = c23(); - my $t4 = c23(); - $testno++; - print (($t3 == 5) ? "ok $testno\n" : "not ok $testno\n"); - $testno++; - print (($t4 == 5) ? "ok $testno\n" : "not ok $testno\n"); - unmemoize 'c23'; -} - Index: gnu/usr.bin/perl/cpan/Memoize/t/tiefeatures.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/tiefeatures.t diff -N gnu/usr.bin/perl/cpan/Memoize/t/tiefeatures.t --- gnu/usr.bin/perl/cpan/Memoize/t/tiefeatures.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,50 +0,0 @@ -#!/usr/bin/perl - -use lib 'blib/lib'; -use Memoize 0.45 qw(memoize unmemoize); -use Fcntl; - -# print STDERR $INC{'Memoize.pm'}, "\n"; - -print "1..10\n"; - -# Test MERGE -sub xx { - wantarray(); -} - -my $s = xx(); -print ((!$s) ? "ok 1\n" : "not ok 1\n"); -my ($a) = xx(); -print (($a) ? "ok 2\n" : "not ok 2\n"); -memoize 'xx', LIST_CACHE => MERGE; -$s = xx(); -print ((!$s) ? "ok 3\n" : "not ok 3\n"); -($a) = xx(); # Should return cached false value from previous invocation -print ((!$a) ? "ok 4\n" : "not ok 4\n"); - - -# Test FAULT -sub ns {} -sub na {} -memoize 'ns', SCALAR_CACHE => FAULT; -memoize 'na', LIST_CACHE => FAULT; -eval { my $s = ns() }; # Should fault -print (($@) ? "ok 5\n" : "not ok 5\n"); -eval { my ($a) = na() }; # Should fault -print (($@) ? "ok 6\n" : "not ok 6\n"); - - -# Test HASH -my (%s, %l); -sub nul {} -memoize 'nul', SCALAR_CACHE => [HASH => \%s], LIST_CACHE => [HASH => \%l]; -nul('x'); -nul('y'); -print ((join '', sort keys %s) eq 'xy' ? "ok 7\n" : "not ok 7\n"); -print ((join '', sort keys %l) eq '' ? "ok 8\n" : "not ok 8\n"); -() = nul('p'); -() = nul('q'); -print ((join '', sort keys %s) eq 'xy' ? "ok 9\n" : "not ok 9\n"); -print ((join '', sort keys %l) eq 'pq' ? "ok 10\n" : "not ok 10\n"); - Index: gnu/usr.bin/perl/cpan/Memoize/t/unmemoize.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Memoize/t/unmemoize.t,v diff -u -p -a -u -p -r1.1.1.1 unmemoize.t --- gnu/usr.bin/perl/cpan/Memoize/t/unmemoize.t 24 Sep 2010 14:49:01 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Memoize/t/unmemoize.t 21 Feb 2024 15:47:01 -0000 @@ -1,26 +1,51 @@ -#!/usr/bin/perl - -use lib '..'; +use strict; use warnings; use Memoize qw(memoize unmemoize); +use Test::More tests => 26; -print "1..5\n"; - -eval { unmemoize('f') }; # Should fail -print (($@ ? '' : 'not '), "ok 1\n"); - -{ my $I = 0; - sub u { $I++ } +is eval { unmemoize('u') }, undef, 'trying to unmemoize without memoizing fails'; +my $errx = qr/^Could not unmemoize function `u', because it was not memoized to begin with/; +like $@, $errx, '... with the expected error'; + +sub u {1} +my $sub = \&u; +my $wrapped = memoize('u'); +is \&u, $wrapped, 'trying to memoize succeeds'; + +is eval { unmemoize('u') }, $sub, 'trying to unmemoize succeeds' or diag $@; + +is \&u, $sub, '... and does in fact unmemoize it'; + +is eval { unmemoize('u') }, undef, 'trying to unmemoize it again fails'; +like $@, $errx, '... with the expected error'; + +# Memoizing a function multiple times separately is not very useful +# but it should not break unmemoize or make memoization lose its mind + +my $ret; +my $dummy = sub { $ret }; +ok memoize $dummy, INSTALL => 'memo1'; +ok memoize $dummy, INSTALL => 'memo2'; +ok defined &memo1, 'memoized once'; +ok defined &memo2, 'memoized twice'; +$@ = ''; +ok eval { unmemoize 'memo1' }, 'unmemoized once'; +is $@, '', '... and no exception'; +$@ = ''; +ok eval { unmemoize 'memo2' }, 'unmemoized twice'; +is $@, '', '... and no exception'; +is \&memo1, $dummy, 'unmemoized installed once'; +is \&memo2, $dummy, 'unmemoized installed twice'; + +my @quux = qw(foo bar baz); +my %memo = map +($_ => memoize $dummy), @quux; +for (@quux) { $ret = $_; is $memo{$_}->(), $_, "\$memo{$_}->() returns $_" } +for (@quux) { undef $ret; is $memo{$_}->(), $_, "\$memo{$_}->() returns $_" } + +my $destroyed = 0; +sub Counted::DESTROY { ++$destroyed } +{ + my $memo = memoize $dummy, map +( "$_\_CACHE" => [ HASH => bless {}, 'Counted' ] ), qw(LIST SCALAR); + ok $memo, 'memoize anon'; + ok eval { unmemoize $memo }, 'unmemoized anon'; } -memoize('u'); -my @ur = (&u, &u, &u); -print (("@ur" eq "0 0 0") ? "ok 2\n" : "not ok 2\n"); - -eval { unmemoize('u') }; # Should succeed -print ($@ ? "not ok 3\n" : "ok 3\n"); - -@ur = (&u, &u, &u); -print (("@ur" eq "1 2 3") ? "ok 4\n" : "not ok 4\n"); - -eval { unmemoize('u') }; # Should fail -print ($@ ? "ok 5\n" : "not ok 5\n"); - +is $destroyed, 2, 'no cyclic references'; Index: gnu/usr.bin/perl/cpan/Memoize/t/lib/DBMTest.pm =================================================================== RCS file: gnu/usr.bin/perl/cpan/Memoize/t/lib/DBMTest.pm diff -N gnu/usr.bin/perl/cpan/Memoize/t/lib/DBMTest.pm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/Memoize/t/lib/DBMTest.pm 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,102 @@ +use strict; use warnings; + +package DBMTest; + +my ($module, $is_scalar_only); + +use Memoize qw(memoize unmemoize); +use Test::More; + +sub errlines { split /\n/, $@ } + +my $ARG = 'Keith Bostic is a pinhead'; + +sub c5 { 5 } +sub c23 { 23 } + +sub test_dbm { SKIP: { + tie my %cache, $module, @_ or die $!; + + my $sub = eval { unmemoize memoize sub {}, LIST_CACHE => [ HASH => \%cache ] }; + my $errx = qr/^You can't use \Q$module\E for LIST_CACHE because it can only store scalars/; + if ($is_scalar_only) { + is $sub, undef, "use as LIST_CACHE fails"; + like $@, $errx, '... with the expected error'; + } else { + ok $sub, "use as LIST_CACHE succeeds"; + } + + $sub = eval { no warnings; unmemoize memoize sub {}, LIST_CACHE => [ TIE => $module, @_ ] }; + if ($is_scalar_only) { + is $sub, undef, '... including under the TIE option'; + like $@, $errx, '... with the expected error'; + } else { + ok $sub, 'use as LIST_CACHE succeeds'; + } + + eval { exists $cache{'dummy'}; 1 } + or skip join("\n", 'exists() unsupported', errlines), 3; + + memoize 'c5', + SCALAR_CACHE => [ HASH => \%cache ], + LIST_CACHE => 'FAULT'; + + is c5($ARG), 5, 'store value during first memoization'; + unmemoize 'c5'; + + untie %cache; + + tie %cache, $module, @_ or die $!; + + # Now something tricky---we'll memoize c23 with the wrong table that + # has the 5 already cached. + memoize 'c23', + SCALAR_CACHE => [ HASH => \%cache ], + LIST_CACHE => 'FAULT'; + + is c23($ARG), 5, '... and find it still there after second memoization'; + unmemoize 'c23'; + + untie %cache; + + { no warnings; memoize 'c23', + SCALAR_CACHE => [ TIE => $module, @_ ], + LIST_CACHE => 'FAULT'; + } + + is c23($ARG), 5, '... as well as a third memoization via TIE'; + unmemoize 'c23'; +} } + +my @file; + +sub cleanup { 1 while unlink @file } + +sub import { + (undef, $module, my %arg) = (shift, @_); + + $is_scalar_only = $arg{'is_scalar_only'} ? 2 : 0; + eval "require $module" + ? plan tests => 5 + $is_scalar_only + ($arg{extra_tests}||0) + : plan skip_all => join "\n# ", "Could not load $module", errlines; + + my ($basename) = map { s/.*:://; s/_file\z//; 'm_'.$_.$$ } lc $module; + my $dirfext = $^O eq 'VMS' ? '.sdbm_dir' : '.dir'; # copypaste from DBD::DBM + @file = map { $_, "$_.db", "$_.pag", $_.$dirfext } $basename; + cleanup; + + my $pkg = caller; + no strict 'refs'; + *{$pkg.'::'.$_} = \&$_ for qw(test_dbm cleanup); + *{$pkg.'::file'} = \$basename; +} + +END { + cleanup; + if (my @failed = grep -e, @file) { + @failed = grep !unlink, @failed; # to set $! + warn "Can't unlink @failed! ($!)\n" if @failed; + } +} + +1; Index: gnu/usr.bin/perl/cpan/PerlIO-via-QuotedPrint/lib/PerlIO/via/QuotedPrint.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/PerlIO-via-QuotedPrint/lib/PerlIO/via/QuotedPrint.pm,v diff -u -p -a -u -p -r1.3 QuotedPrint.pm --- gnu/usr.bin/perl/cpan/PerlIO-via-QuotedPrint/lib/PerlIO/via/QuotedPrint.pm 15 Feb 2023 01:36:20 -0000 1.3 +++ gnu/usr.bin/perl/cpan/PerlIO-via-QuotedPrint/lib/PerlIO/via/QuotedPrint.pm 21 Feb 2024 15:47:01 -0000 @@ -12,7 +12,7 @@ use 5.008001; # be as strict as possible use strict; -our $VERSION = '0.09'; +our $VERSION = '0.10'; # modules that we need use MIME::QuotedPrint (); # no need to pollute this namespace @@ -163,11 +163,11 @@ Public License or the Artistic License, =head1 VERSION -Version 0.09 +Version 0.10 =head1 DATE -08 Dec 2020 +22 May 2022 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/PerlIO-via-QuotedPrint/t/QuotedPrint.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/PerlIO-via-QuotedPrint/t/QuotedPrint.t,v diff -u -p -a -u -p -r1.1.1.3 QuotedPrint.t --- gnu/usr.bin/perl/cpan/PerlIO-via-QuotedPrint/t/QuotedPrint.t 15 Feb 2023 01:32:38 -0000 1.1.1.3 +++ gnu/usr.bin/perl/cpan/PerlIO-via-QuotedPrint/t/QuotedPrint.t 21 Feb 2024 15:47:01 -0000 @@ -10,6 +10,7 @@ BEGIN { # Magic } if (ord("A") == 193) { print "1..0 # Skip: EBCDIC\n"; + exit 0; } } Index: gnu/usr.bin/perl/cpan/Pod-Checker/lib/Pod/Checker.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Pod-Checker/lib/Pod/Checker.pm,v diff -u -p -a -u -p -r1.1.1.3 Checker.pm --- gnu/usr.bin/perl/cpan/Pod-Checker/lib/Pod/Checker.pm 15 Feb 2023 01:32:43 -0000 1.1.1.3 +++ gnu/usr.bin/perl/cpan/Pod-Checker/lib/Pod/Checker.pm 21 Feb 2024 15:47:00 -0000 @@ -10,7 +10,7 @@ package Pod::Checker; use strict; use warnings; -our $VERSION = '1.74'; ## Current version of this package +our $VERSION = '1.75'; ## Current version of this package =head1 NAME @@ -1112,7 +1112,10 @@ sub new { $self->{'-line'} ||= $caller->{'_line'}; $self->{'-type'} ||= $simple_link->{'type'}; - + # preserve raw link text for additional checks + $self->{'-raw-link-text'} = (exists $simple_link->{'raw'}) + ? "$simple_link->{'raw'}" + : ""; # Force stringification of page and node. (This expands any E<>.) $self->{'-page'} = exists $simple_link->{'to'} ? "$simple_link->{'to'}" : ""; $self->{'-node'} = exists $simple_link->{'section'} ? "$simple_link->{'section'}" : ""; Index: gnu/usr.bin/perl/cpan/Pod-Usage/lib/Pod/Usage.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Pod-Usage/lib/Pod/Usage.pm,v diff -u -p -a -u -p -r1.4 Usage.pm --- gnu/usr.bin/perl/cpan/Pod-Usage/lib/Pod/Usage.pm 15 Feb 2023 01:36:21 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Pod-Usage/lib/Pod/Usage.pm 21 Feb 2024 15:47:00 -0000 @@ -18,7 +18,7 @@ use Config; use Exporter; use File::Spec; -our $VERSION = '2.01'; +our $VERSION = '2.03'; our @EXPORT = qw(&pod2usage); our @ISA; Index: gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/PlainText.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/PlainText.pm,v diff -u -p -a -u -p -r1.1.1.2 PlainText.pm --- gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/PlainText.pm 15 Feb 2023 01:32:35 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Pod-Usage/t/inc/Pod/PlainText.pm 21 Feb 2024 15:47:00 -0000 @@ -37,6 +37,12 @@ BEGIN { require Symbol; Symbol->import; } + if ($] < 5.008 || ord "A" == 65) { + *to_native = sub { return chr shift; }; + } + else { + *to_native = sub { return chr utf8::unicode_to_native(shift); }; + } } ############################################################################ @@ -52,71 +58,71 @@ BEGIN { 'gt' => '>', # right chevron, greater-than 'quot' => '"', # double quote - "Aacute" => "\xC1", # capital A, acute accent - "aacute" => "\xE1", # small a, acute accent - "Acirc" => "\xC2", # capital A, circumflex accent - "acirc" => "\xE2", # small a, circumflex accent - "AElig" => "\xC6", # capital AE diphthong (ligature) - "aelig" => "\xE6", # small ae diphthong (ligature) - "Agrave" => "\xC0", # capital A, grave accent - "agrave" => "\xE0", # small a, grave accent - "Aring" => "\xC5", # capital A, ring - "aring" => "\xE5", # small a, ring - "Atilde" => "\xC3", # capital A, tilde - "atilde" => "\xE3", # small a, tilde - "Auml" => "\xC4", # capital A, dieresis or umlaut mark - "auml" => "\xE4", # small a, dieresis or umlaut mark - "Ccedil" => "\xC7", # capital C, cedilla - "ccedil" => "\xE7", # small c, cedilla - "Eacute" => "\xC9", # capital E, acute accent - "eacute" => "\xE9", # small e, acute accent - "Ecirc" => "\xCA", # capital E, circumflex accent - "ecirc" => "\xEA", # small e, circumflex accent - "Egrave" => "\xC8", # capital E, grave accent - "egrave" => "\xE8", # small e, grave accent - "ETH" => "\xD0", # capital Eth, Icelandic - "eth" => "\xF0", # small eth, Icelandic - "Euml" => "\xCB", # capital E, dieresis or umlaut mark - "euml" => "\xEB", # small e, dieresis or umlaut mark - "Iacute" => "\xCD", # capital I, acute accent - "iacute" => "\xED", # small i, acute accent - "Icirc" => "\xCE", # capital I, circumflex accent - "icirc" => "\xEE", # small i, circumflex accent - "Igrave" => "\xCD", # capital I, grave accent - "igrave" => "\xED", # small i, grave accent - "Iuml" => "\xCF", # capital I, dieresis or umlaut mark - "iuml" => "\xEF", # small i, dieresis or umlaut mark - "Ntilde" => "\xD1", # capital N, tilde - "ntilde" => "\xF1", # small n, tilde - "Oacute" => "\xD3", # capital O, acute accent - "oacute" => "\xF3", # small o, acute accent - "Ocirc" => "\xD4", # capital O, circumflex accent - "ocirc" => "\xF4", # small o, circumflex accent - "Ograve" => "\xD2", # capital O, grave accent - "ograve" => "\xF2", # small o, grave accent - "Oslash" => "\xD8", # capital O, slash - "oslash" => "\xF8", # small o, slash - "Otilde" => "\xD5", # capital O, tilde - "otilde" => "\xF5", # small o, tilde - "Ouml" => "\xD6", # capital O, dieresis or umlaut mark - "ouml" => "\xF6", # small o, dieresis or umlaut mark - "szlig" => "\xDF", # small sharp s, German (sz ligature) - "THORN" => "\xDE", # capital THORN, Icelandic - "thorn" => "\xFE", # small thorn, Icelandic - "Uacute" => "\xDA", # capital U, acute accent - "uacute" => "\xFA", # small u, acute accent - "Ucirc" => "\xDB", # capital U, circumflex accent - "ucirc" => "\xFB", # small u, circumflex accent - "Ugrave" => "\xD9", # capital U, grave accent - "ugrave" => "\xF9", # small u, grave accent - "Uuml" => "\xDC", # capital U, dieresis or umlaut mark - "uuml" => "\xFC", # small u, dieresis or umlaut mark - "Yacute" => "\xDD", # capital Y, acute accent - "yacute" => "\xFD", # small y, acute accent - "yuml" => "\xFF", # small y, dieresis or umlaut mark + "Aacute" => to_native(0xC1), # capital A, acute accent + "aacute" => to_native(0xE1), # small a, acute accent + "Acirc" => to_native(0xC2), # capital A, circumflex accent + "acirc" => to_native(0xE2), # small a, circumflex accent + "AElig" => to_native(0xC6), # capital AE diphthong (ligature) + "aelig" => to_native(0xE6), # small ae diphthong (ligature) + "Agrave" => to_native(0xC0), # capital A, grave accent + "agrave" => to_native(0xE0), # small a, grave accent + "Aring" => to_native(0xC5), # capital A, ring + "aring" => to_native(0xE5), # small a, ring + "Atilde" => to_native(0xC3), # capital A, tilde + "atilde" => to_native(0xE3), # small a, tilde + "Auml" => to_native(0xC4), # capital A, dieresis or umlaut mark + "auml" => to_native(0xE4), # small a, dieresis or umlaut mark + "Ccedil" => to_native(0xC7), # capital C, cedilla + "ccedil" => to_native(0xE7), # small c, cedilla + "Eacute" => to_native(0xC9), # capital E, acute accent + "eacute" => to_native(0xE9), # small e, acute accent + "Ecirc" => to_native(0xCA), # capital E, circumflex accent + "ecirc" => to_native(0xEA), # small e, circumflex accent + "Egrave" => to_native(0xC8), # capital E, grave accent + "egrave" => to_native(0xE8), # small e, grave accent + "ETH" => to_native(0xD0), # capital Eth, Icelandic + "eth" => to_native(0xF0), # small eth, Icelandic + "Euml" => to_native(0xCB), # capital E, dieresis or umlaut mark + "euml" => to_native(0xEB), # small e, dieresis or umlaut mark + "Iacute" => to_native(0xCD), # capital I, acute accent + "iacute" => to_native(0xED), # small i, acute accent + "Icirc" => to_native(0xCE), # capital I, circumflex accent + "icirc" => to_native(0xEE), # small i, circumflex accent + "Igrave" => to_native(0xCD), # capital I, grave accent + "igrave" => to_native(0xED), # small i, grave accent + "Iuml" => to_native(0xCF), # capital I, dieresis or umlaut mark + "iuml" => to_native(0xEF), # small i, dieresis or umlaut mark + "Ntilde" => to_native(0xD1), # capital N, tilde + "ntilde" => to_native(0xF1), # small n, tilde + "Oacute" => to_native(0xD3), # capital O, acute accent + "oacute" => to_native(0xF3), # small o, acute accent + "Ocirc" => to_native(0xD4), # capital O, circumflex accent + "ocirc" => to_native(0xF4), # small o, circumflex accent + "Ograve" => to_native(0xD2), # capital O, grave accent + "ograve" => to_native(0xF2), # small o, grave accent + "Oslash" => to_native(0xD8), # capital O, slash + "oslash" => to_native(0xF8), # small o, slash + "Otilde" => to_native(0xD5), # capital O, tilde + "otilde" => to_native(0xF5), # small o, tilde + "Ouml" => to_native(0xD6), # capital O, dieresis or umlaut mark + "ouml" => to_native(0xF6), # small o, dieresis or umlaut mark + "szlig" => to_native(0xDF), # small sharp s, German (sz ligature) + "THORN" => to_native(0xDE), # capital THORN, Icelandic + "thorn" => to_native(0xFE), # small thorn, Icelandic + "Uacute" => to_native(0xDA), # capital U, acute accent + "uacute" => to_native(0xFA), # small u, acute accent + "Ucirc" => to_native(0xDB), # capital U, circumflex accent + "ucirc" => to_native(0xFB), # small u, circumflex accent + "Ugrave" => to_native(0xD9), # capital U, grave accent + "ugrave" => to_native(0xF9), # small u, grave accent + "Uuml" => to_native(0xDC), # capital U, dieresis or umlaut mark + "uuml" => to_native(0xFC), # small u, dieresis or umlaut mark + "Yacute" => to_native(0xDD), # capital Y, acute accent + "yacute" => to_native(0xFD), # small y, acute accent + "yuml" => to_native(0xFF), # small y, dieresis or umlaut mark - "lchevron" => "\xAB", # left chevron (double less than) - "rchevron" => "\xBB", # right chevron (double greater than) + "lchevron" => to_native(0xAB), # left chevron (double less than) + "rchevron" => to_native(0xBB), # right chevron (double greater than) ); Index: gnu/usr.bin/perl/cpan/Pod-Usage/t/pod/pod2usage2.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Pod-Usage/t/pod/pod2usage2.t,v diff -u -p -a -u -p -r1.4 pod2usage2.t --- gnu/usr.bin/perl/cpan/Pod-Usage/t/pod/pod2usage2.t 15 Feb 2023 01:36:21 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Pod-Usage/t/pod/pod2usage2.t 21 Feb 2024 15:47:00 -0000 @@ -361,6 +361,7 @@ like ($text, qr/frobnicate - do what I m *Pod::Usage::initialize = sub { 1; }; } +our $TODO; SKIP: { my $perldoc = $^X . 'doc'; skip "Missing perldoc binary", 2 unless -x $perldoc; @@ -378,8 +379,10 @@ SKIP: { } ); is ($exit, 0, "Exit status pod2usage with special perldoc case"); # output went to devnull - like ($text, qr/^\s*$/s, "Output test pod2usage with special perldoc case") or diag "Got:\n$text\n"; - + TODO: { + local $TODO = q[Can get output from stty view #14]; + is( length($text), 0, "Output test pod2usage with special perldoc case") or diag "Got:\n$text\n"; + } } # bad regexp syntax Index: gnu/usr.bin/perl/cpan/Scalar-List-Utils/ListUtil.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Scalar-List-Utils/ListUtil.xs,v diff -u -p -a -u -p -r1.5 ListUtil.xs --- gnu/usr.bin/perl/cpan/Scalar-List-Utils/ListUtil.xs 15 Feb 2023 01:36:21 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Scalar-List-Utils/ListUtil.xs 21 Feb 2024 15:47:01 -0000 @@ -800,12 +800,12 @@ PPCODE: } } - if ( end < start ) { + if ( end <= start ) { XSRETURN(0); } else { EXTEND( SP, end - start ); - for ( i = start; i <= end; i++ ) { + for ( i = start; i < end; i++ ) { PUSHs( sv_2mortal( newSVsv( ST(i) ) ) ); } XSRETURN( end - start ); Index: gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/List/Util.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/List/Util.pm,v diff -u -p -a -u -p -r1.5 Util.pm --- gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/List/Util.pm 15 Feb 2023 01:36:21 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/List/Util.pm 21 Feb 2024 15:47:01 -0000 @@ -16,7 +16,7 @@ our @EXPORT_OK = qw( sample shuffle uniq uniqint uniqnum uniqstr zip zip_longest zip_shortest mesh mesh_longest mesh_shortest head tail pairs unpairs pairkeys pairvalues pairmap pairgrep pairfirst ); -our $VERSION = "1.62"; +our $VERSION = "1.63"; our $XS_VERSION = $VERSION; $VERSION =~ tr/_//d; Index: gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/List/Util/XS.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/List/Util/XS.pm,v diff -u -p -a -u -p -r1.5 XS.pm --- gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/List/Util/XS.pm 15 Feb 2023 01:36:21 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/List/Util/XS.pm 21 Feb 2024 15:47:01 -0000 @@ -3,7 +3,7 @@ use strict; use warnings; use List::Util; -our $VERSION = "1.62"; # FIXUP +our $VERSION = "1.63"; # FIXUP $VERSION =~ tr/_//d; # FIXUP 1; Index: gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Scalar/Util.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Scalar/Util.pm,v diff -u -p -a -u -p -r1.5 Util.pm --- gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Scalar/Util.pm 15 Feb 2023 01:36:21 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Scalar/Util.pm 21 Feb 2024 15:47:01 -0000 @@ -17,7 +17,7 @@ our @EXPORT_OK = qw( dualvar isdual isvstring looks_like_number openhandle readonly set_prototype tainted ); -our $VERSION = "1.62"; +our $VERSION = "1.63"; $VERSION =~ tr/_//d; require List::Util; # List::Util loads the XS @@ -145,7 +145,7 @@ on these but C will return th C<"REGEXP"> in all capitals. I an equivalent function is available as -C. +C. =head2 weaken @@ -230,7 +230,7 @@ B: Copying a weak reference create $weak = isweak($copy); # false I an equivalent function is available as -C. +C. =head1 OTHER FUNCTIONS Index: gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Sub/Util.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Sub/Util.pm,v diff -u -p -a -u -p -r1.4 Util.pm --- gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Sub/Util.pm 15 Feb 2023 01:36:21 -0000 1.4 +++ gnu/usr.bin/perl/cpan/Scalar-List-Utils/lib/Sub/Util.pm 21 Feb 2024 15:47:01 -0000 @@ -15,7 +15,7 @@ our @EXPORT_OK = qw( subname set_subname ); -our $VERSION = "1.62"; +our $VERSION = "1.63"; $VERSION =~ tr/_//d; require List::Util; # as it has the XS Index: gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/exotic_names.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/exotic_names.t,v diff -u -p -a -u -p -r1.1.1.2 exotic_names.t --- gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/exotic_names.t 1 Mar 2021 23:15:34 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Scalar-List-Utils/t/exotic_names.t 21 Feb 2024 15:47:01 -0000 @@ -40,8 +40,8 @@ sub caller3_ok { ), ( $ord > 255 ? unpack('H*', pack 'C0U', $ord ) - : ($ord > 0x1f and $ord < 0x7f) ? sprintf "%c", $ord - : sprintf '\%o', $ord + : (chr $ord =~ /[[:print:]]/) ? sprintf "%c", $ord + : sprintf '\%o', $ord ), ); Index: gnu/usr.bin/perl/cpan/Socket/Makefile.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Socket/Makefile.PL,v diff -u -p -a -u -p -r1.5 Makefile.PL --- gnu/usr.bin/perl/cpan/Socket/Makefile.PL 15 Feb 2023 01:36:21 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Socket/Makefile.PL 21 Feb 2024 15:47:00 -0000 @@ -219,13 +219,14 @@ my @names = ( SO_ACCEPTCONN SO_ATTACH_FILTER SO_BACKLOG SO_BINDTODEVICE SO_BROADCAST SO_BSDCOMPAT SO_BUSY_POLL SO_CHAMELEON SO_DEBUG SO_DETACH_FILTER SO_DGRAM_ERRIND SO_DOMAIN SO_DONTLINGER SO_DONTROUTE SO_ERROR SO_FAMILY - SO_KEEPALIVE SO_LINGER SO_LOCK_FILTER SO_MARK SO_OOBINLINE SO_PASSCRED - SO_PASSIFNAME SO_PEEK_OFF SO_PEERCRED SO_PRIORITY SO_PROTOCOL - SO_PROTOTYPE SO_RCVBUF SO_RCVBUFFORCE SO_RCVLOWAT SO_RCVTIMEO - SO_REUSEADDR SO_REUSEPORT SO_RXQ_OVFL SO_SECURITY_AUTHENTICATION - SO_SECURITY_ENCRYPTION_NETWORK SO_SECURITY_ENCRYPTION_TRANSPORT - SO_SNDBUF SO_SNDBUFFORCE SO_SNDLOWAT SO_SNDTIMEO SO_STATE SO_TIMESTAMP - SO_TYPE SO_USELOOPBACK SO_XOPEN SO_XSE + SO_INCOMING_CPU SO_INCOMING_NAPI_ID SO_KEEPALIVE SO_LINGER + SO_LOCK_FILTER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSIFNAME + SO_PEEK_OFF SO_PEERCRED SO_PRIORITY SO_PROTOCOL SO_PROTOTYPE SO_RCVBUF + SO_RCVBUFFORCE SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT + SO_RXQ_OVFL SO_SECURITY_AUTHENTICATION SO_SECURITY_ENCRYPTION_NETWORK + SO_SECURITY_ENCRYPTION_TRANSPORT SO_SNDBUF SO_SNDBUFFORCE SO_SNDLOWAT + SO_SNDTIMEO SO_STATE SO_TIMESTAMP SO_TYPE SO_USELOOPBACK SO_XOPEN + SO_XSE TCP_CONGESTION TCP_CONNECTIONTIMEOUT TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_INFO TCP_INIT_CWND TCP_KEEPALIVE TCP_KEEPCNT Index: gnu/usr.bin/perl/cpan/Socket/Socket.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Socket/Socket.pm,v diff -u -p -a -u -p -r1.5 Socket.pm --- gnu/usr.bin/perl/cpan/Socket/Socket.pm 15 Feb 2023 01:36:21 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Socket/Socket.pm 21 Feb 2024 15:47:00 -0000 @@ -3,7 +3,7 @@ package Socket; use strict; { use v5.6.1; } -our $VERSION = '2.033'; +our $VERSION = '2.036'; =head1 NAME @@ -793,7 +793,8 @@ our @EXPORT_OK = qw( IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_RECVERR IPV6_ROUTER_ALERT IPV6_UNICAST_HOPS IPV6_V6ONLY - SO_LOCK_FILTER SO_RCVBUFFORCE SO_SNDBUFFORCE + SO_INCOMING_CPU SO_INCOMING_NAPI_ID SO_LOCK_FILTER SO_RCVBUFFORCE + SO_SNDBUFFORCE pack_ip_mreq unpack_ip_mreq pack_ip_mreq_source unpack_ip_mreq_source Index: gnu/usr.bin/perl/cpan/Socket/Socket.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Socket/Socket.xs,v diff -u -p -a -u -p -r1.5 Socket.xs --- gnu/usr.bin/perl/cpan/Socket/Socket.xs 15 Feb 2023 01:36:21 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Socket/Socket.xs 21 Feb 2024 15:47:00 -0000 @@ -98,6 +98,14 @@ struct sockaddr_un #endif +/* + * The Windows implementations of inet_ntop and inet_pton are available + * whenever (and only when) InetNtopA is defined. + * Use those implementations whenever they are available. + * Else use the implementations provided below. +*/ +#ifndef InetNtopA + static int inet_pton(int af, const char *src, void *dst) { struct sockaddr_storage ss; @@ -146,6 +154,8 @@ static const char *inet_ntop(int af, con return dst; } +#endif /* InetNtopA not defined */ + #define HAS_INETPTON #define HAS_INETNTOP #endif @@ -224,10 +234,6 @@ static SV *my_newSVpvn_flags(pTHX_ const } #endif /* !newSVpvn_flags */ -#ifndef SvRV_set -# define SvRV_set(sv, val) (SvRV(sv) = (val)) -#endif /* !SvRV_set */ - #ifndef SvPVbyte_nomg # define SvPVbyte_nomg SvPV #endif /* !SvPVbyte_nomg */ @@ -1191,13 +1197,14 @@ inet_ntop(af, ip_address_sv) break; #endif default: - croak("Bad address family for %s, got %d, should be" #ifdef AF_INET6 - " either AF_INET or AF_INET6", +# define WANT_FAMILY "either AF_INET or AF_INET6" #else - " AF_INET", +# define WANT_FAMILY "AF_INET" #endif + croak("Bad address family for %s, got %d, should be " WANT_FAMILY, "Socket::inet_ntop", af); +#undef WANT_FAMILY } if(addrlen < sizeof(addr)) { @@ -1240,13 +1247,13 @@ inet_pton(af, host) break; #endif default: - croak("Bad address family for %s, got %d, should be" #ifdef AF_INET6 - " either AF_INET or AF_INET6", +# define WANT_FAMILY "either AF_INET or AF_INET6" #else - " AF_INET", +# define WANT_FAMILY "AF_INET" #endif - "Socket::inet_pton", af); + croak("Bad address family for %s, got %d, should be " WANT_FAMILY, "Socket::inet_pton", af); +#undef WANT_FAMILY } ok = (*host != '\0') && inet_pton(af, host, &ip_address); Index: gnu/usr.bin/perl/cpan/Socket/t/getnameinfo.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Socket/t/getnameinfo.t,v diff -u -p -a -u -p -r1.3 getnameinfo.t --- gnu/usr.bin/perl/cpan/Socket/t/getnameinfo.t 15 Feb 2023 01:36:21 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Socket/t/getnameinfo.t 21 Feb 2024 15:47:00 -0000 @@ -19,8 +19,8 @@ is( $host, undef, '$host is undef for NI is( $service, "80", '$service is 80 for NS, NIx_NOHOST' ); ( $err, $host, $service ) = getnameinfo( pack_sockaddr_in( 80, inet_aton( "127.0.0.1" ) ), NI_NUMERICHOST|NI_NUMERICSERV, NIx_NOSERV ); -is( $host, "127.0.0.1", '$host is undef for NIx_NOSERV' ); -is( $service, undef, '$service is 80 for NS, NIx_NOSERV' ); +is( $host, "127.0.0.1", '$host is 127.0.0.1 for NIx_NOSERV' ); +is( $service, undef, '$service is undef for NS, NIx_NOSERV' ); ( $err, $host, $service ) = getnameinfo( pack_sockaddr_in( 80, inet_aton( "127.0.0.1" ) ), NI_NUMERICSERV ); cmp_ok( $err, "==", 0, '$err == 0 for {family=AF_INET,port=80,sinaddr=127.0.0.1}/NI_NUMERICSERV' ); Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2.pm,v diff -u -p -a -u -p -r1.1.1.4 Test2.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2.pm 15 Feb 2023 01:32:38 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; 1; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/ok.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/ok.pm,v diff -u -p -a -u -p -r1.5 ok.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/ok.pm 15 Feb 2023 01:36:23 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/ok.pm 21 Feb 2024 15:47:01 -0000 @@ -1,5 +1,5 @@ package ok; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use strict; use Test::More (); Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder.pm,v diff -u -p -a -u -p -r1.9 Builder.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder.pm 15 Feb 2023 01:36:23 -0000 1.9 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder.pm 21 Feb 2024 15:47:01 -0000 @@ -4,7 +4,7 @@ use 5.006; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { if( $] < 5.008 ) { @@ -1002,15 +1002,7 @@ END $self->_is_diag( $got, $type, $expect ); } elsif( $type =~ /^(ne|!=)$/ ) { - no warnings; - my $eq = ($got eq $expect || $got == $expect) - && ( - (defined($got) xor defined($expect)) - || (length($got) != length($expect)) - ); - use warnings; - - if ($eq) { + if (defined($got) xor defined($expect)) { $self->_cmp_diag( $got, $type, $expect ); } else { Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/More.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/More.pm,v diff -u -p -a -u -p -r1.9 More.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/More.pm 15 Feb 2023 01:36:23 -0000 1.9 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/More.pm 21 Feb 2024 15:47:01 -0000 @@ -17,7 +17,7 @@ sub _carp { return warn @_, " at $file line $line\n"; } -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test::Builder::Module; our @ISA = qw(Test::Builder::Module); @@ -394,8 +394,13 @@ different from some other value: isnt $obj, $clone, "clone() produces a different object"; -For those grammatical pedants out there, there's an C -function which is an alias of C. +Historically we supported an C function as an alias of +C, however in Perl 5.37.9 support for the use of aprostrophe as +a package separator was deprecated and by Perl 5.42.0 support for it +will have been removed completely. Accordingly use of C is also +deprecated, and will produce warnings when used unless 'deprecated' +warnings are specifically disabled in the scope where it is used. You +are strongly advised to migrate to using C instead. =cut @@ -411,8 +416,25 @@ sub isnt ($$;$) { return $tb->isnt_eq(@_); } -# make this available as isn't() -*isn::t = \&isnt; +# Historically it was possible to use apostrophes as a package +# separator. make this available as isn't() for perl's that support it. +# However in 5.37.9 the apostrophe as a package separator was +# deprecated, so warn users of isn't() that they should use isnt() +# instead. We assume that if they are calling isn::t() they are doing so +# via isn't() as we have no way to be sure that they aren't spelling it +# with a double colon. We only trigger the warning if deprecation +# warnings are enabled, so the user can silence the warning if they +# wish. +sub isn::t { + local ($@, $!, $?); + if (warnings::enabled("deprecated")) { + _carp + "Use of apostrophe as package separator was deprecated in Perl 5.37.9,\n", + "and will be removed in Perl 5.42.0. You should change code that uses\n", + "Test::More::isn't() to use Test::More::isnt() as a replacement"; + } + goto &isnt; +} =item B @@ -1770,8 +1792,8 @@ sub eq_set { Sometimes the Test::More interface isn't quite enough. Fortunately, Test::More is built on top of L which provides a single, unified backend for any test library to use. This means two test -libraries which both use B be used together in the -same program>. +libraries which both use L B be used together in the +same program. If you simply want to do a little tweaking of how the tests behave, you can access the underlying L object like so: Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Simple.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Simple.pm,v diff -u -p -a -u -p -r1.9 Simple.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Simple.pm 15 Feb 2023 01:36:23 -0000 1.9 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Simple.pm 21 Feb 2024 15:47:01 -0000 @@ -4,7 +4,7 @@ use 5.006; use strict; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test::Builder::Module; our @ISA = qw(Test::Builder::Module); Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester.pm,v diff -u -p -a -u -p -r1.5 Tester.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester.pm 15 Feb 2023 01:36:23 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester.pm 21 Feb 2024 15:47:01 -0000 @@ -18,7 +18,7 @@ require Exporter; use vars qw( @ISA @EXPORT ); -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; @EXPORT = qw( run_tests check_tests check_test cmp_results show_space ); @ISA = qw( Exporter ); Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Formatter.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Formatter.pm,v diff -u -p -a -u -p -r1.1.1.4 Formatter.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Formatter.pm 15 Feb 2023 01:32:38 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Formatter.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test::Builder::Formatter; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Formatter::TAP; our @ISA = qw(Test2::Formatter::TAP) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Module.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Module.pm,v diff -u -p -a -u -p -r1.9 Module.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Module.pm 15 Feb 2023 01:36:23 -0000 1.9 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Module.pm 21 Feb 2024 15:47:01 -0000 @@ -7,7 +7,7 @@ use Test::Builder; require Exporter; our @ISA = qw(Exporter); -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; =head1 NAME Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Tester.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Tester.pm,v diff -u -p -a -u -p -r1.9 Tester.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Tester.pm 15 Feb 2023 01:36:23 -0000 1.9 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Tester.pm 21 Feb 2024 15:47:01 -0000 @@ -1,7 +1,7 @@ package Test::Builder::Tester; use strict; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test::Builder; use Symbol; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm,v diff -u -p -a -u -p -r1.1.1.4 TodoDiag.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm 15 Feb 2023 01:32:38 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/TodoDiag.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test::Builder::TodoDiag; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event::Diag; our @ISA = qw(Test2::Event::Diag) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm,v diff -u -p -a -u -p -r1.9 Color.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm 15 Feb 2023 01:36:23 -0000 1.9 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Builder/Tester/Color.pm 21 Feb 2024 15:47:01 -0000 @@ -1,7 +1,7 @@ package Test::Builder::Tester::Color; use strict; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; require Test::Builder::Tester; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm,v diff -u -p -a -u -p -r1.5 Capture.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm 15 Feb 2023 01:36:23 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ use strict; package Test::Tester::Capture; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test::Builder; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm,v diff -u -p -a -u -p -r1.5 CaptureRunner.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm 15 Feb 2023 01:36:23 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/CaptureRunner.pm 21 Feb 2024 15:47:01 -0000 @@ -3,7 +3,7 @@ use strict; package Test::Tester::CaptureRunner; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test::Tester::Capture; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Delegate.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Delegate.pm,v diff -u -p -a -u -p -r1.5 Delegate.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Delegate.pm 15 Feb 2023 01:36:23 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Delegate.pm 21 Feb 2024 15:47:01 -0000 @@ -3,7 +3,7 @@ use warnings; package Test::Tester::Delegate; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Scalar::Util(); Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/use/ok.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/use/ok.pm,v diff -u -p -a -u -p -r1.5 ok.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/use/ok.pm 15 Feb 2023 01:36:23 -0000 1.5 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/use/ok.pm 21 Feb 2024 15:47:01 -0000 @@ -1,7 +1,7 @@ package Test::use::ok; use 5.005; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; __END__ Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API.pm,v diff -u -p -a -u -p -r1.1.1.4 API.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API.pm 21 Feb 2024 15:47:01 -0000 @@ -10,7 +10,7 @@ BEGIN { $ENV{TEST2_ACTIVE} = 1; } -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; my $INST; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event.pm,v diff -u -p -a -u -p -r1.1.1.4 Event.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event.pm 15 Feb 2023 01:32:38 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Scalar::Util qw/blessed reftype/; use Carp qw/croak/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet.pm,v diff -u -p -a -u -p -r1.1.1.4 EventFacet.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet.pm 15 Feb 2023 01:32:38 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test2::Util::HashBase qw/-details/; use Carp qw/croak/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter.pm,v diff -u -p -a -u -p -r1.1.1.4 Formatter.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter.pm 15 Feb 2023 01:32:38 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Formatter; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; my %ADDED; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub.pm,v diff -u -p -a -u -p -r1.1.1.4 Hub.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Hub; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Carp qw/carp croak confess/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC.pm,v diff -u -p -a -u -p -r1.1.1.4 IPC.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC.pm 15 Feb 2023 01:32:38 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::IPC; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test2::API::Instance; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util.pm,v diff -u -p -a -u -p -r1.1.1.4 Util.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util.pm 15 Feb 2023 01:32:38 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Util; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use POSIX(); use Config qw/%Config/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Breakage.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Breakage.pm,v diff -u -p -a -u -p -r1.1.1.4 Breakage.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Breakage.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Breakage.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::API::Breakage; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test2::Util qw/pkg_to_file/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Context.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Context.pm,v diff -u -p -a -u -p -r1.1.1.4 Context.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Context.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Context.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::API::Context; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Carp qw/confess croak/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Instance.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Instance.pm,v diff -u -p -a -u -p -r1.1.1.4 Instance.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Instance.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Instance.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::API::Instance; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; our @CARP_NOT = qw/Test2::API Test2::API::Instance Test2::IPC::Driver Test2::Formatter/; use Carp qw/confess carp/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult.pm,v diff -u -p -a -u -p -r1.1.1.1 InterceptResult.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult.pm 15 Feb 2023 01:32:39 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::API::InterceptResult; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Scalar::Util qw/blessed/; use Test2::Util qw/pkg_to_file/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Stack.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Stack.pm,v diff -u -p -a -u -p -r1.1.1.4 Stack.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Stack.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/Stack.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::API::Stack; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test2::Hub(); Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Event.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Event.pm,v diff -u -p -a -u -p -r1.1.1.1 Event.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Event.pm 15 Feb 2023 01:32:39 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Event.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::API::InterceptResult::Eve use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use List::Util qw/first/; use Test2::Util qw/pkg_to_file/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Facet.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Facet.pm,v diff -u -p -a -u -p -r1.1.1.1 Facet.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Facet.pm 15 Feb 2023 01:32:39 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Facet.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::API::InterceptResult::Fac use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::EventFacet; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Hub.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Hub.pm,v diff -u -p -a -u -p -r1.1.1.1 Hub.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Hub.pm 15 Feb 2023 01:32:39 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Hub.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::API::InterceptResult::Hub use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Hub; our @ISA = qw(Test2::Hub) } use Test2::Util::HashBase; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Squasher.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Squasher.pm,v diff -u -p -a -u -p -r1.1.1.1 Squasher.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Squasher.pm 15 Feb 2023 01:32:39 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Squasher.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::API::InterceptResult::Squ use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Carp qw/croak/; use List::Util qw/first/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Bail.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Bail.pm,v diff -u -p -a -u -p -r1.1.1.4 Bail.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Bail.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Bail.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Bail; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Diag.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Diag.pm,v diff -u -p -a -u -p -r1.1.1.4 Diag.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Diag.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Diag.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Diag; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Encoding.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Encoding.pm,v diff -u -p -a -u -p -r1.1.1.4 Encoding.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Encoding.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Encoding.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Encoding; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Carp qw/croak/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Exception.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Exception.pm,v diff -u -p -a -u -p -r1.1.1.4 Exception.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Exception.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Exception.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Exception; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Fail.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Fail.pm,v diff -u -p -a -u -p -r1.1.1.4 Fail.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Fail.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Fail.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Fail; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test2::EventFacet::Info; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Generic.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Generic.pm,v diff -u -p -a -u -p -r1.1.1.4 Generic.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Generic.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Generic.pm 21 Feb 2024 15:47:01 -0000 @@ -5,7 +5,7 @@ use warnings; use Carp qw/croak/; use Scalar::Util qw/reftype/; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } use Test2::Util::HashBase; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Note.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Note.pm,v diff -u -p -a -u -p -r1.1.1.4 Note.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Note.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Note.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Note; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Ok.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Ok.pm,v diff -u -p -a -u -p -r1.1.1.4 Ok.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Ok.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Ok.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Ok; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Pass.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Pass.pm,v diff -u -p -a -u -p -r1.1.1.4 Pass.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Pass.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Pass.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Pass; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test2::EventFacet::Info; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Plan.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Plan.pm,v diff -u -p -a -u -p -r1.1.1.4 Plan.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Plan.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Plan.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Plan; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Skip.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Skip.pm,v diff -u -p -a -u -p -r1.1.1.4 Skip.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Skip.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Skip.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Skip; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event::Ok; our @ISA = qw(Test2::Event::Ok) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Subtest.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Subtest.pm,v diff -u -p -a -u -p -r1.1.1.4 Subtest.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Subtest.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Subtest.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Subtest; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event::Ok; our @ISA = qw(Test2::Event::Ok) } use Test2::Util::HashBase qw{subevents buffered subtest_id subtest_uuid start_stamp stop_stamp}; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/V2.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/V2.pm,v diff -u -p -a -u -p -r1.1.1.4 V2.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/V2.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/V2.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::V2; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Scalar::Util qw/reftype/; use Carp qw/croak/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Waiting.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Waiting.pm,v diff -u -p -a -u -p -r1.1.1.4 Waiting.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Waiting.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Waiting.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::Waiting; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm,v diff -u -p -a -u -p -r1.1.1.4 Version.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/TAP/Version.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Event::TAP::Version; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Carp qw/croak/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/About.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/About.pm,v diff -u -p -a -u -p -r1.1.1.4 About.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/About.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/About.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::About; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } use Test2::Util::HashBase qw{ -package -no_display -uuid -eid }; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm,v diff -u -p -a -u -p -r1.1.1.4 Amnesty.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Amnesty.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Amnesty; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; sub is_list { 1 } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm,v diff -u -p -a -u -p -r1.1.1.4 Assert.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Assert.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Assert; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } use Test2::Util::HashBase qw{ -pass -no_debug -number }; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Control.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Control.pm,v diff -u -p -a -u -p -r1.1.1.4 Control.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Control.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Control.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Control; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } use Test2::Util::HashBase qw{ -global -terminate -halt -has_callback -encoding -phase }; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Error.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Error.pm,v diff -u -p -a -u -p -r1.1.1.4 Error.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Error.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Error.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Error; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; sub facet_key { 'errors' } sub is_list { 1 } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm,v diff -u -p -a -u -p -r1.1.1.4 Hub.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Hub.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Hub; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; sub is_list { 1 } sub facet_key { 'hubs' } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info.pm,v diff -u -p -a -u -p -r1.1.1.4 Info.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Info; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; sub is_list { 1 } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm,v diff -u -p -a -u -p -r1.1.1.4 Meta.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Meta.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Meta; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } use vars qw/$AUTOLOAD/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm,v diff -u -p -a -u -p -r1.1.1.4 Parent.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Parent.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Parent; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Carp qw/confess/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm,v diff -u -p -a -u -p -r1.1.1.4 Plan.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Plan.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Plan; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } use Test2::Util::HashBase qw{ -count -skip -none }; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Render.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Render.pm,v diff -u -p -a -u -p -r1.1.1.4 Render.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Render.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Render.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Render; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; sub is_list { 1 } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm,v diff -u -p -a -u -p -r1.1.1.4 Trace.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Trace; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info/Table.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info/Table.pm,v diff -u -p -a -u -p -r1.1.1.3 Table.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info/Table.pm 15 Feb 2023 01:32:39 -0000 1.1.1.3 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Info/Table.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::EventFacet::Info::Table; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Carp qw/confess/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter/TAP.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter/TAP.pm,v diff -u -p -a -u -p -r1.1.1.4 TAP.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter/TAP.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Formatter/TAP.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Formatter::TAP; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test2::Util qw/clone_io/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm,v diff -u -p -a -u -p -r1.1.1.4 Interceptor.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Hub::Interceptor; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Test2::Hub::Interceptor::Terminator(); Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Subtest.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Subtest.pm,v diff -u -p -a -u -p -r1.1.1.4 Subtest.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Subtest.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Subtest.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Hub::Subtest; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::Hub; our @ISA = qw(Test2::Hub) } use Test2::Util::HashBase qw/nested exit_code manual_skip_all/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm,v diff -u -p -a -u -p -r1.1.1.4 Terminator.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Hub/Interceptor/Terminator.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Hub::Interceptor::Termina use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; 1; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver.pm,v diff -u -p -a -u -p -r1.1.1.4 Driver.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::IPC::Driver; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Carp qw/confess/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm,v diff -u -p -a -u -p -r1.1.1.4 Files.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/IPC/Driver/Files.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::IPC::Driver::Files; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Test2::IPC::Driver; our @ISA = qw(Test2::IPC::Driver) } Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Tools/Tiny.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Tools/Tiny.pm,v diff -u -p -a -u -p -r1.1.1.4 Tiny.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Tools/Tiny.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Tools/Tiny.pm 21 Feb 2024 15:47:01 -0000 @@ -16,7 +16,7 @@ use Test2::API qw/context run_subtest te use Test2::Hub::Interceptor(); use Test2::Hub::Interceptor::Terminator(); -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; BEGIN { require Exporter; our @ISA = qw(Exporter) } our @EXPORT = qw{ Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm,v diff -u -p -a -u -p -r1.1.1.4 ExternalMeta.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/ExternalMeta.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Util::ExternalMeta; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Carp qw/croak/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm,v diff -u -p -a -u -p -r1.1.1.4 Facets2Legacy.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Facets2Legacy.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Util::Facets2Legacy; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; use Carp qw/croak confess/; use Scalar::Util qw/blessed/; Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/HashBase.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/HashBase.pm,v diff -u -p -a -u -p -r1.1.1.4 HashBase.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/HashBase.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/HashBase.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package Test2::Util::HashBase; use strict; use warnings; -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; ################################################################# # # Index: gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Trace.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Trace.pm,v diff -u -p -a -u -p -r1.1.1.4 Trace.pm --- gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Trace.pm 15 Feb 2023 01:32:39 -0000 1.1.1.4 +++ gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Util/Trace.pm 21 Feb 2024 15:47:01 -0000 @@ -6,7 +6,7 @@ use strict; our @ISA = ('Test2::EventFacet::Trace'); -our $VERSION = '1.302190'; +our $VERSION = '1.302194'; 1; Index: gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/More.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/More.t,v diff -u -p -a -u -p -r1.1.1.2 More.t --- gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/More.t 15 Feb 2023 01:32:38 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/More.t 21 Feb 2024 15:47:00 -0000 @@ -8,7 +8,7 @@ BEGIN { } use lib 't/lib'; -use Test::More tests => 54; +use Test::More tests => 57; # Make sure we don't mess with $@ or $!. Test at bottom. my $Err = "this should not be touched"; @@ -24,7 +24,24 @@ require_ok('Test::More'); ok( 2 eq 2, 'two is two is two is two' ); is( "foo", "foo", 'foo is foo' ); isnt( "foo", "bar", 'foo isnt bar'); -isn::t("foo", "bar", 'foo isn\'t bar'); +{ + use warnings; + my $warning; + local $SIG{__WARN__}= sub { $warning = $_[0] }; + isn::t("foo", "bar", 'foo isn\'t bar'); + is($warning, "Use of apostrophe as package separator was deprecated in Perl 5.37.9,\n" + . "and will be removed in Perl 5.42.0. You should change code that uses\n" + . "Test::More::isn't() to use Test::More::isnt() as a replacement" + . " at t/Legacy/More.t line 31\n", + "Got expected warning from isn::t() under use warnings"); +} +{ + no warnings "deprecated"; + my $warning; + local $SIG{__WARN__}= sub { $warning = $_[0] }; + isn::t("foo", "bar", 'foo isn\'t bar'); + is($warning, undef, "No warnings from isn::t() under no warnings deprecated"); +} #'# like("fooble", '/^foo/', 'foo is like fooble'); Index: gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/cmp_ok.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/cmp_ok.t,v diff -u -p -a -u -p -r1.1.1.1 cmp_ok.t --- gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/cmp_ok.t 13 Feb 2019 21:11:21 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/cmp_ok.t 21 Feb 2024 15:47:00 -0000 @@ -60,6 +60,7 @@ Test::More->builder->no_ending(1); require MyOverload; my $cmp = Overloaded::Compare->new("foo", 42); my $ify = Overloaded::Ify->new("bar", 23); +my $part = Overloaded::Partial->new('baz', 0); my @Tests = ( [1, '==', 1], @@ -73,6 +74,8 @@ my @Tests = ( [$cmp, 'eq', "foo"], [$ify, 'eq', "bar"], [$ify, "==", 23], + + [$part, '!=', 0, 'expected: anything else'], [1, "=", 0, "= is not a valid comparison operator in cmp_ok()"], [1, "+=", 0, "+= is not a valid comparison operator in cmp_ok()"], Index: gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-more.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-more.t,v diff -u -p -a -u -p -r1.1.1.2 fail-more.t --- gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-more.t 15 Feb 2023 01:32:38 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Test-Simple/t/Legacy/fail-more.t 21 Feb 2024 15:47:00 -0000 @@ -26,7 +26,7 @@ package My::Test; # Test::Builder's own and the ending diagnostics don't come out right. require Test::Builder; my $TB = Test::Builder->create; -$TB->plan(tests => 80); +$TB->plan(tests => 81); sub like ($$;$) { $TB->like(@_); @@ -41,6 +41,14 @@ sub main::out_ok ($$) { $TB->is_eq( $err->read, shift ); } +sub main::out_warn_ok ($$$) { + $TB->is_eq( $out->read, shift ); + $TB->is_eq( $err->read, shift ); + my $warning_expected = shift; + $warning_expected =~ s/^# //mg; + $TB->is_eq( $main::warning, $warning_expected ); +} + sub main::out_like ($$) { my($output, $failure) = @_; @@ -59,7 +67,7 @@ $out->read; # clear the plan from $out # This should all work in the presence of a __DIE__ handler. local $SIG{__DIE__} = sub { $TB->ok(0, "DIE handler called: ".join "", @_); }; - +local $SIG{__WARN__} = sub { $main::warning = $_[0]; }; my $tb = Test::More->builder; $tb->use_numbers(0); @@ -134,7 +142,7 @@ ERR #line 132 isn::t("foo", "foo",'foo isn\'t foo?' ); -out_ok( <= 5.037010; +} require Test::More; *cmp_ok = \&Test::More::cmp_ok; no warnings "experimental::smartmatch"; +no if !exists $warnings::Offsets{"experimental::smartmatch"}, warnings => 'deprecated'; my $warnings = warnings { cmp_ok(1, "~~", 1) }; Index: gnu/usr.bin/perl/cpan/Test-Simple/t/lib/MyOverload.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Test-Simple/t/lib/MyOverload.pm,v diff -u -p -a -u -p -r1.1.1.2 MyOverload.pm --- gnu/usr.bin/perl/cpan/Test-Simple/t/lib/MyOverload.pm 15 Feb 2023 01:32:38 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Test-Simple/t/lib/MyOverload.pm 21 Feb 2024 15:47:01 -0000 @@ -33,4 +33,11 @@ use overload $_[0]->{num}; }; +package Overloaded::Partial; + +our @ISA = qw(Overloaded); +use overload + q{""} => sub { $_[0]->{string} }, + q{!=} => sub { $_[0]->{num} != $_[1] }; + 1; Index: gnu/usr.bin/perl/cpan/Text-Balanced/lib/Text/Balanced.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Text-Balanced/lib/Text/Balanced.pm,v diff -u -p -a -u -p -r1.19 Balanced.pm --- gnu/usr.bin/perl/cpan/Text-Balanced/lib/Text/Balanced.pm 15 Feb 2023 01:36:23 -0000 1.19 +++ gnu/usr.bin/perl/cpan/Text-Balanced/lib/Text/Balanced.pm 21 Feb 2024 15:47:01 -0000 @@ -1,6 +1,7 @@ # Copyright (C) 1997-2001 Damian Conway. All rights reserved. # Copyright (C) 2009 Adam Kennedy. -# Copyright (C) 2015 Steve Hay. All rights reserved. +# Copyright (C) 2015, 2022 Steve Hay and other contributors. All rights +# reserved. # This module is free software; you can redistribute it and/or modify it under # the same terms as Perl itself, i.e. under the terms of either the GNU General @@ -17,7 +18,7 @@ use Exporter (); use vars qw { $VERSION @ISA %EXPORT_TAGS }; BEGIN { - $VERSION = '2.04'; + $VERSION = '2.06'; @ISA = 'Exporter'; %EXPORT_TAGS = ( ALL => [ qw{ @@ -37,14 +38,22 @@ BEGIN { Exporter::export_ok_tags('ALL'); -## no critic (Subroutines::ProhibitSubroutinePrototypes) - -# PROTOTYPES +our $RE_PREREGEX_PAT = qr#( + [!=]~ + | split|grep|map + | not|and|or|xor +)#x; +our $RE_EXPR_PAT = qr#( + (?:\*\*|&&|\|\||<<|>>|//|[-+*x%^&|.])=? + | /(?:[^/]) + | =(?!>) + | return + | [\(\[] +)#x; +our $RE_NUM = qr/\s*[+\-.0-9][+\-.0-9e]*/i; # numerical constant -sub _match_bracketed($$$$$$); -sub _match_variable($$); -sub _match_codeblock($$$$$$$); -sub _match_quotelike($$$$); +our %ref2slashvalid; # is quotelike /.../ pattern valid here for given textref? +our %ref2qmarkvalid; # is quotelike ?...? pattern valid here for given textref? # HANDLE RETURN VALUES IN VARIOUS CONTEXTS @@ -99,6 +108,7 @@ sub _succeed { } # BUILD A PATTERN MATCHING A SIMPLE DELIMITED STRING +## no critic (Subroutines::ProhibitSubroutinePrototypes) sub gen_delimited_pat($;$) # ($delimiters;$escapes) { @@ -132,6 +142,7 @@ sub gen_delimited_pat($;$) # ($delimite sub extract_delimited (;$$$$) { my $textref = defined $_[0] ? \$_[0] : \$_; + $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset my $wantarray = wantarray; my $del = defined $_[1] ? $_[1] : qq{\'\"\`}; my $pre = defined $_[2] ? $_[2] : '\s*'; @@ -149,33 +160,45 @@ sub extract_delimited (;$$$$) $startpos, $prelen; # PREFIX } -sub extract_bracketed (;$$$) -{ - my $textref = defined $_[0] ? \$_[0] : \$_; - my $ldel = defined $_[1] ? $_[1] : '{([<'; - my $pre = defined $_[2] ? $_[2] : '\s*'; - my $wantarray = wantarray; +my %eb_delim_cache; +sub _eb_delims { + my ($ldel_orig) = @_; + return @{ $eb_delim_cache{$ldel_orig} } if $eb_delim_cache{$ldel_orig}; my $qdel = ""; my $quotelike; + my $ldel = $ldel_orig; $ldel =~ s/'//g and $qdel .= q{'}; $ldel =~ s/"//g and $qdel .= q{"}; $ldel =~ s/`//g and $qdel .= q{`}; $ldel =~ s/q//g and $quotelike = 1; $ldel =~ tr/[](){}<>\0-\377/[[(({{</) + return @{ $eb_delim_cache{$ldel_orig} = [] } unless $rdel =~ tr/[({/; + my $posbug = pos; + $ldel = join('|', map { quotemeta $_ } split('', $ldel)); + $rdel = join('|', map { quotemeta $_ } split('', $rdel)); + pos = $posbug; + @{ $eb_delim_cache{$ldel_orig} = [ + qr/\G($ldel)/, $qdel && qr/\G([$qdel])/, $quotelike, qr/\G($rdel)/ + ] }; +} +sub extract_bracketed (;$$$) +{ + my $textref = defined $_[0] ? \$_[0] : \$_; + $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset + my $ldel = defined $_[1] ? $_[1] : '{([<'; + my $pre = defined $_[2] ? qr/\G$_[2]/ : qr/\G\s*/; + my $wantarray = wantarray; + my @ret = _eb_delims($ldel); + unless (@ret) { return _fail $wantarray, $textref, "Did not find a suitable bracket in delimiter: \"$_[1]\"", 0; } - my $posbug = pos; - $ldel = join('|', map { quotemeta $_ } split('', $ldel)); - $rdel = join('|', map { quotemeta $_ } split('', $rdel)); - pos = $posbug; my $startpos = pos $$textref || 0; - my @match = _match_bracketed($textref,$pre, $ldel, $qdel, $quotelike, $rdel); + my @match = _match_bracketed($textref, $pre, @ret); return _fail ($wantarray, $textref) unless @match; @@ -186,11 +209,11 @@ sub extract_bracketed (;$$$) ); } -sub _match_bracketed($$$$$$) # $textref, $pre, $ldel, $qdel, $quotelike, $rdel +sub _match_bracketed # $textref, $pre, $ldel, $qdel, $quotelike, $rdel { my ($textref, $pre, $ldel, $qdel, $quotelike, $rdel) = @_; my ($startpos, $ldelpos, $endpos) = (pos $$textref = pos $$textref||0); - unless ($$textref =~ m/\G$pre/gc) + unless ($$textref =~ m/$pre/gc) { _failmsg "Did not find prefix: /$pre/", $startpos; return; @@ -198,7 +221,7 @@ sub _match_bracketed($$$$$$) # $textr $ldelpos = pos $$textref; - unless ($$textref =~ m/\G($ldel)/gc) + unless ($$textref =~ m/$ldel/gc) { _failmsg "Did not find opening bracket after prefix: \"$pre\"", pos $$textref; @@ -212,11 +235,11 @@ sub _match_bracketed($$$$$$) # $textr { next if $$textref =~ m/\G\\./gcs; - if ($$textref =~ m/\G($ldel)/gc) + if ($$textref =~ m/$ldel/gc) { push @nesting, $1; } - elsif ($$textref =~ m/\G($rdel)/gc) + elsif ($$textref =~ m/$rdel/gc) { my ($found, $brackettype) = ($1, $1); if ($#nesting < 0) @@ -237,7 +260,7 @@ sub _match_bracketed($$$$$$) # $textr } last if $#nesting < 0; } - elsif ($qdel && $$textref =~ m/\G([$qdel])/gc) + elsif ($qdel && $$textref =~ m/$qdel/gc) { $$textref =~ m/\G[^\\$1]*(?:\\.[^\\$1]*)*(\Q$1\E)/gsc and next; _failmsg "Unmatched embedded quote ($1)", @@ -245,8 +268,9 @@ sub _match_bracketed($$$$$$) # $textr pos $$textref = $startpos; return; } - elsif ($quotelike && _match_quotelike($textref,"",1,0)) + elsif ($quotelike && _match_quotelike($textref,qr/\G()/,$ref2slashvalid{$textref},$ref2qmarkvalid{$textref})) { + $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 1; # back-compat next; } @@ -281,12 +305,14 @@ sub _revbracket($) my $XMLNAME = q{[a-zA-Z_:][a-zA-Z0-9_:.-]*}; +my $et_default_ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; sub extract_tagged (;$$$$$) # ($text, $opentag, $closetag, $pre, \%options) { my $textref = defined $_[0] ? \$_[0] : \$_; + $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset my $ldel = $_[1]; my $rdel = $_[2]; - my $pre = defined $_[3] ? $_[3] : '\s*'; + my $pre = defined $_[3] ? qr/\G$_[3]/ : qr/\G\s*/; my %options = defined $_[4] ? %{$_[4]} : (); my $omode = defined $options{fail} ? $options{fail} : ''; my $bad = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}}) @@ -298,7 +324,7 @@ sub extract_tagged (;$$$$$) # ($text, $o : '' ; - if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; } + $ldel = $et_default_ldel if !defined $ldel; $@ = undef; my @match = _match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore); @@ -316,7 +342,7 @@ sub _match_tagged # ($$$$$$$) my ($startpos, $opentagpos, $textpos, $parapos, $closetagpos, $endpos) = ( pos($$textref) = pos($$textref)||0 ); - unless ($$textref =~ m/\G($pre)/gc) + unless ($$textref =~ m/$pre/gc) { _failmsg "Did not find prefix: /$pre/", pos $$textref; goto failed; @@ -433,7 +459,8 @@ sub extract_variable (;$$) { my $textref = defined $_[0] ? \$_[0] : \$_; return ("","","") unless defined $$textref; - my $pre = defined $_[1] ? $_[1] : '\s*'; + $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset + my $pre = defined $_[1] ? qr/\G$_[1]/ : qr/\G\s*/; my @match = _match_variable($textref,$pre); @@ -443,14 +470,14 @@ sub extract_variable (;$$) @match[2..3,4..5,0..1]; # MATCH, REMAINDER, PREFIX } -sub _match_variable($$) +sub _match_variable { # $# # $^ # $$ my ($textref, $pre) = @_; my $startpos = pos($$textref) = pos($$textref)||0; - unless ($$textref =~ m/\G($pre)/gc) + unless ($$textref =~ m/$pre/gc) { _failmsg "Did not find prefix: /$pre/", pos $$textref; return; @@ -467,8 +494,9 @@ sub _match_variable($$) my $deref = $1; unless ($$textref =~ m/\G\s*(?:::|')?(?:[_a-z]\w*(?:::|'))*[_a-z]\w*/gci - or _match_codeblock($textref, "", '\{', '\}', '\{', '\}', 0) - or $deref eq '$#' or $deref eq '$$' ) + or _match_codeblock($textref, qr/\G()/, '\{', qr/\G\s*(\})/, '\{', '\}', 0, 1) + or $deref eq '$#' or $deref eq '$$' + or pos($$textref) == length $$textref ) { _failmsg "Bad identifier after dereferencer", pos $$textref; pos $$textref = $startpos; @@ -480,16 +508,17 @@ sub _match_variable($$) { next if $$textref =~ m/\G\s*(?:->)?\s*[{]\w+[}]/gc; next if _match_codeblock($textref, - qr/\s*->\s*(?:[_a-zA-Z]\w+\s*)?/, - qr/[({[]/, qr/[)}\]]/, - qr/[({[]/, qr/[)}\]]/, 0); + qr/\G\s*->\s*(?:[_a-zA-Z]\w+\s*)?/, + qr/[({[]/, qr/\G\s*([)}\]])/, + qr/[({[]/, qr/[)}\]]/, 0, 1); next if _match_codeblock($textref, - qr/\s*/, qr/[{[]/, qr/[}\]]/, - qr/[{[]/, qr/[}\]]/, 0); - next if _match_variable($textref,'\s*->\s*'); + qr/\G\s*/, qr/[{[]/, qr/\G\s*([}\]])/, + qr/[{[]/, qr/[}\]]/, 0, 1); + next if _match_variable($textref,qr/\G\s*->\s*/); next if $$textref =~ m/\G\s*->\s*\w+(?![{([])/gc; last; } + $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 0; my $endpos = pos($$textref); return ($startpos, $varpos-$startpos, @@ -498,14 +527,11 @@ sub _match_variable($$) ); } -sub extract_codeblock (;$$$$$) -{ - my $textref = defined $_[0] ? \$_[0] : \$_; - my $wantarray = wantarray; - my $ldel_inner = defined $_[1] ? $_[1] : '{'; - my $pre = defined $_[2] ? $_[2] : '\s*'; - my $ldel_outer = defined $_[3] ? $_[3] : $ldel_inner; - my $rd = $_[4]; +my %ec_delim_cache; +sub _ec_delims { + my ($ldel_inner, $ldel_outer) = @_; + return @{ $ec_delim_cache{$ldel_outer}{$ldel_inner} } + if $ec_delim_cache{$ldel_outer}{$ldel_inner}; my $rdel_inner = $ldel_inner; my $rdel_outer = $ldel_outer; my $posbug = pos; @@ -516,23 +542,34 @@ sub extract_codeblock (;$$$$$) $_ = '('.join('|',map { quotemeta $_ } split('',$_)).')' } pos = $posbug; + @{ $ec_delim_cache{$ldel_outer}{$ldel_inner} = [ + $ldel_outer, qr/\G\s*($rdel_outer)/, $ldel_inner, $rdel_inner + ] }; +} +sub extract_codeblock (;$$$$$) +{ + my $textref = defined $_[0] ? \$_[0] : \$_; + $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset + my $wantarray = wantarray; + my $ldel_inner = defined $_[1] ? $_[1] : '{'; + my $pre = !defined $_[2] ? qr/\G\s*/ : qr/\G$_[2]/; + my $ldel_outer = defined $_[3] ? $_[3] : $ldel_inner; + my $rd = $_[4]; + my @delims = _ec_delims($ldel_inner, $ldel_outer); - my @match = _match_codeblock($textref, $pre, - $ldel_outer, $rdel_outer, - $ldel_inner, $rdel_inner, - $rd); + my @match = _match_codeblock($textref, $pre, @delims, $rd, 1); return _fail($wantarray, $textref) unless @match; return _succeed($wantarray, $textref, @match[2..3,4..5,0..1] # MATCH, REMAINDER, PREFIX ); - } -sub _match_codeblock($$$$$$$) +sub _match_codeblock { - my ($textref, $pre, $ldel_outer, $rdel_outer, $ldel_inner, $rdel_inner, $rd) = @_; + my ($textref, $pre, $ldel_outer, $rdel_outer, $ldel_inner, $rdel_inner, $rd, $no_backcompat) = @_; + $rdel_outer = qr/\G\s*($rdel_outer)/ if !$no_backcompat; # Switch calls this func directly my $startpos = pos($$textref) = pos($$textref) || 0; - unless ($$textref =~ m/\G($pre)/gc) + unless ($$textref =~ m/$pre/gc) { _failmsg qq{Did not match prefix /$pre/ at"} . substr($$textref,pos($$textref),20) . @@ -553,13 +590,13 @@ sub _match_codeblock($$$$$$$) my $closing = $1; $closing =~ tr/([<{/)]>}/; my $matched; - my $patvalid = 1; + $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 + if !pos($$textref) or !defined $ref2slashvalid{$textref}; # default, or reset while (pos($$textref) < length($$textref)) { - $matched = ''; if ($rd && $$textref =~ m#\G(\Q(?)\E|\Q(s?)\E|\Q(s)\E)#gc) { - $patvalid = 0; + $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 0; next; } @@ -568,7 +605,7 @@ sub _match_codeblock($$$$$$$) next; } - if ($$textref =~ m/\G\s*($rdel_outer)/gc) + if ($$textref =~ m/$rdel_outer/gc) { unless ($matched = ($closing && $1 eq $closing) ) { @@ -581,31 +618,22 @@ sub _match_codeblock($$$$$$$) last; } - if (_match_variable($textref,'\s*') || - _match_quotelike($textref,'\s*',$patvalid,$patvalid) ) + if (_match_variable($textref,qr/\G\s*/) || + _match_quotelike($textref,qr/\G\s*/,$ref2slashvalid{$textref},$ref2qmarkvalid{$textref}) ) { - $patvalid = 0; + $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 0; next; } - - # NEED TO COVER MANY MORE CASES HERE!!! - if ($$textref =~ m#\G\s*(?!$ldel_inner) - ( [-+*x/%^&|.]=? - | [!=]~ - | =(?!>) - | (\*\*|&&|\|\||<<|>>)=? - | split|grep|map|return - | [([] - )#gcx) + if ($$textref =~ m#\G\s*(?!$ldel_inner)(?:$RE_PREREGEX_PAT|$RE_EXPR_PAT)#gc) { - $patvalid = 1; + $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 1; next; } - if ( _match_codeblock($textref, '\s*', $ldel_inner, $rdel_inner, $ldel_inner, $rdel_inner, $rd) ) + if ( _match_codeblock($textref, qr/\G\s*/, $ldel_inner, qr/\G\s*($rdel_inner)/, $ldel_inner, $rdel_inner, $rd, 1) ) { - $patvalid = 1; + $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 1; next; } @@ -618,7 +646,7 @@ sub _match_codeblock($$$$$$$) last; } - $patvalid = 0; + $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 0; $$textref =~ m/\G\s*(\w+|[-=>]>|.|\Z)/gc; } continue { $@ = undef } @@ -630,6 +658,7 @@ sub _match_codeblock($$$$$$$) return; } + $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = undef; my $endpos = pos($$textref); return ( $startpos, $codepos-$startpos, $codepos, $endpos-$codepos, @@ -654,10 +683,11 @@ my %mods = ( sub extract_quotelike (;$$) { my $textref = $_[0] ? \$_[0] : \$_; + $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset my $wantarray = wantarray; - my $pre = defined $_[1] ? $_[1] : '\s*'; + my $pre = defined $_[1] ? qr/\G$_[1]/ : qr/\G\s*/; - my @match = _match_quotelike($textref,$pre,1,0); + my @match = _match_quotelike($textref,$pre,$ref2slashvalid{$textref},$ref2qmarkvalid{$textref}); return _fail($wantarray, $textref) unless @match; return _succeed($wantarray, $textref, $match[2], $match[18]-$match[2], # MATCH @@ -668,17 +698,19 @@ sub extract_quotelike (;$$) ); }; -sub _match_quotelike($$$$) # ($textref, $prepat, $allow_raw_match) +my %maybe_quote = map +($_=>1), qw(" ' `); +sub _match_quotelike { - my ($textref, $pre, $rawmatch, $qmark) = @_; + my ($textref, $pre, $allow_slash_match, $allow_qmark_match) = @_; + $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 + if !pos($$textref) or !defined $ref2slashvalid{$textref}; # default, or reset my ($textlen,$startpos, - $oppos, $preld1pos,$ld1pos,$str1pos,$rd1pos, $preld2pos,$ld2pos,$str2pos,$rd2pos, $modpos) = ( length($$textref), pos($$textref) = pos($$textref) || 0 ); - unless ($$textref =~ m/\G($pre)/gc) + unless ($$textref =~ m/$pre/gc) { _failmsg qq{Did not find prefix /$pre/ at "} . substr($$textref, pos($$textref), 20) . @@ -686,15 +718,13 @@ sub _match_quotelike($$$$) # ($text pos $$textref; return; } - $oppos = pos($$textref); - + my $oppos = pos($$textref); my $initial = substr($$textref,$oppos,1); - - if ($initial && $initial =~ m|^[\"\'\`]| - || $rawmatch && $initial =~ m|^/| - || $qmark && $initial =~ m|^\?|) + if ($initial && $maybe_quote{$initial} + || $allow_slash_match && $initial eq '/' + || $allow_qmark_match && $initial eq '?') { - unless ($$textref =~ m/ \Q$initial\E [^\\$initial]* (\\.[^\\$initial]*)* \Q$initial\E /gcsx) + unless ($$textref =~ m/\G \Q$initial\E [^\\$initial]* (\\.[^\\$initial]*)* \Q$initial\E /gcsx) { _failmsg qq{Did not find closing delimiter to match '$initial' at "} . substr($$textref, $oppos, 20) . @@ -712,6 +742,7 @@ sub _match_quotelike($$$$) # ($text } my $endpos = pos($$textref); + $ref2qmarkvalid{$textref} = $ref2slashvalid{$textref} = 0; return ( $startpos, $oppos-$startpos, # PREFIX $oppos, 0, # NO OPERATOR @@ -726,7 +757,7 @@ sub _match_quotelike($$$$) # ($text ); } - unless ($$textref =~ m{\G(\b(?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<)}gc) + unless ($$textref =~ m{\G(\b(?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<(?=[a-zA-Z]|\s*['"`;,]))}gc) { _failmsg q{No quotelike operator found after prefix at "} . substr($$textref, pos($$textref), 20) . @@ -767,6 +798,7 @@ sub _match_quotelike($$$$) # ($text $rd1pos = pos($$textref); $$textref =~ m{\Q$label\E\n}gc; $ld2pos = pos($$textref); + $ref2qmarkvalid{$textref} = $ref2slashvalid{$textref} = 0; return ( $startpos, $oppos-$startpos, # PREFIX $oppos, length($op), # OPERATOR @@ -786,19 +818,26 @@ sub _match_quotelike($$$$) # ($text $ld1pos = pos($$textref); $str1pos = $ld1pos+1; - unless ($$textref =~ m/\G(\S)/gc) # SHOULD USE LOOKAHEAD + if ($$textref !~ m/\G(\S)/gc) # SHOULD USE LOOKAHEAD { _failmsg "No block delimiter found after quotelike $op", pos $$textref; pos $$textref = $startpos; return; } + elsif (substr($$textref, $ld1pos, 2) eq '=>') + { + _failmsg "quotelike $op was actually quoted by '=>'", + pos $$textref; + pos $$textref = $startpos; + return; + } pos($$textref) = $ld1pos; # HAVE TO DO THIS BECAUSE LOOKAHEAD BROKEN my ($ldel1, $rdel1) = ("\Q$1","\Q$1"); if ($ldel1 =~ /[[(<{]/) { $rdel1 =~ tr/[({/; - defined(_match_bracketed($textref,"",$ldel1,"","",$rdel1)) + defined(_match_bracketed($textref,qr/\G/,qr/\G($ldel1)/,"","",qr/\G($rdel1)/)) || do { pos $$textref = $startpos; return }; $ld2pos = pos($$textref); $rd1pos = $ld2pos-1; @@ -835,7 +874,7 @@ sub _match_quotelike($$$$) # ($text if ($ldel2 =~ /[[(<{]/) { pos($$textref)--; # OVERCOME BROKEN LOOKAHEAD - defined(_match_bracketed($textref,"",$ldel2,"","",$rdel2)) + defined(_match_bracketed($textref,qr/\G/,qr/\G($ldel2)/,"","",qr/\G($rdel2)/)) || do { pos $$textref = $startpos; return }; } else @@ -854,6 +893,7 @@ sub _match_quotelike($$$$) # ($text $$textref =~ m/\G($mods{$op})/gc; my $endpos = pos $$textref; + $ref2qmarkvalid{$textref} = $ref2slashvalid{$textref} = undef; return ( $startpos, $oppos-$startpos, # PREFIX @@ -874,10 +914,26 @@ my $def_func = [ sub { extract_quotelike($_[0],'') }, sub { extract_codeblock($_[0],'{}','') }, ]; +my %ref_not_regex = map +($_=>1), qw(CODE Text::Balanced::Extractor); +sub _update_patvalid { + my ($textref, $text) = @_; + if ($ref2slashvalid{$textref} && $text =~ m/(?:$RE_NUM|[\)\]])\s*$/) + { + $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 0; + } elsif (!$ref2slashvalid{$textref} && $text =~ m/$RE_PREREGEX_PAT\s*$/) + { + $ref2slashvalid{$textref} = $ref2qmarkvalid{$textref} = 1; + } elsif (!$ref2slashvalid{$textref} && $text =~ m/$RE_EXPR_PAT\s*$/) + { + $ref2slashvalid{$textref} = 1; + $ref2qmarkvalid{$textref} = 0; + } +} sub extract_multiple (;$$$$) # ($text, $functions_ref, $max_fields, $ignoreunknown) { my $textref = defined($_[0]) ? \$_[0] : \$_; + $ref2slashvalid{$textref} = 1, $ref2qmarkvalid{$textref} = 0 if !pos($$textref); # reset my $posbug = pos; my ($lastpos, $firstpos); my @fields = (); @@ -898,39 +954,28 @@ sub extract_multiple (;$$$$) # ($text $max = 1 } - my $unkpos; - my $class; - my @class; foreach my $func ( @func ) { - if (ref($func) eq 'HASH') - { - push @class, (keys %$func)[0]; - $func = (values %$func)[0]; - } - else - { - push @class, undef; - } + push @class, undef; + ($class[-1], $func) = %$func if ref($func) eq 'HASH'; + $func = qr/\G$func/ if !$ref_not_regex{ref $func}; } + my $unkpos; FIELD: while (pos($$textref) < length($$textref)) { - my ($field, $rem); - my @bits; foreach my $i ( 0..$#func ) { - my $pref; - my $func = $func[$i]; - $class = $class[$i]; + my ($field, $pref); + my ($class, $func) = ($class[$i], $func[$i]); $lastpos = pos $$textref; if (ref($func) eq 'CODE') - { ($field,$rem,$pref) = @bits = $func->($$textref) } + { ($field,undef,$pref) = $func->($$textref) } elsif (ref($func) eq 'Text::Balanced::Extractor') - { @bits = $field = $func->extract($$textref) } - elsif( $$textref =~ m/\G$func/gc ) - { @bits = $field = defined($1) + { $field = $func->extract($$textref) } + elsif( $$textref =~ m/$func[$i]/gc ) + { $field = defined($1) ? $1 : substr($$textref, $-[0], $+[0] - $-[0]) } @@ -948,9 +993,8 @@ sub extract_multiple (;$$$$) # ($text last FIELD if @fields == $max; } } - push @fields, $class - ? bless (\$field, $class) - : $field; + push @fields, $class ? bless(\$field, $class) : $field; + _update_patvalid($textref, $fields[-1]); $firstpos = $lastpos unless defined $firstpos; $lastpos = pos $$textref; last FIELD if @fields == $max; @@ -961,6 +1005,7 @@ sub extract_multiple (;$$$$) # ($text { $unkpos = pos($$textref)-1 unless $igunk || defined $unkpos; + _update_patvalid($textref, substr $$textref, $unkpos, pos($$textref)-$unkpos); } } @@ -986,7 +1031,7 @@ sub gen_extract_tagged # ($opentag, $clo { my $ldel = $_[0]; my $rdel = $_[1]; - my $pre = defined $_[2] ? $_[2] : '\s*'; + my $pre = defined $_[2] ? qr/\G$_[2]/ : qr/\G\s*/; my %options = defined $_[3] ? %{$_[3]} : (); my $omode = defined $options{fail} ? $options{fail} : ''; my $bad = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}}) @@ -998,16 +1043,16 @@ sub gen_extract_tagged # ($opentag, $clo : '' ; - if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; } + $ldel = $et_default_ldel if !defined $ldel; my $posbug = pos; - for ($ldel, $pre, $bad, $ignore) { $_ = qr/$_/ if $_ } + for ($ldel, $bad, $ignore) { $_ = qr/$_/ if $_ } pos = $posbug; my $closure = sub { my $textref = defined $_[0] ? \$_[0] : \$_; - my @match = Text::Balanced::_match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore); + my @match = _match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore); return _fail(wantarray, $textref) unless @match; return _succeed wantarray, $textref, @@ -1027,7 +1072,9 @@ sub extract($$) # ($self, $text) package Text::Balanced::ErrorMsg; -use overload '""' => sub { "$_[0]->{error}, detected at offset $_[0]->{pos}" }; +use overload + '""' => sub { "$_[0]->{error}, detected at offset $_[0]->{pos}" }, + fallback => 1; 1; @@ -1450,7 +1497,7 @@ A string to be processed (C<$_> if the s =item 2. -A string specifying a pattern to be matched as the opening tag. +A string specifying a pattern (i.e. regex) to be matched as the opening tag. If the pattern string is omitted (or C) then a pattern that matches any standard XML tag is used. @@ -1854,7 +1901,8 @@ C<"extract_quotelike">. C takes the same initial three parameters as C: a text to process, a set of delimiter brackets to look for, and a prefix to match first. It also takes an optional fourth parameter, which allows the -outermost delimiter brackets to be specified separately (see below). +outermost delimiter brackets to be specified separately (see below), +and a fifth parameter used only by L. Omitting the first argument (input text) means process C<$_> instead. Omitting the second argument (delimiter brackets) indicates that only C<'{'> is to be used. @@ -2063,12 +2111,14 @@ operator (and removes it from $text): Finally, here is yet another way to do comma-separated value parsing: + $csv_text = "a,'x b',c"; @fields = extract_multiple($csv_text, [ sub { extract_delimited($_[0],q{'"}) }, - qr/([^,]+)(.*)/, + qr/([^,]+)/, ], undef,1); + # @fields is now ('a', "'x b'", 'c') The list in the second argument means: I<"Try and extract a ' or " delimited string, otherwise extract anything up to a comma...">. @@ -2084,7 +2134,7 @@ just make the last parameter undefined ( =item C The C subroutine takes a single (string) argument and - > builds a Friedl-style optimized regex that matches a string delimited +builds a Friedl-style optimized regex that matches a string delimited by any one of the characters in the single argument. For example: gen_delimited_pat(q{'"}) @@ -2360,7 +2410,8 @@ Copyright (C) 1997-2001 Damian Conway. Copyright (C) 2009 Adam Kennedy. -Copyright (C) 2015, 2020 Steve Hay. All rights reserved. +Copyright (C) 2015, 2020, 2022 Steve Hay and other contributors. All rights +reserved. =head1 LICENCE @@ -2370,11 +2421,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 2.04 +Version 2.06 =head1 DATE -11 Dec 2020 +05 Jun 2022 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/Text-Balanced/t/01_compile.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Text-Balanced/t/01_compile.t,v diff -u -p -a -u -p -r1.1.1.2 01_compile.t --- gnu/usr.bin/perl/cpan/Text-Balanced/t/01_compile.t 15 Feb 2023 01:32:32 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Text-Balanced/t/01_compile.t 21 Feb 2024 15:47:01 -0000 @@ -1,5 +1,3 @@ -#!/usr/bin/perl - use 5.008001; use strict; Index: gnu/usr.bin/perl/cpan/Text-Balanced/t/02_extbrk.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Text-Balanced/t/02_extbrk.t,v diff -u -p -a -u -p -r1.1.1.2 02_extbrk.t --- gnu/usr.bin/perl/cpan/Text-Balanced/t/02_extbrk.t 15 Feb 2023 01:32:32 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Text-Balanced/t/02_extbrk.t 21 Feb 2024 15:47:01 -0000 @@ -1,27 +1,12 @@ -# Before `make install' is performed this script should be runnable with -# `make test'. After `make install' it should work as `perl test.pl' - use 5.008001; use strict; use warnings; - -######################### We start with some black magic to print on failure. - -# Change 1..1 below to 1..last_test_to_print . -# (It may become useful if the test is moved to ./t subdirectory.) - -my $loaded = 0; -BEGIN { $| = 1; print "1..19\n"; } -END {print "not ok 1\n" unless $loaded;} +use Test::More; use Text::Balanced qw ( extract_bracketed ); -$loaded = 1; -print "ok 1\n"; -my $count=2; -use vars qw( $DEBUG ); -sub debug { print "\t>>>",@_ if $DEBUG } -######################### End of black magic. +our $DEBUG; +sub debug { print "\t>>>",@_ if $DEBUG } ## no critic (BuiltinFunctions::ProhibitStringyEval) @@ -34,6 +19,7 @@ while (defined($str = )) if ($str =~ s/\A# USING://) { $neg = 0; $cmd = $str; next; } elsif ($str =~ /\A# TH[EI]SE? SHOULD FAIL/) { $neg = 1; next; } elsif (!$str || $str =~ /\A#/) { $neg = 0; next } + my $orig_str = $str; $str =~ s/\\n/\n/g; debug "\tUsing: $cmd\n"; debug "\t on: [$str]\n"; @@ -41,21 +27,19 @@ while (defined($str = )) my $var = eval "() = $cmd"; debug "\t list got: [$var]\n"; debug "\t list left: [$str]\n"; - print "not " if (substr($str,pos($str),1) eq ';')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&isnt : \&is)->(substr($str,pos($str)||0,1), ';', "$orig_str matched list"); + diag $@ if $@ && $DEBUG; pos $str = 0; $var = eval $cmd; $var = "" unless defined $var; debug "\t scalar got: [$var]\n"; debug "\t scalar left: [$str]\n"; - print "not " if ($str =~ '\A;')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&unlike : \&like)->( $str, qr/\A;/, "$orig_str matched scalar"); + diag $@ if $@ && $DEBUG; } + +done_testing; __DATA__ Index: gnu/usr.bin/perl/cpan/Text-Balanced/t/03_extcbk.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Text-Balanced/t/03_extcbk.t,v diff -u -p -a -u -p -r1.1.1.2 03_extcbk.t --- gnu/usr.bin/perl/cpan/Text-Balanced/t/03_extcbk.t 15 Feb 2023 01:32:32 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Text-Balanced/t/03_extcbk.t 21 Feb 2024 15:47:01 -0000 @@ -1,27 +1,12 @@ -# Before `make install' is performed this script should be runnable with -# `make test'. After `make install' it should work as `perl test.pl' - use 5.008001; use strict; use warnings; - -######################### We start with some black magic to print on failure. - -# Change 1..1 below to 1..last_test_to_print . -# (It may become useful if the test is moved to ./t subdirectory.) - -my $loaded = 0; -BEGIN { $| = 1; print "1..41\n"; } -END {print "not ok 1\n" unless $loaded;} +use Test::More; use Text::Balanced qw ( extract_codeblock ); -$loaded = 1; -print "ok 1\n"; -my $count=2; -use vars qw( $DEBUG ); -sub debug { print "\t>>>",@_ if $DEBUG } -######################### End of black magic. +our $DEBUG; +sub debug { print "\t>>>",@_ if $DEBUG } ## no critic (BuiltinFunctions::ProhibitStringyEval) @@ -34,30 +19,47 @@ while (defined($str = )) if ($str =~ s/\A# USING://) { $neg = 0; $cmd = $str; next; } elsif ($str =~ /\A# TH[EI]SE? SHOULD FAIL/) { $neg = 1; next; } elsif (!$str || $str =~ /\A#/) { $neg = 0; next } + my $orig_str = $str; $str =~ s/\\n/\n/g; debug "\tUsing: $cmd\n"; debug "\t on: [$str]\n"; my @res; my $var = eval "\@res = $cmd"; - debug "\t Failed: $@ at " . $@+0 .")" if $@; + is $@, '', 'no error'; debug "\t list got: [" . join("|", map {defined $_ ? $_ : ''} @res) . "]\n"; debug "\t list left: [$str]\n"; - print "not " if (substr($str,pos($str)||0,1) eq ';')==$neg; - print "ok ", $count++; - print "\n"; + ($neg ? \&isnt : \&is)->(substr($str,pos($str)||0,1), ';', "$orig_str matched list"); pos $str = 0; $var = eval $cmd; + is $@, '', 'no error'; $var = "" unless defined $var; debug "\t scalar got: [$var]\n"; debug "\t scalar left: [$str]\n"; - print "not " if ($str =~ '\A;')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&unlike : \&like)->( $str, qr/\A;/, "$orig_str matched scalar"); } +my $grammar = <<'EOF'; +given 2 { when __ < 1 { ok(0) } else { ok(1) } } +EOF +pos $grammar = 8; +my ($out) = Text::Balanced::_match_codeblock(\$grammar,qr/\s*/,qr/\{/,qr/\}/,qr/\{/,qr/\}/,undef); +ok $out, 'Switch error from calling _match_codeblock'; + +$grammar = <<'EOF'; +comment: m/a/ +enum_list: (/b/) +EOF +pos $grammar = 10; +($out) = Text::Balanced::extract_quotelike($grammar); +is $out, 'm/a/', 'PRD error (setup for real error)'; +pos $grammar = 26; +($out) = extract_codeblock($grammar,'{([',undef,'(',1); +is $out, '(/b/)', 'PRD error'; + +done_testing; + __DATA__ # USING: extract_codeblock($str,'(){}',undef,'()'); @@ -65,6 +67,13 @@ __DATA__ # USING: extract_codeblock($str); { $data[4] =~ /['"]/; }; +{1<<2}; +{1<<2};\n +{1<<2};\n\n +{ $a = /\}/; }; +{ sub { $_[0] /= $_[1] } }; # / here +{ 1; }; +{ $a = 1; }; # USING: extract_codeblock($str,'<>'); < %x = ( try => "this") >; @@ -77,13 +86,9 @@ __DATA__ # THIS SHOULD FAIL < %x = do { $try > 10 } >; -# USING: extract_codeblock($str); - -{ $a = /\}/; }; -{ sub { $_[0] /= $_[1] } }; # / here -{ 1; }; -{ $a = 1; }; - +# USING: extract_codeblock($str, '()'); +(($x || 2)); split /z/, $y +(($x // 2)); split /z/, $y # USING: extract_codeblock($str,undef,'=*'); ========{$a=1}; Index: gnu/usr.bin/perl/cpan/Text-Balanced/t/04_extdel.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Text-Balanced/t/04_extdel.t,v diff -u -p -a -u -p -r1.1.1.2 04_extdel.t --- gnu/usr.bin/perl/cpan/Text-Balanced/t/04_extdel.t 15 Feb 2023 01:32:32 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Text-Balanced/t/04_extdel.t 21 Feb 2024 15:47:01 -0000 @@ -1,28 +1,13 @@ -# Before `make install' is performed this script should be runnable with -# `make test'. After `make install' it should work as `perl test.pl' - use 5.008001; use strict; use warnings; +use Test::More; +use Text::Balanced qw ( extract_delimited extract_multiple ); -######################### We start with some black magic to print on failure. - -# Change 1..1 below to 1..last_test_to_print . -# (It may become useful if the test is moved to ./t subdirectory.) - -my $loaded = 0; -BEGIN { $| = 1; print "1..45\n"; } -END {print "not ok 1\n" unless $loaded;} -use Text::Balanced qw ( extract_delimited ); -$loaded = 1; -print "ok 1\n"; -my $count=2; -use vars qw( $DEBUG ); +our $DEBUG; sub debug { print "\t>>>",@_ if $DEBUG } -######################### End of black magic. - ## no critic (BuiltinFunctions::ProhibitStringyEval) my $cmd = "print"; @@ -34,28 +19,40 @@ while (defined($str = )) if ($str =~ s/\A# USING://) { $neg = 0; $cmd = $str; next; } elsif ($str =~ /\A# TH[EI]SE? SHOULD FAIL/) { $neg = 1; next; } elsif (!$str || $str =~ /\A#/) { $neg = 0; next } + my $orig_str = $str; $str =~ s/\\n/\n/g; debug "\tUsing: $cmd\n"; debug "\t on: [$str]\n"; my $var = eval "() = $cmd"; + is $@, '', 'no error'; debug "\t list got: [$var]\n"; debug "\t list left: [$str]\n"; - print "not " if (substr($str,pos($str)||0,1) eq ';')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&isnt : \&is)->(substr($str,pos($str)||0,1), ';', "$orig_str matched list"); pos $str = 0; $var = eval $cmd; + is $@, '', 'no error'; $var = "" unless defined $var; debug "\t scalar got: [$var]\n"; debug "\t scalar left: [$str]\n"; - print "not " if ($str =~ '\A;')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&unlike : \&like)->( $str, qr/\A;/, "$orig_str matched scalar"); } + +my $text = 'while($a == "test"){ print "true";}'; +my ($extracted, $remainder) = extract_delimited($text, '#'); +ok '' ne $@, 'string overload should not crash'; + +$text = "a,'x b',c"; +my @fields = extract_multiple($text, + [ + sub { extract_delimited($_[0],q{'"}) }, + qr/([^,]+)/, + ], + undef,1); +is_deeply \@fields, ['a', "'x b'", 'c'] or diag 'got: ', explain \@fields; + +done_testing; __DATA__ # USING: extract_delimited($str,'/#$',undef,'/#$'); Index: gnu/usr.bin/perl/cpan/Text-Balanced/t/05_extmul.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Text-Balanced/t/05_extmul.t,v diff -u -p -a -u -p -r1.1.1.2 05_extmul.t --- gnu/usr.bin/perl/cpan/Text-Balanced/t/05_extmul.t 15 Feb 2023 01:32:32 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Text-Balanced/t/05_extmul.t 21 Feb 2024 15:47:01 -0000 @@ -1,54 +1,20 @@ -# Before `make install' is performed this script should be runnable with -# `make test'. After `make install' it should work as `perl test.pl' - use 5.008001; use strict; use warnings; - -######################### We start with some black magic to print on failure. - -# Change 1..1 below to 1..last_test_to_print . -# (It may become useful if the test is moved to ./t subdirectory.) - -my $loaded = 0; -BEGIN { $| = 1; print "1..86\n"; } -END {print "not ok 1\n" unless $loaded;} +use Test::More; use Text::Balanced qw ( :ALL ); -$loaded = 1; -print "ok 1\n"; -my $count=2; -use vars qw( $DEBUG ); -sub debug { print "\t>>>",@_ if $DEBUG } -######################### End of black magic. +our $DEBUG; +sub debug { print "\t>>>",@_ if $DEBUG } sub expect { - local $^W; my ($l1, $l2) = @_; - - if (@$l1 != @$l2) - { - print "\@l1: ", join(", ", @$l1), "\n"; - print "\@l2: ", join(", ", @$l2), "\n"; - print "not "; - } - else - { - for (my $i = 0; $i < @$l1; $i++) - { - if ($l1->[$i] ne $l2->[$i]) - { - print "field $i: '$l1->[$i]' ne '$l2->[$i]'\n"; - print "not "; - last; - } - } - } - - print "ok $count\n"; - $count++; + is_deeply $l1, $l2 or do { + diag 'got:', explain $l1; + diag 'expected:', explain $l2; + }; } sub divide @@ -66,10 +32,8 @@ sub divide } - my $stdtext1 = q{$var = do {"val" && $val;};}; -# TESTS 2-4 my $text = $stdtext1; expect [ extract_multiple($text,undef,1) ], [ divide $stdtext1 => 4 ]; @@ -77,7 +41,6 @@ expect [ extract_multiple($text,undef,1) expect [ pos $text], [ 4 ]; expect [ $text ], [ $stdtext1 ]; -# TESTS 5-7 $text = $stdtext1; expect [ scalar extract_multiple($text,undef,1) ], [ divide $stdtext1 => 4 ]; @@ -86,7 +49,6 @@ expect [ pos $text], [ 0 ]; expect [ $text ], [ substr($stdtext1,4) ]; -# TESTS 8-10 $text = $stdtext1; expect [ extract_multiple($text,undef,2) ], [ divide($stdtext1 => 4, 10) ]; @@ -94,7 +56,6 @@ expect [ extract_multiple($text,undef,2) expect [ pos $text], [ 10 ]; expect [ $text ], [ $stdtext1 ]; -# TESTS 11-13 $text = $stdtext1; expect [ eval{local$^W;scalar extract_multiple($text,undef,2)} ], [ substr($stdtext1,0,4) ]; @@ -103,7 +64,6 @@ expect [ pos $text], [ 0 ]; expect [ $text ], [ substr($stdtext1,4) ]; -# TESTS 14-16 $text = $stdtext1; expect [ extract_multiple($text,undef,3) ], [ divide($stdtext1 => 4, 10, 26) ]; @@ -111,7 +71,6 @@ expect [ extract_multiple($text,undef,3) expect [ pos $text], [ 26 ]; expect [ $text ], [ $stdtext1 ]; -# TESTS 17-19 $text = $stdtext1; expect [ eval{local$^W;scalar extract_multiple($text,undef,3)} ], [ substr($stdtext1,0,4) ]; @@ -120,7 +79,6 @@ expect [ pos $text], [ 0 ]; expect [ $text ], [ substr($stdtext1,4) ]; -# TESTS 20-22 $text = $stdtext1; expect [ extract_multiple($text,undef,4) ], [ divide($stdtext1 => 4, 10, 26, 27) ]; @@ -128,7 +86,6 @@ expect [ extract_multiple($text,undef,4) expect [ pos $text], [ 27 ]; expect [ $text ], [ $stdtext1 ]; -# TESTS 23-25 $text = $stdtext1; expect [ eval{local$^W;scalar extract_multiple($text,undef,4)} ], [ substr($stdtext1,0,4) ]; @@ -137,7 +94,6 @@ expect [ pos $text], [ 0 ]; expect [ $text ], [ substr($stdtext1,4) ]; -# TESTS 26-28 $text = $stdtext1; expect [ extract_multiple($text,undef,5) ], [ divide($stdtext1 => 4, 10, 26, 27) ]; @@ -146,7 +102,6 @@ expect [ pos $text], [ 27 ]; expect [ $text ], [ $stdtext1 ]; -# TESTS 29-31 $text = $stdtext1; expect [ eval{local$^W;scalar extract_multiple($text,undef,5)} ], [ substr($stdtext1,0,4) ]; @@ -156,7 +111,6 @@ expect [ $text ], [ substr($stdtext1,4) -# TESTS 32-34 my $stdtext2 = q{$var = "val" && (1,2,3);}; $text = $stdtext2; @@ -166,7 +120,6 @@ expect [ extract_multiple($text) ], expect [ pos $text], [ 24 ]; expect [ $text ], [ $stdtext2 ]; -# TESTS 35-37 $text = $stdtext2; expect [ scalar extract_multiple($text) ], [ substr($stdtext2,0,4) ]; @@ -175,7 +128,6 @@ expect [ pos $text], [ 0 ]; expect [ $text ], [ substr($stdtext2,4) ]; -# TESTS 38-40 $text = $stdtext2; expect [ extract_multiple($text,[\&extract_bracketed]) ], [ substr($stdtext2,0,16), substr($stdtext2,16,7), substr($stdtext2,23) ]; @@ -183,7 +135,6 @@ expect [ extract_multiple($text,[\&extra expect [ pos $text], [ 24 ]; expect [ $text ], [ $stdtext2 ]; -# TESTS 41-43 $text = $stdtext2; expect [ scalar extract_multiple($text,[\&extract_bracketed]) ], [ substr($stdtext2,0,16) ]; @@ -192,7 +143,6 @@ expect [ pos $text], [ 0 ]; expect [ $text ], [ substr($stdtext2,15) ]; -# TESTS 44-46 $text = $stdtext2; expect [ extract_multiple($text,[\&extract_variable]) ], [ substr($stdtext2,0,4), substr($stdtext2,4) ]; @@ -200,7 +150,6 @@ expect [ extract_multiple($text,[\&extra expect [ pos $text], [ length($text) ]; expect [ $text ], [ $stdtext2 ]; -# TESTS 47-49 $text = $stdtext2; expect [ scalar extract_multiple($text,[\&extract_variable]) ], [ substr($stdtext2,0,4) ]; @@ -209,7 +158,6 @@ expect [ pos $text], [ 0 ]; expect [ $text ], [ substr($stdtext2,4) ]; -# TESTS 50-52 $text = $stdtext2; expect [ extract_multiple($text,[\&extract_quotelike]) ], [ substr($stdtext2,0,7), substr($stdtext2,7,5), substr($stdtext2,12) ]; @@ -217,7 +165,6 @@ expect [ extract_multiple($text,[\&extra expect [ pos $text], [ length($text) ]; expect [ $text ], [ $stdtext2 ]; -# TESTS 53-55 $text = $stdtext2; expect [ scalar extract_multiple($text,[\&extract_quotelike]) ], [ substr($stdtext2,0,7) ]; @@ -226,7 +173,6 @@ expect [ pos $text], [ 0 ]; expect [ $text ], [ substr($stdtext2,6) ]; -# TESTS 56-58 $text = $stdtext2; expect [ extract_multiple($text,[\&extract_quotelike],2,1) ], [ substr($stdtext2,7,5) ]; @@ -234,7 +180,6 @@ expect [ extract_multiple($text,[\&extra expect [ pos $text], [ 23 ]; expect [ $text ], [ $stdtext2 ]; -# TESTS 59-61 $text = $stdtext2; expect [ eval{local$^W;scalar extract_multiple($text,[\&extract_quotelike],2,1)} ], [ substr($stdtext2,7,5) ]; @@ -243,7 +188,6 @@ expect [ pos $text], [ 6 ]; expect [ $text ], [ substr($stdtext2,0,6). substr($stdtext2,12) ]; -# TESTS 62-64 $text = $stdtext2; expect [ extract_multiple($text,[\&extract_quotelike],1,1) ], [ substr($stdtext2,7,5) ]; @@ -251,7 +195,6 @@ expect [ extract_multiple($text,[\&extra expect [ pos $text], [ 12 ]; expect [ $text ], [ $stdtext2 ]; -# TESTS 65-67 $text = $stdtext2; expect [ scalar extract_multiple($text,[\&extract_quotelike],1,1) ], [ substr($stdtext2,7,5) ]; @@ -259,7 +202,6 @@ expect [ scalar extract_multiple($text,[ expect [ pos $text], [ 6 ]; expect [ $text ], [ substr($stdtext2,0,6). substr($stdtext2,12) ]; -# TESTS 68-70 my $stdtext3 = "a,b,c"; $_ = $stdtext3; @@ -269,8 +211,6 @@ expect [ extract_multiple(undef, [ sub { expect [ pos ], [ 5 ]; expect [ $_ ], [ $stdtext3 ]; -# TESTS 71-73 - $_ = $stdtext3; expect [ scalar extract_multiple(undef, [ sub { /\G[a-z]/gc && $& } ]) ], [ divide($stdtext3 => 1) ]; @@ -278,9 +218,6 @@ expect [ scalar extract_multiple(undef, expect [ pos ], [ 0 ]; expect [ $_ ], [ substr($stdtext3,1) ]; - -# TESTS 74-76 - $_ = $stdtext3; expect [ extract_multiple(undef, [ qr/\G[a-z]/ ]) ], [ divide($stdtext3 => 1,2,3,4,5) ]; @@ -288,8 +225,6 @@ expect [ extract_multiple(undef, [ qr/\G expect [ pos ], [ 5 ]; expect [ $_ ], [ $stdtext3 ]; -# TESTS 77-79 - $_ = $stdtext3; expect [ scalar extract_multiple(undef, [ qr/\G[a-z]/ ]) ], [ divide($stdtext3 => 1) ]; @@ -297,9 +232,6 @@ expect [ scalar extract_multiple(undef, expect [ pos ], [ 0 ]; expect [ $_ ], [ substr($stdtext3,1) ]; - -# TESTS 80-82 - $_ = $stdtext3; expect [ extract_multiple(undef, [ q/([a-z]),?/ ]) ], [ qw(a b c) ]; @@ -307,8 +239,6 @@ expect [ extract_multiple(undef, [ q/([a expect [ pos ], [ 5 ]; expect [ $_ ], [ $stdtext3 ]; -# TESTS 83-85 - $_ = $stdtext3; expect [ scalar extract_multiple(undef, [ q/([a-z]),?/ ]) ], [ divide($stdtext3 => 1) ]; @@ -316,10 +246,134 @@ expect [ scalar extract_multiple(undef, expect [ pos ], [ 0 ]; expect [ $_ ], [ substr($stdtext3,2) ]; - -# TEST 86 - # Fails in Text-Balanced-1.95 with result ['1 ', '""', '1234'] $_ = q{ ""1234}; expect [ extract_multiple(undef, [\&extract_quotelike]) ], [ ' ', '""', '1234' ]; + +my $not_here_doc = "sub f {\n my \$pa <<= 2;\n}\n\n"; # wrong in 2.04 +expect [ extract_multiple($not_here_doc, [ + { DONT_MATCH => \&extract_quotelike } +]) ], + [ "sub f {\n my \$pa <<= 2;\n}\n\n" ]; + +my $y_falsematch = <<'EOF'; # wrong in 2.04 +my $p = {y => 1}; +{ $pa=ones(3,3,3); my $f = do { my $i=1; my $v=$$p{y}-$i; $pb = $pa(,$i,) }; } +EOF +expect [ extract_multiple($y_falsematch, [ + \&extract_variable, + { DONT_MATCH => \&extract_quotelike } +]) ], + [ 'my ', '$p', " = {y => 1};\n{ ", '$pa', '=ones(3,3,3); my ', '$f', + ' = do { my ', '$i', '=1; my ', '$v', qw(= $$p{y} - $i), '; ', '$pb', + ' = ', '$pa', '(,', '$i', ",) }; }\n", + ]; + +my $slashmatch = <<'EOF'; # wrong in 2.04 +my $var = 10 / 3; if ($var !~ /\./) { decimal() ;} +EOF +my @expect_slash = ('my ', '$var', ' = 10 / 3; if (', '$var', " !~ ", + '/\\./', ") { decimal() ;}\n" +); +expect [ extract_multiple($slashmatch, [ + \&extract_variable, + \&extract_quotelike, +]) ], + \@expect_slash; + +$slashmatch = <<'EOF'; # wrong in 2.04 +my $var = 10 / 3; if ($var =~ /\./) { decimal() ;} +EOF +$expect_slash[4] = " =~ "; +expect [ extract_multiple($slashmatch, [ + \&extract_variable, + \&extract_quotelike, +]) ], + \@expect_slash; + +$slashmatch = <<'EOF'; # wrong in 2.04 +my $var = 10 / 3; if ($var =~ + # a comment + /\./) { decimal() ;} +EOF +my $comment = qr/(?t->(($a))->sever; +wantarray ? 1 : 0; $min = $var ? 0; +EOF +expect [ extract_multiple($slashmatch, [ + \&extract_variable, $id, \&extract_quotelike, +]) ], + [ + '$x->t->(($a))->sever', ";\n", + 'wantarray', ' ? ', '1', ' : ', '0', '; ', + '$min', ' = ', '$var', ' ? ', '0', ";\n", + ]; + +$slashmatch = <<'EOF'; # wrong in 2.04_01 +$var //= 'default'; $x = 1 / 2; +EOF +expect [ extract_multiple($slashmatch, [ + \&extract_variable, \&extract_quotelike, +]) ], + [ + '$var', ' //= ', '\'default\'', '; ', '$x', " = 1 / 2;\n" + ]; + +$slashmatch = <<'EOF'; # wrong in 2.04_01 +$m; return wantarray ? ($m, $i) : $var ? $m : 0; +EOF +expect [ extract_multiple($slashmatch, [ + \&extract_variable, \&extract_quotelike, +]) ], + [ + '$m', + '; return wantarray ? (', '$m', ', ', '$i', ') : ', '$var', ' ? ', '$m', + " : 0;\n" + ]; + +$slashmatch = <<'EOF'; # wrong in 2.05 +$_ = 1 unless defined $_ and /\d\b/; +EOF +expect [ extract_multiple($slashmatch, [ + \&extract_variable, \&extract_quotelike, +]) ], + [ '$_', ' = 1 unless defined ', '$_', ' and ', '/\\d\\b/', ";\n" ]; + +done_testing; Index: gnu/usr.bin/perl/cpan/Text-Balanced/t/06_extqlk.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Text-Balanced/t/06_extqlk.t,v diff -u -p -a -u -p -r1.1.1.2 06_extqlk.t --- gnu/usr.bin/perl/cpan/Text-Balanced/t/06_extqlk.t 15 Feb 2023 01:32:32 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Text-Balanced/t/06_extqlk.t 21 Feb 2024 15:47:01 -0000 @@ -1,30 +1,13 @@ -#! /usr/local/bin/perl -ws -# Before `make install' is performed this script should be runnable with -# `make test'. After `make install' it should work as `perl test.pl' - use 5.008001; use strict; use warnings; - -######################### We start with some black magic to print on failure. - -# Change 1..1 below to 1..last_test_to_print . -# (It may become useful if the test is moved to ./t subdirectory.) - -my $loaded = 0; -BEGIN { $| = 1; print "1..95\n"; } -END {print "not ok 1\n" unless $loaded;} +use Test::More; use Text::Balanced qw ( extract_quotelike ); -$loaded = 1; -print "ok 1\n"; -my $count=2; -use vars qw( $DEBUG ); -#$DEBUG=1; -sub debug { print "\t>>>",@_ if $ENV{DEBUG} } -sub esc { my $x = shift||''; $x =~ s/\n/\\n/gs; $x } -######################### End of black magic. +our $DEBUG; +sub debug { print "\t>>>",@_ if $DEBUG } +sub esc { my $x = shift||''; $x =~ s/\n/\\n/gs; $x } ## no critic (BuiltinFunctions::ProhibitStringyEval) @@ -39,46 +22,49 @@ while (defined($str = )) elsif (!$str || $str =~ /\A#/) { $neg = 0; next } my $setup_cmd = ($str =~ s/\A\{(.*)\}//) ? $1 : ''; my $tests = 'sl'; + my $orig_str = $str; $str =~ s/\\n/\n/g; my $orig = $str; eval $setup_cmd if $setup_cmd ne ''; + is $@, '', 'no error'; if($tests =~ /l/) { debug "\tUsing: $cmd\n"; debug "\t on: [" . esc($setup_cmd) . "][" . esc($str) . "]\n"; my @res; eval qq{\@res = $cmd; }; + is $@, '', 'no error'; debug "\t got:\n" . join "", map { "\t\t\t$_: [" . esc($res[$_]) . "]\n"} (0..$#res); debug "\t left: [" . esc($str) . "]\n"; debug "\t pos: [" . esc(substr($str,pos($str))) . "...]\n"; - print "not " if (substr($str,pos($str),1) eq ';')==$neg; - print "ok ", $count++; - print "\n"; + ($neg ? \&isnt : \&is)->(substr($str,pos($str)||0,1), ';', "$orig_str matched list"); } eval $setup_cmd if $setup_cmd ne ''; + is $@, '', 'no error'; if($tests =~ /s/) { $str = $orig; debug "\tUsing: scalar $cmd\n"; debug "\t on: [" . esc($str) . "]\n"; my $var = eval $cmd; - print " ($@)" if $@ && $DEBUG; $var = "" unless defined $var; debug "\t scalar got: [" . esc($var) . "]\n"; debug "\t scalar left: [" . esc($str) . "]\n"; - print "not " if ($str =~ '\A;')==$neg; - print "ok ", $count++; - print "\n"; + ($neg ? \&unlike : \&like)->( $str, qr/\A;/, "$orig_str matched scalar"); } } # fails in Text::Balanced 1.95 $_ = qq(s{}{}); my @z = extract_quotelike(); -print "not " if $z[0] eq ''; -print "ok ", $count++; -print "\n"; +isnt $z[0], ''; +@z = extract_quotelike("<<, 1; done()\nline1\nline2\n\n and next"); +like $z[1], qr/\A,/, 'implied heredoc with ,' or do { + diag "error: '$@'\ngot: ", explain \@z; +}; + +done_testing; __DATA__ @@ -88,7 +74,6 @@ __DATA__ "a"; 'b'; `cc`; - <>>",@_ if $DEBUG } -######################### End of black magic. +our $DEBUG; +sub debug { print "\t>>>",@_ if $DEBUG } ## no critic (BuiltinFunctions::ProhibitStringyEval) @@ -34,29 +19,28 @@ while (defined($str = )) if ($str =~ s/\A# USING://) { $neg = 0; $cmd = $str; next; } elsif ($str =~ /\A# TH[EI]SE? SHOULD FAIL/) { $neg = 1; next; } elsif (!$str || $str =~ /\A#/) { $neg = 0; next } + my $orig_str = $str; $str =~ s/\\n/\n/g; debug "\tUsing: $cmd\n"; debug "\t on: [$str]\n"; my @res; my $var = eval "\@res = $cmd"; + is $@, '', 'no error'; debug "\t list got: [" . join("|",map {defined $_ ? $_ : ''} @res) . "]\n"; debug "\t list left: [$str]\n"; - print "not " if (substr($str,pos($str)||0,1) eq ';')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&isnt : \&is)->(substr($str,pos($str)||0,1), ';', "$orig_str matched list"); pos $str = 0; $var = eval $cmd; + is $@, '', 'no error'; $var = "" unless defined $var; debug "\t scalar got: [$var]\n"; debug "\t scalar left: [$str]\n"; - print "not " if ($str =~ '\A;')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&unlike : \&like)->( $str, qr/\A;/, "$orig_str matched scalar"); } + +done_testing; __DATA__ # USING: gen_extract_tagged("BEGIN([A-Z]+)",'END$1',"(?s).*?(?=BEGIN)")->($str); Index: gnu/usr.bin/perl/cpan/Text-Balanced/t/08_extvar.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Text-Balanced/t/08_extvar.t,v diff -u -p -a -u -p -r1.1.1.2 08_extvar.t --- gnu/usr.bin/perl/cpan/Text-Balanced/t/08_extvar.t 15 Feb 2023 01:32:32 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Text-Balanced/t/08_extvar.t 21 Feb 2024 15:47:01 -0000 @@ -1,27 +1,12 @@ -# Before `make install' is performed this script should be runnable with -# `make test'. After `make install' it should work as `perl test.pl' - use 5.008001; use strict; use warnings; - -######################### We start with some black magic to print on failure. - -# Change 1..1 below to 1..last_test_to_print . -# (It may become useful if the test is moved to ./t subdirectory.) - -my $loaded = 0; -BEGIN { $| = 1; print "1..183\n"; } -END {print "not ok 1\n" unless $loaded;} +use Test::More; use Text::Balanced qw ( extract_variable ); -$loaded = 1; -print "ok 1\n"; -my $count=2; -use vars qw( $DEBUG ); -sub debug { print "\t>>>",@_ if $DEBUG } -######################### End of black magic. +our $DEBUG; +sub debug { print "\t>>>",@_ if $DEBUG } ## no critic (BuiltinFunctions::ProhibitStringyEval) @@ -34,29 +19,31 @@ while (defined($str = )) if ($str =~ s/\A# USING://) { $neg = 0; $cmd = $str; next; } elsif ($str =~ /\A# TH[EI]SE? SHOULD FAIL/) { $neg = 1; next; } elsif (!$str || $str =~ /\A#/) { $neg = 0; next } + my $orig_str = $str; $str =~ s/\\n/\n/g; debug "\tUsing: $cmd\n"; debug "\t on: [$str]\n"; my @res; my $var = eval "\@res = $cmd"; + is $@, '', 'no error'; debug "\t list got: [" . join("|",map {defined $_ ? $_ : ''} @res) . "]\n"; debug "\t list left: [$str]\n"; - print "not " if (substr($str,pos($str)||0,1) eq ';')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&isnt : \&is)->(substr($str,pos($str)||0,1), ';', "$orig_str matched list"); pos $str = 0; $var = eval $cmd; + is $@, '', 'no error'; $var = "" unless defined $var; debug "\t scalar got: [$var]\n"; debug "\t scalar left: [$str]\n"; - print "not " if ($str =~ '\A;')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&unlike : \&like)->( $str, qr/\A;/, "$orig_str matched scalar"); } + +my @res = extract_variable('${a}'); +is $res[0], '${a}' or diag "error was: $@"; + +done_testing; __DATA__ Index: gnu/usr.bin/perl/cpan/Text-Balanced/t/09_gentag.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Text-Balanced/t/09_gentag.t,v diff -u -p -a -u -p -r1.1.1.2 09_gentag.t --- gnu/usr.bin/perl/cpan/Text-Balanced/t/09_gentag.t 15 Feb 2023 01:32:32 -0000 1.1.1.2 +++ gnu/usr.bin/perl/cpan/Text-Balanced/t/09_gentag.t 21 Feb 2024 15:47:01 -0000 @@ -1,27 +1,12 @@ -# Before `make install' is performed this script should be runnable with -# `make test'. After `make install' it should work as `perl test.pl' - use 5.008001; use strict; use warnings; - -######################### We start with some black magic to print on failure. - -# Change 1..1 below to 1..last_test_to_print . -# (It may become useful if the test is moved to ./t subdirectory.) - -my $loaded = 0; -BEGIN { $| = 1; print "1..37\n"; } -END {print "not ok 1\n" unless $loaded;} use Text::Balanced qw ( gen_extract_tagged ); -$loaded = 1; -print "ok 1\n"; -my $count=2; -use vars qw( $DEBUG ); -sub debug { print "\t>>>",@_ if $DEBUG } +use Test::More; -######################### End of black magic. +our $DEBUG; +sub debug { print "\t>>>",@_ if $DEBUG } ## no critic (BuiltinFunctions::ProhibitStringyEval) @@ -31,6 +16,7 @@ my $str; while (defined($str = )) { chomp $str; + my $orig_str = $str; $str =~ s/\\n/\n/g; if ($str =~ s/\A# USING://) { @@ -41,6 +27,7 @@ while (defined($str = )) local $SIG{__WARN__} = sub { push @warnings, shift; }; *f = eval $str || die; }; + is $@, '', 'no error'; next; } elsif ($str =~ /\A# TH[EI]SE? SHOULD FAIL/) { $neg = 1; next; } @@ -51,23 +38,21 @@ while (defined($str = )) my @res; my $var = eval { @res = f($str) }; + is $@, '', 'no error'; debug "\t list got: [" . join("|",map {defined $_ ? $_ : ''} @res) . "]\n"; debug "\t list left: [$str]\n"; - print "not " if (substr($str,pos($str)||0,1) eq ';')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&isnt : \&is)->(substr($str,pos($str)||0,1), ';', "$orig_str matched list"); pos $str = 0; $var = eval { scalar f($str) }; + is $@, '', 'no error'; $var = "" unless defined $var; debug "\t scalar got: [$var]\n"; debug "\t scalar left: [$str]\n"; - print "not " if ($str =~ '\A;')==$neg; - print "ok ", $count++; - print " ($@)" if $@ && $DEBUG; - print "\n"; + ($neg ? \&unlike : \&like)->( $str, qr/\A;/, "$orig_str matched scalar"); } + +done_testing; __DATA__ Index: gnu/usr.bin/perl/cpan/Time-Piece/Piece.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Time-Piece/Piece.pm,v diff -u -p -a -u -p -r1.8 Piece.pm --- gnu/usr.bin/perl/cpan/Time-Piece/Piece.pm 1 Mar 2021 23:19:50 -0000 1.8 +++ gnu/usr.bin/perl/cpan/Time-Piece/Piece.pm 21 Feb 2024 15:47:00 -0000 @@ -19,7 +19,7 @@ our %EXPORT_TAGS = ( ':override' => 'internal', ); -our $VERSION = '1.3401'; +our $VERSION = '1.3401_01'; XSLoader::load( 'Time::Piece', $VERSION ); Index: gnu/usr.bin/perl/cpan/Time-Piece/Piece.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/Time-Piece/Piece.xs,v diff -u -p -a -u -p -r1.3 Piece.xs --- gnu/usr.bin/perl/cpan/Time-Piece/Piece.xs 13 Feb 2019 21:15:16 -0000 1.3 +++ gnu/usr.bin/perl/cpan/Time-Piece/Piece.xs 21 Feb 2024 15:47:00 -0000 @@ -1,15 +1,8 @@ -#ifdef __cplusplus -extern "C" { -#endif #define PERL_NO_GET_CONTEXT #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include -#ifdef __cplusplus -} -#endif - #define DAYS_PER_YEAR 365 #define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1) Index: gnu/usr.bin/perl/cpan/autodie/lib/Fatal.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/lib/Fatal.pm,v diff -u -p -a -u -p -r1.4 Fatal.pm --- gnu/usr.bin/perl/cpan/autodie/lib/Fatal.pm 15 Feb 2023 01:36:24 -0000 1.4 +++ gnu/usr.bin/perl/cpan/autodie/lib/Fatal.pm 21 Feb 2024 15:47:00 -0000 @@ -55,7 +55,7 @@ use constant ERROR_58_HINTS => q{Non-sub use constant MIN_IPC_SYS_SIMPLE_VER => 0.12; -our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg::Version +our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg::Version our $Debug ||= 0; @@ -170,6 +170,8 @@ my %TAGS = ( ':2.32' => [qw(:default)], ':2.33' => [qw(:default)], ':2.34' => [qw(:default)], + ':2.35' => [qw(:default)], + ':2.36' => [qw(:default)], ); @@ -1088,6 +1090,7 @@ sub _one_invocation { my $code = qq[ no warnings qw(unopened uninitialized numeric); no if \$\] >= 5.017011, warnings => "experimental::smartmatch"; + no if \$warnings::Offsets{"deprecated::smartmatch"}, warnings => "deprecated"; if (wantarray) { my \@results = $call(@argv); Index: gnu/usr.bin/perl/cpan/autodie/lib/autodie.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/lib/autodie.pm,v diff -u -p -a -u -p -r1.4 autodie.pm --- gnu/usr.bin/perl/cpan/autodie/lib/autodie.pm 15 Feb 2023 01:36:24 -0000 1.4 +++ gnu/usr.bin/perl/cpan/autodie/lib/autodie.pm 21 Feb 2024 15:47:00 -0000 @@ -9,7 +9,7 @@ our $VERSION; # ABSTRACT: Replace functions with ones that succeed or die with lexical scope BEGIN { - our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg::Version + our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg::Version } use constant ERROR_WRONG_FATAL => q{ Index: gnu/usr.bin/perl/cpan/autodie/lib/autodie/Util.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/lib/autodie/Util.pm,v diff -u -p -a -u -p -r1.3 Util.pm --- gnu/usr.bin/perl/cpan/autodie/lib/autodie/Util.pm 15 Feb 2023 01:36:24 -0000 1.3 +++ gnu/usr.bin/perl/cpan/autodie/lib/autodie/Util.pm 21 Feb 2024 15:47:00 -0000 @@ -14,7 +14,7 @@ our @EXPORT_OK = qw( on_end_of_compile_scope ); -our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg:Version +our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg:Version # ABSTRACT: Internal Utility subroutines for autodie and Fatal @@ -179,7 +179,7 @@ autodie::Util - Internal Utility subrout =head1 DESCRIPTION -Interal Utilities for autodie and Fatal! This module is not a part of +Internal Utilities for autodie and Fatal! This module is not a part of autodie's public API. This module contains utility subroutines for abstracting away the @@ -237,7 +237,7 @@ this subroutine. Given a package name and a hashref mapping names to a subroutine reference (or C), this subroutine will install said subroutines on their given name in that module. If a name mapes to C, any -subroutine with that name in the target module will be remove +subroutine with that name in the target module will be removed (possibly "unshadowing" a CORE sub of same name). =head1 AUTHOR Index: gnu/usr.bin/perl/cpan/autodie/lib/autodie/exception.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/lib/autodie/exception.pm,v diff -u -p -a -u -p -r1.5 exception.pm --- gnu/usr.bin/perl/cpan/autodie/lib/autodie/exception.pm 15 Feb 2023 01:36:24 -0000 1.5 +++ gnu/usr.bin/perl/cpan/autodie/lib/autodie/exception.pm 21 Feb 2024 15:47:00 -0000 @@ -6,7 +6,7 @@ use Carp qw(croak); use Scalar::Util qw(blessed); -our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg:Version +our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg:Version # ABSTRACT: Exceptions from autodying functions. our $DEBUG = 0; Index: gnu/usr.bin/perl/cpan/autodie/lib/autodie/hints.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/lib/autodie/hints.pm,v diff -u -p -a -u -p -r1.5 hints.pm --- gnu/usr.bin/perl/cpan/autodie/lib/autodie/hints.pm 15 Feb 2023 01:36:24 -0000 1.5 +++ gnu/usr.bin/perl/cpan/autodie/lib/autodie/hints.pm 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; use constant PERL58 => ( $] < 5.009 ); -our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg:Version +our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg:Version # ABSTRACT: Provide hints about user subroutines to autodie Index: gnu/usr.bin/perl/cpan/autodie/lib/autodie/skip.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/lib/autodie/skip.pm,v diff -u -p -a -u -p -r1.4 skip.pm --- gnu/usr.bin/perl/cpan/autodie/lib/autodie/skip.pm 15 Feb 2023 01:36:24 -0000 1.4 +++ gnu/usr.bin/perl/cpan/autodie/lib/autodie/skip.pm 21 Feb 2024 15:47:00 -0000 @@ -2,7 +2,7 @@ package autodie::skip; use strict; use warnings; -our $VERSION = '2.34'; # VERSION +our $VERSION = '2.36'; # VERSION # This package exists purely so people can inherit from it, # which isn't at all how roles are supposed to work, but it's Index: gnu/usr.bin/perl/cpan/autodie/lib/autodie/Scope/Guard.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/lib/autodie/Scope/Guard.pm,v diff -u -p -a -u -p -r1.3 Guard.pm --- gnu/usr.bin/perl/cpan/autodie/lib/autodie/Scope/Guard.pm 15 Feb 2023 01:36:24 -0000 1.3 +++ gnu/usr.bin/perl/cpan/autodie/lib/autodie/Scope/Guard.pm 21 Feb 2024 15:47:00 -0000 @@ -4,7 +4,7 @@ use strict; use warnings; # ABSTRACT: Wrapper class for calling subs at end of scope -our $VERSION = '2.34'; # VERSION +our $VERSION = '2.36'; # VERSION # This code schedules the cleanup of subroutines at the end of # scope. It's directly inspired by chocolateboy's excellent Index: gnu/usr.bin/perl/cpan/autodie/lib/autodie/Scope/GuardStack.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/lib/autodie/Scope/GuardStack.pm,v diff -u -p -a -u -p -r1.3 GuardStack.pm --- gnu/usr.bin/perl/cpan/autodie/lib/autodie/Scope/GuardStack.pm 15 Feb 2023 01:36:24 -0000 1.3 +++ gnu/usr.bin/perl/cpan/autodie/lib/autodie/Scope/GuardStack.pm 21 Feb 2024 15:47:00 -0000 @@ -6,7 +6,7 @@ use warnings; use autodie::Scope::Guard; # ABSTRACT: Hook stack for managing scopes via %^H -our $VERSION = '2.34'; # VERSION +our $VERSION = '2.36'; # VERSION my $H_KEY_STEM = __PACKAGE__ . '/guard'; my $COUNTER = 0; Index: gnu/usr.bin/perl/cpan/autodie/lib/autodie/exception/system.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/lib/autodie/exception/system.pm,v diff -u -p -a -u -p -r1.4 system.pm --- gnu/usr.bin/perl/cpan/autodie/lib/autodie/exception/system.pm 15 Feb 2023 01:36:24 -0000 1.4 +++ gnu/usr.bin/perl/cpan/autodie/lib/autodie/exception/system.pm 21 Feb 2024 15:47:00 -0000 @@ -5,7 +5,7 @@ use warnings; use parent 'autodie::exception'; use Carp qw(croak); -our $VERSION = '2.34'; # VERSION: Generated by DZP::OurPkg:Version +our $VERSION = '2.36'; # VERSION: Generated by DZP::OurPkg:Version # ABSTRACT: Exceptions from autodying system(). Index: gnu/usr.bin/perl/cpan/autodie/t/exception_class.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/t/exception_class.t,v diff -u -p -a -u -p -r1.1.1.1 exception_class.t --- gnu/usr.bin/perl/cpan/autodie/t/exception_class.t 24 Sep 2010 14:49:05 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/autodie/t/exception_class.t 21 Feb 2024 15:47:00 -0000 @@ -43,7 +43,7 @@ like($@, qr/Bad exception class/, '$@ sh ### Tests with well-formed exception class (in Klingon) my $open_success3 = eval { - use pujHa'ghach qw(open); #' <-- this makes my editor happy + use pujHa::ghach qw(open); open(my $fh, '<', NO_SUCH_FILE); 1; }; @@ -52,6 +52,6 @@ is($open_success3,undef,"Open should fai isnt("$@","",'$@ should not be empty'); -isa_ok($@, "pujHa'ghach::Dotlh", '$@ should be a Klingon exception'); +isa_ok($@, "pujHa::ghach::Dotlh", '$@ should be a Klingon exception'); like($@, qr/lujqu'/, '$@ should contain Klingon text'); Index: gnu/usr.bin/perl/cpan/autodie/t/exceptions.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/t/exceptions.t,v diff -u -p -a -u -p -r1.3 exceptions.t --- gnu/usr.bin/perl/cpan/autodie/t/exceptions.t 13 Feb 2019 21:15:18 -0000 1.3 +++ gnu/usr.bin/perl/cpan/autodie/t/exceptions.t 21 Feb 2024 15:47:00 -0000 @@ -8,8 +8,11 @@ BEGIN { plan skip_all => "Perl 5.10 only # Basic tests should go in basic_exceptions.t use 5.010; +use warnings (); use constant NO_SUCH_FILE => 'this_file_had_better_not_exist_xyzzy'; no if $] >= 5.017011, warnings => "experimental::smartmatch"; +no if exists $warnings::Offsets{"deprecated::smartmatch"}, + warnings => "deprecated"; plan 'no_plan'; Index: gnu/usr.bin/perl/cpan/autodie/t/lib/pujHa/ghach.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/t/lib/pujHa/ghach.pm,v diff -u -p -a -u -p -r1.2 ghach.pm --- gnu/usr.bin/perl/cpan/autodie/t/lib/pujHa/ghach.pm 5 Feb 2017 00:32:06 -0000 1.2 +++ gnu/usr.bin/perl/cpan/autodie/t/lib/pujHa/ghach.pm 21 Feb 2024 15:47:00 -0000 @@ -1,4 +1,4 @@ -package pujHa'ghach; +package pujHa::ghach; # Translator notes: reH Hegh is Kligon for "always dying". # It was the original name for this testing pragma, but @@ -20,7 +20,7 @@ use warnings; use parent qw(autodie); sub exception_class { - return "pujHa'ghach::Dotlh"; # Dotlh - status + return "pujHa::ghach::Dotlh"; # Dotlh - status } 1; Index: gnu/usr.bin/perl/cpan/autodie/t/lib/pujHa/ghach/Dotlh.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/autodie/t/lib/pujHa/ghach/Dotlh.pm,v diff -u -p -a -u -p -r1.2 Dotlh.pm --- gnu/usr.bin/perl/cpan/autodie/t/lib/pujHa/ghach/Dotlh.pm 5 Feb 2017 00:32:06 -0000 1.2 +++ gnu/usr.bin/perl/cpan/autodie/t/lib/pujHa/ghach/Dotlh.pm 21 Feb 2024 15:47:00 -0000 @@ -1,4 +1,4 @@ -package pujHa'ghach::Dotlh; +package pujHa::ghach::Dotlh; # Translator notes: Dotlh = status Index: gnu/usr.bin/perl/cpan/bignum/lib/bigfloat.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/bignum/lib/bigfloat.pm,v diff -u -p -a -u -p -r1.1.1.1 bigfloat.pm --- gnu/usr.bin/perl/cpan/bignum/lib/bigfloat.pm 15 Feb 2023 01:32:43 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/bignum/lib/bigfloat.pm 21 Feb 2024 15:47:01 -0000 @@ -5,7 +5,7 @@ use warnings; use Carp qw< carp croak >; -our $VERSION = '0.65'; +our $VERSION = '0.66'; use Exporter; our @ISA = qw( Exporter ); Index: gnu/usr.bin/perl/cpan/bignum/lib/bigint.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/bignum/lib/bigint.pm,v diff -u -p -a -u -p -r1.6 bigint.pm --- gnu/usr.bin/perl/cpan/bignum/lib/bigint.pm 15 Feb 2023 01:36:25 -0000 1.6 +++ gnu/usr.bin/perl/cpan/bignum/lib/bigint.pm 21 Feb 2024 15:47:01 -0000 @@ -5,7 +5,7 @@ use warnings; use Carp qw< carp croak >; -our $VERSION = '0.65'; +our $VERSION = '0.66'; use Exporter; our @ISA = qw( Exporter ); @@ -553,8 +553,8 @@ Load a different math lib, see L pragma is active. +higher, this is not necessary, as hex() is lexically overridden in the current +scope whenever the C pragma is active. =item oct @@ -800,8 +800,8 @@ Some cool command line examples to impre to compare them to the results under -Mbigfloat or -Mbigrat: perl -Mbigint -le 'print sqrt(33)' - perl -Mbigint -le 'print 2*255' - perl -Mbigint -le 'print 4.5+2*255' + perl -Mbigint -le 'print 2**255' + perl -Mbigint -le 'print 4.5+2**255' perl -Mbigint -le 'print 123->is_odd()' perl -Mbigint=l,GMP -le 'print 7 ** 7777' Index: gnu/usr.bin/perl/cpan/bignum/lib/bignum.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/bignum/lib/bignum.pm,v diff -u -p -a -u -p -r1.6 bignum.pm --- gnu/usr.bin/perl/cpan/bignum/lib/bignum.pm 15 Feb 2023 01:36:25 -0000 1.6 +++ gnu/usr.bin/perl/cpan/bignum/lib/bignum.pm 21 Feb 2024 15:47:01 -0000 @@ -5,7 +5,7 @@ use warnings; use Carp qw< carp croak >; -our $VERSION = '0.65'; +our $VERSION = '0.66'; use Exporter; our @ISA = qw( Exporter ); Index: gnu/usr.bin/perl/cpan/bignum/lib/bigrat.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/bignum/lib/bigrat.pm,v diff -u -p -a -u -p -r1.6 bigrat.pm --- gnu/usr.bin/perl/cpan/bignum/lib/bigrat.pm 15 Feb 2023 01:36:25 -0000 1.6 +++ gnu/usr.bin/perl/cpan/bignum/lib/bigrat.pm 21 Feb 2024 15:47:01 -0000 @@ -5,7 +5,7 @@ use warnings; use Carp qw< carp croak >; -our $VERSION = '0.65'; +our $VERSION = '0.66'; use Exporter; our @ISA = qw( Exporter ); Index: gnu/usr.bin/perl/cpan/bignum/lib/Math/BigFloat/Trace.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/bignum/lib/Math/BigFloat/Trace.pm,v diff -u -p -a -u -p -r1.6 Trace.pm --- gnu/usr.bin/perl/cpan/bignum/lib/Math/BigFloat/Trace.pm 15 Feb 2023 01:36:25 -0000 1.6 +++ gnu/usr.bin/perl/cpan/bignum/lib/Math/BigFloat/Trace.pm 21 Feb 2024 15:47:01 -0000 @@ -10,7 +10,7 @@ use Math::BigFloat; our @ISA = qw(Exporter Math::BigFloat); -our $VERSION = '0.65'; +our $VERSION = '0.66'; use overload; # inherit overload from Math::BigFloat Index: gnu/usr.bin/perl/cpan/bignum/lib/Math/BigInt/Trace.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/bignum/lib/Math/BigInt/Trace.pm,v diff -u -p -a -u -p -r1.6 Trace.pm --- gnu/usr.bin/perl/cpan/bignum/lib/Math/BigInt/Trace.pm 15 Feb 2023 01:36:25 -0000 1.6 +++ gnu/usr.bin/perl/cpan/bignum/lib/Math/BigInt/Trace.pm 21 Feb 2024 15:47:01 -0000 @@ -10,7 +10,7 @@ use Math::BigInt; our @ISA = qw(Exporter Math::BigInt); -our $VERSION = '0.65'; +our $VERSION = '0.66'; use overload; # inherit overload from Math::BigInt Index: gnu/usr.bin/perl/cpan/bignum/lib/Math/BigRat/Trace.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/bignum/lib/Math/BigRat/Trace.pm,v diff -u -p -a -u -p -r1.1.1.1 Trace.pm --- gnu/usr.bin/perl/cpan/bignum/lib/Math/BigRat/Trace.pm 15 Feb 2023 01:32:43 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/bignum/lib/Math/BigRat/Trace.pm 21 Feb 2024 15:47:01 -0000 @@ -10,7 +10,7 @@ use Math::BigRat; our @ISA = qw(Exporter Math::BigRat); -our $VERSION = '0.65'; +our $VERSION = '0.66'; use overload; # inherit overload from Math::BigRat Index: gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum-mbf.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum-mbf.t diff -N gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum-mbf.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum-mbf.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,101 @@ +# -*- mode: perl; -*- + +use strict; +use warnings; + +use Test::More tests => 66; + +# Default: upgrade => "Math::BigFloat", downgrade => "Math::BigInt"; +use bignum; + +my $class = "Math::BigInt"; +my $x; + +############################################################################### + +note("inf tests"); + +$x = 1 + inf; +note("\n\n" . $x . "\n\n"); + +$x = 1 + inf; +is(ref($x), $class, "\$x = 1 + inf makes a $class"); +is($x->bstr(), "inf", '$x = 1 + inf; $x->bstr() = "inf"'); + +$x = 1 * inf; +is(ref($x), $class, "\$x = 1 * inf makes a $class"); +is($x->bstr(), "inf", '$x = 1 * inf; $x->bstr() = "inf"'); + +# these don't work without exporting inf() +$x = inf; +is(ref($x), $class, "\$x = inf makes a $class"); +is($x->bstr(), "inf", '$x = inf; $x->bstr() = "inf"'); + +$x = inf + inf; +is(ref($x), $class, "\$x = inf + inf makes a $class"); +is($x->bstr(), "inf", '$x = inf + inf; $x->bstr() = "inf"'); + +$x = inf * inf; +is(ref($x), $class, "\$x = inf * inf makes a $class"); +is($x->bstr(), "inf", '$x = inf * inf; $x->bstr() = "inf"'); + +############################################################################### + +note("NaN tests"); + +$x = 1 + NaN; +is(ref($x), $class, "\$x = 1 + NaN makes a $class"); +is($x->bstr(), "NaN", '$x = 1 + NaN; $x->bstr() = "NaN"'); + +$x = 1 * NaN; +is(ref($x), $class, "\$x = 1 * NaN makes a $class"); +is($x->bstr(), "NaN", '$x = 1 * NaN; $x->bstr() = "NaN"'); + +# these don't work without exporting NaN() +$x = NaN; +is(ref($x), $class, "\$x = NaN makes a $class"); +is($x->bstr(), "NaN", '$x = NaN; $x->bstr() = "NaN"'); + +$x = NaN + NaN; +is(ref($x), $class, "\$x = NaN + NaN makes a $class"); +is($x->bstr(), "NaN", '$x = NaN + NaN; $x->bstr() = "NaN"'); + +$x = NaN * NaN; +is(ref($x), $class, "\$x = NaN * NaN makes a $class"); +is($x->bstr(), "NaN", '$x = NaN * NaN; $x->bstr() = "NaN"'); + +############################################################################### + +note("mixed tests"); + +# these don't work without exporting NaN() or inf() + +$x = NaN + inf; +is(ref($x), $class, "\$x = NaN + inf makes a $class"); +is($x->bstr(), "NaN", '$x = NaN + inf; $x->bstr() = "NaN"'); + +$x = NaN * inf; +is(ref($x), $class, "\$x = NaN * inf makes a $class"); +is($x->bstr(), "NaN", '$x = NaN * inf; $x->bstr() = "NaN"'); + +$x = inf * NaN; +is(ref($x), $class, "\$x = inf * NaN makes a $class"); +is($x->bstr(), "NaN", '$x = inf * NaN; $x->bstr() = "NaN"'); + +############################################################################### +# inf and NaN as strings. + +for my $nan (qw/ nan naN nAn nAN Nan NaN NAn NAN /) { + my $x = 1 + $nan; + is($x->bstr(), "NaN", qq|\$x = 1 + "$nan"|); + is(ref($x), $class, "\$x is a $class"); +} + +for my $inf (qw/ inf inF iNf iNF Inf InF INf INF + infinity Infinity InFiNiTy iNfInItY + /) +{ + my $x = 1 + $inf; + is($x->bstr(), "inf", qq|\$x = 1 + "$inf"|); + is(ref($x), $class, "\$x is a $class"); +} Index: gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum-mbr.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum-mbr.t diff -N gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum-mbr.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum-mbr.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,101 @@ +# -*- mode: perl; -*- + +use strict; +use warnings; + +use Test::More tests => 66; + +# Default: upgrade => "Math::BigFloat", downgrade => "Math::BigInt"; +use bignum upgrade => "Math::BigRat"; + +my $class = "Math::BigInt"; +my $x; + +############################################################################### + +note("inf tests"); + +$x = 1 + inf; +note("\n\n" . $x . "\n\n"); + +$x = 1 + inf; +is(ref($x), $class, "\$x = 1 + inf makes a $class"); +is($x->bstr(), "inf", '$x = 1 + inf; $x->bstr() = "inf"'); + +$x = 1 * inf; +is(ref($x), $class, "\$x = 1 * inf makes a $class"); +is($x->bstr(), "inf", '$x = 1 * inf; $x->bstr() = "inf"'); + +# these don't work without exporting inf() +$x = inf; +is(ref($x), $class, "\$x = inf makes a $class"); +is($x->bstr(), "inf", '$x = inf; $x->bstr() = "inf"'); + +$x = inf + inf; +is(ref($x), $class, "\$x = inf + inf makes a $class"); +is($x->bstr(), "inf", '$x = inf + inf; $x->bstr() = "inf"'); + +$x = inf * inf; +is(ref($x), $class, "\$x = inf * inf makes a $class"); +is($x->bstr(), "inf", '$x = inf * inf; $x->bstr() = "inf"'); + +############################################################################### + +note("NaN tests"); + +$x = 1 + NaN; +is(ref($x), $class, "\$x = 1 + NaN makes a $class"); +is($x->bstr(), "NaN", '$x = 1 + NaN; $x->bstr() = "NaN"'); + +$x = 1 * NaN; +is(ref($x), $class, "\$x = 1 * NaN makes a $class"); +is($x->bstr(), "NaN", '$x = 1 * NaN; $x->bstr() = "NaN"'); + +# these don't work without exporting NaN() +$x = NaN; +is(ref($x), $class, "\$x = NaN makes a $class"); +is($x->bstr(), "NaN", '$x = NaN; $x->bstr() = "NaN"'); + +$x = NaN + NaN; +is(ref($x), $class, "\$x = NaN + NaN makes a $class"); +is($x->bstr(), "NaN", '$x = NaN + NaN; $x->bstr() = "NaN"'); + +$x = NaN * NaN; +is(ref($x), $class, "\$x = NaN * NaN makes a $class"); +is($x->bstr(), "NaN", '$x = NaN * NaN; $x->bstr() = "NaN"'); + +############################################################################### + +note("mixed tests"); + +# these don't work without exporting NaN() or inf() + +$x = NaN + inf; +is(ref($x), $class, "\$x = NaN + inf makes a $class"); +is($x->bstr(), "NaN", '$x = NaN + inf; $x->bstr() = "NaN"'); + +$x = NaN * inf; +is(ref($x), $class, "\$x = NaN * inf makes a $class"); +is($x->bstr(), "NaN", '$x = NaN * inf; $x->bstr() = "NaN"'); + +$x = inf * NaN; +is(ref($x), $class, "\$x = inf * NaN makes a $class"); +is($x->bstr(), "NaN", '$x = inf * NaN; $x->bstr() = "NaN"'); + +############################################################################### +# inf and NaN as strings. + +for my $nan (qw/ nan naN nAn nAN Nan NaN NAn NAN /) { + my $x = 1 + $nan; + is($x->bstr(), "NaN", qq|\$x = 1 + "$nan"|); + is(ref($x), $class, "\$x is a $class"); +} + +for my $inf (qw/ inf inF iNf iNF Inf InF INf INF + infinity Infinity InFiNiTy iNfInItY + /) +{ + my $x = 1 + $inf; + is($x->bstr(), "inf", qq|\$x = 1 + "$inf"|); + is(ref($x), $class, "\$x is a $class"); +} Index: gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum.t =================================================================== RCS file: gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum.t diff -N gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum.t --- gnu/usr.bin/perl/cpan/bignum/t/infnan-bignum.t 15 Feb 2023 01:32:43 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,100 +0,0 @@ -# -*- mode: perl; -*- - -use strict; -use warnings; - -use Test::More tests => 66; - -use bignum downgrade => undef; - -my $class = "Math::BigInt"; -my $x; - -############################################################################### - -note("inf tests"); - -$x = 1 + inf; -note("\n\n" . $x . "\n\n"); - -$x = 1 + inf; -is(ref($x), $class, "\$x = 1 + inf makes a $class"); -is($x->bstr(), "inf", '$x = 1 + inf; $x->bstr() = "inf"'); - -$x = 1 * inf; -is(ref($x), $class, "\$x = 1 * inf makes a $class"); -is($x->bstr(), "inf", '$x = 1 * inf; $x->bstr() = "inf"'); - -# these don't work without exporting inf() -$x = inf; -is(ref($x), $class, "\$x = inf makes a $class"); -is($x->bstr(), "inf", '$x = inf; $x->bstr() = "inf"'); - -$x = inf + inf; -is(ref($x), $class, "\$x = inf + inf makes a $class"); -is($x->bstr(), "inf", '$x = inf + inf; $x->bstr() = "inf"'); - -$x = inf * inf; -is(ref($x), $class, "\$x = inf * inf makes a $class"); -is($x->bstr(), "inf", '$x = inf * inf; $x->bstr() = "inf"'); - -############################################################################### - -note("NaN tests"); - -$x = 1 + NaN; -is(ref($x), $class, "\$x = 1 + NaN makes a $class"); -is($x->bstr(), "NaN", '$x = 1 + NaN; $x->bstr() = "NaN"'); - -$x = 1 * NaN; -is(ref($x), $class, "\$x = 1 * NaN makes a $class"); -is($x->bstr(), "NaN", '$x = 1 * NaN; $x->bstr() = "NaN"'); - -# these don't work without exporting NaN() -$x = NaN; -is(ref($x), $class, "\$x = NaN makes a $class"); -is($x->bstr(), "NaN", '$x = NaN; $x->bstr() = "NaN"'); - -$x = NaN + NaN; -is(ref($x), $class, "\$x = NaN + NaN makes a $class"); -is($x->bstr(), "NaN", '$x = NaN + NaN; $x->bstr() = "NaN"'); - -$x = NaN * NaN; -is(ref($x), $class, "\$x = NaN * NaN makes a $class"); -is($x->bstr(), "NaN", '$x = NaN * NaN; $x->bstr() = "NaN"'); - -############################################################################### - -note("mixed tests"); - -# these don't work without exporting NaN() or inf() - -$x = NaN + inf; -is(ref($x), $class, "\$x = NaN + inf makes a $class"); -is($x->bstr(), "NaN", '$x = NaN + inf; $x->bstr() = "NaN"'); - -$x = NaN * inf; -is(ref($x), $class, "\$x = NaN * inf makes a $class"); -is($x->bstr(), "NaN", '$x = NaN * inf; $x->bstr() = "NaN"'); - -$x = inf * NaN; -is(ref($x), $class, "\$x = inf * NaN makes a $class"); -is($x->bstr(), "NaN", '$x = inf * NaN; $x->bstr() = "NaN"'); - -############################################################################### -# inf and NaN as strings. - -for my $nan (qw/ nan naN nAn nAN Nan NaN NAn NAN /) { - my $x = 1 + $nan; - is($x->bstr(), "NaN", qq|\$x = 1 + "$nan"|); - is(ref($x), $class, "\$x is a $class"); -} - -for my $inf (qw/ inf inF iNf iNF Inf InF INf INF - infinity Infinity InFiNiTy iNfInItY - /) -{ - my $x = 1 + $inf; - is($x->bstr(), "inf", qq|\$x = 1 + "$inf"|); - is(ref($x), $class, "\$x is a $class"); -} Index: gnu/usr.bin/perl/cpan/experimental/lib/experimental.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/experimental/lib/experimental.pm,v diff -u -p -a -u -p -r1.5 experimental.pm --- gnu/usr.bin/perl/cpan/experimental/lib/experimental.pm 15 Feb 2023 01:36:25 -0000 1.5 +++ gnu/usr.bin/perl/cpan/experimental/lib/experimental.pm 21 Feb 2024 15:47:00 -0000 @@ -1,5 +1,5 @@ package experimental; -$experimental::VERSION = '0.028'; +$experimental::VERSION = '0.031'; use strict; use warnings; use version (); @@ -8,6 +8,7 @@ BEGIN { eval { require feature } }; use Carp qw/croak carp/; my %warnings = map { $_ => 1 } grep { /^experimental::/ } keys %warnings::Offsets; +my %removed_warnings = map { $_ => 1 } grep { /^experimental::/ } keys %warnings::NoOp; my %features = map { $_ => 1 } $] > 5.015006 ? keys %feature::feature : do { my @features; if ($] >= 5.010) { @@ -28,7 +29,7 @@ my %min_version = ( declared_refs => '5.26.0', defer => '5.35.4', evalbytes => '5.16.0', - extra_paired_delims => '5.35.9', + extra_paired_delimiters => '5.35.9', fc => '5.16.0', for_list => '5.35.5', isa => '5.31.7', @@ -73,6 +74,9 @@ sub _enable { feature->import($pragma); _enable(@{ $additional{$pragma} }) if $additional{$pragma}; } + elsif ($removed_warnings{"experimental::$pragma"}) { + _enable(@{ $additional{$pragma} }) if $additional{$pragma}; + } elsif (not exists $min_version{$pragma}) { croak "Can't enable unknown feature $pragma"; } @@ -136,7 +140,7 @@ experimental - Experimental features mad =head1 VERSION -version 0.027 +version 0.031 =head1 SYNOPSIS @@ -201,6 +205,11 @@ This was added in perl 5.26.0. This was added in perl 5.36.0 +=item * C - enables the use of more paired string delimiters than the +traditional four, S >>>, S>, S>, and S>. + +This was added in perl 5.36. + =item * C - allows iterating over multiple values at a time with C This was added in perl 5.36.0 @@ -215,7 +224,7 @@ This was added in perl 5.10.0 and remove =item * C - allow the use of lexical subroutines. -This was added in 5.18.0. +This was added in 5.18.0, and became non-experimental (and always enabled) in 5.26.0. =item * C - allow the use of postfix dereferencing expressions @@ -246,9 +255,13 @@ This was added in perl 5.20.0. This was added in perl 5.10.0, but it should be noted there are significant incompatibilities between 5.10.0 and 5.10.1. +The feature is going to be deprecated in perl 5.38.0, and removed in 5.42.0. + =item * C - allow the use of C<~~>, given, and when This was added in perl 5.10.0. + +The feature is going to be deprecated in perl 5.38.0, and removed in 5.42.0. =item * C - allow the use of C and C Index: gnu/usr.bin/perl/cpan/experimental/lib/stable.pm =================================================================== RCS file: gnu/usr.bin/perl/cpan/experimental/lib/stable.pm diff -N gnu/usr.bin/perl/cpan/experimental/lib/stable.pm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/experimental/lib/stable.pm 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,159 @@ +package stable; +$stable::VERSION = '0.031'; +use strict; +use warnings; +use version (); + +use experimental (); +use Carp qw/croak carp/; + +my %allow_at = ( + bitwise => 5.022000, + isa => 5.032000, + lexical_subs => 5.022000, + postderef => 5.020000, +); + +sub import { + my ($self, @pragmas) = @_; + + for my $pragma (@pragmas) { + my $min_ver = $allow_at{$pragma}; + croak "unknown stablized experiment $pragma" unless defined $min_ver; + croak "requested stablized experiment $pragma, which is stable at $min_ver but this is $]" + unless $] >= $min_ver; + } + + experimental->import(@pragmas); + return; +} + +sub unimport { + my ($self, @pragmas) = @_; + + # Look, we could say "You can't unimport stable experiment 'bitwise' on + # 5.20" but it just seems weird. -- rjbs, 2022-03-05 + experimental->unimport(@pragmas); + return; +} + +1; + +#ABSTRACT: Experimental features made easy, once we know they're stable + +__END__ + +=pod + +=encoding UTF-8 + +=head1 NAME + +stable - Experimental features made easy, once we know they're stable + +=head1 VERSION + +version 0.031 + +=head1 SYNOPSIS + + use stable 'lexical_subs', 'bitwise'; + my sub is_odd($value) { $value & 1 } + +=head1 DESCRIPTION + +The L pragma makes it easy to turn on experimental while turning +off associated warnings. You should read about it, if you don't already know +what it does. + +Seeing C in code might be scary. In fact, it probably should +be! Code that uses experimental features might break in the future if the perl +development team decides that the experiment needs to be altered. When +experiments become stable, because the developers decide they're a success, the +warnings associated with them go away. When that happens, they can generally +be turned on with C. + +This is great, if you are using a version of perl where the feature you want is +already stable. If you're using an older perl, though, it might be the case +that you want to use an experimental feature that still warns, even though +there's no risk in using it, because subsequent versions of perl have that +feature unchanged and now stable. + +Here's an example: The C feature was added in perl 5.20.0. In perl +5.24.0, it was marked stable. Using it would no longer trigger a warning. The +behavior of the feature didn't change between 5.20.0 and 5.24.0. That means +that it's perfectly safe to use the feature on 5.20 or 5.22, even though +there's a warning. + +In that case, you could very justifiably add C +but the casual reader may still be worried at seeing that. The C +pragma exists to turn on experimental features only when it's known that +their behavior in the running perl is their stable behavior. + +If you try to use an experimental feature that isn't stable or available on +the running version of perl, an exception will be thrown. You should also take +care that you've required the version of C that you need! + +If it's not immediately obvious why, here's a bit of explanation: + +=over 4 + +=item * + +C comes with perl, starting with perl v5.38. + +=item * + +Imagine that v5.38 adds a feature called "florps". It will stop being +experimental in v5.42. + +=item * + +The version of C that comes with perl v5.38 can't know that the +I experiment will succeed, so you can't C on the +version of stable ships with v5.38, because it can't see the future! + +=item * + +You'll need to write C to say that you need version +1.234 of stable, which is when I became known to stable. + +=back + +Sure, it's a little weird, but it's worth it! The documentation of this pragma +will tell you what version of C you need to require in order to use +various features. See below. + +At present there are only a few "stable" features: + +=over 4 + +=item * C - stable as of perl 5.22, available via stable 0.031 + +=item * C - stable as of perl 5.32, available via stable 0.031 + +=item * C - stable as of perl 5.22, available via stable 0.031 + +Lexical subroutines were actually added in 5.18, and their design did not +change, but significant bugs makes them unsafe to use before 5.22. + +=item * C - stable as of perl 5.20, available via stable 0.031 + +=back + +=head1 SEE ALSO + +L contains more information about experimental features. + +=head1 AUTHOR + +Leon Timmermans + +=head1 COPYRIGHT AND LICENSE + +This software is copyright (c) 2013 by Leon Timmermans. + +This is free software; you can redistribute it and/or modify it under +the same terms as the Perl 5 programming language system itself. + +=cut Index: gnu/usr.bin/perl/cpan/experimental/t/basic.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/experimental/t/basic.t,v diff -u -p -a -u -p -r1.5 basic.t --- gnu/usr.bin/perl/cpan/experimental/t/basic.t 15 Feb 2023 01:36:25 -0000 1.5 +++ gnu/usr.bin/perl/cpan/experimental/t/basic.t 21 Feb 2024 15:47:00 -0000 @@ -18,7 +18,9 @@ if ($] >= 5.010000) { END } -if ($] >= 5.010001) { +use warnings (); +if ( $] >= 5.010001 + && ( $] < 5.017011 || exists $warnings::Offsets{"experimental::smartmatch"} ) ) { is (eval <<'END', 1, 'switch compiles') or diag $@; use experimental 'switch'; sub bar { 1 }; @@ -34,7 +36,8 @@ if ($] >= 5.010001) { END } -if ($] >= 5.010001) { +if ( $] >= 5.010001 + && ( $] < 5.017011 || exists $warnings::Offsets{"experimental::smartmatch"} ) ) { is (eval <<'END', 1, 'smartmatch compiles') or diag $@; use experimental 'smartmatch'; sub baz { 1 }; Index: gnu/usr.bin/perl/cpan/libnet/Makefile.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/Makefile.PL,v diff -u -p -a -u -p -r1.6 Makefile.PL --- gnu/usr.bin/perl/cpan/libnet/Makefile.PL 15 Feb 2023 01:36:25 -0000 1.6 +++ gnu/usr.bin/perl/cpan/libnet/Makefile.PL 21 Feb 2024 15:47:00 -0000 @@ -66,7 +66,7 @@ MAIN: { ABSTRACT => 'Collection of network protocol modules', AUTHOR => 'Graham Barr , Steve Hay ', LICENSE => 'perl_5', - VERSION => '3.13', + VERSION => '3.15', META_MERGE => { 'meta-spec' => { Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/Cmd.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/Cmd.pm,v diff -u -p -a -u -p -r1.3 Cmd.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/Cmd.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/Cmd.pm 21 Feb 2024 15:47:00 -0000 @@ -1,7 +1,7 @@ # Net::Cmd.pm # # Copyright (C) 1995-2006 Graham Barr. All rights reserved. -# Copyright (C) 2013-2016, 2020 Steve Hay. All rights reserved. +# Copyright (C) 2013-2016, 2020, 2022 Steve Hay. All rights reserved. # This module is free software; you can redistribute it and/or modify it under # the same terms as Perl itself, i.e. under the terms of either the GNU General # Public License or the Artistic License, as specified in the F file. @@ -26,7 +26,7 @@ BEGIN { } } -our $VERSION = "3.14"; +our $VERSION = "3.15"; our @ISA = qw(Exporter); our @EXPORT = qw(CMD_INFO CMD_OK CMD_MORE CMD_REJECT CMD_ERROR CMD_PENDING); @@ -887,7 +887,7 @@ libnet as of version 1.22_02. Copyright (C) 1995-2006 Graham Barr. All rights reserved. -Copyright (C) 2013-2016, 2020 Steve Hay. All rights reserved. +Copyright (C) 2013-2016, 2020, 2022 Steve Hay. All rights reserved. =head1 LICENCE @@ -897,11 +897,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 3.14 +Version 3.15 =head1 DATE -23 Dec 2020 +20 March 2023 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm,v diff -u -p -a -u -p -r1.3 Config.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm 21 Feb 2024 15:47:00 -0000 @@ -18,7 +18,7 @@ use Socket qw(inet_aton inet_ntoa); our @EXPORT = qw(%NetConfig); our @ISA = qw(Net::LocalCfg Exporter); -our $VERSION = "3.14"; +our $VERSION = "3.15"; our($CONFIGURE, $LIBNET_CFG); @@ -368,11 +368,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 3.14 +Version 3.15 =head1 DATE -23 Dec 2020 +20 March 2023 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/Domain.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/Domain.pm,v diff -u -p -a -u -p -r1.3 Domain.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/Domain.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/Domain.pm 21 Feb 2024 15:47:00 -0000 @@ -19,7 +19,7 @@ use Net::Config; our @ISA = qw(Exporter); our @EXPORT_OK = qw(hostname hostdomain hostfqdn domainname); -our $VERSION = "3.14"; +our $VERSION = "3.15"; my ($host, $domain, $fqdn) = (undef, undef, undef); @@ -395,11 +395,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 3.14 +Version 3.15 =head1 DATE -23 Dec 2020 +20 March 2023 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP.pm,v diff -u -p -a -u -p -r1.3 FTP.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP.pm 21 Feb 2024 15:47:00 -0000 @@ -1,7 +1,7 @@ # Net::FTP.pm # # Copyright (C) 1995-2004 Graham Barr. All rights reserved. -# Copyright (C) 2013-2017, 2020 Steve Hay. All rights reserved. +# Copyright (C) 2013-2017, 2020, 2022 Steve Hay. All rights reserved. # This module is free software; you can redistribute it and/or modify it under # the same terms as Perl itself, i.e. under the terms of either the GNU General # Public License or the Artistic License, as specified in the F file. @@ -23,7 +23,7 @@ use Net::Config; use Socket; use Time::Local; -our $VERSION = '3.14'; +our $VERSION = '3.15'; our $IOCLASS; my $family_key; @@ -1052,14 +1052,7 @@ sub _dataconn { Timeout => $ftp->timeout, can_ssl() ? ( SSL_startHandshake => 0, - $ftp->is_SSL ? ( - SSL_reuse_ctx => $ftp, - SSL_verifycn_name => ${*$ftp}{net_ftp_tlsargs}{SSL_verifycn_name}, - # This will cause the use of SNI if supported by IO::Socket::SSL. - $ftp->can_client_sni ? ( - SSL_hostname => ${*$ftp}{net_ftp_tlsargs}{SSL_hostname} - ):(), - ) :( %{${*$ftp}{net_ftp_tlsargs}} ), + %{${*$ftp}{net_ftp_tlsargs}}, ):(), ) or return; } elsif (my $listen = delete ${*$ftp}{net_ftp_listen}) { @@ -1966,19 +1959,6 @@ Reinitialize the connection, flushing al =back -=head1 EXAMPLES - -For an example of the use of Net::FTP see - -=over 4 - -=item L - -C is a program that can retrieve, send, or list files via -the FTP protocol in a non-interactive manner. - -=back - =head1 EXPORTS I. @@ -2034,7 +2014,7 @@ libnet as of version 1.22_02. Copyright (C) 1995-2004 Graham Barr. All rights reserved. -Copyright (C) 2013-2017, 2020 Steve Hay. All rights reserved. +Copyright (C) 2013-2017, 2020, 2022 Steve Hay. All rights reserved. =head1 LICENCE @@ -2044,11 +2024,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 3.14 +Version 3.15 =head1 DATE -23 Dec 2020 +20 March 2023 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/NNTP.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/NNTP.pm,v diff -u -p -a -u -p -r1.3 NNTP.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/NNTP.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/NNTP.pm 21 Feb 2024 15:47:00 -0000 @@ -19,7 +19,7 @@ use Net::Cmd; use Net::Config; use Time::Local; -our $VERSION = "3.14"; +our $VERSION = "3.15"; # Code for detecting if we can use SSL my $ssl_class = eval { @@ -1308,11 +1308,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 3.14 +Version 3.15 =head1 DATE -23 Dec 2020 +20 March 2023 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/Netrc.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/Netrc.pm,v diff -u -p -a -u -p -r1.3 Netrc.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/Netrc.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/Netrc.pm 21 Feb 2024 15:47:00 -0000 @@ -16,7 +16,7 @@ use warnings; use Carp; use FileHandle; -our $VERSION = "3.14"; +our $VERSION = "3.15"; our $TESTING; @@ -353,11 +353,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 3.14 +Version 3.15 =head1 DATE -23 Dec 2020 +20 March 2023 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/POP3.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/POP3.pm,v diff -u -p -a -u -p -r1.3 POP3.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/POP3.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/POP3.pm 21 Feb 2024 15:47:00 -0000 @@ -18,7 +18,7 @@ use IO::Socket; use Net::Cmd; use Net::Config; -our $VERSION = "3.14"; +our $VERSION = "3.15"; # Code for detecting if we can use SSL my $ssl_class = eval { @@ -869,11 +869,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 3.14 +Version 3.15 =head1 DATE -23 Dec 2020 +20 March 2023 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/SMTP.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/SMTP.pm,v diff -u -p -a -u -p -r1.3 SMTP.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/SMTP.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/SMTP.pm 21 Feb 2024 15:47:00 -0000 @@ -19,7 +19,7 @@ use Net::Cmd; use Net::Config; use Socket; -our $VERSION = "3.14"; +our $VERSION = "3.15"; # Code for detecting if we can use SSL my $ssl_class = eval { @@ -1052,11 +1052,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 3.14 +Version 3.15 =head1 DATE -23 Dec 2020 +20 March 2023 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/Time.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/Time.pm,v diff -u -p -a -u -p -r1.3 Time.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/Time.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/Time.pm 21 Feb 2024 15:47:00 -0000 @@ -22,7 +22,7 @@ use Net::Config; our @ISA = qw(Exporter); our @EXPORT_OK = qw(inet_time inet_daytime); -our $VERSION = "3.14"; +our $VERSION = "3.15"; our $TIMEOUT = 120; @@ -190,11 +190,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 3.14 +Version 3.15 =head1 DATE -23 Dec 2020 +20 March 2023 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/A.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/A.pm,v diff -u -p -a -u -p -r1.3 A.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/A.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/A.pm 21 Feb 2024 15:47:00 -0000 @@ -13,7 +13,7 @@ use Carp; use Net::FTP::dataconn; our @ISA = qw(Net::FTP::dataconn); -our $VERSION = "3.14"; +our $VERSION = "3.15"; our $buf; Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/E.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/E.pm,v diff -u -p -a -u -p -r1.3 E.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/E.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/E.pm 21 Feb 2024 15:47:00 -0000 @@ -8,6 +8,6 @@ use warnings; use Net::FTP::I; our @ISA = qw(Net::FTP::I); -our $VERSION = "3.14"; +our $VERSION = "3.15"; 1; Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm,v diff -u -p -a -u -p -r1.3 I.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/I.pm 21 Feb 2024 15:47:00 -0000 @@ -13,7 +13,7 @@ use Carp; use Net::FTP::dataconn; our @ISA = qw(Net::FTP::dataconn); -our $VERSION = "3.14"; +our $VERSION = "3.15"; our $buf; Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/L.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/L.pm,v diff -u -p -a -u -p -r1.3 L.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/L.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/L.pm 21 Feb 2024 15:47:00 -0000 @@ -8,6 +8,6 @@ use warnings; use Net::FTP::I; our @ISA = qw(Net::FTP::I); -our $VERSION = "3.14"; +our $VERSION = "3.15"; 1; Index: gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm,v diff -u -p -a -u -p -r1.3 dataconn.pm --- gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm 15 Feb 2023 01:36:25 -0000 1.3 +++ gnu/usr.bin/perl/cpan/libnet/lib/Net/FTP/dataconn.pm 21 Feb 2024 15:47:00 -0000 @@ -13,7 +13,7 @@ use Carp; use Errno; use Net::Cmd; -our $VERSION = '3.14'; +our $VERSION = '3.15'; $Net::FTP::IOCLASS or die "please load Net::FTP before Net::FTP::dataconn"; our @ISA = $Net::FTP::IOCLASS; @@ -224,11 +224,11 @@ License or the Artistic License, as spec =head1 VERSION -Version 3.14 +Version 3.15 =head1 DATE -23 Dec 2020 +20 March 2023 =head1 HISTORY Index: gnu/usr.bin/perl/cpan/parent/lib/parent.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/parent/lib/parent.pm,v diff -u -p -a -u -p -r1.5 parent.pm --- gnu/usr.bin/perl/cpan/parent/lib/parent.pm 1 Mar 2021 23:19:51 -0000 1.5 +++ gnu/usr.bin/perl/cpan/parent/lib/parent.pm 21 Feb 2024 15:47:00 -0000 @@ -1,7 +1,7 @@ package parent; use strict; -our $VERSION = '0.238'; +our $VERSION = '0.241'; sub import { my $class = shift; Index: gnu/usr.bin/perl/cpan/parent/t/parent-classfromclassfile.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/parent/t/parent-classfromclassfile.t,v diff -u -p -a -u -p -r1.1.1.1 parent-classfromclassfile.t --- gnu/usr.bin/perl/cpan/parent/t/parent-classfromclassfile.t 24 Sep 2010 14:49:06 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/parent/t/parent-classfromclassfile.t 21 Feb 2024 15:47:00 -0000 @@ -18,4 +18,4 @@ use_ok('parent'); # and does not get treated as a file: eval q{package Test1; require Dummy; use parent -norequire, 'Dummy::InlineChild'; }; is $@, '', "Loading an unadorned class works"; -isn't $INC{"Dummy.pm"}, undef, 'We loaded Dummy.pm'; +isnt $INC{"Dummy.pm"}, undef, 'We loaded Dummy.pm'; Index: gnu/usr.bin/perl/cpan/parent/t/parent-classfromfile.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/parent/t/parent-classfromfile.t,v diff -u -p -a -u -p -r1.1.1.1 parent-classfromfile.t --- gnu/usr.bin/perl/cpan/parent/t/parent-classfromfile.t 24 Sep 2010 14:49:06 -0000 1.1.1.1 +++ gnu/usr.bin/perl/cpan/parent/t/parent-classfromfile.t 21 Feb 2024 15:47:00 -0000 @@ -20,6 +20,6 @@ my $base = './t'; # and does not get treated as a file: eval sprintf q{package Test2; require '%s/lib/Dummy2.plugin'; use parent -norequire, 'Dummy2::InlineChild' }, $base; is $@, '', "Loading a class from a file works"; -isn't $INC{"$base/lib/Dummy2.plugin"}, undef, "We loaded the plugin file"; +isnt $INC{"$base/lib/Dummy2.plugin"}, undef, "We loaded the plugin file"; my $o = bless {}, 'Test2'; isa_ok $o, 'Dummy2::InlineChild'; Index: gnu/usr.bin/perl/cpan/parent/t/parent.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/parent/t/parent.t,v diff -u -p -a -u -p -r1.3 parent.t --- gnu/usr.bin/perl/cpan/parent/t/parent.t 30 Dec 2019 02:13:49 -0000 1.3 +++ gnu/usr.bin/perl/cpan/parent/t/parent.t 21 Feb 2024 15:47:00 -0000 @@ -56,8 +56,8 @@ is( $Eval1::VERSION, '1.01' ); is( $Eval2::VERSION, '1.02' ); -my $expected= q{/^Can't locate reallyReAlLyNotexists.pm in \@INC \(\@INC contains:/}; -$expected= q{/^Can't locate reallyReAlLyNotexists.pm in \@INC \(you may need to install the reallyReAlLyNotexists module\) \(\@INC contains:/} +my $expected= q{/^Can't locate reallyReAlLyNotexists.pm in \@INC \(\@INC[\w ]+:/}; +$expected= q{/^Can't locate reallyReAlLyNotexists.pm in \@INC \(you may need to install the reallyReAlLyNotexists module\) \(\@INC[\w ]+:/} if 5.017005 <= $]; eval q{use parent 'reallyReAlLyNotexists'}; @@ -74,4 +74,3 @@ like( $@, $expected, ' still failing on use parent -norequire, 'Has::Version_0'; ::is( $Has::Version_0::VERSION, 0, '$VERSION==0 preserved' ); } - Index: gnu/usr.bin/perl/cpan/podlators/Makefile.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/podlators/Makefile.PL,v diff -u -p -a -u -p -r1.5 Makefile.PL --- gnu/usr.bin/perl/cpan/podlators/Makefile.PL 1 Mar 2021 23:19:51 -0000 1.5 +++ gnu/usr.bin/perl/cpan/podlators/Makefile.PL 21 Feb 2024 15:47:00 -0000 @@ -4,7 +4,7 @@ # which only supports that build method, and because it is a dependency of # other build systems like Module::Build. # -# Copyright 1999-2001, 2008, 2010, 2012, 2014-2016, 2018-2019 +# Copyright 1999-2001, 2008, 2010, 2012, 2014-2016, 2018-2019, 2022 # Russ Allbery # # This program is free software; you may redistribute it and/or modify it @@ -30,7 +30,7 @@ sub dist_version { open(my $fh, '<', File::Spec->catfile('lib', 'Pod', 'Man.pm')) or die "$0: cannot open lib/Pod/Man.pm: $!\n"; while (defined(my $line = <$fh>)) { - if ($line =~ m{ \A \$VERSION \s+ = \s+ '([^\']+)' }xms) { + if ($line =~ m{ \A (?:our \s+)? \$VERSION \s+ = \s+ '([^\']+)' }xms) { close($fh) or die "$0: cannot close lib/Pod/Man.pm\n"; return $1; } @@ -81,7 +81,8 @@ sub man1pod { # The hash of all the metadata. This will be modified before WriteMakefile to # remove keys not supported by the local version of ExtUtils::MakeMaker. my $dist_version = dist_version(); -my %metadata = ( +my %metadata = ( + #<<< NAME => 'Pod', DISTNAME => 'podlators', ABSTRACT => 'Convert POD data to various other formats', @@ -89,7 +90,8 @@ my %metadata = ( LICENSE => 'perl_5', EXE_FILES => [scripts('pod2text', 'pod2man')], VERSION_FROM => 'lib/Pod/Man.pm', - MIN_PERL_VERSION => '5.008', + MIN_PERL_VERSION => '5.010', + #>>> # Use *.PL files to generate the driver scripts so that we get the correct # invocation of Perl on non-UNIX platforms. @@ -107,11 +109,11 @@ my %metadata = ( }, # Clean some additional files. - clean => { FILES => File::Spec->catdir('t', 'tmp') }, + clean => { FILES => File::Spec->catdir('t', 'tmp') }, realclean => { FILES => scalar(scripts('pod2text', 'pod2man')) }, # Dependencies on other modules. - PREREQ_PM => { 'Pod::Simple' => 3.06 }, + PREREQ_PM => { 'Pod::Simple' => 3.26 }, # Older versions of ExtUtils::MakeMaker don't pick up nested test # directories by default. @@ -125,41 +127,40 @@ my %metadata = ( # Additional metadata. META_ADD => { 'meta-spec' => { version => 2 }, - provides => { + provides => { 'Pod::Man' => { - file => 'lib/Pod/Man.pm', + file => 'lib/Pod/Man.pm', version => $dist_version, }, 'Pod::ParseLink' => { - file => 'lib/Pod/ParseLink.pm', + file => 'lib/Pod/ParseLink.pm', version => $dist_version, }, 'Pod::Text' => { - file => 'lib/Pod/Text.pm', + file => 'lib/Pod/Text.pm', version => $dist_version, }, 'Pod::Text::Color' => { - file => 'lib/Pod/Text/Color.pm', + file => 'lib/Pod/Text/Color.pm', version => $dist_version, }, 'Pod::Text::Overstrike' => { - file => 'lib/Pod/Text/Overstrike.pm', + file => 'lib/Pod/Text/Overstrike.pm', version => $dist_version, }, 'Pod::Text::Termcap' => { - file => 'lib/Pod/Text/Termcap.pm', + file => 'lib/Pod/Text/Termcap.pm', version => $dist_version, }, }, resources => { bugtracker => { - mailto => 'bug-podlators@rt.cpan.org', - web => 'https://rt.cpan.org/Dist/Display.html?Name=podlators', + web => 'https://github.com/rra/podlators/issues', }, - homepage => 'https://www.eyrie.org/~eagle/software/podlators/', + homepage => 'https://www.eyrie.org/~eagle/software/podlators/', repository => { - url => 'https://github.com/rra/podlators.git', - web => 'https://github.com/rra/podlators', + url => 'https://github.com/rra/podlators.git', + web => 'https://github.com/rra/podlators', type => 'git', }, }, @@ -169,8 +170,8 @@ my %metadata = ( # Remove keys that aren't supported by this version of ExtUtils::MakeMaker. # This hash maps keys to the minimum supported version. my %supported = ( - LICENSE => 6.31, - META_ADD => 6.46, + LICENSE => 6.31, + META_ADD => 6.46, MIN_PERL_VERSION => 6.48, ); for my $key (keys(%supported)) { Index: gnu/usr.bin/perl/cpan/podlators/docs/docknot.yaml =================================================================== RCS file: gnu/usr.bin/perl/cpan/podlators/docs/docknot.yaml diff -N gnu/usr.bin/perl/cpan/podlators/docs/docknot.yaml --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/cpan/podlators/docs/docknot.yaml 21 Feb 2024 15:47:00 -0000 @@ -0,0 +1,145 @@ +# Package metadata for podlators. +# +# This file contains configuration for DocKnot used to generate +# documentation files (like README.md) and web pages. Other documentation +# in this package is generated automatically from these files as part of +# the release process. For more information, see DocKnot's documentation. +# +# DocKnot is available from . +# +# Copyright 1999-2010, 2012-2022 Russ Allbery +# +# SPDX-License-Identifier: MIT + +format: v1 + +name: podlators +maintainer: Russ Allbery +version: '5.01' +synopsis: format POD source into various output formats + +license: + name: Perl +copyrights: + - holder: Russ Allbery + years: 1999-2010, 2012-2022 + +build: + type: ExtUtils::MakeMaker +distribution: + cpan: podlators + section: perl + tarname: podlators + version: podlators +support: + email: rra@cpan.org + github: rra/podlators + web: https://www.eyrie.org/~eagle/software/podlators/ +vcs: + browse: https://git.eyrie.org/?p=perl/podlators.git + github: rra/podlators + openhub: https://www.openhub.net/p/podlators + status: + workflow: build + type: Git + url: https://git.eyrie.org/git/perl/podlators.git + +quote: + author: Robert Fripp + text: | + We move from making unnecessary efforts, the exertions of force, to making + necessary efforts: the direction of effortlessness. In this the prime + maxim is: honor necessity, honor sufficiency. + work: '"The Road to Graceland"' +docs: + api: + - name: pod-man + title: Pod::Man + - name: pod-text + title: Pod::Text + - name: pod-text-color + title: Pod::Text::Color + - name: pod-text-overstrike + title: Pod::Text::Overstrike + - name: pod-text-termcap + title: Pod::Text::Termcap + developer: + - name: todo + title: To-do list + user: + - name: perlpodstyle + title: POD style guide + - name: pod2man + title: pod2man documentation + - name: pod2text + title: pod2text documentation + - name: thanks + title: Thanks and credits + +blurb: | + podlators contains Pod::Man and Pod::Text modules which convert POD input to + *roff source output, suitable for man pages, or plain text. It also + includes several subclasses of Pod::Text for formatted output to terminals + with various capabilities. It is the source package for the Pod::Man and + Pod::Text modules included with Perl. + +description: | + POD is the Plain Old Documentation format, the documentation language used + for all of Perl's documentation. I learned it to document Perl modules, + started using it for Perl scripts as well, and discovered it was the most + convenient way I've found to write program documentation. It's extremely + simple, well-designed for writing Unix manual pages (and I'm a + traditionalist who thinks that any program should have a regular manual + page), and easily readable in the raw format by humans. + + The translators into text and nroff (for manual pages) included in the Perl + distribution had various bugs, however, and used their own ad hoc parsers, + so when I started running into those bugs and when a new generic parser + (Pod::Parser) was written, I decided to rewrite the two translators that I + use the most and fix the bugs that were bothering me. This package is the + result. + + podlators contains two main modules, Pod::Man and Pod::Text. The former + converts POD into nroff/troff source and the latter into plain text (with + various options controlling some of the formatting). There are also several + subclasses of Pod::Text for generating slightly formatted text using color + or other terminal control escapes, and a general utility module, + Pod::ParseLink, for parsing the POD `L<>` formatting sequences. Also + included in this package are the `pod2text` and `pod2man` driver scripts. + + Both Pod::Text and Pod::Man provide a variety of options for fine-tuning + their output. Pod::Man also tries to massage input text where appropriate + to produce better output when run through nroff or troff, such as + distinguishing between different types of hyphens. + + As of Perl 5.6.0, my implementation was included in Perl core, and each + release of Perl will have the at-the-time most current version of podlators + included. You therefore only need to install this package yourself if you + need a newer version than came with Perl (to get some bug fixes, for + example). + +requirements: | + This module requires Perl 5.10 or later and Pod::Simple 3.26 or later. + (Pod::Simple 3.26 was included in Perl 5.17.10.) + + The troff/nroff generated by Pod::Man should be compatible with any troff or + nroff implementation with the `-man` macro set, including mandoc. It is + primarily tested by me under GNU groff, but Perl users send bug reports for + a wide variety of implementations and Pod::Man is used to generate all of + Perl's own manual pages, so hopefully most of the bugs have been weeded out. + +test: + lancaster: true + suffix: | + The following additional Perl modules will be used by the test suite if + present: + + * Test::CPAN::Changes (part of CPAN-Changes) + * Test::MinimumVersion + * Test::Pod + * Test::Spelling + * Test::Strict + * Test::Synopsis + + All are available on CPAN. Those tests will be skipped if the modules are + not available. Index: gnu/usr.bin/perl/cpan/podlators/lib/Pod/Man.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/podlators/lib/Pod/Man.pm,v diff -u -p -a -u -p -r1.22 Man.pm --- gnu/usr.bin/perl/cpan/podlators/lib/Pod/Man.pm 15 Feb 2023 01:38:22 -0000 1.22 +++ gnu/usr.bin/perl/cpan/podlators/lib/Pod/Man.pm 21 Feb 2024 15:47:00 -0000 @@ -14,36 +14,33 @@ package Pod::Man; -use 5.008; +use 5.010; use strict; use warnings; -use subs qw(makespace); -use vars qw(@ISA %ESCAPES $PREAMBLE $VERSION); - use Carp qw(carp croak); use Pod::Simple (); # Conditionally import Encode and set $HAS_ENCODE if it is available. This is # required to support building as part of Perl core, since podlators is built # before Encode is. -our $HAS_ENCODE; +my $HAS_ENCODE; BEGIN { $HAS_ENCODE = eval { require Encode }; } -@ISA = qw(Pod::Simple); - -$VERSION = '4.14'; +our @ISA = qw(Pod::Simple); +our $VERSION = '5.01'; -# Set the debugging level. If someone has inserted a debug function into this -# class already, use that. Otherwise, use any Pod::Simple debug function -# that's defined, and failing that, define a debug level of 10. -BEGIN { - my $parent = defined (&Pod::Simple::DEBUG) ? \&Pod::Simple::DEBUG : undef; - unless (defined &DEBUG) { - *DEBUG = $parent || sub () { 10 }; - } +# Ensure that $Pod::Simple::nbsp and $Pod::Simple::shy are available. Code +# taken from Pod::Simple 3.32, but was only added in 3.30. +my ($NBSP, $SHY); +if ($Pod::Simple::VERSION ge 3.30) { + $NBSP = $Pod::Simple::nbsp; + $SHY = $Pod::Simple::shy; +} else { + $NBSP = chr utf8::unicode_to_native(0xA0); + $SHY = chr utf8::unicode_to_native(0xAD); } # Import the ASCII constant from Pod::Simple. This is true iff we're in an @@ -51,15 +48,12 @@ BEGIN { # generally only false for EBCDIC. BEGIN { *ASCII = \&Pod::Simple::ASCII } -# Pretty-print a data structure. Only used for debugging. -BEGIN { *pretty = \&Pod::Simple::pretty } - # Formatting instructions for various types of blocks. cleanup makes hyphens # hard, adds spaces between consecutive underscores, and escapes backslashes. # convert translates characters into escapes. guesswork means to apply the -# transformations done by the guesswork sub. literal says to protect literal -# quotes from being turned into UTF-8 quotes. By default, all transformations -# are on except literal, but some elements override. +# transformations done by the guesswork sub (if enabled). literal says to +# protect literal quotes from being turned into UTF-8 quotes. By default, all +# transformations are on except literal, but some elements override. # # DEFAULT specifies the default settings. All other elements should list only # those settings that they are overriding. Data indicates =for roff blocks, @@ -75,6 +69,98 @@ my %FORMATTING = ( X => { cleanup => 0, guesswork => 0 }, ); +# Try to map an encoding as understood by Perl Encode to an encoding +# understood by groff's preconv. Encode doesn't care about hyphens or +# capitalization, but preconv does. The key is the canonicalized Encode +# encoding, and the value is something preconv might understand. +# +# FreeBSD mandoc only understands utf-8 and iso-latin-1 as of 2022-09-24. +# groff preconv prefers iso-8859-1, but also understands iso-latin-1, so +# convert ISO-8859-1 to iso-latin-1 for FreeBSD. +my %ENCODINGS = ( + ascii => 'us-ascii', + big5 => 'big5', + big5eten => 'big5', + cp950 => 'big5', + cp1047 => 'cp1047', + euccn => 'gb2312', + eucjp => 'euc-jp', + euckr => 'euc-kr', + gb2312 => 'gb2312', + gb2312raw => 'gb2312', + iso88591 => 'iso-latin-1', + iso88592 => 'iso-8859-2', + iso88595 => 'iso-8859-5', + iso88597 => 'iso-8859-7', + iso88599 => 'iso-8859-9', + iso885913 => 'iso-8859-13', + iso885915 => 'iso-8859-15', + koi8r => 'koi8-r', + latin1 => 'iso-8859-1', + usascii => 'us-ascii', + utf8 => 'utf-8', + utf16 => 'utf-16', + utf16be => 'utf-16be', + utf16le => 'utf-16le', +); + +############################################################################## +# Translation tables +############################################################################## + +# The following table is adapted from Tom Christiansen's pod2man. It is only +# used with roff output. It assumes that the standard preamble has already +# been printed, since that's what defines all of the accent marks. We really +# want to do something better than this when *roff actually supports other +# character sets itself, since these results are pretty poor. +# +# This only works in an ASCII world. What to do in a non-ASCII world is very +# unclear, so we just output what we get and hope for the best. +my %ESCAPES; +@ESCAPES{0xA0 .. 0xFF} = ( + $NBSP, undef, undef, undef, undef, undef, undef, undef, + undef, undef, undef, undef, undef, $SHY, undef, undef, + + undef, undef, undef, undef, undef, undef, undef, undef, + undef, undef, undef, undef, undef, undef, undef, undef, + + "A\\*`", "A\\*'", "A\\*^", "A\\*~", "A\\*:", "A\\*o", "\\*(Ae", "C\\*,", + "E\\*`", "E\\*'", "E\\*^", "E\\*:", "I\\*`", "I\\*'", "I\\*^", "I\\*:", + + "\\*(D-", "N\\*~", "O\\*`", "O\\*'", "O\\*^", "O\\*~", "O\\*:", undef, + "O\\*/", "U\\*`", "U\\*'", "U\\*^", "U\\*:", "Y\\*'", "\\*(Th", "\\*8", + + "a\\*`", "a\\*'", "a\\*^", "a\\*~", "a\\*:", "a\\*o", "\\*(ae", "c\\*,", + "e\\*`", "e\\*'", "e\\*^", "e\\*:", "i\\*`", "i\\*'", "i\\*^", "i\\*:", + + "\\*(d-", "n\\*~", "o\\*`", "o\\*'", "o\\*^", "o\\*~", "o\\*:", undef, + "o\\*/" , "u\\*`", "u\\*'", "u\\*^", "u\\*:", "y\\*'", "\\*(th", "y\\*:", +) if ASCII; + +############################################################################## +# Utility functions +############################################################################## + +# Quote an argument to a macro. +# +# $arg - Intended argument to the macro +# +# Returns: $arg suitably escaped and quoted +sub _quote_macro_argument { + my ($arg) = @_; + if (length($arg) > 0 && $arg !~ m{ [\s\"] }xms) { + return $arg; + } + $arg =~ s{ \" }{""}xmsg; + return qq("$arg"); +} + +# Returns whether the given encoding needs a call to Encode::encode. +sub _needs_encode { + my ($encoding) = @_; + return $encoding ne 'roff' && $encoding ne 'groff'; +} + ############################################################################## # Object initialization ############################################################################## @@ -88,9 +174,6 @@ sub new { my $class = shift; my $self = $class->SUPER::new; - # Tell Pod::Simple not to handle S<> by automatically inserting  . - $self->nbsp_for_S (1); - # Tell Pod::Simple to keep whitespace whenever possible. if (my $preserve_whitespace = $self->can ('preserve_whitespace')) { $self->$preserve_whitespace (1); @@ -109,63 +192,84 @@ sub new { # to put them in our object as hash keys and values. This could cause # problems if we ever clash with Pod::Simple's own internal class # variables. - %$self = (%$self, @_); + my %opts = @_; + my @opts = map { ("opt_$_", $opts{$_}) } keys %opts; + %$self = (%$self, @opts); + + # Pod::Simple uses encoding internally, so we need to store it as + # ENCODING. Set the default to UTF-8 if not specified. + # + # Degrade to the old roff encoding if Encode is not available. + # + # Suppress the warning message when PERL_CORE is set, indicating this is + # running as part of the core Perl build. Perl builds podlators (and all + # pure Perl modules) before Encode and other XS modules, so Encode won't + # yet be available. Rely on the Perl core build to generate man pages + # later, after all the modules are available, so that UTF-8 handling will + # be correct. + my %options = @_; + if (defined $self->{opt_encoding}) { + $$self{ENCODING} = $self->{opt_encoding}; + } elsif (ASCII) { + $$self{ENCODING} = 'UTF-8'; + } else { + $$self{ENCODING} = 'groff'; + } + if (_needs_encode($$self{ENCODING}) && !$HAS_ENCODE) { + if (!$ENV{PERL_CORE}) { + carp ('encoding requested but Encode module not available,' + . ' falling back to groff escapes'); + } + $$self{ENCODING} = 'groff'; + } # Send errors to stderr if requested. - if ($$self{stderr} and not $$self{errors}) { - $$self{errors} = 'stderr'; + if ($self->{opt_stderr} and not $self->{opt_errors}) { + $self->{opt_errors} = 'stderr'; } - delete $$self{stderr}; + delete $self->{opt_stderr}; # Validate the errors parameter and act on it. - if (not defined $$self{errors}) { - $$self{errors} = 'pod'; - } - if ($$self{errors} eq 'stderr' || $$self{errors} eq 'die') { + $self->{opt_errors} //= 'pod'; + if ($self->{opt_errors} eq 'stderr' || $self->{opt_errors} eq 'die') { $self->no_errata_section (1); $self->complain_stderr (1); - if ($$self{errors} eq 'die') { - $$self{complain_die} = 1; + if ($self->{opt_errors} eq 'die') { + $self->{complain_die} = 1; } - } elsif ($$self{errors} eq 'pod') { + } elsif ($self->{opt_errors} eq 'pod') { $self->no_errata_section (0); $self->complain_stderr (0); - } elsif ($$self{errors} eq 'none') { + } elsif ($self->{opt_errors} eq 'none') { $self->no_errata_section (1); $self->no_whining (1); } else { - croak (qq(Invalid errors setting: "$$self{errors}")); - } - delete $$self{errors}; - - # Degrade back to non-utf8 if Encode is not available. - # - # Suppress the warning message when PERL_CORE is set, indicating this is - # running as part of the core Perl build. Perl builds podlators (and all - # pure Perl modules) before Encode and other XS modules, so Encode won't - # yet be available. Rely on the Perl core build to generate man pages - # later, after all the modules are available, so that UTF-8 handling will - # be correct. - if ($$self{utf8} and !$HAS_ENCODE) { - if (!$ENV{PERL_CORE}) { - carp ('utf8 mode requested but Encode module not available,' - . ' falling back to non-utf8'); - } - delete $$self{utf8}; + croak (qq(Invalid errors setting: "$self->{opt_errors}")); } + delete $self->{opt_errors}; # Initialize various other internal constants based on our arguments. $self->init_fonts; $self->init_quotes; $self->init_page; - # For right now, default to turning on all of the magic. - $$self{MAGIC_CPP} = 1; - $$self{MAGIC_EMDASH} = 1; - $$self{MAGIC_FUNC} = 1; - $$self{MAGIC_MANREF} = 1; - $$self{MAGIC_SMALLCAPS} = 1; - $$self{MAGIC_VARS} = 1; + # Configure guesswork based on options. + my $guesswork = $self->{opt_guesswork} || q{}; + my %guesswork = map { $_ => 1 } split(m{,}xms, $guesswork); + if (!%guesswork || $guesswork{all}) { + #<<< + $$self{GUESSWORK} = { + functions => 1, + manref => 1, + quoting => 1, + variables => 1, + }; + #>>> + } elsif ($guesswork{none}) { + $$self{GUESSWORK} = {}; + } else { + $$self{GUESSWORK} = {%guesswork}; + } return $self; } @@ -182,29 +286,41 @@ sub init_fonts { # Figure out the fixed-width font. If user-supplied, make sure that they # are the right length. - for (qw/fixed fixedbold fixeditalic fixedbolditalic/) { - my $font = $$self{$_}; - if (defined ($font) && (length ($font) < 1 || length ($font) > 2)) { - croak qq(roff font should be 1 or 2 chars, not "$font"); + for (qw(fixed fixedbold fixeditalic fixedbolditalic)) { + my $font = $self->{"opt_$_"}; + if (defined($font) && (length($font) < 1 || length($font) > 2)) { + croak(qq(roff font should be 1 or 2 chars, not "$font")); } } # Set the default fonts. We can't be sure portably across different # implementations what fixed bold-italic may be called (if it's even # available), so default to just bold. - $$self{fixed} ||= 'CW'; - $$self{fixedbold} ||= 'CB'; - $$self{fixeditalic} ||= 'CI'; - $$self{fixedbolditalic} ||= 'CB'; + #<<< + $self->{opt_fixed} ||= 'CW'; + $self->{opt_fixedbold} ||= 'CB'; + $self->{opt_fixeditalic} ||= 'CI'; + $self->{opt_fixedbolditalic} ||= 'CB'; + #>>> # Set up a table of font escapes. First number is fixed-width, second is # bold, third is italic. - $$self{FONTS} = { '000' => '\fR', '001' => '\fI', - '010' => '\fB', '011' => '\f(BI', - '100' => toescape ($$self{fixed}), - '101' => toescape ($$self{fixeditalic}), - '110' => toescape ($$self{fixedbold}), - '111' => toescape ($$self{fixedbolditalic}) }; + $self->{FONTS} = { + '000' => '\fR', + '001' => '\fI', + '010' => '\fB', + '011' => '\f(BI', + '100' => toescape($self->{opt_fixed}), + '101' => toescape($self->{opt_fixeditalic}), + '110' => toescape($self->{opt_fixedbold}), + '111' => toescape($self->{opt_fixedbolditalic}), + }; + + # Precalculate a regex that matches all fixed-width fonts, which will be + # used later by switchquotes. + my @fixedpat = map { quotemeta($self->{FONTS}{$_}) } qw(100 101 110 111); + my $fixedpat = join('|', @fixedpat); + $self->{FIXEDPAT} = qr{ $fixedpat }xms; } # Initialize the quotes that we'll be using for C<> text. This requires some @@ -215,32 +331,28 @@ sub init_quotes { my ($self) = (@_); # Handle the quotes option first, which sets both quotes at once. - $$self{quotes} ||= '"'; - if ($$self{quotes} eq 'none') { + $self->{opt_quotes} ||= '"'; + if ($self->{opt_quotes} eq 'none') { $$self{LQUOTE} = $$self{RQUOTE} = ''; - } elsif (length ($$self{quotes}) == 1) { - $$self{LQUOTE} = $$self{RQUOTE} = $$self{quotes}; - } elsif (length ($$self{quotes}) % 2 == 0) { - my $length = length ($$self{quotes}) / 2; - $$self{LQUOTE} = substr ($$self{quotes}, 0, $length); - $$self{RQUOTE} = substr ($$self{quotes}, $length); + } elsif (length ($self->{opt_quotes}) == 1) { + $$self{LQUOTE} = $$self{RQUOTE} = $self->{opt_quotes}; + } elsif (length ($self->{opt_quotes}) % 2 == 0) { + my $length = length ($self->{opt_quotes}) / 2; + $$self{LQUOTE} = substr ($self->{opt_quotes}, 0, $length); + $$self{RQUOTE} = substr ($self->{opt_quotes}, $length); } else { - croak(qq(Invalid quote specification "$$self{quotes}")) + croak(qq(Invalid quote specification "$self->{opt_quotes}")) } # Now handle the lquote and rquote options. - if (defined $$self{lquote}) { - $$self{LQUOTE} = $$self{lquote} eq 'none' ? q{} : $$self{lquote}; + if (defined($self->{opt_lquote})) { + $self->{opt_lquote} = q{} if $self->{opt_lquote} eq 'none'; + $$self{LQUOTE} = $self->{opt_lquote}; + } + if (defined $self->{opt_rquote}) { + $self->{opt_rquote} = q{} if $self->{opt_rquote} eq 'none'; + $$self{RQUOTE} = $self->{opt_rquote}; } - if (defined $$self{rquote}) { - $$self{RQUOTE} = $$self{rquote} eq 'none' ? q{} : $$self{rquote}; - } - - # Double the first quote; note that this should not be s///g as two double - # quotes is represented in *roff as three double quotes, not four. Weird, - # I know. - $$self{LQUOTE} =~ s/\"/\"\"/; - $$self{RQUOTE} =~ s/\"/\"\"/; } # Initialize the page title information and indentation from our arguments. @@ -254,17 +366,9 @@ sub init_page { # Set the defaults for page titles and indentation if the user didn't # override anything. - $$self{center} = 'User Contributed Perl Documentation' - unless defined $$self{center}; - $$self{release} = 'perl v' . $version - unless defined $$self{release}; - $$self{indent} = 4 - unless defined $$self{indent}; - - # Double quotes in things that will be quoted. - for (qw/center release/) { - $$self{$_} =~ s/\"/\"\"/g if $$self{$_}; - } + $self->{opt_center} //= 'User Contributed Perl Documentation'; + $self->{opt_release} //= 'perl v' . $version; + $self->{opt_indent} //= 4; } ############################################################################## @@ -289,7 +393,6 @@ sub init_page { # according to the current formatting instructions as we do. sub _handle_text { my ($self, $text) = @_; - DEBUG > 3 and print "== $text\n"; my $tag = $$self{PENDING}[-1]; $$tag[2] .= $self->format_text ($$tag[1], $text); } @@ -308,7 +411,6 @@ sub method_for_element { # text and nested elements. Otherwise, if start_element is defined, call it. sub _handle_element_start { my ($self, $element, $attrs) = @_; - DEBUG > 3 and print "++ $element (<", join ('> <', %$attrs), ">)\n"; my $method = $self->method_for_element ($element); # If we have a command handler, we need to accumulate the contents of the @@ -316,7 +418,6 @@ sub _handle_element_start { # and the formatting codes so that IN_NAME isn't still set for the # first heading after the NAME heading. if ($self->can ("cmd_$method")) { - DEBUG > 2 and print "<$element> starts saving a tag\n"; $$self{IN_NAME} = 0 if ($element ne 'Para' && length ($element) > 1); # How we're going to format embedded text blocks depends on the tag @@ -328,11 +429,8 @@ sub _handle_element_start { %{ $FORMATTING{$element} || {} }, }; push (@{ $$self{PENDING} }, [ $attrs, $formatting, '' ]); - DEBUG > 4 and print "Pending: [", pretty ($$self{PENDING}), "]\n"; } elsif (my $start_method = $self->can ("start_$method")) { $self->$start_method ($attrs, ''); - } else { - DEBUG > 2 and print "No $method start method, skipping\n"; } } @@ -341,16 +439,12 @@ sub _handle_element_start { # an end_ method for the element, call that. sub _handle_element_end { my ($self, $element) = @_; - DEBUG > 3 and print "-- $element\n"; my $method = $self->method_for_element ($element); # If we have a command handler, pull off the pending text and pass it to # the handler along with the saved attribute hash. if (my $cmd_method = $self->can ("cmd_$method")) { - DEBUG > 2 and print " stops saving a tag\n"; my $tag = pop @{ $$self{PENDING} }; - DEBUG > 4 and print "Popped: [", pretty ($tag), "]\n"; - DEBUG > 4 and print "Pending: [", pretty ($$self{PENDING}), "]\n"; my $text = $self->$cmd_method ($$tag[0], $$tag[2]); if (defined $text) { if (@{ $$self{PENDING} } > 1) { @@ -361,8 +455,6 @@ sub _handle_element_end { } } elsif (my $end_method = $self->can ("end_$method")) { $self->$end_method (); - } else { - DEBUG > 2 and print "No $method end method, skipping\n"; } } @@ -381,31 +473,40 @@ sub format_text { my $literal = $$options{literal}; # Cleanup just tidies up a few things, telling *roff that the hyphens are - # hard, putting a bit of space between consecutive underscores, and - # escaping backslashes. Be careful not to mangle our character - # translations by doing this before processing character translation. + # hard, putting a bit of space between consecutive underscores, escaping + # backslashes, and converting zero-width spaces to zero-width break + # points. if ($cleanup) { $text =~ s/\\/\\e/g; $text =~ s/-/\\-/g; $text =~ s/_(?=_)/_\\|/g; + $text =~ s/\x{200B}/\\:/g; } - # Normally we do character translation, but we won't even do that in - # blocks or if UTF-8 output is desired. - if ($convert && !$$self{utf8} && ASCII) { - $text =~ s/([^\x00-\x7F])/$ESCAPES{ord ($1)} || "X"/eg; + # Except in blocks, if groff or roff encoding is requested and + # we're in an ASCII environment, do the encoding. For EBCDIC, we just + # write what we get and hope for the best. Leave non-breaking spaces and + # soft hyphens alone; we'll convert those at the last minute. + if ($convert) { + if (ASCII) { + if ($$self{ENCODING} eq 'groff') { + $text =~ s{ ([^\x00-\x7F\xA0\xAD]) }{ + '\\[u' . sprintf('%04X', ord($1)) . ']' + }xmsge; + } elsif ($$self{ENCODING} eq 'roff') { + $text =~ s/([^\x00-\x7F\xA0\xAD])/$ESCAPES{ord ($1)} || "X"/eg; + } + } } # Ensure that *roff doesn't convert literal quotes to UTF-8 single quotes, - # but don't mess up our accept escapes. + # but don't mess up accent escapes. if ($literal) { $text =~ s/(?guesswork ($text); } @@ -420,31 +521,45 @@ sub quote_literal { my $self = shift; local $_ = shift; + # If in NAME section, just return an ASCII quoted string to avoid + # confusing tools like whatis. + if ($$self{IN_NAME}) { + return $self->{LQUOTE} . $_ . $self->{RQUOTE}; + } + # A regex that matches the portion of a variable reference that's the # array or hash index, separated out just because we want to use it in # several places in the following regex. - my $index = '(?: \[.*\] | \{.*\} )?'; - - # If in NAME section, just return an ASCII quoted string to avoid - # confusing tools like whatis. - return qq{"$_"} if $$self{IN_NAME}; + my $index = '(?: \[[^]]+\] | \{[^}]+\} )?'; # Check for things that we don't want to quote, and if we find any of # them, return the string with just a font change and no quoting. + # + # Traditionally, Pod::Man has not quoted Perl variables, functions, + # numbers, or hex constants, but this is not always desirable. Make this + # optional on the quoting guesswork flag. + my $extra = qr{(?!)}xms; # never matches + if ($$self{GUESSWORK}{quoting}) { + $extra = qr{ + \$+ [\#^]? \S $index # special ($^F, $") + | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func + | [\$\@%&*]* [:\'\w]+ + (?: \\-> )? \(\s*[^\s,\)]*\s*\) # 0/1-arg func call + | (?: [+] || \\- )? ( \d[\d.]* | \.\d+ ) + (?: [eE] (?: [+] || \\- )? \d+ )? # a number + | 0x [a-fA-F\d]+ # a hex constant + }xms; + } m{ ^\s* (?: - ( [\'\`\"] ) .* \1 # already quoted - | \\\*\(Aq .* \\\*\(Aq # quoted and escaped - | \\?\` .* ( \' | \\\*\(Aq ) # `quoted' - | \$+ [\#^]? \S $index # special ($^Foo, $") - | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func - | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call - | [-+]? ( \d[\d.]* | \.\d+ ) (?: [eE][-+]?\d+ )? # a number - | 0x [a-fA-F\d]+ # a hex constant + ( [\'\"] ) .* \1 # already quoted + | \\\*\(Aq .* \\\*\(Aq # quoted and escaped + | \\?\` .* ( \' | \\?\` | \\\*\(Aq ) # `quoted' or `quoted` + | $extra ) \s*\z - }xso and return '\f(FS' . $_ . '\f(FE'; + }xms and return '\f(FS' . $_ . '\f(FE'; # If we didn't return, go ahead and quote the text. return '\f(FS\*(C`' . $_ . "\\*(C'\\f(FE"; @@ -453,10 +568,8 @@ sub quote_literal { # Takes a text block to perform guesswork on. Returns the text block with # formatting codes added. This is the code that marks up various Perl # constructs and things commonly used in man pages without requiring the user -# to add any explicit markup, and is applied to all non-literal text. We're -# guaranteed that the text we're applying guesswork to does not contain any -# *roff formatting codes. Note that the inserted font sequences must be -# treated later with mapfonts or textmapfonts. +# to add any explicit markup, and is applied to all non-literal text. Note +# that the inserted font sequences must be treated later with mapfonts. # # This method is very fragile, both in the regular expressions it uses and in # the ordering of those modifications. Care and testing is required when @@ -464,7 +577,6 @@ sub quote_literal { sub guesswork { my $self = shift; local $_ = shift; - DEBUG > 5 and print " Guesswork called on [$_]\n"; # By the time we reach this point, all hyphens will be escaped by adding a # backslash. We want to undo that escaping if they're part of regular @@ -475,9 +587,9 @@ sub guesswork { # Note that this is not user-controllable; we pretty much have to do this # transformation or *roff will mangle the output in unacceptable ways. s{ - ( (?:\G|^|\s) [\(\"]* [a-zA-Z] ) ( \\- )? + ( (?:\G|^|\s|$NBSP) [\(\"]* [a-zA-Z] ) ( \\- )? ( (?: [a-zA-Z\']+ \\-)+ ) - ( [a-zA-Z\']+ ) (?= [\)\".?!,;:]* (?:\s|\Z|\\\ ) ) + ( [a-zA-Z\']+ ) (?= [\)\".?!,;:]* (?:\s|$NBSP|\Z|\\\ ) ) \b } { my ($prefix, $hyphen, $main, $suffix) = ($1, $2, $3, $4); @@ -486,52 +598,17 @@ sub guesswork { $prefix . $hyphen . $main . $suffix; }egx; - # Translate "--" into a real em-dash if it's used like one. This means - # that it's either surrounded by whitespace, it follows a regular word, or - # it occurs between two regular words. - if ($$self{MAGIC_EMDASH}) { - s{ (\s) \\-\\- (\s) } { $1 . '\*(--' . $2 }egx; - s{ (\b[a-zA-Z]+) \\-\\- (\s|\Z|[a-zA-Z]+\b) } { $1 . '\*(--' . $2 }egx; - } - - # Make words in all-caps a little bit smaller; they look better that way. - # However, we don't want to change Perl code (like @ARGV), nor do we want - # to fix the MIME in MIME-Version since it looks weird with the - # full-height V. - # - # We change only a string of all caps (2) either at the beginning of the - # line or following regular punctuation (like quotes) or whitespace (1), - # and followed by either similar punctuation, an em-dash, or the end of - # the line (3). - # - # Allow the text we're changing to small caps to include double quotes, - # commas, newlines, and periods as long as it doesn't otherwise interrupt - # the string of small caps and still fits the criteria. This lets us turn - # entire warranty disclaimers in man page output into small caps. - if ($$self{MAGIC_SMALLCAPS}) { - s{ - ( ^ | [\s\(\"\'\`\[\{<>] | \\[ ] ) # (1) - ( [A-Z] [A-Z] (?: \s? [/A-Z+:\d_\$&] | \\- | \s? [.,\"] )* ) # (2) - (?= [\s>\}\]\(\)\'\".?!,;] | \\*\(-- | \\[ ] | $ ) # (3) - } { - $1 . '\s-1' . $2 . '\s0' - }egx; - } - - # Note that from this point forward, we have to adjust for \s-1 and \s-0 - # strings inserted around things that we've made small-caps if later - # transforms should work on those strings. - # Embolden functions in the form func(), including functions that are in - # all capitals, but don't embolden if there's anything between the parens. + # all capitals, but don't embolden if there's anything inside the parens. # The function must start with an alphabetic character or underscore and # then consist of word characters or colons. - if ($$self{MAGIC_FUNC}) { + if ($$self{GUESSWORK}{functions}) { s{ - ( \b | \\s-1 ) - ( [A-Za-z_] ([:\w] | \\s-?[01])+ \(\) ) + (? 5 and print " Guesswork returning [$_]\n"; return $_; } @@ -592,111 +657,106 @@ sub guesswork { # the right start and end codes. # # We add this level of complexity because the old pod2man didn't get code like -# B else> right; after I<> it switched back to normal text rather -# than bold. We take care of this by using variables that state whether bold, -# italic, or fixed are turned on as a combined pointer to our current font -# sequence, and set each to the number of current nestings of start tags for -# that font. +# B<< someI else>> right. After I<> it switched back to normal text +# rather than bold. We take care of this by using variables that state +# whether bold, italic, or fixed are turned on as a combined pointer to our +# current font sequence, and set each to the number of current nestings of +# start tags for that font. +# +# The base font must be either \fP or \fR. \fP changes to the previous font, +# but only one previous font is kept. Unfortunately, there is a bug in +# Solaris 2.6 nroff (not present in GNU groff) where the sequence +# \fB\fP\f(CW\fP leaves the font set to B rather than R, presumably because +# \f(CW doesn't actually do a font change. Because of this, we prefer to use +# \fR where possible. +# +# Unfortunately, this isn't possible for arguments to heading macros, since +# there we don't know what the outside level font is. In that case, arrange +# things so that the outside font is always the "previous" font and end with +# \fP instead of \fR. Idea from Zack Weinberg. # -# \fP changes to the previous font, but only one previous font is kept. We -# don't know what the outside level font is; normally it's R, but if we're -# inside a heading it could be something else. So arrange things so that the -# outside font is always the "previous" font and end with \fP instead of \fR. -# Idea from Zack Weinberg. +# This function used to be much simpler outside of macro arguments because it +# went directly from \fB to \f(CW and relied on \f(CW clearing bold since it +# wasn't \f(CB. Unfortunately, while this works for mandoc, this is not how +# groff works; \fBfoo\f(CWbar still prints bar in bold. Therefore, we force +# the font back to the base font before each font change. sub mapfonts { - my ($self, $text) = @_; + my ($self, $text, $base) = @_; + + # The closure used to process each font escape, expected to be called from + # the right-hand side of an s/// expression. my ($fixed, $bold, $italic) = (0, 0, 0); my %magic = (F => \$fixed, B => \$bold, I => \$italic); my $last = '\fR'; - $text =~ s< - \\f\((.)(.) - > < - my $sequence = ''; - my $f; - if ($last ne '\fR') { $sequence = '\fP' } - ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1; - $f = $$self{FONTS}{ ($fixed && 1) . ($bold && 1) . ($italic && 1) }; - if ($f eq $last) { - ''; - } else { - if ($f ne '\fR') { $sequence .= $f } - $last = $f; - $sequence; + my $process = sub { + my ($style, $start_stop) = @_; + my $sequence = ($last ne '\fR') ? $base : q{}; + ${ $magic{$style} } += ($start_stop eq 'S') ? 1 : -1; + my $f = $self->{FONTS}{($fixed && 1) . ($bold && 1) . ($italic && 1)}; + return q{} if ($f eq $last); + if ($f ne '\fR') { + $sequence .= $f; } - >gxe; - return $text; -} + $last = $f; + return $sequence; + }; + + # Now, do the actual work. + $text =~ s{ \\f\((.)(.) }{$process->($1, $2)}xmsge; + + # We can do a bit of cleanup by collapsing sequences like \fR\fB\fR\fI + # into just \fI. + $text =~ s{ (?: \\fR )? (?: \\f (.|\(..) \\fR )+ }{\\fR}xms; -# Unfortunately, there is a bug in Solaris 2.6 nroff (not present in GNU -# groff) where the sequence \fB\fP\f(CW\fP leaves the font set to B rather -# than R, presumably because \f(CW doesn't actually do a font change. To work -# around this, use a separate textmapfonts for text blocks where the default -# font is always R and only use the smart mapfonts for headings. -sub textmapfonts { - my ($self, $text) = @_; - my ($fixed, $bold, $italic) = (0, 0, 0); - my %magic = (F => \$fixed, B => \$bold, I => \$italic); - $text =~ s< - \\f\((.)(.) - > < - ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1; - $$self{FONTS}{ ($fixed && 1) . ($bold && 1) . ($italic && 1) }; - >gxe; return $text; } # Given a command and a single argument that may or may not contain double -# quotes, handle double-quote formatting for it. If there are no double -# quotes, just return the command followed by the argument in double quotes. -# If there are double quotes, use an if statement to test for nroff, and for -# nroff output the command followed by the argument in double quotes with -# embedded double quotes doubled. For other formatters, remap paired double -# quotes to LQUOTE and RQUOTE. +# quotes and fixed-width text, handle double-quote formatting for it. If +# there is no fixed-width text, just return the command followed by the +# argument with proper quoting. If there is fixed-width text, work around a +# Solaris nroff bug with fixed-width fonts by converting fixed-width to +# regular fonts (nroff sees no difference). sub switchquotes { my ($self, $command, $text, $extra) = @_; - $text =~ s/\\\*\([LR]\"/\"/g; - # We also have to deal with \*C` and \*C', which are used to add the - # quotes around C<> text, since they may expand to " and if they do this - # confuses the .SH macros and the like no end. Expand them ourselves. - # Also separate troff from nroff if there are any fixed-width fonts in use - # to work around problems with Solaris nroff. - my $c_is_quote = ($$self{LQUOTE} =~ /\"/) || ($$self{RQUOTE} =~ /\"/); - my $fixedpat = join '|', @{ $$self{FONTS} }{'100', '101', '110', '111'}; - $fixedpat =~ s/\\/\\\\/g; - $fixedpat =~ s/\(/\\\(/g; - if ($text =~ m/\"/ || $text =~ m/$fixedpat/) { - $text =~ s/\"/\"\"/g; + # Separate troff from nroff if there are any fixed-width fonts in use to + # work around problems with Solaris nroff. + if ($text =~ $self->{FIXEDPAT}) { my $nroff = $text; my $troff = $text; - $troff =~ s/\"\"([^\"]*)\"\"/\`\`$1\'\'/g; - if ($c_is_quote and $text =~ m/\\\*\(C[\'\`]/) { - $nroff =~ s/\\\*\(C\`/$$self{LQUOTE}/g; - $nroff =~ s/\\\*\(C\'/$$self{RQUOTE}/g; - $troff =~ s/\\\*\(C[\'\`]//g; - } - $nroff = qq("$nroff") . ($extra ? " $extra" : ''); - $troff = qq("$troff") . ($extra ? " $extra" : ''); # Work around the Solaris nroff bug where \f(CW\fP leaves the font set # to Roman rather than the actual previous font when used in headings. # troff output may still be broken, but at least we can fix nroff by # just switching the font changes to the non-fixed versions. - my $font_end = "(?:\\f[PR]|\Q$$self{FONTS}{100}\E)"; - $nroff =~ s/\Q$$self{FONTS}{100}\E(.*?)\\f([PR])/$1/g; - $nroff =~ s/\Q$$self{FONTS}{101}\E(.*?)$font_end/\\fI$1\\fP/g; - $nroff =~ s/\Q$$self{FONTS}{110}\E(.*?)$font_end/\\fB$1\\fP/g; - $nroff =~ s/\Q$$self{FONTS}{111}\E(.*?)$font_end/\\f\(BI$1\\fP/g; + my $font_end = qr{ (?: \\f[PR] | \Q$self->{FONTS}{100}\E ) }xms; + $nroff =~ s{\Q$self->{FONTS}{100}\E(.*?)\\f([PR])}{$1}xmsg; + $nroff =~ s{\Q$self->{FONTS}{101}\E}{\\fI}xmsg; + $nroff =~ s{\Q$self->{FONTS}{110}\E}{\\fB}xmsg; + $nroff =~ s{\Q$self->{FONTS}{111}\E}{\\f\(BI}xmsg; + + # We have to deal with \*C` and \*C', which are used to add the quotes + # around C<> text, since they may expand to " and if they do this + # confuses the .SH macros and the like no end. Expand them ourselves. + my $c_is_quote = index("$self->{LQUOTE}$self->{RQUOTE}", qq(\")) != -1; + if ($c_is_quote && $text =~ m{ \\[*]\(C[\'\`] }xms) { + $nroff =~ s{ \\[*]\(C\` }{$self->{LQUOTE}}xmsg; + $nroff =~ s{ \\[*]\(C\' }{$self->{RQUOTE}}xmsg; + $troff =~ s{ \\[*]\(C[\'\`] }{}xmsg; + } # Now finally output the command. Bother with .ie only if the nroff # and troff output aren't the same. + $nroff = _quote_macro_argument($nroff) . ($extra ? " $extra" : ''); + $troff = _quote_macro_argument($troff) . ($extra ? " $extra" : ''); if ($nroff ne $troff) { return ".ie n $command $nroff\n.el $command $troff\n"; } else { return "$command $nroff\n"; } } else { - $text = qq("$text") . ($extra ? " $extra" : ''); + $text = _quote_macro_argument($text) . ($extra ? " $extra" : ''); return "$command $text\n"; } } @@ -761,10 +821,22 @@ sub outindex { # Output some text, without any additional changes. sub output { my ($self, @text) = @_; - if ($$self{ENCODE}) { - print { $$self{output_fh} } Encode::encode ('UTF-8', join ('', @text)); + my $text = join('', @text); + $text =~ s{$NBSP}{\\ }g; + $text =~ s{$SHY}{\\%}g; + + if ($$self{ENCODE} && _needs_encode($$self{ENCODING})) { + my $check = sub { + my ($char) = @_; + my $display = '"\x{' . hex($char) . '}"'; + my $error = "$display does not map to $$self{ENCODING}"; + $self->whine ($self->line_count(), $error); + return Encode::encode ($$self{ENCODING}, chr($char)); + }; + my $output = Encode::encode ($$self{ENCODING}, $text, $check); + print { $$self{output_fh} } $output; } else { - print { $$self{output_fh} } @text; + print { $$self{output_fh} } $text; } } @@ -777,21 +849,20 @@ sub output { sub start_document { my ($self, $attrs) = @_; if ($$attrs{contentless} && !$$self{ALWAYS_EMIT_SOMETHING}) { - DEBUG and print "Document is contentless\n"; $$self{CONTENTLESS} = 1; } else { delete $$self{CONTENTLESS}; } - # When UTF-8 output is set, check whether our output file handle already - # has a PerlIO encoding layer set. If it does not, we'll need to encode - # our output before printing it (handled in the output() sub). Wrap the - # check in an eval to handle versions of Perl without PerlIO. + # When an encoding is requested, check whether our output file handle + # already has a PerlIO encoding layer set. If it does not, we'll need to + # encode our output before printing it (handled in the output() sub). + # Wrap the check in an eval to handle versions of Perl without PerlIO. # # PerlIO::get_layers still requires its argument be a glob, so coerce the # file handle to a glob. $$self{ENCODE} = 0; - if ($$self{utf8}) { + if ($$self{ENCODING}) { $$self{ENCODE} = 1; eval { my @options = (output => 1, details => 1); @@ -806,15 +877,15 @@ sub start_document { # document was content-free. if (!$$self{CONTENTLESS}) { my ($name, $section); - if (defined $$self{name}) { - $name = $$self{name}; - $section = $$self{section} || 1; + if (defined $self->{opt_name}) { + $name = $self->{opt_name}; + $section = $self->{opt_section} || 1; } else { ($name, $section) = $self->devise_title; } - my $date = defined($$self{date}) ? $$self{date} : $self->devise_date; + my $date = $self->{opt_date} // $self->devise_date(); $self->preamble ($name, $section, $date) - unless $self->bare_output or DEBUG > 9; + unless $self->bare_output; } # Initialize a few per-document variables. @@ -839,7 +910,6 @@ sub end_document { } return if $self->bare_output; return if ($$self{CONTENTLESS} && !$$self{ALWAYS_EMIT_SOMETHING}); - $self->output (q(.\" [End document]) . "\n") if DEBUG; } # Try to figure out the name and section from the file name and return them as @@ -848,8 +918,8 @@ sub end_document { sub devise_title { my ($self) = @_; my $name = $self->source_filename || ''; - my $section = $$self{section} || 1; - $section = 3 if (!$$self{section} && $name =~ /\.pm\z/i); + my $section = $self->{opt_section} || 1; + $section = 3 if (!$self->{opt_section} && $name =~ /\.pm\z/i); $name =~ s/\.p(od|[lm])\z//i; # If Pod::Parser gave us an IO::File reference as the source file name, @@ -983,34 +1053,53 @@ sub devise_date { # module, but this order is correct for both Solaris and Linux. sub preamble { my ($self, $name, $section, $date) = @_; - my $preamble = $self->preamble_template (!$$self{utf8}); - - # Build the index line and make sure that it will be syntactically valid. - my $index = "$name $section"; - $index =~ s/\"/\"\"/g; + my $preamble = $self->preamble_template(); - # If name or section contain spaces, quote them (section really never - # should, but we may as well be cautious). - for ($name, $section) { - if (/\s/) { - s/\"/\"\"/g; - $_ = '"' . $_ . '"'; + # groff's preconv script will use this line to correctly determine the + # input encoding if the encoding is one of the ones it recognizes. It + # must be the first or second line. + # + # If the output encoding is some version of Unicode, we could also add a + # Unicode Byte Order Mark to the start of the file, but the BOM is now + # deprecated and I am concerned that may break a *roff implementation that + # might otherwise cope with Unicode. Revisit this if someone files a bug + # report about it. + if (_needs_encode($$self{ENCODING})) { + my $normalized = lc($$self{ENCODING}); + $normalized =~ s{-}{}g; + my $coding = $ENCODINGS{$normalized} || lc($$self{ENCODING}); + if ($coding ne 'us-ascii') { + $self->output(qq{.\\\" -*- mode: troff; coding: $coding -*-\n}); } } - # Double quotes in date, since it will be quoted. - $date =~ s/\"/\"\"/g; - - # Substitute into the preamble the configuration options. - $preamble =~ s/\@CFONT\@/$$self{fixed}/; - $preamble =~ s/\@LQUOTE\@/$$self{LQUOTE}/; - $preamble =~ s/\@RQUOTE\@/$$self{RQUOTE}/; - chomp $preamble; + # Substitute into the preamble the configuration options. Because it's + # used as the argument to defining a string, any leading double quote (but + # no other double quotes) in LQUOTE and RQUOTE has to be doubled. + $preamble =~ s{ [@] CFONT [@] }{$self->{opt_fixed}}xms; + my $lquote = $self->{LQUOTE}; + my $rquote = $self->{RQUOTE}; + $lquote =~ s{ \A \" }{""}xms; + $rquote =~ s{ \A \" }{""}xms; + $preamble =~ s{ [@] LQUOTE [@] }{$lquote}xms; + $preamble =~ s{ [@] RQUOTE [@] }{$rquote}xms; + chomp($preamble); # Get the version information. - my $version = $self->version_report; + my $version = $self->version_report(); + + # Build the index line and make sure that it will be syntactically valid. + my $index = _quote_macro_argument("$name $section"); - # Finally output everything. + # Quote the arguments to the .TH macro. (Section should never require + # this, but we may as well be cautious.) + $name = _quote_macro_argument($name); + $section = _quote_macro_argument($section); + $date = _quote_macro_argument($date); + my $center = _quote_macro_argument($self->{opt_center}); + my $release = _quote_macro_argument($self->{opt_release}); + + # Output the majority of the preamble. $self->output (<<"----END OF HEADER----"); .\\" Automatically generated by $version .\\" @@ -1019,14 +1108,19 @@ sub preamble { $preamble .\\" ======================================================================== .\\" -.IX Title "$index" -.TH $name $section "$date" "$$self{release}" "$$self{center}" +.IX Title $index +.TH $name $section $date $release $center .\\" For nroff, turn off justification. Always turn off hyphenation; it makes .\\" way too many mistakes in technical documents. .if n .ad l .nh ----END OF HEADER---- - $self->output (".\\\" [End of preamble]\n") if DEBUG; + + # If the language was specified, output the language configuration. + if ($self->{opt_language}) { + $self->output(".mso $self->{opt_language}.tmac\n"); + $self->output(".hla $self->{opt_language}\n"); + } } ############################################################################## @@ -1051,11 +1145,6 @@ sub cmd_para { $$self{SHIFTWAIT} = 0; } - # Add the line number for debugging, but not in the NAME section just in - # case the comment would confuse apropos. - $self->output (".\\\" [At source line $line]\n") - if defined ($line) && DEBUG && !$$self{IN_NAME}; - # Force exactly one newline at the end and strip unwanted trailing # whitespace at the end, but leave "\ " backslashed space from an S< > at # the end of a line. Reverse the text first, to avoid having to scan the @@ -1065,8 +1154,8 @@ sub cmd_para { $text = reverse $text; # Output the paragraph. - $self->output ($self->protect ($self->textmapfonts ($text))); - $self->outindex; + $self->output($self->protect($self->mapfonts($text, '\fR'))); + $self->outindex(); $$self{NEEDSPACE} = 1; return ''; } @@ -1078,45 +1167,44 @@ sub cmd_verbatim { my ($self, $attrs, $text) = @_; # Ignore an empty verbatim paragraph. - return unless $text =~ /\S/; + return if $text !~ m{ \S }xms; # Force exactly one newline at the end and strip unwanted trailing - # whitespace at the end. Reverse the text first, to avoid having to scan - # the entire paragraph. - $text = reverse $text; - $text =~ s/\A\s*/\n/; - $text = reverse $text; + # whitespace at the end. + $text =~ s{ \s* \z }{\n}xms; # Get a count of the number of lines before the first blank line, which # we'll pass to .Vb as its parameter. This tells *roff to keep that many # lines together. We don't want to tell *roff to keep huge blocks # together. - my @lines = split (/\n/, $text); + my @lines = split (m{ \n }xms, $text); my $unbroken = 0; - for (@lines) { - last if /^\s*$/; + for my $line (@lines) { + last if $line =~ m{ \A \s* \z }xms; $unbroken++; } - $unbroken = 10 if ($unbroken > 12 && !$$self{MAGIC_VNOPAGEBREAK_LIMIT}); + if ($unbroken > 12) { + $unbroken = 10; + } - # Prepend a null token to each line. - $text =~ s/^/\\&/gm; + # Prepend a null token to each line to preserve indentation. + $text =~ s{ ^ }{\\&}xmsg; # Output the results. - $self->makespace; - $self->output (".Vb $unbroken\n$text.Ve\n"); + $self->makespace(); + $self->output(".Vb $unbroken\n$text.Ve\n"); $$self{NEEDSPACE} = 1; - return ''; + return q{}; } # Handle literal text (produced by =for and similar constructs). Just output # it with the minimum of changes. sub cmd_data { my ($self, $attrs, $text) = @_; - $text =~ s/^\n+//; - $text =~ s/\n{0,2}$/\n/; - $self->output ($text); - return ''; + $text =~ s{ \A \n+ }{}xms; + $text =~ s{ \n{0,2} \z }{\n}xms; + $self->output($text); + return q{}; } ############################################################################## @@ -1138,9 +1226,6 @@ sub heading_common { $self->output (".PD\n"); } - # Output the current source line. - $self->output ( ".\\\" [At source line $line]\n" ) - if defined ($line) && DEBUG; return $text; } @@ -1153,7 +1238,7 @@ sub cmd_head1 { $text =~ s/\\s-?\d//g; $text = $self->heading_common ($text, $$attrs{start_line}); my $isname = ($text eq 'NAME' || $text =~ /\(NAME\)/); - $self->output ($self->switchquotes ('.SH', $self->mapfonts ($text))); + $self->output($self->switchquotes('.SH', $self->mapfonts($text, '\fP'))); $self->outindex ('Header', $text) unless $isname; $$self{NEEDSPACE} = 0; $$self{IN_NAME} = $isname; @@ -1164,7 +1249,7 @@ sub cmd_head1 { sub cmd_head2 { my ($self, $attrs, $text) = @_; $text = $self->heading_common ($text, $$attrs{start_line}); - $self->output ($self->switchquotes ('.SS', $self->mapfonts ($text))); + $self->output($self->switchquotes('.SS', $self->mapfonts($text, '\fP'))); $self->outindex ('Subsection', $text); $$self{NEEDSPACE} = 0; return ''; @@ -1176,7 +1261,7 @@ sub cmd_head3 { my ($self, $attrs, $text) = @_; $text = $self->heading_common ($text, $$attrs{start_line}); $self->makespace; - $self->output ($self->textmapfonts ('\f(IS' . $text . '\f(IE') . "\n"); + $self->output($self->mapfonts('\f(IS' . $text . '\f(IE', '\fR') . "\n"); $self->outindex ('Subsection', $text); $$self{NEEDSPACE} = 1; return ''; @@ -1188,7 +1273,7 @@ sub cmd_head4 { my ($self, $attrs, $text) = @_; $text = $self->heading_common ($text, $$attrs{start_line}); $self->makespace; - $self->output ($self->textmapfonts ($text) . "\n"); + $self->output($self->mapfonts($text, '\fR') . "\n"); $self->outindex ('Subsection', $text); $$self{NEEDSPACE} = 1; return ''; @@ -1205,6 +1290,13 @@ sub cmd_i { return $_[0]->{IN_NAME} ? $_ sub cmd_f { return $_[0]->{IN_NAME} ? $_[2] : '\f(IS' . $_[2] . '\f(IE' } sub cmd_c { return $_[0]->quote_literal ($_[2]) } +# Convert all internal whitespace to $NBSP. +sub cmd_s { + my ($self, $attrs, $text) = @_; + $text =~ s{ \s }{$NBSP}xmsg; + return $text; +} + # Index entries are just added to the pending entries. sub cmd_x { my ($self, $attrs, $text) = @_; @@ -1226,7 +1318,7 @@ sub cmd_l { } if (not defined ($to) or $to eq $text) { return "<$text>"; - } elsif ($$self{nourls}) { + } elsif ($self->{opt_nourls}) { return $text; } else { return "$text <$$attrs{to}>"; @@ -1247,12 +1339,10 @@ sub over_common_start { my ($self, $type, $attrs) = @_; my $line = $$attrs{start_line}; my $indent = $$attrs{indent}; - DEBUG > 3 and print " Starting =over $type (line $line, indent ", - ($indent || '?'), "\n"; # Find the indentation level. unless (defined ($indent) && $indent =~ /^[-+]?\d{1,4}\s*$/) { - $indent = $$self{indent}; + $indent = $self->{opt_indent}; } # If we've gotten multiple indentations in a row, we need to emit the @@ -1281,7 +1371,6 @@ sub over_common_start { # .RE and then a new .RS to unconfuse *roff. sub over_common_end { my ($self) = @_; - DEBUG > 3 and print " Ending =over\n"; $$self{INDENT} = pop @{ $$self{INDENTS} }; pop @{ $$self{ITEMTYPES} }; @@ -1320,7 +1409,6 @@ sub end_over_block { $_[0]->over_common sub item_common { my ($self, $type, $attrs, $text) = @_; my $line = $$attrs{start_line}; - DEBUG > 3 and print " $type item (line $line): $text\n"; # Clean up the text. We want to end up with two variables, one ($text) # which contains any body text after taking out the item portion, and @@ -1352,8 +1440,8 @@ sub item_common { $self->output (".PD 0\n") if ($$self{ITEMS} == 1); # Now, output the item tag itself. - $item = $self->textmapfonts ($item); - $self->output ($self->switchquotes ('.IP', $item, $$self{INDENT})); + $item = $self->mapfonts($item, '\fR'); + $self->output($self->switchquotes('.IP', $item, $$self{INDENT})); $$self{NEEDSPACE} = 0; $$self{ITEMS}++; $$self{SHIFTWAIT} = 0; @@ -1362,7 +1450,7 @@ sub item_common { if ($text) { $text =~ s/\s*$/\n/; $self->makespace; - $self->output ($self->protect ($self->textmapfonts ($text))); + $self->output($self->protect($self->mapfonts($text, '\fR'))); $$self{NEEDSPACE} = 1; } $self->outindex ($index ? ('Item', $index) : ()); @@ -1450,48 +1538,15 @@ sub parse_string_document { } ############################################################################## -# Translation tables -############################################################################## - -# The following table is adapted from Tom Christiansen's pod2man. It assumes -# that the standard preamble has already been printed, since that's what -# defines all of the accent marks. We really want to do something better than -# this when *roff actually supports other character sets itself, since these -# results are pretty poor. -# -# This only works in an ASCII world. What to do in a non-ASCII world is very -# unclear -- hopefully we can assume UTF-8 and just leave well enough alone. -@ESCAPES{0xA0 .. 0xFF} = ( - "\\ ", undef, undef, undef, undef, undef, undef, undef, - undef, undef, undef, undef, undef, "\\%", undef, undef, - - undef, undef, undef, undef, undef, undef, undef, undef, - undef, undef, undef, undef, undef, undef, undef, undef, - - "A\\*`", "A\\*'", "A\\*^", "A\\*~", "A\\*:", "A\\*o", "\\*(Ae", "C\\*,", - "E\\*`", "E\\*'", "E\\*^", "E\\*:", "I\\*`", "I\\*'", "I\\*^", "I\\*:", - - "\\*(D-", "N\\*~", "O\\*`", "O\\*'", "O\\*^", "O\\*~", "O\\*:", undef, - "O\\*/", "U\\*`", "U\\*'", "U\\*^", "U\\*:", "Y\\*'", "\\*(Th", "\\*8", - - "a\\*`", "a\\*'", "a\\*^", "a\\*~", "a\\*:", "a\\*o", "\\*(ae", "c\\*,", - "e\\*`", "e\\*'", "e\\*^", "e\\*:", "i\\*`", "i\\*'", "i\\*^", "i\\*:", - - "\\*(d-", "n\\*~", "o\\*`", "o\\*'", "o\\*^", "o\\*~", "o\\*:", undef, - "o\\*/" , "u\\*`", "u\\*'", "u\\*^", "u\\*:", "y\\*'", "\\*(th", "y\\*:", -) if ASCII; - -############################################################################## # Premable ############################################################################## -# The following is the static preamble which starts all *roff output we -# generate. Most is static except for the font to use as a fixed-width font, -# which is designed by @CFONT@, and the left and right quotes to use for C<> -# text, designated by @LQOUTE@ and @RQUOTE@. However, the second part, which -# defines the accent marks, is only used if $escapes is set to true. +# The preamble which starts all *roff output we generate. Most is static +# except for the font to use as a fixed-width font (designed by @CFONT@), and +# the left and right quotes to use for C<> text (designated by @LQOUTE@ and +# @RQUOTE@). Accent marks are only defined if the output encoding is roff. sub preamble_template { - my ($self, $accents) = @_; + my ($self) = @_; my $preamble = <<'----END OF PREAMBLE----'; .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v @@ -1506,29 +1561,12 @@ sub preamble_template { .ft R .fi .. -.\" Set up some character translations and predefined strings. \*(-- will -.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left -.\" double quote, and \*(R" will give a right double quote. \*(C+ will -.\" give a nicer C++. Capital omega is used to do unbreakable dashes and -.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, -.\" nothing in troff, for use with C<>. -.tr \(*W- -.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ -. ds -- \(*W- -. ds PI pi -. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch -. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch -. ds L" "" -. ds R" "" . ds C` @LQUOTE@ . ds C' @RQUOTE@ 'br\} .el\{\ -. ds -- \|\(em\| -. ds PI \(*p -. ds L" `` -. ds R" '' . ds C` . ds C' 'br\} @@ -1562,7 +1600,7 @@ sub preamble_template { ----END OF PREAMBLE---- #'# for cperl-mode - if ($accents) { + if ($$self{ENCODING} eq 'roff') { $preamble .= <<'----END OF PREAMBLE----' .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). @@ -1592,7 +1630,7 @@ sub preamble_template { . ds / .\} .if t \{\ -. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h'|\\n:u' . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' @@ -1639,10 +1677,13 @@ sub preamble_template { 1; __END__ +=encoding UTF-8 + =for stopwords en em ALLCAPS teeny fixedbold fixeditalic fixedbolditalic stderr utf8 UTF-8 Allbery Sean Burke Ossanna Solaris formatters troff uppercased Christiansen -nourls parsers Kernighan lquote rquote +nourls parsers Kernighan lquote rquote unrepresentable mandoc NetBSD PostScript +SMP macOS EBCDIC fallbacks manref reflowed reflowing FH overridable =head1 NAME @@ -1668,100 +1709,197 @@ using L, normally via L, but it can also be used directly. -As a derived class from Pod::Simple, Pod::Man supports the same methods and -interfaces. See L for all the details. +By default (on non-EBCDIC systems), Pod::Man outputs UTF-8. Its output should +work with the B program on systems that use B (most Linux +distributions) or B (most BSD variants), but may result in mangled +output on older UNIX systems. To choose a different, possibly more +backward-compatible output mangling on such systems, set the C +option to C (the default in earlier Pod::Man versions). See the +C option and L for more details. + +See L for the versions of Pod::Man with significant +backward-incompatible changes (other than constructor options, whose versions +are documented below), and the versions of Perl that included them. -new() can take options, in the form of key/value pairs that control the -behavior of the parser. See below for details. +=head1 CLASS METHODS -If no options are given, Pod::Man uses the name of the input file with any -trailing C<.pod>, C<.pm>, or C<.pl> stripped as the man page title, to -section 1 unless the file ended in C<.pm> in which case it defaults to -section 3, to a centered title of "User Contributed Perl Documentation", to -a centered footer of the Perl version it is run with, and to a left-hand -footer of the modification date of its input (or the current date if given -C for input). - -Pod::Man assumes that your *roff formatters have a fixed-width font named -C. If yours is called something else (like C), use the C -option to specify it. This generally only matters for troff output for -printing. Similarly, you can set the fonts used for bold, italic, and -bold italic fixed-width output. - -Besides the obvious pod conversions, Pod::Man also takes care of -formatting func(), func(3), and simple variable references like $foo or -@bar so you don't have to use code escapes for them; complex expressions -like C<$fred{'stuff'}> will still need to be escaped, though. It also -translates dashes that aren't used as hyphens into en dashes, makes long -dashes--like this--into proper em dashes, fixes "paired quotes," makes C++ -look right, puts a little space between double underscores, makes ALLCAPS -a teeny bit smaller in B, and escapes stuff that *roff treats as -special so that you don't have to. +=over 4 -The recognized options to new() are as follows. All options take a single -argument. +=item new(ARGS) + +Create a new Pod::Man object. ARGS should be a list of key/value pairs, where +the keys are chosen from the following. Each option is annotated with the +version of Pod::Man in which that option was added with its current meaning. =over 4 =item center -Sets the centered page header for the C<.TH> macro. The default, if this -option is not specified, is "User Contributed Perl Documentation". +[1.00] Sets the centered page header for the C<.TH> macro. The default, if +this option is not specified, is C. =item date -Sets the left-hand footer for the C<.TH> macro. If this option is not set, -the contents of the environment variable POD_MAN_DATE, if set, will be used. -Failing that, the value of SOURCE_DATE_EPOCH, the modification date of the -input file, or the current time if stat() can't find that file (which will be -the case if the input is from C) will be used. If obtained from the -file modification date or the current time, the date will be formatted as -C and will be based on UTC (so that the output will be -reproducible regardless of local time zone). +[4.00] Sets the left-hand footer for the C<.TH> macro. If this option is not +set, the contents of the environment variable POD_MAN_DATE, if set, will be +used. Failing that, the value of SOURCE_DATE_EPOCH, the modification date of +the input file, or the current time if stat() can't find that file (which will +be the case if the input is from C) will be used. If taken from any +source other than POD_MAN_DATE (which is used verbatim), the date will be +formatted as C and will be based on UTC (so that the output will +be reproducible regardless of local time zone). + +=item encoding + +[5.00] Specifies the encoding of the output. The value must be an encoding +recognized by the L module (see L), or the special +values C or C. The default on non-EBCDIC systems is UTF-8. + +If the output contains characters that cannot be represented in this encoding, +that is an error that will be reported as configured by the C option. +If error handling is other than C, the unrepresentable character will be +replaced with the Encode substitution character (normally C). + +If the C option is set to the special value C (the default on +EBCDIC systems), or if the Encode module is not available and the encoding is +set to anything other than C, Pod::Man will translate all non-ASCII +characters to C<\[uNNNN]> Unicode escapes. These are not traditionally part +of the *roff language, but are supported by B and B and thus by +the majority of manual page processors in use today. + +If the C option is set to the special value C, Pod::Man will +do its historic transformation of (some) ISO 8859-1 characters into *roff +escapes that may be adequate in troff and may be readable (if ugly) in nroff. +This was the default behavior of versions of Pod::Man before 5.00. With this +encoding, all other non-ASCII characters will be replaced with C. It may +be required for very old troff and nroff implementations that do not support +UTF-8, but its representation of any non-ASCII character is very poor and +often specific to European languages. + +If the output file handle has a PerlIO encoding layer set, setting C +to anything other than C or C will be ignored and no encoding +will be done by Pod::Man. It will instead rely on the encoding layer to make +whatever output encoding transformations are desired. + +WARNING: The input encoding of the POD source is independent from the output +encoding, and setting this option does not affect the interpretation of the +POD input. Unless your POD source is US-ASCII, its encoding should be +declared with the C<=encoding> command in the source. If this is not done, +Pod::Simple will will attempt to guess the encoding and may be successful if +it's Latin-1 or UTF-8, but it will produce warnings. See L for +more information. =item errors -How to report errors. C says to throw an exception on any POD -formatting error. C says to report errors on standard error, but -not to throw an exception. C says to include a POD ERRORS section -in the resulting documentation summarizing the errors. C ignores -POD errors entirely, as much as possible. +[2.27] How to report errors. C says to throw an exception on any POD +formatting error. C says to report errors on standard error, but not +to throw an exception. C says to include a POD ERRORS section in the +resulting documentation summarizing the errors. C ignores POD errors +entirely, as much as possible. The default is C. =item fixed -The fixed-width font to use for verbatim text and code. Defaults to -C. Some systems may want C instead. Only matters for B -output. +[1.00] The fixed-width font to use for verbatim text and code. Defaults to +C. Some systems prefer C instead. Only matters for B output. =item fixedbold -Bold version of the fixed-width font. Defaults to C. Only matters +[1.00] Bold version of the fixed-width font. Defaults to C. Only matters for B output. =item fixeditalic -Italic version of the fixed-width font (actually, something of a misnomer, -since most fixed-width fonts only have an oblique version, not an italic -version). Defaults to C. Only matters for B output. +[1.00] Italic version of the fixed-width font (something of a misnomer, since +most fixed-width fonts only have an oblique version, not an italic version). +Defaults to C. Only matters for B output. =item fixedbolditalic -Bold italic (probably actually oblique) version of the fixed-width font. -Pod::Man doesn't assume you have this, and defaults to C. Some -systems (such as Solaris) have this font available as C. Only matters -for B output. +[1.00] Bold italic (in theory, probably oblique in practice) version of the +fixed-width font. Pod::Man doesn't assume you have this, and defaults to +C. Some systems (such as Solaris) have this font available as C. +Only matters for B output. + +=item guesswork + +[5.00] By default, Pod::Man applies some default formatting rules based on +guesswork and regular expressions that are intended to make writing Perl +documentation easier and require less explicit markup. These rules may not +always be appropriate, particularly for documentation that isn't about Perl. +This option allows turning all or some of it off. + +The special value C enables all guesswork. This is also the default for +backward compatibility reasons. The special value C disables all +guesswork. Otherwise, the value of this option should be a comma-separated +list of one or more of the following keywords: + +=over 4 + +=item functions + +Convert function references like C to bold even if they have no markup. +The function name accepts valid Perl characters for function names (including +C<:>), and the trailing parentheses must be present and empty. + +=item manref + +Make the first part (before the parentheses) of manual page references like +C bold even if they have no markup. The section must be a single +number optionally followed by lowercase letters. + +=item quoting + +If no guesswork is enabled, any text enclosed in CZ<><> is surrounded by +double quotes in nroff (terminal) output unless the contents are already +quoted. When this guesswork is enabled, quote marks will also be suppressed +for Perl variables, function names, function calls, numbers, and hex +constants. + +=item variables + +Convert Perl variable names to a fixed-width font even if they have no markup. +This transformation will only be apparent in troff output, or some other +output format (unlike nroff terminal output) that supports fixed-width fonts. + +=back + +Any unknown guesswork name is silently ignored (for potential future +compatibility), so be careful about spelling. + +=item language + +[5.00] Add commands telling B that the input file is in the given +language. The value of this setting must be a language abbreviation for which +B provides supplemental configuration, such as C (for Japanese) or +C (for Chinese). + +Specifically, this adds: + + .mso .tmac + .hla + +to the start of the file, which configure correct line breaking for the +specified language. Without these commands, groff may not know how to add +proper line breaks for Chinese and Japanese text if the manual page is +installed into the normal manual page directory, such as F. + +On many systems, this will be done automatically if the manual page is +installed into a language-specific manual page directory, such as +F. In that case, this option is not required. + +Unfortunately, the commands added with this option are specific to B +and will not work with other B and B implementations. =item lquote =item rquote -Sets the quote marks used to surround CE> text. C sets the -left quote mark and C sets the right quote mark. Either may also -be set to the special value C, in which case no quote mark is added -on that side of CE> text (but the font is still changed for troff -output). +[4.08] Sets the quote marks used to surround CE> text. C sets the +left quote mark and C sets the right quote mark. Either may also be +set to the special value C, in which case no quote mark is added on that +side of CE> text (but the font is still changed for troff output). Also see the C option, which can be used to set both quotes at once. If both C and one of the other options is set, C or C @@ -1769,21 +1907,21 @@ overrides C. =item name -Set the name of the manual page for the C<.TH> macro. Without this -option, the manual name is set to the uppercased base name of the file -being converted unless the manual section is 3, in which case the path is -parsed to see if it is a Perl module path. If it is, a path like -C<.../lib/Pod/Man.pm> is converted into a name like C. This -option, if given, overrides any automatic determination of the name. +[4.08] Set the name of the manual page for the C<.TH> macro. Without this +option, the manual name is set to the uppercased base name of the file being +converted unless the manual section is 3, in which case the path is parsed to +see if it is a Perl module path. If it is, a path like C<.../lib/Pod/Man.pm> +is converted into a name like C. This option, if given, overrides +any automatic determination of the name. If generating a manual page from standard input, the name will be set to -C if this option is not provided. Providing this option is strongly -recommended to set a meaningful manual page name. +C if this option is not provided. In this case, providing this option +is strongly recommended to set a meaningful manual page name. =item nourls -Normally, LZ<><> formatting codes with a URL but anchor text are formatted -to show both the anchor text and the URL. In other words: +[2.27] Normally, LZ<><> formatting codes with a URL but anchor text are +formatted to show both the anchor text and the URL. In other words: L @@ -1798,10 +1936,10 @@ important. =item quotes -Sets the quote marks used to surround CE> text. If the value is a -single character, it is used as both the left and right quote. Otherwise, -it is split in half, and the first half of the string is used as the left -quote and the second is used as the right quote. +[4.00] Sets the quote marks used to surround CE> text. If the value is a +single character, it is used as both the left and right quote. Otherwise, it +is split in half, and the first half of the string is used as the left quote +and the second is used as the right quote. This may also be set to the special value C, in which case no quote marks are added around CE> text (but the font is still changed for troff @@ -1813,82 +1951,258 @@ options is set, C or C o =item release -Set the centered footer for the C<.TH> macro. By default, this is set to -the version of Perl you run Pod::Man under. Setting this to the empty -string will cause some *roff implementations to use the system default -value. - -Note that some system C macro sets assume that the centered footer -will be a modification date and will prepend something like "Last -modified: ". If this is the case for your target system, you may want to -set C to the last modified date and C to the version -number. +[1.00] Set the centered footer for the C<.TH> macro. By default, this is set +to the version of Perl you run Pod::Man under. Setting this to the empty +string will cause some *roff implementations to use the system default value. + +Note that some system C macro sets assume that the centered footer will be +a modification date and will prepend something like C. If +this is the case for your target system, you may want to set C to the +last modified date and C to the version number. =item section -Set the section for the C<.TH> macro. The standard section numbering -convention is to use 1 for user commands, 2 for system calls, 3 for -functions, 4 for devices, 5 for file formats, 6 for games, 7 for -miscellaneous information, and 8 for administrator commands. There is a lot -of variation here, however; some systems (like Solaris) use 4 for file -formats, 5 for miscellaneous information, and 7 for devices. Still others -use 1m instead of 8, or some mix of both. About the only section numbers -that are reliably consistent are 1, 2, and 3. +[1.00] Set the section for the C<.TH> macro. The standard section numbering +convention is to use 1 for user commands, 2 for system calls, 3 for functions, +4 for devices, 5 for file formats, 6 for games, 7 for miscellaneous +information, and 8 for administrator commands. There is a lot of variation +here, however; some systems (like Solaris) use 4 for file formats, 5 for +miscellaneous information, and 7 for devices. Still others use 1m instead of +8, or some mix of both. About the only section numbers that are reliably +consistent are 1, 2, and 3. By default, section 1 will be used unless the file ends in C<.pm> in which case section 3 will be selected. =item stderr -Send error messages about invalid POD to standard error instead of -appending a POD ERRORS section to the generated *roff output. This is -equivalent to setting C to C if C is not already -set. It is supported for backward compatibility. +[2.19] If set to a true value, send error messages about invalid POD to +standard error instead of appending a POD ERRORS section to the generated +*roff output. This is equivalent to setting C to C if +C is not already set. + +This option is for backward compatibility with Pod::Man versions that did not +support C. Normally, the C option should be used instead. =item utf8 -By default, Pod::Man produces the most conservative possible *roff output -to try to ensure that it will work with as many different *roff -implementations as possible. Many *roff implementations cannot handle -non-ASCII characters, so this means all non-ASCII characters are converted -either to a *roff escape sequence that tries to create a properly accented -character (at least for troff output) or to C. - -If this option is set, Pod::Man will instead output UTF-8. If your *roff -implementation can handle it, this is the best output format to use and -avoids corruption of documents containing non-ASCII characters. However, -be warned that *roff source with literal UTF-8 characters is not supported -by many implementations and may even result in segfaults and other bad -behavior. - -Be aware that, when using this option, the input encoding of your POD -source should be properly declared unless it's US-ASCII. Pod::Simple will -attempt to guess the encoding and may be successful if it's Latin-1 or -UTF-8, but it will produce warnings. Use the C<=encoding> command to -declare the encoding. See L for more information. +[2.21] This option used to set the output encoding to UTF-8. Since this is +now the default, it is ignored and does nothing. + +=back + +=back + +=head1 INSTANCE METHODS + +As a derived class from Pod::Simple, Pod::Man supports the same methods and +interfaces. See L for all the details. This section summarizes +the most-frequently-used methods and the ones added by Pod::Man. + +=over 4 + +=item output_fh(FH) + +Direct the output from parse_file(), parse_lines(), or parse_string_document() +to the file handle FH instead of C. + +=item output_string(REF) + +Direct the output from parse_file(), parse_lines(), or parse_string_document() +to the scalar variable pointed to by REF, rather than C. For example: + + my $man = Pod::Man->new(); + my $output; + $man->output_string(\$output); + $man->parse_file('/some/input/file'); + +Be aware that the output in that variable will already be encoded in UTF-8. + +=item parse_file(PATH) + +Read the POD source from PATH and format it. By default, the output is sent +to C, but this can be changed with the output_fh() or output_string() +methods. + +=item parse_from_file(INPUT, OUTPUT) + +=item parse_from_filehandle(FH, OUTPUT) + +Read the POD source from INPUT, format it, and output the results to OUTPUT. + +parse_from_filehandle() is provided for backward compatibility with older +versions of Pod::Man. parse_from_file() should be used instead. + +=item parse_lines(LINES[, ...[, undef]]) + +Parse the provided lines as POD source, writing the output to either C +or the file handle set with the output_fh() or output_string() methods. This +method can be called repeatedly to provide more input lines. An explicit +C should be passed to indicate the end of input. + +This method expects raw bytes, not decoded characters. + +=item parse_string_document(INPUT) + +Parse the provided scalar variable as POD source, writing the output to either +C or the file handle set with the output_fh() or output_string() +methods. + +This method expects raw bytes, not decoded characters. =back -The standard Pod::Simple method parse_file() takes one argument naming the -POD file to read from. By default, the output is sent to C, but -this can be changed with the output_fh() method. - -The standard Pod::Simple method parse_from_file() takes up to two -arguments, the first being the input file to read POD from and the second -being the file to write the formatted output to. - -You can also call parse_lines() to parse an array of lines or -parse_string_document() to parse a document already in memory. As with -parse_file(), parse_lines() and parse_string_document() default to sending -their output to C unless changed with the output_fh() method. Be -aware that parse_lines() and parse_string_document() both expect raw bytes, -not decoded characters. +=head1 ENCODING + +As of Pod::Man 5.00, the default output encoding for Pod::Man is UTF-8. This +should work correctly on any modern system that uses either B (most +Linux distributions) or B (Alpine Linux and most BSD variants, +including macOS). + +The user will probably have to use a UTF-8 locale to see correct output. This +may be done by default; if not, set the LANG or LC_CTYPE environment variables +to an appropriate local. The locale C is available on most systems +if one wants correct output without changing the other things locales affect, +such as collation. + +The backward-compatible output format used in Pod::Man versions before 5.00 is +available by setting the C option to C. This may produce +marginally nicer results on older UNIX versions that do not use B or +B, but none of the available options will correctly render Unicode +characters on those systems. + +Below are some additional details about how this choice was made and some +discussion of alternatives. + +=head2 History + +The default output encoding for Pod::Man has been a long-standing problem. +B and B predate Unicode by a significant margin, and their +implementations for many UNIX systems reflect that legacy. It's common for +Unicode to not be supported in any form. + +Because of this, versions of Pod::Man prior to 5.00 maintained the highly +conservative output of the original pod2man, which output pure ASCII with +complex macros to simulate common western European accented characters when +processed with troff. The nroff output was awkward and sometimes incorrect, +and characters not used in western European scripts were replaced with C. +This choice maximized backwards compatibility with B and +B/B implementations at the cost of incorrect rendering of many +POD documents, particularly those containing people's names. + +The modern implementations, B (used in most Linux distributions) and +B (used by most BSD variants), do now support Unicode. Other UNIX +systems often do not, but they're now a tiny minority of the systems people +use on a daily basis. It's increasingly common (for very good reasons) to use +Unicode characters for POD documents rather than using ASCII conversions of +people's names or avoiding non-English text, making the limitations in the old +output format more apparent. + +Four options have been proposed to fix this: + +=over 2 + +=item * + +Optionally support UTF-8 output but don't change the default. This is the +approach taken since Pod::Man 2.1.0, which added the C option. Some +Pod::Man users use this option for better output on platforms known to support +Unicode, but since the defaults have not changed, people continued to +encounter (and file bug reports about) the poor default rendering. + +=item * + +Convert characters to troff C<\(xx> escapes. This requires maintaining a +large translation table and addresses only a tiny part of the problem, since +many Unicode characters have no standard troff name. B has the largest +list, but if one is willing to assume B is the formatter, the next +option is better. + +=item * + +Convert characters to groff C<\[uNNNN]> escapes. This is implemented as the +C encoding for those who want to use it, and is supported by both +B and B. However, it is no better than UTF-8 output for +portability to other implementations. See L for more +details. + +=item * + +Change the default output format to UTF-8 and ask those who want maximum +backward compatibility to explicitly select the old encoding. This fixes the +issue for most users at the cost of backwards compatibility. While the +rendering of non-ASCII characters is different on older systems that don't +support UTF-8, it's not always worse than the old output. + +=back + +Pod::Man 5.00 and later makes the last choice. This arguably produces worse +output when manual pages are formatted with B into PostScript or PDF, +but doing this is rare and normally manual, so the encoding can be changed in +those cases. The older output encoding is available by setting C to +C. + +=head2 Testing results + +Here is the results of testing C values of C and C on +various operating systems. The testing methodology was to create F +in the current directory, copy F or F from the +podlators 5.00 distribution to F, and then run: + + LANG=C.UTF-8 MANPATH=$(pwd)/man man 1 encoding + +If the locale is not explicitly set to one that includes UTF-8, the Unicode +characters were usually converted to ASCII (by, for example, dropping an +accent) or deleted or replaced with C<< >> if there was no conversion. + +Tested on 2022-09-25. Many thanks to the GCC Compile Farm project for access +to testing hosts. + + OS UTF-8 groff + ------------------ ------- ------- + AIX 7.1 no [1] no [2] + Alpine 3.15.0 yes yes + CentOS 7.9 yes yes + Debian 7 yes yes + FreeBSD 13.0 yes yes + NetBSD 9.2 yes yes + OpenBSD 7.1 yes yes + openSUSE Leap 15.4 yes yes + Solaris 10 yes no [2] + Solaris 11 no [3] no [3] + +I did not have access to a macOS system for testing, but since it uses +B, it's behavior is probably the same as the BSD hosts. + +Notes: + +=over 4 + +=item [1] + +Unicode characters were converted to one or two random ASCII characters +unrelated to the original character. -To put the output from any parse method into a string instead of a file -handle, call the output_string() method instead of output_fh(). +=item [2] -See L for more specific details on the methods available to -all derived parsers. +Unicode characters were shown as the body of the groff escape rather than the +indicated character (in other words, text like C<[u00EF]>). + +=item [3] + +Unicode characters were deleted entirely, as if they weren't there. Using +C instead of B to format the page showed the same results as +Solaris 10. Using C to format the page produced the +correct output. + +=back + +PostScript and PDF output using groff on a Debian 12 system do not support +combining accent marks or SMP characters due to a lack of support in the +default output font. + +Testing on additional platforms is welcome. Please let the author know if you +have additional results. =head1 DIAGNOSTICS @@ -1924,9 +2238,9 @@ option was set to C. =item PERL_CORE -If set and Encode is not available, silently fall back to non-UTF-8 mode -without complaining to standard error. This environment variable is set -during Perl core builds, which build Encode after podlators. Encode is +If set and Encode is not available, silently fall back to an encoding of +C without complaining to standard error. This environment variable is +set during Perl core builds, which build Encode after podlators. Encode is expected to not (yet) be available in that case. =item POD_MAN_DATE @@ -1955,65 +2269,104 @@ reliable if this variable overrode the t =back -=head1 BUGS +=head1 COMPATIBILITY -Encoding handling assumes that PerlIO is available and does not work -properly if it isn't. The C option is therefore not supported -unless Perl is built with PerlIO support. - -There is currently no way to turn off the guesswork that tries to format -unmarked text appropriately, and sometimes it isn't wanted (particularly -when using POD to document something other than Perl). Most of the work -toward fixing this has now been done, however, and all that's still needed -is a user interface. - -The NAME section should be recognized specially and index entries emitted -for everything in that section. This would have to be deferred until the -next section, since extraneous things in NAME tends to confuse various man -page processors. Currently, no index entries are emitted for anything in -NAME. +Pod::Man 1.02 (based on L) was the first version included with +Perl, in Perl 5.6.0. -Pod::Man doesn't handle font names longer than two characters. Neither do -most B implementations, but GNU troff does as an extension. It would -be nice to support as an option for those who want to use it. +The current API based on L was added in Pod::Man 2.00. Pod::Man +2.04 was included in Perl 5.9.3, the first version of Perl to incorporate +those changes. This is the first version that correctly supports all modern +POD syntax. The parse_from_filehandle() method was re-added for backward +compatibility in Pod::Man 2.09, included in Perl 5.9.4. + +Support for anchor text in LZ<><> links of type URL was added in Pod::Man +2.23, included in Perl 5.11.5. + +parse_lines(), parse_string_document(), and parse_file() set a default output +file handle of C if one was not already set as of Pod::Man 2.28, +included in Perl 5.19.5. + +Support for SOURCE_DATE_EPOCH and POD_MAN_DATE was added in Pod::Man 4.00, +included in Perl 5.23.7, and generated dates were changed to use UTC instead +of the local time zone. This is also the first release that aligned the +module version and the version of the podlators distribution. All modules +included in podlators, and the podlators distribution itself, share the same +version number from this point forward. + +Pod::Man 4.10, included in Perl 5.27.8, changed the formatting for manual page +references and function names to bold instead of italic, following the current +Linux manual page standard. + +Pod::Man 5.00 changed the default output encoding to UTF-8, overridable with +the new C option. It also fixed problems with bold or italic +extending too far when used with CZ<><> escapes, and began converting Unicode +zero-width spaces (U+200B) to the C<\:> *roff escape. It also dropped +attempts to add subtle formatting corrections in the output that would only be +visible when typeset with B, which had previously been a significant +source of bugs. + +=head1 BUGS -The preamble added to each output file is rather verbose, and most of it -is only necessary in the presence of non-ASCII characters. It would -ideally be nice if all of those definitions were only output if needed, -perhaps on the fly as the characters are used. +There are numerous bugs and language-specific assumptions in the nroff +fallbacks for accented characters in the C encoding. Since the point of +this encoding is backward compatibility with the output from earlier versions +of Pod::Man, and it is deprecated except when necessary to support old +systems, those bugs are unlikely to ever be fixed. -Pod::Man is excessively slow. +Pod::Man doesn't handle font names longer than two characters. Neither do +most B implementations, but groff does as an extension. It would be +nice to support as an option for those who want to use it. =head1 CAVEATS -If Pod::Man is given the C option, the encoding of its output file -handle will be forced to UTF-8 if possible, overriding any existing -encoding. This will be done even if the file handle is not created by -Pod::Man and was passed in from outside. This maintains consistency -regardless of PERL_UNICODE and other settings. - -The handling of hyphens and em dashes is somewhat fragile, and one may get -the wrong one under some circumstances. This should only matter for -B output. - -When and whether to use small caps is somewhat tricky, and Pod::Man doesn't -necessarily get it right. - -Converting neutral double quotes to properly matched double quotes doesn't -work unless there are no formatting codes between the quote marks. This -only matters for troff output. +=head2 Sentence spacing + +Pod::Man copies the input spacing verbatim to the output *roff document. This +means your output will be affected by how B generally handles sentence +spacing. + +B dates from an era in which it was standard to use two spaces after +sentences, and will always add two spaces after a line-ending period (or +similar punctuation) when reflowing text. For example, the following input: + + =pod + + One sentence. + Another sentence. + +will result in two spaces after the period when the text is reflowed. If you +use two spaces after sentences anyway, this will be consistent, although you +will have to be careful to not end a line with an abbreviation such as C +or C. Output will also be consistent if you use the *roff style guide +(and L) recommendation of putting a line +break after each sentence, although that will consistently produce two spaces +after each sentence, which may not be what you want. + +If you prefer one space after sentences (which is the more modern style), you +will unfortunately need to ensure that no line in the middle of a paragraph +ends in a period or similar sentence-ending paragraph. Otherwise, B +will add a two spaces after that sentence when reflowing, and your output +document will have inconsistent spacing. + +=head2 Hyphens + +The handling of hyphens versus dashes is somewhat fragile, and one may get a +the wrong one under some circumstances. This will normally only matter for +line breaking and possibly for troff output. =head1 AUTHOR -Russ Allbery , based I heavily on the original B -by Tom Christiansen . The modifications to work with -Pod::Simple instead of Pod::Parser were originally contributed by Sean Burke - (but I've since hacked them beyond recognition and all bugs -are mine). +Written by Russ Allbery , based on the original B by +Tom Christiansen . + +The modifications to work with Pod::Simple instead of Pod::Parser were +contributed by Sean Burke , but I've since hacked them beyond +recognition and all bugs are mine. =head1 COPYRIGHT AND LICENSE -Copyright 1999-2010, 2012-2019 Russ Allbery +Copyright 1999-2010, 2012-2020, 2022 Russ Allbery Substantial contributions by Sean Burke . @@ -2022,18 +2375,19 @@ under the same terms as Perl itself. =head1 SEE ALSO -L, L, L, L, L, -L, L +L, L, L, L, +L, L, L, L Ossanna, Joseph F., and Brian W. Kernighan. "Troff User's Manual," Computing Science Technical Report No. 54, AT&T Bell Laboratories. This is the best documentation of standard B and B. At the time of this writing, it's available at L. -The man page documenting the man macro set may be L instead of -L on your system. Also, please see L for extensive -documentation on writing manual pages if you've not done it before and -aren't familiar with the conventions. +The manual page documenting the man macro set may be L instead of +L on your system. + +See L for documentation on writing manual pages in POD if +you've not done it before and aren't familiar with the conventions. The current version of this module is always available from its web site at L. It is also part of the Index: gnu/usr.bin/perl/cpan/podlators/lib/Pod/ParseLink.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/podlators/lib/Pod/ParseLink.pm,v diff -u -p -a -u -p -r1.5 ParseLink.pm --- gnu/usr.bin/perl/cpan/podlators/lib/Pod/ParseLink.pm 1 Mar 2021 23:19:51 -0000 1.5 +++ gnu/usr.bin/perl/cpan/podlators/lib/Pod/ParseLink.pm 21 Feb 2024 15:47:00 -0000 @@ -13,17 +13,15 @@ package Pod::ParseLink; -use 5.008; +use 5.010; use strict; use warnings; -use vars qw(@EXPORT @ISA $VERSION); - use Exporter; -@ISA = qw(Exporter); -@EXPORT = qw(parselink); -$VERSION = '4.14'; +our @ISA = qw(Exporter); +our @EXPORT = qw(parselink); +our $VERSION = '5.01'; ############################################################################## # Implementation @@ -171,7 +169,7 @@ Russ Allbery =head1 COPYRIGHT AND LICENSE -Copyright 2001, 2008, 2009, 2014, 2018-2019 Russ Allbery +Copyright 2001, 2008, 2009, 2014, 2018-2019, 2022 Russ Allbery This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text.pm,v diff -u -p -a -u -p -r1.9 Text.pm --- gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text.pm 1 Mar 2021 23:19:51 -0000 1.9 +++ gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text.pm 21 Feb 2024 15:47:00 -0000 @@ -14,23 +14,20 @@ package Pod::Text; -use 5.008; +use 5.010; use strict; use warnings; -use vars qw(@ISA @EXPORT %ESCAPES $VERSION); - use Carp qw(carp croak); use Encode qw(encode); use Exporter (); use Pod::Simple (); -@ISA = qw(Pod::Simple Exporter); +our @ISA = qw(Pod::Simple Exporter); +our $VERSION = '5.01'; # We have to export pod2text for backward compatibility. -@EXPORT = qw(pod2text); - -$VERSION = '4.14'; +our @EXPORT = qw(pod2text); # Ensure that $Pod::Simple::nbsp and $Pod::Simple::shy are available. Code # taken from Pod::Simple 3.32, but was only added in 3.30. @@ -43,6 +40,11 @@ if ($Pod::Simple::VERSION ge 3.30) { $SHY = chr utf8::unicode_to_native(0xAD); } +# Import the ASCII constant from Pod::Simple. This is true iff we're in an +# ASCII-based universe (including such things as ISO 8859-1 and UTF-8), and is +# generally only false for EBCDIC. +BEGIN { *ASCII = \&Pod::Simple::ASCII } + ############################################################################## # Initialization ############################################################################## @@ -64,9 +66,6 @@ sub new { my $class = shift; my $self = $class->SUPER::new; - # Tell Pod::Simple to handle S<> by automatically inserting  . - $self->nbsp_for_S (1); - # Tell Pod::Simple to keep whitespace whenever possible. if ($self->can ('preserve_whitespace')) { $self->preserve_whitespace (1); @@ -89,16 +88,20 @@ sub new { my @opts = map { ("opt_$_", $opts{$_}) } keys %opts; %$self = (%$self, @opts); - # Send errors to stderr if requested. + # Backwards-compatibility support for the stderr option. if ($$self{opt_stderr} and not $$self{opt_errors}) { $$self{opt_errors} = 'stderr'; } delete $$self{opt_stderr}; - # Validate the errors parameter and act on it. - if (not defined $$self{opt_errors}) { - $$self{opt_errors} = 'pod'; + # Backwards-compatibility support for the utf8 option. + if ($$self{opt_utf8} && !$$self{opt_encoding}) { + $$self{opt_encoding} = 'UTF-8'; } + delete $$self{opt_utf8}; + + # Validate the errors parameter and act on it. + $$self{opt_errors} //= 'pod'; if ($$self{opt_errors} eq 'stderr' || $$self{opt_errors} eq 'die') { $self->no_errata_section (1); $self->complain_stderr (1); @@ -117,12 +120,12 @@ sub new { delete $$self{errors}; # Initialize various things from our parameters. - $$self{opt_alt} = 0 unless defined $$self{opt_alt}; - $$self{opt_indent} = 4 unless defined $$self{opt_indent}; - $$self{opt_margin} = 0 unless defined $$self{opt_margin}; - $$self{opt_loose} = 0 unless defined $$self{opt_loose}; - $$self{opt_sentence} = 0 unless defined $$self{opt_sentence}; - $$self{opt_width} = 76 unless defined $$self{opt_width}; + $$self{opt_alt} //= 0; + $$self{opt_indent} //= 4; + $$self{opt_margin} //= 0; + $$self{opt_loose} //= 0; + $$self{opt_sentence} //= 0; + $$self{opt_width} //= 76; # Figure out what quotes we'll be using for C<> text. $$self{opt_quotes} ||= '"'; @@ -138,6 +141,17 @@ sub new { croak qq(Invalid quote specification "$$self{opt_quotes}"); } + # Configure guesswork based on options. + my $guesswork = $self->{opt_guesswork} || q{}; + my %guesswork = map { $_ => 1 } split(m{,}xms, $guesswork); + if (!%guesswork || $guesswork{all}) { + $$self{GUESSWORK} = {quoting => 1}; + } elsif ($guesswork{none}) { + $$self{GUESSWORK} = {}; + } else { + $$self{GUESSWORK} = {%guesswork}; + } + # If requested, do something with the non-POD text. $self->code_handler (\&handle_code) if $$self{opt_code}; @@ -272,9 +286,7 @@ sub reformat { } # Output text to the output device. Replace non-breaking spaces with spaces -# and soft hyphens with nothing, and then try to fix the output encoding if -# necessary to match the input encoding unless UTF-8 output is forced. This -# preserves the traditional pass-through behavior of Pod::Text. +# and soft hyphens with nothing, and then determine the output encoding. sub output { my ($self, @text) = @_; my $text = join ('', @text); @@ -284,15 +296,39 @@ sub output { if ($SHY) { $text =~ s/$SHY//g; } - unless ($$self{opt_utf8}) { - my $encoding = $$self{encoding} || ''; - if ($encoding && $encoding ne $$self{ENCODING}) { - $$self{ENCODING} = $encoding; - eval { binmode ($$self{output_fh}, ":encoding($encoding)") }; - } - } + + # The logic used here is described in the POD documentation. Prefer the + # configured encoding, then the pass-through option of using the same + # encoding as the input, and then UTF-8, but commit to an encoding for the + # document. + # + # ENCODE says whether to encode or not and is turned off if there is a + # PerlIO encoding layer (in start_document). ENCODING is the encoding + # that we previously committed to and is cleared at the start of each + # document. if ($$self{ENCODE}) { - print { $$self{output_fh} } encode ('UTF-8', $text); + my $encoding = $$self{ENCODING}; + if (!$encoding) { + $encoding = $self->encoding(); + if (!$encoding && ASCII && $text =~ /[^\x00-\x7F]/) { + $encoding = 'UTF-8'; + } + if ($encoding) { + $$self{ENCODING} = $encoding; + } + } + if ($encoding) { + my $check = sub { + my ($char) = @_; + my $display = '"\x{' . hex($char) . '}"'; + my $error = "$display does not map to $$self{ENCODING}"; + $self->whine ($self->line_count(), $error); + return Encode::encode ($$self{ENCODING}, chr($char)); + }; + print { $$self{output_fh} } encode ($encoding, $text, $check); + } else { + print { $$self{output_fh} } $text; + } } else { print { $$self{output_fh} } $text; } @@ -322,24 +358,18 @@ sub start_document { $$self{MARGIN} = $margin; # Default left margin. $$self{PENDING} = [[]]; # Pending output. - # We have to redo encoding handling for each document. - $$self{ENCODING} = ''; - - # When UTF-8 output is set, check whether our output file handle already - # has a PerlIO encoding layer set. If it does not, we'll need to encode - # our output before printing it (handled in the output() sub). - $$self{ENCODE} = 0; - if ($$self{opt_utf8}) { - $$self{ENCODE} = 1; - eval { - my @options = (output => 1, details => 1); - my $flag = (PerlIO::get_layers ($$self{output_fh}, @options))[-1]; - if ($flag && ($flag & PerlIO::F_UTF8 ())) { - $$self{ENCODE} = 0; - $$self{ENCODING} = 'UTF-8'; - } - }; - } + # We have to redo encoding handling for each document. Check whether the + # output file handle already has a PerlIO encoding layer set and, if so, + # disable encoding. + $$self{ENCODE} = 1; + eval { + my @options = (output => 1, details => 1); + my $flag = (PerlIO::get_layers ($$self{output_fh}, @options))[-1]; + if ($flag && ($flag & PerlIO::F_UTF8 ())) { + $$self{ENCODE} = 0; + } + }; + $$self{ENCODING} = $$self{opt_encoding}; return ''; } @@ -383,8 +413,7 @@ sub item { # Calculate the indentation and margin. $fits is set to true if the tag # will fit into the margin of the paragraph given our indentation level. - my $indent = $$self{INDENTS}[-1]; - $indent = $$self{opt_indent} unless defined $indent; + my $indent = $$self{INDENTS}[-1] // $$self{opt_indent}; my $margin = ' ' x $$self{opt_margin}; my $tag_length = length ($self->strip_format ($tag)); my $fits = ($$self{MARGIN} - $indent >= $tag_length + 1); @@ -588,6 +617,13 @@ sub cmd_f { return $_[0]{alt} ? "\"$_[2] sub cmd_i { return '*' . $_[2] . '*' } sub cmd_x { return '' } +# Convert all internal whitespace to $NBSP. +sub cmd_s { + my ($self, $attrs, $text) = @_; + $text =~ s{ \s }{$NBSP}xmsg; + return $text; +} + # Apply a whole bunch of messy heuristics to not quote things that don't # benefit from being quoted. These originally come from Barrie Slaymaker and # largely duplicate code in Pod::Man. @@ -597,23 +633,35 @@ sub cmd_c { # A regex that matches the portion of a variable reference that's the # array or hash index, separated out just because we want to use it in # several places in the following regex. - my $index = '(?: \[.*\] | \{.*\} )?'; + my $index = '(?: \[[^]]+\] | \{[^}]+\} )?'; # Check for things that we don't want to quote, and if we find any of # them, return the string with just a font change and no quoting. + # + # Traditionally, Pod::Text has not quoted Perl variables, functions, + # numbers, or hex constants, but this is not always desirable. Make this + # optional on the quoting guesswork flag. + my $extra = qr{(?!)}xms; # never matches + if ($$self{GUESSWORK}{quoting}) { + $extra = qr{ + \$+ [\#^]? \S $index # special ($^F, $") + | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func + | [\$\@%&*]* [:\'\w]+ + (?: -> )? \(\s*[^\s,\)]*\s*\) # 0/1-arg func call + | [+-]? ( \d[\d.]* | \.\d+ ) + (?: [eE][+-]?\d+ )? # a number + | 0x [a-fA-F\d]+ # a hex constant + }xms; + } $text =~ m{ ^\s* (?: - ( [\'\`\"] ) .* \1 # already quoted - | \` .* \' # `quoted' - | \$+ [\#^]? \S $index # special ($^Foo, $") - | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func - | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call - | [+-]? ( \d[\d.]* | \.\d+ ) (?: [eE][+-]?\d+ )? # a number - | 0x [a-fA-F\d]+ # a hex constant + ( [\'\`\"] ) .* \1 # already quoted + | \` .* \' # `quoted' + | $extra ) \s*\z - }xo && return $text; + }xms and return $text; # If we didn't return, go ahead and quote the text. return $$self{opt_alt} @@ -766,7 +814,7 @@ __END__ =for stopwords alt stderr Allbery Sean Burke's Christiansen UTF-8 pre-Unicode utf8 nourls -parsers +parsers EBCDIC autodetecting superset unrepresentable FH NNN =head1 NAME @@ -785,67 +833,180 @@ Pod::Text - Convert POD data to formatte =head1 DESCRIPTION -Pod::Text is a module that can convert documentation in the POD format -(the preferred language for documenting Perl) into formatted text. It -uses no special formatting controls or codes whatsoever, and its output is -therefore suitable for nearly any device. +Pod::Text is a module that can convert documentation in the POD format (the +preferred language for documenting Perl) into formatted text. It uses no +special formatting controls or codes, and its output is therefore suitable for +nearly any device. -As a derived class from Pod::Simple, Pod::Text supports the same methods and -interfaces. See L for all the details; briefly, one creates a -new parser with C<< Pod::Text->new() >> and then normally calls parse_file(). +=head2 Encoding + +Pod::Text uses the following logic to choose an output encoding, in order: + +=over 4 + +=item 1. + +If a PerlIO encoding layer is set on the output file handle, do not do any +output encoding and will instead rely on the PerlIO encoding layer. + +=item 2. + +If the C or C options are set, use the output encoding +specified by those options. + +=item 3. + +If the input encoding of the POD source file was explicitly specified (using +C<=encoding>) or automatically detected by Pod::Simple, use that as the output +encoding as well. + +=item 4. + +Otherwise, if running on a non-EBCDIC system, use UTF-8 as the output +encoding. Since this is a superset of ASCII, this will result in ASCII output +unless the POD input contains non-ASCII characters without declaring or +autodetecting an encoding (usually via EZ<><> escapes). + +=item 5. + +Otherwise, for EBCDIC systems, output without doing any encoding and hope +this works. + +=back + +One caveat: Pod::Text has to commit to an output encoding the first time it +outputs a non-ASCII character, and then has to stick with it for consistency. +However, C<=encoding> commands don't have to be at the beginning of a POD +document. If someone uses a non-ASCII character early in a document with an +escape, such as EZ<><0xEF>, and then puts C<=encoding iso-8859-1> later, +ideally Pod::Text would follow rule 3 and output the entire document as ISO +8859-1. Instead, it will commit to UTF-8 following rule 4 as soon as it sees +that escape, and then stick with that encoding for the rest of the document. + +Unfortunately, there's no universally good choice for an output encoding. +Each choice will be incorrect in some circumstances. This approach was chosen +primarily for backwards compatibility. Callers should consider forcing the +output encoding via C if they have any knowledge about what encoding +the user may expect. + +In particular, consider importing the L module, if available, +and setting C to C to use an output encoding appropriate to +the user's locale. But be aware that if the user is not using locales or is +using a locale of C, Encode::Locale will set the output encoding to +US-ASCII. This will cause all non-ASCII characters will be replaced with C +and produce a flurry of warnings about unsupported characters, which may or +may not be what you want. + +=head1 CLASS METHODS -new() can take options, in the form of key/value pairs, that control the -behavior of the parser. The currently recognized options are: +=over 4 + +=item new(ARGS) + +Create a new Pod::Text object. ARGS should be a list of key/value pairs, +where the keys are chosen from the following. Each option is annotated with +the version of Pod::Text in which that option was added with its current +meaning. =over 4 =item alt -If set to a true value, selects an alternate output format that, among other -things, uses a different heading style and marks C<=item> entries with a +[2.00] If set to a true value, selects an alternate output format that, among +other things, uses a different heading style and marks C<=item> entries with a colon in the left margin. Defaults to false. =item code -If set to a true value, the non-POD parts of the input file will be included -in the output. Useful for viewing code documented with POD blocks with the -POD rendered and the code left intact. +[2.13] If set to a true value, the non-POD parts of the input file will be +included in the output. Useful for viewing code documented with POD blocks +with the POD rendered and the code left intact. + +=item encoding + +[5.00] Specifies the encoding of the output. The value must be an encoding +recognized by the L module (see L). If the output +contains characters that cannot be represented in this encoding, that is an +error that will be reported as configured by the C option. If error +handling is other than C, the unrepresentable character will be replaced +with the Encode substitution character (normally C). + +If the output file handle has a PerlIO encoding layer set, this parameter will +be ignored and no encoding will be done by Pod::Man. It will instead rely on +the encoding layer to make whatever output encoding transformations are +desired. + +WARNING: The input encoding of the POD source is independent from the output +encoding, and setting this option does not affect the interpretation of the +POD input. Unless your POD source is US-ASCII, its encoding should be +declared with the C<=encoding> command in the source, as near to the top of +the file as possible. If this is not done, Pod::Simple will will attempt to +guess the encoding and may be successful if it's Latin-1 or UTF-8, but it will +produce warnings. See L for more information. =item errors -How to report errors. C says to throw an exception on any POD -formatting error. C says to report errors on standard error, but -not to throw an exception. C says to include a POD ERRORS section -in the resulting documentation summarizing the errors. C ignores -POD errors entirely, as much as possible. +[3.17] How to report errors. C says to throw an exception on any POD +formatting error. C says to report errors on standard error, but not +to throw an exception. C says to include a POD ERRORS section in the +resulting documentation summarizing the errors. C ignores POD errors +entirely, as much as possible. The default is C. +=item guesswork + +[5.01] By default, Pod::Text applies some default formatting rules based on +guesswork and regular expressions that are intended to make writing Perl +documentation easier and require less explicit markup. These rules may not +always be appropriate, particularly for documentation that isn't about Perl. +This option allows turning all or some of it off. + +The special value C enables all guesswork. This is also the default for +backward compatibility reasons. The special value C disables all +guesswork. Otherwise, the value of this option should be a comma-separated +list of one or more of the following keywords: + +=over 4 + +=item quoting + +If no guesswork is enabled, any text enclosed in CZ<><> is surrounded by +double quotes in nroff (terminal) output unless the contents are already +quoted. When this guesswork is enabled, quote marks will also be suppressed +for Perl variables, function names, function calls, numbers, and hex +constants. + +=back + +Any unknown guesswork name is silently ignored (for potential future +compatibility), so be careful about spelling. + =item indent -The number of spaces to indent regular text, and the default indentation for -C<=over> blocks. Defaults to 4. +[2.00] The number of spaces to indent regular text, and the default +indentation for C<=over> blocks. Defaults to 4. =item loose -If set to a true value, a blank line is printed after a C<=head1> heading. -If set to false (the default), no blank line is printed after C<=head1>, -although one is still printed after C<=head2>. This is the default because -it's the expected formatting for manual pages; if you're formatting +[2.00] If set to a true value, a blank line is printed after a C<=head1> +heading. If set to false (the default), no blank line is printed after +C<=head1>, although one is still printed after C<=head2>. This is the default +because it's the expected formatting for manual pages; if you're formatting arbitrary text documents, setting this to true may result in more pleasing output. =item margin -The width of the left margin in spaces. Defaults to 0. This is the margin -for all text, including headings, not the amount by which regular text is -indented; for the latter, see the I option. To set the right +[2.21] The width of the left margin in spaces. Defaults to 0. This is the +margin for all text, including headings, not the amount by which regular text +is indented; for the latter, see the I option. To set the right margin, see the I option. =item nourls -Normally, LZ<><> formatting codes with a URL but anchor text are formatted -to show both the anchor text and the URL. In other words: +[3.17] Normally, LZ<><> formatting codes with a URL but anchor text are +formatted to show both the anchor text and the URL. In other words: L @@ -853,74 +1014,131 @@ is formatted as: foo -This option, if set to a true value, suppresses the URL when anchor text -is given, so this example would be formatted as just C. This can -produce less cluttered output in cases where the URLs are not particularly -important. +This option, if set to a true value, suppresses the URL when anchor text is +given, so this example would be formatted as just C. This can produce +less cluttered output in cases where the URLs are not particularly important. =item quotes -Sets the quote marks used to surround CE> text. If the value is a -single character, it is used as both the left and right quote. Otherwise, -it is split in half, and the first half of the string is used as the left -quote and the second is used as the right quote. +[4.00] Sets the quote marks used to surround CE> text. If the value is a +single character, it is used as both the left and right quote. Otherwise, it +is split in half, and the first half of the string is used as the left quote +and the second is used as the right quote. This may also be set to the special value C, in which case no quote marks are added around CE> text. =item sentence -If set to a true value, Pod::Text will assume that each sentence ends in two -spaces, and will try to preserve that spacing. If set to false, all -consecutive whitespace in non-verbatim paragraphs is compressed into a -single space. Defaults to false. +[3.00] If set to a true value, Pod::Text will assume that each sentence ends +in two spaces, and will try to preserve that spacing. If set to false, all +consecutive whitespace in non-verbatim paragraphs is compressed into a single +space. Defaults to false. =item stderr -Send error messages about invalid POD to standard error instead of -appending a POD ERRORS section to the generated output. This is -equivalent to setting C to C if C is not already -set. It is supported for backward compatibility. +[3.10] Send error messages about invalid POD to standard error instead of +appending a POD ERRORS section to the generated output. This is equivalent to +setting C to C if C is not already set. It is +supported for backward compatibility. =item utf8 -By default, Pod::Text uses the same output encoding as the input encoding -of the POD source (provided that Perl was built with PerlIO; otherwise, it -doesn't encode its output). If this option is given, the output encoding -is forced to UTF-8. - -Be aware that, when using this option, the input encoding of your POD -source should be properly declared unless it's US-ASCII. Pod::Simple will -attempt to guess the encoding and may be successful if it's Latin-1 or -UTF-8, but it will produce warnings. Use the C<=encoding> command to -declare the encoding. See L for more information. +[3.12] If this option is set to a true value, the output encoding is set to +UTF-8. This is equivalent to setting C to C if C +is not already set. It is supported for backward compatibility. =item width -The column at which to wrap text on the right-hand side. Defaults to 76. +[2.00] The column at which to wrap text on the right-hand side. Defaults to +76. + +=back + +=back + +=head1 INSTANCE METHODS + +As a derived class from Pod::Simple, Pod::Text supports the same methods and +interfaces. See L for all the details. This section summarizes +the most-frequently-used methods and the ones added by Pod::Text. + +=over 4 + +=item output_fh(FH) + +Direct the output from parse_file(), parse_lines(), or parse_string_document() +to the file handle FH instead of C. + +=item output_string(REF) + +Direct the output from parse_file(), parse_lines(), or parse_string_document() +to the scalar variable pointed to by REF, rather than C. For example: + + my $man = Pod::Man->new(); + my $output; + $man->output_string(\$output); + $man->parse_file('/some/input/file'); + +Be aware that the output in that variable will already be encoded (see +L). + +=item parse_file(PATH) + +Read the POD source from PATH and format it. By default, the output is sent +to C, but this can be changed with the output_fh() or output_string() +methods. + +=item parse_from_file(INPUT, OUTPUT) + +=item parse_from_filehandle(FH, OUTPUT) + +Read the POD source from INPUT, format it, and output the results to OUTPUT. + +parse_from_filehandle() is provided for backward compatibility with older +versions of Pod::Man. parse_from_file() should be used instead. + +=item parse_lines(LINES[, ...[, undef]]) + +Parse the provided lines as POD source, writing the output to either C +or the file handle set with the output_fh() or output_string() methods. This +method can be called repeatedly to provide more input lines. An explicit +C should be passed to indicate the end of input. + +This method expects raw bytes, not decoded characters. + +=item parse_string_document(INPUT) + +Parse the provided scalar variable as POD source, writing the output to either +C or the file handle set with the output_fh() or output_string() +methods. + +This method expects raw bytes, not decoded characters. =back -The standard Pod::Simple method parse_file() takes one argument naming the -POD file to read from. By default, the output is sent to C, but -this can be changed with the output_fh() method. - -The standard Pod::Simple method parse_from_file() takes up to two -arguments, the first being the input file to read POD from and the second -being the file to write the formatted output to. - -You can also call parse_lines() to parse an array of lines or -parse_string_document() to parse a document already in memory. As with -parse_file(), parse_lines() and parse_string_document() default to sending -their output to C unless changed with the output_fh() method. Be -aware that parse_lines() and parse_string_document() both expect raw bytes, -not decoded characters. +=head1 FUNCTIONS -To put the output from any parse method into a string instead of a file -handle, call the output_string() method instead of output_fh(). +Pod::Text exports one function for backward compatibility with older versions. +This function is deprecated; instead, use the object-oriented interface +described above. -See L for more specific details on the methods available to -all derived parsers. +=over 4 + +=item pod2text([[-a,] [-NNN,]] INPUT[, OUTPUT]) + +Convert the POD source from INPUT to text and write it to OUTPUT. If OUTPUT +is not given, defaults to C. INPUT can be any expression supported as +the second argument to two-argument open(). + +If C<-a> is given as an initial argument, pass the C option to the +Pod::Text constructor. This enables alternative formatting. + +If C<-NNN> is given as an initial argument, pass the C option to the +Pod::Text constructor with the number C as its argument. This sets the +wrap line width to NNN. + +=back =head1 DIAGNOSTICS @@ -955,61 +1173,66 @@ option was set to C. =back -=head1 BUGS +=head1 COMPATIBILITY -Encoding handling assumes that PerlIO is available and does not work -properly if it isn't. The C option is therefore not supported -unless Perl is built with PerlIO support. - -=head1 CAVEATS - -If Pod::Text is given the C option, the encoding of its output file -handle will be forced to UTF-8 if possible, overriding any existing -encoding. This will be done even if the file handle is not created by -Pod::Text and was passed in from outside. This maintains consistency -regardless of PERL_UNICODE and other settings. - -If the C option is not given, the encoding of its output file handle -will be forced to the detected encoding of the input POD, which preserves -whatever the input text is. This ensures backward compatibility with -earlier, pre-Unicode versions of this module, without large numbers of -Perl warnings. - -This is not ideal, but it seems to be the best compromise. If it doesn't -work for you, please let me know the details of how it broke. - -=head1 NOTES - -This is a replacement for an earlier Pod::Text module written by Tom -Christiansen. It has a revamped interface, since it now uses Pod::Simple, -but an interface roughly compatible with the old Pod::Text::pod2text() -function is still available. Please change to the new calling convention, -though. - -The original Pod::Text contained code to do formatting via termcap -sequences, although it wasn't turned on by default and it was problematic to -get it to work at all. This rewrite doesn't even try to do that, but a -subclass of it does. Look for L. +Pod::Text 2.03 (based on L) was the first version of this module +included with Perl, in Perl 5.6.0. Earlier versions of Perl had a different +Pod::Text module, with a different API. + +The current API based on L was added in Pod::Text 3.00. +Pod::Text 3.01 was included in Perl 5.9.3, the first version of Perl to +incorporate those changes. This is the first version that correctly supports +all modern POD syntax. The parse_from_filehandle() method was re-added for +backward compatibility in Pod::Text 3.07, included in Perl 5.9.4. + +Pod::Text 3.12, included in Perl 5.10.1, first implemented the current +practice of attempting to match the default output encoding with the input +encoding of the POD source, unless overridden by the C option or (added +later) the C option. + +Support for anchor text in LZ<><> links of type URL was added in Pod::Text +3.14, included in Perl 5.11.5. + +parse_lines(), parse_string_document(), and parse_file() set a default output +file handle of C if one was not already set as of Pod::Text 3.18, +included in Perl 5.19.5. + +Pod::Text 4.00, included in Perl 5.23.7, aligned the module version and the +version of the podlators distribution. All modules included in podlators, and +the podlators distribution itself, share the same version number from this +point forward. + +Pod::Text 4.09, included in Perl 5.25.7, fixed a serious bug on EBCDIC +systems, present in all versions back to 3.00, that would cause opening +brackets to disappear. + +Pod::Text 5.00 now defaults, on non-EBCDIC systems, to UTF-8 encoding if it +sees a non-ASCII character in the input and the input encoding is not +specified. It also commits to an encoding with the first non-ASCII character +and does not change the output encoding if the input encoding changes. The +L module is now used for all output encoding rather than PerlIO +layers, which fixes earlier problems with output to scalars. =head1 AUTHOR -Russ Allbery , based I heavily on the original -Pod::Text by Tom Christiansen and its conversion to -Pod::Parser by Brad Appleton . Sean Burke's initial -conversion of Pod::Man to use Pod::Simple provided much-needed guidance on -how to use Pod::Simple. +Russ Allbery , based I heavily on the original Pod::Text +by Tom Christiansen and its conversion to Pod::Parser +by Brad Appleton . Sean Burke's initial conversion of +Pod::Man to use Pod::Simple provided much-needed guidance on how to use +Pod::Simple. =head1 COPYRIGHT AND LICENSE -Copyright 1999-2002, 2004, 2006, 2008-2009, 2012-2016, 2018-2019 Russ Allbery - +Copyright 1999-2002, 2004, 2006, 2008-2009, 2012-2016, 2018-2019, 2022 Russ +Allbery This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO -L, L, L, L +L, L, L, +L, L, L The current version of this module is always available from its web site at L. It is also part of the Index: gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Color.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Color.pm,v diff -u -p -a -u -p -r1.5 Color.pm --- gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Color.pm 1 Mar 2021 23:19:51 -0000 1.5 +++ gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Color.pm 21 Feb 2024 15:47:00 -0000 @@ -12,18 +12,15 @@ package Pod::Text::Color; -use 5.008; +use 5.010; use strict; use warnings; use Pod::Text (); use Term::ANSIColor qw(color colored); -use vars qw(@ISA $VERSION); - -@ISA = qw(Pod::Text); - -$VERSION = '4.14'; +our @ISA = qw(Pod::Text); +our $VERSION = '5.01'; ############################################################################## # Overrides @@ -170,11 +167,22 @@ options. Term::ANSIColor is used to get colors and therefore must be installed to use this module. -=head1 BUGS +=head1 COMPATIBILITY + +Pod::Text::Color 0.05 (based on L) was the first version of this +module included with Perl, in Perl 5.6.0. -This is just a basic proof of concept. It should be seriously expanded to -support configurable coloration via options passed to the constructor, and -B should be taught about those. +The current API based on L was added in Pod::Text::Color 2.00. +Pod::Text::Color 2.01 was included in Perl 5.9.3, the first version of Perl to +incorporate those changes. + +Several problems with wrapping and line length were fixed as recently as +Pod::Text::Color 4.11, included in Perl 5.29.1. + +This module inherits its API and most behavior from Pod::Text, so the details +in L also apply. Pod::Text and Pod::Text::Color have +had the same module version since 4.00, included in Perl 5.23.7. (They +unfortunately diverge in confusing ways prior to that.) =head1 AUTHOR @@ -182,7 +190,7 @@ Russ Allbery . =head1 COPYRIGHT AND LICENSE -Copyright 1999, 2001, 2004, 2006, 2008, 2009, 2018-2019 Russ Allbery +Copyright 1999, 2001, 2004, 2006, 2008, 2009, 2018-2019, 2022 Russ Allbery This program is free software; you may redistribute it and/or modify it Index: gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Overstrike.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Overstrike.pm,v diff -u -p -a -u -p -r1.5 Overstrike.pm --- gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Overstrike.pm 1 Mar 2021 23:19:51 -0000 1.5 +++ gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Overstrike.pm 21 Feb 2024 15:47:00 -0000 @@ -19,17 +19,14 @@ package Pod::Text::Overstrike; -use 5.008; +use 5.010; use strict; use warnings; -use vars qw(@ISA $VERSION); - use Pod::Text (); -@ISA = qw(Pod::Text); - -$VERSION = '4.14'; +our @ISA = qw(Pod::Text); +our $VERSION = '5.01'; ############################################################################## # Overrides @@ -176,6 +173,22 @@ Currently, the outermost formatting inst underlined text inside a region of bold text is displayed as simply bold. There may be some better approach possible. +=head1 COMPATIBILITY + +Pod::Text::Overstrike 1.01 (based on L) was the first version of +this module included with Perl, in Perl 5.6.1. + +The current API based on L was added in Pod::Text::Overstrike +2.00, included in Perl 5.9.3. + +Several problems with wrapping and line length were fixed as recently as +Pod::Text::Overstrike 2.04, included in Perl 5.11.5. + +This module inherits its API and most behavior from Pod::Text, so the details +in L also apply. Pod::Text and Pod::Text::Overstrike +have had the same module version since 4.00, included in Perl 5.23.7. (They +unfortunately diverge in confusing ways prior to that.) + =head1 AUTHOR Originally written by Joe Smith , using the framework @@ -185,7 +198,7 @@ created by Russ Allbery . Copyright 2000 by Joe Smith -Copyright 2001, 2004, 2008, 2014, 2018-2019 by Russ Allbery +Copyright 2001, 2004, 2008, 2014, 2018-2019, 2022 by Russ Allbery This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Termcap.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Termcap.pm,v diff -u -p -a -u -p -r1.5 Termcap.pm --- gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Termcap.pm 1 Mar 2021 23:19:51 -0000 1.5 +++ gnu/usr.bin/perl/cpan/podlators/lib/Pod/Text/Termcap.pm 21 Feb 2024 15:47:00 -0000 @@ -12,7 +12,7 @@ package Pod::Text::Termcap; -use 5.008; +use 5.010; use strict; use warnings; @@ -20,11 +20,8 @@ use Pod::Text (); use POSIX (); use Term::Cap; -use vars qw(@ISA $VERSION); - -@ISA = qw(Pod::Text); - -$VERSION = '4.14'; +our @ISA = qw(Pod::Text); +our $VERSION = '5.01'; ############################################################################## # Overrides @@ -204,13 +201,13 @@ sub wrap { 1; __END__ +=for stopwords +ECMA-48 VT100 Allbery Solaris TERMPATH unformatted + =head1 NAME Pod::Text::Termcap - Convert POD data to ASCII text with format escapes -=for stopwords -ECMA-48 VT100 Allbery Solaris TERMPATH - =head1 SYNOPSIS use Pod::Text::Termcap; @@ -235,14 +232,37 @@ and how to override that behavior if nec strings for bold and underscore formatting, that formatting is skipped, resulting in the same output as Pod::Text. +=head1 COMPATIBILITY + +Pod::Text::Termcap 0.04 (based on L) was the first version of +this module included with Perl, in Perl 5.6.0. + +The current API based on L was added in Pod::Text::Termcap 2.00. +Pod::Text::Termcap 2.01 was included in Perl 5.9.3, the first version of Perl +to incorporate those changes. + +Several problems with wrapping and line length were fixed as recently as +Pod::Text::Termcap 4.11, included in Perl 5.29.1. + +Pod::Text::Termcap 4.13 stopped setting the TERMPATH environment variable +during module load. It also stopped falling back on VT100 escape sequences if +Term::Cap was not able to find usable escape sequences, instead producing +unformatted output for better results on dumb terminals. The next version to +be incorporated into Perl, 4.14, was included in Perl 5.31.8. + +This module inherits its API and most behavior from Pod::Text, so the details +in L also apply. Pod::Text and Pod::Text::Termcap +have had the same module version since 4.00, included in Perl 5.23.7. (They +unfortunately diverge in confusing ways prior to that.) + =head1 AUTHOR Russ Allbery =head1 COPYRIGHT AND LICENSE -Copyright 1999, 2001-2002, 2004, 2006, 2008-2009, 2014-2015, 2018-2019 Russ -Allbery +Copyright 1999, 2001-2002, 2004, 2006, 2008-2009, 2014-2015, 2018-2019, 2022 +Russ Allbery This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself. Index: gnu/usr.bin/perl/cpan/podlators/scripts/pod2man.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/cpan/podlators/scripts/pod2man.PL,v diff -u -p -a -u -p -r1.17 pod2man.PL --- gnu/usr.bin/perl/cpan/podlators/scripts/pod2man.PL 15 Feb 2023 01:38:22 -0000 1.17 +++ gnu/usr.bin/perl/cpan/podlators/scripts/pod2man.PL 21 Feb 2024 15:47:00 -0000 @@ -38,7 +38,7 @@ print "Extracting $file (with variable s print {$out} <<"PREAMBLE" or die "Cannot write to $file: $!\n"; $Config{startperl} eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}' - if \$running_under_some_shell; + if 0; # ^ Run only under a shell PREAMBLE # In the following, Perl variables are not expanded during extraction. @@ -71,13 +71,12 @@ my $stdin; # Parse our options, trying to retain backward compatibility with pod2man but # allowing short forms as well. --lax is currently ignored. my %options; -$options{utf8} = 1; Getopt::Long::config ('bundling_override'); -GetOptions (\%options, 'center|c=s', 'date|d=s', 'errors=s', 'fixed=s', - 'fixedbold=s', 'fixeditalic=s', 'fixedbolditalic=s', 'help|h', - 'lax|l', 'lquote=s', 'name|n=s', 'nourls', 'official|o', - 'quotes|q=s', 'release|r=s', 'rquote=s', 'section|s=s', 'stderr', - 'verbose|v', 'utf8|u!') +GetOptions (\%options, 'center|c=s', 'date|d=s', 'encoding|e=s', 'errors=s', + 'fixed=s', 'fixedbold=s', 'fixeditalic=s', 'fixedbolditalic=s', + 'guesswork=s', 'help|h', 'lax|l', 'language=s', 'lquote=s', + 'name|n=s', 'nourls', 'official|o', 'quotes|q=s', 'release|r=s', + 'rquote=s', 'section|s=s', 'stderr', 'verbose|v', 'utf8|u') or exit 1; pod2usage (0) if $options{help}; @@ -127,9 +126,9 @@ exit $status; __END__ =for stopwords -en em --stderr stderr --no-utf8 UTF-8 overdo markup MT-LEVEL Allbery Solaris URL +en em --stderr stderr --utf8 UTF-8 overdo markup MT-LEVEL Allbery Solaris URL troff troff-specific formatters uppercased Christiansen --nourls UTC prepend -lquote rquote +lquote rquote unrepresentable mandoc manref EBCDIC =head1 NAME @@ -137,118 +136,221 @@ pod2man - Convert POD data to formatted =head1 SYNOPSIS -pod2man [B<--center>=I] [B<--date>=I] [B<--errors>=I I I have no clue what this does. Strips function prefixes? + +=item B + +Normally ExtUtils::ParseXS will terminate the program with an C after +printing the details of the exception to STDERR via (warn). This can be awkward +when it is used programmatically and not via xsubpp, so this option can be used +to cause it to die instead by providing a true value. When not provided this +defaults to the value of C<$ExtUtils::ParseXS::DIE_ON_ERROR> which in turn +defaults to false. =back Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps.pm,v diff -u -p -a -u -p -r1.5 Typemaps.pm --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps.pm 15 Feb 2023 01:36:27 -0000 1.5 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package ExtUtils::Typemaps; use 5.006001; use strict; use warnings; -our $VERSION = '3.45'; +our $VERSION = '3.51'; require ExtUtils::ParseXS; require ExtUtils::ParseXS::Constants; @@ -378,7 +378,7 @@ sub remove_inputmap { return $self->_remove($xstype, $self->{input_section}, $self->{input_lookup}); } -=head2 remove_inputmap +=head2 remove_outputmap Removes an C entry from the typemap. Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Constants.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Constants.pm,v diff -u -p -a -u -p -r1.6 Constants.pm --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Constants.pm 15 Feb 2023 01:36:28 -0000 1.6 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Constants.pm 21 Feb 2024 15:47:01 -0000 @@ -3,7 +3,7 @@ use strict; use warnings; use Symbol; -our $VERSION = '3.45'; +our $VERSION = '3.51'; =head1 NAME Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/CountLines.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/CountLines.pm,v diff -u -p -a -u -p -r1.6 CountLines.pm --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/CountLines.pm 15 Feb 2023 01:36:28 -0000 1.6 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/CountLines.pm 21 Feb 2024 15:47:01 -0000 @@ -1,7 +1,7 @@ package ExtUtils::ParseXS::CountLines; use strict; -our $VERSION = '3.45'; +our $VERSION = '3.51'; our $SECTION_END_MARKER; Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Eval.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Eval.pm,v diff -u -p -a -u -p -r1.6 Eval.pm --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Eval.pm 15 Feb 2023 01:36:28 -0000 1.6 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Eval.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package ExtUtils::ParseXS::Eval; use strict; use warnings; -our $VERSION = '3.45'; +our $VERSION = '3.51'; =head1 NAME Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Utilities.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Utilities.pm,v diff -u -p -a -u -p -r1.12 Utilities.pm --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Utilities.pm 15 Feb 2023 01:36:28 -0000 1.12 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/ParseXS/Utilities.pm 21 Feb 2024 15:47:01 -0000 @@ -5,7 +5,7 @@ use Exporter; use File::Spec; use ExtUtils::ParseXS::Constants (); -our $VERSION = '3.45'; +our $VERSION = '3.51'; our (@ISA, @EXPORT_OK); @ISA = qw(Exporter); @@ -21,6 +21,7 @@ our (@ISA, @EXPORT_OK); analyze_preprocessor_statements set_cond Warn + WarnHint current_line_number blurt death @@ -654,18 +655,85 @@ sub current_line_number { =item * Purpose +Print warnings with line number details at the end. + =item * Arguments +List of text to output. + =item * Return Value +None. + =back =cut sub Warn { + my ($self)=shift; + $self->WarnHint(@_,undef); +} + +=head2 C + +=over 4 + +=item * Purpose + +Prints warning with line number details. The last argument is assumed +to be a hint string. + +=item * Arguments + +List of strings to warn, followed by one argument representing a hint. +If that argument is defined then it will be split on newlines and output +line by line after the main warning. + +=item * Return Value + +None. + +=back + +=cut + +sub WarnHint { + warn _MsgHint(@_); +} + +=head2 C<_MsgHint()> + +=over 4 + +=item * Purpose + +Constructs an exception message with line number details. The last argument is +assumed to be a hint string. + +=item * Arguments + +List of strings to warn, followed by one argument representing a hint. +If that argument is defined then it will be split on newlines and concatenated +line by line (parenthesized) after the main message. + +=item * Return Value + +The constructed string. + +=back + +=cut + + +sub _MsgHint { my $self = shift; + my $hint = pop; my $warn_line_number = $self->current_line_number(); - print STDERR "@_ in $self->{filename}, line $warn_line_number\n"; + my $ret = join("",@_) . " in $self->{filename}, line $warn_line_number\n"; + if ($hint) { + $ret .= " ($_)\n" for split /\n/, $hint; + } + return $ret; } =head2 C @@ -703,8 +771,13 @@ sub blurt { =cut sub death { - my $self = shift; - $self->Warn(@_); + my ($self) = (@_); + my $message = _MsgHint(@_,""); + if ($self->{die_on_error}) { + die $message; + } else { + warn $message; + } exit 1; } Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Cmd.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Cmd.pm,v diff -u -p -a -u -p -r1.5 Cmd.pm --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Cmd.pm 15 Feb 2023 01:36:28 -0000 1.5 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Cmd.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package ExtUtils::Typemaps::Cmd; use 5.006001; use strict; use warnings; -our $VERSION = '3.45'; +our $VERSION = '3.51'; use ExtUtils::Typemaps; Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/InputMap.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/InputMap.pm,v diff -u -p -a -u -p -r1.5 InputMap.pm --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/InputMap.pm 15 Feb 2023 01:36:28 -0000 1.5 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/InputMap.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package ExtUtils::Typemaps::InputMap; use 5.006001; use strict; use warnings; -our $VERSION = '3.45'; +our $VERSION = '3.51'; =head1 NAME Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/OutputMap.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/OutputMap.pm,v diff -u -p -a -u -p -r1.5 OutputMap.pm --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/OutputMap.pm 15 Feb 2023 01:36:28 -0000 1.5 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/OutputMap.pm 21 Feb 2024 15:47:01 -0000 @@ -2,7 +2,7 @@ package ExtUtils::Typemaps::OutputMap; use 5.006001; use strict; use warnings; -our $VERSION = '3.45'; +our $VERSION = '3.51'; =head1 NAME Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Type.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Type.pm,v diff -u -p -a -u -p -r1.5 Type.pm --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Type.pm 15 Feb 2023 01:36:28 -0000 1.5 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/lib/ExtUtils/Typemaps/Type.pm 21 Feb 2024 15:47:01 -0000 @@ -4,7 +4,7 @@ use strict; use warnings; require ExtUtils::Typemaps; -our $VERSION = '3.45'; +our $VERSION = '3.51'; =head1 NAME Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/001-basic.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/001-basic.t,v diff -u -p -a -u -p -r1.1.1.4 001-basic.t --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/001-basic.t 15 Feb 2023 01:32:55 -0000 1.1.1.4 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/001-basic.t 21 Feb 2024 15:47:01 -0000 @@ -1,7 +1,7 @@ #!/usr/bin/perl use strict; -use Test::More tests => 18; +use Test::More tests => 30; use Config; use DynaLoader; use ExtUtils::CBuilder; @@ -15,7 +15,10 @@ require_ok( 'ExtUtils::ParseXS' ); chdir('t') if -d 't'; push @INC, '.'; -use Carp; $SIG{__WARN__} = \&Carp::cluck; +$ExtUtils::ParseXS::DIE_ON_ERROR = 1; +$ExtUtils::ParseXS::AUTHOR_WARNINGS = 1; + +use Carp; #$SIG{__WARN__} = \&Carp::cluck; # The linker on some platforms doesn't like loading libraries using relative # paths. Android won't find relative paths, and system perl on macOS will @@ -91,6 +94,7 @@ is( $seen, 1, "Line numbers created in o local $/ = undef; seek($IN, 0, 0); my $filecontents = <$IN>; + $filecontents =~ s/^#if defined\(__HP_cc\).*\n#.*\n#endif\n//gm; my $good_T_BOOL_re = qr|\QXS_EUPXS(XS_XSTest_T_BOOL)\E .+? @@ -188,6 +192,182 @@ my $stderr = PrimitiveCapture::capture_s }); like $stderr, '/No INPUT definition/', "Exercise typemap error"; } +##################################################################### + +{ # fourth block: https://github.com/Perl/perl5/issues/19661 + my $pxs = ExtUtils::ParseXS->new; + tie *FH, 'Foo'; + my ($stderr, $filename); + { + $filename = 'XSFalsePositive.xs'; + $stderr = PrimitiveCapture::capture_stderr(sub { + $pxs->process_file(filename => $filename, output => \*FH, prototypes => 1); + }); + TODO: { + local $TODO = 'GH 19661'; + unlike $stderr, + qr/Warning: duplicate function definition 'do' detected in \Q$filename\E/, + "No 'duplicate function definition' warning observed in $filename"; + } + } + { + $filename = 'XSFalsePositive2.xs'; + $stderr = PrimitiveCapture::capture_stderr(sub { + $pxs->process_file(filename => $filename, output => \*FH, prototypes => 1); + }); + TODO: { + local $TODO = 'GH 19661'; + unlike $stderr, + qr/Warning: duplicate function definition 'do' detected in \Q$filename\E/, + "No 'duplicate function definition' warning observed in $filename"; + } + } +} + +##################################################################### + +{ # tight cpp directives + my $pxs = ExtUtils::ParseXS->new; + tie *FH, 'Foo'; + my $stderr = PrimitiveCapture::capture_stderr(sub { eval { + $pxs->process_file( + filename => 'XSTightDirectives.xs', + output => \*FH, + prototypes => 1); + } or warn $@ }); + my $content = tied(*FH)->{buf}; + my $count = 0; + $count++ while $content=~/^XS_EUPXS\(XS_My_do\)\n\{/mg; + is $stderr, undef, "No error expected from TightDirectives.xs"; + is $count, 2, "Saw XS_MY_do definition the expected number of times"; +} + +{ # Alias check + my $pxs = ExtUtils::ParseXS->new; + tie *FH, 'Foo'; + my $stderr = PrimitiveCapture::capture_stderr(sub { + $pxs->process_file( + filename => 'XSAlias.xs', + output => \*FH, + prototypes => 1); + }); + my $content = tied(*FH)->{buf}; + my $count = 0; + $count++ while $content=~/^XS_EUPXS\(XS_My_do\)\n\{/mg; + is $stderr, + "Warning: Aliases 'pox' and 'dox', 'lox' have" + . " identical values of 1 in XSAlias.xs, line 9\n" + . " (If this is deliberate use a symbolic alias instead.)\n" + . "Warning: Conflicting duplicate alias 'pox' changes" + . " definition from '1' to '2' in XSAlias.xs, line 10\n" + . "Warning: Aliases 'docks' and 'dox', 'lox' have" + . " identical values of 1 in XSAlias.xs, line 11\n" + . "Warning: Aliases 'xunx' and 'do' have identical values" + . " of 0 - the base function in XSAlias.xs, line 13\n", + "Saw expected warnings from XSAlias.xs in AUTHOR_WARNINGS mode"; + + my $expect = quotemeta(<<'EOF_CONTENT'); + cv = newXSproto_portable("My::dachs", XS_My_do, file, "$"); + XSANY.any_i32 = 1; + cv = newXSproto_portable("My::do", XS_My_do, file, "$"); + XSANY.any_i32 = 0; + cv = newXSproto_portable("My::docks", XS_My_do, file, "$"); + XSANY.any_i32 = 1; + cv = newXSproto_portable("My::dox", XS_My_do, file, "$"); + XSANY.any_i32 = 1; + cv = newXSproto_portable("My::lox", XS_My_do, file, "$"); + XSANY.any_i32 = 1; + cv = newXSproto_portable("My::pox", XS_My_do, file, "$"); + XSANY.any_i32 = 2; + cv = newXSproto_portable("My::xukes", XS_My_do, file, "$"); + XSANY.any_i32 = 0; + cv = newXSproto_portable("My::xunx", XS_My_do, file, "$"); + XSANY.any_i32 = 0; +EOF_CONTENT + $expect=~s/(?:\\[ ])+/\\s+/g; + $expect=qr/$expect/; + like $content, $expect, "Saw expected alias initialization"; + + #diag $content; +} +{ # Alias check with no dev warnings. + my $pxs = ExtUtils::ParseXS->new; + tie *FH, 'Foo'; + my $stderr = PrimitiveCapture::capture_stderr(sub { + $pxs->process_file( + filename => 'XSAlias.xs', + output => \*FH, + prototypes => 1, + author_warnings => 0); + }); + my $content = tied(*FH)->{buf}; + my $count = 0; + $count++ while $content=~/^XS_EUPXS\(XS_My_do\)\n\{/mg; + is $stderr, + "Warning: Conflicting duplicate alias 'pox' changes" + . " definition from '1' to '2' in XSAlias.xs, line 10\n", + "Saw expected warnings from XSAlias.xs"; + + my $expect = quotemeta(<<'EOF_CONTENT'); + cv = newXSproto_portable("My::dachs", XS_My_do, file, "$"); + XSANY.any_i32 = 1; + cv = newXSproto_portable("My::do", XS_My_do, file, "$"); + XSANY.any_i32 = 0; + cv = newXSproto_portable("My::docks", XS_My_do, file, "$"); + XSANY.any_i32 = 1; + cv = newXSproto_portable("My::dox", XS_My_do, file, "$"); + XSANY.any_i32 = 1; + cv = newXSproto_portable("My::lox", XS_My_do, file, "$"); + XSANY.any_i32 = 1; + cv = newXSproto_portable("My::pox", XS_My_do, file, "$"); + XSANY.any_i32 = 2; + cv = newXSproto_portable("My::xukes", XS_My_do, file, "$"); + XSANY.any_i32 = 0; + cv = newXSproto_portable("My::xunx", XS_My_do, file, "$"); + XSANY.any_i32 = 0; +EOF_CONTENT + $expect=~s/(?:\\[ ])+/\\s+/g; + $expect=qr/$expect/; + like $content, $expect, "Saw expected alias initialization"; + + #diag $content; +} +{ + my $file = $INC{"ExtUtils/ParseXS.pm"}; + $file=~s!ExtUtils/ParseXS\.pm\z!perlxs.pod!; + open my $fh, "<", $file + or die "Failed to open '$file' for read:$!"; + my $pod_version = ""; + while (defined(my $line= readline($fh))) { + if ($line=~/\(also known as C\)\s+(\d+\.\d+)/) { + $pod_version = $1; + last; + } + } + close $fh; + ok($pod_version, "Found the version from perlxs.pod"); + is($pod_version, $ExtUtils::ParseXS::VERSION, + "The version in perlxs.pod should match the version of ExtUtils::ParseXS"); +} + +{ + my $pxs = ExtUtils::ParseXS->new; + tie *FH, 'Foo'; + my $exception; + my $stderr = PrimitiveCapture::capture_stderr(sub { + eval { + $pxs->process_file( + filename => "XSNoMap.xs", + output => \*FH, + ); + 1; + } or $exception = $@; + }); + is($stderr, undef, "should fail to parse"); + like($exception, qr/Could not find a typemap for C type 'S \*'/, + "check we throw rather than trying to deref '2'"); +} + ##################################################################### sub Foo::TIEHANDLE { bless {}, 'Foo' } Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/002-more.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/002-more.t,v diff -u -p -a -u -p -r1.1.1.5 002-more.t --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/002-more.t 15 Feb 2023 01:32:55 -0000 1.1.1.5 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/002-more.t 21 Feb 2024 15:47:01 -0000 @@ -19,7 +19,7 @@ ExtUtils::ParseXS->import('process_file' chdir 't' if -d 't'; push @INC, '.'; -use Carp; $SIG{__WARN__} = \&Carp::cluck; +use Carp; #$SIG{__WARN__} = \&Carp::cluck; # See the comments about this in 001-basics.t @INC = map { File::Spec->rel2abs($_) } @INC; Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/003-usage.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/003-usage.t,v diff -u -p -a -u -p -r1.1.1.4 003-usage.t --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/003-usage.t 15 Feb 2023 01:32:55 -0000 1.1.1.4 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/003-usage.t 21 Feb 2024 15:47:01 -0000 @@ -20,7 +20,7 @@ require_ok( 'ExtUtils::ParseXS' ); chdir('t') if -d 't'; push @INC, '.'; -use Carp; $SIG{__WARN__} = \&Carp::cluck; +use Carp; #$SIG{__WARN__} = \&Carp::cluck; # See the comments about this in 001-basics.t @INC = map { File::Spec->rel2abs($_) } @INC; Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSAlias.xs =================================================================== RCS file: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSAlias.xs diff -N gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSAlias.xs --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSAlias.xs 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,19 @@ +MODULE = My PACKAGE = My + +void +do(dbh) + SV *dbh +ALIAS: + dox = 1 + lox => dox + pox = 1 + pox = 2 + docks = 1 + dachs => lox + xunx = 0 + xukes => do +CODE: +{ + int x; + ++x; +} Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSFalsePositive.xs =================================================================== RCS file: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSFalsePositive.xs diff -N gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSFalsePositive.xs --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSFalsePositive.xs 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,23 @@ +MODULE = My PACKAGE = My + +#ifdef MYDEF123 + +void +do(dbh) + SV *dbh +CODE: +{ + int x; + ++x; +} + +#endif + +void +do(dbh) + SV *dbh +CODE: +{ + int x; + ++x; +} Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSFalsePositive2.xs =================================================================== RCS file: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSFalsePositive2.xs diff -N gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSFalsePositive2.xs --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSFalsePositive2.xs 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,23 @@ +MODULE = My PACKAGE = My + +#ifdef MYDEF123 + +void +do(xdbh) + SV *xdbh +CODE: +{ + int x; + ++x; +} + +#endif + +void +do(dbh) + SV *dbh +CODE: +{ + int x; + ++x; +} Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSMore.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSMore.xs,v diff -u -p -a -u -p -r1.1.1.3 XSMore.xs --- gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSMore.xs 15 Feb 2023 01:32:55 -0000 1.1.1.3 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSMore.xs 21 Feb 2024 15:47:01 -0000 @@ -30,6 +30,10 @@ This parts are ignored. # define PERL_UNUSED_VAR(x) ((void)x) #endif +/* Newx was introduced in 5.8.8, would also be in ppport.h */ +#ifndef Newx +# define Newx(v,n,t) New(0,v,n,t) +#endif STATIC void Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSNoMap.xs =================================================================== RCS file: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSNoMap.xs diff -N gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSNoMap.xs --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSNoMap.xs 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,16 @@ +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +typedef struct { int a; } S; + +static void +xsnomap_unknown(S* p) { +} + +MODULE = XSNoMap PACKAGE = XSNoMap PREFIX = xsnomap_ + +PROTOTYPES: DISABLE + +void +xsnomap_unknown(S *arg) Index: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSTightDirectives.xs =================================================================== RCS file: gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSTightDirectives.xs diff -N gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSTightDirectives.xs --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/XSTightDirectives.xs 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,21 @@ +MODULE = My PACKAGE = My + +#ifdef MYDEF123 +void +do(dbh) + SV *dbh +CODE: +{ + int x; + ++x; +} +#else +void +do(dbh) + SV *dbh +CODE: +{ + int x; + ++x; +} +#endif Index: gnu/usr.bin/perl/dist/Filter-Simple/Changes =================================================================== RCS file: gnu/usr.bin/perl/dist/Filter-Simple/Changes diff -N gnu/usr.bin/perl/dist/Filter-Simple/Changes --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Filter-Simple/Changes 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,158 @@ +Revision history for Perl extension Filter::Simple + +0.01 Tue Sep 19 20:18:44 2000 + - original version; created by h2xs 1.18 + +0.01 Tue Sep 26 09:30:14 2000 + + - Changed module name to Filter::Simple + + +0.60 Wed May 2 07:38:18 2001 + + - Fixed POD nit (thanks Dean) + + - Added optional second argument to import to allow + terminator to be changed (thanks Brad) + + - Fixed bug when empty filtered text was appended to (thanks Brad) + + - Added FILTER as the normal mechanism for specifying filters + + +0.61 Mon Sep 3 08:25:21 2001 + + - Added a real test suite (thanks Jarkko) + + - Changed licence to facilitate inclusion in + core distribution + + - Added documentation for using F::S and Exporter together + + +0.70 Wed Nov 14 23:36:18 2001 + + - Added FILTER_ONLY for fine-grained filtering of code, + strings, or regexes + + - Fixed document snafu regarding optional terminators + + - Fixed bug so that FILTER now receives *all* import args + (i.e. including the class name in $_[0]) + + - Allowed default terminator to allow comments embedded in it + (thanks, Christian) and to handle __DATA__ and __END__ + + - Fixed handling of __DATA__ and *DATA + + +0.75 Fri Nov 16 14:36:07 2001 + + - Corified tests (thanks Jarkko) + + - Added automatic preservation of existing &import subroutines + + - Added automatic preservation of Exporter semantics + + +0.76 Fri Nov 16 15:08:42 2001 + + - Modified call to explicit &import so as to be invoked in original + call context + + +0.77 Sat Nov 24 06:48:47 2001 + + - Re-allowed user-defined terminators to be regexes + + +0.78 Fri May 17 09:38:56 2002 + + - Re-corified test modules in line with Jarkko's new scheme + + - Various POD nits unknitted (thanks Autrijus) + + - Added the missing DotsForArrows.pm demo file (thanks Autrijus) + + - Added support for Perl 5.005 + + - added prereq for Text::Balanced in Makefile.PL + + - Added note about use of /m flag when using ^ or $ in filter regexes + +0.79 Sat Sep 20 21:56:24 2003 + + - Fixed tests to use t/lib modules so F::S is testable without + a previous version of F::S installed. (schwern) + +0.80 Sun May 29 23:19:54 2005 + + - Added Sarathy's patch for \r\n newlinery (thanks Jarkko) + + - Added recognition of comments as whitespace (thanks Jeff) + + - Added @components variable (thanks Dean) + + - Fixed handling of vars in FILTER_ONLY code=>... (thanks Lasse) + + - Fixed spurious extra filter at end of file (thanks Dean) + + - Added INSTALLDIRS=>core to Makefile.PL + + +0.82 Mon Jun 27 02:31:06 GMT 2005 + + - Fixed INSTALLDIRS=>perl in Makefile.PL (thanks all) + + - Fixed other problems caused by de-schwernification + + +0.83 Sat Oct 18 18:51:51 CET 2008 + + - Updated contact details: Maintained by the Perl5-Porters. + - Some tiny distribution fixes. + + +0.84 Tue Jan 6 12:58:12 CET 2009 + + - Explicit dependency on Text::Balanced 1.97 because that fixed + a problem with HERE-docs. (RT #27326) + +0.85 Sun Sep 5 16:03:00 CET 2010 + + - Port changes from core: Remove unnecessary PERL_CORE check + from tests. + +0.86 + - Never released to CPAN (only part of the perl core 5.14.0) + +0.87 Fri May 20 20:00:00 CET 2011 + + - Port changes from core: Whitespace fix that is significant for + POD correctness. + +0.88 Mon Dec 19 18:26:00 CET 2011 + + - [perl #92436] Make Filter::Simple match variables better + (Father Chrysostomos) + + - [perl #92436] Filter::Simple can’t find end of POD + (Father Chrysostomos) + +0.91 Fri Mar 7 08:30:00 CET 2014 + + - Various small documentation fixes. + + - Swap out base.pm use for parent.pm. + +0.94 Thu Aug 3 18:00:00 CET 2017 + + - Remove use of deprecated \C regex feature. + + - Filter::Simple was erroneously signalling eof if it encountered a + ‘no MyFilter’ right after ‘use’: + use MyFilter; + no MyFilter; + In this case it should simply not filter anything. + + Index: gnu/usr.bin/perl/dist/Filter-Simple/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/Filter-Simple/Makefile.PL diff -N gnu/usr.bin/perl/dist/Filter-Simple/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Filter-Simple/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,16 @@ +require 5.006; # uses 'our' +use strict; +use ExtUtils::MakeMaker; +WriteMakefile( + 'NAME' => 'Filter::Simple', + 'VERSION_FROM' => 'lib/Filter/Simple.pm', + 'INSTALLDIRS' => 'perl', + 'LICENSE' => 'perl_5', + 'INSTALLDIRS' => ( $] < 5.011 ? 'perl' : 'site' ), + 'ABSTRACT_FROM' => 'lib/Filter/Simple.pm', + 'AUTHOR' => 'Damian Conway', + 'PREREQ_PM' => { + 'Text::Balanced' => '1.97', + 'Filter::Util::Call' => 0, + }, +); Index: gnu/usr.bin/perl/dist/FindBin/Changes =================================================================== RCS file: gnu/usr.bin/perl/dist/FindBin/Changes diff -N gnu/usr.bin/perl/dist/FindBin/Changes --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/FindBin/Changes 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,7 @@ +Revision history for Perl dual life module FindBin. + +1.53 2023-01-23 + - Update bug reporting location. + +1.52 2020-12-10 + - Initial release to CPAN as a dual life module. Index: gnu/usr.bin/perl/dist/FindBin/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/FindBin/Makefile.PL diff -N gnu/usr.bin/perl/dist/FindBin/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/FindBin/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,41 @@ +use strict; +use warnings; + +use 5.006; +use ExtUtils::MakeMaker; + +my %WriteMakefile_args = ( + 'NAME' => 'FindBin', + 'VERSION_FROM' => 'lib/FindBin.pm', + 'ABSTRACT_FROM' => 'lib/FindBin.pm', + 'LICENSE' => 'perl_5', + 'INSTALLDIRS' => ($] >= '5.011' ? 'site' : 'perl'), + 'MIN_PERL_VERSION' => '5.006', + 'PREREQ_PM' => { + 'Exporter' => '0', + 'Carp' => '0', + 'Cwd' => '0', + 'File::Basename' => '0', + 'File::Spec' => '0', + }, + 'dist' => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, + 'META_MERGE' => { + 'meta-spec' => { 'version' => 2 }, + 'dynamic_config' => 0, + 'resources' => { + 'license' => ['http://dev.perl.org/licenses/'], + 'bugtracker' => { 'web' => 'https://github.com/perl/perl5/issues' }, + 'repository' => { + 'type' => 'git', + 'url' => 'https://github.com/perl/perl5.git', + 'web' => 'https://github.com/perl/perl5', + }, + } + }, +); + +delete $WriteMakefile_args{LICENSE} unless eval { ExtUtils::MakeMaker->VERSION('6.31') }; +delete $WriteMakefile_args{META_MERGE} unless eval { ExtUtils::MakeMaker->VERSION('6.46') }; +delete $WriteMakefile_args{MIN_PERL_VERSION} unless eval { ExtUtils::MakeMaker->VERSION('6.48') }; + +WriteMakefile(%WriteMakefile_args); Index: gnu/usr.bin/perl/dist/I18N-LangTags/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/I18N-LangTags/Makefile.PL diff -N gnu/usr.bin/perl/dist/I18N-LangTags/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/I18N-LangTags/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,27 @@ +use ExtUtils::MakeMaker; +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. + +WriteMakefile( + 'NAME' => 'I18N::LangTags', + 'VERSION_FROM' => 'lib/I18N/LangTags.pm', # finds $VERSION + 'ABSTRACT_FROM' => 'lib/I18N/LangTags.pm', # + 'dist' => { COMPRESS => 'gzip -6f', SUFFIX => 'gz', }, + 'PREREQ_PM' => { + $^O =~ m/Win32/i ? ( + 'Win32::Locale' => 0.01, + ) : (), + }, + 'INSTALLDIRS' => ( $] < 5.011 ? 'perl' : 'site' ), +); + +package MY; + +sub libscan +{ # Determine things that should *not* be installed + my($self, $path) = @_; + return '' if $path =~ m/~/; + $path; +} + +__END__ Index: gnu/usr.bin/perl/dist/I18N-LangTags/lib/I18N/LangTags/List.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/I18N-LangTags/lib/I18N/LangTags/List.pm,v diff -u -p -a -u -p -r1.4 List.pm --- gnu/usr.bin/perl/dist/I18N-LangTags/lib/I18N/LangTags/List.pm 13 Feb 2019 21:15:20 -0000 1.4 +++ gnu/usr.bin/perl/dist/I18N-LangTags/lib/I18N/LangTags/List.pm 21 Feb 2024 15:47:01 -0000 @@ -4,7 +4,7 @@ package I18N::LangTags::List; # Time-stamp: "2004-10-06 23:26:21 ADT" use strict; our (%Name, %Is_Disrec, $Debug); -our $VERSION = '0.40'; +our $VERSION = '0.41'; # POD at the end. #---------------------------------------------------------------------- @@ -353,9 +353,9 @@ eq Zend eq Azeri Notable forms: -{az-Arab} Azerbaijani in Arabic script; -{az-Cyrl} Azerbaijani in Cyrillic script; -{az-Latn} Azerbaijani in Latin script. +{az-arab} Azerbaijani in Arabic script; +{az-cyrl} Azerbaijani in Cyrillic script; +{az-latn} Azerbaijani in Latin script. =item {ban} : Balinese @@ -473,8 +473,8 @@ eq Nyanja. eq Chinyanja. Many forms are mutually un-intelligible in spoken media. Notable forms: -{zh-Hans} Chinese, in simplified script; -{zh-Hant} Chinese, in traditional script; +{zh-hans} Chinese, in simplified script; +{zh-hant} Chinese, in traditional script; {zh-tw} Taiwan Chinese; {zh-cn} PRC Chinese; {zh-sg} Singapore Chinese; @@ -1370,8 +1370,8 @@ NOT Scots Gaelic! eq Serb. NOT Sorbian. Notable forms: -{sr-Cyrl} : Serbian in Cyrillic script; -{sr-Latn} : Serbian in Latin script. +{sr-cyrl} : Serbian in Cyrillic script; +{sr-latn} : Serbian in Latin script. =item {srr} : Serer @@ -1612,8 +1612,8 @@ Not a tag for normal use. eq Ezbek Notable forms: -{uz-Cyrl} Uzbek in Cyrillic script; -{uz-Latn} Uzbek in Latin script. +{uz-cyrl} Uzbek in Cyrillic script; +{uz-latn} Uzbek in Latin script. =item {vai} : Vai Index: gnu/usr.bin/perl/dist/I18N-LangTags/t/05_main.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/I18N-LangTags/t/05_main.t,v diff -u -p -a -u -p -r1.1.1.2 05_main.t --- gnu/usr.bin/perl/dist/I18N-LangTags/t/05_main.t 25 Mar 2013 20:08:36 -0000 1.1.1.2 +++ gnu/usr.bin/perl/dist/I18N-LangTags/t/05_main.t 21 Feb 2024 15:47:01 -0000 @@ -1,5 +1,5 @@ use strict; -use Test::More tests => 64; +use Test::More tests => 67; BEGIN {use_ok('I18N::LangTags', ':ALL');} note("Perl v$], I18N::LangTags v$I18N::LangTags::VERSION"); @@ -25,20 +25,36 @@ foreach (['', 0], $note = $note ? " # $note" : ''; is(is_language_tag($tag), $expect, "is_language_tag('$tag')$note"); } -is(same_language_tag('x-borg-prot5123', 'i-BORG-Prot5123'), 1); -is(same_language_tag('en', 'en-us'), 0); +foreach ( + [ [ 'x-borg-prot5123', 'i-BORG-Prot5123' ], 1], + [ [ 'en', 'en-us' ], 0], +) { + my ($tags, $expect, $note) = @$_; + $note = $note ? " # $note" : ''; + is(same_language_tag(@{$tags}), $expect, "same_language_tag('@{$tags}')$note"); +} -is(similarity_language_tag('en-ca', 'fr-ca'), 0); -is(similarity_language_tag('en-ca', 'en-us'), 1); -is(similarity_language_tag('en-us-southern', 'en-us-western'), 2); -is(similarity_language_tag('en-us-southern', 'en-us'), 2); - -ok grep $_ eq 'hi', panic_languages('kok'); -ok grep $_ eq 'en', panic_languages('x-woozle-wuzzle'); -ok ! grep $_ eq 'mr', panic_languages('it'); -ok grep $_ eq 'es', panic_languages('it'); -ok grep $_ eq 'it', panic_languages('es'); +foreach ( + [ [ 'en-ca', 'fr-ca' ], 0 ], + [ [ 'en-ca', 'en-us' ], 1 ], + [ [ 'en-us-southern', 'en-us-western' ], 2 ], + [ [ 'en-us-southern', 'en-us' ], 2 ], +) { + my ($tags, $expect, $note) = @$_; + $note = $note ? " # $note" : ''; + is(similarity_language_tag(@{$tags}), $expect, "similarity_language_tag('@{$tags}')$note"); +} +ok ((grep $_ eq 'hi', panic_languages('kok')), + "'hi' is a panic language for 'kok'"); +ok ((grep $_ eq 'en', panic_languages('x-woozle-wuzzle')), + "'en' is a panic language for 'x-woozle-wuzzle'"); +ok ((! grep $_ eq 'mr', panic_languages('it')), + "'mr' is not a panic language for 'it'"); +ok ((grep $_ eq 'es', panic_languages('it')), + "'es' is a panic language for 'it'"); +ok ((grep $_ eq 'it', panic_languages('es')), + "'it' is a panic language for 'es'"); note("Now the ::List tests..."); note("# Perl v$], I18N::LangTags::List v$I18N::LangTags::List::VERSION"); @@ -81,7 +97,14 @@ foreach my $lt (qw( cr-syllabic-western cr-western cr-latin + az-latin )) { my $name = I18N::LangTags::List::name($lt); isnt($name, undef, "I18N::LangTags::List::name('$lt')"); } + +my $correct = 'Azerbaijani in Latin script'; +is(I18N::LangTags::List::name('az-Latn'), $correct, + "Properly recognize 'az-latin' (with script subcomponent): # #16500"); +is(I18N::LangTags::List::name('az-latn'), $correct, + "Properly recognize 'az-latin' (with script subcomponent): # #16500"); Index: gnu/usr.bin/perl/dist/IO/ChangeLog =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/ChangeLog,v diff -u -p -a -u -p -r1.1.1.5 ChangeLog --- gnu/usr.bin/perl/dist/IO/ChangeLog 15 Feb 2023 01:32:55 -0000 1.1.1.5 +++ gnu/usr.bin/perl/dist/IO/ChangeLog 21 Feb 2024 15:47:02 -0000 @@ -1,3 +1,17 @@ +IO 1.52 + * Replace "define" with "define" in poll.h + +IO 1.51 + * #20201 bump dist/IO to v1.51, due to PR 19663 + * [doc] Update IO::Handle synopsis. Add `my` to examples for better practice. + * Update IO::File synopsis. Add `my` to examples for better practice. + * Update IO::Dir synopsis. Add `my` to examples for better practice. + * IO::Socket::UNIX: Add proper hyperlink in pod + * IO::Socket::INET: Use proper hyperlink in pod + * IO::Pipe: Use proper hyperlink in pod + * IO::Handle: Use proper hyperlink in pod + * Fix dist/IO/poll.h for mingw-w64 runtimes 9.0 and later + IO 1.50 * Bump to 1.50 after cpantesters run. Index: gnu/usr.bin/perl/dist/IO/IO.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/IO.pm,v diff -u -p -a -u -p -r1.7 IO.pm --- gnu/usr.bin/perl/dist/IO/IO.pm 15 Feb 2023 01:36:28 -0000 1.7 +++ gnu/usr.bin/perl/dist/IO/IO.pm 21 Feb 2024 15:47:02 -0000 @@ -7,7 +7,7 @@ use Carp; use strict; use warnings; -our $VERSION = "1.50"; +our $VERSION = "1.52"; XSLoader::load 'IO', $VERSION; sub import { Index: gnu/usr.bin/perl/dist/IO/poll.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/poll.h,v diff -u -p -a -u -p -r1.2 poll.h --- gnu/usr.bin/perl/dist/IO/poll.h 5 Feb 2017 00:32:09 -0000 1.2 +++ gnu/usr.bin/perl/dist/IO/poll.h 21 Feb 2024 15:47:02 -0000 @@ -10,7 +10,7 @@ #ifndef POLL_H # define POLL_H -#if (defined(HAS_POLL) && defined(I_POLL)) || defined(POLLWRBAND) +#if (defined(HAS_POLL) && defined(I_POLL)) || (defined(POLLWRBAND) && !defined(_WIN32)) # include #elif (defined(HAS_POLL) && defined(I_SYS_POLL)) # include @@ -22,31 +22,38 @@ #define EMULATE_POLL_WITH_SELECT +#ifdef _WIN32 +# include +#endif + #ifdef poll # undef poll #endif #define poll Perl_my_poll +#if WINVER < 0x0600 typedef struct pollfd { int fd; short events; short revents; } pollfd_t; -#define POLLIN 0x0001 -#define POLLPRI 0x0002 -#define POLLOUT 0x0004 -#define POLLRDNORM 0x0040 -#define POLLWRNORM POLLOUT -#define POLLRDBAND 0x0080 -#define POLLWRBAND 0x0100 -#define POLLNORM POLLRDNORM +#define POLLIN 0x0001 +#define POLLPRI 0x0002 +#define POLLOUT 0x0004 +#define POLLRDNORM 0x0040 +#define POLLWRNORM POLLOUT +#define POLLRDBAND 0x0080 +#define POLLWRBAND 0x0100 +#define POLLNORM POLLRDNORM /* Return ONLY events (NON testable) */ -#define POLLERR 0x0008 -#define POLLHUP 0x0010 -#define POLLNVAL 0x0020 +#define POLLERR 0x0008 +#define POLLHUP 0x0010 +#define POLLNVAL 0x0020 + +#endif int poll (struct pollfd *, unsigned long, int); Index: gnu/usr.bin/perl/dist/IO/lib/IO/Dir.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/lib/IO/Dir.pm,v diff -u -p -a -u -p -r1.7 Dir.pm --- gnu/usr.bin/perl/dist/IO/lib/IO/Dir.pm 15 Feb 2023 01:36:28 -0000 1.7 +++ gnu/usr.bin/perl/dist/IO/lib/IO/Dir.pm 21 Feb 2024 15:47:02 -0000 @@ -18,7 +18,7 @@ use File::stat; use File::Spec; our @ISA = qw(Tie::Hash Exporter); -our $VERSION = "1.49"; +our $VERSION = "1.52"; our @EXPORT_OK = qw(DIR_UNLINK); @@ -153,7 +153,7 @@ IO::Dir - supply object methods for dire =head1 SYNOPSIS use IO::Dir; - $d = IO::Dir->new("."); + my $d = IO::Dir->new("."); if (defined $d) { while (defined($_ = $d->read)) { something($_); } $d->rewind; @@ -161,7 +161,7 @@ IO::Dir - supply object methods for dire undef $d; } - tie %dir, 'IO::Dir', "."; + tie my %dir, 'IO::Dir', "."; foreach (keys %dir) { print $_, " " , $dir{$_}->size,"\n"; } Index: gnu/usr.bin/perl/dist/IO/lib/IO/File.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/lib/IO/File.pm,v diff -u -p -a -u -p -r1.7 File.pm --- gnu/usr.bin/perl/dist/IO/lib/IO/File.pm 15 Feb 2023 01:36:28 -0000 1.7 +++ gnu/usr.bin/perl/dist/IO/lib/IO/File.pm 21 Feb 2024 15:47:02 -0000 @@ -10,29 +10,29 @@ IO::File - supply object methods for fil use IO::File; - $fh = IO::File->new(); + my $fh = IO::File->new(); if ($fh->open("< file")) { print <$fh>; $fh->close; } - $fh = IO::File->new("> file"); + my $fh = IO::File->new("> file"); if (defined $fh) { print $fh "bar\n"; $fh->close; } - $fh = IO::File->new("file", "r"); + my $fh = IO::File->new("file", "r"); if (defined $fh) { print <$fh>; undef $fh; # automatically closes the file } - $fh = IO::File->new("file", O_WRONLY|O_APPEND); + my $fh = IO::File->new("file", O_WRONLY|O_APPEND); if (defined $fh) { print $fh "corge\n"; - $pos = $fh->getpos; + my $pos = $fh->getpos; $fh->setpos($pos); undef $fh; # automatically closes the file @@ -135,7 +135,7 @@ require Exporter; our @ISA = qw(IO::Handle IO::Seekable Exporter); -our $VERSION = "1.48"; +our $VERSION = "1.52"; our @EXPORT = @IO::Seekable::EXPORT; Index: gnu/usr.bin/perl/dist/IO/lib/IO/Handle.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/lib/IO/Handle.pm,v diff -u -p -a -u -p -r1.8 Handle.pm --- gnu/usr.bin/perl/dist/IO/lib/IO/Handle.pm 15 Feb 2023 01:36:28 -0000 1.8 +++ gnu/usr.bin/perl/dist/IO/lib/IO/Handle.pm 21 Feb 2024 15:47:02 -0000 @@ -8,20 +8,20 @@ IO::Handle - supply object methods for I use IO::Handle; - $io = IO::Handle->new(); + my $io = IO::Handle->new(); if ($io->fdopen(fileno(STDIN),"r")) { print $io->getline; $io->close; } - $io = IO::Handle->new(); + my $io = IO::Handle->new(); if ($io->fdopen(fileno(STDOUT),"w")) { $io->print("Some text\n"); } # setvbuf is not available by default on Perls 5.8.0 and later. use IO::Handle '_IOLBF'; - $io->setvbuf($buffer_var, _IOLBF, 1024); + $io->setvbuf(my $buffer_var, _IOLBF, 1024); undef $io; # automatically closes the file if it's open @@ -234,7 +234,7 @@ the taint-clean flag failed. (eg invalid =head1 NOTE An C object is a reference to a symbol/GLOB reference (see -the C package). Some modules that +the L package). Some modules that inherit from C may want to keep object related variables in the hash table part of the GLOB. In an attempt to prevent modules trampling on each other I propose the that any such module should prefix @@ -270,7 +270,7 @@ use IO (); # Load the XS module require Exporter; our @ISA = qw(Exporter); -our $VERSION = "1.48"; +our $VERSION = "1.52"; our @EXPORT_OK = qw( autoflush Index: gnu/usr.bin/perl/dist/IO/lib/IO/Pipe.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/lib/IO/Pipe.pm,v diff -u -p -a -u -p -r1.7 Pipe.pm --- gnu/usr.bin/perl/dist/IO/lib/IO/Pipe.pm 15 Feb 2023 01:36:28 -0000 1.7 +++ gnu/usr.bin/perl/dist/IO/lib/IO/Pipe.pm 21 Feb 2024 15:47:02 -0000 @@ -13,7 +13,7 @@ use strict; use Carp; use Symbol; -our $VERSION = "1.49"; +our $VERSION = "1.52"; sub new { my $type = shift; @@ -203,7 +203,7 @@ processes. =item new ( [READER, WRITER] ) Creates an C, which is a reference to a newly created symbol -(see the C package). C optionally takes two +(see the L package). C optionally takes two arguments, which should be objects blessed into C, or a subclass thereof. These two objects will be used for the system call to C. If no arguments are given then method C is called Index: gnu/usr.bin/perl/dist/IO/lib/IO/Poll.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/lib/IO/Poll.pm,v diff -u -p -a -u -p -r1.8 Poll.pm --- gnu/usr.bin/perl/dist/IO/lib/IO/Poll.pm 15 Feb 2023 01:36:28 -0000 1.8 +++ gnu/usr.bin/perl/dist/IO/lib/IO/Poll.pm 21 Feb 2024 15:47:02 -0000 @@ -12,7 +12,7 @@ use IO::Handle; use Exporter (); our @ISA = qw(Exporter); -our $VERSION = "1.49"; +our $VERSION = "1.52"; our @EXPORT = qw( POLLIN POLLOUT Index: gnu/usr.bin/perl/dist/IO/lib/IO/Seekable.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/lib/IO/Seekable.pm,v diff -u -p -a -u -p -r1.7 Seekable.pm --- gnu/usr.bin/perl/dist/IO/lib/IO/Seekable.pm 15 Feb 2023 01:36:28 -0000 1.7 +++ gnu/usr.bin/perl/dist/IO/lib/IO/Seekable.pm 21 Feb 2024 15:47:02 -0000 @@ -106,7 +106,7 @@ require Exporter; our @EXPORT = qw(SEEK_SET SEEK_CUR SEEK_END); our @ISA = qw(Exporter); -our $VERSION = "1.48"; +our $VERSION = "1.52"; sub seek { @_ == 3 or croak 'usage: $io->seek(POS, WHENCE)'; Index: gnu/usr.bin/perl/dist/IO/lib/IO/Select.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/lib/IO/Select.pm,v diff -u -p -a -u -p -r1.7 Select.pm --- gnu/usr.bin/perl/dist/IO/lib/IO/Select.pm 15 Feb 2023 01:36:28 -0000 1.7 +++ gnu/usr.bin/perl/dist/IO/lib/IO/Select.pm 21 Feb 2024 15:47:02 -0000 @@ -10,7 +10,7 @@ use strict; use warnings::register; require Exporter; -our $VERSION = "1.49"; +our $VERSION = "1.52"; our @ISA = qw(Exporter); # This is only so we can do version checking Index: gnu/usr.bin/perl/dist/IO/lib/IO/Socket.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/lib/IO/Socket.pm,v diff -u -p -a -u -p -r1.7 Socket.pm --- gnu/usr.bin/perl/dist/IO/lib/IO/Socket.pm 15 Feb 2023 01:36:28 -0000 1.7 +++ gnu/usr.bin/perl/dist/IO/lib/IO/Socket.pm 21 Feb 2024 15:47:02 -0000 @@ -23,7 +23,7 @@ require IO::Socket::UNIX if ($^O ne 'epo our @ISA = qw(IO::Handle); -our $VERSION = "1.49"; +our $VERSION = "1.52"; our @EXPORT_OK = qw(sockatmark); Index: gnu/usr.bin/perl/dist/IO/lib/IO/Socket/INET.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/lib/IO/Socket/INET.pm,v diff -u -p -a -u -p -r1.7 INET.pm --- gnu/usr.bin/perl/dist/IO/lib/IO/Socket/INET.pm 15 Feb 2023 01:36:28 -0000 1.7 +++ gnu/usr.bin/perl/dist/IO/lib/IO/Socket/INET.pm 21 Feb 2024 15:47:02 -0000 @@ -14,7 +14,7 @@ use Exporter; use Errno; our @ISA = qw(IO::Socket); -our $VERSION = "1.49"; +our $VERSION = "1.52"; my $EINVAL = exists(&Errno::EINVAL) ? Errno::EINVAL() : 1; @@ -330,7 +330,7 @@ inherits all the methods defined by L object, which is a reference to a -newly created symbol (see the C package). C +newly created symbol (see the L package). C optionally takes arguments, these arguments are in key-value pairs. In addition to the key-value pairs accepted by L, Index: gnu/usr.bin/perl/dist/IO/lib/IO/Socket/UNIX.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/IO/lib/IO/Socket/UNIX.pm,v diff -u -p -a -u -p -r1.7 UNIX.pm --- gnu/usr.bin/perl/dist/IO/lib/IO/Socket/UNIX.pm 15 Feb 2023 01:36:28 -0000 1.7 +++ gnu/usr.bin/perl/dist/IO/lib/IO/Socket/UNIX.pm 21 Feb 2024 15:47:02 -0000 @@ -11,7 +11,7 @@ use IO::Socket; use Carp; our @ISA = qw(IO::Socket); -our $VERSION = "1.49"; +our $VERSION = "1.52"; IO::Socket::UNIX->register_domain( AF_UNIX ); @@ -111,7 +111,7 @@ inherits all the methods defined by L object, which is a reference to a -newly created symbol (see the C package). C +newly created symbol (see the L package). C optionally takes arguments, these arguments are in key-value pairs. In addition to the key-value pairs accepted by L, Index: gnu/usr.bin/perl/dist/Locale-Maketext/ChangeLog =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Locale-Maketext/ChangeLog,v diff -u -p -a -u -p -r1.5 ChangeLog --- gnu/usr.bin/perl/dist/Locale-Maketext/ChangeLog 15 Feb 2023 01:36:28 -0000 1.5 +++ gnu/usr.bin/perl/dist/Locale-Maketext/ChangeLog 21 Feb 2024 15:47:01 -0000 @@ -1,5 +1,9 @@ Revision history for Perl suite Locale::Maketext +2022-08-22 + * Release 1.32 to CPAN + * Fix Makefile.PL logic for default install destination on 5.008 up to 5.011 + 2022-04-14 * Release 1.31 to CPAN * White space cleanup. Index: gnu/usr.bin/perl/dist/Locale-Maketext/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/Locale-Maketext/Makefile.PL diff -N gnu/usr.bin/perl/dist/Locale-Maketext/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Locale-Maketext/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,52 @@ +require 5.006; # uses 'our' +use strict; +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'Locale::Maketext', + VERSION_FROM => 'lib/Locale/Maketext.pm', + ABSTRACT_FROM => 'lib/Locale/Maketext.pod', + PREREQ_PM => { + 'I18N::LangTags' => 0.31, + 'I18N::LangTags::Detect' => 0, + 'Test::More' => 0, + 'parent' => 0, # For testing t/30_eval_dollar_at.t + }, + dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, + ( $ExtUtils::MakeMaker::VERSION >= 6.3002 ? ( 'LICENSE' => 'perl', ) : () ), + INSTALLDIRS => ( $] < 5.011 ? 'perl' : 'site' ), + + # If under a version with Maketext in core, overwrite that core file. + META_MERGE => { + resources => { + license => 'http://dev.perl.org/licenses/', + bugtracker => 'https://github.com/perl/perl5/issues', + repository => 'https://github.com/Perl/perl5/tree/blead/dist/Locale-Maketext', + MailingList => 'http://lists.perl.org/list/perl5-porters.html', + }, + }, +); + +sub MY::postamble { + # .PHONY is not portable + my $self = shift; + my $phony_line = $self->can('is_make_type') + && ($self->is_make_type('gmake') + || $self->is_make_type('bsdmake')) + ? '.PHONY: tags critic' + : ''; + + return "$phony_line\n\n" . <<'MAKE_FRAG'; + +tags: + ctags -f tags --recurse --totals \ + --exclude=blib \ + --exclude=.svn \ + --exclude='*~' \ + --languages=Perl --langmap=Perl:+.t \ + +critic: + perlcritic -1 -q -profile perlcriticrc -statistics lib/ t/ + +MAKE_FRAG +} Index: gnu/usr.bin/perl/dist/Locale-Maketext/lib/Locale/Maketext.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Locale-Maketext/lib/Locale/Maketext.pm,v diff -u -p -a -u -p -r1.5 Maketext.pm --- gnu/usr.bin/perl/dist/Locale-Maketext/lib/Locale/Maketext.pm 15 Feb 2023 01:36:28 -0000 1.5 +++ gnu/usr.bin/perl/dist/Locale-Maketext/lib/Locale/Maketext.pm 21 Feb 2024 15:47:01 -0000 @@ -25,7 +25,7 @@ BEGIN { } -our $VERSION = '1.31'; +our $VERSION = '1.33'; our @ISA = (); our $MATCH_SUPERS = 1; Index: gnu/usr.bin/perl/dist/Math-Complex/ChangeLog =================================================================== RCS file: gnu/usr.bin/perl/dist/Math-Complex/ChangeLog diff -N gnu/usr.bin/perl/dist/Math-Complex/ChangeLog --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Math-Complex/ChangeLog 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,521 @@ +2012-02-01 Zefram + + * Don't declare "tan" operator overloading on Math::Complex + objects, because there is no such overloading type [rt.cpan.org + #74288]. + + * Remove execute bit from test scripts in CPAN tarball. + + * Release Math::Complex 1.59 + Math::Trig 1.23. + +2011-06-21 Zefram + + * Declare package variables with "our" rather than "use vars". + + * Corresponding to "our" usage, check for minimum Perl version + 5.006. + + * Remove $ENV{PERL_CORE} logic from test suite, which is no + longer desired in the core. + + * In test suite, remove obsolete and now-incomplete handling of + unavailability of Test::More. + + * Declare module dependencies. + + * Release Math::Complex 1.58 + Math::Trig 1.22. + +2011-05-03 Zefram + + * Add copy constructor and arrange for it to be called + appropriately, problem found by David Madore and Alexandr + Ciornii. + + * Correctly format polarwise when a numeric format specifier is + given, problem found by TomC. + + * More stable great_circle_direction algorithm, problem found + by Daniel Burr. + + * Release Math::Complex 1.57 + Math::Trig 1.21. + +2009-02-08 Jarkko Hietaniemi + + * Fix qw(abs cos exp log sin sqrt) without argument, problem + found by Steffen Mueller, 5.10-aware (lexical $_) fix by Abigail. + + * Release Math::Complex 1.56 + Math::Trig 1.20. + +2008-12-27 Jarkko Hietaniemi + + * Resolve rt.cpan.org report: + "#39045: great_circle_direction gives wrong answer if 5th argument is supplied" + by calling great_circle_distance() with an explicit argument + list in great_circle_direction(). + + * Release Math::Complex 1.55 + Math::Trig 1.19. + +2008-04-04 Jarkko Hietaniemi + + * The SIGFPE catcher in Complex.pm and Trig.t was { }, not sub { }. + + * Shuffle the Inf-guessing guesses a bit to try infinities first, + and also 2**99999 before exp(99999), seems to be more reliable + for generating the infinity for some odd reason (the ** is + implemented via exp() anyway?) + + * In cosh() and sinh() more robustly produce Inf() when needed, + even when exp() seems to "stick" into DBL_MAX and not go to Inf. + + * Release Math::Complex 1.54 + Math::Trig 1.18. + +2008-04-01 Jarkko Hietaniemi + + * Resolved rt.cpan.org report: + "#34605: Math::Trig(3pm) man page feedback" + (Trig.pm talked of "arcus hyperbolic sine", which is wrong, + it is either "area hyperbolic sine" or "inverse hyperbolic sine") + + * Tweaked also the code comments a bit to speak consistently of + "area/inverse hyperbolic ..." + + * Resolved rt.cpan.org report: + "#34269: Math::Trig::great_circle_destination" + (One cannot combine the results great_circle_distance(A, B) and + great_circle_direction(A, B) to get great_circle_destination(A, ...) + to return B, because the bearing keeps changing in the general case) + + * Release Math::Complex 1.53 + Math::Trig 1.17. + +2008-02-11 Jarkko Hietaniemi + + * Duh. Forgot 128-bit option from the %DBL_MAX table. + + * Release Math::Complex 1.52 + Math::Trig 1.16. + +2008-02-10 Jarkko Hietaniemi + + * Make the nv max detection to work also with + long doubles, reported by Nicholas Clark + [core perl change #33268] + + * Release Math::Complex 1.51 + Math::Trig 1.15. + (1.50 skipped because of "1.5" idiocy.) + +2008-04-04 Jarkko Hietaniemi + + * The debugging output in Complex.pm BEGIN was not nice: + remove that, resolving rt.cpan.org #32919. + + * Make the detecting of Infinity even more relaxed: + just be happy with defined() and "big enough". + (Switch the '1e999' as last resort, though.) + + * Release Math::Complex 1.49 + Math::Trig 1.14. + +2008-01-29 Jarkko Hietaniemi + + * In HP-UX the infinity is stringified as "++" and + the negative infinity as "--", fix from H. Merijn Brand. + + * Release Math::Complex 1.48 + Math::Trig 1.13. + +2008-01-16 Jarkko Hietaniemi + + * The great circle tests with small angles didn't work + with long doubles in Mac OS X, reported by conrad. + Oh, the joy of floating point. Fudged the test hopefully enough. + Could special case going from point A to point A, + but that would be cheating. (For really small movements + could also just do Pythagorean plane distance.) + + * Release Math::Complex 1.47 + Math::Trig 1.12. + +2008-01-16 Jarkko Hietaniemi + + * Fix a typo in the asin_real/acos_real documentation + noticed by Alexej Sveshnikov. + + * Release Math::Complex 1.46 + Math::Trig 1.11. + +2008-01-15 Jarkko Hietaniemi + + * Address [rt.cpan.org #32291] Wrong (Math::Complex) results in great_circle family of functions + Fix gratefully received from the reporter of the bug, + Alexej Sveshnikov. + + * Added the two new interfaces added by the fix for the + rt.cpan.org #32291, asin_real() and acos_real(), also + to the public interface. + + * Release Math::Complex 1.45 + Math::Trig 1.10. + +2008-01-11 Jarkko Hietaniemi + + * Address rt.cpan.org #27186: Shadowed By the Core Version + by adding INSTALLDIRS => 'perl' to Makefile.PL. + + * Ignore SIGFPE in Trig.t when doing arithmetics with + infinities (avoids a coredump in netbsd-alpha, found + by David Cantrell). Document this fun. + + * Make Math::Complex and Math::Trig documentations to + refer to each other. + + * Release Math::Complex 1.44 + Math::Trig 1.09. + +2008-01-09 Jarkko Hietaniemi + + * sinh(1e4) was not enough to go to infinity in AMD64 + with long doubles (sinh(1e5) was), and test.pl:is() + didn't work for infinities (subtle overloading issue.) + Fix from Nicholas Clark. + + * Release Math::Complex 1.43 + Math::Trig 1.08. + +2008-01-07 Jarkko Hietaniemi + + * The infinity detection was wrong for Microsoft libc, + there infinity is '1.#INF'. Now made the detection + hopefully much more robust. + + * Release Math::Complex 1.42 + Math::Trig 1.07. + +2008-01-06 Jarkko Hietaniemi + + * PAUSE upload had some issues which messed up 1.39 upload, + reissue after reviewing (and fixing) the diffs. + + * Release Math::Complex 1.41 (1.40 skipped because + of silly "1.4.tar.gz" feature) + Math::Trig 1.07. + [deleted from CPAN because broken in Win32] + +2008-01-06 Jarkko Hietaniemi + + * Add the standard "same terms as Perl itself" license + to both Complex.pm and Trig.pm. + + * Add Inf() as an exportable sub, it returns the infinity + (or the best floating double imitation of it). + + * Make the BEGIN block of Complex.pm croak if it cannot + find an infinity. This may be deadly on some platforms + but then again, Complex.pm has returned infinities for + quite some time now. + + * tanh(a big enough number) was returning NaN in Unix and 1+NaN + in Windows when the right answer is 1 (for IEEE doubles + the limit seemed to be 709 vs 710). Added tests for + sinh/cosh/tanh/sech/csch for 100/-100, and for sinh/cosh + with 1e4 returning Inf(). Reported by Roberto Congiu. + + * Added sanity check tests to Trig.t for all the trigonometric + and hyperbolic functions (staying in real axis, not going to + complex plane). + + * Release Math::Complex 1.39 + Math::Trig 1.06. + [deleted from CPAN because of PAUSE upload problems] + +2007-12-30 Jarkko Hietaniemi + + * The example for great_circle_waypoint() had latitude and + longitude switched; reported by Chris Heys. + + * Cosmetic changes in test files. + + * Release Math::Complex 1.38 + Math::Trig 1.05. + +2007-01-21 Jarkko Hietaniemi + + * great_circle_waypoint() was broken (the latitudes + were garbage); report and fix by Uwe Girlich. + + * local()ize $! in the BEGIN block when looking for Inf. + + * Release Math::Complex 1.37. + +2006-07-04 Jarkko Hietaniemi + + * Move the pi-constants from Math::Trig to Math::Complex. + + * Hide some of the internal-use-only functions/methods + by prepending an underscore to the names. + + * Update Dan Lewart's email address. + + * Introduce pod.t and pod-coverage.t; make the tests + to be correctly skipped if Test::More or Test::Pod::Coverage + are not available. + + * Tiny doc tweaks. + + * Add a TODO file. + + * Grab the Math::Complex and Math::Trig changes from + the Perl 5 Perforce repository (see below). + + * CPAN release Math::Complex 1.36 + Math::Trig 1.04. + +Changes below this are changes of the Perl 5 Perforce repository +that somehow touched Math::Complex, Math::Trig, and/or their tests. +They brought Math::Complex to 1.35 and Math::Trig to 1.03, +after which Math::Complex and Math::Trig were CPANized as 1.36 and 1.04. + + [26219] on 2005/11/28 by stevep@stevep-mccoy + + Subject: [PATCH] Math::Trig: blead and maint (doc patch only): s/Bay/Gulf/ and do away with bad quotes + From: jhi@cc.hut.fi (Jarkko Hietaniemi) + Date: Sun, 27 Nov 2005 23:04:31 +0200 (EET) + Message-Id: <20051127210431.F1D2C6CF55@ugli.hut.fi> + + [25414] on 2005/09/14 by rgs@bloom + + Subject: [PATCH] Math::Complex and Math::Trig updates (Re: [perl #37117] Math::Complex atan2 bug) + From: Jarkko Hietaniemi + Date: Wed, 14 Sep 2005 09:26:11 +0300 + Message-ID: <4327C283.80706@gmail.com> + + [19376] on 2003/05/02 by jhi@kosh + + great_circle_direction() was broken, + reported by Alexander Becher. + + [18412] on 2003/01/03 by hv@hv-crypt.org + + Integrate from maint-5.8 #18348: + Make Math::Trig a little bit more better behaved module citizen. + + [17197] on 2002/06/12 by jhi@alpha + + Test relying on undefined behaviour of atan2(0, 0) + (valiantly debugged by Mark Lutz). + + [14508] on 2002/01/31 by jhi@alpha + + Daniel S. Lewart adopts the Math::Complex. + + [14507] on 2002/01/31 by jhi@alpha + + More Complex DWIMmery. + + [12954] on 2001/11/12 by jhi@alpha + + Subject: [PATCH] a few typo fixes + From: Jeffrey Friedl + Date: Sun, 11 Nov 2001 21:15:18 -0800 (PST) + Message-Id: <200111120515.fAC5FIc74795@ventrue.corp.yahoo.com> + + Patching README.foo instead of pod/perlfoo.pod, + not patching Math::BigInt (Tels will take care of that), + dropping broken hv.c and sv.h patches, patching libnetcfg.PL + and perldoc.PL instead of libnetcfg and perldoc, patching + ext/Digest/MD5/t/files.t since MD5.pm was changed. + + [12113] on 2001/09/21 by ams@ams-lustre + + Subject: [PATCH] avoid v-strings with require/use + From: Ronald J Kimball + Date: Fri, 21 Sep 2001 12:34:40 -0400 + Message-Id: <20010921123440.A148500@linguist.thayer.dartmouth.edu> + + [12041] on 2001/09/16 by jhi@alpha + + Change use|require 5.005_64 to use|require 5.6.1. + + [11016] on 2001/06/29 by jhi@alpha + + Bump up the VERSIONs of modules that have changed since 5.6.0, + the modules found using a script written by Larry Schatzer Jr. + + [10676] on 2001/06/18 by jhi@alpha + + The Grand Trek: move the *.t files from t/ to lib/ and ext/. + No doubt I made some mistakes like missed some files or + misnamed some files. The naming rules were more or less: + (1) if the module is from CPAN, follows its ways, be it + t/*.t or test.pl. + (2) otherwise if there are multiple tests for a module + put them in a t/ + (3) otherwise if there's only one test put it in Module.t + (4) helper files go to module/ (locale, strict, warnings) + (5) use longer filenames now that we can (but e.g. the + compat-0.6.t and the Text::Balanced test files still + were renamed to be more civil against the 8.3 people) + installperl was updated appropriately not to install the + *.t files or the help files from under lib. + + TODO: some helper files still remain under t/ that could + follow their 'masters'. UPDATE: On second thoughts, why + should they. They can continue to live under t/lib, and + in fact the locale/strict/warnings helpers that were moved + could be moved back. This way the amount of non-installable + stuff under lib/ stays smaller. + + [9504] on 2001/04/01 by jhi@alpha + + Add great_circle_direction(). + + [9007] on 2001/03/03 by jhi@alpha + + Integrate change #9006 from maintperl to mainline, + more robust quest for the infinite. + + [8722] on 2001/02/09 by jhi@alpha + + The Im() function wasn't returning zero for non-Math::Complex + arguments. The bug reported by John Gamble. + + [7561] on 2000/11/05 by jhi@alpha + + Add =pod to be tidy. + + [6857] on 2000/08/28 by jhi@alpha + + display_format used as a class method without arguments was broken, + reported in + + Subject: Math::Complex->display_format() sets style to 'Math::Complex' + From: Yasushi Nakajima + Date: Mon, 28 Aug 2000 16:38:08 +0900 (JST) + Message-Id: <200008280738.QAA00215@san.p.kyoto.jkc.co.jp> + + [6750] on 2000/08/21 by jhi@alpha + + Unicos/mk requires elaborate paranoia. + + [6689] on 2000/08/18 by jhi@alpha + + Fix the lib/complex failure of + + From: abigail@foad.org + Subject: [ID 20000814.005] Not OK: perl v5.6.0 on i686-linux-64int 2.2.13 + Date: 15 Aug 2000 04:06:38 -0000 + Message-Id: <20000815040638.8524.qmail@foad.org> + + Linux long double accuracy issue: something that + when printed with %g looks like "2" but int() of it is 1. + + [6827] on 2000/08/25 by jhi@alpha + + Support preserving extremely big/small angles. + + [6076] on 2000/05/06 by gsar@auger + + integrate cfgperl contents into mainline + + [5974] on 2000/04/27 by gsar@auger + + change#4197 somehow missed initializing PL_errors, meaning + sytax error queueing wasn't working outside eval"" at all; + also fixed eval"" to localize PL_error_count, so that compile-time + eval's don't clobber the error state of the outer context + + [5954] on 2000/04/26 by gsar@auger + + integrate cfgperl contents into mainline + + [5641] on 2000/03/11 by gsar@auger + + integrate cfgperl contents into mainline + + [5611] on 2000/03/08 by gsar@auger + + integrate cfgperl changes into mainline + + [5507] on 2000/03/04 by gsar@auger + + more whitespace removal (from Michael G Schwern) + + [4874] on 2000/01/24 by gsar@auger + + fix typos; avoid use constant for lowercase constants (produces + warnings now) + + [4860] on 2000/01/23 by gsar@auger + + s/use vars/our/g modules that aren't independently maintained on CPAN + + [4604] on 1999/12/01 by gsar@auger + + email address changes + + [4008] on 1999/08/20 by gsar@auger + + integrate cfgperl contents into mainline + + [2830] on 1999/02/08 by gsar@sparc26 + + integrate cfgperl changes into mainline + + + [2620] on 1999/01/17 by gsar@aatma + + integrate cfgperl changes into mainline, fix conflicts + + [2219] on 1998/11/08 by gsar@aatma + + integrate cfgperl changes into mainline + + [1760] on 1998/08/08 by gsar@aatma + + integrate maint-5.005 changes into mainline + + [1357] on 1998/07/07 by gsar@aatma + + doc tweaks suggested by Abigail, M.J.T. Guy, and Larry Wall + + [1267] on 1998/06/30 by gsar@aatma + + add patch to integrate Math::Trig::Radial into Math::Trig + From: Jarkko Hietaniemi + Date: Mon, 29 Jun 1998 16:28:53 +0300 (EET DST) + Message-Id: <199806291328.QAA16916@alpha.hut.fi> + Subject: [PATCH] 5.004_68 (or 5.004_04): radial trig + + [1235] on 1998/06/28 by gsar@aatma + + Complex.pm update + From: Jarkko Hietaniemi + Date: Wed, 24 Jun 1998 15:19:05 +0300 (EET DST) + Message-Id: <199806241219.PAA04061@alpha.hut.fi> + Subject: [PATCH] 5.004_68: Complex.pm, complex.t + + [476] on 1998/02/06 by mbeattie@localhost + + From: Jarkko Hietaniemi + Subject: [PATCH] almost OK: perl 5.00457 on i386-freebsd-thread 3.0 + Date: Wed, 4 Feb 1998 12:59:47 +0200 (EET) + Subject: Re: [PATCH] 5.004_04 and 5.004_57: Complex.pm and complex.t + Date: Thu, 5 Feb 1998 18:08:20 +0200 (EET) + + [439] on 1998/01/27 by mbeattie@localhost + + Integrate ansi branch into mainline (resolve -ay). + + [296] on 1997/11/25 by mbeattie@localhost + + Integrate from ansi branch to mainline. + + [137] on 1997/10/16 by mbeattie@localhost + + Merge maint-5.004 branch (5.004_04) with mainline. + + [114] on 1997/10/08 by mbeattie@localhost + + Merge maint-5.004 branch (5.004_03) with mainline. + MANIFEST is out of sync. + + [77] on 1997/09/29 by mbeattie@localhost + + Start merge with maint-5.004 branch by creating an ancestral + branch point via a fake resolution with the maint-merge branch. + See Perforce Tech Note 9 for details. + + [18] on 1997/05/25 by mbeattie@localhost + + First stab at 5.003 -> 5.004 integration. + + [1] on 1997/03/28 by mbeattie@localhost + + Perl 5.003 check-in + Index: gnu/usr.bin/perl/dist/Math-Complex/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/Math-Complex/Makefile.PL diff -N gnu/usr.bin/perl/dist/Math-Complex/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Math-Complex/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,22 @@ +{ use 5.006; } + +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'Math::Complex', + VERSION_FROM => 'lib/Math/Complex.pm', + INSTALLDIRS => ( $] < 5.011 ? 'perl' : 'site' ), + PREREQ_PM => + { + 'Config' => 0, + 'Exporter' => 0, + 'ExtUtils::MakeMaker' => 0, + 'Scalar::Util' => '1.11', + 'Test::More' => 0, + 'overload' => 0, + 'strict' => 0, + 'warnings' => 0, + }, + ($ExtUtils::MakeMaker::VERSION >= 6.3002 ? + ('LICENSE'=> 'perl_5', ) : ()), + ); Index: gnu/usr.bin/perl/dist/Math-Complex/TODO =================================================================== RCS file: gnu/usr.bin/perl/dist/Math-Complex/TODO diff -N gnu/usr.bin/perl/dist/Math-Complex/TODO --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Math-Complex/TODO 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1 @@ +- possible to make Math::Complex and bignum (Math::BigFloat) to play well? Index: gnu/usr.bin/perl/dist/Math-Complex/lib/Math/Complex.pm =================================================================== RCS file: gnu/usr.bin/perl/dist/Math-Complex/lib/Math/Complex.pm diff -N gnu/usr.bin/perl/dist/Math-Complex/lib/Math/Complex.pm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Math-Complex/lib/Math/Complex.pm 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,2132 @@ +# +# Complex numbers and associated mathematical functions +# -- Raphael Manfredi Since Sep 1996 +# -- Jarkko Hietaniemi Since Mar 1997 +# -- Daniel S. Lewart Since Sep 1997 +# + +package Math::Complex; + +{ use 5.006; } +use strict; + +our $VERSION = 1.62; + +use Config; + +our ($Inf, $ExpInf); +our ($vax_float, $has_inf, $has_nan); + +BEGIN { + $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/); + $has_inf = !$vax_float; + $has_nan = !$vax_float; + + unless ($has_inf) { + # For example in vax, there is no Inf, + # and just mentioning the DBL_MAX (1.70141183460469229e+38) + # causes SIGFPE. + + # These are pretty useless without a real infinity, + # but setting them makes for less warnings about their + # undefined values. + $Inf = "Inf"; + $ExpInf = "Inf"; + return; + } + + my %DBL_MAX = # These are IEEE 754 maxima. + ( + 4 => '1.70141183460469229e+38', + 8 => '1.7976931348623157e+308', + # AFAICT the 10, 12, and 16-byte long doubles + # all have the same maximum. + 10 => '1.1897314953572317650857593266280070162E+4932', + 12 => '1.1897314953572317650857593266280070162E+4932', + 16 => '1.1897314953572317650857593266280070162E+4932', + ); + + my $nvsize = $Config{nvsize} || + ($Config{uselongdouble} && $Config{longdblsize}) || + $Config{doublesize}; + die "Math::Complex: Could not figure out nvsize\n" + unless defined $nvsize; + die "Math::Complex: Cannot not figure out max nv (nvsize = $nvsize)\n" + unless defined $DBL_MAX{$nvsize}; + my $DBL_MAX = eval $DBL_MAX{$nvsize}; + die "Math::Complex: Could not figure out max nv (nvsize = $nvsize)\n" + unless defined $DBL_MAX; + my $BIGGER_THAN_THIS = 1e30; # Must find something bigger than this. + if ($^O eq 'unicosmk') { + $Inf = $DBL_MAX; + } else { + local $SIG{FPE} = sub { }; + local $!; + # We do want an arithmetic overflow, Inf INF inf Infinity. + for my $t ( + 'exp(99999)', # Enough even with 128-bit long doubles. + 'inf', + 'Inf', + 'INF', + 'infinity', + 'Infinity', + 'INFINITY', + '1e99999', + ) { + local $^W = 0; + my $i = eval "$t+1.0"; + if (defined $i && $i > $BIGGER_THAN_THIS) { + $Inf = $i; + last; + } + } + $Inf = $DBL_MAX unless defined $Inf; # Oh well, close enough. + die "Math::Complex: Could not get Infinity" + unless $Inf > $BIGGER_THAN_THIS; + $ExpInf = eval 'exp(99999)'; + } + # print "# On this machine, Inf = '$Inf'\n"; +} + +use Scalar::Util qw(set_prototype); + +use warnings; +no warnings 'syntax'; # To avoid the (_) warnings. + +BEGIN { + # For certain functions that we override, in 5.10 or better + # we can set a smarter prototype that will handle the lexical $_ + # (also a 5.10+ feature). + if ($] >= 5.010000) { + set_prototype \&abs, '_'; + set_prototype \&cos, '_'; + set_prototype \&exp, '_'; + set_prototype \&log, '_'; + set_prototype \&sin, '_'; + set_prototype \&sqrt, '_'; + } +} + +my $i; +my %LOGN; + +# Regular expression for floating point numbers. +# These days we could use Scalar::Util::lln(), I guess. +my $gre = qr'\s*([\+\-]?(?:(?:(?:\d+(?:_\d+)*(?:\.\d*(?:_\d+)*)?|\.\d+(?:_\d+)*)(?:[eE][\+\-]?\d+(?:_\d+)*)?))|inf)'i; + +require Exporter; + +our @ISA = qw(Exporter); + +my @trig = qw( + pi + tan + csc cosec sec cot cotan + asin acos atan + acsc acosec asec acot acotan + sinh cosh tanh + csch cosech sech coth cotanh + asinh acosh atanh + acsch acosech asech acoth acotanh + ); + +our @EXPORT = (qw( + i Re Im rho theta arg + sqrt log ln + log10 logn cbrt root + cplx cplxe + atan2 + ), + @trig); + +my @pi = qw(pi pi2 pi4 pip2 pip4 Inf); + +our @EXPORT_OK = @pi; + +our %EXPORT_TAGS = ( + 'trig' => [@trig], + 'pi' => [@pi], +); + +use overload + '=' => \&_copy, + '+=' => \&_plus, + '+' => \&_plus, + '-=' => \&_minus, + '-' => \&_minus, + '*=' => \&_multiply, + '*' => \&_multiply, + '/=' => \&_divide, + '/' => \&_divide, + '**=' => \&_power, + '**' => \&_power, + '==' => \&_numeq, + '<=>' => \&_spaceship, + 'neg' => \&_negate, + '~' => \&_conjugate, + 'abs' => \&abs, + 'sqrt' => \&sqrt, + 'exp' => \&exp, + 'log' => \&log, + 'sin' => \&sin, + 'cos' => \&cos, + 'atan2' => \&atan2, + '""' => \&_stringify; + +# +# Package "privates" +# + +my %DISPLAY_FORMAT = ('style' => 'cartesian', + 'polar_pretty_print' => 1); +my $eps = 1e-14; # Epsilon + +# +# Object attributes (internal): +# cartesian [real, imaginary] -- cartesian form +# polar [rho, theta] -- polar form +# c_dirty cartesian form not up-to-date +# p_dirty polar form not up-to-date +# display display format (package's global when not set) +# + +# Die on bad *make() arguments. + +sub _cannot_make { + die "@{[(caller(1))[3]]}: Cannot take $_[0] of '$_[1]'.\n"; +} + +sub _make { + my $arg = shift; + my ($p, $q); + + if ($arg =~ /^$gre$/) { + ($p, $q) = ($1, 0); + } elsif ($arg =~ /^(?:$gre)?$gre\s*i\s*$/) { + ($p, $q) = ($1 || 0, $2); + } elsif ($arg =~ /^\s*\(\s*$gre\s*(?:,\s*$gre\s*)?\)\s*$/) { + ($p, $q) = ($1, $2 || 0); + } + + if (defined $p) { + $p =~ s/^\+//; + $p =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf; + $q =~ s/^\+//; + $q =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf; + } + + return ($p, $q); +} + +sub _emake { + my $arg = shift; + my ($p, $q); + + if ($arg =~ /^\s*\[\s*$gre\s*(?:,\s*$gre\s*)?\]\s*$/) { + ($p, $q) = ($1, $2 || 0); + } elsif ($arg =~ m!^\s*\[\s*$gre\s*(?:,\s*([-+]?\d*\s*)?pi(?:/\s*(\d+))?\s*)?\]\s*$!) { + ($p, $q) = ($1, ($2 eq '-' ? -1 : ($2 || 1)) * pi() / ($3 || 1)); + } elsif ($arg =~ /^\s*\[\s*$gre\s*\]\s*$/) { + ($p, $q) = ($1, 0); + } elsif ($arg =~ /^\s*$gre\s*$/) { + ($p, $q) = ($1, 0); + } + + if (defined $p) { + $p =~ s/^\+//; + $q =~ s/^\+//; + $p =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf; + $q =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf; + } + + return ($p, $q); +} + +sub _copy { + my $self = shift; + my $clone = {%$self}; + if ($self->{'cartesian'}) { + $clone->{'cartesian'} = [@{$self->{'cartesian'}}]; + } + if ($self->{'polar'}) { + $clone->{'polar'} = [@{$self->{'polar'}}]; + } + bless $clone,__PACKAGE__; + return $clone; +} + +# +# ->make +# +# Create a new complex number (cartesian form) +# +sub make { + my $self = bless {}, shift; + my ($re, $im); + if (@_ == 0) { + ($re, $im) = (0, 0); + } elsif (@_ == 1) { + return (ref $self)->emake($_[0]) + if ($_[0] =~ /^\s*\[/); + ($re, $im) = _make($_[0]); + } elsif (@_ == 2) { + ($re, $im) = @_; + } + if (defined $re) { + _cannot_make("real part", $re) unless $re =~ /^$gre$/; + } + $im ||= 0; + _cannot_make("imaginary part", $im) unless $im =~ /^$gre$/; + $self->_set_cartesian([$re, $im ]); + $self->display_format('cartesian'); + + return $self; +} + +# +# ->emake +# +# Create a new complex number (exponential form) +# +sub emake { + my $self = bless {}, shift; + my ($rho, $theta); + if (@_ == 0) { + ($rho, $theta) = (0, 0); + } elsif (@_ == 1) { + return (ref $self)->make($_[0]) + if ($_[0] =~ /^\s*\(/ || $_[0] =~ /i\s*$/); + ($rho, $theta) = _emake($_[0]); + } elsif (@_ == 2) { + ($rho, $theta) = @_; + } + if (defined $rho && defined $theta) { + if ($rho < 0) { + $rho = -$rho; + $theta = ($theta <= 0) ? $theta + pi() : $theta - pi(); + } + } + if (defined $rho) { + _cannot_make("rho", $rho) unless $rho =~ /^$gre$/; + } + $theta ||= 0; + _cannot_make("theta", $theta) unless $theta =~ /^$gre$/; + $self->_set_polar([$rho, $theta]); + $self->display_format('polar'); + + return $self; +} + +sub new { &make } # For backward compatibility only. + +# +# cplx +# +# Creates a complex number from a (re, im) tuple. +# This avoids the burden of writing Math::Complex->make(re, im). +# +sub cplx { + return __PACKAGE__->make(@_); +} + +# +# cplxe +# +# Creates a complex number from a (rho, theta) tuple. +# This avoids the burden of writing Math::Complex->emake(rho, theta). +# +sub cplxe { + return __PACKAGE__->emake(@_); +} + +# +# pi +# +# The number defined as pi = 180 degrees +# +sub pi () { 4 * CORE::atan2(1, 1) } + +# +# pi2 +# +# The full circle +# +sub pi2 () { 2 * pi } + +# +# pi4 +# +# The full circle twice. +# +sub pi4 () { 4 * pi } + +# +# pip2 +# +# The quarter circle +# +sub pip2 () { pi / 2 } + +# +# pip4 +# +# The eighth circle. +# +sub pip4 () { pi / 4 } + +# +# _uplog10 +# +# Used in log10(). +# +sub _uplog10 () { 1 / CORE::log(10) } + +# +# i +# +# The number defined as i*i = -1; +# +sub i () { + return $i if ($i); + $i = bless {}; + $i->{'cartesian'} = [0, 1]; + $i->{'polar'} = [1, pip2]; + $i->{c_dirty} = 0; + $i->{p_dirty} = 0; + return $i; +} + +# +# _ip2 +# +# Half of i. +# +sub _ip2 () { i / 2 } + +# +# Attribute access/set routines +# + +sub _cartesian {$_[0]->{c_dirty} ? + $_[0]->_update_cartesian : $_[0]->{'cartesian'}} +sub _polar {$_[0]->{p_dirty} ? + $_[0]->_update_polar : $_[0]->{'polar'}} + +sub _set_cartesian { $_[0]->{p_dirty}++; $_[0]->{c_dirty} = 0; + $_[0]->{'cartesian'} = $_[1] } +sub _set_polar { $_[0]->{c_dirty}++; $_[0]->{p_dirty} = 0; + $_[0]->{'polar'} = $_[1] } + +# +# ->_update_cartesian +# +# Recompute and return the cartesian form, given accurate polar form. +# +sub _update_cartesian { + my $self = shift; + my ($r, $t) = @{$self->{'polar'}}; + $self->{c_dirty} = 0; + return $self->{'cartesian'} = [$r * CORE::cos($t), $r * CORE::sin($t)]; +} + +# +# +# ->_update_polar +# +# Recompute and return the polar form, given accurate cartesian form. +# +sub _update_polar { + my $self = shift; + my ($x, $y) = @{$self->{'cartesian'}}; + $self->{p_dirty} = 0; + return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0; + return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y), + CORE::atan2($y, $x)]; +} + +# +# (_plus) +# +# Computes z1+z2. +# +sub _plus { + my ($z1, $z2, $regular) = @_; + my ($re1, $im1) = @{$z1->_cartesian}; + $z2 = cplx($z2) unless ref $z2; + my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0); + unless (defined $regular) { + $z1->_set_cartesian([$re1 + $re2, $im1 + $im2]); + return $z1; + } + return (ref $z1)->make($re1 + $re2, $im1 + $im2); +} + +# +# (_minus) +# +# Computes z1-z2. +# +sub _minus { + my ($z1, $z2, $inverted) = @_; + my ($re1, $im1) = @{$z1->_cartesian}; + $z2 = cplx($z2) unless ref $z2; + my ($re2, $im2) = @{$z2->_cartesian}; + unless (defined $inverted) { + $z1->_set_cartesian([$re1 - $re2, $im1 - $im2]); + return $z1; + } + return $inverted ? + (ref $z1)->make($re2 - $re1, $im2 - $im1) : + (ref $z1)->make($re1 - $re2, $im1 - $im2); + +} + +# +# (_multiply) +# +# Computes z1*z2. +# +sub _multiply { + my ($z1, $z2, $regular) = @_; + if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) { + # if both polar better use polar to avoid rounding errors + my ($r1, $t1) = @{$z1->_polar}; + my ($r2, $t2) = @{$z2->_polar}; + my $t = $t1 + $t2; + if ($t > pi()) { $t -= pi2 } + elsif ($t <= -pi()) { $t += pi2 } + unless (defined $regular) { + $z1->_set_polar([$r1 * $r2, $t]); + return $z1; + } + return (ref $z1)->emake($r1 * $r2, $t); + } else { + my ($x1, $y1) = @{$z1->_cartesian}; + if (ref $z2) { + my ($x2, $y2) = @{$z2->_cartesian}; + return (ref $z1)->make($x1*$x2-$y1*$y2, $x1*$y2+$y1*$x2); + } else { + return (ref $z1)->make($x1*$z2, $y1*$z2); + } + } +} + +# +# _divbyzero +# +# Die on division by zero. +# +sub _divbyzero { + my $mess = "$_[0]: Division by zero.\n"; + + if (defined $_[1]) { + $mess .= "(Because in the definition of $_[0], the divisor "; + $mess .= "$_[1] " unless ("$_[1]" eq '0'); + $mess .= "is 0)\n"; + } + + my @up = caller(1); + + $mess .= "Died at $up[1] line $up[2].\n"; + + die $mess; +} + +# +# (_divide) +# +# Computes z1/z2. +# +sub _divide { + my ($z1, $z2, $inverted) = @_; + if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) { + # if both polar better use polar to avoid rounding errors + my ($r1, $t1) = @{$z1->_polar}; + my ($r2, $t2) = @{$z2->_polar}; + my $t; + if ($inverted) { + _divbyzero "$z2/0" if ($r1 == 0); + $t = $t2 - $t1; + if ($t > pi()) { $t -= pi2 } + elsif ($t <= -pi()) { $t += pi2 } + return (ref $z1)->emake($r2 / $r1, $t); + } else { + _divbyzero "$z1/0" if ($r2 == 0); + $t = $t1 - $t2; + if ($t > pi()) { $t -= pi2 } + elsif ($t <= -pi()) { $t += pi2 } + return (ref $z1)->emake($r1 / $r2, $t); + } + } else { + my ($d, $x2, $y2); + if ($inverted) { + ($x2, $y2) = @{$z1->_cartesian}; + $d = $x2*$x2 + $y2*$y2; + _divbyzero "$z2/0" if $d == 0; + return (ref $z1)->make(($x2*$z2)/$d, -($y2*$z2)/$d); + } else { + my ($x1, $y1) = @{$z1->_cartesian}; + if (ref $z2) { + ($x2, $y2) = @{$z2->_cartesian}; + $d = $x2*$x2 + $y2*$y2; + _divbyzero "$z1/0" if $d == 0; + my $u = ($x1*$x2 + $y1*$y2)/$d; + my $v = ($y1*$x2 - $x1*$y2)/$d; + return (ref $z1)->make($u, $v); + } else { + _divbyzero "$z1/0" if $z2 == 0; + return (ref $z1)->make($x1/$z2, $y1/$z2); + } + } + } +} + +# +# (_power) +# +# Computes z1**z2 = exp(z2 * log z1)). +# +sub _power { + my ($z1, $z2, $inverted) = @_; + if ($inverted) { + return 1 if $z1 == 0 || $z2 == 1; + return 0 if $z2 == 0 && Re($z1) > 0; + } else { + return 1 if $z2 == 0 || $z1 == 1; + return 0 if $z1 == 0 && Re($z2) > 0; + } + my $w = $inverted ? &exp($z1 * &log($z2)) + : &exp($z2 * &log($z1)); + # If both arguments cartesian, return cartesian, else polar. + return $z1->{c_dirty} == 0 && + (not ref $z2 or $z2->{c_dirty} == 0) ? + cplx(@{$w->_cartesian}) : $w; +} + +# +# (_spaceship) +# +# Computes z1 <=> z2. +# Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i. +# +sub _spaceship { + my ($z1, $z2, $inverted) = @_; + my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0); + my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0); + my $sgn = $inverted ? -1 : 1; + return $sgn * ($re1 <=> $re2) if $re1 != $re2; + return $sgn * ($im1 <=> $im2); +} + +# +# (_numeq) +# +# Computes z1 == z2. +# +# (Required in addition to _spaceship() because of NaNs.) +sub _numeq { + my ($z1, $z2, $inverted) = @_; + my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0); + my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0); + return $re1 == $re2 && $im1 == $im2 ? 1 : 0; +} + +# +# (_negate) +# +# Computes -z. +# +sub _negate { + my ($z) = @_; + if ($z->{c_dirty}) { + my ($r, $t) = @{$z->_polar}; + $t = ($t <= 0) ? $t + pi : $t - pi; + return (ref $z)->emake($r, $t); + } + my ($re, $im) = @{$z->_cartesian}; + return (ref $z)->make(-$re, -$im); +} + +# +# (_conjugate) +# +# Compute complex's _conjugate. +# +sub _conjugate { + my ($z) = @_; + if ($z->{c_dirty}) { + my ($r, $t) = @{$z->_polar}; + return (ref $z)->emake($r, -$t); + } + my ($re, $im) = @{$z->_cartesian}; + return (ref $z)->make($re, -$im); +} + +# +# (abs) +# +# Compute or set complex's norm (rho). +# +sub abs { + my ($z, $rho) = @_ ? @_ : $_; + unless (ref $z) { + if (@_ == 2) { + $_[0] = $_[1]; + } else { + return CORE::abs($z); + } + } + if (defined $rho) { + $z->{'polar'} = [ $rho, ${$z->_polar}[1] ]; + $z->{p_dirty} = 0; + $z->{c_dirty} = 1; + return $rho; + } else { + return ${$z->_polar}[0]; + } +} + +sub _theta { + my $theta = $_[0]; + + if ($$theta > pi()) { $$theta -= pi2 } + elsif ($$theta <= -pi()) { $$theta += pi2 } +} + +# +# arg +# +# Compute or set complex's argument (theta). +# +sub arg { + my ($z, $theta) = @_; + return $z unless ref $z; + if (defined $theta) { + _theta(\$theta); + $z->{'polar'} = [ ${$z->_polar}[0], $theta ]; + $z->{p_dirty} = 0; + $z->{c_dirty} = 1; + } else { + $theta = ${$z->_polar}[1]; + _theta(\$theta); + } + return $theta; +} + +# +# (sqrt) +# +# Compute sqrt(z). +# +# It is quite tempting to use wantarray here so that in list context +# sqrt() would return the two solutions. This, however, would +# break things like +# +# print "sqrt(z) = ", sqrt($z), "\n"; +# +# The two values would be printed side by side without no intervening +# whitespace, quite confusing. +# Therefore if you want the two solutions use the root(). +# +sub sqrt { + my ($z) = @_ ? $_[0] : $_; + my ($re, $im) = ref $z ? @{$z->_cartesian} : ($z, 0); + return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re) + if $im == 0; + my ($r, $t) = @{$z->_polar}; + return (ref $z)->emake(CORE::sqrt($r), $t/2); +} + +# +# cbrt +# +# Compute cbrt(z) (cubic root). +# +# Why are we not returning three values? The same answer as for sqrt(). +# +sub cbrt { + my ($z) = @_; + return $z < 0 ? + -CORE::exp(CORE::log(-$z)/3) : + ($z > 0 ? CORE::exp(CORE::log($z)/3): 0) + unless ref $z; + my ($r, $t) = @{$z->_polar}; + return 0 if $r == 0; + return (ref $z)->emake(CORE::exp(CORE::log($r)/3), $t/3); +} + +# +# _rootbad +# +# Die on bad root. +# +sub _rootbad { + my $mess = "Root '$_[0]' illegal, root rank must be positive integer.\n"; + + my @up = caller(1); + + $mess .= "Died at $up[1] line $up[2].\n"; + + die $mess; +} + +# +# root +# +# Computes all nth root for z, returning an array whose size is n. +# `n' must be a positive integer. +# +# The roots are given by (for k = 0..n-1): +# +# z^(1/n) = r^(1/n) (cos ((t+2 k pi)/n) + i sin ((t+2 k pi)/n)) +# +sub root { + my ($z, $n, $k) = @_; + _rootbad($n) if ($n < 1 or int($n) != $n); + my ($r, $t) = ref $z ? + @{$z->_polar} : (CORE::abs($z), $z >= 0 ? 0 : pi); + my $theta_inc = pi2 / $n; + my $rho = $r ** (1/$n); + my $cartesian = ref $z && $z->{c_dirty} == 0; + if (@_ == 2) { + my @root; + for (my $i = 0, my $theta = $t / $n; + $i < $n; + $i++, $theta += $theta_inc) { + my $w = cplxe($rho, $theta); + # Yes, $cartesian is loop invariant. + push @root, $cartesian ? cplx(@{$w->_cartesian}) : $w; + } + return @root; + } elsif (@_ == 3) { + my $w = cplxe($rho, $t / $n + $k * $theta_inc); + return $cartesian ? cplx(@{$w->_cartesian}) : $w; + } +} + +# +# Re +# +# Return or set Re(z). +# +sub Re { + my ($z, $Re) = @_; + return $z unless ref $z; + if (defined $Re) { + $z->{'cartesian'} = [ $Re, ${$z->_cartesian}[1] ]; + $z->{c_dirty} = 0; + $z->{p_dirty} = 1; + } else { + return ${$z->_cartesian}[0]; + } +} + +# +# Im +# +# Return or set Im(z). +# +sub Im { + my ($z, $Im) = @_; + return 0 unless ref $z; + if (defined $Im) { + $z->{'cartesian'} = [ ${$z->_cartesian}[0], $Im ]; + $z->{c_dirty} = 0; + $z->{p_dirty} = 1; + } else { + return ${$z->_cartesian}[1]; + } +} + +# +# rho +# +# Return or set rho(w). +# +sub rho { + Math::Complex::abs(@_); +} + +# +# theta +# +# Return or set theta(w). +# +sub theta { + Math::Complex::arg(@_); +} + +# +# (exp) +# +# Computes exp(z). +# +sub exp { + my ($z) = @_ ? @_ : $_; + return CORE::exp($z) unless ref $z; + my ($x, $y) = @{$z->_cartesian}; + return (ref $z)->emake(CORE::exp($x), $y); +} + +# +# _logofzero +# +# Die on logarithm of zero. +# +sub _logofzero { + my $mess = "$_[0]: Logarithm of zero.\n"; + + if (defined $_[1]) { + $mess .= "(Because in the definition of $_[0], the argument "; + $mess .= "$_[1] " unless ($_[1] eq '0'); + $mess .= "is 0)\n"; + } + + my @up = caller(1); + + $mess .= "Died at $up[1] line $up[2].\n"; + + die $mess; +} + +# +# (log) +# +# Compute log(z). +# +sub log { + my ($z) = @_ ? @_ : $_; + unless (ref $z) { + _logofzero("log") if $z == 0; + return $z > 0 ? CORE::log($z) : cplx(CORE::log(-$z), pi); + } + my ($r, $t) = @{$z->_polar}; + _logofzero("log") if $r == 0; + if ($t > pi()) { $t -= pi2 } + elsif ($t <= -pi()) { $t += pi2 } + return (ref $z)->make(CORE::log($r), $t); +} + +# +# ln +# +# Alias for log(). +# +sub ln { Math::Complex::log(@_) } + +# +# log10 +# +# Compute log10(z). +# + +sub log10 { + return Math::Complex::log($_[0]) * _uplog10; +} + +# +# logn +# +# Compute logn(z,n) = log(z) / log(n) +# +sub logn { + my ($z, $n) = @_; + $z = cplx($z, 0) unless ref $z; + my $logn = $LOGN{$n}; + $logn = $LOGN{$n} = CORE::log($n) unless defined $logn; # Cache log(n) + return &log($z) / $logn; +} + +# +# (cos) +# +# Compute cos(z) = (exp(iz) + exp(-iz))/2. +# +sub cos { + my ($z) = @_ ? @_ : $_; + return CORE::cos($z) unless ref $z; + my ($x, $y) = @{$z->_cartesian}; + my $ey = CORE::exp($y); + my $sx = CORE::sin($x); + my $cx = CORE::cos($x); + my $ey_1 = $ey ? 1 / $ey : Inf(); + return (ref $z)->make($cx * ($ey + $ey_1)/2, + $sx * ($ey_1 - $ey)/2); +} + +# +# (sin) +# +# Compute sin(z) = (exp(iz) - exp(-iz))/2. +# +sub sin { + my ($z) = @_ ? @_ : $_; + return CORE::sin($z) unless ref $z; + my ($x, $y) = @{$z->_cartesian}; + my $ey = CORE::exp($y); + my $sx = CORE::sin($x); + my $cx = CORE::cos($x); + my $ey_1 = $ey ? 1 / $ey : Inf(); + return (ref $z)->make($sx * ($ey + $ey_1)/2, + $cx * ($ey - $ey_1)/2); +} + +# +# tan +# +# Compute tan(z) = sin(z) / cos(z). +# +sub tan { + my ($z) = @_; + my $cz = &cos($z); + _divbyzero "tan($z)", "cos($z)" if $cz == 0; + return &sin($z) / $cz; +} + +# +# sec +# +# Computes the secant sec(z) = 1 / cos(z). +# +sub sec { + my ($z) = @_; + my $cz = &cos($z); + _divbyzero "sec($z)", "cos($z)" if ($cz == 0); + return 1 / $cz; +} + +# +# csc +# +# Computes the cosecant csc(z) = 1 / sin(z). +# +sub csc { + my ($z) = @_; + my $sz = &sin($z); + _divbyzero "csc($z)", "sin($z)" if ($sz == 0); + return 1 / $sz; +} + +# +# cosec +# +# Alias for csc(). +# +sub cosec { Math::Complex::csc(@_) } + +# +# cot +# +# Computes cot(z) = cos(z) / sin(z). +# +sub cot { + my ($z) = @_; + my $sz = &sin($z); + _divbyzero "cot($z)", "sin($z)" if ($sz == 0); + return &cos($z) / $sz; +} + +# +# cotan +# +# Alias for cot(). +# +sub cotan { Math::Complex::cot(@_) } + +# +# acos +# +# Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)). +# +sub acos { + my $z = $_[0]; + return CORE::atan2(CORE::sqrt(1-$z*$z), $z) + if (! ref $z) && CORE::abs($z) <= 1; + $z = cplx($z, 0) unless ref $z; + my ($x, $y) = @{$z->_cartesian}; + return 0 if $x == 1 && $y == 0; + my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y); + my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y); + my $alpha = ($t1 + $t2)/2; + my $beta = ($t1 - $t2)/2; + $alpha = 1 if $alpha < 1; + if ($beta > 1) { $beta = 1 } + elsif ($beta < -1) { $beta = -1 } + my $u = CORE::atan2(CORE::sqrt(1-$beta*$beta), $beta); + my $v = CORE::log($alpha + CORE::sqrt($alpha*$alpha-1)); + $v = -$v if $y > 0 || ($y == 0 && $x < -1); + return (ref $z)->make($u, $v); +} + +# +# asin +# +# Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)). +# +sub asin { + my $z = $_[0]; + return CORE::atan2($z, CORE::sqrt(1-$z*$z)) + if (! ref $z) && CORE::abs($z) <= 1; + $z = cplx($z, 0) unless ref $z; + my ($x, $y) = @{$z->_cartesian}; + return 0 if $x == 0 && $y == 0; + my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y); + my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y); + my $alpha = ($t1 + $t2)/2; + my $beta = ($t1 - $t2)/2; + $alpha = 1 if $alpha < 1; + if ($beta > 1) { $beta = 1 } + elsif ($beta < -1) { $beta = -1 } + my $u = CORE::atan2($beta, CORE::sqrt(1-$beta*$beta)); + my $v = -CORE::log($alpha + CORE::sqrt($alpha*$alpha-1)); + $v = -$v if $y > 0 || ($y == 0 && $x < -1); + return (ref $z)->make($u, $v); +} + +# +# atan +# +# Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)). +# +sub atan { + my ($z) = @_; + return CORE::atan2($z, 1) unless ref $z; + my ($x, $y) = ref $z ? @{$z->_cartesian} : ($z, 0); + return 0 if $x == 0 && $y == 0; + _divbyzero "atan(i)" if ( $z == i); + _logofzero "atan(-i)" if (-$z == i); # -i is a bad file test... + my $log = &log((i + $z) / (i - $z)); + return _ip2 * $log; +} + +# +# asec +# +# Computes the arc secant asec(z) = acos(1 / z). +# +sub asec { + my ($z) = @_; + _divbyzero "asec($z)", $z if ($z == 0); + return acos(1 / $z); +} + +# +# acsc +# +# Computes the arc cosecant acsc(z) = asin(1 / z). +# +sub acsc { + my ($z) = @_; + _divbyzero "acsc($z)", $z if ($z == 0); + return asin(1 / $z); +} + +# +# acosec +# +# Alias for acsc(). +# +sub acosec { Math::Complex::acsc(@_) } + +# +# acot +# +# Computes the arc cotangent acot(z) = atan(1 / z) +# +sub acot { + my ($z) = @_; + _divbyzero "acot(0)" if $z == 0; + return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z) + unless ref $z; + _divbyzero "acot(i)" if ($z - i == 0); + _logofzero "acot(-i)" if ($z + i == 0); + return atan(1 / $z); +} + +# +# acotan +# +# Alias for acot(). +# +sub acotan { Math::Complex::acot(@_) } + +# +# cosh +# +# Computes the hyperbolic cosine cosh(z) = (exp(z) + exp(-z))/2. +# +sub cosh { + my ($z) = @_; + my $ex; + unless (ref $z) { + $ex = CORE::exp($z); + return $ex ? ($ex == $ExpInf ? Inf() : ($ex + 1/$ex)/2) : Inf(); + } + my ($x, $y) = @{$z->_cartesian}; + $ex = CORE::exp($x); + my $ex_1 = $ex ? 1 / $ex : Inf(); + return (ref $z)->make(CORE::cos($y) * ($ex + $ex_1)/2, + CORE::sin($y) * ($ex - $ex_1)/2); +} + +# +# sinh +# +# Computes the hyperbolic sine sinh(z) = (exp(z) - exp(-z))/2. +# +sub sinh { + my ($z) = @_; + my $ex; + unless (ref $z) { + return 0 if $z == 0; + $ex = CORE::exp($z); + return $ex ? ($ex == $ExpInf ? Inf() : ($ex - 1/$ex)/2) : -Inf(); + } + my ($x, $y) = @{$z->_cartesian}; + my $cy = CORE::cos($y); + my $sy = CORE::sin($y); + $ex = CORE::exp($x); + my $ex_1 = $ex ? 1 / $ex : Inf(); + return (ref $z)->make(CORE::cos($y) * ($ex - $ex_1)/2, + CORE::sin($y) * ($ex + $ex_1)/2); +} + +# +# tanh +# +# Computes the hyperbolic tangent tanh(z) = sinh(z) / cosh(z). +# +sub tanh { + my ($z) = @_; + my $cz = cosh($z); + _divbyzero "tanh($z)", "cosh($z)" if ($cz == 0); + my $sz = sinh($z); + return 1 if $cz == $sz; + return -1 if $cz == -$sz; + return $sz / $cz; +} + +# +# sech +# +# Computes the hyperbolic secant sech(z) = 1 / cosh(z). +# +sub sech { + my ($z) = @_; + my $cz = cosh($z); + _divbyzero "sech($z)", "cosh($z)" if ($cz == 0); + return 1 / $cz; +} + +# +# csch +# +# Computes the hyperbolic cosecant csch(z) = 1 / sinh(z). +# +sub csch { + my ($z) = @_; + my $sz = sinh($z); + _divbyzero "csch($z)", "sinh($z)" if ($sz == 0); + return 1 / $sz; +} + +# +# cosech +# +# Alias for csch(). +# +sub cosech { Math::Complex::csch(@_) } + +# +# coth +# +# Computes the hyperbolic cotangent coth(z) = cosh(z) / sinh(z). +# +sub coth { + my ($z) = @_; + my $sz = sinh($z); + _divbyzero "coth($z)", "sinh($z)" if $sz == 0; + my $cz = cosh($z); + return 1 if $cz == $sz; + return -1 if $cz == -$sz; + return $cz / $sz; +} + +# +# cotanh +# +# Alias for coth(). +# +sub cotanh { Math::Complex::coth(@_) } + +# +# acosh +# +# Computes the area/inverse hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)). +# +sub acosh { + my ($z) = @_; + unless (ref $z) { + $z = cplx($z, 0); + } + my ($re, $im) = @{$z->_cartesian}; + if ($im == 0) { + return CORE::log($re + CORE::sqrt($re*$re - 1)) + if $re >= 1; + return cplx(0, CORE::atan2(CORE::sqrt(1 - $re*$re), $re)) + if CORE::abs($re) < 1; + } + my $t = &sqrt($z * $z - 1) + $z; + # Try Taylor if looking bad (this usually means that + # $z was large negative, therefore the sqrt is really + # close to abs(z), summing that with z...) + $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7) + if $t == 0; + my $u = &log($t); + $u->Im(-$u->Im) if $re < 0 && $im == 0; + return $re < 0 ? -$u : $u; +} + +# +# asinh +# +# Computes the area/inverse hyperbolic sine asinh(z) = log(z + sqrt(z*z+1)) +# +sub asinh { + my ($z) = @_; + unless (ref $z) { + my $t = $z + CORE::sqrt($z*$z + 1); + return CORE::log($t) if $t; + } + my $t = &sqrt($z * $z + 1) + $z; + # Try Taylor if looking bad (this usually means that + # $z was large negative, therefore the sqrt is really + # close to abs(z), summing that with z...) + $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7) + if $t == 0; + return &log($t); +} + +# +# atanh +# +# Computes the area/inverse hyperbolic tangent atanh(z) = 1/2 log((1+z) / (1-z)). +# +sub atanh { + my ($z) = @_; + unless (ref $z) { + return CORE::log((1 + $z)/(1 - $z))/2 if CORE::abs($z) < 1; + $z = cplx($z, 0); + } + _divbyzero 'atanh(1)', "1 - $z" if (1 - $z == 0); + _logofzero 'atanh(-1)' if (1 + $z == 0); + return 0.5 * &log((1 + $z) / (1 - $z)); +} + +# +# asech +# +# Computes the area/inverse hyperbolic secant asech(z) = acosh(1 / z). +# +sub asech { + my ($z) = @_; + _divbyzero 'asech(0)', "$z" if ($z == 0); + return acosh(1 / $z); +} + +# +# acsch +# +# Computes the area/inverse hyperbolic cosecant acsch(z) = asinh(1 / z). +# +sub acsch { + my ($z) = @_; + _divbyzero 'acsch(0)', $z if ($z == 0); + return asinh(1 / $z); +} + +# +# acosech +# +# Alias for acosh(). +# +sub acosech { Math::Complex::acsch(@_) } + +# +# acoth +# +# Computes the area/inverse hyperbolic cotangent acoth(z) = 1/2 log((1+z) / (z-1)). +# +sub acoth { + my ($z) = @_; + _divbyzero 'acoth(0)' if ($z == 0); + unless (ref $z) { + return CORE::log(($z + 1)/($z - 1))/2 if CORE::abs($z) > 1; + $z = cplx($z, 0); + } + _divbyzero 'acoth(1)', "$z - 1" if ($z - 1 == 0); + _logofzero 'acoth(-1)', "1 + $z" if (1 + $z == 0); + return &log((1 + $z) / ($z - 1)) / 2; +} + +# +# acotanh +# +# Alias for acot(). +# +sub acotanh { Math::Complex::acoth(@_) } + +# +# (atan2) +# +# Compute atan(z1/z2), minding the right quadrant. +# +sub atan2 { + my ($z1, $z2, $inverted) = @_; + my ($re1, $im1, $re2, $im2); + if ($inverted) { + ($re1, $im1) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0); + ($re2, $im2) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0); + } else { + ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0); + ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0); + } + if ($im1 || $im2) { + # In MATLAB the imaginary parts are ignored. + # warn "atan2: Imaginary parts ignored"; + # http://documents.wolfram.com/mathematica/functions/ArcTan + # NOTE: Mathematica ArcTan[x,y] while atan2(y,x) + my $s = $z1 * $z1 + $z2 * $z2; + _divbyzero("atan2") if $s == 0; + my $i = &i; + my $r = $z2 + $z1 * $i; + return -$i * &log($r / &sqrt( $s )); + } + return CORE::atan2($re1, $re2); +} + +# +# display_format +# ->display_format +# +# Set (get if no argument) the display format for all complex numbers that +# don't happen to have overridden it via ->display_format +# +# When called as an object method, this actually sets the display format for +# the current object. +# +# Valid object formats are 'c' and 'p' for cartesian and polar. The first +# letter is used actually, so the type can be fully spelled out for clarity. +# +sub display_format { + my $self = shift; + my %display_format = %DISPLAY_FORMAT; + + if (ref $self) { # Called as an object method + if (exists $self->{display_format}) { + my %obj = %{$self->{display_format}}; + @display_format{keys %obj} = values %obj; + } + } + if (@_ == 1) { + $display_format{style} = shift; + } else { + my %new = @_; + @display_format{keys %new} = values %new; + } + + if (ref $self) { # Called as an object method + $self->{display_format} = { %display_format }; + return + wantarray ? + %{$self->{display_format}} : + $self->{display_format}->{style}; + } + + # Called as a class method + %DISPLAY_FORMAT = %display_format; + return + wantarray ? + %DISPLAY_FORMAT : + $DISPLAY_FORMAT{style}; +} + +# +# (_stringify) +# +# Show nicely formatted complex number under its cartesian or polar form, +# depending on the current display format: +# +# . If a specific display format has been recorded for this object, use it. +# . Otherwise, use the generic current default for all complex numbers, +# which is a package global variable. +# +sub _stringify { + my ($z) = shift; + + my $style = $z->display_format; + + $style = $DISPLAY_FORMAT{style} unless defined $style; + + return $z->_stringify_polar if $style =~ /^p/i; + return $z->_stringify_cartesian; +} + +# +# ->_stringify_cartesian +# +# Stringify as a cartesian representation 'a+bi'. +# +sub _stringify_cartesian { + my $z = shift; + my ($x, $y) = @{$z->_cartesian}; + my ($re, $im); + + my %format = $z->display_format; + my $format = $format{format}; + + if ($x) { + if ($x =~ /^NaN[QS]?$/i) { + $re = $x; + } else { + if ($x =~ /^-?\Q$Inf\E$/oi) { + $re = $x; + } else { + $re = defined $format ? sprintf($format, $x) : $x; + } + } + } else { + undef $re; + } + + if ($y) { + if ($y =~ /^(NaN[QS]?)$/i) { + $im = $y; + } else { + if ($y =~ /^-?\Q$Inf\E$/oi) { + $im = $y; + } else { + $im = + defined $format ? + sprintf($format, $y) : + ($y == 1 ? "" : ($y == -1 ? "-" : $y)); + } + } + $im .= "i"; + } else { + undef $im; + } + + my $str = $re; + + if (defined $im) { + if ($y < 0) { + $str .= $im; + } elsif ($y > 0 || $im =~ /^NaN[QS]?i$/i) { + $str .= "+" if defined $re; + $str .= $im; + } + } elsif (!defined $re) { + $str = "0"; + } + + return $str; +} + + +# +# ->_stringify_polar +# +# Stringify as a polar representation '[r,t]'. +# +sub _stringify_polar { + my $z = shift; + my ($r, $t) = @{$z->_polar}; + my $theta; + + my %format = $z->display_format; + my $format = $format{format}; + + if ($t =~ /^NaN[QS]?$/i || $t =~ /^-?\Q$Inf\E$/oi) { + $theta = $t; + } elsif ($t == pi) { + $theta = "pi"; + } elsif ($r == 0 || $t == 0) { + $theta = defined $format ? sprintf($format, $t) : $t; + } + + return "[$r,$theta]" if defined $theta; + + # + # Try to identify pi/n and friends. + # + + $t -= int(CORE::abs($t) / pi2) * pi2; + + if ($format{polar_pretty_print} && $t) { + my ($a, $b); + for $a (2..9) { + $b = $t * $a / pi; + if ($b =~ /^-?\d+$/) { + $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1; + $theta = "${b}pi/$a"; + last; + } + } + } + + if (defined $format) { + $r = sprintf($format, $r); + $theta = sprintf($format, $t) unless defined $theta; + } else { + $theta = $t unless defined $theta; + } + + return "[$r,$theta]"; +} + +sub Inf { + return $Inf; +} + +1; +__END__ + +=pod + +=head1 NAME + +Math::Complex - complex numbers and associated mathematical functions + +=head1 SYNOPSIS + + use Math::Complex; + + $z = Math::Complex->make(5, 6); + $t = 4 - 3*i + $z; + $j = cplxe(1, 2*pi/3); + +=head1 DESCRIPTION + +This package lets you create and manipulate complex numbers. By default, +I limits itself to real numbers, but an extra C statement brings +full complex support, along with a full set of mathematical functions +typically associated with and/or extended to complex numbers. + +If you wonder what complex numbers are, they were invented to be able to solve +the following equation: + + x*x = -1 + +and by definition, the solution is noted I (engineers use I instead since +I usually denotes an intensity, but the name does not matter). The number +I is a pure I number. + +The arithmetics with pure imaginary numbers works just like you would expect +it with real numbers... you just have to remember that + + i*i = -1 + +so you have: + + 5i + 7i = i * (5 + 7) = 12i + 4i - 3i = i * (4 - 3) = i + 4i * 2i = -8 + 6i / 2i = 3 + 1 / i = -i + +Complex numbers are numbers that have both a real part and an imaginary +part, and are usually noted: + + a + bi + +where C is the I part and C is the I part. The +arithmetic with complex numbers is straightforward. You have to +keep track of the real and the imaginary parts, but otherwise the +rules used for real numbers just apply: + + (4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i + (2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i + +A graphical representation of complex numbers is possible in a plane +(also called the I, but it's really a 2D plane). +The number + + z = a + bi + +is the point whose coordinates are (a, b). Actually, it would +be the vector originating from (0, 0) to (a, b). It follows that the addition +of two complex numbers is a vectorial addition. + +Since there is a bijection between a point in the 2D plane and a complex +number (i.e. the mapping is unique and reciprocal), a complex number +can also be uniquely identified with polar coordinates: + + [rho, theta] + +where C is the distance to the origin, and C the angle between +the vector and the I axis. There is a notation for this using the +exponential form, which is: + + rho * exp(i * theta) + +where I is the famous imaginary number introduced above. Conversion +between this form and the cartesian form C is immediate: + + a = rho * cos(theta) + b = rho * sin(theta) + +which is also expressed by this formula: + + z = rho * exp(i * theta) = rho * (cos theta + i * sin theta) + +In other words, it's the projection of the vector onto the I and I +axes. Mathematicians call I the I or I and I +the I of the complex number. The I of C is +marked here as C. + +The polar notation (also known as the trigonometric representation) is +much more handy for performing multiplications and divisions of +complex numbers, whilst the cartesian notation is better suited for +additions and subtractions. Real numbers are on the I axis, and +therefore I or I is zero or I. + +All the common operations that can be performed on a real number have +been defined to work on complex numbers as well, and are merely +I of the operations defined on real numbers. This means +they keep their natural meaning when there is no imaginary part, provided +the number is within their definition set. + +For instance, the C routine which computes the square root of +its argument is only defined for non-negative real numbers and yields a +non-negative real number (it is an application from B to B). +If we allow it to return a complex number, then it can be extended to +negative real numbers to become an application from B to B (the +set of complex numbers): + + sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i + +It can also be extended to be an application from B to B, +whilst its restriction to B behaves as defined above by using +the following definition: + + sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2) + +Indeed, a negative real number can be noted C<[x,pi]> (the modulus +I is always non-negative, so C<[x,pi]> is really C<-x>, a negative +number) and the above definition states that + + sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i + +which is exactly what we had defined for negative real numbers above. +The C returns only one of the solutions: if you want the both, +use the C function. + +All the common mathematical functions defined on real numbers that +are extended to complex numbers share that same property of working +I when the imaginary part is zero (otherwise, it would not +be called an extension, would it?). + +A I operation possible on a complex number that is +the identity for real numbers is called the I, and is noted +with a horizontal bar above the number, or C<~z> here. + + z = a + bi + ~z = a - bi + +Simple... Now look: + + z * ~z = (a + bi) * (a - bi) = a*a + b*b + +We saw that the norm of C was noted C and was defined as the +distance to the origin, also known as: + + rho = abs(z) = sqrt(a*a + b*b) + +so + + z * ~z = abs(z) ** 2 + +If z is a pure real number (i.e. C), then the above yields: + + a * a = abs(a) ** 2 + +which is true (C has the regular meaning for real number, i.e. stands +for the absolute value). This example explains why the norm of C is +noted C: it extends the C function to complex numbers, yet +is the regular C we know when the complex number actually has no +imaginary part... This justifies I our use of the C +notation for the norm. + +=head1 OPERATIONS + +Given the following notations: + + z1 = a + bi = r1 * exp(i * t1) + z2 = c + di = r2 * exp(i * t2) + z = + +the following (overloaded) operations are supported on complex numbers: + + z1 + z2 = (a + c) + i(b + d) + z1 - z2 = (a - c) + i(b - d) + z1 * z2 = (r1 * r2) * exp(i * (t1 + t2)) + z1 / z2 = (r1 / r2) * exp(i * (t1 - t2)) + z1 ** z2 = exp(z2 * log z1) + ~z = a - bi + abs(z) = r1 = sqrt(a*a + b*b) + sqrt(z) = sqrt(r1) * exp(i * t/2) + exp(z) = exp(a) * exp(i * b) + log(z) = log(r1) + i*t + sin(z) = 1/2i (exp(i * z1) - exp(-i * z)) + cos(z) = 1/2 (exp(i * z1) + exp(-i * z)) + atan2(y, x) = atan(y / x) # Minding the right quadrant, note the order. + +The definition used for complex arguments of atan2() is + + -i log((x + iy)/sqrt(x*x+y*y)) + +Note that atan2(0, 0) is not well-defined. + +The following extra operations are supported on both real and complex +numbers: + + Re(z) = a + Im(z) = b + arg(z) = t + abs(z) = r + + cbrt(z) = z ** (1/3) + log10(z) = log(z) / log(10) + logn(z, n) = log(z) / log(n) + + tan(z) = sin(z) / cos(z) + + csc(z) = 1 / sin(z) + sec(z) = 1 / cos(z) + cot(z) = 1 / tan(z) + + asin(z) = -i * log(i*z + sqrt(1-z*z)) + acos(z) = -i * log(z + i*sqrt(1-z*z)) + atan(z) = i/2 * log((i+z) / (i-z)) + + acsc(z) = asin(1 / z) + asec(z) = acos(1 / z) + acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i)) + + sinh(z) = 1/2 (exp(z) - exp(-z)) + cosh(z) = 1/2 (exp(z) + exp(-z)) + tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z)) + + csch(z) = 1 / sinh(z) + sech(z) = 1 / cosh(z) + coth(z) = 1 / tanh(z) + + asinh(z) = log(z + sqrt(z*z+1)) + acosh(z) = log(z + sqrt(z*z-1)) + atanh(z) = 1/2 * log((1+z) / (1-z)) + + acsch(z) = asinh(1 / z) + asech(z) = acosh(1 / z) + acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1)) + +I, I, I, I, I, I, I, I, +I, I, I, have aliases I, I, I, +I, I, I, I, I, I, +I, I, respectively. C, C, C, C, +C, and C can be used also as mutators. The C +returns only one of the solutions: if you want all three, use the +C function. + +The I function is available to compute all the I +roots of some complex, where I is a strictly positive integer. +There are exactly I such roots, returned as a list. Getting the +number mathematicians call C such that: + + 1 + j + j*j = 0; + +is a simple matter of writing: + + $j = (root(1, 3))[1]; + +The Ith root for C is given by: + + (root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n) + +You can return the Ith root directly by C, +indexing starting from I and ending at I. + +The I numeric comparison operator, E=E, is also +defined. In order to ensure its restriction to real numbers is conform +to what you would expect, the comparison is run on the real part of +the complex number first, and imaginary parts are compared only when +the real parts match. + +=head1 CREATION + +To create a complex number, use either: + + $z = Math::Complex->make(3, 4); + $z = cplx(3, 4); + +if you know the cartesian form of the number, or + + $z = 3 + 4*i; + +if you like. To create a number using the polar form, use either: + + $z = Math::Complex->emake(5, pi/3); + $x = cplxe(5, pi/3); + +instead. The first argument is the modulus, the second is the angle +(in radians, the full circle is 2*pi). (Mnemonic: C is used as a +notation for complex numbers in the polar form). + +It is possible to write: + + $x = cplxe(-3, pi/4); + +but that will be silently converted into C<[3,-3pi/4]>, since the +modulus must be non-negative (it represents the distance to the origin +in the complex plane). + +It is also possible to have a complex number as either argument of the +C, C, C, and C: the appropriate component of +the argument will be used. + + $z1 = cplx(-2, 1); + $z2 = cplx($z1, 4); + +The C, C, C, C, and C will also +understand a single (string) argument of the forms + + 2-3i + -3i + [2,3] + [2,-3pi/4] + [2] + +in which case the appropriate cartesian and exponential components +will be parsed from the string and used to create new complex numbers. +The imaginary component and the theta, respectively, will default to zero. + +The C, C, C, C, and C will also +understand the case of no arguments: this means plain zero or (0, 0). + +=head1 DISPLAYING + +When printed, a complex number is usually shown under its cartesian +style I, but there are legitimate cases where the polar style +I<[r,t]> is more appropriate. The process of converting the complex +number into a string that can be displayed is known as I. + +By calling the class method C and +supplying either C<"polar"> or C<"cartesian"> as an argument, you +override the default display style, which is C<"cartesian">. Not +supplying any argument returns the current settings. + +This default can be overridden on a per-number basis by calling the +C method instead. As before, not supplying any argument +returns the current display style for this number. Otherwise whatever you +specify will be the new display style for I particular number. + +For instance: + + use Math::Complex; + + Math::Complex::display_format('polar'); + $j = (root(1, 3))[1]; + print "j = $j\n"; # Prints "j = [1,2pi/3]" + $j->display_format('cartesian'); + print "j = $j\n"; # Prints "j = -0.5+0.866025403784439i" + +The polar style attempts to emphasize arguments like I +(where I is a positive integer and I an integer within [-9, +9]), +this is called I. + +For the reverse of stringifying, see the C and C. + +=head2 CHANGED IN PERL 5.6 + +The C class method and the corresponding +C object method can now be called using +a parameter hash instead of just a one parameter. + +The old display format style, which can have values C<"cartesian"> or +C<"polar">, can be changed using the C<"style"> parameter. + + $j->display_format(style => "polar"); + +The one parameter calling convention also still works. + + $j->display_format("polar"); + +There are two new display parameters. + +The first one is C<"format">, which is a sprintf()-style format string +to be used for both numeric parts of the complex number(s). The is +somewhat system-dependent but most often it corresponds to C<"%.15g">. +You can revert to the default by setting the C to C. + + # the $j from the above example + + $j->display_format('format' => '%.5f'); + print "j = $j\n"; # Prints "j = -0.50000+0.86603i" + $j->display_format('format' => undef); + print "j = $j\n"; # Prints "j = -0.5+0.86603i" + +Notice that this affects also the return values of the +C methods: in list context the whole parameter hash +will be returned, as opposed to only the style parameter value. +This is a potential incompatibility with earlier versions if you +have been calling the C method in list context. + +The second new display parameter is C<"polar_pretty_print">, which can +be set to true or false, the default being true. See the previous +section for what this means. + +=head1 USAGE + +Thanks to overloading, the handling of arithmetics with complex numbers +is simple and almost transparent. + +Here are some examples: + + use Math::Complex; + + $j = cplxe(1, 2*pi/3); # $j ** 3 == 1 + print "j = $j, j**3 = ", $j ** 3, "\n"; + print "1 + j + j**2 = ", 1 + $j + $j**2, "\n"; + + $z = -16 + 0*i; # Force it to be a complex + print "sqrt($z) = ", sqrt($z), "\n"; + + $k = exp(i * 2*pi/3); + print "$j - $k = ", $j - $k, "\n"; + + $z->Re(3); # Re, Im, arg, abs, + $j->arg(2); # (the last two aka rho, theta) + # can be used also as mutators. + +=head1 CONSTANTS + +=head2 PI + +The constant C and some handy multiples of it (pi2, pi4, +and pip2 (pi/2) and pip4 (pi/4)) are also available if separately +exported: + + use Math::Complex ':pi'; + $third_of_circle = pi2 / 3; + +=head2 Inf + +The floating point infinity can be exported as a subroutine Inf(): + + use Math::Complex qw(Inf sinh); + my $AlsoInf = Inf() + 42; + my $AnotherInf = sinh(1e42); + print "$AlsoInf is $AnotherInf\n" if $AlsoInf == $AnotherInf; + +Note that the stringified form of infinity varies between platforms: +it can be for example any of + + inf + infinity + INF + 1.#INF + +or it can be something else. + +Also note that in some platforms trying to use the infinity in +arithmetic operations may result in Perl crashing because using +an infinity causes SIGFPE or its moral equivalent to be sent. +The way to ignore this is + + local $SIG{FPE} = sub { }; + +=head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO + +The division (/) and the following functions + + log ln log10 logn + tan sec csc cot + atan asec acsc acot + tanh sech csch coth + atanh asech acsch acoth + +cannot be computed for all arguments because that would mean dividing +by zero or taking logarithm of zero. These situations cause fatal +runtime errors looking like this + + cot(0): Division by zero. + (Because in the definition of cot(0), the divisor sin(0) is 0) + Died at ... + +or + + atanh(-1): Logarithm of zero. + Died at... + +For the C, C, C, C, C, C, C, +C, C, the argument cannot be C<0> (zero). For the +logarithmic functions and the C, C, the argument cannot +be C<1> (one). For the C, C, the argument cannot be +C<-1> (minus one). For the C, C, the argument cannot be +C (the imaginary unit). For the C, C, the argument +cannot be C<-i> (the negative imaginary unit). For the C, +C, C, the argument cannot be I, where I +is any integer. atan2(0, 0) is undefined, and if the complex arguments +are used for atan2(), a division by zero will happen if z1**2+z2**2 == 0. + +Note that because we are operating on approximations of real numbers, +these errors can happen when merely `too close' to the singularities +listed above. + +=head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS + +The C and C accept both real and complex arguments. +When they cannot recognize the arguments they will die with error +messages like the following + + Math::Complex::make: Cannot take real part of ... + Math::Complex::make: Cannot take real part of ... + Math::Complex::emake: Cannot take rho of ... + Math::Complex::emake: Cannot take theta of ... + +=head1 BUGS + +Saying C exports many mathematical routines in the +caller environment and even overrides some (C, C, C). +This is construed as a feature by the Authors, actually... ;-) + +All routines expect to be given real or complex numbers. Don't attempt to +use BigFloat, since Perl has currently no rule to disambiguate a '+' +operation (for instance) between two overloaded entities. + +In Cray UNICOS there is some strange numerical instability that results +in root(), cos(), sin(), cosh(), sinh(), losing accuracy fast. Beware. +The bug may be in UNICOS math libs, in UNICOS C compiler, in Math::Complex. +Whatever it is, it does not manifest itself anywhere else where Perl runs. + +=head1 SEE ALSO + +L + +=head1 AUTHORS + +Daniel S. Lewart >, +Jarkko Hietaniemi >, +Raphael Manfredi >, +Zefram + +=head1 LICENSE + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + +1; + +# eof Index: gnu/usr.bin/perl/dist/Math-Complex/lib/Math/Trig.pm =================================================================== RCS file: gnu/usr.bin/perl/dist/Math-Complex/lib/Math/Trig.pm diff -N gnu/usr.bin/perl/dist/Math-Complex/lib/Math/Trig.pm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Math-Complex/lib/Math/Trig.pm 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,773 @@ +# +# Trigonometric functions, mostly inherited from Math::Complex. +# -- Jarkko Hietaniemi, since April 1997 +# -- Raphael Manfredi, September 1996 (indirectly: because of Math::Complex) +# + +package Math::Trig; + +{ use 5.006; } +use strict; + +use Math::Complex 1.59; +use Math::Complex qw(:trig :pi); +require Exporter; + +our @ISA = qw(Exporter); + +our $VERSION = 1.62; + +my @angcnv = qw(rad2deg rad2grad + deg2rad deg2grad + grad2rad grad2deg); + +my @areal = qw(asin_real acos_real); + +our @EXPORT = (@{$Math::Complex::EXPORT_TAGS{'trig'}}, + @angcnv, @areal); + +my @rdlcnv = qw(cartesian_to_cylindrical + cartesian_to_spherical + cylindrical_to_cartesian + cylindrical_to_spherical + spherical_to_cartesian + spherical_to_cylindrical); + +my @greatcircle = qw( + great_circle_distance + great_circle_direction + great_circle_bearing + great_circle_waypoint + great_circle_midpoint + great_circle_destination + ); + +my @pi = qw(pi pi2 pi4 pip2 pip4); + +our @EXPORT_OK = (@rdlcnv, @greatcircle, @pi, 'Inf'); + +# See e.g. the following pages: +# https://www.movable-type.co.uk/scripts/latlong.html +# https://edwilliams.org/avform.htm +# https://en.wikipedia.org/wiki/Great-circle_distance + +our %EXPORT_TAGS = ('radial' => [ @rdlcnv ], + 'great_circle' => [ @greatcircle ], + 'pi' => [ @pi ]); + +sub _DR () { pi2/360 } +sub _RD () { 360/pi2 } +sub _DG () { 400/360 } +sub _GD () { 360/400 } +sub _RG () { 400/pi2 } +sub _GR () { pi2/400 } + +# +# Truncating remainder. +# + +sub _remt ($$) { + # Oh yes, POSIX::fmod() would be faster. Possibly. If it is available. + $_[0] - $_[1] * int($_[0] / $_[1]); +} + +# +# Angle conversions. +# + +sub rad2rad($) { _remt($_[0], pi2) } + +sub deg2deg($) { _remt($_[0], 360) } + +sub grad2grad($) { _remt($_[0], 400) } + +sub rad2deg ($;$) { my $d = _RD * $_[0]; $_[1] ? $d : deg2deg($d) } + +sub deg2rad ($;$) { my $d = _DR * $_[0]; $_[1] ? $d : rad2rad($d) } + +sub grad2deg ($;$) { my $d = _GD * $_[0]; $_[1] ? $d : deg2deg($d) } + +sub deg2grad ($;$) { my $d = _DG * $_[0]; $_[1] ? $d : grad2grad($d) } + +sub rad2grad ($;$) { my $d = _RG * $_[0]; $_[1] ? $d : grad2grad($d) } + +sub grad2rad ($;$) { my $d = _GR * $_[0]; $_[1] ? $d : rad2rad($d) } + +# +# acos and asin functions which always return a real number +# + +sub acos_real { + return 0 if $_[0] >= 1; + return pi if $_[0] <= -1; + return acos($_[0]); +} + +sub asin_real { + return &pip2 if $_[0] >= 1; + return -&pip2 if $_[0] <= -1; + return asin($_[0]); +} + +sub cartesian_to_spherical { + my ( $x, $y, $z ) = @_; + + my $rho = sqrt( $x * $x + $y * $y + $z * $z ); + + return ( $rho, + atan2( $y, $x ), + $rho ? acos_real( $z / $rho ) : 0 ); +} + +sub spherical_to_cartesian { + my ( $rho, $theta, $phi ) = @_; + + return ( $rho * cos( $theta ) * sin( $phi ), + $rho * sin( $theta ) * sin( $phi ), + $rho * cos( $phi ) ); +} + +sub spherical_to_cylindrical { + my ( $x, $y, $z ) = spherical_to_cartesian( @_ ); + + return ( sqrt( $x * $x + $y * $y ), $_[1], $z ); +} + +sub cartesian_to_cylindrical { + my ( $x, $y, $z ) = @_; + + return ( sqrt( $x * $x + $y * $y ), atan2( $y, $x ), $z ); +} + +sub cylindrical_to_cartesian { + my ( $rho, $theta, $z ) = @_; + + return ( $rho * cos( $theta ), $rho * sin( $theta ), $z ); +} + +sub cylindrical_to_spherical { + return ( cartesian_to_spherical( cylindrical_to_cartesian( @_ ) ) ); +} + +sub great_circle_distance { + my ( $theta0, $phi0, $theta1, $phi1, $rho ) = @_; + + $rho = 1 unless defined $rho; # Default to the unit sphere. + + my $dphi = $phi1 - $phi0; + my $dtheta = $theta1 - $theta0; + + # A formula that is accurate for all distances is the following special + # case of the Vincenty formula for an ellipsoid with equal major and minor + # axes. See + # https://en.wikipedia.org/wiki/Great-circle_distance#Computational_formulas + + my $c1 = sin($phi1) * sin($dtheta); + my $c2 = sin($phi1) * cos($dtheta); + my $c3 = sin($phi0) * cos($phi1) - cos($phi0) * $c2; + my $c4 = cos($phi0) * cos($phi1) + sin($phi0) * $c2; + return $rho * atan2(sqrt($c1 * $c1 + $c3 * $c3), $c4); +} + +sub great_circle_direction { + my ( $theta0, $phi0, $theta1, $phi1 ) = @_; + + my $lat0 = pip2 - $phi0; + my $lat1 = pip2 - $phi1; + + return rad2rad(pi2 - + atan2(sin($theta0-$theta1) * cos($lat1), + cos($lat0) * sin($lat1) - + sin($lat0) * cos($lat1) * cos($theta0-$theta1))); +} + +*great_circle_bearing = \&great_circle_direction; + +sub great_circle_waypoint { + my ( $theta0, $phi0, $theta1, $phi1, $point ) = @_; + + $point = 0.5 unless defined $point; + + my $d = great_circle_distance( $theta0, $phi0, $theta1, $phi1 ); + + return undef if $d == pi; + + my $sd = sin($d); + + return ($theta0, $phi0) if $sd == 0; + + my $A = sin((1 - $point) * $d) / $sd; + my $B = sin( $point * $d) / $sd; + + my $lat0 = pip2 - $phi0; + my $lat1 = pip2 - $phi1; + + my $x = $A * cos($lat0) * cos($theta0) + $B * cos($lat1) * cos($theta1); + my $y = $A * cos($lat0) * sin($theta0) + $B * cos($lat1) * sin($theta1); + my $z = $A * sin($lat0) + $B * sin($lat1); + + my $theta = atan2($y, $x); + my $phi = acos_real($z); + + return ($theta, $phi); +} + +sub great_circle_midpoint { + great_circle_waypoint(@_[0..3], 0.5); +} + +sub great_circle_destination { + my ( $theta0, $phi0, $dir0, $dst ) = @_; + + my $lat0 = pip2 - $phi0; + + my $phi1 = asin_real(sin($lat0)*cos($dst) + + cos($lat0)*sin($dst)*cos($dir0)); + + my $theta1 = $theta0 + atan2(sin($dir0)*sin($dst)*cos($lat0), + cos($dst)-sin($lat0)*sin($phi1)); + + my $dir1 = great_circle_bearing($theta1, $phi1, $theta0, $phi0) + pi; + + $dir1 -= pi2 if $dir1 > pi2; + + return ($theta1, $phi1, $dir1); +} + +1; + +__END__ +=pod + +=head1 NAME + +Math::Trig - trigonometric functions + +=head1 SYNOPSIS + + use Math::Trig; + + $x = tan(0.9); + $y = acos(3.7); + $z = asin(2.4); + + $halfpi = pi/2; + + $rad = deg2rad(120); + + # Import constants pi2, pi4, pip2, pip4 (2*pi, 4*pi, pi/2, pi/4). + use Math::Trig ':pi'; + + # Import the conversions between cartesian/spherical/cylindrical. + use Math::Trig ':radial'; + + # Import the great circle formulas. + use Math::Trig ':great_circle'; + +=head1 DESCRIPTION + +C defines many trigonometric functions not defined by the +core Perl which defines only the C and C. The constant +B is also defined as are a few convenience functions for angle +conversions, and I for spherical movement. + +=head1 TRIGONOMETRIC FUNCTIONS + +The tangent + +=over 4 + +=item B + +=back + +The cofunctions of the sine, cosine, and tangent (cosec/csc and cotan/cot +are aliases) + +B, B, B, B, B, B + +The arcus (also known as the inverse) functions of the sine, cosine, +and tangent + +B, B, B + +The principal value of the arc tangent of y/x + +B(y, x) + +The arcus cofunctions of the sine, cosine, and tangent (acosec/acsc +and acotan/acot are aliases). Note that atan2(0, 0) is not well-defined. + +B, B, B, B, B + +The hyperbolic sine, cosine, and tangent + +B, B, B + +The cofunctions of the hyperbolic sine, cosine, and tangent (cosech/csch +and cotanh/coth are aliases) + +B, B, B, B, B + +The area (also known as the inverse) functions of the hyperbolic +sine, cosine, and tangent + +B, B, B + +The area cofunctions of the hyperbolic sine, cosine, and tangent +(acsch/acosech and acoth/acotanh are aliases) + +B, B, B, B, B + +The trigonometric constant B and some of handy multiples +of it are also defined. + +B + +=head2 ERRORS DUE TO DIVISION BY ZERO + +The following functions + + acoth + acsc + acsch + asec + asech + atanh + cot + coth + csc + csch + sec + sech + tan + tanh + +cannot be computed for all arguments because that would mean dividing +by zero or taking logarithm of zero. These situations cause fatal +runtime errors looking like this + + cot(0): Division by zero. + (Because in the definition of cot(0), the divisor sin(0) is 0) + Died at ... + +or + + atanh(-1): Logarithm of zero. + Died at... + +For the C, C, C, C, C, C, C, +C, C, the argument cannot be C<0> (zero). For the +C, C, the argument cannot be C<1> (one). For the +C, C, the argument cannot be C<-1> (minus one). For the +C, C, C, C, the argument cannot be I, where I is any integer. + +Note that atan2(0, 0) is not well-defined. + +=head2 SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS + +Please note that some of the trigonometric functions can break out +from the B into the B. For example +C has no definition for plain real numbers but it has +definition for complex numbers. + +In Perl terms this means that supplying the usual Perl numbers (also +known as scalars, please see L) as input for the +trigonometric functions might produce as output results that no more +are simple real numbers: instead they are complex numbers. + +The C handles this by using the C package +which knows how to handle complex numbers, please see L +for more information. In practice you need not to worry about getting +complex numbers as results because the C takes care of +details like for example how to display complex numbers. For example: + + print asin(2), "\n"; + +should produce something like this (take or leave few last decimals): + + 1.5707963267949-1.31695789692482i + +That is, a complex number with the real part of approximately C<1.571> +and the imaginary part of approximately C<-1.317>. + +=head1 PLANE ANGLE CONVERSIONS + +(Plane, 2-dimensional) angles may be converted with the following functions. + +=over + +=item deg2rad + + $radians = deg2rad($degrees); + +=item grad2rad + + $radians = grad2rad($gradians); + +=item rad2deg + + $degrees = rad2deg($radians); + +=item grad2deg + + $degrees = grad2deg($gradians); + +=item deg2grad + + $gradians = deg2grad($degrees); + +=item rad2grad + + $gradians = rad2grad($radians); + +=back + +The full circle is 2 I radians or I<360> degrees or I<400> gradians. +The result is by default wrapped to be inside the [0, {2pi,360,400}] circle. +If you don't want this, supply a true second argument: + + $zillions_of_radians = deg2rad($zillions_of_degrees, 1); + $negative_degrees = rad2deg($negative_radians, 1); + +You can also do the wrapping explicitly by rad2rad(), deg2deg(), and +grad2grad(). + +=over 4 + +=item rad2rad + + $radians_wrapped_by_2pi = rad2rad($radians); + +=item deg2deg + + $degrees_wrapped_by_360 = deg2deg($degrees); + +=item grad2grad + + $gradians_wrapped_by_400 = grad2grad($gradians); + +=back + +=head1 RADIAL COORDINATE CONVERSIONS + +B are the B and the B +systems, explained shortly in more detail. + +You can import radial coordinate conversion functions by using the +C<:radial> tag: + + use Math::Trig ':radial'; + + ($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z); + ($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z); + ($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z); + ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z); + ($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi); + ($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi); + +B. + +=head2 COORDINATE SYSTEMS + +B coordinates are the usual rectangular I<(x, y, z)>-coordinates. + +Spherical coordinates, I<(rho, theta, phi)>, are three-dimensional +coordinates which define a point in three-dimensional space. They are +based on a sphere surface. The radius of the sphere is B, also +known as the I coordinate. The angle in the I-plane +(around the I-axis) is B, also known as the I +coordinate. The angle from the I-axis is B, also known as the +I coordinate. The North Pole is therefore I, and +the Gulf of Guinea (think of the missing big chunk of Africa) I. In geographical terms I is latitude (northward +positive, southward negative) and I is longitude (eastward +positive, westward negative). + +B: some texts define I and I the other way round, +some texts define the I to start from the horizontal plane, some +texts use I in place of I. + +Cylindrical coordinates, I<(rho, theta, z)>, are three-dimensional +coordinates which define a point in three-dimensional space. They are +based on a cylinder surface. The radius of the cylinder is B, +also known as the I coordinate. The angle in the I-plane +(around the I-axis) is B, also known as the I +coordinate. The third coordinate is the I, pointing up from the +B-plane. + +=head2 3-D ANGLE CONVERSIONS + +Conversions to and from spherical and cylindrical coordinates are +available. Please notice that the conversions are not necessarily +reversible because of the equalities like I angles being equal to +I<-pi> angles. + +=over 4 + +=item cartesian_to_cylindrical + + ($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z); + +=item cartesian_to_spherical + + ($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z); + +=item cylindrical_to_cartesian + + ($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z); + +=item cylindrical_to_spherical + + ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z); + +Notice that when C<$z> is not 0 C<$rho_s> is not equal to C<$rho_c>. + +=item spherical_to_cartesian + + ($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi); + +=item spherical_to_cylindrical + + ($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi); + +Notice that when C<$z> is not 0 C<$rho_c> is not equal to C<$rho_s>. + +=back + +=head1 GREAT CIRCLE DISTANCES AND DIRECTIONS + +A great circle is section of a circle that contains the circle +diameter: the shortest distance between two (non-antipodal) points on +the spherical surface goes along the great circle connecting those two +points. + +=head2 great_circle_distance + +Returns the great circle distance between two points on a sphere. + + $distance = great_circle_distance($theta0, $phi0, $theta1, $phi1, [, $rho]); + +Where ($theta0, $phi0) and ($theta1, $phi1) are the spherical coordinates of +the two points, respectively. The distance is in C<$rho> units. The C<$rho> +is optional. It defaults to 1 (the unit sphere). + +If you are using geographic coordinates, latitude and longitude, you need to +adjust for the fact that latitude is zero at the equator increasing towards +the north and decreasing towards the south. Assuming ($lat0, $lon0) and +($lat1, $lon1) are the geographic coordinates in radians of the two points, +the distance can be computed with + + $distance = great_circle_distance($lon0, pi/2 - $lat0, + $lon1, pi/2 - $lat1, $rho); + +=head2 great_circle_direction + +The direction you must follow the great circle (also known as I) +can be computed by the great_circle_direction() function: + + use Math::Trig 'great_circle_direction'; + + $direction = great_circle_direction($theta0, $phi0, $theta1, $phi1); + +=head2 great_circle_bearing + +Alias 'great_circle_bearing' for 'great_circle_direction' is also available. + + use Math::Trig 'great_circle_bearing'; + + $direction = great_circle_bearing($theta0, $phi0, $theta1, $phi1); + +The result of great_circle_direction is in radians, zero indicating +straight north, pi or -pi straight south, pi/2 straight west, and +-pi/2 straight east. + +=head2 great_circle_destination + +You can inversely compute the destination if you know the +starting point, direction, and distance: + + use Math::Trig 'great_circle_destination'; + + # $diro is the original direction, + # for example from great_circle_bearing(). + # $distance is the angular distance in radians, + # for example from great_circle_distance(). + # $thetad and $phid are the destination coordinates, + # $dird is the final direction at the destination. + + ($thetad, $phid, $dird) = + great_circle_destination($theta, $phi, $diro, $distance); + +or the midpoint if you know the end points: + +=head2 great_circle_midpoint + + use Math::Trig 'great_circle_midpoint'; + + ($thetam, $phim) = + great_circle_midpoint($theta0, $phi0, $theta1, $phi1); + +The great_circle_midpoint() is just a special case of + +=head2 great_circle_waypoint + + use Math::Trig 'great_circle_waypoint'; + + ($thetai, $phii) = + great_circle_waypoint($theta0, $phi0, $theta1, $phi1, $way); + +Where $way indicates the position of the waypoint along the great +circle arc through the starting point ($theta0, $phi0) and the end +point ($theta1, $phi1) relative to the distance from the starting +point to the end point. So $way = 0 gives the starting point, $way = 1 +gives the end point, $way < 0 gives a point "behind" the starting +point, and $way > 1 gives a point beyond the end point. $way defaults +to 0.5 if not given. + +Note that antipodal points (where their distance is I radians) do +not have unique waypoints between them, and therefore C is +returned in such cases. If the points are the same, so the distance +between them is zero, all waypoints are identical to the starting/end +point. + +The thetas, phis, direction, and distance in the above are all in +radians. + +You can import all the great circle formulas by + + use Math::Trig ':great_circle'; + +Notice that the resulting directions might be somewhat surprising if +you are looking at a flat worldmap: in such map projections the great +circles quite often do not look like the shortest routes -- but for +example the shortest possible routes from Europe or North America to +Asia do often cross the polar regions. (The common Mercator projection +does B show great circles as straight lines: straight lines in the +Mercator projection are lines of constant bearing.) + +=head1 EXAMPLES + +To calculate the distance between London (51.3N 0.5W) and Tokyo +(35.7N 139.8E) in kilometers: + + use Math::Trig qw(great_circle_distance deg2rad); + + # Notice the 90 - latitude: phi zero is at the North Pole. + sub NESW { deg2rad($_[0]), deg2rad(90 - $_[1]) } + my @L = NESW( -0.5, 51.3); + my @T = NESW(139.8, 35.7); + my $km = great_circle_distance(@L, @T, 6378); # About 9600 km. + +The direction you would have to go from London to Tokyo (in radians, +straight north being zero, straight east being pi/2). + + use Math::Trig qw(great_circle_direction); + + my $rad = great_circle_direction(@L, @T); # About 0.547 or 0.174 pi. + +The midpoint between London and Tokyo being + + use Math::Trig qw(great_circle_midpoint rad2deg); + + my @M = great_circle_midpoint(@L, @T); + sub SWNE { rad2deg( $_[0] ), 90 - rad2deg( $_[1] ) } + my @lonlat = SWNE(@M); + +or about 69 N 89 E, on the Putorana Plateau of Siberia. + +B: you B get from A to B like this: + + Dist = great_circle_distance(A, B) + Dir = great_circle_direction(A, B) + C = great_circle_destination(A, Dist, Dir) + +and expect C to be B, because the bearing constantly changes when +going from A to B (except in some special case like the meridians or +the circles of latitudes) and in great_circle_destination() one gives +a B bearing to follow. + +=head2 CAVEAT FOR GREAT CIRCLE FORMULAS + +The answers may be off by few percentages because of the irregular +(slightly aspherical) form of the Earth. The errors are at worst +about 0.55%, but generally below 0.3%. + +=head2 Real-valued asin and acos + +For small inputs asin() and acos() may return complex numbers even +when real numbers would be enough and correct, this happens because of +floating-point inaccuracies. You can see these inaccuracies for +example by trying theses: + + print cos(1e-6)**2+sin(1e-6)**2 - 1,"\n"; + printf "%.20f", cos(1e-6)**2+sin(1e-6)**2,"\n"; + +which will print something like this + + -1.11022302462516e-16 + 0.99999999999999988898 + +even though the expected results are of course exactly zero and one. +The formulas used to compute asin() and acos() are quite sensitive to +this, and therefore they might accidentally slip into the complex +plane even when they should not. To counter this there are two +interfaces that are guaranteed to return a real-valued output. + +=over 4 + +=item asin_real + + use Math::Trig qw(asin_real); + + $real_angle = asin_real($input_sin); + +Return a real-valued arcus sine if the input is between [-1, 1], +B the endpoints. For inputs greater than one, pi/2 +is returned. For inputs less than minus one, -pi/2 is returned. + +=item acos_real + + use Math::Trig qw(acos_real); + + $real_angle = acos_real($input_cos); + +Return a real-valued arcus cosine if the input is between [-1, 1], +B the endpoints. For inputs greater than one, zero +is returned. For inputs less than minus one, pi is returned. + +=back + +=head1 BUGS + +Saying C exports many mathematical routines in the +caller environment and even overrides some (C, C). This is +construed as a feature by the Authors, actually... ;-) + +The code is not optimized for speed, especially because we use +C and thus go quite near complex numbers while doing +the computations even when the arguments are not. This, however, +cannot be completely avoided if we want things like C to give +an answer instead of giving a fatal runtime error. + +Do not attempt navigation using these formulas. + +=head1 SEE ALSO + +L + +=head1 AUTHORS + +Jarkko Hietaniemi >, +Raphael Manfredi >, +Zefram + +=head1 LICENSE + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + +# eof Index: gnu/usr.bin/perl/dist/Math-Complex/t/Complex.t =================================================================== RCS file: gnu/usr.bin/perl/dist/Math-Complex/t/Complex.t diff -N gnu/usr.bin/perl/dist/Math-Complex/t/Complex.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Math-Complex/t/Complex.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,1160 @@ +#!./perl + +# +# Regression tests for the Math::Complex pacakge +# -- Raphael Manfredi since Sep 1996 +# -- Jarkko Hietaniemi since Mar 1997 +# -- Daniel S. Lewart since Sep 1997 + +use strict; +use warnings; + +use Math::Complex 1.54; + +# they are used later in the test and not exported by Math::Complex +*_stringify_cartesian = \&Math::Complex::_stringify_cartesian; +*_stringify_polar = \&Math::Complex::_stringify_polar; + +our $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/); +our $has_inf = !$vax_float; + +my ($args, $op, $target, $test, $test_set, $try, $val, $zvalue, @set, @val); +my ($bad, $z); + +$test = 0; +$| = 1; +my @script = ( + 'my ($res, $s0,$s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$z0,$z1,$z2);' . + "\n\n" +); +my $eps = 1e-13; + +if ($^O eq 'unicos') { # For some reason root() produces very inaccurate + $eps = 1e-10; # results in Cray UNICOS, and occasionally also +} # cos(), sin(), cosh(), sinh(). The division + # of doubles is the current suspect. + +$test++; +push @script, "{ my \$t=$test; ".q{ + my $a = Math::Complex->new(1); + my $b = $a; + $a += 2; + print "not " unless "$a" eq "3" && "$b" eq "1"; + print "ok $t\n"; +}."}"; + +while () { + s/^\s+//; + next if $_ eq '' || /^\#/; + chomp; + $test_set = 0; # Assume not a test over a set of values + if (/^&(.+)/) { + $op = $1; + next; + } + elsif (/^\{(.+)\}/) { + set($1, \@set, \@val); + next; + } + elsif (s/^\|//) { + $test_set = 1; # Requests we loop over the set... + } + my @args = split(/:/); + if ($test_set == 1) { + my $i; + for ($i = 0; $i < @set; $i++) { + # complex number + $target = $set[$i]; + # textual value as found in set definition + $zvalue = $val[$i]; + test($zvalue, $target, @args); + } + } else { + test($op, undef, @args); + } +} + +# + +sub test_mutators { + my $op; + + $test++; +push(@script, <<'EOT'); +{ + my $z = cplx( 1, 1); + $z->Re(2); + $z->Im(3); + print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n"; + print 'not ' unless Re($z) == 2 and Im($z) == 3; +EOT + push(@script, qq(print "ok $test\\n"}\n)); + + $test++; +push(@script, <<'EOT'); +{ + my $z = cplx( 1, 1); + $z->abs(3 * sqrt(2)); + print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n"; + print 'not ' unless (abs($z) - 3 * sqrt(2)) < $eps and + (arg($z) - pi / 4 ) < $eps and + (Re($z) - 3 ) < $eps and + (Im($z) - 3 ) < $eps; +EOT + push(@script, qq(print "ok $test\\n"}\n)); + + $test++; +push(@script, <<'EOT'); +{ + my $z = cplx( 1, 1); + $z->arg(-3 / 4 * pi); + print "# $test Re(z) = ",$z->Re(), " Im(z) = ", $z->Im(), " z = $z\n"; + print 'not ' unless (arg($z) + 3 / 4 * pi) < $eps and + (abs($z) - sqrt(2) ) < $eps and + (Re($z) + 1 ) < $eps and + (Im($z) + 1 ) < $eps; +EOT + push(@script, qq(print "ok $test\\n"}\n)); +} + +test_mutators(); + +my $constants = ' +my $i = cplx(0, 1); +my $pi = cplx(pi, 0); +my $pii = cplx(0, pi); +my $pip2 = cplx(pi/2, 0); +my $pip4 = cplx(pi/4, 0); +my $zero = cplx(0, 0); +'; + +if ($has_inf) { + $constants .= <<'EOF'; +my $inf = 9**9**9; +EOF +} + +push(@script, $constants); + + +# test the divbyzeros + +sub test_dbz { + for my $op (@_) { + $test++; + push(@script, <display_format eq 'cartesian'; + print "ok $test\n"; +EOS + + push @script, <display_format('polar'); +EOS + + $test++; + push @script, <display_format eq 'polar'; + print "ok $test\n"; +EOS + + $test++; + push @script, <display_format; +EOS + + $test++; + push @script, <display_format('style' => 'cartesian', 'format' => '%.5f'); +EOS + + $test++; + push @script, <display_format; +EOS + + $test++; + push @script, <display_format('format' => undef); +EOS + + $test++; + push @script, <display_format('style' => 'polar', 'polar_pretty_print' => 0); +EOS + + $test++; + push @script, <display_format('style' => 'polar', 'format' => "%.4g"); +EOS + + $test++; + push @script, <display_format('style' => 'cartesian', 'format' => '(%.5g)'); +EOS + + $test++; + push @script, <display_format eq 'cartesian'; + print "ok $test\n"; +EOS +} + +test_display_format(); + +sub test_remake { + $test++; + push @script, <make(2,3); + print "ok $test\n"; +EOS + + $test++; + push @script, <make('3i'); + print "not " unless \$z == cplx(0,3); + print "ok $test\n"; +EOS + + $test++; + push @script, <emake('[2,3]'); + print "not " unless \$z == cplxe(2,3); + print "ok $test\n"; +EOS + + $test++; + push @script, <make('(2,3)'); + print "not " unless \$z == cplx(2,3); + print "ok $test\n"; +EOS + + $test++; + push @script, <emake('[2,3pi/8]'); + print "not " unless \$z == cplxe(2,3*\$pi/8); + print "ok $test\n"; +EOS + + $test++; + push @script, <emake('[2]'); + print "not " unless \$z == cplxe(2); + print "ok $test\n"; +EOS +} + +sub test_no_args { + push @script, <<'EOS'; +{ + print "# cplx, cplxe, make, emake without arguments\n"; +EOS + + $test++; + push @script, <Re() == 0) ? "ok $test\n" : "not ok $test\n"); +EOS + + $test++; + push @script, <Im() == 0) ? "ok $test\n" : "not ok $test\n"); +EOS + + $test++; + push @script, <rho() == 0) ? "ok $test\n" : "not ok $test\n"); +EOS + + $test++; + push @script, <theta() == 0) ? "ok $test\n" : "not ok $test\n"); +EOS + + $test++; + push @script, <make(); + print ((\$z2->Re() == 0) ? "ok $test\n" : "not ok $test\n"); +EOS + + $test++; + push @script, <Im() == 0) ? "ok $test\n" : "not ok $test\n"); +EOS + + $test++; + push @script, <emake(); + print ((\$z3->rho() == 0) ? "ok $test\n" : "not ok $test\n"); +EOS + + $test++; + push @script, <theta() == 0) ? "ok $test\n" : "not ok $test\n"); +} +EOS +} + +sub test_atan2 { + push @script, <<'EOS'; +print "# atan2() with some real arguments\n"; +EOS + my @real = (-1, 0, 1); + for my $x (@real) { + for my $y (@real) { + next if $x == 0 && $y == 0; + $test++; + push @script, < 2 and $baop) { # binary assignment ops + $test++; + # check the op= works + push @script, <_cartesian} : (\$z0, 0)); + + my (\$z1r, \$z1i) = ref \$z1 ? \@{\$z1->_cartesian} : (\$z1, 0); + + my \$zb = cplx(\$z1r, \$z1i); + + \$za $op= \$zb; + my (\$zbr, \$zbi) = \@{\$zb->_cartesian}; + + check($test, '\$z0 $op= \$z1', \$za, \$z$#args, $args); +EOB + $test++; + # check that the rhs has not changed + push @script, qq(print "not " unless (\$zbr == \$z1r and \$zbi == \$z1i);); + push @script, qq(print "ok $test\\n";\n); + push @script, "}\n"; + } + } +} + +sub set { + my ($set, $setref, $valref) = @_; + @{$setref} = (); + @{$valref} = (); + my @set = split(/;\s*/, $set); + my @res; + my $i; + for ($i = 0; $i < @set; $i++) { + push(@{$valref}, $set[$i]); + my $val = value($set[$i]); + push @script, "\$s$i = $val;\n"; + push @{$setref}, "\$s$i"; + } +} + +sub value { + local ($_) = @_; + if (/^\s*\((.*),(.*)\)/) { + return "cplx($1,$2)"; + } + elsif (/^\s*([\-\+]?(?:\d+(\.\d+)?|\.\d+)(?:[e[\-\+]\d+])?)/) { + return "cplx($1,0)"; + } + elsif (/^\s*\[(.*),(.*)\]/) { + return "cplxe($1,$2)"; + } + elsif (/^\s*'(.*)'/) { + my $ex = $1; + $ex =~ s/\bz\b/$target/g; + $ex =~ s/\br\b/abs($target)/g; + $ex =~ s/\bt\b/arg($target)/g; + $ex =~ s/\ba\b/Re($target)/g; + $ex =~ s/\bb\b/Im($target)/g; + return $ex; + } + elsif (/^\s*"(.*)"/) { + return "\"$1\""; + } + return $_; +} + +sub check { + my ($test, $try, $got, $expected, @z) = @_; + + print "# @_\n"; + + if ("$got" eq "$expected" + || + ($expected =~ /^-?\d/ && $got == $expected) + || + (abs(Math::Complex->make($got) - Math::Complex->make($expected)) < $eps) + || + (abs($got - $expected) < $eps) + ) { + print "ok $test\n"; + } else { + print "not ok $test\n"; + my $args = (@z == 1) ? "z = $z[0]" : "z0 = $z[0], z1 = $z[1]"; + print "# '$try' expected: '$expected' got: '$got' for $args\n"; + } +} + +sub addsq { + my ($z1, $z2) = @_; + return ($z1 + i*$z2) * ($z1 - i*$z2); +} + +sub subsq { + my ($z1, $z2) = @_; + return ($z1 + $z2) * ($z1 - $z2); +} + +__END__ +&+;= +(3,4):(3,4):(6,8) +(-3,4):(3,-4):(0,0) +(3,4):-3:(0,4) +1:(4,2):(5,2) +[2,0]:[2,pi]:(0,0) + +&++ +(2,1):(3,1) + +&-;= +(2,3):(-2,-3) +[2,pi/2]:[2,-(pi)/2] +2:[2,0]:(0,0) +[3,0]:2:(1,0) +3:(4,5):(-1,-5) +(4,5):3:(1,5) +(2,1):(3,5):(-1,-4) + +&-- +(1,2):(0,2) +[2,pi]:[3,pi] + +&*;= +(0,1):(0,1):(-1,0) +(4,5):(1,0):(4,5) +[2,2*pi/3]:(1,0):[2,2*pi/3] +2:(0,1):(0,2) +(0,1):3:(0,3) +(0,1):(4,1):(-1,4) +(2,1):(4,-1):(9,2) + +&/;= +(3,4):(3,4):(1,0) +(4,-5):1:(4,-5) +1:(0,1):(0,-1) +(0,6):(0,2):(3,0) +(9,2):(4,-1):(2,1) +[4,pi]:[2,pi/2]:[2,pi/2] +[2,pi/2]:[4,pi]:[0.5,-(pi)/2] + +&**;= +(2,0):(3,0):(8,0) +(3,0):(2,0):(9,0) +(2,3):(4,0):(-119,-120) +(0,0):(1,0):(0,0) +(0,0):(2,3):(0,0) +(1,0):(0,0):(1,0) +(1,0):(1,0):(1,0) +(1,0):(2,3):(1,0) +(2,3):(0,0):(1,0) +(2,3):(1,0):(2,3) +(0,0):(0,0):(1,0) + +&Re +(3,4):3 +(-3,4):-3 +[1,pi/2]:0 + +&Im +(3,4):4 +(3,-4):-4 +[1,pi/2]:1 + +&abs +(3,4):5 +(-3,4):5 + +&arg +[2,0]:0 +[-2,0]:pi + +&~ +(4,5):(4,-5) +(-3,4):(-3,-4) +[2,pi/2]:[2,-(pi)/2] + +&< +(3,4):(1,2):0 +(3,4):(3,2):0 +(3,4):(3,8):1 +(4,4):(5,129):1 + +&== +(3,4):(4,5):0 +(3,4):(3,5):0 +(3,4):(2,4):0 +(3,4):(3,4):1 + +&sqrt +-9:(0,3) +(-100,0):(0,10) +(16,-30):(5,-3) + +&_stringify_cartesian +(-100,0):"-100" +(0,1):"i" +(4,-3):"4-3i" +(4,0):"4" +(-4,0):"-4" +(-2,4):"-2+4i" +(-2,-1):"-2-i" + +&_stringify_polar +[-1, 0]:"[1,pi]" +[1, pi/3]:"[1,pi/3]" +[6, -2*pi/3]:"[6,-2pi/3]" +[0.5, -9*pi/11]:"[0.5,-9pi/11]" +[1, 0.5]:"[1, 0.5]" + +{ (4,3); [3,2]; (-3,4); (0,2); [2,1] } + +|'z + ~z':'2*Re(z)' +|'z - ~z':'2*i*Im(z)' +|'z * ~z':'abs(z) * abs(z)' + +{ (0.5, 0); (-0.5, 0); (2,3); [3,2]; (-3,2); (0,2); 3; 1.2; (-3, 0); (-2, -1); [2,1] } + +|'(root(z, 4))[1] ** 4':'z' +|'(root(z, 5))[3] ** 5':'z' +|'(root(z, 8))[7] ** 8':'z' +|'(root(z, 8, 0)) ** 8':'z' +|'(root(z, 8, 7)) ** 8':'z' +|'abs(z)':'r' +|'acot(z)':'acotan(z)' +|'acsc(z)':'acosec(z)' +|'acsc(z)':'asin(1 / z)' +|'asec(z)':'acos(1 / z)' +|'cbrt(z)':'cbrt(r) * exp(i * t/3)' +|'cos(acos(z))':'z' +|'addsq(cos(z), sin(z))':1 +|'cos(z)':'cosh(i*z)' +|'subsq(cosh(z), sinh(z))':1 +|'cot(acot(z))':'z' +|'cot(z)':'1 / tan(z)' +|'cot(z)':'cotan(z)' +|'csc(acsc(z))':'z' +|'csc(z)':'1 / sin(z)' +|'csc(z)':'cosec(z)' +|'exp(log(z))':'z' +|'exp(z)':'exp(a) * exp(i * b)' +|'ln(z)':'log(z)' +|'log(exp(z))':'z' +|'log(z)':'log(r) + i*t' +|'log10(z)':'log(z) / log(10)' +|'logn(z, 2)':'log(z) / log(2)' +|'logn(z, 3)':'log(z) / log(3)' +|'sec(asec(z))':'z' +|'sec(z)':'1 / cos(z)' +|'sin(asin(z))':'z' +|'sin(i * z)':'i * sinh(z)' +|'sqrt(z) * sqrt(z)':'z' +|'sqrt(z)':'sqrt(r) * exp(i * t/2)' +|'tan(atan(z))':'z' +|'z**z':'exp(z * log(z))' + +{ (1,1); [1,0.5]; (-2, -1); 2; -3; (-1,0.5); (0,0.5); 0.5; (2, 0); (-1, -2) } + +|'cosh(acosh(z))':'z' +|'coth(acoth(z))':'z' +|'coth(z)':'1 / tanh(z)' +|'coth(z)':'cotanh(z)' +|'csch(acsch(z))':'z' +|'csch(z)':'1 / sinh(z)' +|'csch(z)':'cosech(z)' +|'sech(asech(z))':'z' +|'sech(z)':'1 / cosh(z)' +|'sinh(asinh(z))':'z' +|'tanh(atanh(z))':'z' + +{ (0.2,-0.4); [1,0.5]; -1.2; (-1,0.5); 0.5; (1.1, 0) } + +|'acos(cos(z)) ** 2':'z * z' +|'acosh(cosh(z)) ** 2':'z * z' +|'acoth(z)':'acotanh(z)' +|'acoth(z)':'atanh(1 / z)' +|'acsch(z)':'acosech(z)' +|'acsch(z)':'asinh(1 / z)' +|'asech(z)':'acosh(1 / z)' +|'asin(sin(z))':'z' +|'asinh(sinh(z))':'z' +|'atan(tan(z))':'z' +|'atanh(tanh(z))':'z' + +&log +(-2.0,0):( 0.69314718055995, 3.14159265358979) +(-1.0,0):( 0 , 3.14159265358979) +(-0.5,0):( -0.69314718055995, 3.14159265358979) +( 0.5,0):( -0.69314718055995, 0 ) +( 1.0,0):( 0 , 0 ) +( 2.0,0):( 0.69314718055995, 0 ) + +&log +( 2, 3):( 1.28247467873077, 0.98279372324733) +(-2, 3):( 1.28247467873077, 2.15879893034246) +(-2,-3):( 1.28247467873077, -2.15879893034246) +( 2,-3):( 1.28247467873077, -0.98279372324733) + +&sin +(-2.0,0):( -0.90929742682568, 0 ) +(-1.0,0):( -0.84147098480790, 0 ) +(-0.5,0):( -0.47942553860420, 0 ) +( 0.0,0):( 0 , 0 ) +( 0.5,0):( 0.47942553860420, 0 ) +( 1.0,0):( 0.84147098480790, 0 ) +( 2.0,0):( 0.90929742682568, 0 ) + +&sin +( 2, 3):( 9.15449914691143, -4.16890695996656) +(-2, 3):( -9.15449914691143, -4.16890695996656) +(-2,-3):( -9.15449914691143, 4.16890695996656) +( 2,-3):( 9.15449914691143, 4.16890695996656) + +&cos +(-2.0,0):( -0.41614683654714, 0 ) +(-1.0,0):( 0.54030230586814, 0 ) +(-0.5,0):( 0.87758256189037, 0 ) +( 0.0,0):( 1 , 0 ) +( 0.5,0):( 0.87758256189037, 0 ) +( 1.0,0):( 0.54030230586814, 0 ) +( 2.0,0):( -0.41614683654714, 0 ) + +&cos +( 2, 3):( -4.18962569096881, -9.10922789375534) +(-2, 3):( -4.18962569096881, 9.10922789375534) +(-2,-3):( -4.18962569096881, -9.10922789375534) +( 2,-3):( -4.18962569096881, 9.10922789375534) + +&tan +(-2.0,0):( 2.18503986326152, 0 ) +(-1.0,0):( -1.55740772465490, 0 ) +(-0.5,0):( -0.54630248984379, 0 ) +( 0.0,0):( 0 , 0 ) +( 0.5,0):( 0.54630248984379, 0 ) +( 1.0,0):( 1.55740772465490, 0 ) +( 2.0,0):( -2.18503986326152, 0 ) + +&tan +( 2, 3):( -0.00376402564150, 1.00323862735361) +(-2, 3):( 0.00376402564150, 1.00323862735361) +(-2,-3):( 0.00376402564150, -1.00323862735361) +( 2,-3):( -0.00376402564150, -1.00323862735361) + +&sec +(-2.0,0):( -2.40299796172238, 0 ) +(-1.0,0):( 1.85081571768093, 0 ) +(-0.5,0):( 1.13949392732455, 0 ) +( 0.0,0):( 1 , 0 ) +( 0.5,0):( 1.13949392732455, 0 ) +( 1.0,0):( 1.85081571768093, 0 ) +( 2.0,0):( -2.40299796172238, 0 ) + +&sec +( 2, 3):( -0.04167496441114, 0.09061113719624) +(-2, 3):( -0.04167496441114, -0.09061113719624) +(-2,-3):( -0.04167496441114, 0.09061113719624) +( 2,-3):( -0.04167496441114, -0.09061113719624) + +&csc +(-2.0,0):( -1.09975017029462, 0 ) +(-1.0,0):( -1.18839510577812, 0 ) +(-0.5,0):( -2.08582964293349, 0 ) +( 0.5,0):( 2.08582964293349, 0 ) +( 1.0,0):( 1.18839510577812, 0 ) +( 2.0,0):( 1.09975017029462, 0 ) + +&csc +( 2, 3):( 0.09047320975321, 0.04120098628857) +(-2, 3):( -0.09047320975321, 0.04120098628857) +(-2,-3):( -0.09047320975321, -0.04120098628857) +( 2,-3):( 0.09047320975321, -0.04120098628857) + +&cot +(-2.0,0):( 0.45765755436029, 0 ) +(-1.0,0):( -0.64209261593433, 0 ) +(-0.5,0):( -1.83048772171245, 0 ) +( 0.5,0):( 1.83048772171245, 0 ) +( 1.0,0):( 0.64209261593433, 0 ) +( 2.0,0):( -0.45765755436029, 0 ) + +&cot +( 2, 3):( -0.00373971037634, -0.99675779656936) +(-2, 3):( 0.00373971037634, -0.99675779656936) +(-2,-3):( 0.00373971037634, 0.99675779656936) +( 2,-3):( -0.00373971037634, 0.99675779656936) + +&asin +(-2.0,0):( -1.57079632679490, 1.31695789692482) +(-1.0,0):( -1.57079632679490, 0 ) +(-0.5,0):( -0.52359877559830, 0 ) +( 0.0,0):( 0 , 0 ) +( 0.5,0):( 0.52359877559830, 0 ) +( 1.0,0):( 1.57079632679490, 0 ) +( 2.0,0):( 1.57079632679490, -1.31695789692482) + +&asin +( 2, 3):( 0.57065278432110, 1.98338702991654) +(-2, 3):( -0.57065278432110, 1.98338702991654) +(-2,-3):( -0.57065278432110, -1.98338702991654) +( 2,-3):( 0.57065278432110, -1.98338702991654) + +&acos +(-2.0,0):( 3.14159265358979, -1.31695789692482) +(-1.0,0):( 3.14159265358979, 0 ) +(-0.5,0):( 2.09439510239320, 0 ) +( 0.0,0):( 1.57079632679490, 0 ) +( 0.5,0):( 1.04719755119660, 0 ) +( 1.0,0):( 0 , 0 ) +( 2.0,0):( 0 , 1.31695789692482) + +&acos +( 2, 3):( 1.00014354247380, -1.98338702991654) +(-2, 3):( 2.14144911111600, -1.98338702991654) +(-2,-3):( 2.14144911111600, 1.98338702991654) +( 2,-3):( 1.00014354247380, 1.98338702991654) + +&atan +(-2.0,0):( -1.10714871779409, 0 ) +(-1.0,0):( -0.78539816339745, 0 ) +(-0.5,0):( -0.46364760900081, 0 ) +( 0.0,0):( 0 , 0 ) +( 0.5,0):( 0.46364760900081, 0 ) +( 1.0,0):( 0.78539816339745, 0 ) +( 2.0,0):( 1.10714871779409, 0 ) + +&atan +( 2, 3):( 1.40992104959658, 0.22907268296854) +(-2, 3):( -1.40992104959658, 0.22907268296854) +(-2,-3):( -1.40992104959658, -0.22907268296854) +( 2,-3):( 1.40992104959658, -0.22907268296854) + +&asec +(-2.0,0):( 2.09439510239320, 0 ) +(-1.0,0):( 3.14159265358979, 0 ) +(-0.5,0):( 3.14159265358979, -1.31695789692482) +( 0.5,0):( 0 , 1.31695789692482) +( 1.0,0):( 0 , 0 ) +( 2.0,0):( 1.04719755119660, 0 ) + +&asec +( 2, 3):( 1.42041072246703, 0.23133469857397) +(-2, 3):( 1.72118193112276, 0.23133469857397) +(-2,-3):( 1.72118193112276, -0.23133469857397) +( 2,-3):( 1.42041072246703, -0.23133469857397) + +&acsc +(-2.0,0):( -0.52359877559830, 0 ) +(-1.0,0):( -1.57079632679490, 0 ) +(-0.5,0):( -1.57079632679490, 1.31695789692482) +( 0.5,0):( 1.57079632679490, -1.31695789692482) +( 1.0,0):( 1.57079632679490, 0 ) +( 2.0,0):( 0.52359877559830, 0 ) + +&acsc +( 2, 3):( 0.15038560432786, -0.23133469857397) +(-2, 3):( -0.15038560432786, -0.23133469857397) +(-2,-3):( -0.15038560432786, 0.23133469857397) +( 2,-3):( 0.15038560432786, 0.23133469857397) + +&acot +(-2.0,0):( -0.46364760900081, 0 ) +(-1.0,0):( -0.78539816339745, 0 ) +(-0.5,0):( -1.10714871779409, 0 ) +( 0.5,0):( 1.10714871779409, 0 ) +( 1.0,0):( 0.78539816339745, 0 ) +( 2.0,0):( 0.46364760900081, 0 ) + +&acot +( 2, 3):( 0.16087527719832, -0.22907268296854) +(-2, 3):( -0.16087527719832, -0.22907268296854) +(-2,-3):( -0.16087527719832, 0.22907268296854) +( 2,-3):( 0.16087527719832, 0.22907268296854) + +&sinh +(-2.0,0):( -3.62686040784702, 0 ) +(-1.0,0):( -1.17520119364380, 0 ) +(-0.5,0):( -0.52109530549375, 0 ) +( 0.0,0):( 0 , 0 ) +( 0.5,0):( 0.52109530549375, 0 ) +( 1.0,0):( 1.17520119364380, 0 ) +( 2.0,0):( 3.62686040784702, 0 ) + +&sinh +( 2, 3):( -3.59056458998578, 0.53092108624852) +(-2, 3):( 3.59056458998578, 0.53092108624852) +(-2,-3):( 3.59056458998578, -0.53092108624852) +( 2,-3):( -3.59056458998578, -0.53092108624852) + +&cosh +(-2.0,0):( 3.76219569108363, 0 ) +(-1.0,0):( 1.54308063481524, 0 ) +(-0.5,0):( 1.12762596520638, 0 ) +( 0.0,0):( 1 , 0 ) +( 0.5,0):( 1.12762596520638, 0 ) +( 1.0,0):( 1.54308063481524, 0 ) +( 2.0,0):( 3.76219569108363, 0 ) + +&cosh +( 2, 3):( -3.72454550491532, 0.51182256998738) +(-2, 3):( -3.72454550491532, -0.51182256998738) +(-2,-3):( -3.72454550491532, 0.51182256998738) +( 2,-3):( -3.72454550491532, -0.51182256998738) + +&tanh +(-2.0,0):( -0.96402758007582, 0 ) +(-1.0,0):( -0.76159415595576, 0 ) +(-0.5,0):( -0.46211715726001, 0 ) +( 0.0,0):( 0 , 0 ) +( 0.5,0):( 0.46211715726001, 0 ) +( 1.0,0):( 0.76159415595576, 0 ) +( 2.0,0):( 0.96402758007582, 0 ) + +&tanh +( 2, 3):( 0.96538587902213, -0.00988437503832) +(-2, 3):( -0.96538587902213, -0.00988437503832) +(-2,-3):( -0.96538587902213, 0.00988437503832) +( 2,-3):( 0.96538587902213, 0.00988437503832) + +&sech +(-2.0,0):( 0.26580222883408, 0 ) +(-1.0,0):( 0.64805427366389, 0 ) +(-0.5,0):( 0.88681888397007, 0 ) +( 0.0,0):( 1 , 0 ) +( 0.5,0):( 0.88681888397007, 0 ) +( 1.0,0):( 0.64805427366389, 0 ) +( 2.0,0):( 0.26580222883408, 0 ) + +&sech +( 2, 3):( -0.26351297515839, -0.03621163655877) +(-2, 3):( -0.26351297515839, 0.03621163655877) +(-2,-3):( -0.26351297515839, -0.03621163655877) +( 2,-3):( -0.26351297515839, 0.03621163655877) + +&csch +(-2.0,0):( -0.27572056477178, 0 ) +(-1.0,0):( -0.85091812823932, 0 ) +(-0.5,0):( -1.91903475133494, 0 ) +( 0.5,0):( 1.91903475133494, 0 ) +( 1.0,0):( 0.85091812823932, 0 ) +( 2.0,0):( 0.27572056477178, 0 ) + +&csch +( 2, 3):( -0.27254866146294, -0.04030057885689) +(-2, 3):( 0.27254866146294, -0.04030057885689) +(-2,-3):( 0.27254866146294, 0.04030057885689) +( 2,-3):( -0.27254866146294, 0.04030057885689) + +&coth +(-2.0,0):( -1.03731472072755, 0 ) +(-1.0,0):( -1.31303528549933, 0 ) +(-0.5,0):( -2.16395341373865, 0 ) +( 0.5,0):( 2.16395341373865, 0 ) +( 1.0,0):( 1.31303528549933, 0 ) +( 2.0,0):( 1.03731472072755, 0 ) + +&coth +( 2, 3):( 1.03574663776500, 0.01060478347034) +(-2, 3):( -1.03574663776500, 0.01060478347034) +(-2,-3):( -1.03574663776500, -0.01060478347034) +( 2,-3):( 1.03574663776500, -0.01060478347034) + +&asinh +(-2.0,0):( -1.44363547517881, 0 ) +(-1.0,0):( -0.88137358701954, 0 ) +(-0.5,0):( -0.48121182505960, 0 ) +( 0.0,0):( 0 , 0 ) +( 0.5,0):( 0.48121182505960, 0 ) +( 1.0,0):( 0.88137358701954, 0 ) +( 2.0,0):( 1.44363547517881, 0 ) + +&asinh +( 2, 3):( 1.96863792579310, 0.96465850440760) +(-2, 3):( -1.96863792579310, 0.96465850440761) +(-2,-3):( -1.96863792579310, -0.96465850440761) +( 2,-3):( 1.96863792579310, -0.96465850440760) + +&acosh +(-2.0,0):( 1.31695789692482, 3.14159265358979) +(-1.0,0):( 0, 3.14159265358979) +(-0.5,0):( 0, 2.09439510239320) +( 0.0,0):( 0, 1.57079632679490) +( 0.5,0):( 0, 1.04719755119660) +( 1.0,0):( 0 , 0 ) +( 2.0,0):( 1.31695789692482, 0 ) + +&acosh +( 2, 3):( 1.98338702991654, 1.00014354247380) +(-2, 3):( 1.98338702991653, 2.14144911111600) +(-2,-3):( 1.98338702991653, -2.14144911111600) +( 2,-3):( 1.98338702991654, -1.00014354247380) + +&atanh +(-2.0,0):( -0.54930614433405, 1.57079632679490) +(-0.5,0):( -0.54930614433405, 0 ) +( 0.0,0):( 0 , 0 ) +( 0.5,0):( 0.54930614433405, 0 ) +( 2.0,0):( 0.54930614433405, 1.57079632679490) + +&atanh +( 2, 3):( 0.14694666622553, 1.33897252229449) +(-2, 3):( -0.14694666622553, 1.33897252229449) +(-2,-3):( -0.14694666622553, -1.33897252229449) +( 2,-3):( 0.14694666622553, -1.33897252229449) + +&asech +(-2.0,0):( 0 , 2.09439510239320) +(-1.0,0):( 0 , 3.14159265358979) +(-0.5,0):( 1.31695789692482, 3.14159265358979) +( 0.5,0):( 1.31695789692482, 0 ) +( 1.0,0):( 0 , 0 ) +( 2.0,0):( 0 , 1.04719755119660) + +&asech +( 2, 3):( 0.23133469857397, -1.42041072246703) +(-2, 3):( 0.23133469857397, -1.72118193112276) +(-2,-3):( 0.23133469857397, 1.72118193112276) +( 2,-3):( 0.23133469857397, 1.42041072246703) + +&acsch +(-2.0,0):( -0.48121182505960, 0 ) +(-1.0,0):( -0.88137358701954, 0 ) +(-0.5,0):( -1.44363547517881, 0 ) +( 0.5,0):( 1.44363547517881, 0 ) +( 1.0,0):( 0.88137358701954, 0 ) +( 2.0,0):( 0.48121182505960, 0 ) + +&acsch +( 2, 3):( 0.15735549884499, -0.22996290237721) +(-2, 3):( -0.15735549884499, -0.22996290237721) +(-2,-3):( -0.15735549884499, 0.22996290237721) +( 2,-3):( 0.15735549884499, 0.22996290237721) + +&acoth +(-2.0,0):( -0.54930614433405, 0 ) +(-0.5,0):( -0.54930614433405, 1.57079632679490) +( 0.5,0):( 0.54930614433405, 1.57079632679490) +( 2.0,0):( 0.54930614433405, 0 ) + +&acoth +( 2, 3):( 0.14694666622553, -0.23182380450040) +(-2, 3):( -0.14694666622553, -0.23182380450040) +(-2,-3):( -0.14694666622553, 0.23182380450040) +( 2,-3):( 0.14694666622553, 0.23182380450040) + +# eof Index: gnu/usr.bin/perl/dist/Math-Complex/t/Trig.t =================================================================== RCS file: gnu/usr.bin/perl/dist/Math-Complex/t/Trig.t diff -N gnu/usr.bin/perl/dist/Math-Complex/t/Trig.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Math-Complex/t/Trig.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,395 @@ +#!./perl + +# +# Regression tests for the Math::Trig package +# +# The tests here are quite modest as the Math::Complex tests exercise +# these interfaces quite vigorously. +# +# -- Jarkko Hietaniemi, April 1997 + +use strict; +use warnings; +use Test::More tests => 157; + +use Math::Trig 1.18; +use Math::Trig 1.18 qw(:pi Inf); + +our $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/); +our $has_inf = !$vax_float; + +my $pip2 = pi / 2; + +use strict; + +our($x, $y, $z); + +my $eps = 1e-11; + +if ($^O eq 'unicos') { # See lib/Math/Complex.pm and t/lib/complex.t. + $eps = 1e-10; +} + +sub near { + my $e = defined $_[2] ? $_[2] : $eps; + my $d = $_[1] ? abs($_[0]/$_[1] - 1) : abs($_[0]); + print "# near? $_[0] $_[1] : $d : $e\n"; + $_[1] ? ($d < $e) : abs($_[0]) < $e; +} + +print "# Sanity checks\n"; + +ok(near(sin(1), 0.841470984807897)); +ok(near(cos(1), 0.54030230586814)); +ok(near(tan(1), 1.5574077246549)); + +ok(near(sec(1), 1.85081571768093)); +ok(near(csc(1), 1.18839510577812)); +ok(near(cot(1), 0.642092615934331)); + +ok(near(asin(1), 1.5707963267949)); +ok(near(acos(1), 0)); +ok(near(atan(1), 0.785398163397448)); + +ok(near(asec(1), 0)); +ok(near(acsc(1), 1.5707963267949)); +ok(near(acot(1), 0.785398163397448)); + +ok(near(sinh(1), 1.1752011936438)); +ok(near(cosh(1), 1.54308063481524)); +ok(near(tanh(1), 0.761594155955765)); + +ok(near(sech(1), 0.648054273663885)); +ok(near(csch(1), 0.850918128239322)); +ok(near(coth(1), 1.31303528549933)); + +ok(near(asinh(1), 0.881373587019543)); +ok(near(acosh(1), 0)); +ok(near(atanh(0.9), 1.47221948958322)); # atanh(1.0) would be an error. + +ok(near(asech(0.9), 0.467145308103262)); +ok(near(acsch(2), 0.481211825059603)); +ok(near(acoth(2), 0.549306144334055)); + +print "# Basics\n"; + +$x = 0.9; +ok(near(tan($x), sin($x) / cos($x))); + +ok(near(sinh(2), 3.62686040784702)); + +ok(near(acsch(0.1), 2.99822295029797)); + +$x = asin(2); +is(ref $x, 'Math::Complex'); + +# avoid using Math::Complex here +$x =~ /^([^-]+)(-[^i]+)i$/; +($y, $z) = ($1, $2); +ok(near($y, 1.5707963267949)); +ok(near($z, -1.31695789692482)); + +ok(near(deg2rad(90), pi/2)); + +ok(near(rad2deg(pi), 180)); + +use Math::Trig ':radial'; + +{ + my ($r,$t,$z) = cartesian_to_cylindrical(1,1,1); + + ok(near($r, sqrt(2))); + ok(near($t, deg2rad(45))); + ok(near($z, 1)); + + ($x,$y,$z) = cylindrical_to_cartesian($r, $t, $z); + + ok(near($x, 1)); + ok(near($y, 1)); + ok(near($z, 1)); + + ($r,$t,$z) = cartesian_to_cylindrical(1,1,0); + + ok(near($r, sqrt(2))); + ok(near($t, deg2rad(45))); + ok(near($z, 0)); + + ($x,$y,$z) = cylindrical_to_cartesian($r, $t, $z); + + ok(near($x, 1)); + ok(near($y, 1)); + ok(near($z, 0)); +} + +{ + my ($r,$t,$f) = cartesian_to_spherical(1,1,1); + + ok(near($r, sqrt(3))); + ok(near($t, deg2rad(45))); + ok(near($f, atan2(sqrt(2), 1))); + + ($x,$y,$z) = spherical_to_cartesian($r, $t, $f); + + ok(near($x, 1)); + ok(near($y, 1)); + ok(near($z, 1)); + + ($r,$t,$f) = cartesian_to_spherical(1,1,0); + + ok(near($r, sqrt(2))); + ok(near($t, deg2rad(45))); + ok(near($f, deg2rad(90))); + + ($x,$y,$z) = spherical_to_cartesian($r, $t, $f); + + ok(near($x, 1)); + ok(near($y, 1)); + ok(near($z, 0)); +} + +{ + my ($r,$t,$z) = cylindrical_to_spherical(spherical_to_cylindrical(1,1,1)); + + ok(near($r, 1)); + ok(near($t, 1)); + ok(near($z, 1)); + + ($r,$t,$z) = spherical_to_cylindrical(cylindrical_to_spherical(1,1,1)); + + ok(near($r, 1)); + ok(near($t, 1)); + ok(near($z, 1)); +} + +{ + use Math::Trig 'great_circle_distance'; + + ok(near(great_circle_distance(0, 0, 0, pi/2), pi/2)); + + ok(near(great_circle_distance(0, 0, pi, pi), pi)); + + # London to Tokyo. + my @L = (deg2rad(-0.5), deg2rad(90 - 51.3)); + my @T = (deg2rad(139.8), deg2rad(90 - 35.7)); + + my $km = great_circle_distance(@L, @T, 6378); + + ok(near($km, 9605.26637021388)); +} + +{ + my $R2D = 57.295779513082320876798154814169; + + sub frac { $_[0] - int($_[0]) } + + my $lotta_radians = deg2rad(1E+20, 1); + ok(near($lotta_radians, 1E+20/$R2D)); + + my $negat_degrees = rad2deg(-1E20, 1); + ok(near($negat_degrees, -1E+20*$R2D)); + + my $posit_degrees = rad2deg(-10000, 1); + ok(near($posit_degrees, -10000*$R2D)); +} + +{ + use Math::Trig 'great_circle_direction'; + + ok(near(great_circle_direction(0, 0, 0, pi/2), pi)); + +# Retired test: Relies on atan2(0, 0), which is not portable. +# ok(near(great_circle_direction(0, 0, pi, pi), -pi()/2)); + + my @London = (deg2rad( -0.167), deg2rad(90 - 51.3)); + my @Tokyo = (deg2rad( 139.5), deg2rad(90 - 35.7)); + my @Berlin = (deg2rad ( 13.417), deg2rad(90 - 52.533)); + my @Paris = (deg2rad ( 2.333), deg2rad(90 - 48.867)); + + ok(near(rad2deg(great_circle_direction(@London, @Tokyo)), + 31.791945393073)); + + ok(near(rad2deg(great_circle_direction(@Tokyo, @London)), + 336.069766430326)); + + ok(near(rad2deg(great_circle_direction(@Berlin, @Paris)), + 246.800348034667)); + + ok(near(rad2deg(great_circle_direction(@Paris, @Berlin)), + 58.2079877553156)); + + use Math::Trig 'great_circle_bearing'; + + ok(near(rad2deg(great_circle_bearing(@Paris, @Berlin)), + 58.2079877553156)); + + use Math::Trig 'great_circle_waypoint'; + use Math::Trig 'great_circle_midpoint'; + + my ($lon, $lat); + + ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.0); + + ok(near($lon, $London[0])); + + ok(near($lat, $London[1])); + + ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 1.0); + + ok(near($lon, $Tokyo[0])); + + ok(near($lat, $Tokyo[1])); + + ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.5); + + ok(near($lon, 1.55609593577679)); # 89.16 E + + ok(near($lat, 0.36783532946162)); # 68.93 N + + ($lon, $lat) = great_circle_midpoint(@London, @Tokyo); + + ok(near($lon, 1.55609593577679)); # 89.16 E + + ok(near($lat, 0.367835329461615)); # 68.93 N + + ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.25); + + ok(near($lon, 0.516073562850837)); # 29.57 E + + ok(near($lat, 0.400231313403387)); # 67.07 N + + ($lon, $lat) = great_circle_waypoint(@London, @Tokyo, 0.75); + + ok(near($lon, 2.17494903805952)); # 124.62 E + + ok(near($lat, 0.617809294053591)); # 54.60 N + + use Math::Trig 'great_circle_destination'; + + my $dir1 = great_circle_direction(@London, @Tokyo); + my $dst1 = great_circle_distance(@London, @Tokyo); + + ($lon, $lat) = great_circle_destination(@London, $dir1, $dst1); + + ok(near($lon, $Tokyo[0])); + + ok(near($lat, $pip2 - $Tokyo[1])); + + my $dir2 = great_circle_direction(@Tokyo, @London); + my $dst2 = great_circle_distance(@Tokyo, @London); + + ($lon, $lat) = great_circle_destination(@Tokyo, $dir2, $dst2); + + ok(near($lon, $London[0])); + + ok(near($lat, $pip2 - $London[1])); + + my $dir3 = (great_circle_destination(@London, $dir1, $dst1))[2]; + + ok(near($dir3, 2.69379263839118)); # about 154.343 deg + + my $dir4 = (great_circle_destination(@Tokyo, $dir2, $dst2))[2]; + + ok(near($dir4, 3.6993902625701)); # about 211.959 deg + + ok(near($dst1, $dst2)); +} + +SKIP: { +# With netbsd-vax (or any vax) there is neither Inf, nor 1e40. +skip("different float range", 42) if $vax_float; +skip("no inf", 42) unless $has_inf; + +print "# Infinity\n"; + +my $BigDouble = eval '1e40'; + +# E.g. netbsd-alpha core dumps on Inf arith without this. +local $SIG{FPE} = sub { }; + +ok(Inf() > $BigDouble); # This passes in netbsd-alpha. +ok(Inf() + $BigDouble > $BigDouble); # This coredumps in netbsd-alpha. +ok(Inf() + $BigDouble == Inf()); +ok(Inf() - $BigDouble > $BigDouble); +ok(Inf() - $BigDouble == Inf()); +ok(Inf() * $BigDouble > $BigDouble); +ok(Inf() * $BigDouble == Inf()); +ok(Inf() / $BigDouble > $BigDouble); +ok(Inf() / $BigDouble == Inf()); + +ok(-Inf() < -$BigDouble); +ok(-Inf() + $BigDouble < $BigDouble); +ok(-Inf() + $BigDouble == -Inf()); +ok(-Inf() - $BigDouble < -$BigDouble); +ok(-Inf() - $BigDouble == -Inf()); +ok(-Inf() * $BigDouble < -$BigDouble); +ok(-Inf() * $BigDouble == -Inf()); +ok(-Inf() / $BigDouble < -$BigDouble); +ok(-Inf() / $BigDouble == -Inf()); + +print "# sinh/sech/cosh/csch/tanh/coth unto infinity\n"; + +ok(near(sinh(100), eval '1.3441e+43', 1e-3)); +ok(near(sech(100), eval '7.4402e-44', 1e-3)); +ok(near(cosh(100), eval '1.3441e+43', 1e-3)); +ok(near(csch(100), eval '7.4402e-44', 1e-3)); +ok(near(tanh(100), 1)); +ok(near(coth(100), 1)); + +ok(near(sinh(-100), eval '-1.3441e+43', 1e-3)); +ok(near(sech(-100), eval ' 7.4402e-44', 1e-3)); +ok(near(cosh(-100), eval ' 1.3441e+43', 1e-3)); +ok(near(csch(-100), eval '-7.4402e-44', 1e-3)); +ok(near(tanh(-100), -1)); +ok(near(coth(-100), -1)); + +cmp_ok(sinh(1e5), '==', Inf()); +cmp_ok(sech(1e5), '==', 0); +cmp_ok(cosh(1e5), '==', Inf()); +cmp_ok(csch(1e5), '==', 0); +cmp_ok(tanh(1e5), '==', 1); +cmp_ok(coth(1e5), '==', 1); + +cmp_ok(sinh(-1e5), '==', -Inf()); +cmp_ok(sech(-1e5), '==', 0); +cmp_ok(cosh(-1e5), '==', Inf()); +cmp_ok(csch(-1e5), '==', 0); +cmp_ok(tanh(-1e5), '==', -1); +cmp_ok(coth(-1e5), '==', -1); + +} + +print "# great_circle_distance with small angles\n"; + +for my $e (qw(1e-2 1e-3 1e-4 1e-5)) { + # Can't assume == 0 because of floating point fuzz, + # but let's hope for at least < $e. + cmp_ok(great_circle_distance(0, $e, 0, $e), '<', $e, + "great_circle_distance(0, $e, 0, $e) < $e"); +} + +for my $e (qw(1e-5 1e-6 1e-7 1e-8)) { + # Verify that the distance is positive for points close together. A poor + # algorithm is likely to give a distance of zero in some of these cases. + cmp_ok(great_circle_distance(2, 2, 2, 2+$e), '>', 0, + "great_circle_distance(2, 2, 2, " . (2+$e) . ") > 0"); +} + +print "# asin_real, acos_real\n"; + +is(acos_real(-2.0), pi); +is(acos_real(-1.0), pi); +is(acos_real(-0.5), acos(-0.5)); +is(acos_real( 0.0), acos( 0.0)); +is(acos_real( 0.5), acos( 0.5)); +is(acos_real( 1.0), 0); +is(acos_real( 2.0), 0); + +is(asin_real(-2.0), -&pip2); +is(asin_real(-1.0), -&pip2); +is(asin_real(-0.5), asin(-0.5)); +is(asin_real( 0.0), asin( 0.0)); +is(asin_real( 0.5), asin( 0.5)); +is(asin_real( 1.0), pip2); +is(asin_real( 2.0), pip2); + +# eof Index: gnu/usr.bin/perl/dist/Math-Complex/t/underbar.t =================================================================== RCS file: gnu/usr.bin/perl/dist/Math-Complex/t/underbar.t diff -N gnu/usr.bin/perl/dist/Math-Complex/t/underbar.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Math-Complex/t/underbar.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,28 @@ +# +# Tests that the standard Perl 5 functions that we override +# that operate on the $_ will work correctly [perl #62412] +# + +use Test::More; + +use strict; +use warnings; + +my @f = qw(abs cos exp log sin sqrt); + +plan tests => scalar @f; + +use Math::Complex; + +my %CORE; + +for my $f (@f) { + local $_ = 0.5; + $CORE{$f} = eval "CORE::$f"; +} + +for my $f (@f) { + local $_ = 0.5; + is(eval "Math::Complex::$f", $CORE{$f}, $f); +} + Index: gnu/usr.bin/perl/dist/Net-Ping/Changes =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/Changes,v diff -u -p -a -u -p -r1.1.1.7 Changes --- gnu/usr.bin/perl/dist/Net-Ping/Changes 15 Feb 2023 01:32:56 -0000 1.1.1.7 +++ gnu/usr.bin/perl/dist/Net-Ping/Changes 21 Feb 2024 15:47:01 -0000 @@ -1,5 +1,14 @@ CHANGES ------- +2.75 2022-09-01 12:44:03 rurban + Minor + - Modernized the synopsis (PR #31) + - Fixed a link in a comment (PR #25) + META Changes + - Remove some TEST_REQUIRES (PR #23) + Test fixes + - Support NO_NETWORK_TESTING=1 (PR #24) + - Fix non-routable addresses for negative tests (PR #24) 2.74 2020-09-09 09:21:39 rurban Features - Add ICMPv6_NI_REPLY support. Index: gnu/usr.bin/perl/dist/Net-Ping/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/Net-Ping/Makefile.PL diff -N gnu/usr.bin/perl/dist/Net-Ping/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Net-Ping/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,75 @@ +use strict; +use warnings; +use v5.002; # not using our in the CPAN release +use ExtUtils::MakeMaker; + +my @extras = (); +my $EUMM_VER = $ExtUtils::MakeMaker::VERSION; +my @AUTHORS = ( + 'Reini Urban ', + 'Steve Peters ', + 'Matthew Musgrove ', + 'Karl Williamson ', + 'Brian Fraser ', + 'Mark Gardner ', + ); + +push @extras, + AUTHOR => join(", ", @AUTHORS) + if $EUMM_VER gt '5.4301' and $EUMM_VER lt '6.57_02'; +push @extras, + AUTHOR => [ @AUTHORS ] + if $EUMM_VER ge '6.57_02'; +push @extras, SIGN => 1 + if $EUMM_VER ge '6.18'; +push @extras, LICENSE => 'perl_5' + if $EUMM_VER ge '6.31' and $EUMM_VER le '6.46'; +push @extras, + META_MERGE => { + 'meta-spec' => { version => 2 }, + resources => { + # TODO: 26 old issues still open at RT + # https://rt.cpan.org/Public/Dist/Display.html?Name=Net-Ping + bugtracker => 'https://github.com/Perl/perl5/issues', + repository => { + type => 'git', + url => 'https://github.com/Perl/perl5.git', + web => 'https://github.com/Perl/perl5', + }, + license => [ 'http://dev.perl.org/licenses/' ], + }, + release_status => 'stable', + } + if $EUMM_VER gt '6.46'; + +WriteMakefile( + NAME => 'Net::Ping', + VERSION_FROM => 'lib/Net/Ping.pm', + ABSTRACT_FROM => 'lib/Net/Ping.pm', + PREREQ_PM => { + 'Socket' => '2.007', + 'Test::More' => 0, + 'Time::HiRes' => 0, + }, + TEST_REQUIRES => { + 'Test::Pod' => '1.22', + 'Test::More' => 0, + }, + INSTALLDIRS => ( $] < 5.011 ? 'perl' : 'site' ), + clean => { FILES => 'Net-Ping-*' }, + @extras +); + +package MY; + +sub depend { + " +README : lib/Net/Ping.pm + pod2text lib/Net/Ping.pm > README +release : dist + git tag \$(VERSION) + cpan-upload \$(DISTVNAME).tar\$(SUFFIX) + git push + git push --tags +" +} Index: gnu/usr.bin/perl/dist/Net-Ping/TODO =================================================================== RCS file: gnu/usr.bin/perl/dist/Net-Ping/TODO diff -N gnu/usr.bin/perl/dist/Net-Ping/TODO --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Net-Ping/TODO 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,34 @@ +TODO list for Net::Ping (in case anyone is looking for things to do) + +- More IPv6 support +Some options like IP_TOS and IP_TTL are not available on IPv6 + +- POD rewriting +Some things, such as the return from $p->ping(), are cryptic. The location of the +source is off as well. + +- Device +Setting the device uses SO_BINDTODEVICE. This is Linux-only and should not work anywhere +else. I think deprecating this is probably the right thing to do. + +-TOS +The incoming TOS value can be just about anything from my testing. This valid values are +supposed to be (in decimal) 0, 1, 2, 4, and 8 assuming we aren't talking DS and ECN. +I don't know right now if this is a bug in Socket, Darwin (tesing on Mac OS X currently) +or if that's just the way it is. Time for some C level testing for this one. +P.S. TOS is IPv4 only. + +- Tests +Nicholas Clark converted the tests to Test::More which is a good start. The tests need some +cleanup and modernizing. Below is the current test coverage when testing as root. + +----------------------------------- ------ ------ ------ ------ ------ ------ +File stmt bran cond sub time total +----------------------------------- ------ ------ ------ ------ ------ ------ +blib/lib/Net/Ping.pm 62.6 42.8 33.0 76.9 100.0 52.6 +Total 62.6 42.8 33.0 76.9 100.0 52.6 +----------------------------------- ------ ------ ------ ------ ------ ------ + +This needs to be quite a bit higher all around to make me comfortable with a refactor. + + Index: gnu/usr.bin/perl/dist/Net-Ping/lib/Net/Ping.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/lib/Net/Ping.pm,v diff -u -p -a -u -p -r1.10 Ping.pm --- gnu/usr.bin/perl/dist/Net-Ping/lib/Net/Ping.pm 15 Feb 2023 01:36:28 -0000 1.10 +++ gnu/usr.bin/perl/dist/Net-Ping/lib/Net/Ping.pm 21 Feb 2024 15:47:01 -0000 @@ -22,7 +22,7 @@ use Time::HiRes; @ISA = qw(Exporter); @EXPORT = qw(pingecho); @EXPORT_OK = qw(wakeonlan); -$VERSION = "2.74"; +$VERSION = "2.76"; # Globals @@ -1081,8 +1081,7 @@ sub tcp_connect sub DESTROY { my $self = shift; - if ($self->{'proto'} eq 'tcp' && - $self->{'tcp_chld'}) { + if ($self->{'proto'} && ($self->{'proto'} eq 'tcp') && $self->{'tcp_chld'}) { # Put that choking client out of its misery kill "KILL", $self->{'tcp_chld'}; # Clean off the zombie @@ -2004,13 +2003,13 @@ Net::Ping - check a remote host for reac use Net::Ping; - $p = Net::Ping->new(); + my $p = Net::Ping->new(); print "$host is alive.\n" if $p->ping($host); $p->close(); - $p = Net::Ping->new("icmp"); + my $p = Net::Ping->new("icmp"); $p->bind($my_addr); # Specify source interface of pings - foreach $host (@host_array) + foreach my $host (@host_array) { print "$host is "; print "NOT " unless $p->ping($host, 2); @@ -2019,11 +2018,11 @@ Net::Ping - check a remote host for reac } $p->close(); - $p = Net::Ping->new("icmpv6"); - $ip = "[fd00:dead:beef::4e]"; + my $p = Net::Ping->new("icmpv6"); + my $ip = "[fd00:dead:beef::4e]"; print "$ip is alive.\n" if $p->ping($ip); - $p = Net::Ping->new("tcp", 2); + my $p = Net::Ping->new("tcp", 2); # Try connecting to the www port instead of the echo port $p->port_number(scalar(getservbyname("http", "tcp"))); while ($stop_time > time()) @@ -2035,19 +2034,19 @@ Net::Ping - check a remote host for reac undef($p); # Like tcp protocol, but with many hosts - $p = Net::Ping->new("syn"); + my $p = Net::Ping->new("syn"); $p->port_number(getservbyname("http", "tcp")); - foreach $host (@host_array) { + foreach my $host (@host_array) { $p->ping($host); } - while (($host,$rtt,$ip) = $p->ack) { + while (my ($host, $rtt, $ip) = $p->ack) { print "HOST: $host [$ip] ACKed in $rtt seconds.\n"; } # High precision syntax (requires Time::HiRes) - $p = Net::Ping->new(); + my $p = Net::Ping->new(); $p->hires(); - ($ret, $duration, $ip) = $p->ping($host, 5.5); + my ($ret, $duration, $ip) = $p->ping($host, 5.5); printf("$host [ip: $ip] is alive (packet return time: %.2f ms)\n", 1000 * $duration) if $ret; Index: gnu/usr.bin/perl/dist/Net-Ping/t/010_pingecho.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/t/010_pingecho.t,v diff -u -p -a -u -p -r1.1.1.2 010_pingecho.t --- gnu/usr.bin/perl/dist/Net-Ping/t/010_pingecho.t 1 Mar 2021 23:15:49 -0000 1.1.1.2 +++ gnu/usr.bin/perl/dist/Net-Ping/t/010_pingecho.t 21 Feb 2024 15:47:01 -0000 @@ -19,7 +19,6 @@ BEGIN {use_ok('Net::Ping')}; TODO: { local $TODO = "Not working on os390 smoker; may be a permissions problem" if $^O eq 'os390'; - $TODO = "Not working on freebsd" if $^O eq 'freebsd'; my $result = pingecho("127.0.0.1"); is($result, 1, "pingecho 127.0.0.1 works"); } Index: gnu/usr.bin/perl/dist/Net-Ping/t/190_alarm.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/t/190_alarm.t,v diff -u -p -a -u -p -r1.1.1.3 190_alarm.t --- gnu/usr.bin/perl/dist/Net-Ping/t/190_alarm.t 30 Dec 2019 02:10:47 -0000 1.1.1.3 +++ gnu/usr.bin/perl/dist/Net-Ping/t/190_alarm.t 21 Feb 2024 15:47:01 -0000 @@ -4,11 +4,10 @@ # Based on code written by radu@netsoft.ro (Radu Greab). BEGIN { - if ($ENV{PERL_CORE}) { - unless ($ENV{PERL_TEST_Net_Ping}) { - print "1..0 \# Skip: network dependent test\n"; - exit; - } + if ($ENV{NO_NETWORK_TESTING} || + ($ENV{PERL_CORE}) && !$ENV{PERL_TEST_Net_Ping}) { + print "1..0 \# Skip: network dependent test\n"; + exit; } unless (eval "require Socket") { print "1..0 \# Skip: no Socket\n"; @@ -29,7 +28,7 @@ use Test::More tests => 6; BEGIN {use_ok 'Net::Ping'}; # Hopefully this is never a routeable host -my $fail_ip = $ENV{NET_PING_FAIL_IP} || "172.29.249.249"; +my $fail_ip = $ENV{NET_PING_FAIL_IP} || "192.0.2.0"; eval { my $timeout = 11; Index: gnu/usr.bin/perl/dist/Net-Ping/t/200_ping_tcp.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/t/200_ping_tcp.t,v diff -u -p -a -u -p -r1.1.1.6 200_ping_tcp.t --- gnu/usr.bin/perl/dist/Net-Ping/t/200_ping_tcp.t 15 Feb 2023 01:32:56 -0000 1.1.1.6 +++ gnu/usr.bin/perl/dist/Net-Ping/t/200_ping_tcp.t 21 Feb 2024 15:47:01 -0000 @@ -1,11 +1,10 @@ use strict; BEGIN { - if ($ENV{PERL_CORE}) { - unless ($ENV{PERL_TEST_Net_Ping}) { - print "1..0 # Skip: network dependent test\n"; - exit; - } + if ($ENV{NO_NETWORK_TESTING} || + ($ENV{PERL_CORE}) && !$ENV{PERL_TEST_Net_Ping}) { + print "1..0 # Skip: network dependent test\n"; + exit; } unless (eval "require Socket") { print "1..0 \# Skip: no Socket\n"; @@ -18,7 +17,7 @@ BEGIN { } # Hopefully this is never a routeable host -my $fail_ip = $ENV{NET_PING_FAIL_IP} || "172.29.249.249"; +my $fail_ip = $ENV{NET_PING_FAIL_IP} || "192.0.2.0"; # Remote network test using tcp protocol. # Index: gnu/usr.bin/perl/dist/Net-Ping/t/250_ping_hires.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/t/250_ping_hires.t,v diff -u -p -a -u -p -r1.1.1.4 250_ping_hires.t --- gnu/usr.bin/perl/dist/Net-Ping/t/250_ping_hires.t 1 Mar 2021 23:15:49 -0000 1.1.1.4 +++ gnu/usr.bin/perl/dist/Net-Ping/t/250_ping_hires.t 21 Feb 2024 15:47:01 -0000 @@ -3,12 +3,11 @@ use strict; BEGIN { - if ($ENV{PERL_CORE}) { - unless ($ENV{PERL_TEST_Net_Ping}) { - print "1..0 # Skip: network dependent test\n"; - exit; - } - } + if ($ENV{NO_NETWORK_TESTING} || + ($ENV{PERL_CORE}) && !$ENV{PERL_TEST_Net_Ping}) { + print "1..0 \# Skip: network dependent test\n"; + exit; + } unless (eval "require Socket") { print "1..0 \# Skip: no Socket\n"; exit; Index: gnu/usr.bin/perl/dist/Net-Ping/t/300_ping_stream.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/t/300_ping_stream.t,v diff -u -p -a -u -p -r1.1.1.4 300_ping_stream.t --- gnu/usr.bin/perl/dist/Net-Ping/t/300_ping_stream.t 1 Mar 2021 23:15:49 -0000 1.1.1.4 +++ gnu/usr.bin/perl/dist/Net-Ping/t/300_ping_stream.t 21 Feb 2024 15:47:01 -0000 @@ -1,11 +1,10 @@ use strict; BEGIN { - if ($ENV{PERL_CORE}) { - unless ($ENV{PERL_TEST_Net_Ping}) { - print "1..0 # Skip: network dependent test\n"; - exit; - } - } + if ($ENV{NO_NETWORK_TESTING} || + ($ENV{PERL_CORE}) && !$ENV{PERL_TEST_Net_Ping}) { + print "1..0 \# Skip: network dependent test\n"; + exit; + } if ($^O eq 'freebsd') { print "1..0 \# Skip: unreliable localhost resolver on $^O\n"; exit; Index: gnu/usr.bin/perl/dist/Net-Ping/t/400_ping_syn.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/t/400_ping_syn.t,v diff -u -p -a -u -p -r1.1.1.5 400_ping_syn.t --- gnu/usr.bin/perl/dist/Net-Ping/t/400_ping_syn.t 30 Dec 2019 02:10:47 -0000 1.1.1.5 +++ gnu/usr.bin/perl/dist/Net-Ping/t/400_ping_syn.t 21 Feb 2024 15:47:01 -0000 @@ -1,11 +1,10 @@ use strict; BEGIN { - if ($ENV{PERL_CORE}) { - unless ($ENV{PERL_TEST_Net_Ping}) { - print "1..0 # Skip: network dependent test\n"; - exit; - } + if ($ENV{NO_NETWORK_TESTING} || + ($ENV{PERL_CORE} && !$ENV{PERL_TEST_Net_Ping})) { + print "1..0 # Skip: network dependent test\n"; + exit; } unless (eval "require Socket") { print "1..0 \# Skip: no Socket\n"; @@ -30,10 +29,10 @@ BEGIN { # connection to remote networks, but you still want the tests # to pass, use the following: # -# $ PERL_CORE=1 make test +# $ NO_NETWORK_TESTING=1 make test # Hopefully this is never a routeable host -my $fail_ip = $ENV{NET_PING_FAIL_IP} || "172.29.249.249"; +my $fail_ip = $ENV{NET_PING_FAIL_IP} || "192.0.2.0"; # Try a few remote servers my %webs = ( Index: gnu/usr.bin/perl/dist/Net-Ping/t/410_syn_host.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/t/410_syn_host.t,v diff -u -p -a -u -p -r1.1.1.5 410_syn_host.t --- gnu/usr.bin/perl/dist/Net-Ping/t/410_syn_host.t 30 Dec 2019 02:10:47 -0000 1.1.1.5 +++ gnu/usr.bin/perl/dist/Net-Ping/t/410_syn_host.t 21 Feb 2024 15:47:01 -0000 @@ -2,11 +2,10 @@ use strict; BEGIN { - if ($ENV{PERL_CORE}) { - unless ($ENV{PERL_TEST_Net_Ping}) { - print "1..0 # Skip: network dependent test\n"; - exit; - } + if ($ENV{NO_NETWORK_TESTING} || + ($ENV{PERL_CORE} && !$ENV{PERL_TEST_Net_Ping})) { + print "1..0 # Skip: network dependent test\n"; + exit; } unless (eval "require Socket") { print "1..0 \# Skip: no Socket\n"; @@ -31,13 +30,13 @@ BEGIN { # connection to remote networks, but you still want the tests # to pass, use the following: # -# $ PERL_CORE=1 make test +# $ NO_NETWORK_TESTING=1 make test # Try a few remote servers my %webs; BEGIN { # Hopefully this is never a routeable host - my $fail_ip = $ENV{NET_PING_FAIL_IP} || "172.29.249.249"; + my $fail_ip = $ENV{NET_PING_FAIL_IP} || "192.0.2.0"; %webs = ( $fail_ip => 0, Index: gnu/usr.bin/perl/dist/Net-Ping/t/420_ping_syn_port.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/t/420_ping_syn_port.t,v diff -u -p -a -u -p -r1.1.1.1 420_ping_syn_port.t --- gnu/usr.bin/perl/dist/Net-Ping/t/420_ping_syn_port.t 30 Dec 2019 02:10:47 -0000 1.1.1.1 +++ gnu/usr.bin/perl/dist/Net-Ping/t/420_ping_syn_port.t 21 Feb 2024 15:47:01 -0000 @@ -2,11 +2,10 @@ use strict; BEGIN { - if ($ENV{PERL_CORE}) { - unless ($ENV{PERL_TEST_Net_Ping}) { - print "1..0 # Skip: network dependent test\n"; - exit; - } + if ($ENV{NO_NETWORK_TESTING} || + ($ENV{PERL_CORE} && !$ENV{PERL_TEST_Net_Ping})) { + print "1..0 # Skip: network dependent test\n"; + exit; } unless (eval "require Socket") { print "1..0 \# Skip: no Socket\n"; @@ -31,10 +30,10 @@ BEGIN { # connection to remote networks, but you still want the tests # to pass, use the following: # -# $ PERL_CORE=1 make test +# $ NO_NETWORK_TESTING=1 make test # Hopefully this is never a routeable host -my $fail_ip = $ENV{NET_PING_FAIL_IP} || "172.29.249.249"; +my $fail_ip = $ENV{NET_PING_FAIL_IP} || "192.0.2.0"; # Try a few remote servers my %webs; Index: gnu/usr.bin/perl/dist/Net-Ping/t/450_service.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Net-Ping/t/450_service.t,v diff -u -p -a -u -p -r1.4 450_service.t --- gnu/usr.bin/perl/dist/Net-Ping/t/450_service.t 15 Feb 2023 01:36:28 -0000 1.4 +++ gnu/usr.bin/perl/dist/Net-Ping/t/450_service.t 21 Feb 2024 15:47:01 -0000 @@ -78,7 +78,7 @@ is($p->ping("127.0.0.1"), 1, 'first port $p->{port_num} = $port2; { - local $TODO = "Believed not to work on $^O" if $^O =~ /^(?:hpux|MSWin32|os390|freebsd)$/; + local $TODO = "Believed not to work on $^O" if $^O =~ /^(?:MSWin32|os390)$/; is($p->ping("127.0.0.1"), 1, 'second port is reachable'); } @@ -133,7 +133,7 @@ SKIP: { { local $TODO = "Believed not to work on $^O" - if $^O =~ /^(?:hpux|MSWin32|os390|freebsd)$/; + if $^O =~ /^(?:MSWin32|os390)$/; is($p->ack(), '127.0.0.1', 'IP should be reachable'); } } Index: gnu/usr.bin/perl/dist/PathTools/Changes =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/Changes,v diff -u -p -a -u -p -r1.4 Changes --- gnu/usr.bin/perl/dist/PathTools/Changes 15 Feb 2023 01:36:28 -0000 1.4 +++ gnu/usr.bin/perl/dist/PathTools/Changes 21 Feb 2024 15:47:01 -0000 @@ -1,5 +1,29 @@ Revision history for Perl distribution PathTools. +3.87-3.88 + +- Fix handling of empty path, VMS fixes. + +3.86 + +- Fix compilation warning on illumos based platforms + +3.85 + +- Fix issue related to tainting empty PATH + +3.84 + +- Add PerlIO_readlink backcompat defines to Cws.xs + +3.83 + +- More bugtracker changes, document maintainer is the Perl-5 Porters + +3.82 + +- Change to build so bugreports go to GitHub + 3.81 - compare inode numbers as strings (github #18788) Index: gnu/usr.bin/perl/dist/PathTools/Cwd.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/Cwd.pm,v diff -u -p -a -u -p -r1.7 Cwd.pm --- gnu/usr.bin/perl/dist/PathTools/Cwd.pm 15 Feb 2023 01:36:28 -0000 1.7 +++ gnu/usr.bin/perl/dist/PathTools/Cwd.pm 21 Feb 2024 15:47:01 -0000 @@ -3,7 +3,7 @@ use strict; use Exporter; -our $VERSION = '3.84'; +our $VERSION = '3.89'; my $xs_version = $VERSION; $VERSION =~ tr/_//d; @@ -192,8 +192,14 @@ sub _backtick_pwd { # Localize %ENV entries in a way that won't create new hash keys. # Under AmigaOS we don't want to localize as it stops perl from # finding 'sh' in the PATH. - my @localize = grep exists $ENV{$_}, qw(PATH IFS CDPATH ENV BASH_ENV) if $^O ne "amigaos"; + my @localize = grep exists $ENV{$_}, qw(IFS CDPATH ENV BASH_ENV) if $^O ne "amigaos"; local @ENV{@localize} if @localize; + # empty PATH is the same as "." on *nix, so localize it to /something/ + # we won't *use* the path as code above turns $pwd_cmd into a specific + # executable, but it will blow up anyway under taint. We could set it to + # anything absolute. Perhaps "/" would be better. + local $ENV{PATH}= "/usr/bin" + if $^O ne "amigaos"; my $cwd = `$pwd_cmd`; # Belt-and-suspenders in case someone said "undef $/". Index: gnu/usr.bin/perl/dist/PathTools/Cwd.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/Cwd.xs,v diff -u -p -a -u -p -r1.6 Cwd.xs --- gnu/usr.bin/perl/dist/PathTools/Cwd.xs 15 Feb 2023 01:36:28 -0000 1.6 +++ gnu/usr.bin/perl/dist/PathTools/Cwd.xs 21 Feb 2024 15:47:02 -0000 @@ -7,13 +7,11 @@ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" -#ifndef NO_PPPORT_H -# define NEED_croak_xs_usage -# define NEED_sv_2pv_flags -# define NEED_my_strlcpy -# define NEED_my_strlcat -# include "ppport.h" -#endif +#define NEED_croak_xs_usage +#define NEED_sv_2pv_flags +#define NEED_my_strlcpy +#define NEED_my_strlcat +#include "ppport.h" #if defined(HAS_READLINK) && !defined(PerlLIO_readlink) #define PerlLIO_readlink readlink @@ -24,8 +22,10 @@ #endif /* For special handling of os390 sysplexed systems */ +#ifdef OS390 #define SYSNAME "$SYSNAME" #define SYSNAME_LEN (sizeof(SYSNAME) - 1) +#endif /* The realpath() implementation from OpenBSD 3.9 to 4.2 (realpath.c 1.13) * Renamed here to bsd_realpath() to avoid library conflicts. @@ -202,7 +202,7 @@ bsd_realpath(const char *path, char reso if (slen < 0) return (NULL); symlink[slen] = '\0'; -# ifdef EBCDIC /* XXX Probably this should be only os390 */ +# ifdef OS390 /* Replace all instances of $SYSNAME/foo simply by /foo */ if (slen > SYSNAME_LEN + strlen(next_token) && strnEQ(symlink, SYSNAME, SYSNAME_LEN) @@ -245,7 +245,7 @@ bsd_realpath(const char *path, char reso } remaining_len = my_strlcpy(remaining, symlink, sizeof(remaining)); } -# ifdef EBCDIC +# ifdef OS390 not_symlink: ; # endif } Index: gnu/usr.bin/perl/dist/PathTools/META.json =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/META.json,v diff -u -p -a -u -p -r1.1.1.1 META.json --- gnu/usr.bin/perl/dist/PathTools/META.json 13 Feb 2019 21:11:27 -0000 1.1.1.1 +++ gnu/usr.bin/perl/dist/PathTools/META.json 21 Feb 2024 15:47:01 -0000 @@ -50,6 +50,6 @@ "url" : "git://perl5.git.perl.org/perl.git" } }, - "version" : "3.73", + "version" : "3.86", "x_serialization_backend" : "JSON::PP version 2.27400_02" } Index: gnu/usr.bin/perl/dist/PathTools/META.yml =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/META.yml,v diff -u -p -a -u -p -r1.1.1.1 META.yml --- gnu/usr.bin/perl/dist/PathTools/META.yml 13 Feb 2019 21:11:27 -0000 1.1.1.1 +++ gnu/usr.bin/perl/dist/PathTools/META.yml 21 Feb 2024 15:47:01 -0000 @@ -26,5 +26,5 @@ resources: bugtracker: https://rt.perl.org/rt3/ homepage: http://dev.perl.org/ repository: git://perl5.git.perl.org/perl.git -version: '3.73' +version: '3.86' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' Index: gnu/usr.bin/perl/dist/PathTools/Makefile.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/Makefile.PL,v diff -u -p -a -u -p -r1.4 Makefile.PL --- gnu/usr.bin/perl/dist/PathTools/Makefile.PL 15 Feb 2023 01:36:28 -0000 1.4 +++ gnu/usr.bin/perl/dist/PathTools/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -29,10 +29,7 @@ WriteMakefile 'VERSION_FROM' => 'Cwd.pm', 'ABSTRACT' => 'Tools for working with directory and file names', 'AUTHOR' => 'Perl 5 Porters', - 'DEFINE' => join(" ", - "-DDOUBLE_SLASHES_SPECIAL=@{[$^O eq q(qnx) || $^O eq q(nto) ? 1 : 0]}", - ((grep { $_ eq 'PERL_CORE=1' } @ARGV) ? '-DNO_PPPORT_H' : ()), - ), + 'DEFINE' => "-DDOUBLE_SLASHES_SPECIAL=@{[$^O eq q(qnx) || $^O eq q(nto) ? 1 : 0]}", 'PREREQ_PM' => { 'Carp' => '0', 'File::Basename' => '0', Index: gnu/usr.bin/perl/dist/PathTools/lib/File/Spec.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec.pm,v diff -u -p -a -u -p -r1.7 Spec.pm --- gnu/usr.bin/perl/dist/PathTools/lib/File/Spec.pm 15 Feb 2023 01:36:29 -0000 1.7 +++ gnu/usr.bin/perl/dist/PathTools/lib/File/Spec.pm 21 Feb 2024 15:47:02 -0000 @@ -2,7 +2,7 @@ package File::Spec; use strict; -our $VERSION = '3.84'; +our $VERSION = '3.88'; $VERSION =~ tr/_//d; my %module = ( @@ -33,13 +33,13 @@ File::Spec - portably perform operations use File::Spec; - $x=File::Spec->catfile('a', 'b', 'c'); + my $x = File::Spec->catfile('a', 'b', 'c'); which returns 'a/b/c' under Unix. Or: use File::Spec::Functions; - $x = catfile('a', 'b', 'c'); + my $x = catfile('a', 'b', 'c'); =head1 DESCRIPTION Index: gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/AmigaOS.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/AmigaOS.pm,v diff -u -p -a -u -p -r1.4 AmigaOS.pm --- gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/AmigaOS.pm 15 Feb 2023 01:36:29 -0000 1.4 +++ gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/AmigaOS.pm 21 Feb 2024 15:47:02 -0000 @@ -3,7 +3,7 @@ package File::Spec::AmigaOS; use strict; require File::Spec::Unix; -our $VERSION = '3.84'; +our $VERSION = '3.88'; $VERSION =~ tr/_//d; our @ISA = qw(File::Spec::Unix); Index: gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Cygwin.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Cygwin.pm,v diff -u -p -a -u -p -r1.7 Cygwin.pm --- gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Cygwin.pm 15 Feb 2023 01:36:29 -0000 1.7 +++ gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Cygwin.pm 21 Feb 2024 15:47:02 -0000 @@ -3,7 +3,7 @@ package File::Spec::Cygwin; use strict; require File::Spec::Unix; -our $VERSION = '3.84'; +our $VERSION = '3.88'; $VERSION =~ tr/_//d; our @ISA = qw(File::Spec::Unix); Index: gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Epoc.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Epoc.pm,v diff -u -p -a -u -p -r1.7 Epoc.pm --- gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Epoc.pm 15 Feb 2023 01:36:29 -0000 1.7 +++ gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Epoc.pm 21 Feb 2024 15:47:02 -0000 @@ -2,7 +2,7 @@ package File::Spec::Epoc; use strict; -our $VERSION = '3.84'; +our $VERSION = '3.88'; $VERSION =~ tr/_//d; require File::Spec::Unix; Index: gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Functions.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Functions.pm,v diff -u -p -a -u -p -r1.7 Functions.pm --- gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Functions.pm 15 Feb 2023 01:36:29 -0000 1.7 +++ gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Functions.pm 21 Feb 2024 15:47:02 -0000 @@ -3,7 +3,7 @@ package File::Spec::Functions; use File::Spec; use strict; -our $VERSION = '3.84'; +our $VERSION = '3.88'; $VERSION =~ tr/_//d; require Exporter; Index: gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Mac.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Mac.pm,v diff -u -p -a -u -p -r1.7 Mac.pm --- gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Mac.pm 15 Feb 2023 01:36:29 -0000 1.7 +++ gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Mac.pm 21 Feb 2024 15:47:02 -0000 @@ -4,7 +4,7 @@ use strict; use Cwd (); require File::Spec::Unix; -our $VERSION = '3.84'; +our $VERSION = '3.88'; $VERSION =~ tr/_//d; our @ISA = qw(File::Spec::Unix); Index: gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/OS2.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/OS2.pm,v diff -u -p -a -u -p -r1.7 OS2.pm --- gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/OS2.pm 15 Feb 2023 01:36:29 -0000 1.7 +++ gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/OS2.pm 21 Feb 2024 15:47:02 -0000 @@ -4,7 +4,7 @@ use strict; use Cwd (); require File::Spec::Unix; -our $VERSION = '3.84'; +our $VERSION = '3.88'; $VERSION =~ tr/_//d; our @ISA = qw(File::Spec::Unix); Index: gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Unix.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Unix.pm,v diff -u -p -a -u -p -r1.7 Unix.pm --- gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Unix.pm 15 Feb 2023 01:36:29 -0000 1.7 +++ gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Unix.pm 21 Feb 2024 15:47:02 -0000 @@ -3,7 +3,7 @@ package File::Spec::Unix; use strict; use Cwd (); -our $VERSION = '3.84'; +our $VERSION = '3.88'; $VERSION =~ tr/_//d; =head1 NAME Index: gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/VMS.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/VMS.pm,v diff -u -p -a -u -p -r1.7 VMS.pm --- gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/VMS.pm 15 Feb 2023 01:36:29 -0000 1.7 +++ gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/VMS.pm 21 Feb 2024 15:47:02 -0000 @@ -4,7 +4,7 @@ use strict; use Cwd (); require File::Spec::Unix; -our $VERSION = '3.84'; +our $VERSION = '3.88'; $VERSION =~ tr/_//d; our @ISA = qw(File::Spec::Unix); Index: gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Win32.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Win32.pm,v diff -u -p -a -u -p -r1.8 Win32.pm --- gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Win32.pm 15 Feb 2023 01:36:29 -0000 1.8 +++ gnu/usr.bin/perl/dist/PathTools/lib/File/Spec/Win32.pm 21 Feb 2024 15:47:02 -0000 @@ -5,7 +5,7 @@ use strict; use Cwd (); require File::Spec::Unix; -our $VERSION = '3.84'; +our $VERSION = '3.88'; $VERSION =~ tr/_//d; our @ISA = qw(File::Spec::Unix); Index: gnu/usr.bin/perl/dist/PathTools/t/cwd_enoent.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/t/cwd_enoent.t,v diff -u -p -a -u -p -r1.1.1.3 cwd_enoent.t --- gnu/usr.bin/perl/dist/PathTools/t/cwd_enoent.t 15 Feb 2023 01:32:57 -0000 1.1.1.3 +++ gnu/usr.bin/perl/dist/PathTools/t/cwd_enoent.t 21 Feb 2024 15:47:02 -0000 @@ -28,8 +28,10 @@ foreach my $type (qw(regular perl)) { # https://github.com/Perl/perl5/issues/16525 # https://bugs.dragonflybsd.org/issues/3250 + my @vlist = ($Config{osvers} =~ /(\d+)/g); + my $osver = sprintf("%d%03d", map { defined() ? $_ : '0' } @vlist[0,1]); skip "getcwd() doesn't fail on non-existent directories on this platform", 4 - if $type eq 'regular' && $^O eq 'dragonfly'; + if $type eq 'regular' && $^O eq 'dragonfly' && $osver < 6002; skip "getcwd() doesn't fail on non-existent directories on this platform", 4 if $type eq 'regular' && $^O eq 'haiku'; Index: gnu/usr.bin/perl/dist/PathTools/t/tmpdir.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/PathTools/t/tmpdir.t,v diff -u -p -a -u -p -r1.1.1.1 tmpdir.t --- gnu/usr.bin/perl/dist/PathTools/t/tmpdir.t 17 Nov 2014 20:53:04 -0000 1.1.1.1 +++ gnu/usr.bin/perl/dist/PathTools/t/tmpdir.t 21 Feb 2024 15:47:02 -0000 @@ -43,7 +43,7 @@ for ('File::Spec', "File::Spec::Win32") -d $ENV{TMPDIR} && -w _ or skip "Can't create usable TMPDIR env var", 1; my $tmpdir2 = $_->tmpdir; - isn't $tmpdir2, $tmpdir1, "$_->tmpdir works with changing env"; + isnt $tmpdir2, $tmpdir1, "$_->tmpdir works with changing env"; } } Index: gnu/usr.bin/perl/dist/Safe/Safe.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Safe/Safe.pm,v diff -u -p -a -u -p -r1.5 Safe.pm --- gnu/usr.bin/perl/dist/Safe/Safe.pm 15 Feb 2023 01:36:29 -0000 1.5 +++ gnu/usr.bin/perl/dist/Safe/Safe.pm 21 Feb 2024 15:47:01 -0000 @@ -3,7 +3,7 @@ package Safe; use 5.003_11; use Scalar::Util qw(reftype refaddr); -$Safe::VERSION = "2.43"; +$Safe::VERSION = "2.44"; # *** Don't declare any lexicals above this point *** # Index: gnu/usr.bin/perl/dist/Safe/t/safeload.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Safe/t/safeload.t,v diff -u -p -a -u -p -r1.1.1.3 safeload.t --- gnu/usr.bin/perl/dist/Safe/t/safeload.t 24 Mar 2014 14:59:00 -0000 1.1.1.3 +++ gnu/usr.bin/perl/dist/Safe/t/safeload.t 21 Feb 2024 15:47:01 -0000 @@ -21,7 +21,7 @@ use Safe; plan(tests => 3); my $c = new Safe; -$c->permit(qw(require caller entereval unpack)); +$c->permit(qw(require caller entereval unpack rand)); my $r = $c->reval(q{ use version; 1 }); ok( defined $r, "Can load version.pm in a Safe compartment" ) or diag $@; Index: gnu/usr.bin/perl/dist/Safe/t/safeops.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Safe/t/safeops.t,v diff -u -p -a -u -p -r1.3 safeops.t --- gnu/usr.bin/perl/dist/Safe/t/safeops.t 13 Feb 2019 21:15:21 -0000 1.3 +++ gnu/usr.bin/perl/dist/Safe/t/safeops.t 21 Feb 2024 15:47:01 -0000 @@ -453,7 +453,7 @@ dor $x // $y dorassign $x //= $y once SKIP {use feature 'state'; state $foo = 42;} say SKIP {use feature 'say'; say "foo";} -smartmatch no warnings 'experimental::smartmatch'; $x ~~ $y +smartmatch no warnings 'deprecated'; $x ~~ $y aeach SKIP each @t akeys SKIP keys @t avalues SKIP values @t Index: gnu/usr.bin/perl/dist/SelfLoader/Changes =================================================================== RCS file: gnu/usr.bin/perl/dist/SelfLoader/Changes diff -N gnu/usr.bin/perl/dist/SelfLoader/Changes --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/SelfLoader/Changes 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,43 @@ +Revision history for Perl extension SelfLoader + +1.24 Thu Aug 3 18:00 2017 + - Fix minor POD issues. + +1.20 Mon Dec 19 20:03 2011 + - Update FSF address also in separate license file, duh. + +1.19 Mon Dec 19 20:00 2011 + - Update FSF address. + +1.18 Sat Nov 20 01:30 2010 + - port commit a3a44df66ac2cb0beb603b3dd9697fd81cfcfb30 + from core: + [perl #72062] Untaint DATA after it's reopened + DATA handle is untainted on startup, but as we close and reopen it it + gets the taint flag. It's safe to untaint it though, since we still hold + the file descriptor open and don't reassign it to another file. + + This was probably broken by changeset 29606, (c96b2385 in perl git). + +1.17 Thu Oct 23 20:12 2008 + - Tiny fix in error messages: Use $! instead of $1. + +1.16 Sat Aug 2 17:29 2008 + - Report the location of warnings and errors. (perl ticket #5298, + Marc Gauthier) + +1.15 Thu Jan 17 17:43 2008 + - Fix non-critical warning in the test suite. (Jerry D. Hedden) + +1.14 Wed Jan 16 16:26 2008 + - No failures reported, promote to stable version. + +1.13_03 Fri Dec 28 11:28 2007 + - Doc patch. This is SelfLoader, not AutoLoader. + +1.13_02 Wed Dec 26 16:03 2007 + - Fixed the README. + +1.13_01 Wed Dec 26 12:38 2007 + - Initial dual-lived CPAN release + Index: gnu/usr.bin/perl/dist/SelfLoader/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/SelfLoader/Makefile.PL diff -N gnu/usr.bin/perl/dist/SelfLoader/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/SelfLoader/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,19 @@ +## This -*- perl -*- script writes the Makefile for SelfLoader +# You should read "perldoc perlmodinstall" for instructions on +# how to install modules like this. + +require 5.008; +use strict; +use ExtUtils::MakeMaker; +WriteMakefile( + 'NAME' => 'SelfLoader', + 'VERSION_FROM' => 'lib/SelfLoader.pm', # finds $VERSION + 'LICENSE' => 'perl_5', + 'PREREQ_PM' => {}, + 'ABSTRACT_FROM' => 'lib/SelfLoader.pm', + 'AUTHOR' => 'Steffen Mueller ', + 'INSTALLDIRS' => ( $] < 5.011 ? 'perl' : 'site' ), +); + +__END__ + Index: gnu/usr.bin/perl/dist/SelfLoader/t/03taint.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/SelfLoader/t/03taint.t,v diff -u -p -a -u -p -r1.1.1.1 03taint.t --- gnu/usr.bin/perl/dist/SelfLoader/t/03taint.t 25 Mar 2013 20:08:39 -0000 1.1.1.1 +++ gnu/usr.bin/perl/dist/SelfLoader/t/03taint.t 21 Feb 2024 15:47:01 -0000 @@ -2,6 +2,6 @@ # This runs 01SelfLoader.t under taint. -my $file = __FILE__ =~ s/[\w.]+\z/01SelfLoader.t/r; +(my $file = __FILE__) =~ s/[\w.]+\z/01SelfLoader.t/; unshift @INC, "."; do $file or die "Cannot run $file: ", $@||$!; Index: gnu/usr.bin/perl/dist/Storable/ChangeLog =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Storable/ChangeLog,v diff -u -p -a -u -p -r1.6 ChangeLog --- gnu/usr.bin/perl/dist/Storable/ChangeLog 15 Feb 2023 01:36:29 -0000 1.6 +++ gnu/usr.bin/perl/dist/Storable/ChangeLog 21 Feb 2024 15:47:01 -0000 @@ -1,3 +1,32 @@ +2023-05-26 21:36:00 demerphq + version 3.32 + * Update security advisory to be more clear + +2023-02-26 00:31:32 demerphq + version 3.31 + * Fixup for ppport fix in 3.30 + +2023-02-22 09:56:27 leont + version 3.30 + * Use ppport for all modules in dist. + +2023-01-04 17:33:24 iabyn + version 3.29 + * Store code fixes identified from refcounted stack patch + +2022-11-08 10:12:46 tony + version 3.28 + * Store hook error reporting improvements + * Store hook handles regex objects properly. + +2022-06-20 20:32:29 toddr + version 3.27 + * Use cBOOL instead of !! in xs code + +2022-04-18 17:36:00 toddr + version 3.26 + * Conform to ppport.h 3.68 recommendations + 2021-08-30 07:46:52 nwclark version 3.25 * No changes from previous version Index: gnu/usr.bin/perl/dist/Storable/Storable.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Storable/Storable.pm,v diff -u -p -a -u -p -r1.6 Storable.pm --- gnu/usr.bin/perl/dist/Storable/Storable.pm 15 Feb 2023 01:36:29 -0000 1.6 +++ gnu/usr.bin/perl/dist/Storable/Storable.pm 21 Feb 2024 15:47:01 -0000 @@ -28,7 +28,7 @@ our @EXPORT_OK = qw( our ($canonical, $forgive_me); BEGIN { - our $VERSION = '3.26'; + our $VERSION = '3.32'; } our $recursion_limit; @@ -1197,11 +1197,16 @@ compartment: =head1 SECURITY WARNING -B +B There is +B way to configure Storable so that it can be used safely to process +untrusted data. While there I various options that can be used to +mitigate specific security issues these options do I comprise a +complete safety net for the user, and processing untrusted data may +result in segmentation faults, remote code execution, or privilege +escalation. The following lists some known features which represent +security issues that should be considered by users of this module. -Some features of Storable can lead to security vulnerabilities if you -accept Storable documents from untrusted sources with the default -flags. Most obviously, the optional (off by default) CODE reference +Most obviously, the optional (off by default) CODE reference serialization feature allows transfer of code to the deserializing process. Furthermore, any serialized object will cause Storable to helpfully load the module corresponding to the class of the object in @@ -1224,12 +1229,15 @@ With the default setting of C<$Storable: random objects, even renamed objects can be controlled by an attacker. See CVE-2015-1592 and its metasploit module. -If your application requires accepting data from untrusted sources, -you are best off with a less powerful and more-likely safe -serialization format and implementation. If your data is sufficiently -simple, L, L or L are the best -choices and offer maximum interoperability, but note that Sereal is -L. +If your application requires accepting data from untrusted sources, you +are best off with a less powerful and more-likely safe serialization +format and implementation. If your data is sufficiently simple, +L or L are fine alternatives. For +more complex data structures containing various Perl specific data types +like regular expressions or aliased data L is the best +alternative and offers maximum interoperability. Note that Sereal is +L, but you can configure +the encoder and decoder to mitigate any security issues. =head1 WARNING Index: gnu/usr.bin/perl/dist/Storable/Storable.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Storable/Storable.xs,v diff -u -p -a -u -p -r1.7 Storable.xs --- gnu/usr.bin/perl/dist/Storable/Storable.xs 15 Feb 2023 01:36:29 -0000 1.7 +++ gnu/usr.bin/perl/dist/Storable/Storable.xs 21 Feb 2024 15:47:01 -0000 @@ -16,18 +16,13 @@ #include #include -#ifndef PERL_VERSION_LT -# if !defined(PERL_VERSION) || !defined(PERL_REVISION) || ( PERL_REVISION == 5 && ( PERL_VERSION < 10 || (PERL_VERSION == 10 && PERL_SUBVERSION < 1) ) ) -# define NEED_PL_parser -# define NEED_sv_2pv_flags -# define NEED_load_module -# define NEED_vload_module -# define NEED_newCONSTSUB -# define NEED_newSVpvn_flags -# define NEED_newRV_noinc -# endif +#define NEED_sv_2pv_flags +#define NEED_load_module +#define NEED_vload_module +#define NEED_newCONSTSUB +#define NEED_newSVpvn_flags +#define NEED_newRV_noinc #include "ppport.h" /* handle old perls */ -#endif #ifdef DEBUGGING #define DEBUGME /* Debug mode, turns assertions on as well */ @@ -176,7 +171,9 @@ #define SX_SVUNDEF_ELEM C(31) /* array element set to &PL_sv_undef */ #define SX_REGEXP C(32) /* Regexp */ #define SX_LOBJECT C(33) /* Large object: string, array or hash (size >2G) */ -#define SX_LAST C(34) /* invalid. marker only */ +#define SX_BOOLEAN_TRUE C(34) /* Boolean true */ +#define SX_BOOLEAN_FALSE C(35) /* Boolean false */ +#define SX_LAST C(36) /* invalid. marker only */ /* * Those are only used to retrieve "old" pre-0.6 binary images. @@ -975,7 +972,7 @@ static const char byteorderstr_56[] = {B #endif #define STORABLE_BIN_MAJOR 2 /* Binary major "version" */ -#define STORABLE_BIN_MINOR 11 /* Binary minor "version" */ +#define STORABLE_BIN_MINOR 12 /* Binary minor "version" */ #if !defined (SvVOK) /* @@ -1454,6 +1451,8 @@ static const sv_retrieve_t sv_old_retrie (sv_retrieve_t)retrieve_other, /* SX_SVUNDEF_ELEM not supported */ (sv_retrieve_t)retrieve_other, /* SX_REGEXP */ (sv_retrieve_t)retrieve_other, /* SX_LOBJECT not supported */ + (sv_retrieve_t)retrieve_other, /* SX_BOOLEAN_TRUE not supported */ + (sv_retrieve_t)retrieve_other, /* SX_BOOLEAN_FALSE not supported */ (sv_retrieve_t)retrieve_other, /* SX_LAST */ }; @@ -1477,6 +1476,8 @@ static SV *retrieve_weakoverloaded(pTHX_ static SV *retrieve_vstring(pTHX_ stcxt_t *cxt, const char *cname); static SV *retrieve_lvstring(pTHX_ stcxt_t *cxt, const char *cname); static SV *retrieve_svundef_elem(pTHX_ stcxt_t *cxt, const char *cname); +static SV *retrieve_boolean_true(pTHX_ stcxt_t *cxt, const char *cname); +static SV *retrieve_boolean_false(pTHX_ stcxt_t *cxt, const char *cname); static const sv_retrieve_t sv_retrieve[] = { 0, /* SX_OBJECT -- entry unused dynamically */ @@ -1513,6 +1514,8 @@ static const sv_retrieve_t sv_retrieve[] (sv_retrieve_t)retrieve_svundef_elem,/* SX_SVUNDEF_ELEM */ (sv_retrieve_t)retrieve_regexp, /* SX_REGEXP */ (sv_retrieve_t)retrieve_lobject, /* SX_LOBJECT */ + (sv_retrieve_t)retrieve_boolean_true, /* SX_BOOLEAN_TRUE */ + (sv_retrieve_t)retrieve_boolean_false, /* SX_BOOLEAN_FALSE */ (sv_retrieve_t)retrieve_other, /* SX_LAST */ }; @@ -2454,6 +2457,16 @@ static int store_scalar(pTHX_ stcxt_t *c pv = SvPV(sv, len); /* We know it's SvPOK */ goto string; /* Share code below */ } +#ifdef SvIsBOOL + } else if (SvIsBOOL(sv)) { + TRACEME(("mortal boolean")); + if (SvTRUE_nomg_NN(sv)) { + PUTMARK(SX_BOOLEAN_TRUE); + } + else { + PUTMARK(SX_BOOLEAN_FALSE); + } +#endif } else if (flags & SVf_POK) { /* public string - go direct to string read. */ goto string_readlen; @@ -3250,6 +3263,7 @@ static int store_code(pTHX_ stcxt_t *cxt CROAK(("Unexpected return value from B::Deparse::coderef2text\n")); text = POPs; + PUTBACK; len = SvCUR(text); reallen = strlen(SvPV_nolen(text)); @@ -3567,7 +3581,10 @@ static int store_hook( int need_large_oids = 0; #endif - TRACEME(("store_hook, classname \"%s\", tagged #%d", HvNAME_get(pkg), (int)cxt->tagnum)); + classname = HvNAME_get(pkg); + len = strlen(classname); + + TRACEME(("store_hook, classname \"%s\", tagged #%d", classname, (int)cxt->tagnum)); /* * Determine object type on 2 bits. @@ -3576,6 +3593,7 @@ static int store_hook( switch (type) { case svis_REF: case svis_SCALAR: + case svis_REGEXP: obj_type = SHT_SCALAR; break; case svis_ARRAY: @@ -3615,13 +3633,20 @@ static int store_hook( } break; default: - CROAK(("Unexpected object type (%d) in store_hook()", type)); + { + /* pkg_can() always returns a ref to a CV on success */ + CV *cv = (CV*)SvRV(hook); + const GV * const gv = CvGV(cv); + const char *gvname = GvNAME(gv); + const HV * const stash = GvSTASH(gv); + const char *hvname = stash ? HvNAME(stash) : NULL; + + CROAK(("Unexpected object type (%s) of class '%s' in store_hook() calling %s::%s", + sv_reftype(sv, FALSE), classname, hvname, gvname)); + } } flags = SHF_NEED_RECURSE | obj_type; - classname = HvNAME_get(pkg); - len = strlen(classname); - /* * To call the hook, we need to fake a call like: * @@ -5883,6 +5908,50 @@ static SV *retrieve_integer(pTHX_ stcxt_ } /* + * retrieve_boolean_true + * + * Retrieve boolean true copy. + */ +static SV *retrieve_boolean_true(pTHX_ stcxt_t *cxt, const char *cname) +{ + SV *sv; + HV *stash; + + TRACEME(("retrieve_boolean_true (#%d)", (int)cxt->tagnum)); + + sv = newSVsv(&PL_sv_yes); + stash = cname ? gv_stashpv(cname, GV_ADD) : 0; + SEEN_NN(sv, stash, 0); /* Associate this new scalar with tag "tagnum" */ + + TRACEME(("boolean true")); + TRACEME(("ok (retrieve_boolean_true at 0x%" UVxf ")", PTR2UV(sv))); + + return sv; +} + +/* + * retrieve_boolean_false + * + * Retrieve boolean false copy. + */ +static SV *retrieve_boolean_false(pTHX_ stcxt_t *cxt, const char *cname) +{ + SV *sv; + HV *stash; + + TRACEME(("retrieve_boolean_false (#%d)", (int)cxt->tagnum)); + + sv = newSVsv(&PL_sv_no); + stash = cname ? gv_stashpv(cname, GV_ADD) : 0; + SEEN_NN(sv, stash, 0); /* Associate this new scalar with tag "tagnum" */ + + TRACEME(("boolean false")); + TRACEME(("ok (retrieve_boolean_false at 0x%" UVxf ")", PTR2UV(sv))); + + return sv; +} + +/* * retrieve_lobject * * Retrieve overlong scalar, array or hash. @@ -7774,7 +7843,7 @@ CODE: assert(cxt); result = cxt->entry && (cxt->optype & ix) ? TRUE : FALSE; } else { - result = !!last_op_in_netorder(aTHX); + result = cBOOL(last_op_in_netorder(aTHX)); } ST(0) = boolSV(result); Index: gnu/usr.bin/perl/dist/Storable/t/blessed.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Storable/t/blessed.t,v diff -u -p -a -u -p -r1.1.1.4 blessed.t --- gnu/usr.bin/perl/dist/Storable/t/blessed.t 13 Feb 2019 21:11:28 -0000 1.1.1.4 +++ gnu/usr.bin/perl/dist/Storable/t/blessed.t 21 Feb 2024 15:47:01 -0000 @@ -44,7 +44,7 @@ use Storable qw(freeze thaw store retrie 'long VSTRING' => \(my $lvstring = eval "v" . 0 x 300), LVALUE => \(my $substr = substr((my $str = "foo"), 0, 3))); -my $test = 13; +my $test = 18; my $tests = $test + 41 + (2 * 6 * keys %::immortals) + (3 * keys %::weird_refs); plan(tests => $tests); @@ -413,4 +413,55 @@ is(ref $t, 'STRESS_THE_STACK'); ok(ref $@, "and a ref thrown"); unlink("store$$"); +} + +{ + # trying to freeze a glob via STORABLE_freeze + { + package GlobHookedBase; + + sub STORABLE_freeze { + return \1; + } + + package GlobHooked; + our @ISA = "GlobHookedBase"; + } + use Symbol (); + my $glob = bless Symbol::gensym(), "GlobHooked"; + eval { + my $data = freeze($glob); + }; + my $msg = $@; + like($msg, qr/Unexpected object type \(GLOB\) of class 'GlobHooked' in store_hook\(\) calling GlobHookedBase::STORABLE_freeze/, + "check we get the verbose message"); +} + +SKIP: +{ + $] < 5.012 + and skip "Can't assign regexps directly before 5.12", 4; + my $hook_called; + # store regexp via hook + { + package RegexpHooked; + sub STORABLE_freeze { + ++$hook_called; + "$_[0]"; + } + sub STORABLE_thaw { + my ($obj, $cloning, $serialized) = @_; + ++$hook_called; + $$obj = ${ qr/$serialized/ }; + } + } + + my $obj = bless qr/abc/, "RegexpHooked"; + my $data = freeze($obj); + ok($data, "froze regexp blessed into hooked class"); + ok($hook_called, "and the hook was actually called"); + $hook_called = 0; + my $obj_thawed = thaw($data); + ok($hook_called, "hook called for thaw"); + like("abc", $obj_thawed, "check the regexp"); } Index: gnu/usr.bin/perl/dist/Storable/t/boolean.t =================================================================== RCS file: gnu/usr.bin/perl/dist/Storable/t/boolean.t diff -N gnu/usr.bin/perl/dist/Storable/t/boolean.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Storable/t/boolean.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,84 @@ +use strict; +use warnings; + +my $true_ref; +my $false_ref; +BEGIN { + $true_ref = \!!1; + $false_ref = \!!0; +} + +BEGIN { + unshift @INC, 't'; + unshift @INC, 't/compat' if $] < 5.006002; + require Config; + if ($ENV{PERL_CORE} and $Config::Config{'extensions'} !~ /\bStorable\b/) { + print "1..0 # Skip: Storable was not built\n"; + exit 0; + } +} + +use Test::More tests => 12; +use Storable qw(thaw freeze); + +use constant CORE_BOOLS => defined &builtin::is_bool; + +{ + my $x = $true_ref; + my $y = ${thaw freeze \$x}; + is($y, $x); + eval { + $$y = 2; + }; + isnt $@, '', + 'immortal true maintained as immortal'; +} + +{ + my $x = $false_ref; + my $y = ${thaw freeze \$x}; + is($y, $x); + eval { + $$y = 2; + }; + isnt $@, '', + 'immortal false maintained as immortal'; +} + +{ + my $true = $$true_ref; + my $x = \$true; + my $y = ${thaw freeze \$x}; + is($$y, $$x); + is($$y, '1'); + SKIP: { + skip "perl $] does not support tracking boolean values", 1 + unless CORE_BOOLS; + BEGIN { CORE_BOOLS and warnings->unimport('experimental::builtin') } + ok builtin::is_bool($$y); + } + eval { + $$y = 2; + }; + is $@, '', + 'mortal true maintained as mortal'; +} + +{ + my $false = $$false_ref; + my $x = \$false; + my $y = ${thaw freeze \$x}; + is($$y, $$x); + is($$y, ''); + SKIP: { + skip "perl $] does not support tracking boolean values", 1 + unless CORE_BOOLS; + BEGIN { CORE_BOOLS and warnings->unimport('experimental::builtin') } + ok builtin::is_bool($$y); + } + eval { + $$y = 2; + }; + is $@, '', + 'mortal true maintained as mortal'; +} Index: gnu/usr.bin/perl/dist/Storable/t/malice.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Storable/t/malice.t,v diff -u -p -a -u -p -r1.1.1.6 malice.t --- gnu/usr.bin/perl/dist/Storable/t/malice.t 15 Feb 2023 01:32:55 -0000 1.1.1.6 +++ gnu/usr.bin/perl/dist/Storable/t/malice.t 21 Feb 2024 15:47:01 -0000 @@ -32,7 +32,7 @@ our $file_magic_str = 'pst0'; our $other_magic = 7 + length $byteorder; our $network_magic = 2; our $major = 2; -our $minor = 11; +our $minor = 12; our $minor_write = $] >= 5.019 ? 11 : $] > 5.008 ? 9 : $] > 5.005_50 ? 8 : 4; use Test::More; @@ -206,7 +206,7 @@ sub test_things { $where = $file_magic + $network_magic; } - # Just the header and a tag 255. As 33 is currently the highest tag, this + # Just the header and a tag 255. As 34 is currently the highest tag, this # is "unexpected" $copy = substr ($contents, 0, $where) . chr 255; @@ -226,7 +226,7 @@ sub test_things { # local $Storable::DEBUGME = 1; # This is the delayed croak test_corrupt ($copy, $sub, - "/^Storable binary image v$header->{major}.$minor6 contains data of type 255. This Storable is v$header->{major}.$minor and can only handle data types up to 33/", + "/^Storable binary image v$header->{major}.$minor6 contains data of type 255. This Storable is v$header->{major}.$minor and can only handle data types up to 35/", "bogus tag, minor plus 4"); # And check again that this croak is not delayed: { Index: gnu/usr.bin/perl/dist/Test/ChangeLog =================================================================== RCS file: gnu/usr.bin/perl/dist/Test/ChangeLog diff -N gnu/usr.bin/perl/dist/Test/ChangeLog --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Test/ChangeLog 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,151 @@ +# ChangeLog for Test.pm dist + +1.26 2013-01-16 Jesse R Vincent + * Bump version to a stable number. No functional changes + +1.25_02 2009-06-08 Jesse R Vincent + * Typo fixes from Perl core + * README updated + * Ancient TODO removed + * New Maintainer + +2004-04-24 Sean M. Burke + * Release 1.25 + * added some new tests + * Gisle Aas kindly contributes a bunch of new code that diffs + multiline result and expectation + * corrected some doc typoes to do with skip() + +2003-04-18 Sean M. Burke + * Release 1.24 + * Two cosmetic fixes: Ken Williams spotted the typo (tr/[...]//d + for tr/...//d) that was deleting brackets in program source + lines. Fixed. + * And Rob Nagler noticed that I was reporting the MacPerl + "verison" instead of "version". Fixed. That's all. + +2002-10-11 Sean M. Burke + * Release 1.23 + * Dermot Musgrove notes that I switched localtime and gmtime in + the last dist! Fixed. That is all. + +2002-08-28 Sean M. Burke + * Release 1.22 + * Doc note about the danger of "ok Foo->can('bar');", as helpfully + noted by Schwern + * Applied Schwern's fix for false positives with "ok 1, undef;" + +2002-08-26 Sean M. Burke + * Release 1.21 + * I take over maintenance. + * Lots of doc improvement and examples added. + * More comment lines are sent to STDERR/STDOUT, noting Perl + version and platform, noting content of line where error occurred + when it looks interesting, etc. + * A bit more DWIM with skip(). + * Noted in the docs that this modules is indeed being developed. + +2002-02-07 Michael G Schwern + * Release 1.20 + * Failure diagnostics now go to STDERR so they show up + in 'make test'. + - noted in the docs that this module is no longer being + developed. + +2001-12-17 Michael G Schwern + * Release 1.19 + - Resetting globals for mod_perl testing (thanks to Stas Bekman) + - License change to be same as perl's + +2001-07-20 Michael G Schwern + * Release 1.18 + * Now recommending Test::Simple/More in the docs + * Removed warning about skip interface, it was a mistake + - added mention of Pod::Tests and SelfTest + - Test's tests no longer report "UNEXPECTEDLY SUCCEEDED" + +2001-05-29 Michael G Schwern + * Release 1.17 + - protected against stray $/ and $, + * documented ok() + * made the regex diagnostics a bit more obvious + * Backported to 5.004 (if you're using the new Test::Harness) + * Included the VMS fix for ok() + +2001-02-16 Michael G Schwern + + * Release 1.16 + + * Taken over maintenance from Joshua. Altered AUTHOR appropriately. + Blame me. + + * t/fail.t was failing on Windows because the filename was + hardcoded in the test (its t\fail.t on Windows). NOT A BUG! + +2000-11-22 Joshua Pritikin + + * Release 1.15. + + * Fix documentation. (crt@kiski.net) + +1999-06-21 Joshua Pritikin + + * Release 1.14. + + * Port back to 5.004_05. + +1999-05-07 Joshua Pritikin + + * Release 1.13. + + * Handle undef without triggering warnings. Added tests. + +1998-11-29 Joshua Pritikin + + * Release 1.122. + + * Make Test.pm 7-bit clean. (Sarathy) + +1998-11-23 Joshua Pritikin + + * Allow customization of 'skip' reason. Improved tests. + +1998-11-17 Joshua Pritikin + + * Release 1.11. + + * Add 5.005 dependency to Makefile.PL. + +1998-11-12 Joshua Pritikin + + * Release 1.10. + + * Support qr//. + +1998-10-15 Joshua Pritikin + + * Release 1.09. + + * Better diagnostics for failed todo tests. + + * Document return value. + +1998-08-21 Joshua Pritikin + + * Version 1.08. + + * Documentation tweaks. + +1998-08-21 Joshua Pritikin + + * Version 1.07. + + * Send all output to $TESTOUT. + + * Removed all failures from the test suite. More work is still + needed but this is a start. + + * Moved $ntest to @EXPORT_OK from @EXPORT. + + * Instead of printing bits to STDERR, now all output goes to + STDOUT. Index: gnu/usr.bin/perl/dist/Test/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/Test/Makefile.PL diff -N gnu/usr.bin/perl/dist/Test/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Test/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,40 @@ +require 5.004; +use ExtUtils::MakeMaker; + +WriteMakefile( + NAME => 'Test', + VERSION_FROM => './lib/Test.pm', + ABSTRACT_FROM => './lib/Test.pm', + PREREQ_PM => { + 'Test::Harness' => 1.1601, + 'File::Spec' => 0, + }, + INSTALLDIRS => ( $] < 5.011 ? 'perl' : 'site' ), +); + +{ + package MY; + + sub test_via_harness { + my($self, $orig_perl, $tests) = @_; + + my @perls = ($orig_perl); + # XXX: This should probably be updated to something more modern, + # or removed outright. - Yves + push @perls, qw(bleadperl + perl5.6.1 + perl5.6.0 + perl5.005_03 + perl5.004_05 + perl5.004_04 + perl5.004) + if $ENV{PERL_TEST_ALL}; + + my $out; + foreach my $perl (@perls) { + $out .= $self->SUPER::test_via_harness($perl, $tests); + } + + return $out; + } +} Index: gnu/usr.bin/perl/dist/Thread-Queue/Changes =================================================================== RCS file: gnu/usr.bin/perl/dist/Thread-Queue/Changes diff -N gnu/usr.bin/perl/dist/Thread-Queue/Changes --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Thread-Queue/Changes 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,79 @@ +Revision history for Perl extension Thread::Queue. + +3.13 Wed Jul 18 02:00:03 2018 + - [rt.cpan.org #125868] Fix tests for Test::Simple 1.302138 + +3.12 Thu Feb 9 18:42:45 2017 + - Fix deadlock caused by combination of dequeue_nb, enqueue and + queue size limit (Bug #120157 - fix by Chad Fox) + - Prevent calling dequeue methods with COUNT > LIMIT + +3.11 Fri May 20 18:33:00 2016 + - Removed use of detached threads in tests (Bug #114468) + +3.09 Sat Apr 30 21:33:54 2016 + - Sync with blead + +3.07 Fri Oct 23 23:54:18 2015 + - Edge-case fix to queue limit feature + +3.06 Sat Aug 22 20:33:23 2015 + - Added queue limit feature as per suggestion by Mark Zealey + +3.05 Thu Mar 20 21:39:32 2014 + - Sync with blead + +3.04 Tue Mar 11 19:29:00 2014 + - Fix for reporting correct location of validation error + +3.03 Thu Mar 6 20:50:41 2014 + - Conversion of internal functions to methods to permit sub-classing + +3.02 Tue Feb 19 18:22:15 2013 + - Timed dequeue as per suggestion by Andreas Huber + +3.01 Tue Oct 23 22:44:30 EDT 2012 + - Added ->end() as per suggestion by Michael G. Schwern + - Major version bump because of change in structure of queue objects + +2.12 Fri Dec 24 17:52:51 2010 + - Install in 'site' for Perl >= 5.011 + - Test file changes for core + - Added new example (examples/callback.pl) to distribution + - POD update + +2.11 Thu Jun 12 13:41:45 2008 + - End all tests with exit(0) and fix SKIPs + +2.09 Fri May 30 16:31:48 2008 + - Check for 'undef' for counts and indices + +2.08 Wed May 14 15:24:53 2008 + - Use threads::shared::shared_clone() for complex data + +2.07 Wed May 7 18:48:46 2008 + - Properly clone complex structures with circular references + +2.06 Fri Feb 22 22:08:38 2008 + - Allow installation on non-threaded Perls + +2.05 Wed Feb 20 17:21:25 2008 + - Build/test updates + +2.04 Mon Feb 18 12:31:30 2008 + - Install under 'perl' dir + +2.03 Fri Feb 15 18:54:15 2008 + - Support queuing refs of refs + +2.02 Fri Feb 15 15:18:11 2008 + - Fix tests to work under Perl 5.8.0 + +2.01 Thu Feb 14 18:11:00 2008 + - Added 'count' option to dequeue and dequeue_nb + - Added peek, insert and extract methods + - Support queuing of complex data structures + +2.00 Jul 12 16:31:00 2002 + - Released as part of Perl 5.8.0 + Index: gnu/usr.bin/perl/dist/Thread-Queue/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/Thread-Queue/Makefile.PL diff -N gnu/usr.bin/perl/dist/Thread-Queue/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Thread-Queue/Makefile.PL 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,41 @@ +# Module makefile for Thread::Queue (using ExtUtils::MakeMaker) + +require 5.008; + +use strict; +use warnings; + +use ExtUtils::MakeMaker; + +# Construct make file +WriteMakefile( + 'NAME' => 'Thread::Queue', + 'AUTHOR' => 'Jerry D. Hedden ', + 'VERSION_FROM' => 'lib/Thread/Queue.pm', + 'ABSTRACT_FROM' => 'lib/Thread/Queue.pm', + 'PREREQ_PM' => { + 'threads::shared' => 1.21, + 'Scalar::Util' => 1.10, + 'Test::More' => 0.50, + 'Thread::Semaphore' => 0, + }, + 'INSTALLDIRS' => (($] < 5.011) ? 'perl' : 'site'), + + ((ExtUtils::MakeMaker->VERSION() lt '6.25') ? + ('PL_FILES' => { }) : ()), + ((ExtUtils::MakeMaker->VERSION() gt '6.30') ? + ('LICENSE' => 'perl_5') : ()), +); + +# Additional 'make' targets +sub MY::postamble +{ + return <<'_EXTRAS_'; +fixfiles: + @dos2unix `cat MANIFEST` + @$(CHMOD) 644 `cat MANIFEST` + @$(CHMOD) 755 examples/*.pl +_EXTRAS_ +} + +# EOF Index: gnu/usr.bin/perl/dist/Thread-Queue/examples/callback.pl =================================================================== RCS file: gnu/usr.bin/perl/dist/Thread-Queue/examples/callback.pl diff -N gnu/usr.bin/perl/dist/Thread-Queue/examples/callback.pl --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Thread-Queue/examples/callback.pl 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,123 @@ +#!/usr/bin/perl + +# Simplified example illustrating event handling and callback threads + +# Callback threads register their queues with the event handler thread. +# Events are passed to the event handler via a queue. +# The event handler then disseminates the event to the appropriately +# registered thread. + +use strict; +use warnings; + +use threads; +use Thread::Queue; + +MAIN: +{ + # Queue for registering callbacks + my $regis_q = Thread::Queue->new(); + + # Queue for disseminating events + my $event_q = Thread::Queue->new(); + + # Create callback threads + threads->create('CallBack', 'USR1', $regis_q)->detach(); + threads->create('CallBack', 'USR2', $regis_q)->detach(); + threads->create('CallBack', 'HUP', $regis_q)->detach(); + threads->create('CallBack', 'ALRM', $regis_q)->detach(); + + # Create event handler thread + threads->create('EventHandler', $regis_q, $event_q)->detach(); + + # Capture SIGUSR1 events + $SIG{'USR1'} = sub { + $event_q->enqueue('USR1'); # Send to event handler + }; + + # Capture SIGUSR1 events + $SIG{'USR2'} = sub { + $event_q->enqueue('USR2'); # Send to event handler + }; + + # Capture SIGHUP events + $SIG{'HUP'} = sub { + $event_q->enqueue('HUP'); # Send to event handler + }; + + # Capture SIGHUP events + $SIG{'ALRM'} = sub { + $event_q->enqueue('ALRM'); # Send to event handler + alarm(5); # Reset alarm + }; + + # Ready + print(<<_MSG_); +Send signals to PID = $$ + (e.g., 'kill -USR1 $$') +Use ^C (or 'kill -INT $$') to terminate +_MSG_ + + # Set initial alarm + alarm(5); + + # Just hang around + while (1) { + sleep(10); + } +} + +### Subroutines ### + +sub EventHandler +{ + my ($regis_q, $event_q) = @_; + + my %callbacks; # Registered callback queues + + while (1) { + # Check for any registrations + while (my ($event_type, $q) = $regis_q->dequeue_nb(2)) { + if ($q) { + $callbacks{$event_type} = $q; + } else { + warn("BUG: Bad callback registration for event type $event_type\n"); + } + } + + # Wait for event + if (my $event = $event_q->dequeue()) { + # Send event to appropriate queue + if (exists($callbacks{$event})) { + $callbacks{$event}->enqueue($event); + } else { + warn("WARNING: No callback for event type $event\n"); + } + } + } +} + + +sub CallBack +{ + my $event_type = shift; # The type of event I'm handling + my $regis_q = shift; + + # Announce registration + my $tid = threads->tid(); + print("Callback thread $tid registering for $event_type events\n"); + + # Register my queue for my type of event + my $q = Thread::Queue->new(); + $regis_q->enqueue($event_type, $q); + + # Process loop + while (1) { + # Wait for event callback + my $item = $q->dequeue(); + # Process event + print("Callback thread $tid notified of $item event\n") if $item; + } +} + +# EOF Index: gnu/usr.bin/perl/dist/Thread-Queue/examples/queue.pl =================================================================== RCS file: gnu/usr.bin/perl/dist/Thread-Queue/examples/queue.pl diff -N gnu/usr.bin/perl/dist/Thread-Queue/examples/queue.pl --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Thread-Queue/examples/queue.pl 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,56 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +use threads; +use Thread::Queue 3.01; + +# Create a work queue for sending data to a 'worker' thread +# Prepopulate it with a few work items +my $work_q = Thread::Queue->new(qw/foo bar baz/); + +# Create a status queue to get reports from the thread +my $status_q = Thread::Queue->new(); + +# Create a detached thread to process items from the queue +threads->create(sub { + # Keep grabbing items off the work queue + while (defined(my $item = $work_q->dequeue())) { + # Process the item from the queue + print("Thread got '$item'\n"); + + # Ask for more work when the queue is empty + if (! $work_q->pending()) { + print("\nThread waiting for more work\n\n"); + $status_q->enqueue('more'); + } + } + + # Final report + print("Thread done\n"); + $status_q->enqueue('done'); + + })->detach(); + +# More work for the thread +my @work = ( + [ 'bippity', 'boppity', 'boo' ], + [ 'ping', 'pong' ], + [ 'dit', 'dot', 'dit' ], +); + +# Send work to the thread +while ($status_q->dequeue() eq 'more') { + last if (! @work); # No more work + $work_q->enqueue(@{shift(@work)}); +} + +# Signal that there is no more work +$work_q->end(); +# Wait for thread to terminate +$status_q->dequeue(); +# Good-bye +print("Done\n"); + +# EOF Index: gnu/usr.bin/perl/dist/Thread-Semaphore/Changes =================================================================== RCS file: gnu/usr.bin/perl/dist/Thread-Semaphore/Changes diff -N gnu/usr.bin/perl/dist/Thread-Semaphore/Changes --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Thread-Semaphore/Changes 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,45 @@ +Revision history for Perl extension Thread::Semaphore. + +2.13 Sat Aug 27 13:00:00 2016 + - Added ->down_timed() + +2.12 Fri Dec 24 17:48:48 2010 + - POD update + +2.11 Thu Jun 11 02:14:41 2010 + - Added ->down_nb() and ->down_force() + - Skip argument validation when no argument + - Install in 'site' for Perl >= 5.011 + - Test file changes for core + +2.09 Thu Jun 12 13:40:19 2008 + - End all tests with exit(0) and fix SKIPs + +2.08 Mon May 19 17:03:33 2008 + - Check for undef args + +2.07 Fri Feb 22 21:36:54 2008 + - Allow installation on non-threaded Perls + +2.06 Wed Feb 20 17:19:31 2008 + - Build/test updates + +2.05 Mon Feb 18 12:23:15 2008 + - Install under 'perl' dir + +2.04 Fri Feb 15 15:14:30 2008 + - Fix tests to work under Perl 5.8.0 + +2.03 Thu Feb 14 20:05:30 2008 + - Fix test failure + +2.02 Thu Feb 14 15:27:00 2008 + - Argument validation + - Test suite + +2.01 Sep 02 06:40:00 2003 + - Minor doc update + +2.00 Jul 12 16:32:00 2002 + - Released as part of Perl 5.8.0 + Index: gnu/usr.bin/perl/dist/Thread-Semaphore/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/Thread-Semaphore/Makefile.PL diff -N gnu/usr.bin/perl/dist/Thread-Semaphore/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Thread-Semaphore/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,40 @@ +# Module makefile for Thread::Semaphore (using ExtUtils::MakeMaker) + +require 5.008; + +use strict; +use warnings; + +use ExtUtils::MakeMaker; + +# Construct make file +WriteMakefile( + 'NAME' => 'Thread::Semaphore', + 'AUTHOR' => 'Jerry D. Hedden ', + 'VERSION_FROM' => 'lib/Thread/Semaphore.pm', + 'ABSTRACT_FROM' => 'lib/Thread/Semaphore.pm', + 'PREREQ_PM' => { + 'threads::shared' => 0, + 'Scalar::Util' => 1.10, + 'Test::More' => 0.50, + }, + 'INSTALLDIRS' => (($] < 5.011) ? 'perl' : 'site'), + + ((ExtUtils::MakeMaker->VERSION() lt '6.25') ? + ('PL_FILES' => { }) : ()), + ((ExtUtils::MakeMaker->VERSION() gt '6.30') ? + ('LICENSE' => 'perl_5') : ()), +); + +# Additional 'make' targets +sub MY::postamble +{ + return <<'_EXTRAS_'; +fixfiles: + @dos2unix `cat MANIFEST` + @$(CHMOD) 644 `cat MANIFEST` + @$(CHMOD) 755 examples/*.pl +_EXTRAS_ +} + +# EOF Index: gnu/usr.bin/perl/dist/Thread-Semaphore/examples/semaphore.pl =================================================================== RCS file: gnu/usr.bin/perl/dist/Thread-Semaphore/examples/semaphore.pl diff -N gnu/usr.bin/perl/dist/Thread-Semaphore/examples/semaphore.pl --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Thread-Semaphore/examples/semaphore.pl 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,35 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use threads; +use Thread::Semaphore; + +MAIN: +{ + # Create semaphore with count of 0 + my $s = Thread::Semaphore->new(0); + + # Create detached thread + threads->create(sub { + # Thread is blocked until released by main + $s->down(); + + # Thread does work + # ... + + # Tell main that thread is finished + $s->up(); + })->detach(); + + # Release thread to do work + $s->up(); + + # Wait for thread to finish + $s->down(); +} + +exit(0); + +# EOF Index: gnu/usr.bin/perl/dist/Tie-File/ChangeLog =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Tie-File/ChangeLog,v diff -u -p -a -u -p -r1.1.1.1 ChangeLog --- gnu/usr.bin/perl/dist/Tie-File/ChangeLog 1 Mar 2021 23:15:50 -0000 1.1.1.1 +++ gnu/usr.bin/perl/dist/Tie-File/ChangeLog 21 Feb 2024 15:47:01 -0000 @@ -1,5 +1,14 @@ +1.07 - 2023-02-20 - Todd Rinaldo + - t/29a_upcopy.t - under parallel builds allow more time for test + - t/29_downcopy.t: Correct typo in inline comment + What's new in version 1.06 - Correct misleading entries in SYNOPSIS + - undef Tie::File objects before untie-ing arrays + - Tie-File: report test timeouts to STDERR + - t/29a_upcopy.t add test descriptions + - t/29a_upcopy.t: double timeout to 10 + - t/29_downcopy.t: Correct typo in inline comment What's new in version 1.05 - Remove unnecessary version change test Index: gnu/usr.bin/perl/dist/Tie-File/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/Tie-File/Makefile.PL diff -N gnu/usr.bin/perl/dist/Tie-File/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/Tie-File/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,33 @@ +## This -*- perl -*- script writes the Makefile for Tie::File +# You should read "perldoc perlmodinstall" for instructions on +# how to install modules like this. + +require 5.006; # module uses 'our' +use strict; +use ExtUtils::MakeMaker; +WriteMakefile( + 'NAME' => 'Tie::File', + 'VERSION_FROM' => 'lib/Tie/File.pm', + 'ABSTRACT_FROM' => 'lib/Tie/File.pm', + 'AUTHOR' => 'Mark Jason Dominus ', + 'dist'=> { COMPRESS => 'gzip -6f', SUFFIX => 'gz', }, + INSTALLDIRS => ($] >= 5.007 && $] < 5.012) ? 'perl' : 'site', + DIR => [], + META_MERGE => { + resources => { + license => 'http://dev.perl.org/licenses/', + bugtracker => 'https://github.com/Perl/perl5/issues', + repository => 'https://github.com/Perl/perl5/tree/blead/dist/Tie-File', + MailingList => 'http://lists.perl.org/list/perl5-porters.html', + }, + }, +); +# generated by Makepmdist (mkpmdist) v1.01 + +sub libscan { # Determine what shouldn't get installed + my($self, $path) = @_; + return '' if $path =~ m/~/; + return $path; +} +__END__ + Index: gnu/usr.bin/perl/dist/Tie-File/lib/Tie/File.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Tie-File/lib/Tie/File.pm,v diff -u -p -a -u -p -r1.3 File.pm --- gnu/usr.bin/perl/dist/Tie-File/lib/Tie/File.pm 1 Mar 2021 23:19:54 -0000 1.3 +++ gnu/usr.bin/perl/dist/Tie-File/lib/Tie/File.pm 21 Feb 2024 15:47:01 -0000 @@ -11,7 +11,7 @@ use Fcntl 'O_CREAT', 'O_RDWR', 'LOCK_EX' sub O_ACCMODE () { O_RDONLY | O_RDWR | O_WRONLY } -our $VERSION = "1.06"; +our $VERSION = "1.07"; my $DEFAULT_MEMORY_SIZE = 1<<21; # 2 megabytes my $DEFAULT_AUTODEFER_THRESHHOLD = 3; # 3 records my $DEFAULT_AUTODEFER_FILELEN_THRESHHOLD = 65536; # 16 disk blocksful Index: gnu/usr.bin/perl/dist/Tie-File/t/24_cache_loop.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Tie-File/t/24_cache_loop.t,v diff -u -p -a -u -p -r1.1.1.3 24_cache_loop.t --- gnu/usr.bin/perl/dist/Tie-File/t/24_cache_loop.t 1 Mar 2021 23:15:51 -0000 1.1.1.3 +++ gnu/usr.bin/perl/dist/Tie-File/t/24_cache_loop.t 21 Feb 2024 15:47:01 -0000 @@ -44,8 +44,11 @@ $N++; # will then try to flush the read cache---but the read cache is # already empty, so you're stuck in an infinite loop. # -# Five seconds should be plenty of time for it to complete if it works. -alarm 5 unless $^P; +# Ten seconds should be plenty of time for it to complete if it works +# on an unloaded box. Using 20 under parallel builds seems prudent. +my $alarm_time = $ENV{TEST_JOBS} || $ENV{HARNESS_OPTIONS} ? 20 : 10; +local $SIG{ALRM} = sub { die "$0 Timeout after $alarm_time seconds at test 3\n" }; +alarm $alarm_time unless $^P; @a = "record0" .. "record9"; print "ok 3\n"; alarm 0; @@ -55,6 +58,3 @@ END { untie @a; 1 while unlink $file; } - - - Index: gnu/usr.bin/perl/dist/Tie-File/t/29_downcopy.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Tie-File/t/29_downcopy.t,v diff -u -p -a -u -p -r1.1.1.3 29_downcopy.t --- gnu/usr.bin/perl/dist/Tie-File/t/29_downcopy.t 1 Mar 2021 23:15:51 -0000 1.1.1.3 +++ gnu/usr.bin/perl/dist/Tie-File/t/29_downcopy.t 21 Feb 2024 15:47:01 -0000 @@ -245,7 +245,7 @@ sub try { binmode F; # The record has exactly 17 characters. This will help ensure that - # even if _downcoopy screws up, the data doesn't coincidentally + # even if _downcopy screws up, the data doesn't coincidentally # look good because the remainder accidentally lines up. my $d = substr("0123456789abcdef$:", -17); my $recs = defined($FLEN) ? @@ -274,13 +274,15 @@ sub try { } my $o = tie my @lines, 'Tie::File', $file or die $!; + # allocate more time when are running tests in parallel + my $alarm_time = $ENV{TEST_JOBS} || $ENV{HARNESS_OPTIONS} ? 20 : 10; local $SIG{ALRM} = sub { die "Alarm clock" }; - my $a_retval = eval { alarm(5) unless $^P; $o->_downcopy($newdata, $pos, $len) }; + my $a_retval = eval { alarm($alarm_time) unless $^P; $o->_downcopy($newdata, $pos, $len) }; my $err = $@; undef $o; untie @lines; alarm(0); if ($err) { if ($err =~ /^Alarm clock/) { - print "# Timeout\n"; + print STDERR "# $0 Timeout after $alarm_time seconds at test $N\n"; print "not ok $N\n"; $N++; print "not ok $N\n"; $N++; if (defined $len) { Index: gnu/usr.bin/perl/dist/Tie-File/t/29a_upcopy.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Tie-File/t/29a_upcopy.t,v diff -u -p -a -u -p -r1.1.1.3 29a_upcopy.t --- gnu/usr.bin/perl/dist/Tie-File/t/29a_upcopy.t 1 Mar 2021 23:15:51 -0000 1.1.1.3 +++ gnu/usr.bin/perl/dist/Tie-File/t/29a_upcopy.t 21 Feb 2024 15:47:01 -0000 @@ -130,13 +130,15 @@ sub try { } my $o = tie my @lines, 'Tie::File', $file or die $!; + # allocate more time for the test if we are running parallel tests + my $alarm_time = ($ENV{TEST_JOBS} || $ENV{HARNESS_OPTIONS}) ? 20 : 10; local $SIG{ALRM} = sub { die "Alarm clock" }; - my $a_retval = eval { alarm(5) unless $^P; $o->_upcopy($src, $dst, $len) }; + my $a_retval = eval { alarm($alarm_time) unless $^P; $o->_upcopy($src, $dst, $len) }; my $err = $@; undef $o; untie @lines; alarm(0); if ($err) { if ($err =~ /^Alarm clock/) { - print "# Timeout\n"; + print STDERR "# $0 Timeout after $alarm_time seconds at test $N\n"; print "not ok $N\n"; $N++; return; } else { @@ -157,7 +159,9 @@ sub try { unless ($alen == $xlen) { print "# try(@_) expected file length $xlen, actual $alen!\n"; } - print $actual eq $expected ? "ok $N\n" : "not ok $N\n"; + my $desc = sprintf "try(%d, %d, %s)", + $src, $dst, (defined $len ? $len : "undef"); + print $actual eq $expected ? "ok $N - $desc\n" : "not ok $N - $desc\n"; $N++; } @@ -171,4 +175,3 @@ sub ctrlfix { END { 1 while unlink $file; } - Index: gnu/usr.bin/perl/dist/Time-HiRes/Changes =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Time-HiRes/Changes,v diff -u -p -a -u -p -r1.6 Changes --- gnu/usr.bin/perl/dist/Time-HiRes/Changes 15 Feb 2023 01:36:29 -0000 1.6 +++ gnu/usr.bin/perl/dist/Time-HiRes/Changes 21 Feb 2024 15:47:02 -0000 @@ -4,6 +4,19 @@ Revision history for the Perl extension - Remove obsolete vms code - Use core version compare + - Use GIMME_V instead of the deprecated GIMME + - t/utime.t: dragonflybsd has only microsecond precision + - t/utime.t: dragonflybsd is noatime by default + - t/stat.t: skip testing access times on HaikuOS, it doesn't support + atime + - darwin: make sure the compiler can find the system perl headers + https://github.com/Perl/perl5/issues/20362 + - darwin: make sure PERL_DARWIN is defined on darwin. + - don't compare stat and lstat atime if PERL_FILE_ATIME_CHANGES is set in + the environment. + https://github.com/Perl/perl5/issues/19321 + - don't use C++ guards around the perl header files, it caused C++ + build failures with MSVC. 1.9764 [2020-08-10] - Fix a bunch of repeated-word typos Index: gnu/usr.bin/perl/dist/Time-HiRes/HiRes.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Time-HiRes/HiRes.pm,v diff -u -p -a -u -p -r1.9 HiRes.pm --- gnu/usr.bin/perl/dist/Time-HiRes/HiRes.pm 15 Feb 2023 01:36:29 -0000 1.9 +++ gnu/usr.bin/perl/dist/Time-HiRes/HiRes.pm 21 Feb 2024 15:47:02 -0000 @@ -50,7 +50,7 @@ our @EXPORT_OK = qw (usleep sleep ualarm stat lstat utime ); -our $VERSION = '1.9770'; +our $VERSION = '1.9775'; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; Index: gnu/usr.bin/perl/dist/Time-HiRes/HiRes.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Time-HiRes/HiRes.xs,v diff -u -p -a -u -p -r1.9 HiRes.xs --- gnu/usr.bin/perl/dist/Time-HiRes/HiRes.xs 15 Feb 2023 01:36:29 -0000 1.9 +++ gnu/usr.bin/perl/dist/Time-HiRes/HiRes.xs 21 Feb 2024 15:47:02 -0000 @@ -11,18 +11,15 @@ * it under the same terms as Perl itself. */ -#ifdef __cplusplus -extern "C" { -#endif #define PERL_NO_GET_CONTEXT #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "reentr.h" -#ifdef USE_PPPORT_H +#if !defined(IS_SAFE_PATHNAME) && defined(TIME_HIRES_UTIME) && defined(HAS_UTIMENSAT) #define NEED_ck_warner -# include "ppport.h" #endif +#include "ppport.h" #if defined(__CYGWIN__) && defined(HAS_W32API_WINDOWS_H) # include # define CYGWIN_WITH_W32API @@ -40,9 +37,6 @@ extern "C" { #if defined(TIME_HIRES_CLOCK_GETTIME_SYSCALL) || defined(TIME_HIRES_CLOCK_GETRES_SYSCALL) # include #endif -#ifdef __cplusplus -} -#endif #ifndef GCC_DIAG_IGNORE # define GCC_DIAG_IGNORE(x) @@ -263,8 +257,6 @@ _gettimeofday(pTHX_ struct timeval *tp, static int _clock_gettime(pTHX_ clockid_t clock_id, struct timespec *tp) { - FT_t ft; - switch (clock_id) { case CLOCK_REALTIME: { FT_t ft; @@ -1193,7 +1185,7 @@ gettimeofday() int status; status = gettimeofday (&Tp, NULL); if (status == 0) { - if (GIMME == G_LIST) { + if (GIMME_V == G_LIST) { EXTEND(sp, 2); PUSHs(sv_2mortal(newSViv(Tp.tv_sec))); PUSHs(sv_2mortal(newSViv(Tp.tv_usec))); @@ -1250,7 +1242,7 @@ setitimer(which, seconds, interval = 0) if (setitimer(which, &newit, &oldit) == 0) { EXTEND(sp, 1); PUSHs(sv_2mortal(newSVnv(TV2NV(oldit.it_value)))); - if (GIMME == G_LIST) { + if (GIMME_V == G_LIST) { EXTEND(sp, 1); PUSHs(sv_2mortal(newSVnv(TV2NV(oldit.it_interval)))); } @@ -1270,7 +1262,7 @@ getitimer(which) if (getitimer(which, &nowit) == 0) { EXTEND(sp, 1); PUSHs(sv_2mortal(newSVnv(TV2NV(nowit.it_value)))); - if (GIMME == G_LIST) { + if (GIMME_V == G_LIST) { EXTEND(sp, 1); PUSHs(sv_2mortal(newSVnv(TV2NV(nowit.it_interval)))); } Index: gnu/usr.bin/perl/dist/Time-HiRes/Makefile.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Time-HiRes/Makefile.PL,v diff -u -p -a -u -p -r1.9 Makefile.PL --- gnu/usr.bin/perl/dist/Time-HiRes/Makefile.PL 15 Feb 2023 01:36:29 -0000 1.9 +++ gnu/usr.bin/perl/dist/Time-HiRes/Makefile.PL 21 Feb 2024 15:47:02 -0000 @@ -68,11 +68,20 @@ __EOD__ } } - my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir" - . ' -DPERL_NO_INLINE_FUNCTIONS'; + my $ccflags = $Config{'ccflags'} . ' '; + my @osvers = split /\./, $Config{osvers}; + if ($^O eq "darwin" + && $^X eq "/usr/bin/perl" + && $osvers[0] >= 18) { + $ccflags .= qq(-iwithsysroot "$COREincdir"); + } + else { + $ccflags .= "-I$COREincdir" + } + $ccflags .= ' -DPERL_NO_INLINE_FUNCTIONS'; if ($^O eq 'VMS') { - $cccmd = "$Config{'cc'} /include=($COREincdir) $tmp.c"; + $cccmd = "$Config{'cc'} $Config{'ccflags'} /include=($COREincdir) $tmp.c"; } if ($args{silent} || !$VERBOSE) { @@ -841,6 +850,11 @@ EOM print "NOT found.\n"; } } + if ($^O eq "darwin") { + # the system perl on darwin doesn't seem to include -DPERL_DARWIN + # which breaks setting up emulation + DEFINE("PERL_DARWIN"); + } if ($DEFINE) { $DEFINE =~ s/^\s+//; @@ -853,8 +867,6 @@ EOM sub doMakefile { my @makefileopts = (); - - DEFINE('USE_PPPORT_H') unless $ENV{PERL_CORE}; push (@makefileopts, 'NAME' => 'Time::HiRes', Index: gnu/usr.bin/perl/dist/Time-HiRes/t/stat.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Time-HiRes/t/stat.t,v diff -u -p -a -u -p -r1.7 stat.t --- gnu/usr.bin/perl/dist/Time-HiRes/t/stat.t 15 Feb 2023 01:36:29 -0000 1.7 +++ gnu/usr.bin/perl/dist/Time-HiRes/t/stat.t 21 Feb 2024 15:47:02 -0000 @@ -36,7 +36,11 @@ for (1..5) { SKIP: { if($^O eq "haiku") { skip "testing stat access time on Haiku", 2; - } + } + if ($ENV{PERL_FILE_ATIME_CHANGES}) { + # something else might access the file, changing atime + $lstat->[8] = $stat->[8]; + } is_deeply $lstat, $stat, "write: stat and lstat returned same values"; Time::HiRes::sleep(rand(0.1) + 0.1); open(X, '<', $$); Index: gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.pm,v diff -u -p -a -u -p -r1.1.1.3 Normalize.pm --- gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.pm 15 Feb 2023 01:32:55 -0000 1.1.1.3 +++ gnu/usr.bin/perl/dist/Unicode-Normalize/Normalize.pm 21 Feb 2024 15:47:01 -0000 @@ -7,7 +7,7 @@ use Carp; no warnings 'utf8'; -our $VERSION = '1.31'; +our $VERSION = '1.32'; our $PACKAGE = __PACKAGE__; our @EXPORT = qw( NFC NFD NFKC NFKD ); @@ -376,7 +376,7 @@ Note that C<$unprocessed> will be modifi =head2 Quick Check -(see Annex 8, UAX #15; and F) +(see Annex 8, UAX #15; and F) The following functions check whether the string is in that normalization form. @@ -604,8 +604,10 @@ so one could cause Unicode 3.2 to be use In older Unicode versions, a small number of characters (all of which are CJK compatibility ideographs as far as they have been found) may have -an erroneous decomposition mapping (see F). -Anyhow, this module will neither refer to F +an erroneous decomposition mapping (see +F). +Anyhow, this module will neither refer to +F nor provide any specific version of normalization. Therefore this module running on an older perl with an older Unicode database may use the erroneous decomposition mapping blindly conforming to the Unicode database. Index: gnu/usr.bin/perl/dist/XSLoader/XSLoader_pm.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/XSLoader/XSLoader_pm.PL,v diff -u -p -a -u -p -r1.5 XSLoader_pm.PL --- gnu/usr.bin/perl/dist/XSLoader/XSLoader_pm.PL 15 Feb 2023 01:36:29 -0000 1.5 +++ gnu/usr.bin/perl/dist/XSLoader/XSLoader_pm.PL 21 Feb 2024 15:47:01 -0000 @@ -16,7 +16,7 @@ no strict 'refs'; package XSLoader; -our $VERSION = "0.31"; # remember to update version in POD! +our $VERSION = "0.32"; # remember to update version in POD! package DynaLoader; @@ -207,7 +207,7 @@ XSLoader - Dynamically load C libraries =head1 VERSION -Version 0.31 +Version 0.32 =head1 SYNOPSIS Index: gnu/usr.bin/perl/dist/XSLoader/t/XSLoader.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/XSLoader/t/XSLoader.t,v diff -u -p -a -u -p -r1.5 XSLoader.t --- gnu/usr.bin/perl/dist/XSLoader/t/XSLoader.t 15 Feb 2023 01:36:29 -0000 1.5 +++ gnu/usr.bin/perl/dist/XSLoader/t/XSLoader.t 21 Feb 2024 15:47:01 -0000 @@ -7,11 +7,6 @@ use Config; my $db_file; BEGIN { - if (not eval "use Test::More; 1") { - print "1..0 # Skip: Test::More not available\n"; - die "Test::More not available\n"; - } - use Config; foreach (qw/SDBM_File GDBM_File ODBM_File NDBM_File DB_File/) { if ($Config{extensions} =~ /\b$_\b/) { @@ -21,6 +16,106 @@ BEGIN { } } +# mini test implementation. We're going to be playing with the XS bits of +# various modules that may be used by Test::More, so it's best to avoid. Since +# XSLoader is dual life, we can't use something like perl's t/test.pl +my $planned_tests; +my $tests; +my $passed_tests; +sub ok ($;$) { + my ($ok, $name) = @_; + $tests++; + $passed_tests += 1 if $ok; + print STDOUT "not " + if !$ok; + print STDOUT "ok $tests"; + print STDOUT " - $name" + if defined $name; + print "\n"; + return $ok; +} +sub is ($$;$) { + my ($got, $want, $name) = @_; + + my $ok + = !defined $want && !defined $got + || defined $want && defined $got && $got eq $want; + + defined $_ or $_ = '[undef]' + for $got, $want; + + ok($ok, $name) + or diag("Got: $got\nExpected: $want"); + + return $ok; +} +sub can_ok ($@) { + my ($inv, @methods) = @_; + die "only supports one method" + if @methods != 1; + ok $inv->can($methods[0]), "$inv->can('$methods[0]')"; +} +sub skip ($$) { + my ($message, $count) = @_; + die "bad skip" + if !$count || $count =~ /[^0-9]/; + for (1..$count) { + $tests++; + print STDOUT "ok $tests # skip $message\n"; + } + $passed_tests += $count; + no warnings 'exiting'; + last SKIP; +} +sub like ($$;$) { + my ($got, $want_re, $name) = @_; + if (!ref $want_re) { + $want_re =~ m{\A/(.*)/([a-z]*)\z} + or die "bad regex $want_re"; + $want_re = (length $2 ? "(?$2)" : '') . $1; + } + my $ok = $got =~ $want_re; + ok($ok, $name) + or diag("Got: $got\nExpected: $want_re"); + return $ok; +} +sub diag { + my ($message) = @_; + $message =~ s/\n?\z/\n/; + $message =~ s/^/# /gm; + print STDERR $message; +} +END { + if (!defined $planned_tests) { + print STDERR "# No plan was declared!\n"; + $? = 254; + return; + } + + if ($tests != $planned_tests) { + print STDERR "# Looks like you planned $planned_tests test but ran $tests.\n"; + $? = abs($planned_tests - $tests); + } + elsif ($passed_tests != $tests) { + my $failed = $tests - $passed_tests; + print STDERR "# Looks like you failed $failed test but ran $tests.\n"; + } +} +sub plan { + my %opts = @_; + die "already planned" + if defined $planned_tests; + if (my $skip_all = $opts{skip_all}) { + print STDOUT "1..0 # SKIP $skip_all\n"; + $planned_tests = 0; + exit 0; + } + elsif ($planned_tests = $opts{tests}) { + print STDOUT "1..$planned_tests\n"; + } +} + +### my %modules = ( # ModuleName => q|code to check that it was loaded|, @@ -33,10 +128,9 @@ my %modules = ( 'Time::HiRes'=> q| ::can_ok( 'Time::HiRes' => 'usleep' ) |, # 5.7.3 ); -plan tests => keys(%modules) * 3 + 10; +plan tests => keys(%modules) * 3 + 9; -# Try to load the module -use_ok( 'XSLoader' ); +use XSLoader; # Check functions can_ok( 'XSLoader' => 'load' ); Index: gnu/usr.bin/perl/dist/constant/Changes =================================================================== RCS file: gnu/usr.bin/perl/dist/constant/Changes diff -N gnu/usr.bin/perl/dist/constant/Changes --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/constant/Changes 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,128 @@ +Revision history for constant + +1.33 2015.04.30 RJBS (Ricardo SIGNES) + [CODE] Updated from bleadperl: + - Stop using vars.pm + - Allow package name in ‘use constant’ constants + - Remove bug-inducing compile-time checking of constant values + - Make elements of list consts read-only + +1.27 2013.03.21 SAPER (Sébastien Aperghis-Tramoni) + [CODE] Updated from bleadperl: + - Remove a reference to a non-existent module (Karl Williamson) + - Make utf8 downgrading version dependent in order to avoid + unconditional loading of utf8_heavy.pl (Brad Gilbert) + +1.25 2013.01.19 SAPER (Sébastien Aperghis-Tramoni) + [CODE] Updated from bleadperl: + - Remove 5.6-isms (Sébastien Aperghis-Tramoni) + +1.24 2013.01.07 SAPER (Sébastien Aperghis-Tramoni) + [CODE] Updated from bleadperl: + - Disable the UTF8 downgrade when unnecessary (Father Chrysostomos) + - Restore compatibility with Perl 5.8 (Sébastien Aperghis-Tramoni) + - Skip t/utf8.t on Perl before 5.8.4 (Sébastien Aperghis-Tramoni) + [DIST] Perl-RT #114050: Added meta-information in Makefile.PL to + reflect that the module is maintained by P5P. + +1.21 2011.04.18 SAPER (Sébastien Aperghis-Tramoni) #PerlQA2011 + [CODE] Updated from bleadperl: + - Make Unicode constants under use utf8 work again (Father Chrysostomos) + [TESTS] Make tests pass under old Perls. + +1.20 2011.04.16 SAPER (Sébastien Aperghis-Tramoni) #PerlQA2011 + [CODE] Updated from bleadperl: + - [perl #68640] Wrong error for undef constant name (Zefram). + [DIST] CPAN-RT #66727: Add explicit configure_requires to Build.PL + (David Golden). + +1.19 2009.09.12 SAPER (Sébastien Aperghis-Tramoni) + [CODE] Optimisation: Avoid unnecessary flushing of the caller + package's MRO cache (Nicholas Clark). + [CODE] Optimisation: Use the internal constant _CAN_PCS to optimise + out things that can't happen pre 5.10 (Nicholas Clark). + +1.18 2009.08.18 SAPER (Sébastien Aperghis-Tramoni) + [CODE] Optimisation: Generate perl version-dependent regexps once, + rather than every call to import (Nicholas Clark). + [CODE] Optimisation: Convert perl version check in import() from + run time to compile time (Nicholas Clark). + [TESTS] Re-added pseudohashes tests that were removed at some point + from bleadperl (Nicholas Clark). + +1.17 2008.10.29 SAPER (Sébastien Aperghis-Tramoni) + [TESTS] Moved the TRAILING test from t/constant.t to t/more-tests.t + in order to avoid FAIL reports when executed with Test::More 0.82+ + +1.16 2008.09.21 SAPER (Sébastien Aperghis-Tramoni) + [DOC] The copyright section is also the license. + [DOC] Added a SEE ALSO section. + [DOC] Converted files to UTF-8. + [DOC] Improved the description in README. + +1.15 2007.12.31 SAPER (Sébastien Aperghis-Tramoni) + [TEST] Adjusted t/constant.t to how empty prototypes are reported + among different versions of Perl (thus fixing the FAIL reports for + Perl 5.8.0 to 5.8.3). + +1.14 2007.12.27 SAPER (Sébastien Aperghis-Tramoni) + [DIST] CPAN-RT#31627: Specify core install dir in Build.PL. + Thanks to Michael G Schwern. + +1.13 2007.12.27 SAPER (Sébastien Aperghis-Tramoni) + [CODE] Merged changed blead@32338: UNITCHECK is only a keyword + post 5.009 (Nicholas Clark). + [DIST] Copied the sysnopsis into eg/ + +1.12 2007.11.06 SAPER (Sébastien Aperghis-Tramoni) + [DIST] CPAN-RT#30460: The module must be installed in core, not in + site (because it get shadowed). Thanks to Imacat. + +1.11 2007.09.25 SAPER (Sébastien Aperghis-Tramoni) + [CODE] Fixed code and tests so everything work under Perl 5.005. + [DOC] Some Pod nits. Added information about current maintainers. + +1.10 2007.04.19 + blead@30980: C3 MRO support (Brandon L Black). + blead@30824: Small fix for Symbian (Jarkko Hietaniemi). + +1.09 2007.03.13 + blead@30561: Inform constant.pm about UNITCHECK (Joshua ben Jore). + +1.08 2007.02.13 + blead@30255: Remove some debugging code (Nicholas Clark). + blead@26502: Use Internals::inc_sub_generation() to invalidate + cached methods (Nicholas Clark). + +1.07 2005.12.26 + blead@26487: Rework constant.pm to take advantage of the space + savings of proxy constant subroutines whenever it can (Nicholas Clark). + blead@26485: Factore caller() call out of the loop (Nicholas Clark). + +1.06 2005.12.24 + blead@26483: Using a hash reference rather than a hash can save a + hash copy (Nicholas Clark). + +1.05 2004.11.12 + blead@23497: Silence an unnecessary warning (Anno Siegel). + +1.04 2001.07.29 + blead@12097, 11473: Major POD rewrite (Ilmari Karonen). + +1.03 2001.06.29 + blead@8240: Declare multiple constants at once (Casey West). + +1.02 2000.03.13 + blead@5702: Use warnings::register (Paul Marquess). + blead@5463: Relax restrictions on constant names a bit (M J T Guy). + blead@4905: STOP blocks have been renamed to CHECK (Gurusamy Sarathy). + +1.01 1999.12.28 + blead@4718: New version of constant.pm from Tom Phoenix; added Tom's + notes to perldelta; added STOP, DESTROY and AUTOLOAD to specials list + blead@2029: Restore sanity to "constant" references (Gurusamy Sarathy). + + +Full history: + http://public.activestate.com/cgi-bin/perlbrowse/l/lib/constant.pm + Index: gnu/usr.bin/perl/dist/constant/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/constant/Makefile.PL diff -N gnu/usr.bin/perl/dist/constant/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/constant/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,30 @@ +use 5.006; +use strict; +use ExtUtils::MakeMaker; + +my %prereq = ( + "Test::More" => 0, +); + +WriteMakefile( + NAME => 'constant', + LICENSE => 'perl', + AUTHOR => 'Sebastien Aperghis-Tramoni ', + VERSION_FROM => 'lib/constant.pm', + ABSTRACT_FROM => 'lib/constant.pm', + INSTALLDIRS => ( $] < 5.011 ? 'perl' : 'site' ), + PL_FILES => {}, + PREREQ_PM => \%prereq, + META_MERGE => { + resources => { + repository => 'https://github.com/Perl/perl5.git', + license => 'http://dev.perl.org/licenses/', + homepage => 'https://metacpan.org/module/constant', + irc => 'irc://irc.perl.org/#p5p', + mailinglist => 'http://lists.perl.org/list/perl5-porters.html', + bugtracker => 'https://github.com/Perl/perl5/issues', + }, + }, + dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, + clean => { FILES => 'constant-*' }, +); Index: gnu/usr.bin/perl/dist/encoding-warnings/Changes =================================================================== RCS file: gnu/usr.bin/perl/dist/encoding-warnings/Changes diff -N gnu/usr.bin/perl/dist/encoding-warnings/Changes --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/encoding-warnings/Changes 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,41 @@ +Change log for encoding-warnings + + - Converted Makefile.PL from using Module::Install to ExtUtils::MakeMaker + +0.14 - 2022-05-16 + + - Convert tests from Test.pm to Test::More + +0.13 - 2016-06-20 + + - Disable module on perl 5.26 and newer. Using it will be a no-op, but will + issue warnings. + - Skip tests on EBCDIC systems + +0.11 - 2007-06-05 + + - This module's effect is now lexical for Perl 5.9.5 and later. + - "no encoding::warnings" is made more inefficient by doing away + with an empty encoding handler. + Contributed by: Rafaël Garcia-Suarez + +0.04 - 2004-03-16 + + - This be 0.04, from the YAPC::Taipei::2004 release party. + - Various POD grammar updates. + - Mentions that we will be making encoding.pm to be lexical during 5.9. + +0.03 - 2004-03-15 + + - Fixes various typo and punctuations. + - Unified terminology to use "byte-string" and "unicode-string". + +0.02 - 2004-03-14 + + - Added lots of documentations, as well as explained the subtlety of + "use encoding" better. Prompted by Ton Hospel. + - Do not bother decoding a string twice if it is us-ascii. + +0.01 - 2004-03-14 + + - Initial release on CPAN. Index: gnu/usr.bin/perl/dist/encoding-warnings/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/encoding-warnings/Makefile.PL diff -N gnu/usr.bin/perl/dist/encoding-warnings/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/encoding-warnings/Makefile.PL 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,22 @@ +use strict; +use warnings; +use ExtUtils::MakeMaker; +WriteMakefile( + NAME => 'encoding::warnings', + VERSION_FROM => 'lib/encoding/warnings.pm', + ABSTRACT_FROM => 'lib/encoding/warnings.pm', + INSTALLDIRS => ( $] >= 5.009002 && $] < 5.011 ? 'perl' : 'site' ), + LICENSE => 'perl_5', + TEST_REQUIRES => { + 'Test::More' => 0, + }, + PREREQ_PM => {}, + AUTHOR => 'Audrey Tang ', + META_MERGE => { + resources => { + repository => 'https://github.com/perl/perl5.git', + bugtracker => 'https://github.com/perl/perl5/issues', + MailingList => 'https://lists.perl.org/list/perl5-porters.html', + }, + }, +); Index: gnu/usr.bin/perl/dist/encoding-warnings/lib/encoding/warnings.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/encoding-warnings/lib/encoding/warnings.pm,v diff -u -p -a -u -p -r1.2 warnings.pm --- gnu/usr.bin/perl/dist/encoding-warnings/lib/encoding/warnings.pm 13 Feb 2019 21:15:21 -0000 1.2 +++ gnu/usr.bin/perl/dist/encoding-warnings/lib/encoding/warnings.pm 21 Feb 2024 15:47:02 -0000 @@ -1,5 +1,5 @@ package encoding::warnings; -$encoding::warnings::VERSION = '0.13'; +$encoding::warnings::VERSION = '0.14'; use strict; use 5.007; @@ -32,7 +32,7 @@ thereafter. use encoding::warnings; # or 'FATAL' to raise fatal exceptions utf8::encode($a = chr(20000)); # a byte-string (raw bytes) - $b = chr(20000); # a unicode-string (wide characters) + $b = chr(20000); # a unicode-string (wide characters) # "Bytes implicitly upgraded into wide characters as iso-8859-1" $c = $a . $b; @@ -133,9 +133,9 @@ some people: use encoding 'big5'; my $byte_string = pack("C*", 0xA4, 0x40); - print length $a; # 2 here. - $a .= ""; # concatenating with a unicode string... - print length $a; # 1 here! + print length $a; # 2 here. + $a .= ""; # concatenating with a unicode string... + print length $a; # 1 here! In other words, do not C unless you are certain that the program will not deal with any raw, 8-bit binary data at all. @@ -162,11 +162,11 @@ sub FATAL () { 2 } sub import { if ($] >= 5.025003) { - require Carp; - Carp::cluck( - "encoding::warnings is not supported on Perl 5.26.0 and later" - ); - return; + require Carp; + Carp::cluck( + "encoding::warnings is not supported on Perl 5.26.0 and later" + ); + return; } # Install a ${^ENCODING} handler if no other one are already in place. @@ -185,11 +185,11 @@ sub import { # Install a warning handler for decode() my $decoder = bless( - [ - $ascii, - $latin1, - (($fatal eq 'FATAL') ? 'Carp::croak' : 'Carp::carp'), - ], $class, + [ + $ascii, + $latin1, + (($fatal eq 'FATAL') ? 'Carp::croak' : 'Carp::carp'), + ], $class, ); no warnings 'deprecated'; Index: gnu/usr.bin/perl/dist/encoding-warnings/t/1-warning.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/encoding-warnings/t/1-warning.t,v diff -u -p -a -u -p -r1.2 1-warning.t --- gnu/usr.bin/perl/dist/encoding-warnings/t/1-warning.t 13 Feb 2019 21:15:22 -0000 1.2 +++ gnu/usr.bin/perl/dist/encoding-warnings/t/1-warning.t 21 Feb 2024 15:47:02 -0000 @@ -4,30 +4,31 @@ BEGIN { if (ord("A") != 65) { - print "1..0 # Skip: Encode not working on EBCDIC\n"; - exit 0; + print "1..0 # Skip: Encode not working on EBCDIC\n"; + exit 0; } unless (eval { require Encode } ) { - print "1..0 # Skip: no Encode\n"; - exit 0; + print "1..0 # Skip: no Encode\n"; + exit 0; } } -use Test; use strict; +use warnings; +use Test::More; BEGIN { if ("$]" >= 5.025) { - # Test the new almost-noop behaviour in new perls. - plan tests => 3; - my $w; - $SIG{__WARN__} = sub { $w .= shift }; - require encoding::warnings; - ok $w, undef, 'no warning from requiring encoding::warnings'; - ok(encoding::warnings->VERSION); - encoding::warnings->import; - ok $w, qr/^encoding::warnings is not supported /, 'import warning'; - exit; + # Test the new almost-noop behaviour in new perls. + plan tests => 3; + my $w; + $SIG{__WARN__} = sub { $w .= shift }; + require encoding::warnings; + is $w, undef, 'no warning from requiring encoding::warnings'; + ok(encoding::warnings->VERSION); + encoding::warnings->import; + like $w, qr/^encoding::warnings is not supported /, 'import warning'; + exit; } # else continue with your usual scheduled testing... plan tests => 2; Index: gnu/usr.bin/perl/dist/encoding-warnings/t/2-fatal.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/encoding-warnings/t/2-fatal.t,v diff -u -p -a -u -p -r1.2 2-fatal.t --- gnu/usr.bin/perl/dist/encoding-warnings/t/2-fatal.t 13 Feb 2019 21:15:22 -0000 1.2 +++ gnu/usr.bin/perl/dist/encoding-warnings/t/2-fatal.t 21 Feb 2024 15:47:02 -0000 @@ -4,23 +4,23 @@ BEGIN { if ("$]" >= 5.025) { - print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n"; - exit 0; + print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n"; + exit 0; } if (ord("A") != 65) { - print "1..0 # Skip: Encode not working on EBCDIC\n"; - exit 0; + print "1..0 # Skip: Encode not working on EBCDIC\n"; + exit 0; } unless (eval { require Encode } ) { - print "1..0 # Skip: no Encode\n"; - exit 0; + print "1..0 # Skip: no Encode\n"; + exit 0; } } -use Test; -BEGIN { plan tests => 2 } +use Test::More tests => 2; use strict; +use warnings; use encoding::warnings 'FATAL'; ok(encoding::warnings->VERSION); Index: gnu/usr.bin/perl/dist/encoding-warnings/t/3-normal.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/encoding-warnings/t/3-normal.t,v diff -u -p -a -u -p -r1.2 3-normal.t --- gnu/usr.bin/perl/dist/encoding-warnings/t/3-normal.t 13 Feb 2019 21:15:22 -0000 1.2 +++ gnu/usr.bin/perl/dist/encoding-warnings/t/3-normal.t 21 Feb 2024 15:47:02 -0000 @@ -1,14 +1,14 @@ BEGIN { if ("$]" >= 5.025) { - print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n"; - exit 0; + print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n"; + exit 0; } } -use Test; -BEGIN { plan tests => 2 } +use Test::More tests => 2; use strict; +use warnings; use encoding::warnings 'FATAL'; ok(encoding::warnings->VERSION); Index: gnu/usr.bin/perl/dist/encoding-warnings/t/4-lexical.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/encoding-warnings/t/4-lexical.t,v diff -u -p -a -u -p -r1.2 4-lexical.t --- gnu/usr.bin/perl/dist/encoding-warnings/t/4-lexical.t 13 Feb 2019 21:15:22 -0000 1.2 +++ gnu/usr.bin/perl/dist/encoding-warnings/t/4-lexical.t 21 Feb 2024 15:47:02 -0000 @@ -1,22 +1,23 @@ use strict; -use Test; +use warnings; BEGIN { if ("$]" >= 5.025) { - print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n"; - exit 0; + print "1..0 # Skip: encoding::warnings not supported on perl 5.26\n"; + exit 0; } if (ord("A") != 65) { - print "1..0 # Skip: Encode not working on EBCDIC\n"; - exit 0; + print "1..0 # Skip: Encode not working on EBCDIC\n"; + exit 0; } use Config; if ($Config::Config{'extensions'} !~ /\bEncode\b/) { - print "1..0 # Skip: Encode was not built\n"; - exit 0; + print "1..0 # Skip: Encode was not built\n"; + exit 0; } - plan tests => 3; } + +use Test::More tests => 3; { use encoding::warnings; Index: gnu/usr.bin/perl/dist/if/Makefile.PL =================================================================== RCS file: gnu/usr.bin/perl/dist/if/Makefile.PL diff -N gnu/usr.bin/perl/dist/if/Makefile.PL --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/if/Makefile.PL 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,27 @@ +use ExtUtils::MakeMaker; +WriteMakefile( + NAME => 'if', + VERSION_FROM => 'if.pm', # finds $VERSION + ABSTRACT_FROM => 'if.pm', + # core since 5.7.3 + (($] >= 5.007003 && $] < 5.011 ) ? ( + 'INSTALLDIRS' => 'perl') : () + ), + AUTHOR => 'Ilya Zakharevich ', + LICENSE => 'perl_5', + + META_MERGE => { + 'meta-spec' => { version => 2 }, + dynamic_config => 0, + resources => { + repository => { + type => 'git', + url => 'https://github.com/perl/perl5.git', + web => 'https://github.com/perl/perl5', + }, + bugtracker => { + web => 'https://github.com/Perl/perl5/issues', + }, + }, + }, +); Index: gnu/usr.bin/perl/dist/threads/threads.h =================================================================== RCS file: gnu/usr.bin/perl/dist/threads/threads.h diff -N gnu/usr.bin/perl/dist/threads/threads.h Index: gnu/usr.bin/perl/dist/threads/threads.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/threads/threads.xs,v diff -u -p -a -u -p -r1.5 threads.xs --- gnu/usr.bin/perl/dist/threads/threads.xs 15 Feb 2023 01:36:29 -0000 1.5 +++ gnu/usr.bin/perl/dist/threads/threads.xs 21 Feb 2024 15:47:01 -0000 @@ -15,18 +15,20 @@ # define setjmp(x) _setjmp(x) # endif # if defined(__MINGW64__) +# include # define setjmp(x) _setjmpex((x), mingw_getsp()) # endif #endif -#ifdef HAS_PPPORT_H -# define NEED_PL_signals -# define NEED_sv_2pv_flags -# include "ppport.h" -# include "threads.h" -#endif +#define NEED_PL_signals +#define NEED_sv_2pv_flags +#include "ppport.h" +#include "threads.h" #ifndef sv_dup_inc # define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t)) #endif +#ifndef SvREFCNT_dec_NN +# define SvREFCNT_dec_NN(x) SvREFCNT_dec(x) +#endif #ifndef PERL_UNUSED_RESULT # if defined(__GNUC__) && defined(HASATTRIBUTE_WARN_UNUSED_RESULT) # define PERL_UNUSED_RESULT(v) STMT_START { __typeof__(v) z = (v); (void)sizeof(z); } STMT_END @@ -91,8 +93,8 @@ typedef perl_os_thread pthread_t; typedef struct _ithread { struct _ithread *next; /* Next thread in the list */ struct _ithread *prev; /* Prev thread in the list */ - PerlInterpreter *interp; /* The threads interpreter */ - UV tid; /* Threads module's thread id */ + PerlInterpreter *interp; /* The thread's interpreter */ + UV tid; /* Thread's module's thread id */ perl_mutex mutex; /* Mutex for updating things in this struct */ int count; /* Reference count. See S_ithread_create. */ int state; /* Detached, joined, finished, etc. */ @@ -203,6 +205,9 @@ S_ithread_set(pTHX_ ithread *thread) { dMY_CXT; MY_CXT.context = thread; +#ifdef PERL_SET_NON_tTHX_CONTEXT + PERL_SET_NON_tTHX_CONTEXT(thread->interp); +#endif } STATIC ithread * @@ -241,18 +246,31 @@ S_ithread_clear(pTHX_ ithread *thread) S_block_most_signals(&origmask); #endif +#if PERL_VERSION_GE(5, 37, 5) + int save_veto = PL_veto_switch_non_tTHX_context; +#endif + interp = thread->interp; if (interp) { dTHXa(interp); + /* We will pretend to be a thread that we are not by switching tTHX, + * which doesn't work with things that don't rely on tTHX during + * tear-down, as they will tend to rely on a mapping from the tTHX + * structure, and that structure is being destroyed. */ +#if PERL_VERSION_GE(5, 37, 5) + PL_veto_switch_non_tTHX_context = true; +#endif + PERL_SET_CONTEXT(interp); + S_ithread_set(aTHX_ thread); SvREFCNT_dec(thread->params); thread->params = NULL; if (thread->err) { - SvREFCNT_dec(thread->err); + SvREFCNT_dec_NN(thread->err); thread->err = Nullsv; } @@ -262,6 +280,10 @@ S_ithread_clear(pTHX_ ithread *thread) } PERL_SET_CONTEXT(aTHX); +#if PERL_VERSION_GE(5, 37, 5) + PL_veto_switch_non_tTHX_context = save_veto; +#endif + #ifdef THREAD_SIGNAL_BLOCKING S_set_sigmask(&origmask); #endif @@ -807,6 +829,7 @@ S_ithread_create( thread->gimme = gimme; thread->state = exit_opt; + /* "Clone" our interpreter into the thread's interpreter. * This gives thread access to "static data" and code. */ @@ -1034,10 +1057,10 @@ S_ithread_create( MUTEX_UNLOCK(&my_pool->create_destruct_mutex); return (thread); - CLANG_DIAG_IGNORE_STMT(-Wthread-safety); + CLANG_DIAG_IGNORE(-Wthread-safety) /* warning: mutex 'thread->mutex' is not held on every path through here [-Wthread-safety-analysis] */ } -CLANG_DIAG_RESTORE_DECL; +CLANG_DIAG_RESTORE #endif /* USE_ITHREADS */ @@ -1171,6 +1194,7 @@ ithread_create(...) if (! thread) { XSRETURN_UNDEF; /* Mutex already unlocked */ } + PERL_SRAND_OVERRIDE_NEXT_PARENT(); ST(0) = sv_2mortal(S_ithread_to_SV(aTHX_ Nullsv, thread, classname, FALSE)); /* Let thread run. */ @@ -1179,7 +1203,6 @@ ithread_create(...) /* warning: releasing mutex 'thread->mutex' that was not held [-Wthread-safety-analysis] */ MUTEX_UNLOCK(&thread->mutex); CLANG_DIAG_RESTORE_STMT; - /* XSRETURN(1); - implied */ Index: gnu/usr.bin/perl/dist/threads/lib/threads.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/threads/lib/threads.pm,v diff -u -p -a -u -p -r1.5 threads.pm --- gnu/usr.bin/perl/dist/threads/lib/threads.pm 15 Feb 2023 01:36:29 -0000 1.5 +++ gnu/usr.bin/perl/dist/threads/lib/threads.pm 21 Feb 2024 15:47:01 -0000 @@ -5,7 +5,7 @@ use 5.008; use strict; use warnings; -our $VERSION = '2.27'; # remember to update version in POD! +our $VERSION = '2.36'; # remember to update version in POD! my $XS_VERSION = $VERSION; $VERSION = eval $VERSION; @@ -134,7 +134,7 @@ threads - Perl interpreter-based threads =head1 VERSION -This document describes threads version 2.27 +This document describes threads version 2.36 =head1 WARNING @@ -1026,7 +1026,7 @@ signalling behavior is only in effect in =over 4 -=item * Perl has been built with C (see C). +=item * Perl has been built with C (see S>). =item * The environment variable C is set to C (see L). Index: gnu/usr.bin/perl/dist/threads/t/libc.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/threads/t/libc.t,v diff -u -p -a -u -p -r1.1.1.2 libc.t --- gnu/usr.bin/perl/dist/threads/t/libc.t 15 Feb 2023 01:32:56 -0000 1.1.1.2 +++ gnu/usr.bin/perl/dist/threads/t/libc.t 21 Feb 2024 15:47:01 -0000 @@ -9,11 +9,8 @@ BEGIN { skip_all(q/Perl not compiled with 'useithreads'/); } - my $time_out_factor = $ENV{PERL_TEST_TIME_OUT_FACTOR} || 1; - $time_out_factor = 1 if $time_out_factor < 1; - # Guard against bugs that result in deadlock - watchdog(1 * 60 * $time_out_factor); + watchdog(1 * 60); plan(11); } Index: gnu/usr.bin/perl/dist/threads/t/thread.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/threads/t/thread.t,v diff -u -p -a -u -p -r1.3 thread.t --- gnu/usr.bin/perl/dist/threads/t/thread.t 13 Feb 2019 21:15:22 -0000 1.3 +++ gnu/usr.bin/perl/dist/threads/t/thread.t 21 Feb 2024 15:47:01 -0000 @@ -11,6 +11,7 @@ BEGIN { } use ExtUtils::testlib; +use Data::Dumper; use threads; @@ -156,7 +157,8 @@ package main; rand(10); threads->create( sub { $rand{int(rand(10000000000))}++ } ) foreach 1..25; $_->join foreach threads->list; - ok((keys %rand >= 23), "Check that rand() is randomized in new threads"); + ok((keys %rand >= 23), "Check that rand() is randomized in new threads") + or diag Dumper(\%rand); } # bugid #24165 Index: gnu/usr.bin/perl/dist/threads/t/version.t =================================================================== RCS file: gnu/usr.bin/perl/dist/threads/t/version.t diff -N gnu/usr.bin/perl/dist/threads/t/version.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/dist/threads/t/version.t 21 Feb 2024 15:47:01 -0000 @@ -0,0 +1,31 @@ +use strict; +use warnings; +use Test::More; + +BEGIN { + use Config; + if (! $Config{'useithreads'}) { + print("1..0 # SKIP Perl not compiled with 'useithreads'\n"); + exit(0); + } +} + +use threads; + +# test that the version documented in threads.pm pod matches +# that of the code. + +open my $fh, "<", $INC{"threads.pm"} + or die qq(Failed to open '$INC{"threads.pm"}': $!); +my $file= do { local $/; <$fh> }; +close $fh; +my $pod_version = 0; +if ($file=~/This document describes threads version (\d.\d+)/) { + $pod_version = $1; +} +is($pod_version, $threads::VERSION, + "Check that pod and \$threads::VERSION match"); +done_testing(); + + + Index: gnu/usr.bin/perl/dist/threads-shared/shared.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/threads-shared/shared.xs,v diff -u -p -a -u -p -r1.6 shared.xs --- gnu/usr.bin/perl/dist/threads-shared/shared.xs 15 Feb 2023 01:36:29 -0000 1.6 +++ gnu/usr.bin/perl/dist/threads-shared/shared.xs 21 Feb 2024 15:47:02 -0000 @@ -40,7 +40,7 @@ * proxy PVLV element with attached element magic. * * Pointers to the shared SV are squirrelled away in the mg->mg_ptr field - * of magic (with mg_len == 0), and in the IV2PTR(SvIV(sv)) field of tied + * of magic (with mg_len == 0), and in the INT2PTR(SvIV(sv)) field of tied * object SVs. These pointers have to be hidden like this because they * cross interpreter boundaries, and we don't want sv_clear() and friends * following them. @@ -130,14 +130,11 @@ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" -#ifdef HAS_PPPORT_H -# define NEED_sv_2pv_flags -# define NEED_vnewSVpvf -# define NEED_warner -# define NEED_newSVpvn_flags -# include "ppport.h" -# include "shared.h" -#endif +#define NEED_sv_2pv_flags +#define NEED_vnewSVpvf +#define NEED_warner +#define NEED_newSVpvn_flags +#include "ppport.h" #ifndef CLANG_DIAG_IGNORE # define CLANG_DIAG_IGNORE(x) @@ -704,10 +701,10 @@ Perl_sharedsv_cond_timedwait(perl_cond * abs -= (NV)ts.tv_sec; ts.tv_nsec = (long)(abs * 1000000000.0); - CLANG_DIAG_IGNORE_STMT(-Wthread-safety); + CLANG_DIAG_IGNORE(-Wthread-safety) /* warning: calling function 'pthread_cond_timedwait' requires holding mutex 'mut' exclusively [-Wthread-safety-analysis] */ switch (pthread_cond_timedwait(cond, mut, &ts)) { - CLANG_DIAG_RESTORE_STMT; + CLANG_DIAG_RESTORE case 0: got_it = 1; break; case ETIMEDOUT: break; @@ -1145,7 +1142,7 @@ sharedsv_array_mg_CLEAR(pTHX_ SV *sv, MA I32 items = isav ? AvFILLp((AV *)ssv) + 1 : 0; HE *iter; if (!isav) hv_iterinit((HV *)ssv); - while (isav ? items-- : !!(iter = hv_iternext((HV *)ssv))) { + while (isav ? items-- : cBOOL(iter = hv_iternext((HV *)ssv))) { SV *sv = isav ? *svp++ : HeVAL(iter); if (!sv) continue; if ( (SvOBJECT(sv) || (SvROK(sv) && (sv = SvRV(sv)))) Index: gnu/usr.bin/perl/dist/threads-shared/lib/threads/shared.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/dist/threads-shared/lib/threads/shared.pm,v diff -u -p -a -u -p -r1.6 shared.pm --- gnu/usr.bin/perl/dist/threads-shared/lib/threads/shared.pm 15 Feb 2023 01:36:29 -0000 1.6 +++ gnu/usr.bin/perl/dist/threads-shared/lib/threads/shared.pm 21 Feb 2024 15:47:02 -0000 @@ -8,7 +8,7 @@ use Config; use Scalar::Util qw(reftype refaddr blessed); -our $VERSION = '1.64'; # Please update the pod, too. +our $VERSION = '1.68'; # Please update the pod, too. my $XS_VERSION = $VERSION; $VERSION = eval $VERSION; @@ -196,7 +196,7 @@ threads::shared - Perl extension for sha =head1 VERSION -This document describes threads::shared version 1.64 +This document describes threads::shared version 1.68 =head1 SYNOPSIS Index: gnu/usr.bin/perl/ext/B/B.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/B/B.pm,v diff -u -p -a -u -p -r1.6 B.pm --- gnu/usr.bin/perl/ext/B/B.pm 15 Feb 2023 01:36:30 -0000 1.6 +++ gnu/usr.bin/perl/ext/B/B.pm 21 Feb 2024 15:47:02 -0000 @@ -20,7 +20,7 @@ sub import { # walkoptree comes from B.xs BEGIN { - $B::VERSION = '1.83'; + $B::VERSION = '1.88'; @B::EXPORT_OK = (); # Our BOOT code needs $VERSION set, and will append to @EXPORT_OK. @@ -62,6 +62,7 @@ push @B::EXPORT_OK, (qw(minus_c ppname s @B::CV::ISA = 'B::PVMG'; @B::IO::ISA = 'B::PVMG'; @B::FM::ISA = 'B::CV'; +@B::OBJ::ISA = 'B::PVMG'; @B::OP::ISA = 'B::OBJECT'; @B::UNOP::ISA = 'B::OP'; @@ -88,6 +89,12 @@ our @specialsv_name = qw(Nullsv &PL_sv_u (SV*)pWARN_ALL (SV*)pWARN_NONE (SV*)pWARN_STD &PL_sv_zero); +# Back-compat +{ + no warnings 'once'; + *CVf_METHOD = \&CVf_NOWARN_AMBIGUOUS; +} + { # Stop "-w" from complaining about the lack of a real B::OBJECT class package B::OBJECT; @@ -299,7 +306,7 @@ B - The Perl Compiler Backend The C module supplies classes which allow a Perl program to delve into its own innards. It is the module used to implement the "backends" of the Perl compiler. Usage of the compiler does not -require knowledge of this module: see the F module for the +require knowledge of this module: see the L module for the user-visible part. The C module is of use to those who want to write new compiler backends. This documentation assumes that the reader knows a fair amount about perl's internals including such @@ -593,6 +600,26 @@ C (corresponding to the C functi =item FLAGS +=item IsBOOL + +Returns true if the SV is a boolean (true or false). +You can then use C to check if the value is true or false. + + my $something = ( 1 == 1 ) # boolean true + || ( 1 == 0 ) # boolean false + || 42 # IV true + || 0; # IV false + my $sv = B::svref_2object(\$something); + + say q[Not a boolean value] + if ! $sv->IsBOOL; + + say q[This is a boolean with value: true] + if $sv->IsBOOL && $sv->TRUE_nomg; + + say q[This is a boolean with value: false] + if $sv->IsBOOL && ! $sv->TRUE_nomg; + =item object_2svref Returns a reference to the regular scalar corresponding to this @@ -601,6 +628,24 @@ to the svref_2object() subroutine. This at should be considered read-only: modifying them is neither safe nor guaranteed to have a sensible effect. +=item TRUE + +Returns a boolean indicating hether Perl would evaluate the SV as true or +false. + +B this call performs 'get' magic. If you only want to check the +nature of this SV use C helper. + +This is an alias for C. + +=item TRUE_nomg + +Check if the value is true (do not perform 'get' magic). +Returns a boolean indicating whether Perl would evaluate the SV as true or +false. + +This is an alias for C. + =back =head2 B::IV Methods @@ -1313,6 +1358,8 @@ pointers and B::PADNAME objects otherwis =item REFCNT +=item GEN + =item FLAGS For backward-compatibility, if the PADNAMEt_OUTER flag is set, the FLAGS @@ -1348,6 +1395,10 @@ Only meaningful if PADNAMEt_OUTER is set =item PARENT_FAKELEX_FLAGS Only meaningful if PADNAMEt_OUTER is set. + +=item IsUndef + +Returns a boolean value to check if the padname is PL_padname_undef. =back Index: gnu/usr.bin/perl/ext/B/B.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/B/B.xs,v diff -u -p -a -u -p -r1.6 B.xs --- gnu/usr.bin/perl/ext/B/B.xs 15 Feb 2023 01:36:30 -0000 1.6 +++ gnu/usr.bin/perl/ext/B/B.xs 21 Feb 2024 15:47:02 -0000 @@ -40,6 +40,7 @@ static const char* const svclassnames[] "B::CV", "B::FM", "B::IO", + "B::OBJ", }; @@ -188,7 +189,7 @@ make_temp_object(pTHX_ SV *temp) static SV * make_warnings_object(pTHX_ const COP *const cop) { - const STRLEN *const warnings = cop->cop_warnings; + const char *const warnings = cop->cop_warnings; const char *type = 0; dMY_CXT; IV iv = sizeof(specialsv_list)/sizeof(SV*); @@ -210,7 +211,7 @@ make_warnings_object(pTHX_ const COP *co } else { /* B assumes that warnings are a regular SV. Seems easier to keep it happy by making them into a regular SV. */ - return make_temp_object(aTHX_ newSVpvn((char *)(warnings + 1), *warnings)); + return make_temp_object(aTHX_ newSVpvn(warnings, RCPV_LEN(warnings))); } } @@ -547,7 +548,7 @@ static const struct OP_methods { #ifdef USE_ITHREADS { STR_WITH_LEN("pmoffset"),IVp, STRUCT_OFFSET(struct pmop, op_pmoffset),},/*20*/ { STR_WITH_LEN("filegv"), op_offset_special, 0, },/*21*/ - { STR_WITH_LEN("file"), char_pp, STRUCT_OFFSET(struct cop, cop_file), },/*22*/ + { STR_WITH_LEN("file"), char_pp, STRUCT_OFFSET(struct cop, cop_file), }, /*22*/ { STR_WITH_LEN("stash"), op_offset_special, 0, },/*23*/ { STR_WITH_LEN("stashpv"), op_offset_special, 0, },/*24*/ { STR_WITH_LEN("stashoff"),PADOFFSETp,STRUCT_OFFSET(struct cop,cop_stashoff),},/*25*/ @@ -703,8 +704,8 @@ walkoptree_debug(...) CODE: dMY_CXT; RETVAL = walkoptree_debug; - if (items > 0 && SvTRUE(ST(1))) - walkoptree_debug = 1; + if (items > 0) + walkoptree_debug = SvTRUE(ST(0)); OUTPUT: RETVAL @@ -902,11 +903,9 @@ next(o) ret = make_sv_object(aTHX_ (SV *)CopFILEGV((COP*)o)); break; #endif -#ifndef USE_ITHREADS case 22: /* B::COP::file */ ret = sv_2mortal(newSVpv(CopFILE((COP*)o), 0)); break; -#endif #ifdef USE_ITHREADS case 23: /* B::COP::stash */ ret = make_sv_object(aTHX_ (SV *)CopSTASH((COP*)o)); @@ -1072,13 +1071,13 @@ next(o) */ ret = make_op_object(aTHX_ o->op_type == OP_METHOD - ? cMETHOPx(o)->op_u.op_first : NULL); + ? cMETHOPo->op_u.op_first : NULL); break; case 54: /* B::METHOP::meth_sv */ /* see comment above about METHOP */ ret = make_sv_object(aTHX_ o->op_type == OP_METHOD - ? NULL : cMETHOPx(o)->op_u.op_meth_sv); + ? NULL : cMETHOPo->op_u.op_meth_sv); break; case 55: /* B::PMOP::pmregexp */ ret = make_sv_object(aTHX_ (SV *)PM_GETRE(cPMOPo)); @@ -1088,13 +1087,13 @@ next(o) ret = sv_2mortal(newSVuv( (o->op_type == OP_METHOD_REDIR || o->op_type == OP_METHOD_REDIR_SUPER) ? - cMETHOPx(o)->op_rclass_targ : 0 + cMETHOPo->op_rclass_targ : 0 )); #else ret = make_sv_object(aTHX_ (o->op_type == OP_METHOD_REDIR || o->op_type == OP_METHOD_REDIR_SUPER) ? - cMETHOPx(o)->op_rclass_sv : NULL + cMETHOPo->op_rclass_sv : NULL ); #endif break; @@ -1398,12 +1397,12 @@ aux_list(o, cv) -MODULE = B PACKAGE = B::SV +MODULE = B PACKAGE = B::SV PREFIX = Sv #define MAGICAL_FLAG_BITS (SVs_GMG|SVs_SMG|SVs_RMG) U32 -REFCNT(sv) +SvREFCNT(sv) B::SV sv ALIAS: FLAGS = 0xFFFFFFFF @@ -1417,11 +1416,23 @@ REFCNT(sv) RETVAL void -object_2svref(sv) +Svobject_2svref(sv) B::SV sv PPCODE: ST(0) = sv_2mortal(newRV(sv)); XSRETURN(1); + +bool +SvIsBOOL(sv) + B::SV sv + +bool +SvTRUE(sv) + B::SV sv + +bool +SvTRUE_nomg(sv) + B::SV sv MODULE = B PACKAGE = B::IV PREFIX = Sv @@ -2252,6 +2263,8 @@ MODULE = B PACKAGE = B::PADNAME PREFIX = sv_U32p | STRUCT_OFFSET(struct padname, xpadn_low) #define PN_cop_seq_range_high_ix \ sv_U32p | STRUCT_OFFSET(struct padname, xpadn_high) +#define PN_xpadn_gen_ix \ + sv_I32p | STRUCT_OFFSET(struct padname, xpadn_gen) #define PNL_refcnt_ix \ sv_U32p | STRUCT_OFFSET(struct padnamelist, xpadnl_refcnt) #define PL_id_ix \ @@ -2259,7 +2272,6 @@ MODULE = B PACKAGE = B::PADNAME PREFIX = #define PL_outid_ix \ sv_U32p | STRUCT_OFFSET(struct padlist, xpadl_outid) - void PadnameTYPE(pn) B::PADNAME pn @@ -2270,6 +2282,7 @@ PadnameTYPE(pn) B::PADNAME::REFCNT = PN_refcnt_ix B::PADNAME::COP_SEQ_RANGE_LOW = PN_cop_seq_range_low_ix B::PADNAME::COP_SEQ_RANGE_HIGH = PN_cop_seq_range_high_ix + B::PADNAME::GEN = PN_xpadn_gen_ix B::PADNAMELIST::REFCNT = PNL_refcnt_ix B::PADLIST::id = PL_id_ix B::PADLIST::outid = PL_outid_ix @@ -2305,6 +2318,14 @@ PadnamePV(pn) SvUTF8_on(TARG); XPUSHTARG; +bool +PadnameIsUndef(padn) + B::PADNAME padn + CODE: + RETVAL = padn == &PL_padname_undef; + OUTPUT: + RETVAL + BOOT: { /* Uses less memory than an ALIAS. */ @@ -2329,7 +2350,7 @@ PadnameFLAGS(pn) RETVAL = PadnameFLAGS(pn); /* backward-compatibility hack, which should be removed if the flags field becomes large enough to hold SVf_FAKE (and - PADNAMEt_OUTER should be renumbered to match SVf_FAKE) */ + PADNAMEf_OUTER should be renumbered to match SVf_FAKE) */ STATIC_ASSERT_STMT(SVf_FAKE >= 1<<(sizeof(PadnameFLAGS((B__PADNAME)NULL)) * 8)); if (PadnameOUTER(pn)) RETVAL |= SVf_FAKE; Index: gnu/usr.bin/perl/ext/B/Makefile.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/B/Makefile.PL,v diff -u -p -a -u -p -r1.3 Makefile.PL --- gnu/usr.bin/perl/ext/B/Makefile.PL 15 Feb 2023 01:36:30 -0000 1.3 +++ gnu/usr.bin/perl/ext/B/Makefile.PL 21 Feb 2024 15:47:02 -0000 @@ -30,7 +30,7 @@ foreach my $tuple (['cop.h'], ['op.h'], ['opcode.h', 'OPp'], ['op_reg_common.h','(?:(?:RXf_)?PMf_)'], - ['pad.h','PADNAMEt_'], + ['pad.h','PADNAMEf_'], ['regexp.h','RXf_'], ['sv.h', 'SV(?:[fps]|pad)_'], ) { Index: gnu/usr.bin/perl/ext/B/B/Concise.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/B/B/Concise.pm,v diff -u -p -a -u -p -r1.16 Concise.pm --- gnu/usr.bin/perl/ext/B/B/Concise.pm 15 Feb 2023 01:36:30 -0000 1.16 +++ gnu/usr.bin/perl/ext/B/B/Concise.pm 21 Feb 2024 15:47:02 -0000 @@ -14,7 +14,7 @@ use warnings; # uses #3 and #4, since wa use Exporter 'import'; # use #5 -our $VERSION = "1.006"; +our $VERSION = "1.007"; our @EXPORT_OK = qw( set_style set_style_standard add_callback concise_subref concise_cv concise_main add_style walk_output compile reset_sequence ); @@ -1488,6 +1488,11 @@ Private flags, if any are set for an opc They're opcode specific, and occur less often than the public ones, so they're represented by short mnemonics instead of single-chars; see B::Op_private and F for more details. + +Note that a number after a '/' often indicates the number of arguments. +In the I example above, the OP takes 2 arguments. These values +are sometimes used at runtime: in particular, the MAXARG macro makes use +of them. =head1 FORMATTING SPECIFICATIONS Index: gnu/usr.bin/perl/ext/B/t/b.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/B/t/b.t,v diff -u -p -a -u -p -r1.5 b.t --- gnu/usr.bin/perl/ext/B/t/b.t 1 Mar 2021 23:19:55 -0000 1.5 +++ gnu/usr.bin/perl/ext/B/t/b.t 21 Feb 2024 15:47:02 -0000 @@ -306,7 +306,7 @@ is(B::opnumber("pp_null"), 0, "Testing o is(B::class(bless {}, "Wibble::Bibble"), "Bibble", "Testing B::class()"); is(B::cast_I32(3.14), 3, "Testing B::cast_I32()"); -is(B::opnumber("chop"), 38, "Testing opnumber with opname (chop)"); +is(B::opnumber("chop"), 39, "Testing opnumber with opname (chop)"); { no warnings 'once'; Index: gnu/usr.bin/perl/ext/B/t/bool.t =================================================================== RCS file: gnu/usr.bin/perl/ext/B/t/bool.t diff -N gnu/usr.bin/perl/ext/B/t/bool.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/ext/B/t/bool.t 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,59 @@ +#!./perl + +BEGIN { + unshift @INC, 't'; + require Config; + if (($Config::Config{'extensions'} !~ /\bB\b/) ){ + print "1..0 # Skip -- Perl configured without B module\n"; + exit 0; + } +} + +use strict; +use warnings; + +use B; +use Test::More; + +$| = 1; + +{ + note "testing true"; + my $bool = ( 1 == 1 ); + my $sv = B::svref_2object(\$bool); + ok $sv->IsBOOL, "got a boolean"; + ok $sv->TRUE_nomg, "TRUE_nomg is true"; + ok $sv->TRUE, "TRUE is true"; +} + +{ + note "testing false"; + my $bool = ( 1 == 0 ); + my $sv = B::svref_2object(\$bool); + + ok $sv->IsBOOL, "got a boolean"; + ok !$sv->TRUE_nomg, "TRUE_nomg is false"; + ok !$sv->TRUE, "TRUE is false"; +} + +{ + note "not a boolean"; + my $iv = 42; + my $sv = B::svref_2object(\$iv); + + ok !$sv->IsBOOL, "not a boolean"; + ok $sv->TRUE_nomg, "TRUE_nomg is true"; + ok $sv->TRUE, "TRUE is true"; +} + +{ + note "not a boolean"; + my $iv = 0; + my $sv = B::svref_2object(\$iv); + + ok !$sv->IsBOOL, "not a boolean"; + ok !$sv->TRUE_nomg, "TRUE_nomg is false"; + ok !$sv->TRUE, "TRUE is false"; +} + +done_testing(); Index: gnu/usr.bin/perl/ext/B/t/optree_concise.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/B/t/optree_concise.t,v diff -u -p -a -u -p -r1.5 optree_concise.t --- gnu/usr.bin/perl/ext/B/t/optree_concise.t 15 Feb 2023 01:36:30 -0000 1.5 +++ gnu/usr.bin/perl/ext/B/t/optree_concise.t 21 Feb 2024 15:47:02 -0000 @@ -178,13 +178,13 @@ checkOptree ( name => "terse basic", UNOP (0x82b0918) leavesub [1] LISTOP (0x82b08d8) lineseq COP (0x82b0880) nextstate - UNOP (0x82b0860) null [14] + UNOP (0x82b0860) null [15] PADOP (0x82b0840) gvsv GV (0x82a818c) *a EOT_EOT # UNOP (0x8282310) leavesub [1] # LISTOP (0x82822f0) lineseq # COP (0x82822b8) nextstate -# UNOP (0x812fc20) null [14] +# UNOP (0x812fc20) null [15] # SVOP (0x812fc00) gvsv GV (0x814692c) *a EONT_EONT Index: gnu/usr.bin/perl/ext/B/t/optree_samples.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/B/t/optree_samples.t,v diff -u -p -a -u -p -r1.5 optree_samples.t --- gnu/usr.bin/perl/ext/B/t/optree_samples.t 15 Feb 2023 01:36:30 -0000 1.5 +++ gnu/usr.bin/perl/ext/B/t/optree_samples.t 21 Feb 2024 15:47:02 -0000 @@ -67,49 +67,49 @@ checkOptree ( name => '-basic (see above }, strip_open_hints => 1, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); -# b <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->b +# a <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->a # 1 <;> nextstate(main 666 optree_samples.t:70) v:>,<,% ->2 -# 4 <2> sassign vKS/2 ->5 +# 3 <1> padsv_store[$a:666,670] vKS/LVINTRO ->4 # 2 <0> shift s* ->3 -# 3 <0> padsv[$a:666,670] sRM*/LVINTRO ->4 -# 5 <;> nextstate(main 670 optree_samples.t:71) v:>,<,% ->6 +# - <0> ex-padsv sRM*/LVINTRO ->3 +# 4 <;> nextstate(main 670 optree_samples.t:71) v:>,<,% ->5 # - <1> null K/1 ->- -# 7 <|> cond_expr(other->8) K/1 ->c -# 6 <0> padsv[$a:666,670] s ->7 +# 6 <|> cond_expr(other->7) K/1 ->b +# 5 <0> padsv[$a:666,670] s ->6 # - <@> scope K ->- -# - <;> ex-nextstate(main 1603 optree_samples.t:70) v:>,<,% ->8 -# a <@> print sK ->b -# 8 <0> pushmark s ->9 -# 9 <$> const[PV "foo"] s ->a -# h <@> leave KP ->b -# c <0> enter ->d -# d <;> nextstate(main 668 optree_samples.t:72) v:>,<,% ->e -# g <@> print sK ->h -# e <0> pushmark s ->f -# f <$> const[PV "bar"] s ->g +# - <;> ex-nextstate(main 1510 optree_samples.t:66) v:>,<,% ->7 +# 9 <@> print sK ->a +# 7 <0> pushmark s ->8 +# 8 <$> const[PV "foo"] s ->9 +# g <@> leave KP ->a +# b <0> enter ->c +# c <;> nextstate(main 1510 optree_samples.t:66) v:>,<,% ->d +# f <@> print sK ->g +# d <0> pushmark s ->e +# e <$> const[PV "bar"] s ->f EOT_EOT -# b <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->b -# 1 <;> nextstate(main 666 optree_samples.t:72) v:>,<,% ->2 -# 4 <2> sassign vKS/2 ->5 +# a <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->a +# 1 <;> nextstate(main 666 optree_samples.t:70) v:>,<,% ->2 +# 3 <1> padsv_store[$a:666,670] vKS/LVINTRO ->4 # 2 <0> shift s* ->3 -# 3 <0> padsv[$a:666,670] sRM*/LVINTRO ->4 -# 5 <;> nextstate(main 670 optree_samples.t:73) v:>,<,% ->6 +# - <0> ex-padsv sRM*/LVINTRO ->3 +# 4 <;> nextstate(main 670 optree_samples.t:71) v:>,<,% ->5 # - <1> null K/1 ->- -# 7 <|> cond_expr(other->8) K/1 ->c -# 6 <0> padsv[$a:666,670] s ->7 +# 6 <|> cond_expr(other->7) K/1 ->b +# 5 <0> padsv[$a:666,670] s ->6 # - <@> scope K ->- -# - <;> ex-nextstate(main 1603 optree_samples.t:70) v:>,<,% ->8 -# a <@> print sK ->b -# 8 <0> pushmark s ->9 -# 9 <$> const(PV "foo") s ->a -# h <@> leave KP ->b -# c <0> enter ->d -# d <;> nextstate(main 668 optree_samples.t:74) v:>,<,% ->e -# g <@> print sK ->h -# e <0> pushmark s ->f -# f <$> const(PV "bar") s ->g +# - <;> ex-nextstate(main 1510 optree_samples.t:70) v:>,<,% ->7 +# 9 <@> print sK ->a +# 7 <0> pushmark s ->8 +# 8 <$> const(PV "foo") s ->9 +# g <@> leave KP ->a +# b <0> enter ->c +# c <;> nextstate(main 668 optree_samples.t:72) v:>,<,% ->d +# f <@> print sK ->g +# d <0> pushmark s ->e +# e <$> const(PV "bar") s ->f EONT_EONT checkOptree ( name => '-exec sub {if shift print then,else}', @@ -160,41 +160,39 @@ checkOptree ( name => '-exec (see above, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); # 1 <;> nextstate(main 675 optree_samples.t:165) v:>,<,% # 2 <0> shift s* -# 3 <0> padsv[$a:675,679] sRM*/LVINTRO -# 4 <2> sassign vKS/2 -# 5 <;> nextstate(main 679 optree_samples.t:166) v:>,<,% -# 6 <0> padsv[$a:675,679] s -# 7 <|> cond_expr(other->8) K/1 -# 8 <0> pushmark s -# 9 <$> const[PV "foo"] s -# a <@> print sK -# goto b -# c <0> enter -# d <;> nextstate(main 677 optree_samples.t:167) v:>,<,% -# e <0> pushmark s -# f <$> const[PV "bar"] s -# g <@> print sK -# h <@> leave KP -# b <1> leavesub[1 ref] K/REFC,1 +# 3 <1> padsv_store[$a:1522,1529] vKS/LVINTRO +# 4 <;> nextstate(main 679 optree_samples.t:166) v:>,<,% +# 5 <0> padsv[$a:675,679] s +# 6 <|> cond_expr(other->7) K/1 +# 7 <0> pushmark s +# 8 <$> const[PV "foo"] s +# 9 <@> print sK +# goto a +# b <0> enter +# c <;> nextstate(main 677 optree_samples.t:167) v:>,<,% +# d <0> pushmark s +# e <$> const[PV "bar"] s +# f <@> print sK +# g <@> leave KP +# a <1> leavesub[1 ref] K/REFC,1 EOT_EOT # 1 <;> nextstate(main 675 optree_samples.t:171) v:>,<,% # 2 <0> shift s* -# 3 <0> padsv[$a:675,679] sRM*/LVINTRO -# 4 <2> sassign vKS/2 -# 5 <;> nextstate(main 679 optree_samples.t:172) v:>,<,% -# 6 <0> padsv[$a:675,679] s -# 7 <|> cond_expr(other->8) K/1 -# 8 <0> pushmark s -# 9 <$> const(PV "foo") s -# a <@> print sK -# goto b -# c <0> enter -# d <;> nextstate(main 677 optree_samples.t:173) v:>,<,% -# e <0> pushmark s -# f <$> const(PV "bar") s -# g <@> print sK -# h <@> leave KP -# b <1> leavesub[1 ref] K/REFC,1 +# 3 <1> padsv_store[$a:1522,1529] vKS/LVINTRO +# 4 <;> nextstate(main 679 optree_samples.t:172) v:>,<,% +# 5 <0> padsv[$a:675,679] s +# 6 <|> cond_expr(other->7) K/1 +# 7 <0> pushmark s +# 8 <$> const(PV "foo") s +# 9 <@> print sK +# goto a +# b <0> enter +# c <;> nextstate(main 677 optree_samples.t:173) v:>,<,% +# d <0> pushmark s +# e <$> const(PV "bar") s +# f <@> print sK +# g <@> leave KP +# a <1> leavesub[1 ref] K/REFC,1 EONT_EONT checkOptree ( name => '-exec sub { print (shift) ? "foo" : "bar" }', Index: gnu/usr.bin/perl/ext/B/t/optree_specials.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/B/t/optree_specials.t,v diff -u -p -a -u -p -r1.4 optree_specials.t --- gnu/usr.bin/perl/ext/B/t/optree_specials.t 15 Feb 2023 01:36:30 -0000 1.4 +++ gnu/usr.bin/perl/ext/B/t/optree_specials.t 21 Feb 2024 15:47:02 -0000 @@ -53,7 +53,7 @@ checkOptree ( name => 'BEGIN', # - <;> ex-nextstate(Exporter::Heavy -1410 Heavy.pm:4) v:*,&,{,x*,x&,x$,$ ->4 # - <@> lineseq K ->- # 4 <;> nextstate(Exporter::Heavy -1410 Heavy.pm:4) :*,&,{,x*,x&,x$,$ ->5 -# 9 <1> entersub[t1] KRS*/TARG,STRICT ->a +# 9 <1> entersub[t1] KRS/TARG,STRICT ->a # 5 <0> pushmark s ->6 # 6 <$> const[PV "strict"] sM ->7 # 7 <$> const[PV "refs"] sM ->8 @@ -67,7 +67,7 @@ checkOptree ( name => 'BEGIN', # - <;> ex-nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$ ->e # - <@> lineseq K ->- # e <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) :*,&,{,x*,x&,x$ ->f -# j <1> entersub[t1] KRS*/TARG ->k +# j <1> entersub[t1] KRS/TARG ->k # f <0> pushmark s ->g # g <$> const[PV "warnings"] sM ->h # h <$> const[PV "once"] sM ->i @@ -92,7 +92,7 @@ checkOptree ( name => 'BEGIN', # - <;> ex-nextstate(B::Concise -1134 Concise.pm:183) v:*,&,x*,x&,x$,$ ->v # - <@> lineseq K ->- # v <;> nextstate(B::Concise -1134 Concise.pm:183) :*,&,x*,x&,x$,$ ->w -# 10 <1> entersub[t1] KRS*/TARG,STRICT ->11 +# 10 <1> entersub[t1] KRS/TARG,STRICT ->11 # w <0> pushmark s ->x # x <$> const[PV "strict"] sM ->y # y <$> const[PV "refs"] sM ->z @@ -106,7 +106,7 @@ checkOptree ( name => 'BEGIN', # - <;> ex-nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$ ->15 # - <@> lineseq K ->- # 15 <;> nextstate(B::Concise -1031 Concise.pm:305) :*,&,x*,x&,x$,$ ->16 -# 1a <1> entersub[t1] KRS*/TARG,STRICT ->1b +# 1a <1> entersub[t1] KRS/TARG,STRICT ->1b # 16 <0> pushmark s ->17 # 17 <$> const[PV "strict"] sM ->18 # 18 <$> const[PV "refs"] sM ->19 @@ -120,7 +120,7 @@ checkOptree ( name => 'BEGIN', # - <;> ex-nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$ ->1f # - <@> lineseq K ->- # 1f <;> nextstate(B::Concise -984 Concise.pm:370) :*,&,{,x*,x&,x$,$ ->1g -# 1k <1> entersub[t1] KRS*/TARG,STRICT ->1l +# 1k <1> entersub[t1] KRS/TARG,STRICT ->1l # 1g <0> pushmark s ->1h # 1h <$> const[PV "strict"] sM ->1i # 1i <$> const[PV "refs"] sM ->1j @@ -134,7 +134,7 @@ checkOptree ( name => 'BEGIN', # - <;> ex-nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$ ->1p # - <@> lineseq K ->- # 1p <;> nextstate(B::Concise -959 Concise.pm:390) :*,&,x*,x&,x$,$ ->1q -# 1u <1> entersub[t1] KRS*/TARG,STRICT ->1v +# 1u <1> entersub[t1] KRS/TARG,STRICT ->1v # 1q <0> pushmark s ->1r # 1r <$> const[PV "strict"] sM ->1s # 1s <$> const[PV "refs"] sM ->1t @@ -148,7 +148,7 @@ checkOptree ( name => 'BEGIN', # - <;> ex-nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$ ->1z # - <@> lineseq K ->- # 1z <;> nextstate(B::Concise -945 Concise.pm:410) :*,&,{,x*,x&,x$,$ ->20 -# 24 <1> entersub[t1] KRS*/TARG,STRICT ->25 +# 24 <1> entersub[t1] KRS/TARG,STRICT ->25 # 20 <0> pushmark s ->21 # 21 <$> const[PV "warnings"] sM ->22 # 22 <$> const[PV "qw"] sM ->23 @@ -170,7 +170,7 @@ EOT_EOT # - <;> ex-nextstate(Exporter::Heavy -1410 Heavy.pm:4) v:*,&,{,x*,x&,x$,$ ->4 # - <@> lineseq K ->- # 4 <;> nextstate(Exporter::Heavy -1410 Heavy.pm:4) :*,&,{,x*,x&,x$,$ ->5 -# 9 <1> entersub[t1] KRS*/TARG,STRICT ->a +# 9 <1> entersub[t1] KRS/TARG,STRICT ->a # 5 <0> pushmark s ->6 # 6 <$> const(PV "strict") sM ->7 # 7 <$> const(PV "refs") sM ->8 @@ -184,7 +184,7 @@ EOT_EOT # - <;> ex-nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$ ->e # - <@> lineseq K ->- # e <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) :*,&,{,x*,x&,x$ ->f -# j <1> entersub[t1] KRS*/TARG ->k +# j <1> entersub[t1] KRS/TARG ->k # f <0> pushmark s ->g # g <$> const(PV "warnings") sM ->h # h <$> const(PV "once") sM ->i @@ -209,7 +209,7 @@ EOT_EOT # - <;> ex-nextstate(B::Concise -1134 Concise.pm:183) v:*,&,x*,x&,x$,$ ->v # - <@> lineseq K ->- # v <;> nextstate(B::Concise -1134 Concise.pm:183) :*,&,x*,x&,x$,$ ->w -# 10 <1> entersub[t1] KRS*/TARG,STRICT ->11 +# 10 <1> entersub[t1] KRS/TARG,STRICT ->11 # w <0> pushmark s ->x # x <$> const(PV "strict") sM ->y # y <$> const(PV "refs") sM ->z @@ -223,7 +223,7 @@ EOT_EOT # - <;> ex-nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$ ->15 # - <@> lineseq K ->- # 15 <;> nextstate(B::Concise -1031 Concise.pm:305) :*,&,x*,x&,x$,$ ->16 -# 1a <1> entersub[t1] KRS*/TARG,STRICT ->1b +# 1a <1> entersub[t1] KRS/TARG,STRICT ->1b # 16 <0> pushmark s ->17 # 17 <$> const(PV "strict") sM ->18 # 18 <$> const(PV "refs") sM ->19 @@ -237,7 +237,7 @@ EOT_EOT # - <;> ex-nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$ ->1f # - <@> lineseq K ->- # 1f <;> nextstate(B::Concise -984 Concise.pm:370) :*,&,{,x*,x&,x$,$ ->1g -# 1k <1> entersub[t1] KRS*/TARG,STRICT ->1l +# 1k <1> entersub[t1] KRS/TARG,STRICT ->1l # 1g <0> pushmark s ->1h # 1h <$> const(PV "strict") sM ->1i # 1i <$> const(PV "refs") sM ->1j @@ -251,7 +251,7 @@ EOT_EOT # - <;> ex-nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$ ->1p # - <@> lineseq K ->- # 1p <;> nextstate(B::Concise -959 Concise.pm:390) :*,&,x*,x&,x$,$ ->1q -# 1u <1> entersub[t1] KRS*/TARG,STRICT ->1v +# 1u <1> entersub[t1] KRS/TARG,STRICT ->1v # 1q <0> pushmark s ->1r # 1r <$> const(PV "strict") sM ->1s # 1s <$> const(PV "refs") sM ->1t @@ -265,7 +265,7 @@ EOT_EOT # - <;> ex-nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$ ->1z # - <@> lineseq K ->- # 1z <;> nextstate(B::Concise -945 Concise.pm:410) :*,&,{,x*,x&,x$,$ ->20 -# 24 <1> entersub[t1] KRS*/TARG,STRICT ->25 +# 24 <1> entersub[t1] KRS/TARG,STRICT ->25 # 20 <0> pushmark s ->21 # 21 <$> const(PV "warnings") sM ->22 # 22 <$> const(PV "qw") sM ->23 @@ -382,7 +382,7 @@ checkOptree ( name => 'all of BEGIN END # 6 <$> const[PV "strict"] sM # 7 <$> const[PV "refs"] sM # 8 <.> method_named[PV "unimport"] -# 9 <1> entersub[t1] KRS*/TARG,STRICT +# 9 <1> entersub[t1] KRS/TARG,STRICT # a <1> leavesub[1 ref] K/REFC,1 # BEGIN 2: # b <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$ @@ -393,7 +393,7 @@ checkOptree ( name => 'all of BEGIN END # g <$> const[PV "warnings"] sM # h <$> const[PV "once"] sM # i <.> method_named[PV "unimport"] -# j <1> entersub[t1] KRS*/TARG +# j <1> entersub[t1] KRS/TARG # k <1> leavesub[1 ref] K/REFC,1 # BEGIN 3: # l <;> nextstate(B::Concise -1175 Concise.pm:117) v:*,&,{,x*,x&,x$,$ @@ -412,7 +412,7 @@ checkOptree ( name => 'all of BEGIN END # x <$> const[PV "strict"] sM # y <$> const[PV "refs"] sM # z <.> method_named[PV "unimport"] -# 10 <1> entersub[t1] KRS*/TARG,STRICT +# 10 <1> entersub[t1] KRS/TARG,STRICT # 11 <1> leavesub[1 ref] K/REFC,1 # BEGIN 5: # 12 <;> nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$ @@ -423,7 +423,7 @@ checkOptree ( name => 'all of BEGIN END # 17 <$> const[PV "strict"] sM # 18 <$> const[PV "refs"] sM # 19 <.> method_named[PV "unimport"] -# 1a <1> entersub[t1] KRS*/TARG,STRICT +# 1a <1> entersub[t1] KRS/TARG,STRICT # 1b <1> leavesub[1 ref] K/REFC,1 # BEGIN 6: # 1c <;> nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$ @@ -434,7 +434,7 @@ checkOptree ( name => 'all of BEGIN END # 1h <$> const[PV "strict"] sM # 1i <$> const[PV "refs"] sM # 1j <.> method_named[PV "unimport"] -# 1k <1> entersub[t1] KRS*/TARG,STRICT +# 1k <1> entersub[t1] KRS/TARG,STRICT # 1l <1> leavesub[1 ref] K/REFC,1 # BEGIN 7: # 1m <;> nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$ @@ -445,7 +445,7 @@ checkOptree ( name => 'all of BEGIN END # 1r <$> const[PV "strict"] sM # 1s <$> const[PV "refs"] sM # 1t <.> method_named[PV "unimport"] -# 1u <1> entersub[t1] KRS*/TARG,STRICT +# 1u <1> entersub[t1] KRS/TARG,STRICT # 1v <1> leavesub[1 ref] K/REFC,1 # BEGIN 8: # 1w <;> nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$ @@ -456,7 +456,7 @@ checkOptree ( name => 'all of BEGIN END # 21 <$> const[PV "warnings"] sM # 22 <$> const[PV "qw"] sM # 23 <.> method_named[PV "unimport"] -# 24 <1> entersub[t1] KRS*/TARG,STRICT +# 24 <1> entersub[t1] KRS/TARG,STRICT # 25 <1> leavesub[1 ref] K/REFC,1 # BEGIN 9: # 26 <;> nextstate(main 3 -e:1) v:{ @@ -493,7 +493,7 @@ EOT_EOT # 6 <$> const(PV "strict") sM # 7 <$> const(PV "refs") sM # 8 <.> method_named(PV "unimport") -# 9 <1> entersub[t1] KRS*/TARG,STRICT +# 9 <1> entersub[t1] KRS/TARG,STRICT # a <1> leavesub[1 ref] K/REFC,1 # BEGIN 2: # b <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$ @@ -504,7 +504,7 @@ EOT_EOT # g <$> const(PV "warnings") sM # h <$> const(PV "once") sM # i <.> method_named(PV "unimport") -# j <1> entersub[t1] KRS*/TARG +# j <1> entersub[t1] KRS/TARG # k <1> leavesub[1 ref] K/REFC,1 # BEGIN 3: # l <;> nextstate(B::Concise -1175 Concise.pm:117) v:*,&,{,x*,x&,x$,$ @@ -523,7 +523,7 @@ EOT_EOT # x <$> const(PV "strict") sM # y <$> const(PV "refs") sM # z <.> method_named(PV "unimport") -# 10 <1> entersub[t1] KRS*/TARG,STRICT +# 10 <1> entersub[t1] KRS/TARG,STRICT # 11 <1> leavesub[1 ref] K/REFC,1 # BEGIN 5: # 12 <;> nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$ @@ -534,7 +534,7 @@ EOT_EOT # 17 <$> const(PV "strict") sM # 18 <$> const(PV "refs") sM # 19 <.> method_named(PV "unimport") -# 1a <1> entersub[t1] KRS*/TARG,STRICT +# 1a <1> entersub[t1] KRS/TARG,STRICT # 1b <1> leavesub[1 ref] K/REFC,1 # BEGIN 6: # 1c <;> nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$ @@ -545,7 +545,7 @@ EOT_EOT # 1h <$> const(PV "strict") sM # 1i <$> const(PV "refs") sM # 1j <.> method_named(PV "unimport") -# 1k <1> entersub[t1] KRS*/TARG,STRICT +# 1k <1> entersub[t1] KRS/TARG,STRICT # 1l <1> leavesub[1 ref] K/REFC,1 # BEGIN 7: # 1m <;> nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$ @@ -556,7 +556,7 @@ EOT_EOT # 1r <$> const(PV "strict") sM # 1s <$> const(PV "refs") sM # 1t <.> method_named(PV "unimport") -# 1u <1> entersub[t1] KRS*/TARG,STRICT +# 1u <1> entersub[t1] KRS/TARG,STRICT # 1v <1> leavesub[1 ref] K/REFC,1 # BEGIN 8: # 1w <;> nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$ @@ -567,7 +567,7 @@ EOT_EOT # 21 <$> const(PV "warnings") sM # 22 <$> const(PV "qw") sM # 23 <.> method_named(PV "unimport") -# 24 <1> entersub[t1] KRS*/TARG,STRICT +# 24 <1> entersub[t1] KRS/TARG,STRICT # 25 <1> leavesub[1 ref] K/REFC,1 # BEGIN 9: # 26 <;> nextstate(main 3 -e:1) v:{ @@ -611,7 +611,7 @@ checkOptree ( name => 'regression test f # 6 <$> const[PV "strict"] sM # 7 <$> const[PV "refs"] sM # 8 <.> method_named[PV "unimport"] -# 9 <1> entersub[t1] KRS*/TARG,STRICT +# 9 <1> entersub[t1] KRS/TARG,STRICT # a <1> leavesub[1 ref] K/REFC,1 # BEGIN 2: # b <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$ @@ -622,7 +622,7 @@ checkOptree ( name => 'regression test f # g <$> const[PV "warnings"] sM # h <$> const[PV "once"] sM # i <.> method_named[PV "unimport"] -# j <1> entersub[t1] KRS*/TARG +# j <1> entersub[t1] KRS/TARG # k <1> leavesub[1 ref] K/REFC,1 # BEGIN 3: # l <;> nextstate(B::Concise -1175 Concise.pm:117) v:*,&,{,x*,x&,x$,$ @@ -641,7 +641,7 @@ checkOptree ( name => 'regression test f # x <$> const[PV "strict"] sM # y <$> const[PV "refs"] sM # z <.> method_named[PV "unimport"] -# 10 <1> entersub[t1] KRS*/TARG,STRICT +# 10 <1> entersub[t1] KRS/TARG,STRICT # 11 <1> leavesub[1 ref] K/REFC,1 # BEGIN 5: # 12 <;> nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$ @@ -652,7 +652,7 @@ checkOptree ( name => 'regression test f # 17 <$> const[PV "strict"] sM # 18 <$> const[PV "refs"] sM # 19 <.> method_named[PV "unimport"] -# 1a <1> entersub[t1] KRS*/TARG,STRICT +# 1a <1> entersub[t1] KRS/TARG,STRICT # 1b <1> leavesub[1 ref] K/REFC,1 # BEGIN 6: # 1c <;> nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$ @@ -663,7 +663,7 @@ checkOptree ( name => 'regression test f # 1h <$> const[PV "strict"] sM # 1i <$> const[PV "refs"] sM # 1j <.> method_named[PV "unimport"] -# 1k <1> entersub[t1] KRS*/TARG,STRICT +# 1k <1> entersub[t1] KRS/TARG,STRICT # 1l <1> leavesub[1 ref] K/REFC,1 # BEGIN 7: # 1m <;> nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$ @@ -674,7 +674,7 @@ checkOptree ( name => 'regression test f # 1r <$> const[PV "strict"] sM # 1s <$> const[PV "refs"] sM # 1t <.> method_named[PV "unimport"] -# 1u <1> entersub[t1] KRS*/TARG,STRICT +# 1u <1> entersub[t1] KRS/TARG,STRICT # 1v <1> leavesub[1 ref] K/REFC,1 # BEGIN 8: # 1w <;> nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$ @@ -685,7 +685,7 @@ checkOptree ( name => 'regression test f # 21 <$> const[PV "warnings"] sM # 22 <$> const[PV "qw"] sM # 23 <.> method_named[PV "unimport"] -# 24 <1> entersub[t1] KRS*/TARG,STRICT +# 24 <1> entersub[t1] KRS/TARG,STRICT # 25 <1> leavesub[1 ref] K/REFC,1 EOT_EOT # BEGIN 1: @@ -697,7 +697,7 @@ EOT_EOT # 6 <$> const(PV "strict") sM # 7 <$> const(PV "refs") sM # 8 <.> method_named(PV "unimport") -# 9 <1> entersub[t1] KRS*/TARG,STRICT +# 9 <1> entersub[t1] KRS/TARG,STRICT # a <1> leavesub[1 ref] K/REFC,1 # BEGIN 2: # b <;> nextstate(Exporter::Heavy -1251 Heavy.pm:202) v:*,&,{,x*,x&,x$ @@ -708,7 +708,7 @@ EOT_EOT # g <$> const(PV "warnings") sM # h <$> const(PV "once") sM # i <.> method_named(PV "unimport") -# j <1> entersub[t1] KRS*/TARG +# j <1> entersub[t1] KRS/TARG # k <1> leavesub[1 ref] K/REFC,1 # BEGIN 3: # l <;> nextstate(B::Concise -1175 Concise.pm:117) v:*,&,{,x*,x&,x$,$ @@ -727,7 +727,7 @@ EOT_EOT # x <$> const(PV "strict") sM # y <$> const(PV "refs") sM # z <.> method_named(PV "unimport") -# 10 <1> entersub[t1] KRS*/TARG,STRICT +# 10 <1> entersub[t1] KRS/TARG,STRICT # 11 <1> leavesub[1 ref] K/REFC,1 # BEGIN 5: # 12 <;> nextstate(B::Concise -1031 Concise.pm:305) v:*,&,x*,x&,x$,$ @@ -738,7 +738,7 @@ EOT_EOT # 17 <$> const(PV "strict") sM # 18 <$> const(PV "refs") sM # 19 <.> method_named(PV "unimport") -# 1a <1> entersub[t1] KRS*/TARG,STRICT +# 1a <1> entersub[t1] KRS/TARG,STRICT # 1b <1> leavesub[1 ref] K/REFC,1 # BEGIN 6: # 1c <;> nextstate(B::Concise -984 Concise.pm:370) v:*,&,{,x*,x&,x$,$ @@ -749,7 +749,7 @@ EOT_EOT # 1h <$> const(PV "strict") sM # 1i <$> const(PV "refs") sM # 1j <.> method_named(PV "unimport") -# 1k <1> entersub[t1] KRS*/TARG,STRICT +# 1k <1> entersub[t1] KRS/TARG,STRICT # 1l <1> leavesub[1 ref] K/REFC,1 # BEGIN 7: # 1m <;> nextstate(B::Concise -959 Concise.pm:390) v:*,&,x*,x&,x$,$ @@ -760,7 +760,7 @@ EOT_EOT # 1r <$> const(PV "strict") sM # 1s <$> const(PV "refs") sM # 1t <.> method_named(PV "unimport") -# 1u <1> entersub[t1] KRS*/TARG,STRICT +# 1u <1> entersub[t1] KRS/TARG,STRICT # 1v <1> leavesub[1 ref] K/REFC,1 # BEGIN 8: # 1w <;> nextstate(B::Concise -945 Concise.pm:410) v:*,&,{,x*,x&,x$,$ @@ -771,6 +771,6 @@ EOT_EOT # 21 <$> const(PV "warnings") sM # 22 <$> const(PV "qw") sM # 23 <.> method_named(PV "unimport") -# 24 <1> entersub[t1] KRS*/TARG,STRICT +# 24 <1> entersub[t1] KRS/TARG,STRICT # 25 <1> leavesub[1 ref] K/REFC,1 EONT_EONT Index: gnu/usr.bin/perl/ext/B/t/optree_varinit.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/B/t/optree_varinit.t,v diff -u -p -a -u -p -r1.5 optree_varinit.t --- gnu/usr.bin/perl/ext/B/t/optree_varinit.t 15 Feb 2023 01:36:30 -0000 1.5 +++ gnu/usr.bin/perl/ext/B/t/optree_varinit.t 21 Feb 2024 15:47:02 -0000 @@ -129,19 +129,19 @@ checkOptree ( name => 'sub {my $a=undef} bcopts => '-basic', strip_open_hints => 1, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); -5 <1> leavesub[1 ref] K/REFC,1 ->(end) -- <@> lineseq KP ->5 -1 <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2 -4 <2> sassign sKS/2 ->5 -2 <0> undef s ->3 -3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4 -EOT_EOT -# 5 <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->5 -# 1 <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2 -# 4 <2> sassign sKS/2 ->5 -# 2 <0> undef s ->3 -# 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4 +3 <1> leavesub[1 ref] K/REFC,1 ->(end) +- <@> lineseq KP ->3 +1 <;> nextstate(main 1517 optree_varinit.t:128) v ->2 +- <1> ex-sassign sKS/2 ->- +2 <0> undef[$a:1517,1518] s/LVINTRO,KEEP_PV,TARGMY ->3 +- <0> ex-padsv sRM*/LVINTRO ->- +EOT_EOT +# 3 <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->3 +# 1 <;> nextstate(main 1517 optree_varinit.t:128) v ->2 +# - <1> ex-sassign sKS/2 ->- +# 2 <0> undef[$a:1517,1518] s/LVINTRO,KEEP_PV,TARGMY ->3 +# - <0> ex-padsv sRM*/LVINTRO ->- EONT_EONT checkOptree ( name => 'sub {our $a=undef}', @@ -152,7 +152,7 @@ checkOptree ( name => 'sub {our $a=undef expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 5 <1> leavesub[1 ref] K/REFC,1 ->(end) - <@> lineseq KP ->5 -1 <;> nextstate(main 26 optree.t:109) v:>,<,%,{ ->2 +1 <;> nextstate(main 1520 optree_varinit.t:148) v:{ ->2 4 <2> sassign sKS/2 ->5 2 <0> undef s ->3 - <1> ex-rv2sv sKRM*/OURINTR,1 ->4 @@ -160,7 +160,7 @@ checkOptree ( name => 'sub {our $a=undef EOT_EOT # 5 <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->5 -# 1 <;> nextstate(main 446 optree_varinit.t:137) v:>,<,%,{ ->2 +# 1 <;> nextstate(main 1520 optree_varinit.t:148) v:{ ->2 # 4 <2> sassign sKS/2 ->5 # 2 <0> undef s ->3 # - <1> ex-rv2sv sKRM*/OURINTR,1 ->4 @@ -175,7 +175,7 @@ checkOptree ( name => 'sub {local $a=und expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 5 <1> leavesub[1 ref] K/REFC,1 ->(end) - <@> lineseq KP ->5 -1 <;> nextstate(main 28 optree.t:122) v:>,<,%,{ ->2 +1 <;> nextstate(main 1523 optree_varinit.t:171) v:{ ->2 4 <2> sassign sKS/2 ->5 2 <0> undef s ->3 - <1> ex-rv2sv sKRM*/LVINTRO,1 ->4 @@ -183,7 +183,7 @@ checkOptree ( name => 'sub {local $a=und EOT_EOT # 5 <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->5 -# 1 <;> nextstate(main 58 optree.t:141) v:>,<,%,{ ->2 +# 1 <;> nextstate(main 1523 optree_varinit.t:171) v:{ ->2 # 4 <2> sassign sKS/2 ->5 # 2 <0> undef s ->3 # - <1> ex-rv2sv sKRM*/LVINTRO,1 ->4 @@ -195,19 +195,19 @@ checkOptree ( name => 'my $a=undef', bcopts => '-basic', strip_open_hints => 1, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); -6 <@> leave[1 ref] vKP/REFC ->(end) +4 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter v ->2 -2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 -5 <2> sassign vKS/2 ->6 -3 <0> undef s ->4 -4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5 +2 <;> nextstate(main 1 -e:1) v:{ ->3 +- <1> ex-sassign vKS/2 ->4 +3 <0> undef[$a:1,2] s/LVINTRO,KEEP_PV,TARGMY ->4 +- <0> ex-padsv sRM*/LVINTRO ->- EOT_EOT -# 6 <@> leave[1 ref] vKP/REFC ->(end) +# 4 <@> leave[1 ref] vKP/REFC ->(end) # 1 <0> enter v ->2 -# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 -# 5 <2> sassign vKS/2 ->6 -# 3 <0> undef s ->4 -# 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5 +# 2 <;> nextstate(main 1 -e:1) v:{ ->3 +# - <1> ex-sassign vKS/2 ->4 +# 3 <0> undef[$a:1,2] s/LVINTRO,KEEP_PV,TARGMY ->4 +# - <0> ex-padsv sRM*/LVINTRO ->- EONT_EONT checkOptree ( name => 'our $a=undef', @@ -218,7 +218,7 @@ checkOptree ( name => 'our $a=undef', expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 6 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter v ->2 -2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 +2 <;> nextstate(main 1 -e:1) v:{ ->3 5 <2> sassign vKS/2 ->6 3 <0> undef s ->4 - <1> ex-rv2sv sKRM*/OURINTR,1 ->5 @@ -226,7 +226,7 @@ checkOptree ( name => 'our $a=undef', EOT_EOT # 6 <@> leave[1 ref] vKP/REFC ->(end) # 1 <0> enter v ->2 -# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 +# 2 <;> nextstate(main 1 -e:1) v:{ ->3 # 5 <2> sassign vKS/2 ->6 # 3 <0> undef s ->4 # - <1> ex-rv2sv sKRM*/OURINTR,1 ->5 @@ -242,7 +242,7 @@ checkOptree ( name => 'local $c=undef', expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 6 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter v ->2 -2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 +2 <;> nextstate(main 1 -e:1) v:{ ->3 5 <2> sassign vKS/2 ->6 3 <0> undef s ->4 - <1> ex-rv2sv sKRM*/LVINTRO,1 ->5 @@ -250,7 +250,7 @@ checkOptree ( name => 'local $c=undef', EOT_EOT # 6 <@> leave[1 ref] vKP/REFC ->(end) # 1 <0> enter v ->2 -# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3 +# 2 <;> nextstate(main 1 -e:1) v:{ ->3 # 5 <2> sassign vKS/2 ->6 # 3 <0> undef s ->4 # - <1> ex-rv2sv sKRM*/LVINTRO,1 ->5 @@ -264,15 +264,13 @@ checkOptree ( name => 'sub {my $a=()}', expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1 <;> nextstate(main -439 optree.t:105) v:>,<,% 2 <0> stub sP -3 <0> padsv[$a:-439,-438] sRM*/LVINTRO -4 <2> sassign sKS/2 -5 <1> leavesub[1 ref] K/REFC,1 +3 <1> padsv_store[$a:1516,1517] sKS/LVINTRO +4 <1> leavesub[1 ref] K/REFC,1 EOT_EOT # 1 <;> nextstate(main 438 optree_varinit.t:247) v:>,<,% # 2 <0> stub sP -# 3 <0> padsv[$a:438,439] sRM*/LVINTRO -# 4 <2> sassign sKS/2 -# 5 <1> leavesub[1 ref] K/REFC,1 +# 3 <1> padsv_store[$a:1516,1517] sKS/LVINTRO +# 4 <1> leavesub[1 ref] K/REFC,1 EONT_EONT checkOptree ( name => 'sub {our $a=()}', @@ -321,16 +319,14 @@ checkOptree ( name => 'my $a=()', 1 <0> enter v 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ 3 <0> stub sP -4 <0> padsv[$a:1,2] sRM*/LVINTRO -5 <2> sassign vKS/2 -6 <@> leave[1 ref] vKP/REFC +4 <1> padsv_store[$a:1516,1517] vKS/LVINTRO +5 <@> leave[1 ref] vKP/REFC EOT_EOT # 1 <0> enter v # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ # 3 <0> stub sP -# 4 <0> padsv[$a:1,2] sRM*/LVINTRO -# 5 <2> sassign vKS/2 -# 6 <@> leave[1 ref] vKP/REFC +# 4 <1> padsv_store[$a:1516,1517] vKS/LVINTRO +# 5 <@> leave[1 ref] vKP/REFC EONT_EONT checkOptree ( name => 'our $a=()', Index: gnu/usr.bin/perl/ext/B/t/walkoptree.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/B/t/walkoptree.t,v diff -u -p -a -u -p -r1.1.1.4 walkoptree.t --- gnu/usr.bin/perl/ext/B/t/walkoptree.t 1 Mar 2021 23:15:52 -0000 1.1.1.4 +++ gnu/usr.bin/perl/ext/B/t/walkoptree.t 21 Feb 2024 15:47:02 -0000 @@ -48,7 +48,11 @@ foreach (qw(substcont split leavesub)) { is_deeply ([keys %debug], [], 'walkoptree_debug was not called'); B::walkoptree_debug(2); -is (B::walkoptree_debug, 1, 'walkoptree_debug() is 1'); +is (B::walkoptree_debug(), 1, 'walkoptree_debug() is 1'); +B::walkoptree_debug(0); +is (B::walkoptree_debug(), 0, 'walkoptree_debug() is 0'); +B::walkoptree_debug(1); +is (B::walkoptree_debug(), 1, 'walkoptree_debug() is 1 again'); %seen = (); B::walkoptree(B::svref_2object($victim)->ROOT, "pie"); Index: gnu/usr.bin/perl/ext/Devel-Peek/Peek.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Devel-Peek/Peek.pm,v diff -u -p -a -u -p -r1.5 Peek.pm --- gnu/usr.bin/perl/ext/Devel-Peek/Peek.pm 15 Feb 2023 01:36:30 -0000 1.5 +++ gnu/usr.bin/perl/ext/Devel-Peek/Peek.pm 21 Feb 2024 15:47:02 -0000 @@ -3,7 +3,7 @@ package Devel::Peek; -$VERSION = '1.32'; +$VERSION = '1.33'; $XS_VERSION = $VERSION; $VERSION = eval $VERSION; Index: gnu/usr.bin/perl/ext/Devel-Peek/t/Peek.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Devel-Peek/t/Peek.t,v diff -u -p -a -u -p -r1.6 Peek.t --- gnu/usr.bin/perl/ext/Devel-Peek/t/Peek.t 15 Feb 2023 01:36:30 -0000 1.6 +++ gnu/usr.bin/perl/ext/Devel-Peek/t/Peek.t 21 Feb 2024 15:47:02 -0000 @@ -392,7 +392,6 @@ do_test('reference to named subroutine w \\d+\\. $ADDR<\\d+> \\(\\d+,\\d+\\) "\\$dump2" OUTSIDE = $ADDR \\(MAIN\\)'); -if ($] >= 5.011) { # note the conditionals on ENGINE and INTFLAGS were introduced in 5.19.9 do_test('reference to regexp', qr(tic), @@ -406,14 +405,16 @@ do_test('reference to regexp', PV = $ADDR "\\(\\?\\^:tic\\)" CUR = 8 LEN = 0 - STASH = $ADDR\\t"Regexp"' -. ($] < 5.013 ? '' : -' - COMPFLAGS = 0x0 \(\) - EXTFLAGS = 0x680000 \(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\) -(?: ENGINE = $ADDR \(STANDARD\) -)? INTFLAGS = 0x0(?: \(\))? + STASH = $ADDR\\s+"Regexp" + COMPFLAGS = 0x0 \\(\\) + EXTFLAGS = 0x680000 \\(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\\) + ENGINE = $ADDR \\(STANDARD\\) + INTFLAGS = 0x0 \\(\\) NPARENS = 0 + LOGICAL_NPARENS = 0 + LOGICAL_TO_PARNO = 0x0 + PARNO_TO_LOGICAL = 0x0 + PARNO_TO_LOGICAL_NEXT = 0x0 LASTPAREN = 0 LASTCLOSEPAREN = 0 MINLEN = 3 @@ -424,20 +425,29 @@ do_test('reference to regexp', SUBOFFSET = 0 SUBCOFFSET = 0 SUBBEG = 0x0 -(?: ENGINE = $ADDR -)? MOTHER_RE = $ADDR' -. ($] < 5.019003 ? '' : ' - SV = REGEXP\($ADDR\) at $ADDR + PAREN_NAMES = 0x0 + SUBSTRS = $ADDR + PPRIVATE = $ADDR + OFFS = $ADDR + \\[ 0:0 \\] + QR_ANONCV = 0x0 + SAVED_COPY = 0x0 + MOTHER_RE = $ADDR + SV = REGEXP\\($ADDR\\) at $ADDR REFCNT = 2 - FLAGS = \(POK,pPOK\) - PV = $ADDR "\(\?\^:tic\)" + FLAGS = \\(POK,pPOK\\) + PV = $ADDR "\\(\\?\\^:tic\\)" CUR = 8 - LEN = \d+ - COMPFLAGS = 0x0 \(\) - EXTFLAGS = 0x680000 \(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\) -(?: ENGINE = $ADDR \(STANDARD\) -)? INTFLAGS = 0x0(?: \(\))? + LEN = \\d+ + COMPFLAGS = 0x0 \\(\\) + EXTFLAGS = 0x680000 \\(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\\) + ENGINE = $ADDR \\(STANDARD\\) + INTFLAGS = 0x0 \\(\\) NPARENS = 0 + LOGICAL_NPARENS = 0 + LOGICAL_TO_PARNO = 0x0 + PARNO_TO_LOGICAL = 0x0 + PARNO_TO_LOGICAL_NEXT = 0x0 LASTPAREN = 0 LASTCLOSEPAREN = 0 MINLEN = 3 @@ -448,42 +458,15 @@ do_test('reference to regexp', SUBOFFSET = 0 SUBCOFFSET = 0 SUBBEG = 0x0 -(?: ENGINE = $ADDR -)? MOTHER_RE = 0x0 PAREN_NAMES = 0x0 SUBSTRS = $ADDR PPRIVATE = $ADDR OFFS = $ADDR - QR_ANONCV = 0x0(?: - SAVED_COPY = 0x0)?') . ' - PAREN_NAMES = 0x0 - SUBSTRS = $ADDR - PPRIVATE = $ADDR - OFFS = $ADDR - QR_ANONCV = 0x0(?: - SAVED_COPY = 0x0)?' -)); -} else { -do_test('reference to regexp', - qr(tic), -'SV = $RV\\($ADDR\\) at $ADDR - REFCNT = 1 - FLAGS = \\(ROK\\) - RV = $ADDR - SV = PVMG\\($ADDR\\) at $ADDR - REFCNT = 1 - FLAGS = \\(OBJECT,SMG\\) - IV = 0 - NV = 0 - PV = 0 - MAGIC = $ADDR - MG_VIRTUAL = $ADDR - MG_TYPE = PERL_MAGIC_qr\(r\) - MG_OBJ = $ADDR - PAT = "\(\?^:tic\)" - REFCNT = 2 - STASH = $ADDR\\t"Regexp"'); -} + \\[ 0:0 \\] + QR_ANONCV = 0x0 + SAVED_COPY = 0x0 + MOTHER_RE = 0x0 +'); do_test('reference to blessed hash', (bless {}, "Tac"), @@ -1200,22 +1183,26 @@ unless ($Config{useithreads}) { # note the conditionals on ENGINE and INTFLAGS were introduced in 5.19.9 do_test('UTF-8 in a regular expression', qr/\x{100}/, -'SV = IV\($ADDR\) at $ADDR +'SV = IV\\($ADDR\\) at $ADDR REFCNT = 1 - FLAGS = \(ROK\) + FLAGS = \\(ROK\\) RV = $ADDR - SV = REGEXP\($ADDR\) at $ADDR + SV = REGEXP\\($ADDR\\) at $ADDR REFCNT = 1 FLAGS = \(OBJECT,POK,FAKE,pPOK,UTF8\) - PV = $ADDR "\(\?\^u:\\\\\\\\x\{100\}\)" \[UTF8 "\(\?\^u:\\\\\\\\x\{100\}\)"\] + PV = $ADDR "\\(\\?\\^u:\\\\\\\\x\\{100\\}\\)" \\[UTF8 "\\(\\?\\^u:\\\\\\\\x\\{100\\}\\)"\\] CUR = 13 LEN = 0 - STASH = $ADDR "Regexp" - COMPFLAGS = 0x0 \(\) - EXTFLAGS = $ADDR \(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\) -(?: ENGINE = $ADDR \(STANDARD\) -)? INTFLAGS = 0x0(?: \(\))? + STASH = $ADDR\\s+"Regexp" + COMPFLAGS = 0x0 \\(\\) + EXTFLAGS = $ADDR \\(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\\) +(?: ENGINE = $ADDR \\(STANDARD\\) +)? INTFLAGS = 0x0(?: \\(\\))? NPARENS = 0 + LOGICAL_NPARENS = 0 + LOGICAL_TO_PARNO = 0x0 + PARNO_TO_LOGICAL = 0x0 + PARNO_TO_LOGICAL_NEXT = 0x0 LASTPAREN = 0 LASTCLOSEPAREN = 0 MINLEN = 1 @@ -1226,20 +1213,29 @@ do_test('UTF-8 in a regular expression', SUBOFFSET = 0 SUBCOFFSET = 0 SUBBEG = 0x0 -(?: ENGINE = $ADDR -)? MOTHER_RE = $ADDR' -. ($] < 5.019003 ? '' : ' - SV = REGEXP\($ADDR\) at $ADDR + PAREN_NAMES = 0x0 + SUBSTRS = $ADDR + PPRIVATE = $ADDR + OFFS = $ADDR + \\[ 0:0 \\] + QR_ANONCV = 0x0 + SAVED_COPY = 0x0 + MOTHER_RE = $ADDR + SV = REGEXP\\($ADDR\\) at $ADDR REFCNT = 2 - FLAGS = \(POK,pPOK,UTF8\) - PV = $ADDR "\(\?\^u:\\\\\\\\x\{100\}\)" \[UTF8 "\(\?\^u:\\\\\\\\x\{100\}\)"\] + FLAGS = \\(POK,pPOK,UTF8\\) + PV = $ADDR "\\(\\?\\^u:\\\\\\\\x\\{100\\}\\)" \\[UTF8 "\\(\\?\\^u:\\\\\\\\x\\{100\\}\\)"\\] CUR = 13 - LEN = \d+ - COMPFLAGS = 0x0 \(\) - EXTFLAGS = $ADDR \(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\) -(?: ENGINE = $ADDR \(STANDARD\) -)? INTFLAGS = 0x0(?: \(\))? + LEN = \\d+ + COMPFLAGS = 0x0 \\(\\) + EXTFLAGS = 0x680100 \\(CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML\\) + ENGINE = $ADDR \\(STANDARD\\) + INTFLAGS = 0x0 \\(\\) NPARENS = 0 + LOGICAL_NPARENS = 0 + LOGICAL_TO_PARNO = 0x0 + PARNO_TO_LOGICAL = 0x0 + PARNO_TO_LOGICAL_NEXT = 0x0 LASTPAREN = 0 LASTCLOSEPAREN = 0 MINLEN = 1 @@ -1250,22 +1246,98 @@ do_test('UTF-8 in a regular expression', SUBOFFSET = 0 SUBCOFFSET = 0 SUBBEG = 0x0 -(?: ENGINE = $ADDR -)? MOTHER_RE = 0x0 PAREN_NAMES = 0x0 SUBSTRS = $ADDR PPRIVATE = $ADDR OFFS = $ADDR - QR_ANONCV = 0x0(?: - SAVED_COPY = 0x0)?') . ' + \\[ 0:0 \\] + QR_ANONCV = 0x0 + SAVED_COPY = 0x0 + MOTHER_RE = 0x0 +'); + +do_test('Branch Reset regexp', + qr/(?|(foo)|(bar))(?|(baz)|(bop))/, +'SV = IV\\($ADDR\\) at $ADDR + REFCNT = 1 + FLAGS = \\(ROK\\) + RV = $ADDR + SV = REGEXP\\($ADDR\\) at $ADDR + REFCNT = 1 + FLAGS = \\(OBJECT,POK,FAKE,pPOK\\) + PV = $ADDR "\\(\\?\\^:\\(\\?\\|\\(foo\\)\\|\\(bar\\)\\)\\(\\?\\|\\(baz\\)\\|\\(bop\\)\\)\\)" + CUR = 35 + LEN = 0 + STASH = $ADDR\\s+"Regexp" + COMPFLAGS = 0x0 \\(\\) + EXTFLAGS = 0x0 \\(\\) + ENGINE = $ADDR \\(STANDARD\\) + INTFLAGS = 0x0 \\(\\) + NPARENS = 4 + LOGICAL_NPARENS = 2 + LOGICAL_TO_PARNO = $ADDR + \\{ 0, 1, 3 \\} + PARNO_TO_LOGICAL = $ADDR + \\{ 0, 1, 1, 2, 2 \\} + PARNO_TO_LOGICAL_NEXT = $ADDR + \\{ 0, 2, 0, 4, 0 \\} + LASTPAREN = 0 + LASTCLOSEPAREN = 0 + MINLEN = 6 + MINLENRET = 6 + GOFS = 0 + PRE_PREFIX = 4 + SUBLEN = 0 + SUBOFFSET = 0 + SUBCOFFSET = 0 + SUBBEG = 0x0 PAREN_NAMES = 0x0 SUBSTRS = $ADDR PPRIVATE = $ADDR OFFS = $ADDR - QR_ANONCV = 0x0(?: - SAVED_COPY = 0x0)? + \\[ 0:0, 0:0, 0:0, 0:0, 0:0 \\] + QR_ANONCV = 0x0 + SAVED_COPY = 0x0 + MOTHER_RE = $ADDR + SV = REGEXP\\($ADDR\\) at $ADDR + REFCNT = 2 + FLAGS = \\(POK,pPOK\\) + PV = $ADDR "\\(\\?\\^:\\(\\?\\|\\(foo\\)\\|\\(bar\\)\\)\\(\\?\\|\\(baz\\)\\|\\(bop\\)\\)\\)" + CUR = 35 + LEN = \\d+ + COMPFLAGS = 0x0 \\(\\) + EXTFLAGS = 0x0 \\(\\) + ENGINE = $ADDR \\(STANDARD\\) + INTFLAGS = 0x0 \\(\\) + NPARENS = 4 + LOGICAL_NPARENS = 2 + LOGICAL_TO_PARNO = $ADDR + \\{ 0, 1, 3 \\} + PARNO_TO_LOGICAL = $ADDR + \\{ 0, 1, 1, 2, 2 \\} + PARNO_TO_LOGICAL_NEXT = $ADDR + \\{ 0, 2, 0, 4, 0 \\} + LASTPAREN = 0 + LASTCLOSEPAREN = 0 + MINLEN = 6 + MINLENRET = 6 + GOFS = 0 + PRE_PREFIX = 4 + SUBLEN = 0 + SUBOFFSET = 0 + SUBCOFFSET = 0 + SUBBEG = 0x0 + PAREN_NAMES = 0x0 + SUBSTRS = $ADDR + PPRIVATE = $ADDR + OFFS = $ADDR + \\[ 0:0, 0:0, 0:0, 0:0, 0:0 \\] + QR_ANONCV = 0x0 + SAVED_COPY = 0x0 + MOTHER_RE = 0x0 '); + { # perl #117793: Extend SvREFCNT* to work on any perl variable type my %hash; my $base_count = Devel::Peek::SvREFCNT(%hash); @@ -1516,6 +1588,7 @@ dumpindent is 4 at -e line 1. | FLAGS = (VOID,SLABBED,MORESIB) | LINE = 1 | PACKAGE = "t" + | HINTS = 00000100 | | 5 +--entersub UNOP(0xNNN) ===> 1 [leave 0xNNN] TARG = 1 Index: gnu/usr.bin/perl/ext/DynaLoader/DynaLoader_pm.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/DynaLoader/DynaLoader_pm.PL,v diff -u -p -a -u -p -r1.5 DynaLoader_pm.PL --- gnu/usr.bin/perl/ext/DynaLoader/DynaLoader_pm.PL 15 Feb 2023 01:36:30 -0000 1.5 +++ gnu/usr.bin/perl/ext/DynaLoader/DynaLoader_pm.PL 21 Feb 2024 15:47:02 -0000 @@ -90,7 +90,7 @@ package DynaLoader; # Tim.Bunce@ig.co.uk, August 1994 BEGIN { - our $VERSION = '1.52'; + our $VERSION = '1.54'; } # Note: in almost any other piece of code "our" would have been a better Index: gnu/usr.bin/perl/ext/DynaLoader/dl_dyld.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/DynaLoader/dl_dyld.xs,v diff -u -p -a -u -p -r1.2 dl_dyld.xs --- gnu/usr.bin/perl/ext/DynaLoader/dl_dyld.xs 5 Feb 2017 00:32:12 -0000 1.2 +++ gnu/usr.bin/perl/ext/DynaLoader/dl_dyld.xs 21 Feb 2024 15:47:02 -0000 @@ -104,7 +104,7 @@ static void TranslateError sv_setpv(MY_CXT.x_dl_last_error, error); } -static char *dlopen(char *path, int mode /* mode is ignored */) +static char *dlopen(char *path) { int dyld_result; NSObjectFileImage ofile; @@ -159,13 +159,11 @@ void * dl_load_file(filename, flags=0) char * filename int flags - PREINIT: - int mode = 1; CODE: DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags)); if (flags & 0x01) Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename); - RETVAL = dlopen(filename, mode) ; + RETVAL = dlopen(filename); DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%x\n", RETVAL)); ST(0) = sv_newmortal() ; if (RETVAL == NULL) Index: gnu/usr.bin/perl/ext/DynaLoader/dl_win32.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/DynaLoader/dl_win32.xs,v diff -u -p -a -u -p -r1.3 dl_win32.xs --- gnu/usr.bin/perl/ext/DynaLoader/dl_win32.xs 13 Feb 2019 21:15:22 -0000 1.3 +++ gnu/usr.bin/perl/ext/DynaLoader/dl_win32.xs 21 Feb 2024 15:47:02 -0000 @@ -188,7 +188,7 @@ void dl_install_xsub(perl_name, symref, filename="$Package") char * perl_name void * symref - char * filename + const char * filename CODE: DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_install_xsub(name=%s, symref=%x)\n", perl_name, symref)); Index: gnu/usr.bin/perl/ext/Errno/Errno_pm.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Errno/Errno_pm.PL,v diff -u -p -a -u -p -r1.6 Errno_pm.PL --- gnu/usr.bin/perl/ext/Errno/Errno_pm.PL 15 Feb 2023 01:36:30 -0000 1.6 +++ gnu/usr.bin/perl/ext/Errno/Errno_pm.PL 21 Feb 2024 15:47:02 -0000 @@ -2,7 +2,7 @@ use ExtUtils::MakeMaker; use Config; use strict; -our $VERSION = "1.36"; +our $VERSION = "1.37"; my %err = (); @@ -18,18 +18,11 @@ if ($Config{gccversion} ne '' && $^O eq # MinGW complains "warning: #pragma system_header ignored outside include # file" if the header files are processed individually, so include them # all in .c file and process that instead. - my %seen; open INCS, '>', 'includes.c' or die "Cannot open includes.c"; foreach $file (@files) { next if $file eq 'errno.c'; next unless -f $file; - if ( $file eq 'avx512vpopcntdqvlintrin.h' || $file eq 'avx512bwintrin.h' ) { - # "Never use directly; include instead." - # "Never use directly; include instead." - $file = 'immintrin.h'; - } - next if ++$seen{$file} > 1; print INCS qq[#include "$file"\n]; } close INCS; @@ -114,7 +107,7 @@ sub default_cpp { } sub get_files { - my %file = (); + my @file; # When cross-compiling we may store a path for gcc's "sysroot" option: my $sysroot = $Config{sysroot} || ''; my $linux_errno_h; @@ -128,19 +121,19 @@ sub get_files { # VMS keeps its include files in system libraries if ($^O eq 'VMS') { - $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1; + push(@file, 'Sys$Library:DECC$RTLDEF.TLB'); } elsif ($^O eq 'os390') { # OS/390 C compiler doesn't generate #file or #line directives # and it does not tag the header as 1047 (EBCDIC), so make a local # copy and tag it my $cp = `cp /usr/include/errno.h ./errno.h`; my $chtag = `chtag -t -cIBM-1047 ./errno.h`; - $file{'./errno.h'} = 1; + push(@file, './errno.h'); } elsif ($Config{archname} eq 'arm-riscos') { # Watch out for cross compiling for RISC OS my $dep = `echo "#include " | gcc -E -M -`; if ($dep =~ /(\S+errno\.h)/) { - $file{$1} = 1; + push(@file, $1); } } elsif ($^O eq 'linux' && $Config{gccversion} ne '' && @@ -148,14 +141,14 @@ sub get_files { # might be using, say, Intel's icc $linux_errno_h ) { - $file{$linux_errno_h} = 1; + push(@file, $linux_errno_h); } elsif ($^O eq 'haiku') { # hidden in a special place - $file{'/boot/system/develop/headers/posix/errno.h'} = 1; + push(@file, '/boot/system/develop/headers/posix/errno.h'); } elsif ($^O eq 'vos') { # avoid problem where cpp returns non-POSIX pathnames - $file{'/system/include_library/errno.h'} = 1; + push(@file, '/system/include_library/errno.h'); } else { open(CPPI, '>', 'errno.c') or die "Cannot open errno.c"; @@ -183,16 +176,28 @@ sub get_files { if (/$pat/o) { my $f = $1; $f =~ s,\\\\,/,g; - $file{$f} = 1; + push(@file, $f); } } else { - $file{$1} = 1 if /$pat/o; + push(@file, $1) if /$pat/o; } } close(CPPO); } - return keys %file; + return uniq(@file); +} + +# +# +sub uniq +{ + # At this point List::Util::uniq appears not to be usable so + # roll our own. + # + # Returns a list with unique values, while keeping the order + # + return do { my %seen; grep { !$seen{$_}++ } @_ }; } sub write_errno_pm { @@ -364,7 +369,7 @@ ESQ if ($IsMSWin32) { print " WINSOCK => [qw(\n"; - $k = join(" ", grep { /^WSAE/ } keys %err); + $k = join(" ", grep { /^WSAE/ } sort keys %err); $k =~ s/(.{50,70})\s/$1\n\t/g; print "\t",$k,"\n )],\n"; } Index: gnu/usr.bin/perl/ext/Errno/t/Errno.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Errno/t/Errno.t,v diff -u -p -a -u -p -r1.1.1.5 Errno.t --- gnu/usr.bin/perl/ext/Errno/t/Errno.t 25 Mar 2013 20:08:44 -0000 1.1.1.5 +++ gnu/usr.bin/perl/ext/Errno/t/Errno.t 21 Feb 2024 15:47:02 -0000 @@ -14,29 +14,33 @@ BAIL_OUT("No errno's are exported") unle my $err = $Errno::EXPORT_OK[0]; my $num = &{"Errno::$err"}; -is($num, &{"Errno::$err"}); +is($num, &{"Errno::$err"}, + 'element in @Errno::EXPORT_OK found via sub call'); $! = $num; -ok(exists $!{$err}); +ok(exists $!{$err}, 'entry in %! reflects current value of $!'); $! = 0; -ok(! $!{$err}); +ok(! $!{$err}, 'entry in %! reflects the current value of $!'); -ok(join(",",sort keys(%!)) eq join(",",sort @Errno::EXPORT_OK)); +ok(join(",",sort keys(%!)) eq join(",",sort @Errno::EXPORT_OK), + 'keys of %! match keys of @Errno::EXPORT_OK'); eval { exists $!{[]} }; -ok(! $@); +ok(! $@, "no exception recorded in %! when element's key is '[]'"); eval {$!{$err} = "qunckkk" }; -like($@, qr/^ERRNO hash is read only!/); +like($@, qr/^ERRNO hash is read only!/, + "can't assign to ERRNO hash: 'ERRNO hash is read only!'"); eval {delete $!{$err}}; -like($@, qr/^ERRNO hash is read only!/); +like($@, qr/^ERRNO hash is read only!/, + "can't delete from ERRNO hash: 'ERRNO hash is read only!'"); # The following tests are in trouble if some OS picks errno values # through Acme::MetaSyntactic::batman -is($!{EFLRBBB}, ""); -ok(! exists($!{EFLRBBB})); +is($!{EFLRBBB}, "", "non-existent entry in ERRNO hash"); +ok(! exists($!{EFLRBBB}), "non-existent entry in ERRNO hash"); SKIP: { skip("Errno does not have EINVAL", 1) Index: gnu/usr.bin/perl/ext/ExtUtils-Miniperl/lib/ExtUtils/Miniperl.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/ExtUtils-Miniperl/lib/ExtUtils/Miniperl.pm,v diff -u -p -a -u -p -r1.5 Miniperl.pm --- gnu/usr.bin/perl/ext/ExtUtils-Miniperl/lib/ExtUtils/Miniperl.pm 15 Feb 2023 01:36:30 -0000 1.5 +++ gnu/usr.bin/perl/ext/ExtUtils-Miniperl/lib/ExtUtils/Miniperl.pm 21 Feb 2024 15:47:02 -0000 @@ -5,7 +5,7 @@ use Exporter 'import'; use ExtUtils::Embed 1.31, qw(xsi_header xsi_protos xsi_body); our @EXPORT = qw(writemain); -our $VERSION = '1.11'; +our $VERSION = '1.13'; # blead will run this with miniperl, hence we can't use autodie or File::Temp my $temp; @@ -99,9 +99,6 @@ main(int argc, char **argv, char **env) #ifndef NO_ENV_ARRAY_IN_MAIN PERL_UNUSED_ARG(env); #endif -#ifndef PERL_USE_SAFE_PUTENV - PL_use_safe_putenv = FALSE; -#endif /* PERL_USE_SAFE_PUTENV */ /* if user wants control of gprof profiling off by default */ /* noop unless Configure is given -Accflags=-DPERL_GPROF_CONTROL */ @@ -138,8 +135,29 @@ main(int argc, char **argv, char **env) PL_perl_destruct_level = 0; } PL_exit_flags |= PERL_EXIT_DESTRUCT_END; - if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL)) + if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL)) { + + /* perl_parse() may end up starting its own run loops, which + * might end up "leaking" PL_restartop from the parse phase into + * the run phase which then ends up confusing run_body(). This + * leakage shouldn't happen and if it does its a bug. + * + * Note we do not do this assert in perl_run() or perl_parse() + * as there are modules out there which explicitly set + * PL_restartop before calling perl_run() directly from XS code + * (Coro), and it is conceivable PL_restartop could be set prior + * to calling perl_parse() by XS code as well. + * + * What we want to check is that the top level perl_parse(), + * perl_run() pairing does not allow a leaking PL_restartop, as + * that indicates a bug in perl. By putting the assert here we + * can validate that Perl itself is operating correctly without + * risking breakage to XS code under DEBUGGING. - Yves + */ + assert(!PL_restartop); + perl_run(my_perl); + } #ifndef PERL_MICRO /* Unregister our signal handler before destroying my_perl */ @@ -153,19 +171,6 @@ main(int argc, char **argv, char **env) exitstatus = perl_destruct(my_perl); perl_free(my_perl); - -#if defined(USE_ENVIRON_ARRAY) && defined(PERL_TRACK_MEMPOOL) && !defined(NO_ENV_ARRAY_IN_MAIN) - /* - * The old environment may have been freed by perl_free() - * when PERL_TRACK_MEMPOOL is defined, but without having - * been restored by perl_destruct() before (this is only - * done if destruct_level > 0). - * - * It is important to have a valid environment for atexit() - * routines that are eventually called. - */ - environ = env; -#endif PERL_SYS_TERM(); Index: gnu/usr.bin/perl/ext/File-Find/lib/File/Find.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/File-Find/lib/File/Find.pm,v diff -u -p -a -u -p -r1.5 Find.pm --- gnu/usr.bin/perl/ext/File-Find/lib/File/Find.pm 15 Feb 2023 01:36:30 -0000 1.5 +++ gnu/usr.bin/perl/ext/File-Find/lib/File/Find.pm 21 Feb 2024 15:47:02 -0000 @@ -3,7 +3,7 @@ use 5.006; use strict; use warnings; use warnings::register; -our $VERSION = '1.40'; +our $VERSION = '1.43'; use Exporter 'import'; require Cwd; @@ -43,25 +43,35 @@ sub contract_name { return $abs_name; } +sub _is_absolute { + return $_[0] =~ m|^(?:[A-Za-z]:)?/| if $Is_Win32; + return substr($_[0], 0, 1) eq '/'; +} + +sub _is_root { + return $_[0] =~ m|^(?:[A-Za-z]:)?/\z| if $Is_Win32; + return $_[0] eq '/'; +} + sub PathCombine($$) { my ($Base,$Name) = @_; my $AbsName; - if (substr($Name,0,1) eq '/') { - $AbsName= $Name; + if (_is_absolute($Name)) { + $AbsName= $Name; } else { - $AbsName= contract_name($Base,$Name); + $AbsName= contract_name($Base,$Name); } # (simple) check for recursion my $newlen= length($AbsName); if ($newlen <= length($Base)) { - if (($newlen == length($Base) || substr($Base,$newlen,1) eq '/') - && $AbsName eq substr($Base,0,$newlen)) - { - return undef; - } + if (($newlen == length($Base) || substr($Base,$newlen,1) eq '/') + && $AbsName eq substr($Base,0,$newlen)) + { + return undef; + } } return $AbsName; } @@ -73,37 +83,40 @@ sub Follow_SymLink($) { ($DEV, $INO)= lstat $AbsName; while (-l _) { - if ($SLnkSeen{$DEV, $INO}++) { - if ($follow_skip < 2) { - die "$AbsName is encountered a second time"; - } - else { - return undef; - } - } - $NewName= PathCombine($AbsName, readlink($AbsName)); - unless(defined $NewName) { - if ($follow_skip < 2) { - die "$AbsName is a recursive symbolic link"; - } - else { - return undef; - } - } - else { - $AbsName= $NewName; - } - ($DEV, $INO) = lstat($AbsName); - return undef unless defined $DEV; # dangling symbolic link + if ($SLnkSeen{$DEV, $INO}++) { + if ($follow_skip < 2) { + die "$AbsName is encountered a second time"; + } + else { + return undef; + } + } + my $Link = readlink($AbsName); + # canonicalize directory separators + $Link =~ s|\\|/|g if $Is_Win32; + $NewName= PathCombine($AbsName, $Link); + unless(defined $NewName) { + if ($follow_skip < 2) { + die "$AbsName is a recursive symbolic link"; + } + else { + return undef; + } + } + else { + $AbsName= $NewName; + } + ($DEV, $INO) = lstat($AbsName); + return undef unless defined $DEV; # dangling symbolic link } if ($full_check && defined $DEV && $SLnkSeen{$DEV, $INO}++) { - if ( ($follow_skip < 1) || ((-d _) && ($follow_skip < 2)) ) { - die "$AbsName encountered a second time"; - } - else { - return undef; - } + if ( ($follow_skip < 1) || ((-d _) && ($follow_skip < 2)) ) { + die "$AbsName encountered a second time"; + } + else { + return undef; + } } return $AbsName; @@ -123,6 +136,7 @@ sub is_tainted_pp { return length($@) != 0; } + sub _find_opt { my $wanted = shift; return unless @_; @@ -133,25 +147,25 @@ sub _find_opt { local %SLnkSeen; local ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow, - $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat, - $pre_process, $post_process, $dangling_symlinks); + $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat, + $pre_process, $post_process, $dangling_symlinks); local($dir, $name, $fullname, $prune); local *_ = \my $a; my $cwd = $wanted->{bydepth} ? Cwd::fastcwd() : Cwd::getcwd(); if ($Is_VMS) { - # VMS returns this by default in VMS format which just doesn't - # work for the rest of this module. - $cwd = VMS::Filespec::unixpath($cwd); - - # Apparently this is not expected to have a trailing space. - # To attempt to make VMS/UNIX conversions mostly reversible, - # a trailing slash is needed. The run-time functions ignore the - # resulting double slash, but it causes the perl tests to fail. + # VMS returns this by default in VMS format which just doesn't + # work for the rest of this module. + $cwd = VMS::Filespec::unixpath($cwd); + + # Apparently this is not expected to have a trailing space. + # To attempt to make VMS/UNIX conversions mostly reversible, + # a trailing slash is needed. The run-time functions ignore the + # resulting double slash, but it causes the perl tests to fail. $cwd =~ s#/\z##; - # This comes up in upper case now, but should be lower. - # In the future this could be exact case, no need to change. + # This comes up in upper case now, but should be lower. + # In the future this could be exact case, no need to change. } my $cwd_untainted = $cwd; my $check_t_cwd = 1; @@ -178,109 +192,107 @@ sub _find_opt { Proc_Top_Item: foreach my $TOP (@_) { - my $top_item = $TOP; - $top_item = VMS::Filespec::unixify($top_item) if $Is_VMS; + my $top_item = $TOP; + $top_item = VMS::Filespec::unixify($top_item) if $Is_VMS; - ($topdev,$topino,$topmode,$topnlink) = $follow ? stat $top_item : lstat $top_item; + ($topdev,$topino,$topmode,$topnlink) = $follow ? stat $top_item : lstat $top_item; - if ($Is_Win32) { - $top_item =~ s|[/\\]\z|| - unless $top_item =~ m{^(?:\w:)?[/\\]$}; - } - else { - $top_item =~ s|/\z|| unless $top_item eq '/'; - } - - $Is_Dir= 0; - - if ($follow) { - - if (substr($top_item,0,1) eq '/') { - $abs_dir = $top_item; - } - elsif ($top_item eq $File::Find::current_dir) { - $abs_dir = $cwd; - } - else { # care about any ../ - $top_item =~ s/\.dir\z//i if $Is_VMS; - $abs_dir = contract_name("$cwd/",$top_item); - } - $abs_dir= Follow_SymLink($abs_dir); - unless (defined $abs_dir) { - if ($dangling_symlinks) { - if (ref $dangling_symlinks eq 'CODE') { - $dangling_symlinks->($top_item, $cwd); - } else { - warnings::warnif "$top_item is a dangling symbolic link\n"; - } - } - next Proc_Top_Item; - } - - if (-d _) { - $top_item =~ s/\.dir\z//i if $Is_VMS; - _find_dir_symlnk($wanted, $abs_dir, $top_item); - $Is_Dir= 1; - } - } - else { # no follow - $topdir = $top_item; - unless (defined $topnlink) { - warnings::warnif "Can't stat $top_item: $!\n"; - next Proc_Top_Item; - } - if (-d _) { - $top_item =~ s/\.dir\z//i if $Is_VMS; - _find_dir($wanted, $top_item, $topnlink); - $Is_Dir= 1; - } - else { - $abs_dir= $top_item; - } - } - - unless ($Is_Dir) { - unless (($_,$dir) = File::Basename::fileparse($abs_dir)) { - ($dir,$_) = ('./', $top_item); - } - - $abs_dir = $dir; - if (( $untaint ) && (is_tainted($dir) )) { - ( $abs_dir ) = $dir =~ m|$untaint_pat|; - unless (defined $abs_dir) { - if ($untaint_skip == 0) { - die "directory $dir is still tainted"; - } - else { - next Proc_Top_Item; - } - } - } - - unless ($no_chdir || chdir $abs_dir) { - warnings::warnif "Couldn't chdir $abs_dir: $!\n"; - next Proc_Top_Item; - } - - $name = $abs_dir . $_; # $File::Find::name - $_ = $name if $no_chdir; - - { $wanted_callback->() }; # protect against wild "next" - - } - - unless ( $no_chdir ) { - if ( ($check_t_cwd) && (($untaint) && (is_tainted($cwd) )) ) { - ( $cwd_untainted ) = $cwd =~ m|$untaint_pat|; - unless (defined $cwd_untainted) { - die "insecure cwd in find(depth)"; - } - $check_t_cwd = 0; - } - unless (chdir $cwd_untainted) { - die "Can't cd to $cwd: $!\n"; - } - } + # canonicalize directory separators + $top_item =~ s|[/\\]|/|g if $Is_Win32; + + # no trailing / unless path is root + $top_item =~ s|/\z|| unless _is_root($top_item); + + $Is_Dir= 0; + + if ($follow) { + + if (_is_absolute($top_item)) { + $abs_dir = $top_item; + } + elsif ($top_item eq $File::Find::current_dir) { + $abs_dir = $cwd; + } + else { # care about any ../ + $top_item =~ s/\.dir\z//i if $Is_VMS; + $abs_dir = contract_name("$cwd/",$top_item); + } + $abs_dir= Follow_SymLink($abs_dir); + unless (defined $abs_dir) { + if ($dangling_symlinks) { + if (ref $dangling_symlinks eq 'CODE') { + $dangling_symlinks->($top_item, $cwd); + } else { + warnings::warnif "$top_item is a dangling symbolic link\n"; + } + } + next Proc_Top_Item; + } + + if (-d _) { + $top_item =~ s/\.dir\z//i if $Is_VMS; + _find_dir_symlnk($wanted, $abs_dir, $top_item); + $Is_Dir= 1; + } + } + else { # no follow + $topdir = $top_item; + unless (defined $topnlink) { + warnings::warnif "Can't stat $top_item: $!\n"; + next Proc_Top_Item; + } + if (-d _) { + $top_item =~ s/\.dir\z//i if $Is_VMS; + _find_dir($wanted, $top_item, $topnlink); + $Is_Dir= 1; + } + else { + $abs_dir= $top_item; + } + } + + unless ($Is_Dir) { + unless (($_,$dir) = File::Basename::fileparse($abs_dir)) { + ($dir,$_) = ('./', $top_item); + } + + $abs_dir = $dir; + if (( $untaint ) && (is_tainted($dir) )) { + ( $abs_dir ) = $dir =~ m|$untaint_pat|; + unless (defined $abs_dir) { + if ($untaint_skip == 0) { + die "directory $dir is still tainted"; + } + else { + next Proc_Top_Item; + } + } + } + + unless ($no_chdir || chdir $abs_dir) { + warnings::warnif "Couldn't chdir $abs_dir: $!\n"; + next Proc_Top_Item; + } + + $name = $abs_dir . $_; # $File::Find::name + $_ = $name if $no_chdir; + + { $wanted_callback->() }; # protect against wild "next" + + } + + unless ( $no_chdir ) { + if ( ($check_t_cwd) && (($untaint) && (is_tainted($cwd) )) ) { + ( $cwd_untainted ) = $cwd =~ m|$untaint_pat|; + unless (defined $cwd_untainted) { + die "insecure cwd in find(depth)"; + } + $check_t_cwd = 0; + } + unless (chdir $cwd_untainted) { + die "Can't cd to $cwd: $!\n"; + } + } } } @@ -304,179 +316,170 @@ sub _find_dir($$$) { my $tainted = 0; my $no_nlink; - if ($Is_Win32) { - $dir_pref - = ($p_dir =~ m{^(?:\w:[/\\]?|[/\\])$} ? $p_dir : "$p_dir/" ); - } elsif ($Is_VMS) { - - # VMS is returning trailing .dir on directories - # and trailing . on files and symbolic links - # in UNIX syntax. - # + if ($Is_VMS) { + # VMS is returning trailing .dir on directories + # and trailing . on files and symbolic links + # in UNIX syntax. + # - $p_dir =~ s/\.(dir)?$//i unless $p_dir eq '.'; + $p_dir =~ s/\.(dir)?$//i unless $p_dir eq '.'; - $dir_pref = ($p_dir =~ m/[\]>]+$/ ? $p_dir : "$p_dir/" ); + $dir_pref = ($p_dir =~ m/[\]>]+$/ ? $p_dir : "$p_dir/" ); } else { - $dir_pref= ( $p_dir eq '/' ? '/' : "$p_dir/" ); + $dir_pref = _is_root($p_dir) ? $p_dir : "$p_dir/"; } local ($dir, $name, $prune); unless ( $no_chdir || ($p_dir eq $File::Find::current_dir)) { - my $udir = $p_dir; - if (( $untaint ) && (is_tainted($p_dir) )) { - ( $udir ) = $p_dir =~ m|$untaint_pat|; - unless (defined $udir) { - if ($untaint_skip == 0) { - die "directory $p_dir is still tainted"; - } - else { - return; - } - } - } - unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) { - warnings::warnif "Can't cd to $udir: $!\n"; - return; - } + my $udir = $p_dir; + if (( $untaint ) && (is_tainted($p_dir) )) { + ( $udir ) = $p_dir =~ m|$untaint_pat|; + unless (defined $udir) { + if ($untaint_skip == 0) { + die "directory $p_dir is still tainted"; + } + else { + return; + } + } + } + unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) { + warnings::warnif "Can't cd to $udir: $!\n"; + return; + } } # push the starting directory push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth; while (defined $SE) { - unless ($bydepth) { - $dir= $p_dir; # $File::Find::dir - $name= $dir_name; # $File::Find::name - $_= ($no_chdir ? $dir_name : $dir_rel ); # $_ - # prune may happen here - $prune= 0; - { $wanted_callback->() }; # protect against wild "next" - next if $prune; - } - - # change to that directory - unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { - my $udir= $dir_rel; - if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_rel) )) ) { - ( $udir ) = $dir_rel =~ m|$untaint_pat|; - unless (defined $udir) { - if ($untaint_skip == 0) { - die "directory (" . ($p_dir ne '/' ? $p_dir : '') . "/) $dir_rel is still tainted"; - } else { # $untaint_skip == 1 - next; - } - } - } - unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) { - warnings::warnif "Can't cd to (" . - ($p_dir ne '/' ? $p_dir : '') . "/) $udir: $!\n"; - next; - } - $CdLvl++; - } - - $dir= $dir_name; # $File::Find::dir - - # Get the list of files in the current directory. - my $dh; - unless (opendir $dh, ($no_chdir ? $dir_name : $File::Find::current_dir)) { - warnings::warnif "Can't opendir($dir_name): $!\n"; - next; - } - @filenames = readdir $dh; - closedir($dh); - @filenames = $pre_process->(@filenames) if $pre_process; - push @Stack,[$CdLvl,$dir_name,"",-2] if $post_process; + unless ($bydepth) { + $dir= $p_dir; # $File::Find::dir + $name= $dir_name; # $File::Find::name + $_= ($no_chdir ? $dir_name : $dir_rel ); # $_ + # prune may happen here + $prune= 0; + { $wanted_callback->() }; # protect against wild "next" + next if $prune; + } + + # change to that directory + unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { + my $udir= $dir_rel; + if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_rel) )) ) { + ( $udir ) = $dir_rel =~ m|$untaint_pat|; + unless (defined $udir) { + if ($untaint_skip == 0) { + die "directory (" . ($p_dir ne '/' ? $p_dir : '') . "/) $dir_rel is still tainted"; + } else { # $untaint_skip == 1 + next; + } + } + } + unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) { + warnings::warnif "Can't cd to (" . + ($p_dir ne '/' ? $p_dir : '') . "/) $udir: $!\n"; + next; + } + $CdLvl++; + } + + $dir= $dir_name; # $File::Find::dir + + # Get the list of files in the current directory. + my $dh; + unless (opendir $dh, ($no_chdir ? $dir_name : $File::Find::current_dir)) { + warnings::warnif "Can't opendir($dir_name): $!\n"; + next; + } + @filenames = readdir $dh; + closedir($dh); + @filenames = $pre_process->(@filenames) if $pre_process; + push @Stack,[$CdLvl,$dir_name,"",-2] if $post_process; - # default: use whatever was specified + # default: use whatever was specified # (if $nlink >= 2, and $avoid_nlink == 0, this will switch back) $no_nlink = $avoid_nlink; # if dir has wrong nlink count, force switch to slower stat method $no_nlink = 1 if ($nlink < 2); - if ($nlink == 2 && !$no_nlink) { - # This dir has no subdirectories. - for my $FN (@filenames) { - if ($Is_VMS) { - # Big hammer here - Compensate for VMS trailing . and .dir - # No win situation until this is changed, but this - # will handle the majority of the cases with breaking the fewest - - $FN =~ s/\.dir\z//i; - $FN =~ s#\.$## if ($FN ne '.'); - } - next if $FN =~ $File::Find::skip_pattern; - - $name = $dir_pref . $FN; # $File::Find::name - $_ = ($no_chdir ? $name : $FN); # $_ - { $wanted_callback->() }; # protect against wild "next" - } - - } - else { - # This dir has subdirectories. - $subcount = $nlink - 2; - - # HACK: insert directories at this position, so as to preserve - # the user pre-processed ordering of files (thus ensuring - # directory traversal is in user sorted order, not at random). + if ($nlink == 2 && !$no_nlink) { + # This dir has no subdirectories. + for my $FN (@filenames) { + if ($Is_VMS) { + # Big hammer here - Compensate for VMS trailing . and .dir + # No win situation until this is changed, but this + # will handle the majority of the cases with breaking the fewest + + $FN =~ s/\.dir\z//i; + $FN =~ s#\.$## if ($FN ne '.'); + } + next if $FN =~ $File::Find::skip_pattern; + + $name = $dir_pref . $FN; # $File::Find::name + $_ = ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + + } + else { + # This dir has subdirectories. + $subcount = $nlink - 2; + + # HACK: insert directories at this position, so as to preserve + # the user pre-processed ordering of files (thus ensuring + # directory traversal is in user sorted order, not at random). my $stack_top = @Stack; - for my $FN (@filenames) { - next if $FN =~ $File::Find::skip_pattern; - if ($subcount > 0 || $no_nlink) { - # Seen all the subdirs? - # check for directoriness. - # stat is faster for a file in the current directory - $sub_nlink = (lstat ($no_chdir ? $dir_pref . $FN : $FN))[3]; - - if (-d _) { - --$subcount; - $FN =~ s/\.dir\z//i if $Is_VMS; - # HACK: replace push to preserve dir traversal order - #push @Stack,[$CdLvl,$dir_name,$FN,$sub_nlink]; - splice @Stack, $stack_top, 0, - [$CdLvl,$dir_name,$FN,$sub_nlink]; - } - else { - $name = $dir_pref . $FN; # $File::Find::name - $_= ($no_chdir ? $name : $FN); # $_ - { $wanted_callback->() }; # protect against wild "next" - } - } - else { - $name = $dir_pref . $FN; # $File::Find::name - $_= ($no_chdir ? $name : $FN); # $_ - { $wanted_callback->() }; # protect against wild "next" - } - } - } + for my $FN (@filenames) { + next if $FN =~ $File::Find::skip_pattern; + if ($subcount > 0 || $no_nlink) { + # Seen all the subdirs? + # check for directoriness. + # stat is faster for a file in the current directory + $sub_nlink = (lstat ($no_chdir ? $dir_pref . $FN : $FN))[3]; + + if (-d _) { + --$subcount; + $FN =~ s/\.dir\z//i if $Is_VMS; + # HACK: replace push to preserve dir traversal order + #push @Stack,[$CdLvl,$dir_name,$FN,$sub_nlink]; + splice @Stack, $stack_top, 0, + [$CdLvl,$dir_name,$FN,$sub_nlink]; + } + else { + $name = $dir_pref . $FN; # $File::Find::name + $_= ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + } + else { + $name = $dir_pref . $FN; # $File::Find::name + $_= ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + } + } } continue { - while ( defined ($SE = pop @Stack) ) { - ($Level, $p_dir, $dir_rel, $nlink) = @$SE; - if ($CdLvl > $Level && !$no_chdir) { - my $tmp; - if ($Is_VMS) { - $tmp = '[' . ('-' x ($CdLvl-$Level)) . ']'; - } - else { - $tmp = join('/',('..') x ($CdLvl-$Level)); - } - die "Can't cd to $tmp from $dir_name: $!" - unless chdir ($tmp); - $CdLvl = $Level; - } - - if ($Is_Win32) { - $dir_name = ($p_dir =~ m{^(?:\w:[/\\]?|[/\\])$} - ? "$p_dir$dir_rel" : "$p_dir/$dir_rel"); - $dir_pref = "$dir_name/"; - } - elsif ($^O eq 'VMS') { + while ( defined ($SE = pop @Stack) ) { + ($Level, $p_dir, $dir_rel, $nlink) = @$SE; + if ($CdLvl > $Level && !$no_chdir) { + my $tmp; + if ($Is_VMS) { + $tmp = '[' . ('-' x ($CdLvl-$Level)) . ']'; + } + else { + $tmp = join('/',('..') x ($CdLvl-$Level)); + } + die "Can't cd to $tmp from $dir_name: $!" + unless chdir ($tmp); + $CdLvl = $Level; + } + + if ($^O eq 'VMS') { if ($p_dir =~ m/[\]>]+$/) { $dir_name = $p_dir; $dir_name =~ s/([\]>]+)$/.$dir_rel$1/; @@ -486,34 +489,34 @@ sub _find_dir($$$) { $dir_name = "$p_dir/$dir_rel"; $dir_pref = "$dir_name/"; } - } - else { - $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel"); - $dir_pref = "$dir_name/"; - } + } + else { + $dir_name = _is_root($p_dir) ? "$p_dir$dir_rel" : "$p_dir/$dir_rel"; + $dir_pref = "$dir_name/"; + } - if ( $nlink == -2 ) { - $name = $dir = $p_dir; # $File::Find::name / dir + if ( $nlink == -2 ) { + $name = $dir = $p_dir; # $File::Find::name / dir $_ = $File::Find::current_dir; - $post_process->(); # End-of-directory processing - } - elsif ( $nlink < 0 ) { # must be finddepth, report dirname now - $name = $dir_name; - if ( substr($name,-2) eq '/.' ) { - substr($name, length($name) == 2 ? -1 : -2) = ''; - } - $dir = $p_dir; - $_ = ($no_chdir ? $dir_name : $dir_rel ); - if ( substr($_,-2) eq '/.' ) { - substr($_, length($_) == 2 ? -1 : -2) = ''; - } - { $wanted_callback->() }; # protect against wild "next" - } - else { - push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth; - last; - } - } + $post_process->(); # End-of-directory processing + } + elsif ( $nlink < 0 ) { # must be finddepth, report dirname now + $name = $dir_name; + if ( substr($name,-2) eq '/.' ) { + substr($name, length($name) == 2 ? -1 : -2) = ''; + } + $dir = $p_dir; + $_ = ($no_chdir ? $dir_name : $dir_rel ); + if ( substr($_,-2) eq '/.' ) { + substr($_, length($_) == 2 ? -1 : -2) = ''; + } + { $wanted_callback->() }; # protect against wild "next" + } + else { + push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth; + last; + } + } } } @@ -540,172 +543,172 @@ sub _find_dir_symlnk($$$) { my $tainted = 0; my $ok = 1; - $dir_pref = ( $p_dir eq '/' ? '/' : "$p_dir/" ); - $loc_pref = ( $dir_loc eq '/' ? '/' : "$dir_loc/" ); + $dir_pref = _is_root($p_dir) ? $p_dir : "$p_dir/"; + $loc_pref = _is_root($dir_loc) ? $dir_loc : "$dir_loc/"; local ($dir, $name, $fullname, $prune); unless ($no_chdir) { - # untaint the topdir - if (( $untaint ) && (is_tainted($dir_loc) )) { - ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; # parent dir, now untainted - # once untainted, $updir_loc is pushed on the stack (as parent directory); - # hence, we don't need to untaint the parent directory every time we chdir - # to it later - unless (defined $updir_loc) { - if ($untaint_skip == 0) { - die "directory $dir_loc is still tainted"; - } - else { - return; - } - } - } - $ok = chdir($updir_loc) unless ($p_dir eq $File::Find::current_dir); - unless ($ok) { - warnings::warnif "Can't cd to $updir_loc: $!\n"; - return; - } + # untaint the topdir + if (( $untaint ) && (is_tainted($dir_loc) )) { + ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; # parent dir, now untainted + # once untainted, $updir_loc is pushed on the stack (as parent directory); + # hence, we don't need to untaint the parent directory every time we chdir + # to it later + unless (defined $updir_loc) { + if ($untaint_skip == 0) { + die "directory $dir_loc is still tainted"; + } + else { + return; + } + } + } + $ok = chdir($updir_loc) unless ($p_dir eq $File::Find::current_dir); + unless ($ok) { + warnings::warnif "Can't cd to $updir_loc: $!\n"; + return; + } } push @Stack,[$dir_loc,$updir_loc,$p_dir,$dir_rel,-1] if $bydepth; while (defined $SE) { - unless ($bydepth) { - # change (back) to parent directory (always untainted) - unless ($no_chdir) { - unless (chdir $updir_loc) { - warnings::warnif "Can't cd to $updir_loc: $!\n"; - next; - } - } - $dir= $p_dir; # $File::Find::dir - $name= $dir_name; # $File::Find::name - $_= ($no_chdir ? $dir_name : $dir_rel ); # $_ - $fullname= $dir_loc; # $File::Find::fullname - # prune may happen here - $prune= 0; - lstat($_); # make sure file tests with '_' work - { $wanted_callback->() }; # protect against wild "next" - next if $prune; - } - - # change to that directory - unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { - $updir_loc = $dir_loc; - if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_loc) )) ) { - # untaint $dir_loc, what will be pushed on the stack as (untainted) parent dir - ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; - unless (defined $updir_loc) { - if ($untaint_skip == 0) { - die "directory $dir_loc is still tainted"; - } - else { - next; - } - } - } - unless (chdir $updir_loc) { - warnings::warnif "Can't cd to $updir_loc: $!\n"; - next; - } - } - - $dir = $dir_name; # $File::Find::dir - - # Get the list of files in the current directory. - my $dh; - unless (opendir $dh, ($no_chdir ? $dir_loc : $File::Find::current_dir)) { - warnings::warnif "Can't opendir($dir_loc): $!\n"; - next; - } - @filenames = readdir $dh; - closedir($dh); - - for my $FN (@filenames) { - if ($Is_VMS) { - # Big hammer here - Compensate for VMS trailing . and .dir - # No win situation until this is changed, but this - # will handle the majority of the cases with breaking the fewest. - - $FN =~ s/\.dir\z//i; - $FN =~ s#\.$## if ($FN ne '.'); - } - next if $FN =~ $File::Find::skip_pattern; - - # follow symbolic links / do an lstat - $new_loc = Follow_SymLink($loc_pref.$FN); - - # ignore if invalid symlink - unless (defined $new_loc) { - if (!defined -l _ && $dangling_symlinks) { + unless ($bydepth) { + # change (back) to parent directory (always untainted) + unless ($no_chdir) { + unless (chdir $updir_loc) { + warnings::warnif "Can't cd to $updir_loc: $!\n"; + next; + } + } + $dir= $p_dir; # $File::Find::dir + $name= $dir_name; # $File::Find::name + $_= ($no_chdir ? $dir_name : $dir_rel ); # $_ + $fullname= $dir_loc; # $File::Find::fullname + # prune may happen here + $prune= 0; + lstat($_); # make sure file tests with '_' work + { $wanted_callback->() }; # protect against wild "next" + next if $prune; + } + + # change to that directory + unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { + $updir_loc = $dir_loc; + if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_loc) )) ) { + # untaint $dir_loc, what will be pushed on the stack as (untainted) parent dir + ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; + unless (defined $updir_loc) { + if ($untaint_skip == 0) { + die "directory $dir_loc is still tainted"; + } + else { + next; + } + } + } + unless (chdir $updir_loc) { + warnings::warnif "Can't cd to $updir_loc: $!\n"; + next; + } + } + + $dir = $dir_name; # $File::Find::dir + + # Get the list of files in the current directory. + my $dh; + unless (opendir $dh, ($no_chdir ? $dir_loc : $File::Find::current_dir)) { + warnings::warnif "Can't opendir($dir_loc): $!\n"; + next; + } + @filenames = readdir $dh; + closedir($dh); + + for my $FN (@filenames) { + if ($Is_VMS) { + # Big hammer here - Compensate for VMS trailing . and .dir + # No win situation until this is changed, but this + # will handle the majority of the cases with breaking the fewest. + + $FN =~ s/\.dir\z//i; + $FN =~ s#\.$## if ($FN ne '.'); + } + next if $FN =~ $File::Find::skip_pattern; + + # follow symbolic links / do an lstat + $new_loc = Follow_SymLink($loc_pref.$FN); + + # ignore if invalid symlink + unless (defined $new_loc) { + if (!defined -l _ && $dangling_symlinks) { $fullname = undef; - if (ref $dangling_symlinks eq 'CODE') { - $dangling_symlinks->($FN, $dir_pref); - } else { - warnings::warnif "$dir_pref$FN is a dangling symbolic link\n"; - } - } + if (ref $dangling_symlinks eq 'CODE') { + $dangling_symlinks->($FN, $dir_pref); + } else { + warnings::warnif "$dir_pref$FN is a dangling symbolic link\n"; + } + } else { $fullname = $loc_pref . $FN; } - $name = $dir_pref . $FN; - $_ = ($no_chdir ? $name : $FN); - { $wanted_callback->() }; - next; - } - - if (-d _) { - if ($Is_VMS) { - $FN =~ s/\.dir\z//i; - $FN =~ s#\.$## if ($FN ne '.'); - $new_loc =~ s/\.dir\z//i; - $new_loc =~ s#\.$## if ($new_loc ne '.'); - } - push @Stack,[$new_loc,$updir_loc,$dir_name,$FN,1]; - } - else { - $fullname = $new_loc; # $File::Find::fullname - $name = $dir_pref . $FN; # $File::Find::name - $_ = ($no_chdir ? $name : $FN); # $_ - { $wanted_callback->() }; # protect against wild "next" - } - } + $name = $dir_pref . $FN; + $_ = ($no_chdir ? $name : $FN); + { $wanted_callback->() }; + next; + } + + if (-d _) { + if ($Is_VMS) { + $FN =~ s/\.dir\z//i; + $FN =~ s#\.$## if ($FN ne '.'); + $new_loc =~ s/\.dir\z//i; + $new_loc =~ s#\.$## if ($new_loc ne '.'); + } + push @Stack,[$new_loc,$updir_loc,$dir_name,$FN,1]; + } + else { + $fullname = $new_loc; # $File::Find::fullname + $name = $dir_pref . $FN; # $File::Find::name + $_ = ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + } } continue { - while (defined($SE = pop @Stack)) { - ($dir_loc, $updir_loc, $p_dir, $dir_rel, $byd_flag) = @$SE; - $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel"); - $dir_pref = "$dir_name/"; - $loc_pref = "$dir_loc/"; - if ( $byd_flag < 0 ) { # must be finddepth, report dirname now - unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { - unless (chdir $updir_loc) { # $updir_loc (parent dir) is always untainted - warnings::warnif "Can't cd to $updir_loc: $!\n"; - next; - } - } - $fullname = $dir_loc; # $File::Find::fullname - $name = $dir_name; # $File::Find::name - if ( substr($name,-2) eq '/.' ) { - substr($name, length($name) == 2 ? -1 : -2) = ''; # $File::Find::name - } - $dir = $p_dir; # $File::Find::dir - $_ = ($no_chdir ? $dir_name : $dir_rel); # $_ - if ( substr($_,-2) eq '/.' ) { - substr($_, length($_) == 2 ? -1 : -2) = ''; - } - - lstat($_); # make sure file tests with '_' work - { $wanted_callback->() }; # protect against wild "next" - } - else { - push @Stack,[$dir_loc, $updir_loc, $p_dir, $dir_rel,-1] if $bydepth; - last; - } - } + while (defined($SE = pop @Stack)) { + ($dir_loc, $updir_loc, $p_dir, $dir_rel, $byd_flag) = @$SE; + $dir_name = _is_root($p_dir) ? "$p_dir$dir_rel" : "$p_dir/$dir_rel"; + $dir_pref = "$dir_name/"; + $loc_pref = "$dir_loc/"; + if ( $byd_flag < 0 ) { # must be finddepth, report dirname now + unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { + unless (chdir $updir_loc) { # $updir_loc (parent dir) is always untainted + warnings::warnif "Can't cd to $updir_loc: $!\n"; + next; + } + } + $fullname = $dir_loc; # $File::Find::fullname + $name = $dir_name; # $File::Find::name + if ( substr($name,-2) eq '/.' ) { + substr($name, length($name) == 2 ? -1 : -2) = ''; # $File::Find::name + } + $dir = $p_dir; # $File::Find::dir + $_ = ($no_chdir ? $dir_name : $dir_rel); # $_ + if ( substr($_,-2) eq '/.' ) { + substr($_, length($_) == 2 ? -1 : -2) = ''; + } + + lstat($_); # make sure file tests with '_' work + { $wanted_callback->() }; # protect against wild "next" + } + else { + push @Stack,[$dir_loc, $updir_loc, $p_dir, $dir_rel,-1] if $bydepth; + last; + } + } } } @@ -913,8 +916,6 @@ a dangling symbolic link, then fullname =back -This is a no-op on Win32. - =item C This is similar to I except that it may report some files more @@ -922,8 +923,6 @@ than once. It does detect cycles, howev have to be hashed, this is much cheaper both in space and time. If processing a file more than once (by the user's C function) is worse than just taking time, the option I should be used. - -This is also a no-op on Win32. =item C Index: gnu/usr.bin/perl/ext/File-Find/t/correct-absolute-path-with-follow.t =================================================================== RCS file: gnu/usr.bin/perl/ext/File-Find/t/correct-absolute-path-with-follow.t diff -N gnu/usr.bin/perl/ext/File-Find/t/correct-absolute-path-with-follow.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/ext/File-Find/t/correct-absolute-path-with-follow.t 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,63 @@ +#!./perl + +use strict; +use warnings; + +use File::Find qw( find finddepth ); +use File::Temp qw(); +use Test::More; + +my $warn_msg; + +BEGIN { + $SIG{'__WARN__'} = sub { + $warn_msg = $_[0]; + warn "# $_[0]"; + return; + } +} + +sub test_find_correct_paths_with_follow { + $warn_msg = ''; + my $dir = File::Temp->newdir('file-find-XXXXXX', TMPDIR => 1, CLEANUP => 1); + + find( + { + follow => 1, + wanted => sub { return }, + }, + $dir, + ); + + unlike( + $warn_msg, + qr/Couldn't chdir/, + 'find: Derive absolute path correctly with follow => 1', + ); +} + +sub test_finddepth_correct_paths_with_follow { + $warn_msg = ''; + my $dir = File::Temp->newdir('file-find-XXXXXX', TMPDIR => 1, CLEANUP => 1); + + finddepth( + { + follow => 1, + wanted => sub { return }, + }, + $dir, + ); + + unlike( + $warn_msg, + qr/Couldn't chdir/, + 'finddepth: Derive absolute path correctly with follow => 1', + ); +} +sub run { + test_find_correct_paths_with_follow; + test_finddepth_correct_paths_with_follow; + done_testing; +} + +run(); Index: gnu/usr.bin/perl/ext/File-Find/t/find.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/File-Find/t/find.t,v diff -u -p -a -u -p -r1.5 find.t --- gnu/usr.bin/perl/ext/File-Find/t/find.t 15 Feb 2023 01:36:30 -0000 1.5 +++ gnu/usr.bin/perl/ext/File-Find/t/find.t 21 Feb 2024 15:47:02 -0000 @@ -33,15 +33,21 @@ use Testing qw( symlink_ok dir_path file_path + _cleanup_start ); use Errno (); +use File::Temp qw(tempdir); my %Expect_File = (); # what we expect for $_ my %Expect_Name = (); # what we expect for $File::Find::name/fullname my %Expect_Dir = (); # what we expect for $File::Find::dir my (@files); -my $orig_dir = cwd(); +my $test_root_dir = cwd(); +ok($test_root_dir,"We were able to determine our starting directory"); +my $test_temp_dir = tempdir("FF_find_t_XXXXXX",CLEANUP=>1); +ok($test_temp_dir,"We were able to set up a temp directory"); + # Uncomment this to see where File::Find is chdir-ing to. Helpful for # debugging its little jaunts around the filesystem. @@ -59,8 +65,6 @@ my $orig_dir = cwd(); # }; # } -cleanup(); - ##### Sanity checks ##### # Do find() and finddepth() work correctly with an empty list of # directories? @@ -73,23 +77,34 @@ cleanup(); } # Do find() and finddepth() work correctly in the directory -# from which we start? (Test presumes the presence of 'taint.t' in same +# from which we start? (Test presumes the presence of 'find.t' in same # directory as this test file.) -$::count_taint = 0; -find({wanted => sub { ++$::count_taint if $_ eq 'taint.t'; } }, +my $count_found = 0; +find({wanted => sub { ++$count_found if $_ eq 'find.t'; } }, File::Spec->curdir); -is($::count_taint, 1, "'find' found exactly 1 file named 'taint.t'"); +is($count_found, 1, "'find' found exactly 1 file named 'find.t'"); -$::count_taint = 0; -finddepth({wanted => sub { ++$::count_taint if $_ eq 'taint.t'; } }, +$count_found = 0; +finddepth({wanted => sub { ++$count_found if $_ eq 'find.t'; } }, File::Spec->curdir); -is($::count_taint, 1, "'finddepth' found exactly 1 file named 'taint.t'"); +is($count_found, 1, "'finddepth' found exactly 1 file named 'find.t'"); my $FastFileTests_OK = 0; +my $chdir_error = ""; +chdir($test_temp_dir) + or $chdir_error = "Failed to chdir to '$test_temp_dir': $!"; +is($chdir_error,"","chdir to temp dir '$test_temp_dir' successful") + or die $chdir_error; + sub cleanup { - chdir($orig_dir); + # the following chdirs into $test_root_dir/$test_temp_dir but + # handles various possible edge case errors cleanly. If it returns + # false then we bail out of the cleanup. + _cleanup_start($test_root_dir, $test_temp_dir) + or return; + my $need_updir = 0; if (-d dir_path('for_find')) { $need_updir = 1 if chdir(dir_path('for_find')); @@ -138,6 +153,7 @@ sub cleanup { if (-d dir_path('for_find')) { rmdir dir_path('for_find') or print "# Can't rmdir for_find: $!\n"; } + chdir($test_root_dir) or die "Failed to chdir to '$test_root_dir': $!"; } END { @@ -235,7 +251,6 @@ sub my_postprocess { *file_path_name = \&file_path; ##### Create directories, files and symlinks used in testing ##### - mkdir_ok( dir_path('for_find'), 0770 ); ok( chdir( dir_path('for_find')), "Able to chdir to 'for_find'") or die("Unable to chdir to 'for_find'"); @@ -865,7 +880,7 @@ if ( $symlink_exists ) { if ($^O eq 'MSWin32') { require File::Spec::Win32; - my ($volume) = File::Spec::Win32->splitpath($orig_dir, 1); + my ($volume) = File::Spec::Win32->splitpath($test_root_dir, 1); print STDERR "VOLUME = $volume\n"; ##### ##### @@ -1023,7 +1038,7 @@ if ($^O eq 'MSWin32') { # Check F:F:f correctly handles a root directory path. # Rather than processing the entire drive (!), simply test that the # first file passed to the wanted routine is correct and then bail out. - $orig_dir =~ /^(\w:)/ or die "expected a drive: $orig_dir"; + $test_root_dir =~ /^(\w:)/ or die "expected a drive: $test_root_dir"; my $drive = $1; # Determine the file in the root directory which would be @@ -1050,7 +1065,7 @@ if ($^O eq 'MSWin32') { # Run F:F:f with/without no_chdir for each possible style of root path. # NB. If HOME were "/", then an inadvertent chdir('') would fluke the # expected result, so ensure it is something else: - local $ENV{HOME} = $orig_dir; + local $ENV{HOME} = $test_root_dir; foreach my $no_chdir (0, 1) { foreach my $root_dir ("/", "\\", "$drive/", "$drive\\") { eval { @@ -1060,7 +1075,7 @@ if ($^O eq 'MSWin32') { 'wanted' => sub { -f or return; # the first call is for $root_dir itself. my $got = $File::Find::name; - my $exp = "$root_dir$expected_first_file"; + (my $exp = "$root_dir$expected_first_file") =~ s|\\|/|g; print "# no_chdir=$no_chdir $root_dir '$got'\n"; is($got, $exp, "Win32: Run 'find' with 'no_chdir' set to $no_chdir" ); @@ -1111,5 +1126,4 @@ if ($^O eq 'MSWin32') { like($@, qr/invalid top directory/, "find() correctly died due to undefined top directory"); } - done_testing(); Index: gnu/usr.bin/perl/ext/File-Find/t/taint.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/File-Find/t/taint.t,v diff -u -p -a -u -p -r1.1.1.3 taint.t --- gnu/usr.bin/perl/ext/File-Find/t/taint.t 15 Feb 2023 01:32:58 -0000 1.1.1.3 +++ gnu/usr.bin/perl/ext/File-Find/t/taint.t 21 Feb 2024 15:47:02 -0000 @@ -1,5 +1,6 @@ #!./perl -T use strict; +use lib qw( ./t/lib ); BEGIN { require File::Spec; @@ -7,7 +8,6 @@ BEGIN { # May be doing dynamic loading while @INC is all relative @INC = map { $_ = File::Spec->rel2abs($_); /(.*)/; $1 } @INC; } - if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'VMS') { # This is a hack - at present File::Find does not produce native names # on Win32 or VMS, so force File::Spec to use Unix names. @@ -18,24 +18,29 @@ BEGIN { require File::Find; import File::Find; } - use Test::More; -BEGIN { - plan( - ${^TAINT} - ? (tests => 45) - : (skip_all => "A perl without taint support") - ); -} -use lib qw( ./t/lib ); +use File::Find; +use File::Spec; +use Cwd; use Testing qw( create_file_ok mkdir_ok symlink_ok dir_path file_path + _cleanup_start ); use Errno (); +use Config; +use File::Temp qw(tempdir); + +BEGIN { + plan( + ${^TAINT} + ? (tests => 48) + : (skip_all => "A perl without taint support") + ); +} my %Expect_File = (); # what we expect for $_ my %Expect_Name = (); # what we expect for $File::Find::name/fullname @@ -43,20 +48,10 @@ my %Expect_Dir = (); # what we expect f my ($cwd, $cwd_untainted); BEGIN { - require File::Spec; - if ($ENV{PERL_CORE}) { - # May be doing dynamic loading while @INC is all relative - @INC = map { $_ = File::Spec->rel2abs($_); /(.*)/; $1 } @INC; - } -} - -use Config; - -BEGIN { if ($^O ne 'VMS') { - for (keys %ENV) { # untaint ENV - ($ENV{$_}) = $ENV{$_} =~ /(.*)/; - } + for (keys %ENV) { # untaint ENV + ($ENV{$_}) = $ENV{$_} =~ /(.*)/; + } } # Remove insecure directories from PATH @@ -64,32 +59,34 @@ BEGIN { my $sep = $Config{path_sep}; foreach my $dir (split(/\Q$sep/,$ENV{'PATH'})) { - ## - ## Match the directory taint tests in mg.c::Perl_magic_setenv() - ## - push(@path,$dir) unless (length($dir) >= 256 - or - substr($dir,0,1) ne "/" - or - (stat $dir)[2] & 002); + ## + ## Match the directory taint tests in mg.c::Perl_magic_setenv() + ## + push(@path,$dir) unless (length($dir) >= 256 + or + substr($dir,0,1) ne "/" + or + (stat $dir)[2] & 002); } $ENV{'PATH'} = join($sep,@path); } my $symlink_exists = eval { symlink("",""); 1 }; -use File::Find; -use File::Spec; -use Cwd; - -my $orig_dir = cwd(); -( my $orig_dir_untainted ) = $orig_dir =~ m|^(.+)$|; # untaint it - -cleanup(); +my $test_root_dir; # where we are when this test starts +my $test_root_dir_tainted = cwd(); +if ($test_root_dir_tainted =~ /^(.*)$/) { + $test_root_dir = $1; +} else { + die "Failed to untaint root dir of test"; +} +ok($test_root_dir,"test_root_dir is set up as expected"); +my $test_temp_dir = tempdir("FF_taint_t_XXXXXX",CLEANUP=>1); +ok($test_temp_dir,"test_temp_dir is set up as expected"); my $found; find({wanted => sub { ++$found if $_ eq 'taint.t' }, - untaint => 1, untaint_pattern => qr|^(.+)$|}, File::Spec->curdir); + untaint => 1, untaint_pattern => qr|^(.+)$|}, File::Spec->curdir); is($found, 1, 'taint.t found once'); $found = 0; @@ -102,34 +99,46 @@ is($found, 1, 'taint.t found once again' my $case = 2; my $FastFileTests_OK = 0; +my $chdir_error = ""; +chdir($test_temp_dir) + or $chdir_error = "Failed to chdir to '$test_temp_dir': $!"; +is($chdir_error,"","chdir to temp dir '$test_temp_dir' successful") + or die $chdir_error; + sub cleanup { - chdir($orig_dir_untainted); + # the following chdirs into $test_root_dir/$test_temp_dir but + # handles various possible edge case errors cleanly. If it returns + # false then we bail out of the cleanup. + _cleanup_start($test_root_dir, $test_temp_dir) + or return; + my $need_updir = 0; if (-d dir_path('for_find_taint')) { $need_updir = 1 if chdir(dir_path('for_find_taint')); } if (-d dir_path('fa_taint')) { - unlink file_path('fa_taint', 'fa_ord'), - file_path('fa_taint', 'fsl'), - file_path('fa_taint', 'faa', 'faa_ord'), - file_path('fa_taint', 'fab', 'fab_ord'), - file_path('fa_taint', 'fab', 'faba', 'faba_ord'), - file_path('fb_taint', 'fb_ord'), - file_path('fb_taint', 'fba', 'fba_ord'); - rmdir dir_path('fa_taint', 'faa'); - rmdir dir_path('fa_taint', 'fab', 'faba'); - rmdir dir_path('fa_taint', 'fab'); - rmdir dir_path('fa_taint'); - rmdir dir_path('fb_taint', 'fba'); - rmdir dir_path('fb_taint'); + unlink file_path('fa_taint', 'fa_ord'), + file_path('fa_taint', 'fsl'), + file_path('fa_taint', 'faa', 'faa_ord'), + file_path('fa_taint', 'fab', 'fab_ord'), + file_path('fa_taint', 'fab', 'faba', 'faba_ord'), + file_path('fb_taint', 'fb_ord'), + file_path('fb_taint', 'fba', 'fba_ord'); + rmdir dir_path('fa_taint', 'faa'); + rmdir dir_path('fa_taint', 'fab', 'faba'); + rmdir dir_path('fa_taint', 'fab'); + rmdir dir_path('fa_taint'); + rmdir dir_path('fb_taint', 'fba'); + rmdir dir_path('fb_taint'); } if ($need_updir) { my $updir = $^O eq 'VMS' ? File::Spec::VMS->updir() : File::Spec->updir; chdir($updir); } if (-d dir_path('for_find_taint')) { - rmdir dir_path('for_find_taint') or print "# Can't rmdir for_find_taint: $!\n"; + rmdir dir_path('for_find_taint') or print "# Can't rmdir for_find_taint: $!\n"; } + chdir($test_root_dir) or die "Failed to chdir to '$test_root_dir': $!"; } END { @@ -176,7 +185,7 @@ sub simple_wanted { *file_path_name = \&file_path; - +##### Create directories, files and symlinks used in testing ##### mkdir_ok( dir_path('for_find_taint'), 0770 ); ok( chdir( dir_path('for_find_taint')), 'successful chdir() to for_find_taint' ); @@ -232,7 +241,7 @@ delete $Expect_File{ file_path('fsl') } delete @Expect_Dir{ dir_path('fb_taint'), dir_path('fba') } unless $symlink_exists; File::Find::find( {wanted => \&wanted_File_Dir_prune, untaint => 1, - untaint_pattern => qr|^(.+)$|}, topdir('fa_taint') ); + untaint_pattern => qr|^(.+)$|}, topdir('fa_taint') ); is(scalar keys %Expect_File, 0, 'Found all expected files') or diag "Not found " . join(" ", sort keys %Expect_File); @@ -284,8 +293,8 @@ SKIP: { # no_chdir is in effect, hence we use file_path_name to specify the expected paths for %Expect_File %Expect_File = (file_path_name('fa_taint') => 1, - file_path_name('fa_taint','fa_ord') => 1, - file_path_name('fa_taint', 'fsl') => 1, + file_path_name('fa_taint','fa_ord') => 1, + file_path_name('fa_taint', 'fsl') => 1, file_path_name('fa_taint', 'fsl', 'fb_ord') => 1, file_path_name('fa_taint', 'fsl', 'fba') => 1, file_path_name('fa_taint', 'fsl', 'fba', 'fba_ord') => 1, @@ -299,11 +308,11 @@ SKIP: { %Expect_Name = (); %Expect_Dir = (dir_path('fa_taint') => 1, - dir_path('fa_taint', 'faa') => 1, + dir_path('fa_taint', 'faa') => 1, dir_path('fa_taint', 'fab') => 1, - dir_path('fa_taint', 'fab', 'faba') => 1, - dir_path('fb_taint') => 1, - dir_path('fb_taint', 'fba') => 1); + dir_path('fa_taint', 'fab', 'faba') => 1, + dir_path('fb_taint') => 1, + dir_path('fb_taint', 'fba') => 1); File::Find::find( {wanted => \&wanted_File_Dir, follow_fast => 1, no_chdir => 1, untaint => 1, untaint_pattern => @@ -316,7 +325,7 @@ SKIP: { undef $@; eval {File::Find::find( {wanted => \&simple_wanted, follow => 1}, - topdir('fa_taint') );}; + topdir('fa_taint') );}; like( $@, qr|Insecure dependency|, 'Not untainting causes death (good)' ); chdir($cwd_untainted); Index: gnu/usr.bin/perl/ext/File-Find/t/lib/Testing.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/File-Find/t/lib/Testing.pm,v diff -u -p -a -u -p -r1.1.1.2 Testing.pm --- gnu/usr.bin/perl/ext/File-Find/t/lib/Testing.pm 15 Feb 2023 01:32:58 -0000 1.1.1.2 +++ gnu/usr.bin/perl/ext/File-Find/t/lib/Testing.pm 21 Feb 2024 15:47:02 -0000 @@ -9,6 +9,7 @@ our @EXPORT_OK = qw( symlink_ok dir_path file_path + _cleanup_start ); # Wrappers around Test::More::ok() for creation of files, directories and @@ -53,16 +54,16 @@ sub dir_path { my $first_arg = shift @_; if ($first_arg eq '.') { - return './' unless @_; - my $path = File::Spec->catdir(@_); - # add leading "./" - $path = "./$path"; - return $path; + return './' unless @_; + my $path = File::Spec->catdir(@_); + # add leading "./" + $path = "./$path"; + return $path; } else { # $first_arg ne '.' return $first_arg unless @_; # return plain filename - my $fname = File::Spec->catdir($first_arg, @_); # relative path - $fname = VMS::Filespec::unixpath($fname) if $^O eq 'VMS'; + my $fname = File::Spec->catdir($first_arg, @_); # relative path + $fname = VMS::Filespec::unixpath($fname) if $^O eq 'VMS'; return $fname; } } @@ -82,18 +83,58 @@ sub file_path { my $first_arg = shift @_; if ($first_arg eq '.') { - return './' unless @_; - my $path = File::Spec->catfile(@_); - # add leading "./" - $path = "./$path"; - return $path; + return './' unless @_; + my $path = File::Spec->catfile(@_); + # add leading "./" + $path = "./$path"; + return $path; } else { # $first_arg ne '.' return $first_arg unless @_; # return plain filename - my $fname = File::Spec->catfile($first_arg, @_); # relative path - $fname = VMS::Filespec::unixify($fname) if $^O eq 'VMS'; + my $fname = File::Spec->catfile($first_arg, @_); # relative path + $fname = VMS::Filespec::unixify($fname) if $^O eq 'VMS'; return $fname; } +} + +sub _something_wrong { + my ($message) = @_; + warn "in cleanup: $message\n" . + "Something seems to be very wrong. Possibly the directory\n" . + "we are testing in has been removed or wiped while we ran?\n"; + return 0; +} + +sub _cleanup_start { + my ($test_root_dir, $test_temp_dir)= @_; + + # doing the following two chdirs (and their validation) in two + # distinct steps avoids the need to know about directory separators, + # or other FS specifics, which is helpful as the test files that use + # this function overrides the File::Spec heirarchy, so we can't ask it + # to help us here. + + # chdir into the $test_root_dir to start the cleanup. But first validate. + if (!$test_root_dir) { + return _something_wrong("No test_root_dir?"); + } + if (!-d $test_root_dir) { + return _something_wrong("test_root_dir '$test_root_dir' seems to have disappeared!"); + } + chdir($test_root_dir) + or return _something_wrong("Failed to chdir to '$test_root_dir': $!"); + + # chdir into the $test_temp_dir to start the cleanup. But first validate. + if (!$test_temp_dir) { + return _something_wrong("No test_temp_dir?"); + } + if (!-d $test_temp_dir) { + return _something_wrong("test_temp_dir '$test_temp_dir' seems to have disappeared!"); + } + chdir($test_temp_dir) + or return _wrong("Failed to chdir to '$test_temp_dir': $!"); + + return 1; } 1; Index: gnu/usr.bin/perl/ext/File-Glob/Glob.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/File-Glob/Glob.pm,v diff -u -p -a -u -p -r1.6 Glob.pm --- gnu/usr.bin/perl/ext/File-Glob/Glob.pm 15 Feb 2023 01:36:31 -0000 1.6 +++ gnu/usr.bin/perl/ext/File-Glob/Glob.pm 21 Feb 2024 15:47:02 -0000 @@ -33,7 +33,7 @@ $EXPORT_TAGS{bsd_glob} = [@{$EXPORT_TAGS our @EXPORT_OK = (@{$EXPORT_TAGS{'glob'}}, 'csh_glob'); -our $VERSION = '1.37'; +our $VERSION = '1.40'; sub import { require Exporter; Index: gnu/usr.bin/perl/ext/File-Glob/Glob.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/File-Glob/Glob.xs,v diff -u -p -a -u -p -r1.4 Glob.xs --- gnu/usr.bin/perl/ext/File-Glob/Glob.xs 15 Feb 2023 01:36:31 -0000 1.4 +++ gnu/usr.bin/perl/ext/File-Glob/Glob.xs 21 Feb 2024 15:47:02 -0000 @@ -99,7 +99,7 @@ iterate(pTHX_ bool(*globber)(pTHX_ AV *e } else { pat = SvPV_nomg(patsv,len); - is_utf8 = !!SvUTF8(patsv); + is_utf8 = cBOOL(SvUTF8(patsv)); /* the lower-level code expects a null-terminated string */ if (!SvPOK(patsv) || pat != SvPVX(patsv) || pat[len] != '\0') { SV *newpatsv = newSVpvn_flags(pat, len, SVs_TEMP); @@ -451,11 +451,13 @@ BOOT: { dMY_CXT; MY_CXT.x_GLOB_ENTRIES = NULL; - MY_CXT.x_GLOB_OLD_OPHOOK = PL_opfreehook; #ifdef USE_ITHREADS MY_CXT.interp = aTHX; #endif - PL_opfreehook = glob_ophook; + if(!MY_CXT.x_GLOB_OLD_OPHOOK) { + MY_CXT.x_GLOB_OLD_OPHOOK = PL_opfreehook; + PL_opfreehook = glob_ophook; + } } } Index: gnu/usr.bin/perl/ext/File-Glob/bsd_glob.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/File-Glob/bsd_glob.c,v diff -u -p -a -u -p -r1.10 bsd_glob.c --- gnu/usr.bin/perl/ext/File-Glob/bsd_glob.c 15 Feb 2023 01:36:31 -0000 1.10 +++ gnu/usr.bin/perl/ext/File-Glob/bsd_glob.c 21 Feb 2024 15:47:02 -0000 @@ -81,9 +81,9 @@ static char sscsid[]= "$OpenBSD: glob.c #ifndef MAXPATHLEN # ifdef PATH_MAX -# define MAXPATHLEN PATH_MAX +# define MAXPATHLEN PATH_MAX # else -# define MAXPATHLEN 1024 +# define MAXPATHLEN 1024 # endif #endif @@ -91,71 +91,71 @@ static char sscsid[]= "$OpenBSD: glob.c #ifndef ARG_MAX # ifdef _SC_ARG_MAX -# define ARG_MAX (sysconf(_SC_ARG_MAX)) +# define ARG_MAX (sysconf(_SC_ARG_MAX)) # else # ifdef _POSIX_ARG_MAX -# define ARG_MAX _POSIX_ARG_MAX +# define ARG_MAX _POSIX_ARG_MAX # else # ifdef WIN32 -# define ARG_MAX 14500 /* from VC's limits.h */ +# define ARG_MAX 14500 /* from VC's limits.h */ # else -# define ARG_MAX 4096 /* from POSIX, be conservative */ +# define ARG_MAX 4096 /* from POSIX, be conservative */ # endif # endif # endif #endif -#define BG_DOLLAR '$' -#define BG_DOT '.' -#define BG_EOS '\0' -#define BG_LBRACKET '[' -#define BG_NOT '!' -#define BG_QUESTION '?' -#define BG_QUOTE '\\' -#define BG_RANGE '-' -#define BG_RBRACKET ']' -#define BG_SEP '/' +#define BG_DOLLAR '$' +#define BG_DOT '.' +#define BG_EOS '\0' +#define BG_LBRACKET '[' +#define BG_NOT '!' +#define BG_QUESTION '?' +#define BG_QUOTE '\\' +#define BG_RANGE '-' +#define BG_RBRACKET ']' +#define BG_SEP '/' #ifdef DOSISH #define BG_SEP2 '\\' #endif -#define BG_STAR '*' -#define BG_TILDE '~' -#define BG_UNDERSCORE '_' -#define BG_LBRACE '{' -#define BG_RBRACE '}' -#define BG_SLASH '/' -#define BG_COMMA ',' +#define BG_STAR '*' +#define BG_TILDE '~' +#define BG_UNDERSCORE '_' +#define BG_LBRACE '{' +#define BG_RBRACE '}' +#define BG_SLASH '/' +#define BG_COMMA ',' #ifndef GLOB_DEBUG -#define M_QUOTE 0x8000 -#define M_PROTECT 0x4000 -#define M_MASK 0xffff -#define M_ASCII 0x00ff +#define M_QUOTE 0x8000 +#define M_PROTECT 0x4000 +#define M_MASK 0xffff +#define M_ASCII 0x00ff typedef U16 Char; #else -#define M_QUOTE 0x80 -#define M_PROTECT 0x40 -#define M_MASK 0xff -#define M_ASCII 0x7f +#define M_QUOTE 0x80 +#define M_PROTECT 0x40 +#define M_MASK 0xff +#define M_ASCII 0x7f typedef U8 Char; #endif /* !GLOB_DEBUG */ -#define CHAR(c) ((Char)((c)&M_ASCII)) -#define META(c) ((Char)((c)|M_QUOTE)) -#define M_ALL META('*') -#define M_END META(']') -#define M_NOT META('!') -#define M_ONE META('?') -#define M_RNG META('-') -#define M_SET META('[') -#define ismeta(c) (((c)&M_QUOTE) != 0) +#define CHAR(c) ((Char)((c)&M_ASCII)) +#define META(c) ((Char)((c)|M_QUOTE)) +#define M_ALL META('*') +#define M_END META(']') +#define M_NOT META('!') +#define M_ONE META('?') +#define M_RNG META('-') +#define M_SET META('[') +#define ismeta(c) (((c)&M_QUOTE) != 0) static int compare(const void *, const void *); @@ -204,7 +204,7 @@ my_readdir(DIR *d) } # else -# define my_readdir readdir +# define my_readdir readdir # endif Index: gnu/usr.bin/perl/ext/File-Glob/bsd_glob.h =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/File-Glob/bsd_glob.h,v diff -u -p -a -u -p -r1.1.1.3 bsd_glob.h --- gnu/usr.bin/perl/ext/File-Glob/bsd_glob.h 15 Feb 2023 01:32:58 -0000 1.1.1.3 +++ gnu/usr.bin/perl/ext/File-Glob/bsd_glob.h 21 Feb 2024 15:47:02 -0000 @@ -34,7 +34,7 @@ */ #ifndef _BSD_GLOB_H_ -#define _BSD_GLOB_H_ +#define _BSD_GLOB_H_ /* #include */ @@ -59,26 +59,26 @@ typedef struct { int (*gl_stat)(const char *, Stat_t *); } glob_t; -#define GLOB_APPEND 0x0001 /* Append to output from previous call. */ -#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */ -#define GLOB_ERR 0x0004 /* Return on error. */ -#define GLOB_MARK 0x0008 /* Append / to matching directories. */ -#define GLOB_NOCHECK 0x0010 /* Return pattern itself if nothing matches. */ -#define GLOB_NOSORT 0x0020 /* Don't sort. */ - -#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */ -#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */ -#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */ -#define GLOB_NOMAGIC 0x0200 /* GLOB_NOCHECK without magic chars (csh). */ -#define GLOB_QUOTE 0x0400 /* Quote special chars with \. */ -#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */ -#define GLOB_NOCASE 0x1000 /* Treat filenames without regard for case. */ -#define GLOB_ALPHASORT 0x2000 /* Alphabetic, not ASCII sort, like csh. */ -#define GLOB_LIMIT 0x4000 /* Limit pattern match output to ARG_MAX +#define GLOB_APPEND 0x0001 /* Append to output from previous call. */ +#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */ +#define GLOB_ERR 0x0004 /* Return on error. */ +#define GLOB_MARK 0x0008 /* Append / to matching directories. */ +#define GLOB_NOCHECK 0x0010 /* Return pattern itself if nothing matches. */ +#define GLOB_NOSORT 0x0020 /* Don't sort. */ + +#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */ +#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */ +#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */ +#define GLOB_NOMAGIC 0x0200 /* GLOB_NOCHECK without magic chars (csh). */ +#define GLOB_QUOTE 0x0400 /* Quote special chars with \. */ +#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */ +#define GLOB_NOCASE 0x1000 /* Treat filenames without regard for case. */ +#define GLOB_ALPHASORT 0x2000 /* Alphabetic, not ASCII sort, like csh. */ +#define GLOB_LIMIT 0x4000 /* Limit pattern match output to ARG_MAX (usually from limits.h). */ -#define GLOB_NOSPACE (-1) /* Malloc call failed. */ -#define GLOB_ABEND (-2) /* Unignored error. */ +#define GLOB_NOSPACE (-1) /* Malloc call failed. */ +#define GLOB_ABEND (-2) /* Unignored error. */ int bsd_glob(const char *, int, int (*)(const char *, int), glob_t *); void bsd_globfree(glob_t *); Index: gnu/usr.bin/perl/ext/FileCache/t/01open.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/FileCache/t/01open.t,v diff -u -p -a -u -p -r1.1.1.2 01open.t --- gnu/usr.bin/perl/ext/FileCache/t/01open.t 13 Feb 2019 21:11:30 -0000 1.1.1.2 +++ gnu/usr.bin/perl/ext/FileCache/t/01open.t 21 Feb 2024 15:47:02 -0000 @@ -3,7 +3,7 @@ use FileCache; our @files; -BEGIN { @files = qw(foo bar baz quux Foo_Bar) } +BEGIN { @files = map { "open_$_" } qw(foo bar baz quux Foo_Bar) } END { 1 while unlink @files } use Test::More tests => 1; Index: gnu/usr.bin/perl/ext/FileCache/t/02maxopen.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/FileCache/t/02maxopen.t,v diff -u -p -a -u -p -r1.1.1.2 02maxopen.t --- gnu/usr.bin/perl/ext/FileCache/t/02maxopen.t 13 Feb 2019 21:11:30 -0000 1.1.1.2 +++ gnu/usr.bin/perl/ext/FileCache/t/02maxopen.t 21 Feb 2024 15:47:02 -0000 @@ -2,7 +2,7 @@ use FileCache maxopen => 2; our @files; -BEGIN { @files = qw(foo bar baz quux) } +BEGIN { @files = map { "max_$_" } qw(foo bar baz quux) } END { 1 while unlink @files } use Test::More tests => 5; @@ -15,7 +15,7 @@ use Test::More tests => 5; my @cat; for my $path ( @files ){ - ok(fileno($path) || $path =~ /^(?:foo|bar)$/); + ok(fileno($path) || $path =~ /^max_(?:foo|bar)$/); next unless fileno($path); print $path "$path 2\n"; close($path); @@ -24,5 +24,5 @@ use Test::More tests => 5; push @cat, <$path>; close($path); } - ok( grep(/^(?:baz|quux) 2$/, @cat) == 2 ); + ok( grep(/^max_(?:baz|quux) 2$/, @cat) == 2 ); } Index: gnu/usr.bin/perl/ext/FileCache/t/03append.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/FileCache/t/03append.t,v diff -u -p -a -u -p -r1.1.1.2 03append.t --- gnu/usr.bin/perl/ext/FileCache/t/03append.t 13 Feb 2019 21:11:30 -0000 1.1.1.2 +++ gnu/usr.bin/perl/ext/FileCache/t/03append.t 21 Feb 2024 15:47:02 -0000 @@ -2,7 +2,7 @@ use FileCache maxopen => 2; our @files; -BEGIN { @files = qw(foo bar baz quux Foo_Bar) } +BEGIN { @files = map { "append_$_" } qw(foo bar baz quux Foo_Bar) } END { 1 while unlink @files } use Test::More tests => 2; Index: gnu/usr.bin/perl/ext/FileCache/t/04twoarg.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/FileCache/t/04twoarg.t,v diff -u -p -a -u -p -r1.1.1.1 04twoarg.t --- gnu/usr.bin/perl/ext/FileCache/t/04twoarg.t 24 Sep 2010 14:48:49 -0000 1.1.1.1 +++ gnu/usr.bin/perl/ext/FileCache/t/04twoarg.t 21 Feb 2024 15:47:02 -0000 @@ -2,16 +2,16 @@ use FileCache; -END { unlink('foo') } +END { unlink('foo_2arg') } use Test::More tests => 1; {# Test 4: that 2 arg format works, and that we cycle on mode change - cacheout '>', "foo"; - print foo "foo 4\n"; - cacheout '+>', "foo"; - print foo "foo 44\n"; - seek(foo, 0, 0); - ok( eq "foo 44\n"); - close foo; + cacheout '>', "foo_2arg"; + print foo_2arg "foo 4\n"; + cacheout '+>', "foo_2arg"; + print foo_2arg "foo 44\n"; + seek(foo_2arg, 0, 0); + ok( eq "foo 44\n"); + close foo_2arg; } Index: gnu/usr.bin/perl/ext/FileCache/t/05override.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/FileCache/t/05override.t,v diff -u -p -a -u -p -r1.1.1.1 05override.t --- gnu/usr.bin/perl/ext/FileCache/t/05override.t 24 Sep 2010 14:48:49 -0000 1.1.1.1 +++ gnu/usr.bin/perl/ext/FileCache/t/05override.t 21 Feb 2024 15:47:02 -0000 @@ -2,12 +2,12 @@ use FileCache; -END { unlink("Foo_Bar") } +END { unlink("Foo_Bar_ov") } use Test::More tests => 1; {# Test 5: that close is overridden properly within the caller - cacheout local $_ = "Foo_Bar"; + cacheout local $_ = "Foo_Bar_ov"; print $_ "Hello World\n"; close($_); ok(!fileno($_)); Index: gnu/usr.bin/perl/ext/FileCache/t/07noimport.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/FileCache/t/07noimport.t,v diff -u -p -a -u -p -r1.1.1.1 07noimport.t --- gnu/usr.bin/perl/ext/FileCache/t/07noimport.t 24 Sep 2010 14:48:49 -0000 1.1.1.1 +++ gnu/usr.bin/perl/ext/FileCache/t/07noimport.t 21 Feb 2024 15:47:02 -0000 @@ -8,7 +8,7 @@ use Test::More tests => 1; package Y; use FileCache (); - my $file = 'foo'; + my $file = 'foo_noimp'; END { unlink $file } FileCache::cacheout($file); print $file "bar"; Index: gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.pm,v diff -u -p -a -u -p -r1.15 GDBM_File.pm --- gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.pm 15 Feb 2023 01:36:31 -0000 1.15 +++ gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.pm 21 Feb 2024 15:47:02 -0000 @@ -733,7 +733,7 @@ require XSLoader; ); # This module isn't dual life, so no need for dev version numbers. -$VERSION = '1.23'; +$VERSION = '1.24'; our $gdbm_errno; Index: gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs,v diff -u -p -a -u -p -r1.1.1.12 GDBM_File.xs --- gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs 15 Feb 2023 01:32:58 -0000 1.1.1.12 +++ gnu/usr.bin/perl/ext/GDBM_File/GDBM_File.xs 21 Feb 2024 15:47:02 -0000 @@ -878,7 +878,7 @@ gdbm_flags(db, ...) PREINIT: int opcode = -1; int c_iv; - unsigned c_uv; + size_t c_uv; char *c_cv; OPTVALPTR vptr = (OPTVALPTR) &c_iv; size_t vsiz = sizeof(c_iv); Index: gnu/usr.bin/perl/ext/GDBM_File/t/opt.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/GDBM_File/t/opt.t,v diff -u -p -a -u -p -r1.1.1.1 opt.t --- gnu/usr.bin/perl/ext/GDBM_File/t/opt.t 15 Feb 2023 01:32:58 -0000 1.1.1.1 +++ gnu/usr.bin/perl/ext/GDBM_File/t/opt.t 21 Feb 2024 15:47:02 -0000 @@ -14,7 +14,7 @@ BEGIN { plan(skip_all => "GDBM_File is flaky in $^O") if $^O =~ /darwin/; - plan(tests => 8); + plan(tests => 9); use_ok('GDBM_File'); } @@ -25,7 +25,7 @@ my $db = tie(%h, 'GDBM_File', $dbname, G isa_ok($db, 'GDBM_File'); SKIP: { my $name = eval { $db->dbname } or do { - skip "gdbm_setopt GET calls not implemented", 6 + skip "gdbm_setopt GET calls not implemented", 7 if $@ =~ /GDBM_File::dbname not implemented/; }; is($db->dbname, $dbname, 'get dbname'); @@ -34,4 +34,9 @@ SKIP: { is($db->sync_mode, 0, 'get sync_mode'); is($db->sync_mode(1), 1, 'set sync_mode'); is($db->sync_mode, 1, 'get sync_mode'); + SKIP: { + my ($maj, $min) = GDBM_File->GDBM_version; + skip "gdbm too old", 1 if $maj != 1 || $maj == 1 && $min < 9; + isnt($db->mmapsize, 0, "get mmapsize"); + } } Index: gnu/usr.bin/perl/ext/Hash-Util/Util.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Hash-Util/Util.xs,v diff -u -p -a -u -p -r1.4 Util.xs --- gnu/usr.bin/perl/ext/Hash-Util/Util.xs 15 Feb 2023 01:36:31 -0000 1.4 +++ gnu/usr.bin/perl/ext/Hash-Util/Util.xs 21 Feb 2024 15:47:02 -0000 @@ -115,7 +115,7 @@ hash_traversal_mask(rhv, ...) if (items>1) { hv_rand_set(hv, SvUV(ST(1))); } - if (SvOOK(hv)) { + if (HvHasAUX(hv)) { XSRETURN_UV(HvRAND_get(hv)); } else { XSRETURN_UNDEF; Index: gnu/usr.bin/perl/ext/Hash-Util/lib/Hash/Util.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Hash-Util/lib/Hash/Util.pm,v diff -u -p -a -u -p -r1.5 Util.pm --- gnu/usr.bin/perl/ext/Hash-Util/lib/Hash/Util.pm 15 Feb 2023 01:36:31 -0000 1.5 +++ gnu/usr.bin/perl/ext/Hash-Util/lib/Hash/Util.pm 21 Feb 2024 15:47:02 -0000 @@ -42,7 +42,7 @@ our @EXPORT_OK = qw( BEGIN { # make sure all our XS routines are available early so their prototypes # are correctly applied in the following code. - our $VERSION = '0.28'; + our $VERSION = '0.30'; require XSLoader; XSLoader::load(); } @@ -92,7 +92,7 @@ Hash::Util - A selection of general-util hash_traversal_mask ); - %hash = (foo => 42, bar => 23); + my %hash = (foo => 42, bar => 23); # Ways to restrict a hash lock_keys(%hash); lock_keys(%hash, @keyset); Index: gnu/usr.bin/perl/ext/I18N-Langinfo/Langinfo.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/I18N-Langinfo/Langinfo.pm,v diff -u -p -a -u -p -r1.6 Langinfo.pm --- gnu/usr.bin/perl/ext/I18N-Langinfo/Langinfo.pm 15 Feb 2023 01:36:31 -0000 1.6 +++ gnu/usr.bin/perl/ext/I18N-Langinfo/Langinfo.pm 21 Feb 2024 15:47:02 -0000 @@ -70,7 +70,7 @@ our @EXPORT_OK = qw( YESSTR ); -our $VERSION = '0.21'; +our $VERSION = '0.22'; XSLoader::load(); @@ -180,8 +180,11 @@ For the eras based on typically some rul =head2 For systems without C -Starting in Perl 5.28, this module is available even on systems that lack a -native C. On such systems, it uses various methods to construct +This module originally was just a wrapper for the libc C +function, and did not work on systems lacking it, such as Windows. + +Starting in Perl 5.28, this module works on all platforms. When +C is not available, it uses various methods to construct what that function, if present, would return. But there are potential glitches. These are the items that could be different: @@ -193,8 +196,11 @@ Unimplemented, so returns C<"">. =item C -Unimplemented, except on Windows, due to the vagaries of vendor locale names, -returning C<""> on non-Windows. +This should work properly for Windows platforms. On almost all other modern +platforms, it will reliably return "UTF-8" if that is the code set. +Otherwise, it depends on the locale's name. If that is of the form +C, it will assume C is the code set; and it also knows about the +two locales "C" and "POSIX". If none of those apply it returns C<"">. =item C @@ -271,8 +277,6 @@ workaround for this; patches welcome: se =head1 SEE ALSO L, L, L, L. - -The langinfo() function is just a wrapper for the C nl_langinfo() interface. =head1 AUTHOR Index: gnu/usr.bin/perl/ext/I18N-Langinfo/Langinfo.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/I18N-Langinfo/Langinfo.xs,v diff -u -p -a -u -p -r1.3 Langinfo.xs --- gnu/usr.bin/perl/ext/I18N-Langinfo/Langinfo.xs 13 Feb 2019 21:15:23 -0000 1.3 +++ gnu/usr.bin/perl/ext/I18N-Langinfo/Langinfo.xs 21 Feb 2024 15:47:02 -0000 @@ -25,8 +25,8 @@ SV* langinfo(code) int code PREINIT: - const char * value; - STRLEN len; + const char * value; + utf8ness_t is_utf8; PROTOTYPE: _ CODE: #ifdef HAS_NL_LANGINFO @@ -36,64 +36,8 @@ langinfo(code) } else #endif { - value = Perl_langinfo(code); - len = strlen(value); - RETVAL = newSVpvn(Perl_langinfo(code), len); - - /* Now see if the UTF-8 flag should be turned on */ -#ifdef USE_LOCALE_CTYPE /* No utf8 strings if not using LC_CTYPE */ - - /* If 'value' is ASCII or not legal UTF-8, the flag doesn't get - * turned on, so skip the followin code */ - if (is_utf8_non_invariant_string((U8 *) value, len)) { - int category; - - /* Check if the locale is a UTF-8 one. The returns from - * Perl_langinfo() are in different locale categories, so check the - * category corresponding to this item */ - switch (code) { - - /* This should always return ASCII, so we could instead - * legitimately panic here, but soldier on */ - case CODESET: - category = LC_CTYPE; - break; - - case RADIXCHAR: - case THOUSEP: -# ifdef USE_LOCALE_NUMERIC - category = LC_NUMERIC; -# else - /* Not ideal, but the best we can do on such a platform */ - category = LC_CTYPE; -# endif - break; - - case CRNCYSTR: -# ifdef USE_LOCALE_MONETARY - category = LC_MONETARY; -# else - category = LC_CTYPE; -# endif - break; - - default: -# ifdef USE_LOCALE_TIME - category = LC_TIME; -# else - category = LC_CTYPE; -# endif - break; - } - - /* Here the return is legal UTF-8. Turn on that flag if the - * locale is UTF-8. (Otherwise, could just be a coincidence.) - * */ - if (_is_cur_LC_category_utf8(category)) { - SvUTF8_on(RETVAL); - } - } -#endif /* USE_LOCALE_CTYPE */ + value = Perl_langinfo8(code, &is_utf8); + RETVAL = newSVpvn_utf8(value, strlen(value), is_utf8 == UTF8NESS_YES); } OUTPUT: Index: gnu/usr.bin/perl/ext/I18N-Langinfo/t/Langinfo.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/I18N-Langinfo/t/Langinfo.t,v diff -u -p -a -u -p -r1.1.1.3 Langinfo.t --- gnu/usr.bin/perl/ext/I18N-Langinfo/t/Langinfo.t 13 Feb 2019 21:11:30 -0000 1.1.1.3 +++ gnu/usr.bin/perl/ext/I18N-Langinfo/t/Langinfo.t 21 Feb 2024 15:47:02 -0000 @@ -14,13 +14,12 @@ my @constants = qw(ABDAY_1 DAY_1 ABMON_1 D_FMT T_FMT); push @constants, @times; -my %want = - ( - RADIXCHAR => ".", - THOUSEP => "", - ); +my %want = ( RADIXCHAR => ".", + THOUSEP => "", + ); -# Abbreviated and full are swapped in many locales in early netbsd +# Abbreviated and full are swapped in many locales in early netbsd. Skip +# them. if ( $Config{osname} !~ / netbsd /ix || $Config{osvers} !~ / ^ [1-6] \. /x) { @@ -30,14 +29,129 @@ if ( $Config{osname} !~ / netbsd /ix $want{MON_1} = "January"; } -my @want = sort keys %want; +sub disp_str ($) { + my $string = shift; -plan tests => 1 + 3 * @constants + keys(@want) + 1 + 2; + # Displays the string unambiguously. ASCII printables are always output + # as-is, though perhaps separated by blanks from other characters. If + # entirely printable ASCII, just returns the string. Otherwise if valid + # UTF-8 it uses the character names for non-printable-ASCII. Otherwise it + # outputs hex for each non-ASCII-printable byte. + + return $string if $string =~ / ^ [[:print:]]* $/xa; + + my $result = ""; + my $prev_was_punct = 1; # Beginning is considered punct + if (utf8::valid($string) && utf8::is_utf8($string)) { + use charnames (); + foreach my $char (split "", $string) { + + # Keep punctuation adjacent to other characters; otherwise + # separate them with a blank + if ($char =~ /[[:punct:]]/a) { + $result .= $char; + $prev_was_punct = 1; + } + elsif ($char =~ /[[:print:]]/a) { + $result .= " " unless $prev_was_punct; + $result .= $char; + $prev_was_punct = 0; + } + else { + $result .= " " unless $prev_was_punct; + my $name = charnames::viacode(ord $char); + $result .= (defined $name) ? $name : ':unknown:'; + $prev_was_punct = 0; + } + } + } + else { + use bytes; + foreach my $char (split "", $string) { + if ($char =~ /[[:punct:]]/a) { + $result .= $char; + $prev_was_punct = 1; + } + elsif ($char =~ /[[:print:]]/a) { + $result .= " " unless $prev_was_punct; + $result .= $char; + $prev_was_punct = 0; + } + else { + $result .= " " unless $prev_was_punct; + $result .= sprintf("%02X", ord $char); + $prev_was_punct = 0; + } + } + } + + return $result; +} + +sub check_utf8_validity($$$) { + + # Looks for a definitive result for testing perl code on UTF-8 locales. + # Returns 1 if definitive (one way or another). + # Returns 0 if the input is all ASCII. + # Returns -1 if it looks to be a system error + + my ($string, $item, $locale) = @_; + my $msg_details = "The name for '$item' in $locale"; + + return 0 unless $string =~ /\P{ASCII}/; + + if (utf8::is_utf8($string)) { + if (utf8::valid($string )) { + pass("$msg_details is a UTF8 string. Got:\n" . disp_str($string)); + return 1; + } + + # Here, marked as UTF-8, but is malformed, so shouldn't have been + # marked thus + fail("$msg_details is marked as UTF8 but is malformed. Got:\n" + . disp_str($string)); + return 1; + } + + # Here, not marked as UTF-8. Since this is a UTF-8 locale, and contains + # non-ASCII, something is wrong. It may be us, or it may be libc. Use + # decode to see if the bytes form legal UTF-8. If they did, it means + # perl wrongly returned the string as not UTF-8. + my $copy = $string; + my $is_valid_utf8; + { + use bytes; + $is_valid_utf8 = utf8::decode($copy); + } + + if ($is_valid_utf8) { + fail("$msg_details should have been marked as a UTF8 string. Got:\n" + . disp_str($string)); + return 1; + } + + # Here, the string returned wasn't marked as UTF-8 and isn't valid UTF-8. + # This means perl did its job and kept malformed text from being marked + # UTF-8. And it means a system bug since the locale was UTF-8. + return -1; +} + +my @want = sort keys %want; +my @illegal_utf8; use_ok('I18N::Langinfo', 'langinfo', @constants, 'CRNCYSTR'); use POSIX; -setlocale(LC_ALL, "C"); + +if (locales_enabled('LC_ALL')) { + setlocale(LC_ALL, "C"); +} +else { # If no LC_ALL, make sure the categories used in Langinfo are in C + setlocale(LC_CTYPE, "C") if locales_enabled('LC_CTYPE'); + setlocale(LC_MONETARY, "C") if locales_enabled('LC_MONETARY'); + setlocale(LC_NUMERIC, "C") if locales_enabled('LC_NUMERIC'); + setlocale(LC_TIME, "C") if locales_enabled('LC_TIME'); +} for my $constant (@constants) { SKIP: { @@ -60,14 +174,14 @@ for my $i (1..@want) { } my $comma_locale; -for (find_locales( [ 'LC_NUMERIC' ] )) { +for my $locale (find_locales( 'LC_NUMERIC' )) { use POSIX; use locale; - setlocale(LC_NUMERIC, $_) or next; + setlocale(LC_NUMERIC, $locale) or next; my $in = 4.2; # avoid any constant folding bugs my $s = sprintf("%g", $in); if ($s eq "4,2") { - $comma_locale = $_; + $comma_locale = $locale; last; } } @@ -85,9 +199,9 @@ SKIP: { my $found_time = 0; my $found_monetary = 0; - my @locales = find_locales( [ 'LC_TIME', 'LC_CTYPE', 'LC_MONETARY' ]); - while (defined (my $utf8_locale = find_utf8_ctype_locale(\@locales))) { + my @locales = find_locales( [ qw(LC_TIME LC_CTYPE LC_MONETARY) ] ); + foreach my $utf8_locale (find_utf8_ctype_locales(\@locales)) { if (! $found_time) { setlocale(&LC_TIME, $utf8_locale); foreach my $time_item (@times) { @@ -95,22 +209,33 @@ SKIP: { my $time_name = eval $eval_string; if ($@) { fail("'$eval_string' failed: $@"); - last SKIP; + + # If this or the next two tests fail, any other items or + # locales will likely fail too, so skip testing them. + $found_time = 1; + last; } if (! defined $time_name) { fail("'$eval_string' returned undef"); - last SKIP; + $found_time = 1; + last; } if ($time_name eq "") { fail("'$eval_string' returned an empty name"); - last SKIP; + $found_time = 1; + last; } - if ($time_name =~ /\P{ASCII}/) { - ok(utf8::is_utf8($time_name), "The name for '$time_item' in $utf8_locale is a UTF8 string"); + my $ret = check_utf8_validity($time_name, $time_item, $utf8_locale); + if ($ret > 0) { $found_time = 1; last; } + + if ($ret < 0) { # < 0 means a system error + push @illegal_utf8, "$utf8_locale: $time_item:" + . disp_str($time_name); + } } } @@ -120,23 +245,25 @@ SKIP: { my $symbol = eval $eval_string; if ($@) { fail("'$eval_string' failed: $@"); - last SKIP; + $found_monetary = 1; + next; } if (! defined $symbol) { fail("'$eval_string' returned undef"); - last SKIP; + next; } - if ($symbol =~ /\P{ASCII}/) { - ok(utf8::is_utf8($symbol), "The name for 'CRNCYSTR' in $utf8_locale is a UTF8 string"); + + my $ret = check_utf8_validity($symbol, 'CRNCY', $utf8_locale); + if ($ret > 0) { $found_monetary = 1; } + elsif ($ret < 0) { # < 0 means a system error + push @illegal_utf8, "$utf8_locale: CRNCY:" + . disp_str($symbol); + } } last if $found_monetary && $found_time; - - # Remove this locale from the list, and loop to find another utf8 - # locale - @locales = grep { $_ ne $utf8_locale } @locales; } if ($found_time + $found_monetary < 2) { @@ -149,3 +276,9 @@ SKIP: { skip("Couldn't find a locale with a non-ascii $message", 2 - $found_time - $found_monetary); } } + +if (@illegal_utf8) { + diag join "\n", "The following are illegal UTF-8", @illegal_utf8; +} + +done_testing(); Index: gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.pm,v diff -u -p -a -u -p -r1.13 NDBM_File.pm --- gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.pm 30 Dec 2019 02:13:53 -0000 1.13 +++ gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.pm 21 Feb 2024 15:47:02 -0000 @@ -7,7 +7,7 @@ require Tie::Hash; require XSLoader; our @ISA = qw(Tie::Hash); -our $VERSION = "1.15"; +our $VERSION = "1.16"; XSLoader::load(); Index: gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.xs,v diff -u -p -a -u -p -r1.2 NDBM_File.xs --- gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.xs 5 Feb 2017 00:32:13 -0000 1.2 +++ gnu/usr.bin/perl/ext/NDBM_File/NDBM_File.xs 21 Feb 2024 15:47:02 -0000 @@ -97,6 +97,12 @@ ndbm_FETCH(db, key) NDBM_File db datum_key key +#define ndbm_EXISTS(db,key) dbm_fetch(db->dbp,key).dptr +bool +ndbm_EXISTS(db, key) + NDBM_File db + datum_key key + #define ndbm_STORE(db,key,value,flags) dbm_store(db->dbp,key,value,flags) int ndbm_STORE(db, key, value, flags = DBM_REPLACE) Index: gnu/usr.bin/perl/ext/ODBM_File/ODBM_File.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/ODBM_File/ODBM_File.pm,v diff -u -p -a -u -p -r1.14 ODBM_File.pm --- gnu/usr.bin/perl/ext/ODBM_File/ODBM_File.pm 15 Feb 2023 01:36:31 -0000 1.14 +++ gnu/usr.bin/perl/ext/ODBM_File/ODBM_File.pm 21 Feb 2024 15:47:02 -0000 @@ -7,7 +7,7 @@ require Tie::Hash; require XSLoader; our @ISA = qw(Tie::Hash); -our $VERSION = "1.17"; +our $VERSION = "1.18"; XSLoader::load(); Index: gnu/usr.bin/perl/ext/ODBM_File/ODBM_File.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/ODBM_File/ODBM_File.xs,v diff -u -p -a -u -p -r1.14 ODBM_File.xs --- gnu/usr.bin/perl/ext/ODBM_File/ODBM_File.xs 15 Feb 2023 01:36:31 -0000 1.14 +++ gnu/usr.bin/perl/ext/ODBM_File/ODBM_File.xs 21 Feb 2024 15:47:02 -0000 @@ -28,13 +28,13 @@ datum nextkey(datum key); #ifdef DBM_BUG_DUPLICATE_FREE /* - * DBM on at least Ultrix and HPUX call dbmclose() from dbminit(), + * DBM on at least HPUX call dbmclose() from dbminit(), * resulting in duplicate free() because dbmclose() does *not* * check if it has already been called for this DBM. * If some malloc/free calls have been done between dbmclose() and * the next dbminit(), the memory might be used for something else when * it is freed. - * Verified to work on ultrix4.3. Probably will work on HP/UX. + * Probably will work on HP/UX. * Set DBM_BUG_DUPLICATE_FREE in the extension hint file. */ /* Close the previous dbm, and fail to open a new dbm */ Index: gnu/usr.bin/perl/ext/ODBM_File/hints/ultrix.pl =================================================================== RCS file: gnu/usr.bin/perl/ext/ODBM_File/hints/ultrix.pl diff -N gnu/usr.bin/perl/ext/ODBM_File/hints/ultrix.pl --- gnu/usr.bin/perl/ext/ODBM_File/hints/ultrix.pl 3 Dec 2003 03:02:32 -0000 1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,4 +0,0 @@ -# Try to work around "bad free" messages. See note in ODBM_File.xs. -# Andy Dougherty -# Sun Sep 8 12:57:52 EDT 1996 -$self->{CCFLAGS} = $Config{ccflags} . ' -DDBM_BUG_DUPLICATE_FREE' ; Index: gnu/usr.bin/perl/ext/Opcode/Opcode.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Opcode/Opcode.pm,v diff -u -p -a -u -p -r1.15 Opcode.pm --- gnu/usr.bin/perl/ext/Opcode/Opcode.pm 15 Feb 2023 01:36:31 -0000 1.15 +++ gnu/usr.bin/perl/ext/Opcode/Opcode.pm 21 Feb 2024 15:47:02 -0000 @@ -1,31 +1,21 @@ -package Opcode; - -use 5.006_001; +package Opcode 1.64; use strict; -our($VERSION, @ISA, @EXPORT_OK); - -$VERSION = "1.57"; - use Carp; use Exporter 'import'; use XSLoader; -BEGIN { - @EXPORT_OK = qw( +sub opset (;@); +sub opset_to_hex ($); +sub opdump (;$); +use subs our @EXPORT_OK = qw( opset ops_to_opset opset_to_ops opset_to_hex invert_opset empty_opset full_opset opdesc opcodes opmask define_optag opmask_add verify_opset opdump - ); -} - -sub opset (;@); -sub opset_to_hex ($); -sub opdump (;$); -use subs @EXPORT_OK; +); XSLoader::load(); @@ -312,10 +302,10 @@ invert_opset function. null stub scalar pushmark wantarray const defined undef - rv2sv sassign + rv2sv sassign padsv_store rv2av aassign aelem aelemfast aelemfast_lex aslice kvaslice - av2arylen + av2arylen aelemfastlex_store rv2hv helem hslice kvhslice each values keys exists delete aeach akeys avalues multideref argelem argdefelem argcheck @@ -342,10 +332,12 @@ invert_opset function. list lslice splice push pop shift unshift reverse cond_expr flip flop andassign orassign dorassign and or dor xor + helemexistsor warn die lineseq nextstate scope enter leave rv2cv anoncode prototype coreargs avhvswitch anonconst + emptyavhv entersub leavesub leavesublv return method method_named method_super method_redir method_redir_super @@ -359,6 +351,8 @@ invert_opset function. leaveeval -- needed for Safe to operate, is safe without entereval + methstart initfield + =item :base_mem These memory related ops are not included in :base_core because they @@ -450,6 +444,8 @@ These are a hotchpotch of opcodes still custom -- where should this go ceil floor + + is_tainted =item :base_math Index: gnu/usr.bin/perl/ext/Opcode/Opcode.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Opcode/Opcode.xs,v diff -u -p -a -u -p -r1.16 Opcode.xs --- gnu/usr.bin/perl/ext/Opcode/Opcode.xs 15 Feb 2023 01:36:31 -0000 1.16 +++ gnu/usr.bin/perl/ext/Opcode/Opcode.xs 21 Feb 2024 15:47:02 -0000 @@ -12,7 +12,6 @@ typedef struct { HV * x_op_named_bits; /* cache shared for whole process */ SV * x_opset_all; /* mask with all bits set */ - IV x_opset_len; /* length of opmasks in bytes */ #ifdef OPCODE_DEBUG int x_opcode_debug; /* unused warn() emitting debugging code */ #endif @@ -20,9 +19,11 @@ typedef struct { START_MY_CXT +/* length of opmasks in bytes */ +static const STRLEN opset_len = (PL_maxo + 7) / 8; + #define op_named_bits (MY_CXT.x_op_named_bits) #define opset_all (MY_CXT.x_opset_all) -#define opset_len (MY_CXT.x_opset_len) #ifdef OPCODE_DEBUG # define opcode_debug (MY_CXT.x_opcode_debug) #else @@ -50,13 +51,13 @@ op_names_init(pTHX) { int i; STRLEN len; - char **op_names; + const char *const *op_names; U8 *bitmap; dMY_CXT; op_named_bits = newHV(); hv_ksplit(op_named_bits, PL_maxo); - op_names = get_op_names(); + op_names = PL_op_name; for(i=0; i < PL_maxo; ++i) { SV * const sv = newSViv(i); SvREADONLY_on(sv); @@ -128,7 +129,6 @@ static SV * new_opset(pTHX_ SV *old_opset) { SV *opset; - dMY_CXT; if (old_opset) { verify_opset(aTHX_ old_opset,1); @@ -149,11 +149,10 @@ static int verify_opset(pTHX_ SV *opset, int fatal) { const char *err = NULL; - dMY_CXT; if (!SvOK(opset)) err = "undefined"; else if (!SvPOK(opset)) err = "wrong type"; - else if (SvCUR(opset) != (STRLEN)opset_len) err = "wrong size"; + else if (SvCUR(opset) != opset_len) err = "wrong size"; if (err && fatal) { croak("Invalid opset: %s", err); } @@ -164,8 +163,6 @@ verify_opset(pTHX_ SV *opset, int fatal) static void set_opset_bits(pTHX_ char *bitmap, SV *bitspec, int on, const char *opname) { - dMY_CXT; - if (SvIOK(bitspec)) { const int myopcode = SvIV(bitspec); const int offset = myopcode >> 3; @@ -180,7 +177,7 @@ set_opset_bits(pTHX_ char *bitmap, SV *b else bitmap[offset] &= ~(1 << bit); } - else if (SvPOK(bitspec) && SvCUR(bitspec) == (STRLEN)opset_len) { + else if (SvPOK(bitspec) && SvCUR(bitspec) == opset_len) { STRLEN len; const char * const specbits = SvPV(bitspec, len); @@ -200,11 +197,10 @@ set_opset_bits(pTHX_ char *bitmap, SV *b static void opmask_add(pTHX_ SV *opset) /* THE ONLY FUNCTION TO EDIT PL_op_mask ITSELF */ { - int i,j; + int j; char *bitmask; STRLEN len; int myopcode = 0; - dMY_CXT; verify_opset(aTHX_ opset,1); /* croaks on bad opset */ @@ -214,7 +210,7 @@ opmask_add(pTHX_ SV *opset) /* THE ONLY /* OPCODES ALREADY MASKED ARE NEVER UNMASKED. See opmask_addlocal() */ bitmask = SvPV(opset, len); - for (i=0; i < opset_len; i++) { + for (STRLEN i=0; i < opset_len; i++) { const U16 bits = bitmask[i]; if (!bits) { /* optimise for sparse masks */ myopcode += 8; @@ -258,7 +254,6 @@ BOOT: { MY_CXT_INIT; STATIC_ASSERT_STMT(PL_maxo < OP_MASK_BUF_SIZE); - opset_len = (PL_maxo + 7) / 8; if (opcode_debug >= 1) warn("opset_len %ld\n", (long)opset_len); op_names_init(aTHX); @@ -353,7 +348,6 @@ invert_opset(opset) CODE: { char *bitmap; - dMY_CXT; STRLEN len = opset_len; opset = sv_2mortal(new_opset(aTHX_ opset)); /* verify and clone opset */ @@ -374,10 +368,10 @@ opset_to_ops(opset, desc = 0) PPCODE: { STRLEN len; - int i, j, myopcode; + STRLEN i; + int j, myopcode; const char * const bitmap = SvPV(opset, len); - char **names = (desc) ? get_op_descs() : get_op_names(); - dMY_CXT; + const char *const *names = (desc) ? PL_op_desc : PL_op_name; verify_opset(aTHX_ opset,1); for (myopcode=0, i=0; i < opset_len; i++) { @@ -467,8 +461,7 @@ PPCODE: int i; STRLEN len; SV **args; - char **op_desc = get_op_descs(); - dMY_CXT; + const char *const *op_desc = PL_op_desc; /* copy args to a scratch area since we may push output values onto */ /* the stack faster than we read values off it if masks are used. */ @@ -483,8 +476,9 @@ PPCODE: XPUSHs(newSVpvn_flags(op_desc[myopcode], strlen(op_desc[myopcode]), SVs_TEMP)); } - else if (SvPOK(bitspec) && SvCUR(bitspec) == (STRLEN)opset_len) { - int b, j; + else if (SvPOK(bitspec) && SvCUR(bitspec) == opset_len) { + STRLEN b; + int j; const char * const bitmap = SvPV_nolen_const(bitspec); int myopcode = 0; for (b=0; b < opset_len; b++) { Index: gnu/usr.bin/perl/ext/POSIX/Makefile.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/POSIX/Makefile.PL,v diff -u -p -a -u -p -r1.4 Makefile.PL --- gnu/usr.bin/perl/ext/POSIX/Makefile.PL 15 Feb 2023 01:36:31 -0000 1.4 +++ gnu/usr.bin/perl/ext/POSIX/Makefile.PL 21 Feb 2024 15:47:02 -0000 @@ -51,7 +51,7 @@ my @names = EUSERS EWOULDBLOCK EXDEV FILENAME_MAX F_OK HUPCL ICANON ICRNL IEXTEN IGNBRK IGNCR IGNPAR INLCR INPCK INT_MAX INT_MIN ISIG ISTRIP IXOFF IXON LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION LC_MEASUREMENT - LC_MESSAGES LC_MONETARY LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME + LC_MESSAGES LC_MONETARY LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_NAME LINK_MAX LONG_MAX LONG_MIN L_ctermid L_cuserid MAX_CANON MAX_INPUT MB_LEN_MAX MSG_CTRUNC MSG_DONTROUTE MSG_EOR MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NAME_MAX NCCS NGROUPS_MAX NOFLSH OPEN_MAX OPOST Index: gnu/usr.bin/perl/ext/POSIX/POSIX.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/POSIX/POSIX.xs,v diff -u -p -a -u -p -r1.28 POSIX.xs --- gnu/usr.bin/perl/ext/POSIX/POSIX.xs 15 Feb 2023 01:36:31 -0000 1.28 +++ gnu/usr.bin/perl/ext/POSIX/POSIX.xs 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,9 @@ #define PERL_EXT_POSIX #define PERL_EXT +#if defined(_WIN32) && defined(__GNUC__) /* mingw compiler */ +#define _POSIX_ +#endif #define PERL_NO_GET_CONTEXT #include "EXTERN.h" @@ -1018,7 +1021,7 @@ static NV my_log2(NV x) /* XXX nexttoward */ /* GCC's FLT_ROUNDS is (wrongly) hardcoded to 1 (at least up to 11.x) */ -#if defined(PERL_IS_GCC) /* && __GNUC__ < XXX */ +#if defined(PERL_IS_GCC) /* && __GNUC__ < XXX */ || (defined(__clang__) && defined(__s390x__)) # define BROKEN_FLT_ROUNDS #endif @@ -1341,9 +1344,6 @@ static NV_PAYLOAD_TYPE S_getpayload(NV n #include #endif #include -#ifndef __ultrix__ -#include -#endif #include #include #include @@ -1560,77 +1560,6 @@ END_EXTERN_C #endif #endif -#if ! defined(HAS_LOCALECONV) && ! defined(HAS_LOCALECONV_L) -# define localeconv() not_here("localeconv") -#else -struct lconv_offset { - const char *name; - size_t offset; -}; - -static const struct lconv_offset lconv_strings[] = { -#ifdef USE_LOCALE_NUMERIC - {"decimal_point", STRUCT_OFFSET(struct lconv, decimal_point)}, - {"thousands_sep", STRUCT_OFFSET(struct lconv, thousands_sep)}, -# ifndef NO_LOCALECONV_GROUPING - {"grouping", STRUCT_OFFSET(struct lconv, grouping)}, -# endif -#endif -#ifdef USE_LOCALE_MONETARY - {"int_curr_symbol", STRUCT_OFFSET(struct lconv, int_curr_symbol)}, - {"currency_symbol", STRUCT_OFFSET(struct lconv, currency_symbol)}, - {"mon_decimal_point", STRUCT_OFFSET(struct lconv, mon_decimal_point)}, -# ifndef NO_LOCALECONV_MON_THOUSANDS_SEP - {"mon_thousands_sep", STRUCT_OFFSET(struct lconv, mon_thousands_sep)}, -# endif -# ifndef NO_LOCALECONV_MON_GROUPING - {"mon_grouping", STRUCT_OFFSET(struct lconv, mon_grouping)}, -# endif - {"positive_sign", STRUCT_OFFSET(struct lconv, positive_sign)}, - {"negative_sign", STRUCT_OFFSET(struct lconv, negative_sign)}, -#endif - {NULL, 0} -}; - -#ifdef USE_LOCALE_NUMERIC - -/* The Linux man pages say these are the field names for the structure - * components that are LC_NUMERIC; the rest being LC_MONETARY */ -# define isLC_NUMERIC_STRING(name) ( strEQ(name, "decimal_point") \ - || strEQ(name, "thousands_sep") \ - \ - /* There should be no harm done \ - * checking for this, even if \ - * NO_LOCALECONV_GROUPING */ \ - || strEQ(name, "grouping")) -#else -# define isLC_NUMERIC_STRING(name) (0) -#endif - -static const struct lconv_offset lconv_integers[] = { -#ifdef USE_LOCALE_MONETARY - {"int_frac_digits", STRUCT_OFFSET(struct lconv, int_frac_digits)}, - {"frac_digits", STRUCT_OFFSET(struct lconv, frac_digits)}, - {"p_cs_precedes", STRUCT_OFFSET(struct lconv, p_cs_precedes)}, - {"p_sep_by_space", STRUCT_OFFSET(struct lconv, p_sep_by_space)}, - {"n_cs_precedes", STRUCT_OFFSET(struct lconv, n_cs_precedes)}, - {"n_sep_by_space", STRUCT_OFFSET(struct lconv, n_sep_by_space)}, - {"p_sign_posn", STRUCT_OFFSET(struct lconv, p_sign_posn)}, - {"n_sign_posn", STRUCT_OFFSET(struct lconv, n_sign_posn)}, -#ifdef HAS_LC_MONETARY_2008 - {"int_p_cs_precedes", STRUCT_OFFSET(struct lconv, int_p_cs_precedes)}, - {"int_p_sep_by_space", STRUCT_OFFSET(struct lconv, int_p_sep_by_space)}, - {"int_n_cs_precedes", STRUCT_OFFSET(struct lconv, int_n_cs_precedes)}, - {"int_n_sep_by_space", STRUCT_OFFSET(struct lconv, int_n_sep_by_space)}, - {"int_p_sign_posn", STRUCT_OFFSET(struct lconv, int_p_sign_posn)}, - {"int_n_sign_posn", STRUCT_OFFSET(struct lconv, int_n_sign_posn)}, -#endif -#endif - {NULL, 0} -}; - -#endif /* HAS_LOCALECONV */ - #ifdef HAS_LONG_DOUBLE # if LONG_DOUBLESIZE > NVSIZE # undef HAS_LONG_DOUBLE /* XXX until we figure out how to use them */ @@ -1819,7 +1748,12 @@ my_tzset(pTHX) #endif fix_win32_tzenv(); #endif + TZSET_LOCK; tzset(); + TZSET_UNLOCK; + /* After the unlock, another thread could change things, but this is a + * problem with the Posix API generally, not Perl; and the result will be + * self-consistent */ } MODULE = SigSet PACKAGE = POSIX::SigSet PREFIX = sig @@ -2124,138 +2058,10 @@ HV * localeconv() CODE: #ifndef HAS_LOCALECONV - localeconv(); /* A stub to call not_here(). */ + RETVAL = NULL; + not_here("localeconv"); #else - struct lconv *lcbuf; -# if defined(USE_ITHREADS) \ - && defined(HAS_POSIX_2008_LOCALE) \ - && defined(HAS_LOCALECONV_L) /* Prefer this thread-safe version */ - bool do_free = FALSE; - locale_t cur = NULL; -# elif defined(TS_W32_BROKEN_LOCALECONV) - const char * save_global; - const char * save_thread; -# endif - DECLARATION_FOR_LC_NUMERIC_MANIPULATION; - - /* localeconv() deals with both LC_NUMERIC and LC_MONETARY, but - * LC_MONETARY is already in the correct locale */ -# ifdef USE_LOCALE_MONETARY - - const bool is_monetary_utf8 = _is_cur_LC_category_utf8(LC_MONETARY); -# endif -# ifdef USE_LOCALE_NUMERIC - - bool is_numeric_utf8; - - STORE_LC_NUMERIC_FORCE_TO_UNDERLYING(); - - is_numeric_utf8 = _is_cur_LC_category_utf8(LC_NUMERIC); -# endif - - RETVAL = newHV(); - sv_2mortal((SV*)RETVAL); -# if defined(USE_ITHREADS) \ - && defined(HAS_POSIX_2008_LOCALE) \ - && defined(HAS_LOCALECONV_L) - - cur = uselocale((locale_t) 0); - if (cur == LC_GLOBAL_LOCALE) { - cur = duplocale(LC_GLOBAL_LOCALE); - do_free = TRUE; - } - - lcbuf = localeconv_l(cur); -# else - LOCALECONV_LOCK; /* Prevent interference with other threads using - localeconv() */ -# ifdef TS_W32_BROKEN_LOCALECONV - /* This is a workaround for a Windows bug prior to VS 15, in which - * localeconv only looks at the global locale. We toggle to the global - * locale; populate the return; then toggle back. We have to use - * LC_ALL instead of the individual ones because of another bug in - * Windows */ - - save_thread = savepv(Perl_setlocale(LC_NUMERIC, NULL)); - - _configthreadlocale(_DISABLE_PER_THREAD_LOCALE); - - save_global = savepv(Perl_setlocale(LC_ALL, NULL)); - - Perl_setlocale(LC_ALL, save_thread); -# endif - lcbuf = localeconv(); -# endif - if (lcbuf) { - const struct lconv_offset *strings = lconv_strings; - const struct lconv_offset *integers = lconv_integers; - const char *ptr = (const char *) lcbuf; - - while (strings->name) { - /* This string may be controlled by either LC_NUMERIC, or - * LC_MONETARY */ - const bool is_utf8_locale = -# if defined(USE_LOCALE_NUMERIC) && defined(USE_LOCALE_MONETARY) - (isLC_NUMERIC_STRING(strings->name)) - ? is_numeric_utf8 - : is_monetary_utf8; -# elif defined(USE_LOCALE_NUMERIC) - is_numeric_utf8; -# elif defined(USE_LOCALE_MONETARY) - is_monetary_utf8; -# else - FALSE; -# endif - - const char *value = *((const char **)(ptr + strings->offset)); - - if (value && *value) { - const STRLEN value_len = strlen(value); - - /* We mark it as UTF-8 if a utf8 locale and is valid and - * variant under UTF-8 */ - const bool is_utf8 = is_utf8_locale - && is_utf8_non_invariant_string( - (U8*) value, - value_len); - (void) hv_store(RETVAL, - strings->name, - strlen(strings->name), - newSVpvn_utf8(value, value_len, is_utf8), - 0); - } - strings++; - } - - while (integers->name) { - const char value = *((const char *)(ptr + integers->offset)); - - if (value != CHAR_MAX) - (void) hv_store(RETVAL, integers->name, - strlen(integers->name), newSViv(value), 0); - integers++; - } - } -# if defined(USE_ITHREADS) \ - && defined(HAS_POSIX_2008_LOCALE) \ - && defined(HAS_LOCALECONV_L) - if (do_free) { - freelocale(cur); - } -# else -# ifdef TS_W32_BROKEN_LOCALECONV - Perl_setlocale(LC_ALL, save_global); - - _configthreadlocale(_ENABLE_PER_THREAD_LOCALE); - - Perl_setlocale(LC_ALL, save_thread); - - Safefree(save_global); - Safefree(save_thread); -# endif - LOCALECONV_UNLOCK; -# endif - RESTORE_LC_NUMERIC(); + RETVAL = Perl_localeconv(aTHX); #endif /* HAS_LOCALECONV */ OUTPUT: RETVAL @@ -3383,9 +3189,9 @@ mblen(s, n = ~0) memzero(&PL_mbrlen_ps, sizeof(PL_mbrlen_ps)); RETVAL = 0; #else - MBLEN_LOCK; + MBLEN_LOCK_; RETVAL = mblen(NULL, 0); - MBLEN_UNLOCK; + MBLEN_UNLOCK_; #endif } else { /* Not resetting state */ @@ -3396,51 +3202,45 @@ mblen(s, n = ~0) } else { size_t len; - char * string = SvPV(byte_s, len); + char * string = SvPVbyte(byte_s, len); if (n < len) len = n; #ifdef USE_MBRLEN + MBRLEN_LOCK_; RETVAL = (SSize_t) mbrlen(string, len, &PL_mbrlen_ps); + MBRLEN_UNLOCK_; if (RETVAL < 0) RETVAL = -1; /* Use mblen() ret code for transparency */ #else /* Locking prevents races, but locales can be switched out * without locking, so this isn't a cure all */ - MBLEN_LOCK; + MBLEN_LOCK_; RETVAL = mblen(string, len); - MBLEN_UNLOCK; + MBLEN_UNLOCK_; #endif } } OUTPUT: RETVAL -#if defined(HAS_MBRTOWC) && (defined(USE_ITHREADS) || ! defined(HAS_MBTOWC)) -# define USE_MBRTOWC -#else -# undef USE_MBRTOWC -#endif - int mbtowc(pwc, s, n = ~0) SV * pwc SV * s size_t n CODE: + RETVAL = -1; +#if ! defined(HAS_MBTOWC) && ! defined(HAS_MBRTOWC) + PERL_UNUSED_ARG(pwc); + PERL_UNUSED_ARG(s); + PERL_UNUSED_ARG(n); +#else errno = 0; SvGETMAGIC(s); if (! SvOK(s)) { /* Initialize state */ -#ifdef USE_MBRTOWC - /* Initialize the shift state to all zeros in PL_mbrtowc_ps. */ - memzero(&PL_mbrtowc_ps, sizeof(PL_mbrtowc_ps)); - RETVAL = 0; -#else - MBTOWC_LOCK; - RETVAL = mbtowc(NULL, NULL, 0); - MBTOWC_UNLOCK; -#endif + mbtowc_(NULL, NULL, 0); } else { /* Not resetting state */ - wchar_t wc; + wchar_t wc = 0; SV * byte_s = sv_2mortal(newSVsv_nomg(s)); if (! sv_utf8_downgrade_nomg(byte_s, TRUE)) { SETERRNO(EINVAL, LIB_INVARG); @@ -3448,17 +3248,9 @@ mbtowc(pwc, s, n = ~0) } else { size_t len; - char * string = SvPV(byte_s, len); + char * string = SvPVbyte(byte_s, len); if (n < len) len = n; -#ifdef USE_MBRTOWC - RETVAL = (SSize_t) mbrtowc(&wc, string, len, &PL_mbrtowc_ps); -#else - /* Locking prevents races, but locales can be switched out - * without locking, so this isn't a cure all */ - MBTOWC_LOCK; - RETVAL = mbtowc(&wc, string, len); - MBTOWC_UNLOCK; -#endif + RETVAL = mbtowc_(&wc, string, len); if (RETVAL >= 0) { sv_setiv_mg(pwc, wc); } @@ -3467,6 +3259,7 @@ mbtowc(pwc, s, n = ~0) } } } +#endif OUTPUT: RETVAL @@ -3487,23 +3280,27 @@ wctomb(s, wchar) #ifdef USE_WCRTOMB /* The man pages khw looked at are in agreement that this works. * But probably memzero would too */ + WCRTOMB_LOCK_; RETVAL = wcrtomb(NULL, L'\0', &PL_wcrtomb_ps); + WCRTOMB_UNLOCK_; #else - WCTOMB_LOCK; + WCTOMB_LOCK_; RETVAL = wctomb(NULL, L'\0'); - WCTOMB_UNLOCK; + WCTOMB_UNLOCK_; #endif } else { /* Not resetting state */ char buffer[MB_LEN_MAX]; #ifdef USE_WCRTOMB + WCRTOMB_LOCK_; RETVAL = wcrtomb(buffer, wchar, &PL_wcrtomb_ps); + WCRTOMB_UNLOCK_; #else /* Locking prevents races, but locales can be switched out without * locking, so this isn't a cure all */ - WCTOMB_LOCK; + WCTOMB_LOCK_; RETVAL = wctomb(buffer, wchar); - WCTOMB_UNLOCK; + WCTOMB_UNLOCK_; #endif if (RETVAL >= 0) { sv_setpvn_mg(s, buffer, RETVAL); @@ -3516,6 +3313,12 @@ int strcoll(s1, s2) char * s1 char * s2 + CODE: + LC_COLLATE_LOCK; + RETVAL = strcoll(s1, s2); + LC_COLLATE_UNLOCK; + OUTPUT: + RETVAL void strtod(str) @@ -3631,24 +3434,11 @@ void strxfrm(src) SV * src CODE: - { - STRLEN srclen; - STRLEN dstlen; - STRLEN buflen; - char *p = SvPV(src,srclen); - srclen++; - buflen = srclen * 4 + 1; - ST(0) = sv_2mortal(newSV(buflen)); - dstlen = strxfrm(SvPVX(ST(0)), p, (size_t)buflen); - if (dstlen >= buflen) { - dstlen++; - SvGROW(ST(0), dstlen); - strxfrm(SvPVX(ST(0)), p, (size_t)dstlen); - dstlen--; - } - SvCUR_set(ST(0), dstlen); - SvPOK_only(ST(0)); - } +#ifdef USE_LOCALE_COLLATE + ST(0) = Perl_strxfrm(aTHX_ src); +#else + ST(0) = src; +#endif SysRet mkfifo(filename, mode) @@ -3730,7 +3520,10 @@ asctime(sec, min, hour, mday, mon, year, mytm.tm_yday = yday; mytm.tm_isdst = isdst; if (ix) { - const time_t result = mktime(&mytm); + time_t result; + MKTIME_LOCK; + result = mktime(&mytm); + MKTIME_UNLOCK; if (result == (time_t)-1) SvOK_off(TARG); else if (result == 0) @@ -3738,7 +3531,9 @@ asctime(sec, min, hour, mday, mon, year, else sv_setiv(TARG, (IV)result); } else { + ASCTIME_LOCK; sv_setpv(TARG, asctime(&mytm)); + ASCTIME_UNLOCK; } ST(0) = TARG; XSRETURN(1); @@ -3788,29 +3583,19 @@ strftime(fmt, sec, min, hour, mday, mon, { char *buf; SV *sv; + utf8ness_t is_utf8; /* allowing user-supplied (rather than literal) formats * is normally frowned upon as a potential security risk; * but this is part of the API so we have to allow it */ GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral); - buf = my_strftime(SvPV_nolen(fmt), sec, min, hour, mday, mon, year, wday, yday, isdst); + buf = my_strftime8_temp(SvPV_nolen(fmt), sec, min, hour, mday, mon, year, wday, yday, isdst, &is_utf8); GCC_DIAG_RESTORE_STMT; sv = sv_newmortal(); if (buf) { STRLEN len = strlen(buf); sv_usepvn_flags(sv, buf, len, SV_HAS_TRAILING_NUL); - if ( SvUTF8(fmt) - || ( is_utf8_non_invariant_string((U8*) buf, len) -#ifdef USE_LOCALE_TIME - && _is_cur_LC_category_utf8(LC_TIME) -#else /* If can't check directly, at least can see if script is consistent, - under UTF-8, which gives us an extra measure of confidence. */ - - && isSCRIPT_RUN((const U8 *) buf, - (const U8 *) buf + len, - TRUE) /* Means assume UTF-8 */ -#endif - )) { + if (SvUTF8(fmt) || is_utf8 == UTF8NESS_YES) { SvUTF8_on(sv); } } @@ -3835,8 +3620,12 @@ void tzname() PPCODE: EXTEND(SP,2); + /* It is undefined behavior if another thread is changing this while + * its being read */ + ENVr_LOCALEr_LOCK; PUSHs(newSVpvn_flags(tzname[0], strlen(tzname[0]), SVs_TEMP)); PUSHs(newSVpvn_flags(tzname[1], strlen(tzname[1]), SVs_TEMP)); + ENVr_LOCALEr_UNLOCK; char * ctermid(s = 0) Index: gnu/usr.bin/perl/ext/POSIX/lib/POSIX.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/POSIX/lib/POSIX.pm,v diff -u -p -a -u -p -r1.7 POSIX.pm --- gnu/usr.bin/perl/ext/POSIX/lib/POSIX.pm 15 Feb 2023 01:36:31 -0000 1.7 +++ gnu/usr.bin/perl/ext/POSIX/lib/POSIX.pm 21 Feb 2024 15:47:02 -0000 @@ -4,7 +4,7 @@ use warnings; our ($AUTOLOAD, %SIGRT); -our $VERSION = '2.03'; +our $VERSION = '2.13'; require XSLoader; @@ -12,7 +12,7 @@ use Fcntl qw(FD_CLOEXEC F_DUPFD F_GETFD F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK O_ACCMODE O_APPEND O_CREAT O_EXCL O_NOCTTY O_NONBLOCK O_RDONLY O_RDWR O_TRUNC O_WRONLY SEEK_CUR SEEK_END SEEK_SET - S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISREG + S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISLNK S_ISREG S_ISSOCK S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU S_ISGID S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR); @@ -278,7 +278,7 @@ my %default_export_tags = ( # cf. export creat SEEK_CUR SEEK_END SEEK_SET S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU - S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG S_ISUID + S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISLNK S_ISREG S_ISSOCK S_ISUID S_IWGRP S_IWOTH S_IWUSR)], float_h => [qw(DBL_DIG DBL_EPSILON DBL_MANT_DIG @@ -307,7 +307,7 @@ my %default_export_tags = ( # cf. export locale_h => [qw(LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME LC_IDENTIFICATION - LC_MEASUREMENT LC_PAPER LC_TELEPHONE LC_ADDRESS + LC_MEASUREMENT LC_PAPER LC_TELEPHONE LC_ADDRESS LC_NAME LC_SYNTAX LC_TOD NULL localeconv setlocale)], @@ -357,7 +357,7 @@ my %default_export_tags = ( # cf. export strtok strxfrm)], sys_stat_h => [qw(S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU - S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG + S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISLNK S_ISREG S_ISSOCK S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR fstat mkfifo)], Index: gnu/usr.bin/perl/ext/POSIX/lib/POSIX.pod =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/POSIX/lib/POSIX.pod,v diff -u -p -a -u -p -r1.11 POSIX.pod --- gnu/usr.bin/perl/ext/POSIX/lib/POSIX.pod 15 Feb 2023 01:36:31 -0000 1.11 +++ gnu/usr.bin/perl/ext/POSIX/lib/POSIX.pod 21 Feb 2024 15:47:02 -0000 @@ -10,9 +10,9 @@ POSIX - Perl interface to IEEE Std 1003. printf "EINTR is %d\n", EINTR; - $sess_id = POSIX::setsid(); + my $sess_id = POSIX::setsid(); - $fd = POSIX::open($path, O_CREAT|O_EXCL|O_WRONLY, 0644); + my $fd = POSIX::open($path, O_CREAT|O_EXCL|O_WRONLY, 0644); # note: that's a filedescriptor, *NOT* a filehandle =head1 DESCRIPTION @@ -501,7 +501,7 @@ than the explicit two operations [C99]. Maximum of C and C, except when either is C, returns the other [C99]. Added in Perl v5.22. - my $min = POSIX::fmax($x, $y); + my $max = POSIX::fmax($x, $y); =item C @@ -1015,6 +1015,18 @@ Here is how to query the database for th The members whose names begin with C and C were added by POSIX.1-2008 and are only available on systems that support them. +A value of -1 returned for numeric entries indicates that the field is +not applicable to the locale. This is rare except in the C and related +locales, which don't have most monetary values defined. It can also +happen, quirkily, in fields that are otherwise boolean to indicate that +the value is kind of neither true nor false. This happens in C +and C when the currency symbol neither precedes nor +succeeds a positive value but is infixed, by replacing the radix +character. + +Prior to Perl v5.37.7, empty string fields and numeric fields with value +-1 were omittted from the returned hash. + =item C This is identical to Perl's builtin C function for @@ -1134,9 +1146,10 @@ parameter is stored. The optional third larger than the actual length of the second parameter string. Use C as the second parameter to this function to get the effect -of passing NULL as the second parameter to C. This resets any -shift state to its initial value. The return value is undefined if -C was substituted, so you should never rely on it. +of passing NULL as the second parameter to C. This ignores the +first parameter, and resets any shift state to its initial value. The +return value is undefined if C was substituted, so you should +never rely on it. When the second parameter is a scalar containing a value that either is a PV string or can be forced into one, the return value is the number of @@ -1827,7 +1840,7 @@ about these and the other arguments. If you want your code to be portable, your format (C) argument should use only the conversion specifiers defined by the ANSI C -standard (C89, to play safe). These are C. +standard (C99, to play safe). These are C. But even then, the B of some of the conversion specifiers are non-portable. For example, the specifiers C change according to the locale settings of the user, and both how to set locales (the @@ -1972,9 +1985,14 @@ Used with C or C as an alternat Not really needed since Perl can do this transparently, see L. -Beware that in a UTF-8 locale, anything you pass to this function must -be in UTF-8; and when not in a UTF-8 locale, anything passed must not be -UTF-8 encoded. +Unlike the libc C, this allows NUL characters in the input +C<$src>. + +It doesn't make sense for a string to be encoded in one locale (say, +ISO-8859-6, Arabic) and to collate it based on another (like ISO-8859-7, +Greek). Perl assumes that the current C locale correctly +represents the encoding of C<$src>, and ignores the value of +C. =item C @@ -2197,9 +2215,10 @@ L and L may be used to of other types of multi-byte locales. Use C as the first parameter to this function to get the effect -of passing NULL as the first parameter to C. This resets any -shift state to its initial value. The return value is undefined if -C was substituted, so you should never rely on it. +of passing NULL as the first parameter to C. This ignores the +second parameter, and resets any shift state to its initial value. The +return value is undefined if C was substituted, so you should +never rely on it. When the first parameter is a scalar, the code point contained in the scalar second parameter is converted into a multi-byte string and stored @@ -2740,7 +2759,7 @@ C C C C C C C C +C C C C C C C =back Index: gnu/usr.bin/perl/ext/POSIX/t/export.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/POSIX/t/export.t,v diff -u -p -a -u -p -r1.4 export.t --- gnu/usr.bin/perl/ext/POSIX/t/export.t 15 Feb 2023 01:36:31 -0000 1.4 +++ gnu/usr.bin/perl/ext/POSIX/t/export.t 21 Feb 2024 15:47:02 -0000 @@ -48,7 +48,7 @@ my %expect = ( INT_MAX INT_MIN ISIG ISTRIP IXOFF IXON LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NUMERIC LC_PAPER - LC_TELEPHONE LC_TIME LC_SYNTAX LC_TOD LDBL_DIG + LC_TELEPHONE LC_TIME LC_NAME LC_SYNTAX LC_TOD LDBL_DIG LDBL_EPSILON LDBL_MANT_DIG LDBL_MAX LDBL_MAX_10_EXP LDBL_MAX_EXP LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP LINK_MAX LONG_MAX LONG_MIN L_ctermid L_cuserid MAX_CANON @@ -66,7 +66,7 @@ my %expect = ( SIG_IGN SIG_SETMASK SIG_UNBLOCK SSIZE_MAX STDERR_FILENO STDIN_FILENO STDOUT_FILENO STREAM_MAX S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU S_ISBLK S_ISCHR S_ISDIR S_ISFIFO - S_ISGID S_ISREG S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP + S_ISGID S_ISLNK S_ISREG S_ISSOCK S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR TCIFLUSH TCIOFF TCIOFLUSH TCION TCOFLUSH TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW TMP_MAX TOSTOP TZNAME_MAX UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX VEOF VEOL Index: gnu/usr.bin/perl/ext/POSIX/t/posix.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/POSIX/t/posix.t,v diff -u -p -a -u -p -r1.10 posix.t --- gnu/usr.bin/perl/ext/POSIX/t/posix.t 15 Feb 2023 01:36:31 -0000 1.10 +++ gnu/usr.bin/perl/ext/POSIX/t/posix.t 21 Feb 2024 15:47:02 -0000 @@ -373,10 +373,9 @@ SKIP: { currency_symbol mon_decimal_point mon_thousands_sep mon_grouping positive_sign negative_sign)) { SKIP: { - skip("localeconv has no result for $_", 1) - unless exists $conv->{$_}; - unlike(delete $conv->{$_}, qr/\A\z/, - "localeconv returned a non-empty string for $_"); + my $value = delete $conv->{$_}; + skip("localeconv '$_' may be empty", 1) if $_ ne 'decimal_point'; + isnt($value, "", "localeconv returned a non-empty string for $_"); } } @@ -399,8 +398,6 @@ SKIP: { foreach (@lconv) { SKIP: { - skip("localeconv has no result for $_", 1) - unless exists $conv->{$_}; like(delete $conv->{$_}, qr/\A-?\d+\z/, "localeconv returned an integer for $_"); } Index: gnu/usr.bin/perl/ext/Pod-Functions/t/Functions.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Pod-Functions/t/Functions.t,v diff -u -p -a -u -p -r1.3 Functions.t --- gnu/usr.bin/perl/ext/Pod-Functions/t/Functions.t 15 Feb 2023 01:36:32 -0000 1.3 +++ gnu/usr.bin/perl/ext/Pod-Functions/t/Functions.t 21 Feb 2024 15:47:02 -0000 @@ -115,10 +115,11 @@ Functions for filehandles, files, or dir Keywords related to the control flow of your Perl program: __FILE__, __LINE__, __PACKAGE__, __SUB__, break, caller, continue, die, do, dump, eval, evalbytes, exit, goto, - last, next, redo, return, sub, wantarray + last, method, next, redo, return, sub, wantarray Keywords related to scoping: - caller, import, local, my, our, package, state, use + caller, class, field, import, local, my, our, package, + state, use Miscellaneous functions: defined, formline, lock, prototype, reset, scalar, undef @@ -132,8 +133,8 @@ Keywords related to Perl modules: do, import, no, package, require, use Keywords related to classes and object-orientation: - bless, dbmclose, dbmopen, package, ref, tie, tied, untie, - use + bless, class, dbmclose, dbmopen, field, method, package, + ref, tie, tied, untie, use Low-level socket functions: accept, bind, connect, getpeername, getsockname, Index: gnu/usr.bin/perl/ext/Pod-Html/bin/pod2html =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Pod-Html/bin/pod2html,v diff -u -p -a -u -p -r1.2 pod2html --- gnu/usr.bin/perl/ext/Pod-Html/bin/pod2html 25 Jul 2016 10:53:04 -0000 1.2 +++ gnu/usr.bin/perl/ext/Pod-Html/bin/pod2html 21 Feb 2024 15:47:02 -0000 @@ -25,6 +25,43 @@ pod2html takes the following arguments: =over 4 +=item backlink + + --backlink + --nobacklink + +Turn =head1 directives into links pointing to the top of the HTML file. +--nobacklink (which is the default behavior) does not create these backlinks. + +=item cachedir + + --cachedir=name + +Specify which directory is used for storing cache. Default directory is the +current working directory. + +=item css + + --css=URL + +Specify the URL of cascading style sheet to link from resulting HTML file. +Default is none style sheet. + +=item flush + + --flush + +Flush the cache. + +=item header + + --header + --noheader + +Create header and footer blocks containing the text of the "NAME" section. +--noheader -- which is the default behavior -- does not create header or footer +blocks. + =item help --help @@ -53,6 +90,22 @@ Do not use this if relative links are de Do not pass both this and --htmldir to pod2html; they are mutually exclusive. +=item index + + --index + +Generate an index at the top of the HTML file (default behaviour). + +=over 4 + +=item noindex + + --noindex + +Do not generate an index at the top of the HTML file. + +=back + =item infile --infile=name @@ -67,11 +120,14 @@ infile is specified. Specify the HTML file to create. Output goes to STDOUT if no outfile is specified. -=item podroot +=item poderrors - --podroot=name + --poderrors + --nopoderrors -Specify the base directory for finding library pods. +Include a "POD ERRORS" section in the outfile if there were any POD errors in +the infile (default behaviour). --nopoderrors does not create this "POD +ERRORS" section. =item podpath @@ -80,90 +136,28 @@ Specify the base directory for finding l Specify which subdirectories of the podroot contain pod files whose HTML converted forms can be linked-to in cross-references. -=item cachedir - - --cachedir=name - -Specify which directory is used for storing cache. Default directory is the -current working directory. - -=item flush - - --flush - -Flush the cache. - -=item backlink - - --backlink - -Turn =head1 directives into links pointing to the top of the HTML file. - -=item nobacklink - - --nobacklink - -Do not turn =head1 directives into links pointing to the top of the HTML file -(default behaviour). - -=item header - - --header - -Create header and footer blocks containing the text of the "NAME" section. - -=item noheader - - --noheader - -Do not create header and footer blocks containing the text of the "NAME" -section (default behaviour). - -=item poderrors - - --poderrors - -Include a "POD ERRORS" section in the outfile if there were any POD errors in -the infile (default behaviour). - -=item nopoderrors - - --nopoderrors - -Do not include a "POD ERRORS" section in the outfile if there were any POD -errors in the infile. - -=item index - - --index +=item podroot -Generate an index at the top of the HTML file (default behaviour). + --podroot=name -=item noindex +Specify the base directory for finding library pods. - --noindex +=item quiet -Do not generate an index at the top of the HTML file. + --quiet + --noquiet +Don't display mostly harmless warning messages. --noquiet -- which is the +default behavior -- I display these mostly harmless warning messages (but +this is not the same as "verbose" mode). =item recurse --recurse - -Recurse into subdirectories specified in podpath (default behaviour). - -=item norecurse - --norecurse -Do not recurse into subdirectories specified in podpath. - -=item css - - --css=URL - -Specify the URL of cascading style sheet to link from resulting HTML file. -Default is none style sheet. +Recurse into subdirectories specified in podpath (default behaviour). +--norecurse does not recurse into these subdirectories. =item title @@ -171,30 +165,13 @@ Default is none style sheet. Specify the title of the resulting HTML file. -=item quiet - - --quiet - -Don't display mostly harmless warning messages. - -=item noquiet - - --noquiet - -Display mostly harmless warning messages (default behaviour). But this is not -the same as "verbose" mode. - =item verbose --verbose - -Display progress messages. - -=item noverbose - --noverbose -Do not display progress messages (default behaviour). +Display progress messages. --noverbose -- which is the default behavior -- +does not display these progress messages. =back Index: gnu/usr.bin/perl/ext/Pod-Html/lib/Pod/Html.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Pod-Html/lib/Pod/Html.pm,v diff -u -p -a -u -p -r1.6 Html.pm --- gnu/usr.bin/perl/ext/Pod-Html/lib/Pod/Html.pm 15 Feb 2023 01:36:32 -0000 1.6 +++ gnu/usr.bin/perl/ext/Pod-Html/lib/Pod/Html.pm 21 Feb 2024 15:47:02 -0000 @@ -2,10 +2,9 @@ package Pod::Html; use strict; use Exporter 'import'; -our $VERSION = 1.33; +our $VERSION = 1.34; $VERSION = eval $VERSION; -our @EXPORT = qw(pod2html htmlify); -our @EXPORT_OK = qw(anchorify relativize_url); +our @EXPORT = qw(pod2html); use Config; use Cwd; @@ -195,7 +194,7 @@ Display progress messages. By default, =back -=head2 Auxiliary Functions +=head2 Formerly Exported Auxiliary Functions Prior to perl-5.36, the following three functions were exported by F, either by default or on request: @@ -213,10 +212,8 @@ F, either by default or on re The definition and documentation of these functions have been moved to F, viewable via C. -In perl-5.36, these functions will be importable from either F or -F. However, beginning with perl-5.38 they will only be -importable, upon request, from F. Please modify your code as -needed. +Beginning with perl-5.38 these functions must be explicitly imported from +F. Please modify your code as needed. =head1 ENVIRONMENT Index: gnu/usr.bin/perl/ext/Pod-Html/lib/Pod/Html/Util.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Pod-Html/lib/Pod/Html/Util.pm,v diff -u -p -a -u -p -r1.1.1.1 Util.pm --- gnu/usr.bin/perl/ext/Pod-Html/lib/Pod/Html/Util.pm 15 Feb 2023 01:32:58 -0000 1.1.1.1 +++ gnu/usr.bin/perl/ext/Pod-Html/lib/Pod/Html/Util.pm 21 Feb 2024 15:47:02 -0000 @@ -2,7 +2,7 @@ package Pod::Html::Util; use strict; use Exporter 'import'; -our $VERSION = 1.33; # Please keep in synch with lib/Pod/Html.pm +our $VERSION = 1.34; # Please keep in synch with lib/Pod/Html.pm $VERSION = eval $VERSION; our @EXPORT_OK = qw( anchorify Index: gnu/usr.bin/perl/ext/Pod-Html/t/anchorify-536.t =================================================================== RCS file: gnu/usr.bin/perl/ext/Pod-Html/t/anchorify-536.t diff -N gnu/usr.bin/perl/ext/Pod-Html/t/anchorify-536.t --- gnu/usr.bin/perl/ext/Pod-Html/t/anchorify-536.t 15 Feb 2023 01:32:58 -0000 1.1.1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,114 +0,0 @@ -use strict; -use warnings; -use Pod::Html qw( anchorify relativize_url ); -my ($revision,$version,$subversion) = split /\./, sprintf("%vd",$^V); -use Test::More; -unless ($version == 35 or $version == 36) { - plan skip_all => "Needed only during 5.36"; -} - -my @filedata; -{ - local $/ = ''; - @filedata = ; -} - -my (@poddata, $i, $j); -for ($i = 0, $j = -1; $i <= $#filedata; $i++) { - $j++ if ($filedata[$i] =~ /^\s*=head[1-6]/); - if ($j >= 0) { - $poddata[$j] = "" unless defined $poddata[$j]; - $poddata[$j] .= "\n$filedata[$i]" if $j >= 0; - } -} - -my %heads = (); -foreach $i (0..$#poddata) { - $heads{anchorify($1)} = 1 if $poddata[$i] =~ /=head[1-6]\s+(.*)/; -} -my %expected = map { $_ => 1 } qw( - NAME - DESCRIPTION - Subroutine - Error - Method - Has_A_Wordspace - HasTrailingWordspace - HasLeadingWordspace - Has_Extra_InternalWordspace - Has_Quotes - Has_QuestionMark - Has_Hyphen_And_Space -); -is_deeply( - \%heads, - \%expected, - "Got expected POD heads" -); - -{ - # adapted from 'installhtml' - my $file = '/home/username/tmp/installhtml/pod/perlipc'; - my $capture = 'NAME'; - my $expected_url = '/home/username/tmp/installhtml/pod/perlipc/NAME.html'; - my $expected_relativized_url = 'perlipc/NAME.html'; - my $url = "$file/@{[anchorify(qq($capture))]}.html" ; - is($url, $expected_url, "anchorify() returned expected value"); - my $relativized_url = relativize_url( $url, "$file.html" ); - is($relativized_url, $expected_relativized_url, "relativize_url() returned expected value"); -} - -done_testing; - -__DATA__ -=head1 NAME - -anchorify - Test C - -=head1 DESCRIPTION - -alpha - -=head2 Subroutine - -beta - -=head3 Error - -gamma - -=head4 Method - -delta - -=head4 Has A Wordspace - -delta - -=head4 HasTrailingWordspace - -epsilon - -=head4 HasLeadingWordspace - -zeta - -=head4 Has Extra InternalWordspace - -eta - -=head4 Has"Quotes" - -theta - -=head4 Has?QuestionMark - -iota - -=head4 Has-Hyphen And Space - -kappa - -=cut - -__END__ Index: gnu/usr.bin/perl/ext/Pod-Html/t/lib/Testing.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Pod-Html/t/lib/Testing.pm,v diff -u -p -a -u -p -r1.1.1.1 Testing.pm --- gnu/usr.bin/perl/ext/Pod-Html/t/lib/Testing.pm 15 Feb 2023 01:32:58 -0000 1.1.1.1 +++ gnu/usr.bin/perl/ext/Pod-Html/t/lib/Testing.pm 21 Feb 2024 15:47:02 -0000 @@ -2,7 +2,7 @@ package Testing; use 5.10.0; use warnings; use Exporter 'import'; -our $VERSION = 1.33; # Let's keep this same as lib/Pod/Html.pm +our $VERSION = 1.34; # Let's keep this same as lib/Pod/Html.pm $VERSION = eval $VERSION; our @EXPORT_OK = qw( setup_testing_dir @@ -121,7 +121,7 @@ underlying operating system, I wi we cannot hard-code the expected HTML output into the C template or any place else. We have to allow C to massage the template data to get an "expected output" against which we match the "actual output" -which come from running C over the text originally +which comes from running C over the text originally slurped into memory from the F file. Granted, there is a certain amount of circularity in this testing regimen. On @@ -139,7 +139,8 @@ that we get consistent results out of C< Here we continue to focus on those test programs which make use of the testing functions exported by F and which take a F file as input. -We assume that we begin our tests from the top level of the Perl 5 core distribution and are using F. Hence, to run the test files we say: +We assume that we begin our tests from the top level of the Perl 5 core +distribution and are using F. Hence, to run the test files we say: cd t; ./perl harness ../ext/Pod-Html/t/*.t; cd - @@ -147,15 +148,15 @@ The program then slurps contents of the The program then calls C from this module to create a temporary directory and populate it as needed. C returns -the absolute path to that directory, but at the point of return you are -actually located two levels beneath the temporary directory in a directory whose relative path is -F. (This is equivalent to being in F -for tests in versions of Pod-Html distributed with earlier versions of -F.) - -Note that this means that at the end of the program you will have to -switch back to your starting directory so that the tempdir can automatically -be cleaned up. We automate this via an C block. +the absolute path to that directory, but at the point where that subroutine +returns you are actually located two levels beneath the temporary directory in +a directory whose relative path is F. (This is equivalent to +being in F for tests in versions of Pod-Html +distributed with earlier versions of F.) + +Note that this means that at the end of the program you will have to switch +back to your starting directory so that the tempdir can automatically be +cleaned up. We automate this via an C block. You then prepare arguments for our principal testing function, C (which supersedes the former C. These arguments take the @@ -433,10 +434,16 @@ Not explicitly defined, but should retur =item * Comment -This function essentially asks, "Are we getting the same HTML output the last time we tinkered with the code in this distribution?" Hence, it is dependent on the particular parsing and HTML composition functionality found within C, which is a somewhat customized subclass of F. If, in the future, we offer functionality based on other parsing classes, then the C sections of the F files will have to be revised and perhaps the guts of C as well. +This function essentially asks, "Are we getting the same HTML output the last +time we tinkered with the code in this distribution?" Hence, it is dependent +on the particular parsing and HTML composition functionality found within +C, which is a somewhat customized subclass of +F. If, in the future, we offer functionality based on +other parsing classes, then the C sections of the F files will +have to be revised and perhaps the guts of C as well. -This function is roughly equivalent to test helper function C in earlier -versions of Pod-Html. +This function is roughly equivalent to test helper function +C in earlier versions of Pod-Html. =back Index: gnu/usr.bin/perl/ext/SDBM_File/SDBM_File.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/SDBM_File/SDBM_File.pm,v diff -u -p -a -u -p -r1.11 SDBM_File.pm --- gnu/usr.bin/perl/ext/SDBM_File/SDBM_File.pm 30 Dec 2019 02:13:53 -0000 1.11 +++ gnu/usr.bin/perl/ext/SDBM_File/SDBM_File.pm 21 Feb 2024 15:47:02 -0000 @@ -7,7 +7,7 @@ require Tie::Hash; require XSLoader; our @ISA = qw(Tie::Hash); -our $VERSION = "1.15"; +our $VERSION = "1.17"; our @EXPORT_OK = qw(PAGFEXT DIRFEXT PAIRMAX); use Exporter "import"; Index: gnu/usr.bin/perl/ext/SDBM_File/dbu.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/SDBM_File/dbu.c,v diff -u -p -a -u -p -r1.3 dbu.c --- gnu/usr.bin/perl/ext/SDBM_File/dbu.c 15 Feb 2023 01:36:32 -0000 1.3 +++ gnu/usr.bin/perl/ext/SDBM_File/dbu.c 21 Feb 2024 15:47:02 -0000 @@ -20,7 +20,7 @@ static char *usage = "%s [-R] cat | look #define DLOOK 1 #define DINSERT 2 #define DDELETE 3 -#define DCAT 4 +#define DCAT 4 #define DBUILD 5 #define DPRESS 6 #define DCREAT 7 Index: gnu/usr.bin/perl/ext/SDBM_File/sdbm.c =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/SDBM_File/sdbm.c,v diff -u -p -a -u -p -r1.4 sdbm.c --- gnu/usr.bin/perl/ext/SDBM_File/sdbm.c 15 Feb 2023 01:36:32 -0000 1.4 +++ gnu/usr.bin/perl/ext/SDBM_File/sdbm.c 21 Feb 2024 15:47:02 -0000 @@ -43,6 +43,11 @@ extern Free_t free(Malloc_t); const datum nullitem = {0, 0}; +#ifdef WIN32 +# undef lseek +# define lseek _lseeki64 +#endif + /* * forward */ @@ -59,8 +64,8 @@ static int makroom(DBM *, long, int); #define exhash(item) sdbm_hash((item).dptr, (item).dsize) #define ioerr(db) ((db)->flags |= DBM_IOERR) -#define OFF_PAG(off) (long) (off) * PBLKSIZ -#define OFF_DIR(off) (long) (off) * DBLKSIZ +#define OFF_PAG(off) (Off_t) (off) * PBLKSIZ +#define OFF_DIR(off) (Off_t) (off) * DBLKSIZ static const long masks[] = { 000000000000, 000000000001, 000000000003, 000000000007, @@ -291,7 +296,7 @@ makroom(DBM *db, long int hash, int need char twin[PBLKSIZ]; #if defined(DOSISH) || defined(WIN32) char zer[PBLKSIZ]; - long oldtail; + Off_t oldtail; #endif char *pag = db->pagbuf; char *New = twin; Index: gnu/usr.bin/perl/ext/Sys-Hostname/Hostname.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/Sys-Hostname/Hostname.pm,v diff -u -p -a -u -p -r1.5 Hostname.pm --- gnu/usr.bin/perl/ext/Sys-Hostname/Hostname.pm 15 Feb 2023 01:36:32 -0000 1.5 +++ gnu/usr.bin/perl/ext/Sys-Hostname/Hostname.pm 21 Feb 2024 15:47:02 -0000 @@ -15,7 +15,7 @@ use warnings (); our $host; BEGIN { - $VERSION = '1.24'; + $VERSION = '1.25'; { local $SIG{__DIE__}; eval { @@ -131,7 +131,7 @@ Sys::Hostname - Try every conceivable wa =head1 SYNOPSIS use Sys::Hostname; - $host = hostname; + my $host = hostname; =head1 DESCRIPTION Index: gnu/usr.bin/perl/ext/XS-APItest/APItest.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/APItest.pm,v diff -u -p -a -u -p -r1.6 APItest.pm --- gnu/usr.bin/perl/ext/XS-APItest/APItest.pm 15 Feb 2023 01:36:32 -0000 1.6 +++ gnu/usr.bin/perl/ext/XS-APItest/APItest.pm 21 Feb 2024 15:47:02 -0000 @@ -4,7 +4,7 @@ use strict; use warnings; use Carp; -our $VERSION = '1.22'; +our $VERSION = '1.32'; require XSLoader; Index: gnu/usr.bin/perl/ext/XS-APItest/APItest.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/APItest.xs,v diff -u -p -a -u -p -r1.6 APItest.xs --- gnu/usr.bin/perl/ext/XS-APItest/APItest.xs 15 Feb 2023 01:36:32 -0000 1.6 +++ gnu/usr.bin/perl/ext/XS-APItest/APItest.xs 21 Feb 2024 15:47:02 -0000 @@ -23,6 +23,16 @@ typedef PerlIO * OutputStream; #define croak_fail_nep(h, w) croak("fail %p!=%p at " __FILE__ " line %d", (h), (w), __LINE__) #define croak_fail_nei(h, w) croak("fail %d!=%d at " __FILE__ " line %d", (int)(h), (int)(w), __LINE__) +/* assumes that there is a 'failed' variable in scope */ +#define TEST_EXPR(s) STMT_START { \ + if (s) { \ + printf("# ok: %s\n", #s); \ + } else { \ + printf("# not ok: %s\n", #s); \ + failed++; \ + } \ +} STMT_END + #if IVSIZE == 8 # define TEST_64BIT 1 #else @@ -115,8 +125,19 @@ S_myset_set(pTHX_ SV* sv, MAGIC* mg) return 0; } +static int +S_myset_set_dies(pTHX_ SV* sv, MAGIC* mg) +{ + PERL_UNUSED_ARG(sv); + PERL_UNUSED_ARG(mg); + croak("in S_myset_set_dies"); + return 0; +} + + static MGVTBL vtbl_foo, vtbl_bar; static MGVTBL vtbl_myset = { 0, S_myset_set, 0, 0, 0, 0, 0, 0 }; +static MGVTBL vtbl_myset_dies = { 0, S_myset_set_dies, 0, 0, 0, 0, 0, 0 }; static int S_mycopy_copy(pTHX_ SV *sv, MAGIC* mg, SV *nsv, const char *name, I32 namlen) { @@ -1443,8 +1464,62 @@ my_ck_rv2cv(pTHX_ OP *o) return old_ck_rv2cv(aTHX_ o); } +#define test_bool_internals_macro(true_sv, false_sv) \ + test_bool_internals_func(true_sv, false_sv,\ + #true_sv " and " #false_sv) + +U32 +test_bool_internals_func(SV *true_sv, SV *false_sv, const char *msg) { + U32 failed = 0; + printf("# Testing '%s'\n", msg); + TEST_EXPR(SvCUR(true_sv) == 1); + TEST_EXPR(SvCUR(false_sv) == 0); + TEST_EXPR(SvLEN(true_sv) == 0); + TEST_EXPR(SvLEN(false_sv) == 0); + TEST_EXPR(SvIV(true_sv) == 1); + TEST_EXPR(SvIV(false_sv) == 0); + TEST_EXPR(SvIsCOW(true_sv)); + TEST_EXPR(SvIsCOW(false_sv)); + TEST_EXPR(strEQ(SvPV_nolen(true_sv),"1")); + TEST_EXPR(strEQ(SvPV_nolen(false_sv),"")); + TEST_EXPR(SvIOK(true_sv)); + TEST_EXPR(SvIOK(false_sv)); + TEST_EXPR(SvPOK(true_sv)); + TEST_EXPR(SvPOK(false_sv)); + TEST_EXPR(SvBoolFlagsOK(true_sv)); + TEST_EXPR(SvBoolFlagsOK(false_sv)); + TEST_EXPR(SvTYPE(true_sv) >= SVt_PVNV); + TEST_EXPR(SvTYPE(false_sv) >= SVt_PVNV); + TEST_EXPR(SvBoolFlagsOK(true_sv) && BOOL_INTERNALS_sv_isbool(true_sv)); + TEST_EXPR(SvBoolFlagsOK(false_sv) && BOOL_INTERNALS_sv_isbool(false_sv)); + TEST_EXPR(SvBoolFlagsOK(true_sv) && BOOL_INTERNALS_sv_isbool_true(true_sv)); + TEST_EXPR(SvBoolFlagsOK(false_sv) && BOOL_INTERNALS_sv_isbool_false(false_sv)); + TEST_EXPR(SvBoolFlagsOK(true_sv) && !BOOL_INTERNALS_sv_isbool_false(true_sv)); + TEST_EXPR(SvBoolFlagsOK(false_sv) && !BOOL_INTERNALS_sv_isbool_true(false_sv)); + TEST_EXPR(SvTRUE(true_sv)); + TEST_EXPR(!SvTRUE(false_sv)); + if (failed) { + PerlIO_printf(Perl_debug_log, "# '%s' the tested true_sv:\n", msg); + sv_dump(true_sv); + PerlIO_printf(Perl_debug_log, "# PL_sv_yes:\n"); + sv_dump(&PL_sv_yes); + PerlIO_printf(Perl_debug_log, "# '%s' tested false_sv:\n",msg); + sv_dump(false_sv); + PerlIO_printf(Perl_debug_log, "# PL_sv_no:\n"); + sv_dump(&PL_sv_no); + } + fflush(stdout); + SvREFCNT_dec(true_sv); + SvREFCNT_dec(false_sv); + return failed; +} #include "const-c.inc" +void +destruct_test(pTHX_ void *p) { + warn("In destruct_test: %" SVf "\n", (SV*)p); +} + MODULE = XS::APItest PACKAGE = XS::APItest INCLUDE: const-xs.inc @@ -1658,6 +1733,18 @@ test_uvchr_to_utf8_flags_msgs(uv, flags) MODULE = XS::APItest:Overload PACKAGE = XS::APItest::Overload void +does_amagic_apply(sv, method, flags) + SV *sv + int method + int flags + PPCODE: + if(Perl_amagic_applies(aTHX_ sv, method, flags)) + XSRETURN_YES; + else + XSRETURN_NO; + + +void amagic_deref_call(sv, what) SV *sv int what @@ -2404,7 +2491,7 @@ mpushp() EXTEND(SP, 3); mPUSHp("one", 3); mPUSHp("two", 3); - mPUSHp("three", 5); + mPUSHpvs("three"); XSRETURN(3); void @@ -2439,7 +2526,7 @@ mxpushp() PPCODE: mXPUSHp("one", 3); mXPUSHp("two", 3); - mXPUSHp("three", 5); + mXPUSHpvs("three"); XSRETURN(3); void @@ -2484,19 +2571,27 @@ test_EXTEND(max_offset, nsv, use_ss) SV *nsv; bool use_ss; PREINIT: - SV **sp = PL_stack_max + max_offset; + SV **new_sp = PL_stack_max + max_offset; + SSize_t new_offset = new_sp - PL_stack_base; PPCODE: if (use_ss) { SSize_t n = (SSize_t)SvIV(nsv); - EXTEND(sp, n); - *(sp + n) = NULL; + EXTEND(new_sp, n); + new_sp = PL_stack_base + new_offset; + assert(new_sp + n <= PL_stack_max); + if ((new_sp + n) > PL_stack_sp) + *(new_sp + n) = NULL; } else { IV n = SvIV(nsv); - EXTEND(sp, n); - *(sp + n) = NULL; + EXTEND(new_sp, n); + new_sp = PL_stack_base + new_offset; + assert(new_sp + n <= PL_stack_max); + if ((new_sp + n) > PL_stack_sp) + *(new_sp + n) = NULL; } - *PL_stack_max = NULL; + if (PL_stack_max > PL_stack_sp) + *PL_stack_max = NULL; void @@ -4251,7 +4346,7 @@ CODE: SV * HvENAME(HV *hv) CODE: - RETVAL = hv && HvENAME(hv) + RETVAL = hv && HvHasENAME(hv) ? newSVpvn_flags( HvENAME(hv),HvENAMELEN(hv), (HvENAMEUTF8(hv) ? SVf_UTF8 : 0) @@ -4281,30 +4376,44 @@ OUTPUT: RETVAL char * -SvPVbyte(SV *sv) +SvPVbyte(SV *sv, OUT STRLEN len) +CODE: + RETVAL = SvPVbyte(sv, len); +OUTPUT: + RETVAL + +char * +SvPVbyte_nolen(SV *sv) CODE: RETVAL = SvPVbyte_nolen(sv); OUTPUT: RETVAL char * -SvPVbyte_nomg(SV *sv) +SvPVbyte_nomg(SV *sv, OUT STRLEN len) CODE: - RETVAL = SvPVbyte_nomg(sv, PL_na); + RETVAL = SvPVbyte_nomg(sv, len); OUTPUT: RETVAL char * -SvPVutf8(SV *sv) +SvPVutf8(SV *sv, OUT STRLEN len) +CODE: + RETVAL = SvPVutf8(sv, len); +OUTPUT: + RETVAL + +char * +SvPVutf8_nolen(SV *sv) CODE: RETVAL = SvPVutf8_nolen(sv); OUTPUT: RETVAL char * -SvPVutf8_nomg(SV *sv) +SvPVutf8_nomg(SV *sv, OUT STRLEN len) CODE: - RETVAL = SvPVutf8_nomg(sv, PL_na); + RETVAL = SvPVutf8_nomg(sv, len); OUTPUT: RETVAL @@ -4418,6 +4527,20 @@ sv_mortalcopy(SV *sv) SV * newRV(SV *sv) +SV * +newAVav(AV *av) + CODE: + RETVAL = newRV_noinc((SV *)newAVav(av)); + OUTPUT: + RETVAL + +SV * +newAVhv(HV *hv) + CODE: + RETVAL = newRV_noinc((SV *)newAVhv(hv)); + OUTPUT: + RETVAL + void alias_av(AV *av, IV ix, SV *sv) CODE: @@ -4577,6 +4700,27 @@ test_MAX_types() OUTPUT: RETVAL +SV * +test_HvNAMEf(sv) + SV *sv + CODE: + if (!sv_isobject(sv)) XSRETURN_UNDEF; + HV *pkg = SvSTASH(SvRV(sv)); + RETVAL = newSVpvf("class='%" HvNAMEf "'", pkg); + OUTPUT: + RETVAL + +SV * +test_HvNAMEf_QUOTEDPREFIX(sv) + SV *sv + CODE: + if (!sv_isobject(sv)) XSRETURN_UNDEF; + HV *pkg = SvSTASH(SvRV(sv)); + RETVAL = newSVpvf("class=%" HvNAMEf_QUOTEDPREFIX, pkg); + OUTPUT: + RETVAL + + bool sv_numeq(SV *sv1, SV *sv2) CODE: @@ -4637,16 +4781,22 @@ void sv_magic_foo(SV *sv, SV *thingy) ALIAS: sv_magic_bar = 1 + sv_magic_baz = 2 CODE: - sv_magicext(SvRV(sv), NULL, PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo, (const char *)thingy, 0); + sv_magicext(sv, NULL, ix == 2 ? PERL_MAGIC_extvalue : PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo, (const char *)thingy, 0); SV * mg_find_foo(SV *sv) ALIAS: mg_find_bar = 1 + mg_find_baz = 2 CODE: - MAGIC *mg = mg_findext(SvRV(sv), PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo); - RETVAL = mg ? SvREFCNT_inc((SV *)mg->mg_ptr) : &PL_sv_undef; + RETVAL = &PL_sv_undef; + if (SvTYPE(sv) >= SVt_PVMG) { + MAGIC *mg = mg_findext(sv, ix == 2 ? PERL_MAGIC_extvalue : PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo); + if (mg) + RETVAL = SvREFCNT_inc((SV *)mg->mg_ptr); + } OUTPUT: RETVAL @@ -4654,13 +4804,14 @@ void sv_unmagic_foo(SV *sv) ALIAS: sv_unmagic_bar = 1 + sv_unmagic_baz = 2 CODE: - sv_unmagicext(SvRV(sv), PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo); + sv_unmagicext(sv, ix == 2 ? PERL_MAGIC_extvalue : PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo); void sv_magic(SV *sv, SV *thingy) CODE: - sv_magic(SvRV(sv), NULL, PERL_MAGIC_ext, (const char *)thingy, 0); + sv_magic(sv, NULL, PERL_MAGIC_ext, (const char *)thingy, 0); UV test_get_vtbl() @@ -4712,6 +4863,13 @@ test_get_vtbl() # where that magic's job is to increment thingy void +sv_magic_myset_dies(SV *rsv, SV *thingy) +CODE: + sv_magicext(SvRV(rsv), NULL, PERL_MAGIC_ext, &vtbl_myset_dies, + (const char *)thingy, 0); + + +void sv_magic_myset(SV *rsv, SV *thingy) CODE: sv_magicext(SvRV(rsv), NULL, PERL_MAGIC_ext, &vtbl_myset, @@ -4736,6 +4894,43 @@ sv_magic_mycopy_count(SV *rsv) OUTPUT: RETVAL +int +my_av_store(SV *rsv, IV i, SV *sv) + CODE: + if (av_store((AV*)SvRV(rsv), i, sv)) { + SvREFCNT_inc(sv); + RETVAL = 1; + } else { + RETVAL = 0; + } + OUTPUT: + RETVAL + +STRLEN +sv_refcnt(SV *sv) + CODE: + RETVAL = SvREFCNT(sv); + OUTPUT: + RETVAL + +void +test_mortal_destructor_sv(SV *coderef, SV *args) + CODE: + MORTALDESTRUCTOR_SV(coderef,args); + +void +test_mortal_destructor_av(SV *coderef, AV *args) + CODE: + /* passing in an AV cast to SV is different from a SV ref to an AV */ + MORTALDESTRUCTOR_SV(coderef, (SV *)args); + +void +test_mortal_svfunc_x(SV *args) + CODE: + MORTALSVFUNC_X(&destruct_test,args); + + + MODULE = XS::APItest PACKAGE = XS::APItest @@ -6553,14 +6748,14 @@ test_is_utf8_fixed_width_buf_loclen_flag RETVAL IV -test_utf8_hop_safe(SV *s_sv, STRLEN s_off, IV off) +test_utf8_hop_safe(SV *s_sv, STRLEN s_off, IV hop) PREINIT: STRLEN len; U8 *p; U8 *r; CODE: p = (U8 *)SvPV(s_sv, len); - r = utf8_hop_safe(p + s_off, off, p, p + len); + r = utf8_hop_safe(p + s_off, hop, p, p + len); RETVAL = r - p; OUTPUT: RETVAL @@ -6992,6 +7187,19 @@ test_Perl_langinfo(SV * item) OUTPUT: RETVAL +SV * +gimme() + CODE: + /* facilitate tests that GIMME_V gives the right result + * in XS calls */ + int gimme = GIMME_V; + SV* sv = get_sv("XS::APItest::GIMME_V", GV_ADD); + sv_setiv_mg(sv, (IV)gimme); + RETVAL = &PL_sv_undef; + OUTPUT: + RETVAL + + MODULE = XS::APItest PACKAGE = XS::APItest::Backrefs void @@ -7432,9 +7640,9 @@ test_siphash24() if (hash32 != vectors_32[i]) { failed++; printf( "Error in 32 bit result on test vector of length %d for siphash24\n" - " have: 0x%08x\n" - " want: 0x%08x\n", - i, hash32, vectors_32[i]); + " have: 0x%08" UVxf "\n" + " want: 0x%08" UVxf "\n", + i, (UV)hash32, (UV)vectors_32[i]); } } RETVAL= failed; @@ -7653,9 +7861,9 @@ test_siphash13() if (hash32 != vectors_32[i]) { failed++; printf( "Error in 32 bit result on test vector of length %d for siphash13\n" - " have: 0x%08x\n" - " want: 0x%08x\n", - i, hash32, vectors_32[i]); + " have: 0x%08" UVxf"\n" + " want: 0x%08" UVxf"\n", + i, (UV)hash32, (UV)vectors_32[i]); } } RETVAL= failed; @@ -7663,4 +7871,103 @@ test_siphash13() OUTPUT: RETVAL -#endif +#endif /* END 64 BIT SIPHASH TESTS */ + +MODULE = XS::APItest PACKAGE = XS::APItest::BoolInternals + +UV +test_bool_internals() + CODE: + { + U32 failed = 0; + SV *true_sv_setsv = newSV(0); + SV *false_sv_setsv = newSV(0); + SV *true_sv_set_true = newSV(0); + SV *false_sv_set_false = newSV(0); + SV *true_sv_set_bool = newSV(0); + SV *false_sv_set_bool = newSV(0); + SV *sviv = newSViv(1); + SV *svpv = newSVpvs("whatever"); + TEST_EXPR(SvIOK(sviv) && !SvIandPOK(sviv)); + TEST_EXPR(SvPOK(svpv) && !SvIandPOK(svpv)); + TEST_EXPR(SvIOK(sviv) && !SvBoolFlagsOK(sviv)); + TEST_EXPR(SvPOK(svpv) && !SvBoolFlagsOK(svpv)); + sv_setsv(true_sv_setsv, &PL_sv_yes); + sv_setsv(false_sv_setsv, &PL_sv_no); + sv_set_true(true_sv_set_true); + sv_set_false(false_sv_set_false); + sv_set_bool(true_sv_set_bool, true); + sv_set_bool(false_sv_set_bool, false); + /* note that test_bool_internals_macro() SvREFCNT_dec's its arguments + * after the tests */ + failed += test_bool_internals_macro(newSVsv(&PL_sv_yes), newSVsv(&PL_sv_no)); + failed += test_bool_internals_macro(newSV_true(), newSV_false()); + failed += test_bool_internals_macro(newSVbool(1), newSVbool(0)); + failed += test_bool_internals_macro(true_sv_setsv, false_sv_setsv); + failed += test_bool_internals_macro(true_sv_set_true, false_sv_set_false); + failed += test_bool_internals_macro(true_sv_set_bool, false_sv_set_bool); + SvREFCNT_dec(sviv); + SvREFCNT_dec(svpv); + RETVAL = failed; + } + OUTPUT: + RETVAL + +MODULE = XS::APItest PACKAGE = XS::APItest::CvREFCOUNTED_ANYSV + +UV +test_CvREFCOUNTED_ANYSV() + CODE: + { + U32 failed = 0; + + /* Doesn't matter what actual function we wrap because we're never + * actually going to call it. */ + CV *cv = newXS("XS::APItest::(test-cv-1)", XS_XS__APItest__XSUB_XS_VERSION_undef, __FILE__); + SV *sv = newSV(0); + CvXSUBANY(cv).any_sv = SvREFCNT_inc(sv); + CvREFCOUNTED_ANYSV_on(cv); + TEST_EXPR(SvREFCNT(sv) == 2); + + SvREFCNT_dec((SV *)cv); + TEST_EXPR(SvREFCNT(sv) == 1); + + SvREFCNT_dec(sv); + + RETVAL = failed; + } + OUTPUT: + RETVAL + +MODULE = XS::APItest PACKAGE = XS::APItest::global_locale + +char * +switch_to_global_and_setlocale(int category, const char * locale) + CODE: + switch_to_global_locale(); + RETVAL = setlocale(category, locale); + OUTPUT: + RETVAL + +bool +sync_locale() + CODE: + RETVAL = sync_locale(); + OUTPUT: + RETVAL + +NV +newSvNV(const char * string) + CODE: + RETVAL = SvNV(newSVpv(string, 0)); + OUTPUT: + RETVAL + +MODULE = XS::APItest PACKAGE = XS::APItest::savestack + +IV +get_savestack_ix() + CODE: + RETVAL = PL_savestack_ix; + OUTPUT: + RETVAL Index: gnu/usr.bin/perl/ext/XS-APItest/core_or_not.inc =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/core_or_not.inc,v diff -u -p -a -u -p -r1.3 core_or_not.inc --- gnu/usr.bin/perl/ext/XS-APItest/core_or_not.inc 13 Feb 2019 21:15:24 -0000 1.3 +++ gnu/usr.bin/perl/ext/XS-APItest/core_or_not.inc 21 Feb 2024 15:47:02 -0000 @@ -24,7 +24,7 @@ CAT2(sv_setsv_cow_hashkey_, SUFFIX) () { sv_setsv(destination, source); - result = !!SvIsCOW(destination); + result = cBOOL(SvIsCOW(destination)); SvREFCNT_dec(source); SvREFCNT_dec(destination); Index: gnu/usr.bin/perl/ext/XS-APItest/t/boolean-thr.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/t/boolean-thr.t,v diff -u -p -a -u -p -r1.1.1.1 boolean-thr.t --- gnu/usr.bin/perl/ext/XS-APItest/t/boolean-thr.t 15 Feb 2023 01:32:59 -0000 1.1.1.1 +++ gnu/usr.bin/perl/ext/XS-APItest/t/boolean-thr.t 21 Feb 2024 15:47:02 -0000 @@ -35,4 +35,6 @@ ok(SvIsBOOL(threads->create( sub { retur ':shared variable is bool inside thread'); } +is(test_bool_internals(), 0, "Bulk test internal bool related APIs"); + done_testing; Index: gnu/usr.bin/perl/ext/XS-APItest/t/boolean.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/t/boolean.t,v diff -u -p -a -u -p -r1.1.1.1 boolean.t --- gnu/usr.bin/perl/ext/XS-APItest/t/boolean.t 15 Feb 2023 01:32:59 -0000 1.1.1.1 +++ gnu/usr.bin/perl/ext/XS-APItest/t/boolean.t 21 Feb 2024 15:47:02 -0000 @@ -43,4 +43,8 @@ use XS::APItest; # We won't test AELEM but it's likely to be the same } + +is(test_bool_internals(), 0, "Bulk test internal bool related APIs"); + + done_testing; Index: gnu/usr.bin/perl/ext/XS-APItest/t/call.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/t/call.t,v diff -u -p -a -u -p -r1.5 call.t --- gnu/usr.bin/perl/ext/XS-APItest/t/call.t 15 Feb 2023 01:36:32 -0000 1.5 +++ gnu/usr.bin/perl/ext/XS-APItest/t/call.t 21 Feb 2024 15:47:02 -0000 @@ -14,7 +14,7 @@ BEGIN { plan(538); use_ok('XS::APItest') }; - +use Config; ######################### # f(): general test sub to be called by call_sv() etc. @@ -343,8 +343,11 @@ for my $fn_type (qw(eval_pv eval_sv call # DAPM 9-Aug-04. A taint test in eval_sv() could die after setting up # a new jump level but before pushing an eval context, leading to # stack corruption +SKIP: { + skip("Your perl was built without taint support", 1) + unless $Config{taint_support}; -fresh_perl_is(<<'EOF', "x=2", { switches => ['-T', '-I../../lib'] }, 'eval_sv() taint'); + fresh_perl_is(<<'EOF', "x=2", { switches => ['-T', '-I../../lib'] }, 'eval_sv() taint'); use XS::APItest; my $x = 0; @@ -357,4 +360,4 @@ sub f { eval { my @a = sort f 2, 1; $x++}; print "x=$x\n"; EOF - +} Index: gnu/usr.bin/perl/ext/XS-APItest/t/cv_refcounted_anysv.t =================================================================== RCS file: gnu/usr.bin/perl/ext/XS-APItest/t/cv_refcounted_anysv.t diff -N gnu/usr.bin/perl/ext/XS-APItest/t/cv_refcounted_anysv.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/ext/XS-APItest/t/cv_refcounted_anysv.t 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,18 @@ +#!./perl + +use strict; +use warnings; + +use Test::More; +use XS::APItest; + +is(test_CvREFCOUNTED_ANYSV(), 0, "Bulk test internal CvREFCOUNTED_ANYSV API"); + +# TODO: A test of operating via cv_clone() +# Unfortunately that's very difficult to arrange, because cv_clone() itself +# requires the CV to have a CvPADLIST, and that macro requires !CvISXSUB. +# We could instead go via cv_clone_into() but that isn't exposed outside of +# perl core. +# I don't know how to unit-test that one. + +done_testing; Index: gnu/usr.bin/perl/ext/XS-APItest/t/locale.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/t/locale.t,v diff -u -p -a -u -p -r1.3 locale.t --- gnu/usr.bin/perl/ext/XS-APItest/t/locale.t 15 Feb 2023 01:36:32 -0000 1.3 +++ gnu/usr.bin/perl/ext/XS-APItest/t/locale.t 21 Feb 2024 15:47:02 -0000 @@ -6,30 +6,61 @@ BEGIN { use XS::APItest; use Config; -skip_all("locales not available") unless locales_enabled('LC_NUMERIC'); +skip_all("locales not available") unless locales_enabled(); my @locales = eval { find_locales( &LC_NUMERIC ) }; -skip_all("no LC_NUMERIC locales available") unless @locales; - -my $non_dot_locale; -for (@locales) { +my $comma_locale; +for my $locale (@locales) { + use POSIX; use locale; - setlocale(LC_NUMERIC, $_) or next; + setlocale(LC_NUMERIC, $locale) or next; my $in = 4.2; # avoid any constant folding bugs - if (sprintf("%g", $in) ne "4.2") { - $non_dot_locale = $_; + my $s = sprintf("%g", $in); + if ($s eq "4,2") { + $comma_locale = $locale; last; } } - SKIP: { - if ($Config{usequadmath}) { - skip "no gconvert with usequadmath", 2; + if ($Config{usequadmath}) { + skip "no gconvert with usequadmath", 2; + } + is(test_Gconvert(4.179, 2), "4.2", "Gconvert doesn't recognize underlying locale outside 'use locale'"); + use locale; + is(test_Gconvert(4.179, 2), "4.2", "Gconvert doesn't recognize underlying locale inside 'use locale'"); } - is(test_Gconvert(4.179, 2), "4.2", "Gconvert doesn't recognize underlying locale outside 'use locale'"); - use locale; - is(test_Gconvert(4.179, 2), "4.2", "Gconvert doesn't recognize underlying locale inside 'use locale'"); + +sub check_in_bounds($$$) { + my ($value, $lower, $upper) = @_; + + $value >= $lower && $value <= $upper +} + +SKIP: { + # This checks that when switching to the global locale, the service that + # Perl provides of transparently dealing with locales that have a non-dot + # radix is turned off, but gets turned on again after a sync_locale(); + + skip "no locale with a comma radix available", 5 unless $comma_locale; + + my $global_locale = switch_to_global_and_setlocale(LC_NUMERIC, + $comma_locale); + # Can't do a compare of $global_locale and $comma_locale because what the + # system returns may be an alias. ALl we can do is test for + # success/failure + ok($global_locale, "Successfully switched to $comma_locale"); + is(newSvNV("4.888"), 4, "dot not recognized in global comma locale for SvNV"); + + no warnings 'numeric'; # Otherwise get "Argument isn't numeric in + # subroutine entry" + + is(check_in_bounds(newSvNV("4,888"), 4.88, 4.89), 1, + "comma recognized in global comma locale for SvNV"); + isnt(sync_locale, 0, "sync_locale() returns that was in the global locale"); + + is(check_in_bounds(newSvNV("4.888"), 4.88, 4.89), 1, + "dot recognized in perl-controlled comma locale for SvNV"); } my %correct_C_responses = ( @@ -98,7 +129,7 @@ open my $fh, "<", $hdr; $|=1; SKIP: { - skip "No LC_ALL", 1 unless find_locales( &LC_ALL ); + skip "No LC_ALL", 1 unless locales_enabled('LC_ALL'); use POSIX; setlocale(LC_ALL, "C"); @@ -118,7 +149,7 @@ SKIP: { chomp; next unless / - \d+ $ /x; s/ ^ \# \s* define \s*//x; - m/ (.*) \ (.*) /x; + m/ (\S+) \s+ (.*) /x; $items{$1} = ($has_nl_langinfo) ? $1 # Yields 'YESSTR' : $2; # Yields -54 @@ -144,6 +175,27 @@ SKIP: { else { fail("Returned undef for $formal_item"); } + } + } +} + +@locales = eval { find_locales( &LC_TIME ) }; + +SKIP: { + skip("no LC_TIME locales available") unless @locales; + + for my $locale (@locales) { + use POSIX 'strftime'; + use locale; + setlocale(LC_TIME, $locale) or next; + + # This isn't guaranteed to find failing locales, as it is impractical + # to test all possible dates. But it is much better than no test at + # all + if (strftime('%c', 0, 0, , 12, 18, 11, 87) eq "") { + fail('strftime() built-in expansion factor works for all locales'); + diag("Failed for locale $locale"); + last; } } } Index: gnu/usr.bin/perl/ext/XS-APItest/t/magic.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/t/magic.t,v diff -u -p -a -u -p -r1.4 magic.t --- gnu/usr.bin/perl/ext/XS-APItest/t/magic.t 15 Feb 2023 01:36:32 -0000 1.4 +++ gnu/usr.bin/perl/ext/XS-APItest/t/magic.t 21 Feb 2024 15:47:02 -0000 @@ -4,7 +4,7 @@ use Test::More; use XS::APItest; -my $sv = bless {}, 'Moo'; +our $sv = 'Moo'; my $foo = 'affe'; my $bar = 'tiger'; @@ -15,6 +15,13 @@ sv_magic_foo($sv, $foo); is mg_find_foo($sv), $foo, 'foo magic attached'; ok !mg_find_bar($sv), '... but still no bar magic'; +{ + local $sv = 'Emu'; + sv_magic_foo($sv, $foo); + is mg_find_foo($sv), $foo, 'foo magic attached to localized value'; + ok !mg_find_bar($sv), '... but still no bar magic to localized value'; +} + sv_magic_bar($sv, $bar); is mg_find_foo($sv), $foo, 'foo magic still attached'; is mg_find_bar($sv), $bar, '... and bar magic is there too'; @@ -27,6 +34,14 @@ sv_unmagic_bar($sv); ok !mg_find_foo($sv), 'foo magic still removed'; ok !mg_find_bar($sv), '... and bar magic is removed too'; +sv_magic_baz($sv, $bar); +is mg_find_baz($sv), $bar, 'baz magic attached'; +ok !mg_find_bar($sv), ''; +{ + local $sv = 'Emu'; + ok !mg_find_baz($sv), ''; +} + is(test_get_vtbl(), 0, 'get_vtbl(-1) returns NULL'); eval { sv_magic(\!0, $foo) }; @@ -59,6 +74,61 @@ is $@, "", 'PERL_MAGIC_ext is permitted $i = 0; %h = qw(); is($i, 0, "hash () with set magic"); +} + +{ + # check if set magic triggered by av_store() via aassign results in + # unreferenced scalars being freed. IOW, results in a double store + # without a corresponding refcount bump. If things work properly this + # should not warn. If there is an issue it will. + my @warn; + local $SIG{__WARN__}= sub { push @warn, $_[0] }; + { + my (@a, $i); + sv_magic_myset_dies(\@a, $i); + eval { + $i = 0; + @a = (1); + }; + } + is(0+@warn, 0, + "If AV set magic dies via aassign it should not warn about double free"); + @warn = (); + { + my (@a, $i, $j); + sv_magic_myset_dies(\@a, $i); + eval { + $j = "blorp"; + my_av_store(\@a,0,$j); + }; + + # Evaluate this boolean as a separate statement, so the two + # temporary \ refs are freed before we start comparing reference + # counts + my $is_same_SV = \$a[0] == \$j; + + if ($is_same_SV) { + # in this case we expect to have 2 refcounts, + # one from $a[0] and one from $j itself. + is( sv_refcnt($j), 2, + "\$a[0] is \$j, so refcount(\$j) should be 2"); + } else { + # Note this branch isn't exercised. Whether by design + # or not. I leave it here because it is a possible valid + # outcome. It is marked TODO so if we start going down + # this path we do so knowingly. + diag "av_store has changed behavior - please review this test"; + TODO:{ + local $TODO = "av_store bug stores even if it dies during magic"; + # in this case we expect to have only 1 refcount, + # from $j itself. + is( sv_refcnt($j), 1, + "\$a[0] is not \$j, so refcount(\$j) should be 1"); + } + } + } + is(0+@warn, 0, + "AV set magic that dies via av_store should not warn about double free"); } done_testing; Index: gnu/usr.bin/perl/ext/XS-APItest/t/mortal_destructor.t =================================================================== RCS file: gnu/usr.bin/perl/ext/XS-APItest/t/mortal_destructor.t diff -N gnu/usr.bin/perl/ext/XS-APItest/t/mortal_destructor.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/ext/XS-APItest/t/mortal_destructor.t 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,30 @@ +use XS::APItest; +use Test::More tests => 1; +use Data::Dumper; +my $warnings = ""; +$SIG{__WARN__} = sub { $warnings .= $_[0]; }; + +warn "Before test_mortal_destructor_sv\n"; +test_mortal_destructor_sv(sub { warn "in perl callback: ", $_[0],"\n" }, {}); +warn "After test_mortal_destructor_sv\n"; + +warn "Before test_mortal_destructor_av\n"; +test_mortal_destructor_av(sub { warn "in perl callback: @_\n" }, ["a","b","c"]); +warn "After test_mortal_destructor_av\n"; + +warn "Before test_mortal_destructor_x\n"; +test_mortal_svfunc_x("this is an argument"); +warn "After test_mortal_destructor_x\n"; + +$warnings=~s/0x[A-Fa-f0-9]+/0xDEADBEEF/g; +is($warnings, <<'EXPECT'); +Before test_mortal_destructor_sv +in perl callback: HASH(0xDEADBEEF) +After test_mortal_destructor_sv +Before test_mortal_destructor_av +in perl callback: a b c +After test_mortal_destructor_av +Before test_mortal_destructor_x +In destruct_test: this is an argument +After test_mortal_destructor_x +EXPECT Index: gnu/usr.bin/perl/ext/XS-APItest/t/newAV.t =================================================================== RCS file: gnu/usr.bin/perl/ext/XS-APItest/t/newAV.t diff -N gnu/usr.bin/perl/ext/XS-APItest/t/newAV.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/ext/XS-APItest/t/newAV.t 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,49 @@ +#!perl + +use v5.36; +use Test::More; + +use XS::APItest; + +my $plain_av = [1,2,3]; +is_deeply newAVav($plain_av), [1,2,3], 'newAVav on plain array'; + +newAVav($plain_av)->[0]++; +is $plain_av->[0], 1, 'newAVav returns fresh storage'; + +{ + package TiedArray { + sub TIEARRAY { return bless [], "TiedArray"; } + + sub FETCHSIZE { return 3; } + sub FETCH { return $_[1] + 4; } + } + tie my @tied_av, "TiedArray"; + + is_deeply newAVav(\@tied_av), [4,5,6], 'newAVav on tied array'; +} + +# Just use one key at first so order doesn't matter +my $plain_hv = {key => "value"}; +is_deeply newAVhv($plain_hv), [key => "value"], 'newAVhv on plain hash'; + +newAVhv($plain_hv)->[1] .= "X"; +is $plain_hv->{key}, "value", 'newAVhv returns fresh storage'; + +is_deeply [ sort +newAVhv({a => 1, b => 2, c => 3})->@* ], [ 1, 2, 3, "a", "b", "c" ], + 'newAVhv on multiple keys'; + +{ + package TiedHash { + sub TIEHASH { return bless [], "TiedHash"; } + + sub FETCH { return $_[1] eq "k" ? "v" : undef } + sub FIRSTKEY { return "k" } + sub NEXTKEY { return; } + } + tie my %tied_hv, "TiedHash"; + + is_deeply newAVhv(\%tied_hv), [k => "v"], 'newAVhv on tied hash'; +} + +done_testing; Index: gnu/usr.bin/perl/ext/XS-APItest/t/overload.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/t/overload.t,v diff -u -p -a -u -p -r1.1.1.1 overload.t --- gnu/usr.bin/perl/ext/XS-APItest/t/overload.t 25 Mar 2013 20:08:47 -0000 1.1.1.1 +++ gnu/usr.bin/perl/ext/XS-APItest/t/overload.t 21 Feb 2024 15:47:02 -0000 @@ -88,4 +88,65 @@ while (my ($type, $enum) = each %types) } } +{ + package String; + use overload q("")=>sub { return $_[0]->val }; + sub is_string_amg { 1 } + sub val { "string" } +} +{ + package Num; + sub is_string_amg { 1 } + use overload q(0+) => sub { return $_[0]->val }; + sub val { 12345 }; +} +{ + package NumNoFallback; + sub is_string_amg { undef } + use overload q(0+) => sub { return $_[0]->val }, fallback=>0; + sub val { 1234 }; +} +{ + package NumWithFallback; + sub is_string_amg { 1 } + use overload q(0+)=>sub { return $_[0]->val }, fallback=>1; + sub val { 123456 }; +} +{ + package NoMethod; + use overload q(nomethod)=> sub { $_[0]->val }; + sub is_string_amg { 1 } + sub val { return(ref($_[0])||$_[0]); }; +} +{ + package NoOverload; + sub is_string_amg { 0 } +} + + +{ + # these should be false + + my $string_amg = 0x0a; + my $unary= 8; + + foreach my $class ( + "String", + "Num", + "NumNoFallback", + "NumWithFallback", + "NoMethod", + "NoOverload", + ) { + my $item= bless {}, $class; + my $str= eval { "$item" }; + my $std_str= overload::StrVal($item); + my $ok= does_amagic_apply($item, $string_amg, $unary); + my $want = $class->is_string_amg; + is(0+$ok, $want//0, "amagic_applies($class,string_amg,AMGf_unary) works as expected"); + is($str, $want ? $class->val : defined ($want) ? $std_str : undef, + "Stringified var matches amagic_applies()"); + } +} + done_testing; Index: gnu/usr.bin/perl/ext/XS-APItest/t/savestack.t =================================================================== RCS file: gnu/usr.bin/perl/ext/XS-APItest/t/savestack.t diff -N gnu/usr.bin/perl/ext/XS-APItest/t/savestack.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/ext/XS-APItest/t/savestack.t 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,37 @@ +#!perl -w + +use strict; +use warnings; +use Test::More; + +use XS::APItest; + +my %ix; +sub showix { + diag join ", ", map { $ix{$_} > 1 ? "$_ x $ix{$_}" : $_ } sort { $a <=> $b } keys %ix; +} +my $len = 100; +my $str= "a" x $len; +my $pat= join "|", map { "a" x $_ } 1 .. $len; + +$str=~/^($pat)(??{ $ix{get_savestack_ix()}++; "(?!)" })/; +my $keys= 0+keys %ix; +cmp_ok($keys,">",0, "We expect at least one key in %ix for (??{ ... }) test"); +cmp_ok($keys,"<=", 2, "We expect no more than two keys in %ix if (??{ ... }) does not leak") + or showix(); + +%ix= (); +$str=~/^($pat)(?{ $ix{my $x=get_savestack_ix()}++; })(?!)/; +$keys= 0+keys %ix; +cmp_ok($keys,">",0, "We expect at least one key in %ix for (?{ ... }) test"); +cmp_ok($keys, "<=", 2, "We expect no more than two keys in %ix if (?{ ... }) does not leak") + or showix(); + +%ix= (); +$str=~/^($pat)(?(?{ $ix{my $x=get_savestack_ix()}++; })x|y)(?!)/; +$keys= 0+keys %ix; +cmp_ok($keys,">",0, "We expect at least one key in %ix for (?(?{ ... })yes|no) test"); +cmp_ok($keys, "<=", 2, "We expect no more than two keys in %ix if (?(?{ ... })yes|no) does not leak") + or showix(); + +done_testing(); Index: gnu/usr.bin/perl/ext/XS-APItest/t/svcatpvf.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/t/svcatpvf.t,v diff -u -p -a -u -p -r1.2 svcatpvf.t --- gnu/usr.bin/perl/ext/XS-APItest/t/svcatpvf.t 24 May 2019 21:33:55 -0000 1.2 +++ gnu/usr.bin/perl/ext/XS-APItest/t/svcatpvf.t 21 Feb 2024 15:47:02 -0000 @@ -1,7 +1,7 @@ use strict; use warnings; -use Test::More tests => 4; +use Test::More tests => 6; use XS::APItest; @@ -19,3 +19,13 @@ for my $case (@cases) { like($exn, qr/\b\QCannot yet reorder sv_vcatpvfn() arguments from va_list\E\b/, "explicit $what index forbidden in va_list arguments"); } + +# these actually test newSVpvf() but it is the same underlying logic. +is(test_HvNAMEf(bless {}, "Whatever::You::Like"), + "class='Whatever::You::Like'"); +is(test_HvNAMEf_QUOTEDPREFIX(bless {}, "x" x 1000), + 'class="xxxxxxxxxxxxxxxxxxxxxxxxxx'. + 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'. + 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..."xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'. + 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'. + 'xxxxxxxxxxxxxxxxxxxxx"'); Index: gnu/usr.bin/perl/ext/XS-APItest/t/svpv.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/t/svpv.t,v diff -u -p -a -u -p -r1.1.1.3 svpv.t --- gnu/usr.bin/perl/ext/XS-APItest/t/svpv.t 1 Mar 2021 23:15:55 -0000 1.1.1.3 +++ gnu/usr.bin/perl/ext/XS-APItest/t/svpv.t 21 Feb 2024 15:47:02 -0000 @@ -2,11 +2,11 @@ BEGIN { require 'charset_tools.pl'; } -use Test::More tests => 35; +use Test::More tests => 43; use XS::APItest; -for my $func ('SvPVbyte', 'SvPVutf8') { +for my $func ('SvPVbyte_nolen', 'SvPVutf8_nolen') { $g = *glob; $r = \1; is &$func($g), '*main::glob', "$func(\$glob_copy)"; @@ -30,10 +30,14 @@ tie my $scalar_bin, 'TieScalarCounter', do { my $fetch = $scalar_bin }; is tied($scalar_bin)->{fetch}, 1; is tied($scalar_bin)->{store}, 0; -is SvPVutf8_nomg($scalar_bin), $individual_B6_utf8_bytes; +my $len; +is SvPVutf8_nomg($scalar_bin, $len), $individual_B6_utf8_bytes; +is $len, length($individual_B6_utf8_bytes), "check len set by SvPVutf8_nomg"; is tied($scalar_bin)->{fetch}, 1; is tied($scalar_bin)->{store}, 0; -is SvPVbyte_nomg($scalar_bin), $B6; +undef $len; +is SvPVbyte_nomg($scalar_bin, $len), $B6; +is $len, length($B6), "check len set by SvPVbyte_nomg"; is tied($scalar_bin)->{fetch}, 1; is tied($scalar_bin)->{store}, 0; @@ -43,23 +47,34 @@ tie my $scalar_uni, 'TieScalarCounter', do { my $fetch = $scalar_uni }; is tied($scalar_uni)->{fetch}, 1; is tied($scalar_uni)->{store}, 0; -is SvPVbyte_nomg($scalar_uni), $B6; +undef $len; +is SvPVbyte_nomg($scalar_uni, $len), $B6; +is $len, length($B6), "cheeck len set by SvPVbyte_nomg"; is tied($scalar_uni)->{fetch}, 1; is tied($scalar_uni)->{store}, 0; -is SvPVutf8_nomg($scalar_uni), $individual_B6_utf8_bytes; +undef $len; +is SvPVutf8_nomg($scalar_uni, $len), $individual_B6_utf8_bytes; +is $len, length($individual_B6_utf8_bytes), "check len set by SvPVutf8_nomg"; is tied($scalar_uni)->{fetch}, 1; is tied($scalar_uni)->{store}, 0; -eval 'SvPVbyte(*{chr 256})'; -like $@, qr/^Wide character/, 'SvPVbyte fails on Unicode glob'; +undef $len; +is SvPVutf8($scalar_bin, $len), $individual_B6_utf8_bytes; +is $len, length $individual_B6_utf8_bytes; +undef $len; +is SvPVutf8($scalar_uni, $len), $individual_B6_utf8_bytes; +is $len, length $individual_B6_utf8_bytes, "check len set by SvPVutf8"; + +eval 'SvPVbyte_nolen(*{chr 256})'; +like $@, qr/^Wide character/, 'SvPVbyte_nolen fails on Unicode glob'; package r { use overload '""' => sub { substr "\x{100}\xff", -1 } } -is SvPVbyte(bless [], r::), "\xff", - 'SvPVbyte on ref returning downgradable utf8 string'; +is SvPVbyte_nolen(bless [], r::), "\xff", + 'SvPVbyte_nolen on ref returning downgradable utf8 string'; sub TIESCALAR { bless \(my $thing = pop), shift } sub FETCH { ${ +shift } } tie $tyre, main => bless [], r::; -is SvPVbyte($tyre), "\xff", +is SvPVbyte_nolen($tyre), "\xff", 'SvPVbyte on tie returning ref that returns downgradable utf8 string'; package TieScalarCounter; Index: gnu/usr.bin/perl/ext/XS-APItest/t/svpv_magic.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/t/svpv_magic.t,v diff -u -p -a -u -p -r1.2 svpv_magic.t --- gnu/usr.bin/perl/ext/XS-APItest/t/svpv_magic.t 5 Feb 2017 00:32:14 -0000 1.2 +++ gnu/usr.bin/perl/ext/XS-APItest/t/svpv_magic.t 21 Feb 2024 15:47:02 -0000 @@ -33,7 +33,7 @@ is(eval { XS::APItest::first_byte($1) } sub TIESCALAR { bless [], shift } sub FETCH { ++$f; *{chr utf8::unicode_to_native(255)} } tie $t, "main"; -is SvPVutf8($t), "*main::" . byte_utf8a_to_utf8n("\xc3\xbf"), +is SvPVutf8_nolen($t), "*main::" . byte_utf8a_to_utf8n("\xc3\xbf"), 'SvPVutf8 works with get-magic changing the SV type'; is $f, 1, 'SvPVutf8 calls get-magic once'; @@ -44,7 +44,7 @@ package t { } tie $t, "t"; undef $f; -is SvPVutf8($t), byte_utf8a_to_utf8n("\xc3\xbf"), +is SvPVutf8_nolen($t), byte_utf8a_to_utf8n("\xc3\xbf"), 'SvPVutf8 works with get-magic downgrading the SV'; is $f, 1, 'SvPVutf8 calls get-magic once'; ()="$t"; Index: gnu/usr.bin/perl/ext/XS-APItest/t/utf8.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/XS-APItest/t/utf8.t,v diff -u -p -a -u -p -r1.4 utf8.t --- gnu/usr.bin/perl/ext/XS-APItest/t/utf8.t 15 Feb 2023 01:36:32 -0000 1.4 +++ gnu/usr.bin/perl/ext/XS-APItest/t/utf8.t 21 Feb 2024 15:47:02 -0000 @@ -1183,10 +1183,9 @@ for my $restriction (sort keys %restrict SKIP: { - isASCII - or skip "These tests probably break on non-ASCII", 1; my $simple = join "", "A" .. "J"; - my $utf_ch = "\x{7fffffff}"; + my $utf_ch = "\x{3f_ffff}"; # Highest code point that is same number + # of bytes on ASCII and EBCDIC: 5 utf8::encode($utf_ch); my $utf_ch_len = length $utf_ch; note "utf_ch_len $utf_ch_len"; @@ -1195,10 +1194,9 @@ SKIP: # $bad_end ends with a start byte and a single continuation my $bad_end = substr($utf, 0, length($utf)-$utf_ch_len+2); - # WARNING: all offsets are *byte* offsets my @hop_tests = - ( - # string s off expected name + ( # start byte chars + # string in 'string' to hop expected name [ $simple, 0, 5, 5, "simple in range, forward" ], [ $simple, 10, -5, 5, "simple in range, backward" ], [ $simple, 5, 10, 10, "simple out of range, forward" ], @@ -1209,9 +1207,10 @@ SKIP: [ $utf, $utf_ch_len * 5, -4, $utf_ch_len, "utf in range b, backward" ], [ $utf, $utf_ch_len * 5, 6, length($utf), "utf out of range, forward" ], [ $utf, $utf_ch_len * 5, -6, 0, "utf out of range, backward" ], - [ $bad_start, 0, 1, 1, "bad start, forward 1 from 0" ], - [ $bad_start, 0, $utf_ch_len-1, $utf_ch_len-1, "bad start, forward ch_len-1 from 0" ], - [ $bad_start, 0, $utf_ch_len, $utf_ch_len*2-1, "bad start, forward ch_len from 0" ], + [ $bad_start, 0, 1, $utf_ch_len-1, "bad start, forward 1 from 0" ], + [ $bad_start, 0, 5, 5 * $utf_ch_len-1, "bad start, forward 5 chars from 0" ], + [ $bad_start, 0, 9, length($bad_start)-$utf_ch_len, "bad start, forward 9 chars from 0" ], + [ $bad_start, 0, 10, length $bad_start, "bad start, forward 10 chars from 0" ], [ $bad_start, $utf_ch_len-1, -1, 0, "bad start, back 1 from first start byte" ], [ $bad_start, $utf_ch_len-2, -1, 0, "bad start, back 1 from before first start byte" ], [ $bad_start, 0, -1, 0, "bad start, back 1 from 0" ], @@ -1221,8 +1220,8 @@ SKIP: ); for my $test (@hop_tests) { - my ($str, $s_off, $off, $want, $name) = @$test; - my $result = test_utf8_hop_safe($str, $s_off, $off); + my ($str, $s_off, $hop, $want, $name) = @$test; + my $result = test_utf8_hop_safe($str, $s_off, $hop); is($result, $want, "utf8_hop_safe: $name"); } } Index: gnu/usr.bin/perl/ext/attributes/attributes.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/attributes/attributes.pm,v diff -u -p -a -u -p -r1.4 attributes.pm --- gnu/usr.bin/perl/ext/attributes/attributes.pm 15 Feb 2023 01:36:33 -0000 1.4 +++ gnu/usr.bin/perl/ext/attributes/attributes.pm 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ package attributes; -our $VERSION = 0.34; +our $VERSION = 0.35; @EXPORT_OK = qw(get reftype); @EXPORT = (); Index: gnu/usr.bin/perl/ext/attributes/attributes.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/attributes/attributes.xs,v diff -u -p -a -u -p -r1.4 attributes.xs --- gnu/usr.bin/perl/ext/attributes/attributes.xs 15 Feb 2023 01:36:33 -0000 1.4 +++ gnu/usr.bin/perl/ext/attributes/attributes.xs 21 Feb 2024 15:47:02 -0000 @@ -78,9 +78,9 @@ modify_SV_attributes(pTHX_ SV *sv, SV ** case 'h': if (memEQs(name, 6, "method")) { if (negated) - CvFLAGS(MUTABLE_CV(sv)) &= ~CVf_METHOD; + CvFLAGS(MUTABLE_CV(sv)) &= ~CVf_NOWARN_AMBIGUOUS; else - CvFLAGS(MUTABLE_CV(sv)) |= CVf_METHOD; + CvFLAGS(MUTABLE_CV(sv)) |= CVf_NOWARN_AMBIGUOUS; continue; } break; @@ -173,7 +173,7 @@ usage: cvflags = CvFLAGS((const CV *)sv); if (cvflags & CVf_LVALUE) XPUSHs(newSVpvs_flags("lvalue", SVs_TEMP)); - if (cvflags & CVf_METHOD) + if (cvflags & CVf_NOWARN_AMBIGUOUS) XPUSHs(newSVpvs_flags("method", SVs_TEMP)); break; default: Index: gnu/usr.bin/perl/ext/mro/mro.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/mro/mro.pm,v diff -u -p -a -u -p -r1.5 mro.pm --- gnu/usr.bin/perl/ext/mro/mro.pm 15 Feb 2023 01:36:33 -0000 1.5 +++ gnu/usr.bin/perl/ext/mro/mro.pm 21 Feb 2024 15:47:02 -0000 @@ -12,7 +12,7 @@ use warnings; # mro.pm versions < 1.00 reserved for MRO::Compat # for partial back-compat to 5.[68].x -our $VERSION = '1.26'; +our $VERSION = '1.28'; require XSLoader; XSLoader::load('mro'); Index: gnu/usr.bin/perl/ext/mro/mro.xs =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/mro/mro.xs,v diff -u -p -a -u -p -r1.4 mro.xs --- gnu/usr.bin/perl/ext/mro/mro.xs 15 Feb 2023 01:36:33 -0000 1.4 +++ gnu/usr.bin/perl/ext/mro/mro.xs 21 Feb 2024 15:47:02 -0000 @@ -14,7 +14,8 @@ static const struct mro_alg c3_alg = =for apidoc mro_get_linear_isa_c3 Returns the C3 linearization of C<@ISA> -the given stash. The return value is a read-only AV*. +the given stash. The return value is a read-only AV* +whose values are string SVs giving class names. C should be 0 (it is used internally in this function's recursion). @@ -504,7 +505,6 @@ mro__nextcan(...) cxix = __dopoptosub_at(ccstack, cxix); for (;;) { GV* cvgv; - STRLEN fq_subname_len; /* we may be in a higher stacklevel, so dig down deeper */ while (cxix < 0) { @@ -545,19 +545,14 @@ mro__nextcan(...) if(SvPOK(sv)) { fq_subname = SvPVX(sv); - fq_subname_len = SvCUR(sv); - - subname_utf8 = SvUTF8(sv) ? 1 : 0; subname = strrchr(fq_subname, ':'); - } else { - subname = NULL; - } - + } if(!subname) Perl_croak(aTHX_ "next::method/next::can/maybe::next::method cannot find enclosing method"); + subname_utf8 = SvUTF8(sv) ? 1 : 0; subname++; - subname_len = fq_subname_len - (subname - fq_subname); + subname_len = SvCUR(sv) - (subname - fq_subname); if(memEQs(subname, subname_len, "__ANON__")) { cxix = __dopoptosub_at(ccstack, cxix - 1); continue; Index: gnu/usr.bin/perl/ext/re/Makefile.PL =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/re/Makefile.PL,v diff -u -p -a -u -p -r1.3 Makefile.PL --- gnu/usr.bin/perl/ext/re/Makefile.PL 1 Mar 2021 23:19:57 -0000 1.3 +++ gnu/usr.bin/perl/ext/re/Makefile.PL 21 Feb 2024 15:47:02 -0000 @@ -1,8 +1,31 @@ +use strict; +use warnings; use ExtUtils::MakeMaker; use File::Spec; use Config; +# [ src => @deps ] +our @files = ( + # compiler files ######################################## + ['regcomp.c' => 'dquote.c', 'invlist_inline.h' ], + ['regcomp_invlist.c' => 'invlist_inline.h' ], + ['regcomp_study.c' ], + ['regcomp_trie.c' ], + ['regcomp_debug.c' ], + # execution engine files ################################ + ['regexec.c' => 'invlist_inline.h' ], + # misc files ############################################ + ['dquote.c' ], + ['invlist_inline.h' ], + ######################################################### +); -my $object = 're_exec$(OBJ_EXT) re_comp$(OBJ_EXT) re$(OBJ_EXT)'; +my @objects = 're$(OBJ_EXT)'; +foreach my $tuple (@files) { + my $src_file = $tuple->[0]; + if ($src_file=~s/reg/re_/ and $src_file=~s/\.c/\$(OBJ_EXT)/) { + push @objects, $src_file; + } +} my $defines = '-DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT'; @@ -15,45 +38,41 @@ WriteMakefile( @libs ? ( 'LIBS' => [ join(" ", map { "-l$_" } @libs) ] ) : (), VERSION_FROM => 're.pm', XSPROTOARG => '-noprototypes', - OBJECT => $object, + OBJECT => "@objects", DEFINE => $defines, clean => { FILES => '*$(OBJ_EXT) invlist_inline.h *.c ../../lib/re.pm' }, ); package MY; - sub upupfile { File::Spec->catfile(File::Spec->updir, File::Spec->updir, $_[0]); } sub postamble { - my $regcomp_c = upupfile('regcomp.c'); - my $regexec_c = upupfile('regexec.c'); - my $dquote_c = upupfile('dquote.c'); - my $invlist_inline_h = upupfile('invlist_inline.h'); + my $postamble = ""; + foreach my $tuple (@::files) { + my ($file, @deps) = @$tuple; + my $src_file = upupfile($file); + my $target = $file; + $target =~ s/^reg/re_/; + $postamble .= < qw(DUMP FLAGS); +our $count; +my $code= '(?{$count++})'; +my @p= ( + qr/(foo)(?1)?/, + qr/\Gfoo/, + qr/.*foo/, + qr/^foo/, + qr/(foo(*THEN)bar|food)/, + qr/a.*b.*/, + qr/a{1,4}\Gfoo/, + qr/a+/, + do { use re 'eval'; qr/a$code/}, +); + +print STDERR "-OK-\n"; Index: gnu/usr.bin/perl/ext/re/t/intflags.t =================================================================== RCS file: gnu/usr.bin/perl/ext/re/t/intflags.t diff -N gnu/usr.bin/perl/ext/re/t/intflags.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/ext/re/t/intflags.t 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,25 @@ +#!./perl + +BEGIN { + require Config; + if (($Config::Config{'extensions'} !~ /\bre\b/) ){ + print "1..0 # Skip -- Perl configured without re module\n"; + exit 0; + } +} + +use strict; + +# must use a BEGIN or the prototypes wont be respected meaning +# tests could pass that shouldn't. +BEGIN { require "../../t/test.pl"; } +my $out = runperl(progfile => "t/intflags.pl", stderr => 1 ); +like($out,qr/-OK-\n/, "intflags.pl ran to completion"); + +my %seen; +foreach my $line (split /\n/, $out) { + $line=~s/^r->intflags:\s+// or next; + length($_) and $seen{$_}++ for split /\s+/, $line; +} +is(0+keys %seen,14); +done_testing; Index: gnu/usr.bin/perl/ext/re/t/lexical_debug.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/ext/re/t/lexical_debug.t,v diff -u -p -a -u -p -r1.2 lexical_debug.t --- gnu/usr.bin/perl/ext/re/t/lexical_debug.t 5 Feb 2017 00:32:14 -0000 1.2 +++ gnu/usr.bin/perl/ext/re/t/lexical_debug.t 21 Feb 2024 15:47:02 -0000 @@ -11,7 +11,7 @@ BEGIN { use strict; # must use a BEGIN or the prototypes wont be respected meaning - # tests could pass that shouldn't +# tests could pass that shouldn't BEGIN { require "../../t/test.pl"; } my $out = runperl(progfile => "t/lexical_debug.pl", stderr => 1 ); Index: gnu/usr.bin/perl/hints/README.hints =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/README.hints,v diff -u -p -a -u -p -r1.11 README.hints --- gnu/usr.bin/perl/hints/README.hints 1 Mar 2021 23:19:57 -0000 1.11 +++ gnu/usr.bin/perl/hints/README.hints 21 Feb 2024 15:47:02 -0000 @@ -1,3 +1,5 @@ +# vim: syntax=pod + =head1 NAME README.hints - hint files used by Configure Index: gnu/usr.bin/perl/hints/aix.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/aix.sh,v diff -u -p -a -u -p -r1.18 aix.sh --- gnu/usr.bin/perl/hints/aix.sh 15 Feb 2023 01:36:33 -0000 1.18 +++ gnu/usr.bin/perl/hints/aix.sh 21 Feb 2024 15:47:02 -0000 @@ -670,7 +670,7 @@ EOF $cc -q64 -qlongdouble -o fmodl$$ fmodl$$.c -lm case `./fmodl$$` in 2147483648) - echo "The -q64 did the trick, will use it." >& 4 + echo "The -q64 did the trick, will use it." >&4 ccflags="`echo $ccflags | sed -e 's@-q32@@g'`" ldflags="`echo $ldflags | sed -e 's@-q32@@g'`" ccflags="$ccflags -q64" Index: gnu/usr.bin/perl/hints/catamount.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/catamount.sh,v diff -u -p -a -u -p -r1.14 catamount.sh --- gnu/usr.bin/perl/hints/catamount.sh 23 Dec 2023 21:02:21 -0000 1.14 +++ gnu/usr.bin/perl/hints/catamount.sh 21 Feb 2024 15:47:02 -0000 @@ -31,11 +31,11 @@ # mkdir -p /opt/perl-catamount # mkdir -p /opt/perl-catamount/include # mkdir -p /opt/perl-catamount/lib -# mkdir -p /opt/perl-catamount/lib/perl5/5.36.3 +# mkdir -p /opt/perl-catamount/lib/perl5/5.38.2 # mkdir -p /opt/perl-catamount/bin # cp *.h /opt/perl-catamount/include # cp libperl.a /opt/perl-catamount/lib -# cp -pr lib/* /opt/perl-catamount/lib/perl5/5.36.3 +# cp -pr lib/* /opt/perl-catamount/lib/perl5/5.38.2 # cp miniperl perl run.sh cc.sh /opt/perl-catamount/lib # # With the headers and the libperl.a you can embed Perl to your Catamount Index: gnu/usr.bin/perl/hints/cygwin.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/cygwin.sh,v diff -u -p -a -u -p -r1.1.1.11 cygwin.sh --- gnu/usr.bin/perl/hints/cygwin.sh 15 Feb 2023 01:33:10 -0000 1.1.1.11 +++ gnu/usr.bin/perl/hints/cygwin.sh 21 Feb 2024 15:47:02 -0000 @@ -25,13 +25,22 @@ libswanted=`echo " $libswanted " | sed - libswanted=`echo " $libswanted " | sed -e 's/ m / /g'` # - eliminate -lutil, symbols are all in libcygwin.a libswanted=`echo " $libswanted " | sed -e 's/ util / /g'` +test -z "$ignore_versioned_solibs" && ignore_versioned_solibs='y' +test -z "$usenm" && usenm='no' +test -z "$libc" && libc='/usr/lib/libcygwin.a' +test -z "$loclibpth" && loclibpth=' ' +test -z "$glibpth" && glibpth=' ' +test -z "$plibpth" && plibpth=' ' +test -z "$libpth" && libpth=' ' +PATH='.:/usr/bin/' # - add libgdbm_compat $libswanted libswanted="$libswanted gdbm_compat" test -z "$optimize" && optimize='-O3' man3ext='3pm' test -z "$use64bitint" && use64bitint='define' test -z "$useithreads" && useithreads='define' -ccflags="$ccflags -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE" +test -z "$usemymalloc" && usemymalloc='undef' +ccflags="$ccflags -U__STRICT_ANSI__ -D_GNU_SOURCE" # - otherwise i686-cygwin archname='cygwin' @@ -86,3 +95,6 @@ lddlflags="$lddlflags $ldflags" # it still doesn't work, despite our probes looking good: # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64697 d_thread_local=undef + +# Broken: https://sourceware.org/pipermail/cygwin/2022-August/252043.html */ +d_newlocale=undef Index: gnu/usr.bin/perl/hints/darwin.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/darwin.sh,v diff -u -p -a -u -p -r1.7 darwin.sh --- gnu/usr.bin/perl/hints/darwin.sh 15 Feb 2023 01:36:33 -0000 1.7 +++ gnu/usr.bin/perl/hints/darwin.sh 21 Feb 2024 15:47:02 -0000 @@ -357,6 +357,9 @@ EOM esac fi + # The OS is buggy with respect to this. + ccflags="$ccflags -DNO_POSIX_2008_LOCALE" + lddlflags="${ldflags} -bundle -undefined dynamic_lookup" ;; esac @@ -508,16 +511,6 @@ esac # makefile in the same place. Since Darwin uses GNU make, this dodges # the problem. firstmakefile=GNUmakefile; - -# Parts of the system call setenv(), in particular in an atfork handler. -# This causes problems when the child tries to clean up environ[], so -# let libc manage environ[]. -cat >> config.over <<'EOOVER' -if test "$d_unsetenv" = "$define" -a \ - `expr "$ccflags" : '.*-DPERL_USE_SAFE_PUTENV'` -eq 0; then - ccflags="$ccflags -DPERL_USE_SAFE_PUTENV" -fi -EOOVER # if you use a newer toolchain before OS X 10.9 these functions may be # incorrectly detected, so disable them Index: gnu/usr.bin/perl/hints/dec_osf.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/dec_osf.sh,v diff -u -p -a -u -p -r1.15 dec_osf.sh --- gnu/usr.bin/perl/hints/dec_osf.sh 30 Dec 2019 02:13:54 -0000 1.15 +++ gnu/usr.bin/perl/hints/dec_osf.sh 21 Feb 2024 15:47:02 -0000 @@ -487,7 +487,7 @@ esac for p in $loclibpth do if test -d $p; then - echo "Appending $p to LD_LIBRARY_PATH." >& 4 + echo "Appending $p to LD_LIBRARY_PATH." >&4 case "$LD_LIBRARY_PATH" in '') LD_LIBRARY_PATH=$p ;; *) LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$p ;; @@ -496,7 +496,7 @@ do done case "$LD_LIBRARY_PATH" in "$old_LD_LIBRARY_PATH") ;; -*) echo "LD_LIBRARY_PATH is now $LD_LIBRARY_PATH." >& 4 ;; +*) echo "LD_LIBRARY_PATH is now $LD_LIBRARY_PATH." >&4 ;; esac case "$LD_LIBRARY_PATH" in '') ;; Index: gnu/usr.bin/perl/hints/freebsd.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/freebsd.sh,v diff -u -p -a -u -p -r1.16 freebsd.sh --- gnu/usr.bin/perl/hints/freebsd.sh 1 Mar 2021 23:19:57 -0000 1.16 +++ gnu/usr.bin/perl/hints/freebsd.sh 21 Feb 2024 15:47:02 -0000 @@ -352,3 +352,25 @@ arm|mips) test "$optimize" || optimize='-O2' ;; esac + +# don't modify a supplied -Darchname +case "$archname" in +'') + cat > UU/archname.cbu <<'EOCBU' +unamem=`uname -m` +case "$archname" in +"$unamem"-*) + arch=`uname -p` + archname=`echo "$archname" | sed -e "s/^$unamem-/$arch-/"` + ;; +esac +EOCBU + ;; +esac + +# This function on this box has weird behavior. See +# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=255646 +d_querylocale='undef' + +# See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=265950 +d_duplocale='undef' Index: gnu/usr.bin/perl/hints/hpux.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/hpux.sh,v diff -u -p -a -u -p -r1.18 hpux.sh --- gnu/usr.bin/perl/hints/hpux.sh 1 Mar 2021 23:19:57 -0000 1.18 +++ gnu/usr.bin/perl/hints/hpux.sh 21 Feb 2024 15:47:02 -0000 @@ -805,13 +805,15 @@ case "$d_oldpthreads" in # and it seems to be buggy in HP-UX anyway. i_dbm=undef -# In HP-UXes prior to 11.23 strtold() returned a HP-UX -# specific union called long_double, not a C99 long double. -case "`grep 'double strtold.const' /usr/include/stdlib.h`" in -*"long double strtold"*) ;; # strtold should be safe. -*) echo "Looks like your strtold() is non-standard..." >&4 - d_strtold=undef ;; -esac +if [ "$xxOsRevMajor" -lt 11 ] || [ "$xxOsRevMajor" -eq 11 ] && [ "$xxOsRevMinor" -lt 23 ]; then + # In HP-UXes prior to 11.23 strtold() returned a HP-UX + # specific union called long_double, not a C99 long double. + case "`grep 'double strtold.const' /usr/include/stdlib.h`" in + *"long double strtold"*) ;; # strtold should be safe. + *) echo "Looks like your strtold() is non-standard..." >&4 + d_strtold=undef ;; + esac +fi # In pre-11 HP-UXes there really isn't isfinite(), despite what # Configure might think. (There is finite(), though.) Index: gnu/usr.bin/perl/hints/linux.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/linux.sh,v diff -u -p -a -u -p -r1.20 linux.sh --- gnu/usr.bin/perl/hints/linux.sh 1 Mar 2021 23:19:57 -0000 1.20 +++ gnu/usr.bin/perl/hints/linux.sh 21 Feb 2024 15:47:02 -0000 @@ -154,7 +154,7 @@ esac # (such as -lm) in /lib or /usr/lib. So we have to ask gcc to tell us # where to look. We don't want gcc's own libraries, however, so we # filter those out. -# This could be conditional on Unbuntu, but other distributions may +# This could be conditional on Ubuntu, but other distributions may # follow suit, and this scheme seems to work even on rather old gcc's. # This unconditionally uses gcc because even if the user is using another # compiler, we still need to find the math library and friends, and I don't Index: gnu/usr.bin/perl/hints/os390.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/os390.sh,v diff -u -p -a -u -p -r1.12 os390.sh --- gnu/usr.bin/perl/hints/os390.sh 15 Feb 2023 01:36:33 -0000 1.12 +++ gnu/usr.bin/perl/hints/os390.sh 21 Feb 2024 15:47:02 -0000 @@ -63,8 +63,6 @@ myfirstchar=$(od -A n -N 1 -t x $me | xa if [ "${myfirstchar}" = "23" ]; then # 23 is '#' in ASCII unset ebcdic def_os390_cflags="$def_os390_cflags -qascii" - # ensure that 'safe' putenv is used and avoid direct environ manipulation - def_os390_defs="$def_os390_defs -DPERL_USE_SAFE_PUTENV"; else ebcdic=true fi Index: gnu/usr.bin/perl/hints/riscos.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/riscos.sh,v diff -u -p -a -u -p -r1.1.1.1 riscos.sh --- gnu/usr.bin/perl/hints/riscos.sh 29 Sep 2008 17:18:28 -0000 1.1.1.1 +++ gnu/usr.bin/perl/hints/riscos.sh 21 Feb 2024 15:47:02 -0000 @@ -5,7 +5,7 @@ cc='gcc' locincpth="" -ccflags="-mpoke-function-name -DDYNAMIC_ENV_FETCH -DPERL_USE_SAFE_PUTENV" +ccflags="-mpoke-function-name -DDYNAMIC_ENV_FETCH" prefix='/' osname='riscos' libpth=' ' Index: gnu/usr.bin/perl/hints/solaris_2.sh =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/hints/solaris_2.sh,v diff -u -p -a -u -p -r1.17 solaris_2.sh --- gnu/usr.bin/perl/hints/solaris_2.sh 1 Mar 2021 23:19:57 -0000 1.17 +++ gnu/usr.bin/perl/hints/solaris_2.sh 21 Feb 2024 15:47:02 -0000 @@ -63,6 +63,10 @@ esac set `echo " $libswanted " | sed -e 's@ ld @ @' -e 's@ malloc @ @' -e 's@ ucb @ @' -e 's@ sec @ @' -e 's@ crypt @ @'` libswanted="$*" +# Add libnsl for networking support +set `echo " $libswanted " | sed -e 's@ inet @ inet nsl @'` +libswanted="$*" + # Look for architecture name. We want to suggest a useful default. case "$archname" in '') @@ -693,21 +697,6 @@ EOM ;; esac EOCBU - -# -# If unsetenv is available, use it in conjunction with PERL_USE_SAFE_PUTENV to -# work around Sun bugid 6333830. Both unsetenv and 6333830 only appear in -# Solaris 10, so we don't need to probe explicitly for an OS version. We have -# to append this test to the end of config.over as it needs to run after -# Configure has probed for unsetenv, and this hints file is processed before -# that has happened. -# -cat >> config.over <<'EOOVER' -if test "$d_unsetenv" = "$define" -a \ - `expr "$ccflags" : '.*-DPERL_USE_SAFE_PUTENV'` -eq 0; then - ccflags="$ccflags -DPERL_USE_SAFE_PUTENV" -fi -EOOVER rm -f try.c try.o try a.out Index: gnu/usr.bin/perl/hints/ultrix_4.sh =================================================================== RCS file: gnu/usr.bin/perl/hints/ultrix_4.sh diff -N gnu/usr.bin/perl/hints/ultrix_4.sh --- gnu/usr.bin/perl/hints/ultrix_4.sh 13 Feb 2019 21:15:24 -0000 1.8 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,69 +0,0 @@ -# hints/ultrix_4.sh -# Last updated by Andy Dougherty -# Fri Feb 10 10:04:51 EST 1995 -# -# Use Configure -Dcc=gcc to use gcc. -# -# This used to use -g, but that pulls in -DDEBUGGING by default. -case "$optimize" in -'') - # recent versions have a working compiler. - case "$osvers" in - *4.[45]*) optimize='-O2' ;; - *) optimize='none' ;; - esac - ;; -esac - -# Some users have reported Configure runs *much* faster if you -# replace all occurrences of /bin/sh by /bin/sh5 -# Something like: -# sed 's!/bin/sh!/bin/sh5!g' Configure > Configure.sh5 -# Then run "sh5 Configure.sh5 [your options]" - -case "$myuname" in -*risc*) cat <&4 -Note that there is a bug in some versions of NFS on the DECStation that -may cause utime() to work incorrectly. If so, regression test io/fs -may fail if run under NFS. Ignore the failure. -EOF -esac - -# Compiler flags that depend on osversion: -case "$cc" in -*gcc*) ;; -*) - case "$osvers" in - *4.1*) ccflags="$ccflags -DLANGUAGE_C -Olimit 3800" ;; - *4.2*) ccflags="$ccflags -DLANGUAGE_C -Olimit 3800" - # Prototypes sometimes cause compilation errors in 4.2. - prototype=undef - *4.3*) ccflags="$ccflags -std1 -DLANGUAGE_C -Olimit 3800" ;; - *) ccflags="$ccflags -std -Olimit 3800" ;; - esac - ;; -esac - -# Other settings that depend on $osvers: -case "$osvers" in -*4.1*) ;; -*4.2*) libswanted=`echo $libswanted | sed 's/ malloc / /'` ;; -*4.3*) ;; -*) ranlib='ranlib' ;; -esac - -# Settings that don't depend on $osvers: - -util_cflags='ccflags="$ccflags -DLOCALE_ENVIRON_REQUIRED"' -groupstype='int' -# The configure test should be beefed up to try using the field when -# it can't find any of the standardly-named fields. -d_dirnamlen='define' - -# Ultrix can mmap only character devices, not regular files, -# which is rather useless state of things for Perl. -d_mmap='undef' - -# There simply isn't dynaloading in Ultrix. -usedl='undef' - Index: gnu/usr.bin/perl/lib/Benchmark.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/Benchmark.pm,v diff -u -p -a -u -p -r1.17 Benchmark.pm --- gnu/usr.bin/perl/lib/Benchmark.pm 1 Mar 2021 23:19:57 -0000 1.17 +++ gnu/usr.bin/perl/lib/Benchmark.pm 21 Feb 2024 15:47:02 -0000 @@ -482,7 +482,7 @@ our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_T clearcache clearallcache disablecache enablecache); %EXPORT_TAGS=( all => [ @EXPORT, @EXPORT_OK ] ) ; -$VERSION = 1.23; +$VERSION = 1.24; # --- ':hireswallclock' special handling @@ -683,9 +683,9 @@ sub runloop { my($t0, $t1, $td); # before, after, difference # find package of caller so we can execute code there - my($curpack) = caller(0); + my $curpack = caller(0); my($i, $pack)= 0; - while (($pack) = caller(++$i)) { + while ($pack = caller(++$i)) { last if $pack ne $curpack; } Index: gnu/usr.bin/perl/lib/Benchmark.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/Benchmark.t,v diff -u -p -a -u -p -r1.4 Benchmark.t --- gnu/usr.bin/perl/lib/Benchmark.t 15 Feb 2023 01:36:33 -0000 1.4 +++ gnu/usr.bin/perl/lib/Benchmark.t 21 Feb 2024 15:47:02 -0000 @@ -40,6 +40,89 @@ sub cmp_delta { return $max/$min <= (1+$delta); } +sub splatter { + my ($message) = @_; + my $splatter = <<~'EOF_SPLATTER'; + Please file a ticket to report this. Our bug tracker can be found at + + https://github.com/Perl/perl5/issues + + Make sure you include the full output of perl -V, also uname -a, + and the version details for the C compiler you are using are + very helpful. + + Please also try compiling and running the C program that can + be found at + + https://github.com/Perl/perl5/issues/20839#issuecomment-1439286875 + + and provide the results (or compile errors) as part of your + bug report. + + EOF_SPLATTER + + if ( $message =~ s/\.\.\.//) { + $splatter =~ s/Please/please/; + } + die $message, $splatter; +} + +{ + # Benchmark may end up "looping forever" if time() or times() are + # broken such that they do not return different values over time. + # The following crude test is intended to ensure that we can rely + # on them and be confident that we won't infinite loop in the + # following tests. + # + # You can simulate a broken time or times() function by setting + # the appropriate env var to a true value: + # + # time() -> SIMULATE_BROKEN_TIME_FUNCTION + # times() -> SIMULATE_BROKEN_TIMES_FUNCTION + # + # If you have a very fast box you may need to set the FAST_CPU env + # var to a number larger than 1 to require these tests to perform + # more iterations to see the time actually tick over. (You could + # also set it to a value between 0 and 1 to speed this up, but I + # don't see why you would...) + # + # See https://github.com/Perl/perl5/issues/20839 for the ticket + # that motivated this test. - Yves + + my @times0; + for ( 1 .. 3 ) { + my $end_time = time + 1; + my $count = 0; + my $scale = $ENV{FAST_CPU} || 1; + my $count_threshold = 20_000; + while ( $ENV{SIMULATE_BROKEN_TIME_FUNCTION} || time < $end_time ) { + my $x = 0.0; + for ( 1 .. 10_000 ) { + $x += sqrt(time); + } + if (++$count > $count_threshold * $scale) { + last; + } + } + cmp_ok($count,"<",$count_threshold * $scale, + "expecting \$count < ($count_threshold * $scale)") + or splatter(<<~'EOF_SPLATTER'); + Either this system is extremely fast, or the time() function + is broken. + + If you think this system is extremely fast you may scale up the + number of iterations allowed by this test by setting FAST_CPU=N + in the environment. Higher N will allow more ops-per-second + before we decide time() is broken. + + If setting a higher FAST_CPU value does not fix this problem then ... + EOF_SPLATTER + push @times0, $ENV{SIMULATE_BROKEN_TIMES_FUNCTION} ? 0 : (times)[0]; + } + isnt("@times0", "0 0 0", "Make sure times() does not always return 0.") + or splatter("It appears you have a broken a times() function.\n\n"); +} + my $t0 = new Benchmark; isa_ok ($t0, 'Benchmark', "Ensure we can create a benchmark object"); Index: gnu/usr.bin/perl/lib/Config.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/Config.t,v diff -u -p -a -u -p -r1.8 Config.t --- gnu/usr.bin/perl/lib/Config.t 15 Feb 2023 01:36:33 -0000 1.8 +++ gnu/usr.bin/perl/lib/Config.t 21 Feb 2024 15:47:02 -0000 @@ -51,6 +51,39 @@ ok( exists $Config{d_fork}, "has d_fork ok(!exists $Config{d_bork}, "has no d_bork"); +{ + # check taint_support and tain_disabled are set up as expected. + + ok( exists $Config{taint_support}, "has taint_support"); + + ok( exists $Config{taint_disabled}, "has taint_disabled"); + + is( $Config{taint_support}, ($Config{taint_disabled} ? "" : "define"), + "taint_support = !taint_disabled"); + + ok( ($Config{taint_support} eq "" or $Config{taint_support} eq "define"), + "taint_support is a valid value"); + + ok( ( $Config{taint_disabled} eq "" or $Config{taint_disabled} eq "silent" or + $Config{taint_disabled} eq "define"), + "taint_disabled is a valid value"); + + my @opts = Config::non_bincompat_options(); + my @want_taint_disabled = ("", "define", "silent"); + my @want_taint_support = ("define", "", ""); + my ($silent_no_taint_support) = grep $_ eq "SILENT_NO_TAINT_SUPPORT", @opts; + my ($no_taint_support) = grep $_ eq "NO_TAINT_SUPPORT", @opts; + my $no_taint_support_count = 0 + grep /NO_TAINT_SUPPORT/, @opts; + my $want_count = $silent_no_taint_support ? 2 : $no_taint_support ? 1 : 0; + + is ($no_taint_support_count, $want_count, + "non_bincompat_options info on taint support is as expected"); + is( $Config{taint_disabled}, $want_taint_disabled[$no_taint_support_count], + "taint_disabled is aligned with non_bincompat_options() data"); + is( $Config{taint_support}, $want_taint_support[$no_taint_support_count], + "taint_support is aligned with non_bincompat_options() data"); +} + like($Config{ivsize}, qr/^(4|8)$/, "ivsize is 4 or 8 (it is $Config{ivsize})"); # byteorder is virtual, but it has rules. Index: gnu/usr.bin/perl/lib/FileHandle.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/FileHandle.pm,v diff -u -p -a -u -p -r1.7 FileHandle.pm --- gnu/usr.bin/perl/lib/FileHandle.pm 13 Feb 2019 21:15:24 -0000 1.7 +++ gnu/usr.bin/perl/lib/FileHandle.pm 21 Feb 2024 15:47:02 -0000 @@ -4,7 +4,7 @@ use 5.006; use strict; our($VERSION, @ISA, @EXPORT, @EXPORT_OK); -$VERSION = "2.03"; +$VERSION = "2.05"; require IO::File; @ISA = qw(IO::File); @@ -111,36 +111,36 @@ FileHandle - supply object methods for f use FileHandle; - $fh = FileHandle->new; + my $fh = FileHandle->new; if ($fh->open("< file")) { print <$fh>; $fh->close; } - $fh = FileHandle->new("> FOO"); + my $fh = FileHandle->new("> FOO"); if (defined $fh) { print $fh "bar\n"; $fh->close; } - $fh = FileHandle->new("file", "r"); + my $fh = FileHandle->new("file", "r"); if (defined $fh) { print <$fh>; undef $fh; # automatically closes the file } - $fh = FileHandle->new("file", O_WRONLY|O_APPEND); + my $fh = FileHandle->new("file", O_WRONLY|O_APPEND); if (defined $fh) { print $fh "corge\n"; undef $fh; # automatically closes the file } - $pos = $fh->getpos; + my $pos = $fh->getpos; $fh->setpos($pos); - $fh->setvbuf($buffer_var, _IOLBF, 1024); + $fh->setvbuf(my $buffer_var, _IOLBF, 1024); - ($readfh, $writefh) = FileHandle::pipe; + my ($readfh, $writefh) = FileHandle::pipe; autoflush STDOUT 1; @@ -149,7 +149,7 @@ FileHandle - supply object methods for f NOTE: This class is now a front-end to the IO::* classes. C creates a C, which is a reference to a -newly created symbol (see the C package). If it receives any +newly created symbol (see the L package). If it receives any parameters, they are passed to C; if the open fails, the C object is destroyed. Otherwise, it is returned to the caller. Index: gnu/usr.bin/perl/lib/UNIVERSAL.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/UNIVERSAL.pm,v diff -u -p -a -u -p -r1.10 UNIVERSAL.pm --- gnu/usr.bin/perl/lib/UNIVERSAL.pm 15 Feb 2023 01:36:33 -0000 1.10 +++ gnu/usr.bin/perl/lib/UNIVERSAL.pm 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ package UNIVERSAL; -our $VERSION = '1.14'; +our $VERSION = '1.15'; # UNIVERSAL should not contain any extra subs/methods beyond those # that it exists to define. The existence of import() below is a historical @@ -24,21 +24,21 @@ UNIVERSAL - base class for ALL classes ( =head1 SYNOPSIS - $is_io = $fd->isa("IO::Handle"); - $is_io = Class->isa("IO::Handle"); + my $obj_is_io = $fd->isa("IO::Handle"); + my $cls_is_io = Class->isa("IO::Handle"); - $does_log = $obj->DOES("Logger"); - $does_log = Class->DOES("Logger"); + my $obj_does_log = $obj->DOES("Logger"); + my $cls_does_log = Class->DOES("Logger"); - $sub = $obj->can("print"); - $sub = Class->can("print"); + my $obj_sub = $obj->can("print"); + my $cls_sub = Class->can("print"); - $sub = eval { $ref->can("fandango") }; - $ver = $obj->VERSION; + my $eval_sub = eval { $ref->can("fandango") }; + my $ver = $obj->VERSION; # but never do this! - $is_io = UNIVERSAL::isa($fd, "IO::Handle"); - $sub = UNIVERSAL::can($obj, "print"); + my $is_io = UNIVERSAL::isa($fd, "IO::Handle"); + my $sub = UNIVERSAL::can($obj, "print"); =head1 DESCRIPTION Index: gnu/usr.bin/perl/lib/builtin.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/builtin.pm,v diff -u -p -a -u -p -r1.1.1.1 builtin.pm --- gnu/usr.bin/perl/lib/builtin.pm 15 Feb 2023 01:33:05 -0000 1.1.1.1 +++ gnu/usr.bin/perl/lib/builtin.pm 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -package builtin 0.006; +package builtin 0.008; use strict; use warnings; @@ -22,7 +22,10 @@ builtin - Perl pragma to import built-in blessed refaddr reftype created_as_string created_as_number ceil floor + indexed trim + is_tainted + export_lexically ); =head1 DESCRIPTION @@ -280,8 +283,41 @@ C is equivalent to: For Perl versions where this feature is not available look at the L module for a comparable implementation. +=head2 is_tainted + + $bool = is_tainted($var); + +Returns true when given a tainted variable. + +=head2 export_lexically + + export_lexically($name1, $ref1, $name2, $ref2, ...) + +Exports new lexical names into the scope currently being compiled. Names given +by the first of each pair of values will refer to the corresponding item whose +reference is given by the second. Types of item that are permitted are +subroutines, and scalar, array, and hash variables. If the item is a +subroutine, the name may optionally be prefixed with the C<&> sigil, but for +convenience it doesn't have to. For items that are variables the sigil is +required, and must match the type of the variable. + + export_lexically func => \&func, + '&func' => \&func; # same as above + + export_lexically '$scalar' => \my $var; + +Z<> + + # The following are not permitted + export_lexically '$var' => \@arr; # sigil does not match + export_lexically name => \$scalar; # implied '&' sigil does not match + + export_lexically '*name' => \*globref; # globrefs are not supported + +This must be called at compile time; which typically means during a C +block. Usually this would be used as part of an C method of a module, +when invoked as part of a C statement. + =head1 SEE ALSO L, L, L - -=cut Index: gnu/usr.bin/perl/lib/builtin.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/builtin.t,v diff -u -p -a -u -p -r1.1.1.1 builtin.t --- gnu/usr.bin/perl/lib/builtin.t 15 Feb 2023 01:33:04 -0000 1.1.1.1 +++ gnu/usr.bin/perl/lib/builtin.t 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -#!./perl +#!./perl -T BEGIN { chdir 't' if -d 't'; @@ -6,15 +6,14 @@ BEGIN { set_up_inc('../lib'); } -use strict; -use warnings; +use v5.36; no warnings 'experimental::builtin'; package FetchStoreCounter { - sub new { my $class = shift; return bless [@_], $class } - sub TIESCALAR { return shift->new(@_) } - sub FETCH { ${shift->[0]}++ } - sub STORE { ${shift->[1]}++ } + sub TIESCALAR($class, @args) { bless \@args, $class } + + sub FETCH($self) { $self->[0]->$*++ } + sub STORE($self, $) { $self->[1]->$*++ } } # booleans @@ -47,7 +46,9 @@ package FetchStoreCounter { is($fetchcount, 1, 'is_bool() invokes FETCH magic'); $tied = is_bool(false); - is($storecount, 1, 'is_bool() TARG invokes STORE magic'); + is($storecount, 1, 'is_bool() invokes STORE magic'); + + is(prototype(\&builtin::is_bool), '$', 'is_bool prototype'); } # weakrefs @@ -68,6 +69,10 @@ package FetchStoreCounter { weaken($ref); undef $arr; is($ref, undef, 'ref is now undef after arr is cleared'); + + is(prototype(\&builtin::weaken), '$', 'weaken prototype'); + is(prototype(\&builtin::unweaken), '$', 'unweaken prototype'); + is(prototype(\&builtin::is_weak), '$', 'is_weak prototype'); } # reference queries @@ -92,6 +97,10 @@ package FetchStoreCounter { # blessed() appears false as a boolean on package "0" is(blessed(bless [], "0") ? "YES" : "NO", "NO", 'blessed in boolean context handles "0" cornercase'); + + is(prototype(\&builtin::blessed), '$', 'blessed prototype'); + is(prototype(\&builtin::refaddr), '$', 'refaddr prototype'); + is(prototype(\&builtin::reftype), '$', 'reftype prototype'); } # created_as_... @@ -159,6 +168,9 @@ package FetchStoreCounter { local $1; "hello" =~ m/(.*)/; ok(created_as_string($1), 'magic string'); + + is(prototype(\&builtin::created_as_string), '$', 'created_as_string prototype'); + is(prototype(\&builtin::created_as_number), '$', 'created_as_number prototype'); } # ceil, floor @@ -186,6 +198,9 @@ package FetchStoreCounter { $tied = floor(1.1); is($storecount, 1, 'floor() TARG invokes STORE magic'); + + is(prototype(\&builtin::ceil), '$', 'ceil prototype'); + is(prototype(\&builtin::floor), '$', 'floor prototype'); } # imports are lexical; should not be visible here @@ -290,24 +305,26 @@ package FetchStoreCounter { { use builtin qw( trim ); - is(trim(" Hello world! ") , "Hello world!" , 'Trim spaces'); - is(trim("\tHello world!\t") , "Hello world!" , 'Trim tabs'); - is(trim("\n\n\nHello\nworld!\n") , "Hello\nworld!" , 'Trim \n'); - is(trim("\t\n\n\nHello world!\n \t"), "Hello world!" , 'Trim all three'); - is(trim("Perl") , "Perl" , 'Trim nothing'); - is(trim('') , "" , 'Trim empty string'); + is(trim(" Hello world! ") , "Hello world!" , 'trim spaces'); + is(trim("\tHello world!\t") , "Hello world!" , 'trim tabs'); + is(trim("\n\n\nHello\nworld!\n") , "Hello\nworld!" , 'trim \n'); + is(trim("\t\n\n\nHello world!\n \t"), "Hello world!" , 'trim all three'); + is(trim("Perl") , "Perl" , 'trim nothing'); + is(trim('') , "" , 'trim empty string'); + + is(prototype(\&builtin::trim), '$', 'trim prototype'); } TODO: { my $warn = ''; local $SIG{__WARN__} = sub { $warn .= join "", @_; }; - is(builtin::trim(undef), "", 'Trim undef'); + is(builtin::trim(undef), "", 'trim undef'); like($warn , qr/^Use of uninitialized value in subroutine entry at/, - 'Trim undef triggers warning'); + 'trim undef triggers warning'); local $main::TODO = "Currently uses generic value for the name of non-opcode builtins"; like($warn , qr/^Use of uninitialized value in trim at/, - 'Trim undef triggers warning using actual name of builtin'); + 'trim undef triggers warning using actual name of builtin'); } # Fancier trim tests against a regexp and unicode @@ -315,10 +332,10 @@ TODO: { use builtin qw( trim ); my $nbsp = chr utf8::unicode_to_native(0xA0); - is(trim(" \N{U+2603} "), "\N{U+2603}", 'Trim with unicode content'); + is(trim(" \N{U+2603} "), "\N{U+2603}", 'trim with unicode content'); is(trim("\N{U+2029}foobar\x{2028} "), "foobar", - 'Trim with unicode whitespace'); - is(trim("$nbsp foobar$nbsp "), "foobar", 'Trim with latin1 whitespace'); + 'trim with unicode whitespace'); + is(trim("$nbsp foobar$nbsp "), "foobar", 'trim with latin1 whitespace'); } # Test on a magical fetching variable @@ -327,7 +344,7 @@ TODO: { my $str3 = " Hello world!\t"; $str3 =~ m/(.+Hello)/; - is(trim($1), "Hello", "Trim on a magical variable"); + is(trim($1), "Hello", "trim on a magical variable"); } # Inplace edit, my, our variables @@ -336,10 +353,64 @@ TODO: { my $str4 = "\t\tHello world!\n\n"; $str4 = trim($str4); - is($str4, "Hello world!", "Trim on an inplace variable"); + is($str4, "Hello world!", "trim on an inplace variable"); our $str2 = "\t\nHello world!\t "; - is(trim($str2), "Hello world!", "Trim on an our \$var"); + is(trim($str2), "Hello world!", "trim on an our \$var"); +} + +# is_tainted +{ + use builtin qw( is_tainted ); + + is(is_tainted($0), !!${^TAINT}, "\$0 is tainted (if tainting is supported)"); + ok(!is_tainted($1), "\$1 isn't tainted"); + + # Invokes magic + tie my $tied, FetchStoreCounter => (\my $fetchcount, \my $storecount); + + my $_dummy = is_tainted($tied); + is($fetchcount, 1, 'is_tainted() invokes FETCH magic'); + + $tied = is_tainted($0); + is($storecount, 1, 'is_tainted() invokes STORE magic'); + + is(prototype(\&builtin::is_tainted), '$', 'is_tainted prototype'); +} + +# Lexical export +{ + my $name; + BEGIN { + use builtin qw( export_lexically ); + + $name = "message"; + export_lexically $name => sub { "Hello, world" }; + } + + is(message(), "Hello, world", 'Lexically exported sub is callable'); + ok(!__PACKAGE__->can("message"), 'Exported sub is not visible via ->can'); + + is($name, "message", '$name argument was not modified by export_lexically'); + + our ( $scalar, @array, %hash ); + BEGIN { + use builtin qw( export_lexically ); + + export_lexically + '$SCALAR' => \$scalar, + '@ARRAY' => \@array, + '%HASH' => \%hash; + } + + $::scalar = "value"; + is($SCALAR, "value", 'Lexically exported scalar is accessible'); + + @::array = ('a' .. 'e'); + is(scalar @ARRAY, 5, 'Lexically exported array is accessible'); + + %::hash = (key => "val"); + is($HASH{key}, "val", 'Lexically exported hash is accessible'); } # vim: tabstop=4 shiftwidth=4 expandtab autoindent softtabstop=4 Index: gnu/usr.bin/perl/lib/feature.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/feature.pm,v diff -u -p -a -u -p -r1.6 feature.pm --- gnu/usr.bin/perl/lib/feature.pm 15 Feb 2023 01:36:33 -0000 1.6 +++ gnu/usr.bin/perl/lib/feature.pm 21 Feb 2024 15:47:02 -0000 @@ -1,17 +1,17 @@ -# -*- buffer-read-only: t -*- +# -*- mode: Perl; buffer-read-only: t -*- # !!!!!!! DO NOT EDIT THIS FILE !!!!!!! # This file is built by regen/feature.pl. # Any changes made here will be lost! package feature; - -our $VERSION = '1.72'; +our $VERSION = '1.82'; our %feature = ( fc => 'feature_fc', isa => 'feature_isa', say => 'feature_say', try => 'feature_try', + class => 'feature_class', defer => 'feature_defer', state => 'feature_state', switch => 'feature_switch', @@ -20,6 +20,7 @@ our %feature = ( evalbytes => 'feature_evalbytes', signatures => 'feature_signatures', current_sub => 'feature___SUB__', + module_true => 'feature_module_true', refaliasing => 'feature_refaliasing', postderef_qq => 'feature_postderef_qq', unicode_eval => 'feature_unieval', @@ -37,7 +38,8 @@ our %feature_bundle = ( "5.23" => [qw(bareword_filehandles current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)], "5.27" => [qw(bareword_filehandles bitwise current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)], "5.35" => [qw(bareword_filehandles bitwise current_sub evalbytes fc isa postderef_qq say signatures state unicode_eval unicode_strings)], - "all" => [qw(bareword_filehandles bitwise current_sub declared_refs defer evalbytes extra_paired_delimiters fc indirect isa multidimensional postderef_qq refaliasing say signatures state switch try unicode_eval unicode_strings)], + "5.37" => [qw(bitwise current_sub evalbytes fc isa module_true postderef_qq say signatures state unicode_eval unicode_strings)], + "all" => [qw(bareword_filehandles bitwise class current_sub declared_refs defer evalbytes extra_paired_delimiters fc indirect isa module_true multidimensional postderef_qq refaliasing say signatures state switch try unicode_eval unicode_strings)], "default" => [qw(bareword_filehandles indirect multidimensional)], ); @@ -62,6 +64,7 @@ $feature_bundle{"5.32"} = $feature_bundl $feature_bundle{"5.33"} = $feature_bundle{"5.27"}; $feature_bundle{"5.34"} = $feature_bundle{"5.27"}; $feature_bundle{"5.36"} = $feature_bundle{"5.35"}; +$feature_bundle{"5.38"} = $feature_bundle{"5.37"}; $feature_bundle{"5.9.5"} = $feature_bundle{"5.10"}; my %noops = ( postderef => 1, @@ -73,7 +76,7 @@ my %removed = ( our $hint_shift = 26; our $hint_mask = 0x3c000000; -our @hint_bundles = qw( default 5.10 5.11 5.15 5.23 5.27 5.35 ); +our @hint_bundles = qw( default 5.10 5.11 5.15 5.23 5.27 5.35 5.37 ); # This gets set (for now) in $^H as well as in %^H, # for runtime speed of the uc/lc/ucfirst/lcfirst functions. @@ -98,13 +101,13 @@ feature - Perl pragma to enable new feat say "The case-folded version of $x is: " . fc $x; - # set features to match the :5.10 bundle, which may turn off or on - # multiple features (see below) - use feature ':5.10'; + # set features to match the :5.36 bundle, which may turn off or on + # multiple features (see "FEATURE BUNDLES" below) + use feature ':5.36'; - # implicitly loads :5.10 feature bundle - use v5.10; + # implicitly loads :5.36 feature bundle + use v5.36; =head1 DESCRIPTION @@ -146,6 +149,8 @@ disable I features (an unusual requ =head1 AVAILABLE FEATURES +Read L for the feature cheat sheet summary. + =head2 The 'say' feature C tells the compiler to enable the Raku-inspired @@ -178,6 +183,9 @@ given/when construct. See L for details. This feature is available starting with Perl 5.10. +It is deprecated starting with Perl 5.38, and using +C, C or smartmatch will throw a warning. +It will be removed in Perl 5.42. =head2 The 'unicode_strings' feature @@ -268,9 +276,10 @@ regardless of what feature declarations =head2 The 'postderef' and 'postderef_qq' features The 'postderef_qq' feature extends the applicability of L so that postfix array -and scalar dereference are available in double-quotish interpolations. For -example, it makes the following two statements equivalent: +dereference syntax|perlref/Postfix Dereference Syntax> so that +postfix array dereference, postfix scalar dereference, and +postfix array highest index access are available in double-quotish interpolations. +For example, it makes the following two statements equivalent: my $s = "[@{ $h->{a} }]"; my $s = "[$h->{a}->@*]"; @@ -361,7 +370,7 @@ warn when you use the feature, unless yo no warnings "experimental::declared_refs"; This allows a reference to a variable to be declared with C, C, -our C, or localized with C. It is intended mainly for use in +or C, or localized with C. It is intended mainly for use in conjunction with the "refaliasing" feature. See L for examples. @@ -413,7 +422,7 @@ previous versions, it was simply on all You can use the L module on CPAN to disable multidimensional array emulation for older versions of Perl. -=head2 The 'bareword_filehandles' feature. +=head2 The 'bareword_filehandles' feature This feature enables bareword filehandles for builtin functions operations, a generally discouraged practice. It is enabled by @@ -429,7 +438,7 @@ previous versions it was simply on all t You can use the L module on CPAN to disable bareword filehandles for older versions of perl. -=head2 The 'try' feature. +=head2 The 'try' feature B: This feature is still experimental and the implementation may change or be removed in future versions of Perl. For this reason, Perl will @@ -467,6 +476,10 @@ This feature enables the use of more pai traditional four, S >>>, S>, S>, and S>. When this feature is on, for example, you can say SpatE<187>>>. +As with any usage of non-ASCII delimiters in a UTF-8-encoded source file, you +will want to ensure the parser will decode the source code from UTF-8 bytes +with a declaration such as C. + This feature is available starting in Perl 5.36. The complete list of accepted paired delimiters as of Unicode 14.0 is: @@ -859,6 +872,25 @@ The complete list of accepted paired del 🢫 🢪 U+1F8AB, U+1F8AA RIGHT/LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW +=head2 The 'module_true' feature + +This feature removes the need to return a true value at the end of a module +loaded with C or C. Any errors during compilation will cause +failures, but reaching the end of the module when this feature is in effect +will prevent C from throwing an exception that the module "did not return +a true value". + +=head2 The 'class' feature + +B: This feature is still experimental and the implementation may +change or be removed in future versions of Perl. For this reason, Perl will +warn when you use the feature, unless you have explicitly disabled the warning: + + no warnings "experimental::class"; + +This feature enables the C block syntax and other associated keywords +which implement the "new" object system, previously codenamed "Corinna". + =head1 FEATURE BUNDLES It's possible to load multiple features together, using @@ -935,6 +967,10 @@ The following feature bundles are availa evalbytes fc isa postderef_qq say signatures state unicode_eval unicode_strings + :5.38 bitwise current_sub evalbytes fc isa + module_true postderef_qq say signatures + state unicode_eval unicode_strings + The C<:default> bundle represents the feature set that is enabled before any C or C declaration. @@ -964,12 +1000,12 @@ main compilation unit (that is, the one- By explicitly requiring a minimum Perl version number for your program, with the C construct. That is, - use v5.10.0; + use v5.36.0; will do an implicit no feature ':all'; - use feature ':5.10'; + use feature ':5.36'; and so on. Note how the trailing sub-version is automatically stripped from the @@ -977,7 +1013,7 @@ version. But to avoid portability warnings (see L), you may prefer: - use 5.010; + use 5.036; with the same effect. @@ -1211,4 +1247,4 @@ sub feature_bundle { 1; -# ex: set ro: +# ex: set ro ft=perl: Index: gnu/usr.bin/perl/lib/locale.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/locale.t,v diff -u -p -a -u -p -r1.11 locale.t --- gnu/usr.bin/perl/lib/locale.t 15 Feb 2023 01:36:33 -0000 1.11 +++ gnu/usr.bin/perl/lib/locale.t 21 Feb 2024 15:47:02 -0000 @@ -58,21 +58,18 @@ BEGIN { } use feature 'fc'; +use I18N::Langinfo qw(langinfo CODESET CRNCYSTR RADIXCHAR); # =1 adds debugging output; =2 increases the verbosity somewhat our $debug = $ENV{PERL_DEBUG_FULL_TEST} // 0; # Certain tests have been shown to be problematical for a few locales. Don't # fail them unless at least this percentage of the tested locales fail. -# On AIX machines, many locales call a no-break space a graphic. -# (There aren't 1000 locales currently in existence, so 99.9 works) # EBCDIC os390 has more locales fail than normal, because it has locales that # move various critical characters like '['. -my $acceptable_failure_percentage = ($os =~ / ^ ( aix ) $ /x) - ? 99.9 - : ($os =~ / ^ ( os390 ) $ /x) - ? 10 - : 5; +my $acceptable_failure_percentage = ($os =~ / ^ ( os390 ) $ /x) + ? 10 + : 5; # The list of test numbers of the problematic tests. my %problematical_tests; @@ -792,18 +789,24 @@ my $final_without_setlocale = $test_num; debug "Scanning for locales...\n"; require POSIX; import POSIX ':locale_h'; - my $categories = [ 'LC_CTYPE', 'LC_NUMERIC', 'LC_ALL' ]; -debug "Scanning for just compatible"; -my @Locale = find_locales($categories); -debug "Scanning for even incompatible"; -my @include_incompatible_locales = find_locales($categories, - 'even incompatible locales'); - +my @Locale; +my @include_incompatible_locales; +if ($^O eq "aix" + and version->new(($Config{osvers} =~ /^(\d+(\.\d+))/)[0]) < 7) { + # https://www.ibm.com/support/pages/apar/IV22097 + skip("setlocale broken on old AIX"); +} +else { + debug "Scanning for just compatible"; + @Locale = find_locales($categories); + debug "Scanning for even incompatible"; + @include_incompatible_locales = find_locales($categories, + 'even incompatible locales'); +} # The locales included in the incompatible list that aren't in the compatible # one. my @incompatible_locales; - if (@Locale < @include_incompatible_locales) { my %seen; @seen{@Locale} = (); @@ -1058,9 +1061,12 @@ foreach my $Locale (@Locale) { my $is_utf8_locale = is_locale_utf8($Locale); - debug "is utf8 locale? = $is_utf8_locale\n"; - - debug "radix = " . disp_str(localeconv()->{decimal_point}) . "\n"; + if ($debug) { + debug "code set = " . langinfo(CODESET); + debug "is utf8 locale? = $is_utf8_locale\n"; + debug "radix = " . disp_str(langinfo(RADIXCHAR)) . "\n"; + debug "currency = " . disp_str(langinfo(CRNCYSTR)); + } if (! $is_utf8_locale) { use locale; @@ -2136,19 +2142,22 @@ foreach my $Locale (@Locale) { } $ok19 = $ok20 = 1; - if (setlocale(&POSIX::LC_TIME, $Locale)) { # These tests aren't affected by - # :not_characters - my @times = CORE::localtime(); + if (locales_enabled('LC_TIME')) { + if (setlocale(&POSIX::LC_TIME, $Locale)) { # These tests aren't + # affected by + # :not_characters + my @times = CORE::localtime(); - use locale; - $ok19 = POSIX::strftime("%p", @times) ne "%p"; # [perl #119425] - my $date = POSIX::strftime("'%A' '%B' '%Z' '%p'", @times); - debug("'Day' 'Month' 'TZ' 'am/pm' = ", disp_str($date)); - - # If there is any non-ascii, it better be UTF-8 in a UTF-8 locale, and - # not UTF-8 if the locale isn't UTF-8. - $ok20 = $date =~ / ^ \p{ASCII}+ $ /x - || $is_utf8_locale == utf8::is_utf8($date); + use locale; + $ok19 = POSIX::strftime("%p", @times) ne "%p"; # [perl #119425] + my $date = POSIX::strftime("'%A' '%B' '%Z' '%p'", @times); + debug("'Day' 'Month' 'TZ' 'am/pm' = ", disp_str($date)); + + # If there is any non-ascii, it better be UTF-8 in a UTF-8 locale, + # and not UTF-8 if the locale isn't UTF-8. + $ok20 = $date =~ / ^ \p{ASCII}+ $ /x + || $is_utf8_locale == utf8::is_utf8($date); + } } $ok21 = 1; @@ -2435,7 +2444,7 @@ foreach my $Locale (@Locale) { $test_names{$locales_test_number} = 'Verify atof with locale radix and negative exponent'; $problematical_tests{$locales_test_number} = 1; - my $radix = POSIX::localeconv()->{decimal_point}; + my $radix = langinfo(RADIXCHAR); my @nums = ( "3.14e+9", "3${radix}14e+9", "3.14e-9", "3${radix}14e-9", "-3.14e+9", "-3${radix}14e+9", "-3.14e-9", "-3${radix}14e-9", Index: gnu/usr.bin/perl/lib/locale_threads.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/locale_threads.t,v diff -u -p -a -u -p -r1.1.1.1 locale_threads.t --- gnu/usr.bin/perl/lib/locale_threads.t 13 Feb 2019 21:11:32 -0000 1.1.1.1 +++ gnu/usr.bin/perl/lib/locale_threads.t 21 Feb 2024 15:47:02 -0000 @@ -70,7 +70,8 @@ SKIP: { if ((my $s = sprintf("%g", $in)) eq "4.2") { $dot ||= $_; } else { - my $radix = localeconv()->{decimal_point}; + use I18N::Langinfo qw(langinfo RADIXCHAR); + my $radix = langinfo(RADIXCHAR); $comma ||= $_ if $radix eq ','; } Index: gnu/usr.bin/perl/lib/overload.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/overload.pm,v diff -u -p -a -u -p -r1.18 overload.pm --- gnu/usr.bin/perl/lib/overload.pm 15 Feb 2023 01:36:33 -0000 1.18 +++ gnu/usr.bin/perl/lib/overload.pm 21 Feb 2024 15:47:02 -0000 @@ -2,9 +2,8 @@ package overload; use strict; no strict 'refs'; -no warnings 'experimental::builtin'; -our $VERSION = '1.35'; +our $VERSION = '1.37'; our %ops = ( with_assign => "+ - * / % ** << >> x .", @@ -30,152 +29,151 @@ my %ops_seen; sub nil {} sub OVERLOAD { - my $package = shift; - my %arg = @_; - my $sub; - *{$package . "::(("} = \&nil; # Make it findable via fetchmethod. - for (keys %arg) { - if ($_ eq 'fallback') { - for my $sym (*{$package . "::()"}) { - *$sym = \&nil; # Make it findable via fetchmethod. - $$sym = $arg{$_}; - } - } else { - warnings::warnif("overload arg '$_' is invalid") - unless exists $ops_seen{$_}; - $sub = $arg{$_}; - if (not ref $sub) { - $ {$package . "::(" . $_} = $sub; - $sub = \&nil; - } - #print STDERR "Setting '$ {'package'}::\cO$_' to \\&'$sub'.\n"; - *{$package . "::(" . $_} = \&{ $sub }; + my $package = shift; + my %arg = @_; + my $sub; + *{$package . "::(("} = \&nil; # Make it findable via fetchmethod. + for (keys %arg) { + if ($_ eq 'fallback') { + for my $sym (*{$package . "::()"}) { + *$sym = \&nil; # Make it findable via fetchmethod. + $$sym = $arg{$_}; + } + } else { + warnings::warnif("overload arg '$_' is invalid") + unless exists $ops_seen{$_}; + $sub = $arg{$_}; + if (not ref $sub) { + $ {$package . "::(" . $_} = $sub; + $sub = \&nil; + } + #print STDERR "Setting '$ {'package'}::\cO$_' to \\&'$sub'.\n"; + *{$package . "::(" . $_} = \&{ $sub }; + } } - } } sub import { - my $package = (caller())[0]; - # *{$package . "::OVERLOAD"} = \&OVERLOAD; - shift; - $package->overload::OVERLOAD(@_); + my $package = caller(); + # *{$package . "::OVERLOAD"} = \&OVERLOAD; + shift; + $package->overload::OVERLOAD(@_); } sub unimport { - my $package = (caller())[0]; - shift; - *{$package . "::(("} = \&nil; - for (@_) { - warnings::warnif("overload arg '$_' is invalid") - unless exists $ops_seen{$_}; - delete $ {$package . "::"}{$_ eq 'fallback' ? '()' : "(" .$_}; - } + my $package = caller(); + shift; + *{$package . "::(("} = \&nil; + for (@_) { + warnings::warnif("overload arg '$_' is invalid") + unless exists $ops_seen{$_}; + delete $ {$package . "::"}{$_ eq 'fallback' ? '()' : "(" .$_}; + } } sub Overloaded { - my $package = shift; - $package = ref $package if ref $package; - mycan ($package, '()') || mycan ($package, '(('); + my $package = shift; + $package = ref $package if ref $package; + mycan ($package, '()') || mycan ($package, '(('); } sub ov_method { - my $globref = shift; - return undef unless $globref; - my $sub = \&{*$globref}; - no overloading; - return $sub if $sub != \&nil; - return shift->can($ {*$globref}); + my $globref = shift; + return undef unless $globref; + my $sub = \&{*$globref}; + no overloading; + return $sub if $sub != \&nil; + return shift->can($ {*$globref}); } sub OverloadedStringify { - my $package = shift; - $package = ref $package if ref $package; - #$package->can('(""') - ov_method mycan($package, '(""'), $package - or ov_method mycan($package, '(0+'), $package - or ov_method mycan($package, '(bool'), $package - or ov_method mycan($package, '(nomethod'), $package; + my $package = shift; + $package = ref $package if ref $package; + #$package->can('(""') + ov_method mycan($package, '(""'), $package + or ov_method mycan($package, '(0+'), $package + or ov_method mycan($package, '(bool'), $package + or ov_method mycan($package, '(nomethod'), $package; } sub Method { - my $package = shift; - if(ref $package) { - local $@; - local $!; - $package = builtin::blessed($package); - return undef if !defined $package; - } - #my $meth = $package->can('(' . shift); - ov_method mycan($package, '(' . shift), $package; - #return $meth if $meth ne \&nil; - #return $ {*{$meth}}; + my $package = shift; + if (ref $package) { + no warnings 'experimental::builtin'; + $package = builtin::blessed($package); + return undef if !defined $package; + } + #my $meth = $package->can('(' . shift); + ov_method mycan($package, '(' . shift), $package; + #return $meth if $meth ne \&nil; + #return $ {*{$meth}}; } sub AddrRef { - no overloading; - "$_[0]"; + no overloading; + "$_[0]"; } *StrVal = *AddrRef; -sub mycan { # Real can would leave stubs. - my ($package, $meth) = @_; +sub mycan { # Real can would leave stubs. + my ($package, $meth) = @_; + + local $@; + local $!; + require mro; - local $@; - local $!; - require mro; - - my $mro = mro::get_linear_isa($package); - foreach my $p (@$mro) { - my $fqmeth = $p . q{::} . $meth; - return \*{$fqmeth} if defined &{$fqmeth}; - } + my $mro = mro::get_linear_isa($package); + foreach my $p (@$mro) { + my $fqmeth = $p . q{::} . $meth; + return \*{$fqmeth} if defined &{$fqmeth}; + } - return undef; + return undef; } my %constants = ( - 'integer' => 0x1000, # HINT_NEW_INTEGER - 'float' => 0x2000, # HINT_NEW_FLOAT - 'binary' => 0x4000, # HINT_NEW_BINARY - 'q' => 0x8000, # HINT_NEW_STRING - 'qr' => 0x10000, # HINT_NEW_RE - ); + 'integer' => 0x1000, # HINT_NEW_INTEGER + 'float' => 0x2000, # HINT_NEW_FLOAT + 'binary' => 0x4000, # HINT_NEW_BINARY + 'q' => 0x8000, # HINT_NEW_STRING + 'qr' => 0x10000, # HINT_NEW_RE +); use warnings::register; sub constant { - # Arguments: what, sub - while (@_) { - if (@_ == 1) { - warnings::warnif ("Odd number of arguments for overload::constant"); - last; - } - elsif (!exists $constants {$_ [0]}) { - warnings::warnif ("'$_[0]' is not an overloadable type"); - } - elsif (!ref $_ [1] || "$_[1]" !~ /(^|=)CODE\(0x[0-9a-f]+\)$/) { - # Can't use C above as code references can be - # blessed, and C would return the package the ref is blessed into. - if (warnings::enabled) { - $_ [1] = "undef" unless defined $_ [1]; - warnings::warn ("'$_[1]' is not a code reference"); + # Arguments: what, sub + while (@_) { + if (@_ == 1) { + warnings::warnif ("Odd number of arguments for overload::constant"); + last; } + elsif (!exists $constants {$_ [0]}) { + warnings::warnif ("'$_[0]' is not an overloadable type"); + } + elsif (!ref $_ [1] || "$_[1]" !~ /(^|=)CODE\(0x[0-9a-f]+\)$/) { + # Can't use C above as code references can be + # blessed, and C would return the package the ref is blessed into. + if (warnings::enabled) { + $_ [1] = "undef" unless defined $_ [1]; + warnings::warn ("'$_[1]' is not a code reference"); + } + } + else { + $^H{$_[0]} = $_[1]; + $^H |= $constants{$_[0]}; + } + shift, shift; } - else { - $^H{$_[0]} = $_[1]; - $^H |= $constants{$_[0]}; - } - shift, shift; - } } sub remove_constant { - # Arguments: what, sub - while (@_) { - delete $^H{$_[0]}; - $^H &= ~ $constants{$_[0]}; - shift, shift; - } + # Arguments: what, sub + while (@_) { + delete $^H{$_[0]}; + $^H &= ~ $constants{$_[0]}; + shift, shift; + } } 1; @@ -191,9 +189,9 @@ overload - Package for overloading Perl package SomeThing; use overload - '+' => \&myadd, - '-' => \&mysub; - # etc + '+' => \&myadd, + '-' => \&mysub; + # etc ... package main; @@ -365,21 +363,21 @@ The complete list of keys that can be sp directive are given, separated by spaces, in the values of the hash C<%overload::ops>: - with_assign => '+ - * / % ** << >> x .', - assign => '+= -= *= /= %= **= <<= >>= x= .=', - num_comparison => '< <= > >= == !=', - '3way_comparison'=> '<=> cmp', - str_comparison => 'lt le gt ge eq ne', - binary => '& &= | |= ^ ^= &. &.= |. |.= ^. ^.=', - unary => 'neg ! ~ ~.', - mutators => '++ --', - func => 'atan2 cos sin exp abs log sqrt int', - conversion => 'bool "" 0+ qr', - iterators => '<>', - filetest => '-X', - dereferencing => '${} @{} %{} &{} *{}', - matching => '~~', - special => 'nomethod fallback =' + with_assign => '+ - * / % ** << >> x .', + assign => '+= -= *= /= %= **= <<= >>= x= .=', + num_comparison => '< <= > >= == !=', + '3way_comparison' => '<=> cmp', + str_comparison => 'lt le gt ge eq ne', + binary => '& &= | |= ^ ^= &. &.= |. |.= ^. ^.=', + unary => 'neg ! ~ ~.', + mutators => '++ --', + func => 'atan2 cos sin exp abs log sqrt int', + conversion => 'bool "" 0+ qr', + iterators => '<>', + filetest => '-X', + dereferencing => '${} @{} %{} &{} *{}', + matching => '~~', + special => 'nomethod fallback =', Most of the overloadable operators map one-to-one to these keys. Exceptions, including additional overloadable operations not @@ -922,7 +920,7 @@ Inheritance interacts with overloading i If C in - use overload key => value; + use overload key => value; is a string, it is interpreted as a method name - which may (in the usual way) be inherited from another class. @@ -943,7 +941,7 @@ be called to implement operation C<+> fo =back Note that in Perl version prior to 5.18 inheritance of the C key -was not governed by the above rules. The value of C in the first +was not governed by the above rules. The value of C in the first overloaded ancestor was used. This was fixed in 5.18 to follow the usual rules of inheritance. @@ -1044,10 +1042,10 @@ and overload::remove_constant() from any From these methods they may be called as sub import { - shift; - return unless @_; - die "unknown import: @_" unless @_ == 1 and $_[0] eq ':constant'; - overload::constant integer => sub {Math::BigInt->new(shift)}; + shift; + return unless @_; + die "unknown import: @_" unless @_ == 1 and $_[0] eq ':constant'; + overload::constant integer => sub {Math::BigInt->new(shift)}; } =head1 IMPLEMENTATION @@ -1085,66 +1083,66 @@ Please add examples to what follows! Put this in F in your Perl library directory: - package two_face; # Scalars with separate string and - # numeric values. - sub new { my $p = shift; bless [@_], $p } - use overload '""' => \&str, '0+' => \&num, fallback => 1; - sub num {shift->[1]} - sub str {shift->[0]} + package two_face; # Scalars with separate string and + # numeric values. + sub new { my $p = shift; bless [@_], $p } + use overload '""' => \&str, '0+' => \&num, fallback => 1; + sub num {shift->[1]} + sub str {shift->[0]} Use it as follows: - require two_face; - my $seven = two_face->new("vii", 7); - printf "seven=$seven, seven=%d, eight=%d\n", $seven, $seven+1; - print "seven contains 'i'\n" if $seven =~ /i/; + require two_face; + my $seven = two_face->new("vii", 7); + printf "seven=$seven, seven=%d, eight=%d\n", $seven, $seven+1; + print "seven contains 'i'\n" if $seven =~ /i/; (The second line creates a scalar which has both a string value, and a numeric value.) This prints: - seven=vii, seven=7, eight=8 - seven contains 'i' + seven=vii, seven=7, eight=8 + seven contains 'i' =head2 Two-face References Suppose you want to create an object which is accessible as both an array reference and a hash reference. - package two_refs; - use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} }; - sub new { - my $p = shift; - bless \ [@_], $p; - } - sub gethash { - my %h; - my $self = shift; - tie %h, ref $self, $self; - \%h; - } - - sub TIEHASH { my $p = shift; bless \ shift, $p } - my %fields; - my $i = 0; - $fields{$_} = $i++ foreach qw{zero one two three}; - sub STORE { - my $self = ${shift()}; - my $key = $fields{shift()}; - defined $key or die "Out of band access"; - $$self->[$key] = shift; - } - sub FETCH { - my $self = ${shift()}; - my $key = $fields{shift()}; - defined $key or die "Out of band access"; - $$self->[$key]; - } + package two_refs; + use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} }; + sub new { + my $p = shift; + bless \ [@_], $p; + } + sub gethash { + my %h; + my $self = shift; + tie %h, ref $self, $self; + \%h; + } + + sub TIEHASH { my $p = shift; bless \ shift, $p } + my %fields; + my $i = 0; + $fields{$_} = $i++ foreach qw{zero one two three}; + sub STORE { + my $self = ${shift()}; + my $key = $fields{shift()}; + defined $key or die "Out of band access"; + $$self->[$key] = shift; + } + sub FETCH { + my $self = ${shift()}; + my $key = $fields{shift()}; + defined $key or die "Out of band access"; + $$self->[$key]; + } Now one can access an object using both the array and hash syntax: - my $bar = two_refs->new(3,4,5,6); - $bar->[2] = 11; - $bar->{two} == 11 or die 'bad hash fetch'; + my $bar = two_refs->new(3,4,5,6); + $bar->[2] = 11; + $bar->{two} == 11 or die 'bad hash fetch'; Note several important features of this example. First of all, the I type of $bar is a scalar reference, and we do not overload @@ -1163,51 +1161,53 @@ hash itself, the only problem one has to this I hash (as opposed to the I hash exhibited by the overloaded dereference operator). Here is one possible fetching routine: - sub access_hash { - my ($self, $key) = (shift, shift); - my $class = ref $self; - bless $self, 'overload::dummy'; # Disable overloading of %{} - my $out = $self->{$key}; - bless $self, $class; # Restore overloading - $out; - } + sub access_hash { + my ($self, $key) = (shift, shift); + my $class = ref $self; + bless $self, 'overload::dummy'; # Disable overloading of %{} + my $out = $self->{$key}; + bless $self, $class; # Restore overloading + $out; + } To remove creation of the tied hash on each access, one may an extra level of indirection which allows a non-circular structure of references: - package two_refs1; - use overload '%{}' => sub { ${shift()}->[1] }, - '@{}' => sub { ${shift()}->[0] }; - sub new { - my $p = shift; - my $a = [@_]; - my %h; - tie %h, $p, $a; - bless \ [$a, \%h], $p; - } - sub gethash { - my %h; - my $self = shift; - tie %h, ref $self, $self; - \%h; - } - - sub TIEHASH { my $p = shift; bless \ shift, $p } - my %fields; - my $i = 0; - $fields{$_} = $i++ foreach qw{zero one two three}; - sub STORE { - my $a = ${shift()}; - my $key = $fields{shift()}; - defined $key or die "Out of band access"; - $a->[$key] = shift; - } - sub FETCH { - my $a = ${shift()}; - my $key = $fields{shift()}; - defined $key or die "Out of band access"; - $a->[$key]; - } + package two_refs1; + use overload + '%{}' => sub { ${shift()}->[1] }, + '@{}' => sub { ${shift()}->[0] }; + + sub new { + my $p = shift; + my $a = [@_]; + my %h; + tie %h, $p, $a; + bless \ [$a, \%h], $p; + } + sub gethash { + my %h; + my $self = shift; + tie %h, ref $self, $self; + \%h; + } + + sub TIEHASH { my $p = shift; bless \ shift, $p } + my %fields; + my $i = 0; + $fields{$_} = $i++ foreach qw{zero one two three}; + sub STORE { + my $a = ${shift()}; + my $key = $fields{shift()}; + defined $key or die "Out of band access"; + $a->[$key] = shift; + } + sub FETCH { + my $a = ${shift()}; + my $key = $fields{shift()}; + defined $key or die "Out of band access"; + $a->[$key]; + } Now if $baz is overloaded like this, then C<$baz> is a reference to a reference to the intermediate array, which keeps a reference to an @@ -1233,15 +1233,15 @@ overloaded operations. Put this in F in your Perl library directory: - package symbolic; # Primitive symbolic calculator - use overload nomethod => \&wrap; + package symbolic; # Primitive symbolic calculator + use overload nomethod => \&wrap; - sub new { shift; bless ['n', @_] } - sub wrap { - my ($obj, $other, $inv, $meth) = @_; - ($obj, $other) = ($other, $obj) if $inv; - bless [$meth, $obj, $other]; - } + sub new { shift; bless ['n', @_] } + sub wrap { + my ($obj, $other, $inv, $meth) = @_; + ($obj, $other) = ($other, $obj) if $inv; + bless [$meth, $obj, $other]; + } This module is very unusual as overloaded modules go: it does not provide any usual overloaded operators, instead it provides an @@ -1253,20 +1253,20 @@ symbolic->new(3) >> contains C<['+', 2, Here is an example of the script which "calculates" the side of circumscribed octagon using the above package: - require symbolic; - my $iter = 1; # 2**($iter+2) = 8 - my $side = symbolic->new(1); - my $cnt = $iter; - - while ($cnt--) { - $side = (sqrt(1 + $side**2) - 1)/$side; - } - print "OK\n"; + require symbolic; + my $iter = 1; # 2**($iter+2) = 8 + my $side = symbolic->new(1); + my $cnt = $iter; + + while ($cnt--) { + $side = (sqrt(1 + $side**2) - 1)/$side; + } + print "OK\n"; The value of $side is - ['/', ['-', ['sqrt', ['+', 1, ['**', ['n', 1], 2]], - undef], 1], ['n', 1]] + ['/', ['-', ['sqrt', ['+', 1, ['**', ['n', 1], 2]], + undef], 1], ['n', 1]] Note that while we obtained this value using a nice little script, there is no simple way to I this value. In fact this value may @@ -1280,18 +1280,18 @@ again of type C, which will le Add a pretty-printer method to the module F: - sub pretty { - my ($meth, $a, $b) = @{+shift}; - $a = 'u' unless defined $a; - $b = 'u' unless defined $b; - $a = $a->pretty if ref $a; - $b = $b->pretty if ref $b; - "[$meth $a $b]"; - } + sub pretty { + my ($meth, $a, $b) = @{+shift}; + $a = 'u' unless defined $a; + $b = 'u' unless defined $b; + $a = $a->pretty if ref $a; + $b = $b->pretty if ref $b; + "[$meth $a $b]"; + } Now one can finish the script by - print "side = ", $side->pretty, "\n"; + print "side = ", $side->pretty, "\n"; The method C is doing object-to-string conversion, so it is natural to overload the operator C<""> using this method. However, @@ -1302,21 +1302,21 @@ and $b. If these components use overloa will look for an overloaded operator C<.>; if not present, it will look for an overloaded operator C<"">. Thus it is enough to use - use overload nomethod => \&wrap, '""' => \&str; - sub str { - my ($meth, $a, $b) = @{+shift}; - $a = 'u' unless defined $a; - $b = 'u' unless defined $b; - "[$meth $a $b]"; - } + use overload nomethod => \&wrap, '""' => \&str; + sub str { + my ($meth, $a, $b) = @{+shift}; + $a = 'u' unless defined $a; + $b = 'u' unless defined $b; + "[$meth $a $b]"; + } Now one can change the last line of the script to - print "side = $side\n"; + print "side = $side\n"; which outputs - side = [/ [- [sqrt [+ 1 [** [n 1 u] 2]] u] 1] [n 1 u]] + side = [/ [- [sqrt [+ 1 [** [n 1 u] 2]] u] 1] [n 1 u]] and one can inspect the value in debugger using all the possible methods. @@ -1335,41 +1335,42 @@ conversion routine. Here is the text of F with such a routine added (and slightly modified str()): - package symbolic; # Primitive symbolic calculator - use overload - nomethod => \&wrap, '""' => \&str, '0+' => \# - - sub new { shift; bless ['n', @_] } - sub wrap { - my ($obj, $other, $inv, $meth) = @_; - ($obj, $other) = ($other, $obj) if $inv; - bless [$meth, $obj, $other]; - } - sub str { - my ($meth, $a, $b) = @{+shift}; - $a = 'u' unless defined $a; - if (defined $b) { - "[$meth $a $b]"; - } else { - "[$meth $a]"; - } - } - my %subr = ( n => sub {$_[0]}, - sqrt => sub {sqrt $_[0]}, - '-' => sub {shift() - shift()}, - '+' => sub {shift() + shift()}, - '/' => sub {shift() / shift()}, - '*' => sub {shift() * shift()}, - '**' => sub {shift() ** shift()}, - ); - sub num { - my ($meth, $a, $b) = @{+shift}; - my $subr = $subr{$meth} - or die "Do not know how to ($meth) in symbolic"; - $a = $a->num if ref $a eq __PACKAGE__; - $b = $b->num if ref $b eq __PACKAGE__; - $subr->($a,$b); - } + package symbolic; # Primitive symbolic calculator + use overload + nomethod => \&wrap, '""' => \&str, '0+' => \# + + sub new { shift; bless ['n', @_] } + sub wrap { + my ($obj, $other, $inv, $meth) = @_; + ($obj, $other) = ($other, $obj) if $inv; + bless [$meth, $obj, $other]; + } + sub str { + my ($meth, $a, $b) = @{+shift}; + $a = 'u' unless defined $a; + if (defined $b) { + "[$meth $a $b]"; + } else { + "[$meth $a]"; + } + } + my %subr = ( + n => sub {$_[0]}, + sqrt => sub {sqrt $_[0]}, + '-' => sub {shift() - shift()}, + '+' => sub {shift() + shift()}, + '/' => sub {shift() / shift()}, + '*' => sub {shift() * shift()}, + '**' => sub {shift() ** shift()}, + ); + sub num { + my ($meth, $a, $b) = @{+shift}; + my $subr = $subr{$meth} + or die "Do not know how to ($meth) in symbolic"; + $a = $a->num if ref $a eq __PACKAGE__; + $b = $b->num if ref $b eq __PACKAGE__; + $subr->($a,$b); + } All the work of numeric conversion is done in %subr and num(). Of course, %subr is not complete, it contains only operators used in the @@ -1378,24 +1379,24 @@ explicit recursion in num()? (Answer is Use this module like this: - require symbolic; - my $iter = symbolic->new(2); # 16-gon - my $side = symbolic->new(1); - my $cnt = $iter; - - while ($cnt) { - $cnt = $cnt - 1; # Mutator '--' not implemented - $side = (sqrt(1 + $side**2) - 1)/$side; - } - printf "%s=%f\n", $side, $side; - printf "pi=%f\n", $side*(2**($iter+2)); + require symbolic; + my $iter = symbolic->new(2); # 16-gon + my $side = symbolic->new(1); + my $cnt = $iter; + + while ($cnt) { + $cnt = $cnt - 1; # Mutator '--' not implemented + $side = (sqrt(1 + $side**2) - 1)/$side; + } + printf "%s=%f\n", $side, $side; + printf "pi=%f\n", $side*(2**($iter+2)); It prints (without so many line breaks) - [/ [- [sqrt [+ 1 [** [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] - [n 1]] 2]]] 1] - [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] [n 1]]]=0.198912 - pi=3.182598 + [/ [- [sqrt [+ 1 [** [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] + [n 1]] 2]]] 1] + [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] [n 1]]]=0.198912 + pi=3.182598 The above module is very primitive. It does not implement mutator methods (C<++>, C<-=> and so on), does not do deep copying @@ -1405,18 +1406,18 @@ operations which are used in the example To implement most arithmetic operations is easy; one should just use the tables of operations, and change the code which fills %subr to - my %subr = ( 'n' => sub {$_[0]} ); - foreach my $op (split " ", $overload::ops{with_assign}) { - $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}"; - } - my @bins = qw(binary 3way_comparison num_comparison str_comparison); - foreach my $op (split " ", "@overload::ops{ @bins }") { - $subr{$op} = eval "sub {shift() $op shift()}"; - } - foreach my $op (split " ", "@overload::ops{qw(unary func)}") { - print "defining '$op'\n"; - $subr{$op} = eval "sub {$op shift()}"; - } + my %subr = ( 'n' => sub {$_[0]} ); + foreach my $op (split " ", $overload::ops{with_assign}) { + $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}"; + } + my @bins = qw(binary 3way_comparison num_comparison str_comparison); + foreach my $op (split " ", "@overload::ops{ @bins }") { + $subr{$op} = eval "sub {shift() $op shift()}"; + } + foreach my $op (split " ", "@overload::ops{qw(unary func)}") { + print "defining '$op'\n"; + $subr{$op} = eval "sub {$op shift()}"; + } Since subroutines implementing assignment operators are not required to modify their operands (see L above), @@ -1430,42 +1431,42 @@ To implement a copy constructor, add C<< line, and code (this code assumes that mutators change things one level deep only, so recursive copying is not needed): - sub cpy { - my $self = shift; - bless [@$self], ref $self; - } + sub cpy { + my $self = shift; + bless [@$self], ref $self; + } To make C<++> and C<--> work, we need to implement actual mutators, either directly, or in C. We continue to do things inside C, thus add if ($meth eq '++' or $meth eq '--') { - @$obj = ($meth, (bless [@$obj]), 1); # Avoid circular reference - return $obj; + @$obj = ($meth, (bless [@$obj]), 1); # Avoid circular reference + return $obj; } after the first line of wrap(). This is not a most effective implementation, one may consider - sub inc { $_[0] = bless ['++', shift, 1]; } + sub inc { $_[0] = bless ['++', shift, 1]; } instead. As a final remark, note that one can fill %subr by - my %subr = ( 'n' => sub {$_[0]} ); - foreach my $op (split " ", $overload::ops{with_assign}) { - $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}"; - } - my @bins = qw(binary 3way_comparison num_comparison str_comparison); - foreach my $op (split " ", "@overload::ops{ @bins }") { - $subr{$op} = eval "sub {shift() $op shift()}"; - } - foreach my $op (split " ", "@overload::ops{qw(unary func)}") { - $subr{$op} = eval "sub {$op shift()}"; - } - $subr{'++'} = $subr{'+'}; - $subr{'--'} = $subr{'-'}; + my %subr = ( 'n' => sub {$_[0]} ); + foreach my $op (split " ", $overload::ops{with_assign}) { + $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}"; + } + my @bins = qw(binary 3way_comparison num_comparison str_comparison); + foreach my $op (split " ", "@overload::ops{ @bins }") { + $subr{$op} = eval "sub {shift() $op shift()}"; + } + foreach my $op (split " ", "@overload::ops{qw(unary func)}") { + $subr{$op} = eval "sub {$op shift()}"; + } + $subr{'++'} = $subr{'+'}; + $subr{'--'} = $subr{'-'}; This finishes implementation of a primitive symbolic calculator in 50 lines of Perl code. Since the numeric values of subexpressions @@ -1494,21 +1495,21 @@ until the value is I. To see it in action, add a method - sub STORE { - my $obj = shift; - $#$obj = 1; - @$obj->[0,1] = ('=', shift); - } + sub STORE { + my $obj = shift; + $#$obj = 1; + @$obj->[0,1] = ('=', shift); + } to the package C. After this change one can do - my $a = symbolic->new(3); - my $b = symbolic->new(4); - my $c = sqrt($a**2 + $b**2); + my $a = symbolic->new(3); + my $b = symbolic->new(4); + my $c = sqrt($a**2 + $b**2); and the numeric value of $c becomes 5. However, after calling - $a->STORE(12); $b->STORE(5); + $a->STORE(12); $b->STORE(5); the numeric value of $c becomes 13. There is no doubt now that the module symbolic provides a I calculator indeed. @@ -1516,35 +1517,35 @@ symbolic provides a I calculat To hide the rough edges under the hood, provide a tie()d interface to the package C. Add methods - sub TIESCALAR { my $pack = shift; $pack->new(@_) } - sub FETCH { shift } - sub nop { } # Around a bug + sub TIESCALAR { my $pack = shift; $pack->new(@_) } + sub FETCH { shift } + sub nop { } # Around a bug (the bug, fixed in Perl 5.14, is described in L<"BUGS">). One can use this new interface as - tie $a, 'symbolic', 3; - tie $b, 'symbolic', 4; - $a->nop; $b->nop; # Around a bug + tie $a, 'symbolic', 3; + tie $b, 'symbolic', 4; + $a->nop; $b->nop; # Around a bug - my $c = sqrt($a**2 + $b**2); + my $c = sqrt($a**2 + $b**2); Now numeric value of $c is 5. After C<$a = 12; $b = 5> the numeric value of $c becomes 13. To insulate the user of the module add a method - sub vars { my $p = shift; tie($_, $p), $_->nop foreach @_; } + sub vars { my $p = shift; tie($_, $p), $_->nop foreach @_; } Now - my ($a, $b); - symbolic->vars($a, $b); - my $c = sqrt($a**2 + $b**2); + my ($a, $b); + symbolic->vars($a, $b); + my $c = sqrt($a**2 + $b**2); - $a = 3; $b = 4; - printf "c5 %s=%f\n", $c, $c; + $a = 3; $b = 4; + printf "c5 %s=%f\n", $c, $c; - $a = 12; $b = 5; - printf "c13 %s=%f\n", $c, $c; + $a = 12; $b = 5; + printf "c13 %s=%f\n", $c, $c; shows that the numeric value of $c follows changes to the values of $a and $b. @@ -1607,11 +1608,11 @@ A pitfall when fallback is TRUE and Perl implementation of an operator is that some operators have more than one semantic, for example C<|>: - use overload '0+' => sub { $_[0]->{n}; }, - fallback => 1; - my $x = bless { n => 4 }, "main"; - my $y = bless { n => 8 }, "main"; - print $x | $y, "\n"; + use overload '0+' => sub { $_[0]->{n}; }, + fallback => 1; + my $x = bless { n => 4 }, "main"; + my $y = bless { n => 8 }, "main"; + print $x | $y, "\n"; You might expect this to output "12". In fact, it prints "<": the ASCII result of treating "|" @@ -1697,3 +1698,4 @@ The range operator C<..> cannot be overl =cut +# ex: set ts=8 sts=4 sw=4 et: Index: gnu/usr.bin/perl/lib/overload.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/overload.t,v diff -u -p -a -u -p -r1.6 overload.t --- gnu/usr.bin/perl/lib/overload.t 15 Feb 2023 01:36:33 -0000 1.6 +++ gnu/usr.bin/perl/lib/overload.t 21 Feb 2024 15:47:02 -0000 @@ -1100,7 +1100,7 @@ is("a$utfvar", "a".200.2.1); # 224 - ove # were to eval the overload code in the caller's namespace, the privatisation # would be quite transparent. package Hderef; -use overload '%{}' => sub { (caller(0))[0] eq 'Foo' ? $_[0] : die "zap" }; +use overload '%{}' => sub { caller(0) eq 'Foo' ? $_[0] : die "zap" }; package Foo; @Foo::ISA = 'Hderef'; sub new { bless {}, shift } @@ -1906,11 +1906,11 @@ foreach my $op (qw(<=> == != < <= > >=)) # eval should do tie, overload on its arg before checking taint */ push @tests, [ '1;', 'eval q(eval %s); $@ =~ /Insecure/', - '("")', '("")', [ 1, 2, 0 ], 0 ]; + '("")', '("")', [ 1, 1, 0 ], 0 ]; for my $sub (keys %subs) { - no warnings 'experimental::smartmatch'; + no warnings 'deprecated'; my $term = $subs{$sub}; my $t = sprintf $term, '$_[0][0]'; my $e ="sub { \$funcs .= '($sub)'; my \$r; if (\$use_int) {" @@ -1952,7 +1952,7 @@ foreach my $op (qw(<=> == != < <= > >=)) ? "-\$_[0][0]" : "$_[3](\$_[0][0])"; my $r; - no warnings 'experimental::smartmatch'; + no warnings 'deprecated'; if ($use_int) { use integer; $r = eval $e; } @@ -1999,7 +1999,7 @@ foreach my $op (qw(<=> == != < <= > >=)) $use_int = ($int ne ''); my $plain = $tainted_val; my $plain_term = $int . sprintf $sub_term, '$plain'; - my $exp = do {no warnings 'experimental::smartmatch'; eval $plain_term }; + my $exp = do {no warnings 'deprecated'; eval $plain_term }; diag("eval of plain_term <$plain_term> gave <$@>") if $@; SKIP: { is_if_taint_supported(tainted($exp), $exp_taint, @@ -2029,7 +2029,7 @@ foreach my $op (qw(<=> == != < <= > >=)) my $res_term = $int . sprintf $sub_term, $var; my $desc = "<$res_term> $ov_pkg" ; - my $res = do { no warnings 'experimental::smartmatch'; eval $res_term }; + my $res = do { no warnings 'deprecated'; eval $res_term }; diag("eval of res_term $desc gave <$@>") if $@; # uniquely, the inc/dec ops return the original # ref rather than a copy, so stringify it to Index: gnu/usr.bin/perl/lib/perl5db.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/perl5db.pl,v diff -u -p -a -u -p -r1.27 perl5db.pl --- gnu/usr.bin/perl/lib/perl5db.pl 15 Feb 2023 01:38:22 -0000 1.27 +++ gnu/usr.bin/perl/lib/perl5db.pl 21 Feb 2024 15:47:02 -0000 @@ -532,7 +532,7 @@ BEGIN { use vars qw($VERSION $header); # bump to X.XX in blead, only use X.XX_XX in maint -$VERSION = '1.73'; +$VERSION = '1.77'; $header = "perl5db.pl version $VERSION"; @@ -3272,7 +3272,7 @@ deal with them instead of processing the =head4 C - List lexicals in higher scope Uses C to find the lexicals supplied as arguments in a scope -above the current one and then displays then using C. +above the current one and then displays them using F. =head3 COMMANDS NOT WORKING AFTER PROGRAM ENDS @@ -3504,7 +3504,9 @@ again. =cut # No more commands? Quit. - $fall_off_end = 1 unless defined $cmd; # Emulate 'q' on EOF + unless (defined $cmd) { + DB::Obj::_do_quit(); + } # Evaluate post-prompt commands. foreach $evalarg (@$post) { @@ -4308,13 +4310,17 @@ sub _handle_x_command { return; } +sub _do_quit { + $fall_off_end = 1; + DB::clean_ENV(); + exit $?; +} + sub _handle_q_command { my $self = shift; if ($self->_is_full('q')) { - $fall_off_end = 1; - DB::clean_ENV(); - exit $?; + _do_quit(); } return; @@ -8202,7 +8208,7 @@ B<|>I Run debugger command B<||>I Same as B<|>I but DB::OUT is temporarily select()ed as well. B<\=> [I I] Define a command alias, or list current aliases. I Execute as a perl statement in current package. -B Pure-man-restart of debugger, some of debugger state +B Poor man's restart of the debugger, some of debugger state and command-line options may be lost. Currently the following settings are preserved: history, breakpoints and actions, debugger Bptions @@ -8378,7 +8384,7 @@ B<||>I Same as B<|>I [I I] Define a command alias, or list current aliases. I Execute as a perl statement in current package. B Show versions of loaded modules. -B Pure-man-restart of debugger, some of debugger state +B Poor man's restart of the debugger, some of debugger state and command-line options may be lost. Currently the following settings are preserved: history, breakpoints and actions, debugger Bptions @@ -10388,7 +10394,8 @@ sub cmd_prepost { Contains the C routine that the debugger uses to issue the C message after the program completes. See -the C block documentation for more details. +the L|/END PROCESSING - THE END BLOCK> block documentation for more +details. =cut Index: gnu/usr.bin/perl/lib/perl5db.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/perl5db.t,v diff -u -p -a -u -p -r1.6 perl5db.t --- gnu/usr.bin/perl/lib/perl5db.t 15 Feb 2023 01:36:33 -0000 1.6 +++ gnu/usr.bin/perl/lib/perl5db.t 21 Feb 2024 15:47:02 -0000 @@ -404,9 +404,11 @@ results. =head1 DESCRIPTION -DebugWrap is a simple class that executes a set of debugger commands -against a program under the debugger and provides some simple methods -to examine the results. +DebugWrap is a simple class used when testing the Perl debugger that +executes a set of debugger commands against a program under the +debugger and provides some simple methods to examine the results. + +It is not installed to your system. =head2 Creating a DebugWrap object @@ -459,7 +461,7 @@ include the output from the program unde Test that the debugger output matches the given regular expression object (as with qr//). -Equivelent to: +Equivalent to: like($wrapper->get_contents, $re, $test_name); @@ -468,7 +470,7 @@ Equivelent to: Test that the debugger output does not match the given regular expression object (as with qr//). -Equivelent to: +Equivalent to: unlike($wrapper->get_contents, $re, $test_name); @@ -484,7 +486,7 @@ capturing stderr. Test that the program output matches the given regular expression object (as with qr//). -Equivelent to: +Equivalent to: like($wrapper->get_output, $re, $test_name); @@ -493,7 +495,7 @@ Equivelent to: Test that the program output does not match the given regular expression object (as with qr//). -Equivelent to: +Equivalent to: unlike($wrapper->get_output, $re, $test_name); Index: gnu/usr.bin/perl/lib/perlbug.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/perlbug.t,v diff -u -p -a -u -p -r1.1.1.2 perlbug.t --- gnu/usr.bin/perl/lib/perlbug.t 1 Mar 2021 23:15:57 -0000 1.1.1.2 +++ gnu/usr.bin/perl/lib/perlbug.t 21 Feb 2024 15:47:02 -0000 @@ -148,7 +148,12 @@ my $maxlen1 = 0; # body my $maxlen2 = 0; # attachment for (split(/\n/, $contents)) { my $len = length; - $maxlen1 = $len if $len > $maxlen1 and !/$B/; + # content lines setting path-like environment variables like PATH, PERLBREW_PATH, MANPATH,... + # will start "\s*xxxxPATH=" where "xxx" is zero or more non white space characters. These lines can + # easily get over 1000 characters (see ok-test below) with no internal spaces, so they + # will not get wrapped at white space. + # See also https://github.com/perl/perl5/issues/15544 for more information + $maxlen1 = $len if $len > $maxlen1 and !/(?:$B|^\s*\S*PATH=)/; $maxlen2 = $len if $len > $maxlen2 and /$B/; } ok($maxlen1 < 1000, "[perl #128020] long body lines are wrapped: maxlen $maxlen1"); Index: gnu/usr.bin/perl/lib/utf8.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/utf8.pm,v diff -u -p -a -u -p -r1.5 utf8.pm --- gnu/usr.bin/perl/lib/utf8.pm 15 Feb 2023 01:36:33 -0000 1.5 +++ gnu/usr.bin/perl/lib/utf8.pm 21 Feb 2024 15:47:02 -0000 @@ -5,7 +5,7 @@ use warnings; our $hint_bits = 0x00800000; -our $VERSION = '1.24'; +our $VERSION = '1.25'; our $AUTOLOAD; sub import { @@ -114,6 +114,8 @@ sequence in the native encoding (Latin-1 logical character sequence itself is unchanged. If I<$string> is already upgraded, then this is a no-op. Returns the number of octets necessary to represent the string as UTF-8. +Since Perl v5.38, if C<$string> is C no action is taken; prior to that, +it would be converted to be defined and zero-length. If your code needs to be compatible with versions of perl without C, you can force Unicode semantics on Index: gnu/usr.bin/perl/lib/utf8.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/utf8.t,v diff -u -p -a -u -p -r1.11 utf8.t --- gnu/usr.bin/perl/lib/utf8.t 13 Feb 2019 21:15:25 -0000 1.11 +++ gnu/usr.bin/perl/lib/utf8.t 21 Feb 2024 15:47:02 -0000 @@ -669,6 +669,9 @@ for(__PACKAGE__) { eval { utf8::upgrade($_) }; is $@, "", 'no error with utf8::upgrade on read-only COW'; } + +is(utf8::upgrade(undef), undef, "Returns undef for undef input"); # GH #20419 + # This one croaks, but not because the scalar is read-only eval "package \x{100};\n" . <<'END' for(__PACKAGE__) { Index: gnu/usr.bin/perl/lib/warnings.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/warnings.pm,v diff -u -p -a -u -p -r1.6 warnings.pm --- gnu/usr.bin/perl/lib/warnings.pm 15 Feb 2023 01:36:33 -0000 1.6 +++ gnu/usr.bin/perl/lib/warnings.pm 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# -*- buffer-read-only: t -*- +# -*- mode: Perl; buffer-read-only: t -*- # !!!!!!! DO NOT EDIT THIS FILE !!!!!!! # This file is built by regen/warnings.pl. # Any changes made here will be lost! package warnings; -our $VERSION = "1.58"; +our $VERSION = "1.65"; # Verify that we're called correctly so that warnings will work. # Can't use Carp, since Carp uses us! @@ -68,57 +68,69 @@ our %Offsets = ( 'imprecision' => 92, 'illegalproto' => 94, + # Warnings Categories added in Perl 5.011003 + 'deprecated::goto_construct' => 96, + 'deprecated::unicode_property_name' => 98, + # Warnings Categories added in Perl 5.013 - 'non_unicode' => 96, - 'nonchar' => 98, - 'surrogate' => 100, + 'non_unicode' => 100, + 'nonchar' => 102, + 'surrogate' => 104, # Warnings Categories added in Perl 5.017 - 'experimental' => 102, - 'experimental::lexical_subs' => 104, - 'experimental::regex_sets' => 106, - 'experimental::smartmatch' => 108, + 'experimental' => 106, + 'experimental::regex_sets' => 108, # Warnings Categories added in Perl 5.019 - 'experimental::postderef' => 110, - 'experimental::signatures' => 112, - 'syscalls' => 114, + 'syscalls' => 110, # Warnings Categories added in Perl 5.021 - 'experimental::bitwise' => 116, - 'experimental::const_attr' => 118, - 'experimental::re_strict' => 120, - 'experimental::refaliasing' => 122, - 'locale' => 124, - 'missing' => 126, - 'redundant' => 128, + 'experimental::const_attr' => 112, + 'experimental::re_strict' => 114, + 'experimental::refaliasing' => 116, + 'locale' => 118, + 'missing' => 120, + 'redundant' => 122, # Warnings Categories added in Perl 5.025 - 'experimental::declared_refs' => 130, + 'experimental::declared_refs' => 124, + + # Warnings Categories added in Perl 5.025011 + 'deprecated::dot_in_inc' => 126, # Warnings Categories added in Perl 5.027 - 'experimental::alpha_assertions' => 132, - 'experimental::script_run' => 134, - 'shadow' => 136, + 'shadow' => 128, # Warnings Categories added in Perl 5.029 - 'experimental::private_use' => 138, - 'experimental::uniprop_wildcards' => 140, - 'experimental::vlb' => 142, - - # Warnings Categories added in Perl 5.031 - 'experimental::isa' => 144, + 'experimental::private_use' => 130, + 'experimental::uniprop_wildcards' => 132, + 'experimental::vlb' => 134, # Warnings Categories added in Perl 5.033 - 'experimental::try' => 146, + 'experimental::try' => 136, # Warnings Categories added in Perl 5.035 - 'experimental::args_array_with_signatures'=> 148, - 'experimental::builtin' => 150, - 'experimental::defer' => 152, - 'experimental::extra_paired_delimiters'=> 154, - 'experimental::for_list' => 156, - 'scalar' => 158, + 'experimental::args_array_with_signatures'=> 138, + 'experimental::builtin' => 140, + 'experimental::defer' => 142, + 'experimental::extra_paired_delimiters'=> 144, + 'experimental::for_list' => 146, + 'scalar' => 148, + + # Warnings Categories added in Perl 5.035009 + 'deprecated::version_downgrade' => 150, + + # Warnings Categories added in Perl 5.03501 + 'deprecated::delimiter_will_be_paired'=> 152, + + # Warnings Categories added in Perl 5.037 + 'experimental::class' => 154, + + # Warnings Categories added in Perl 5.037009 + 'deprecated::apostrophe_as_package_separator'=> 156, + + # Warnings Categories added in Perl 5.03701 + 'deprecated::smartmatch' => 158, ); our %Bits = ( @@ -128,47 +140,47 @@ our %Bits = ( 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2] + 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x40\x00\x00\x40\x51", # [2,48,49,63,75,76,78,79] + 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [78] + 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76] + 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [63] + 'deprecated::goto_construct' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [48] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40", # [79] + 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [49] + 'deprecated::version_downgrade' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x55\x51\x05\x54\x54\x55\x15", # [51..56,58..61,65..67,69..78] - 'experimental::alpha_assertions' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [66] - 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [74] - 'experimental::bitwise' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [58] - 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75] - 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [59] - 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [65] - 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76] - 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [77] - 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [78] - 'experimental::isa' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [72] - 'experimental::lexical_subs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [52] - 'experimental::postderef' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [55] - 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [69] - 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [60] - 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [61] - 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [53] - 'experimental::script_run' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [67] - 'experimental::signatures' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [56] - 'experimental::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [54] - 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [73] - 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [70] - 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [71] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x15\x10\x54\x55\x05\x04", # [53,54,56..58,62,65..73,77] + 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [69] + 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [70] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [77] + 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [56] + 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [62] + 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [71] + 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [72] + 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [73] + 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [65] + 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [57] + 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [58] + 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [54] + 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [68] + 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [66] + 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [67] 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [47] 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [46] 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] - 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [5..11,57] + 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [5..11,55] 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] - 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [62] + 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [59] 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] - 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [63] + 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [60] 'newline' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] - 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [48] - 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [49] + 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [50] + 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [51] 'numeric' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] 'once' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] 'overflow' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] @@ -182,25 +194,25 @@ our %Bits = ( 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36] 'recursion' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] 'redefine' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] - 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [64] + 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [61] 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] - 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40", # [79] + 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [74] 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] - 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [68] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [64] 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] - 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [50] + 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [52] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [57] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [55] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [41] 'unopened' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [42] 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [43] - 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x15\x00\x00\x00\x00\x00\x00\x00", # [44,48..50] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x50\x01\x00\x00\x00\x00\x00\x00", # [44,50..52] 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [45] ); @@ -211,47 +223,47 @@ our %DeadBits = ( 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2] + 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x80\x00\x00\x80\xa2", # [2,48,49,63,75,76,78,79] + 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [78] + 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76] + 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [63] + 'deprecated::goto_construct' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [48] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80", # [79] + 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [49] + 'deprecated::version_downgrade' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xaa\xa2\x0a\xa8\xa8\xaa\x2a", # [51..56,58..61,65..67,69..78] - 'experimental::alpha_assertions' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [66] - 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [74] - 'experimental::bitwise' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [58] - 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75] - 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [59] - 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [65] - 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76] - 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [77] - 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [78] - 'experimental::isa' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [72] - 'experimental::lexical_subs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [52] - 'experimental::postderef' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [55] - 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [69] - 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [60] - 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [61] - 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [53] - 'experimental::script_run' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [67] - 'experimental::signatures' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [56] - 'experimental::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [54] - 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [73] - 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [70] - 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [71] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x2a\x20\xa8\xaa\x0a\x08", # [53,54,56..58,62,65..73,77] + 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [69] + 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [70] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [77] + 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [56] + 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [62] + 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [71] + 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [72] + 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [73] + 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [65] + 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [57] + 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [58] + 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [54] + 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [68] + 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [66] + 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [67] 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [47] 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [46] 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] - 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [5..11,57] + 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [5..11,55] 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] - 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [62] + 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [59] 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] - 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [63] + 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [60] 'newline' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] - 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [48] - 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [49] + 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [50] + 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [51] 'numeric' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] 'once' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] 'overflow' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] @@ -265,31 +277,42 @@ our %DeadBits = ( 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36] 'recursion' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] 'redefine' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] - 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [64] + 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [61] 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] - 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80", # [79] + 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [74] 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] - 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [68] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [64] 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] - 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [50] + 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [52] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [57] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [55] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [41] 'unopened' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [42] 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [43] - 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x2a\x00\x00\x00\x00\x00\x00\x00", # [44,48..50] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xa0\x02\x00\x00\x00\x00\x00\x00", # [44,50..52] 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [45] ); +our %NoOp = ( + 'experimental::alpha_assertions' => 1, + 'experimental::bitwise' => 1, + 'experimental::isa' => 1, + 'experimental::lexical_subs' => 1, + 'experimental::postderef' => 1, + 'experimental::script_run' => 1, + 'experimental::signatures' => 1, + 'experimental::smartmatch' => 1, +); + # These are used by various things, including our own tests our $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x51\x51\x15\x54\x54\x55\x15"; # [2,4,22,23,25,52,54..56,58..62,65..67,69..78] +our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x05\x00\x55\x50\x54\x55\x45\x55"; # [2,4,22,23,25,48,49,56..59,62,63,65..73,75..79] our $LAST_BIT = 160 ; our $BYTES = 20 ; @@ -328,6 +351,7 @@ sub _bits { $mask = _expand_bits($mask); foreach my $word ( @_ ) { + next if $NoOp{$word}; if ($word eq 'FATAL') { $fatal = 1; $no_fatal = 0; @@ -389,6 +413,7 @@ sub unimport $mask = _expand_bits($mask); foreach my $word ( @_ ) { + next if $NoOp{$word}; if ($word eq 'FATAL') { next; } @@ -449,7 +474,7 @@ sub __chk unless defined $offset; } else { - $category = (caller(1))[0] ; + $category = caller(1); $offset = $Offsets{$category}; Croaker("package '$category' not registered for warnings") unless defined $offset ; @@ -732,6 +757,13 @@ which is equivalent to: no warnings 'experimental'; use warnings 'experimental::somefeature'; +As experimental features become regular features of Perl, +the corresponding warnings are not printed anymore. +They also stop being listed in the L below. + +It is still possible to request turning on or off these warnings, +but doing so has no effect. + =head2 What's wrong with B<-w> and C<$^W> Although very useful, the big problem with using B<-w> on the command @@ -882,20 +914,32 @@ The current hierarchy is: | +- closure | - +- deprecated + +- deprecated ----+ + | | + | +- deprecated::apostrophe_as_package_separator + | | + | +- deprecated::delimiter_will_be_paired + | | + | +- deprecated::dot_in_inc + | | + | +- deprecated::goto_construct + | | + | +- deprecated::smartmatch + | | + | +- deprecated::unicode_property_name + | | + | +- deprecated::version_downgrade | +- exiting | +- experimental --+ | | - | +- experimental::alpha_assertions - | | | +- experimental::args_array_with_signatures | | - | +- experimental::bitwise - | | | +- experimental::builtin | | + | +- experimental::class + | | | +- experimental::const_attr | | | +- experimental::declared_refs @@ -906,12 +950,6 @@ The current hierarchy is: | | | +- experimental::for_list | | - | +- experimental::isa - | | - | +- experimental::lexical_subs - | | - | +- experimental::postderef - | | | +- experimental::private_use | | | +- experimental::re_strict @@ -920,12 +958,6 @@ The current hierarchy is: | | | +- experimental::regex_sets | | - | +- experimental::script_run - | | - | +- experimental::signatures - | | - | +- experimental::smartmatch - | | | +- experimental::try | | | +- experimental::uniprop_wildcards @@ -1460,4 +1492,4 @@ See also L =cut -# ex: set ro: +# ex: set ro ft=perl: Index: gnu/usr.bin/perl/lib/B/Deparse-core.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/B/Deparse-core.t,v diff -u -p -a -u -p -r1.5 Deparse-core.t --- gnu/usr.bin/perl/lib/B/Deparse-core.t 15 Feb 2023 01:36:33 -0000 1.5 +++ gnu/usr.bin/perl/lib/B/Deparse-core.t 21 Feb 2024 15:47:02 -0000 @@ -354,6 +354,7 @@ my %not_tested = map { $_ => 1} qw( __FILE__ __LINE__ __PACKAGE__ + ADJUST AUTOLOAD BEGIN CHECK @@ -363,10 +364,12 @@ my %not_tested = map { $_ => 1} qw( INIT UNITCHECK catch + class default defer else elsif + field finally for foreach @@ -374,6 +377,7 @@ my %not_tested = map { $_ => 1} qw( given if m + method no package q Index: gnu/usr.bin/perl/lib/B/Deparse.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/B/Deparse.pm,v diff -u -p -a -u -p -r1.6 Deparse.pm --- gnu/usr.bin/perl/lib/B/Deparse.pm 15 Feb 2023 01:36:33 -0000 1.6 +++ gnu/usr.bin/perl/lib/B/Deparse.pm 21 Feb 2024 15:47:02 -0000 @@ -7,14 +7,14 @@ # This is based on the module of the same name by Malcolm Beattie, # but essentially none of his code remains. -package B::Deparse; +package B::Deparse 1.74; use strict; use Carp; use B qw(class main_root main_start main_cv svref_2object opnumber perlstring OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD OPf_PARENS OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpKVSLICE - OPpCONST_BARE + OPpCONST_BARE OPpEMPTYAVHV_IS_HV OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER OPpREPEAT_DOLIST OPpSORT_REVERSE OPpMULTIDEREF_EXISTS OPpMULTIDEREF_DELETE @@ -23,12 +23,13 @@ use B qw(class main_root main_start main OPpCONCAT_NESTED OPpMULTICONCAT_APPEND OPpMULTICONCAT_STRINGIFY OPpMULTICONCAT_FAKE OPpTRUEBOOL OPpINDEX_BOOLNEG OPpDEFER_FINALLY - SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG - SVs_PADTMP SVpad_TYPED - CVf_METHOD CVf_LVALUE + OPpARG_IF_UNDEF OPpARG_IF_FALSE + SVf_IOK SVf_NOK SVf_ROK SVf_POK SVf_FAKE SVs_RMG SVs_SMG + SVs_PADTMP + CVf_NOWARN_AMBIGUOUS CVf_LVALUE PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED PMf_EXTENDED_MORE - PADNAMEt_OUTER + PADNAMEf_OUTER PADNAMEf_OUR PADNAMEf_TYPED MDEREF_reload MDEREF_AV_pop_rv2av_aelem MDEREF_AV_gvsv_vivify_rv2av_aelem @@ -53,7 +54,6 @@ use B qw(class main_root main_start main MDEREF_SHIFT ); -our $VERSION = '1.64'; our $AUTOLOAD; use warnings (); require feature; @@ -450,7 +450,7 @@ sub next_todo { my $flags = $name->FLAGS; my $category = !$cv || $seq <= $name->COP_SEQ_RANGE_LOW - ? $self->keyword($flags & SVpad_OUR + ? $self->keyword($flags & PADNAMEf_OUR ? "our" : $flags & SVpad_STATE ? "state" @@ -1121,8 +1121,8 @@ sub pad_subs { if (defined $name && $name =~ /^&./) { my $low = $_->COP_SEQ_RANGE_LOW; my $flags = $_->FLAGS; - my $outer = $flags & PADNAMEt_OUTER; - if ($flags & SVpad_OUR) { + my $outer = $flags & PADNAMEf_OUTER; + if ($flags & PADNAMEf_OUR) { push @todo, [$low, undef, 0, $_] # [seq, no cv, not format, padname] unless $outer; @@ -1135,7 +1135,7 @@ sub pad_subs { my $flags = $flags; my $cv = $cv; my $name = $_; - while ($flags & PADNAMEt_OUTER && class ($protocv) ne 'CV') + while ($flags & PADNAMEf_OUTER && class ($protocv) ne 'CV') { $cv = $cv->OUTSIDE; next PADENTRY if class($cv) eq 'SPECIAL'; # XXX freed? @@ -1152,7 +1152,7 @@ sub pad_subs { my $other = $protocv->PADLIST; $$other && $other->outid == $padlist->id; }; - if ($flags & PADNAMEt_OUTER) { + if ($flags & PADNAMEf_OUTER) { next unless $defined_in_this_sub; push @todo, [$protocv->OUTSIDE_SEQ, $protocv, 0, $_]; next; @@ -1262,7 +1262,10 @@ sub deparse_argops { return unless $$kid and $kid->name eq 'argdefelem'; my $def = $self->deparse($kid->first, 7); $def = "($def)" if $kid->first->flags & OPf_PARENS; - $var .= " = $def"; + my $assign = "="; + $assign = "//=" if $kid->private & OPpARG_IF_UNDEF; + $assign = "||=" if $kid->private & OPpARG_IF_FALSE; + $var .= " $assign $def"; } push @sig, $var; } @@ -1313,7 +1316,7 @@ Carp::confess("NULL in deparse_sub") if Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL"); local $self->{'curcop'} = $self->{'curcop'}; - my $has_sig = $self->{hinthash}{feature_signatures}; + my $has_sig = $self->feature_enabled('signatures'); if ($cv->FLAGS & SVf_POK) { my $myproto = $cv->PV; if ($has_sig) { @@ -1323,9 +1326,9 @@ Carp::confess("SPECIAL in deparse_sub") $proto = $myproto; } } - if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE|CVf_ANONCONST)) { + if ($cv->CvFLAGS & (CVf_NOWARN_AMBIGUOUS|CVf_LOCKED|CVf_LVALUE|CVf_ANONCONST)) { push @attrs, "lvalue" if $cv->CvFLAGS & CVf_LVALUE; - push @attrs, "method" if $cv->CvFLAGS & CVf_METHOD; + push @attrs, "method" if $cv->CvFLAGS & CVf_NOWARN_AMBIGUOUS; push @attrs, "const" if $cv->CvFLAGS & CVf_ANONCONST; } @@ -1551,7 +1554,7 @@ sub maybe_parens_func { if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) { return "$func($text)"; } else { - return "$func $text"; + return $func . (length($text) ? " $text" : ""); } } @@ -1561,7 +1564,7 @@ sub find_our_type { my $seq = $self->{'curcop'} ? $self->{'curcop'}->cop_seq : 0; for my $a (@{$self->{'curcvlex'}{"o$name"}}) { my ($st, undef, $padname) = @$a; - if ($st >= $seq && $padname->FLAGS & SVpad_TYPED) { + if ($st >= $seq && $padname->FLAGS & PADNAMEf_TYPED) { return $padname->SvSTASH->NAME; } } @@ -1647,7 +1650,7 @@ sub maybe_my { # because enteriter ops do not carry the flag. my $my = $self->keyword($padname->FLAGS & SVpad_STATE ? "state" : "my"); - if ($padname->FLAGS & SVpad_TYPED) { + if ($padname->FLAGS & PADNAMEf_TYPED) { $my .= ' ' . $padname->SvSTASH->NAME; } if ($need_parens) { @@ -1987,7 +1990,7 @@ sub populate_curcvlex { : ($ns[$i]->COP_SEQ_RANGE_LOW, $ns[$i]->COP_SEQ_RANGE_HIGH); push @{$self->{'curcvlex'}{ - ($ns[$i]->FLAGS & SVpad_OUR ? 'o' : 'm') . $name + ($ns[$i]->FLAGS & PADNAMEf_OUR ? 'o' : 'm') . $name }}, [$seq_st, $seq_en, $ns[$i]]; } } @@ -2331,6 +2334,7 @@ my %feature_keywords = ( catch => 'try', finally => 'try', defer => 'defer', + signatures => 'signatures', ); # keywords that are strong and also have a prototype @@ -2514,7 +2518,21 @@ sub pp_chomp { maybe_targmy(@_, \&unop, sub pp_schop { maybe_targmy(@_, \&unop, "chop") } sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") } sub pp_defined { unop(@_, "defined") } -sub pp_undef { unop(@_, "undef") } +sub pp_undef { + if ($_[1]->private & OPpTARGET_MY) { + my $targ = $_[1]->targ; + my $var = $_[0]->maybe_my($_[1], $_[2], $_[0]->padname($targ), + $_[0]->padname_sv($targ), + 1); + my $func = unop(@_, "undef"); + if ($func =~ /\s/) { + return unop(@_, "undef").$var; + } else { + return "$var = undef"; + } + } + unop(@_, "undef") +} sub pp_study { unop(@_, "study") } sub pp_ref { unop(@_, "ref") } sub pp_pos { maybe_local(@_, unop(@_, "pos")) } @@ -2772,19 +2790,40 @@ sub pp_anonlist { *pp_anonhash = \&pp_anonlist; +sub pp_emptyavhv { + my $self = shift; + my ($op, $cx, $forbid_parens) = @_; + my $val = ($op->private & OPpEMPTYAVHV_IS_HV) ? '{}' : '[]'; + if ($op->private & OPpTARGET_MY) { + my $targ = $op->targ; + my $var = $self->maybe_my($op, $cx, $self->padname($targ), + $self->padname_sv($targ), + $forbid_parens); + return $self->maybe_parens("$var = $val", $cx, 7); + } else { + return $val; + } +} + sub pp_refgen { my $self = shift; my($op, $cx) = @_; my $kid = $op->first; if ($kid->name eq "null") { my $anoncode = $kid = $kid->first; + + # Perl no longer generates this, but XS modules might: if ($anoncode->name eq "anonconst") { $anoncode = $anoncode->first->first->sibling; } + + # Same as with `anonconst`: if ($anoncode->name eq "anoncode" or !null($anoncode = $kid->sibling) and $anoncode->name eq "anoncode") { return $self->e_anoncode({ code => $self->padval($anoncode->targ) }); + + # Perl still generates this: } elsif ($kid->name eq "pushmark") { my $sib_name = $kid->sibling->name; if ($sib_name eq 'entersub') { @@ -2806,6 +2845,18 @@ sub e_anoncode { return $self->keyword("sub") . " $text"; } +sub pp_anoncode { + my ($self, $anoncode) = @_; + + return $self->e_anoncode( { code => $self->padval($anoncode->targ) } ); +} + +sub pp_anonconst { + my ($self, $anonconst) = @_; + + return $self->pp_anoncode( $anonconst->first->first->sibling ); +} + sub pp_srefgen { pp_refgen(@_) } sub pp_readline { @@ -3093,6 +3144,18 @@ sub pp_isa { binop(@_, "isa", 15) } sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) } sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) } +sub pp_padsv_store { + my $self = shift; + my ($op, $cx, $forbid_parens, @args) = @_; + my $targ = $op->targ; + my $var = $self->maybe_my($op, $cx, $self->padname($targ), + $self->padname_sv($targ), + $forbid_parens); + + my $val = $self->deparse($op->first, 7); + return $self->maybe_parens("$var = $val", $cx, 7); +} + sub pp_smartmatch { my ($self, $op, $cx) = @_; if (($op->flags & OPf_SPECIAL) && $self->{expand} < 2) { @@ -3694,7 +3757,7 @@ sub maybe_var_attr { return unless $loppriv & OPpLVAL_INTRO; my $padname = $self->padname_sv($lop->targ); - my $thisclass = ($padname->FLAGS & SVpad_TYPED) + my $thisclass = ($padname->FLAGS & PADNAMEf_TYPED) ? $padname->SvSTASH->NAME : 'main'; # all pad vars must be in the same class @@ -3813,9 +3876,12 @@ sub pp_list { $local = "my"; } my $padname = $self->padname_sv($lop->targ); - if ($padname->FLAGS & SVpad_TYPED) { + if ($padname->FLAGS & PADNAMEf_TYPED) { $newtype = $padname->SvSTASH->NAME; } + } elsif ($lopname eq 'padsv_store') { + # don't interpret as my (list) if it has an implicit assign + $local = ""; } elsif ($lopname =~ /^(?:gv|rv2)([ash])v$/ && $loppriv & OPpOUR_INTRO or $lopname eq "null" && class($lop) eq 'UNOP' @@ -4280,6 +4346,17 @@ sub pp_gv { return $self->maybe_qualify("", $self->gv_name($gv)); } +sub pp_aelemfastlex_store { + my $self = shift; + my($op, $cx) = @_; + my $name = $self->padname($op->targ); + $name =~ s/^@/\$/; + my $i = $op->private; + $i -= 256 if $i > 127; + my $val = $self->deparse($op->first, 7); + return $self->maybe_parens("${name}[$i] = $val", $cx, 7); +} + sub pp_aelemfast_lex { my $self = shift; my($op, $cx) = @_; @@ -4977,78 +5054,92 @@ sub e_method { sub check_proto { my $self = shift; return "&" if $self->{'noproto'}; - my($proto, @args) = @_; - my($arg, $real); + my ($proto, @args) = @_; my $doneok = 0; my @reals; - # An unbackslashed @ or % gobbles up the rest of the args - 1 while $proto =~ s/(?deparse($_, 6), @args); @args = (); + $proto = ''; + } elsif (!@args) { + last if $doneok; + return "&"; # too few args and no ';' } else { - $arg = shift @args; - last unless $arg; - if ($chr eq "\$" || $chr eq "_") { + my $arg = shift @args; + if ($chr eq '$' || $chr eq '_') { if (want_scalar $arg) { push @reals, $self->deparse($arg, 6); } else { return "&"; } } elsif ($chr eq "&") { - if ($arg->name =~ /^(s?refgen|undef)$/) { + if ($arg->name =~ /^(?:s?refgen|undef)\z/) { push @reals, $self->deparse($arg, 6); } else { return "&"; } } elsif ($chr eq "*") { - if ($arg->name =~ /^s?refgen$/ + if ($arg->name =~ /^s?refgen\z/ and $arg->first->first->name eq "rv2gv") - { - $real = $arg->first->first; # skip refgen, null - if ($real->first->name eq "gv") { - push @reals, $self->deparse($real, 6); - } else { - push @reals, $self->deparse($real->first, 6); - } - } else { - return "&"; - } + { + my $real = $arg->first->first; # skip refgen, null + if ($real->first->name eq "gv") { + push @reals, $self->deparse($real, 6); + } else { + push @reals, $self->deparse($real->first, 6); + } + } else { + return "&"; + } + } elsif ($chr eq "+") { + my $real; + if ($arg->name =~ /^s?refgen\z/ and + !null($real = $arg->first) and + !null($real->first) and + $real->first->name =~ /^(?:rv2|pad)[ah]v\z/) + { + push @reals, $self->deparse($real, 6); + } elsif (want_scalar $arg) { + push @reals, $self->deparse($arg, 6); + } else { + return "&"; + } } elsif (substr($chr, 0, 1) eq "\\") { $chr =~ tr/\\[]//d; - if ($arg->name =~ /^s?refgen$/ and + my $real; + if ($arg->name =~ /^s?refgen\z/ and !null($real = $arg->first) and ($chr =~ /\$/ && is_scalar($real->first) or ($chr =~ /@/ - && class($real->first->sibling) ne 'NULL' - && $real->first->sibling->name - =~ /^(rv2|pad)av$/) + && !null($real->first) + && $real->first->name =~ /^(?:rv2|pad)av\z/) or ($chr =~ /%/ - && class($real->first->sibling) ne 'NULL' - && $real->first->sibling->name - =~ /^(rv2|pad)hv$/) + && !null($real->first) + && $real->first->name =~ /^(?:rv2|pad)hv\z/) #or ($chr =~ /&/ # This doesn't work # && $real->first->name eq "rv2cv") or ($chr =~ /\*/ && $real->first->name eq "rv2gv"))) - { - push @reals, $self->deparse($real, 6); - } else { - return "&"; - } - } - } + { + push @reals, $self->deparse($real, 6); + } else { + return "&"; + } + } else { + # should not happen + return "&"; + } + } } - return "&" if $proto and !$doneok; # too few args and no ';' - return "&" if @args; # too many args + return "&" if @args; # too many args return ("", join ", ", @reals); } @@ -5093,7 +5184,7 @@ sub retscalar { |msgrcv|semop|semget|semctl|hintseval|shostent|snetent |sprotoent|sservent|ehostent|enetent|eprotoent|eservent |spwent|epwent|sgrent|egrent|getlogin|syscall|lock|runcv - |fc)\z/x + |fc|padsv_store)\z/x } sub pp_entersub { @@ -5104,9 +5195,7 @@ sub pp_entersub { my $prefix = ""; my $amper = ""; my($kid, @exprs); - if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) { - $prefix = "do "; - } elsif ($op->private & OPpENTERSUB_AMPER) { + if ($op->private & OPpENTERSUB_AMPER) { $amper = "&"; } $kid = $op->first; @@ -5230,19 +5319,23 @@ sub pp_entersub { # it back. $kid =~ s/^CORE::GLOBAL:://; - my $dproto = defined($proto) ? $proto : "undefined"; - my $scalar_proto = $dproto =~ /^;*(?:[\$*_+]|\\.|\\\[[^]]\])\z/; if (!$declared) { return "$kid(" . $args . ")"; - } elsif ($dproto =~ /^\s*\z/) { + } + + my $dproto = defined($proto) ? $proto : "undefined"; + if ($dproto =~ /^\s*\z/) { return $kid; - } elsif ($scalar_proto and is_scalar($exprs[0])) { + } + + my $scalar_proto = $dproto =~ /^ \s* (?: ;\s* )* (?: [\$*_+] |\\ \s* (?: [\$\@%&*] | \[ [^\]]+ \] ) ) \s* \z/x; + if ($scalar_proto and !@exprs || is_scalar($exprs[0])) { # is_scalar is an excessively conservative test here: # really, we should be comparing to the precedence of the # top operator of $exprs[0] (ala unop()), but that would # take some major code restructuring to do right. return $self->maybe_parens_func($kid, $args, $cx, 16); - } elsif (not $scalar_proto and defined($proto) || $simple) { #' + } elsif (not $scalar_proto and defined($proto) || $simple) { return $self->maybe_parens_func($kid, $args, $cx, 5); } else { return "$kid(" . $args . ")"; @@ -6317,9 +6410,7 @@ sub matchop { ->sibling # entersub ->first # ex-list ->first # pushmark - ->sibling # srefgen - ->first # ex-list - ->first # anoncode + ->sibling # anoncode ->targ ) : undef); @@ -6660,15 +6751,16 @@ sub builtin1 { return "builtin::$name($arg)"; } -sub pp_is_bool { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "is_bool"); } -sub pp_is_weak { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "is_weak"); } -sub pp_weaken { builtin1(@_, "weaken"); } -sub pp_unweaken { builtin1(@_, "unweaken"); } -sub pp_blessed { builtin1(@_, "blessed"); } -sub pp_refaddr { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "refaddr"); } -sub pp_reftype { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "reftype"); } -sub pp_ceil { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "ceil"); } -sub pp_floor { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "floor"); } +sub pp_is_bool { builtin1(@_, "is_bool"); } +sub pp_is_weak { builtin1(@_, "is_weak"); } +sub pp_weaken { builtin1(@_, "weaken"); } +sub pp_unweaken { builtin1(@_, "unweaken"); } +sub pp_blessed { builtin1(@_, "blessed"); } +sub pp_refaddr { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "refaddr"); } +sub pp_reftype { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "reftype"); } +sub pp_ceil { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "ceil"); } +sub pp_floor { $_[0]->maybe_targmy(@_[1,2], \&builtin1, "floor"); } +sub pp_is_tainted { builtin1(@_, "is_tainted"); } 1; __END__ Index: gnu/usr.bin/perl/lib/B/Deparse.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/B/Deparse.t,v diff -u -p -a -u -p -r1.6 Deparse.t --- gnu/usr.bin/perl/lib/B/Deparse.t 15 Feb 2023 01:36:33 -0000 1.6 +++ gnu/usr.bin/perl/lib/B/Deparse.t 21 Feb 2024 15:47:02 -0000 @@ -307,14 +307,19 @@ x(); z() . EOCODH -is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path, '-T' ], +SKIP: { + skip("Your perl was built without taint support", 1) + unless $Config::Config{taint_support}; + + is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path, '-T' ], prog => "format =\n\@\n\$;\n.\n"), - <<'EOCODM', '$; on format line'; -format STDOUT = -@ -$; -. -EOCODM + <<~'EOCODM', '$; on format line'; + format STDOUT = + @ + $; + . + EOCODM +} is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse,-l', $path ], prog => "format =\n\@\n\$foo\n.\n"), @@ -537,10 +542,14 @@ is runperl(stderr => 1, switches => [ '- "sub BEGIN {\n \$main::{'f'} = \\!0;\n}\n", '&PL_sv_yes constant (used to croak)'; -is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path, '-T' ], +SKIP: { + skip("Your perl was built without taint support", 1) + unless $Config::Config{taint_support}; + is runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path, '-T' ], prog => '$x =~ (1?/$a/:0)'), - '$x =~ ($_ =~ /$a/);'."\n", - '$foo =~ under taint mode'; + '$x =~ ($_ =~ /$a/);'."\n", + '$foo =~ under taint mode'; +} unlike runperl(stderr => 1, switches => [ '-MO=-qq,Deparse', $path, '-w' ], prog => 'BEGIN { undef &foo }'), @@ -877,6 +886,13 @@ my $f = sub { +{[]}; } ; #### +# anonconst +# CONTEXT no warnings 'experimental::const_attr'; +my $f = sub : const { + 123; +} +; +#### # bug #43010 '!@$%'->(); #### @@ -1054,7 +1070,7 @@ my $c = []; my $d = \[]; #### # SKIP ?$] < 5.010 && "smartmatch and given/when not implemented on this Perl version" -# CONTEXT use feature ':5.10'; no warnings 'experimental::smartmatch'; +# CONTEXT use feature ':5.10'; no warnings 'deprecated'; # implicit smartmatch in given/when given ('foo') { when ('bar') { continue; } @@ -1617,7 +1633,7 @@ my @a; $a[0] = 1; #### # feature features without feature -# CONTEXT no warnings 'experimental::smartmatch'; +# CONTEXT no warnings 'deprecated'; CORE::state $x; CORE::say $x; CORE::given ($x) { @@ -1633,7 +1649,7 @@ CORE::evalbytes ''; () = CORE::fc $x; #### # feature features when feature has been disabled by use VERSION -# CONTEXT no warnings 'experimental::smartmatch'; +# CONTEXT no warnings 'deprecated'; use feature (sprintf(":%vd", $^V)); use 1; CORE::say $_; @@ -1663,7 +1679,7 @@ CORE::evalbytes ''; () = CORE::__SUB__; #### # (the above test with CONTEXT, and the output is equivalent but different) -# CONTEXT use feature ':5.10'; no warnings 'experimental::smartmatch'; +# CONTEXT use feature ':5.10'; no warnings 'deprecated'; # feature features when feature has been disabled by use VERSION use feature (sprintf(":%vd", $^V)); use 1; @@ -1697,7 +1713,7 @@ CORE::evalbytes ''; #### # SKIP ?$] < 5.017004 && "lexical subs not implemented on this Perl version" # lexical subroutines and keywords of the same name -# CONTEXT use feature 'lexical_subs', 'switch'; no warnings 'experimental'; +# CONTEXT use feature 'lexical_subs', 'switch'; no warnings 'experimental'; no warnings 'deprecated'; my sub default; my sub else; my sub elsif; @@ -2101,7 +2117,6 @@ no warnings "experimental::lexical_subs" my sub f {} print f(); >>>> -BEGIN {${^WARNING_BITS} = "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x54\x55\x55\x55\x55\x55\x55\x55"} my sub f { } @@ -2114,7 +2129,6 @@ no warnings 'experimental::lexical_subs' state sub f {} print f(); >>>> -BEGIN {${^WARNING_BITS} = "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x54\x55\x55\x55\x55\x55\x55\x55"} state sub f { } @@ -2129,7 +2143,7 @@ print f(); { foo(); my sub b; - b ; + b; main::b(); &main::b; &main::b(); @@ -2145,7 +2159,7 @@ print f(); (); state sub sb2; sub sb2 { - sb2 ; + sb2; } #### # lexical subroutine with outer declaration and inner definition @@ -2231,6 +2245,14 @@ optoptwack($a = $b); wackbrack($a = $b); optwackbrack($a = $b); optoptwackbrack($a = $b); +optbar; +optoptbar; +optplus; +optoptplus; +optwack; +optoptwack; +optwackbrack; +optoptwackbrack; >>>> package prototest; dollar($a < $b); @@ -2242,15 +2264,91 @@ optoptdollar($a < $b); bar($a < $b); optbar($a < $b); optoptbar($a < $b); -&plus($a < $b); -&optplus($a < $b); -&optoptplus($a < $b); +plus($a < $b); +optplus($a < $b); +optoptplus($a < $b); &wack(\($a = $b)); &optwack(\($a = $b)); &optoptwack(\($a = $b)); &wackbrack(\($a = $b)); &optwackbrack(\($a = $b)); &optoptwackbrack(\($a = $b)); +optbar; +optoptbar; +optplus; +optoptplus; +optwack; +optoptwack; +optwackbrack; +optoptwackbrack; +#### +# enreferencing prototypes: @ +# CONTEXT sub wackat(\@) {} sub optwackat(;\@) {} sub wackbrackat(\[@]) {} sub optwackbrackat(;\[@]) {} +wackat(my @a0); +wackat(@a0); +wackat(@ARGV); +wackat(@{['t'];}); +optwackat; +optwackat(my @a1); +optwackat(@a1); +optwackat(@ARGV); +optwackat(@{['t'];}); +wackbrackat(my @a2); +wackbrackat(@a2); +wackbrackat(@ARGV); +wackbrackat(@{['t'];}); +optwackbrackat; +optwackbrackat(my @a3); +optwackbrackat(@a3); +optwackbrackat(@ARGV); +optwackbrackat(@{['t'];}); +#### +# enreferencing prototypes: % +# CONTEXT sub wackperc(\%) {} sub optwackperc(;\%) {} sub wackbrackperc(\[%]) {} sub optwackbrackperc(;\[%]) {} +wackperc(my %a0); +wackperc(%a0); +wackperc(%ARGV); +wackperc(%{+{'t', 1};}); +optwackperc; +optwackperc(my %a1); +optwackperc(%a1); +optwackperc(%ARGV); +optwackperc(%{+{'t', 1};}); +wackbrackperc(my %a2); +wackbrackperc(%a2); +wackbrackperc(%ARGV); +wackbrackperc(%{+{'t', 1};}); +optwackbrackperc; +optwackbrackperc(my %a3); +optwackbrackperc(%a3); +optwackbrackperc(%ARGV); +optwackbrackperc(%{+{'t', 1};}); +#### +# enreferencing prototypes: + +# CONTEXT sub plus(+) {} sub optplus(;+) {} +plus('hi'); +plus(my @a0); +plus(my %h0); +plus(\@a0); +plus(\%h0); +optplus; +optplus('hi'); +optplus(my @a1); +optplus(my %h1); +optplus(\@a1); +optplus(\%h1); +>>>> +plus('hi'); +plus(my @a0); +plus(my %h0); +plus(@a0); +plus(%h0); +optplus; +optplus('hi'); +optplus(my @a1); +optplus(my %h1); +optplus(@a1); +optplus(%h1); #### # ensure aelemfast works in the range -128..127 and that there's no # funky edge cases @@ -2747,6 +2845,22 @@ sub ($a, $=) { } ; #### +# defined-or default +no warnings; +use feature 'signatures'; +sub ($a //= 'default') { + $a; +} +; +#### +# logical-or default +no warnings; +use feature 'signatures'; +sub ($a ||= 'default') { + $a; +} +; +#### # padrange op within pattern code blocks /(?{ my($x, $y) = (); })/; my $a; @@ -3221,6 +3335,7 @@ $x = builtin::refaddr(undef); $x = builtin::reftype(undef); $x = builtin::ceil($x); $x = builtin::floor($x); +$x = builtin::is_tainted($x); #### # boolean true preserved my $x = !0; @@ -3230,3 +3345,10 @@ my $x = !1; #### # const NV: NV-ness preserved my(@x) = (-2.0, -1.0, -0.0, 0.0, 1.0, 2.0); +#### +# PADSV_STORE optimised my should be handled +() = (my $s = 1); +#### +# PADSV_STORE optimised state should be handled +# CONTEXT use feature "state"; +() = (state $s = 1); Index: gnu/usr.bin/perl/lib/B/Op_private.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/B/Op_private.pm,v diff -u -p -a -u -p -r1.12 Op_private.pm --- gnu/usr.bin/perl/lib/B/Op_private.pm 23 Dec 2023 21:02:21 -0000 1.12 +++ gnu/usr.bin/perl/lib/B/Op_private.pm 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -# -*- buffer-read-only: t -*- +# -*- mode: Perl; buffer-read-only: t -*- # # lib/B/Op_private.pm # @@ -118,7 +118,7 @@ package B::Op_private; our %bits; -our $VERSION = "5.036003"; +our $VERSION = "5.038002"; $bits{$_}{3} = 'OPpENTERSUB_AMPER' for qw(entersub rv2cv); $bits{$_}{6} = 'OPpENTERSUB_DB' for qw(entersub rv2cv); @@ -134,7 +134,7 @@ $bits{$_}{6} = 'OPpINDEX_BOOLNEG' for qw $bits{$_}{1} = 'OPpITER_REVERSED' for qw(enteriter iter); $bits{$_}{7} = 'OPpLVALUE' for qw(leave leaveloop); $bits{$_}{6} = 'OPpLVAL_DEFER' for qw(aelem helem multideref); -$bits{$_}{7} = 'OPpLVAL_INTRO' for qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv pushmark refassign rv2av rv2gv rv2hv rv2sv split); +$bits{$_}{7} = 'OPpLVAL_INTRO' for qw(aelem aslice cond_expr delete emptyavhv enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv padsv_store pushmark refassign rv2av rv2gv rv2hv rv2sv split undef); $bits{$_}{2} = 'OPpLVREF_ELEM' for qw(lvref refassign); $bits{$_}{3} = 'OPpLVREF_ITER' for qw(lvref refassign); $bits{$_}{3} = 'OPpMAYBE_LVSUB' for qw(aassign aelem akeys aslice av2arylen avhvswitch helem hslice keys kvaslice kvhslice multideref padav padhv pos rv2av rv2gv rv2hv substr values vec); @@ -145,11 +145,11 @@ $bits{$_}{4} = 'OPpOPEN_IN_RAW' for qw(b $bits{$_}{7} = 'OPpOPEN_OUT_CRLF' for qw(backtick open); $bits{$_}{6} = 'OPpOPEN_OUT_RAW' for qw(backtick open); $bits{$_}{6} = 'OPpOUR_INTRO' for qw(enteriter gvsv rv2av rv2hv rv2sv split); -$bits{$_}{6} = 'OPpPAD_STATE' for qw(lvavref lvref padav padhv padsv pushmark refassign); +$bits{$_}{6} = 'OPpPAD_STATE' for qw(emptyavhv lvavref lvref padav padhv padsv padsv_store pushmark refassign undef); $bits{$_}{7} = 'OPpPV_IS_UTF8' for qw(dump goto last next redo); $bits{$_}{6} = 'OPpREFCOUNTED' for qw(leave leaveeval leavesub leavesublv leavewrite); $bits{$_}{2} = 'OPpSLICEWARNING' for qw(aslice hslice padav padhv rv2av rv2hv); -$bits{$_}{4} = 'OPpTARGET_MY' for qw(abs add atan2 ceil chdir chmod chomp chown chr chroot concat cos crypt divide exec exp flock floor getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int is_bool is_weak kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand refaddr reftype rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time unlink unshift utime wait waitpid); +$bits{$_}{4} = 'OPpTARGET_MY' for qw(abs add atan2 ceil chdir chmod chomp chown chr chroot concat cos crypt divide emptyavhv exec exp flock floor getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand refaddr reftype rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time undef unlink unshift utime wait waitpid); $bits{$_}{0} = 'OPpTRANS_CAN_FORCE_UTF8' for qw(trans transr); $bits{$_}{5} = 'OPpTRANS_COMPLEMENT' for qw(trans transr); $bits{$_}{7} = 'OPpTRANS_DELETE' for qw(trans transr); @@ -254,6 +254,7 @@ $bits{aeach}{0} = $bf[0]; @{$bits{aelem}}{5,4,1,0} = ($bf[8], $bf[8], $bf[1], $bf[1]); @{$bits{aelemfast}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]); @{$bits{aelemfast_lex}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]); +@{$bits{aelemfastlex_store}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]); $bits{akeys}{0} = $bf[0]; $bits{alarm}{0} = $bf[0]; $bits{and}{0} = $bf[0]; @@ -262,7 +263,7 @@ $bits{anonconst}{0} = $bf[0]; @{$bits{anonhash}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); @{$bits{anonlist}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); $bits{argcheck}{0} = $bf[0]; -$bits{argdefelem}{0} = $bf[0]; +@{$bits{argdefelem}}{7,6,0} = ('OPpARG_IF_UNDEF', 'OPpARG_IF_FALSE', $bf[0]); @{$bits{argelem}}{2,1,0} = ($bf[7], $bf[7], $bf[0]); @{$bits{atan2}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); $bits{av2arylen}{0} = $bf[0]; @@ -305,7 +306,8 @@ $bits{dor}{0} = $bf[0]; $bits{dorassign}{0} = $bf[0]; $bits{dump}{0} = $bf[0]; $bits{each}{0} = $bf[0]; -@{$bits{entereval}}{5,4,3,2,1,0} = ('OPpEVAL_RE_REPARSING', 'OPpEVAL_COPHH', 'OPpEVAL_BYTES', 'OPpEVAL_UNICODE', 'OPpEVAL_HAS_HH', $bf[0]); +@{$bits{emptyavhv}}{5,3,2,1,0} = ('OPpEMPTYAVHV_IS_HV', $bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{entereval}}{6,5,4,3,2,1,0} = ('OPpEVAL_EVALSV', 'OPpEVAL_RE_REPARSING', 'OPpEVAL_COPHH', 'OPpEVAL_BYTES', 'OPpEVAL_UNICODE', 'OPpEVAL_HAS_HH', $bf[0]); $bits{entergiven}{0} = $bf[0]; $bits{enteriter}{3} = 'OPpITER_DEF'; @{$bits{entersub}}{5,4,0} = ($bf[8], $bf[8], 'OPpENTERSUB_INARGS'); @@ -382,6 +384,7 @@ $bits{grepwhile}{0} = $bf[0]; @{$bits{gt}}{1,0} = ($bf[1], $bf[1]); $bits{gv}{5} = 'OPpEARLY_CV'; @{$bits{helem}}{5,4,1,0} = ($bf[8], $bf[8], $bf[1], $bf[1]); +@{$bits{helemexistsor}}{7,0} = ('OPpHELEMEXISTSOR_DELETE', $bf[0]); $bits{hex}{0} = $bf[0]; @{$bits{i_add}}{1,0} = ($bf[1], $bf[1]); @{$bits{i_divide}}{1,0} = ($bf[1], $bf[1]); @@ -401,9 +404,11 @@ $bits{i_predec}{0} = $bf[0]; $bits{i_preinc}{0} = $bf[0]; @{$bits{i_subtract}}{1,0} = ($bf[1], $bf[1]); @{$bits{index}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{initfield}}{2,1,0} = ('OPpINITFIELD_HV', 'OPpINITFIELD_AV', $bf[0]); $bits{int}{0} = $bf[0]; @{$bits{ioctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); $bits{is_bool}{0} = $bf[0]; +$bits{is_tainted}{0} = $bf[0]; $bits{is_weak}{0} = $bf[0]; @{$bits{isa}}{1,0} = ($bf[1], $bf[1]); @{$bits{join}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); @@ -439,6 +444,7 @@ $bits{method_named}{0} = $bf[0]; $bits{method_redir}{0} = $bf[0]; $bits{method_redir_super}{0} = $bf[0]; $bits{method_super}{0} = $bf[0]; +@{$bits{methstart}}{7,0} = ('OPpINITFIELDS', $bf[0]); @{$bits{mkdir}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); @{$bits{modulo}}{1,0} = ($bf[1], $bf[1]); @{$bits{msgctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); @@ -464,6 +470,7 @@ $bits{ord}{0} = $bf[0]; $bits{padhv}{0} = 'OPpPADHV_ISKEYS'; @{$bits{padrange}}{6,5,4,3,2,1,0} = ($bf[5], $bf[5], $bf[5], $bf[5], $bf[5], $bf[5], $bf[5]); @{$bits{padsv}}{5,4} = ($bf[8], $bf[8]); +$bits{padsv_store}{0} = $bf[0]; @{$bits{pipe_op}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); $bits{pop}{0} = $bf[0]; $bits{pos}{0} = $bf[0]; @@ -571,7 +578,7 @@ $bits{tied}{0} = $bf[0]; $bits{uc}{0} = $bf[0]; $bits{ucfirst}{0} = $bf[0]; @{$bits{umask}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); -$bits{undef}{0} = $bf[0]; +@{$bits{undef}}{5,0} = ('OPpUNDEF_KEEP_PV', $bf[0]); @{$bits{unlink}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); @{$bits{unpack}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); @{$bits{unshift}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); @@ -596,6 +603,8 @@ our %defines = ( OPpARGELEM_HV => 4, OPpARGELEM_MASK => 6, OPpARGELEM_SV => 0, + OPpARG_IF_FALSE => 64, + OPpARG_IF_UNDEF => 128, OPpASSIGN_BACKWARDS => 64, OPpASSIGN_COMMON_AGG => 16, OPpASSIGN_COMMON_RC1 => 32, @@ -620,6 +629,7 @@ our %defines = ( OPpDEREF_SV => 48, OPpDONT_INIT_GV => 4, OPpEARLY_CV => 32, + OPpEMPTYAVHV_IS_HV => 32, OPpENTERSUB_AMPER => 8, OPpENTERSUB_DB => 64, OPpENTERSUB_HASTARG => 4, @@ -627,6 +637,7 @@ our %defines = ( OPpENTERSUB_NOPAREN => 128, OPpEVAL_BYTES => 8, OPpEVAL_COPHH => 16, + OPpEVAL_EVALSV => 64, OPpEVAL_HAS_HH => 2, OPpEVAL_RE_REPARSING => 32, OPpEVAL_UNICODE => 4, @@ -636,9 +647,13 @@ our %defines = ( OPpFT_AFTER_t => 16, OPpFT_STACKED => 4, OPpFT_STACKING => 8, + OPpHELEMEXISTSOR_DELETE => 128, OPpHINT_STRICT_REFS => 2, OPpHUSH_VMSISH => 32, OPpINDEX_BOOLNEG => 64, + OPpINITFIELDS => 128, + OPpINITFIELD_AV => 2, + OPpINITFIELD_HV => 4, OPpITER_DEF => 8, OPpITER_REVERSED => 2, OPpKVSLICE => 32, @@ -696,6 +711,7 @@ our %defines = ( OPpTRANS_SQUASH => 8, OPpTRANS_USE_SVOP => 2, OPpTRUEBOOL => 32, + OPpUNDEF_KEEP_PV => 32, OPpUSEINT => 4, ); @@ -704,6 +720,8 @@ our %labels = ( OPpARGELEM_AV => 'AV', OPpARGELEM_HV => 'HV', OPpARGELEM_SV => 'SV', + OPpARG_IF_FALSE => 'IF_FALSE', + OPpARG_IF_UNDEF => 'IF_UNDEF', OPpASSIGN_BACKWARDS => 'BKWARD', OPpASSIGN_COMMON_AGG => 'COM_AGG', OPpASSIGN_COMMON_RC1 => 'COM_RC1', @@ -726,6 +744,7 @@ our %labels = ( OPpDEREF_SV => 'DREFSV', OPpDONT_INIT_GV => 'NOINIT', OPpEARLY_CV => 'EARLYCV', + OPpEMPTYAVHV_IS_HV => 'ANONHASH', OPpENTERSUB_AMPER => 'AMPER', OPpENTERSUB_DB => 'DBG', OPpENTERSUB_HASTARG => 'TARG', @@ -733,6 +752,7 @@ our %labels = ( OPpENTERSUB_NOPAREN => 'NO()', OPpEVAL_BYTES => 'BYTES', OPpEVAL_COPHH => 'COPHH', + OPpEVAL_EVALSV => 'EVALSV', OPpEVAL_HAS_HH => 'HAS_HH', OPpEVAL_RE_REPARSING => 'REPARSE', OPpEVAL_UNICODE => 'UNI', @@ -742,9 +762,13 @@ our %labels = ( OPpFT_AFTER_t => 'FTAFTERt', OPpFT_STACKED => 'FTSTACKED', OPpFT_STACKING => 'FTSTACKING', + OPpHELEMEXISTSOR_DELETE => 'DELETE', OPpHINT_STRICT_REFS => 'STRICT', OPpHUSH_VMSISH => 'HUSH', OPpINDEX_BOOLNEG => 'NEG', + OPpINITFIELDS => 'INITFIELDS', + OPpINITFIELD_AV => 'INITFIELD_AV', + OPpINITFIELD_HV => 'INITFIELD_HV', OPpITER_DEF => 'DEF', OPpITER_REVERSED => 'REVERSED', OPpKVSLICE => 'KVSLICE', @@ -799,12 +823,14 @@ our %labels = ( OPpTRANS_SQUASH => 'SQUASH', OPpTRANS_USE_SVOP => 'USE_SVOP', OPpTRUEBOOL => 'BOOL', + OPpUNDEF_KEEP_PV => 'KEEP_PV', OPpUSEINT => 'USEINT', ); our %ops_using = ( OPpALLOW_FAKE => [qw(rv2gv)], + OPpARG_IF_FALSE => [qw(argdefelem)], OPpASSIGN_BACKWARDS => [qw(sassign)], OPpASSIGN_COMMON_AGG => [qw(aassign)], OPpCONCAT_NESTED => [qw(concat)], @@ -812,6 +838,7 @@ our %ops_using = ( OPpCOREARGS_DEREF1 => [qw(coreargs)], OPpDEFER_FINALLY => [qw(pushdefer)], OPpEARLY_CV => [qw(gv)], + OPpEMPTYAVHV_IS_HV => [qw(emptyavhv)], OPpENTERSUB_AMPER => [qw(entersub rv2cv)], OPpENTERSUB_INARGS => [qw(entersub)], OPpENTERSUB_NOPAREN => [qw(rv2cv)], @@ -820,16 +847,19 @@ our %ops_using = ( OPpFLIP_LINENUM => [qw(flip flop)], OPpFT_ACCESS => [qw(fteexec fteread ftewrite ftrexec ftrread ftrwrite)], OPpFT_AFTER_t => [qw(ftatime ftbinary ftblk ftchr ftctime ftdir fteexec fteowned fteread ftewrite ftfile ftis ftlink ftmtime ftpipe ftrexec ftrowned ftrread ftrwrite ftsgid ftsize ftsock ftsuid ftsvtx fttext fttty ftzero)], + OPpHELEMEXISTSOR_DELETE => [qw(helemexistsor)], OPpHINT_STRICT_REFS => [qw(entersub multideref rv2av rv2cv rv2gv rv2hv rv2sv)], OPpHUSH_VMSISH => [qw(dbstate nextstate)], OPpINDEX_BOOLNEG => [qw(index rindex)], + OPpINITFIELDS => [qw(methstart)], + OPpINITFIELD_AV => [qw(initfield)], OPpITER_DEF => [qw(enteriter)], OPpITER_REVERSED => [qw(enteriter iter)], OPpKVSLICE => [qw(delete)], OPpLIST_GUESSED => [qw(list)], OPpLVALUE => [qw(leave leaveloop)], OPpLVAL_DEFER => [qw(aelem helem multideref)], - OPpLVAL_INTRO => [qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv pushmark refassign rv2av rv2gv rv2hv rv2sv split)], + OPpLVAL_INTRO => [qw(aelem aslice cond_expr delete emptyavhv enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv padsv_store pushmark refassign rv2av rv2gv rv2hv rv2sv split undef)], OPpLVREF_ELEM => [qw(lvref refassign)], OPpMAYBE_LVSUB => [qw(aassign aelem akeys aslice av2arylen avhvswitch helem hslice keys kvaslice kvhslice multideref padav padhv pos rv2av rv2gv rv2hv substr values vec)], OPpMAYBE_TRUEBOOL => [qw(blessed padhv ref rv2hv)], @@ -839,7 +869,7 @@ our %ops_using = ( OPpOPEN_IN_CRLF => [qw(backtick open)], OPpOUR_INTRO => [qw(enteriter gvsv rv2av rv2hv rv2sv split)], OPpPADHV_ISKEYS => [qw(padhv)], - OPpPAD_STATE => [qw(lvavref lvref padav padhv padsv pushmark refassign)], + OPpPAD_STATE => [qw(emptyavhv lvavref lvref padav padhv padsv padsv_store pushmark refassign undef)], OPpPV_IS_UTF8 => [qw(dump goto last next redo)], OPpREFCOUNTED => [qw(leave leaveeval leavesub leavesublv leavewrite)], OPpREPEAT_DOLIST => [qw(repeat)], @@ -849,12 +879,14 @@ our %ops_using = ( OPpSORT_DESCEND => [qw(sort)], OPpSPLIT_ASSIGN => [qw(split)], OPpSUBSTR_REPL_FIRST => [qw(substr)], - OPpTARGET_MY => [qw(abs add atan2 ceil chdir chmod chomp chown chr chroot concat cos crypt divide exec exp flock floor getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int is_bool is_weak kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand refaddr reftype rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time unlink unshift utime wait waitpid)], + OPpTARGET_MY => [qw(abs add atan2 ceil chdir chmod chomp chown chr chroot concat cos crypt divide emptyavhv exec exp flock floor getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand refaddr reftype rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time undef unlink unshift utime wait waitpid)], OPpTRANS_CAN_FORCE_UTF8 => [qw(trans transr)], OPpTRUEBOOL => [qw(blessed grepwhile index length padav padhv pos ref rindex rv2av rv2hv subst)], + OPpUNDEF_KEEP_PV => [qw(undef)], OPpUSEINT => [qw(bit_and bit_or bit_xor complement left_shift nbit_and nbit_or nbit_xor ncomplement right_shift sbit_and sbit_or sbit_xor)], ); +$ops_using{OPpARG_IF_UNDEF} = $ops_using{OPpARG_IF_FALSE}; $ops_using{OPpASSIGN_COMMON_RC1} = $ops_using{OPpASSIGN_COMMON_AGG}; $ops_using{OPpASSIGN_COMMON_SCALAR} = $ops_using{OPpASSIGN_COMMON_AGG}; $ops_using{OPpASSIGN_CV_TO_GV} = $ops_using{OPpASSIGN_BACKWARDS}; @@ -870,11 +902,13 @@ $ops_using{OPpDONT_INIT_GV} = $ops_using $ops_using{OPpENTERSUB_DB} = $ops_using{OPpENTERSUB_AMPER}; $ops_using{OPpENTERSUB_HASTARG} = $ops_using{OPpENTERSUB_AMPER}; $ops_using{OPpEVAL_COPHH} = $ops_using{OPpEVAL_BYTES}; +$ops_using{OPpEVAL_EVALSV} = $ops_using{OPpEVAL_BYTES}; $ops_using{OPpEVAL_HAS_HH} = $ops_using{OPpEVAL_BYTES}; $ops_using{OPpEVAL_RE_REPARSING} = $ops_using{OPpEVAL_BYTES}; $ops_using{OPpEVAL_UNICODE} = $ops_using{OPpEVAL_BYTES}; $ops_using{OPpFT_STACKED} = $ops_using{OPpFT_AFTER_t}; $ops_using{OPpFT_STACKING} = $ops_using{OPpFT_AFTER_t}; +$ops_using{OPpINITFIELD_HV} = $ops_using{OPpINITFIELD_AV}; $ops_using{OPpLVREF_ITER} = $ops_using{OPpLVREF_ELEM}; $ops_using{OPpMAY_RETURN_CONSTANT} = $ops_using{OPpENTERSUB_NOPAREN}; $ops_using{OPpMULTICONCAT_FAKE} = $ops_using{OPpMULTICONCAT_APPEND}; @@ -897,4 +931,4 @@ $ops_using{OPpTRANS_IDENTICAL} = $ops_us $ops_using{OPpTRANS_SQUASH} = $ops_using{OPpTRANS_CAN_FORCE_UTF8}; $ops_using{OPpTRANS_USE_SVOP} = $ops_using{OPpTRANS_CAN_FORCE_UTF8}; -# ex: set ro: +# ex: set ro ft=perl: Index: gnu/usr.bin/perl/lib/Class/Struct.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/Class/Struct.pm,v diff -u -p -a -u -p -r1.9 Struct.pm --- gnu/usr.bin/perl/lib/Class/Struct.pm 1 Mar 2021 23:19:57 -0000 1.9 +++ gnu/usr.bin/perl/lib/Class/Struct.pm 21 Feb 2024 15:47:02 -0000 @@ -14,7 +14,7 @@ require Exporter; @ISA = qw(Exporter); @EXPORT = qw(struct); -$VERSION = '0.66'; +$VERSION = '0.68'; my $print = 0; sub printem { @@ -84,7 +84,7 @@ sub struct { } else { $base_type = 'ARRAY'; - $class = (caller())[0]; + $class = caller(); @decls = @_; } @@ -275,24 +275,24 @@ Class::Struct - declare struct-like data # declare struct with four types of elements: struct( s => '$', a => '@', h => '%', c => 'My_Other_Class' ); - $obj = new Myobj; # constructor + my $obj = Myobj->new; # constructor # scalar type accessor: - $element_value = $obj->s; # element value + my $element_value = $obj->s; # element value $obj->s('new value'); # assign to element # array type accessor: - $ary_ref = $obj->a; # reference to whole array - $ary_element_value = $obj->a(2); # array element value + my $ary_ref = $obj->a; # reference to whole array + my $ary_element_value = $obj->a(2); # array element value $obj->a(2, 'new value'); # assign to array element # hash type accessor: - $hash_ref = $obj->h; # reference to whole hash - $hash_element_value = $obj->h('x'); # hash element value + my $hash_ref = $obj->h; # reference to whole hash + my $hash_element_value = $obj->h('x'); # hash element value $obj->h('x', 'new value'); # assign to hash element # class type accessor: - $element_value = $obj->c; # object reference + my $element_value = $obj->c; # object reference $obj->c->method(...); # call method of object $obj->c(new My_Other_Class); # assign a new object Index: gnu/usr.bin/perl/lib/DBM_Filter/t/01error.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/DBM_Filter/t/01error.t,v diff -u -p -a -u -p -r1.1.1.4 01error.t --- gnu/usr.bin/perl/lib/DBM_Filter/t/01error.t 15 Feb 2023 01:33:05 -0000 1.1.1.4 +++ gnu/usr.bin/perl/lib/DBM_Filter/t/01error.t 21 Feb 2024 15:47:02 -0000 @@ -1,16 +1,20 @@ use strict; use warnings; -use Carp; BEGIN { chdir 't' if -d 't'; @INC = qw(. ../lib); } -our $db ; +use Carp; +use File::Temp qw(tempdir); +my $tempdir; { - chdir 't' if -d 't'; + $tempdir = tempdir( "./DBMFXXXXXXXX", CLEANUP => 1); + push @INC, $tempdir; + chdir $tempdir or die "Failed to chdir to '$tempdir': $!"; + @INC[-1] = "../../lib"; if ( ! -d 'DBM_Filter') { mkdir 'DBM_Filter', 0777 @@ -18,7 +22,9 @@ our $db ; } } -END { rmdir 'DBM_Filter' } +##### Keep above code identical to 02core.t ##### + +our $db; sub writeFile { @@ -34,7 +40,7 @@ sub runFilter my $name = shift ; my $filter = shift ; -print "# runFilter $name\n" ; + #print "# runFilter $name\n" ; my $filename = "DBM_Filter/$name.pm"; $filter = "package DBM_Filter::$name ;\n$filter" unless $filter =~ /^\s*package/ ; @@ -61,12 +67,12 @@ BEGIN { }; BEGIN { use_ok('Fcntl') }; -unlink ; -END { unlink ; } +unlink ; +END { unlink ; } my %h1 = () ; my %h2 = () ; -$db = tie(%h1, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +$db = tie(%h1, $db_file,'errOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file ok"; Index: gnu/usr.bin/perl/lib/DBM_Filter/t/02core.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/DBM_Filter/t/02core.t,v diff -u -p -a -u -p -r1.1.1.4 02core.t --- gnu/usr.bin/perl/lib/DBM_Filter/t/02core.t 15 Feb 2023 01:33:05 -0000 1.1.1.4 +++ gnu/usr.bin/perl/lib/DBM_Filter/t/02core.t 21 Feb 2024 15:47:02 -0000 @@ -1,14 +1,20 @@ - use strict; use warnings; -use Carp; -my %files = (); +BEGIN { + chdir 't' if -d 't'; + @INC = qw(. ../lib); +} -use lib '.'; +use Carp; +use File::Temp qw(tempdir); +my $tempdir; { - chdir 't' if -d 't'; + $tempdir = tempdir( "./DBMFXXXXXXXX", CLEANUP => 1); + push @INC, $tempdir; + chdir $tempdir or die "Failed to chdir to '$tempdir': $!"; + @INC[-1] = "../../lib"; if ( ! -d 'DBM_Filter') { mkdir 'DBM_Filter', 0777 @@ -16,7 +22,10 @@ use lib '.'; } } -END { rmdir 'DBM_Filter' } +##### Keep above code identical to 01error.t ##### + +our $db; +my %files = (); sub writeFile { @@ -28,8 +37,6 @@ sub writeFile $files{"DBM_Filter/$filename.pm"} ++; } -END { unlink keys %files if keys %files } - use Test::More; BEGIN { use_ok('DBM_Filter') }; @@ -46,8 +53,8 @@ BEGIN { }; BEGIN { use_ok('Fcntl') }; -unlink ; -END { unlink ; } +unlink ; +END { unlink ; } writeFile('times_ten', <<'EOM'); package DBM_Filter::times_ten; @@ -161,7 +168,7 @@ sub checkRaw my %h; # read the dbm file without the filter - ok tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640), "tied to $db_file"; + ok tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640), "tied to $db_file"; my %bad = (); while (my ($k, $v) = each %h) { @@ -191,14 +198,14 @@ sub checkRaw eval { untie %h }; is $@, '', "untie without inner references" ; } - unlink ; + unlink ; } { #diag "Test Set: Key and Value Filter, no stacking, no closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -215,7 +222,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'A' => 'A', @@ -228,7 +235,7 @@ sub checkRaw #diag "Test Set: Key Only Filter, no stacking, no closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -245,7 +252,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'A' => '', @@ -258,7 +265,7 @@ sub checkRaw #diag "Test Set: Value Only Filter, no stacking, no closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -275,7 +282,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', '' => 'A', @@ -288,7 +295,7 @@ sub checkRaw #diag "Test Set: Key and Value Filter, with stacking, no closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -308,7 +315,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'AB' => 'AB', @@ -321,7 +328,7 @@ sub checkRaw #diag "Test Set: Key Filter != Value Filter, with stacking, no closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -347,7 +354,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'BD' => 'AC', @@ -360,7 +367,7 @@ sub checkRaw #diag "Test Set: Key only Filter, with stacking, no closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -380,7 +387,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'BD' => '', @@ -393,7 +400,7 @@ sub checkRaw #diag "Test Set: Value only Filter, with stacking, no closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -413,7 +420,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', '' => 'AC', @@ -426,7 +433,7 @@ sub checkRaw #diag "Test Set: Combination Key/Value + Key Filter != Value Filter, with stacking, no closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -449,7 +456,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'AD' => 'AC', @@ -462,7 +469,7 @@ sub checkRaw #diag "Test Set: Combination Key/Value + Key + Key/Value, no closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -485,7 +492,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'ABC' => 'AC', @@ -498,7 +505,7 @@ sub checkRaw #diag "Test Set: Combination Key/Value + Key + Key/Value, with closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -521,7 +528,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'ABC' => 'AC', @@ -534,7 +541,7 @@ sub checkRaw #diag "Test Set: Combination Key/Value + Key + Key/Value, immediate"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -566,7 +573,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'ABC' => 'AC', @@ -579,7 +586,7 @@ sub checkRaw #diag "Test Set: Combination Key/Value + Key + Key/Value, immediate, closure"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -605,7 +612,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'ABC' => 'AC', @@ -618,7 +625,7 @@ sub checkRaw #diag "Test Set: Filtered & Filter_Pop"; my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -679,7 +686,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'ABC' => 'AC', @@ -702,7 +709,7 @@ sub checkRaw } my %h = () ; - my $db = tie(%h, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; + my $db = tie(%h, $db_file,'coreOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db, "tied to $db_file"; doPreData(\%h); @@ -719,7 +726,7 @@ sub checkRaw is $@, '', "untie without inner references" ; } - checkRaw 'Op_dbmx', + checkRaw 'coreOp_dbmx', 'abc' => 'def', '123' => '456', 'X' => 'X', Index: gnu/usr.bin/perl/lib/DBM_Filter/t/compress.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/DBM_Filter/t/compress.t,v diff -u -p -a -u -p -r1.1.1.3 compress.t --- gnu/usr.bin/perl/lib/DBM_Filter/t/compress.t 15 Feb 2023 01:33:05 -0000 1.1.1.3 +++ gnu/usr.bin/perl/lib/DBM_Filter/t/compress.t 21 Feb 2024 15:47:02 -0000 @@ -31,11 +31,11 @@ BEGIN { BEGIN { use_ok('Fcntl') }; BEGIN { use_ok('Compress::Zlib') }; -unlink ; -END { unlink ; } +unlink ; +END { unlink ; } my %h1 = () ; -my $db1 = tie(%h1, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +my $db1 = tie(%h1, $db_file,'cmpOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db1, "tied to $db_file"; @@ -90,7 +90,7 @@ undef $db1; # read the dbm file without the filter my %h2 = () ; -my $db2 = tie(%h2, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +my $db2 = tie(%h2, $db_file,'cmpOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db2, "tied to $db_file"; Index: gnu/usr.bin/perl/lib/DBM_Filter/t/encode.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/DBM_Filter/t/encode.t,v diff -u -p -a -u -p -r1.4 encode.t --- gnu/usr.bin/perl/lib/DBM_Filter/t/encode.t 15 Feb 2023 01:36:33 -0000 1.4 +++ gnu/usr.bin/perl/lib/DBM_Filter/t/encode.t 21 Feb 2024 15:47:02 -0000 @@ -38,11 +38,11 @@ BEGIN { use_ok('charnames', qw{greek})}; use charnames qw{greek}; -unlink ; -END { unlink ; } +unlink ; +END { unlink ; } my %h1 = () ; -my $db1 = tie(%h1, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +my $db1 = tie(%h1, $db_file,'encOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db1, "tied to $db_file"; @@ -101,7 +101,7 @@ undef $db1; # read the dbm file without the filter my %h2 = () ; -my $db2 = tie(%h2, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +my $db2 = tie(%h2, $db_file,'encOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db2, "tied to $db_file"; Index: gnu/usr.bin/perl/lib/DBM_Filter/t/int32.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/DBM_Filter/t/int32.t,v diff -u -p -a -u -p -r1.1.1.4 int32.t --- gnu/usr.bin/perl/lib/DBM_Filter/t/int32.t 15 Feb 2023 01:33:05 -0000 1.1.1.4 +++ gnu/usr.bin/perl/lib/DBM_Filter/t/int32.t 21 Feb 2024 15:47:02 -0000 @@ -21,11 +21,11 @@ BEGIN { }; BEGIN { use_ok('Fcntl') }; -unlink ; -END { unlink ; } +unlink ; +END { unlink ; } my %h1 = () ; -my $db1 = tie(%h1, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +my $db1 = tie(%h1, $db_file,'intOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db1, "tied to $db_file"; @@ -72,7 +72,7 @@ undef $db1; # read the dbm file without the filter my %h2 = () ; -my $db2 = tie(%h2, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +my $db2 = tie(%h2, $db_file,'intOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db2, "tied to $db_file"; Index: gnu/usr.bin/perl/lib/DBM_Filter/t/null.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/DBM_Filter/t/null.t,v diff -u -p -a -u -p -r1.1.1.3 null.t --- gnu/usr.bin/perl/lib/DBM_Filter/t/null.t 15 Feb 2023 01:33:05 -0000 1.1.1.3 +++ gnu/usr.bin/perl/lib/DBM_Filter/t/null.t 21 Feb 2024 15:47:02 -0000 @@ -21,11 +21,11 @@ BEGIN { }; BEGIN { use_ok('Fcntl') }; -unlink ; -END { unlink ; } +unlink ; +END { unlink ; } my %h1 = () ; -my $db1 = tie(%h1, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +my $db1 = tie(%h1, $db_file,'nullOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db1, "tied to $db_file"; @@ -76,7 +76,7 @@ undef $db1; # read the dbm file without the filter, check for null termination my %h2 = () ; -my $db2 = tie(%h2, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +my $db2 = tie(%h2, $db_file,'nullOp_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db2, "tied to $db_file"; Index: gnu/usr.bin/perl/lib/DBM_Filter/t/utf8.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/DBM_Filter/t/utf8.t,v diff -u -p -a -u -p -r1.3 utf8.t --- gnu/usr.bin/perl/lib/DBM_Filter/t/utf8.t 15 Feb 2023 01:36:33 -0000 1.3 +++ gnu/usr.bin/perl/lib/DBM_Filter/t/utf8.t 21 Feb 2024 15:47:02 -0000 @@ -37,11 +37,11 @@ BEGIN { use_ok('charnames', qw{greek})}; use charnames qw{greek}; -unlink ; -END { unlink ; } +unlink ; +END { unlink ; } my %h1 = () ; -my $db1 = tie(%h1, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +my $db1 = tie(%h1, $db_file,'utf8Op_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db1, "tied to $db_file"; @@ -77,7 +77,7 @@ undef $db1; # read the dbm file without the filter my %h2 = () ; -my $db2 = tie(%h2, $db_file,'Op_dbmx', O_RDWR|O_CREAT, 0640) ; +my $db2 = tie(%h2, $db_file,'utf8Op_dbmx', O_RDWR|O_CREAT, 0640) ; ok $db2, "tied to $db_file"; Index: gnu/usr.bin/perl/lib/File/Basename.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/File/Basename.pm,v diff -u -p -a -u -p -r1.14 Basename.pm --- gnu/usr.bin/perl/lib/File/Basename.pm 17 Nov 2014 20:57:06 -0000 1.14 +++ gnu/usr.bin/perl/lib/File/Basename.pm 21 Feb 2024 15:47:02 -0000 @@ -6,11 +6,11 @@ File::Basename - Parse file paths into d use File::Basename; - ($name,$path,$suffix) = fileparse($fullname,@suffixlist); - $name = fileparse($fullname,@suffixlist); + my ($name, $path, $suffix) = fileparse($fullname, @suffixlist); + my $name = fileparse($fullname, @suffixlist); - $basename = basename($fullname,@suffixlist); - $dirname = dirname($fullname); + my $basename = basename($fullname, @suffixlist); + my $dirname = dirname($fullname); =head1 DESCRIPTION @@ -54,7 +54,7 @@ our(@ISA, @EXPORT, $VERSION, $Fileparse_ require Exporter; @ISA = qw(Exporter); @EXPORT = qw(fileparse fileparse_set_fstype basename dirname); -$VERSION = "2.85"; +$VERSION = "2.86"; fileparse_set_fstype($^O); Index: gnu/usr.bin/perl/lib/File/Copy.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/File/Copy.pm,v diff -u -p -a -u -p -r1.21 Copy.pm --- gnu/usr.bin/perl/lib/File/Copy.pm 15 Feb 2023 01:36:33 -0000 1.21 +++ gnu/usr.bin/perl/lib/File/Copy.pm 21 Feb 2024 15:47:02 -0000 @@ -23,7 +23,7 @@ sub syscopy; sub cp; sub mv; -$VERSION = '2.39'; +$VERSION = '2.41'; require Exporter; @ISA = qw(Exporter); @@ -339,14 +339,14 @@ File::Copy - Copy files or filehandles use File::Copy; - copy("sourcefile","destinationfile") or die "Copy failed: $!"; - copy("Copy.pm",\*STDOUT); - move("/dev1/sourcefile","/dev2/destinationfile"); + copy("sourcefile", "destinationfile") or die "Copy failed: $!"; + copy("Copy.pm", \*STDOUT); + move("/dev1/sourcefile", "/dev2/destinationfile"); use File::Copy "cp"; - $n = FileHandle->new("/a/file","r"); - cp($n,"x"); + my $n = FileHandle->new("/a/file", "r"); + cp($n, "x"); =head1 DESCRIPTION @@ -395,9 +395,12 @@ You may use the syntax C the same. The behavior is nearly the same as well: as of version 2.15, C will preserve the source file's permission bits like the shell utility -C would do, while C uses the default permissions for the -target file (which may depend on the process' C, file -ownership, inherited ACLs, etc.). If an error occurs in setting +C would do with default options, while C uses the default +permissions for the target file (which may depend on the process' +C, file ownership, inherited ACLs, etc.). That is, if the +destination file already exists, C will leave its permissions +unchanged; otherwise the permissions are taken from the source file +and modified by the C. If an error occurs in setting permissions, C will return 0, regardless of whether the file was successfully copied. Index: gnu/usr.bin/perl/lib/File/stat.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/File/stat.pm,v diff -u -p -a -u -p -r1.10 stat.pm --- gnu/usr.bin/perl/lib/File/stat.pm 15 Feb 2023 01:36:33 -0000 1.10 +++ gnu/usr.bin/perl/lib/File/stat.pm 21 Feb 2024 15:47:02 -0000 @@ -11,7 +11,7 @@ BEGIN { *warnif = \&warnings::warnif } our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); -our $VERSION = '1.12'; +our $VERSION = '1.13'; our @fields; our ( $st_dev, $st_ino, $st_mode, @@ -233,7 +233,7 @@ File::stat - by-name interface to Perl's =head1 SYNOPSIS use File::stat; - $st = stat($file) or die "No $file: $!"; + my $st = stat($file) or die "No $file: $!"; if ( ($st->mode & 0111) && ($st->nlink > 1) ) { print "$file is executable with lotsa links\n"; } Index: gnu/usr.bin/perl/lib/Net/protoent.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/Net/protoent.pm,v diff -u -p -a -u -p -r1.5 protoent.pm --- gnu/usr.bin/perl/lib/Net/protoent.pm 13 Feb 2019 21:15:25 -0000 1.5 +++ gnu/usr.bin/perl/lib/Net/protoent.pm 21 Feb 2024 15:47:02 -0000 @@ -2,7 +2,7 @@ package Net::protoent; use strict; use 5.006_001; -our $VERSION = '1.01'; +our $VERSION = '1.02'; our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); our ( $p_name, @p_aliases, $p_proto ); BEGIN { @@ -51,7 +51,7 @@ Net::protoent - by-name interface to Per =head1 SYNOPSIS use Net::protoent; - $p = getprotobyname(shift || 'tcp') || die "no proto"; + my $p = getprotobyname(shift || 'tcp') || die "no proto"; printf "proto for %s is %d, aliases are %s\n", $p->name, $p->proto, "@{$p->aliases}"; Index: gnu/usr.bin/perl/lib/Net/servent.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/Net/servent.pm,v diff -u -p -a -u -p -r1.5 servent.pm --- gnu/usr.bin/perl/lib/Net/servent.pm 13 Feb 2019 21:15:25 -0000 1.5 +++ gnu/usr.bin/perl/lib/Net/servent.pm 21 Feb 2024 15:47:02 -0000 @@ -2,7 +2,7 @@ package Net::servent; use strict; use 5.006_001; -our $VERSION = '1.02'; +our $VERSION = '1.03'; our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); our ( $s_name, @s_aliases, $s_port, $s_proto ); BEGIN { @@ -53,7 +53,7 @@ Net::servent - by-name interface to Perl =head1 SYNOPSIS use Net::servent; - $s = getservbyname(shift || 'ftp') || die "no service"; + my $s = getservbyname(shift || 'ftp') || die "no service"; printf "port for %s is %s, aliases are %s\n", $s->name, $s->port, "@{$s->aliases}"; Index: gnu/usr.bin/perl/lib/Unicode/UCD.t =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/Unicode/UCD.t,v diff -u -p -a -u -p -r1.6 UCD.t --- gnu/usr.bin/perl/lib/Unicode/UCD.t 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/Unicode/UCD.t 21 Feb 2024 15:47:02 -0000 @@ -19,7 +19,7 @@ use Test::More; use Unicode::UCD qw(charinfo charprop charprops_all); -my $expected_version = '14.0.0'; +my $expected_version = '15.0.0'; my $current_version = Unicode::UCD::UnicodeVersion; my $v_unicode_version = pack "C*", split /\./, $current_version; my $unknown_script = ($v_unicode_version lt v5.0.0) @@ -786,7 +786,7 @@ SKIP: skip("Latin range count will be wrong when using older Unicode release", 2) if $current_version lt $expected_version; my $n1 = @$r1; - is($n1, 38, "number of ranges in Latin script (Unicode $expected_version)") if $::IS_ASCII; + is($n1, 39, "number of ranges in Latin script (Unicode $expected_version)") if $::IS_ASCII; shift @$r1 while @$r1; my $r2 = charscript('Latin'); is(@$r2, $n1, "modifying results should not mess up internal caches"); Index: gnu/usr.bin/perl/lib/Unicode/testnorm.t =================================================================== RCS file: gnu/usr.bin/perl/lib/Unicode/testnorm.t diff -N gnu/usr.bin/perl/lib/Unicode/testnorm.t --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/lib/Unicode/testnorm.t 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,26 @@ +use strict; +use warnings; + +BEGIN { + chdir 't' if -d 't'; +} + +# This is a wrapper for a generated file. Assumes being run from 't' +# directory. + +if (! $ENV{PERL_DEBUG_FULL_TEST}) { + print "1..0 # skipped: Lengthy Tests Disabled; to enable set environment", + "variable \$ENV{PERL_DEBUG_FULL_TEST} to a true value\n"; + 0 +} +else { + my $file = '../lib/unicore/TestNorm.pl'; + if (-e $file) { + do $file; + } + else { + print "1..0 # Skip $file not built (perhaps build options don't" + . " build it)\n"; + 0 + } +} Index: gnu/usr.bin/perl/lib/User/grent.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/User/grent.pm,v diff -u -p -a -u -p -r1.7 grent.pm --- gnu/usr.bin/perl/lib/User/grent.pm 30 Dec 2019 02:13:54 -0000 1.7 +++ gnu/usr.bin/perl/lib/User/grent.pm 21 Feb 2024 15:47:02 -0000 @@ -2,7 +2,7 @@ package User::grent; use strict; use 5.006_001; -our $VERSION = '1.03'; +our $VERSION = '1.04'; our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); our ($gr_name, $gr_gid, $gr_passwd, @gr_members); BEGIN { @@ -46,7 +46,7 @@ User::grent - by-name interface to Perl' =head1 SYNOPSIS use User::grent; - $gr = getgrgid(0) or die "No group zero"; + my $gr = getgrgid(0) or die "No group zero"; if ( $gr->name eq 'wheel' && @{$gr->members} > 1 ) { print "gid zero name wheel, with other members"; } @@ -57,7 +57,7 @@ User::grent - by-name interface to Perl' print "gid zero name wheel, with other members"; } - $gr = getgr($whoever); + my $gr = getgr($whoever); =head1 DESCRIPTION Index: gnu/usr.bin/perl/lib/User/pwent.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/User/pwent.pm,v diff -u -p -a -u -p -r1.5 pwent.pm --- gnu/usr.bin/perl/lib/User/pwent.pm 13 Feb 2019 21:15:25 -0000 1.5 +++ gnu/usr.bin/perl/lib/User/pwent.pm 21 Feb 2024 15:47:02 -0000 @@ -1,7 +1,7 @@ package User::pwent; use 5.006; -our $VERSION = '1.01'; +our $VERSION = '1.02'; use strict; use warnings; @@ -189,14 +189,14 @@ User::pwent - by-name interface to Perl' =head1 SYNOPSIS use User::pwent; - $pw = getpwnam('daemon') || die "No daemon user"; + my $pw = getpwnam('daemon') || die "No daemon user"; if ( $pw->uid == 1 && $pw->dir =~ m#^/(bin|tmp)?\z#s ) { print "gid 1 on root dir"; } - $real_shell = $pw->shell || '/bin/sh'; + my $real_shell = $pw->shell || '/bin/sh'; - for (($fullname, $office, $workphone, $homephone) = + for (my ($fullname, $office, $workphone, $homephone) = split /\s*,\s*/, $pw->gecos) { s/&/ucfirst(lc($pw->name))/ge; @@ -208,7 +208,7 @@ User::pwent - by-name interface to Perl' print "gid 1 on root dir"; } - $pw = getpw($whoever); + my $pw = getpw($whoever); use User::pwent qw/:DEFAULT pw_has/; if (pw_has(qw[gecos expire quota])) { .... } Index: gnu/usr.bin/perl/lib/overload/numbers.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/overload/numbers.pm,v diff -u -p -a -u -p -r1.2 numbers.pm --- gnu/usr.bin/perl/lib/overload/numbers.pm 5 Feb 2017 00:32:15 -0000 1.2 +++ gnu/usr.bin/perl/lib/overload/numbers.pm 21 Feb 2024 15:47:02 -0000 @@ -1,4 +1,4 @@ -# -*- buffer-read-only: t -*- +# -*- mode: Perl; buffer-read-only: t -*- # # lib/overload/numbers.pm # @@ -173,4 +173,4 @@ our @enums = qw# { my $i = 0; our %enums = map { $_ => $i++ } @enums } -# ex: set ro: +# ex: set ro ft=perl: Index: gnu/usr.bin/perl/lib/unicore/ArabicShaping.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/ArabicShaping.txt,v diff -u -p -a -u -p -r1.6 ArabicShaping.txt --- gnu/usr.bin/perl/lib/unicore/ArabicShaping.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/ArabicShaping.txt 21 Feb 2024 15:47:02 -0000 @@ -1,8 +1,8 @@ -# ArabicShaping-14.0.0.txt -# Date: 2021-05-21, 01:54:00 GMT [KW, RP] -# © 2021 Unicode®, Inc. +# ArabicShaping-15.0.0.txt +# Date: 2022-02-14, 18:50:00 GMT [KW, RP] +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # This file is a normative contributory data file in the # Unicode Character Database. Index: gnu/usr.bin/perl/lib/unicore/BidiBrackets.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/BidiBrackets.txt,v diff -u -p -a -u -p -r1.6 BidiBrackets.txt --- gnu/usr.bin/perl/lib/unicore/BidiBrackets.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/BidiBrackets.txt 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ -# BidiBrackets-14.0.0.txt -# Date: 2021-06-30, 23:59:00 GMT [AG, LI, KW] -# © 2021 Unicode®, Inc. +# BidiBrackets-15.0.0.txt +# Date: 2022-05-03, 18:42:00 GMT [AG, LI, KW] +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see https://www.unicode.org/terms_of_use.html # Index: gnu/usr.bin/perl/lib/unicore/BidiMirroring.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/BidiMirroring.txt,v diff -u -p -a -u -p -r1.6 BidiMirroring.txt --- gnu/usr.bin/perl/lib/unicore/BidiMirroring.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/BidiMirroring.txt 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ -# BidiMirroring-14.0.0.txt -# Date: 2021-08-08, 22:55:00 GMT [KW, RP] -# © 2021 Unicode®, Inc. +# BidiMirroring-15.0.0.txt +# Date: 2022-05-03, 18:47:00 GMT [KW, RP] +# © 2022 Unicode®, Inc. # For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database @@ -15,7 +15,7 @@ # value, for which there is another Unicode character that typically has a glyph # that is the mirror image of the original character's glyph. # -# The repertoire covered by the file is Unicode 14.0.0. +# The repertoire covered by the file is Unicode 15.0.0. # # The file contains a list of lines with mappings from one code point # to another one for character-based mirroring. Index: gnu/usr.bin/perl/lib/unicore/Blocks.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/Blocks.txt,v diff -u -p -a -u -p -r1.6 Blocks.txt --- gnu/usr.bin/perl/lib/unicore/Blocks.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/Blocks.txt 21 Feb 2024 15:47:02 -0000 @@ -1,10 +1,10 @@ -# Blocks-14.0.0.txt -# Date: 2021-01-22, 23:29:00 GMT [KW] -# © 2021 Unicode®, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# Blocks-15.0.0.txt +# Date: 2022-01-28, 20:58:00 GMT [KW] +# © 2022 Unicode®, Inc. +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # Format: # Start Code..End Code; Block Name @@ -15,7 +15,7 @@ # and underbars are ignored. # For example, "Latin Extended-A" and "latin extended a" are equivalent. # For more information on the comparison of property values, -# see UAX #44: http://www.unicode.org/reports/tr44/ +# see UAX #44: https://www.unicode.org/reports/tr44/ # # All block ranges start with a value where (cp MOD 16) = 0, # and end with a value where (cp MOD 16) = 15. In other words, @@ -241,6 +241,7 @@ FFF0..FFFF; Specials 10D00..10D3F; Hanifi Rohingya 10E60..10E7F; Rumi Numeral Symbols 10E80..10EBF; Yezidi +10EC0..10EFF; Arabic Extended-C 10F00..10F2F; Old Sogdian 10F30..10F6F; Sogdian 10F70..10FAF; Old Uyghur @@ -272,11 +273,13 @@ FFF0..FFFF; Specials 11A50..11AAF; Soyombo 11AB0..11ABF; Unified Canadian Aboriginal Syllabics Extended-A 11AC0..11AFF; Pau Cin Hau +11B00..11B5F; Devanagari Extended-A 11C00..11C6F; Bhaiksuki 11C70..11CBF; Marchen 11D00..11D5F; Masaram Gondi 11D60..11DAF; Gunjala Gondi 11EE0..11EFF; Makasar +11F00..11F5F; Kawi 11FB0..11FBF; Lisu Supplement 11FC0..11FFF; Tamil Supplement 12000..123FF; Cuneiform @@ -284,7 +287,7 @@ FFF0..FFFF; Specials 12480..1254F; Early Dynastic Cuneiform 12F90..12FFF; Cypro-Minoan 13000..1342F; Egyptian Hieroglyphs -13430..1343F; Egyptian Hieroglyph Format Controls +13430..1345F; Egyptian Hieroglyph Format Controls 14400..1467F; Anatolian Hieroglyphs 16800..16A3F; Bamum Supplement 16A40..16A6F; Mro @@ -309,6 +312,7 @@ FFF0..FFFF; Specials 1D000..1D0FF; Byzantine Musical Symbols 1D100..1D1FF; Musical Symbols 1D200..1D24F; Ancient Greek Musical Notation +1D2C0..1D2DF; Kaktovik Numerals 1D2E0..1D2FF; Mayan Numerals 1D300..1D35F; Tai Xuan Jing Symbols 1D360..1D37F; Counting Rod Numerals @@ -316,9 +320,11 @@ FFF0..FFFF; Specials 1D800..1DAAF; Sutton SignWriting 1DF00..1DFFF; Latin Extended-G 1E000..1E02F; Glagolitic Supplement +1E030..1E08F; Cyrillic Extended-D 1E100..1E14F; Nyiakeng Puachue Hmong 1E290..1E2BF; Toto 1E2C0..1E2FF; Wancho +1E4D0..1E4FF; Nag Mundari 1E7E0..1E7FF; Ethiopic Extended-B 1E800..1E8DF; Mende Kikakui 1E900..1E95F; Adlam @@ -348,6 +354,7 @@ FFF0..FFFF; Specials 2CEB0..2EBEF; CJK Unified Ideographs Extension F 2F800..2FA1F; CJK Compatibility Ideographs Supplement 30000..3134F; CJK Unified Ideographs Extension G +31350..323AF; CJK Unified Ideographs Extension H E0000..E007F; Tags E0100..E01EF; Variation Selectors Supplement F0000..FFFFF; Supplementary Private Use Area-A Index: gnu/usr.bin/perl/lib/unicore/CJKRadicals.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/CJKRadicals.txt,v diff -u -p -a -u -p -r1.6 CJKRadicals.txt --- gnu/usr.bin/perl/lib/unicore/CJKRadicals.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/CJKRadicals.txt 21 Feb 2024 15:47:02 -0000 @@ -1,10 +1,10 @@ -# CJKRadicals-14.0.0.txt -# Date: 2021-03-16, 21:39:00 GMT [RC, KW, LI] -# © 2021 Unicode®, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# CJKRadicals-15.0.0.txt +# Date: 2022-05-03, 18:49:00 GMT [RC, KW, LI] +# © 2022 Unicode®, Inc. +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # Mapping from CJK radical numbers to characters # @@ -23,7 +23,7 @@ # and in particular they can end with a U+0027 ' APOSTROPHE. # # For more information, see UAX #38: Unicode Han Database (Unihan), -# at http://www.unicode.org/reports/tr38/ +# at https://www.unicode.org/reports/tr38/ # # This file was created for Unicode 5.2 by Richard Cook. # Updated for Unicode 6.0 by Richard Cook. Index: gnu/usr.bin/perl/lib/unicore/CaseFolding.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/CaseFolding.txt,v diff -u -p -a -u -p -r1.6 CaseFolding.txt --- gnu/usr.bin/perl/lib/unicore/CaseFolding.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/CaseFolding.txt 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# CaseFolding-14.0.0.txt -# Date: 2021-03-08, 19:35:41 GMT -# © 2021 Unicode®, Inc. +# CaseFolding-15.0.0.txt +# Date: 2022-02-02, 23:35:35 GMT +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # Case Folding Properties # Index: gnu/usr.bin/perl/lib/unicore/CombiningClass.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/CombiningClass.pl,v diff -u -p -a -u -p -r1.12 CombiningClass.pl --- gnu/usr.bin/perl/lib/unicore/CombiningClass.pl 15 Feb 2023 01:39:49 -0000 1.12 +++ gnu/usr.bin/perl/lib/unicore/CombiningClass.pl 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ # !!!!!!! DO NOT EDIT THIS FILE !!!!!!! # This file is machine-generated by lib/unicore/mktables from the Unicode -# database, Version 14.0.0. Any changes made here will be lost! +# database, Version 15.0.0. Any changes made here will be lost! # !!!!!!! INTERNAL PERL USE ONLY !!!!!!! # This file is for internal use by core Perl only. The format and even the @@ -325,6 +325,7 @@ FE2E FE2F 230 10AE6 220 10D24 10D27 230 10EAB 10EAC 230 +10EFD 10EFF 220 10F46 10F47 220 10F48 10F4A 230 10F4B 220 @@ -375,6 +376,7 @@ FE2E FE2F 230 11D42 7 11D44 11D45 9 11D97 9 +11F41 11F42 9 16AF0 16AF4 1 16B30 16B36 230 16FF0 16FF1 6 @@ -393,9 +395,13 @@ FE2E FE2F 230 1E01B 1E021 230 1E023 1E024 230 1E026 1E02A 230 +1E08F 230 1E130 1E136 230 1E2AE 230 1E2EC 1E2EF 230 +1E4EC 1E4ED 232 +1E4EE 220 +1E4EF 230 1E8D0 1E8D6 220 1E944 1E949 230 1E94A 7 Index: gnu/usr.bin/perl/lib/unicore/CompositionExclusions.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/CompositionExclusions.txt,v diff -u -p -a -u -p -r1.6 CompositionExclusions.txt --- gnu/usr.bin/perl/lib/unicore/CompositionExclusions.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/CompositionExclusions.txt 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ -# CompositionExclusions-14.0.0.txt -# Date: 2021-03-30, 23:59:00 GMT [KW, LI] -# © 2021 Unicode®, Inc. +# CompositionExclusions-15.0.0.txt +# Date: 2022-05-03, 18:50:00 GMT [KW, LI] +# © 2022 Unicode®, Inc. # For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database Index: gnu/usr.bin/perl/lib/unicore/DAge.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/DAge.txt,v diff -u -p -a -u -p -r1.6 DAge.txt --- gnu/usr.bin/perl/lib/unicore/DAge.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/DAge.txt 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# DerivedAge-14.0.0.txt -# Date: 2021-07-10, 00:35:00 GMT -# © 2021 Unicode®, Inc. +# DerivedAge-15.0.0.txt +# Date: 2022-04-26, 23:14:23 GMT +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # Unicode Character Database: Derived Property Data # This file shows when various code points were first assigned in Unicode. @@ -1948,5 +1948,47 @@ FDFE..FDFF ; 14.0 # [2] ARABIC LIGA 2B735..2B738 ; 14.0 # [4] CJK UNIFIED IDEOGRAPH-2B735..CJK UNIFIED IDEOGRAPH-2B738 # Total code points: 838 + +# ================================================ + +# Age=V15_0 + +# Newly assigned in Unicode 15.0.0 (September, 2022) + +0CF3 ; 15.0 # KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT +0ECE ; 15.0 # LAO YAMAKKAN +10EFD..10EFF ; 15.0 # [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA +1123F..11241 ; 15.0 # [3] KHOJKI LETTER QA..KHOJKI VOWEL SIGN VOCALIC R +11B00..11B09 ; 15.0 # [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU +11F00..11F10 ; 15.0 # [17] KAWI SIGN CANDRABINDU..KAWI LETTER O +11F12..11F3A ; 15.0 # [41] KAWI LETTER KA..KAWI VOWEL SIGN VOCALIC R +11F3E..11F59 ; 15.0 # [28] KAWI VOWEL SIGN E..KAWI DIGIT NINE +1342F ; 15.0 # EGYPTIAN HIEROGLYPH V011D +13439..1343F ; 15.0 # [7] EGYPTIAN HIEROGLYPH INSERT AT MIDDLE..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +13440..13455 ; 15.0 # [22] EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED +1B132 ; 15.0 # HIRAGANA LETTER SMALL KO +1B155 ; 15.0 # KATAKANA LETTER SMALL KO +1D2C0..1D2D3 ; 15.0 # [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN +1DF25..1DF2A ; 15.0 # [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E030..1E06D ; 15.0 # [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; 15.0 # COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +1E4D0..1E4F9 ; 15.0 # [42] NAG MUNDARI LETTER O..NAG MUNDARI DIGIT NINE +1F6DC ; 15.0 # WIRELESS +1F774..1F776 ; 15.0 # [3] LOT OF FORTUNE..LUNAR ECLIPSE +1F77B..1F77F ; 15.0 # [5] HAUMEA..ORCUS +1F7D9 ; 15.0 # NINE POINTED WHITE STAR +1FA75..1FA77 ; 15.0 # [3] LIGHT BLUE HEART..PINK HEART +1FA87..1FA88 ; 15.0 # [2] MARACAS..FLUTE +1FAAD..1FAAF ; 15.0 # [3] FOLDING HAND FAN..KHANDA +1FABB..1FABD ; 15.0 # [3] HYACINTH..WING +1FABF ; 15.0 # GOOSE +1FACE..1FACF ; 15.0 # [2] MOOSE..DONKEY +1FADA..1FADB ; 15.0 # [2] GINGER ROOT..PEA POD +1FAE8 ; 15.0 # SHAKING FACE +1FAF7..1FAF8 ; 15.0 # [2] LEFTWARDS PUSHING HAND..RIGHTWARDS PUSHING HAND +2B739 ; 15.0 # CJK UNIFIED IDEOGRAPH-2B739 +31350..323AF ; 15.0 # [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF + +# Total code points: 4489 # EOF Index: gnu/usr.bin/perl/lib/unicore/DCoreProperties.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/DCoreProperties.txt,v diff -u -p -a -u -p -r1.6 DCoreProperties.txt --- gnu/usr.bin/perl/lib/unicore/DCoreProperties.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/DCoreProperties.txt 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# DerivedCoreProperties-14.0.0.txt -# Date: 2021-08-12, 23:12:53 GMT -# © 2021 Unicode®, Inc. +# DerivedCoreProperties-15.0.0.txt +# Date: 2022-08-05, 22:17:05 GMT +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # ================================================ @@ -462,6 +462,7 @@ FFE9..FFEC ; Math # Sm [4] HALFWIDT 0BD7 ; Alphabetic # Mc TAMIL AU LENGTH MARK 0C00 ; Alphabetic # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE 0C01..0C03 ; Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; Alphabetic # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE 0C05..0C0C ; Alphabetic # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L 0C0E..0C10 ; Alphabetic # Lo [3] TELUGU LETTER E..TELUGU LETTER AI 0C12..0C28 ; Alphabetic # Lo [23] TELUGU LETTER O..TELUGU LETTER NA @@ -497,6 +498,7 @@ FFE9..FFEC ; Math # Sm [4] HALFWIDT 0CE0..0CE1 ; Alphabetic # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL 0CE2..0CE3 ; Alphabetic # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CF1..0CF2 ; Alphabetic # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; Alphabetic # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D00..0D01 ; Alphabetic # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03 ; Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D04..0D0C ; Alphabetic # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L @@ -552,7 +554,7 @@ FFE9..FFEC ; Math # Sm [4] HALFWIDT 0F49..0F6C ; Alphabetic # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA 0F71..0F7E ; Alphabetic # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO 0F7F ; Alphabetic # Mc TIBETAN SIGN RNAM BCAD -0F80..0F81 ; Alphabetic # Mn [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II +0F80..0F83 ; Alphabetic # Mn [4] TIBETAN VOWEL SIGN REVERSED I..TIBETAN SIGN SNA LDAN 0F88..0F8C ; Alphabetic # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN 0F8D..0F97 ; Alphabetic # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA 0F99..0FBC ; Alphabetic # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA @@ -1053,6 +1055,7 @@ FFDA..FFDC ; Alphabetic # Lo [3] HA 11071..11072 ; Alphabetic # Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O 11073..11074 ; Alphabetic # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O 11075 ; Alphabetic # Lo BRAHMI LETTER OLD TAMIL LLA +11080..11081 ; Alphabetic # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA 11082 ; Alphabetic # Mc KAITHI SIGN VISARGA 11083..110AF ; Alphabetic # Lo [45] KAITHI LETTER A..KAITHI LETTER HA 110B0..110B2 ; Alphabetic # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II @@ -1089,6 +1092,8 @@ FFDA..FFDC ; Alphabetic # Lo [3] HA 11234 ; Alphabetic # Mn KHOJKI SIGN ANUSVARA 11237 ; Alphabetic # Mn KHOJKI SIGN SHADDA 1123E ; Alphabetic # Mn KHOJKI SIGN SUKUN +1123F..11240 ; Alphabetic # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241 ; Alphabetic # Mn KHOJKI VOWEL SIGN VOCALIC R 11280..11286 ; Alphabetic # Lo [7] MULTANI LETTER A..MULTANI LETTER GA 11288 ; Alphabetic # Lo MULTANI LETTER GHA 1128A..1128D ; Alphabetic # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -1243,12 +1248,22 @@ FFDA..FFDC ; Alphabetic # Lo [3] HA 11EE0..11EF2 ; Alphabetic # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA 11EF3..11EF4 ; Alphabetic # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6 ; Alphabetic # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11F00..11F01 ; Alphabetic # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02 ; Alphabetic # Lo KAWI SIGN REPHA +11F03 ; Alphabetic # Mc KAWI SIGN VISARGA +11F04..11F10 ; Alphabetic # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; Alphabetic # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35 ; Alphabetic # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; Alphabetic # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; Alphabetic # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; Alphabetic # Mn KAWI VOWEL SIGN EU 11FB0 ; Alphabetic # Lo LISU LETTER YHA 12000..12399 ; Alphabetic # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; Alphabetic # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12480..12543 ; Alphabetic # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU 12F90..12FF0 ; Alphabetic # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 -13000..1342E ; Alphabetic # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +13000..1342F ; Alphabetic # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13441..13446 ; Alphabetic # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN 14400..14646 ; Alphabetic # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 16800..16A38 ; Alphabetic # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ 16A40..16A5E ; Alphabetic # Lo [31] MRO LETTER TA..MRO LETTER TEK @@ -1275,7 +1290,9 @@ FFDA..FFDC ; Alphabetic # Lo [3] HA 1AFF5..1AFFB ; Alphabetic # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; Alphabetic # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 1B000..1B122 ; Alphabetic # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B132 ; Alphabetic # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; Alphabetic # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; Alphabetic # Lo KATAKANA LETTER SMALL KO 1B164..1B167 ; Alphabetic # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1B170..1B2FB ; Alphabetic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; Alphabetic # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M @@ -1316,16 +1333,21 @@ FFDA..FFDC ; Alphabetic # Lo [3] HA 1DF00..1DF09 ; Alphabetic # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; Alphabetic # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK 1DF0B..1DF1E ; Alphabetic # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; Alphabetic # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK 1E000..1E006 ; Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018 ; Alphabetic # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021 ; Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI 1E023..1E024 ; Alphabetic # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS 1E026..1E02A ; Alphabetic # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E030..1E06D ; Alphabetic # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; Alphabetic # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 1E100..1E12C ; Alphabetic # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W 1E137..1E13D ; Alphabetic # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER 1E14E ; Alphabetic # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ 1E290..1E2AD ; Alphabetic # Lo [30] TOTO LETTER PA..TOTO LETTER A 1E2C0..1E2EB ; Alphabetic # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH +1E4D0..1E4EA ; Alphabetic # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; Alphabetic # Lm NAG MUNDARI SIGN OJOD 1E7E0..1E7E6 ; Alphabetic # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO 1E7E8..1E7EB ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE 1E7ED..1E7EE ; Alphabetic # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE @@ -1371,14 +1393,15 @@ FFDA..FFDC ; Alphabetic # Lo [3] HA 1F150..1F169 ; Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z 20000..2A6DF ; Alphabetic # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B738 ; Alphabetic # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 +2A700..2B739 ; Alphabetic # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 2B740..2B81D ; Alphabetic # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Alphabetic # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; Alphabetic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; Alphabetic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; Alphabetic # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; Alphabetic # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 133396 +# Total code points: 137765 # ================================================ @@ -1663,6 +1686,7 @@ FFDA..FFDC ; Alphabetic # Lo [3] HA 052F ; Lowercase # L& CYRILLIC SMALL LETTER EL WITH DESCENDER 0560..0588 ; Lowercase # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE 10D0..10FA ; Lowercase # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FC ; Lowercase # Lm MODIFIER LETTER GEORGIAN NAR 10FD..10FF ; Lowercase # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN 13F8..13FD ; Lowercase # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV 1C80..1C88 ; Lowercase # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK @@ -2012,12 +2036,14 @@ A7D3 ; Lowercase # L& LAT A7D5 ; Lowercase # L& LATIN SMALL LETTER DOUBLE WYNN A7D7 ; Lowercase # L& LATIN SMALL LETTER MIDDLE SCOTS S A7D9 ; Lowercase # L& LATIN SMALL LETTER SIGMOID S +A7F2..A7F4 ; Lowercase # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q A7F6 ; Lowercase # L& LATIN SMALL LETTER REVERSED HALF H A7F8..A7F9 ; Lowercase # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE A7FA ; Lowercase # L& LATIN LETTER SMALL CAPITAL TURNED M AB30..AB5A ; Lowercase # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG AB5C..AB5F ; Lowercase # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK AB60..AB68 ; Lowercase # L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE +AB69 ; Lowercase # Lm MODIFIER LETTER SMALL TURNED W AB70..ABBF ; Lowercase # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA FB00..FB06 ; Lowercase # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST FB13..FB17 ; Lowercase # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH @@ -2065,9 +2091,11 @@ FF41..FF5A ; Lowercase # L& [26] FUL 1D7CB ; Lowercase # L& MATHEMATICAL BOLD SMALL DIGAMMA 1DF00..1DF09 ; Lowercase # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0B..1DF1E ; Lowercase # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; Lowercase # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E030..1E06D ; Lowercase # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E922..1E943 ; Lowercase # L& [34] ADLAM SMALL LETTER ALIF..ADLAM SMALL LETTER SHA -# Total code points: 2471 +# Total code points: 2544 # ================================================ @@ -2767,6 +2795,7 @@ FF21..FF3A ; Uppercase # L& [26] FUL 10C7 ; Cased # L& GEORGIAN CAPITAL LETTER YN 10CD ; Cased # L& GEORGIAN CAPITAL LETTER AEN 10D0..10FA ; Cased # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FC ; Cased # Lm MODIFIER LETTER GEORGIAN NAR 10FD..10FF ; Cased # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN 13A0..13F5 ; Cased # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV 13F8..13FD ; Cased # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV @@ -2837,12 +2866,14 @@ A790..A7CA ; Cased # L& [59] LATIN C A7D0..A7D1 ; Cased # L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G A7D3 ; Cased # L& LATIN SMALL LETTER DOUBLE THORN A7D5..A7D9 ; Cased # L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S +A7F2..A7F4 ; Cased # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q A7F5..A7F6 ; Cased # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H A7F8..A7F9 ; Cased # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE A7FA ; Cased # L& LATIN LETTER SMALL CAPITAL TURNED M AB30..AB5A ; Cased # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG AB5C..AB5F ; Cased # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK AB60..AB68 ; Cased # L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE +AB69 ; Cased # Lm MODIFIER LETTER SMALL TURNED W AB70..ABBF ; Cased # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA FB00..FB06 ; Cased # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST FB13..FB17 ; Cased # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH @@ -2899,12 +2930,14 @@ FF41..FF5A ; Cased # L& [26] FULLWID 1D7C4..1D7CB ; Cased # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1DF00..1DF09 ; Cased # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0B..1DF1E ; Cased # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; Cased # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E030..1E06D ; Cased # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E900..1E943 ; Cased # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA 1F130..1F149 ; Cased # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z 1F150..1F169 ; Cased # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; Cased # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -# Total code points: 4453 +# Total code points: 4526 # ================================================ @@ -3054,7 +3087,7 @@ FF41..FF5A ; Cased # L& [26] FULLWID 0EB1 ; Case_Ignorable # Mn LAO VOWEL SIGN MAI KAN 0EB4..0EBC ; Case_Ignorable # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO 0EC6 ; Case_Ignorable # Lm LAO KO LA -0EC8..0ECD ; Case_Ignorable # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0EC8..0ECE ; Case_Ignorable # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN 0F18..0F19 ; Case_Ignorable # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS 0F35 ; Case_Ignorable # Mn TIBETAN MARK NGAS BZUNG NYI ZLA 0F37 ; Case_Ignorable # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS @@ -3263,6 +3296,7 @@ FFF9..FFFB ; Case_Ignorable # Cf [3 10AE5..10AE6 ; Case_Ignorable # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW 10D24..10D27 ; Case_Ignorable # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI 10EAB..10EAC ; Case_Ignorable # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EFD..10EFF ; Case_Ignorable # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA 10F46..10F50 ; Case_Ignorable # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW 10F82..10F85 ; Case_Ignorable # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW 11001 ; Case_Ignorable # Mn BRAHMI SIGN ANUSVARA @@ -3287,6 +3321,7 @@ FFF9..FFFB ; Case_Ignorable # Cf [3 11234 ; Case_Ignorable # Mn KHOJKI SIGN ANUSVARA 11236..11237 ; Case_Ignorable # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA 1123E ; Case_Ignorable # Mn KHOJKI SIGN SUKUN +11241 ; Case_Ignorable # Mn KHOJKI VOWEL SIGN VOCALIC R 112DF ; Case_Ignorable # Mn KHUDAWADI SIGN ANUSVARA 112E3..112EA ; Case_Ignorable # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA 11300..11301 ; Case_Ignorable # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU @@ -3348,7 +3383,13 @@ FFF9..FFFB ; Case_Ignorable # Cf [3 11D95 ; Case_Ignorable # Mn GUNJALA GONDI SIGN ANUSVARA 11D97 ; Case_Ignorable # Mn GUNJALA GONDI VIRAMA 11EF3..11EF4 ; Case_Ignorable # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U -13430..13438 ; Case_Ignorable # Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT +11F00..11F01 ; Case_Ignorable # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F36..11F3A ; Case_Ignorable # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F40 ; Case_Ignorable # Mn KAWI VOWEL SIGN EU +11F42 ; Case_Ignorable # Mn KAWI CONJOINER +13430..1343F ; Case_Ignorable # Cf [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +13440 ; Case_Ignorable # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13447..13455 ; Case_Ignorable # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED 16AF0..16AF4 ; Case_Ignorable # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; Case_Ignorable # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16B40..16B43 ; Case_Ignorable # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM @@ -3382,10 +3423,14 @@ FFF9..FFFB ; Case_Ignorable # Cf [3 1E01B..1E021 ; Case_Ignorable # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI 1E023..1E024 ; Case_Ignorable # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS 1E026..1E02A ; Case_Ignorable # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E030..1E06D ; Case_Ignorable # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; Case_Ignorable # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 1E130..1E136 ; Case_Ignorable # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D 1E137..1E13D ; Case_Ignorable # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER 1E2AE ; Case_Ignorable # Mn TOTO SIGN RISING TONE 1E2EC..1E2EF ; Case_Ignorable # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E4EB ; Case_Ignorable # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF ; Case_Ignorable # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH 1E8D0..1E8D6 ; Case_Ignorable # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS 1E944..1E94A ; Case_Ignorable # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA 1E94B ; Case_Ignorable # Lm ADLAM NASALIZATION MARK @@ -3394,7 +3439,7 @@ E0001 ; Case_Ignorable # Cf E0020..E007F ; Case_Ignorable # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; Case_Ignorable # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 2602 +# Total code points: 2707 # ================================================ @@ -6617,6 +6662,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALF 111DC ; ID_Start # Lo SHARADA HEADSTROKE 11200..11211 ; ID_Start # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA 11213..1122B ; ID_Start # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1123F..11240 ; ID_Start # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I 11280..11286 ; ID_Start # Lo [7] MULTANI LETTER A..MULTANI LETTER GA 11288 ; ID_Start # Lo MULTANI LETTER GHA 1128A..1128D ; ID_Start # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -6679,12 +6725,16 @@ FFDA..FFDC ; ID_Start # Lo [3] HALF 11D6A..11D89 ; ID_Start # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA 11D98 ; ID_Start # Lo GUNJALA GONDI OM 11EE0..11EF2 ; ID_Start # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11F02 ; ID_Start # Lo KAWI SIGN REPHA +11F04..11F10 ; ID_Start # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; ID_Start # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA 11FB0 ; ID_Start # Lo LISU LETTER YHA 12000..12399 ; ID_Start # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; ID_Start # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12480..12543 ; ID_Start # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU 12F90..12FF0 ; ID_Start # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 -13000..1342E ; ID_Start # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +13000..1342F ; ID_Start # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13441..13446 ; ID_Start # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN 14400..14646 ; ID_Start # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 16800..16A38 ; ID_Start # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ 16A40..16A5E ; ID_Start # Lo [31] MRO LETTER TA..MRO LETTER TEK @@ -6707,7 +6757,9 @@ FFDA..FFDC ; ID_Start # Lo [3] HALF 1AFF5..1AFFB ; ID_Start # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; ID_Start # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 1B000..1B122 ; ID_Start # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B132 ; ID_Start # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; ID_Start # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; ID_Start # Lo KATAKANA LETTER SMALL KO 1B164..1B167 ; ID_Start # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1B170..1B2FB ; ID_Start # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; ID_Start # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M @@ -6747,11 +6799,15 @@ FFDA..FFDC ; ID_Start # Lo [3] HALF 1DF00..1DF09 ; ID_Start # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; ID_Start # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK 1DF0B..1DF1E ; ID_Start # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; ID_Start # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E030..1E06D ; ID_Start # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E100..1E12C ; ID_Start # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W 1E137..1E13D ; ID_Start # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER 1E14E ; ID_Start # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ 1E290..1E2AD ; ID_Start # Lo [30] TOTO LETTER PA..TOTO LETTER A 1E2C0..1E2EB ; ID_Start # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH +1E4D0..1E4EA ; ID_Start # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; ID_Start # Lm NAG MUNDARI SIGN OJOD 1E7E0..1E7E6 ; ID_Start # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO 1E7E8..1E7EB ; ID_Start # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE 1E7ED..1E7EE ; ID_Start # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE @@ -6793,14 +6849,15 @@ FFDA..FFDC ; ID_Start # Lo [3] HALF 1EEA5..1EEA9 ; ID_Start # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH 1EEAB..1EEBB ; ID_Start # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 20000..2A6DF ; ID_Start # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B738 ; ID_Start # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 +2A700..2B739 ; ID_Start # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 2B740..2B81D ; ID_Start # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; ID_Start # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; ID_Start # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; ID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; ID_Start # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; ID_Start # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 131997 +# Total code points: 136345 # ================================================ @@ -7083,6 +7140,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALF 0CE2..0CE3 ; ID_Continue # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CE6..0CEF ; ID_Continue # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF1..0CF2 ; ID_Continue # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; ID_Continue # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D00..0D01 ; ID_Continue # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03 ; ID_Continue # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D04..0D0C ; ID_Continue # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L @@ -7136,7 +7194,7 @@ FFDA..FFDC ; ID_Start # Lo [3] HALF 0EBD ; ID_Continue # Lo LAO SEMIVOWEL SIGN NYO 0EC0..0EC4 ; ID_Continue # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI 0EC6 ; ID_Continue # Lm LAO KO LA -0EC8..0ECD ; ID_Continue # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0EC8..0ECE ; ID_Continue # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN 0ED0..0ED9 ; ID_Continue # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE 0EDC..0EDF ; ID_Continue # Lo [4] LAO HO NO..LAO LETTER KHMU NYO 0F00 ; ID_Continue # Lo TIBETAN SYLLABLE OM @@ -7719,6 +7777,7 @@ FFDA..FFDC ; ID_Continue # Lo [3] H 10E80..10EA9 ; ID_Continue # Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET 10EAB..10EAC ; ID_Continue # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK 10EB0..10EB1 ; ID_Continue # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +10EFD..10EFF ; ID_Continue # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA 10F00..10F1C ; ID_Continue # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL 10F27 ; ID_Continue # Lo OLD SOGDIAN LIGATURE AYIN-DALETH 10F30..10F45 ; ID_Continue # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN @@ -7781,6 +7840,8 @@ FFDA..FFDC ; ID_Continue # Lo [3] H 11235 ; ID_Continue # Mc KHOJKI SIGN VIRAMA 11236..11237 ; ID_Continue # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA 1123E ; ID_Continue # Mn KHOJKI SIGN SUKUN +1123F..11240 ; ID_Continue # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241 ; ID_Continue # Mn KHOJKI VOWEL SIGN VOCALIC R 11280..11286 ; ID_Continue # Lo [7] MULTANI LETTER A..MULTANI LETTER GA 11288 ; ID_Continue # Lo MULTANI LETTER GHA 1128A..1128D ; ID_Continue # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -7963,12 +8024,27 @@ FFDA..FFDC ; ID_Continue # Lo [3] H 11EE0..11EF2 ; ID_Continue # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA 11EF3..11EF4 ; ID_Continue # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6 ; ID_Continue # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11F00..11F01 ; ID_Continue # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02 ; ID_Continue # Lo KAWI SIGN REPHA +11F03 ; ID_Continue # Mc KAWI SIGN VISARGA +11F04..11F10 ; ID_Continue # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; ID_Continue # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35 ; ID_Continue # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; ID_Continue # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; ID_Continue # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; ID_Continue # Mn KAWI VOWEL SIGN EU +11F41 ; ID_Continue # Mc KAWI SIGN KILLER +11F42 ; ID_Continue # Mn KAWI CONJOINER +11F50..11F59 ; ID_Continue # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE 11FB0 ; ID_Continue # Lo LISU LETTER YHA 12000..12399 ; ID_Continue # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; ID_Continue # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12480..12543 ; ID_Continue # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU 12F90..12FF0 ; ID_Continue # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 -13000..1342E ; ID_Continue # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +13000..1342F ; ID_Continue # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13440 ; ID_Continue # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13441..13446 ; ID_Continue # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN +13447..13455 ; ID_Continue # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED 14400..14646 ; ID_Continue # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 16800..16A38 ; ID_Continue # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ 16A40..16A5E ; ID_Continue # Lo [31] MRO LETTER TA..MRO LETTER TEK @@ -8001,7 +8077,9 @@ FFDA..FFDC ; ID_Continue # Lo [3] H 1AFF5..1AFFB ; ID_Continue # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; ID_Continue # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 1B000..1B122 ; ID_Continue # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B132 ; ID_Continue # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; ID_Continue # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; ID_Continue # Lo KATAKANA LETTER SMALL KO 1B164..1B167 ; ID_Continue # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1B170..1B2FB ; ID_Continue # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; ID_Continue # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M @@ -8058,11 +8136,14 @@ FFDA..FFDC ; ID_Continue # Lo [3] H 1DF00..1DF09 ; ID_Continue # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; ID_Continue # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK 1DF0B..1DF1E ; ID_Continue # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; ID_Continue # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK 1E000..1E006 ; ID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018 ; ID_Continue # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021 ; ID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI 1E023..1E024 ; ID_Continue # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS 1E026..1E02A ; ID_Continue # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E030..1E06D ; ID_Continue # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; ID_Continue # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 1E100..1E12C ; ID_Continue # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W 1E130..1E136 ; ID_Continue # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D 1E137..1E13D ; ID_Continue # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER @@ -8073,6 +8154,10 @@ FFDA..FFDC ; ID_Continue # Lo [3] H 1E2C0..1E2EB ; ID_Continue # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH 1E2EC..1E2EF ; ID_Continue # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI 1E2F0..1E2F9 ; ID_Continue # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE +1E4D0..1E4EA ; ID_Continue # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; ID_Continue # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF ; ID_Continue # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E4F0..1E4F9 ; ID_Continue # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE 1E7E0..1E7E6 ; ID_Continue # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO 1E7E8..1E7EB ; ID_Continue # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE 1E7ED..1E7EE ; ID_Continue # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE @@ -8118,15 +8203,16 @@ FFDA..FFDC ; ID_Continue # Lo [3] H 1EEAB..1EEBB ; ID_Continue # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1FBF0..1FBF9 ; ID_Continue # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 20000..2A6DF ; ID_Continue # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B738 ; ID_Continue # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 +2A700..2B739 ; ID_Continue # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 2B740..2B81D ; ID_Continue # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; ID_Continue # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; ID_Continue # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; ID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; ID_Continue # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; ID_Continue # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF E0100..E01EF ; ID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 135072 +# Total code points: 139482 # ================================================ @@ -8685,6 +8771,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HAL 111DC ; XID_Start # Lo SHARADA HEADSTROKE 11200..11211 ; XID_Start # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA 11213..1122B ; XID_Start # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1123F..11240 ; XID_Start # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I 11280..11286 ; XID_Start # Lo [7] MULTANI LETTER A..MULTANI LETTER GA 11288 ; XID_Start # Lo MULTANI LETTER GHA 1128A..1128D ; XID_Start # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -8747,12 +8834,16 @@ FFDA..FFDC ; XID_Start # Lo [3] HAL 11D6A..11D89 ; XID_Start # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA 11D98 ; XID_Start # Lo GUNJALA GONDI OM 11EE0..11EF2 ; XID_Start # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11F02 ; XID_Start # Lo KAWI SIGN REPHA +11F04..11F10 ; XID_Start # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; XID_Start # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA 11FB0 ; XID_Start # Lo LISU LETTER YHA 12000..12399 ; XID_Start # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; XID_Start # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12480..12543 ; XID_Start # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU 12F90..12FF0 ; XID_Start # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 -13000..1342E ; XID_Start # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +13000..1342F ; XID_Start # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13441..13446 ; XID_Start # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN 14400..14646 ; XID_Start # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 16800..16A38 ; XID_Start # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ 16A40..16A5E ; XID_Start # Lo [31] MRO LETTER TA..MRO LETTER TEK @@ -8775,7 +8866,9 @@ FFDA..FFDC ; XID_Start # Lo [3] HAL 1AFF5..1AFFB ; XID_Start # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; XID_Start # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 1B000..1B122 ; XID_Start # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B132 ; XID_Start # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; XID_Start # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; XID_Start # Lo KATAKANA LETTER SMALL KO 1B164..1B167 ; XID_Start # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1B170..1B2FB ; XID_Start # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; XID_Start # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M @@ -8815,11 +8908,15 @@ FFDA..FFDC ; XID_Start # Lo [3] HAL 1DF00..1DF09 ; XID_Start # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; XID_Start # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK 1DF0B..1DF1E ; XID_Start # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; XID_Start # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E030..1E06D ; XID_Start # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E100..1E12C ; XID_Start # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W 1E137..1E13D ; XID_Start # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER 1E14E ; XID_Start # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ 1E290..1E2AD ; XID_Start # Lo [30] TOTO LETTER PA..TOTO LETTER A 1E2C0..1E2EB ; XID_Start # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH +1E4D0..1E4EA ; XID_Start # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; XID_Start # Lm NAG MUNDARI SIGN OJOD 1E7E0..1E7E6 ; XID_Start # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO 1E7E8..1E7EB ; XID_Start # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE 1E7ED..1E7EE ; XID_Start # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE @@ -8861,14 +8958,15 @@ FFDA..FFDC ; XID_Start # Lo [3] HAL 1EEA5..1EEA9 ; XID_Start # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH 1EEAB..1EEBB ; XID_Start # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 20000..2A6DF ; XID_Start # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B738 ; XID_Start # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 +2A700..2B739 ; XID_Start # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 2B740..2B81D ; XID_Start # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; XID_Start # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; XID_Start # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; XID_Start # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; XID_Start # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; XID_Start # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 131974 +# Total code points: 136322 # ================================================ @@ -9147,6 +9245,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HAL 0CE2..0CE3 ; XID_Continue # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CE6..0CEF ; XID_Continue # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF1..0CF2 ; XID_Continue # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; XID_Continue # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D00..0D01 ; XID_Continue # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03 ; XID_Continue # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D04..0D0C ; XID_Continue # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L @@ -9200,7 +9299,7 @@ FFDA..FFDC ; XID_Start # Lo [3] HAL 0EBD ; XID_Continue # Lo LAO SEMIVOWEL SIGN NYO 0EC0..0EC4 ; XID_Continue # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI 0EC6 ; XID_Continue # Lm LAO KO LA -0EC8..0ECD ; XID_Continue # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0EC8..0ECE ; XID_Continue # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN 0ED0..0ED9 ; XID_Continue # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE 0EDC..0EDF ; XID_Continue # Lo [4] LAO HO NO..LAO LETTER KHMU NYO 0F00 ; XID_Continue # Lo TIBETAN SYLLABLE OM @@ -9788,6 +9887,7 @@ FFDA..FFDC ; XID_Continue # Lo [3] 10E80..10EA9 ; XID_Continue # Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET 10EAB..10EAC ; XID_Continue # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK 10EB0..10EB1 ; XID_Continue # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +10EFD..10EFF ; XID_Continue # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA 10F00..10F1C ; XID_Continue # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL 10F27 ; XID_Continue # Lo OLD SOGDIAN LIGATURE AYIN-DALETH 10F30..10F45 ; XID_Continue # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN @@ -9850,6 +9950,8 @@ FFDA..FFDC ; XID_Continue # Lo [3] 11235 ; XID_Continue # Mc KHOJKI SIGN VIRAMA 11236..11237 ; XID_Continue # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA 1123E ; XID_Continue # Mn KHOJKI SIGN SUKUN +1123F..11240 ; XID_Continue # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241 ; XID_Continue # Mn KHOJKI VOWEL SIGN VOCALIC R 11280..11286 ; XID_Continue # Lo [7] MULTANI LETTER A..MULTANI LETTER GA 11288 ; XID_Continue # Lo MULTANI LETTER GHA 1128A..1128D ; XID_Continue # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -10032,12 +10134,27 @@ FFDA..FFDC ; XID_Continue # Lo [3] 11EE0..11EF2 ; XID_Continue # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA 11EF3..11EF4 ; XID_Continue # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6 ; XID_Continue # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11F00..11F01 ; XID_Continue # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02 ; XID_Continue # Lo KAWI SIGN REPHA +11F03 ; XID_Continue # Mc KAWI SIGN VISARGA +11F04..11F10 ; XID_Continue # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; XID_Continue # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35 ; XID_Continue # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; XID_Continue # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; XID_Continue # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; XID_Continue # Mn KAWI VOWEL SIGN EU +11F41 ; XID_Continue # Mc KAWI SIGN KILLER +11F42 ; XID_Continue # Mn KAWI CONJOINER +11F50..11F59 ; XID_Continue # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE 11FB0 ; XID_Continue # Lo LISU LETTER YHA 12000..12399 ; XID_Continue # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U 12400..1246E ; XID_Continue # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM 12480..12543 ; XID_Continue # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU 12F90..12FF0 ; XID_Continue # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 -13000..1342E ; XID_Continue # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +13000..1342F ; XID_Continue # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13440 ; XID_Continue # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13441..13446 ; XID_Continue # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN +13447..13455 ; XID_Continue # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED 14400..14646 ; XID_Continue # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 16800..16A38 ; XID_Continue # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ 16A40..16A5E ; XID_Continue # Lo [31] MRO LETTER TA..MRO LETTER TEK @@ -10070,7 +10187,9 @@ FFDA..FFDC ; XID_Continue # Lo [3] 1AFF5..1AFFB ; XID_Continue # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; XID_Continue # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 1B000..1B122 ; XID_Continue # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B132 ; XID_Continue # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; XID_Continue # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; XID_Continue # Lo KATAKANA LETTER SMALL KO 1B164..1B167 ; XID_Continue # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1B170..1B2FB ; XID_Continue # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; XID_Continue # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M @@ -10127,11 +10246,14 @@ FFDA..FFDC ; XID_Continue # Lo [3] 1DF00..1DF09 ; XID_Continue # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; XID_Continue # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK 1DF0B..1DF1E ; XID_Continue # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; XID_Continue # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK 1E000..1E006 ; XID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018 ; XID_Continue # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021 ; XID_Continue # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI 1E023..1E024 ; XID_Continue # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS 1E026..1E02A ; XID_Continue # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E030..1E06D ; XID_Continue # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; XID_Continue # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 1E100..1E12C ; XID_Continue # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W 1E130..1E136 ; XID_Continue # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D 1E137..1E13D ; XID_Continue # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER @@ -10142,6 +10264,10 @@ FFDA..FFDC ; XID_Continue # Lo [3] 1E2C0..1E2EB ; XID_Continue # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH 1E2EC..1E2EF ; XID_Continue # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI 1E2F0..1E2F9 ; XID_Continue # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE +1E4D0..1E4EA ; XID_Continue # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; XID_Continue # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF ; XID_Continue # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E4F0..1E4F9 ; XID_Continue # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE 1E7E0..1E7E6 ; XID_Continue # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO 1E7E8..1E7EB ; XID_Continue # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE 1E7ED..1E7EE ; XID_Continue # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE @@ -10187,15 +10313,16 @@ FFDA..FFDC ; XID_Continue # Lo [3] 1EEAB..1EEBB ; XID_Continue # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1FBF0..1FBF9 ; XID_Continue # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 20000..2A6DF ; XID_Continue # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B738 ; XID_Continue # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 +2A700..2B739 ; XID_Continue # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 2B740..2B81D ; XID_Continue # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; XID_Continue # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; XID_Continue # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; XID_Continue # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; XID_Continue # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; XID_Continue # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF E0100..E01EF ; XID_Continue # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 135053 +# Total code points: 139463 # ================================================ @@ -10206,7 +10333,7 @@ E0100..E01EF ; XID_Continue # Mn [240] # + Variation_Selector # - White_Space # - FFF9..FFFB (Interlinear annotation format characters) -# - 13430..13438 (Egyptian hieroglyph format characters) +# - 13430..13440 (Egyptian hieroglyph format characters) # - Prepended_Concatenation_Mark (Exceptional format characters that should be visible) 00AD ; Default_Ignorable_Code_Point # Cf SOFT HYPHEN @@ -10351,7 +10478,7 @@ E01F0..E0FFF ; Default_Ignorable_Code_P 0E47..0E4E ; Grapheme_Extend # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN 0EB1 ; Grapheme_Extend # Mn LAO VOWEL SIGN MAI KAN 0EB4..0EBC ; Grapheme_Extend # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO -0EC8..0ECD ; Grapheme_Extend # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0EC8..0ECE ; Grapheme_Extend # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN 0F18..0F19 ; Grapheme_Extend # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS 0F35 ; Grapheme_Extend # Mn TIBETAN MARK NGAS BZUNG NYI ZLA 0F37 ; Grapheme_Extend # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS @@ -10490,6 +10617,7 @@ FF9E..FF9F ; Grapheme_Extend # Lm [ 10AE5..10AE6 ; Grapheme_Extend # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW 10D24..10D27 ; Grapheme_Extend # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI 10EAB..10EAC ; Grapheme_Extend # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EFD..10EFF ; Grapheme_Extend # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA 10F46..10F50 ; Grapheme_Extend # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW 10F82..10F85 ; Grapheme_Extend # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW 11001 ; Grapheme_Extend # Mn BRAHMI SIGN ANUSVARA @@ -10512,6 +10640,7 @@ FF9E..FF9F ; Grapheme_Extend # Lm [ 11234 ; Grapheme_Extend # Mn KHOJKI SIGN ANUSVARA 11236..11237 ; Grapheme_Extend # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA 1123E ; Grapheme_Extend # Mn KHOJKI SIGN SUKUN +11241 ; Grapheme_Extend # Mn KHOJKI VOWEL SIGN VOCALIC R 112DF ; Grapheme_Extend # Mn KHUDAWADI SIGN ANUSVARA 112E3..112EA ; Grapheme_Extend # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA 11300..11301 ; Grapheme_Extend # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU @@ -10579,6 +10708,12 @@ FF9E..FF9F ; Grapheme_Extend # Lm [ 11D95 ; Grapheme_Extend # Mn GUNJALA GONDI SIGN ANUSVARA 11D97 ; Grapheme_Extend # Mn GUNJALA GONDI VIRAMA 11EF3..11EF4 ; Grapheme_Extend # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11F00..11F01 ; Grapheme_Extend # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F36..11F3A ; Grapheme_Extend # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F40 ; Grapheme_Extend # Mn KAWI VOWEL SIGN EU +11F42 ; Grapheme_Extend # Mn KAWI CONJOINER +13440 ; Grapheme_Extend # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13447..13455 ; Grapheme_Extend # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED 16AF0..16AF4 ; Grapheme_Extend # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; Grapheme_Extend # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F4F ; Grapheme_Extend # Mn MIAO SIGN CONSONANT MODIFIER BAR @@ -10605,15 +10740,17 @@ FF9E..FF9F ; Grapheme_Extend # Lm [ 1E01B..1E021 ; Grapheme_Extend # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI 1E023..1E024 ; Grapheme_Extend # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS 1E026..1E02A ; Grapheme_Extend # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E08F ; Grapheme_Extend # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 1E130..1E136 ; Grapheme_Extend # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D 1E2AE ; Grapheme_Extend # Mn TOTO SIGN RISING TONE 1E2EC..1E2EF ; Grapheme_Extend # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E4EC..1E4EF ; Grapheme_Extend # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH 1E8D0..1E8D6 ; Grapheme_Extend # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS 1E944..1E94A ; Grapheme_Extend # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA E0020..E007F ; Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF ; Grapheme_Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 2090 +# Total code points: 2125 # ================================================ @@ -10913,6 +11050,7 @@ E0100..E01EF ; Grapheme_Extend # Mn [24 0CE0..0CE1 ; Grapheme_Base # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL 0CE6..0CEF ; Grapheme_Base # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF1..0CF2 ; Grapheme_Base # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; Grapheme_Base # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D02..0D03 ; Grapheme_Base # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D04..0D0C ; Grapheme_Base # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L 0D0E..0D10 ; Grapheme_Base # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI @@ -11965,6 +12103,7 @@ FFFC..FFFD ; Grapheme_Base # So [2] 11232..11233 ; Grapheme_Base # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU 11235 ; Grapheme_Base # Mc KHOJKI SIGN VIRAMA 11238..1123D ; Grapheme_Base # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +1123F..11240 ; Grapheme_Base # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I 11280..11286 ; Grapheme_Base # Lo [7] MULTANI LETTER A..MULTANI LETTER GA 11288 ; Grapheme_Base # Lo MULTANI LETTER GHA 1128A..1128D ; Grapheme_Base # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -12080,6 +12219,7 @@ FFFC..FFFD ; Grapheme_Base # So [2] 11A9D ; Grapheme_Base # Lo SOYOMBO MARK PLUTA 11A9E..11AA2 ; Grapheme_Base # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 11AB0..11AF8 ; Grapheme_Base # Lo [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL +11B00..11B09 ; Grapheme_Base # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU 11C00..11C08 ; Grapheme_Base # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E ; Grapheme_Base # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA 11C2F ; Grapheme_Base # Mc BHAIKSUKI VOWEL SIGN AA @@ -12109,6 +12249,15 @@ FFFC..FFFD ; Grapheme_Base # So [2] 11EE0..11EF2 ; Grapheme_Base # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA 11EF5..11EF6 ; Grapheme_Base # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O 11EF7..11EF8 ; Grapheme_Base # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F02 ; Grapheme_Base # Lo KAWI SIGN REPHA +11F03 ; Grapheme_Base # Mc KAWI SIGN VISARGA +11F04..11F10 ; Grapheme_Base # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; Grapheme_Base # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35 ; Grapheme_Base # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F3E..11F3F ; Grapheme_Base # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F41 ; Grapheme_Base # Mc KAWI SIGN KILLER +11F43..11F4F ; Grapheme_Base # Po [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL +11F50..11F59 ; Grapheme_Base # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE 11FB0 ; Grapheme_Base # Lo LISU LETTER YHA 11FC0..11FD4 ; Grapheme_Base # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH 11FD5..11FDC ; Grapheme_Base # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI @@ -12121,7 +12270,8 @@ FFFC..FFFD ; Grapheme_Base # So [2] 12480..12543 ; Grapheme_Base # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU 12F90..12FF0 ; Grapheme_Base # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 12FF1..12FF2 ; Grapheme_Base # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 -13000..1342E ; Grapheme_Base # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +13000..1342F ; Grapheme_Base # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13441..13446 ; Grapheme_Base # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN 14400..14646 ; Grapheme_Base # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 16800..16A38 ; Grapheme_Base # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ 16A40..16A5E ; Grapheme_Base # Lo [31] MRO LETTER TA..MRO LETTER TEK @@ -12159,7 +12309,9 @@ FFFC..FFFD ; Grapheme_Base # So [2] 1AFF5..1AFFB ; Grapheme_Base # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; Grapheme_Base # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 1B000..1B122 ; Grapheme_Base # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B132 ; Grapheme_Base # Lo HIRAGANA LETTER SMALL KO 1B150..1B152 ; Grapheme_Base # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; Grapheme_Base # Lo KATAKANA LETTER SMALL KO 1B164..1B167 ; Grapheme_Base # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1B170..1B2FB ; Grapheme_Base # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A ; Grapheme_Base # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M @@ -12180,6 +12332,7 @@ FFFC..FFFD ; Grapheme_Base # So [2] 1D1AE..1D1EA ; Grapheme_Base # So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON 1D200..1D241 ; Grapheme_Base # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 1D245 ; Grapheme_Base # So GREEK MUSICAL LEIMMA +1D2C0..1D2D3 ; Grapheme_Base # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN 1D2E0..1D2F3 ; Grapheme_Base # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN 1D300..1D356 ; Grapheme_Base # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING 1D360..1D378 ; Grapheme_Base # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE @@ -12233,6 +12386,8 @@ FFFC..FFFD ; Grapheme_Base # So [2] 1DF00..1DF09 ; Grapheme_Base # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A ; Grapheme_Base # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK 1DF0B..1DF1E ; Grapheme_Base # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; Grapheme_Base # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E030..1E06D ; Grapheme_Base # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E100..1E12C ; Grapheme_Base # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W 1E137..1E13D ; Grapheme_Base # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER 1E140..1E149 ; Grapheme_Base # Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE @@ -12242,6 +12397,9 @@ FFFC..FFFD ; Grapheme_Base # So [2] 1E2C0..1E2EB ; Grapheme_Base # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH 1E2F0..1E2F9 ; Grapheme_Base # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE 1E2FF ; Grapheme_Base # Sc WANCHO NGUN SIGN +1E4D0..1E4EA ; Grapheme_Base # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; Grapheme_Base # Lm NAG MUNDARI SIGN OJOD +1E4F0..1E4F9 ; Grapheme_Base # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE 1E7E0..1E7E6 ; Grapheme_Base # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO 1E7E8..1E7EB ; Grapheme_Base # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE 1E7ED..1E7EE ; Grapheme_Base # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE @@ -12310,10 +12468,10 @@ FFFC..FFFD ; Grapheme_Base # So [2] 1F300..1F3FA ; Grapheme_Base # So [251] CYCLONE..AMPHORA 1F3FB..1F3FF ; Grapheme_Base # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 1F400..1F6D7 ; Grapheme_Base # So [728] RAT..ELEVATOR -1F6DD..1F6EC ; Grapheme_Base # So [16] PLAYGROUND SLIDE..AIRPLANE ARRIVING +1F6DC..1F6EC ; Grapheme_Base # So [17] WIRELESS..AIRPLANE ARRIVING 1F6F0..1F6FC ; Grapheme_Base # So [13] SATELLITE..ROLLER SKATE -1F700..1F773 ; Grapheme_Base # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE -1F780..1F7D8 ; Grapheme_Base # So [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE +1F700..1F776 ; Grapheme_Base # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE +1F77B..1F7D9 ; Grapheme_Base # So [95] HAUMEA..NINE POINTED WHITE STAR 1F7E0..1F7EB ; Grapheme_Base # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE 1F7F0 ; Grapheme_Base # So HEAVY EQUALS SIGN 1F800..1F80B ; Grapheme_Base # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -12324,27 +12482,26 @@ FFFC..FFFD ; Grapheme_Base # So [2] 1F8B0..1F8B1 ; Grapheme_Base # So [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST 1F900..1FA53 ; Grapheme_Base # So [340] CIRCLED CROSS FORMEE WITH FOUR DOTS..BLACK CHESS KNIGHT-BISHOP 1FA60..1FA6D ; Grapheme_Base # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER -1FA70..1FA74 ; Grapheme_Base # So [5] BALLET SHOES..THONG SANDAL -1FA78..1FA7C ; Grapheme_Base # So [5] DROP OF BLOOD..CRUTCH -1FA80..1FA86 ; Grapheme_Base # So [7] YO-YO..NESTING DOLLS -1FA90..1FAAC ; Grapheme_Base # So [29] RINGED PLANET..HAMSA -1FAB0..1FABA ; Grapheme_Base # So [11] FLY..NEST WITH EGGS -1FAC0..1FAC5 ; Grapheme_Base # So [6] ANATOMICAL HEART..PERSON WITH CROWN -1FAD0..1FAD9 ; Grapheme_Base # So [10] BLUEBERRIES..JAR -1FAE0..1FAE7 ; Grapheme_Base # So [8] MELTING FACE..BUBBLES -1FAF0..1FAF6 ; Grapheme_Base # So [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS +1FA70..1FA7C ; Grapheme_Base # So [13] BALLET SHOES..CRUTCH +1FA80..1FA88 ; Grapheme_Base # So [9] YO-YO..FLUTE +1FA90..1FABD ; Grapheme_Base # So [46] RINGED PLANET..WING +1FABF..1FAC5 ; Grapheme_Base # So [7] GOOSE..PERSON WITH CROWN +1FACE..1FADB ; Grapheme_Base # So [14] MOOSE..PEA POD +1FAE0..1FAE8 ; Grapheme_Base # So [9] MELTING FACE..SHAKING FACE +1FAF0..1FAF8 ; Grapheme_Base # So [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND 1FB00..1FB92 ; Grapheme_Base # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK 1FB94..1FBCA ; Grapheme_Base # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON 1FBF0..1FBF9 ; Grapheme_Base # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 20000..2A6DF ; Grapheme_Base # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B738 ; Grapheme_Base # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 +2A700..2B739 ; Grapheme_Base # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 2B740..2B81D ; Grapheme_Base # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Grapheme_Base # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; Grapheme_Base # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; Grapheme_Base # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; Grapheme_Base # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; Grapheme_Base # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 142539 +# Total code points: 146986 # ================================================ @@ -12410,7 +12567,9 @@ ABED ; Grapheme_Link # Mn 11C3F ; Grapheme_Link # Mn BHAIKSUKI SIGN VIRAMA 11D44..11D45 ; Grapheme_Link # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA 11D97 ; Grapheme_Link # Mn GUNJALA GONDI VIRAMA +11F41 ; Grapheme_Link # Mc KAWI SIGN KILLER +11F42 ; Grapheme_Link # Mn KAWI CONJOINER -# Total code points: 63 +# Total code points: 65 # EOF Index: gnu/usr.bin/perl/lib/unicore/DNormalizationProps.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/DNormalizationProps.txt,v diff -u -p -a -u -p -r1.6 DNormalizationProps.txt --- gnu/usr.bin/perl/lib/unicore/DNormalizationProps.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/DNormalizationProps.txt 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# DerivedNormalizationProps-14.0.0.txt -# Date: 2021-06-04, 02:19:20 GMT -# © 2021 Unicode®, Inc. +# DerivedNormalizationProps-15.0.0.txt +# Date: 2022-04-02, 01:29:03 GMT +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # ================================================ @@ -1652,6 +1652,7 @@ FFED..FFEE ; NFKD_QC; N # So [2] HA 1D7C3 ; NFKD_QC; N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL 1D7C4..1D7CB ; NFKD_QC; N # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1D7CE..1D7FF ; NFKD_QC; N # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1E030..1E06D ; NFKD_QC; N # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1EE00..1EE03 ; NFKD_QC; N # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL 1EE05..1EE1F ; NFKD_QC; N # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF 1EE21..1EE22 ; NFKD_QC; N # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM @@ -1697,7 +1698,7 @@ FFED..FFEE ; NFKD_QC; N # So [2] HA 1FBF0..1FBF9 ; NFKD_QC; N # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 2F800..2FA1D ; NFKD_QC; N # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -# Total code points: 16967 +# Total code points: 17029 # ================================================ @@ -2060,6 +2061,7 @@ FFED..FFEE ; NFKC_QC; N # So [2] HA 1D7C3 ; NFKC_QC; N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL 1D7C4..1D7CB ; NFKC_QC; N # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1D7CE..1D7FF ; NFKC_QC; N # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1E030..1E06D ; NFKC_QC; N # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1EE00..1EE03 ; NFKC_QC; N # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL 1EE05..1EE1F ; NFKC_QC; N # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF 1EE21..1EE22 ; NFKC_QC; N # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM @@ -2105,7 +2107,7 @@ FFED..FFEE ; NFKC_QC; N # So [2] HA 1FBF0..1FBF9 ; NFKC_QC; N # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 2F800..2FA1D ; NFKC_QC; N # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -# Total code points: 4866 +# Total code points: 4928 # ================================================ @@ -8076,6 +8078,68 @@ FFF0..FFF8 ; NFKC_CF; 1D7FD ; NFKC_CF; 0037 # Nd MATHEMATICAL MONOSPACE DIGIT SEVEN 1D7FE ; NFKC_CF; 0038 # Nd MATHEMATICAL MONOSPACE DIGIT EIGHT 1D7FF ; NFKC_CF; 0039 # Nd MATHEMATICAL MONOSPACE DIGIT NINE +1E030 ; NFKC_CF; 0430 # Lm MODIFIER LETTER CYRILLIC SMALL A +1E031 ; NFKC_CF; 0431 # Lm MODIFIER LETTER CYRILLIC SMALL BE +1E032 ; NFKC_CF; 0432 # Lm MODIFIER LETTER CYRILLIC SMALL VE +1E033 ; NFKC_CF; 0433 # Lm MODIFIER LETTER CYRILLIC SMALL GHE +1E034 ; NFKC_CF; 0434 # Lm MODIFIER LETTER CYRILLIC SMALL DE +1E035 ; NFKC_CF; 0435 # Lm MODIFIER LETTER CYRILLIC SMALL IE +1E036 ; NFKC_CF; 0436 # Lm MODIFIER LETTER CYRILLIC SMALL ZHE +1E037 ; NFKC_CF; 0437 # Lm MODIFIER LETTER CYRILLIC SMALL ZE +1E038 ; NFKC_CF; 0438 # Lm MODIFIER LETTER CYRILLIC SMALL I +1E039 ; NFKC_CF; 043A # Lm MODIFIER LETTER CYRILLIC SMALL KA +1E03A ; NFKC_CF; 043B # Lm MODIFIER LETTER CYRILLIC SMALL EL +1E03B ; NFKC_CF; 043C # Lm MODIFIER LETTER CYRILLIC SMALL EM +1E03C ; NFKC_CF; 043E # Lm MODIFIER LETTER CYRILLIC SMALL O +1E03D ; NFKC_CF; 043F # Lm MODIFIER LETTER CYRILLIC SMALL PE +1E03E ; NFKC_CF; 0440 # Lm MODIFIER LETTER CYRILLIC SMALL ER +1E03F ; NFKC_CF; 0441 # Lm MODIFIER LETTER CYRILLIC SMALL ES +1E040 ; NFKC_CF; 0442 # Lm MODIFIER LETTER CYRILLIC SMALL TE +1E041 ; NFKC_CF; 0443 # Lm MODIFIER LETTER CYRILLIC SMALL U +1E042 ; NFKC_CF; 0444 # Lm MODIFIER LETTER CYRILLIC SMALL EF +1E043 ; NFKC_CF; 0445 # Lm MODIFIER LETTER CYRILLIC SMALL HA +1E044 ; NFKC_CF; 0446 # Lm MODIFIER LETTER CYRILLIC SMALL TSE +1E045 ; NFKC_CF; 0447 # Lm MODIFIER LETTER CYRILLIC SMALL CHE +1E046 ; NFKC_CF; 0448 # Lm MODIFIER LETTER CYRILLIC SMALL SHA +1E047 ; NFKC_CF; 044B # Lm MODIFIER LETTER CYRILLIC SMALL YERU +1E048 ; NFKC_CF; 044D # Lm MODIFIER LETTER CYRILLIC SMALL E +1E049 ; NFKC_CF; 044E # Lm MODIFIER LETTER CYRILLIC SMALL YU +1E04A ; NFKC_CF; A689 # Lm MODIFIER LETTER CYRILLIC SMALL DZZE +1E04B ; NFKC_CF; 04D9 # Lm MODIFIER LETTER CYRILLIC SMALL SCHWA +1E04C ; NFKC_CF; 0456 # Lm MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I +1E04D ; NFKC_CF; 0458 # Lm MODIFIER LETTER CYRILLIC SMALL JE +1E04E ; NFKC_CF; 04E9 # Lm MODIFIER LETTER CYRILLIC SMALL BARRED O +1E04F ; NFKC_CF; 04AF # Lm MODIFIER LETTER CYRILLIC SMALL STRAIGHT U +1E050 ; NFKC_CF; 04CF # Lm MODIFIER LETTER CYRILLIC SMALL PALOCHKA +1E051 ; NFKC_CF; 0430 # Lm CYRILLIC SUBSCRIPT SMALL LETTER A +1E052 ; NFKC_CF; 0431 # Lm CYRILLIC SUBSCRIPT SMALL LETTER BE +1E053 ; NFKC_CF; 0432 # Lm CYRILLIC SUBSCRIPT SMALL LETTER VE +1E054 ; NFKC_CF; 0433 # Lm CYRILLIC SUBSCRIPT SMALL LETTER GHE +1E055 ; NFKC_CF; 0434 # Lm CYRILLIC SUBSCRIPT SMALL LETTER DE +1E056 ; NFKC_CF; 0435 # Lm CYRILLIC SUBSCRIPT SMALL LETTER IE +1E057 ; NFKC_CF; 0436 # Lm CYRILLIC SUBSCRIPT SMALL LETTER ZHE +1E058 ; NFKC_CF; 0437 # Lm CYRILLIC SUBSCRIPT SMALL LETTER ZE +1E059 ; NFKC_CF; 0438 # Lm CYRILLIC SUBSCRIPT SMALL LETTER I +1E05A ; NFKC_CF; 043A # Lm CYRILLIC SUBSCRIPT SMALL LETTER KA +1E05B ; NFKC_CF; 043B # Lm CYRILLIC SUBSCRIPT SMALL LETTER EL +1E05C ; NFKC_CF; 043E # Lm CYRILLIC SUBSCRIPT SMALL LETTER O +1E05D ; NFKC_CF; 043F # Lm CYRILLIC SUBSCRIPT SMALL LETTER PE +1E05E ; NFKC_CF; 0441 # Lm CYRILLIC SUBSCRIPT SMALL LETTER ES +1E05F ; NFKC_CF; 0443 # Lm CYRILLIC SUBSCRIPT SMALL LETTER U +1E060 ; NFKC_CF; 0444 # Lm CYRILLIC SUBSCRIPT SMALL LETTER EF +1E061 ; NFKC_CF; 0445 # Lm CYRILLIC SUBSCRIPT SMALL LETTER HA +1E062 ; NFKC_CF; 0446 # Lm CYRILLIC SUBSCRIPT SMALL LETTER TSE +1E063 ; NFKC_CF; 0447 # Lm CYRILLIC SUBSCRIPT SMALL LETTER CHE +1E064 ; NFKC_CF; 0448 # Lm CYRILLIC SUBSCRIPT SMALL LETTER SHA +1E065 ; NFKC_CF; 044A # Lm CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN +1E066 ; NFKC_CF; 044B # Lm CYRILLIC SUBSCRIPT SMALL LETTER YERU +1E067 ; NFKC_CF; 0491 # Lm CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN +1E068 ; NFKC_CF; 0456 # Lm CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I +1E069 ; NFKC_CF; 0455 # Lm CYRILLIC SUBSCRIPT SMALL LETTER DZE +1E06A ; NFKC_CF; 045F # Lm CYRILLIC SUBSCRIPT SMALL LETTER DZHE +1E06B ; NFKC_CF; 04AB # Lm MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER +1E06C ; NFKC_CF; A651 # Lm MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER +1E06D ; NFKC_CF; 04B1 # Lm MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E900 ; NFKC_CF; 1E922 # L& ADLAM CAPITAL LETTER ALIF 1E901 ; NFKC_CF; 1E923 # L& ADLAM CAPITAL LETTER DAALI 1E902 ; NFKC_CF; 1E924 # L& ADLAM CAPITAL LETTER LAAM @@ -8937,7 +9001,7 @@ E0080..E00FF ; NFKC_CF; E0100..E01EF ; NFKC_CF; # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 E01F0..E0FFF ; NFKC_CF; # Cn [3600] .. -# Total code points: 10429 +# Total code points: 10491 # ================================================ @@ -9895,6 +9959,7 @@ FFF0..FFF8 ; Changes_When_NFKC_Casefo 1D7C3 ; Changes_When_NFKC_Casefolded # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL 1D7C4..1D7CB ; Changes_When_NFKC_Casefolded # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA 1D7CE..1D7FF ; Changes_When_NFKC_Casefolded # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1E030..1E06D ; Changes_When_NFKC_Casefolded # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E900..1E921 ; Changes_When_NFKC_Casefolded # L& [34] ADLAM CAPITAL LETTER ALIF..ADLAM CAPITAL LETTER SHA 1EE00..1EE03 ; Changes_When_NFKC_Casefolded # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL 1EE05..1EE1F ; Changes_When_NFKC_Casefolded # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF @@ -9948,6 +10013,6 @@ E0080..E00FF ; Changes_When_NFKC_Casefo E0100..E01EF ; Changes_When_NFKC_Casefolded # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 E01F0..E0FFF ; Changes_When_NFKC_Casefolded # Cn [3600] .. -# Total code points: 10429 +# Total code points: 10491 # EOF Index: gnu/usr.bin/perl/lib/unicore/Decomposition.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/Decomposition.pl,v diff -u -p -a -u -p -r1.12 Decomposition.pl --- gnu/usr.bin/perl/lib/unicore/Decomposition.pl 15 Feb 2023 01:39:49 -0000 1.12 +++ gnu/usr.bin/perl/lib/unicore/Decomposition.pl 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ # !!!!!!! DO NOT EDIT THIS FILE !!!!!!! # This file is machine-generated by lib/unicore/mktables from the Unicode -# database, Version 14.0.0. Any changes made here will be lost! +# database, Version 15.0.0. Any changes made here will be lost! # !!!!!!! INTERNAL PERL USE ONLY !!!!!!! # This file is for internal use by core Perl only. The format and even the @@ -4957,6 +4957,68 @@ FFEE 25CB 1D7FD 0037 1D7FE 0038 1D7FF 0039 +1E030 0430 +1E031 0431 +1E032 0432 +1E033 0433 +1E034 0434 +1E035 0435 +1E036 0436 +1E037 0437 +1E038 0438 +1E039 043A +1E03A 043B +1E03B 043C +1E03C 043E +1E03D 043F +1E03E 0440 +1E03F 0441 +1E040 0442 +1E041 0443 +1E042 0444 +1E043 0445 +1E044 0446 +1E045 0447 +1E046 0448 +1E047 044B +1E048 044D +1E049 044E +1E04A A689 +1E04B 04D9 +1E04C 0456 +1E04D 0458 +1E04E 04E9 +1E04F 04AF +1E050 04CF +1E051 0430 +1E052 0431 +1E053 0432 +1E054 0433 +1E055 0434 +1E056 0435 +1E057 0436 +1E058 0437 +1E059 0438 +1E05A 043A +1E05B 043B +1E05C 043E +1E05D 043F +1E05E 0441 +1E05F 0443 +1E060 0444 +1E061 0445 +1E062 0446 +1E063 0447 +1E064 0448 +1E065 044A +1E066 044B +1E067 0491 +1E068 0456 +1E069 0455 +1E06A 045F +1E06B 04AB +1E06C A651 +1E06D 04B1 1EE00 0627 1EE01 0628 1EE02 062C Index: gnu/usr.bin/perl/lib/unicore/EastAsianWidth.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/EastAsianWidth.txt,v diff -u -p -a -u -p -r1.6 EastAsianWidth.txt --- gnu/usr.bin/perl/lib/unicore/EastAsianWidth.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/EastAsianWidth.txt 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ -# EastAsianWidth-14.0.0.txt -# Date: 2021-07-06, 09:58:53 GMT [KW, LI] -# © 2021 Unicode®, Inc. +# EastAsianWidth-15.0.0.txt +# Date: 2022-05-24, 17:40:20 GMT [KW, LI] +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see https://www.unicode.org/terms_of_use.html # @@ -534,6 +534,7 @@ 0CE2..0CE3;N # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CE6..0CEF;N # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF1..0CF2;N # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3;N # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D00..0D01;N # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03;N # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D04..0D0C;N # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L @@ -595,7 +596,7 @@ 0EBD;N # Lo LAO SEMIVOWEL SIGN NYO 0EC0..0EC4;N # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI 0EC6;N # Lm LAO KO LA -0EC8..0ECD;N # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0EC8..0ECE;N # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN 0ED0..0ED9;N # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE 0EDC..0EDF;N # Lo [4] LAO HO NO..LAO LETTER KHMU NYO 0F00;N # Lo TIBETAN SYLLABLE OM @@ -1946,6 +1947,7 @@ FFFD;A # So REPLACEMEN 10EAB..10EAC;N # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK 10EAD;N # Pd YEZIDI HYPHENATION MARK 10EB0..10EB1;N # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +10EFD..10EFF;N # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA 10F00..10F1C;N # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL 10F1D..10F26;N # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF 10F27;N # Lo OLD SOGDIAN LIGATURE AYIN-DALETH @@ -2028,6 +2030,8 @@ FFFD;A # So REPLACEMEN 11236..11237;N # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA 11238..1123D;N # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN 1123E;N # Mn KHOJKI SIGN SUKUN +1123F..11240;N # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241;N # Mn KHOJKI VOWEL SIGN VOCALIC R 11280..11286;N # Lo [7] MULTANI LETTER A..MULTANI LETTER GA 11288;N # Lo MULTANI LETTER GHA 1128A..1128D;N # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -2190,6 +2194,7 @@ FFFD;A # So REPLACEMEN 11A9E..11AA2;N # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 11AB0..11ABF;N # Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA 11AC0..11AF8;N # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11B00..11B09;N # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU 11C00..11C08;N # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E;N # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA 11C2F;N # Mc BHAIKSUKI VOWEL SIGN AA @@ -2235,6 +2240,19 @@ FFFD;A # So REPLACEMEN 11EF3..11EF4;N # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6;N # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O 11EF7..11EF8;N # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F00..11F01;N # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02;N # Lo KAWI SIGN REPHA +11F03;N # Mc KAWI SIGN VISARGA +11F04..11F10;N # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33;N # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35;N # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A;N # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F;N # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40;N # Mn KAWI VOWEL SIGN EU +11F41;N # Mc KAWI SIGN KILLER +11F42;N # Mn KAWI CONJOINER +11F43..11F4F;N # Po [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL +11F50..11F59;N # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE 11FB0;N # Lo LISU LETTER YHA 11FC0..11FD4;N # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH 11FD5..11FDC;N # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI @@ -2247,8 +2265,11 @@ FFFD;A # So REPLACEMEN 12480..12543;N # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU 12F90..12FF0;N # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 12FF1..12FF2;N # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 -13000..1342E;N # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 -13430..13438;N # Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT +13000..1342F;N # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13430..1343F;N # Cf [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +13440;N # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13441..13446;N # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN +13447..13455;N # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED 14400..14646;N # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 16800..16A38;N # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ 16A40..16A5E;N # Lo [31] MRO LETTER TA..MRO LETTER TEK @@ -2293,7 +2314,9 @@ FFFD;A # So REPLACEMEN 1AFFD..1AFFE;W # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 1B000..1B0FF;W # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 1B100..1B122;W # Lo [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU +1B132;W # Lo HIRAGANA LETTER SMALL KO 1B150..1B152;W # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155;W # Lo KATAKANA LETTER SMALL KO 1B164..1B167;W # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1B170..1B2FB;W # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A;N # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M @@ -2324,6 +2347,7 @@ FFFD;A # So REPLACEMEN 1D200..1D241;N # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 1D242..1D244;N # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME 1D245;N # So GREEK MUSICAL LEIMMA +1D2C0..1D2D3;N # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN 1D2E0..1D2F3;N # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN 1D300..1D356;N # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING 1D360..1D378;N # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE @@ -2383,11 +2407,14 @@ FFFD;A # So REPLACEMEN 1DF00..1DF09;N # Ll [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A;N # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK 1DF0B..1DF1E;N # Ll [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A;N # Ll [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK 1E000..1E006;N # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018;N # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021;N # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI 1E023..1E024;N # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS 1E026..1E02A;N # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E030..1E06D;N # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F;N # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 1E100..1E12C;N # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W 1E130..1E136;N # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D 1E137..1E13D;N # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER @@ -2400,6 +2427,10 @@ FFFD;A # So REPLACEMEN 1E2EC..1E2EF;N # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI 1E2F0..1E2F9;N # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE 1E2FF;N # Sc WANCHO NGUN SIGN +1E4D0..1E4EA;N # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB;N # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF;N # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E4F0..1E4F9;N # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE 1E7E0..1E7E6;N # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO 1E7E8..1E7EB;N # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE 1E7ED..1E7EE;N # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE @@ -2528,13 +2559,14 @@ FFFD;A # So REPLACEMEN 1F6D0..1F6D2;W # So [3] PLACE OF WORSHIP..SHOPPING TROLLEY 1F6D3..1F6D4;N # So [2] STUPA..PAGODA 1F6D5..1F6D7;W # So [3] HINDU TEMPLE..ELEVATOR -1F6DD..1F6DF;W # So [3] PLAYGROUND SLIDE..RING BUOY +1F6DC..1F6DF;W # So [4] WIRELESS..RING BUOY 1F6E0..1F6EA;N # So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE 1F6EB..1F6EC;W # So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING 1F6F0..1F6F3;N # So [4] SATELLITE..PASSENGER SHIP 1F6F4..1F6FC;W # So [9] SCOOTER..ROLLER SKATE -1F700..1F773;N # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE -1F780..1F7D8;N # So [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE +1F700..1F776;N # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE +1F77B..1F77F;N # So [5] HAUMEA..ORCUS +1F780..1F7D9;N # So [90] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NINE POINTED WHITE STAR 1F7E0..1F7EB;W # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE 1F7F0;W # So HEAVY EQUALS SIGN 1F800..1F80B;N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -2551,22 +2583,20 @@ FFFD;A # So REPLACEMEN 1F947..1F9FF;W # So [185] FIRST PLACE MEDAL..NAZAR AMULET 1FA00..1FA53;N # So [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP 1FA60..1FA6D;N # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER -1FA70..1FA74;W # So [5] BALLET SHOES..THONG SANDAL -1FA78..1FA7C;W # So [5] DROP OF BLOOD..CRUTCH -1FA80..1FA86;W # So [7] YO-YO..NESTING DOLLS -1FA90..1FAAC;W # So [29] RINGED PLANET..HAMSA -1FAB0..1FABA;W # So [11] FLY..NEST WITH EGGS -1FAC0..1FAC5;W # So [6] ANATOMICAL HEART..PERSON WITH CROWN -1FAD0..1FAD9;W # So [10] BLUEBERRIES..JAR -1FAE0..1FAE7;W # So [8] MELTING FACE..BUBBLES -1FAF0..1FAF6;W # So [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS +1FA70..1FA7C;W # So [13] BALLET SHOES..CRUTCH +1FA80..1FA88;W # So [9] YO-YO..FLUTE +1FA90..1FABD;W # So [46] RINGED PLANET..WING +1FABF..1FAC5;W # So [7] GOOSE..PERSON WITH CROWN +1FACE..1FADB;W # So [14] MOOSE..PEA POD +1FAE0..1FAE8;W # So [9] MELTING FACE..SHAKING FACE +1FAF0..1FAF8;W # So [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND 1FB00..1FB92;N # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK 1FB94..1FBCA;N # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON 1FBF0..1FBF9;N # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 20000..2A6DF;W # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF 2A6E0..2A6FF;W # Cn [32] .. -2A700..2B738;W # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 -2B739..2B73F;W # Cn [7] .. +2A700..2B739;W # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 +2B73A..2B73F;W # Cn [6] .. 2B740..2B81D;W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B81E..2B81F;W # Cn [2] .. 2B820..2CEA1;W # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 @@ -2577,7 +2607,9 @@ FFFD;A # So REPLACEMEN 2FA1E..2FA1F;W # Cn [2] .. 2FA20..2FFFD;W # Cn [1502] .. 30000..3134A;W # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A -3134B..3FFFD;W # Cn [60595] .. +3134B..3134F;W # Cn [5] .. +31350..323AF;W # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF +323B0..3FFFD;W # Cn [56398] .. E0001;N # Cf LANGUAGE TAG E0020..E007F;N # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF;A # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 Index: gnu/usr.bin/perl/lib/unicore/EmojiSources.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/EmojiSources.txt,v diff -u -p -a -u -p -r1.6 EmojiSources.txt --- gnu/usr.bin/perl/lib/unicore/EmojiSources.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/EmojiSources.txt 21 Feb 2024 15:47:02 -0000 @@ -1,10 +1,10 @@ -# EmojiSources-14.0.0.txt -# Date: 2021-03-16, 21:39:00 GMT [MS, KW] -# © 2021 Unicode®, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# EmojiSources-15.0.0.txt +# Date: 2022-05-03, 18:51:00 GMT [MS, KW] +# © 2022 Unicode®, Inc. +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # This file provides historical mappings between Unicode code points and sequences on one hand # and Shift-JIS codes for cell phone carrier symbols on the other hand. @@ -34,7 +34,7 @@ # in these mappings do not include variation selectors for emoji presentation. # Thus they do not match the named character sequences with keycaps listed in # NamedSequences.txt. -# For modern data used in emoji support, see http://www.unicode.org/Public/emoji/latest/ +# For modern data used in emoji support, see https://www.unicode.org/Public/emoji/latest/ 0023 20E3;F985;F489;F7B0 0030 20E3;F990;F7C9;F7C5 Index: gnu/usr.bin/perl/lib/unicore/EquivalentUnifiedIdeograph.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/EquivalentUnifiedIdeograph.txt,v diff -u -p -a -u -p -r1.1.1.3 EquivalentUnifiedIdeograph.txt --- gnu/usr.bin/perl/lib/unicore/EquivalentUnifiedIdeograph.txt 15 Feb 2023 01:33:06 -0000 1.1.1.3 +++ gnu/usr.bin/perl/lib/unicore/EquivalentUnifiedIdeograph.txt 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# EquivalentUnifiedIdeograph-14.0.0.txt -# Date: 2021-03-16, 21:41:00 GMT [KL, KW] -# © 2021 Unicode®, Inc. +# EquivalentUnifiedIdeograph-15.0.0.txt +# Date: 2022-04-26, 20:42:00 GMT [KL, KW] +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # For documentation, see UAX #44: Unicode Character Database, -# at http://www.unicode.org/reports/tr44/ +# at https://www.unicode.org/reports/tr44/ # # This file defines the following property: # @@ -62,7 +62,7 @@ 2E92 ; 5DF3 # CJK RADICAL SNAKE 2E93 ; 5E7A # CJK RADICAL THREAD 2E94 ; 5F51 # CJK RADICAL SNOUT ONE -2E95 ; 5F50 # CJK RADICAL SNOUT TWO +2E95 ; 2B739 # CJK RADICAL SNOUT TWO 2E96 ; 5FC4 # CJK RADICAL HEART ONE 2E97 ; 5FC3 # CJK RADICAL HEART TWO 2E98 ; 624C # CJK RADICAL HAND Index: gnu/usr.bin/perl/lib/unicore/HangulSyllableType.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/HangulSyllableType.txt,v diff -u -p -a -u -p -r1.6 HangulSyllableType.txt --- gnu/usr.bin/perl/lib/unicore/HangulSyllableType.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/HangulSyllableType.txt 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# HangulSyllableType-14.0.0.txt -# Date: 2021-03-08, 19:35:46 GMT -# © 2021 Unicode®, Inc. +# HangulSyllableType-15.0.0.txt +# Date: 2022-02-02, 23:35:41 GMT +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # ================================================ Index: gnu/usr.bin/perl/lib/unicore/IdStatus.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/IdStatus.txt,v diff -u -p -a -u -p -r1.1.1.2 IdStatus.txt --- gnu/usr.bin/perl/lib/unicore/IdStatus.txt 15 Feb 2023 01:33:06 -0000 1.1.1.2 +++ gnu/usr.bin/perl/lib/unicore/IdStatus.txt 21 Feb 2024 15:47:02 -0000 @@ -1,13 +1,13 @@ # IdentifierStatus.txt -# Date: 2021-08-12, 01:13:34 GMT -# © 2021 Unicode®, Inc. +# Date: 2022-05-18, 21:51:57 GMT +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Security Mechanisms for UTS #39 -# Version: 14.0.0 +# Version: 15.0.0 # -# For documentation and usage, see http://www.unicode.org/reports/tr39 +# For documentation and usage, see https://www.unicode.org/reports/tr39 # # Format # @@ -284,6 +284,7 @@ 0CE2..0CE3 ; Allowed # 5.0 [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CE6..0CEF ; Allowed # 1.1 [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF1..0CF2 ; Allowed # 5.0 [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; Allowed # 15.0 KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D00 ; Allowed # 10.0 MALAYALAM SIGN COMBINING ANUSVARA ABOVE 0D02..0D03 ; Allowed # 1.1 [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D05..0D0C ; Allowed # 1.1 [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L @@ -345,6 +346,7 @@ 0EC0..0EC4 ; Allowed # 1.1 [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI 0EC6 ; Allowed # 1.1 LAO KO LA 0EC8..0ECD ; Allowed # 1.1 [6] LAO TONE MAI EK..LAO NIGGAHITA +0ECE ; Allowed # 15.0 LAO YAMAKKAN 0ED0..0ED9 ; Allowed # 1.1 [10] LAO DIGIT ZERO..LAO DIGIT NINE 0EDE..0EDF ; Allowed # 6.1 [2] LAO LETTER KHMU GO..LAO LETTER KHMU NYO 0F00 ; Allowed # 2.0 TIBETAN SYLLABLE OM @@ -483,7 +485,6 @@ 1FF6..1FF8 ; Allowed # 1.1 [3] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMICRON WITH VARIA 1FFA ; Allowed # 1.1 GREEK CAPITAL LETTER OMEGA WITH VARIA 1FFC ; Allowed # 1.1 GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -200C..200D ; Allowed # 1.1 [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER 2010 ; Allowed # 1.1 HYPHEN 2019 ; Allowed # 1.1 RIGHT SINGLE QUOTATION MARK 2027 ; Allowed # 1.1 HYPHENATION POINT @@ -562,9 +563,13 @@ FA27..FA29 ; Allowed # 1.1 [3] 1133C ; Allowed # 7.0 GRANTHA SIGN NUKTA 16FF0..16FF1 ; Allowed # 13.0 [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY 1B11F..1B122 ; Allowed # 14.0 [4] HIRAGANA LETTER ARCHAIC WU..KATAKANA LETTER ARCHAIC WU +1B132 ; Allowed # 15.0 HIRAGANA LETTER SMALL KO 1B150..1B152 ; Allowed # 12.0 [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; Allowed # 15.0 KATAKANA LETTER SMALL KO 1B164..1B167 ; Allowed # 12.0 [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1DF00..1DF1E ; Allowed # 14.0 [31] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; Allowed # 15.0 [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E08F ; Allowed # 15.0 COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 1E7E0..1E7E6 ; Allowed # 14.0 [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO 1E7E8..1E7EB ; Allowed # 14.0 [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE 1E7ED..1E7EE ; Allowed # 14.0 [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE @@ -574,9 +579,11 @@ FA27..FA29 ; Allowed # 1.1 [3] 2A6DE..2A6DF ; Allowed # 14.0 [2] CJK UNIFIED IDEOGRAPH-2A6DE..CJK UNIFIED IDEOGRAPH-2A6DF 2A700..2B734 ; Allowed # 5.2 [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 2B735..2B738 ; Allowed # 14.0 [4] CJK UNIFIED IDEOGRAPH-2B735..CJK UNIFIED IDEOGRAPH-2B738 +2B739 ; Allowed # 15.0 CJK UNIFIED IDEOGRAPH-2B739 2B740..2B81D ; Allowed # 6.0 [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Allowed # 8.0 [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; Allowed # 10.0 [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 30000..3134A ; Allowed # 13.0 [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; Allowed # 15.0 [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 107957 +# Total code points: 112159 Index: gnu/usr.bin/perl/lib/unicore/IdType.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/IdType.txt,v diff -u -p -a -u -p -r1.1.1.2 IdType.txt --- gnu/usr.bin/perl/lib/unicore/IdType.txt 15 Feb 2023 01:33:06 -0000 1.1.1.2 +++ gnu/usr.bin/perl/lib/unicore/IdType.txt 21 Feb 2024 15:47:02 -0000 @@ -1,13 +1,13 @@ # IdentifierType.txt -# Date: 2021-08-12, 01:13:33 GMT -# © 2021 Unicode®, Inc. +# Date: 2022-05-18, 21:51:56 GMT +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Security Mechanisms for UTS #39 -# Version: 14.0.0 +# Version: 15.0.0 # -# For documentation and usage, see http://www.unicode.org/reports/tr39 +# For documentation and usage, see https://www.unicode.org/reports/tr39 # # Format # @@ -281,6 +281,7 @@ 0CE2..0CE3 ; Recommended # 5.0 [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CE6..0CEF ; Recommended # 1.1 [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF1..0CF2 ; Recommended # 5.0 [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; Recommended # 15.0 KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D00 ; Recommended # 10.0 MALAYALAM SIGN COMBINING ANUSVARA ABOVE 0D02..0D03 ; Recommended # 1.1 [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D05..0D0C ; Recommended # 1.1 [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L @@ -342,6 +343,7 @@ 0EC0..0EC4 ; Recommended # 1.1 [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI 0EC6 ; Recommended # 1.1 LAO KO LA 0EC8..0ECD ; Recommended # 1.1 [6] LAO TONE MAI EK..LAO NIGGAHITA +0ECE ; Recommended # 15.0 LAO YAMAKKAN 0ED0..0ED9 ; Recommended # 1.1 [10] LAO DIGIT ZERO..LAO DIGIT NINE 0EDE..0EDF ; Recommended # 6.1 [2] LAO LETTER KHMU GO..LAO LETTER KHMU NYO 0F00 ; Recommended # 2.0 TIBETAN SYLLABLE OM @@ -554,9 +556,13 @@ FA27..FA29 ; Recommended 1133C ; Recommended # 7.0 GRANTHA SIGN NUKTA 16FF0..16FF1 ; Recommended # 13.0 [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY 1B11F..1B122 ; Recommended # 14.0 [4] HIRAGANA LETTER ARCHAIC WU..KATAKANA LETTER ARCHAIC WU +1B132 ; Recommended # 15.0 HIRAGANA LETTER SMALL KO 1B150..1B152 ; Recommended # 12.0 [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; Recommended # 15.0 KATAKANA LETTER SMALL KO 1B164..1B167 ; Recommended # 12.0 [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1DF00..1DF1E ; Recommended # 14.0 [31] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; Recommended # 15.0 [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E08F ; Recommended # 15.0 COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 1E7E0..1E7E6 ; Recommended # 14.0 [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO 1E7E8..1E7EB ; Recommended # 14.0 [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE 1E7ED..1E7EE ; Recommended # 14.0 [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE @@ -566,12 +572,14 @@ FA27..FA29 ; Recommended 2A6DE..2A6DF ; Recommended # 14.0 [2] CJK UNIFIED IDEOGRAPH-2A6DE..CJK UNIFIED IDEOGRAPH-2A6DF 2A700..2B734 ; Recommended # 5.2 [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 2B735..2B738 ; Recommended # 14.0 [4] CJK UNIFIED IDEOGRAPH-2B735..CJK UNIFIED IDEOGRAPH-2B738 +2B739 ; Recommended # 15.0 CJK UNIFIED IDEOGRAPH-2B739 2B740..2B81D ; Recommended # 6.0 [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Recommended # 8.0 [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; Recommended # 10.0 [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 30000..3134A ; Recommended # 13.0 [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; Recommended # 15.0 [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 107938 +# Total code points: 112142 # Identifier_Type: Inclusion @@ -584,14 +592,13 @@ FA27..FA29 ; Recommended 05F3..05F4 ; Inclusion # 1.1 [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM 06FD..06FE ; Inclusion # 3.0 [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN 0F0B ; Inclusion # 2.0 TIBETAN MARK INTERSYLLABIC TSHEG -200C..200D ; Inclusion # 1.1 [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER 2010 ; Inclusion # 1.1 HYPHEN 2019 ; Inclusion # 1.1 RIGHT SINGLE QUOTATION MARK 2027 ; Inclusion # 1.1 HYPHENATION POINT 30A0 ; Inclusion # 3.2 KATAKANA-HIRAGANA DOUBLE HYPHEN 30FB ; Inclusion # 1.1 KATAKANA MIDDLE DOT -# Total code points: 19 +# Total code points: 17 # Identifier_Type: Limited_Use @@ -853,11 +860,12 @@ A78F ; Uncommon_Use A7B2..A7B7 ; Uncommon_Use # 8.0 [6] LATIN CAPITAL LETTER J WITH CROSSED-TAIL..LATIN SMALL LETTER OMEGA AB60..AB63 ; Uncommon_Use # 8.0 [4] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER UO 10780 ; Uncommon_Use # 14.0 MODIFIER LETTER SMALL CAPITAL AA +10EFD..10EFF ; Uncommon_Use # 15.0 [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA 1AFF0..1AFF3 ; Uncommon_Use # 14.0 [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 1AFF5..1AFFB ; Uncommon_Use # 14.0 [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 1AFFD..1AFFE ; Uncommon_Use # 14.0 [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 -# Total code points: 308 +# Total code points: 311 # Identifier_Type: Uncommon_Use Technical @@ -1222,6 +1230,7 @@ A930..A953 ; Exclusion 11200..11211 ; Exclusion # 7.0 [18] KHOJKI LETTER A..KHOJKI LETTER JJA 11213..11237 ; Exclusion # 7.0 [37] KHOJKI LETTER NYA..KHOJKI SIGN SHADDA 1123E ; Exclusion # 9.0 KHOJKI SIGN SUKUN +1123F..11241 ; Exclusion # 15.0 [3] KHOJKI LETTER QA..KHOJKI VOWEL SIGN VOCALIC R 11280..11286 ; Exclusion # 8.0 [7] MULTANI LETTER A..MULTANI LETTER GA 11288 ; Exclusion # 8.0 MULTANI LETTER GHA 1128A..1128D ; Exclusion # 8.0 [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -1299,6 +1308,10 @@ A930..A953 ; Exclusion 11D3F..11D47 ; Exclusion # 10.0 [9] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI RA-KARA 11D50..11D59 ; Exclusion # 10.0 [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE 11EE0..11EF6 ; Exclusion # 11.0 [23] MAKASAR LETTER KA..MAKASAR VOWEL SIGN O +11F00..11F10 ; Exclusion # 15.0 [17] KAWI SIGN CANDRABINDU..KAWI LETTER O +11F12..11F3A ; Exclusion # 15.0 [41] KAWI LETTER KA..KAWI VOWEL SIGN VOCALIC R +11F3E..11F42 ; Exclusion # 15.0 [5] KAWI VOWEL SIGN E..KAWI CONJOINER +11F50..11F59 ; Exclusion # 15.0 [10] KAWI DIGIT ZERO..KAWI DIGIT NINE 12000..1236E ; Exclusion # 5.0 [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM 1236F..12398 ; Exclusion # 7.0 [42] CUNEIFORM SIGN KAP ELAMITE..CUNEIFORM SIGN UM TIMES ME 12399 ; Exclusion # 8.0 CUNEIFORM SIGN U U @@ -1307,6 +1320,8 @@ A930..A953 ; Exclusion 12480..12543 ; Exclusion # 8.0 [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU 12F90..12FF0 ; Exclusion # 14.0 [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 13000..1342E ; Exclusion # 5.2 [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 +1342F ; Exclusion # 15.0 EGYPTIAN HIEROGLYPH V011D +13440..13455 ; Exclusion # 15.0 [22] EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED 14400..14646 ; Exclusion # 8.0 [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 16A70..16ABE ; Exclusion # 14.0 [79] TANGSA LETTER OZ..TANGSA LETTER ZA 16AC0..16AC9 ; Exclusion # 14.0 [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE @@ -1345,10 +1360,11 @@ A930..A953 ; Exclusion 1E023..1E024 ; Exclusion # 9.0 [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS 1E026..1E02A ; Exclusion # 9.0 [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA 1E290..1E2AE ; Exclusion # 14.0 [31] TOTO LETTER PA..TOTO SIGN RISING TONE +1E4D0..1E4F9 ; Exclusion # 15.0 [42] NAG MUNDARI LETTER O..NAG MUNDARI DIGIT NINE 1E800..1E8C4 ; Exclusion # 7.0 [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON 1E8D0..1E8D6 ; Exclusion # 7.0 [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS -# Total code points: 15930 +# Total code points: 16071 # Identifier_Type: Exclusion Not_XID @@ -1429,10 +1445,12 @@ A95F ; Exclusion Not_XID 11C5A..11C6C ; Exclusion Not_XID # 9.0 [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK 11C70..11C71 ; Exclusion Not_XID # 9.0 [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD 11EF7..11EF8 ; Exclusion Not_XID # 11.0 [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F43..11F4F ; Exclusion Not_XID # 15.0 [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL 12470..12473 ; Exclusion Not_XID # 5.0 [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON 12474 ; Exclusion Not_XID # 7.0 CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON 12FF1..12FF2 ; Exclusion Not_XID # 14.0 [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 13430..13438 ; Exclusion Not_XID # 12.0 [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT +13439..1343F ; Exclusion Not_XID # 15.0 [7] EGYPTIAN HIEROGLYPH INSERT AT MIDDLE..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE 16A6E..16A6F ; Exclusion Not_XID # 7.0 [2] MRO DANDA..MRO DOUBLE DANDA 16AF5 ; Exclusion Not_XID # 7.0 BASSA VAH FULL STOP 16B37..16B3F ; Exclusion Not_XID # 7.0 [9] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN XYEEM FAIB @@ -1448,7 +1466,7 @@ A95F ; Exclusion Not_XID 1DA85..1DA8B ; Exclusion Not_XID # 8.0 [7] SIGNWRITING LOCATION TORSO..SIGNWRITING PARENTHESIS 1E8C7..1E8CF ; Exclusion Not_XID # 7.0 [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE -# Total code points: 1105 +# Total code points: 1125 # Identifier_Type: Obsolete @@ -1903,9 +1921,11 @@ FFFD ; Not_XID 101A0 ; Not_XID # 7.0 GREEK SYMBOL TAU RHO 10E60..10E7E ; Not_XID # 5.2 [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS 111E1..111F4 ; Not_XID # 7.0 [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND +11B00..11B09 ; Not_XID # 15.0 [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU 11FC0..11FF1 ; Not_XID # 12.0 [50] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL SIGN VAKAIYARAA 11FFF ; Not_XID # 12.0 TAMIL PUNCTUATION END OF TEXT 16FE2 ; Not_XID # 12.0 OLD CHINESE HOOK MARK +1D2C0..1D2D3 ; Not_XID # 15.0 [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN 1D2E0..1D2F3 ; Not_XID # 11.0 [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN 1D360..1D371 ; Not_XID # 5.0 [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE 1D372..1D378 ; Not_XID # 11.0 [7] IDEOGRAPHIC TALLY MARK ONE..TALLY MARK FIVE @@ -2016,6 +2036,7 @@ FFFD ; Not_XID 1F6D3..1F6D4 ; Not_XID # 10.0 [2] STUPA..PAGODA 1F6D5 ; Not_XID # 12.0 HINDU TEMPLE 1F6D6..1F6D7 ; Not_XID # 13.0 [2] HUT..ELEVATOR +1F6DC ; Not_XID # 15.0 WIRELESS 1F6DD..1F6DF ; Not_XID # 14.0 [3] PLAYGROUND SLIDE..RING BUOY 1F6E0..1F6EC ; Not_XID # 7.0 [13] HAMMER AND WRENCH..AIRPLANE ARRIVING 1F6F0..1F6F3 ; Not_XID # 7.0 [4] SATELLITE..PASSENGER SHIP @@ -2025,8 +2046,11 @@ FFFD ; Not_XID 1F6FA ; Not_XID # 12.0 AUTO RICKSHAW 1F6FB..1F6FC ; Not_XID # 13.0 [2] PICKUP TRUCK..ROLLER SKATE 1F700..1F773 ; Not_XID # 6.0 [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE +1F774..1F776 ; Not_XID # 15.0 [3] LOT OF FORTUNE..LUNAR ECLIPSE +1F77B..1F77F ; Not_XID # 15.0 [5] HAUMEA..ORCUS 1F780..1F7D4 ; Not_XID # 7.0 [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR 1F7D5..1F7D8 ; Not_XID # 11.0 [4] CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE +1F7D9 ; Not_XID # 15.0 NINE POINTED WHITE STAR 1F7E0..1F7EB ; Not_XID # 12.0 [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE 1F7F0 ; Not_XID # 14.0 HEAVY EQUALS SIGN 1F800..1F80B ; Not_XID # 7.0 [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD @@ -2083,25 +2107,34 @@ FFFD ; Not_XID 1FA60..1FA6D ; Not_XID # 11.0 [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER 1FA70..1FA73 ; Not_XID # 12.0 [4] BALLET SHOES..SHORTS 1FA74 ; Not_XID # 13.0 THONG SANDAL +1FA75..1FA77 ; Not_XID # 15.0 [3] LIGHT BLUE HEART..PINK HEART 1FA78..1FA7A ; Not_XID # 12.0 [3] DROP OF BLOOD..STETHOSCOPE 1FA7B..1FA7C ; Not_XID # 14.0 [2] X-RAY..CRUTCH 1FA80..1FA82 ; Not_XID # 12.0 [3] YO-YO..PARACHUTE 1FA83..1FA86 ; Not_XID # 13.0 [4] BOOMERANG..NESTING DOLLS +1FA87..1FA88 ; Not_XID # 15.0 [2] MARACAS..FLUTE 1FA90..1FA95 ; Not_XID # 12.0 [6] RINGED PLANET..BANJO 1FA96..1FAA8 ; Not_XID # 13.0 [19] MILITARY HELMET..ROCK 1FAA9..1FAAC ; Not_XID # 14.0 [4] MIRROR BALL..HAMSA +1FAAD..1FAAF ; Not_XID # 15.0 [3] FOLDING HAND FAN..KHANDA 1FAB0..1FAB6 ; Not_XID # 13.0 [7] FLY..FEATHER 1FAB7..1FABA ; Not_XID # 14.0 [4] LOTUS..NEST WITH EGGS +1FABB..1FABD ; Not_XID # 15.0 [3] HYACINTH..WING +1FABF ; Not_XID # 15.0 GOOSE 1FAC0..1FAC2 ; Not_XID # 13.0 [3] ANATOMICAL HEART..PEOPLE HUGGING 1FAC3..1FAC5 ; Not_XID # 14.0 [3] PREGNANT MAN..PERSON WITH CROWN +1FACE..1FACF ; Not_XID # 15.0 [2] MOOSE..DONKEY 1FAD0..1FAD6 ; Not_XID # 13.0 [7] BLUEBERRIES..TEAPOT 1FAD7..1FAD9 ; Not_XID # 14.0 [3] POURING LIQUID..JAR +1FADA..1FADB ; Not_XID # 15.0 [2] GINGER ROOT..PEA POD 1FAE0..1FAE7 ; Not_XID # 14.0 [8] MELTING FACE..BUBBLES +1FAE8 ; Not_XID # 15.0 SHAKING FACE 1FAF0..1FAF6 ; Not_XID # 14.0 [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS +1FAF7..1FAF8 ; Not_XID # 15.0 [2] LEFTWARDS PUSHING HAND..RIGHTWARDS PUSHING HAND 1FB00..1FB92 ; Not_XID # 13.0 [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK 1FB94..1FBCA ; Not_XID # 13.0 [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON -# Total code points: 5640 +# Total code points: 5699 # Identifier_Type: Not_NFKC @@ -2352,6 +2385,7 @@ FFE8..FFEE ; Not_NFKC 1D6A8..1D7C9 ; Not_NFKC # 3.1 [290] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL 1D7CA..1D7CB ; Not_NFKC # 5.0 [2] MATHEMATICAL BOLD CAPITAL DIGAMMA..MATHEMATICAL BOLD SMALL DIGAMMA 1D7CE..1D7FF ; Not_NFKC # 3.1 [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1E030..1E06D ; Not_NFKC # 15.0 [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1EE00..1EE03 ; Not_NFKC # 6.1 [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL 1EE05..1EE1F ; Not_NFKC # 6.1 [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF 1EE21..1EE22 ; Not_NFKC # 6.1 [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM @@ -2413,7 +2447,7 @@ FFE8..FFEE ; Not_NFKC 1FBF0..1FBF9 ; Not_NFKC # 13.0 [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 2F800..2FA1D ; Not_NFKC # 3.1 [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -# Total code points: 4859 +# Total code points: 4921 # Identifier_Type: Default_Ignorable @@ -2425,8 +2459,7 @@ FFE8..FFEE ; Not_NFKC 180B..180D ; Default_Ignorable # 3.0 [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE 180E ; Default_Ignorable # 3.0 MONGOLIAN VOWEL SEPARATOR 180F ; Default_Ignorable # 14.0 MONGOLIAN FREE VARIATION SELECTOR FOUR -200B ; Default_Ignorable # 1.1 ZERO WIDTH SPACE -200E..200F ; Default_Ignorable # 1.1 [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +200B..200F ; Default_Ignorable # 1.1 [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK 202A..202E ; Default_Ignorable # 1.1 [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE 2060..2063 ; Default_Ignorable # 3.2 [4] WORD JOINER..INVISIBLE SEPARATOR 2064 ; Default_Ignorable # 5.1 INVISIBLE PLUS @@ -2440,7 +2473,7 @@ FFA0 ; Default_Ignorable E0020..E007F ; Default_Ignorable # 3.1 [96] TAG SPACE..CANCEL TAG E0100..E01EF ; Default_Ignorable # 4.0 [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -# Total code points: 396 +# Total code points: 398 # Identifier_Type: Deprecated Index: gnu/usr.bin/perl/lib/unicore/Index.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/Index.txt,v diff -u -p -a -u -p -r1.6 Index.txt --- gnu/usr.bin/perl/lib/unicore/Index.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/Index.txt 21 Feb 2024 15:47:02 -0000 @@ -270,6 +270,7 @@ ARABIC LETTER HEH WITH YEH ABOVE 06C0 ARABIC LETTER MARK 061C Arabic Letters, Extended 0671 Arabic Letters, Extended 0750 +Arabic Letters, Extended 10EC0 ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM FDFD Arabic Ligatures FBEA Arabic Mathematical Alphabetic Symbols 1EE00 @@ -387,7 +388,7 @@ ASTERISM 2042 Astrological Signs 26B3 Astrological Signs, Tibetan 0F15 Astrological Symbols 263D -Astrological Symbols 28D3 +Astrological Symbols 2BD3 Astrological Symbols, Weather and 2600 asymptotic to 2248 ASYMPTOTICALLY EQUAL TO 2243 @@ -953,6 +954,7 @@ CJK Unified Ideographs Extension D 2B740 CJK Unified Ideographs Extension E 2B820 CJK Unified Ideographs Extension F 2CEB0 CJK Unified Ideographs Extension G 30000 +CJK Unified Ideographs Extension H 31350 CLAPPING HANDS SIGN 1F44F claudian antisigma 2183 claudian digamma inversum 2132 @@ -1374,6 +1376,7 @@ Cyrillic Combining Characters 0483 Cyrillic Extended-A 2DE0 Cyrillic Extended-B A640 Cyrillic Extended-C 1C80 +Cyrillic Extended-D 1E030 Cyrillic Extensions 0450 Cyrillic Extensions 048A Cyrillic Historic Letters 0460 @@ -1467,6 +1470,7 @@ Devanagari Dependent Vowel Signs 093E Devanagari Digits 0966 DEVANAGARI DOUBLE DANDA 0965 Devanagari Extended A8E0 +Devanagari Extended-A 11B00 Devanagari Extensions 0951 Devanagari Independent Vowels 0904 DEVANAGARI OM 0950 @@ -1626,6 +1630,7 @@ DOLPHIN 1F42C domain restriction 25C1 Domino Tiles 1F030 DONG SIGN 20AB +DONKEY 1FACF dot 002E DOT ABOVE 02D9 DOT ABOVE RIGHT, COMBINING 0358 @@ -2042,6 +2047,7 @@ factory 26ED FAHRENHEIT, DEGREE 2109 Fairy Tale Symbols 1F478 FAMILY 1F46A +FAN, FOLDING HAND 1FAAD fast cursor down 21A1 fast cursor left 219E fast cursor right 21A0 @@ -2250,6 +2256,7 @@ GETA MARK 3013 ghana currency 20B5 GHOST 1F47B GIMEL SYMBOL 2137 +GINGER ROOT 1FADA GIRL 1F467 Glagolitic 2C00 Glagolitic Supplement 1E000 @@ -2272,6 +2279,7 @@ GOBLIN, JAPANESE 1F47A gold medal 1F947 Golden Numbers, Runic 16EE golf course 26F3 +GOOSE 1FABF Gothic 10330 Grantha 11300 GRAPHEME JOINER, COMBINING 034F @@ -2563,6 +2571,7 @@ ht 0009 Hungarian, Old 10C80 HV, LATIN SMALL LETTER 0195 HWAIR, LATIN CAPITAL LETTER 01F6 +HYACINTH 1FABB HYPHEN 2010 HYPHEN BULLET 2043 hyphen or minus sign 002D @@ -2647,6 +2656,7 @@ Ideographs Extension D, CJK Unified 2B74 Ideographs Extension E, CJK Unified 2B820 Ideographs Extension F, CJK Unified 2CEB0 Ideographs Extension G, CJK Unified 30000 +Ideographs Extension H, CJK Unified 31350 Ideographs Supplement, CJK Compatibility 2F800 Ideographs, Circled 3280 Ideographs, CJK Compatibility F900 @@ -2830,6 +2840,7 @@ Japanese Katakana Words, Squared 3300 Japanese Katakana, Circled 32D0 japanese kome 203B Javanese A980 +JELLYFISH 1FABC JERUSALEM, CROSS OF 2629 jis composition circle 20DD JIS X 0213 Compatibility Ideographs FA30 @@ -2853,6 +2864,7 @@ K, LATIN SUBSCRIPT SMALL LETTER 2096 KA, HIRAGANA LETTER SMALL 3095 kabusiki-gaisya 337F Kaithi 11080 +Kaktovik Numerals 1D2C0 Kana Extended-A 1B100 Kana Extension, Small 1B130 Kana Repeat Marks 3031 @@ -2877,6 +2889,7 @@ Katakana Words, Squared 3300 Katakana, Circled 32D0 KATAKANA-HIRAGANA DOUBLE HYPHEN 30A0 KATAKANA-HIRAGANA PROLONGED SOUND MARK 30FC +Kawi 11F00 Kayah Li A900 KELVIN SIGN 212A ket 27E9 @@ -2894,7 +2907,9 @@ Keyboard Symbols 2324 Keyboard Symbols 2380 Keyboard Symbols 2396 KEYCAP, COMBINING ENCLOSING 20E3 +KHANDA 1FAAF khanda, gurmukhi 262C +khanda ta, bangla 09CE Kharoshthi 10A00 Kharoshthi Digits 10A40 Khitan Small Script 18B00 @@ -3537,6 +3552,7 @@ MOON, CRESCENT 1F319 MOON, FIRST QUARTER 263D MOON, LAST QUARTER 263E Moon, Sun, and Star Symbols 1F311 +MOOSE 1FACE mortarboard 1F393 most positive 223E MOTORWAY 1F6E3 @@ -3622,6 +3638,7 @@ N-ARY WHITE VERTICAL BAR 2AFF naal, tamil 0BF3 Nabataean 10880 NABLA 2207 +Nag Mundari 1E4D0 NAIRA SIGN 20A6 NAND 22BC Nandinagari 119A0 @@ -3737,6 +3754,7 @@ Numbers, Runic Golden 16EE Numbers, Tamil 0BE7 Numbers, White on Black Circled 24EB Numerals, Hangzhou 3021 +Numerals, Kaktovik 1D2C0 Numerals, Mayan 1D2E0 Numerals, Old Italic 10320 Numerals, Roman 2160 @@ -4100,6 +4118,8 @@ plaintiff 226C PLANCK CONSTANT 210E PLANCK CONSTANT OVER TWO PI 210F Planet Symbols 263F +Planets, Symbols for Minor 26B3 +Planets, Symbols for Minor 1F77B Plant Symbols 1F330 Plastics Recycling Symbols 2673 Playing Card Suits 2660 @@ -5985,6 +6005,7 @@ WHITE VERTICAL BAR, N-ARY 2AFF WIDE BRIDGE ABOVE, COMBINING 20E9 Wiggly Fences 29D8 WIGGLY VERTICAL LINE 2E3E +WING 1FABD wj 2060 WOLF FACE 1F43A WOMAN 1F469 Index: gnu/usr.bin/perl/lib/unicore/IndicPositionalCategory.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/IndicPositionalCategory.txt,v diff -u -p -a -u -p -r1.5 IndicPositionalCategory.txt --- gnu/usr.bin/perl/lib/unicore/IndicPositionalCategory.txt 15 Feb 2023 01:36:34 -0000 1.5 +++ gnu/usr.bin/perl/lib/unicore/IndicPositionalCategory.txt 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# IndicPositionalCategory-14.0.0.txt -# Date: 2021-05-22, 01:01:00 GMT [KW, RP] -# © 2021 Unicode®, Inc. +# IndicPositionalCategory-15.0.0.txt +# Date: 2022-05-26, 02:18:00 GMT [KW, RP] +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # For documentation, see UAX #44: Unicode Character Database, -# at http://www.unicode.org/reports/tr44/ +# at https://www.unicode.org/reports/tr44/ # # This file defines the following property: # @@ -68,13 +68,13 @@ # # Ahom, Balinese, Batak, Bengali, Bhaiksuki, Brahmi, Buginese, Buhid, # Chakma, Cham, Devanagari, Dives Akuru, Dogra, Grantha, Gujarati, -# Gunjala Gondi, Gurmukhi, Hanunoo, Javanese, Kaithi, Kannada, -# Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Lepcha, Limbu, Makasar, -# Malayalam, Marchen, Masaram Gondi, Meetei Mayek, Modi, Myanmar, -# Nandinagari, Newa, New Tai Lue, Oriya, Rejang, Saurashtra, Sharada, -# Siddham, Sinhala, Soyombo, Sundanese, Syloti Nagri, Tagalog, -# Tagbanwa, Tai Tham, Tai Viet, Takri, Tamil, Telugu, Thai, Tibetan, -# Tirhuta, and Zanabazar Square. +# Gunjala Gondi, Gurmukhi, Hanunoo, Javanese, Kaithi, Kannada, Kawi, +# Kayah Li, Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Lepcha, Limbu, +# Makasar, Malayalam, Marchen, Masaram Gondi, Meetei Mayek, Modi, +# Myanmar, Nandinagari, Newa, New Tai Lue, Oriya, Rejang, Saurashtra, +# Sharada, Siddham, Sinhala, Soyombo, Sundanese, Syloti Nagri, +# Tagalog, Tagbanwa, Tai Tham, Tai Viet, Takri, Tamil, Telugu, Thai, +# Tibetan, Tirhuta, and Zanabazar Square. # # All characters for all other scripts not in that list # take the default value for this property. @@ -158,6 +158,7 @@ 0CBE ; Right # Mc KANNADA VOWEL SIGN AA 0CC1..0CC4 ; Right # Mc [4] KANNADA VOWEL SIGN U..KANNADA VOWEL SIGN VOCALIC RR 0CD5..0CD6 ; Right # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CF3 ; Right # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D02..0D03 ; Right # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D3E..0D40 ; Right # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II 0D41..0D42 ; Right # Mn [2] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN UU @@ -296,6 +297,9 @@ ABEC ; Right # Mc MEETEI 11D93..11D94 ; Right # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU 11D96 ; Right # Mc GUNJALA GONDI SIGN VISARGA 11EF6 ; Right # Mc MAKASAR VOWEL SIGN O +11F03 ; Right # Mc KAWI SIGN VISARGA +11F34..11F35 ; Right # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F41 ; Right # Mc KAWI SIGN KILLER # Indic_Positional_Category=Left @@ -346,6 +350,7 @@ AAEE ; Left # Mc MEETEI M 119E4 ; Left # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E 11CB1 ; Left # Mc MARCHEN VOWEL SIGN I 11EF5 ; Left # Mc MAKASAR VOWEL SIGN E +11F3E..11F3F ; Left # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI # Indic_Positional_Category=Visual_Order_Left @@ -388,7 +393,7 @@ AABB..AABC ; Visual_Order_Left # Lo 093A ; Top # Mn DEVANAGARI VOWEL SIGN OE 0945..0948 ; Top # Mn [4] DEVANAGARI VOWEL SIGN CANDRA E..DEVANAGARI VOWEL SIGN AI 0951 ; Top # Mn DEVANAGARI STRESS SIGN UDATTA -0953..0955 ; Top # Mn [3] DEVANAGARI GRAVE ACCENT..DEVANAGARI VOWEL SIGN CANDRA LONG E +0955 ; Top # Mn DEVANAGARI VOWEL SIGN CANDRA LONG E 0981 ; Top # Mn BENGALI SIGN CANDRABINDU 09FE ; Top # Mn BENGALI SANDHI MARK 0A01..0A02 ; Top # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI @@ -428,7 +433,7 @@ AABB..AABC ; Visual_Order_Left # Lo 0EB1 ; Top # Mn LAO VOWEL SIGN MAI KAN 0EB4..0EB7 ; Top # Mn [4] LAO VOWEL SIGN I..LAO VOWEL SIGN YY 0EBB ; Top # Mn LAO VOWEL SIGN MAI KON -0EC8..0ECD ; Top # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0EC8..0ECE ; Top # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN 0F39 ; Top # Mn TIBETAN MARK TSA -PHRU 0F72 ; Top # Mn TIBETAN VOWEL SIGN I 0F7A..0F7E ; Top # Mn [5] TIBETAN VOWEL SIGN E..TIBETAN SIGN RJES SU NGA RO @@ -488,6 +493,7 @@ A826 ; Top # Mn SYLOTI NA A8C5 ; Top # Mn SAURASHTRA SIGN CANDRABINDU A8E0..A8F1 ; Top # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA A8FF ; Top # Mn DEVANAGARI VOWEL SIGN AY +A926..A92A ; Top # Mn [5] KAYAH LI VOWEL UE..KAYAH LI VOWEL O A94A ; Top # Mn REJANG VOWEL SIGN AI A94F..A951 ; Top # Mn [3] REJANG CONSONANT SIGN NG..REJANG CONSONANT SIGN R A980..A982 ; Top # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR @@ -580,6 +586,10 @@ ABE5 ; Top # Mn MEETEI MA 11D90..11D91 ; Top # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI 11D95 ; Top # Mn GUNJALA GONDI SIGN ANUSVARA 11EF3 ; Top # Mn MAKASAR VOWEL SIGN I +11F00..11F01 ; Top # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02 ; Top # Lo KAWI SIGN REPHA +11F36..11F37 ; Top # Mn [2] KAWI VOWEL SIGN I..KAWI VOWEL SIGN II +11F40 ; Top # Mn KAWI VOWEL SIGN EU # Indic_Positional_Category=Bottom @@ -688,6 +698,7 @@ ABED ; Bottom # Mn MEETEI 111C9..111CA ; Bottom # Mn [2] SHARADA SANDHI MARK..SHARADA SIGN NUKTA 111CC ; Bottom # Mn SHARADA EXTRA SHORT VOWEL MARK 1122F ; Bottom # Mn KHOJKI VOWEL SIGN U +11241 ; Bottom # Mn KHOJKI VOWEL SIGN VOCALIC R 112E3..112E4 ; Bottom # Mn [2] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN UU 112E9..112EA ; Bottom # Mn [2] KHUDAWADI SIGN NUKTA..KHUDAWADI SIGN VIRAMA 1133B..1133C ; Bottom # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA @@ -728,6 +739,7 @@ ABED ; Bottom # Mn MEETEI 11D44 ; Bottom # Mn MASARAM GONDI SIGN HALANTA 11D47 ; Bottom # Mn MASARAM GONDI RA-KARA 11EF4 ; Bottom # Mn MAKASAR VOWEL SIGN U +11F38..11F3A ; Bottom # Mn [3] KAWI VOWEL SIGN U..KAWI VOWEL SIGN VOCALIC R # Indic_Positional_Category=Top_And_Bottom Index: gnu/usr.bin/perl/lib/unicore/IndicSyllabicCategory.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/IndicSyllabicCategory.txt,v diff -u -p -a -u -p -r1.6 IndicSyllabicCategory.txt --- gnu/usr.bin/perl/lib/unicore/IndicSyllabicCategory.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/IndicSyllabicCategory.txt 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# IndicSyllabicCategory-14.0.0.txt -# Date: 2021-05-22, 01:01:00 GMT [KW, RP] -# © 2021 Unicode®, Inc. +# IndicSyllabicCategory-15.0.0.txt +# Date: 2022-05-26, 02:18:00 GMT [KW, RP] +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # For documentation, see UAX #44: Unicode Character Database, -# at http://www.unicode.org/reports/tr44/ +# at https://www.unicode.org/reports/tr44/ # # This file defines the following property: # @@ -37,7 +37,7 @@ # # Ahom, Balinese, Batak, Bengali, Bhaiksuki, Brahmi, Buginese, Buhid, # Chakma, Cham, Devanagari, Dives Akuru, Dogra, Grantha, Gujarati, -# Gunjala Gondi, Gurmukhi, Hanunoo, Javanese, Kaithi, Kannada, +# Gunjala Gondi, Gurmukhi, Hanunoo, Javanese, Kaithi, Kannada, Kawi, # Kayah Li, Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Lepcha, Limbu, # Mahajani, Makasar, Malayalam, Marchen, Masaram Gondi, Meetei Mayek, # Modi, Multani, Myanmar, Nandinagari, Newa, New Tai Lue, Oriya, @@ -84,6 +84,7 @@ 0C80 ; Bindu # Lo KANNADA SIGN SPACING CANDRABINDU 0C81 ; Bindu # Mn KANNADA SIGN CANDRABINDU 0C82 ; Bindu # Mc KANNADA SIGN ANUSVARA +0CF3 ; Bindu # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D00..0D01 ; Bindu # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02 ; Bindu # Mc MALAYALAM SIGN ANUSVARA 0D04 ; Bindu # Lo MALAYALAM LETTER VEDIC ANUSVARA @@ -133,6 +134,7 @@ A980..A981 ; Bindu # Mn [2] JAVANES 11CB5..11CB6 ; Bindu # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU 11D40 ; Bindu # Mn MASARAM GONDI SIGN ANUSVARA 11D95 ; Bindu # Mn GUNJALA GONDI SIGN ANUSVARA +11F00..11F01 ; Bindu # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA # ================================================ @@ -179,6 +181,7 @@ AAF5 ; Visarga # Mc MEETE 11C3E ; Visarga # Mc BHAIKSUKI SIGN VISARGA 11D41 ; Visarga # Mn MASARAM GONDI SIGN VISARGA 11D96 ; Visarga # Mc GUNJALA GONDI SIGN VISARGA +11F03 ; Visarga # Mc KAWI SIGN VISARGA # ================================================ @@ -320,6 +323,7 @@ ABED ; Pure_Killer # Mn M 1193D ; Pure_Killer # Mc DIVES AKURU SIGN HALANTA 11A34 ; Pure_Killer # Mn ZANABAZAR SQUARE SIGN VIRAMA 11D44 ; Pure_Killer # Mn MASARAM GONDI SIGN HALANTA +11F41 ; Pure_Killer # Mc KAWI SIGN KILLER # ================================================ @@ -346,6 +350,7 @@ AAF6 ; Invisible_Stacker # Mn 11A99 ; Invisible_Stacker # Mn SOYOMBO SUBJOINER 11D45 ; Invisible_Stacker # Mn MASARAM GONDI VIRAMA 11D97 ; Invisible_Stacker # Mn GUNJALA GONDI VIRAMA +11F42 ; Invisible_Stacker # Mn KAWI CONJOINER # ================================================ @@ -416,6 +421,7 @@ ABD1 ; Vowel_Independent # Lo 11103..11106 ; Vowel_Independent # Lo [4] CHAKMA LETTER AA..CHAKMA LETTER E 11183..11190 ; Vowel_Independent # Lo [14] SHARADA LETTER A..SHARADA LETTER AU 11200..11207 ; Vowel_Independent # Lo [8] KHOJKI LETTER A..KHOJKI LETTER AU +11240 ; Vowel_Independent # Lo KHOJKI LETTER SHORT I 11280..11283 ; Vowel_Independent # Lo [4] MULTANI LETTER A..MULTANI LETTER E 112B0..112B9 ; Vowel_Independent # Lo [10] KHUDAWADI LETTER A..KHUDAWADI LETTER AU 11305..1130C ; Vowel_Independent # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L @@ -443,6 +449,7 @@ ABD1 ; Vowel_Independent # Lo 11D60..11D65 ; Vowel_Independent # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU 11D67..11D68 ; Vowel_Independent # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI 11D6A..11D6B ; Vowel_Independent # Lo [2] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER AU +11F04..11F10 ; Vowel_Independent # Lo [13] KAWI LETTER A..KAWI LETTER O # ================================================ @@ -638,6 +645,7 @@ ABE9..ABEA ; Vowel_Dependent # Mc [ 1122C..1122E ; Vowel_Dependent # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II 1122F..11231 ; Vowel_Dependent # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI 11232..11233 ; Vowel_Dependent # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11241 ; Vowel_Dependent # Mn KHOJKI VOWEL SIGN VOCALIC R 112E0..112E2 ; Vowel_Dependent # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II 112E3..112E8 ; Vowel_Dependent # Mn [6] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN AU 1133E..1133F ; Vowel_Dependent # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I @@ -700,6 +708,10 @@ ABE9..ABEA ; Vowel_Dependent # Mc [ 11D93..11D94 ; Vowel_Dependent # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU 11EF3..11EF4 ; Vowel_Dependent # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6 ; Vowel_Dependent # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11F34..11F35 ; Vowel_Dependent # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; Vowel_Dependent # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; Vowel_Dependent # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; Vowel_Dependent # Mn KAWI VOWEL SIGN EU # ================================================ @@ -878,6 +890,7 @@ ABD2..ABDA ; Consonant # Lo [9] MEE 11191..111B2 ; Consonant # Lo [34] SHARADA LETTER KA..SHARADA LETTER HA 11208..11211 ; Consonant # Lo [10] KHOJKI LETTER KA..KHOJKI LETTER JJA 11213..1122B ; Consonant # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1123F ; Consonant # Lo KHOJKI LETTER QA 11284..11286 ; Consonant # Lo [3] MULTANI LETTER KA..MULTANI LETTER GA 11288 ; Consonant # Lo MULTANI LETTER GHA 1128A..1128D ; Consonant # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -908,6 +921,7 @@ ABD2..ABDA ; Consonant # Lo [9] MEE 11D0C..11D30 ; Consonant # Lo [37] MASARAM GONDI LETTER KA..MASARAM GONDI LETTER TRA 11D6C..11D89 ; Consonant # Lo [30] GUNJALA GONDI LETTER YA..GUNJALA GONDI LETTER SA 11EE0..11EF1 ; Consonant # Lo [18] MAKASAR LETTER KA..MAKASAR LETTER A +11F12..11F33 ; Consonant # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA # ================================================ @@ -963,6 +977,7 @@ ABD2..ABDA ; Consonant # Lo [9] MEE 0D4E ; Consonant_Preceding_Repha # Lo MALAYALAM LETTER DOT REPH 11941 ; Consonant_Preceding_Repha # Lo DIVES AKURU INITIAL RA 11D46 ; Consonant_Preceding_Repha # Lo MASARAM GONDI REPHA +11F02 ; Consonant_Preceding_Repha # Lo KAWI SIGN REPHA # ================================================ @@ -1132,10 +1147,14 @@ ABEC ; Tone_Mark # Mc MEE # Indic_Syllabic_Category=Gemination_Mark # Gemination Mark (doubling of the preceding or following consonant) +# +# U+0A71 GURMUKHI ADDAK precedes the consonant it geminates, while the +# others follow the consonant they geminate. # [Not derivable] 0A71 ; Gemination_Mark # Mn GURMUKHI ADDAK +0AFB ; Gemination_Mark # Mn GUJARATI SIGN SHADDA 11237 ; Gemination_Mark # Mn KHOJKI SIGN SHADDA 11A98 ; Gemination_Mark # Mn SOYOMBO GEMINATION MARK @@ -1149,7 +1168,8 @@ ABEC ; Tone_Mark # Mc MEE 0951..0952 ; Cantillation_Mark # Mn [2] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI STRESS SIGN ANUDATTA 0A51 ; Cantillation_Mark # Mn GURMUKHI SIGN UDAAT -0AFA..0AFC ; Cantillation_Mark # Mn [3] GUJARATI SIGN SUKUN..GUJARATI SIGN MADDAH +0AFA ; Cantillation_Mark # Mn GUJARATI SIGN SUKUN +0AFC ; Cantillation_Mark # Mn GUJARATI SIGN MADDAH 1CD0..1CD2 ; Cantillation_Mark # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA 1CD4..1CE0 ; Cantillation_Mark # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA 1CE1 ; Cantillation_Mark # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA @@ -1177,12 +1197,13 @@ A8E0..A8F1 ; Cantillation_Mark # Mn # Indic_Syllabic_Category=Syllable_Modifier # Syllable Modifier (miscellaneous combining characters that modify -# something in the orthographic syllable they succeed) +# something in the orthographic syllable they succeed or appear in) # [Not derivable] 00B2..00B3 ; Syllable_Modifier # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE 09FE ; Syllable_Modifier # Mn BENGALI SANDHI MARK +0ECE ; Syllable_Modifier # Mn LAO YAMAKKAN 0F35 ; Syllable_Modifier # Mn TIBETAN MARK NGAS BZUNG NYI ZLA 0F37 ; Syllable_Modifier # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS 0FC6 ; Syllable_Modifier # Mn TIBETAN SYMBOL PADMA GDAN @@ -1304,14 +1325,20 @@ ABF0..ABF9 ; Number # Nd [10] MEETEI 11C5A..11C6C ; Number # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK 11D50..11D59 ; Number # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE 11DA0..11DA9 ; Number # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11F50..11F59 ; Number # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE # ================================================ # Indic_Syllabic_Category=Brahmi_Joining_Number -# Brahmi Joining Number (similar to Number in that in can be used as -# vowel-holders like Consonant_Placeholder, but may also be joined by -# a Number_Joiner of the same script, e.g. in Brahmi) +# Brahmi Joining Number (may be joined by a Number_Joiner of the same +# script, e.g. in Brahmi) +# +# Note: These are different from Numbers, in the way that there is no known +# evidence of Brahmi Joining Numbers taking vowels or subjoined consonants. +# Until such evidence is found, implementations may assume that Brahmi +# Joining Numbers only participate in shaping with other Brahmi Joining +# Numbers. # [Not derivable] Index: gnu/usr.bin/perl/lib/unicore/Jamo.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/Jamo.txt,v diff -u -p -a -u -p -r1.6 Jamo.txt --- gnu/usr.bin/perl/lib/unicore/Jamo.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/Jamo.txt 21 Feb 2024 15:47:02 -0000 @@ -1,14 +1,14 @@ -# Jamo-14.0.0.txt -# Date: 2021-03-16, 21:43:00 GMT [KW, LI] -# © 2021 Unicode®, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# Jamo-15.0.0.txt +# Date: 2022-05-03, 18:52:00 GMT [KW, LI] +# © 2022 Unicode®, Inc. +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # This file defines the Jamo_Short_Name property. # -# See Section 3.12 of The Unicode Standard, Version 14.0 +# See Section 3.12 of The Unicode Standard, Version 15.0 # for more information. # # Each line contains two fields, separated by a semicolon. Index: gnu/usr.bin/perl/lib/unicore/LineBreak.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/LineBreak.txt,v diff -u -p -a -u -p -r1.6 LineBreak.txt --- gnu/usr.bin/perl/lib/unicore/LineBreak.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/LineBreak.txt 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ -# LineBreak-14.0.0.txt -# Date: 2021-07-06, 09:58:55 GMT [KW, LI] -# © 2021 Unicode®, Inc. +# LineBreak-15.0.0.txt +# Date: 2022-07-28, 09:20:42 GMT [KW, LI] +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. # For terms of use, see https://www.unicode.org/terms_of_use.html # @@ -481,6 +481,7 @@ 0CE2..0CE3;CM # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CE6..0CEF;NU # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE 0CF1..0CF2;AL # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3;CM # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D00..0D01;CM # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03;CM # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D04..0D0C;AL # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L @@ -542,7 +543,7 @@ 0EBD;SA # Lo LAO SEMIVOWEL SIGN NYO 0EC0..0EC4;SA # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI 0EC6;SA # Lm LAO KO LA -0EC8..0ECD;SA # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA +0EC8..0ECE;SA # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN 0ED0..0ED9;NU # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE 0EDC..0EDF;SA # Lo [4] LAO HO NO..LAO LETTER KHMU NYO 0F00;AL # Lo TIBETAN SYLLABLE OM @@ -855,7 +856,11 @@ 1D79..1D7F;AL # Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE 1D80..1D9A;AL # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK 1D9B..1DBF;AL # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA -1DC0..1DFF;CM # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1DC0..1DCC;CM # Mn [13] COMBINING DOTTED GRAVE ACCENT..COMBINING MACRON-BREVE +1DCD;GL # Mn COMBINING DOUBLE CIRCUMFLEX ABOVE +1DCE..1DFB;CM # Mn [46] COMBINING OGONEK ABOVE..COMBINING DELETION MARK +1DFC;GL # Mn COMBINING DOUBLE INVERTED BREVE BELOW +1DFD..1DFF;CM # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 1E00..1EFF;AL # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP 1F00..1F15;AL # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA 1F18..1F1D;AL # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA @@ -931,7 +936,7 @@ 2054;AL # Pc INVERTED UNDERTIE 2055;AL # Po FLOWER PUNCTUATION MARK 2056;BA # Po THREE DOT PUNCTUATION -2057;AL # Po QUADRUPLE PRIME +2057;PO # Po QUADRUPLE PRIME 2058..205B;BA # Po [4] FOUR DOT PUNCTUATION..FOUR DOT MARK 205C;AL # Po DOTTED CROSS 205D..205E;BA # Po [2] TRICOLON..VERTICAL FOUR DOTS @@ -2793,6 +2798,7 @@ FFFD;AI # So REPLACEME 10EAB..10EAC;CM # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK 10EAD;BA # Pd YEZIDI HYPHENATION MARK 10EB0..10EB1;AL # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +10EFD..10EFF;CM # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA 10F00..10F1C;AL # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL 10F1D..10F26;AL # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF 10F27;AL # Lo OLD SOGDIAN LIGATURE AYIN-DALETH @@ -2882,6 +2888,8 @@ FFFD;AI # So REPLACEME 1123B..1123C;BA # Po [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK 1123D;AL # Po KHOJKI ABBREVIATION SIGN 1123E;CM # Mn KHOJKI SIGN SUKUN +1123F..11240;AL # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241;CM # Mn KHOJKI VOWEL SIGN VOCALIC R 11280..11286;AL # Lo [7] MULTANI LETTER A..MULTANI LETTER GA 11288;AL # Lo MULTANI LETTER GHA 1128A..1128D;AL # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA @@ -3055,6 +3063,7 @@ FFFD;AI # So REPLACEME 11AA1..11AA2;BA # Po [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2 11AB0..11ABF;AL # Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA 11AC0..11AF8;AL # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11B00..11B09;BB # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU 11C00..11C08;AL # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L 11C0A..11C2E;AL # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA 11C2F;CM # Mc BHAIKSUKI VOWEL SIGN AA @@ -3101,6 +3110,20 @@ FFFD;AI # So REPLACEME 11EF3..11EF4;CM # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6;CM # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O 11EF7..11EF8;AL # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F00..11F01;CM # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02;AL # Lo KAWI SIGN REPHA +11F03;CM # Mc KAWI SIGN VISARGA +11F04..11F10;AL # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33;AL # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35;CM # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A;CM # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F;CM # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40;CM # Mn KAWI VOWEL SIGN EU +11F41;CM # Mc KAWI SIGN KILLER +11F42;CM # Mn KAWI CONJOINER +11F43..11F44;BA # Po [2] KAWI DANDA..KAWI DOUBLE DANDA +11F45..11F4F;ID # Po [11] KAWI PUNCTUATION SECTION MARKER..KAWI PUNCTUATION CLOSING SPIRAL +11F50..11F59;NU # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE 11FB0;AL # Lo LISU LETTER YHA 11FC0..11FD4;AL # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH 11FD5..11FDC;AL # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI @@ -3126,10 +3149,18 @@ FFFD;AI # So REPLACEME 1328A..13378;AL # Lo [239] EGYPTIAN HIEROGLYPH O037..EGYPTIAN HIEROGLYPH V011 13379;OP # Lo EGYPTIAN HIEROGLYPH V011A 1337A..1337B;CL # Lo [2] EGYPTIAN HIEROGLYPH V011B..EGYPTIAN HIEROGLYPH V011C -1337C..1342E;AL # Lo [179] EGYPTIAN HIEROGLYPH V012..EGYPTIAN HIEROGLYPH AA032 +1337C..1342F;AL # Lo [180] EGYPTIAN HIEROGLYPH V012..EGYPTIAN HIEROGLYPH V011D 13430..13436;GL # Cf [7] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH OVERLAY MIDDLE 13437;OP # Cf EGYPTIAN HIEROGLYPH BEGIN SEGMENT 13438;CL # Cf EGYPTIAN HIEROGLYPH END SEGMENT +13439..1343B;GL # Cf [3] EGYPTIAN HIEROGLYPH INSERT AT MIDDLE..EGYPTIAN HIEROGLYPH INSERT AT BOTTOM +1343C;OP # Cf EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE +1343D;CL # Cf EGYPTIAN HIEROGLYPH END ENCLOSURE +1343E;OP # Cf EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE +1343F;CL # Cf EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +13440;CM # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13441..13446;AL # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN +13447..13455;CM # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED 14400..145CD;AL # Lo [462] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A409 145CE;OP # Lo ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK 145CF;CL # Lo ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK @@ -3179,7 +3210,9 @@ FFFD;AI # So REPLACEME 1AFFD..1AFFE;AL # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 1B000..1B0FF;ID # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 1B100..1B122;ID # Lo [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU +1B132;CJ # Lo HIRAGANA LETTER SMALL KO 1B150..1B152;CJ # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155;CJ # Lo KATAKANA LETTER SMALL KO 1B164..1B167;CJ # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N 1B170..1B2FB;ID # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 1BC00..1BC6A;AL # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M @@ -3210,6 +3243,7 @@ FFFD;AI # So REPLACEME 1D200..1D241;AL # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 1D242..1D244;CM # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME 1D245;AL # So GREEK MUSICAL LEIMMA +1D2C0..1D2D3;AL # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN 1D2E0..1D2F3;AL # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN 1D300..1D356;AL # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING 1D360..1D378;AL # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE @@ -3270,11 +3304,14 @@ FFFD;AI # So REPLACEME 1DF00..1DF09;AL # Ll [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK 1DF0A;AL # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK 1DF0B..1DF1E;AL # Ll [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A;AL # Ll [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK 1E000..1E006;CM # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 1E008..1E018;CM # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 1E01B..1E021;CM # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI 1E023..1E024;CM # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS 1E026..1E02A;CM # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E030..1E06D;AL # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F;CM # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 1E100..1E12C;AL # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W 1E130..1E136;CM # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D 1E137..1E13D;AL # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER @@ -3287,6 +3324,10 @@ FFFD;AI # So REPLACEME 1E2EC..1E2EF;CM # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI 1E2F0..1E2F9;NU # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE 1E2FF;PR # Sc WANCHO NGUN SIGN +1E4D0..1E4EA;AL # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB;AL # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF;CM # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E4F0..1E4F9;NU # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE 1E7E0..1E7E6;AL # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO 1E7E8..1E7EB;AL # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE 1E7ED..1E7EE;AL # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE @@ -3454,16 +3495,18 @@ FFFD;AI # So REPLACEME 1F6C1..1F6CB;ID # So [11] BATHTUB..COUCH AND LAMP 1F6CC;EB # So SLEEPING ACCOMMODATION 1F6CD..1F6D7;ID # So [11] SHOPPING BAGS..ELEVATOR -1F6D8..1F6DC;ID # Cn [5] .. -1F6DD..1F6EC;ID # So [16] PLAYGROUND SLIDE..AIRPLANE ARRIVING +1F6D8..1F6DB;ID # Cn [4] .. +1F6DC..1F6EC;ID # So [17] WIRELESS..AIRPLANE ARRIVING 1F6ED..1F6EF;ID # Cn [3] .. 1F6F0..1F6FC;ID # So [13] SATELLITE..ROLLER SKATE 1F6FD..1F6FF;ID # Cn [3] .. 1F700..1F773;AL # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE -1F774..1F77F;ID # Cn [12] .. +1F774..1F776;ID # So [3] LOT OF FORTUNE..LUNAR ECLIPSE +1F777..1F77A;ID # Cn [4] .. +1F77B..1F77F;ID # So [5] HAUMEA..ORCUS 1F780..1F7D4;AL # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR -1F7D5..1F7D8;ID # So [4] CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE -1F7D9..1F7DF;ID # Cn [7] .. +1F7D5..1F7D9;ID # So [5] CIRCLED TRIANGLE..NINE POINTED WHITE STAR +1F7DA..1F7DF;ID # Cn [6] .. 1F7E0..1F7EB;ID # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE 1F7EC..1F7EF;ID # Cn [4] .. 1F7F0;ID # So HEAVY EQUALS SIGN @@ -3509,33 +3552,29 @@ FFFD;AI # So REPLACEME 1FA54..1FA5F;ID # Cn [12] .. 1FA60..1FA6D;ID # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER 1FA6E..1FA6F;ID # Cn [2] .. -1FA70..1FA74;ID # So [5] BALLET SHOES..THONG SANDAL -1FA75..1FA77;ID # Cn [3] .. -1FA78..1FA7C;ID # So [5] DROP OF BLOOD..CRUTCH +1FA70..1FA7C;ID # So [13] BALLET SHOES..CRUTCH 1FA7D..1FA7F;ID # Cn [3] .. -1FA80..1FA86;ID # So [7] YO-YO..NESTING DOLLS -1FA87..1FA8F;ID # Cn [9] .. -1FA90..1FAAC;ID # So [29] RINGED PLANET..HAMSA -1FAAD..1FAAF;ID # Cn [3] .. -1FAB0..1FABA;ID # So [11] FLY..NEST WITH EGGS -1FABB..1FABF;ID # Cn [5] .. -1FAC0..1FAC2;ID # So [3] ANATOMICAL HEART..PEOPLE HUGGING +1FA80..1FA88;ID # So [9] YO-YO..FLUTE +1FA89..1FA8F;ID # Cn [7] .. +1FA90..1FABD;ID # So [46] RINGED PLANET..WING +1FABE;ID # Cn +1FABF..1FAC2;ID # So [4] GOOSE..PEOPLE HUGGING 1FAC3..1FAC5;EB # So [3] PREGNANT MAN..PERSON WITH CROWN -1FAC6..1FACF;ID # Cn [10] .. -1FAD0..1FAD9;ID # So [10] BLUEBERRIES..JAR -1FADA..1FADF;ID # Cn [6] .. -1FAE0..1FAE7;ID # So [8] MELTING FACE..BUBBLES -1FAE8..1FAEF;ID # Cn [8] .. -1FAF0..1FAF6;EB # So [7] HAND WITH INDEX FINGER AND THUMB CROSSED..HEART HANDS -1FAF7..1FAFF;ID # Cn [9] .. +1FAC6..1FACD;ID # Cn [8] .. +1FACE..1FADB;ID # So [14] MOOSE..PEA POD +1FADC..1FADF;ID # Cn [4] .. +1FAE0..1FAE8;ID # So [9] MELTING FACE..SHAKING FACE +1FAE9..1FAEF;ID # Cn [7] .. +1FAF0..1FAF8;EB # So [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND +1FAF9..1FAFF;ID # Cn [7] .. 1FB00..1FB92;AL # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK 1FB94..1FBCA;AL # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON 1FBF0..1FBF9;NU # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE 1FC00..1FFFD;ID # Cn [1022] .. 20000..2A6DF;ID # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF 2A6E0..2A6FF;ID # Cn [32] .. -2A700..2B738;ID # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 -2B739..2B73F;ID # Cn [7] .. +2A700..2B739;ID # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 +2B73A..2B73F;ID # Cn [6] .. 2B740..2B81D;ID # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B81E..2B81F;ID # Cn [2] .. 2B820..2CEA1;ID # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 @@ -3546,7 +3585,9 @@ FFFD;AI # So REPLACEME 2FA1E..2FA1F;ID # Cn [2] .. 2FA20..2FFFD;ID # Cn [1502] .. 30000..3134A;ID # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A -3134B..3FFFD;ID # Cn [60595] .. +3134B..3134F;ID # Cn [5] .. +31350..323AF;ID # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF +323B0..3FFFD;ID # Cn [56398] .. E0001;CM # Cf LANGUAGE TAG E0020..E007F;CM # Cf [96] TAG SPACE..CANCEL TAG E0100..E01EF;CM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 Index: gnu/usr.bin/perl/lib/unicore/Name.pl =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/Name.pl,v diff -u -p -a -u -p -r1.12 Name.pl --- gnu/usr.bin/perl/lib/unicore/Name.pl 15 Feb 2023 01:39:49 -0000 1.12 +++ gnu/usr.bin/perl/lib/unicore/Name.pl 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ # !!!!!!! DO NOT EDIT THIS FILE !!!!!!! # This file is machine-generated by lib/unicore/mktables from the Unicode -# database, Version 14.0.0. Any changes made here will be lost! +# database, Version 15.0.0. Any changes made here will be lost! # !!!!!!! INTERNAL PERL USE ONLY !!!!!!! # This file is for internal use by core Perl only. The format and even the @@ -200,6 +200,9 @@ CAN END OF MEDIUM 00019 +EM + +00019 EOM 0001A @@ -4871,6 +4874,9 @@ ARABIC SIGN TAKHALLUS ARABIC SMALL HIGH TAH 00616 +ARABIC SMALL HIGH LIGATURE ALEF WITH YEH BARREE + +00616 ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH 00617 @@ -9250,6 +9256,9 @@ KANNADA SIGN JIHVAMULIYA 00CF2 KANNADA SIGN UPADHMANIYA +00CF3 +KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT + 00D00 MALAYALAM SIGN COMBINING ANUSVARA ABOVE @@ -10354,6 +10363,9 @@ LAO CANCELLATION MARK 00ECD LAO NIGGAHITA +00ECE +LAO YAMAKKAN + 00ED0 LAO DIGIT ZERO @@ -19325,6 +19337,9 @@ SUNDANESE LETTER REU SUNDANESE LETTER LEU 01BBD +SUNDANESE LETTER ARCHAIC I + +01BBD SUNDANESE LETTER BHA 01BBE @@ -57220,6 +57235,15 @@ YEZIDI LETTER LAM WITH DOT ABOVE 10EB1 YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +10EFD +ARABIC SMALL LOW WORD SAKTA + +10EFE +ARABIC SMALL LOW WORD QASR + +10EFF +ARABIC SMALL LOW WORD MADDA + 10F00 OLD SOGDIAN LETTER ALEPH @@ -59215,6 +59239,15 @@ KHOJKI ABBREVIATION SIGN 1123E KHOJKI SIGN SUKUN +1123F +KHOJKI LETTER QA + +11240 +KHOJKI LETTER SHORT I + +11241 +KHOJKI VOWEL SIGN VOCALIC R + 11280 MULTANI LETTER A @@ -62809,6 +62842,36 @@ PAU CIN HAU LOW-FALLING TONE FINAL 11AF8 PAU CIN HAU GLOTTAL STOP FINAL +11B00 +DEVANAGARI HEAD MARK + +11B01 +DEVANAGARI HEAD MARK WITH HEADSTROKE + +11B02 +DEVANAGARI SIGN BHALE + +11B03 +DEVANAGARI SIGN BHALE WITH HOOK + +11B04 +DEVANAGARI SIGN EXTENDED BHALE + +11B05 +DEVANAGARI SIGN EXTENDED BHALE WITH HOOK + +11B06 +DEVANAGARI SIGN WESTERN FIVE-LIKE BHALE + +11B07 +DEVANAGARI SIGN WESTERN NINE-LIKE BHALE + +11B08 +DEVANAGARI SIGN REVERSED NINE-LIKE BHALE + +11B09 +DEVANAGARI SIGN MINDU + 11C00 BHAIKSUKI LETTER A @@ -63793,6 +63856,264 @@ MAKASAR PASSIMBANG 11EF8 MAKASAR END OF SECTION +11F00 +KAWI SIGN CANDRABINDU + +11F01 +KAWI SIGN ANUSVARA + +11F02 +KAWI SIGN REPHA + +11F03 +KAWI SIGN VISARGA + +11F04 +KAWI LETTER A + +11F05 +KAWI LETTER AA + +11F06 +KAWI LETTER I + +11F07 +KAWI LETTER II + +11F08 +KAWI LETTER U + +11F09 +KAWI LETTER UU + +11F0A +KAWI LETTER VOCALIC R + +11F0B +KAWI LETTER VOCALIC RR + +11F0C +KAWI LETTER VOCALIC L + +11F0D +KAWI LETTER VOCALIC LL + +11F0E +KAWI LETTER E + +11F0F +KAWI LETTER AI + +11F10 +KAWI LETTER O + +11F12 +KAWI LETTER KA + +11F13 +KAWI LETTER KHA + +11F14 +KAWI LETTER GA + +11F15 +KAWI LETTER GHA + +11F16 +KAWI LETTER NGA + +11F17 +KAWI LETTER CA + +11F18 +KAWI LETTER CHA + +11F19 +KAWI LETTER JA + +11F1A +KAWI LETTER JHA + +11F1B +KAWI LETTER NYA + +11F1C +KAWI LETTER TTA + +11F1D +KAWI LETTER TTHA + +11F1E +KAWI LETTER DDA + +11F1F +KAWI LETTER DDHA + +11F20 +KAWI LETTER NNA + +11F21 +KAWI LETTER TA + +11F22 +KAWI LETTER THA + +11F23 +KAWI LETTER DA + +11F24 +KAWI LETTER DHA + +11F25 +KAWI LETTER NA + +11F26 +KAWI LETTER PA + +11F27 +KAWI LETTER PHA + +11F28 +KAWI LETTER BA + +11F29 +KAWI LETTER BHA + +11F2A +KAWI LETTER MA + +11F2B +KAWI LETTER YA + +11F2C +KAWI LETTER RA + +11F2D +KAWI LETTER LA + +11F2E +KAWI LETTER WA + +11F2F +KAWI LETTER SHA + +11F30 +KAWI LETTER SSA + +11F31 +KAWI LETTER SA + +11F32 +KAWI LETTER HA + +11F33 +KAWI LETTER JNYA + +11F34 +KAWI VOWEL SIGN AA + +11F35 +KAWI VOWEL SIGN ALTERNATE AA + +11F36 +KAWI VOWEL SIGN I + +11F37 +KAWI VOWEL SIGN II + +11F38 +KAWI VOWEL SIGN U + +11F39 +KAWI VOWEL SIGN UU + +11F3A +KAWI VOWEL SIGN VOCALIC R + +11F3E +KAWI VOWEL SIGN E + +11F3F +KAWI VOWEL SIGN AI + +11F40 +KAWI VOWEL SIGN EU + +11F41 +KAWI SIGN KILLER + +11F42 +KAWI CONJOINER + +11F43 +KAWI DANDA + +11F44 +KAWI DOUBLE DANDA + +11F45 +KAWI PUNCTUATION SECTION MARKER + +11F46 +KAWI PUNCTUATION ALTERNATE SECTION MARKER + +11F47 +KAWI PUNCTUATION FLOWER + +11F48 +KAWI PUNCTUATION SPACE FILLER + +11F49 +KAWI PUNCTUATION DOT + +11F4A +KAWI PUNCTUATION DOUBLE DOT + +11F4B +KAWI PUNCTUATION TRIPLE DOT + +11F4C +KAWI PUNCTUATION CIRCLE + +11F4D +KAWI PUNCTUATION FILLED CIRCLE + +11F4E +KAWI PUNCTUATION SPIRAL + +11F4F +KAWI PUNCTUATION CLOSING SPIRAL + +11F50 +KAWI DIGIT ZERO + +11F51 +KAWI DIGIT ONE + +11F52 +KAWI DIGIT TWO + +11F53 +KAWI DIGIT THREE + +11F54 +KAWI DIGIT FOUR + +11F55 +KAWI DIGIT FIVE + +11F56 +KAWI DIGIT SIX + +11F57 +KAWI DIGIT SEVEN + +11F58 +KAWI DIGIT EIGHT + +11F59 +KAWI DIGIT NINE + 11FB0 LISU LETTER YHA @@ -71167,6 +71488,9 @@ EGYPTIAN HIEROGLYPH AA031 1342E EGYPTIAN HIEROGLYPH AA032 +1342F +EGYPTIAN HIEROGLYPH V011D + 13430 EGYPTIAN HIEROGLYPH VERTICAL JOINER @@ -71194,6 +71518,93 @@ EGYPTIAN HIEROGLYPH BEGIN SEGMENT 13438 EGYPTIAN HIEROGLYPH END SEGMENT +13439 +EGYPTIAN HIEROGLYPH INSERT AT MIDDLE + +1343A +EGYPTIAN HIEROGLYPH INSERT AT TOP + +1343B +EGYPTIAN HIEROGLYPH INSERT AT BOTTOM + +1343C +EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE + +1343D +EGYPTIAN HIEROGLYPH END ENCLOSURE + +1343E +EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE + +1343F +EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE + +13440 +EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY + +13441 +EGYPTIAN HIEROGLYPH FULL BLANK + +13442 +EGYPTIAN HIEROGLYPH HALF BLANK + +13443 +EGYPTIAN HIEROGLYPH LOST SIGN + +13444 +EGYPTIAN HIEROGLYPH HALF LOST SIGN + +13445 +EGYPTIAN HIEROGLYPH TALL LOST SIGN + +13446 +EGYPTIAN HIEROGLYPH WIDE LOST SIGN + +13447 +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START + +13448 +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START + +13449 +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START + +1344A +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP END + +1344B +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP + +1344C +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START AND TOP END + +1344D +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND TOP + +1344E +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM END + +1344F +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START AND BOTTOM END + +13450 +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM + +13451 +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND BOTTOM + +13452 +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT END + +13453 +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP AND END + +13454 +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM AND END + +13455 +EGYPTIAN HIEROGLYPH MODIFIER DAMAGED + 14400 ANATOLIAN HIEROGLYPH A001 @@ -79507,6 +79918,9 @@ KATAKANA LETTER ARCHAIC YE 1B122 KATAKANA LETTER ARCHAIC WU +1B132 +HIRAGANA LETTER SMALL KO + 1B150 HIRAGANA LETTER SMALL WI @@ -79516,6 +79930,9 @@ HIRAGANA LETTER SMALL WE 1B152 HIRAGANA LETTER SMALL WO +1B155 +KATAKANA LETTER SMALL KO + 1B164 KATAKANA LETTER SMALL WI @@ -82174,6 +82591,66 @@ COMBINING GREEK MUSICAL PENTASEME 1D245 GREEK MUSICAL LEIMMA +1D2C0 +KAKTOVIK NUMERAL ZERO + +1D2C1 +KAKTOVIK NUMERAL ONE + +1D2C2 +KAKTOVIK NUMERAL TWO + +1D2C3 +KAKTOVIK NUMERAL THREE + +1D2C4 +KAKTOVIK NUMERAL FOUR + +1D2C5 +KAKTOVIK NUMERAL FIVE + +1D2C6 +KAKTOVIK NUMERAL SIX + +1D2C7 +KAKTOVIK NUMERAL SEVEN + +1D2C8 +KAKTOVIK NUMERAL EIGHT + +1D2C9 +KAKTOVIK NUMERAL NINE + +1D2CA +KAKTOVIK NUMERAL TEN + +1D2CB +KAKTOVIK NUMERAL ELEVEN + +1D2CC +KAKTOVIK NUMERAL TWELVE + +1D2CD +KAKTOVIK NUMERAL THIRTEEN + +1D2CE +KAKTOVIK NUMERAL FOURTEEN + +1D2CF +KAKTOVIK NUMERAL FIFTEEN + +1D2D0 +KAKTOVIK NUMERAL SIXTEEN + +1D2D1 +KAKTOVIK NUMERAL SEVENTEEN + +1D2D2 +KAKTOVIK NUMERAL EIGHTEEN + +1D2D3 +KAKTOVIK NUMERAL NINETEEN + 1D2E0 MAYAN NUMERAL ZERO @@ -87667,6 +88144,24 @@ LATIN SMALL LETTER C WITH RETROFLEX HOOK 1DF1E LATIN SMALL LETTER S WITH CURL +1DF25 +LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK + +1DF26 +LATIN SMALL LETTER L WITH MID-HEIGHT LEFT HOOK + +1DF27 +LATIN SMALL LETTER N WITH MID-HEIGHT LEFT HOOK + +1DF28 +LATIN SMALL LETTER R WITH MID-HEIGHT LEFT HOOK + +1DF29 +LATIN SMALL LETTER S WITH MID-HEIGHT LEFT HOOK + +1DF2A +LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK + 1E000 COMBINING GLAGOLITIC LETTER AZU @@ -87781,6 +88276,195 @@ COMBINING GLAGOLITIC LETTER IOTATED BIG 1E02A COMBINING GLAGOLITIC LETTER FITA +1E030 +MODIFIER LETTER CYRILLIC SMALL A + +1E031 +MODIFIER LETTER CYRILLIC SMALL BE + +1E032 +MODIFIER LETTER CYRILLIC SMALL VE + +1E033 +MODIFIER LETTER CYRILLIC SMALL GHE + +1E034 +MODIFIER LETTER CYRILLIC SMALL DE + +1E035 +MODIFIER LETTER CYRILLIC SMALL IE + +1E036 +MODIFIER LETTER CYRILLIC SMALL ZHE + +1E037 +MODIFIER LETTER CYRILLIC SMALL ZE + +1E038 +MODIFIER LETTER CYRILLIC SMALL I + +1E039 +MODIFIER LETTER CYRILLIC SMALL KA + +1E03A +MODIFIER LETTER CYRILLIC SMALL EL + +1E03B +MODIFIER LETTER CYRILLIC SMALL EM + +1E03C +MODIFIER LETTER CYRILLIC SMALL O + +1E03D +MODIFIER LETTER CYRILLIC SMALL PE + +1E03E +MODIFIER LETTER CYRILLIC SMALL ER + +1E03F +MODIFIER LETTER CYRILLIC SMALL ES + +1E040 +MODIFIER LETTER CYRILLIC SMALL TE + +1E041 +MODIFIER LETTER CYRILLIC SMALL U + +1E042 +MODIFIER LETTER CYRILLIC SMALL EF + +1E043 +MODIFIER LETTER CYRILLIC SMALL HA + +1E044 +MODIFIER LETTER CYRILLIC SMALL TSE + +1E045 +MODIFIER LETTER CYRILLIC SMALL CHE + +1E046 +MODIFIER LETTER CYRILLIC SMALL SHA + +1E047 +MODIFIER LETTER CYRILLIC SMALL YERU + +1E048 +MODIFIER LETTER CYRILLIC SMALL E + +1E049 +MODIFIER LETTER CYRILLIC SMALL YU + +1E04A +MODIFIER LETTER CYRILLIC SMALL DZZE + +1E04B +MODIFIER LETTER CYRILLIC SMALL SCHWA + +1E04C +MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I + +1E04D +MODIFIER LETTER CYRILLIC SMALL JE + +1E04E +MODIFIER LETTER CYRILLIC SMALL BARRED O + +1E04F +MODIFIER LETTER CYRILLIC SMALL STRAIGHT U + +1E050 +MODIFIER LETTER CYRILLIC SMALL PALOCHKA + +1E051 +CYRILLIC SUBSCRIPT SMALL LETTER A + +1E052 +CYRILLIC SUBSCRIPT SMALL LETTER BE + +1E053 +CYRILLIC SUBSCRIPT SMALL LETTER VE + +1E054 +CYRILLIC SUBSCRIPT SMALL LETTER GHE + +1E055 +CYRILLIC SUBSCRIPT SMALL LETTER DE + +1E056 +CYRILLIC SUBSCRIPT SMALL LETTER IE + +1E057 +CYRILLIC SUBSCRIPT SMALL LETTER ZHE + +1E058 +CYRILLIC SUBSCRIPT SMALL LETTER ZE + +1E059 +CYRILLIC SUBSCRIPT SMALL LETTER I + +1E05A +CYRILLIC SUBSCRIPT SMALL LETTER KA + +1E05B +CYRILLIC SUBSCRIPT SMALL LETTER EL + +1E05C +CYRILLIC SUBSCRIPT SMALL LETTER O + +1E05D +CYRILLIC SUBSCRIPT SMALL LETTER PE + +1E05E +CYRILLIC SUBSCRIPT SMALL LETTER ES + +1E05F +CYRILLIC SUBSCRIPT SMALL LETTER U + +1E060 +CYRILLIC SUBSCRIPT SMALL LETTER EF + +1E061 +CYRILLIC SUBSCRIPT SMALL LETTER HA + +1E062 +CYRILLIC SUBSCRIPT SMALL LETTER TSE + +1E063 +CYRILLIC SUBSCRIPT SMALL LETTER CHE + +1E064 +CYRILLIC SUBSCRIPT SMALL LETTER SHA + +1E065 +CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN + +1E066 +CYRILLIC SUBSCRIPT SMALL LETTER YERU + +1E067 +CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN + +1E068 +CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I + +1E069 +CYRILLIC SUBSCRIPT SMALL LETTER DZE + +1E06A +CYRILLIC SUBSCRIPT SMALL LETTER DZHE + +1E06B +MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER + +1E06C +MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER + +1E06D +MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE + +1E08F +COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 1E100 NYIAKENG PUACHUE HMONG LETTER MA @@ -88264,6 +88948,132 @@ WANCHO DIGIT NINE 1E2FF WANCHO NGUN SIGN +1E4D0 +NAG MUNDARI LETTER O + +1E4D1 +NAG MUNDARI LETTER OP + +1E4D2 +NAG MUNDARI LETTER OL + +1E4D3 +NAG MUNDARI LETTER OY + +1E4D4 +NAG MUNDARI LETTER ONG + +1E4D5 +NAG MUNDARI LETTER A + +1E4D6 +NAG MUNDARI LETTER AJ + +1E4D7 +NAG MUNDARI LETTER AB + +1E4D8 +NAG MUNDARI LETTER ANY + +1E4D9 +NAG MUNDARI LETTER AH + +1E4DA +NAG MUNDARI LETTER I + +1E4DB +NAG MUNDARI LETTER IS + +1E4DC +NAG MUNDARI LETTER IDD + +1E4DD +NAG MUNDARI LETTER IT + +1E4DE +NAG MUNDARI LETTER IH + +1E4DF +NAG MUNDARI LETTER U + +1E4E0 +NAG MUNDARI LETTER UC + +1E4E1 +NAG MUNDARI LETTER UD + +1E4E2 +NAG MUNDARI LETTER UK + +1E4E3 +NAG MUNDARI LETTER UR + +1E4E4 +NAG MUNDARI LETTER E + +1E4E5 +NAG MUNDARI LETTER ENN + +1E4E6 +NAG MUNDARI LETTER EG + +1E4E7 +NAG MUNDARI LETTER EM + +1E4E8 +NAG MUNDARI LETTER EN + +1E4E9 +NAG MUNDARI LETTER ETT + +1E4EA +NAG MUNDARI LETTER ELL + +1E4EB +NAG MUNDARI SIGN OJOD + +1E4EC +NAG MUNDARI SIGN MUHOR + +1E4ED +NAG MUNDARI SIGN TOYOR + +1E4EE +NAG MUNDARI SIGN IKIR + +1E4EF +NAG MUNDARI SIGN SUTUH + +1E4F0 +NAG MUNDARI DIGIT ZERO + +1E4F1 +NAG MUNDARI DIGIT ONE + +1E4F2 +NAG MUNDARI DIGIT TWO + +1E4F3 +NAG MUNDARI DIGIT THREE + +1E4F4 +NAG MUNDARI DIGIT FOUR + +1E4F5 +NAG MUNDARI DIGIT FIVE + +1E4F6 +NAG MUNDARI DIGIT SIX + +1E4F7 +NAG MUNDARI DIGIT SEVEN + +1E4F8 +NAG MUNDARI DIGIT EIGHT + +1E4F9 +NAG MUNDARI DIGIT NINE + 1E7E0 ETHIOPIC SYLLABLE HHYA @@ -94489,6 +95299,9 @@ HUT 1F6D7 ELEVATOR +1F6DC +WIRELESS + 1F6DD PLAYGROUND SLIDE @@ -94924,6 +95737,30 @@ ALCHEMICAL SYMBOL FOR HALF DRAM 1F773 ALCHEMICAL SYMBOL FOR HALF OUNCE +1F774 +LOT OF FORTUNE + +1F775 +OCCULTATION + +1F776 +LUNAR ECLIPSE + +1F77B +HAUMEA + +1F77C +MAKEMAKE + +1F77D +GONGGONG + +1F77E +QUAOAR + +1F77F +ORCUS + 1F780 BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE @@ -95191,6 +96028,9 @@ CIRCLED SQUARE 1F7D8 NEGATIVE CIRCLED SQUARE +1F7D9 +NINE POINTED WHITE STAR + 1F7E0 LARGE ORANGE CIRCLE @@ -96757,6 +97597,15 @@ SHORTS 1FA74 THONG SANDAL +1FA75 +LIGHT BLUE HEART + +1FA76 +GREY HEART + +1FA77 +PINK HEART + 1FA78 DROP OF BLOOD @@ -96793,6 +97642,12 @@ PINATA 1FA86 NESTING DOLLS +1FA87 +MARACAS + +1FA88 +FLUTE + 1FA90 RINGED PLANET @@ -96880,6 +97735,15 @@ LOW BATTERY 1FAAC HAMSA +1FAAD +FOLDING HAND FAN + +1FAAE +HAIR PICK + +1FAAF +KHANDA + 1FAB0 FLY @@ -96913,6 +97777,18 @@ EMPTY NEST 1FABA NEST WITH EGGS +1FABB +HYACINTH + +1FABC +JELLYFISH + +1FABD +WING + +1FABF +GOOSE + 1FAC0 ANATOMICAL HEART @@ -96931,6 +97807,12 @@ PREGNANT PERSON 1FAC5 PERSON WITH CROWN +1FACE +MOOSE + +1FACF +DONKEY + 1FAD0 BLUEBERRIES @@ -96961,6 +97843,12 @@ BEANS 1FAD9 JAR +1FADA +GINGER ROOT + +1FADB +PEA POD + 1FAE0 MELTING FACE @@ -96985,6 +97873,9 @@ BITING LIP 1FAE7 BUBBLES +1FAE8 +SHAKING FACE + 1FAF0 HAND WITH INDEX FINGER AND THUMB CROSSED @@ -97005,6 +97896,12 @@ INDEX POINTING AT THE VIEWER 1FAF6 HEART HANDS + +1FAF7 +LEFTWARDS PUSHING HAND + +1FAF8 +RIGHTWARDS PUSHING HAND 1FB00 BLOCK SEXTANT-1 Index: gnu/usr.bin/perl/lib/unicore/Name.pm =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/Name.pm,v diff -u -p -a -u -p -r1.8 Name.pm --- gnu/usr.bin/perl/lib/unicore/Name.pm 15 Feb 2023 01:39:49 -0000 1.8 +++ gnu/usr.bin/perl/lib/unicore/Name.pm 21 Feb 2024 15:47:02 -0000 @@ -1,6 +1,6 @@ # !!!!!!! DO NOT EDIT THIS FILE !!!!!!! # This file is machine-generated by lib/unicore/mktables from the Unicode -# database, Version 14.0.0. Any changes made here will be lost! +# database, Version 15.0.0. Any changes made here will be lost! # !!!!!!! INTERNAL PERL USE ONLY !!!!!!! @@ -10,10 +10,6 @@ # base. -=head1 NAME -- Internal generated file for use by charnames - -=cut - package charnames; @@ -59,11 +55,12 @@ package charnames; 19903, 40959, 173791, -177976, +177977, 178205, 183969, 191456, 201546, +205743, ], 'low' => [ @@ -75,6 +72,7 @@ package charnames; 178208, 183984, 196608, +201552, ], }, 'KHITAN SMALL SCRIPT CHARACTER' => @@ -149,11 +147,12 @@ package charnames; 19903, 40959, 173791, -177976, +177977, 178205, 183969, 191456, 201546, +205743, ], 'low' => [ @@ -165,6 +164,7 @@ package charnames; 178208, 183984, 196608, +201552, ], }, 'KHITANSMALLSCRIPTCHARACTER' => @@ -291,7 +291,7 @@ package charnames; 'name' => 'CJK UNIFIED IDEOGRAPH', }, { -'high' => 177976, +'high' => 177977, 'legal' => ' -0123456789ABCDEFGHIJKNOPRU', @@ -336,6 +336,14 @@ package charnames; ' -0123456789ABCDEFGHIJKNOPRU', 'low' => 196608, +'name' => 'CJK UNIFIED IDEOGRAPH', +}, +{ +'high' => 205743, +'legal' => +' + -0123456789ABCDEFGHIJKNOPRU', +'low' => 201552, 'name' => 'CJK UNIFIED IDEOGRAPH', }, , Index: gnu/usr.bin/perl/lib/unicore/NameAliases.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/NameAliases.txt,v diff -u -p -a -u -p -r1.6 NameAliases.txt --- gnu/usr.bin/perl/lib/unicore/NameAliases.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/NameAliases.txt 21 Feb 2024 15:47:02 -0000 @@ -1,10 +1,10 @@ -# NameAliases-14.0.0.txt -# Date: 2020-10-21, 22:28:00 GMT [KW, LI] -# © 2020 Unicode®, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# NameAliases-15.0.0.txt +# Date: 2022-07-26, 20:13:00 GMT [KW] +# © 2022 Unicode®, Inc. +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # This file is a normative contributory data file in the # Unicode Character Database. @@ -40,7 +40,7 @@ # control codes (which for historical reasons have no Unicode character name) # or for format characters. # -# For documentation, see NamesList.html and http://www.unicode.org/reports/tr44/ +# For documentation, see NamesList.html and https://www.unicode.org/reports/tr44/ # # FORMAT # @@ -135,6 +135,7 @@ 0018;CAN;abbreviation 0019;END OF MEDIUM;control 0019;EOM;abbreviation +0019;EM;abbreviation 001A;SUBSTITUTE;control 001A;SUB;abbreviation 001B;ESCAPE;control @@ -163,7 +164,7 @@ # (and corresponding abbreviations) for these code # points are included here because these names leaked # out from the draft documents and were published in -# at least one RFC whose names for code points was +# at least one RFC whose names for code points were # implemented in Perl regex expressions. 0080;PADDING CHARACTER;figment @@ -254,6 +255,7 @@ 01A2;LATIN CAPITAL LETTER GHA;correction 01A3;LATIN SMALL LETTER GHA;correction 034F;CGJ;abbreviation +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH YEH BARREE;correction 061C;ALM;abbreviation 0709;SYRIAC SUBLINEAR COLON SKEWED LEFT;correction 0CDE;KANNADA LETTER LLLA;correction @@ -271,6 +273,7 @@ 180D;FVS3;abbreviation 180E;MVS;abbreviation 180F;FVS4;abbreviation +1BBD;SUNDANESE LETTER ARCHAIC I;correction 200B;ZWSP;abbreviation 200C;ZWNJ;abbreviation 200D;ZWJ;abbreviation Index: gnu/usr.bin/perl/lib/unicore/NamedSequences.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/NamedSequences.txt,v diff -u -p -a -u -p -r1.6 NamedSequences.txt --- gnu/usr.bin/perl/lib/unicore/NamedSequences.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/NamedSequences.txt 21 Feb 2024 15:47:02 -0000 @@ -1,5 +1,5 @@ -# NamedSequences-14.0.0.txt -# Date: 2021-08-03, 23:04:00 GMT [KW] +# NamedSequences-15.0.0.txt +# Date: 2021-12-07, 17:18:00 GMT [KW] # © 2021 Unicode®, Inc. # For terms of use, see https://www.unicode.org/terms_of_use.html # Index: gnu/usr.bin/perl/lib/unicore/NamedSqProv.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/NamedSqProv.txt,v diff -u -p -a -u -p -r1.6 NamedSqProv.txt --- gnu/usr.bin/perl/lib/unicore/NamedSqProv.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/NamedSqProv.txt 21 Feb 2024 15:47:02 -0000 @@ -1,5 +1,5 @@ -# NamedSequencesProv-14.0.0.txt -# Date: 2021-08-03, 23:04:00 GMT [KW] +# NamedSequencesProv-15.0.0.txt +# Date: 2021-12-07, 17:17:00 GMT [KW] # © 2021 Unicode®, Inc. # For terms of use, see https://www.unicode.org/terms_of_use.html # Index: gnu/usr.bin/perl/lib/unicore/NamesList.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/NamesList.txt,v diff -u -p -a -u -p -r1.6 NamesList.txt --- gnu/usr.bin/perl/lib/unicore/NamesList.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/NamesList.txt 21 Feb 2024 15:47:02 -0000 @@ -1,14 +1,14 @@ ; charset=UTF-8 -@@@ The Unicode Standard 14.0.0 -@@@+ U14M210804.lst - Unicode 14.0.0 final names list. +@@@ The Unicode Standard 15.0.0 +@@@+ U15M220815.lst + Unicode 15.0.0 final names list. This file is semi-automatically derived from UnicodeData.txt and a set of manually created annotations using a script to select or suppress information from the data file. The rules used for this process are aimed at readability for the human reader, at the expense of some details; therefore, this file should not be parsed for machine-readable information. -@+ © 2021 Unicode®, Inc. +@+ © 2022 Unicode®, Inc. For terms of use, see https://www.unicode.org/terms_of_use.html @@ 0000 C0 Controls and Basic Latin (Basic Latin) 007F @@+ @@ -238,7 +238,7 @@ x (stenographic full stop - 2E3C) x (ideographic full stop - 3002) 002F SOLIDUS - = slash,forward slash, virgule + = slash, forward slash, virgule x (combining long solidus overlay - 0338) x (fraction slash - 2044) x (division slash - 2215) @@ -3558,7 +3558,7 @@ @+ These are obsolete letters attested in a 19th century grammar of Komi. 052A CYRILLIC CAPITAL LETTER DZZHE 052B CYRILLIC SMALL LETTER DZZHE - * also used for Ossetian until 1924 +@+ * also used for Ossetian until 1924 052C CYRILLIC CAPITAL LETTER DCHE 052D CYRILLIC SMALL LETTER DCHE @ Khanty letters @@ -3885,6 +3885,7 @@ * should not be confused with the small TAH sign used as a diacritic for some letters such as 0679 @ Extended Arabic mark 0616 ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH + % ARABIC SMALL HIGH LIGATURE ALEF WITH YEH BARREE * early Persian @ Quranic annotation signs 0617 ARABIC SMALL HIGH ZAIN @@ -4069,14 +4070,18 @@ * Kazakh, Jawi * forms digraphs @ Digraphic letters for Kazakh -@+ Use of these characters is discouraged. They were encoded for Kazakh digraphs, but their decompositions do not reflect the preferred order of representation. +@+ These characters were encoded for Kazakh digraphs, but their compatibility decompositions do not reflect the preferred order of representation. Accordingly, the representation of these Kazakh digraphs should instead use the preferred two-character spellings with the correct order of elements. 0675 ARABIC LETTER HIGH HAMZA ALEF + * preferred spelling is 0674 0627 # 0627 0674 0676 ARABIC LETTER HIGH HAMZA WAW + * preferred spelling is 0674 0648 # 0648 0674 0677 ARABIC LETTER U WITH HAMZA ABOVE + * preferred spelling is 0674 06C7 # 06C7 0674 0678 ARABIC LETTER HIGH HAMZA YEH + * preferred spelling is 0674 0649 # 064A 0674 @ Extended Arabic letters 0679 ARABIC LETTER TTEH @@ -4195,7 +4200,7 @@ * Uyghur, Kazakh, Moroccan Arabic, early Jawi, early Persian, ... 06AE ARABIC LETTER KAF WITH THREE DOTS BELOW * Berber, early Persian - * Pegon alternative for 068A + * Pegon alternative for 08B4 06AF ARABIC LETTER GAF * Persian, Urdu, ... 06B0 ARABIC LETTER GAF WITH RING @@ -5009,6 +5014,7 @@ 08DB ARABIC SMALL HIGH WORD AS-SAJDA 08DC ARABIC SMALL HIGH WORD AN-NISF 08DD ARABIC SMALL HIGH WORD SAKTA + x (arabic small low word sakta - 10EFD) 08DE ARABIC SMALL HIGH WORD QIF 08DF ARABIC SMALL HIGH WORD WAQFA 08E0 ARABIC SMALL HIGH FOOTNOTE MARKER @@ -6087,6 +6093,7 @@ 0C80 KANNADA SIGN SPACING CANDRABINDU 0C81 KANNADA SIGN CANDRABINDU 0C82 KANNADA SIGN ANUSVARA + * used in Konkani, Havyaka Kannada (Havigannada) and Awadhi texts to indicate regular anusvara 0C83 KANNADA SIGN VISARGA 0C84 KANNADA SIGN SIDDHAM = siddhirastu @@ -6209,6 +6216,8 @@ x (vedic sign jihvamuliya - 1CF5) 0CF2 KANNADA SIGN UPADHMANIYA x (vedic sign upadhmaniya - 1CF6) +0CF3 KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT + * used in Konkani, Havyaka Kannada (Havigannada) and Awadhi texts to indicate anunāsikā @@ 0D00 Malayalam 0D7F @ Various signs 0D00 MALAYALAM SIGN COMBINING ANUSVARA ABOVE @@ -6715,6 +6724,7 @@ = nikkhahit * final nasal 0E4E THAI CHARACTER YAMAKKAN + x (lao yamakkan - 0ECE) 0E4F THAI CHARACTER FONGMAN * used as a bullet x (khmer sign phnaek muan - 17D9) @@ -6858,6 +6868,9 @@ 0ECC LAO CANCELLATION MARK 0ECD LAO NIGGAHITA * final nasal or long o vowel +0ECE LAO YAMAKKAN + * marks a consonant that is simultaneously a part of two consonant clusters in Pali text + x (thai character yamakkan - 0E4E) @ Digits 0ED0 LAO DIGIT ZERO 0ED1 LAO DIGIT ONE @@ -10130,18 +10143,22 @@ 19AA NEW TAI LUE LETTER HIGH SUA 19AB NEW TAI LUE LETTER LOW SUA * a labialized consonant cluster -@ Vowel signs +@ Vowels 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 + * precedes consonant in visual order 19B6 NEW TAI LUE VOWEL SIGN AE + * precedes consonant in visual order 19B7 NEW TAI LUE VOWEL SIGN O + * precedes consonant in visual order 19B8 NEW TAI LUE VOWEL SIGN OA 19B9 NEW TAI LUE VOWEL SIGN UE 19BA NEW TAI LUE VOWEL SIGN AY + * precedes consonant in visual order 19BB NEW TAI LUE VOWEL SIGN AAY 19BC NEW TAI LUE VOWEL SIGN UY 19BD NEW TAI LUE VOWEL SIGN OY @@ -10771,14 +10788,19 @@ 1BB9 SUNDANESE DIGIT NINE @ Sign 1BBA SUNDANESE AVAGRAHA + = gemination mark @ Historic letters 1BBB SUNDANESE LETTER REU * vocalic r 1BBC SUNDANESE LETTER LEU * vocalic l 1BBD SUNDANESE LETTER BHA + % SUNDANESE LETTER ARCHAIC I + * character was originally misidentified, so its name is a misnomer 1BBE SUNDANESE LETTER FINAL K 1BBF SUNDANESE LETTER FINAL M + * used in a 21st century document + * for actual final m, use the sequence 1B99 1BAA @@ 1BC0 Batak 1BFF @ Letters @+ Annotations for letters indicate different usage among the various alphabets sharing the Batak script. @@ -13002,7 +13024,7 @@ x (asterisk - 002A) x (combining asterisk below - 0359) 204F REVERSED SEMICOLON - * also used in Sindhi + * used occasionally in Sindhi when Sindhi is written in the Arabic script x (semicolon - 003B) x (arabic semicolon - 061B) 2050 CLOSE UP @@ -13357,6 +13379,9 @@ 20E6 COMBINING DOUBLE VERTICAL STROKE OVERLAY = z notation finite function diacritic x (double vertical line - 2016) + x (rightwards arrow with double vertical stroke - 21FB) + x (rightwards two-headed arrow with double vertical stroke - 2901) + x (rightwards arrow with tail with double vertical stroke - 2915) 20E7 COMBINING ANNUITY SYMBOL = actuarial bend x (right ceiling - 2309) @@ -13387,7 +13412,7 @@ = the set of complex numbers # 0043 latin capital letter c 2103 DEGREE CELSIUS - = degrees Centigrade + = degrees centigrade # 00B0 0043 2104 CENTRE LINE SYMBOL = clone @@ -14330,6 +14355,7 @@ x (circled crossing lanes - 26D2) x (n-ary circled times operator - 2A02) x (circled x - 2BBE) + x (lot of fortune - 1F774) ~ 2297 FE00 with white rim 2298 CIRCLED DIVISION SLASH 2299 CIRCLED DOT OPERATOR @@ -14607,7 +14633,7 @@ 231B HOURGLASS = alchemical symbol for hour @ Quine corners -@+ These form a set of four quine corners, for quincuncial arrangement. They are also used in upper and lower pairs in mathematic, or more rarely in editorial usage as alternatives to half brackets. +@+ These form a set of four quine corners, for quincuncial arrangement. They are also used in upper and lower pairs in mathematics, or more rarely in editorial usage as alternatives to half brackets. 231C TOP LEFT CORNER x (right angle substitution marker - 2E00) x (top left half bracket - 2E22) @@ -15876,7 +15902,9 @@ x (alchemical symbol for purify - 1F763) 260C CONJUNCTION = alchemical symbol for day + x (occultation - 1F775) 260D OPPOSITION + x (lunar eclipse - 1F776) @ Miscellaneous symbols 260E BLACK TELEPHONE x (telephone sign - 2121) @@ -15962,6 +15990,7 @@ 262C ADI SHAKTI = khanda * Sikh religious symbol + x (khanda - 1FAAF) 262D HAMMER AND SICKLE 262E PEACE SYMBOL 262F YIN YANG @@ -16240,7 +16269,7 @@ = heterosexuality 26A5 MALE AND FEMALE SIGN = intersex, androgynous - = hermaphrodite (in entomology) + = hermaphroditic (in botany) 26A6 MALE WITH STROKE SIGN = transgender = alchemical symbol for iron or crocus of iron @@ -19288,7 +19317,8 @@ x (modifier letter short equals sign - A78A) @ Reversed punctuation 2E41 REVERSED COMMA - * also used in Sindhi + * Old Hungarian + * used occasionally in Sindhi when Sindhi is written in the Arabic script x (comma - 002C) x (arabic comma - 060C) 2E42 DOUBLE LOW-REVERSED-9 QUOTATION MARK @@ -19325,7 +19355,7 @@ x (paragraphos - 2E0F) x (capitulum - 2E3F) 2E4E PUNCTUS ELEVATUS MARK -@+ This mark indicates a major intermediate pause where the sensus is complete but the sentence is not; this is similar in some regards to the modern use of a semicolon. +@+ * This mark indicates a major intermediate pause where the sensus is complete but the sentence is not; this is similar in some regards to the modern use of a semicolon. 2E4F CORNISH VERSE DIVIDER 2E50 CROSS PATTY WITH RIGHT CROSSBAR x (maltese cross - 2720) @@ -19414,7 +19444,9 @@ 2E94 CJK RADICAL SNOUT ONE x 5F51 2E95 CJK RADICAL SNOUT TWO + * actually a form of the radical for hand, despite its resemblance in shape to the radical for snout x 5F50 + x 2B739 2E96 CJK RADICAL HEART ONE * form used on left side x 5FC4 @@ -22067,6 +22099,7 @@ 33D6 SQUARE MOL # 006D 006F 006C 33D7 SQUARE PH + * casing inconsistency in the compatibility decomposition is a known anomaly dating from glyph presentations in very early versions of the standard # 0050 0048 33D8 SQUARE PM # 0070 002E 006D 002E @@ -24914,11 +24947,13 @@ A91E KAYAH LI LETTER THA A91F KAYAH LI LETTER HA A920 KAYAH LI LETTER VA A921 KAYAH LI LETTER CA +@ Vowels A922 KAYAH LI LETTER A + * serves as a vowel carrier for vowels indicated with combining marks A923 KAYAH LI LETTER OE + * also serves as a vowel carrier A924 KAYAH LI LETTER I A925 KAYAH LI LETTER OO -@ Vowels A926 KAYAH LI VOWEL UE A927 KAYAH LI VOWEL E A928 KAYAH LI VOWEL U @@ -25517,6 +25552,7 @@ AB2E ETHIOPIC SYLLABLE BBO @@ AB30 Latin Extended-E AB6F @ Letters for German dialectology AB30 LATIN SMALL LETTER BARRED ALPHA +@+ * This letter is a Latin alpha with a horizontal strikethrough bar. In some font designs, the bar might not extend beyond the edge of the letter, and in such cases, the letter should not be confused with a ligature of epsilon and iota. AB31 LATIN SMALL LETTER A REVERSED-SCHWA AB32 LATIN SMALL LETTER BLACKLETTER E AB33 LATIN SMALL LETTER BARRED E @@ -32300,6 +32336,7 @@ FFFF 10C47 OLD TURKIC LETTER ORKHON OT 10C48 OLD TURKIC LETTER ORKHON BASH @@ 10C80 Old Hungarian 10CFF +@+ This script has contemporary usage in Hungary, where users often prefer the name Szekely-Hungarian Rovas. @ Uppercase letters @+ The use of uppercase letters is a modern innovation. 10C80 OLD HUNGARIAN CAPITAL LETTER A @@ -32487,6 +32524,7 @@ FFFF * in earlier literature called "tprus" (later recognized as an abbreviation for "temperius") 10CF2 OLD HUNGARIAN SMALL LETTER US @ Numbers +@+ The numbers for one, five, and ten have a clear relationship to Roman numerals. 10CFA OLD HUNGARIAN NUMBER ONE 10CFB OLD HUNGARIAN NUMBER FIVE 10CFC OLD HUNGARIAN NUMBER TEN @@ -32652,6 +32690,12 @@ FFFF @ Historical letters with diacritics 10EB0 YEZIDI LETTER LAM WITH DOT ABOVE 10EB1 YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +@@ 10EC0 Arabic Extended-C 10EFF +@ Quranic marks used in Turkey +10EFD ARABIC SMALL LOW WORD SAKTA + x (arabic small high word sakta - 08DD) +10EFE ARABIC SMALL LOW WORD QASR +10EFF ARABIC SMALL LOW WORD MADDA @@ 10F00 Old Sogdian 10F2F @+ This block unifies the scripts used in the Ancient Letters and the Kultobe and Upper Indus inscriptions. @ Letters @@ -33465,6 +33509,12 @@ FFFF @ Sign 1123E KHOJKI SIGN SUKUN * used for Arabic transliteration +@ Consonant +1123F KHOJKI LETTER QA +@ Independent vowel +11240 KHOJKI LETTER SHORT I +@ Dependent vowel sign +11241 KHOJKI VOWEL SIGN VOCALIC R @@ 11280 Multani 112AF @ Vowels 11280 MULTANI LETTER A @@ -34956,6 +35006,22 @@ FFFF 11AF6 PAU CIN HAU LOW-FALLING TONE LONG FINAL 11AF7 PAU CIN HAU LOW-FALLING TONE FINAL 11AF8 PAU CIN HAU GLOTTAL STOP FINAL +@@ 11B00 Devanagari Extended-A 11B5F +@ Head marks +11B00 DEVANAGARI HEAD MARK + x (devanagari double danda - 0965) +11B01 DEVANAGARI HEAD MARK WITH HEADSTROKE +@ Auspicious signs +@+ These are used for representing bhale mīndu signs. +11B02 DEVANAGARI SIGN BHALE +11B03 DEVANAGARI SIGN BHALE WITH HOOK +11B04 DEVANAGARI SIGN EXTENDED BHALE +11B05 DEVANAGARI SIGN EXTENDED BHALE WITH HOOK +11B06 DEVANAGARI SIGN WESTERN FIVE-LIKE BHALE +11B07 DEVANAGARI SIGN WESTERN NINE-LIKE BHALE +11B08 DEVANAGARI SIGN REVERSED NINE-LIKE BHALE +11B09 DEVANAGARI SIGN MINDU + x (devanagari digit zero - 0966) @@ 11C00 Bhaiksuki 11C6F @ Independent vowels 11C00 BHAIKSUKI LETTER A @@ -35330,6 +35396,106 @@ FFFF @ Punctuation 11EF7 MAKASAR PASSIMBANG 11EF8 MAKASAR END OF SECTION +@@ 11F00 Kawi 11F5F +@ Signs +11F00 KAWI SIGN CANDRABINDU +11F01 KAWI SIGN ANUSVARA +11F02 KAWI SIGN REPHA + * cluster-initial form of 11F2C + * also used as final r +11F03 KAWI SIGN VISARGA +@ Independent vowels +11F04 KAWI LETTER A +11F05 KAWI LETTER AA +11F06 KAWI LETTER I +11F07 KAWI LETTER II +11F08 KAWI LETTER U +11F09 KAWI LETTER UU +11F0A KAWI LETTER VOCALIC R +11F0B KAWI LETTER VOCALIC RR +11F0C KAWI LETTER VOCALIC L +11F0D KAWI LETTER VOCALIC LL +11F0E KAWI LETTER E +11F0F KAWI LETTER AI +11F10 KAWI LETTER O +@ Consonants +11F12 KAWI LETTER KA +11F13 KAWI LETTER KHA +11F14 KAWI LETTER GA +11F15 KAWI LETTER GHA +11F16 KAWI LETTER NGA +11F17 KAWI LETTER CA +11F18 KAWI LETTER CHA +11F19 KAWI LETTER JA +11F1A KAWI LETTER JHA +11F1B KAWI LETTER NYA +11F1C KAWI LETTER TTA +11F1D KAWI LETTER TTHA +11F1E KAWI LETTER DDA +11F1F KAWI LETTER DDHA +11F20 KAWI LETTER NNA +11F21 KAWI LETTER TA +11F22 KAWI LETTER THA +11F23 KAWI LETTER DA +11F24 KAWI LETTER DHA +11F25 KAWI LETTER NA +11F26 KAWI LETTER PA +11F27 KAWI LETTER PHA +11F28 KAWI LETTER BA +11F29 KAWI LETTER BHA +11F2A KAWI LETTER MA +11F2B KAWI LETTER YA +11F2C KAWI LETTER RA +11F2D KAWI LETTER LA +11F2E KAWI LETTER WA +11F2F KAWI LETTER SHA +11F30 KAWI LETTER SSA +11F31 KAWI LETTER SA +11F32 KAWI LETTER HA +11F33 KAWI LETTER JNYA +@ Dependent vowel signs +11F34 KAWI VOWEL SIGN AA +11F35 KAWI VOWEL SIGN ALTERNATE AA +11F36 KAWI VOWEL SIGN I +11F37 KAWI VOWEL SIGN II +11F38 KAWI VOWEL SIGN U +11F39 KAWI VOWEL SIGN UU +11F3A KAWI VOWEL SIGN VOCALIC R +11F3E KAWI VOWEL SIGN E +11F3F KAWI VOWEL SIGN AI +11F40 KAWI VOWEL SIGN EU + * represents schwa [ə] +@ Viramas +11F41 KAWI SIGN KILLER + * vowel killer, always rendered visibly +11F42 KAWI CONJOINER + * used for producing below-base and post-base conjunct forms +@ Punctuation +11F43 KAWI DANDA +11F44 KAWI DOUBLE DANDA +11F45 KAWI PUNCTUATION SECTION MARKER +11F46 KAWI PUNCTUATION ALTERNATE SECTION MARKER +11F47 KAWI PUNCTUATION FLOWER +11F48 KAWI PUNCTUATION SPACE FILLER +11F49 KAWI PUNCTUATION DOT +11F4A KAWI PUNCTUATION DOUBLE DOT +11F4B KAWI PUNCTUATION TRIPLE DOT +11F4C KAWI PUNCTUATION CIRCLE +11F4D KAWI PUNCTUATION FILLED CIRCLE +11F4E KAWI PUNCTUATION SPIRAL +11F4F KAWI PUNCTUATION CLOSING SPIRAL +@ Digits +11F50 KAWI DIGIT ZERO +11F51 KAWI DIGIT ONE +11F52 KAWI DIGIT TWO + * also used as letter ro +11F53 KAWI DIGIT THREE +11F54 KAWI DIGIT FOUR +11F55 KAWI DIGIT FIVE +11F56 KAWI DIGIT SIX +11F57 KAWI DIGIT SEVEN +11F58 KAWI DIGIT EIGHT +11F59 KAWI DIGIT NINE @@ 11FB0 Lisu Supplement 11FBF @ Letter 11FB0 LISU LETTER YHA @@ -36988,8 +37154,11 @@ FFFF 1308F EGYPTIAN HIEROGLYPH D025 13090 EGYPTIAN HIEROGLYPH D026 13091 EGYPTIAN HIEROGLYPH D027 + ~ 13091 FE00 rotated 90 degrees 13092 EGYPTIAN HIEROGLYPH D027A + ~ 13092 FE00 rotated 90 degrees 13093 EGYPTIAN HIEROGLYPH D028 + ~ 13093 FE01 rotated 180 degrees 13094 EGYPTIAN HIEROGLYPH D029 13095 EGYPTIAN HIEROGLYPH D030 13096 EGYPTIAN HIEROGLYPH D031 @@ -37016,6 +37185,7 @@ FFFF * transliterated as d 130A8 EGYPTIAN HIEROGLYPH D046A 130A9 EGYPTIAN HIEROGLYPH D047 + ~ 130A9 FE01 rotated 180 degrees 130AA EGYPTIAN HIEROGLYPH D048 130AB EGYPTIAN HIEROGLYPH D048A 130AC EGYPTIAN HIEROGLYPH D049 @@ -37154,6 +37324,7 @@ FFFF 1310D EGYPTIAN HIEROGLYPH F014 1310E EGYPTIAN HIEROGLYPH F015 1310F EGYPTIAN HIEROGLYPH F016 + ~ 1310F FE00 rotated 90 degrees 13110 EGYPTIAN HIEROGLYPH F017 13111 EGYPTIAN HIEROGLYPH F018 13112 EGYPTIAN HIEROGLYPH F019 @@ -37163,12 +37334,14 @@ FFFF * from hieratic 13116 EGYPTIAN HIEROGLYPH F022 13117 EGYPTIAN HIEROGLYPH F023 + ~ 13117 FE02 rotated 270 degrees 13118 EGYPTIAN HIEROGLYPH F024 * mirrored version of 13117 13119 EGYPTIAN HIEROGLYPH F025 1311A EGYPTIAN HIEROGLYPH F026 1311B EGYPTIAN HIEROGLYPH F027 1311C EGYPTIAN HIEROGLYPH F028 + ~ 1311C FE00 rotated 90 degrees 1311D EGYPTIAN HIEROGLYPH F029 1311E EGYPTIAN HIEROGLYPH F030 1311F EGYPTIAN HIEROGLYPH F031 @@ -37176,12 +37349,14 @@ FFFF * cursive variant of 1311F 13121 EGYPTIAN HIEROGLYPH F032 * transliterated as 1E96 + ~ 13121 FE00 rotated 90 degrees 13122 EGYPTIAN HIEROGLYPH F033 13123 EGYPTIAN HIEROGLYPH F034 13124 EGYPTIAN HIEROGLYPH F035 13125 EGYPTIAN HIEROGLYPH F036 13126 EGYPTIAN HIEROGLYPH F037 13127 EGYPTIAN HIEROGLYPH F037A + ~ 13127 FE00 rotated 90 degrees 13128 EGYPTIAN HIEROGLYPH F038 13129 EGYPTIAN HIEROGLYPH F038A 1312A EGYPTIAN HIEROGLYPH F039 @@ -37204,6 +37379,8 @@ FFFF * mirrored version of 13136 13138 EGYPTIAN HIEROGLYPH F050 13139 EGYPTIAN HIEROGLYPH F051 + ~ 13139 FE00 rotated 90 degrees + ~ 13139 FE02 rotated 270 degrees 1313A EGYPTIAN HIEROGLYPH F051A 1313B EGYPTIAN HIEROGLYPH F051B * variant of 1313A @@ -37295,11 +37472,13 @@ FFFF 13181 EGYPTIAN HIEROGLYPH H003 13182 EGYPTIAN HIEROGLYPH H004 13183 EGYPTIAN HIEROGLYPH H005 + ~ 13183 FE02 rotated 270 degrees 13184 EGYPTIAN HIEROGLYPH H006 13185 EGYPTIAN HIEROGLYPH H006A * from hieratic 13186 EGYPTIAN HIEROGLYPH H007 13187 EGYPTIAN HIEROGLYPH H008 + ~ 13187 FE01 rotated 180 degrees @ I. Amphibious animals, reptiles, etc. 13188 EGYPTIAN HIEROGLYPH I001 13189 EGYPTIAN HIEROGLYPH I002 @@ -37330,6 +37509,8 @@ FFFF 1319E EGYPTIAN HIEROGLYPH K004 1319F EGYPTIAN HIEROGLYPH K005 131A0 EGYPTIAN HIEROGLYPH K006 + ~ 131A0 FE00 rotated 90 degrees + ~ 131A0 FE02 rotated 270 degrees 131A1 EGYPTIAN HIEROGLYPH K007 131A2 EGYPTIAN HIEROGLYPH K008 @ L. Invertebrata and lesser animals @@ -37350,6 +37531,8 @@ FFFF 131AF EGYPTIAN HIEROGLYPH M001B 131B0 EGYPTIAN HIEROGLYPH M002 131B1 EGYPTIAN HIEROGLYPH M003 + ~ 131B1 FE00 rotated 90 degrees + ~ 131B1 FE01 rotated 180 degrees 131B2 EGYPTIAN HIEROGLYPH M003A 131B3 EGYPTIAN HIEROGLYPH M004 131B4 EGYPTIAN HIEROGLYPH M005 @@ -37357,8 +37540,11 @@ FFFF 131B6 EGYPTIAN HIEROGLYPH M007 131B7 EGYPTIAN HIEROGLYPH M008 131B8 EGYPTIAN HIEROGLYPH M009 + ~ 131B8 FE00 rotated 90 degrees 131B9 EGYPTIAN HIEROGLYPH M010 + ~ 131B9 FE00 rotated 90 degrees 131BA EGYPTIAN HIEROGLYPH M010A + ~ 131BA FE02 rotated 270 degrees 131BB EGYPTIAN HIEROGLYPH M011 131BC EGYPTIAN HIEROGLYPH M012 * 1,000 @@ -37389,6 +37575,7 @@ FFFF * transliterated as A7BD x (hebrew letter yod - 05D9) x (arabic letter yeh - 064A) + ~ 131CB FE00 rotated 90 degrees 131CC EGYPTIAN HIEROGLYPH M017A * phonogram 'y' x (egyptian hieroglyph z004 - 133ED) @@ -37435,6 +37622,8 @@ FFFF 131EE EGYPTIAN HIEROGLYPH M044 * thorn * not to be confused with 133DA + ~ 131EE FE01 rotated 180 degrees + ~ 131EE FE02 rotated 270 degrees @ N. Sky, earth, water 131EF EGYPTIAN HIEROGLYPH N001 131F0 EGYPTIAN HIEROGLYPH N002 @@ -37451,8 +37640,13 @@ FFFF * variant of 131F8 131F8 EGYPTIAN HIEROGLYPH N010 * variant of 131F7 + ~ 131F8 FE01 rotated 180 degrees 131F9 EGYPTIAN HIEROGLYPH N011 + ~ 131F9 FE00 rotated 90 degrees + ~ 131F9 FE01 rotated 180 degrees 131FA EGYPTIAN HIEROGLYPH N012 + ~ 131FA FE00 rotated 90 degrees + ~ 131FA FE01 rotated 180 degrees 131FB EGYPTIAN HIEROGLYPH N013 131FC EGYPTIAN HIEROGLYPH N014 131FD EGYPTIAN HIEROGLYPH N015 @@ -37498,6 +37692,7 @@ FFFF * stylistic variant, use of 13214 is preferred 13216 EGYPTIAN HIEROGLYPH N035 * transliterated as n + ~ 13216 FE02 rotated 270 degrees 13217 EGYPTIAN HIEROGLYPH N035A * classifier 'liquid' 13218 EGYPTIAN HIEROGLYPH N036 @@ -37578,6 +37773,7 @@ FFFF 13256 EGYPTIAN HIEROGLYPH O005A * mirrored version of 13255 13257 EGYPTIAN HIEROGLYPH O006 + ~ 13257 FE01 rotated 180 degrees 13258 EGYPTIAN HIEROGLYPH O006A * beginning of hwt or serekh enclosure x (egyptian hieroglyph o033a - 13282) @@ -37621,6 +37817,7 @@ FFFF 13279 EGYPTIAN HIEROGLYPH O027 1327A EGYPTIAN HIEROGLYPH O028 1327B EGYPTIAN HIEROGLYPH O029 + ~ 1327B FE02 rotated 270 degrees 1327C EGYPTIAN HIEROGLYPH O029A * rotated variant of 1327B 1327D EGYPTIAN HIEROGLYPH O030 @@ -37628,6 +37825,8 @@ FFFF * not to be confused with 13361 1327E EGYPTIAN HIEROGLYPH O030A 1327F EGYPTIAN HIEROGLYPH O031 + ~ 1327F FE00 rotated 90 degrees + ~ 1327F FE01 rotated 180 degrees 13280 EGYPTIAN HIEROGLYPH O032 13281 EGYPTIAN HIEROGLYPH O033 * classifier 'serekh' @@ -37639,6 +37838,7 @@ FFFF x (egyptian hieroglyph s029 - 132F4) 13284 EGYPTIAN HIEROGLYPH O035 13285 EGYPTIAN HIEROGLYPH O036 + ~ 13285 FE00 rotated 90 degrees 13286 EGYPTIAN HIEROGLYPH O036A * beginning of fortified wall cartouche 13287 EGYPTIAN HIEROGLYPH O036B @@ -37652,6 +37852,7 @@ FFFF 1328C EGYPTIAN HIEROGLYPH O039 * stone, brick * not to be confused with 13219 + ~ 1328C FE00 rotated 90 degrees 1328D EGYPTIAN HIEROGLYPH O040 1328E EGYPTIAN HIEROGLYPH O041 1328F EGYPTIAN HIEROGLYPH O042 @@ -37683,6 +37884,8 @@ FFFF 132A2 EGYPTIAN HIEROGLYPH P006 132A3 EGYPTIAN HIEROGLYPH P007 132A4 EGYPTIAN HIEROGLYPH P008 + ~ 132A4 FE01 rotated 180 degrees + ~ 132A4 FE02 rotated 270 degrees 132A5 EGYPTIAN HIEROGLYPH P009 132A6 EGYPTIAN HIEROGLYPH P010 132A7 EGYPTIAN HIEROGLYPH P011 @@ -37693,6 +37896,7 @@ FFFF 132A9 EGYPTIAN HIEROGLYPH Q002 132AA EGYPTIAN HIEROGLYPH Q003 * transliterated as p + ~ 132AA FE00 rotated 90 degrees 132AB EGYPTIAN HIEROGLYPH Q004 132AC EGYPTIAN HIEROGLYPH Q005 132AD EGYPTIAN HIEROGLYPH Q006 @@ -37727,6 +37931,7 @@ FFFF 132C9 EGYPTIAN HIEROGLYPH R022 132CA EGYPTIAN HIEROGLYPH R023 132CB EGYPTIAN HIEROGLYPH R024 + ~ 132CB FE00 rotated 90 degrees 132CC EGYPTIAN HIEROGLYPH R025 132CD EGYPTIAN HIEROGLYPH R026 132CE EGYPTIAN HIEROGLYPH R027 @@ -37745,6 +37950,7 @@ FFFF 132DA EGYPTIAN HIEROGLYPH S008 132DB EGYPTIAN HIEROGLYPH S009 132DC EGYPTIAN HIEROGLYPH S010 + ~ 132DC FE00 rotated 90 degrees 132DD EGYPTIAN HIEROGLYPH S011 132DE EGYPTIAN HIEROGLYPH S012 132DF EGYPTIAN HIEROGLYPH S013 @@ -37756,8 +37962,11 @@ FFFF 132E5 EGYPTIAN HIEROGLYPH S017 132E6 EGYPTIAN HIEROGLYPH S017A 132E7 EGYPTIAN HIEROGLYPH S018 + ~ 132E7 FE00 rotated 90 degrees + ~ 132E7 FE02 rotated 270 degrees 132E8 EGYPTIAN HIEROGLYPH S019 132E9 EGYPTIAN HIEROGLYPH S020 + ~ 132E9 FE02 rotated 270 degrees 132EA EGYPTIAN HIEROGLYPH S021 132EB EGYPTIAN HIEROGLYPH S022 132EC EGYPTIAN HIEROGLYPH S023 @@ -37777,6 +37986,7 @@ FFFF 132F6 EGYPTIAN HIEROGLYPH S031 132F7 EGYPTIAN HIEROGLYPH S032 132F8 EGYPTIAN HIEROGLYPH S033 + ~ 132F8 FE02 rotated 270 degrees 132F9 EGYPTIAN HIEROGLYPH S034 132FA EGYPTIAN HIEROGLYPH S035 132FB EGYPTIAN HIEROGLYPH S035A @@ -37784,6 +37994,7 @@ FFFF 132FC EGYPTIAN HIEROGLYPH S036 * older variant of 132FA 132FD EGYPTIAN HIEROGLYPH S037 + ~ 132FD FE02 rotated 270 degrees 132FE EGYPTIAN HIEROGLYPH S038 132FF EGYPTIAN HIEROGLYPH S039 13300 EGYPTIAN HIEROGLYPH S040 @@ -37791,14 +38002,18 @@ FFFF 13301 EGYPTIAN HIEROGLYPH S041 * phonogram 'ḏꜣm' 13302 EGYPTIAN HIEROGLYPH S042 + ~ 13302 FE02 rotated 270 degrees 13303 EGYPTIAN HIEROGLYPH S043 + ~ 13303 FE02 rotated 270 degrees 13304 EGYPTIAN HIEROGLYPH S044 13305 EGYPTIAN HIEROGLYPH S045 13306 EGYPTIAN HIEROGLYPH S046 @ T. Warfare, hunting, butchery 13307 EGYPTIAN HIEROGLYPH T001 + ~ 13307 FE00 rotated 90 degrees 13308 EGYPTIAN HIEROGLYPH T002 * classifier 'striking, hitting' + ~ 13308 FE01 rotated 180 degrees 13309 EGYPTIAN HIEROGLYPH T003 * classifier 'mace' 1330A EGYPTIAN HIEROGLYPH T003A @@ -37809,11 +38024,19 @@ FFFF 1330F EGYPTIAN HIEROGLYPH T007A 13310 EGYPTIAN HIEROGLYPH T008 * older variant of 13311 + ~ 13310 FE02 rotated 270 degrees 13311 EGYPTIAN HIEROGLYPH T008A + ~ 13311 FE02 rotated 270 degrees 13312 EGYPTIAN HIEROGLYPH T009 + ~ 13312 FE01 rotated 180 degrees + ~ 13312 FE02 rotated 270 degrees 13313 EGYPTIAN HIEROGLYPH T009A * older variant of 13312 + ~ 13313 FE01 rotated 180 degrees + ~ 13313 FE02 rotated 270 degrees 13314 EGYPTIAN HIEROGLYPH T010 + ~ 13314 FE01 rotated 180 degrees + ~ 13314 FE02 rotated 270 degrees 13315 EGYPTIAN HIEROGLYPH T011 13316 EGYPTIAN HIEROGLYPH T011A 13317 EGYPTIAN HIEROGLYPH T012 @@ -37822,14 +38045,21 @@ FFFF 1331A EGYPTIAN HIEROGLYPH T015 * older variant of 13319 1331B EGYPTIAN HIEROGLYPH T016 + ~ 1331B FE00 rotated 90 degrees + ~ 1331B FE01 rotated 180 degrees 1331C EGYPTIAN HIEROGLYPH T016A + ~ 1331C FE02 rotated 270 degrees 1331D EGYPTIAN HIEROGLYPH T017 1331E EGYPTIAN HIEROGLYPH T018 1331F EGYPTIAN HIEROGLYPH T019 13320 EGYPTIAN HIEROGLYPH T020 * older variant of 1331F 13321 EGYPTIAN HIEROGLYPH T021 + ~ 13321 FE01 rotated 180 degrees + ~ 13321 FE02 rotated 270 degrees 13322 EGYPTIAN HIEROGLYPH T022 + ~ 13322 FE00 rotated 90 degrees + ~ 13322 FE01 rotated 180 degrees 13323 EGYPTIAN HIEROGLYPH T023 * more recent variant of 13322 13324 EGYPTIAN HIEROGLYPH T024 @@ -37851,6 +38081,8 @@ FFFF 13330 EGYPTIAN HIEROGLYPH T034 13331 EGYPTIAN HIEROGLYPH T035 * variant of 13330 + ~ 13331 FE01 rotated 180 degrees + ~ 13331 FE02 rotated 270 degrees 13332 EGYPTIAN HIEROGLYPH T036 @ U. Agriculture, crafts, and professions 13333 EGYPTIAN HIEROGLYPH U001 @@ -37867,8 +38099,10 @@ FFFF * mirrored version of 13339 1333B EGYPTIAN HIEROGLYPH U007 * variant of 13338 + ~ 1333B FE00 rotated 90 degrees 1333C EGYPTIAN HIEROGLYPH U008 * variant of 1333B + ~ 1333C FE00 rotated 90 degrees 1333D EGYPTIAN HIEROGLYPH U009 1333E EGYPTIAN HIEROGLYPH U010 1333F EGYPTIAN HIEROGLYPH U011 @@ -37885,6 +38119,7 @@ FFFF * older variant of 13347 13349 EGYPTIAN HIEROGLYPH U021 1334A EGYPTIAN HIEROGLYPH U022 + ~ 1334A FE02 rotated 270 degrees 1334B EGYPTIAN HIEROGLYPH U023 1334C EGYPTIAN HIEROGLYPH U023A * stylistic variant of 1334B @@ -37915,6 +38150,7 @@ FFFF 13361 EGYPTIAN HIEROGLYPH U042 * pitchfork * not to be confused with 1327D + ~ 13361 FE02 rotated 270 degrees @ V. Rope, fiber, baskets, bags, etc. 13362 EGYPTIAN HIEROGLYPH V001 * 100 @@ -37948,13 +38184,17 @@ FFFF 13372 EGYPTIAN HIEROGLYPH V007 * phonogram 'šn' 13373 EGYPTIAN HIEROGLYPH V007A + ~ 13373 FE02 rotated 270 degrees 13374 EGYPTIAN HIEROGLYPH V007B 13375 EGYPTIAN HIEROGLYPH V008 13376 EGYPTIAN HIEROGLYPH V009 13377 EGYPTIAN HIEROGLYPH V010 * logogram 'name' + ~ 13377 FE00 rotated 90 degrees 13378 EGYPTIAN HIEROGLYPH V011 * classifier 'restrain, split' + x (egyptian hieroglyph v011d - 1342F) + ~ 13378 FE00 rotated 90 degrees 13379 EGYPTIAN HIEROGLYPH V011A * beginning of cartouche 1337A EGYPTIAN HIEROGLYPH V011B @@ -37963,6 +38203,7 @@ FFFF * end of knotless cartouche 1337C EGYPTIAN HIEROGLYPH V012 1337D EGYPTIAN HIEROGLYPH V012A + ~ 1337D FE02 rotated 270 degrees 1337E EGYPTIAN HIEROGLYPH V012B 1337F EGYPTIAN HIEROGLYPH V013 * transliterated as 1E6F @@ -37974,6 +38215,7 @@ FFFF 13384 EGYPTIAN HIEROGLYPH V018 * older variant of 13383 13385 EGYPTIAN HIEROGLYPH V019 + ~ 13385 FE02 rotated 270 degrees 13386 EGYPTIAN HIEROGLYPH V020 * 10 * not to be confused with 133AD @@ -38015,8 +38257,10 @@ FFFF 13398 EGYPTIAN HIEROGLYPH V025 * more recent variant of 13397 13399 EGYPTIAN HIEROGLYPH V026 + ~ 13399 FE00 rotated 90 degrees 1339A EGYPTIAN HIEROGLYPH V027 * older variant of 13399 + ~ 1339A FE00 rotated 90 degrees 1339B EGYPTIAN HIEROGLYPH V028 * transliterated as 1E25 x (arabic letter hah - 062D) @@ -38053,7 +38297,9 @@ FFFF * not to be confused with 13387 @ W. Vessels of stone and earthenware 133AF EGYPTIAN HIEROGLYPH W001 + ~ 133AF FE02 rotated 270 degrees 133B0 EGYPTIAN HIEROGLYPH W002 + ~ 133B0 FE02 rotated 270 degrees 133B1 EGYPTIAN HIEROGLYPH W003 133B2 EGYPTIAN HIEROGLYPH W003A * stylistic variant, use of 133B1 is preferred @@ -38073,6 +38319,7 @@ FFFF * older variant of 133BC 133BE EGYPTIAN HIEROGLYPH W013 133BF EGYPTIAN HIEROGLYPH W014 + ~ 133BF FE02 rotated 270 degrees 133C0 EGYPTIAN HIEROGLYPH W014A 133C1 EGYPTIAN HIEROGLYPH W015 133C2 EGYPTIAN HIEROGLYPH W016 @@ -38089,9 +38336,9 @@ FFFF 133CA EGYPTIAN HIEROGLYPH W022 133CB EGYPTIAN HIEROGLYPH W023 133CC EGYPTIAN HIEROGLYPH W024 - * phonogramm 'nw' + * phonogram 'nw' 133CD EGYPTIAN HIEROGLYPH W024A - * monogramm 'nw(n)' or 'nww' + * monogram 'nw(n)' or 'nww' 133CE EGYPTIAN HIEROGLYPH W025 @ X. Loaves and cakes 133CF EGYPTIAN HIEROGLYPH X001 @@ -38102,6 +38349,7 @@ FFFF 133D2 EGYPTIAN HIEROGLYPH X004 133D3 EGYPTIAN HIEROGLYPH X004A * variant of 133D2 + ~ 133D3 FE00 rotated 90 degrees 133D4 EGYPTIAN HIEROGLYPH X004B * cake * variant of 133D2 @@ -38125,6 +38373,7 @@ FFFF * rotated variant of 133DB 133DD EGYPTIAN HIEROGLYPH Y002 * older variant of 133DB + ~ 133DD FE02 rotated 270 degrees 133DE EGYPTIAN HIEROGLYPH Y003 133DF EGYPTIAN HIEROGLYPH Y004 * mirrored version of 133DE @@ -38136,7 +38385,7 @@ FFFF 133E4 EGYPTIAN HIEROGLYPH Z001 * semogram index * classifier 'single' - * not to be confuse with 133FA + * not to be confused with 133FA 133E5 EGYPTIAN HIEROGLYPH Z002 * classifier 'plural' * not to be confused with 133FC @@ -38171,13 +38420,16 @@ FFFF 133F2 EGYPTIAN HIEROGLYPH Z007 * phonogram 'w' * not to be confused with 13362 + ~ 133F2 FE00 rotated 90 degrees 133F3 EGYPTIAN HIEROGLYPH Z008 * oval * not to be confused with 13200, 132F0, or 133D4 133F4 EGYPTIAN HIEROGLYPH Z009 133F5 EGYPTIAN HIEROGLYPH Z010 * older variant of 133F4 + ~ 133F5 FE00 rotated 90 degrees 133F6 EGYPTIAN HIEROGLYPH Z011 + ~ 133F6 FE00 rotated 90 degrees 133F7 EGYPTIAN HIEROGLYPH Z012 * hieratic 133F8 EGYPTIAN HIEROGLYPH Z013 @@ -38209,6 +38461,7 @@ FFFF * 9 13403 EGYPTIAN HIEROGLYPH Z015I * 5 + ~ 13403 FE00 rotated 90 degrees 13404 EGYPTIAN HIEROGLYPH Z016 * 1 in dates 13405 EGYPTIAN HIEROGLYPH Z016A @@ -38241,11 +38494,16 @@ FFFF * mirrored version of 13413 13415 EGYPTIAN HIEROGLYPH AA007B 13416 EGYPTIAN HIEROGLYPH AA008 + ~ 13416 FE00 rotated 90 degrees 13417 EGYPTIAN HIEROGLYPH AA009 13418 EGYPTIAN HIEROGLYPH AA010 13419 EGYPTIAN HIEROGLYPH AA011 + ~ 13419 FE00 rotated 90 degrees + ~ 13419 FE01 rotated 180 degrees + ~ 13419 FE02 rotated 270 degrees 1341A EGYPTIAN HIEROGLYPH AA012 * older variant of 13419 + ~ 1341A FE00 rotated 90 degrees 1341B EGYPTIAN HIEROGLYPH AA013 1341C EGYPTIAN HIEROGLYPH AA014 * older variant of 1341B @@ -38258,6 +38516,7 @@ FFFF 13421 EGYPTIAN HIEROGLYPH AA019 13422 EGYPTIAN HIEROGLYPH AA020 13423 EGYPTIAN HIEROGLYPH AA021 + ~ 13423 FE00 rotated 90 degrees 13424 EGYPTIAN HIEROGLYPH AA022 13425 EGYPTIAN HIEROGLYPH AA023 13426 EGYPTIAN HIEROGLYPH AA024 @@ -38271,11 +38530,19 @@ FFFF 1342B EGYPTIAN HIEROGLYPH AA029 * older variant of 1342A 1342C EGYPTIAN HIEROGLYPH AA030 + ~ 1342C FE02 rotated 270 degrees 1342D EGYPTIAN HIEROGLYPH AA031 * older variant of 1342C 1342E EGYPTIAN HIEROGLYPH AA032 -@@ 13430 Egyptian Hieroglyph Format Controls 1343F -@+ These format controls are used to render Egyptian hieroglyphic quadrats. + ~ 1342E FE02 rotated 270 degrees +@ Addition to group V +@+ This is part of the cartouche set: 13379, 1337A, 1337B, and 1342F. +1342F EGYPTIAN HIEROGLYPH V011D + * knotted beginning of cartouche + * not to be confused with 13378 +@~ ! +@@ 13430 Egyptian Hieroglyph Format Controls 1345F +@+ These format controls are used to render Egyptian hieroglyphic spatial arrangements, including quadrats, overlays, insertions, and blank, lost or damaged sections. @ Joiners 13430 EGYPTIAN HIEROGLYPH VERTICAL JOINER = sign separator: subordination (Manuel de Codage) @@ -38291,6 +38558,45 @@ FFFF @ Segment scoping delimiters 13437 EGYPTIAN HIEROGLYPH BEGIN SEGMENT 13438 EGYPTIAN HIEROGLYPH END SEGMENT +@ Sign insertion controls +13439 EGYPTIAN HIEROGLYPH INSERT AT MIDDLE +1343A EGYPTIAN HIEROGLYPH INSERT AT TOP +1343B EGYPTIAN HIEROGLYPH INSERT AT BOTTOM +@ Enclosure controls +1343C EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE +1343D EGYPTIAN HIEROGLYPH END ENCLOSURE +1343E EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE +1343F EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +@ Mirror control +13440 EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +@ Blank and lost signs +13441 EGYPTIAN HIEROGLYPH FULL BLANK +13442 EGYPTIAN HIEROGLYPH HALF BLANK +13443 EGYPTIAN HIEROGLYPH LOST SIGN + ~ 13443 FE00 expanded +13444 EGYPTIAN HIEROGLYPH HALF LOST SIGN + ~ 13444 FE00 expanded +13445 EGYPTIAN HIEROGLYPH TALL LOST SIGN + ~ 13445 FE00 expanded +13446 EGYPTIAN HIEROGLYPH WIDE LOST SIGN + ~ 13446 FE00 expanded +@ Damage modifiers +13447 EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START +13448 EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START +13449 EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START +1344A EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP END +1344B EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP +1344C EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START AND TOP END +1344D EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND TOP +1344E EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM END +1344F EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START AND BOTTOM END +13450 EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM +13451 EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND BOTTOM +13452 EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT END +13453 EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP AND END +13454 EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM AND END +13455 EGYPTIAN HIEROGLYPH MODIFIER DAMAGED +@~ ! @@ 14400 Anatolian Hieroglyphs 1467F @+ In the names list, most of the comments are in Latin. Those which have a Luwian phonetic value are identified as syllabic. @ A. The human body and clothing @@ -41710,6 +42016,7 @@ FFFF 18BDC KHITAN SMALL SCRIPT CHARACTER-18BDC 18BDD KHITAN SMALL SCRIPT CHARACTER-18BDD 18BDE KHITAN SMALL SCRIPT CHARACTER-18BDE + x (khitan small script character-18cca - 18CCA) 18BDF KHITAN SMALL SCRIPT CHARACTER-18BDF 18BE0 KHITAN SMALL SCRIPT CHARACTER-18BE0 18BE1 KHITAN SMALL SCRIPT CHARACTER-18BE1 @@ -41958,6 +42265,7 @@ FFFF 18CC8 KHITAN SMALL SCRIPT CHARACTER-18CC8 18CC9 KHITAN SMALL SCRIPT CHARACTER-18CC9 18CCA KHITAN SMALL SCRIPT CHARACTER-18CCA + x (khitan small script character-18bde - 18BDE) 18CCB KHITAN SMALL SCRIPT CHARACTER-18CCB @ Radical-19 18CCC KHITAN SMALL SCRIPT CHARACTER-18CCC @@ -42578,10 +42886,12 @@ FFFF 1B122 KATAKANA LETTER ARCHAIC WU @@ 1B130 Small Kana Extension 1B16F @ Historic small hiragana letters +1B132 HIRAGANA LETTER SMALL KO 1B150 HIRAGANA LETTER SMALL WI 1B151 HIRAGANA LETTER SMALL WE 1B152 HIRAGANA LETTER SMALL WO @ Historic small katakana letters +1B155 KATAKANA LETTER SMALL KO 1B164 KATAKANA LETTER SMALL WI 1B165 KATAKANA LETTER SMALL WE 1B166 KATAKANA LETTER SMALL WO @@ -44467,6 +44777,28 @@ FFFF 1D244 COMBINING GREEK MUSICAL PENTASEME x (metrical pentaseme - 23D9) 1D245 GREEK MUSICAL LEIMMA +@@ 1D2C0 Kaktovik Numerals 1D2DF +@ Numerals +1D2C0 KAKTOVIK NUMERAL ZERO +1D2C1 KAKTOVIK NUMERAL ONE +1D2C2 KAKTOVIK NUMERAL TWO +1D2C3 KAKTOVIK NUMERAL THREE +1D2C4 KAKTOVIK NUMERAL FOUR +1D2C5 KAKTOVIK NUMERAL FIVE +1D2C6 KAKTOVIK NUMERAL SIX +1D2C7 KAKTOVIK NUMERAL SEVEN +1D2C8 KAKTOVIK NUMERAL EIGHT +1D2C9 KAKTOVIK NUMERAL NINE +1D2CA KAKTOVIK NUMERAL TEN +1D2CB KAKTOVIK NUMERAL ELEVEN +1D2CC KAKTOVIK NUMERAL TWELVE +1D2CD KAKTOVIK NUMERAL THIRTEEN +1D2CE KAKTOVIK NUMERAL FOURTEEN +1D2CF KAKTOVIK NUMERAL FIFTEEN +1D2D0 KAKTOVIK NUMERAL SIXTEEN +1D2D1 KAKTOVIK NUMERAL SEVENTEEN +1D2D2 KAKTOVIK NUMERAL EIGHTEEN +1D2D3 KAKTOVIK NUMERAL NINETEEN @@ 1D2E0 Mayan Numerals 1D2FF @ Mayan numerals 1D2E0 MAYAN NUMERAL ZERO @@ -47482,6 +47814,13 @@ FFFF 1DF1D LATIN SMALL LETTER C WITH RETROFLEX HOOK @ IPA extension 1DF1E LATIN SMALL LETTER S WITH CURL +@ Letters for Malayalam transliteration +1DF25 LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK +1DF26 LATIN SMALL LETTER L WITH MID-HEIGHT LEFT HOOK +1DF27 LATIN SMALL LETTER N WITH MID-HEIGHT LEFT HOOK +1DF28 LATIN SMALL LETTER R WITH MID-HEIGHT LEFT HOOK +1DF29 LATIN SMALL LETTER S WITH MID-HEIGHT LEFT HOOK +1DF2A LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK @@ 1E000 Glagolitic Supplement 1E02F @ Combining letters 1E000 COMBINING GLAGOLITIC LETTER AZU @@ -47522,6 +47861,140 @@ FFFF 1E028 COMBINING GLAGOLITIC LETTER BIG YUS 1E029 COMBINING GLAGOLITIC LETTER IOTATED BIG YUS 1E02A COMBINING GLAGOLITIC LETTER FITA +@@ 1E030 Cyrillic Extended-D 1E08F +@+ These are phonetic extensions, used in a manner analogous to IPA. Additional Cyrillic modifier letters are found in other blocks. + x (modifier letter cyrillic en - 1D78) + x (modifier letter cyrillic hard sign - A69C) + x (modifier letter cyrillic soft sign - A69D) +@ Superscript modifier letters +1E030 MODIFIER LETTER CYRILLIC SMALL A + # 0430 +1E031 MODIFIER LETTER CYRILLIC SMALL BE + # 0431 +1E032 MODIFIER LETTER CYRILLIC SMALL VE + # 0432 +1E033 MODIFIER LETTER CYRILLIC SMALL GHE + # 0433 +1E034 MODIFIER LETTER CYRILLIC SMALL DE + # 0434 +1E035 MODIFIER LETTER CYRILLIC SMALL IE + # 0435 +1E036 MODIFIER LETTER CYRILLIC SMALL ZHE + # 0436 +1E037 MODIFIER LETTER CYRILLIC SMALL ZE + # 0437 +1E038 MODIFIER LETTER CYRILLIC SMALL I + # 0438 +1E039 MODIFIER LETTER CYRILLIC SMALL KA + # 043A +1E03A MODIFIER LETTER CYRILLIC SMALL EL + # 043B +1E03B MODIFIER LETTER CYRILLIC SMALL EM + # 043C +1E03C MODIFIER LETTER CYRILLIC SMALL O + # 043E +1E03D MODIFIER LETTER CYRILLIC SMALL PE + # 043F +1E03E MODIFIER LETTER CYRILLIC SMALL ER + # 0440 +1E03F MODIFIER LETTER CYRILLIC SMALL ES + # 0441 +1E040 MODIFIER LETTER CYRILLIC SMALL TE + # 0442 +1E041 MODIFIER LETTER CYRILLIC SMALL U + # 0443 +1E042 MODIFIER LETTER CYRILLIC SMALL EF + # 0444 +1E043 MODIFIER LETTER CYRILLIC SMALL HA + # 0445 +1E044 MODIFIER LETTER CYRILLIC SMALL TSE + # 0446 +1E045 MODIFIER LETTER CYRILLIC SMALL CHE + # 0447 +1E046 MODIFIER LETTER CYRILLIC SMALL SHA + # 0448 +1E047 MODIFIER LETTER CYRILLIC SMALL YERU + # 044B +1E048 MODIFIER LETTER CYRILLIC SMALL E + # 044D +1E049 MODIFIER LETTER CYRILLIC SMALL YU + # 044E +1E04A MODIFIER LETTER CYRILLIC SMALL DZZE + # A689 +1E04B MODIFIER LETTER CYRILLIC SMALL SCHWA + # 04D9 +1E04C MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I + # 0456 +1E04D MODIFIER LETTER CYRILLIC SMALL JE + # 0458 +1E04E MODIFIER LETTER CYRILLIC SMALL BARRED O + # 04E9 +1E04F MODIFIER LETTER CYRILLIC SMALL STRAIGHT U + # 04AF +1E050 MODIFIER LETTER CYRILLIC SMALL PALOCHKA + # 04CF +@ Subscript modifier letters +1E051 CYRILLIC SUBSCRIPT SMALL LETTER A + # 0430 +1E052 CYRILLIC SUBSCRIPT SMALL LETTER BE + # 0431 +1E053 CYRILLIC SUBSCRIPT SMALL LETTER VE + # 0432 +1E054 CYRILLIC SUBSCRIPT SMALL LETTER GHE + # 0433 +1E055 CYRILLIC SUBSCRIPT SMALL LETTER DE + # 0434 +1E056 CYRILLIC SUBSCRIPT SMALL LETTER IE + # 0435 +1E057 CYRILLIC SUBSCRIPT SMALL LETTER ZHE + # 0436 +1E058 CYRILLIC SUBSCRIPT SMALL LETTER ZE + # 0437 +1E059 CYRILLIC SUBSCRIPT SMALL LETTER I + # 0438 +1E05A CYRILLIC SUBSCRIPT SMALL LETTER KA + # 043A +1E05B CYRILLIC SUBSCRIPT SMALL LETTER EL + # 043B +1E05C CYRILLIC SUBSCRIPT SMALL LETTER O + # 043E +1E05D CYRILLIC SUBSCRIPT SMALL LETTER PE + # 043F +1E05E CYRILLIC SUBSCRIPT SMALL LETTER ES + # 0441 +1E05F CYRILLIC SUBSCRIPT SMALL LETTER U + # 0443 +1E060 CYRILLIC SUBSCRIPT SMALL LETTER EF + # 0444 +1E061 CYRILLIC SUBSCRIPT SMALL LETTER HA + # 0445 +1E062 CYRILLIC SUBSCRIPT SMALL LETTER TSE + # 0446 +1E063 CYRILLIC SUBSCRIPT SMALL LETTER CHE + # 0447 +1E064 CYRILLIC SUBSCRIPT SMALL LETTER SHA + # 0448 +1E065 CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN + # 044A +1E066 CYRILLIC SUBSCRIPT SMALL LETTER YERU + # 044B +1E067 CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN + # 0491 +1E068 CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I + # 0456 +1E069 CYRILLIC SUBSCRIPT SMALL LETTER DZE + # 0455 +1E06A CYRILLIC SUBSCRIPT SMALL LETTER DZHE + # 045F +@ Superscript modifier letters +1E06B MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER + # 04AB +1E06C MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER + # A651 +1E06D MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE + # 04B1 +@ Diacritical mark +1E08F COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I @@ 1E100 Nyiakeng Puachue Hmong 1E14F @+ The Nyiakeng Puachue Hmong script (Nyiaj Keeb Puaj Txwm in RPA orthography) is also known as Pa Dao (Paj Ntaub) and Chervang script (Txawj Vaag). @ Consonant onsets @@ -47740,6 +48213,58 @@ FFFF 1E2FF WANCHO NGUN SIGN = rupee x (indian rupee sign - 20B9) +@@ 1E4D0 Nag Mundari 1E4FF +@ Letters +1E4D0 NAG MUNDARI LETTER O +1E4D1 NAG MUNDARI LETTER OP +1E4D2 NAG MUNDARI LETTER OL +1E4D3 NAG MUNDARI LETTER OY +1E4D4 NAG MUNDARI LETTER ONG +1E4D5 NAG MUNDARI LETTER A +1E4D6 NAG MUNDARI LETTER AJ +1E4D7 NAG MUNDARI LETTER AB +1E4D8 NAG MUNDARI LETTER ANY +1E4D9 NAG MUNDARI LETTER AH +1E4DA NAG MUNDARI LETTER I +1E4DB NAG MUNDARI LETTER IS +1E4DC NAG MUNDARI LETTER IDD +1E4DD NAG MUNDARI LETTER IT +1E4DE NAG MUNDARI LETTER IH +1E4DF NAG MUNDARI LETTER U +1E4E0 NAG MUNDARI LETTER UC +1E4E1 NAG MUNDARI LETTER UD +1E4E2 NAG MUNDARI LETTER UK +1E4E3 NAG MUNDARI LETTER UR +1E4E4 NAG MUNDARI LETTER E +1E4E5 NAG MUNDARI LETTER ENN +1E4E6 NAG MUNDARI LETTER EG +1E4E7 NAG MUNDARI LETTER EM +1E4E8 NAG MUNDARI LETTER EN +1E4E9 NAG MUNDARI LETTER ETT +1E4EA NAG MUNDARI LETTER ELL +@ Various signs +1E4EB NAG MUNDARI SIGN OJOD + * precedes modified letters such as AB or UD + * may indicate consonant gemination +1E4EC NAG MUNDARI SIGN MUHOR + * vowel nasalization +1E4ED NAG MUNDARI SIGN TOYOR + * indicates a long vowel +1E4EE NAG MUNDARI SIGN IKIR + * vowel preceded by the 'w' sound +1E4EF NAG MUNDARI SIGN SUTUH + * mostly used for close transliteration of other languages +@ Digits +1E4F0 NAG MUNDARI DIGIT ZERO +1E4F1 NAG MUNDARI DIGIT ONE +1E4F2 NAG MUNDARI DIGIT TWO +1E4F3 NAG MUNDARI DIGIT THREE +1E4F4 NAG MUNDARI DIGIT FOUR +1E4F5 NAG MUNDARI DIGIT FIVE +1E4F6 NAG MUNDARI DIGIT SIX +1E4F7 NAG MUNDARI DIGIT SEVEN +1E4F8 NAG MUNDARI DIGIT EIGHT +1E4F9 NAG MUNDARI DIGIT NINE @@ 1E7E0 Ethiopic Extended-B 1E7FF @ Syllables for Gurage 1E7E0 ETHIOPIC SYLLABLE HHYA @@ -50331,6 +50856,7 @@ FFFF x (heavy black heart - 2764) x (white heart - 1F90D) x (orange heart - 1F9E1) + x (light blue heart - 1FA75) 1F49A GREEN HEART 1F49B YELLOW HEART 1F49C PURPLE HEART @@ -51341,6 +51867,7 @@ FFFF 1F6D6 HUT 1F6D7 ELEVATOR @ Miscellaneous symbols +1F6DC WIRELESS 1F6DD PLAYGROUND SLIDE 1F6DE WHEEL 1F6DF RING BUOY @@ -51475,8 +52002,9 @@ FFFF x (alchemical symbol for sal-ammoniac - 1F739) 1F728 ALCHEMICAL SYMBOL FOR VERDIGRIS = aes viride, copper subacetate - = early astronomical symbol for earth + = astronomical symbol for earth x (circled plus - 2295) + x (earth - 2641) @ Symbols for tin and lead ore 1F729 ALCHEMICAL SYMBOL FOR TIN ORE x (jupiter - 2643) @@ -51615,10 +52143,27 @@ FFFF @ Measures 1F772 ALCHEMICAL SYMBOL FOR HALF DRAM = drachma semis + * handwritten ligature of 0292 + 00DF, typically spelled out as ʒss x (latin small letter ezh - 0292) 1F773 ALCHEMICAL SYMBOL FOR HALF OUNCE = uncia semis + * handwritten ligature of 2125 + 00DF, typically spelled out as 2125 ss x (ounce sign - 2125) +@ Other symbol +1F774 LOT OF FORTUNE + = pars fortunae + x (circled times - 2297) +@ Eclipse symbols +1F775 OCCULTATION + x (conjunction - 260C) +1F776 LUNAR ECLIPSE + x (opposition - 260D) +@ Symbols for dwarf planets +1F77B HAUMEA +1F77C MAKEMAKE +1F77D GONGGONG +1F77E QUAOAR +1F77F ORCUS @@ 1F780 Geometric Shapes Extended 1F7FF @+ These geometric shapes originate from the Webdings/Wingdings collections. @ Isosceles right triangles @@ -51772,6 +52317,9 @@ FFFF 1F7D6 NEGATIVE CIRCLED TRIANGLE 1F7D7 CIRCLED SQUARE 1F7D8 NEGATIVE CIRCLED SQUARE +@ Nine pointed star +1F7D9 NINE POINTED WHITE STAR + * commonly used by members of the Bahá'í faith @ Colored circles @+ For use with emoji. Constitute a set as follows: 26AA, 26AB, 1F534, 1F535, 1F7E0-1F7E4 1F7E0 LARGE ORANGE CIRCLE @@ -51999,7 +52547,7 @@ FFFF @ Hand symbol 1F90C PINCHED FINGERS @ Colored heart symbols -@+ For use with emoji. Constitute a set as follows: 2764, 1F499-1F49C, 1F5A4, 1F90D, 1F90E, and 1F9E1. +@+ For use with emoji. Constitute a set as follows: 2764, 1F499-1F49C, 1F5A4, 1F90D, 1F90E, 1F9E1, and 1FA75-1FA77. 1F90D WHITE HEART 1F90E BROWN HEART @ Hand symbol @@ -52519,6 +53067,11 @@ FFFF 1FA73 SHORTS 1FA74 THONG SANDAL = flip flop +@ Colored heart symbols +@+ For use with emoji. Constitute a set as follows: 2764, 1F499-1F49C, 1F5A4, 1F90D, 1F90E, 1F9E1, and 1FA75-1FA77. +1FA75 LIGHT BLUE HEART +1FA76 GREY HEART +1FA77 PINK HEART @ Medical symbols 1FA78 DROP OF BLOOD x (droplet - 1F4A7) @@ -52534,6 +53087,9 @@ FFFF 1FA84 MAGIC WAND 1FA85 PINATA 1FA86 NESTING DOLLS +@ Musical instruments +1FA87 MARACAS +1FA88 FLUTE @ Miscellaneous objects 1FA90 RINGED PLANET 1FA91 CHAIR @@ -52566,6 +53122,11 @@ FFFF 1FAAB LOW BATTERY x (battery - 1F50B) 1FAAC HAMSA +1FAAD FOLDING HAND FAN +1FAAE HAIR PICK +@ Religious symbol +1FAAF KHANDA + x (adi shakti - 262C) @ Animals and nature 1FAB0 FLY 1FAB1 WORM @@ -52578,6 +53139,10 @@ FFFF 1FAB8 CORAL 1FAB9 EMPTY NEST 1FABA NEST WITH EGGS +1FABB HYACINTH +1FABC JELLYFISH +1FABD WING +1FABF GOOSE @ Body parts 1FAC0 ANATOMICAL HEART 1FAC1 LUNGS @@ -52588,6 +53153,9 @@ FFFF x (pregnant woman - 1F930) 1FAC5 PERSON WITH CROWN x (princess - 1F478) +@ Animals and nature +1FACE MOOSE +1FACF DONKEY @ Food and drink 1FAD0 BLUEBERRIES 1FAD1 BELL PEPPER @@ -52600,6 +53168,8 @@ FFFF x (glass of milk - 1F95B) 1FAD8 BEANS 1FAD9 JAR +1FADA GINGER ROOT +1FADB PEA POD @ Faces 1FAE0 MELTING FACE 1FAE1 SALUTING FACE @@ -52611,6 +53181,8 @@ FFFF 1FAE6 BITING LIP x (lips - 1F5E2) 1FAE7 BUBBLES +@ Face +1FAE8 SHAKING FACE @ Hand symbols 1FAF0 HAND WITH INDEX FINGER AND THUMB CROSSED x (hand with index and middle fingers crossed - 1F91E) @@ -52620,6 +53192,8 @@ FFFF 1FAF4 PALM UP HAND 1FAF5 INDEX POINTING AT THE VIEWER 1FAF6 HEART HANDS +1FAF7 LEFTWARDS PUSHING HAND +1FAF8 RIGHTWARDS PUSHING HAND @@ 1FB00 Symbols for Legacy Computing 1FBFF @ Block mosaic terminal graphic characters @+ The term "sextant" refers to block mosaics divided into six parts. @@ -52936,7 +53510,7 @@ FFFF 1FFFE 1FFFF @@ 20000 CJK Unified Ideographs Extension B 2A6DF -@@ 2A700 CJK Unified Ideographs Extension C 2B738 +@@ 2A700 CJK Unified Ideographs Extension C 2B739 @@ 2B740 CJK Unified Ideographs Extension D 2B81D @@ 2B820 CJK Unified Ideographs Extension E 2CEA1 @@ 2CEB0 CJK Unified Ideographs Extension F 2EBE0 @@ -54057,6 +54631,7 @@ FFFF 2FFFE 2FFFF @@ 30000 CJK Unified Ideographs Extension G 3134A +@@ 31350 CJK Unified Ideographs Extension H 323AF @@ 3FF80 Unassigned 3FFFF @ Noncharacters @+ These codes are intended for process-internal uses. Index: gnu/usr.bin/perl/lib/unicore/NormTest.txt =================================================================== RCS file: gnu/usr.bin/perl/lib/unicore/NormTest.txt diff -N gnu/usr.bin/perl/lib/unicore/NormTest.txt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gnu/usr.bin/perl/lib/unicore/NormTest.txt 21 Feb 2024 15:47:02 -0000 @@ -0,0 +1,19129 @@ +# NormalizationTest-15.0.0.txt +# Date: 2022-04-02, 01:29:09 GMT +# © 2022 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# +# Normalization Test Suite +# Format: +# +# Columns (c1, c2,...) are separated by semicolons +# They have the following meaning: +# source; NFC; NFD; NFKC; NFKD +# Comments are indicated with hash marks +# Each of the columns may have one or more code points. +# +# CONFORMANCE: +# 1. The following invariants must be true for all conformant implementations +# +# NFC +# c2 == toNFC(c1) == toNFC(c2) == toNFC(c3) +# c4 == toNFC(c4) == toNFC(c5) +# +# NFD +# c3 == toNFD(c1) == toNFD(c2) == toNFD(c3) +# c5 == toNFD(c4) == toNFD(c5) +# +# NFKC +# c4 == toNFKC(c1) == toNFKC(c2) == toNFKC(c3) == toNFKC(c4) == toNFKC(c5) +# +# NFKD +# c5 == toNFKD(c1) == toNFKD(c2) == toNFKD(c3) == toNFKD(c4) == toNFKD(c5) +# +# 2. For every code point X assigned in this version of Unicode that is not specifically +# listed in Part 1, the following invariants must be true for all conformant +# implementations: +# +# X == toNFC(X) == toNFD(X) == toNFKC(X) == toNFKD(X) +# +@Part0 # Specific cases +# +1E0A;1E0A;0044 0307;1E0A;0044 0307; # (Ḋ; Ḋ; D◌̇; Ḋ; D◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0C;1E0C;0044 0323;1E0C;0044 0323; # (Ḍ; Ḍ; D◌̣; Ḍ; D◌̣; ) LATIN CAPITAL LETTER D WITH DOT BELOW +1E0A 0323;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307; # (Ḋ◌̣; Ḍ◌̇; D◌̣◌̇; Ḍ◌̇; D◌̣◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE, COMBINING DOT BELOW +1E0C 0307;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307; # (Ḍ◌̇; Ḍ◌̇; D◌̣◌̇; Ḍ◌̇; D◌̣◌̇; ) LATIN CAPITAL LETTER D WITH DOT BELOW, COMBINING DOT ABOVE +0044 0307 0323;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307; # (D◌̇◌̣; Ḍ◌̇; D◌̣◌̇; Ḍ◌̇; D◌̣◌̇; ) LATIN CAPITAL LETTER D, COMBINING DOT ABOVE, COMBINING DOT BELOW +0044 0323 0307;1E0C 0307;0044 0323 0307;1E0C 0307;0044 0323 0307; # (D◌̣◌̇; Ḍ◌̇; D◌̣◌̇; Ḍ◌̇; D◌̣◌̇; ) LATIN CAPITAL LETTER D, COMBINING DOT BELOW, COMBINING DOT ABOVE +1E0A 031B;1E0A 031B;0044 031B 0307;1E0A 031B;0044 031B 0307; # (Ḋ◌̛; Ḋ◌̛; D◌̛◌̇; Ḋ◌̛; D◌̛◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE, COMBINING HORN +1E0C 031B;1E0C 031B;0044 031B 0323;1E0C 031B;0044 031B 0323; # (Ḍ◌̛; Ḍ◌̛; D◌̛◌̣; Ḍ◌̛; D◌̛◌̣; ) LATIN CAPITAL LETTER D WITH DOT BELOW, COMBINING HORN +1E0A 031B 0323;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307; # (Ḋ◌̛◌̣; Ḍ◌̛◌̇; D◌̛◌̣◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE, COMBINING HORN, COMBINING DOT BELOW +1E0C 031B 0307;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307; # (Ḍ◌̛◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; ) LATIN CAPITAL LETTER D WITH DOT BELOW, COMBINING HORN, COMBINING DOT ABOVE +0044 031B 0307 0323;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307; # (D◌̛◌̇◌̣; Ḍ◌̛◌̇; D◌̛◌̣◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; ) LATIN CAPITAL LETTER D, COMBINING HORN, COMBINING DOT ABOVE, COMBINING DOT BELOW +0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307;1E0C 031B 0307;0044 031B 0323 0307; # (D◌̛◌̣◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; Ḍ◌̛◌̇; D◌̛◌̣◌̇; ) LATIN CAPITAL LETTER D, COMBINING HORN, COMBINING DOT BELOW, COMBINING DOT ABOVE +00C8;00C8;0045 0300;00C8;0045 0300; # (È; È; E◌̀; È; E◌̀; ) LATIN CAPITAL LETTER E WITH GRAVE +0112;0112;0045 0304;0112;0045 0304; # (Ē; Ē; E◌̄; Ē; E◌̄; ) LATIN CAPITAL LETTER E WITH MACRON +0045 0300;00C8;0045 0300;00C8;0045 0300; # (E◌̀; È; E◌̀; È; E◌̀; ) LATIN CAPITAL LETTER E, COMBINING GRAVE ACCENT +0045 0304;0112;0045 0304;0112;0045 0304; # (E◌̄; Ē; E◌̄; Ē; E◌̄; ) LATIN CAPITAL LETTER E, COMBINING MACRON +1E14;1E14;0045 0304 0300;1E14;0045 0304 0300; # (Ḕ; Ḕ; E◌̄◌̀; Ḕ; E◌̄◌̀; ) LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +0112 0300;1E14;0045 0304 0300;1E14;0045 0304 0300; # (Ē◌̀; Ḕ; E◌̄◌̀; Ḕ; E◌̄◌̀; ) LATIN CAPITAL LETTER E WITH MACRON, COMBINING GRAVE ACCENT +1E14 0304;1E14 0304;0045 0304 0300 0304;1E14 0304;0045 0304 0300 0304; # (Ḕ◌̄; Ḕ◌̄; E◌̄◌̀◌̄; Ḕ◌̄; E◌̄◌̀◌̄; ) LATIN CAPITAL LETTER E WITH MACRON AND GRAVE, COMBINING MACRON +0045 0304 0300;1E14;0045 0304 0300;1E14;0045 0304 0300; # (E◌̄◌̀; Ḕ; E◌̄◌̀; Ḕ; E◌̄◌̀; ) LATIN CAPITAL LETTER E, COMBINING MACRON, COMBINING GRAVE ACCENT +0045 0300 0304;00C8 0304;0045 0300 0304;00C8 0304;0045 0300 0304; # (E◌̀◌̄; È◌̄; E◌̀◌̄; È◌̄; E◌̀◌̄; ) LATIN CAPITAL LETTER E, COMBINING GRAVE ACCENT, COMBINING MACRON +05B8 05B9 05B1 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F;05B1 05B8 05B9 0591 05C3 05B0 05AC 059F; # (◌ָ◌ֹ◌ֱ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ◌ֱ◌ָ◌ֹ◌֑׃◌ְ◌֬◌֟; ) HEBREW POINT QAMATS, HEBREW POINT HOLAM, HEBREW POINT HATAF SEGOL, HEBREW ACCENT ETNAHTA, HEBREW PUNCTUATION SOF PASUQ, HEBREW POINT SHEVA, HEBREW ACCENT ILUY, HEBREW ACCENT QARNEY PARA +0592 05B7 05BC 05A5 05B0 05C0 05C4 05AD;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4;05B0 05B7 05BC 05A5 0592 05C0 05AD 05C4; # (◌֒◌ַ◌ּ◌֥◌ְ׀◌ׄ◌֭; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ◌ְ◌ַ◌ּ◌֥◌֒׀◌֭◌ׄ; ) HEBREW ACCENT SEGOL, HEBREW POINT PATAH, HEBREW POINT DAGESH OR MAPIQ, HEBREW ACCENT MERKHA, HEBREW POINT SHEVA, HEBREW PUNCTUATION PASEQ, HEBREW MARK UPPER DOT, HEBREW ACCENT DEHI +1100 AC00 11A8;1100 AC01;1100 1100 1161 11A8;1100 AC01;1100 1100 1161 11A8; # (ᄀ각; ᄀ각; ᄀ각; ᄀ각; ᄀ각; ) HANGUL CHOSEONG KIYEOK, HANGUL SYLLABLE GA, HANGUL JONGSEONG KIYEOK +1100 AC00 11A8 11A8;1100 AC01 11A8;1100 1100 1161 11A8 11A8;1100 AC01 11A8;1100 1100 1161 11A8 11A8; # (ᄀ각ᆨ; ᄀ각ᆨ; ᄀ각ᆨ; ᄀ각ᆨ; ᄀ각ᆨ; ) HANGUL CHOSEONG KIYEOK, HANGUL SYLLABLE GA, HANGUL JONGSEONG KIYEOK, HANGUL JONGSEONG KIYEOK +# +@Part1 # Character by character test +# All characters not explicitly occurring in c1 of Part 1 have identical NFC, D, KC, KD forms. +# +00A0;00A0;00A0;0020;0020; # ( ;  ;  ; ; ; ) NO-BREAK SPACE +00A8;00A8;00A8;0020 0308;0020 0308; # (¨; ¨; ¨; ◌̈; ◌̈; ) DIAERESIS +00AA;00AA;00AA;0061;0061; # (ª; ª; ª; a; a; ) FEMININE ORDINAL INDICATOR +00AF;00AF;00AF;0020 0304;0020 0304; # (¯; ¯; ¯; ◌̄; ◌̄; ) MACRON +00B2;00B2;00B2;0032;0032; # (²; ²; ²; 2; 2; ) SUPERSCRIPT TWO +00B3;00B3;00B3;0033;0033; # (³; ³; ³; 3; 3; ) SUPERSCRIPT THREE +00B4;00B4;00B4;0020 0301;0020 0301; # (´; ´; ´; ◌́; ◌́; ) ACUTE ACCENT +00B5;00B5;00B5;03BC;03BC; # (µ; µ; µ; μ; μ; ) MICRO SIGN +00B8;00B8;00B8;0020 0327;0020 0327; # (¸; ¸; ¸; ◌̧; ◌̧; ) CEDILLA +00B9;00B9;00B9;0031;0031; # (¹; ¹; ¹; 1; 1; ) SUPERSCRIPT ONE +00BA;00BA;00BA;006F;006F; # (º; º; º; o; o; ) MASCULINE ORDINAL INDICATOR +00BC;00BC;00BC;0031 2044 0034;0031 2044 0034; # (¼; ¼; ¼; 1⁄4; 1⁄4; ) VULGAR FRACTION ONE QUARTER +00BD;00BD;00BD;0031 2044 0032;0031 2044 0032; # (½; ½; ½; 1⁄2; 1⁄2; ) VULGAR FRACTION ONE HALF +00BE;00BE;00BE;0033 2044 0034;0033 2044 0034; # (¾; ¾; ¾; 3⁄4; 3⁄4; ) VULGAR FRACTION THREE QUARTERS +00C0;00C0;0041 0300;00C0;0041 0300; # (À; À; A◌̀; À; A◌̀; ) LATIN CAPITAL LETTER A WITH GRAVE +00C1;00C1;0041 0301;00C1;0041 0301; # (Á; Á; A◌́; Á; A◌́; ) LATIN CAPITAL LETTER A WITH ACUTE +00C2;00C2;0041 0302;00C2;0041 0302; # (Â; Â; A◌̂; Â; A◌̂; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3;00C3;0041 0303;00C3;0041 0303; # (Ã; Ã; A◌̃; Ã; A◌̃; ) LATIN CAPITAL LETTER A WITH TILDE +00C4;00C4;0041 0308;00C4;0041 0308; # (Ä; Ä; A◌̈; Ä; A◌̈; ) LATIN CAPITAL LETTER A WITH DIAERESIS +00C5;00C5;0041 030A;00C5;0041 030A; # (Å; Å; A◌̊; Å; A◌̊; ) LATIN CAPITAL LETTER A WITH RING ABOVE +00C7;00C7;0043 0327;00C7;0043 0327; # (Ç; Ç; C◌̧; Ç; C◌̧; ) LATIN CAPITAL LETTER C WITH CEDILLA +00C8;00C8;0045 0300;00C8;0045 0300; # (È; È; E◌̀; È; E◌̀; ) LATIN CAPITAL LETTER E WITH GRAVE +00C9;00C9;0045 0301;00C9;0045 0301; # (É; É; E◌́; É; E◌́; ) LATIN CAPITAL LETTER E WITH ACUTE +00CA;00CA;0045 0302;00CA;0045 0302; # (Ê; Ê; E◌̂; Ê; E◌̂; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB;00CB;0045 0308;00CB;0045 0308; # (Ë; Ë; E◌̈; Ë; E◌̈; ) LATIN CAPITAL LETTER E WITH DIAERESIS +00CC;00CC;0049 0300;00CC;0049 0300; # (Ì; Ì; I◌̀; Ì; I◌̀; ) LATIN CAPITAL LETTER I WITH GRAVE +00CD;00CD;0049 0301;00CD;0049 0301; # (Í; Í; I◌́; Í; I◌́; ) LATIN CAPITAL LETTER I WITH ACUTE +00CE;00CE;0049 0302;00CE;0049 0302; # (Î; Î; I◌̂; Î; I◌̂; ) LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF;00CF;0049 0308;00CF;0049 0308; # (Ï; Ï; I◌̈; Ï; I◌̈; ) LATIN CAPITAL LETTER I WITH DIAERESIS +00D1;00D1;004E 0303;00D1;004E 0303; # (Ñ; Ñ; N◌̃; Ñ; N◌̃; ) LATIN CAPITAL LETTER N WITH TILDE +00D2;00D2;004F 0300;00D2;004F 0300; # (Ò; Ò; O◌̀; Ò; O◌̀; ) LATIN CAPITAL LETTER O WITH GRAVE +00D3;00D3;004F 0301;00D3;004F 0301; # (Ó; Ó; O◌́; Ó; O◌́; ) LATIN CAPITAL LETTER O WITH ACUTE +00D4;00D4;004F 0302;00D4;004F 0302; # (Ô; Ô; O◌̂; Ô; O◌̂; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5;00D5;004F 0303;00D5;004F 0303; # (Õ; Õ; O◌̃; Õ; O◌̃; ) LATIN CAPITAL LETTER O WITH TILDE +00D6;00D6;004F 0308;00D6;004F 0308; # (Ö; Ö; O◌̈; Ö; O◌̈; ) LATIN CAPITAL LETTER O WITH DIAERESIS +00D9;00D9;0055 0300;00D9;0055 0300; # (Ù; Ù; U◌̀; Ù; U◌̀; ) LATIN CAPITAL LETTER U WITH GRAVE +00DA;00DA;0055 0301;00DA;0055 0301; # (Ú; Ú; U◌́; Ú; U◌́; ) LATIN CAPITAL LETTER U WITH ACUTE +00DB;00DB;0055 0302;00DB;0055 0302; # (Û; Û; U◌̂; Û; U◌̂; ) LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC;00DC;0055 0308;00DC;0055 0308; # (Ü; Ü; U◌̈; Ü; U◌̈; ) LATIN CAPITAL LETTER U WITH DIAERESIS +00DD;00DD;0059 0301;00DD;0059 0301; # (Ý; Ý; Y◌́; Ý; Y◌́; ) LATIN CAPITAL LETTER Y WITH ACUTE +00E0;00E0;0061 0300;00E0;0061 0300; # (à; à; a◌̀; à; a◌̀; ) LATIN SMALL LETTER A WITH GRAVE +00E1;00E1;0061 0301;00E1;0061 0301; # (á; á; a◌́; á; a◌́; ) LATIN SMALL LETTER A WITH ACUTE +00E2;00E2;0061 0302;00E2;0061 0302; # (â; â; a◌̂; â; a◌̂; ) LATIN SMALL LETTER A WITH CIRCUMFLEX +00E3;00E3;0061 0303;00E3;0061 0303; # (ã; ã; a◌̃; ã; a◌̃; ) LATIN SMALL LETTER A WITH TILDE +00E4;00E4;0061 0308;00E4;0061 0308; # (ä; ä; a◌̈; ä; a◌̈; ) LATIN SMALL LETTER A WITH DIAERESIS +00E5;00E5;0061 030A;00E5;0061 030A; # (å; å; a◌̊; å; a◌̊; ) LATIN SMALL LETTER A WITH RING ABOVE +00E7;00E7;0063 0327;00E7;0063 0327; # (ç; ç; c◌̧; ç; c◌̧; ) LATIN SMALL LETTER C WITH CEDILLA +00E8;00E8;0065 0300;00E8;0065 0300; # (è; è; e◌̀; è; e◌̀; ) LATIN SMALL LETTER E WITH GRAVE +00E9;00E9;0065 0301;00E9;0065 0301; # (é; é; e◌́; é; e◌́; ) LATIN SMALL LETTER E WITH ACUTE +00EA;00EA;0065 0302;00EA;0065 0302; # (ê; ê; e◌̂; ê; e◌̂; ) LATIN SMALL LETTER E WITH CIRCUMFLEX +00EB;00EB;0065 0308;00EB;0065 0308; # (ë; ë; e◌̈; ë; e◌̈; ) LATIN SMALL LETTER E WITH DIAERESIS +00EC;00EC;0069 0300;00EC;0069 0300; # (ì; ì; i◌̀; ì; i◌̀; ) LATIN SMALL LETTER I WITH GRAVE +00ED;00ED;0069 0301;00ED;0069 0301; # (í; í; i◌́; í; i◌́; ) LATIN SMALL LETTER I WITH ACUTE +00EE;00EE;0069 0302;00EE;0069 0302; # (î; î; i◌̂; î; i◌̂; ) LATIN SMALL LETTER I WITH CIRCUMFLEX +00EF;00EF;0069 0308;00EF;0069 0308; # (ï; ï; i◌̈; ï; i◌̈; ) LATIN SMALL LETTER I WITH DIAERESIS +00F1;00F1;006E 0303;00F1;006E 0303; # (ñ; ñ; n◌̃; ñ; n◌̃; ) LATIN SMALL LETTER N WITH TILDE +00F2;00F2;006F 0300;00F2;006F 0300; # (ò; ò; o◌̀; ò; o◌̀; ) LATIN SMALL LETTER O WITH GRAVE +00F3;00F3;006F 0301;00F3;006F 0301; # (ó; ó; o◌́; ó; o◌́; ) LATIN SMALL LETTER O WITH ACUTE +00F4;00F4;006F 0302;00F4;006F 0302; # (ô; ô; o◌̂; ô; o◌̂; ) LATIN SMALL LETTER O WITH CIRCUMFLEX +00F5;00F5;006F 0303;00F5;006F 0303; # (õ; õ; o◌̃; õ; o◌̃; ) LATIN SMALL LETTER O WITH TILDE +00F6;00F6;006F 0308;00F6;006F 0308; # (ö; ö; o◌̈; ö; o◌̈; ) LATIN SMALL LETTER O WITH DIAERESIS +00F9;00F9;0075 0300;00F9;0075 0300; # (ù; ù; u◌̀; ù; u◌̀; ) LATIN SMALL LETTER U WITH GRAVE +00FA;00FA;0075 0301;00FA;0075 0301; # (ú; ú; u◌́; ú; u◌́; ) LATIN SMALL LETTER U WITH ACUTE +00FB;00FB;0075 0302;00FB;0075 0302; # (û; û; u◌̂; û; u◌̂; ) LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC;00FC;0075 0308;00FC;0075 0308; # (ü; ü; u◌̈; ü; u◌̈; ) LATIN SMALL LETTER U WITH DIAERESIS +00FD;00FD;0079 0301;00FD;0079 0301; # (ý; ý; y◌́; ý; y◌́; ) LATIN SMALL LETTER Y WITH ACUTE +00FF;00FF;0079 0308;00FF;0079 0308; # (ÿ; ÿ; y◌̈; ÿ; y◌̈; ) LATIN SMALL LETTER Y WITH DIAERESIS +0100;0100;0041 0304;0100;0041 0304; # (Ā; Ā; A◌̄; Ā; A◌̄; ) LATIN CAPITAL LETTER A WITH MACRON +0101;0101;0061 0304;0101;0061 0304; # (ā; ā; a◌̄; ā; a◌̄; ) LATIN SMALL LETTER A WITH MACRON +0102;0102;0041 0306;0102;0041 0306; # (Ă; Ă; A◌̆; Ă; A◌̆; ) LATIN CAPITAL LETTER A WITH BREVE +0103;0103;0061 0306;0103;0061 0306; # (ă; ă; a◌̆; ă; a◌̆; ) LATIN SMALL LETTER A WITH BREVE +0104;0104;0041 0328;0104;0041 0328; # (Ą; Ą; A◌̨; Ą; A◌̨; ) LATIN CAPITAL LETTER A WITH OGONEK +0105;0105;0061 0328;0105;0061 0328; # (ą; ą; a◌̨; ą; a◌̨; ) LATIN SMALL LETTER A WITH OGONEK +0106;0106;0043 0301;0106;0043 0301; # (Ć; Ć; C◌́; Ć; C◌́; ) LATIN CAPITAL LETTER C WITH ACUTE +0107;0107;0063 0301;0107;0063 0301; # (ć; ć; c◌́; ć; c◌́; ) LATIN SMALL LETTER C WITH ACUTE +0108;0108;0043 0302;0108;0043 0302; # (Ĉ; Ĉ; C◌̂; Ĉ; C◌̂; ) LATIN CAPITAL LETTER C WITH CIRCUMFLEX +0109;0109;0063 0302;0109;0063 0302; # (ĉ; ĉ; c◌̂; ĉ; c◌̂; ) LATIN SMALL LETTER C WITH CIRCUMFLEX +010A;010A;0043 0307;010A;0043 0307; # (Ċ; Ċ; C◌̇; Ċ; C◌̇; ) LATIN CAPITAL LETTER C WITH DOT ABOVE +010B;010B;0063 0307;010B;0063 0307; # (ċ; ċ; c◌̇; ċ; c◌̇; ) LATIN SMALL LETTER C WITH DOT ABOVE +010C;010C;0043 030C;010C;0043 030C; # (Č; Č; C◌̌; Č; C◌̌; ) LATIN CAPITAL LETTER C WITH CARON +010D;010D;0063 030C;010D;0063 030C; # (č; č; c◌̌; č; c◌̌; ) LATIN SMALL LETTER C WITH CARON +010E;010E;0044 030C;010E;0044 030C; # (Ď; Ď; D◌̌; Ď; D◌̌; ) LATIN CAPITAL LETTER D WITH CARON +010F;010F;0064 030C;010F;0064 030C; # (ď; ď; d◌̌; ď; d◌̌; ) LATIN SMALL LETTER D WITH CARON +0112;0112;0045 0304;0112;0045 0304; # (Ē; Ē; E◌̄; Ē; E◌̄; ) LATIN CAPITAL LETTER E WITH MACRON +0113;0113;0065 0304;0113;0065 0304; # (ē; ē; e◌̄; ē; e◌̄; ) LATIN SMALL LETTER E WITH MACRON +0114;0114;0045 0306;0114;0045 0306; # (Ĕ; Ĕ; E◌̆; Ĕ; E◌̆; ) LATIN CAPITAL LETTER E WITH BREVE +0115;0115;0065 0306;0115;0065 0306; # (ĕ; ĕ; e◌̆; ĕ; e◌̆; ) LATIN SMALL LETTER E WITH BREVE +0116;0116;0045 0307;0116;0045 0307; # (Ė; Ė; E◌̇; Ė; E◌̇; ) LATIN CAPITAL LETTER E WITH DOT ABOVE +0117;0117;0065 0307;0117;0065 0307; # (ė; ė; e◌̇; ė; e◌̇; ) LATIN SMALL LETTER E WITH DOT ABOVE +0118;0118;0045 0328;0118;0045 0328; # (Ę; Ę; E◌̨; Ę; E◌̨; ) LATIN CAPITAL LETTER E WITH OGONEK +0119;0119;0065 0328;0119;0065 0328; # (ę; ę; e◌̨; ę; e◌̨; ) LATIN SMALL LETTER E WITH OGONEK +011A;011A;0045 030C;011A;0045 030C; # (Ě; Ě; E◌̌; Ě; E◌̌; ) LATIN CAPITAL LETTER E WITH CARON +011B;011B;0065 030C;011B;0065 030C; # (ě; ě; e◌̌; ě; e◌̌; ) LATIN SMALL LETTER E WITH CARON +011C;011C;0047 0302;011C;0047 0302; # (Ĝ; Ĝ; G◌̂; Ĝ; G◌̂; ) LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011D;011D;0067 0302;011D;0067 0302; # (ĝ; ĝ; g◌̂; ĝ; g◌̂; ) LATIN SMALL LETTER G WITH CIRCUMFLEX +011E;011E;0047 0306;011E;0047 0306; # (Ğ; Ğ; G◌̆; Ğ; G◌̆; ) LATIN CAPITAL LETTER G WITH BREVE +011F;011F;0067 0306;011F;0067 0306; # (ğ; ğ; g◌̆; ğ; g◌̆; ) LATIN SMALL LETTER G WITH BREVE +0120;0120;0047 0307;0120;0047 0307; # (Ġ; Ġ; G◌̇; Ġ; G◌̇; ) LATIN CAPITAL LETTER G WITH DOT ABOVE +0121;0121;0067 0307;0121;0067 0307; # (ġ; ġ; g◌̇; ġ; g◌̇; ) LATIN SMALL LETTER G WITH DOT ABOVE +0122;0122;0047 0327;0122;0047 0327; # (Ģ; Ģ; G◌̧; Ģ; G◌̧; ) LATIN CAPITAL LETTER G WITH CEDILLA +0123;0123;0067 0327;0123;0067 0327; # (ģ; ģ; g◌̧; ģ; g◌̧; ) LATIN SMALL LETTER G WITH CEDILLA +0124;0124;0048 0302;0124;0048 0302; # (Ĥ; Ĥ; H◌̂; Ĥ; H◌̂; ) LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0125;0125;0068 0302;0125;0068 0302; # (ĥ; ĥ; h◌̂; ĥ; h◌̂; ) LATIN SMALL LETTER H WITH CIRCUMFLEX +0128;0128;0049 0303;0128;0049 0303; # (Ĩ; Ĩ; I◌̃; Ĩ; I◌̃; ) LATIN CAPITAL LETTER I WITH TILDE +0129;0129;0069 0303;0129;0069 0303; # (ĩ; ĩ; i◌̃; ĩ; i◌̃; ) LATIN SMALL LETTER I WITH TILDE +012A;012A;0049 0304;012A;0049 0304; # (Ī; Ī; I◌̄; Ī; I◌̄; ) LATIN CAPITAL LETTER I WITH MACRON +012B;012B;0069 0304;012B;0069 0304; # (ī; ī; i◌̄; ī; i◌̄; ) LATIN SMALL LETTER I WITH MACRON +012C;012C;0049 0306;012C;0049 0306; # (Ĭ; Ĭ; I◌̆; Ĭ; I◌̆; ) LATIN CAPITAL LETTER I WITH BREVE +012D;012D;0069 0306;012D;0069 0306; # (ĭ; ĭ; i◌̆; ĭ; i◌̆; ) LATIN SMALL LETTER I WITH BREVE +012E;012E;0049 0328;012E;0049 0328; # (Į; Į; I◌̨; Į; I◌̨; ) LATIN CAPITAL LETTER I WITH OGONEK +012F;012F;0069 0328;012F;0069 0328; # (į; į; i◌̨; į; i◌̨; ) LATIN SMALL LETTER I WITH OGONEK +0130;0130;0049 0307;0130;0049 0307; # (İ; İ; I◌̇; İ; I◌̇; ) LATIN CAPITAL LETTER I WITH DOT ABOVE +0132;0132;0132;0049 004A;0049 004A; # (IJ; IJ; IJ; IJ; IJ; ) LATIN CAPITAL LIGATURE IJ +0133;0133;0133;0069 006A;0069 006A; # (ij; ij; ij; ij; ij; ) LATIN SMALL LIGATURE IJ +0134;0134;004A 0302;0134;004A 0302; # (Ĵ; Ĵ; J◌̂; Ĵ; J◌̂; ) LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0135;0135;006A 0302;0135;006A 0302; # (ĵ; ĵ; j◌̂; ĵ; j◌̂; ) LATIN SMALL LETTER J WITH CIRCUMFLEX +0136;0136;004B 0327;0136;004B 0327; # (Ķ; Ķ; K◌̧; Ķ; K◌̧; ) LATIN CAPITAL LETTER K WITH CEDILLA +0137;0137;006B 0327;0137;006B 0327; # (ķ; ķ; k◌̧; ķ; k◌̧; ) LATIN SMALL LETTER K WITH CEDILLA +0139;0139;004C 0301;0139;004C 0301; # (Ĺ; Ĺ; L◌́; Ĺ; L◌́; ) LATIN CAPITAL LETTER L WITH ACUTE +013A;013A;006C 0301;013A;006C 0301; # (ĺ; ĺ; l◌́; ĺ; l◌́; ) LATIN SMALL LETTER L WITH ACUTE +013B;013B;004C 0327;013B;004C 0327; # (Ļ; Ļ; L◌̧; Ļ; L◌̧; ) LATIN CAPITAL LETTER L WITH CEDILLA +013C;013C;006C 0327;013C;006C 0327; # (ļ; ļ; l◌̧; ļ; l◌̧; ) LATIN SMALL LETTER L WITH CEDILLA +013D;013D;004C 030C;013D;004C 030C; # (Ľ; Ľ; L◌̌; Ľ; L◌̌; ) LATIN CAPITAL LETTER L WITH CARON +013E;013E;006C 030C;013E;006C 030C; # (ľ; ľ; l◌̌; ľ; l◌̌; ) LATIN SMALL LETTER L WITH CARON +013F;013F;013F;004C 00B7;004C 00B7; # (Ŀ; Ŀ; Ŀ; L·; L·; ) LATIN CAPITAL LETTER L WITH MIDDLE DOT +0140;0140;0140;006C 00B7;006C 00B7; # (ŀ; ŀ; ŀ; l·; l·; ) LATIN SMALL LETTER L WITH MIDDLE DOT +0143;0143;004E 0301;0143;004E 0301; # (Ń; Ń; N◌́; Ń; N◌́; ) LATIN CAPITAL LETTER N WITH ACUTE +0144;0144;006E 0301;0144;006E 0301; # (ń; ń; n◌́; ń; n◌́; ) LATIN SMALL LETTER N WITH ACUTE +0145;0145;004E 0327;0145;004E 0327; # (Ņ; Ņ; N◌̧; Ņ; N◌̧; ) LATIN CAPITAL LETTER N WITH CEDILLA +0146;0146;006E 0327;0146;006E 0327; # (ņ; ņ; n◌̧; ņ; n◌̧; ) LATIN SMALL LETTER N WITH CEDILLA +0147;0147;004E 030C;0147;004E 030C; # (Ň; Ň; N◌̌; Ň; N◌̌; ) LATIN CAPITAL LETTER N WITH CARON +0148;0148;006E 030C;0148;006E 030C; # (ň; ň; n◌̌; ň; n◌̌; ) LATIN SMALL LETTER N WITH CARON +0149;0149;0149;02BC 006E;02BC 006E; # (ʼn; ʼn; ʼn; ʼn; ʼn; ) LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014C;014C;004F 0304;014C;004F 0304; # (Ō; Ō; O◌̄; Ō; O◌̄; ) LATIN CAPITAL LETTER O WITH MACRON +014D;014D;006F 0304;014D;006F 0304; # (ō; ō; o◌̄; ō; o◌̄; ) LATIN SMALL LETTER O WITH MACRON +014E;014E;004F 0306;014E;004F 0306; # (Ŏ; Ŏ; O◌̆; Ŏ; O◌̆; ) LATIN CAPITAL LETTER O WITH BREVE +014F;014F;006F 0306;014F;006F 0306; # (ŏ; ŏ; o◌̆; ŏ; o◌̆; ) LATIN SMALL LETTER O WITH BREVE +0150;0150;004F 030B;0150;004F 030B; # (Ő; Ő; O◌̋; Ő; O◌̋; ) LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0151;0151;006F 030B;0151;006F 030B; # (ő; ő; o◌̋; ő; o◌̋; ) LATIN SMALL LETTER O WITH DOUBLE ACUTE +0154;0154;0052 0301;0154;0052 0301; # (Ŕ; Ŕ; R◌́; Ŕ; R◌́; ) LATIN CAPITAL LETTER R WITH ACUTE +0155;0155;0072 0301;0155;0072 0301; # (ŕ; ŕ; r◌́; ŕ; r◌́; ) LATIN SMALL LETTER R WITH ACUTE +0156;0156;0052 0327;0156;0052 0327; # (Ŗ; Ŗ; R◌̧; Ŗ; R◌̧; ) LATIN CAPITAL LETTER R WITH CEDILLA +0157;0157;0072 0327;0157;0072 0327; # (ŗ; ŗ; r◌̧; ŗ; r◌̧; ) LATIN SMALL LETTER R WITH CEDILLA +0158;0158;0052 030C;0158;0052 030C; # (Ř; Ř; R◌̌; Ř; R◌̌; ) LATIN CAPITAL LETTER R WITH CARON +0159;0159;0072 030C;0159;0072 030C; # (ř; ř; r◌̌; ř; r◌̌; ) LATIN SMALL LETTER R WITH CARON +015A;015A;0053 0301;015A;0053 0301; # (Ś; Ś; S◌́; Ś; S◌́; ) LATIN CAPITAL LETTER S WITH ACUTE +015B;015B;0073 0301;015B;0073 0301; # (ś; ś; s◌́; ś; s◌́; ) LATIN SMALL LETTER S WITH ACUTE +015C;015C;0053 0302;015C;0053 0302; # (Ŝ; Ŝ; S◌̂; Ŝ; S◌̂; ) LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015D;015D;0073 0302;015D;0073 0302; # (ŝ; ŝ; s◌̂; ŝ; s◌̂; ) LATIN SMALL LETTER S WITH CIRCUMFLEX +015E;015E;0053 0327;015E;0053 0327; # (Ş; Ş; S◌̧; Ş; S◌̧; ) LATIN CAPITAL LETTER S WITH CEDILLA +015F;015F;0073 0327;015F;0073 0327; # (ş; ş; s◌̧; ş; s◌̧; ) LATIN SMALL LETTER S WITH CEDILLA +0160;0160;0053 030C;0160;0053 030C; # (Š; Š; S◌̌; Š; S◌̌; ) LATIN CAPITAL LETTER S WITH CARON +0161;0161;0073 030C;0161;0073 030C; # (š; š; s◌̌; š; s◌̌; ) LATIN SMALL LETTER S WITH CARON +0162;0162;0054 0327;0162;0054 0327; # (Ţ; Ţ; T◌̧; Ţ; T◌̧; ) LATIN CAPITAL LETTER T WITH CEDILLA +0163;0163;0074 0327;0163;0074 0327; # (ţ; ţ; t◌̧; ţ; t◌̧; ) LATIN SMALL LETTER T WITH CEDILLA +0164;0164;0054 030C;0164;0054 030C; # (Ť; Ť; T◌̌; Ť; T◌̌; ) LATIN CAPITAL LETTER T WITH CARON +0165;0165;0074 030C;0165;0074 030C; # (ť; ť; t◌̌; ť; t◌̌; ) LATIN SMALL LETTER T WITH CARON +0168;0168;0055 0303;0168;0055 0303; # (Ũ; Ũ; U◌̃; Ũ; U◌̃; ) LATIN CAPITAL LETTER U WITH TILDE +0169;0169;0075 0303;0169;0075 0303; # (ũ; ũ; u◌̃; ũ; u◌̃; ) LATIN SMALL LETTER U WITH TILDE +016A;016A;0055 0304;016A;0055 0304; # (Ū; Ū; U◌̄; Ū; U◌̄; ) LATIN CAPITAL LETTER U WITH MACRON +016B;016B;0075 0304;016B;0075 0304; # (ū; ū; u◌̄; ū; u◌̄; ) LATIN SMALL LETTER U WITH MACRON +016C;016C;0055 0306;016C;0055 0306; # (Ŭ; Ŭ; U◌̆; Ŭ; U◌̆; ) LATIN CAPITAL LETTER U WITH BREVE +016D;016D;0075 0306;016D;0075 0306; # (ŭ; ŭ; u◌̆; ŭ; u◌̆; ) LATIN SMALL LETTER U WITH BREVE +016E;016E;0055 030A;016E;0055 030A; # (Ů; Ů; U◌̊; Ů; U◌̊; ) LATIN CAPITAL LETTER U WITH RING ABOVE +016F;016F;0075 030A;016F;0075 030A; # (ů; ů; u◌̊; ů; u◌̊; ) LATIN SMALL LETTER U WITH RING ABOVE +0170;0170;0055 030B;0170;0055 030B; # (Ű; Ű; U◌̋; Ű; U◌̋; ) LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0171;0171;0075 030B;0171;0075 030B; # (ű; ű; u◌̋; ű; u◌̋; ) LATIN SMALL LETTER U WITH DOUBLE ACUTE +0172;0172;0055 0328;0172;0055 0328; # (Ų; Ų; U◌̨; Ų; U◌̨; ) LATIN CAPITAL LETTER U WITH OGONEK +0173;0173;0075 0328;0173;0075 0328; # (ų; ų; u◌̨; ų; u◌̨; ) LATIN SMALL LETTER U WITH OGONEK +0174;0174;0057 0302;0174;0057 0302; # (Ŵ; Ŵ; W◌̂; Ŵ; W◌̂; ) LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0175;0175;0077 0302;0175;0077 0302; # (ŵ; ŵ; w◌̂; ŵ; w◌̂; ) LATIN SMALL LETTER W WITH CIRCUMFLEX +0176;0176;0059 0302;0176;0059 0302; # (Ŷ; Ŷ; Y◌̂; Ŷ; Y◌̂; ) LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0177;0177;0079 0302;0177;0079 0302; # (ŷ; ŷ; y◌̂; ŷ; y◌̂; ) LATIN SMALL LETTER Y WITH CIRCUMFLEX +0178;0178;0059 0308;0178;0059 0308; # (Ÿ; Ÿ; Y◌̈; Ÿ; Y◌̈; ) LATIN CAPITAL LETTER Y WITH DIAERESIS +0179;0179;005A 0301;0179;005A 0301; # (Ź; Ź; Z◌́; Ź; Z◌́; ) LATIN CAPITAL LETTER Z WITH ACUTE +017A;017A;007A 0301;017A;007A 0301; # (ź; ź; z◌́; ź; z◌́; ) LATIN SMALL LETTER Z WITH ACUTE +017B;017B;005A 0307;017B;005A 0307; # (Ż; Ż; Z◌̇; Ż; Z◌̇; ) LATIN CAPITAL LETTER Z WITH DOT ABOVE +017C;017C;007A 0307;017C;007A 0307; # (ż; ż; z◌̇; ż; z◌̇; ) LATIN SMALL LETTER Z WITH DOT ABOVE +017D;017D;005A 030C;017D;005A 030C; # (Ž; Ž; Z◌̌; Ž; Z◌̌; ) LATIN CAPITAL LETTER Z WITH CARON +017E;017E;007A 030C;017E;007A 030C; # (ž; ž; z◌̌; ž; z◌̌; ) LATIN SMALL LETTER Z WITH CARON +017F;017F;017F;0073;0073; # (ſ; ſ; ſ; s; s; ) LATIN SMALL LETTER LONG S +01A0;01A0;004F 031B;01A0;004F 031B; # (Ơ; Ơ; O◌̛; Ơ; O◌̛; ) LATIN CAPITAL LETTER O WITH HORN +01A1;01A1;006F 031B;01A1;006F 031B; # (ơ; ơ; o◌̛; ơ; o◌̛; ) LATIN SMALL LETTER O WITH HORN +01AF;01AF;0055 031B;01AF;0055 031B; # (Ư; Ư; U◌̛; Ư; U◌̛; ) LATIN CAPITAL LETTER U WITH HORN +01B0;01B0;0075 031B;01B0;0075 031B; # (ư; ư; u◌̛; ư; u◌̛; ) LATIN SMALL LETTER U WITH HORN +01C4;01C4;01C4;0044 017D;0044 005A 030C; # (DŽ; DŽ; DŽ; DŽ; DZ◌̌; ) LATIN CAPITAL LETTER DZ WITH CARON +01C5;01C5;01C5;0044 017E;0044 007A 030C; # (Dž; Dž; Dž; Dž; Dz◌̌; ) LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C6;01C6;01C6;0064 017E;0064 007A 030C; # (dž; dž; dž; dž; dz◌̌; ) LATIN SMALL LETTER DZ WITH CARON +01C7;01C7;01C7;004C 004A;004C 004A; # (LJ; LJ; LJ; LJ; LJ; ) LATIN CAPITAL LETTER LJ +01C8;01C8;01C8;004C 006A;004C 006A; # (Lj; Lj; Lj; Lj; Lj; ) LATIN CAPITAL LETTER L WITH SMALL LETTER J +01C9;01C9;01C9;006C 006A;006C 006A; # (lj; lj; lj; lj; lj; ) LATIN SMALL LETTER LJ +01CA;01CA;01CA;004E 004A;004E 004A; # (NJ; NJ; NJ; NJ; NJ; ) LATIN CAPITAL LETTER NJ +01CB;01CB;01CB;004E 006A;004E 006A; # (Nj; Nj; Nj; Nj; Nj; ) LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CC;01CC;01CC;006E 006A;006E 006A; # (nj; nj; nj; nj; nj; ) LATIN SMALL LETTER NJ +01CD;01CD;0041 030C;01CD;0041 030C; # (Ǎ; Ǎ; A◌̌; Ǎ; A◌̌; ) LATIN CAPITAL LETTER A WITH CARON +01CE;01CE;0061 030C;01CE;0061 030C; # (ǎ; ǎ; a◌̌; ǎ; a◌̌; ) LATIN SMALL LETTER A WITH CARON +01CF;01CF;0049 030C;01CF;0049 030C; # (Ǐ; Ǐ; I◌̌; Ǐ; I◌̌; ) LATIN CAPITAL LETTER I WITH CARON +01D0;01D0;0069 030C;01D0;0069 030C; # (ǐ; ǐ; i◌̌; ǐ; i◌̌; ) LATIN SMALL LETTER I WITH CARON +01D1;01D1;004F 030C;01D1;004F 030C; # (Ǒ; Ǒ; O◌̌; Ǒ; O◌̌; ) LATIN CAPITAL LETTER O WITH CARON +01D2;01D2;006F 030C;01D2;006F 030C; # (ǒ; ǒ; o◌̌; ǒ; o◌̌; ) LATIN SMALL LETTER O WITH CARON +01D3;01D3;0055 030C;01D3;0055 030C; # (Ǔ; Ǔ; U◌̌; Ǔ; U◌̌; ) LATIN CAPITAL LETTER U WITH CARON +01D4;01D4;0075 030C;01D4;0075 030C; # (ǔ; ǔ; u◌̌; ǔ; u◌̌; ) LATIN SMALL LETTER U WITH CARON +01D5;01D5;0055 0308 0304;01D5;0055 0308 0304; # (Ǖ; Ǖ; U◌̈◌̄; Ǖ; U◌̈◌̄; ) LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D6;01D6;0075 0308 0304;01D6;0075 0308 0304; # (ǖ; ǖ; u◌̈◌̄; ǖ; u◌̈◌̄; ) LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D7;01D7;0055 0308 0301;01D7;0055 0308 0301; # (Ǘ; Ǘ; U◌̈◌́; Ǘ; U◌̈◌́; ) LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D8;01D8;0075 0308 0301;01D8;0075 0308 0301; # (ǘ; ǘ; u◌̈◌́; ǘ; u◌̈◌́; ) LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D9;01D9;0055 0308 030C;01D9;0055 0308 030C; # (Ǚ; Ǚ; U◌̈◌̌; Ǚ; U◌̈◌̌; ) LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DA;01DA;0075 0308 030C;01DA;0075 0308 030C; # (ǚ; ǚ; u◌̈◌̌; ǚ; u◌̈◌̌; ) LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DB;01DB;0055 0308 0300;01DB;0055 0308 0300; # (Ǜ; Ǜ; U◌̈◌̀; Ǜ; U◌̈◌̀; ) LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DC;01DC;0075 0308 0300;01DC;0075 0308 0300; # (ǜ; ǜ; u◌̈◌̀; ǜ; u◌̈◌̀; ) LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DE;01DE;0041 0308 0304;01DE;0041 0308 0304; # (Ǟ; Ǟ; A◌̈◌̄; Ǟ; A◌̈◌̄; ) LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01DF;01DF;0061 0308 0304;01DF;0061 0308 0304; # (ǟ; ǟ; a◌̈◌̄; ǟ; a◌̈◌̄; ) LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +01E0;01E0;0041 0307 0304;01E0;0041 0307 0304; # (Ǡ; Ǡ; A◌̇◌̄; Ǡ; A◌̇◌̄; ) LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E1;01E1;0061 0307 0304;01E1;0061 0307 0304; # (ǡ; ǡ; a◌̇◌̄; ǡ; a◌̇◌̄; ) LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +01E2;01E2;00C6 0304;01E2;00C6 0304; # (Ǣ; Ǣ; Æ◌̄; Ǣ; Æ◌̄; ) LATIN CAPITAL LETTER AE WITH MACRON +01E3;01E3;00E6 0304;01E3;00E6 0304; # (ǣ; ǣ; æ◌̄; ǣ; æ◌̄; ) LATIN SMALL LETTER AE WITH MACRON +01E6;01E6;0047 030C;01E6;0047 030C; # (Ǧ; Ǧ; G◌̌; Ǧ; G◌̌; ) LATIN CAPITAL LETTER G WITH CARON +01E7;01E7;0067 030C;01E7;0067 030C; # (ǧ; ǧ; g◌̌; ǧ; g◌̌; ) LATIN SMALL LETTER G WITH CARON +01E8;01E8;004B 030C;01E8;004B 030C; # (Ǩ; Ǩ; K◌̌; Ǩ; K◌̌; ) LATIN CAPITAL LETTER K WITH CARON +01E9;01E9;006B 030C;01E9;006B 030C; # (ǩ; ǩ; k◌̌; ǩ; k◌̌; ) LATIN SMALL LETTER K WITH CARON +01EA;01EA;004F 0328;01EA;004F 0328; # (Ǫ; Ǫ; O◌̨; Ǫ; O◌̨; ) LATIN CAPITAL LETTER O WITH OGONEK +01EB;01EB;006F 0328;01EB;006F 0328; # (ǫ; ǫ; o◌̨; ǫ; o◌̨; ) LATIN SMALL LETTER O WITH OGONEK +01EC;01EC;004F 0328 0304;01EC;004F 0328 0304; # (Ǭ; Ǭ; O◌̨◌̄; Ǭ; O◌̨◌̄; ) LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01ED;01ED;006F 0328 0304;01ED;006F 0328 0304; # (ǭ; ǭ; o◌̨◌̄; ǭ; o◌̨◌̄; ) LATIN SMALL LETTER O WITH OGONEK AND MACRON +01EE;01EE;01B7 030C;01EE;01B7 030C; # (Ǯ; Ǯ; Ʒ◌̌; Ǯ; Ʒ◌̌; ) LATIN CAPITAL LETTER EZH WITH CARON +01EF;01EF;0292 030C;01EF;0292 030C; # (ǯ; ǯ; ʒ◌̌; ǯ; ʒ◌̌; ) LATIN SMALL LETTER EZH WITH CARON +01F0;01F0;006A 030C;01F0;006A 030C; # (ǰ; ǰ; j◌̌; ǰ; j◌̌; ) LATIN SMALL LETTER J WITH CARON +01F1;01F1;01F1;0044 005A;0044 005A; # (DZ; DZ; DZ; DZ; DZ; ) LATIN CAPITAL LETTER DZ +01F2;01F2;01F2;0044 007A;0044 007A; # (Dz; Dz; Dz; Dz; Dz; ) LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F3;01F3;01F3;0064 007A;0064 007A; # (dz; dz; dz; dz; dz; ) LATIN SMALL LETTER DZ +01F4;01F4;0047 0301;01F4;0047 0301; # (Ǵ; Ǵ; G◌́; Ǵ; G◌́; ) LATIN CAPITAL LETTER G WITH ACUTE +01F5;01F5;0067 0301;01F5;0067 0301; # (ǵ; ǵ; g◌́; ǵ; g◌́; ) LATIN SMALL LETTER G WITH ACUTE +01F8;01F8;004E 0300;01F8;004E 0300; # (Ǹ; Ǹ; N◌̀; Ǹ; N◌̀; ) LATIN CAPITAL LETTER N WITH GRAVE +01F9;01F9;006E 0300;01F9;006E 0300; # (ǹ; ǹ; n◌̀; ǹ; n◌̀; ) LATIN SMALL LETTER N WITH GRAVE +01FA;01FA;0041 030A 0301;01FA;0041 030A 0301; # (Ǻ; Ǻ; A◌̊◌́; Ǻ; A◌̊◌́; ) LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FB;01FB;0061 030A 0301;01FB;0061 030A 0301; # (ǻ; ǻ; a◌̊◌́; ǻ; a◌̊◌́; ) LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +01FC;01FC;00C6 0301;01FC;00C6 0301; # (Ǽ; Ǽ; Æ◌́; Ǽ; Æ◌́; ) LATIN CAPITAL LETTER AE WITH ACUTE +01FD;01FD;00E6 0301;01FD;00E6 0301; # (ǽ; ǽ; æ◌́; ǽ; æ◌́; ) LATIN SMALL LETTER AE WITH ACUTE +01FE;01FE;00D8 0301;01FE;00D8 0301; # (Ǿ; Ǿ; Ø◌́; Ǿ; Ø◌́; ) LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +01FF;01FF;00F8 0301;01FF;00F8 0301; # (ǿ; ǿ; ø◌́; ǿ; ø◌́; ) LATIN SMALL LETTER O WITH STROKE AND ACUTE +0200;0200;0041 030F;0200;0041 030F; # (Ȁ; Ȁ; A◌̏; Ȁ; A◌̏; ) LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0201;0201;0061 030F;0201;0061 030F; # (ȁ; ȁ; a◌̏; ȁ; a◌̏; ) LATIN SMALL LETTER A WITH DOUBLE GRAVE +0202;0202;0041 0311;0202;0041 0311; # (Ȃ; Ȃ; A◌̑; Ȃ; A◌̑; ) LATIN CAPITAL LETTER A WITH INVERTED BREVE +0203;0203;0061 0311;0203;0061 0311; # (ȃ; ȃ; a◌̑; ȃ; a◌̑; ) LATIN SMALL LETTER A WITH INVERTED BREVE +0204;0204;0045 030F;0204;0045 030F; # (Ȅ; Ȅ; E◌̏; Ȅ; E◌̏; ) LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0205;0205;0065 030F;0205;0065 030F; # (ȅ; ȅ; e◌̏; ȅ; e◌̏; ) LATIN SMALL LETTER E WITH DOUBLE GRAVE +0206;0206;0045 0311;0206;0045 0311; # (Ȇ; Ȇ; E◌̑; Ȇ; E◌̑; ) LATIN CAPITAL LETTER E WITH INVERTED BREVE +0207;0207;0065 0311;0207;0065 0311; # (ȇ; ȇ; e◌̑; ȇ; e◌̑; ) LATIN SMALL LETTER E WITH INVERTED BREVE +0208;0208;0049 030F;0208;0049 030F; # (Ȉ; Ȉ; I◌̏; Ȉ; I◌̏; ) LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +0209;0209;0069 030F;0209;0069 030F; # (ȉ; ȉ; i◌̏; ȉ; i◌̏; ) LATIN SMALL LETTER I WITH DOUBLE GRAVE +020A;020A;0049 0311;020A;0049 0311; # (Ȋ; Ȋ; I◌̑; Ȋ; I◌̑; ) LATIN CAPITAL LETTER I WITH INVERTED BREVE +020B;020B;0069 0311;020B;0069 0311; # (ȋ; ȋ; i◌̑; ȋ; i◌̑; ) LATIN SMALL LETTER I WITH INVERTED BREVE +020C;020C;004F 030F;020C;004F 030F; # (Ȍ; Ȍ; O◌̏; Ȍ; O◌̏; ) LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020D;020D;006F 030F;020D;006F 030F; # (ȍ; ȍ; o◌̏; ȍ; o◌̏; ) LATIN SMALL LETTER O WITH DOUBLE GRAVE +020E;020E;004F 0311;020E;004F 0311; # (Ȏ; Ȏ; O◌̑; Ȏ; O◌̑; ) LATIN CAPITAL LETTER O WITH INVERTED BREVE +020F;020F;006F 0311;020F;006F 0311; # (ȏ; ȏ; o◌̑; ȏ; o◌̑; ) LATIN SMALL LETTER O WITH INVERTED BREVE +0210;0210;0052 030F;0210;0052 030F; # (Ȑ; Ȑ; R◌̏; Ȑ; R◌̏; ) LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0211;0211;0072 030F;0211;0072 030F; # (ȑ; ȑ; r◌̏; ȑ; r◌̏; ) LATIN SMALL LETTER R WITH DOUBLE GRAVE +0212;0212;0052 0311;0212;0052 0311; # (Ȓ; Ȓ; R◌̑; Ȓ; R◌̑; ) LATIN CAPITAL LETTER R WITH INVERTED BREVE +0213;0213;0072 0311;0213;0072 0311; # (ȓ; ȓ; r◌̑; ȓ; r◌̑; ) LATIN SMALL LETTER R WITH INVERTED BREVE +0214;0214;0055 030F;0214;0055 030F; # (Ȕ; Ȕ; U◌̏; Ȕ; U◌̏; ) LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0215;0215;0075 030F;0215;0075 030F; # (ȕ; ȕ; u◌̏; ȕ; u◌̏; ) LATIN SMALL LETTER U WITH DOUBLE GRAVE +0216;0216;0055 0311;0216;0055 0311; # (Ȗ; Ȗ; U◌̑; Ȗ; U◌̑; ) LATIN CAPITAL LETTER U WITH INVERTED BREVE +0217;0217;0075 0311;0217;0075 0311; # (ȗ; ȗ; u◌̑; ȗ; u◌̑; ) LATIN SMALL LETTER U WITH INVERTED BREVE +0218;0218;0053 0326;0218;0053 0326; # (Ș; Ș; S◌̦; Ș; S◌̦; ) LATIN CAPITAL LETTER S WITH COMMA BELOW +0219;0219;0073 0326;0219;0073 0326; # (ș; ș; s◌̦; ș; s◌̦; ) LATIN SMALL LETTER S WITH COMMA BELOW +021A;021A;0054 0326;021A;0054 0326; # (Ț; Ț; T◌̦; Ț; T◌̦; ) LATIN CAPITAL LETTER T WITH COMMA BELOW +021B;021B;0074 0326;021B;0074 0326; # (ț; ț; t◌̦; ț; t◌̦; ) LATIN SMALL LETTER T WITH COMMA BELOW +021E;021E;0048 030C;021E;0048 030C; # (Ȟ; Ȟ; H◌̌; Ȟ; H◌̌; ) LATIN CAPITAL LETTER H WITH CARON +021F;021F;0068 030C;021F;0068 030C; # (ȟ; ȟ; h◌̌; ȟ; h◌̌; ) LATIN SMALL LETTER H WITH CARON +0226;0226;0041 0307;0226;0041 0307; # (Ȧ; Ȧ; A◌̇; Ȧ; A◌̇; ) LATIN CAPITAL LETTER A WITH DOT ABOVE +0227;0227;0061 0307;0227;0061 0307; # (ȧ; ȧ; a◌̇; ȧ; a◌̇; ) LATIN SMALL LETTER A WITH DOT ABOVE +0228;0228;0045 0327;0228;0045 0327; # (Ȩ; Ȩ; E◌̧; Ȩ; E◌̧; ) LATIN CAPITAL LETTER E WITH CEDILLA +0229;0229;0065 0327;0229;0065 0327; # (ȩ; ȩ; e◌̧; ȩ; e◌̧; ) LATIN SMALL LETTER E WITH CEDILLA +022A;022A;004F 0308 0304;022A;004F 0308 0304; # (Ȫ; Ȫ; O◌̈◌̄; Ȫ; O◌̈◌̄; ) LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022B;022B;006F 0308 0304;022B;006F 0308 0304; # (ȫ; ȫ; o◌̈◌̄; ȫ; o◌̈◌̄; ) LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +022C;022C;004F 0303 0304;022C;004F 0303 0304; # (Ȭ; Ȭ; O◌̃◌̄; Ȭ; O◌̃◌̄; ) LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022D;022D;006F 0303 0304;022D;006F 0303 0304; # (ȭ; ȭ; o◌̃◌̄; ȭ; o◌̃◌̄; ) LATIN SMALL LETTER O WITH TILDE AND MACRON +022E;022E;004F 0307;022E;004F 0307; # (Ȯ; Ȯ; O◌̇; Ȯ; O◌̇; ) LATIN CAPITAL LETTER O WITH DOT ABOVE +022F;022F;006F 0307;022F;006F 0307; # (ȯ; ȯ; o◌̇; ȯ; o◌̇; ) LATIN SMALL LETTER O WITH DOT ABOVE +0230;0230;004F 0307 0304;0230;004F 0307 0304; # (Ȱ; Ȱ; O◌̇◌̄; Ȱ; O◌̇◌̄; ) LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0231;0231;006F 0307 0304;0231;006F 0307 0304; # (ȱ; ȱ; o◌̇◌̄; ȱ; o◌̇◌̄; ) LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +0232;0232;0059 0304;0232;0059 0304; # (Ȳ; Ȳ; Y◌̄; Ȳ; Y◌̄; ) LATIN CAPITAL LETTER Y WITH MACRON +0233;0233;0079 0304;0233;0079 0304; # (ȳ; ȳ; y◌̄; ȳ; y◌̄; ) LATIN SMALL LETTER Y WITH MACRON +02B0;02B0;02B0;0068;0068; # (ʰ; ʰ; ʰ; h; h; ) MODIFIER LETTER SMALL H +02B1;02B1;02B1;0266;0266; # (ʱ; ʱ; ʱ; ɦ; ɦ; ) MODIFIER LETTER SMALL H WITH HOOK +02B2;02B2;02B2;006A;006A; # (ʲ; ʲ; ʲ; j; j; ) MODIFIER LETTER SMALL J +02B3;02B3;02B3;0072;0072; # (ʳ; ʳ; ʳ; r; r; ) MODIFIER LETTER SMALL R +02B4;02B4;02B4;0279;0279; # (ʴ; ʴ; ʴ; ɹ; ɹ; ) MODIFIER LETTER SMALL TURNED R +02B5;02B5;02B5;027B;027B; # (ʵ; ʵ; ʵ; ɻ; ɻ; ) MODIFIER LETTER SMALL TURNED R WITH HOOK +02B6;02B6;02B6;0281;0281; # (ʶ; ʶ; ʶ; ʁ; ʁ; ) MODIFIER LETTER SMALL CAPITAL INVERTED R +02B7;02B7;02B7;0077;0077; # (ʷ; ʷ; ʷ; w; w; ) MODIFIER LETTER SMALL W +02B8;02B8;02B8;0079;0079; # (ʸ; ʸ; ʸ; y; y; ) MODIFIER LETTER SMALL Y +02D8;02D8;02D8;0020 0306;0020 0306; # (˘; ˘; ˘; ◌̆; ◌̆; ) BREVE +02D9;02D9;02D9;0020 0307;0020 0307; # (˙; ˙; ˙; ◌̇; ◌̇; ) DOT ABOVE +02DA;02DA;02DA;0020 030A;0020 030A; # (˚; ˚; ˚; ◌̊; ◌̊; ) RING ABOVE +02DB;02DB;02DB;0020 0328;0020 0328; # (˛; ˛; ˛; ◌̨; ◌̨; ) OGONEK +02DC;02DC;02DC;0020 0303;0020 0303; # (˜; ˜; ˜; ◌̃; ◌̃; ) SMALL TILDE +02DD;02DD;02DD;0020 030B;0020 030B; # (˝; ˝; ˝; ◌̋; ◌̋; ) DOUBLE ACUTE ACCENT +02E0;02E0;02E0;0263;0263; # (ˠ; ˠ; ˠ; ɣ; ɣ; ) MODIFIER LETTER SMALL GAMMA +02E1;02E1;02E1;006C;006C; # (ˡ; ˡ; ˡ; l; l; ) MODIFIER LETTER SMALL L +02E2;02E2;02E2;0073;0073; # (ˢ; ˢ; ˢ; s; s; ) MODIFIER LETTER SMALL S +02E3;02E3;02E3;0078;0078; # (ˣ; ˣ; ˣ; x; x; ) MODIFIER LETTER SMALL X +02E4;02E4;02E4;0295;0295; # (ˤ; ˤ; ˤ; ʕ; ʕ; ) MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +0340;0300;0300;0300;0300; # (◌̀; ◌̀; ◌̀; ◌̀; ◌̀; ) COMBINING GRAVE TONE MARK +0341;0301;0301;0301;0301; # (◌́; ◌́; ◌́; ◌́; ◌́; ) COMBINING ACUTE TONE MARK +0343;0313;0313;0313;0313; # (◌̓; ◌̓; ◌̓; ◌̓; ◌̓; ) COMBINING GREEK KORONIS +0344;0308 0301;0308 0301;0308 0301;0308 0301; # (◌̈́; ◌̈◌́; ◌̈◌́; ◌̈◌́; ◌̈◌́; ) COMBINING GREEK DIALYTIKA TONOS +0374;02B9;02B9;02B9;02B9; # (ʹ; ʹ; ʹ; ʹ; ʹ; ) GREEK NUMERAL SIGN +037A;037A;037A;0020 0345;0020 0345; # (ͺ; ͺ; ͺ; ◌ͅ; ◌ͅ; ) GREEK YPOGEGRAMMENI +037E;003B;003B;003B;003B; # (;; ;; ;; ;; ;; ) GREEK QUESTION MARK +0384;0384;0384;0020 0301;0020 0301; # (΄; ΄; ΄; ◌́; ◌́; ) GREEK TONOS +0385;0385;00A8 0301;0020 0308 0301;0020 0308 0301; # (΅; ΅; ¨◌́; ◌̈◌́; ◌̈◌́; ) GREEK DIALYTIKA TONOS +0386;0386;0391 0301;0386;0391 0301; # (Ά; Ά; Α◌́; Ά; Α◌́; ) GREEK CAPITAL LETTER ALPHA WITH TONOS +0387;00B7;00B7;00B7;00B7; # (·; ·; ·; ·; ·; ) GREEK ANO TELEIA +0388;0388;0395 0301;0388;0395 0301; # (Έ; Έ; Ε◌́; Έ; Ε◌́; ) GREEK CAPITAL LETTER EPSILON WITH TONOS +0389;0389;0397 0301;0389;0397 0301; # (Ή; Ή; Η◌́; Ή; Η◌́; ) GREEK CAPITAL LETTER ETA WITH TONOS +038A;038A;0399 0301;038A;0399 0301; # (Ί; Ί; Ι◌́; Ί; Ι◌́; ) GREEK CAPITAL LETTER IOTA WITH TONOS +038C;038C;039F 0301;038C;039F 0301; # (Ό; Ό; Ο◌́; Ό; Ο◌́; ) GREEK CAPITAL LETTER OMICRON WITH TONOS +038E;038E;03A5 0301;038E;03A5 0301; # (Ύ; Ύ; Υ◌́; Ύ; Υ◌́; ) GREEK CAPITAL LETTER UPSILON WITH TONOS +038F;038F;03A9 0301;038F;03A9 0301; # (Ώ; Ώ; Ω◌́; Ώ; Ω◌́; ) GREEK CAPITAL LETTER OMEGA WITH TONOS +0390;0390;03B9 0308 0301;0390;03B9 0308 0301; # (ΐ; ΐ; ι◌̈◌́; ΐ; ι◌̈◌́; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03AA;03AA;0399 0308;03AA;0399 0308; # (Ϊ; Ϊ; Ι◌̈; Ϊ; Ι◌̈; ) GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB;03AB;03A5 0308;03AB;03A5 0308; # (Ϋ; Ϋ; Υ◌̈; Ϋ; Υ◌̈; ) GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03AC;03AC;03B1 0301;03AC;03B1 0301; # (ά; ά; α◌́; ά; α◌́; ) GREEK SMALL LETTER ALPHA WITH TONOS +03AD;03AD;03B5 0301;03AD;03B5 0301; # (έ; έ; ε◌́; έ; ε◌́; ) GREEK SMALL LETTER EPSILON WITH TONOS +03AE;03AE;03B7 0301;03AE;03B7 0301; # (ή; ή; η◌́; ή; η◌́; ) GREEK SMALL LETTER ETA WITH TONOS +03AF;03AF;03B9 0301;03AF;03B9 0301; # (ί; ί; ι◌́; ί; ι◌́; ) GREEK SMALL LETTER IOTA WITH TONOS +03B0;03B0;03C5 0308 0301;03B0;03C5 0308 0301; # (ΰ; ΰ; υ◌̈◌́; ΰ; υ◌̈◌́; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03CA;03CA;03B9 0308;03CA;03B9 0308; # (ϊ; ϊ; ι◌̈; ϊ; ι◌̈; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA +03CB;03CB;03C5 0308;03CB;03C5 0308; # (ϋ; ϋ; υ◌̈; ϋ; υ◌̈; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA +03CC;03CC;03BF 0301;03CC;03BF 0301; # (ό; ό; ο◌́; ό; ο◌́; ) GREEK SMALL LETTER OMICRON WITH TONOS +03CD;03CD;03C5 0301;03CD;03C5 0301; # (ύ; ύ; υ◌́; ύ; υ◌́; ) GREEK SMALL LETTER UPSILON WITH TONOS +03CE;03CE;03C9 0301;03CE;03C9 0301; # (ώ; ώ; ω◌́; ώ; ω◌́; ) GREEK SMALL LETTER OMEGA WITH TONOS +03D0;03D0;03D0;03B2;03B2; # (ϐ; ϐ; ϐ; β; β; ) GREEK BETA SYMBOL +03D1;03D1;03D1;03B8;03B8; # (ϑ; ϑ; ϑ; θ; θ; ) GREEK THETA SYMBOL +03D2;03D2;03D2;03A5;03A5; # (ϒ; ϒ; ϒ; Υ; Υ; ) GREEK UPSILON WITH HOOK SYMBOL +03D3;03D3;03D2 0301;038E;03A5 0301; # (ϓ; ϓ; ϒ◌́; Ύ; Υ◌́; ) GREEK UPSILON WITH ACUTE AND HOOK SYMBOL +03D4;03D4;03D2 0308;03AB;03A5 0308; # (ϔ; ϔ; ϒ◌̈; Ϋ; Υ◌̈; ) GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +03D5;03D5;03D5;03C6;03C6; # (ϕ; ϕ; ϕ; φ; φ; ) GREEK PHI SYMBOL +03D6;03D6;03D6;03C0;03C0; # (ϖ; ϖ; ϖ; π; π; ) GREEK PI SYMBOL +03F0;03F0;03F0;03BA;03BA; # (ϰ; ϰ; ϰ; κ; κ; ) GREEK KAPPA SYMBOL +03F1;03F1;03F1;03C1;03C1; # (ϱ; ϱ; ϱ; ρ; ρ; ) GREEK RHO SYMBOL +03F2;03F2;03F2;03C2;03C2; # (ϲ; ϲ; ϲ; ς; ς; ) GREEK LUNATE SIGMA SYMBOL +03F4;03F4;03F4;0398;0398; # (ϴ; ϴ; ϴ; Θ; Θ; ) GREEK CAPITAL THETA SYMBOL +03F5;03F5;03F5;03B5;03B5; # (ϵ; ϵ; ϵ; ε; ε; ) GREEK LUNATE EPSILON SYMBOL +03F9;03F9;03F9;03A3;03A3; # (Ϲ; Ϲ; Ϲ; Σ; Σ; ) GREEK CAPITAL LUNATE SIGMA SYMBOL +0400;0400;0415 0300;0400;0415 0300; # (Ѐ; Ѐ; Е◌̀; Ѐ; Е◌̀; ) CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401;0401;0415 0308;0401;0415 0308; # (Ё; Ё; Е◌̈; Ё; Е◌̈; ) CYRILLIC CAPITAL LETTER IO +0403;0403;0413 0301;0403;0413 0301; # (Ѓ; Ѓ; Г◌́; Ѓ; Г◌́; ) CYRILLIC CAPITAL LETTER GJE +0407;0407;0406 0308;0407;0406 0308; # (Ї; Ї; І◌̈; Ї; І◌̈; ) CYRILLIC CAPITAL LETTER YI +040C;040C;041A 0301;040C;041A 0301; # (Ќ; Ќ; К◌́; Ќ; К◌́; ) CYRILLIC CAPITAL LETTER KJE +040D;040D;0418 0300;040D;0418 0300; # (Ѝ; Ѝ; И◌̀; Ѝ; И◌̀; ) CYRILLIC CAPITAL LETTER I WITH GRAVE +040E;040E;0423 0306;040E;0423 0306; # (Ў; Ў; У◌̆; Ў; У◌̆; ) CYRILLIC CAPITAL LETTER SHORT U +0419;0419;0418 0306;0419;0418 0306; # (Й; Й; И◌̆; Й; И◌̆; ) CYRILLIC CAPITAL LETTER SHORT I +0439;0439;0438 0306;0439;0438 0306; # (й; й; и◌̆; й; и◌̆; ) CYRILLIC SMALL LETTER SHORT I +0450;0450;0435 0300;0450;0435 0300; # (ѐ; ѐ; е◌̀; ѐ; е◌̀; ) CYRILLIC SMALL LETTER IE WITH GRAVE +0451;0451;0435 0308;0451;0435 0308; # (ё; ё; е◌̈; ё; е◌̈; ) CYRILLIC SMALL LETTER IO +0453;0453;0433 0301;0453;0433 0301; # (ѓ; ѓ; г◌́; ѓ; г◌́; ) CYRILLIC SMALL LETTER GJE +0457;0457;0456 0308;0457;0456 0308; # (ї; ї; і◌̈; ї; і◌̈; ) CYRILLIC SMALL LETTER YI +045C;045C;043A 0301;045C;043A 0301; # (ќ; ќ; к◌́; ќ; к◌́; ) CYRILLIC SMALL LETTER KJE +045D;045D;0438 0300;045D;0438 0300; # (ѝ; ѝ; и◌̀; ѝ; и◌̀; ) CYRILLIC SMALL LETTER I WITH GRAVE +045E;045E;0443 0306;045E;0443 0306; # (ў; ў; у◌̆; ў; у◌̆; ) CYRILLIC SMALL LETTER SHORT U +0476;0476;0474 030F;0476;0474 030F; # (Ѷ; Ѷ; Ѵ◌̏; Ѷ; Ѵ◌̏; ) CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0477;0477;0475 030F;0477;0475 030F; # (ѷ; ѷ; ѵ◌̏; ѷ; ѵ◌̏; ) CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +04C1;04C1;0416 0306;04C1;0416 0306; # (Ӂ; Ӂ; Ж◌̆; Ӂ; Ж◌̆; ) CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C2;04C2;0436 0306;04C2;0436 0306; # (ӂ; ӂ; ж◌̆; ӂ; ж◌̆; ) CYRILLIC SMALL LETTER ZHE WITH BREVE +04D0;04D0;0410 0306;04D0;0410 0306; # (Ӑ; Ӑ; А◌̆; Ӑ; А◌̆; ) CYRILLIC CAPITAL LETTER A WITH BREVE +04D1;04D1;0430 0306;04D1;0430 0306; # (ӑ; ӑ; а◌̆; ӑ; а◌̆; ) CYRILLIC SMALL LETTER A WITH BREVE +04D2;04D2;0410 0308;04D2;0410 0308; # (Ӓ; Ӓ; А◌̈; Ӓ; А◌̈; ) CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D3;04D3;0430 0308;04D3;0430 0308; # (ӓ; ӓ; а◌̈; ӓ; а◌̈; ) CYRILLIC SMALL LETTER A WITH DIAERESIS +04D6;04D6;0415 0306;04D6;0415 0306; # (Ӗ; Ӗ; Е◌̆; Ӗ; Е◌̆; ) CYRILLIC CAPITAL LETTER IE WITH BREVE +04D7;04D7;0435 0306;04D7;0435 0306; # (ӗ; ӗ; е◌̆; ӗ; е◌̆; ) CYRILLIC SMALL LETTER IE WITH BREVE +04DA;04DA;04D8 0308;04DA;04D8 0308; # (Ӛ; Ӛ; Ә◌̈; Ӛ; Ә◌̈; ) CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DB;04DB;04D9 0308;04DB;04D9 0308; # (ӛ; ӛ; ә◌̈; ӛ; ә◌̈; ) CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +04DC;04DC;0416 0308;04DC;0416 0308; # (Ӝ; Ӝ; Ж◌̈; Ӝ; Ж◌̈; ) CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DD;04DD;0436 0308;04DD;0436 0308; # (ӝ; ӝ; ж◌̈; ӝ; ж◌̈; ) CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +04DE;04DE;0417 0308;04DE;0417 0308; # (Ӟ; Ӟ; З◌̈; Ӟ; З◌̈; ) CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04DF;04DF;0437 0308;04DF;0437 0308; # (ӟ; ӟ; з◌̈; ӟ; з◌̈; ) CYRILLIC SMALL LETTER ZE WITH DIAERESIS +04E2;04E2;0418 0304;04E2;0418 0304; # (Ӣ; Ӣ; И◌̄; Ӣ; И◌̄; ) CYRILLIC CAPITAL LETTER I WITH MACRON +04E3;04E3;0438 0304;04E3;0438 0304; # (ӣ; ӣ; и◌̄; ӣ; и◌̄; ) CYRILLIC SMALL LETTER I WITH MACRON +04E4;04E4;0418 0308;04E4;0418 0308; # (Ӥ; Ӥ; И◌̈; Ӥ; И◌̈; ) CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E5;04E5;0438 0308;04E5;0438 0308; # (ӥ; ӥ; и◌̈; ӥ; и◌̈; ) CYRILLIC SMALL LETTER I WITH DIAERESIS +04E6;04E6;041E 0308;04E6;041E 0308; # (Ӧ; Ӧ; О◌̈; Ӧ; О◌̈; ) CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E7;04E7;043E 0308;04E7;043E 0308; # (ӧ; ӧ; о◌̈; ӧ; о◌̈; ) CYRILLIC SMALL LETTER O WITH DIAERESIS +04EA;04EA;04E8 0308;04EA;04E8 0308; # (Ӫ; Ӫ; Ө◌̈; Ӫ; Ө◌̈; ) CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EB;04EB;04E9 0308;04EB;04E9 0308; # (ӫ; ӫ; ө◌̈; ӫ; ө◌̈; ) CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +04EC;04EC;042D 0308;04EC;042D 0308; # (Ӭ; Ӭ; Э◌̈; Ӭ; Э◌̈; ) CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04ED;04ED;044D 0308;04ED;044D 0308; # (ӭ; ӭ; э◌̈; ӭ; э◌̈; ) CYRILLIC SMALL LETTER E WITH DIAERESIS +04EE;04EE;0423 0304;04EE;0423 0304; # (Ӯ; Ӯ; У◌̄; Ӯ; У◌̄; ) CYRILLIC CAPITAL LETTER U WITH MACRON +04EF;04EF;0443 0304;04EF;0443 0304; # (ӯ; ӯ; у◌̄; ӯ; у◌̄; ) CYRILLIC SMALL LETTER U WITH MACRON +04F0;04F0;0423 0308;04F0;0423 0308; # (Ӱ; Ӱ; У◌̈; Ӱ; У◌̈; ) CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F1;04F1;0443 0308;04F1;0443 0308; # (ӱ; ӱ; у◌̈; ӱ; у◌̈; ) CYRILLIC SMALL LETTER U WITH DIAERESIS +04F2;04F2;0423 030B;04F2;0423 030B; # (Ӳ; Ӳ; У◌̋; Ӳ; У◌̋; ) CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F3;04F3;0443 030B;04F3;0443 030B; # (ӳ; ӳ; у◌̋; ӳ; у◌̋; ) CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +04F4;04F4;0427 0308;04F4;0427 0308; # (Ӵ; Ӵ; Ч◌̈; Ӵ; Ч◌̈; ) CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F5;04F5;0447 0308;04F5;0447 0308; # (ӵ; ӵ; ч◌̈; ӵ; ч◌̈; ) CYRILLIC SMALL LETTER CHE WITH DIAERESIS +04F8;04F8;042B 0308;04F8;042B 0308; # (Ӹ; Ӹ; Ы◌̈; Ӹ; Ы◌̈; ) CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04F9;04F9;044B 0308;04F9;044B 0308; # (ӹ; ӹ; ы◌̈; ӹ; ы◌̈; ) CYRILLIC SMALL LETTER YERU WITH DIAERESIS +0587;0587;0587;0565 0582;0565 0582; # (և; և; և; եւ; եւ; ) ARMENIAN SMALL LIGATURE ECH YIWN +0622;0622;0627 0653;0622;0627 0653; # (آ; آ; ا◌ٓ; آ; ا◌ٓ; ) ARABIC LETTER ALEF WITH MADDA ABOVE +0623;0623;0627 0654;0623;0627 0654; # (أ; أ; ا◌ٔ; أ; ا◌ٔ; ) ARABIC LETTER ALEF WITH HAMZA ABOVE +0624;0624;0648 0654;0624;0648 0654; # (ؤ; ؤ; و◌ٔ; ؤ; و◌ٔ; ) ARABIC LETTER WAW WITH HAMZA ABOVE +0625;0625;0627 0655;0625;0627 0655; # (إ; إ; ا◌ٕ; إ; ا◌ٕ; ) ARABIC LETTER ALEF WITH HAMZA BELOW +0626;0626;064A 0654;0626;064A 0654; # (ئ; ئ; ي◌ٔ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE +0675;0675;0675;0627 0674;0627 0674; # (ٵ; ٵ; ٵ; اٴ; اٴ; ) ARABIC LETTER HIGH HAMZA ALEF +0676;0676;0676;0648 0674;0648 0674; # (ٶ; ٶ; ٶ; وٴ; وٴ; ) ARABIC LETTER HIGH HAMZA WAW +0677;0677;0677;06C7 0674;06C7 0674; # (ٷ; ٷ; ٷ; ۇٴ; ۇٴ; ) ARABIC LETTER U WITH HAMZA ABOVE +0678;0678;0678;064A 0674;064A 0674; # (ٸ; ٸ; ٸ; يٴ; يٴ; ) ARABIC LETTER HIGH HAMZA YEH +06C0;06C0;06D5 0654;06C0;06D5 0654; # (ۀ; ۀ; ە◌ٔ; ۀ; ە◌ٔ; ) ARABIC LETTER HEH WITH YEH ABOVE +06C2;06C2;06C1 0654;06C2;06C1 0654; # (ۂ; ۂ; ہ◌ٔ; ۂ; ہ◌ٔ; ) ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +06D3;06D3;06D2 0654;06D3;06D2 0654; # (ۓ; ۓ; ے◌ٔ; ۓ; ے◌ٔ; ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +0929;0929;0928 093C;0929;0928 093C; # (ऩ; ऩ; न◌़; ऩ; न◌़; ) DEVANAGARI LETTER NNNA +0931;0931;0930 093C;0931;0930 093C; # (ऱ; ऱ; र◌़; ऱ; र◌़; ) DEVANAGARI LETTER RRA +0934;0934;0933 093C;0934;0933 093C; # (ऴ; ऴ; ळ◌़; ऴ; ळ◌़; ) DEVANAGARI LETTER LLLA +0958;0915 093C;0915 093C;0915 093C;0915 093C; # (क़; क◌़; क◌़; क◌़; क◌़; ) DEVANAGARI LETTER QA +0959;0916 093C;0916 093C;0916 093C;0916 093C; # (ख़; ख◌़; ख◌़; ख◌़; ख◌़; ) DEVANAGARI LETTER KHHA +095A;0917 093C;0917 093C;0917 093C;0917 093C; # (ग़; ग◌़; ग◌़; ग◌़; ग◌़; ) DEVANAGARI LETTER GHHA +095B;091C 093C;091C 093C;091C 093C;091C 093C; # (ज़; ज◌़; ज◌़; ज◌़; ज◌़; ) DEVANAGARI LETTER ZA +095C;0921 093C;0921 093C;0921 093C;0921 093C; # (ड़; ड◌़; ड◌़; ड◌़; ड◌़; ) DEVANAGARI LETTER DDDHA +095D;0922 093C;0922 093C;0922 093C;0922 093C; # (ढ़; ढ◌़; ढ◌़; ढ◌़; ढ◌़; ) DEVANAGARI LETTER RHA +095E;092B 093C;092B 093C;092B 093C;092B 093C; # (फ़; फ◌़; फ◌़; फ◌़; फ◌़; ) DEVANAGARI LETTER FA +095F;092F 093C;092F 093C;092F 093C;092F 093C; # (य़; य◌़; य◌़; य◌़; य◌़; ) DEVANAGARI LETTER YYA +09CB;09CB;09C7 09BE;09CB;09C7 09BE; # (ো; ো; ো; ো; ো; ) BENGALI VOWEL SIGN O +09CC;09CC;09C7 09D7;09CC;09C7 09D7; # (ৌ; ৌ; ৌ; ৌ; ৌ; ) BENGALI VOWEL SIGN AU +09DC;09A1 09BC;09A1 09BC;09A1 09BC;09A1 09BC; # (ড়; ড◌়; ড◌়; ড◌়; ড◌়; ) BENGALI LETTER RRA +09DD;09A2 09BC;09A2 09BC;09A2 09BC;09A2 09BC; # (ঢ়; ঢ◌়; ঢ◌়; ঢ◌়; ঢ◌়; ) BENGALI LETTER RHA +09DF;09AF 09BC;09AF 09BC;09AF 09BC;09AF 09BC; # (য়; য◌়; য◌়; য◌়; য◌়; ) BENGALI LETTER YYA +0A33;0A32 0A3C;0A32 0A3C;0A32 0A3C;0A32 0A3C; # (ਲ਼; ਲ◌਼; ਲ◌਼; ਲ◌਼; ਲ◌਼; ) GURMUKHI LETTER LLA +0A36;0A38 0A3C;0A38 0A3C;0A38 0A3C;0A38 0A3C; # (ਸ਼; ਸ◌਼; ਸ◌਼; ਸ◌਼; ਸ◌਼; ) GURMUKHI LETTER SHA +0A59;0A16 0A3C;0A16 0A3C;0A16 0A3C;0A16 0A3C; # (ਖ਼; ਖ◌਼; ਖ◌਼; ਖ◌਼; ਖ◌਼; ) GURMUKHI LETTER KHHA +0A5A;0A17 0A3C;0A17 0A3C;0A17 0A3C;0A17 0A3C; # (ਗ਼; ਗ◌਼; ਗ◌਼; ਗ◌਼; ਗ◌਼; ) GURMUKHI LETTER GHHA +0A5B;0A1C 0A3C;0A1C 0A3C;0A1C 0A3C;0A1C 0A3C; # (ਜ਼; ਜ◌਼; ਜ◌਼; ਜ◌਼; ਜ◌਼; ) GURMUKHI LETTER ZA +0A5E;0A2B 0A3C;0A2B 0A3C;0A2B 0A3C;0A2B 0A3C; # (ਫ਼; ਫ◌਼; ਫ◌਼; ਫ◌਼; ਫ◌਼; ) GURMUKHI LETTER FA +0B48;0B48;0B47 0B56;0B48;0B47 0B56; # (ୈ; ୈ; େ◌ୖ; ୈ; େ◌ୖ; ) ORIYA VOWEL SIGN AI +0B4B;0B4B;0B47 0B3E;0B4B;0B47 0B3E; # (ୋ; ୋ; ୋ; ୋ; ୋ; ) ORIYA VOWEL SIGN O +0B4C;0B4C;0B47 0B57;0B4C;0B47 0B57; # (ୌ; ୌ; ୌ; ୌ; ୌ; ) ORIYA VOWEL SIGN AU +0B5C;0B21 0B3C;0B21 0B3C;0B21 0B3C;0B21 0B3C; # (ଡ଼; ଡ◌଼; ଡ◌଼; ଡ◌଼; ଡ◌଼; ) ORIYA LETTER RRA +0B5D;0B22 0B3C;0B22 0B3C;0B22 0B3C;0B22 0B3C; # (ଢ଼; ଢ◌଼; ଢ◌଼; ଢ◌଼; ଢ◌଼; ) ORIYA LETTER RHA +0B94;0B94;0B92 0BD7;0B94;0B92 0BD7; # (ஔ; ஔ; ஔ; ஔ; ஔ; ) TAMIL LETTER AU +0BCA;0BCA;0BC6 0BBE;0BCA;0BC6 0BBE; # (ொ; ொ; ொ; ொ; ொ; ) TAMIL VOWEL SIGN O +0BCB;0BCB;0BC7 0BBE;0BCB;0BC7 0BBE; # (ோ; ோ; ோ; ோ; ோ; ) TAMIL VOWEL SIGN OO +0BCC;0BCC;0BC6 0BD7;0BCC;0BC6 0BD7; # (ௌ; ௌ; ௌ; ௌ; ௌ; ) TAMIL VOWEL SIGN AU +0C48;0C48;0C46 0C56;0C48;0C46 0C56; # (◌ై; ◌ై; ◌ె◌ౖ; ◌ై; ◌ె◌ౖ; ) TELUGU VOWEL SIGN AI +0CC0;0CC0;0CBF 0CD5;0CC0;0CBF 0CD5; # (ೀ; ೀ; ◌ೀ; ೀ; ◌ೀ; ) KANNADA VOWEL SIGN II +0CC7;0CC7;0CC6 0CD5;0CC7;0CC6 0CD5; # (ೇ; ೇ; ◌ೇ; ೇ; ◌ೇ; ) KANNADA VOWEL SIGN EE +0CC8;0CC8;0CC6 0CD6;0CC8;0CC6 0CD6; # (ೈ; ೈ; ◌ೈ; ೈ; ◌ೈ; ) KANNADA VOWEL SIGN AI +0CCA;0CCA;0CC6 0CC2;0CCA;0CC6 0CC2; # (ೊ; ೊ; ◌ೊ; ೊ; ◌ೊ; ) KANNADA VOWEL SIGN O +0CCB;0CCB;0CC6 0CC2 0CD5;0CCB;0CC6 0CC2 0CD5; # (ೋ; ೋ; ◌ೋ; ೋ; ◌ೋ; ) KANNADA VOWEL SIGN OO +0D4A;0D4A;0D46 0D3E;0D4A;0D46 0D3E; # (ൊ; ൊ; ൊ; ൊ; ൊ; ) MALAYALAM VOWEL SIGN O +0D4B;0D4B;0D47 0D3E;0D4B;0D47 0D3E; # (ോ; ോ; ോ; ോ; ോ; ) MALAYALAM VOWEL SIGN OO +0D4C;0D4C;0D46 0D57;0D4C;0D46 0D57; # (ൌ; ൌ; ൌ; ൌ; ൌ; ) MALAYALAM VOWEL SIGN AU +0DDA;0DDA;0DD9 0DCA;0DDA;0DD9 0DCA; # (ේ; ේ; ෙ◌්; ේ; ෙ◌්; ) SINHALA VOWEL SIGN DIGA KOMBUVA +0DDC;0DDC;0DD9 0DCF;0DDC;0DD9 0DCF; # (ො; ො; ො; ො; ො; ) SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +0DDD;0DDD;0DD9 0DCF 0DCA;0DDD;0DD9 0DCF 0DCA; # (ෝ; ෝ; ො◌්; ෝ; ො◌්; ) SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +0DDE;0DDE;0DD9 0DDF;0DDE;0DD9 0DDF; # (ෞ; ෞ; ෞ; ෞ; ෞ; ) SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +0E33;0E33;0E33;0E4D 0E32;0E4D 0E32; # (ำ; ำ; ำ; ◌ํา; ◌ํา; ) THAI CHARACTER SARA AM +0EB3;0EB3;0EB3;0ECD 0EB2;0ECD 0EB2; # (ຳ; ຳ; ຳ; ◌ໍາ; ◌ໍາ; ) LAO VOWEL SIGN AM +0EDC;0EDC;0EDC;0EAB 0E99;0EAB 0E99; # (ໜ; ໜ; ໜ; ຫນ; ຫນ; ) LAO HO NO +0EDD;0EDD;0EDD;0EAB 0EA1;0EAB 0EA1; # (ໝ; ໝ; ໝ; ຫມ; ຫມ; ) LAO HO MO +0F0C;0F0C;0F0C;0F0B;0F0B; # (༌; ༌; ༌; ་; ་; ) TIBETAN MARK DELIMITER TSHEG BSTAR +0F43;0F42 0FB7;0F42 0FB7;0F42 0FB7;0F42 0FB7; # (གྷ; ག◌ྷ; ག◌ྷ; ག◌ྷ; ག◌ྷ; ) TIBETAN LETTER GHA +0F4D;0F4C 0FB7;0F4C 0FB7;0F4C 0FB7;0F4C 0FB7; # (ཌྷ; ཌ◌ྷ; ཌ◌ྷ; ཌ◌ྷ; ཌ◌ྷ; ) TIBETAN LETTER DDHA +0F52;0F51 0FB7;0F51 0FB7;0F51 0FB7;0F51 0FB7; # (དྷ; ད◌ྷ; ད◌ྷ; ད◌ྷ; ད◌ྷ; ) TIBETAN LETTER DHA +0F57;0F56 0FB7;0F56 0FB7;0F56 0FB7;0F56 0FB7; # (བྷ; བ◌ྷ; བ◌ྷ; བ◌ྷ; བ◌ྷ; ) TIBETAN LETTER BHA +0F5C;0F5B 0FB7;0F5B 0FB7;0F5B 0FB7;0F5B 0FB7; # (ཛྷ; ཛ◌ྷ; ཛ◌ྷ; ཛ◌ྷ; ཛ◌ྷ; ) TIBETAN LETTER DZHA +0F69;0F40 0FB5;0F40 0FB5;0F40 0FB5;0F40 0FB5; # (ཀྵ; ཀ◌ྵ; ཀ◌ྵ; ཀ◌ྵ; ཀ◌ྵ; ) TIBETAN LETTER KSSA +0F73;0F71 0F72;0F71 0F72;0F71 0F72;0F71 0F72; # (◌ཱི; ◌ཱ◌ི; ◌ཱ◌ི; ◌ཱ◌ི; ◌ཱ◌ི; ) TIBETAN VOWEL SIGN II +0F75;0F71 0F74;0F71 0F74;0F71 0F74;0F71 0F74; # (◌ཱུ; ◌ཱ◌ུ; ◌ཱ◌ུ; ◌ཱ◌ུ; ◌ཱ◌ུ; ) TIBETAN VOWEL SIGN UU +0F76;0FB2 0F80;0FB2 0F80;0FB2 0F80;0FB2 0F80; # (◌ྲྀ; ◌ྲ◌ྀ; ◌ྲ◌ྀ; ◌ྲ◌ྀ; ◌ྲ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC R +0F77;0F77;0F77;0FB2 0F71 0F80;0FB2 0F71 0F80; # (◌ཷ; ◌ཷ; ◌ཷ; ◌ྲ◌ཱ◌ྀ; ◌ྲ◌ཱ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC RR +0F78;0FB3 0F80;0FB3 0F80;0FB3 0F80;0FB3 0F80; # (◌ླྀ; ◌ླ◌ྀ; ◌ླ◌ྀ; ◌ླ◌ྀ; ◌ླ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC L +0F79;0F79;0F79;0FB3 0F71 0F80;0FB3 0F71 0F80; # (◌ཹ; ◌ཹ; ◌ཹ; ◌ླ◌ཱ◌ྀ; ◌ླ◌ཱ◌ྀ; ) TIBETAN VOWEL SIGN VOCALIC LL +0F81;0F71 0F80;0F71 0F80;0F71 0F80;0F71 0F80; # (◌ཱྀ; ◌ཱ◌ྀ; ◌ཱ◌ྀ; ◌ཱ◌ྀ; ◌ཱ◌ྀ; ) TIBETAN VOWEL SIGN REVERSED II +0F93;0F92 0FB7;0F92 0FB7;0F92 0FB7;0F92 0FB7; # (◌ྒྷ; ◌ྒ◌ྷ; ◌ྒ◌ྷ; ◌ྒ◌ྷ; ◌ྒ◌ྷ; ) TIBETAN SUBJOINED LETTER GHA +0F9D;0F9C 0FB7;0F9C 0FB7;0F9C 0FB7;0F9C 0FB7; # (◌ྜྷ; ◌ྜ◌ྷ; ◌ྜ◌ྷ; ◌ྜ◌ྷ; ◌ྜ◌ྷ; ) TIBETAN SUBJOINED LETTER DDHA +0FA2;0FA1 0FB7;0FA1 0FB7;0FA1 0FB7;0FA1 0FB7; # (◌ྡྷ; ◌ྡ◌ྷ; ◌ྡ◌ྷ; ◌ྡ◌ྷ; ◌ྡ◌ྷ; ) TIBETAN SUBJOINED LETTER DHA +0FA7;0FA6 0FB7;0FA6 0FB7;0FA6 0FB7;0FA6 0FB7; # (◌ྦྷ; ◌ྦ◌ྷ; ◌ྦ◌ྷ; ◌ྦ◌ྷ; ◌ྦ◌ྷ; ) TIBETAN SUBJOINED LETTER BHA +0FAC;0FAB 0FB7;0FAB 0FB7;0FAB 0FB7;0FAB 0FB7; # (◌ྫྷ; ◌ྫ◌ྷ; ◌ྫ◌ྷ; ◌ྫ◌ྷ; ◌ྫ◌ྷ; ) TIBETAN SUBJOINED LETTER DZHA +0FB9;0F90 0FB5;0F90 0FB5;0F90 0FB5;0F90 0FB5; # (◌ྐྵ; ◌ྐ◌ྵ; ◌ྐ◌ྵ; ◌ྐ◌ྵ; ◌ྐ◌ྵ; ) TIBETAN SUBJOINED LETTER KSSA +1026;1026;1025 102E;1026;1025 102E; # (ဦ; ဦ; ဥ◌ီ; ဦ; ဥ◌ီ; ) MYANMAR LETTER UU +10FC;10FC;10FC;10DC;10DC; # (ჼ; ჼ; ჼ; ნ; ნ; ) MODIFIER LETTER GEORGIAN NAR +1B06;1B06;1B05 1B35;1B06;1B05 1B35; # (ᬆ; ᬆ; ᬆ; ᬆ; ᬆ; ) BALINESE LETTER AKARA TEDUNG +1B08;1B08;1B07 1B35;1B08;1B07 1B35; # (ᬈ; ᬈ; ᬈ; ᬈ; ᬈ; ) BALINESE LETTER IKARA TEDUNG +1B0A;1B0A;1B09 1B35;1B0A;1B09 1B35; # (ᬊ; ᬊ; ᬊ; ᬊ; ᬊ; ) BALINESE LETTER UKARA TEDUNG +1B0C;1B0C;1B0B 1B35;1B0C;1B0B 1B35; # (ᬌ; ᬌ; ᬌ; ᬌ; ᬌ; ) BALINESE LETTER RA REPA TEDUNG +1B0E;1B0E;1B0D 1B35;1B0E;1B0D 1B35; # (ᬎ; ᬎ; ᬎ; ᬎ; ᬎ; ) BALINESE LETTER LA LENGA TEDUNG +1B12;1B12;1B11 1B35;1B12;1B11 1B35; # (ᬒ; ᬒ; ᬒ; ᬒ; ᬒ; ) BALINESE LETTER OKARA TEDUNG +1B3B;1B3B;1B3A 1B35;1B3B;1B3A 1B35; # (ᬻ; ᬻ; ◌ᬻ; ᬻ; ◌ᬻ; ) BALINESE VOWEL SIGN RA REPA TEDUNG +1B3D;1B3D;1B3C 1B35;1B3D;1B3C 1B35; # (ᬽ; ᬽ; ◌ᬽ; ᬽ; ◌ᬽ; ) BALINESE VOWEL SIGN LA LENGA TEDUNG +1B40;1B40;1B3E 1B35;1B40;1B3E 1B35; # (ᭀ; ᭀ; ᭀ; ᭀ; ᭀ; ) BALINESE VOWEL SIGN TALING TEDUNG +1B41;1B41;1B3F 1B35;1B41;1B3F 1B35; # (ᭁ; ᭁ; ᭁ; ᭁ; ᭁ; ) BALINESE VOWEL SIGN TALING REPA TEDUNG +1B43;1B43;1B42 1B35;1B43;1B42 1B35; # (ᭃ; ᭃ; ◌ᭃ; ᭃ; ◌ᭃ; ) BALINESE VOWEL SIGN PEPET TEDUNG +1D2C;1D2C;1D2C;0041;0041; # (ᴬ; ᴬ; ᴬ; A; A; ) MODIFIER LETTER CAPITAL A +1D2D;1D2D;1D2D;00C6;00C6; # (ᴭ; ᴭ; ᴭ; Æ; Æ; ) MODIFIER LETTER CAPITAL AE +1D2E;1D2E;1D2E;0042;0042; # (ᴮ; ᴮ; ᴮ; B; B; ) MODIFIER LETTER CAPITAL B +1D30;1D30;1D30;0044;0044; # (ᴰ; ᴰ; ᴰ; D; D; ) MODIFIER LETTER CAPITAL D +1D31;1D31;1D31;0045;0045; # (ᴱ; ᴱ; ᴱ; E; E; ) MODIFIER LETTER CAPITAL E +1D32;1D32;1D32;018E;018E; # (ᴲ; ᴲ; ᴲ; Ǝ; Ǝ; ) MODIFIER LETTER CAPITAL REVERSED E +1D33;1D33;1D33;0047;0047; # (ᴳ; ᴳ; ᴳ; G; G; ) MODIFIER LETTER CAPITAL G +1D34;1D34;1D34;0048;0048; # (ᴴ; ᴴ; ᴴ; H; H; ) MODIFIER LETTER CAPITAL H +1D35;1D35;1D35;0049;0049; # (ᴵ; ᴵ; ᴵ; I; I; ) MODIFIER LETTER CAPITAL I +1D36;1D36;1D36;004A;004A; # (ᴶ; ᴶ; ᴶ; J; J; ) MODIFIER LETTER CAPITAL J +1D37;1D37;1D37;004B;004B; # (ᴷ; ᴷ; ᴷ; K; K; ) MODIFIER LETTER CAPITAL K +1D38;1D38;1D38;004C;004C; # (ᴸ; ᴸ; ᴸ; L; L; ) MODIFIER LETTER CAPITAL L +1D39;1D39;1D39;004D;004D; # (ᴹ; ᴹ; ᴹ; M; M; ) MODIFIER LETTER CAPITAL M +1D3A;1D3A;1D3A;004E;004E; # (ᴺ; ᴺ; ᴺ; N; N; ) MODIFIER LETTER CAPITAL N +1D3C;1D3C;1D3C;004F;004F; # (ᴼ; ᴼ; ᴼ; O; O; ) MODIFIER LETTER CAPITAL O +1D3D;1D3D;1D3D;0222;0222; # (ᴽ; ᴽ; ᴽ; Ȣ; Ȣ; ) MODIFIER LETTER CAPITAL OU +1D3E;1D3E;1D3E;0050;0050; # (ᴾ; ᴾ; ᴾ; P; P; ) MODIFIER LETTER CAPITAL P +1D3F;1D3F;1D3F;0052;0052; # (ᴿ; ᴿ; ᴿ; R; R; ) MODIFIER LETTER CAPITAL R +1D40;1D40;1D40;0054;0054; # (ᵀ; ᵀ; ᵀ; T; T; ) MODIFIER LETTER CAPITAL T +1D41;1D41;1D41;0055;0055; # (ᵁ; ᵁ; ᵁ; U; U; ) MODIFIER LETTER CAPITAL U +1D42;1D42;1D42;0057;0057; # (ᵂ; ᵂ; ᵂ; W; W; ) MODIFIER LETTER CAPITAL W +1D43;1D43;1D43;0061;0061; # (ᵃ; ᵃ; ᵃ; a; a; ) MODIFIER LETTER SMALL A +1D44;1D44;1D44;0250;0250; # (ᵄ; ᵄ; ᵄ; ɐ; ɐ; ) MODIFIER LETTER SMALL TURNED A +1D45;1D45;1D45;0251;0251; # (ᵅ; ᵅ; ᵅ; ɑ; ɑ; ) MODIFIER LETTER SMALL ALPHA +1D46;1D46;1D46;1D02;1D02; # (ᵆ; ᵆ; ᵆ; ᴂ; ᴂ; ) MODIFIER LETTER SMALL TURNED AE +1D47;1D47;1D47;0062;0062; # (ᵇ; ᵇ; ᵇ; b; b; ) MODIFIER LETTER SMALL B +1D48;1D48;1D48;0064;0064; # (ᵈ; ᵈ; ᵈ; d; d; ) MODIFIER LETTER SMALL D +1D49;1D49;1D49;0065;0065; # (ᵉ; ᵉ; ᵉ; e; e; ) MODIFIER LETTER SMALL E +1D4A;1D4A;1D4A;0259;0259; # (ᵊ; ᵊ; ᵊ; ə; ə; ) MODIFIER LETTER SMALL SCHWA +1D4B;1D4B;1D4B;025B;025B; # (ᵋ; ᵋ; ᵋ; ɛ; ɛ; ) MODIFIER LETTER SMALL OPEN E +1D4C;1D4C;1D4C;025C;025C; # (ᵌ; ᵌ; ᵌ; ɜ; ɜ; ) MODIFIER LETTER SMALL TURNED OPEN E +1D4D;1D4D;1D4D;0067;0067; # (ᵍ; ᵍ; ᵍ; g; g; ) MODIFIER LETTER SMALL G +1D4F;1D4F;1D4F;006B;006B; # (ᵏ; ᵏ; ᵏ; k; k; ) MODIFIER LETTER SMALL K +1D50;1D50;1D50;006D;006D; # (ᵐ; ᵐ; ᵐ; m; m; ) MODIFIER LETTER SMALL M +1D51;1D51;1D51;014B;014B; # (ᵑ; ᵑ; ᵑ; ŋ; ŋ; ) MODIFIER LETTER SMALL ENG +1D52;1D52;1D52;006F;006F; # (ᵒ; ᵒ; ᵒ; o; o; ) MODIFIER LETTER SMALL O +1D53;1D53;1D53;0254;0254; # (ᵓ; ᵓ; ᵓ; ɔ; ɔ; ) MODIFIER LETTER SMALL OPEN O +1D54;1D54;1D54;1D16;1D16; # (ᵔ; ᵔ; ᵔ; ᴖ; ᴖ; ) MODIFIER LETTER SMALL TOP HALF O +1D55;1D55;1D55;1D17;1D17; # (ᵕ; ᵕ; ᵕ; ᴗ; ᴗ; ) MODIFIER LETTER SMALL BOTTOM HALF O +1D56;1D56;1D56;0070;0070; # (ᵖ; ᵖ; ᵖ; p; p; ) MODIFIER LETTER SMALL P +1D57;1D57;1D57;0074;0074; # (ᵗ; ᵗ; ᵗ; t; t; ) MODIFIER LETTER SMALL T +1D58;1D58;1D58;0075;0075; # (ᵘ; ᵘ; ᵘ; u; u; ) MODIFIER LETTER SMALL U +1D59;1D59;1D59;1D1D;1D1D; # (ᵙ; ᵙ; ᵙ; ᴝ; ᴝ; ) MODIFIER LETTER SMALL SIDEWAYS U +1D5A;1D5A;1D5A;026F;026F; # (ᵚ; ᵚ; ᵚ; ɯ; ɯ; ) MODIFIER LETTER SMALL TURNED M +1D5B;1D5B;1D5B;0076;0076; # (ᵛ; ᵛ; ᵛ; v; v; ) MODIFIER LETTER SMALL V +1D5C;1D5C;1D5C;1D25;1D25; # (ᵜ; ᵜ; ᵜ; ᴥ; ᴥ; ) MODIFIER LETTER SMALL AIN +1D5D;1D5D;1D5D;03B2;03B2; # (ᵝ; ᵝ; ᵝ; β; β; ) MODIFIER LETTER SMALL BETA +1D5E;1D5E;1D5E;03B3;03B3; # (ᵞ; ᵞ; ᵞ; γ; γ; ) MODIFIER LETTER SMALL GREEK GAMMA +1D5F;1D5F;1D5F;03B4;03B4; # (ᵟ; ᵟ; ᵟ; δ; δ; ) MODIFIER LETTER SMALL DELTA +1D60;1D60;1D60;03C6;03C6; # (ᵠ; ᵠ; ᵠ; φ; φ; ) MODIFIER LETTER SMALL GREEK PHI +1D61;1D61;1D61;03C7;03C7; # (ᵡ; ᵡ; ᵡ; χ; χ; ) MODIFIER LETTER SMALL CHI +1D62;1D62;1D62;0069;0069; # (ᵢ; ᵢ; ᵢ; i; i; ) LATIN SUBSCRIPT SMALL LETTER I +1D63;1D63;1D63;0072;0072; # (ᵣ; ᵣ; ᵣ; r; r; ) LATIN SUBSCRIPT SMALL LETTER R +1D64;1D64;1D64;0075;0075; # (ᵤ; ᵤ; ᵤ; u; u; ) LATIN SUBSCRIPT SMALL LETTER U +1D65;1D65;1D65;0076;0076; # (ᵥ; ᵥ; ᵥ; v; v; ) LATIN SUBSCRIPT SMALL LETTER V +1D66;1D66;1D66;03B2;03B2; # (ᵦ; ᵦ; ᵦ; β; β; ) GREEK SUBSCRIPT SMALL LETTER BETA +1D67;1D67;1D67;03B3;03B3; # (ᵧ; ᵧ; ᵧ; γ; γ; ) GREEK SUBSCRIPT SMALL LETTER GAMMA +1D68;1D68;1D68;03C1;03C1; # (ᵨ; ᵨ; ᵨ; ρ; ρ; ) GREEK SUBSCRIPT SMALL LETTER RHO +1D69;1D69;1D69;03C6;03C6; # (ᵩ; ᵩ; ᵩ; φ; φ; ) GREEK SUBSCRIPT SMALL LETTER PHI +1D6A;1D6A;1D6A;03C7;03C7; # (ᵪ; ᵪ; ᵪ; χ; χ; ) GREEK SUBSCRIPT SMALL LETTER CHI +1D78;1D78;1D78;043D;043D; # (ᵸ; ᵸ; ᵸ; н; н; ) MODIFIER LETTER CYRILLIC EN +1D9B;1D9B;1D9B;0252;0252; # (ᶛ; ᶛ; ᶛ; ɒ; ɒ; ) MODIFIER LETTER SMALL TURNED ALPHA +1D9C;1D9C;1D9C;0063;0063; # (ᶜ; ᶜ; ᶜ; c; c; ) MODIFIER LETTER SMALL C +1D9D;1D9D;1D9D;0255;0255; # (ᶝ; ᶝ; ᶝ; ɕ; ɕ; ) MODIFIER LETTER SMALL C WITH CURL +1D9E;1D9E;1D9E;00F0;00F0; # (ᶞ; ᶞ; ᶞ; ð; ð; ) MODIFIER LETTER SMALL ETH +1D9F;1D9F;1D9F;025C;025C; # (ᶟ; ᶟ; ᶟ; ɜ; ɜ; ) MODIFIER LETTER SMALL REVERSED OPEN E +1DA0;1DA0;1DA0;0066;0066; # (ᶠ; ᶠ; ᶠ; f; f; ) MODIFIER LETTER SMALL F +1DA1;1DA1;1DA1;025F;025F; # (ᶡ; ᶡ; ᶡ; ɟ; ɟ; ) MODIFIER LETTER SMALL DOTLESS J WITH STROKE +1DA2;1DA2;1DA2;0261;0261; # (ᶢ; ᶢ; ᶢ; ɡ; ɡ; ) MODIFIER LETTER SMALL SCRIPT G +1DA3;1DA3;1DA3;0265;0265; # (ᶣ; ᶣ; ᶣ; ɥ; ɥ; ) MODIFIER LETTER SMALL TURNED H +1DA4;1DA4;1DA4;0268;0268; # (ᶤ; ᶤ; ᶤ; ɨ; ɨ; ) MODIFIER LETTER SMALL I WITH STROKE +1DA5;1DA5;1DA5;0269;0269; # (ᶥ; ᶥ; ᶥ; ɩ; ɩ; ) MODIFIER LETTER SMALL IOTA +1DA6;1DA6;1DA6;026A;026A; # (ᶦ; ᶦ; ᶦ; ɪ; ɪ; ) MODIFIER LETTER SMALL CAPITAL I +1DA7;1DA7;1DA7;1D7B;1D7B; # (ᶧ; ᶧ; ᶧ; ᵻ; ᵻ; ) MODIFIER LETTER SMALL CAPITAL I WITH STROKE +1DA8;1DA8;1DA8;029D;029D; # (ᶨ; ᶨ; ᶨ; ʝ; ʝ; ) MODIFIER LETTER SMALL J WITH CROSSED-TAIL +1DA9;1DA9;1DA9;026D;026D; # (ᶩ; ᶩ; ᶩ; ɭ; ɭ; ) MODIFIER LETTER SMALL L WITH RETROFLEX HOOK +1DAA;1DAA;1DAA;1D85;1D85; # (ᶪ; ᶪ; ᶪ; ᶅ; ᶅ; ) MODIFIER LETTER SMALL L WITH PALATAL HOOK +1DAB;1DAB;1DAB;029F;029F; # (ᶫ; ᶫ; ᶫ; ʟ; ʟ; ) MODIFIER LETTER SMALL CAPITAL L +1DAC;1DAC;1DAC;0271;0271; # (ᶬ; ᶬ; ᶬ; ɱ; ɱ; ) MODIFIER LETTER SMALL M WITH HOOK +1DAD;1DAD;1DAD;0270;0270; # (ᶭ; ᶭ; ᶭ; ɰ; ɰ; ) MODIFIER LETTER SMALL TURNED M WITH LONG LEG +1DAE;1DAE;1DAE;0272;0272; # (ᶮ; ᶮ; ᶮ; ɲ; ɲ; ) MODIFIER LETTER SMALL N WITH LEFT HOOK +1DAF;1DAF;1DAF;0273;0273; # (ᶯ; ᶯ; ᶯ; ɳ; ɳ; ) MODIFIER LETTER SMALL N WITH RETROFLEX HOOK +1DB0;1DB0;1DB0;0274;0274; # (ᶰ; ᶰ; ᶰ; ɴ; ɴ; ) MODIFIER LETTER SMALL CAPITAL N +1DB1;1DB1;1DB1;0275;0275; # (ᶱ; ᶱ; ᶱ; ɵ; ɵ; ) MODIFIER LETTER SMALL BARRED O +1DB2;1DB2;1DB2;0278;0278; # (ᶲ; ᶲ; ᶲ; ɸ; ɸ; ) MODIFIER LETTER SMALL PHI +1DB3;1DB3;1DB3;0282;0282; # (ᶳ; ᶳ; ᶳ; ʂ; ʂ; ) MODIFIER LETTER SMALL S WITH HOOK +1DB4;1DB4;1DB4;0283;0283; # (ᶴ; ᶴ; ᶴ; ʃ; ʃ; ) MODIFIER LETTER SMALL ESH +1DB5;1DB5;1DB5;01AB;01AB; # (ᶵ; ᶵ; ᶵ; ƫ; ƫ; ) MODIFIER LETTER SMALL T WITH PALATAL HOOK +1DB6;1DB6;1DB6;0289;0289; # (ᶶ; ᶶ; ᶶ; ʉ; ʉ; ) MODIFIER LETTER SMALL U BAR +1DB7;1DB7;1DB7;028A;028A; # (ᶷ; ᶷ; ᶷ; ʊ; ʊ; ) MODIFIER LETTER SMALL UPSILON +1DB8;1DB8;1DB8;1D1C;1D1C; # (ᶸ; ᶸ; ᶸ; ᴜ; ᴜ; ) MODIFIER LETTER SMALL CAPITAL U +1DB9;1DB9;1DB9;028B;028B; # (ᶹ; ᶹ; ᶹ; ʋ; ʋ; ) MODIFIER LETTER SMALL V WITH HOOK +1DBA;1DBA;1DBA;028C;028C; # (ᶺ; ᶺ; ᶺ; ʌ; ʌ; ) MODIFIER LETTER SMALL TURNED V +1DBB;1DBB;1DBB;007A;007A; # (ᶻ; ᶻ; ᶻ; z; z; ) MODIFIER LETTER SMALL Z +1DBC;1DBC;1DBC;0290;0290; # (ᶼ; ᶼ; ᶼ; ʐ; ʐ; ) MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK +1DBD;1DBD;1DBD;0291;0291; # (ᶽ; ᶽ; ᶽ; ʑ; ʑ; ) MODIFIER LETTER SMALL Z WITH CURL +1DBE;1DBE;1DBE;0292;0292; # (ᶾ; ᶾ; ᶾ; ʒ; ʒ; ) MODIFIER LETTER SMALL EZH +1DBF;1DBF;1DBF;03B8;03B8; # (ᶿ; ᶿ; ᶿ; θ; θ; ) MODIFIER LETTER SMALL THETA +1E00;1E00;0041 0325;1E00;0041 0325; # (Ḁ; Ḁ; A◌̥; Ḁ; A◌̥; ) LATIN CAPITAL LETTER A WITH RING BELOW +1E01;1E01;0061 0325;1E01;0061 0325; # (ḁ; ḁ; a◌̥; ḁ; a◌̥; ) LATIN SMALL LETTER A WITH RING BELOW +1E02;1E02;0042 0307;1E02;0042 0307; # (Ḃ; Ḃ; B◌̇; Ḃ; B◌̇; ) LATIN CAPITAL LETTER B WITH DOT ABOVE +1E03;1E03;0062 0307;1E03;0062 0307; # (ḃ; ḃ; b◌̇; ḃ; b◌̇; ) LATIN SMALL LETTER B WITH DOT ABOVE +1E04;1E04;0042 0323;1E04;0042 0323; # (Ḅ; Ḅ; B◌̣; Ḅ; B◌̣; ) LATIN CAPITAL LETTER B WITH DOT BELOW +1E05;1E05;0062 0323;1E05;0062 0323; # (ḅ; ḅ; b◌̣; ḅ; b◌̣; ) LATIN SMALL LETTER B WITH DOT BELOW +1E06;1E06;0042 0331;1E06;0042 0331; # (Ḇ; Ḇ; B◌̱; Ḇ; B◌̱; ) LATIN CAPITAL LETTER B WITH LINE BELOW +1E07;1E07;0062 0331;1E07;0062 0331; # (ḇ; ḇ; b◌̱; ḇ; b◌̱; ) LATIN SMALL LETTER B WITH LINE BELOW +1E08;1E08;0043 0327 0301;1E08;0043 0327 0301; # (Ḉ; Ḉ; C◌̧◌́; Ḉ; C◌̧◌́; ) LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E09;1E09;0063 0327 0301;1E09;0063 0327 0301; # (ḉ; ḉ; c◌̧◌́; ḉ; c◌̧◌́; ) LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +1E0A;1E0A;0044 0307;1E0A;0044 0307; # (Ḋ; Ḋ; D◌̇; Ḋ; D◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0B;1E0B;0064 0307;1E0B;0064 0307; # (ḋ; ḋ; d◌̇; ḋ; d◌̇; ) LATIN SMALL LETTER D WITH DOT ABOVE +1E0C;1E0C;0044 0323;1E0C;0044 0323; # (Ḍ; Ḍ; D◌̣; Ḍ; D◌̣; ) LATIN CAPITAL LETTER D WITH DOT BELOW +1E0D;1E0D;0064 0323;1E0D;0064 0323; # (ḍ; ḍ; d◌̣; ḍ; d◌̣; ) LATIN SMALL LETTER D WITH DOT BELOW +1E0E;1E0E;0044 0331;1E0E;0044 0331; # (Ḏ; Ḏ; D◌̱; Ḏ; D◌̱; ) LATIN CAPITAL LETTER D WITH LINE BELOW +1E0F;1E0F;0064 0331;1E0F;0064 0331; # (ḏ; ḏ; d◌̱; ḏ; d◌̱; ) LATIN SMALL LETTER D WITH LINE BELOW +1E10;1E10;0044 0327;1E10;0044 0327; # (Ḑ; Ḑ; D◌̧; Ḑ; D◌̧; ) LATIN CAPITAL LETTER D WITH CEDILLA +1E11;1E11;0064 0327;1E11;0064 0327; # (ḑ; ḑ; d◌̧; ḑ; d◌̧; ) LATIN SMALL LETTER D WITH CEDILLA +1E12;1E12;0044 032D;1E12;0044 032D; # (Ḓ; Ḓ; D◌̭; Ḓ; D◌̭; ) LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E13;1E13;0064 032D;1E13;0064 032D; # (ḓ; ḓ; d◌̭; ḓ; d◌̭; ) LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +1E14;1E14;0045 0304 0300;1E14;0045 0304 0300; # (Ḕ; Ḕ; E◌̄◌̀; Ḕ; E◌̄◌̀; ) LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E15;1E15;0065 0304 0300;1E15;0065 0304 0300; # (ḕ; ḕ; e◌̄◌̀; ḕ; e◌̄◌̀; ) LATIN SMALL LETTER E WITH MACRON AND GRAVE +1E16;1E16;0045 0304 0301;1E16;0045 0304 0301; # (Ḗ; Ḗ; E◌̄◌́; Ḗ; E◌̄◌́; ) LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E17;1E17;0065 0304 0301;1E17;0065 0304 0301; # (ḗ; ḗ; e◌̄◌́; ḗ; e◌̄◌́; ) LATIN SMALL LETTER E WITH MACRON AND ACUTE +1E18;1E18;0045 032D;1E18;0045 032D; # (Ḙ; Ḙ; E◌̭; Ḙ; E◌̭; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E19;1E19;0065 032D;1E19;0065 032D; # (ḙ; ḙ; e◌̭; ḙ; e◌̭; ) LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +1E1A;1E1A;0045 0330;1E1A;0045 0330; # (Ḛ; Ḛ; E◌̰; Ḛ; E◌̰; ) LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1B;1E1B;0065 0330;1E1B;0065 0330; # (ḛ; ḛ; e◌̰; ḛ; e◌̰; ) LATIN SMALL LETTER E WITH TILDE BELOW +1E1C;1E1C;0045 0327 0306;1E1C;0045 0327 0306; # (Ḝ; Ḝ; E◌̧◌̆; Ḝ; E◌̧◌̆; ) LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1D;1E1D;0065 0327 0306;1E1D;0065 0327 0306; # (ḝ; ḝ; e◌̧◌̆; ḝ; e◌̧◌̆; ) LATIN SMALL LETTER E WITH CEDILLA AND BREVE +1E1E;1E1E;0046 0307;1E1E;0046 0307; # (Ḟ; Ḟ; F◌̇; Ḟ; F◌̇; ) LATIN CAPITAL LETTER F WITH DOT ABOVE +1E1F;1E1F;0066 0307;1E1F;0066 0307; # (ḟ; ḟ; f◌̇; ḟ; f◌̇; ) LATIN SMALL LETTER F WITH DOT ABOVE +1E20;1E20;0047 0304;1E20;0047 0304; # (Ḡ; Ḡ; G◌̄; Ḡ; G◌̄; ) LATIN CAPITAL LETTER G WITH MACRON +1E21;1E21;0067 0304;1E21;0067 0304; # (ḡ; ḡ; g◌̄; ḡ; g◌̄; ) LATIN SMALL LETTER G WITH MACRON +1E22;1E22;0048 0307;1E22;0048 0307; # (Ḣ; Ḣ; H◌̇; Ḣ; H◌̇; ) LATIN CAPITAL LETTER H WITH DOT ABOVE +1E23;1E23;0068 0307;1E23;0068 0307; # (ḣ; ḣ; h◌̇; ḣ; h◌̇; ) LATIN SMALL LETTER H WITH DOT ABOVE +1E24;1E24;0048 0323;1E24;0048 0323; # (Ḥ; Ḥ; H◌̣; Ḥ; H◌̣; ) LATIN CAPITAL LETTER H WITH DOT BELOW +1E25;1E25;0068 0323;1E25;0068 0323; # (ḥ; ḥ; h◌̣; ḥ; h◌̣; ) LATIN SMALL LETTER H WITH DOT BELOW +1E26;1E26;0048 0308;1E26;0048 0308; # (Ḧ; Ḧ; H◌̈; Ḧ; H◌̈; ) LATIN CAPITAL LETTER H WITH DIAERESIS +1E27;1E27;0068 0308;1E27;0068 0308; # (ḧ; ḧ; h◌̈; ḧ; h◌̈; ) LATIN SMALL LETTER H WITH DIAERESIS +1E28;1E28;0048 0327;1E28;0048 0327; # (Ḩ; Ḩ; H◌̧; Ḩ; H◌̧; ) LATIN CAPITAL LETTER H WITH CEDILLA +1E29;1E29;0068 0327;1E29;0068 0327; # (ḩ; ḩ; h◌̧; ḩ; h◌̧; ) LATIN SMALL LETTER H WITH CEDILLA +1E2A;1E2A;0048 032E;1E2A;0048 032E; # (Ḫ; Ḫ; H◌̮; Ḫ; H◌̮; ) LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2B;1E2B;0068 032E;1E2B;0068 032E; # (ḫ; ḫ; h◌̮; ḫ; h◌̮; ) LATIN SMALL LETTER H WITH BREVE BELOW +1E2C;1E2C;0049 0330;1E2C;0049 0330; # (Ḭ; Ḭ; I◌̰; Ḭ; I◌̰; ) LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2D;1E2D;0069 0330;1E2D;0069 0330; # (ḭ; ḭ; i◌̰; ḭ; i◌̰; ) LATIN SMALL LETTER I WITH TILDE BELOW +1E2E;1E2E;0049 0308 0301;1E2E;0049 0308 0301; # (Ḯ; Ḯ; I◌̈◌́; Ḯ; I◌̈◌́; ) LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E2F;1E2F;0069 0308 0301;1E2F;0069 0308 0301; # (ḯ; ḯ; i◌̈◌́; ḯ; i◌̈◌́; ) LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +1E30;1E30;004B 0301;1E30;004B 0301; # (Ḱ; Ḱ; K◌́; Ḱ; K◌́; ) LATIN CAPITAL LETTER K WITH ACUTE +1E31;1E31;006B 0301;1E31;006B 0301; # (ḱ; ḱ; k◌́; ḱ; k◌́; ) LATIN SMALL LETTER K WITH ACUTE +1E32;1E32;004B 0323;1E32;004B 0323; # (Ḳ; Ḳ; K◌̣; Ḳ; K◌̣; ) LATIN CAPITAL LETTER K WITH DOT BELOW +1E33;1E33;006B 0323;1E33;006B 0323; # (ḳ; ḳ; k◌̣; ḳ; k◌̣; ) LATIN SMALL LETTER K WITH DOT BELOW +1E34;1E34;004B 0331;1E34;004B 0331; # (Ḵ; Ḵ; K◌̱; Ḵ; K◌̱; ) LATIN CAPITAL LETTER K WITH LINE BELOW +1E35;1E35;006B 0331;1E35;006B 0331; # (ḵ; ḵ; k◌̱; ḵ; k◌̱; ) LATIN SMALL LETTER K WITH LINE BELOW +1E36;1E36;004C 0323;1E36;004C 0323; # (Ḷ; Ḷ; L◌̣; Ḷ; L◌̣; ) LATIN CAPITAL LETTER L WITH DOT BELOW +1E37;1E37;006C 0323;1E37;006C 0323; # (ḷ; ḷ; l◌̣; ḷ; l◌̣; ) LATIN SMALL LETTER L WITH DOT BELOW +1E38;1E38;004C 0323 0304;1E38;004C 0323 0304; # (Ḹ; Ḹ; L◌̣◌̄; Ḹ; L◌̣◌̄; ) LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E39;1E39;006C 0323 0304;1E39;006C 0323 0304; # (ḹ; ḹ; l◌̣◌̄; ḹ; l◌̣◌̄; ) LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +1E3A;1E3A;004C 0331;1E3A;004C 0331; # (Ḻ; Ḻ; L◌̱; Ḻ; L◌̱; ) LATIN CAPITAL LETTER L WITH LINE BELOW +1E3B;1E3B;006C 0331;1E3B;006C 0331; # (ḻ; ḻ; l◌̱; ḻ; l◌̱; ) LATIN SMALL LETTER L WITH LINE BELOW +1E3C;1E3C;004C 032D;1E3C;004C 032D; # (Ḽ; Ḽ; L◌̭; Ḽ; L◌̭; ) LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3D;1E3D;006C 032D;1E3D;006C 032D; # (ḽ; ḽ; l◌̭; ḽ; l◌̭; ) LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +1E3E;1E3E;004D 0301;1E3E;004D 0301; # (Ḿ; Ḿ; M◌́; Ḿ; M◌́; ) LATIN CAPITAL LETTER M WITH ACUTE +1E3F;1E3F;006D 0301;1E3F;006D 0301; # (ḿ; ḿ; m◌́; ḿ; m◌́; ) LATIN SMALL LETTER M WITH ACUTE +1E40;1E40;004D 0307;1E40;004D 0307; # (Ṁ; Ṁ; M◌̇; Ṁ; M◌̇; ) LATIN CAPITAL LETTER M WITH DOT ABOVE +1E41;1E41;006D 0307;1E41;006D 0307; # (ṁ; ṁ; m◌̇; ṁ; m◌̇; ) LATIN SMALL LETTER M WITH DOT ABOVE +1E42;1E42;004D 0323;1E42;004D 0323; # (Ṃ; Ṃ; M◌̣; Ṃ; M◌̣; ) LATIN CAPITAL LETTER M WITH DOT BELOW +1E43;1E43;006D 0323;1E43;006D 0323; # (ṃ; ṃ; m◌̣; ṃ; m◌̣; ) LATIN SMALL LETTER M WITH DOT BELOW +1E44;1E44;004E 0307;1E44;004E 0307; # (Ṅ; Ṅ; N◌̇; Ṅ; N◌̇; ) LATIN CAPITAL LETTER N WITH DOT ABOVE +1E45;1E45;006E 0307;1E45;006E 0307; # (ṅ; ṅ; n◌̇; ṅ; n◌̇; ) LATIN SMALL LETTER N WITH DOT ABOVE +1E46;1E46;004E 0323;1E46;004E 0323; # (Ṇ; Ṇ; N◌̣; Ṇ; N◌̣; ) LATIN CAPITAL LETTER N WITH DOT BELOW +1E47;1E47;006E 0323;1E47;006E 0323; # (ṇ; ṇ; n◌̣; ṇ; n◌̣; ) LATIN SMALL LETTER N WITH DOT BELOW +1E48;1E48;004E 0331;1E48;004E 0331; # (Ṉ; Ṉ; N◌̱; Ṉ; N◌̱; ) LATIN CAPITAL LETTER N WITH LINE BELOW +1E49;1E49;006E 0331;1E49;006E 0331; # (ṉ; ṉ; n◌̱; ṉ; n◌̱; ) LATIN SMALL LETTER N WITH LINE BELOW +1E4A;1E4A;004E 032D;1E4A;004E 032D; # (Ṋ; Ṋ; N◌̭; Ṋ; N◌̭; ) LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4B;1E4B;006E 032D;1E4B;006E 032D; # (ṋ; ṋ; n◌̭; ṋ; n◌̭; ) LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +1E4C;1E4C;004F 0303 0301;1E4C;004F 0303 0301; # (Ṍ; Ṍ; O◌̃◌́; Ṍ; O◌̃◌́; ) LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4D;1E4D;006F 0303 0301;1E4D;006F 0303 0301; # (ṍ; ṍ; o◌̃◌́; ṍ; o◌̃◌́; ) LATIN SMALL LETTER O WITH TILDE AND ACUTE +1E4E;1E4E;004F 0303 0308;1E4E;004F 0303 0308; # (Ṏ; Ṏ; O◌̃◌̈; Ṏ; O◌̃◌̈; ) LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E4F;1E4F;006F 0303 0308;1E4F;006F 0303 0308; # (ṏ; ṏ; o◌̃◌̈; ṏ; o◌̃◌̈; ) LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +1E50;1E50;004F 0304 0300;1E50;004F 0304 0300; # (Ṑ; Ṑ; O◌̄◌̀; Ṑ; O◌̄◌̀; ) LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E51;1E51;006F 0304 0300;1E51;006F 0304 0300; # (ṑ; ṑ; o◌̄◌̀; ṑ; o◌̄◌̀; ) LATIN SMALL LETTER O WITH MACRON AND GRAVE +1E52;1E52;004F 0304 0301;1E52;004F 0304 0301; # (Ṓ; Ṓ; O◌̄◌́; Ṓ; O◌̄◌́; ) LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E53;1E53;006F 0304 0301;1E53;006F 0304 0301; # (ṓ; ṓ; o◌̄◌́; ṓ; o◌̄◌́; ) LATIN SMALL LETTER O WITH MACRON AND ACUTE +1E54;1E54;0050 0301;1E54;0050 0301; # (Ṕ; Ṕ; P◌́; Ṕ; P◌́; ) LATIN CAPITAL LETTER P WITH ACUTE +1E55;1E55;0070 0301;1E55;0070 0301; # (ṕ; ṕ; p◌́; ṕ; p◌́; ) LATIN SMALL LETTER P WITH ACUTE +1E56;1E56;0050 0307;1E56;0050 0307; # (Ṗ; Ṗ; P◌̇; Ṗ; P◌̇; ) LATIN CAPITAL LETTER P WITH DOT ABOVE +1E57;1E57;0070 0307;1E57;0070 0307; # (ṗ; ṗ; p◌̇; ṗ; p◌̇; ) LATIN SMALL LETTER P WITH DOT ABOVE +1E58;1E58;0052 0307;1E58;0052 0307; # (Ṙ; Ṙ; R◌̇; Ṙ; R◌̇; ) LATIN CAPITAL LETTER R WITH DOT ABOVE +1E59;1E59;0072 0307;1E59;0072 0307; # (ṙ; ṙ; r◌̇; ṙ; r◌̇; ) LATIN SMALL LETTER R WITH DOT ABOVE +1E5A;1E5A;0052 0323;1E5A;0052 0323; # (Ṛ; Ṛ; R◌̣; Ṛ; R◌̣; ) LATIN CAPITAL LETTER R WITH DOT BELOW +1E5B;1E5B;0072 0323;1E5B;0072 0323; # (ṛ; ṛ; r◌̣; ṛ; r◌̣; ) LATIN SMALL LETTER R WITH DOT BELOW +1E5C;1E5C;0052 0323 0304;1E5C;0052 0323 0304; # (Ṝ; Ṝ; R◌̣◌̄; Ṝ; R◌̣◌̄; ) LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5D;1E5D;0072 0323 0304;1E5D;0072 0323 0304; # (ṝ; ṝ; r◌̣◌̄; ṝ; r◌̣◌̄; ) LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +1E5E;1E5E;0052 0331;1E5E;0052 0331; # (Ṟ; Ṟ; R◌̱; Ṟ; R◌̱; ) LATIN CAPITAL LETTER R WITH LINE BELOW +1E5F;1E5F;0072 0331;1E5F;0072 0331; # (ṟ; ṟ; r◌̱; ṟ; r◌̱; ) LATIN SMALL LETTER R WITH LINE BELOW +1E60;1E60;0053 0307;1E60;0053 0307; # (Ṡ; Ṡ; S◌̇; Ṡ; S◌̇; ) LATIN CAPITAL LETTER S WITH DOT ABOVE +1E61;1E61;0073 0307;1E61;0073 0307; # (ṡ; ṡ; s◌̇; ṡ; s◌̇; ) LATIN SMALL LETTER S WITH DOT ABOVE +1E62;1E62;0053 0323;1E62;0053 0323; # (Ṣ; Ṣ; S◌̣; Ṣ; S◌̣; ) LATIN CAPITAL LETTER S WITH DOT BELOW +1E63;1E63;0073 0323;1E63;0073 0323; # (ṣ; ṣ; s◌̣; ṣ; s◌̣; ) LATIN SMALL LETTER S WITH DOT BELOW +1E64;1E64;0053 0301 0307;1E64;0053 0301 0307; # (Ṥ; Ṥ; S◌́◌̇; Ṥ; S◌́◌̇; ) LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E65;1E65;0073 0301 0307;1E65;0073 0301 0307; # (ṥ; ṥ; s◌́◌̇; ṥ; s◌́◌̇; ) LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +1E66;1E66;0053 030C 0307;1E66;0053 030C 0307; # (Ṧ; Ṧ; S◌̌◌̇; Ṧ; S◌̌◌̇; ) LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E67;1E67;0073 030C 0307;1E67;0073 030C 0307; # (ṧ; ṧ; s◌̌◌̇; ṧ; s◌̌◌̇; ) LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +1E68;1E68;0053 0323 0307;1E68;0053 0323 0307; # (Ṩ; Ṩ; S◌̣◌̇; Ṩ; S◌̣◌̇; ) LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E69;1E69;0073 0323 0307;1E69;0073 0323 0307; # (ṩ; ṩ; s◌̣◌̇; ṩ; s◌̣◌̇; ) LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A;1E6A;0054 0307;1E6A;0054 0307; # (Ṫ; Ṫ; T◌̇; Ṫ; T◌̇; ) LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6B;1E6B;0074 0307;1E6B;0074 0307; # (ṫ; ṫ; t◌̇; ṫ; t◌̇; ) LATIN SMALL LETTER T WITH DOT ABOVE +1E6C;1E6C;0054 0323;1E6C;0054 0323; # (Ṭ; Ṭ; T◌̣; Ṭ; T◌̣; ) LATIN CAPITAL LETTER T WITH DOT BELOW +1E6D;1E6D;0074 0323;1E6D;0074 0323; # (ṭ; ṭ; t◌̣; ṭ; t◌̣; ) LATIN SMALL LETTER T WITH DOT BELOW +1E6E;1E6E;0054 0331;1E6E;0054 0331; # (Ṯ; Ṯ; T◌̱; Ṯ; T◌̱; ) LATIN CAPITAL LETTER T WITH LINE BELOW +1E6F;1E6F;0074 0331;1E6F;0074 0331; # (ṯ; ṯ; t◌̱; ṯ; t◌̱; ) LATIN SMALL LETTER T WITH LINE BELOW +1E70;1E70;0054 032D;1E70;0054 032D; # (Ṱ; Ṱ; T◌̭; Ṱ; T◌̭; ) LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E71;1E71;0074 032D;1E71;0074 032D; # (ṱ; ṱ; t◌̭; ṱ; t◌̭; ) LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +1E72;1E72;0055 0324;1E72;0055 0324; # (Ṳ; Ṳ; U◌̤; Ṳ; U◌̤; ) LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E73;1E73;0075 0324;1E73;0075 0324; # (ṳ; ṳ; u◌̤; ṳ; u◌̤; ) LATIN SMALL LETTER U WITH DIAERESIS BELOW +1E74;1E74;0055 0330;1E74;0055 0330; # (Ṵ; Ṵ; U◌̰; Ṵ; U◌̰; ) LATIN CAPITAL LETTER U WITH TILDE BELOW +1E75;1E75;0075 0330;1E75;0075 0330; # (ṵ; ṵ; u◌̰; ṵ; u◌̰; ) LATIN SMALL LETTER U WITH TILDE BELOW +1E76;1E76;0055 032D;1E76;0055 032D; # (Ṷ; Ṷ; U◌̭; Ṷ; U◌̭; ) LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E77;1E77;0075 032D;1E77;0075 032D; # (ṷ; ṷ; u◌̭; ṷ; u◌̭; ) LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +1E78;1E78;0055 0303 0301;1E78;0055 0303 0301; # (Ṹ; Ṹ; U◌̃◌́; Ṹ; U◌̃◌́; ) LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E79;1E79;0075 0303 0301;1E79;0075 0303 0301; # (ṹ; ṹ; u◌̃◌́; ṹ; u◌̃◌́; ) LATIN SMALL LETTER U WITH TILDE AND ACUTE +1E7A;1E7A;0055 0304 0308;1E7A;0055 0304 0308; # (Ṻ; Ṻ; U◌̄◌̈; Ṻ; U◌̄◌̈; ) LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7B;1E7B;0075 0304 0308;1E7B;0075 0304 0308; # (ṻ; ṻ; u◌̄◌̈; ṻ; u◌̄◌̈; ) LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +1E7C;1E7C;0056 0303;1E7C;0056 0303; # (Ṽ; Ṽ; V◌̃; Ṽ; V◌̃; ) LATIN CAPITAL LETTER V WITH TILDE +1E7D;1E7D;0076 0303;1E7D;0076 0303; # (ṽ; ṽ; v◌̃; ṽ; v◌̃; ) LATIN SMALL LETTER V WITH TILDE +1E7E;1E7E;0056 0323;1E7E;0056 0323; # (Ṿ; Ṿ; V◌̣; Ṿ; V◌̣; ) LATIN CAPITAL LETTER V WITH DOT BELOW +1E7F;1E7F;0076 0323;1E7F;0076 0323; # (ṿ; ṿ; v◌̣; ṿ; v◌̣; ) LATIN SMALL LETTER V WITH DOT BELOW +1E80;1E80;0057 0300;1E80;0057 0300; # (Ẁ; Ẁ; W◌̀; Ẁ; W◌̀; ) LATIN CAPITAL LETTER W WITH GRAVE +1E81;1E81;0077 0300;1E81;0077 0300; # (ẁ; ẁ; w◌̀; ẁ; w◌̀; ) LATIN SMALL LETTER W WITH GRAVE +1E82;1E82;0057 0301;1E82;0057 0301; # (Ẃ; Ẃ; W◌́; Ẃ; W◌́; ) LATIN CAPITAL LETTER W WITH ACUTE +1E83;1E83;0077 0301;1E83;0077 0301; # (ẃ; ẃ; w◌́; ẃ; w◌́; ) LATIN SMALL LETTER W WITH ACUTE +1E84;1E84;0057 0308;1E84;0057 0308; # (Ẅ; Ẅ; W◌̈; Ẅ; W◌̈; ) LATIN CAPITAL LETTER W WITH DIAERESIS +1E85;1E85;0077 0308;1E85;0077 0308; # (ẅ; ẅ; w◌̈; ẅ; w◌̈; ) LATIN SMALL LETTER W WITH DIAERESIS +1E86;1E86;0057 0307;1E86;0057 0307; # (Ẇ; Ẇ; W◌̇; Ẇ; W◌̇; ) LATIN CAPITAL LETTER W WITH DOT ABOVE +1E87;1E87;0077 0307;1E87;0077 0307; # (ẇ; ẇ; w◌̇; ẇ; w◌̇; ) LATIN SMALL LETTER W WITH DOT ABOVE +1E88;1E88;0057 0323;1E88;0057 0323; # (Ẉ; Ẉ; W◌̣; Ẉ; W◌̣; ) LATIN CAPITAL LETTER W WITH DOT BELOW +1E89;1E89;0077 0323;1E89;0077 0323; # (ẉ; ẉ; w◌̣; ẉ; w◌̣; ) LATIN SMALL LETTER W WITH DOT BELOW +1E8A;1E8A;0058 0307;1E8A;0058 0307; # (Ẋ; Ẋ; X◌̇; Ẋ; X◌̇; ) LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8B;1E8B;0078 0307;1E8B;0078 0307; # (ẋ; ẋ; x◌̇; ẋ; x◌̇; ) LATIN SMALL LETTER X WITH DOT ABOVE +1E8C;1E8C;0058 0308;1E8C;0058 0308; # (Ẍ; Ẍ; X◌̈; Ẍ; X◌̈; ) LATIN CAPITAL LETTER X WITH DIAERESIS +1E8D;1E8D;0078 0308;1E8D;0078 0308; # (ẍ; ẍ; x◌̈; ẍ; x◌̈; ) LATIN SMALL LETTER X WITH DIAERESIS +1E8E;1E8E;0059 0307;1E8E;0059 0307; # (Ẏ; Ẏ; Y◌̇; Ẏ; Y◌̇; ) LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E8F;1E8F;0079 0307;1E8F;0079 0307; # (ẏ; ẏ; y◌̇; ẏ; y◌̇; ) LATIN SMALL LETTER Y WITH DOT ABOVE +1E90;1E90;005A 0302;1E90;005A 0302; # (Ẑ; Ẑ; Z◌̂; Ẑ; Z◌̂; ) LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E91;1E91;007A 0302;1E91;007A 0302; # (ẑ; ẑ; z◌̂; ẑ; z◌̂; ) LATIN SMALL LETTER Z WITH CIRCUMFLEX +1E92;1E92;005A 0323;1E92;005A 0323; # (Ẓ; Ẓ; Z◌̣; Ẓ; Z◌̣; ) LATIN CAPITAL LETTER Z WITH DOT BELOW +1E93;1E93;007A 0323;1E93;007A 0323; # (ẓ; ẓ; z◌̣; ẓ; z◌̣; ) LATIN SMALL LETTER Z WITH DOT BELOW +1E94;1E94;005A 0331;1E94;005A 0331; # (Ẕ; Ẕ; Z◌̱; Ẕ; Z◌̱; ) LATIN CAPITAL LETTER Z WITH LINE BELOW +1E95;1E95;007A 0331;1E95;007A 0331; # (ẕ; ẕ; z◌̱; ẕ; z◌̱; ) LATIN SMALL LETTER Z WITH LINE BELOW +1E96;1E96;0068 0331;1E96;0068 0331; # (ẖ; ẖ; h◌̱; ẖ; h◌̱; ) LATIN SMALL LETTER H WITH LINE BELOW +1E97;1E97;0074 0308;1E97;0074 0308; # (ẗ; ẗ; t◌̈; ẗ; t◌̈; ) LATIN SMALL LETTER T WITH DIAERESIS +1E98;1E98;0077 030A;1E98;0077 030A; # (ẘ; ẘ; w◌̊; ẘ; w◌̊; ) LATIN SMALL LETTER W WITH RING ABOVE +1E99;1E99;0079 030A;1E99;0079 030A; # (ẙ; ẙ; y◌̊; ẙ; y◌̊; ) LATIN SMALL LETTER Y WITH RING ABOVE +1E9A;1E9A;1E9A;0061 02BE;0061 02BE; # (ẚ; ẚ; ẚ; aʾ; aʾ; ) LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B;1E9B;017F 0307;1E61;0073 0307; # (ẛ; ẛ; ſ◌̇; ṡ; s◌̇; ) LATIN SMALL LETTER LONG S WITH DOT ABOVE +1EA0;1EA0;0041 0323;1EA0;0041 0323; # (Ạ; Ạ; A◌̣; Ạ; A◌̣; ) LATIN CAPITAL LETTER A WITH DOT BELOW +1EA1;1EA1;0061 0323;1EA1;0061 0323; # (ạ; ạ; a◌̣; ạ; a◌̣; ) LATIN SMALL LETTER A WITH DOT BELOW +1EA2;1EA2;0041 0309;1EA2;0041 0309; # (Ả; Ả; A◌̉; Ả; A◌̉; ) LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA3;1EA3;0061 0309;1EA3;0061 0309; # (ả; ả; a◌̉; ả; a◌̉; ) LATIN SMALL LETTER A WITH HOOK ABOVE +1EA4;1EA4;0041 0302 0301;1EA4;0041 0302 0301; # (Ấ; Ấ; A◌̂◌́; Ấ; A◌̂◌́; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA5;1EA5;0061 0302 0301;1EA5;0061 0302 0301; # (ấ; ấ; a◌̂◌́; ấ; a◌̂◌́; ) LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6;1EA6;0041 0302 0300;1EA6;0041 0302 0300; # (Ầ; Ầ; A◌̂◌̀; Ầ; A◌̂◌̀; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA7;1EA7;0061 0302 0300;1EA7;0061 0302 0300; # (ầ; ầ; a◌̂◌̀; ầ; a◌̂◌̀; ) LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8;1EA8;0041 0302 0309;1EA8;0041 0302 0309; # (Ẩ; Ẩ; A◌̂◌̉; Ẩ; A◌̂◌̉; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EA9;1EA9;0061 0302 0309;1EA9;0061 0302 0309; # (ẩ; ẩ; a◌̂◌̉; ẩ; a◌̂◌̉; ) LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA;1EAA;0041 0302 0303;1EAA;0041 0302 0303; # (Ẫ; Ẫ; A◌̂◌̃; Ẫ; A◌̂◌̃; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAB;1EAB;0061 0302 0303;1EAB;0061 0302 0303; # (ẫ; ẫ; a◌̂◌̃; ẫ; a◌̂◌̃; ) LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC;1EAC;0041 0323 0302;1EAC;0041 0323 0302; # (Ậ; Ậ; A◌̣◌̂; Ậ; A◌̣◌̂; ) LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAD;1EAD;0061 0323 0302;1EAD;0061 0323 0302; # (ậ; ậ; a◌̣◌̂; ậ; a◌̣◌̂; ) LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE;1EAE;0041 0306 0301;1EAE;0041 0306 0301; # (Ắ; Ắ; A◌̆◌́; Ắ; A◌̆◌́; ) LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EAF;1EAF;0061 0306 0301;1EAF;0061 0306 0301; # (ắ; ắ; a◌̆◌́; ắ; a◌̆◌́; ) LATIN SMALL LETTER A WITH BREVE AND ACUTE +1EB0;1EB0;0041 0306 0300;1EB0;0041 0306 0300; # (Ằ; Ằ; A◌̆◌̀; Ằ; A◌̆◌̀; ) LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB1;1EB1;0061 0306 0300;1EB1;0061 0306 0300; # (ằ; ằ; a◌̆◌̀; ằ; a◌̆◌̀; ) LATIN SMALL LETTER A WITH BREVE AND GRAVE +1EB2;1EB2;0041 0306 0309;1EB2;0041 0306 0309; # (Ẳ; Ẳ; A◌̆◌̉; Ẳ; A◌̆◌̉; ) LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB3;1EB3;0061 0306 0309;1EB3;0061 0306 0309; # (ẳ; ẳ; a◌̆◌̉; ẳ; a◌̆◌̉; ) LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +1EB4;1EB4;0041 0306 0303;1EB4;0041 0306 0303; # (Ẵ; Ẵ; A◌̆◌̃; Ẵ; A◌̆◌̃; ) LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB5;1EB5;0061 0306 0303;1EB5;0061 0306 0303; # (ẵ; ẵ; a◌̆◌̃; ẵ; a◌̆◌̃; ) LATIN SMALL LETTER A WITH BREVE AND TILDE +1EB6;1EB6;0041 0323 0306;1EB6;0041 0323 0306; # (Ặ; Ặ; A◌̣◌̆; Ặ; A◌̣◌̆; ) LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB7;1EB7;0061 0323 0306;1EB7;0061 0323 0306; # (ặ; ặ; a◌̣◌̆; ặ; a◌̣◌̆; ) LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +1EB8;1EB8;0045 0323;1EB8;0045 0323; # (Ẹ; Ẹ; E◌̣; Ẹ; E◌̣; ) LATIN CAPITAL LETTER E WITH DOT BELOW +1EB9;1EB9;0065 0323;1EB9;0065 0323; # (ẹ; ẹ; e◌̣; ẹ; e◌̣; ) LATIN SMALL LETTER E WITH DOT BELOW +1EBA;1EBA;0045 0309;1EBA;0045 0309; # (Ẻ; Ẻ; E◌̉; Ẻ; E◌̉; ) LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBB;1EBB;0065 0309;1EBB;0065 0309; # (ẻ; ẻ; e◌̉; ẻ; e◌̉; ) LATIN SMALL LETTER E WITH HOOK ABOVE +1EBC;1EBC;0045 0303;1EBC;0045 0303; # (Ẽ; Ẽ; E◌̃; Ẽ; E◌̃; ) LATIN CAPITAL LETTER E WITH TILDE +1EBD;1EBD;0065 0303;1EBD;0065 0303; # (ẽ; ẽ; e◌̃; ẽ; e◌̃; ) LATIN SMALL LETTER E WITH TILDE +1EBE;1EBE;0045 0302 0301;1EBE;0045 0302 0301; # (Ế; Ế; E◌̂◌́; Ế; E◌̂◌́; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EBF;1EBF;0065 0302 0301;1EBF;0065 0302 0301; # (ế; ế; e◌̂◌́; ế; e◌̂◌́; ) LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0;1EC0;0045 0302 0300;1EC0;0045 0302 0300; # (Ề; Ề; E◌̂◌̀; Ề; E◌̂◌̀; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC1;1EC1;0065 0302 0300;1EC1;0065 0302 0300; # (ề; ề; e◌̂◌̀; ề; e◌̂◌̀; ) LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2;1EC2;0045 0302 0309;1EC2;0045 0302 0309; # (Ể; Ể; E◌̂◌̉; Ể; E◌̂◌̉; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC3;1EC3;0065 0302 0309;1EC3;0065 0302 0309; # (ể; ể; e◌̂◌̉; ể; e◌̂◌̉; ) LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4;1EC4;0045 0302 0303;1EC4;0045 0302 0303; # (Ễ; Ễ; E◌̂◌̃; Ễ; E◌̂◌̃; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC5;1EC5;0065 0302 0303;1EC5;0065 0302 0303; # (ễ; ễ; e◌̂◌̃; ễ; e◌̂◌̃; ) LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6;1EC6;0045 0323 0302;1EC6;0045 0323 0302; # (Ệ; Ệ; E◌̣◌̂; Ệ; E◌̣◌̂; ) LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC7;1EC7;0065 0323 0302;1EC7;0065 0323 0302; # (ệ; ệ; e◌̣◌̂; ệ; e◌̣◌̂; ) LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8;1EC8;0049 0309;1EC8;0049 0309; # (Ỉ; Ỉ; I◌̉; Ỉ; I◌̉; ) LATIN CAPITAL LETTER I WITH HOOK ABOVE +1EC9;1EC9;0069 0309;1EC9;0069 0309; # (ỉ; ỉ; i◌̉; ỉ; i◌̉; ) LATIN SMALL LETTER I WITH HOOK ABOVE +1ECA;1ECA;0049 0323;1ECA;0049 0323; # (Ị; Ị; I◌̣; Ị; I◌̣; ) LATIN CAPITAL LETTER I WITH DOT BELOW +1ECB;1ECB;0069 0323;1ECB;0069 0323; # (ị; ị; i◌̣; ị; i◌̣; ) LATIN SMALL LETTER I WITH DOT BELOW +1ECC;1ECC;004F 0323;1ECC;004F 0323; # (Ọ; Ọ; O◌̣; Ọ; O◌̣; ) LATIN CAPITAL LETTER O WITH DOT BELOW +1ECD;1ECD;006F 0323;1ECD;006F 0323; # (ọ; ọ; o◌̣; ọ; o◌̣; ) LATIN SMALL LETTER O WITH DOT BELOW +1ECE;1ECE;004F 0309;1ECE;004F 0309; # (Ỏ; Ỏ; O◌̉; Ỏ; O◌̉; ) LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ECF;1ECF;006F 0309;1ECF;006F 0309; # (ỏ; ỏ; o◌̉; ỏ; o◌̉; ) LATIN SMALL LETTER O WITH HOOK ABOVE +1ED0;1ED0;004F 0302 0301;1ED0;004F 0302 0301; # (Ố; Ố; O◌̂◌́; Ố; O◌̂◌́; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED1;1ED1;006F 0302 0301;1ED1;006F 0302 0301; # (ố; ố; o◌̂◌́; ố; o◌̂◌́; ) LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2;1ED2;004F 0302 0300;1ED2;004F 0302 0300; # (Ồ; Ồ; O◌̂◌̀; Ồ; O◌̂◌̀; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED3;1ED3;006F 0302 0300;1ED3;006F 0302 0300; # (ồ; ồ; o◌̂◌̀; ồ; o◌̂◌̀; ) LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4;1ED4;004F 0302 0309;1ED4;004F 0302 0309; # (Ổ; Ổ; O◌̂◌̉; Ổ; O◌̂◌̉; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED5;1ED5;006F 0302 0309;1ED5;006F 0302 0309; # (ổ; ổ; o◌̂◌̉; ổ; o◌̂◌̉; ) LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6;1ED6;004F 0302 0303;1ED6;004F 0302 0303; # (Ỗ; Ỗ; O◌̂◌̃; Ỗ; O◌̂◌̃; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED7;1ED7;006F 0302 0303;1ED7;006F 0302 0303; # (ỗ; ỗ; o◌̂◌̃; ỗ; o◌̂◌̃; ) LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8;1ED8;004F 0323 0302;1ED8;004F 0323 0302; # (Ộ; Ộ; O◌̣◌̂; Ộ; O◌̣◌̂; ) LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1ED9;1ED9;006F 0323 0302;1ED9;006F 0323 0302; # (ộ; ộ; o◌̣◌̂; ộ; o◌̣◌̂; ) LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA;1EDA;004F 031B 0301;1EDA;004F 031B 0301; # (Ớ; Ớ; O◌̛◌́; Ớ; O◌̛◌́; ) LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDB;1EDB;006F 031B 0301;1EDB;006F 031B 0301; # (ớ; ớ; o◌̛◌́; ớ; o◌̛◌́; ) LATIN SMALL LETTER O WITH HORN AND ACUTE +1EDC;1EDC;004F 031B 0300;1EDC;004F 031B 0300; # (Ờ; Ờ; O◌̛◌̀; Ờ; O◌̛◌̀; ) LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDD;1EDD;006F 031B 0300;1EDD;006F 031B 0300; # (ờ; ờ; o◌̛◌̀; ờ; o◌̛◌̀; ) LATIN SMALL LETTER O WITH HORN AND GRAVE +1EDE;1EDE;004F 031B 0309;1EDE;004F 031B 0309; # (Ở; Ở; O◌̛◌̉; Ở; O◌̛◌̉; ) LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EDF;1EDF;006F 031B 0309;1EDF;006F 031B 0309; # (ở; ở; o◌̛◌̉; ở; o◌̛◌̉; ) LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +1EE0;1EE0;004F 031B 0303;1EE0;004F 031B 0303; # (Ỡ; Ỡ; O◌̛◌̃; Ỡ; O◌̛◌̃; ) LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE1;1EE1;006F 031B 0303;1EE1;006F 031B 0303; # (ỡ; ỡ; o◌̛◌̃; ỡ; o◌̛◌̃; ) LATIN SMALL LETTER O WITH HORN AND TILDE +1EE2;1EE2;004F 031B 0323;1EE2;004F 031B 0323; # (Ợ; Ợ; O◌̛◌̣; Ợ; O◌̛◌̣; ) LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE3;1EE3;006F 031B 0323;1EE3;006F 031B 0323; # (ợ; ợ; o◌̛◌̣; ợ; o◌̛◌̣; ) LATIN SMALL LETTER O WITH HORN AND DOT BELOW +1EE4;1EE4;0055 0323;1EE4;0055 0323; # (Ụ; Ụ; U◌̣; Ụ; U◌̣; ) LATIN CAPITAL LETTER U WITH DOT BELOW +1EE5;1EE5;0075 0323;1EE5;0075 0323; # (ụ; ụ; u◌̣; ụ; u◌̣; ) LATIN SMALL LETTER U WITH DOT BELOW +1EE6;1EE6;0055 0309;1EE6;0055 0309; # (Ủ; Ủ; U◌̉; Ủ; U◌̉; ) LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE7;1EE7;0075 0309;1EE7;0075 0309; # (ủ; ủ; u◌̉; ủ; u◌̉; ) LATIN SMALL LETTER U WITH HOOK ABOVE +1EE8;1EE8;0055 031B 0301;1EE8;0055 031B 0301; # (Ứ; Ứ; U◌̛◌́; Ứ; U◌̛◌́; ) LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EE9;1EE9;0075 031B 0301;1EE9;0075 031B 0301; # (ứ; ứ; u◌̛◌́; ứ; u◌̛◌́; ) LATIN SMALL LETTER U WITH HORN AND ACUTE +1EEA;1EEA;0055 031B 0300;1EEA;0055 031B 0300; # (Ừ; Ừ; U◌̛◌̀; Ừ; U◌̛◌̀; ) LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEB;1EEB;0075 031B 0300;1EEB;0075 031B 0300; # (ừ; ừ; u◌̛◌̀; ừ; u◌̛◌̀; ) LATIN SMALL LETTER U WITH HORN AND GRAVE +1EEC;1EEC;0055 031B 0309;1EEC;0055 031B 0309; # (Ử; Ử; U◌̛◌̉; Ử; U◌̛◌̉; ) LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EED;1EED;0075 031B 0309;1EED;0075 031B 0309; # (ử; ử; u◌̛◌̉; ử; u◌̛◌̉; ) LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +1EEE;1EEE;0055 031B 0303;1EEE;0055 031B 0303; # (Ữ; Ữ; U◌̛◌̃; Ữ; U◌̛◌̃; ) LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EEF;1EEF;0075 031B 0303;1EEF;0075 031B 0303; # (ữ; ữ; u◌̛◌̃; ữ; u◌̛◌̃; ) LATIN SMALL LETTER U WITH HORN AND TILDE +1EF0;1EF0;0055 031B 0323;1EF0;0055 031B 0323; # (Ự; Ự; U◌̛◌̣; Ự; U◌̛◌̣; ) LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF1;1EF1;0075 031B 0323;1EF1;0075 031B 0323; # (ự; ự; u◌̛◌̣; ự; u◌̛◌̣; ) LATIN SMALL LETTER U WITH HORN AND DOT BELOW +1EF2;1EF2;0059 0300;1EF2;0059 0300; # (Ỳ; Ỳ; Y◌̀; Ỳ; Y◌̀; ) LATIN CAPITAL LETTER Y WITH GRAVE +1EF3;1EF3;0079 0300;1EF3;0079 0300; # (ỳ; ỳ; y◌̀; ỳ; y◌̀; ) LATIN SMALL LETTER Y WITH GRAVE +1EF4;1EF4;0059 0323;1EF4;0059 0323; # (Ỵ; Ỵ; Y◌̣; Ỵ; Y◌̣; ) LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF5;1EF5;0079 0323;1EF5;0079 0323; # (ỵ; ỵ; y◌̣; ỵ; y◌̣; ) LATIN SMALL LETTER Y WITH DOT BELOW +1EF6;1EF6;0059 0309;1EF6;0059 0309; # (Ỷ; Ỷ; Y◌̉; Ỷ; Y◌̉; ) LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF7;1EF7;0079 0309;1EF7;0079 0309; # (ỷ; ỷ; y◌̉; ỷ; y◌̉; ) LATIN SMALL LETTER Y WITH HOOK ABOVE +1EF8;1EF8;0059 0303;1EF8;0059 0303; # (Ỹ; Ỹ; Y◌̃; Ỹ; Y◌̃; ) LATIN CAPITAL LETTER Y WITH TILDE +1EF9;1EF9;0079 0303;1EF9;0079 0303; # (ỹ; ỹ; y◌̃; ỹ; y◌̃; ) LATIN SMALL LETTER Y WITH TILDE +1F00;1F00;03B1 0313;1F00;03B1 0313; # (ἀ; ἀ; α◌̓; ἀ; α◌̓; ) GREEK SMALL LETTER ALPHA WITH PSILI +1F01;1F01;03B1 0314;1F01;03B1 0314; # (ἁ; ἁ; α◌̔; ἁ; α◌̔; ) GREEK SMALL LETTER ALPHA WITH DASIA +1F02;1F02;03B1 0313 0300;1F02;03B1 0313 0300; # (ἂ; ἂ; α◌̓◌̀; ἂ; α◌̓◌̀; ) GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +1F03;1F03;03B1 0314 0300;1F03;03B1 0314 0300; # (ἃ; ἃ; α◌̔◌̀; ἃ; α◌̔◌̀; ) GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +1F04;1F04;03B1 0313 0301;1F04;03B1 0313 0301; # (ἄ; ἄ; α◌̓◌́; ἄ; α◌̓◌́; ) GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +1F05;1F05;03B1 0314 0301;1F05;03B1 0314 0301; # (ἅ; ἅ; α◌̔◌́; ἅ; α◌̔◌́; ) GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +1F06;1F06;03B1 0313 0342;1F06;03B1 0313 0342; # (ἆ; ἆ; α◌̓◌͂; ἆ; α◌̓◌͂; ) GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F07;1F07;03B1 0314 0342;1F07;03B1 0314 0342; # (ἇ; ἇ; α◌̔◌͂; ἇ; α◌̔◌͂; ) GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F08;1F08;0391 0313;1F08;0391 0313; # (Ἀ; Ἀ; Α◌̓; Ἀ; Α◌̓; ) GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09;1F09;0391 0314;1F09;0391 0314; # (Ἁ; Ἁ; Α◌̔; Ἁ; Α◌̔; ) GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A;1F0A;0391 0313 0300;1F0A;0391 0313 0300; # (Ἂ; Ἂ; Α◌̓◌̀; Ἂ; Α◌̓◌̀; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B;1F0B;0391 0314 0300;1F0B;0391 0314 0300; # (Ἃ; Ἃ; Α◌̔◌̀; Ἃ; Α◌̔◌̀; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C;1F0C;0391 0313 0301;1F0C;0391 0313 0301; # (Ἄ; Ἄ; Α◌̓◌́; Ἄ; Α◌̓◌́; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D;1F0D;0391 0314 0301;1F0D;0391 0314 0301; # (Ἅ; Ἅ; Α◌̔◌́; Ἅ; Α◌̔◌́; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E;1F0E;0391 0313 0342;1F0E;0391 0313 0342; # (Ἆ; Ἆ; Α◌̓◌͂; Ἆ; Α◌̓◌͂; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F;1F0F;0391 0314 0342;1F0F;0391 0314 0342; # (Ἇ; Ἇ; Α◌̔◌͂; Ἇ; Α◌̔◌͂; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F10;1F10;03B5 0313;1F10;03B5 0313; # (ἐ; ἐ; ε◌̓; ἐ; ε◌̓; ) GREEK SMALL LETTER EPSILON WITH PSILI +1F11;1F11;03B5 0314;1F11;03B5 0314; # (ἑ; ἑ; ε◌̔; ἑ; ε◌̔; ) GREEK SMALL LETTER EPSILON WITH DASIA +1F12;1F12;03B5 0313 0300;1F12;03B5 0313 0300; # (ἒ; ἒ; ε◌̓◌̀; ἒ; ε◌̓◌̀; ) GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA +1F13;1F13;03B5 0314 0300;1F13;03B5 0314 0300; # (ἓ; ἓ; ε◌̔◌̀; ἓ; ε◌̔◌̀; ) GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA +1F14;1F14;03B5 0313 0301;1F14;03B5 0313 0301; # (ἔ; ἔ; ε◌̓◌́; ἔ; ε◌̓◌́; ) GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA +1F15;1F15;03B5 0314 0301;1F15;03B5 0314 0301; # (ἕ; ἕ; ε◌̔◌́; ἕ; ε◌̔◌́; ) GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18;1F18;0395 0313;1F18;0395 0313; # (Ἐ; Ἐ; Ε◌̓; Ἐ; Ε◌̓; ) GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19;1F19;0395 0314;1F19;0395 0314; # (Ἑ; Ἑ; Ε◌̔; Ἑ; Ε◌̔; ) GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A;1F1A;0395 0313 0300;1F1A;0395 0313 0300; # (Ἒ; Ἒ; Ε◌̓◌̀; Ἒ; Ε◌̓◌̀; ) GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B;1F1B;0395 0314 0300;1F1B;0395 0314 0300; # (Ἓ; Ἓ; Ε◌̔◌̀; Ἓ; Ε◌̔◌̀; ) GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C;1F1C;0395 0313 0301;1F1C;0395 0313 0301; # (Ἔ; Ἔ; Ε◌̓◌́; Ἔ; Ε◌̓◌́; ) GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D;1F1D;0395 0314 0301;1F1D;0395 0314 0301; # (Ἕ; Ἕ; Ε◌̔◌́; Ἕ; Ε◌̔◌́; ) GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20;1F20;03B7 0313;1F20;03B7 0313; # (ἠ; ἠ; η◌̓; ἠ; η◌̓; ) GREEK SMALL LETTER ETA WITH PSILI +1F21;1F21;03B7 0314;1F21;03B7 0314; # (ἡ; ἡ; η◌̔; ἡ; η◌̔; ) GREEK SMALL LETTER ETA WITH DASIA +1F22;1F22;03B7 0313 0300;1F22;03B7 0313 0300; # (ἢ; ἢ; η◌̓◌̀; ἢ; η◌̓◌̀; ) GREEK SMALL LETTER ETA WITH PSILI AND VARIA +1F23;1F23;03B7 0314 0300;1F23;03B7 0314 0300; # (ἣ; ἣ; η◌̔◌̀; ἣ; η◌̔◌̀; ) GREEK SMALL LETTER ETA WITH DASIA AND VARIA +1F24;1F24;03B7 0313 0301;1F24;03B7 0313 0301; # (ἤ; ἤ; η◌̓◌́; ἤ; η◌̓◌́; ) GREEK SMALL LETTER ETA WITH PSILI AND OXIA +1F25;1F25;03B7 0314 0301;1F25;03B7 0314 0301; # (ἥ; ἥ; η◌̔◌́; ἥ; η◌̔◌́; ) GREEK SMALL LETTER ETA WITH DASIA AND OXIA +1F26;1F26;03B7 0313 0342;1F26;03B7 0313 0342; # (ἦ; ἦ; η◌̓◌͂; ἦ; η◌̓◌͂; ) GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI +1F27;1F27;03B7 0314 0342;1F27;03B7 0314 0342; # (ἧ; ἧ; η◌̔◌͂; ἧ; η◌̔◌͂; ) GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +1F28;1F28;0397 0313;1F28;0397 0313; # (Ἠ; Ἠ; Η◌̓; Ἠ; Η◌̓; ) GREEK CAPITAL LETTER ETA WITH PSILI +1F29;1F29;0397 0314;1F29;0397 0314; # (Ἡ; Ἡ; Η◌̔; Ἡ; Η◌̔; ) GREEK CAPITAL LETTER ETA WITH DASIA +1F2A;1F2A;0397 0313 0300;1F2A;0397 0313 0300; # (Ἢ; Ἢ; Η◌̓◌̀; Ἢ; Η◌̓◌̀; ) GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B;1F2B;0397 0314 0300;1F2B;0397 0314 0300; # (Ἣ; Ἣ; Η◌̔◌̀; Ἣ; Η◌̔◌̀; ) GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C;1F2C;0397 0313 0301;1F2C;0397 0313 0301; # (Ἤ; Ἤ; Η◌̓◌́; Ἤ; Η◌̓◌́; ) GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D;1F2D;0397 0314 0301;1F2D;0397 0314 0301; # (Ἥ; Ἥ; Η◌̔◌́; Ἥ; Η◌̔◌́; ) GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E;1F2E;0397 0313 0342;1F2E;0397 0313 0342; # (Ἦ; Ἦ; Η◌̓◌͂; Ἦ; Η◌̓◌͂; ) GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F;1F2F;0397 0314 0342;1F2F;0397 0314 0342; # (Ἧ; Ἧ; Η◌̔◌͂; Ἧ; Η◌̔◌͂; ) GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F30;1F30;03B9 0313;1F30;03B9 0313; # (ἰ; ἰ; ι◌̓; ἰ; ι◌̓; ) GREEK SMALL LETTER IOTA WITH PSILI +1F31;1F31;03B9 0314;1F31;03B9 0314; # (ἱ; ἱ; ι◌̔; ἱ; ι◌̔; ) GREEK SMALL LETTER IOTA WITH DASIA +1F32;1F32;03B9 0313 0300;1F32;03B9 0313 0300; # (ἲ; ἲ; ι◌̓◌̀; ἲ; ι◌̓◌̀; ) GREEK SMALL LETTER IOTA WITH PSILI AND VARIA +1F33;1F33;03B9 0314 0300;1F33;03B9 0314 0300; # (ἳ; ἳ; ι◌̔◌̀; ἳ; ι◌̔◌̀; ) GREEK SMALL LETTER IOTA WITH DASIA AND VARIA +1F34;1F34;03B9 0313 0301;1F34;03B9 0313 0301; # (ἴ; ἴ; ι◌̓◌́; ἴ; ι◌̓◌́; ) GREEK SMALL LETTER IOTA WITH PSILI AND OXIA +1F35;1F35;03B9 0314 0301;1F35;03B9 0314 0301; # (ἵ; ἵ; ι◌̔◌́; ἵ; ι◌̔◌́; ) GREEK SMALL LETTER IOTA WITH DASIA AND OXIA +1F36;1F36;03B9 0313 0342;1F36;03B9 0313 0342; # (ἶ; ἶ; ι◌̓◌͂; ἶ; ι◌̓◌͂; ) GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI +1F37;1F37;03B9 0314 0342;1F37;03B9 0314 0342; # (ἷ; ἷ; ι◌̔◌͂; ἷ; ι◌̔◌͂; ) GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +1F38;1F38;0399 0313;1F38;0399 0313; # (Ἰ; Ἰ; Ι◌̓; Ἰ; Ι◌̓; ) GREEK CAPITAL LETTER IOTA WITH PSILI +1F39;1F39;0399 0314;1F39;0399 0314; # (Ἱ; Ἱ; Ι◌̔; Ἱ; Ι◌̔; ) GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A;1F3A;0399 0313 0300;1F3A;0399 0313 0300; # (Ἲ; Ἲ; Ι◌̓◌̀; Ἲ; Ι◌̓◌̀; ) GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B;1F3B;0399 0314 0300;1F3B;0399 0314 0300; # (Ἳ; Ἳ; Ι◌̔◌̀; Ἳ; Ι◌̔◌̀; ) GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C;1F3C;0399 0313 0301;1F3C;0399 0313 0301; # (Ἴ; Ἴ; Ι◌̓◌́; Ἴ; Ι◌̓◌́; ) GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D;1F3D;0399 0314 0301;1F3D;0399 0314 0301; # (Ἵ; Ἵ; Ι◌̔◌́; Ἵ; Ι◌̔◌́; ) GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E;1F3E;0399 0313 0342;1F3E;0399 0313 0342; # (Ἶ; Ἶ; Ι◌̓◌͂; Ἶ; Ι◌̓◌͂; ) GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F;1F3F;0399 0314 0342;1F3F;0399 0314 0342; # (Ἷ; Ἷ; Ι◌̔◌͂; Ἷ; Ι◌̔◌͂; ) GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F40;1F40;03BF 0313;1F40;03BF 0313; # (ὀ; ὀ; ο◌̓; ὀ; ο◌̓; ) GREEK SMALL LETTER OMICRON WITH PSILI +1F41;1F41;03BF 0314;1F41;03BF 0314; # (ὁ; ὁ; ο◌̔; ὁ; ο◌̔; ) GREEK SMALL LETTER OMICRON WITH DASIA +1F42;1F42;03BF 0313 0300;1F42;03BF 0313 0300; # (ὂ; ὂ; ο◌̓◌̀; ὂ; ο◌̓◌̀; ) GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA +1F43;1F43;03BF 0314 0300;1F43;03BF 0314 0300; # (ὃ; ὃ; ο◌̔◌̀; ὃ; ο◌̔◌̀; ) GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA +1F44;1F44;03BF 0313 0301;1F44;03BF 0313 0301; # (ὄ; ὄ; ο◌̓◌́; ὄ; ο◌̓◌́; ) GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA +1F45;1F45;03BF 0314 0301;1F45;03BF 0314 0301; # (ὅ; ὅ; ο◌̔◌́; ὅ; ο◌̔◌́; ) GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48;1F48;039F 0313;1F48;039F 0313; # (Ὀ; Ὀ; Ο◌̓; Ὀ; Ο◌̓; ) GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49;1F49;039F 0314;1F49;039F 0314; # (Ὁ; Ὁ; Ο◌̔; Ὁ; Ο◌̔; ) GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A;1F4A;039F 0313 0300;1F4A;039F 0313 0300; # (Ὂ; Ὂ; Ο◌̓◌̀; Ὂ; Ο◌̓◌̀; ) GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B;1F4B;039F 0314 0300;1F4B;039F 0314 0300; # (Ὃ; Ὃ; Ο◌̔◌̀; Ὃ; Ο◌̔◌̀; ) GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C;1F4C;039F 0313 0301;1F4C;039F 0313 0301; # (Ὄ; Ὄ; Ο◌̓◌́; Ὄ; Ο◌̓◌́; ) GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D;1F4D;039F 0314 0301;1F4D;039F 0314 0301; # (Ὅ; Ὅ; Ο◌̔◌́; Ὅ; Ο◌̔◌́; ) GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50;1F50;03C5 0313;1F50;03C5 0313; # (ὐ; ὐ; υ◌̓; ὐ; υ◌̓; ) GREEK SMALL LETTER UPSILON WITH PSILI +1F51;1F51;03C5 0314;1F51;03C5 0314; # (ὑ; ὑ; υ◌̔; ὑ; υ◌̔; ) GREEK SMALL LETTER UPSILON WITH DASIA +1F52;1F52;03C5 0313 0300;1F52;03C5 0313 0300; # (ὒ; ὒ; υ◌̓◌̀; ὒ; υ◌̓◌̀; ) GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F53;1F53;03C5 0314 0300;1F53;03C5 0314 0300; # (ὓ; ὓ; υ◌̔◌̀; ὓ; υ◌̔◌̀; ) GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA +1F54;1F54;03C5 0313 0301;1F54;03C5 0313 0301; # (ὔ; ὔ; υ◌̓◌́; ὔ; υ◌̓◌́; ) GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F55;1F55;03C5 0314 0301;1F55;03C5 0314 0301; # (ὕ; ὕ; υ◌̔◌́; ὕ; υ◌̔◌́; ) GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA +1F56;1F56;03C5 0313 0342;1F56;03C5 0313 0342; # (ὖ; ὖ; υ◌̓◌͂; ὖ; υ◌̓◌͂; ) GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F57;1F57;03C5 0314 0342;1F57;03C5 0314 0342; # (ὗ; ὗ; υ◌̔◌͂; ὗ; υ◌̔◌͂; ) GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59;1F59;03A5 0314;1F59;03A5 0314; # (Ὑ; Ὑ; Υ◌̔; Ὑ; Υ◌̔; ) GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B;1F5B;03A5 0314 0300;1F5B;03A5 0314 0300; # (Ὓ; Ὓ; Υ◌̔◌̀; Ὓ; Υ◌̔◌̀; ) GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D;1F5D;03A5 0314 0301;1F5D;03A5 0314 0301; # (Ὕ; Ὕ; Υ◌̔◌́; Ὕ; Υ◌̔◌́; ) GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F;1F5F;03A5 0314 0342;1F5F;03A5 0314 0342; # (Ὗ; Ὗ; Υ◌̔◌͂; Ὗ; Υ◌̔◌͂; ) GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F60;1F60;03C9 0313;1F60;03C9 0313; # (ὠ; ὠ; ω◌̓; ὠ; ω◌̓; ) GREEK SMALL LETTER OMEGA WITH PSILI +1F61;1F61;03C9 0314;1F61;03C9 0314; # (ὡ; ὡ; ω◌̔; ὡ; ω◌̔; ) GREEK SMALL LETTER OMEGA WITH DASIA +1F62;1F62;03C9 0313 0300;1F62;03C9 0313 0300; # (ὢ; ὢ; ω◌̓◌̀; ὢ; ω◌̓◌̀; ) GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA +1F63;1F63;03C9 0314 0300;1F63;03C9 0314 0300; # (ὣ; ὣ; ω◌̔◌̀; ὣ; ω◌̔◌̀; ) GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +1F64;1F64;03C9 0313 0301;1F64;03C9 0313 0301; # (ὤ; ὤ; ω◌̓◌́; ὤ; ω◌̓◌́; ) GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA +1F65;1F65;03C9 0314 0301;1F65;03C9 0314 0301; # (ὥ; ὥ; ω◌̔◌́; ὥ; ω◌̔◌́; ) GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA +1F66;1F66;03C9 0313 0342;1F66;03C9 0313 0342; # (ὦ; ὦ; ω◌̓◌͂; ὦ; ω◌̓◌͂; ) GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F67;1F67;03C9 0314 0342;1F67;03C9 0314 0342; # (ὧ; ὧ; ω◌̔◌͂; ὧ; ω◌̔◌͂; ) GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F68;1F68;03A9 0313;1F68;03A9 0313; # (Ὠ; Ὠ; Ω◌̓; Ὠ; Ω◌̓; ) GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69;1F69;03A9 0314;1F69;03A9 0314; # (Ὡ; Ὡ; Ω◌̔; Ὡ; Ω◌̔; ) GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A;1F6A;03A9 0313 0300;1F6A;03A9 0313 0300; # (Ὢ; Ὢ; Ω◌̓◌̀; Ὢ; Ω◌̓◌̀; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B;1F6B;03A9 0314 0300;1F6B;03A9 0314 0300; # (Ὣ; Ὣ; Ω◌̔◌̀; Ὣ; Ω◌̔◌̀; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C;1F6C;03A9 0313 0301;1F6C;03A9 0313 0301; # (Ὤ; Ὤ; Ω◌̓◌́; Ὤ; Ω◌̓◌́; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D;1F6D;03A9 0314 0301;1F6D;03A9 0314 0301; # (Ὥ; Ὥ; Ω◌̔◌́; Ὥ; Ω◌̔◌́; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E;1F6E;03A9 0313 0342;1F6E;03A9 0313 0342; # (Ὦ; Ὦ; Ω◌̓◌͂; Ὦ; Ω◌̓◌͂; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F;1F6F;03A9 0314 0342;1F6F;03A9 0314 0342; # (Ὧ; Ὧ; Ω◌̔◌͂; Ὧ; Ω◌̔◌͂; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F70;1F70;03B1 0300;1F70;03B1 0300; # (ὰ; ὰ; α◌̀; ὰ; α◌̀; ) GREEK SMALL LETTER ALPHA WITH VARIA +1F71;03AC;03B1 0301;03AC;03B1 0301; # (ά; ά; α◌́; ά; α◌́; ) GREEK SMALL LETTER ALPHA WITH OXIA +1F72;1F72;03B5 0300;1F72;03B5 0300; # (ὲ; ὲ; ε◌̀; ὲ; ε◌̀; ) GREEK SMALL LETTER EPSILON WITH VARIA +1F73;03AD;03B5 0301;03AD;03B5 0301; # (έ; έ; ε◌́; έ; ε◌́; ) GREEK SMALL LETTER EPSILON WITH OXIA +1F74;1F74;03B7 0300;1F74;03B7 0300; # (ὴ; ὴ; η◌̀; ὴ; η◌̀; ) GREEK SMALL LETTER ETA WITH VARIA +1F75;03AE;03B7 0301;03AE;03B7 0301; # (ή; ή; η◌́; ή; η◌́; ) GREEK SMALL LETTER ETA WITH OXIA +1F76;1F76;03B9 0300;1F76;03B9 0300; # (ὶ; ὶ; ι◌̀; ὶ; ι◌̀; ) GREEK SMALL LETTER IOTA WITH VARIA +1F77;03AF;03B9 0301;03AF;03B9 0301; # (ί; ί; ι◌́; ί; ι◌́; ) GREEK SMALL LETTER IOTA WITH OXIA +1F78;1F78;03BF 0300;1F78;03BF 0300; # (ὸ; ὸ; ο◌̀; ὸ; ο◌̀; ) GREEK SMALL LETTER OMICRON WITH VARIA +1F79;03CC;03BF 0301;03CC;03BF 0301; # (ό; ό; ο◌́; ό; ο◌́; ) GREEK SMALL LETTER OMICRON WITH OXIA +1F7A;1F7A;03C5 0300;1F7A;03C5 0300; # (ὺ; ὺ; υ◌̀; ὺ; υ◌̀; ) GREEK SMALL LETTER UPSILON WITH VARIA +1F7B;03CD;03C5 0301;03CD;03C5 0301; # (ύ; ύ; υ◌́; ύ; υ◌́; ) GREEK SMALL LETTER UPSILON WITH OXIA +1F7C;1F7C;03C9 0300;1F7C;03C9 0300; # (ὼ; ὼ; ω◌̀; ὼ; ω◌̀; ) GREEK SMALL LETTER OMEGA WITH VARIA +1F7D;03CE;03C9 0301;03CE;03C9 0301; # (ώ; ώ; ω◌́; ώ; ω◌́; ) GREEK SMALL LETTER OMEGA WITH OXIA +1F80;1F80;03B1 0313 0345;1F80;03B1 0313 0345; # (ᾀ; ᾀ; α◌̓◌ͅ; ᾀ; α◌̓◌ͅ; ) GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81;1F81;03B1 0314 0345;1F81;03B1 0314 0345; # (ᾁ; ᾁ; α◌̔◌ͅ; ᾁ; α◌̔◌ͅ; ) GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82;1F82;03B1 0313 0300 0345;1F82;03B1 0313 0300 0345; # (ᾂ; ᾂ; α◌̓◌̀◌ͅ; ᾂ; α◌̓◌̀◌ͅ; ) GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83;1F83;03B1 0314 0300 0345;1F83;03B1 0314 0300 0345; # (ᾃ; ᾃ; α◌̔◌̀◌ͅ; ᾃ; α◌̔◌̀◌ͅ; ) GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84;1F84;03B1 0313 0301 0345;1F84;03B1 0313 0301 0345; # (ᾄ; ᾄ; α◌̓◌́◌ͅ; ᾄ; α◌̓◌́◌ͅ; ) GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85;1F85;03B1 0314 0301 0345;1F85;03B1 0314 0301 0345; # (ᾅ; ᾅ; α◌̔◌́◌ͅ; ᾅ; α◌̔◌́◌ͅ; ) GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86;1F86;03B1 0313 0342 0345;1F86;03B1 0313 0342 0345; # (ᾆ; ᾆ; α◌̓◌͂◌ͅ; ᾆ; α◌̓◌͂◌ͅ; ) GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87;1F87;03B1 0314 0342 0345;1F87;03B1 0314 0342 0345; # (ᾇ; ᾇ; α◌̔◌͂◌ͅ; ᾇ; α◌̔◌͂◌ͅ; ) GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88;1F88;0391 0313 0345;1F88;0391 0313 0345; # (ᾈ; ᾈ; Α◌̓◌ͅ; ᾈ; Α◌̓◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89;1F89;0391 0314 0345;1F89;0391 0314 0345; # (ᾉ; ᾉ; Α◌̔◌ͅ; ᾉ; Α◌̔◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A;1F8A;0391 0313 0300 0345;1F8A;0391 0313 0300 0345; # (ᾊ; ᾊ; Α◌̓◌̀◌ͅ; ᾊ; Α◌̓◌̀◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B;1F8B;0391 0314 0300 0345;1F8B;0391 0314 0300 0345; # (ᾋ; ᾋ; Α◌̔◌̀◌ͅ; ᾋ; Α◌̔◌̀◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C;1F8C;0391 0313 0301 0345;1F8C;0391 0313 0301 0345; # (ᾌ; ᾌ; Α◌̓◌́◌ͅ; ᾌ; Α◌̓◌́◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D;1F8D;0391 0314 0301 0345;1F8D;0391 0314 0301 0345; # (ᾍ; ᾍ; Α◌̔◌́◌ͅ; ᾍ; Α◌̔◌́◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E;1F8E;0391 0313 0342 0345;1F8E;0391 0313 0342 0345; # (ᾎ; ᾎ; Α◌̓◌͂◌ͅ; ᾎ; Α◌̓◌͂◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F;1F8F;0391 0314 0342 0345;1F8F;0391 0314 0342 0345; # (ᾏ; ᾏ; Α◌̔◌͂◌ͅ; ᾏ; Α◌̔◌͂◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90;1F90;03B7 0313 0345;1F90;03B7 0313 0345; # (ᾐ; ᾐ; η◌̓◌ͅ; ᾐ; η◌̓◌ͅ; ) GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91;1F91;03B7 0314 0345;1F91;03B7 0314 0345; # (ᾑ; ᾑ; η◌̔◌ͅ; ᾑ; η◌̔◌ͅ; ) GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92;1F92;03B7 0313 0300 0345;1F92;03B7 0313 0300 0345; # (ᾒ; ᾒ; η◌̓◌̀◌ͅ; ᾒ; η◌̓◌̀◌ͅ; ) GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93;1F93;03B7 0314 0300 0345;1F93;03B7 0314 0300 0345; # (ᾓ; ᾓ; η◌̔◌̀◌ͅ; ᾓ; η◌̔◌̀◌ͅ; ) GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94;1F94;03B7 0313 0301 0345;1F94;03B7 0313 0301 0345; # (ᾔ; ᾔ; η◌̓◌́◌ͅ; ᾔ; η◌̓◌́◌ͅ; ) GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95;1F95;03B7 0314 0301 0345;1F95;03B7 0314 0301 0345; # (ᾕ; ᾕ; η◌̔◌́◌ͅ; ᾕ; η◌̔◌́◌ͅ; ) GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96;1F96;03B7 0313 0342 0345;1F96;03B7 0313 0342 0345; # (ᾖ; ᾖ; η◌̓◌͂◌ͅ; ᾖ; η◌̓◌͂◌ͅ; ) GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97;1F97;03B7 0314 0342 0345;1F97;03B7 0314 0342 0345; # (ᾗ; ᾗ; η◌̔◌͂◌ͅ; ᾗ; η◌̔◌͂◌ͅ; ) GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98;1F98;0397 0313 0345;1F98;0397 0313 0345; # (ᾘ; ᾘ; Η◌̓◌ͅ; ᾘ; Η◌̓◌ͅ; ) GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99;1F99;0397 0314 0345;1F99;0397 0314 0345; # (ᾙ; ᾙ; Η◌̔◌ͅ; ᾙ; Η◌̔◌ͅ; ) GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A;1F9A;0397 0313 0300 0345;1F9A;0397 0313 0300 0345; # (ᾚ; ᾚ; Η◌̓◌̀◌ͅ; ᾚ; Η◌̓◌̀◌ͅ; ) GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B;1F9B;0397 0314 0300 0345;1F9B;0397 0314 0300 0345; # (ᾛ; ᾛ; Η◌̔◌̀◌ͅ; ᾛ; Η◌̔◌̀◌ͅ; ) GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C;1F9C;0397 0313 0301 0345;1F9C;0397 0313 0301 0345; # (ᾜ; ᾜ; Η◌̓◌́◌ͅ; ᾜ; Η◌̓◌́◌ͅ; ) GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D;1F9D;0397 0314 0301 0345;1F9D;0397 0314 0301 0345; # (ᾝ; ᾝ; Η◌̔◌́◌ͅ; ᾝ; Η◌̔◌́◌ͅ; ) GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E;1F9E;0397 0313 0342 0345;1F9E;0397 0313 0342 0345; # (ᾞ; ᾞ; Η◌̓◌͂◌ͅ; ᾞ; Η◌̓◌͂◌ͅ; ) GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F;1F9F;0397 0314 0342 0345;1F9F;0397 0314 0342 0345; # (ᾟ; ᾟ; Η◌̔◌͂◌ͅ; ᾟ; Η◌̔◌͂◌ͅ; ) GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0;1FA0;03C9 0313 0345;1FA0;03C9 0313 0345; # (ᾠ; ᾠ; ω◌̓◌ͅ; ᾠ; ω◌̓◌ͅ; ) GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1;1FA1;03C9 0314 0345;1FA1;03C9 0314 0345; # (ᾡ; ᾡ; ω◌̔◌ͅ; ᾡ; ω◌̔◌ͅ; ) GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2;1FA2;03C9 0313 0300 0345;1FA2;03C9 0313 0300 0345; # (ᾢ; ᾢ; ω◌̓◌̀◌ͅ; ᾢ; ω◌̓◌̀◌ͅ; ) GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3;1FA3;03C9 0314 0300 0345;1FA3;03C9 0314 0300 0345; # (ᾣ; ᾣ; ω◌̔◌̀◌ͅ; ᾣ; ω◌̔◌̀◌ͅ; ) GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4;1FA4;03C9 0313 0301 0345;1FA4;03C9 0313 0301 0345; # (ᾤ; ᾤ; ω◌̓◌́◌ͅ; ᾤ; ω◌̓◌́◌ͅ; ) GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5;1FA5;03C9 0314 0301 0345;1FA5;03C9 0314 0301 0345; # (ᾥ; ᾥ; ω◌̔◌́◌ͅ; ᾥ; ω◌̔◌́◌ͅ; ) GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6;1FA6;03C9 0313 0342 0345;1FA6;03C9 0313 0342 0345; # (ᾦ; ᾦ; ω◌̓◌͂◌ͅ; ᾦ; ω◌̓◌͂◌ͅ; ) GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7;1FA7;03C9 0314 0342 0345;1FA7;03C9 0314 0342 0345; # (ᾧ; ᾧ; ω◌̔◌͂◌ͅ; ᾧ; ω◌̔◌͂◌ͅ; ) GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8;1FA8;03A9 0313 0345;1FA8;03A9 0313 0345; # (ᾨ; ᾨ; Ω◌̓◌ͅ; ᾨ; Ω◌̓◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9;1FA9;03A9 0314 0345;1FA9;03A9 0314 0345; # (ᾩ; ᾩ; Ω◌̔◌ͅ; ᾩ; Ω◌̔◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA;1FAA;03A9 0313 0300 0345;1FAA;03A9 0313 0300 0345; # (ᾪ; ᾪ; Ω◌̓◌̀◌ͅ; ᾪ; Ω◌̓◌̀◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB;1FAB;03A9 0314 0300 0345;1FAB;03A9 0314 0300 0345; # (ᾫ; ᾫ; Ω◌̔◌̀◌ͅ; ᾫ; Ω◌̔◌̀◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC;1FAC;03A9 0313 0301 0345;1FAC;03A9 0313 0301 0345; # (ᾬ; ᾬ; Ω◌̓◌́◌ͅ; ᾬ; Ω◌̓◌́◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD;1FAD;03A9 0314 0301 0345;1FAD;03A9 0314 0301 0345; # (ᾭ; ᾭ; Ω◌̔◌́◌ͅ; ᾭ; Ω◌̔◌́◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE;1FAE;03A9 0313 0342 0345;1FAE;03A9 0313 0342 0345; # (ᾮ; ᾮ; Ω◌̓◌͂◌ͅ; ᾮ; Ω◌̓◌͂◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF;1FAF;03A9 0314 0342 0345;1FAF;03A9 0314 0342 0345; # (ᾯ; ᾯ; Ω◌̔◌͂◌ͅ; ᾯ; Ω◌̔◌͂◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB0;1FB0;03B1 0306;1FB0;03B1 0306; # (ᾰ; ᾰ; α◌̆; ᾰ; α◌̆; ) GREEK SMALL LETTER ALPHA WITH VRACHY +1FB1;1FB1;03B1 0304;1FB1;03B1 0304; # (ᾱ; ᾱ; α◌̄; ᾱ; α◌̄; ) GREEK SMALL LETTER ALPHA WITH MACRON +1FB2;1FB2;03B1 0300 0345;1FB2;03B1 0300 0345; # (ᾲ; ᾲ; α◌̀◌ͅ; ᾲ; α◌̀◌ͅ; ) GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3;1FB3;03B1 0345;1FB3;03B1 0345; # (ᾳ; ᾳ; α◌ͅ; ᾳ; α◌ͅ; ) GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4;1FB4;03B1 0301 0345;1FB4;03B1 0301 0345; # (ᾴ; ᾴ; α◌́◌ͅ; ᾴ; α◌́◌ͅ; ) GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6;1FB6;03B1 0342;1FB6;03B1 0342; # (ᾶ; ᾶ; α◌͂; ᾶ; α◌͂; ) GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7;1FB7;03B1 0342 0345;1FB7;03B1 0342 0345; # (ᾷ; ᾷ; α◌͂◌ͅ; ᾷ; α◌͂◌ͅ; ) GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8;1FB8;0391 0306;1FB8;0391 0306; # (Ᾰ; Ᾰ; Α◌̆; Ᾰ; Α◌̆; ) GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9;1FB9;0391 0304;1FB9;0391 0304; # (Ᾱ; Ᾱ; Α◌̄; Ᾱ; Α◌̄; ) GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA;1FBA;0391 0300;1FBA;0391 0300; # (Ὰ; Ὰ; Α◌̀; Ὰ; Α◌̀; ) GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB;0386;0391 0301;0386;0391 0301; # (Ά; Ά; Α◌́; Ά; Α◌́; ) GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC;1FBC;0391 0345;1FBC;0391 0345; # (ᾼ; ᾼ; Α◌ͅ; ᾼ; Α◌ͅ; ) GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD;1FBD;1FBD;0020 0313;0020 0313; # (᾽; ᾽; ᾽; ◌̓; ◌̓; ) GREEK KORONIS +1FBE;03B9;03B9;03B9;03B9; # (ι; ι; ι; ι; ι; ) GREEK PROSGEGRAMMENI +1FBF;1FBF;1FBF;0020 0313;0020 0313; # (᾿; ᾿; ᾿; ◌̓; ◌̓; ) GREEK PSILI +1FC0;1FC0;1FC0;0020 0342;0020 0342; # (῀; ῀; ῀; ◌͂; ◌͂; ) GREEK PERISPOMENI +1FC1;1FC1;00A8 0342;0020 0308 0342;0020 0308 0342; # (῁; ῁; ¨◌͂; ◌̈◌͂; ◌̈◌͂; ) GREEK DIALYTIKA AND PERISPOMENI +1FC2;1FC2;03B7 0300 0345;1FC2;03B7 0300 0345; # (ῂ; ῂ; η◌̀◌ͅ; ῂ; η◌̀◌ͅ; ) GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3;1FC3;03B7 0345;1FC3;03B7 0345; # (ῃ; ῃ; η◌ͅ; ῃ; η◌ͅ; ) GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4;1FC4;03B7 0301 0345;1FC4;03B7 0301 0345; # (ῄ; ῄ; η◌́◌ͅ; ῄ; η◌́◌ͅ; ) GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6;1FC6;03B7 0342;1FC6;03B7 0342; # (ῆ; ῆ; η◌͂; ῆ; η◌͂; ) GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7;1FC7;03B7 0342 0345;1FC7;03B7 0342 0345; # (ῇ; ῇ; η◌͂◌ͅ; ῇ; η◌͂◌ͅ; ) GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8;1FC8;0395 0300;1FC8;0395 0300; # (Ὲ; Ὲ; Ε◌̀; Ὲ; Ε◌̀; ) GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9;0388;0395 0301;0388;0395 0301; # (Έ; Έ; Ε◌́; Έ; Ε◌́; ) GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA;1FCA;0397 0300;1FCA;0397 0300; # (Ὴ; Ὴ; Η◌̀; Ὴ; Η◌̀; ) GREEK CAPITAL LETTER ETA WITH VARIA +1FCB;0389;0397 0301;0389;0397 0301; # (Ή; Ή; Η◌́; Ή; Η◌́; ) GREEK CAPITAL LETTER ETA WITH OXIA +1FCC;1FCC;0397 0345;1FCC;0397 0345; # (ῌ; ῌ; Η◌ͅ; ῌ; Η◌ͅ; ) GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD;1FCD;1FBF 0300;0020 0313 0300;0020 0313 0300; # (῍; ῍; ᾿◌̀; ◌̓◌̀; ◌̓◌̀; ) GREEK PSILI AND VARIA +1FCE;1FCE;1FBF 0301;0020 0313 0301;0020 0313 0301; # (῎; ῎; ᾿◌́; ◌̓◌́; ◌̓◌́; ) GREEK PSILI AND OXIA +1FCF;1FCF;1FBF 0342;0020 0313 0342;0020 0313 0342; # (῏; ῏; ᾿◌͂; ◌̓◌͂; ◌̓◌͂; ) GREEK PSILI AND PERISPOMENI +1FD0;1FD0;03B9 0306;1FD0;03B9 0306; # (ῐ; ῐ; ι◌̆; ῐ; ι◌̆; ) GREEK SMALL LETTER IOTA WITH VRACHY +1FD1;1FD1;03B9 0304;1FD1;03B9 0304; # (ῑ; ῑ; ι◌̄; ῑ; ι◌̄; ) GREEK SMALL LETTER IOTA WITH MACRON +1FD2;1FD2;03B9 0308 0300;1FD2;03B9 0308 0300; # (ῒ; ῒ; ι◌̈◌̀; ῒ; ι◌̈◌̀; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3;0390;03B9 0308 0301;0390;03B9 0308 0301; # (ΐ; ΐ; ι◌̈◌́; ΐ; ι◌̈◌́; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6;1FD6;03B9 0342;1FD6;03B9 0342; # (ῖ; ῖ; ι◌͂; ῖ; ι◌͂; ) GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7;1FD7;03B9 0308 0342;1FD7;03B9 0308 0342; # (ῗ; ῗ; ι◌̈◌͂; ῗ; ι◌̈◌͂; ) GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8;1FD8;0399 0306;1FD8;0399 0306; # (Ῐ; Ῐ; Ι◌̆; Ῐ; Ι◌̆; ) GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9;1FD9;0399 0304;1FD9;0399 0304; # (Ῑ; Ῑ; Ι◌̄; Ῑ; Ι◌̄; ) GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA;1FDA;0399 0300;1FDA;0399 0300; # (Ὶ; Ὶ; Ι◌̀; Ὶ; Ι◌̀; ) GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB;038A;0399 0301;038A;0399 0301; # (Ί; Ί; Ι◌́; Ί; Ι◌́; ) GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD;1FDD;1FFE 0300;0020 0314 0300;0020 0314 0300; # (῝; ῝; ῾◌̀; ◌̔◌̀; ◌̔◌̀; ) GREEK DASIA AND VARIA +1FDE;1FDE;1FFE 0301;0020 0314 0301;0020 0314 0301; # (῞; ῞; ῾◌́; ◌̔◌́; ◌̔◌́; ) GREEK DASIA AND OXIA +1FDF;1FDF;1FFE 0342;0020 0314 0342;0020 0314 0342; # (῟; ῟; ῾◌͂; ◌̔◌͂; ◌̔◌͂; ) GREEK DASIA AND PERISPOMENI +1FE0;1FE0;03C5 0306;1FE0;03C5 0306; # (ῠ; ῠ; υ◌̆; ῠ; υ◌̆; ) GREEK SMALL LETTER UPSILON WITH VRACHY +1FE1;1FE1;03C5 0304;1FE1;03C5 0304; # (ῡ; ῡ; υ◌̄; ῡ; υ◌̄; ) GREEK SMALL LETTER UPSILON WITH MACRON +1FE2;1FE2;03C5 0308 0300;1FE2;03C5 0308 0300; # (ῢ; ῢ; υ◌̈◌̀; ῢ; υ◌̈◌̀; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3;03B0;03C5 0308 0301;03B0;03C5 0308 0301; # (ΰ; ΰ; υ◌̈◌́; ΰ; υ◌̈◌́; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4;1FE4;03C1 0313;1FE4;03C1 0313; # (ῤ; ῤ; ρ◌̓; ῤ; ρ◌̓; ) GREEK SMALL LETTER RHO WITH PSILI +1FE5;1FE5;03C1 0314;1FE5;03C1 0314; # (ῥ; ῥ; ρ◌̔; ῥ; ρ◌̔; ) GREEK SMALL LETTER RHO WITH DASIA +1FE6;1FE6;03C5 0342;1FE6;03C5 0342; # (ῦ; ῦ; υ◌͂; ῦ; υ◌͂; ) GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7;1FE7;03C5 0308 0342;1FE7;03C5 0308 0342; # (ῧ; ῧ; υ◌̈◌͂; ῧ; υ◌̈◌͂; ) GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8;1FE8;03A5 0306;1FE8;03A5 0306; # (Ῠ; Ῠ; Υ◌̆; Ῠ; Υ◌̆; ) GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9;1FE9;03A5 0304;1FE9;03A5 0304; # (Ῡ; Ῡ; Υ◌̄; Ῡ; Υ◌̄; ) GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA;1FEA;03A5 0300;1FEA;03A5 0300; # (Ὺ; Ὺ; Υ◌̀; Ὺ; Υ◌̀; ) GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB;038E;03A5 0301;038E;03A5 0301; # (Ύ; Ύ; Υ◌́; Ύ; Υ◌́; ) GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC;1FEC;03A1 0314;1FEC;03A1 0314; # (Ῥ; Ῥ; Ρ◌̔; Ῥ; Ρ◌̔; ) GREEK CAPITAL LETTER RHO WITH DASIA +1FED;1FED;00A8 0300;0020 0308 0300;0020 0308 0300; # (῭; ῭; ¨◌̀; ◌̈◌̀; ◌̈◌̀; ) GREEK DIALYTIKA AND VARIA +1FEE;0385;00A8 0301;0020 0308 0301;0020 0308 0301; # (΅; ΅; ¨◌́; ◌̈◌́; ◌̈◌́; ) GREEK DIALYTIKA AND OXIA +1FEF;0060;0060;0060;0060; # (`; `; `; `; `; ) GREEK VARIA +1FF2;1FF2;03C9 0300 0345;1FF2;03C9 0300 0345; # (ῲ; ῲ; ω◌̀◌ͅ; ῲ; ω◌̀◌ͅ; ) GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3;1FF3;03C9 0345;1FF3;03C9 0345; # (ῳ; ῳ; ω◌ͅ; ῳ; ω◌ͅ; ) GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4;1FF4;03C9 0301 0345;1FF4;03C9 0301 0345; # (ῴ; ῴ; ω◌́◌ͅ; ῴ; ω◌́◌ͅ; ) GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6;1FF6;03C9 0342;1FF6;03C9 0342; # (ῶ; ῶ; ω◌͂; ῶ; ω◌͂; ) GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7;1FF7;03C9 0342 0345;1FF7;03C9 0342 0345; # (ῷ; ῷ; ω◌͂◌ͅ; ῷ; ω◌͂◌ͅ; ) GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8;1FF8;039F 0300;1FF8;039F 0300; # (Ὸ; Ὸ; Ο◌̀; Ὸ; Ο◌̀; ) GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9;038C;039F 0301;038C;039F 0301; # (Ό; Ό; Ο◌́; Ό; Ο◌́; ) GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA;1FFA;03A9 0300;1FFA;03A9 0300; # (Ὼ; Ὼ; Ω◌̀; Ὼ; Ω◌̀; ) GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB;038F;03A9 0301;038F;03A9 0301; # (Ώ; Ώ; Ω◌́; Ώ; Ω◌́; ) GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC;1FFC;03A9 0345;1FFC;03A9 0345; # (ῼ; ῼ; Ω◌ͅ; ῼ; Ω◌ͅ; ) GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD;00B4;00B4;0020 0301;0020 0301; # (´; ´; ´; ◌́; ◌́; ) GREEK OXIA +1FFE;1FFE;1FFE;0020 0314;0020 0314; # (῾; ῾; ῾; ◌̔; ◌̔; ) GREEK DASIA +2000;2002;2002;0020;0020; # ( ;  ;  ; ; ; ) EN QUAD +2001;2003;2003;0020;0020; # ( ;  ;  ; ; ; ) EM QUAD +2002;2002;2002;0020;0020; # ( ;  ;  ; ; ; ) EN SPACE +2003;2003;2003;0020;0020; # ( ;  ;  ; ; ; ) EM SPACE +2004;2004;2004;0020;0020; # ( ;  ;  ; ; ; ) THREE-PER-EM SPACE +2005;2005;2005;0020;0020; # ( ;  ;  ; ; ; ) FOUR-PER-EM SPACE +2006;2006;2006;0020;0020; # ( ;  ;  ; ; ; ) SIX-PER-EM SPACE +2007;2007;2007;0020;0020; # ( ;  ;  ; ; ; ) FIGURE SPACE +2008;2008;2008;0020;0020; # ( ;  ;  ; ; ; ) PUNCTUATION SPACE +2009;2009;2009;0020;0020; # ( ;  ;  ; ; ; ) THIN SPACE +200A;200A;200A;0020;0020; # ( ;  ;  ; ; ; ) HAIR SPACE +2011;2011;2011;2010;2010; # (‑; ‑; ‑; ‐; ‐; ) NON-BREAKING HYPHEN +2017;2017;2017;0020 0333;0020 0333; # (‗; ‗; ‗; ◌̳; ◌̳; ) DOUBLE LOW LINE +2024;2024;2024;002E;002E; # (․; ․; ․; .; .; ) ONE DOT LEADER +2025;2025;2025;002E 002E;002E 002E; # (‥; ‥; ‥; ..; ..; ) TWO DOT LEADER +2026;2026;2026;002E 002E 002E;002E 002E 002E; # (…; …; …; ...; ...; ) HORIZONTAL ELLIPSIS +202F;202F;202F;0020;0020; # ( ;  ;  ; ; ; ) NARROW NO-BREAK SPACE +2033;2033;2033;2032 2032;2032 2032; # (″; ″; ″; ′′; ′′; ) DOUBLE PRIME +2034;2034;2034;2032 2032 2032;2032 2032 2032; # (‴; ‴; ‴; ′′′; ′′′; ) TRIPLE PRIME +2036;2036;2036;2035 2035;2035 2035; # (‶; ‶; ‶; ‵‵; ‵‵; ) REVERSED DOUBLE PRIME +2037;2037;2037;2035 2035 2035;2035 2035 2035; # (‷; ‷; ‷; ‵‵‵; ‵‵‵; ) REVERSED TRIPLE PRIME +203C;203C;203C;0021 0021;0021 0021; # (‼; ‼; ‼; !!; !!; ) DOUBLE EXCLAMATION MARK +203E;203E;203E;0020 0305;0020 0305; # (‾; ‾; ‾; ◌̅; ◌̅; ) OVERLINE +2047;2047;2047;003F 003F;003F 003F; # (⁇; ⁇; ⁇; ??; ??; ) DOUBLE QUESTION MARK +2048;2048;2048;003F 0021;003F 0021; # (⁈; ⁈; ⁈; ?!; ?!; ) QUESTION EXCLAMATION MARK +2049;2049;2049;0021 003F;0021 003F; # (⁉; ⁉; ⁉; !?; !?; ) EXCLAMATION QUESTION MARK +2057;2057;2057;2032 2032 2032 2032;2032 2032 2032 2032; # (⁗; ⁗; ⁗; ′′′′; ′′′′; ) QUADRUPLE PRIME +205F;205F;205F;0020;0020; # ( ;  ;  ; ; ; ) MEDIUM MATHEMATICAL SPACE +2070;2070;2070;0030;0030; # (⁰; ⁰; ⁰; 0; 0; ) SUPERSCRIPT ZERO +2071;2071;2071;0069;0069; # (ⁱ; ⁱ; ⁱ; i; i; ) SUPERSCRIPT LATIN SMALL LETTER I +2074;2074;2074;0034;0034; # (⁴; ⁴; ⁴; 4; 4; ) SUPERSCRIPT FOUR +2075;2075;2075;0035;0035; # (⁵; ⁵; ⁵; 5; 5; ) SUPERSCRIPT FIVE +2076;2076;2076;0036;0036; # (⁶; ⁶; ⁶; 6; 6; ) SUPERSCRIPT SIX +2077;2077;2077;0037;0037; # (⁷; ⁷; ⁷; 7; 7; ) SUPERSCRIPT SEVEN +2078;2078;2078;0038;0038; # (⁸; ⁸; ⁸; 8; 8; ) SUPERSCRIPT EIGHT +2079;2079;2079;0039;0039; # (⁹; ⁹; ⁹; 9; 9; ) SUPERSCRIPT NINE +207A;207A;207A;002B;002B; # (⁺; ⁺; ⁺; +; +; ) SUPERSCRIPT PLUS SIGN +207B;207B;207B;2212;2212; # (⁻; ⁻; ⁻; −; −; ) SUPERSCRIPT MINUS +207C;207C;207C;003D;003D; # (⁼; ⁼; ⁼; =; =; ) SUPERSCRIPT EQUALS SIGN +207D;207D;207D;0028;0028; # (⁽; ⁽; ⁽; (; (; ) SUPERSCRIPT LEFT PARENTHESIS +207E;207E;207E;0029;0029; # (⁾; ⁾; ⁾; ); ); ) SUPERSCRIPT RIGHT PARENTHESIS +207F;207F;207F;006E;006E; # (ⁿ; ⁿ; ⁿ; n; n; ) SUPERSCRIPT LATIN SMALL LETTER N +2080;2080;2080;0030;0030; # (₀; ₀; ₀; 0; 0; ) SUBSCRIPT ZERO +2081;2081;2081;0031;0031; # (₁; ₁; ₁; 1; 1; ) SUBSCRIPT ONE +2082;2082;2082;0032;0032; # (₂; ₂; ₂; 2; 2; ) SUBSCRIPT TWO +2083;2083;2083;0033;0033; # (₃; ₃; ₃; 3; 3; ) SUBSCRIPT THREE +2084;2084;2084;0034;0034; # (₄; ₄; ₄; 4; 4; ) SUBSCRIPT FOUR +2085;2085;2085;0035;0035; # (₅; ₅; ₅; 5; 5; ) SUBSCRIPT FIVE +2086;2086;2086;0036;0036; # (₆; ₆; ₆; 6; 6; ) SUBSCRIPT SIX +2087;2087;2087;0037;0037; # (₇; ₇; ₇; 7; 7; ) SUBSCRIPT SEVEN +2088;2088;2088;0038;0038; # (₈; ₈; ₈; 8; 8; ) SUBSCRIPT EIGHT +2089;2089;2089;0039;0039; # (₉; ₉; ₉; 9; 9; ) SUBSCRIPT NINE +208A;208A;208A;002B;002B; # (₊; ₊; ₊; +; +; ) SUBSCRIPT PLUS SIGN +208B;208B;208B;2212;2212; # (₋; ₋; ₋; −; −; ) SUBSCRIPT MINUS +208C;208C;208C;003D;003D; # (₌; ₌; ₌; =; =; ) SUBSCRIPT EQUALS SIGN +208D;208D;208D;0028;0028; # (₍; ₍; ₍; (; (; ) SUBSCRIPT LEFT PARENTHESIS +208E;208E;208E;0029;0029; # (₎; ₎; ₎; ); ); ) SUBSCRIPT RIGHT PARENTHESIS +2090;2090;2090;0061;0061; # (ₐ; ₐ; ₐ; a; a; ) LATIN SUBSCRIPT SMALL LETTER A +2091;2091;2091;0065;0065; # (ₑ; ₑ; ₑ; e; e; ) LATIN SUBSCRIPT SMALL LETTER E +2092;2092;2092;006F;006F; # (ₒ; ₒ; ₒ; o; o; ) LATIN SUBSCRIPT SMALL LETTER O +2093;2093;2093;0078;0078; # (ₓ; ₓ; ₓ; x; x; ) LATIN SUBSCRIPT SMALL LETTER X +2094;2094;2094;0259;0259; # (ₔ; ₔ; ₔ; ə; ə; ) LATIN SUBSCRIPT SMALL LETTER SCHWA +2095;2095;2095;0068;0068; # (ₕ; ₕ; ₕ; h; h; ) LATIN SUBSCRIPT SMALL LETTER H +2096;2096;2096;006B;006B; # (ₖ; ₖ; ₖ; k; k; ) LATIN SUBSCRIPT SMALL LETTER K +2097;2097;2097;006C;006C; # (ₗ; ₗ; ₗ; l; l; ) LATIN SUBSCRIPT SMALL LETTER L +2098;2098;2098;006D;006D; # (ₘ; ₘ; ₘ; m; m; ) LATIN SUBSCRIPT SMALL LETTER M +2099;2099;2099;006E;006E; # (ₙ; ₙ; ₙ; n; n; ) LATIN SUBSCRIPT SMALL LETTER N +209A;209A;209A;0070;0070; # (ₚ; ₚ; ₚ; p; p; ) LATIN SUBSCRIPT SMALL LETTER P +209B;209B;209B;0073;0073; # (ₛ; ₛ; ₛ; s; s; ) LATIN SUBSCRIPT SMALL LETTER S +209C;209C;209C;0074;0074; # (ₜ; ₜ; ₜ; t; t; ) LATIN SUBSCRIPT SMALL LETTER T +20A8;20A8;20A8;0052 0073;0052 0073; # (₨; ₨; ₨; Rs; Rs; ) RUPEE SIGN +2100;2100;2100;0061 002F 0063;0061 002F 0063; # (℀; ℀; ℀; a/c; a/c; ) ACCOUNT OF +2101;2101;2101;0061 002F 0073;0061 002F 0073; # (℁; ℁; ℁; a/s; a/s; ) ADDRESSED TO THE SUBJECT +2102;2102;2102;0043;0043; # (ℂ; ℂ; ℂ; C; C; ) DOUBLE-STRUCK CAPITAL C +2103;2103;2103;00B0 0043;00B0 0043; # (℃; ℃; ℃; °C; °C; ) DEGREE CELSIUS +2105;2105;2105;0063 002F 006F;0063 002F 006F; # (℅; ℅; ℅; c/o; c/o; ) CARE OF +2106;2106;2106;0063 002F 0075;0063 002F 0075; # (℆; ℆; ℆; c/u; c/u; ) CADA UNA +2107;2107;2107;0190;0190; # (ℇ; ℇ; ℇ; Ɛ; Ɛ; ) EULER CONSTANT +2109;2109;2109;00B0 0046;00B0 0046; # (℉; ℉; ℉; °F; °F; ) DEGREE FAHRENHEIT +210A;210A;210A;0067;0067; # (ℊ; ℊ; ℊ; g; g; ) SCRIPT SMALL G +210B;210B;210B;0048;0048; # (ℋ; ℋ; ℋ; H; H; ) SCRIPT CAPITAL H +210C;210C;210C;0048;0048; # (ℌ; ℌ; ℌ; H; H; ) BLACK-LETTER CAPITAL H +210D;210D;210D;0048;0048; # (ℍ; ℍ; ℍ; H; H; ) DOUBLE-STRUCK CAPITAL H +210E;210E;210E;0068;0068; # (ℎ; ℎ; ℎ; h; h; ) PLANCK CONSTANT +210F;210F;210F;0127;0127; # (ℏ; ℏ; ℏ; ħ; ħ; ) PLANCK CONSTANT OVER TWO PI +2110;2110;2110;0049;0049; # (ℐ; ℐ; ℐ; I; I; ) SCRIPT CAPITAL I +2111;2111;2111;0049;0049; # (ℑ; ℑ; ℑ; I; I; ) BLACK-LETTER CAPITAL I +2112;2112;2112;004C;004C; # (ℒ; ℒ; ℒ; L; L; ) SCRIPT CAPITAL L +2113;2113;2113;006C;006C; # (ℓ; ℓ; ℓ; l; l; ) SCRIPT SMALL L +2115;2115;2115;004E;004E; # (ℕ; ℕ; ℕ; N; N; ) DOUBLE-STRUCK CAPITAL N +2116;2116;2116;004E 006F;004E 006F; # (№; №; №; No; No; ) NUMERO SIGN +2119;2119;2119;0050;0050; # (ℙ; ℙ; ℙ; P; P; ) DOUBLE-STRUCK CAPITAL P +211A;211A;211A;0051;0051; # (ℚ; ℚ; ℚ; Q; Q; ) DOUBLE-STRUCK CAPITAL Q +211B;211B;211B;0052;0052; # (ℛ; ℛ; ℛ; R; R; ) SCRIPT CAPITAL R +211C;211C;211C;0052;0052; # (ℜ; ℜ; ℜ; R; R; ) BLACK-LETTER CAPITAL R +211D;211D;211D;0052;0052; # (ℝ; ℝ; ℝ; R; R; ) DOUBLE-STRUCK CAPITAL R +2120;2120;2120;0053 004D;0053 004D; # (℠; ℠; ℠; SM; SM; ) SERVICE MARK +2121;2121;2121;0054 0045 004C;0054 0045 004C; # (℡; ℡; ℡; TEL; TEL; ) TELEPHONE SIGN +2122;2122;2122;0054 004D;0054 004D; # (™; ™; ™; TM; TM; ) TRADE MARK SIGN +2124;2124;2124;005A;005A; # (ℤ; ℤ; ℤ; Z; Z; ) DOUBLE-STRUCK CAPITAL Z +2126;03A9;03A9;03A9;03A9; # (Ω; Ω; Ω; Ω; Ω; ) OHM SIGN +2128;2128;2128;005A;005A; # (ℨ; ℨ; ℨ; Z; Z; ) BLACK-LETTER CAPITAL Z +212A;004B;004B;004B;004B; # (K; K; K; K; K; ) KELVIN SIGN +212B;00C5;0041 030A;00C5;0041 030A; # (Å; Å; A◌̊; Å; A◌̊; ) ANGSTROM SIGN +212C;212C;212C;0042;0042; # (ℬ; ℬ; ℬ; B; B; ) SCRIPT CAPITAL B +212D;212D;212D;0043;0043; # (ℭ; ℭ; ℭ; C; C; ) BLACK-LETTER CAPITAL C +212F;212F;212F;0065;0065; # (ℯ; ℯ; ℯ; e; e; ) SCRIPT SMALL E +2130;2130;2130;0045;0045; # (ℰ; ℰ; ℰ; E; E; ) SCRIPT CAPITAL E +2131;2131;2131;0046;0046; # (ℱ; ℱ; ℱ; F; F; ) SCRIPT CAPITAL F +2133;2133;2133;004D;004D; # (ℳ; ℳ; ℳ; M; M; ) SCRIPT CAPITAL M +2134;2134;2134;006F;006F; # (ℴ; ℴ; ℴ; o; o; ) SCRIPT SMALL O +2135;2135;2135;05D0;05D0; # (ℵ; ℵ; ℵ; א; א; ) ALEF SYMBOL +2136;2136;2136;05D1;05D1; # (ℶ; ℶ; ℶ; ב; ב; ) BET SYMBOL +2137;2137;2137;05D2;05D2; # (ℷ; ℷ; ℷ; ג; ג; ) GIMEL SYMBOL +2138;2138;2138;05D3;05D3; # (ℸ; ℸ; ℸ; ד; ד; ) DALET SYMBOL +2139;2139;2139;0069;0069; # (ℹ; ℹ; ℹ; i; i; ) INFORMATION SOURCE +213B;213B;213B;0046 0041 0058;0046 0041 0058; # (℻; ℻; ℻; FAX; FAX; ) FACSIMILE SIGN +213C;213C;213C;03C0;03C0; # (ℼ; ℼ; ℼ; π; π; ) DOUBLE-STRUCK SMALL PI +213D;213D;213D;03B3;03B3; # (ℽ; ℽ; ℽ; γ; γ; ) DOUBLE-STRUCK SMALL GAMMA +213E;213E;213E;0393;0393; # (ℾ; ℾ; ℾ; Γ; Γ; ) DOUBLE-STRUCK CAPITAL GAMMA +213F;213F;213F;03A0;03A0; # (ℿ; ℿ; ℿ; Π; Π; ) DOUBLE-STRUCK CAPITAL PI +2140;2140;2140;2211;2211; # (⅀; ⅀; ⅀; ∑; ∑; ) DOUBLE-STRUCK N-ARY SUMMATION +2145;2145;2145;0044;0044; # (ⅅ; ⅅ; ⅅ; D; D; ) DOUBLE-STRUCK ITALIC CAPITAL D +2146;2146;2146;0064;0064; # (ⅆ; ⅆ; ⅆ; d; d; ) DOUBLE-STRUCK ITALIC SMALL D +2147;2147;2147;0065;0065; # (ⅇ; ⅇ; ⅇ; e; e; ) DOUBLE-STRUCK ITALIC SMALL E +2148;2148;2148;0069;0069; # (ⅈ; ⅈ; ⅈ; i; i; ) DOUBLE-STRUCK ITALIC SMALL I +2149;2149;2149;006A;006A; # (ⅉ; ⅉ; ⅉ; j; j; ) DOUBLE-STRUCK ITALIC SMALL J +2150;2150;2150;0031 2044 0037;0031 2044 0037; # (⅐; ⅐; ⅐; 1⁄7; 1⁄7; ) VULGAR FRACTION ONE SEVENTH +2151;2151;2151;0031 2044 0039;0031 2044 0039; # (⅑; ⅑; ⅑; 1⁄9; 1⁄9; ) VULGAR FRACTION ONE NINTH +2152;2152;2152;0031 2044 0031 0030;0031 2044 0031 0030; # (⅒; ⅒; ⅒; 1⁄10; 1⁄10; ) VULGAR FRACTION ONE TENTH +2153;2153;2153;0031 2044 0033;0031 2044 0033; # (⅓; ⅓; ⅓; 1⁄3; 1⁄3; ) VULGAR FRACTION ONE THIRD +2154;2154;2154;0032 2044 0033;0032 2044 0033; # (⅔; ⅔; ⅔; 2⁄3; 2⁄3; ) VULGAR FRACTION TWO THIRDS +2155;2155;2155;0031 2044 0035;0031 2044 0035; # (⅕; ⅕; ⅕; 1⁄5; 1⁄5; ) VULGAR FRACTION ONE FIFTH +2156;2156;2156;0032 2044 0035;0032 2044 0035; # (⅖; ⅖; ⅖; 2⁄5; 2⁄5; ) VULGAR FRACTION TWO FIFTHS +2157;2157;2157;0033 2044 0035;0033 2044 0035; # (⅗; ⅗; ⅗; 3⁄5; 3⁄5; ) VULGAR FRACTION THREE FIFTHS +2158;2158;2158;0034 2044 0035;0034 2044 0035; # (⅘; ⅘; ⅘; 4⁄5; 4⁄5; ) VULGAR FRACTION FOUR FIFTHS +2159;2159;2159;0031 2044 0036;0031 2044 0036; # (⅙; ⅙; ⅙; 1⁄6; 1⁄6; ) VULGAR FRACTION ONE SIXTH +215A;215A;215A;0035 2044 0036;0035 2044 0036; # (⅚; ⅚; ⅚; 5⁄6; 5⁄6; ) VULGAR FRACTION FIVE SIXTHS +215B;215B;215B;0031 2044 0038;0031 2044 0038; # (⅛; ⅛; ⅛; 1⁄8; 1⁄8; ) VULGAR FRACTION ONE EIGHTH +215C;215C;215C;0033 2044 0038;0033 2044 0038; # (⅜; ⅜; ⅜; 3⁄8; 3⁄8; ) VULGAR FRACTION THREE EIGHTHS +215D;215D;215D;0035 2044 0038;0035 2044 0038; # (⅝; ⅝; ⅝; 5⁄8; 5⁄8; ) VULGAR FRACTION FIVE EIGHTHS +215E;215E;215E;0037 2044 0038;0037 2044 0038; # (⅞; ⅞; ⅞; 7⁄8; 7⁄8; ) VULGAR FRACTION SEVEN EIGHTHS +215F;215F;215F;0031 2044;0031 2044; # (⅟; ⅟; ⅟; 1⁄; 1⁄; ) FRACTION NUMERATOR ONE +2160;2160;2160;0049;0049; # (Ⅰ; Ⅰ; Ⅰ; I; I; ) ROMAN NUMERAL ONE +2161;2161;2161;0049 0049;0049 0049; # (Ⅱ; Ⅱ; Ⅱ; II; II; ) ROMAN NUMERAL TWO +2162;2162;2162;0049 0049 0049;0049 0049 0049; # (Ⅲ; Ⅲ; Ⅲ; III; III; ) ROMAN NUMERAL THREE +2163;2163;2163;0049 0056;0049 0056; # (Ⅳ; Ⅳ; Ⅳ; IV; IV; ) ROMAN NUMERAL FOUR +2164;2164;2164;0056;0056; # (Ⅴ; Ⅴ; Ⅴ; V; V; ) ROMAN NUMERAL FIVE +2165;2165;2165;0056 0049;0056 0049; # (Ⅵ; Ⅵ; Ⅵ; VI; VI; ) ROMAN NUMERAL SIX +2166;2166;2166;0056 0049 0049;0056 0049 0049; # (Ⅶ; Ⅶ; Ⅶ; VII; VII; ) ROMAN NUMERAL SEVEN +2167;2167;2167;0056 0049 0049 0049;0056 0049 0049 0049; # (Ⅷ; Ⅷ; Ⅷ; VIII; VIII; ) ROMAN NUMERAL EIGHT +2168;2168;2168;0049 0058;0049 0058; # (Ⅸ; Ⅸ; Ⅸ; IX; IX; ) ROMAN NUMERAL NINE +2169;2169;2169;0058;0058; # (Ⅹ; Ⅹ; Ⅹ; X; X; ) ROMAN NUMERAL TEN +216A;216A;216A;0058 0049;0058 0049; # (Ⅺ; Ⅺ; Ⅺ; XI; XI; ) ROMAN NUMERAL ELEVEN +216B;216B;216B;0058 0049 0049;0058 0049 0049; # (Ⅻ; Ⅻ; Ⅻ; XII; XII; ) ROMAN NUMERAL TWELVE +216C;216C;216C;004C;004C; # (Ⅼ; Ⅼ; Ⅼ; L; L; ) ROMAN NUMERAL FIFTY +216D;216D;216D;0043;0043; # (Ⅽ; Ⅽ; Ⅽ; C; C; ) ROMAN NUMERAL ONE HUNDRED +216E;216E;216E;0044;0044; # (Ⅾ; Ⅾ; Ⅾ; D; D; ) ROMAN NUMERAL FIVE HUNDRED +216F;216F;216F;004D;004D; # (Ⅿ; Ⅿ; Ⅿ; M; M; ) ROMAN NUMERAL ONE THOUSAND +2170;2170;2170;0069;0069; # (ⅰ; ⅰ; ⅰ; i; i; ) SMALL ROMAN NUMERAL ONE +2171;2171;2171;0069 0069;0069 0069; # (ⅱ; ⅱ; ⅱ; ii; ii; ) SMALL ROMAN NUMERAL TWO +2172;2172;2172;0069 0069 0069;0069 0069 0069; # (ⅲ; ⅲ; ⅲ; iii; iii; ) SMALL ROMAN NUMERAL THREE +2173;2173;2173;0069 0076;0069 0076; # (ⅳ; ⅳ; ⅳ; iv; iv; ) SMALL ROMAN NUMERAL FOUR +2174;2174;2174;0076;0076; # (ⅴ; ⅴ; ⅴ; v; v; ) SMALL ROMAN NUMERAL FIVE +2175;2175;2175;0076 0069;0076 0069; # (ⅵ; ⅵ; ⅵ; vi; vi; ) SMALL ROMAN NUMERAL SIX +2176;2176;2176;0076 0069 0069;0076 0069 0069; # (ⅶ; ⅶ; ⅶ; vii; vii; ) SMALL ROMAN NUMERAL SEVEN +2177;2177;2177;0076 0069 0069 0069;0076 0069 0069 0069; # (ⅷ; ⅷ; ⅷ; viii; viii; ) SMALL ROMAN NUMERAL EIGHT +2178;2178;2178;0069 0078;0069 0078; # (ⅸ; ⅸ; ⅸ; ix; ix; ) SMALL ROMAN NUMERAL NINE +2179;2179;2179;0078;0078; # (ⅹ; ⅹ; ⅹ; x; x; ) SMALL ROMAN NUMERAL TEN +217A;217A;217A;0078 0069;0078 0069; # (ⅺ; ⅺ; ⅺ; xi; xi; ) SMALL ROMAN NUMERAL ELEVEN +217B;217B;217B;0078 0069 0069;0078 0069 0069; # (ⅻ; ⅻ; ⅻ; xii; xii; ) SMALL ROMAN NUMERAL TWELVE +217C;217C;217C;006C;006C; # (ⅼ; ⅼ; ⅼ; l; l; ) SMALL ROMAN NUMERAL FIFTY +217D;217D;217D;0063;0063; # (ⅽ; ⅽ; ⅽ; c; c; ) SMALL ROMAN NUMERAL ONE HUNDRED +217E;217E;217E;0064;0064; # (ⅾ; ⅾ; ⅾ; d; d; ) SMALL ROMAN NUMERAL FIVE HUNDRED +217F;217F;217F;006D;006D; # (ⅿ; ⅿ; ⅿ; m; m; ) SMALL ROMAN NUMERAL ONE THOUSAND +2189;2189;2189;0030 2044 0033;0030 2044 0033; # (↉; ↉; ↉; 0⁄3; 0⁄3; ) VULGAR FRACTION ZERO THIRDS +219A;219A;2190 0338;219A;2190 0338; # (↚; ↚; ←◌̸; ↚; ←◌̸; ) LEFTWARDS ARROW WITH STROKE +219B;219B;2192 0338;219B;2192 0338; # (↛; ↛; →◌̸; ↛; →◌̸; ) RIGHTWARDS ARROW WITH STROKE +21AE;21AE;2194 0338;21AE;2194 0338; # (↮; ↮; ↔◌̸; ↮; ↔◌̸; ) LEFT RIGHT ARROW WITH STROKE +21CD;21CD;21D0 0338;21CD;21D0 0338; # (⇍; ⇍; ⇐◌̸; ⇍; ⇐◌̸; ) LEFTWARDS DOUBLE ARROW WITH STROKE +21CE;21CE;21D4 0338;21CE;21D4 0338; # (⇎; ⇎; ⇔◌̸; ⇎; ⇔◌̸; ) LEFT RIGHT DOUBLE ARROW WITH STROKE +21CF;21CF;21D2 0338;21CF;21D2 0338; # (⇏; ⇏; ⇒◌̸; ⇏; ⇒◌̸; ) RIGHTWARDS DOUBLE ARROW WITH STROKE +2204;2204;2203 0338;2204;2203 0338; # (∄; ∄; ∃◌̸; ∄; ∃◌̸; ) THERE DOES NOT EXIST +2209;2209;2208 0338;2209;2208 0338; # (∉; ∉; ∈◌̸; ∉; ∈◌̸; ) NOT AN ELEMENT OF +220C;220C;220B 0338;220C;220B 0338; # (∌; ∌; ∋◌̸; ∌; ∋◌̸; ) DOES NOT CONTAIN AS MEMBER +2224;2224;2223 0338;2224;2223 0338; # (∤; ∤; ∣◌̸; ∤; ∣◌̸; ) DOES NOT DIVIDE +2226;2226;2225 0338;2226;2225 0338; # (∦; ∦; ∥◌̸; ∦; ∥◌̸; ) NOT PARALLEL TO +222C;222C;222C;222B 222B;222B 222B; # (∬; ∬; ∬; ∫∫; ∫∫; ) DOUBLE INTEGRAL +222D;222D;222D;222B 222B 222B;222B 222B 222B; # (∭; ∭; ∭; ∫∫∫; ∫∫∫; ) TRIPLE INTEGRAL +222F;222F;222F;222E 222E;222E 222E; # (∯; ∯; ∯; ∮∮; ∮∮; ) SURFACE INTEGRAL +2230;2230;2230;222E 222E 222E;222E 222E 222E; # (∰; ∰; ∰; ∮∮∮; ∮∮∮; ) VOLUME INTEGRAL +2241;2241;223C 0338;2241;223C 0338; # (≁; ≁; ∼◌̸; ≁; ∼◌̸; ) NOT TILDE +2244;2244;2243 0338;2244;2243 0338; # (≄; ≄; ≃◌̸; ≄; ≃◌̸; ) NOT ASYMPTOTICALLY EQUAL TO +2247;2247;2245 0338;2247;2245 0338; # (≇; ≇; ≅◌̸; ≇; ≅◌̸; ) NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2249;2249;2248 0338;2249;2248 0338; # (≉; ≉; ≈◌̸; ≉; ≈◌̸; ) NOT ALMOST EQUAL TO +2260;2260;003D 0338;2260;003D 0338; # (≠; ≠; =◌̸; ≠; =◌̸; ) NOT EQUAL TO +2262;2262;2261 0338;2262;2261 0338; # (≢; ≢; ≡◌̸; ≢; ≡◌̸; ) NOT IDENTICAL TO +226D;226D;224D 0338;226D;224D 0338; # (≭; ≭; ≍◌̸; ≭; ≍◌̸; ) NOT EQUIVALENT TO +226E;226E;003C 0338;226E;003C 0338; # (≮; ≮; <◌̸; ≮; <◌̸; ) NOT LESS-THAN +226F;226F;003E 0338;226F;003E 0338; # (≯; ≯; >◌̸; ≯; >◌̸; ) NOT GREATER-THAN +2270;2270;2264 0338;2270;2264 0338; # (≰; ≰; ≤◌̸; ≰; ≤◌̸; ) NEITHER LESS-THAN NOR EQUAL TO +2271;2271;2265 0338;2271;2265 0338; # (≱; ≱; ≥◌̸; ≱; ≥◌̸; ) NEITHER GREATER-THAN NOR EQUAL TO +2274;2274;2272 0338;2274;2272 0338; # (≴; ≴; ≲◌̸; ≴; ≲◌̸; ) NEITHER LESS-THAN NOR EQUIVALENT TO +2275;2275;2273 0338;2275;2273 0338; # (≵; ≵; ≳◌̸; ≵; ≳◌̸; ) NEITHER GREATER-THAN NOR EQUIVALENT TO +2278;2278;2276 0338;2278;2276 0338; # (≸; ≸; ≶◌̸; ≸; ≶◌̸; ) NEITHER LESS-THAN NOR GREATER-THAN +2279;2279;2277 0338;2279;2277 0338; # (≹; ≹; ≷◌̸; ≹; ≷◌̸; ) NEITHER GREATER-THAN NOR LESS-THAN +2280;2280;227A 0338;2280;227A 0338; # (⊀; ⊀; ≺◌̸; ⊀; ≺◌̸; ) DOES NOT PRECEDE +2281;2281;227B 0338;2281;227B 0338; # (⊁; ⊁; ≻◌̸; ⊁; ≻◌̸; ) DOES NOT SUCCEED +2284;2284;2282 0338;2284;2282 0338; # (⊄; ⊄; ⊂◌̸; ⊄; ⊂◌̸; ) NOT A SUBSET OF +2285;2285;2283 0338;2285;2283 0338; # (⊅; ⊅; ⊃◌̸; ⊅; ⊃◌̸; ) NOT A SUPERSET OF +2288;2288;2286 0338;2288;2286 0338; # (⊈; ⊈; ⊆◌̸; ⊈; ⊆◌̸; ) NEITHER A SUBSET OF NOR EQUAL TO +2289;2289;2287 0338;2289;2287 0338; # (⊉; ⊉; ⊇◌̸; ⊉; ⊇◌̸; ) NEITHER A SUPERSET OF NOR EQUAL TO +22AC;22AC;22A2 0338;22AC;22A2 0338; # (⊬; ⊬; ⊢◌̸; ⊬; ⊢◌̸; ) DOES NOT PROVE +22AD;22AD;22A8 0338;22AD;22A8 0338; # (⊭; ⊭; ⊨◌̸; ⊭; ⊨◌̸; ) NOT TRUE +22AE;22AE;22A9 0338;22AE;22A9 0338; # (⊮; ⊮; ⊩◌̸; ⊮; ⊩◌̸; ) DOES NOT FORCE +22AF;22AF;22AB 0338;22AF;22AB 0338; # (⊯; ⊯; ⊫◌̸; ⊯; ⊫◌̸; ) NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +22E0;22E0;227C 0338;22E0;227C 0338; # (⋠; ⋠; ≼◌̸; ⋠; ≼◌̸; ) DOES NOT PRECEDE OR EQUAL +22E1;22E1;227D 0338;22E1;227D 0338; # (⋡; ⋡; ≽◌̸; ⋡; ≽◌̸; ) DOES NOT SUCCEED OR EQUAL +22E2;22E2;2291 0338;22E2;2291 0338; # (⋢; ⋢; ⊑◌̸; ⋢; ⊑◌̸; ) NOT SQUARE IMAGE OF OR EQUAL TO +22E3;22E3;2292 0338;22E3;2292 0338; # (⋣; ⋣; ⊒◌̸; ⋣; ⊒◌̸; ) NOT SQUARE ORIGINAL OF OR EQUAL TO +22EA;22EA;22B2 0338;22EA;22B2 0338; # (⋪; ⋪; ⊲◌̸; ⋪; ⊲◌̸; ) NOT NORMAL SUBGROUP OF +22EB;22EB;22B3 0338;22EB;22B3 0338; # (⋫; ⋫; ⊳◌̸; ⋫; ⊳◌̸; ) DOES NOT CONTAIN AS NORMAL SUBGROUP +22EC;22EC;22B4 0338;22EC;22B4 0338; # (⋬; ⋬; ⊴◌̸; ⋬; ⊴◌̸; ) NOT NORMAL SUBGROUP OF OR EQUAL TO +22ED;22ED;22B5 0338;22ED;22B5 0338; # (⋭; ⋭; ⊵◌̸; ⋭; ⊵◌̸; ) DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +2329;3008;3008;3008;3008; # (〈; 〈; 〈; 〈; 〈; ) LEFT-POINTING ANGLE BRACKET +232A;3009;3009;3009;3009; # (〉; 〉; 〉; 〉; 〉; ) RIGHT-POINTING ANGLE BRACKET +2460;2460;2460;0031;0031; # (①; ①; ①; 1; 1; ) CIRCLED DIGIT ONE +2461;2461;2461;0032;0032; # (②; ②; ②; 2; 2; ) CIRCLED DIGIT TWO +2462;2462;2462;0033;0033; # (③; ③; ③; 3; 3; ) CIRCLED DIGIT THREE +2463;2463;2463;0034;0034; # (④; ④; ④; 4; 4; ) CIRCLED DIGIT FOUR +2464;2464;2464;0035;0035; # (⑤; ⑤; ⑤; 5; 5; ) CIRCLED DIGIT FIVE +2465;2465;2465;0036;0036; # (⑥; ⑥; ⑥; 6; 6; ) CIRCLED DIGIT SIX +2466;2466;2466;0037;0037; # (⑦; ⑦; ⑦; 7; 7; ) CIRCLED DIGIT SEVEN +2467;2467;2467;0038;0038; # (⑧; ⑧; ⑧; 8; 8; ) CIRCLED DIGIT EIGHT +2468;2468;2468;0039;0039; # (⑨; ⑨; ⑨; 9; 9; ) CIRCLED DIGIT NINE +2469;2469;2469;0031 0030;0031 0030; # (⑩; ⑩; ⑩; 10; 10; ) CIRCLED NUMBER TEN +246A;246A;246A;0031 0031;0031 0031; # (⑪; ⑪; ⑪; 11; 11; ) CIRCLED NUMBER ELEVEN +246B;246B;246B;0031 0032;0031 0032; # (⑫; ⑫; ⑫; 12; 12; ) CIRCLED NUMBER TWELVE +246C;246C;246C;0031 0033;0031 0033; # (⑬; ⑬; ⑬; 13; 13; ) CIRCLED NUMBER THIRTEEN +246D;246D;246D;0031 0034;0031 0034; # (⑭; ⑭; ⑭; 14; 14; ) CIRCLED NUMBER FOURTEEN +246E;246E;246E;0031 0035;0031 0035; # (⑮; ⑮; ⑮; 15; 15; ) CIRCLED NUMBER FIFTEEN +246F;246F;246F;0031 0036;0031 0036; # (⑯; ⑯; ⑯; 16; 16; ) CIRCLED NUMBER SIXTEEN +2470;2470;2470;0031 0037;0031 0037; # (⑰; ⑰; ⑰; 17; 17; ) CIRCLED NUMBER SEVENTEEN +2471;2471;2471;0031 0038;0031 0038; # (⑱; ⑱; ⑱; 18; 18; ) CIRCLED NUMBER EIGHTEEN +2472;2472;2472;0031 0039;0031 0039; # (⑲; ⑲; ⑲; 19; 19; ) CIRCLED NUMBER NINETEEN +2473;2473;2473;0032 0030;0032 0030; # (⑳; ⑳; ⑳; 20; 20; ) CIRCLED NUMBER TWENTY +2474;2474;2474;0028 0031 0029;0028 0031 0029; # (⑴; ⑴; ⑴; (1); (1); ) PARENTHESIZED DIGIT ONE +2475;2475;2475;0028 0032 0029;0028 0032 0029; # (⑵; ⑵; ⑵; (2); (2); ) PARENTHESIZED DIGIT TWO +2476;2476;2476;0028 0033 0029;0028 0033 0029; # (⑶; ⑶; ⑶; (3); (3); ) PARENTHESIZED DIGIT THREE +2477;2477;2477;0028 0034 0029;0028 0034 0029; # (⑷; ⑷; ⑷; (4); (4); ) PARENTHESIZED DIGIT FOUR +2478;2478;2478;0028 0035 0029;0028 0035 0029; # (⑸; ⑸; ⑸; (5); (5); ) PARENTHESIZED DIGIT FIVE +2479;2479;2479;0028 0036 0029;0028 0036 0029; # (⑹; ⑹; ⑹; (6); (6); ) PARENTHESIZED DIGIT SIX +247A;247A;247A;0028 0037 0029;0028 0037 0029; # (⑺; ⑺; ⑺; (7); (7); ) PARENTHESIZED DIGIT SEVEN +247B;247B;247B;0028 0038 0029;0028 0038 0029; # (⑻; ⑻; ⑻; (8); (8); ) PARENTHESIZED DIGIT EIGHT +247C;247C;247C;0028 0039 0029;0028 0039 0029; # (⑼; ⑼; ⑼; (9); (9); ) PARENTHESIZED DIGIT NINE +247D;247D;247D;0028 0031 0030 0029;0028 0031 0030 0029; # (⑽; ⑽; ⑽; (10); (10); ) PARENTHESIZED NUMBER TEN +247E;247E;247E;0028 0031 0031 0029;0028 0031 0031 0029; # (⑾; ⑾; ⑾; (11); (11); ) PARENTHESIZED NUMBER ELEVEN +247F;247F;247F;0028 0031 0032 0029;0028 0031 0032 0029; # (⑿; ⑿; ⑿; (12); (12); ) PARENTHESIZED NUMBER TWELVE +2480;2480;2480;0028 0031 0033 0029;0028 0031 0033 0029; # (⒀; ⒀; ⒀; (13); (13); ) PARENTHESIZED NUMBER THIRTEEN +2481;2481;2481;0028 0031 0034 0029;0028 0031 0034 0029; # (⒁; ⒁; ⒁; (14); (14); ) PARENTHESIZED NUMBER FOURTEEN +2482;2482;2482;0028 0031 0035 0029;0028 0031 0035 0029; # (⒂; ⒂; ⒂; (15); (15); ) PARENTHESIZED NUMBER FIFTEEN +2483;2483;2483;0028 0031 0036 0029;0028 0031 0036 0029; # (⒃; ⒃; ⒃; (16); (16); ) PARENTHESIZED NUMBER SIXTEEN +2484;2484;2484;0028 0031 0037 0029;0028 0031 0037 0029; # (⒄; ⒄; ⒄; (17); (17); ) PARENTHESIZED NUMBER SEVENTEEN +2485;2485;2485;0028 0031 0038 0029;0028 0031 0038 0029; # (⒅; ⒅; ⒅; (18); (18); ) PARENTHESIZED NUMBER EIGHTEEN +2486;2486;2486;0028 0031 0039 0029;0028 0031 0039 0029; # (⒆; ⒆; ⒆; (19); (19); ) PARENTHESIZED NUMBER NINETEEN +2487;2487;2487;0028 0032 0030 0029;0028 0032 0030 0029; # (⒇; ⒇; ⒇; (20); (20); ) PARENTHESIZED NUMBER TWENTY +2488;2488;2488;0031 002E;0031 002E; # (⒈; ⒈; ⒈; 1.; 1.; ) DIGIT ONE FULL STOP +2489;2489;2489;0032 002E;0032 002E; # (⒉; ⒉; ⒉; 2.; 2.; ) DIGIT TWO FULL STOP +248A;248A;248A;0033 002E;0033 002E; # (⒊; ⒊; ⒊; 3.; 3.; ) DIGIT THREE FULL STOP +248B;248B;248B;0034 002E;0034 002E; # (⒋; ⒋; ⒋; 4.; 4.; ) DIGIT FOUR FULL STOP +248C;248C;248C;0035 002E;0035 002E; # (⒌; ⒌; ⒌; 5.; 5.; ) DIGIT FIVE FULL STOP +248D;248D;248D;0036 002E;0036 002E; # (⒍; ⒍; ⒍; 6.; 6.; ) DIGIT SIX FULL STOP +248E;248E;248E;0037 002E;0037 002E; # (⒎; ⒎; ⒎; 7.; 7.; ) DIGIT SEVEN FULL STOP +248F;248F;248F;0038 002E;0038 002E; # (⒏; ⒏; ⒏; 8.; 8.; ) DIGIT EIGHT FULL STOP +2490;2490;2490;0039 002E;0039 002E; # (⒐; ⒐; ⒐; 9.; 9.; ) DIGIT NINE FULL STOP +2491;2491;2491;0031 0030 002E;0031 0030 002E; # (⒑; ⒑; ⒑; 10.; 10.; ) NUMBER TEN FULL STOP +2492;2492;2492;0031 0031 002E;0031 0031 002E; # (⒒; ⒒; ⒒; 11.; 11.; ) NUMBER ELEVEN FULL STOP +2493;2493;2493;0031 0032 002E;0031 0032 002E; # (⒓; ⒓; ⒓; 12.; 12.; ) NUMBER TWELVE FULL STOP +2494;2494;2494;0031 0033 002E;0031 0033 002E; # (⒔; ⒔; ⒔; 13.; 13.; ) NUMBER THIRTEEN FULL STOP +2495;2495;2495;0031 0034 002E;0031 0034 002E; # (⒕; ⒕; ⒕; 14.; 14.; ) NUMBER FOURTEEN FULL STOP +2496;2496;2496;0031 0035 002E;0031 0035 002E; # (⒖; ⒖; ⒖; 15.; 15.; ) NUMBER FIFTEEN FULL STOP +2497;2497;2497;0031 0036 002E;0031 0036 002E; # (⒗; ⒗; ⒗; 16.; 16.; ) NUMBER SIXTEEN FULL STOP +2498;2498;2498;0031 0037 002E;0031 0037 002E; # (⒘; ⒘; ⒘; 17.; 17.; ) NUMBER SEVENTEEN FULL STOP +2499;2499;2499;0031 0038 002E;0031 0038 002E; # (⒙; ⒙; ⒙; 18.; 18.; ) NUMBER EIGHTEEN FULL STOP +249A;249A;249A;0031 0039 002E;0031 0039 002E; # (⒚; ⒚; ⒚; 19.; 19.; ) NUMBER NINETEEN FULL STOP +249B;249B;249B;0032 0030 002E;0032 0030 002E; # (⒛; ⒛; ⒛; 20.; 20.; ) NUMBER TWENTY FULL STOP +249C;249C;249C;0028 0061 0029;0028 0061 0029; # (⒜; ⒜; ⒜; (a); (a); ) PARENTHESIZED LATIN SMALL LETTER A +249D;249D;249D;0028 0062 0029;0028 0062 0029; # (⒝; ⒝; ⒝; (b); (b); ) PARENTHESIZED LATIN SMALL LETTER B +249E;249E;249E;0028 0063 0029;0028 0063 0029; # (⒞; ⒞; ⒞; (c); (c); ) PARENTHESIZED LATIN SMALL LETTER C +249F;249F;249F;0028 0064 0029;0028 0064 0029; # (⒟; ⒟; ⒟; (d); (d); ) PARENTHESIZED LATIN SMALL LETTER D +24A0;24A0;24A0;0028 0065 0029;0028 0065 0029; # (⒠; ⒠; ⒠; (e); (e); ) PARENTHESIZED LATIN SMALL LETTER E +24A1;24A1;24A1;0028 0066 0029;0028 0066 0029; # (⒡; ⒡; ⒡; (f); (f); ) PARENTHESIZED LATIN SMALL LETTER F +24A2;24A2;24A2;0028 0067 0029;0028 0067 0029; # (⒢; ⒢; ⒢; (g); (g); ) PARENTHESIZED LATIN SMALL LETTER G +24A3;24A3;24A3;0028 0068 0029;0028 0068 0029; # (⒣; ⒣; ⒣; (h); (h); ) PARENTHESIZED LATIN SMALL LETTER H +24A4;24A4;24A4;0028 0069 0029;0028 0069 0029; # (⒤; ⒤; ⒤; (i); (i); ) PARENTHESIZED LATIN SMALL LETTER I +24A5;24A5;24A5;0028 006A 0029;0028 006A 0029; # (⒥; ⒥; ⒥; (j); (j); ) PARENTHESIZED LATIN SMALL LETTER J +24A6;24A6;24A6;0028 006B 0029;0028 006B 0029; # (⒦; ⒦; ⒦; (k); (k); ) PARENTHESIZED LATIN SMALL LETTER K +24A7;24A7;24A7;0028 006C 0029;0028 006C 0029; # (⒧; ⒧; ⒧; (l); (l); ) PARENTHESIZED LATIN SMALL LETTER L +24A8;24A8;24A8;0028 006D 0029;0028 006D 0029; # (⒨; ⒨; ⒨; (m); (m); ) PARENTHESIZED LATIN SMALL LETTER M +24A9;24A9;24A9;0028 006E 0029;0028 006E 0029; # (⒩; ⒩; ⒩; (n); (n); ) PARENTHESIZED LATIN SMALL LETTER N +24AA;24AA;24AA;0028 006F 0029;0028 006F 0029; # (⒪; ⒪; ⒪; (o); (o); ) PARENTHESIZED LATIN SMALL LETTER O +24AB;24AB;24AB;0028 0070 0029;0028 0070 0029; # (⒫; ⒫; ⒫; (p); (p); ) PARENTHESIZED LATIN SMALL LETTER P +24AC;24AC;24AC;0028 0071 0029;0028 0071 0029; # (⒬; ⒬; ⒬; (q); (q); ) PARENTHESIZED LATIN SMALL LETTER Q +24AD;24AD;24AD;0028 0072 0029;0028 0072 0029; # (⒭; ⒭; ⒭; (r); (r); ) PARENTHESIZED LATIN SMALL LETTER R +24AE;24AE;24AE;0028 0073 0029;0028 0073 0029; # (⒮; ⒮; ⒮; (s); (s); ) PARENTHESIZED LATIN SMALL LETTER S +24AF;24AF;24AF;0028 0074 0029;0028 0074 0029; # (⒯; ⒯; ⒯; (t); (t); ) PARENTHESIZED LATIN SMALL LETTER T +24B0;24B0;24B0;0028 0075 0029;0028 0075 0029; # (⒰; ⒰; ⒰; (u); (u); ) PARENTHESIZED LATIN SMALL LETTER U +24B1;24B1;24B1;0028 0076 0029;0028 0076 0029; # (⒱; ⒱; ⒱; (v); (v); ) PARENTHESIZED LATIN SMALL LETTER V +24B2;24B2;24B2;0028 0077 0029;0028 0077 0029; # (⒲; ⒲; ⒲; (w); (w); ) PARENTHESIZED LATIN SMALL LETTER W +24B3;24B3;24B3;0028 0078 0029;0028 0078 0029; # (⒳; ⒳; ⒳; (x); (x); ) PARENTHESIZED LATIN SMALL LETTER X +24B4;24B4;24B4;0028 0079 0029;0028 0079 0029; # (⒴; ⒴; ⒴; (y); (y); ) PARENTHESIZED LATIN SMALL LETTER Y +24B5;24B5;24B5;0028 007A 0029;0028 007A 0029; # (⒵; ⒵; ⒵; (z); (z); ) PARENTHESIZED LATIN SMALL LETTER Z +24B6;24B6;24B6;0041;0041; # (Ⓐ; Ⓐ; Ⓐ; A; A; ) CIRCLED LATIN CAPITAL LETTER A +24B7;24B7;24B7;0042;0042; # (Ⓑ; Ⓑ; Ⓑ; B; B; ) CIRCLED LATIN CAPITAL LETTER B +24B8;24B8;24B8;0043;0043; # (Ⓒ; Ⓒ; Ⓒ; C; C; ) CIRCLED LATIN CAPITAL LETTER C +24B9;24B9;24B9;0044;0044; # (Ⓓ; Ⓓ; Ⓓ; D; D; ) CIRCLED LATIN CAPITAL LETTER D +24BA;24BA;24BA;0045;0045; # (Ⓔ; Ⓔ; Ⓔ; E; E; ) CIRCLED LATIN CAPITAL LETTER E +24BB;24BB;24BB;0046;0046; # (Ⓕ; Ⓕ; Ⓕ; F; F; ) CIRCLED LATIN CAPITAL LETTER F +24BC;24BC;24BC;0047;0047; # (Ⓖ; Ⓖ; Ⓖ; G; G; ) CIRCLED LATIN CAPITAL LETTER G +24BD;24BD;24BD;0048;0048; # (Ⓗ; Ⓗ; Ⓗ; H; H; ) CIRCLED LATIN CAPITAL LETTER H +24BE;24BE;24BE;0049;0049; # (Ⓘ; Ⓘ; Ⓘ; I; I; ) CIRCLED LATIN CAPITAL LETTER I +24BF;24BF;24BF;004A;004A; # (Ⓙ; Ⓙ; Ⓙ; J; J; ) CIRCLED LATIN CAPITAL LETTER J +24C0;24C0;24C0;004B;004B; # (Ⓚ; Ⓚ; Ⓚ; K; K; ) CIRCLED LATIN CAPITAL LETTER K +24C1;24C1;24C1;004C;004C; # (Ⓛ; Ⓛ; Ⓛ; L; L; ) CIRCLED LATIN CAPITAL LETTER L +24C2;24C2;24C2;004D;004D; # (Ⓜ; Ⓜ; Ⓜ; M; M; ) CIRCLED LATIN CAPITAL LETTER M +24C3;24C3;24C3;004E;004E; # (Ⓝ; Ⓝ; Ⓝ; N; N; ) CIRCLED LATIN CAPITAL LETTER N +24C4;24C4;24C4;004F;004F; # (Ⓞ; Ⓞ; Ⓞ; O; O; ) CIRCLED LATIN CAPITAL LETTER O +24C5;24C5;24C5;0050;0050; # (Ⓟ; Ⓟ; Ⓟ; P; P; ) CIRCLED LATIN CAPITAL LETTER P +24C6;24C6;24C6;0051;0051; # (Ⓠ; Ⓠ; Ⓠ; Q; Q; ) CIRCLED LATIN CAPITAL LETTER Q +24C7;24C7;24C7;0052;0052; # (Ⓡ; Ⓡ; Ⓡ; R; R; ) CIRCLED LATIN CAPITAL LETTER R +24C8;24C8;24C8;0053;0053; # (Ⓢ; Ⓢ; Ⓢ; S; S; ) CIRCLED LATIN CAPITAL LETTER S +24C9;24C9;24C9;0054;0054; # (Ⓣ; Ⓣ; Ⓣ; T; T; ) CIRCLED LATIN CAPITAL LETTER T +24CA;24CA;24CA;0055;0055; # (Ⓤ; Ⓤ; Ⓤ; U; U; ) CIRCLED LATIN CAPITAL LETTER U +24CB;24CB;24CB;0056;0056; # (Ⓥ; Ⓥ; Ⓥ; V; V; ) CIRCLED LATIN CAPITAL LETTER V +24CC;24CC;24CC;0057;0057; # (Ⓦ; Ⓦ; Ⓦ; W; W; ) CIRCLED LATIN CAPITAL LETTER W +24CD;24CD;24CD;0058;0058; # (Ⓧ; Ⓧ; Ⓧ; X; X; ) CIRCLED LATIN CAPITAL LETTER X +24CE;24CE;24CE;0059;0059; # (Ⓨ; Ⓨ; Ⓨ; Y; Y; ) CIRCLED LATIN CAPITAL LETTER Y +24CF;24CF;24CF;005A;005A; # (Ⓩ; Ⓩ; Ⓩ; Z; Z; ) CIRCLED LATIN CAPITAL LETTER Z +24D0;24D0;24D0;0061;0061; # (ⓐ; ⓐ; ⓐ; a; a; ) CIRCLED LATIN SMALL LETTER A +24D1;24D1;24D1;0062;0062; # (ⓑ; ⓑ; ⓑ; b; b; ) CIRCLED LATIN SMALL LETTER B +24D2;24D2;24D2;0063;0063; # (ⓒ; ⓒ; ⓒ; c; c; ) CIRCLED LATIN SMALL LETTER C +24D3;24D3;24D3;0064;0064; # (ⓓ; ⓓ; ⓓ; d; d; ) CIRCLED LATIN SMALL LETTER D +24D4;24D4;24D4;0065;0065; # (ⓔ; ⓔ; ⓔ; e; e; ) CIRCLED LATIN SMALL LETTER E +24D5;24D5;24D5;0066;0066; # (ⓕ; ⓕ; ⓕ; f; f; ) CIRCLED LATIN SMALL LETTER F +24D6;24D6;24D6;0067;0067; # (ⓖ; ⓖ; ⓖ; g; g; ) CIRCLED LATIN SMALL LETTER G +24D7;24D7;24D7;0068;0068; # (ⓗ; ⓗ; ⓗ; h; h; ) CIRCLED LATIN SMALL LETTER H +24D8;24D8;24D8;0069;0069; # (ⓘ; ⓘ; ⓘ; i; i; ) CIRCLED LATIN SMALL LETTER I +24D9;24D9;24D9;006A;006A; # (ⓙ; ⓙ; ⓙ; j; j; ) CIRCLED LATIN SMALL LETTER J +24DA;24DA;24DA;006B;006B; # (ⓚ; ⓚ; ⓚ; k; k; ) CIRCLED LATIN SMALL LETTER K +24DB;24DB;24DB;006C;006C; # (ⓛ; ⓛ; ⓛ; l; l; ) CIRCLED LATIN SMALL LETTER L +24DC;24DC;24DC;006D;006D; # (ⓜ; ⓜ; ⓜ; m; m; ) CIRCLED LATIN SMALL LETTER M +24DD;24DD;24DD;006E;006E; # (ⓝ; ⓝ; ⓝ; n; n; ) CIRCLED LATIN SMALL LETTER N +24DE;24DE;24DE;006F;006F; # (ⓞ; ⓞ; ⓞ; o; o; ) CIRCLED LATIN SMALL LETTER O +24DF;24DF;24DF;0070;0070; # (ⓟ; ⓟ; ⓟ; p; p; ) CIRCLED LATIN SMALL LETTER P +24E0;24E0;24E0;0071;0071; # (ⓠ; ⓠ; ⓠ; q; q; ) CIRCLED LATIN SMALL LETTER Q +24E1;24E1;24E1;0072;0072; # (ⓡ; ⓡ; ⓡ; r; r; ) CIRCLED LATIN SMALL LETTER R +24E2;24E2;24E2;0073;0073; # (ⓢ; ⓢ; ⓢ; s; s; ) CIRCLED LATIN SMALL LETTER S +24E3;24E3;24E3;0074;0074; # (ⓣ; ⓣ; ⓣ; t; t; ) CIRCLED LATIN SMALL LETTER T +24E4;24E4;24E4;0075;0075; # (ⓤ; ⓤ; ⓤ; u; u; ) CIRCLED LATIN SMALL LETTER U +24E5;24E5;24E5;0076;0076; # (ⓥ; ⓥ; ⓥ; v; v; ) CIRCLED LATIN SMALL LETTER V +24E6;24E6;24E6;0077;0077; # (ⓦ; ⓦ; ⓦ; w; w; ) CIRCLED LATIN SMALL LETTER W +24E7;24E7;24E7;0078;0078; # (ⓧ; ⓧ; ⓧ; x; x; ) CIRCLED LATIN SMALL LETTER X +24E8;24E8;24E8;0079;0079; # (ⓨ; ⓨ; ⓨ; y; y; ) CIRCLED LATIN SMALL LETTER Y +24E9;24E9;24E9;007A;007A; # (ⓩ; ⓩ; ⓩ; z; z; ) CIRCLED LATIN SMALL LETTER Z +24EA;24EA;24EA;0030;0030; # (⓪; ⓪; ⓪; 0; 0; ) CIRCLED DIGIT ZERO +2A0C;2A0C;2A0C;222B 222B 222B 222B;222B 222B 222B 222B; # (⨌; ⨌; ⨌; ∫∫∫∫; ∫∫∫∫; ) QUADRUPLE INTEGRAL OPERATOR +2A74;2A74;2A74;003A 003A 003D;003A 003A 003D; # (⩴; ⩴; ⩴; ::=; ::=; ) DOUBLE COLON EQUAL +2A75;2A75;2A75;003D 003D;003D 003D; # (⩵; ⩵; ⩵; ==; ==; ) TWO CONSECUTIVE EQUALS SIGNS +2A76;2A76;2A76;003D 003D 003D;003D 003D 003D; # (⩶; ⩶; ⩶; ===; ===; ) THREE CONSECUTIVE EQUALS SIGNS +2ADC;2ADD 0338;2ADD 0338;2ADD 0338;2ADD 0338; # (⫝̸; ⫝◌̸; ⫝◌̸; ⫝◌̸; ⫝◌̸; ) FORKING +2C7C;2C7C;2C7C;006A;006A; # (ⱼ; ⱼ; ⱼ; j; j; ) LATIN SUBSCRIPT SMALL LETTER J +2C7D;2C7D;2C7D;0056;0056; # (ⱽ; ⱽ; ⱽ; V; V; ) MODIFIER LETTER CAPITAL V +2D6F;2D6F;2D6F;2D61;2D61; # (ⵯ; ⵯ; ⵯ; ⵡ; ⵡ; ) TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2E9F;2E9F;2E9F;6BCD;6BCD; # (⺟; ⺟; ⺟; 母; 母; ) CJK RADICAL MOTHER +2EF3;2EF3;2EF3;9F9F;9F9F; # (⻳; ⻳; ⻳; 龟; 龟; ) CJK RADICAL C-SIMPLIFIED TURTLE +2F00;2F00;2F00;4E00;4E00; # (⼀; ⼀; ⼀; 一; 一; ) KANGXI RADICAL ONE +2F01;2F01;2F01;4E28;4E28; # (⼁; ⼁; ⼁; 丨; 丨; ) KANGXI RADICAL LINE +2F02;2F02;2F02;4E36;4E36; # (⼂; ⼂; ⼂; 丶; 丶; ) KANGXI RADICAL DOT +2F03;2F03;2F03;4E3F;4E3F; # (⼃; ⼃; ⼃; 丿; 丿; ) KANGXI RADICAL SLASH +2F04;2F04;2F04;4E59;4E59; # (⼄; ⼄; ⼄; 乙; 乙; ) KANGXI RADICAL SECOND +2F05;2F05;2F05;4E85;4E85; # (⼅; ⼅; ⼅; 亅; 亅; ) KANGXI RADICAL HOOK +2F06;2F06;2F06;4E8C;4E8C; # (⼆; ⼆; ⼆; 二; 二; ) KANGXI RADICAL TWO +2F07;2F07;2F07;4EA0;4EA0; # (⼇; ⼇; ⼇; 亠; 亠; ) KANGXI RADICAL LID +2F08;2F08;2F08;4EBA;4EBA; # (⼈; ⼈; ⼈; 人; 人; ) KANGXI RADICAL MAN +2F09;2F09;2F09;513F;513F; # (⼉; ⼉; ⼉; 儿; 儿; ) KANGXI RADICAL LEGS +2F0A;2F0A;2F0A;5165;5165; # (⼊; ⼊; ⼊; 入; 入; ) KANGXI RADICAL ENTER +2F0B;2F0B;2F0B;516B;516B; # (⼋; ⼋; ⼋; 八; 八; ) KANGXI RADICAL EIGHT +2F0C;2F0C;2F0C;5182;5182; # (⼌; ⼌; ⼌; 冂; 冂; ) KANGXI RADICAL DOWN BOX +2F0D;2F0D;2F0D;5196;5196; # (⼍; ⼍; ⼍; 冖; 冖; ) KANGXI RADICAL COVER +2F0E;2F0E;2F0E;51AB;51AB; # (⼎; ⼎; ⼎; 冫; 冫; ) KANGXI RADICAL ICE +2F0F;2F0F;2F0F;51E0;51E0; # (⼏; ⼏; ⼏; 几; 几; ) KANGXI RADICAL TABLE +2F10;2F10;2F10;51F5;51F5; # (⼐; ⼐; ⼐; 凵; 凵; ) KANGXI RADICAL OPEN BOX +2F11;2F11;2F11;5200;5200; # (⼑; ⼑; ⼑; 刀; 刀; ) KANGXI RADICAL KNIFE +2F12;2F12;2F12;529B;529B; # (⼒; ⼒; ⼒; 力; 力; ) KANGXI RADICAL POWER +2F13;2F13;2F13;52F9;52F9; # (⼓; ⼓; ⼓; 勹; 勹; ) KANGXI RADICAL WRAP +2F14;2F14;2F14;5315;5315; # (⼔; ⼔; ⼔; 匕; 匕; ) KANGXI RADICAL SPOON +2F15;2F15;2F15;531A;531A; # (⼕; ⼕; ⼕; 匚; 匚; ) KANGXI RADICAL RIGHT OPEN BOX +2F16;2F16;2F16;5338;5338; # (⼖; ⼖; ⼖; 匸; 匸; ) KANGXI RADICAL HIDING ENCLOSURE +2F17;2F17;2F17;5341;5341; # (⼗; ⼗; ⼗; 十; 十; ) KANGXI RADICAL TEN +2F18;2F18;2F18;535C;535C; # (⼘; ⼘; ⼘; 卜; 卜; ) KANGXI RADICAL DIVINATION +2F19;2F19;2F19;5369;5369; # (⼙; ⼙; ⼙; 卩; 卩; ) KANGXI RADICAL SEAL +2F1A;2F1A;2F1A;5382;5382; # (⼚; ⼚; ⼚; 厂; 厂; ) KANGXI RADICAL CLIFF +2F1B;2F1B;2F1B;53B6;53B6; # (⼛; ⼛; ⼛; 厶; 厶; ) KANGXI RADICAL PRIVATE +2F1C;2F1C;2F1C;53C8;53C8; # (⼜; ⼜; ⼜; 又; 又; ) KANGXI RADICAL AGAIN +2F1D;2F1D;2F1D;53E3;53E3; # (⼝; ⼝; ⼝; 口; 口; ) KANGXI RADICAL MOUTH +2F1E;2F1E;2F1E;56D7;56D7; # (⼞; ⼞; ⼞; 囗; 囗; ) KANGXI RADICAL ENCLOSURE +2F1F;2F1F;2F1F;571F;571F; # (⼟; ⼟; ⼟; 土; 土; ) KANGXI RADICAL EARTH +2F20;2F20;2F20;58EB;58EB; # (⼠; ⼠; ⼠; 士; 士; ) KANGXI RADICAL SCHOLAR +2F21;2F21;2F21;5902;5902; # (⼡; ⼡; ⼡; 夂; 夂; ) KANGXI RADICAL GO +2F22;2F22;2F22;590A;590A; # (⼢; ⼢; ⼢; 夊; 夊; ) KANGXI RADICAL GO SLOWLY +2F23;2F23;2F23;5915;5915; # (⼣; ⼣; ⼣; 夕; 夕; ) KANGXI RADICAL EVENING +2F24;2F24;2F24;5927;5927; # (⼤; ⼤; ⼤; 大; 大; ) KANGXI RADICAL BIG +2F25;2F25;2F25;5973;5973; # (⼥; ⼥; ⼥; 女; 女; ) KANGXI RADICAL WOMAN +2F26;2F26;2F26;5B50;5B50; # (⼦; ⼦; ⼦; 子; 子; ) KANGXI RADICAL CHILD +2F27;2F27;2F27;5B80;5B80; # (⼧; ⼧; ⼧; 宀; 宀; ) KANGXI RADICAL ROOF +2F28;2F28;2F28;5BF8;5BF8; # (⼨; ⼨; ⼨; 寸; 寸; ) KANGXI RADICAL INCH +2F29;2F29;2F29;5C0F;5C0F; # (⼩; ⼩; ⼩; 小; 小; ) KANGXI RADICAL SMALL +2F2A;2F2A;2F2A;5C22;5C22; # (⼪; ⼪; ⼪; 尢; 尢; ) KANGXI RADICAL LAME +2F2B;2F2B;2F2B;5C38;5C38; # (⼫; ⼫; ⼫; 尸; 尸; ) KANGXI RADICAL CORPSE +2F2C;2F2C;2F2C;5C6E;5C6E; # (⼬; ⼬; ⼬; 屮; 屮; ) KANGXI RADICAL SPROUT +2F2D;2F2D;2F2D;5C71;5C71; # (⼭; ⼭; ⼭; 山; 山; ) KANGXI RADICAL MOUNTAIN +2F2E;2F2E;2F2E;5DDB;5DDB; # (⼮; ⼮; ⼮; 巛; 巛; ) KANGXI RADICAL RIVER +2F2F;2F2F;2F2F;5DE5;5DE5; # (⼯; ⼯; ⼯; 工; 工; ) KANGXI RADICAL WORK +2F30;2F30;2F30;5DF1;5DF1; # (⼰; ⼰; ⼰; 己; 己; ) KANGXI RADICAL ONESELF +2F31;2F31;2F31;5DFE;5DFE; # (⼱; ⼱; ⼱; 巾; 巾; ) KANGXI RADICAL TURBAN +2F32;2F32;2F32;5E72;5E72; # (⼲; ⼲; ⼲; 干; 干; ) KANGXI RADICAL DRY +2F33;2F33;2F33;5E7A;5E7A; # (⼳; ⼳; ⼳; 幺; 幺; ) KANGXI RADICAL SHORT THREAD +2F34;2F34;2F34;5E7F;5E7F; # (⼴; ⼴; ⼴; 广; 广; ) KANGXI RADICAL DOTTED CLIFF +2F35;2F35;2F35;5EF4;5EF4; # (⼵; ⼵; ⼵; 廴; 廴; ) KANGXI RADICAL LONG STRIDE +2F36;2F36;2F36;5EFE;5EFE; # (⼶; ⼶; ⼶; 廾; 廾; ) KANGXI RADICAL TWO HANDS +2F37;2F37;2F37;5F0B;5F0B; # (⼷; ⼷; ⼷; 弋; 弋; ) KANGXI RADICAL SHOOT +2F38;2F38;2F38;5F13;5F13; # (⼸; ⼸; ⼸; 弓; 弓; ) KANGXI RADICAL BOW +2F39;2F39;2F39;5F50;5F50; # (⼹; ⼹; ⼹; 彐; 彐; ) KANGXI RADICAL SNOUT +2F3A;2F3A;2F3A;5F61;5F61; # (⼺; ⼺; ⼺; 彡; 彡; ) KANGXI RADICAL BRISTLE +2F3B;2F3B;2F3B;5F73;5F73; # (⼻; ⼻; ⼻; 彳; 彳; ) KANGXI RADICAL STEP +2F3C;2F3C;2F3C;5FC3;5FC3; # (⼼; ⼼; ⼼; 心; 心; ) KANGXI RADICAL HEART +2F3D;2F3D;2F3D;6208;6208; # (⼽; ⼽; ⼽; 戈; 戈; ) KANGXI RADICAL HALBERD +2F3E;2F3E;2F3E;6236;6236; # (⼾; ⼾; ⼾; 戶; 戶; ) KANGXI RADICAL DOOR +2F3F;2F3F;2F3F;624B;624B; # (⼿; ⼿; ⼿; 手; 手; ) KANGXI RADICAL HAND +2F40;2F40;2F40;652F;652F; # (⽀; ⽀; ⽀; 支; 支; ) KANGXI RADICAL BRANCH +2F41;2F41;2F41;6534;6534; # (⽁; ⽁; ⽁; 攴; 攴; ) KANGXI RADICAL RAP +2F42;2F42;2F42;6587;6587; # (⽂; ⽂; ⽂; 文; 文; ) KANGXI RADICAL SCRIPT +2F43;2F43;2F43;6597;6597; # (⽃; ⽃; ⽃; 斗; 斗; ) KANGXI RADICAL DIPPER +2F44;2F44;2F44;65A4;65A4; # (⽄; ⽄; ⽄; 斤; 斤; ) KANGXI RADICAL AXE +2F45;2F45;2F45;65B9;65B9; # (⽅; ⽅; ⽅; 方; 方; ) KANGXI RADICAL SQUARE +2F46;2F46;2F46;65E0;65E0; # (⽆; ⽆; ⽆; 无; 无; ) KANGXI RADICAL NOT +2F47;2F47;2F47;65E5;65E5; # (⽇; ⽇; ⽇; 日; 日; ) KANGXI RADICAL SUN +2F48;2F48;2F48;66F0;66F0; # (⽈; ⽈; ⽈; 曰; 曰; ) KANGXI RADICAL SAY +2F49;2F49;2F49;6708;6708; # (⽉; ⽉; ⽉; 月; 月; ) KANGXI RADICAL MOON +2F4A;2F4A;2F4A;6728;6728; # (⽊; ⽊; ⽊; 木; 木; ) KANGXI RADICAL TREE +2F4B;2F4B;2F4B;6B20;6B20; # (⽋; ⽋; ⽋; 欠; 欠; ) KANGXI RADICAL LACK +2F4C;2F4C;2F4C;6B62;6B62; # (⽌; ⽌; ⽌; 止; 止; ) KANGXI RADICAL STOP +2F4D;2F4D;2F4D;6B79;6B79; # (⽍; ⽍; ⽍; 歹; 歹; ) KANGXI RADICAL DEATH +2F4E;2F4E;2F4E;6BB3;6BB3; # (⽎; ⽎; ⽎; 殳; 殳; ) KANGXI RADICAL WEAPON +2F4F;2F4F;2F4F;6BCB;6BCB; # (⽏; ⽏; ⽏; 毋; 毋; ) KANGXI RADICAL DO NOT +2F50;2F50;2F50;6BD4;6BD4; # (⽐; ⽐; ⽐; 比; 比; ) KANGXI RADICAL COMPARE +2F51;2F51;2F51;6BDB;6BDB; # (⽑; ⽑; ⽑; 毛; 毛; ) KANGXI RADICAL FUR +2F52;2F52;2F52;6C0F;6C0F; # (⽒; ⽒; ⽒; 氏; 氏; ) KANGXI RADICAL CLAN +2F53;2F53;2F53;6C14;6C14; # (⽓; ⽓; ⽓; 气; 气; ) KANGXI RADICAL STEAM +2F54;2F54;2F54;6C34;6C34; # (⽔; ⽔; ⽔; 水; 水; ) KANGXI RADICAL WATER +2F55;2F55;2F55;706B;706B; # (⽕; ⽕; ⽕; 火; 火; ) KANGXI RADICAL FIRE +2F56;2F56;2F56;722A;722A; # (⽖; ⽖; ⽖; 爪; 爪; ) KANGXI RADICAL CLAW +2F57;2F57;2F57;7236;7236; # (⽗; ⽗; ⽗; 父; 父; ) KANGXI RADICAL FATHER +2F58;2F58;2F58;723B;723B; # (⽘; ⽘; ⽘; 爻; 爻; ) KANGXI RADICAL DOUBLE X +2F59;2F59;2F59;723F;723F; # (⽙; ⽙; ⽙; 爿; 爿; ) KANGXI RADICAL HALF TREE TRUNK +2F5A;2F5A;2F5A;7247;7247; # (⽚; ⽚; ⽚; 片; 片; ) KANGXI RADICAL SLICE +2F5B;2F5B;2F5B;7259;7259; # (⽛; ⽛; ⽛; 牙; 牙; ) KANGXI RADICAL FANG +2F5C;2F5C;2F5C;725B;725B; # (⽜; ⽜; ⽜; 牛; 牛; ) KANGXI RADICAL COW +2F5D;2F5D;2F5D;72AC;72AC; # (⽝; ⽝; ⽝; 犬; 犬; ) KANGXI RADICAL DOG +2F5E;2F5E;2F5E;7384;7384; # (⽞; ⽞; ⽞; 玄; 玄; ) KANGXI RADICAL PROFOUND +2F5F;2F5F;2F5F;7389;7389; # (⽟; ⽟; ⽟; 玉; 玉; ) KANGXI RADICAL JADE +2F60;2F60;2F60;74DC;74DC; # (⽠; ⽠; ⽠; 瓜; 瓜; ) KANGXI RADICAL MELON +2F61;2F61;2F61;74E6;74E6; # (⽡; ⽡; ⽡; 瓦; 瓦; ) KANGXI RADICAL TILE +2F62;2F62;2F62;7518;7518; # (⽢; ⽢; ⽢; 甘; 甘; ) KANGXI RADICAL SWEET +2F63;2F63;2F63;751F;751F; # (⽣; ⽣; ⽣; 生; 生; ) KANGXI RADICAL LIFE +2F64;2F64;2F64;7528;7528; # (⽤; ⽤; ⽤; 用; 用; ) KANGXI RADICAL USE +2F65;2F65;2F65;7530;7530; # (⽥; ⽥; ⽥; 田; 田; ) KANGXI RADICAL FIELD +2F66;2F66;2F66;758B;758B; # (⽦; ⽦; ⽦; 疋; 疋; ) KANGXI RADICAL BOLT OF CLOTH +2F67;2F67;2F67;7592;7592; # (⽧; ⽧; ⽧; 疒; 疒; ) KANGXI RADICAL SICKNESS +2F68;2F68;2F68;7676;7676; # (⽨; ⽨; ⽨; 癶; 癶; ) KANGXI RADICAL DOTTED TENT +2F69;2F69;2F69;767D;767D; # (⽩; ⽩; ⽩; 白; 白; ) KANGXI RADICAL WHITE +2F6A;2F6A;2F6A;76AE;76AE; # (⽪; ⽪; ⽪; 皮; 皮; ) KANGXI RADICAL SKIN +2F6B;2F6B;2F6B;76BF;76BF; # (⽫; ⽫; ⽫; 皿; 皿; ) KANGXI RADICAL DISH +2F6C;2F6C;2F6C;76EE;76EE; # (⽬; ⽬; ⽬; 目; 目; ) KANGXI RADICAL EYE +2F6D;2F6D;2F6D;77DB;77DB; # (⽭; ⽭; ⽭; 矛; 矛; ) KANGXI RADICAL SPEAR +2F6E;2F6E;2F6E;77E2;77E2; # (⽮; ⽮; ⽮; 矢; 矢; ) KANGXI RADICAL ARROW +2F6F;2F6F;2F6F;77F3;77F3; # (⽯; ⽯; ⽯; 石; 石; ) KANGXI RADICAL STONE +2F70;2F70;2F70;793A;793A; # (⽰; ⽰; ⽰; 示; 示; ) KANGXI RADICAL SPIRIT +2F71;2F71;2F71;79B8;79B8; # (⽱; ⽱; ⽱; 禸; 禸; ) KANGXI RADICAL TRACK +2F72;2F72;2F72;79BE;79BE; # (⽲; ⽲; ⽲; 禾; 禾; ) KANGXI RADICAL GRAIN +2F73;2F73;2F73;7A74;7A74; # (⽳; ⽳; ⽳; 穴; 穴; ) KANGXI RADICAL CAVE +2F74;2F74;2F74;7ACB;7ACB; # (⽴; ⽴; ⽴; 立; 立; ) KANGXI RADICAL STAND +2F75;2F75;2F75;7AF9;7AF9; # (⽵; ⽵; ⽵; 竹; 竹; ) KANGXI RADICAL BAMBOO +2F76;2F76;2F76;7C73;7C73; # (⽶; ⽶; ⽶; 米; 米; ) KANGXI RADICAL RICE +2F77;2F77;2F77;7CF8;7CF8; # (⽷; ⽷; ⽷; 糸; 糸; ) KANGXI RADICAL SILK +2F78;2F78;2F78;7F36;7F36; # (⽸; ⽸; ⽸; 缶; 缶; ) KANGXI RADICAL JAR +2F79;2F79;2F79;7F51;7F51; # (⽹; ⽹; ⽹; 网; 网; ) KANGXI RADICAL NET +2F7A;2F7A;2F7A;7F8A;7F8A; # (⽺; ⽺; ⽺; 羊; 羊; ) KANGXI RADICAL SHEEP +2F7B;2F7B;2F7B;7FBD;7FBD; # (⽻; ⽻; ⽻; 羽; 羽; ) KANGXI RADICAL FEATHER +2F7C;2F7C;2F7C;8001;8001; # (⽼; ⽼; ⽼; 老; 老; ) KANGXI RADICAL OLD +2F7D;2F7D;2F7D;800C;800C; # (⽽; ⽽; ⽽; 而; 而; ) KANGXI RADICAL AND +2F7E;2F7E;2F7E;8012;8012; # (⽾; ⽾; ⽾; 耒; 耒; ) KANGXI RADICAL PLOW +2F7F;2F7F;2F7F;8033;8033; # (⽿; ⽿; ⽿; 耳; 耳; ) KANGXI RADICAL EAR +2F80;2F80;2F80;807F;807F; # (⾀; ⾀; ⾀; 聿; 聿; ) KANGXI RADICAL BRUSH +2F81;2F81;2F81;8089;8089; # (⾁; ⾁; ⾁; 肉; 肉; ) KANGXI RADICAL MEAT +2F82;2F82;2F82;81E3;81E3; # (⾂; ⾂; ⾂; 臣; 臣; ) KANGXI RADICAL MINISTER +2F83;2F83;2F83;81EA;81EA; # (⾃; ⾃; ⾃; 自; 自; ) KANGXI RADICAL SELF +2F84;2F84;2F84;81F3;81F3; # (⾄; ⾄; ⾄; 至; 至; ) KANGXI RADICAL ARRIVE +2F85;2F85;2F85;81FC;81FC; # (⾅; ⾅; ⾅; 臼; 臼; ) KANGXI RADICAL MORTAR +2F86;2F86;2F86;820C;820C; # (⾆; ⾆; ⾆; 舌; 舌; ) KANGXI RADICAL TONGUE +2F87;2F87;2F87;821B;821B; # (⾇; ⾇; ⾇; 舛; 舛; ) KANGXI RADICAL OPPOSE +2F88;2F88;2F88;821F;821F; # (⾈; ⾈; ⾈; 舟; 舟; ) KANGXI RADICAL BOAT +2F89;2F89;2F89;826E;826E; # (⾉; ⾉; ⾉; 艮; 艮; ) KANGXI RADICAL STOPPING +2F8A;2F8A;2F8A;8272;8272; # (⾊; ⾊; ⾊; 色; 色; ) KANGXI RADICAL COLOR +2F8B;2F8B;2F8B;8278;8278; # (⾋; ⾋; ⾋; 艸; 艸; ) KANGXI RADICAL GRASS +2F8C;2F8C;2F8C;864D;864D; # (⾌; ⾌; ⾌; 虍; 虍; ) KANGXI RADICAL TIGER +2F8D;2F8D;2F8D;866B;866B; # (⾍; ⾍; ⾍; 虫; 虫; ) KANGXI RADICAL INSECT +2F8E;2F8E;2F8E;8840;8840; # (⾎; ⾎; ⾎; 血; 血; ) KANGXI RADICAL BLOOD +2F8F;2F8F;2F8F;884C;884C; # (⾏; ⾏; ⾏; 行; 行; ) KANGXI RADICAL WALK ENCLOSURE +2F90;2F90;2F90;8863;8863; # (⾐; ⾐; ⾐; 衣; 衣; ) KANGXI RADICAL CLOTHES +2F91;2F91;2F91;897E;897E; # (⾑; ⾑; ⾑; 襾; 襾; ) KANGXI RADICAL WEST +2F92;2F92;2F92;898B;898B; # (⾒; ⾒; ⾒; 見; 見; ) KANGXI RADICAL SEE +2F93;2F93;2F93;89D2;89D2; # (⾓; ⾓; ⾓; 角; 角; ) KANGXI RADICAL HORN +2F94;2F94;2F94;8A00;8A00; # (⾔; ⾔; ⾔; 言; 言; ) KANGXI RADICAL SPEECH +2F95;2F95;2F95;8C37;8C37; # (⾕; ⾕; ⾕; 谷; 谷; ) KANGXI RADICAL VALLEY +2F96;2F96;2F96;8C46;8C46; # (⾖; ⾖; ⾖; 豆; 豆; ) KANGXI RADICAL BEAN +2F97;2F97;2F97;8C55;8C55; # (⾗; ⾗; ⾗; 豕; 豕; ) KANGXI RADICAL PIG +2F98;2F98;2F98;8C78;8C78; # (⾘; ⾘; ⾘; 豸; 豸; ) KANGXI RADICAL BADGER +2F99;2F99;2F99;8C9D;8C9D; # (⾙; ⾙; ⾙; 貝; 貝; ) KANGXI RADICAL SHELL +2F9A;2F9A;2F9A;8D64;8D64; # (⾚; ⾚; ⾚; 赤; 赤; ) KANGXI RADICAL RED +2F9B;2F9B;2F9B;8D70;8D70; # (⾛; ⾛; ⾛; 走; 走; ) KANGXI RADICAL RUN +2F9C;2F9C;2F9C;8DB3;8DB3; # (⾜; ⾜; ⾜; 足; 足; ) KANGXI RADICAL FOOT +2F9D;2F9D;2F9D;8EAB;8EAB; # (⾝; ⾝; ⾝; 身; 身; ) KANGXI RADICAL BODY +2F9E;2F9E;2F9E;8ECA;8ECA; # (⾞; ⾞; ⾞; 車; 車; ) KANGXI RADICAL CART +2F9F;2F9F;2F9F;8F9B;8F9B; # (⾟; ⾟; ⾟; 辛; 辛; ) KANGXI RADICAL BITTER +2FA0;2FA0;2FA0;8FB0;8FB0; # (⾠; ⾠; ⾠; 辰; 辰; ) KANGXI RADICAL MORNING +2FA1;2FA1;2FA1;8FB5;8FB5; # (⾡; ⾡; ⾡; 辵; 辵; ) KANGXI RADICAL WALK +2FA2;2FA2;2FA2;9091;9091; # (⾢; ⾢; ⾢; 邑; 邑; ) KANGXI RADICAL CITY +2FA3;2FA3;2FA3;9149;9149; # (⾣; ⾣; ⾣; 酉; 酉; ) KANGXI RADICAL WINE +2FA4;2FA4;2FA4;91C6;91C6; # (⾤; ⾤; ⾤; 釆; 釆; ) KANGXI RADICAL DISTINGUISH +2FA5;2FA5;2FA5;91CC;91CC; # (⾥; ⾥; ⾥; 里; 里; ) KANGXI RADICAL VILLAGE +2FA6;2FA6;2FA6;91D1;91D1; # (⾦; ⾦; ⾦; 金; 金; ) KANGXI RADICAL GOLD +2FA7;2FA7;2FA7;9577;9577; # (⾧; ⾧; ⾧; 長; 長; ) KANGXI RADICAL LONG +2FA8;2FA8;2FA8;9580;9580; # (⾨; ⾨; ⾨; 門; 門; ) KANGXI RADICAL GATE +2FA9;2FA9;2FA9;961C;961C; # (⾩; ⾩; ⾩; 阜; 阜; ) KANGXI RADICAL MOUND +2FAA;2FAA;2FAA;96B6;96B6; # (⾪; ⾪; ⾪; 隶; 隶; ) KANGXI RADICAL SLAVE +2FAB;2FAB;2FAB;96B9;96B9; # (⾫; ⾫; ⾫; 隹; 隹; ) KANGXI RADICAL SHORT TAILED BIRD +2FAC;2FAC;2FAC;96E8;96E8; # (⾬; ⾬; ⾬; 雨; 雨; ) KANGXI RADICAL RAIN +2FAD;2FAD;2FAD;9751;9751; # (⾭; ⾭; ⾭; 靑; 靑; ) KANGXI RADICAL BLUE +2FAE;2FAE;2FAE;975E;975E; # (⾮; ⾮; ⾮; 非; 非; ) KANGXI RADICAL WRONG +2FAF;2FAF;2FAF;9762;9762; # (⾯; ⾯; ⾯; 面; 面; ) KANGXI RADICAL FACE +2FB0;2FB0;2FB0;9769;9769; # (⾰; ⾰; ⾰; 革; 革; ) KANGXI RADICAL LEATHER +2FB1;2FB1;2FB1;97CB;97CB; # (⾱; ⾱; ⾱; 韋; 韋; ) KANGXI RADICAL TANNED LEATHER +2FB2;2FB2;2FB2;97ED;97ED; # (⾲; ⾲; ⾲; 韭; 韭; ) KANGXI RADICAL LEEK +2FB3;2FB3;2FB3;97F3;97F3; # (⾳; ⾳; ⾳; 音; 音; ) KANGXI RADICAL SOUND +2FB4;2FB4;2FB4;9801;9801; # (⾴; ⾴; ⾴; 頁; 頁; ) KANGXI RADICAL LEAF +2FB5;2FB5;2FB5;98A8;98A8; # (⾵; ⾵; ⾵; 風; 風; ) KANGXI RADICAL WIND +2FB6;2FB6;2FB6;98DB;98DB; # (⾶; ⾶; ⾶; 飛; 飛; ) KANGXI RADICAL FLY +2FB7;2FB7;2FB7;98DF;98DF; # (⾷; ⾷; ⾷; 食; 食; ) KANGXI RADICAL EAT +2FB8;2FB8;2FB8;9996;9996; # (⾸; ⾸; ⾸; 首; 首; ) KANGXI RADICAL HEAD +2FB9;2FB9;2FB9;9999;9999; # (⾹; ⾹; ⾹; 香; 香; ) KANGXI RADICAL FRAGRANT +2FBA;2FBA;2FBA;99AC;99AC; # (⾺; ⾺; ⾺; 馬; 馬; ) KANGXI RADICAL HORSE +2FBB;2FBB;2FBB;9AA8;9AA8; # (⾻; ⾻; ⾻; 骨; 骨; ) KANGXI RADICAL BONE +2FBC;2FBC;2FBC;9AD8;9AD8; # (⾼; ⾼; ⾼; 高; 高; ) KANGXI RADICAL TALL +2FBD;2FBD;2FBD;9ADF;9ADF; # (⾽; ⾽; ⾽; 髟; 髟; ) KANGXI RADICAL HAIR +2FBE;2FBE;2FBE;9B25;9B25; # (⾾; ⾾; ⾾; 鬥; 鬥; ) KANGXI RADICAL FIGHT +2FBF;2FBF;2FBF;9B2F;9B2F; # (⾿; ⾿; ⾿; 鬯; 鬯; ) KANGXI RADICAL SACRIFICIAL WINE +2FC0;2FC0;2FC0;9B32;9B32; # (⿀; ⿀; ⿀; 鬲; 鬲; ) KANGXI RADICAL CAULDRON +2FC1;2FC1;2FC1;9B3C;9B3C; # (⿁; ⿁; ⿁; 鬼; 鬼; ) KANGXI RADICAL GHOST +2FC2;2FC2;2FC2;9B5A;9B5A; # (⿂; ⿂; ⿂; 魚; 魚; ) KANGXI RADICAL FISH +2FC3;2FC3;2FC3;9CE5;9CE5; # (⿃; ⿃; ⿃; 鳥; 鳥; ) KANGXI RADICAL BIRD +2FC4;2FC4;2FC4;9E75;9E75; # (⿄; ⿄; ⿄; 鹵; 鹵; ) KANGXI RADICAL SALT +2FC5;2FC5;2FC5;9E7F;9E7F; # (⿅; ⿅; ⿅; 鹿; 鹿; ) KANGXI RADICAL DEER +2FC6;2FC6;2FC6;9EA5;9EA5; # (⿆; ⿆; ⿆; 麥; 麥; ) KANGXI RADICAL WHEAT +2FC7;2FC7;2FC7;9EBB;9EBB; # (⿇; ⿇; ⿇; 麻; 麻; ) KANGXI RADICAL HEMP +2FC8;2FC8;2FC8;9EC3;9EC3; # (⿈; ⿈; ⿈; 黃; 黃; ) KANGXI RADICAL YELLOW +2FC9;2FC9;2FC9;9ECD;9ECD; # (⿉; ⿉; ⿉; 黍; 黍; ) KANGXI RADICAL MILLET +2FCA;2FCA;2FCA;9ED1;9ED1; # (⿊; ⿊; ⿊; 黑; 黑; ) KANGXI RADICAL BLACK +2FCB;2FCB;2FCB;9EF9;9EF9; # (⿋; ⿋; ⿋; 黹; 黹; ) KANGXI RADICAL EMBROIDERY +2FCC;2FCC;2FCC;9EFD;9EFD; # (⿌; ⿌; ⿌; 黽; 黽; ) KANGXI RADICAL FROG +2FCD;2FCD;2FCD;9F0E;9F0E; # (⿍; ⿍; ⿍; 鼎; 鼎; ) KANGXI RADICAL TRIPOD +2FCE;2FCE;2FCE;9F13;9F13; # (⿎; ⿎; ⿎; 鼓; 鼓; ) KANGXI RADICAL DRUM +2FCF;2FCF;2FCF;9F20;9F20; # (⿏; ⿏; ⿏; 鼠; 鼠; ) KANGXI RADICAL RAT +2FD0;2FD0;2FD0;9F3B;9F3B; # (⿐; ⿐; ⿐; 鼻; 鼻; ) KANGXI RADICAL NOSE +2FD1;2FD1;2FD1;9F4A;9F4A; # (⿑; ⿑; ⿑; 齊; 齊; ) KANGXI RADICAL EVEN +2FD2;2FD2;2FD2;9F52;9F52; # (⿒; ⿒; ⿒; 齒; 齒; ) KANGXI RADICAL TOOTH +2FD3;2FD3;2FD3;9F8D;9F8D; # (⿓; ⿓; ⿓; 龍; 龍; ) KANGXI RADICAL DRAGON +2FD4;2FD4;2FD4;9F9C;9F9C; # (⿔; ⿔; ⿔; 龜; 龜; ) KANGXI RADICAL TURTLE +2FD5;2FD5;2FD5;9FA0;9FA0; # (⿕; ⿕; ⿕; 龠; 龠; ) KANGXI RADICAL FLUTE +3000;3000;3000;0020;0020; # ( ;  ;  ; ; ; ) IDEOGRAPHIC SPACE +3036;3036;3036;3012;3012; # (〶; 〶; 〶; 〒; 〒; ) CIRCLED POSTAL MARK +3038;3038;3038;5341;5341; # (〸; 〸; 〸; 十; 十; ) HANGZHOU NUMERAL TEN +3039;3039;3039;5344;5344; # (〹; 〹; 〹; 卄; 卄; ) HANGZHOU NUMERAL TWENTY +303A;303A;303A;5345;5345; # (〺; 〺; 〺; 卅; 卅; ) HANGZHOU NUMERAL THIRTY +304C;304C;304B 3099;304C;304B 3099; # (が; が; か◌゙; が; か◌゙; ) HIRAGANA LETTER GA +304E;304E;304D 3099;304E;304D 3099; # (ぎ; ぎ; き◌゙; ぎ; き◌゙; ) HIRAGANA LETTER GI +3050;3050;304F 3099;3050;304F 3099; # (ぐ; ぐ; く◌゙; ぐ; く◌゙; ) HIRAGANA LETTER GU +3052;3052;3051 3099;3052;3051 3099; # (げ; げ; け◌゙; げ; け◌゙; ) HIRAGANA LETTER GE +3054;3054;3053 3099;3054;3053 3099; # (ご; ご; こ◌゙; ご; こ◌゙; ) HIRAGANA LETTER GO +3056;3056;3055 3099;3056;3055 3099; # (ざ; ざ; さ◌゙; ざ; さ◌゙; ) HIRAGANA LETTER ZA +3058;3058;3057 3099;3058;3057 3099; # (じ; じ; し◌゙; じ; し◌゙; ) HIRAGANA LETTER ZI +305A;305A;3059 3099;305A;3059 3099; # (ず; ず; す◌゙; ず; す◌゙; ) HIRAGANA LETTER ZU +305C;305C;305B 3099;305C;305B 3099; # (ぜ; ぜ; せ◌゙; ぜ; せ◌゙; ) HIRAGANA LETTER ZE +305E;305E;305D 3099;305E;305D 3099; # (ぞ; ぞ; そ◌゙; ぞ; そ◌゙; ) HIRAGANA LETTER ZO +3060;3060;305F 3099;3060;305F 3099; # (だ; だ; た◌゙; だ; た◌゙; ) HIRAGANA LETTER DA +3062;3062;3061 3099;3062;3061 3099; # (ぢ; ぢ; ち◌゙; ぢ; ち◌゙; ) HIRAGANA LETTER DI +3065;3065;3064 3099;3065;3064 3099; # (づ; づ; つ◌゙; づ; つ◌゙; ) HIRAGANA LETTER DU +3067;3067;3066 3099;3067;3066 3099; # (で; で; て◌゙; で; て◌゙; ) HIRAGANA LETTER DE +3069;3069;3068 3099;3069;3068 3099; # (ど; ど; と◌゙; ど; と◌゙; ) HIRAGANA LETTER DO +3070;3070;306F 3099;3070;306F 3099; # (ば; ば; は◌゙; ば; は◌゙; ) HIRAGANA LETTER BA +3071;3071;306F 309A;3071;306F 309A; # (ぱ; ぱ; は◌゚; ぱ; は◌゚; ) HIRAGANA LETTER PA +3073;3073;3072 3099;3073;3072 3099; # (び; び; ひ◌゙; び; ひ◌゙; ) HIRAGANA LETTER BI +3074;3074;3072 309A;3074;3072 309A; # (ぴ; ぴ; ひ◌゚; ぴ; ひ◌゚; ) HIRAGANA LETTER PI +3076;3076;3075 3099;3076;3075 3099; # (ぶ; ぶ; ふ◌゙; ぶ; ふ◌゙; ) HIRAGANA LETTER BU +3077;3077;3075 309A;3077;3075 309A; # (ぷ; ぷ; ふ◌゚; ぷ; ふ◌゚; ) HIRAGANA LETTER PU +3079;3079;3078 3099;3079;3078 3099; # (べ; べ; へ◌゙; べ; へ◌゙; ) HIRAGANA LETTER BE +307A;307A;3078 309A;307A;3078 309A; # (ぺ; ぺ; へ◌゚; ぺ; へ◌゚; ) HIRAGANA LETTER PE +307C;307C;307B 3099;307C;307B 3099; # (ぼ; ぼ; ほ◌゙; ぼ; ほ◌゙; ) HIRAGANA LETTER BO +307D;307D;307B 309A;307D;307B 309A; # (ぽ; ぽ; ほ◌゚; ぽ; ほ◌゚; ) HIRAGANA LETTER PO +3094;3094;3046 3099;3094;3046 3099; # (ゔ; ゔ; う◌゙; ゔ; う◌゙; ) HIRAGANA LETTER VU +309B;309B;309B;0020 3099;0020 3099; # (゛; ゛; ゛; ◌゙; ◌゙; ) KATAKANA-HIRAGANA VOICED SOUND MARK +309C;309C;309C;0020 309A;0020 309A; # (゜; ゜; ゜; ◌゚; ◌゚; ) KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309E;309E;309D 3099;309E;309D 3099; # (ゞ; ゞ; ゝ◌゙; ゞ; ゝ◌゙; ) HIRAGANA VOICED ITERATION MARK +309F;309F;309F;3088 308A;3088 308A; # (ゟ; ゟ; ゟ; より; より; ) HIRAGANA DIGRAPH YORI +30AC;30AC;30AB 3099;30AC;30AB 3099; # (ガ; ガ; カ◌゙; ガ; カ◌゙; ) KATAKANA LETTER GA +30AE;30AE;30AD 3099;30AE;30AD 3099; # (ギ; ギ; キ◌゙; ギ; キ◌゙; ) KATAKANA LETTER GI +30B0;30B0;30AF 3099;30B0;30AF 3099; # (グ; グ; ク◌゙; グ; ク◌゙; ) KATAKANA LETTER GU +30B2;30B2;30B1 3099;30B2;30B1 3099; # (ゲ; ゲ; ケ◌゙; ゲ; ケ◌゙; ) KATAKANA LETTER GE +30B4;30B4;30B3 3099;30B4;30B3 3099; # (ゴ; ゴ; コ◌゙; ゴ; コ◌゙; ) KATAKANA LETTER GO +30B6;30B6;30B5 3099;30B6;30B5 3099; # (ザ; ザ; サ◌゙; ザ; サ◌゙; ) KATAKANA LETTER ZA +30B8;30B8;30B7 3099;30B8;30B7 3099; # (ジ; ジ; シ◌゙; ジ; シ◌゙; ) KATAKANA LETTER ZI +30BA;30BA;30B9 3099;30BA;30B9 3099; # (ズ; ズ; ス◌゙; ズ; ス◌゙; ) KATAKANA LETTER ZU +30BC;30BC;30BB 3099;30BC;30BB 3099; # (ゼ; ゼ; セ◌゙; ゼ; セ◌゙; ) KATAKANA LETTER ZE +30BE;30BE;30BD 3099;30BE;30BD 3099; # (ゾ; ゾ; ソ◌゙; ゾ; ソ◌゙; ) KATAKANA LETTER ZO +30C0;30C0;30BF 3099;30C0;30BF 3099; # (ダ; ダ; タ◌゙; ダ; タ◌゙; ) KATAKANA LETTER DA +30C2;30C2;30C1 3099;30C2;30C1 3099; # (ヂ; ヂ; チ◌゙; ヂ; チ◌゙; ) KATAKANA LETTER DI +30C5;30C5;30C4 3099;30C5;30C4 3099; # (ヅ; ヅ; ツ◌゙; ヅ; ツ◌゙; ) KATAKANA LETTER DU +30C7;30C7;30C6 3099;30C7;30C6 3099; # (デ; デ; テ◌゙; デ; テ◌゙; ) KATAKANA LETTER DE +30C9;30C9;30C8 3099;30C9;30C8 3099; # (ド; ド; ト◌゙; ド; ト◌゙; ) KATAKANA LETTER DO +30D0;30D0;30CF 3099;30D0;30CF 3099; # (バ; バ; ハ◌゙; バ; ハ◌゙; ) KATAKANA LETTER BA +30D1;30D1;30CF 309A;30D1;30CF 309A; # (パ; パ; ハ◌゚; パ; ハ◌゚; ) KATAKANA LETTER PA +30D3;30D3;30D2 3099;30D3;30D2 3099; # (ビ; ビ; ヒ◌゙; ビ; ヒ◌゙; ) KATAKANA LETTER BI +30D4;30D4;30D2 309A;30D4;30D2 309A; # (ピ; ピ; ヒ◌゚; ピ; ヒ◌゚; ) KATAKANA LETTER PI +30D6;30D6;30D5 3099;30D6;30D5 3099; # (ブ; ブ; フ◌゙; ブ; フ◌゙; ) KATAKANA LETTER BU +30D7;30D7;30D5 309A;30D7;30D5 309A; # (プ; プ; フ◌゚; プ; フ◌゚; ) KATAKANA LETTER PU +30D9;30D9;30D8 3099;30D9;30D8 3099; # (ベ; ベ; ヘ◌゙; ベ; ヘ◌゙; ) KATAKANA LETTER BE +30DA;30DA;30D8 309A;30DA;30D8 309A; # (ペ; ペ; ヘ◌゚; ペ; ヘ◌゚; ) KATAKANA LETTER PE +30DC;30DC;30DB 3099;30DC;30DB 3099; # (ボ; ボ; ホ◌゙; ボ; ホ◌゙; ) KATAKANA LETTER BO +30DD;30DD;30DB 309A;30DD;30DB 309A; # (ポ; ポ; ホ◌゚; ポ; ホ◌゚; ) KATAKANA LETTER PO +30F4;30F4;30A6 3099;30F4;30A6 3099; # (ヴ; ヴ; ウ◌゙; ヴ; ウ◌゙; ) KATAKANA LETTER VU +30F7;30F7;30EF 3099;30F7;30EF 3099; # (ヷ; ヷ; ワ◌゙; ヷ; ワ◌゙; ) KATAKANA LETTER VA +30F8;30F8;30F0 3099;30F8;30F0 3099; # (ヸ; ヸ; ヰ◌゙; ヸ; ヰ◌゙; ) KATAKANA LETTER VI +30F9;30F9;30F1 3099;30F9;30F1 3099; # (ヹ; ヹ; ヱ◌゙; ヹ; ヱ◌゙; ) KATAKANA LETTER VE +30FA;30FA;30F2 3099;30FA;30F2 3099; # (ヺ; ヺ; ヲ◌゙; ヺ; ヲ◌゙; ) KATAKANA LETTER VO +30FE;30FE;30FD 3099;30FE;30FD 3099; # (ヾ; ヾ; ヽ◌゙; ヾ; ヽ◌゙; ) KATAKANA VOICED ITERATION MARK +30FF;30FF;30FF;30B3 30C8;30B3 30C8; # (ヿ; ヿ; ヿ; コト; コト; ) KATAKANA DIGRAPH KOTO +3131;3131;3131;1100;1100; # (ㄱ; ㄱ; ㄱ; ᄀ; ᄀ; ) HANGUL LETTER KIYEOK +3132;3132;3132;1101;1101; # (ㄲ; ㄲ; ㄲ; ᄁ; ᄁ; ) HANGUL LETTER SSANGKIYEOK +3133;3133;3133;11AA;11AA; # (ㄳ; ㄳ; ㄳ; ᆪ; ᆪ; ) HANGUL LETTER KIYEOK-SIOS +3134;3134;3134;1102;1102; # (ㄴ; ㄴ; ㄴ; ᄂ; ᄂ; ) HANGUL LETTER NIEUN +3135;3135;3135;11AC;11AC; # (ㄵ; ㄵ; ㄵ; ᆬ; ᆬ; ) HANGUL LETTER NIEUN-CIEUC +3136;3136;3136;11AD;11AD; # (ㄶ; ㄶ; ㄶ; ᆭ; ᆭ; ) HANGUL LETTER NIEUN-HIEUH +3137;3137;3137;1103;1103; # (ㄷ; ㄷ; ㄷ; ᄃ; ᄃ; ) HANGUL LETTER TIKEUT +3138;3138;3138;1104;1104; # (ㄸ; ㄸ; ㄸ; ᄄ; ᄄ; ) HANGUL LETTER SSANGTIKEUT +3139;3139;3139;1105;1105; # (ㄹ; ㄹ; ㄹ; ᄅ; ᄅ; ) HANGUL LETTER RIEUL +313A;313A;313A;11B0;11B0; # (ㄺ; ㄺ; ㄺ; ᆰ; ᆰ; ) HANGUL LETTER RIEUL-KIYEOK +313B;313B;313B;11B1;11B1; # (ㄻ; ㄻ; ㄻ; ᆱ; ᆱ; ) HANGUL LETTER RIEUL-MIEUM +313C;313C;313C;11B2;11B2; # (ㄼ; ㄼ; ㄼ; ᆲ; ᆲ; ) HANGUL LETTER RIEUL-PIEUP +313D;313D;313D;11B3;11B3; # (ㄽ; ㄽ; ㄽ; ᆳ; ᆳ; ) HANGUL LETTER RIEUL-SIOS +313E;313E;313E;11B4;11B4; # (ㄾ; ㄾ; ㄾ; ᆴ; ᆴ; ) HANGUL LETTER RIEUL-THIEUTH +313F;313F;313F;11B5;11B5; # (ㄿ; ㄿ; ㄿ; ᆵ; ᆵ; ) HANGUL LETTER RIEUL-PHIEUPH +3140;3140;3140;111A;111A; # (ㅀ; ㅀ; ㅀ; ᄚ; ᄚ; ) HANGUL LETTER RIEUL-HIEUH +3141;3141;3141;1106;1106; # (ㅁ; ㅁ; ㅁ; ᄆ; ᄆ; ) HANGUL LETTER MIEUM +3142;3142;3142;1107;1107; # (ㅂ; ㅂ; ㅂ; ᄇ; ᄇ; ) HANGUL LETTER PIEUP +3143;3143;3143;1108;1108; # (ㅃ; ㅃ; ㅃ; ᄈ; ᄈ; ) HANGUL LETTER SSANGPIEUP +3144;3144;3144;1121;1121; # (ㅄ; ㅄ; ㅄ; ᄡ; ᄡ; ) HANGUL LETTER PIEUP-SIOS +3145;3145;3145;1109;1109; # (ㅅ; ㅅ; ㅅ; ᄉ; ᄉ; ) HANGUL LETTER SIOS +3146;3146;3146;110A;110A; # (ㅆ; ㅆ; ㅆ; ᄊ; ᄊ; ) HANGUL LETTER SSANGSIOS +3147;3147;3147;110B;110B; # (ㅇ; ㅇ; ㅇ; ᄋ; ᄋ; ) HANGUL LETTER IEUNG +3148;3148;3148;110C;110C; # (ㅈ; ㅈ; ㅈ; ᄌ; ᄌ; ) HANGUL LETTER CIEUC +3149;3149;3149;110D;110D; # (ㅉ; ㅉ; ㅉ; ᄍ; ᄍ; ) HANGUL LETTER SSANGCIEUC +314A;314A;314A;110E;110E; # (ㅊ; ㅊ; ㅊ; ᄎ; ᄎ; ) HANGUL LETTER CHIEUCH +314B;314B;314B;110F;110F; # (ㅋ; ㅋ; ㅋ; ᄏ; ᄏ; ) HANGUL LETTER KHIEUKH +314C;314C;314C;1110;1110; # (ㅌ; ㅌ; ㅌ; ᄐ; ᄐ; ) HANGUL LETTER THIEUTH +314D;314D;314D;1111;1111; # (ㅍ; ㅍ; ㅍ; ᄑ; ᄑ; ) HANGUL LETTER PHIEUPH +314E;314E;314E;1112;1112; # (ㅎ; ㅎ; ㅎ; ᄒ; ᄒ; ) HANGUL LETTER HIEUH +314F;314F;314F;1161;1161; # (ㅏ; ㅏ; ㅏ; ᅡ; ᅡ; ) HANGUL LETTER A +3150;3150;3150;1162;1162; # (ㅐ; ㅐ; ㅐ; ᅢ; ᅢ; ) HANGUL LETTER AE +3151;3151;3151;1163;1163; # (ㅑ; ㅑ; ㅑ; ᅣ; ᅣ; ) HANGUL LETTER YA +3152;3152;3152;1164;1164; # (ㅒ; ㅒ; ㅒ; ᅤ; ᅤ; ) HANGUL LETTER YAE +3153;3153;3153;1165;1165; # (ㅓ; ㅓ; ㅓ; ᅥ; ᅥ; ) HANGUL LETTER EO +3154;3154;3154;1166;1166; # (ㅔ; ㅔ; ㅔ; ᅦ; ᅦ; ) HANGUL LETTER E +3155;3155;3155;1167;1167; # (ㅕ; ㅕ; ㅕ; ᅧ; ᅧ; ) HANGUL LETTER YEO +3156;3156;3156;1168;1168; # (ㅖ; ㅖ; ㅖ; ᅨ; ᅨ; ) HANGUL LETTER YE +3157;3157;3157;1169;1169; # (ㅗ; ㅗ; ㅗ; ᅩ; ᅩ; ) HANGUL LETTER O +3158;3158;3158;116A;116A; # (ㅘ; ㅘ; ㅘ; ᅪ; ᅪ; ) HANGUL LETTER WA +3159;3159;3159;116B;116B; # (ㅙ; ㅙ; ㅙ; ᅫ; ᅫ; ) HANGUL LETTER WAE +315A;315A;315A;116C;116C; # (ㅚ; ㅚ; ㅚ; ᅬ; ᅬ; ) HANGUL LETTER OE +315B;315B;315B;116D;116D; # (ㅛ; ㅛ; ㅛ; ᅭ; ᅭ; ) HANGUL LETTER YO +315C;315C;315C;116E;116E; # (ㅜ; ㅜ; ㅜ; ᅮ; ᅮ; ) HANGUL LETTER U +315D;315D;315D;116F;116F; # (ㅝ; ㅝ; ㅝ; ᅯ; ᅯ; ) HANGUL LETTER WEO +315E;315E;315E;1170;1170; # (ㅞ; ㅞ; ㅞ; ᅰ; ᅰ; ) HANGUL LETTER WE +315F;315F;315F;1171;1171; # (ㅟ; ㅟ; ㅟ; ᅱ; ᅱ; ) HANGUL LETTER WI +3160;3160;3160;1172;1172; # (ㅠ; ㅠ; ㅠ; ᅲ; ᅲ; ) HANGUL LETTER YU +3161;3161;3161;1173;1173; # (ㅡ; ㅡ; ㅡ; ᅳ; ᅳ; ) HANGUL LETTER EU +3162;3162;3162;1174;1174; # (ㅢ; ㅢ; ㅢ; ᅴ; ᅴ; ) HANGUL LETTER YI +3163;3163;3163;1175;1175; # (ㅣ; ㅣ; ㅣ; ᅵ; ᅵ; ) HANGUL LETTER I +3164;3164;3164;1160;1160; # (ㅤ; ㅤ; ㅤ; ᅠ; ᅠ; ) HANGUL FILLER +3165;3165;3165;1114;1114; # (ㅥ; ㅥ; ㅥ; ᄔ; ᄔ; ) HANGUL LETTER SSANGNIEUN +3166;3166;3166;1115;1115; # (ㅦ; ㅦ; ㅦ; ᄕ; ᄕ; ) HANGUL LETTER NIEUN-TIKEUT +3167;3167;3167;11C7;11C7; # (ㅧ; ㅧ; ㅧ; ᇇ; ᇇ; ) HANGUL LETTER NIEUN-SIOS +3168;3168;3168;11C8;11C8; # (ㅨ; ㅨ; ㅨ; ᇈ; ᇈ; ) HANGUL LETTER NIEUN-PANSIOS +3169;3169;3169;11CC;11CC; # (ㅩ; ㅩ; ㅩ; ᇌ; ᇌ; ) HANGUL LETTER RIEUL-KIYEOK-SIOS +316A;316A;316A;11CE;11CE; # (ㅪ; ㅪ; ㅪ; ᇎ; ᇎ; ) HANGUL LETTER RIEUL-TIKEUT +316B;316B;316B;11D3;11D3; # (ㅫ; ㅫ; ㅫ; ᇓ; ᇓ; ) HANGUL LETTER RIEUL-PIEUP-SIOS +316C;316C;316C;11D7;11D7; # (ㅬ; ㅬ; ㅬ; ᇗ; ᇗ; ) HANGUL LETTER RIEUL-PANSIOS +316D;316D;316D;11D9;11D9; # (ㅭ; ㅭ; ㅭ; ᇙ; ᇙ; ) HANGUL LETTER RIEUL-YEORINHIEUH +316E;316E;316E;111C;111C; # (ㅮ; ㅮ; ㅮ; ᄜ; ᄜ; ) HANGUL LETTER MIEUM-PIEUP +316F;316F;316F;11DD;11DD; # (ㅯ; ㅯ; ㅯ; ᇝ; ᇝ; ) HANGUL LETTER MIEUM-SIOS +3170;3170;3170;11DF;11DF; # (ㅰ; ㅰ; ㅰ; ᇟ; ᇟ; ) HANGUL LETTER MIEUM-PANSIOS +3171;3171;3171;111D;111D; # (ㅱ; ㅱ; ㅱ; ᄝ; ᄝ; ) HANGUL LETTER KAPYEOUNMIEUM +3172;3172;3172;111E;111E; # (ㅲ; ㅲ; ㅲ; ᄞ; ᄞ; ) HANGUL LETTER PIEUP-KIYEOK +3173;3173;3173;1120;1120; # (ㅳ; ㅳ; ㅳ; ᄠ; ᄠ; ) HANGUL LETTER PIEUP-TIKEUT +3174;3174;3174;1122;1122; # (ㅴ; ㅴ; ㅴ; ᄢ; ᄢ; ) HANGUL LETTER PIEUP-SIOS-KIYEOK +3175;3175;3175;1123;1123; # (ㅵ; ㅵ; ㅵ; ᄣ; ᄣ; ) HANGUL LETTER PIEUP-SIOS-TIKEUT +3176;3176;3176;1127;1127; # (ㅶ; ㅶ; ㅶ; ᄧ; ᄧ; ) HANGUL LETTER PIEUP-CIEUC +3177;3177;3177;1129;1129; # (ㅷ; ㅷ; ㅷ; ᄩ; ᄩ; ) HANGUL LETTER PIEUP-THIEUTH +3178;3178;3178;112B;112B; # (ㅸ; ㅸ; ㅸ; ᄫ; ᄫ; ) HANGUL LETTER KAPYEOUNPIEUP +3179;3179;3179;112C;112C; # (ㅹ; ㅹ; ㅹ; ᄬ; ᄬ; ) HANGUL LETTER KAPYEOUNSSANGPIEUP +317A;317A;317A;112D;112D; # (ㅺ; ㅺ; ㅺ; ᄭ; ᄭ; ) HANGUL LETTER SIOS-KIYEOK +317B;317B;317B;112E;112E; # (ㅻ; ㅻ; ㅻ; ᄮ; ᄮ; ) HANGUL LETTER SIOS-NIEUN +317C;317C;317C;112F;112F; # (ㅼ; ㅼ; ㅼ; ᄯ; ᄯ; ) HANGUL LETTER SIOS-TIKEUT +317D;317D;317D;1132;1132; # (ㅽ; ㅽ; ㅽ; ᄲ; ᄲ; ) HANGUL LETTER SIOS-PIEUP +317E;317E;317E;1136;1136; # (ㅾ; ㅾ; ㅾ; ᄶ; ᄶ; ) HANGUL LETTER SIOS-CIEUC +317F;317F;317F;1140;1140; # (ㅿ; ㅿ; ㅿ; ᅀ; ᅀ; ) HANGUL LETTER PANSIOS +3180;3180;3180;1147;1147; # (ㆀ; ㆀ; ㆀ; ᅇ; ᅇ; ) HANGUL LETTER SSANGIEUNG +3181;3181;3181;114C;114C; # (ㆁ; ㆁ; ㆁ; ᅌ; ᅌ; ) HANGUL LETTER YESIEUNG +3182;3182;3182;11F1;11F1; # (ㆂ; ㆂ; ㆂ; ᇱ; ᇱ; ) HANGUL LETTER YESIEUNG-SIOS +3183;3183;3183;11F2;11F2; # (ㆃ; ㆃ; ㆃ; ᇲ; ᇲ; ) HANGUL LETTER YESIEUNG-PANSIOS +3184;3184;3184;1157;1157; # (ㆄ; ㆄ; ㆄ; ᅗ; ᅗ; ) HANGUL LETTER KAPYEOUNPHIEUPH +3185;3185;3185;1158;1158; # (ㆅ; ㆅ; ㆅ; ᅘ; ᅘ; ) HANGUL LETTER SSANGHIEUH +3186;3186;3186;1159;1159; # (ㆆ; ㆆ; ㆆ; ᅙ; ᅙ; ) HANGUL LETTER YEORINHIEUH +3187;3187;3187;1184;1184; # (ㆇ; ㆇ; ㆇ; ᆄ; ᆄ; ) HANGUL LETTER YO-YA +3188;3188;3188;1185;1185; # (ㆈ; ㆈ; ㆈ; ᆅ; ᆅ; ) HANGUL LETTER YO-YAE +3189;3189;3189;1188;1188; # (ㆉ; ㆉ; ㆉ; ᆈ; ᆈ; ) HANGUL LETTER YO-I +318A;318A;318A;1191;1191; # (ㆊ; ㆊ; ㆊ; ᆑ; ᆑ; ) HANGUL LETTER YU-YEO +318B;318B;318B;1192;1192; # (ㆋ; ㆋ; ㆋ; ᆒ; ᆒ; ) HANGUL LETTER YU-YE +318C;318C;318C;1194;1194; # (ㆌ; ㆌ; ㆌ; ᆔ; ᆔ; ) HANGUL LETTER YU-I +318D;318D;318D;119E;119E; # (ㆍ; ㆍ; ㆍ; ᆞ; ᆞ; ) HANGUL LETTER ARAEA +318E;318E;318E;11A1;11A1; # (ㆎ; ㆎ; ㆎ; ᆡ; ᆡ; ) HANGUL LETTER ARAEAE +3192;3192;3192;4E00;4E00; # (㆒; ㆒; ㆒; 一; 一; ) IDEOGRAPHIC ANNOTATION ONE MARK +3193;3193;3193;4E8C;4E8C; # (㆓; ㆓; ㆓; 二; 二; ) IDEOGRAPHIC ANNOTATION TWO MARK +3194;3194;3194;4E09;4E09; # (㆔; ㆔; ㆔; 三; 三; ) IDEOGRAPHIC ANNOTATION THREE MARK +3195;3195;3195;56DB;56DB; # (㆕; ㆕; ㆕; 四; 四; ) IDEOGRAPHIC ANNOTATION FOUR MARK +3196;3196;3196;4E0A;4E0A; # (㆖; ㆖; ㆖; 上; 上; ) IDEOGRAPHIC ANNOTATION TOP MARK +3197;3197;3197;4E2D;4E2D; # (㆗; ㆗; ㆗; 中; 中; ) IDEOGRAPHIC ANNOTATION MIDDLE MARK +3198;3198;3198;4E0B;4E0B; # (㆘; ㆘; ㆘; 下; 下; ) IDEOGRAPHIC ANNOTATION BOTTOM MARK +3199;3199;3199;7532;7532; # (㆙; ㆙; ㆙; 甲; 甲; ) IDEOGRAPHIC ANNOTATION FIRST MARK +319A;319A;319A;4E59;4E59; # (㆚; ㆚; ㆚; 乙; 乙; ) IDEOGRAPHIC ANNOTATION SECOND MARK +319B;319B;319B;4E19;4E19; # (㆛; ㆛; ㆛; 丙; 丙; ) IDEOGRAPHIC ANNOTATION THIRD MARK +319C;319C;319C;4E01;4E01; # (㆜; ㆜; ㆜; 丁; 丁; ) IDEOGRAPHIC ANNOTATION FOURTH MARK +319D;319D;319D;5929;5929; # (㆝; ㆝; ㆝; 天; 天; ) IDEOGRAPHIC ANNOTATION HEAVEN MARK +319E;319E;319E;5730;5730; # (㆞; ㆞; ㆞; 地; 地; ) IDEOGRAPHIC ANNOTATION EARTH MARK +319F;319F;319F;4EBA;4EBA; # (㆟; ㆟; ㆟; 人; 人; ) IDEOGRAPHIC ANNOTATION MAN MARK +3200;3200;3200;0028 1100 0029;0028 1100 0029; # (㈀; ㈀; ㈀; (ᄀ); (ᄀ); ) PARENTHESIZED HANGUL KIYEOK +3201;3201;3201;0028 1102 0029;0028 1102 0029; # (㈁; ㈁; ㈁; (ᄂ); (ᄂ); ) PARENTHESIZED HANGUL NIEUN +3202;3202;3202;0028 1103 0029;0028 1103 0029; # (㈂; ㈂; ㈂; (ᄃ); (ᄃ); ) PARENTHESIZED HANGUL TIKEUT +3203;3203;3203;0028 1105 0029;0028 1105 0029; # (㈃; ㈃; ㈃; (ᄅ); (ᄅ); ) PARENTHESIZED HANGUL RIEUL +3204;3204;3204;0028 1106 0029;0028 1106 0029; # (㈄; ㈄; ㈄; (ᄆ); (ᄆ); ) PARENTHESIZED HANGUL MIEUM +3205;3205;3205;0028 1107 0029;0028 1107 0029; # (㈅; ㈅; ㈅; (ᄇ); (ᄇ); ) PARENTHESIZED HANGUL PIEUP +3206;3206;3206;0028 1109 0029;0028 1109 0029; # (㈆; ㈆; ㈆; (ᄉ); (ᄉ); ) PARENTHESIZED HANGUL SIOS +3207;3207;3207;0028 110B 0029;0028 110B 0029; # (㈇; ㈇; ㈇; (ᄋ); (ᄋ); ) PARENTHESIZED HANGUL IEUNG +3208;3208;3208;0028 110C 0029;0028 110C 0029; # (㈈; ㈈; ㈈; (ᄌ); (ᄌ); ) PARENTHESIZED HANGUL CIEUC +3209;3209;3209;0028 110E 0029;0028 110E 0029; # (㈉; ㈉; ㈉; (ᄎ); (ᄎ); ) PARENTHESIZED HANGUL CHIEUCH +320A;320A;320A;0028 110F 0029;0028 110F 0029; # (㈊; ㈊; ㈊; (ᄏ); (ᄏ); ) PARENTHESIZED HANGUL KHIEUKH +320B;320B;320B;0028 1110 0029;0028 1110 0029; # (㈋; ㈋; ㈋; (ᄐ); (ᄐ); ) PARENTHESIZED HANGUL THIEUTH +320C;320C;320C;0028 1111 0029;0028 1111 0029; # (㈌; ㈌; ㈌; (ᄑ); (ᄑ); ) PARENTHESIZED HANGUL PHIEUPH +320D;320D;320D;0028 1112 0029;0028 1112 0029; # (㈍; ㈍; ㈍; (ᄒ); (ᄒ); ) PARENTHESIZED HANGUL HIEUH +320E;320E;320E;0028 AC00 0029;0028 1100 1161 0029; # (㈎; ㈎; ㈎; (가); (가); ) PARENTHESIZED HANGUL KIYEOK A +320F;320F;320F;0028 B098 0029;0028 1102 1161 0029; # (㈏; ㈏; ㈏; (나); (나); ) PARENTHESIZED HANGUL NIEUN A +3210;3210;3210;0028 B2E4 0029;0028 1103 1161 0029; # (㈐; ㈐; ㈐; (다); (다); ) PARENTHESIZED HANGUL TIKEUT A +3211;3211;3211;0028 B77C 0029;0028 1105 1161 0029; # (㈑; ㈑; ㈑; (라); (라); ) PARENTHESIZED HANGUL RIEUL A +3212;3212;3212;0028 B9C8 0029;0028 1106 1161 0029; # (㈒; ㈒; ㈒; (마); (마); ) PARENTHESIZED HANGUL MIEUM A +3213;3213;3213;0028 BC14 0029;0028 1107 1161 0029; # (㈓; ㈓; ㈓; (바); (바); ) PARENTHESIZED HANGUL PIEUP A +3214;3214;3214;0028 C0AC 0029;0028 1109 1161 0029; # (㈔; ㈔; ㈔; (사); (사); ) PARENTHESIZED HANGUL SIOS A +3215;3215;3215;0028 C544 0029;0028 110B 1161 0029; # (㈕; ㈕; ㈕; (아); (아); ) PARENTHESIZED HANGUL IEUNG A +3216;3216;3216;0028 C790 0029;0028 110C 1161 0029; # (㈖; ㈖; ㈖; (자); (자); ) PARENTHESIZED HANGUL CIEUC A +3217;3217;3217;0028 CC28 0029;0028 110E 1161 0029; # (㈗; ㈗; ㈗; (차); (차); ) PARENTHESIZED HANGUL CHIEUCH A +3218;3218;3218;0028 CE74 0029;0028 110F 1161 0029; # (㈘; ㈘; ㈘; (카); (카); ) PARENTHESIZED HANGUL KHIEUKH A +3219;3219;3219;0028 D0C0 0029;0028 1110 1161 0029; # (㈙; ㈙; ㈙; (타); (타); ) PARENTHESIZED HANGUL THIEUTH A +321A;321A;321A;0028 D30C 0029;0028 1111 1161 0029; # (㈚; ㈚; ㈚; (파); (파); ) PARENTHESIZED HANGUL PHIEUPH A +321B;321B;321B;0028 D558 0029;0028 1112 1161 0029; # (㈛; ㈛; ㈛; (하); (하); ) PARENTHESIZED HANGUL HIEUH A +321C;321C;321C;0028 C8FC 0029;0028 110C 116E 0029; # (㈜; ㈜; ㈜; (주); (주); ) PARENTHESIZED HANGUL CIEUC U +321D;321D;321D;0028 C624 C804 0029;0028 110B 1169 110C 1165 11AB 0029; # (㈝; ㈝; ㈝; (오전); (오전); ) PARENTHESIZED KOREAN CHARACTER OJEON +321E;321E;321E;0028 C624 D6C4 0029;0028 110B 1169 1112 116E 0029; # (㈞; ㈞; ㈞; (오후); (오후); ) PARENTHESIZED KOREAN CHARACTER O HU +3220;3220;3220;0028 4E00 0029;0028 4E00 0029; # (㈠; ㈠; ㈠; (一); (一); ) PARENTHESIZED IDEOGRAPH ONE +3221;3221;3221;0028 4E8C 0029;0028 4E8C 0029; # (㈡; ㈡; ㈡; (二); (二); ) PARENTHESIZED IDEOGRAPH TWO +3222;3222;3222;0028 4E09 0029;0028 4E09 0029; # (㈢; ㈢; ㈢; (三); (三); ) PARENTHESIZED IDEOGRAPH THREE +3223;3223;3223;0028 56DB 0029;0028 56DB 0029; # (㈣; ㈣; ㈣; (四); (四); ) PARENTHESIZED IDEOGRAPH FOUR +3224;3224;3224;0028 4E94 0029;0028 4E94 0029; # (㈤; ㈤; ㈤; (五); (五); ) PARENTHESIZED IDEOGRAPH FIVE +3225;3225;3225;0028 516D 0029;0028 516D 0029; # (㈥; ㈥; ㈥; (六); (六); ) PARENTHESIZED IDEOGRAPH SIX +3226;3226;3226;0028 4E03 0029;0028 4E03 0029; # (㈦; ㈦; ㈦; (七); (七); ) PARENTHESIZED IDEOGRAPH SEVEN +3227;3227;3227;0028 516B 0029;0028 516B 0029; # (㈧; ㈧; ㈧; (八); (八); ) PARENTHESIZED IDEOGRAPH EIGHT +3228;3228;3228;0028 4E5D 0029;0028 4E5D 0029; # (㈨; ㈨; ㈨; (九); (九); ) PARENTHESIZED IDEOGRAPH NINE +3229;3229;3229;0028 5341 0029;0028 5341 0029; # (㈩; ㈩; ㈩; (十); (十); ) PARENTHESIZED IDEOGRAPH TEN +322A;322A;322A;0028 6708 0029;0028 6708 0029; # (㈪; ㈪; ㈪; (月); (月); ) PARENTHESIZED IDEOGRAPH MOON +322B;322B;322B;0028 706B 0029;0028 706B 0029; # (㈫; ㈫; ㈫; (火); (火); ) PARENTHESIZED IDEOGRAPH FIRE +322C;322C;322C;0028 6C34 0029;0028 6C34 0029; # (㈬; ㈬; ㈬; (水); (水); ) PARENTHESIZED IDEOGRAPH WATER +322D;322D;322D;0028 6728 0029;0028 6728 0029; # (㈭; ㈭; ㈭; (木); (木); ) PARENTHESIZED IDEOGRAPH WOOD +322E;322E;322E;0028 91D1 0029;0028 91D1 0029; # (㈮; ㈮; ㈮; (金); (金); ) PARENTHESIZED IDEOGRAPH METAL +322F;322F;322F;0028 571F 0029;0028 571F 0029; # (㈯; ㈯; ㈯; (土); (土); ) PARENTHESIZED IDEOGRAPH EARTH +3230;3230;3230;0028 65E5 0029;0028 65E5 0029; # (㈰; ㈰; ㈰; (日); (日); ) PARENTHESIZED IDEOGRAPH SUN +3231;3231;3231;0028 682A 0029;0028 682A 0029; # (㈱; ㈱; ㈱; (株); (株); ) PARENTHESIZED IDEOGRAPH STOCK +3232;3232;3232;0028 6709 0029;0028 6709 0029; # (㈲; ㈲; ㈲; (有); (有); ) PARENTHESIZED IDEOGRAPH HAVE +3233;3233;3233;0028 793E 0029;0028 793E 0029; # (㈳; ㈳; ㈳; (社); (社); ) PARENTHESIZED IDEOGRAPH SOCIETY +3234;3234;3234;0028 540D 0029;0028 540D 0029; # (㈴; ㈴; ㈴; (名); (名); ) PARENTHESIZED IDEOGRAPH NAME +3235;3235;3235;0028 7279 0029;0028 7279 0029; # (㈵; ㈵; ㈵; (特); (特); ) PARENTHESIZED IDEOGRAPH SPECIAL +3236;3236;3236;0028 8CA1 0029;0028 8CA1 0029; # (㈶; ㈶; ㈶; (財); (財); ) PARENTHESIZED IDEOGRAPH FINANCIAL +3237;3237;3237;0028 795D 0029;0028 795D 0029; # (㈷; ㈷; ㈷; (祝); (祝); ) PARENTHESIZED IDEOGRAPH CONGRATULATION +3238;3238;3238;0028 52B4 0029;0028 52B4 0029; # (㈸; ㈸; ㈸; (労); (労); ) PARENTHESIZED IDEOGRAPH LABOR +3239;3239;3239;0028 4EE3 0029;0028 4EE3 0029; # (㈹; ㈹; ㈹; (代); (代); ) PARENTHESIZED IDEOGRAPH REPRESENT +323A;323A;323A;0028 547C 0029;0028 547C 0029; # (㈺; ㈺; ㈺; (呼); (呼); ) PARENTHESIZED IDEOGRAPH CALL +323B;323B;323B;0028 5B66 0029;0028 5B66 0029; # (㈻; ㈻; ㈻; (学); (学); ) PARENTHESIZED IDEOGRAPH STUDY +323C;323C;323C;0028 76E3 0029;0028 76E3 0029; # (㈼; ㈼; ㈼; (監); (監); ) PARENTHESIZED IDEOGRAPH SUPERVISE +323D;323D;323D;0028 4F01 0029;0028 4F01 0029; # (㈽; ㈽; ㈽; (企); (企); ) PARENTHESIZED IDEOGRAPH ENTERPRISE +323E;323E;323E;0028 8CC7 0029;0028 8CC7 0029; # (㈾; ㈾; ㈾; (資); (資); ) PARENTHESIZED IDEOGRAPH RESOURCE +323F;323F;323F;0028 5354 0029;0028 5354 0029; # (㈿; ㈿; ㈿; (協); (協); ) PARENTHESIZED IDEOGRAPH ALLIANCE +3240;3240;3240;0028 796D 0029;0028 796D 0029; # (㉀; ㉀; ㉀; (祭); (祭); ) PARENTHESIZED IDEOGRAPH FESTIVAL +3241;3241;3241;0028 4F11 0029;0028 4F11 0029; # (㉁; ㉁; ㉁; (休); (休); ) PARENTHESIZED IDEOGRAPH REST +3242;3242;3242;0028 81EA 0029;0028 81EA 0029; # (㉂; ㉂; ㉂; (自); (自); ) PARENTHESIZED IDEOGRAPH SELF +3243;3243;3243;0028 81F3 0029;0028 81F3 0029; # (㉃; ㉃; ㉃; (至); (至); ) PARENTHESIZED IDEOGRAPH REACH +3244;3244;3244;554F;554F; # (㉄; ㉄; ㉄; 問; 問; ) CIRCLED IDEOGRAPH QUESTION +3245;3245;3245;5E7C;5E7C; # (㉅; ㉅; ㉅; 幼; 幼; ) CIRCLED IDEOGRAPH KINDERGARTEN +3246;3246;3246;6587;6587; # (㉆; ㉆; ㉆; 文; 文; ) CIRCLED IDEOGRAPH SCHOOL +3247;3247;3247;7B8F;7B8F; # (㉇; ㉇; ㉇; 箏; 箏; ) CIRCLED IDEOGRAPH KOTO +3250;3250;3250;0050 0054 0045;0050 0054 0045; # (㉐; ㉐; ㉐; PTE; PTE; ) PARTNERSHIP SIGN +3251;3251;3251;0032 0031;0032 0031; # (㉑; ㉑; ㉑; 21; 21; ) CIRCLED NUMBER TWENTY ONE +3252;3252;3252;0032 0032;0032 0032; # (㉒; ㉒; ㉒; 22; 22; ) CIRCLED NUMBER TWENTY TWO +3253;3253;3253;0032 0033;0032 0033; # (㉓; ㉓; ㉓; 23; 23; ) CIRCLED NUMBER TWENTY THREE +3254;3254;3254;0032 0034;0032 0034; # (㉔; ㉔; ㉔; 24; 24; ) CIRCLED NUMBER TWENTY FOUR +3255;3255;3255;0032 0035;0032 0035; # (㉕; ㉕; ㉕; 25; 25; ) CIRCLED NUMBER TWENTY FIVE +3256;3256;3256;0032 0036;0032 0036; # (㉖; ㉖; ㉖; 26; 26; ) CIRCLED NUMBER TWENTY SIX +3257;3257;3257;0032 0037;0032 0037; # (㉗; ㉗; ㉗; 27; 27; ) CIRCLED NUMBER TWENTY SEVEN +3258;3258;3258;0032 0038;0032 0038; # (㉘; ㉘; ㉘; 28; 28; ) CIRCLED NUMBER TWENTY EIGHT +3259;3259;3259;0032 0039;0032 0039; # (㉙; ㉙; ㉙; 29; 29; ) CIRCLED NUMBER TWENTY NINE +325A;325A;325A;0033 0030;0033 0030; # (㉚; ㉚; ㉚; 30; 30; ) CIRCLED NUMBER THIRTY +325B;325B;325B;0033 0031;0033 0031; # (㉛; ㉛; ㉛; 31; 31; ) CIRCLED NUMBER THIRTY ONE +325C;325C;325C;0033 0032;0033 0032; # (㉜; ㉜; ㉜; 32; 32; ) CIRCLED NUMBER THIRTY TWO +325D;325D;325D;0033 0033;0033 0033; # (㉝; ㉝; ㉝; 33; 33; ) CIRCLED NUMBER THIRTY THREE +325E;325E;325E;0033 0034;0033 0034; # (㉞; ㉞; ㉞; 34; 34; ) CIRCLED NUMBER THIRTY FOUR +325F;325F;325F;0033 0035;0033 0035; # (㉟; ㉟; ㉟; 35; 35; ) CIRCLED NUMBER THIRTY FIVE +3260;3260;3260;1100;1100; # (㉠; ㉠; ㉠; ᄀ; ᄀ; ) CIRCLED HANGUL KIYEOK +3261;3261;3261;1102;1102; # (㉡; ㉡; ㉡; ᄂ; ᄂ; ) CIRCLED HANGUL NIEUN +3262;3262;3262;1103;1103; # (㉢; ㉢; ㉢; ᄃ; ᄃ; ) CIRCLED HANGUL TIKEUT +3263;3263;3263;1105;1105; # (㉣; ㉣; ㉣; ᄅ; ᄅ; ) CIRCLED HANGUL RIEUL +3264;3264;3264;1106;1106; # (㉤; ㉤; ㉤; ᄆ; ᄆ; ) CIRCLED HANGUL MIEUM +3265;3265;3265;1107;1107; # (㉥; ㉥; ㉥; ᄇ; ᄇ; ) CIRCLED HANGUL PIEUP +3266;3266;3266;1109;1109; # (㉦; ㉦; ㉦; ᄉ; ᄉ; ) CIRCLED HANGUL SIOS +3267;3267;3267;110B;110B; # (㉧; ㉧; ㉧; ᄋ; ᄋ; ) CIRCLED HANGUL IEUNG +3268;3268;3268;110C;110C; # (㉨; ㉨; ㉨; ᄌ; ᄌ; ) CIRCLED HANGUL CIEUC +3269;3269;3269;110E;110E; # (㉩; ㉩; ㉩; ᄎ; ᄎ; ) CIRCLED HANGUL CHIEUCH +326A;326A;326A;110F;110F; # (㉪; ㉪; ㉪; ᄏ; ᄏ; ) CIRCLED HANGUL KHIEUKH +326B;326B;326B;1110;1110; # (㉫; ㉫; ㉫; ᄐ; ᄐ; ) CIRCLED HANGUL THIEUTH +326C;326C;326C;1111;1111; # (㉬; ㉬; ㉬; ᄑ; ᄑ; ) CIRCLED HANGUL PHIEUPH +326D;326D;326D;1112;1112; # (㉭; ㉭; ㉭; ᄒ; ᄒ; ) CIRCLED HANGUL HIEUH +326E;326E;326E;AC00;1100 1161; # (㉮; ㉮; ㉮; 가; 가; ) CIRCLED HANGUL KIYEOK A +326F;326F;326F;B098;1102 1161; # (㉯; ㉯; ㉯; 나; 나; ) CIRCLED HANGUL NIEUN A +3270;3270;3270;B2E4;1103 1161; # (㉰; ㉰; ㉰; 다; 다; ) CIRCLED HANGUL TIKEUT A +3271;3271;3271;B77C;1105 1161; # (㉱; ㉱; ㉱; 라; 라; ) CIRCLED HANGUL RIEUL A +3272;3272;3272;B9C8;1106 1161; # (㉲; ㉲; ㉲; 마; 마; ) CIRCLED HANGUL MIEUM A +3273;3273;3273;BC14;1107 1161; # (㉳; ㉳; ㉳; 바; 바; ) CIRCLED HANGUL PIEUP A +3274;3274;3274;C0AC;1109 1161; # (㉴; ㉴; ㉴; 사; 사; ) CIRCLED HANGUL SIOS A +3275;3275;3275;C544;110B 1161; # (㉵; ㉵; ㉵; 아; 아; ) CIRCLED HANGUL IEUNG A +3276;3276;3276;C790;110C 1161; # (㉶; ㉶; ㉶; 자; 자; ) CIRCLED HANGUL CIEUC A +3277;3277;3277;CC28;110E 1161; # (㉷; ㉷; ㉷; 차; 차; ) CIRCLED HANGUL CHIEUCH A +3278;3278;3278;CE74;110F 1161; # (㉸; ㉸; ㉸; 카; 카; ) CIRCLED HANGUL KHIEUKH A +3279;3279;3279;D0C0;1110 1161; # (㉹; ㉹; ㉹; 타; 타; ) CIRCLED HANGUL THIEUTH A +327A;327A;327A;D30C;1111 1161; # (㉺; ㉺; ㉺; 파; 파; ) CIRCLED HANGUL PHIEUPH A +327B;327B;327B;D558;1112 1161; # (㉻; ㉻; ㉻; 하; 하; ) CIRCLED HANGUL HIEUH A +327C;327C;327C;CC38 ACE0;110E 1161 11B7 1100 1169; # (㉼; ㉼; ㉼; 참고; 참고; ) CIRCLED KOREAN CHARACTER CHAMKO +327D;327D;327D;C8FC C758;110C 116E 110B 1174; # (㉽; ㉽; ㉽; 주의; 주의; ) CIRCLED KOREAN CHARACTER JUEUI +327E;327E;327E;C6B0;110B 116E; # (㉾; ㉾; ㉾; 우; 우; ) CIRCLED HANGUL IEUNG U +3280;3280;3280;4E00;4E00; # (㊀; ㊀; ㊀; 一; 一; ) CIRCLED IDEOGRAPH ONE +3281;3281;3281;4E8C;4E8C; # (㊁; ㊁; ㊁; 二; 二; ) CIRCLED IDEOGRAPH TWO +3282;3282;3282;4E09;4E09; # (㊂; ㊂; ㊂; 三; 三; ) CIRCLED IDEOGRAPH THREE +3283;3283;3283;56DB;56DB; # (㊃; ㊃; ㊃; 四; 四; ) CIRCLED IDEOGRAPH FOUR +3284;3284;3284;4E94;4E94; # (㊄; ㊄; ㊄; 五; 五; ) CIRCLED IDEOGRAPH FIVE +3285;3285;3285;516D;516D; # (㊅; ㊅; ㊅; 六; 六; ) CIRCLED IDEOGRAPH SIX +3286;3286;3286;4E03;4E03; # (㊆; ㊆; ㊆; 七; 七; ) CIRCLED IDEOGRAPH SEVEN +3287;3287;3287;516B;516B; # (㊇; ㊇; ㊇; 八; 八; ) CIRCLED IDEOGRAPH EIGHT +3288;3288;3288;4E5D;4E5D; # (㊈; ㊈; ㊈; 九; 九; ) CIRCLED IDEOGRAPH NINE +3289;3289;3289;5341;5341; # (㊉; ㊉; ㊉; 十; 十; ) CIRCLED IDEOGRAPH TEN +328A;328A;328A;6708;6708; # (㊊; ㊊; ㊊; 月; 月; ) CIRCLED IDEOGRAPH MOON +328B;328B;328B;706B;706B; # (㊋; ㊋; ㊋; 火; 火; ) CIRCLED IDEOGRAPH FIRE +328C;328C;328C;6C34;6C34; # (㊌; ㊌; ㊌; 水; 水; ) CIRCLED IDEOGRAPH WATER +328D;328D;328D;6728;6728; # (㊍; ㊍; ㊍; 木; 木; ) CIRCLED IDEOGRAPH WOOD +328E;328E;328E;91D1;91D1; # (㊎; ㊎; ㊎; 金; 金; ) CIRCLED IDEOGRAPH METAL +328F;328F;328F;571F;571F; # (㊏; ㊏; ㊏; 土; 土; ) CIRCLED IDEOGRAPH EARTH +3290;3290;3290;65E5;65E5; # (㊐; ㊐; ㊐; 日; 日; ) CIRCLED IDEOGRAPH SUN +3291;3291;3291;682A;682A; # (㊑; ㊑; ㊑; 株; 株; ) CIRCLED IDEOGRAPH STOCK +3292;3292;3292;6709;6709; # (㊒; ㊒; ㊒; 有; 有; ) CIRCLED IDEOGRAPH HAVE +3293;3293;3293;793E;793E; # (㊓; ㊓; ㊓; 社; 社; ) CIRCLED IDEOGRAPH SOCIETY +3294;3294;3294;540D;540D; # (㊔; ㊔; ㊔; 名; 名; ) CIRCLED IDEOGRAPH NAME +3295;3295;3295;7279;7279; # (㊕; ㊕; ㊕; 特; 特; ) CIRCLED IDEOGRAPH SPECIAL +3296;3296;3296;8CA1;8CA1; # (㊖; ㊖; ㊖; 財; 財; ) CIRCLED IDEOGRAPH FINANCIAL +3297;3297;3297;795D;795D; # (㊗; ㊗; ㊗; 祝; 祝; ) CIRCLED IDEOGRAPH CONGRATULATION +3298;3298;3298;52B4;52B4; # (㊘; ㊘; ㊘; 労; 労; ) CIRCLED IDEOGRAPH LABOR +3299;3299;3299;79D8;79D8; # (㊙; ㊙; ㊙; 秘; 秘; ) CIRCLED IDEOGRAPH SECRET +329A;329A;329A;7537;7537; # (㊚; ㊚; ㊚; 男; 男; ) CIRCLED IDEOGRAPH MALE +329B;329B;329B;5973;5973; # (㊛; ㊛; ㊛; 女; 女; ) CIRCLED IDEOGRAPH FEMALE +329C;329C;329C;9069;9069; # (㊜; ㊜; ㊜; 適; 適; ) CIRCLED IDEOGRAPH SUITABLE +329D;329D;329D;512A;512A; # (㊝; ㊝; ㊝; 優; 優; ) CIRCLED IDEOGRAPH EXCELLENT +329E;329E;329E;5370;5370; # (㊞; ㊞; ㊞; 印; 印; ) CIRCLED IDEOGRAPH PRINT +329F;329F;329F;6CE8;6CE8; # (㊟; ㊟; ㊟; 注; 注; ) CIRCLED IDEOGRAPH ATTENTION +32A0;32A0;32A0;9805;9805; # (㊠; ㊠; ㊠; 項; 項; ) CIRCLED IDEOGRAPH ITEM +32A1;32A1;32A1;4F11;4F11; # (㊡; ㊡; ㊡; 休; 休; ) CIRCLED IDEOGRAPH REST +32A2;32A2;32A2;5199;5199; # (㊢; ㊢; ㊢; 写; 写; ) CIRCLED IDEOGRAPH COPY +32A3;32A3;32A3;6B63;6B63; # (㊣; ㊣; ㊣; 正; 正; ) CIRCLED IDEOGRAPH CORRECT +32A4;32A4;32A4;4E0A;4E0A; # (㊤; ㊤; ㊤; 上; 上; ) CIRCLED IDEOGRAPH HIGH +32A5;32A5;32A5;4E2D;4E2D; # (㊥; ㊥; ㊥; 中; 中; ) CIRCLED IDEOGRAPH CENTRE +32A6;32A6;32A6;4E0B;4E0B; # (㊦; ㊦; ㊦; 下; 下; ) CIRCLED IDEOGRAPH LOW +32A7;32A7;32A7;5DE6;5DE6; # (㊧; ㊧; ㊧; 左; 左; ) CIRCLED IDEOGRAPH LEFT +32A8;32A8;32A8;53F3;53F3; # (㊨; ㊨; ㊨; 右; 右; ) CIRCLED IDEOGRAPH RIGHT +32A9;32A9;32A9;533B;533B; # (㊩; ㊩; ㊩; 医; 医; ) CIRCLED IDEOGRAPH MEDICINE +32AA;32AA;32AA;5B97;5B97; # (㊪; ㊪; ㊪; 宗; 宗; ) CIRCLED IDEOGRAPH RELIGION +32AB;32AB;32AB;5B66;5B66; # (㊫; ㊫; ㊫; 学; 学; ) CIRCLED IDEOGRAPH STUDY +32AC;32AC;32AC;76E3;76E3; # (㊬; ㊬; ㊬; 監; 監; ) CIRCLED IDEOGRAPH SUPERVISE +32AD;32AD;32AD;4F01;4F01; # (㊭; ㊭; ㊭; 企; 企; ) CIRCLED IDEOGRAPH ENTERPRISE +32AE;32AE;32AE;8CC7;8CC7; # (㊮; ㊮; ㊮; 資; 資; ) CIRCLED IDEOGRAPH RESOURCE +32AF;32AF;32AF;5354;5354; # (㊯; ㊯; ㊯; 協; 協; ) CIRCLED IDEOGRAPH ALLIANCE +32B0;32B0;32B0;591C;591C; # (㊰; ㊰; ㊰; 夜; 夜; ) CIRCLED IDEOGRAPH NIGHT +32B1;32B1;32B1;0033 0036;0033 0036; # (㊱; ㊱; ㊱; 36; 36; ) CIRCLED NUMBER THIRTY SIX +32B2;32B2;32B2;0033 0037;0033 0037; # (㊲; ㊲; ㊲; 37; 37; ) CIRCLED NUMBER THIRTY SEVEN +32B3;32B3;32B3;0033 0038;0033 0038; # (㊳; ㊳; ㊳; 38; 38; ) CIRCLED NUMBER THIRTY EIGHT +32B4;32B4;32B4;0033 0039;0033 0039; # (㊴; ㊴; ㊴; 39; 39; ) CIRCLED NUMBER THIRTY NINE +32B5;32B5;32B5;0034 0030;0034 0030; # (㊵; ㊵; ㊵; 40; 40; ) CIRCLED NUMBER FORTY +32B6;32B6;32B6;0034 0031;0034 0031; # (㊶; ㊶; ㊶; 41; 41; ) CIRCLED NUMBER FORTY ONE +32B7;32B7;32B7;0034 0032;0034 0032; # (㊷; ㊷; ㊷; 42; 42; ) CIRCLED NUMBER FORTY TWO +32B8;32B8;32B8;0034 0033;0034 0033; # (㊸; ㊸; ㊸; 43; 43; ) CIRCLED NUMBER FORTY THREE +32B9;32B9;32B9;0034 0034;0034 0034; # (㊹; ㊹; ㊹; 44; 44; ) CIRCLED NUMBER FORTY FOUR +32BA;32BA;32BA;0034 0035;0034 0035; # (㊺; ㊺; ㊺; 45; 45; ) CIRCLED NUMBER FORTY FIVE +32BB;32BB;32BB;0034 0036;0034 0036; # (㊻; ㊻; ㊻; 46; 46; ) CIRCLED NUMBER FORTY SIX +32BC;32BC;32BC;0034 0037;0034 0037; # (㊼; ㊼; ㊼; 47; 47; ) CIRCLED NUMBER FORTY SEVEN +32BD;32BD;32BD;0034 0038;0034 0038; # (㊽; ㊽; ㊽; 48; 48; ) CIRCLED NUMBER FORTY EIGHT +32BE;32BE;32BE;0034 0039;0034 0039; # (㊾; ㊾; ㊾; 49; 49; ) CIRCLED NUMBER FORTY NINE +32BF;32BF;32BF;0035 0030;0035 0030; # (㊿; ㊿; ㊿; 50; 50; ) CIRCLED NUMBER FIFTY +32C0;32C0;32C0;0031 6708;0031 6708; # (㋀; ㋀; ㋀; 1月; 1月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY +32C1;32C1;32C1;0032 6708;0032 6708; # (㋁; ㋁; ㋁; 2月; 2月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY +32C2;32C2;32C2;0033 6708;0033 6708; # (㋂; ㋂; ㋂; 3月; 3月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH +32C3;32C3;32C3;0034 6708;0034 6708; # (㋃; ㋃; ㋃; 4月; 4月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL +32C4;32C4;32C4;0035 6708;0035 6708; # (㋄; ㋄; ㋄; 5月; 5月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY +32C5;32C5;32C5;0036 6708;0036 6708; # (㋅; ㋅; ㋅; 6月; 6月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE +32C6;32C6;32C6;0037 6708;0037 6708; # (㋆; ㋆; ㋆; 7月; 7月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY +32C7;32C7;32C7;0038 6708;0038 6708; # (㋇; ㋇; ㋇; 8月; 8月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST +32C8;32C8;32C8;0039 6708;0039 6708; # (㋈; ㋈; ㋈; 9月; 9月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER +32C9;32C9;32C9;0031 0030 6708;0031 0030 6708; # (㋉; ㋉; ㋉; 10月; 10月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER +32CA;32CA;32CA;0031 0031 6708;0031 0031 6708; # (㋊; ㋊; ㋊; 11月; 11月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER +32CB;32CB;32CB;0031 0032 6708;0031 0032 6708; # (㋋; ㋋; ㋋; 12月; 12月; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +32CC;32CC;32CC;0048 0067;0048 0067; # (㋌; ㋌; ㋌; Hg; Hg; ) SQUARE HG +32CD;32CD;32CD;0065 0072 0067;0065 0072 0067; # (㋍; ㋍; ㋍; erg; erg; ) SQUARE ERG +32CE;32CE;32CE;0065 0056;0065 0056; # (㋎; ㋎; ㋎; eV; eV; ) SQUARE EV +32CF;32CF;32CF;004C 0054 0044;004C 0054 0044; # (㋏; ㋏; ㋏; LTD; LTD; ) LIMITED LIABILITY SIGN +32D0;32D0;32D0;30A2;30A2; # (㋐; ㋐; ㋐; ア; ア; ) CIRCLED KATAKANA A +32D1;32D1;32D1;30A4;30A4; # (㋑; ㋑; ㋑; イ; イ; ) CIRCLED KATAKANA I +32D2;32D2;32D2;30A6;30A6; # (㋒; ㋒; ㋒; ウ; ウ; ) CIRCLED KATAKANA U +32D3;32D3;32D3;30A8;30A8; # (㋓; ㋓; ㋓; エ; エ; ) CIRCLED KATAKANA E +32D4;32D4;32D4;30AA;30AA; # (㋔; ㋔; ㋔; オ; オ; ) CIRCLED KATAKANA O +32D5;32D5;32D5;30AB;30AB; # (㋕; ㋕; ㋕; カ; カ; ) CIRCLED KATAKANA KA +32D6;32D6;32D6;30AD;30AD; # (㋖; ㋖; ㋖; キ; キ; ) CIRCLED KATAKANA KI +32D7;32D7;32D7;30AF;30AF; # (㋗; ㋗; ㋗; ク; ク; ) CIRCLED KATAKANA KU +32D8;32D8;32D8;30B1;30B1; # (㋘; ㋘; ㋘; ケ; ケ; ) CIRCLED KATAKANA KE +32D9;32D9;32D9;30B3;30B3; # (㋙; ㋙; ㋙; コ; コ; ) CIRCLED KATAKANA KO +32DA;32DA;32DA;30B5;30B5; # (㋚; ㋚; ㋚; サ; サ; ) CIRCLED KATAKANA SA +32DB;32DB;32DB;30B7;30B7; # (㋛; ㋛; ㋛; シ; シ; ) CIRCLED KATAKANA SI +32DC;32DC;32DC;30B9;30B9; # (㋜; ㋜; ㋜; ス; ス; ) CIRCLED KATAKANA SU +32DD;32DD;32DD;30BB;30BB; # (㋝; ㋝; ㋝; セ; セ; ) CIRCLED KATAKANA SE +32DE;32DE;32DE;30BD;30BD; # (㋞; ㋞; ㋞; ソ; ソ; ) CIRCLED KATAKANA SO +32DF;32DF;32DF;30BF;30BF; # (㋟; ㋟; ㋟; タ; タ; ) CIRCLED KATAKANA TA +32E0;32E0;32E0;30C1;30C1; # (㋠; ㋠; ㋠; チ; チ; ) CIRCLED KATAKANA TI +32E1;32E1;32E1;30C4;30C4; # (㋡; ㋡; ㋡; ツ; ツ; ) CIRCLED KATAKANA TU +32E2;32E2;32E2;30C6;30C6; # (㋢; ㋢; ㋢; テ; テ; ) CIRCLED KATAKANA TE +32E3;32E3;32E3;30C8;30C8; # (㋣; ㋣; ㋣; ト; ト; ) CIRCLED KATAKANA TO +32E4;32E4;32E4;30CA;30CA; # (㋤; ㋤; ㋤; ナ; ナ; ) CIRCLED KATAKANA NA +32E5;32E5;32E5;30CB;30CB; # (㋥; ㋥; ㋥; ニ; ニ; ) CIRCLED KATAKANA NI +32E6;32E6;32E6;30CC;30CC; # (㋦; ㋦; ㋦; ヌ; ヌ; ) CIRCLED KATAKANA NU +32E7;32E7;32E7;30CD;30CD; # (㋧; ㋧; ㋧; ネ; ネ; ) CIRCLED KATAKANA NE +32E8;32E8;32E8;30CE;30CE; # (㋨; ㋨; ㋨; ノ; ノ; ) CIRCLED KATAKANA NO +32E9;32E9;32E9;30CF;30CF; # (㋩; ㋩; ㋩; ハ; ハ; ) CIRCLED KATAKANA HA +32EA;32EA;32EA;30D2;30D2; # (㋪; ㋪; ㋪; ヒ; ヒ; ) CIRCLED KATAKANA HI +32EB;32EB;32EB;30D5;30D5; # (㋫; ㋫; ㋫; フ; フ; ) CIRCLED KATAKANA HU +32EC;32EC;32EC;30D8;30D8; # (㋬; ㋬; ㋬; ヘ; ヘ; ) CIRCLED KATAKANA HE +32ED;32ED;32ED;30DB;30DB; # (㋭; ㋭; ㋭; ホ; ホ; ) CIRCLED KATAKANA HO +32EE;32EE;32EE;30DE;30DE; # (㋮; ㋮; ㋮; マ; マ; ) CIRCLED KATAKANA MA +32EF;32EF;32EF;30DF;30DF; # (㋯; ㋯; ㋯; ミ; ミ; ) CIRCLED KATAKANA MI +32F0;32F0;32F0;30E0;30E0; # (㋰; ㋰; ㋰; ム; ム; ) CIRCLED KATAKANA MU +32F1;32F1;32F1;30E1;30E1; # (㋱; ㋱; ㋱; メ; メ; ) CIRCLED KATAKANA ME +32F2;32F2;32F2;30E2;30E2; # (㋲; ㋲; ㋲; モ; モ; ) CIRCLED KATAKANA MO +32F3;32F3;32F3;30E4;30E4; # (㋳; ㋳; ㋳; ヤ; ヤ; ) CIRCLED KATAKANA YA +32F4;32F4;32F4;30E6;30E6; # (㋴; ㋴; ㋴; ユ; ユ; ) CIRCLED KATAKANA YU +32F5;32F5;32F5;30E8;30E8; # (㋵; ㋵; ㋵; ヨ; ヨ; ) CIRCLED KATAKANA YO +32F6;32F6;32F6;30E9;30E9; # (㋶; ㋶; ㋶; ラ; ラ; ) CIRCLED KATAKANA RA +32F7;32F7;32F7;30EA;30EA; # (㋷; ㋷; ㋷; リ; リ; ) CIRCLED KATAKANA RI +32F8;32F8;32F8;30EB;30EB; # (㋸; ㋸; ㋸; ル; ル; ) CIRCLED KATAKANA RU +32F9;32F9;32F9;30EC;30EC; # (㋹; ㋹; ㋹; レ; レ; ) CIRCLED KATAKANA RE +32FA;32FA;32FA;30ED;30ED; # (㋺; ㋺; ㋺; ロ; ロ; ) CIRCLED KATAKANA RO +32FB;32FB;32FB;30EF;30EF; # (㋻; ㋻; ㋻; ワ; ワ; ) CIRCLED KATAKANA WA +32FC;32FC;32FC;30F0;30F0; # (㋼; ㋼; ㋼; ヰ; ヰ; ) CIRCLED KATAKANA WI +32FD;32FD;32FD;30F1;30F1; # (㋽; ㋽; ㋽; ヱ; ヱ; ) CIRCLED KATAKANA WE +32FE;32FE;32FE;30F2;30F2; # (㋾; ㋾; ㋾; ヲ; ヲ; ) CIRCLED KATAKANA WO +32FF;32FF;32FF;4EE4 548C;4EE4 548C; # (㋿; ㋿; ㋿; 令和; 令和; ) SQUARE ERA NAME REIWA +3300;3300;3300;30A2 30D1 30FC 30C8;30A2 30CF 309A 30FC 30C8; # (㌀; ㌀; ㌀; アパート; アハ◌゚ート; ) SQUARE APAATO +3301;3301;3301;30A2 30EB 30D5 30A1;30A2 30EB 30D5 30A1; # (㌁; ㌁; ㌁; アルファ; アルファ; ) SQUARE ARUHUA +3302;3302;3302;30A2 30F3 30DA 30A2;30A2 30F3 30D8 309A 30A2; # (㌂; ㌂; ㌂; アンペア; アンヘ◌゚ア; ) SQUARE ANPEA +3303;3303;3303;30A2 30FC 30EB;30A2 30FC 30EB; # (㌃; ㌃; ㌃; アール; アール; ) SQUARE AARU +3304;3304;3304;30A4 30CB 30F3 30B0;30A4 30CB 30F3 30AF 3099; # (㌄; ㌄; ㌄; イニング; イニンク◌゙; ) SQUARE ININGU +3305;3305;3305;30A4 30F3 30C1;30A4 30F3 30C1; # (㌅; ㌅; ㌅; インチ; インチ; ) SQUARE INTI +3306;3306;3306;30A6 30A9 30F3;30A6 30A9 30F3; # (㌆; ㌆; ㌆; ウォン; ウォン; ) SQUARE UON +3307;3307;3307;30A8 30B9 30AF 30FC 30C9;30A8 30B9 30AF 30FC 30C8 3099; # (㌇; ㌇; ㌇; エスクード; エスクート◌゙; ) SQUARE ESUKUUDO +3308;3308;3308;30A8 30FC 30AB 30FC;30A8 30FC 30AB 30FC; # (㌈; ㌈; ㌈; エーカー; エーカー; ) SQUARE EEKAA +3309;3309;3309;30AA 30F3 30B9;30AA 30F3 30B9; # (㌉; ㌉; ㌉; オンス; オンス; ) SQUARE ONSU +330A;330A;330A;30AA 30FC 30E0;30AA 30FC 30E0; # (㌊; ㌊; ㌊; オーム; オーム; ) SQUARE OOMU +330B;330B;330B;30AB 30A4 30EA;30AB 30A4 30EA; # (㌋; ㌋; ㌋; カイリ; カイリ; ) SQUARE KAIRI +330C;330C;330C;30AB 30E9 30C3 30C8;30AB 30E9 30C3 30C8; # (㌌; ㌌; ㌌; カラット; カラット; ) SQUARE KARATTO +330D;330D;330D;30AB 30ED 30EA 30FC;30AB 30ED 30EA 30FC; # (㌍; ㌍; ㌍; カロリー; カロリー; ) SQUARE KARORII +330E;330E;330E;30AC 30ED 30F3;30AB 3099 30ED 30F3; # (㌎; ㌎; ㌎; ガロン; カ◌゙ロン; ) SQUARE GARON +330F;330F;330F;30AC 30F3 30DE;30AB 3099 30F3 30DE; # (㌏; ㌏; ㌏; ガンマ; カ◌゙ンマ; ) SQUARE GANMA +3310;3310;3310;30AE 30AC;30AD 3099 30AB 3099; # (㌐; ㌐; ㌐; ギガ; キ◌゙カ◌゙; ) SQUARE GIGA +3311;3311;3311;30AE 30CB 30FC;30AD 3099 30CB 30FC; # (㌑; ㌑; ㌑; ギニー; キ◌゙ニー; ) SQUARE GINII +3312;3312;3312;30AD 30E5 30EA 30FC;30AD 30E5 30EA 30FC; # (㌒; ㌒; ㌒; キュリー; キュリー; ) SQUARE KYURII +3313;3313;3313;30AE 30EB 30C0 30FC;30AD 3099 30EB 30BF 3099 30FC; # (㌓; ㌓; ㌓; ギルダー; キ◌゙ルタ◌゙ー; ) SQUARE GIRUDAA +3314;3314;3314;30AD 30ED;30AD 30ED; # (㌔; ㌔; ㌔; キロ; キロ; ) SQUARE KIRO +3315;3315;3315;30AD 30ED 30B0 30E9 30E0;30AD 30ED 30AF 3099 30E9 30E0; # (㌕; ㌕; ㌕; キログラム; キロク◌゙ラム; ) SQUARE KIROGURAMU +3316;3316;3316;30AD 30ED 30E1 30FC 30C8 30EB;30AD 30ED 30E1 30FC 30C8 30EB; # (㌖; ㌖; ㌖; キロメートル; キロメートル; ) SQUARE KIROMEETORU +3317;3317;3317;30AD 30ED 30EF 30C3 30C8;30AD 30ED 30EF 30C3 30C8; # (㌗; ㌗; ㌗; キロワット; キロワット; ) SQUARE KIROWATTO +3318;3318;3318;30B0 30E9 30E0;30AF 3099 30E9 30E0; # (㌘; ㌘; ㌘; グラム; ク◌゙ラム; ) SQUARE GURAMU +3319;3319;3319;30B0 30E9 30E0 30C8 30F3;30AF 3099 30E9 30E0 30C8 30F3; # (㌙; ㌙; ㌙; グラムトン; ク◌゙ラムトン; ) SQUARE GURAMUTON +331A;331A;331A;30AF 30EB 30BC 30A4 30ED;30AF 30EB 30BB 3099 30A4 30ED; # (㌚; ㌚; ㌚; クルゼイロ; クルセ◌゙イロ; ) SQUARE KURUZEIRO +331B;331B;331B;30AF 30ED 30FC 30CD;30AF 30ED 30FC 30CD; # (㌛; ㌛; ㌛; クローネ; クローネ; ) SQUARE KUROONE +331C;331C;331C;30B1 30FC 30B9;30B1 30FC 30B9; # (㌜; ㌜; ㌜; ケース; ケース; ) SQUARE KEESU +331D;331D;331D;30B3 30EB 30CA;30B3 30EB 30CA; # (㌝; ㌝; ㌝; コルナ; コルナ; ) SQUARE KORUNA +331E;331E;331E;30B3 30FC 30DD;30B3 30FC 30DB 309A; # (㌞; ㌞; ㌞; コーポ; コーホ◌゚; ) SQUARE KOOPO +331F;331F;331F;30B5 30A4 30AF 30EB;30B5 30A4 30AF 30EB; # (㌟; ㌟; ㌟; サイクル; サイクル; ) SQUARE SAIKURU +3320;3320;3320;30B5 30F3 30C1 30FC 30E0;30B5 30F3 30C1 30FC 30E0; # (㌠; ㌠; ㌠; サンチーム; サンチーム; ) SQUARE SANTIIMU +3321;3321;3321;30B7 30EA 30F3 30B0;30B7 30EA 30F3 30AF 3099; # (㌡; ㌡; ㌡; シリング; シリンク◌゙; ) SQUARE SIRINGU +3322;3322;3322;30BB 30F3 30C1;30BB 30F3 30C1; # (㌢; ㌢; ㌢; センチ; センチ; ) SQUARE SENTI +3323;3323;3323;30BB 30F3 30C8;30BB 30F3 30C8; # (㌣; ㌣; ㌣; セント; セント; ) SQUARE SENTO +3324;3324;3324;30C0 30FC 30B9;30BF 3099 30FC 30B9; # (㌤; ㌤; ㌤; ダース; タ◌゙ース; ) SQUARE DAASU +3325;3325;3325;30C7 30B7;30C6 3099 30B7; # (㌥; ㌥; ㌥; デシ; テ◌゙シ; ) SQUARE DESI +3326;3326;3326;30C9 30EB;30C8 3099 30EB; # (㌦; ㌦; ㌦; ドル; ト◌゙ル; ) SQUARE DORU +3327;3327;3327;30C8 30F3;30C8 30F3; # (㌧; ㌧; ㌧; トン; トン; ) SQUARE TON +3328;3328;3328;30CA 30CE;30CA 30CE; # (㌨; ㌨; ㌨; ナノ; ナノ; ) SQUARE NANO +3329;3329;3329;30CE 30C3 30C8;30CE 30C3 30C8; # (㌩; ㌩; ㌩; ノット; ノット; ) SQUARE NOTTO +332A;332A;332A;30CF 30A4 30C4;30CF 30A4 30C4; # (㌪; ㌪; ㌪; ハイツ; ハイツ; ) SQUARE HAITU +332B;332B;332B;30D1 30FC 30BB 30F3 30C8;30CF 309A 30FC 30BB 30F3 30C8; # (㌫; ㌫; ㌫; パーセント; ハ◌゚ーセント; ) SQUARE PAASENTO +332C;332C;332C;30D1 30FC 30C4;30CF 309A 30FC 30C4; # (㌬; ㌬; ㌬; パーツ; ハ◌゚ーツ; ) SQUARE PAATU +332D;332D;332D;30D0 30FC 30EC 30EB;30CF 3099 30FC 30EC 30EB; # (㌭; ㌭; ㌭; バーレル; ハ◌゙ーレル; ) SQUARE BAARERU +332E;332E;332E;30D4 30A2 30B9 30C8 30EB;30D2 309A 30A2 30B9 30C8 30EB; # (㌮; ㌮; ㌮; ピアストル; ヒ◌゚アストル; ) SQUARE PIASUTORU +332F;332F;332F;30D4 30AF 30EB;30D2 309A 30AF 30EB; # (㌯; ㌯; ㌯; ピクル; ヒ◌゚クル; ) SQUARE PIKURU +3330;3330;3330;30D4 30B3;30D2 309A 30B3; # (㌰; ㌰; ㌰; ピコ; ヒ◌゚コ; ) SQUARE PIKO +3331;3331;3331;30D3 30EB;30D2 3099 30EB; # (㌱; ㌱; ㌱; ビル; ヒ◌゙ル; ) SQUARE BIRU +3332;3332;3332;30D5 30A1 30E9 30C3 30C9;30D5 30A1 30E9 30C3 30C8 3099; # (㌲; ㌲; ㌲; ファラッド; ファラット◌゙; ) SQUARE HUARADDO +3333;3333;3333;30D5 30A3 30FC 30C8;30D5 30A3 30FC 30C8; # (㌳; ㌳; ㌳; フィート; フィート; ) SQUARE HUIITO +3334;3334;3334;30D6 30C3 30B7 30A7 30EB;30D5 3099 30C3 30B7 30A7 30EB; # (㌴; ㌴; ㌴; ブッシェル; フ◌゙ッシェル; ) SQUARE BUSSYERU +3335;3335;3335;30D5 30E9 30F3;30D5 30E9 30F3; # (㌵; ㌵; ㌵; フラン; フラン; ) SQUARE HURAN +3336;3336;3336;30D8 30AF 30BF 30FC 30EB;30D8 30AF 30BF 30FC 30EB; # (㌶; ㌶; ㌶; ヘクタール; ヘクタール; ) SQUARE HEKUTAARU +3337;3337;3337;30DA 30BD;30D8 309A 30BD; # (㌷; ㌷; ㌷; ペソ; ヘ◌゚ソ; ) SQUARE PESO +3338;3338;3338;30DA 30CB 30D2;30D8 309A 30CB 30D2; # (㌸; ㌸; ㌸; ペニヒ; ヘ◌゚ニヒ; ) SQUARE PENIHI +3339;3339;3339;30D8 30EB 30C4;30D8 30EB 30C4; # (㌹; ㌹; ㌹; ヘルツ; ヘルツ; ) SQUARE HERUTU +333A;333A;333A;30DA 30F3 30B9;30D8 309A 30F3 30B9; # (㌺; ㌺; ㌺; ペンス; ヘ◌゚ンス; ) SQUARE PENSU +333B;333B;333B;30DA 30FC 30B8;30D8 309A 30FC 30B7 3099; # (㌻; ㌻; ㌻; ページ; ヘ◌゚ーシ◌゙; ) SQUARE PEEZI +333C;333C;333C;30D9 30FC 30BF;30D8 3099 30FC 30BF; # (㌼; ㌼; ㌼; ベータ; ヘ◌゙ータ; ) SQUARE BEETA +333D;333D;333D;30DD 30A4 30F3 30C8;30DB 309A 30A4 30F3 30C8; # (㌽; ㌽; ㌽; ポイント; ホ◌゚イント; ) SQUARE POINTO +333E;333E;333E;30DC 30EB 30C8;30DB 3099 30EB 30C8; # (㌾; ㌾; ㌾; ボルト; ホ◌゙ルト; ) SQUARE BORUTO +333F;333F;333F;30DB 30F3;30DB 30F3; # (㌿; ㌿; ㌿; ホン; ホン; ) SQUARE HON +3340;3340;3340;30DD 30F3 30C9;30DB 309A 30F3 30C8 3099; # (㍀; ㍀; ㍀; ポンド; ホ◌゚ント◌゙; ) SQUARE PONDO +3341;3341;3341;30DB 30FC 30EB;30DB 30FC 30EB; # (㍁; ㍁; ㍁; ホール; ホール; ) SQUARE HOORU +3342;3342;3342;30DB 30FC 30F3;30DB 30FC 30F3; # (㍂; ㍂; ㍂; ホーン; ホーン; ) SQUARE HOON +3343;3343;3343;30DE 30A4 30AF 30ED;30DE 30A4 30AF 30ED; # (㍃; ㍃; ㍃; マイクロ; マイクロ; ) SQUARE MAIKURO +3344;3344;3344;30DE 30A4 30EB;30DE 30A4 30EB; # (㍄; ㍄; ㍄; マイル; マイル; ) SQUARE MAIRU +3345;3345;3345;30DE 30C3 30CF;30DE 30C3 30CF; # (㍅; ㍅; ㍅; マッハ; マッハ; ) SQUARE MAHHA +3346;3346;3346;30DE 30EB 30AF;30DE 30EB 30AF; # (㍆; ㍆; ㍆; マルク; マルク; ) SQUARE MARUKU +3347;3347;3347;30DE 30F3 30B7 30E7 30F3;30DE 30F3 30B7 30E7 30F3; # (㍇; ㍇; ㍇; マンション; マンション; ) SQUARE MANSYON +3348;3348;3348;30DF 30AF 30ED 30F3;30DF 30AF 30ED 30F3; # (㍈; ㍈; ㍈; ミクロン; ミクロン; ) SQUARE MIKURON +3349;3349;3349;30DF 30EA;30DF 30EA; # (㍉; ㍉; ㍉; ミリ; ミリ; ) SQUARE MIRI +334A;334A;334A;30DF 30EA 30D0 30FC 30EB;30DF 30EA 30CF 3099 30FC 30EB; # (㍊; ㍊; ㍊; ミリバール; ミリハ◌゙ール; ) SQUARE MIRIBAARU +334B;334B;334B;30E1 30AC;30E1 30AB 3099; # (㍋; ㍋; ㍋; メガ; メカ◌゙; ) SQUARE MEGA +334C;334C;334C;30E1 30AC 30C8 30F3;30E1 30AB 3099 30C8 30F3; # (㍌; ㍌; ㍌; メガトン; メカ◌゙トン; ) SQUARE MEGATON +334D;334D;334D;30E1 30FC 30C8 30EB;30E1 30FC 30C8 30EB; # (㍍; ㍍; ㍍; メートル; メートル; ) SQUARE MEETORU +334E;334E;334E;30E4 30FC 30C9;30E4 30FC 30C8 3099; # (㍎; ㍎; ㍎; ヤード; ヤート◌゙; ) SQUARE YAADO +334F;334F;334F;30E4 30FC 30EB;30E4 30FC 30EB; # (㍏; ㍏; ㍏; ヤール; ヤール; ) SQUARE YAARU +3350;3350;3350;30E6 30A2 30F3;30E6 30A2 30F3; # (㍐; ㍐; ㍐; ユアン; ユアン; ) SQUARE YUAN +3351;3351;3351;30EA 30C3 30C8 30EB;30EA 30C3 30C8 30EB; # (㍑; ㍑; ㍑; リットル; リットル; ) SQUARE RITTORU +3352;3352;3352;30EA 30E9;30EA 30E9; # (㍒; ㍒; ㍒; リラ; リラ; ) SQUARE RIRA +3353;3353;3353;30EB 30D4 30FC;30EB 30D2 309A 30FC; # (㍓; ㍓; ㍓; ルピー; ルヒ◌゚ー; ) SQUARE RUPII +3354;3354;3354;30EB 30FC 30D6 30EB;30EB 30FC 30D5 3099 30EB; # (㍔; ㍔; ㍔; ルーブル; ルーフ◌゙ル; ) SQUARE RUUBURU +3355;3355;3355;30EC 30E0;30EC 30E0; # (㍕; ㍕; ㍕; レム; レム; ) SQUARE REMU +3356;3356;3356;30EC 30F3 30C8 30B2 30F3;30EC 30F3 30C8 30B1 3099 30F3; # (㍖; ㍖; ㍖; レントゲン; レントケ◌゙ン; ) SQUARE RENTOGEN +3357;3357;3357;30EF 30C3 30C8;30EF 30C3 30C8; # (㍗; ㍗; ㍗; ワット; ワット; ) SQUARE WATTO +3358;3358;3358;0030 70B9;0030 70B9; # (㍘; ㍘; ㍘; 0点; 0点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO +3359;3359;3359;0031 70B9;0031 70B9; # (㍙; ㍙; ㍙; 1点; 1点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE +335A;335A;335A;0032 70B9;0032 70B9; # (㍚; ㍚; ㍚; 2点; 2点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO +335B;335B;335B;0033 70B9;0033 70B9; # (㍛; ㍛; ㍛; 3点; 3点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE +335C;335C;335C;0034 70B9;0034 70B9; # (㍜; ㍜; ㍜; 4点; 4点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR +335D;335D;335D;0035 70B9;0035 70B9; # (㍝; ㍝; ㍝; 5点; 5点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE +335E;335E;335E;0036 70B9;0036 70B9; # (㍞; ㍞; ㍞; 6点; 6点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX +335F;335F;335F;0037 70B9;0037 70B9; # (㍟; ㍟; ㍟; 7点; 7点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN +3360;3360;3360;0038 70B9;0038 70B9; # (㍠; ㍠; ㍠; 8点; 8点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT +3361;3361;3361;0039 70B9;0039 70B9; # (㍡; ㍡; ㍡; 9点; 9点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE +3362;3362;3362;0031 0030 70B9;0031 0030 70B9; # (㍢; ㍢; ㍢; 10点; 10点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN +3363;3363;3363;0031 0031 70B9;0031 0031 70B9; # (㍣; ㍣; ㍣; 11点; 11点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN +3364;3364;3364;0031 0032 70B9;0031 0032 70B9; # (㍤; ㍤; ㍤; 12点; 12点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE +3365;3365;3365;0031 0033 70B9;0031 0033 70B9; # (㍥; ㍥; ㍥; 13点; 13点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN +3366;3366;3366;0031 0034 70B9;0031 0034 70B9; # (㍦; ㍦; ㍦; 14点; 14点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN +3367;3367;3367;0031 0035 70B9;0031 0035 70B9; # (㍧; ㍧; ㍧; 15点; 15点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN +3368;3368;3368;0031 0036 70B9;0031 0036 70B9; # (㍨; ㍨; ㍨; 16点; 16点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN +3369;3369;3369;0031 0037 70B9;0031 0037 70B9; # (㍩; ㍩; ㍩; 17点; 17点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN +336A;336A;336A;0031 0038 70B9;0031 0038 70B9; # (㍪; ㍪; ㍪; 18点; 18点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN +336B;336B;336B;0031 0039 70B9;0031 0039 70B9; # (㍫; ㍫; ㍫; 19点; 19点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN +336C;336C;336C;0032 0030 70B9;0032 0030 70B9; # (㍬; ㍬; ㍬; 20点; 20点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY +336D;336D;336D;0032 0031 70B9;0032 0031 70B9; # (㍭; ㍭; ㍭; 21点; 21点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE +336E;336E;336E;0032 0032 70B9;0032 0032 70B9; # (㍮; ㍮; ㍮; 22点; 22点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO +336F;336F;336F;0032 0033 70B9;0032 0033 70B9; # (㍯; ㍯; ㍯; 23点; 23点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE +3370;3370;3370;0032 0034 70B9;0032 0034 70B9; # (㍰; ㍰; ㍰; 24点; 24点; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +3371;3371;3371;0068 0050 0061;0068 0050 0061; # (㍱; ㍱; ㍱; hPa; hPa; ) SQUARE HPA +3372;3372;3372;0064 0061;0064 0061; # (㍲; ㍲; ㍲; da; da; ) SQUARE DA +3373;3373;3373;0041 0055;0041 0055; # (㍳; ㍳; ㍳; AU; AU; ) SQUARE AU +3374;3374;3374;0062 0061 0072;0062 0061 0072; # (㍴; ㍴; ㍴; bar; bar; ) SQUARE BAR +3375;3375;3375;006F 0056;006F 0056; # (㍵; ㍵; ㍵; oV; oV; ) SQUARE OV +3376;3376;3376;0070 0063;0070 0063; # (㍶; ㍶; ㍶; pc; pc; ) SQUARE PC +3377;3377;3377;0064 006D;0064 006D; # (㍷; ㍷; ㍷; dm; dm; ) SQUARE DM +3378;3378;3378;0064 006D 0032;0064 006D 0032; # (㍸; ㍸; ㍸; dm2; dm2; ) SQUARE DM SQUARED +3379;3379;3379;0064 006D 0033;0064 006D 0033; # (㍹; ㍹; ㍹; dm3; dm3; ) SQUARE DM CUBED +337A;337A;337A;0049 0055;0049 0055; # (㍺; ㍺; ㍺; IU; IU; ) SQUARE IU +337B;337B;337B;5E73 6210;5E73 6210; # (㍻; ㍻; ㍻; 平成; 平成; ) SQUARE ERA NAME HEISEI +337C;337C;337C;662D 548C;662D 548C; # (㍼; ㍼; ㍼; 昭和; 昭和; ) SQUARE ERA NAME SYOUWA +337D;337D;337D;5927 6B63;5927 6B63; # (㍽; ㍽; ㍽; 大正; 大正; ) SQUARE ERA NAME TAISYOU +337E;337E;337E;660E 6CBB;660E 6CBB; # (㍾; ㍾; ㍾; 明治; 明治; ) SQUARE ERA NAME MEIZI +337F;337F;337F;682A 5F0F 4F1A 793E;682A 5F0F 4F1A 793E; # (㍿; ㍿; ㍿; 株式会社; 株式会社; ) SQUARE CORPORATION +3380;3380;3380;0070 0041;0070 0041; # (㎀; ㎀; ㎀; pA; pA; ) SQUARE PA AMPS +3381;3381;3381;006E 0041;006E 0041; # (㎁; ㎁; ㎁; nA; nA; ) SQUARE NA +3382;3382;3382;03BC 0041;03BC 0041; # (㎂; ㎂; ㎂; μA; μA; ) SQUARE MU A +3383;3383;3383;006D 0041;006D 0041; # (㎃; ㎃; ㎃; mA; mA; ) SQUARE MA +3384;3384;3384;006B 0041;006B 0041; # (㎄; ㎄; ㎄; kA; kA; ) SQUARE KA +3385;3385;3385;004B 0042;004B 0042; # (㎅; ㎅; ㎅; KB; KB; ) SQUARE KB +3386;3386;3386;004D 0042;004D 0042; # (㎆; ㎆; ㎆; MB; MB; ) SQUARE MB +3387;3387;3387;0047 0042;0047 0042; # (㎇; ㎇; ㎇; GB; GB; ) SQUARE GB +3388;3388;3388;0063 0061 006C;0063 0061 006C; # (㎈; ㎈; ㎈; cal; cal; ) SQUARE CAL +3389;3389;3389;006B 0063 0061 006C;006B 0063 0061 006C; # (㎉; ㎉; ㎉; kcal; kcal; ) SQUARE KCAL +338A;338A;338A;0070 0046;0070 0046; # (㎊; ㎊; ㎊; pF; pF; ) SQUARE PF +338B;338B;338B;006E 0046;006E 0046; # (㎋; ㎋; ㎋; nF; nF; ) SQUARE NF +338C;338C;338C;03BC 0046;03BC 0046; # (㎌; ㎌; ㎌; μF; μF; ) SQUARE MU F +338D;338D;338D;03BC 0067;03BC 0067; # (㎍; ㎍; ㎍; μg; μg; ) SQUARE MU G +338E;338E;338E;006D 0067;006D 0067; # (㎎; ㎎; ㎎; mg; mg; ) SQUARE MG +338F;338F;338F;006B 0067;006B 0067; # (㎏; ㎏; ㎏; kg; kg; ) SQUARE KG +3390;3390;3390;0048 007A;0048 007A; # (㎐; ㎐; ㎐; Hz; Hz; ) SQUARE HZ +3391;3391;3391;006B 0048 007A;006B 0048 007A; # (㎑; ㎑; ㎑; kHz; kHz; ) SQUARE KHZ +3392;3392;3392;004D 0048 007A;004D 0048 007A; # (㎒; ㎒; ㎒; MHz; MHz; ) SQUARE MHZ +3393;3393;3393;0047 0048 007A;0047 0048 007A; # (㎓; ㎓; ㎓; GHz; GHz; ) SQUARE GHZ +3394;3394;3394;0054 0048 007A;0054 0048 007A; # (㎔; ㎔; ㎔; THz; THz; ) SQUARE THZ +3395;3395;3395;03BC 006C;03BC 006C; # (㎕; ㎕; ㎕; μl; μl; ) SQUARE MU L +3396;3396;3396;006D 006C;006D 006C; # (㎖; ㎖; ㎖; ml; ml; ) SQUARE ML +3397;3397;3397;0064 006C;0064 006C; # (㎗; ㎗; ㎗; dl; dl; ) SQUARE DL +3398;3398;3398;006B 006C;006B 006C; # (㎘; ㎘; ㎘; kl; kl; ) SQUARE KL +3399;3399;3399;0066 006D;0066 006D; # (㎙; ㎙; ㎙; fm; fm; ) SQUARE FM +339A;339A;339A;006E 006D;006E 006D; # (㎚; ㎚; ㎚; nm; nm; ) SQUARE NM +339B;339B;339B;03BC 006D;03BC 006D; # (㎛; ㎛; ㎛; μm; μm; ) SQUARE MU M +339C;339C;339C;006D 006D;006D 006D; # (㎜; ㎜; ㎜; mm; mm; ) SQUARE MM +339D;339D;339D;0063 006D;0063 006D; # (㎝; ㎝; ㎝; cm; cm; ) SQUARE CM +339E;339E;339E;006B 006D;006B 006D; # (㎞; ㎞; ㎞; km; km; ) SQUARE KM +339F;339F;339F;006D 006D 0032;006D 006D 0032; # (㎟; ㎟; ㎟; mm2; mm2; ) SQUARE MM SQUARED +33A0;33A0;33A0;0063 006D 0032;0063 006D 0032; # (㎠; ㎠; ㎠; cm2; cm2; ) SQUARE CM SQUARED +33A1;33A1;33A1;006D 0032;006D 0032; # (㎡; ㎡; ㎡; m2; m2; ) SQUARE M SQUARED +33A2;33A2;33A2;006B 006D 0032;006B 006D 0032; # (㎢; ㎢; ㎢; km2; km2; ) SQUARE KM SQUARED +33A3;33A3;33A3;006D 006D 0033;006D 006D 0033; # (㎣; ㎣; ㎣; mm3; mm3; ) SQUARE MM CUBED +33A4;33A4;33A4;0063 006D 0033;0063 006D 0033; # (㎤; ㎤; ㎤; cm3; cm3; ) SQUARE CM CUBED +33A5;33A5;33A5;006D 0033;006D 0033; # (㎥; ㎥; ㎥; m3; m3; ) SQUARE M CUBED +33A6;33A6;33A6;006B 006D 0033;006B 006D 0033; # (㎦; ㎦; ㎦; km3; km3; ) SQUARE KM CUBED +33A7;33A7;33A7;006D 2215 0073;006D 2215 0073; # (㎧; ㎧; ㎧; m∕s; m∕s; ) SQUARE M OVER S +33A8;33A8;33A8;006D 2215 0073 0032;006D 2215 0073 0032; # (㎨; ㎨; ㎨; m∕s2; m∕s2; ) SQUARE M OVER S SQUARED +33A9;33A9;33A9;0050 0061;0050 0061; # (㎩; ㎩; ㎩; Pa; Pa; ) SQUARE PA +33AA;33AA;33AA;006B 0050 0061;006B 0050 0061; # (㎪; ㎪; ㎪; kPa; kPa; ) SQUARE KPA +33AB;33AB;33AB;004D 0050 0061;004D 0050 0061; # (㎫; ㎫; ㎫; MPa; MPa; ) SQUARE MPA +33AC;33AC;33AC;0047 0050 0061;0047 0050 0061; # (㎬; ㎬; ㎬; GPa; GPa; ) SQUARE GPA +33AD;33AD;33AD;0072 0061 0064;0072 0061 0064; # (㎭; ㎭; ㎭; rad; rad; ) SQUARE RAD +33AE;33AE;33AE;0072 0061 0064 2215 0073;0072 0061 0064 2215 0073; # (㎮; ㎮; ㎮; rad∕s; rad∕s; ) SQUARE RAD OVER S +33AF;33AF;33AF;0072 0061 0064 2215 0073 0032;0072 0061 0064 2215 0073 0032; # (㎯; ㎯; ㎯; rad∕s2; rad∕s2; ) SQUARE RAD OVER S SQUARED +33B0;33B0;33B0;0070 0073;0070 0073; # (㎰; ㎰; ㎰; ps; ps; ) SQUARE PS +33B1;33B1;33B1;006E 0073;006E 0073; # (㎱; ㎱; ㎱; ns; ns; ) SQUARE NS +33B2;33B2;33B2;03BC 0073;03BC 0073; # (㎲; ㎲; ㎲; μs; μs; ) SQUARE MU S +33B3;33B3;33B3;006D 0073;006D 0073; # (㎳; ㎳; ㎳; ms; ms; ) SQUARE MS +33B4;33B4;33B4;0070 0056;0070 0056; # (㎴; ㎴; ㎴; pV; pV; ) SQUARE PV +33B5;33B5;33B5;006E 0056;006E 0056; # (㎵; ㎵; ㎵; nV; nV; ) SQUARE NV +33B6;33B6;33B6;03BC 0056;03BC 0056; # (㎶; ㎶; ㎶; μV; μV; ) SQUARE MU V +33B7;33B7;33B7;006D 0056;006D 0056; # (㎷; ㎷; ㎷; mV; mV; ) SQUARE MV +33B8;33B8;33B8;006B 0056;006B 0056; # (㎸; ㎸; ㎸; kV; kV; ) SQUARE KV +33B9;33B9;33B9;004D 0056;004D 0056; # (㎹; ㎹; ㎹; MV; MV; ) SQUARE MV MEGA +33BA;33BA;33BA;0070 0057;0070 0057; # (㎺; ㎺; ㎺; pW; pW; ) SQUARE PW +33BB;33BB;33BB;006E 0057;006E 0057; # (㎻; ㎻; ㎻; nW; nW; ) SQUARE NW +33BC;33BC;33BC;03BC 0057;03BC 0057; # (㎼; ㎼; ㎼; μW; μW; ) SQUARE MU W +33BD;33BD;33BD;006D 0057;006D 0057; # (㎽; ㎽; ㎽; mW; mW; ) SQUARE MW +33BE;33BE;33BE;006B 0057;006B 0057; # (㎾; ㎾; ㎾; kW; kW; ) SQUARE KW +33BF;33BF;33BF;004D 0057;004D 0057; # (㎿; ㎿; ㎿; MW; MW; ) SQUARE MW MEGA +33C0;33C0;33C0;006B 03A9;006B 03A9; # (㏀; ㏀; ㏀; kΩ; kΩ; ) SQUARE K OHM +33C1;33C1;33C1;004D 03A9;004D 03A9; # (㏁; ㏁; ㏁; MΩ; MΩ; ) SQUARE M OHM +33C2;33C2;33C2;0061 002E 006D 002E;0061 002E 006D 002E; # (㏂; ㏂; ㏂; a.m.; a.m.; ) SQUARE AM +33C3;33C3;33C3;0042 0071;0042 0071; # (㏃; ㏃; ㏃; Bq; Bq; ) SQUARE BQ +33C4;33C4;33C4;0063 0063;0063 0063; # (㏄; ㏄; ㏄; cc; cc; ) SQUARE CC +33C5;33C5;33C5;0063 0064;0063 0064; # (㏅; ㏅; ㏅; cd; cd; ) SQUARE CD +33C6;33C6;33C6;0043 2215 006B 0067;0043 2215 006B 0067; # (㏆; ㏆; ㏆; C∕kg; C∕kg; ) SQUARE C OVER KG +33C7;33C7;33C7;0043 006F 002E;0043 006F 002E; # (㏇; ㏇; ㏇; Co.; Co.; ) SQUARE CO +33C8;33C8;33C8;0064 0042;0064 0042; # (㏈; ㏈; ㏈; dB; dB; ) SQUARE DB +33C9;33C9;33C9;0047 0079;0047 0079; # (㏉; ㏉; ㏉; Gy; Gy; ) SQUARE GY +33CA;33CA;33CA;0068 0061;0068 0061; # (㏊; ㏊; ㏊; ha; ha; ) SQUARE HA +33CB;33CB;33CB;0048 0050;0048 0050; # (㏋; ㏋; ㏋; HP; HP; ) SQUARE HP +33CC;33CC;33CC;0069 006E;0069 006E; # (㏌; ㏌; ㏌; in; in; ) SQUARE IN +33CD;33CD;33CD;004B 004B;004B 004B; # (㏍; ㏍; ㏍; KK; KK; ) SQUARE KK +33CE;33CE;33CE;004B 004D;004B 004D; # (㏎; ㏎; ㏎; KM; KM; ) SQUARE KM CAPITAL +33CF;33CF;33CF;006B 0074;006B 0074; # (㏏; ㏏; ㏏; kt; kt; ) SQUARE KT +33D0;33D0;33D0;006C 006D;006C 006D; # (㏐; ㏐; ㏐; lm; lm; ) SQUARE LM +33D1;33D1;33D1;006C 006E;006C 006E; # (㏑; ㏑; ㏑; ln; ln; ) SQUARE LN +33D2;33D2;33D2;006C 006F 0067;006C 006F 0067; # (㏒; ㏒; ㏒; log; log; ) SQUARE LOG +33D3;33D3;33D3;006C 0078;006C 0078; # (㏓; ㏓; ㏓; lx; lx; ) SQUARE LX +33D4;33D4;33D4;006D 0062;006D 0062; # (㏔; ㏔; ㏔; mb; mb; ) SQUARE MB SMALL +33D5;33D5;33D5;006D 0069 006C;006D 0069 006C; # (㏕; ㏕; ㏕; mil; mil; ) SQUARE MIL +33D6;33D6;33D6;006D 006F 006C;006D 006F 006C; # (㏖; ㏖; ㏖; mol; mol; ) SQUARE MOL +33D7;33D7;33D7;0050 0048;0050 0048; # (㏗; ㏗; ㏗; PH; PH; ) SQUARE PH +33D8;33D8;33D8;0070 002E 006D 002E;0070 002E 006D 002E; # (㏘; ㏘; ㏘; p.m.; p.m.; ) SQUARE PM +33D9;33D9;33D9;0050 0050 004D;0050 0050 004D; # (㏙; ㏙; ㏙; PPM; PPM; ) SQUARE PPM +33DA;33DA;33DA;0050 0052;0050 0052; # (㏚; ㏚; ㏚; PR; PR; ) SQUARE PR +33DB;33DB;33DB;0073 0072;0073 0072; # (㏛; ㏛; ㏛; sr; sr; ) SQUARE SR +33DC;33DC;33DC;0053 0076;0053 0076; # (㏜; ㏜; ㏜; Sv; Sv; ) SQUARE SV +33DD;33DD;33DD;0057 0062;0057 0062; # (㏝; ㏝; ㏝; Wb; Wb; ) SQUARE WB +33DE;33DE;33DE;0056 2215 006D;0056 2215 006D; # (㏞; ㏞; ㏞; V∕m; V∕m; ) SQUARE V OVER M +33DF;33DF;33DF;0041 2215 006D;0041 2215 006D; # (㏟; ㏟; ㏟; A∕m; A∕m; ) SQUARE A OVER M +33E0;33E0;33E0;0031 65E5;0031 65E5; # (㏠; ㏠; ㏠; 1日; 1日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE +33E1;33E1;33E1;0032 65E5;0032 65E5; # (㏡; ㏡; ㏡; 2日; 2日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO +33E2;33E2;33E2;0033 65E5;0033 65E5; # (㏢; ㏢; ㏢; 3日; 3日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE +33E3;33E3;33E3;0034 65E5;0034 65E5; # (㏣; ㏣; ㏣; 4日; 4日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR +33E4;33E4;33E4;0035 65E5;0035 65E5; # (㏤; ㏤; ㏤; 5日; 5日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE +33E5;33E5;33E5;0036 65E5;0036 65E5; # (㏥; ㏥; ㏥; 6日; 6日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX +33E6;33E6;33E6;0037 65E5;0037 65E5; # (㏦; ㏦; ㏦; 7日; 7日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN +33E7;33E7;33E7;0038 65E5;0038 65E5; # (㏧; ㏧; ㏧; 8日; 8日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT +33E8;33E8;33E8;0039 65E5;0039 65E5; # (㏨; ㏨; ㏨; 9日; 9日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE +33E9;33E9;33E9;0031 0030 65E5;0031 0030 65E5; # (㏩; ㏩; ㏩; 10日; 10日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN +33EA;33EA;33EA;0031 0031 65E5;0031 0031 65E5; # (㏪; ㏪; ㏪; 11日; 11日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN +33EB;33EB;33EB;0031 0032 65E5;0031 0032 65E5; # (㏫; ㏫; ㏫; 12日; 12日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE +33EC;33EC;33EC;0031 0033 65E5;0031 0033 65E5; # (㏬; ㏬; ㏬; 13日; 13日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN +33ED;33ED;33ED;0031 0034 65E5;0031 0034 65E5; # (㏭; ㏭; ㏭; 14日; 14日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN +33EE;33EE;33EE;0031 0035 65E5;0031 0035 65E5; # (㏮; ㏮; ㏮; 15日; 15日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN +33EF;33EF;33EF;0031 0036 65E5;0031 0036 65E5; # (㏯; ㏯; ㏯; 16日; 16日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN +33F0;33F0;33F0;0031 0037 65E5;0031 0037 65E5; # (㏰; ㏰; ㏰; 17日; 17日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN +33F1;33F1;33F1;0031 0038 65E5;0031 0038 65E5; # (㏱; ㏱; ㏱; 18日; 18日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN +33F2;33F2;33F2;0031 0039 65E5;0031 0039 65E5; # (㏲; ㏲; ㏲; 19日; 19日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN +33F3;33F3;33F3;0032 0030 65E5;0032 0030 65E5; # (㏳; ㏳; ㏳; 20日; 20日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY +33F4;33F4;33F4;0032 0031 65E5;0032 0031 65E5; # (㏴; ㏴; ㏴; 21日; 21日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE +33F5;33F5;33F5;0032 0032 65E5;0032 0032 65E5; # (㏵; ㏵; ㏵; 22日; 22日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO +33F6;33F6;33F6;0032 0033 65E5;0032 0033 65E5; # (㏶; ㏶; ㏶; 23日; 23日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE +33F7;33F7;33F7;0032 0034 65E5;0032 0034 65E5; # (㏷; ㏷; ㏷; 24日; 24日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR +33F8;33F8;33F8;0032 0035 65E5;0032 0035 65E5; # (㏸; ㏸; ㏸; 25日; 25日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE +33F9;33F9;33F9;0032 0036 65E5;0032 0036 65E5; # (㏹; ㏹; ㏹; 26日; 26日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX +33FA;33FA;33FA;0032 0037 65E5;0032 0037 65E5; # (㏺; ㏺; ㏺; 27日; 27日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN +33FB;33FB;33FB;0032 0038 65E5;0032 0038 65E5; # (㏻; ㏻; ㏻; 28日; 28日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT +33FC;33FC;33FC;0032 0039 65E5;0032 0039 65E5; # (㏼; ㏼; ㏼; 29日; 29日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE +33FD;33FD;33FD;0033 0030 65E5;0033 0030 65E5; # (㏽; ㏽; ㏽; 30日; 30日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY +33FE;33FE;33FE;0033 0031 65E5;0033 0031 65E5; # (㏾; ㏾; ㏾; 31日; 31日; ) IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +33FF;33FF;33FF;0067 0061 006C;0067 0061 006C; # (㏿; ㏿; ㏿; gal; gal; ) SQUARE GAL +A69C;A69C;A69C;044A;044A; # (ꚜ; ꚜ; ꚜ; ъ; ъ; ) MODIFIER LETTER CYRILLIC HARD SIGN +A69D;A69D;A69D;044C;044C; # (ꚝ; ꚝ; ꚝ; ь; ь; ) MODIFIER LETTER CYRILLIC SOFT SIGN +A770;A770;A770;A76F;A76F; # (ꝰ; ꝰ; ꝰ; ꝯ; ꝯ; ) MODIFIER LETTER US +A7F2;A7F2;A7F2;0043;0043; # (ꟲ; ꟲ; ꟲ; C; C; ) MODIFIER LETTER CAPITAL C +A7F3;A7F3;A7F3;0046;0046; # (ꟳ; ꟳ; ꟳ; F; F; ) MODIFIER LETTER CAPITAL F +A7F4;A7F4;A7F4;0051;0051; # (ꟴ; ꟴ; ꟴ; Q; Q; ) MODIFIER LETTER CAPITAL Q +A7F8;A7F8;A7F8;0126;0126; # (ꟸ; ꟸ; ꟸ; Ħ; Ħ; ) MODIFIER LETTER CAPITAL H WITH STROKE +A7F9;A7F9;A7F9;0153;0153; # (ꟹ; ꟹ; ꟹ; œ; œ; ) MODIFIER LETTER SMALL LIGATURE OE +AB5C;AB5C;AB5C;A727;A727; # (ꭜ; ꭜ; ꭜ; ꜧ; ꜧ; ) MODIFIER LETTER SMALL HENG +AB5D;AB5D;AB5D;AB37;AB37; # (ꭝ; ꭝ; ꭝ; ꬷ; ꬷ; ) MODIFIER LETTER SMALL L WITH INVERTED LAZY S +AB5E;AB5E;AB5E;026B;026B; # (ꭞ; ꭞ; ꭞ; ɫ; ɫ; ) MODIFIER LETTER SMALL L WITH MIDDLE TILDE +AB5F;AB5F;AB5F;AB52;AB52; # (ꭟ; ꭟ; ꭟ; ꭒ; ꭒ; ) MODIFIER LETTER SMALL U WITH LEFT HOOK +AB69;AB69;AB69;028D;028D; # (ꭩ; ꭩ; ꭩ; ʍ; ʍ; ) MODIFIER LETTER SMALL TURNED W +AC00;AC00;1100 1161;AC00;1100 1161; # (가; 가; 가; 가; 가; ) HANGUL SYLLABLE GA +AC01;AC01;1100 1161 11A8;AC01;1100 1161 11A8; # (각; 각; 각; 각; 각; ) HANGUL SYLLABLE GAG +AC02;AC02;1100 1161 11A9;AC02;1100 1161 11A9; # (갂; 갂; 갂; 갂; 갂; ) HANGUL SYLLABLE GAGG +AC03;AC03;1100 1161 11AA;AC03;1100 1161 11AA; # (갃; 갃; 갃; 갃; 갃; ) HANGUL SYLLABLE GAGS +AC04;AC04;1100 1161 11AB;AC04;1100 1161 11AB; # (간; 간; 간; 간; 간; ) HANGUL SYLLABLE GAN +AC05;AC05;1100 1161 11AC;AC05;1100 1161 11AC; # (갅; 갅; 갅; 갅; 갅; ) HANGUL SYLLABLE GANJ +AC06;AC06;1100 1161 11AD;AC06;1100 1161 11AD; # (갆; 갆; 갆; 갆; 갆; ) HANGUL SYLLABLE GANH +AC07;AC07;1100 1161 11AE;AC07;1100 1161 11AE; # (갇; 갇; 갇; 갇; 갇; ) HANGUL SYLLABLE GAD +AC08;AC08;1100 1161 11AF;AC08;1100 1161 11AF; # (갈; 갈; 갈; 갈; 갈; ) HANGUL SYLLABLE GAL +AC09;AC09;1100 1161 11B0;AC09;1100 1161 11B0; # (갉; 갉; 갉; 갉; 갉; ) HANGUL SYLLABLE GALG +AC0A;AC0A;1100 1161 11B1;AC0A;1100 1161 11B1; # (갊; 갊; 갊; 갊; 갊; ) HANGUL SYLLABLE GALM +AC0B;AC0B;1100 1161 11B2;AC0B;1100 1161 11B2; # (갋; 갋; 갋; 갋; 갋; ) HANGUL SYLLABLE GALB +AC0C;AC0C;1100 1161 11B3;AC0C;1100 1161 11B3; # (갌; 갌; 갌; 갌; 갌; ) HANGUL SYLLABLE GALS +AC0D;AC0D;1100 1161 11B4;AC0D;1100 1161 11B4; # (갍; 갍; 갍; 갍; 갍; ) HANGUL SYLLABLE GALT +AC0E;AC0E;1100 1161 11B5;AC0E;1100 1161 11B5; # (갎; 갎; 갎; 갎; 갎; ) HANGUL SYLLABLE GALP +AC0F;AC0F;1100 1161 11B6;AC0F;1100 1161 11B6; # (갏; 갏; 갏; 갏; 갏; ) HANGUL SYLLABLE GALH +AC10;AC10;1100 1161 11B7;AC10;1100 1161 11B7; # (감; 감; 감; 감; 감; ) HANGUL SYLLABLE GAM +AC11;AC11;1100 1161 11B8;AC11;1100 1161 11B8; # (갑; 갑; 갑; 갑; 갑; ) HANGUL SYLLABLE GAB +AC12;AC12;1100 1161 11B9;AC12;1100 1161 11B9; # (값; 값; 값; 값; 값; ) HANGUL SYLLABLE GABS +AC13;AC13;1100 1161 11BA;AC13;1100 1161 11BA; # (갓; 갓; 갓; 갓; 갓; ) HANGUL SYLLABLE GAS +AC14;AC14;1100 1161 11BB;AC14;1100 1161 11BB; # (갔; 갔; 갔; 갔; 갔; ) HANGUL SYLLABLE GASS +AC15;AC15;1100 1161 11BC;AC15;1100 1161 11BC; # (강; 강; 강; 강; 강; ) HANGUL SYLLABLE GANG +AC16;AC16;1100 1161 11BD;AC16;1100 1161 11BD; # (갖; 갖; 갖; 갖; 갖; ) HANGUL SYLLABLE GAJ +AC17;AC17;1100 1161 11BE;AC17;1100 1161 11BE; # (갗; 갗; 갗; 갗; 갗; ) HANGUL SYLLABLE GAC +AC18;AC18;1100 1161 11BF;AC18;1100 1161 11BF; # (갘; 갘; 갘; 갘; 갘; ) HANGUL SYLLABLE GAK +AC19;AC19;1100 1161 11C0;AC19;1100 1161 11C0; # (같; 같; 같; 같; 같; ) HANGUL SYLLABLE GAT +AC1A;AC1A;1100 1161 11C1;AC1A;1100 1161 11C1; # (갚; 갚; 갚; 갚; 갚; ) HANGUL SYLLABLE GAP +AC1B;AC1B;1100 1161 11C2;AC1B;1100 1161 11C2; # (갛; 갛; 갛; 갛; 갛; ) HANGUL SYLLABLE GAH +AC1C;AC1C;1100 1162;AC1C;1100 1162; # (개; 개; 개; 개; 개; ) HANGUL SYLLABLE GAE +AC1D;AC1D;1100 1162 11A8;AC1D;1100 1162 11A8; # (객; 객; 객; 객; 객; ) HANGUL SYLLABLE GAEG +AC1E;AC1E;1100 1162 11A9;AC1E;1100 1162 11A9; # (갞; 갞; 갞; 갞; 갞; ) HANGUL SYLLABLE GAEGG +AC1F;AC1F;1100 1162 11AA;AC1F;1100 1162 11AA; # (갟; 갟; 갟; 갟; 갟; ) HANGUL SYLLABLE GAEGS +AC20;AC20;1100 1162 11AB;AC20;1100 1162 11AB; # (갠; 갠; 갠; 갠; 갠; ) HANGUL SYLLABLE GAEN +AC21;AC21;1100 1162 11AC;AC21;1100 1162 11AC; # (갡; 갡; 갡; 갡; 갡; ) HANGUL SYLLABLE GAENJ +AC22;AC22;1100 1162 11AD;AC22;1100 1162 11AD; # (갢; 갢; 갢; 갢; 갢; ) HANGUL SYLLABLE GAENH +AC23;AC23;1100 1162 11AE;AC23;1100 1162 11AE; # (갣; 갣; 갣; 갣; 갣; ) HANGUL SYLLABLE GAED +AC24;AC24;1100 1162 11AF;AC24;1100 1162 11AF; # (갤; 갤; 갤; 갤; 갤; ) HANGUL SYLLABLE GAEL +AC25;AC25;1100 1162 11B0;AC25;1100 1162 11B0; # (갥; 갥; 갥; 갥; 갥; ) HANGUL SYLLABLE GAELG +AC26;AC26;1100 1162 11B1;AC26;1100 1162 11B1; # (갦; 갦; 갦; 갦; 갦; ) HANGUL SYLLABLE GAELM +AC27;AC27;1100 1162 11B2;AC27;1100 1162 11B2; # (갧; 갧; 갧; 갧; 갧; ) HANGUL SYLLABLE GAELB +AC28;AC28;1100 1162 11B3;AC28;1100 1162 11B3; # (갨; 갨; 갨; 갨; 갨; ) HANGUL SYLLABLE GAELS +AC29;AC29;1100 1162 11B4;AC29;1100 1162 11B4; # (갩; 갩; 갩; 갩; 갩; ) HANGUL SYLLABLE GAELT +AC2A;AC2A;1100 1162 11B5;AC2A;1100 1162 11B5; # (갪; 갪; 갪; 갪; 갪; ) HANGUL SYLLABLE GAELP +AC2B;AC2B;1100 1162 11B6;AC2B;1100 1162 11B6; # (갫; 갫; 갫; 갫; 갫; ) HANGUL SYLLABLE GAELH +AC2C;AC2C;1100 1162 11B7;AC2C;1100 1162 11B7; # (갬; 갬; 갬; 갬; 갬; ) HANGUL SYLLABLE GAEM +AC2D;AC2D;1100 1162 11B8;AC2D;1100 1162 11B8; # (갭; 갭; 갭; 갭; 갭; ) HANGUL SYLLABLE GAEB +AC2E;AC2E;1100 1162 11B9;AC2E;1100 1162 11B9; # (갮; 갮; 갮; 갮; 갮; ) HANGUL SYLLABLE GAEBS +AC2F;AC2F;1100 1162 11BA;AC2F;1100 1162 11BA; # (갯; 갯; 갯; 갯; 갯; ) HANGUL SYLLABLE GAES +AC30;AC30;1100 1162 11BB;AC30;1100 1162 11BB; # (갰; 갰; 갰; 갰; 갰; ) HANGUL SYLLABLE GAESS +AC31;AC31;1100 1162 11BC;AC31;1100 1162 11BC; # (갱; 갱; 갱; 갱; 갱; ) HANGUL SYLLABLE GAENG +AC32;AC32;1100 1162 11BD;AC32;1100 1162 11BD; # (갲; 갲; 갲; 갲; 갲; ) HANGUL SYLLABLE GAEJ +AC33;AC33;1100 1162 11BE;AC33;1100 1162 11BE; # (갳; 갳; 갳; 갳; 갳; ) HANGUL SYLLABLE GAEC +AC34;AC34;1100 1162 11BF;AC34;1100 1162 11BF; # (갴; 갴; 갴; 갴; 갴; ) HANGUL SYLLABLE GAEK +AC35;AC35;1100 1162 11C0;AC35;1100 1162 11C0; # (갵; 갵; 갵; 갵; 갵; ) HANGUL SYLLABLE GAET +AC36;AC36;1100 1162 11C1;AC36;1100 1162 11C1; # (갶; 갶; 갶; 갶; 갶; ) HANGUL SYLLABLE GAEP +AC37;AC37;1100 1162 11C2;AC37;1100 1162 11C2; # (갷; 갷; 갷; 갷; 갷; ) HANGUL SYLLABLE GAEH +AC38;AC38;1100 1163;AC38;1100 1163; # (갸; 갸; 갸; 갸; 갸; ) HANGUL SYLLABLE GYA +AC39;AC39;1100 1163 11A8;AC39;1100 1163 11A8; # (갹; 갹; 갹; 갹; 갹; ) HANGUL SYLLABLE GYAG +AC3A;AC3A;1100 1163 11A9;AC3A;1100 1163 11A9; # (갺; 갺; 갺; 갺; 갺; ) HANGUL SYLLABLE GYAGG +AC3B;AC3B;1100 1163 11AA;AC3B;1100 1163 11AA; # (갻; 갻; 갻; 갻; 갻; ) HANGUL SYLLABLE GYAGS +AC3C;AC3C;1100 1163 11AB;AC3C;1100 1163 11AB; # (갼; 갼; 갼; 갼; 갼; ) HANGUL SYLLABLE GYAN +AC3D;AC3D;1100 1163 11AC;AC3D;1100 1163 11AC; # (갽; 갽; 갽; 갽; 갽; ) HANGUL SYLLABLE GYANJ +AC3E;AC3E;1100 1163 11AD;AC3E;1100 1163 11AD; # (갾; 갾; 갾; 갾; 갾; ) HANGUL SYLLABLE GYANH +AC3F;AC3F;1100 1163 11AE;AC3F;1100 1163 11AE; # (갿; 갿; 갿; 갿; 갿; ) HANGUL SYLLABLE GYAD +AC40;AC40;1100 1163 11AF;AC40;1100 1163 11AF; # (걀; 걀; 걀; 걀; 걀; ) HANGUL SYLLABLE GYAL +AC41;AC41;1100 1163 11B0;AC41;1100 1163 11B0; # (걁; 걁; 걁; 걁; 걁; ) HANGUL SYLLABLE GYALG +AC42;AC42;1100 1163 11B1;AC42;1100 1163 11B1; # (걂; 걂; 걂; 걂; 걂; ) HANGUL SYLLABLE GYALM +AC43;AC43;1100 1163 11B2;AC43;1100 1163 11B2; # (걃; 걃; 걃; 걃; 걃; ) HANGUL SYLLABLE GYALB +AC44;AC44;1100 1163 11B3;AC44;1100 1163 11B3; # (걄; 걄; 걄; 걄; 걄; ) HANGUL SYLLABLE GYALS +AC45;AC45;1100 1163 11B4;AC45;1100 1163 11B4; # (걅; 걅; 걅; 걅; 걅; ) HANGUL SYLLABLE GYALT +AC46;AC46;1100 1163 11B5;AC46;1100 1163 11B5; # (걆; 걆; 걆; 걆; 걆; ) HANGUL SYLLABLE GYALP +AC47;AC47;1100 1163 11B6;AC47;1100 1163 11B6; # (걇; 걇; 걇; 걇; 걇; ) HANGUL SYLLABLE GYALH +AC48;AC48;1100 1163 11B7;AC48;1100 1163 11B7; # (걈; 걈; 걈; 걈; 걈; ) HANGUL SYLLABLE GYAM +AC49;AC49;1100 1163 11B8;AC49;1100 1163 11B8; # (걉; 걉; 걉; 걉; 걉; ) HANGUL SYLLABLE GYAB +AC4A;AC4A;1100 1163 11B9;AC4A;1100 1163 11B9; # (걊; 걊; 걊; 걊; 걊; ) HANGUL SYLLABLE GYABS +AC4B;AC4B;1100 1163 11BA;AC4B;1100 1163 11BA; # (걋; 걋; 걋; 걋; 걋; ) HANGUL SYLLABLE GYAS +AC4C;AC4C;1100 1163 11BB;AC4C;1100 1163 11BB; # (걌; 걌; 걌; 걌; 걌; ) HANGUL SYLLABLE GYASS +AC4D;AC4D;1100 1163 11BC;AC4D;1100 1163 11BC; # (걍; 걍; 걍; 걍; 걍; ) HANGUL SYLLABLE GYANG +AC4E;AC4E;1100 1163 11BD;AC4E;1100 1163 11BD; # (걎; 걎; 걎; 걎; 걎; ) HANGUL SYLLABLE GYAJ +AC4F;AC4F;1100 1163 11BE;AC4F;1100 1163 11BE; # (걏; 걏; 걏; 걏; 걏; ) HANGUL SYLLABLE GYAC +AC50;AC50;1100 1163 11BF;AC50;1100 1163 11BF; # (걐; 걐; 걐; 걐; 걐; ) HANGUL SYLLABLE GYAK +AC51;AC51;1100 1163 11C0;AC51;1100 1163 11C0; # (걑; 걑; 걑; 걑; 걑; ) HANGUL SYLLABLE GYAT +AC52;AC52;1100 1163 11C1;AC52;1100 1163 11C1; # (걒; 걒; 걒; 걒; 걒; ) HANGUL SYLLABLE GYAP +AC53;AC53;1100 1163 11C2;AC53;1100 1163 11C2; # (걓; 걓; 걓; 걓; 걓; ) HANGUL SYLLABLE GYAH +AC54;AC54;1100 1164;AC54;1100 1164; # (걔; 걔; 걔; 걔; 걔; ) HANGUL SYLLABLE GYAE +AC55;AC55;1100 1164 11A8;AC55;1100 1164 11A8; # (걕; 걕; 걕; 걕; 걕; ) HANGUL SYLLABLE GYAEG +AC56;AC56;1100 1164 11A9;AC56;1100 1164 11A9; # (걖; 걖; 걖; 걖; 걖; ) HANGUL SYLLABLE GYAEGG +AC57;AC57;1100 1164 11AA;AC57;1100 1164 11AA; # (걗; 걗; 걗; 걗; 걗; ) HANGUL SYLLABLE GYAEGS +AC58;AC58;1100 1164 11AB;AC58;1100 1164 11AB; # (걘; 걘; 걘; 걘; 걘; ) HANGUL SYLLABLE GYAEN +AC59;AC59;1100 1164 11AC;AC59;1100 1164 11AC; # (걙; 걙; 걙; 걙; 걙; ) HANGUL SYLLABLE GYAENJ +AC5A;AC5A;1100 1164 11AD;AC5A;1100 1164 11AD; # (걚; 걚; 걚; 걚; 걚; ) HANGUL SYLLABLE GYAENH +AC5B;AC5B;1100 1164 11AE;AC5B;1100 1164 11AE; # (걛; 걛; 걛; 걛; 걛; ) HANGUL SYLLABLE GYAED +AC5C;AC5C;1100 1164 11AF;AC5C;1100 1164 11AF; # (걜; 걜; 걜; 걜; 걜; ) HANGUL SYLLABLE GYAEL +AC5D;AC5D;1100 1164 11B0;AC5D;1100 1164 11B0; # (걝; 걝; 걝; 걝; 걝; ) HANGUL SYLLABLE GYAELG +AC5E;AC5E;1100 1164 11B1;AC5E;1100 1164 11B1; # (걞; 걞; 걞; 걞; 걞; ) HANGUL SYLLABLE GYAELM +AC5F;AC5F;1100 1164 11B2;AC5F;1100 1164 11B2; # (걟; 걟; 걟; 걟; 걟; ) HANGUL SYLLABLE GYAELB +AC60;AC60;1100 1164 11B3;AC60;1100 1164 11B3; # (걠; 걠; 걠; 걠; 걠; ) HANGUL SYLLABLE GYAELS +AC61;AC61;1100 1164 11B4;AC61;1100 1164 11B4; # (걡; 걡; 걡; 걡; 걡; ) HANGUL SYLLABLE GYAELT +AC62;AC62;1100 1164 11B5;AC62;1100 1164 11B5; # (걢; 걢; 걢; 걢; 걢; ) HANGUL SYLLABLE GYAELP +AC63;AC63;1100 1164 11B6;AC63;1100 1164 11B6; # (걣; 걣; 걣; 걣; 걣; ) HANGUL SYLLABLE GYAELH +AC64;AC64;1100 1164 11B7;AC64;1100 1164 11B7; # (걤; 걤; 걤; 걤; 걤; ) HANGUL SYLLABLE GYAEM +AC65;AC65;1100 1164 11B8;AC65;1100 1164 11B8; # (걥; 걥; 걥; 걥; 걥; ) HANGUL SYLLABLE GYAEB +AC66;AC66;1100 1164 11B9;AC66;1100 1164 11B9; # (걦; 걦; 걦; 걦; 걦; ) HANGUL SYLLABLE GYAEBS +AC67;AC67;1100 1164 11BA;AC67;1100 1164 11BA; # (걧; 걧; 걧; 걧; 걧; ) HANGUL SYLLABLE GYAES +AC68;AC68;1100 1164 11BB;AC68;1100 1164 11BB; # (걨; 걨; 걨; 걨; 걨; ) HANGUL SYLLABLE GYAESS +AC69;AC69;1100 1164 11BC;AC69;1100 1164 11BC; # (걩; 걩; 걩; 걩; 걩; ) HANGUL SYLLABLE GYAENG +AC6A;AC6A;1100 1164 11BD;AC6A;1100 1164 11BD; # (걪; 걪; 걪; 걪; 걪; ) HANGUL SYLLABLE GYAEJ +AC6B;AC6B;1100 1164 11BE;AC6B;1100 1164 11BE; # (걫; 걫; 걫; 걫; 걫; ) HANGUL SYLLABLE GYAEC +AC6C;AC6C;1100 1164 11BF;AC6C;1100 1164 11BF; # (걬; 걬; 걬; 걬; 걬; ) HANGUL SYLLABLE GYAEK +AC6D;AC6D;1100 1164 11C0;AC6D;1100 1164 11C0; # (걭; 걭; 걭; 걭; 걭; ) HANGUL SYLLABLE GYAET +AC6E;AC6E;1100 1164 11C1;AC6E;1100 1164 11C1; # (걮; 걮; 걮; 걮; 걮; ) HANGUL SYLLABLE GYAEP +AC6F;AC6F;1100 1164 11C2;AC6F;1100 1164 11C2; # (걯; 걯; 걯; 걯; 걯; ) HANGUL SYLLABLE GYAEH +AC70;AC70;1100 1165;AC70;1100 1165; # (거; 거; 거; 거; 거; ) HANGUL SYLLABLE GEO +AC71;AC71;1100 1165 11A8;AC71;1100 1165 11A8; # (걱; 걱; 걱; 걱; 걱; ) HANGUL SYLLABLE GEOG +AC72;AC72;1100 1165 11A9;AC72;1100 1165 11A9; # (걲; 걲; 걲; 걲; 걲; ) HANGUL SYLLABLE GEOGG +AC73;AC73;1100 1165 11AA;AC73;1100 1165 11AA; # (걳; 걳; 걳; 걳; 걳; ) HANGUL SYLLABLE GEOGS +AC74;AC74;1100 1165 11AB;AC74;1100 1165 11AB; # (건; 건; 건; 건; 건; ) HANGUL SYLLABLE GEON +AC75;AC75;1100 1165 11AC;AC75;1100 1165 11AC; # (걵; 걵; 걵; 걵; 걵; ) HANGUL SYLLABLE GEONJ +AC76;AC76;1100 1165 11AD;AC76;1100 1165 11AD; # (걶; 걶; 걶; 걶; 걶; ) HANGUL SYLLABLE GEONH +AC77;AC77;1100 1165 11AE;AC77;1100 1165 11AE; # (걷; 걷; 걷; 걷; 걷; ) HANGUL SYLLABLE GEOD +AC78;AC78;1100 1165 11AF;AC78;1100 1165 11AF; # (걸; 걸; 걸; 걸; 걸; ) HANGUL SYLLABLE GEOL +AC79;AC79;1100 1165 11B0;AC79;1100 1165 11B0; # (걹; 걹; 걹; 걹; 걹; ) HANGUL SYLLABLE GEOLG +AC7A;AC7A;1100 1165 11B1;AC7A;1100 1165 11B1; # (걺; 걺; 걺; 걺; 걺; ) HANGUL SYLLABLE GEOLM +AC7B;AC7B;1100 1165 11B2;AC7B;1100 1165 11B2; # (걻; 걻; 걻; 걻; 걻; ) HANGUL SYLLABLE GEOLB +AC7C;AC7C;1100 1165 11B3;AC7C;1100 1165 11B3; # (걼; 걼; 걼; 걼; 걼; ) HANGUL SYLLABLE GEOLS +AC7D;AC7D;1100 1165 11B4;AC7D;1100 1165 11B4; # (걽; 걽; 걽; 걽; 걽; ) HANGUL SYLLABLE GEOLT +AC7E;AC7E;1100 1165 11B5;AC7E;1100 1165 11B5; # (걾; 걾; 걾; 걾; 걾; ) HANGUL SYLLABLE GEOLP +AC7F;AC7F;1100 1165 11B6;AC7F;1100 1165 11B6; # (걿; 걿; 걿; 걿; 걿; ) HANGUL SYLLABLE GEOLH +AC80;AC80;1100 1165 11B7;AC80;1100 1165 11B7; # (검; 검; 검; 검; 검; ) HANGUL SYLLABLE GEOM +AC81;AC81;1100 1165 11B8;AC81;1100 1165 11B8; # (겁; 겁; 겁; 겁; 겁; ) HANGUL SYLLABLE GEOB +AC82;AC82;1100 1165 11B9;AC82;1100 1165 11B9; # (겂; 겂; 겂; 겂; 겂; ) HANGUL SYLLABLE GEOBS +AC83;AC83;1100 1165 11BA;AC83;1100 1165 11BA; # (것; 것; 것; 것; 것; ) HANGUL SYLLABLE GEOS +AC84;AC84;1100 1165 11BB;AC84;1100 1165 11BB; # (겄; 겄; 겄; 겄; 겄; ) HANGUL SYLLABLE GEOSS +AC85;AC85;1100 1165 11BC;AC85;1100 1165 11BC; # (겅; 겅; 겅; 겅; 겅; ) HANGUL SYLLABLE GEONG +AC86;AC86;1100 1165 11BD;AC86;1100 1165 11BD; # (겆; 겆; 겆; 겆; 겆; ) HANGUL SYLLABLE GEOJ +AC87;AC87;1100 1165 11BE;AC87;1100 1165 11BE; # (겇; 겇; 겇; 겇; 겇; ) HANGUL SYLLABLE GEOC +AC88;AC88;1100 1165 11BF;AC88;1100 1165 11BF; # (겈; 겈; 겈; 겈; 겈; ) HANGUL SYLLABLE GEOK +AC89;AC89;1100 1165 11C0;AC89;1100 1165 11C0; # (겉; 겉; 겉; 겉; 겉; ) HANGUL SYLLABLE GEOT +AC8A;AC8A;1100 1165 11C1;AC8A;1100 1165 11C1; # (겊; 겊; 겊; 겊; 겊; ) HANGUL SYLLABLE GEOP +AC8B;AC8B;1100 1165 11C2;AC8B;1100 1165 11C2; # (겋; 겋; 겋; 겋; 겋; ) HANGUL SYLLABLE GEOH +AC8C;AC8C;1100 1166;AC8C;1100 1166; # (게; 게; 게; 게; 게; ) HANGUL SYLLABLE GE +AC8D;AC8D;1100 1166 11A8;AC8D;1100 1166 11A8; # (겍; 겍; 겍; 겍; 겍; ) HANGUL SYLLABLE GEG +AC8E;AC8E;1100 1166 11A9;AC8E;1100 1166 11A9; # (겎; 겎; 겎; 겎; 겎; ) HANGUL SYLLABLE GEGG +AC8F;AC8F;1100 1166 11AA;AC8F;1100 1166 11AA; # (겏; 겏; 겏; 겏; 겏; ) HANGUL SYLLABLE GEGS +AC90;AC90;1100 1166 11AB;AC90;1100 1166 11AB; # (겐; 겐; 겐; 겐; 겐; ) HANGUL SYLLABLE GEN +AC91;AC91;1100 1166 11AC;AC91;1100 1166 11AC; # (겑; 겑; 겑; 겑; 겑; ) HANGUL SYLLABLE GENJ +AC92;AC92;1100 1166 11AD;AC92;1100 1166 11AD; # (겒; 겒; 겒; 겒; 겒; ) HANGUL SYLLABLE GENH +AC93;AC93;1100 1166 11AE;AC93;1100 1166 11AE; # (겓; 겓; 겓; 겓; 겓; ) HANGUL SYLLABLE GED +AC94;AC94;1100 1166 11AF;AC94;1100 1166 11AF; # (겔; 겔; 겔; 겔; 겔; ) HANGUL SYLLABLE GEL +AC95;AC95;1100 1166 11B0;AC95;1100 1166 11B0; # (겕; 겕; 겕; 겕; 겕; ) HANGUL SYLLABLE GELG +AC96;AC96;1100 1166 11B1;AC96;1100 1166 11B1; # (겖; 겖; 겖; 겖; 겖; ) HANGUL SYLLABLE GELM +AC97;AC97;1100 1166 11B2;AC97;1100 1166 11B2; # (겗; 겗; 겗; 겗; 겗; ) HANGUL SYLLABLE GELB +AC98;AC98;1100 1166 11B3;AC98;1100 1166 11B3; # (겘; 겘; 겘; 겘; 겘; ) HANGUL SYLLABLE GELS +AC99;AC99;1100 1166 11B4;AC99;1100 1166 11B4; # (겙; 겙; 겙; 겙; 겙; ) HANGUL SYLLABLE GELT +AC9A;AC9A;1100 1166 11B5;AC9A;1100 1166 11B5; # (겚; 겚; 겚; 겚; 겚; ) HANGUL SYLLABLE GELP +AC9B;AC9B;1100 1166 11B6;AC9B;1100 1166 11B6; # (겛; 겛; 겛; 겛; 겛; ) HANGUL SYLLABLE GELH +AC9C;AC9C;1100 1166 11B7;AC9C;1100 1166 11B7; # (겜; 겜; 겜; 겜; 겜; ) HANGUL SYLLABLE GEM +AC9D;AC9D;1100 1166 11B8;AC9D;1100 1166 11B8; # (겝; 겝; 겝; 겝; 겝; ) HANGUL SYLLABLE GEB +AC9E;AC9E;1100 1166 11B9;AC9E;1100 1166 11B9; # (겞; 겞; 겞; 겞; 겞; ) HANGUL SYLLABLE GEBS +AC9F;AC9F;1100 1166 11BA;AC9F;1100 1166 11BA; # (겟; 겟; 겟; 겟; 겟; ) HANGUL SYLLABLE GES +ACA0;ACA0;1100 1166 11BB;ACA0;1100 1166 11BB; # (겠; 겠; 겠; 겠; 겠; ) HANGUL SYLLABLE GESS +ACA1;ACA1;1100 1166 11BC;ACA1;1100 1166 11BC; # (겡; 겡; 겡; 겡; 겡; ) HANGUL SYLLABLE GENG +ACA2;ACA2;1100 1166 11BD;ACA2;1100 1166 11BD; # (겢; 겢; 겢; 겢; 겢; ) HANGUL SYLLABLE GEJ +ACA3;ACA3;1100 1166 11BE;ACA3;1100 1166 11BE; # (겣; 겣; 겣; 겣; 겣; ) HANGUL SYLLABLE GEC +ACA4;ACA4;1100 1166 11BF;ACA4;1100 1166 11BF; # (겤; 겤; 겤; 겤; 겤; ) HANGUL SYLLABLE GEK +ACA5;ACA5;1100 1166 11C0;ACA5;1100 1166 11C0; # (겥; 겥; 겥; 겥; 겥; ) HANGUL SYLLABLE GET +ACA6;ACA6;1100 1166 11C1;ACA6;1100 1166 11C1; # (겦; 겦; 겦; 겦; 겦; ) HANGUL SYLLABLE GEP +ACA7;ACA7;1100 1166 11C2;ACA7;1100 1166 11C2; # (겧; 겧; 겧; 겧; 겧; ) HANGUL SYLLABLE GEH +ACA8;ACA8;1100 1167;ACA8;1100 1167; # (겨; 겨; 겨; 겨; 겨; ) HANGUL SYLLABLE GYEO +ACA9;ACA9;1100 1167 11A8;ACA9;1100 1167 11A8; # (격; 격; 격; 격; 격; ) HANGUL SYLLABLE GYEOG +ACAA;ACAA;1100 1167 11A9;ACAA;1100 1167 11A9; # (겪; 겪; 겪; 겪; 겪; ) HANGUL SYLLABLE GYEOGG +ACAB;ACAB;1100 1167 11AA;ACAB;1100 1167 11AA; # (겫; 겫; 겫; 겫; 겫; ) HANGUL SYLLABLE GYEOGS +ACAC;ACAC;1100 1167 11AB;ACAC;1100 1167 11AB; # (견; 견; 견; 견; 견; ) HANGUL SYLLABLE GYEON +ACAD;ACAD;1100 1167 11AC;ACAD;1100 1167 11AC; # (겭; 겭; 겭; 겭; 겭; ) HANGUL SYLLABLE GYEONJ +ACAE;ACAE;1100 1167 11AD;ACAE;1100 1167 11AD; # (겮; 겮; 겮; 겮; 겮; ) HANGUL SYLLABLE GYEONH +ACAF;ACAF;1100 1167 11AE;ACAF;1100 1167 11AE; # (겯; 겯; 겯; 겯; 겯; ) HANGUL SYLLABLE GYEOD +ACB0;ACB0;1100 1167 11AF;ACB0;1100 1167 11AF; # (결; 결; 결; 결; 결; ) HANGUL SYLLABLE GYEOL +ACB1;ACB1;1100 1167 11B0;ACB1;1100 1167 11B0; # (겱; 겱; 겱; 겱; 겱; ) HANGUL SYLLABLE GYEOLG +ACB2;ACB2;1100 1167 11B1;ACB2;1100 1167 11B1; # (겲; 겲; 겲; 겲; 겲; ) HANGUL SYLLABLE GYEOLM +ACB3;ACB3;1100 1167 11B2;ACB3;1100 1167 11B2; # (겳; 겳; 겳; 겳; 겳; ) HANGUL SYLLABLE GYEOLB +ACB4;ACB4;1100 1167 11B3;ACB4;1100 1167 11B3; # (겴; 겴; 겴; 겴; 겴; ) HANGUL SYLLABLE GYEOLS +ACB5;ACB5;1100 1167 11B4;ACB5;1100 1167 11B4; # (겵; 겵; 겵; 겵; 겵; ) HANGUL SYLLABLE GYEOLT +ACB6;ACB6;1100 1167 11B5;ACB6;1100 1167 11B5; # (겶; 겶; 겶; 겶; 겶; ) HANGUL SYLLABLE GYEOLP +ACB7;ACB7;1100 1167 11B6;ACB7;1100 1167 11B6; # (겷; 겷; 겷; 겷; 겷; ) HANGUL SYLLABLE GYEOLH +ACB8;ACB8;1100 1167 11B7;ACB8;1100 1167 11B7; # (겸; 겸; 겸; 겸; 겸; ) HANGUL SYLLABLE GYEOM +ACB9;ACB9;1100 1167 11B8;ACB9;1100 1167 11B8; # (겹; 겹; 겹; 겹; 겹; ) HANGUL SYLLABLE GYEOB +ACBA;ACBA;1100 1167 11B9;ACBA;1100 1167 11B9; # (겺; 겺; 겺; 겺; 겺; ) HANGUL SYLLABLE GYEOBS +ACBB;ACBB;1100 1167 11BA;ACBB;1100 1167 11BA; # (겻; 겻; 겻; 겻; 겻; ) HANGUL SYLLABLE GYEOS +ACBC;ACBC;1100 1167 11BB;ACBC;1100 1167 11BB; # (겼; 겼; 겼; 겼; 겼; ) HANGUL SYLLABLE GYEOSS +ACBD;ACBD;1100 1167 11BC;ACBD;1100 1167 11BC; # (경; 경; 경; 경; 경; ) HANGUL SYLLABLE GYEONG +ACBE;ACBE;1100 1167 11BD;ACBE;1100 1167 11BD; # (겾; 겾; 겾; 겾; 겾; ) HANGUL SYLLABLE GYEOJ +ACBF;ACBF;1100 1167 11BE;ACBF;1100 1167 11BE; # (겿; 겿; 겿; 겿; 겿; ) HANGUL SYLLABLE GYEOC +ACC0;ACC0;1100 1167 11BF;ACC0;1100 1167 11BF; # (곀; 곀; 곀; 곀; 곀; ) HANGUL SYLLABLE GYEOK +ACC1;ACC1;1100 1167 11C0;ACC1;1100 1167 11C0; # (곁; 곁; 곁; 곁; 곁; ) HANGUL SYLLABLE GYEOT +ACC2;ACC2;1100 1167 11C1;ACC2;1100 1167 11C1; # (곂; 곂; 곂; 곂; 곂; ) HANGUL SYLLABLE GYEOP +ACC3;ACC3;1100 1167 11C2;ACC3;1100 1167 11C2; # (곃; 곃; 곃; 곃; 곃; ) HANGUL SYLLABLE GYEOH +ACC4;ACC4;1100 1168;ACC4;1100 1168; # (계; 계; 계; 계; 계; ) HANGUL SYLLABLE GYE +ACC5;ACC5;1100 1168 11A8;ACC5;1100 1168 11A8; # (곅; 곅; 곅; 곅; 곅; ) HANGUL SYLLABLE GYEG +ACC6;ACC6;1100 1168 11A9;ACC6;1100 1168 11A9; # (곆; 곆; 곆; 곆; 곆; ) HANGUL SYLLABLE GYEGG +ACC7;ACC7;1100 1168 11AA;ACC7;1100 1168 11AA; # (곇; 곇; 곇; 곇; 곇; ) HANGUL SYLLABLE GYEGS +ACC8;ACC8;1100 1168 11AB;ACC8;1100 1168 11AB; # (곈; 곈; 곈; 곈; 곈; ) HANGUL SYLLABLE GYEN +ACC9;ACC9;1100 1168 11AC;ACC9;1100 1168 11AC; # (곉; 곉; 곉; 곉; 곉; ) HANGUL SYLLABLE GYENJ +ACCA;ACCA;1100 1168 11AD;ACCA;1100 1168 11AD; # (곊; 곊; 곊; 곊; 곊; ) HANGUL SYLLABLE GYENH +ACCB;ACCB;1100 1168 11AE;ACCB;1100 1168 11AE; # (곋; 곋; 곋; 곋; 곋; ) HANGUL SYLLABLE GYED +ACCC;ACCC;1100 1168 11AF;ACCC;1100 1168 11AF; # (곌; 곌; 곌; 곌; 곌; ) HANGUL SYLLABLE GYEL +ACCD;ACCD;1100 1168 11B0;ACCD;1100 1168 11B0; # (곍; 곍; 곍; 곍; 곍; ) HANGUL SYLLABLE GYELG +ACCE;ACCE;1100 1168 11B1;ACCE;1100 1168 11B1; # (곎; 곎; 곎; 곎; 곎; ) HANGUL SYLLABLE GYELM +ACCF;ACCF;1100 1168 11B2;ACCF;1100 1168 11B2; # (곏; 곏; 곏; 곏; 곏; ) HANGUL SYLLABLE GYELB +ACD0;ACD0;1100 1168 11B3;ACD0;1100 1168 11B3; # (곐; 곐; 곐; 곐; 곐; ) HANGUL SYLLABLE GYELS +ACD1;ACD1;1100 1168 11B4;ACD1;1100 1168 11B4; # (곑; 곑; 곑; 곑; 곑; ) HANGUL SYLLABLE GYELT +ACD2;ACD2;1100 1168 11B5;ACD2;1100 1168 11B5; # (곒; 곒; 곒; 곒; 곒; ) HANGUL SYLLABLE GYELP +ACD3;ACD3;1100 1168 11B6;ACD3;1100 1168 11B6; # (곓; 곓; 곓; 곓; 곓; ) HANGUL SYLLABLE GYELH +ACD4;ACD4;1100 1168 11B7;ACD4;1100 1168 11B7; # (곔; 곔; 곔; 곔; 곔; ) HANGUL SYLLABLE GYEM +ACD5;ACD5;1100 1168 11B8;ACD5;1100 1168 11B8; # (곕; 곕; 곕; 곕; 곕; ) HANGUL SYLLABLE GYEB +ACD6;ACD6;1100 1168 11B9;ACD6;1100 1168 11B9; # (곖; 곖; 곖; 곖; 곖; ) HANGUL SYLLABLE GYEBS +ACD7;ACD7;1100 1168 11BA;ACD7;1100 1168 11BA; # (곗; 곗; 곗; 곗; 곗; ) HANGUL SYLLABLE GYES +ACD8;ACD8;1100 1168 11BB;ACD8;1100 1168 11BB; # (곘; 곘; 곘; 곘; 곘; ) HANGUL SYLLABLE GYESS +ACD9;ACD9;1100 1168 11BC;ACD9;1100 1168 11BC; # (곙; 곙; 곙; 곙; 곙; ) HANGUL SYLLABLE GYENG +ACDA;ACDA;1100 1168 11BD;ACDA;1100 1168 11BD; # (곚; 곚; 곚; 곚; 곚; ) HANGUL SYLLABLE GYEJ +ACDB;ACDB;1100 1168 11BE;ACDB;1100 1168 11BE; # (곛; 곛; 곛; 곛; 곛; ) HANGUL SYLLABLE GYEC +ACDC;ACDC;1100 1168 11BF;ACDC;1100 1168 11BF; # (곜; 곜; 곜; 곜; 곜; ) HANGUL SYLLABLE GYEK +ACDD;ACDD;1100 1168 11C0;ACDD;1100 1168 11C0; # (곝; 곝; 곝; 곝; 곝; ) HANGUL SYLLABLE GYET +ACDE;ACDE;1100 1168 11C1;ACDE;1100 1168 11C1; # (곞; 곞; 곞; 곞; 곞; ) HANGUL SYLLABLE GYEP +ACDF;ACDF;1100 1168 11C2;ACDF;1100 1168 11C2; # (곟; 곟; 곟; 곟; 곟; ) HANGUL SYLLABLE GYEH +ACE0;ACE0;1100 1169;ACE0;1100 1169; # (고; 고; 고; 고; 고; ) HANGUL SYLLABLE GO +ACE1;ACE1;1100 1169 11A8;ACE1;1100 1169 11A8; # (곡; 곡; 곡; 곡; 곡; ) HANGUL SYLLABLE GOG +ACE2;ACE2;1100 1169 11A9;ACE2;1100 1169 11A9; # (곢; 곢; 곢; 곢; 곢; ) HANGUL SYLLABLE GOGG +ACE3;ACE3;1100 1169 11AA;ACE3;1100 1169 11AA; # (곣; 곣; 곣; 곣; 곣; ) HANGUL SYLLABLE GOGS +ACE4;ACE4;1100 1169 11AB;ACE4;1100 1169 11AB; # (곤; 곤; 곤; 곤; 곤; ) HANGUL SYLLABLE GON +ACE5;ACE5;1100 1169 11AC;ACE5;1100 1169 11AC; # (곥; 곥; 곥; 곥; 곥; ) HANGUL SYLLABLE GONJ +ACE6;ACE6;1100 1169 11AD;ACE6;1100 1169 11AD; # (곦; 곦; 곦; 곦; 곦; ) HANGUL SYLLABLE GONH +ACE7;ACE7;1100 1169 11AE;ACE7;1100 1169 11AE; # (곧; 곧; 곧; 곧; 곧; ) HANGUL SYLLABLE GOD +ACE8;ACE8;1100 1169 11AF;ACE8;1100 1169 11AF; # (골; 골; 골; 골; 골; ) HANGUL SYLLABLE GOL +ACE9;ACE9;1100 1169 11B0;ACE9;1100 1169 11B0; # (곩; 곩; 곩; 곩; 곩; ) HANGUL SYLLABLE GOLG +ACEA;ACEA;1100 1169 11B1;ACEA;1100 1169 11B1; # (곪; 곪; 곪; 곪; 곪; ) HANGUL SYLLABLE GOLM +ACEB;ACEB;1100 1169 11B2;ACEB;1100 1169 11B2; # (곫; 곫; 곫; 곫; 곫; ) HANGUL SYLLABLE GOLB +ACEC;ACEC;1100 1169 11B3;ACEC;1100 1169 11B3; # (곬; 곬; 곬; 곬; 곬; ) HANGUL SYLLABLE GOLS +ACED;ACED;1100 1169 11B4;ACED;1100 1169 11B4; # (곭; 곭; 곭; 곭; 곭; ) HANGUL SYLLABLE GOLT +ACEE;ACEE;1100 1169 11B5;ACEE;1100 1169 11B5; # (곮; 곮; 곮; 곮; 곮; ) HANGUL SYLLABLE GOLP +ACEF;ACEF;1100 1169 11B6;ACEF;1100 1169 11B6; # (곯; 곯; 곯; 곯; 곯; ) HANGUL SYLLABLE GOLH +ACF0;ACF0;1100 1169 11B7;ACF0;1100 1169 11B7; # (곰; 곰; 곰; 곰; 곰; ) HANGUL SYLLABLE GOM +ACF1;ACF1;1100 1169 11B8;ACF1;1100 1169 11B8; # (곱; 곱; 곱; 곱; 곱; ) HANGUL SYLLABLE GOB +ACF2;ACF2;1100 1169 11B9;ACF2;1100 1169 11B9; # (곲; 곲; 곲; 곲; 곲; ) HANGUL SYLLABLE GOBS +ACF3;ACF3;1100 1169 11BA;ACF3;1100 1169 11BA; # (곳; 곳; 곳; 곳; 곳; ) HANGUL SYLLABLE GOS +ACF4;ACF4;1100 1169 11BB;ACF4;1100 1169 11BB; # (곴; 곴; 곴; 곴; 곴; ) HANGUL SYLLABLE GOSS +ACF5;ACF5;1100 1169 11BC;ACF5;1100 1169 11BC; # (공; 공; 공; 공; 공; ) HANGUL SYLLABLE GONG +ACF6;ACF6;1100 1169 11BD;ACF6;1100 1169 11BD; # (곶; 곶; 곶; 곶; 곶; ) HANGUL SYLLABLE GOJ +ACF7;ACF7;1100 1169 11BE;ACF7;1100 1169 11BE; # (곷; 곷; 곷; 곷; 곷; ) HANGUL SYLLABLE GOC +ACF8;ACF8;1100 1169 11BF;ACF8;1100 1169 11BF; # (곸; 곸; 곸; 곸; 곸; ) HANGUL SYLLABLE GOK +ACF9;ACF9;1100 1169 11C0;ACF9;1100 1169 11C0; # (곹; 곹; 곹; 곹; 곹; ) HANGUL SYLLABLE GOT +ACFA;ACFA;1100 1169 11C1;ACFA;1100 1169 11C1; # (곺; 곺; 곺; 곺; 곺; ) HANGUL SYLLABLE GOP +ACFB;ACFB;1100 1169 11C2;ACFB;1100 1169 11C2; # (곻; 곻; 곻; 곻; 곻; ) HANGUL SYLLABLE GOH +ACFC;ACFC;1100 116A;ACFC;1100 116A; # (과; 과; 과; 과; 과; ) HANGUL SYLLABLE GWA +ACFD;ACFD;1100 116A 11A8;ACFD;1100 116A 11A8; # (곽; 곽; 곽; 곽; 곽; ) HANGUL SYLLABLE GWAG +ACFE;ACFE;1100 116A 11A9;ACFE;1100 116A 11A9; # (곾; 곾; 곾; 곾; 곾; ) HANGUL SYLLABLE GWAGG +ACFF;ACFF;1100 116A 11AA;ACFF;1100 116A 11AA; # (곿; 곿; 곿; 곿; 곿; ) HANGUL SYLLABLE GWAGS +AD00;AD00;1100 116A 11AB;AD00;1100 116A 11AB; # (관; 관; 관; 관; 관; ) HANGUL SYLLABLE GWAN +AD01;AD01;1100 116A 11AC;AD01;1100 116A 11AC; # (괁; 괁; 괁; 괁; 괁; ) HANGUL SYLLABLE GWANJ +AD02;AD02;1100 116A 11AD;AD02;1100 116A 11AD; # (괂; 괂; 괂; 괂; 괂; ) HANGUL SYLLABLE GWANH +AD03;AD03;1100 116A 11AE;AD03;1100 116A 11AE; # (괃; 괃; 괃; 괃; 괃; ) HANGUL SYLLABLE GWAD +AD04;AD04;1100 116A 11AF;AD04;1100 116A 11AF; # (괄; 괄; 괄; 괄; 괄; ) HANGUL SYLLABLE GWAL +AD05;AD05;1100 116A 11B0;AD05;1100 116A 11B0; # (괅; 괅; 괅; 괅; 괅; ) HANGUL SYLLABLE GWALG +AD06;AD06;1100 116A 11B1;AD06;1100 116A 11B1; # (괆; 괆; 괆; 괆; 괆; ) HANGUL SYLLABLE GWALM +AD07;AD07;1100 116A 11B2;AD07;1100 116A 11B2; # (괇; 괇; 괇; 괇; 괇; ) HANGUL SYLLABLE GWALB +AD08;AD08;1100 116A 11B3;AD08;1100 116A 11B3; # (괈; 괈; 괈; 괈; 괈; ) HANGUL SYLLABLE GWALS +AD09;AD09;1100 116A 11B4;AD09;1100 116A 11B4; # (괉; 괉; 괉; 괉; 괉; ) HANGUL SYLLABLE GWALT +AD0A;AD0A;1100 116A 11B5;AD0A;1100 116A 11B5; # (괊; 괊; 괊; 괊; 괊; ) HANGUL SYLLABLE GWALP +AD0B;AD0B;1100 116A 11B6;AD0B;1100 116A 11B6; # (괋; 괋; 괋; 괋; 괋; ) HANGUL SYLLABLE GWALH +AD0C;AD0C;1100 116A 11B7;AD0C;1100 116A 11B7; # (괌; 괌; 괌; 괌; 괌; ) HANGUL SYLLABLE GWAM +AD0D;AD0D;1100 116A 11B8;AD0D;1100 116A 11B8; # (괍; 괍; 괍; 괍; 괍; ) HANGUL SYLLABLE GWAB +AD0E;AD0E;1100 116A 11B9;AD0E;1100 116A 11B9; # (괎; 괎; 괎; 괎; 괎; ) HANGUL SYLLABLE GWABS +AD0F;AD0F;1100 116A 11BA;AD0F;1100 116A 11BA; # (괏; 괏; 괏; 괏; 괏; ) HANGUL SYLLABLE GWAS +AD10;AD10;1100 116A 11BB;AD10;1100 116A 11BB; # (괐; 괐; 괐; 괐; 괐; ) HANGUL SYLLABLE GWASS +AD11;AD11;1100 116A 11BC;AD11;1100 116A 11BC; # (광; 광; 광; 광; 광; ) HANGUL SYLLABLE GWANG +AD12;AD12;1100 116A 11BD;AD12;1100 116A 11BD; # (괒; 괒; 괒; 괒; 괒; ) HANGUL SYLLABLE GWAJ +AD13;AD13;1100 116A 11BE;AD13;1100 116A 11BE; # (괓; 괓; 괓; 괓; 괓; ) HANGUL SYLLABLE GWAC +AD14;AD14;1100 116A 11BF;AD14;1100 116A 11BF; # (괔; 괔; 괔; 괔; 괔; ) HANGUL SYLLABLE GWAK +AD15;AD15;1100 116A 11C0;AD15;1100 116A 11C0; # (괕; 괕; 괕; 괕; 괕; ) HANGUL SYLLABLE GWAT +AD16;AD16;1100 116A 11C1;AD16;1100 116A 11C1; # (괖; 괖; 괖; 괖; 괖; ) HANGUL SYLLABLE GWAP +AD17;AD17;1100 116A 11C2;AD17;1100 116A 11C2; # (괗; 괗; 괗; 괗; 괗; ) HANGUL SYLLABLE GWAH +AD18;AD18;1100 116B;AD18;1100 116B; # (괘; 괘; 괘; 괘; 괘; ) HANGUL SYLLABLE GWAE +AD19;AD19;1100 116B 11A8;AD19;1100 116B 11A8; # (괙; 괙; 괙; 괙; 괙; ) HANGUL SYLLABLE GWAEG +AD1A;AD1A;1100 116B 11A9;AD1A;1100 116B 11A9; # (괚; 괚; 괚; 괚; 괚; ) HANGUL SYLLABLE GWAEGG +AD1B;AD1B;1100 116B 11AA;AD1B;1100 116B 11AA; # (괛; 괛; 괛; 괛; 괛; ) HANGUL SYLLABLE GWAEGS +AD1C;AD1C;1100 116B 11AB;AD1C;1100 116B 11AB; # (괜; 괜; 괜; 괜; 괜; ) HANGUL SYLLABLE GWAEN +AD1D;AD1D;1100 116B 11AC;AD1D;1100 116B 11AC; # (괝; 괝; 괝; 괝; 괝; ) HANGUL SYLLABLE GWAENJ +AD1E;AD1E;1100 116B 11AD;AD1E;1100 116B 11AD; # (괞; 괞; 괞; 괞; 괞; ) HANGUL SYLLABLE GWAENH +AD1F;AD1F;1100 116B 11AE;AD1F;1100 116B 11AE; # (괟; 괟; 괟; 괟; 괟; ) HANGUL SYLLABLE GWAED +AD20;AD20;1100 116B 11AF;AD20;1100 116B 11AF; # (괠; 괠; 괠; 괠; 괠; ) HANGUL SYLLABLE GWAEL +AD21;AD21;1100 116B 11B0;AD21;1100 116B 11B0; # (괡; 괡; 괡; 괡; 괡; ) HANGUL SYLLABLE GWAELG +AD22;AD22;1100 116B 11B1;AD22;1100 116B 11B1; # (괢; 괢; 괢; 괢; 괢; ) HANGUL SYLLABLE GWAELM +AD23;AD23;1100 116B 11B2;AD23;1100 116B 11B2; # (괣; 괣; 괣; 괣; 괣; ) HANGUL SYLLABLE GWAELB +AD24;AD24;1100 116B 11B3;AD24;1100 116B 11B3; # (괤; 괤; 괤; 괤; 괤; ) HANGUL SYLLABLE GWAELS +AD25;AD25;1100 116B 11B4;AD25;1100 116B 11B4; # (괥; 괥; 괥; 괥; 괥; ) HANGUL SYLLABLE GWAELT +AD26;AD26;1100 116B 11B5;AD26;1100 116B 11B5; # (괦; 괦; 괦; 괦; 괦; ) HANGUL SYLLABLE GWAELP +AD27;AD27;1100 116B 11B6;AD27;1100 116B 11B6; # (괧; 괧; 괧; 괧; 괧; ) HANGUL SYLLABLE GWAELH +AD28;AD28;1100 116B 11B7;AD28;1100 116B 11B7; # (괨; 괨; 괨; 괨; 괨; ) HANGUL SYLLABLE GWAEM +AD29;AD29;1100 116B 11B8;AD29;1100 116B 11B8; # (괩; 괩; 괩; 괩; 괩; ) HANGUL SYLLABLE GWAEB +AD2A;AD2A;1100 116B 11B9;AD2A;1100 116B 11B9; # (괪; 괪; 괪; 괪; 괪; ) HANGUL SYLLABLE GWAEBS +AD2B;AD2B;1100 116B 11BA;AD2B;1100 116B 11BA; # (괫; 괫; 괫; 괫; 괫; ) HANGUL SYLLABLE GWAES +AD2C;AD2C;1100 116B 11BB;AD2C;1100 116B 11BB; # (괬; 괬; 괬; 괬; 괬; ) HANGUL SYLLABLE GWAESS +AD2D;AD2D;1100 116B 11BC;AD2D;1100 116B 11BC; # (괭; 괭; 괭; 괭; 괭; ) HANGUL SYLLABLE GWAENG +AD2E;AD2E;1100 116B 11BD;AD2E;1100 116B 11BD; # (괮; 괮; 괮; 괮; 괮; ) HANGUL SYLLABLE GWAEJ +AD2F;AD2F;1100 116B 11BE;AD2F;1100 116B 11BE; # (괯; 괯; 괯; 괯; 괯; ) HANGUL SYLLABLE GWAEC +AD30;AD30;1100 116B 11BF;AD30;1100 116B 11BF; # (괰; 괰; 괰; 괰; 괰; ) HANGUL SYLLABLE GWAEK +AD31;AD31;1100 116B 11C0;AD31;1100 116B 11C0; # (괱; 괱; 괱; 괱; 괱; ) HANGUL SYLLABLE GWAET +AD32;AD32;1100 116B 11C1;AD32;1100 116B 11C1; # (괲; 괲; 괲; 괲; 괲; ) HANGUL SYLLABLE GWAEP +AD33;AD33;1100 116B 11C2;AD33;1100 116B 11C2; # (괳; 괳; 괳; 괳; 괳; ) HANGUL SYLLABLE GWAEH +AD34;AD34;1100 116C;AD34;1100 116C; # (괴; 괴; 괴; 괴; 괴; ) HANGUL SYLLABLE GOE +AD35;AD35;1100 116C 11A8;AD35;1100 116C 11A8; # (괵; 괵; 괵; 괵; 괵; ) HANGUL SYLLABLE GOEG +AD36;AD36;1100 116C 11A9;AD36;1100 116C 11A9; # (괶; 괶; 괶; 괶; 괶; ) HANGUL SYLLABLE GOEGG +AD37;AD37;1100 116C 11AA;AD37;1100 116C 11AA; # (괷; 괷; 괷; 괷; 괷; ) HANGUL SYLLABLE GOEGS +AD38;AD38;1100 116C 11AB;AD38;1100 116C 11AB; # (괸; 괸; 괸; 괸; 괸; ) HANGUL SYLLABLE GOEN +AD39;AD39;1100 116C 11AC;AD39;1100 116C 11AC; # (괹; 괹; 괹; 괹; 괹; ) HANGUL SYLLABLE GOENJ +AD3A;AD3A;1100 116C 11AD;AD3A;1100 116C 11AD; # (괺; 괺; 괺; 괺; 괺; ) HANGUL SYLLABLE GOENH +AD3B;AD3B;1100 116C 11AE;AD3B;1100 116C 11AE; # (괻; 괻; 괻; 괻; 괻; ) HANGUL SYLLABLE GOED +AD3C;AD3C;1100 116C 11AF;AD3C;1100 116C 11AF; # (괼; 괼; 괼; 괼; 괼; ) HANGUL SYLLABLE GOEL +AD3D;AD3D;1100 116C 11B0;AD3D;1100 116C 11B0; # (괽; 괽; 괽; 괽; 괽; ) HANGUL SYLLABLE GOELG +AD3E;AD3E;1100 116C 11B1;AD3E;1100 116C 11B1; # (괾; 괾; 괾; 괾; 괾; ) HANGUL SYLLABLE GOELM +AD3F;AD3F;1100 116C 11B2;AD3F;1100 116C 11B2; # (괿; 괿; 괿; 괿; 괿; ) HANGUL SYLLABLE GOELB +AD40;AD40;1100 116C 11B3;AD40;1100 116C 11B3; # (굀; 굀; 굀; 굀; 굀; ) HANGUL SYLLABLE GOELS +AD41;AD41;1100 116C 11B4;AD41;1100 116C 11B4; # (굁; 굁; 굁; 굁; 굁; ) HANGUL SYLLABLE GOELT +AD42;AD42;1100 116C 11B5;AD42;1100 116C 11B5; # (굂; 굂; 굂; 굂; 굂; ) HANGUL SYLLABLE GOELP +AD43;AD43;1100 116C 11B6;AD43;1100 116C 11B6; # (굃; 굃; 굃; 굃; 굃; ) HANGUL SYLLABLE GOELH +AD44;AD44;1100 116C 11B7;AD44;1100 116C 11B7; # (굄; 굄; 굄; 굄; 굄; ) HANGUL SYLLABLE GOEM +AD45;AD45;1100 116C 11B8;AD45;1100 116C 11B8; # (굅; 굅; 굅; 굅; 굅; ) HANGUL SYLLABLE GOEB +AD46;AD46;1100 116C 11B9;AD46;1100 116C 11B9; # (굆; 굆; 굆; 굆; 굆; ) HANGUL SYLLABLE GOEBS +AD47;AD47;1100 116C 11BA;AD47;1100 116C 11BA; # (굇; 굇; 굇; 굇; 굇; ) HANGUL SYLLABLE GOES +AD48;AD48;1100 116C 11BB;AD48;1100 116C 11BB; # (굈; 굈; 굈; 굈; 굈; ) HANGUL SYLLABLE GOESS +AD49;AD49;1100 116C 11BC;AD49;1100 116C 11BC; # (굉; 굉; 굉; 굉; 굉; ) HANGUL SYLLABLE GOENG +AD4A;AD4A;1100 116C 11BD;AD4A;1100 116C 11BD; # (굊; 굊; 굊; 굊; 굊; ) HANGUL SYLLABLE GOEJ +AD4B;AD4B;1100 116C 11BE;AD4B;1100 116C 11BE; # (굋; 굋; 굋; 굋; 굋; ) HANGUL SYLLABLE GOEC +AD4C;AD4C;1100 116C 11BF;AD4C;1100 116C 11BF; # (굌; 굌; 굌; 굌; 굌; ) HANGUL SYLLABLE GOEK +AD4D;AD4D;1100 116C 11C0;AD4D;1100 116C 11C0; # (굍; 굍; 굍; 굍; 굍; ) HANGUL SYLLABLE GOET +AD4E;AD4E;1100 116C 11C1;AD4E;1100 116C 11C1; # (굎; 굎; 굎; 굎; 굎; ) HANGUL SYLLABLE GOEP +AD4F;AD4F;1100 116C 11C2;AD4F;1100 116C 11C2; # (굏; 굏; 굏; 굏; 굏; ) HANGUL SYLLABLE GOEH +AD50;AD50;1100 116D;AD50;1100 116D; # (교; 교; 교; 교; 교; ) HANGUL SYLLABLE GYO +AD51;AD51;1100 116D 11A8;AD51;1100 116D 11A8; # (굑; 굑; 굑; 굑; 굑; ) HANGUL SYLLABLE GYOG +AD52;AD52;1100 116D 11A9;AD52;1100 116D 11A9; # (굒; 굒; 굒; 굒; 굒; ) HANGUL SYLLABLE GYOGG +AD53;AD53;1100 116D 11AA;AD53;1100 116D 11AA; # (굓; 굓; 굓; 굓; 굓; ) HANGUL SYLLABLE GYOGS +AD54;AD54;1100 116D 11AB;AD54;1100 116D 11AB; # (굔; 굔; 굔; 굔; 굔; ) HANGUL SYLLABLE GYON +AD55;AD55;1100 116D 11AC;AD55;1100 116D 11AC; # (굕; 굕; 굕; 굕; 굕; ) HANGUL SYLLABLE GYONJ +AD56;AD56;1100 116D 11AD;AD56;1100 116D 11AD; # (굖; 굖; 굖; 굖; 굖; ) HANGUL SYLLABLE GYONH +AD57;AD57;1100 116D 11AE;AD57;1100 116D 11AE; # (굗; 굗; 굗; 굗; 굗; ) HANGUL SYLLABLE GYOD +AD58;AD58;1100 116D 11AF;AD58;1100 116D 11AF; # (굘; 굘; 굘; 굘; 굘; ) HANGUL SYLLABLE GYOL +AD59;AD59;1100 116D 11B0;AD59;1100 116D 11B0; # (굙; 굙; 굙; 굙; 굙; ) HANGUL SYLLABLE GYOLG +AD5A;AD5A;1100 116D 11B1;AD5A;1100 116D 11B1; # (굚; 굚; 굚; 굚; 굚; ) HANGUL SYLLABLE GYOLM +AD5B;AD5B;1100 116D 11B2;AD5B;1100 116D 11B2; # (굛; 굛; 굛; 굛; 굛; ) HANGUL SYLLABLE GYOLB +AD5C;AD5C;1100 116D 11B3;AD5C;1100 116D 11B3; # (굜; 굜; 굜; 굜; 굜; ) HANGUL SYLLABLE GYOLS +AD5D;AD5D;1100 116D 11B4;AD5D;1100 116D 11B4; # (굝; 굝; 굝; 굝; 굝; ) HANGUL SYLLABLE GYOLT +AD5E;AD5E;1100 116D 11B5;AD5E;1100 116D 11B5; # (굞; 굞; 굞; 굞; 굞; ) HANGUL SYLLABLE GYOLP +AD5F;AD5F;1100 116D 11B6;AD5F;1100 116D 11B6; # (굟; 굟; 굟; 굟; 굟; ) HANGUL SYLLABLE GYOLH +AD60;AD60;1100 116D 11B7;AD60;1100 116D 11B7; # (굠; 굠; 굠; 굠; 굠; ) HANGUL SYLLABLE GYOM +AD61;AD61;1100 116D 11B8;AD61;1100 116D 11B8; # (굡; 굡; 굡; 굡; 굡; ) HANGUL SYLLABLE GYOB +AD62;AD62;1100 116D 11B9;AD62;1100 116D 11B9; # (굢; 굢; 굢; 굢; 굢; ) HANGUL SYLLABLE GYOBS +AD63;AD63;1100 116D 11BA;AD63;1100 116D 11BA; # (굣; 굣; 굣; 굣; 굣; ) HANGUL SYLLABLE GYOS +AD64;AD64;1100 116D 11BB;AD64;1100 116D 11BB; # (굤; 굤; 굤; 굤; 굤; ) HANGUL SYLLABLE GYOSS +AD65;AD65;1100 116D 11BC;AD65;1100 116D 11BC; # (굥; 굥; 굥; 굥; 굥; ) HANGUL SYLLABLE GYONG +AD66;AD66;1100 116D 11BD;AD66;1100 116D 11BD; # (굦; 굦; 굦; 굦; 굦; ) HANGUL SYLLABLE GYOJ +AD67;AD67;1100 116D 11BE;AD67;1100 116D 11BE; # (굧; 굧; 굧; 굧; 굧; ) HANGUL SYLLABLE GYOC +AD68;AD68;1100 116D 11BF;AD68;1100 116D 11BF; # (굨; 굨; 굨; 굨; 굨; ) HANGUL SYLLABLE GYOK +AD69;AD69;1100 116D 11C0;AD69;1100 116D 11C0; # (굩; 굩; 굩; 굩; 굩; ) HANGUL SYLLABLE GYOT +AD6A;AD6A;1100 116D 11C1;AD6A;1100 116D 11C1; # (굪; 굪; 굪; 굪; 굪; ) HANGUL SYLLABLE GYOP +AD6B;AD6B;1100 116D 11C2;AD6B;1100 116D 11C2; # (굫; 굫; 굫; 굫; 굫; ) HANGUL SYLLABLE GYOH +AD6C;AD6C;1100 116E;AD6C;1100 116E; # (구; 구; 구; 구; 구; ) HANGUL SYLLABLE GU +AD6D;AD6D;1100 116E 11A8;AD6D;1100 116E 11A8; # (국; 국; 국; 국; 국; ) HANGUL SYLLABLE GUG +AD6E;AD6E;1100 116E 11A9;AD6E;1100 116E 11A9; # (굮; 굮; 굮; 굮; 굮; ) HANGUL SYLLABLE GUGG +AD6F;AD6F;1100 116E 11AA;AD6F;1100 116E 11AA; # (굯; 굯; 굯; 굯; 굯; ) HANGUL SYLLABLE GUGS +AD70;AD70;1100 116E 11AB;AD70;1100 116E 11AB; # (군; 군; 군; 군; 군; ) HANGUL SYLLABLE GUN +AD71;AD71;1100 116E 11AC;AD71;1100 116E 11AC; # (굱; 굱; 굱; 굱; 굱; ) HANGUL SYLLABLE GUNJ +AD72;AD72;1100 116E 11AD;AD72;1100 116E 11AD; # (굲; 굲; 굲; 굲; 굲; ) HANGUL SYLLABLE GUNH +AD73;AD73;1100 116E 11AE;AD73;1100 116E 11AE; # (굳; 굳; 굳; 굳; 굳; ) HANGUL SYLLABLE GUD +AD74;AD74;1100 116E 11AF;AD74;1100 116E 11AF; # (굴; 굴; 굴; 굴; 굴; ) HANGUL SYLLABLE GUL +AD75;AD75;1100 116E 11B0;AD75;1100 116E 11B0; # (굵; 굵; 굵; 굵; 굵; ) HANGUL SYLLABLE GULG +AD76;AD76;1100 116E 11B1;AD76;1100 116E 11B1; # (굶; 굶; 굶; 굶; 굶; ) HANGUL SYLLABLE GULM +AD77;AD77;1100 116E 11B2;AD77;1100 116E 11B2; # (굷; 굷; 굷; 굷; 굷; ) HANGUL SYLLABLE GULB +AD78;AD78;1100 116E 11B3;AD78;1100 116E 11B3; # (굸; 굸; 굸; 굸; 굸; ) HANGUL SYLLABLE GULS +AD79;AD79;1100 116E 11B4;AD79;1100 116E 11B4; # (굹; 굹; 굹; 굹; 굹; ) HANGUL SYLLABLE GULT +AD7A;AD7A;1100 116E 11B5;AD7A;1100 116E 11B5; # (굺; 굺; 굺; 굺; 굺; ) HANGUL SYLLABLE GULP +AD7B;AD7B;1100 116E 11B6;AD7B;1100 116E 11B6; # (굻; 굻; 굻; 굻; 굻; ) HANGUL SYLLABLE GULH +AD7C;AD7C;1100 116E 11B7;AD7C;1100 116E 11B7; # (굼; 굼; 굼; 굼; 굼; ) HANGUL SYLLABLE GUM +AD7D;AD7D;1100 116E 11B8;AD7D;1100 116E 11B8; # (굽; 굽; 굽; 굽; 굽; ) HANGUL SYLLABLE GUB +AD7E;AD7E;1100 116E 11B9;AD7E;1100 116E 11B9; # (굾; 굾; 굾; 굾; 굾; ) HANGUL SYLLABLE GUBS +AD7F;AD7F;1100 116E 11BA;AD7F;1100 116E 11BA; # (굿; 굿; 굿; 굿; 굿; ) HANGUL SYLLABLE GUS +AD80;AD80;1100 116E 11BB;AD80;1100 116E 11BB; # (궀; 궀; 궀; 궀; 궀; ) HANGUL SYLLABLE GUSS +AD81;AD81;1100 116E 11BC;AD81;1100 116E 11BC; # (궁; 궁; 궁; 궁; 궁; ) HANGUL SYLLABLE GUNG +AD82;AD82;1100 116E 11BD;AD82;1100 116E 11BD; # (궂; 궂; 궂; 궂; 궂; ) HANGUL SYLLABLE GUJ +AD83;AD83;1100 116E 11BE;AD83;1100 116E 11BE; # (궃; 궃; 궃; 궃; 궃; ) HANGUL SYLLABLE GUC +AD84;AD84;1100 116E 11BF;AD84;1100 116E 11BF; # (궄; 궄; 궄; 궄; 궄; ) HANGUL SYLLABLE GUK +AD85;AD85;1100 116E 11C0;AD85;1100 116E 11C0; # (궅; 궅; 궅; 궅; 궅; ) HANGUL SYLLABLE GUT +AD86;AD86;1100 116E 11C1;AD86;1100 116E 11C1; # (궆; 궆; 궆; 궆; 궆; ) HANGUL SYLLABLE GUP +AD87;AD87;1100 116E 11C2;AD87;1100 116E 11C2; # (궇; 궇; 궇; 궇; 궇; ) HANGUL SYLLABLE GUH +AD88;AD88;1100 116F;AD88;1100 116F; # (궈; 궈; 궈; 궈; 궈; ) HANGUL SYLLABLE GWEO +AD89;AD89;1100 116F 11A8;AD89;1100 116F 11A8; # (궉; 궉; 궉; 궉; 궉; ) HANGUL SYLLABLE GWEOG +AD8A;AD8A;1100 116F 11A9;AD8A;1100 116F 11A9; # (궊; 궊; 궊; 궊; 궊; ) HANGUL SYLLABLE GWEOGG +AD8B;AD8B;1100 116F 11AA;AD8B;1100 116F 11AA; # (궋; 궋; 궋; 궋; 궋; ) HANGUL SYLLABLE GWEOGS +AD8C;AD8C;1100 116F 11AB;AD8C;1100 116F 11AB; # (권; 권; 권; 권; 권; ) HANGUL SYLLABLE GWEON +AD8D;AD8D;1100 116F 11AC;AD8D;1100 116F 11AC; # (궍; 궍; 궍; 궍; 궍; ) HANGUL SYLLABLE GWEONJ +AD8E;AD8E;1100 116F 11AD;AD8E;1100 116F 11AD; # (궎; 궎; 궎; 궎; 궎; ) HANGUL SYLLABLE GWEONH +AD8F;AD8F;1100 116F 11AE;AD8F;1100 116F 11AE; # (궏; 궏; 궏; 궏; 궏; ) HANGUL SYLLABLE GWEOD +AD90;AD90;1100 116F 11AF;AD90;1100 116F 11AF; # (궐; 궐; 궐; 궐; 궐; ) HANGUL SYLLABLE GWEOL +AD91;AD91;1100 116F 11B0;AD91;1100 116F 11B0; # (궑; 궑; 궑; 궑; 궑; ) HANGUL SYLLABLE GWEOLG +AD92;AD92;1100 116F 11B1;AD92;1100 116F 11B1; # (궒; 궒; 궒; 궒; 궒; ) HANGUL SYLLABLE GWEOLM +AD93;AD93;1100 116F 11B2;AD93;1100 116F 11B2; # (궓; 궓; 궓; 궓; 궓; ) HANGUL SYLLABLE GWEOLB +AD94;AD94;1100 116F 11B3;AD94;1100 116F 11B3; # (궔; 궔; 궔; 궔; 궔; ) HANGUL SYLLABLE GWEOLS +AD95;AD95;1100 116F 11B4;AD95;1100 116F 11B4; # (궕; 궕; 궕; 궕; 궕; ) HANGUL SYLLABLE GWEOLT +AD96;AD96;1100 116F 11B5;AD96;1100 116F 11B5; # (궖; 궖; 궖; 궖; 궖; ) HANGUL SYLLABLE GWEOLP +AD97;AD97;1100 116F 11B6;AD97;1100 116F 11B6; # (궗; 궗; 궗; 궗; 궗; ) HANGUL SYLLABLE GWEOLH +AD98;AD98;1100 116F 11B7;AD98;1100 116F 11B7; # (궘; 궘; 궘; 궘; 궘; ) HANGUL SYLLABLE GWEOM +AD99;AD99;1100 116F 11B8;AD99;1100 116F 11B8; # (궙; 궙; 궙; 궙; 궙; ) HANGUL SYLLABLE GWEOB +AD9A;AD9A;1100 116F 11B9;AD9A;1100 116F 11B9; # (궚; 궚; 궚; 궚; 궚; ) HANGUL SYLLABLE GWEOBS +AD9B;AD9B;1100 116F 11BA;AD9B;1100 116F 11BA; # (궛; 궛; 궛; 궛; 궛; ) HANGUL SYLLABLE GWEOS +AD9C;AD9C;1100 116F 11BB;AD9C;1100 116F 11BB; # (궜; 궜; 궜; 궜; 궜; ) HANGUL SYLLABLE GWEOSS +AD9D;AD9D;1100 116F 11BC;AD9D;1100 116F 11BC; # (궝; 궝; 궝; 궝; 궝; ) HANGUL SYLLABLE GWEONG +AD9E;AD9E;1100 116F 11BD;AD9E;1100 116F 11BD; # (궞; 궞; 궞; 궞; 궞; ) HANGUL SYLLABLE GWEOJ +AD9F;AD9F;1100 116F 11BE;AD9F;1100 116F 11BE; # (궟; 궟; 궟; 궟; 궟; ) HANGUL SYLLABLE GWEOC +ADA0;ADA0;1100 116F 11BF;ADA0;1100 116F 11BF; # (궠; 궠; 궠; 궠; 궠; ) HANGUL SYLLABLE GWEOK +ADA1;ADA1;1100 116F 11C0;ADA1;1100 116F 11C0; # (궡; 궡; 궡; 궡; 궡; ) HANGUL SYLLABLE GWEOT +ADA2;ADA2;1100 116F 11C1;ADA2;1100 116F 11C1; # (궢; 궢; 궢; 궢; 궢; ) HANGUL SYLLABLE GWEOP +ADA3;ADA3;1100 116F 11C2;ADA3;1100 116F 11C2; # (궣; 궣; 궣; 궣; 궣; ) HANGUL SYLLABLE GWEOH +ADA4;ADA4;1100 1170;ADA4;1100 1170; # (궤; 궤; 궤; 궤; 궤; ) HANGUL SYLLABLE GWE +ADA5;ADA5;1100 1170 11A8;ADA5;1100 1170 11A8; # (궥; 궥; 궥; 궥; 궥; ) HANGUL SYLLABLE GWEG +ADA6;ADA6;1100 1170 11A9;ADA6;1100 1170 11A9; # (궦; 궦; 궦; 궦; 궦; ) HANGUL SYLLABLE GWEGG +ADA7;ADA7;1100 1170 11AA;ADA7;1100 1170 11AA; # (궧; 궧; 궧; 궧; 궧; ) HANGUL SYLLABLE GWEGS +ADA8;ADA8;1100 1170 11AB;ADA8;1100 1170 11AB; # (궨; 궨; 궨; 궨; 궨; ) HANGUL SYLLABLE GWEN +ADA9;ADA9;1100 1170 11AC;ADA9;1100 1170 11AC; # (궩; 궩; 궩; 궩; 궩; ) HANGUL SYLLABLE GWENJ +ADAA;ADAA;1100 1170 11AD;ADAA;1100 1170 11AD; # (궪; 궪; 궪; 궪; 궪; ) HANGUL SYLLABLE GWENH +ADAB;ADAB;1100 1170 11AE;ADAB;1100 1170 11AE; # (궫; 궫; 궫; 궫; 궫; ) HANGUL SYLLABLE GWED +ADAC;ADAC;1100 1170 11AF;ADAC;1100 1170 11AF; # (궬; 궬; 궬; 궬; 궬; ) HANGUL SYLLABLE GWEL +ADAD;ADAD;1100 1170 11B0;ADAD;1100 1170 11B0; # (궭; 궭; 궭; 궭; 궭; ) HANGUL SYLLABLE GWELG +ADAE;ADAE;1100 1170 11B1;ADAE;1100 1170 11B1; # (궮; 궮; 궮; 궮; 궮; ) HANGUL SYLLABLE GWELM +ADAF;ADAF;1100 1170 11B2;ADAF;1100 1170 11B2; # (궯; 궯; 궯; 궯; 궯; ) HANGUL SYLLABLE GWELB +ADB0;ADB0;1100 1170 11B3;ADB0;1100 1170 11B3; # (궰; 궰; 궰; 궰; 궰; ) HANGUL SYLLABLE GWELS +ADB1;ADB1;1100 1170 11B4;ADB1;1100 1170 11B4; # (궱; 궱; 궱; 궱; 궱; ) HANGUL SYLLABLE GWELT +ADB2;ADB2;1100 1170 11B5;ADB2;1100 1170 11B5; # (궲; 궲; 궲; 궲; 궲; ) HANGUL SYLLABLE GWELP +ADB3;ADB3;1100 1170 11B6;ADB3;1100 1170 11B6; # (궳; 궳; 궳; 궳; 궳; ) HANGUL SYLLABLE GWELH +ADB4;ADB4;1100 1170 11B7;ADB4;1100 1170 11B7; # (궴; 궴; 궴; 궴; 궴; ) HANGUL SYLLABLE GWEM +ADB5;ADB5;1100 1170 11B8;ADB5;1100 1170 11B8; # (궵; 궵; 궵; 궵; 궵; ) HANGUL SYLLABLE GWEB +ADB6;ADB6;1100 1170 11B9;ADB6;1100 1170 11B9; # (궶; 궶; 궶; 궶; 궶; ) HANGUL SYLLABLE GWEBS +ADB7;ADB7;1100 1170 11BA;ADB7;1100 1170 11BA; # (궷; 궷; 궷; 궷; 궷; ) HANGUL SYLLABLE GWES +ADB8;ADB8;1100 1170 11BB;ADB8;1100 1170 11BB; # (궸; 궸; 궸; 궸; 궸; ) HANGUL SYLLABLE GWESS +ADB9;ADB9;1100 1170 11BC;ADB9;1100 1170 11BC; # (궹; 궹; 궹; 궹; 궹; ) HANGUL SYLLABLE GWENG +ADBA;ADBA;1100 1170 11BD;ADBA;1100 1170 11BD; # (궺; 궺; 궺; 궺; 궺; ) HANGUL SYLLABLE GWEJ +ADBB;ADBB;1100 1170 11BE;ADBB;1100 1170 11BE; # (궻; 궻; 궻; 궻; 궻; ) HANGUL SYLLABLE GWEC +ADBC;ADBC;1100 1170 11BF;ADBC;1100 1170 11BF; # (궼; 궼; 궼; 궼; 궼; ) HANGUL SYLLABLE GWEK +ADBD;ADBD;1100 1170 11C0;ADBD;1100 1170 11C0; # (궽; 궽; 궽; 궽; 궽; ) HANGUL SYLLABLE GWET +ADBE;ADBE;1100 1170 11C1;ADBE;1100 1170 11C1; # (궾; 궾; 궾; 궾; 궾; ) HANGUL SYLLABLE GWEP +ADBF;ADBF;1100 1170 11C2;ADBF;1100 1170 11C2; # (궿; 궿; 궿; 궿; 궿; ) HANGUL SYLLABLE GWEH +ADC0;ADC0;1100 1171;ADC0;1100 1171; # (귀; 귀; 귀; 귀; 귀; ) HANGUL SYLLABLE GWI +ADC1;ADC1;1100 1171 11A8;ADC1;1100 1171 11A8; # (귁; 귁; 귁; 귁; 귁; ) HANGUL SYLLABLE GWIG +ADC2;ADC2;1100 1171 11A9;ADC2;1100 1171 11A9; # (귂; 귂; 귂; 귂; 귂; ) HANGUL SYLLABLE GWIGG +ADC3;ADC3;1100 1171 11AA;ADC3;1100 1171 11AA; # (귃; 귃; 귃; 귃; 귃; ) HANGUL SYLLABLE GWIGS +ADC4;ADC4;1100 1171 11AB;ADC4;1100 1171 11AB; # (귄; 귄; 귄; 귄; 귄; ) HANGUL SYLLABLE GWIN +ADC5;ADC5;1100 1171 11AC;ADC5;1100 1171 11AC; # (귅; 귅; 귅; 귅; 귅; ) HANGUL SYLLABLE GWINJ +ADC6;ADC6;1100 1171 11AD;ADC6;1100 1171 11AD; # (귆; 귆; 귆; 귆; 귆; ) HANGUL SYLLABLE GWINH +ADC7;ADC7;1100 1171 11AE;ADC7;1100 1171 11AE; # (귇; 귇; 귇; 귇; 귇; ) HANGUL SYLLABLE GWID +ADC8;ADC8;1100 1171 11AF;ADC8;1100 1171 11AF; # (귈; 귈; 귈; 귈; 귈; ) HANGUL SYLLABLE GWIL +ADC9;ADC9;1100 1171 11B0;ADC9;1100 1171 11B0; # (귉; 귉; 귉; 귉; 귉; ) HANGUL SYLLABLE GWILG +ADCA;ADCA;1100 1171 11B1;ADCA;1100 1171 11B1; # (귊; 귊; 귊; 귊; 귊; ) HANGUL SYLLABLE GWILM +ADCB;ADCB;1100 1171 11B2;ADCB;1100 1171 11B2; # (귋; 귋; 귋; 귋; 귋; ) HANGUL SYLLABLE GWILB +ADCC;ADCC;1100 1171 11B3;ADCC;1100 1171 11B3; # (귌; 귌; 귌; 귌; 귌; ) HANGUL SYLLABLE GWILS +ADCD;ADCD;1100 1171 11B4;ADCD;1100 1171 11B4; # (귍; 귍; 귍; 귍; 귍; ) HANGUL SYLLABLE GWILT +ADCE;ADCE;1100 1171 11B5;ADCE;1100 1171 11B5; # (귎; 귎; 귎; 귎; 귎; ) HANGUL SYLLABLE GWILP +ADCF;ADCF;1100 1171 11B6;ADCF;1100 1171 11B6; # (귏; 귏; 귏; 귏; 귏; ) HANGUL SYLLABLE GWILH +ADD0;ADD0;1100 1171 11B7;ADD0;1100 1171 11B7; # (귐; 귐; 귐; 귐; 귐; ) HANGUL SYLLABLE GWIM +ADD1;ADD1;1100 1171 11B8;ADD1;1100 1171 11B8; # (귑; 귑; 귑; 귑; 귑; ) HANGUL SYLLABLE GWIB +ADD2;ADD2;1100 1171 11B9;ADD2;1100 1171 11B9; # (귒; 귒; 귒; 귒; 귒; ) HANGUL SYLLABLE GWIBS +ADD3;ADD3;1100 1171 11BA;ADD3;1100 1171 11BA; # (귓; 귓; 귓; 귓; 귓; ) HANGUL SYLLABLE GWIS +ADD4;ADD4;1100 1171 11BB;ADD4;1100 1171 11BB; # (귔; 귔; 귔; 귔; 귔; ) HANGUL SYLLABLE GWISS +ADD5;ADD5;1100 1171 11BC;ADD5;1100 1171 11BC; # (귕; 귕; 귕; 귕; 귕; ) HANGUL SYLLABLE GWING +ADD6;ADD6;1100 1171 11BD;ADD6;1100 1171 11BD; # (귖; 귖; 귖; 귖; 귖; ) HANGUL SYLLABLE GWIJ +ADD7;ADD7;1100 1171 11BE;ADD7;1100 1171 11BE; # (귗; 귗; 귗; 귗; 귗; ) HANGUL SYLLABLE GWIC +ADD8;ADD8;1100 1171 11BF;ADD8;1100 1171 11BF; # (귘; 귘; 귘; 귘; 귘; ) HANGUL SYLLABLE GWIK +ADD9;ADD9;1100 1171 11C0;ADD9;1100 1171 11C0; # (귙; 귙; 귙; 귙; 귙; ) HANGUL SYLLABLE GWIT +ADDA;ADDA;1100 1171 11C1;ADDA;1100 1171 11C1; # (귚; 귚; 귚; 귚; 귚; ) HANGUL SYLLABLE GWIP +ADDB;ADDB;1100 1171 11C2;ADDB;1100 1171 11C2; # (귛; 귛; 귛; 귛; 귛; ) HANGUL SYLLABLE GWIH +ADDC;ADDC;1100 1172;ADDC;1100 1172; # (규; 규; 규; 규; 규; ) HANGUL SYLLABLE GYU +ADDD;ADDD;1100 1172 11A8;ADDD;1100 1172 11A8; # (귝; 귝; 귝; 귝; 귝; ) HANGUL SYLLABLE GYUG +ADDE;ADDE;1100 1172 11A9;ADDE;1100 1172 11A9; # (귞; 귞; 귞; 귞; 귞; ) HANGUL SYLLABLE GYUGG +ADDF;ADDF;1100 1172 11AA;ADDF;1100 1172 11AA; # (귟; 귟; 귟; 귟; 귟; ) HANGUL SYLLABLE GYUGS +ADE0;ADE0;1100 1172 11AB;ADE0;1100 1172 11AB; # (균; 균; 균; 균; 균; ) HANGUL SYLLABLE GYUN +ADE1;ADE1;1100 1172 11AC;ADE1;1100 1172 11AC; # (귡; 귡; 귡; 귡; 귡; ) HANGUL SYLLABLE GYUNJ +ADE2;ADE2;1100 1172 11AD;ADE2;1100 1172 11AD; # (귢; 귢; 귢; 귢; 귢; ) HANGUL SYLLABLE GYUNH +ADE3;ADE3;1100 1172 11AE;ADE3;1100 1172 11AE; # (귣; 귣; 귣; 귣; 귣; ) HANGUL SYLLABLE GYUD +ADE4;ADE4;1100 1172 11AF;ADE4;1100 1172 11AF; # (귤; 귤; 귤; 귤; 귤; ) HANGUL SYLLABLE GYUL +ADE5;ADE5;1100 1172 11B0;ADE5;1100 1172 11B0; # (귥; 귥; 귥; 귥; 귥; ) HANGUL SYLLABLE GYULG +ADE6;ADE6;1100 1172 11B1;ADE6;1100 1172 11B1; # (귦; 귦; 귦; 귦; 귦; ) HANGUL SYLLABLE GYULM +ADE7;ADE7;1100 1172 11B2;ADE7;1100 1172 11B2; # (귧; 귧; 귧; 귧; 귧; ) HANGUL SYLLABLE GYULB +ADE8;ADE8;1100 1172 11B3;ADE8;1100 1172 11B3; # (귨; 귨; 귨; 귨; 귨; ) HANGUL SYLLABLE GYULS +ADE9;ADE9;1100 1172 11B4;ADE9;1100 1172 11B4; # (귩; 귩; 귩; 귩; 귩; ) HANGUL SYLLABLE GYULT +ADEA;ADEA;1100 1172 11B5;ADEA;1100 1172 11B5; # (귪; 귪; 귪; 귪; 귪; ) HANGUL SYLLABLE GYULP +ADEB;ADEB;1100 1172 11B6;ADEB;1100 1172 11B6; # (귫; 귫; 귫; 귫; 귫; ) HANGUL SYLLABLE GYULH +ADEC;ADEC;1100 1172 11B7;ADEC;1100 1172 11B7; # (귬; 귬; 귬; 귬; 귬; ) HANGUL SYLLABLE GYUM +ADED;ADED;1100 1172 11B8;ADED;1100 1172 11B8; # (귭; 귭; 귭; 귭; 귭; ) HANGUL SYLLABLE GYUB +ADEE;ADEE;1100 1172 11B9;ADEE;1100 1172 11B9; # (귮; 귮; 귮; 귮; 귮; ) HANGUL SYLLABLE GYUBS +ADEF;ADEF;1100 1172 11BA;ADEF;1100 1172 11BA; # (귯; 귯; 귯; 귯; 귯; ) HANGUL SYLLABLE GYUS +ADF0;ADF0;1100 1172 11BB;ADF0;1100 1172 11BB; # (귰; 귰; 귰; 귰; 귰; ) HANGUL SYLLABLE GYUSS +ADF1;ADF1;1100 1172 11BC;ADF1;1100 1172 11BC; # (귱; 귱; 귱; 귱; 귱; ) HANGUL SYLLABLE GYUNG +ADF2;ADF2;1100 1172 11BD;ADF2;1100 1172 11BD; # (귲; 귲; 귲; 귲; 귲; ) HANGUL SYLLABLE GYUJ +ADF3;ADF3;1100 1172 11BE;ADF3;1100 1172 11BE; # (귳; 귳; 귳; 귳; 귳; ) HANGUL SYLLABLE GYUC +ADF4;ADF4;1100 1172 11BF;ADF4;1100 1172 11BF; # (귴; 귴; 귴; 귴; 귴; ) HANGUL SYLLABLE GYUK +ADF5;ADF5;1100 1172 11C0;ADF5;1100 1172 11C0; # (귵; 귵; 귵; 귵; 귵; ) HANGUL SYLLABLE GYUT +ADF6;ADF6;1100 1172 11C1;ADF6;1100 1172 11C1; # (귶; 귶; 귶; 귶; 귶; ) HANGUL SYLLABLE GYUP +ADF7;ADF7;1100 1172 11C2;ADF7;1100 1172 11C2; # (귷; 귷; 귷; 귷; 귷; ) HANGUL SYLLABLE GYUH +ADF8;ADF8;1100 1173;ADF8;1100 1173; # (그; 그; 그; 그; 그; ) HANGUL SYLLABLE GEU +ADF9;ADF9;1100 1173 11A8;ADF9;1100 1173 11A8; # (극; 극; 극; 극; 극; ) HANGUL SYLLABLE GEUG +ADFA;ADFA;1100 1173 11A9;ADFA;1100 1173 11A9; # (귺; 귺; 귺; 귺; 귺; ) HANGUL SYLLABLE GEUGG +ADFB;ADFB;1100 1173 11AA;ADFB;1100 1173 11AA; # (귻; 귻; 귻; 귻; 귻; ) HANGUL SYLLABLE GEUGS +ADFC;ADFC;1100 1173 11AB;ADFC;1100 1173 11AB; # (근; 근; 근; 근; 근; ) HANGUL SYLLABLE GEUN +ADFD;ADFD;1100 1173 11AC;ADFD;1100 1173 11AC; # (귽; 귽; 귽; 귽; 귽; ) HANGUL SYLLABLE GEUNJ +ADFE;ADFE;1100 1173 11AD;ADFE;1100 1173 11AD; # (귾; 귾; 귾; 귾; 귾; ) HANGUL SYLLABLE GEUNH +ADFF;ADFF;1100 1173 11AE;ADFF;1100 1173 11AE; # (귿; 귿; 귿; 귿; 귿; ) HANGUL SYLLABLE GEUD +AE00;AE00;1100 1173 11AF;AE00;1100 1173 11AF; # (글; 글; 글; 글; 글; ) HANGUL SYLLABLE GEUL +AE01;AE01;1100 1173 11B0;AE01;1100 1173 11B0; # (긁; 긁; 긁; 긁; 긁; ) HANGUL SYLLABLE GEULG +AE02;AE02;1100 1173 11B1;AE02;1100 1173 11B1; # (긂; 긂; 긂; 긂; 긂; ) HANGUL SYLLABLE GEULM +AE03;AE03;1100 1173 11B2;AE03;1100 1173 11B2; # (긃; 긃; 긃; 긃; 긃; ) HANGUL SYLLABLE GEULB +AE04;AE04;1100 1173 11B3;AE04;1100 1173 11B3; # (긄; 긄; 긄; 긄; 긄; ) HANGUL SYLLABLE GEULS +AE05;AE05;1100 1173 11B4;AE05;1100 1173 11B4; # (긅; 긅; 긅; 긅; 긅; ) HANGUL SYLLABLE GEULT +AE06;AE06;1100 1173 11B5;AE06;1100 1173 11B5; # (긆; 긆; 긆; 긆; 긆; ) HANGUL SYLLABLE GEULP +AE07;AE07;1100 1173 11B6;AE07;1100 1173 11B6; # (긇; 긇; 긇; 긇; 긇; ) HANGUL SYLLABLE GEULH +AE08;AE08;1100 1173 11B7;AE08;1100 1173 11B7; # (금; 금; 금; 금; 금; ) HANGUL SYLLABLE GEUM +AE09;AE09;1100 1173 11B8;AE09;1100 1173 11B8; # (급; 급; 급; 급; 급; ) HANGUL SYLLABLE GEUB +AE0A;AE0A;1100 1173 11B9;AE0A;1100 1173 11B9; # (긊; 긊; 긊; 긊; 긊; ) HANGUL SYLLABLE GEUBS +AE0B;AE0B;1100 1173 11BA;AE0B;1100 1173 11BA; # (긋; 긋; 긋; 긋; 긋; ) HANGUL SYLLABLE GEUS +AE0C;AE0C;1100 1173 11BB;AE0C;1100 1173 11BB; # (긌; 긌; 긌; 긌; 긌; ) HANGUL SYLLABLE GEUSS +AE0D;AE0D;1100 1173 11BC;AE0D;1100 1173 11BC; # (긍; 긍; 긍; 긍; 긍; ) HANGUL SYLLABLE GEUNG +AE0E;AE0E;1100 1173 11BD;AE0E;1100 1173 11BD; # (긎; 긎; 긎; 긎; 긎; ) HANGUL SYLLABLE GEUJ +AE0F;AE0F;1100 1173 11BE;AE0F;1100 1173 11BE; # (긏; 긏; 긏; 긏; 긏; ) HANGUL SYLLABLE GEUC +AE10;AE10;1100 1173 11BF;AE10;1100 1173 11BF; # (긐; 긐; 긐; 긐; 긐; ) HANGUL SYLLABLE GEUK +AE11;AE11;1100 1173 11C0;AE11;1100 1173 11C0; # (긑; 긑; 긑; 긑; 긑; ) HANGUL SYLLABLE GEUT +AE12;AE12;1100 1173 11C1;AE12;1100 1173 11C1; # (긒; 긒; 긒; 긒; 긒; ) HANGUL SYLLABLE GEUP +AE13;AE13;1100 1173 11C2;AE13;1100 1173 11C2; # (긓; 긓; 긓; 긓; 긓; ) HANGUL SYLLABLE GEUH +AE14;AE14;1100 1174;AE14;1100 1174; # (긔; 긔; 긔; 긔; 긔; ) HANGUL SYLLABLE GYI +AE15;AE15;1100 1174 11A8;AE15;1100 1174 11A8; # (긕; 긕; 긕; 긕; 긕; ) HANGUL SYLLABLE GYIG +AE16;AE16;1100 1174 11A9;AE16;1100 1174 11A9; # (긖; 긖; 긖; 긖; 긖; ) HANGUL SYLLABLE GYIGG +AE17;AE17;1100 1174 11AA;AE17;1100 1174 11AA; # (긗; 긗; 긗; 긗; 긗; ) HANGUL SYLLABLE GYIGS +AE18;AE18;1100 1174 11AB;AE18;1100 1174 11AB; # (긘; 긘; 긘; 긘; 긘; ) HANGUL SYLLABLE GYIN +AE19;AE19;1100 1174 11AC;AE19;1100 1174 11AC; # (긙; 긙; 긙; 긙; 긙; ) HANGUL SYLLABLE GYINJ +AE1A;AE1A;1100 1174 11AD;AE1A;1100 1174 11AD; # (긚; 긚; 긚; 긚; 긚; ) HANGUL SYLLABLE GYINH +AE1B;AE1B;1100 1174 11AE;AE1B;1100 1174 11AE; # (긛; 긛; 긛; 긛; 긛; ) HANGUL SYLLABLE GYID +AE1C;AE1C;1100 1174 11AF;AE1C;1100 1174 11AF; # (긜; 긜; 긜; 긜; 긜; ) HANGUL SYLLABLE GYIL +AE1D;AE1D;1100 1174 11B0;AE1D;1100 1174 11B0; # (긝; 긝; 긝; 긝; 긝; ) HANGUL SYLLABLE GYILG +AE1E;AE1E;1100 1174 11B1;AE1E;1100 1174 11B1; # (긞; 긞; 긞; 긞; 긞; ) HANGUL SYLLABLE GYILM +AE1F;AE1F;1100 1174 11B2;AE1F;1100 1174 11B2; # (긟; 긟; 긟; 긟; 긟; ) HANGUL SYLLABLE GYILB +AE20;AE20;1100 1174 11B3;AE20;1100 1174 11B3; # (긠; 긠; 긠; 긠; 긠; ) HANGUL SYLLABLE GYILS +AE21;AE21;1100 1174 11B4;AE21;1100 1174 11B4; # (긡; 긡; 긡; 긡; 긡; ) HANGUL SYLLABLE GYILT +AE22;AE22;1100 1174 11B5;AE22;1100 1174 11B5; # (긢; 긢; 긢; 긢; 긢; ) HANGUL SYLLABLE GYILP +AE23;AE23;1100 1174 11B6;AE23;1100 1174 11B6; # (긣; 긣; 긣; 긣; 긣; ) HANGUL SYLLABLE GYILH +AE24;AE24;1100 1174 11B7;AE24;1100 1174 11B7; # (긤; 긤; 긤; 긤; 긤; ) HANGUL SYLLABLE GYIM +AE25;AE25;1100 1174 11B8;AE25;1100 1174 11B8; # (긥; 긥; 긥; 긥; 긥; ) HANGUL SYLLABLE GYIB +AE26;AE26;1100 1174 11B9;AE26;1100 1174 11B9; # (긦; 긦; 긦; 긦; 긦; ) HANGUL SYLLABLE GYIBS +AE27;AE27;1100 1174 11BA;AE27;1100 1174 11BA; # (긧; 긧; 긧; 긧; 긧; ) HANGUL SYLLABLE GYIS +AE28;AE28;1100 1174 11BB;AE28;1100 1174 11BB; # (긨; 긨; 긨; 긨; 긨; ) HANGUL SYLLABLE GYISS +AE29;AE29;1100 1174 11BC;AE29;1100 1174 11BC; # (긩; 긩; 긩; 긩; 긩; ) HANGUL SYLLABLE GYING +AE2A;AE2A;1100 1174 11BD;AE2A;1100 1174 11BD; # (긪; 긪; 긪; 긪; 긪; ) HANGUL SYLLABLE GYIJ +AE2B;AE2B;1100 1174 11BE;AE2B;1100 1174 11BE; # (긫; 긫; 긫; 긫; 긫; ) HANGUL SYLLABLE GYIC +AE2C;AE2C;1100 1174 11BF;AE2C;1100 1174 11BF; # (긬; 긬; 긬; 긬; 긬; ) HANGUL SYLLABLE GYIK +AE2D;AE2D;1100 1174 11C0;AE2D;1100 1174 11C0; # (긭; 긭; 긭; 긭; 긭; ) HANGUL SYLLABLE GYIT +AE2E;AE2E;1100 1174 11C1;AE2E;1100 1174 11C1; # (긮; 긮; 긮; 긮; 긮; ) HANGUL SYLLABLE GYIP +AE2F;AE2F;1100 1174 11C2;AE2F;1100 1174 11C2; # (긯; 긯; 긯; 긯; 긯; ) HANGUL SYLLABLE GYIH +AE30;AE30;1100 1175;AE30;1100 1175; # (기; 기; 기; 기; 기; ) HANGUL SYLLABLE GI +AE31;AE31;1100 1175 11A8;AE31;1100 1175 11A8; # (긱; 긱; 긱; 긱; 긱; ) HANGUL SYLLABLE GIG +AE32;AE32;1100 1175 11A9;AE32;1100 1175 11A9; # (긲; 긲; 긲; 긲; 긲; ) HANGUL SYLLABLE GIGG +AE33;AE33;1100 1175 11AA;AE33;1100 1175 11AA; # (긳; 긳; 긳; 긳; 긳; ) HANGUL SYLLABLE GIGS +AE34;AE34;1100 1175 11AB;AE34;1100 1175 11AB; # (긴; 긴; 긴; 긴; 긴; ) HANGUL SYLLABLE GIN +AE35;AE35;1100 1175 11AC;AE35;1100 1175 11AC; # (긵; 긵; 긵; 긵; 긵; ) HANGUL SYLLABLE GINJ +AE36;AE36;1100 1175 11AD;AE36;1100 1175 11AD; # (긶; 긶; 긶; 긶; 긶; ) HANGUL SYLLABLE GINH +AE37;AE37;1100 1175 11AE;AE37;1100 1175 11AE; # (긷; 긷; 긷; 긷; 긷; ) HANGUL SYLLABLE GID +AE38;AE38;1100 1175 11AF;AE38;1100 1175 11AF; # (길; 길; 길; 길; 길; ) HANGUL SYLLABLE GIL +AE39;AE39;1100 1175 11B0;AE39;1100 1175 11B0; # (긹; 긹; 긹; 긹; 긹; ) HANGUL SYLLABLE GILG +AE3A;AE3A;1100 1175 11B1;AE3A;1100 1175 11B1; # (긺; 긺; 긺; 긺; 긺; ) HANGUL SYLLABLE GILM +AE3B;AE3B;1100 1175 11B2;AE3B;1100 1175 11B2; # (긻; 긻; 긻; 긻; 긻; ) HANGUL SYLLABLE GILB +AE3C;AE3C;1100 1175 11B3;AE3C;1100 1175 11B3; # (긼; 긼; 긼; 긼; 긼; ) HANGUL SYLLABLE GILS +AE3D;AE3D;1100 1175 11B4;AE3D;1100 1175 11B4; # (긽; 긽; 긽; 긽; 긽; ) HANGUL SYLLABLE GILT +AE3E;AE3E;1100 1175 11B5;AE3E;1100 1175 11B5; # (긾; 긾; 긾; 긾; 긾; ) HANGUL SYLLABLE GILP +AE3F;AE3F;1100 1175 11B6;AE3F;1100 1175 11B6; # (긿; 긿; 긿; 긿; 긿; ) HANGUL SYLLABLE GILH +AE40;AE40;1100 1175 11B7;AE40;1100 1175 11B7; # (김; 김; 김; 김; 김; ) HANGUL SYLLABLE GIM +AE41;AE41;1100 1175 11B8;AE41;1100 1175 11B8; # (깁; 깁; 깁; 깁; 깁; ) HANGUL SYLLABLE GIB +AE42;AE42;1100 1175 11B9;AE42;1100 1175 11B9; # (깂; 깂; 깂; 깂; 깂; ) HANGUL SYLLABLE GIBS +AE43;AE43;1100 1175 11BA;AE43;1100 1175 11BA; # (깃; 깃; 깃; 깃; 깃; ) HANGUL SYLLABLE GIS +AE44;AE44;1100 1175 11BB;AE44;1100 1175 11BB; # (깄; 깄; 깄; 깄; 깄; ) HANGUL SYLLABLE GISS +AE45;AE45;1100 1175 11BC;AE45;1100 1175 11BC; # (깅; 깅; 깅; 깅; 깅; ) HANGUL SYLLABLE GING +AE46;AE46;1100 1175 11BD;AE46;1100 1175 11BD; # (깆; 깆; 깆; 깆; 깆; ) HANGUL SYLLABLE GIJ +AE47;AE47;1100 1175 11BE;AE47;1100 1175 11BE; # (깇; 깇; 깇; 깇; 깇; ) HANGUL SYLLABLE GIC +AE48;AE48;1100 1175 11BF;AE48;1100 1175 11BF; # (깈; 깈; 깈; 깈; 깈; ) HANGUL SYLLABLE GIK +AE49;AE49;1100 1175 11C0;AE49;1100 1175 11C0; # (깉; 깉; 깉; 깉; 깉; ) HANGUL SYLLABLE GIT +AE4A;AE4A;1100 1175 11C1;AE4A;1100 1175 11C1; # (깊; 깊; 깊; 깊; 깊; ) HANGUL SYLLABLE GIP +AE4B;AE4B;1100 1175 11C2;AE4B;1100 1175 11C2; # (깋; 깋; 깋; 깋; 깋; ) HANGUL SYLLABLE GIH +AE4C;AE4C;1101 1161;AE4C;1101 1161; # (까; 까; 까; 까; 까; ) HANGUL SYLLABLE GGA +AE4D;AE4D;1101 1161 11A8;AE4D;1101 1161 11A8; # (깍; 깍; 깍; 깍; 깍; ) HANGUL SYLLABLE GGAG +AE4E;AE4E;1101 1161 11A9;AE4E;1101 1161 11A9; # (깎; 깎; 깎; 깎; 깎; ) HANGUL SYLLABLE GGAGG +AE4F;AE4F;1101 1161 11AA;AE4F;1101 1161 11AA; # (깏; 깏; 깏; 깏; 깏; ) HANGUL SYLLABLE GGAGS +AE50;AE50;1101 1161 11AB;AE50;1101 1161 11AB; # (깐; 깐; 깐; 깐; 깐; ) HANGUL SYLLABLE GGAN +AE51;AE51;1101 1161 11AC;AE51;1101 1161 11AC; # (깑; 깑; 깑; 깑; 깑; ) HANGUL SYLLABLE GGANJ +AE52;AE52;1101 1161 11AD;AE52;1101 1161 11AD; # (깒; 깒; 깒; 깒; 깒; ) HANGUL SYLLABLE GGANH +AE53;AE53;1101 1161 11AE;AE53;1101 1161 11AE; # (깓; 깓; 깓; 깓; 깓; ) HANGUL SYLLABLE GGAD +AE54;AE54;1101 1161 11AF;AE54;1101 1161 11AF; # (깔; 깔; 깔; 깔; 깔; ) HANGUL SYLLABLE GGAL +AE55;AE55;1101 1161 11B0;AE55;1101 1161 11B0; # (깕; 깕; 깕; 깕; 깕; ) HANGUL SYLLABLE GGALG +AE56;AE56;1101 1161 11B1;AE56;1101 1161 11B1; # (깖; 깖; 깖; 깖; 깖; ) HANGUL SYLLABLE GGALM +AE57;AE57;1101 1161 11B2;AE57;1101 1161 11B2; # (깗; 깗; 깗; 깗; 깗; ) HANGUL SYLLABLE GGALB +AE58;AE58;1101 1161 11B3;AE58;1101 1161 11B3; # (깘; 깘; 깘; 깘; 깘; ) HANGUL SYLLABLE GGALS +AE59;AE59;1101 1161 11B4;AE59;1101 1161 11B4; # (깙; 깙; 깙; 깙; 깙; ) HANGUL SYLLABLE GGALT +AE5A;AE5A;1101 1161 11B5;AE5A;1101 1161 11B5; # (깚; 깚; 깚; 깚; 깚; ) HANGUL SYLLABLE GGALP +AE5B;AE5B;1101 1161 11B6;AE5B;1101 1161 11B6; # (깛; 깛; 깛; 깛; 깛; ) HANGUL SYLLABLE GGALH +AE5C;AE5C;1101 1161 11B7;AE5C;1101 1161 11B7; # (깜; 깜; 깜; 깜; 깜; ) HANGUL SYLLABLE GGAM +AE5D;AE5D;1101 1161 11B8;AE5D;1101 1161 11B8; # (깝; 깝; 깝; 깝; 깝; ) HANGUL SYLLABLE GGAB +AE5E;AE5E;1101 1161 11B9;AE5E;1101 1161 11B9; # (깞; 깞; 깞; 깞; 깞; ) HANGUL SYLLABLE GGABS +AE5F;AE5F;1101 1161 11BA;AE5F;1101 1161 11BA; # (깟; 깟; 깟; 깟; 깟; ) HANGUL SYLLABLE GGAS +AE60;AE60;1101 1161 11BB;AE60;1101 1161 11BB; # (깠; 깠; 깠; 깠; 깠; ) HANGUL SYLLABLE GGASS +AE61;AE61;1101 1161 11BC;AE61;1101 1161 11BC; # (깡; 깡; 깡; 깡; 깡; ) HANGUL SYLLABLE GGANG +AE62;AE62;1101 1161 11BD;AE62;1101 1161 11BD; # (깢; 깢; 깢; 깢; 깢; ) HANGUL SYLLABLE GGAJ +AE63;AE63;1101 1161 11BE;AE63;1101 1161 11BE; # (깣; 깣; 깣; 깣; 깣; ) HANGUL SYLLABLE GGAC +AE64;AE64;1101 1161 11BF;AE64;1101 1161 11BF; # (깤; 깤; 깤; 깤; 깤; ) HANGUL SYLLABLE GGAK +AE65;AE65;1101 1161 11C0;AE65;1101 1161 11C0; # (깥; 깥; 깥; 깥; 깥; ) HANGUL SYLLABLE GGAT +AE66;AE66;1101 1161 11C1;AE66;1101 1161 11C1; # (깦; 깦; 깦; 깦; 깦; ) HANGUL SYLLABLE GGAP +AE67;AE67;1101 1161 11C2;AE67;1101 1161 11C2; # (깧; 깧; 깧; 깧; 깧; ) HANGUL SYLLABLE GGAH +AE68;AE68;1101 1162;AE68;1101 1162; # (깨; 깨; 깨; 깨; 깨; ) HANGUL SYLLABLE GGAE +AE69;AE69;1101 1162 11A8;AE69;1101 1162 11A8; # (깩; 깩; 깩; 깩; 깩; ) HANGUL SYLLABLE GGAEG +AE6A;AE6A;1101 1162 11A9;AE6A;1101 1162 11A9; # (깪; 깪; 깪; 깪; 깪; ) HANGUL SYLLABLE GGAEGG +AE6B;AE6B;1101 1162 11AA;AE6B;1101 1162 11AA; # (깫; 깫; 깫; 깫; 깫; ) HANGUL SYLLABLE GGAEGS +AE6C;AE6C;1101 1162 11AB;AE6C;1101 1162 11AB; # (깬; 깬; 깬; 깬; 깬; ) HANGUL SYLLABLE GGAEN +AE6D;AE6D;1101 1162 11AC;AE6D;1101 1162 11AC; # (깭; 깭; 깭; 깭; 깭; ) HANGUL SYLLABLE GGAENJ +AE6E;AE6E;1101 1162 11AD;AE6E;1101 1162 11AD; # (깮; 깮; 깮; 깮; 깮; ) HANGUL SYLLABLE GGAENH +AE6F;AE6F;1101 1162 11AE;AE6F;1101 1162 11AE; # (깯; 깯; 깯; 깯; 깯; ) HANGUL SYLLABLE GGAED +AE70;AE70;1101 1162 11AF;AE70;1101 1162 11AF; # (깰; 깰; 깰; 깰; 깰; ) HANGUL SYLLABLE GGAEL +AE71;AE71;1101 1162 11B0;AE71;1101 1162 11B0; # (깱; 깱; 깱; 깱; 깱; ) HANGUL SYLLABLE GGAELG +AE72;AE72;1101 1162 11B1;AE72;1101 1162 11B1; # (깲; 깲; 깲; 깲; 깲; ) HANGUL SYLLABLE GGAELM +AE73;AE73;1101 1162 11B2;AE73;1101 1162 11B2; # (깳; 깳; 깳; 깳; 깳; ) HANGUL SYLLABLE GGAELB +AE74;AE74;1101 1162 11B3;AE74;1101 1162 11B3; # (깴; 깴; 깴; 깴; 깴; ) HANGUL SYLLABLE GGAELS +AE75;AE75;1101 1162 11B4;AE75;1101 1162 11B4; # (깵; 깵; 깵; 깵; 깵; ) HANGUL SYLLABLE GGAELT +AE76;AE76;1101 1162 11B5;AE76;1101 1162 11B5; # (깶; 깶; 깶; 깶; 깶; ) HANGUL SYLLABLE GGAELP +AE77;AE77;1101 1162 11B6;AE77;1101 1162 11B6; # (깷; 깷; 깷; 깷; 깷; ) HANGUL SYLLABLE GGAELH +AE78;AE78;1101 1162 11B7;AE78;1101 1162 11B7; # (깸; 깸; 깸; 깸; 깸; ) HANGUL SYLLABLE GGAEM +AE79;AE79;1101 1162 11B8;AE79;1101 1162 11B8; # (깹; 깹; 깹; 깹; 깹; ) HANGUL SYLLABLE GGAEB +AE7A;AE7A;1101 1162 11B9;AE7A;1101 1162 11B9; # (깺; 깺; 깺; 깺; 깺; ) HANGUL SYLLABLE GGAEBS +AE7B;AE7B;1101 1162 11BA;AE7B;1101 1162 11BA; # (깻; 깻; 깻; 깻; 깻; ) HANGUL SYLLABLE GGAES +AE7C;AE7C;1101 1162 11BB;AE7C;1101 1162 11BB; # (깼; 깼; 깼; 깼; 깼; ) HANGUL SYLLABLE GGAESS +AE7D;AE7D;1101 1162 11BC;AE7D;1101 1162 11BC; # (깽; 깽; 깽; 깽; 깽; ) HANGUL SYLLABLE GGAENG +AE7E;AE7E;1101 1162 11BD;AE7E;1101 1162 11BD; # (깾; 깾; 깾; 깾; 깾; ) HANGUL SYLLABLE GGAEJ +AE7F;AE7F;1101 1162 11BE;AE7F;1101 1162 11BE; # (깿; 깿; 깿; 깿; 깿; ) HANGUL SYLLABLE GGAEC +AE80;AE80;1101 1162 11BF;AE80;1101 1162 11BF; # (꺀; 꺀; 꺀; 꺀; 꺀; ) HANGUL SYLLABLE GGAEK +AE81;AE81;1101 1162 11C0;AE81;1101 1162 11C0; # (꺁; 꺁; 꺁; 꺁; 꺁; ) HANGUL SYLLABLE GGAET +AE82;AE82;1101 1162 11C1;AE82;1101 1162 11C1; # (꺂; 꺂; 꺂; 꺂; 꺂; ) HANGUL SYLLABLE GGAEP +AE83;AE83;1101 1162 11C2;AE83;1101 1162 11C2; # (꺃; 꺃; 꺃; 꺃; 꺃; ) HANGUL SYLLABLE GGAEH +AE84;AE84;1101 1163;AE84;1101 1163; # (꺄; 꺄; 꺄; 꺄; 꺄; ) HANGUL SYLLABLE GGYA +AE85;AE85;1101 1163 11A8;AE85;1101 1163 11A8; # (꺅; 꺅; 꺅; 꺅; 꺅; ) HANGUL SYLLABLE GGYAG +AE86;AE86;1101 1163 11A9;AE86;1101 1163 11A9; # (꺆; 꺆; 꺆; 꺆; 꺆; ) HANGUL SYLLABLE GGYAGG +AE87;AE87;1101 1163 11AA;AE87;1101 1163 11AA; # (꺇; 꺇; 꺇; 꺇; 꺇; ) HANGUL SYLLABLE GGYAGS +AE88;AE88;1101 1163 11AB;AE88;1101 1163 11AB; # (꺈; 꺈; 꺈; 꺈; 꺈; ) HANGUL SYLLABLE GGYAN +AE89;AE89;1101 1163 11AC;AE89;1101 1163 11AC; # (꺉; 꺉; 꺉; 꺉; 꺉; ) HANGUL SYLLABLE GGYANJ +AE8A;AE8A;1101 1163 11AD;AE8A;1101 1163 11AD; # (꺊; 꺊; 꺊; 꺊; 꺊; ) HANGUL SYLLABLE GGYANH +AE8B;AE8B;1101 1163 11AE;AE8B;1101 1163 11AE; # (꺋; 꺋; 꺋; 꺋; 꺋; ) HANGUL SYLLABLE GGYAD +AE8C;AE8C;1101 1163 11AF;AE8C;1101 1163 11AF; # (꺌; 꺌; 꺌; 꺌; 꺌; ) HANGUL SYLLABLE GGYAL +AE8D;AE8D;1101 1163 11B0;AE8D;1101 1163 11B0; # (꺍; 꺍; 꺍; 꺍; 꺍; ) HANGUL SYLLABLE GGYALG +AE8E;AE8E;1101 1163 11B1;AE8E;1101 1163 11B1; # (꺎; 꺎; 꺎; 꺎; 꺎; ) HANGUL SYLLABLE GGYALM +AE8F;AE8F;1101 1163 11B2;AE8F;1101 1163 11B2; # (꺏; 꺏; 꺏; 꺏; 꺏; ) HANGUL SYLLABLE GGYALB +AE90;AE90;1101 1163 11B3;AE90;1101 1163 11B3; # (꺐; 꺐; 꺐; 꺐; 꺐; ) HANGUL SYLLABLE GGYALS +AE91;AE91;1101 1163 11B4;AE91;1101 1163 11B4; # (꺑; 꺑; 꺑; 꺑; 꺑; ) HANGUL SYLLABLE GGYALT +AE92;AE92;1101 1163 11B5;AE92;1101 1163 11B5; # (꺒; 꺒; 꺒; 꺒; 꺒; ) HANGUL SYLLABLE GGYALP +AE93;AE93;1101 1163 11B6;AE93;1101 1163 11B6; # (꺓; 꺓; 꺓; 꺓; 꺓; ) HANGUL SYLLABLE GGYALH +AE94;AE94;1101 1163 11B7;AE94;1101 1163 11B7; # (꺔; 꺔; 꺔; 꺔; 꺔; ) HANGUL SYLLABLE GGYAM +AE95;AE95;1101 1163 11B8;AE95;1101 1163 11B8; # (꺕; 꺕; 꺕; 꺕; 꺕; ) HANGUL SYLLABLE GGYAB +AE96;AE96;1101 1163 11B9;AE96;1101 1163 11B9; # (꺖; 꺖; 꺖; 꺖; 꺖; ) HANGUL SYLLABLE GGYABS +AE97;AE97;1101 1163 11BA;AE97;1101 1163 11BA; # (꺗; 꺗; 꺗; 꺗; 꺗; ) HANGUL SYLLABLE GGYAS +AE98;AE98;1101 1163 11BB;AE98;1101 1163 11BB; # (꺘; 꺘; 꺘; 꺘; 꺘; ) HANGUL SYLLABLE GGYASS +AE99;AE99;1101 1163 11BC;AE99;1101 1163 11BC; # (꺙; 꺙; 꺙; 꺙; 꺙; ) HANGUL SYLLABLE GGYANG +AE9A;AE9A;1101 1163 11BD;AE9A;1101 1163 11BD; # (꺚; 꺚; 꺚; 꺚; 꺚; ) HANGUL SYLLABLE GGYAJ +AE9B;AE9B;1101 1163 11BE;AE9B;1101 1163 11BE; # (꺛; 꺛; 꺛; 꺛; 꺛; ) HANGUL SYLLABLE GGYAC +AE9C;AE9C;1101 1163 11BF;AE9C;1101 1163 11BF; # (꺜; 꺜; 꺜; 꺜; 꺜; ) HANGUL SYLLABLE GGYAK +AE9D;AE9D;1101 1163 11C0;AE9D;1101 1163 11C0; # (꺝; 꺝; 꺝; 꺝; 꺝; ) HANGUL SYLLABLE GGYAT +AE9E;AE9E;1101 1163 11C1;AE9E;1101 1163 11C1; # (꺞; 꺞; 꺞; 꺞; 꺞; ) HANGUL SYLLABLE GGYAP +AE9F;AE9F;1101 1163 11C2;AE9F;1101 1163 11C2; # (꺟; 꺟; 꺟; 꺟; 꺟; ) HANGUL SYLLABLE GGYAH +AEA0;AEA0;1101 1164;AEA0;1101 1164; # (꺠; 꺠; 꺠; 꺠; 꺠; ) HANGUL SYLLABLE GGYAE +AEA1;AEA1;1101 1164 11A8;AEA1;1101 1164 11A8; # (꺡; 꺡; 꺡; 꺡; 꺡; ) HANGUL SYLLABLE GGYAEG +AEA2;AEA2;1101 1164 11A9;AEA2;1101 1164 11A9; # (꺢; 꺢; 꺢; 꺢; 꺢; ) HANGUL SYLLABLE GGYAEGG +AEA3;AEA3;1101 1164 11AA;AEA3;1101 1164 11AA; # (꺣; 꺣; 꺣; 꺣; 꺣; ) HANGUL SYLLABLE GGYAEGS +AEA4;AEA4;1101 1164 11AB;AEA4;1101 1164 11AB; # (꺤; 꺤; 꺤; 꺤; 꺤; ) HANGUL SYLLABLE GGYAEN +AEA5;AEA5;1101 1164 11AC;AEA5;1101 1164 11AC; # (꺥; 꺥; 꺥; 꺥; 꺥; ) HANGUL SYLLABLE GGYAENJ +AEA6;AEA6;1101 1164 11AD;AEA6;1101 1164 11AD; # (꺦; 꺦; 꺦; 꺦; 꺦; ) HANGUL SYLLABLE GGYAENH +AEA7;AEA7;1101 1164 11AE;AEA7;1101 1164 11AE; # (꺧; 꺧; 꺧; 꺧; 꺧; ) HANGUL SYLLABLE GGYAED +AEA8;AEA8;1101 1164 11AF;AEA8;1101 1164 11AF; # (꺨; 꺨; 꺨; 꺨; 꺨; ) HANGUL SYLLABLE GGYAEL +AEA9;AEA9;1101 1164 11B0;AEA9;1101 1164 11B0; # (꺩; 꺩; 꺩; 꺩; 꺩; ) HANGUL SYLLABLE GGYAELG +AEAA;AEAA;1101 1164 11B1;AEAA;1101 1164 11B1; # (꺪; 꺪; 꺪; 꺪; 꺪; ) HANGUL SYLLABLE GGYAELM +AEAB;AEAB;1101 1164 11B2;AEAB;1101 1164 11B2; # (꺫; 꺫; 꺫; 꺫; 꺫; ) HANGUL SYLLABLE GGYAELB +AEAC;AEAC;1101 1164 11B3;AEAC;1101 1164 11B3; # (꺬; 꺬; 꺬; 꺬; 꺬; ) HANGUL SYLLABLE GGYAELS +AEAD;AEAD;1101 1164 11B4;AEAD;1101 1164 11B4; # (꺭; 꺭; 꺭; 꺭; 꺭; ) HANGUL SYLLABLE GGYAELT +AEAE;AEAE;1101 1164 11B5;AEAE;1101 1164 11B5; # (꺮; 꺮; 꺮; 꺮; 꺮; ) HANGUL SYLLABLE GGYAELP +AEAF;AEAF;1101 1164 11B6;AEAF;1101 1164 11B6; # (꺯; 꺯; 꺯; 꺯; 꺯; ) HANGUL SYLLABLE GGYAELH +AEB0;AEB0;1101 1164 11B7;AEB0;1101 1164 11B7; # (꺰; 꺰; 꺰; 꺰; 꺰; ) HANGUL SYLLABLE GGYAEM +AEB1;AEB1;1101 1164 11B8;AEB1;1101 1164 11B8; # (꺱; 꺱; 꺱; 꺱; 꺱; ) HANGUL SYLLABLE GGYAEB +AEB2;AEB2;1101 1164 11B9;AEB2;1101 1164 11B9; # (꺲; 꺲; 꺲; 꺲; 꺲; ) HANGUL SYLLABLE GGYAEBS +AEB3;AEB3;1101 1164 11BA;AEB3;1101 1164 11BA; # (꺳; 꺳; 꺳; 꺳; 꺳; ) HANGUL SYLLABLE GGYAES +AEB4;AEB4;1101 1164 11BB;AEB4;1101 1164 11BB; # (꺴; 꺴; 꺴; 꺴; 꺴; ) HANGUL SYLLABLE GGYAESS +AEB5;AEB5;1101 1164 11BC;AEB5;1101 1164 11BC; # (꺵; 꺵; 꺵; 꺵; 꺵; ) HANGUL SYLLABLE GGYAENG +AEB6;AEB6;1101 1164 11BD;AEB6;1101 1164 11BD; # (꺶; 꺶; 꺶; 꺶; 꺶; ) HANGUL SYLLABLE GGYAEJ +AEB7;AEB7;1101 1164 11BE;AEB7;1101 1164 11BE; # (꺷; 꺷; 꺷; 꺷; 꺷; ) HANGUL SYLLABLE GGYAEC +AEB8;AEB8;1101 1164 11BF;AEB8;1101 1164 11BF; # (꺸; 꺸; 꺸; 꺸; 꺸; ) HANGUL SYLLABLE GGYAEK +AEB9;AEB9;1101 1164 11C0;AEB9;1101 1164 11C0; # (꺹; 꺹; 꺹; 꺹; 꺹; ) HANGUL SYLLABLE GGYAET +AEBA;AEBA;1101 1164 11C1;AEBA;1101 1164 11C1; # (꺺; 꺺; 꺺; 꺺; 꺺; ) HANGUL SYLLABLE GGYAEP +AEBB;AEBB;1101 1164 11C2;AEBB;1101 1164 11C2; # (꺻; 꺻; 꺻; 꺻; 꺻; ) HANGUL SYLLABLE GGYAEH +AEBC;AEBC;1101 1165;AEBC;1101 1165; # (꺼; 꺼; 꺼; 꺼; 꺼; ) HANGUL SYLLABLE GGEO +AEBD;AEBD;1101 1165 11A8;AEBD;1101 1165 11A8; # (꺽; 꺽; 꺽; 꺽; 꺽; ) HANGUL SYLLABLE GGEOG +AEBE;AEBE;1101 1165 11A9;AEBE;1101 1165 11A9; # (꺾; 꺾; 꺾; 꺾; 꺾; ) HANGUL SYLLABLE GGEOGG +AEBF;AEBF;1101 1165 11AA;AEBF;1101 1165 11AA; # (꺿; 꺿; 꺿; 꺿; 꺿; ) HANGUL SYLLABLE GGEOGS +AEC0;AEC0;1101 1165 11AB;AEC0;1101 1165 11AB; # (껀; 껀; 껀; 껀; 껀; ) HANGUL SYLLABLE GGEON +AEC1;AEC1;1101 1165 11AC;AEC1;1101 1165 11AC; # (껁; 껁; 껁; 껁; 껁; ) HANGUL SYLLABLE GGEONJ +AEC2;AEC2;1101 1165 11AD;AEC2;1101 1165 11AD; # (껂; 껂; 껂; 껂; 껂; ) HANGUL SYLLABLE GGEONH +AEC3;AEC3;1101 1165 11AE;AEC3;1101 1165 11AE; # (껃; 껃; 껃; 껃; 껃; ) HANGUL SYLLABLE GGEOD +AEC4;AEC4;1101 1165 11AF;AEC4;1101 1165 11AF; # (껄; 껄; 껄; 껄; 껄; ) HANGUL SYLLABLE GGEOL +AEC5;AEC5;1101 1165 11B0;AEC5;1101 1165 11B0; # (껅; 껅; 껅; 껅; 껅; ) HANGUL SYLLABLE GGEOLG +AEC6;AEC6;1101 1165 11B1;AEC6;1101 1165 11B1; # (껆; 껆; 껆; 껆; 껆; ) HANGUL SYLLABLE GGEOLM +AEC7;AEC7;1101 1165 11B2;AEC7;1101 1165 11B2; # (껇; 껇; 껇; 껇; 껇; ) HANGUL SYLLABLE GGEOLB +AEC8;AEC8;1101 1165 11B3;AEC8;1101 1165 11B3; # (껈; 껈; 껈; 껈; 껈; ) HANGUL SYLLABLE GGEOLS +AEC9;AEC9;1101 1165 11B4;AEC9;1101 1165 11B4; # (껉; 껉; 껉; 껉; 껉; ) HANGUL SYLLABLE GGEOLT +AECA;AECA;1101 1165 11B5;AECA;1101 1165 11B5; # (껊; 껊; 껊; 껊; 껊; ) HANGUL SYLLABLE GGEOLP +AECB;AECB;1101 1165 11B6;AECB;1101 1165 11B6; # (껋; 껋; 껋; 껋; 껋; ) HANGUL SYLLABLE GGEOLH +AECC;AECC;1101 1165 11B7;AECC;1101 1165 11B7; # (껌; 껌; 껌; 껌; 껌; ) HANGUL SYLLABLE GGEOM +AECD;AECD;1101 1165 11B8;AECD;1101 1165 11B8; # (껍; 껍; 껍; 껍; 껍; ) HANGUL SYLLABLE GGEOB +AECE;AECE;1101 1165 11B9;AECE;1101 1165 11B9; # (껎; 껎; 껎; 껎; 껎; ) HANGUL SYLLABLE GGEOBS +AECF;AECF;1101 1165 11BA;AECF;1101 1165 11BA; # (껏; 껏; 껏; 껏; 껏; ) HANGUL SYLLABLE GGEOS +AED0;AED0;1101 1165 11BB;AED0;1101 1165 11BB; # (껐; 껐; 껐; 껐; 껐; ) HANGUL SYLLABLE GGEOSS +AED1;AED1;1101 1165 11BC;AED1;1101 1165 11BC; # (껑; 껑; 껑; 껑; 껑; ) HANGUL SYLLABLE GGEONG +AED2;AED2;1101 1165 11BD;AED2;1101 1165 11BD; # (껒; 껒; 껒; 껒; 껒; ) HANGUL SYLLABLE GGEOJ +AED3;AED3;1101 1165 11BE;AED3;1101 1165 11BE; # (껓; 껓; 껓; 껓; 껓; ) HANGUL SYLLABLE GGEOC +AED4;AED4;1101 1165 11BF;AED4;1101 1165 11BF; # (껔; 껔; 껔; 껔; 껔; ) HANGUL SYLLABLE GGEOK +AED5;AED5;1101 1165 11C0;AED5;1101 1165 11C0; # (껕; 껕; 껕; 껕; 껕; ) HANGUL SYLLABLE GGEOT +AED6;AED6;1101 1165 11C1;AED6;1101 1165 11C1; # (껖; 껖; 껖; 껖; 껖; ) HANGUL SYLLABLE GGEOP +AED7;AED7;1101 1165 11C2;AED7;1101 1165 11C2; # (껗; 껗; 껗; 껗; 껗; ) HANGUL SYLLABLE GGEOH +AED8;AED8;1101 1166;AED8;1101 1166; # (께; 께; 께; 께; 께; ) HANGUL SYLLABLE GGE +AED9;AED9;1101 1166 11A8;AED9;1101 1166 11A8; # (껙; 껙; 껙; 껙; 껙; ) HANGUL SYLLABLE GGEG +AEDA;AEDA;1101 1166 11A9;AEDA;1101 1166 11A9; # (껚; 껚; 껚; 껚; 껚; ) HANGUL SYLLABLE GGEGG +AEDB;AEDB;1101 1166 11AA;AEDB;1101 1166 11AA; # (껛; 껛; 껛; 껛; 껛; ) HANGUL SYLLABLE GGEGS +AEDC;AEDC;1101 1166 11AB;AEDC;1101 1166 11AB; # (껜; 껜; 껜; 껜; 껜; ) HANGUL SYLLABLE GGEN +AEDD;AEDD;1101 1166 11AC;AEDD;1101 1166 11AC; # (껝; 껝; 껝; 껝; 껝; ) HANGUL SYLLABLE GGENJ +AEDE;AEDE;1101 1166 11AD;AEDE;1101 1166 11AD; # (껞; 껞; 껞; 껞; 껞; ) HANGUL SYLLABLE GGENH +AEDF;AEDF;1101 1166 11AE;AEDF;1101 1166 11AE; # (껟; 껟; 껟; 껟; 껟; ) HANGUL SYLLABLE GGED +AEE0;AEE0;1101 1166 11AF;AEE0;1101 1166 11AF; # (껠; 껠; 껠; 껠; 껠; ) HANGUL SYLLABLE GGEL +AEE1;AEE1;1101 1166 11B0;AEE1;1101 1166 11B0; # (껡; 껡; 껡; 껡; 껡; ) HANGUL SYLLABLE GGELG +AEE2;AEE2;1101 1166 11B1;AEE2;1101 1166 11B1; # (껢; 껢; 껢; 껢; 껢; ) HANGUL SYLLABLE GGELM +AEE3;AEE3;1101 1166 11B2;AEE3;1101 1166 11B2; # (껣; 껣; 껣; 껣; 껣; ) HANGUL SYLLABLE GGELB +AEE4;AEE4;1101 1166 11B3;AEE4;1101 1166 11B3; # (껤; 껤; 껤; 껤; 껤; ) HANGUL SYLLABLE GGELS +AEE5;AEE5;1101 1166 11B4;AEE5;1101 1166 11B4; # (껥; 껥; 껥; 껥; 껥; ) HANGUL SYLLABLE GGELT +AEE6;AEE6;1101 1166 11B5;AEE6;1101 1166 11B5; # (껦; 껦; 껦; 껦; 껦; ) HANGUL SYLLABLE GGELP +AEE7;AEE7;1101 1166 11B6;AEE7;1101 1166 11B6; # (껧; 껧; 껧; 껧; 껧; ) HANGUL SYLLABLE GGELH +AEE8;AEE8;1101 1166 11B7;AEE8;1101 1166 11B7; # (껨; 껨; 껨; 껨; 껨; ) HANGUL SYLLABLE GGEM +AEE9;AEE9;1101 1166 11B8;AEE9;1101 1166 11B8; # (껩; 껩; 껩; 껩; 껩; ) HANGUL SYLLABLE GGEB +AEEA;AEEA;1101 1166 11B9;AEEA;1101 1166 11B9; # (껪; 껪; 껪; 껪; 껪; ) HANGUL SYLLABLE GGEBS +AEEB;AEEB;1101 1166 11BA;AEEB;1101 1166 11BA; # (껫; 껫; 껫; 껫; 껫; ) HANGUL SYLLABLE GGES +AEEC;AEEC;1101 1166 11BB;AEEC;1101 1166 11BB; # (껬; 껬; 껬; 껬; 껬; ) HANGUL SYLLABLE GGESS +AEED;AEED;1101 1166 11BC;AEED;1101 1166 11BC; # (껭; 껭; 껭; 껭; 껭; ) HANGUL SYLLABLE GGENG +AEEE;AEEE;1101 1166 11BD;AEEE;1101 1166 11BD; # (껮; 껮; 껮; 껮; 껮; ) HANGUL SYLLABLE GGEJ +AEEF;AEEF;1101 1166 11BE;AEEF;1101 1166 11BE; # (껯; 껯; 껯; 껯; 껯; ) HANGUL SYLLABLE GGEC +AEF0;AEF0;1101 1166 11BF;AEF0;1101 1166 11BF; # (껰; 껰; 껰; 껰; 껰; ) HANGUL SYLLABLE GGEK +AEF1;AEF1;1101 1166 11C0;AEF1;1101 1166 11C0; # (껱; 껱; 껱; 껱; 껱; ) HANGUL SYLLABLE GGET +AEF2;AEF2;1101 1166 11C1;AEF2;1101 1166 11C1; # (껲; 껲; 껲; 껲; 껲; ) HANGUL SYLLABLE GGEP +AEF3;AEF3;1101 1166 11C2;AEF3;1101 1166 11C2; # (껳; 껳; 껳; 껳; 껳; ) HANGUL SYLLABLE GGEH +AEF4;AEF4;1101 1167;AEF4;1101 1167; # (껴; 껴; 껴; 껴; 껴; ) HANGUL SYLLABLE GGYEO +AEF5;AEF5;1101 1167 11A8;AEF5;1101 1167 11A8; # (껵; 껵; 껵; 껵; 껵; ) HANGUL SYLLABLE GGYEOG +AEF6;AEF6;1101 1167 11A9;AEF6;1101 1167 11A9; # (껶; 껶; 껶; 껶; 껶; ) HANGUL SYLLABLE GGYEOGG +AEF7;AEF7;1101 1167 11AA;AEF7;1101 1167 11AA; # (껷; 껷; 껷; 껷; 껷; ) HANGUL SYLLABLE GGYEOGS +AEF8;AEF8;1101 1167 11AB;AEF8;1101 1167 11AB; # (껸; 껸; 껸; 껸; 껸; ) HANGUL SYLLABLE GGYEON +AEF9;AEF9;1101 1167 11AC;AEF9;1101 1167 11AC; # (껹; 껹; 껹; 껹; 껹; ) HANGUL SYLLABLE GGYEONJ +AEFA;AEFA;1101 1167 11AD;AEFA;1101 1167 11AD; # (껺; 껺; 껺; 껺; 껺; ) HANGUL SYLLABLE GGYEONH +AEFB;AEFB;1101 1167 11AE;AEFB;1101 1167 11AE; # (껻; 껻; 껻; 껻; 껻; ) HANGUL SYLLABLE GGYEOD +AEFC;AEFC;1101 1167 11AF;AEFC;1101 1167 11AF; # (껼; 껼; 껼; 껼; 껼; ) HANGUL SYLLABLE GGYEOL +AEFD;AEFD;1101 1167 11B0;AEFD;1101 1167 11B0; # (껽; 껽; 껽; 껽; 껽; ) HANGUL SYLLABLE GGYEOLG +AEFE;AEFE;1101 1167 11B1;AEFE;1101 1167 11B1; # (껾; 껾; 껾; 껾; 껾; ) HANGUL SYLLABLE GGYEOLM +AEFF;AEFF;1101 1167 11B2;AEFF;1101 1167 11B2; # (껿; 껿; 껿; 껿; 껿; ) HANGUL SYLLABLE GGYEOLB +AF00;AF00;1101 1167 11B3;AF00;1101 1167 11B3; # (꼀; 꼀; 꼀; 꼀; 꼀; ) HANGUL SYLLABLE GGYEOLS +AF01;AF01;1101 1167 11B4;AF01;1101 1167 11B4; # (꼁; 꼁; 꼁; 꼁; 꼁; ) HANGUL SYLLABLE GGYEOLT +AF02;AF02;1101 1167 11B5;AF02;1101 1167 11B5; # (꼂; 꼂; 꼂; 꼂; 꼂; ) HANGUL SYLLABLE GGYEOLP +AF03;AF03;1101 1167 11B6;AF03;1101 1167 11B6; # (꼃; 꼃; 꼃; 꼃; 꼃; ) HANGUL SYLLABLE GGYEOLH +AF04;AF04;1101 1167 11B7;AF04;1101 1167 11B7; # (꼄; 꼄; 꼄; 꼄; 꼄; ) HANGUL SYLLABLE GGYEOM +AF05;AF05;1101 1167 11B8;AF05;1101 1167 11B8; # (꼅; 꼅; 꼅; 꼅; 꼅; ) HANGUL SYLLABLE GGYEOB +AF06;AF06;1101 1167 11B9;AF06;1101 1167 11B9; # (꼆; 꼆; 꼆; 꼆; 꼆; ) HANGUL SYLLABLE GGYEOBS +AF07;AF07;1101 1167 11BA;AF07;1101 1167 11BA; # (꼇; 꼇; 꼇; 꼇; 꼇; ) HANGUL SYLLABLE GGYEOS +AF08;AF08;1101 1167 11BB;AF08;1101 1167 11BB; # (꼈; 꼈; 꼈; 꼈; 꼈; ) HANGUL SYLLABLE GGYEOSS +AF09;AF09;1101 1167 11BC;AF09;1101 1167 11BC; # (꼉; 꼉; 꼉; 꼉; 꼉; ) HANGUL SYLLABLE GGYEONG +AF0A;AF0A;1101 1167 11BD;AF0A;1101 1167 11BD; # (꼊; 꼊; 꼊; 꼊; 꼊; ) HANGUL SYLLABLE GGYEOJ +AF0B;AF0B;1101 1167 11BE;AF0B;1101 1167 11BE; # (꼋; 꼋; 꼋; 꼋; 꼋; ) HANGUL SYLLABLE GGYEOC +AF0C;AF0C;1101 1167 11BF;AF0C;1101 1167 11BF; # (꼌; 꼌; 꼌; 꼌; 꼌; ) HANGUL SYLLABLE GGYEOK +AF0D;AF0D;1101 1167 11C0;AF0D;1101 1167 11C0; # (꼍; 꼍; 꼍; 꼍; 꼍; ) HANGUL SYLLABLE GGYEOT +AF0E;AF0E;1101 1167 11C1;AF0E;1101 1167 11C1; # (꼎; 꼎; 꼎; 꼎; 꼎; ) HANGUL SYLLABLE GGYEOP +AF0F;AF0F;1101 1167 11C2;AF0F;1101 1167 11C2; # (꼏; 꼏; 꼏; 꼏; 꼏; ) HANGUL SYLLABLE GGYEOH +AF10;AF10;1101 1168;AF10;1101 1168; # (꼐; 꼐; 꼐; 꼐; 꼐; ) HANGUL SYLLABLE GGYE +AF11;AF11;1101 1168 11A8;AF11;1101 1168 11A8; # (꼑; 꼑; 꼑; 꼑; 꼑; ) HANGUL SYLLABLE GGYEG +AF12;AF12;1101 1168 11A9;AF12;1101 1168 11A9; # (꼒; 꼒; 꼒; 꼒; 꼒; ) HANGUL SYLLABLE GGYEGG +AF13;AF13;1101 1168 11AA;AF13;1101 1168 11AA; # (꼓; 꼓; 꼓; 꼓; 꼓; ) HANGUL SYLLABLE GGYEGS +AF14;AF14;1101 1168 11AB;AF14;1101 1168 11AB; # (꼔; 꼔; 꼔; 꼔; 꼔; ) HANGUL SYLLABLE GGYEN +AF15;AF15;1101 1168 11AC;AF15;1101 1168 11AC; # (꼕; 꼕; 꼕; 꼕; 꼕; ) HANGUL SYLLABLE GGYENJ +AF16;AF16;1101 1168 11AD;AF16;1101 1168 11AD; # (꼖; 꼖; 꼖; 꼖; 꼖; ) HANGUL SYLLABLE GGYENH +AF17;AF17;1101 1168 11AE;AF17;1101 1168 11AE; # (꼗; 꼗; 꼗; 꼗; 꼗; ) HANGUL SYLLABLE GGYED +AF18;AF18;1101 1168 11AF;AF18;1101 1168 11AF; # (꼘; 꼘; 꼘; 꼘; 꼘; ) HANGUL SYLLABLE GGYEL +AF19;AF19;1101 1168 11B0;AF19;1101 1168 11B0; # (꼙; 꼙; 꼙; 꼙; 꼙; ) HANGUL SYLLABLE GGYELG +AF1A;AF1A;1101 1168 11B1;AF1A;1101 1168 11B1; # (꼚; 꼚; 꼚; 꼚; 꼚; ) HANGUL SYLLABLE GGYELM +AF1B;AF1B;1101 1168 11B2;AF1B;1101 1168 11B2; # (꼛; 꼛; 꼛; 꼛; 꼛; ) HANGUL SYLLABLE GGYELB +AF1C;AF1C;1101 1168 11B3;AF1C;1101 1168 11B3; # (꼜; 꼜; 꼜; 꼜; 꼜; ) HANGUL SYLLABLE GGYELS +AF1D;AF1D;1101 1168 11B4;AF1D;1101 1168 11B4; # (꼝; 꼝; 꼝; 꼝; 꼝; ) HANGUL SYLLABLE GGYELT +AF1E;AF1E;1101 1168 11B5;AF1E;1101 1168 11B5; # (꼞; 꼞; 꼞; 꼞; 꼞; ) HANGUL SYLLABLE GGYELP +AF1F;AF1F;1101 1168 11B6;AF1F;1101 1168 11B6; # (꼟; 꼟; 꼟; 꼟; 꼟; ) HANGUL SYLLABLE GGYELH +AF20;AF20;1101 1168 11B7;AF20;1101 1168 11B7; # (꼠; 꼠; 꼠; 꼠; 꼠; ) HANGUL SYLLABLE GGYEM +AF21;AF21;1101 1168 11B8;AF21;1101 1168 11B8; # (꼡; 꼡; 꼡; 꼡; 꼡; ) HANGUL SYLLABLE GGYEB +AF22;AF22;1101 1168 11B9;AF22;1101 1168 11B9; # (꼢; 꼢; 꼢; 꼢; 꼢; ) HANGUL SYLLABLE GGYEBS +AF23;AF23;1101 1168 11BA;AF23;1101 1168 11BA; # (꼣; 꼣; 꼣; 꼣; 꼣; ) HANGUL SYLLABLE GGYES +AF24;AF24;1101 1168 11BB;AF24;1101 1168 11BB; # (꼤; 꼤; 꼤; 꼤; 꼤; ) HANGUL SYLLABLE GGYESS +AF25;AF25;1101 1168 11BC;AF25;1101 1168 11BC; # (꼥; 꼥; 꼥; 꼥; 꼥; ) HANGUL SYLLABLE GGYENG +AF26;AF26;1101 1168 11BD;AF26;1101 1168 11BD; # (꼦; 꼦; 꼦; 꼦; 꼦; ) HANGUL SYLLABLE GGYEJ +AF27;AF27;1101 1168 11BE;AF27;1101 1168 11BE; # (꼧; 꼧; 꼧; 꼧; 꼧; ) HANGUL SYLLABLE GGYEC +AF28;AF28;1101 1168 11BF;AF28;1101 1168 11BF; # (꼨; 꼨; 꼨; 꼨; 꼨; ) HANGUL SYLLABLE GGYEK +AF29;AF29;1101 1168 11C0;AF29;1101 1168 11C0; # (꼩; 꼩; 꼩; 꼩; 꼩; ) HANGUL SYLLABLE GGYET +AF2A;AF2A;1101 1168 11C1;AF2A;1101 1168 11C1; # (꼪; 꼪; 꼪; 꼪; 꼪; ) HANGUL SYLLABLE GGYEP +AF2B;AF2B;1101 1168 11C2;AF2B;1101 1168 11C2; # (꼫; 꼫; 꼫; 꼫; 꼫; ) HANGUL SYLLABLE GGYEH +AF2C;AF2C;1101 1169;AF2C;1101 1169; # (꼬; 꼬; 꼬; 꼬; 꼬; ) HANGUL SYLLABLE GGO +AF2D;AF2D;1101 1169 11A8;AF2D;1101 1169 11A8; # (꼭; 꼭; 꼭; 꼭; 꼭; ) HANGUL SYLLABLE GGOG +AF2E;AF2E;1101 1169 11A9;AF2E;1101 1169 11A9; # (꼮; 꼮; 꼮; 꼮; 꼮; ) HANGUL SYLLABLE GGOGG +AF2F;AF2F;1101 1169 11AA;AF2F;1101 1169 11AA; # (꼯; 꼯; 꼯; 꼯; 꼯; ) HANGUL SYLLABLE GGOGS +AF30;AF30;1101 1169 11AB;AF30;1101 1169 11AB; # (꼰; 꼰; 꼰; 꼰; 꼰; ) HANGUL SYLLABLE GGON +AF31;AF31;1101 1169 11AC;AF31;1101 1169 11AC; # (꼱; 꼱; 꼱; 꼱; 꼱; ) HANGUL SYLLABLE GGONJ +AF32;AF32;1101 1169 11AD;AF32;1101 1169 11AD; # (꼲; 꼲; 꼲; 꼲; 꼲; ) HANGUL SYLLABLE GGONH +AF33;AF33;1101 1169 11AE;AF33;1101 1169 11AE; # (꼳; 꼳; 꼳; 꼳; 꼳; ) HANGUL SYLLABLE GGOD +AF34;AF34;1101 1169 11AF;AF34;1101 1169 11AF; # (꼴; 꼴; 꼴; 꼴; 꼴; ) HANGUL SYLLABLE GGOL +AF35;AF35;1101 1169 11B0;AF35;1101 1169 11B0; # (꼵; 꼵; 꼵; 꼵; 꼵; ) HANGUL SYLLABLE GGOLG +AF36;AF36;1101 1169 11B1;AF36;1101 1169 11B1; # (꼶; 꼶; 꼶; 꼶; 꼶; ) HANGUL SYLLABLE GGOLM +AF37;AF37;1101 1169 11B2;AF37;1101 1169 11B2; # (꼷; 꼷; 꼷; 꼷; 꼷; ) HANGUL SYLLABLE GGOLB +AF38;AF38;1101 1169 11B3;AF38;1101 1169 11B3; # (꼸; 꼸; 꼸; 꼸; 꼸; ) HANGUL SYLLABLE GGOLS +AF39;AF39;1101 1169 11B4;AF39;1101 1169 11B4; # (꼹; 꼹; 꼹; 꼹; 꼹; ) HANGUL SYLLABLE GGOLT +AF3A;AF3A;1101 1169 11B5;AF3A;1101 1169 11B5; # (꼺; 꼺; 꼺; 꼺; 꼺; ) HANGUL SYLLABLE GGOLP +AF3B;AF3B;1101 1169 11B6;AF3B;1101 1169 11B6; # (꼻; 꼻; 꼻; 꼻; 꼻; ) HANGUL SYLLABLE GGOLH +AF3C;AF3C;1101 1169 11B7;AF3C;1101 1169 11B7; # (꼼; 꼼; 꼼; 꼼; 꼼; ) HANGUL SYLLABLE GGOM +AF3D;AF3D;1101 1169 11B8;AF3D;1101 1169 11B8; # (꼽; 꼽; 꼽; 꼽; 꼽; ) HANGUL SYLLABLE GGOB +AF3E;AF3E;1101 1169 11B9;AF3E;1101 1169 11B9; # (꼾; 꼾; 꼾; 꼾; 꼾; ) HANGUL SYLLABLE GGOBS +AF3F;AF3F;1101 1169 11BA;AF3F;1101 1169 11BA; # (꼿; 꼿; 꼿; 꼿; 꼿; ) HANGUL SYLLABLE GGOS +AF40;AF40;1101 1169 11BB;AF40;1101 1169 11BB; # (꽀; 꽀; 꽀; 꽀; 꽀; ) HANGUL SYLLABLE GGOSS +AF41;AF41;1101 1169 11BC;AF41;1101 1169 11BC; # (꽁; 꽁; 꽁; 꽁; 꽁; ) HANGUL SYLLABLE GGONG +AF42;AF42;1101 1169 11BD;AF42;1101 1169 11BD; # (꽂; 꽂; 꽂; 꽂; 꽂; ) HANGUL SYLLABLE GGOJ +AF43;AF43;1101 1169 11BE;AF43;1101 1169 11BE; # (꽃; 꽃; 꽃; 꽃; 꽃; ) HANGUL SYLLABLE GGOC +AF44;AF44;1101 1169 11BF;AF44;1101 1169 11BF; # (꽄; 꽄; 꽄; 꽄; 꽄; ) HANGUL SYLLABLE GGOK +AF45;AF45;1101 1169 11C0;AF45;1101 1169 11C0; # (꽅; 꽅; 꽅; 꽅; 꽅; ) HANGUL SYLLABLE GGOT +AF46;AF46;1101 1169 11C1;AF46;1101 1169 11C1; # (꽆; 꽆; 꽆; 꽆; 꽆; ) HANGUL SYLLABLE GGOP +AF47;AF47;1101 1169 11C2;AF47;1101 1169 11C2; # (꽇; 꽇; 꽇; 꽇; 꽇; ) HANGUL SYLLABLE GGOH +AF48;AF48;1101 116A;AF48;1101 116A; # (꽈; 꽈; 꽈; 꽈; 꽈; ) HANGUL SYLLABLE GGWA +AF49;AF49;1101 116A 11A8;AF49;1101 116A 11A8; # (꽉; 꽉; 꽉; 꽉; 꽉; ) HANGUL SYLLABLE GGWAG +AF4A;AF4A;1101 116A 11A9;AF4A;1101 116A 11A9; # (꽊; 꽊; 꽊; 꽊; 꽊; ) HANGUL SYLLABLE GGWAGG +AF4B;AF4B;1101 116A 11AA;AF4B;1101 116A 11AA; # (꽋; 꽋; 꽋; 꽋; 꽋; ) HANGUL SYLLABLE GGWAGS +AF4C;AF4C;1101 116A 11AB;AF4C;1101 116A 11AB; # (꽌; 꽌; 꽌; 꽌; 꽌; ) HANGUL SYLLABLE GGWAN +AF4D;AF4D;1101 116A 11AC;AF4D;1101 116A 11AC; # (꽍; 꽍; 꽍; 꽍; 꽍; ) HANGUL SYLLABLE GGWANJ +AF4E;AF4E;1101 116A 11AD;AF4E;1101 116A 11AD; # (꽎; 꽎; 꽎; 꽎; 꽎; ) HANGUL SYLLABLE GGWANH +AF4F;AF4F;1101 116A 11AE;AF4F;1101 116A 11AE; # (꽏; 꽏; 꽏; 꽏; 꽏; ) HANGUL SYLLABLE GGWAD +AF50;AF50;1101 116A 11AF;AF50;1101 116A 11AF; # (꽐; 꽐; 꽐; 꽐; 꽐; ) HANGUL SYLLABLE GGWAL +AF51;AF51;1101 116A 11B0;AF51;1101 116A 11B0; # (꽑; 꽑; 꽑; 꽑; 꽑; ) HANGUL SYLLABLE GGWALG +AF52;AF52;1101 116A 11B1;AF52;1101 116A 11B1; # (꽒; 꽒; 꽒; 꽒; 꽒; ) HANGUL SYLLABLE GGWALM +AF53;AF53;1101 116A 11B2;AF53;1101 116A 11B2; # (꽓; 꽓; 꽓; 꽓; 꽓; ) HANGUL SYLLABLE GGWALB +AF54;AF54;1101 116A 11B3;AF54;1101 116A 11B3; # (꽔; 꽔; 꽔; 꽔; 꽔; ) HANGUL SYLLABLE GGWALS +AF55;AF55;1101 116A 11B4;AF55;1101 116A 11B4; # (꽕; 꽕; 꽕; 꽕; 꽕; ) HANGUL SYLLABLE GGWALT +AF56;AF56;1101 116A 11B5;AF56;1101 116A 11B5; # (꽖; 꽖; 꽖; 꽖; 꽖; ) HANGUL SYLLABLE GGWALP +AF57;AF57;1101 116A 11B6;AF57;1101 116A 11B6; # (꽗; 꽗; 꽗; 꽗; 꽗; ) HANGUL SYLLABLE GGWALH +AF58;AF58;1101 116A 11B7;AF58;1101 116A 11B7; # (꽘; 꽘; 꽘; 꽘; 꽘; ) HANGUL SYLLABLE GGWAM +AF59;AF59;1101 116A 11B8;AF59;1101 116A 11B8; # (꽙; 꽙; 꽙; 꽙; 꽙; ) HANGUL SYLLABLE GGWAB +AF5A;AF5A;1101 116A 11B9;AF5A;1101 116A 11B9; # (꽚; 꽚; 꽚; 꽚; 꽚; ) HANGUL SYLLABLE GGWABS +AF5B;AF5B;1101 116A 11BA;AF5B;1101 116A 11BA; # (꽛; 꽛; 꽛; 꽛; 꽛; ) HANGUL SYLLABLE GGWAS +AF5C;AF5C;1101 116A 11BB;AF5C;1101 116A 11BB; # (꽜; 꽜; 꽜; 꽜; 꽜; ) HANGUL SYLLABLE GGWASS +AF5D;AF5D;1101 116A 11BC;AF5D;1101 116A 11BC; # (꽝; 꽝; 꽝; 꽝; 꽝; ) HANGUL SYLLABLE GGWANG +AF5E;AF5E;1101 116A 11BD;AF5E;1101 116A 11BD; # (꽞; 꽞; 꽞; 꽞; 꽞; ) HANGUL SYLLABLE GGWAJ +AF5F;AF5F;1101 116A 11BE;AF5F;1101 116A 11BE; # (꽟; 꽟; 꽟; 꽟; 꽟; ) HANGUL SYLLABLE GGWAC +AF60;AF60;1101 116A 11BF;AF60;1101 116A 11BF; # (꽠; 꽠; 꽠; 꽠; 꽠; ) HANGUL SYLLABLE GGWAK +AF61;AF61;1101 116A 11C0;AF61;1101 116A 11C0; # (꽡; 꽡; 꽡; 꽡; 꽡; ) HANGUL SYLLABLE GGWAT +AF62;AF62;1101 116A 11C1;AF62;1101 116A 11C1; # (꽢; 꽢; 꽢; 꽢; 꽢; ) HANGUL SYLLABLE GGWAP +AF63;AF63;1101 116A 11C2;AF63;1101 116A 11C2; # (꽣; 꽣; 꽣; 꽣; 꽣; ) HANGUL SYLLABLE GGWAH +AF64;AF64;1101 116B;AF64;1101 116B; # (꽤; 꽤; 꽤; 꽤; 꽤; ) HANGUL SYLLABLE GGWAE +AF65;AF65;1101 116B 11A8;AF65;1101 116B 11A8; # (꽥; 꽥; 꽥; 꽥; 꽥; ) HANGUL SYLLABLE GGWAEG +AF66;AF66;1101 116B 11A9;AF66;1101 116B 11A9; # (꽦; 꽦; 꽦; 꽦; 꽦; ) HANGUL SYLLABLE GGWAEGG +AF67;AF67;1101 116B 11AA;AF67;1101 116B 11AA; # (꽧; 꽧; 꽧; 꽧; 꽧; ) HANGUL SYLLABLE GGWAEGS +AF68;AF68;1101 116B 11AB;AF68;1101 116B 11AB; # (꽨; 꽨; 꽨; 꽨; 꽨; ) HANGUL SYLLABLE GGWAEN +AF69;AF69;1101 116B 11AC;AF69;1101 116B 11AC; # (꽩; 꽩; 꽩; 꽩; 꽩; ) HANGUL SYLLABLE GGWAENJ +AF6A;AF6A;1101 116B 11AD;AF6A;1101 116B 11AD; # (꽪; 꽪; 꽪; 꽪; 꽪; ) HANGUL SYLLABLE GGWAENH +AF6B;AF6B;1101 116B 11AE;AF6B;1101 116B 11AE; # (꽫; 꽫; 꽫; 꽫; 꽫; ) HANGUL SYLLABLE GGWAED +AF6C;AF6C;1101 116B 11AF;AF6C;1101 116B 11AF; # (꽬; 꽬; 꽬; 꽬; 꽬; ) HANGUL SYLLABLE GGWAEL +AF6D;AF6D;1101 116B 11B0;AF6D;1101 116B 11B0; # (꽭; 꽭; 꽭; 꽭; 꽭; ) HANGUL SYLLABLE GGWAELG +AF6E;AF6E;1101 116B 11B1;AF6E;1101 116B 11B1; # (꽮; 꽮; 꽮; 꽮; 꽮; ) HANGUL SYLLABLE GGWAELM +AF6F;AF6F;1101 116B 11B2;AF6F;1101 116B 11B2; # (꽯; 꽯; 꽯; 꽯; 꽯; ) HANGUL SYLLABLE GGWAELB +AF70;AF70;1101 116B 11B3;AF70;1101 116B 11B3; # (꽰; 꽰; 꽰; 꽰; 꽰; ) HANGUL SYLLABLE GGWAELS +AF71;AF71;1101 116B 11B4;AF71;1101 116B 11B4; # (꽱; 꽱; 꽱; 꽱; 꽱; ) HANGUL SYLLABLE GGWAELT +AF72;AF72;1101 116B 11B5;AF72;1101 116B 11B5; # (꽲; 꽲; 꽲; 꽲; 꽲; ) HANGUL SYLLABLE GGWAELP +AF73;AF73;1101 116B 11B6;AF73;1101 116B 11B6; # (꽳; 꽳; 꽳; 꽳; 꽳; ) HANGUL SYLLABLE GGWAELH +AF74;AF74;1101 116B 11B7;AF74;1101 116B 11B7; # (꽴; 꽴; 꽴; 꽴; 꽴; ) HANGUL SYLLABLE GGWAEM +AF75;AF75;1101 116B 11B8;AF75;1101 116B 11B8; # (꽵; 꽵; 꽵; 꽵; 꽵; ) HANGUL SYLLABLE GGWAEB +AF76;AF76;1101 116B 11B9;AF76;1101 116B 11B9; # (꽶; 꽶; 꽶; 꽶; 꽶; ) HANGUL SYLLABLE GGWAEBS +AF77;AF77;1101 116B 11BA;AF77;1101 116B 11BA; # (꽷; 꽷; 꽷; 꽷; 꽷; ) HANGUL SYLLABLE GGWAES +AF78;AF78;1101 116B 11BB;AF78;1101 116B 11BB; # (꽸; 꽸; 꽸; 꽸; 꽸; ) HANGUL SYLLABLE GGWAESS +AF79;AF79;1101 116B 11BC;AF79;1101 116B 11BC; # (꽹; 꽹; 꽹; 꽹; 꽹; ) HANGUL SYLLABLE GGWAENG +AF7A;AF7A;1101 116B 11BD;AF7A;1101 116B 11BD; # (꽺; 꽺; 꽺; 꽺; 꽺; ) HANGUL SYLLABLE GGWAEJ +AF7B;AF7B;1101 116B 11BE;AF7B;1101 116B 11BE; # (꽻; 꽻; 꽻; 꽻; 꽻; ) HANGUL SYLLABLE GGWAEC +AF7C;AF7C;1101 116B 11BF;AF7C;1101 116B 11BF; # (꽼; 꽼; 꽼; 꽼; 꽼; ) HANGUL SYLLABLE GGWAEK +AF7D;AF7D;1101 116B 11C0;AF7D;1101 116B 11C0; # (꽽; 꽽; 꽽; 꽽; 꽽; ) HANGUL SYLLABLE GGWAET +AF7E;AF7E;1101 116B 11C1;AF7E;1101 116B 11C1; # (꽾; 꽾; 꽾; 꽾; 꽾; ) HANGUL SYLLABLE GGWAEP +AF7F;AF7F;1101 116B 11C2;AF7F;1101 116B 11C2; # (꽿; 꽿; 꽿; 꽿; 꽿; ) HANGUL SYLLABLE GGWAEH +AF80;AF80;1101 116C;AF80;1101 116C; # (꾀; 꾀; 꾀; 꾀; 꾀; ) HANGUL SYLLABLE GGOE +AF81;AF81;1101 116C 11A8;AF81;1101 116C 11A8; # (꾁; 꾁; 꾁; 꾁; 꾁; ) HANGUL SYLLABLE GGOEG +AF82;AF82;1101 116C 11A9;AF82;1101 116C 11A9; # (꾂; 꾂; 꾂; 꾂; 꾂; ) HANGUL SYLLABLE GGOEGG +AF83;AF83;1101 116C 11AA;AF83;1101 116C 11AA; # (꾃; 꾃; 꾃; 꾃; 꾃; ) HANGUL SYLLABLE GGOEGS +AF84;AF84;1101 116C 11AB;AF84;1101 116C 11AB; # (꾄; 꾄; 꾄; 꾄; 꾄; ) HANGUL SYLLABLE GGOEN +AF85;AF85;1101 116C 11AC;AF85;1101 116C 11AC; # (꾅; 꾅; 꾅; 꾅; 꾅; ) HANGUL SYLLABLE GGOENJ +AF86;AF86;1101 116C 11AD;AF86;1101 116C 11AD; # (꾆; 꾆; 꾆; 꾆; 꾆; ) HANGUL SYLLABLE GGOENH +AF87;AF87;1101 116C 11AE;AF87;1101 116C 11AE; # (꾇; 꾇; 꾇; 꾇; 꾇; ) HANGUL SYLLABLE GGOED +AF88;AF88;1101 116C 11AF;AF88;1101 116C 11AF; # (꾈; 꾈; 꾈; 꾈; 꾈; ) HANGUL SYLLABLE GGOEL +AF89;AF89;1101 116C 11B0;AF89;1101 116C 11B0; # (꾉; 꾉; 꾉; 꾉; 꾉; ) HANGUL SYLLABLE GGOELG +AF8A;AF8A;1101 116C 11B1;AF8A;1101 116C 11B1; # (꾊; 꾊; 꾊; 꾊; 꾊; ) HANGUL SYLLABLE GGOELM +AF8B;AF8B;1101 116C 11B2;AF8B;1101 116C 11B2; # (꾋; 꾋; 꾋; 꾋; 꾋; ) HANGUL SYLLABLE GGOELB +AF8C;AF8C;1101 116C 11B3;AF8C;1101 116C 11B3; # (꾌; 꾌; 꾌; 꾌; 꾌; ) HANGUL SYLLABLE GGOELS +AF8D;AF8D;1101 116C 11B4;AF8D;1101 116C 11B4; # (꾍; 꾍; 꾍; 꾍; 꾍; ) HANGUL SYLLABLE GGOELT +AF8E;AF8E;1101 116C 11B5;AF8E;1101 116C 11B5; # (꾎; 꾎; 꾎; 꾎; 꾎; ) HANGUL SYLLABLE GGOELP +AF8F;AF8F;1101 116C 11B6;AF8F;1101 116C 11B6; # (꾏; 꾏; 꾏; 꾏; 꾏; ) HANGUL SYLLABLE GGOELH +AF90;AF90;1101 116C 11B7;AF90;1101 116C 11B7; # (꾐; 꾐; 꾐; 꾐; 꾐; ) HANGUL SYLLABLE GGOEM +AF91;AF91;1101 116C 11B8;AF91;1101 116C 11B8; # (꾑; 꾑; 꾑; 꾑; 꾑; ) HANGUL SYLLABLE GGOEB +AF92;AF92;1101 116C 11B9;AF92;1101 116C 11B9; # (꾒; 꾒; 꾒; 꾒; 꾒; ) HANGUL SYLLABLE GGOEBS +AF93;AF93;1101 116C 11BA;AF93;1101 116C 11BA; # (꾓; 꾓; 꾓; 꾓; 꾓; ) HANGUL SYLLABLE GGOES +AF94;AF94;1101 116C 11BB;AF94;1101 116C 11BB; # (꾔; 꾔; 꾔; 꾔; 꾔; ) HANGUL SYLLABLE GGOESS +AF95;AF95;1101 116C 11BC;AF95;1101 116C 11BC; # (꾕; 꾕; 꾕; 꾕; 꾕; ) HANGUL SYLLABLE GGOENG +AF96;AF96;1101 116C 11BD;AF96;1101 116C 11BD; # (꾖; 꾖; 꾖; 꾖; 꾖; ) HANGUL SYLLABLE GGOEJ +AF97;AF97;1101 116C 11BE;AF97;1101 116C 11BE; # (꾗; 꾗; 꾗; 꾗; 꾗; ) HANGUL SYLLABLE GGOEC +AF98;AF98;1101 116C 11BF;AF98;1101 116C 11BF; # (꾘; 꾘; 꾘; 꾘; 꾘; ) HANGUL SYLLABLE GGOEK +AF99;AF99;1101 116C 11C0;AF99;1101 116C 11C0; # (꾙; 꾙; 꾙; 꾙; 꾙; ) HANGUL SYLLABLE GGOET +AF9A;AF9A;1101 116C 11C1;AF9A;1101 116C 11C1; # (꾚; 꾚; 꾚; 꾚; 꾚; ) HANGUL SYLLABLE GGOEP +AF9B;AF9B;1101 116C 11C2;AF9B;1101 116C 11C2; # (꾛; 꾛; 꾛; 꾛; 꾛; ) HANGUL SYLLABLE GGOEH +AF9C;AF9C;1101 116D;AF9C;1101 116D; # (꾜; 꾜; 꾜; 꾜; 꾜; ) HANGUL SYLLABLE GGYO +AF9D;AF9D;1101 116D 11A8;AF9D;1101 116D 11A8; # (꾝; 꾝; 꾝; 꾝; 꾝; ) HANGUL SYLLABLE GGYOG +AF9E;AF9E;1101 116D 11A9;AF9E;1101 116D 11A9; # (꾞; 꾞; 꾞; 꾞; 꾞; ) HANGUL SYLLABLE GGYOGG +AF9F;AF9F;1101 116D 11AA;AF9F;1101 116D 11AA; # (꾟; 꾟; 꾟; 꾟; 꾟; ) HANGUL SYLLABLE GGYOGS +AFA0;AFA0;1101 116D 11AB;AFA0;1101 116D 11AB; # (꾠; 꾠; 꾠; 꾠; 꾠; ) HANGUL SYLLABLE GGYON +AFA1;AFA1;1101 116D 11AC;AFA1;1101 116D 11AC; # (꾡; 꾡; 꾡; 꾡; 꾡; ) HANGUL SYLLABLE GGYONJ +AFA2;AFA2;1101 116D 11AD;AFA2;1101 116D 11AD; # (꾢; 꾢; 꾢; 꾢; 꾢; ) HANGUL SYLLABLE GGYONH +AFA3;AFA3;1101 116D 11AE;AFA3;1101 116D 11AE; # (꾣; 꾣; 꾣; 꾣; 꾣; ) HANGUL SYLLABLE GGYOD +AFA4;AFA4;1101 116D 11AF;AFA4;1101 116D 11AF; # (꾤; 꾤; 꾤; 꾤; 꾤; ) HANGUL SYLLABLE GGYOL +AFA5;AFA5;1101 116D 11B0;AFA5;1101 116D 11B0; # (꾥; 꾥; 꾥; 꾥; 꾥; ) HANGUL SYLLABLE GGYOLG +AFA6;AFA6;1101 116D 11B1;AFA6;1101 116D 11B1; # (꾦; 꾦; 꾦; 꾦; 꾦; ) HANGUL SYLLABLE GGYOLM +AFA7;AFA7;1101 116D 11B2;AFA7;1101 116D 11B2; # (꾧; 꾧; 꾧; 꾧; 꾧; ) HANGUL SYLLABLE GGYOLB +AFA8;AFA8;1101 116D 11B3;AFA8;1101 116D 11B3; # (꾨; 꾨; 꾨; 꾨; 꾨; ) HANGUL SYLLABLE GGYOLS +AFA9;AFA9;1101 116D 11B4;AFA9;1101 116D 11B4; # (꾩; 꾩; 꾩; 꾩; 꾩; ) HANGUL SYLLABLE GGYOLT +AFAA;AFAA;1101 116D 11B5;AFAA;1101 116D 11B5; # (꾪; 꾪; 꾪; 꾪; 꾪; ) HANGUL SYLLABLE GGYOLP +AFAB;AFAB;1101 116D 11B6;AFAB;1101 116D 11B6; # (꾫; 꾫; 꾫; 꾫; 꾫; ) HANGUL SYLLABLE GGYOLH +AFAC;AFAC;1101 116D 11B7;AFAC;1101 116D 11B7; # (꾬; 꾬; 꾬; 꾬; 꾬; ) HANGUL SYLLABLE GGYOM +AFAD;AFAD;1101 116D 11B8;AFAD;1101 116D 11B8; # (꾭; 꾭; 꾭; 꾭; 꾭; ) HANGUL SYLLABLE GGYOB +AFAE;AFAE;1101 116D 11B9;AFAE;1101 116D 11B9; # (꾮; 꾮; 꾮; 꾮; 꾮; ) HANGUL SYLLABLE GGYOBS +AFAF;AFAF;1101 116D 11BA;AFAF;1101 116D 11BA; # (꾯; 꾯; 꾯; 꾯; 꾯; ) HANGUL SYLLABLE GGYOS +AFB0;AFB0;1101 116D 11BB;AFB0;1101 116D 11BB; # (꾰; 꾰; 꾰; 꾰; 꾰; ) HANGUL SYLLABLE GGYOSS +AFB1;AFB1;1101 116D 11BC;AFB1;1101 116D 11BC; # (꾱; 꾱; 꾱; 꾱; 꾱; ) HANGUL SYLLABLE GGYONG +AFB2;AFB2;1101 116D 11BD;AFB2;1101 116D 11BD; # (꾲; 꾲; 꾲; 꾲; 꾲; ) HANGUL SYLLABLE GGYOJ +AFB3;AFB3;1101 116D 11BE;AFB3;1101 116D 11BE; # (꾳; 꾳; 꾳; 꾳; 꾳; ) HANGUL SYLLABLE GGYOC +AFB4;AFB4;1101 116D 11BF;AFB4;1101 116D 11BF; # (꾴; 꾴; 꾴; 꾴; 꾴; ) HANGUL SYLLABLE GGYOK +AFB5;AFB5;1101 116D 11C0;AFB5;1101 116D 11C0; # (꾵; 꾵; 꾵; 꾵; 꾵; ) HANGUL SYLLABLE GGYOT +AFB6;AFB6;1101 116D 11C1;AFB6;1101 116D 11C1; # (꾶; 꾶; 꾶; 꾶; 꾶; ) HANGUL SYLLABLE GGYOP +AFB7;AFB7;1101 116D 11C2;AFB7;1101 116D 11C2; # (꾷; 꾷; 꾷; 꾷; 꾷; ) HANGUL SYLLABLE GGYOH +AFB8;AFB8;1101 116E;AFB8;1101 116E; # (꾸; 꾸; 꾸; 꾸; 꾸; ) HANGUL SYLLABLE GGU +AFB9;AFB9;1101 116E 11A8;AFB9;1101 116E 11A8; # (꾹; 꾹; 꾹; 꾹; 꾹; ) HANGUL SYLLABLE GGUG +AFBA;AFBA;1101 116E 11A9;AFBA;1101 116E 11A9; # (꾺; 꾺; 꾺; 꾺; 꾺; ) HANGUL SYLLABLE GGUGG +AFBB;AFBB;1101 116E 11AA;AFBB;1101 116E 11AA; # (꾻; 꾻; 꾻; 꾻; 꾻; ) HANGUL SYLLABLE GGUGS +AFBC;AFBC;1101 116E 11AB;AFBC;1101 116E 11AB; # (꾼; 꾼; 꾼; 꾼; 꾼; ) HANGUL SYLLABLE GGUN +AFBD;AFBD;1101 116E 11AC;AFBD;1101 116E 11AC; # (꾽; 꾽; 꾽; 꾽; 꾽; ) HANGUL SYLLABLE GGUNJ +AFBE;AFBE;1101 116E 11AD;AFBE;1101 116E 11AD; # (꾾; 꾾; 꾾; 꾾; 꾾; ) HANGUL SYLLABLE GGUNH +AFBF;AFBF;1101 116E 11AE;AFBF;1101 116E 11AE; # (꾿; 꾿; 꾿; 꾿; 꾿; ) HANGUL SYLLABLE GGUD +AFC0;AFC0;1101 116E 11AF;AFC0;1101 116E 11AF; # (꿀; 꿀; 꿀; 꿀; 꿀; ) HANGUL SYLLABLE GGUL +AFC1;AFC1;1101 116E 11B0;AFC1;1101 116E 11B0; # (꿁; 꿁; 꿁; 꿁; 꿁; ) HANGUL SYLLABLE GGULG +AFC2;AFC2;1101 116E 11B1;AFC2;1101 116E 11B1; # (꿂; 꿂; 꿂; 꿂; 꿂; ) HANGUL SYLLABLE GGULM +AFC3;AFC3;1101 116E 11B2;AFC3;1101 116E 11B2; # (꿃; 꿃; 꿃; 꿃; 꿃; ) HANGUL SYLLABLE GGULB +AFC4;AFC4;1101 116E 11B3;AFC4;1101 116E 11B3; # (꿄; 꿄; 꿄; 꿄; 꿄; ) HANGUL SYLLABLE GGULS +AFC5;AFC5;1101 116E 11B4;AFC5;1101 116E 11B4; # (꿅; 꿅; 꿅; 꿅; 꿅; ) HANGUL SYLLABLE GGULT +AFC6;AFC6;1101 116E 11B5;AFC6;1101 116E 11B5; # (꿆; 꿆; 꿆; 꿆; 꿆; ) HANGUL SYLLABLE GGULP +AFC7;AFC7;1101 116E 11B6;AFC7;1101 116E 11B6; # (꿇; 꿇; 꿇; 꿇; 꿇; ) HANGUL SYLLABLE GGULH +AFC8;AFC8;1101 116E 11B7;AFC8;1101 116E 11B7; # (꿈; 꿈; 꿈; 꿈; 꿈; ) HANGUL SYLLABLE GGUM +AFC9;AFC9;1101 116E 11B8;AFC9;1101 116E 11B8; # (꿉; 꿉; 꿉; 꿉; 꿉; ) HANGUL SYLLABLE GGUB +AFCA;AFCA;1101 116E 11B9;AFCA;1101 116E 11B9; # (꿊; 꿊; 꿊; 꿊; 꿊; ) HANGUL SYLLABLE GGUBS +AFCB;AFCB;1101 116E 11BA;AFCB;1101 116E 11BA; # (꿋; 꿋; 꿋; 꿋; 꿋; ) HANGUL SYLLABLE GGUS +AFCC;AFCC;1101 116E 11BB;AFCC;1101 116E 11BB; # (꿌; 꿌; 꿌; 꿌; 꿌; ) HANGUL SYLLABLE GGUSS +AFCD;AFCD;1101 116E 11BC;AFCD;1101 116E 11BC; # (꿍; 꿍; 꿍; 꿍; 꿍; ) HANGUL SYLLABLE GGUNG +AFCE;AFCE;1101 116E 11BD;AFCE;1101 116E 11BD; # (꿎; 꿎; 꿎; 꿎; 꿎; ) HANGUL SYLLABLE GGUJ +AFCF;AFCF;1101 116E 11BE;AFCF;1101 116E 11BE; # (꿏; 꿏; 꿏; 꿏; 꿏; ) HANGUL SYLLABLE GGUC +AFD0;AFD0;1101 116E 11BF;AFD0;1101 116E 11BF; # (꿐; 꿐; 꿐; 꿐; 꿐; ) HANGUL SYLLABLE GGUK +AFD1;AFD1;1101 116E 11C0;AFD1;1101 116E 11C0; # (꿑; 꿑; 꿑; 꿑; 꿑; ) HANGUL SYLLABLE GGUT +AFD2;AFD2;1101 116E 11C1;AFD2;1101 116E 11C1; # (꿒; 꿒; 꿒; 꿒; 꿒; ) HANGUL SYLLABLE GGUP +AFD3;AFD3;1101 116E 11C2;AFD3;1101 116E 11C2; # (꿓; 꿓; 꿓; 꿓; 꿓; ) HANGUL SYLLABLE GGUH +AFD4;AFD4;1101 116F;AFD4;1101 116F; # (꿔; 꿔; 꿔; 꿔; 꿔; ) HANGUL SYLLABLE GGWEO +AFD5;AFD5;1101 116F 11A8;AFD5;1101 116F 11A8; # (꿕; 꿕; 꿕; 꿕; 꿕; ) HANGUL SYLLABLE GGWEOG +AFD6;AFD6;1101 116F 11A9;AFD6;1101 116F 11A9; # (꿖; 꿖; 꿖; 꿖; 꿖; ) HANGUL SYLLABLE GGWEOGG +AFD7;AFD7;1101 116F 11AA;AFD7;1101 116F 11AA; # (꿗; 꿗; 꿗; 꿗; 꿗; ) HANGUL SYLLABLE GGWEOGS +AFD8;AFD8;1101 116F 11AB;AFD8;1101 116F 11AB; # (꿘; 꿘; 꿘; 꿘; 꿘; ) HANGUL SYLLABLE GGWEON +AFD9;AFD9;1101 116F 11AC;AFD9;1101 116F 11AC; # (꿙; 꿙; 꿙; 꿙; 꿙; ) HANGUL SYLLABLE GGWEONJ +AFDA;AFDA;1101 116F 11AD;AFDA;1101 116F 11AD; # (꿚; 꿚; 꿚; 꿚; 꿚; ) HANGUL SYLLABLE GGWEONH +AFDB;AFDB;1101 116F 11AE;AFDB;1101 116F 11AE; # (꿛; 꿛; 꿛; 꿛; 꿛; ) HANGUL SYLLABLE GGWEOD +AFDC;AFDC;1101 116F 11AF;AFDC;1101 116F 11AF; # (꿜; 꿜; 꿜; 꿜; 꿜; ) HANGUL SYLLABLE GGWEOL +AFDD;AFDD;1101 116F 11B0;AFDD;1101 116F 11B0; # (꿝; 꿝; 꿝; 꿝; 꿝; ) HANGUL SYLLABLE GGWEOLG +AFDE;AFDE;1101 116F 11B1;AFDE;1101 116F 11B1; # (꿞; 꿞; 꿞; 꿞; 꿞; ) HANGUL SYLLABLE GGWEOLM +AFDF;AFDF;1101 116F 11B2;AFDF;1101 116F 11B2; # (꿟; 꿟; 꿟; 꿟; 꿟; ) HANGUL SYLLABLE GGWEOLB +AFE0;AFE0;1101 116F 11B3;AFE0;1101 116F 11B3; # (꿠; 꿠; 꿠; 꿠; 꿠; ) HANGUL SYLLABLE GGWEOLS +AFE1;AFE1;1101 116F 11B4;AFE1;1101 116F 11B4; # (꿡; 꿡; 꿡; 꿡; 꿡; ) HANGUL SYLLABLE GGWEOLT +AFE2;AFE2;1101 116F 11B5;AFE2;1101 116F 11B5; # (꿢; 꿢; 꿢; 꿢; 꿢; ) HANGUL SYLLABLE GGWEOLP +AFE3;AFE3;1101 116F 11B6;AFE3;1101 116F 11B6; # (꿣; 꿣; 꿣; 꿣; 꿣; ) HANGUL SYLLABLE GGWEOLH +AFE4;AFE4;1101 116F 11B7;AFE4;1101 116F 11B7; # (꿤; 꿤; 꿤; 꿤; 꿤; ) HANGUL SYLLABLE GGWEOM +AFE5;AFE5;1101 116F 11B8;AFE5;1101 116F 11B8; # (꿥; 꿥; 꿥; 꿥; 꿥; ) HANGUL SYLLABLE GGWEOB +AFE6;AFE6;1101 116F 11B9;AFE6;1101 116F 11B9; # (꿦; 꿦; 꿦; 꿦; 꿦; ) HANGUL SYLLABLE GGWEOBS +AFE7;AFE7;1101 116F 11BA;AFE7;1101 116F 11BA; # (꿧; 꿧; 꿧; 꿧; 꿧; ) HANGUL SYLLABLE GGWEOS +AFE8;AFE8;1101 116F 11BB;AFE8;1101 116F 11BB; # (꿨; 꿨; 꿨; 꿨; 꿨; ) HANGUL SYLLABLE GGWEOSS +AFE9;AFE9;1101 116F 11BC;AFE9;1101 116F 11BC; # (꿩; 꿩; 꿩; 꿩; 꿩; ) HANGUL SYLLABLE GGWEONG +AFEA;AFEA;1101 116F 11BD;AFEA;1101 116F 11BD; # (꿪; 꿪; 꿪; 꿪; 꿪; ) HANGUL SYLLABLE GGWEOJ +AFEB;AFEB;1101 116F 11BE;AFEB;1101 116F 11BE; # (꿫; 꿫; 꿫; 꿫; 꿫; ) HANGUL SYLLABLE GGWEOC +AFEC;AFEC;1101 116F 11BF;AFEC;1101 116F 11BF; # (꿬; 꿬; 꿬; 꿬; 꿬; ) HANGUL SYLLABLE GGWEOK +AFED;AFED;1101 116F 11C0;AFED;1101 116F 11C0; # (꿭; 꿭; 꿭; 꿭; 꿭; ) HANGUL SYLLABLE GGWEOT +AFEE;AFEE;1101 116F 11C1;AFEE;1101 116F 11C1; # (꿮; 꿮; 꿮; 꿮; 꿮; ) HANGUL SYLLABLE GGWEOP +AFEF;AFEF;1101 116F 11C2;AFEF;1101 116F 11C2; # (꿯; 꿯; 꿯; 꿯; 꿯; ) HANGUL SYLLABLE GGWEOH +AFF0;AFF0;1101 1170;AFF0;1101 1170; # (꿰; 꿰; 꿰; 꿰; 꿰; ) HANGUL SYLLABLE GGWE +AFF1;AFF1;1101 1170 11A8;AFF1;1101 1170 11A8; # (꿱; 꿱; 꿱; 꿱; 꿱; ) HANGUL SYLLABLE GGWEG +AFF2;AFF2;1101 1170 11A9;AFF2;1101 1170 11A9; # (꿲; 꿲; 꿲; 꿲; 꿲; ) HANGUL SYLLABLE GGWEGG +AFF3;AFF3;1101 1170 11AA;AFF3;1101 1170 11AA; # (꿳; 꿳; 꿳; 꿳; 꿳; ) HANGUL SYLLABLE GGWEGS +AFF4;AFF4;1101 1170 11AB;AFF4;1101 1170 11AB; # (꿴; 꿴; 꿴; 꿴; 꿴; ) HANGUL SYLLABLE GGWEN +AFF5;AFF5;1101 1170 11AC;AFF5;1101 1170 11AC; # (꿵; 꿵; 꿵; 꿵; 꿵; ) HANGUL SYLLABLE GGWENJ +AFF6;AFF6;1101 1170 11AD;AFF6;1101 1170 11AD; # (꿶; 꿶; 꿶; 꿶; 꿶; ) HANGUL SYLLABLE GGWENH +AFF7;AFF7;1101 1170 11AE;AFF7;1101 1170 11AE; # (꿷; 꿷; 꿷; 꿷; 꿷; ) HANGUL SYLLABLE GGWED +AFF8;AFF8;1101 1170 11AF;AFF8;1101 1170 11AF; # (꿸; 꿸; 꿸; 꿸; 꿸; ) HANGUL SYLLABLE GGWEL +AFF9;AFF9;1101 1170 11B0;AFF9;1101 1170 11B0; # (꿹; 꿹; 꿹; 꿹; 꿹; ) HANGUL SYLLABLE GGWELG +AFFA;AFFA;1101 1170 11B1;AFFA;1101 1170 11B1; # (꿺; 꿺; 꿺; 꿺; 꿺; ) HANGUL SYLLABLE GGWELM +AFFB;AFFB;1101 1170 11B2;AFFB;1101 1170 11B2; # (꿻; 꿻; 꿻; 꿻; 꿻; ) HANGUL SYLLABLE GGWELB +AFFC;AFFC;1101 1170 11B3;AFFC;1101 1170 11B3; # (꿼; 꿼; 꿼; 꿼; 꿼; ) HANGUL SYLLABLE GGWELS +AFFD;AFFD;1101 1170 11B4;AFFD;1101 1170 11B4; # (꿽; 꿽; 꿽; 꿽; 꿽; ) HANGUL SYLLABLE GGWELT +AFFE;AFFE;1101 1170 11B5;AFFE;1101 1170 11B5; # (꿾; 꿾; 꿾; 꿾; 꿾; ) HANGUL SYLLABLE GGWELP +AFFF;AFFF;1101 1170 11B6;AFFF;1101 1170 11B6; # (꿿; 꿿; 꿿; 꿿; 꿿; ) HANGUL SYLLABLE GGWELH +B000;B000;1101 1170 11B7;B000;1101 1170 11B7; # (뀀; 뀀; 뀀; 뀀; 뀀; ) HANGUL SYLLABLE GGWEM +B001;B001;1101 1170 11B8;B001;1101 1170 11B8; # (뀁; 뀁; 뀁; 뀁; 뀁; ) HANGUL SYLLABLE GGWEB +B002;B002;1101 1170 11B9;B002;1101 1170 11B9; # (뀂; 뀂; 뀂; 뀂; 뀂; ) HANGUL SYLLABLE GGWEBS +B003;B003;1101 1170 11BA;B003;1101 1170 11BA; # (뀃; 뀃; 뀃; 뀃; 뀃; ) HANGUL SYLLABLE GGWES +B004;B004;1101 1170 11BB;B004;1101 1170 11BB; # (뀄; 뀄; 뀄; 뀄; 뀄; ) HANGUL SYLLABLE GGWESS +B005;B005;1101 1170 11BC;B005;1101 1170 11BC; # (뀅; 뀅; 뀅; 뀅; 뀅; ) HANGUL SYLLABLE GGWENG +B006;B006;1101 1170 11BD;B006;1101 1170 11BD; # (뀆; 뀆; 뀆; 뀆; 뀆; ) HANGUL SYLLABLE GGWEJ +B007;B007;1101 1170 11BE;B007;1101 1170 11BE; # (뀇; 뀇; 뀇; 뀇; 뀇; ) HANGUL SYLLABLE GGWEC +B008;B008;1101 1170 11BF;B008;1101 1170 11BF; # (뀈; 뀈; 뀈; 뀈; 뀈; ) HANGUL SYLLABLE GGWEK +B009;B009;1101 1170 11C0;B009;1101 1170 11C0; # (뀉; 뀉; 뀉; 뀉; 뀉; ) HANGUL SYLLABLE GGWET +B00A;B00A;1101 1170 11C1;B00A;1101 1170 11C1; # (뀊; 뀊; 뀊; 뀊; 뀊; ) HANGUL SYLLABLE GGWEP +B00B;B00B;1101 1170 11C2;B00B;1101 1170 11C2; # (뀋; 뀋; 뀋; 뀋; 뀋; ) HANGUL SYLLABLE GGWEH +B00C;B00C;1101 1171;B00C;1101 1171; # (뀌; 뀌; 뀌; 뀌; 뀌; ) HANGUL SYLLABLE GGWI +B00D;B00D;1101 1171 11A8;B00D;1101 1171 11A8; # (뀍; 뀍; 뀍; 뀍; 뀍; ) HANGUL SYLLABLE GGWIG +B00E;B00E;1101 1171 11A9;B00E;1101 1171 11A9; # (뀎; 뀎; 뀎; 뀎; 뀎; ) HANGUL SYLLABLE GGWIGG +B00F;B00F;1101 1171 11AA;B00F;1101 1171 11AA; # (뀏; 뀏; 뀏; 뀏; 뀏; ) HANGUL SYLLABLE GGWIGS +B010;B010;1101 1171 11AB;B010;1101 1171 11AB; # (뀐; 뀐; 뀐; 뀐; 뀐; ) HANGUL SYLLABLE GGWIN +B011;B011;1101 1171 11AC;B011;1101 1171 11AC; # (뀑; 뀑; 뀑; 뀑; 뀑; ) HANGUL SYLLABLE GGWINJ +B012;B012;1101 1171 11AD;B012;1101 1171 11AD; # (뀒; 뀒; 뀒; 뀒; 뀒; ) HANGUL SYLLABLE GGWINH +B013;B013;1101 1171 11AE;B013;1101 1171 11AE; # (뀓; 뀓; 뀓; 뀓; 뀓; ) HANGUL SYLLABLE GGWID +B014;B014;1101 1171 11AF;B014;1101 1171 11AF; # (뀔; 뀔; 뀔; 뀔; 뀔; ) HANGUL SYLLABLE GGWIL +B015;B015;1101 1171 11B0;B015;1101 1171 11B0; # (뀕; 뀕; 뀕; 뀕; 뀕; ) HANGUL SYLLABLE GGWILG +B016;B016;1101 1171 11B1;B016;1101 1171 11B1; # (뀖; 뀖; 뀖; 뀖; 뀖; ) HANGUL SYLLABLE GGWILM +B017;B017;1101 1171 11B2;B017;1101 1171 11B2; # (뀗; 뀗; 뀗; 뀗; 뀗; ) HANGUL SYLLABLE GGWILB +B018;B018;1101 1171 11B3;B018;1101 1171 11B3; # (뀘; 뀘; 뀘; 뀘; 뀘; ) HANGUL SYLLABLE GGWILS +B019;B019;1101 1171 11B4;B019;1101 1171 11B4; # (뀙; 뀙; 뀙; 뀙; 뀙; ) HANGUL SYLLABLE GGWILT +B01A;B01A;1101 1171 11B5;B01A;1101 1171 11B5; # (뀚; 뀚; 뀚; 뀚; 뀚; ) HANGUL SYLLABLE GGWILP +B01B;B01B;1101 1171 11B6;B01B;1101 1171 11B6; # (뀛; 뀛; 뀛; 뀛; 뀛; ) HANGUL SYLLABLE GGWILH +B01C;B01C;1101 1171 11B7;B01C;1101 1171 11B7; # (뀜; 뀜; 뀜; 뀜; 뀜; ) HANGUL SYLLABLE GGWIM +B01D;B01D;1101 1171 11B8;B01D;1101 1171 11B8; # (뀝; 뀝; 뀝; 뀝; 뀝; ) HANGUL SYLLABLE GGWIB +B01E;B01E;1101 1171 11B9;B01E;1101 1171 11B9; # (뀞; 뀞; 뀞; 뀞; 뀞; ) HANGUL SYLLABLE GGWIBS +B01F;B01F;1101 1171 11BA;B01F;1101 1171 11BA; # (뀟; 뀟; 뀟; 뀟; 뀟; ) HANGUL SYLLABLE GGWIS +B020;B020;1101 1171 11BB;B020;1101 1171 11BB; # (뀠; 뀠; 뀠; 뀠; 뀠; ) HANGUL SYLLABLE GGWISS +B021;B021;1101 1171 11BC;B021;1101 1171 11BC; # (뀡; 뀡; 뀡; 뀡; 뀡; ) HANGUL SYLLABLE GGWING +B022;B022;1101 1171 11BD;B022;1101 1171 11BD; # (뀢; 뀢; 뀢; 뀢; 뀢; ) HANGUL SYLLABLE GGWIJ +B023;B023;1101 1171 11BE;B023;1101 1171 11BE; # (뀣; 뀣; 뀣; 뀣; 뀣; ) HANGUL SYLLABLE GGWIC +B024;B024;1101 1171 11BF;B024;1101 1171 11BF; # (뀤; 뀤; 뀤; 뀤; 뀤; ) HANGUL SYLLABLE GGWIK +B025;B025;1101 1171 11C0;B025;1101 1171 11C0; # (뀥; 뀥; 뀥; 뀥; 뀥; ) HANGUL SYLLABLE GGWIT +B026;B026;1101 1171 11C1;B026;1101 1171 11C1; # (뀦; 뀦; 뀦; 뀦; 뀦; ) HANGUL SYLLABLE GGWIP +B027;B027;1101 1171 11C2;B027;1101 1171 11C2; # (뀧; 뀧; 뀧; 뀧; 뀧; ) HANGUL SYLLABLE GGWIH +B028;B028;1101 1172;B028;1101 1172; # (뀨; 뀨; 뀨; 뀨; 뀨; ) HANGUL SYLLABLE GGYU +B029;B029;1101 1172 11A8;B029;1101 1172 11A8; # (뀩; 뀩; 뀩; 뀩; 뀩; ) HANGUL SYLLABLE GGYUG +B02A;B02A;1101 1172 11A9;B02A;1101 1172 11A9; # (뀪; 뀪; 뀪; 뀪; 뀪; ) HANGUL SYLLABLE GGYUGG +B02B;B02B;1101 1172 11AA;B02B;1101 1172 11AA; # (뀫; 뀫; 뀫; 뀫; 뀫; ) HANGUL SYLLABLE GGYUGS +B02C;B02C;1101 1172 11AB;B02C;1101 1172 11AB; # (뀬; 뀬; 뀬; 뀬; 뀬; ) HANGUL SYLLABLE GGYUN +B02D;B02D;1101 1172 11AC;B02D;1101 1172 11AC; # (뀭; 뀭; 뀭; 뀭; 뀭; ) HANGUL SYLLABLE GGYUNJ +B02E;B02E;1101 1172 11AD;B02E;1101 1172 11AD; # (뀮; 뀮; 뀮; 뀮; 뀮; ) HANGUL SYLLABLE GGYUNH +B02F;B02F;1101 1172 11AE;B02F;1101 1172 11AE; # (뀯; 뀯; 뀯; 뀯; 뀯; ) HANGUL SYLLABLE GGYUD +B030;B030;1101 1172 11AF;B030;1101 1172 11AF; # (뀰; 뀰; 뀰; 뀰; 뀰; ) HANGUL SYLLABLE GGYUL +B031;B031;1101 1172 11B0;B031;1101 1172 11B0; # (뀱; 뀱; 뀱; 뀱; 뀱; ) HANGUL SYLLABLE GGYULG +B032;B032;1101 1172 11B1;B032;1101 1172 11B1; # (뀲; 뀲; 뀲; 뀲; 뀲; ) HANGUL SYLLABLE GGYULM +B033;B033;1101 1172 11B2;B033;1101 1172 11B2; # (뀳; 뀳; 뀳; 뀳; 뀳; ) HANGUL SYLLABLE GGYULB +B034;B034;1101 1172 11B3;B034;1101 1172 11B3; # (뀴; 뀴; 뀴; 뀴; 뀴; ) HANGUL SYLLABLE GGYULS +B035;B035;1101 1172 11B4;B035;1101 1172 11B4; # (뀵; 뀵; 뀵; 뀵; 뀵; ) HANGUL SYLLABLE GGYULT +B036;B036;1101 1172 11B5;B036;1101 1172 11B5; # (뀶; 뀶; 뀶; 뀶; 뀶; ) HANGUL SYLLABLE GGYULP +B037;B037;1101 1172 11B6;B037;1101 1172 11B6; # (뀷; 뀷; 뀷; 뀷; 뀷; ) HANGUL SYLLABLE GGYULH +B038;B038;1101 1172 11B7;B038;1101 1172 11B7; # (뀸; 뀸; 뀸; 뀸; 뀸; ) HANGUL SYLLABLE GGYUM +B039;B039;1101 1172 11B8;B039;1101 1172 11B8; # (뀹; 뀹; 뀹; 뀹; 뀹; ) HANGUL SYLLABLE GGYUB +B03A;B03A;1101 1172 11B9;B03A;1101 1172 11B9; # (뀺; 뀺; 뀺; 뀺; 뀺; ) HANGUL SYLLABLE GGYUBS +B03B;B03B;1101 1172 11BA;B03B;1101 1172 11BA; # (뀻; 뀻; 뀻; 뀻; 뀻; ) HANGUL SYLLABLE GGYUS +B03C;B03C;1101 1172 11BB;B03C;1101 1172 11BB; # (뀼; 뀼; 뀼; 뀼; 뀼; ) HANGUL SYLLABLE GGYUSS +B03D;B03D;1101 1172 11BC;B03D;1101 1172 11BC; # (뀽; 뀽; 뀽; 뀽; 뀽; ) HANGUL SYLLABLE GGYUNG +B03E;B03E;1101 1172 11BD;B03E;1101 1172 11BD; # (뀾; 뀾; 뀾; 뀾; 뀾; ) HANGUL SYLLABLE GGYUJ +B03F;B03F;1101 1172 11BE;B03F;1101 1172 11BE; # (뀿; 뀿; 뀿; 뀿; 뀿; ) HANGUL SYLLABLE GGYUC +B040;B040;1101 1172 11BF;B040;1101 1172 11BF; # (끀; 끀; 끀; 끀; 끀; ) HANGUL SYLLABLE GGYUK +B041;B041;1101 1172 11C0;B041;1101 1172 11C0; # (끁; 끁; 끁; 끁; 끁; ) HANGUL SYLLABLE GGYUT +B042;B042;1101 1172 11C1;B042;1101 1172 11C1; # (끂; 끂; 끂; 끂; 끂; ) HANGUL SYLLABLE GGYUP +B043;B043;1101 1172 11C2;B043;1101 1172 11C2; # (끃; 끃; 끃; 끃; 끃; ) HANGUL SYLLABLE GGYUH +B044;B044;1101 1173;B044;1101 1173; # (끄; 끄; 끄; 끄; 끄; ) HANGUL SYLLABLE GGEU +B045;B045;1101 1173 11A8;B045;1101 1173 11A8; # (끅; 끅; 끅; 끅; 끅; ) HANGUL SYLLABLE GGEUG +B046;B046;1101 1173 11A9;B046;1101 1173 11A9; # (끆; 끆; 끆; 끆; 끆; ) HANGUL SYLLABLE GGEUGG +B047;B047;1101 1173 11AA;B047;1101 1173 11AA; # (끇; 끇; 끇; 끇; 끇; ) HANGUL SYLLABLE GGEUGS +B048;B048;1101 1173 11AB;B048;1101 1173 11AB; # (끈; 끈; 끈; 끈; 끈; ) HANGUL SYLLABLE GGEUN +B049;B049;1101 1173 11AC;B049;1101 1173 11AC; # (끉; 끉; 끉; 끉; 끉; ) HANGUL SYLLABLE GGEUNJ +B04A;B04A;1101 1173 11AD;B04A;1101 1173 11AD; # (끊; 끊; 끊; 끊; 끊; ) HANGUL SYLLABLE GGEUNH +B04B;B04B;1101 1173 11AE;B04B;1101 1173 11AE; # (끋; 끋; 끋; 끋; 끋; ) HANGUL SYLLABLE GGEUD +B04C;B04C;1101 1173 11AF;B04C;1101 1173 11AF; # (끌; 끌; 끌; 끌; 끌; ) HANGUL SYLLABLE GGEUL +B04D;B04D;1101 1173 11B0;B04D;1101 1173 11B0; # (끍; 끍; 끍; 끍; 끍; ) HANGUL SYLLABLE GGEULG +B04E;B04E;1101 1173 11B1;B04E;1101 1173 11B1; # (끎; 끎; 끎; 끎; 끎; ) HANGUL SYLLABLE GGEULM +B04F;B04F;1101 1173 11B2;B04F;1101 1173 11B2; # (끏; 끏; 끏; 끏; 끏; ) HANGUL SYLLABLE GGEULB +B050;B050;1101 1173 11B3;B050;1101 1173 11B3; # (끐; 끐; 끐; 끐; 끐; ) HANGUL SYLLABLE GGEULS +B051;B051;1101 1173 11B4;B051;1101 1173 11B4; # (끑; 끑; 끑; 끑; 끑; ) HANGUL SYLLABLE GGEULT +B052;B052;1101 1173 11B5;B052;1101 1173 11B5; # (끒; 끒; 끒; 끒; 끒; ) HANGUL SYLLABLE GGEULP +B053;B053;1101 1173 11B6;B053;1101 1173 11B6; # (끓; 끓; 끓; 끓; 끓; ) HANGUL SYLLABLE GGEULH +B054;B054;1101 1173 11B7;B054;1101 1173 11B7; # (끔; 끔; 끔; 끔; 끔; ) HANGUL SYLLABLE GGEUM +B055;B055;1101 1173 11B8;B055;1101 1173 11B8; # (끕; 끕; 끕; 끕; 끕; ) HANGUL SYLLABLE GGEUB +B056;B056;1101 1173 11B9;B056;1101 1173 11B9; # (끖; 끖; 끖; 끖; 끖; ) HANGUL SYLLABLE GGEUBS +B057;B057;1101 1173 11BA;B057;1101 1173 11BA; # (끗; 끗; 끗; 끗; 끗; ) HANGUL SYLLABLE GGEUS +B058;B058;1101 1173 11BB;B058;1101 1173 11BB; # (끘; 끘; 끘; 끘; 끘; ) HANGUL SYLLABLE GGEUSS +B059;B059;1101 1173 11BC;B059;1101 1173 11BC; # (끙; 끙; 끙; 끙; 끙; ) HANGUL SYLLABLE GGEUNG +B05A;B05A;1101 1173 11BD;B05A;1101 1173 11BD; # (끚; 끚; 끚; 끚; 끚; ) HANGUL SYLLABLE GGEUJ +B05B;B05B;1101 1173 11BE;B05B;1101 1173 11BE; # (끛; 끛; 끛; 끛; 끛; ) HANGUL SYLLABLE GGEUC +B05C;B05C;1101 1173 11BF;B05C;1101 1173 11BF; # (끜; 끜; 끜; 끜; 끜; ) HANGUL SYLLABLE GGEUK +B05D;B05D;1101 1173 11C0;B05D;1101 1173 11C0; # (끝; 끝; 끝; 끝; 끝; ) HANGUL SYLLABLE GGEUT +B05E;B05E;1101 1173 11C1;B05E;1101 1173 11C1; # (끞; 끞; 끞; 끞; 끞; ) HANGUL SYLLABLE GGEUP +B05F;B05F;1101 1173 11C2;B05F;1101 1173 11C2; # (끟; 끟; 끟; 끟; 끟; ) HANGUL SYLLABLE GGEUH +B060;B060;1101 1174;B060;1101 1174; # (끠; 끠; 끠; 끠; 끠; ) HANGUL SYLLABLE GGYI +B061;B061;1101 1174 11A8;B061;1101 1174 11A8; # (끡; 끡; 끡; 끡; 끡; ) HANGUL SYLLABLE GGYIG +B062;B062;1101 1174 11A9;B062;1101 1174 11A9; # (끢; 끢; 끢; 끢; 끢; ) HANGUL SYLLABLE GGYIGG +B063;B063;1101 1174 11AA;B063;1101 1174 11AA; # (끣; 끣; 끣; 끣; 끣; ) HANGUL SYLLABLE GGYIGS +B064;B064;1101 1174 11AB;B064;1101 1174 11AB; # (끤; 끤; 끤; 끤; 끤; ) HANGUL SYLLABLE GGYIN +B065;B065;1101 1174 11AC;B065;1101 1174 11AC; # (끥; 끥; 끥; 끥; 끥; ) HANGUL SYLLABLE GGYINJ +B066;B066;1101 1174 11AD;B066;1101 1174 11AD; # (끦; 끦; 끦; 끦; 끦; ) HANGUL SYLLABLE GGYINH +B067;B067;1101 1174 11AE;B067;1101 1174 11AE; # (끧; 끧; 끧; 끧; 끧; ) HANGUL SYLLABLE GGYID +B068;B068;1101 1174 11AF;B068;1101 1174 11AF; # (끨; 끨; 끨; 끨; 끨; ) HANGUL SYLLABLE GGYIL +B069;B069;1101 1174 11B0;B069;1101 1174 11B0; # (끩; 끩; 끩; 끩; 끩; ) HANGUL SYLLABLE GGYILG +B06A;B06A;1101 1174 11B1;B06A;1101 1174 11B1; # (끪; 끪; 끪; 끪; 끪; ) HANGUL SYLLABLE GGYILM +B06B;B06B;1101 1174 11B2;B06B;1101 1174 11B2; # (끫; 끫; 끫; 끫; 끫; ) HANGUL SYLLABLE GGYILB +B06C;B06C;1101 1174 11B3;B06C;1101 1174 11B3; # (끬; 끬; 끬; 끬; 끬; ) HANGUL SYLLABLE GGYILS +B06D;B06D;1101 1174 11B4;B06D;1101 1174 11B4; # (끭; 끭; 끭; 끭; 끭; ) HANGUL SYLLABLE GGYILT +B06E;B06E;1101 1174 11B5;B06E;1101 1174 11B5; # (끮; 끮; 끮; 끮; 끮; ) HANGUL SYLLABLE GGYILP +B06F;B06F;1101 1174 11B6;B06F;1101 1174 11B6; # (끯; 끯; 끯; 끯; 끯; ) HANGUL SYLLABLE GGYILH +B070;B070;1101 1174 11B7;B070;1101 1174 11B7; # (끰; 끰; 끰; 끰; 끰; ) HANGUL SYLLABLE GGYIM +B071;B071;1101 1174 11B8;B071;1101 1174 11B8; # (끱; 끱; 끱; 끱; 끱; ) HANGUL SYLLABLE GGYIB +B072;B072;1101 1174 11B9;B072;1101 1174 11B9; # (끲; 끲; 끲; 끲; 끲; ) HANGUL SYLLABLE GGYIBS +B073;B073;1101 1174 11BA;B073;1101 1174 11BA; # (끳; 끳; 끳; 끳; 끳; ) HANGUL SYLLABLE GGYIS +B074;B074;1101 1174 11BB;B074;1101 1174 11BB; # (끴; 끴; 끴; 끴; 끴; ) HANGUL SYLLABLE GGYISS +B075;B075;1101 1174 11BC;B075;1101 1174 11BC; # (끵; 끵; 끵; 끵; 끵; ) HANGUL SYLLABLE GGYING +B076;B076;1101 1174 11BD;B076;1101 1174 11BD; # (끶; 끶; 끶; 끶; 끶; ) HANGUL SYLLABLE GGYIJ +B077;B077;1101 1174 11BE;B077;1101 1174 11BE; # (끷; 끷; 끷; 끷; 끷; ) HANGUL SYLLABLE GGYIC +B078;B078;1101 1174 11BF;B078;1101 1174 11BF; # (끸; 끸; 끸; 끸; 끸; ) HANGUL SYLLABLE GGYIK +B079;B079;1101 1174 11C0;B079;1101 1174 11C0; # (끹; 끹; 끹; 끹; 끹; ) HANGUL SYLLABLE GGYIT +B07A;B07A;1101 1174 11C1;B07A;1101 1174 11C1; # (끺; 끺; 끺; 끺; 끺; ) HANGUL SYLLABLE GGYIP +B07B;B07B;1101 1174 11C2;B07B;1101 1174 11C2; # (끻; 끻; 끻; 끻; 끻; ) HANGUL SYLLABLE GGYIH +B07C;B07C;1101 1175;B07C;1101 1175; # (끼; 끼; 끼; 끼; 끼; ) HANGUL SYLLABLE GGI +B07D;B07D;1101 1175 11A8;B07D;1101 1175 11A8; # (끽; 끽; 끽; 끽; 끽; ) HANGUL SYLLABLE GGIG +B07E;B07E;1101 1175 11A9;B07E;1101 1175 11A9; # (끾; 끾; 끾; 끾; 끾; ) HANGUL SYLLABLE GGIGG +B07F;B07F;1101 1175 11AA;B07F;1101 1175 11AA; # (끿; 끿; 끿; 끿; 끿; ) HANGUL SYLLABLE GGIGS +B080;B080;1101 1175 11AB;B080;1101 1175 11AB; # (낀; 낀; 낀; 낀; 낀; ) HANGUL SYLLABLE GGIN +B081;B081;1101 1175 11AC;B081;1101 1175 11AC; # (낁; 낁; 낁; 낁; 낁; ) HANGUL SYLLABLE GGINJ +B082;B082;1101 1175 11AD;B082;1101 1175 11AD; # (낂; 낂; 낂; 낂; 낂; ) HANGUL SYLLABLE GGINH +B083;B083;1101 1175 11AE;B083;1101 1175 11AE; # (낃; 낃; 낃; 낃; 낃; ) HANGUL SYLLABLE GGID +B084;B084;1101 1175 11AF;B084;1101 1175 11AF; # (낄; 낄; 낄; 낄; 낄; ) HANGUL SYLLABLE GGIL +B085;B085;1101 1175 11B0;B085;1101 1175 11B0; # (낅; 낅; 낅; 낅; 낅; ) HANGUL SYLLABLE GGILG +B086;B086;1101 1175 11B1;B086;1101 1175 11B1; # (낆; 낆; 낆; 낆; 낆; ) HANGUL SYLLABLE GGILM +B087;B087;1101 1175 11B2;B087;1101 1175 11B2; # (낇; 낇; 낇; 낇; 낇; ) HANGUL SYLLABLE GGILB +B088;B088;1101 1175 11B3;B088;1101 1175 11B3; # (낈; 낈; 낈; 낈; 낈; ) HANGUL SYLLABLE GGILS +B089;B089;1101 1175 11B4;B089;1101 1175 11B4; # (낉; 낉; 낉; 낉; 낉; ) HANGUL SYLLABLE GGILT +B08A;B08A;1101 1175 11B5;B08A;1101 1175 11B5; # (낊; 낊; 낊; 낊; 낊; ) HANGUL SYLLABLE GGILP +B08B;B08B;1101 1175 11B6;B08B;1101 1175 11B6; # (낋; 낋; 낋; 낋; 낋; ) HANGUL SYLLABLE GGILH +B08C;B08C;1101 1175 11B7;B08C;1101 1175 11B7; # (낌; 낌; 낌; 낌; 낌; ) HANGUL SYLLABLE GGIM +B08D;B08D;1101 1175 11B8;B08D;1101 1175 11B8; # (낍; 낍; 낍; 낍; 낍; ) HANGUL SYLLABLE GGIB +B08E;B08E;1101 1175 11B9;B08E;1101 1175 11B9; # (낎; 낎; 낎; 낎; 낎; ) HANGUL SYLLABLE GGIBS +B08F;B08F;1101 1175 11BA;B08F;1101 1175 11BA; # (낏; 낏; 낏; 낏; 낏; ) HANGUL SYLLABLE GGIS +B090;B090;1101 1175 11BB;B090;1101 1175 11BB; # (낐; 낐; 낐; 낐; 낐; ) HANGUL SYLLABLE GGISS +B091;B091;1101 1175 11BC;B091;1101 1175 11BC; # (낑; 낑; 낑; 낑; 낑; ) HANGUL SYLLABLE GGING +B092;B092;1101 1175 11BD;B092;1101 1175 11BD; # (낒; 낒; 낒; 낒; 낒; ) HANGUL SYLLABLE GGIJ +B093;B093;1101 1175 11BE;B093;1101 1175 11BE; # (낓; 낓; 낓; 낓; 낓; ) HANGUL SYLLABLE GGIC +B094;B094;1101 1175 11BF;B094;1101 1175 11BF; # (낔; 낔; 낔; 낔; 낔; ) HANGUL SYLLABLE GGIK +B095;B095;1101 1175 11C0;B095;1101 1175 11C0; # (낕; 낕; 낕; 낕; 낕; ) HANGUL SYLLABLE GGIT +B096;B096;1101 1175 11C1;B096;1101 1175 11C1; # (낖; 낖; 낖; 낖; 낖; ) HANGUL SYLLABLE GGIP +B097;B097;1101 1175 11C2;B097;1101 1175 11C2; # (낗; 낗; 낗; 낗; 낗; ) HANGUL SYLLABLE GGIH +B098;B098;1102 1161;B098;1102 1161; # (나; 나; 나; 나; 나; ) HANGUL SYLLABLE NA +B099;B099;1102 1161 11A8;B099;1102 1161 11A8; # (낙; 낙; 낙; 낙; 낙; ) HANGUL SYLLABLE NAG +B09A;B09A;1102 1161 11A9;B09A;1102 1161 11A9; # (낚; 낚; 낚; 낚; 낚; ) HANGUL SYLLABLE NAGG +B09B;B09B;1102 1161 11AA;B09B;1102 1161 11AA; # (낛; 낛; 낛; 낛; 낛; ) HANGUL SYLLABLE NAGS +B09C;B09C;1102 1161 11AB;B09C;1102 1161 11AB; # (난; 난; 난; 난; 난; ) HANGUL SYLLABLE NAN +B09D;B09D;1102 1161 11AC;B09D;1102 1161 11AC; # (낝; 낝; 낝; 낝; 낝; ) HANGUL SYLLABLE NANJ +B09E;B09E;1102 1161 11AD;B09E;1102 1161 11AD; # (낞; 낞; 낞; 낞; 낞; ) HANGUL SYLLABLE NANH +B09F;B09F;1102 1161 11AE;B09F;1102 1161 11AE; # (낟; 낟; 낟; 낟; 낟; ) HANGUL SYLLABLE NAD +B0A0;B0A0;1102 1161 11AF;B0A0;1102 1161 11AF; # (날; 날; 날; 날; 날; ) HANGUL SYLLABLE NAL +B0A1;B0A1;1102 1161 11B0;B0A1;1102 1161 11B0; # (낡; 낡; 낡; 낡; 낡; ) HANGUL SYLLABLE NALG +B0A2;B0A2;1102 1161 11B1;B0A2;1102 1161 11B1; # (낢; 낢; 낢; 낢; 낢; ) HANGUL SYLLABLE NALM +B0A3;B0A3;1102 1161 11B2;B0A3;1102 1161 11B2; # (낣; 낣; 낣; 낣; 낣; ) HANGUL SYLLABLE NALB +B0A4;B0A4;1102 1161 11B3;B0A4;1102 1161 11B3; # (낤; 낤; 낤; 낤; 낤; ) HANGUL SYLLABLE NALS +B0A5;B0A5;1102 1161 11B4;B0A5;1102 1161 11B4; # (낥; 낥; 낥; 낥; 낥; ) HANGUL SYLLABLE NALT +B0A6;B0A6;1102 1161 11B5;B0A6;1102 1161 11B5; # (낦; 낦; 낦; 낦; 낦; ) HANGUL SYLLABLE NALP +B0A7;B0A7;1102 1161 11B6;B0A7;1102 1161 11B6; # (낧; 낧; 낧; 낧; 낧; ) HANGUL SYLLABLE NALH +B0A8;B0A8;1102 1161 11B7;B0A8;1102 1161 11B7; # (남; 남; 남; 남; 남; ) HANGUL SYLLABLE NAM +B0A9;B0A9;1102 1161 11B8;B0A9;1102 1161 11B8; # (납; 납; 납; 납; 납; ) HANGUL SYLLABLE NAB +B0AA;B0AA;1102 1161 11B9;B0AA;1102 1161 11B9; # (낪; 낪; 낪; 낪; 낪; ) HANGUL SYLLABLE NABS +B0AB;B0AB;1102 1161 11BA;B0AB;1102 1161 11BA; # (낫; 낫; 낫; 낫; 낫; ) HANGUL SYLLABLE NAS +B0AC;B0AC;1102 1161 11BB;B0AC;1102 1161 11BB; # (났; 났; 났; 났; 났; ) HANGUL SYLLABLE NASS +B0AD;B0AD;1102 1161 11BC;B0AD;1102 1161 11BC; # (낭; 낭; 낭; 낭; 낭; ) HANGUL SYLLABLE NANG +B0AE;B0AE;1102 1161 11BD;B0AE;1102 1161 11BD; # (낮; 낮; 낮; 낮; 낮; ) HANGUL SYLLABLE NAJ +B0AF;B0AF;1102 1161 11BE;B0AF;1102 1161 11BE; # (낯; 낯; 낯; 낯; 낯; ) HANGUL SYLLABLE NAC +B0B0;B0B0;1102 1161 11BF;B0B0;1102 1161 11BF; # (낰; 낰; 낰; 낰; 낰; ) HANGUL SYLLABLE NAK +B0B1;B0B1;1102 1161 11C0;B0B1;1102 1161 11C0; # (낱; 낱; 낱; 낱; 낱; ) HANGUL SYLLABLE NAT +B0B2;B0B2;1102 1161 11C1;B0B2;1102 1161 11C1; # (낲; 낲; 낲; 낲; 낲; ) HANGUL SYLLABLE NAP +B0B3;B0B3;1102 1161 11C2;B0B3;1102 1161 11C2; # (낳; 낳; 낳; 낳; 낳; ) HANGUL SYLLABLE NAH +B0B4;B0B4;1102 1162;B0B4;1102 1162; # (내; 내; 내; 내; 내; ) HANGUL SYLLABLE NAE +B0B5;B0B5;1102 1162 11A8;B0B5;1102 1162 11A8; # (낵; 낵; 낵; 낵; 낵; ) HANGUL SYLLABLE NAEG +B0B6;B0B6;1102 1162 11A9;B0B6;1102 1162 11A9; # (낶; 낶; 낶; 낶; 낶; ) HANGUL SYLLABLE NAEGG +B0B7;B0B7;1102 1162 11AA;B0B7;1102 1162 11AA; # (낷; 낷; 낷; 낷; 낷; ) HANGUL SYLLABLE NAEGS +B0B8;B0B8;1102 1162 11AB;B0B8;1102 1162 11AB; # (낸; 낸; 낸; 낸; 낸; ) HANGUL SYLLABLE NAEN +B0B9;B0B9;1102 1162 11AC;B0B9;1102 1162 11AC; # (낹; 낹; 낹; 낹; 낹; ) HANGUL SYLLABLE NAENJ +B0BA;B0BA;1102 1162 11AD;B0BA;1102 1162 11AD; # (낺; 낺; 낺; 낺; 낺; ) HANGUL SYLLABLE NAENH +B0BB;B0BB;1102 1162 11AE;B0BB;1102 1162 11AE; # (낻; 낻; 낻; 낻; 낻; ) HANGUL SYLLABLE NAED +B0BC;B0BC;1102 1162 11AF;B0BC;1102 1162 11AF; # (낼; 낼; 낼; 낼; 낼; ) HANGUL SYLLABLE NAEL +B0BD;B0BD;1102 1162 11B0;B0BD;1102 1162 11B0; # (낽; 낽; 낽; 낽; 낽; ) HANGUL SYLLABLE NAELG +B0BE;B0BE;1102 1162 11B1;B0BE;1102 1162 11B1; # (낾; 낾; 낾; 낾; 낾; ) HANGUL SYLLABLE NAELM +B0BF;B0BF;1102 1162 11B2;B0BF;1102 1162 11B2; # (낿; 낿; 낿; 낿; 낿; ) HANGUL SYLLABLE NAELB +B0C0;B0C0;1102 1162 11B3;B0C0;1102 1162 11B3; # (냀; 냀; 냀; 냀; 냀; ) HANGUL SYLLABLE NAELS +B0C1;B0C1;1102 1162 11B4;B0C1;1102 1162 11B4; # (냁; 냁; 냁; 냁; 냁; ) HANGUL SYLLABLE NAELT +B0C2;B0C2;1102 1162 11B5;B0C2;1102 1162 11B5; # (냂; 냂; 냂; 냂; 냂; ) HANGUL SYLLABLE NAELP +B0C3;B0C3;1102 1162 11B6;B0C3;1102 1162 11B6; # (냃; 냃; 냃; 냃; 냃; ) HANGUL SYLLABLE NAELH +B0C4;B0C4;1102 1162 11B7;B0C4;1102 1162 11B7; # (냄; 냄; 냄; 냄; 냄; ) HANGUL SYLLABLE NAEM +B0C5;B0C5;1102 1162 11B8;B0C5;1102 1162 11B8; # (냅; 냅; 냅; 냅; 냅; ) HANGUL SYLLABLE NAEB +B0C6;B0C6;1102 1162 11B9;B0C6;1102 1162 11B9; # (냆; 냆; 냆; 냆; 냆; ) HANGUL SYLLABLE NAEBS +B0C7;B0C7;1102 1162 11BA;B0C7;1102 1162 11BA; # (냇; 냇; 냇; 냇; 냇; ) HANGUL SYLLABLE NAES +B0C8;B0C8;1102 1162 11BB;B0C8;1102 1162 11BB; # (냈; 냈; 냈; 냈; 냈; ) HANGUL SYLLABLE NAESS +B0C9;B0C9;1102 1162 11BC;B0C9;1102 1162 11BC; # (냉; 냉; 냉; 냉; 냉; ) HANGUL SYLLABLE NAENG +B0CA;B0CA;1102 1162 11BD;B0CA;1102 1162 11BD; # (냊; 냊; 냊; 냊; 냊; ) HANGUL SYLLABLE NAEJ +B0CB;B0CB;1102 1162 11BE;B0CB;1102 1162 11BE; # (냋; 냋; 냋; 냋; 냋; ) HANGUL SYLLABLE NAEC +B0CC;B0CC;1102 1162 11BF;B0CC;1102 1162 11BF; # (냌; 냌; 냌; 냌; 냌; ) HANGUL SYLLABLE NAEK +B0CD;B0CD;1102 1162 11C0;B0CD;1102 1162 11C0; # (냍; 냍; 냍; 냍; 냍; ) HANGUL SYLLABLE NAET +B0CE;B0CE;1102 1162 11C1;B0CE;1102 1162 11C1; # (냎; 냎; 냎; 냎; 냎; ) HANGUL SYLLABLE NAEP +B0CF;B0CF;1102 1162 11C2;B0CF;1102 1162 11C2; # (냏; 냏; 냏; 냏; 냏; ) HANGUL SYLLABLE NAEH +B0D0;B0D0;1102 1163;B0D0;1102 1163; # (냐; 냐; 냐; 냐; 냐; ) HANGUL SYLLABLE NYA +B0D1;B0D1;1102 1163 11A8;B0D1;1102 1163 11A8; # (냑; 냑; 냑; 냑; 냑; ) HANGUL SYLLABLE NYAG +B0D2;B0D2;1102 1163 11A9;B0D2;1102 1163 11A9; # (냒; 냒; 냒; 냒; 냒; ) HANGUL SYLLABLE NYAGG +B0D3;B0D3;1102 1163 11AA;B0D3;1102 1163 11AA; # (냓; 냓; 냓; 냓; 냓; ) HANGUL SYLLABLE NYAGS +B0D4;B0D4;1102 1163 11AB;B0D4;1102 1163 11AB; # (냔; 냔; 냔; 냔; 냔; ) HANGUL SYLLABLE NYAN +B0D5;B0D5;1102 1163 11AC;B0D5;1102 1163 11AC; # (냕; 냕; 냕; 냕; 냕; ) HANGUL SYLLABLE NYANJ +B0D6;B0D6;1102 1163 11AD;B0D6;1102 1163 11AD; # (냖; 냖; 냖; 냖; 냖; ) HANGUL SYLLABLE NYANH +B0D7;B0D7;1102 1163 11AE;B0D7;1102 1163 11AE; # (냗; 냗; 냗; 냗; 냗; ) HANGUL SYLLABLE NYAD +B0D8;B0D8;1102 1163 11AF;B0D8;1102 1163 11AF; # (냘; 냘; 냘; 냘; 냘; ) HANGUL SYLLABLE NYAL +B0D9;B0D9;1102 1163 11B0;B0D9;1102 1163 11B0; # (냙; 냙; 냙; 냙; 냙; ) HANGUL SYLLABLE NYALG +B0DA;B0DA;1102 1163 11B1;B0DA;1102 1163 11B1; # (냚; 냚; 냚; 냚; 냚; ) HANGUL SYLLABLE NYALM +B0DB;B0DB;1102 1163 11B2;B0DB;1102 1163 11B2; # (냛; 냛; 냛; 냛; 냛; ) HANGUL SYLLABLE NYALB +B0DC;B0DC;1102 1163 11B3;B0DC;1102 1163 11B3; # (냜; 냜; 냜; 냜; 냜; ) HANGUL SYLLABLE NYALS +B0DD;B0DD;1102 1163 11B4;B0DD;1102 1163 11B4; # (냝; 냝; 냝; 냝; 냝; ) HANGUL SYLLABLE NYALT +B0DE;B0DE;1102 1163 11B5;B0DE;1102 1163 11B5; # (냞; 냞; 냞; 냞; 냞; ) HANGUL SYLLABLE NYALP +B0DF;B0DF;1102 1163 11B6;B0DF;1102 1163 11B6; # (냟; 냟; 냟; 냟; 냟; ) HANGUL SYLLABLE NYALH +B0E0;B0E0;1102 1163 11B7;B0E0;1102 1163 11B7; # (냠; 냠; 냠; 냠; 냠; ) HANGUL SYLLABLE NYAM +B0E1;B0E1;1102 1163 11B8;B0E1;1102 1163 11B8; # (냡; 냡; 냡; 냡; 냡; ) HANGUL SYLLABLE NYAB +B0E2;B0E2;1102 1163 11B9;B0E2;1102 1163 11B9; # (냢; 냢; 냢; 냢; 냢; ) HANGUL SYLLABLE NYABS +B0E3;B0E3;1102 1163 11BA;B0E3;1102 1163 11BA; # (냣; 냣; 냣; 냣; 냣; ) HANGUL SYLLABLE NYAS +B0E4;B0E4;1102 1163 11BB;B0E4;1102 1163 11BB; # (냤; 냤; 냤; 냤; 냤; ) HANGUL SYLLABLE NYASS +B0E5;B0E5;1102 1163 11BC;B0E5;1102 1163 11BC; # (냥; 냥; 냥; 냥; 냥; ) HANGUL SYLLABLE NYANG +B0E6;B0E6;1102 1163 11BD;B0E6;1102 1163 11BD; # (냦; 냦; 냦; 냦; 냦; ) HANGUL SYLLABLE NYAJ +B0E7;B0E7;1102 1163 11BE;B0E7;1102 1163 11BE; # (냧; 냧; 냧; 냧; 냧; ) HANGUL SYLLABLE NYAC +B0E8;B0E8;1102 1163 11BF;B0E8;1102 1163 11BF; # (냨; 냨; 냨; 냨; 냨; ) HANGUL SYLLABLE NYAK +B0E9;B0E9;1102 1163 11C0;B0E9;1102 1163 11C0; # (냩; 냩; 냩; 냩; 냩; ) HANGUL SYLLABLE NYAT +B0EA;B0EA;1102 1163 11C1;B0EA;1102 1163 11C1; # (냪; 냪; 냪; 냪; 냪; ) HANGUL SYLLABLE NYAP +B0EB;B0EB;1102 1163 11C2;B0EB;1102 1163 11C2; # (냫; 냫; 냫; 냫; 냫; ) HANGUL SYLLABLE NYAH +B0EC;B0EC;1102 1164;B0EC;1102 1164; # (냬; 냬; 냬; 냬; 냬; ) HANGUL SYLLABLE NYAE +B0ED;B0ED;1102 1164 11A8;B0ED;1102 1164 11A8; # (냭; 냭; 냭; 냭; 냭; ) HANGUL SYLLABLE NYAEG +B0EE;B0EE;1102 1164 11A9;B0EE;1102 1164 11A9; # (냮; 냮; 냮; 냮; 냮; ) HANGUL SYLLABLE NYAEGG +B0EF;B0EF;1102 1164 11AA;B0EF;1102 1164 11AA; # (냯; 냯; 냯; 냯; 냯; ) HANGUL SYLLABLE NYAEGS +B0F0;B0F0;1102 1164 11AB;B0F0;1102 1164 11AB; # (냰; 냰; 냰; 냰; 냰; ) HANGUL SYLLABLE NYAEN +B0F1;B0F1;1102 1164 11AC;B0F1;1102 1164 11AC; # (냱; 냱; 냱; 냱; 냱; ) HANGUL SYLLABLE NYAENJ +B0F2;B0F2;1102 1164 11AD;B0F2;1102 1164 11AD; # (냲; 냲; 냲; 냲; 냲; ) HANGUL SYLLABLE NYAENH +B0F3;B0F3;1102 1164 11AE;B0F3;1102 1164 11AE; # (냳; 냳; 냳; 냳; 냳; ) HANGUL SYLLABLE NYAED +B0F4;B0F4;1102 1164 11AF;B0F4;1102 1164 11AF; # (냴; 냴; 냴; 냴; 냴; ) HANGUL SYLLABLE NYAEL +B0F5;B0F5;1102 1164 11B0;B0F5;1102 1164 11B0; # (냵; 냵; 냵; 냵; 냵; ) HANGUL SYLLABLE NYAELG +B0F6;B0F6;1102 1164 11B1;B0F6;1102 1164 11B1; # (냶; 냶; 냶; 냶; 냶; ) HANGUL SYLLABLE NYAELM +B0F7;B0F7;1102 1164 11B2;B0F7;1102 1164 11B2; # (냷; 냷; 냷; 냷; 냷; ) HANGUL SYLLABLE NYAELB +B0F8;B0F8;1102 1164 11B3;B0F8;1102 1164 11B3; # (냸; 냸; 냸; 냸; 냸; ) HANGUL SYLLABLE NYAELS +B0F9;B0F9;1102 1164 11B4;B0F9;1102 1164 11B4; # (냹; 냹; 냹; 냹; 냹; ) HANGUL SYLLABLE NYAELT +B0FA;B0FA;1102 1164 11B5;B0FA;1102 1164 11B5; # (냺; 냺; 냺; 냺; 냺; ) HANGUL SYLLABLE NYAELP +B0FB;B0FB;1102 1164 11B6;B0FB;1102 1164 11B6; # (냻; 냻; 냻; 냻; 냻; ) HANGUL SYLLABLE NYAELH +B0FC;B0FC;1102 1164 11B7;B0FC;1102 1164 11B7; # (냼; 냼; 냼; 냼; 냼; ) HANGUL SYLLABLE NYAEM +B0FD;B0FD;1102 1164 11B8;B0FD;1102 1164 11B8; # (냽; 냽; 냽; 냽; 냽; ) HANGUL SYLLABLE NYAEB +B0FE;B0FE;1102 1164 11B9;B0FE;1102 1164 11B9; # (냾; 냾; 냾; 냾; 냾; ) HANGUL SYLLABLE NYAEBS +B0FF;B0FF;1102 1164 11BA;B0FF;1102 1164 11BA; # (냿; 냿; 냿; 냿; 냿; ) HANGUL SYLLABLE NYAES +B100;B100;1102 1164 11BB;B100;1102 1164 11BB; # (넀; 넀; 넀; 넀; 넀; ) HANGUL SYLLABLE NYAESS +B101;B101;1102 1164 11BC;B101;1102 1164 11BC; # (넁; 넁; 넁; 넁; 넁; ) HANGUL SYLLABLE NYAENG +B102;B102;1102 1164 11BD;B102;1102 1164 11BD; # (넂; 넂; 넂; 넂; 넂; ) HANGUL SYLLABLE NYAEJ +B103;B103;1102 1164 11BE;B103;1102 1164 11BE; # (넃; 넃; 넃; 넃; 넃; ) HANGUL SYLLABLE NYAEC +B104;B104;1102 1164 11BF;B104;1102 1164 11BF; # (넄; 넄; 넄; 넄; 넄; ) HANGUL SYLLABLE NYAEK +B105;B105;1102 1164 11C0;B105;1102 1164 11C0; # (넅; 넅; 넅; 넅; 넅; ) HANGUL SYLLABLE NYAET +B106;B106;1102 1164 11C1;B106;1102 1164 11C1; # (넆; 넆; 넆; 넆; 넆; ) HANGUL SYLLABLE NYAEP +B107;B107;1102 1164 11C2;B107;1102 1164 11C2; # (넇; 넇; 넇; 넇; 넇; ) HANGUL SYLLABLE NYAEH +B108;B108;1102 1165;B108;1102 1165; # (너; 너; 너; 너; 너; ) HANGUL SYLLABLE NEO +B109;B109;1102 1165 11A8;B109;1102 1165 11A8; # (넉; 넉; 넉; 넉; 넉; ) HANGUL SYLLABLE NEOG +B10A;B10A;1102 1165 11A9;B10A;1102 1165 11A9; # (넊; 넊; 넊; 넊; 넊; ) HANGUL SYLLABLE NEOGG +B10B;B10B;1102 1165 11AA;B10B;1102 1165 11AA; # (넋; 넋; 넋; 넋; 넋; ) HANGUL SYLLABLE NEOGS +B10C;B10C;1102 1165 11AB;B10C;1102 1165 11AB; # (넌; 넌; 넌; 넌; 넌; ) HANGUL SYLLABLE NEON +B10D;B10D;1102 1165 11AC;B10D;1102 1165 11AC; # (넍; 넍; 넍; 넍; 넍; ) HANGUL SYLLABLE NEONJ +B10E;B10E;1102 1165 11AD;B10E;1102 1165 11AD; # (넎; 넎; 넎; 넎; 넎; ) HANGUL SYLLABLE NEONH +B10F;B10F;1102 1165 11AE;B10F;1102 1165 11AE; # (넏; 넏; 넏; 넏; 넏; ) HANGUL SYLLABLE NEOD +B110;B110;1102 1165 11AF;B110;1102 1165 11AF; # (널; 널; 널; 널; 널; ) HANGUL SYLLABLE NEOL +B111;B111;1102 1165 11B0;B111;1102 1165 11B0; # (넑; 넑; 넑; 넑; 넑; ) HANGUL SYLLABLE NEOLG +B112;B112;1102 1165 11B1;B112;1102 1165 11B1; # (넒; 넒; 넒; 넒; 넒; ) HANGUL SYLLABLE NEOLM +B113;B113;1102 1165 11B2;B113;1102 1165 11B2; # (넓; 넓; 넓; 넓; 넓; ) HANGUL SYLLABLE NEOLB +B114;B114;1102 1165 11B3;B114;1102 1165 11B3; # (넔; 넔; 넔; 넔; 넔; ) HANGUL SYLLABLE NEOLS +B115;B115;1102 1165 11B4;B115;1102 1165 11B4; # (넕; 넕; 넕; 넕; 넕; ) HANGUL SYLLABLE NEOLT +B116;B116;1102 1165 11B5;B116;1102 1165 11B5; # (넖; 넖; 넖; 넖; 넖; ) HANGUL SYLLABLE NEOLP +B117;B117;1102 1165 11B6;B117;1102 1165 11B6; # (넗; 넗; 넗; 넗; 넗; ) HANGUL SYLLABLE NEOLH +B118;B118;1102 1165 11B7;B118;1102 1165 11B7; # (넘; 넘; 넘; 넘; 넘; ) HANGUL SYLLABLE NEOM +B119;B119;1102 1165 11B8;B119;1102 1165 11B8; # (넙; 넙; 넙; 넙; 넙; ) HANGUL SYLLABLE NEOB +B11A;B11A;1102 1165 11B9;B11A;1102 1165 11B9; # (넚; 넚; 넚; 넚; 넚; ) HANGUL SYLLABLE NEOBS +B11B;B11B;1102 1165 11BA;B11B;1102 1165 11BA; # (넛; 넛; 넛; 넛; 넛; ) HANGUL SYLLABLE NEOS +B11C;B11C;1102 1165 11BB;B11C;1102 1165 11BB; # (넜; 넜; 넜; 넜; 넜; ) HANGUL SYLLABLE NEOSS +B11D;B11D;1102 1165 11BC;B11D;1102 1165 11BC; # (넝; 넝; 넝; 넝; 넝; ) HANGUL SYLLABLE NEONG +B11E;B11E;1102 1165 11BD;B11E;1102 1165 11BD; # (넞; 넞; 넞; 넞; 넞; ) HANGUL SYLLABLE NEOJ +B11F;B11F;1102 1165 11BE;B11F;1102 1165 11BE; # (넟; 넟; 넟; 넟; 넟; ) HANGUL SYLLABLE NEOC +B120;B120;1102 1165 11BF;B120;1102 1165 11BF; # (넠; 넠; 넠; 넠; 넠; ) HANGUL SYLLABLE NEOK +B121;B121;1102 1165 11C0;B121;1102 1165 11C0; # (넡; 넡; 넡; 넡; 넡; ) HANGUL SYLLABLE NEOT +B122;B122;1102 1165 11C1;B122;1102 1165 11C1; # (넢; 넢; 넢; 넢; 넢; ) HANGUL SYLLABLE NEOP +B123;B123;1102 1165 11C2;B123;1102 1165 11C2; # (넣; 넣; 넣; 넣; 넣; ) HANGUL SYLLABLE NEOH +B124;B124;1102 1166;B124;1102 1166; # (네; 네; 네; 네; 네; ) HANGUL SYLLABLE NE +B125;B125;1102 1166 11A8;B125;1102 1166 11A8; # (넥; 넥; 넥; 넥; 넥; ) HANGUL SYLLABLE NEG +B126;B126;1102 1166 11A9;B126;1102 1166 11A9; # (넦; 넦; 넦; 넦; 넦; ) HANGUL SYLLABLE NEGG +B127;B127;1102 1166 11AA;B127;1102 1166 11AA; # (넧; 넧; 넧; 넧; 넧; ) HANGUL SYLLABLE NEGS +B128;B128;1102 1166 11AB;B128;1102 1166 11AB; # (넨; 넨; 넨; 넨; 넨; ) HANGUL SYLLABLE NEN +B129;B129;1102 1166 11AC;B129;1102 1166 11AC; # (넩; 넩; 넩; 넩; 넩; ) HANGUL SYLLABLE NENJ +B12A;B12A;1102 1166 11AD;B12A;1102 1166 11AD; # (넪; 넪; 넪; 넪; 넪; ) HANGUL SYLLABLE NENH +B12B;B12B;1102 1166 11AE;B12B;1102 1166 11AE; # (넫; 넫; 넫; 넫; 넫; ) HANGUL SYLLABLE NED +B12C;B12C;1102 1166 11AF;B12C;1102 1166 11AF; # (넬; 넬; 넬; 넬; 넬; ) HANGUL SYLLABLE NEL +B12D;B12D;1102 1166 11B0;B12D;1102 1166 11B0; # (넭; 넭; 넭; 넭; 넭; ) HANGUL SYLLABLE NELG +B12E;B12E;1102 1166 11B1;B12E;1102 1166 11B1; # (넮; 넮; 넮; 넮; 넮; ) HANGUL SYLLABLE NELM +B12F;B12F;1102 1166 11B2;B12F;1102 1166 11B2; # (넯; 넯; 넯; 넯; 넯; ) HANGUL SYLLABLE NELB +B130;B130;1102 1166 11B3;B130;1102 1166 11B3; # (넰; 넰; 넰; 넰; 넰; ) HANGUL SYLLABLE NELS +B131;B131;1102 1166 11B4;B131;1102 1166 11B4; # (넱; 넱; 넱; 넱; 넱; ) HANGUL SYLLABLE NELT +B132;B132;1102 1166 11B5;B132;1102 1166 11B5; # (넲; 넲; 넲; 넲; 넲; ) HANGUL SYLLABLE NELP +B133;B133;1102 1166 11B6;B133;1102 1166 11B6; # (넳; 넳; 넳; 넳; 넳; ) HANGUL SYLLABLE NELH +B134;B134;1102 1166 11B7;B134;1102 1166 11B7; # (넴; 넴; 넴; 넴; 넴; ) HANGUL SYLLABLE NEM +B135;B135;1102 1166 11B8;B135;1102 1166 11B8; # (넵; 넵; 넵; 넵; 넵; ) HANGUL SYLLABLE NEB +B136;B136;1102 1166 11B9;B136;1102 1166 11B9; # (넶; 넶; 넶; 넶; 넶; ) HANGUL SYLLABLE NEBS +B137;B137;1102 1166 11BA;B137;1102 1166 11BA; # (넷; 넷; 넷; 넷; 넷; ) HANGUL SYLLABLE NES +B138;B138;1102 1166 11BB;B138;1102 1166 11BB; # (넸; 넸; 넸; 넸; 넸; ) HANGUL SYLLABLE NESS +B139;B139;1102 1166 11BC;B139;1102 1166 11BC; # (넹; 넹; 넹; 넹; 넹; ) HANGUL SYLLABLE NENG +B13A;B13A;1102 1166 11BD;B13A;1102 1166 11BD; # (넺; 넺; 넺; 넺; 넺; ) HANGUL SYLLABLE NEJ +B13B;B13B;1102 1166 11BE;B13B;1102 1166 11BE; # (넻; 넻; 넻; 넻; 넻; ) HANGUL SYLLABLE NEC +B13C;B13C;1102 1166 11BF;B13C;1102 1166 11BF; # (넼; 넼; 넼; 넼; 넼; ) HANGUL SYLLABLE NEK +B13D;B13D;1102 1166 11C0;B13D;1102 1166 11C0; # (넽; 넽; 넽; 넽; 넽; ) HANGUL SYLLABLE NET +B13E;B13E;1102 1166 11C1;B13E;1102 1166 11C1; # (넾; 넾; 넾; 넾; 넾; ) HANGUL SYLLABLE NEP +B13F;B13F;1102 1166 11C2;B13F;1102 1166 11C2; # (넿; 넿; 넿; 넿; 넿; ) HANGUL SYLLABLE NEH +B140;B140;1102 1167;B140;1102 1167; # (녀; 녀; 녀; 녀; 녀; ) HANGUL SYLLABLE NYEO +B141;B141;1102 1167 11A8;B141;1102 1167 11A8; # (녁; 녁; 녁; 녁; 녁; ) HANGUL SYLLABLE NYEOG +B142;B142;1102 1167 11A9;B142;1102 1167 11A9; # (녂; 녂; 녂; 녂; 녂; ) HANGUL SYLLABLE NYEOGG +B143;B143;1102 1167 11AA;B143;1102 1167 11AA; # (녃; 녃; 녃; 녃; 녃; ) HANGUL SYLLABLE NYEOGS +B144;B144;1102 1167 11AB;B144;1102 1167 11AB; # (년; 년; 년; 년; 년; ) HANGUL SYLLABLE NYEON +B145;B145;1102 1167 11AC;B145;1102 1167 11AC; # (녅; 녅; 녅; 녅; 녅; ) HANGUL SYLLABLE NYEONJ +B146;B146;1102 1167 11AD;B146;1102 1167 11AD; # (녆; 녆; 녆; 녆; 녆; ) HANGUL SYLLABLE NYEONH +B147;B147;1102 1167 11AE;B147;1102 1167 11AE; # (녇; 녇; 녇; 녇; 녇; ) HANGUL SYLLABLE NYEOD +B148;B148;1102 1167 11AF;B148;1102 1167 11AF; # (녈; 녈; 녈; 녈; 녈; ) HANGUL SYLLABLE NYEOL +B149;B149;1102 1167 11B0;B149;1102 1167 11B0; # (녉; 녉; 녉; 녉; 녉; ) HANGUL SYLLABLE NYEOLG +B14A;B14A;1102 1167 11B1;B14A;1102 1167 11B1; # (녊; 녊; 녊; 녊; 녊; ) HANGUL SYLLABLE NYEOLM +B14B;B14B;1102 1167 11B2;B14B;1102 1167 11B2; # (녋; 녋; 녋; 녋; 녋; ) HANGUL SYLLABLE NYEOLB +B14C;B14C;1102 1167 11B3;B14C;1102 1167 11B3; # (녌; 녌; 녌; 녌; 녌; ) HANGUL SYLLABLE NYEOLS +B14D;B14D;1102 1167 11B4;B14D;1102 1167 11B4; # (녍; 녍; 녍; 녍; 녍; ) HANGUL SYLLABLE NYEOLT +B14E;B14E;1102 1167 11B5;B14E;1102 1167 11B5; # (녎; 녎; 녎; 녎; 녎; ) HANGUL SYLLABLE NYEOLP +B14F;B14F;1102 1167 11B6;B14F;1102 1167 11B6; # (녏; 녏; 녏; 녏; 녏; ) HANGUL SYLLABLE NYEOLH +B150;B150;1102 1167 11B7;B150;1102 1167 11B7; # (념; 념; 념; 념; 념; ) HANGUL SYLLABLE NYEOM +B151;B151;1102 1167 11B8;B151;1102 1167 11B8; # (녑; 녑; 녑; 녑; 녑; ) HANGUL SYLLABLE NYEOB +B152;B152;1102 1167 11B9;B152;1102 1167 11B9; # (녒; 녒; 녒; 녒; 녒; ) HANGUL SYLLABLE NYEOBS +B153;B153;1102 1167 11BA;B153;1102 1167 11BA; # (녓; 녓; 녓; 녓; 녓; ) HANGUL SYLLABLE NYEOS +B154;B154;1102 1167 11BB;B154;1102 1167 11BB; # (녔; 녔; 녔; 녔; 녔; ) HANGUL SYLLABLE NYEOSS +B155;B155;1102 1167 11BC;B155;1102 1167 11BC; # (녕; 녕; 녕; 녕; 녕; ) HANGUL SYLLABLE NYEONG +B156;B156;1102 1167 11BD;B156;1102 1167 11BD; # (녖; 녖; 녖; 녖; 녖; ) HANGUL SYLLABLE NYEOJ +B157;B157;1102 1167 11BE;B157;1102 1167 11BE; # (녗; 녗; 녗; 녗; 녗; ) HANGUL SYLLABLE NYEOC +B158;B158;1102 1167 11BF;B158;1102 1167 11BF; # (녘; 녘; 녘; 녘; 녘; ) HANGUL SYLLABLE NYEOK +B159;B159;1102 1167 11C0;B159;1102 1167 11C0; # (녙; 녙; 녙; 녙; 녙; ) HANGUL SYLLABLE NYEOT +B15A;B15A;1102 1167 11C1;B15A;1102 1167 11C1; # (녚; 녚; 녚; 녚; 녚; ) HANGUL SYLLABLE NYEOP +B15B;B15B;1102 1167 11C2;B15B;1102 1167 11C2; # (녛; 녛; 녛; 녛; 녛; ) HANGUL SYLLABLE NYEOH +B15C;B15C;1102 1168;B15C;1102 1168; # (녜; 녜; 녜; 녜; 녜; ) HANGUL SYLLABLE NYE +B15D;B15D;1102 1168 11A8;B15D;1102 1168 11A8; # (녝; 녝; 녝; 녝; 녝; ) HANGUL SYLLABLE NYEG +B15E;B15E;1102 1168 11A9;B15E;1102 1168 11A9; # (녞; 녞; 녞; 녞; 녞; ) HANGUL SYLLABLE NYEGG +B15F;B15F;1102 1168 11AA;B15F;1102 1168 11AA; # (녟; 녟; 녟; 녟; 녟; ) HANGUL SYLLABLE NYEGS +B160;B160;1102 1168 11AB;B160;1102 1168 11AB; # (녠; 녠; 녠; 녠; 녠; ) HANGUL SYLLABLE NYEN +B161;B161;1102 1168 11AC;B161;1102 1168 11AC; # (녡; 녡; 녡; 녡; 녡; ) HANGUL SYLLABLE NYENJ +B162;B162;1102 1168 11AD;B162;1102 1168 11AD; # (녢; 녢; 녢; 녢; 녢; ) HANGUL SYLLABLE NYENH +B163;B163;1102 1168 11AE;B163;1102 1168 11AE; # (녣; 녣; 녣; 녣; 녣; ) HANGUL SYLLABLE NYED +B164;B164;1102 1168 11AF;B164;1102 1168 11AF; # (녤; 녤; 녤; 녤; 녤; ) HANGUL SYLLABLE NYEL +B165;B165;1102 1168 11B0;B165;1102 1168 11B0; # (녥; 녥; 녥; 녥; 녥; ) HANGUL SYLLABLE NYELG +B166;B166;1102 1168 11B1;B166;1102 1168 11B1; # (녦; 녦; 녦; 녦; 녦; ) HANGUL SYLLABLE NYELM +B167;B167;1102 1168 11B2;B167;1102 1168 11B2; # (녧; 녧; 녧; 녧; 녧; ) HANGUL SYLLABLE NYELB +B168;B168;1102 1168 11B3;B168;1102 1168 11B3; # (녨; 녨; 녨; 녨; 녨; ) HANGUL SYLLABLE NYELS +B169;B169;1102 1168 11B4;B169;1102 1168 11B4; # (녩; 녩; 녩; 녩; 녩; ) HANGUL SYLLABLE NYELT +B16A;B16A;1102 1168 11B5;B16A;1102 1168 11B5; # (녪; 녪; 녪; 녪; 녪; ) HANGUL SYLLABLE NYELP +B16B;B16B;1102 1168 11B6;B16B;1102 1168 11B6; # (녫; 녫; 녫; 녫; 녫; ) HANGUL SYLLABLE NYELH +B16C;B16C;1102 1168 11B7;B16C;1102 1168 11B7; # (녬; 녬; 녬; 녬; 녬; ) HANGUL SYLLABLE NYEM +B16D;B16D;1102 1168 11B8;B16D;1102 1168 11B8; # (녭; 녭; 녭; 녭; 녭; ) HANGUL SYLLABLE NYEB +B16E;B16E;1102 1168 11B9;B16E;1102 1168 11B9; # (녮; 녮; 녮; 녮; 녮; ) HANGUL SYLLABLE NYEBS +B16F;B16F;1102 1168 11BA;B16F;1102 1168 11BA; # (녯; 녯; 녯; 녯; 녯; ) HANGUL SYLLABLE NYES +B170;B170;1102 1168 11BB;B170;1102 1168 11BB; # (녰; 녰; 녰; 녰; 녰; ) HANGUL SYLLABLE NYESS +B171;B171;1102 1168 11BC;B171;1102 1168 11BC; # (녱; 녱; 녱; 녱; 녱; ) HANGUL SYLLABLE NYENG +B172;B172;1102 1168 11BD;B172;1102 1168 11BD; # (녲; 녲; 녲; 녲; 녲; ) HANGUL SYLLABLE NYEJ +B173;B173;1102 1168 11BE;B173;1102 1168 11BE; # (녳; 녳; 녳; 녳; 녳; ) HANGUL SYLLABLE NYEC +B174;B174;1102 1168 11BF;B174;1102 1168 11BF; # (녴; 녴; 녴; 녴; 녴; ) HANGUL SYLLABLE NYEK +B175;B175;1102 1168 11C0;B175;1102 1168 11C0; # (녵; 녵; 녵; 녵; 녵; ) HANGUL SYLLABLE NYET +B176;B176;1102 1168 11C1;B176;1102 1168 11C1; # (녶; 녶; 녶; 녶; 녶; ) HANGUL SYLLABLE NYEP +B177;B177;1102 1168 11C2;B177;1102 1168 11C2; # (녷; 녷; 녷; 녷; 녷; ) HANGUL SYLLABLE NYEH +B178;B178;1102 1169;B178;1102 1169; # (노; 노; 노; 노; 노; ) HANGUL SYLLABLE NO +B179;B179;1102 1169 11A8;B179;1102 1169 11A8; # (녹; 녹; 녹; 녹; 녹; ) HANGUL SYLLABLE NOG +B17A;B17A;1102 1169 11A9;B17A;1102 1169 11A9; # (녺; 녺; 녺; 녺; 녺; ) HANGUL SYLLABLE NOGG +B17B;B17B;1102 1169 11AA;B17B;1102 1169 11AA; # (녻; 녻; 녻; 녻; 녻; ) HANGUL SYLLABLE NOGS +B17C;B17C;1102 1169 11AB;B17C;1102 1169 11AB; # (논; 논; 논; 논; 논; ) HANGUL SYLLABLE NON +B17D;B17D;1102 1169 11AC;B17D;1102 1169 11AC; # (녽; 녽; 녽; 녽; 녽; ) HANGUL SYLLABLE NONJ +B17E;B17E;1102 1169 11AD;B17E;1102 1169 11AD; # (녾; 녾; 녾; 녾; 녾; ) HANGUL SYLLABLE NONH +B17F;B17F;1102 1169 11AE;B17F;1102 1169 11AE; # (녿; 녿; 녿; 녿; 녿; ) HANGUL SYLLABLE NOD +B180;B180;1102 1169 11AF;B180;1102 1169 11AF; # (놀; 놀; 놀; 놀; 놀; ) HANGUL SYLLABLE NOL +B181;B181;1102 1169 11B0;B181;1102 1169 11B0; # (놁; 놁; 놁; 놁; 놁; ) HANGUL SYLLABLE NOLG +B182;B182;1102 1169 11B1;B182;1102 1169 11B1; # (놂; 놂; 놂; 놂; 놂; ) HANGUL SYLLABLE NOLM +B183;B183;1102 1169 11B2;B183;1102 1169 11B2; # (놃; 놃; 놃; 놃; 놃; ) HANGUL SYLLABLE NOLB +B184;B184;1102 1169 11B3;B184;1102 1169 11B3; # (놄; 놄; 놄; 놄; 놄; ) HANGUL SYLLABLE NOLS +B185;B185;1102 1169 11B4;B185;1102 1169 11B4; # (놅; 놅; 놅; 놅; 놅; ) HANGUL SYLLABLE NOLT +B186;B186;1102 1169 11B5;B186;1102 1169 11B5; # (놆; 놆; 놆; 놆; 놆; ) HANGUL SYLLABLE NOLP +B187;B187;1102 1169 11B6;B187;1102 1169 11B6; # (놇; 놇; 놇; 놇; 놇; ) HANGUL SYLLABLE NOLH +B188;B188;1102 1169 11B7;B188;1102 1169 11B7; # (놈; 놈; 놈; 놈; 놈; ) HANGUL SYLLABLE NOM +B189;B189;1102 1169 11B8;B189;1102 1169 11B8; # (놉; 놉; 놉; 놉; 놉; ) HANGUL SYLLABLE NOB +B18A;B18A;1102 1169 11B9;B18A;1102 1169 11B9; # (놊; 놊; 놊; 놊; 놊; ) HANGUL SYLLABLE NOBS +B18B;B18B;1102 1169 11BA;B18B;1102 1169 11BA; # (놋; 놋; 놋; 놋; 놋; ) HANGUL SYLLABLE NOS +B18C;B18C;1102 1169 11BB;B18C;1102 1169 11BB; # (놌; 놌; 놌; 놌; 놌; ) HANGUL SYLLABLE NOSS +B18D;B18D;1102 1169 11BC;B18D;1102 1169 11BC; # (농; 농; 농; 농; 농; ) HANGUL SYLLABLE NONG +B18E;B18E;1102 1169 11BD;B18E;1102 1169 11BD; # (놎; 놎; 놎; 놎; 놎; ) HANGUL SYLLABLE NOJ +B18F;B18F;1102 1169 11BE;B18F;1102 1169 11BE; # (놏; 놏; 놏; 놏; 놏; ) HANGUL SYLLABLE NOC +B190;B190;1102 1169 11BF;B190;1102 1169 11BF; # (놐; 놐; 놐; 놐; 놐; ) HANGUL SYLLABLE NOK +B191;B191;1102 1169 11C0;B191;1102 1169 11C0; # (놑; 놑; 놑; 놑; 놑; ) HANGUL SYLLABLE NOT +B192;B192;1102 1169 11C1;B192;1102 1169 11C1; # (높; 높; 높; 높; 높; ) HANGUL SYLLABLE NOP +B193;B193;1102 1169 11C2;B193;1102 1169 11C2; # (놓; 놓; 놓; 놓; 놓; ) HANGUL SYLLABLE NOH +B194;B194;1102 116A;B194;1102 116A; # (놔; 놔; 놔; 놔; 놔; ) HANGUL SYLLABLE NWA +B195;B195;1102 116A 11A8;B195;1102 116A 11A8; # (놕; 놕; 놕; 놕; 놕; ) HANGUL SYLLABLE NWAG +B196;B196;1102 116A 11A9;B196;1102 116A 11A9; # (놖; 놖; 놖; 놖; 놖; ) HANGUL SYLLABLE NWAGG +B197;B197;1102 116A 11AA;B197;1102 116A 11AA; # (놗; 놗; 놗; 놗; 놗; ) HANGUL SYLLABLE NWAGS +B198;B198;1102 116A 11AB;B198;1102 116A 11AB; # (놘; 놘; 놘; 놘; 놘; ) HANGUL SYLLABLE NWAN +B199;B199;1102 116A 11AC;B199;1102 116A 11AC; # (놙; 놙; 놙; 놙; 놙; ) HANGUL SYLLABLE NWANJ +B19A;B19A;1102 116A 11AD;B19A;1102 116A 11AD; # (놚; 놚; 놚; 놚; 놚; ) HANGUL SYLLABLE NWANH +B19B;B19B;1102 116A 11AE;B19B;1102 116A 11AE; # (놛; 놛; 놛; 놛; 놛; ) HANGUL SYLLABLE NWAD +B19C;B19C;1102 116A 11AF;B19C;1102 116A 11AF; # (놜; 놜; 놜; 놜; 놜; ) HANGUL SYLLABLE NWAL +B19D;B19D;1102 116A 11B0;B19D;1102 116A 11B0; # (놝; 놝; 놝; 놝; 놝; ) HANGUL SYLLABLE NWALG +B19E;B19E;1102 116A 11B1;B19E;1102 116A 11B1; # (놞; 놞; 놞; 놞; 놞; ) HANGUL SYLLABLE NWALM +B19F;B19F;1102 116A 11B2;B19F;1102 116A 11B2; # (놟; 놟; 놟; 놟; 놟; ) HANGUL SYLLABLE NWALB +B1A0;B1A0;1102 116A 11B3;B1A0;1102 116A 11B3; # (놠; 놠; 놠; 놠; 놠; ) HANGUL SYLLABLE NWALS +B1A1;B1A1;1102 116A 11B4;B1A1;1102 116A 11B4; # (놡; 놡; 놡; 놡; 놡; ) HANGUL SYLLABLE NWALT +B1A2;B1A2;1102 116A 11B5;B1A2;1102 116A 11B5; # (놢; 놢; 놢; 놢; 놢; ) HANGUL SYLLABLE NWALP +B1A3;B1A3;1102 116A 11B6;B1A3;1102 116A 11B6; # (놣; 놣; 놣; 놣; 놣; ) HANGUL SYLLABLE NWALH +B1A4;B1A4;1102 116A 11B7;B1A4;1102 116A 11B7; # (놤; 놤; 놤; 놤; 놤; ) HANGUL SYLLABLE NWAM +B1A5;B1A5;1102 116A 11B8;B1A5;1102 116A 11B8; # (놥; 놥; 놥; 놥; 놥; ) HANGUL SYLLABLE NWAB +B1A6;B1A6;1102 116A 11B9;B1A6;1102 116A 11B9; # (놦; 놦; 놦; 놦; 놦; ) HANGUL SYLLABLE NWABS +B1A7;B1A7;1102 116A 11BA;B1A7;1102 116A 11BA; # (놧; 놧; 놧; 놧; 놧; ) HANGUL SYLLABLE NWAS +B1A8;B1A8;1102 116A 11BB;B1A8;1102 116A 11BB; # (놨; 놨; 놨; 놨; 놨; ) HANGUL SYLLABLE NWASS +B1A9;B1A9;1102 116A 11BC;B1A9;1102 116A 11BC; # (놩; 놩; 놩; 놩; 놩; ) HANGUL SYLLABLE NWANG +B1AA;B1AA;1102 116A 11BD;B1AA;1102 116A 11BD; # (놪; 놪; 놪; 놪; 놪; ) HANGUL SYLLABLE NWAJ +B1AB;B1AB;1102 116A 11BE;B1AB;1102 116A 11BE; # (놫; 놫; 놫; 놫; 놫; ) HANGUL SYLLABLE NWAC +B1AC;B1AC;1102 116A 11BF;B1AC;1102 116A 11BF; # (놬; 놬; 놬; 놬; 놬; ) HANGUL SYLLABLE NWAK +B1AD;B1AD;1102 116A 11C0;B1AD;1102 116A 11C0; # (놭; 놭; 놭; 놭; 놭; ) HANGUL SYLLABLE NWAT +B1AE;B1AE;1102 116A 11C1;B1AE;1102 116A 11C1; # (놮; 놮; 놮; 놮; 놮; ) HANGUL SYLLABLE NWAP +B1AF;B1AF;1102 116A 11C2;B1AF;1102 116A 11C2; # (놯; 놯; 놯; 놯; 놯; ) HANGUL SYLLABLE NWAH +B1B0;B1B0;1102 116B;B1B0;1102 116B; # (놰; 놰; 놰; 놰; 놰; ) HANGUL SYLLABLE NWAE +B1B1;B1B1;1102 116B 11A8;B1B1;1102 116B 11A8; # (놱; 놱; 놱; 놱; 놱; ) HANGUL SYLLABLE NWAEG +B1B2;B1B2;1102 116B 11A9;B1B2;1102 116B 11A9; # (놲; 놲; 놲; 놲; 놲; ) HANGUL SYLLABLE NWAEGG +B1B3;B1B3;1102 116B 11AA;B1B3;1102 116B 11AA; # (놳; 놳; 놳; 놳; 놳; ) HANGUL SYLLABLE NWAEGS +B1B4;B1B4;1102 116B 11AB;B1B4;1102 116B 11AB; # (놴; 놴; 놴; 놴; 놴; ) HANGUL SYLLABLE NWAEN +B1B5;B1B5;1102 116B 11AC;B1B5;1102 116B 11AC; # (놵; 놵; 놵; 놵; 놵; ) HANGUL SYLLABLE NWAENJ +B1B6;B1B6;1102 116B 11AD;B1B6;1102 116B 11AD; # (놶; 놶; 놶; 놶; 놶; ) HANGUL SYLLABLE NWAENH +B1B7;B1B7;1102 116B 11AE;B1B7;1102 116B 11AE; # (놷; 놷; 놷; 놷; 놷; ) HANGUL SYLLABLE NWAED +B1B8;B1B8;1102 116B 11AF;B1B8;1102 116B 11AF; # (놸; 놸; 놸; 놸; 놸; ) HANGUL SYLLABLE NWAEL +B1B9;B1B9;1102 116B 11B0;B1B9;1102 116B 11B0; # (놹; 놹; 놹; 놹; 놹; ) HANGUL SYLLABLE NWAELG +B1BA;B1BA;1102 116B 11B1;B1BA;1102 116B 11B1; # (놺; 놺; 놺; 놺; 놺; ) HANGUL SYLLABLE NWAELM +B1BB;B1BB;1102 116B 11B2;B1BB;1102 116B 11B2; # (놻; 놻; 놻; 놻; 놻; ) HANGUL SYLLABLE NWAELB +B1BC;B1BC;1102 116B 11B3;B1BC;1102 116B 11B3; # (놼; 놼; 놼; 놼; 놼; ) HANGUL SYLLABLE NWAELS +B1BD;B1BD;1102 116B 11B4;B1BD;1102 116B 11B4; # (놽; 놽; 놽; 놽; 놽; ) HANGUL SYLLABLE NWAELT +B1BE;B1BE;1102 116B 11B5;B1BE;1102 116B 11B5; # (놾; 놾; 놾; 놾; 놾; ) HANGUL SYLLABLE NWAELP +B1BF;B1BF;1102 116B 11B6;B1BF;1102 116B 11B6; # (놿; 놿; 놿; 놿; 놿; ) HANGUL SYLLABLE NWAELH +B1C0;B1C0;1102 116B 11B7;B1C0;1102 116B 11B7; # (뇀; 뇀; 뇀; 뇀; 뇀; ) HANGUL SYLLABLE NWAEM +B1C1;B1C1;1102 116B 11B8;B1C1;1102 116B 11B8; # (뇁; 뇁; 뇁; 뇁; 뇁; ) HANGUL SYLLABLE NWAEB +B1C2;B1C2;1102 116B 11B9;B1C2;1102 116B 11B9; # (뇂; 뇂; 뇂; 뇂; 뇂; ) HANGUL SYLLABLE NWAEBS +B1C3;B1C3;1102 116B 11BA;B1C3;1102 116B 11BA; # (뇃; 뇃; 뇃; 뇃; 뇃; ) HANGUL SYLLABLE NWAES +B1C4;B1C4;1102 116B 11BB;B1C4;1102 116B 11BB; # (뇄; 뇄; 뇄; 뇄; 뇄; ) HANGUL SYLLABLE NWAESS +B1C5;B1C5;1102 116B 11BC;B1C5;1102 116B 11BC; # (뇅; 뇅; 뇅; 뇅; 뇅; ) HANGUL SYLLABLE NWAENG +B1C6;B1C6;1102 116B 11BD;B1C6;1102 116B 11BD; # (뇆; 뇆; 뇆; 뇆; 뇆; ) HANGUL SYLLABLE NWAEJ +B1C7;B1C7;1102 116B 11BE;B1C7;1102 116B 11BE; # (뇇; 뇇; 뇇; 뇇; 뇇; ) HANGUL SYLLABLE NWAEC +B1C8;B1C8;1102 116B 11BF;B1C8;1102 116B 11BF; # (뇈; 뇈; 뇈; 뇈; 뇈; ) HANGUL SYLLABLE NWAEK +B1C9;B1C9;1102 116B 11C0;B1C9;1102 116B 11C0; # (뇉; 뇉; 뇉; 뇉; 뇉; ) HANGUL SYLLABLE NWAET +B1CA;B1CA;1102 116B 11C1;B1CA;1102 116B 11C1; # (뇊; 뇊; 뇊; 뇊; 뇊; ) HANGUL SYLLABLE NWAEP +B1CB;B1CB;1102 116B 11C2;B1CB;1102 116B 11C2; # (뇋; 뇋; 뇋; 뇋; 뇋; ) HANGUL SYLLABLE NWAEH +B1CC;B1CC;1102 116C;B1CC;1102 116C; # (뇌; 뇌; 뇌; 뇌; 뇌; ) HANGUL SYLLABLE NOE +B1CD;B1CD;1102 116C 11A8;B1CD;1102 116C 11A8; # (뇍; 뇍; 뇍; 뇍; 뇍; ) HANGUL SYLLABLE NOEG +B1CE;B1CE;1102 116C 11A9;B1CE;1102 116C 11A9; # (뇎; 뇎; 뇎; 뇎; 뇎; ) HANGUL SYLLABLE NOEGG +B1CF;B1CF;1102 116C 11AA;B1CF;1102 116C 11AA; # (뇏; 뇏; 뇏; 뇏; 뇏; ) HANGUL SYLLABLE NOEGS +B1D0;B1D0;1102 116C 11AB;B1D0;1102 116C 11AB; # (뇐; 뇐; 뇐; 뇐; 뇐; ) HANGUL SYLLABLE NOEN +B1D1;B1D1;1102 116C 11AC;B1D1;1102 116C 11AC; # (뇑; 뇑; 뇑; 뇑; 뇑; ) HANGUL SYLLABLE NOENJ +B1D2;B1D2;1102 116C 11AD;B1D2;1102 116C 11AD; # (뇒; 뇒; 뇒; 뇒; 뇒; ) HANGUL SYLLABLE NOENH +B1D3;B1D3;1102 116C 11AE;B1D3;1102 116C 11AE; # (뇓; 뇓; 뇓; 뇓; 뇓; ) HANGUL SYLLABLE NOED +B1D4;B1D4;1102 116C 11AF;B1D4;1102 116C 11AF; # (뇔; 뇔; 뇔; 뇔; 뇔; ) HANGUL SYLLABLE NOEL +B1D5;B1D5;1102 116C 11B0;B1D5;1102 116C 11B0; # (뇕; 뇕; 뇕; 뇕; 뇕; ) HANGUL SYLLABLE NOELG +B1D6;B1D6;1102 116C 11B1;B1D6;1102 116C 11B1; # (뇖; 뇖; 뇖; 뇖; 뇖; ) HANGUL SYLLABLE NOELM +B1D7;B1D7;1102 116C 11B2;B1D7;1102 116C 11B2; # (뇗; 뇗; 뇗; 뇗; 뇗; ) HANGUL SYLLABLE NOELB +B1D8;B1D8;1102 116C 11B3;B1D8;1102 116C 11B3; # (뇘; 뇘; 뇘; 뇘; 뇘; ) HANGUL SYLLABLE NOELS +B1D9;B1D9;1102 116C 11B4;B1D9;1102 116C 11B4; # (뇙; 뇙; 뇙; 뇙; 뇙; ) HANGUL SYLLABLE NOELT +B1DA;B1DA;1102 116C 11B5;B1DA;1102 116C 11B5; # (뇚; 뇚; 뇚; 뇚; 뇚; ) HANGUL SYLLABLE NOELP +B1DB;B1DB;1102 116C 11B6;B1DB;1102 116C 11B6; # (뇛; 뇛; 뇛; 뇛; 뇛; ) HANGUL SYLLABLE NOELH +B1DC;B1DC;1102 116C 11B7;B1DC;1102 116C 11B7; # (뇜; 뇜; 뇜; 뇜; 뇜; ) HANGUL SYLLABLE NOEM +B1DD;B1DD;1102 116C 11B8;B1DD;1102 116C 11B8; # (뇝; 뇝; 뇝; 뇝; 뇝; ) HANGUL SYLLABLE NOEB +B1DE;B1DE;1102 116C 11B9;B1DE;1102 116C 11B9; # (뇞; 뇞; 뇞; 뇞; 뇞; ) HANGUL SYLLABLE NOEBS +B1DF;B1DF;1102 116C 11BA;B1DF;1102 116C 11BA; # (뇟; 뇟; 뇟; 뇟; 뇟; ) HANGUL SYLLABLE NOES +B1E0;B1E0;1102 116C 11BB;B1E0;1102 116C 11BB; # (뇠; 뇠; 뇠; 뇠; 뇠; ) HANGUL SYLLABLE NOESS +B1E1;B1E1;1102 116C 11BC;B1E1;1102 116C 11BC; # (뇡; 뇡; 뇡; 뇡; 뇡; ) HANGUL SYLLABLE NOENG +B1E2;B1E2;1102 116C 11BD;B1E2;1102 116C 11BD; # (뇢; 뇢; 뇢; 뇢; 뇢; ) HANGUL SYLLABLE NOEJ +B1E3;B1E3;1102 116C 11BE;B1E3;1102 116C 11BE; # (뇣; 뇣; 뇣; 뇣; 뇣; ) HANGUL SYLLABLE NOEC +B1E4;B1E4;1102 116C 11BF;B1E4;1102 116C 11BF; # (뇤; 뇤; 뇤; 뇤; 뇤; ) HANGUL SYLLABLE NOEK +B1E5;B1E5;1102 116C 11C0;B1E5;1102 116C 11C0; # (뇥; 뇥; 뇥; 뇥; 뇥; ) HANGUL SYLLABLE NOET +B1E6;B1E6;1102 116C 11C1;B1E6;1102 116C 11C1; # (뇦; 뇦; 뇦; 뇦; 뇦; ) HANGUL SYLLABLE NOEP +B1E7;B1E7;1102 116C 11C2;B1E7;1102 116C 11C2; # (뇧; 뇧; 뇧; 뇧; 뇧; ) HANGUL SYLLABLE NOEH +B1E8;B1E8;1102 116D;B1E8;1102 116D; # (뇨; 뇨; 뇨; 뇨; 뇨; ) HANGUL SYLLABLE NYO +B1E9;B1E9;1102 116D 11A8;B1E9;1102 116D 11A8; # (뇩; 뇩; 뇩; 뇩; 뇩; ) HANGUL SYLLABLE NYOG +B1EA;B1EA;1102 116D 11A9;B1EA;1102 116D 11A9; # (뇪; 뇪; 뇪; 뇪; 뇪; ) HANGUL SYLLABLE NYOGG +B1EB;B1EB;1102 116D 11AA;B1EB;1102 116D 11AA; # (뇫; 뇫; 뇫; 뇫; 뇫; ) HANGUL SYLLABLE NYOGS +B1EC;B1EC;1102 116D 11AB;B1EC;1102 116D 11AB; # (뇬; 뇬; 뇬; 뇬; 뇬; ) HANGUL SYLLABLE NYON +B1ED;B1ED;1102 116D 11AC;B1ED;1102 116D 11AC; # (뇭; 뇭; 뇭; 뇭; 뇭; ) HANGUL SYLLABLE NYONJ +B1EE;B1EE;1102 116D 11AD;B1EE;1102 116D 11AD; # (뇮; 뇮; 뇮; 뇮; 뇮; ) HANGUL SYLLABLE NYONH +B1EF;B1EF;1102 116D 11AE;B1EF;1102 116D 11AE; # (뇯; 뇯; 뇯; 뇯; 뇯; ) HANGUL SYLLABLE NYOD +B1F0;B1F0;1102 116D 11AF;B1F0;1102 116D 11AF; # (뇰; 뇰; 뇰; 뇰; 뇰; ) HANGUL SYLLABLE NYOL +B1F1;B1F1;1102 116D 11B0;B1F1;1102 116D 11B0; # (뇱; 뇱; 뇱; 뇱; 뇱; ) HANGUL SYLLABLE NYOLG +B1F2;B1F2;1102 116D 11B1;B1F2;1102 116D 11B1; # (뇲; 뇲; 뇲; 뇲; 뇲; ) HANGUL SYLLABLE NYOLM +B1F3;B1F3;1102 116D 11B2;B1F3;1102 116D 11B2; # (뇳; 뇳; 뇳; 뇳; 뇳; ) HANGUL SYLLABLE NYOLB +B1F4;B1F4;1102 116D 11B3;B1F4;1102 116D 11B3; # (뇴; 뇴; 뇴; 뇴; 뇴; ) HANGUL SYLLABLE NYOLS +B1F5;B1F5;1102 116D 11B4;B1F5;1102 116D 11B4; # (뇵; 뇵; 뇵; 뇵; 뇵; ) HANGUL SYLLABLE NYOLT +B1F6;B1F6;1102 116D 11B5;B1F6;1102 116D 11B5; # (뇶; 뇶; 뇶; 뇶; 뇶; ) HANGUL SYLLABLE NYOLP +B1F7;B1F7;1102 116D 11B6;B1F7;1102 116D 11B6; # (뇷; 뇷; 뇷; 뇷; 뇷; ) HANGUL SYLLABLE NYOLH +B1F8;B1F8;1102 116D 11B7;B1F8;1102 116D 11B7; # (뇸; 뇸; 뇸; 뇸; 뇸; ) HANGUL SYLLABLE NYOM +B1F9;B1F9;1102 116D 11B8;B1F9;1102 116D 11B8; # (뇹; 뇹; 뇹; 뇹; 뇹; ) HANGUL SYLLABLE NYOB +B1FA;B1FA;1102 116D 11B9;B1FA;1102 116D 11B9; # (뇺; 뇺; 뇺; 뇺; 뇺; ) HANGUL SYLLABLE NYOBS +B1FB;B1FB;1102 116D 11BA;B1FB;1102 116D 11BA; # (뇻; 뇻; 뇻; 뇻; 뇻; ) HANGUL SYLLABLE NYOS +B1FC;B1FC;1102 116D 11BB;B1FC;1102 116D 11BB; # (뇼; 뇼; 뇼; 뇼; 뇼; ) HANGUL SYLLABLE NYOSS +B1FD;B1FD;1102 116D 11BC;B1FD;1102 116D 11BC; # (뇽; 뇽; 뇽; 뇽; 뇽; ) HANGUL SYLLABLE NYONG +B1FE;B1FE;1102 116D 11BD;B1FE;1102 116D 11BD; # (뇾; 뇾; 뇾; 뇾; 뇾; ) HANGUL SYLLABLE NYOJ +B1FF;B1FF;1102 116D 11BE;B1FF;1102 116D 11BE; # (뇿; 뇿; 뇿; 뇿; 뇿; ) HANGUL SYLLABLE NYOC +B200;B200;1102 116D 11BF;B200;1102 116D 11BF; # (눀; 눀; 눀; 눀; 눀; ) HANGUL SYLLABLE NYOK +B201;B201;1102 116D 11C0;B201;1102 116D 11C0; # (눁; 눁; 눁; 눁; 눁; ) HANGUL SYLLABLE NYOT +B202;B202;1102 116D 11C1;B202;1102 116D 11C1; # (눂; 눂; 눂; 눂; 눂; ) HANGUL SYLLABLE NYOP +B203;B203;1102 116D 11C2;B203;1102 116D 11C2; # (눃; 눃; 눃; 눃; 눃; ) HANGUL SYLLABLE NYOH +B204;B204;1102 116E;B204;1102 116E; # (누; 누; 누; 누; 누; ) HANGUL SYLLABLE NU +B205;B205;1102 116E 11A8;B205;1102 116E 11A8; # (눅; 눅; 눅; 눅; 눅; ) HANGUL SYLLABLE NUG +B206;B206;1102 116E 11A9;B206;1102 116E 11A9; # (눆; 눆; 눆; 눆; 눆; ) HANGUL SYLLABLE NUGG +B207;B207;1102 116E 11AA;B207;1102 116E 11AA; # (눇; 눇; 눇; 눇; 눇; ) HANGUL SYLLABLE NUGS +B208;B208;1102 116E 11AB;B208;1102 116E 11AB; # (눈; 눈; 눈; 눈; 눈; ) HANGUL SYLLABLE NUN +B209;B209;1102 116E 11AC;B209;1102 116E 11AC; # (눉; 눉; 눉; 눉; 눉; ) HANGUL SYLLABLE NUNJ +B20A;B20A;1102 116E 11AD;B20A;1102 116E 11AD; # (눊; 눊; 눊; 눊; 눊; ) HANGUL SYLLABLE NUNH +B20B;B20B;1102 116E 11AE;B20B;1102 116E 11AE; # (눋; 눋; 눋; 눋; 눋; ) HANGUL SYLLABLE NUD +B20C;B20C;1102 116E 11AF;B20C;1102 116E 11AF; # (눌; 눌; 눌; 눌; 눌; ) HANGUL SYLLABLE NUL +B20D;B20D;1102 116E 11B0;B20D;1102 116E 11B0; # (눍; 눍; 눍; 눍; 눍; ) HANGUL SYLLABLE NULG +B20E;B20E;1102 116E 11B1;B20E;1102 116E 11B1; # (눎; 눎; 눎; 눎; 눎; ) HANGUL SYLLABLE NULM +B20F;B20F;1102 116E 11B2;B20F;1102 116E 11B2; # (눏; 눏; 눏; 눏; 눏; ) HANGUL SYLLABLE NULB +B210;B210;1102 116E 11B3;B210;1102 116E 11B3; # (눐; 눐; 눐; 눐; 눐; ) HANGUL SYLLABLE NULS +B211;B211;1102 116E 11B4;B211;1102 116E 11B4; # (눑; 눑; 눑; 눑; 눑; ) HANGUL SYLLABLE NULT +B212;B212;1102 116E 11B5;B212;1102 116E 11B5; # (눒; 눒; 눒; 눒; 눒; ) HANGUL SYLLABLE NULP +B213;B213;1102 116E 11B6;B213;1102 116E 11B6; # (눓; 눓; 눓; 눓; 눓; ) HANGUL SYLLABLE NULH +B214;B214;1102 116E 11B7;B214;1102 116E 11B7; # (눔; 눔; 눔; 눔; 눔; ) HANGUL SYLLABLE NUM +B215;B215;1102 116E 11B8;B215;1102 116E 11B8; # (눕; 눕; 눕; 눕; 눕; ) HANGUL SYLLABLE NUB +B216;B216;1102 116E 11B9;B216;1102 116E 11B9; # (눖; 눖; 눖; 눖; 눖; ) HANGUL SYLLABLE NUBS +B217;B217;1102 116E 11BA;B217;1102 116E 11BA; # (눗; 눗; 눗; 눗; 눗; ) HANGUL SYLLABLE NUS +B218;B218;1102 116E 11BB;B218;1102 116E 11BB; # (눘; 눘; 눘; 눘; 눘; ) HANGUL SYLLABLE NUSS +B219;B219;1102 116E 11BC;B219;1102 116E 11BC; # (눙; 눙; 눙; 눙; 눙; ) HANGUL SYLLABLE NUNG +B21A;B21A;1102 116E 11BD;B21A;1102 116E 11BD; # (눚; 눚; 눚; 눚; 눚; ) HANGUL SYLLABLE NUJ +B21B;B21B;1102 116E 11BE;B21B;1102 116E 11BE; # (눛; 눛; 눛; 눛; 눛; ) HANGUL SYLLABLE NUC +B21C;B21C;1102 116E 11BF;B21C;1102 116E 11BF; # (눜; 눜; 눜; 눜; 눜; ) HANGUL SYLLABLE NUK +B21D;B21D;1102 116E 11C0;B21D;1102 116E 11C0; # (눝; 눝; 눝; 눝; 눝; ) HANGUL SYLLABLE NUT +B21E;B21E;1102 116E 11C1;B21E;1102 116E 11C1; # (눞; 눞; 눞; 눞; 눞; ) HANGUL SYLLABLE NUP +B21F;B21F;1102 116E 11C2;B21F;1102 116E 11C2; # (눟; 눟; 눟; 눟; 눟; ) HANGUL SYLLABLE NUH +B220;B220;1102 116F;B220;1102 116F; # (눠; 눠; 눠; 눠; 눠; ) HANGUL SYLLABLE NWEO +B221;B221;1102 116F 11A8;B221;1102 116F 11A8; # (눡; 눡; 눡; 눡; 눡; ) HANGUL SYLLABLE NWEOG +B222;B222;1102 116F 11A9;B222;1102 116F 11A9; # (눢; 눢; 눢; 눢; 눢; ) HANGUL SYLLABLE NWEOGG +B223;B223;1102 116F 11AA;B223;1102 116F 11AA; # (눣; 눣; 눣; 눣; 눣; ) HANGUL SYLLABLE NWEOGS +B224;B224;1102 116F 11AB;B224;1102 116F 11AB; # (눤; 눤; 눤; 눤; 눤; ) HANGUL SYLLABLE NWEON +B225;B225;1102 116F 11AC;B225;1102 116F 11AC; # (눥; 눥; 눥; 눥; 눥; ) HANGUL SYLLABLE NWEONJ +B226;B226;1102 116F 11AD;B226;1102 116F 11AD; # (눦; 눦; 눦; 눦; 눦; ) HANGUL SYLLABLE NWEONH +B227;B227;1102 116F 11AE;B227;1102 116F 11AE; # (눧; 눧; 눧; 눧; 눧; ) HANGUL SYLLABLE NWEOD +B228;B228;1102 116F 11AF;B228;1102 116F 11AF; # (눨; 눨; 눨; 눨; 눨; ) HANGUL SYLLABLE NWEOL +B229;B229;1102 116F 11B0;B229;1102 116F 11B0; # (눩; 눩; 눩; 눩; 눩; ) HANGUL SYLLABLE NWEOLG +B22A;B22A;1102 116F 11B1;B22A;1102 116F 11B1; # (눪; 눪; 눪; 눪; 눪; ) HANGUL SYLLABLE NWEOLM +B22B;B22B;1102 116F 11B2;B22B;1102 116F 11B2; # (눫; 눫; 눫; 눫; 눫; ) HANGUL SYLLABLE NWEOLB +B22C;B22C;1102 116F 11B3;B22C;1102 116F 11B3; # (눬; 눬; 눬; 눬; 눬; ) HANGUL SYLLABLE NWEOLS +B22D;B22D;1102 116F 11B4;B22D;1102 116F 11B4; # (눭; 눭; 눭; 눭; 눭; ) HANGUL SYLLABLE NWEOLT +B22E;B22E;1102 116F 11B5;B22E;1102 116F 11B5; # (눮; 눮; 눮; 눮; 눮; ) HANGUL SYLLABLE NWEOLP +B22F;B22F;1102 116F 11B6;B22F;1102 116F 11B6; # (눯; 눯; 눯; 눯; 눯; ) HANGUL SYLLABLE NWEOLH +B230;B230;1102 116F 11B7;B230;1102 116F 11B7; # (눰; 눰; 눰; 눰; 눰; ) HANGUL SYLLABLE NWEOM +B231;B231;1102 116F 11B8;B231;1102 116F 11B8; # (눱; 눱; 눱; 눱; 눱; ) HANGUL SYLLABLE NWEOB +B232;B232;1102 116F 11B9;B232;1102 116F 11B9; # (눲; 눲; 눲; 눲; 눲; ) HANGUL SYLLABLE NWEOBS +B233;B233;1102 116F 11BA;B233;1102 116F 11BA; # (눳; 눳; 눳; 눳; 눳; ) HANGUL SYLLABLE NWEOS +B234;B234;1102 116F 11BB;B234;1102 116F 11BB; # (눴; 눴; 눴; 눴; 눴; ) HANGUL SYLLABLE NWEOSS +B235;B235;1102 116F 11BC;B235;1102 116F 11BC; # (눵; 눵; 눵; 눵; 눵; ) HANGUL SYLLABLE NWEONG +B236;B236;1102 116F 11BD;B236;1102 116F 11BD; # (눶; 눶; 눶; 눶; 눶; ) HANGUL SYLLABLE NWEOJ +B237;B237;1102 116F 11BE;B237;1102 116F 11BE; # (눷; 눷; 눷; 눷; 눷; ) HANGUL SYLLABLE NWEOC +B238;B238;1102 116F 11BF;B238;1102 116F 11BF; # (눸; 눸; 눸; 눸; 눸; ) HANGUL SYLLABLE NWEOK +B239;B239;1102 116F 11C0;B239;1102 116F 11C0; # (눹; 눹; 눹; 눹; 눹; ) HANGUL SYLLABLE NWEOT +B23A;B23A;1102 116F 11C1;B23A;1102 116F 11C1; # (눺; 눺; 눺; 눺; 눺; ) HANGUL SYLLABLE NWEOP +B23B;B23B;1102 116F 11C2;B23B;1102 116F 11C2; # (눻; 눻; 눻; 눻; 눻; ) HANGUL SYLLABLE NWEOH +B23C;B23C;1102 1170;B23C;1102 1170; # (눼; 눼; 눼; 눼; 눼; ) HANGUL SYLLABLE NWE +B23D;B23D;1102 1170 11A8;B23D;1102 1170 11A8; # (눽; 눽; 눽; 눽; 눽; ) HANGUL SYLLABLE NWEG +B23E;B23E;1102 1170 11A9;B23E;1102 1170 11A9; # (눾; 눾; 눾; 눾; 눾; ) HANGUL SYLLABLE NWEGG +B23F;B23F;1102 1170 11AA;B23F;1102 1170 11AA; # (눿; 눿; 눿; 눿; 눿; ) HANGUL SYLLABLE NWEGS +B240;B240;1102 1170 11AB;B240;1102 1170 11AB; # (뉀; 뉀; 뉀; 뉀; 뉀; ) HANGUL SYLLABLE NWEN +B241;B241;1102 1170 11AC;B241;1102 1170 11AC; # (뉁; 뉁; 뉁; 뉁; 뉁; ) HANGUL SYLLABLE NWENJ +B242;B242;1102 1170 11AD;B242;1102 1170 11AD; # (뉂; 뉂; 뉂; 뉂; 뉂; ) HANGUL SYLLABLE NWENH +B243;B243;1102 1170 11AE;B243;1102 1170 11AE; # (뉃; 뉃; 뉃; 뉃; 뉃; ) HANGUL SYLLABLE NWED +B244;B244;1102 1170 11AF;B244;1102 1170 11AF; # (뉄; 뉄; 뉄; 뉄; 뉄; ) HANGUL SYLLABLE NWEL +B245;B245;1102 1170 11B0;B245;1102 1170 11B0; # (뉅; 뉅; 뉅; 뉅; 뉅; ) HANGUL SYLLABLE NWELG +B246;B246;1102 1170 11B1;B246;1102 1170 11B1; # (뉆; 뉆; 뉆; 뉆; 뉆; ) HANGUL SYLLABLE NWELM +B247;B247;1102 1170 11B2;B247;1102 1170 11B2; # (뉇; 뉇; 뉇; 뉇; 뉇; ) HANGUL SYLLABLE NWELB +B248;B248;1102 1170 11B3;B248;1102 1170 11B3; # (뉈; 뉈; 뉈; 뉈; 뉈; ) HANGUL SYLLABLE NWELS +B249;B249;1102 1170 11B4;B249;1102 1170 11B4; # (뉉; 뉉; 뉉; 뉉; 뉉; ) HANGUL SYLLABLE NWELT +B24A;B24A;1102 1170 11B5;B24A;1102 1170 11B5; # (뉊; 뉊; 뉊; 뉊; 뉊; ) HANGUL SYLLABLE NWELP +B24B;B24B;1102 1170 11B6;B24B;1102 1170 11B6; # (뉋; 뉋; 뉋; 뉋; 뉋; ) HANGUL SYLLABLE NWELH +B24C;B24C;1102 1170 11B7;B24C;1102 1170 11B7; # (뉌; 뉌; 뉌; 뉌; 뉌; ) HANGUL SYLLABLE NWEM +B24D;B24D;1102 1170 11B8;B24D;1102 1170 11B8; # (뉍; 뉍; 뉍; 뉍; 뉍; ) HANGUL SYLLABLE NWEB +B24E;B24E;1102 1170 11B9;B24E;1102 1170 11B9; # (뉎; 뉎; 뉎; 뉎; 뉎; ) HANGUL SYLLABLE NWEBS +B24F;B24F;1102 1170 11BA;B24F;1102 1170 11BA; # (뉏; 뉏; 뉏; 뉏; 뉏; ) HANGUL SYLLABLE NWES +B250;B250;1102 1170 11BB;B250;1102 1170 11BB; # (뉐; 뉐; 뉐; 뉐; 뉐; ) HANGUL SYLLABLE NWESS +B251;B251;1102 1170 11BC;B251;1102 1170 11BC; # (뉑; 뉑; 뉑; 뉑; 뉑; ) HANGUL SYLLABLE NWENG +B252;B252;1102 1170 11BD;B252;1102 1170 11BD; # (뉒; 뉒; 뉒; 뉒; 뉒; ) HANGUL SYLLABLE NWEJ +B253;B253;1102 1170 11BE;B253;1102 1170 11BE; # (뉓; 뉓; 뉓; 뉓; 뉓; ) HANGUL SYLLABLE NWEC +B254;B254;1102 1170 11BF;B254;1102 1170 11BF; # (뉔; 뉔; 뉔; 뉔; 뉔; ) HANGUL SYLLABLE NWEK +B255;B255;1102 1170 11C0;B255;1102 1170 11C0; # (뉕; 뉕; 뉕; 뉕; 뉕; ) HANGUL SYLLABLE NWET +B256;B256;1102 1170 11C1;B256;1102 1170 11C1; # (뉖; 뉖; 뉖; 뉖; 뉖; ) HANGUL SYLLABLE NWEP +B257;B257;1102 1170 11C2;B257;1102 1170 11C2; # (뉗; 뉗; 뉗; 뉗; 뉗; ) HANGUL SYLLABLE NWEH +B258;B258;1102 1171;B258;1102 1171; # (뉘; 뉘; 뉘; 뉘; 뉘; ) HANGUL SYLLABLE NWI +B259;B259;1102 1171 11A8;B259;1102 1171 11A8; # (뉙; 뉙; 뉙; 뉙; 뉙; ) HANGUL SYLLABLE NWIG +B25A;B25A;1102 1171 11A9;B25A;1102 1171 11A9; # (뉚; 뉚; 뉚; 뉚; 뉚; ) HANGUL SYLLABLE NWIGG +B25B;B25B;1102 1171 11AA;B25B;1102 1171 11AA; # (뉛; 뉛; 뉛; 뉛; 뉛; ) HANGUL SYLLABLE NWIGS +B25C;B25C;1102 1171 11AB;B25C;1102 1171 11AB; # (뉜; 뉜; 뉜; 뉜; 뉜; ) HANGUL SYLLABLE NWIN +B25D;B25D;1102 1171 11AC;B25D;1102 1171 11AC; # (뉝; 뉝; 뉝; 뉝; 뉝; ) HANGUL SYLLABLE NWINJ +B25E;B25E;1102 1171 11AD;B25E;1102 1171 11AD; # (뉞; 뉞; 뉞; 뉞; 뉞; ) HANGUL SYLLABLE NWINH +B25F;B25F;1102 1171 11AE;B25F;1102 1171 11AE; # (뉟; 뉟; 뉟; 뉟; 뉟; ) HANGUL SYLLABLE NWID +B260;B260;1102 1171 11AF;B260;1102 1171 11AF; # (뉠; 뉠; 뉠; 뉠; 뉠; ) HANGUL SYLLABLE NWIL +B261;B261;1102 1171 11B0;B261;1102 1171 11B0; # (뉡; 뉡; 뉡; 뉡; 뉡; ) HANGUL SYLLABLE NWILG +B262;B262;1102 1171 11B1;B262;1102 1171 11B1; # (뉢; 뉢; 뉢; 뉢; 뉢; ) HANGUL SYLLABLE NWILM +B263;B263;1102 1171 11B2;B263;1102 1171 11B2; # (뉣; 뉣; 뉣; 뉣; 뉣; ) HANGUL SYLLABLE NWILB +B264;B264;1102 1171 11B3;B264;1102 1171 11B3; # (뉤; 뉤; 뉤; 뉤; 뉤; ) HANGUL SYLLABLE NWILS +B265;B265;1102 1171 11B4;B265;1102 1171 11B4; # (뉥; 뉥; 뉥; 뉥; 뉥; ) HANGUL SYLLABLE NWILT +B266;B266;1102 1171 11B5;B266;1102 1171 11B5; # (뉦; 뉦; 뉦; 뉦; 뉦; ) HANGUL SYLLABLE NWILP +B267;B267;1102 1171 11B6;B267;1102 1171 11B6; # (뉧; 뉧; 뉧; 뉧; 뉧; ) HANGUL SYLLABLE NWILH +B268;B268;1102 1171 11B7;B268;1102 1171 11B7; # (뉨; 뉨; 뉨; 뉨; 뉨; ) HANGUL SYLLABLE NWIM +B269;B269;1102 1171 11B8;B269;1102 1171 11B8; # (뉩; 뉩; 뉩; 뉩; 뉩; ) HANGUL SYLLABLE NWIB +B26A;B26A;1102 1171 11B9;B26A;1102 1171 11B9; # (뉪; 뉪; 뉪; 뉪; 뉪; ) HANGUL SYLLABLE NWIBS +B26B;B26B;1102 1171 11BA;B26B;1102 1171 11BA; # (뉫; 뉫; 뉫; 뉫; 뉫; ) HANGUL SYLLABLE NWIS +B26C;B26C;1102 1171 11BB;B26C;1102 1171 11BB; # (뉬; 뉬; 뉬; 뉬; 뉬; ) HANGUL SYLLABLE NWISS +B26D;B26D;1102 1171 11BC;B26D;1102 1171 11BC; # (뉭; 뉭; 뉭; 뉭; 뉭; ) HANGUL SYLLABLE NWING +B26E;B26E;1102 1171 11BD;B26E;1102 1171 11BD; # (뉮; 뉮; 뉮; 뉮; 뉮; ) HANGUL SYLLABLE NWIJ +B26F;B26F;1102 1171 11BE;B26F;1102 1171 11BE; # (뉯; 뉯; 뉯; 뉯; 뉯; ) HANGUL SYLLABLE NWIC +B270;B270;1102 1171 11BF;B270;1102 1171 11BF; # (뉰; 뉰; 뉰; 뉰; 뉰; ) HANGUL SYLLABLE NWIK +B271;B271;1102 1171 11C0;B271;1102 1171 11C0; # (뉱; 뉱; 뉱; 뉱; 뉱; ) HANGUL SYLLABLE NWIT +B272;B272;1102 1171 11C1;B272;1102 1171 11C1; # (뉲; 뉲; 뉲; 뉲; 뉲; ) HANGUL SYLLABLE NWIP +B273;B273;1102 1171 11C2;B273;1102 1171 11C2; # (뉳; 뉳; 뉳; 뉳; 뉳; ) HANGUL SYLLABLE NWIH +B274;B274;1102 1172;B274;1102 1172; # (뉴; 뉴; 뉴; 뉴; 뉴; ) HANGUL SYLLABLE NYU +B275;B275;1102 1172 11A8;B275;1102 1172 11A8; # (뉵; 뉵; 뉵; 뉵; 뉵; ) HANGUL SYLLABLE NYUG +B276;B276;1102 1172 11A9;B276;1102 1172 11A9; # (뉶; 뉶; 뉶; 뉶; 뉶; ) HANGUL SYLLABLE NYUGG +B277;B277;1102 1172 11AA;B277;1102 1172 11AA; # (뉷; 뉷; 뉷; 뉷; 뉷; ) HANGUL SYLLABLE NYUGS +B278;B278;1102 1172 11AB;B278;1102 1172 11AB; # (뉸; 뉸; 뉸; 뉸; 뉸; ) HANGUL SYLLABLE NYUN +B279;B279;1102 1172 11AC;B279;1102 1172 11AC; # (뉹; 뉹; 뉹; 뉹; 뉹; ) HANGUL SYLLABLE NYUNJ +B27A;B27A;1102 1172 11AD;B27A;1102 1172 11AD; # (뉺; 뉺; 뉺; 뉺; 뉺; ) HANGUL SYLLABLE NYUNH +B27B;B27B;1102 1172 11AE;B27B;1102 1172 11AE; # (뉻; 뉻; 뉻; 뉻; 뉻; ) HANGUL SYLLABLE NYUD +B27C;B27C;1102 1172 11AF;B27C;1102 1172 11AF; # (뉼; 뉼; 뉼; 뉼; 뉼; ) HANGUL SYLLABLE NYUL +B27D;B27D;1102 1172 11B0;B27D;1102 1172 11B0; # (뉽; 뉽; 뉽; 뉽; 뉽; ) HANGUL SYLLABLE NYULG +B27E;B27E;1102 1172 11B1;B27E;1102 1172 11B1; # (뉾; 뉾; 뉾; 뉾; 뉾; ) HANGUL SYLLABLE NYULM +B27F;B27F;1102 1172 11B2;B27F;1102 1172 11B2; # (뉿; 뉿; 뉿; 뉿; 뉿; ) HANGUL SYLLABLE NYULB +B280;B280;1102 1172 11B3;B280;1102 1172 11B3; # (늀; 늀; 늀; 늀; 늀; ) HANGUL SYLLABLE NYULS +B281;B281;1102 1172 11B4;B281;1102 1172 11B4; # (늁; 늁; 늁; 늁; 늁; ) HANGUL SYLLABLE NYULT +B282;B282;1102 1172 11B5;B282;1102 1172 11B5; # (늂; 늂; 늂; 늂; 늂; ) HANGUL SYLLABLE NYULP +B283;B283;1102 1172 11B6;B283;1102 1172 11B6; # (늃; 늃; 늃; 늃; 늃; ) HANGUL SYLLABLE NYULH +B284;B284;1102 1172 11B7;B284;1102 1172 11B7; # (늄; 늄; 늄; 늄; 늄; ) HANGUL SYLLABLE NYUM +B285;B285;1102 1172 11B8;B285;1102 1172 11B8; # (늅; 늅; 늅; 늅; 늅; ) HANGUL SYLLABLE NYUB +B286;B286;1102 1172 11B9;B286;1102 1172 11B9; # (늆; 늆; 늆; 늆; 늆; ) HANGUL SYLLABLE NYUBS +B287;B287;1102 1172 11BA;B287;1102 1172 11BA; # (늇; 늇; 늇; 늇; 늇; ) HANGUL SYLLABLE NYUS +B288;B288;1102 1172 11BB;B288;1102 1172 11BB; # (늈; 늈; 늈; 늈; 늈; ) HANGUL SYLLABLE NYUSS +B289;B289;1102 1172 11BC;B289;1102 1172 11BC; # (늉; 늉; 늉; 늉; 늉; ) HANGUL SYLLABLE NYUNG +B28A;B28A;1102 1172 11BD;B28A;1102 1172 11BD; # (늊; 늊; 늊; 늊; 늊; ) HANGUL SYLLABLE NYUJ +B28B;B28B;1102 1172 11BE;B28B;1102 1172 11BE; # (늋; 늋; 늋; 늋; 늋; ) HANGUL SYLLABLE NYUC +B28C;B28C;1102 1172 11BF;B28C;1102 1172 11BF; # (늌; 늌; 늌; 늌; 늌; ) HANGUL SYLLABLE NYUK +B28D;B28D;1102 1172 11C0;B28D;1102 1172 11C0; # (늍; 늍; 늍; 늍; 늍; ) HANGUL SYLLABLE NYUT +B28E;B28E;1102 1172 11C1;B28E;1102 1172 11C1; # (늎; 늎; 늎; 늎; 늎; ) HANGUL SYLLABLE NYUP +B28F;B28F;1102 1172 11C2;B28F;1102 1172 11C2; # (늏; 늏; 늏; 늏; 늏; ) HANGUL SYLLABLE NYUH +B290;B290;1102 1173;B290;1102 1173; # (느; 느; 느; 느; 느; ) HANGUL SYLLABLE NEU +B291;B291;1102 1173 11A8;B291;1102 1173 11A8; # (늑; 늑; 늑; 늑; 늑; ) HANGUL SYLLABLE NEUG +B292;B292;1102 1173 11A9;B292;1102 1173 11A9; # (늒; 늒; 늒; 늒; 늒; ) HANGUL SYLLABLE NEUGG +B293;B293;1102 1173 11AA;B293;1102 1173 11AA; # (늓; 늓; 늓; 늓; 늓; ) HANGUL SYLLABLE NEUGS +B294;B294;1102 1173 11AB;B294;1102 1173 11AB; # (는; 는; 는; 는; 는; ) HANGUL SYLLABLE NEUN +B295;B295;1102 1173 11AC;B295;1102 1173 11AC; # (늕; 늕; 늕; 늕; 늕; ) HANGUL SYLLABLE NEUNJ +B296;B296;1102 1173 11AD;B296;1102 1173 11AD; # (늖; 늖; 늖; 늖; 늖; ) HANGUL SYLLABLE NEUNH +B297;B297;1102 1173 11AE;B297;1102 1173 11AE; # (늗; 늗; 늗; 늗; 늗; ) HANGUL SYLLABLE NEUD +B298;B298;1102 1173 11AF;B298;1102 1173 11AF; # (늘; 늘; 늘; 늘; 늘; ) HANGUL SYLLABLE NEUL +B299;B299;1102 1173 11B0;B299;1102 1173 11B0; # (늙; 늙; 늙; 늙; 늙; ) HANGUL SYLLABLE NEULG +B29A;B29A;1102 1173 11B1;B29A;1102 1173 11B1; # (늚; 늚; 늚; 늚; 늚; ) HANGUL SYLLABLE NEULM +B29B;B29B;1102 1173 11B2;B29B;1102 1173 11B2; # (늛; 늛; 늛; 늛; 늛; ) HANGUL SYLLABLE NEULB +B29C;B29C;1102 1173 11B3;B29C;1102 1173 11B3; # (늜; 늜; 늜; 늜; 늜; ) HANGUL SYLLABLE NEULS +B29D;B29D;1102 1173 11B4;B29D;1102 1173 11B4; # (늝; 늝; 늝; 늝; 늝; ) HANGUL SYLLABLE NEULT +B29E;B29E;1102 1173 11B5;B29E;1102 1173 11B5; # (늞; 늞; 늞; 늞; 늞; ) HANGUL SYLLABLE NEULP +B29F;B29F;1102 1173 11B6;B29F;1102 1173 11B6; # (늟; 늟; 늟; 늟; 늟; ) HANGUL SYLLABLE NEULH +B2A0;B2A0;1102 1173 11B7;B2A0;1102 1173 11B7; # (늠; 늠; 늠; 늠; 늠; ) HANGUL SYLLABLE NEUM +B2A1;B2A1;1102 1173 11B8;B2A1;1102 1173 11B8; # (늡; 늡; 늡; 늡; 늡; ) HANGUL SYLLABLE NEUB +B2A2;B2A2;1102 1173 11B9;B2A2;1102 1173 11B9; # (늢; 늢; 늢; 늢; 늢; ) HANGUL SYLLABLE NEUBS +B2A3;B2A3;1102 1173 11BA;B2A3;1102 1173 11BA; # (늣; 늣; 늣; 늣; 늣; ) HANGUL SYLLABLE NEUS +B2A4;B2A4;1102 1173 11BB;B2A4;1102 1173 11BB; # (늤; 늤; 늤; 늤; 늤; ) HANGUL SYLLABLE NEUSS +B2A5;B2A5;1102 1173 11BC;B2A5;1102 1173 11BC; # (능; 능; 능; 능; 능; ) HANGUL SYLLABLE NEUNG +B2A6;B2A6;1102 1173 11BD;B2A6;1102 1173 11BD; # (늦; 늦; 늦; 늦; 늦; ) HANGUL SYLLABLE NEUJ +B2A7;B2A7;1102 1173 11BE;B2A7;1102 1173 11BE; # (늧; 늧; 늧; 늧; 늧; ) HANGUL SYLLABLE NEUC +B2A8;B2A8;1102 1173 11BF;B2A8;1102 1173 11BF; # (늨; 늨; 늨; 늨; 늨; ) HANGUL SYLLABLE NEUK +B2A9;B2A9;1102 1173 11C0;B2A9;1102 1173 11C0; # (늩; 늩; 늩; 늩; 늩; ) HANGUL SYLLABLE NEUT +B2AA;B2AA;1102 1173 11C1;B2AA;1102 1173 11C1; # (늪; 늪; 늪; 늪; 늪; ) HANGUL SYLLABLE NEUP +B2AB;B2AB;1102 1173 11C2;B2AB;1102 1173 11C2; # (늫; 늫; 늫; 늫; 늫; ) HANGUL SYLLABLE NEUH +B2AC;B2AC;1102 1174;B2AC;1102 1174; # (늬; 늬; 늬; 늬; 늬; ) HANGUL SYLLABLE NYI +B2AD;B2AD;1102 1174 11A8;B2AD;1102 1174 11A8; # (늭; 늭; 늭; 늭; 늭; ) HANGUL SYLLABLE NYIG +B2AE;B2AE;1102 1174 11A9;B2AE;1102 1174 11A9; # (늮; 늮; 늮; 늮; 늮; ) HANGUL SYLLABLE NYIGG +B2AF;B2AF;1102 1174 11AA;B2AF;1102 1174 11AA; # (늯; 늯; 늯; 늯; 늯; ) HANGUL SYLLABLE NYIGS +B2B0;B2B0;1102 1174 11AB;B2B0;1102 1174 11AB; # (늰; 늰; 늰; 늰; 늰; ) HANGUL SYLLABLE NYIN +B2B1;B2B1;1102 1174 11AC;B2B1;1102 1174 11AC; # (늱; 늱; 늱; 늱; 늱; ) HANGUL SYLLABLE NYINJ +B2B2;B2B2;1102 1174 11AD;B2B2;1102 1174 11AD; # (늲; 늲; 늲; 늲; 늲; ) HANGUL SYLLABLE NYINH +B2B3;B2B3;1102 1174 11AE;B2B3;1102 1174 11AE; # (늳; 늳; 늳; 늳; 늳; ) HANGUL SYLLABLE NYID +B2B4;B2B4;1102 1174 11AF;B2B4;1102 1174 11AF; # (늴; 늴; 늴; 늴; 늴; ) HANGUL SYLLABLE NYIL +B2B5;B2B5;1102 1174 11B0;B2B5;1102 1174 11B0; # (늵; 늵; 늵; 늵; 늵; ) HANGUL SYLLABLE NYILG +B2B6;B2B6;1102 1174 11B1;B2B6;1102 1174 11B1; # (늶; 늶; 늶; 늶; 늶; ) HANGUL SYLLABLE NYILM +B2B7;B2B7;1102 1174 11B2;B2B7;1102 1174 11B2; # (늷; 늷; 늷; 늷; 늷; ) HANGUL SYLLABLE NYILB +B2B8;B2B8;1102 1174 11B3;B2B8;1102 1174 11B3; # (늸; 늸; 늸; 늸; 늸; ) HANGUL SYLLABLE NYILS +B2B9;B2B9;1102 1174 11B4;B2B9;1102 1174 11B4; # (늹; 늹; 늹; 늹; 늹; ) HANGUL SYLLABLE NYILT +B2BA;B2BA;1102 1174 11B5;B2BA;1102 1174 11B5; # (늺; 늺; 늺; 늺; 늺; ) HANGUL SYLLABLE NYILP +B2BB;B2BB;1102 1174 11B6;B2BB;1102 1174 11B6; # (늻; 늻; 늻; 늻; 늻; ) HANGUL SYLLABLE NYILH +B2BC;B2BC;1102 1174 11B7;B2BC;1102 1174 11B7; # (늼; 늼; 늼; 늼; 늼; ) HANGUL SYLLABLE NYIM +B2BD;B2BD;1102 1174 11B8;B2BD;1102 1174 11B8; # (늽; 늽; 늽; 늽; 늽; ) HANGUL SYLLABLE NYIB +B2BE;B2BE;1102 1174 11B9;B2BE;1102 1174 11B9; # (늾; 늾; 늾; 늾; 늾; ) HANGUL SYLLABLE NYIBS +B2BF;B2BF;1102 1174 11BA;B2BF;1102 1174 11BA; # (늿; 늿; 늿; 늿; 늿; ) HANGUL SYLLABLE NYIS +B2C0;B2C0;1102 1174 11BB;B2C0;1102 1174 11BB; # (닀; 닀; 닀; 닀; 닀; ) HANGUL SYLLABLE NYISS +B2C1;B2C1;1102 1174 11BC;B2C1;1102 1174 11BC; # (닁; 닁; 닁; 닁; 닁; ) HANGUL SYLLABLE NYING +B2C2;B2C2;1102 1174 11BD;B2C2;1102 1174 11BD; # (닂; 닂; 닂; 닂; 닂; ) HANGUL SYLLABLE NYIJ +B2C3;B2C3;1102 1174 11BE;B2C3;1102 1174 11BE; # (닃; 닃; 닃; 닃; 닃; ) HANGUL SYLLABLE NYIC +B2C4;B2C4;1102 1174 11BF;B2C4;1102 1174 11BF; # (닄; 닄; 닄; 닄; 닄; ) HANGUL SYLLABLE NYIK +B2C5;B2C5;1102 1174 11C0;B2C5;1102 1174 11C0; # (닅; 닅; 닅; 닅; 닅; ) HANGUL SYLLABLE NYIT +B2C6;B2C6;1102 1174 11C1;B2C6;1102 1174 11C1; # (닆; 닆; 닆; 닆; 닆; ) HANGUL SYLLABLE NYIP +B2C7;B2C7;1102 1174 11C2;B2C7;1102 1174 11C2; # (닇; 닇; 닇; 닇; 닇; ) HANGUL SYLLABLE NYIH +B2C8;B2C8;1102 1175;B2C8;1102 1175; # (니; 니; 니; 니; 니; ) HANGUL SYLLABLE NI +B2C9;B2C9;1102 1175 11A8;B2C9;1102 1175 11A8; # (닉; 닉; 닉; 닉; 닉; ) HANGUL SYLLABLE NIG +B2CA;B2CA;1102 1175 11A9;B2CA;1102 1175 11A9; # (닊; 닊; 닊; 닊; 닊; ) HANGUL SYLLABLE NIGG +B2CB;B2CB;1102 1175 11AA;B2CB;1102 1175 11AA; # (닋; 닋; 닋; 닋; 닋; ) HANGUL SYLLABLE NIGS +B2CC;B2CC;1102 1175 11AB;B2CC;1102 1175 11AB; # (닌; 닌; 닌; 닌; 닌; ) HANGUL SYLLABLE NIN +B2CD;B2CD;1102 1175 11AC;B2CD;1102 1175 11AC; # (닍; 닍; 닍; 닍; 닍; ) HANGUL SYLLABLE NINJ +B2CE;B2CE;1102 1175 11AD;B2CE;1102 1175 11AD; # (닎; 닎; 닎; 닎; 닎; ) HANGUL SYLLABLE NINH +B2CF;B2CF;1102 1175 11AE;B2CF;1102 1175 11AE; # (닏; 닏; 닏; 닏; 닏; ) HANGUL SYLLABLE NID +B2D0;B2D0;1102 1175 11AF;B2D0;1102 1175 11AF; # (닐; 닐; 닐; 닐; 닐; ) HANGUL SYLLABLE NIL +B2D1;B2D1;1102 1175 11B0;B2D1;1102 1175 11B0; # (닑; 닑; 닑; 닑; 닑; ) HANGUL SYLLABLE NILG +B2D2;B2D2;1102 1175 11B1;B2D2;1102 1175 11B1; # (닒; 닒; 닒; 닒; 닒; ) HANGUL SYLLABLE NILM +B2D3;B2D3;1102 1175 11B2;B2D3;1102 1175 11B2; # (닓; 닓; 닓; 닓; 닓; ) HANGUL SYLLABLE NILB +B2D4;B2D4;1102 1175 11B3;B2D4;1102 1175 11B3; # (닔; 닔; 닔; 닔; 닔; ) HANGUL SYLLABLE NILS +B2D5;B2D5;1102 1175 11B4;B2D5;1102 1175 11B4; # (닕; 닕; 닕; 닕; 닕; ) HANGUL SYLLABLE NILT +B2D6;B2D6;1102 1175 11B5;B2D6;1102 1175 11B5; # (닖; 닖; 닖; 닖; 닖; ) HANGUL SYLLABLE NILP +B2D7;B2D7;1102 1175 11B6;B2D7;1102 1175 11B6; # (닗; 닗; 닗; 닗; 닗; ) HANGUL SYLLABLE NILH +B2D8;B2D8;1102 1175 11B7;B2D8;1102 1175 11B7; # (님; 님; 님; 님; 님; ) HANGUL SYLLABLE NIM +B2D9;B2D9;1102 1175 11B8;B2D9;1102 1175 11B8; # (닙; 닙; 닙; 닙; 닙; ) HANGUL SYLLABLE NIB +B2DA;B2DA;1102 1175 11B9;B2DA;1102 1175 11B9; # (닚; 닚; 닚; 닚; 닚; ) HANGUL SYLLABLE NIBS +B2DB;B2DB;1102 1175 11BA;B2DB;1102 1175 11BA; # (닛; 닛; 닛; 닛; 닛; ) HANGUL SYLLABLE NIS +B2DC;B2DC;1102 1175 11BB;B2DC;1102 1175 11BB; # (닜; 닜; 닜; 닜; 닜; ) HANGUL SYLLABLE NISS +B2DD;B2DD;1102 1175 11BC;B2DD;1102 1175 11BC; # (닝; 닝; 닝; 닝; 닝; ) HANGUL SYLLABLE NING +B2DE;B2DE;1102 1175 11BD;B2DE;1102 1175 11BD; # (닞; 닞; 닞; 닞; 닞; ) HANGUL SYLLABLE NIJ +B2DF;B2DF;1102 1175 11BE;B2DF;1102 1175 11BE; # (닟; 닟; 닟; 닟; 닟; ) HANGUL SYLLABLE NIC +B2E0;B2E0;1102 1175 11BF;B2E0;1102 1175 11BF; # (닠; 닠; 닠; 닠; 닠; ) HANGUL SYLLABLE NIK +B2E1;B2E1;1102 1175 11C0;B2E1;1102 1175 11C0; # (닡; 닡; 닡; 닡; 닡; ) HANGUL SYLLABLE NIT +B2E2;B2E2;1102 1175 11C1;B2E2;1102 1175 11C1; # (닢; 닢; 닢; 닢; 닢; ) HANGUL SYLLABLE NIP +B2E3;B2E3;1102 1175 11C2;B2E3;1102 1175 11C2; # (닣; 닣; 닣; 닣; 닣; ) HANGUL SYLLABLE NIH +B2E4;B2E4;1103 1161;B2E4;1103 1161; # (다; 다; 다; 다; 다; ) HANGUL SYLLABLE DA +B2E5;B2E5;1103 1161 11A8;B2E5;1103 1161 11A8; # (닥; 닥; 닥; 닥; 닥; ) HANGUL SYLLABLE DAG +B2E6;B2E6;1103 1161 11A9;B2E6;1103 1161 11A9; # (닦; 닦; 닦; 닦; 닦; ) HANGUL SYLLABLE DAGG +B2E7;B2E7;1103 1161 11AA;B2E7;1103 1161 11AA; # (닧; 닧; 닧; 닧; 닧; ) HANGUL SYLLABLE DAGS +B2E8;B2E8;1103 1161 11AB;B2E8;1103 1161 11AB; # (단; 단; 단; 단; 단; ) HANGUL SYLLABLE DAN +B2E9;B2E9;1103 1161 11AC;B2E9;1103 1161 11AC; # (닩; 닩; 닩; 닩; 닩; ) HANGUL SYLLABLE DANJ +B2EA;B2EA;1103 1161 11AD;B2EA;1103 1161 11AD; # (닪; 닪; 닪; 닪; 닪; ) HANGUL SYLLABLE DANH +B2EB;B2EB;1103 1161 11AE;B2EB;1103 1161 11AE; # (닫; 닫; 닫; 닫; 닫; ) HANGUL SYLLABLE DAD +B2EC;B2EC;1103 1161 11AF;B2EC;1103 1161 11AF; # (달; 달; 달; 달; 달; ) HANGUL SYLLABLE DAL +B2ED;B2ED;1103 1161 11B0;B2ED;1103 1161 11B0; # (닭; 닭; 닭; 닭; 닭; ) HANGUL SYLLABLE DALG +B2EE;B2EE;1103 1161 11B1;B2EE;1103 1161 11B1; # (닮; 닮; 닮; 닮; 닮; ) HANGUL SYLLABLE DALM +B2EF;B2EF;1103 1161 11B2;B2EF;1103 1161 11B2; # (닯; 닯; 닯; 닯; 닯; ) HANGUL SYLLABLE DALB +B2F0;B2F0;1103 1161 11B3;B2F0;1103 1161 11B3; # (닰; 닰; 닰; 닰; 닰; ) HANGUL SYLLABLE DALS +B2F1;B2F1;1103 1161 11B4;B2F1;1103 1161 11B4; # (닱; 닱; 닱; 닱; 닱; ) HANGUL SYLLABLE DALT +B2F2;B2F2;1103 1161 11B5;B2F2;1103 1161 11B5; # (닲; 닲; 닲; 닲; 닲; ) HANGUL SYLLABLE DALP +B2F3;B2F3;1103 1161 11B6;B2F3;1103 1161 11B6; # (닳; 닳; 닳; 닳; 닳; ) HANGUL SYLLABLE DALH +B2F4;B2F4;1103 1161 11B7;B2F4;1103 1161 11B7; # (담; 담; 담; 담; 담; ) HANGUL SYLLABLE DAM +B2F5;B2F5;1103 1161 11B8;B2F5;1103 1161 11B8; # (답; 답; 답; 답; 답; ) HANGUL SYLLABLE DAB +B2F6;B2F6;1103 1161 11B9;B2F6;1103 1161 11B9; # (닶; 닶; 닶; 닶; 닶; ) HANGUL SYLLABLE DABS +B2F7;B2F7;1103 1161 11BA;B2F7;1103 1161 11BA; # (닷; 닷; 닷; 닷; 닷; ) HANGUL SYLLABLE DAS +B2F8;B2F8;1103 1161 11BB;B2F8;1103 1161 11BB; # (닸; 닸; 닸; 닸; 닸; ) HANGUL SYLLABLE DASS +B2F9;B2F9;1103 1161 11BC;B2F9;1103 1161 11BC; # (당; 당; 당; 당; 당; ) HANGUL SYLLABLE DANG +B2FA;B2FA;1103 1161 11BD;B2FA;1103 1161 11BD; # (닺; 닺; 닺; 닺; 닺; ) HANGUL SYLLABLE DAJ +B2FB;B2FB;1103 1161 11BE;B2FB;1103 1161 11BE; # (닻; 닻; 닻; 닻; 닻; ) HANGUL SYLLABLE DAC +B2FC;B2FC;1103 1161 11BF;B2FC;1103 1161 11BF; # (닼; 닼; 닼; 닼; 닼; ) HANGUL SYLLABLE DAK +B2FD;B2FD;1103 1161 11C0;B2FD;1103 1161 11C0; # (닽; 닽; 닽; 닽; 닽; ) HANGUL SYLLABLE DAT +B2FE;B2FE;1103 1161 11C1;B2FE;1103 1161 11C1; # (닾; 닾; 닾; 닾; 닾; ) HANGUL SYLLABLE DAP +B2FF;B2FF;1103 1161 11C2;B2FF;1103 1161 11C2; # (닿; 닿; 닿; 닿; 닿; ) HANGUL SYLLABLE DAH +B300;B300;1103 1162;B300;1103 1162; # (대; 대; 대; 대; 대; ) HANGUL SYLLABLE DAE +B301;B301;1103 1162 11A8;B301;1103 1162 11A8; # (댁; 댁; 댁; 댁; 댁; ) HANGUL SYLLABLE DAEG +B302;B302;1103 1162 11A9;B302;1103 1162 11A9; # (댂; 댂; 댂; 댂; 댂; ) HANGUL SYLLABLE DAEGG +B303;B303;1103 1162 11AA;B303;1103 1162 11AA; # (댃; 댃; 댃; 댃; 댃; ) HANGUL SYLLABLE DAEGS +B304;B304;1103 1162 11AB;B304;1103 1162 11AB; # (댄; 댄; 댄; 댄; 댄; ) HANGUL SYLLABLE DAEN +B305;B305;1103 1162 11AC;B305;1103 1162 11AC; # (댅; 댅; 댅; 댅; 댅; ) HANGUL SYLLABLE DAENJ +B306;B306;1103 1162 11AD;B306;1103 1162 11AD; # (댆; 댆; 댆; 댆; 댆; ) HANGUL SYLLABLE DAENH +B307;B307;1103 1162 11AE;B307;1103 1162 11AE; # (댇; 댇; 댇; 댇; 댇; ) HANGUL SYLLABLE DAED +B308;B308;1103 1162 11AF;B308;1103 1162 11AF; # (댈; 댈; 댈; 댈; 댈; ) HANGUL SYLLABLE DAEL +B309;B309;1103 1162 11B0;B309;1103 1162 11B0; # (댉; 댉; 댉; 댉; 댉; ) HANGUL SYLLABLE DAELG +B30A;B30A;1103 1162 11B1;B30A;1103 1162 11B1; # (댊; 댊; 댊; 댊; 댊; ) HANGUL SYLLABLE DAELM +B30B;B30B;1103 1162 11B2;B30B;1103 1162 11B2; # (댋; 댋; 댋; 댋; 댋; ) HANGUL SYLLABLE DAELB +B30C;B30C;1103 1162 11B3;B30C;1103 1162 11B3; # (댌; 댌; 댌; 댌; 댌; ) HANGUL SYLLABLE DAELS +B30D;B30D;1103 1162 11B4;B30D;1103 1162 11B4; # (댍; 댍; 댍; 댍; 댍; ) HANGUL SYLLABLE DAELT +B30E;B30E;1103 1162 11B5;B30E;1103 1162 11B5; # (댎; 댎; 댎; 댎; 댎; ) HANGUL SYLLABLE DAELP +B30F;B30F;1103 1162 11B6;B30F;1103 1162 11B6; # (댏; 댏; 댏; 댏; 댏; ) HANGUL SYLLABLE DAELH +B310;B310;1103 1162 11B7;B310;1103 1162 11B7; # (댐; 댐; 댐; 댐; 댐; ) HANGUL SYLLABLE DAEM +B311;B311;1103 1162 11B8;B311;1103 1162 11B8; # (댑; 댑; 댑; 댑; 댑; ) HANGUL SYLLABLE DAEB +B312;B312;1103 1162 11B9;B312;1103 1162 11B9; # (댒; 댒; 댒; 댒; 댒; ) HANGUL SYLLABLE DAEBS +B313;B313;1103 1162 11BA;B313;1103 1162 11BA; # (댓; 댓; 댓; 댓; 댓; ) HANGUL SYLLABLE DAES +B314;B314;1103 1162 11BB;B314;1103 1162 11BB; # (댔; 댔; 댔; 댔; 댔; ) HANGUL SYLLABLE DAESS +B315;B315;1103 1162 11BC;B315;1103 1162 11BC; # (댕; 댕; 댕; 댕; 댕; ) HANGUL SYLLABLE DAENG +B316;B316;1103 1162 11BD;B316;1103 1162 11BD; # (댖; 댖; 댖; 댖; 댖; ) HANGUL SYLLABLE DAEJ +B317;B317;1103 1162 11BE;B317;1103 1162 11BE; # (댗; 댗; 댗; 댗; 댗; ) HANGUL SYLLABLE DAEC +B318;B318;1103 1162 11BF;B318;1103 1162 11BF; # (댘; 댘; 댘; 댘; 댘; ) HANGUL SYLLABLE DAEK +B319;B319;1103 1162 11C0;B319;1103 1162 11C0; # (댙; 댙; 댙; 댙; 댙; ) HANGUL SYLLABLE DAET +B31A;B31A;1103 1162 11C1;B31A;1103 1162 11C1; # (댚; 댚; 댚; 댚; 댚; ) HANGUL SYLLABLE DAEP +B31B;B31B;1103 1162 11C2;B31B;1103 1162 11C2; # (댛; 댛; 댛; 댛; 댛; ) HANGUL SYLLABLE DAEH +B31C;B31C;1103 1163;B31C;1103 1163; # (댜; 댜; 댜; 댜; 댜; ) HANGUL SYLLABLE DYA +B31D;B31D;1103 1163 11A8;B31D;1103 1163 11A8; # (댝; 댝; 댝; 댝; 댝; ) HANGUL SYLLABLE DYAG +B31E;B31E;1103 1163 11A9;B31E;1103 1163 11A9; # (댞; 댞; 댞; 댞; 댞; ) HANGUL SYLLABLE DYAGG +B31F;B31F;1103 1163 11AA;B31F;1103 1163 11AA; # (댟; 댟; 댟; 댟; 댟; ) HANGUL SYLLABLE DYAGS +B320;B320;1103 1163 11AB;B320;1103 1163 11AB; # (댠; 댠; 댠; 댠; 댠; ) HANGUL SYLLABLE DYAN +B321;B321;1103 1163 11AC;B321;1103 1163 11AC; # (댡; 댡; 댡; 댡; 댡; ) HANGUL SYLLABLE DYANJ +B322;B322;1103 1163 11AD;B322;1103 1163 11AD; # (댢; 댢; 댢; 댢; 댢; ) HANGUL SYLLABLE DYANH +B323;B323;1103 1163 11AE;B323;1103 1163 11AE; # (댣; 댣; 댣; 댣; 댣; ) HANGUL SYLLABLE DYAD +B324;B324;1103 1163 11AF;B324;1103 1163 11AF; # (댤; 댤; 댤; 댤; 댤; ) HANGUL SYLLABLE DYAL +B325;B325;1103 1163 11B0;B325;1103 1163 11B0; # (댥; 댥; 댥; 댥; 댥; ) HANGUL SYLLABLE DYALG +B326;B326;1103 1163 11B1;B326;1103 1163 11B1; # (댦; 댦; 댦; 댦; 댦; ) HANGUL SYLLABLE DYALM +B327;B327;1103 1163 11B2;B327;1103 1163 11B2; # (댧; 댧; 댧; 댧; 댧; ) HANGUL SYLLABLE DYALB +B328;B328;1103 1163 11B3;B328;1103 1163 11B3; # (댨; 댨; 댨; 댨; 댨; ) HANGUL SYLLABLE DYALS +B329;B329;1103 1163 11B4;B329;1103 1163 11B4; # (댩; 댩; 댩; 댩; 댩; ) HANGUL SYLLABLE DYALT +B32A;B32A;1103 1163 11B5;B32A;1103 1163 11B5; # (댪; 댪; 댪; 댪; 댪; ) HANGUL SYLLABLE DYALP +B32B;B32B;1103 1163 11B6;B32B;1103 1163 11B6; # (댫; 댫; 댫; 댫; 댫; ) HANGUL SYLLABLE DYALH +B32C;B32C;1103 1163 11B7;B32C;1103 1163 11B7; # (댬; 댬; 댬; 댬; 댬; ) HANGUL SYLLABLE DYAM +B32D;B32D;1103 1163 11B8;B32D;1103 1163 11B8; # (댭; 댭; 댭; 댭; 댭; ) HANGUL SYLLABLE DYAB +B32E;B32E;1103 1163 11B9;B32E;1103 1163 11B9; # (댮; 댮; 댮; 댮; 댮; ) HANGUL SYLLABLE DYABS +B32F;B32F;1103 1163 11BA;B32F;1103 1163 11BA; # (댯; 댯; 댯; 댯; 댯; ) HANGUL SYLLABLE DYAS +B330;B330;1103 1163 11BB;B330;1103 1163 11BB; # (댰; 댰; 댰; 댰; 댰; ) HANGUL SYLLABLE DYASS +B331;B331;1103 1163 11BC;B331;1103 1163 11BC; # (댱; 댱; 댱; 댱; 댱; ) HANGUL SYLLABLE DYANG +B332;B332;1103 1163 11BD;B332;1103 1163 11BD; # (댲; 댲; 댲; 댲; 댲; ) HANGUL SYLLABLE DYAJ +B333;B333;1103 1163 11BE;B333;1103 1163 11BE; # (댳; 댳; 댳; 댳; 댳; ) HANGUL SYLLABLE DYAC +B334;B334;1103 1163 11BF;B334;1103 1163 11BF; # (댴; 댴; 댴; 댴; 댴; ) HANGUL SYLLABLE DYAK +B335;B335;1103 1163 11C0;B335;1103 1163 11C0; # (댵; 댵; 댵; 댵; 댵; ) HANGUL SYLLABLE DYAT +B336;B336;1103 1163 11C1;B336;1103 1163 11C1; # (댶; 댶; 댶; 댶; 댶; ) HANGUL SYLLABLE DYAP +B337;B337;1103 1163 11C2;B337;1103 1163 11C2; # (댷; 댷; 댷; 댷; 댷; ) HANGUL SYLLABLE DYAH +B338;B338;1103 1164;B338;1103 1164; # (댸; 댸; 댸; 댸; 댸; ) HANGUL SYLLABLE DYAE +B339;B339;1103 1164 11A8;B339;1103 1164 11A8; # (댹; 댹; 댹; 댹; 댹; ) HANGUL SYLLABLE DYAEG +B33A;B33A;1103 1164 11A9;B33A;1103 1164 11A9; # (댺; 댺; 댺; 댺; 댺; ) HANGUL SYLLABLE DYAEGG +B33B;B33B;1103 1164 11AA;B33B;1103 1164 11AA; # (댻; 댻; 댻; 댻; 댻; ) HANGUL SYLLABLE DYAEGS +B33C;B33C;1103 1164 11AB;B33C;1103 1164 11AB; # (댼; 댼; 댼; 댼; 댼; ) HANGUL SYLLABLE DYAEN +B33D;B33D;1103 1164 11AC;B33D;1103 1164 11AC; # (댽; 댽; 댽; 댽; 댽; ) HANGUL SYLLABLE DYAENJ +B33E;B33E;1103 1164 11AD;B33E;1103 1164 11AD; # (댾; 댾; 댾; 댾; 댾; ) HANGUL SYLLABLE DYAENH +B33F;B33F;1103 1164 11AE;B33F;1103 1164 11AE; # (댿; 댿; 댿; 댿; 댿; ) HANGUL SYLLABLE DYAED +B340;B340;1103 1164 11AF;B340;1103 1164 11AF; # (덀; 덀; 덀; 덀; 덀; ) HANGUL SYLLABLE DYAEL +B341;B341;1103 1164 11B0;B341;1103 1164 11B0; # (덁; 덁; 덁; 덁; 덁; ) HANGUL SYLLABLE DYAELG +B342;B342;1103 1164 11B1;B342;1103 1164 11B1; # (덂; 덂; 덂; 덂; 덂; ) HANGUL SYLLABLE DYAELM +B343;B343;1103 1164 11B2;B343;1103 1164 11B2; # (덃; 덃; 덃; 덃; 덃; ) HANGUL SYLLABLE DYAELB +B344;B344;1103 1164 11B3;B344;1103 1164 11B3; # (덄; 덄; 덄; 덄; 덄; ) HANGUL SYLLABLE DYAELS +B345;B345;1103 1164 11B4;B345;1103 1164 11B4; # (덅; 덅; 덅; 덅; 덅; ) HANGUL SYLLABLE DYAELT +B346;B346;1103 1164 11B5;B346;1103 1164 11B5; # (덆; 덆; 덆; 덆; 덆; ) HANGUL SYLLABLE DYAELP +B347;B347;1103 1164 11B6;B347;1103 1164 11B6; # (덇; 덇; 덇; 덇; 덇; ) HANGUL SYLLABLE DYAELH +B348;B348;1103 1164 11B7;B348;1103 1164 11B7; # (덈; 덈; 덈; 덈; 덈; ) HANGUL SYLLABLE DYAEM +B349;B349;1103 1164 11B8;B349;1103 1164 11B8; # (덉; 덉; 덉; 덉; 덉; ) HANGUL SYLLABLE DYAEB +B34A;B34A;1103 1164 11B9;B34A;1103 1164 11B9; # (덊; 덊; 덊; 덊; 덊; ) HANGUL SYLLABLE DYAEBS +B34B;B34B;1103 1164 11BA;B34B;1103 1164 11BA; # (덋; 덋; 덋; 덋; 덋; ) HANGUL SYLLABLE DYAES +B34C;B34C;1103 1164 11BB;B34C;1103 1164 11BB; # (덌; 덌; 덌; 덌; 덌; ) HANGUL SYLLABLE DYAESS +B34D;B34D;1103 1164 11BC;B34D;1103 1164 11BC; # (덍; 덍; 덍; 덍; 덍; ) HANGUL SYLLABLE DYAENG +B34E;B34E;1103 1164 11BD;B34E;1103 1164 11BD; # (덎; 덎; 덎; 덎; 덎; ) HANGUL SYLLABLE DYAEJ +B34F;B34F;1103 1164 11BE;B34F;1103 1164 11BE; # (덏; 덏; 덏; 덏; 덏; ) HANGUL SYLLABLE DYAEC +B350;B350;1103 1164 11BF;B350;1103 1164 11BF; # (덐; 덐; 덐; 덐; 덐; ) HANGUL SYLLABLE DYAEK +B351;B351;1103 1164 11C0;B351;1103 1164 11C0; # (덑; 덑; 덑; 덑; 덑; ) HANGUL SYLLABLE DYAET +B352;B352;1103 1164 11C1;B352;1103 1164 11C1; # (덒; 덒; 덒; 덒; 덒; ) HANGUL SYLLABLE DYAEP +B353;B353;1103 1164 11C2;B353;1103 1164 11C2; # (덓; 덓; 덓; 덓; 덓; ) HANGUL SYLLABLE DYAEH +B354;B354;1103 1165;B354;1103 1165; # (더; 더; 더; 더; 더; ) HANGUL SYLLABLE DEO +B355;B355;1103 1165 11A8;B355;1103 1165 11A8; # (덕; 덕; 덕; 덕; 덕; ) HANGUL SYLLABLE DEOG +B356;B356;1103 1165 11A9;B356;1103 1165 11A9; # (덖; 덖; 덖; 덖; 덖; ) HANGUL SYLLABLE DEOGG +B357;B357;1103 1165 11AA;B357;1103 1165 11AA; # (덗; 덗; 덗; 덗; 덗; ) HANGUL SYLLABLE DEOGS +B358;B358;1103 1165 11AB;B358;1103 1165 11AB; # (던; 던; 던; 던; 던; ) HANGUL SYLLABLE DEON +B359;B359;1103 1165 11AC;B359;1103 1165 11AC; # (덙; 덙; 덙; 덙; 덙; ) HANGUL SYLLABLE DEONJ +B35A;B35A;1103 1165 11AD;B35A;1103 1165 11AD; # (덚; 덚; 덚; 덚; 덚; ) HANGUL SYLLABLE DEONH +B35B;B35B;1103 1165 11AE;B35B;1103 1165 11AE; # (덛; 덛; 덛; 덛; 덛; ) HANGUL SYLLABLE DEOD +B35C;B35C;1103 1165 11AF;B35C;1103 1165 11AF; # (덜; 덜; 덜; 덜; 덜; ) HANGUL SYLLABLE DEOL +B35D;B35D;1103 1165 11B0;B35D;1103 1165 11B0; # (덝; 덝; 덝; 덝; 덝; ) HANGUL SYLLABLE DEOLG +B35E;B35E;1103 1165 11B1;B35E;1103 1165 11B1; # (덞; 덞; 덞; 덞; 덞; ) HANGUL SYLLABLE DEOLM +B35F;B35F;1103 1165 11B2;B35F;1103 1165 11B2; # (덟; 덟; 덟; 덟; 덟; ) HANGUL SYLLABLE DEOLB +B360;B360;1103 1165 11B3;B360;1103 1165 11B3; # (덠; 덠; 덠; 덠; 덠; ) HANGUL SYLLABLE DEOLS +B361;B361;1103 1165 11B4;B361;1103 1165 11B4; # (덡; 덡; 덡; 덡; 덡; ) HANGUL SYLLABLE DEOLT +B362;B362;1103 1165 11B5;B362;1103 1165 11B5; # (덢; 덢; 덢; 덢; 덢; ) HANGUL SYLLABLE DEOLP +B363;B363;1103 1165 11B6;B363;1103 1165 11B6; # (덣; 덣; 덣; 덣; 덣; ) HANGUL SYLLABLE DEOLH +B364;B364;1103 1165 11B7;B364;1103 1165 11B7; # (덤; 덤; 덤; 덤; 덤; ) HANGUL SYLLABLE DEOM +B365;B365;1103 1165 11B8;B365;1103 1165 11B8; # (덥; 덥; 덥; 덥; 덥; ) HANGUL SYLLABLE DEOB +B366;B366;1103 1165 11B9;B366;1103 1165 11B9; # (덦; 덦; 덦; 덦; 덦; ) HANGUL SYLLABLE DEOBS +B367;B367;1103 1165 11BA;B367;1103 1165 11BA; # (덧; 덧; 덧; 덧; 덧; ) HANGUL SYLLABLE DEOS +B368;B368;1103 1165 11BB;B368;1103 1165 11BB; # (덨; 덨; 덨; 덨; 덨; ) HANGUL SYLLABLE DEOSS +B369;B369;1103 1165 11BC;B369;1103 1165 11BC; # (덩; 덩; 덩; 덩; 덩; ) HANGUL SYLLABLE DEONG +B36A;B36A;1103 1165 11BD;B36A;1103 1165 11BD; # (덪; 덪; 덪; 덪; 덪; ) HANGUL SYLLABLE DEOJ +B36B;B36B;1103 1165 11BE;B36B;1103 1165 11BE; # (덫; 덫; 덫; 덫; 덫; ) HANGUL SYLLABLE DEOC +B36C;B36C;1103 1165 11BF;B36C;1103 1165 11BF; # (덬; 덬; 덬; 덬; 덬; ) HANGUL SYLLABLE DEOK +B36D;B36D;1103 1165 11C0;B36D;1103 1165 11C0; # (덭; 덭; 덭; 덭; 덭; ) HANGUL SYLLABLE DEOT +B36E;B36E;1103 1165 11C1;B36E;1103 1165 11C1; # (덮; 덮; 덮; 덮; 덮; ) HANGUL SYLLABLE DEOP +B36F;B36F;1103 1165 11C2;B36F;1103 1165 11C2; # (덯; 덯; 덯; 덯; 덯; ) HANGUL SYLLABLE DEOH +B370;B370;1103 1166;B370;1103 1166; # (데; 데; 데; 데; 데; ) HANGUL SYLLABLE DE +B371;B371;1103 1166 11A8;B371;1103 1166 11A8; # (덱; 덱; 덱; 덱; 덱; ) HANGUL SYLLABLE DEG +B372;B372;1103 1166 11A9;B372;1103 1166 11A9; # (덲; 덲; 덲; 덲; 덲; ) HANGUL SYLLABLE DEGG +B373;B373;1103 1166 11AA;B373;1103 1166 11AA; # (덳; 덳; 덳; 덳; 덳; ) HANGUL SYLLABLE DEGS +B374;B374;1103 1166 11AB;B374;1103 1166 11AB; # (덴; 덴; 덴; 덴; 덴; ) HANGUL SYLLABLE DEN +B375;B375;1103 1166 11AC;B375;1103 1166 11AC; # (덵; 덵; 덵; 덵; 덵; ) HANGUL SYLLABLE DENJ +B376;B376;1103 1166 11AD;B376;1103 1166 11AD; # (덶; 덶; 덶; 덶; 덶; ) HANGUL SYLLABLE DENH +B377;B377;1103 1166 11AE;B377;1103 1166 11AE; # (덷; 덷; 덷; 덷; 덷; ) HANGUL SYLLABLE DED +B378;B378;1103 1166 11AF;B378;1103 1166 11AF; # (델; 델; 델; 델; 델; ) HANGUL SYLLABLE DEL +B379;B379;1103 1166 11B0;B379;1103 1166 11B0; # (덹; 덹; 덹; 덹; 덹; ) HANGUL SYLLABLE DELG +B37A;B37A;1103 1166 11B1;B37A;1103 1166 11B1; # (덺; 덺; 덺; 덺; 덺; ) HANGUL SYLLABLE DELM +B37B;B37B;1103 1166 11B2;B37B;1103 1166 11B2; # (덻; 덻; 덻; 덻; 덻; ) HANGUL SYLLABLE DELB +B37C;B37C;1103 1166 11B3;B37C;1103 1166 11B3; # (덼; 덼; 덼; 덼; 덼; ) HANGUL SYLLABLE DELS +B37D;B37D;1103 1166 11B4;B37D;1103 1166 11B4; # (덽; 덽; 덽; 덽; 덽; ) HANGUL SYLLABLE DELT +B37E;B37E;1103 1166 11B5;B37E;1103 1166 11B5; # (덾; 덾; 덾; 덾; 덾; ) HANGUL SYLLABLE DELP +B37F;B37F;1103 1166 11B6;B37F;1103 1166 11B6; # (덿; 덿; 덿; 덿; 덿; ) HANGUL SYLLABLE DELH +B380;B380;1103 1166 11B7;B380;1103 1166 11B7; # (뎀; 뎀; 뎀; 뎀; 뎀; ) HANGUL SYLLABLE DEM +B381;B381;1103 1166 11B8;B381;1103 1166 11B8; # (뎁; 뎁; 뎁; 뎁; 뎁; ) HANGUL SYLLABLE DEB +B382;B382;1103 1166 11B9;B382;1103 1166 11B9; # (뎂; 뎂; 뎂; 뎂; 뎂; ) HANGUL SYLLABLE DEBS +B383;B383;1103 1166 11BA;B383;1103 1166 11BA; # (뎃; 뎃; 뎃; 뎃; 뎃; ) HANGUL SYLLABLE DES +B384;B384;1103 1166 11BB;B384;1103 1166 11BB; # (뎄; 뎄; 뎄; 뎄; 뎄; ) HANGUL SYLLABLE DESS +B385;B385;1103 1166 11BC;B385;1103 1166 11BC; # (뎅; 뎅; 뎅; 뎅; 뎅; ) HANGUL SYLLABLE DENG +B386;B386;1103 1166 11BD;B386;1103 1166 11BD; # (뎆; 뎆; 뎆; 뎆; 뎆; ) HANGUL SYLLABLE DEJ +B387;B387;1103 1166 11BE;B387;1103 1166 11BE; # (뎇; 뎇; 뎇; 뎇; 뎇; ) HANGUL SYLLABLE DEC +B388;B388;1103 1166 11BF;B388;1103 1166 11BF; # (뎈; 뎈; 뎈; 뎈; 뎈; ) HANGUL SYLLABLE DEK +B389;B389;1103 1166 11C0;B389;1103 1166 11C0; # (뎉; 뎉; 뎉; 뎉; 뎉; ) HANGUL SYLLABLE DET +B38A;B38A;1103 1166 11C1;B38A;1103 1166 11C1; # (뎊; 뎊; 뎊; 뎊; 뎊; ) HANGUL SYLLABLE DEP +B38B;B38B;1103 1166 11C2;B38B;1103 1166 11C2; # (뎋; 뎋; 뎋; 뎋; 뎋; ) HANGUL SYLLABLE DEH +B38C;B38C;1103 1167;B38C;1103 1167; # (뎌; 뎌; 뎌; 뎌; 뎌; ) HANGUL SYLLABLE DYEO +B38D;B38D;1103 1167 11A8;B38D;1103 1167 11A8; # (뎍; 뎍; 뎍; 뎍; 뎍; ) HANGUL SYLLABLE DYEOG +B38E;B38E;1103 1167 11A9;B38E;1103 1167 11A9; # (뎎; 뎎; 뎎; 뎎; 뎎; ) HANGUL SYLLABLE DYEOGG +B38F;B38F;1103 1167 11AA;B38F;1103 1167 11AA; # (뎏; 뎏; 뎏; 뎏; 뎏; ) HANGUL SYLLABLE DYEOGS +B390;B390;1103 1167 11AB;B390;1103 1167 11AB; # (뎐; 뎐; 뎐; 뎐; 뎐; ) HANGUL SYLLABLE DYEON +B391;B391;1103 1167 11AC;B391;1103 1167 11AC; # (뎑; 뎑; 뎑; 뎑; 뎑; ) HANGUL SYLLABLE DYEONJ +B392;B392;1103 1167 11AD;B392;1103 1167 11AD; # (뎒; 뎒; 뎒; 뎒; 뎒; ) HANGUL SYLLABLE DYEONH +B393;B393;1103 1167 11AE;B393;1103 1167 11AE; # (뎓; 뎓; 뎓; 뎓; 뎓; ) HANGUL SYLLABLE DYEOD +B394;B394;1103 1167 11AF;B394;1103 1167 11AF; # (뎔; 뎔; 뎔; 뎔; 뎔; ) HANGUL SYLLABLE DYEOL +B395;B395;1103 1167 11B0;B395;1103 1167 11B0; # (뎕; 뎕; 뎕; 뎕; 뎕; ) HANGUL SYLLABLE DYEOLG +B396;B396;1103 1167 11B1;B396;1103 1167 11B1; # (뎖; 뎖; 뎖; 뎖; 뎖; ) HANGUL SYLLABLE DYEOLM +B397;B397;1103 1167 11B2;B397;1103 1167 11B2; # (뎗; 뎗; 뎗; 뎗; 뎗; ) HANGUL SYLLABLE DYEOLB +B398;B398;1103 1167 11B3;B398;1103 1167 11B3; # (뎘; 뎘; 뎘; 뎘; 뎘; ) HANGUL SYLLABLE DYEOLS +B399;B399;1103 1167 11B4;B399;1103 1167 11B4; # (뎙; 뎙; 뎙; 뎙; 뎙; ) HANGUL SYLLABLE DYEOLT +B39A;B39A;1103 1167 11B5;B39A;1103 1167 11B5; # (뎚; 뎚; 뎚; 뎚; 뎚; ) HANGUL SYLLABLE DYEOLP +B39B;B39B;1103 1167 11B6;B39B;1103 1167 11B6; # (뎛; 뎛; 뎛; 뎛; 뎛; ) HANGUL SYLLABLE DYEOLH +B39C;B39C;1103 1167 11B7;B39C;1103 1167 11B7; # (뎜; 뎜; 뎜; 뎜; 뎜; ) HANGUL SYLLABLE DYEOM +B39D;B39D;1103 1167 11B8;B39D;1103 1167 11B8; # (뎝; 뎝; 뎝; 뎝; 뎝; ) HANGUL SYLLABLE DYEOB +B39E;B39E;1103 1167 11B9;B39E;1103 1167 11B9; # (뎞; 뎞; 뎞; 뎞; 뎞; ) HANGUL SYLLABLE DYEOBS +B39F;B39F;1103 1167 11BA;B39F;1103 1167 11BA; # (뎟; 뎟; 뎟; 뎟; 뎟; ) HANGUL SYLLABLE DYEOS +B3A0;B3A0;1103 1167 11BB;B3A0;1103 1167 11BB; # (뎠; 뎠; 뎠; 뎠; 뎠; ) HANGUL SYLLABLE DYEOSS +B3A1;B3A1;1103 1167 11BC;B3A1;1103 1167 11BC; # (뎡; 뎡; 뎡; 뎡; 뎡; ) HANGUL SYLLABLE DYEONG +B3A2;B3A2;1103 1167 11BD;B3A2;1103 1167 11BD; # (뎢; 뎢; 뎢; 뎢; 뎢; ) HANGUL SYLLABLE DYEOJ +B3A3;B3A3;1103 1167 11BE;B3A3;1103 1167 11BE; # (뎣; 뎣; 뎣; 뎣; 뎣; ) HANGUL SYLLABLE DYEOC +B3A4;B3A4;1103 1167 11BF;B3A4;1103 1167 11BF; # (뎤; 뎤; 뎤; 뎤; 뎤; ) HANGUL SYLLABLE DYEOK +B3A5;B3A5;1103 1167 11C0;B3A5;1103 1167 11C0; # (뎥; 뎥; 뎥; 뎥; 뎥; ) HANGUL SYLLABLE DYEOT +B3A6;B3A6;1103 1167 11C1;B3A6;1103 1167 11C1; # (뎦; 뎦; 뎦; 뎦; 뎦; ) HANGUL SYLLABLE DYEOP +B3A7;B3A7;1103 1167 11C2;B3A7;1103 1167 11C2; # (뎧; 뎧; 뎧; 뎧; 뎧; ) HANGUL SYLLABLE DYEOH +B3A8;B3A8;1103 1168;B3A8;1103 1168; # (뎨; 뎨; 뎨; 뎨; 뎨; ) HANGUL SYLLABLE DYE +B3A9;B3A9;1103 1168 11A8;B3A9;1103 1168 11A8; # (뎩; 뎩; 뎩; 뎩; 뎩; ) HANGUL SYLLABLE DYEG +B3AA;B3AA;1103 1168 11A9;B3AA;1103 1168 11A9; # (뎪; 뎪; 뎪; 뎪; 뎪; ) HANGUL SYLLABLE DYEGG +B3AB;B3AB;1103 1168 11AA;B3AB;1103 1168 11AA; # (뎫; 뎫; 뎫; 뎫; 뎫; ) HANGUL SYLLABLE DYEGS +B3AC;B3AC;1103 1168 11AB;B3AC;1103 1168 11AB; # (뎬; 뎬; 뎬; 뎬; 뎬; ) HANGUL SYLLABLE DYEN +B3AD;B3AD;1103 1168 11AC;B3AD;1103 1168 11AC; # (뎭; 뎭; 뎭; 뎭; 뎭; ) HANGUL SYLLABLE DYENJ +B3AE;B3AE;1103 1168 11AD;B3AE;1103 1168 11AD; # (뎮; 뎮; 뎮; 뎮; 뎮; ) HANGUL SYLLABLE DYENH +B3AF;B3AF;1103 1168 11AE;B3AF;1103 1168 11AE; # (뎯; 뎯; 뎯; 뎯; 뎯; ) HANGUL SYLLABLE DYED +B3B0;B3B0;1103 1168 11AF;B3B0;1103 1168 11AF; # (뎰; 뎰; 뎰; 뎰; 뎰; ) HANGUL SYLLABLE DYEL +B3B1;B3B1;1103 1168 11B0;B3B1;1103 1168 11B0; # (뎱; 뎱; 뎱; 뎱; 뎱; ) HANGUL SYLLABLE DYELG +B3B2;B3B2;1103 1168 11B1;B3B2;1103 1168 11B1; # (뎲; 뎲; 뎲; 뎲; 뎲; ) HANGUL SYLLABLE DYELM +B3B3;B3B3;1103 1168 11B2;B3B3;1103 1168 11B2; # (뎳; 뎳; 뎳; 뎳; 뎳; ) HANGUL SYLLABLE DYELB +B3B4;B3B4;1103 1168 11B3;B3B4;1103 1168 11B3; # (뎴; 뎴; 뎴; 뎴; 뎴; ) HANGUL SYLLABLE DYELS +B3B5;B3B5;1103 1168 11B4;B3B5;1103 1168 11B4; # (뎵; 뎵; 뎵; 뎵; 뎵; ) HANGUL SYLLABLE DYELT +B3B6;B3B6;1103 1168 11B5;B3B6;1103 1168 11B5; # (뎶; 뎶; 뎶; 뎶; 뎶; ) HANGUL SYLLABLE DYELP +B3B7;B3B7;1103 1168 11B6;B3B7;1103 1168 11B6; # (뎷; 뎷; 뎷; 뎷; 뎷; ) HANGUL SYLLABLE DYELH +B3B8;B3B8;1103 1168 11B7;B3B8;1103 1168 11B7; # (뎸; 뎸; 뎸; 뎸; 뎸; ) HANGUL SYLLABLE DYEM +B3B9;B3B9;1103 1168 11B8;B3B9;1103 1168 11B8; # (뎹; 뎹; 뎹; 뎹; 뎹; ) HANGUL SYLLABLE DYEB +B3BA;B3BA;1103 1168 11B9;B3BA;1103 1168 11B9; # (뎺; 뎺; 뎺; 뎺; 뎺; ) HANGUL SYLLABLE DYEBS +B3BB;B3BB;1103 1168 11BA;B3BB;1103 1168 11BA; # (뎻; 뎻; 뎻; 뎻; 뎻; ) HANGUL SYLLABLE DYES +B3BC;B3BC;1103 1168 11BB;B3BC;1103 1168 11BB; # (뎼; 뎼; 뎼; 뎼; 뎼; ) HANGUL SYLLABLE DYESS +B3BD;B3BD;1103 1168 11BC;B3BD;1103 1168 11BC; # (뎽; 뎽; 뎽; 뎽; 뎽; ) HANGUL SYLLABLE DYENG +B3BE;B3BE;1103 1168 11BD;B3BE;1103 1168 11BD; # (뎾; 뎾; 뎾; 뎾; 뎾; ) HANGUL SYLLABLE DYEJ +B3BF;B3BF;1103 1168 11BE;B3BF;1103 1168 11BE; # (뎿; 뎿; 뎿; 뎿; 뎿; ) HANGUL SYLLABLE DYEC +B3C0;B3C0;1103 1168 11BF;B3C0;1103 1168 11BF; # (돀; 돀; 돀; 돀; 돀; ) HANGUL SYLLABLE DYEK +B3C1;B3C1;1103 1168 11C0;B3C1;1103 1168 11C0; # (돁; 돁; 돁; 돁; 돁; ) HANGUL SYLLABLE DYET +B3C2;B3C2;1103 1168 11C1;B3C2;1103 1168 11C1; # (돂; 돂; 돂; 돂; 돂; ) HANGUL SYLLABLE DYEP +B3C3;B3C3;1103 1168 11C2;B3C3;1103 1168 11C2; # (돃; 돃; 돃; 돃; 돃; ) HANGUL SYLLABLE DYEH +B3C4;B3C4;1103 1169;B3C4;1103 1169; # (도; 도; 도; 도; 도; ) HANGUL SYLLABLE DO +B3C5;B3C5;1103 1169 11A8;B3C5;1103 1169 11A8; # (독; 독; 독; 독; 독; ) HANGUL SYLLABLE DOG +B3C6;B3C6;1103 1169 11A9;B3C6;1103 1169 11A9; # (돆; 돆; 돆; 돆; 돆; ) HANGUL SYLLABLE DOGG +B3C7;B3C7;1103 1169 11AA;B3C7;1103 1169 11AA; # (돇; 돇; 돇; 돇; 돇; ) HANGUL SYLLABLE DOGS +B3C8;B3C8;1103 1169 11AB;B3C8;1103 1169 11AB; # (돈; 돈; 돈; 돈; 돈; ) HANGUL SYLLABLE DON +B3C9;B3C9;1103 1169 11AC;B3C9;1103 1169 11AC; # (돉; 돉; 돉; 돉; 돉; ) HANGUL SYLLABLE DONJ +B3CA;B3CA;1103 1169 11AD;B3CA;1103 1169 11AD; # (돊; 돊; 돊; 돊; 돊; ) HANGUL SYLLABLE DONH +B3CB;B3CB;1103 1169 11AE;B3CB;1103 1169 11AE; # (돋; 돋; 돋; 돋; 돋; ) HANGUL SYLLABLE DOD +B3CC;B3CC;1103 1169 11AF;B3CC;1103 1169 11AF; # (돌; 돌; 돌; 돌; 돌; ) HANGUL SYLLABLE DOL +B3CD;B3CD;1103 1169 11B0;B3CD;1103 1169 11B0; # (돍; 돍; 돍; 돍; 돍; ) HANGUL SYLLABLE DOLG +B3CE;B3CE;1103 1169 11B1;B3CE;1103 1169 11B1; # (돎; 돎; 돎; 돎; 돎; ) HANGUL SYLLABLE DOLM +B3CF;B3CF;1103 1169 11B2;B3CF;1103 1169 11B2; # (돏; 돏; 돏; 돏; 돏; ) HANGUL SYLLABLE DOLB +B3D0;B3D0;1103 1169 11B3;B3D0;1103 1169 11B3; # (돐; 돐; 돐; 돐; 돐; ) HANGUL SYLLABLE DOLS +B3D1;B3D1;1103 1169 11B4;B3D1;1103 1169 11B4; # (돑; 돑; 돑; 돑; 돑; ) HANGUL SYLLABLE DOLT +B3D2;B3D2;1103 1169 11B5;B3D2;1103 1169 11B5; # (돒; 돒; 돒; 돒; 돒; ) HANGUL SYLLABLE DOLP +B3D3;B3D3;1103 1169 11B6;B3D3;1103 1169 11B6; # (돓; 돓; 돓; 돓; 돓; ) HANGUL SYLLABLE DOLH +B3D4;B3D4;1103 1169 11B7;B3D4;1103 1169 11B7; # (돔; 돔; 돔; 돔; 돔; ) HANGUL SYLLABLE DOM +B3D5;B3D5;1103 1169 11B8;B3D5;1103 1169 11B8; # (돕; 돕; 돕; 돕; 돕; ) HANGUL SYLLABLE DOB +B3D6;B3D6;1103 1169 11B9;B3D6;1103 1169 11B9; # (돖; 돖; 돖; 돖; 돖; ) HANGUL SYLLABLE DOBS +B3D7;B3D7;1103 1169 11BA;B3D7;1103 1169 11BA; # (돗; 돗; 돗; 돗; 돗; ) HANGUL SYLLABLE DOS +B3D8;B3D8;1103 1169 11BB;B3D8;1103 1169 11BB; # (돘; 돘; 돘; 돘; 돘; ) HANGUL SYLLABLE DOSS +B3D9;B3D9;1103 1169 11BC;B3D9;1103 1169 11BC; # (동; 동; 동; 동; 동; ) HANGUL SYLLABLE DONG +B3DA;B3DA;1103 1169 11BD;B3DA;1103 1169 11BD; # (돚; 돚; 돚; 돚; 돚; ) HANGUL SYLLABLE DOJ +B3DB;B3DB;1103 1169 11BE;B3DB;1103 1169 11BE; # (돛; 돛; 돛; 돛; 돛; ) HANGUL SYLLABLE DOC +B3DC;B3DC;1103 1169 11BF;B3DC;1103 1169 11BF; # (돜; 돜; 돜; 돜; 돜; ) HANGUL SYLLABLE DOK +B3DD;B3DD;1103 1169 11C0;B3DD;1103 1169 11C0; # (돝; 돝; 돝; 돝; 돝; ) HANGUL SYLLABLE DOT +B3DE;B3DE;1103 1169 11C1;B3DE;1103 1169 11C1; # (돞; 돞; 돞; 돞; 돞; ) HANGUL SYLLABLE DOP +B3DF;B3DF;1103 1169 11C2;B3DF;1103 1169 11C2; # (돟; 돟; 돟; 돟; 돟; ) HANGUL SYLLABLE DOH +B3E0;B3E0;1103 116A;B3E0;1103 116A; # (돠; 돠; 돠; 돠; 돠; ) HANGUL SYLLABLE DWA +B3E1;B3E1;1103 116A 11A8;B3E1;1103 116A 11A8; # (돡; 돡; 돡; 돡; 돡; ) HANGUL SYLLABLE DWAG +B3E2;B3E2;1103 116A 11A9;B3E2;1103 116A 11A9; # (돢; 돢; 돢; 돢; 돢; ) HANGUL SYLLABLE DWAGG +B3E3;B3E3;1103 116A 11AA;B3E3;1103 116A 11AA; # (돣; 돣; 돣; 돣; 돣; ) HANGUL SYLLABLE DWAGS +B3E4;B3E4;1103 116A 11AB;B3E4;1103 116A 11AB; # (돤; 돤; 돤; 돤; 돤; ) HANGUL SYLLABLE DWAN +B3E5;B3E5;1103 116A 11AC;B3E5;1103 116A 11AC; # (돥; 돥; 돥; 돥; 돥; ) HANGUL SYLLABLE DWANJ +B3E6;B3E6;1103 116A 11AD;B3E6;1103 116A 11AD; # (돦; 돦; 돦; 돦; 돦; ) HANGUL SYLLABLE DWANH +B3E7;B3E7;1103 116A 11AE;B3E7;1103 116A 11AE; # (돧; 돧; 돧; 돧; 돧; ) HANGUL SYLLABLE DWAD +B3E8;B3E8;1103 116A 11AF;B3E8;1103 116A 11AF; # (돨; 돨; 돨; 돨; 돨; ) HANGUL SYLLABLE DWAL +B3E9;B3E9;1103 116A 11B0;B3E9;1103 116A 11B0; # (돩; 돩; 돩; 돩; 돩; ) HANGUL SYLLABLE DWALG +B3EA;B3EA;1103 116A 11B1;B3EA;1103 116A 11B1; # (돪; 돪; 돪; 돪; 돪; ) HANGUL SYLLABLE DWALM +B3EB;B3EB;1103 116A 11B2;B3EB;1103 116A 11B2; # (돫; 돫; 돫; 돫; 돫; ) HANGUL SYLLABLE DWALB +B3EC;B3EC;1103 116A 11B3;B3EC;1103 116A 11B3; # (돬; 돬; 돬; 돬; 돬; ) HANGUL SYLLABLE DWALS +B3ED;B3ED;1103 116A 11B4;B3ED;1103 116A 11B4; # (돭; 돭; 돭; 돭; 돭; ) HANGUL SYLLABLE DWALT +B3EE;B3EE;1103 116A 11B5;B3EE;1103 116A 11B5; # (돮; 돮; 돮; 돮; 돮; ) HANGUL SYLLABLE DWALP +B3EF;B3EF;1103 116A 11B6;B3EF;1103 116A 11B6; # (돯; 돯; 돯; 돯; 돯; ) HANGUL SYLLABLE DWALH +B3F0;B3F0;1103 116A 11B7;B3F0;1103 116A 11B7; # (돰; 돰; 돰; 돰; 돰; ) HANGUL SYLLABLE DWAM +B3F1;B3F1;1103 116A 11B8;B3F1;1103 116A 11B8; # (돱; 돱; 돱; 돱; 돱; ) HANGUL SYLLABLE DWAB +B3F2;B3F2;1103 116A 11B9;B3F2;1103 116A 11B9; # (돲; 돲; 돲; 돲; 돲; ) HANGUL SYLLABLE DWABS +B3F3;B3F3;1103 116A 11BA;B3F3;1103 116A 11BA; # (돳; 돳; 돳; 돳; 돳; ) HANGUL SYLLABLE DWAS +B3F4;B3F4;1103 116A 11BB;B3F4;1103 116A 11BB; # (돴; 돴; 돴; 돴; 돴; ) HANGUL SYLLABLE DWASS +B3F5;B3F5;1103 116A 11BC;B3F5;1103 116A 11BC; # (돵; 돵; 돵; 돵; 돵; ) HANGUL SYLLABLE DWANG +B3F6;B3F6;1103 116A 11BD;B3F6;1103 116A 11BD; # (돶; 돶; 돶; 돶; 돶; ) HANGUL SYLLABLE DWAJ +B3F7;B3F7;1103 116A 11BE;B3F7;1103 116A 11BE; # (돷; 돷; 돷; 돷; 돷; ) HANGUL SYLLABLE DWAC +B3F8;B3F8;1103 116A 11BF;B3F8;1103 116A 11BF; # (돸; 돸; 돸; 돸; 돸; ) HANGUL SYLLABLE DWAK +B3F9;B3F9;1103 116A 11C0;B3F9;1103 116A 11C0; # (돹; 돹; 돹; 돹; 돹; ) HANGUL SYLLABLE DWAT +B3FA;B3FA;1103 116A 11C1;B3FA;1103 116A 11C1; # (돺; 돺; 돺; 돺; 돺; ) HANGUL SYLLABLE DWAP +B3FB;B3FB;1103 116A 11C2;B3FB;1103 116A 11C2; # (돻; 돻; 돻; 돻; 돻; ) HANGUL SYLLABLE DWAH +B3FC;B3FC;1103 116B;B3FC;1103 116B; # (돼; 돼; 돼; 돼; 돼; ) HANGUL SYLLABLE DWAE +B3FD;B3FD;1103 116B 11A8;B3FD;1103 116B 11A8; # (돽; 돽; 돽; 돽; 돽; ) HANGUL SYLLABLE DWAEG +B3FE;B3FE;1103 116B 11A9;B3FE;1103 116B 11A9; # (돾; 돾; 돾; 돾; 돾; ) HANGUL SYLLABLE DWAEGG +B3FF;B3FF;1103 116B 11AA;B3FF;1103 116B 11AA; # (돿; 돿; 돿; 돿; 돿; ) HANGUL SYLLABLE DWAEGS +B400;B400;1103 116B 11AB;B400;1103 116B 11AB; # (됀; 됀; 됀; 됀; 됀; ) HANGUL SYLLABLE DWAEN +B401;B401;1103 116B 11AC;B401;1103 116B 11AC; # (됁; 됁; 됁; 됁; 됁; ) HANGUL SYLLABLE DWAENJ +B402;B402;1103 116B 11AD;B402;1103 116B 11AD; # (됂; 됂; 됂; 됂; 됂; ) HANGUL SYLLABLE DWAENH +B403;B403;1103 116B 11AE;B403;1103 116B 11AE; # (됃; 됃; 됃; 됃; 됃; ) HANGUL SYLLABLE DWAED +B404;B404;1103 116B 11AF;B404;1103 116B 11AF; # (됄; 됄; 됄; 됄; 됄; ) HANGUL SYLLABLE DWAEL +B405;B405;1103 116B 11B0;B405;1103 116B 11B0; # (됅; 됅; 됅; 됅; 됅; ) HANGUL SYLLABLE DWAELG +B406;B406;1103 116B 11B1;B406;1103 116B 11B1; # (됆; 됆; 됆; 됆; 됆; ) HANGUL SYLLABLE DWAELM +B407;B407;1103 116B 11B2;B407;1103 116B 11B2; # (됇; 됇; 됇; 됇; 됇; ) HANGUL SYLLABLE DWAELB +B408;B408;1103 116B 11B3;B408;1103 116B 11B3; # (됈; 됈; 됈; 됈; 됈; ) HANGUL SYLLABLE DWAELS +B409;B409;1103 116B 11B4;B409;1103 116B 11B4; # (됉; 됉; 됉; 됉; 됉; ) HANGUL SYLLABLE DWAELT +B40A;B40A;1103 116B 11B5;B40A;1103 116B 11B5; # (됊; 됊; 됊; 됊; 됊; ) HANGUL SYLLABLE DWAELP +B40B;B40B;1103 116B 11B6;B40B;1103 116B 11B6; # (됋; 됋; 됋; 됋; 됋; ) HANGUL SYLLABLE DWAELH +B40C;B40C;1103 116B 11B7;B40C;1103 116B 11B7; # (됌; 됌; 됌; 됌; 됌; ) HANGUL SYLLABLE DWAEM +B40D;B40D;1103 116B 11B8;B40D;1103 116B 11B8; # (됍; 됍; 됍; 됍; 됍; ) HANGUL SYLLABLE DWAEB +B40E;B40E;1103 116B 11B9;B40E;1103 116B 11B9; # (됎; 됎; 됎; 됎; 됎; ) HANGUL SYLLABLE DWAEBS +B40F;B40F;1103 116B 11BA;B40F;1103 116B 11BA; # (됏; 됏; 됏; 됏; 됏; ) HANGUL SYLLABLE DWAES +B410;B410;1103 116B 11BB;B410;1103 116B 11BB; # (됐; 됐; 됐; 됐; 됐; ) HANGUL SYLLABLE DWAESS +B411;B411;1103 116B 11BC;B411;1103 116B 11BC; # (됑; 됑; 됑; 됑; 됑; ) HANGUL SYLLABLE DWAENG +B412;B412;1103 116B 11BD;B412;1103 116B 11BD; # (됒; 됒; 됒; 됒; 됒; ) HANGUL SYLLABLE DWAEJ +B413;B413;1103 116B 11BE;B413;1103 116B 11BE; # (됓; 됓; 됓; 됓; 됓; ) HANGUL SYLLABLE DWAEC +B414;B414;1103 116B 11BF;B414;1103 116B 11BF; # (됔; 됔; 됔; 됔; 됔; ) HANGUL SYLLABLE DWAEK +B415;B415;1103 116B 11C0;B415;1103 116B 11C0; # (됕; 됕; 됕; 됕; 됕; ) HANGUL SYLLABLE DWAET +B416;B416;1103 116B 11C1;B416;1103 116B 11C1; # (됖; 됖; 됖; 됖; 됖; ) HANGUL SYLLABLE DWAEP +B417;B417;1103 116B 11C2;B417;1103 116B 11C2; # (됗; 됗; 됗; 됗; 됗; ) HANGUL SYLLABLE DWAEH +B418;B418;1103 116C;B418;1103 116C; # (되; 되; 되; 되; 되; ) HANGUL SYLLABLE DOE +B419;B419;1103 116C 11A8;B419;1103 116C 11A8; # (됙; 됙; 됙; 됙; 됙; ) HANGUL SYLLABLE DOEG +B41A;B41A;1103 116C 11A9;B41A;1103 116C 11A9; # (됚; 됚; 됚; 됚; 됚; ) HANGUL SYLLABLE DOEGG +B41B;B41B;1103 116C 11AA;B41B;1103 116C 11AA; # (됛; 됛; 됛; 됛; 됛; ) HANGUL SYLLABLE DOEGS +B41C;B41C;1103 116C 11AB;B41C;1103 116C 11AB; # (된; 된; 된; 된; 된; ) HANGUL SYLLABLE DOEN +B41D;B41D;1103 116C 11AC;B41D;1103 116C 11AC; # (됝; 됝; 됝; 됝; 됝; ) HANGUL SYLLABLE DOENJ +B41E;B41E;1103 116C 11AD;B41E;1103 116C 11AD; # (됞; 됞; 됞; 됞; 됞; ) HANGUL SYLLABLE DOENH +B41F;B41F;1103 116C 11AE;B41F;1103 116C 11AE; # (됟; 됟; 됟; 됟; 됟; ) HANGUL SYLLABLE DOED +B420;B420;1103 116C 11AF;B420;1103 116C 11AF; # (될; 될; 될; 될; 될; ) HANGUL SYLLABLE DOEL +B421;B421;1103 116C 11B0;B421;1103 116C 11B0; # (됡; 됡; 됡; 됡; 됡; ) HANGUL SYLLABLE DOELG +B422;B422;1103 116C 11B1;B422;1103 116C 11B1; # (됢; 됢; 됢; 됢; 됢; ) HANGUL SYLLABLE DOELM +B423;B423;1103 116C 11B2;B423;1103 116C 11B2; # (됣; 됣; 됣; 됣; 됣; ) HANGUL SYLLABLE DOELB +B424;B424;1103 116C 11B3;B424;1103 116C 11B3; # (됤; 됤; 됤; 됤; 됤; ) HANGUL SYLLABLE DOELS +B425;B425;1103 116C 11B4;B425;1103 116C 11B4; # (됥; 됥; 됥; 됥; 됥; ) HANGUL SYLLABLE DOELT +B426;B426;1103 116C 11B5;B426;1103 116C 11B5; # (됦; 됦; 됦; 됦; 됦; ) HANGUL SYLLABLE DOELP +B427;B427;1103 116C 11B6;B427;1103 116C 11B6; # (됧; 됧; 됧; 됧; 됧; ) HANGUL SYLLABLE DOELH +B428;B428;1103 116C 11B7;B428;1103 116C 11B7; # (됨; 됨; 됨; 됨; 됨; ) HANGUL SYLLABLE DOEM +B429;B429;1103 116C 11B8;B429;1103 116C 11B8; # (됩; 됩; 됩; 됩; 됩; ) HANGUL SYLLABLE DOEB +B42A;B42A;1103 116C 11B9;B42A;1103 116C 11B9; # (됪; 됪; 됪; 됪; 됪; ) HANGUL SYLLABLE DOEBS +B42B;B42B;1103 116C 11BA;B42B;1103 116C 11BA; # (됫; 됫; 됫; 됫; 됫; ) HANGUL SYLLABLE DOES +B42C;B42C;1103 116C 11BB;B42C;1103 116C 11BB; # (됬; 됬; 됬; 됬; 됬; ) HANGUL SYLLABLE DOESS +B42D;B42D;1103 116C 11BC;B42D;1103 116C 11BC; # (됭; 됭; 됭; 됭; 됭; ) HANGUL SYLLABLE DOENG +B42E;B42E;1103 116C 11BD;B42E;1103 116C 11BD; # (됮; 됮; 됮; 됮; 됮; ) HANGUL SYLLABLE DOEJ +B42F;B42F;1103 116C 11BE;B42F;1103 116C 11BE; # (됯; 됯; 됯; 됯; 됯; ) HANGUL SYLLABLE DOEC +B430;B430;1103 116C 11BF;B430;1103 116C 11BF; # (됰; 됰; 됰; 됰; 됰; ) HANGUL SYLLABLE DOEK +B431;B431;1103 116C 11C0;B431;1103 116C 11C0; # (됱; 됱; 됱; 됱; 됱; ) HANGUL SYLLABLE DOET +B432;B432;1103 116C 11C1;B432;1103 116C 11C1; # (됲; 됲; 됲; 됲; 됲; ) HANGUL SYLLABLE DOEP +B433;B433;1103 116C 11C2;B433;1103 116C 11C2; # (됳; 됳; 됳; 됳; 됳; ) HANGUL SYLLABLE DOEH +B434;B434;1103 116D;B434;1103 116D; # (됴; 됴; 됴; 됴; 됴; ) HANGUL SYLLABLE DYO +B435;B435;1103 116D 11A8;B435;1103 116D 11A8; # (됵; 됵; 됵; 됵; 됵; ) HANGUL SYLLABLE DYOG +B436;B436;1103 116D 11A9;B436;1103 116D 11A9; # (됶; 됶; 됶; 됶; 됶; ) HANGUL SYLLABLE DYOGG +B437;B437;1103 116D 11AA;B437;1103 116D 11AA; # (됷; 됷; 됷; 됷; 됷; ) HANGUL SYLLABLE DYOGS +B438;B438;1103 116D 11AB;B438;1103 116D 11AB; # (됸; 됸; 됸; 됸; 됸; ) HANGUL SYLLABLE DYON +B439;B439;1103 116D 11AC;B439;1103 116D 11AC; # (됹; 됹; 됹; 됹; 됹; ) HANGUL SYLLABLE DYONJ +B43A;B43A;1103 116D 11AD;B43A;1103 116D 11AD; # (됺; 됺; 됺; 됺; 됺; ) HANGUL SYLLABLE DYONH +B43B;B43B;1103 116D 11AE;B43B;1103 116D 11AE; # (됻; 됻; 됻; 됻; 됻; ) HANGUL SYLLABLE DYOD +B43C;B43C;1103 116D 11AF;B43C;1103 116D 11AF; # (됼; 됼; 됼; 됼; 됼; ) HANGUL SYLLABLE DYOL +B43D;B43D;1103 116D 11B0;B43D;1103 116D 11B0; # (됽; 됽; 됽; 됽; 됽; ) HANGUL SYLLABLE DYOLG +B43E;B43E;1103 116D 11B1;B43E;1103 116D 11B1; # (됾; 됾; 됾; 됾; 됾; ) HANGUL SYLLABLE DYOLM +B43F;B43F;1103 116D 11B2;B43F;1103 116D 11B2; # (됿; 됿; 됿; 됿; 됿; ) HANGUL SYLLABLE DYOLB +B440;B440;1103 116D 11B3;B440;1103 116D 11B3; # (둀; 둀; 둀; 둀; 둀; ) HANGUL SYLLABLE DYOLS +B441;B441;1103 116D 11B4;B441;1103 116D 11B4; # (둁; 둁; 둁; 둁; 둁; ) HANGUL SYLLABLE DYOLT +B442;B442;1103 116D 11B5;B442;1103 116D 11B5; # (둂; 둂; 둂; 둂; 둂; ) HANGUL SYLLABLE DYOLP +B443;B443;1103 116D 11B6;B443;1103 116D 11B6; # (둃; 둃; 둃; 둃; 둃; ) HANGUL SYLLABLE DYOLH +B444;B444;1103 116D 11B7;B444;1103 116D 11B7; # (둄; 둄; 둄; 둄; 둄; ) HANGUL SYLLABLE DYOM +B445;B445;1103 116D 11B8;B445;1103 116D 11B8; # (둅; 둅; 둅; 둅; 둅; ) HANGUL SYLLABLE DYOB +B446;B446;1103 116D 11B9;B446;1103 116D 11B9; # (둆; 둆; 둆; 둆; 둆; ) HANGUL SYLLABLE DYOBS +B447;B447;1103 116D 11BA;B447;1103 116D 11BA; # (둇; 둇; 둇; 둇; 둇; ) HANGUL SYLLABLE DYOS +B448;B448;1103 116D 11BB;B448;1103 116D 11BB; # (둈; 둈; 둈; 둈; 둈; ) HANGUL SYLLABLE DYOSS +B449;B449;1103 116D 11BC;B449;1103 116D 11BC; # (둉; 둉; 둉; 둉; 둉; ) HANGUL SYLLABLE DYONG +B44A;B44A;1103 116D 11BD;B44A;1103 116D 11BD; # (둊; 둊; 둊; 둊; 둊; ) HANGUL SYLLABLE DYOJ +B44B;B44B;1103 116D 11BE;B44B;1103 116D 11BE; # (둋; 둋; 둋; 둋; 둋; ) HANGUL SYLLABLE DYOC +B44C;B44C;1103 116D 11BF;B44C;1103 116D 11BF; # (둌; 둌; 둌; 둌; 둌; ) HANGUL SYLLABLE DYOK +B44D;B44D;1103 116D 11C0;B44D;1103 116D 11C0; # (둍; 둍; 둍; 둍; 둍; ) HANGUL SYLLABLE DYOT +B44E;B44E;1103 116D 11C1;B44E;1103 116D 11C1; # (둎; 둎; 둎; 둎; 둎; ) HANGUL SYLLABLE DYOP +B44F;B44F;1103 116D 11C2;B44F;1103 116D 11C2; # (둏; 둏; 둏; 둏; 둏; ) HANGUL SYLLABLE DYOH +B450;B450;1103 116E;B450;1103 116E; # (두; 두; 두; 두; 두; ) HANGUL SYLLABLE DU +B451;B451;1103 116E 11A8;B451;1103 116E 11A8; # (둑; 둑; 둑; 둑; 둑; ) HANGUL SYLLABLE DUG +B452;B452;1103 116E 11A9;B452;1103 116E 11A9; # (둒; 둒; 둒; 둒; 둒; ) HANGUL SYLLABLE DUGG +B453;B453;1103 116E 11AA;B453;1103 116E 11AA; # (둓; 둓; 둓; 둓; 둓; ) HANGUL SYLLABLE DUGS +B454;B454;1103 116E 11AB;B454;1103 116E 11AB; # (둔; 둔; 둔; 둔; 둔; ) HANGUL SYLLABLE DUN +B455;B455;1103 116E 11AC;B455;1103 116E 11AC; # (둕; 둕; 둕; 둕; 둕; ) HANGUL SYLLABLE DUNJ +B456;B456;1103 116E 11AD;B456;1103 116E 11AD; # (둖; 둖; 둖; 둖; 둖; ) HANGUL SYLLABLE DUNH +B457;B457;1103 116E 11AE;B457;1103 116E 11AE; # (둗; 둗; 둗; 둗; 둗; ) HANGUL SYLLABLE DUD +B458;B458;1103 116E 11AF;B458;1103 116E 11AF; # (둘; 둘; 둘; 둘; 둘; ) HANGUL SYLLABLE DUL +B459;B459;1103 116E 11B0;B459;1103 116E 11B0; # (둙; 둙; 둙; 둙; 둙; ) HANGUL SYLLABLE DULG +B45A;B45A;1103 116E 11B1;B45A;1103 116E 11B1; # (둚; 둚; 둚; 둚; 둚; ) HANGUL SYLLABLE DULM +B45B;B45B;1103 116E 11B2;B45B;1103 116E 11B2; # (둛; 둛; 둛; 둛; 둛; ) HANGUL SYLLABLE DULB +B45C;B45C;1103 116E 11B3;B45C;1103 116E 11B3; # (둜; 둜; 둜; 둜; 둜; ) HANGUL SYLLABLE DULS +B45D;B45D;1103 116E 11B4;B45D;1103 116E 11B4; # (둝; 둝; 둝; 둝; 둝; ) HANGUL SYLLABLE DULT +B45E;B45E;1103 116E 11B5;B45E;1103 116E 11B5; # (둞; 둞; 둞; 둞; 둞; ) HANGUL SYLLABLE DULP +B45F;B45F;1103 116E 11B6;B45F;1103 116E 11B6; # (둟; 둟; 둟; 둟; 둟; ) HANGUL SYLLABLE DULH +B460;B460;1103 116E 11B7;B460;1103 116E 11B7; # (둠; 둠; 둠; 둠; 둠; ) HANGUL SYLLABLE DUM +B461;B461;1103 116E 11B8;B461;1103 116E 11B8; # (둡; 둡; 둡; 둡; 둡; ) HANGUL SYLLABLE DUB +B462;B462;1103 116E 11B9;B462;1103 116E 11B9; # (둢; 둢; 둢; 둢; 둢; ) HANGUL SYLLABLE DUBS +B463;B463;1103 116E 11BA;B463;1103 116E 11BA; # (둣; 둣; 둣; 둣; 둣; ) HANGUL SYLLABLE DUS +B464;B464;1103 116E 11BB;B464;1103 116E 11BB; # (둤; 둤; 둤; 둤; 둤; ) HANGUL SYLLABLE DUSS +B465;B465;1103 116E 11BC;B465;1103 116E 11BC; # (둥; 둥; 둥; 둥; 둥; ) HANGUL SYLLABLE DUNG +B466;B466;1103 116E 11BD;B466;1103 116E 11BD; # (둦; 둦; 둦; 둦; 둦; ) HANGUL SYLLABLE DUJ +B467;B467;1103 116E 11BE;B467;1103 116E 11BE; # (둧; 둧; 둧; 둧; 둧; ) HANGUL SYLLABLE DUC +B468;B468;1103 116E 11BF;B468;1103 116E 11BF; # (둨; 둨; 둨; 둨; 둨; ) HANGUL SYLLABLE DUK +B469;B469;1103 116E 11C0;B469;1103 116E 11C0; # (둩; 둩; 둩; 둩; 둩; ) HANGUL SYLLABLE DUT +B46A;B46A;1103 116E 11C1;B46A;1103 116E 11C1; # (둪; 둪; 둪; 둪; 둪; ) HANGUL SYLLABLE DUP +B46B;B46B;1103 116E 11C2;B46B;1103 116E 11C2; # (둫; 둫; 둫; 둫; 둫; ) HANGUL SYLLABLE DUH +B46C;B46C;1103 116F;B46C;1103 116F; # (둬; 둬; 둬; 둬; 둬; ) HANGUL SYLLABLE DWEO +B46D;B46D;1103 116F 11A8;B46D;1103 116F 11A8; # (둭; 둭; 둭; 둭; 둭; ) HANGUL SYLLABLE DWEOG +B46E;B46E;1103 116F 11A9;B46E;1103 116F 11A9; # (둮; 둮; 둮; 둮; 둮; ) HANGUL SYLLABLE DWEOGG +B46F;B46F;1103 116F 11AA;B46F;1103 116F 11AA; # (둯; 둯; 둯; 둯; 둯; ) HANGUL SYLLABLE DWEOGS +B470;B470;1103 116F 11AB;B470;1103 116F 11AB; # (둰; 둰; 둰; 둰; 둰; ) HANGUL SYLLABLE DWEON +B471;B471;1103 116F 11AC;B471;1103 116F 11AC; # (둱; 둱; 둱; 둱; 둱; ) HANGUL SYLLABLE DWEONJ +B472;B472;1103 116F 11AD;B472;1103 116F 11AD; # (둲; 둲; 둲; 둲; 둲; ) HANGUL SYLLABLE DWEONH +B473;B473;1103 116F 11AE;B473;1103 116F 11AE; # (둳; 둳; 둳; 둳; 둳; ) HANGUL SYLLABLE DWEOD +B474;B474;1103 116F 11AF;B474;1103 116F 11AF; # (둴; 둴; 둴; 둴; 둴; ) HANGUL SYLLABLE DWEOL +B475;B475;1103 116F 11B0;B475;1103 116F 11B0; # (둵; 둵; 둵; 둵; 둵; ) HANGUL SYLLABLE DWEOLG +B476;B476;1103 116F 11B1;B476;1103 116F 11B1; # (둶; 둶; 둶; 둶; 둶; ) HANGUL SYLLABLE DWEOLM +B477;B477;1103 116F 11B2;B477;1103 116F 11B2; # (둷; 둷; 둷; 둷; 둷; ) HANGUL SYLLABLE DWEOLB +B478;B478;1103 116F 11B3;B478;1103 116F 11B3; # (둸; 둸; 둸; 둸; 둸; ) HANGUL SYLLABLE DWEOLS +B479;B479;1103 116F 11B4;B479;1103 116F 11B4; # (둹; 둹; 둹; 둹; 둹; ) HANGUL SYLLABLE DWEOLT +B47A;B47A;1103 116F 11B5;B47A;1103 116F 11B5; # (둺; 둺; 둺; 둺; 둺; ) HANGUL SYLLABLE DWEOLP +B47B;B47B;1103 116F 11B6;B47B;1103 116F 11B6; # (둻; 둻; 둻; 둻; 둻; ) HANGUL SYLLABLE DWEOLH +B47C;B47C;1103 116F 11B7;B47C;1103 116F 11B7; # (둼; 둼; 둼; 둼; 둼; ) HANGUL SYLLABLE DWEOM +B47D;B47D;1103 116F 11B8;B47D;1103 116F 11B8; # (둽; 둽; 둽; 둽; 둽; ) HANGUL SYLLABLE DWEOB +B47E;B47E;1103 116F 11B9;B47E;1103 116F 11B9; # (둾; 둾; 둾; 둾; 둾; ) HANGUL SYLLABLE DWEOBS +B47F;B47F;1103 116F 11BA;B47F;1103 116F 11BA; # (둿; 둿; 둿; 둿; 둿; ) HANGUL SYLLABLE DWEOS +B480;B480;1103 116F 11BB;B480;1103 116F 11BB; # (뒀; 뒀; 뒀; 뒀; 뒀; ) HANGUL SYLLABLE DWEOSS +B481;B481;1103 116F 11BC;B481;1103 116F 11BC; # (뒁; 뒁; 뒁; 뒁; 뒁; ) HANGUL SYLLABLE DWEONG +B482;B482;1103 116F 11BD;B482;1103 116F 11BD; # (뒂; 뒂; 뒂; 뒂; 뒂; ) HANGUL SYLLABLE DWEOJ +B483;B483;1103 116F 11BE;B483;1103 116F 11BE; # (뒃; 뒃; 뒃; 뒃; 뒃; ) HANGUL SYLLABLE DWEOC +B484;B484;1103 116F 11BF;B484;1103 116F 11BF; # (뒄; 뒄; 뒄; 뒄; 뒄; ) HANGUL SYLLABLE DWEOK +B485;B485;1103 116F 11C0;B485;1103 116F 11C0; # (뒅; 뒅; 뒅; 뒅; 뒅; ) HANGUL SYLLABLE DWEOT +B486;B486;1103 116F 11C1;B486;1103 116F 11C1; # (뒆; 뒆; 뒆; 뒆; 뒆; ) HANGUL SYLLABLE DWEOP +B487;B487;1103 116F 11C2;B487;1103 116F 11C2; # (뒇; 뒇; 뒇; 뒇; 뒇; ) HANGUL SYLLABLE DWEOH +B488;B488;1103 1170;B488;1103 1170; # (뒈; 뒈; 뒈; 뒈; 뒈; ) HANGUL SYLLABLE DWE +B489;B489;1103 1170 11A8;B489;1103 1170 11A8; # (뒉; 뒉; 뒉; 뒉; 뒉; ) HANGUL SYLLABLE DWEG +B48A;B48A;1103 1170 11A9;B48A;1103 1170 11A9; # (뒊; 뒊; 뒊; 뒊; 뒊; ) HANGUL SYLLABLE DWEGG +B48B;B48B;1103 1170 11AA;B48B;1103 1170 11AA; # (뒋; 뒋; 뒋; 뒋; 뒋; ) HANGUL SYLLABLE DWEGS +B48C;B48C;1103 1170 11AB;B48C;1103 1170 11AB; # (뒌; 뒌; 뒌; 뒌; 뒌; ) HANGUL SYLLABLE DWEN +B48D;B48D;1103 1170 11AC;B48D;1103 1170 11AC; # (뒍; 뒍; 뒍; 뒍; 뒍; ) HANGUL SYLLABLE DWENJ +B48E;B48E;1103 1170 11AD;B48E;1103 1170 11AD; # (뒎; 뒎; 뒎; 뒎; 뒎; ) HANGUL SYLLABLE DWENH +B48F;B48F;1103 1170 11AE;B48F;1103 1170 11AE; # (뒏; 뒏; 뒏; 뒏; 뒏; ) HANGUL SYLLABLE DWED +B490;B490;1103 1170 11AF;B490;1103 1170 11AF; # (뒐; 뒐; 뒐; 뒐; 뒐; ) HANGUL SYLLABLE DWEL +B491;B491;1103 1170 11B0;B491;1103 1170 11B0; # (뒑; 뒑; 뒑; 뒑; 뒑; ) HANGUL SYLLABLE DWELG +B492;B492;1103 1170 11B1;B492;1103 1170 11B1; # (뒒; 뒒; 뒒; 뒒; 뒒; ) HANGUL SYLLABLE DWELM +B493;B493;1103 1170 11B2;B493;1103 1170 11B2; # (뒓; 뒓; 뒓; 뒓; 뒓; ) HANGUL SYLLABLE DWELB +B494;B494;1103 1170 11B3;B494;1103 1170 11B3; # (뒔; 뒔; 뒔; 뒔; 뒔; ) HANGUL SYLLABLE DWELS +B495;B495;1103 1170 11B4;B495;1103 1170 11B4; # (뒕; 뒕; 뒕; 뒕; 뒕; ) HANGUL SYLLABLE DWELT +B496;B496;1103 1170 11B5;B496;1103 1170 11B5; # (뒖; 뒖; 뒖; 뒖; 뒖; ) HANGUL SYLLABLE DWELP +B497;B497;1103 1170 11B6;B497;1103 1170 11B6; # (뒗; 뒗; 뒗; 뒗; 뒗; ) HANGUL SYLLABLE DWELH +B498;B498;1103 1170 11B7;B498;1103 1170 11B7; # (뒘; 뒘; 뒘; 뒘; 뒘; ) HANGUL SYLLABLE DWEM +B499;B499;1103 1170 11B8;B499;1103 1170 11B8; # (뒙; 뒙; 뒙; 뒙; 뒙; ) HANGUL SYLLABLE DWEB +B49A;B49A;1103 1170 11B9;B49A;1103 1170 11B9; # (뒚; 뒚; 뒚; 뒚; 뒚; ) HANGUL SYLLABLE DWEBS +B49B;B49B;1103 1170 11BA;B49B;1103 1170 11BA; # (뒛; 뒛; 뒛; 뒛; 뒛; ) HANGUL SYLLABLE DWES +B49C;B49C;1103 1170 11BB;B49C;1103 1170 11BB; # (뒜; 뒜; 뒜; 뒜; 뒜; ) HANGUL SYLLABLE DWESS +B49D;B49D;1103 1170 11BC;B49D;1103 1170 11BC; # (뒝; 뒝; 뒝; 뒝; 뒝; ) HANGUL SYLLABLE DWENG +B49E;B49E;1103 1170 11BD;B49E;1103 1170 11BD; # (뒞; 뒞; 뒞; 뒞; 뒞; ) HANGUL SYLLABLE DWEJ +B49F;B49F;1103 1170 11BE;B49F;1103 1170 11BE; # (뒟; 뒟; 뒟; 뒟; 뒟; ) HANGUL SYLLABLE DWEC +B4A0;B4A0;1103 1170 11BF;B4A0;1103 1170 11BF; # (뒠; 뒠; 뒠; 뒠; 뒠; ) HANGUL SYLLABLE DWEK +B4A1;B4A1;1103 1170 11C0;B4A1;1103 1170 11C0; # (뒡; 뒡; 뒡; 뒡; 뒡; ) HANGUL SYLLABLE DWET +B4A2;B4A2;1103 1170 11C1;B4A2;1103 1170 11C1; # (뒢; 뒢; 뒢; 뒢; 뒢; ) HANGUL SYLLABLE DWEP +B4A3;B4A3;1103 1170 11C2;B4A3;1103 1170 11C2; # (뒣; 뒣; 뒣; 뒣; 뒣; ) HANGUL SYLLABLE DWEH +B4A4;B4A4;1103 1171;B4A4;1103 1171; # (뒤; 뒤; 뒤; 뒤; 뒤; ) HANGUL SYLLABLE DWI +B4A5;B4A5;1103 1171 11A8;B4A5;1103 1171 11A8; # (뒥; 뒥; 뒥; 뒥; 뒥; ) HANGUL SYLLABLE DWIG +B4A6;B4A6;1103 1171 11A9;B4A6;1103 1171 11A9; # (뒦; 뒦; 뒦; 뒦; 뒦; ) HANGUL SYLLABLE DWIGG +B4A7;B4A7;1103 1171 11AA;B4A7;1103 1171 11AA; # (뒧; 뒧; 뒧; 뒧; 뒧; ) HANGUL SYLLABLE DWIGS +B4A8;B4A8;1103 1171 11AB;B4A8;1103 1171 11AB; # (뒨; 뒨; 뒨; 뒨; 뒨; ) HANGUL SYLLABLE DWIN +B4A9;B4A9;1103 1171 11AC;B4A9;1103 1171 11AC; # (뒩; 뒩; 뒩; 뒩; 뒩; ) HANGUL SYLLABLE DWINJ +B4AA;B4AA;1103 1171 11AD;B4AA;1103 1171 11AD; # (뒪; 뒪; 뒪; 뒪; 뒪; ) HANGUL SYLLABLE DWINH +B4AB;B4AB;1103 1171 11AE;B4AB;1103 1171 11AE; # (뒫; 뒫; 뒫; 뒫; 뒫; ) HANGUL SYLLABLE DWID +B4AC;B4AC;1103 1171 11AF;B4AC;1103 1171 11AF; # (뒬; 뒬; 뒬; 뒬; 뒬; ) HANGUL SYLLABLE DWIL +B4AD;B4AD;1103 1171 11B0;B4AD;1103 1171 11B0; # (뒭; 뒭; 뒭; 뒭; 뒭; ) HANGUL SYLLABLE DWILG +B4AE;B4AE;1103 1171 11B1;B4AE;1103 1171 11B1; # (뒮; 뒮; 뒮; 뒮; 뒮; ) HANGUL SYLLABLE DWILM +B4AF;B4AF;1103 1171 11B2;B4AF;1103 1171 11B2; # (뒯; 뒯; 뒯; 뒯; 뒯; ) HANGUL SYLLABLE DWILB +B4B0;B4B0;1103 1171 11B3;B4B0;1103 1171 11B3; # (뒰; 뒰; 뒰; 뒰; 뒰; ) HANGUL SYLLABLE DWILS +B4B1;B4B1;1103 1171 11B4;B4B1;1103 1171 11B4; # (뒱; 뒱; 뒱; 뒱; 뒱; ) HANGUL SYLLABLE DWILT +B4B2;B4B2;1103 1171 11B5;B4B2;1103 1171 11B5; # (뒲; 뒲; 뒲; 뒲; 뒲; ) HANGUL SYLLABLE DWILP +B4B3;B4B3;1103 1171 11B6;B4B3;1103 1171 11B6; # (뒳; 뒳; 뒳; 뒳; 뒳; ) HANGUL SYLLABLE DWILH +B4B4;B4B4;1103 1171 11B7;B4B4;1103 1171 11B7; # (뒴; 뒴; 뒴; 뒴; 뒴; ) HANGUL SYLLABLE DWIM +B4B5;B4B5;1103 1171 11B8;B4B5;1103 1171 11B8; # (뒵; 뒵; 뒵; 뒵; 뒵; ) HANGUL SYLLABLE DWIB +B4B6;B4B6;1103 1171 11B9;B4B6;1103 1171 11B9; # (뒶; 뒶; 뒶; 뒶; 뒶; ) HANGUL SYLLABLE DWIBS +B4B7;B4B7;1103 1171 11BA;B4B7;1103 1171 11BA; # (뒷; 뒷; 뒷; 뒷; 뒷; ) HANGUL SYLLABLE DWIS +B4B8;B4B8;1103 1171 11BB;B4B8;1103 1171 11BB; # (뒸; 뒸; 뒸; 뒸; 뒸; ) HANGUL SYLLABLE DWISS +B4B9;B4B9;1103 1171 11BC;B4B9;1103 1171 11BC; # (뒹; 뒹; 뒹; 뒹; 뒹; ) HANGUL SYLLABLE DWING +B4BA;B4BA;1103 1171 11BD;B4BA;1103 1171 11BD; # (뒺; 뒺; 뒺; 뒺; 뒺; ) HANGUL SYLLABLE DWIJ +B4BB;B4BB;1103 1171 11BE;B4BB;1103 1171 11BE; # (뒻; 뒻; 뒻; 뒻; 뒻; ) HANGUL SYLLABLE DWIC +B4BC;B4BC;1103 1171 11BF;B4BC;1103 1171 11BF; # (뒼; 뒼; 뒼; 뒼; 뒼; ) HANGUL SYLLABLE DWIK +B4BD;B4BD;1103 1171 11C0;B4BD;1103 1171 11C0; # (뒽; 뒽; 뒽; 뒽; 뒽; ) HANGUL SYLLABLE DWIT +B4BE;B4BE;1103 1171 11C1;B4BE;1103 1171 11C1; # (뒾; 뒾; 뒾; 뒾; 뒾; ) HANGUL SYLLABLE DWIP +B4BF;B4BF;1103 1171 11C2;B4BF;1103 1171 11C2; # (뒿; 뒿; 뒿; 뒿; 뒿; ) HANGUL SYLLABLE DWIH +B4C0;B4C0;1103 1172;B4C0;1103 1172; # (듀; 듀; 듀; 듀; 듀; ) HANGUL SYLLABLE DYU +B4C1;B4C1;1103 1172 11A8;B4C1;1103 1172 11A8; # (듁; 듁; 듁; 듁; 듁; ) HANGUL SYLLABLE DYUG +B4C2;B4C2;1103 1172 11A9;B4C2;1103 1172 11A9; # (듂; 듂; 듂; 듂; 듂; ) HANGUL SYLLABLE DYUGG +B4C3;B4C3;1103 1172 11AA;B4C3;1103 1172 11AA; # (듃; 듃; 듃; 듃; 듃; ) HANGUL SYLLABLE DYUGS +B4C4;B4C4;1103 1172 11AB;B4C4;1103 1172 11AB; # (듄; 듄; 듄; 듄; 듄; ) HANGUL SYLLABLE DYUN +B4C5;B4C5;1103 1172 11AC;B4C5;1103 1172 11AC; # (듅; 듅; 듅; 듅; 듅; ) HANGUL SYLLABLE DYUNJ +B4C6;B4C6;1103 1172 11AD;B4C6;1103 1172 11AD; # (듆; 듆; 듆; 듆; 듆; ) HANGUL SYLLABLE DYUNH +B4C7;B4C7;1103 1172 11AE;B4C7;1103 1172 11AE; # (듇; 듇; 듇; 듇; 듇; ) HANGUL SYLLABLE DYUD +B4C8;B4C8;1103 1172 11AF;B4C8;1103 1172 11AF; # (듈; 듈; 듈; 듈; 듈; ) HANGUL SYLLABLE DYUL +B4C9;B4C9;1103 1172 11B0;B4C9;1103 1172 11B0; # (듉; 듉; 듉; 듉; 듉; ) HANGUL SYLLABLE DYULG +B4CA;B4CA;1103 1172 11B1;B4CA;1103 1172 11B1; # (듊; 듊; 듊; 듊; 듊; ) HANGUL SYLLABLE DYULM +B4CB;B4CB;1103 1172 11B2;B4CB;1103 1172 11B2; # (듋; 듋; 듋; 듋; 듋; ) HANGUL SYLLABLE DYULB +B4CC;B4CC;1103 1172 11B3;B4CC;1103 1172 11B3; # (듌; 듌; 듌; 듌; 듌; ) HANGUL SYLLABLE DYULS +B4CD;B4CD;1103 1172 11B4;B4CD;1103 1172 11B4; # (듍; 듍; 듍; 듍; 듍; ) HANGUL SYLLABLE DYULT +B4CE;B4CE;1103 1172 11B5;B4CE;1103 1172 11B5; # (듎; 듎; 듎; 듎; 듎; ) HANGUL SYLLABLE DYULP +B4CF;B4CF;1103 1172 11B6;B4CF;1103 1172 11B6; # (듏; 듏; 듏; 듏; 듏; ) HANGUL SYLLABLE DYULH +B4D0;B4D0;1103 1172 11B7;B4D0;1103 1172 11B7; # (듐; 듐; 듐; 듐; 듐; ) HANGUL SYLLABLE DYUM +B4D1;B4D1;1103 1172 11B8;B4D1;1103 1172 11B8; # (듑; 듑; 듑; 듑; 듑; ) HANGUL SYLLABLE DYUB +B4D2;B4D2;1103 1172 11B9;B4D2;1103 1172 11B9; # (듒; 듒; 듒; 듒; 듒; ) HANGUL SYLLABLE DYUBS +B4D3;B4D3;1103 1172 11BA;B4D3;1103 1172 11BA; # (듓; 듓; 듓; 듓; 듓; ) HANGUL SYLLABLE DYUS +B4D4;B4D4;1103 1172 11BB;B4D4;1103 1172 11BB; # (듔; 듔; 듔; 듔; 듔; ) HANGUL SYLLABLE DYUSS +B4D5;B4D5;1103 1172 11BC;B4D5;1103 1172 11BC; # (듕; 듕; 듕; 듕; 듕; ) HANGUL SYLLABLE DYUNG +B4D6;B4D6;1103 1172 11BD;B4D6;1103 1172 11BD; # (듖; 듖; 듖; 듖; 듖; ) HANGUL SYLLABLE DYUJ +B4D7;B4D7;1103 1172 11BE;B4D7;1103 1172 11BE; # (듗; 듗; 듗; 듗; 듗; ) HANGUL SYLLABLE DYUC +B4D8;B4D8;1103 1172 11BF;B4D8;1103 1172 11BF; # (듘; 듘; 듘; 듘; 듘; ) HANGUL SYLLABLE DYUK +B4D9;B4D9;1103 1172 11C0;B4D9;1103 1172 11C0; # (듙; 듙; 듙; 듙; 듙; ) HANGUL SYLLABLE DYUT +B4DA;B4DA;1103 1172 11C1;B4DA;1103 1172 11C1; # (듚; 듚; 듚; 듚; 듚; ) HANGUL SYLLABLE DYUP +B4DB;B4DB;1103 1172 11C2;B4DB;1103 1172 11C2; # (듛; 듛; 듛; 듛; 듛; ) HANGUL SYLLABLE DYUH +B4DC;B4DC;1103 1173;B4DC;1103 1173; # (드; 드; 드; 드; 드; ) HANGUL SYLLABLE DEU +B4DD;B4DD;1103 1173 11A8;B4DD;1103 1173 11A8; # (득; 득; 득; 득; 득; ) HANGUL SYLLABLE DEUG +B4DE;B4DE;1103 1173 11A9;B4DE;1103 1173 11A9; # (듞; 듞; 듞; 듞; 듞; ) HANGUL SYLLABLE DEUGG +B4DF;B4DF;1103 1173 11AA;B4DF;1103 1173 11AA; # (듟; 듟; 듟; 듟; 듟; ) HANGUL SYLLABLE DEUGS +B4E0;B4E0;1103 1173 11AB;B4E0;1103 1173 11AB; # (든; 든; 든; 든; 든; ) HANGUL SYLLABLE DEUN +B4E1;B4E1;1103 1173 11AC;B4E1;1103 1173 11AC; # (듡; 듡; 듡; 듡; 듡; ) HANGUL SYLLABLE DEUNJ +B4E2;B4E2;1103 1173 11AD;B4E2;1103 1173 11AD; # (듢; 듢; 듢; 듢; 듢; ) HANGUL SYLLABLE DEUNH +B4E3;B4E3;1103 1173 11AE;B4E3;1103 1173 11AE; # (듣; 듣; 듣; 듣; 듣; ) HANGUL SYLLABLE DEUD +B4E4;B4E4;1103 1173 11AF;B4E4;1103 1173 11AF; # (들; 들; 들; 들; 들; ) HANGUL SYLLABLE DEUL +B4E5;B4E5;1103 1173 11B0;B4E5;1103 1173 11B0; # (듥; 듥; 듥; 듥; 듥; ) HANGUL SYLLABLE DEULG +B4E6;B4E6;1103 1173 11B1;B4E6;1103 1173 11B1; # (듦; 듦; 듦; 듦; 듦; ) HANGUL SYLLABLE DEULM +B4E7;B4E7;1103 1173 11B2;B4E7;1103 1173 11B2; # (듧; 듧; 듧; 듧; 듧; ) HANGUL SYLLABLE DEULB +B4E8;B4E8;1103 1173 11B3;B4E8;1103 1173 11B3; # (듨; 듨; 듨; 듨; 듨; ) HANGUL SYLLABLE DEULS +B4E9;B4E9;1103 1173 11B4;B4E9;1103 1173 11B4; # (듩; 듩; 듩; 듩; 듩; ) HANGUL SYLLABLE DEULT +B4EA;B4EA;1103 1173 11B5;B4EA;1103 1173 11B5; # (듪; 듪; 듪; 듪; 듪; ) HANGUL SYLLABLE DEULP +B4EB;B4EB;1103 1173 11B6;B4EB;1103 1173 11B6; # (듫; 듫; 듫; 듫; 듫; ) HANGUL SYLLABLE DEULH +B4EC;B4EC;1103 1173 11B7;B4EC;1103 1173 11B7; # (듬; 듬; 듬; 듬; 듬; ) HANGUL SYLLABLE DEUM +B4ED;B4ED;1103 1173 11B8;B4ED;1103 1173 11B8; # (듭; 듭; 듭; 듭; 듭; ) HANGUL SYLLABLE DEUB +B4EE;B4EE;1103 1173 11B9;B4EE;1103 1173 11B9; # (듮; 듮; 듮; 듮; 듮; ) HANGUL SYLLABLE DEUBS +B4EF;B4EF;1103 1173 11BA;B4EF;1103 1173 11BA; # (듯; 듯; 듯; 듯; 듯; ) HANGUL SYLLABLE DEUS +B4F0;B4F0;1103 1173 11BB;B4F0;1103 1173 11BB; # (듰; 듰; 듰; 듰; 듰; ) HANGUL SYLLABLE DEUSS +B4F1;B4F1;1103 1173 11BC;B4F1;1103 1173 11BC; # (등; 등; 등; 등; 등; ) HANGUL SYLLABLE DEUNG +B4F2;B4F2;1103 1173 11BD;B4F2;1103 1173 11BD; # (듲; 듲; 듲; 듲; 듲; ) HANGUL SYLLABLE DEUJ +B4F3;B4F3;1103 1173 11BE;B4F3;1103 1173 11BE; # (듳; 듳; 듳; 듳; 듳; ) HANGUL SYLLABLE DEUC +B4F4;B4F4;1103 1173 11BF;B4F4;1103 1173 11BF; # (듴; 듴; 듴; 듴; 듴; ) HANGUL SYLLABLE DEUK +B4F5;B4F5;1103 1173 11C0;B4F5;1103 1173 11C0; # (듵; 듵; 듵; 듵; 듵; ) HANGUL SYLLABLE DEUT +B4F6;B4F6;1103 1173 11C1;B4F6;1103 1173 11C1; # (듶; 듶; 듶; 듶; 듶; ) HANGUL SYLLABLE DEUP +B4F7;B4F7;1103 1173 11C2;B4F7;1103 1173 11C2; # (듷; 듷; 듷; 듷; 듷; ) HANGUL SYLLABLE DEUH +B4F8;B4F8;1103 1174;B4F8;1103 1174; # (듸; 듸; 듸; 듸; 듸; ) HANGUL SYLLABLE DYI +B4F9;B4F9;1103 1174 11A8;B4F9;1103 1174 11A8; # (듹; 듹; 듹; 듹; 듹; ) HANGUL SYLLABLE DYIG +B4FA;B4FA;1103 1174 11A9;B4FA;1103 1174 11A9; # (듺; 듺; 듺; 듺; 듺; ) HANGUL SYLLABLE DYIGG +B4FB;B4FB;1103 1174 11AA;B4FB;1103 1174 11AA; # (듻; 듻; 듻; 듻; 듻; ) HANGUL SYLLABLE DYIGS +B4FC;B4FC;1103 1174 11AB;B4FC;1103 1174 11AB; # (듼; 듼; 듼; 듼; 듼; ) HANGUL SYLLABLE DYIN +B4FD;B4FD;1103 1174 11AC;B4FD;1103 1174 11AC; # (듽; 듽; 듽; 듽; 듽; ) HANGUL SYLLABLE DYINJ +B4FE;B4FE;1103 1174 11AD;B4FE;1103 1174 11AD; # (듾; 듾; 듾; 듾; 듾; ) HANGUL SYLLABLE DYINH +B4FF;B4FF;1103 1174 11AE;B4FF;1103 1174 11AE; # (듿; 듿; 듿; 듿; 듿; ) HANGUL SYLLABLE DYID +B500;B500;1103 1174 11AF;B500;1103 1174 11AF; # (딀; 딀; 딀; 딀; 딀; ) HANGUL SYLLABLE DYIL +B501;B501;1103 1174 11B0;B501;1103 1174 11B0; # (딁; 딁; 딁; 딁; 딁; ) HANGUL SYLLABLE DYILG +B502;B502;1103 1174 11B1;B502;1103 1174 11B1; # (딂; 딂; 딂; 딂; 딂; ) HANGUL SYLLABLE DYILM +B503;B503;1103 1174 11B2;B503;1103 1174 11B2; # (딃; 딃; 딃; 딃; 딃; ) HANGUL SYLLABLE DYILB +B504;B504;1103 1174 11B3;B504;1103 1174 11B3; # (딄; 딄; 딄; 딄; 딄; ) HANGUL SYLLABLE DYILS +B505;B505;1103 1174 11B4;B505;1103 1174 11B4; # (딅; 딅; 딅; 딅; 딅; ) HANGUL SYLLABLE DYILT +B506;B506;1103 1174 11B5;B506;1103 1174 11B5; # (딆; 딆; 딆; 딆; 딆; ) HANGUL SYLLABLE DYILP +B507;B507;1103 1174 11B6;B507;1103 1174 11B6; # (딇; 딇; 딇; 딇; 딇; ) HANGUL SYLLABLE DYILH +B508;B508;1103 1174 11B7;B508;1103 1174 11B7; # (딈; 딈; 딈; 딈; 딈; ) HANGUL SYLLABLE DYIM +B509;B509;1103 1174 11B8;B509;1103 1174 11B8; # (딉; 딉; 딉; 딉; 딉; ) HANGUL SYLLABLE DYIB +B50A;B50A;1103 1174 11B9;B50A;1103 1174 11B9; # (딊; 딊; 딊; 딊; 딊; ) HANGUL SYLLABLE DYIBS +B50B;B50B;1103 1174 11BA;B50B;1103 1174 11BA; # (딋; 딋; 딋; 딋; 딋; ) HANGUL SYLLABLE DYIS +B50C;B50C;1103 1174 11BB;B50C;1103 1174 11BB; # (딌; 딌; 딌; 딌; 딌; ) HANGUL SYLLABLE DYISS +B50D;B50D;1103 1174 11BC;B50D;1103 1174 11BC; # (딍; 딍; 딍; 딍; 딍; ) HANGUL SYLLABLE DYING +B50E;B50E;1103 1174 11BD;B50E;1103 1174 11BD; # (딎; 딎; 딎; 딎; 딎; ) HANGUL SYLLABLE DYIJ +B50F;B50F;1103 1174 11BE;B50F;1103 1174 11BE; # (딏; 딏; 딏; 딏; 딏; ) HANGUL SYLLABLE DYIC +B510;B510;1103 1174 11BF;B510;1103 1174 11BF; # (딐; 딐; 딐; 딐; 딐; ) HANGUL SYLLABLE DYIK +B511;B511;1103 1174 11C0;B511;1103 1174 11C0; # (딑; 딑; 딑; 딑; 딑; ) HANGUL SYLLABLE DYIT +B512;B512;1103 1174 11C1;B512;1103 1174 11C1; # (딒; 딒; 딒; 딒; 딒; ) HANGUL SYLLABLE DYIP +B513;B513;1103 1174 11C2;B513;1103 1174 11C2; # (딓; 딓; 딓; 딓; 딓; ) HANGUL SYLLABLE DYIH +B514;B514;1103 1175;B514;1103 1175; # (디; 디; 디; 디; 디; ) HANGUL SYLLABLE DI +B515;B515;1103 1175 11A8;B515;1103 1175 11A8; # (딕; 딕; 딕; 딕; 딕; ) HANGUL SYLLABLE DIG +B516;B516;1103 1175 11A9;B516;1103 1175 11A9; # (딖; 딖; 딖; 딖; 딖; ) HANGUL SYLLABLE DIGG +B517;B517;1103 1175 11AA;B517;1103 1175 11AA; # (딗; 딗; 딗; 딗; 딗; ) HANGUL SYLLABLE DIGS +B518;B518;1103 1175 11AB;B518;1103 1175 11AB; # (딘; 딘; 딘; 딘; 딘; ) HANGUL SYLLABLE DIN +B519;B519;1103 1175 11AC;B519;1103 1175 11AC; # (딙; 딙; 딙; 딙; 딙; ) HANGUL SYLLABLE DINJ +B51A;B51A;1103 1175 11AD;B51A;1103 1175 11AD; # (딚; 딚; 딚; 딚; 딚; ) HANGUL SYLLABLE DINH +B51B;B51B;1103 1175 11AE;B51B;1103 1175 11AE; # (딛; 딛; 딛; 딛; 딛; ) HANGUL SYLLABLE DID +B51C;B51C;1103 1175 11AF;B51C;1103 1175 11AF; # (딜; 딜; 딜; 딜; 딜; ) HANGUL SYLLABLE DIL +B51D;B51D;1103 1175 11B0;B51D;1103 1175 11B0; # (딝; 딝; 딝; 딝; 딝; ) HANGUL SYLLABLE DILG +B51E;B51E;1103 1175 11B1;B51E;1103 1175 11B1; # (딞; 딞; 딞; 딞; 딞; ) HANGUL SYLLABLE DILM +B51F;B51F;1103 1175 11B2;B51F;1103 1175 11B2; # (딟; 딟; 딟; 딟; 딟; ) HANGUL SYLLABLE DILB +B520;B520;1103 1175 11B3;B520;1103 1175 11B3; # (딠; 딠; 딠; 딠; 딠; ) HANGUL SYLLABLE DILS +B521;B521;1103 1175 11B4;B521;1103 1175 11B4; # (딡; 딡; 딡; 딡; 딡; ) HANGUL SYLLABLE DILT +B522;B522;1103 1175 11B5;B522;1103 1175 11B5; # (딢; 딢; 딢; 딢; 딢; ) HANGUL SYLLABLE DILP +B523;B523;1103 1175 11B6;B523;1103 1175 11B6; # (딣; 딣; 딣; 딣; 딣; ) HANGUL SYLLABLE DILH +B524;B524;1103 1175 11B7;B524;1103 1175 11B7; # (딤; 딤; 딤; 딤; 딤; ) HANGUL SYLLABLE DIM +B525;B525;1103 1175 11B8;B525;1103 1175 11B8; # (딥; 딥; 딥; 딥; 딥; ) HANGUL SYLLABLE DIB +B526;B526;1103 1175 11B9;B526;1103 1175 11B9; # (딦; 딦; 딦; 딦; 딦; ) HANGUL SYLLABLE DIBS +B527;B527;1103 1175 11BA;B527;1103 1175 11BA; # (딧; 딧; 딧; 딧; 딧; ) HANGUL SYLLABLE DIS +B528;B528;1103 1175 11BB;B528;1103 1175 11BB; # (딨; 딨; 딨; 딨; 딨; ) HANGUL SYLLABLE DISS +B529;B529;1103 1175 11BC;B529;1103 1175 11BC; # (딩; 딩; 딩; 딩; 딩; ) HANGUL SYLLABLE DING +B52A;B52A;1103 1175 11BD;B52A;1103 1175 11BD; # (딪; 딪; 딪; 딪; 딪; ) HANGUL SYLLABLE DIJ +B52B;B52B;1103 1175 11BE;B52B;1103 1175 11BE; # (딫; 딫; 딫; 딫; 딫; ) HANGUL SYLLABLE DIC +B52C;B52C;1103 1175 11BF;B52C;1103 1175 11BF; # (딬; 딬; 딬; 딬; 딬; ) HANGUL SYLLABLE DIK +B52D;B52D;1103 1175 11C0;B52D;1103 1175 11C0; # (딭; 딭; 딭; 딭; 딭; ) HANGUL SYLLABLE DIT +B52E;B52E;1103 1175 11C1;B52E;1103 1175 11C1; # (딮; 딮; 딮; 딮; 딮; ) HANGUL SYLLABLE DIP +B52F;B52F;1103 1175 11C2;B52F;1103 1175 11C2; # (딯; 딯; 딯; 딯; 딯; ) HANGUL SYLLABLE DIH +B530;B530;1104 1161;B530;1104 1161; # (따; 따; 따; 따; 따; ) HANGUL SYLLABLE DDA +B531;B531;1104 1161 11A8;B531;1104 1161 11A8; # (딱; 딱; 딱; 딱; 딱; ) HANGUL SYLLABLE DDAG +B532;B532;1104 1161 11A9;B532;1104 1161 11A9; # (딲; 딲; 딲; 딲; 딲; ) HANGUL SYLLABLE DDAGG +B533;B533;1104 1161 11AA;B533;1104 1161 11AA; # (딳; 딳; 딳; 딳; 딳; ) HANGUL SYLLABLE DDAGS +B534;B534;1104 1161 11AB;B534;1104 1161 11AB; # (딴; 딴; 딴; 딴; 딴; ) HANGUL SYLLABLE DDAN +B535;B535;1104 1161 11AC;B535;1104 1161 11AC; # (딵; 딵; 딵; 딵; 딵; ) HANGUL SYLLABLE DDANJ +B536;B536;1104 1161 11AD;B536;1104 1161 11AD; # (딶; 딶; 딶; 딶; 딶; ) HANGUL SYLLABLE DDANH +B537;B537;1104 1161 11AE;B537;1104 1161 11AE; # (딷; 딷; 딷; 딷; 딷; ) HANGUL SYLLABLE DDAD +B538;B538;1104 1161 11AF;B538;1104 1161 11AF; # (딸; 딸; 딸; 딸; 딸; ) HANGUL SYLLABLE DDAL +B539;B539;1104 1161 11B0;B539;1104 1161 11B0; # (딹; 딹; 딹; 딹; 딹; ) HANGUL SYLLABLE DDALG +B53A;B53A;1104 1161 11B1;B53A;1104 1161 11B1; # (딺; 딺; 딺; 딺; 딺; ) HANGUL SYLLABLE DDALM +B53B;B53B;1104 1161 11B2;B53B;1104 1161 11B2; # (딻; 딻; 딻; 딻; 딻; ) HANGUL SYLLABLE DDALB +B53C;B53C;1104 1161 11B3;B53C;1104 1161 11B3; # (딼; 딼; 딼; 딼; 딼; ) HANGUL SYLLABLE DDALS +B53D;B53D;1104 1161 11B4;B53D;1104 1161 11B4; # (딽; 딽; 딽; 딽; 딽; ) HANGUL SYLLABLE DDALT +B53E;B53E;1104 1161 11B5;B53E;1104 1161 11B5; # (딾; 딾; 딾; 딾; 딾; ) HANGUL SYLLABLE DDALP +B53F;B53F;1104 1161 11B6;B53F;1104 1161 11B6; # (딿; 딿; 딿; 딿; 딿; ) HANGUL SYLLABLE DDALH +B540;B540;1104 1161 11B7;B540;1104 1161 11B7; # (땀; 땀; 땀; 땀; 땀; ) HANGUL SYLLABLE DDAM +B541;B541;1104 1161 11B8;B541;1104 1161 11B8; # (땁; 땁; 땁; 땁; 땁; ) HANGUL SYLLABLE DDAB +B542;B542;1104 1161 11B9;B542;1104 1161 11B9; # (땂; 땂; 땂; 땂; 땂; ) HANGUL SYLLABLE DDABS +B543;B543;1104 1161 11BA;B543;1104 1161 11BA; # (땃; 땃; 땃; 땃; 땃; ) HANGUL SYLLABLE DDAS +B544;B544;1104 1161 11BB;B544;1104 1161 11BB; # (땄; 땄; 땄; 땄; 땄; ) HANGUL SYLLABLE DDASS +B545;B545;1104 1161 11BC;B545;1104 1161 11BC; # (땅; 땅; 땅; 땅; 땅; ) HANGUL SYLLABLE DDANG +B546;B546;1104 1161 11BD;B546;1104 1161 11BD; # (땆; 땆; 땆; 땆; 땆; ) HANGUL SYLLABLE DDAJ +B547;B547;1104 1161 11BE;B547;1104 1161 11BE; # (땇; 땇; 땇; 땇; 땇; ) HANGUL SYLLABLE DDAC +B548;B548;1104 1161 11BF;B548;1104 1161 11BF; # (땈; 땈; 땈; 땈; 땈; ) HANGUL SYLLABLE DDAK +B549;B549;1104 1161 11C0;B549;1104 1161 11C0; # (땉; 땉; 땉; 땉; 땉; ) HANGUL SYLLABLE DDAT +B54A;B54A;1104 1161 11C1;B54A;1104 1161 11C1; # (땊; 땊; 땊; 땊; 땊; ) HANGUL SYLLABLE DDAP +B54B;B54B;1104 1161 11C2;B54B;1104 1161 11C2; # (땋; 땋; 땋; 땋; 땋; ) HANGUL SYLLABLE DDAH +B54C;B54C;1104 1162;B54C;1104 1162; # (때; 때; 때; 때; 때; ) HANGUL SYLLABLE DDAE +B54D;B54D;1104 1162 11A8;B54D;1104 1162 11A8; # (땍; 땍; 땍; 땍; 땍; ) HANGUL SYLLABLE DDAEG +B54E;B54E;1104 1162 11A9;B54E;1104 1162 11A9; # (땎; 땎; 땎; 땎; 땎; ) HANGUL SYLLABLE DDAEGG +B54F;B54F;1104 1162 11AA;B54F;1104 1162 11AA; # (땏; 땏; 땏; 땏; 땏; ) HANGUL SYLLABLE DDAEGS +B550;B550;1104 1162 11AB;B550;1104 1162 11AB; # (땐; 땐; 땐; 땐; 땐; ) HANGUL SYLLABLE DDAEN +B551;B551;1104 1162 11AC;B551;1104 1162 11AC; # (땑; 땑; 땑; 땑; 땑; ) HANGUL SYLLABLE DDAENJ +B552;B552;1104 1162 11AD;B552;1104 1162 11AD; # (땒; 땒; 땒; 땒; 땒; ) HANGUL SYLLABLE DDAENH +B553;B553;1104 1162 11AE;B553;1104 1162 11AE; # (땓; 땓; 땓; 땓; 땓; ) HANGUL SYLLABLE DDAED +B554;B554;1104 1162 11AF;B554;1104 1162 11AF; # (땔; 땔; 땔; 땔; 땔; ) HANGUL SYLLABLE DDAEL +B555;B555;1104 1162 11B0;B555;1104 1162 11B0; # (땕; 땕; 땕; 땕; 땕; ) HANGUL SYLLABLE DDAELG +B556;B556;1104 1162 11B1;B556;1104 1162 11B1; # (땖; 땖; 땖; 땖; 땖; ) HANGUL SYLLABLE DDAELM +B557;B557;1104 1162 11B2;B557;1104 1162 11B2; # (땗; 땗; 땗; 땗; 땗; ) HANGUL SYLLABLE DDAELB +B558;B558;1104 1162 11B3;B558;1104 1162 11B3; # (땘; 땘; 땘; 땘; 땘; ) HANGUL SYLLABLE DDAELS +B559;B559;1104 1162 11B4;B559;1104 1162 11B4; # (땙; 땙; 땙; 땙; 땙; ) HANGUL SYLLABLE DDAELT +B55A;B55A;1104 1162 11B5;B55A;1104 1162 11B5; # (땚; 땚; 땚; 땚; 땚; ) HANGUL SYLLABLE DDAELP +B55B;B55B;1104 1162 11B6;B55B;1104 1162 11B6; # (땛; 땛; 땛; 땛; 땛; ) HANGUL SYLLABLE DDAELH +B55C;B55C;1104 1162 11B7;B55C;1104 1162 11B7; # (땜; 땜; 땜; 땜; 땜; ) HANGUL SYLLABLE DDAEM +B55D;B55D;1104 1162 11B8;B55D;1104 1162 11B8; # (땝; 땝; 땝; 땝; 땝; ) HANGUL SYLLABLE DDAEB +B55E;B55E;1104 1162 11B9;B55E;1104 1162 11B9; # (땞; 땞; 땞; 땞; 땞; ) HANGUL SYLLABLE DDAEBS +B55F;B55F;1104 1162 11BA;B55F;1104 1162 11BA; # (땟; 땟; 땟; 땟; 땟; ) HANGUL SYLLABLE DDAES +B560;B560;1104 1162 11BB;B560;1104 1162 11BB; # (땠; 땠; 땠; 땠; 땠; ) HANGUL SYLLABLE DDAESS +B561;B561;1104 1162 11BC;B561;1104 1162 11BC; # (땡; 땡; 땡; 땡; 땡; ) HANGUL SYLLABLE DDAENG +B562;B562;1104 1162 11BD;B562;1104 1162 11BD; # (땢; 땢; 땢; 땢; 땢; ) HANGUL SYLLABLE DDAEJ +B563;B563;1104 1162 11BE;B563;1104 1162 11BE; # (땣; 땣; 땣; 땣; 땣; ) HANGUL SYLLABLE DDAEC +B564;B564;1104 1162 11BF;B564;1104 1162 11BF; # (땤; 땤; 땤; 땤; 땤; ) HANGUL SYLLABLE DDAEK +B565;B565;1104 1162 11C0;B565;1104 1162 11C0; # (땥; 땥; 땥; 땥; 땥; ) HANGUL SYLLABLE DDAET +B566;B566;1104 1162 11C1;B566;1104 1162 11C1; # (땦; 땦; 땦; 땦; 땦; ) HANGUL SYLLABLE DDAEP +B567;B567;1104 1162 11C2;B567;1104 1162 11C2; # (땧; 땧; 땧; 땧; 땧; ) HANGUL SYLLABLE DDAEH +B568;B568;1104 1163;B568;1104 1163; # (땨; 땨; 땨; 땨; 땨; ) HANGUL SYLLABLE DDYA +B569;B569;1104 1163 11A8;B569;1104 1163 11A8; # (땩; 땩; 땩; 땩; 땩; ) HANGUL SYLLABLE DDYAG +B56A;B56A;1104 1163 11A9;B56A;1104 1163 11A9; # (땪; 땪; 땪; 땪; 땪; ) HANGUL SYLLABLE DDYAGG +B56B;B56B;1104 1163 11AA;B56B;1104 1163 11AA; # (땫; 땫; 땫; 땫; 땫; ) HANGUL SYLLABLE DDYAGS +B56C;B56C;1104 1163 11AB;B56C;1104 1163 11AB; # (땬; 땬; 땬; 땬; 땬; ) HANGUL SYLLABLE DDYAN +B56D;B56D;1104 1163 11AC;B56D;1104 1163 11AC; # (땭; 땭; 땭; 땭; 땭; ) HANGUL SYLLABLE DDYANJ +B56E;B56E;1104 1163 11AD;B56E;1104 1163 11AD; # (땮; 땮; 땮; 땮; 땮; ) HANGUL SYLLABLE DDYANH +B56F;B56F;1104 1163 11AE;B56F;1104 1163 11AE; # (땯; 땯; 땯; 땯; 땯; ) HANGUL SYLLABLE DDYAD +B570;B570;1104 1163 11AF;B570;1104 1163 11AF; # (땰; 땰; 땰; 땰; 땰; ) HANGUL SYLLABLE DDYAL +B571;B571;1104 1163 11B0;B571;1104 1163 11B0; # (땱; 땱; 땱; 땱; 땱; ) HANGUL SYLLABLE DDYALG +B572;B572;1104 1163 11B1;B572;1104 1163 11B1; # (땲; 땲; 땲; 땲; 땲; ) HANGUL SYLLABLE DDYALM +B573;B573;1104 1163 11B2;B573;1104 1163 11B2; # (땳; 땳; 땳; 땳; 땳; ) HANGUL SYLLABLE DDYALB +B574;B574;1104 1163 11B3;B574;1104 1163 11B3; # (땴; 땴; 땴; 땴; 땴; ) HANGUL SYLLABLE DDYALS +B575;B575;1104 1163 11B4;B575;1104 1163 11B4; # (땵; 땵; 땵; 땵; 땵; ) HANGUL SYLLABLE DDYALT +B576;B576;1104 1163 11B5;B576;1104 1163 11B5; # (땶; 땶; 땶; 땶; 땶; ) HANGUL SYLLABLE DDYALP +B577;B577;1104 1163 11B6;B577;1104 1163 11B6; # (땷; 땷; 땷; 땷; 땷; ) HANGUL SYLLABLE DDYALH +B578;B578;1104 1163 11B7;B578;1104 1163 11B7; # (땸; 땸; 땸; 땸; 땸; ) HANGUL SYLLABLE DDYAM +B579;B579;1104 1163 11B8;B579;1104 1163 11B8; # (땹; 땹; 땹; 땹; 땹; ) HANGUL SYLLABLE DDYAB +B57A;B57A;1104 1163 11B9;B57A;1104 1163 11B9; # (땺; 땺; 땺; 땺; 땺; ) HANGUL SYLLABLE DDYABS +B57B;B57B;1104 1163 11BA;B57B;1104 1163 11BA; # (땻; 땻; 땻; 땻; 땻; ) HANGUL SYLLABLE DDYAS +B57C;B57C;1104 1163 11BB;B57C;1104 1163 11BB; # (땼; 땼; 땼; 땼; 땼; ) HANGUL SYLLABLE DDYASS +B57D;B57D;1104 1163 11BC;B57D;1104 1163 11BC; # (땽; 땽; 땽; 땽; 땽; ) HANGUL SYLLABLE DDYANG +B57E;B57E;1104 1163 11BD;B57E;1104 1163 11BD; # (땾; 땾; 땾; 땾; 땾; ) HANGUL SYLLABLE DDYAJ +B57F;B57F;1104 1163 11BE;B57F;1104 1163 11BE; # (땿; 땿; 땿; 땿; 땿; ) HANGUL SYLLABLE DDYAC +B580;B580;1104 1163 11BF;B580;1104 1163 11BF; # (떀; 떀; 떀; 떀; 떀; ) HANGUL SYLLABLE DDYAK +B581;B581;1104 1163 11C0;B581;1104 1163 11C0; # (떁; 떁; 떁; 떁; 떁; ) HANGUL SYLLABLE DDYAT +B582;B582;1104 1163 11C1;B582;1104 1163 11C1; # (떂; 떂; 떂; 떂; 떂; ) HANGUL SYLLABLE DDYAP +B583;B583;1104 1163 11C2;B583;1104 1163 11C2; # (떃; 떃; 떃; 떃; 떃; ) HANGUL SYLLABLE DDYAH +B584;B584;1104 1164;B584;1104 1164; # (떄; 떄; 떄; 떄; 떄; ) HANGUL SYLLABLE DDYAE +B585;B585;1104 1164 11A8;B585;1104 1164 11A8; # (떅; 떅; 떅; 떅; 떅; ) HANGUL SYLLABLE DDYAEG +B586;B586;1104 1164 11A9;B586;1104 1164 11A9; # (떆; 떆; 떆; 떆; 떆; ) HANGUL SYLLABLE DDYAEGG +B587;B587;1104 1164 11AA;B587;1104 1164 11AA; # (떇; 떇; 떇; 떇; 떇; ) HANGUL SYLLABLE DDYAEGS +B588;B588;1104 1164 11AB;B588;1104 1164 11AB; # (떈; 떈; 떈; 떈; 떈; ) HANGUL SYLLABLE DDYAEN +B589;B589;1104 1164 11AC;B589;1104 1164 11AC; # (떉; 떉; 떉; 떉; 떉; ) HANGUL SYLLABLE DDYAENJ +B58A;B58A;1104 1164 11AD;B58A;1104 1164 11AD; # (떊; 떊; 떊; 떊; 떊; ) HANGUL SYLLABLE DDYAENH +B58B;B58B;1104 1164 11AE;B58B;1104 1164 11AE; # (떋; 떋; 떋; 떋; 떋; ) HANGUL SYLLABLE DDYAED +B58C;B58C;1104 1164 11AF;B58C;1104 1164 11AF; # (떌; 떌; 떌; 떌; 떌; ) HANGUL SYLLABLE DDYAEL +B58D;B58D;1104 1164 11B0;B58D;1104 1164 11B0; # (떍; 떍; 떍; 떍; 떍; ) HANGUL SYLLABLE DDYAELG +B58E;B58E;1104 1164 11B1;B58E;1104 1164 11B1; # (떎; 떎; 떎; 떎; 떎; ) HANGUL SYLLABLE DDYAELM +B58F;B58F;1104 1164 11B2;B58F;1104 1164 11B2; # (떏; 떏; 떏; 떏; 떏; ) HANGUL SYLLABLE DDYAELB +B590;B590;1104 1164 11B3;B590;1104 1164 11B3; # (떐; 떐; 떐; 떐; 떐; ) HANGUL SYLLABLE DDYAELS +B591;B591;1104 1164 11B4;B591;1104 1164 11B4; # (떑; 떑; 떑; 떑; 떑; ) HANGUL SYLLABLE DDYAELT +B592;B592;1104 1164 11B5;B592;1104 1164 11B5; # (떒; 떒; 떒; 떒; 떒; ) HANGUL SYLLABLE DDYAELP +B593;B593;1104 1164 11B6;B593;1104 1164 11B6; # (떓; 떓; 떓; 떓; 떓; ) HANGUL SYLLABLE DDYAELH +B594;B594;1104 1164 11B7;B594;1104 1164 11B7; # (떔; 떔; 떔; 떔; 떔; ) HANGUL SYLLABLE DDYAEM +B595;B595;1104 1164 11B8;B595;1104 1164 11B8; # (떕; 떕; 떕; 떕; 떕; ) HANGUL SYLLABLE DDYAEB +B596;B596;1104 1164 11B9;B596;1104 1164 11B9; # (떖; 떖; 떖; 떖; 떖; ) HANGUL SYLLABLE DDYAEBS +B597;B597;1104 1164 11BA;B597;1104 1164 11BA; # (떗; 떗; 떗; 떗; 떗; ) HANGUL SYLLABLE DDYAES +B598;B598;1104 1164 11BB;B598;1104 1164 11BB; # (떘; 떘; 떘; 떘; 떘; ) HANGUL SYLLABLE DDYAESS +B599;B599;1104 1164 11BC;B599;1104 1164 11BC; # (떙; 떙; 떙; 떙; 떙; ) HANGUL SYLLABLE DDYAENG +B59A;B59A;1104 1164 11BD;B59A;1104 1164 11BD; # (떚; 떚; 떚; 떚; 떚; ) HANGUL SYLLABLE DDYAEJ +B59B;B59B;1104 1164 11BE;B59B;1104 1164 11BE; # (떛; 떛; 떛; 떛; 떛; ) HANGUL SYLLABLE DDYAEC +B59C;B59C;1104 1164 11BF;B59C;1104 1164 11BF; # (떜; 떜; 떜; 떜; 떜; ) HANGUL SYLLABLE DDYAEK +B59D;B59D;1104 1164 11C0;B59D;1104 1164 11C0; # (떝; 떝; 떝; 떝; 떝; ) HANGUL SYLLABLE DDYAET +B59E;B59E;1104 1164 11C1;B59E;1104 1164 11C1; # (떞; 떞; 떞; 떞; 떞; ) HANGUL SYLLABLE DDYAEP +B59F;B59F;1104 1164 11C2;B59F;1104 1164 11C2; # (떟; 떟; 떟; 떟; 떟; ) HANGUL SYLLABLE DDYAEH +B5A0;B5A0;1104 1165;B5A0;1104 1165; # (떠; 떠; 떠; 떠; 떠; ) HANGUL SYLLABLE DDEO +B5A1;B5A1;1104 1165 11A8;B5A1;1104 1165 11A8; # (떡; 떡; 떡; 떡; 떡; ) HANGUL SYLLABLE DDEOG +B5A2;B5A2;1104 1165 11A9;B5A2;1104 1165 11A9; # (떢; 떢; 떢; 떢; 떢; ) HANGUL SYLLABLE DDEOGG +B5A3;B5A3;1104 1165 11AA;B5A3;1104 1165 11AA; # (떣; 떣; 떣; 떣; 떣; ) HANGUL SYLLABLE DDEOGS +B5A4;B5A4;1104 1165 11AB;B5A4;1104 1165 11AB; # (떤; 떤; 떤; 떤; 떤; ) HANGUL SYLLABLE DDEON +B5A5;B5A5;1104 1165 11AC;B5A5;1104 1165 11AC; # (떥; 떥; 떥; 떥; 떥; ) HANGUL SYLLABLE DDEONJ +B5A6;B5A6;1104 1165 11AD;B5A6;1104 1165 11AD; # (떦; 떦; 떦; 떦; 떦; ) HANGUL SYLLABLE DDEONH +B5A7;B5A7;1104 1165 11AE;B5A7;1104 1165 11AE; # (떧; 떧; 떧; 떧; 떧; ) HANGUL SYLLABLE DDEOD +B5A8;B5A8;1104 1165 11AF;B5A8;1104 1165 11AF; # (떨; 떨; 떨; 떨; 떨; ) HANGUL SYLLABLE DDEOL +B5A9;B5A9;1104 1165 11B0;B5A9;1104 1165 11B0; # (떩; 떩; 떩; 떩; 떩; ) HANGUL SYLLABLE DDEOLG +B5AA;B5AA;1104 1165 11B1;B5AA;1104 1165 11B1; # (떪; 떪; 떪; 떪; 떪; ) HANGUL SYLLABLE DDEOLM +B5AB;B5AB;1104 1165 11B2;B5AB;1104 1165 11B2; # (떫; 떫; 떫; 떫; 떫; ) HANGUL SYLLABLE DDEOLB +B5AC;B5AC;1104 1165 11B3;B5AC;1104 1165 11B3; # (떬; 떬; 떬; 떬; 떬; ) HANGUL SYLLABLE DDEOLS +B5AD;B5AD;1104 1165 11B4;B5AD;1104 1165 11B4; # (떭; 떭; 떭; 떭; 떭; ) HANGUL SYLLABLE DDEOLT +B5AE;B5AE;1104 1165 11B5;B5AE;1104 1165 11B5; # (떮; 떮; 떮; 떮; 떮; ) HANGUL SYLLABLE DDEOLP +B5AF;B5AF;1104 1165 11B6;B5AF;1104 1165 11B6; # (떯; 떯; 떯; 떯; 떯; ) HANGUL SYLLABLE DDEOLH +B5B0;B5B0;1104 1165 11B7;B5B0;1104 1165 11B7; # (떰; 떰; 떰; 떰; 떰; ) HANGUL SYLLABLE DDEOM +B5B1;B5B1;1104 1165 11B8;B5B1;1104 1165 11B8; # (떱; 떱; 떱; 떱; 떱; ) HANGUL SYLLABLE DDEOB +B5B2;B5B2;1104 1165 11B9;B5B2;1104 1165 11B9; # (떲; 떲; 떲; 떲; 떲; ) HANGUL SYLLABLE DDEOBS +B5B3;B5B3;1104 1165 11BA;B5B3;1104 1165 11BA; # (떳; 떳; 떳; 떳; 떳; ) HANGUL SYLLABLE DDEOS +B5B4;B5B4;1104 1165 11BB;B5B4;1104 1165 11BB; # (떴; 떴; 떴; 떴; 떴; ) HANGUL SYLLABLE DDEOSS +B5B5;B5B5;1104 1165 11BC;B5B5;1104 1165 11BC; # (떵; 떵; 떵; 떵; 떵; ) HANGUL SYLLABLE DDEONG +B5B6;B5B6;1104 1165 11BD;B5B6;1104 1165 11BD; # (떶; 떶; 떶; 떶; 떶; ) HANGUL SYLLABLE DDEOJ +B5B7;B5B7;1104 1165 11BE;B5B7;1104 1165 11BE; # (떷; 떷; 떷; 떷; 떷; ) HANGUL SYLLABLE DDEOC +B5B8;B5B8;1104 1165 11BF;B5B8;1104 1165 11BF; # (떸; 떸; 떸; 떸; 떸; ) HANGUL SYLLABLE DDEOK +B5B9;B5B9;1104 1165 11C0;B5B9;1104 1165 11C0; # (떹; 떹; 떹; 떹; 떹; ) HANGUL SYLLABLE DDEOT +B5BA;B5BA;1104 1165 11C1;B5BA;1104 1165 11C1; # (떺; 떺; 떺; 떺; 떺; ) HANGUL SYLLABLE DDEOP +B5BB;B5BB;1104 1165 11C2;B5BB;1104 1165 11C2; # (떻; 떻; 떻; 떻; 떻; ) HANGUL SYLLABLE DDEOH +B5BC;B5BC;1104 1166;B5BC;1104 1166; # (떼; 떼; 떼; 떼; 떼; ) HANGUL SYLLABLE DDE +B5BD;B5BD;1104 1166 11A8;B5BD;1104 1166 11A8; # (떽; 떽; 떽; 떽; 떽; ) HANGUL SYLLABLE DDEG +B5BE;B5BE;1104 1166 11A9;B5BE;1104 1166 11A9; # (떾; 떾; 떾; 떾; 떾; ) HANGUL SYLLABLE DDEGG +B5BF;B5BF;1104 1166 11AA;B5BF;1104 1166 11AA; # (떿; 떿; 떿; 떿; 떿; ) HANGUL SYLLABLE DDEGS +B5C0;B5C0;1104 1166 11AB;B5C0;1104 1166 11AB; # (뗀; 뗀; 뗀; 뗀; 뗀; ) HANGUL SYLLABLE DDEN +B5C1;B5C1;1104 1166 11AC;B5C1;1104 1166 11AC; # (뗁; 뗁; 뗁; 뗁; 뗁; ) HANGUL SYLLABLE DDENJ +B5C2;B5C2;1104 1166 11AD;B5C2;1104 1166 11AD; # (뗂; 뗂; 뗂; 뗂; 뗂; ) HANGUL SYLLABLE DDENH +B5C3;B5C3;1104 1166 11AE;B5C3;1104 1166 11AE; # (뗃; 뗃; 뗃; 뗃; 뗃; ) HANGUL SYLLABLE DDED +B5C4;B5C4;1104 1166 11AF;B5C4;1104 1166 11AF; # (뗄; 뗄; 뗄; 뗄; 뗄; ) HANGUL SYLLABLE DDEL +B5C5;B5C5;1104 1166 11B0;B5C5;1104 1166 11B0; # (뗅; 뗅; 뗅; 뗅; 뗅; ) HANGUL SYLLABLE DDELG +B5C6;B5C6;1104 1166 11B1;B5C6;1104 1166 11B1; # (뗆; 뗆; 뗆; 뗆; 뗆; ) HANGUL SYLLABLE DDELM +B5C7;B5C7;1104 1166 11B2;B5C7;1104 1166 11B2; # (뗇; 뗇; 뗇; 뗇; 뗇; ) HANGUL SYLLABLE DDELB +B5C8;B5C8;1104 1166 11B3;B5C8;1104 1166 11B3; # (뗈; 뗈; 뗈; 뗈; 뗈; ) HANGUL SYLLABLE DDELS +B5C9;B5C9;1104 1166 11B4;B5C9;1104 1166 11B4; # (뗉; 뗉; 뗉; 뗉; 뗉; ) HANGUL SYLLABLE DDELT +B5CA;B5CA;1104 1166 11B5;B5CA;1104 1166 11B5; # (뗊; 뗊; 뗊; 뗊; 뗊; ) HANGUL SYLLABLE DDELP +B5CB;B5CB;1104 1166 11B6;B5CB;1104 1166 11B6; # (뗋; 뗋; 뗋; 뗋; 뗋; ) HANGUL SYLLABLE DDELH +B5CC;B5CC;1104 1166 11B7;B5CC;1104 1166 11B7; # (뗌; 뗌; 뗌; 뗌; 뗌; ) HANGUL SYLLABLE DDEM +B5CD;B5CD;1104 1166 11B8;B5CD;1104 1166 11B8; # (뗍; 뗍; 뗍; 뗍; 뗍; ) HANGUL SYLLABLE DDEB +B5CE;B5CE;1104 1166 11B9;B5CE;1104 1166 11B9; # (뗎; 뗎; 뗎; 뗎; 뗎; ) HANGUL SYLLABLE DDEBS +B5CF;B5CF;1104 1166 11BA;B5CF;1104 1166 11BA; # (뗏; 뗏; 뗏; 뗏; 뗏; ) HANGUL SYLLABLE DDES +B5D0;B5D0;1104 1166 11BB;B5D0;1104 1166 11BB; # (뗐; 뗐; 뗐; 뗐; 뗐; ) HANGUL SYLLABLE DDESS +B5D1;B5D1;1104 1166 11BC;B5D1;1104 1166 11BC; # (뗑; 뗑; 뗑; 뗑; 뗑; ) HANGUL SYLLABLE DDENG +B5D2;B5D2;1104 1166 11BD;B5D2;1104 1166 11BD; # (뗒; 뗒; 뗒; 뗒; 뗒; ) HANGUL SYLLABLE DDEJ +B5D3;B5D3;1104 1166 11BE;B5D3;1104 1166 11BE; # (뗓; 뗓; 뗓; 뗓; 뗓; ) HANGUL SYLLABLE DDEC +B5D4;B5D4;1104 1166 11BF;B5D4;1104 1166 11BF; # (뗔; 뗔; 뗔; 뗔; 뗔; ) HANGUL SYLLABLE DDEK +B5D5;B5D5;1104 1166 11C0;B5D5;1104 1166 11C0; # (뗕; 뗕; 뗕; 뗕; 뗕; ) HANGUL SYLLABLE DDET +B5D6;B5D6;1104 1166 11C1;B5D6;1104 1166 11C1; # (뗖; 뗖; 뗖; 뗖; 뗖; ) HANGUL SYLLABLE DDEP +B5D7;B5D7;1104 1166 11C2;B5D7;1104 1166 11C2; # (뗗; 뗗; 뗗; 뗗; 뗗; ) HANGUL SYLLABLE DDEH +B5D8;B5D8;1104 1167;B5D8;1104 1167; # (뗘; 뗘; 뗘; 뗘; 뗘; ) HANGUL SYLLABLE DDYEO +B5D9;B5D9;1104 1167 11A8;B5D9;1104 1167 11A8; # (뗙; 뗙; 뗙; 뗙; 뗙; ) HANGUL SYLLABLE DDYEOG +B5DA;B5DA;1104 1167 11A9;B5DA;1104 1167 11A9; # (뗚; 뗚; 뗚; 뗚; 뗚; ) HANGUL SYLLABLE DDYEOGG +B5DB;B5DB;1104 1167 11AA;B5DB;1104 1167 11AA; # (뗛; 뗛; 뗛; 뗛; 뗛; ) HANGUL SYLLABLE DDYEOGS +B5DC;B5DC;1104 1167 11AB;B5DC;1104 1167 11AB; # (뗜; 뗜; 뗜; 뗜; 뗜; ) HANGUL SYLLABLE DDYEON +B5DD;B5DD;1104 1167 11AC;B5DD;1104 1167 11AC; # (뗝; 뗝; 뗝; 뗝; 뗝; ) HANGUL SYLLABLE DDYEONJ +B5DE;B5DE;1104 1167 11AD;B5DE;1104 1167 11AD; # (뗞; 뗞; 뗞; 뗞; 뗞; ) HANGUL SYLLABLE DDYEONH +B5DF;B5DF;1104 1167 11AE;B5DF;1104 1167 11AE; # (뗟; 뗟; 뗟; 뗟; 뗟; ) HANGUL SYLLABLE DDYEOD +B5E0;B5E0;1104 1167 11AF;B5E0;1104 1167 11AF; # (뗠; 뗠; 뗠; 뗠; 뗠; ) HANGUL SYLLABLE DDYEOL +B5E1;B5E1;1104 1167 11B0;B5E1;1104 1167 11B0; # (뗡; 뗡; 뗡; 뗡; 뗡; ) HANGUL SYLLABLE DDYEOLG +B5E2;B5E2;1104 1167 11B1;B5E2;1104 1167 11B1; # (뗢; 뗢; 뗢; 뗢; 뗢; ) HANGUL SYLLABLE DDYEOLM +B5E3;B5E3;1104 1167 11B2;B5E3;1104 1167 11B2; # (뗣; 뗣; 뗣; 뗣; 뗣; ) HANGUL SYLLABLE DDYEOLB +B5E4;B5E4;1104 1167 11B3;B5E4;1104 1167 11B3; # (뗤; 뗤; 뗤; 뗤; 뗤; ) HANGUL SYLLABLE DDYEOLS +B5E5;B5E5;1104 1167 11B4;B5E5;1104 1167 11B4; # (뗥; 뗥; 뗥; 뗥; 뗥; ) HANGUL SYLLABLE DDYEOLT +B5E6;B5E6;1104 1167 11B5;B5E6;1104 1167 11B5; # (뗦; 뗦; 뗦; 뗦; 뗦; ) HANGUL SYLLABLE DDYEOLP +B5E7;B5E7;1104 1167 11B6;B5E7;1104 1167 11B6; # (뗧; 뗧; 뗧; 뗧; 뗧; ) HANGUL SYLLABLE DDYEOLH +B5E8;B5E8;1104 1167 11B7;B5E8;1104 1167 11B7; # (뗨; 뗨; 뗨; 뗨; 뗨; ) HANGUL SYLLABLE DDYEOM +B5E9;B5E9;1104 1167 11B8;B5E9;1104 1167 11B8; # (뗩; 뗩; 뗩; 뗩; 뗩; ) HANGUL SYLLABLE DDYEOB +B5EA;B5EA;1104 1167 11B9;B5EA;1104 1167 11B9; # (뗪; 뗪; 뗪; 뗪; 뗪; ) HANGUL SYLLABLE DDYEOBS +B5EB;B5EB;1104 1167 11BA;B5EB;1104 1167 11BA; # (뗫; 뗫; 뗫; 뗫; 뗫; ) HANGUL SYLLABLE DDYEOS +B5EC;B5EC;1104 1167 11BB;B5EC;1104 1167 11BB; # (뗬; 뗬; 뗬; 뗬; 뗬; ) HANGUL SYLLABLE DDYEOSS +B5ED;B5ED;1104 1167 11BC;B5ED;1104 1167 11BC; # (뗭; 뗭; 뗭; 뗭; 뗭; ) HANGUL SYLLABLE DDYEONG +B5EE;B5EE;1104 1167 11BD;B5EE;1104 1167 11BD; # (뗮; 뗮; 뗮; 뗮; 뗮; ) HANGUL SYLLABLE DDYEOJ +B5EF;B5EF;1104 1167 11BE;B5EF;1104 1167 11BE; # (뗯; 뗯; 뗯; 뗯; 뗯; ) HANGUL SYLLABLE DDYEOC +B5F0;B5F0;1104 1167 11BF;B5F0;1104 1167 11BF; # (뗰; 뗰; 뗰; 뗰; 뗰; ) HANGUL SYLLABLE DDYEOK +B5F1;B5F1;1104 1167 11C0;B5F1;1104 1167 11C0; # (뗱; 뗱; 뗱; 뗱; 뗱; ) HANGUL SYLLABLE DDYEOT +B5F2;B5F2;1104 1167 11C1;B5F2;1104 1167 11C1; # (뗲; 뗲; 뗲; 뗲; 뗲; ) HANGUL SYLLABLE DDYEOP +B5F3;B5F3;1104 1167 11C2;B5F3;1104 1167 11C2; # (뗳; 뗳; 뗳; 뗳; 뗳; ) HANGUL SYLLABLE DDYEOH +B5F4;B5F4;1104 1168;B5F4;1104 1168; # (뗴; 뗴; 뗴; 뗴; 뗴; ) HANGUL SYLLABLE DDYE +B5F5;B5F5;1104 1168 11A8;B5F5;1104 1168 11A8; # (뗵; 뗵; 뗵; 뗵; 뗵; ) HANGUL SYLLABLE DDYEG +B5F6;B5F6;1104 1168 11A9;B5F6;1104 1168 11A9; # (뗶; 뗶; 뗶; 뗶; 뗶; ) HANGUL SYLLABLE DDYEGG +B5F7;B5F7;1104 1168 11AA;B5F7;1104 1168 11AA; # (뗷; 뗷; 뗷; 뗷; 뗷; ) HANGUL SYLLABLE DDYEGS +B5F8;B5F8;1104 1168 11AB;B5F8;1104 1168 11AB; # (뗸; 뗸; 뗸; 뗸; 뗸; ) HANGUL SYLLABLE DDYEN +B5F9;B5F9;1104 1168 11AC;B5F9;1104 1168 11AC; # (뗹; 뗹; 뗹; 뗹; 뗹; ) HANGUL SYLLABLE DDYENJ +B5FA;B5FA;1104 1168 11AD;B5FA;1104 1168 11AD; # (뗺; 뗺; 뗺; 뗺; 뗺; ) HANGUL SYLLABLE DDYENH +B5FB;B5FB;1104 1168 11AE;B5FB;1104 1168 11AE; # (뗻; 뗻; 뗻; 뗻; 뗻; ) HANGUL SYLLABLE DDYED +B5FC;B5FC;1104 1168 11AF;B5FC;1104 1168 11AF; # (뗼; 뗼; 뗼; 뗼; 뗼; ) HANGUL SYLLABLE DDYEL +B5FD;B5FD;1104 1168 11B0;B5FD;1104 1168 11B0; # (뗽; 뗽; 뗽; 뗽; 뗽; ) HANGUL SYLLABLE DDYELG +B5FE;B5FE;1104 1168 11B1;B5FE;1104 1168 11B1; # (뗾; 뗾; 뗾; 뗾; 뗾; ) HANGUL SYLLABLE DDYELM +B5FF;B5FF;1104 1168 11B2;B5FF;1104 1168 11B2; # (뗿; 뗿; 뗿; 뗿; 뗿; ) HANGUL SYLLABLE DDYELB +B600;B600;1104 1168 11B3;B600;1104 1168 11B3; # (똀; 똀; 똀; 똀; 똀; ) HANGUL SYLLABLE DDYELS +B601;B601;1104 1168 11B4;B601;1104 1168 11B4; # (똁; 똁; 똁; 똁; 똁; ) HANGUL SYLLABLE DDYELT +B602;B602;1104 1168 11B5;B602;1104 1168 11B5; # (똂; 똂; 똂; 똂; 똂; ) HANGUL SYLLABLE DDYELP +B603;B603;1104 1168 11B6;B603;1104 1168 11B6; # (똃; 똃; 똃; 똃; 똃; ) HANGUL SYLLABLE DDYELH +B604;B604;1104 1168 11B7;B604;1104 1168 11B7; # (똄; 똄; 똄; 똄; 똄; ) HANGUL SYLLABLE DDYEM +B605;B605;1104 1168 11B8;B605;1104 1168 11B8; # (똅; 똅; 똅; 똅; 똅; ) HANGUL SYLLABLE DDYEB +B606;B606;1104 1168 11B9;B606;1104 1168 11B9; # (똆; 똆; 똆; 똆; 똆; ) HANGUL SYLLABLE DDYEBS +B607;B607;1104 1168 11BA;B607;1104 1168 11BA; # (똇; 똇; 똇; 똇; 똇; ) HANGUL SYLLABLE DDYES +B608;B608;1104 1168 11BB;B608;1104 1168 11BB; # (똈; 똈; 똈; 똈; 똈; ) HANGUL SYLLABLE DDYESS +B609;B609;1104 1168 11BC;B609;1104 1168 11BC; # (똉; 똉; 똉; 똉; 똉; ) HANGUL SYLLABLE DDYENG +B60A;B60A;1104 1168 11BD;B60A;1104 1168 11BD; # (똊; 똊; 똊; 똊; 똊; ) HANGUL SYLLABLE DDYEJ +B60B;B60B;1104 1168 11BE;B60B;1104 1168 11BE; # (똋; 똋; 똋; 똋; 똋; ) HANGUL SYLLABLE DDYEC +B60C;B60C;1104 1168 11BF;B60C;1104 1168 11BF; # (똌; 똌; 똌; 똌; 똌; ) HANGUL SYLLABLE DDYEK +B60D;B60D;1104 1168 11C0;B60D;1104 1168 11C0; # (똍; 똍; 똍; 똍; 똍; ) HANGUL SYLLABLE DDYET +B60E;B60E;1104 1168 11C1;B60E;1104 1168 11C1; # (똎; 똎; 똎; 똎; 똎; ) HANGUL SYLLABLE DDYEP +B60F;B60F;1104 1168 11C2;B60F;1104 1168 11C2; # (똏; 똏; 똏; 똏; 똏; ) HANGUL SYLLABLE DDYEH +B610;B610;1104 1169;B610;1104 1169; # (또; 또; 또; 또; 또; ) HANGUL SYLLABLE DDO +B611;B611;1104 1169 11A8;B611;1104 1169 11A8; # (똑; 똑; 똑; 똑; 똑; ) HANGUL SYLLABLE DDOG +B612;B612;1104 1169 11A9;B612;1104 1169 11A9; # (똒; 똒; 똒; 똒; 똒; ) HANGUL SYLLABLE DDOGG +B613;B613;1104 1169 11AA;B613;1104 1169 11AA; # (똓; 똓; 똓; 똓; 똓; ) HANGUL SYLLABLE DDOGS +B614;B614;1104 1169 11AB;B614;1104 1169 11AB; # (똔; 똔; 똔; 똔; 똔; ) HANGUL SYLLABLE DDON +B615;B615;1104 1169 11AC;B615;1104 1169 11AC; # (똕; 똕; 똕; 똕; 똕; ) HANGUL SYLLABLE DDONJ +B616;B616;1104 1169 11AD;B616;1104 1169 11AD; # (똖; 똖; 똖; 똖; 똖; ) HANGUL SYLLABLE DDONH +B617;B617;1104 1169 11AE;B617;1104 1169 11AE; # (똗; 똗; 똗; 똗; 똗; ) HANGUL SYLLABLE DDOD +B618;B618;1104 1169 11AF;B618;1104 1169 11AF; # (똘; 똘; 똘; 똘; 똘; ) HANGUL SYLLABLE DDOL +B619;B619;1104 1169 11B0;B619;1104 1169 11B0; # (똙; 똙; 똙; 똙; 똙; ) HANGUL SYLLABLE DDOLG +B61A;B61A;1104 1169 11B1;B61A;1104 1169 11B1; # (똚; 똚; 똚; 똚; 똚; ) HANGUL SYLLABLE DDOLM +B61B;B61B;1104 1169 11B2;B61B;1104 1169 11B2; # (똛; 똛; 똛; 똛; 똛; ) HANGUL SYLLABLE DDOLB +B61C;B61C;1104 1169 11B3;B61C;1104 1169 11B3; # (똜; 똜; 똜; 똜; 똜; ) HANGUL SYLLABLE DDOLS +B61D;B61D;1104 1169 11B4;B61D;1104 1169 11B4; # (똝; 똝; 똝; 똝; 똝; ) HANGUL SYLLABLE DDOLT +B61E;B61E;1104 1169 11B5;B61E;1104 1169 11B5; # (똞; 똞; 똞; 똞; 똞; ) HANGUL SYLLABLE DDOLP +B61F;B61F;1104 1169 11B6;B61F;1104 1169 11B6; # (똟; 똟; 똟; 똟; 똟; ) HANGUL SYLLABLE DDOLH +B620;B620;1104 1169 11B7;B620;1104 1169 11B7; # (똠; 똠; 똠; 똠; 똠; ) HANGUL SYLLABLE DDOM +B621;B621;1104 1169 11B8;B621;1104 1169 11B8; # (똡; 똡; 똡; 똡; 똡; ) HANGUL SYLLABLE DDOB +B622;B622;1104 1169 11B9;B622;1104 1169 11B9; # (똢; 똢; 똢; 똢; 똢; ) HANGUL SYLLABLE DDOBS +B623;B623;1104 1169 11BA;B623;1104 1169 11BA; # (똣; 똣; 똣; 똣; 똣; ) HANGUL SYLLABLE DDOS +B624;B624;1104 1169 11BB;B624;1104 1169 11BB; # (똤; 똤; 똤; 똤; 똤; ) HANGUL SYLLABLE DDOSS +B625;B625;1104 1169 11BC;B625;1104 1169 11BC; # (똥; 똥; 똥; 똥; 똥; ) HANGUL SYLLABLE DDONG +B626;B626;1104 1169 11BD;B626;1104 1169 11BD; # (똦; 똦; 똦; 똦; 똦; ) HANGUL SYLLABLE DDOJ +B627;B627;1104 1169 11BE;B627;1104 1169 11BE; # (똧; 똧; 똧; 똧; 똧; ) HANGUL SYLLABLE DDOC +B628;B628;1104 1169 11BF;B628;1104 1169 11BF; # (똨; 똨; 똨; 똨; 똨; ) HANGUL SYLLABLE DDOK +B629;B629;1104 1169 11C0;B629;1104 1169 11C0; # (똩; 똩; 똩; 똩; 똩; ) HANGUL SYLLABLE DDOT +B62A;B62A;1104 1169 11C1;B62A;1104 1169 11C1; # (똪; 똪; 똪; 똪; 똪; ) HANGUL SYLLABLE DDOP +B62B;B62B;1104 1169 11C2;B62B;1104 1169 11C2; # (똫; 똫; 똫; 똫; 똫; ) HANGUL SYLLABLE DDOH +B62C;B62C;1104 116A;B62C;1104 116A; # (똬; 똬; 똬; 똬; 똬; ) HANGUL SYLLABLE DDWA +B62D;B62D;1104 116A 11A8;B62D;1104 116A 11A8; # (똭; 똭; 똭; 똭; 똭; ) HANGUL SYLLABLE DDWAG +B62E;B62E;1104 116A 11A9;B62E;1104 116A 11A9; # (똮; 똮; 똮; 똮; 똮; ) HANGUL SYLLABLE DDWAGG +B62F;B62F;1104 116A 11AA;B62F;1104 116A 11AA; # (똯; 똯; 똯; 똯; 똯; ) HANGUL SYLLABLE DDWAGS +B630;B630;1104 116A 11AB;B630;1104 116A 11AB; # (똰; 똰; 똰; 똰; 똰; ) HANGUL SYLLABLE DDWAN +B631;B631;1104 116A 11AC;B631;1104 116A 11AC; # (똱; 똱; 똱; 똱; 똱; ) HANGUL SYLLABLE DDWANJ +B632;B632;1104 116A 11AD;B632;1104 116A 11AD; # (똲; 똲; 똲; 똲; 똲; ) HANGUL SYLLABLE DDWANH +B633;B633;1104 116A 11AE;B633;1104 116A 11AE; # (똳; 똳; 똳; 똳; 똳; ) HANGUL SYLLABLE DDWAD +B634;B634;1104 116A 11AF;B634;1104 116A 11AF; # (똴; 똴; 똴; 똴; 똴; ) HANGUL SYLLABLE DDWAL +B635;B635;1104 116A 11B0;B635;1104 116A 11B0; # (똵; 똵; 똵; 똵; 똵; ) HANGUL SYLLABLE DDWALG +B636;B636;1104 116A 11B1;B636;1104 116A 11B1; # (똶; 똶; 똶; 똶; 똶; ) HANGUL SYLLABLE DDWALM +B637;B637;1104 116A 11B2;B637;1104 116A 11B2; # (똷; 똷; 똷; 똷; 똷; ) HANGUL SYLLABLE DDWALB +B638;B638;1104 116A 11B3;B638;1104 116A 11B3; # (똸; 똸; 똸; 똸; 똸; ) HANGUL SYLLABLE DDWALS +B639;B639;1104 116A 11B4;B639;1104 116A 11B4; # (똹; 똹; 똹; 똹; 똹; ) HANGUL SYLLABLE DDWALT +B63A;B63A;1104 116A 11B5;B63A;1104 116A 11B5; # (똺; 똺; 똺; 똺; 똺; ) HANGUL SYLLABLE DDWALP +B63B;B63B;1104 116A 11B6;B63B;1104 116A 11B6; # (똻; 똻; 똻; 똻; 똻; ) HANGUL SYLLABLE DDWALH +B63C;B63C;1104 116A 11B7;B63C;1104 116A 11B7; # (똼; 똼; 똼; 똼; 똼; ) HANGUL SYLLABLE DDWAM +B63D;B63D;1104 116A 11B8;B63D;1104 116A 11B8; # (똽; 똽; 똽; 똽; 똽; ) HANGUL SYLLABLE DDWAB +B63E;B63E;1104 116A 11B9;B63E;1104 116A 11B9; # (똾; 똾; 똾; 똾; 똾; ) HANGUL SYLLABLE DDWABS +B63F;B63F;1104 116A 11BA;B63F;1104 116A 11BA; # (똿; 똿; 똿; 똿; 똿; ) HANGUL SYLLABLE DDWAS +B640;B640;1104 116A 11BB;B640;1104 116A 11BB; # (뙀; 뙀; 뙀; 뙀; 뙀; ) HANGUL SYLLABLE DDWASS +B641;B641;1104 116A 11BC;B641;1104 116A 11BC; # (뙁; 뙁; 뙁; 뙁; 뙁; ) HANGUL SYLLABLE DDWANG +B642;B642;1104 116A 11BD;B642;1104 116A 11BD; # (뙂; 뙂; 뙂; 뙂; 뙂; ) HANGUL SYLLABLE DDWAJ +B643;B643;1104 116A 11BE;B643;1104 116A 11BE; # (뙃; 뙃; 뙃; 뙃; 뙃; ) HANGUL SYLLABLE DDWAC +B644;B644;1104 116A 11BF;B644;1104 116A 11BF; # (뙄; 뙄; 뙄; 뙄; 뙄; ) HANGUL SYLLABLE DDWAK +B645;B645;1104 116A 11C0;B645;1104 116A 11C0; # (뙅; 뙅; 뙅; 뙅; 뙅; ) HANGUL SYLLABLE DDWAT +B646;B646;1104 116A 11C1;B646;1104 116A 11C1; # (뙆; 뙆; 뙆; 뙆; 뙆; ) HANGUL SYLLABLE DDWAP +B647;B647;1104 116A 11C2;B647;1104 116A 11C2; # (뙇; 뙇; 뙇; 뙇; 뙇; ) HANGUL SYLLABLE DDWAH +B648;B648;1104 116B;B648;1104 116B; # (뙈; 뙈; 뙈; 뙈; 뙈; ) HANGUL SYLLABLE DDWAE +B649;B649;1104 116B 11A8;B649;1104 116B 11A8; # (뙉; 뙉; 뙉; 뙉; 뙉; ) HANGUL SYLLABLE DDWAEG +B64A;B64A;1104 116B 11A9;B64A;1104 116B 11A9; # (뙊; 뙊; 뙊; 뙊; 뙊; ) HANGUL SYLLABLE DDWAEGG +B64B;B64B;1104 116B 11AA;B64B;1104 116B 11AA; # (뙋; 뙋; 뙋; 뙋; 뙋; ) HANGUL SYLLABLE DDWAEGS +B64C;B64C;1104 116B 11AB;B64C;1104 116B 11AB; # (뙌; 뙌; 뙌; 뙌; 뙌; ) HANGUL SYLLABLE DDWAEN +B64D;B64D;1104 116B 11AC;B64D;1104 116B 11AC; # (뙍; 뙍; 뙍; 뙍; 뙍; ) HANGUL SYLLABLE DDWAENJ +B64E;B64E;1104 116B 11AD;B64E;1104 116B 11AD; # (뙎; 뙎; 뙎; 뙎; 뙎; ) HANGUL SYLLABLE DDWAENH +B64F;B64F;1104 116B 11AE;B64F;1104 116B 11AE; # (뙏; 뙏; 뙏; 뙏; 뙏; ) HANGUL SYLLABLE DDWAED +B650;B650;1104 116B 11AF;B650;1104 116B 11AF; # (뙐; 뙐; 뙐; 뙐; 뙐; ) HANGUL SYLLABLE DDWAEL +B651;B651;1104 116B 11B0;B651;1104 116B 11B0; # (뙑; 뙑; 뙑; 뙑; 뙑; ) HANGUL SYLLABLE DDWAELG +B652;B652;1104 116B 11B1;B652;1104 116B 11B1; # (뙒; 뙒; 뙒; 뙒; 뙒; ) HANGUL SYLLABLE DDWAELM +B653;B653;1104 116B 11B2;B653;1104 116B 11B2; # (뙓; 뙓; 뙓; 뙓; 뙓; ) HANGUL SYLLABLE DDWAELB +B654;B654;1104 116B 11B3;B654;1104 116B 11B3; # (뙔; 뙔; 뙔; 뙔; 뙔; ) HANGUL SYLLABLE DDWAELS +B655;B655;1104 116B 11B4;B655;1104 116B 11B4; # (뙕; 뙕; 뙕; 뙕; 뙕; ) HANGUL SYLLABLE DDWAELT +B656;B656;1104 116B 11B5;B656;1104 116B 11B5; # (뙖; 뙖; 뙖; 뙖; 뙖; ) HANGUL SYLLABLE DDWAELP +B657;B657;1104 116B 11B6;B657;1104 116B 11B6; # (뙗; 뙗; 뙗; 뙗; 뙗; ) HANGUL SYLLABLE DDWAELH +B658;B658;1104 116B 11B7;B658;1104 116B 11B7; # (뙘; 뙘; 뙘; 뙘; 뙘; ) HANGUL SYLLABLE DDWAEM +B659;B659;1104 116B 11B8;B659;1104 116B 11B8; # (뙙; 뙙; 뙙; 뙙; 뙙; ) HANGUL SYLLABLE DDWAEB +B65A;B65A;1104 116B 11B9;B65A;1104 116B 11B9; # (뙚; 뙚; 뙚; 뙚; 뙚; ) HANGUL SYLLABLE DDWAEBS +B65B;B65B;1104 116B 11BA;B65B;1104 116B 11BA; # (뙛; 뙛; 뙛; 뙛; 뙛; ) HANGUL SYLLABLE DDWAES +B65C;B65C;1104 116B 11BB;B65C;1104 116B 11BB; # (뙜; 뙜; 뙜; 뙜; 뙜; ) HANGUL SYLLABLE DDWAESS +B65D;B65D;1104 116B 11BC;B65D;1104 116B 11BC; # (뙝; 뙝; 뙝; 뙝; 뙝; ) HANGUL SYLLABLE DDWAENG +B65E;B65E;1104 116B 11BD;B65E;1104 116B 11BD; # (뙞; 뙞; 뙞; 뙞; 뙞; ) HANGUL SYLLABLE DDWAEJ +B65F;B65F;1104 116B 11BE;B65F;1104 116B 11BE; # (뙟; 뙟; 뙟; 뙟; 뙟; ) HANGUL SYLLABLE DDWAEC +B660;B660;1104 116B 11BF;B660;1104 116B 11BF; # (뙠; 뙠; 뙠; 뙠; 뙠; ) HANGUL SYLLABLE DDWAEK +B661;B661;1104 116B 11C0;B661;1104 116B 11C0; # (뙡; 뙡; 뙡; 뙡; 뙡; ) HANGUL SYLLABLE DDWAET +B662;B662;1104 116B 11C1;B662;1104 116B 11C1; # (뙢; 뙢; 뙢; 뙢; 뙢; ) HANGUL SYLLABLE DDWAEP +B663;B663;1104 116B 11C2;B663;1104 116B 11C2; # (뙣; 뙣; 뙣; 뙣; 뙣; ) HANGUL SYLLABLE DDWAEH +B664;B664;1104 116C;B664;1104 116C; # (뙤; 뙤; 뙤; 뙤; 뙤; ) HANGUL SYLLABLE DDOE +B665;B665;1104 116C 11A8;B665;1104 116C 11A8; # (뙥; 뙥; 뙥; 뙥; 뙥; ) HANGUL SYLLABLE DDOEG +B666;B666;1104 116C 11A9;B666;1104 116C 11A9; # (뙦; 뙦; 뙦; 뙦; 뙦; ) HANGUL SYLLABLE DDOEGG +B667;B667;1104 116C 11AA;B667;1104 116C 11AA; # (뙧; 뙧; 뙧; 뙧; 뙧; ) HANGUL SYLLABLE DDOEGS +B668;B668;1104 116C 11AB;B668;1104 116C 11AB; # (뙨; 뙨; 뙨; 뙨; 뙨; ) HANGUL SYLLABLE DDOEN +B669;B669;1104 116C 11AC;B669;1104 116C 11AC; # (뙩; 뙩; 뙩; 뙩; 뙩; ) HANGUL SYLLABLE DDOENJ +B66A;B66A;1104 116C 11AD;B66A;1104 116C 11AD; # (뙪; 뙪; 뙪; 뙪; 뙪; ) HANGUL SYLLABLE DDOENH +B66B;B66B;1104 116C 11AE;B66B;1104 116C 11AE; # (뙫; 뙫; 뙫; 뙫; 뙫; ) HANGUL SYLLABLE DDOED +B66C;B66C;1104 116C 11AF;B66C;1104 116C 11AF; # (뙬; 뙬; 뙬; 뙬; 뙬; ) HANGUL SYLLABLE DDOEL +B66D;B66D;1104 116C 11B0;B66D;1104 116C 11B0; # (뙭; 뙭; 뙭; 뙭; 뙭; ) HANGUL SYLLABLE DDOELG +B66E;B66E;1104 116C 11B1;B66E;1104 116C 11B1; # (뙮; 뙮; 뙮; 뙮; 뙮; ) HANGUL SYLLABLE DDOELM +B66F;B66F;1104 116C 11B2;B66F;1104 116C 11B2; # (뙯; 뙯; 뙯; 뙯; 뙯; ) HANGUL SYLLABLE DDOELB +B670;B670;1104 116C 11B3;B670;1104 116C 11B3; # (뙰; 뙰; 뙰; 뙰; 뙰; ) HANGUL SYLLABLE DDOELS +B671;B671;1104 116C 11B4;B671;1104 116C 11B4; # (뙱; 뙱; 뙱; 뙱; 뙱; ) HANGUL SYLLABLE DDOELT +B672;B672;1104 116C 11B5;B672;1104 116C 11B5; # (뙲; 뙲; 뙲; 뙲; 뙲; ) HANGUL SYLLABLE DDOELP +B673;B673;1104 116C 11B6;B673;1104 116C 11B6; # (뙳; 뙳; 뙳; 뙳; 뙳; ) HANGUL SYLLABLE DDOELH +B674;B674;1104 116C 11B7;B674;1104 116C 11B7; # (뙴; 뙴; 뙴; 뙴; 뙴; ) HANGUL SYLLABLE DDOEM +B675;B675;1104 116C 11B8;B675;1104 116C 11B8; # (뙵; 뙵; 뙵; 뙵; 뙵; ) HANGUL SYLLABLE DDOEB +B676;B676;1104 116C 11B9;B676;1104 116C 11B9; # (뙶; 뙶; 뙶; 뙶; 뙶; ) HANGUL SYLLABLE DDOEBS +B677;B677;1104 116C 11BA;B677;1104 116C 11BA; # (뙷; 뙷; 뙷; 뙷; 뙷; ) HANGUL SYLLABLE DDOES +B678;B678;1104 116C 11BB;B678;1104 116C 11BB; # (뙸; 뙸; 뙸; 뙸; 뙸; ) HANGUL SYLLABLE DDOESS +B679;B679;1104 116C 11BC;B679;1104 116C 11BC; # (뙹; 뙹; 뙹; 뙹; 뙹; ) HANGUL SYLLABLE DDOENG +B67A;B67A;1104 116C 11BD;B67A;1104 116C 11BD; # (뙺; 뙺; 뙺; 뙺; 뙺; ) HANGUL SYLLABLE DDOEJ +B67B;B67B;1104 116C 11BE;B67B;1104 116C 11BE; # (뙻; 뙻; 뙻; 뙻; 뙻; ) HANGUL SYLLABLE DDOEC +B67C;B67C;1104 116C 11BF;B67C;1104 116C 11BF; # (뙼; 뙼; 뙼; 뙼; 뙼; ) HANGUL SYLLABLE DDOEK +B67D;B67D;1104 116C 11C0;B67D;1104 116C 11C0; # (뙽; 뙽; 뙽; 뙽; 뙽; ) HANGUL SYLLABLE DDOET +B67E;B67E;1104 116C 11C1;B67E;1104 116C 11C1; # (뙾; 뙾; 뙾; 뙾; 뙾; ) HANGUL SYLLABLE DDOEP +B67F;B67F;1104 116C 11C2;B67F;1104 116C 11C2; # (뙿; 뙿; 뙿; 뙿; 뙿; ) HANGUL SYLLABLE DDOEH +B680;B680;1104 116D;B680;1104 116D; # (뚀; 뚀; 뚀; 뚀; 뚀; ) HANGUL SYLLABLE DDYO +B681;B681;1104 116D 11A8;B681;1104 116D 11A8; # (뚁; 뚁; 뚁; 뚁; 뚁; ) HANGUL SYLLABLE DDYOG +B682;B682;1104 116D 11A9;B682;1104 116D 11A9; # (뚂; 뚂; 뚂; 뚂; 뚂; ) HANGUL SYLLABLE DDYOGG +B683;B683;1104 116D 11AA;B683;1104 116D 11AA; # (뚃; 뚃; 뚃; 뚃; 뚃; ) HANGUL SYLLABLE DDYOGS +B684;B684;1104 116D 11AB;B684;1104 116D 11AB; # (뚄; 뚄; 뚄; 뚄; 뚄; ) HANGUL SYLLABLE DDYON +B685;B685;1104 116D 11AC;B685;1104 116D 11AC; # (뚅; 뚅; 뚅; 뚅; 뚅; ) HANGUL SYLLABLE DDYONJ +B686;B686;1104 116D 11AD;B686;1104 116D 11AD; # (뚆; 뚆; 뚆; 뚆; 뚆; ) HANGUL SYLLABLE DDYONH +B687;B687;1104 116D 11AE;B687;1104 116D 11AE; # (뚇; 뚇; 뚇; 뚇; 뚇; ) HANGUL SYLLABLE DDYOD +B688;B688;1104 116D 11AF;B688;1104 116D 11AF; # (뚈; 뚈; 뚈; 뚈; 뚈; ) HANGUL SYLLABLE DDYOL +B689;B689;1104 116D 11B0;B689;1104 116D 11B0; # (뚉; 뚉; 뚉; 뚉; 뚉; ) HANGUL SYLLABLE DDYOLG +B68A;B68A;1104 116D 11B1;B68A;1104 116D 11B1; # (뚊; 뚊; 뚊; 뚊; 뚊; ) HANGUL SYLLABLE DDYOLM +B68B;B68B;1104 116D 11B2;B68B;1104 116D 11B2; # (뚋; 뚋; 뚋; 뚋; 뚋; ) HANGUL SYLLABLE DDYOLB +B68C;B68C;1104 116D 11B3;B68C;1104 116D 11B3; # (뚌; 뚌; 뚌; 뚌; 뚌; ) HANGUL SYLLABLE DDYOLS +B68D;B68D;1104 116D 11B4;B68D;1104 116D 11B4; # (뚍; 뚍; 뚍; 뚍; 뚍; ) HANGUL SYLLABLE DDYOLT +B68E;B68E;1104 116D 11B5;B68E;1104 116D 11B5; # (뚎; 뚎; 뚎; 뚎; 뚎; ) HANGUL SYLLABLE DDYOLP +B68F;B68F;1104 116D 11B6;B68F;1104 116D 11B6; # (뚏; 뚏; 뚏; 뚏; 뚏; ) HANGUL SYLLABLE DDYOLH +B690;B690;1104 116D 11B7;B690;1104 116D 11B7; # (뚐; 뚐; 뚐; 뚐; 뚐; ) HANGUL SYLLABLE DDYOM +B691;B691;1104 116D 11B8;B691;1104 116D 11B8; # (뚑; 뚑; 뚑; 뚑; 뚑; ) HANGUL SYLLABLE DDYOB +B692;B692;1104 116D 11B9;B692;1104 116D 11B9; # (뚒; 뚒; 뚒; 뚒; 뚒; ) HANGUL SYLLABLE DDYOBS +B693;B693;1104 116D 11BA;B693;1104 116D 11BA; # (뚓; 뚓; 뚓; 뚓; 뚓; ) HANGUL SYLLABLE DDYOS +B694;B694;1104 116D 11BB;B694;1104 116D 11BB; # (뚔; 뚔; 뚔; 뚔; 뚔; ) HANGUL SYLLABLE DDYOSS +B695;B695;1104 116D 11BC;B695;1104 116D 11BC; # (뚕; 뚕; 뚕; 뚕; 뚕; ) HANGUL SYLLABLE DDYONG +B696;B696;1104 116D 11BD;B696;1104 116D 11BD; # (뚖; 뚖; 뚖; 뚖; 뚖; ) HANGUL SYLLABLE DDYOJ +B697;B697;1104 116D 11BE;B697;1104 116D 11BE; # (뚗; 뚗; 뚗; 뚗; 뚗; ) HANGUL SYLLABLE DDYOC +B698;B698;1104 116D 11BF;B698;1104 116D 11BF; # (뚘; 뚘; 뚘; 뚘; 뚘; ) HANGUL SYLLABLE DDYOK +B699;B699;1104 116D 11C0;B699;1104 116D 11C0; # (뚙; 뚙; 뚙; 뚙; 뚙; ) HANGUL SYLLABLE DDYOT +B69A;B69A;1104 116D 11C1;B69A;1104 116D 11C1; # (뚚; 뚚; 뚚; 뚚; 뚚; ) HANGUL SYLLABLE DDYOP +B69B;B69B;1104 116D 11C2;B69B;1104 116D 11C2; # (뚛; 뚛; 뚛; 뚛; 뚛; ) HANGUL SYLLABLE DDYOH +B69C;B69C;1104 116E;B69C;1104 116E; # (뚜; 뚜; 뚜; 뚜; 뚜; ) HANGUL SYLLABLE DDU +B69D;B69D;1104 116E 11A8;B69D;1104 116E 11A8; # (뚝; 뚝; 뚝; 뚝; 뚝; ) HANGUL SYLLABLE DDUG +B69E;B69E;1104 116E 11A9;B69E;1104 116E 11A9; # (뚞; 뚞; 뚞; 뚞; 뚞; ) HANGUL SYLLABLE DDUGG +B69F;B69F;1104 116E 11AA;B69F;1104 116E 11AA; # (뚟; 뚟; 뚟; 뚟; 뚟; ) HANGUL SYLLABLE DDUGS +B6A0;B6A0;1104 116E 11AB;B6A0;1104 116E 11AB; # (뚠; 뚠; 뚠; 뚠; 뚠; ) HANGUL SYLLABLE DDUN +B6A1;B6A1;1104 116E 11AC;B6A1;1104 116E 11AC; # (뚡; 뚡; 뚡; 뚡; 뚡; ) HANGUL SYLLABLE DDUNJ +B6A2;B6A2;1104 116E 11AD;B6A2;1104 116E 11AD; # (뚢; 뚢; 뚢; 뚢; 뚢; ) HANGUL SYLLABLE DDUNH +B6A3;B6A3;1104 116E 11AE;B6A3;1104 116E 11AE; # (뚣; 뚣; 뚣; 뚣; 뚣; ) HANGUL SYLLABLE DDUD +B6A4;B6A4;1104 116E 11AF;B6A4;1104 116E 11AF; # (뚤; 뚤; 뚤; 뚤; 뚤; ) HANGUL SYLLABLE DDUL +B6A5;B6A5;1104 116E 11B0;B6A5;1104 116E 11B0; # (뚥; 뚥; 뚥; 뚥; 뚥; ) HANGUL SYLLABLE DDULG +B6A6;B6A6;1104 116E 11B1;B6A6;1104 116E 11B1; # (뚦; 뚦; 뚦; 뚦; 뚦; ) HANGUL SYLLABLE DDULM +B6A7;B6A7;1104 116E 11B2;B6A7;1104 116E 11B2; # (뚧; 뚧; 뚧; 뚧; 뚧; ) HANGUL SYLLABLE DDULB +B6A8;B6A8;1104 116E 11B3;B6A8;1104 116E 11B3; # (뚨; 뚨; 뚨; 뚨; 뚨; ) HANGUL SYLLABLE DDULS +B6A9;B6A9;1104 116E 11B4;B6A9;1104 116E 11B4; # (뚩; 뚩; 뚩; 뚩; 뚩; ) HANGUL SYLLABLE DDULT +B6AA;B6AA;1104 116E 11B5;B6AA;1104 116E 11B5; # (뚪; 뚪; 뚪; 뚪; 뚪; ) HANGUL SYLLABLE DDULP +B6AB;B6AB;1104 116E 11B6;B6AB;1104 116E 11B6; # (뚫; 뚫; 뚫; 뚫; 뚫; ) HANGUL SYLLABLE DDULH +B6AC;B6AC;1104 116E 11B7;B6AC;1104 116E 11B7; # (뚬; 뚬; 뚬; 뚬; 뚬; ) HANGUL SYLLABLE DDUM +B6AD;B6AD;1104 116E 11B8;B6AD;1104 116E 11B8; # (뚭; 뚭; 뚭; 뚭; 뚭; ) HANGUL SYLLABLE DDUB +B6AE;B6AE;1104 116E 11B9;B6AE;1104 116E 11B9; # (뚮; 뚮; 뚮; 뚮; 뚮; ) HANGUL SYLLABLE DDUBS +B6AF;B6AF;1104 116E 11BA;B6AF;1104 116E 11BA; # (뚯; 뚯; 뚯; 뚯; 뚯; ) HANGUL SYLLABLE DDUS +B6B0;B6B0;1104 116E 11BB;B6B0;1104 116E 11BB; # (뚰; 뚰; 뚰; 뚰; 뚰; ) HANGUL SYLLABLE DDUSS +B6B1;B6B1;1104 116E 11BC;B6B1;1104 116E 11BC; # (뚱; 뚱; 뚱; 뚱; 뚱; ) HANGUL SYLLABLE DDUNG +B6B2;B6B2;1104 116E 11BD;B6B2;1104 116E 11BD; # (뚲; 뚲; 뚲; 뚲; 뚲; ) HANGUL SYLLABLE DDUJ +B6B3;B6B3;1104 116E 11BE;B6B3;1104 116E 11BE; # (뚳; 뚳; 뚳; 뚳; 뚳; ) HANGUL SYLLABLE DDUC +B6B4;B6B4;1104 116E 11BF;B6B4;1104 116E 11BF; # (뚴; 뚴; 뚴; 뚴; 뚴; ) HANGUL SYLLABLE DDUK +B6B5;B6B5;1104 116E 11C0;B6B5;1104 116E 11C0; # (뚵; 뚵; 뚵; 뚵; 뚵; ) HANGUL SYLLABLE DDUT +B6B6;B6B6;1104 116E 11C1;B6B6;1104 116E 11C1; # (뚶; 뚶; 뚶; 뚶; 뚶; ) HANGUL SYLLABLE DDUP +B6B7;B6B7;1104 116E 11C2;B6B7;1104 116E 11C2; # (뚷; 뚷; 뚷; 뚷; 뚷; ) HANGUL SYLLABLE DDUH +B6B8;B6B8;1104 116F;B6B8;1104 116F; # (뚸; 뚸; 뚸; 뚸; 뚸; ) HANGUL SYLLABLE DDWEO +B6B9;B6B9;1104 116F 11A8;B6B9;1104 116F 11A8; # (뚹; 뚹; 뚹; 뚹; 뚹; ) HANGUL SYLLABLE DDWEOG +B6BA;B6BA;1104 116F 11A9;B6BA;1104 116F 11A9; # (뚺; 뚺; 뚺; 뚺; 뚺; ) HANGUL SYLLABLE DDWEOGG +B6BB;B6BB;1104 116F 11AA;B6BB;1104 116F 11AA; # (뚻; 뚻; 뚻; 뚻; 뚻; ) HANGUL SYLLABLE DDWEOGS +B6BC;B6BC;1104 116F 11AB;B6BC;1104 116F 11AB; # (뚼; 뚼; 뚼; 뚼; 뚼; ) HANGUL SYLLABLE DDWEON +B6BD;B6BD;1104 116F 11AC;B6BD;1104 116F 11AC; # (뚽; 뚽; 뚽; 뚽; 뚽; ) HANGUL SYLLABLE DDWEONJ +B6BE;B6BE;1104 116F 11AD;B6BE;1104 116F 11AD; # (뚾; 뚾; 뚾; 뚾; 뚾; ) HANGUL SYLLABLE DDWEONH +B6BF;B6BF;1104 116F 11AE;B6BF;1104 116F 11AE; # (뚿; 뚿; 뚿; 뚿; 뚿; ) HANGUL SYLLABLE DDWEOD +B6C0;B6C0;1104 116F 11AF;B6C0;1104 116F 11AF; # (뛀; 뛀; 뛀; 뛀; 뛀; ) HANGUL SYLLABLE DDWEOL +B6C1;B6C1;1104 116F 11B0;B6C1;1104 116F 11B0; # (뛁; 뛁; 뛁; 뛁; 뛁; ) HANGUL SYLLABLE DDWEOLG +B6C2;B6C2;1104 116F 11B1;B6C2;1104 116F 11B1; # (뛂; 뛂; 뛂; 뛂; 뛂; ) HANGUL SYLLABLE DDWEOLM +B6C3;B6C3;1104 116F 11B2;B6C3;1104 116F 11B2; # (뛃; 뛃; 뛃; 뛃; 뛃; ) HANGUL SYLLABLE DDWEOLB +B6C4;B6C4;1104 116F 11B3;B6C4;1104 116F 11B3; # (뛄; 뛄; 뛄; 뛄; 뛄; ) HANGUL SYLLABLE DDWEOLS +B6C5;B6C5;1104 116F 11B4;B6C5;1104 116F 11B4; # (뛅; 뛅; 뛅; 뛅; 뛅; ) HANGUL SYLLABLE DDWEOLT +B6C6;B6C6;1104 116F 11B5;B6C6;1104 116F 11B5; # (뛆; 뛆; 뛆; 뛆; 뛆; ) HANGUL SYLLABLE DDWEOLP +B6C7;B6C7;1104 116F 11B6;B6C7;1104 116F 11B6; # (뛇; 뛇; 뛇; 뛇; 뛇; ) HANGUL SYLLABLE DDWEOLH +B6C8;B6C8;1104 116F 11B7;B6C8;1104 116F 11B7; # (뛈; 뛈; 뛈; 뛈; 뛈; ) HANGUL SYLLABLE DDWEOM +B6C9;B6C9;1104 116F 11B8;B6C9;1104 116F 11B8; # (뛉; 뛉; 뛉; 뛉; 뛉; ) HANGUL SYLLABLE DDWEOB +B6CA;B6CA;1104 116F 11B9;B6CA;1104 116F 11B9; # (뛊; 뛊; 뛊; 뛊; 뛊; ) HANGUL SYLLABLE DDWEOBS +B6CB;B6CB;1104 116F 11BA;B6CB;1104 116F 11BA; # (뛋; 뛋; 뛋; 뛋; 뛋; ) HANGUL SYLLABLE DDWEOS +B6CC;B6CC;1104 116F 11BB;B6CC;1104 116F 11BB; # (뛌; 뛌; 뛌; 뛌; 뛌; ) HANGUL SYLLABLE DDWEOSS +B6CD;B6CD;1104 116F 11BC;B6CD;1104 116F 11BC; # (뛍; 뛍; 뛍; 뛍; 뛍; ) HANGUL SYLLABLE DDWEONG +B6CE;B6CE;1104 116F 11BD;B6CE;1104 116F 11BD; # (뛎; 뛎; 뛎; 뛎; 뛎; ) HANGUL SYLLABLE DDWEOJ +B6CF;B6CF;1104 116F 11BE;B6CF;1104 116F 11BE; # (뛏; 뛏; 뛏; 뛏; 뛏; ) HANGUL SYLLABLE DDWEOC +B6D0;B6D0;1104 116F 11BF;B6D0;1104 116F 11BF; # (뛐; 뛐; 뛐; 뛐; 뛐; ) HANGUL SYLLABLE DDWEOK +B6D1;B6D1;1104 116F 11C0;B6D1;1104 116F 11C0; # (뛑; 뛑; 뛑; 뛑; 뛑; ) HANGUL SYLLABLE DDWEOT +B6D2;B6D2;1104 116F 11C1;B6D2;1104 116F 11C1; # (뛒; 뛒; 뛒; 뛒; 뛒; ) HANGUL SYLLABLE DDWEOP +B6D3;B6D3;1104 116F 11C2;B6D3;1104 116F 11C2; # (뛓; 뛓; 뛓; 뛓; 뛓; ) HANGUL SYLLABLE DDWEOH +B6D4;B6D4;1104 1170;B6D4;1104 1170; # (뛔; 뛔; 뛔; 뛔; 뛔; ) HANGUL SYLLABLE DDWE +B6D5;B6D5;1104 1170 11A8;B6D5;1104 1170 11A8; # (뛕; 뛕; 뛕; 뛕; 뛕; ) HANGUL SYLLABLE DDWEG +B6D6;B6D6;1104 1170 11A9;B6D6;1104 1170 11A9; # (뛖; 뛖; 뛖; 뛖; 뛖; ) HANGUL SYLLABLE DDWEGG +B6D7;B6D7;1104 1170 11AA;B6D7;1104 1170 11AA; # (뛗; 뛗; 뛗; 뛗; 뛗; ) HANGUL SYLLABLE DDWEGS +B6D8;B6D8;1104 1170 11AB;B6D8;1104 1170 11AB; # (뛘; 뛘; 뛘; 뛘; 뛘; ) HANGUL SYLLABLE DDWEN +B6D9;B6D9;1104 1170 11AC;B6D9;1104 1170 11AC; # (뛙; 뛙; 뛙; 뛙; 뛙; ) HANGUL SYLLABLE DDWENJ +B6DA;B6DA;1104 1170 11AD;B6DA;1104 1170 11AD; # (뛚; 뛚; 뛚; 뛚; 뛚; ) HANGUL SYLLABLE DDWENH +B6DB;B6DB;1104 1170 11AE;B6DB;1104 1170 11AE; # (뛛; 뛛; 뛛; 뛛; 뛛; ) HANGUL SYLLABLE DDWED +B6DC;B6DC;1104 1170 11AF;B6DC;1104 1170 11AF; # (뛜; 뛜; 뛜; 뛜; 뛜; ) HANGUL SYLLABLE DDWEL +B6DD;B6DD;1104 1170 11B0;B6DD;1104 1170 11B0; # (뛝; 뛝; 뛝; 뛝; 뛝; ) HANGUL SYLLABLE DDWELG +B6DE;B6DE;1104 1170 11B1;B6DE;1104 1170 11B1; # (뛞; 뛞; 뛞; 뛞; 뛞; ) HANGUL SYLLABLE DDWELM +B6DF;B6DF;1104 1170 11B2;B6DF;1104 1170 11B2; # (뛟; 뛟; 뛟; 뛟; 뛟; ) HANGUL SYLLABLE DDWELB +B6E0;B6E0;1104 1170 11B3;B6E0;1104 1170 11B3; # (뛠; 뛠; 뛠; 뛠; 뛠; ) HANGUL SYLLABLE DDWELS +B6E1;B6E1;1104 1170 11B4;B6E1;1104 1170 11B4; # (뛡; 뛡; 뛡; 뛡; 뛡; ) HANGUL SYLLABLE DDWELT +B6E2;B6E2;1104 1170 11B5;B6E2;1104 1170 11B5; # (뛢; 뛢; 뛢; 뛢; 뛢; ) HANGUL SYLLABLE DDWELP +B6E3;B6E3;1104 1170 11B6;B6E3;1104 1170 11B6; # (뛣; 뛣; 뛣; 뛣; 뛣; ) HANGUL SYLLABLE DDWELH +B6E4;B6E4;1104 1170 11B7;B6E4;1104 1170 11B7; # (뛤; 뛤; 뛤; 뛤; 뛤; ) HANGUL SYLLABLE DDWEM +B6E5;B6E5;1104 1170 11B8;B6E5;1104 1170 11B8; # (뛥; 뛥; 뛥; 뛥; 뛥; ) HANGUL SYLLABLE DDWEB +B6E6;B6E6;1104 1170 11B9;B6E6;1104 1170 11B9; # (뛦; 뛦; 뛦; 뛦; 뛦; ) HANGUL SYLLABLE DDWEBS +B6E7;B6E7;1104 1170 11BA;B6E7;1104 1170 11BA; # (뛧; 뛧; 뛧; 뛧; 뛧; ) HANGUL SYLLABLE DDWES +B6E8;B6E8;1104 1170 11BB;B6E8;1104 1170 11BB; # (뛨; 뛨; 뛨; 뛨; 뛨; ) HANGUL SYLLABLE DDWESS +B6E9;B6E9;1104 1170 11BC;B6E9;1104 1170 11BC; # (뛩; 뛩; 뛩; 뛩; 뛩; ) HANGUL SYLLABLE DDWENG +B6EA;B6EA;1104 1170 11BD;B6EA;1104 1170 11BD; # (뛪; 뛪; 뛪; 뛪; 뛪; ) HANGUL SYLLABLE DDWEJ +B6EB;B6EB;1104 1170 11BE;B6EB;1104 1170 11BE; # (뛫; 뛫; 뛫; 뛫; 뛫; ) HANGUL SYLLABLE DDWEC +B6EC;B6EC;1104 1170 11BF;B6EC;1104 1170 11BF; # (뛬; 뛬; 뛬; 뛬; 뛬; ) HANGUL SYLLABLE DDWEK +B6ED;B6ED;1104 1170 11C0;B6ED;1104 1170 11C0; # (뛭; 뛭; 뛭; 뛭; 뛭; ) HANGUL SYLLABLE DDWET +B6EE;B6EE;1104 1170 11C1;B6EE;1104 1170 11C1; # (뛮; 뛮; 뛮; 뛮; 뛮; ) HANGUL SYLLABLE DDWEP +B6EF;B6EF;1104 1170 11C2;B6EF;1104 1170 11C2; # (뛯; 뛯; 뛯; 뛯; 뛯; ) HANGUL SYLLABLE DDWEH +B6F0;B6F0;1104 1171;B6F0;1104 1171; # (뛰; 뛰; 뛰; 뛰; 뛰; ) HANGUL SYLLABLE DDWI +B6F1;B6F1;1104 1171 11A8;B6F1;1104 1171 11A8; # (뛱; 뛱; 뛱; 뛱; 뛱; ) HANGUL SYLLABLE DDWIG +B6F2;B6F2;1104 1171 11A9;B6F2;1104 1171 11A9; # (뛲; 뛲; 뛲; 뛲; 뛲; ) HANGUL SYLLABLE DDWIGG +B6F3;B6F3;1104 1171 11AA;B6F3;1104 1171 11AA; # (뛳; 뛳; 뛳; 뛳; 뛳; ) HANGUL SYLLABLE DDWIGS +B6F4;B6F4;1104 1171 11AB;B6F4;1104 1171 11AB; # (뛴; 뛴; 뛴; 뛴; 뛴; ) HANGUL SYLLABLE DDWIN +B6F5;B6F5;1104 1171 11AC;B6F5;1104 1171 11AC; # (뛵; 뛵; 뛵; 뛵; 뛵; ) HANGUL SYLLABLE DDWINJ +B6F6;B6F6;1104 1171 11AD;B6F6;1104 1171 11AD; # (뛶; 뛶; 뛶; 뛶; 뛶; ) HANGUL SYLLABLE DDWINH +B6F7;B6F7;1104 1171 11AE;B6F7;1104 1171 11AE; # (뛷; 뛷; 뛷; 뛷; 뛷; ) HANGUL SYLLABLE DDWID +B6F8;B6F8;1104 1171 11AF;B6F8;1104 1171 11AF; # (뛸; 뛸; 뛸; 뛸; 뛸; ) HANGUL SYLLABLE DDWIL +B6F9;B6F9;1104 1171 11B0;B6F9;1104 1171 11B0; # (뛹; 뛹; 뛹; 뛹; 뛹; ) HANGUL SYLLABLE DDWILG +B6FA;B6FA;1104 1171 11B1;B6FA;1104 1171 11B1; # (뛺; 뛺; 뛺; 뛺; 뛺; ) HANGUL SYLLABLE DDWILM +B6FB;B6FB;1104 1171 11B2;B6FB;1104 1171 11B2; # (뛻; 뛻; 뛻; 뛻; 뛻; ) HANGUL SYLLABLE DDWILB +B6FC;B6FC;1104 1171 11B3;B6FC;1104 1171 11B3; # (뛼; 뛼; 뛼; 뛼; 뛼; ) HANGUL SYLLABLE DDWILS +B6FD;B6FD;1104 1171 11B4;B6FD;1104 1171 11B4; # (뛽; 뛽; 뛽; 뛽; 뛽; ) HANGUL SYLLABLE DDWILT +B6FE;B6FE;1104 1171 11B5;B6FE;1104 1171 11B5; # (뛾; 뛾; 뛾; 뛾; 뛾; ) HANGUL SYLLABLE DDWILP +B6FF;B6FF;1104 1171 11B6;B6FF;1104 1171 11B6; # (뛿; 뛿; 뛿; 뛿; 뛿; ) HANGUL SYLLABLE DDWILH +B700;B700;1104 1171 11B7;B700;1104 1171 11B7; # (뜀; 뜀; 뜀; 뜀; 뜀; ) HANGUL SYLLABLE DDWIM +B701;B701;1104 1171 11B8;B701;1104 1171 11B8; # (뜁; 뜁; 뜁; 뜁; 뜁; ) HANGUL SYLLABLE DDWIB +B702;B702;1104 1171 11B9;B702;1104 1171 11B9; # (뜂; 뜂; 뜂; 뜂; 뜂; ) HANGUL SYLLABLE DDWIBS +B703;B703;1104 1171 11BA;B703;1104 1171 11BA; # (뜃; 뜃; 뜃; 뜃; 뜃; ) HANGUL SYLLABLE DDWIS +B704;B704;1104 1171 11BB;B704;1104 1171 11BB; # (뜄; 뜄; 뜄; 뜄; 뜄; ) HANGUL SYLLABLE DDWISS +B705;B705;1104 1171 11BC;B705;1104 1171 11BC; # (뜅; 뜅; 뜅; 뜅; 뜅; ) HANGUL SYLLABLE DDWING +B706;B706;1104 1171 11BD;B706;1104 1171 11BD; # (뜆; 뜆; 뜆; 뜆; 뜆; ) HANGUL SYLLABLE DDWIJ +B707;B707;1104 1171 11BE;B707;1104 1171 11BE; # (뜇; 뜇; 뜇; 뜇; 뜇; ) HANGUL SYLLABLE DDWIC +B708;B708;1104 1171 11BF;B708;1104 1171 11BF; # (뜈; 뜈; 뜈; 뜈; 뜈; ) HANGUL SYLLABLE DDWIK +B709;B709;1104 1171 11C0;B709;1104 1171 11C0; # (뜉; 뜉; 뜉; 뜉; 뜉; ) HANGUL SYLLABLE DDWIT +B70A;B70A;1104 1171 11C1;B70A;1104 1171 11C1; # (뜊; 뜊; 뜊; 뜊; 뜊; ) HANGUL SYLLABLE DDWIP +B70B;B70B;1104 1171 11C2;B70B;1104 1171 11C2; # (뜋; 뜋; 뜋; 뜋; 뜋; ) HANGUL SYLLABLE DDWIH +B70C;B70C;1104 1172;B70C;1104 1172; # (뜌; 뜌; 뜌; 뜌; 뜌; ) HANGUL SYLLABLE DDYU +B70D;B70D;1104 1172 11A8;B70D;1104 1172 11A8; # (뜍; 뜍; 뜍; 뜍; 뜍; ) HANGUL SYLLABLE DDYUG +B70E;B70E;1104 1172 11A9;B70E;1104 1172 11A9; # (뜎; 뜎; 뜎; 뜎; 뜎; ) HANGUL SYLLABLE DDYUGG +B70F;B70F;1104 1172 11AA;B70F;1104 1172 11AA; # (뜏; 뜏; 뜏; 뜏; 뜏; ) HANGUL SYLLABLE DDYUGS +B710;B710;1104 1172 11AB;B710;1104 1172 11AB; # (뜐; 뜐; 뜐; 뜐; 뜐; ) HANGUL SYLLABLE DDYUN +B711;B711;1104 1172 11AC;B711;1104 1172 11AC; # (뜑; 뜑; 뜑; 뜑; 뜑; ) HANGUL SYLLABLE DDYUNJ +B712;B712;1104 1172 11AD;B712;1104 1172 11AD; # (뜒; 뜒; 뜒; 뜒; 뜒; ) HANGUL SYLLABLE DDYUNH +B713;B713;1104 1172 11AE;B713;1104 1172 11AE; # (뜓; 뜓; 뜓; 뜓; 뜓; ) HANGUL SYLLABLE DDYUD +B714;B714;1104 1172 11AF;B714;1104 1172 11AF; # (뜔; 뜔; 뜔; 뜔; 뜔; ) HANGUL SYLLABLE DDYUL +B715;B715;1104 1172 11B0;B715;1104 1172 11B0; # (뜕; 뜕; 뜕; 뜕; 뜕; ) HANGUL SYLLABLE DDYULG +B716;B716;1104 1172 11B1;B716;1104 1172 11B1; # (뜖; 뜖; 뜖; 뜖; 뜖; ) HANGUL SYLLABLE DDYULM +B717;B717;1104 1172 11B2;B717;1104 1172 11B2; # (뜗; 뜗; 뜗; 뜗; 뜗; ) HANGUL SYLLABLE DDYULB +B718;B718;1104 1172 11B3;B718;1104 1172 11B3; # (뜘; 뜘; 뜘; 뜘; 뜘; ) HANGUL SYLLABLE DDYULS +B719;B719;1104 1172 11B4;B719;1104 1172 11B4; # (뜙; 뜙; 뜙; 뜙; 뜙; ) HANGUL SYLLABLE DDYULT +B71A;B71A;1104 1172 11B5;B71A;1104 1172 11B5; # (뜚; 뜚; 뜚; 뜚; 뜚; ) HANGUL SYLLABLE DDYULP +B71B;B71B;1104 1172 11B6;B71B;1104 1172 11B6; # (뜛; 뜛; 뜛; 뜛; 뜛; ) HANGUL SYLLABLE DDYULH +B71C;B71C;1104 1172 11B7;B71C;1104 1172 11B7; # (뜜; 뜜; 뜜; 뜜; 뜜; ) HANGUL SYLLABLE DDYUM +B71D;B71D;1104 1172 11B8;B71D;1104 1172 11B8; # (뜝; 뜝; 뜝; 뜝; 뜝; ) HANGUL SYLLABLE DDYUB +B71E;B71E;1104 1172 11B9;B71E;1104 1172 11B9; # (뜞; 뜞; 뜞; 뜞; 뜞; ) HANGUL SYLLABLE DDYUBS +B71F;B71F;1104 1172 11BA;B71F;1104 1172 11BA; # (뜟; 뜟; 뜟; 뜟; 뜟; ) HANGUL SYLLABLE DDYUS +B720;B720;1104 1172 11BB;B720;1104 1172 11BB; # (뜠; 뜠; 뜠; 뜠; 뜠; ) HANGUL SYLLABLE DDYUSS +B721;B721;1104 1172 11BC;B721;1104 1172 11BC; # (뜡; 뜡; 뜡; 뜡; 뜡; ) HANGUL SYLLABLE DDYUNG +B722;B722;1104 1172 11BD;B722;1104 1172 11BD; # (뜢; 뜢; 뜢; 뜢; 뜢; ) HANGUL SYLLABLE DDYUJ +B723;B723;1104 1172 11BE;B723;1104 1172 11BE; # (뜣; 뜣; 뜣; 뜣; 뜣; ) HANGUL SYLLABLE DDYUC +B724;B724;1104 1172 11BF;B724;1104 1172 11BF; # (뜤; 뜤; 뜤; 뜤; 뜤; ) HANGUL SYLLABLE DDYUK +B725;B725;1104 1172 11C0;B725;1104 1172 11C0; # (뜥; 뜥; 뜥; 뜥; 뜥; ) HANGUL SYLLABLE DDYUT +B726;B726;1104 1172 11C1;B726;1104 1172 11C1; # (뜦; 뜦; 뜦; 뜦; 뜦; ) HANGUL SYLLABLE DDYUP +B727;B727;1104 1172 11C2;B727;1104 1172 11C2; # (뜧; 뜧; 뜧; 뜧; 뜧; ) HANGUL SYLLABLE DDYUH +B728;B728;1104 1173;B728;1104 1173; # (뜨; 뜨; 뜨; 뜨; 뜨; ) HANGUL SYLLABLE DDEU +B729;B729;1104 1173 11A8;B729;1104 1173 11A8; # (뜩; 뜩; 뜩; 뜩; 뜩; ) HANGUL SYLLABLE DDEUG +B72A;B72A;1104 1173 11A9;B72A;1104 1173 11A9; # (뜪; 뜪; 뜪; 뜪; 뜪; ) HANGUL SYLLABLE DDEUGG +B72B;B72B;1104 1173 11AA;B72B;1104 1173 11AA; # (뜫; 뜫; 뜫; 뜫; 뜫; ) HANGUL SYLLABLE DDEUGS +B72C;B72C;1104 1173 11AB;B72C;1104 1173 11AB; # (뜬; 뜬; 뜬; 뜬; 뜬; ) HANGUL SYLLABLE DDEUN +B72D;B72D;1104 1173 11AC;B72D;1104 1173 11AC; # (뜭; 뜭; 뜭; 뜭; 뜭; ) HANGUL SYLLABLE DDEUNJ +B72E;B72E;1104 1173 11AD;B72E;1104 1173 11AD; # (뜮; 뜮; 뜮; 뜮; 뜮; ) HANGUL SYLLABLE DDEUNH +B72F;B72F;1104 1173 11AE;B72F;1104 1173 11AE; # (뜯; 뜯; 뜯; 뜯; 뜯; ) HANGUL SYLLABLE DDEUD +B730;B730;1104 1173 11AF;B730;1104 1173 11AF; # (뜰; 뜰; 뜰; 뜰; 뜰; ) HANGUL SYLLABLE DDEUL +B731;B731;1104 1173 11B0;B731;1104 1173 11B0; # (뜱; 뜱; 뜱; 뜱; 뜱; ) HANGUL SYLLABLE DDEULG +B732;B732;1104 1173 11B1;B732;1104 1173 11B1; # (뜲; 뜲; 뜲; 뜲; 뜲; ) HANGUL SYLLABLE DDEULM +B733;B733;1104 1173 11B2;B733;1104 1173 11B2; # (뜳; 뜳; 뜳; 뜳; 뜳; ) HANGUL SYLLABLE DDEULB +B734;B734;1104 1173 11B3;B734;1104 1173 11B3; # (뜴; 뜴; 뜴; 뜴; 뜴; ) HANGUL SYLLABLE DDEULS +B735;B735;1104 1173 11B4;B735;1104 1173 11B4; # (뜵; 뜵; 뜵; 뜵; 뜵; ) HANGUL SYLLABLE DDEULT +B736;B736;1104 1173 11B5;B736;1104 1173 11B5; # (뜶; 뜶; 뜶; 뜶; 뜶; ) HANGUL SYLLABLE DDEULP +B737;B737;1104 1173 11B6;B737;1104 1173 11B6; # (뜷; 뜷; 뜷; 뜷; 뜷; ) HANGUL SYLLABLE DDEULH +B738;B738;1104 1173 11B7;B738;1104 1173 11B7; # (뜸; 뜸; 뜸; 뜸; 뜸; ) HANGUL SYLLABLE DDEUM +B739;B739;1104 1173 11B8;B739;1104 1173 11B8; # (뜹; 뜹; 뜹; 뜹; 뜹; ) HANGUL SYLLABLE DDEUB +B73A;B73A;1104 1173 11B9;B73A;1104 1173 11B9; # (뜺; 뜺; 뜺; 뜺; 뜺; ) HANGUL SYLLABLE DDEUBS +B73B;B73B;1104 1173 11BA;B73B;1104 1173 11BA; # (뜻; 뜻; 뜻; 뜻; 뜻; ) HANGUL SYLLABLE DDEUS +B73C;B73C;1104 1173 11BB;B73C;1104 1173 11BB; # (뜼; 뜼; 뜼; 뜼; 뜼; ) HANGUL SYLLABLE DDEUSS +B73D;B73D;1104 1173 11BC;B73D;1104 1173 11BC; # (뜽; 뜽; 뜽; 뜽; 뜽; ) HANGUL SYLLABLE DDEUNG +B73E;B73E;1104 1173 11BD;B73E;1104 1173 11BD; # (뜾; 뜾; 뜾; 뜾; 뜾; ) HANGUL SYLLABLE DDEUJ +B73F;B73F;1104 1173 11BE;B73F;1104 1173 11BE; # (뜿; 뜿; 뜿; 뜿; 뜿; ) HANGUL SYLLABLE DDEUC +B740;B740;1104 1173 11BF;B740;1104 1173 11BF; # (띀; 띀; 띀; 띀; 띀; ) HANGUL SYLLABLE DDEUK +B741;B741;1104 1173 11C0;B741;1104 1173 11C0; # (띁; 띁; 띁; 띁; 띁; ) HANGUL SYLLABLE DDEUT +B742;B742;1104 1173 11C1;B742;1104 1173 11C1; # (띂; 띂; 띂; 띂; 띂; ) HANGUL SYLLABLE DDEUP +B743;B743;1104 1173 11C2;B743;1104 1173 11C2; # (띃; 띃; 띃; 띃; 띃; ) HANGUL SYLLABLE DDEUH +B744;B744;1104 1174;B744;1104 1174; # (띄; 띄; 띄; 띄; 띄; ) HANGUL SYLLABLE DDYI +B745;B745;1104 1174 11A8;B745;1104 1174 11A8; # (띅; 띅; 띅; 띅; 띅; ) HANGUL SYLLABLE DDYIG +B746;B746;1104 1174 11A9;B746;1104 1174 11A9; # (띆; 띆; 띆; 띆; 띆; ) HANGUL SYLLABLE DDYIGG +B747;B747;1104 1174 11AA;B747;1104 1174 11AA; # (띇; 띇; 띇; 띇; 띇; ) HANGUL SYLLABLE DDYIGS +B748;B748;1104 1174 11AB;B748;1104 1174 11AB; # (띈; 띈; 띈; 띈; 띈; ) HANGUL SYLLABLE DDYIN +B749;B749;1104 1174 11AC;B749;1104 1174 11AC; # (띉; 띉; 띉; 띉; 띉; ) HANGUL SYLLABLE DDYINJ +B74A;B74A;1104 1174 11AD;B74A;1104 1174 11AD; # (띊; 띊; 띊; 띊; 띊; ) HANGUL SYLLABLE DDYINH +B74B;B74B;1104 1174 11AE;B74B;1104 1174 11AE; # (띋; 띋; 띋; 띋; 띋; ) HANGUL SYLLABLE DDYID +B74C;B74C;1104 1174 11AF;B74C;1104 1174 11AF; # (띌; 띌; 띌; 띌; 띌; ) HANGUL SYLLABLE DDYIL +B74D;B74D;1104 1174 11B0;B74D;1104 1174 11B0; # (띍; 띍; 띍; 띍; 띍; ) HANGUL SYLLABLE DDYILG +B74E;B74E;1104 1174 11B1;B74E;1104 1174 11B1; # (띎; 띎; 띎; 띎; 띎; ) HANGUL SYLLABLE DDYILM +B74F;B74F;1104 1174 11B2;B74F;1104 1174 11B2; # (띏; 띏; 띏; 띏; 띏; ) HANGUL SYLLABLE DDYILB +B750;B750;1104 1174 11B3;B750;1104 1174 11B3; # (띐; 띐; 띐; 띐; 띐; ) HANGUL SYLLABLE DDYILS +B751;B751;1104 1174 11B4;B751;1104 1174 11B4; # (띑; 띑; 띑; 띑; 띑; ) HANGUL SYLLABLE DDYILT +B752;B752;1104 1174 11B5;B752;1104 1174 11B5; # (띒; 띒; 띒; 띒; 띒; ) HANGUL SYLLABLE DDYILP +B753;B753;1104 1174 11B6;B753;1104 1174 11B6; # (띓; 띓; 띓; 띓; 띓; ) HANGUL SYLLABLE DDYILH +B754;B754;1104 1174 11B7;B754;1104 1174 11B7; # (띔; 띔; 띔; 띔; 띔; ) HANGUL SYLLABLE DDYIM +B755;B755;1104 1174 11B8;B755;1104 1174 11B8; # (띕; 띕; 띕; 띕; 띕; ) HANGUL SYLLABLE DDYIB +B756;B756;1104 1174 11B9;B756;1104 1174 11B9; # (띖; 띖; 띖; 띖; 띖; ) HANGUL SYLLABLE DDYIBS +B757;B757;1104 1174 11BA;B757;1104 1174 11BA; # (띗; 띗; 띗; 띗; 띗; ) HANGUL SYLLABLE DDYIS +B758;B758;1104 1174 11BB;B758;1104 1174 11BB; # (띘; 띘; 띘; 띘; 띘; ) HANGUL SYLLABLE DDYISS +B759;B759;1104 1174 11BC;B759;1104 1174 11BC; # (띙; 띙; 띙; 띙; 띙; ) HANGUL SYLLABLE DDYING +B75A;B75A;1104 1174 11BD;B75A;1104 1174 11BD; # (띚; 띚; 띚; 띚; 띚; ) HANGUL SYLLABLE DDYIJ +B75B;B75B;1104 1174 11BE;B75B;1104 1174 11BE; # (띛; 띛; 띛; 띛; 띛; ) HANGUL SYLLABLE DDYIC +B75C;B75C;1104 1174 11BF;B75C;1104 1174 11BF; # (띜; 띜; 띜; 띜; 띜; ) HANGUL SYLLABLE DDYIK +B75D;B75D;1104 1174 11C0;B75D;1104 1174 11C0; # (띝; 띝; 띝; 띝; 띝; ) HANGUL SYLLABLE DDYIT +B75E;B75E;1104 1174 11C1;B75E;1104 1174 11C1; # (띞; 띞; 띞; 띞; 띞; ) HANGUL SYLLABLE DDYIP +B75F;B75F;1104 1174 11C2;B75F;1104 1174 11C2; # (띟; 띟; 띟; 띟; 띟; ) HANGUL SYLLABLE DDYIH +B760;B760;1104 1175;B760;1104 1175; # (띠; 띠; 띠; 띠; 띠; ) HANGUL SYLLABLE DDI +B761;B761;1104 1175 11A8;B761;1104 1175 11A8; # (띡; 띡; 띡; 띡; 띡; ) HANGUL SYLLABLE DDIG +B762;B762;1104 1175 11A9;B762;1104 1175 11A9; # (띢; 띢; 띢; 띢; 띢; ) HANGUL SYLLABLE DDIGG +B763;B763;1104 1175 11AA;B763;1104 1175 11AA; # (띣; 띣; 띣; 띣; 띣; ) HANGUL SYLLABLE DDIGS +B764;B764;1104 1175 11AB;B764;1104 1175 11AB; # (띤; 띤; 띤; 띤; 띤; ) HANGUL SYLLABLE DDIN +B765;B765;1104 1175 11AC;B765;1104 1175 11AC; # (띥; 띥; 띥; 띥; 띥; ) HANGUL SYLLABLE DDINJ +B766;B766;1104 1175 11AD;B766;1104 1175 11AD; # (띦; 띦; 띦; 띦; 띦; ) HANGUL SYLLABLE DDINH +B767;B767;1104 1175 11AE;B767;1104 1175 11AE; # (띧; 띧; 띧; 띧; 띧; ) HANGUL SYLLABLE DDID +B768;B768;1104 1175 11AF;B768;1104 1175 11AF; # (띨; 띨; 띨; 띨; 띨; ) HANGUL SYLLABLE DDIL +B769;B769;1104 1175 11B0;B769;1104 1175 11B0; # (띩; 띩; 띩; 띩; 띩; ) HANGUL SYLLABLE DDILG +B76A;B76A;1104 1175 11B1;B76A;1104 1175 11B1; # (띪; 띪; 띪; 띪; 띪; ) HANGUL SYLLABLE DDILM +B76B;B76B;1104 1175 11B2;B76B;1104 1175 11B2; # (띫; 띫; 띫; 띫; 띫; ) HANGUL SYLLABLE DDILB +B76C;B76C;1104 1175 11B3;B76C;1104 1175 11B3; # (띬; 띬; 띬; 띬; 띬; ) HANGUL SYLLABLE DDILS +B76D;B76D;1104 1175 11B4;B76D;1104 1175 11B4; # (띭; 띭; 띭; 띭; 띭; ) HANGUL SYLLABLE DDILT +B76E;B76E;1104 1175 11B5;B76E;1104 1175 11B5; # (띮; 띮; 띮; 띮; 띮; ) HANGUL SYLLABLE DDILP +B76F;B76F;1104 1175 11B6;B76F;1104 1175 11B6; # (띯; 띯; 띯; 띯; 띯; ) HANGUL SYLLABLE DDILH +B770;B770;1104 1175 11B7;B770;1104 1175 11B7; # (띰; 띰; 띰; 띰; 띰; ) HANGUL SYLLABLE DDIM +B771;B771;1104 1175 11B8;B771;1104 1175 11B8; # (띱; 띱; 띱; 띱; 띱; ) HANGUL SYLLABLE DDIB +B772;B772;1104 1175 11B9;B772;1104 1175 11B9; # (띲; 띲; 띲; 띲; 띲; ) HANGUL SYLLABLE DDIBS +B773;B773;1104 1175 11BA;B773;1104 1175 11BA; # (띳; 띳; 띳; 띳; 띳; ) HANGUL SYLLABLE DDIS +B774;B774;1104 1175 11BB;B774;1104 1175 11BB; # (띴; 띴; 띴; 띴; 띴; ) HANGUL SYLLABLE DDISS +B775;B775;1104 1175 11BC;B775;1104 1175 11BC; # (띵; 띵; 띵; 띵; 띵; ) HANGUL SYLLABLE DDING +B776;B776;1104 1175 11BD;B776;1104 1175 11BD; # (띶; 띶; 띶; 띶; 띶; ) HANGUL SYLLABLE DDIJ +B777;B777;1104 1175 11BE;B777;1104 1175 11BE; # (띷; 띷; 띷; 띷; 띷; ) HANGUL SYLLABLE DDIC +B778;B778;1104 1175 11BF;B778;1104 1175 11BF; # (띸; 띸; 띸; 띸; 띸; ) HANGUL SYLLABLE DDIK +B779;B779;1104 1175 11C0;B779;1104 1175 11C0; # (띹; 띹; 띹; 띹; 띹; ) HANGUL SYLLABLE DDIT +B77A;B77A;1104 1175 11C1;B77A;1104 1175 11C1; # (띺; 띺; 띺; 띺; 띺; ) HANGUL SYLLABLE DDIP +B77B;B77B;1104 1175 11C2;B77B;1104 1175 11C2; # (띻; 띻; 띻; 띻; 띻; ) HANGUL SYLLABLE DDIH +B77C;B77C;1105 1161;B77C;1105 1161; # (라; 라; 라; 라; 라; ) HANGUL SYLLABLE RA +B77D;B77D;1105 1161 11A8;B77D;1105 1161 11A8; # (락; 락; 락; 락; 락; ) HANGUL SYLLABLE RAG +B77E;B77E;1105 1161 11A9;B77E;1105 1161 11A9; # (띾; 띾; 띾; 띾; 띾; ) HANGUL SYLLABLE RAGG +B77F;B77F;1105 1161 11AA;B77F;1105 1161 11AA; # (띿; 띿; 띿; 띿; 띿; ) HANGUL SYLLABLE RAGS +B780;B780;1105 1161 11AB;B780;1105 1161 11AB; # (란; 란; 란; 란; 란; ) HANGUL SYLLABLE RAN +B781;B781;1105 1161 11AC;B781;1105 1161 11AC; # (랁; 랁; 랁; 랁; 랁; ) HANGUL SYLLABLE RANJ +B782;B782;1105 1161 11AD;B782;1105 1161 11AD; # (랂; 랂; 랂; 랂; 랂; ) HANGUL SYLLABLE RANH +B783;B783;1105 1161 11AE;B783;1105 1161 11AE; # (랃; 랃; 랃; 랃; 랃; ) HANGUL SYLLABLE RAD +B784;B784;1105 1161 11AF;B784;1105 1161 11AF; # (랄; 랄; 랄; 랄; 랄; ) HANGUL SYLLABLE RAL +B785;B785;1105 1161 11B0;B785;1105 1161 11B0; # (랅; 랅; 랅; 랅; 랅; ) HANGUL SYLLABLE RALG +B786;B786;1105 1161 11B1;B786;1105 1161 11B1; # (랆; 랆; 랆; 랆; 랆; ) HANGUL SYLLABLE RALM +B787;B787;1105 1161 11B2;B787;1105 1161 11B2; # (랇; 랇; 랇; 랇; 랇; ) HANGUL SYLLABLE RALB +B788;B788;1105 1161 11B3;B788;1105 1161 11B3; # (랈; 랈; 랈; 랈; 랈; ) HANGUL SYLLABLE RALS +B789;B789;1105 1161 11B4;B789;1105 1161 11B4; # (랉; 랉; 랉; 랉; 랉; ) HANGUL SYLLABLE RALT +B78A;B78A;1105 1161 11B5;B78A;1105 1161 11B5; # (랊; 랊; 랊; 랊; 랊; ) HANGUL SYLLABLE RALP +B78B;B78B;1105 1161 11B6;B78B;1105 1161 11B6; # (랋; 랋; 랋; 랋; 랋; ) HANGUL SYLLABLE RALH +B78C;B78C;1105 1161 11B7;B78C;1105 1161 11B7; # (람; 람; 람; 람; 람; ) HANGUL SYLLABLE RAM +B78D;B78D;1105 1161 11B8;B78D;1105 1161 11B8; # (랍; 랍; 랍; 랍; 랍; ) HANGUL SYLLABLE RAB +B78E;B78E;1105 1161 11B9;B78E;1105 1161 11B9; # (랎; 랎; 랎; 랎; 랎; ) HANGUL SYLLABLE RABS +B78F;B78F;1105 1161 11BA;B78F;1105 1161 11BA; # (랏; 랏; 랏; 랏; 랏; ) HANGUL SYLLABLE RAS +B790;B790;1105 1161 11BB;B790;1105 1161 11BB; # (랐; 랐; 랐; 랐; 랐; ) HANGUL SYLLABLE RASS +B791;B791;1105 1161 11BC;B791;1105 1161 11BC; # (랑; 랑; 랑; 랑; 랑; ) HANGUL SYLLABLE RANG +B792;B792;1105 1161 11BD;B792;1105 1161 11BD; # (랒; 랒; 랒; 랒; 랒; ) HANGUL SYLLABLE RAJ +B793;B793;1105 1161 11BE;B793;1105 1161 11BE; # (랓; 랓; 랓; 랓; 랓; ) HANGUL SYLLABLE RAC +B794;B794;1105 1161 11BF;B794;1105 1161 11BF; # (랔; 랔; 랔; 랔; 랔; ) HANGUL SYLLABLE RAK +B795;B795;1105 1161 11C0;B795;1105 1161 11C0; # (랕; 랕; 랕; 랕; 랕; ) HANGUL SYLLABLE RAT +B796;B796;1105 1161 11C1;B796;1105 1161 11C1; # (랖; 랖; 랖; 랖; 랖; ) HANGUL SYLLABLE RAP +B797;B797;1105 1161 11C2;B797;1105 1161 11C2; # (랗; 랗; 랗; 랗; 랗; ) HANGUL SYLLABLE RAH +B798;B798;1105 1162;B798;1105 1162; # (래; 래; 래; 래; 래; ) HANGUL SYLLABLE RAE +B799;B799;1105 1162 11A8;B799;1105 1162 11A8; # (랙; 랙; 랙; 랙; 랙; ) HANGUL SYLLABLE RAEG +B79A;B79A;1105 1162 11A9;B79A;1105 1162 11A9; # (랚; 랚; 랚; 랚; 랚; ) HANGUL SYLLABLE RAEGG +B79B;B79B;1105 1162 11AA;B79B;1105 1162 11AA; # (랛; 랛; 랛; 랛; 랛; ) HANGUL SYLLABLE RAEGS +B79C;B79C;1105 1162 11AB;B79C;1105 1162 11AB; # (랜; 랜; 랜; 랜; 랜; ) HANGUL SYLLABLE RAEN +B79D;B79D;1105 1162 11AC;B79D;1105 1162 11AC; # (랝; 랝; 랝; 랝; 랝; ) HANGUL SYLLABLE RAENJ +B79E;B79E;1105 1162 11AD;B79E;1105 1162 11AD; # (랞; 랞; 랞; 랞; 랞; ) HANGUL SYLLABLE RAENH +B79F;B79F;1105 1162 11AE;B79F;1105 1162 11AE; # (랟; 랟; 랟; 랟; 랟; ) HANGUL SYLLABLE RAED +B7A0;B7A0;1105 1162 11AF;B7A0;1105 1162 11AF; # (랠; 랠; 랠; 랠; 랠; ) HANGUL SYLLABLE RAEL +B7A1;B7A1;1105 1162 11B0;B7A1;1105 1162 11B0; # (랡; 랡; 랡; 랡; 랡; ) HANGUL SYLLABLE RAELG +B7A2;B7A2;1105 1162 11B1;B7A2;1105 1162 11B1; # (랢; 랢; 랢; 랢; 랢; ) HANGUL SYLLABLE RAELM +B7A3;B7A3;1105 1162 11B2;B7A3;1105 1162 11B2; # (랣; 랣; 랣; 랣; 랣; ) HANGUL SYLLABLE RAELB +B7A4;B7A4;1105 1162 11B3;B7A4;1105 1162 11B3; # (랤; 랤; 랤; 랤; 랤; ) HANGUL SYLLABLE RAELS +B7A5;B7A5;1105 1162 11B4;B7A5;1105 1162 11B4; # (랥; 랥; 랥; 랥; 랥; ) HANGUL SYLLABLE RAELT +B7A6;B7A6;1105 1162 11B5;B7A6;1105 1162 11B5; # (랦; 랦; 랦; 랦; 랦; ) HANGUL SYLLABLE RAELP +B7A7;B7A7;1105 1162 11B6;B7A7;1105 1162 11B6; # (랧; 랧; 랧; 랧; 랧; ) HANGUL SYLLABLE RAELH +B7A8;B7A8;1105 1162 11B7;B7A8;1105 1162 11B7; # (램; 램; 램; 램; 램; ) HANGUL SYLLABLE RAEM +B7A9;B7A9;1105 1162 11B8;B7A9;1105 1162 11B8; # (랩; 랩; 랩; 랩; 랩; ) HANGUL SYLLABLE RAEB +B7AA;B7AA;1105 1162 11B9;B7AA;1105 1162 11B9; # (랪; 랪; 랪; 랪; 랪; ) HANGUL SYLLABLE RAEBS +B7AB;B7AB;1105 1162 11BA;B7AB;1105 1162 11BA; # (랫; 랫; 랫; 랫; 랫; ) HANGUL SYLLABLE RAES +B7AC;B7AC;1105 1162 11BB;B7AC;1105 1162 11BB; # (랬; 랬; 랬; 랬; 랬; ) HANGUL SYLLABLE RAESS +B7AD;B7AD;1105 1162 11BC;B7AD;1105 1162 11BC; # (랭; 랭; 랭; 랭; 랭; ) HANGUL SYLLABLE RAENG +B7AE;B7AE;1105 1162 11BD;B7AE;1105 1162 11BD; # (랮; 랮; 랮; 랮; 랮; ) HANGUL SYLLABLE RAEJ +B7AF;B7AF;1105 1162 11BE;B7AF;1105 1162 11BE; # (랯; 랯; 랯; 랯; 랯; ) HANGUL SYLLABLE RAEC +B7B0;B7B0;1105 1162 11BF;B7B0;1105 1162 11BF; # (랰; 랰; 랰; 랰; 랰; ) HANGUL SYLLABLE RAEK +B7B1;B7B1;1105 1162 11C0;B7B1;1105 1162 11C0; # (랱; 랱; 랱; 랱; 랱; ) HANGUL SYLLABLE RAET +B7B2;B7B2;1105 1162 11C1;B7B2;1105 1162 11C1; # (랲; 랲; 랲; 랲; 랲; ) HANGUL SYLLABLE RAEP +B7B3;B7B3;1105 1162 11C2;B7B3;1105 1162 11C2; # (랳; 랳; 랳; 랳; 랳; ) HANGUL SYLLABLE RAEH +B7B4;B7B4;1105 1163;B7B4;1105 1163; # (랴; 랴; 랴; 랴; 랴; ) HANGUL SYLLABLE RYA +B7B5;B7B5;1105 1163 11A8;B7B5;1105 1163 11A8; # (략; 략; 략; 략; 략; ) HANGUL SYLLABLE RYAG +B7B6;B7B6;1105 1163 11A9;B7B6;1105 1163 11A9; # (랶; 랶; 랶; 랶; 랶; ) HANGUL SYLLABLE RYAGG +B7B7;B7B7;1105 1163 11AA;B7B7;1105 1163 11AA; # (랷; 랷; 랷; 랷; 랷; ) HANGUL SYLLABLE RYAGS +B7B8;B7B8;1105 1163 11AB;B7B8;1105 1163 11AB; # (랸; 랸; 랸; 랸; 랸; ) HANGUL SYLLABLE RYAN +B7B9;B7B9;1105 1163 11AC;B7B9;1105 1163 11AC; # (랹; 랹; 랹; 랹; 랹; ) HANGUL SYLLABLE RYANJ +B7BA;B7BA;1105 1163 11AD;B7BA;1105 1163 11AD; # (랺; 랺; 랺; 랺; 랺; ) HANGUL SYLLABLE RYANH +B7BB;B7BB;1105 1163 11AE;B7BB;1105 1163 11AE; # (랻; 랻; 랻; 랻; 랻; ) HANGUL SYLLABLE RYAD +B7BC;B7BC;1105 1163 11AF;B7BC;1105 1163 11AF; # (랼; 랼; 랼; 랼; 랼; ) HANGUL SYLLABLE RYAL +B7BD;B7BD;1105 1163 11B0;B7BD;1105 1163 11B0; # (랽; 랽; 랽; 랽; 랽; ) HANGUL SYLLABLE RYALG +B7BE;B7BE;1105 1163 11B1;B7BE;1105 1163 11B1; # (랾; 랾; 랾; 랾; 랾; ) HANGUL SYLLABLE RYALM +B7BF;B7BF;1105 1163 11B2;B7BF;1105 1163 11B2; # (랿; 랿; 랿; 랿; 랿; ) HANGUL SYLLABLE RYALB +B7C0;B7C0;1105 1163 11B3;B7C0;1105 1163 11B3; # (럀; 럀; 럀; 럀; 럀; ) HANGUL SYLLABLE RYALS +B7C1;B7C1;1105 1163 11B4;B7C1;1105 1163 11B4; # (럁; 럁; 럁; 럁; 럁; ) HANGUL SYLLABLE RYALT +B7C2;B7C2;1105 1163 11B5;B7C2;1105 1163 11B5; # (럂; 럂; 럂; 럂; 럂; ) HANGUL SYLLABLE RYALP +B7C3;B7C3;1105 1163 11B6;B7C3;1105 1163 11B6; # (럃; 럃; 럃; 럃; 럃; ) HANGUL SYLLABLE RYALH +B7C4;B7C4;1105 1163 11B7;B7C4;1105 1163 11B7; # (럄; 럄; 럄; 럄; 럄; ) HANGUL SYLLABLE RYAM +B7C5;B7C5;1105 1163 11B8;B7C5;1105 1163 11B8; # (럅; 럅; 럅; 럅; 럅; ) HANGUL SYLLABLE RYAB +B7C6;B7C6;1105 1163 11B9;B7C6;1105 1163 11B9; # (럆; 럆; 럆; 럆; 럆; ) HANGUL SYLLABLE RYABS +B7C7;B7C7;1105 1163 11BA;B7C7;1105 1163 11BA; # (럇; 럇; 럇; 럇; 럇; ) HANGUL SYLLABLE RYAS +B7C8;B7C8;1105 1163 11BB;B7C8;1105 1163 11BB; # (럈; 럈; 럈; 럈; 럈; ) HANGUL SYLLABLE RYASS +B7C9;B7C9;1105 1163 11BC;B7C9;1105 1163 11BC; # (량; 량; 량; 량; 량; ) HANGUL SYLLABLE RYANG +B7CA;B7CA;1105 1163 11BD;B7CA;1105 1163 11BD; # (럊; 럊; 럊; 럊; 럊; ) HANGUL SYLLABLE RYAJ +B7CB;B7CB;1105 1163 11BE;B7CB;1105 1163 11BE; # (럋; 럋; 럋; 럋; 럋; ) HANGUL SYLLABLE RYAC +B7CC;B7CC;1105 1163 11BF;B7CC;1105 1163 11BF; # (럌; 럌; 럌; 럌; 럌; ) HANGUL SYLLABLE RYAK +B7CD;B7CD;1105 1163 11C0;B7CD;1105 1163 11C0; # (럍; 럍; 럍; 럍; 럍; ) HANGUL SYLLABLE RYAT +B7CE;B7CE;1105 1163 11C1;B7CE;1105 1163 11C1; # (럎; 럎; 럎; 럎; 럎; ) HANGUL SYLLABLE RYAP +B7CF;B7CF;1105 1163 11C2;B7CF;1105 1163 11C2; # (럏; 럏; 럏; 럏; 럏; ) HANGUL SYLLABLE RYAH +B7D0;B7D0;1105 1164;B7D0;1105 1164; # (럐; 럐; 럐; 럐; 럐; ) HANGUL SYLLABLE RYAE +B7D1;B7D1;1105 1164 11A8;B7D1;1105 1164 11A8; # (럑; 럑; 럑; 럑; 럑; ) HANGUL SYLLABLE RYAEG +B7D2;B7D2;1105 1164 11A9;B7D2;1105 1164 11A9; # (럒; 럒; 럒; 럒; 럒; ) HANGUL SYLLABLE RYAEGG +B7D3;B7D3;1105 1164 11AA;B7D3;1105 1164 11AA; # (럓; 럓; 럓; 럓; 럓; ) HANGUL SYLLABLE RYAEGS +B7D4;B7D4;1105 1164 11AB;B7D4;1105 1164 11AB; # (럔; 럔; 럔; 럔; 럔; ) HANGUL SYLLABLE RYAEN +B7D5;B7D5;1105 1164 11AC;B7D5;1105 1164 11AC; # (럕; 럕; 럕; 럕; 럕; ) HANGUL SYLLABLE RYAENJ +B7D6;B7D6;1105 1164 11AD;B7D6;1105 1164 11AD; # (럖; 럖; 럖; 럖; 럖; ) HANGUL SYLLABLE RYAENH +B7D7;B7D7;1105 1164 11AE;B7D7;1105 1164 11AE; # (럗; 럗; 럗; 럗; 럗; ) HANGUL SYLLABLE RYAED +B7D8;B7D8;1105 1164 11AF;B7D8;1105 1164 11AF; # (럘; 럘; 럘; 럘; 럘; ) HANGUL SYLLABLE RYAEL +B7D9;B7D9;1105 1164 11B0;B7D9;1105 1164 11B0; # (럙; 럙; 럙; 럙; 럙; ) HANGUL SYLLABLE RYAELG +B7DA;B7DA;1105 1164 11B1;B7DA;1105 1164 11B1; # (럚; 럚; 럚; 럚; 럚; ) HANGUL SYLLABLE RYAELM +B7DB;B7DB;1105 1164 11B2;B7DB;1105 1164 11B2; # (럛; 럛; 럛; 럛; 럛; ) HANGUL SYLLABLE RYAELB +B7DC;B7DC;1105 1164 11B3;B7DC;1105 1164 11B3; # (럜; 럜; 럜; 럜; 럜; ) HANGUL SYLLABLE RYAELS +B7DD;B7DD;1105 1164 11B4;B7DD;1105 1164 11B4; # (럝; 럝; 럝; 럝; 럝; ) HANGUL SYLLABLE RYAELT +B7DE;B7DE;1105 1164 11B5;B7DE;1105 1164 11B5; # (럞; 럞; 럞; 럞; 럞; ) HANGUL SYLLABLE RYAELP +B7DF;B7DF;1105 1164 11B6;B7DF;1105 1164 11B6; # (럟; 럟; 럟; 럟; 럟; ) HANGUL SYLLABLE RYAELH +B7E0;B7E0;1105 1164 11B7;B7E0;1105 1164 11B7; # (럠; 럠; 럠; 럠; 럠; ) HANGUL SYLLABLE RYAEM +B7E1;B7E1;1105 1164 11B8;B7E1;1105 1164 11B8; # (럡; 럡; 럡; 럡; 럡; ) HANGUL SYLLABLE RYAEB +B7E2;B7E2;1105 1164 11B9;B7E2;1105 1164 11B9; # (럢; 럢; 럢; 럢; 럢; ) HANGUL SYLLABLE RYAEBS +B7E3;B7E3;1105 1164 11BA;B7E3;1105 1164 11BA; # (럣; 럣; 럣; 럣; 럣; ) HANGUL SYLLABLE RYAES +B7E4;B7E4;1105 1164 11BB;B7E4;1105 1164 11BB; # (럤; 럤; 럤; 럤; 럤; ) HANGUL SYLLABLE RYAESS +B7E5;B7E5;1105 1164 11BC;B7E5;1105 1164 11BC; # (럥; 럥; 럥; 럥; 럥; ) HANGUL SYLLABLE RYAENG +B7E6;B7E6;1105 1164 11BD;B7E6;1105 1164 11BD; # (럦; 럦; 럦; 럦; 럦; ) HANGUL SYLLABLE RYAEJ +B7E7;B7E7;1105 1164 11BE;B7E7;1105 1164 11BE; # (럧; 럧; 럧; 럧; 럧; ) HANGUL SYLLABLE RYAEC +B7E8;B7E8;1105 1164 11BF;B7E8;1105 1164 11BF; # (럨; 럨; 럨; 럨; 럨; ) HANGUL SYLLABLE RYAEK +B7E9;B7E9;1105 1164 11C0;B7E9;1105 1164 11C0; # (럩; 럩; 럩; 럩; 럩; ) HANGUL SYLLABLE RYAET +B7EA;B7EA;1105 1164 11C1;B7EA;1105 1164 11C1; # (럪; 럪; 럪; 럪; 럪; ) HANGUL SYLLABLE RYAEP +B7EB;B7EB;1105 1164 11C2;B7EB;1105 1164 11C2; # (럫; 럫; 럫; 럫; 럫; ) HANGUL SYLLABLE RYAEH +B7EC;B7EC;1105 1165;B7EC;1105 1165; # (러; 러; 러; 러; 러; ) HANGUL SYLLABLE REO +B7ED;B7ED;1105 1165 11A8;B7ED;1105 1165 11A8; # (럭; 럭; 럭; 럭; 럭; ) HANGUL SYLLABLE REOG +B7EE;B7EE;1105 1165 11A9;B7EE;1105 1165 11A9; # (럮; 럮; 럮; 럮; 럮; ) HANGUL SYLLABLE REOGG +B7EF;B7EF;1105 1165 11AA;B7EF;1105 1165 11AA; # (럯; 럯; 럯; 럯; 럯; ) HANGUL SYLLABLE REOGS +B7F0;B7F0;1105 1165 11AB;B7F0;1105 1165 11AB; # (런; 런; 런; 런; 런; ) HANGUL SYLLABLE REON +B7F1;B7F1;1105 1165 11AC;B7F1;1105 1165 11AC; # (럱; 럱; 럱; 럱; 럱; ) HANGUL SYLLABLE REONJ +B7F2;B7F2;1105 1165 11AD;B7F2;1105 1165 11AD; # (럲; 럲; 럲; 럲; 럲; ) HANGUL SYLLABLE REONH +B7F3;B7F3;1105 1165 11AE;B7F3;1105 1165 11AE; # (럳; 럳; 럳; 럳; 럳; ) HANGUL SYLLABLE REOD +B7F4;B7F4;1105 1165 11AF;B7F4;1105 1165 11AF; # (럴; 럴; 럴; 럴; 럴; ) HANGUL SYLLABLE REOL +B7F5;B7F5;1105 1165 11B0;B7F5;1105 1165 11B0; # (럵; 럵; 럵; 럵; 럵; ) HANGUL SYLLABLE REOLG +B7F6;B7F6;1105 1165 11B1;B7F6;1105 1165 11B1; # (럶; 럶; 럶; 럶; 럶; ) HANGUL SYLLABLE REOLM +B7F7;B7F7;1105 1165 11B2;B7F7;1105 1165 11B2; # (럷; 럷; 럷; 럷; 럷; ) HANGUL SYLLABLE REOLB +B7F8;B7F8;1105 1165 11B3;B7F8;1105 1165 11B3; # (럸; 럸; 럸; 럸; 럸; ) HANGUL SYLLABLE REOLS +B7F9;B7F9;1105 1165 11B4;B7F9;1105 1165 11B4; # (럹; 럹; 럹; 럹; 럹; ) HANGUL SYLLABLE REOLT +B7FA;B7FA;1105 1165 11B5;B7FA;1105 1165 11B5; # (럺; 럺; 럺; 럺; 럺; ) HANGUL SYLLABLE REOLP +B7FB;B7FB;1105 1165 11B6;B7FB;1105 1165 11B6; # (럻; 럻; 럻; 럻; 럻; ) HANGUL SYLLABLE REOLH +B7FC;B7FC;1105 1165 11B7;B7FC;1105 1165 11B7; # (럼; 럼; 럼; 럼; 럼; ) HANGUL SYLLABLE REOM +B7FD;B7FD;1105 1165 11B8;B7FD;1105 1165 11B8; # (럽; 럽; 럽; 럽; 럽; ) HANGUL SYLLABLE REOB +B7FE;B7FE;1105 1165 11B9;B7FE;1105 1165 11B9; # (럾; 럾; 럾; 럾; 럾; ) HANGUL SYLLABLE REOBS +B7FF;B7FF;1105 1165 11BA;B7FF;1105 1165 11BA; # (럿; 럿; 럿; 럿; 럿; ) HANGUL SYLLABLE REOS +B800;B800;1105 1165 11BB;B800;1105 1165 11BB; # (렀; 렀; 렀; 렀; 렀; ) HANGUL SYLLABLE REOSS +B801;B801;1105 1165 11BC;B801;1105 1165 11BC; # (렁; 렁; 렁; 렁; 렁; ) HANGUL SYLLABLE REONG +B802;B802;1105 1165 11BD;B802;1105 1165 11BD; # (렂; 렂; 렂; 렂; 렂; ) HANGUL SYLLABLE REOJ +B803;B803;1105 1165 11BE;B803;1105 1165 11BE; # (렃; 렃; 렃; 렃; 렃; ) HANGUL SYLLABLE REOC +B804;B804;1105 1165 11BF;B804;1105 1165 11BF; # (렄; 렄; 렄; 렄; 렄; ) HANGUL SYLLABLE REOK +B805;B805;1105 1165 11C0;B805;1105 1165 11C0; # (렅; 렅; 렅; 렅; 렅; ) HANGUL SYLLABLE REOT +B806;B806;1105 1165 11C1;B806;1105 1165 11C1; # (렆; 렆; 렆; 렆; 렆; ) HANGUL SYLLABLE REOP +B807;B807;1105 1165 11C2;B807;1105 1165 11C2; # (렇; 렇; 렇; 렇; 렇; ) HANGUL SYLLABLE REOH +B808;B808;1105 1166;B808;1105 1166; # (레; 레; 레; 레; 레; ) HANGUL SYLLABLE RE +B809;B809;1105 1166 11A8;B809;1105 1166 11A8; # (렉; 렉; 렉; 렉; 렉; ) HANGUL SYLLABLE REG +B80A;B80A;1105 1166 11A9;B80A;1105 1166 11A9; # (렊; 렊; 렊; 렊; 렊; ) HANGUL SYLLABLE REGG +B80B;B80B;1105 1166 11AA;B80B;1105 1166 11AA; # (렋; 렋; 렋; 렋; 렋; ) HANGUL SYLLABLE REGS +B80C;B80C;1105 1166 11AB;B80C;1105 1166 11AB; # (렌; 렌; 렌; 렌; 렌; ) HANGUL SYLLABLE REN +B80D;B80D;1105 1166 11AC;B80D;1105 1166 11AC; # (렍; 렍; 렍; 렍; 렍; ) HANGUL SYLLABLE RENJ +B80E;B80E;1105 1166 11AD;B80E;1105 1166 11AD; # (렎; 렎; 렎; 렎; 렎; ) HANGUL SYLLABLE RENH +B80F;B80F;1105 1166 11AE;B80F;1105 1166 11AE; # (렏; 렏; 렏; 렏; 렏; ) HANGUL SYLLABLE RED +B810;B810;1105 1166 11AF;B810;1105 1166 11AF; # (렐; 렐; 렐; 렐; 렐; ) HANGUL SYLLABLE REL +B811;B811;1105 1166 11B0;B811;1105 1166 11B0; # (렑; 렑; 렑; 렑; 렑; ) HANGUL SYLLABLE RELG +B812;B812;1105 1166 11B1;B812;1105 1166 11B1; # (렒; 렒; 렒; 렒; 렒; ) HANGUL SYLLABLE RELM +B813;B813;1105 1166 11B2;B813;1105 1166 11B2; # (렓; 렓; 렓; 렓; 렓; ) HANGUL SYLLABLE RELB +B814;B814;1105 1166 11B3;B814;1105 1166 11B3; # (렔; 렔; 렔; 렔; 렔; ) HANGUL SYLLABLE RELS +B815;B815;1105 1166 11B4;B815;1105 1166 11B4; # (렕; 렕; 렕; 렕; 렕; ) HANGUL SYLLABLE RELT +B816;B816;1105 1166 11B5;B816;1105 1166 11B5; # (렖; 렖; 렖; 렖; 렖; ) HANGUL SYLLABLE RELP +B817;B817;1105 1166 11B6;B817;1105 1166 11B6; # (렗; 렗; 렗; 렗; 렗; ) HANGUL SYLLABLE RELH +B818;B818;1105 1166 11B7;B818;1105 1166 11B7; # (렘; 렘; 렘; 렘; 렘; ) HANGUL SYLLABLE REM +B819;B819;1105 1166 11B8;B819;1105 1166 11B8; # (렙; 렙; 렙; 렙; 렙; ) HANGUL SYLLABLE REB +B81A;B81A;1105 1166 11B9;B81A;1105 1166 11B9; # (렚; 렚; 렚; 렚; 렚; ) HANGUL SYLLABLE REBS +B81B;B81B;1105 1166 11BA;B81B;1105 1166 11BA; # (렛; 렛; 렛; 렛; 렛; ) HANGUL SYLLABLE RES +B81C;B81C;1105 1166 11BB;B81C;1105 1166 11BB; # (렜; 렜; 렜; 렜; 렜; ) HANGUL SYLLABLE RESS +B81D;B81D;1105 1166 11BC;B81D;1105 1166 11BC; # (렝; 렝; 렝; 렝; 렝; ) HANGUL SYLLABLE RENG +B81E;B81E;1105 1166 11BD;B81E;1105 1166 11BD; # (렞; 렞; 렞; 렞; 렞; ) HANGUL SYLLABLE REJ +B81F;B81F;1105 1166 11BE;B81F;1105 1166 11BE; # (렟; 렟; 렟; 렟; 렟; ) HANGUL SYLLABLE REC +B820;B820;1105 1166 11BF;B820;1105 1166 11BF; # (렠; 렠; 렠; 렠; 렠; ) HANGUL SYLLABLE REK +B821;B821;1105 1166 11C0;B821;1105 1166 11C0; # (렡; 렡; 렡; 렡; 렡; ) HANGUL SYLLABLE RET +B822;B822;1105 1166 11C1;B822;1105 1166 11C1; # (렢; 렢; 렢; 렢; 렢; ) HANGUL SYLLABLE REP +B823;B823;1105 1166 11C2;B823;1105 1166 11C2; # (렣; 렣; 렣; 렣; 렣; ) HANGUL SYLLABLE REH +B824;B824;1105 1167;B824;1105 1167; # (려; 려; 려; 려; 려; ) HANGUL SYLLABLE RYEO +B825;B825;1105 1167 11A8;B825;1105 1167 11A8; # (력; 력; 력; 력; 력; ) HANGUL SYLLABLE RYEOG +B826;B826;1105 1167 11A9;B826;1105 1167 11A9; # (렦; 렦; 렦; 렦; 렦; ) HANGUL SYLLABLE RYEOGG +B827;B827;1105 1167 11AA;B827;1105 1167 11AA; # (렧; 렧; 렧; 렧; 렧; ) HANGUL SYLLABLE RYEOGS +B828;B828;1105 1167 11AB;B828;1105 1167 11AB; # (련; 련; 련; 련; 련; ) HANGUL SYLLABLE RYEON +B829;B829;1105 1167 11AC;B829;1105 1167 11AC; # (렩; 렩; 렩; 렩; 렩; ) HANGUL SYLLABLE RYEONJ +B82A;B82A;1105 1167 11AD;B82A;1105 1167 11AD; # (렪; 렪; 렪; 렪; 렪; ) HANGUL SYLLABLE RYEONH +B82B;B82B;1105 1167 11AE;B82B;1105 1167 11AE; # (렫; 렫; 렫; 렫; 렫; ) HANGUL SYLLABLE RYEOD +B82C;B82C;1105 1167 11AF;B82C;1105 1167 11AF; # (렬; 렬; 렬; 렬; 렬; ) HANGUL SYLLABLE RYEOL +B82D;B82D;1105 1167 11B0;B82D;1105 1167 11B0; # (렭; 렭; 렭; 렭; 렭; ) HANGUL SYLLABLE RYEOLG +B82E;B82E;1105 1167 11B1;B82E;1105 1167 11B1; # (렮; 렮; 렮; 렮; 렮; ) HANGUL SYLLABLE RYEOLM +B82F;B82F;1105 1167 11B2;B82F;1105 1167 11B2; # (렯; 렯; 렯; 렯; 렯; ) HANGUL SYLLABLE RYEOLB +B830;B830;1105 1167 11B3;B830;1105 1167 11B3; # (렰; 렰; 렰; 렰; 렰; ) HANGUL SYLLABLE RYEOLS +B831;B831;1105 1167 11B4;B831;1105 1167 11B4; # (렱; 렱; 렱; 렱; 렱; ) HANGUL SYLLABLE RYEOLT +B832;B832;1105 1167 11B5;B832;1105 1167 11B5; # (렲; 렲; 렲; 렲; 렲; ) HANGUL SYLLABLE RYEOLP +B833;B833;1105 1167 11B6;B833;1105 1167 11B6; # (렳; 렳; 렳; 렳; 렳; ) HANGUL SYLLABLE RYEOLH +B834;B834;1105 1167 11B7;B834;1105 1167 11B7; # (렴; 렴; 렴; 렴; 렴; ) HANGUL SYLLABLE RYEOM +B835;B835;1105 1167 11B8;B835;1105 1167 11B8; # (렵; 렵; 렵; 렵; 렵; ) HANGUL SYLLABLE RYEOB +B836;B836;1105 1167 11B9;B836;1105 1167 11B9; # (렶; 렶; 렶; 렶; 렶; ) HANGUL SYLLABLE RYEOBS +B837;B837;1105 1167 11BA;B837;1105 1167 11BA; # (렷; 렷; 렷; 렷; 렷; ) HANGUL SYLLABLE RYEOS +B838;B838;1105 1167 11BB;B838;1105 1167 11BB; # (렸; 렸; 렸; 렸; 렸; ) HANGUL SYLLABLE RYEOSS +B839;B839;1105 1167 11BC;B839;1105 1167 11BC; # (령; 령; 령; 령; 령; ) HANGUL SYLLABLE RYEONG +B83A;B83A;1105 1167 11BD;B83A;1105 1167 11BD; # (렺; 렺; 렺; 렺; 렺; ) HANGUL SYLLABLE RYEOJ +B83B;B83B;1105 1167 11BE;B83B;1105 1167 11BE; # (렻; 렻; 렻; 렻; 렻; ) HANGUL SYLLABLE RYEOC +B83C;B83C;1105 1167 11BF;B83C;1105 1167 11BF; # (렼; 렼; 렼; 렼; 렼; ) HANGUL SYLLABLE RYEOK +B83D;B83D;1105 1167 11C0;B83D;1105 1167 11C0; # (렽; 렽; 렽; 렽; 렽; ) HANGUL SYLLABLE RYEOT +B83E;B83E;1105 1167 11C1;B83E;1105 1167 11C1; # (렾; 렾; 렾; 렾; 렾; ) HANGUL SYLLABLE RYEOP +B83F;B83F;1105 1167 11C2;B83F;1105 1167 11C2; # (렿; 렿; 렿; 렿; 렿; ) HANGUL SYLLABLE RYEOH +B840;B840;1105 1168;B840;1105 1168; # (례; 례; 례; 례; 례; ) HANGUL SYLLABLE RYE +B841;B841;1105 1168 11A8;B841;1105 1168 11A8; # (롁; 롁; 롁; 롁; 롁; ) HANGUL SYLLABLE RYEG +B842;B842;1105 1168 11A9;B842;1105 1168 11A9; # (롂; 롂; 롂; 롂; 롂; ) HANGUL SYLLABLE RYEGG +B843;B843;1105 1168 11AA;B843;1105 1168 11AA; # (롃; 롃; 롃; 롃; 롃; ) HANGUL SYLLABLE RYEGS +B844;B844;1105 1168 11AB;B844;1105 1168 11AB; # (롄; 롄; 롄; 롄; 롄; ) HANGUL SYLLABLE RYEN +B845;B845;1105 1168 11AC;B845;1105 1168 11AC; # (롅; 롅; 롅; 롅; 롅; ) HANGUL SYLLABLE RYENJ +B846;B846;1105 1168 11AD;B846;1105 1168 11AD; # (롆; 롆; 롆; 롆; 롆; ) HANGUL SYLLABLE RYENH +B847;B847;1105 1168 11AE;B847;1105 1168 11AE; # (롇; 롇; 롇; 롇; 롇; ) HANGUL SYLLABLE RYED +B848;B848;1105 1168 11AF;B848;1105 1168 11AF; # (롈; 롈; 롈; 롈; 롈; ) HANGUL SYLLABLE RYEL +B849;B849;1105 1168 11B0;B849;1105 1168 11B0; # (롉; 롉; 롉; 롉; 롉; ) HANGUL SYLLABLE RYELG +B84A;B84A;1105 1168 11B1;B84A;1105 1168 11B1; # (롊; 롊; 롊; 롊; 롊; ) HANGUL SYLLABLE RYELM +B84B;B84B;1105 1168 11B2;B84B;1105 1168 11B2; # (롋; 롋; 롋; 롋; 롋; ) HANGUL SYLLABLE RYELB +B84C;B84C;1105 1168 11B3;B84C;1105 1168 11B3; # (롌; 롌; 롌; 롌; 롌; ) HANGUL SYLLABLE RYELS +B84D;B84D;1105 1168 11B4;B84D;1105 1168 11B4; # (롍; 롍; 롍; 롍; 롍; ) HANGUL SYLLABLE RYELT +B84E;B84E;1105 1168 11B5;B84E;1105 1168 11B5; # (롎; 롎; 롎; 롎; 롎; ) HANGUL SYLLABLE RYELP +B84F;B84F;1105 1168 11B6;B84F;1105 1168 11B6; # (롏; 롏; 롏; 롏; 롏; ) HANGUL SYLLABLE RYELH +B850;B850;1105 1168 11B7;B850;1105 1168 11B7; # (롐; 롐; 롐; 롐; 롐; ) HANGUL SYLLABLE RYEM +B851;B851;1105 1168 11B8;B851;1105 1168 11B8; # (롑; 롑; 롑; 롑; 롑; ) HANGUL SYLLABLE RYEB +B852;B852;1105 1168 11B9;B852;1105 1168 11B9; # (롒; 롒; 롒; 롒; 롒; ) HANGUL SYLLABLE RYEBS +B853;B853;1105 1168 11BA;B853;1105 1168 11BA; # (롓; 롓; 롓; 롓; 롓; ) HANGUL SYLLABLE RYES +B854;B854;1105 1168 11BB;B854;1105 1168 11BB; # (롔; 롔; 롔; 롔; 롔; ) HANGUL SYLLABLE RYESS +B855;B855;1105 1168 11BC;B855;1105 1168 11BC; # (롕; 롕; 롕; 롕; 롕; ) HANGUL SYLLABLE RYENG +B856;B856;1105 1168 11BD;B856;1105 1168 11BD; # (롖; 롖; 롖; 롖; 롖; ) HANGUL SYLLABLE RYEJ +B857;B857;1105 1168 11BE;B857;1105 1168 11BE; # (롗; 롗; 롗; 롗; 롗; ) HANGUL SYLLABLE RYEC +B858;B858;1105 1168 11BF;B858;1105 1168 11BF; # (롘; 롘; 롘; 롘; 롘; ) HANGUL SYLLABLE RYEK +B859;B859;1105 1168 11C0;B859;1105 1168 11C0; # (롙; 롙; 롙; 롙; 롙; ) HANGUL SYLLABLE RYET +B85A;B85A;1105 1168 11C1;B85A;1105 1168 11C1; # (롚; 롚; 롚; 롚; 롚; ) HANGUL SYLLABLE RYEP +B85B;B85B;1105 1168 11C2;B85B;1105 1168 11C2; # (롛; 롛; 롛; 롛; 롛; ) HANGUL SYLLABLE RYEH +B85C;B85C;1105 1169;B85C;1105 1169; # (로; 로; 로; 로; 로; ) HANGUL SYLLABLE RO +B85D;B85D;1105 1169 11A8;B85D;1105 1169 11A8; # (록; 록; 록; 록; 록; ) HANGUL SYLLABLE ROG +B85E;B85E;1105 1169 11A9;B85E;1105 1169 11A9; # (롞; 롞; 롞; 롞; 롞; ) HANGUL SYLLABLE ROGG +B85F;B85F;1105 1169 11AA;B85F;1105 1169 11AA; # (롟; 롟; 롟; 롟; 롟; ) HANGUL SYLLABLE ROGS +B860;B860;1105 1169 11AB;B860;1105 1169 11AB; # (론; 론; 론; 론; 론; ) HANGUL SYLLABLE RON +B861;B861;1105 1169 11AC;B861;1105 1169 11AC; # (롡; 롡; 롡; 롡; 롡; ) HANGUL SYLLABLE RONJ +B862;B862;1105 1169 11AD;B862;1105 1169 11AD; # (롢; 롢; 롢; 롢; 롢; ) HANGUL SYLLABLE RONH +B863;B863;1105 1169 11AE;B863;1105 1169 11AE; # (롣; 롣; 롣; 롣; 롣; ) HANGUL SYLLABLE ROD +B864;B864;1105 1169 11AF;B864;1105 1169 11AF; # (롤; 롤; 롤; 롤; 롤; ) HANGUL SYLLABLE ROL +B865;B865;1105 1169 11B0;B865;1105 1169 11B0; # (롥; 롥; 롥; 롥; 롥; ) HANGUL SYLLABLE ROLG +B866;B866;1105 1169 11B1;B866;1105 1169 11B1; # (롦; 롦; 롦; 롦; 롦; ) HANGUL SYLLABLE ROLM +B867;B867;1105 1169 11B2;B867;1105 1169 11B2; # (롧; 롧; 롧; 롧; 롧; ) HANGUL SYLLABLE ROLB +B868;B868;1105 1169 11B3;B868;1105 1169 11B3; # (롨; 롨; 롨; 롨; 롨; ) HANGUL SYLLABLE ROLS +B869;B869;1105 1169 11B4;B869;1105 1169 11B4; # (롩; 롩; 롩; 롩; 롩; ) HANGUL SYLLABLE ROLT +B86A;B86A;1105 1169 11B5;B86A;1105 1169 11B5; # (롪; 롪; 롪; 롪; 롪; ) HANGUL SYLLABLE ROLP +B86B;B86B;1105 1169 11B6;B86B;1105 1169 11B6; # (롫; 롫; 롫; 롫; 롫; ) HANGUL SYLLABLE ROLH +B86C;B86C;1105 1169 11B7;B86C;1105 1169 11B7; # (롬; 롬; 롬; 롬; 롬; ) HANGUL SYLLABLE ROM +B86D;B86D;1105 1169 11B8;B86D;1105 1169 11B8; # (롭; 롭; 롭; 롭; 롭; ) HANGUL SYLLABLE ROB +B86E;B86E;1105 1169 11B9;B86E;1105 1169 11B9; # (롮; 롮; 롮; 롮; 롮; ) HANGUL SYLLABLE ROBS +B86F;B86F;1105 1169 11BA;B86F;1105 1169 11BA; # (롯; 롯; 롯; 롯; 롯; ) HANGUL SYLLABLE ROS +B870;B870;1105 1169 11BB;B870;1105 1169 11BB; # (롰; 롰; 롰; 롰; 롰; ) HANGUL SYLLABLE ROSS +B871;B871;1105 1169 11BC;B871;1105 1169 11BC; # (롱; 롱; 롱; 롱; 롱; ) HANGUL SYLLABLE RONG +B872;B872;1105 1169 11BD;B872;1105 1169 11BD; # (롲; 롲; 롲; 롲; 롲; ) HANGUL SYLLABLE ROJ +B873;B873;1105 1169 11BE;B873;1105 1169 11BE; # (롳; 롳; 롳; 롳; 롳; ) HANGUL SYLLABLE ROC +B874;B874;1105 1169 11BF;B874;1105 1169 11BF; # (롴; 롴; 롴; 롴; 롴; ) HANGUL SYLLABLE ROK +B875;B875;1105 1169 11C0;B875;1105 1169 11C0; # (롵; 롵; 롵; 롵; 롵; ) HANGUL SYLLABLE ROT +B876;B876;1105 1169 11C1;B876;1105 1169 11C1; # (롶; 롶; 롶; 롶; 롶; ) HANGUL SYLLABLE ROP +B877;B877;1105 1169 11C2;B877;1105 1169 11C2; # (롷; 롷; 롷; 롷; 롷; ) HANGUL SYLLABLE ROH +B878;B878;1105 116A;B878;1105 116A; # (롸; 롸; 롸; 롸; 롸; ) HANGUL SYLLABLE RWA +B879;B879;1105 116A 11A8;B879;1105 116A 11A8; # (롹; 롹; 롹; 롹; 롹; ) HANGUL SYLLABLE RWAG +B87A;B87A;1105 116A 11A9;B87A;1105 116A 11A9; # (롺; 롺; 롺; 롺; 롺; ) HANGUL SYLLABLE RWAGG +B87B;B87B;1105 116A 11AA;B87B;1105 116A 11AA; # (롻; 롻; 롻; 롻; 롻; ) HANGUL SYLLABLE RWAGS +B87C;B87C;1105 116A 11AB;B87C;1105 116A 11AB; # (롼; 롼; 롼; 롼; 롼; ) HANGUL SYLLABLE RWAN +B87D;B87D;1105 116A 11AC;B87D;1105 116A 11AC; # (롽; 롽; 롽; 롽; 롽; ) HANGUL SYLLABLE RWANJ +B87E;B87E;1105 116A 11AD;B87E;1105 116A 11AD; # (롾; 롾; 롾; 롾; 롾; ) HANGUL SYLLABLE RWANH +B87F;B87F;1105 116A 11AE;B87F;1105 116A 11AE; # (롿; 롿; 롿; 롿; 롿; ) HANGUL SYLLABLE RWAD +B880;B880;1105 116A 11AF;B880;1105 116A 11AF; # (뢀; 뢀; 뢀; 뢀; 뢀; ) HANGUL SYLLABLE RWAL +B881;B881;1105 116A 11B0;B881;1105 116A 11B0; # (뢁; 뢁; 뢁; 뢁; 뢁; ) HANGUL SYLLABLE RWALG +B882;B882;1105 116A 11B1;B882;1105 116A 11B1; # (뢂; 뢂; 뢂; 뢂; 뢂; ) HANGUL SYLLABLE RWALM +B883;B883;1105 116A 11B2;B883;1105 116A 11B2; # (뢃; 뢃; 뢃; 뢃; 뢃; ) HANGUL SYLLABLE RWALB +B884;B884;1105 116A 11B3;B884;1105 116A 11B3; # (뢄; 뢄; 뢄; 뢄; 뢄; ) HANGUL SYLLABLE RWALS +B885;B885;1105 116A 11B4;B885;1105 116A 11B4; # (뢅; 뢅; 뢅; 뢅; 뢅; ) HANGUL SYLLABLE RWALT +B886;B886;1105 116A 11B5;B886;1105 116A 11B5; # (뢆; 뢆; 뢆; 뢆; 뢆; ) HANGUL SYLLABLE RWALP +B887;B887;1105 116A 11B6;B887;1105 116A 11B6; # (뢇; 뢇; 뢇; 뢇; 뢇; ) HANGUL SYLLABLE RWALH +B888;B888;1105 116A 11B7;B888;1105 116A 11B7; # (뢈; 뢈; 뢈; 뢈; 뢈; ) HANGUL SYLLABLE RWAM +B889;B889;1105 116A 11B8;B889;1105 116A 11B8; # (뢉; 뢉; 뢉; 뢉; 뢉; ) HANGUL SYLLABLE RWAB +B88A;B88A;1105 116A 11B9;B88A;1105 116A 11B9; # (뢊; 뢊; 뢊; 뢊; 뢊; ) HANGUL SYLLABLE RWABS +B88B;B88B;1105 116A 11BA;B88B;1105 116A 11BA; # (뢋; 뢋; 뢋; 뢋; 뢋; ) HANGUL SYLLABLE RWAS +B88C;B88C;1105 116A 11BB;B88C;1105 116A 11BB; # (뢌; 뢌; 뢌; 뢌; 뢌; ) HANGUL SYLLABLE RWASS +B88D;B88D;1105 116A 11BC;B88D;1105 116A 11BC; # (뢍; 뢍; 뢍; 뢍; 뢍; ) HANGUL SYLLABLE RWANG +B88E;B88E;1105 116A 11BD;B88E;1105 116A 11BD; # (뢎; 뢎; 뢎; 뢎; 뢎; ) HANGUL SYLLABLE RWAJ +B88F;B88F;1105 116A 11BE;B88F;1105 116A 11BE; # (뢏; 뢏; 뢏; 뢏; 뢏; ) HANGUL SYLLABLE RWAC +B890;B890;1105 116A 11BF;B890;1105 116A 11BF; # (뢐; 뢐; 뢐; 뢐; 뢐; ) HANGUL SYLLABLE RWAK +B891;B891;1105 116A 11C0;B891;1105 116A 11C0; # (뢑; 뢑; 뢑; 뢑; 뢑; ) HANGUL SYLLABLE RWAT +B892;B892;1105 116A 11C1;B892;1105 116A 11C1; # (뢒; 뢒; 뢒; 뢒; 뢒; ) HANGUL SYLLABLE RWAP +B893;B893;1105 116A 11C2;B893;1105 116A 11C2; # (뢓; 뢓; 뢓; 뢓; 뢓; ) HANGUL SYLLABLE RWAH +B894;B894;1105 116B;B894;1105 116B; # (뢔; 뢔; 뢔; 뢔; 뢔; ) HANGUL SYLLABLE RWAE +B895;B895;1105 116B 11A8;B895;1105 116B 11A8; # (뢕; 뢕; 뢕; 뢕; 뢕; ) HANGUL SYLLABLE RWAEG +B896;B896;1105 116B 11A9;B896;1105 116B 11A9; # (뢖; 뢖; 뢖; 뢖; 뢖; ) HANGUL SYLLABLE RWAEGG +B897;B897;1105 116B 11AA;B897;1105 116B 11AA; # (뢗; 뢗; 뢗; 뢗; 뢗; ) HANGUL SYLLABLE RWAEGS +B898;B898;1105 116B 11AB;B898;1105 116B 11AB; # (뢘; 뢘; 뢘; 뢘; 뢘; ) HANGUL SYLLABLE RWAEN +B899;B899;1105 116B 11AC;B899;1105 116B 11AC; # (뢙; 뢙; 뢙; 뢙; 뢙; ) HANGUL SYLLABLE RWAENJ +B89A;B89A;1105 116B 11AD;B89A;1105 116B 11AD; # (뢚; 뢚; 뢚; 뢚; 뢚; ) HANGUL SYLLABLE RWAENH +B89B;B89B;1105 116B 11AE;B89B;1105 116B 11AE; # (뢛; 뢛; 뢛; 뢛; 뢛; ) HANGUL SYLLABLE RWAED +B89C;B89C;1105 116B 11AF;B89C;1105 116B 11AF; # (뢜; 뢜; 뢜; 뢜; 뢜; ) HANGUL SYLLABLE RWAEL +B89D;B89D;1105 116B 11B0;B89D;1105 116B 11B0; # (뢝; 뢝; 뢝; 뢝; 뢝; ) HANGUL SYLLABLE RWAELG +B89E;B89E;1105 116B 11B1;B89E;1105 116B 11B1; # (뢞; 뢞; 뢞; 뢞; 뢞; ) HANGUL SYLLABLE RWAELM +B89F;B89F;1105 116B 11B2;B89F;1105 116B 11B2; # (뢟; 뢟; 뢟; 뢟; 뢟; ) HANGUL SYLLABLE RWAELB +B8A0;B8A0;1105 116B 11B3;B8A0;1105 116B 11B3; # (뢠; 뢠; 뢠; 뢠; 뢠; ) HANGUL SYLLABLE RWAELS +B8A1;B8A1;1105 116B 11B4;B8A1;1105 116B 11B4; # (뢡; 뢡; 뢡; 뢡; 뢡; ) HANGUL SYLLABLE RWAELT +B8A2;B8A2;1105 116B 11B5;B8A2;1105 116B 11B5; # (뢢; 뢢; 뢢; 뢢; 뢢; ) HANGUL SYLLABLE RWAELP +B8A3;B8A3;1105 116B 11B6;B8A3;1105 116B 11B6; # (뢣; 뢣; 뢣; 뢣; 뢣; ) HANGUL SYLLABLE RWAELH +B8A4;B8A4;1105 116B 11B7;B8A4;1105 116B 11B7; # (뢤; 뢤; 뢤; 뢤; 뢤; ) HANGUL SYLLABLE RWAEM +B8A5;B8A5;1105 116B 11B8;B8A5;1105 116B 11B8; # (뢥; 뢥; 뢥; 뢥; 뢥; ) HANGUL SYLLABLE RWAEB +B8A6;B8A6;1105 116B 11B9;B8A6;1105 116B 11B9; # (뢦; 뢦; 뢦; 뢦; 뢦; ) HANGUL SYLLABLE RWAEBS +B8A7;B8A7;1105 116B 11BA;B8A7;1105 116B 11BA; # (뢧; 뢧; 뢧; 뢧; 뢧; ) HANGUL SYLLABLE RWAES +B8A8;B8A8;1105 116B 11BB;B8A8;1105 116B 11BB; # (뢨; 뢨; 뢨; 뢨; 뢨; ) HANGUL SYLLABLE RWAESS +B8A9;B8A9;1105 116B 11BC;B8A9;1105 116B 11BC; # (뢩; 뢩; 뢩; 뢩; 뢩; ) HANGUL SYLLABLE RWAENG +B8AA;B8AA;1105 116B 11BD;B8AA;1105 116B 11BD; # (뢪; 뢪; 뢪; 뢪; 뢪; ) HANGUL SYLLABLE RWAEJ +B8AB;B8AB;1105 116B 11BE;B8AB;1105 116B 11BE; # (뢫; 뢫; 뢫; 뢫; 뢫; ) HANGUL SYLLABLE RWAEC +B8AC;B8AC;1105 116B 11BF;B8AC;1105 116B 11BF; # (뢬; 뢬; 뢬; 뢬; 뢬; ) HANGUL SYLLABLE RWAEK +B8AD;B8AD;1105 116B 11C0;B8AD;1105 116B 11C0; # (뢭; 뢭; 뢭; 뢭; 뢭; ) HANGUL SYLLABLE RWAET +B8AE;B8AE;1105 116B 11C1;B8AE;1105 116B 11C1; # (뢮; 뢮; 뢮; 뢮; 뢮; ) HANGUL SYLLABLE RWAEP +B8AF;B8AF;1105 116B 11C2;B8AF;1105 116B 11C2; # (뢯; 뢯; 뢯; 뢯; 뢯; ) HANGUL SYLLABLE RWAEH +B8B0;B8B0;1105 116C;B8B0;1105 116C; # (뢰; 뢰; 뢰; 뢰; 뢰; ) HANGUL SYLLABLE ROE +B8B1;B8B1;1105 116C 11A8;B8B1;1105 116C 11A8; # (뢱; 뢱; 뢱; 뢱; 뢱; ) HANGUL SYLLABLE ROEG +B8B2;B8B2;1105 116C 11A9;B8B2;1105 116C 11A9; # (뢲; 뢲; 뢲; 뢲; 뢲; ) HANGUL SYLLABLE ROEGG +B8B3;B8B3;1105 116C 11AA;B8B3;1105 116C 11AA; # (뢳; 뢳; 뢳; 뢳; 뢳; ) HANGUL SYLLABLE ROEGS +B8B4;B8B4;1105 116C 11AB;B8B4;1105 116C 11AB; # (뢴; 뢴; 뢴; 뢴; 뢴; ) HANGUL SYLLABLE ROEN +B8B5;B8B5;1105 116C 11AC;B8B5;1105 116C 11AC; # (뢵; 뢵; 뢵; 뢵; 뢵; ) HANGUL SYLLABLE ROENJ +B8B6;B8B6;1105 116C 11AD;B8B6;1105 116C 11AD; # (뢶; 뢶; 뢶; 뢶; 뢶; ) HANGUL SYLLABLE ROENH +B8B7;B8B7;1105 116C 11AE;B8B7;1105 116C 11AE; # (뢷; 뢷; 뢷; 뢷; 뢷; ) HANGUL SYLLABLE ROED +B8B8;B8B8;1105 116C 11AF;B8B8;1105 116C 11AF; # (뢸; 뢸; 뢸; 뢸; 뢸; ) HANGUL SYLLABLE ROEL +B8B9;B8B9;1105 116C 11B0;B8B9;1105 116C 11B0; # (뢹; 뢹; 뢹; 뢹; 뢹; ) HANGUL SYLLABLE ROELG +B8BA;B8BA;1105 116C 11B1;B8BA;1105 116C 11B1; # (뢺; 뢺; 뢺; 뢺; 뢺; ) HANGUL SYLLABLE ROELM +B8BB;B8BB;1105 116C 11B2;B8BB;1105 116C 11B2; # (뢻; 뢻; 뢻; 뢻; 뢻; ) HANGUL SYLLABLE ROELB +B8BC;B8BC;1105 116C 11B3;B8BC;1105 116C 11B3; # (뢼; 뢼; 뢼; 뢼; 뢼; ) HANGUL SYLLABLE ROELS +B8BD;B8BD;1105 116C 11B4;B8BD;1105 116C 11B4; # (뢽; 뢽; 뢽; 뢽; 뢽; ) HANGUL SYLLABLE ROELT +B8BE;B8BE;1105 116C 11B5;B8BE;1105 116C 11B5; # (뢾; 뢾; 뢾; 뢾; 뢾; ) HANGUL SYLLABLE ROELP +B8BF;B8BF;1105 116C 11B6;B8BF;1105 116C 11B6; # (뢿; 뢿; 뢿; 뢿; 뢿; ) HANGUL SYLLABLE ROELH +B8C0;B8C0;1105 116C 11B7;B8C0;1105 116C 11B7; # (룀; 룀; 룀; 룀; 룀; ) HANGUL SYLLABLE ROEM +B8C1;B8C1;1105 116C 11B8;B8C1;1105 116C 11B8; # (룁; 룁; 룁; 룁; 룁; ) HANGUL SYLLABLE ROEB +B8C2;B8C2;1105 116C 11B9;B8C2;1105 116C 11B9; # (룂; 룂; 룂; 룂; 룂; ) HANGUL SYLLABLE ROEBS +B8C3;B8C3;1105 116C 11BA;B8C3;1105 116C 11BA; # (룃; 룃; 룃; 룃; 룃; ) HANGUL SYLLABLE ROES +B8C4;B8C4;1105 116C 11BB;B8C4;1105 116C 11BB; # (룄; 룄; 룄; 룄; 룄; ) HANGUL SYLLABLE ROESS +B8C5;B8C5;1105 116C 11BC;B8C5;1105 116C 11BC; # (룅; 룅; 룅; 룅; 룅; ) HANGUL SYLLABLE ROENG +B8C6;B8C6;1105 116C 11BD;B8C6;1105 116C 11BD; # (룆; 룆; 룆; 룆; 룆; ) HANGUL SYLLABLE ROEJ +B8C7;B8C7;1105 116C 11BE;B8C7;1105 116C 11BE; # (룇; 룇; 룇; 룇; 룇; ) HANGUL SYLLABLE ROEC +B8C8;B8C8;1105 116C 11BF;B8C8;1105 116C 11BF; # (룈; 룈; 룈; 룈; 룈; ) HANGUL SYLLABLE ROEK +B8C9;B8C9;1105 116C 11C0;B8C9;1105 116C 11C0; # (룉; 룉; 룉; 룉; 룉; ) HANGUL SYLLABLE ROET +B8CA;B8CA;1105 116C 11C1;B8CA;1105 116C 11C1; # (룊; 룊; 룊; 룊; 룊; ) HANGUL SYLLABLE ROEP +B8CB;B8CB;1105 116C 11C2;B8CB;1105 116C 11C2; # (룋; 룋; 룋; 룋; 룋; ) HANGUL SYLLABLE ROEH +B8CC;B8CC;1105 116D;B8CC;1105 116D; # (료; 료; 료; 료; 료; ) HANGUL SYLLABLE RYO +B8CD;B8CD;1105 116D 11A8;B8CD;1105 116D 11A8; # (룍; 룍; 룍; 룍; 룍; ) HANGUL SYLLABLE RYOG +B8CE;B8CE;1105 116D 11A9;B8CE;1105 116D 11A9; # (룎; 룎; 룎; 룎; 룎; ) HANGUL SYLLABLE RYOGG +B8CF;B8CF;1105 116D 11AA;B8CF;1105 116D 11AA; # (룏; 룏; 룏; 룏; 룏; ) HANGUL SYLLABLE RYOGS +B8D0;B8D0;1105 116D 11AB;B8D0;1105 116D 11AB; # (룐; 룐; 룐; 룐; 룐; ) HANGUL SYLLABLE RYON +B8D1;B8D1;1105 116D 11AC;B8D1;1105 116D 11AC; # (룑; 룑; 룑; 룑; 룑; ) HANGUL SYLLABLE RYONJ +B8D2;B8D2;1105 116D 11AD;B8D2;1105 116D 11AD; # (룒; 룒; 룒; 룒; 룒; ) HANGUL SYLLABLE RYONH +B8D3;B8D3;1105 116D 11AE;B8D3;1105 116D 11AE; # (룓; 룓; 룓; 룓; 룓; ) HANGUL SYLLABLE RYOD +B8D4;B8D4;1105 116D 11AF;B8D4;1105 116D 11AF; # (룔; 룔; 룔; 룔; 룔; ) HANGUL SYLLABLE RYOL +B8D5;B8D5;1105 116D 11B0;B8D5;1105 116D 11B0; # (룕; 룕; 룕; 룕; 룕; ) HANGUL SYLLABLE RYOLG +B8D6;B8D6;1105 116D 11B1;B8D6;1105 116D 11B1; # (룖; 룖; 룖; 룖; 룖; ) HANGUL SYLLABLE RYOLM +B8D7;B8D7;1105 116D 11B2;B8D7;1105 116D 11B2; # (룗; 룗; 룗; 룗; 룗; ) HANGUL SYLLABLE RYOLB +B8D8;B8D8;1105 116D 11B3;B8D8;1105 116D 11B3; # (룘; 룘; 룘; 룘; 룘; ) HANGUL SYLLABLE RYOLS +B8D9;B8D9;1105 116D 11B4;B8D9;1105 116D 11B4; # (룙; 룙; 룙; 룙; 룙; ) HANGUL SYLLABLE RYOLT +B8DA;B8DA;1105 116D 11B5;B8DA;1105 116D 11B5; # (룚; 룚; 룚; 룚; 룚; ) HANGUL SYLLABLE RYOLP +B8DB;B8DB;1105 116D 11B6;B8DB;1105 116D 11B6; # (룛; 룛; 룛; 룛; 룛; ) HANGUL SYLLABLE RYOLH +B8DC;B8DC;1105 116D 11B7;B8DC;1105 116D 11B7; # (룜; 룜; 룜; 룜; 룜; ) HANGUL SYLLABLE RYOM +B8DD;B8DD;1105 116D 11B8;B8DD;1105 116D 11B8; # (룝; 룝; 룝; 룝; 룝; ) HANGUL SYLLABLE RYOB +B8DE;B8DE;1105 116D 11B9;B8DE;1105 116D 11B9; # (룞; 룞; 룞; 룞; 룞; ) HANGUL SYLLABLE RYOBS +B8DF;B8DF;1105 116D 11BA;B8DF;1105 116D 11BA; # (룟; 룟; 룟; 룟; 룟; ) HANGUL SYLLABLE RYOS +B8E0;B8E0;1105 116D 11BB;B8E0;1105 116D 11BB; # (룠; 룠; 룠; 룠; 룠; ) HANGUL SYLLABLE RYOSS +B8E1;B8E1;1105 116D 11BC;B8E1;1105 116D 11BC; # (룡; 룡; 룡; 룡; 룡; ) HANGUL SYLLABLE RYONG +B8E2;B8E2;1105 116D 11BD;B8E2;1105 116D 11BD; # (룢; 룢; 룢; 룢; 룢; ) HANGUL SYLLABLE RYOJ +B8E3;B8E3;1105 116D 11BE;B8E3;1105 116D 11BE; # (룣; 룣; 룣; 룣; 룣; ) HANGUL SYLLABLE RYOC +B8E4;B8E4;1105 116D 11BF;B8E4;1105 116D 11BF; # (룤; 룤; 룤; 룤; 룤; ) HANGUL SYLLABLE RYOK +B8E5;B8E5;1105 116D 11C0;B8E5;1105 116D 11C0; # (룥; 룥; 룥; 룥; 룥; ) HANGUL SYLLABLE RYOT +B8E6;B8E6;1105 116D 11C1;B8E6;1105 116D 11C1; # (룦; 룦; 룦; 룦; 룦; ) HANGUL SYLLABLE RYOP +B8E7;B8E7;1105 116D 11C2;B8E7;1105 116D 11C2; # (룧; 룧; 룧; 룧; 룧; ) HANGUL SYLLABLE RYOH +B8E8;B8E8;1105 116E;B8E8;1105 116E; # (루; 루; 루; 루; 루; ) HANGUL SYLLABLE RU +B8E9;B8E9;1105 116E 11A8;B8E9;1105 116E 11A8; # (룩; 룩; 룩; 룩; 룩; ) HANGUL SYLLABLE RUG +B8EA;B8EA;1105 116E 11A9;B8EA;1105 116E 11A9; # (룪; 룪; 룪; 룪; 룪; ) HANGUL SYLLABLE RUGG +B8EB;B8EB;1105 116E 11AA;B8EB;1105 116E 11AA; # (룫; 룫; 룫; 룫; 룫; ) HANGUL SYLLABLE RUGS +B8EC;B8EC;1105 116E 11AB;B8EC;1105 116E 11AB; # (룬; 룬; 룬; 룬; 룬; ) HANGUL SYLLABLE RUN +B8ED;B8ED;1105 116E 11AC;B8ED;1105 116E 11AC; # (룭; 룭; 룭; 룭; 룭; ) HANGUL SYLLABLE RUNJ +B8EE;B8EE;1105 116E 11AD;B8EE;1105 116E 11AD; # (룮; 룮; 룮; 룮; 룮; ) HANGUL SYLLABLE RUNH +B8EF;B8EF;1105 116E 11AE;B8EF;1105 116E 11AE; # (룯; 룯; 룯; 룯; 룯; ) HANGUL SYLLABLE RUD +B8F0;B8F0;1105 116E 11AF;B8F0;1105 116E 11AF; # (룰; 룰; 룰; 룰; 룰; ) HANGUL SYLLABLE RUL +B8F1;B8F1;1105 116E 11B0;B8F1;1105 116E 11B0; # (룱; 룱; 룱; 룱; 룱; ) HANGUL SYLLABLE RULG +B8F2;B8F2;1105 116E 11B1;B8F2;1105 116E 11B1; # (룲; 룲; 룲; 룲; 룲; ) HANGUL SYLLABLE RULM +B8F3;B8F3;1105 116E 11B2;B8F3;1105 116E 11B2; # (룳; 룳; 룳; 룳; 룳; ) HANGUL SYLLABLE RULB +B8F4;B8F4;1105 116E 11B3;B8F4;1105 116E 11B3; # (룴; 룴; 룴; 룴; 룴; ) HANGUL SYLLABLE RULS +B8F5;B8F5;1105 116E 11B4;B8F5;1105 116E 11B4; # (룵; 룵; 룵; 룵; 룵; ) HANGUL SYLLABLE RULT +B8F6;B8F6;1105 116E 11B5;B8F6;1105 116E 11B5; # (룶; 룶; 룶; 룶; 룶; ) HANGUL SYLLABLE RULP +B8F7;B8F7;1105 116E 11B6;B8F7;1105 116E 11B6; # (룷; 룷; 룷; 룷; 룷; ) HANGUL SYLLABLE RULH +B8F8;B8F8;1105 116E 11B7;B8F8;1105 116E 11B7; # (룸; 룸; 룸; 룸; 룸; ) HANGUL SYLLABLE RUM +B8F9;B8F9;1105 116E 11B8;B8F9;1105 116E 11B8; # (룹; 룹; 룹; 룹; 룹; ) HANGUL SYLLABLE RUB +B8FA;B8FA;1105 116E 11B9;B8FA;1105 116E 11B9; # (룺; 룺; 룺; 룺; 룺; ) HANGUL SYLLABLE RUBS +B8FB;B8FB;1105 116E 11BA;B8FB;1105 116E 11BA; # (룻; 룻; 룻; 룻; 룻; ) HANGUL SYLLABLE RUS +B8FC;B8FC;1105 116E 11BB;B8FC;1105 116E 11BB; # (룼; 룼; 룼; 룼; 룼; ) HANGUL SYLLABLE RUSS +B8FD;B8FD;1105 116E 11BC;B8FD;1105 116E 11BC; # (룽; 룽; 룽; 룽; 룽; ) HANGUL SYLLABLE RUNG +B8FE;B8FE;1105 116E 11BD;B8FE;1105 116E 11BD; # (룾; 룾; 룾; 룾; 룾; ) HANGUL SYLLABLE RUJ +B8FF;B8FF;1105 116E 11BE;B8FF;1105 116E 11BE; # (룿; 룿; 룿; 룿; 룿; ) HANGUL SYLLABLE RUC +B900;B900;1105 116E 11BF;B900;1105 116E 11BF; # (뤀; 뤀; 뤀; 뤀; 뤀; ) HANGUL SYLLABLE RUK +B901;B901;1105 116E 11C0;B901;1105 116E 11C0; # (뤁; 뤁; 뤁; 뤁; 뤁; ) HANGUL SYLLABLE RUT +B902;B902;1105 116E 11C1;B902;1105 116E 11C1; # (뤂; 뤂; 뤂; 뤂; 뤂; ) HANGUL SYLLABLE RUP +B903;B903;1105 116E 11C2;B903;1105 116E 11C2; # (뤃; 뤃; 뤃; 뤃; 뤃; ) HANGUL SYLLABLE RUH +B904;B904;1105 116F;B904;1105 116F; # (뤄; 뤄; 뤄; 뤄; 뤄; ) HANGUL SYLLABLE RWEO +B905;B905;1105 116F 11A8;B905;1105 116F 11A8; # (뤅; 뤅; 뤅; 뤅; 뤅; ) HANGUL SYLLABLE RWEOG +B906;B906;1105 116F 11A9;B906;1105 116F 11A9; # (뤆; 뤆; 뤆; 뤆; 뤆; ) HANGUL SYLLABLE RWEOGG +B907;B907;1105 116F 11AA;B907;1105 116F 11AA; # (뤇; 뤇; 뤇; 뤇; 뤇; ) HANGUL SYLLABLE RWEOGS +B908;B908;1105 116F 11AB;B908;1105 116F 11AB; # (뤈; 뤈; 뤈; 뤈; 뤈; ) HANGUL SYLLABLE RWEON +B909;B909;1105 116F 11AC;B909;1105 116F 11AC; # (뤉; 뤉; 뤉; 뤉; 뤉; ) HANGUL SYLLABLE RWEONJ +B90A;B90A;1105 116F 11AD;B90A;1105 116F 11AD; # (뤊; 뤊; 뤊; 뤊; 뤊; ) HANGUL SYLLABLE RWEONH +B90B;B90B;1105 116F 11AE;B90B;1105 116F 11AE; # (뤋; 뤋; 뤋; 뤋; 뤋; ) HANGUL SYLLABLE RWEOD +B90C;B90C;1105 116F 11AF;B90C;1105 116F 11AF; # (뤌; 뤌; 뤌; 뤌; 뤌; ) HANGUL SYLLABLE RWEOL +B90D;B90D;1105 116F 11B0;B90D;1105 116F 11B0; # (뤍; 뤍; 뤍; 뤍; 뤍; ) HANGUL SYLLABLE RWEOLG +B90E;B90E;1105 116F 11B1;B90E;1105 116F 11B1; # (뤎; 뤎; 뤎; 뤎; 뤎; ) HANGUL SYLLABLE RWEOLM +B90F;B90F;1105 116F 11B2;B90F;1105 116F 11B2; # (뤏; 뤏; 뤏; 뤏; 뤏; ) HANGUL SYLLABLE RWEOLB +B910;B910;1105 116F 11B3;B910;1105 116F 11B3; # (뤐; 뤐; 뤐; 뤐; 뤐; ) HANGUL SYLLABLE RWEOLS +B911;B911;1105 116F 11B4;B911;1105 116F 11B4; # (뤑; 뤑; 뤑; 뤑; 뤑; ) HANGUL SYLLABLE RWEOLT +B912;B912;1105 116F 11B5;B912;1105 116F 11B5; # (뤒; 뤒; 뤒; 뤒; 뤒; ) HANGUL SYLLABLE RWEOLP +B913;B913;1105 116F 11B6;B913;1105 116F 11B6; # (뤓; 뤓; 뤓; 뤓; 뤓; ) HANGUL SYLLABLE RWEOLH +B914;B914;1105 116F 11B7;B914;1105 116F 11B7; # (뤔; 뤔; 뤔; 뤔; 뤔; ) HANGUL SYLLABLE RWEOM +B915;B915;1105 116F 11B8;B915;1105 116F 11B8; # (뤕; 뤕; 뤕; 뤕; 뤕; ) HANGUL SYLLABLE RWEOB +B916;B916;1105 116F 11B9;B916;1105 116F 11B9; # (뤖; 뤖; 뤖; 뤖; 뤖; ) HANGUL SYLLABLE RWEOBS +B917;B917;1105 116F 11BA;B917;1105 116F 11BA; # (뤗; 뤗; 뤗; 뤗; 뤗; ) HANGUL SYLLABLE RWEOS +B918;B918;1105 116F 11BB;B918;1105 116F 11BB; # (뤘; 뤘; 뤘; 뤘; 뤘; ) HANGUL SYLLABLE RWEOSS +B919;B919;1105 116F 11BC;B919;1105 116F 11BC; # (뤙; 뤙; 뤙; 뤙; 뤙; ) HANGUL SYLLABLE RWEONG +B91A;B91A;1105 116F 11BD;B91A;1105 116F 11BD; # (뤚; 뤚; 뤚; 뤚; 뤚; ) HANGUL SYLLABLE RWEOJ +B91B;B91B;1105 116F 11BE;B91B;1105 116F 11BE; # (뤛; 뤛; 뤛; 뤛; 뤛; ) HANGUL SYLLABLE RWEOC +B91C;B91C;1105 116F 11BF;B91C;1105 116F 11BF; # (뤜; 뤜; 뤜; 뤜; 뤜; ) HANGUL SYLLABLE RWEOK +B91D;B91D;1105 116F 11C0;B91D;1105 116F 11C0; # (뤝; 뤝; 뤝; 뤝; 뤝; ) HANGUL SYLLABLE RWEOT +B91E;B91E;1105 116F 11C1;B91E;1105 116F 11C1; # (뤞; 뤞; 뤞; 뤞; 뤞; ) HANGUL SYLLABLE RWEOP +B91F;B91F;1105 116F 11C2;B91F;1105 116F 11C2; # (뤟; 뤟; 뤟; 뤟; 뤟; ) HANGUL SYLLABLE RWEOH +B920;B920;1105 1170;B920;1105 1170; # (뤠; 뤠; 뤠; 뤠; 뤠; ) HANGUL SYLLABLE RWE +B921;B921;1105 1170 11A8;B921;1105 1170 11A8; # (뤡; 뤡; 뤡; 뤡; 뤡; ) HANGUL SYLLABLE RWEG +B922;B922;1105 1170 11A9;B922;1105 1170 11A9; # (뤢; 뤢; 뤢; 뤢; 뤢; ) HANGUL SYLLABLE RWEGG +B923;B923;1105 1170 11AA;B923;1105 1170 11AA; # (뤣; 뤣; 뤣; 뤣; 뤣; ) HANGUL SYLLABLE RWEGS +B924;B924;1105 1170 11AB;B924;1105 1170 11AB; # (뤤; 뤤; 뤤; 뤤; 뤤; ) HANGUL SYLLABLE RWEN +B925;B925;1105 1170 11AC;B925;1105 1170 11AC; # (뤥; 뤥; 뤥; 뤥; 뤥; ) HANGUL SYLLABLE RWENJ +B926;B926;1105 1170 11AD;B926;1105 1170 11AD; # (뤦; 뤦; 뤦; 뤦; 뤦; ) HANGUL SYLLABLE RWENH +B927;B927;1105 1170 11AE;B927;1105 1170 11AE; # (뤧; 뤧; 뤧; 뤧; 뤧; ) HANGUL SYLLABLE RWED +B928;B928;1105 1170 11AF;B928;1105 1170 11AF; # (뤨; 뤨; 뤨; 뤨; 뤨; ) HANGUL SYLLABLE RWEL +B929;B929;1105 1170 11B0;B929;1105 1170 11B0; # (뤩; 뤩; 뤩; 뤩; 뤩; ) HANGUL SYLLABLE RWELG +B92A;B92A;1105 1170 11B1;B92A;1105 1170 11B1; # (뤪; 뤪; 뤪; 뤪; 뤪; ) HANGUL SYLLABLE RWELM +B92B;B92B;1105 1170 11B2;B92B;1105 1170 11B2; # (뤫; 뤫; 뤫; 뤫; 뤫; ) HANGUL SYLLABLE RWELB +B92C;B92C;1105 1170 11B3;B92C;1105 1170 11B3; # (뤬; 뤬; 뤬; 뤬; 뤬; ) HANGUL SYLLABLE RWELS +B92D;B92D;1105 1170 11B4;B92D;1105 1170 11B4; # (뤭; 뤭; 뤭; 뤭; 뤭; ) HANGUL SYLLABLE RWELT +B92E;B92E;1105 1170 11B5;B92E;1105 1170 11B5; # (뤮; 뤮; 뤮; 뤮; 뤮; ) HANGUL SYLLABLE RWELP +B92F;B92F;1105 1170 11B6;B92F;1105 1170 11B6; # (뤯; 뤯; 뤯; 뤯; 뤯; ) HANGUL SYLLABLE RWELH +B930;B930;1105 1170 11B7;B930;1105 1170 11B7; # (뤰; 뤰; 뤰; 뤰; 뤰; ) HANGUL SYLLABLE RWEM +B931;B931;1105 1170 11B8;B931;1105 1170 11B8; # (뤱; 뤱; 뤱; 뤱; 뤱; ) HANGUL SYLLABLE RWEB +B932;B932;1105 1170 11B9;B932;1105 1170 11B9; # (뤲; 뤲; 뤲; 뤲; 뤲; ) HANGUL SYLLABLE RWEBS +B933;B933;1105 1170 11BA;B933;1105 1170 11BA; # (뤳; 뤳; 뤳; 뤳; 뤳; ) HANGUL SYLLABLE RWES +B934;B934;1105 1170 11BB;B934;1105 1170 11BB; # (뤴; 뤴; 뤴; 뤴; 뤴; ) HANGUL SYLLABLE RWESS +B935;B935;1105 1170 11BC;B935;1105 1170 11BC; # (뤵; 뤵; 뤵; 뤵; 뤵; ) HANGUL SYLLABLE RWENG +B936;B936;1105 1170 11BD;B936;1105 1170 11BD; # (뤶; 뤶; 뤶; 뤶; 뤶; ) HANGUL SYLLABLE RWEJ +B937;B937;1105 1170 11BE;B937;1105 1170 11BE; # (뤷; 뤷; 뤷; 뤷; 뤷; ) HANGUL SYLLABLE RWEC +B938;B938;1105 1170 11BF;B938;1105 1170 11BF; # (뤸; 뤸; 뤸; 뤸; 뤸; ) HANGUL SYLLABLE RWEK +B939;B939;1105 1170 11C0;B939;1105 1170 11C0; # (뤹; 뤹; 뤹; 뤹; 뤹; ) HANGUL SYLLABLE RWET +B93A;B93A;1105 1170 11C1;B93A;1105 1170 11C1; # (뤺; 뤺; 뤺; 뤺; 뤺; ) HANGUL SYLLABLE RWEP +B93B;B93B;1105 1170 11C2;B93B;1105 1170 11C2; # (뤻; 뤻; 뤻; 뤻; 뤻; ) HANGUL SYLLABLE RWEH +B93C;B93C;1105 1171;B93C;1105 1171; # (뤼; 뤼; 뤼; 뤼; 뤼; ) HANGUL SYLLABLE RWI +B93D;B93D;1105 1171 11A8;B93D;1105 1171 11A8; # (뤽; 뤽; 뤽; 뤽; 뤽; ) HANGUL SYLLABLE RWIG +B93E;B93E;1105 1171 11A9;B93E;1105 1171 11A9; # (뤾; 뤾; 뤾; 뤾; 뤾; ) HANGUL SYLLABLE RWIGG +B93F;B93F;1105 1171 11AA;B93F;1105 1171 11AA; # (뤿; 뤿; 뤿; 뤿; 뤿; ) HANGUL SYLLABLE RWIGS +B940;B940;1105 1171 11AB;B940;1105 1171 11AB; # (륀; 륀; 륀; 륀; 륀; ) HANGUL SYLLABLE RWIN +B941;B941;1105 1171 11AC;B941;1105 1171 11AC; # (륁; 륁; 륁; 륁; 륁; ) HANGUL SYLLABLE RWINJ +B942;B942;1105 1171 11AD;B942;1105 1171 11AD; # (륂; 륂; 륂; 륂; 륂; ) HANGUL SYLLABLE RWINH +B943;B943;1105 1171 11AE;B943;1105 1171 11AE; # (륃; 륃; 륃; 륃; 륃; ) HANGUL SYLLABLE RWID +B944;B944;1105 1171 11AF;B944;1105 1171 11AF; # (륄; 륄; 륄; 륄; 륄; ) HANGUL SYLLABLE RWIL +B945;B945;1105 1171 11B0;B945;1105 1171 11B0; # (륅; 륅; 륅; 륅; 륅; ) HANGUL SYLLABLE RWILG +B946;B946;1105 1171 11B1;B946;1105 1171 11B1; # (륆; 륆; 륆; 륆; 륆; ) HANGUL SYLLABLE RWILM +B947;B947;1105 1171 11B2;B947;1105 1171 11B2; # (륇; 륇; 륇; 륇; 륇; ) HANGUL SYLLABLE RWILB +B948;B948;1105 1171 11B3;B948;1105 1171 11B3; # (륈; 륈; 륈; 륈; 륈; ) HANGUL SYLLABLE RWILS +B949;B949;1105 1171 11B4;B949;1105 1171 11B4; # (륉; 륉; 륉; 륉; 륉; ) HANGUL SYLLABLE RWILT +B94A;B94A;1105 1171 11B5;B94A;1105 1171 11B5; # (륊; 륊; 륊; 륊; 륊; ) HANGUL SYLLABLE RWILP +B94B;B94B;1105 1171 11B6;B94B;1105 1171 11B6; # (륋; 륋; 륋; 륋; 륋; ) HANGUL SYLLABLE RWILH +B94C;B94C;1105 1171 11B7;B94C;1105 1171 11B7; # (륌; 륌; 륌; 륌; 륌; ) HANGUL SYLLABLE RWIM +B94D;B94D;1105 1171 11B8;B94D;1105 1171 11B8; # (륍; 륍; 륍; 륍; 륍; ) HANGUL SYLLABLE RWIB +B94E;B94E;1105 1171 11B9;B94E;1105 1171 11B9; # (륎; 륎; 륎; 륎; 륎; ) HANGUL SYLLABLE RWIBS +B94F;B94F;1105 1171 11BA;B94F;1105 1171 11BA; # (륏; 륏; 륏; 륏; 륏; ) HANGUL SYLLABLE RWIS +B950;B950;1105 1171 11BB;B950;1105 1171 11BB; # (륐; 륐; 륐; 륐; 륐; ) HANGUL SYLLABLE RWISS +B951;B951;1105 1171 11BC;B951;1105 1171 11BC; # (륑; 륑; 륑; 륑; 륑; ) HANGUL SYLLABLE RWING +B952;B952;1105 1171 11BD;B952;1105 1171 11BD; # (륒; 륒; 륒; 륒; 륒; ) HANGUL SYLLABLE RWIJ +B953;B953;1105 1171 11BE;B953;1105 1171 11BE; # (륓; 륓; 륓; 륓; 륓; ) HANGUL SYLLABLE RWIC +B954;B954;1105 1171 11BF;B954;1105 1171 11BF; # (륔; 륔; 륔; 륔; 륔; ) HANGUL SYLLABLE RWIK +B955;B955;1105 1171 11C0;B955;1105 1171 11C0; # (륕; 륕; 륕; 륕; 륕; ) HANGUL SYLLABLE RWIT +B956;B956;1105 1171 11C1;B956;1105 1171 11C1; # (륖; 륖; 륖; 륖; 륖; ) HANGUL SYLLABLE RWIP +B957;B957;1105 1171 11C2;B957;1105 1171 11C2; # (륗; 륗; 륗; 륗; 륗; ) HANGUL SYLLABLE RWIH +B958;B958;1105 1172;B958;1105 1172; # (류; 류; 류; 류; 류; ) HANGUL SYLLABLE RYU +B959;B959;1105 1172 11A8;B959;1105 1172 11A8; # (륙; 륙; 륙; 륙; 륙; ) HANGUL SYLLABLE RYUG +B95A;B95A;1105 1172 11A9;B95A;1105 1172 11A9; # (륚; 륚; 륚; 륚; 륚; ) HANGUL SYLLABLE RYUGG +B95B;B95B;1105 1172 11AA;B95B;1105 1172 11AA; # (륛; 륛; 륛; 륛; 륛; ) HANGUL SYLLABLE RYUGS +B95C;B95C;1105 1172 11AB;B95C;1105 1172 11AB; # (륜; 륜; 륜; 륜; 륜; ) HANGUL SYLLABLE RYUN +B95D;B95D;1105 1172 11AC;B95D;1105 1172 11AC; # (륝; 륝; 륝; 륝; 륝; ) HANGUL SYLLABLE RYUNJ +B95E;B95E;1105 1172 11AD;B95E;1105 1172 11AD; # (륞; 륞; 륞; 륞; 륞; ) HANGUL SYLLABLE RYUNH +B95F;B95F;1105 1172 11AE;B95F;1105 1172 11AE; # (륟; 륟; 륟; 륟; 륟; ) HANGUL SYLLABLE RYUD +B960;B960;1105 1172 11AF;B960;1105 1172 11AF; # (률; 률; 률; 률; 률; ) HANGUL SYLLABLE RYUL +B961;B961;1105 1172 11B0;B961;1105 1172 11B0; # (륡; 륡; 륡; 륡; 륡; ) HANGUL SYLLABLE RYULG +B962;B962;1105 1172 11B1;B962;1105 1172 11B1; # (륢; 륢; 륢; 륢; 륢; ) HANGUL SYLLABLE RYULM +B963;B963;1105 1172 11B2;B963;1105 1172 11B2; # (륣; 륣; 륣; 륣; 륣; ) HANGUL SYLLABLE RYULB +B964;B964;1105 1172 11B3;B964;1105 1172 11B3; # (륤; 륤; 륤; 륤; 륤; ) HANGUL SYLLABLE RYULS +B965;B965;1105 1172 11B4;B965;1105 1172 11B4; # (륥; 륥; 륥; 륥; 륥; ) HANGUL SYLLABLE RYULT +B966;B966;1105 1172 11B5;B966;1105 1172 11B5; # (륦; 륦; 륦; 륦; 륦; ) HANGUL SYLLABLE RYULP +B967;B967;1105 1172 11B6;B967;1105 1172 11B6; # (륧; 륧; 륧; 륧; 륧; ) HANGUL SYLLABLE RYULH +B968;B968;1105 1172 11B7;B968;1105 1172 11B7; # (륨; 륨; 륨; 륨; 륨; ) HANGUL SYLLABLE RYUM +B969;B969;1105 1172 11B8;B969;1105 1172 11B8; # (륩; 륩; 륩; 륩; 륩; ) HANGUL SYLLABLE RYUB +B96A;B96A;1105 1172 11B9;B96A;1105 1172 11B9; # (륪; 륪; 륪; 륪; 륪; ) HANGUL SYLLABLE RYUBS +B96B;B96B;1105 1172 11BA;B96B;1105 1172 11BA; # (륫; 륫; 륫; 륫; 륫; ) HANGUL SYLLABLE RYUS +B96C;B96C;1105 1172 11BB;B96C;1105 1172 11BB; # (륬; 륬; 륬; 륬; 륬; ) HANGUL SYLLABLE RYUSS +B96D;B96D;1105 1172 11BC;B96D;1105 1172 11BC; # (륭; 륭; 륭; 륭; 륭; ) HANGUL SYLLABLE RYUNG +B96E;B96E;1105 1172 11BD;B96E;1105 1172 11BD; # (륮; 륮; 륮; 륮; 륮; ) HANGUL SYLLABLE RYUJ +B96F;B96F;1105 1172 11BE;B96F;1105 1172 11BE; # (륯; 륯; 륯; 륯; 륯; ) HANGUL SYLLABLE RYUC +B970;B970;1105 1172 11BF;B970;1105 1172 11BF; # (륰; 륰; 륰; 륰; 륰; ) HANGUL SYLLABLE RYUK +B971;B971;1105 1172 11C0;B971;1105 1172 11C0; # (륱; 륱; 륱; 륱; 륱; ) HANGUL SYLLABLE RYUT +B972;B972;1105 1172 11C1;B972;1105 1172 11C1; # (륲; 륲; 륲; 륲; 륲; ) HANGUL SYLLABLE RYUP +B973;B973;1105 1172 11C2;B973;1105 1172 11C2; # (륳; 륳; 륳; 륳; 륳; ) HANGUL SYLLABLE RYUH +B974;B974;1105 1173;B974;1105 1173; # (르; 르; 르; 르; 르; ) HANGUL SYLLABLE REU +B975;B975;1105 1173 11A8;B975;1105 1173 11A8; # (륵; 륵; 륵; 륵; 륵; ) HANGUL SYLLABLE REUG +B976;B976;1105 1173 11A9;B976;1105 1173 11A9; # (륶; 륶; 륶; 륶; 륶; ) HANGUL SYLLABLE REUGG +B977;B977;1105 1173 11AA;B977;1105 1173 11AA; # (륷; 륷; 륷; 륷; 륷; ) HANGUL SYLLABLE REUGS +B978;B978;1105 1173 11AB;B978;1105 1173 11AB; # (른; 른; 른; 른; 른; ) HANGUL SYLLABLE REUN +B979;B979;1105 1173 11AC;B979;1105 1173 11AC; # (륹; 륹; 륹; 륹; 륹; ) HANGUL SYLLABLE REUNJ +B97A;B97A;1105 1173 11AD;B97A;1105 1173 11AD; # (륺; 륺; 륺; 륺; 륺; ) HANGUL SYLLABLE REUNH +B97B;B97B;1105 1173 11AE;B97B;1105 1173 11AE; # (륻; 륻; 륻; 륻; 륻; ) HANGUL SYLLABLE REUD +B97C;B97C;1105 1173 11AF;B97C;1105 1173 11AF; # (를; 를; 를; 를; 를; ) HANGUL SYLLABLE REUL +B97D;B97D;1105 1173 11B0;B97D;1105 1173 11B0; # (륽; 륽; 륽; 륽; 륽; ) HANGUL SYLLABLE REULG +B97E;B97E;1105 1173 11B1;B97E;1105 1173 11B1; # (륾; 륾; 륾; 륾; 륾; ) HANGUL SYLLABLE REULM +B97F;B97F;1105 1173 11B2;B97F;1105 1173 11B2; # (륿; 륿; 륿; 륿; 륿; ) HANGUL SYLLABLE REULB +B980;B980;1105 1173 11B3;B980;1105 1173 11B3; # (릀; 릀; 릀; 릀; 릀; ) HANGUL SYLLABLE REULS +B981;B981;1105 1173 11B4;B981;1105 1173 11B4; # (릁; 릁; 릁; 릁; 릁; ) HANGUL SYLLABLE REULT +B982;B982;1105 1173 11B5;B982;1105 1173 11B5; # (릂; 릂; 릂; 릂; 릂; ) HANGUL SYLLABLE REULP +B983;B983;1105 1173 11B6;B983;1105 1173 11B6; # (릃; 릃; 릃; 릃; 릃; ) HANGUL SYLLABLE REULH +B984;B984;1105 1173 11B7;B984;1105 1173 11B7; # (름; 름; 름; 름; 름; ) HANGUL SYLLABLE REUM +B985;B985;1105 1173 11B8;B985;1105 1173 11B8; # (릅; 릅; 릅; 릅; 릅; ) HANGUL SYLLABLE REUB +B986;B986;1105 1173 11B9;B986;1105 1173 11B9; # (릆; 릆; 릆; 릆; 릆; ) HANGUL SYLLABLE REUBS +B987;B987;1105 1173 11BA;B987;1105 1173 11BA; # (릇; 릇; 릇; 릇; 릇; ) HANGUL SYLLABLE REUS +B988;B988;1105 1173 11BB;B988;1105 1173 11BB; # (릈; 릈; 릈; 릈; 릈; ) HANGUL SYLLABLE REUSS +B989;B989;1105 1173 11BC;B989;1105 1173 11BC; # (릉; 릉; 릉; 릉; 릉; ) HANGUL SYLLABLE REUNG +B98A;B98A;1105 1173 11BD;B98A;1105 1173 11BD; # (릊; 릊; 릊; 릊; 릊; ) HANGUL SYLLABLE REUJ +B98B;B98B;1105 1173 11BE;B98B;1105 1173 11BE; # (릋; 릋; 릋; 릋; 릋; ) HANGUL SYLLABLE REUC +B98C;B98C;1105 1173 11BF;B98C;1105 1173 11BF; # (릌; 릌; 릌; 릌; 릌; ) HANGUL SYLLABLE REUK +B98D;B98D;1105 1173 11C0;B98D;1105 1173 11C0; # (릍; 릍; 릍; 릍; 릍; ) HANGUL SYLLABLE REUT +B98E;B98E;1105 1173 11C1;B98E;1105 1173 11C1; # (릎; 릎; 릎; 릎; 릎; ) HANGUL SYLLABLE REUP +B98F;B98F;1105 1173 11C2;B98F;1105 1173 11C2; # (릏; 릏; 릏; 릏; 릏; ) HANGUL SYLLABLE REUH +B990;B990;1105 1174;B990;1105 1174; # (릐; 릐; 릐; 릐; 릐; ) HANGUL SYLLABLE RYI +B991;B991;1105 1174 11A8;B991;1105 1174 11A8; # (릑; 릑; 릑; 릑; 릑; ) HANGUL SYLLABLE RYIG +B992;B992;1105 1174 11A9;B992;1105 1174 11A9; # (릒; 릒; 릒; 릒; 릒; ) HANGUL SYLLABLE RYIGG +B993;B993;1105 1174 11AA;B993;1105 1174 11AA; # (릓; 릓; 릓; 릓; 릓; ) HANGUL SYLLABLE RYIGS +B994;B994;1105 1174 11AB;B994;1105 1174 11AB; # (릔; 릔; 릔; 릔; 릔; ) HANGUL SYLLABLE RYIN +B995;B995;1105 1174 11AC;B995;1105 1174 11AC; # (릕; 릕; 릕; 릕; 릕; ) HANGUL SYLLABLE RYINJ +B996;B996;1105 1174 11AD;B996;1105 1174 11AD; # (릖; 릖; 릖; 릖; 릖; ) HANGUL SYLLABLE RYINH +B997;B997;1105 1174 11AE;B997;1105 1174 11AE; # (릗; 릗; 릗; 릗; 릗; ) HANGUL SYLLABLE RYID +B998;B998;1105 1174 11AF;B998;1105 1174 11AF; # (릘; 릘; 릘; 릘; 릘; ) HANGUL SYLLABLE RYIL +B999;B999;1105 1174 11B0;B999;1105 1174 11B0; # (릙; 릙; 릙; 릙; 릙; ) HANGUL SYLLABLE RYILG +B99A;B99A;1105 1174 11B1;B99A;1105 1174 11B1; # (릚; 릚; 릚; 릚; 릚; ) HANGUL SYLLABLE RYILM +B99B;B99B;1105 1174 11B2;B99B;1105 1174 11B2; # (릛; 릛; 릛; 릛; 릛; ) HANGUL SYLLABLE RYILB +B99C;B99C;1105 1174 11B3;B99C;1105 1174 11B3; # (릜; 릜; 릜; 릜; 릜; ) HANGUL SYLLABLE RYILS +B99D;B99D;1105 1174 11B4;B99D;1105 1174 11B4; # (릝; 릝; 릝; 릝; 릝; ) HANGUL SYLLABLE RYILT +B99E;B99E;1105 1174 11B5;B99E;1105 1174 11B5; # (릞; 릞; 릞; 릞; 릞; ) HANGUL SYLLABLE RYILP +B99F;B99F;1105 1174 11B6;B99F;1105 1174 11B6; # (릟; 릟; 릟; 릟; 릟; ) HANGUL SYLLABLE RYILH +B9A0;B9A0;1105 1174 11B7;B9A0;1105 1174 11B7; # (릠; 릠; 릠; 릠; 릠; ) HANGUL SYLLABLE RYIM +B9A1;B9A1;1105 1174 11B8;B9A1;1105 1174 11B8; # (릡; 릡; 릡; 릡; 릡; ) HANGUL SYLLABLE RYIB +B9A2;B9A2;1105 1174 11B9;B9A2;1105 1174 11B9; # (릢; 릢; 릢; 릢; 릢; ) HANGUL SYLLABLE RYIBS +B9A3;B9A3;1105 1174 11BA;B9A3;1105 1174 11BA; # (릣; 릣; 릣; 릣; 릣; ) HANGUL SYLLABLE RYIS +B9A4;B9A4;1105 1174 11BB;B9A4;1105 1174 11BB; # (릤; 릤; 릤; 릤; 릤; ) HANGUL SYLLABLE RYISS +B9A5;B9A5;1105 1174 11BC;B9A5;1105 1174 11BC; # (릥; 릥; 릥; 릥; 릥; ) HANGUL SYLLABLE RYING +B9A6;B9A6;1105 1174 11BD;B9A6;1105 1174 11BD; # (릦; 릦; 릦; 릦; 릦; ) HANGUL SYLLABLE RYIJ +B9A7;B9A7;1105 1174 11BE;B9A7;1105 1174 11BE; # (릧; 릧; 릧; 릧; 릧; ) HANGUL SYLLABLE RYIC +B9A8;B9A8;1105 1174 11BF;B9A8;1105 1174 11BF; # (릨; 릨; 릨; 릨; 릨; ) HANGUL SYLLABLE RYIK +B9A9;B9A9;1105 1174 11C0;B9A9;1105 1174 11C0; # (릩; 릩; 릩; 릩; 릩; ) HANGUL SYLLABLE RYIT +B9AA;B9AA;1105 1174 11C1;B9AA;1105 1174 11C1; # (릪; 릪; 릪; 릪; 릪; ) HANGUL SYLLABLE RYIP +B9AB;B9AB;1105 1174 11C2;B9AB;1105 1174 11C2; # (릫; 릫; 릫; 릫; 릫; ) HANGUL SYLLABLE RYIH +B9AC;B9AC;1105 1175;B9AC;1105 1175; # (리; 리; 리; 리; 리; ) HANGUL SYLLABLE RI +B9AD;B9AD;1105 1175 11A8;B9AD;1105 1175 11A8; # (릭; 릭; 릭; 릭; 릭; ) HANGUL SYLLABLE RIG +B9AE;B9AE;1105 1175 11A9;B9AE;1105 1175 11A9; # (릮; 릮; 릮; 릮; 릮; ) HANGUL SYLLABLE RIGG +B9AF;B9AF;1105 1175 11AA;B9AF;1105 1175 11AA; # (릯; 릯; 릯; 릯; 릯; ) HANGUL SYLLABLE RIGS +B9B0;B9B0;1105 1175 11AB;B9B0;1105 1175 11AB; # (린; 린; 린; 린; 린; ) HANGUL SYLLABLE RIN +B9B1;B9B1;1105 1175 11AC;B9B1;1105 1175 11AC; # (릱; 릱; 릱; 릱; 릱; ) HANGUL SYLLABLE RINJ +B9B2;B9B2;1105 1175 11AD;B9B2;1105 1175 11AD; # (릲; 릲; 릲; 릲; 릲; ) HANGUL SYLLABLE RINH +B9B3;B9B3;1105 1175 11AE;B9B3;1105 1175 11AE; # (릳; 릳; 릳; 릳; 릳; ) HANGUL SYLLABLE RID +B9B4;B9B4;1105 1175 11AF;B9B4;1105 1175 11AF; # (릴; 릴; 릴; 릴; 릴; ) HANGUL SYLLABLE RIL +B9B5;B9B5;1105 1175 11B0;B9B5;1105 1175 11B0; # (릵; 릵; 릵; 릵; 릵; ) HANGUL SYLLABLE RILG +B9B6;B9B6;1105 1175 11B1;B9B6;1105 1175 11B1; # (릶; 릶; 릶; 릶; 릶; ) HANGUL SYLLABLE RILM +B9B7;B9B7;1105 1175 11B2;B9B7;1105 1175 11B2; # (릷; 릷; 릷; 릷; 릷; ) HANGUL SYLLABLE RILB +B9B8;B9B8;1105 1175 11B3;B9B8;1105 1175 11B3; # (릸; 릸; 릸; 릸; 릸; ) HANGUL SYLLABLE RILS +B9B9;B9B9;1105 1175 11B4;B9B9;1105 1175 11B4; # (릹; 릹; 릹; 릹; 릹; ) HANGUL SYLLABLE RILT +B9BA;B9BA;1105 1175 11B5;B9BA;1105 1175 11B5; # (릺; 릺; 릺; 릺; 릺; ) HANGUL SYLLABLE RILP +B9BB;B9BB;1105 1175 11B6;B9BB;1105 1175 11B6; # (릻; 릻; 릻; 릻; 릻; ) HANGUL SYLLABLE RILH +B9BC;B9BC;1105 1175 11B7;B9BC;1105 1175 11B7; # (림; 림; 림; 림; 림; ) HANGUL SYLLABLE RIM +B9BD;B9BD;1105 1175 11B8;B9BD;1105 1175 11B8; # (립; 립; 립; 립; 립; ) HANGUL SYLLABLE RIB +B9BE;B9BE;1105 1175 11B9;B9BE;1105 1175 11B9; # (릾; 릾; 릾; 릾; 릾; ) HANGUL SYLLABLE RIBS +B9BF;B9BF;1105 1175 11BA;B9BF;1105 1175 11BA; # (릿; 릿; 릿; 릿; 릿; ) HANGUL SYLLABLE RIS +B9C0;B9C0;1105 1175 11BB;B9C0;1105 1175 11BB; # (맀; 맀; 맀; 맀; 맀; ) HANGUL SYLLABLE RISS +B9C1;B9C1;1105 1175 11BC;B9C1;1105 1175 11BC; # (링; 링; 링; 링; 링; ) HANGUL SYLLABLE RING +B9C2;B9C2;1105 1175 11BD;B9C2;1105 1175 11BD; # (맂; 맂; 맂; 맂; 맂; ) HANGUL SYLLABLE RIJ +B9C3;B9C3;1105 1175 11BE;B9C3;1105 1175 11BE; # (맃; 맃; 맃; 맃; 맃; ) HANGUL SYLLABLE RIC +B9C4;B9C4;1105 1175 11BF;B9C4;1105 1175 11BF; # (맄; 맄; 맄; 맄; 맄; ) HANGUL SYLLABLE RIK +B9C5;B9C5;1105 1175 11C0;B9C5;1105 1175 11C0; # (맅; 맅; 맅; 맅; 맅; ) HANGUL SYLLABLE RIT +B9C6;B9C6;1105 1175 11C1;B9C6;1105 1175 11C1; # (맆; 맆; 맆; 맆; 맆; ) HANGUL SYLLABLE RIP +B9C7;B9C7;1105 1175 11C2;B9C7;1105 1175 11C2; # (맇; 맇; 맇; 맇; 맇; ) HANGUL SYLLABLE RIH +B9C8;B9C8;1106 1161;B9C8;1106 1161; # (마; 마; 마; 마; 마; ) HANGUL SYLLABLE MA +B9C9;B9C9;1106 1161 11A8;B9C9;1106 1161 11A8; # (막; 막; 막; 막; 막; ) HANGUL SYLLABLE MAG +B9CA;B9CA;1106 1161 11A9;B9CA;1106 1161 11A9; # (맊; 맊; 맊; 맊; 맊; ) HANGUL SYLLABLE MAGG +B9CB;B9CB;1106 1161 11AA;B9CB;1106 1161 11AA; # (맋; 맋; 맋; 맋; 맋; ) HANGUL SYLLABLE MAGS +B9CC;B9CC;1106 1161 11AB;B9CC;1106 1161 11AB; # (만; 만; 만; 만; 만; ) HANGUL SYLLABLE MAN +B9CD;B9CD;1106 1161 11AC;B9CD;1106 1161 11AC; # (맍; 맍; 맍; 맍; 맍; ) HANGUL SYLLABLE MANJ +B9CE;B9CE;1106 1161 11AD;B9CE;1106 1161 11AD; # (많; 많; 많; 많; 많; ) HANGUL SYLLABLE MANH +B9CF;B9CF;1106 1161 11AE;B9CF;1106 1161 11AE; # (맏; 맏; 맏; 맏; 맏; ) HANGUL SYLLABLE MAD +B9D0;B9D0;1106 1161 11AF;B9D0;1106 1161 11AF; # (말; 말; 말; 말; 말; ) HANGUL SYLLABLE MAL +B9D1;B9D1;1106 1161 11B0;B9D1;1106 1161 11B0; # (맑; 맑; 맑; 맑; 맑; ) HANGUL SYLLABLE MALG +B9D2;B9D2;1106 1161 11B1;B9D2;1106 1161 11B1; # (맒; 맒; 맒; 맒; 맒; ) HANGUL SYLLABLE MALM +B9D3;B9D3;1106 1161 11B2;B9D3;1106 1161 11B2; # (맓; 맓; 맓; 맓; 맓; ) HANGUL SYLLABLE MALB +B9D4;B9D4;1106 1161 11B3;B9D4;1106 1161 11B3; # (맔; 맔; 맔; 맔; 맔; ) HANGUL SYLLABLE MALS +B9D5;B9D5;1106 1161 11B4;B9D5;1106 1161 11B4; # (맕; 맕; 맕; 맕; 맕; ) HANGUL SYLLABLE MALT +B9D6;B9D6;1106 1161 11B5;B9D6;1106 1161 11B5; # (맖; 맖; 맖; 맖; 맖; ) HANGUL SYLLABLE MALP +B9D7;B9D7;1106 1161 11B6;B9D7;1106 1161 11B6; # (맗; 맗; 맗; 맗; 맗; ) HANGUL SYLLABLE MALH +B9D8;B9D8;1106 1161 11B7;B9D8;1106 1161 11B7; # (맘; 맘; 맘; 맘; 맘; ) HANGUL SYLLABLE MAM +B9D9;B9D9;1106 1161 11B8;B9D9;1106 1161 11B8; # (맙; 맙; 맙; 맙; 맙; ) HANGUL SYLLABLE MAB +B9DA;B9DA;1106 1161 11B9;B9DA;1106 1161 11B9; # (맚; 맚; 맚; 맚; 맚; ) HANGUL SYLLABLE MABS +B9DB;B9DB;1106 1161 11BA;B9DB;1106 1161 11BA; # (맛; 맛; 맛; 맛; 맛; ) HANGUL SYLLABLE MAS +B9DC;B9DC;1106 1161 11BB;B9DC;1106 1161 11BB; # (맜; 맜; 맜; 맜; 맜; ) HANGUL SYLLABLE MASS +B9DD;B9DD;1106 1161 11BC;B9DD;1106 1161 11BC; # (망; 망; 망; 망; 망; ) HANGUL SYLLABLE MANG +B9DE;B9DE;1106 1161 11BD;B9DE;1106 1161 11BD; # (맞; 맞; 맞; 맞; 맞; ) HANGUL SYLLABLE MAJ +B9DF;B9DF;1106 1161 11BE;B9DF;1106 1161 11BE; # (맟; 맟; 맟; 맟; 맟; ) HANGUL SYLLABLE MAC +B9E0;B9E0;1106 1161 11BF;B9E0;1106 1161 11BF; # (맠; 맠; 맠; 맠; 맠; ) HANGUL SYLLABLE MAK +B9E1;B9E1;1106 1161 11C0;B9E1;1106 1161 11C0; # (맡; 맡; 맡; 맡; 맡; ) HANGUL SYLLABLE MAT +B9E2;B9E2;1106 1161 11C1;B9E2;1106 1161 11C1; # (맢; 맢; 맢; 맢; 맢; ) HANGUL SYLLABLE MAP +B9E3;B9E3;1106 1161 11C2;B9E3;1106 1161 11C2; # (맣; 맣; 맣; 맣; 맣; ) HANGUL SYLLABLE MAH +B9E4;B9E4;1106 1162;B9E4;1106 1162; # (매; 매; 매; 매; 매; ) HANGUL SYLLABLE MAE +B9E5;B9E5;1106 1162 11A8;B9E5;1106 1162 11A8; # (맥; 맥; 맥; 맥; 맥; ) HANGUL SYLLABLE MAEG +B9E6;B9E6;1106 1162 11A9;B9E6;1106 1162 11A9; # (맦; 맦; 맦; 맦; 맦; ) HANGUL SYLLABLE MAEGG +B9E7;B9E7;1106 1162 11AA;B9E7;1106 1162 11AA; # (맧; 맧; 맧; 맧; 맧; ) HANGUL SYLLABLE MAEGS +B9E8;B9E8;1106 1162 11AB;B9E8;1106 1162 11AB; # (맨; 맨; 맨; 맨; 맨; ) HANGUL SYLLABLE MAEN +B9E9;B9E9;1106 1162 11AC;B9E9;1106 1162 11AC; # (맩; 맩; 맩; 맩; 맩; ) HANGUL SYLLABLE MAENJ +B9EA;B9EA;1106 1162 11AD;B9EA;1106 1162 11AD; # (맪; 맪; 맪; 맪; 맪; ) HANGUL SYLLABLE MAENH +B9EB;B9EB;1106 1162 11AE;B9EB;1106 1162 11AE; # (맫; 맫; 맫; 맫; 맫; ) HANGUL SYLLABLE MAED +B9EC;B9EC;1106 1162 11AF;B9EC;1106 1162 11AF; # (맬; 맬; 맬; 맬; 맬; ) HANGUL SYLLABLE MAEL +B9ED;B9ED;1106 1162 11B0;B9ED;1106 1162 11B0; # (맭; 맭; 맭; 맭; 맭; ) HANGUL SYLLABLE MAELG +B9EE;B9EE;1106 1162 11B1;B9EE;1106 1162 11B1; # (맮; 맮; 맮; 맮; 맮; ) HANGUL SYLLABLE MAELM +B9EF;B9EF;1106 1162 11B2;B9EF;1106 1162 11B2; # (맯; 맯; 맯; 맯; 맯; ) HANGUL SYLLABLE MAELB +B9F0;B9F0;1106 1162 11B3;B9F0;1106 1162 11B3; # (맰; 맰; 맰; 맰; 맰; ) HANGUL SYLLABLE MAELS +B9F1;B9F1;1106 1162 11B4;B9F1;1106 1162 11B4; # (맱; 맱; 맱; 맱; 맱; ) HANGUL SYLLABLE MAELT +B9F2;B9F2;1106 1162 11B5;B9F2;1106 1162 11B5; # (맲; 맲; 맲; 맲; 맲; ) HANGUL SYLLABLE MAELP +B9F3;B9F3;1106 1162 11B6;B9F3;1106 1162 11B6; # (맳; 맳; 맳; 맳; 맳; ) HANGUL SYLLABLE MAELH +B9F4;B9F4;1106 1162 11B7;B9F4;1106 1162 11B7; # (맴; 맴; 맴; 맴; 맴; ) HANGUL SYLLABLE MAEM +B9F5;B9F5;1106 1162 11B8;B9F5;1106 1162 11B8; # (맵; 맵; 맵; 맵; 맵; ) HANGUL SYLLABLE MAEB +B9F6;B9F6;1106 1162 11B9;B9F6;1106 1162 11B9; # (맶; 맶; 맶; 맶; 맶; ) HANGUL SYLLABLE MAEBS +B9F7;B9F7;1106 1162 11BA;B9F7;1106 1162 11BA; # (맷; 맷; 맷; 맷; 맷; ) HANGUL SYLLABLE MAES +B9F8;B9F8;1106 1162 11BB;B9F8;1106 1162 11BB; # (맸; 맸; 맸; 맸; 맸; ) HANGUL SYLLABLE MAESS +B9F9;B9F9;1106 1162 11BC;B9F9;1106 1162 11BC; # (맹; 맹; 맹; 맹; 맹; ) HANGUL SYLLABLE MAENG +B9FA;B9FA;1106 1162 11BD;B9FA;1106 1162 11BD; # (맺; 맺; 맺; 맺; 맺; ) HANGUL SYLLABLE MAEJ +B9FB;B9FB;1106 1162 11BE;B9FB;1106 1162 11BE; # (맻; 맻; 맻; 맻; 맻; ) HANGUL SYLLABLE MAEC +B9FC;B9FC;1106 1162 11BF;B9FC;1106 1162 11BF; # (맼; 맼; 맼; 맼; 맼; ) HANGUL SYLLABLE MAEK +B9FD;B9FD;1106 1162 11C0;B9FD;1106 1162 11C0; # (맽; 맽; 맽; 맽; 맽; ) HANGUL SYLLABLE MAET +B9FE;B9FE;1106 1162 11C1;B9FE;1106 1162 11C1; # (맾; 맾; 맾; 맾; 맾; ) HANGUL SYLLABLE MAEP +B9FF;B9FF;1106 1162 11C2;B9FF;1106 1162 11C2; # (맿; 맿; 맿; 맿; 맿; ) HANGUL SYLLABLE MAEH +BA00;BA00;1106 1163;BA00;1106 1163; # (먀; 먀; 먀; 먀; 먀; ) HANGUL SYLLABLE MYA +BA01;BA01;1106 1163 11A8;BA01;1106 1163 11A8; # (먁; 먁; 먁; 먁; 먁; ) HANGUL SYLLABLE MYAG +BA02;BA02;1106 1163 11A9;BA02;1106 1163 11A9; # (먂; 먂; 먂; 먂; 먂; ) HANGUL SYLLABLE MYAGG +BA03;BA03;1106 1163 11AA;BA03;1106 1163 11AA; # (먃; 먃; 먃; 먃; 먃; ) HANGUL SYLLABLE MYAGS +BA04;BA04;1106 1163 11AB;BA04;1106 1163 11AB; # (먄; 먄; 먄; 먄; 먄; ) HANGUL SYLLABLE MYAN +BA05;BA05;1106 1163 11AC;BA05;1106 1163 11AC; # (먅; 먅; 먅; 먅; 먅; ) HANGUL SYLLABLE MYANJ +BA06;BA06;1106 1163 11AD;BA06;1106 1163 11AD; # (먆; 먆; 먆; 먆; 먆; ) HANGUL SYLLABLE MYANH +BA07;BA07;1106 1163 11AE;BA07;1106 1163 11AE; # (먇; 먇; 먇; 먇; 먇; ) HANGUL SYLLABLE MYAD +BA08;BA08;1106 1163 11AF;BA08;1106 1163 11AF; # (먈; 먈; 먈; 먈; 먈; ) HANGUL SYLLABLE MYAL +BA09;BA09;1106 1163 11B0;BA09;1106 1163 11B0; # (먉; 먉; 먉; 먉; 먉; ) HANGUL SYLLABLE MYALG +BA0A;BA0A;1106 1163 11B1;BA0A;1106 1163 11B1; # (먊; 먊; 먊; 먊; 먊; ) HANGUL SYLLABLE MYALM +BA0B;BA0B;1106 1163 11B2;BA0B;1106 1163 11B2; # (먋; 먋; 먋; 먋; 먋; ) HANGUL SYLLABLE MYALB +BA0C;BA0C;1106 1163 11B3;BA0C;1106 1163 11B3; # (먌; 먌; 먌; 먌; 먌; ) HANGUL SYLLABLE MYALS +BA0D;BA0D;1106 1163 11B4;BA0D;1106 1163 11B4; # (먍; 먍; 먍; 먍; 먍; ) HANGUL SYLLABLE MYALT +BA0E;BA0E;1106 1163 11B5;BA0E;1106 1163 11B5; # (먎; 먎; 먎; 먎; 먎; ) HANGUL SYLLABLE MYALP +BA0F;BA0F;1106 1163 11B6;BA0F;1106 1163 11B6; # (먏; 먏; 먏; 먏; 먏; ) HANGUL SYLLABLE MYALH +BA10;BA10;1106 1163 11B7;BA10;1106 1163 11B7; # (먐; 먐; 먐; 먐; 먐; ) HANGUL SYLLABLE MYAM +BA11;BA11;1106 1163 11B8;BA11;1106 1163 11B8; # (먑; 먑; 먑; 먑; 먑; ) HANGUL SYLLABLE MYAB +BA12;BA12;1106 1163 11B9;BA12;1106 1163 11B9; # (먒; 먒; 먒; 먒; 먒; ) HANGUL SYLLABLE MYABS +BA13;BA13;1106 1163 11BA;BA13;1106 1163 11BA; # (먓; 먓; 먓; 먓; 먓; ) HANGUL SYLLABLE MYAS +BA14;BA14;1106 1163 11BB;BA14;1106 1163 11BB; # (먔; 먔; 먔; 먔; 먔; ) HANGUL SYLLABLE MYASS +BA15;BA15;1106 1163 11BC;BA15;1106 1163 11BC; # (먕; 먕; 먕; 먕; 먕; ) HANGUL SYLLABLE MYANG +BA16;BA16;1106 1163 11BD;BA16;1106 1163 11BD; # (먖; 먖; 먖; 먖; 먖; ) HANGUL SYLLABLE MYAJ +BA17;BA17;1106 1163 11BE;BA17;1106 1163 11BE; # (먗; 먗; 먗; 먗; 먗; ) HANGUL SYLLABLE MYAC +BA18;BA18;1106 1163 11BF;BA18;1106 1163 11BF; # (먘; 먘; 먘; 먘; 먘; ) HANGUL SYLLABLE MYAK +BA19;BA19;1106 1163 11C0;BA19;1106 1163 11C0; # (먙; 먙; 먙; 먙; 먙; ) HANGUL SYLLABLE MYAT +BA1A;BA1A;1106 1163 11C1;BA1A;1106 1163 11C1; # (먚; 먚; 먚; 먚; 먚; ) HANGUL SYLLABLE MYAP +BA1B;BA1B;1106 1163 11C2;BA1B;1106 1163 11C2; # (먛; 먛; 먛; 먛; 먛; ) HANGUL SYLLABLE MYAH +BA1C;BA1C;1106 1164;BA1C;1106 1164; # (먜; 먜; 먜; 먜; 먜; ) HANGUL SYLLABLE MYAE +BA1D;BA1D;1106 1164 11A8;BA1D;1106 1164 11A8; # (먝; 먝; 먝; 먝; 먝; ) HANGUL SYLLABLE MYAEG +BA1E;BA1E;1106 1164 11A9;BA1E;1106 1164 11A9; # (먞; 먞; 먞; 먞; 먞; ) HANGUL SYLLABLE MYAEGG +BA1F;BA1F;1106 1164 11AA;BA1F;1106 1164 11AA; # (먟; 먟; 먟; 먟; 먟; ) HANGUL SYLLABLE MYAEGS +BA20;BA20;1106 1164 11AB;BA20;1106 1164 11AB; # (먠; 먠; 먠; 먠; 먠; ) HANGUL SYLLABLE MYAEN +BA21;BA21;1106 1164 11AC;BA21;1106 1164 11AC; # (먡; 먡; 먡; 먡; 먡; ) HANGUL SYLLABLE MYAENJ +BA22;BA22;1106 1164 11AD;BA22;1106 1164 11AD; # (먢; 먢; 먢; 먢; 먢; ) HANGUL SYLLABLE MYAENH +BA23;BA23;1106 1164 11AE;BA23;1106 1164 11AE; # (먣; 먣; 먣; 먣; 먣; ) HANGUL SYLLABLE MYAED +BA24;BA24;1106 1164 11AF;BA24;1106 1164 11AF; # (먤; 먤; 먤; 먤; 먤; ) HANGUL SYLLABLE MYAEL +BA25;BA25;1106 1164 11B0;BA25;1106 1164 11B0; # (먥; 먥; 먥; 먥; 먥; ) HANGUL SYLLABLE MYAELG +BA26;BA26;1106 1164 11B1;BA26;1106 1164 11B1; # (먦; 먦; 먦; 먦; 먦; ) HANGUL SYLLABLE MYAELM +BA27;BA27;1106 1164 11B2;BA27;1106 1164 11B2; # (먧; 먧; 먧; 먧; 먧; ) HANGUL SYLLABLE MYAELB +BA28;BA28;1106 1164 11B3;BA28;1106 1164 11B3; # (먨; 먨; 먨; 먨; 먨; ) HANGUL SYLLABLE MYAELS +BA29;BA29;1106 1164 11B4;BA29;1106 1164 11B4; # (먩; 먩; 먩; 먩; 먩; ) HANGUL SYLLABLE MYAELT +BA2A;BA2A;1106 1164 11B5;BA2A;1106 1164 11B5; # (먪; 먪; 먪; 먪; 먪; ) HANGUL SYLLABLE MYAELP +BA2B;BA2B;1106 1164 11B6;BA2B;1106 1164 11B6; # (먫; 먫; 먫; 먫; 먫; ) HANGUL SYLLABLE MYAELH +BA2C;BA2C;1106 1164 11B7;BA2C;1106 1164 11B7; # (먬; 먬; 먬; 먬; 먬; ) HANGUL SYLLABLE MYAEM +BA2D;BA2D;1106 1164 11B8;BA2D;1106 1164 11B8; # (먭; 먭; 먭; 먭; 먭; ) HANGUL SYLLABLE MYAEB +BA2E;BA2E;1106 1164 11B9;BA2E;1106 1164 11B9; # (먮; 먮; 먮; 먮; 먮; ) HANGUL SYLLABLE MYAEBS +BA2F;BA2F;1106 1164 11BA;BA2F;1106 1164 11BA; # (먯; 먯; 먯; 먯; 먯; ) HANGUL SYLLABLE MYAES +BA30;BA30;1106 1164 11BB;BA30;1106 1164 11BB; # (먰; 먰; 먰; 먰; 먰; ) HANGUL SYLLABLE MYAESS +BA31;BA31;1106 1164 11BC;BA31;1106 1164 11BC; # (먱; 먱; 먱; 먱; 먱; ) HANGUL SYLLABLE MYAENG +BA32;BA32;1106 1164 11BD;BA32;1106 1164 11BD; # (먲; 먲; 먲; 먲; 먲; ) HANGUL SYLLABLE MYAEJ +BA33;BA33;1106 1164 11BE;BA33;1106 1164 11BE; # (먳; 먳; 먳; 먳; 먳; ) HANGUL SYLLABLE MYAEC +BA34;BA34;1106 1164 11BF;BA34;1106 1164 11BF; # (먴; 먴; 먴; 먴; 먴; ) HANGUL SYLLABLE MYAEK +BA35;BA35;1106 1164 11C0;BA35;1106 1164 11C0; # (먵; 먵; 먵; 먵; 먵; ) HANGUL SYLLABLE MYAET +BA36;BA36;1106 1164 11C1;BA36;1106 1164 11C1; # (먶; 먶; 먶; 먶; 먶; ) HANGUL SYLLABLE MYAEP +BA37;BA37;1106 1164 11C2;BA37;1106 1164 11C2; # (먷; 먷; 먷; 먷; 먷; ) HANGUL SYLLABLE MYAEH +BA38;BA38;1106 1165;BA38;1106 1165; # (머; 머; 머; 머; 머; ) HANGUL SYLLABLE MEO +BA39;BA39;1106 1165 11A8;BA39;1106 1165 11A8; # (먹; 먹; 먹; 먹; 먹; ) HANGUL SYLLABLE MEOG +BA3A;BA3A;1106 1165 11A9;BA3A;1106 1165 11A9; # (먺; 먺; 먺; 먺; 먺; ) HANGUL SYLLABLE MEOGG +BA3B;BA3B;1106 1165 11AA;BA3B;1106 1165 11AA; # (먻; 먻; 먻; 먻; 먻; ) HANGUL SYLLABLE MEOGS +BA3C;BA3C;1106 1165 11AB;BA3C;1106 1165 11AB; # (먼; 먼; 먼; 먼; 먼; ) HANGUL SYLLABLE MEON +BA3D;BA3D;1106 1165 11AC;BA3D;1106 1165 11AC; # (먽; 먽; 먽; 먽; 먽; ) HANGUL SYLLABLE MEONJ +BA3E;BA3E;1106 1165 11AD;BA3E;1106 1165 11AD; # (먾; 먾; 먾; 먾; 먾; ) HANGUL SYLLABLE MEONH +BA3F;BA3F;1106 1165 11AE;BA3F;1106 1165 11AE; # (먿; 먿; 먿; 먿; 먿; ) HANGUL SYLLABLE MEOD +BA40;BA40;1106 1165 11AF;BA40;1106 1165 11AF; # (멀; 멀; 멀; 멀; 멀; ) HANGUL SYLLABLE MEOL +BA41;BA41;1106 1165 11B0;BA41;1106 1165 11B0; # (멁; 멁; 멁; 멁; 멁; ) HANGUL SYLLABLE MEOLG +BA42;BA42;1106 1165 11B1;BA42;1106 1165 11B1; # (멂; 멂; 멂; 멂; 멂; ) HANGUL SYLLABLE MEOLM +BA43;BA43;1106 1165 11B2;BA43;1106 1165 11B2; # (멃; 멃; 멃; 멃; 멃; ) HANGUL SYLLABLE MEOLB +BA44;BA44;1106 1165 11B3;BA44;1106 1165 11B3; # (멄; 멄; 멄; 멄; 멄; ) HANGUL SYLLABLE MEOLS +BA45;BA45;1106 1165 11B4;BA45;1106 1165 11B4; # (멅; 멅; 멅; 멅; 멅; ) HANGUL SYLLABLE MEOLT +BA46;BA46;1106 1165 11B5;BA46;1106 1165 11B5; # (멆; 멆; 멆; 멆; 멆; ) HANGUL SYLLABLE MEOLP +BA47;BA47;1106 1165 11B6;BA47;1106 1165 11B6; # (멇; 멇; 멇; 멇; 멇; ) HANGUL SYLLABLE MEOLH +BA48;BA48;1106 1165 11B7;BA48;1106 1165 11B7; # (멈; 멈; 멈; 멈; 멈; ) HANGUL SYLLABLE MEOM +BA49;BA49;1106 1165 11B8;BA49;1106 1165 11B8; # (멉; 멉; 멉; 멉; 멉; ) HANGUL SYLLABLE MEOB +BA4A;BA4A;1106 1165 11B9;BA4A;1106 1165 11B9; # (멊; 멊; 멊; 멊; 멊; ) HANGUL SYLLABLE MEOBS +BA4B;BA4B;1106 1165 11BA;BA4B;1106 1165 11BA; # (멋; 멋; 멋; 멋; 멋; ) HANGUL SYLLABLE MEOS +BA4C;BA4C;1106 1165 11BB;BA4C;1106 1165 11BB; # (멌; 멌; 멌; 멌; 멌; ) HANGUL SYLLABLE MEOSS +BA4D;BA4D;1106 1165 11BC;BA4D;1106 1165 11BC; # (멍; 멍; 멍; 멍; 멍; ) HANGUL SYLLABLE MEONG +BA4E;BA4E;1106 1165 11BD;BA4E;1106 1165 11BD; # (멎; 멎; 멎; 멎; 멎; ) HANGUL SYLLABLE MEOJ +BA4F;BA4F;1106 1165 11BE;BA4F;1106 1165 11BE; # (멏; 멏; 멏; 멏; 멏; ) HANGUL SYLLABLE MEOC +BA50;BA50;1106 1165 11BF;BA50;1106 1165 11BF; # (멐; 멐; 멐; 멐; 멐; ) HANGUL SYLLABLE MEOK +BA51;BA51;1106 1165 11C0;BA51;1106 1165 11C0; # (멑; 멑; 멑; 멑; 멑; ) HANGUL SYLLABLE MEOT +BA52;BA52;1106 1165 11C1;BA52;1106 1165 11C1; # (멒; 멒; 멒; 멒; 멒; ) HANGUL SYLLABLE MEOP +BA53;BA53;1106 1165 11C2;BA53;1106 1165 11C2; # (멓; 멓; 멓; 멓; 멓; ) HANGUL SYLLABLE MEOH +BA54;BA54;1106 1166;BA54;1106 1166; # (메; 메; 메; 메; 메; ) HANGUL SYLLABLE ME +BA55;BA55;1106 1166 11A8;BA55;1106 1166 11A8; # (멕; 멕; 멕; 멕; 멕; ) HANGUL SYLLABLE MEG +BA56;BA56;1106 1166 11A9;BA56;1106 1166 11A9; # (멖; 멖; 멖; 멖; 멖; ) HANGUL SYLLABLE MEGG +BA57;BA57;1106 1166 11AA;BA57;1106 1166 11AA; # (멗; 멗; 멗; 멗; 멗; ) HANGUL SYLLABLE MEGS +BA58;BA58;1106 1166 11AB;BA58;1106 1166 11AB; # (멘; 멘; 멘; 멘; 멘; ) HANGUL SYLLABLE MEN +BA59;BA59;1106 1166 11AC;BA59;1106 1166 11AC; # (멙; 멙; 멙; 멙; 멙; ) HANGUL SYLLABLE MENJ +BA5A;BA5A;1106 1166 11AD;BA5A;1106 1166 11AD; # (멚; 멚; 멚; 멚; 멚; ) HANGUL SYLLABLE MENH +BA5B;BA5B;1106 1166 11AE;BA5B;1106 1166 11AE; # (멛; 멛; 멛; 멛; 멛; ) HANGUL SYLLABLE MED +BA5C;BA5C;1106 1166 11AF;BA5C;1106 1166 11AF; # (멜; 멜; 멜; 멜; 멜; ) HANGUL SYLLABLE MEL +BA5D;BA5D;1106 1166 11B0;BA5D;1106 1166 11B0; # (멝; 멝; 멝; 멝; 멝; ) HANGUL SYLLABLE MELG +BA5E;BA5E;1106 1166 11B1;BA5E;1106 1166 11B1; # (멞; 멞; 멞; 멞; 멞; ) HANGUL SYLLABLE MELM +BA5F;BA5F;1106 1166 11B2;BA5F;1106 1166 11B2; # (멟; 멟; 멟; 멟; 멟; ) HANGUL SYLLABLE MELB +BA60;BA60;1106 1166 11B3;BA60;1106 1166 11B3; # (멠; 멠; 멠; 멠; 멠; ) HANGUL SYLLABLE MELS +BA61;BA61;1106 1166 11B4;BA61;1106 1166 11B4; # (멡; 멡; 멡; 멡; 멡; ) HANGUL SYLLABLE MELT +BA62;BA62;1106 1166 11B5;BA62;1106 1166 11B5; # (멢; 멢; 멢; 멢; 멢; ) HANGUL SYLLABLE MELP +BA63;BA63;1106 1166 11B6;BA63;1106 1166 11B6; # (멣; 멣; 멣; 멣; 멣; ) HANGUL SYLLABLE MELH +BA64;BA64;1106 1166 11B7;BA64;1106 1166 11B7; # (멤; 멤; 멤; 멤; 멤; ) HANGUL SYLLABLE MEM +BA65;BA65;1106 1166 11B8;BA65;1106 1166 11B8; # (멥; 멥; 멥; 멥; 멥; ) HANGUL SYLLABLE MEB +BA66;BA66;1106 1166 11B9;BA66;1106 1166 11B9; # (멦; 멦; 멦; 멦; 멦; ) HANGUL SYLLABLE MEBS +BA67;BA67;1106 1166 11BA;BA67;1106 1166 11BA; # (멧; 멧; 멧; 멧; 멧; ) HANGUL SYLLABLE MES +BA68;BA68;1106 1166 11BB;BA68;1106 1166 11BB; # (멨; 멨; 멨; 멨; 멨; ) HANGUL SYLLABLE MESS +BA69;BA69;1106 1166 11BC;BA69;1106 1166 11BC; # (멩; 멩; 멩; 멩; 멩; ) HANGUL SYLLABLE MENG +BA6A;BA6A;1106 1166 11BD;BA6A;1106 1166 11BD; # (멪; 멪; 멪; 멪; 멪; ) HANGUL SYLLABLE MEJ +BA6B;BA6B;1106 1166 11BE;BA6B;1106 1166 11BE; # (멫; 멫; 멫; 멫; 멫; ) HANGUL SYLLABLE MEC +BA6C;BA6C;1106 1166 11BF;BA6C;1106 1166 11BF; # (멬; 멬; 멬; 멬; 멬; ) HANGUL SYLLABLE MEK +BA6D;BA6D;1106 1166 11C0;BA6D;1106 1166 11C0; # (멭; 멭; 멭; 멭; 멭; ) HANGUL SYLLABLE MET +BA6E;BA6E;1106 1166 11C1;BA6E;1106 1166 11C1; # (멮; 멮; 멮; 멮; 멮; ) HANGUL SYLLABLE MEP +BA6F;BA6F;1106 1166 11C2;BA6F;1106 1166 11C2; # (멯; 멯; 멯; 멯; 멯; ) HANGUL SYLLABLE MEH +BA70;BA70;1106 1167;BA70;1106 1167; # (며; 며; 며; 며; 며; ) HANGUL SYLLABLE MYEO +BA71;BA71;1106 1167 11A8;BA71;1106 1167 11A8; # (멱; 멱; 멱; 멱; 멱; ) HANGUL SYLLABLE MYEOG +BA72;BA72;1106 1167 11A9;BA72;1106 1167 11A9; # (멲; 멲; 멲; 멲; 멲; ) HANGUL SYLLABLE MYEOGG +BA73;BA73;1106 1167 11AA;BA73;1106 1167 11AA; # (멳; 멳; 멳; 멳; 멳; ) HANGUL SYLLABLE MYEOGS +BA74;BA74;1106 1167 11AB;BA74;1106 1167 11AB; # (면; 면; 면; 면; 면; ) HANGUL SYLLABLE MYEON +BA75;BA75;1106 1167 11AC;BA75;1106 1167 11AC; # (멵; 멵; 멵; 멵; 멵; ) HANGUL SYLLABLE MYEONJ +BA76;BA76;1106 1167 11AD;BA76;1106 1167 11AD; # (멶; 멶; 멶; 멶; 멶; ) HANGUL SYLLABLE MYEONH +BA77;BA77;1106 1167 11AE;BA77;1106 1167 11AE; # (멷; 멷; 멷; 멷; 멷; ) HANGUL SYLLABLE MYEOD +BA78;BA78;1106 1167 11AF;BA78;1106 1167 11AF; # (멸; 멸; 멸; 멸; 멸; ) HANGUL SYLLABLE MYEOL +BA79;BA79;1106 1167 11B0;BA79;1106 1167 11B0; # (멹; 멹; 멹; 멹; 멹; ) HANGUL SYLLABLE MYEOLG +BA7A;BA7A;1106 1167 11B1;BA7A;1106 1167 11B1; # (멺; 멺; 멺; 멺; 멺; ) HANGUL SYLLABLE MYEOLM +BA7B;BA7B;1106 1167 11B2;BA7B;1106 1167 11B2; # (멻; 멻; 멻; 멻; 멻; ) HANGUL SYLLABLE MYEOLB +BA7C;BA7C;1106 1167 11B3;BA7C;1106 1167 11B3; # (멼; 멼; 멼; 멼; 멼; ) HANGUL SYLLABLE MYEOLS +BA7D;BA7D;1106 1167 11B4;BA7D;1106 1167 11B4; # (멽; 멽; 멽; 멽; 멽; ) HANGUL SYLLABLE MYEOLT +BA7E;BA7E;1106 1167 11B5;BA7E;1106 1167 11B5; # (멾; 멾; 멾; 멾; 멾; ) HANGUL SYLLABLE MYEOLP +BA7F;BA7F;1106 1167 11B6;BA7F;1106 1167 11B6; # (멿; 멿; 멿; 멿; 멿; ) HANGUL SYLLABLE MYEOLH +BA80;BA80;1106 1167 11B7;BA80;1106 1167 11B7; # (몀; 몀; 몀; 몀; 몀; ) HANGUL SYLLABLE MYEOM +BA81;BA81;1106 1167 11B8;BA81;1106 1167 11B8; # (몁; 몁; 몁; 몁; 몁; ) HANGUL SYLLABLE MYEOB +BA82;BA82;1106 1167 11B9;BA82;1106 1167 11B9; # (몂; 몂; 몂; 몂; 몂; ) HANGUL SYLLABLE MYEOBS +BA83;BA83;1106 1167 11BA;BA83;1106 1167 11BA; # (몃; 몃; 몃; 몃; 몃; ) HANGUL SYLLABLE MYEOS +BA84;BA84;1106 1167 11BB;BA84;1106 1167 11BB; # (몄; 몄; 몄; 몄; 몄; ) HANGUL SYLLABLE MYEOSS +BA85;BA85;1106 1167 11BC;BA85;1106 1167 11BC; # (명; 명; 명; 명; 명; ) HANGUL SYLLABLE MYEONG +BA86;BA86;1106 1167 11BD;BA86;1106 1167 11BD; # (몆; 몆; 몆; 몆; 몆; ) HANGUL SYLLABLE MYEOJ +BA87;BA87;1106 1167 11BE;BA87;1106 1167 11BE; # (몇; 몇; 몇; 몇; 몇; ) HANGUL SYLLABLE MYEOC +BA88;BA88;1106 1167 11BF;BA88;1106 1167 11BF; # (몈; 몈; 몈; 몈; 몈; ) HANGUL SYLLABLE MYEOK +BA89;BA89;1106 1167 11C0;BA89;1106 1167 11C0; # (몉; 몉; 몉; 몉; 몉; ) HANGUL SYLLABLE MYEOT +BA8A;BA8A;1106 1167 11C1;BA8A;1106 1167 11C1; # (몊; 몊; 몊; 몊; 몊; ) HANGUL SYLLABLE MYEOP +BA8B;BA8B;1106 1167 11C2;BA8B;1106 1167 11C2; # (몋; 몋; 몋; 몋; 몋; ) HANGUL SYLLABLE MYEOH +BA8C;BA8C;1106 1168;BA8C;1106 1168; # (몌; 몌; 몌; 몌; 몌; ) HANGUL SYLLABLE MYE +BA8D;BA8D;1106 1168 11A8;BA8D;1106 1168 11A8; # (몍; 몍; 몍; 몍; 몍; ) HANGUL SYLLABLE MYEG +BA8E;BA8E;1106 1168 11A9;BA8E;1106 1168 11A9; # (몎; 몎; 몎; 몎; 몎; ) HANGUL SYLLABLE MYEGG +BA8F;BA8F;1106 1168 11AA;BA8F;1106 1168 11AA; # (몏; 몏; 몏; 몏; 몏; ) HANGUL SYLLABLE MYEGS +BA90;BA90;1106 1168 11AB;BA90;1106 1168 11AB; # (몐; 몐; 몐; 몐; 몐; ) HANGUL SYLLABLE MYEN +BA91;BA91;1106 1168 11AC;BA91;1106 1168 11AC; # (몑; 몑; 몑; 몑; 몑; ) HANGUL SYLLABLE MYENJ +BA92;BA92;1106 1168 11AD;BA92;1106 1168 11AD; # (몒; 몒; 몒; 몒; 몒; ) HANGUL SYLLABLE MYENH +BA93;BA93;1106 1168 11AE;BA93;1106 1168 11AE; # (몓; 몓; 몓; 몓; 몓; ) HANGUL SYLLABLE MYED +BA94;BA94;1106 1168 11AF;BA94;1106 1168 11AF; # (몔; 몔; 몔; 몔; 몔; ) HANGUL SYLLABLE MYEL +BA95;BA95;1106 1168 11B0;BA95;1106 1168 11B0; # (몕; 몕; 몕; 몕; 몕; ) HANGUL SYLLABLE MYELG +BA96;BA96;1106 1168 11B1;BA96;1106 1168 11B1; # (몖; 몖; 몖; 몖; 몖; ) HANGUL SYLLABLE MYELM +BA97;BA97;1106 1168 11B2;BA97;1106 1168 11B2; # (몗; 몗; 몗; 몗; 몗; ) HANGUL SYLLABLE MYELB +BA98;BA98;1106 1168 11B3;BA98;1106 1168 11B3; # (몘; 몘; 몘; 몘; 몘; ) HANGUL SYLLABLE MYELS +BA99;BA99;1106 1168 11B4;BA99;1106 1168 11B4; # (몙; 몙; 몙; 몙; 몙; ) HANGUL SYLLABLE MYELT +BA9A;BA9A;1106 1168 11B5;BA9A;1106 1168 11B5; # (몚; 몚; 몚; 몚; 몚; ) HANGUL SYLLABLE MYELP +BA9B;BA9B;1106 1168 11B6;BA9B;1106 1168 11B6; # (몛; 몛; 몛; 몛; 몛; ) HANGUL SYLLABLE MYELH +BA9C;BA9C;1106 1168 11B7;BA9C;1106 1168 11B7; # (몜; 몜; 몜; 몜; 몜; ) HANGUL SYLLABLE MYEM +BA9D;BA9D;1106 1168 11B8;BA9D;1106 1168 11B8; # (몝; 몝; 몝; 몝; 몝; ) HANGUL SYLLABLE MYEB +BA9E;BA9E;1106 1168 11B9;BA9E;1106 1168 11B9; # (몞; 몞; 몞; 몞; 몞; ) HANGUL SYLLABLE MYEBS +BA9F;BA9F;1106 1168 11BA;BA9F;1106 1168 11BA; # (몟; 몟; 몟; 몟; 몟; ) HANGUL SYLLABLE MYES +BAA0;BAA0;1106 1168 11BB;BAA0;1106 1168 11BB; # (몠; 몠; 몠; 몠; 몠; ) HANGUL SYLLABLE MYESS +BAA1;BAA1;1106 1168 11BC;BAA1;1106 1168 11BC; # (몡; 몡; 몡; 몡; 몡; ) HANGUL SYLLABLE MYENG +BAA2;BAA2;1106 1168 11BD;BAA2;1106 1168 11BD; # (몢; 몢; 몢; 몢; 몢; ) HANGUL SYLLABLE MYEJ +BAA3;BAA3;1106 1168 11BE;BAA3;1106 1168 11BE; # (몣; 몣; 몣; 몣; 몣; ) HANGUL SYLLABLE MYEC +BAA4;BAA4;1106 1168 11BF;BAA4;1106 1168 11BF; # (몤; 몤; 몤; 몤; 몤; ) HANGUL SYLLABLE MYEK +BAA5;BAA5;1106 1168 11C0;BAA5;1106 1168 11C0; # (몥; 몥; 몥; 몥; 몥; ) HANGUL SYLLABLE MYET +BAA6;BAA6;1106 1168 11C1;BAA6;1106 1168 11C1; # (몦; 몦; 몦; 몦; 몦; ) HANGUL SYLLABLE MYEP +BAA7;BAA7;1106 1168 11C2;BAA7;1106 1168 11C2; # (몧; 몧; 몧; 몧; 몧; ) HANGUL SYLLABLE MYEH +BAA8;BAA8;1106 1169;BAA8;1106 1169; # (모; 모; 모; 모; 모; ) HANGUL SYLLABLE MO +BAA9;BAA9;1106 1169 11A8;BAA9;1106 1169 11A8; # (목; 목; 목; 목; 목; ) HANGUL SYLLABLE MOG +BAAA;BAAA;1106 1169 11A9;BAAA;1106 1169 11A9; # (몪; 몪; 몪; 몪; 몪; ) HANGUL SYLLABLE MOGG +BAAB;BAAB;1106 1169 11AA;BAAB;1106 1169 11AA; # (몫; 몫; 몫; 몫; 몫; ) HANGUL SYLLABLE MOGS +BAAC;BAAC;1106 1169 11AB;BAAC;1106 1169 11AB; # (몬; 몬; 몬; 몬; 몬; ) HANGUL SYLLABLE MON +BAAD;BAAD;1106 1169 11AC;BAAD;1106 1169 11AC; # (몭; 몭; 몭; 몭; 몭; ) HANGUL SYLLABLE MONJ +BAAE;BAAE;1106 1169 11AD;BAAE;1106 1169 11AD; # (몮; 몮; 몮; 몮; 몮; ) HANGUL SYLLABLE MONH +BAAF;BAAF;1106 1169 11AE;BAAF;1106 1169 11AE; # (몯; 몯; 몯; 몯; 몯; ) HANGUL SYLLABLE MOD +BAB0;BAB0;1106 1169 11AF;BAB0;1106 1169 11AF; # (몰; 몰; 몰; 몰; 몰; ) HANGUL SYLLABLE MOL +BAB1;BAB1;1106 1169 11B0;BAB1;1106 1169 11B0; # (몱; 몱; 몱; 몱; 몱; ) HANGUL SYLLABLE MOLG +BAB2;BAB2;1106 1169 11B1;BAB2;1106 1169 11B1; # (몲; 몲; 몲; 몲; 몲; ) HANGUL SYLLABLE MOLM +BAB3;BAB3;1106 1169 11B2;BAB3;1106 1169 11B2; # (몳; 몳; 몳; 몳; 몳; ) HANGUL SYLLABLE MOLB +BAB4;BAB4;1106 1169 11B3;BAB4;1106 1169 11B3; # (몴; 몴; 몴; 몴; 몴; ) HANGUL SYLLABLE MOLS +BAB5;BAB5;1106 1169 11B4;BAB5;1106 1169 11B4; # (몵; 몵; 몵; 몵; 몵; ) HANGUL SYLLABLE MOLT +BAB6;BAB6;1106 1169 11B5;BAB6;1106 1169 11B5; # (몶; 몶; 몶; 몶; 몶; ) HANGUL SYLLABLE MOLP +BAB7;BAB7;1106 1169 11B6;BAB7;1106 1169 11B6; # (몷; 몷; 몷; 몷; 몷; ) HANGUL SYLLABLE MOLH +BAB8;BAB8;1106 1169 11B7;BAB8;1106 1169 11B7; # (몸; 몸; 몸; 몸; 몸; ) HANGUL SYLLABLE MOM +BAB9;BAB9;1106 1169 11B8;BAB9;1106 1169 11B8; # (몹; 몹; 몹; 몹; 몹; ) HANGUL SYLLABLE MOB +BABA;BABA;1106 1169 11B9;BABA;1106 1169 11B9; # (몺; 몺; 몺; 몺; 몺; ) HANGUL SYLLABLE MOBS +BABB;BABB;1106 1169 11BA;BABB;1106 1169 11BA; # (못; 못; 못; 못; 못; ) HANGUL SYLLABLE MOS +BABC;BABC;1106 1169 11BB;BABC;1106 1169 11BB; # (몼; 몼; 몼; 몼; 몼; ) HANGUL SYLLABLE MOSS +BABD;BABD;1106 1169 11BC;BABD;1106 1169 11BC; # (몽; 몽; 몽; 몽; 몽; ) HANGUL SYLLABLE MONG +BABE;BABE;1106 1169 11BD;BABE;1106 1169 11BD; # (몾; 몾; 몾; 몾; 몾; ) HANGUL SYLLABLE MOJ +BABF;BABF;1106 1169 11BE;BABF;1106 1169 11BE; # (몿; 몿; 몿; 몿; 몿; ) HANGUL SYLLABLE MOC +BAC0;BAC0;1106 1169 11BF;BAC0;1106 1169 11BF; # (뫀; 뫀; 뫀; 뫀; 뫀; ) HANGUL SYLLABLE MOK +BAC1;BAC1;1106 1169 11C0;BAC1;1106 1169 11C0; # (뫁; 뫁; 뫁; 뫁; 뫁; ) HANGUL SYLLABLE MOT +BAC2;BAC2;1106 1169 11C1;BAC2;1106 1169 11C1; # (뫂; 뫂; 뫂; 뫂; 뫂; ) HANGUL SYLLABLE MOP +BAC3;BAC3;1106 1169 11C2;BAC3;1106 1169 11C2; # (뫃; 뫃; 뫃; 뫃; 뫃; ) HANGUL SYLLABLE MOH +BAC4;BAC4;1106 116A;BAC4;1106 116A; # (뫄; 뫄; 뫄; 뫄; 뫄; ) HANGUL SYLLABLE MWA +BAC5;BAC5;1106 116A 11A8;BAC5;1106 116A 11A8; # (뫅; 뫅; 뫅; 뫅; 뫅; ) HANGUL SYLLABLE MWAG +BAC6;BAC6;1106 116A 11A9;BAC6;1106 116A 11A9; # (뫆; 뫆; 뫆; 뫆; 뫆; ) HANGUL SYLLABLE MWAGG +BAC7;BAC7;1106 116A 11AA;BAC7;1106 116A 11AA; # (뫇; 뫇; 뫇; 뫇; 뫇; ) HANGUL SYLLABLE MWAGS +BAC8;BAC8;1106 116A 11AB;BAC8;1106 116A 11AB; # (뫈; 뫈; 뫈; 뫈; 뫈; ) HANGUL SYLLABLE MWAN +BAC9;BAC9;1106 116A 11AC;BAC9;1106 116A 11AC; # (뫉; 뫉; 뫉; 뫉; 뫉; ) HANGUL SYLLABLE MWANJ +BACA;BACA;1106 116A 11AD;BACA;1106 116A 11AD; # (뫊; 뫊; 뫊; 뫊; 뫊; ) HANGUL SYLLABLE MWANH +BACB;BACB;1106 116A 11AE;BACB;1106 116A 11AE; # (뫋; 뫋; 뫋; 뫋; 뫋; ) HANGUL SYLLABLE MWAD +BACC;BACC;1106 116A 11AF;BACC;1106 116A 11AF; # (뫌; 뫌; 뫌; 뫌; 뫌; ) HANGUL SYLLABLE MWAL +BACD;BACD;1106 116A 11B0;BACD;1106 116A 11B0; # (뫍; 뫍; 뫍; 뫍; 뫍; ) HANGUL SYLLABLE MWALG +BACE;BACE;1106 116A 11B1;BACE;1106 116A 11B1; # (뫎; 뫎; 뫎; 뫎; 뫎; ) HANGUL SYLLABLE MWALM +BACF;BACF;1106 116A 11B2;BACF;1106 116A 11B2; # (뫏; 뫏; 뫏; 뫏; 뫏; ) HANGUL SYLLABLE MWALB +BAD0;BAD0;1106 116A 11B3;BAD0;1106 116A 11B3; # (뫐; 뫐; 뫐; 뫐; 뫐; ) HANGUL SYLLABLE MWALS +BAD1;BAD1;1106 116A 11B4;BAD1;1106 116A 11B4; # (뫑; 뫑; 뫑; 뫑; 뫑; ) HANGUL SYLLABLE MWALT +BAD2;BAD2;1106 116A 11B5;BAD2;1106 116A 11B5; # (뫒; 뫒; 뫒; 뫒; 뫒; ) HANGUL SYLLABLE MWALP +BAD3;BAD3;1106 116A 11B6;BAD3;1106 116A 11B6; # (뫓; 뫓; 뫓; 뫓; 뫓; ) HANGUL SYLLABLE MWALH +BAD4;BAD4;1106 116A 11B7;BAD4;1106 116A 11B7; # (뫔; 뫔; 뫔; 뫔; 뫔; ) HANGUL SYLLABLE MWAM +BAD5;BAD5;1106 116A 11B8;BAD5;1106 116A 11B8; # (뫕; 뫕; 뫕; 뫕; 뫕; ) HANGUL SYLLABLE MWAB +BAD6;BAD6;1106 116A 11B9;BAD6;1106 116A 11B9; # (뫖; 뫖; 뫖; 뫖; 뫖; ) HANGUL SYLLABLE MWABS +BAD7;BAD7;1106 116A 11BA;BAD7;1106 116A 11BA; # (뫗; 뫗; 뫗; 뫗; 뫗; ) HANGUL SYLLABLE MWAS +BAD8;BAD8;1106 116A 11BB;BAD8;1106 116A 11BB; # (뫘; 뫘; 뫘; 뫘; 뫘; ) HANGUL SYLLABLE MWASS +BAD9;BAD9;1106 116A 11BC;BAD9;1106 116A 11BC; # (뫙; 뫙; 뫙; 뫙; 뫙; ) HANGUL SYLLABLE MWANG +BADA;BADA;1106 116A 11BD;BADA;1106 116A 11BD; # (뫚; 뫚; 뫚; 뫚; 뫚; ) HANGUL SYLLABLE MWAJ +BADB;BADB;1106 116A 11BE;BADB;1106 116A 11BE; # (뫛; 뫛; 뫛; 뫛; 뫛; ) HANGUL SYLLABLE MWAC +BADC;BADC;1106 116A 11BF;BADC;1106 116A 11BF; # (뫜; 뫜; 뫜; 뫜; 뫜; ) HANGUL SYLLABLE MWAK +BADD;BADD;1106 116A 11C0;BADD;1106 116A 11C0; # (뫝; 뫝; 뫝; 뫝; 뫝; ) HANGUL SYLLABLE MWAT +BADE;BADE;1106 116A 11C1;BADE;1106 116A 11C1; # (뫞; 뫞; 뫞; 뫞; 뫞; ) HANGUL SYLLABLE MWAP +BADF;BADF;1106 116A 11C2;BADF;1106 116A 11C2; # (뫟; 뫟; 뫟; 뫟; 뫟; ) HANGUL SYLLABLE MWAH +BAE0;BAE0;1106 116B;BAE0;1106 116B; # (뫠; 뫠; 뫠; 뫠; 뫠; ) HANGUL SYLLABLE MWAE +BAE1;BAE1;1106 116B 11A8;BAE1;1106 116B 11A8; # (뫡; 뫡; 뫡; 뫡; 뫡; ) HANGUL SYLLABLE MWAEG +BAE2;BAE2;1106 116B 11A9;BAE2;1106 116B 11A9; # (뫢; 뫢; 뫢; 뫢; 뫢; ) HANGUL SYLLABLE MWAEGG +BAE3;BAE3;1106 116B 11AA;BAE3;1106 116B 11AA; # (뫣; 뫣; 뫣; 뫣; 뫣; ) HANGUL SYLLABLE MWAEGS +BAE4;BAE4;1106 116B 11AB;BAE4;1106 116B 11AB; # (뫤; 뫤; 뫤; 뫤; 뫤; ) HANGUL SYLLABLE MWAEN +BAE5;BAE5;1106 116B 11AC;BAE5;1106 116B 11AC; # (뫥; 뫥; 뫥; 뫥; 뫥; ) HANGUL SYLLABLE MWAENJ +BAE6;BAE6;1106 116B 11AD;BAE6;1106 116B 11AD; # (뫦; 뫦; 뫦; 뫦; 뫦; ) HANGUL SYLLABLE MWAENH +BAE7;BAE7;1106 116B 11AE;BAE7;1106 116B 11AE; # (뫧; 뫧; 뫧; 뫧; 뫧; ) HANGUL SYLLABLE MWAED +BAE8;BAE8;1106 116B 11AF;BAE8;1106 116B 11AF; # (뫨; 뫨; 뫨; 뫨; 뫨; ) HANGUL SYLLABLE MWAEL +BAE9;BAE9;1106 116B 11B0;BAE9;1106 116B 11B0; # (뫩; 뫩; 뫩; 뫩; 뫩; ) HANGUL SYLLABLE MWAELG +BAEA;BAEA;1106 116B 11B1;BAEA;1106 116B 11B1; # (뫪; 뫪; 뫪; 뫪; 뫪; ) HANGUL SYLLABLE MWAELM +BAEB;BAEB;1106 116B 11B2;BAEB;1106 116B 11B2; # (뫫; 뫫; 뫫; 뫫; 뫫; ) HANGUL SYLLABLE MWAELB +BAEC;BAEC;1106 116B 11B3;BAEC;1106 116B 11B3; # (뫬; 뫬; 뫬; 뫬; 뫬; ) HANGUL SYLLABLE MWAELS +BAED;BAED;1106 116B 11B4;BAED;1106 116B 11B4; # (뫭; 뫭; 뫭; 뫭; 뫭; ) HANGUL SYLLABLE MWAELT +BAEE;BAEE;1106 116B 11B5;BAEE;1106 116B 11B5; # (뫮; 뫮; 뫮; 뫮; 뫮; ) HANGUL SYLLABLE MWAELP +BAEF;BAEF;1106 116B 11B6;BAEF;1106 116B 11B6; # (뫯; 뫯; 뫯; 뫯; 뫯; ) HANGUL SYLLABLE MWAELH +BAF0;BAF0;1106 116B 11B7;BAF0;1106 116B 11B7; # (뫰; 뫰; 뫰; 뫰; 뫰; ) HANGUL SYLLABLE MWAEM +BAF1;BAF1;1106 116B 11B8;BAF1;1106 116B 11B8; # (뫱; 뫱; 뫱; 뫱; 뫱; ) HANGUL SYLLABLE MWAEB +BAF2;BAF2;1106 116B 11B9;BAF2;1106 116B 11B9; # (뫲; 뫲; 뫲; 뫲; 뫲; ) HANGUL SYLLABLE MWAEBS +BAF3;BAF3;1106 116B 11BA;BAF3;1106 116B 11BA; # (뫳; 뫳; 뫳; 뫳; 뫳; ) HANGUL SYLLABLE MWAES +BAF4;BAF4;1106 116B 11BB;BAF4;1106 116B 11BB; # (뫴; 뫴; 뫴; 뫴; 뫴; ) HANGUL SYLLABLE MWAESS +BAF5;BAF5;1106 116B 11BC;BAF5;1106 116B 11BC; # (뫵; 뫵; 뫵; 뫵; 뫵; ) HANGUL SYLLABLE MWAENG +BAF6;BAF6;1106 116B 11BD;BAF6;1106 116B 11BD; # (뫶; 뫶; 뫶; 뫶; 뫶; ) HANGUL SYLLABLE MWAEJ +BAF7;BAF7;1106 116B 11BE;BAF7;1106 116B 11BE; # (뫷; 뫷; 뫷; 뫷; 뫷; ) HANGUL SYLLABLE MWAEC +BAF8;BAF8;1106 116B 11BF;BAF8;1106 116B 11BF; # (뫸; 뫸; 뫸; 뫸; 뫸; ) HANGUL SYLLABLE MWAEK +BAF9;BAF9;1106 116B 11C0;BAF9;1106 116B 11C0; # (뫹; 뫹; 뫹; 뫹; 뫹; ) HANGUL SYLLABLE MWAET +BAFA;BAFA;1106 116B 11C1;BAFA;1106 116B 11C1; # (뫺; 뫺; 뫺; 뫺; 뫺; ) HANGUL SYLLABLE MWAEP +BAFB;BAFB;1106 116B 11C2;BAFB;1106 116B 11C2; # (뫻; 뫻; 뫻; 뫻; 뫻; ) HANGUL SYLLABLE MWAEH +BAFC;BAFC;1106 116C;BAFC;1106 116C; # (뫼; 뫼; 뫼; 뫼; 뫼; ) HANGUL SYLLABLE MOE +BAFD;BAFD;1106 116C 11A8;BAFD;1106 116C 11A8; # (뫽; 뫽; 뫽; 뫽; 뫽; ) HANGUL SYLLABLE MOEG +BAFE;BAFE;1106 116C 11A9;BAFE;1106 116C 11A9; # (뫾; 뫾; 뫾; 뫾; 뫾; ) HANGUL SYLLABLE MOEGG +BAFF;BAFF;1106 116C 11AA;BAFF;1106 116C 11AA; # (뫿; 뫿; 뫿; 뫿; 뫿; ) HANGUL SYLLABLE MOEGS +BB00;BB00;1106 116C 11AB;BB00;1106 116C 11AB; # (묀; 묀; 묀; 묀; 묀; ) HANGUL SYLLABLE MOEN +BB01;BB01;1106 116C 11AC;BB01;1106 116C 11AC; # (묁; 묁; 묁; 묁; 묁; ) HANGUL SYLLABLE MOENJ +BB02;BB02;1106 116C 11AD;BB02;1106 116C 11AD; # (묂; 묂; 묂; 묂; 묂; ) HANGUL SYLLABLE MOENH +BB03;BB03;1106 116C 11AE;BB03;1106 116C 11AE; # (묃; 묃; 묃; 묃; 묃; ) HANGUL SYLLABLE MOED +BB04;BB04;1106 116C 11AF;BB04;1106 116C 11AF; # (묄; 묄; 묄; 묄; 묄; ) HANGUL SYLLABLE MOEL +BB05;BB05;1106 116C 11B0;BB05;1106 116C 11B0; # (묅; 묅; 묅; 묅; 묅; ) HANGUL SYLLABLE MOELG +BB06;BB06;1106 116C 11B1;BB06;1106 116C 11B1; # (묆; 묆; 묆; 묆; 묆; ) HANGUL SYLLABLE MOELM +BB07;BB07;1106 116C 11B2;BB07;1106 116C 11B2; # (묇; 묇; 묇; 묇; 묇; ) HANGUL SYLLABLE MOELB +BB08;BB08;1106 116C 11B3;BB08;1106 116C 11B3; # (묈; 묈; 묈; 묈; 묈; ) HANGUL SYLLABLE MOELS +BB09;BB09;1106 116C 11B4;BB09;1106 116C 11B4; # (묉; 묉; 묉; 묉; 묉; ) HANGUL SYLLABLE MOELT +BB0A;BB0A;1106 116C 11B5;BB0A;1106 116C 11B5; # (묊; 묊; 묊; 묊; 묊; ) HANGUL SYLLABLE MOELP +BB0B;BB0B;1106 116C 11B6;BB0B;1106 116C 11B6; # (묋; 묋; 묋; 묋; 묋; ) HANGUL SYLLABLE MOELH +BB0C;BB0C;1106 116C 11B7;BB0C;1106 116C 11B7; # (묌; 묌; 묌; 묌; 묌; ) HANGUL SYLLABLE MOEM +BB0D;BB0D;1106 116C 11B8;BB0D;1106 116C 11B8; # (묍; 묍; 묍; 묍; 묍; ) HANGUL SYLLABLE MOEB +BB0E;BB0E;1106 116C 11B9;BB0E;1106 116C 11B9; # (묎; 묎; 묎; 묎; 묎; ) HANGUL SYLLABLE MOEBS +BB0F;BB0F;1106 116C 11BA;BB0F;1106 116C 11BA; # (묏; 묏; 묏; 묏; 묏; ) HANGUL SYLLABLE MOES +BB10;BB10;1106 116C 11BB;BB10;1106 116C 11BB; # (묐; 묐; 묐; 묐; 묐; ) HANGUL SYLLABLE MOESS +BB11;BB11;1106 116C 11BC;BB11;1106 116C 11BC; # (묑; 묑; 묑; 묑; 묑; ) HANGUL SYLLABLE MOENG +BB12;BB12;1106 116C 11BD;BB12;1106 116C 11BD; # (묒; 묒; 묒; 묒; 묒; ) HANGUL SYLLABLE MOEJ +BB13;BB13;1106 116C 11BE;BB13;1106 116C 11BE; # (묓; 묓; 묓; 묓; 묓; ) HANGUL SYLLABLE MOEC +BB14;BB14;1106 116C 11BF;BB14;1106 116C 11BF; # (묔; 묔; 묔; 묔; 묔; ) HANGUL SYLLABLE MOEK +BB15;BB15;1106 116C 11C0;BB15;1106 116C 11C0; # (묕; 묕; 묕; 묕; 묕; ) HANGUL SYLLABLE MOET +BB16;BB16;1106 116C 11C1;BB16;1106 116C 11C1; # (묖; 묖; 묖; 묖; 묖; ) HANGUL SYLLABLE MOEP +BB17;BB17;1106 116C 11C2;BB17;1106 116C 11C2; # (묗; 묗; 묗; 묗; 묗; ) HANGUL SYLLABLE MOEH +BB18;BB18;1106 116D;BB18;1106 116D; # (묘; 묘; 묘; 묘; 묘; ) HANGUL SYLLABLE MYO +BB19;BB19;1106 116D 11A8;BB19;1106 116D 11A8; # (묙; 묙; 묙; 묙; 묙; ) HANGUL SYLLABLE MYOG +BB1A;BB1A;1106 116D 11A9;BB1A;1106 116D 11A9; # (묚; 묚; 묚; 묚; 묚; ) HANGUL SYLLABLE MYOGG +BB1B;BB1B;1106 116D 11AA;BB1B;1106 116D 11AA; # (묛; 묛; 묛; 묛; 묛; ) HANGUL SYLLABLE MYOGS +BB1C;BB1C;1106 116D 11AB;BB1C;1106 116D 11AB; # (묜; 묜; 묜; 묜; 묜; ) HANGUL SYLLABLE MYON +BB1D;BB1D;1106 116D 11AC;BB1D;1106 116D 11AC; # (묝; 묝; 묝; 묝; 묝; ) HANGUL SYLLABLE MYONJ +BB1E;BB1E;1106 116D 11AD;BB1E;1106 116D 11AD; # (묞; 묞; 묞; 묞; 묞; ) HANGUL SYLLABLE MYONH +BB1F;BB1F;1106 116D 11AE;BB1F;1106 116D 11AE; # (묟; 묟; 묟; 묟; 묟; ) HANGUL SYLLABLE MYOD +BB20;BB20;1106 116D 11AF;BB20;1106 116D 11AF; # (묠; 묠; 묠; 묠; 묠; ) HANGUL SYLLABLE MYOL +BB21;BB21;1106 116D 11B0;BB21;1106 116D 11B0; # (묡; 묡; 묡; 묡; 묡; ) HANGUL SYLLABLE MYOLG +BB22;BB22;1106 116D 11B1;BB22;1106 116D 11B1; # (묢; 묢; 묢; 묢; 묢; ) HANGUL SYLLABLE MYOLM +BB23;BB23;1106 116D 11B2;BB23;1106 116D 11B2; # (묣; 묣; 묣; 묣; 묣; ) HANGUL SYLLABLE MYOLB +BB24;BB24;1106 116D 11B3;BB24;1106 116D 11B3; # (묤; 묤; 묤; 묤; 묤; ) HANGUL SYLLABLE MYOLS +BB25;BB25;1106 116D 11B4;BB25;1106 116D 11B4; # (묥; 묥; 묥; 묥; 묥; ) HANGUL SYLLABLE MYOLT +BB26;BB26;1106 116D 11B5;BB26;1106 116D 11B5; # (묦; 묦; 묦; 묦; 묦; ) HANGUL SYLLABLE MYOLP +BB27;BB27;1106 116D 11B6;BB27;1106 116D 11B6; # (묧; 묧; 묧; 묧; 묧; ) HANGUL SYLLABLE MYOLH +BB28;BB28;1106 116D 11B7;BB28;1106 116D 11B7; # (묨; 묨; 묨; 묨; 묨; ) HANGUL SYLLABLE MYOM +BB29;BB29;1106 116D 11B8;BB29;1106 116D 11B8; # (묩; 묩; 묩; 묩; 묩; ) HANGUL SYLLABLE MYOB +BB2A;BB2A;1106 116D 11B9;BB2A;1106 116D 11B9; # (묪; 묪; 묪; 묪; 묪; ) HANGUL SYLLABLE MYOBS +BB2B;BB2B;1106 116D 11BA;BB2B;1106 116D 11BA; # (묫; 묫; 묫; 묫; 묫; ) HANGUL SYLLABLE MYOS +BB2C;BB2C;1106 116D 11BB;BB2C;1106 116D 11BB; # (묬; 묬; 묬; 묬; 묬; ) HANGUL SYLLABLE MYOSS +BB2D;BB2D;1106 116D 11BC;BB2D;1106 116D 11BC; # (묭; 묭; 묭; 묭; 묭; ) HANGUL SYLLABLE MYONG +BB2E;BB2E;1106 116D 11BD;BB2E;1106 116D 11BD; # (묮; 묮; 묮; 묮; 묮; ) HANGUL SYLLABLE MYOJ +BB2F;BB2F;1106 116D 11BE;BB2F;1106 116D 11BE; # (묯; 묯; 묯; 묯; 묯; ) HANGUL SYLLABLE MYOC +BB30;BB30;1106 116D 11BF;BB30;1106 116D 11BF; # (묰; 묰; 묰; 묰; 묰; ) HANGUL SYLLABLE MYOK +BB31;BB31;1106 116D 11C0;BB31;1106 116D 11C0; # (묱; 묱; 묱; 묱; 묱; ) HANGUL SYLLABLE MYOT +BB32;BB32;1106 116D 11C1;BB32;1106 116D 11C1; # (묲; 묲; 묲; 묲; 묲; ) HANGUL SYLLABLE MYOP +BB33;BB33;1106 116D 11C2;BB33;1106 116D 11C2; # (묳; 묳; 묳; 묳; 묳; ) HANGUL SYLLABLE MYOH +BB34;BB34;1106 116E;BB34;1106 116E; # (무; 무; 무; 무; 무; ) HANGUL SYLLABLE MU +BB35;BB35;1106 116E 11A8;BB35;1106 116E 11A8; # (묵; 묵; 묵; 묵; 묵; ) HANGUL SYLLABLE MUG +BB36;BB36;1106 116E 11A9;BB36;1106 116E 11A9; # (묶; 묶; 묶; 묶; 묶; ) HANGUL SYLLABLE MUGG +BB37;BB37;1106 116E 11AA;BB37;1106 116E 11AA; # (묷; 묷; 묷; 묷; 묷; ) HANGUL SYLLABLE MUGS +BB38;BB38;1106 116E 11AB;BB38;1106 116E 11AB; # (문; 문; 문; 문; 문; ) HANGUL SYLLABLE MUN +BB39;BB39;1106 116E 11AC;BB39;1106 116E 11AC; # (묹; 묹; 묹; 묹; 묹; ) HANGUL SYLLABLE MUNJ +BB3A;BB3A;1106 116E 11AD;BB3A;1106 116E 11AD; # (묺; 묺; 묺; 묺; 묺; ) HANGUL SYLLABLE MUNH +BB3B;BB3B;1106 116E 11AE;BB3B;1106 116E 11AE; # (묻; 묻; 묻; 묻; 묻; ) HANGUL SYLLABLE MUD +BB3C;BB3C;1106 116E 11AF;BB3C;1106 116E 11AF; # (물; 물; 물; 물; 물; ) HANGUL SYLLABLE MUL +BB3D;BB3D;1106 116E 11B0;BB3D;1106 116E 11B0; # (묽; 묽; 묽; 묽; 묽; ) HANGUL SYLLABLE MULG +BB3E;BB3E;1106 116E 11B1;BB3E;1106 116E 11B1; # (묾; 묾; 묾; 묾; 묾; ) HANGUL SYLLABLE MULM +BB3F;BB3F;1106 116E 11B2;BB3F;1106 116E 11B2; # (묿; 묿; 묿; 묿; 묿; ) HANGUL SYLLABLE MULB +BB40;BB40;1106 116E 11B3;BB40;1106 116E 11B3; # (뭀; 뭀; 뭀; 뭀; 뭀; ) HANGUL SYLLABLE MULS +BB41;BB41;1106 116E 11B4;BB41;1106 116E 11B4; # (뭁; 뭁; 뭁; 뭁; 뭁; ) HANGUL SYLLABLE MULT +BB42;BB42;1106 116E 11B5;BB42;1106 116E 11B5; # (뭂; 뭂; 뭂; 뭂; 뭂; ) HANGUL SYLLABLE MULP +BB43;BB43;1106 116E 11B6;BB43;1106 116E 11B6; # (뭃; 뭃; 뭃; 뭃; 뭃; ) HANGUL SYLLABLE MULH +BB44;BB44;1106 116E 11B7;BB44;1106 116E 11B7; # (뭄; 뭄; 뭄; 뭄; 뭄; ) HANGUL SYLLABLE MUM +BB45;BB45;1106 116E 11B8;BB45;1106 116E 11B8; # (뭅; 뭅; 뭅; 뭅; 뭅; ) HANGUL SYLLABLE MUB +BB46;BB46;1106 116E 11B9;BB46;1106 116E 11B9; # (뭆; 뭆; 뭆; 뭆; 뭆; ) HANGUL SYLLABLE MUBS +BB47;BB47;1106 116E 11BA;BB47;1106 116E 11BA; # (뭇; 뭇; 뭇; 뭇; 뭇; ) HANGUL SYLLABLE MUS +BB48;BB48;1106 116E 11BB;BB48;1106 116E 11BB; # (뭈; 뭈; 뭈; 뭈; 뭈; ) HANGUL SYLLABLE MUSS +BB49;BB49;1106 116E 11BC;BB49;1106 116E 11BC; # (뭉; 뭉; 뭉; 뭉; 뭉; ) HANGUL SYLLABLE MUNG +BB4A;BB4A;1106 116E 11BD;BB4A;1106 116E 11BD; # (뭊; 뭊; 뭊; 뭊; 뭊; ) HANGUL SYLLABLE MUJ +BB4B;BB4B;1106 116E 11BE;BB4B;1106 116E 11BE; # (뭋; 뭋; 뭋; 뭋; 뭋; ) HANGUL SYLLABLE MUC +BB4C;BB4C;1106 116E 11BF;BB4C;1106 116E 11BF; # (뭌; 뭌; 뭌; 뭌; 뭌; ) HANGUL SYLLABLE MUK +BB4D;BB4D;1106 116E 11C0;BB4D;1106 116E 11C0; # (뭍; 뭍; 뭍; 뭍; 뭍; ) HANGUL SYLLABLE MUT +BB4E;BB4E;1106 116E 11C1;BB4E;1106 116E 11C1; # (뭎; 뭎; 뭎; 뭎; 뭎; ) HANGUL SYLLABLE MUP +BB4F;BB4F;1106 116E 11C2;BB4F;1106 116E 11C2; # (뭏; 뭏; 뭏; 뭏; 뭏; ) HANGUL SYLLABLE MUH +BB50;BB50;1106 116F;BB50;1106 116F; # (뭐; 뭐; 뭐; 뭐; 뭐; ) HANGUL SYLLABLE MWEO +BB51;BB51;1106 116F 11A8;BB51;1106 116F 11A8; # (뭑; 뭑; 뭑; 뭑; 뭑; ) HANGUL SYLLABLE MWEOG +BB52;BB52;1106 116F 11A9;BB52;1106 116F 11A9; # (뭒; 뭒; 뭒; 뭒; 뭒; ) HANGUL SYLLABLE MWEOGG +BB53;BB53;1106 116F 11AA;BB53;1106 116F 11AA; # (뭓; 뭓; 뭓; 뭓; 뭓; ) HANGUL SYLLABLE MWEOGS +BB54;BB54;1106 116F 11AB;BB54;1106 116F 11AB; # (뭔; 뭔; 뭔; 뭔; 뭔; ) HANGUL SYLLABLE MWEON +BB55;BB55;1106 116F 11AC;BB55;1106 116F 11AC; # (뭕; 뭕; 뭕; 뭕; 뭕; ) HANGUL SYLLABLE MWEONJ +BB56;BB56;1106 116F 11AD;BB56;1106 116F 11AD; # (뭖; 뭖; 뭖; 뭖; 뭖; ) HANGUL SYLLABLE MWEONH +BB57;BB57;1106 116F 11AE;BB57;1106 116F 11AE; # (뭗; 뭗; 뭗; 뭗; 뭗; ) HANGUL SYLLABLE MWEOD +BB58;BB58;1106 116F 11AF;BB58;1106 116F 11AF; # (뭘; 뭘; 뭘; 뭘; 뭘; ) HANGUL SYLLABLE MWEOL +BB59;BB59;1106 116F 11B0;BB59;1106 116F 11B0; # (뭙; 뭙; 뭙; 뭙; 뭙; ) HANGUL SYLLABLE MWEOLG +BB5A;BB5A;1106 116F 11B1;BB5A;1106 116F 11B1; # (뭚; 뭚; 뭚; 뭚; 뭚; ) HANGUL SYLLABLE MWEOLM +BB5B;BB5B;1106 116F 11B2;BB5B;1106 116F 11B2; # (뭛; 뭛; 뭛; 뭛; 뭛; ) HANGUL SYLLABLE MWEOLB +BB5C;BB5C;1106 116F 11B3;BB5C;1106 116F 11B3; # (뭜; 뭜; 뭜; 뭜; 뭜; ) HANGUL SYLLABLE MWEOLS +BB5D;BB5D;1106 116F 11B4;BB5D;1106 116F 11B4; # (뭝; 뭝; 뭝; 뭝; 뭝; ) HANGUL SYLLABLE MWEOLT +BB5E;BB5E;1106 116F 11B5;BB5E;1106 116F 11B5; # (뭞; 뭞; 뭞; 뭞; 뭞; ) HANGUL SYLLABLE MWEOLP +BB5F;BB5F;1106 116F 11B6;BB5F;1106 116F 11B6; # (뭟; 뭟; 뭟; 뭟; 뭟; ) HANGUL SYLLABLE MWEOLH +BB60;BB60;1106 116F 11B7;BB60;1106 116F 11B7; # (뭠; 뭠; 뭠; 뭠; 뭠; ) HANGUL SYLLABLE MWEOM +BB61;BB61;1106 116F 11B8;BB61;1106 116F 11B8; # (뭡; 뭡; 뭡; 뭡; 뭡; ) HANGUL SYLLABLE MWEOB +BB62;BB62;1106 116F 11B9;BB62;1106 116F 11B9; # (뭢; 뭢; 뭢; 뭢; 뭢; ) HANGUL SYLLABLE MWEOBS +BB63;BB63;1106 116F 11BA;BB63;1106 116F 11BA; # (뭣; 뭣; 뭣; 뭣; 뭣; ) HANGUL SYLLABLE MWEOS +BB64;BB64;1106 116F 11BB;BB64;1106 116F 11BB; # (뭤; 뭤; 뭤; 뭤; 뭤; ) HANGUL SYLLABLE MWEOSS +BB65;BB65;1106 116F 11BC;BB65;1106 116F 11BC; # (뭥; 뭥; 뭥; 뭥; 뭥; ) HANGUL SYLLABLE MWEONG +BB66;BB66;1106 116F 11BD;BB66;1106 116F 11BD; # (뭦; 뭦; 뭦; 뭦; 뭦; ) HANGUL SYLLABLE MWEOJ +BB67;BB67;1106 116F 11BE;BB67;1106 116F 11BE; # (뭧; 뭧; 뭧; 뭧; 뭧; ) HANGUL SYLLABLE MWEOC +BB68;BB68;1106 116F 11BF;BB68;1106 116F 11BF; # (뭨; 뭨; 뭨; 뭨; 뭨; ) HANGUL SYLLABLE MWEOK +BB69;BB69;1106 116F 11C0;BB69;1106 116F 11C0; # (뭩; 뭩; 뭩; 뭩; 뭩; ) HANGUL SYLLABLE MWEOT +BB6A;BB6A;1106 116F 11C1;BB6A;1106 116F 11C1; # (뭪; 뭪; 뭪; 뭪; 뭪; ) HANGUL SYLLABLE MWEOP +BB6B;BB6B;1106 116F 11C2;BB6B;1106 116F 11C2; # (뭫; 뭫; 뭫; 뭫; 뭫; ) HANGUL SYLLABLE MWEOH +BB6C;BB6C;1106 1170;BB6C;1106 1170; # (뭬; 뭬; 뭬; 뭬; 뭬; ) HANGUL SYLLABLE MWE +BB6D;BB6D;1106 1170 11A8;BB6D;1106 1170 11A8; # (뭭; 뭭; 뭭; 뭭; 뭭; ) HANGUL SYLLABLE MWEG +BB6E;BB6E;1106 1170 11A9;BB6E;1106 1170 11A9; # (뭮; 뭮; 뭮; 뭮; 뭮; ) HANGUL SYLLABLE MWEGG +BB6F;BB6F;1106 1170 11AA;BB6F;1106 1170 11AA; # (뭯; 뭯; 뭯; 뭯; 뭯; ) HANGUL SYLLABLE MWEGS +BB70;BB70;1106 1170 11AB;BB70;1106 1170 11AB; # (뭰; 뭰; 뭰; 뭰; 뭰; ) HANGUL SYLLABLE MWEN +BB71;BB71;1106 1170 11AC;BB71;1106 1170 11AC; # (뭱; 뭱; 뭱; 뭱; 뭱; ) HANGUL SYLLABLE MWENJ +BB72;BB72;1106 1170 11AD;BB72;1106 1170 11AD; # (뭲; 뭲; 뭲; 뭲; 뭲; ) HANGUL SYLLABLE MWENH +BB73;BB73;1106 1170 11AE;BB73;1106 1170 11AE; # (뭳; 뭳; 뭳; 뭳; 뭳; ) HANGUL SYLLABLE MWED +BB74;BB74;1106 1170 11AF;BB74;1106 1170 11AF; # (뭴; 뭴; 뭴; 뭴; 뭴; ) HANGUL SYLLABLE MWEL +BB75;BB75;1106 1170 11B0;BB75;1106 1170 11B0; # (뭵; 뭵; 뭵; 뭵; 뭵; ) HANGUL SYLLABLE MWELG +BB76;BB76;1106 1170 11B1;BB76;1106 1170 11B1; # (뭶; 뭶; 뭶; 뭶; 뭶; ) HANGUL SYLLABLE MWELM +BB77;BB77;1106 1170 11B2;BB77;1106 1170 11B2; # (뭷; 뭷; 뭷; 뭷; 뭷; ) HANGUL SYLLABLE MWELB +BB78;BB78;1106 1170 11B3;BB78;1106 1170 11B3; # (뭸; 뭸; 뭸; 뭸; 뭸; ) HANGUL SYLLABLE MWELS +BB79;BB79;1106 1170 11B4;BB79;1106 1170 11B4; # (뭹; 뭹; 뭹; 뭹; 뭹; ) HANGUL SYLLABLE MWELT +BB7A;BB7A;1106 1170 11B5;BB7A;1106 1170 11B5; # (뭺; 뭺; 뭺; 뭺; 뭺; ) HANGUL SYLLABLE MWELP +BB7B;BB7B;1106 1170 11B6;BB7B;1106 1170 11B6; # (뭻; 뭻; 뭻; 뭻; 뭻; ) HANGUL SYLLABLE MWELH +BB7C;BB7C;1106 1170 11B7;BB7C;1106 1170 11B7; # (뭼; 뭼; 뭼; 뭼; 뭼; ) HANGUL SYLLABLE MWEM +BB7D;BB7D;1106 1170 11B8;BB7D;1106 1170 11B8; # (뭽; 뭽; 뭽; 뭽; 뭽; ) HANGUL SYLLABLE MWEB +BB7E;BB7E;1106 1170 11B9;BB7E;1106 1170 11B9; # (뭾; 뭾; 뭾; 뭾; 뭾; ) HANGUL SYLLABLE MWEBS +BB7F;BB7F;1106 1170 11BA;BB7F;1106 1170 11BA; # (뭿; 뭿; 뭿; 뭿; 뭿; ) HANGUL SYLLABLE MWES +BB80;BB80;1106 1170 11BB;BB80;1106 1170 11BB; # (뮀; 뮀; 뮀; 뮀; 뮀; ) HANGUL SYLLABLE MWESS +BB81;BB81;1106 1170 11BC;BB81;1106 1170 11BC; # (뮁; 뮁; 뮁; 뮁; 뮁; ) HANGUL SYLLABLE MWENG +BB82;BB82;1106 1170 11BD;BB82;1106 1170 11BD; # (뮂; 뮂; 뮂; 뮂; 뮂; ) HANGUL SYLLABLE MWEJ +BB83;BB83;1106 1170 11BE;BB83;1106 1170 11BE; # (뮃; 뮃; 뮃; 뮃; 뮃; ) HANGUL SYLLABLE MWEC +BB84;BB84;1106 1170 11BF;BB84;1106 1170 11BF; # (뮄; 뮄; 뮄; 뮄; 뮄; ) HANGUL SYLLABLE MWEK +BB85;BB85;1106 1170 11C0;BB85;1106 1170 11C0; # (뮅; 뮅; 뮅; 뮅; 뮅; ) HANGUL SYLLABLE MWET +BB86;BB86;1106 1170 11C1;BB86;1106 1170 11C1; # (뮆; 뮆; 뮆; 뮆; 뮆; ) HANGUL SYLLABLE MWEP +BB87;BB87;1106 1170 11C2;BB87;1106 1170 11C2; # (뮇; 뮇; 뮇; 뮇; 뮇; ) HANGUL SYLLABLE MWEH +BB88;BB88;1106 1171;BB88;1106 1171; # (뮈; 뮈; 뮈; 뮈; 뮈; ) HANGUL SYLLABLE MWI +BB89;BB89;1106 1171 11A8;BB89;1106 1171 11A8; # (뮉; 뮉; 뮉; 뮉; 뮉; ) HANGUL SYLLABLE MWIG +BB8A;BB8A;1106 1171 11A9;BB8A;1106 1171 11A9; # (뮊; 뮊; 뮊; 뮊; 뮊; ) HANGUL SYLLABLE MWIGG +BB8B;BB8B;1106 1171 11AA;BB8B;1106 1171 11AA; # (뮋; 뮋; 뮋; 뮋; 뮋; ) HANGUL SYLLABLE MWIGS +BB8C;BB8C;1106 1171 11AB;BB8C;1106 1171 11AB; # (뮌; 뮌; 뮌; 뮌; 뮌; ) HANGUL SYLLABLE MWIN +BB8D;BB8D;1106 1171 11AC;BB8D;1106 1171 11AC; # (뮍; 뮍; 뮍; 뮍; 뮍; ) HANGUL SYLLABLE MWINJ +BB8E;BB8E;1106 1171 11AD;BB8E;1106 1171 11AD; # (뮎; 뮎; 뮎; 뮎; 뮎; ) HANGUL SYLLABLE MWINH +BB8F;BB8F;1106 1171 11AE;BB8F;1106 1171 11AE; # (뮏; 뮏; 뮏; 뮏; 뮏; ) HANGUL SYLLABLE MWID +BB90;BB90;1106 1171 11AF;BB90;1106 1171 11AF; # (뮐; 뮐; 뮐; 뮐; 뮐; ) HANGUL SYLLABLE MWIL +BB91;BB91;1106 1171 11B0;BB91;1106 1171 11B0; # (뮑; 뮑; 뮑; 뮑; 뮑; ) HANGUL SYLLABLE MWILG +BB92;BB92;1106 1171 11B1;BB92;1106 1171 11B1; # (뮒; 뮒; 뮒; 뮒; 뮒; ) HANGUL SYLLABLE MWILM +BB93;BB93;1106 1171 11B2;BB93;1106 1171 11B2; # (뮓; 뮓; 뮓; 뮓; 뮓; ) HANGUL SYLLABLE MWILB +BB94;BB94;1106 1171 11B3;BB94;1106 1171 11B3; # (뮔; 뮔; 뮔; 뮔; 뮔; ) HANGUL SYLLABLE MWILS +BB95;BB95;1106 1171 11B4;BB95;1106 1171 11B4; # (뮕; 뮕; 뮕; 뮕; 뮕; ) HANGUL SYLLABLE MWILT +BB96;BB96;1106 1171 11B5;BB96;1106 1171 11B5; # (뮖; 뮖; 뮖; 뮖; 뮖; ) HANGUL SYLLABLE MWILP +BB97;BB97;1106 1171 11B6;BB97;1106 1171 11B6; # (뮗; 뮗; 뮗; 뮗; 뮗; ) HANGUL SYLLABLE MWILH +BB98;BB98;1106 1171 11B7;BB98;1106 1171 11B7; # (뮘; 뮘; 뮘; 뮘; 뮘; ) HANGUL SYLLABLE MWIM +BB99;BB99;1106 1171 11B8;BB99;1106 1171 11B8; # (뮙; 뮙; 뮙; 뮙; 뮙; ) HANGUL SYLLABLE MWIB +BB9A;BB9A;1106 1171 11B9;BB9A;1106 1171 11B9; # (뮚; 뮚; 뮚; 뮚; 뮚; ) HANGUL SYLLABLE MWIBS +BB9B;BB9B;1106 1171 11BA;BB9B;1106 1171 11BA; # (뮛; 뮛; 뮛; 뮛; 뮛; ) HANGUL SYLLABLE MWIS +BB9C;BB9C;1106 1171 11BB;BB9C;1106 1171 11BB; # (뮜; 뮜; 뮜; 뮜; 뮜; ) HANGUL SYLLABLE MWISS +BB9D;BB9D;1106 1171 11BC;BB9D;1106 1171 11BC; # (뮝; 뮝; 뮝; 뮝; 뮝; ) HANGUL SYLLABLE MWING +BB9E;BB9E;1106 1171 11BD;BB9E;1106 1171 11BD; # (뮞; 뮞; 뮞; 뮞; 뮞; ) HANGUL SYLLABLE MWIJ +BB9F;BB9F;1106 1171 11BE;BB9F;1106 1171 11BE; # (뮟; 뮟; 뮟; 뮟; 뮟; ) HANGUL SYLLABLE MWIC +BBA0;BBA0;1106 1171 11BF;BBA0;1106 1171 11BF; # (뮠; 뮠; 뮠; 뮠; 뮠; ) HANGUL SYLLABLE MWIK +BBA1;BBA1;1106 1171 11C0;BBA1;1106 1171 11C0; # (뮡; 뮡; 뮡; 뮡; 뮡; ) HANGUL SYLLABLE MWIT +BBA2;BBA2;1106 1171 11C1;BBA2;1106 1171 11C1; # (뮢; 뮢; 뮢; 뮢; 뮢; ) HANGUL SYLLABLE MWIP +BBA3;BBA3;1106 1171 11C2;BBA3;1106 1171 11C2; # (뮣; 뮣; 뮣; 뮣; 뮣; ) HANGUL SYLLABLE MWIH +BBA4;BBA4;1106 1172;BBA4;1106 1172; # (뮤; 뮤; 뮤; 뮤; 뮤; ) HANGUL SYLLABLE MYU +BBA5;BBA5;1106 1172 11A8;BBA5;1106 1172 11A8; # (뮥; 뮥; 뮥; 뮥; 뮥; ) HANGUL SYLLABLE MYUG +BBA6;BBA6;1106 1172 11A9;BBA6;1106 1172 11A9; # (뮦; 뮦; 뮦; 뮦; 뮦; ) HANGUL SYLLABLE MYUGG +BBA7;BBA7;1106 1172 11AA;BBA7;1106 1172 11AA; # (뮧; 뮧; 뮧; 뮧; 뮧; ) HANGUL SYLLABLE MYUGS +BBA8;BBA8;1106 1172 11AB;BBA8;1106 1172 11AB; # (뮨; 뮨; 뮨; 뮨; 뮨; ) HANGUL SYLLABLE MYUN +BBA9;BBA9;1106 1172 11AC;BBA9;1106 1172 11AC; # (뮩; 뮩; 뮩; 뮩; 뮩; ) HANGUL SYLLABLE MYUNJ +BBAA;BBAA;1106 1172 11AD;BBAA;1106 1172 11AD; # (뮪; 뮪; 뮪; 뮪; 뮪; ) HANGUL SYLLABLE MYUNH +BBAB;BBAB;1106 1172 11AE;BBAB;1106 1172 11AE; # (뮫; 뮫; 뮫; 뮫; 뮫; ) HANGUL SYLLABLE MYUD +BBAC;BBAC;1106 1172 11AF;BBAC;1106 1172 11AF; # (뮬; 뮬; 뮬; 뮬; 뮬; ) HANGUL SYLLABLE MYUL +BBAD;BBAD;1106 1172 11B0;BBAD;1106 1172 11B0; # (뮭; 뮭; 뮭; 뮭; 뮭; ) HANGUL SYLLABLE MYULG +BBAE;BBAE;1106 1172 11B1;BBAE;1106 1172 11B1; # (뮮; 뮮; 뮮; 뮮; 뮮; ) HANGUL SYLLABLE MYULM +BBAF;BBAF;1106 1172 11B2;BBAF;1106 1172 11B2; # (뮯; 뮯; 뮯; 뮯; 뮯; ) HANGUL SYLLABLE MYULB +BBB0;BBB0;1106 1172 11B3;BBB0;1106 1172 11B3; # (뮰; 뮰; 뮰; 뮰; 뮰; ) HANGUL SYLLABLE MYULS +BBB1;BBB1;1106 1172 11B4;BBB1;1106 1172 11B4; # (뮱; 뮱; 뮱; 뮱; 뮱; ) HANGUL SYLLABLE MYULT +BBB2;BBB2;1106 1172 11B5;BBB2;1106 1172 11B5; # (뮲; 뮲; 뮲; 뮲; 뮲; ) HANGUL SYLLABLE MYULP +BBB3;BBB3;1106 1172 11B6;BBB3;1106 1172 11B6; # (뮳; 뮳; 뮳; 뮳; 뮳; ) HANGUL SYLLABLE MYULH +BBB4;BBB4;1106 1172 11B7;BBB4;1106 1172 11B7; # (뮴; 뮴; 뮴; 뮴; 뮴; ) HANGUL SYLLABLE MYUM +BBB5;BBB5;1106 1172 11B8;BBB5;1106 1172 11B8; # (뮵; 뮵; 뮵; 뮵; 뮵; ) HANGUL SYLLABLE MYUB +BBB6;BBB6;1106 1172 11B9;BBB6;1106 1172 11B9; # (뮶; 뮶; 뮶; 뮶; 뮶; ) HANGUL SYLLABLE MYUBS +BBB7;BBB7;1106 1172 11BA;BBB7;1106 1172 11BA; # (뮷; 뮷; 뮷; 뮷; 뮷; ) HANGUL SYLLABLE MYUS +BBB8;BBB8;1106 1172 11BB;BBB8;1106 1172 11BB; # (뮸; 뮸; 뮸; 뮸; 뮸; ) HANGUL SYLLABLE MYUSS +BBB9;BBB9;1106 1172 11BC;BBB9;1106 1172 11BC; # (뮹; 뮹; 뮹; 뮹; 뮹; ) HANGUL SYLLABLE MYUNG +BBBA;BBBA;1106 1172 11BD;BBBA;1106 1172 11BD; # (뮺; 뮺; 뮺; 뮺; 뮺; ) HANGUL SYLLABLE MYUJ +BBBB;BBBB;1106 1172 11BE;BBBB;1106 1172 11BE; # (뮻; 뮻; 뮻; 뮻; 뮻; ) HANGUL SYLLABLE MYUC +BBBC;BBBC;1106 1172 11BF;BBBC;1106 1172 11BF; # (뮼; 뮼; 뮼; 뮼; 뮼; ) HANGUL SYLLABLE MYUK +BBBD;BBBD;1106 1172 11C0;BBBD;1106 1172 11C0; # (뮽; 뮽; 뮽; 뮽; 뮽; ) HANGUL SYLLABLE MYUT +BBBE;BBBE;1106 1172 11C1;BBBE;1106 1172 11C1; # (뮾; 뮾; 뮾; 뮾; 뮾; ) HANGUL SYLLABLE MYUP +BBBF;BBBF;1106 1172 11C2;BBBF;1106 1172 11C2; # (뮿; 뮿; 뮿; 뮿; 뮿; ) HANGUL SYLLABLE MYUH +BBC0;BBC0;1106 1173;BBC0;1106 1173; # (므; 므; 므; 므; 므; ) HANGUL SYLLABLE MEU +BBC1;BBC1;1106 1173 11A8;BBC1;1106 1173 11A8; # (믁; 믁; 믁; 믁; 믁; ) HANGUL SYLLABLE MEUG +BBC2;BBC2;1106 1173 11A9;BBC2;1106 1173 11A9; # (믂; 믂; 믂; 믂; 믂; ) HANGUL SYLLABLE MEUGG +BBC3;BBC3;1106 1173 11AA;BBC3;1106 1173 11AA; # (믃; 믃; 믃; 믃; 믃; ) HANGUL SYLLABLE MEUGS +BBC4;BBC4;1106 1173 11AB;BBC4;1106 1173 11AB; # (믄; 믄; 믄; 믄; 믄; ) HANGUL SYLLABLE MEUN +BBC5;BBC5;1106 1173 11AC;BBC5;1106 1173 11AC; # (믅; 믅; 믅; 믅; 믅; ) HANGUL SYLLABLE MEUNJ +BBC6;BBC6;1106 1173 11AD;BBC6;1106 1173 11AD; # (믆; 믆; 믆; 믆; 믆; ) HANGUL SYLLABLE MEUNH +BBC7;BBC7;1106 1173 11AE;BBC7;1106 1173 11AE; # (믇; 믇; 믇; 믇; 믇; ) HANGUL SYLLABLE MEUD +BBC8;BBC8;1106 1173 11AF;BBC8;1106 1173 11AF; # (믈; 믈; 믈; 믈; 믈; ) HANGUL SYLLABLE MEUL +BBC9;BBC9;1106 1173 11B0;BBC9;1106 1173 11B0; # (믉; 믉; 믉; 믉; 믉; ) HANGUL SYLLABLE MEULG +BBCA;BBCA;1106 1173 11B1;BBCA;1106 1173 11B1; # (믊; 믊; 믊; 믊; 믊; ) HANGUL SYLLABLE MEULM +BBCB;BBCB;1106 1173 11B2;BBCB;1106 1173 11B2; # (믋; 믋; 믋; 믋; 믋; ) HANGUL SYLLABLE MEULB +BBCC;BBCC;1106 1173 11B3;BBCC;1106 1173 11B3; # (믌; 믌; 믌; 믌; 믌; ) HANGUL SYLLABLE MEULS +BBCD;BBCD;1106 1173 11B4;BBCD;1106 1173 11B4; # (믍; 믍; 믍; 믍; 믍; ) HANGUL SYLLABLE MEULT +BBCE;BBCE;1106 1173 11B5;BBCE;1106 1173 11B5; # (믎; 믎; 믎; 믎; 믎; ) HANGUL SYLLABLE MEULP +BBCF;BBCF;1106 1173 11B6;BBCF;1106 1173 11B6; # (믏; 믏; 믏; 믏; 믏; ) HANGUL SYLLABLE MEULH +BBD0;BBD0;1106 1173 11B7;BBD0;1106 1173 11B7; # (믐; 믐; 믐; 믐; 믐; ) HANGUL SYLLABLE MEUM +BBD1;BBD1;1106 1173 11B8;BBD1;1106 1173 11B8; # (믑; 믑; 믑; 믑; 믑; ) HANGUL SYLLABLE MEUB +BBD2;BBD2;1106 1173 11B9;BBD2;1106 1173 11B9; # (믒; 믒; 믒; 믒; 믒; ) HANGUL SYLLABLE MEUBS +BBD3;BBD3;1106 1173 11BA;BBD3;1106 1173 11BA; # (믓; 믓; 믓; 믓; 믓; ) HANGUL SYLLABLE MEUS +BBD4;BBD4;1106 1173 11BB;BBD4;1106 1173 11BB; # (믔; 믔; 믔; 믔; 믔; ) HANGUL SYLLABLE MEUSS +BBD5;BBD5;1106 1173 11BC;BBD5;1106 1173 11BC; # (믕; 믕; 믕; 믕; 믕; ) HANGUL SYLLABLE MEUNG +BBD6;BBD6;1106 1173 11BD;BBD6;1106 1173 11BD; # (믖; 믖; 믖; 믖; 믖; ) HANGUL SYLLABLE MEUJ +BBD7;BBD7;1106 1173 11BE;BBD7;1106 1173 11BE; # (믗; 믗; 믗; 믗; 믗; ) HANGUL SYLLABLE MEUC +BBD8;BBD8;1106 1173 11BF;BBD8;1106 1173 11BF; # (믘; 믘; 믘; 믘; 믘; ) HANGUL SYLLABLE MEUK +BBD9;BBD9;1106 1173 11C0;BBD9;1106 1173 11C0; # (믙; 믙; 믙; 믙; 믙; ) HANGUL SYLLABLE MEUT +BBDA;BBDA;1106 1173 11C1;BBDA;1106 1173 11C1; # (믚; 믚; 믚; 믚; 믚; ) HANGUL SYLLABLE MEUP +BBDB;BBDB;1106 1173 11C2;BBDB;1106 1173 11C2; # (믛; 믛; 믛; 믛; 믛; ) HANGUL SYLLABLE MEUH +BBDC;BBDC;1106 1174;BBDC;1106 1174; # (믜; 믜; 믜; 믜; 믜; ) HANGUL SYLLABLE MYI +BBDD;BBDD;1106 1174 11A8;BBDD;1106 1174 11A8; # (믝; 믝; 믝; 믝; 믝; ) HANGUL SYLLABLE MYIG +BBDE;BBDE;1106 1174 11A9;BBDE;1106 1174 11A9; # (믞; 믞; 믞; 믞; 믞; ) HANGUL SYLLABLE MYIGG +BBDF;BBDF;1106 1174 11AA;BBDF;1106 1174 11AA; # (믟; 믟; 믟; 믟; 믟; ) HANGUL SYLLABLE MYIGS +BBE0;BBE0;1106 1174 11AB;BBE0;1106 1174 11AB; # (믠; 믠; 믠; 믠; 믠; ) HANGUL SYLLABLE MYIN +BBE1;BBE1;1106 1174 11AC;BBE1;1106 1174 11AC; # (믡; 믡; 믡; 믡; 믡; ) HANGUL SYLLABLE MYINJ +BBE2;BBE2;1106 1174 11AD;BBE2;1106 1174 11AD; # (믢; 믢; 믢; 믢; 믢; ) HANGUL SYLLABLE MYINH +BBE3;BBE3;1106 1174 11AE;BBE3;1106 1174 11AE; # (믣; 믣; 믣; 믣; 믣; ) HANGUL SYLLABLE MYID +BBE4;BBE4;1106 1174 11AF;BBE4;1106 1174 11AF; # (믤; 믤; 믤; 믤; 믤; ) HANGUL SYLLABLE MYIL +BBE5;BBE5;1106 1174 11B0;BBE5;1106 1174 11B0; # (믥; 믥; 믥; 믥; 믥; ) HANGUL SYLLABLE MYILG +BBE6;BBE6;1106 1174 11B1;BBE6;1106 1174 11B1; # (믦; 믦; 믦; 믦; 믦; ) HANGUL SYLLABLE MYILM +BBE7;BBE7;1106 1174 11B2;BBE7;1106 1174 11B2; # (믧; 믧; 믧; 믧; 믧; ) HANGUL SYLLABLE MYILB +BBE8;BBE8;1106 1174 11B3;BBE8;1106 1174 11B3; # (믨; 믨; 믨; 믨; 믨; ) HANGUL SYLLABLE MYILS +BBE9;BBE9;1106 1174 11B4;BBE9;1106 1174 11B4; # (믩; 믩; 믩; 믩; 믩; ) HANGUL SYLLABLE MYILT +BBEA;BBEA;1106 1174 11B5;BBEA;1106 1174 11B5; # (믪; 믪; 믪; 믪; 믪; ) HANGUL SYLLABLE MYILP +BBEB;BBEB;1106 1174 11B6;BBEB;1106 1174 11B6; # (믫; 믫; 믫; 믫; 믫; ) HANGUL SYLLABLE MYILH +BBEC;BBEC;1106 1174 11B7;BBEC;1106 1174 11B7; # (믬; 믬; 믬; 믬; 믬; ) HANGUL SYLLABLE MYIM +BBED;BBED;1106 1174 11B8;BBED;1106 1174 11B8; # (믭; 믭; 믭; 믭; 믭; ) HANGUL SYLLABLE MYIB +BBEE;BBEE;1106 1174 11B9;BBEE;1106 1174 11B9; # (믮; 믮; 믮; 믮; 믮; ) HANGUL SYLLABLE MYIBS +BBEF;BBEF;1106 1174 11BA;BBEF;1106 1174 11BA; # (믯; 믯; 믯; 믯; 믯; ) HANGUL SYLLABLE MYIS +BBF0;BBF0;1106 1174 11BB;BBF0;1106 1174 11BB; # (믰; 믰; 믰; 믰; 믰; ) HANGUL SYLLABLE MYISS +BBF1;BBF1;1106 1174 11BC;BBF1;1106 1174 11BC; # (믱; 믱; 믱; 믱; 믱; ) HANGUL SYLLABLE MYING +BBF2;BBF2;1106 1174 11BD;BBF2;1106 1174 11BD; # (믲; 믲; 믲; 믲; 믲; ) HANGUL SYLLABLE MYIJ +BBF3;BBF3;1106 1174 11BE;BBF3;1106 1174 11BE; # (믳; 믳; 믳; 믳; 믳; ) HANGUL SYLLABLE MYIC +BBF4;BBF4;1106 1174 11BF;BBF4;1106 1174 11BF; # (믴; 믴; 믴; 믴; 믴; ) HANGUL SYLLABLE MYIK +BBF5;BBF5;1106 1174 11C0;BBF5;1106 1174 11C0; # (믵; 믵; 믵; 믵; 믵; ) HANGUL SYLLABLE MYIT +BBF6;BBF6;1106 1174 11C1;BBF6;1106 1174 11C1; # (믶; 믶; 믶; 믶; 믶; ) HANGUL SYLLABLE MYIP +BBF7;BBF7;1106 1174 11C2;BBF7;1106 1174 11C2; # (믷; 믷; 믷; 믷; 믷; ) HANGUL SYLLABLE MYIH +BBF8;BBF8;1106 1175;BBF8;1106 1175; # (미; 미; 미; 미; 미; ) HANGUL SYLLABLE MI +BBF9;BBF9;1106 1175 11A8;BBF9;1106 1175 11A8; # (믹; 믹; 믹; 믹; 믹; ) HANGUL SYLLABLE MIG +BBFA;BBFA;1106 1175 11A9;BBFA;1106 1175 11A9; # (믺; 믺; 믺; 믺; 믺; ) HANGUL SYLLABLE MIGG +BBFB;BBFB;1106 1175 11AA;BBFB;1106 1175 11AA; # (믻; 믻; 믻; 믻; 믻; ) HANGUL SYLLABLE MIGS +BBFC;BBFC;1106 1175 11AB;BBFC;1106 1175 11AB; # (민; 민; 민; 민; 민; ) HANGUL SYLLABLE MIN +BBFD;BBFD;1106 1175 11AC;BBFD;1106 1175 11AC; # (믽; 믽; 믽; 믽; 믽; ) HANGUL SYLLABLE MINJ +BBFE;BBFE;1106 1175 11AD;BBFE;1106 1175 11AD; # (믾; 믾; 믾; 믾; 믾; ) HANGUL SYLLABLE MINH +BBFF;BBFF;1106 1175 11AE;BBFF;1106 1175 11AE; # (믿; 믿; 믿; 믿; 믿; ) HANGUL SYLLABLE MID +BC00;BC00;1106 1175 11AF;BC00;1106 1175 11AF; # (밀; 밀; 밀; 밀; 밀; ) HANGUL SYLLABLE MIL +BC01;BC01;1106 1175 11B0;BC01;1106 1175 11B0; # (밁; 밁; 밁; 밁; 밁; ) HANGUL SYLLABLE MILG +BC02;BC02;1106 1175 11B1;BC02;1106 1175 11B1; # (밂; 밂; 밂; 밂; 밂; ) HANGUL SYLLABLE MILM +BC03;BC03;1106 1175 11B2;BC03;1106 1175 11B2; # (밃; 밃; 밃; 밃; 밃; ) HANGUL SYLLABLE MILB +BC04;BC04;1106 1175 11B3;BC04;1106 1175 11B3; # (밄; 밄; 밄; 밄; 밄; ) HANGUL SYLLABLE MILS +BC05;BC05;1106 1175 11B4;BC05;1106 1175 11B4; # (밅; 밅; 밅; 밅; 밅; ) HANGUL SYLLABLE MILT +BC06;BC06;1106 1175 11B5;BC06;1106 1175 11B5; # (밆; 밆; 밆; 밆; 밆; ) HANGUL SYLLABLE MILP +BC07;BC07;1106 1175 11B6;BC07;1106 1175 11B6; # (밇; 밇; 밇; 밇; 밇; ) HANGUL SYLLABLE MILH +BC08;BC08;1106 1175 11B7;BC08;1106 1175 11B7; # (밈; 밈; 밈; 밈; 밈; ) HANGUL SYLLABLE MIM +BC09;BC09;1106 1175 11B8;BC09;1106 1175 11B8; # (밉; 밉; 밉; 밉; 밉; ) HANGUL SYLLABLE MIB +BC0A;BC0A;1106 1175 11B9;BC0A;1106 1175 11B9; # (밊; 밊; 밊; 밊; 밊; ) HANGUL SYLLABLE MIBS +BC0B;BC0B;1106 1175 11BA;BC0B;1106 1175 11BA; # (밋; 밋; 밋; 밋; 밋; ) HANGUL SYLLABLE MIS +BC0C;BC0C;1106 1175 11BB;BC0C;1106 1175 11BB; # (밌; 밌; 밌; 밌; 밌; ) HANGUL SYLLABLE MISS +BC0D;BC0D;1106 1175 11BC;BC0D;1106 1175 11BC; # (밍; 밍; 밍; 밍; 밍; ) HANGUL SYLLABLE MING +BC0E;BC0E;1106 1175 11BD;BC0E;1106 1175 11BD; # (밎; 밎; 밎; 밎; 밎; ) HANGUL SYLLABLE MIJ +BC0F;BC0F;1106 1175 11BE;BC0F;1106 1175 11BE; # (및; 및; 및; 및; 및; ) HANGUL SYLLABLE MIC +BC10;BC10;1106 1175 11BF;BC10;1106 1175 11BF; # (밐; 밐; 밐; 밐; 밐; ) HANGUL SYLLABLE MIK +BC11;BC11;1106 1175 11C0;BC11;1106 1175 11C0; # (밑; 밑; 밑; 밑; 밑; ) HANGUL SYLLABLE MIT +BC12;BC12;1106 1175 11C1;BC12;1106 1175 11C1; # (밒; 밒; 밒; 밒; 밒; ) HANGUL SYLLABLE MIP +BC13;BC13;1106 1175 11C2;BC13;1106 1175 11C2; # (밓; 밓; 밓; 밓; 밓; ) HANGUL SYLLABLE MIH +BC14;BC14;1107 1161;BC14;1107 1161; # (바; 바; 바; 바; 바; ) HANGUL SYLLABLE BA +BC15;BC15;1107 1161 11A8;BC15;1107 1161 11A8; # (박; 박; 박; 박; 박; ) HANGUL SYLLABLE BAG +BC16;BC16;1107 1161 11A9;BC16;1107 1161 11A9; # (밖; 밖; 밖; 밖; 밖; ) HANGUL SYLLABLE BAGG +BC17;BC17;1107 1161 11AA;BC17;1107 1161 11AA; # (밗; 밗; 밗; 밗; 밗; ) HANGUL SYLLABLE BAGS +BC18;BC18;1107 1161 11AB;BC18;1107 1161 11AB; # (반; 반; 반; 반; 반; ) HANGUL SYLLABLE BAN +BC19;BC19;1107 1161 11AC;BC19;1107 1161 11AC; # (밙; 밙; 밙; 밙; 밙; ) HANGUL SYLLABLE BANJ +BC1A;BC1A;1107 1161 11AD;BC1A;1107 1161 11AD; # (밚; 밚; 밚; 밚; 밚; ) HANGUL SYLLABLE BANH +BC1B;BC1B;1107 1161 11AE;BC1B;1107 1161 11AE; # (받; 받; 받; 받; 받; ) HANGUL SYLLABLE BAD +BC1C;BC1C;1107 1161 11AF;BC1C;1107 1161 11AF; # (발; 발; 발; 발; 발; ) HANGUL SYLLABLE BAL +BC1D;BC1D;1107 1161 11B0;BC1D;1107 1161 11B0; # (밝; 밝; 밝; 밝; 밝; ) HANGUL SYLLABLE BALG +BC1E;BC1E;1107 1161 11B1;BC1E;1107 1161 11B1; # (밞; 밞; 밞; 밞; 밞; ) HANGUL SYLLABLE BALM +BC1F;BC1F;1107 1161 11B2;BC1F;1107 1161 11B2; # (밟; 밟; 밟; 밟; 밟; ) HANGUL SYLLABLE BALB +BC20;BC20;1107 1161 11B3;BC20;1107 1161 11B3; # (밠; 밠; 밠; 밠; 밠; ) HANGUL SYLLABLE BALS +BC21;BC21;1107 1161 11B4;BC21;1107 1161 11B4; # (밡; 밡; 밡; 밡; 밡; ) HANGUL SYLLABLE BALT +BC22;BC22;1107 1161 11B5;BC22;1107 1161 11B5; # (밢; 밢; 밢; 밢; 밢; ) HANGUL SYLLABLE BALP +BC23;BC23;1107 1161 11B6;BC23;1107 1161 11B6; # (밣; 밣; 밣; 밣; 밣; ) HANGUL SYLLABLE BALH +BC24;BC24;1107 1161 11B7;BC24;1107 1161 11B7; # (밤; 밤; 밤; 밤; 밤; ) HANGUL SYLLABLE BAM +BC25;BC25;1107 1161 11B8;BC25;1107 1161 11B8; # (밥; 밥; 밥; 밥; 밥; ) HANGUL SYLLABLE BAB +BC26;BC26;1107 1161 11B9;BC26;1107 1161 11B9; # (밦; 밦; 밦; 밦; 밦; ) HANGUL SYLLABLE BABS +BC27;BC27;1107 1161 11BA;BC27;1107 1161 11BA; # (밧; 밧; 밧; 밧; 밧; ) HANGUL SYLLABLE BAS +BC28;BC28;1107 1161 11BB;BC28;1107 1161 11BB; # (밨; 밨; 밨; 밨; 밨; ) HANGUL SYLLABLE BASS +BC29;BC29;1107 1161 11BC;BC29;1107 1161 11BC; # (방; 방; 방; 방; 방; ) HANGUL SYLLABLE BANG +BC2A;BC2A;1107 1161 11BD;BC2A;1107 1161 11BD; # (밪; 밪; 밪; 밪; 밪; ) HANGUL SYLLABLE BAJ +BC2B;BC2B;1107 1161 11BE;BC2B;1107 1161 11BE; # (밫; 밫; 밫; 밫; 밫; ) HANGUL SYLLABLE BAC +BC2C;BC2C;1107 1161 11BF;BC2C;1107 1161 11BF; # (밬; 밬; 밬; 밬; 밬; ) HANGUL SYLLABLE BAK +BC2D;BC2D;1107 1161 11C0;BC2D;1107 1161 11C0; # (밭; 밭; 밭; 밭; 밭; ) HANGUL SYLLABLE BAT +BC2E;BC2E;1107 1161 11C1;BC2E;1107 1161 11C1; # (밮; 밮; 밮; 밮; 밮; ) HANGUL SYLLABLE BAP +BC2F;BC2F;1107 1161 11C2;BC2F;1107 1161 11C2; # (밯; 밯; 밯; 밯; 밯; ) HANGUL SYLLABLE BAH +BC30;BC30;1107 1162;BC30;1107 1162; # (배; 배; 배; 배; 배; ) HANGUL SYLLABLE BAE +BC31;BC31;1107 1162 11A8;BC31;1107 1162 11A8; # (백; 백; 백; 백; 백; ) HANGUL SYLLABLE BAEG +BC32;BC32;1107 1162 11A9;BC32;1107 1162 11A9; # (밲; 밲; 밲; 밲; 밲; ) HANGUL SYLLABLE BAEGG +BC33;BC33;1107 1162 11AA;BC33;1107 1162 11AA; # (밳; 밳; 밳; 밳; 밳; ) HANGUL SYLLABLE BAEGS +BC34;BC34;1107 1162 11AB;BC34;1107 1162 11AB; # (밴; 밴; 밴; 밴; 밴; ) HANGUL SYLLABLE BAEN +BC35;BC35;1107 1162 11AC;BC35;1107 1162 11AC; # (밵; 밵; 밵; 밵; 밵; ) HANGUL SYLLABLE BAENJ +BC36;BC36;1107 1162 11AD;BC36;1107 1162 11AD; # (밶; 밶; 밶; 밶; 밶; ) HANGUL SYLLABLE BAENH +BC37;BC37;1107 1162 11AE;BC37;1107 1162 11AE; # (밷; 밷; 밷; 밷; 밷; ) HANGUL SYLLABLE BAED +BC38;BC38;1107 1162 11AF;BC38;1107 1162 11AF; # (밸; 밸; 밸; 밸; 밸; ) HANGUL SYLLABLE BAEL +BC39;BC39;1107 1162 11B0;BC39;1107 1162 11B0; # (밹; 밹; 밹; 밹; 밹; ) HANGUL SYLLABLE BAELG +BC3A;BC3A;1107 1162 11B1;BC3A;1107 1162 11B1; # (밺; 밺; 밺; 밺; 밺; ) HANGUL SYLLABLE BAELM +BC3B;BC3B;1107 1162 11B2;BC3B;1107 1162 11B2; # (밻; 밻; 밻; 밻; 밻; ) HANGUL SYLLABLE BAELB +BC3C;BC3C;1107 1162 11B3;BC3C;1107 1162 11B3; # (밼; 밼; 밼; 밼; 밼; ) HANGUL SYLLABLE BAELS +BC3D;BC3D;1107 1162 11B4;BC3D;1107 1162 11B4; # (밽; 밽; 밽; 밽; 밽; ) HANGUL SYLLABLE BAELT +BC3E;BC3E;1107 1162 11B5;BC3E;1107 1162 11B5; # (밾; 밾; 밾; 밾; 밾; ) HANGUL SYLLABLE BAELP +BC3F;BC3F;1107 1162 11B6;BC3F;1107 1162 11B6; # (밿; 밿; 밿; 밿; 밿; ) HANGUL SYLLABLE BAELH +BC40;BC40;1107 1162 11B7;BC40;1107 1162 11B7; # (뱀; 뱀; 뱀; 뱀; 뱀; ) HANGUL SYLLABLE BAEM +BC41;BC41;1107 1162 11B8;BC41;1107 1162 11B8; # (뱁; 뱁; 뱁; 뱁; 뱁; ) HANGUL SYLLABLE BAEB +BC42;BC42;1107 1162 11B9;BC42;1107 1162 11B9; # (뱂; 뱂; 뱂; 뱂; 뱂; ) HANGUL SYLLABLE BAEBS +BC43;BC43;1107 1162 11BA;BC43;1107 1162 11BA; # (뱃; 뱃; 뱃; 뱃; 뱃; ) HANGUL SYLLABLE BAES +BC44;BC44;1107 1162 11BB;BC44;1107 1162 11BB; # (뱄; 뱄; 뱄; 뱄; 뱄; ) HANGUL SYLLABLE BAESS +BC45;BC45;1107 1162 11BC;BC45;1107 1162 11BC; # (뱅; 뱅; 뱅; 뱅; 뱅; ) HANGUL SYLLABLE BAENG +BC46;BC46;1107 1162 11BD;BC46;1107 1162 11BD; # (뱆; 뱆; 뱆; 뱆; 뱆; ) HANGUL SYLLABLE BAEJ +BC47;BC47;1107 1162 11BE;BC47;1107 1162 11BE; # (뱇; 뱇; 뱇; 뱇; 뱇; ) HANGUL SYLLABLE BAEC +BC48;BC48;1107 1162 11BF;BC48;1107 1162 11BF; # (뱈; 뱈; 뱈; 뱈; 뱈; ) HANGUL SYLLABLE BAEK +BC49;BC49;1107 1162 11C0;BC49;1107 1162 11C0; # (뱉; 뱉; 뱉; 뱉; 뱉; ) HANGUL SYLLABLE BAET +BC4A;BC4A;1107 1162 11C1;BC4A;1107 1162 11C1; # (뱊; 뱊; 뱊; 뱊; 뱊; ) HANGUL SYLLABLE BAEP +BC4B;BC4B;1107 1162 11C2;BC4B;1107 1162 11C2; # (뱋; 뱋; 뱋; 뱋; 뱋; ) HANGUL SYLLABLE BAEH +BC4C;BC4C;1107 1163;BC4C;1107 1163; # (뱌; 뱌; 뱌; 뱌; 뱌; ) HANGUL SYLLABLE BYA +BC4D;BC4D;1107 1163 11A8;BC4D;1107 1163 11A8; # (뱍; 뱍; 뱍; 뱍; 뱍; ) HANGUL SYLLABLE BYAG +BC4E;BC4E;1107 1163 11A9;BC4E;1107 1163 11A9; # (뱎; 뱎; 뱎; 뱎; 뱎; ) HANGUL SYLLABLE BYAGG +BC4F;BC4F;1107 1163 11AA;BC4F;1107 1163 11AA; # (뱏; 뱏; 뱏; 뱏; 뱏; ) HANGUL SYLLABLE BYAGS +BC50;BC50;1107 1163 11AB;BC50;1107 1163 11AB; # (뱐; 뱐; 뱐; 뱐; 뱐; ) HANGUL SYLLABLE BYAN +BC51;BC51;1107 1163 11AC;BC51;1107 1163 11AC; # (뱑; 뱑; 뱑; 뱑; 뱑; ) HANGUL SYLLABLE BYANJ +BC52;BC52;1107 1163 11AD;BC52;1107 1163 11AD; # (뱒; 뱒; 뱒; 뱒; 뱒; ) HANGUL SYLLABLE BYANH +BC53;BC53;1107 1163 11AE;BC53;1107 1163 11AE; # (뱓; 뱓; 뱓; 뱓; 뱓; ) HANGUL SYLLABLE BYAD +BC54;BC54;1107 1163 11AF;BC54;1107 1163 11AF; # (뱔; 뱔; 뱔; 뱔; 뱔; ) HANGUL SYLLABLE BYAL +BC55;BC55;1107 1163 11B0;BC55;1107 1163 11B0; # (뱕; 뱕; 뱕; 뱕; 뱕; ) HANGUL SYLLABLE BYALG +BC56;BC56;1107 1163 11B1;BC56;1107 1163 11B1; # (뱖; 뱖; 뱖; 뱖; 뱖; ) HANGUL SYLLABLE BYALM +BC57;BC57;1107 1163 11B2;BC57;1107 1163 11B2; # (뱗; 뱗; 뱗; 뱗; 뱗; ) HANGUL SYLLABLE BYALB +BC58;BC58;1107 1163 11B3;BC58;1107 1163 11B3; # (뱘; 뱘; 뱘; 뱘; 뱘; ) HANGUL SYLLABLE BYALS +BC59;BC59;1107 1163 11B4;BC59;1107 1163 11B4; # (뱙; 뱙; 뱙; 뱙; 뱙; ) HANGUL SYLLABLE BYALT +BC5A;BC5A;1107 1163 11B5;BC5A;1107 1163 11B5; # (뱚; 뱚; 뱚; 뱚; 뱚; ) HANGUL SYLLABLE BYALP +BC5B;BC5B;1107 1163 11B6;BC5B;1107 1163 11B6; # (뱛; 뱛; 뱛; 뱛; 뱛; ) HANGUL SYLLABLE BYALH +BC5C;BC5C;1107 1163 11B7;BC5C;1107 1163 11B7; # (뱜; 뱜; 뱜; 뱜; 뱜; ) HANGUL SYLLABLE BYAM +BC5D;BC5D;1107 1163 11B8;BC5D;1107 1163 11B8; # (뱝; 뱝; 뱝; 뱝; 뱝; ) HANGUL SYLLABLE BYAB +BC5E;BC5E;1107 1163 11B9;BC5E;1107 1163 11B9; # (뱞; 뱞; 뱞; 뱞; 뱞; ) HANGUL SYLLABLE BYABS +BC5F;BC5F;1107 1163 11BA;BC5F;1107 1163 11BA; # (뱟; 뱟; 뱟; 뱟; 뱟; ) HANGUL SYLLABLE BYAS +BC60;BC60;1107 1163 11BB;BC60;1107 1163 11BB; # (뱠; 뱠; 뱠; 뱠; 뱠; ) HANGUL SYLLABLE BYASS +BC61;BC61;1107 1163 11BC;BC61;1107 1163 11BC; # (뱡; 뱡; 뱡; 뱡; 뱡; ) HANGUL SYLLABLE BYANG +BC62;BC62;1107 1163 11BD;BC62;1107 1163 11BD; # (뱢; 뱢; 뱢; 뱢; 뱢; ) HANGUL SYLLABLE BYAJ +BC63;BC63;1107 1163 11BE;BC63;1107 1163 11BE; # (뱣; 뱣; 뱣; 뱣; 뱣; ) HANGUL SYLLABLE BYAC +BC64;BC64;1107 1163 11BF;BC64;1107 1163 11BF; # (뱤; 뱤; 뱤; 뱤; 뱤; ) HANGUL SYLLABLE BYAK +BC65;BC65;1107 1163 11C0;BC65;1107 1163 11C0; # (뱥; 뱥; 뱥; 뱥; 뱥; ) HANGUL SYLLABLE BYAT +BC66;BC66;1107 1163 11C1;BC66;1107 1163 11C1; # (뱦; 뱦; 뱦; 뱦; 뱦; ) HANGUL SYLLABLE BYAP +BC67;BC67;1107 1163 11C2;BC67;1107 1163 11C2; # (뱧; 뱧; 뱧; 뱧; 뱧; ) HANGUL SYLLABLE BYAH +BC68;BC68;1107 1164;BC68;1107 1164; # (뱨; 뱨; 뱨; 뱨; 뱨; ) HANGUL SYLLABLE BYAE +BC69;BC69;1107 1164 11A8;BC69;1107 1164 11A8; # (뱩; 뱩; 뱩; 뱩; 뱩; ) HANGUL SYLLABLE BYAEG +BC6A;BC6A;1107 1164 11A9;BC6A;1107 1164 11A9; # (뱪; 뱪; 뱪; 뱪; 뱪; ) HANGUL SYLLABLE BYAEGG +BC6B;BC6B;1107 1164 11AA;BC6B;1107 1164 11AA; # (뱫; 뱫; 뱫; 뱫; 뱫; ) HANGUL SYLLABLE BYAEGS +BC6C;BC6C;1107 1164 11AB;BC6C;1107 1164 11AB; # (뱬; 뱬; 뱬; 뱬; 뱬; ) HANGUL SYLLABLE BYAEN +BC6D;BC6D;1107 1164 11AC;BC6D;1107 1164 11AC; # (뱭; 뱭; 뱭; 뱭; 뱭; ) HANGUL SYLLABLE BYAENJ +BC6E;BC6E;1107 1164 11AD;BC6E;1107 1164 11AD; # (뱮; 뱮; 뱮; 뱮; 뱮; ) HANGUL SYLLABLE BYAENH +BC6F;BC6F;1107 1164 11AE;BC6F;1107 1164 11AE; # (뱯; 뱯; 뱯; 뱯; 뱯; ) HANGUL SYLLABLE BYAED +BC70;BC70;1107 1164 11AF;BC70;1107 1164 11AF; # (뱰; 뱰; 뱰; 뱰; 뱰; ) HANGUL SYLLABLE BYAEL +BC71;BC71;1107 1164 11B0;BC71;1107 1164 11B0; # (뱱; 뱱; 뱱; 뱱; 뱱; ) HANGUL SYLLABLE BYAELG +BC72;BC72;1107 1164 11B1;BC72;1107 1164 11B1; # (뱲; 뱲; 뱲; 뱲; 뱲; ) HANGUL SYLLABLE BYAELM +BC73;BC73;1107 1164 11B2;BC73;1107 1164 11B2; # (뱳; 뱳; 뱳; 뱳; 뱳; ) HANGUL SYLLABLE BYAELB +BC74;BC74;1107 1164 11B3;BC74;1107 1164 11B3; # (뱴; 뱴; 뱴; 뱴; 뱴; ) HANGUL SYLLABLE BYAELS +BC75;BC75;1107 1164 11B4;BC75;1107 1164 11B4; # (뱵; 뱵; 뱵; 뱵; 뱵; ) HANGUL SYLLABLE BYAELT +BC76;BC76;1107 1164 11B5;BC76;1107 1164 11B5; # (뱶; 뱶; 뱶; 뱶; 뱶; ) HANGUL SYLLABLE BYAELP +BC77;BC77;1107 1164 11B6;BC77;1107 1164 11B6; # (뱷; 뱷; 뱷; 뱷; 뱷; ) HANGUL SYLLABLE BYAELH +BC78;BC78;1107 1164 11B7;BC78;1107 1164 11B7; # (뱸; 뱸; 뱸; 뱸; 뱸; ) HANGUL SYLLABLE BYAEM +BC79;BC79;1107 1164 11B8;BC79;1107 1164 11B8; # (뱹; 뱹; 뱹; 뱹; 뱹; ) HANGUL SYLLABLE BYAEB +BC7A;BC7A;1107 1164 11B9;BC7A;1107 1164 11B9; # (뱺; 뱺; 뱺; 뱺; 뱺; ) HANGUL SYLLABLE BYAEBS +BC7B;BC7B;1107 1164 11BA;BC7B;1107 1164 11BA; # (뱻; 뱻; 뱻; 뱻; 뱻; ) HANGUL SYLLABLE BYAES +BC7C;BC7C;1107 1164 11BB;BC7C;1107 1164 11BB; # (뱼; 뱼; 뱼; 뱼; 뱼; ) HANGUL SYLLABLE BYAESS +BC7D;BC7D;1107 1164 11BC;BC7D;1107 1164 11BC; # (뱽; 뱽; 뱽; 뱽; 뱽; ) HANGUL SYLLABLE BYAENG +BC7E;BC7E;1107 1164 11BD;BC7E;1107 1164 11BD; # (뱾; 뱾; 뱾; 뱾; 뱾; ) HANGUL SYLLABLE BYAEJ +BC7F;BC7F;1107 1164 11BE;BC7F;1107 1164 11BE; # (뱿; 뱿; 뱿; 뱿; 뱿; ) HANGUL SYLLABLE BYAEC +BC80;BC80;1107 1164 11BF;BC80;1107 1164 11BF; # (벀; 벀; 벀; 벀; 벀; ) HANGUL SYLLABLE BYAEK +BC81;BC81;1107 1164 11C0;BC81;1107 1164 11C0; # (벁; 벁; 벁; 벁; 벁; ) HANGUL SYLLABLE BYAET +BC82;BC82;1107 1164 11C1;BC82;1107 1164 11C1; # (벂; 벂; 벂; 벂; 벂; ) HANGUL SYLLABLE BYAEP +BC83;BC83;1107 1164 11C2;BC83;1107 1164 11C2; # (벃; 벃; 벃; 벃; 벃; ) HANGUL SYLLABLE BYAEH +BC84;BC84;1107 1165;BC84;1107 1165; # (버; 버; 버; 버; 버; ) HANGUL SYLLABLE BEO +BC85;BC85;1107 1165 11A8;BC85;1107 1165 11A8; # (벅; 벅; 벅; 벅; 벅; ) HANGUL SYLLABLE BEOG +BC86;BC86;1107 1165 11A9;BC86;1107 1165 11A9; # (벆; 벆; 벆; 벆; 벆; ) HANGUL SYLLABLE BEOGG +BC87;BC87;1107 1165 11AA;BC87;1107 1165 11AA; # (벇; 벇; 벇; 벇; 벇; ) HANGUL SYLLABLE BEOGS +BC88;BC88;1107 1165 11AB;BC88;1107 1165 11AB; # (번; 번; 번; 번; 번; ) HANGUL SYLLABLE BEON +BC89;BC89;1107 1165 11AC;BC89;1107 1165 11AC; # (벉; 벉; 벉; 벉; 벉; ) HANGUL SYLLABLE BEONJ +BC8A;BC8A;1107 1165 11AD;BC8A;1107 1165 11AD; # (벊; 벊; 벊; 벊; 벊; ) HANGUL SYLLABLE BEONH +BC8B;BC8B;1107 1165 11AE;BC8B;1107 1165 11AE; # (벋; 벋; 벋; 벋; 벋; ) HANGUL SYLLABLE BEOD +BC8C;BC8C;1107 1165 11AF;BC8C;1107 1165 11AF; # (벌; 벌; 벌; 벌; 벌; ) HANGUL SYLLABLE BEOL +BC8D;BC8D;1107 1165 11B0;BC8D;1107 1165 11B0; # (벍; 벍; 벍; 벍; 벍; ) HANGUL SYLLABLE BEOLG +BC8E;BC8E;1107 1165 11B1;BC8E;1107 1165 11B1; # (벎; 벎; 벎; 벎; 벎; ) HANGUL SYLLABLE BEOLM +BC8F;BC8F;1107 1165 11B2;BC8F;1107 1165 11B2; # (벏; 벏; 벏; 벏; 벏; ) HANGUL SYLLABLE BEOLB +BC90;BC90;1107 1165 11B3;BC90;1107 1165 11B3; # (벐; 벐; 벐; 벐; 벐; ) HANGUL SYLLABLE BEOLS +BC91;BC91;1107 1165 11B4;BC91;1107 1165 11B4; # (벑; 벑; 벑; 벑; 벑; ) HANGUL SYLLABLE BEOLT +BC92;BC92;1107 1165 11B5;BC92;1107 1165 11B5; # (벒; 벒; 벒; 벒; 벒; ) HANGUL SYLLABLE BEOLP +BC93;BC93;1107 1165 11B6;BC93;1107 1165 11B6; # (벓; 벓; 벓; 벓; 벓; ) HANGUL SYLLABLE BEOLH +BC94;BC94;1107 1165 11B7;BC94;1107 1165 11B7; # (범; 범; 범; 범; 범; ) HANGUL SYLLABLE BEOM +BC95;BC95;1107 1165 11B8;BC95;1107 1165 11B8; # (법; 법; 법; 법; 법; ) HANGUL SYLLABLE BEOB +BC96;BC96;1107 1165 11B9;BC96;1107 1165 11B9; # (벖; 벖; 벖; 벖; 벖; ) HANGUL SYLLABLE BEOBS +BC97;BC97;1107 1165 11BA;BC97;1107 1165 11BA; # (벗; 벗; 벗; 벗; 벗; ) HANGUL SYLLABLE BEOS +BC98;BC98;1107 1165 11BB;BC98;1107 1165 11BB; # (벘; 벘; 벘; 벘; 벘; ) HANGUL SYLLABLE BEOSS +BC99;BC99;1107 1165 11BC;BC99;1107 1165 11BC; # (벙; 벙; 벙; 벙; 벙; ) HANGUL SYLLABLE BEONG +BC9A;BC9A;1107 1165 11BD;BC9A;1107 1165 11BD; # (벚; 벚; 벚; 벚; 벚; ) HANGUL SYLLABLE BEOJ +BC9B;BC9B;1107 1165 11BE;BC9B;1107 1165 11BE; # (벛; 벛; 벛; 벛; 벛; ) HANGUL SYLLABLE BEOC +BC9C;BC9C;1107 1165 11BF;BC9C;1107 1165 11BF; # (벜; 벜; 벜; 벜; 벜; ) HANGUL SYLLABLE BEOK +BC9D;BC9D;1107 1165 11C0;BC9D;1107 1165 11C0; # (벝; 벝; 벝; 벝; 벝; ) HANGUL SYLLABLE BEOT +BC9E;BC9E;1107 1165 11C1;BC9E;1107 1165 11C1; # (벞; 벞; 벞; 벞; 벞; ) HANGUL SYLLABLE BEOP +BC9F;BC9F;1107 1165 11C2;BC9F;1107 1165 11C2; # (벟; 벟; 벟; 벟; 벟; ) HANGUL SYLLABLE BEOH +BCA0;BCA0;1107 1166;BCA0;1107 1166; # (베; 베; 베; 베; 베; ) HANGUL SYLLABLE BE +BCA1;BCA1;1107 1166 11A8;BCA1;1107 1166 11A8; # (벡; 벡; 벡; 벡; 벡; ) HANGUL SYLLABLE BEG +BCA2;BCA2;1107 1166 11A9;BCA2;1107 1166 11A9; # (벢; 벢; 벢; 벢; 벢; ) HANGUL SYLLABLE BEGG +BCA3;BCA3;1107 1166 11AA;BCA3;1107 1166 11AA; # (벣; 벣; 벣; 벣; 벣; ) HANGUL SYLLABLE BEGS +BCA4;BCA4;1107 1166 11AB;BCA4;1107 1166 11AB; # (벤; 벤; 벤; 벤; 벤; ) HANGUL SYLLABLE BEN +BCA5;BCA5;1107 1166 11AC;BCA5;1107 1166 11AC; # (벥; 벥; 벥; 벥; 벥; ) HANGUL SYLLABLE BENJ +BCA6;BCA6;1107 1166 11AD;BCA6;1107 1166 11AD; # (벦; 벦; 벦; 벦; 벦; ) HANGUL SYLLABLE BENH +BCA7;BCA7;1107 1166 11AE;BCA7;1107 1166 11AE; # (벧; 벧; 벧; 벧; 벧; ) HANGUL SYLLABLE BED +BCA8;BCA8;1107 1166 11AF;BCA8;1107 1166 11AF; # (벨; 벨; 벨; 벨; 벨; ) HANGUL SYLLABLE BEL +BCA9;BCA9;1107 1166 11B0;BCA9;1107 1166 11B0; # (벩; 벩; 벩; 벩; 벩; ) HANGUL SYLLABLE BELG +BCAA;BCAA;1107 1166 11B1;BCAA;1107 1166 11B1; # (벪; 벪; 벪; 벪; 벪; ) HANGUL SYLLABLE BELM +BCAB;BCAB;1107 1166 11B2;BCAB;1107 1166 11B2; # (벫; 벫; 벫; 벫; 벫; ) HANGUL SYLLABLE BELB +BCAC;BCAC;1107 1166 11B3;BCAC;1107 1166 11B3; # (벬; 벬; 벬; 벬; 벬; ) HANGUL SYLLABLE BELS +BCAD;BCAD;1107 1166 11B4;BCAD;1107 1166 11B4; # (벭; 벭; 벭; 벭; 벭; ) HANGUL SYLLABLE BELT +BCAE;BCAE;1107 1166 11B5;BCAE;1107 1166 11B5; # (벮; 벮; 벮; 벮; 벮; ) HANGUL SYLLABLE BELP +BCAF;BCAF;1107 1166 11B6;BCAF;1107 1166 11B6; # (벯; 벯; 벯; 벯; 벯; ) HANGUL SYLLABLE BELH +BCB0;BCB0;1107 1166 11B7;BCB0;1107 1166 11B7; # (벰; 벰; 벰; 벰; 벰; ) HANGUL SYLLABLE BEM +BCB1;BCB1;1107 1166 11B8;BCB1;1107 1166 11B8; # (벱; 벱; 벱; 벱; 벱; ) HANGUL SYLLABLE BEB +BCB2;BCB2;1107 1166 11B9;BCB2;1107 1166 11B9; # (벲; 벲; 벲; 벲; 벲; ) HANGUL SYLLABLE BEBS +BCB3;BCB3;1107 1166 11BA;BCB3;1107 1166 11BA; # (벳; 벳; 벳; 벳; 벳; ) HANGUL SYLLABLE BES +BCB4;BCB4;1107 1166 11BB;BCB4;1107 1166 11BB; # (벴; 벴; 벴; 벴; 벴; ) HANGUL SYLLABLE BESS +BCB5;BCB5;1107 1166 11BC;BCB5;1107 1166 11BC; # (벵; 벵; 벵; 벵; 벵; ) HANGUL SYLLABLE BENG +BCB6;BCB6;1107 1166 11BD;BCB6;1107 1166 11BD; # (벶; 벶; 벶; 벶; 벶; ) HANGUL SYLLABLE BEJ +BCB7;BCB7;1107 1166 11BE;BCB7;1107 1166 11BE; # (벷; 벷; 벷; 벷; 벷; ) HANGUL SYLLABLE BEC +BCB8;BCB8;1107 1166 11BF;BCB8;1107 1166 11BF; # (벸; 벸; 벸; 벸; 벸; ) HANGUL SYLLABLE BEK +BCB9;BCB9;1107 1166 11C0;BCB9;1107 1166 11C0; # (벹; 벹; 벹; 벹; 벹; ) HANGUL SYLLABLE BET +BCBA;BCBA;1107 1166 11C1;BCBA;1107 1166 11C1; # (벺; 벺; 벺; 벺; 벺; ) HANGUL SYLLABLE BEP +BCBB;BCBB;1107 1166 11C2;BCBB;1107 1166 11C2; # (벻; 벻; 벻; 벻; 벻; ) HANGUL SYLLABLE BEH +BCBC;BCBC;1107 1167;BCBC;1107 1167; # (벼; 벼; 벼; 벼; 벼; ) HANGUL SYLLABLE BYEO +BCBD;BCBD;1107 1167 11A8;BCBD;1107 1167 11A8; # (벽; 벽; 벽; 벽; 벽; ) HANGUL SYLLABLE BYEOG +BCBE;BCBE;1107 1167 11A9;BCBE;1107 1167 11A9; # (벾; 벾; 벾; 벾; 벾; ) HANGUL SYLLABLE BYEOGG +BCBF;BCBF;1107 1167 11AA;BCBF;1107 1167 11AA; # (벿; 벿; 벿; 벿; 벿; ) HANGUL SYLLABLE BYEOGS +BCC0;BCC0;1107 1167 11AB;BCC0;1107 1167 11AB; # (변; 변; 변; 변; 변; ) HANGUL SYLLABLE BYEON +BCC1;BCC1;1107 1167 11AC;BCC1;1107 1167 11AC; # (볁; 볁; 볁; 볁; 볁; ) HANGUL SYLLABLE BYEONJ +BCC2;BCC2;1107 1167 11AD;BCC2;1107 1167 11AD; # (볂; 볂; 볂; 볂; 볂; ) HANGUL SYLLABLE BYEONH +BCC3;BCC3;1107 1167 11AE;BCC3;1107 1167 11AE; # (볃; 볃; 볃; 볃; 볃; ) HANGUL SYLLABLE BYEOD +BCC4;BCC4;1107 1167 11AF;BCC4;1107 1167 11AF; # (별; 별; 별; 별; 별; ) HANGUL SYLLABLE BYEOL +BCC5;BCC5;1107 1167 11B0;BCC5;1107 1167 11B0; # (볅; 볅; 볅; 볅; 볅; ) HANGUL SYLLABLE BYEOLG +BCC6;BCC6;1107 1167 11B1;BCC6;1107 1167 11B1; # (볆; 볆; 볆; 볆; 볆; ) HANGUL SYLLABLE BYEOLM +BCC7;BCC7;1107 1167 11B2;BCC7;1107 1167 11B2; # (볇; 볇; 볇; 볇; 볇; ) HANGUL SYLLABLE BYEOLB +BCC8;BCC8;1107 1167 11B3;BCC8;1107 1167 11B3; # (볈; 볈; 볈; 볈; 볈; ) HANGUL SYLLABLE BYEOLS +BCC9;BCC9;1107 1167 11B4;BCC9;1107 1167 11B4; # (볉; 볉; 볉; 볉; 볉; ) HANGUL SYLLABLE BYEOLT +BCCA;BCCA;1107 1167 11B5;BCCA;1107 1167 11B5; # (볊; 볊; 볊; 볊; 볊; ) HANGUL SYLLABLE BYEOLP +BCCB;BCCB;1107 1167 11B6;BCCB;1107 1167 11B6; # (볋; 볋; 볋; 볋; 볋; ) HANGUL SYLLABLE BYEOLH +BCCC;BCCC;1107 1167 11B7;BCCC;1107 1167 11B7; # (볌; 볌; 볌; 볌; 볌; ) HANGUL SYLLABLE BYEOM +BCCD;BCCD;1107 1167 11B8;BCCD;1107 1167 11B8; # (볍; 볍; 볍; 볍; 볍; ) HANGUL SYLLABLE BYEOB +BCCE;BCCE;1107 1167 11B9;BCCE;1107 1167 11B9; # (볎; 볎; 볎; 볎; 볎; ) HANGUL SYLLABLE BYEOBS +BCCF;BCCF;1107 1167 11BA;BCCF;1107 1167 11BA; # (볏; 볏; 볏; 볏; 볏; ) HANGUL SYLLABLE BYEOS +BCD0;BCD0;1107 1167 11BB;BCD0;1107 1167 11BB; # (볐; 볐; 볐; 볐; 볐; ) HANGUL SYLLABLE BYEOSS +BCD1;BCD1;1107 1167 11BC;BCD1;1107 1167 11BC; # (병; 병; 병; 병; 병; ) HANGUL SYLLABLE BYEONG +BCD2;BCD2;1107 1167 11BD;BCD2;1107 1167 11BD; # (볒; 볒; 볒; 볒; 볒; ) HANGUL SYLLABLE BYEOJ +BCD3;BCD3;1107 1167 11BE;BCD3;1107 1167 11BE; # (볓; 볓; 볓; 볓; 볓; ) HANGUL SYLLABLE BYEOC +BCD4;BCD4;1107 1167 11BF;BCD4;1107 1167 11BF; # (볔; 볔; 볔; 볔; 볔; ) HANGUL SYLLABLE BYEOK +BCD5;BCD5;1107 1167 11C0;BCD5;1107 1167 11C0; # (볕; 볕; 볕; 볕; 볕; ) HANGUL SYLLABLE BYEOT +BCD6;BCD6;1107 1167 11C1;BCD6;1107 1167 11C1; # (볖; 볖; 볖; 볖; 볖; ) HANGUL SYLLABLE BYEOP +BCD7;BCD7;1107 1167 11C2;BCD7;1107 1167 11C2; # (볗; 볗; 볗; 볗; 볗; ) HANGUL SYLLABLE BYEOH +BCD8;BCD8;1107 1168;BCD8;1107 1168; # (볘; 볘; 볘; 볘; 볘; ) HANGUL SYLLABLE BYE +BCD9;BCD9;1107 1168 11A8;BCD9;1107 1168 11A8; # (볙; 볙; 볙; 볙; 볙; ) HANGUL SYLLABLE BYEG +BCDA;BCDA;1107 1168 11A9;BCDA;1107 1168 11A9; # (볚; 볚; 볚; 볚; 볚; ) HANGUL SYLLABLE BYEGG +BCDB;BCDB;1107 1168 11AA;BCDB;1107 1168 11AA; # (볛; 볛; 볛; 볛; 볛; ) HANGUL SYLLABLE BYEGS +BCDC;BCDC;1107 1168 11AB;BCDC;1107 1168 11AB; # (볜; 볜; 볜; 볜; 볜; ) HANGUL SYLLABLE BYEN +BCDD;BCDD;1107 1168 11AC;BCDD;1107 1168 11AC; # (볝; 볝; 볝; 볝; 볝; ) HANGUL SYLLABLE BYENJ +BCDE;BCDE;1107 1168 11AD;BCDE;1107 1168 11AD; # (볞; 볞; 볞; 볞; 볞; ) HANGUL SYLLABLE BYENH +BCDF;BCDF;1107 1168 11AE;BCDF;1107 1168 11AE; # (볟; 볟; 볟; 볟; 볟; ) HANGUL SYLLABLE BYED +BCE0;BCE0;1107 1168 11AF;BCE0;1107 1168 11AF; # (볠; 볠; 볠; 볠; 볠; ) HANGUL SYLLABLE BYEL +BCE1;BCE1;1107 1168 11B0;BCE1;1107 1168 11B0; # (볡; 볡; 볡; 볡; 볡; ) HANGUL SYLLABLE BYELG +BCE2;BCE2;1107 1168 11B1;BCE2;1107 1168 11B1; # (볢; 볢; 볢; 볢; 볢; ) HANGUL SYLLABLE BYELM +BCE3;BCE3;1107 1168 11B2;BCE3;1107 1168 11B2; # (볣; 볣; 볣; 볣; 볣; ) HANGUL SYLLABLE BYELB +BCE4;BCE4;1107 1168 11B3;BCE4;1107 1168 11B3; # (볤; 볤; 볤; 볤; 볤; ) HANGUL SYLLABLE BYELS +BCE5;BCE5;1107 1168 11B4;BCE5;1107 1168 11B4; # (볥; 볥; 볥; 볥; 볥; ) HANGUL SYLLABLE BYELT +BCE6;BCE6;1107 1168 11B5;BCE6;1107 1168 11B5; # (볦; 볦; 볦; 볦; 볦; ) HANGUL SYLLABLE BYELP +BCE7;BCE7;1107 1168 11B6;BCE7;1107 1168 11B6; # (볧; 볧; 볧; 볧; 볧; ) HANGUL SYLLABLE BYELH +BCE8;BCE8;1107 1168 11B7;BCE8;1107 1168 11B7; # (볨; 볨; 볨; 볨; 볨; ) HANGUL SYLLABLE BYEM +BCE9;BCE9;1107 1168 11B8;BCE9;1107 1168 11B8; # (볩; 볩; 볩; 볩; 볩; ) HANGUL SYLLABLE BYEB +BCEA;BCEA;1107 1168 11B9;BCEA;1107 1168 11B9; # (볪; 볪; 볪; 볪; 볪; ) HANGUL SYLLABLE BYEBS +BCEB;BCEB;1107 1168 11BA;BCEB;1107 1168 11BA; # (볫; 볫; 볫; 볫; 볫; ) HANGUL SYLLABLE BYES +BCEC;BCEC;1107 1168 11BB;BCEC;1107 1168 11BB; # (볬; 볬; 볬; 볬; 볬; ) HANGUL SYLLABLE BYESS +BCED;BCED;1107 1168 11BC;BCED;1107 1168 11BC; # (볭; 볭; 볭; 볭; 볭; ) HANGUL SYLLABLE BYENG +BCEE;BCEE;1107 1168 11BD;BCEE;1107 1168 11BD; # (볮; 볮; 볮; 볮; 볮; ) HANGUL SYLLABLE BYEJ +BCEF;BCEF;1107 1168 11BE;BCEF;1107 1168 11BE; # (볯; 볯; 볯; 볯; 볯; ) HANGUL SYLLABLE BYEC +BCF0;BCF0;1107 1168 11BF;BCF0;1107 1168 11BF; # (볰; 볰; 볰; 볰; 볰; ) HANGUL SYLLABLE BYEK +BCF1;BCF1;1107 1168 11C0;BCF1;1107 1168 11C0; # (볱; 볱; 볱; 볱; 볱; ) HANGUL SYLLABLE BYET +BCF2;BCF2;1107 1168 11C1;BCF2;1107 1168 11C1; # (볲; 볲; 볲; 볲; 볲; ) HANGUL SYLLABLE BYEP +BCF3;BCF3;1107 1168 11C2;BCF3;1107 1168 11C2; # (볳; 볳; 볳; 볳; 볳; ) HANGUL SYLLABLE BYEH +BCF4;BCF4;1107 1169;BCF4;1107 1169; # (보; 보; 보; 보; 보; ) HANGUL SYLLABLE BO +BCF5;BCF5;1107 1169 11A8;BCF5;1107 1169 11A8; # (복; 복; 복; 복; 복; ) HANGUL SYLLABLE BOG +BCF6;BCF6;1107 1169 11A9;BCF6;1107 1169 11A9; # (볶; 볶; 볶; 볶; 볶; ) HANGUL SYLLABLE BOGG +BCF7;BCF7;1107 1169 11AA;BCF7;1107 1169 11AA; # (볷; 볷; 볷; 볷; 볷; ) HANGUL SYLLABLE BOGS +BCF8;BCF8;1107 1169 11AB;BCF8;1107 1169 11AB; # (본; 본; 본; 본; 본; ) HANGUL SYLLABLE BON +BCF9;BCF9;1107 1169 11AC;BCF9;1107 1169 11AC; # (볹; 볹; 볹; 볹; 볹; ) HANGUL SYLLABLE BONJ +BCFA;BCFA;1107 1169 11AD;BCFA;1107 1169 11AD; # (볺; 볺; 볺; 볺; 볺; ) HANGUL SYLLABLE BONH +BCFB;BCFB;1107 1169 11AE;BCFB;1107 1169 11AE; # (볻; 볻; 볻; 볻; 볻; ) HANGUL SYLLABLE BOD +BCFC;BCFC;1107 1169 11AF;BCFC;1107 1169 11AF; # (볼; 볼; 볼; 볼; 볼; ) HANGUL SYLLABLE BOL +BCFD;BCFD;1107 1169 11B0;BCFD;1107 1169 11B0; # (볽; 볽; 볽; 볽; 볽; ) HANGUL SYLLABLE BOLG +BCFE;BCFE;1107 1169 11B1;BCFE;1107 1169 11B1; # (볾; 볾; 볾; 볾; 볾; ) HANGUL SYLLABLE BOLM +BCFF;BCFF;1107 1169 11B2;BCFF;1107 1169 11B2; # (볿; 볿; 볿; 볿; 볿; ) HANGUL SYLLABLE BOLB +BD00;BD00;1107 1169 11B3;BD00;1107 1169 11B3; # (봀; 봀; 봀; 봀; 봀; ) HANGUL SYLLABLE BOLS +BD01;BD01;1107 1169 11B4;BD01;1107 1169 11B4; # (봁; 봁; 봁; 봁; 봁; ) HANGUL SYLLABLE BOLT +BD02;BD02;1107 1169 11B5;BD02;1107 1169 11B5; # (봂; 봂; 봂; 봂; 봂; ) HANGUL SYLLABLE BOLP +BD03;BD03;1107 1169 11B6;BD03;1107 1169 11B6; # (봃; 봃; 봃; 봃; 봃; ) HANGUL SYLLABLE BOLH +BD04;BD04;1107 1169 11B7;BD04;1107 1169 11B7; # (봄; 봄; 봄; 봄; 봄; ) HANGUL SYLLABLE BOM +BD05;BD05;1107 1169 11B8;BD05;1107 1169 11B8; # (봅; 봅; 봅; 봅; 봅; ) HANGUL SYLLABLE BOB +BD06;BD06;1107 1169 11B9;BD06;1107 1169 11B9; # (봆; 봆; 봆; 봆; 봆; ) HANGUL SYLLABLE BOBS +BD07;BD07;1107 1169 11BA;BD07;1107 1169 11BA; # (봇; 봇; 봇; 봇; 봇; ) HANGUL SYLLABLE BOS +BD08;BD08;1107 1169 11BB;BD08;1107 1169 11BB; # (봈; 봈; 봈; 봈; 봈; ) HANGUL SYLLABLE BOSS +BD09;BD09;1107 1169 11BC;BD09;1107 1169 11BC; # (봉; 봉; 봉; 봉; 봉; ) HANGUL SYLLABLE BONG +BD0A;BD0A;1107 1169 11BD;BD0A;1107 1169 11BD; # (봊; 봊; 봊; 봊; 봊; ) HANGUL SYLLABLE BOJ +BD0B;BD0B;1107 1169 11BE;BD0B;1107 1169 11BE; # (봋; 봋; 봋; 봋; 봋; ) HANGUL SYLLABLE BOC +BD0C;BD0C;1107 1169 11BF;BD0C;1107 1169 11BF; # (봌; 봌; 봌; 봌; 봌; ) HANGUL SYLLABLE BOK +BD0D;BD0D;1107 1169 11C0;BD0D;1107 1169 11C0; # (봍; 봍; 봍; 봍; 봍; ) HANGUL SYLLABLE BOT +BD0E;BD0E;1107 1169 11C1;BD0E;1107 1169 11C1; # (봎; 봎; 봎; 봎; 봎; ) HANGUL SYLLABLE BOP +BD0F;BD0F;1107 1169 11C2;BD0F;1107 1169 11C2; # (봏; 봏; 봏; 봏; 봏; ) HANGUL SYLLABLE BOH +BD10;BD10;1107 116A;BD10;1107 116A; # (봐; 봐; 봐; 봐; 봐; ) HANGUL SYLLABLE BWA +BD11;BD11;1107 116A 11A8;BD11;1107 116A 11A8; # (봑; 봑; 봑; 봑; 봑; ) HANGUL SYLLABLE BWAG +BD12;BD12;1107 116A 11A9;BD12;1107 116A 11A9; # (봒; 봒; 봒; 봒; 봒; ) HANGUL SYLLABLE BWAGG +BD13;BD13;1107 116A 11AA;BD13;1107 116A 11AA; # (봓; 봓; 봓; 봓; 봓; ) HANGUL SYLLABLE BWAGS +BD14;BD14;1107 116A 11AB;BD14;1107 116A 11AB; # (봔; 봔; 봔; 봔; 봔; ) HANGUL SYLLABLE BWAN +BD15;BD15;1107 116A 11AC;BD15;1107 116A 11AC; # (봕; 봕; 봕; 봕; 봕; ) HANGUL SYLLABLE BWANJ +BD16;BD16;1107 116A 11AD;BD16;1107 116A 11AD; # (봖; 봖; 봖; 봖; 봖; ) HANGUL SYLLABLE BWANH +BD17;BD17;1107 116A 11AE;BD17;1107 116A 11AE; # (봗; 봗; 봗; 봗; 봗; ) HANGUL SYLLABLE BWAD +BD18;BD18;1107 116A 11AF;BD18;1107 116A 11AF; # (봘; 봘; 봘; 봘; 봘; ) HANGUL SYLLABLE BWAL +BD19;BD19;1107 116A 11B0;BD19;1107 116A 11B0; # (봙; 봙; 봙; 봙; 봙; ) HANGUL SYLLABLE BWALG +BD1A;BD1A;1107 116A 11B1;BD1A;1107 116A 11B1; # (봚; 봚; 봚; 봚; 봚; ) HANGUL SYLLABLE BWALM +BD1B;BD1B;1107 116A 11B2;BD1B;1107 116A 11B2; # (봛; 봛; 봛; 봛; 봛; ) HANGUL SYLLABLE BWALB +BD1C;BD1C;1107 116A 11B3;BD1C;1107 116A 11B3; # (봜; 봜; 봜; 봜; 봜; ) HANGUL SYLLABLE BWALS +BD1D;BD1D;1107 116A 11B4;BD1D;1107 116A 11B4; # (봝; 봝; 봝; 봝; 봝; ) HANGUL SYLLABLE BWALT +BD1E;BD1E;1107 116A 11B5;BD1E;1107 116A 11B5; # (봞; 봞; 봞; 봞; 봞; ) HANGUL SYLLABLE BWALP +BD1F;BD1F;1107 116A 11B6;BD1F;1107 116A 11B6; # (봟; 봟; 봟; 봟; 봟; ) HANGUL SYLLABLE BWALH +BD20;BD20;1107 116A 11B7;BD20;1107 116A 11B7; # (봠; 봠; 봠; 봠; 봠; ) HANGUL SYLLABLE BWAM +BD21;BD21;1107 116A 11B8;BD21;1107 116A 11B8; # (봡; 봡; 봡; 봡; 봡; ) HANGUL SYLLABLE BWAB +BD22;BD22;1107 116A 11B9;BD22;1107 116A 11B9; # (봢; 봢; 봢; 봢; 봢; ) HANGUL SYLLABLE BWABS +BD23;BD23;1107 116A 11BA;BD23;1107 116A 11BA; # (봣; 봣; 봣; 봣; 봣; ) HANGUL SYLLABLE BWAS +BD24;BD24;1107 116A 11BB;BD24;1107 116A 11BB; # (봤; 봤; 봤; 봤; 봤; ) HANGUL SYLLABLE BWASS +BD25;BD25;1107 116A 11BC;BD25;1107 116A 11BC; # (봥; 봥; 봥; 봥; 봥; ) HANGUL SYLLABLE BWANG +BD26;BD26;1107 116A 11BD;BD26;1107 116A 11BD; # (봦; 봦; 봦; 봦; 봦; ) HANGUL SYLLABLE BWAJ +BD27;BD27;1107 116A 11BE;BD27;1107 116A 11BE; # (봧; 봧; 봧; 봧; 봧; ) HANGUL SYLLABLE BWAC +BD28;BD28;1107 116A 11BF;BD28;1107 116A 11BF; # (봨; 봨; 봨; 봨; 봨; ) HANGUL SYLLABLE BWAK +BD29;BD29;1107 116A 11C0;BD29;1107 116A 11C0; # (봩; 봩; 봩; 봩; 봩; ) HANGUL SYLLABLE BWAT +BD2A;BD2A;1107 116A 11C1;BD2A;1107 116A 11C1; # (봪; 봪; 봪; 봪; 봪; ) HANGUL SYLLABLE BWAP +BD2B;BD2B;1107 116A 11C2;BD2B;1107 116A 11C2; # (봫; 봫; 봫; 봫; 봫; ) HANGUL SYLLABLE BWAH +BD2C;BD2C;1107 116B;BD2C;1107 116B; # (봬; 봬; 봬; 봬; 봬; ) HANGUL SYLLABLE BWAE +BD2D;BD2D;1107 116B 11A8;BD2D;1107 116B 11A8; # (봭; 봭; 봭; 봭; 봭; ) HANGUL SYLLABLE BWAEG +BD2E;BD2E;1107 116B 11A9;BD2E;1107 116B 11A9; # (봮; 봮; 봮; 봮; 봮; ) HANGUL SYLLABLE BWAEGG +BD2F;BD2F;1107 116B 11AA;BD2F;1107 116B 11AA; # (봯; 봯; 봯; 봯; 봯; ) HANGUL SYLLABLE BWAEGS +BD30;BD30;1107 116B 11AB;BD30;1107 116B 11AB; # (봰; 봰; 봰; 봰; 봰; ) HANGUL SYLLABLE BWAEN +BD31;BD31;1107 116B 11AC;BD31;1107 116B 11AC; # (봱; 봱; 봱; 봱; 봱; ) HANGUL SYLLABLE BWAENJ +BD32;BD32;1107 116B 11AD;BD32;1107 116B 11AD; # (봲; 봲; 봲; 봲; 봲; ) HANGUL SYLLABLE BWAENH +BD33;BD33;1107 116B 11AE;BD33;1107 116B 11AE; # (봳; 봳; 봳; 봳; 봳; ) HANGUL SYLLABLE BWAED +BD34;BD34;1107 116B 11AF;BD34;1107 116B 11AF; # (봴; 봴; 봴; 봴; 봴; ) HANGUL SYLLABLE BWAEL +BD35;BD35;1107 116B 11B0;BD35;1107 116B 11B0; # (봵; 봵; 봵; 봵; 봵; ) HANGUL SYLLABLE BWAELG +BD36;BD36;1107 116B 11B1;BD36;1107 116B 11B1; # (봶; 봶; 봶; 봶; 봶; ) HANGUL SYLLABLE BWAELM +BD37;BD37;1107 116B 11B2;BD37;1107 116B 11B2; # (봷; 봷; 봷; 봷; 봷; ) HANGUL SYLLABLE BWAELB +BD38;BD38;1107 116B 11B3;BD38;1107 116B 11B3; # (봸; 봸; 봸; 봸; 봸; ) HANGUL SYLLABLE BWAELS +BD39;BD39;1107 116B 11B4;BD39;1107 116B 11B4; # (봹; 봹; 봹; 봹; 봹; ) HANGUL SYLLABLE BWAELT +BD3A;BD3A;1107 116B 11B5;BD3A;1107 116B 11B5; # (봺; 봺; 봺; 봺; 봺; ) HANGUL SYLLABLE BWAELP +BD3B;BD3B;1107 116B 11B6;BD3B;1107 116B 11B6; # (봻; 봻; 봻; 봻; 봻; ) HANGUL SYLLABLE BWAELH +BD3C;BD3C;1107 116B 11B7;BD3C;1107 116B 11B7; # (봼; 봼; 봼; 봼; 봼; ) HANGUL SYLLABLE BWAEM +BD3D;BD3D;1107 116B 11B8;BD3D;1107 116B 11B8; # (봽; 봽; 봽; 봽; 봽; ) HANGUL SYLLABLE BWAEB +BD3E;BD3E;1107 116B 11B9;BD3E;1107 116B 11B9; # (봾; 봾; 봾; 봾; 봾; ) HANGUL SYLLABLE BWAEBS +BD3F;BD3F;1107 116B 11BA;BD3F;1107 116B 11BA; # (봿; 봿; 봿; 봿; 봿; ) HANGUL SYLLABLE BWAES +BD40;BD40;1107 116B 11BB;BD40;1107 116B 11BB; # (뵀; 뵀; 뵀; 뵀; 뵀; ) HANGUL SYLLABLE BWAESS +BD41;BD41;1107 116B 11BC;BD41;1107 116B 11BC; # (뵁; 뵁; 뵁; 뵁; 뵁; ) HANGUL SYLLABLE BWAENG +BD42;BD42;1107 116B 11BD;BD42;1107 116B 11BD; # (뵂; 뵂; 뵂; 뵂; 뵂; ) HANGUL SYLLABLE BWAEJ +BD43;BD43;1107 116B 11BE;BD43;1107 116B 11BE; # (뵃; 뵃; 뵃; 뵃; 뵃; ) HANGUL SYLLABLE BWAEC +BD44;BD44;1107 116B 11BF;BD44;1107 116B 11BF; # (뵄; 뵄; 뵄; 뵄; 뵄; ) HANGUL SYLLABLE BWAEK +BD45;BD45;1107 116B 11C0;BD45;1107 116B 11C0; # (뵅; 뵅; 뵅; 뵅; 뵅; ) HANGUL SYLLABLE BWAET +BD46;BD46;1107 116B 11C1;BD46;1107 116B 11C1; # (뵆; 뵆; 뵆; 뵆; 뵆; ) HANGUL SYLLABLE BWAEP +BD47;BD47;1107 116B 11C2;BD47;1107 116B 11C2; # (뵇; 뵇; 뵇; 뵇; 뵇; ) HANGUL SYLLABLE BWAEH +BD48;BD48;1107 116C;BD48;1107 116C; # (뵈; 뵈; 뵈; 뵈; 뵈; ) HANGUL SYLLABLE BOE +BD49;BD49;1107 116C 11A8;BD49;1107 116C 11A8; # (뵉; 뵉; 뵉; 뵉; 뵉; ) HANGUL SYLLABLE BOEG +BD4A;BD4A;1107 116C 11A9;BD4A;1107 116C 11A9; # (뵊; 뵊; 뵊; 뵊; 뵊; ) HANGUL SYLLABLE BOEGG +BD4B;BD4B;1107 116C 11AA;BD4B;1107 116C 11AA; # (뵋; 뵋; 뵋; 뵋; 뵋; ) HANGUL SYLLABLE BOEGS +BD4C;BD4C;1107 116C 11AB;BD4C;1107 116C 11AB; # (뵌; 뵌; 뵌; 뵌; 뵌; ) HANGUL SYLLABLE BOEN +BD4D;BD4D;1107 116C 11AC;BD4D;1107 116C 11AC; # (뵍; 뵍; 뵍; 뵍; 뵍; ) HANGUL SYLLABLE BOENJ +BD4E;BD4E;1107 116C 11AD;BD4E;1107 116C 11AD; # (뵎; 뵎; 뵎; 뵎; 뵎; ) HANGUL SYLLABLE BOENH +BD4F;BD4F;1107 116C 11AE;BD4F;1107 116C 11AE; # (뵏; 뵏; 뵏; 뵏; 뵏; ) HANGUL SYLLABLE BOED +BD50;BD50;1107 116C 11AF;BD50;1107 116C 11AF; # (뵐; 뵐; 뵐; 뵐; 뵐; ) HANGUL SYLLABLE BOEL +BD51;BD51;1107 116C 11B0;BD51;1107 116C 11B0; # (뵑; 뵑; 뵑; 뵑; 뵑; ) HANGUL SYLLABLE BOELG +BD52;BD52;1107 116C 11B1;BD52;1107 116C 11B1; # (뵒; 뵒; 뵒; 뵒; 뵒; ) HANGUL SYLLABLE BOELM +BD53;BD53;1107 116C 11B2;BD53;1107 116C 11B2; # (뵓; 뵓; 뵓; 뵓; 뵓; ) HANGUL SYLLABLE BOELB +BD54;BD54;1107 116C 11B3;BD54;1107 116C 11B3; # (뵔; 뵔; 뵔; 뵔; 뵔; ) HANGUL SYLLABLE BOELS +BD55;BD55;1107 116C 11B4;BD55;1107 116C 11B4; # (뵕; 뵕; 뵕; 뵕; 뵕; ) HANGUL SYLLABLE BOELT +BD56;BD56;1107 116C 11B5;BD56;1107 116C 11B5; # (뵖; 뵖; 뵖; 뵖; 뵖; ) HANGUL SYLLABLE BOELP +BD57;BD57;1107 116C 11B6;BD57;1107 116C 11B6; # (뵗; 뵗; 뵗; 뵗; 뵗; ) HANGUL SYLLABLE BOELH +BD58;BD58;1107 116C 11B7;BD58;1107 116C 11B7; # (뵘; 뵘; 뵘; 뵘; 뵘; ) HANGUL SYLLABLE BOEM +BD59;BD59;1107 116C 11B8;BD59;1107 116C 11B8; # (뵙; 뵙; 뵙; 뵙; 뵙; ) HANGUL SYLLABLE BOEB +BD5A;BD5A;1107 116C 11B9;BD5A;1107 116C 11B9; # (뵚; 뵚; 뵚; 뵚; 뵚; ) HANGUL SYLLABLE BOEBS +BD5B;BD5B;1107 116C 11BA;BD5B;1107 116C 11BA; # (뵛; 뵛; 뵛; 뵛; 뵛; ) HANGUL SYLLABLE BOES +BD5C;BD5C;1107 116C 11BB;BD5C;1107 116C 11BB; # (뵜; 뵜; 뵜; 뵜; 뵜; ) HANGUL SYLLABLE BOESS +BD5D;BD5D;1107 116C 11BC;BD5D;1107 116C 11BC; # (뵝; 뵝; 뵝; 뵝; 뵝; ) HANGUL SYLLABLE BOENG +BD5E;BD5E;1107 116C 11BD;BD5E;1107 116C 11BD; # (뵞; 뵞; 뵞; 뵞; 뵞; ) HANGUL SYLLABLE BOEJ +BD5F;BD5F;1107 116C 11BE;BD5F;1107 116C 11BE; # (뵟; 뵟; 뵟; 뵟; 뵟; ) HANGUL SYLLABLE BOEC +BD60;BD60;1107 116C 11BF;BD60;1107 116C 11BF; # (뵠; 뵠; 뵠; 뵠; 뵠; ) HANGUL SYLLABLE BOEK +BD61;BD61;1107 116C 11C0;BD61;1107 116C 11C0; # (뵡; 뵡; 뵡; 뵡; 뵡; ) HANGUL SYLLABLE BOET +BD62;BD62;1107 116C 11C1;BD62;1107 116C 11C1; # (뵢; 뵢; 뵢; 뵢; 뵢; ) HANGUL SYLLABLE BOEP +BD63;BD63;1107 116C 11C2;BD63;1107 116C 11C2; # (뵣; 뵣; 뵣; 뵣; 뵣; ) HANGUL SYLLABLE BOEH +BD64;BD64;1107 116D;BD64;1107 116D; # (뵤; 뵤; 뵤; 뵤; 뵤; ) HANGUL SYLLABLE BYO +BD65;BD65;1107 116D 11A8;BD65;1107 116D 11A8; # (뵥; 뵥; 뵥; 뵥; 뵥; ) HANGUL SYLLABLE BYOG +BD66;BD66;1107 116D 11A9;BD66;1107 116D 11A9; # (뵦; 뵦; 뵦; 뵦; 뵦; ) HANGUL SYLLABLE BYOGG +BD67;BD67;1107 116D 11AA;BD67;1107 116D 11AA; # (뵧; 뵧; 뵧; 뵧; 뵧; ) HANGUL SYLLABLE BYOGS +BD68;BD68;1107 116D 11AB;BD68;1107 116D 11AB; # (뵨; 뵨; 뵨; 뵨; 뵨; ) HANGUL SYLLABLE BYON +BD69;BD69;1107 116D 11AC;BD69;1107 116D 11AC; # (뵩; 뵩; 뵩; 뵩; 뵩; ) HANGUL SYLLABLE BYONJ +BD6A;BD6A;1107 116D 11AD;BD6A;1107 116D 11AD; # (뵪; 뵪; 뵪; 뵪; 뵪; ) HANGUL SYLLABLE BYONH +BD6B;BD6B;1107 116D 11AE;BD6B;1107 116D 11AE; # (뵫; 뵫; 뵫; 뵫; 뵫; ) HANGUL SYLLABLE BYOD +BD6C;BD6C;1107 116D 11AF;BD6C;1107 116D 11AF; # (뵬; 뵬; 뵬; 뵬; 뵬; ) HANGUL SYLLABLE BYOL +BD6D;BD6D;1107 116D 11B0;BD6D;1107 116D 11B0; # (뵭; 뵭; 뵭; 뵭; 뵭; ) HANGUL SYLLABLE BYOLG +BD6E;BD6E;1107 116D 11B1;BD6E;1107 116D 11B1; # (뵮; 뵮; 뵮; 뵮; 뵮; ) HANGUL SYLLABLE BYOLM +BD6F;BD6F;1107 116D 11B2;BD6F;1107 116D 11B2; # (뵯; 뵯; 뵯; 뵯; 뵯; ) HANGUL SYLLABLE BYOLB +BD70;BD70;1107 116D 11B3;BD70;1107 116D 11B3; # (뵰; 뵰; 뵰; 뵰; 뵰; ) HANGUL SYLLABLE BYOLS +BD71;BD71;1107 116D 11B4;BD71;1107 116D 11B4; # (뵱; 뵱; 뵱; 뵱; 뵱; ) HANGUL SYLLABLE BYOLT +BD72;BD72;1107 116D 11B5;BD72;1107 116D 11B5; # (뵲; 뵲; 뵲; 뵲; 뵲; ) HANGUL SYLLABLE BYOLP +BD73;BD73;1107 116D 11B6;BD73;1107 116D 11B6; # (뵳; 뵳; 뵳; 뵳; 뵳; ) HANGUL SYLLABLE BYOLH +BD74;BD74;1107 116D 11B7;BD74;1107 116D 11B7; # (뵴; 뵴; 뵴; 뵴; 뵴; ) HANGUL SYLLABLE BYOM +BD75;BD75;1107 116D 11B8;BD75;1107 116D 11B8; # (뵵; 뵵; 뵵; 뵵; 뵵; ) HANGUL SYLLABLE BYOB +BD76;BD76;1107 116D 11B9;BD76;1107 116D 11B9; # (뵶; 뵶; 뵶; 뵶; 뵶; ) HANGUL SYLLABLE BYOBS +BD77;BD77;1107 116D 11BA;BD77;1107 116D 11BA; # (뵷; 뵷; 뵷; 뵷; 뵷; ) HANGUL SYLLABLE BYOS +BD78;BD78;1107 116D 11BB;BD78;1107 116D 11BB; # (뵸; 뵸; 뵸; 뵸; 뵸; ) HANGUL SYLLABLE BYOSS +BD79;BD79;1107 116D 11BC;BD79;1107 116D 11BC; # (뵹; 뵹; 뵹; 뵹; 뵹; ) HANGUL SYLLABLE BYONG +BD7A;BD7A;1107 116D 11BD;BD7A;1107 116D 11BD; # (뵺; 뵺; 뵺; 뵺; 뵺; ) HANGUL SYLLABLE BYOJ +BD7B;BD7B;1107 116D 11BE;BD7B;1107 116D 11BE; # (뵻; 뵻; 뵻; 뵻; 뵻; ) HANGUL SYLLABLE BYOC +BD7C;BD7C;1107 116D 11BF;BD7C;1107 116D 11BF; # (뵼; 뵼; 뵼; 뵼; 뵼; ) HANGUL SYLLABLE BYOK +BD7D;BD7D;1107 116D 11C0;BD7D;1107 116D 11C0; # (뵽; 뵽; 뵽; 뵽; 뵽; ) HANGUL SYLLABLE BYOT +BD7E;BD7E;1107 116D 11C1;BD7E;1107 116D 11C1; # (뵾; 뵾; 뵾; 뵾; 뵾; ) HANGUL SYLLABLE BYOP +BD7F;BD7F;1107 116D 11C2;BD7F;1107 116D 11C2; # (뵿; 뵿; 뵿; 뵿; 뵿; ) HANGUL SYLLABLE BYOH +BD80;BD80;1107 116E;BD80;1107 116E; # (부; 부; 부; 부; 부; ) HANGUL SYLLABLE BU +BD81;BD81;1107 116E 11A8;BD81;1107 116E 11A8; # (북; 북; 북; 북; 북; ) HANGUL SYLLABLE BUG +BD82;BD82;1107 116E 11A9;BD82;1107 116E 11A9; # (붂; 붂; 붂; 붂; 붂; ) HANGUL SYLLABLE BUGG +BD83;BD83;1107 116E 11AA;BD83;1107 116E 11AA; # (붃; 붃; 붃; 붃; 붃; ) HANGUL SYLLABLE BUGS +BD84;BD84;1107 116E 11AB;BD84;1107 116E 11AB; # (분; 분; 분; 분; 분; ) HANGUL SYLLABLE BUN +BD85;BD85;1107 116E 11AC;BD85;1107 116E 11AC; # (붅; 붅; 붅; 붅; 붅; ) HANGUL SYLLABLE BUNJ +BD86;BD86;1107 116E 11AD;BD86;1107 116E 11AD; # (붆; 붆; 붆; 붆; 붆; ) HANGUL SYLLABLE BUNH +BD87;BD87;1107 116E 11AE;BD87;1107 116E 11AE; # (붇; 붇; 붇; 붇; 붇; ) HANGUL SYLLABLE BUD +BD88;BD88;1107 116E 11AF;BD88;1107 116E 11AF; # (불; 불; 불; 불; 불; ) HANGUL SYLLABLE BUL +BD89;BD89;1107 116E 11B0;BD89;1107 116E 11B0; # (붉; 붉; 붉; 붉; 붉; ) HANGUL SYLLABLE BULG +BD8A;BD8A;1107 116E 11B1;BD8A;1107 116E 11B1; # (붊; 붊; 붊; 붊; 붊; ) HANGUL SYLLABLE BULM +BD8B;BD8B;1107 116E 11B2;BD8B;1107 116E 11B2; # (붋; 붋; 붋; 붋; 붋; ) HANGUL SYLLABLE BULB +BD8C;BD8C;1107 116E 11B3;BD8C;1107 116E 11B3; # (붌; 붌; 붌; 붌; 붌; ) HANGUL SYLLABLE BULS +BD8D;BD8D;1107 116E 11B4;BD8D;1107 116E 11B4; # (붍; 붍; 붍; 붍; 붍; ) HANGUL SYLLABLE BULT +BD8E;BD8E;1107 116E 11B5;BD8E;1107 116E 11B5; # (붎; 붎; 붎; 붎; 붎; ) HANGUL SYLLABLE BULP +BD8F;BD8F;1107 116E 11B6;BD8F;1107 116E 11B6; # (붏; 붏; 붏; 붏; 붏; ) HANGUL SYLLABLE BULH +BD90;BD90;1107 116E 11B7;BD90;1107 116E 11B7; # (붐; 붐; 붐; 붐; 붐; ) HANGUL SYLLABLE BUM +BD91;BD91;1107 116E 11B8;BD91;1107 116E 11B8; # (붑; 붑; 붑; 붑; 붑; ) HANGUL SYLLABLE BUB +BD92;BD92;1107 116E 11B9;BD92;1107 116E 11B9; # (붒; 붒; 붒; 붒; 붒; ) HANGUL SYLLABLE BUBS +BD93;BD93;1107 116E 11BA;BD93;1107 116E 11BA; # (붓; 붓; 붓; 붓; 붓; ) HANGUL SYLLABLE BUS +BD94;BD94;1107 116E 11BB;BD94;1107 116E 11BB; # (붔; 붔; 붔; 붔; 붔; ) HANGUL SYLLABLE BUSS +BD95;BD95;1107 116E 11BC;BD95;1107 116E 11BC; # (붕; 붕; 붕; 붕; 붕; ) HANGUL SYLLABLE BUNG +BD96;BD96;1107 116E 11BD;BD96;1107 116E 11BD; # (붖; 붖; 붖; 붖; 붖; ) HANGUL SYLLABLE BUJ +BD97;BD97;1107 116E 11BE;BD97;1107 116E 11BE; # (붗; 붗; 붗; 붗; 붗; ) HANGUL SYLLABLE BUC +BD98;BD98;1107 116E 11BF;BD98;1107 116E 11BF; # (붘; 붘; 붘; 붘; 붘; ) HANGUL SYLLABLE BUK +BD99;BD99;1107 116E 11C0;BD99;1107 116E 11C0; # (붙; 붙; 붙; 붙; 붙; ) HANGUL SYLLABLE BUT +BD9A;BD9A;1107 116E 11C1;BD9A;1107 116E 11C1; # (붚; 붚; 붚; 붚; 붚; ) HANGUL SYLLABLE BUP +BD9B;BD9B;1107 116E 11C2;BD9B;1107 116E 11C2; # (붛; 붛; 붛; 붛; 붛; ) HANGUL SYLLABLE BUH +BD9C;BD9C;1107 116F;BD9C;1107 116F; # (붜; 붜; 붜; 붜; 붜; ) HANGUL SYLLABLE BWEO +BD9D;BD9D;1107 116F 11A8;BD9D;1107 116F 11A8; # (붝; 붝; 붝; 붝; 붝; ) HANGUL SYLLABLE BWEOG +BD9E;BD9E;1107 116F 11A9;BD9E;1107 116F 11A9; # (붞; 붞; 붞; 붞; 붞; ) HANGUL SYLLABLE BWEOGG +BD9F;BD9F;1107 116F 11AA;BD9F;1107 116F 11AA; # (붟; 붟; 붟; 붟; 붟; ) HANGUL SYLLABLE BWEOGS +BDA0;BDA0;1107 116F 11AB;BDA0;1107 116F 11AB; # (붠; 붠; 붠; 붠; 붠; ) HANGUL SYLLABLE BWEON +BDA1;BDA1;1107 116F 11AC;BDA1;1107 116F 11AC; # (붡; 붡; 붡; 붡; 붡; ) HANGUL SYLLABLE BWEONJ +BDA2;BDA2;1107 116F 11AD;BDA2;1107 116F 11AD; # (붢; 붢; 붢; 붢; 붢; ) HANGUL SYLLABLE BWEONH +BDA3;BDA3;1107 116F 11AE;BDA3;1107 116F 11AE; # (붣; 붣; 붣; 붣; 붣; ) HANGUL SYLLABLE BWEOD +BDA4;BDA4;1107 116F 11AF;BDA4;1107 116F 11AF; # (붤; 붤; 붤; 붤; 붤; ) HANGUL SYLLABLE BWEOL +BDA5;BDA5;1107 116F 11B0;BDA5;1107 116F 11B0; # (붥; 붥; 붥; 붥; 붥; ) HANGUL SYLLABLE BWEOLG +BDA6;BDA6;1107 116F 11B1;BDA6;1107 116F 11B1; # (붦; 붦; 붦; 붦; 붦; ) HANGUL SYLLABLE BWEOLM +BDA7;BDA7;1107 116F 11B2;BDA7;1107 116F 11B2; # (붧; 붧; 붧; 붧; 붧; ) HANGUL SYLLABLE BWEOLB +BDA8;BDA8;1107 116F 11B3;BDA8;1107 116F 11B3; # (붨; 붨; 붨; 붨; 붨; ) HANGUL SYLLABLE BWEOLS +BDA9;BDA9;1107 116F 11B4;BDA9;1107 116F 11B4; # (붩; 붩; 붩; 붩; 붩; ) HANGUL SYLLABLE BWEOLT +BDAA;BDAA;1107 116F 11B5;BDAA;1107 116F 11B5; # (붪; 붪; 붪; 붪; 붪; ) HANGUL SYLLABLE BWEOLP +BDAB;BDAB;1107 116F 11B6;BDAB;1107 116F 11B6; # (붫; 붫; 붫; 붫; 붫; ) HANGUL SYLLABLE BWEOLH +BDAC;BDAC;1107 116F 11B7;BDAC;1107 116F 11B7; # (붬; 붬; 붬; 붬; 붬; ) HANGUL SYLLABLE BWEOM +BDAD;BDAD;1107 116F 11B8;BDAD;1107 116F 11B8; # (붭; 붭; 붭; 붭; 붭; ) HANGUL SYLLABLE BWEOB +BDAE;BDAE;1107 116F 11B9;BDAE;1107 116F 11B9; # (붮; 붮; 붮; 붮; 붮; ) HANGUL SYLLABLE BWEOBS +BDAF;BDAF;1107 116F 11BA;BDAF;1107 116F 11BA; # (붯; 붯; 붯; 붯; 붯; ) HANGUL SYLLABLE BWEOS +BDB0;BDB0;1107 116F 11BB;BDB0;1107 116F 11BB; # (붰; 붰; 붰; 붰; 붰; ) HANGUL SYLLABLE BWEOSS +BDB1;BDB1;1107 116F 11BC;BDB1;1107 116F 11BC; # (붱; 붱; 붱; 붱; 붱; ) HANGUL SYLLABLE BWEONG +BDB2;BDB2;1107 116F 11BD;BDB2;1107 116F 11BD; # (붲; 붲; 붲; 붲; 붲; ) HANGUL SYLLABLE BWEOJ +BDB3;BDB3;1107 116F 11BE;BDB3;1107 116F 11BE; # (붳; 붳; 붳; 붳; 붳; ) HANGUL SYLLABLE BWEOC +BDB4;BDB4;1107 116F 11BF;BDB4;1107 116F 11BF; # (붴; 붴; 붴; 붴; 붴; ) HANGUL SYLLABLE BWEOK +BDB5;BDB5;1107 116F 11C0;BDB5;1107 116F 11C0; # (붵; 붵; 붵; 붵; 붵; ) HANGUL SYLLABLE BWEOT +BDB6;BDB6;1107 116F 11C1;BDB6;1107 116F 11C1; # (붶; 붶; 붶; 붶; 붶; ) HANGUL SYLLABLE BWEOP +BDB7;BDB7;1107 116F 11C2;BDB7;1107 116F 11C2; # (붷; 붷; 붷; 붷; 붷; ) HANGUL SYLLABLE BWEOH +BDB8;BDB8;1107 1170;BDB8;1107 1170; # (붸; 붸; 붸; 붸; 붸; ) HANGUL SYLLABLE BWE +BDB9;BDB9;1107 1170 11A8;BDB9;1107 1170 11A8; # (붹; 붹; 붹; 붹; 붹; ) HANGUL SYLLABLE BWEG +BDBA;BDBA;1107 1170 11A9;BDBA;1107 1170 11A9; # (붺; 붺; 붺; 붺; 붺; ) HANGUL SYLLABLE BWEGG +BDBB;BDBB;1107 1170 11AA;BDBB;1107 1170 11AA; # (붻; 붻; 붻; 붻; 붻; ) HANGUL SYLLABLE BWEGS +BDBC;BDBC;1107 1170 11AB;BDBC;1107 1170 11AB; # (붼; 붼; 붼; 붼; 붼; ) HANGUL SYLLABLE BWEN +BDBD;BDBD;1107 1170 11AC;BDBD;1107 1170 11AC; # (붽; 붽; 붽; 붽; 붽; ) HANGUL SYLLABLE BWENJ +BDBE;BDBE;1107 1170 11AD;BDBE;1107 1170 11AD; # (붾; 붾; 붾; 붾; 붾; ) HANGUL SYLLABLE BWENH +BDBF;BDBF;1107 1170 11AE;BDBF;1107 1170 11AE; # (붿; 붿; 붿; 붿; 붿; ) HANGUL SYLLABLE BWED +BDC0;BDC0;1107 1170 11AF;BDC0;1107 1170 11AF; # (뷀; 뷀; 뷀; 뷀; 뷀; ) HANGUL SYLLABLE BWEL +BDC1;BDC1;1107 1170 11B0;BDC1;1107 1170 11B0; # (뷁; 뷁; 뷁; 뷁; 뷁; ) HANGUL SYLLABLE BWELG +BDC2;BDC2;1107 1170 11B1;BDC2;1107 1170 11B1; # (뷂; 뷂; 뷂; 뷂; 뷂; ) HANGUL SYLLABLE BWELM +BDC3;BDC3;1107 1170 11B2;BDC3;1107 1170 11B2; # (뷃; 뷃; 뷃; 뷃; 뷃; ) HANGUL SYLLABLE BWELB +BDC4;BDC4;1107 1170 11B3;BDC4;1107 1170 11B3; # (뷄; 뷄; 뷄; 뷄; 뷄; ) HANGUL SYLLABLE BWELS +BDC5;BDC5;1107 1170 11B4;BDC5;1107 1170 11B4; # (뷅; 뷅; 뷅; 뷅; 뷅; ) HANGUL SYLLABLE BWELT +BDC6;BDC6;1107 1170 11B5;BDC6;1107 1170 11B5; # (뷆; 뷆; 뷆; 뷆; 뷆; ) HANGUL SYLLABLE BWELP +BDC7;BDC7;1107 1170 11B6;BDC7;1107 1170 11B6; # (뷇; 뷇; 뷇; 뷇; 뷇; ) HANGUL SYLLABLE BWELH +BDC8;BDC8;1107 1170 11B7;BDC8;1107 1170 11B7; # (뷈; 뷈; 뷈; 뷈; 뷈; ) HANGUL SYLLABLE BWEM +BDC9;BDC9;1107 1170 11B8;BDC9;1107 1170 11B8; # (뷉; 뷉; 뷉; 뷉; 뷉; ) HANGUL SYLLABLE BWEB +BDCA;BDCA;1107 1170 11B9;BDCA;1107 1170 11B9; # (뷊; 뷊; 뷊; 뷊; 뷊; ) HANGUL SYLLABLE BWEBS +BDCB;BDCB;1107 1170 11BA;BDCB;1107 1170 11BA; # (뷋; 뷋; 뷋; 뷋; 뷋; ) HANGUL SYLLABLE BWES +BDCC;BDCC;1107 1170 11BB;BDCC;1107 1170 11BB; # (뷌; 뷌; 뷌; 뷌; 뷌; ) HANGUL SYLLABLE BWESS +BDCD;BDCD;1107 1170 11BC;BDCD;1107 1170 11BC; # (뷍; 뷍; 뷍; 뷍; 뷍; ) HANGUL SYLLABLE BWENG +BDCE;BDCE;1107 1170 11BD;BDCE;1107 1170 11BD; # (뷎; 뷎; 뷎; 뷎; 뷎; ) HANGUL SYLLABLE BWEJ +BDCF;BDCF;1107 1170 11BE;BDCF;1107 1170 11BE; # (뷏; 뷏; 뷏; 뷏; 뷏; ) HANGUL SYLLABLE BWEC +BDD0;BDD0;1107 1170 11BF;BDD0;1107 1170 11BF; # (뷐; 뷐; 뷐; 뷐; 뷐; ) HANGUL SYLLABLE BWEK +BDD1;BDD1;1107 1170 11C0;BDD1;1107 1170 11C0; # (뷑; 뷑; 뷑; 뷑; 뷑; ) HANGUL SYLLABLE BWET +BDD2;BDD2;1107 1170 11C1;BDD2;1107 1170 11C1; # (뷒; 뷒; 뷒; 뷒; 뷒; ) HANGUL SYLLABLE BWEP +BDD3;BDD3;1107 1170 11C2;BDD3;1107 1170 11C2; # (뷓; 뷓; 뷓; 뷓; 뷓; ) HANGUL SYLLABLE BWEH +BDD4;BDD4;1107 1171;BDD4;1107 1171; # (뷔; 뷔; 뷔; 뷔; 뷔; ) HANGUL SYLLABLE BWI +BDD5;BDD5;1107 1171 11A8;BDD5;1107 1171 11A8; # (뷕; 뷕; 뷕; 뷕; 뷕; ) HANGUL SYLLABLE BWIG +BDD6;BDD6;1107 1171 11A9;BDD6;1107 1171 11A9; # (뷖; 뷖; 뷖; 뷖; 뷖; ) HANGUL SYLLABLE BWIGG +BDD7;BDD7;1107 1171 11AA;BDD7;1107 1171 11AA; # (뷗; 뷗; 뷗; 뷗; 뷗; ) HANGUL SYLLABLE BWIGS +BDD8;BDD8;1107 1171 11AB;BDD8;1107 1171 11AB; # (뷘; 뷘; 뷘; 뷘; 뷘; ) HANGUL SYLLABLE BWIN +BDD9;BDD9;1107 1171 11AC;BDD9;1107 1171 11AC; # (뷙; 뷙; 뷙; 뷙; 뷙; ) HANGUL SYLLABLE BWINJ +BDDA;BDDA;1107 1171 11AD;BDDA;1107 1171 11AD; # (뷚; 뷚; 뷚; 뷚; 뷚; ) HANGUL SYLLABLE BWINH +BDDB;BDDB;1107 1171 11AE;BDDB;1107 1171 11AE; # (뷛; 뷛; 뷛; 뷛; 뷛; ) HANGUL SYLLABLE BWID +BDDC;BDDC;1107 1171 11AF;BDDC;1107 1171 11AF; # (뷜; 뷜; 뷜; 뷜; 뷜; ) HANGUL SYLLABLE BWIL +BDDD;BDDD;1107 1171 11B0;BDDD;1107 1171 11B0; # (뷝; 뷝; 뷝; 뷝; 뷝; ) HANGUL SYLLABLE BWILG +BDDE;BDDE;1107 1171 11B1;BDDE;1107 1171 11B1; # (뷞; 뷞; 뷞; 뷞; 뷞; ) HANGUL SYLLABLE BWILM +BDDF;BDDF;1107 1171 11B2;BDDF;1107 1171 11B2; # (뷟; 뷟; 뷟; 뷟; 뷟; ) HANGUL SYLLABLE BWILB +BDE0;BDE0;1107 1171 11B3;BDE0;1107 1171 11B3; # (뷠; 뷠; 뷠; 뷠; 뷠; ) HANGUL SYLLABLE BWILS +BDE1;BDE1;1107 1171 11B4;BDE1;1107 1171 11B4; # (뷡; 뷡; 뷡; 뷡; 뷡; ) HANGUL SYLLABLE BWILT +BDE2;BDE2;1107 1171 11B5;BDE2;1107 1171 11B5; # (뷢; 뷢; 뷢; 뷢; 뷢; ) HANGUL SYLLABLE BWILP +BDE3;BDE3;1107 1171 11B6;BDE3;1107 1171 11B6; # (뷣; 뷣; 뷣; 뷣; 뷣; ) HANGUL SYLLABLE BWILH +BDE4;BDE4;1107 1171 11B7;BDE4;1107 1171 11B7; # (뷤; 뷤; 뷤; 뷤; 뷤; ) HANGUL SYLLABLE BWIM +BDE5;BDE5;1107 1171 11B8;BDE5;1107 1171 11B8; # (뷥; 뷥; 뷥; 뷥; 뷥; ) HANGUL SYLLABLE BWIB +BDE6;BDE6;1107 1171 11B9;BDE6;1107 1171 11B9; # (뷦; 뷦; 뷦; 뷦; 뷦; ) HANGUL SYLLABLE BWIBS +BDE7;BDE7;1107 1171 11BA;BDE7;1107 1171 11BA; # (뷧; 뷧; 뷧; 뷧; 뷧; ) HANGUL SYLLABLE BWIS +BDE8;BDE8;1107 1171 11BB;BDE8;1107 1171 11BB; # (뷨; 뷨; 뷨; 뷨; 뷨; ) HANGUL SYLLABLE BWISS +BDE9;BDE9;1107 1171 11BC;BDE9;1107 1171 11BC; # (뷩; 뷩; 뷩; 뷩; 뷩; ) HANGUL SYLLABLE BWING +BDEA;BDEA;1107 1171 11BD;BDEA;1107 1171 11BD; # (뷪; 뷪; 뷪; 뷪; 뷪; ) HANGUL SYLLABLE BWIJ +BDEB;BDEB;1107 1171 11BE;BDEB;1107 1171 11BE; # (뷫; 뷫; 뷫; 뷫; 뷫; ) HANGUL SYLLABLE BWIC +BDEC;BDEC;1107 1171 11BF;BDEC;1107 1171 11BF; # (뷬; 뷬; 뷬; 뷬; 뷬; ) HANGUL SYLLABLE BWIK +BDED;BDED;1107 1171 11C0;BDED;1107 1171 11C0; # (뷭; 뷭; 뷭; 뷭; 뷭; ) HANGUL SYLLABLE BWIT +BDEE;BDEE;1107 1171 11C1;BDEE;1107 1171 11C1; # (뷮; 뷮; 뷮; 뷮; 뷮; ) HANGUL SYLLABLE BWIP +BDEF;BDEF;1107 1171 11C2;BDEF;1107 1171 11C2; # (뷯; 뷯; 뷯; 뷯; 뷯; ) HANGUL SYLLABLE BWIH +BDF0;BDF0;1107 1172;BDF0;1107 1172; # (뷰; 뷰; 뷰; 뷰; 뷰; ) HANGUL SYLLABLE BYU +BDF1;BDF1;1107 1172 11A8;BDF1;1107 1172 11A8; # (뷱; 뷱; 뷱; 뷱; 뷱; ) HANGUL SYLLABLE BYUG +BDF2;BDF2;1107 1172 11A9;BDF2;1107 1172 11A9; # (뷲; 뷲; 뷲; 뷲; 뷲; ) HANGUL SYLLABLE BYUGG +BDF3;BDF3;1107 1172 11AA;BDF3;1107 1172 11AA; # (뷳; 뷳; 뷳; 뷳; 뷳; ) HANGUL SYLLABLE BYUGS +BDF4;BDF4;1107 1172 11AB;BDF4;1107 1172 11AB; # (뷴; 뷴; 뷴; 뷴; 뷴; ) HANGUL SYLLABLE BYUN +BDF5;BDF5;1107 1172 11AC;BDF5;1107 1172 11AC; # (뷵; 뷵; 뷵; 뷵; 뷵; ) HANGUL SYLLABLE BYUNJ +BDF6;BDF6;1107 1172 11AD;BDF6;1107 1172 11AD; # (뷶; 뷶; 뷶; 뷶; 뷶; ) HANGUL SYLLABLE BYUNH +BDF7;BDF7;1107 1172 11AE;BDF7;1107 1172 11AE; # (뷷; 뷷; 뷷; 뷷; 뷷; ) HANGUL SYLLABLE BYUD +BDF8;BDF8;1107 1172 11AF;BDF8;1107 1172 11AF; # (뷸; 뷸; 뷸; 뷸; 뷸; ) HANGUL SYLLABLE BYUL +BDF9;BDF9;1107 1172 11B0;BDF9;1107 1172 11B0; # (뷹; 뷹; 뷹; 뷹; 뷹; ) HANGUL SYLLABLE BYULG +BDFA;BDFA;1107 1172 11B1;BDFA;1107 1172 11B1; # (뷺; 뷺; 뷺; 뷺; 뷺; ) HANGUL SYLLABLE BYULM +BDFB;BDFB;1107 1172 11B2;BDFB;1107 1172 11B2; # (뷻; 뷻; 뷻; 뷻; 뷻; ) HANGUL SYLLABLE BYULB +BDFC;BDFC;1107 1172 11B3;BDFC;1107 1172 11B3; # (뷼; 뷼; 뷼; 뷼; 뷼; ) HANGUL SYLLABLE BYULS +BDFD;BDFD;1107 1172 11B4;BDFD;1107 1172 11B4; # (뷽; 뷽; 뷽; 뷽; 뷽; ) HANGUL SYLLABLE BYULT +BDFE;BDFE;1107 1172 11B5;BDFE;1107 1172 11B5; # (뷾; 뷾; 뷾; 뷾; 뷾; ) HANGUL SYLLABLE BYULP +BDFF;BDFF;1107 1172 11B6;BDFF;1107 1172 11B6; # (뷿; 뷿; 뷿; 뷿; 뷿; ) HANGUL SYLLABLE BYULH +BE00;BE00;1107 1172 11B7;BE00;1107 1172 11B7; # (븀; 븀; 븀; 븀; 븀; ) HANGUL SYLLABLE BYUM +BE01;BE01;1107 1172 11B8;BE01;1107 1172 11B8; # (븁; 븁; 븁; 븁; 븁; ) HANGUL SYLLABLE BYUB +BE02;BE02;1107 1172 11B9;BE02;1107 1172 11B9; # (븂; 븂; 븂; 븂; 븂; ) HANGUL SYLLABLE BYUBS +BE03;BE03;1107 1172 11BA;BE03;1107 1172 11BA; # (븃; 븃; 븃; 븃; 븃; ) HANGUL SYLLABLE BYUS +BE04;BE04;1107 1172 11BB;BE04;1107 1172 11BB; # (븄; 븄; 븄; 븄; 븄; ) HANGUL SYLLABLE BYUSS +BE05;BE05;1107 1172 11BC;BE05;1107 1172 11BC; # (븅; 븅; 븅; 븅; 븅; ) HANGUL SYLLABLE BYUNG +BE06;BE06;1107 1172 11BD;BE06;1107 1172 11BD; # (븆; 븆; 븆; 븆; 븆; ) HANGUL SYLLABLE BYUJ +BE07;BE07;1107 1172 11BE;BE07;1107 1172 11BE; # (븇; 븇; 븇; 븇; 븇; ) HANGUL SYLLABLE BYUC +BE08;BE08;1107 1172 11BF;BE08;1107 1172 11BF; # (븈; 븈; 븈; 븈; 븈; ) HANGUL SYLLABLE BYUK +BE09;BE09;1107 1172 11C0;BE09;1107 1172 11C0; # (븉; 븉; 븉; 븉; 븉; ) HANGUL SYLLABLE BYUT +BE0A;BE0A;1107 1172 11C1;BE0A;1107 1172 11C1; # (븊; 븊; 븊; 븊; 븊; ) HANGUL SYLLABLE BYUP +BE0B;BE0B;1107 1172 11C2;BE0B;1107 1172 11C2; # (븋; 븋; 븋; 븋; 븋; ) HANGUL SYLLABLE BYUH +BE0C;BE0C;1107 1173;BE0C;1107 1173; # (브; 브; 브; 브; 브; ) HANGUL SYLLABLE BEU +BE0D;BE0D;1107 1173 11A8;BE0D;1107 1173 11A8; # (븍; 븍; 븍; 븍; 븍; ) HANGUL SYLLABLE BEUG +BE0E;BE0E;1107 1173 11A9;BE0E;1107 1173 11A9; # (븎; 븎; 븎; 븎; 븎; ) HANGUL SYLLABLE BEUGG +BE0F;BE0F;1107 1173 11AA;BE0F;1107 1173 11AA; # (븏; 븏; 븏; 븏; 븏; ) HANGUL SYLLABLE BEUGS +BE10;BE10;1107 1173 11AB;BE10;1107 1173 11AB; # (븐; 븐; 븐; 븐; 븐; ) HANGUL SYLLABLE BEUN +BE11;BE11;1107 1173 11AC;BE11;1107 1173 11AC; # (븑; 븑; 븑; 븑; 븑; ) HANGUL SYLLABLE BEUNJ +BE12;BE12;1107 1173 11AD;BE12;1107 1173 11AD; # (븒; 븒; 븒; 븒; 븒; ) HANGUL SYLLABLE BEUNH +BE13;BE13;1107 1173 11AE;BE13;1107 1173 11AE; # (븓; 븓; 븓; 븓; 븓; ) HANGUL SYLLABLE BEUD +BE14;BE14;1107 1173 11AF;BE14;1107 1173 11AF; # (블; 블; 블; 블; 블; ) HANGUL SYLLABLE BEUL +BE15;BE15;1107 1173 11B0;BE15;1107 1173 11B0; # (븕; 븕; 븕; 븕; 븕; ) HANGUL SYLLABLE BEULG +BE16;BE16;1107 1173 11B1;BE16;1107 1173 11B1; # (븖; 븖; 븖; 븖; 븖; ) HANGUL SYLLABLE BEULM +BE17;BE17;1107 1173 11B2;BE17;1107 1173 11B2; # (븗; 븗; 븗; 븗; 븗; ) HANGUL SYLLABLE BEULB +BE18;BE18;1107 1173 11B3;BE18;1107 1173 11B3; # (븘; 븘; 븘; 븘; 븘; ) HANGUL SYLLABLE BEULS +BE19;BE19;1107 1173 11B4;BE19;1107 1173 11B4; # (븙; 븙; 븙; 븙; 븙; ) HANGUL SYLLABLE BEULT +BE1A;BE1A;1107 1173 11B5;BE1A;1107 1173 11B5; # (븚; 븚; 븚; 븚; 븚; ) HANGUL SYLLABLE BEULP +BE1B;BE1B;1107 1173 11B6;BE1B;1107 1173 11B6; # (븛; 븛; 븛; 븛; 븛; ) HANGUL SYLLABLE BEULH +BE1C;BE1C;1107 1173 11B7;BE1C;1107 1173 11B7; # (븜; 븜; 븜; 븜; 븜; ) HANGUL SYLLABLE BEUM +BE1D;BE1D;1107 1173 11B8;BE1D;1107 1173 11B8; # (븝; 븝; 븝; 븝; 븝; ) HANGUL SYLLABLE BEUB +BE1E;BE1E;1107 1173 11B9;BE1E;1107 1173 11B9; # (븞; 븞; 븞; 븞; 븞; ) HANGUL SYLLABLE BEUBS +BE1F;BE1F;1107 1173 11BA;BE1F;1107 1173 11BA; # (븟; 븟; 븟; 븟; 븟; ) HANGUL SYLLABLE BEUS +BE20;BE20;1107 1173 11BB;BE20;1107 1173 11BB; # (븠; 븠; 븠; 븠; 븠; ) HANGUL SYLLABLE BEUSS +BE21;BE21;1107 1173 11BC;BE21;1107 1173 11BC; # (븡; 븡; 븡; 븡; 븡; ) HANGUL SYLLABLE BEUNG +BE22;BE22;1107 1173 11BD;BE22;1107 1173 11BD; # (븢; 븢; 븢; 븢; 븢; ) HANGUL SYLLABLE BEUJ +BE23;BE23;1107 1173 11BE;BE23;1107 1173 11BE; # (븣; 븣; 븣; 븣; 븣; ) HANGUL SYLLABLE BEUC +BE24;BE24;1107 1173 11BF;BE24;1107 1173 11BF; # (븤; 븤; 븤; 븤; 븤; ) HANGUL SYLLABLE BEUK +BE25;BE25;1107 1173 11C0;BE25;1107 1173 11C0; # (븥; 븥; 븥; 븥; 븥; ) HANGUL SYLLABLE BEUT +BE26;BE26;1107 1173 11C1;BE26;1107 1173 11C1; # (븦; 븦; 븦; 븦; 븦; ) HANGUL SYLLABLE BEUP +BE27;BE27;1107 1173 11C2;BE27;1107 1173 11C2; # (븧; 븧; 븧; 븧; 븧; ) HANGUL SYLLABLE BEUH +BE28;BE28;1107 1174;BE28;1107 1174; # (븨; 븨; 븨; 븨; 븨; ) HANGUL SYLLABLE BYI +BE29;BE29;1107 1174 11A8;BE29;1107 1174 11A8; # (븩; 븩; 븩; 븩; 븩; ) HANGUL SYLLABLE BYIG +BE2A;BE2A;1107 1174 11A9;BE2A;1107 1174 11A9; # (븪; 븪; 븪; 븪; 븪; ) HANGUL SYLLABLE BYIGG +BE2B;BE2B;1107 1174 11AA;BE2B;1107 1174 11AA; # (븫; 븫; 븫; 븫; 븫; ) HANGUL SYLLABLE BYIGS +BE2C;BE2C;1107 1174 11AB;BE2C;1107 1174 11AB; # (븬; 븬; 븬; 븬; 븬; ) HANGUL SYLLABLE BYIN +BE2D;BE2D;1107 1174 11AC;BE2D;1107 1174 11AC; # (븭; 븭; 븭; 븭; 븭; ) HANGUL SYLLABLE BYINJ +BE2E;BE2E;1107 1174 11AD;BE2E;1107 1174 11AD; # (븮; 븮; 븮; 븮; 븮; ) HANGUL SYLLABLE BYINH +BE2F;BE2F;1107 1174 11AE;BE2F;1107 1174 11AE; # (븯; 븯; 븯; 븯; 븯; ) HANGUL SYLLABLE BYID +BE30;BE30;1107 1174 11AF;BE30;1107 1174 11AF; # (븰; 븰; 븰; 븰; 븰; ) HANGUL SYLLABLE BYIL +BE31;BE31;1107 1174 11B0;BE31;1107 1174 11B0; # (븱; 븱; 븱; 븱; 븱; ) HANGUL SYLLABLE BYILG +BE32;BE32;1107 1174 11B1;BE32;1107 1174 11B1; # (븲; 븲; 븲; 븲; 븲; ) HANGUL SYLLABLE BYILM +BE33;BE33;1107 1174 11B2;BE33;1107 1174 11B2; # (븳; 븳; 븳; 븳; 븳; ) HANGUL SYLLABLE BYILB +BE34;BE34;1107 1174 11B3;BE34;1107 1174 11B3; # (븴; 븴; 븴; 븴; 븴; ) HANGUL SYLLABLE BYILS +BE35;BE35;1107 1174 11B4;BE35;1107 1174 11B4; # (븵; 븵; 븵; 븵; 븵; ) HANGUL SYLLABLE BYILT +BE36;BE36;1107 1174 11B5;BE36;1107 1174 11B5; # (븶; 븶; 븶; 븶; 븶; ) HANGUL SYLLABLE BYILP +BE37;BE37;1107 1174 11B6;BE37;1107 1174 11B6; # (븷; 븷; 븷; 븷; 븷; ) HANGUL SYLLABLE BYILH +BE38;BE38;1107 1174 11B7;BE38;1107 1174 11B7; # (븸; 븸; 븸; 븸; 븸; ) HANGUL SYLLABLE BYIM +BE39;BE39;1107 1174 11B8;BE39;1107 1174 11B8; # (븹; 븹; 븹; 븹; 븹; ) HANGUL SYLLABLE BYIB +BE3A;BE3A;1107 1174 11B9;BE3A;1107 1174 11B9; # (븺; 븺; 븺; 븺; 븺; ) HANGUL SYLLABLE BYIBS +BE3B;BE3B;1107 1174 11BA;BE3B;1107 1174 11BA; # (븻; 븻; 븻; 븻; 븻; ) HANGUL SYLLABLE BYIS +BE3C;BE3C;1107 1174 11BB;BE3C;1107 1174 11BB; # (븼; 븼; 븼; 븼; 븼; ) HANGUL SYLLABLE BYISS +BE3D;BE3D;1107 1174 11BC;BE3D;1107 1174 11BC; # (븽; 븽; 븽; 븽; 븽; ) HANGUL SYLLABLE BYING +BE3E;BE3E;1107 1174 11BD;BE3E;1107 1174 11BD; # (븾; 븾; 븾; 븾; 븾; ) HANGUL SYLLABLE BYIJ +BE3F;BE3F;1107 1174 11BE;BE3F;1107 1174 11BE; # (븿; 븿; 븿; 븿; 븿; ) HANGUL SYLLABLE BYIC +BE40;BE40;1107 1174 11BF;BE40;1107 1174 11BF; # (빀; 빀; 빀; 빀; 빀; ) HANGUL SYLLABLE BYIK +BE41;BE41;1107 1174 11C0;BE41;1107 1174 11C0; # (빁; 빁; 빁; 빁; 빁; ) HANGUL SYLLABLE BYIT +BE42;BE42;1107 1174 11C1;BE42;1107 1174 11C1; # (빂; 빂; 빂; 빂; 빂; ) HANGUL SYLLABLE BYIP +BE43;BE43;1107 1174 11C2;BE43;1107 1174 11C2; # (빃; 빃; 빃; 빃; 빃; ) HANGUL SYLLABLE BYIH +BE44;BE44;1107 1175;BE44;1107 1175; # (비; 비; 비; 비; 비; ) HANGUL SYLLABLE BI +BE45;BE45;1107 1175 11A8;BE45;1107 1175 11A8; # (빅; 빅; 빅; 빅; 빅; ) HANGUL SYLLABLE BIG +BE46;BE46;1107 1175 11A9;BE46;1107 1175 11A9; # (빆; 빆; 빆; 빆; 빆; ) HANGUL SYLLABLE BIGG +BE47;BE47;1107 1175 11AA;BE47;1107 1175 11AA; # (빇; 빇; 빇; 빇; 빇; ) HANGUL SYLLABLE BIGS +BE48;BE48;1107 1175 11AB;BE48;1107 1175 11AB; # (빈; 빈; 빈; 빈; 빈; ) HANGUL SYLLABLE BIN +BE49;BE49;1107 1175 11AC;BE49;1107 1175 11AC; # (빉; 빉; 빉; 빉; 빉; ) HANGUL SYLLABLE BINJ +BE4A;BE4A;1107 1175 11AD;BE4A;1107 1175 11AD; # (빊; 빊; 빊; 빊; 빊; ) HANGUL SYLLABLE BINH +BE4B;BE4B;1107 1175 11AE;BE4B;1107 1175 11AE; # (빋; 빋; 빋; 빋; 빋; ) HANGUL SYLLABLE BID +BE4C;BE4C;1107 1175 11AF;BE4C;1107 1175 11AF; # (빌; 빌; 빌; 빌; 빌; ) HANGUL SYLLABLE BIL +BE4D;BE4D;1107 1175 11B0;BE4D;1107 1175 11B0; # (빍; 빍; 빍; 빍; 빍; ) HANGUL SYLLABLE BILG +BE4E;BE4E;1107 1175 11B1;BE4E;1107 1175 11B1; # (빎; 빎; 빎; 빎; 빎; ) HANGUL SYLLABLE BILM +BE4F;BE4F;1107 1175 11B2;BE4F;1107 1175 11B2; # (빏; 빏; 빏; 빏; 빏; ) HANGUL SYLLABLE BILB +BE50;BE50;1107 1175 11B3;BE50;1107 1175 11B3; # (빐; 빐; 빐; 빐; 빐; ) HANGUL SYLLABLE BILS +BE51;BE51;1107 1175 11B4;BE51;1107 1175 11B4; # (빑; 빑; 빑; 빑; 빑; ) HANGUL SYLLABLE BILT +BE52;BE52;1107 1175 11B5;BE52;1107 1175 11B5; # (빒; 빒; 빒; 빒; 빒; ) HANGUL SYLLABLE BILP +BE53;BE53;1107 1175 11B6;BE53;1107 1175 11B6; # (빓; 빓; 빓; 빓; 빓; ) HANGUL SYLLABLE BILH +BE54;BE54;1107 1175 11B7;BE54;1107 1175 11B7; # (빔; 빔; 빔; 빔; 빔; ) HANGUL SYLLABLE BIM +BE55;BE55;1107 1175 11B8;BE55;1107 1175 11B8; # (빕; 빕; 빕; 빕; 빕; ) HANGUL SYLLABLE BIB +BE56;BE56;1107 1175 11B9;BE56;1107 1175 11B9; # (빖; 빖; 빖; 빖; 빖; ) HANGUL SYLLABLE BIBS +BE57;BE57;1107 1175 11BA;BE57;1107 1175 11BA; # (빗; 빗; 빗; 빗; 빗; ) HANGUL SYLLABLE BIS +BE58;BE58;1107 1175 11BB;BE58;1107 1175 11BB; # (빘; 빘; 빘; 빘; 빘; ) HANGUL SYLLABLE BISS +BE59;BE59;1107 1175 11BC;BE59;1107 1175 11BC; # (빙; 빙; 빙; 빙; 빙; ) HANGUL SYLLABLE BING +BE5A;BE5A;1107 1175 11BD;BE5A;1107 1175 11BD; # (빚; 빚; 빚; 빚; 빚; ) HANGUL SYLLABLE BIJ +BE5B;BE5B;1107 1175 11BE;BE5B;1107 1175 11BE; # (빛; 빛; 빛; 빛; 빛; ) HANGUL SYLLABLE BIC +BE5C;BE5C;1107 1175 11BF;BE5C;1107 1175 11BF; # (빜; 빜; 빜; 빜; 빜; ) HANGUL SYLLABLE BIK +BE5D;BE5D;1107 1175 11C0;BE5D;1107 1175 11C0; # (빝; 빝; 빝; 빝; 빝; ) HANGUL SYLLABLE BIT +BE5E;BE5E;1107 1175 11C1;BE5E;1107 1175 11C1; # (빞; 빞; 빞; 빞; 빞; ) HANGUL SYLLABLE BIP +BE5F;BE5F;1107 1175 11C2;BE5F;1107 1175 11C2; # (빟; 빟; 빟; 빟; 빟; ) HANGUL SYLLABLE BIH +BE60;BE60;1108 1161;BE60;1108 1161; # (빠; 빠; 빠; 빠; 빠; ) HANGUL SYLLABLE BBA +BE61;BE61;1108 1161 11A8;BE61;1108 1161 11A8; # (빡; 빡; 빡; 빡; 빡; ) HANGUL SYLLABLE BBAG +BE62;BE62;1108 1161 11A9;BE62;1108 1161 11A9; # (빢; 빢; 빢; 빢; 빢; ) HANGUL SYLLABLE BBAGG +BE63;BE63;1108 1161 11AA;BE63;1108 1161 11AA; # (빣; 빣; 빣; 빣; 빣; ) HANGUL SYLLABLE BBAGS +BE64;BE64;1108 1161 11AB;BE64;1108 1161 11AB; # (빤; 빤; 빤; 빤; 빤; ) HANGUL SYLLABLE BBAN +BE65;BE65;1108 1161 11AC;BE65;1108 1161 11AC; # (빥; 빥; 빥; 빥; 빥; ) HANGUL SYLLABLE BBANJ +BE66;BE66;1108 1161 11AD;BE66;1108 1161 11AD; # (빦; 빦; 빦; 빦; 빦; ) HANGUL SYLLABLE BBANH +BE67;BE67;1108 1161 11AE;BE67;1108 1161 11AE; # (빧; 빧; 빧; 빧; 빧; ) HANGUL SYLLABLE BBAD +BE68;BE68;1108 1161 11AF;BE68;1108 1161 11AF; # (빨; 빨; 빨; 빨; 빨; ) HANGUL SYLLABLE BBAL +BE69;BE69;1108 1161 11B0;BE69;1108 1161 11B0; # (빩; 빩; 빩; 빩; 빩; ) HANGUL SYLLABLE BBALG +BE6A;BE6A;1108 1161 11B1;BE6A;1108 1161 11B1; # (빪; 빪; 빪; 빪; 빪; ) HANGUL SYLLABLE BBALM +BE6B;BE6B;1108 1161 11B2;BE6B;1108 1161 11B2; # (빫; 빫; 빫; 빫; 빫; ) HANGUL SYLLABLE BBALB +BE6C;BE6C;1108 1161 11B3;BE6C;1108 1161 11B3; # (빬; 빬; 빬; 빬; 빬; ) HANGUL SYLLABLE BBALS +BE6D;BE6D;1108 1161 11B4;BE6D;1108 1161 11B4; # (빭; 빭; 빭; 빭; 빭; ) HANGUL SYLLABLE BBALT +BE6E;BE6E;1108 1161 11B5;BE6E;1108 1161 11B5; # (빮; 빮; 빮; 빮; 빮; ) HANGUL SYLLABLE BBALP +BE6F;BE6F;1108 1161 11B6;BE6F;1108 1161 11B6; # (빯; 빯; 빯; 빯; 빯; ) HANGUL SYLLABLE BBALH +BE70;BE70;1108 1161 11B7;BE70;1108 1161 11B7; # (빰; 빰; 빰; 빰; 빰; ) HANGUL SYLLABLE BBAM +BE71;BE71;1108 1161 11B8;BE71;1108 1161 11B8; # (빱; 빱; 빱; 빱; 빱; ) HANGUL SYLLABLE BBAB +BE72;BE72;1108 1161 11B9;BE72;1108 1161 11B9; # (빲; 빲; 빲; 빲; 빲; ) HANGUL SYLLABLE BBABS +BE73;BE73;1108 1161 11BA;BE73;1108 1161 11BA; # (빳; 빳; 빳; 빳; 빳; ) HANGUL SYLLABLE BBAS +BE74;BE74;1108 1161 11BB;BE74;1108 1161 11BB; # (빴; 빴; 빴; 빴; 빴; ) HANGUL SYLLABLE BBASS +BE75;BE75;1108 1161 11BC;BE75;1108 1161 11BC; # (빵; 빵; 빵; 빵; 빵; ) HANGUL SYLLABLE BBANG +BE76;BE76;1108 1161 11BD;BE76;1108 1161 11BD; # (빶; 빶; 빶; 빶; 빶; ) HANGUL SYLLABLE BBAJ +BE77;BE77;1108 1161 11BE;BE77;1108 1161 11BE; # (빷; 빷; 빷; 빷; 빷; ) HANGUL SYLLABLE BBAC +BE78;BE78;1108 1161 11BF;BE78;1108 1161 11BF; # (빸; 빸; 빸; 빸; 빸; ) HANGUL SYLLABLE BBAK +BE79;BE79;1108 1161 11C0;BE79;1108 1161 11C0; # (빹; 빹; 빹; 빹; 빹; ) HANGUL SYLLABLE BBAT +BE7A;BE7A;1108 1161 11C1;BE7A;1108 1161 11C1; # (빺; 빺; 빺; 빺; 빺; ) HANGUL SYLLABLE BBAP +BE7B;BE7B;1108 1161 11C2;BE7B;1108 1161 11C2; # (빻; 빻; 빻; 빻; 빻; ) HANGUL SYLLABLE BBAH +BE7C;BE7C;1108 1162;BE7C;1108 1162; # (빼; 빼; 빼; 빼; 빼; ) HANGUL SYLLABLE BBAE +BE7D;BE7D;1108 1162 11A8;BE7D;1108 1162 11A8; # (빽; 빽; 빽; 빽; 빽; ) HANGUL SYLLABLE BBAEG +BE7E;BE7E;1108 1162 11A9;BE7E;1108 1162 11A9; # (빾; 빾; 빾; 빾; 빾; ) HANGUL SYLLABLE BBAEGG +BE7F;BE7F;1108 1162 11AA;BE7F;1108 1162 11AA; # (빿; 빿; 빿; 빿; 빿; ) HANGUL SYLLABLE BBAEGS +BE80;BE80;1108 1162 11AB;BE80;1108 1162 11AB; # (뺀; 뺀; 뺀; 뺀; 뺀; ) HANGUL SYLLABLE BBAEN +BE81;BE81;1108 1162 11AC;BE81;1108 1162 11AC; # (뺁; 뺁; 뺁; 뺁; 뺁; ) HANGUL SYLLABLE BBAENJ +BE82;BE82;1108 1162 11AD;BE82;1108 1162 11AD; # (뺂; 뺂; 뺂; 뺂; 뺂; ) HANGUL SYLLABLE BBAENH +BE83;BE83;1108 1162 11AE;BE83;1108 1162 11AE; # (뺃; 뺃; 뺃; 뺃; 뺃; ) HANGUL SYLLABLE BBAED +BE84;BE84;1108 1162 11AF;BE84;1108 1162 11AF; # (뺄; 뺄; 뺄; 뺄; 뺄; ) HANGUL SYLLABLE BBAEL +BE85;BE85;1108 1162 11B0;BE85;1108 1162 11B0; # (뺅; 뺅; 뺅; 뺅; 뺅; ) HANGUL SYLLABLE BBAELG +BE86;BE86;1108 1162 11B1;BE86;1108 1162 11B1; # (뺆; 뺆; 뺆; 뺆; 뺆; ) HANGUL SYLLABLE BBAELM +BE87;BE87;1108 1162 11B2;BE87;1108 1162 11B2; # (뺇; 뺇; 뺇; 뺇; 뺇; ) HANGUL SYLLABLE BBAELB +BE88;BE88;1108 1162 11B3;BE88;1108 1162 11B3; # (뺈; 뺈; 뺈; 뺈; 뺈; ) HANGUL SYLLABLE BBAELS +BE89;BE89;1108 1162 11B4;BE89;1108 1162 11B4; # (뺉; 뺉; 뺉; 뺉; 뺉; ) HANGUL SYLLABLE BBAELT +BE8A;BE8A;1108 1162 11B5;BE8A;1108 1162 11B5; # (뺊; 뺊; 뺊; 뺊; 뺊; ) HANGUL SYLLABLE BBAELP +BE8B;BE8B;1108 1162 11B6;BE8B;1108 1162 11B6; # (뺋; 뺋; 뺋; 뺋; 뺋; ) HANGUL SYLLABLE BBAELH +BE8C;BE8C;1108 1162 11B7;BE8C;1108 1162 11B7; # (뺌; 뺌; 뺌; 뺌; 뺌; ) HANGUL SYLLABLE BBAEM +BE8D;BE8D;1108 1162 11B8;BE8D;1108 1162 11B8; # (뺍; 뺍; 뺍; 뺍; 뺍; ) HANGUL SYLLABLE BBAEB +BE8E;BE8E;1108 1162 11B9;BE8E;1108 1162 11B9; # (뺎; 뺎; 뺎; 뺎; 뺎; ) HANGUL SYLLABLE BBAEBS +BE8F;BE8F;1108 1162 11BA;BE8F;1108 1162 11BA; # (뺏; 뺏; 뺏; 뺏; 뺏; ) HANGUL SYLLABLE BBAES +BE90;BE90;1108 1162 11BB;BE90;1108 1162 11BB; # (뺐; 뺐; 뺐; 뺐; 뺐; ) HANGUL SYLLABLE BBAESS +BE91;BE91;1108 1162 11BC;BE91;1108 1162 11BC; # (뺑; 뺑; 뺑; 뺑; 뺑; ) HANGUL SYLLABLE BBAENG +BE92;BE92;1108 1162 11BD;BE92;1108 1162 11BD; # (뺒; 뺒; 뺒; 뺒; 뺒; ) HANGUL SYLLABLE BBAEJ +BE93;BE93;1108 1162 11BE;BE93;1108 1162 11BE; # (뺓; 뺓; 뺓; 뺓; 뺓; ) HANGUL SYLLABLE BBAEC +BE94;BE94;1108 1162 11BF;BE94;1108 1162 11BF; # (뺔; 뺔; 뺔; 뺔; 뺔; ) HANGUL SYLLABLE BBAEK +BE95;BE95;1108 1162 11C0;BE95;1108 1162 11C0; # (뺕; 뺕; 뺕; 뺕; 뺕; ) HANGUL SYLLABLE BBAET +BE96;BE96;1108 1162 11C1;BE96;1108 1162 11C1; # (뺖; 뺖; 뺖; 뺖; 뺖; ) HANGUL SYLLABLE BBAEP +BE97;BE97;1108 1162 11C2;BE97;1108 1162 11C2; # (뺗; 뺗; 뺗; 뺗; 뺗; ) HANGUL SYLLABLE BBAEH +BE98;BE98;1108 1163;BE98;1108 1163; # (뺘; 뺘; 뺘; 뺘; 뺘; ) HANGUL SYLLABLE BBYA +BE99;BE99;1108 1163 11A8;BE99;1108 1163 11A8; # (뺙; 뺙; 뺙; 뺙; 뺙; ) HANGUL SYLLABLE BBYAG +BE9A;BE9A;1108 1163 11A9;BE9A;1108 1163 11A9; # (뺚; 뺚; 뺚; 뺚; 뺚; ) HANGUL SYLLABLE BBYAGG +BE9B;BE9B;1108 1163 11AA;BE9B;1108 1163 11AA; # (뺛; 뺛; 뺛; 뺛; 뺛; ) HANGUL SYLLABLE BBYAGS +BE9C;BE9C;1108 1163 11AB;BE9C;1108 1163 11AB; # (뺜; 뺜; 뺜; 뺜; 뺜; ) HANGUL SYLLABLE BBYAN +BE9D;BE9D;1108 1163 11AC;BE9D;1108 1163 11AC; # (뺝; 뺝; 뺝; 뺝; 뺝; ) HANGUL SYLLABLE BBYANJ +BE9E;BE9E;1108 1163 11AD;BE9E;1108 1163 11AD; # (뺞; 뺞; 뺞; 뺞; 뺞; ) HANGUL SYLLABLE BBYANH +BE9F;BE9F;1108 1163 11AE;BE9F;1108 1163 11AE; # (뺟; 뺟; 뺟; 뺟; 뺟; ) HANGUL SYLLABLE BBYAD +BEA0;BEA0;1108 1163 11AF;BEA0;1108 1163 11AF; # (뺠; 뺠; 뺠; 뺠; 뺠; ) HANGUL SYLLABLE BBYAL +BEA1;BEA1;1108 1163 11B0;BEA1;1108 1163 11B0; # (뺡; 뺡; 뺡; 뺡; 뺡; ) HANGUL SYLLABLE BBYALG +BEA2;BEA2;1108 1163 11B1;BEA2;1108 1163 11B1; # (뺢; 뺢; 뺢; 뺢; 뺢; ) HANGUL SYLLABLE BBYALM +BEA3;BEA3;1108 1163 11B2;BEA3;1108 1163 11B2; # (뺣; 뺣; 뺣; 뺣; 뺣; ) HANGUL SYLLABLE BBYALB +BEA4;BEA4;1108 1163 11B3;BEA4;1108 1163 11B3; # (뺤; 뺤; 뺤; 뺤; 뺤; ) HANGUL SYLLABLE BBYALS +BEA5;BEA5;1108 1163 11B4;BEA5;1108 1163 11B4; # (뺥; 뺥; 뺥; 뺥; 뺥; ) HANGUL SYLLABLE BBYALT +BEA6;BEA6;1108 1163 11B5;BEA6;1108 1163 11B5; # (뺦; 뺦; 뺦; 뺦; 뺦; ) HANGUL SYLLABLE BBYALP +BEA7;BEA7;1108 1163 11B6;BEA7;1108 1163 11B6; # (뺧; 뺧; 뺧; 뺧; 뺧; ) HANGUL SYLLABLE BBYALH +BEA8;BEA8;1108 1163 11B7;BEA8;1108 1163 11B7; # (뺨; 뺨; 뺨; 뺨; 뺨; ) HANGUL SYLLABLE BBYAM +BEA9;BEA9;1108 1163 11B8;BEA9;1108 1163 11B8; # (뺩; 뺩; 뺩; 뺩; 뺩; ) HANGUL SYLLABLE BBYAB +BEAA;BEAA;1108 1163 11B9;BEAA;1108 1163 11B9; # (뺪; 뺪; 뺪; 뺪; 뺪; ) HANGUL SYLLABLE BBYABS +BEAB;BEAB;1108 1163 11BA;BEAB;1108 1163 11BA; # (뺫; 뺫; 뺫; 뺫; 뺫; ) HANGUL SYLLABLE BBYAS +BEAC;BEAC;1108 1163 11BB;BEAC;1108 1163 11BB; # (뺬; 뺬; 뺬; 뺬; 뺬; ) HANGUL SYLLABLE BBYASS +BEAD;BEAD;1108 1163 11BC;BEAD;1108 1163 11BC; # (뺭; 뺭; 뺭; 뺭; 뺭; ) HANGUL SYLLABLE BBYANG +BEAE;BEAE;1108 1163 11BD;BEAE;1108 1163 11BD; # (뺮; 뺮; 뺮; 뺮; 뺮; ) HANGUL SYLLABLE BBYAJ +BEAF;BEAF;1108 1163 11BE;BEAF;1108 1163 11BE; # (뺯; 뺯; 뺯; 뺯; 뺯; ) HANGUL SYLLABLE BBYAC +BEB0;BEB0;1108 1163 11BF;BEB0;1108 1163 11BF; # (뺰; 뺰; 뺰; 뺰; 뺰; ) HANGUL SYLLABLE BBYAK +BEB1;BEB1;1108 1163 11C0;BEB1;1108 1163 11C0; # (뺱; 뺱; 뺱; 뺱; 뺱; ) HANGUL SYLLABLE BBYAT +BEB2;BEB2;1108 1163 11C1;BEB2;1108 1163 11C1; # (뺲; 뺲; 뺲; 뺲; 뺲; ) HANGUL SYLLABLE BBYAP +BEB3;BEB3;1108 1163 11C2;BEB3;1108 1163 11C2; # (뺳; 뺳; 뺳; 뺳; 뺳; ) HANGUL SYLLABLE BBYAH +BEB4;BEB4;1108 1164;BEB4;1108 1164; # (뺴; 뺴; 뺴; 뺴; 뺴; ) HANGUL SYLLABLE BBYAE +BEB5;BEB5;1108 1164 11A8;BEB5;1108 1164 11A8; # (뺵; 뺵; 뺵; 뺵; 뺵; ) HANGUL SYLLABLE BBYAEG +BEB6;BEB6;1108 1164 11A9;BEB6;1108 1164 11A9; # (뺶; 뺶; 뺶; 뺶; 뺶; ) HANGUL SYLLABLE BBYAEGG +BEB7;BEB7;1108 1164 11AA;BEB7;1108 1164 11AA; # (뺷; 뺷; 뺷; 뺷; 뺷; ) HANGUL SYLLABLE BBYAEGS +BEB8;BEB8;1108 1164 11AB;BEB8;1108 1164 11AB; # (뺸; 뺸; 뺸; 뺸; 뺸; ) HANGUL SYLLABLE BBYAEN +BEB9;BEB9;1108 1164 11AC;BEB9;1108 1164 11AC; # (뺹; 뺹; 뺹; 뺹; 뺹; ) HANGUL SYLLABLE BBYAENJ +BEBA;BEBA;1108 1164 11AD;BEBA;1108 1164 11AD; # (뺺; 뺺; 뺺; 뺺; 뺺; ) HANGUL SYLLABLE BBYAENH +BEBB;BEBB;1108 1164 11AE;BEBB;1108 1164 11AE; # (뺻; 뺻; 뺻; 뺻; 뺻; ) HANGUL SYLLABLE BBYAED +BEBC;BEBC;1108 1164 11AF;BEBC;1108 1164 11AF; # (뺼; 뺼; 뺼; 뺼; 뺼; ) HANGUL SYLLABLE BBYAEL +BEBD;BEBD;1108 1164 11B0;BEBD;1108 1164 11B0; # (뺽; 뺽; 뺽; 뺽; 뺽; ) HANGUL SYLLABLE BBYAELG +BEBE;BEBE;1108 1164 11B1;BEBE;1108 1164 11B1; # (뺾; 뺾; 뺾; 뺾; 뺾; ) HANGUL SYLLABLE BBYAELM +BEBF;BEBF;1108 1164 11B2;BEBF;1108 1164 11B2; # (뺿; 뺿; 뺿; 뺿; 뺿; ) HANGUL SYLLABLE BBYAELB +BEC0;BEC0;1108 1164 11B3;BEC0;1108 1164 11B3; # (뻀; 뻀; 뻀; 뻀; 뻀; ) HANGUL SYLLABLE BBYAELS +BEC1;BEC1;1108 1164 11B4;BEC1;1108 1164 11B4; # (뻁; 뻁; 뻁; 뻁; 뻁; ) HANGUL SYLLABLE BBYAELT +BEC2;BEC2;1108 1164 11B5;BEC2;1108 1164 11B5; # (뻂; 뻂; 뻂; 뻂; 뻂; ) HANGUL SYLLABLE BBYAELP +BEC3;BEC3;1108 1164 11B6;BEC3;1108 1164 11B6; # (뻃; 뻃; 뻃; 뻃; 뻃; ) HANGUL SYLLABLE BBYAELH +BEC4;BEC4;1108 1164 11B7;BEC4;1108 1164 11B7; # (뻄; 뻄; 뻄; 뻄; 뻄; ) HANGUL SYLLABLE BBYAEM +BEC5;BEC5;1108 1164 11B8;BEC5;1108 1164 11B8; # (뻅; 뻅; 뻅; 뻅; 뻅; ) HANGUL SYLLABLE BBYAEB +BEC6;BEC6;1108 1164 11B9;BEC6;1108 1164 11B9; # (뻆; 뻆; 뻆; 뻆; 뻆; ) HANGUL SYLLABLE BBYAEBS +BEC7;BEC7;1108 1164 11BA;BEC7;1108 1164 11BA; # (뻇; 뻇; 뻇; 뻇; 뻇; ) HANGUL SYLLABLE BBYAES +BEC8;BEC8;1108 1164 11BB;BEC8;1108 1164 11BB; # (뻈; 뻈; 뻈; 뻈; 뻈; ) HANGUL SYLLABLE BBYAESS +BEC9;BEC9;1108 1164 11BC;BEC9;1108 1164 11BC; # (뻉; 뻉; 뻉; 뻉; 뻉; ) HANGUL SYLLABLE BBYAENG +BECA;BECA;1108 1164 11BD;BECA;1108 1164 11BD; # (뻊; 뻊; 뻊; 뻊; 뻊; ) HANGUL SYLLABLE BBYAEJ +BECB;BECB;1108 1164 11BE;BECB;1108 1164 11BE; # (뻋; 뻋; 뻋; 뻋; 뻋; ) HANGUL SYLLABLE BBYAEC +BECC;BECC;1108 1164 11BF;BECC;1108 1164 11BF; # (뻌; 뻌; 뻌; 뻌; 뻌; ) HANGUL SYLLABLE BBYAEK +BECD;BECD;1108 1164 11C0;BECD;1108 1164 11C0; # (뻍; 뻍; 뻍; 뻍; 뻍; ) HANGUL SYLLABLE BBYAET +BECE;BECE;1108 1164 11C1;BECE;1108 1164 11C1; # (뻎; 뻎; 뻎; 뻎; 뻎; ) HANGUL SYLLABLE BBYAEP +BECF;BECF;1108 1164 11C2;BECF;1108 1164 11C2; # (뻏; 뻏; 뻏; 뻏; 뻏; ) HANGUL SYLLABLE BBYAEH +BED0;BED0;1108 1165;BED0;1108 1165; # (뻐; 뻐; 뻐; 뻐; 뻐; ) HANGUL SYLLABLE BBEO +BED1;BED1;1108 1165 11A8;BED1;1108 1165 11A8; # (뻑; 뻑; 뻑; 뻑; 뻑; ) HANGUL SYLLABLE BBEOG +BED2;BED2;1108 1165 11A9;BED2;1108 1165 11A9; # (뻒; 뻒; 뻒; 뻒; 뻒; ) HANGUL SYLLABLE BBEOGG +BED3;BED3;1108 1165 11AA;BED3;1108 1165 11AA; # (뻓; 뻓; 뻓; 뻓; 뻓; ) HANGUL SYLLABLE BBEOGS +BED4;BED4;1108 1165 11AB;BED4;1108 1165 11AB; # (뻔; 뻔; 뻔; 뻔; 뻔; ) HANGUL SYLLABLE BBEON +BED5;BED5;1108 1165 11AC;BED5;1108 1165 11AC; # (뻕; 뻕; 뻕; 뻕; 뻕; ) HANGUL SYLLABLE BBEONJ +BED6;BED6;1108 1165 11AD;BED6;1108 1165 11AD; # (뻖; 뻖; 뻖; 뻖; 뻖; ) HANGUL SYLLABLE BBEONH +BED7;BED7;1108 1165 11AE;BED7;1108 1165 11AE; # (뻗; 뻗; 뻗; 뻗; 뻗; ) HANGUL SYLLABLE BBEOD +BED8;BED8;1108 1165 11AF;BED8;1108 1165 11AF; # (뻘; 뻘; 뻘; 뻘; 뻘; ) HANGUL SYLLABLE BBEOL +BED9;BED9;1108 1165 11B0;BED9;1108 1165 11B0; # (뻙; 뻙; 뻙; 뻙; 뻙; ) HANGUL SYLLABLE BBEOLG +BEDA;BEDA;1108 1165 11B1;BEDA;1108 1165 11B1; # (뻚; 뻚; 뻚; 뻚; 뻚; ) HANGUL SYLLABLE BBEOLM +BEDB;BEDB;1108 1165 11B2;BEDB;1108 1165 11B2; # (뻛; 뻛; 뻛; 뻛; 뻛; ) HANGUL SYLLABLE BBEOLB +BEDC;BEDC;1108 1165 11B3;BEDC;1108 1165 11B3; # (뻜; 뻜; 뻜; 뻜; 뻜; ) HANGUL SYLLABLE BBEOLS +BEDD;BEDD;1108 1165 11B4;BEDD;1108 1165 11B4; # (뻝; 뻝; 뻝; 뻝; 뻝; ) HANGUL SYLLABLE BBEOLT +BEDE;BEDE;1108 1165 11B5;BEDE;1108 1165 11B5; # (뻞; 뻞; 뻞; 뻞; 뻞; ) HANGUL SYLLABLE BBEOLP +BEDF;BEDF;1108 1165 11B6;BEDF;1108 1165 11B6; # (뻟; 뻟; 뻟; 뻟; 뻟; ) HANGUL SYLLABLE BBEOLH +BEE0;BEE0;1108 1165 11B7;BEE0;1108 1165 11B7; # (뻠; 뻠; 뻠; 뻠; 뻠; ) HANGUL SYLLABLE BBEOM +BEE1;BEE1;1108 1165 11B8;BEE1;1108 1165 11B8; # (뻡; 뻡; 뻡; 뻡; 뻡; ) HANGUL SYLLABLE BBEOB +BEE2;BEE2;1108 1165 11B9;BEE2;1108 1165 11B9; # (뻢; 뻢; 뻢; 뻢; 뻢; ) HANGUL SYLLABLE BBEOBS +BEE3;BEE3;1108 1165 11BA;BEE3;1108 1165 11BA; # (뻣; 뻣; 뻣; 뻣; 뻣; ) HANGUL SYLLABLE BBEOS +BEE4;BEE4;1108 1165 11BB;BEE4;1108 1165 11BB; # (뻤; 뻤; 뻤; 뻤; 뻤; ) HANGUL SYLLABLE BBEOSS +BEE5;BEE5;1108 1165 11BC;BEE5;1108 1165 11BC; # (뻥; 뻥; 뻥; 뻥; 뻥; ) HANGUL SYLLABLE BBEONG +BEE6;BEE6;1108 1165 11BD;BEE6;1108 1165 11BD; # (뻦; 뻦; 뻦; 뻦; 뻦; ) HANGUL SYLLABLE BBEOJ +BEE7;BEE7;1108 1165 11BE;BEE7;1108 1165 11BE; # (뻧; 뻧; 뻧; 뻧; 뻧; ) HANGUL SYLLABLE BBEOC +BEE8;BEE8;1108 1165 11BF;BEE8;1108 1165 11BF; # (뻨; 뻨; 뻨; 뻨; 뻨; ) HANGUL SYLLABLE BBEOK +BEE9;BEE9;1108 1165 11C0;BEE9;1108 1165 11C0; # (뻩; 뻩; 뻩; 뻩; 뻩; ) HANGUL SYLLABLE BBEOT +BEEA;BEEA;1108 1165 11C1;BEEA;1108 1165 11C1; # (뻪; 뻪; 뻪; 뻪; 뻪; ) HANGUL SYLLABLE BBEOP +BEEB;BEEB;1108 1165 11C2;BEEB;1108 1165 11C2; # (뻫; 뻫; 뻫; 뻫; 뻫; ) HANGUL SYLLABLE BBEOH +BEEC;BEEC;1108 1166;BEEC;1108 1166; # (뻬; 뻬; 뻬; 뻬; 뻬; ) HANGUL SYLLABLE BBE +BEED;BEED;1108 1166 11A8;BEED;1108 1166 11A8; # (뻭; 뻭; 뻭; 뻭; 뻭; ) HANGUL SYLLABLE BBEG +BEEE;BEEE;1108 1166 11A9;BEEE;1108 1166 11A9; # (뻮; 뻮; 뻮; 뻮; 뻮; ) HANGUL SYLLABLE BBEGG +BEEF;BEEF;1108 1166 11AA;BEEF;1108 1166 11AA; # (뻯; 뻯; 뻯; 뻯; 뻯; ) HANGUL SYLLABLE BBEGS +BEF0;BEF0;1108 1166 11AB;BEF0;1108 1166 11AB; # (뻰; 뻰; 뻰; 뻰; 뻰; ) HANGUL SYLLABLE BBEN +BEF1;BEF1;1108 1166 11AC;BEF1;1108 1166 11AC; # (뻱; 뻱; 뻱; 뻱; 뻱; ) HANGUL SYLLABLE BBENJ +BEF2;BEF2;1108 1166 11AD;BEF2;1108 1166 11AD; # (뻲; 뻲; 뻲; 뻲; 뻲; ) HANGUL SYLLABLE BBENH +BEF3;BEF3;1108 1166 11AE;BEF3;1108 1166 11AE; # (뻳; 뻳; 뻳; 뻳; 뻳; ) HANGUL SYLLABLE BBED +BEF4;BEF4;1108 1166 11AF;BEF4;1108 1166 11AF; # (뻴; 뻴; 뻴; 뻴; 뻴; ) HANGUL SYLLABLE BBEL +BEF5;BEF5;1108 1166 11B0;BEF5;1108 1166 11B0; # (뻵; 뻵; 뻵; 뻵; 뻵; ) HANGUL SYLLABLE BBELG +BEF6;BEF6;1108 1166 11B1;BEF6;1108 1166 11B1; # (뻶; 뻶; 뻶; 뻶; 뻶; ) HANGUL SYLLABLE BBELM +BEF7;BEF7;1108 1166 11B2;BEF7;1108 1166 11B2; # (뻷; 뻷; 뻷; 뻷; 뻷; ) HANGUL SYLLABLE BBELB +BEF8;BEF8;1108 1166 11B3;BEF8;1108 1166 11B3; # (뻸; 뻸; 뻸; 뻸; 뻸; ) HANGUL SYLLABLE BBELS +BEF9;BEF9;1108 1166 11B4;BEF9;1108 1166 11B4; # (뻹; 뻹; 뻹; 뻹; 뻹; ) HANGUL SYLLABLE BBELT +BEFA;BEFA;1108 1166 11B5;BEFA;1108 1166 11B5; # (뻺; 뻺; 뻺; 뻺; 뻺; ) HANGUL SYLLABLE BBELP +BEFB;BEFB;1108 1166 11B6;BEFB;1108 1166 11B6; # (뻻; 뻻; 뻻; 뻻; 뻻; ) HANGUL SYLLABLE BBELH +BEFC;BEFC;1108 1166 11B7;BEFC;1108 1166 11B7; # (뻼; 뻼; 뻼; 뻼; 뻼; ) HANGUL SYLLABLE BBEM +BEFD;BEFD;1108 1166 11B8;BEFD;1108 1166 11B8; # (뻽; 뻽; 뻽; 뻽; 뻽; ) HANGUL SYLLABLE BBEB +BEFE;BEFE;1108 1166 11B9;BEFE;1108 1166 11B9; # (뻾; 뻾; 뻾; 뻾; 뻾; ) HANGUL SYLLABLE BBEBS +BEFF;BEFF;1108 1166 11BA;BEFF;1108 1166 11BA; # (뻿; 뻿; 뻿; 뻿; 뻿; ) HANGUL SYLLABLE BBES +BF00;BF00;1108 1166 11BB;BF00;1108 1166 11BB; # (뼀; 뼀; 뼀; 뼀; 뼀; ) HANGUL SYLLABLE BBESS +BF01;BF01;1108 1166 11BC;BF01;1108 1166 11BC; # (뼁; 뼁; 뼁; 뼁; 뼁; ) HANGUL SYLLABLE BBENG +BF02;BF02;1108 1166 11BD;BF02;1108 1166 11BD; # (뼂; 뼂; 뼂; 뼂; 뼂; ) HANGUL SYLLABLE BBEJ +BF03;BF03;1108 1166 11BE;BF03;1108 1166 11BE; # (뼃; 뼃; 뼃; 뼃; 뼃; ) HANGUL SYLLABLE BBEC +BF04;BF04;1108 1166 11BF;BF04;1108 1166 11BF; # (뼄; 뼄; 뼄; 뼄; 뼄; ) HANGUL SYLLABLE BBEK +BF05;BF05;1108 1166 11C0;BF05;1108 1166 11C0; # (뼅; 뼅; 뼅; 뼅; 뼅; ) HANGUL SYLLABLE BBET +BF06;BF06;1108 1166 11C1;BF06;1108 1166 11C1; # (뼆; 뼆; 뼆; 뼆; 뼆; ) HANGUL SYLLABLE BBEP +BF07;BF07;1108 1166 11C2;BF07;1108 1166 11C2; # (뼇; 뼇; 뼇; 뼇; 뼇; ) HANGUL SYLLABLE BBEH +BF08;BF08;1108 1167;BF08;1108 1167; # (뼈; 뼈; 뼈; 뼈; 뼈; ) HANGUL SYLLABLE BBYEO +BF09;BF09;1108 1167 11A8;BF09;1108 1167 11A8; # (뼉; 뼉; 뼉; 뼉; 뼉; ) HANGUL SYLLABLE BBYEOG +BF0A;BF0A;1108 1167 11A9;BF0A;1108 1167 11A9; # (뼊; 뼊; 뼊; 뼊; 뼊; ) HANGUL SYLLABLE BBYEOGG +BF0B;BF0B;1108 1167 11AA;BF0B;1108 1167 11AA; # (뼋; 뼋; 뼋; 뼋; 뼋; ) HANGUL SYLLABLE BBYEOGS +BF0C;BF0C;1108 1167 11AB;BF0C;1108 1167 11AB; # (뼌; 뼌; 뼌; 뼌; 뼌; ) HANGUL SYLLABLE BBYEON +BF0D;BF0D;1108 1167 11AC;BF0D;1108 1167 11AC; # (뼍; 뼍; 뼍; 뼍; 뼍; ) HANGUL SYLLABLE BBYEONJ +BF0E;BF0E;1108 1167 11AD;BF0E;1108 1167 11AD; # (뼎; 뼎; 뼎; 뼎; 뼎; ) HANGUL SYLLABLE BBYEONH +BF0F;BF0F;1108 1167 11AE;BF0F;1108 1167 11AE; # (뼏; 뼏; 뼏; 뼏; 뼏; ) HANGUL SYLLABLE BBYEOD +BF10;BF10;1108 1167 11AF;BF10;1108 1167 11AF; # (뼐; 뼐; 뼐; 뼐; 뼐; ) HANGUL SYLLABLE BBYEOL +BF11;BF11;1108 1167 11B0;BF11;1108 1167 11B0; # (뼑; 뼑; 뼑; 뼑; 뼑; ) HANGUL SYLLABLE BBYEOLG +BF12;BF12;1108 1167 11B1;BF12;1108 1167 11B1; # (뼒; 뼒; 뼒; 뼒; 뼒; ) HANGUL SYLLABLE BBYEOLM +BF13;BF13;1108 1167 11B2;BF13;1108 1167 11B2; # (뼓; 뼓; 뼓; 뼓; 뼓; ) HANGUL SYLLABLE BBYEOLB +BF14;BF14;1108 1167 11B3;BF14;1108 1167 11B3; # (뼔; 뼔; 뼔; 뼔; 뼔; ) HANGUL SYLLABLE BBYEOLS +BF15;BF15;1108 1167 11B4;BF15;1108 1167 11B4; # (뼕; 뼕; 뼕; 뼕; 뼕; ) HANGUL SYLLABLE BBYEOLT +BF16;BF16;1108 1167 11B5;BF16;1108 1167 11B5; # (뼖; 뼖; 뼖; 뼖; 뼖; ) HANGUL SYLLABLE BBYEOLP +BF17;BF17;1108 1167 11B6;BF17;1108 1167 11B6; # (뼗; 뼗; 뼗; 뼗; 뼗; ) HANGUL SYLLABLE BBYEOLH +BF18;BF18;1108 1167 11B7;BF18;1108 1167 11B7; # (뼘; 뼘; 뼘; 뼘; 뼘; ) HANGUL SYLLABLE BBYEOM +BF19;BF19;1108 1167 11B8;BF19;1108 1167 11B8; # (뼙; 뼙; 뼙; 뼙; 뼙; ) HANGUL SYLLABLE BBYEOB +BF1A;BF1A;1108 1167 11B9;BF1A;1108 1167 11B9; # (뼚; 뼚; 뼚; 뼚; 뼚; ) HANGUL SYLLABLE BBYEOBS +BF1B;BF1B;1108 1167 11BA;BF1B;1108 1167 11BA; # (뼛; 뼛; 뼛; 뼛; 뼛; ) HANGUL SYLLABLE BBYEOS +BF1C;BF1C;1108 1167 11BB;BF1C;1108 1167 11BB; # (뼜; 뼜; 뼜; 뼜; 뼜; ) HANGUL SYLLABLE BBYEOSS +BF1D;BF1D;1108 1167 11BC;BF1D;1108 1167 11BC; # (뼝; 뼝; 뼝; 뼝; 뼝; ) HANGUL SYLLABLE BBYEONG +BF1E;BF1E;1108 1167 11BD;BF1E;1108 1167 11BD; # (뼞; 뼞; 뼞; 뼞; 뼞; ) HANGUL SYLLABLE BBYEOJ +BF1F;BF1F;1108 1167 11BE;BF1F;1108 1167 11BE; # (뼟; 뼟; 뼟; 뼟; 뼟; ) HANGUL SYLLABLE BBYEOC +BF20;BF20;1108 1167 11BF;BF20;1108 1167 11BF; # (뼠; 뼠; 뼠; 뼠; 뼠; ) HANGUL SYLLABLE BBYEOK +BF21;BF21;1108 1167 11C0;BF21;1108 1167 11C0; # (뼡; 뼡; 뼡; 뼡; 뼡; ) HANGUL SYLLABLE BBYEOT +BF22;BF22;1108 1167 11C1;BF22;1108 1167 11C1; # (뼢; 뼢; 뼢; 뼢; 뼢; ) HANGUL SYLLABLE BBYEOP +BF23;BF23;1108 1167 11C2;BF23;1108 1167 11C2; # (뼣; 뼣; 뼣; 뼣; 뼣; ) HANGUL SYLLABLE BBYEOH +BF24;BF24;1108 1168;BF24;1108 1168; # (뼤; 뼤; 뼤; 뼤; 뼤; ) HANGUL SYLLABLE BBYE +BF25;BF25;1108 1168 11A8;BF25;1108 1168 11A8; # (뼥; 뼥; 뼥; 뼥; 뼥; ) HANGUL SYLLABLE BBYEG +BF26;BF26;1108 1168 11A9;BF26;1108 1168 11A9; # (뼦; 뼦; 뼦; 뼦; 뼦; ) HANGUL SYLLABLE BBYEGG +BF27;BF27;1108 1168 11AA;BF27;1108 1168 11AA; # (뼧; 뼧; 뼧; 뼧; 뼧; ) HANGUL SYLLABLE BBYEGS +BF28;BF28;1108 1168 11AB;BF28;1108 1168 11AB; # (뼨; 뼨; 뼨; 뼨; 뼨; ) HANGUL SYLLABLE BBYEN +BF29;BF29;1108 1168 11AC;BF29;1108 1168 11AC; # (뼩; 뼩; 뼩; 뼩; 뼩; ) HANGUL SYLLABLE BBYENJ +BF2A;BF2A;1108 1168 11AD;BF2A;1108 1168 11AD; # (뼪; 뼪; 뼪; 뼪; 뼪; ) HANGUL SYLLABLE BBYENH +BF2B;BF2B;1108 1168 11AE;BF2B;1108 1168 11AE; # (뼫; 뼫; 뼫; 뼫; 뼫; ) HANGUL SYLLABLE BBYED +BF2C;BF2C;1108 1168 11AF;BF2C;1108 1168 11AF; # (뼬; 뼬; 뼬; 뼬; 뼬; ) HANGUL SYLLABLE BBYEL +BF2D;BF2D;1108 1168 11B0;BF2D;1108 1168 11B0; # (뼭; 뼭; 뼭; 뼭; 뼭; ) HANGUL SYLLABLE BBYELG +BF2E;BF2E;1108 1168 11B1;BF2E;1108 1168 11B1; # (뼮; 뼮; 뼮; 뼮; 뼮; ) HANGUL SYLLABLE BBYELM +BF2F;BF2F;1108 1168 11B2;BF2F;1108 1168 11B2; # (뼯; 뼯; 뼯; 뼯; 뼯; ) HANGUL SYLLABLE BBYELB +BF30;BF30;1108 1168 11B3;BF30;1108 1168 11B3; # (뼰; 뼰; 뼰; 뼰; 뼰; ) HANGUL SYLLABLE BBYELS +BF31;BF31;1108 1168 11B4;BF31;1108 1168 11B4; # (뼱; 뼱; 뼱; 뼱; 뼱; ) HANGUL SYLLABLE BBYELT +BF32;BF32;1108 1168 11B5;BF32;1108 1168 11B5; # (뼲; 뼲; 뼲; 뼲; 뼲; ) HANGUL SYLLABLE BBYELP +BF33;BF33;1108 1168 11B6;BF33;1108 1168 11B6; # (뼳; 뼳; 뼳; 뼳; 뼳; ) HANGUL SYLLABLE BBYELH +BF34;BF34;1108 1168 11B7;BF34;1108 1168 11B7; # (뼴; 뼴; 뼴; 뼴; 뼴; ) HANGUL SYLLABLE BBYEM +BF35;BF35;1108 1168 11B8;BF35;1108 1168 11B8; # (뼵; 뼵; 뼵; 뼵; 뼵; ) HANGUL SYLLABLE BBYEB +BF36;BF36;1108 1168 11B9;BF36;1108 1168 11B9; # (뼶; 뼶; 뼶; 뼶; 뼶; ) HANGUL SYLLABLE BBYEBS +BF37;BF37;1108 1168 11BA;BF37;1108 1168 11BA; # (뼷; 뼷; 뼷; 뼷; 뼷; ) HANGUL SYLLABLE BBYES +BF38;BF38;1108 1168 11BB;BF38;1108 1168 11BB; # (뼸; 뼸; 뼸; 뼸; 뼸; ) HANGUL SYLLABLE BBYESS +BF39;BF39;1108 1168 11BC;BF39;1108 1168 11BC; # (뼹; 뼹; 뼹; 뼹; 뼹; ) HANGUL SYLLABLE BBYENG +BF3A;BF3A;1108 1168 11BD;BF3A;1108 1168 11BD; # (뼺; 뼺; 뼺; 뼺; 뼺; ) HANGUL SYLLABLE BBYEJ +BF3B;BF3B;1108 1168 11BE;BF3B;1108 1168 11BE; # (뼻; 뼻; 뼻; 뼻; 뼻; ) HANGUL SYLLABLE BBYEC +BF3C;BF3C;1108 1168 11BF;BF3C;1108 1168 11BF; # (뼼; 뼼; 뼼; 뼼; 뼼; ) HANGUL SYLLABLE BBYEK +BF3D;BF3D;1108 1168 11C0;BF3D;1108 1168 11C0; # (뼽; 뼽; 뼽; 뼽; 뼽; ) HANGUL SYLLABLE BBYET +BF3E;BF3E;1108 1168 11C1;BF3E;1108 1168 11C1; # (뼾; 뼾; 뼾; 뼾; 뼾; ) HANGUL SYLLABLE BBYEP +BF3F;BF3F;1108 1168 11C2;BF3F;1108 1168 11C2; # (뼿; 뼿; 뼿; 뼿; 뼿; ) HANGUL SYLLABLE BBYEH +BF40;BF40;1108 1169;BF40;1108 1169; # (뽀; 뽀; 뽀; 뽀; 뽀; ) HANGUL SYLLABLE BBO +BF41;BF41;1108 1169 11A8;BF41;1108 1169 11A8; # (뽁; 뽁; 뽁; 뽁; 뽁; ) HANGUL SYLLABLE BBOG +BF42;BF42;1108 1169 11A9;BF42;1108 1169 11A9; # (뽂; 뽂; 뽂; 뽂; 뽂; ) HANGUL SYLLABLE BBOGG +BF43;BF43;1108 1169 11AA;BF43;1108 1169 11AA; # (뽃; 뽃; 뽃; 뽃; 뽃; ) HANGUL SYLLABLE BBOGS +BF44;BF44;1108 1169 11AB;BF44;1108 1169 11AB; # (뽄; 뽄; 뽄; 뽄; 뽄; ) HANGUL SYLLABLE BBON +BF45;BF45;1108 1169 11AC;BF45;1108 1169 11AC; # (뽅; 뽅; 뽅; 뽅; 뽅; ) HANGUL SYLLABLE BBONJ +BF46;BF46;1108 1169 11AD;BF46;1108 1169 11AD; # (뽆; 뽆; 뽆; 뽆; 뽆; ) HANGUL SYLLABLE BBONH +BF47;BF47;1108 1169 11AE;BF47;1108 1169 11AE; # (뽇; 뽇; 뽇; 뽇; 뽇; ) HANGUL SYLLABLE BBOD +BF48;BF48;1108 1169 11AF;BF48;1108 1169 11AF; # (뽈; 뽈; 뽈; 뽈; 뽈; ) HANGUL SYLLABLE BBOL +BF49;BF49;1108 1169 11B0;BF49;1108 1169 11B0; # (뽉; 뽉; 뽉; 뽉; 뽉; ) HANGUL SYLLABLE BBOLG +BF4A;BF4A;1108 1169 11B1;BF4A;1108 1169 11B1; # (뽊; 뽊; 뽊; 뽊; 뽊; ) HANGUL SYLLABLE BBOLM +BF4B;BF4B;1108 1169 11B2;BF4B;1108 1169 11B2; # (뽋; 뽋; 뽋; 뽋; 뽋; ) HANGUL SYLLABLE BBOLB +BF4C;BF4C;1108 1169 11B3;BF4C;1108 1169 11B3; # (뽌; 뽌; 뽌; 뽌; 뽌; ) HANGUL SYLLABLE BBOLS +BF4D;BF4D;1108 1169 11B4;BF4D;1108 1169 11B4; # (뽍; 뽍; 뽍; 뽍; 뽍; ) HANGUL SYLLABLE BBOLT +BF4E;BF4E;1108 1169 11B5;BF4E;1108 1169 11B5; # (뽎; 뽎; 뽎; 뽎; 뽎; ) HANGUL SYLLABLE BBOLP +BF4F;BF4F;1108 1169 11B6;BF4F;1108 1169 11B6; # (뽏; 뽏; 뽏; 뽏; 뽏; ) HANGUL SYLLABLE BBOLH +BF50;BF50;1108 1169 11B7;BF50;1108 1169 11B7; # (뽐; 뽐; 뽐; 뽐; 뽐; ) HANGUL SYLLABLE BBOM +BF51;BF51;1108 1169 11B8;BF51;1108 1169 11B8; # (뽑; 뽑; 뽑; 뽑; 뽑; ) HANGUL SYLLABLE BBOB +BF52;BF52;1108 1169 11B9;BF52;1108 1169 11B9; # (뽒; 뽒; 뽒; 뽒; 뽒; ) HANGUL SYLLABLE BBOBS +BF53;BF53;1108 1169 11BA;BF53;1108 1169 11BA; # (뽓; 뽓; 뽓; 뽓; 뽓; ) HANGUL SYLLABLE BBOS +BF54;BF54;1108 1169 11BB;BF54;1108 1169 11BB; # (뽔; 뽔; 뽔; 뽔; 뽔; ) HANGUL SYLLABLE BBOSS +BF55;BF55;1108 1169 11BC;BF55;1108 1169 11BC; # (뽕; 뽕; 뽕; 뽕; 뽕; ) HANGUL SYLLABLE BBONG +BF56;BF56;1108 1169 11BD;BF56;1108 1169 11BD; # (뽖; 뽖; 뽖; 뽖; 뽖; ) HANGUL SYLLABLE BBOJ +BF57;BF57;1108 1169 11BE;BF57;1108 1169 11BE; # (뽗; 뽗; 뽗; 뽗; 뽗; ) HANGUL SYLLABLE BBOC +BF58;BF58;1108 1169 11BF;BF58;1108 1169 11BF; # (뽘; 뽘; 뽘; 뽘; 뽘; ) HANGUL SYLLABLE BBOK +BF59;BF59;1108 1169 11C0;BF59;1108 1169 11C0; # (뽙; 뽙; 뽙; 뽙; 뽙; ) HANGUL SYLLABLE BBOT +BF5A;BF5A;1108 1169 11C1;BF5A;1108 1169 11C1; # (뽚; 뽚; 뽚; 뽚; 뽚; ) HANGUL SYLLABLE BBOP +BF5B;BF5B;1108 1169 11C2;BF5B;1108 1169 11C2; # (뽛; 뽛; 뽛; 뽛; 뽛; ) HANGUL SYLLABLE BBOH +BF5C;BF5C;1108 116A;BF5C;1108 116A; # (뽜; 뽜; 뽜; 뽜; 뽜; ) HANGUL SYLLABLE BBWA +BF5D;BF5D;1108 116A 11A8;BF5D;1108 116A 11A8; # (뽝; 뽝; 뽝; 뽝; 뽝; ) HANGUL SYLLABLE BBWAG +BF5E;BF5E;1108 116A 11A9;BF5E;1108 116A 11A9; # (뽞; 뽞; 뽞; 뽞; 뽞; ) HANGUL SYLLABLE BBWAGG +BF5F;BF5F;1108 116A 11AA;BF5F;1108 116A 11AA; # (뽟; 뽟; 뽟; 뽟; 뽟; ) HANGUL SYLLABLE BBWAGS +BF60;BF60;1108 116A 11AB;BF60;1108 116A 11AB; # (뽠; 뽠; 뽠; 뽠; 뽠; ) HANGUL SYLLABLE BBWAN +BF61;BF61;1108 116A 11AC;BF61;1108 116A 11AC; # (뽡; 뽡; 뽡; 뽡; 뽡; ) HANGUL SYLLABLE BBWANJ +BF62;BF62;1108 116A 11AD;BF62;1108 116A 11AD; # (뽢; 뽢; 뽢; 뽢; 뽢; ) HANGUL SYLLABLE BBWANH +BF63;BF63;1108 116A 11AE;BF63;1108 116A 11AE; # (뽣; 뽣; 뽣; 뽣; 뽣; ) HANGUL SYLLABLE BBWAD +BF64;BF64;1108 116A 11AF;BF64;1108 116A 11AF; # (뽤; 뽤; 뽤; 뽤; 뽤; ) HANGUL SYLLABLE BBWAL +BF65;BF65;1108 116A 11B0;BF65;1108 116A 11B0; # (뽥; 뽥; 뽥; 뽥; 뽥; ) HANGUL SYLLABLE BBWALG +BF66;BF66;1108 116A 11B1;BF66;1108 116A 11B1; # (뽦; 뽦; 뽦; 뽦; 뽦; ) HANGUL SYLLABLE BBWALM +BF67;BF67;1108 116A 11B2;BF67;1108 116A 11B2; # (뽧; 뽧; 뽧; 뽧; 뽧; ) HANGUL SYLLABLE BBWALB +BF68;BF68;1108 116A 11B3;BF68;1108 116A 11B3; # (뽨; 뽨; 뽨; 뽨; 뽨; ) HANGUL SYLLABLE BBWALS +BF69;BF69;1108 116A 11B4;BF69;1108 116A 11B4; # (뽩; 뽩; 뽩; 뽩; 뽩; ) HANGUL SYLLABLE BBWALT +BF6A;BF6A;1108 116A 11B5;BF6A;1108 116A 11B5; # (뽪; 뽪; 뽪; 뽪; 뽪; ) HANGUL SYLLABLE BBWALP +BF6B;BF6B;1108 116A 11B6;BF6B;1108 116A 11B6; # (뽫; 뽫; 뽫; 뽫; 뽫; ) HANGUL SYLLABLE BBWALH +BF6C;BF6C;1108 116A 11B7;BF6C;1108 116A 11B7; # (뽬; 뽬; 뽬; 뽬; 뽬; ) HANGUL SYLLABLE BBWAM +BF6D;BF6D;1108 116A 11B8;BF6D;1108 116A 11B8; # (뽭; 뽭; 뽭; 뽭; 뽭; ) HANGUL SYLLABLE BBWAB +BF6E;BF6E;1108 116A 11B9;BF6E;1108 116A 11B9; # (뽮; 뽮; 뽮; 뽮; 뽮; ) HANGUL SYLLABLE BBWABS +BF6F;BF6F;1108 116A 11BA;BF6F;1108 116A 11BA; # (뽯; 뽯; 뽯; 뽯; 뽯; ) HANGUL SYLLABLE BBWAS +BF70;BF70;1108 116A 11BB;BF70;1108 116A 11BB; # (뽰; 뽰; 뽰; 뽰; 뽰; ) HANGUL SYLLABLE BBWASS +BF71;BF71;1108 116A 11BC;BF71;1108 116A 11BC; # (뽱; 뽱; 뽱; 뽱; 뽱; ) HANGUL SYLLABLE BBWANG +BF72;BF72;1108 116A 11BD;BF72;1108 116A 11BD; # (뽲; 뽲; 뽲; 뽲; 뽲; ) HANGUL SYLLABLE BBWAJ +BF73;BF73;1108 116A 11BE;BF73;1108 116A 11BE; # (뽳; 뽳; 뽳; 뽳; 뽳; ) HANGUL SYLLABLE BBWAC +BF74;BF74;1108 116A 11BF;BF74;1108 116A 11BF; # (뽴; 뽴; 뽴; 뽴; 뽴; ) HANGUL SYLLABLE BBWAK +BF75;BF75;1108 116A 11C0;BF75;1108 116A 11C0; # (뽵; 뽵; 뽵; 뽵; 뽵; ) HANGUL SYLLABLE BBWAT +BF76;BF76;1108 116A 11C1;BF76;1108 116A 11C1; # (뽶; 뽶; 뽶; 뽶; 뽶; ) HANGUL SYLLABLE BBWAP +BF77;BF77;1108 116A 11C2;BF77;1108 116A 11C2; # (뽷; 뽷; 뽷; 뽷; 뽷; ) HANGUL SYLLABLE BBWAH +BF78;BF78;1108 116B;BF78;1108 116B; # (뽸; 뽸; 뽸; 뽸; 뽸; ) HANGUL SYLLABLE BBWAE +BF79;BF79;1108 116B 11A8;BF79;1108 116B 11A8; # (뽹; 뽹; 뽹; 뽹; 뽹; ) HANGUL SYLLABLE BBWAEG +BF7A;BF7A;1108 116B 11A9;BF7A;1108 116B 11A9; # (뽺; 뽺; 뽺; 뽺; 뽺; ) HANGUL SYLLABLE BBWAEGG +BF7B;BF7B;1108 116B 11AA;BF7B;1108 116B 11AA; # (뽻; 뽻; 뽻; 뽻; 뽻; ) HANGUL SYLLABLE BBWAEGS +BF7C;BF7C;1108 116B 11AB;BF7C;1108 116B 11AB; # (뽼; 뽼; 뽼; 뽼; 뽼; ) HANGUL SYLLABLE BBWAEN +BF7D;BF7D;1108 116B 11AC;BF7D;1108 116B 11AC; # (뽽; 뽽; 뽽; 뽽; 뽽; ) HANGUL SYLLABLE BBWAENJ +BF7E;BF7E;1108 116B 11AD;BF7E;1108 116B 11AD; # (뽾; 뽾; 뽾; 뽾; 뽾; ) HANGUL SYLLABLE BBWAENH +BF7F;BF7F;1108 116B 11AE;BF7F;1108 116B 11AE; # (뽿; 뽿; 뽿; 뽿; 뽿; ) HANGUL SYLLABLE BBWAED +BF80;BF80;1108 116B 11AF;BF80;1108 116B 11AF; # (뾀; 뾀; 뾀; 뾀; 뾀; ) HANGUL SYLLABLE BBWAEL +BF81;BF81;1108 116B 11B0;BF81;1108 116B 11B0; # (뾁; 뾁; 뾁; 뾁; 뾁; ) HANGUL SYLLABLE BBWAELG +BF82;BF82;1108 116B 11B1;BF82;1108 116B 11B1; # (뾂; 뾂; 뾂; 뾂; 뾂; ) HANGUL SYLLABLE BBWAELM +BF83;BF83;1108 116B 11B2;BF83;1108 116B 11B2; # (뾃; 뾃; 뾃; 뾃; 뾃; ) HANGUL SYLLABLE BBWAELB +BF84;BF84;1108 116B 11B3;BF84;1108 116B 11B3; # (뾄; 뾄; 뾄; 뾄; 뾄; ) HANGUL SYLLABLE BBWAELS +BF85;BF85;1108 116B 11B4;BF85;1108 116B 11B4; # (뾅; 뾅; 뾅; 뾅; 뾅; ) HANGUL SYLLABLE BBWAELT +BF86;BF86;1108 116B 11B5;BF86;1108 116B 11B5; # (뾆; 뾆; 뾆; 뾆; 뾆; ) HANGUL SYLLABLE BBWAELP +BF87;BF87;1108 116B 11B6;BF87;1108 116B 11B6; # (뾇; 뾇; 뾇; 뾇; 뾇; ) HANGUL SYLLABLE BBWAELH +BF88;BF88;1108 116B 11B7;BF88;1108 116B 11B7; # (뾈; 뾈; 뾈; 뾈; 뾈; ) HANGUL SYLLABLE BBWAEM +BF89;BF89;1108 116B 11B8;BF89;1108 116B 11B8; # (뾉; 뾉; 뾉; 뾉; 뾉; ) HANGUL SYLLABLE BBWAEB +BF8A;BF8A;1108 116B 11B9;BF8A;1108 116B 11B9; # (뾊; 뾊; 뾊; 뾊; 뾊; ) HANGUL SYLLABLE BBWAEBS +BF8B;BF8B;1108 116B 11BA;BF8B;1108 116B 11BA; # (뾋; 뾋; 뾋; 뾋; 뾋; ) HANGUL SYLLABLE BBWAES +BF8C;BF8C;1108 116B 11BB;BF8C;1108 116B 11BB; # (뾌; 뾌; 뾌; 뾌; 뾌; ) HANGUL SYLLABLE BBWAESS +BF8D;BF8D;1108 116B 11BC;BF8D;1108 116B 11BC; # (뾍; 뾍; 뾍; 뾍; 뾍; ) HANGUL SYLLABLE BBWAENG +BF8E;BF8E;1108 116B 11BD;BF8E;1108 116B 11BD; # (뾎; 뾎; 뾎; 뾎; 뾎; ) HANGUL SYLLABLE BBWAEJ +BF8F;BF8F;1108 116B 11BE;BF8F;1108 116B 11BE; # (뾏; 뾏; 뾏; 뾏; 뾏; ) HANGUL SYLLABLE BBWAEC +BF90;BF90;1108 116B 11BF;BF90;1108 116B 11BF; # (뾐; 뾐; 뾐; 뾐; 뾐; ) HANGUL SYLLABLE BBWAEK +BF91;BF91;1108 116B 11C0;BF91;1108 116B 11C0; # (뾑; 뾑; 뾑; 뾑; 뾑; ) HANGUL SYLLABLE BBWAET +BF92;BF92;1108 116B 11C1;BF92;1108 116B 11C1; # (뾒; 뾒; 뾒; 뾒; 뾒; ) HANGUL SYLLABLE BBWAEP +BF93;BF93;1108 116B 11C2;BF93;1108 116B 11C2; # (뾓; 뾓; 뾓; 뾓; 뾓; ) HANGUL SYLLABLE BBWAEH +BF94;BF94;1108 116C;BF94;1108 116C; # (뾔; 뾔; 뾔; 뾔; 뾔; ) HANGUL SYLLABLE BBOE +BF95;BF95;1108 116C 11A8;BF95;1108 116C 11A8; # (뾕; 뾕; 뾕; 뾕; 뾕; ) HANGUL SYLLABLE BBOEG +BF96;BF96;1108 116C 11A9;BF96;1108 116C 11A9; # (뾖; 뾖; 뾖; 뾖; 뾖; ) HANGUL SYLLABLE BBOEGG +BF97;BF97;1108 116C 11AA;BF97;1108 116C 11AA; # (뾗; 뾗; 뾗; 뾗; 뾗; ) HANGUL SYLLABLE BBOEGS +BF98;BF98;1108 116C 11AB;BF98;1108 116C 11AB; # (뾘; 뾘; 뾘; 뾘; 뾘; ) HANGUL SYLLABLE BBOEN +BF99;BF99;1108 116C 11AC;BF99;1108 116C 11AC; # (뾙; 뾙; 뾙; 뾙; 뾙; ) HANGUL SYLLABLE BBOENJ +BF9A;BF9A;1108 116C 11AD;BF9A;1108 116C 11AD; # (뾚; 뾚; 뾚; 뾚; 뾚; ) HANGUL SYLLABLE BBOENH +BF9B;BF9B;1108 116C 11AE;BF9B;1108 116C 11AE; # (뾛; 뾛; 뾛; 뾛; 뾛; ) HANGUL SYLLABLE BBOED +BF9C;BF9C;1108 116C 11AF;BF9C;1108 116C 11AF; # (뾜; 뾜; 뾜; 뾜; 뾜; ) HANGUL SYLLABLE BBOEL +BF9D;BF9D;1108 116C 11B0;BF9D;1108 116C 11B0; # (뾝; 뾝; 뾝; 뾝; 뾝; ) HANGUL SYLLABLE BBOELG +BF9E;BF9E;1108 116C 11B1;BF9E;1108 116C 11B1; # (뾞; 뾞; 뾞; 뾞; 뾞; ) HANGUL SYLLABLE BBOELM +BF9F;BF9F;1108 116C 11B2;BF9F;1108 116C 11B2; # (뾟; 뾟; 뾟; 뾟; 뾟; ) HANGUL SYLLABLE BBOELB +BFA0;BFA0;1108 116C 11B3;BFA0;1108 116C 11B3; # (뾠; 뾠; 뾠; 뾠; 뾠; ) HANGUL SYLLABLE BBOELS +BFA1;BFA1;1108 116C 11B4;BFA1;1108 116C 11B4; # (뾡; 뾡; 뾡; 뾡; 뾡; ) HANGUL SYLLABLE BBOELT +BFA2;BFA2;1108 116C 11B5;BFA2;1108 116C 11B5; # (뾢; 뾢; 뾢; 뾢; 뾢; ) HANGUL SYLLABLE BBOELP +BFA3;BFA3;1108 116C 11B6;BFA3;1108 116C 11B6; # (뾣; 뾣; 뾣; 뾣; 뾣; ) HANGUL SYLLABLE BBOELH +BFA4;BFA4;1108 116C 11B7;BFA4;1108 116C 11B7; # (뾤; 뾤; 뾤; 뾤; 뾤; ) HANGUL SYLLABLE BBOEM +BFA5;BFA5;1108 116C 11B8;BFA5;1108 116C 11B8; # (뾥; 뾥; 뾥; 뾥; 뾥; ) HANGUL SYLLABLE BBOEB +BFA6;BFA6;1108 116C 11B9;BFA6;1108 116C 11B9; # (뾦; 뾦; 뾦; 뾦; 뾦; ) HANGUL SYLLABLE BBOEBS +BFA7;BFA7;1108 116C 11BA;BFA7;1108 116C 11BA; # (뾧; 뾧; 뾧; 뾧; 뾧; ) HANGUL SYLLABLE BBOES +BFA8;BFA8;1108 116C 11BB;BFA8;1108 116C 11BB; # (뾨; 뾨; 뾨; 뾨; 뾨; ) HANGUL SYLLABLE BBOESS +BFA9;BFA9;1108 116C 11BC;BFA9;1108 116C 11BC; # (뾩; 뾩; 뾩; 뾩; 뾩; ) HANGUL SYLLABLE BBOENG +BFAA;BFAA;1108 116C 11BD;BFAA;1108 116C 11BD; # (뾪; 뾪; 뾪; 뾪; 뾪; ) HANGUL SYLLABLE BBOEJ +BFAB;BFAB;1108 116C 11BE;BFAB;1108 116C 11BE; # (뾫; 뾫; 뾫; 뾫; 뾫; ) HANGUL SYLLABLE BBOEC +BFAC;BFAC;1108 116C 11BF;BFAC;1108 116C 11BF; # (뾬; 뾬; 뾬; 뾬; 뾬; ) HANGUL SYLLABLE BBOEK +BFAD;BFAD;1108 116C 11C0;BFAD;1108 116C 11C0; # (뾭; 뾭; 뾭; 뾭; 뾭; ) HANGUL SYLLABLE BBOET +BFAE;BFAE;1108 116C 11C1;BFAE;1108 116C 11C1; # (뾮; 뾮; 뾮; 뾮; 뾮; ) HANGUL SYLLABLE BBOEP +BFAF;BFAF;1108 116C 11C2;BFAF;1108 116C 11C2; # (뾯; 뾯; 뾯; 뾯; 뾯; ) HANGUL SYLLABLE BBOEH +BFB0;BFB0;1108 116D;BFB0;1108 116D; # (뾰; 뾰; 뾰; 뾰; 뾰; ) HANGUL SYLLABLE BBYO +BFB1;BFB1;1108 116D 11A8;BFB1;1108 116D 11A8; # (뾱; 뾱; 뾱; 뾱; 뾱; ) HANGUL SYLLABLE BBYOG +BFB2;BFB2;1108 116D 11A9;BFB2;1108 116D 11A9; # (뾲; 뾲; 뾲; 뾲; 뾲; ) HANGUL SYLLABLE BBYOGG +BFB3;BFB3;1108 116D 11AA;BFB3;1108 116D 11AA; # (뾳; 뾳; 뾳; 뾳; 뾳; ) HANGUL SYLLABLE BBYOGS +BFB4;BFB4;1108 116D 11AB;BFB4;1108 116D 11AB; # (뾴; 뾴; 뾴; 뾴; 뾴; ) HANGUL SYLLABLE BBYON +BFB5;BFB5;1108 116D 11AC;BFB5;1108 116D 11AC; # (뾵; 뾵; 뾵; 뾵; 뾵; ) HANGUL SYLLABLE BBYONJ +BFB6;BFB6;1108 116D 11AD;BFB6;1108 116D 11AD; # (뾶; 뾶; 뾶; 뾶; 뾶; ) HANGUL SYLLABLE BBYONH +BFB7;BFB7;1108 116D 11AE;BFB7;1108 116D 11AE; # (뾷; 뾷; 뾷; 뾷; 뾷; ) HANGUL SYLLABLE BBYOD +BFB8;BFB8;1108 116D 11AF;BFB8;1108 116D 11AF; # (뾸; 뾸; 뾸; 뾸; 뾸; ) HANGUL SYLLABLE BBYOL +BFB9;BFB9;1108 116D 11B0;BFB9;1108 116D 11B0; # (뾹; 뾹; 뾹; 뾹; 뾹; ) HANGUL SYLLABLE BBYOLG +BFBA;BFBA;1108 116D 11B1;BFBA;1108 116D 11B1; # (뾺; 뾺; 뾺; 뾺; 뾺; ) HANGUL SYLLABLE BBYOLM +BFBB;BFBB;1108 116D 11B2;BFBB;1108 116D 11B2; # (뾻; 뾻; 뾻; 뾻; 뾻; ) HANGUL SYLLABLE BBYOLB +BFBC;BFBC;1108 116D 11B3;BFBC;1108 116D 11B3; # (뾼; 뾼; 뾼; 뾼; 뾼; ) HANGUL SYLLABLE BBYOLS +BFBD;BFBD;1108 116D 11B4;BFBD;1108 116D 11B4; # (뾽; 뾽; 뾽; 뾽; 뾽; ) HANGUL SYLLABLE BBYOLT +BFBE;BFBE;1108 116D 11B5;BFBE;1108 116D 11B5; # (뾾; 뾾; 뾾; 뾾; 뾾; ) HANGUL SYLLABLE BBYOLP +BFBF;BFBF;1108 116D 11B6;BFBF;1108 116D 11B6; # (뾿; 뾿; 뾿; 뾿; 뾿; ) HANGUL SYLLABLE BBYOLH +BFC0;BFC0;1108 116D 11B7;BFC0;1108 116D 11B7; # (뿀; 뿀; 뿀; 뿀; 뿀; ) HANGUL SYLLABLE BBYOM +BFC1;BFC1;1108 116D 11B8;BFC1;1108 116D 11B8; # (뿁; 뿁; 뿁; 뿁; 뿁; ) HANGUL SYLLABLE BBYOB +BFC2;BFC2;1108 116D 11B9;BFC2;1108 116D 11B9; # (뿂; 뿂; 뿂; 뿂; 뿂; ) HANGUL SYLLABLE BBYOBS +BFC3;BFC3;1108 116D 11BA;BFC3;1108 116D 11BA; # (뿃; 뿃; 뿃; 뿃; 뿃; ) HANGUL SYLLABLE BBYOS +BFC4;BFC4;1108 116D 11BB;BFC4;1108 116D 11BB; # (뿄; 뿄; 뿄; 뿄; 뿄; ) HANGUL SYLLABLE BBYOSS +BFC5;BFC5;1108 116D 11BC;BFC5;1108 116D 11BC; # (뿅; 뿅; 뿅; 뿅; 뿅; ) HANGUL SYLLABLE BBYONG +BFC6;BFC6;1108 116D 11BD;BFC6;1108 116D 11BD; # (뿆; 뿆; 뿆; 뿆; 뿆; ) HANGUL SYLLABLE BBYOJ +BFC7;BFC7;1108 116D 11BE;BFC7;1108 116D 11BE; # (뿇; 뿇; 뿇; 뿇; 뿇; ) HANGUL SYLLABLE BBYOC +BFC8;BFC8;1108 116D 11BF;BFC8;1108 116D 11BF; # (뿈; 뿈; 뿈; 뿈; 뿈; ) HANGUL SYLLABLE BBYOK +BFC9;BFC9;1108 116D 11C0;BFC9;1108 116D 11C0; # (뿉; 뿉; 뿉; 뿉; 뿉; ) HANGUL SYLLABLE BBYOT +BFCA;BFCA;1108 116D 11C1;BFCA;1108 116D 11C1; # (뿊; 뿊; 뿊; 뿊; 뿊; ) HANGUL SYLLABLE BBYOP +BFCB;BFCB;1108 116D 11C2;BFCB;1108 116D 11C2; # (뿋; 뿋; 뿋; 뿋; 뿋; ) HANGUL SYLLABLE BBYOH +BFCC;BFCC;1108 116E;BFCC;1108 116E; # (뿌; 뿌; 뿌; 뿌; 뿌; ) HANGUL SYLLABLE BBU +BFCD;BFCD;1108 116E 11A8;BFCD;1108 116E 11A8; # (뿍; 뿍; 뿍; 뿍; 뿍; ) HANGUL SYLLABLE BBUG +BFCE;BFCE;1108 116E 11A9;BFCE;1108 116E 11A9; # (뿎; 뿎; 뿎; 뿎; 뿎; ) HANGUL SYLLABLE BBUGG +BFCF;BFCF;1108 116E 11AA;BFCF;1108 116E 11AA; # (뿏; 뿏; 뿏; 뿏; 뿏; ) HANGUL SYLLABLE BBUGS +BFD0;BFD0;1108 116E 11AB;BFD0;1108 116E 11AB; # (뿐; 뿐; 뿐; 뿐; 뿐; ) HANGUL SYLLABLE BBUN +BFD1;BFD1;1108 116E 11AC;BFD1;1108 116E 11AC; # (뿑; 뿑; 뿑; 뿑; 뿑; ) HANGUL SYLLABLE BBUNJ +BFD2;BFD2;1108 116E 11AD;BFD2;1108 116E 11AD; # (뿒; 뿒; 뿒; 뿒; 뿒; ) HANGUL SYLLABLE BBUNH +BFD3;BFD3;1108 116E 11AE;BFD3;1108 116E 11AE; # (뿓; 뿓; 뿓; 뿓; 뿓; ) HANGUL SYLLABLE BBUD +BFD4;BFD4;1108 116E 11AF;BFD4;1108 116E 11AF; # (뿔; 뿔; 뿔; 뿔; 뿔; ) HANGUL SYLLABLE BBUL +BFD5;BFD5;1108 116E 11B0;BFD5;1108 116E 11B0; # (뿕; 뿕; 뿕; 뿕; 뿕; ) HANGUL SYLLABLE BBULG +BFD6;BFD6;1108 116E 11B1;BFD6;1108 116E 11B1; # (뿖; 뿖; 뿖; 뿖; 뿖; ) HANGUL SYLLABLE BBULM +BFD7;BFD7;1108 116E 11B2;BFD7;1108 116E 11B2; # (뿗; 뿗; 뿗; 뿗; 뿗; ) HANGUL SYLLABLE BBULB +BFD8;BFD8;1108 116E 11B3;BFD8;1108 116E 11B3; # (뿘; 뿘; 뿘; 뿘; 뿘; ) HANGUL SYLLABLE BBULS +BFD9;BFD9;1108 116E 11B4;BFD9;1108 116E 11B4; # (뿙; 뿙; 뿙; 뿙; 뿙; ) HANGUL SYLLABLE BBULT +BFDA;BFDA;1108 116E 11B5;BFDA;1108 116E 11B5; # (뿚; 뿚; 뿚; 뿚; 뿚; ) HANGUL SYLLABLE BBULP +BFDB;BFDB;1108 116E 11B6;BFDB;1108 116E 11B6; # (뿛; 뿛; 뿛; 뿛; 뿛; ) HANGUL SYLLABLE BBULH +BFDC;BFDC;1108 116E 11B7;BFDC;1108 116E 11B7; # (뿜; 뿜; 뿜; 뿜; 뿜; ) HANGUL SYLLABLE BBUM +BFDD;BFDD;1108 116E 11B8;BFDD;1108 116E 11B8; # (뿝; 뿝; 뿝; 뿝; 뿝; ) HANGUL SYLLABLE BBUB +BFDE;BFDE;1108 116E 11B9;BFDE;1108 116E 11B9; # (뿞; 뿞; 뿞; 뿞; 뿞; ) HANGUL SYLLABLE BBUBS +BFDF;BFDF;1108 116E 11BA;BFDF;1108 116E 11BA; # (뿟; 뿟; 뿟; 뿟; 뿟; ) HANGUL SYLLABLE BBUS +BFE0;BFE0;1108 116E 11BB;BFE0;1108 116E 11BB; # (뿠; 뿠; 뿠; 뿠; 뿠; ) HANGUL SYLLABLE BBUSS +BFE1;BFE1;1108 116E 11BC;BFE1;1108 116E 11BC; # (뿡; 뿡; 뿡; 뿡; 뿡; ) HANGUL SYLLABLE BBUNG +BFE2;BFE2;1108 116E 11BD;BFE2;1108 116E 11BD; # (뿢; 뿢; 뿢; 뿢; 뿢; ) HANGUL SYLLABLE BBUJ +BFE3;BFE3;1108 116E 11BE;BFE3;1108 116E 11BE; # (뿣; 뿣; 뿣; 뿣; 뿣; ) HANGUL SYLLABLE BBUC +BFE4;BFE4;1108 116E 11BF;BFE4;1108 116E 11BF; # (뿤; 뿤; 뿤; 뿤; 뿤; ) HANGUL SYLLABLE BBUK +BFE5;BFE5;1108 116E 11C0;BFE5;1108 116E 11C0; # (뿥; 뿥; 뿥; 뿥; 뿥; ) HANGUL SYLLABLE BBUT +BFE6;BFE6;1108 116E 11C1;BFE6;1108 116E 11C1; # (뿦; 뿦; 뿦; 뿦; 뿦; ) HANGUL SYLLABLE BBUP +BFE7;BFE7;1108 116E 11C2;BFE7;1108 116E 11C2; # (뿧; 뿧; 뿧; 뿧; 뿧; ) HANGUL SYLLABLE BBUH +BFE8;BFE8;1108 116F;BFE8;1108 116F; # (뿨; 뿨; 뿨; 뿨; 뿨; ) HANGUL SYLLABLE BBWEO +BFE9;BFE9;1108 116F 11A8;BFE9;1108 116F 11A8; # (뿩; 뿩; 뿩; 뿩; 뿩; ) HANGUL SYLLABLE BBWEOG +BFEA;BFEA;1108 116F 11A9;BFEA;1108 116F 11A9; # (뿪; 뿪; 뿪; 뿪; 뿪; ) HANGUL SYLLABLE BBWEOGG +BFEB;BFEB;1108 116F 11AA;BFEB;1108 116F 11AA; # (뿫; 뿫; 뿫; 뿫; 뿫; ) HANGUL SYLLABLE BBWEOGS +BFEC;BFEC;1108 116F 11AB;BFEC;1108 116F 11AB; # (뿬; 뿬; 뿬; 뿬; 뿬; ) HANGUL SYLLABLE BBWEON +BFED;BFED;1108 116F 11AC;BFED;1108 116F 11AC; # (뿭; 뿭; 뿭; 뿭; 뿭; ) HANGUL SYLLABLE BBWEONJ +BFEE;BFEE;1108 116F 11AD;BFEE;1108 116F 11AD; # (뿮; 뿮; 뿮; 뿮; 뿮; ) HANGUL SYLLABLE BBWEONH +BFEF;BFEF;1108 116F 11AE;BFEF;1108 116F 11AE; # (뿯; 뿯; 뿯; 뿯; 뿯; ) HANGUL SYLLABLE BBWEOD +BFF0;BFF0;1108 116F 11AF;BFF0;1108 116F 11AF; # (뿰; 뿰; 뿰; 뿰; 뿰; ) HANGUL SYLLABLE BBWEOL +BFF1;BFF1;1108 116F 11B0;BFF1;1108 116F 11B0; # (뿱; 뿱; 뿱; 뿱; 뿱; ) HANGUL SYLLABLE BBWEOLG +BFF2;BFF2;1108 116F 11B1;BFF2;1108 116F 11B1; # (뿲; 뿲; 뿲; 뿲; 뿲; ) HANGUL SYLLABLE BBWEOLM +BFF3;BFF3;1108 116F 11B2;BFF3;1108 116F 11B2; # (뿳; 뿳; 뿳; 뿳; 뿳; ) HANGUL SYLLABLE BBWEOLB +BFF4;BFF4;1108 116F 11B3;BFF4;1108 116F 11B3; # (뿴; 뿴; 뿴; 뿴; 뿴; ) HANGUL SYLLABLE BBWEOLS +BFF5;BFF5;1108 116F 11B4;BFF5;1108 116F 11B4; # (뿵; 뿵; 뿵; 뿵; 뿵; ) HANGUL SYLLABLE BBWEOLT +BFF6;BFF6;1108 116F 11B5;BFF6;1108 116F 11B5; # (뿶; 뿶; 뿶; 뿶; 뿶; ) HANGUL SYLLABLE BBWEOLP +BFF7;BFF7;1108 116F 11B6;BFF7;1108 116F 11B6; # (뿷; 뿷; 뿷; 뿷; 뿷; ) HANGUL SYLLABLE BBWEOLH +BFF8;BFF8;1108 116F 11B7;BFF8;1108 116F 11B7; # (뿸; 뿸; 뿸; 뿸; 뿸; ) HANGUL SYLLABLE BBWEOM +BFF9;BFF9;1108 116F 11B8;BFF9;1108 116F 11B8; # (뿹; 뿹; 뿹; 뿹; 뿹; ) HANGUL SYLLABLE BBWEOB +BFFA;BFFA;1108 116F 11B9;BFFA;1108 116F 11B9; # (뿺; 뿺; 뿺; 뿺; 뿺; ) HANGUL SYLLABLE BBWEOBS +BFFB;BFFB;1108 116F 11BA;BFFB;1108 116F 11BA; # (뿻; 뿻; 뿻; 뿻; 뿻; ) HANGUL SYLLABLE BBWEOS +BFFC;BFFC;1108 116F 11BB;BFFC;1108 116F 11BB; # (뿼; 뿼; 뿼; 뿼; 뿼; ) HANGUL SYLLABLE BBWEOSS +BFFD;BFFD;1108 116F 11BC;BFFD;1108 116F 11BC; # (뿽; 뿽; 뿽; 뿽; 뿽; ) HANGUL SYLLABLE BBWEONG +BFFE;BFFE;1108 116F 11BD;BFFE;1108 116F 11BD; # (뿾; 뿾; 뿾; 뿾; 뿾; ) HANGUL SYLLABLE BBWEOJ +BFFF;BFFF;1108 116F 11BE;BFFF;1108 116F 11BE; # (뿿; 뿿; 뿿; 뿿; 뿿; ) HANGUL SYLLABLE BBWEOC +C000;C000;1108 116F 11BF;C000;1108 116F 11BF; # (쀀; 쀀; 쀀; 쀀; 쀀; ) HANGUL SYLLABLE BBWEOK +C001;C001;1108 116F 11C0;C001;1108 116F 11C0; # (쀁; 쀁; 쀁; 쀁; 쀁; ) HANGUL SYLLABLE BBWEOT +C002;C002;1108 116F 11C1;C002;1108 116F 11C1; # (쀂; 쀂; 쀂; 쀂; 쀂; ) HANGUL SYLLABLE BBWEOP +C003;C003;1108 116F 11C2;C003;1108 116F 11C2; # (쀃; 쀃; 쀃; 쀃; 쀃; ) HANGUL SYLLABLE BBWEOH +C004;C004;1108 1170;C004;1108 1170; # (쀄; 쀄; 쀄; 쀄; 쀄; ) HANGUL SYLLABLE BBWE +C005;C005;1108 1170 11A8;C005;1108 1170 11A8; # (쀅; 쀅; 쀅; 쀅; 쀅; ) HANGUL SYLLABLE BBWEG +C006;C006;1108 1170 11A9;C006;1108 1170 11A9; # (쀆; 쀆; 쀆; 쀆; 쀆; ) HANGUL SYLLABLE BBWEGG +C007;C007;1108 1170 11AA;C007;1108 1170 11AA; # (쀇; 쀇; 쀇; 쀇; 쀇; ) HANGUL SYLLABLE BBWEGS +C008;C008;1108 1170 11AB;C008;1108 1170 11AB; # (쀈; 쀈; 쀈; 쀈; 쀈; ) HANGUL SYLLABLE BBWEN +C009;C009;1108 1170 11AC;C009;1108 1170 11AC; # (쀉; 쀉; 쀉; 쀉; 쀉; ) HANGUL SYLLABLE BBWENJ +C00A;C00A;1108 1170 11AD;C00A;1108 1170 11AD; # (쀊; 쀊; 쀊; 쀊; 쀊; ) HANGUL SYLLABLE BBWENH +C00B;C00B;1108 1170 11AE;C00B;1108 1170 11AE; # (쀋; 쀋; 쀋; 쀋; 쀋; ) HANGUL SYLLABLE BBWED +C00C;C00C;1108 1170 11AF;C00C;1108 1170 11AF; # (쀌; 쀌; 쀌; 쀌; 쀌; ) HANGUL SYLLABLE BBWEL +C00D;C00D;1108 1170 11B0;C00D;1108 1170 11B0; # (쀍; 쀍; 쀍; 쀍; 쀍; ) HANGUL SYLLABLE BBWELG +C00E;C00E;1108 1170 11B1;C00E;1108 1170 11B1; # (쀎; 쀎; 쀎; 쀎; 쀎; ) HANGUL SYLLABLE BBWELM +C00F;C00F;1108 1170 11B2;C00F;1108 1170 11B2; # (쀏; 쀏; 쀏; 쀏; 쀏; ) HANGUL SYLLABLE BBWELB +C010;C010;1108 1170 11B3;C010;1108 1170 11B3; # (쀐; 쀐; 쀐; 쀐; 쀐; ) HANGUL SYLLABLE BBWELS +C011;C011;1108 1170 11B4;C011;1108 1170 11B4; # (쀑; 쀑; 쀑; 쀑; 쀑; ) HANGUL SYLLABLE BBWELT +C012;C012;1108 1170 11B5;C012;1108 1170 11B5; # (쀒; 쀒; 쀒; 쀒; 쀒; ) HANGUL SYLLABLE BBWELP +C013;C013;1108 1170 11B6;C013;1108 1170 11B6; # (쀓; 쀓; 쀓; 쀓; 쀓; ) HANGUL SYLLABLE BBWELH +C014;C014;1108 1170 11B7;C014;1108 1170 11B7; # (쀔; 쀔; 쀔; 쀔; 쀔; ) HANGUL SYLLABLE BBWEM +C015;C015;1108 1170 11B8;C015;1108 1170 11B8; # (쀕; 쀕; 쀕; 쀕; 쀕; ) HANGUL SYLLABLE BBWEB +C016;C016;1108 1170 11B9;C016;1108 1170 11B9; # (쀖; 쀖; 쀖; 쀖; 쀖; ) HANGUL SYLLABLE BBWEBS +C017;C017;1108 1170 11BA;C017;1108 1170 11BA; # (쀗; 쀗; 쀗; 쀗; 쀗; ) HANGUL SYLLABLE BBWES +C018;C018;1108 1170 11BB;C018;1108 1170 11BB; # (쀘; 쀘; 쀘; 쀘; 쀘; ) HANGUL SYLLABLE BBWESS +C019;C019;1108 1170 11BC;C019;1108 1170 11BC; # (쀙; 쀙; 쀙; 쀙; 쀙; ) HANGUL SYLLABLE BBWENG +C01A;C01A;1108 1170 11BD;C01A;1108 1170 11BD; # (쀚; 쀚; 쀚; 쀚; 쀚; ) HANGUL SYLLABLE BBWEJ +C01B;C01B;1108 1170 11BE;C01B;1108 1170 11BE; # (쀛; 쀛; 쀛; 쀛; 쀛; ) HANGUL SYLLABLE BBWEC +C01C;C01C;1108 1170 11BF;C01C;1108 1170 11BF; # (쀜; 쀜; 쀜; 쀜; 쀜; ) HANGUL SYLLABLE BBWEK +C01D;C01D;1108 1170 11C0;C01D;1108 1170 11C0; # (쀝; 쀝; 쀝; 쀝; 쀝; ) HANGUL SYLLABLE BBWET +C01E;C01E;1108 1170 11C1;C01E;1108 1170 11C1; # (쀞; 쀞; 쀞; 쀞; 쀞; ) HANGUL SYLLABLE BBWEP +C01F;C01F;1108 1170 11C2;C01F;1108 1170 11C2; # (쀟; 쀟; 쀟; 쀟; 쀟; ) HANGUL SYLLABLE BBWEH +C020;C020;1108 1171;C020;1108 1171; # (쀠; 쀠; 쀠; 쀠; 쀠; ) HANGUL SYLLABLE BBWI +C021;C021;1108 1171 11A8;C021;1108 1171 11A8; # (쀡; 쀡; 쀡; 쀡; 쀡; ) HANGUL SYLLABLE BBWIG +C022;C022;1108 1171 11A9;C022;1108 1171 11A9; # (쀢; 쀢; 쀢; 쀢; 쀢; ) HANGUL SYLLABLE BBWIGG +C023;C023;1108 1171 11AA;C023;1108 1171 11AA; # (쀣; 쀣; 쀣; 쀣; 쀣; ) HANGUL SYLLABLE BBWIGS +C024;C024;1108 1171 11AB;C024;1108 1171 11AB; # (쀤; 쀤; 쀤; 쀤; 쀤; ) HANGUL SYLLABLE BBWIN +C025;C025;1108 1171 11AC;C025;1108 1171 11AC; # (쀥; 쀥; 쀥; 쀥; 쀥; ) HANGUL SYLLABLE BBWINJ +C026;C026;1108 1171 11AD;C026;1108 1171 11AD; # (쀦; 쀦; 쀦; 쀦; 쀦; ) HANGUL SYLLABLE BBWINH +C027;C027;1108 1171 11AE;C027;1108 1171 11AE; # (쀧; 쀧; 쀧; 쀧; 쀧; ) HANGUL SYLLABLE BBWID +C028;C028;1108 1171 11AF;C028;1108 1171 11AF; # (쀨; 쀨; 쀨; 쀨; 쀨; ) HANGUL SYLLABLE BBWIL +C029;C029;1108 1171 11B0;C029;1108 1171 11B0; # (쀩; 쀩; 쀩; 쀩; 쀩; ) HANGUL SYLLABLE BBWILG +C02A;C02A;1108 1171 11B1;C02A;1108 1171 11B1; # (쀪; 쀪; 쀪; 쀪; 쀪; ) HANGUL SYLLABLE BBWILM +C02B;C02B;1108 1171 11B2;C02B;1108 1171 11B2; # (쀫; 쀫; 쀫; 쀫; 쀫; ) HANGUL SYLLABLE BBWILB +C02C;C02C;1108 1171 11B3;C02C;1108 1171 11B3; # (쀬; 쀬; 쀬; 쀬; 쀬; ) HANGUL SYLLABLE BBWILS +C02D;C02D;1108 1171 11B4;C02D;1108 1171 11B4; # (쀭; 쀭; 쀭; 쀭; 쀭; ) HANGUL SYLLABLE BBWILT +C02E;C02E;1108 1171 11B5;C02E;1108 1171 11B5; # (쀮; 쀮; 쀮; 쀮; 쀮; ) HANGUL SYLLABLE BBWILP +C02F;C02F;1108 1171 11B6;C02F;1108 1171 11B6; # (쀯; 쀯; 쀯; 쀯; 쀯; ) HANGUL SYLLABLE BBWILH +C030;C030;1108 1171 11B7;C030;1108 1171 11B7; # (쀰; 쀰; 쀰; 쀰; 쀰; ) HANGUL SYLLABLE BBWIM +C031;C031;1108 1171 11B8;C031;1108 1171 11B8; # (쀱; 쀱; 쀱; 쀱; 쀱; ) HANGUL SYLLABLE BBWIB +C032;C032;1108 1171 11B9;C032;1108 1171 11B9; # (쀲; 쀲; 쀲; 쀲; 쀲; ) HANGUL SYLLABLE BBWIBS +C033;C033;1108 1171 11BA;C033;1108 1171 11BA; # (쀳; 쀳; 쀳; 쀳; 쀳; ) HANGUL SYLLABLE BBWIS +C034;C034;1108 1171 11BB;C034;1108 1171 11BB; # (쀴; 쀴; 쀴; 쀴; 쀴; ) HANGUL SYLLABLE BBWISS +C035;C035;1108 1171 11BC;C035;1108 1171 11BC; # (쀵; 쀵; 쀵; 쀵; 쀵; ) HANGUL SYLLABLE BBWING +C036;C036;1108 1171 11BD;C036;1108 1171 11BD; # (쀶; 쀶; 쀶; 쀶; 쀶; ) HANGUL SYLLABLE BBWIJ +C037;C037;1108 1171 11BE;C037;1108 1171 11BE; # (쀷; 쀷; 쀷; 쀷; 쀷; ) HANGUL SYLLABLE BBWIC +C038;C038;1108 1171 11BF;C038;1108 1171 11BF; # (쀸; 쀸; 쀸; 쀸; 쀸; ) HANGUL SYLLABLE BBWIK +C039;C039;1108 1171 11C0;C039;1108 1171 11C0; # (쀹; 쀹; 쀹; 쀹; 쀹; ) HANGUL SYLLABLE BBWIT +C03A;C03A;1108 1171 11C1;C03A;1108 1171 11C1; # (쀺; 쀺; 쀺; 쀺; 쀺; ) HANGUL SYLLABLE BBWIP +C03B;C03B;1108 1171 11C2;C03B;1108 1171 11C2; # (쀻; 쀻; 쀻; 쀻; 쀻; ) HANGUL SYLLABLE BBWIH +C03C;C03C;1108 1172;C03C;1108 1172; # (쀼; 쀼; 쀼; 쀼; 쀼; ) HANGUL SYLLABLE BBYU +C03D;C03D;1108 1172 11A8;C03D;1108 1172 11A8; # (쀽; 쀽; 쀽; 쀽; 쀽; ) HANGUL SYLLABLE BBYUG +C03E;C03E;1108 1172 11A9;C03E;1108 1172 11A9; # (쀾; 쀾; 쀾; 쀾; 쀾; ) HANGUL SYLLABLE BBYUGG +C03F;C03F;1108 1172 11AA;C03F;1108 1172 11AA; # (쀿; 쀿; 쀿; 쀿; 쀿; ) HANGUL SYLLABLE BBYUGS +C040;C040;1108 1172 11AB;C040;1108 1172 11AB; # (쁀; 쁀; 쁀; 쁀; 쁀; ) HANGUL SYLLABLE BBYUN +C041;C041;1108 1172 11AC;C041;1108 1172 11AC; # (쁁; 쁁; 쁁; 쁁; 쁁; ) HANGUL SYLLABLE BBYUNJ +C042;C042;1108 1172 11AD;C042;1108 1172 11AD; # (쁂; 쁂; 쁂; 쁂; 쁂; ) HANGUL SYLLABLE BBYUNH +C043;C043;1108 1172 11AE;C043;1108 1172 11AE; # (쁃; 쁃; 쁃; 쁃; 쁃; ) HANGUL SYLLABLE BBYUD +C044;C044;1108 1172 11AF;C044;1108 1172 11AF; # (쁄; 쁄; 쁄; 쁄; 쁄; ) HANGUL SYLLABLE BBYUL +C045;C045;1108 1172 11B0;C045;1108 1172 11B0; # (쁅; 쁅; 쁅; 쁅; 쁅; ) HANGUL SYLLABLE BBYULG +C046;C046;1108 1172 11B1;C046;1108 1172 11B1; # (쁆; 쁆; 쁆; 쁆; 쁆; ) HANGUL SYLLABLE BBYULM +C047;C047;1108 1172 11B2;C047;1108 1172 11B2; # (쁇; 쁇; 쁇; 쁇; 쁇; ) HANGUL SYLLABLE BBYULB +C048;C048;1108 1172 11B3;C048;1108 1172 11B3; # (쁈; 쁈; 쁈; 쁈; 쁈; ) HANGUL SYLLABLE BBYULS +C049;C049;1108 1172 11B4;C049;1108 1172 11B4; # (쁉; 쁉; 쁉; 쁉; 쁉; ) HANGUL SYLLABLE BBYULT +C04A;C04A;1108 1172 11B5;C04A;1108 1172 11B5; # (쁊; 쁊; 쁊; 쁊; 쁊; ) HANGUL SYLLABLE BBYULP +C04B;C04B;1108 1172 11B6;C04B;1108 1172 11B6; # (쁋; 쁋; 쁋; 쁋; 쁋; ) HANGUL SYLLABLE BBYULH +C04C;C04C;1108 1172 11B7;C04C;1108 1172 11B7; # (쁌; 쁌; 쁌; 쁌; 쁌; ) HANGUL SYLLABLE BBYUM +C04D;C04D;1108 1172 11B8;C04D;1108 1172 11B8; # (쁍; 쁍; 쁍; 쁍; 쁍; ) HANGUL SYLLABLE BBYUB +C04E;C04E;1108 1172 11B9;C04E;1108 1172 11B9; # (쁎; 쁎; 쁎; 쁎; 쁎; ) HANGUL SYLLABLE BBYUBS +C04F;C04F;1108 1172 11BA;C04F;1108 1172 11BA; # (쁏; 쁏; 쁏; 쁏; 쁏; ) HANGUL SYLLABLE BBYUS +C050;C050;1108 1172 11BB;C050;1108 1172 11BB; # (쁐; 쁐; 쁐; 쁐; 쁐; ) HANGUL SYLLABLE BBYUSS +C051;C051;1108 1172 11BC;C051;1108 1172 11BC; # (쁑; 쁑; 쁑; 쁑; 쁑; ) HANGUL SYLLABLE BBYUNG +C052;C052;1108 1172 11BD;C052;1108 1172 11BD; # (쁒; 쁒; 쁒; 쁒; 쁒; ) HANGUL SYLLABLE BBYUJ +C053;C053;1108 1172 11BE;C053;1108 1172 11BE; # (쁓; 쁓; 쁓; 쁓; 쁓; ) HANGUL SYLLABLE BBYUC +C054;C054;1108 1172 11BF;C054;1108 1172 11BF; # (쁔; 쁔; 쁔; 쁔; 쁔; ) HANGUL SYLLABLE BBYUK +C055;C055;1108 1172 11C0;C055;1108 1172 11C0; # (쁕; 쁕; 쁕; 쁕; 쁕; ) HANGUL SYLLABLE BBYUT +C056;C056;1108 1172 11C1;C056;1108 1172 11C1; # (쁖; 쁖; 쁖; 쁖; 쁖; ) HANGUL SYLLABLE BBYUP +C057;C057;1108 1172 11C2;C057;1108 1172 11C2; # (쁗; 쁗; 쁗; 쁗; 쁗; ) HANGUL SYLLABLE BBYUH +C058;C058;1108 1173;C058;1108 1173; # (쁘; 쁘; 쁘; 쁘; 쁘; ) HANGUL SYLLABLE BBEU +C059;C059;1108 1173 11A8;C059;1108 1173 11A8; # (쁙; 쁙; 쁙; 쁙; 쁙; ) HANGUL SYLLABLE BBEUG +C05A;C05A;1108 1173 11A9;C05A;1108 1173 11A9; # (쁚; 쁚; 쁚; 쁚; 쁚; ) HANGUL SYLLABLE BBEUGG +C05B;C05B;1108 1173 11AA;C05B;1108 1173 11AA; # (쁛; 쁛; 쁛; 쁛; 쁛; ) HANGUL SYLLABLE BBEUGS +C05C;C05C;1108 1173 11AB;C05C;1108 1173 11AB; # (쁜; 쁜; 쁜; 쁜; 쁜; ) HANGUL SYLLABLE BBEUN +C05D;C05D;1108 1173 11AC;C05D;1108 1173 11AC; # (쁝; 쁝; 쁝; 쁝; 쁝; ) HANGUL SYLLABLE BBEUNJ +C05E;C05E;1108 1173 11AD;C05E;1108 1173 11AD; # (쁞; 쁞; 쁞; 쁞; 쁞; ) HANGUL SYLLABLE BBEUNH +C05F;C05F;1108 1173 11AE;C05F;1108 1173 11AE; # (쁟; 쁟; 쁟; 쁟; 쁟; ) HANGUL SYLLABLE BBEUD +C060;C060;1108 1173 11AF;C060;1108 1173 11AF; # (쁠; 쁠; 쁠; 쁠; 쁠; ) HANGUL SYLLABLE BBEUL +C061;C061;1108 1173 11B0;C061;1108 1173 11B0; # (쁡; 쁡; 쁡; 쁡; 쁡; ) HANGUL SYLLABLE BBEULG +C062;C062;1108 1173 11B1;C062;1108 1173 11B1; # (쁢; 쁢; 쁢; 쁢; 쁢; ) HANGUL SYLLABLE BBEULM +C063;C063;1108 1173 11B2;C063;1108 1173 11B2; # (쁣; 쁣; 쁣; 쁣; 쁣; ) HANGUL SYLLABLE BBEULB +C064;C064;1108 1173 11B3;C064;1108 1173 11B3; # (쁤; 쁤; 쁤; 쁤; 쁤; ) HANGUL SYLLABLE BBEULS +C065;C065;1108 1173 11B4;C065;1108 1173 11B4; # (쁥; 쁥; 쁥; 쁥; 쁥; ) HANGUL SYLLABLE BBEULT +C066;C066;1108 1173 11B5;C066;1108 1173 11B5; # (쁦; 쁦; 쁦; 쁦; 쁦; ) HANGUL SYLLABLE BBEULP +C067;C067;1108 1173 11B6;C067;1108 1173 11B6; # (쁧; 쁧; 쁧; 쁧; 쁧; ) HANGUL SYLLABLE BBEULH +C068;C068;1108 1173 11B7;C068;1108 1173 11B7; # (쁨; 쁨; 쁨; 쁨; 쁨; ) HANGUL SYLLABLE BBEUM +C069;C069;1108 1173 11B8;C069;1108 1173 11B8; # (쁩; 쁩; 쁩; 쁩; 쁩; ) HANGUL SYLLABLE BBEUB +C06A;C06A;1108 1173 11B9;C06A;1108 1173 11B9; # (쁪; 쁪; 쁪; 쁪; 쁪; ) HANGUL SYLLABLE BBEUBS +C06B;C06B;1108 1173 11BA;C06B;1108 1173 11BA; # (쁫; 쁫; 쁫; 쁫; 쁫; ) HANGUL SYLLABLE BBEUS +C06C;C06C;1108 1173 11BB;C06C;1108 1173 11BB; # (쁬; 쁬; 쁬; 쁬; 쁬; ) HANGUL SYLLABLE BBEUSS +C06D;C06D;1108 1173 11BC;C06D;1108 1173 11BC; # (쁭; 쁭; 쁭; 쁭; 쁭; ) HANGUL SYLLABLE BBEUNG +C06E;C06E;1108 1173 11BD;C06E;1108 1173 11BD; # (쁮; 쁮; 쁮; 쁮; 쁮; ) HANGUL SYLLABLE BBEUJ +C06F;C06F;1108 1173 11BE;C06F;1108 1173 11BE; # (쁯; 쁯; 쁯; 쁯; 쁯; ) HANGUL SYLLABLE BBEUC +C070;C070;1108 1173 11BF;C070;1108 1173 11BF; # (쁰; 쁰; 쁰; 쁰; 쁰; ) HANGUL SYLLABLE BBEUK +C071;C071;1108 1173 11C0;C071;1108 1173 11C0; # (쁱; 쁱; 쁱; 쁱; 쁱; ) HANGUL SYLLABLE BBEUT +C072;C072;1108 1173 11C1;C072;1108 1173 11C1; # (쁲; 쁲; 쁲; 쁲; 쁲; ) HANGUL SYLLABLE BBEUP +C073;C073;1108 1173 11C2;C073;1108 1173 11C2; # (쁳; 쁳; 쁳; 쁳; 쁳; ) HANGUL SYLLABLE BBEUH +C074;C074;1108 1174;C074;1108 1174; # (쁴; 쁴; 쁴; 쁴; 쁴; ) HANGUL SYLLABLE BBYI +C075;C075;1108 1174 11A8;C075;1108 1174 11A8; # (쁵; 쁵; 쁵; 쁵; 쁵; ) HANGUL SYLLABLE BBYIG +C076;C076;1108 1174 11A9;C076;1108 1174 11A9; # (쁶; 쁶; 쁶; 쁶; 쁶; ) HANGUL SYLLABLE BBYIGG +C077;C077;1108 1174 11AA;C077;1108 1174 11AA; # (쁷; 쁷; 쁷; 쁷; 쁷; ) HANGUL SYLLABLE BBYIGS +C078;C078;1108 1174 11AB;C078;1108 1174 11AB; # (쁸; 쁸; 쁸; 쁸; 쁸; ) HANGUL SYLLABLE BBYIN +C079;C079;1108 1174 11AC;C079;1108 1174 11AC; # (쁹; 쁹; 쁹; 쁹; 쁹; ) HANGUL SYLLABLE BBYINJ +C07A;C07A;1108 1174 11AD;C07A;1108 1174 11AD; # (쁺; 쁺; 쁺; 쁺; 쁺; ) HANGUL SYLLABLE BBYINH +C07B;C07B;1108 1174 11AE;C07B;1108 1174 11AE; # (쁻; 쁻; 쁻; 쁻; 쁻; ) HANGUL SYLLABLE BBYID +C07C;C07C;1108 1174 11AF;C07C;1108 1174 11AF; # (쁼; 쁼; 쁼; 쁼; 쁼; ) HANGUL SYLLABLE BBYIL +C07D;C07D;1108 1174 11B0;C07D;1108 1174 11B0; # (쁽; 쁽; 쁽; 쁽; 쁽; ) HANGUL SYLLABLE BBYILG +C07E;C07E;1108 1174 11B1;C07E;1108 1174 11B1; # (쁾; 쁾; 쁾; 쁾; 쁾; ) HANGUL SYLLABLE BBYILM +C07F;C07F;1108 1174 11B2;C07F;1108 1174 11B2; # (쁿; 쁿; 쁿; 쁿; 쁿; ) HANGUL SYLLABLE BBYILB +C080;C080;1108 1174 11B3;C080;1108 1174 11B3; # (삀; 삀; 삀; 삀; 삀; ) HANGUL SYLLABLE BBYILS +C081;C081;1108 1174 11B4;C081;1108 1174 11B4; # (삁; 삁; 삁; 삁; 삁; ) HANGUL SYLLABLE BBYILT +C082;C082;1108 1174 11B5;C082;1108 1174 11B5; # (삂; 삂; 삂; 삂; 삂; ) HANGUL SYLLABLE BBYILP +C083;C083;1108 1174 11B6;C083;1108 1174 11B6; # (삃; 삃; 삃; 삃; 삃; ) HANGUL SYLLABLE BBYILH +C084;C084;1108 1174 11B7;C084;1108 1174 11B7; # (삄; 삄; 삄; 삄; 삄; ) HANGUL SYLLABLE BBYIM +C085;C085;1108 1174 11B8;C085;1108 1174 11B8; # (삅; 삅; 삅; 삅; 삅; ) HANGUL SYLLABLE BBYIB +C086;C086;1108 1174 11B9;C086;1108 1174 11B9; # (삆; 삆; 삆; 삆; 삆; ) HANGUL SYLLABLE BBYIBS +C087;C087;1108 1174 11BA;C087;1108 1174 11BA; # (삇; 삇; 삇; 삇; 삇; ) HANGUL SYLLABLE BBYIS +C088;C088;1108 1174 11BB;C088;1108 1174 11BB; # (삈; 삈; 삈; 삈; 삈; ) HANGUL SYLLABLE BBYISS +C089;C089;1108 1174 11BC;C089;1108 1174 11BC; # (삉; 삉; 삉; 삉; 삉; ) HANGUL SYLLABLE BBYING +C08A;C08A;1108 1174 11BD;C08A;1108 1174 11BD; # (삊; 삊; 삊; 삊; 삊; ) HANGUL SYLLABLE BBYIJ +C08B;C08B;1108 1174 11BE;C08B;1108 1174 11BE; # (삋; 삋; 삋; 삋; 삋; ) HANGUL SYLLABLE BBYIC +C08C;C08C;1108 1174 11BF;C08C;1108 1174 11BF; # (삌; 삌; 삌; 삌; 삌; ) HANGUL SYLLABLE BBYIK +C08D;C08D;1108 1174 11C0;C08D;1108 1174 11C0; # (삍; 삍; 삍; 삍; 삍; ) HANGUL SYLLABLE BBYIT +C08E;C08E;1108 1174 11C1;C08E;1108 1174 11C1; # (삎; 삎; 삎; 삎; 삎; ) HANGUL SYLLABLE BBYIP +C08F;C08F;1108 1174 11C2;C08F;1108 1174 11C2; # (삏; 삏; 삏; 삏; 삏; ) HANGUL SYLLABLE BBYIH +C090;C090;1108 1175;C090;1108 1175; # (삐; 삐; 삐; 삐; 삐; ) HANGUL SYLLABLE BBI +C091;C091;1108 1175 11A8;C091;1108 1175 11A8; # (삑; 삑; 삑; 삑; 삑; ) HANGUL SYLLABLE BBIG +C092;C092;1108 1175 11A9;C092;1108 1175 11A9; # (삒; 삒; 삒; 삒; 삒; ) HANGUL SYLLABLE BBIGG +C093;C093;1108 1175 11AA;C093;1108 1175 11AA; # (삓; 삓; 삓; 삓; 삓; ) HANGUL SYLLABLE BBIGS +C094;C094;1108 1175 11AB;C094;1108 1175 11AB; # (삔; 삔; 삔; 삔; 삔; ) HANGUL SYLLABLE BBIN +C095;C095;1108 1175 11AC;C095;1108 1175 11AC; # (삕; 삕; 삕; 삕; 삕; ) HANGUL SYLLABLE BBINJ +C096;C096;1108 1175 11AD;C096;1108 1175 11AD; # (삖; 삖; 삖; 삖; 삖; ) HANGUL SYLLABLE BBINH +C097;C097;1108 1175 11AE;C097;1108 1175 11AE; # (삗; 삗; 삗; 삗; 삗; ) HANGUL SYLLABLE BBID +C098;C098;1108 1175 11AF;C098;1108 1175 11AF; # (삘; 삘; 삘; 삘; 삘; ) HANGUL SYLLABLE BBIL +C099;C099;1108 1175 11B0;C099;1108 1175 11B0; # (삙; 삙; 삙; 삙; 삙; ) HANGUL SYLLABLE BBILG +C09A;C09A;1108 1175 11B1;C09A;1108 1175 11B1; # (삚; 삚; 삚; 삚; 삚; ) HANGUL SYLLABLE BBILM +C09B;C09B;1108 1175 11B2;C09B;1108 1175 11B2; # (삛; 삛; 삛; 삛; 삛; ) HANGUL SYLLABLE BBILB +C09C;C09C;1108 1175 11B3;C09C;1108 1175 11B3; # (삜; 삜; 삜; 삜; 삜; ) HANGUL SYLLABLE BBILS +C09D;C09D;1108 1175 11B4;C09D;1108 1175 11B4; # (삝; 삝; 삝; 삝; 삝; ) HANGUL SYLLABLE BBILT +C09E;C09E;1108 1175 11B5;C09E;1108 1175 11B5; # (삞; 삞; 삞; 삞; 삞; ) HANGUL SYLLABLE BBILP +C09F;C09F;1108 1175 11B6;C09F;1108 1175 11B6; # (삟; 삟; 삟; 삟; 삟; ) HANGUL SYLLABLE BBILH +C0A0;C0A0;1108 1175 11B7;C0A0;1108 1175 11B7; # (삠; 삠; 삠; 삠; 삠; ) HANGUL SYLLABLE BBIM +C0A1;C0A1;1108 1175 11B8;C0A1;1108 1175 11B8; # (삡; 삡; 삡; 삡; 삡; ) HANGUL SYLLABLE BBIB +C0A2;C0A2;1108 1175 11B9;C0A2;1108 1175 11B9; # (삢; 삢; 삢; 삢; 삢; ) HANGUL SYLLABLE BBIBS +C0A3;C0A3;1108 1175 11BA;C0A3;1108 1175 11BA; # (삣; 삣; 삣; 삣; 삣; ) HANGUL SYLLABLE BBIS +C0A4;C0A4;1108 1175 11BB;C0A4;1108 1175 11BB; # (삤; 삤; 삤; 삤; 삤; ) HANGUL SYLLABLE BBISS +C0A5;C0A5;1108 1175 11BC;C0A5;1108 1175 11BC; # (삥; 삥; 삥; 삥; 삥; ) HANGUL SYLLABLE BBING +C0A6;C0A6;1108 1175 11BD;C0A6;1108 1175 11BD; # (삦; 삦; 삦; 삦; 삦; ) HANGUL SYLLABLE BBIJ +C0A7;C0A7;1108 1175 11BE;C0A7;1108 1175 11BE; # (삧; 삧; 삧; 삧; 삧; ) HANGUL SYLLABLE BBIC +C0A8;C0A8;1108 1175 11BF;C0A8;1108 1175 11BF; # (삨; 삨; 삨; 삨; 삨; ) HANGUL SYLLABLE BBIK +C0A9;C0A9;1108 1175 11C0;C0A9;1108 1175 11C0; # (삩; 삩; 삩; 삩; 삩; ) HANGUL SYLLABLE BBIT +C0AA;C0AA;1108 1175 11C1;C0AA;1108 1175 11C1; # (삪; 삪; 삪; 삪; 삪; ) HANGUL SYLLABLE BBIP +C0AB;C0AB;1108 1175 11C2;C0AB;1108 1175 11C2; # (삫; 삫; 삫; 삫; 삫; ) HANGUL SYLLABLE BBIH +C0AC;C0AC;1109 1161;C0AC;1109 1161; # (사; 사; 사; 사; 사; ) HANGUL SYLLABLE SA +C0AD;C0AD;1109 1161 11A8;C0AD;1109 1161 11A8; # (삭; 삭; 삭; 삭; 삭; ) HANGUL SYLLABLE SAG +C0AE;C0AE;1109 1161 11A9;C0AE;1109 1161 11A9; # (삮; 삮; 삮; 삮; 삮; ) HANGUL SYLLABLE SAGG +C0AF;C0AF;1109 1161 11AA;C0AF;1109 1161 11AA; # (삯; 삯; 삯; 삯; 삯; ) HANGUL SYLLABLE SAGS +C0B0;C0B0;1109 1161 11AB;C0B0;1109 1161 11AB; # (산; 산; 산; 산; 산; ) HANGUL SYLLABLE SAN +C0B1;C0B1;1109 1161 11AC;C0B1;1109 1161 11AC; # (삱; 삱; 삱; 삱; 삱; ) HANGUL SYLLABLE SANJ +C0B2;C0B2;1109 1161 11AD;C0B2;1109 1161 11AD; # (삲; 삲; 삲; 삲; 삲; ) HANGUL SYLLABLE SANH +C0B3;C0B3;1109 1161 11AE;C0B3;1109 1161 11AE; # (삳; 삳; 삳; 삳; 삳; ) HANGUL SYLLABLE SAD +C0B4;C0B4;1109 1161 11AF;C0B4;1109 1161 11AF; # (살; 살; 살; 살; 살; ) HANGUL SYLLABLE SAL +C0B5;C0B5;1109 1161 11B0;C0B5;1109 1161 11B0; # (삵; 삵; 삵; 삵; 삵; ) HANGUL SYLLABLE SALG +C0B6;C0B6;1109 1161 11B1;C0B6;1109 1161 11B1; # (삶; 삶; 삶; 삶; 삶; ) HANGUL SYLLABLE SALM +C0B7;C0B7;1109 1161 11B2;C0B7;1109 1161 11B2; # (삷; 삷; 삷; 삷; 삷; ) HANGUL SYLLABLE SALB +C0B8;C0B8;1109 1161 11B3;C0B8;1109 1161 11B3; # (삸; 삸; 삸; 삸; 삸; ) HANGUL SYLLABLE SALS +C0B9;C0B9;1109 1161 11B4;C0B9;1109 1161 11B4; # (삹; 삹; 삹; 삹; 삹; ) HANGUL SYLLABLE SALT +C0BA;C0BA;1109 1161 11B5;C0BA;1109 1161 11B5; # (삺; 삺; 삺; 삺; 삺; ) HANGUL SYLLABLE SALP +C0BB;C0BB;1109 1161 11B6;C0BB;1109 1161 11B6; # (삻; 삻; 삻; 삻; 삻; ) HANGUL SYLLABLE SALH +C0BC;C0BC;1109 1161 11B7;C0BC;1109 1161 11B7; # (삼; 삼; 삼; 삼; 삼; ) HANGUL SYLLABLE SAM +C0BD;C0BD;1109 1161 11B8;C0BD;1109 1161 11B8; # (삽; 삽; 삽; 삽; 삽; ) HANGUL SYLLABLE SAB +C0BE;C0BE;1109 1161 11B9;C0BE;1109 1161 11B9; # (삾; 삾; 삾; 삾; 삾; ) HANGUL SYLLABLE SABS +C0BF;C0BF;1109 1161 11BA;C0BF;1109 1161 11BA; # (삿; 삿; 삿; 삿; 삿; ) HANGUL SYLLABLE SAS +C0C0;C0C0;1109 1161 11BB;C0C0;1109 1161 11BB; # (샀; 샀; 샀; 샀; 샀; ) HANGUL SYLLABLE SASS +C0C1;C0C1;1109 1161 11BC;C0C1;1109 1161 11BC; # (상; 상; 상; 상; 상; ) HANGUL SYLLABLE SANG +C0C2;C0C2;1109 1161 11BD;C0C2;1109 1161 11BD; # (샂; 샂; 샂; 샂; 샂; ) HANGUL SYLLABLE SAJ +C0C3;C0C3;1109 1161 11BE;C0C3;1109 1161 11BE; # (샃; 샃; 샃; 샃; 샃; ) HANGUL SYLLABLE SAC +C0C4;C0C4;1109 1161 11BF;C0C4;1109 1161 11BF; # (샄; 샄; 샄; 샄; 샄; ) HANGUL SYLLABLE SAK +C0C5;C0C5;1109 1161 11C0;C0C5;1109 1161 11C0; # (샅; 샅; 샅; 샅; 샅; ) HANGUL SYLLABLE SAT +C0C6;C0C6;1109 1161 11C1;C0C6;1109 1161 11C1; # (샆; 샆; 샆; 샆; 샆; ) HANGUL SYLLABLE SAP +C0C7;C0C7;1109 1161 11C2;C0C7;1109 1161 11C2; # (샇; 샇; 샇; 샇; 샇; ) HANGUL SYLLABLE SAH +C0C8;C0C8;1109 1162;C0C8;1109 1162; # (새; 새; 새; 새; 새; ) HANGUL SYLLABLE SAE +C0C9;C0C9;1109 1162 11A8;C0C9;1109 1162 11A8; # (색; 색; 색; 색; 색; ) HANGUL SYLLABLE SAEG +C0CA;C0CA;1109 1162 11A9;C0CA;1109 1162 11A9; # (샊; 샊; 샊; 샊; 샊; ) HANGUL SYLLABLE SAEGG +C0CB;C0CB;1109 1162 11AA;C0CB;1109 1162 11AA; # (샋; 샋; 샋; 샋; 샋; ) HANGUL SYLLABLE SAEGS +C0CC;C0CC;1109 1162 11AB;C0CC;1109 1162 11AB; # (샌; 샌; 샌; 샌; 샌; ) HANGUL SYLLABLE SAEN +C0CD;C0CD;1109 1162 11AC;C0CD;1109 1162 11AC; # (샍; 샍; 샍; 샍; 샍; ) HANGUL SYLLABLE SAENJ +C0CE;C0CE;1109 1162 11AD;C0CE;1109 1162 11AD; # (샎; 샎; 샎; 샎; 샎; ) HANGUL SYLLABLE SAENH +C0CF;C0CF;1109 1162 11AE;C0CF;1109 1162 11AE; # (샏; 샏; 샏; 샏; 샏; ) HANGUL SYLLABLE SAED +C0D0;C0D0;1109 1162 11AF;C0D0;1109 1162 11AF; # (샐; 샐; 샐; 샐; 샐; ) HANGUL SYLLABLE SAEL +C0D1;C0D1;1109 1162 11B0;C0D1;1109 1162 11B0; # (샑; 샑; 샑; 샑; 샑; ) HANGUL SYLLABLE SAELG +C0D2;C0D2;1109 1162 11B1;C0D2;1109 1162 11B1; # (샒; 샒; 샒; 샒; 샒; ) HANGUL SYLLABLE SAELM +C0D3;C0D3;1109 1162 11B2;C0D3;1109 1162 11B2; # (샓; 샓; 샓; 샓; 샓; ) HANGUL SYLLABLE SAELB +C0D4;C0D4;1109 1162 11B3;C0D4;1109 1162 11B3; # (샔; 샔; 샔; 샔; 샔; ) HANGUL SYLLABLE SAELS +C0D5;C0D5;1109 1162 11B4;C0D5;1109 1162 11B4; # (샕; 샕; 샕; 샕; 샕; ) HANGUL SYLLABLE SAELT +C0D6;C0D6;1109 1162 11B5;C0D6;1109 1162 11B5; # (샖; 샖; 샖; 샖; 샖; ) HANGUL SYLLABLE SAELP +C0D7;C0D7;1109 1162 11B6;C0D7;1109 1162 11B6; # (샗; 샗; 샗; 샗; 샗; ) HANGUL SYLLABLE SAELH +C0D8;C0D8;1109 1162 11B7;C0D8;1109 1162 11B7; # (샘; 샘; 샘; 샘; 샘; ) HANGUL SYLLABLE SAEM +C0D9;C0D9;1109 1162 11B8;C0D9;1109 1162 11B8; # (샙; 샙; 샙; 샙; 샙; ) HANGUL SYLLABLE SAEB +C0DA;C0DA;1109 1162 11B9;C0DA;1109 1162 11B9; # (샚; 샚; 샚; 샚; 샚; ) HANGUL SYLLABLE SAEBS +C0DB;C0DB;1109 1162 11BA;C0DB;1109 1162 11BA; # (샛; 샛; 샛; 샛; 샛; ) HANGUL SYLLABLE SAES +C0DC;C0DC;1109 1162 11BB;C0DC;1109 1162 11BB; # (샜; 샜; 샜; 샜; 샜; ) HANGUL SYLLABLE SAESS +C0DD;C0DD;1109 1162 11BC;C0DD;1109 1162 11BC; # (생; 생; 생; 생; 생; ) HANGUL SYLLABLE SAENG +C0DE;C0DE;1109 1162 11BD;C0DE;1109 1162 11BD; # (샞; 샞; 샞; 샞; 샞; ) HANGUL SYLLABLE SAEJ +C0DF;C0DF;1109 1162 11BE;C0DF;1109 1162 11BE; # (샟; 샟; 샟; 샟; 샟; ) HANGUL SYLLABLE SAEC +C0E0;C0E0;1109 1162 11BF;C0E0;1109 1162 11BF; # (샠; 샠; 샠; 샠; 샠; ) HANGUL SYLLABLE SAEK +C0E1;C0E1;1109 1162 11C0;C0E1;1109 1162 11C0; # (샡; 샡; 샡; 샡; 샡; ) HANGUL SYLLABLE SAET +C0E2;C0E2;1109 1162 11C1;C0E2;1109 1162 11C1; # (샢; 샢; 샢; 샢; 샢; ) HANGUL SYLLABLE SAEP +C0E3;C0E3;1109 1162 11C2;C0E3;1109 1162 11C2; # (샣; 샣; 샣; 샣; 샣; ) HANGUL SYLLABLE SAEH +C0E4;C0E4;1109 1163;C0E4;1109 1163; # (샤; 샤; 샤; 샤; 샤; ) HANGUL SYLLABLE SYA +C0E5;C0E5;1109 1163 11A8;C0E5;1109 1163 11A8; # (샥; 샥; 샥; 샥; 샥; ) HANGUL SYLLABLE SYAG +C0E6;C0E6;1109 1163 11A9;C0E6;1109 1163 11A9; # (샦; 샦; 샦; 샦; 샦; ) HANGUL SYLLABLE SYAGG +C0E7;C0E7;1109 1163 11AA;C0E7;1109 1163 11AA; # (샧; 샧; 샧; 샧; 샧; ) HANGUL SYLLABLE SYAGS +C0E8;C0E8;1109 1163 11AB;C0E8;1109 1163 11AB; # (샨; 샨; 샨; 샨; 샨; ) HANGUL SYLLABLE SYAN +C0E9;C0E9;1109 1163 11AC;C0E9;1109 1163 11AC; # (샩; 샩; 샩; 샩; 샩; ) HANGUL SYLLABLE SYANJ +C0EA;C0EA;1109 1163 11AD;C0EA;1109 1163 11AD; # (샪; 샪; 샪; 샪; 샪; ) HANGUL SYLLABLE SYANH +C0EB;C0EB;1109 1163 11AE;C0EB;1109 1163 11AE; # (샫; 샫; 샫; 샫; 샫; ) HANGUL SYLLABLE SYAD +C0EC;C0EC;1109 1163 11AF;C0EC;1109 1163 11AF; # (샬; 샬; 샬; 샬; 샬; ) HANGUL SYLLABLE SYAL +C0ED;C0ED;1109 1163 11B0;C0ED;1109 1163 11B0; # (샭; 샭; 샭; 샭; 샭; ) HANGUL SYLLABLE SYALG +C0EE;C0EE;1109 1163 11B1;C0EE;1109 1163 11B1; # (샮; 샮; 샮; 샮; 샮; ) HANGUL SYLLABLE SYALM +C0EF;C0EF;1109 1163 11B2;C0EF;1109 1163 11B2; # (샯; 샯; 샯; 샯; 샯; ) HANGUL SYLLABLE SYALB +C0F0;C0F0;1109 1163 11B3;C0F0;1109 1163 11B3; # (샰; 샰; 샰; 샰; 샰; ) HANGUL SYLLABLE SYALS +C0F1;C0F1;1109 1163 11B4;C0F1;1109 1163 11B4; # (샱; 샱; 샱; 샱; 샱; ) HANGUL SYLLABLE SYALT +C0F2;C0F2;1109 1163 11B5;C0F2;1109 1163 11B5; # (샲; 샲; 샲; 샲; 샲; ) HANGUL SYLLABLE SYALP +C0F3;C0F3;1109 1163 11B6;C0F3;1109 1163 11B6; # (샳; 샳; 샳; 샳; 샳; ) HANGUL SYLLABLE SYALH +C0F4;C0F4;1109 1163 11B7;C0F4;1109 1163 11B7; # (샴; 샴; 샴; 샴; 샴; ) HANGUL SYLLABLE SYAM +C0F5;C0F5;1109 1163 11B8;C0F5;1109 1163 11B8; # (샵; 샵; 샵; 샵; 샵; ) HANGUL SYLLABLE SYAB +C0F6;C0F6;1109 1163 11B9;C0F6;1109 1163 11B9; # (샶; 샶; 샶; 샶; 샶; ) HANGUL SYLLABLE SYABS +C0F7;C0F7;1109 1163 11BA;C0F7;1109 1163 11BA; # (샷; 샷; 샷; 샷; 샷; ) HANGUL SYLLABLE SYAS +C0F8;C0F8;1109 1163 11BB;C0F8;1109 1163 11BB; # (샸; 샸; 샸; 샸; 샸; ) HANGUL SYLLABLE SYASS +C0F9;C0F9;1109 1163 11BC;C0F9;1109 1163 11BC; # (샹; 샹; 샹; 샹; 샹; ) HANGUL SYLLABLE SYANG +C0FA;C0FA;1109 1163 11BD;C0FA;1109 1163 11BD; # (샺; 샺; 샺; 샺; 샺; ) HANGUL SYLLABLE SYAJ +C0FB;C0FB;1109 1163 11BE;C0FB;1109 1163 11BE; # (샻; 샻; 샻; 샻; 샻; ) HANGUL SYLLABLE SYAC +C0FC;C0FC;1109 1163 11BF;C0FC;1109 1163 11BF; # (샼; 샼; 샼; 샼; 샼; ) HANGUL SYLLABLE SYAK +C0FD;C0FD;1109 1163 11C0;C0FD;1109 1163 11C0; # (샽; 샽; 샽; 샽; 샽; ) HANGUL SYLLABLE SYAT +C0FE;C0FE;1109 1163 11C1;C0FE;1109 1163 11C1; # (샾; 샾; 샾; 샾; 샾; ) HANGUL SYLLABLE SYAP +C0FF;C0FF;1109 1163 11C2;C0FF;1109 1163 11C2; # (샿; 샿; 샿; 샿; 샿; ) HANGUL SYLLABLE SYAH +C100;C100;1109 1164;C100;1109 1164; # (섀; 섀; 섀; 섀; 섀; ) HANGUL SYLLABLE SYAE +C101;C101;1109 1164 11A8;C101;1109 1164 11A8; # (섁; 섁; 섁; 섁; 섁; ) HANGUL SYLLABLE SYAEG +C102;C102;1109 1164 11A9;C102;1109 1164 11A9; # (섂; 섂; 섂; 섂; 섂; ) HANGUL SYLLABLE SYAEGG +C103;C103;1109 1164 11AA;C103;1109 1164 11AA; # (섃; 섃; 섃; 섃; 섃; ) HANGUL SYLLABLE SYAEGS +C104;C104;1109 1164 11AB;C104;1109 1164 11AB; # (섄; 섄; 섄; 섄; 섄; ) HANGUL SYLLABLE SYAEN +C105;C105;1109 1164 11AC;C105;1109 1164 11AC; # (섅; 섅; 섅; 섅; 섅; ) HANGUL SYLLABLE SYAENJ +C106;C106;1109 1164 11AD;C106;1109 1164 11AD; # (섆; 섆; 섆; 섆; 섆; ) HANGUL SYLLABLE SYAENH +C107;C107;1109 1164 11AE;C107;1109 1164 11AE; # (섇; 섇; 섇; 섇; 섇; ) HANGUL SYLLABLE SYAED +C108;C108;1109 1164 11AF;C108;1109 1164 11AF; # (섈; 섈; 섈; 섈; 섈; ) HANGUL SYLLABLE SYAEL +C109;C109;1109 1164 11B0;C109;1109 1164 11B0; # (섉; 섉; 섉; 섉; 섉; ) HANGUL SYLLABLE SYAELG +C10A;C10A;1109 1164 11B1;C10A;1109 1164 11B1; # (섊; 섊; 섊; 섊; 섊; ) HANGUL SYLLABLE SYAELM +C10B;C10B;1109 1164 11B2;C10B;1109 1164 11B2; # (섋; 섋; 섋; 섋; 섋; ) HANGUL SYLLABLE SYAELB +C10C;C10C;1109 1164 11B3;C10C;1109 1164 11B3; # (섌; 섌; 섌; 섌; 섌; ) HANGUL SYLLABLE SYAELS +C10D;C10D;1109 1164 11B4;C10D;1109 1164 11B4; # (섍; 섍; 섍; 섍; 섍; ) HANGUL SYLLABLE SYAELT +C10E;C10E;1109 1164 11B5;C10E;1109 1164 11B5; # (섎; 섎; 섎; 섎; 섎; ) HANGUL SYLLABLE SYAELP +C10F;C10F;1109 1164 11B6;C10F;1109 1164 11B6; # (섏; 섏; 섏; 섏; 섏; ) HANGUL SYLLABLE SYAELH +C110;C110;1109 1164 11B7;C110;1109 1164 11B7; # (섐; 섐; 섐; 섐; 섐; ) HANGUL SYLLABLE SYAEM +C111;C111;1109 1164 11B8;C111;1109 1164 11B8; # (섑; 섑; 섑; 섑; 섑; ) HANGUL SYLLABLE SYAEB +C112;C112;1109 1164 11B9;C112;1109 1164 11B9; # (섒; 섒; 섒; 섒; 섒; ) HANGUL SYLLABLE SYAEBS +C113;C113;1109 1164 11BA;C113;1109 1164 11BA; # (섓; 섓; 섓; 섓; 섓; ) HANGUL SYLLABLE SYAES +C114;C114;1109 1164 11BB;C114;1109 1164 11BB; # (섔; 섔; 섔; 섔; 섔; ) HANGUL SYLLABLE SYAESS +C115;C115;1109 1164 11BC;C115;1109 1164 11BC; # (섕; 섕; 섕; 섕; 섕; ) HANGUL SYLLABLE SYAENG +C116;C116;1109 1164 11BD;C116;1109 1164 11BD; # (섖; 섖; 섖; 섖; 섖; ) HANGUL SYLLABLE SYAEJ +C117;C117;1109 1164 11BE;C117;1109 1164 11BE; # (섗; 섗; 섗; 섗; 섗; ) HANGUL SYLLABLE SYAEC +C118;C118;1109 1164 11BF;C118;1109 1164 11BF; # (섘; 섘; 섘; 섘; 섘; ) HANGUL SYLLABLE SYAEK +C119;C119;1109 1164 11C0;C119;1109 1164 11C0; # (섙; 섙; 섙; 섙; 섙; ) HANGUL SYLLABLE SYAET +C11A;C11A;1109 1164 11C1;C11A;1109 1164 11C1; # (섚; 섚; 섚; 섚; 섚; ) HANGUL SYLLABLE SYAEP +C11B;C11B;1109 1164 11C2;C11B;1109 1164 11C2; # (섛; 섛; 섛; 섛; 섛; ) HANGUL SYLLABLE SYAEH +C11C;C11C;1109 1165;C11C;1109 1165; # (서; 서; 서; 서; 서; ) HANGUL SYLLABLE SEO +C11D;C11D;1109 1165 11A8;C11D;1109 1165 11A8; # (석; 석; 석; 석; 석; ) HANGUL SYLLABLE SEOG +C11E;C11E;1109 1165 11A9;C11E;1109 1165 11A9; # (섞; 섞; 섞; 섞; 섞; ) HANGUL SYLLABLE SEOGG +C11F;C11F;1109 1165 11AA;C11F;1109 1165 11AA; # (섟; 섟; 섟; 섟; 섟; ) HANGUL SYLLABLE SEOGS +C120;C120;1109 1165 11AB;C120;1109 1165 11AB; # (선; 선; 선; 선; 선; ) HANGUL SYLLABLE SEON +C121;C121;1109 1165 11AC;C121;1109 1165 11AC; # (섡; 섡; 섡; 섡; 섡; ) HANGUL SYLLABLE SEONJ +C122;C122;1109 1165 11AD;C122;1109 1165 11AD; # (섢; 섢; 섢; 섢; 섢; ) HANGUL SYLLABLE SEONH +C123;C123;1109 1165 11AE;C123;1109 1165 11AE; # (섣; 섣; 섣; 섣; 섣; ) HANGUL SYLLABLE SEOD +C124;C124;1109 1165 11AF;C124;1109 1165 11AF; # (설; 설; 설; 설; 설; ) HANGUL SYLLABLE SEOL +C125;C125;1109 1165 11B0;C125;1109 1165 11B0; # (섥; 섥; 섥; 섥; 섥; ) HANGUL SYLLABLE SEOLG +C126;C126;1109 1165 11B1;C126;1109 1165 11B1; # (섦; 섦; 섦; 섦; 섦; ) HANGUL SYLLABLE SEOLM +C127;C127;1109 1165 11B2;C127;1109 1165 11B2; # (섧; 섧; 섧; 섧; 섧; ) HANGUL SYLLABLE SEOLB +C128;C128;1109 1165 11B3;C128;1109 1165 11B3; # (섨; 섨; 섨; 섨; 섨; ) HANGUL SYLLABLE SEOLS +C129;C129;1109 1165 11B4;C129;1109 1165 11B4; # (섩; 섩; 섩; 섩; 섩; ) HANGUL SYLLABLE SEOLT +C12A;C12A;1109 1165 11B5;C12A;1109 1165 11B5; # (섪; 섪; 섪; 섪; 섪; ) HANGUL SYLLABLE SEOLP +C12B;C12B;1109 1165 11B6;C12B;1109 1165 11B6; # (섫; 섫; 섫; 섫; 섫; ) HANGUL SYLLABLE SEOLH +C12C;C12C;1109 1165 11B7;C12C;1109 1165 11B7; # (섬; 섬; 섬; 섬; 섬; ) HANGUL SYLLABLE SEOM +C12D;C12D;1109 1165 11B8;C12D;1109 1165 11B8; # (섭; 섭; 섭; 섭; 섭; ) HANGUL SYLLABLE SEOB +C12E;C12E;1109 1165 11B9;C12E;1109 1165 11B9; # (섮; 섮; 섮; 섮; 섮; ) HANGUL SYLLABLE SEOBS +C12F;C12F;1109 1165 11BA;C12F;1109 1165 11BA; # (섯; 섯; 섯; 섯; 섯; ) HANGUL SYLLABLE SEOS +C130;C130;1109 1165 11BB;C130;1109 1165 11BB; # (섰; 섰; 섰; 섰; 섰; ) HANGUL SYLLABLE SEOSS +C131;C131;1109 1165 11BC;C131;1109 1165 11BC; # (성; 성; 성; 성; 성; ) HANGUL SYLLABLE SEONG +C132;C132;1109 1165 11BD;C132;1109 1165 11BD; # (섲; 섲; 섲; 섲; 섲; ) HANGUL SYLLABLE SEOJ +C133;C133;1109 1165 11BE;C133;1109 1165 11BE; # (섳; 섳; 섳; 섳; 섳; ) HANGUL SYLLABLE SEOC +C134;C134;1109 1165 11BF;C134;1109 1165 11BF; # (섴; 섴; 섴; 섴; 섴; ) HANGUL SYLLABLE SEOK +C135;C135;1109 1165 11C0;C135;1109 1165 11C0; # (섵; 섵; 섵; 섵; 섵; ) HANGUL SYLLABLE SEOT +C136;C136;1109 1165 11C1;C136;1109 1165 11C1; # (섶; 섶; 섶; 섶; 섶; ) HANGUL SYLLABLE SEOP +C137;C137;1109 1165 11C2;C137;1109 1165 11C2; # (섷; 섷; 섷; 섷; 섷; ) HANGUL SYLLABLE SEOH +C138;C138;1109 1166;C138;1109 1166; # (세; 세; 세; 세; 세; ) HANGUL SYLLABLE SE +C139;C139;1109 1166 11A8;C139;1109 1166 11A8; # (섹; 섹; 섹; 섹; 섹; ) HANGUL SYLLABLE SEG +C13A;C13A;1109 1166 11A9;C13A;1109 1166 11A9; # (섺; 섺; 섺; 섺; 섺; ) HANGUL SYLLABLE SEGG +C13B;C13B;1109 1166 11AA;C13B;1109 1166 11AA; # (섻; 섻; 섻; 섻; 섻; ) HANGUL SYLLABLE SEGS +C13C;C13C;1109 1166 11AB;C13C;1109 1166 11AB; # (센; 센; 센; 센; 센; ) HANGUL SYLLABLE SEN +C13D;C13D;1109 1166 11AC;C13D;1109 1166 11AC; # (섽; 섽; 섽; 섽; 섽; ) HANGUL SYLLABLE SENJ +C13E;C13E;1109 1166 11AD;C13E;1109 1166 11AD; # (섾; 섾; 섾; 섾; 섾; ) HANGUL SYLLABLE SENH +C13F;C13F;1109 1166 11AE;C13F;1109 1166 11AE; # (섿; 섿; 섿; 섿; 섿; ) HANGUL SYLLABLE SED +C140;C140;1109 1166 11AF;C140;1109 1166 11AF; # (셀; 셀; 셀; 셀; 셀; ) HANGUL SYLLABLE SEL +C141;C141;1109 1166 11B0;C141;1109 1166 11B0; # (셁; 셁; 셁; 셁; 셁; ) HANGUL SYLLABLE SELG +C142;C142;1109 1166 11B1;C142;1109 1166 11B1; # (셂; 셂; 셂; 셂; 셂; ) HANGUL SYLLABLE SELM +C143;C143;1109 1166 11B2;C143;1109 1166 11B2; # (셃; 셃; 셃; 셃; 셃; ) HANGUL SYLLABLE SELB +C144;C144;1109 1166 11B3;C144;1109 1166 11B3; # (셄; 셄; 셄; 셄; 셄; ) HANGUL SYLLABLE SELS +C145;C145;1109 1166 11B4;C145;1109 1166 11B4; # (셅; 셅; 셅; 셅; 셅; ) HANGUL SYLLABLE SELT +C146;C146;1109 1166 11B5;C146;1109 1166 11B5; # (셆; 셆; 셆; 셆; 셆; ) HANGUL SYLLABLE SELP +C147;C147;1109 1166 11B6;C147;1109 1166 11B6; # (셇; 셇; 셇; 셇; 셇; ) HANGUL SYLLABLE SELH +C148;C148;1109 1166 11B7;C148;1109 1166 11B7; # (셈; 셈; 셈; 셈; 셈; ) HANGUL SYLLABLE SEM +C149;C149;1109 1166 11B8;C149;1109 1166 11B8; # (셉; 셉; 셉; 셉; 셉; ) HANGUL SYLLABLE SEB +C14A;C14A;1109 1166 11B9;C14A;1109 1166 11B9; # (셊; 셊; 셊; 셊; 셊; ) HANGUL SYLLABLE SEBS +C14B;C14B;1109 1166 11BA;C14B;1109 1166 11BA; # (셋; 셋; 셋; 셋; 셋; ) HANGUL SYLLABLE SES +C14C;C14C;1109 1166 11BB;C14C;1109 1166 11BB; # (셌; 셌; 셌; 셌; 셌; ) HANGUL SYLLABLE SESS +C14D;C14D;1109 1166 11BC;C14D;1109 1166 11BC; # (셍; 셍; 셍; 셍; 셍; ) HANGUL SYLLABLE SENG +C14E;C14E;1109 1166 11BD;C14E;1109 1166 11BD; # (셎; 셎; 셎; 셎; 셎; ) HANGUL SYLLABLE SEJ +C14F;C14F;1109 1166 11BE;C14F;1109 1166 11BE; # (셏; 셏; 셏; 셏; 셏; ) HANGUL SYLLABLE SEC +C150;C150;1109 1166 11BF;C150;1109 1166 11BF; # (셐; 셐; 셐; 셐; 셐; ) HANGUL SYLLABLE SEK +C151;C151;1109 1166 11C0;C151;1109 1166 11C0; # (셑; 셑; 셑; 셑; 셑; ) HANGUL SYLLABLE SET +C152;C152;1109 1166 11C1;C152;1109 1166 11C1; # (셒; 셒; 셒; 셒; 셒; ) HANGUL SYLLABLE SEP +C153;C153;1109 1166 11C2;C153;1109 1166 11C2; # (셓; 셓; 셓; 셓; 셓; ) HANGUL SYLLABLE SEH +C154;C154;1109 1167;C154;1109 1167; # (셔; 셔; 셔; 셔; 셔; ) HANGUL SYLLABLE SYEO +C155;C155;1109 1167 11A8;C155;1109 1167 11A8; # (셕; 셕; 셕; 셕; 셕; ) HANGUL SYLLABLE SYEOG +C156;C156;1109 1167 11A9;C156;1109 1167 11A9; # (셖; 셖; 셖; 셖; 셖; ) HANGUL SYLLABLE SYEOGG +C157;C157;1109 1167 11AA;C157;1109 1167 11AA; # (셗; 셗; 셗; 셗; 셗; ) HANGUL SYLLABLE SYEOGS +C158;C158;1109 1167 11AB;C158;1109 1167 11AB; # (션; 션; 션; 션; 션; ) HANGUL SYLLABLE SYEON +C159;C159;1109 1167 11AC;C159;1109 1167 11AC; # (셙; 셙; 셙; 셙; 셙; ) HANGUL SYLLABLE SYEONJ +C15A;C15A;1109 1167 11AD;C15A;1109 1167 11AD; # (셚; 셚; 셚; 셚; 셚; ) HANGUL SYLLABLE SYEONH +C15B;C15B;1109 1167 11AE;C15B;1109 1167 11AE; # (셛; 셛; 셛; 셛; 셛; ) HANGUL SYLLABLE SYEOD +C15C;C15C;1109 1167 11AF;C15C;1109 1167 11AF; # (셜; 셜; 셜; 셜; 셜; ) HANGUL SYLLABLE SYEOL +C15D;C15D;1109 1167 11B0;C15D;1109 1167 11B0; # (셝; 셝; 셝; 셝; 셝; ) HANGUL SYLLABLE SYEOLG +C15E;C15E;1109 1167 11B1;C15E;1109 1167 11B1; # (셞; 셞; 셞; 셞; 셞; ) HANGUL SYLLABLE SYEOLM +C15F;C15F;1109 1167 11B2;C15F;1109 1167 11B2; # (셟; 셟; 셟; 셟; 셟; ) HANGUL SYLLABLE SYEOLB +C160;C160;1109 1167 11B3;C160;1109 1167 11B3; # (셠; 셠; 셠; 셠; 셠; ) HANGUL SYLLABLE SYEOLS +C161;C161;1109 1167 11B4;C161;1109 1167 11B4; # (셡; 셡; 셡; 셡; 셡; ) HANGUL SYLLABLE SYEOLT +C162;C162;1109 1167 11B5;C162;1109 1167 11B5; # (셢; 셢; 셢; 셢; 셢; ) HANGUL SYLLABLE SYEOLP +C163;C163;1109 1167 11B6;C163;1109 1167 11B6; # (셣; 셣; 셣; 셣; 셣; ) HANGUL SYLLABLE SYEOLH +C164;C164;1109 1167 11B7;C164;1109 1167 11B7; # (셤; 셤; 셤; 셤; 셤; ) HANGUL SYLLABLE SYEOM +C165;C165;1109 1167 11B8;C165;1109 1167 11B8; # (셥; 셥; 셥; 셥; 셥; ) HANGUL SYLLABLE SYEOB +C166;C166;1109 1167 11B9;C166;1109 1167 11B9; # (셦; 셦; 셦; 셦; 셦; ) HANGUL SYLLABLE SYEOBS +C167;C167;1109 1167 11BA;C167;1109 1167 11BA; # (셧; 셧; 셧; 셧; 셧; ) HANGUL SYLLABLE SYEOS +C168;C168;1109 1167 11BB;C168;1109 1167 11BB; # (셨; 셨; 셨; 셨; 셨; ) HANGUL SYLLABLE SYEOSS +C169;C169;1109 1167 11BC;C169;1109 1167 11BC; # (셩; 셩; 셩; 셩; 셩; ) HANGUL SYLLABLE SYEONG +C16A;C16A;1109 1167 11BD;C16A;1109 1167 11BD; # (셪; 셪; 셪; 셪; 셪; ) HANGUL SYLLABLE SYEOJ +C16B;C16B;1109 1167 11BE;C16B;1109 1167 11BE; # (셫; 셫; 셫; 셫; 셫; ) HANGUL SYLLABLE SYEOC +C16C;C16C;1109 1167 11BF;C16C;1109 1167 11BF; # (셬; 셬; 셬; 셬; 셬; ) HANGUL SYLLABLE SYEOK +C16D;C16D;1109 1167 11C0;C16D;1109 1167 11C0; # (셭; 셭; 셭; 셭; 셭; ) HANGUL SYLLABLE SYEOT +C16E;C16E;1109 1167 11C1;C16E;1109 1167 11C1; # (셮; 셮; 셮; 셮; 셮; ) HANGUL SYLLABLE SYEOP +C16F;C16F;1109 1167 11C2;C16F;1109 1167 11C2; # (셯; 셯; 셯; 셯; 셯; ) HANGUL SYLLABLE SYEOH +C170;C170;1109 1168;C170;1109 1168; # (셰; 셰; 셰; 셰; 셰; ) HANGUL SYLLABLE SYE +C171;C171;1109 1168 11A8;C171;1109 1168 11A8; # (셱; 셱; 셱; 셱; 셱; ) HANGUL SYLLABLE SYEG +C172;C172;1109 1168 11A9;C172;1109 1168 11A9; # (셲; 셲; 셲; 셲; 셲; ) HANGUL SYLLABLE SYEGG +C173;C173;1109 1168 11AA;C173;1109 1168 11AA; # (셳; 셳; 셳; 셳; 셳; ) HANGUL SYLLABLE SYEGS +C174;C174;1109 1168 11AB;C174;1109 1168 11AB; # (셴; 셴; 셴; 셴; 셴; ) HANGUL SYLLABLE SYEN +C175;C175;1109 1168 11AC;C175;1109 1168 11AC; # (셵; 셵; 셵; 셵; 셵; ) HANGUL SYLLABLE SYENJ +C176;C176;1109 1168 11AD;C176;1109 1168 11AD; # (셶; 셶; 셶; 셶; 셶; ) HANGUL SYLLABLE SYENH +C177;C177;1109 1168 11AE;C177;1109 1168 11AE; # (셷; 셷; 셷; 셷; 셷; ) HANGUL SYLLABLE SYED +C178;C178;1109 1168 11AF;C178;1109 1168 11AF; # (셸; 셸; 셸; 셸; 셸; ) HANGUL SYLLABLE SYEL +C179;C179;1109 1168 11B0;C179;1109 1168 11B0; # (셹; 셹; 셹; 셹; 셹; ) HANGUL SYLLABLE SYELG +C17A;C17A;1109 1168 11B1;C17A;1109 1168 11B1; # (셺; 셺; 셺; 셺; 셺; ) HANGUL SYLLABLE SYELM +C17B;C17B;1109 1168 11B2;C17B;1109 1168 11B2; # (셻; 셻; 셻; 셻; 셻; ) HANGUL SYLLABLE SYELB +C17C;C17C;1109 1168 11B3;C17C;1109 1168 11B3; # (셼; 셼; 셼; 셼; 셼; ) HANGUL SYLLABLE SYELS +C17D;C17D;1109 1168 11B4;C17D;1109 1168 11B4; # (셽; 셽; 셽; 셽; 셽; ) HANGUL SYLLABLE SYELT +C17E;C17E;1109 1168 11B5;C17E;1109 1168 11B5; # (셾; 셾; 셾; 셾; 셾; ) HANGUL SYLLABLE SYELP +C17F;C17F;1109 1168 11B6;C17F;1109 1168 11B6; # (셿; 셿; 셿; 셿; 셿; ) HANGUL SYLLABLE SYELH +C180;C180;1109 1168 11B7;C180;1109 1168 11B7; # (솀; 솀; 솀; 솀; 솀; ) HANGUL SYLLABLE SYEM +C181;C181;1109 1168 11B8;C181;1109 1168 11B8; # (솁; 솁; 솁; 솁; 솁; ) HANGUL SYLLABLE SYEB +C182;C182;1109 1168 11B9;C182;1109 1168 11B9; # (솂; 솂; 솂; 솂; 솂; ) HANGUL SYLLABLE SYEBS +C183;C183;1109 1168 11BA;C183;1109 1168 11BA; # (솃; 솃; 솃; 솃; 솃; ) HANGUL SYLLABLE SYES +C184;C184;1109 1168 11BB;C184;1109 1168 11BB; # (솄; 솄; 솄; 솄; 솄; ) HANGUL SYLLABLE SYESS +C185;C185;1109 1168 11BC;C185;1109 1168 11BC; # (솅; 솅; 솅; 솅; 솅; ) HANGUL SYLLABLE SYENG +C186;C186;1109 1168 11BD;C186;1109 1168 11BD; # (솆; 솆; 솆; 솆; 솆; ) HANGUL SYLLABLE SYEJ +C187;C187;1109 1168 11BE;C187;1109 1168 11BE; # (솇; 솇; 솇; 솇; 솇; ) HANGUL SYLLABLE SYEC +C188;C188;1109 1168 11BF;C188;1109 1168 11BF; # (솈; 솈; 솈; 솈; 솈; ) HANGUL SYLLABLE SYEK +C189;C189;1109 1168 11C0;C189;1109 1168 11C0; # (솉; 솉; 솉; 솉; 솉; ) HANGUL SYLLABLE SYET +C18A;C18A;1109 1168 11C1;C18A;1109 1168 11C1; # (솊; 솊; 솊; 솊; 솊; ) HANGUL SYLLABLE SYEP +C18B;C18B;1109 1168 11C2;C18B;1109 1168 11C2; # (솋; 솋; 솋; 솋; 솋; ) HANGUL SYLLABLE SYEH +C18C;C18C;1109 1169;C18C;1109 1169; # (소; 소; 소; 소; 소; ) HANGUL SYLLABLE SO +C18D;C18D;1109 1169 11A8;C18D;1109 1169 11A8; # (속; 속; 속; 속; 속; ) HANGUL SYLLABLE SOG +C18E;C18E;1109 1169 11A9;C18E;1109 1169 11A9; # (솎; 솎; 솎; 솎; 솎; ) HANGUL SYLLABLE SOGG +C18F;C18F;1109 1169 11AA;C18F;1109 1169 11AA; # (솏; 솏; 솏; 솏; 솏; ) HANGUL SYLLABLE SOGS +C190;C190;1109 1169 11AB;C190;1109 1169 11AB; # (손; 손; 손; 손; 손; ) HANGUL SYLLABLE SON +C191;C191;1109 1169 11AC;C191;1109 1169 11AC; # (솑; 솑; 솑; 솑; 솑; ) HANGUL SYLLABLE SONJ +C192;C192;1109 1169 11AD;C192;1109 1169 11AD; # (솒; 솒; 솒; 솒; 솒; ) HANGUL SYLLABLE SONH +C193;C193;1109 1169 11AE;C193;1109 1169 11AE; # (솓; 솓; 솓; 솓; 솓; ) HANGUL SYLLABLE SOD +C194;C194;1109 1169 11AF;C194;1109 1169 11AF; # (솔; 솔; 솔; 솔; 솔; ) HANGUL SYLLABLE SOL +C195;C195;1109 1169 11B0;C195;1109 1169 11B0; # (솕; 솕; 솕; 솕; 솕; ) HANGUL SYLLABLE SOLG +C196;C196;1109 1169 11B1;C196;1109 1169 11B1; # (솖; 솖; 솖; 솖; 솖; ) HANGUL SYLLABLE SOLM +C197;C197;1109 1169 11B2;C197;1109 1169 11B2; # (솗; 솗; 솗; 솗; 솗; ) HANGUL SYLLABLE SOLB +C198;C198;1109 1169 11B3;C198;1109 1169 11B3; # (솘; 솘; 솘; 솘; 솘; ) HANGUL SYLLABLE SOLS +C199;C199;1109 1169 11B4;C199;1109 1169 11B4; # (솙; 솙; 솙; 솙; 솙; ) HANGUL SYLLABLE SOLT +C19A;C19A;1109 1169 11B5;C19A;1109 1169 11B5; # (솚; 솚; 솚; 솚; 솚; ) HANGUL SYLLABLE SOLP +C19B;C19B;1109 1169 11B6;C19B;1109 1169 11B6; # (솛; 솛; 솛; 솛; 솛; ) HANGUL SYLLABLE SOLH +C19C;C19C;1109 1169 11B7;C19C;1109 1169 11B7; # (솜; 솜; 솜; 솜; 솜; ) HANGUL SYLLABLE SOM +C19D;C19D;1109 1169 11B8;C19D;1109 1169 11B8; # (솝; 솝; 솝; 솝; 솝; ) HANGUL SYLLABLE SOB +C19E;C19E;1109 1169 11B9;C19E;1109 1169 11B9; # (솞; 솞; 솞; 솞; 솞; ) HANGUL SYLLABLE SOBS +C19F;C19F;1109 1169 11BA;C19F;1109 1169 11BA; # (솟; 솟; 솟; 솟; 솟; ) HANGUL SYLLABLE SOS +C1A0;C1A0;1109 1169 11BB;C1A0;1109 1169 11BB; # (솠; 솠; 솠; 솠; 솠; ) HANGUL SYLLABLE SOSS +C1A1;C1A1;1109 1169 11BC;C1A1;1109 1169 11BC; # (송; 송; 송; 송; 송; ) HANGUL SYLLABLE SONG +C1A2;C1A2;1109 1169 11BD;C1A2;1109 1169 11BD; # (솢; 솢; 솢; 솢; 솢; ) HANGUL SYLLABLE SOJ +C1A3;C1A3;1109 1169 11BE;C1A3;1109 1169 11BE; # (솣; 솣; 솣; 솣; 솣; ) HANGUL SYLLABLE SOC +C1A4;C1A4;1109 1169 11BF;C1A4;1109 1169 11BF; # (솤; 솤; 솤; 솤; 솤; ) HANGUL SYLLABLE SOK +C1A5;C1A5;1109 1169 11C0;C1A5;1109 1169 11C0; # (솥; 솥; 솥; 솥; 솥; ) HANGUL SYLLABLE SOT +C1A6;C1A6;1109 1169 11C1;C1A6;1109 1169 11C1; # (솦; 솦; 솦; 솦; 솦; ) HANGUL SYLLABLE SOP +C1A7;C1A7;1109 1169 11C2;C1A7;1109 1169 11C2; # (솧; 솧; 솧; 솧; 솧; ) HANGUL SYLLABLE SOH +C1A8;C1A8;1109 116A;C1A8;1109 116A; # (솨; 솨; 솨; 솨; 솨; ) HANGUL SYLLABLE SWA +C1A9;C1A9;1109 116A 11A8;C1A9;1109 116A 11A8; # (솩; 솩; 솩; 솩; 솩; ) HANGUL SYLLABLE SWAG +C1AA;C1AA;1109 116A 11A9;C1AA;1109 116A 11A9; # (솪; 솪; 솪; 솪; 솪; ) HANGUL SYLLABLE SWAGG +C1AB;C1AB;1109 116A 11AA;C1AB;1109 116A 11AA; # (솫; 솫; 솫; 솫; 솫; ) HANGUL SYLLABLE SWAGS +C1AC;C1AC;1109 116A 11AB;C1AC;1109 116A 11AB; # (솬; 솬; 솬; 솬; 솬; ) HANGUL SYLLABLE SWAN +C1AD;C1AD;1109 116A 11AC;C1AD;1109 116A 11AC; # (솭; 솭; 솭; 솭; 솭; ) HANGUL SYLLABLE SWANJ +C1AE;C1AE;1109 116A 11AD;C1AE;1109 116A 11AD; # (솮; 솮; 솮; 솮; 솮; ) HANGUL SYLLABLE SWANH +C1AF;C1AF;1109 116A 11AE;C1AF;1109 116A 11AE; # (솯; 솯; 솯; 솯; 솯; ) HANGUL SYLLABLE SWAD +C1B0;C1B0;1109 116A 11AF;C1B0;1109 116A 11AF; # (솰; 솰; 솰; 솰; 솰; ) HANGUL SYLLABLE SWAL +C1B1;C1B1;1109 116A 11B0;C1B1;1109 116A 11B0; # (솱; 솱; 솱; 솱; 솱; ) HANGUL SYLLABLE SWALG +C1B2;C1B2;1109 116A 11B1;C1B2;1109 116A 11B1; # (솲; 솲; 솲; 솲; 솲; ) HANGUL SYLLABLE SWALM +C1B3;C1B3;1109 116A 11B2;C1B3;1109 116A 11B2; # (솳; 솳; 솳; 솳; 솳; ) HANGUL SYLLABLE SWALB +C1B4;C1B4;1109 116A 11B3;C1B4;1109 116A 11B3; # (솴; 솴; 솴; 솴; 솴; ) HANGUL SYLLABLE SWALS +C1B5;C1B5;1109 116A 11B4;C1B5;1109 116A 11B4; # (솵; 솵; 솵; 솵; 솵; ) HANGUL SYLLABLE SWALT +C1B6;C1B6;1109 116A 11B5;C1B6;1109 116A 11B5; # (솶; 솶; 솶; 솶; 솶; ) HANGUL SYLLABLE SWALP +C1B7;C1B7;1109 116A 11B6;C1B7;1109 116A 11B6; # (솷; 솷; 솷; 솷; 솷; ) HANGUL SYLLABLE SWALH +C1B8;C1B8;1109 116A 11B7;C1B8;1109 116A 11B7; # (솸; 솸; 솸; 솸; 솸; ) HANGUL SYLLABLE SWAM +C1B9;C1B9;1109 116A 11B8;C1B9;1109 116A 11B8; # (솹; 솹; 솹; 솹; 솹; ) HANGUL SYLLABLE SWAB +C1BA;C1BA;1109 116A 11B9;C1BA;1109 116A 11B9; # (솺; 솺; 솺; 솺; 솺; ) HANGUL SYLLABLE SWABS +C1BB;C1BB;1109 116A 11BA;C1BB;1109 116A 11BA; # (솻; 솻; 솻; 솻; 솻; ) HANGUL SYLLABLE SWAS +C1BC;C1BC;1109 116A 11BB;C1BC;1109 116A 11BB; # (솼; 솼; 솼; 솼; 솼; ) HANGUL SYLLABLE SWASS +C1BD;C1BD;1109 116A 11BC;C1BD;1109 116A 11BC; # (솽; 솽; 솽; 솽; 솽; ) HANGUL SYLLABLE SWANG +C1BE;C1BE;1109 116A 11BD;C1BE;1109 116A 11BD; # (솾; 솾; 솾; 솾; 솾; ) HANGUL SYLLABLE SWAJ +C1BF;C1BF;1109 116A 11BE;C1BF;1109 116A 11BE; # (솿; 솿; 솿; 솿; 솿; ) HANGUL SYLLABLE SWAC +C1C0;C1C0;1109 116A 11BF;C1C0;1109 116A 11BF; # (쇀; 쇀; 쇀; 쇀; 쇀; ) HANGUL SYLLABLE SWAK +C1C1;C1C1;1109 116A 11C0;C1C1;1109 116A 11C0; # (쇁; 쇁; 쇁; 쇁; 쇁; ) HANGUL SYLLABLE SWAT +C1C2;C1C2;1109 116A 11C1;C1C2;1109 116A 11C1; # (쇂; 쇂; 쇂; 쇂; 쇂; ) HANGUL SYLLABLE SWAP +C1C3;C1C3;1109 116A 11C2;C1C3;1109 116A 11C2; # (쇃; 쇃; 쇃; 쇃; 쇃; ) HANGUL SYLLABLE SWAH +C1C4;C1C4;1109 116B;C1C4;1109 116B; # (쇄; 쇄; 쇄; 쇄; 쇄; ) HANGUL SYLLABLE SWAE +C1C5;C1C5;1109 116B 11A8;C1C5;1109 116B 11A8; # (쇅; 쇅; 쇅; 쇅; 쇅; ) HANGUL SYLLABLE SWAEG +C1C6;C1C6;1109 116B 11A9;C1C6;1109 116B 11A9; # (쇆; 쇆; 쇆; 쇆; 쇆; ) HANGUL SYLLABLE SWAEGG +C1C7;C1C7;1109 116B 11AA;C1C7;1109 116B 11AA; # (쇇; 쇇; 쇇; 쇇; 쇇; ) HANGUL SYLLABLE SWAEGS +C1C8;C1C8;1109 116B 11AB;C1C8;1109 116B 11AB; # (쇈; 쇈; 쇈; 쇈; 쇈; ) HANGUL SYLLABLE SWAEN +C1C9;C1C9;1109 116B 11AC;C1C9;1109 116B 11AC; # (쇉; 쇉; 쇉; 쇉; 쇉; ) HANGUL SYLLABLE SWAENJ +C1CA;C1CA;1109 116B 11AD;C1CA;1109 116B 11AD; # (쇊; 쇊; 쇊; 쇊; 쇊; ) HANGUL SYLLABLE SWAENH +C1CB;C1CB;1109 116B 11AE;C1CB;1109 116B 11AE; # (쇋; 쇋; 쇋; 쇋; 쇋; ) HANGUL SYLLABLE SWAED +C1CC;C1CC;1109 116B 11AF;C1CC;1109 116B 11AF; # (쇌; 쇌; 쇌; 쇌; 쇌; ) HANGUL SYLLABLE SWAEL +C1CD;C1CD;1109 116B 11B0;C1CD;1109 116B 11B0; # (쇍; 쇍; 쇍; 쇍; 쇍; ) HANGUL SYLLABLE SWAELG +C1CE;C1CE;1109 116B 11B1;C1CE;1109 116B 11B1; # (쇎; 쇎; 쇎; 쇎; 쇎; ) HANGUL SYLLABLE SWAELM +C1CF;C1CF;1109 116B 11B2;C1CF;1109 116B 11B2; # (쇏; 쇏; 쇏; 쇏; 쇏; ) HANGUL SYLLABLE SWAELB +C1D0;C1D0;1109 116B 11B3;C1D0;1109 116B 11B3; # (쇐; 쇐; 쇐; 쇐; 쇐; ) HANGUL SYLLABLE SWAELS +C1D1;C1D1;1109 116B 11B4;C1D1;1109 116B 11B4; # (쇑; 쇑; 쇑; 쇑; 쇑; ) HANGUL SYLLABLE SWAELT +C1D2;C1D2;1109 116B 11B5;C1D2;1109 116B 11B5; # (쇒; 쇒; 쇒; 쇒; 쇒; ) HANGUL SYLLABLE SWAELP +C1D3;C1D3;1109 116B 11B6;C1D3;1109 116B 11B6; # (쇓; 쇓; 쇓; 쇓; 쇓; ) HANGUL SYLLABLE SWAELH +C1D4;C1D4;1109 116B 11B7;C1D4;1109 116B 11B7; # (쇔; 쇔; 쇔; 쇔; 쇔; ) HANGUL SYLLABLE SWAEM +C1D5;C1D5;1109 116B 11B8;C1D5;1109 116B 11B8; # (쇕; 쇕; 쇕; 쇕; 쇕; ) HANGUL SYLLABLE SWAEB +C1D6;C1D6;1109 116B 11B9;C1D6;1109 116B 11B9; # (쇖; 쇖; 쇖; 쇖; 쇖; ) HANGUL SYLLABLE SWAEBS +C1D7;C1D7;1109 116B 11BA;C1D7;1109 116B 11BA; # (쇗; 쇗; 쇗; 쇗; 쇗; ) HANGUL SYLLABLE SWAES +C1D8;C1D8;1109 116B 11BB;C1D8;1109 116B 11BB; # (쇘; 쇘; 쇘; 쇘; 쇘; ) HANGUL SYLLABLE SWAESS +C1D9;C1D9;1109 116B 11BC;C1D9;1109 116B 11BC; # (쇙; 쇙; 쇙; 쇙; 쇙; ) HANGUL SYLLABLE SWAENG +C1DA;C1DA;1109 116B 11BD;C1DA;1109 116B 11BD; # (쇚; 쇚; 쇚; 쇚; 쇚; ) HANGUL SYLLABLE SWAEJ +C1DB;C1DB;1109 116B 11BE;C1DB;1109 116B 11BE; # (쇛; 쇛; 쇛; 쇛; 쇛; ) HANGUL SYLLABLE SWAEC +C1DC;C1DC;1109 116B 11BF;C1DC;1109 116B 11BF; # (쇜; 쇜; 쇜; 쇜; 쇜; ) HANGUL SYLLABLE SWAEK +C1DD;C1DD;1109 116B 11C0;C1DD;1109 116B 11C0; # (쇝; 쇝; 쇝; 쇝; 쇝; ) HANGUL SYLLABLE SWAET +C1DE;C1DE;1109 116B 11C1;C1DE;1109 116B 11C1; # (쇞; 쇞; 쇞; 쇞; 쇞; ) HANGUL SYLLABLE SWAEP +C1DF;C1DF;1109 116B 11C2;C1DF;1109 116B 11C2; # (쇟; 쇟; 쇟; 쇟; 쇟; ) HANGUL SYLLABLE SWAEH +C1E0;C1E0;1109 116C;C1E0;1109 116C; # (쇠; 쇠; 쇠; 쇠; 쇠; ) HANGUL SYLLABLE SOE +C1E1;C1E1;1109 116C 11A8;C1E1;1109 116C 11A8; # (쇡; 쇡; 쇡; 쇡; 쇡; ) HANGUL SYLLABLE SOEG +C1E2;C1E2;1109 116C 11A9;C1E2;1109 116C 11A9; # (쇢; 쇢; 쇢; 쇢; 쇢; ) HANGUL SYLLABLE SOEGG +C1E3;C1E3;1109 116C 11AA;C1E3;1109 116C 11AA; # (쇣; 쇣; 쇣; 쇣; 쇣; ) HANGUL SYLLABLE SOEGS +C1E4;C1E4;1109 116C 11AB;C1E4;1109 116C 11AB; # (쇤; 쇤; 쇤; 쇤; 쇤; ) HANGUL SYLLABLE SOEN +C1E5;C1E5;1109 116C 11AC;C1E5;1109 116C 11AC; # (쇥; 쇥; 쇥; 쇥; 쇥; ) HANGUL SYLLABLE SOENJ +C1E6;C1E6;1109 116C 11AD;C1E6;1109 116C 11AD; # (쇦; 쇦; 쇦; 쇦; 쇦; ) HANGUL SYLLABLE SOENH +C1E7;C1E7;1109 116C 11AE;C1E7;1109 116C 11AE; # (쇧; 쇧; 쇧; 쇧; 쇧; ) HANGUL SYLLABLE SOED +C1E8;C1E8;1109 116C 11AF;C1E8;1109 116C 11AF; # (쇨; 쇨; 쇨; 쇨; 쇨; ) HANGUL SYLLABLE SOEL +C1E9;C1E9;1109 116C 11B0;C1E9;1109 116C 11B0; # (쇩; 쇩; 쇩; 쇩; 쇩; ) HANGUL SYLLABLE SOELG +C1EA;C1EA;1109 116C 11B1;C1EA;1109 116C 11B1; # (쇪; 쇪; 쇪; 쇪; 쇪; ) HANGUL SYLLABLE SOELM +C1EB;C1EB;1109 116C 11B2;C1EB;1109 116C 11B2; # (쇫; 쇫; 쇫; 쇫; 쇫; ) HANGUL SYLLABLE SOELB +C1EC;C1EC;1109 116C 11B3;C1EC;1109 116C 11B3; # (쇬; 쇬; 쇬; 쇬; 쇬; ) HANGUL SYLLABLE SOELS +C1ED;C1ED;1109 116C 11B4;C1ED;1109 116C 11B4; # (쇭; 쇭; 쇭; 쇭; 쇭; ) HANGUL SYLLABLE SOELT +C1EE;C1EE;1109 116C 11B5;C1EE;1109 116C 11B5; # (쇮; 쇮; 쇮; 쇮; 쇮; ) HANGUL SYLLABLE SOELP +C1EF;C1EF;1109 116C 11B6;C1EF;1109 116C 11B6; # (쇯; 쇯; 쇯; 쇯; 쇯; ) HANGUL SYLLABLE SOELH +C1F0;C1F0;1109 116C 11B7;C1F0;1109 116C 11B7; # (쇰; 쇰; 쇰; 쇰; 쇰; ) HANGUL SYLLABLE SOEM +C1F1;C1F1;1109 116C 11B8;C1F1;1109 116C 11B8; # (쇱; 쇱; 쇱; 쇱; 쇱; ) HANGUL SYLLABLE SOEB +C1F2;C1F2;1109 116C 11B9;C1F2;1109 116C 11B9; # (쇲; 쇲; 쇲; 쇲; 쇲; ) HANGUL SYLLABLE SOEBS +C1F3;C1F3;1109 116C 11BA;C1F3;1109 116C 11BA; # (쇳; 쇳; 쇳; 쇳; 쇳; ) HANGUL SYLLABLE SOES +C1F4;C1F4;1109 116C 11BB;C1F4;1109 116C 11BB; # (쇴; 쇴; 쇴; 쇴; 쇴; ) HANGUL SYLLABLE SOESS +C1F5;C1F5;1109 116C 11BC;C1F5;1109 116C 11BC; # (쇵; 쇵; 쇵; 쇵; 쇵; ) HANGUL SYLLABLE SOENG +C1F6;C1F6;1109 116C 11BD;C1F6;1109 116C 11BD; # (쇶; 쇶; 쇶; 쇶; 쇶; ) HANGUL SYLLABLE SOEJ +C1F7;C1F7;1109 116C 11BE;C1F7;1109 116C 11BE; # (쇷; 쇷; 쇷; 쇷; 쇷; ) HANGUL SYLLABLE SOEC +C1F8;C1F8;1109 116C 11BF;C1F8;1109 116C 11BF; # (쇸; 쇸; 쇸; 쇸; 쇸; ) HANGUL SYLLABLE SOEK +C1F9;C1F9;1109 116C 11C0;C1F9;1109 116C 11C0; # (쇹; 쇹; 쇹; 쇹; 쇹; ) HANGUL SYLLABLE SOET +C1FA;C1FA;1109 116C 11C1;C1FA;1109 116C 11C1; # (쇺; 쇺; 쇺; 쇺; 쇺; ) HANGUL SYLLABLE SOEP +C1FB;C1FB;1109 116C 11C2;C1FB;1109 116C 11C2; # (쇻; 쇻; 쇻; 쇻; 쇻; ) HANGUL SYLLABLE SOEH +C1FC;C1FC;1109 116D;C1FC;1109 116D; # (쇼; 쇼; 쇼; 쇼; 쇼; ) HANGUL SYLLABLE SYO +C1FD;C1FD;1109 116D 11A8;C1FD;1109 116D 11A8; # (쇽; 쇽; 쇽; 쇽; 쇽; ) HANGUL SYLLABLE SYOG +C1FE;C1FE;1109 116D 11A9;C1FE;1109 116D 11A9; # (쇾; 쇾; 쇾; 쇾; 쇾; ) HANGUL SYLLABLE SYOGG +C1FF;C1FF;1109 116D 11AA;C1FF;1109 116D 11AA; # (쇿; 쇿; 쇿; 쇿; 쇿; ) HANGUL SYLLABLE SYOGS +C200;C200;1109 116D 11AB;C200;1109 116D 11AB; # (숀; 숀; 숀; 숀; 숀; ) HANGUL SYLLABLE SYON +C201;C201;1109 116D 11AC;C201;1109 116D 11AC; # (숁; 숁; 숁; 숁; 숁; ) HANGUL SYLLABLE SYONJ +C202;C202;1109 116D 11AD;C202;1109 116D 11AD; # (숂; 숂; 숂; 숂; 숂; ) HANGUL SYLLABLE SYONH +C203;C203;1109 116D 11AE;C203;1109 116D 11AE; # (숃; 숃; 숃; 숃; 숃; ) HANGUL SYLLABLE SYOD +C204;C204;1109 116D 11AF;C204;1109 116D 11AF; # (숄; 숄; 숄; 숄; 숄; ) HANGUL SYLLABLE SYOL +C205;C205;1109 116D 11B0;C205;1109 116D 11B0; # (숅; 숅; 숅; 숅; 숅; ) HANGUL SYLLABLE SYOLG +C206;C206;1109 116D 11B1;C206;1109 116D 11B1; # (숆; 숆; 숆; 숆; 숆; ) HANGUL SYLLABLE SYOLM +C207;C207;1109 116D 11B2;C207;1109 116D 11B2; # (숇; 숇; 숇; 숇; 숇; ) HANGUL SYLLABLE SYOLB +C208;C208;1109 116D 11B3;C208;1109 116D 11B3; # (숈; 숈; 숈; 숈; 숈; ) HANGUL SYLLABLE SYOLS +C209;C209;1109 116D 11B4;C209;1109 116D 11B4; # (숉; 숉; 숉; 숉; 숉; ) HANGUL SYLLABLE SYOLT +C20A;C20A;1109 116D 11B5;C20A;1109 116D 11B5; # (숊; 숊; 숊; 숊; 숊; ) HANGUL SYLLABLE SYOLP +C20B;C20B;1109 116D 11B6;C20B;1109 116D 11B6; # (숋; 숋; 숋; 숋; 숋; ) HANGUL SYLLABLE SYOLH +C20C;C20C;1109 116D 11B7;C20C;1109 116D 11B7; # (숌; 숌; 숌; 숌; 숌; ) HANGUL SYLLABLE SYOM +C20D;C20D;1109 116D 11B8;C20D;1109 116D 11B8; # (숍; 숍; 숍; 숍; 숍; ) HANGUL SYLLABLE SYOB +C20E;C20E;1109 116D 11B9;C20E;1109 116D 11B9; # (숎; 숎; 숎; 숎; 숎; ) HANGUL SYLLABLE SYOBS +C20F;C20F;1109 116D 11BA;C20F;1109 116D 11BA; # (숏; 숏; 숏; 숏; 숏; ) HANGUL SYLLABLE SYOS +C210;C210;1109 116D 11BB;C210;1109 116D 11BB; # (숐; 숐; 숐; 숐; 숐; ) HANGUL SYLLABLE SYOSS +C211;C211;1109 116D 11BC;C211;1109 116D 11BC; # (숑; 숑; 숑; 숑; 숑; ) HANGUL SYLLABLE SYONG +C212;C212;1109 116D 11BD;C212;1109 116D 11BD; # (숒; 숒; 숒; 숒; 숒; ) HANGUL SYLLABLE SYOJ +C213;C213;1109 116D 11BE;C213;1109 116D 11BE; # (숓; 숓; 숓; 숓; 숓; ) HANGUL SYLLABLE SYOC +C214;C214;1109 116D 11BF;C214;1109 116D 11BF; # (숔; 숔; 숔; 숔; 숔; ) HANGUL SYLLABLE SYOK +C215;C215;1109 116D 11C0;C215;1109 116D 11C0; # (숕; 숕; 숕; 숕; 숕; ) HANGUL SYLLABLE SYOT +C216;C216;1109 116D 11C1;C216;1109 116D 11C1; # (숖; 숖; 숖; 숖; 숖; ) HANGUL SYLLABLE SYOP +C217;C217;1109 116D 11C2;C217;1109 116D 11C2; # (숗; 숗; 숗; 숗; 숗; ) HANGUL SYLLABLE SYOH +C218;C218;1109 116E;C218;1109 116E; # (수; 수; 수; 수; 수; ) HANGUL SYLLABLE SU +C219;C219;1109 116E 11A8;C219;1109 116E 11A8; # (숙; 숙; 숙; 숙; 숙; ) HANGUL SYLLABLE SUG +C21A;C21A;1109 116E 11A9;C21A;1109 116E 11A9; # (숚; 숚; 숚; 숚; 숚; ) HANGUL SYLLABLE SUGG +C21B;C21B;1109 116E 11AA;C21B;1109 116E 11AA; # (숛; 숛; 숛; 숛; 숛; ) HANGUL SYLLABLE SUGS +C21C;C21C;1109 116E 11AB;C21C;1109 116E 11AB; # (순; 순; 순; 순; 순; ) HANGUL SYLLABLE SUN +C21D;C21D;1109 116E 11AC;C21D;1109 116E 11AC; # (숝; 숝; 숝; 숝; 숝; ) HANGUL SYLLABLE SUNJ +C21E;C21E;1109 116E 11AD;C21E;1109 116E 11AD; # (숞; 숞; 숞; 숞; 숞; ) HANGUL SYLLABLE SUNH +C21F;C21F;1109 116E 11AE;C21F;1109 116E 11AE; # (숟; 숟; 숟; 숟; 숟; ) HANGUL SYLLABLE SUD +C220;C220;1109 116E 11AF;C220;1109 116E 11AF; # (술; 술; 술; 술; 술; ) HANGUL SYLLABLE SUL +C221;C221;1109 116E 11B0;C221;1109 116E 11B0; # (숡; 숡; 숡; 숡; 숡; ) HANGUL SYLLABLE SULG +C222;C222;1109 116E 11B1;C222;1109 116E 11B1; # (숢; 숢; 숢; 숢; 숢; ) HANGUL SYLLABLE SULM +C223;C223;1109 116E 11B2;C223;1109 116E 11B2; # (숣; 숣; 숣; 숣; 숣; ) HANGUL SYLLABLE SULB +C224;C224;1109 116E 11B3;C224;1109 116E 11B3; # (숤; 숤; 숤; 숤; 숤; ) HANGUL SYLLABLE SULS +C225;C225;1109 116E 11B4;C225;1109 116E 11B4; # (숥; 숥; 숥; 숥; 숥; ) HANGUL SYLLABLE SULT +C226;C226;1109 116E 11B5;C226;1109 116E 11B5; # (숦; 숦; 숦; 숦; 숦; ) HANGUL SYLLABLE SULP +C227;C227;1109 116E 11B6;C227;1109 116E 11B6; # (숧; 숧; 숧; 숧; 숧; ) HANGUL SYLLABLE SULH +C228;C228;1109 116E 11B7;C228;1109 116E 11B7; # (숨; 숨; 숨; 숨; 숨; ) HANGUL SYLLABLE SUM +C229;C229;1109 116E 11B8;C229;1109 116E 11B8; # (숩; 숩; 숩; 숩; 숩; ) HANGUL SYLLABLE SUB +C22A;C22A;1109 116E 11B9;C22A;1109 116E 11B9; # (숪; 숪; 숪; 숪; 숪; ) HANGUL SYLLABLE SUBS +C22B;C22B;1109 116E 11BA;C22B;1109 116E 11BA; # (숫; 숫; 숫; 숫; 숫; ) HANGUL SYLLABLE SUS +C22C;C22C;1109 116E 11BB;C22C;1109 116E 11BB; # (숬; 숬; 숬; 숬; 숬; ) HANGUL SYLLABLE SUSS +C22D;C22D;1109 116E 11BC;C22D;1109 116E 11BC; # (숭; 숭; 숭; 숭; 숭; ) HANGUL SYLLABLE SUNG +C22E;C22E;1109 116E 11BD;C22E;1109 116E 11BD; # (숮; 숮; 숮; 숮; 숮; ) HANGUL SYLLABLE SUJ +C22F;C22F;1109 116E 11BE;C22F;1109 116E 11BE; # (숯; 숯; 숯; 숯; 숯; ) HANGUL SYLLABLE SUC +C230;C230;1109 116E 11BF;C230;1109 116E 11BF; # (숰; 숰; 숰; 숰; 숰; ) HANGUL SYLLABLE SUK +C231;C231;1109 116E 11C0;C231;1109 116E 11C0; # (숱; 숱; 숱; 숱; 숱; ) HANGUL SYLLABLE SUT +C232;C232;1109 116E 11C1;C232;1109 116E 11C1; # (숲; 숲; 숲; 숲; 숲; ) HANGUL SYLLABLE SUP +C233;C233;1109 116E 11C2;C233;1109 116E 11C2; # (숳; 숳; 숳; 숳; 숳; ) HANGUL SYLLABLE SUH +C234;C234;1109 116F;C234;1109 116F; # (숴; 숴; 숴; 숴; 숴; ) HANGUL SYLLABLE SWEO +C235;C235;1109 116F 11A8;C235;1109 116F 11A8; # (숵; 숵; 숵; 숵; 숵; ) HANGUL SYLLABLE SWEOG +C236;C236;1109 116F 11A9;C236;1109 116F 11A9; # (숶; 숶; 숶; 숶; 숶; ) HANGUL SYLLABLE SWEOGG +C237;C237;1109 116F 11AA;C237;1109 116F 11AA; # (숷; 숷; 숷; 숷; 숷; ) HANGUL SYLLABLE SWEOGS +C238;C238;1109 116F 11AB;C238;1109 116F 11AB; # (숸; 숸; 숸; 숸; 숸; ) HANGUL SYLLABLE SWEON +C239;C239;1109 116F 11AC;C239;1109 116F 11AC; # (숹; 숹; 숹; 숹; 숹; ) HANGUL SYLLABLE SWEONJ +C23A;C23A;1109 116F 11AD;C23A;1109 116F 11AD; # (숺; 숺; 숺; 숺; 숺; ) HANGUL SYLLABLE SWEONH +C23B;C23B;1109 116F 11AE;C23B;1109 116F 11AE; # (숻; 숻; 숻; 숻; 숻; ) HANGUL SYLLABLE SWEOD +C23C;C23C;1109 116F 11AF;C23C;1109 116F 11AF; # (숼; 숼; 숼; 숼; 숼; ) HANGUL SYLLABLE SWEOL +C23D;C23D;1109 116F 11B0;C23D;1109 116F 11B0; # (숽; 숽; 숽; 숽; 숽; ) HANGUL SYLLABLE SWEOLG +C23E;C23E;1109 116F 11B1;C23E;1109 116F 11B1; # (숾; 숾; 숾; 숾; 숾; ) HANGUL SYLLABLE SWEOLM +C23F;C23F;1109 116F 11B2;C23F;1109 116F 11B2; # (숿; 숿; 숿; 숿; 숿; ) HANGUL SYLLABLE SWEOLB +C240;C240;1109 116F 11B3;C240;1109 116F 11B3; # (쉀; 쉀; 쉀; 쉀; 쉀; ) HANGUL SYLLABLE SWEOLS +C241;C241;1109 116F 11B4;C241;1109 116F 11B4; # (쉁; 쉁; 쉁; 쉁; 쉁; ) HANGUL SYLLABLE SWEOLT +C242;C242;1109 116F 11B5;C242;1109 116F 11B5; # (쉂; 쉂; 쉂; 쉂; 쉂; ) HANGUL SYLLABLE SWEOLP +C243;C243;1109 116F 11B6;C243;1109 116F 11B6; # (쉃; 쉃; 쉃; 쉃; 쉃; ) HANGUL SYLLABLE SWEOLH +C244;C244;1109 116F 11B7;C244;1109 116F 11B7; # (쉄; 쉄; 쉄; 쉄; 쉄; ) HANGUL SYLLABLE SWEOM +C245;C245;1109 116F 11B8;C245;1109 116F 11B8; # (쉅; 쉅; 쉅; 쉅; 쉅; ) HANGUL SYLLABLE SWEOB +C246;C246;1109 116F 11B9;C246;1109 116F 11B9; # (쉆; 쉆; 쉆; 쉆; 쉆; ) HANGUL SYLLABLE SWEOBS +C247;C247;1109 116F 11BA;C247;1109 116F 11BA; # (쉇; 쉇; 쉇; 쉇; 쉇; ) HANGUL SYLLABLE SWEOS +C248;C248;1109 116F 11BB;C248;1109 116F 11BB; # (쉈; 쉈; 쉈; 쉈; 쉈; ) HANGUL SYLLABLE SWEOSS +C249;C249;1109 116F 11BC;C249;1109 116F 11BC; # (쉉; 쉉; 쉉; 쉉; 쉉; ) HANGUL SYLLABLE SWEONG +C24A;C24A;1109 116F 11BD;C24A;1109 116F 11BD; # (쉊; 쉊; 쉊; 쉊; 쉊; ) HANGUL SYLLABLE SWEOJ +C24B;C24B;1109 116F 11BE;C24B;1109 116F 11BE; # (쉋; 쉋; 쉋; 쉋; 쉋; ) HANGUL SYLLABLE SWEOC +C24C;C24C;1109 116F 11BF;C24C;1109 116F 11BF; # (쉌; 쉌; 쉌; 쉌; 쉌; ) HANGUL SYLLABLE SWEOK +C24D;C24D;1109 116F 11C0;C24D;1109 116F 11C0; # (쉍; 쉍; 쉍; 쉍; 쉍; ) HANGUL SYLLABLE SWEOT +C24E;C24E;1109 116F 11C1;C24E;1109 116F 11C1; # (쉎; 쉎; 쉎; 쉎; 쉎; ) HANGUL SYLLABLE SWEOP +C24F;C24F;1109 116F 11C2;C24F;1109 116F 11C2; # (쉏; 쉏; 쉏; 쉏; 쉏; ) HANGUL SYLLABLE SWEOH +C250;C250;1109 1170;C250;1109 1170; # (쉐; 쉐; 쉐; 쉐; 쉐; ) HANGUL SYLLABLE SWE +C251;C251;1109 1170 11A8;C251;1109 1170 11A8; # (쉑; 쉑; 쉑; 쉑; 쉑; ) HANGUL SYLLABLE SWEG +C252;C252;1109 1170 11A9;C252;1109 1170 11A9; # (쉒; 쉒; 쉒; 쉒; 쉒; ) HANGUL SYLLABLE SWEGG +C253;C253;1109 1170 11AA;C253;1109 1170 11AA; # (쉓; 쉓; 쉓; 쉓; 쉓; ) HANGUL SYLLABLE SWEGS +C254;C254;1109 1170 11AB;C254;1109 1170 11AB; # (쉔; 쉔; 쉔; 쉔; 쉔; ) HANGUL SYLLABLE SWEN +C255;C255;1109 1170 11AC;C255;1109 1170 11AC; # (쉕; 쉕; 쉕; 쉕; 쉕; ) HANGUL SYLLABLE SWENJ +C256;C256;1109 1170 11AD;C256;1109 1170 11AD; # (쉖; 쉖; 쉖; 쉖; 쉖; ) HANGUL SYLLABLE SWENH +C257;C257;1109 1170 11AE;C257;1109 1170 11AE; # (쉗; 쉗; 쉗; 쉗; 쉗; ) HANGUL SYLLABLE SWED +C258;C258;1109 1170 11AF;C258;1109 1170 11AF; # (쉘; 쉘; 쉘; 쉘; 쉘; ) HANGUL SYLLABLE SWEL +C259;C259;1109 1170 11B0;C259;1109 1170 11B0; # (쉙; 쉙; 쉙; 쉙; 쉙; ) HANGUL SYLLABLE SWELG +C25A;C25A;1109 1170 11B1;C25A;1109 1170 11B1; # (쉚; 쉚; 쉚; 쉚; 쉚; ) HANGUL SYLLABLE SWELM +C25B;C25B;1109 1170 11B2;C25B;1109 1170 11B2; # (쉛; 쉛; 쉛; 쉛; 쉛; ) HANGUL SYLLABLE SWELB +C25C;C25C;1109 1170 11B3;C25C;1109 1170 11B3; # (쉜; 쉜; 쉜; 쉜; 쉜; ) HANGUL SYLLABLE SWELS +C25D;C25D;1109 1170 11B4;C25D;1109 1170 11B4; # (쉝; 쉝; 쉝; 쉝; 쉝; ) HANGUL SYLLABLE SWELT +C25E;C25E;1109 1170 11B5;C25E;1109 1170 11B5; # (쉞; 쉞; 쉞; 쉞; 쉞; ) HANGUL SYLLABLE SWELP +C25F;C25F;1109 1170 11B6;C25F;1109 1170 11B6; # (쉟; 쉟; 쉟; 쉟; 쉟; ) HANGUL SYLLABLE SWELH +C260;C260;1109 1170 11B7;C260;1109 1170 11B7; # (쉠; 쉠; 쉠; 쉠; 쉠; ) HANGUL SYLLABLE SWEM +C261;C261;1109 1170 11B8;C261;1109 1170 11B8; # (쉡; 쉡; 쉡; 쉡; 쉡; ) HANGUL SYLLABLE SWEB +C262;C262;1109 1170 11B9;C262;1109 1170 11B9; # (쉢; 쉢; 쉢; 쉢; 쉢; ) HANGUL SYLLABLE SWEBS +C263;C263;1109 1170 11BA;C263;1109 1170 11BA; # (쉣; 쉣; 쉣; 쉣; 쉣; ) HANGUL SYLLABLE SWES +C264;C264;1109 1170 11BB;C264;1109 1170 11BB; # (쉤; 쉤; 쉤; 쉤; 쉤; ) HANGUL SYLLABLE SWESS +C265;C265;1109 1170 11BC;C265;1109 1170 11BC; # (쉥; 쉥; 쉥; 쉥; 쉥; ) HANGUL SYLLABLE SWENG +C266;C266;1109 1170 11BD;C266;1109 1170 11BD; # (쉦; 쉦; 쉦; 쉦; 쉦; ) HANGUL SYLLABLE SWEJ +C267;C267;1109 1170 11BE;C267;1109 1170 11BE; # (쉧; 쉧; 쉧; 쉧; 쉧; ) HANGUL SYLLABLE SWEC +C268;C268;1109 1170 11BF;C268;1109 1170 11BF; # (쉨; 쉨; 쉨; 쉨; 쉨; ) HANGUL SYLLABLE SWEK +C269;C269;1109 1170 11C0;C269;1109 1170 11C0; # (쉩; 쉩; 쉩; 쉩; 쉩; ) HANGUL SYLLABLE SWET +C26A;C26A;1109 1170 11C1;C26A;1109 1170 11C1; # (쉪; 쉪; 쉪; 쉪; 쉪; ) HANGUL SYLLABLE SWEP +C26B;C26B;1109 1170 11C2;C26B;1109 1170 11C2; # (쉫; 쉫; 쉫; 쉫; 쉫; ) HANGUL SYLLABLE SWEH +C26C;C26C;1109 1171;C26C;1109 1171; # (쉬; 쉬; 쉬; 쉬; 쉬; ) HANGUL SYLLABLE SWI +C26D;C26D;1109 1171 11A8;C26D;1109 1171 11A8; # (쉭; 쉭; 쉭; 쉭; 쉭; ) HANGUL SYLLABLE SWIG +C26E;C26E;1109 1171 11A9;C26E;1109 1171 11A9; # (쉮; 쉮; 쉮; 쉮; 쉮; ) HANGUL SYLLABLE SWIGG +C26F;C26F;1109 1171 11AA;C26F;1109 1171 11AA; # (쉯; 쉯; 쉯; 쉯; 쉯; ) HANGUL SYLLABLE SWIGS +C270;C270;1109 1171 11AB;C270;1109 1171 11AB; # (쉰; 쉰; 쉰; 쉰; 쉰; ) HANGUL SYLLABLE SWIN +C271;C271;1109 1171 11AC;C271;1109 1171 11AC; # (쉱; 쉱; 쉱; 쉱; 쉱; ) HANGUL SYLLABLE SWINJ +C272;C272;1109 1171 11AD;C272;1109 1171 11AD; # (쉲; 쉲; 쉲; 쉲; 쉲; ) HANGUL SYLLABLE SWINH +C273;C273;1109 1171 11AE;C273;1109 1171 11AE; # (쉳; 쉳; 쉳; 쉳; 쉳; ) HANGUL SYLLABLE SWID +C274;C274;1109 1171 11AF;C274;1109 1171 11AF; # (쉴; 쉴; 쉴; 쉴; 쉴; ) HANGUL SYLLABLE SWIL +C275;C275;1109 1171 11B0;C275;1109 1171 11B0; # (쉵; 쉵; 쉵; 쉵; 쉵; ) HANGUL SYLLABLE SWILG +C276;C276;1109 1171 11B1;C276;1109 1171 11B1; # (쉶; 쉶; 쉶; 쉶; 쉶; ) HANGUL SYLLABLE SWILM +C277;C277;1109 1171 11B2;C277;1109 1171 11B2; # (쉷; 쉷; 쉷; 쉷; 쉷; ) HANGUL SYLLABLE SWILB +C278;C278;1109 1171 11B3;C278;1109 1171 11B3; # (쉸; 쉸; 쉸; 쉸; 쉸; ) HANGUL SYLLABLE SWILS +C279;C279;1109 1171 11B4;C279;1109 1171 11B4; # (쉹; 쉹; 쉹; 쉹; 쉹; ) HANGUL SYLLABLE SWILT +C27A;C27A;1109 1171 11B5;C27A;1109 1171 11B5; # (쉺; 쉺; 쉺; 쉺; 쉺; ) HANGUL SYLLABLE SWILP +C27B;C27B;1109 1171 11B6;C27B;1109 1171 11B6; # (쉻; 쉻; 쉻; 쉻; 쉻; ) HANGUL SYLLABLE SWILH +C27C;C27C;1109 1171 11B7;C27C;1109 1171 11B7; # (쉼; 쉼; 쉼; 쉼; 쉼; ) HANGUL SYLLABLE SWIM +C27D;C27D;1109 1171 11B8;C27D;1109 1171 11B8; # (쉽; 쉽; 쉽; 쉽; 쉽; ) HANGUL SYLLABLE SWIB +C27E;C27E;1109 1171 11B9;C27E;1109 1171 11B9; # (쉾; 쉾; 쉾; 쉾; 쉾; ) HANGUL SYLLABLE SWIBS +C27F;C27F;1109 1171 11BA;C27F;1109 1171 11BA; # (쉿; 쉿; 쉿; 쉿; 쉿; ) HANGUL SYLLABLE SWIS +C280;C280;1109 1171 11BB;C280;1109 1171 11BB; # (슀; 슀; 슀; 슀; 슀; ) HANGUL SYLLABLE SWISS +C281;C281;1109 1171 11BC;C281;1109 1171 11BC; # (슁; 슁; 슁; 슁; 슁; ) HANGUL SYLLABLE SWING +C282;C282;1109 1171 11BD;C282;1109 1171 11BD; # (슂; 슂; 슂; 슂; 슂; ) HANGUL SYLLABLE SWIJ +C283;C283;1109 1171 11BE;C283;1109 1171 11BE; # (슃; 슃; 슃; 슃; 슃; ) HANGUL SYLLABLE SWIC +C284;C284;1109 1171 11BF;C284;1109 1171 11BF; # (슄; 슄; 슄; 슄; 슄; ) HANGUL SYLLABLE SWIK +C285;C285;1109 1171 11C0;C285;1109 1171 11C0; # (슅; 슅; 슅; 슅; 슅; ) HANGUL SYLLABLE SWIT +C286;C286;1109 1171 11C1;C286;1109 1171 11C1; # (슆; 슆; 슆; 슆; 슆; ) HANGUL SYLLABLE SWIP +C287;C287;1109 1171 11C2;C287;1109 1171 11C2; # (슇; 슇; 슇; 슇; 슇; ) HANGUL SYLLABLE SWIH +C288;C288;1109 1172;C288;1109 1172; # (슈; 슈; 슈; 슈; 슈; ) HANGUL SYLLABLE SYU +C289;C289;1109 1172 11A8;C289;1109 1172 11A8; # (슉; 슉; 슉; 슉; 슉; ) HANGUL SYLLABLE SYUG +C28A;C28A;1109 1172 11A9;C28A;1109 1172 11A9; # (슊; 슊; 슊; 슊; 슊; ) HANGUL SYLLABLE SYUGG +C28B;C28B;1109 1172 11AA;C28B;1109 1172 11AA; # (슋; 슋; 슋; 슋; 슋; ) HANGUL SYLLABLE SYUGS +C28C;C28C;1109 1172 11AB;C28C;1109 1172 11AB; # (슌; 슌; 슌; 슌; 슌; ) HANGUL SYLLABLE SYUN +C28D;C28D;1109 1172 11AC;C28D;1109 1172 11AC; # (슍; 슍; 슍; 슍; 슍; ) HANGUL SYLLABLE SYUNJ +C28E;C28E;1109 1172 11AD;C28E;1109 1172 11AD; # (슎; 슎; 슎; 슎; 슎; ) HANGUL SYLLABLE SYUNH +C28F;C28F;1109 1172 11AE;C28F;1109 1172 11AE; # (슏; 슏; 슏; 슏; 슏; ) HANGUL SYLLABLE SYUD +C290;C290;1109 1172 11AF;C290;1109 1172 11AF; # (슐; 슐; 슐; 슐; 슐; ) HANGUL SYLLABLE SYUL +C291;C291;1109 1172 11B0;C291;1109 1172 11B0; # (슑; 슑; 슑; 슑; 슑; ) HANGUL SYLLABLE SYULG +C292;C292;1109 1172 11B1;C292;1109 1172 11B1; # (슒; 슒; 슒; 슒; 슒; ) HANGUL SYLLABLE SYULM +C293;C293;1109 1172 11B2;C293;1109 1172 11B2; # (슓; 슓; 슓; 슓; 슓; ) HANGUL SYLLABLE SYULB +C294;C294;1109 1172 11B3;C294;1109 1172 11B3; # (슔; 슔; 슔; 슔; 슔; ) HANGUL SYLLABLE SYULS +C295;C295;1109 1172 11B4;C295;1109 1172 11B4; # (슕; 슕; 슕; 슕; 슕; ) HANGUL SYLLABLE SYULT +C296;C296;1109 1172 11B5;C296;1109 1172 11B5; # (슖; 슖; 슖; 슖; 슖; ) HANGUL SYLLABLE SYULP +C297;C297;1109 1172 11B6;C297;1109 1172 11B6; # (슗; 슗; 슗; 슗; 슗; ) HANGUL SYLLABLE SYULH +C298;C298;1109 1172 11B7;C298;1109 1172 11B7; # (슘; 슘; 슘; 슘; 슘; ) HANGUL SYLLABLE SYUM +C299;C299;1109 1172 11B8;C299;1109 1172 11B8; # (슙; 슙; 슙; 슙; 슙; ) HANGUL SYLLABLE SYUB +C29A;C29A;1109 1172 11B9;C29A;1109 1172 11B9; # (슚; 슚; 슚; 슚; 슚; ) HANGUL SYLLABLE SYUBS +C29B;C29B;1109 1172 11BA;C29B;1109 1172 11BA; # (슛; 슛; 슛; 슛; 슛; ) HANGUL SYLLABLE SYUS +C29C;C29C;1109 1172 11BB;C29C;1109 1172 11BB; # (슜; 슜; 슜; 슜; 슜; ) HANGUL SYLLABLE SYUSS +C29D;C29D;1109 1172 11BC;C29D;1109 1172 11BC; # (슝; 슝; 슝; 슝; 슝; ) HANGUL SYLLABLE SYUNG +C29E;C29E;1109 1172 11BD;C29E;1109 1172 11BD; # (슞; 슞; 슞; 슞; 슞; ) HANGUL SYLLABLE SYUJ +C29F;C29F;1109 1172 11BE;C29F;1109 1172 11BE; # (슟; 슟; 슟; 슟; 슟; ) HANGUL SYLLABLE SYUC +C2A0;C2A0;1109 1172 11BF;C2A0;1109 1172 11BF; # (슠; 슠; 슠; 슠; 슠; ) HANGUL SYLLABLE SYUK +C2A1;C2A1;1109 1172 11C0;C2A1;1109 1172 11C0; # (슡; 슡; 슡; 슡; 슡; ) HANGUL SYLLABLE SYUT +C2A2;C2A2;1109 1172 11C1;C2A2;1109 1172 11C1; # (슢; 슢; 슢; 슢; 슢; ) HANGUL SYLLABLE SYUP +C2A3;C2A3;1109 1172 11C2;C2A3;1109 1172 11C2; # (슣; 슣; 슣; 슣; 슣; ) HANGUL SYLLABLE SYUH +C2A4;C2A4;1109 1173;C2A4;1109 1173; # (스; 스; 스; 스; 스; ) HANGUL SYLLABLE SEU +C2A5;C2A5;1109 1173 11A8;C2A5;1109 1173 11A8; # (슥; 슥; 슥; 슥; 슥; ) HANGUL SYLLABLE SEUG +C2A6;C2A6;1109 1173 11A9;C2A6;1109 1173 11A9; # (슦; 슦; 슦; 슦; 슦; ) HANGUL SYLLABLE SEUGG +C2A7;C2A7;1109 1173 11AA;C2A7;1109 1173 11AA; # (슧; 슧; 슧; 슧; 슧; ) HANGUL SYLLABLE SEUGS +C2A8;C2A8;1109 1173 11AB;C2A8;1109 1173 11AB; # (슨; 슨; 슨; 슨; 슨; ) HANGUL SYLLABLE SEUN +C2A9;C2A9;1109 1173 11AC;C2A9;1109 1173 11AC; # (슩; 슩; 슩; 슩; 슩; ) HANGUL SYLLABLE SEUNJ +C2AA;C2AA;1109 1173 11AD;C2AA;1109 1173 11AD; # (슪; 슪; 슪; 슪; 슪; ) HANGUL SYLLABLE SEUNH +C2AB;C2AB;1109 1173 11AE;C2AB;1109 1173 11AE; # (슫; 슫; 슫; 슫; 슫; ) HANGUL SYLLABLE SEUD +C2AC;C2AC;1109 1173 11AF;C2AC;1109 1173 11AF; # (슬; 슬; 슬; 슬; 슬; ) HANGUL SYLLABLE SEUL +C2AD;C2AD;1109 1173 11B0;C2AD;1109 1173 11B0; # (슭; 슭; 슭; 슭; 슭; ) HANGUL SYLLABLE SEULG +C2AE;C2AE;1109 1173 11B1;C2AE;1109 1173 11B1; # (슮; 슮; 슮; 슮; 슮; ) HANGUL SYLLABLE SEULM +C2AF;C2AF;1109 1173 11B2;C2AF;1109 1173 11B2; # (슯; 슯; 슯; 슯; 슯; ) HANGUL SYLLABLE SEULB +C2B0;C2B0;1109 1173 11B3;C2B0;1109 1173 11B3; # (슰; 슰; 슰; 슰; 슰; ) HANGUL SYLLABLE SEULS +C2B1;C2B1;1109 1173 11B4;C2B1;1109 1173 11B4; # (슱; 슱; 슱; 슱; 슱; ) HANGUL SYLLABLE SEULT +C2B2;C2B2;1109 1173 11B5;C2B2;1109 1173 11B5; # (슲; 슲; 슲; 슲; 슲; ) HANGUL SYLLABLE SEULP +C2B3;C2B3;1109 1173 11B6;C2B3;1109 1173 11B6; # (슳; 슳; 슳; 슳; 슳; ) HANGUL SYLLABLE SEULH +C2B4;C2B4;1109 1173 11B7;C2B4;1109 1173 11B7; # (슴; 슴; 슴; 슴; 슴; ) HANGUL SYLLABLE SEUM +C2B5;C2B5;1109 1173 11B8;C2B5;1109 1173 11B8; # (습; 습; 습; 습; 습; ) HANGUL SYLLABLE SEUB +C2B6;C2B6;1109 1173 11B9;C2B6;1109 1173 11B9; # (슶; 슶; 슶; 슶; 슶; ) HANGUL SYLLABLE SEUBS +C2B7;C2B7;1109 1173 11BA;C2B7;1109 1173 11BA; # (슷; 슷; 슷; 슷; 슷; ) HANGUL SYLLABLE SEUS +C2B8;C2B8;1109 1173 11BB;C2B8;1109 1173 11BB; # (슸; 슸; 슸; 슸; 슸; ) HANGUL SYLLABLE SEUSS +C2B9;C2B9;1109 1173 11BC;C2B9;1109 1173 11BC; # (승; 승; 승; 승; 승; ) HANGUL SYLLABLE SEUNG +C2BA;C2BA;1109 1173 11BD;C2BA;1109 1173 11BD; # (슺; 슺; 슺; 슺; 슺; ) HANGUL SYLLABLE SEUJ +C2BB;C2BB;1109 1173 11BE;C2BB;1109 1173 11BE; # (슻; 슻; 슻; 슻; 슻; ) HANGUL SYLLABLE SEUC +C2BC;C2BC;1109 1173 11BF;C2BC;1109 1173 11BF; # (슼; 슼; 슼; 슼; 슼; ) HANGUL SYLLABLE SEUK +C2BD;C2BD;1109 1173 11C0;C2BD;1109 1173 11C0; # (슽; 슽; 슽; 슽; 슽; ) HANGUL SYLLABLE SEUT +C2BE;C2BE;1109 1173 11C1;C2BE;1109 1173 11C1; # (슾; 슾; 슾; 슾; 슾; ) HANGUL SYLLABLE SEUP +C2BF;C2BF;1109 1173 11C2;C2BF;1109 1173 11C2; # (슿; 슿; 슿; 슿; 슿; ) HANGUL SYLLABLE SEUH +C2C0;C2C0;1109 1174;C2C0;1109 1174; # (싀; 싀; 싀; 싀; 싀; ) HANGUL SYLLABLE SYI +C2C1;C2C1;1109 1174 11A8;C2C1;1109 1174 11A8; # (싁; 싁; 싁; 싁; 싁; ) HANGUL SYLLABLE SYIG +C2C2;C2C2;1109 1174 11A9;C2C2;1109 1174 11A9; # (싂; 싂; 싂; 싂; 싂; ) HANGUL SYLLABLE SYIGG +C2C3;C2C3;1109 1174 11AA;C2C3;1109 1174 11AA; # (싃; 싃; 싃; 싃; 싃; ) HANGUL SYLLABLE SYIGS +C2C4;C2C4;1109 1174 11AB;C2C4;1109 1174 11AB; # (싄; 싄; 싄; 싄; 싄; ) HANGUL SYLLABLE SYIN +C2C5;C2C5;1109 1174 11AC;C2C5;1109 1174 11AC; # (싅; 싅; 싅; 싅; 싅; ) HANGUL SYLLABLE SYINJ +C2C6;C2C6;1109 1174 11AD;C2C6;1109 1174 11AD; # (싆; 싆; 싆; 싆; 싆; ) HANGUL SYLLABLE SYINH +C2C7;C2C7;1109 1174 11AE;C2C7;1109 1174 11AE; # (싇; 싇; 싇; 싇; 싇; ) HANGUL SYLLABLE SYID +C2C8;C2C8;1109 1174 11AF;C2C8;1109 1174 11AF; # (싈; 싈; 싈; 싈; 싈; ) HANGUL SYLLABLE SYIL +C2C9;C2C9;1109 1174 11B0;C2C9;1109 1174 11B0; # (싉; 싉; 싉; 싉; 싉; ) HANGUL SYLLABLE SYILG +C2CA;C2CA;1109 1174 11B1;C2CA;1109 1174 11B1; # (싊; 싊; 싊; 싊; 싊; ) HANGUL SYLLABLE SYILM +C2CB;C2CB;1109 1174 11B2;C2CB;1109 1174 11B2; # (싋; 싋; 싋; 싋; 싋; ) HANGUL SYLLABLE SYILB +C2CC;C2CC;1109 1174 11B3;C2CC;1109 1174 11B3; # (싌; 싌; 싌; 싌; 싌; ) HANGUL SYLLABLE SYILS +C2CD;C2CD;1109 1174 11B4;C2CD;1109 1174 11B4; # (싍; 싍; 싍; 싍; 싍; ) HANGUL SYLLABLE SYILT +C2CE;C2CE;1109 1174 11B5;C2CE;1109 1174 11B5; # (싎; 싎; 싎; 싎; 싎; ) HANGUL SYLLABLE SYILP +C2CF;C2CF;1109 1174 11B6;C2CF;1109 1174 11B6; # (싏; 싏; 싏; 싏; 싏; ) HANGUL SYLLABLE SYILH +C2D0;C2D0;1109 1174 11B7;C2D0;1109 1174 11B7; # (싐; 싐; 싐; 싐; 싐; ) HANGUL SYLLABLE SYIM +C2D1;C2D1;1109 1174 11B8;C2D1;1109 1174 11B8; # (싑; 싑; 싑; 싑; 싑; ) HANGUL SYLLABLE SYIB +C2D2;C2D2;1109 1174 11B9;C2D2;1109 1174 11B9; # (싒; 싒; 싒; 싒; 싒; ) HANGUL SYLLABLE SYIBS +C2D3;C2D3;1109 1174 11BA;C2D3;1109 1174 11BA; # (싓; 싓; 싓; 싓; 싓; ) HANGUL SYLLABLE SYIS +C2D4;C2D4;1109 1174 11BB;C2D4;1109 1174 11BB; # (싔; 싔; 싔; 싔; 싔; ) HANGUL SYLLABLE SYISS +C2D5;C2D5;1109 1174 11BC;C2D5;1109 1174 11BC; # (싕; 싕; 싕; 싕; 싕; ) HANGUL SYLLABLE SYING +C2D6;C2D6;1109 1174 11BD;C2D6;1109 1174 11BD; # (싖; 싖; 싖; 싖; 싖; ) HANGUL SYLLABLE SYIJ +C2D7;C2D7;1109 1174 11BE;C2D7;1109 1174 11BE; # (싗; 싗; 싗; 싗; 싗; ) HANGUL SYLLABLE SYIC +C2D8;C2D8;1109 1174 11BF;C2D8;1109 1174 11BF; # (싘; 싘; 싘; 싘; 싘; ) HANGUL SYLLABLE SYIK +C2D9;C2D9;1109 1174 11C0;C2D9;1109 1174 11C0; # (싙; 싙; 싙; 싙; 싙; ) HANGUL SYLLABLE SYIT +C2DA;C2DA;1109 1174 11C1;C2DA;1109 1174 11C1; # (싚; 싚; 싚; 싚; 싚; ) HANGUL SYLLABLE SYIP +C2DB;C2DB;1109 1174 11C2;C2DB;1109 1174 11C2; # (싛; 싛; 싛; 싛; 싛; ) HANGUL SYLLABLE SYIH +C2DC;C2DC;1109 1175;C2DC;1109 1175; # (시; 시; 시; 시; 시; ) HANGUL SYLLABLE SI +C2DD;C2DD;1109 1175 11A8;C2DD;1109 1175 11A8; # (식; 식; 식; 식; 식; ) HANGUL SYLLABLE SIG +C2DE;C2DE;1109 1175 11A9;C2DE;1109 1175 11A9; # (싞; 싞; 싞; 싞; 싞; ) HANGUL SYLLABLE SIGG +C2DF;C2DF;1109 1175 11AA;C2DF;1109 1175 11AA; # (싟; 싟; 싟; 싟; 싟; ) HANGUL SYLLABLE SIGS +C2E0;C2E0;1109 1175 11AB;C2E0;1109 1175 11AB; # (신; 신; 신; 신; 신; ) HANGUL SYLLABLE SIN +C2E1;C2E1;1109 1175 11AC;C2E1;1109 1175 11AC; # (싡; 싡; 싡; 싡; 싡; ) HANGUL SYLLABLE SINJ +C2E2;C2E2;1109 1175 11AD;C2E2;1109 1175 11AD; # (싢; 싢; 싢; 싢; 싢; ) HANGUL SYLLABLE SINH +C2E3;C2E3;1109 1175 11AE;C2E3;1109 1175 11AE; # (싣; 싣; 싣; 싣; 싣; ) HANGUL SYLLABLE SID +C2E4;C2E4;1109 1175 11AF;C2E4;1109 1175 11AF; # (실; 실; 실; 실; 실; ) HANGUL SYLLABLE SIL +C2E5;C2E5;1109 1175 11B0;C2E5;1109 1175 11B0; # (싥; 싥; 싥; 싥; 싥; ) HANGUL SYLLABLE SILG +C2E6;C2E6;1109 1175 11B1;C2E6;1109 1175 11B1; # (싦; 싦; 싦; 싦; 싦; ) HANGUL SYLLABLE SILM +C2E7;C2E7;1109 1175 11B2;C2E7;1109 1175 11B2; # (싧; 싧; 싧; 싧; 싧; ) HANGUL SYLLABLE SILB +C2E8;C2E8;1109 1175 11B3;C2E8;1109 1175 11B3; # (싨; 싨; 싨; 싨; 싨; ) HANGUL SYLLABLE SILS +C2E9;C2E9;1109 1175 11B4;C2E9;1109 1175 11B4; # (싩; 싩; 싩; 싩; 싩; ) HANGUL SYLLABLE SILT +C2EA;C2EA;1109 1175 11B5;C2EA;1109 1175 11B5; # (싪; 싪; 싪; 싪; 싪; ) HANGUL SYLLABLE SILP +C2EB;C2EB;1109 1175 11B6;C2EB;1109 1175 11B6; # (싫; 싫; 싫; 싫; 싫; ) HANGUL SYLLABLE SILH +C2EC;C2EC;1109 1175 11B7;C2EC;1109 1175 11B7; # (심; 심; 심; 심; 심; ) HANGUL SYLLABLE SIM +C2ED;C2ED;1109 1175 11B8;C2ED;1109 1175 11B8; # (십; 십; 십; 십; 십; ) HANGUL SYLLABLE SIB +C2EE;C2EE;1109 1175 11B9;C2EE;1109 1175 11B9; # (싮; 싮; 싮; 싮; 싮; ) HANGUL SYLLABLE SIBS +C2EF;C2EF;1109 1175 11BA;C2EF;1109 1175 11BA; # (싯; 싯; 싯; 싯; 싯; ) HANGUL SYLLABLE SIS +C2F0;C2F0;1109 1175 11BB;C2F0;1109 1175 11BB; # (싰; 싰; 싰; 싰; 싰; ) HANGUL SYLLABLE SISS +C2F1;C2F1;1109 1175 11BC;C2F1;1109 1175 11BC; # (싱; 싱; 싱; 싱; 싱; ) HANGUL SYLLABLE SING +C2F2;C2F2;1109 1175 11BD;C2F2;1109 1175 11BD; # (싲; 싲; 싲; 싲; 싲; ) HANGUL SYLLABLE SIJ +C2F3;C2F3;1109 1175 11BE;C2F3;1109 1175 11BE; # (싳; 싳; 싳; 싳; 싳; ) HANGUL SYLLABLE SIC +C2F4;C2F4;1109 1175 11BF;C2F4;1109 1175 11BF; # (싴; 싴; 싴; 싴; 싴; ) HANGUL SYLLABLE SIK +C2F5;C2F5;1109 1175 11C0;C2F5;1109 1175 11C0; # (싵; 싵; 싵; 싵; 싵; ) HANGUL SYLLABLE SIT +C2F6;C2F6;1109 1175 11C1;C2F6;1109 1175 11C1; # (싶; 싶; 싶; 싶; 싶; ) HANGUL SYLLABLE SIP +C2F7;C2F7;1109 1175 11C2;C2F7;1109 1175 11C2; # (싷; 싷; 싷; 싷; 싷; ) HANGUL SYLLABLE SIH +C2F8;C2F8;110A 1161;C2F8;110A 1161; # (싸; 싸; 싸; 싸; 싸; ) HANGUL SYLLABLE SSA +C2F9;C2F9;110A 1161 11A8;C2F9;110A 1161 11A8; # (싹; 싹; 싹; 싹; 싹; ) HANGUL SYLLABLE SSAG +C2FA;C2FA;110A 1161 11A9;C2FA;110A 1161 11A9; # (싺; 싺; 싺; 싺; 싺; ) HANGUL SYLLABLE SSAGG +C2FB;C2FB;110A 1161 11AA;C2FB;110A 1161 11AA; # (싻; 싻; 싻; 싻; 싻; ) HANGUL SYLLABLE SSAGS +C2FC;C2FC;110A 1161 11AB;C2FC;110A 1161 11AB; # (싼; 싼; 싼; 싼; 싼; ) HANGUL SYLLABLE SSAN +C2FD;C2FD;110A 1161 11AC;C2FD;110A 1161 11AC; # (싽; 싽; 싽; 싽; 싽; ) HANGUL SYLLABLE SSANJ +C2FE;C2FE;110A 1161 11AD;C2FE;110A 1161 11AD; # (싾; 싾; 싾; 싾; 싾; ) HANGUL SYLLABLE SSANH +C2FF;C2FF;110A 1161 11AE;C2FF;110A 1161 11AE; # (싿; 싿; 싿; 싿; 싿; ) HANGUL SYLLABLE SSAD +C300;C300;110A 1161 11AF;C300;110A 1161 11AF; # (쌀; 쌀; 쌀; 쌀; 쌀; ) HANGUL SYLLABLE SSAL +C301;C301;110A 1161 11B0;C301;110A 1161 11B0; # (쌁; 쌁; 쌁; 쌁; 쌁; ) HANGUL SYLLABLE SSALG +C302;C302;110A 1161 11B1;C302;110A 1161 11B1; # (쌂; 쌂; 쌂; 쌂; 쌂; ) HANGUL SYLLABLE SSALM +C303;C303;110A 1161 11B2;C303;110A 1161 11B2; # (쌃; 쌃; 쌃; 쌃; 쌃; ) HANGUL SYLLABLE SSALB +C304;C304;110A 1161 11B3;C304;110A 1161 11B3; # (쌄; 쌄; 쌄; 쌄; 쌄; ) HANGUL SYLLABLE SSALS +C305;C305;110A 1161 11B4;C305;110A 1161 11B4; # (쌅; 쌅; 쌅; 쌅; 쌅; ) HANGUL SYLLABLE SSALT +C306;C306;110A 1161 11B5;C306;110A 1161 11B5; # (쌆; 쌆; 쌆; 쌆; 쌆; ) HANGUL SYLLABLE SSALP +C307;C307;110A 1161 11B6;C307;110A 1161 11B6; # (쌇; 쌇; 쌇; 쌇; 쌇; ) HANGUL SYLLABLE SSALH +C308;C308;110A 1161 11B7;C308;110A 1161 11B7; # (쌈; 쌈; 쌈; 쌈; 쌈; ) HANGUL SYLLABLE SSAM +C309;C309;110A 1161 11B8;C309;110A 1161 11B8; # (쌉; 쌉; 쌉; 쌉; 쌉; ) HANGUL SYLLABLE SSAB +C30A;C30A;110A 1161 11B9;C30A;110A 1161 11B9; # (쌊; 쌊; 쌊; 쌊; 쌊; ) HANGUL SYLLABLE SSABS +C30B;C30B;110A 1161 11BA;C30B;110A 1161 11BA; # (쌋; 쌋; 쌋; 쌋; 쌋; ) HANGUL SYLLABLE SSAS +C30C;C30C;110A 1161 11BB;C30C;110A 1161 11BB; # (쌌; 쌌; 쌌; 쌌; 쌌; ) HANGUL SYLLABLE SSASS +C30D;C30D;110A 1161 11BC;C30D;110A 1161 11BC; # (쌍; 쌍; 쌍; 쌍; 쌍; ) HANGUL SYLLABLE SSANG +C30E;C30E;110A 1161 11BD;C30E;110A 1161 11BD; # (쌎; 쌎; 쌎; 쌎; 쌎; ) HANGUL SYLLABLE SSAJ +C30F;C30F;110A 1161 11BE;C30F;110A 1161 11BE; # (쌏; 쌏; 쌏; 쌏; 쌏; ) HANGUL SYLLABLE SSAC +C310;C310;110A 1161 11BF;C310;110A 1161 11BF; # (쌐; 쌐; 쌐; 쌐; 쌐; ) HANGUL SYLLABLE SSAK +C311;C311;110A 1161 11C0;C311;110A 1161 11C0; # (쌑; 쌑; 쌑; 쌑; 쌑; ) HANGUL SYLLABLE SSAT +C312;C312;110A 1161 11C1;C312;110A 1161 11C1; # (쌒; 쌒; 쌒; 쌒; 쌒; ) HANGUL SYLLABLE SSAP +C313;C313;110A 1161 11C2;C313;110A 1161 11C2; # (쌓; 쌓; 쌓; 쌓; 쌓; ) HANGUL SYLLABLE SSAH +C314;C314;110A 1162;C314;110A 1162; # (쌔; 쌔; 쌔; 쌔; 쌔; ) HANGUL SYLLABLE SSAE +C315;C315;110A 1162 11A8;C315;110A 1162 11A8; # (쌕; 쌕; 쌕; 쌕; 쌕; ) HANGUL SYLLABLE SSAEG +C316;C316;110A 1162 11A9;C316;110A 1162 11A9; # (쌖; 쌖; 쌖; 쌖; 쌖; ) HANGUL SYLLABLE SSAEGG +C317;C317;110A 1162 11AA;C317;110A 1162 11AA; # (쌗; 쌗; 쌗; 쌗; 쌗; ) HANGUL SYLLABLE SSAEGS +C318;C318;110A 1162 11AB;C318;110A 1162 11AB; # (쌘; 쌘; 쌘; 쌘; 쌘; ) HANGUL SYLLABLE SSAEN +C319;C319;110A 1162 11AC;C319;110A 1162 11AC; # (쌙; 쌙; 쌙; 쌙; 쌙; ) HANGUL SYLLABLE SSAENJ +C31A;C31A;110A 1162 11AD;C31A;110A 1162 11AD; # (쌚; 쌚; 쌚; 쌚; 쌚; ) HANGUL SYLLABLE SSAENH +C31B;C31B;110A 1162 11AE;C31B;110A 1162 11AE; # (쌛; 쌛; 쌛; 쌛; 쌛; ) HANGUL SYLLABLE SSAED +C31C;C31C;110A 1162 11AF;C31C;110A 1162 11AF; # (쌜; 쌜; 쌜; 쌜; 쌜; ) HANGUL SYLLABLE SSAEL +C31D;C31D;110A 1162 11B0;C31D;110A 1162 11B0; # (쌝; 쌝; 쌝; 쌝; 쌝; ) HANGUL SYLLABLE SSAELG +C31E;C31E;110A 1162 11B1;C31E;110A 1162 11B1; # (쌞; 쌞; 쌞; 쌞; 쌞; ) HANGUL SYLLABLE SSAELM +C31F;C31F;110A 1162 11B2;C31F;110A 1162 11B2; # (쌟; 쌟; 쌟; 쌟; 쌟; ) HANGUL SYLLABLE SSAELB +C320;C320;110A 1162 11B3;C320;110A 1162 11B3; # (쌠; 쌠; 쌠; 쌠; 쌠; ) HANGUL SYLLABLE SSAELS +C321;C321;110A 1162 11B4;C321;110A 1162 11B4; # (쌡; 쌡; 쌡; 쌡; 쌡; ) HANGUL SYLLABLE SSAELT +C322;C322;110A 1162 11B5;C322;110A 1162 11B5; # (쌢; 쌢; 쌢; 쌢; 쌢; ) HANGUL SYLLABLE SSAELP +C323;C323;110A 1162 11B6;C323;110A 1162 11B6; # (쌣; 쌣; 쌣; 쌣; 쌣; ) HANGUL SYLLABLE SSAELH +C324;C324;110A 1162 11B7;C324;110A 1162 11B7; # (쌤; 쌤; 쌤; 쌤; 쌤; ) HANGUL SYLLABLE SSAEM +C325;C325;110A 1162 11B8;C325;110A 1162 11B8; # (쌥; 쌥; 쌥; 쌥; 쌥; ) HANGUL SYLLABLE SSAEB +C326;C326;110A 1162 11B9;C326;110A 1162 11B9; # (쌦; 쌦; 쌦; 쌦; 쌦; ) HANGUL SYLLABLE SSAEBS +C327;C327;110A 1162 11BA;C327;110A 1162 11BA; # (쌧; 쌧; 쌧; 쌧; 쌧; ) HANGUL SYLLABLE SSAES +C328;C328;110A 1162 11BB;C328;110A 1162 11BB; # (쌨; 쌨; 쌨; 쌨; 쌨; ) HANGUL SYLLABLE SSAESS +C329;C329;110A 1162 11BC;C329;110A 1162 11BC; # (쌩; 쌩; 쌩; 쌩; 쌩; ) HANGUL SYLLABLE SSAENG +C32A;C32A;110A 1162 11BD;C32A;110A 1162 11BD; # (쌪; 쌪; 쌪; 쌪; 쌪; ) HANGUL SYLLABLE SSAEJ +C32B;C32B;110A 1162 11BE;C32B;110A 1162 11BE; # (쌫; 쌫; 쌫; 쌫; 쌫; ) HANGUL SYLLABLE SSAEC +C32C;C32C;110A 1162 11BF;C32C;110A 1162 11BF; # (쌬; 쌬; 쌬; 쌬; 쌬; ) HANGUL SYLLABLE SSAEK +C32D;C32D;110A 1162 11C0;C32D;110A 1162 11C0; # (쌭; 쌭; 쌭; 쌭; 쌭; ) HANGUL SYLLABLE SSAET +C32E;C32E;110A 1162 11C1;C32E;110A 1162 11C1; # (쌮; 쌮; 쌮; 쌮; 쌮; ) HANGUL SYLLABLE SSAEP +C32F;C32F;110A 1162 11C2;C32F;110A 1162 11C2; # (쌯; 쌯; 쌯; 쌯; 쌯; ) HANGUL SYLLABLE SSAEH +C330;C330;110A 1163;C330;110A 1163; # (쌰; 쌰; 쌰; 쌰; 쌰; ) HANGUL SYLLABLE SSYA +C331;C331;110A 1163 11A8;C331;110A 1163 11A8; # (쌱; 쌱; 쌱; 쌱; 쌱; ) HANGUL SYLLABLE SSYAG +C332;C332;110A 1163 11A9;C332;110A 1163 11A9; # (쌲; 쌲; 쌲; 쌲; 쌲; ) HANGUL SYLLABLE SSYAGG +C333;C333;110A 1163 11AA;C333;110A 1163 11AA; # (쌳; 쌳; 쌳; 쌳; 쌳; ) HANGUL SYLLABLE SSYAGS +C334;C334;110A 1163 11AB;C334;110A 1163 11AB; # (쌴; 쌴; 쌴; 쌴; 쌴; ) HANGUL SYLLABLE SSYAN +C335;C335;110A 1163 11AC;C335;110A 1163 11AC; # (쌵; 쌵; 쌵; 쌵; 쌵; ) HANGUL SYLLABLE SSYANJ +C336;C336;110A 1163 11AD;C336;110A 1163 11AD; # (쌶; 쌶; 쌶; 쌶; 쌶; ) HANGUL SYLLABLE SSYANH +C337;C337;110A 1163 11AE;C337;110A 1163 11AE; # (쌷; 쌷; 쌷; 쌷; 쌷; ) HANGUL SYLLABLE SSYAD +C338;C338;110A 1163 11AF;C338;110A 1163 11AF; # (쌸; 쌸; 쌸; 쌸; 쌸; ) HANGUL SYLLABLE SSYAL +C339;C339;110A 1163 11B0;C339;110A 1163 11B0; # (쌹; 쌹; 쌹; 쌹; 쌹; ) HANGUL SYLLABLE SSYALG +C33A;C33A;110A 1163 11B1;C33A;110A 1163 11B1; # (쌺; 쌺; 쌺; 쌺; 쌺; ) HANGUL SYLLABLE SSYALM +C33B;C33B;110A 1163 11B2;C33B;110A 1163 11B2; # (쌻; 쌻; 쌻; 쌻; 쌻; ) HANGUL SYLLABLE SSYALB +C33C;C33C;110A 1163 11B3;C33C;110A 1163 11B3; # (쌼; 쌼; 쌼; 쌼; 쌼; ) HANGUL SYLLABLE SSYALS +C33D;C33D;110A 1163 11B4;C33D;110A 1163 11B4; # (쌽; 쌽; 쌽; 쌽; 쌽; ) HANGUL SYLLABLE SSYALT +C33E;C33E;110A 1163 11B5;C33E;110A 1163 11B5; # (쌾; 쌾; 쌾; 쌾; 쌾; ) HANGUL SYLLABLE SSYALP +C33F;C33F;110A 1163 11B6;C33F;110A 1163 11B6; # (쌿; 쌿; 쌿; 쌿; 쌿; ) HANGUL SYLLABLE SSYALH +C340;C340;110A 1163 11B7;C340;110A 1163 11B7; # (썀; 썀; 썀; 썀; 썀; ) HANGUL SYLLABLE SSYAM +C341;C341;110A 1163 11B8;C341;110A 1163 11B8; # (썁; 썁; 썁; 썁; 썁; ) HANGUL SYLLABLE SSYAB +C342;C342;110A 1163 11B9;C342;110A 1163 11B9; # (썂; 썂; 썂; 썂; 썂; ) HANGUL SYLLABLE SSYABS +C343;C343;110A 1163 11BA;C343;110A 1163 11BA; # (썃; 썃; 썃; 썃; 썃; ) HANGUL SYLLABLE SSYAS +C344;C344;110A 1163 11BB;C344;110A 1163 11BB; # (썄; 썄; 썄; 썄; 썄; ) HANGUL SYLLABLE SSYASS +C345;C345;110A 1163 11BC;C345;110A 1163 11BC; # (썅; 썅; 썅; 썅; 썅; ) HANGUL SYLLABLE SSYANG +C346;C346;110A 1163 11BD;C346;110A 1163 11BD; # (썆; 썆; 썆; 썆; 썆; ) HANGUL SYLLABLE SSYAJ +C347;C347;110A 1163 11BE;C347;110A 1163 11BE; # (썇; 썇; 썇; 썇; 썇; ) HANGUL SYLLABLE SSYAC +C348;C348;110A 1163 11BF;C348;110A 1163 11BF; # (썈; 썈; 썈; 썈; 썈; ) HANGUL SYLLABLE SSYAK +C349;C349;110A 1163 11C0;C349;110A 1163 11C0; # (썉; 썉; 썉; 썉; 썉; ) HANGUL SYLLABLE SSYAT +C34A;C34A;110A 1163 11C1;C34A;110A 1163 11C1; # (썊; 썊; 썊; 썊; 썊; ) HANGUL SYLLABLE SSYAP +C34B;C34B;110A 1163 11C2;C34B;110A 1163 11C2; # (썋; 썋; 썋; 썋; 썋; ) HANGUL SYLLABLE SSYAH +C34C;C34C;110A 1164;C34C;110A 1164; # (썌; 썌; 썌; 썌; 썌; ) HANGUL SYLLABLE SSYAE +C34D;C34D;110A 1164 11A8;C34D;110A 1164 11A8; # (썍; 썍; 썍; 썍; 썍; ) HANGUL SYLLABLE SSYAEG +C34E;C34E;110A 1164 11A9;C34E;110A 1164 11A9; # (썎; 썎; 썎; 썎; 썎; ) HANGUL SYLLABLE SSYAEGG +C34F;C34F;110A 1164 11AA;C34F;110A 1164 11AA; # (썏; 썏; 썏; 썏; 썏; ) HANGUL SYLLABLE SSYAEGS +C350;C350;110A 1164 11AB;C350;110A 1164 11AB; # (썐; 썐; 썐; 썐; 썐; ) HANGUL SYLLABLE SSYAEN +C351;C351;110A 1164 11AC;C351;110A 1164 11AC; # (썑; 썑; 썑; 썑; 썑; ) HANGUL SYLLABLE SSYAENJ +C352;C352;110A 1164 11AD;C352;110A 1164 11AD; # (썒; 썒; 썒; 썒; 썒; ) HANGUL SYLLABLE SSYAENH +C353;C353;110A 1164 11AE;C353;110A 1164 11AE; # (썓; 썓; 썓; 썓; 썓; ) HANGUL SYLLABLE SSYAED +C354;C354;110A 1164 11AF;C354;110A 1164 11AF; # (썔; 썔; 썔; 썔; 썔; ) HANGUL SYLLABLE SSYAEL +C355;C355;110A 1164 11B0;C355;110A 1164 11B0; # (썕; 썕; 썕; 썕; 썕; ) HANGUL SYLLABLE SSYAELG +C356;C356;110A 1164 11B1;C356;110A 1164 11B1; # (썖; 썖; 썖; 썖; 썖; ) HANGUL SYLLABLE SSYAELM +C357;C357;110A 1164 11B2;C357;110A 1164 11B2; # (썗; 썗; 썗; 썗; 썗; ) HANGUL SYLLABLE SSYAELB +C358;C358;110A 1164 11B3;C358;110A 1164 11B3; # (썘; 썘; 썘; 썘; 썘; ) HANGUL SYLLABLE SSYAELS +C359;C359;110A 1164 11B4;C359;110A 1164 11B4; # (썙; 썙; 썙; 썙; 썙; ) HANGUL SYLLABLE SSYAELT +C35A;C35A;110A 1164 11B5;C35A;110A 1164 11B5; # (썚; 썚; 썚; 썚; 썚; ) HANGUL SYLLABLE SSYAELP +C35B;C35B;110A 1164 11B6;C35B;110A 1164 11B6; # (썛; 썛; 썛; 썛; 썛; ) HANGUL SYLLABLE SSYAELH +C35C;C35C;110A 1164 11B7;C35C;110A 1164 11B7; # (썜; 썜; 썜; 썜; 썜; ) HANGUL SYLLABLE SSYAEM +C35D;C35D;110A 1164 11B8;C35D;110A 1164 11B8; # (썝; 썝; 썝; 썝; 썝; ) HANGUL SYLLABLE SSYAEB +C35E;C35E;110A 1164 11B9;C35E;110A 1164 11B9; # (썞; 썞; 썞; 썞; 썞; ) HANGUL SYLLABLE SSYAEBS +C35F;C35F;110A 1164 11BA;C35F;110A 1164 11BA; # (썟; 썟; 썟; 썟; 썟; ) HANGUL SYLLABLE SSYAES +C360;C360;110A 1164 11BB;C360;110A 1164 11BB; # (썠; 썠; 썠; 썠; 썠; ) HANGUL SYLLABLE SSYAESS +C361;C361;110A 1164 11BC;C361;110A 1164 11BC; # (썡; 썡; 썡; 썡; 썡; ) HANGUL SYLLABLE SSYAENG +C362;C362;110A 1164 11BD;C362;110A 1164 11BD; # (썢; 썢; 썢; 썢; 썢; ) HANGUL SYLLABLE SSYAEJ +C363;C363;110A 1164 11BE;C363;110A 1164 11BE; # (썣; 썣; 썣; 썣; 썣; ) HANGUL SYLLABLE SSYAEC +C364;C364;110A 1164 11BF;C364;110A 1164 11BF; # (썤; 썤; 썤; 썤; 썤; ) HANGUL SYLLABLE SSYAEK +C365;C365;110A 1164 11C0;C365;110A 1164 11C0; # (썥; 썥; 썥; 썥; 썥; ) HANGUL SYLLABLE SSYAET +C366;C366;110A 1164 11C1;C366;110A 1164 11C1; # (썦; 썦; 썦; 썦; 썦; ) HANGUL SYLLABLE SSYAEP +C367;C367;110A 1164 11C2;C367;110A 1164 11C2; # (썧; 썧; 썧; 썧; 썧; ) HANGUL SYLLABLE SSYAEH +C368;C368;110A 1165;C368;110A 1165; # (써; 써; 써; 써; 써; ) HANGUL SYLLABLE SSEO +C369;C369;110A 1165 11A8;C369;110A 1165 11A8; # (썩; 썩; 썩; 썩; 썩; ) HANGUL SYLLABLE SSEOG +C36A;C36A;110A 1165 11A9;C36A;110A 1165 11A9; # (썪; 썪; 썪; 썪; 썪; ) HANGUL SYLLABLE SSEOGG +C36B;C36B;110A 1165 11AA;C36B;110A 1165 11AA; # (썫; 썫; 썫; 썫; 썫; ) HANGUL SYLLABLE SSEOGS +C36C;C36C;110A 1165 11AB;C36C;110A 1165 11AB; # (썬; 썬; 썬; 썬; 썬; ) HANGUL SYLLABLE SSEON +C36D;C36D;110A 1165 11AC;C36D;110A 1165 11AC; # (썭; 썭; 썭; 썭; 썭; ) HANGUL SYLLABLE SSEONJ +C36E;C36E;110A 1165 11AD;C36E;110A 1165 11AD; # (썮; 썮; 썮; 썮; 썮; ) HANGUL SYLLABLE SSEONH +C36F;C36F;110A 1165 11AE;C36F;110A 1165 11AE; # (썯; 썯; 썯; 썯; 썯; ) HANGUL SYLLABLE SSEOD +C370;C370;110A 1165 11AF;C370;110A 1165 11AF; # (썰; 썰; 썰; 썰; 썰; ) HANGUL SYLLABLE SSEOL +C371;C371;110A 1165 11B0;C371;110A 1165 11B0; # (썱; 썱; 썱; 썱; 썱; ) HANGUL SYLLABLE SSEOLG +C372;C372;110A 1165 11B1;C372;110A 1165 11B1; # (썲; 썲; 썲; 썲; 썲; ) HANGUL SYLLABLE SSEOLM +C373;C373;110A 1165 11B2;C373;110A 1165 11B2; # (썳; 썳; 썳; 썳; 썳; ) HANGUL SYLLABLE SSEOLB +C374;C374;110A 1165 11B3;C374;110A 1165 11B3; # (썴; 썴; 썴; 썴; 썴; ) HANGUL SYLLABLE SSEOLS +C375;C375;110A 1165 11B4;C375;110A 1165 11B4; # (썵; 썵; 썵; 썵; 썵; ) HANGUL SYLLABLE SSEOLT +C376;C376;110A 1165 11B5;C376;110A 1165 11B5; # (썶; 썶; 썶; 썶; 썶; ) HANGUL SYLLABLE SSEOLP +C377;C377;110A 1165 11B6;C377;110A 1165 11B6; # (썷; 썷; 썷; 썷; 썷; ) HANGUL SYLLABLE SSEOLH +C378;C378;110A 1165 11B7;C378;110A 1165 11B7; # (썸; 썸; 썸; 썸; 썸; ) HANGUL SYLLABLE SSEOM +C379;C379;110A 1165 11B8;C379;110A 1165 11B8; # (썹; 썹; 썹; 썹; 썹; ) HANGUL SYLLABLE SSEOB +C37A;C37A;110A 1165 11B9;C37A;110A 1165 11B9; # (썺; 썺; 썺; 썺; 썺; ) HANGUL SYLLABLE SSEOBS +C37B;C37B;110A 1165 11BA;C37B;110A 1165 11BA; # (썻; 썻; 썻; 썻; 썻; ) HANGUL SYLLABLE SSEOS +C37C;C37C;110A 1165 11BB;C37C;110A 1165 11BB; # (썼; 썼; 썼; 썼; 썼; ) HANGUL SYLLABLE SSEOSS +C37D;C37D;110A 1165 11BC;C37D;110A 1165 11BC; # (썽; 썽; 썽; 썽; 썽; ) HANGUL SYLLABLE SSEONG +C37E;C37E;110A 1165 11BD;C37E;110A 1165 11BD; # (썾; 썾; 썾; 썾; 썾; ) HANGUL SYLLABLE SSEOJ +C37F;C37F;110A 1165 11BE;C37F;110A 1165 11BE; # (썿; 썿; 썿; 썿; 썿; ) HANGUL SYLLABLE SSEOC +C380;C380;110A 1165 11BF;C380;110A 1165 11BF; # (쎀; 쎀; 쎀; 쎀; 쎀; ) HANGUL SYLLABLE SSEOK +C381;C381;110A 1165 11C0;C381;110A 1165 11C0; # (쎁; 쎁; 쎁; 쎁; 쎁; ) HANGUL SYLLABLE SSEOT +C382;C382;110A 1165 11C1;C382;110A 1165 11C1; # (쎂; 쎂; 쎂; 쎂; 쎂; ) HANGUL SYLLABLE SSEOP +C383;C383;110A 1165 11C2;C383;110A 1165 11C2; # (쎃; 쎃; 쎃; 쎃; 쎃; ) HANGUL SYLLABLE SSEOH +C384;C384;110A 1166;C384;110A 1166; # (쎄; 쎄; 쎄; 쎄; 쎄; ) HANGUL SYLLABLE SSE +C385;C385;110A 1166 11A8;C385;110A 1166 11A8; # (쎅; 쎅; 쎅; 쎅; 쎅; ) HANGUL SYLLABLE SSEG +C386;C386;110A 1166 11A9;C386;110A 1166 11A9; # (쎆; 쎆; 쎆; 쎆; 쎆; ) HANGUL SYLLABLE SSEGG +C387;C387;110A 1166 11AA;C387;110A 1166 11AA; # (쎇; 쎇; 쎇; 쎇; 쎇; ) HANGUL SYLLABLE SSEGS +C388;C388;110A 1166 11AB;C388;110A 1166 11AB; # (쎈; 쎈; 쎈; 쎈; 쎈; ) HANGUL SYLLABLE SSEN +C389;C389;110A 1166 11AC;C389;110A 1166 11AC; # (쎉; 쎉; 쎉; 쎉; 쎉; ) HANGUL SYLLABLE SSENJ +C38A;C38A;110A 1166 11AD;C38A;110A 1166 11AD; # (쎊; 쎊; 쎊; 쎊; 쎊; ) HANGUL SYLLABLE SSENH +C38B;C38B;110A 1166 11AE;C38B;110A 1166 11AE; # (쎋; 쎋; 쎋; 쎋; 쎋; ) HANGUL SYLLABLE SSED +C38C;C38C;110A 1166 11AF;C38C;110A 1166 11AF; # (쎌; 쎌; 쎌; 쎌; 쎌; ) HANGUL SYLLABLE SSEL +C38D;C38D;110A 1166 11B0;C38D;110A 1166 11B0; # (쎍; 쎍; 쎍; 쎍; 쎍; ) HANGUL SYLLABLE SSELG +C38E;C38E;110A 1166 11B1;C38E;110A 1166 11B1; # (쎎; 쎎; 쎎; 쎎; 쎎; ) HANGUL SYLLABLE SSELM +C38F;C38F;110A 1166 11B2;C38F;110A 1166 11B2; # (쎏; 쎏; 쎏; 쎏; 쎏; ) HANGUL SYLLABLE SSELB +C390;C390;110A 1166 11B3;C390;110A 1166 11B3; # (쎐; 쎐; 쎐; 쎐; 쎐; ) HANGUL SYLLABLE SSELS +C391;C391;110A 1166 11B4;C391;110A 1166 11B4; # (쎑; 쎑; 쎑; 쎑; 쎑; ) HANGUL SYLLABLE SSELT +C392;C392;110A 1166 11B5;C392;110A 1166 11B5; # (쎒; 쎒; 쎒; 쎒; 쎒; ) HANGUL SYLLABLE SSELP +C393;C393;110A 1166 11B6;C393;110A 1166 11B6; # (쎓; 쎓; 쎓; 쎓; 쎓; ) HANGUL SYLLABLE SSELH +C394;C394;110A 1166 11B7;C394;110A 1166 11B7; # (쎔; 쎔; 쎔; 쎔; 쎔; ) HANGUL SYLLABLE SSEM +C395;C395;110A 1166 11B8;C395;110A 1166 11B8; # (쎕; 쎕; 쎕; 쎕; 쎕; ) HANGUL SYLLABLE SSEB +C396;C396;110A 1166 11B9;C396;110A 1166 11B9; # (쎖; 쎖; 쎖; 쎖; 쎖; ) HANGUL SYLLABLE SSEBS +C397;C397;110A 1166 11BA;C397;110A 1166 11BA; # (쎗; 쎗; 쎗; 쎗; 쎗; ) HANGUL SYLLABLE SSES +C398;C398;110A 1166 11BB;C398;110A 1166 11BB; # (쎘; 쎘; 쎘; 쎘; 쎘; ) HANGUL SYLLABLE SSESS +C399;C399;110A 1166 11BC;C399;110A 1166 11BC; # (쎙; 쎙; 쎙; 쎙; 쎙; ) HANGUL SYLLABLE SSENG +C39A;C39A;110A 1166 11BD;C39A;110A 1166 11BD; # (쎚; 쎚; 쎚; 쎚; 쎚; ) HANGUL SYLLABLE SSEJ +C39B;C39B;110A 1166 11BE;C39B;110A 1166 11BE; # (쎛; 쎛; 쎛; 쎛; 쎛; ) HANGUL SYLLABLE SSEC +C39C;C39C;110A 1166 11BF;C39C;110A 1166 11BF; # (쎜; 쎜; 쎜; 쎜; 쎜; ) HANGUL SYLLABLE SSEK +C39D;C39D;110A 1166 11C0;C39D;110A 1166 11C0; # (쎝; 쎝; 쎝; 쎝; 쎝; ) HANGUL SYLLABLE SSET +C39E;C39E;110A 1166 11C1;C39E;110A 1166 11C1; # (쎞; 쎞; 쎞; 쎞; 쎞; ) HANGUL SYLLABLE SSEP +C39F;C39F;110A 1166 11C2;C39F;110A 1166 11C2; # (쎟; 쎟; 쎟; 쎟; 쎟; ) HANGUL SYLLABLE SSEH +C3A0;C3A0;110A 1167;C3A0;110A 1167; # (쎠; 쎠; 쎠; 쎠; 쎠; ) HANGUL SYLLABLE SSYEO +C3A1;C3A1;110A 1167 11A8;C3A1;110A 1167 11A8; # (쎡; 쎡; 쎡; 쎡; 쎡; ) HANGUL SYLLABLE SSYEOG +C3A2;C3A2;110A 1167 11A9;C3A2;110A 1167 11A9; # (쎢; 쎢; 쎢; 쎢; 쎢; ) HANGUL SYLLABLE SSYEOGG +C3A3;C3A3;110A 1167 11AA;C3A3;110A 1167 11AA; # (쎣; 쎣; 쎣; 쎣; 쎣; ) HANGUL SYLLABLE SSYEOGS +C3A4;C3A4;110A 1167 11AB;C3A4;110A 1167 11AB; # (쎤; 쎤; 쎤; 쎤; 쎤; ) HANGUL SYLLABLE SSYEON +C3A5;C3A5;110A 1167 11AC;C3A5;110A 1167 11AC; # (쎥; 쎥; 쎥; 쎥; 쎥; ) HANGUL SYLLABLE SSYEONJ +C3A6;C3A6;110A 1167 11AD;C3A6;110A 1167 11AD; # (쎦; 쎦; 쎦; 쎦; 쎦; ) HANGUL SYLLABLE SSYEONH +C3A7;C3A7;110A 1167 11AE;C3A7;110A 1167 11AE; # (쎧; 쎧; 쎧; 쎧; 쎧; ) HANGUL SYLLABLE SSYEOD +C3A8;C3A8;110A 1167 11AF;C3A8;110A 1167 11AF; # (쎨; 쎨; 쎨; 쎨; 쎨; ) HANGUL SYLLABLE SSYEOL +C3A9;C3A9;110A 1167 11B0;C3A9;110A 1167 11B0; # (쎩; 쎩; 쎩; 쎩; 쎩; ) HANGUL SYLLABLE SSYEOLG +C3AA;C3AA;110A 1167 11B1;C3AA;110A 1167 11B1; # (쎪; 쎪; 쎪; 쎪; 쎪; ) HANGUL SYLLABLE SSYEOLM +C3AB;C3AB;110A 1167 11B2;C3AB;110A 1167 11B2; # (쎫; 쎫; 쎫; 쎫; 쎫; ) HANGUL SYLLABLE SSYEOLB +C3AC;C3AC;110A 1167 11B3;C3AC;110A 1167 11B3; # (쎬; 쎬; 쎬; 쎬; 쎬; ) HANGUL SYLLABLE SSYEOLS +C3AD;C3AD;110A 1167 11B4;C3AD;110A 1167 11B4; # (쎭; 쎭; 쎭; 쎭; 쎭; ) HANGUL SYLLABLE SSYEOLT +C3AE;C3AE;110A 1167 11B5;C3AE;110A 1167 11B5; # (쎮; 쎮; 쎮; 쎮; 쎮; ) HANGUL SYLLABLE SSYEOLP +C3AF;C3AF;110A 1167 11B6;C3AF;110A 1167 11B6; # (쎯; 쎯; 쎯; 쎯; 쎯; ) HANGUL SYLLABLE SSYEOLH +C3B0;C3B0;110A 1167 11B7;C3B0;110A 1167 11B7; # (쎰; 쎰; 쎰; 쎰; 쎰; ) HANGUL SYLLABLE SSYEOM +C3B1;C3B1;110A 1167 11B8;C3B1;110A 1167 11B8; # (쎱; 쎱; 쎱; 쎱; 쎱; ) HANGUL SYLLABLE SSYEOB +C3B2;C3B2;110A 1167 11B9;C3B2;110A 1167 11B9; # (쎲; 쎲; 쎲; 쎲; 쎲; ) HANGUL SYLLABLE SSYEOBS +C3B3;C3B3;110A 1167 11BA;C3B3;110A 1167 11BA; # (쎳; 쎳; 쎳; 쎳; 쎳; ) HANGUL SYLLABLE SSYEOS +C3B4;C3B4;110A 1167 11BB;C3B4;110A 1167 11BB; # (쎴; 쎴; 쎴; 쎴; 쎴; ) HANGUL SYLLABLE SSYEOSS +C3B5;C3B5;110A 1167 11BC;C3B5;110A 1167 11BC; # (쎵; 쎵; 쎵; 쎵; 쎵; ) HANGUL SYLLABLE SSYEONG +C3B6;C3B6;110A 1167 11BD;C3B6;110A 1167 11BD; # (쎶; 쎶; 쎶; 쎶; 쎶; ) HANGUL SYLLABLE SSYEOJ +C3B7;C3B7;110A 1167 11BE;C3B7;110A 1167 11BE; # (쎷; 쎷; 쎷; 쎷; 쎷; ) HANGUL SYLLABLE SSYEOC +C3B8;C3B8;110A 1167 11BF;C3B8;110A 1167 11BF; # (쎸; 쎸; 쎸; 쎸; 쎸; ) HANGUL SYLLABLE SSYEOK +C3B9;C3B9;110A 1167 11C0;C3B9;110A 1167 11C0; # (쎹; 쎹; 쎹; 쎹; 쎹; ) HANGUL SYLLABLE SSYEOT +C3BA;C3BA;110A 1167 11C1;C3BA;110A 1167 11C1; # (쎺; 쎺; 쎺; 쎺; 쎺; ) HANGUL SYLLABLE SSYEOP +C3BB;C3BB;110A 1167 11C2;C3BB;110A 1167 11C2; # (쎻; 쎻; 쎻; 쎻; 쎻; ) HANGUL SYLLABLE SSYEOH +C3BC;C3BC;110A 1168;C3BC;110A 1168; # (쎼; 쎼; 쎼; 쎼; 쎼; ) HANGUL SYLLABLE SSYE +C3BD;C3BD;110A 1168 11A8;C3BD;110A 1168 11A8; # (쎽; 쎽; 쎽; 쎽; 쎽; ) HANGUL SYLLABLE SSYEG +C3BE;C3BE;110A 1168 11A9;C3BE;110A 1168 11A9; # (쎾; 쎾; 쎾; 쎾; 쎾; ) HANGUL SYLLABLE SSYEGG +C3BF;C3BF;110A 1168 11AA;C3BF;110A 1168 11AA; # (쎿; 쎿; 쎿; 쎿; 쎿; ) HANGUL SYLLABLE SSYEGS +C3C0;C3C0;110A 1168 11AB;C3C0;110A 1168 11AB; # (쏀; 쏀; 쏀; 쏀; 쏀; ) HANGUL SYLLABLE SSYEN +C3C1;C3C1;110A 1168 11AC;C3C1;110A 1168 11AC; # (쏁; 쏁; 쏁; 쏁; 쏁; ) HANGUL SYLLABLE SSYENJ +C3C2;C3C2;110A 1168 11AD;C3C2;110A 1168 11AD; # (쏂; 쏂; 쏂; 쏂; 쏂; ) HANGUL SYLLABLE SSYENH +C3C3;C3C3;110A 1168 11AE;C3C3;110A 1168 11AE; # (쏃; 쏃; 쏃; 쏃; 쏃; ) HANGUL SYLLABLE SSYED +C3C4;C3C4;110A 1168 11AF;C3C4;110A 1168 11AF; # (쏄; 쏄; 쏄; 쏄; 쏄; ) HANGUL SYLLABLE SSYEL +C3C5;C3C5;110A 1168 11B0;C3C5;110A 1168 11B0; # (쏅; 쏅; 쏅; 쏅; 쏅; ) HANGUL SYLLABLE SSYELG +C3C6;C3C6;110A 1168 11B1;C3C6;110A 1168 11B1; # (쏆; 쏆; 쏆; 쏆; 쏆; ) HANGUL SYLLABLE SSYELM +C3C7;C3C7;110A 1168 11B2;C3C7;110A 1168 11B2; # (쏇; 쏇; 쏇; 쏇; 쏇; ) HANGUL SYLLABLE SSYELB +C3C8;C3C8;110A 1168 11B3;C3C8;110A 1168 11B3; # (쏈; 쏈; 쏈; 쏈; 쏈; ) HANGUL SYLLABLE SSYELS +C3C9;C3C9;110A 1168 11B4;C3C9;110A 1168 11B4; # (쏉; 쏉; 쏉; 쏉; 쏉; ) HANGUL SYLLABLE SSYELT +C3CA;C3CA;110A 1168 11B5;C3CA;110A 1168 11B5; # (쏊; 쏊; 쏊; 쏊; 쏊; ) HANGUL SYLLABLE SSYELP +C3CB;C3CB;110A 1168 11B6;C3CB;110A 1168 11B6; # (쏋; 쏋; 쏋; 쏋; 쏋; ) HANGUL SYLLABLE SSYELH +C3CC;C3CC;110A 1168 11B7;C3CC;110A 1168 11B7; # (쏌; 쏌; 쏌; 쏌; 쏌; ) HANGUL SYLLABLE SSYEM +C3CD;C3CD;110A 1168 11B8;C3CD;110A 1168 11B8; # (쏍; 쏍; 쏍; 쏍; 쏍; ) HANGUL SYLLABLE SSYEB +C3CE;C3CE;110A 1168 11B9;C3CE;110A 1168 11B9; # (쏎; 쏎; 쏎; 쏎; 쏎; ) HANGUL SYLLABLE SSYEBS +C3CF;C3CF;110A 1168 11BA;C3CF;110A 1168 11BA; # (쏏; 쏏; 쏏; 쏏; 쏏; ) HANGUL SYLLABLE SSYES +C3D0;C3D0;110A 1168 11BB;C3D0;110A 1168 11BB; # (쏐; 쏐; 쏐; 쏐; 쏐; ) HANGUL SYLLABLE SSYESS +C3D1;C3D1;110A 1168 11BC;C3D1;110A 1168 11BC; # (쏑; 쏑; 쏑; 쏑; 쏑; ) HANGUL SYLLABLE SSYENG +C3D2;C3D2;110A 1168 11BD;C3D2;110A 1168 11BD; # (쏒; 쏒; 쏒; 쏒; 쏒; ) HANGUL SYLLABLE SSYEJ +C3D3;C3D3;110A 1168 11BE;C3D3;110A 1168 11BE; # (쏓; 쏓; 쏓; 쏓; 쏓; ) HANGUL SYLLABLE SSYEC +C3D4;C3D4;110A 1168 11BF;C3D4;110A 1168 11BF; # (쏔; 쏔; 쏔; 쏔; 쏔; ) HANGUL SYLLABLE SSYEK +C3D5;C3D5;110A 1168 11C0;C3D5;110A 1168 11C0; # (쏕; 쏕; 쏕; 쏕; 쏕; ) HANGUL SYLLABLE SSYET +C3D6;C3D6;110A 1168 11C1;C3D6;110A 1168 11C1; # (쏖; 쏖; 쏖; 쏖; 쏖; ) HANGUL SYLLABLE SSYEP +C3D7;C3D7;110A 1168 11C2;C3D7;110A 1168 11C2; # (쏗; 쏗; 쏗; 쏗; 쏗; ) HANGUL SYLLABLE SSYEH +C3D8;C3D8;110A 1169;C3D8;110A 1169; # (쏘; 쏘; 쏘; 쏘; 쏘; ) HANGUL SYLLABLE SSO +C3D9;C3D9;110A 1169 11A8;C3D9;110A 1169 11A8; # (쏙; 쏙; 쏙; 쏙; 쏙; ) HANGUL SYLLABLE SSOG +C3DA;C3DA;110A 1169 11A9;C3DA;110A 1169 11A9; # (쏚; 쏚; 쏚; 쏚; 쏚; ) HANGUL SYLLABLE SSOGG +C3DB;C3DB;110A 1169 11AA;C3DB;110A 1169 11AA; # (쏛; 쏛; 쏛; 쏛; 쏛; ) HANGUL SYLLABLE SSOGS +C3DC;C3DC;110A 1169 11AB;C3DC;110A 1169 11AB; # (쏜; 쏜; 쏜; 쏜; 쏜; ) HANGUL SYLLABLE SSON +C3DD;C3DD;110A 1169 11AC;C3DD;110A 1169 11AC; # (쏝; 쏝; 쏝; 쏝; 쏝; ) HANGUL SYLLABLE SSONJ +C3DE;C3DE;110A 1169 11AD;C3DE;110A 1169 11AD; # (쏞; 쏞; 쏞; 쏞; 쏞; ) HANGUL SYLLABLE SSONH +C3DF;C3DF;110A 1169 11AE;C3DF;110A 1169 11AE; # (쏟; 쏟; 쏟; 쏟; 쏟; ) HANGUL SYLLABLE SSOD +C3E0;C3E0;110A 1169 11AF;C3E0;110A 1169 11AF; # (쏠; 쏠; 쏠; 쏠; 쏠; ) HANGUL SYLLABLE SSOL +C3E1;C3E1;110A 1169 11B0;C3E1;110A 1169 11B0; # (쏡; 쏡; 쏡; 쏡; 쏡; ) HANGUL SYLLABLE SSOLG +C3E2;C3E2;110A 1169 11B1;C3E2;110A 1169 11B1; # (쏢; 쏢; 쏢; 쏢; 쏢; ) HANGUL SYLLABLE SSOLM +C3E3;C3E3;110A 1169 11B2;C3E3;110A 1169 11B2; # (쏣; 쏣; 쏣; 쏣; 쏣; ) HANGUL SYLLABLE SSOLB +C3E4;C3E4;110A 1169 11B3;C3E4;110A 1169 11B3; # (쏤; 쏤; 쏤; 쏤; 쏤; ) HANGUL SYLLABLE SSOLS +C3E5;C3E5;110A 1169 11B4;C3E5;110A 1169 11B4; # (쏥; 쏥; 쏥; 쏥; 쏥; ) HANGUL SYLLABLE SSOLT +C3E6;C3E6;110A 1169 11B5;C3E6;110A 1169 11B5; # (쏦; 쏦; 쏦; 쏦; 쏦; ) HANGUL SYLLABLE SSOLP +C3E7;C3E7;110A 1169 11B6;C3E7;110A 1169 11B6; # (쏧; 쏧; 쏧; 쏧; 쏧; ) HANGUL SYLLABLE SSOLH +C3E8;C3E8;110A 1169 11B7;C3E8;110A 1169 11B7; # (쏨; 쏨; 쏨; 쏨; 쏨; ) HANGUL SYLLABLE SSOM +C3E9;C3E9;110A 1169 11B8;C3E9;110A 1169 11B8; # (쏩; 쏩; 쏩; 쏩; 쏩; ) HANGUL SYLLABLE SSOB +C3EA;C3EA;110A 1169 11B9;C3EA;110A 1169 11B9; # (쏪; 쏪; 쏪; 쏪; 쏪; ) HANGUL SYLLABLE SSOBS +C3EB;C3EB;110A 1169 11BA;C3EB;110A 1169 11BA; # (쏫; 쏫; 쏫; 쏫; 쏫; ) HANGUL SYLLABLE SSOS +C3EC;C3EC;110A 1169 11BB;C3EC;110A 1169 11BB; # (쏬; 쏬; 쏬; 쏬; 쏬; ) HANGUL SYLLABLE SSOSS +C3ED;C3ED;110A 1169 11BC;C3ED;110A 1169 11BC; # (쏭; 쏭; 쏭; 쏭; 쏭; ) HANGUL SYLLABLE SSONG +C3EE;C3EE;110A 1169 11BD;C3EE;110A 1169 11BD; # (쏮; 쏮; 쏮; 쏮; 쏮; ) HANGUL SYLLABLE SSOJ +C3EF;C3EF;110A 1169 11BE;C3EF;110A 1169 11BE; # (쏯; 쏯; 쏯; 쏯; 쏯; ) HANGUL SYLLABLE SSOC +C3F0;C3F0;110A 1169 11BF;C3F0;110A 1169 11BF; # (쏰; 쏰; 쏰; 쏰; 쏰; ) HANGUL SYLLABLE SSOK +C3F1;C3F1;110A 1169 11C0;C3F1;110A 1169 11C0; # (쏱; 쏱; 쏱; 쏱; 쏱; ) HANGUL SYLLABLE SSOT +C3F2;C3F2;110A 1169 11C1;C3F2;110A 1169 11C1; # (쏲; 쏲; 쏲; 쏲; 쏲; ) HANGUL SYLLABLE SSOP +C3F3;C3F3;110A 1169 11C2;C3F3;110A 1169 11C2; # (쏳; 쏳; 쏳; 쏳; 쏳; ) HANGUL SYLLABLE SSOH +C3F4;C3F4;110A 116A;C3F4;110A 116A; # (쏴; 쏴; 쏴; 쏴; 쏴; ) HANGUL SYLLABLE SSWA +C3F5;C3F5;110A 116A 11A8;C3F5;110A 116A 11A8; # (쏵; 쏵; 쏵; 쏵; 쏵; ) HANGUL SYLLABLE SSWAG +C3F6;C3F6;110A 116A 11A9;C3F6;110A 116A 11A9; # (쏶; 쏶; 쏶; 쏶; 쏶; ) HANGUL SYLLABLE SSWAGG +C3F7;C3F7;110A 116A 11AA;C3F7;110A 116A 11AA; # (쏷; 쏷; 쏷; 쏷; 쏷; ) HANGUL SYLLABLE SSWAGS +C3F8;C3F8;110A 116A 11AB;C3F8;110A 116A 11AB; # (쏸; 쏸; 쏸; 쏸; 쏸; ) HANGUL SYLLABLE SSWAN +C3F9;C3F9;110A 116A 11AC;C3F9;110A 116A 11AC; # (쏹; 쏹; 쏹; 쏹; 쏹; ) HANGUL SYLLABLE SSWANJ +C3FA;C3FA;110A 116A 11AD;C3FA;110A 116A 11AD; # (쏺; 쏺; 쏺; 쏺; 쏺; ) HANGUL SYLLABLE SSWANH +C3FB;C3FB;110A 116A 11AE;C3FB;110A 116A 11AE; # (쏻; 쏻; 쏻; 쏻; 쏻; ) HANGUL SYLLABLE SSWAD +C3FC;C3FC;110A 116A 11AF;C3FC;110A 116A 11AF; # (쏼; 쏼; 쏼; 쏼; 쏼; ) HANGUL SYLLABLE SSWAL +C3FD;C3FD;110A 116A 11B0;C3FD;110A 116A 11B0; # (쏽; 쏽; 쏽; 쏽; 쏽; ) HANGUL SYLLABLE SSWALG +C3FE;C3FE;110A 116A 11B1;C3FE;110A 116A 11B1; # (쏾; 쏾; 쏾; 쏾; 쏾; ) HANGUL SYLLABLE SSWALM +C3FF;C3FF;110A 116A 11B2;C3FF;110A 116A 11B2; # (쏿; 쏿; 쏿; 쏿; 쏿; ) HANGUL SYLLABLE SSWALB +C400;C400;110A 116A 11B3;C400;110A 116A 11B3; # (쐀; 쐀; 쐀; 쐀; 쐀; ) HANGUL SYLLABLE SSWALS +C401;C401;110A 116A 11B4;C401;110A 116A 11B4; # (쐁; 쐁; 쐁; 쐁; 쐁; ) HANGUL SYLLABLE SSWALT +C402;C402;110A 116A 11B5;C402;110A 116A 11B5; # (쐂; 쐂; 쐂; 쐂; 쐂; ) HANGUL SYLLABLE SSWALP +C403;C403;110A 116A 11B6;C403;110A 116A 11B6; # (쐃; 쐃; 쐃; 쐃; 쐃; ) HANGUL SYLLABLE SSWALH +C404;C404;110A 116A 11B7;C404;110A 116A 11B7; # (쐄; 쐄; 쐄; 쐄; 쐄; ) HANGUL SYLLABLE SSWAM +C405;C405;110A 116A 11B8;C405;110A 116A 11B8; # (쐅; 쐅; 쐅; 쐅; 쐅; ) HANGUL SYLLABLE SSWAB +C406;C406;110A 116A 11B9;C406;110A 116A 11B9; # (쐆; 쐆; 쐆; 쐆; 쐆; ) HANGUL SYLLABLE SSWABS +C407;C407;110A 116A 11BA;C407;110A 116A 11BA; # (쐇; 쐇; 쐇; 쐇; 쐇; ) HANGUL SYLLABLE SSWAS +C408;C408;110A 116A 11BB;C408;110A 116A 11BB; # (쐈; 쐈; 쐈; 쐈; 쐈; ) HANGUL SYLLABLE SSWASS +C409;C409;110A 116A 11BC;C409;110A 116A 11BC; # (쐉; 쐉; 쐉; 쐉; 쐉; ) HANGUL SYLLABLE SSWANG +C40A;C40A;110A 116A 11BD;C40A;110A 116A 11BD; # (쐊; 쐊; 쐊; 쐊; 쐊; ) HANGUL SYLLABLE SSWAJ +C40B;C40B;110A 116A 11BE;C40B;110A 116A 11BE; # (쐋; 쐋; 쐋; 쐋; 쐋; ) HANGUL SYLLABLE SSWAC +C40C;C40C;110A 116A 11BF;C40C;110A 116A 11BF; # (쐌; 쐌; 쐌; 쐌; 쐌; ) HANGUL SYLLABLE SSWAK +C40D;C40D;110A 116A 11C0;C40D;110A 116A 11C0; # (쐍; 쐍; 쐍; 쐍; 쐍; ) HANGUL SYLLABLE SSWAT +C40E;C40E;110A 116A 11C1;C40E;110A 116A 11C1; # (쐎; 쐎; 쐎; 쐎; 쐎; ) HANGUL SYLLABLE SSWAP +C40F;C40F;110A 116A 11C2;C40F;110A 116A 11C2; # (쐏; 쐏; 쐏; 쐏; 쐏; ) HANGUL SYLLABLE SSWAH +C410;C410;110A 116B;C410;110A 116B; # (쐐; 쐐; 쐐; 쐐; 쐐; ) HANGUL SYLLABLE SSWAE +C411;C411;110A 116B 11A8;C411;110A 116B 11A8; # (쐑; 쐑; 쐑; 쐑; 쐑; ) HANGUL SYLLABLE SSWAEG +C412;C412;110A 116B 11A9;C412;110A 116B 11A9; # (쐒; 쐒; 쐒; 쐒; 쐒; ) HANGUL SYLLABLE SSWAEGG +C413;C413;110A 116B 11AA;C413;110A 116B 11AA; # (쐓; 쐓; 쐓; 쐓; 쐓; ) HANGUL SYLLABLE SSWAEGS +C414;C414;110A 116B 11AB;C414;110A 116B 11AB; # (쐔; 쐔; 쐔; 쐔; 쐔; ) HANGUL SYLLABLE SSWAEN +C415;C415;110A 116B 11AC;C415;110A 116B 11AC; # (쐕; 쐕; 쐕; 쐕; 쐕; ) HANGUL SYLLABLE SSWAENJ +C416;C416;110A 116B 11AD;C416;110A 116B 11AD; # (쐖; 쐖; 쐖; 쐖; 쐖; ) HANGUL SYLLABLE SSWAENH +C417;C417;110A 116B 11AE;C417;110A 116B 11AE; # (쐗; 쐗; 쐗; 쐗; 쐗; ) HANGUL SYLLABLE SSWAED +C418;C418;110A 116B 11AF;C418;110A 116B 11AF; # (쐘; 쐘; 쐘; 쐘; 쐘; ) HANGUL SYLLABLE SSWAEL +C419;C419;110A 116B 11B0;C419;110A 116B 11B0; # (쐙; 쐙; 쐙; 쐙; 쐙; ) HANGUL SYLLABLE SSWAELG +C41A;C41A;110A 116B 11B1;C41A;110A 116B 11B1; # (쐚; 쐚; 쐚; 쐚; 쐚; ) HANGUL SYLLABLE SSWAELM +C41B;C41B;110A 116B 11B2;C41B;110A 116B 11B2; # (쐛; 쐛; 쐛; 쐛; 쐛; ) HANGUL SYLLABLE SSWAELB +C41C;C41C;110A 116B 11B3;C41C;110A 116B 11B3; # (쐜; 쐜; 쐜; 쐜; 쐜; ) HANGUL SYLLABLE SSWAELS +C41D;C41D;110A 116B 11B4;C41D;110A 116B 11B4; # (쐝; 쐝; 쐝; 쐝; 쐝; ) HANGUL SYLLABLE SSWAELT +C41E;C41E;110A 116B 11B5;C41E;110A 116B 11B5; # (쐞; 쐞; 쐞; 쐞; 쐞; ) HANGUL SYLLABLE SSWAELP +C41F;C41F;110A 116B 11B6;C41F;110A 116B 11B6; # (쐟; 쐟; 쐟; 쐟; 쐟; ) HANGUL SYLLABLE SSWAELH +C420;C420;110A 116B 11B7;C420;110A 116B 11B7; # (쐠; 쐠; 쐠; 쐠; 쐠; ) HANGUL SYLLABLE SSWAEM +C421;C421;110A 116B 11B8;C421;110A 116B 11B8; # (쐡; 쐡; 쐡; 쐡; 쐡; ) HANGUL SYLLABLE SSWAEB +C422;C422;110A 116B 11B9;C422;110A 116B 11B9; # (쐢; 쐢; 쐢; 쐢; 쐢; ) HANGUL SYLLABLE SSWAEBS +C423;C423;110A 116B 11BA;C423;110A 116B 11BA; # (쐣; 쐣; 쐣; 쐣; 쐣; ) HANGUL SYLLABLE SSWAES +C424;C424;110A 116B 11BB;C424;110A 116B 11BB; # (쐤; 쐤; 쐤; 쐤; 쐤; ) HANGUL SYLLABLE SSWAESS +C425;C425;110A 116B 11BC;C425;110A 116B 11BC; # (쐥; 쐥; 쐥; 쐥; 쐥; ) HANGUL SYLLABLE SSWAENG +C426;C426;110A 116B 11BD;C426;110A 116B 11BD; # (쐦; 쐦; 쐦; 쐦; 쐦; ) HANGUL SYLLABLE SSWAEJ +C427;C427;110A 116B 11BE;C427;110A 116B 11BE; # (쐧; 쐧; 쐧; 쐧; 쐧; ) HANGUL SYLLABLE SSWAEC +C428;C428;110A 116B 11BF;C428;110A 116B 11BF; # (쐨; 쐨; 쐨; 쐨; 쐨; ) HANGUL SYLLABLE SSWAEK +C429;C429;110A 116B 11C0;C429;110A 116B 11C0; # (쐩; 쐩; 쐩; 쐩; 쐩; ) HANGUL SYLLABLE SSWAET +C42A;C42A;110A 116B 11C1;C42A;110A 116B 11C1; # (쐪; 쐪; 쐪; 쐪; 쐪; ) HANGUL SYLLABLE SSWAEP +C42B;C42B;110A 116B 11C2;C42B;110A 116B 11C2; # (쐫; 쐫; 쐫; 쐫; 쐫; ) HANGUL SYLLABLE SSWAEH +C42C;C42C;110A 116C;C42C;110A 116C; # (쐬; 쐬; 쐬; 쐬; 쐬; ) HANGUL SYLLABLE SSOE +C42D;C42D;110A 116C 11A8;C42D;110A 116C 11A8; # (쐭; 쐭; 쐭; 쐭; 쐭; ) HANGUL SYLLABLE SSOEG +C42E;C42E;110A 116C 11A9;C42E;110A 116C 11A9; # (쐮; 쐮; 쐮; 쐮; 쐮; ) HANGUL SYLLABLE SSOEGG +C42F;C42F;110A 116C 11AA;C42F;110A 116C 11AA; # (쐯; 쐯; 쐯; 쐯; 쐯; ) HANGUL SYLLABLE SSOEGS +C430;C430;110A 116C 11AB;C430;110A 116C 11AB; # (쐰; 쐰; 쐰; 쐰; 쐰; ) HANGUL SYLLABLE SSOEN +C431;C431;110A 116C 11AC;C431;110A 116C 11AC; # (쐱; 쐱; 쐱; 쐱; 쐱; ) HANGUL SYLLABLE SSOENJ +C432;C432;110A 116C 11AD;C432;110A 116C 11AD; # (쐲; 쐲; 쐲; 쐲; 쐲; ) HANGUL SYLLABLE SSOENH +C433;C433;110A 116C 11AE;C433;110A 116C 11AE; # (쐳; 쐳; 쐳; 쐳; 쐳; ) HANGUL SYLLABLE SSOED +C434;C434;110A 116C 11AF;C434;110A 116C 11AF; # (쐴; 쐴; 쐴; 쐴; 쐴; ) HANGUL SYLLABLE SSOEL +C435;C435;110A 116C 11B0;C435;110A 116C 11B0; # (쐵; 쐵; 쐵; 쐵; 쐵; ) HANGUL SYLLABLE SSOELG +C436;C436;110A 116C 11B1;C436;110A 116C 11B1; # (쐶; 쐶; 쐶; 쐶; 쐶; ) HANGUL SYLLABLE SSOELM +C437;C437;110A 116C 11B2;C437;110A 116C 11B2; # (쐷; 쐷; 쐷; 쐷; 쐷; ) HANGUL SYLLABLE SSOELB +C438;C438;110A 116C 11B3;C438;110A 116C 11B3; # (쐸; 쐸; 쐸; 쐸; 쐸; ) HANGUL SYLLABLE SSOELS +C439;C439;110A 116C 11B4;C439;110A 116C 11B4; # (쐹; 쐹; 쐹; 쐹; 쐹; ) HANGUL SYLLABLE SSOELT +C43A;C43A;110A 116C 11B5;C43A;110A 116C 11B5; # (쐺; 쐺; 쐺; 쐺; 쐺; ) HANGUL SYLLABLE SSOELP +C43B;C43B;110A 116C 11B6;C43B;110A 116C 11B6; # (쐻; 쐻; 쐻; 쐻; 쐻; ) HANGUL SYLLABLE SSOELH +C43C;C43C;110A 116C 11B7;C43C;110A 116C 11B7; # (쐼; 쐼; 쐼; 쐼; 쐼; ) HANGUL SYLLABLE SSOEM +C43D;C43D;110A 116C 11B8;C43D;110A 116C 11B8; # (쐽; 쐽; 쐽; 쐽; 쐽; ) HANGUL SYLLABLE SSOEB +C43E;C43E;110A 116C 11B9;C43E;110A 116C 11B9; # (쐾; 쐾; 쐾; 쐾; 쐾; ) HANGUL SYLLABLE SSOEBS +C43F;C43F;110A 116C 11BA;C43F;110A 116C 11BA; # (쐿; 쐿; 쐿; 쐿; 쐿; ) HANGUL SYLLABLE SSOES +C440;C440;110A 116C 11BB;C440;110A 116C 11BB; # (쑀; 쑀; 쑀; 쑀; 쑀; ) HANGUL SYLLABLE SSOESS +C441;C441;110A 116C 11BC;C441;110A 116C 11BC; # (쑁; 쑁; 쑁; 쑁; 쑁; ) HANGUL SYLLABLE SSOENG +C442;C442;110A 116C 11BD;C442;110A 116C 11BD; # (쑂; 쑂; 쑂; 쑂; 쑂; ) HANGUL SYLLABLE SSOEJ +C443;C443;110A 116C 11BE;C443;110A 116C 11BE; # (쑃; 쑃; 쑃; 쑃; 쑃; ) HANGUL SYLLABLE SSOEC +C444;C444;110A 116C 11BF;C444;110A 116C 11BF; # (쑄; 쑄; 쑄; 쑄; 쑄; ) HANGUL SYLLABLE SSOEK +C445;C445;110A 116C 11C0;C445;110A 116C 11C0; # (쑅; 쑅; 쑅; 쑅; 쑅; ) HANGUL SYLLABLE SSOET +C446;C446;110A 116C 11C1;C446;110A 116C 11C1; # (쑆; 쑆; 쑆; 쑆; 쑆; ) HANGUL SYLLABLE SSOEP +C447;C447;110A 116C 11C2;C447;110A 116C 11C2; # (쑇; 쑇; 쑇; 쑇; 쑇; ) HANGUL SYLLABLE SSOEH +C448;C448;110A 116D;C448;110A 116D; # (쑈; 쑈; 쑈; 쑈; 쑈; ) HANGUL SYLLABLE SSYO +C449;C449;110A 116D 11A8;C449;110A 116D 11A8; # (쑉; 쑉; 쑉; 쑉; 쑉; ) HANGUL SYLLABLE SSYOG +C44A;C44A;110A 116D 11A9;C44A;110A 116D 11A9; # (쑊; 쑊; 쑊; 쑊; 쑊; ) HANGUL SYLLABLE SSYOGG +C44B;C44B;110A 116D 11AA;C44B;110A 116D 11AA; # (쑋; 쑋; 쑋; 쑋; 쑋; ) HANGUL SYLLABLE SSYOGS +C44C;C44C;110A 116D 11AB;C44C;110A 116D 11AB; # (쑌; 쑌; 쑌; 쑌; 쑌; ) HANGUL SYLLABLE SSYON +C44D;C44D;110A 116D 11AC;C44D;110A 116D 11AC; # (쑍; 쑍; 쑍; 쑍; 쑍; ) HANGUL SYLLABLE SSYONJ +C44E;C44E;110A 116D 11AD;C44E;110A 116D 11AD; # (쑎; 쑎; 쑎; 쑎; 쑎; ) HANGUL SYLLABLE SSYONH +C44F;C44F;110A 116D 11AE;C44F;110A 116D 11AE; # (쑏; 쑏; 쑏; 쑏; 쑏; ) HANGUL SYLLABLE SSYOD +C450;C450;110A 116D 11AF;C450;110A 116D 11AF; # (쑐; 쑐; 쑐; 쑐; 쑐; ) HANGUL SYLLABLE SSYOL +C451;C451;110A 116D 11B0;C451;110A 116D 11B0; # (쑑; 쑑; 쑑; 쑑; 쑑; ) HANGUL SYLLABLE SSYOLG +C452;C452;110A 116D 11B1;C452;110A 116D 11B1; # (쑒; 쑒; 쑒; 쑒; 쑒; ) HANGUL SYLLABLE SSYOLM +C453;C453;110A 116D 11B2;C453;110A 116D 11B2; # (쑓; 쑓; 쑓; 쑓; 쑓; ) HANGUL SYLLABLE SSYOLB +C454;C454;110A 116D 11B3;C454;110A 116D 11B3; # (쑔; 쑔; 쑔; 쑔; 쑔; ) HANGUL SYLLABLE SSYOLS +C455;C455;110A 116D 11B4;C455;110A 116D 11B4; # (쑕; 쑕; 쑕; 쑕; 쑕; ) HANGUL SYLLABLE SSYOLT +C456;C456;110A 116D 11B5;C456;110A 116D 11B5; # (쑖; 쑖; 쑖; 쑖; 쑖; ) HANGUL SYLLABLE SSYOLP +C457;C457;110A 116D 11B6;C457;110A 116D 11B6; # (쑗; 쑗; 쑗; 쑗; 쑗; ) HANGUL SYLLABLE SSYOLH +C458;C458;110A 116D 11B7;C458;110A 116D 11B7; # (쑘; 쑘; 쑘; 쑘; 쑘; ) HANGUL SYLLABLE SSYOM +C459;C459;110A 116D 11B8;C459;110A 116D 11B8; # (쑙; 쑙; 쑙; 쑙; 쑙; ) HANGUL SYLLABLE SSYOB +C45A;C45A;110A 116D 11B9;C45A;110A 116D 11B9; # (쑚; 쑚; 쑚; 쑚; 쑚; ) HANGUL SYLLABLE SSYOBS +C45B;C45B;110A 116D 11BA;C45B;110A 116D 11BA; # (쑛; 쑛; 쑛; 쑛; 쑛; ) HANGUL SYLLABLE SSYOS +C45C;C45C;110A 116D 11BB;C45C;110A 116D 11BB; # (쑜; 쑜; 쑜; 쑜; 쑜; ) HANGUL SYLLABLE SSYOSS +C45D;C45D;110A 116D 11BC;C45D;110A 116D 11BC; # (쑝; 쑝; 쑝; 쑝; 쑝; ) HANGUL SYLLABLE SSYONG +C45E;C45E;110A 116D 11BD;C45E;110A 116D 11BD; # (쑞; 쑞; 쑞; 쑞; 쑞; ) HANGUL SYLLABLE SSYOJ +C45F;C45F;110A 116D 11BE;C45F;110A 116D 11BE; # (쑟; 쑟; 쑟; 쑟; 쑟; ) HANGUL SYLLABLE SSYOC +C460;C460;110A 116D 11BF;C460;110A 116D 11BF; # (쑠; 쑠; 쑠; 쑠; 쑠; ) HANGUL SYLLABLE SSYOK +C461;C461;110A 116D 11C0;C461;110A 116D 11C0; # (쑡; 쑡; 쑡; 쑡; 쑡; ) HANGUL SYLLABLE SSYOT +C462;C462;110A 116D 11C1;C462;110A 116D 11C1; # (쑢; 쑢; 쑢; 쑢; 쑢; ) HANGUL SYLLABLE SSYOP +C463;C463;110A 116D 11C2;C463;110A 116D 11C2; # (쑣; 쑣; 쑣; 쑣; 쑣; ) HANGUL SYLLABLE SSYOH +C464;C464;110A 116E;C464;110A 116E; # (쑤; 쑤; 쑤; 쑤; 쑤; ) HANGUL SYLLABLE SSU +C465;C465;110A 116E 11A8;C465;110A 116E 11A8; # (쑥; 쑥; 쑥; 쑥; 쑥; ) HANGUL SYLLABLE SSUG +C466;C466;110A 116E 11A9;C466;110A 116E 11A9; # (쑦; 쑦; 쑦; 쑦; 쑦; ) HANGUL SYLLABLE SSUGG +C467;C467;110A 116E 11AA;C467;110A 116E 11AA; # (쑧; 쑧; 쑧; 쑧; 쑧; ) HANGUL SYLLABLE SSUGS +C468;C468;110A 116E 11AB;C468;110A 116E 11AB; # (쑨; 쑨; 쑨; 쑨; 쑨; ) HANGUL SYLLABLE SSUN +C469;C469;110A 116E 11AC;C469;110A 116E 11AC; # (쑩; 쑩; 쑩; 쑩; 쑩; ) HANGUL SYLLABLE SSUNJ +C46A;C46A;110A 116E 11AD;C46A;110A 116E 11AD; # (쑪; 쑪; 쑪; 쑪; 쑪; ) HANGUL SYLLABLE SSUNH +C46B;C46B;110A 116E 11AE;C46B;110A 116E 11AE; # (쑫; 쑫; 쑫; 쑫; 쑫; ) HANGUL SYLLABLE SSUD +C46C;C46C;110A 116E 11AF;C46C;110A 116E 11AF; # (쑬; 쑬; 쑬; 쑬; 쑬; ) HANGUL SYLLABLE SSUL +C46D;C46D;110A 116E 11B0;C46D;110A 116E 11B0; # (쑭; 쑭; 쑭; 쑭; 쑭; ) HANGUL SYLLABLE SSULG +C46E;C46E;110A 116E 11B1;C46E;110A 116E 11B1; # (쑮; 쑮; 쑮; 쑮; 쑮; ) HANGUL SYLLABLE SSULM +C46F;C46F;110A 116E 11B2;C46F;110A 116E 11B2; # (쑯; 쑯; 쑯; 쑯; 쑯; ) HANGUL SYLLABLE SSULB +C470;C470;110A 116E 11B3;C470;110A 116E 11B3; # (쑰; 쑰; 쑰; 쑰; 쑰; ) HANGUL SYLLABLE SSULS +C471;C471;110A 116E 11B4;C471;110A 116E 11B4; # (쑱; 쑱; 쑱; 쑱; 쑱; ) HANGUL SYLLABLE SSULT +C472;C472;110A 116E 11B5;C472;110A 116E 11B5; # (쑲; 쑲; 쑲; 쑲; 쑲; ) HANGUL SYLLABLE SSULP +C473;C473;110A 116E 11B6;C473;110A 116E 11B6; # (쑳; 쑳; 쑳; 쑳; 쑳; ) HANGUL SYLLABLE SSULH +C474;C474;110A 116E 11B7;C474;110A 116E 11B7; # (쑴; 쑴; 쑴; 쑴; 쑴; ) HANGUL SYLLABLE SSUM +C475;C475;110A 116E 11B8;C475;110A 116E 11B8; # (쑵; 쑵; 쑵; 쑵; 쑵; ) HANGUL SYLLABLE SSUB +C476;C476;110A 116E 11B9;C476;110A 116E 11B9; # (쑶; 쑶; 쑶; 쑶; 쑶; ) HANGUL SYLLABLE SSUBS +C477;C477;110A 116E 11BA;C477;110A 116E 11BA; # (쑷; 쑷; 쑷; 쑷; 쑷; ) HANGUL SYLLABLE SSUS +C478;C478;110A 116E 11BB;C478;110A 116E 11BB; # (쑸; 쑸; 쑸; 쑸; 쑸; ) HANGUL SYLLABLE SSUSS +C479;C479;110A 116E 11BC;C479;110A 116E 11BC; # (쑹; 쑹; 쑹; 쑹; 쑹; ) HANGUL SYLLABLE SSUNG +C47A;C47A;110A 116E 11BD;C47A;110A 116E 11BD; # (쑺; 쑺; 쑺; 쑺; 쑺; ) HANGUL SYLLABLE SSUJ +C47B;C47B;110A 116E 11BE;C47B;110A 116E 11BE; # (쑻; 쑻; 쑻; 쑻; 쑻; ) HANGUL SYLLABLE SSUC +C47C;C47C;110A 116E 11BF;C47C;110A 116E 11BF; # (쑼; 쑼; 쑼; 쑼; 쑼; ) HANGUL SYLLABLE SSUK +C47D;C47D;110A 116E 11C0;C47D;110A 116E 11C0; # (쑽; 쑽; 쑽; 쑽; 쑽; ) HANGUL SYLLABLE SSUT +C47E;C47E;110A 116E 11C1;C47E;110A 116E 11C1; # (쑾; 쑾; 쑾; 쑾; 쑾; ) HANGUL SYLLABLE SSUP +C47F;C47F;110A 116E 11C2;C47F;110A 116E 11C2; # (쑿; 쑿; 쑿; 쑿; 쑿; ) HANGUL SYLLABLE SSUH +C480;C480;110A 116F;C480;110A 116F; # (쒀; 쒀; 쒀; 쒀; 쒀; ) HANGUL SYLLABLE SSWEO +C481;C481;110A 116F 11A8;C481;110A 116F 11A8; # (쒁; 쒁; 쒁; 쒁; 쒁; ) HANGUL SYLLABLE SSWEOG +C482;C482;110A 116F 11A9;C482;110A 116F 11A9; # (쒂; 쒂; 쒂; 쒂; 쒂; ) HANGUL SYLLABLE SSWEOGG +C483;C483;110A 116F 11AA;C483;110A 116F 11AA; # (쒃; 쒃; 쒃; 쒃; 쒃; ) HANGUL SYLLABLE SSWEOGS +C484;C484;110A 116F 11AB;C484;110A 116F 11AB; # (쒄; 쒄; 쒄; 쒄; 쒄; ) HANGUL SYLLABLE SSWEON +C485;C485;110A 116F 11AC;C485;110A 116F 11AC; # (쒅; 쒅; 쒅; 쒅; 쒅; ) HANGUL SYLLABLE SSWEONJ +C486;C486;110A 116F 11AD;C486;110A 116F 11AD; # (쒆; 쒆; 쒆; 쒆; 쒆; ) HANGUL SYLLABLE SSWEONH +C487;C487;110A 116F 11AE;C487;110A 116F 11AE; # (쒇; 쒇; 쒇; 쒇; 쒇; ) HANGUL SYLLABLE SSWEOD +C488;C488;110A 116F 11AF;C488;110A 116F 11AF; # (쒈; 쒈; 쒈; 쒈; 쒈; ) HANGUL SYLLABLE SSWEOL +C489;C489;110A 116F 11B0;C489;110A 116F 11B0; # (쒉; 쒉; 쒉; 쒉; 쒉; ) HANGUL SYLLABLE SSWEOLG +C48A;C48A;110A 116F 11B1;C48A;110A 116F 11B1; # (쒊; 쒊; 쒊; 쒊; 쒊; ) HANGUL SYLLABLE SSWEOLM +C48B;C48B;110A 116F 11B2;C48B;110A 116F 11B2; # (쒋; 쒋; 쒋; 쒋; 쒋; ) HANGUL SYLLABLE SSWEOLB +C48C;C48C;110A 116F 11B3;C48C;110A 116F 11B3; # (쒌; 쒌; 쒌; 쒌; 쒌; ) HANGUL SYLLABLE SSWEOLS +C48D;C48D;110A 116F 11B4;C48D;110A 116F 11B4; # (쒍; 쒍; 쒍; 쒍; 쒍; ) HANGUL SYLLABLE SSWEOLT +C48E;C48E;110A 116F 11B5;C48E;110A 116F 11B5; # (쒎; 쒎; 쒎; 쒎; 쒎; ) HANGUL SYLLABLE SSWEOLP +C48F;C48F;110A 116F 11B6;C48F;110A 116F 11B6; # (쒏; 쒏; 쒏; 쒏; 쒏; ) HANGUL SYLLABLE SSWEOLH +C490;C490;110A 116F 11B7;C490;110A 116F 11B7; # (쒐; 쒐; 쒐; 쒐; 쒐; ) HANGUL SYLLABLE SSWEOM +C491;C491;110A 116F 11B8;C491;110A 116F 11B8; # (쒑; 쒑; 쒑; 쒑; 쒑; ) HANGUL SYLLABLE SSWEOB +C492;C492;110A 116F 11B9;C492;110A 116F 11B9; # (쒒; 쒒; 쒒; 쒒; 쒒; ) HANGUL SYLLABLE SSWEOBS +C493;C493;110A 116F 11BA;C493;110A 116F 11BA; # (쒓; 쒓; 쒓; 쒓; 쒓; ) HANGUL SYLLABLE SSWEOS +C494;C494;110A 116F 11BB;C494;110A 116F 11BB; # (쒔; 쒔; 쒔; 쒔; 쒔; ) HANGUL SYLLABLE SSWEOSS +C495;C495;110A 116F 11BC;C495;110A 116F 11BC; # (쒕; 쒕; 쒕; 쒕; 쒕; ) HANGUL SYLLABLE SSWEONG +C496;C496;110A 116F 11BD;C496;110A 116F 11BD; # (쒖; 쒖; 쒖; 쒖; 쒖; ) HANGUL SYLLABLE SSWEOJ +C497;C497;110A 116F 11BE;C497;110A 116F 11BE; # (쒗; 쒗; 쒗; 쒗; 쒗; ) HANGUL SYLLABLE SSWEOC +C498;C498;110A 116F 11BF;C498;110A 116F 11BF; # (쒘; 쒘; 쒘; 쒘; 쒘; ) HANGUL SYLLABLE SSWEOK +C499;C499;110A 116F 11C0;C499;110A 116F 11C0; # (쒙; 쒙; 쒙; 쒙; 쒙; ) HANGUL SYLLABLE SSWEOT +C49A;C49A;110A 116F 11C1;C49A;110A 116F 11C1; # (쒚; 쒚; 쒚; 쒚; 쒚; ) HANGUL SYLLABLE SSWEOP +C49B;C49B;110A 116F 11C2;C49B;110A 116F 11C2; # (쒛; 쒛; 쒛; 쒛; 쒛; ) HANGUL SYLLABLE SSWEOH +C49C;C49C;110A 1170;C49C;110A 1170; # (쒜; 쒜; 쒜; 쒜; 쒜; ) HANGUL SYLLABLE SSWE +C49D;C49D;110A 1170 11A8;C49D;110A 1170 11A8; # (쒝; 쒝; 쒝; 쒝; 쒝; ) HANGUL SYLLABLE SSWEG +C49E;C49E;110A 1170 11A9;C49E;110A 1170 11A9; # (쒞; 쒞; 쒞; 쒞; 쒞; ) HANGUL SYLLABLE SSWEGG +C49F;C49F;110A 1170 11AA;C49F;110A 1170 11AA; # (쒟; 쒟; 쒟; 쒟; 쒟; ) HANGUL SYLLABLE SSWEGS +C4A0;C4A0;110A 1170 11AB;C4A0;110A 1170 11AB; # (쒠; 쒠; 쒠; 쒠; 쒠; ) HANGUL SYLLABLE SSWEN +C4A1;C4A1;110A 1170 11AC;C4A1;110A 1170 11AC; # (쒡; 쒡; 쒡; 쒡; 쒡; ) HANGUL SYLLABLE SSWENJ +C4A2;C4A2;110A 1170 11AD;C4A2;110A 1170 11AD; # (쒢; 쒢; 쒢; 쒢; 쒢; ) HANGUL SYLLABLE SSWENH +C4A3;C4A3;110A 1170 11AE;C4A3;110A 1170 11AE; # (쒣; 쒣; 쒣; 쒣; 쒣; ) HANGUL SYLLABLE SSWED +C4A4;C4A4;110A 1170 11AF;C4A4;110A 1170 11AF; # (쒤; 쒤; 쒤; 쒤; 쒤; ) HANGUL SYLLABLE SSWEL +C4A5;C4A5;110A 1170 11B0;C4A5;110A 1170 11B0; # (쒥; 쒥; 쒥; 쒥; 쒥; ) HANGUL SYLLABLE SSWELG +C4A6;C4A6;110A 1170 11B1;C4A6;110A 1170 11B1; # (쒦; 쒦; 쒦; 쒦; 쒦; ) HANGUL SYLLABLE SSWELM +C4A7;C4A7;110A 1170 11B2;C4A7;110A 1170 11B2; # (쒧; 쒧; 쒧; 쒧; 쒧; ) HANGUL SYLLABLE SSWELB +C4A8;C4A8;110A 1170 11B3;C4A8;110A 1170 11B3; # (쒨; 쒨; 쒨; 쒨; 쒨; ) HANGUL SYLLABLE SSWELS +C4A9;C4A9;110A 1170 11B4;C4A9;110A 1170 11B4; # (쒩; 쒩; 쒩; 쒩; 쒩; ) HANGUL SYLLABLE SSWELT +C4AA;C4AA;110A 1170 11B5;C4AA;110A 1170 11B5; # (쒪; 쒪; 쒪; 쒪; 쒪; ) HANGUL SYLLABLE SSWELP +C4AB;C4AB;110A 1170 11B6;C4AB;110A 1170 11B6; # (쒫; 쒫; 쒫; 쒫; 쒫; ) HANGUL SYLLABLE SSWELH +C4AC;C4AC;110A 1170 11B7;C4AC;110A 1170 11B7; # (쒬; 쒬; 쒬; 쒬; 쒬; ) HANGUL SYLLABLE SSWEM +C4AD;C4AD;110A 1170 11B8;C4AD;110A 1170 11B8; # (쒭; 쒭; 쒭; 쒭; 쒭; ) HANGUL SYLLABLE SSWEB +C4AE;C4AE;110A 1170 11B9;C4AE;110A 1170 11B9; # (쒮; 쒮; 쒮; 쒮; 쒮; ) HANGUL SYLLABLE SSWEBS +C4AF;C4AF;110A 1170 11BA;C4AF;110A 1170 11BA; # (쒯; 쒯; 쒯; 쒯; 쒯; ) HANGUL SYLLABLE SSWES +C4B0;C4B0;110A 1170 11BB;C4B0;110A 1170 11BB; # (쒰; 쒰; 쒰; 쒰; 쒰; ) HANGUL SYLLABLE SSWESS +C4B1;C4B1;110A 1170 11BC;C4B1;110A 1170 11BC; # (쒱; 쒱; 쒱; 쒱; 쒱; ) HANGUL SYLLABLE SSWENG +C4B2;C4B2;110A 1170 11BD;C4B2;110A 1170 11BD; # (쒲; 쒲; 쒲; 쒲; 쒲; ) HANGUL SYLLABLE SSWEJ +C4B3;C4B3;110A 1170 11BE;C4B3;110A 1170 11BE; # (쒳; 쒳; 쒳; 쒳; 쒳; ) HANGUL SYLLABLE SSWEC +C4B4;C4B4;110A 1170 11BF;C4B4;110A 1170 11BF; # (쒴; 쒴; 쒴; 쒴; 쒴; ) HANGUL SYLLABLE SSWEK +C4B5;C4B5;110A 1170 11C0;C4B5;110A 1170 11C0; # (쒵; 쒵; 쒵; 쒵; 쒵; ) HANGUL SYLLABLE SSWET +C4B6;C4B6;110A 1170 11C1;C4B6;110A 1170 11C1; # (쒶; 쒶; 쒶; 쒶; 쒶; ) HANGUL SYLLABLE SSWEP +C4B7;C4B7;110A 1170 11C2;C4B7;110A 1170 11C2; # (쒷; 쒷; 쒷; 쒷; 쒷; ) HANGUL SYLLABLE SSWEH +C4B8;C4B8;110A 1171;C4B8;110A 1171; # (쒸; 쒸; 쒸; 쒸; 쒸; ) HANGUL SYLLABLE SSWI +C4B9;C4B9;110A 1171 11A8;C4B9;110A 1171 11A8; # (쒹; 쒹; 쒹; 쒹; 쒹; ) HANGUL SYLLABLE SSWIG +C4BA;C4BA;110A 1171 11A9;C4BA;110A 1171 11A9; # (쒺; 쒺; 쒺; 쒺; 쒺; ) HANGUL SYLLABLE SSWIGG +C4BB;C4BB;110A 1171 11AA;C4BB;110A 1171 11AA; # (쒻; 쒻; 쒻; 쒻; 쒻; ) HANGUL SYLLABLE SSWIGS +C4BC;C4BC;110A 1171 11AB;C4BC;110A 1171 11AB; # (쒼; 쒼; 쒼; 쒼; 쒼; ) HANGUL SYLLABLE SSWIN +C4BD;C4BD;110A 1171 11AC;C4BD;110A 1171 11AC; # (쒽; 쒽; 쒽; 쒽; 쒽; ) HANGUL SYLLABLE SSWINJ +C4BE;C4BE;110A 1171 11AD;C4BE;110A 1171 11AD; # (쒾; 쒾; 쒾; 쒾; 쒾; ) HANGUL SYLLABLE SSWINH +C4BF;C4BF;110A 1171 11AE;C4BF;110A 1171 11AE; # (쒿; 쒿; 쒿; 쒿; 쒿; ) HANGUL SYLLABLE SSWID +C4C0;C4C0;110A 1171 11AF;C4C0;110A 1171 11AF; # (쓀; 쓀; 쓀; 쓀; 쓀; ) HANGUL SYLLABLE SSWIL +C4C1;C4C1;110A 1171 11B0;C4C1;110A 1171 11B0; # (쓁; 쓁; 쓁; 쓁; 쓁; ) HANGUL SYLLABLE SSWILG +C4C2;C4C2;110A 1171 11B1;C4C2;110A 1171 11B1; # (쓂; 쓂; 쓂; 쓂; 쓂; ) HANGUL SYLLABLE SSWILM +C4C3;C4C3;110A 1171 11B2;C4C3;110A 1171 11B2; # (쓃; 쓃; 쓃; 쓃; 쓃; ) HANGUL SYLLABLE SSWILB +C4C4;C4C4;110A 1171 11B3;C4C4;110A 1171 11B3; # (쓄; 쓄; 쓄; 쓄; 쓄; ) HANGUL SYLLABLE SSWILS +C4C5;C4C5;110A 1171 11B4;C4C5;110A 1171 11B4; # (쓅; 쓅; 쓅; 쓅; 쓅; ) HANGUL SYLLABLE SSWILT +C4C6;C4C6;110A 1171 11B5;C4C6;110A 1171 11B5; # (쓆; 쓆; 쓆; 쓆; 쓆; ) HANGUL SYLLABLE SSWILP +C4C7;C4C7;110A 1171 11B6;C4C7;110A 1171 11B6; # (쓇; 쓇; 쓇; 쓇; 쓇; ) HANGUL SYLLABLE SSWILH +C4C8;C4C8;110A 1171 11B7;C4C8;110A 1171 11B7; # (쓈; 쓈; 쓈; 쓈; 쓈; ) HANGUL SYLLABLE SSWIM +C4C9;C4C9;110A 1171 11B8;C4C9;110A 1171 11B8; # (쓉; 쓉; 쓉; 쓉; 쓉; ) HANGUL SYLLABLE SSWIB +C4CA;C4CA;110A 1171 11B9;C4CA;110A 1171 11B9; # (쓊; 쓊; 쓊; 쓊; 쓊; ) HANGUL SYLLABLE SSWIBS +C4CB;C4CB;110A 1171 11BA;C4CB;110A 1171 11BA; # (쓋; 쓋; 쓋; 쓋; 쓋; ) HANGUL SYLLABLE SSWIS +C4CC;C4CC;110A 1171 11BB;C4CC;110A 1171 11BB; # (쓌; 쓌; 쓌; 쓌; 쓌; ) HANGUL SYLLABLE SSWISS +C4CD;C4CD;110A 1171 11BC;C4CD;110A 1171 11BC; # (쓍; 쓍; 쓍; 쓍; 쓍; ) HANGUL SYLLABLE SSWING +C4CE;C4CE;110A 1171 11BD;C4CE;110A 1171 11BD; # (쓎; 쓎; 쓎; 쓎; 쓎; ) HANGUL SYLLABLE SSWIJ +C4CF;C4CF;110A 1171 11BE;C4CF;110A 1171 11BE; # (쓏; 쓏; 쓏; 쓏; 쓏; ) HANGUL SYLLABLE SSWIC +C4D0;C4D0;110A 1171 11BF;C4D0;110A 1171 11BF; # (쓐; 쓐; 쓐; 쓐; 쓐; ) HANGUL SYLLABLE SSWIK +C4D1;C4D1;110A 1171 11C0;C4D1;110A 1171 11C0; # (쓑; 쓑; 쓑; 쓑; 쓑; ) HANGUL SYLLABLE SSWIT +C4D2;C4D2;110A 1171 11C1;C4D2;110A 1171 11C1; # (쓒; 쓒; 쓒; 쓒; 쓒; ) HANGUL SYLLABLE SSWIP +C4D3;C4D3;110A 1171 11C2;C4D3;110A 1171 11C2; # (쓓; 쓓; 쓓; 쓓; 쓓; ) HANGUL SYLLABLE SSWIH +C4D4;C4D4;110A 1172;C4D4;110A 1172; # (쓔; 쓔; 쓔; 쓔; 쓔; ) HANGUL SYLLABLE SSYU +C4D5;C4D5;110A 1172 11A8;C4D5;110A 1172 11A8; # (쓕; 쓕; 쓕; 쓕; 쓕; ) HANGUL SYLLABLE SSYUG +C4D6;C4D6;110A 1172 11A9;C4D6;110A 1172 11A9; # (쓖; 쓖; 쓖; 쓖; 쓖; ) HANGUL SYLLABLE SSYUGG +C4D7;C4D7;110A 1172 11AA;C4D7;110A 1172 11AA; # (쓗; 쓗; 쓗; 쓗; 쓗; ) HANGUL SYLLABLE SSYUGS +C4D8;C4D8;110A 1172 11AB;C4D8;110A 1172 11AB; # (쓘; 쓘; 쓘; 쓘; 쓘; ) HANGUL SYLLABLE SSYUN +C4D9;C4D9;110A 1172 11AC;C4D9;110A 1172 11AC; # (쓙; 쓙; 쓙; 쓙; 쓙; ) HANGUL SYLLABLE SSYUNJ +C4DA;C4DA;110A 1172 11AD;C4DA;110A 1172 11AD; # (쓚; 쓚; 쓚; 쓚; 쓚; ) HANGUL SYLLABLE SSYUNH +C4DB;C4DB;110A 1172 11AE;C4DB;110A 1172 11AE; # (쓛; 쓛; 쓛; 쓛; 쓛; ) HANGUL SYLLABLE SSYUD +C4DC;C4DC;110A 1172 11AF;C4DC;110A 1172 11AF; # (쓜; 쓜; 쓜; 쓜; 쓜; ) HANGUL SYLLABLE SSYUL +C4DD;C4DD;110A 1172 11B0;C4DD;110A 1172 11B0; # (쓝; 쓝; 쓝; 쓝; 쓝; ) HANGUL SYLLABLE SSYULG +C4DE;C4DE;110A 1172 11B1;C4DE;110A 1172 11B1; # (쓞; 쓞; 쓞; 쓞; 쓞; ) HANGUL SYLLABLE SSYULM +C4DF;C4DF;110A 1172 11B2;C4DF;110A 1172 11B2; # (쓟; 쓟; 쓟; 쓟; 쓟; ) HANGUL SYLLABLE SSYULB +C4E0;C4E0;110A 1172 11B3;C4E0;110A 1172 11B3; # (쓠; 쓠; 쓠; 쓠; 쓠; ) HANGUL SYLLABLE SSYULS +C4E1;C4E1;110A 1172 11B4;C4E1;110A 1172 11B4; # (쓡; 쓡; 쓡; 쓡; 쓡; ) HANGUL SYLLABLE SSYULT +C4E2;C4E2;110A 1172 11B5;C4E2;110A 1172 11B5; # (쓢; 쓢; 쓢; 쓢; 쓢; ) HANGUL SYLLABLE SSYULP +C4E3;C4E3;110A 1172 11B6;C4E3;110A 1172 11B6; # (쓣; 쓣; 쓣; 쓣; 쓣; ) HANGUL SYLLABLE SSYULH +C4E4;C4E4;110A 1172 11B7;C4E4;110A 1172 11B7; # (쓤; 쓤; 쓤; 쓤; 쓤; ) HANGUL SYLLABLE SSYUM +C4E5;C4E5;110A 1172 11B8;C4E5;110A 1172 11B8; # (쓥; 쓥; 쓥; 쓥; 쓥; ) HANGUL SYLLABLE SSYUB +C4E6;C4E6;110A 1172 11B9;C4E6;110A 1172 11B9; # (쓦; 쓦; 쓦; 쓦; 쓦; ) HANGUL SYLLABLE SSYUBS +C4E7;C4E7;110A 1172 11BA;C4E7;110A 1172 11BA; # (쓧; 쓧; 쓧; 쓧; 쓧; ) HANGUL SYLLABLE SSYUS +C4E8;C4E8;110A 1172 11BB;C4E8;110A 1172 11BB; # (쓨; 쓨; 쓨; 쓨; 쓨; ) HANGUL SYLLABLE SSYUSS +C4E9;C4E9;110A 1172 11BC;C4E9;110A 1172 11BC; # (쓩; 쓩; 쓩; 쓩; 쓩; ) HANGUL SYLLABLE SSYUNG +C4EA;C4EA;110A 1172 11BD;C4EA;110A 1172 11BD; # (쓪; 쓪; 쓪; 쓪; 쓪; ) HANGUL SYLLABLE SSYUJ +C4EB;C4EB;110A 1172 11BE;C4EB;110A 1172 11BE; # (쓫; 쓫; 쓫; 쓫; 쓫; ) HANGUL SYLLABLE SSYUC +C4EC;C4EC;110A 1172 11BF;C4EC;110A 1172 11BF; # (쓬; 쓬; 쓬; 쓬; 쓬; ) HANGUL SYLLABLE SSYUK +C4ED;C4ED;110A 1172 11C0;C4ED;110A 1172 11C0; # (쓭; 쓭; 쓭; 쓭; 쓭; ) HANGUL SYLLABLE SSYUT +C4EE;C4EE;110A 1172 11C1;C4EE;110A 1172 11C1; # (쓮; 쓮; 쓮; 쓮; 쓮; ) HANGUL SYLLABLE SSYUP +C4EF;C4EF;110A 1172 11C2;C4EF;110A 1172 11C2; # (쓯; 쓯; 쓯; 쓯; 쓯; ) HANGUL SYLLABLE SSYUH +C4F0;C4F0;110A 1173;C4F0;110A 1173; # (쓰; 쓰; 쓰; 쓰; 쓰; ) HANGUL SYLLABLE SSEU +C4F1;C4F1;110A 1173 11A8;C4F1;110A 1173 11A8; # (쓱; 쓱; 쓱; 쓱; 쓱; ) HANGUL SYLLABLE SSEUG +C4F2;C4F2;110A 1173 11A9;C4F2;110A 1173 11A9; # (쓲; 쓲; 쓲; 쓲; 쓲; ) HANGUL SYLLABLE SSEUGG +C4F3;C4F3;110A 1173 11AA;C4F3;110A 1173 11AA; # (쓳; 쓳; 쓳; 쓳; 쓳; ) HANGUL SYLLABLE SSEUGS +C4F4;C4F4;110A 1173 11AB;C4F4;110A 1173 11AB; # (쓴; 쓴; 쓴; 쓴; 쓴; ) HANGUL SYLLABLE SSEUN +C4F5;C4F5;110A 1173 11AC;C4F5;110A 1173 11AC; # (쓵; 쓵; 쓵; 쓵; 쓵; ) HANGUL SYLLABLE SSEUNJ +C4F6;C4F6;110A 1173 11AD;C4F6;110A 1173 11AD; # (쓶; 쓶; 쓶; 쓶; 쓶; ) HANGUL SYLLABLE SSEUNH +C4F7;C4F7;110A 1173 11AE;C4F7;110A 1173 11AE; # (쓷; 쓷; 쓷; 쓷; 쓷; ) HANGUL SYLLABLE SSEUD +C4F8;C4F8;110A 1173 11AF;C4F8;110A 1173 11AF; # (쓸; 쓸; 쓸; 쓸; 쓸; ) HANGUL SYLLABLE SSEUL +C4F9;C4F9;110A 1173 11B0;C4F9;110A 1173 11B0; # (쓹; 쓹; 쓹; 쓹; 쓹; ) HANGUL SYLLABLE SSEULG +C4FA;C4FA;110A 1173 11B1;C4FA;110A 1173 11B1; # (쓺; 쓺; 쓺; 쓺; 쓺; ) HANGUL SYLLABLE SSEULM +C4FB;C4FB;110A 1173 11B2;C4FB;110A 1173 11B2; # (쓻; 쓻; 쓻; 쓻; 쓻; ) HANGUL SYLLABLE SSEULB +C4FC;C4FC;110A 1173 11B3;C4FC;110A 1173 11B3; # (쓼; 쓼; 쓼; 쓼; 쓼; ) HANGUL SYLLABLE SSEULS +C4FD;C4FD;110A 1173 11B4;C4FD;110A 1173 11B4; # (쓽; 쓽; 쓽; 쓽; 쓽; ) HANGUL SYLLABLE SSEULT +C4FE;C4FE;110A 1173 11B5;C4FE;110A 1173 11B5; # (쓾; 쓾; 쓾; 쓾; 쓾; ) HANGUL SYLLABLE SSEULP +C4FF;C4FF;110A 1173 11B6;C4FF;110A 1173 11B6; # (쓿; 쓿; 쓿; 쓿; 쓿; ) HANGUL SYLLABLE SSEULH +C500;C500;110A 1173 11B7;C500;110A 1173 11B7; # (씀; 씀; 씀; 씀; 씀; ) HANGUL SYLLABLE SSEUM +C501;C501;110A 1173 11B8;C501;110A 1173 11B8; # (씁; 씁; 씁; 씁; 씁; ) HANGUL SYLLABLE SSEUB +C502;C502;110A 1173 11B9;C502;110A 1173 11B9; # (씂; 씂; 씂; 씂; 씂; ) HANGUL SYLLABLE SSEUBS +C503;C503;110A 1173 11BA;C503;110A 1173 11BA; # (씃; 씃; 씃; 씃; 씃; ) HANGUL SYLLABLE SSEUS +C504;C504;110A 1173 11BB;C504;110A 1173 11BB; # (씄; 씄; 씄; 씄; 씄; ) HANGUL SYLLABLE SSEUSS +C505;C505;110A 1173 11BC;C505;110A 1173 11BC; # (씅; 씅; 씅; 씅; 씅; ) HANGUL SYLLABLE SSEUNG +C506;C506;110A 1173 11BD;C506;110A 1173 11BD; # (씆; 씆; 씆; 씆; 씆; ) HANGUL SYLLABLE SSEUJ +C507;C507;110A 1173 11BE;C507;110A 1173 11BE; # (씇; 씇; 씇; 씇; 씇; ) HANGUL SYLLABLE SSEUC +C508;C508;110A 1173 11BF;C508;110A 1173 11BF; # (씈; 씈; 씈; 씈; 씈; ) HANGUL SYLLABLE SSEUK +C509;C509;110A 1173 11C0;C509;110A 1173 11C0; # (씉; 씉; 씉; 씉; 씉; ) HANGUL SYLLABLE SSEUT +C50A;C50A;110A 1173 11C1;C50A;110A 1173 11C1; # (씊; 씊; 씊; 씊; 씊; ) HANGUL SYLLABLE SSEUP +C50B;C50B;110A 1173 11C2;C50B;110A 1173 11C2; # (씋; 씋; 씋; 씋; 씋; ) HANGUL SYLLABLE SSEUH +C50C;C50C;110A 1174;C50C;110A 1174; # (씌; 씌; 씌; 씌; 씌; ) HANGUL SYLLABLE SSYI +C50D;C50D;110A 1174 11A8;C50D;110A 1174 11A8; # (씍; 씍; 씍; 씍; 씍; ) HANGUL SYLLABLE SSYIG +C50E;C50E;110A 1174 11A9;C50E;110A 1174 11A9; # (씎; 씎; 씎; 씎; 씎; ) HANGUL SYLLABLE SSYIGG +C50F;C50F;110A 1174 11AA;C50F;110A 1174 11AA; # (씏; 씏; 씏; 씏; 씏; ) HANGUL SYLLABLE SSYIGS +C510;C510;110A 1174 11AB;C510;110A 1174 11AB; # (씐; 씐; 씐; 씐; 씐; ) HANGUL SYLLABLE SSYIN +C511;C511;110A 1174 11AC;C511;110A 1174 11AC; # (씑; 씑; 씑; 씑; 씑; ) HANGUL SYLLABLE SSYINJ +C512;C512;110A 1174 11AD;C512;110A 1174 11AD; # (씒; 씒; 씒; 씒; 씒; ) HANGUL SYLLABLE SSYINH +C513;C513;110A 1174 11AE;C513;110A 1174 11AE; # (씓; 씓; 씓; 씓; 씓; ) HANGUL SYLLABLE SSYID +C514;C514;110A 1174 11AF;C514;110A 1174 11AF; # (씔; 씔; 씔; 씔; 씔; ) HANGUL SYLLABLE SSYIL +C515;C515;110A 1174 11B0;C515;110A 1174 11B0; # (씕; 씕; 씕; 씕; 씕; ) HANGUL SYLLABLE SSYILG +C516;C516;110A 1174 11B1;C516;110A 1174 11B1; # (씖; 씖; 씖; 씖; 씖; ) HANGUL SYLLABLE SSYILM +C517;C517;110A 1174 11B2;C517;110A 1174 11B2; # (씗; 씗; 씗; 씗; 씗; ) HANGUL SYLLABLE SSYILB +C518;C518;110A 1174 11B3;C518;110A 1174 11B3; # (씘; 씘; 씘; 씘; 씘; ) HANGUL SYLLABLE SSYILS +C519;C519;110A 1174 11B4;C519;110A 1174 11B4; # (씙; 씙; 씙; 씙; 씙; ) HANGUL SYLLABLE SSYILT +C51A;C51A;110A 1174 11B5;C51A;110A 1174 11B5; # (씚; 씚; 씚; 씚; 씚; ) HANGUL SYLLABLE SSYILP +C51B;C51B;110A 1174 11B6;C51B;110A 1174 11B6; # (씛; 씛; 씛; 씛; 씛; ) HANGUL SYLLABLE SSYILH +C51C;C51C;110A 1174 11B7;C51C;110A 1174 11B7; # (씜; 씜; 씜; 씜; 씜; ) HANGUL SYLLABLE SSYIM +C51D;C51D;110A 1174 11B8;C51D;110A 1174 11B8; # (씝; 씝; 씝; 씝; 씝; ) HANGUL SYLLABLE SSYIB +C51E;C51E;110A 1174 11B9;C51E;110A 1174 11B9; # (씞; 씞; 씞; 씞; 씞; ) HANGUL SYLLABLE SSYIBS +C51F;C51F;110A 1174 11BA;C51F;110A 1174 11BA; # (씟; 씟; 씟; 씟; 씟; ) HANGUL SYLLABLE SSYIS +C520;C520;110A 1174 11BB;C520;110A 1174 11BB; # (씠; 씠; 씠; 씠; 씠; ) HANGUL SYLLABLE SSYISS +C521;C521;110A 1174 11BC;C521;110A 1174 11BC; # (씡; 씡; 씡; 씡; 씡; ) HANGUL SYLLABLE SSYING +C522;C522;110A 1174 11BD;C522;110A 1174 11BD; # (씢; 씢; 씢; 씢; 씢; ) HANGUL SYLLABLE SSYIJ +C523;C523;110A 1174 11BE;C523;110A 1174 11BE; # (씣; 씣; 씣; 씣; 씣; ) HANGUL SYLLABLE SSYIC +C524;C524;110A 1174 11BF;C524;110A 1174 11BF; # (씤; 씤; 씤; 씤; 씤; ) HANGUL SYLLABLE SSYIK +C525;C525;110A 1174 11C0;C525;110A 1174 11C0; # (씥; 씥; 씥; 씥; 씥; ) HANGUL SYLLABLE SSYIT +C526;C526;110A 1174 11C1;C526;110A 1174 11C1; # (씦; 씦; 씦; 씦; 씦; ) HANGUL SYLLABLE SSYIP +C527;C527;110A 1174 11C2;C527;110A 1174 11C2; # (씧; 씧; 씧; 씧; 씧; ) HANGUL SYLLABLE SSYIH +C528;C528;110A 1175;C528;110A 1175; # (씨; 씨; 씨; 씨; 씨; ) HANGUL SYLLABLE SSI +C529;C529;110A 1175 11A8;C529;110A 1175 11A8; # (씩; 씩; 씩; 씩; 씩; ) HANGUL SYLLABLE SSIG +C52A;C52A;110A 1175 11A9;C52A;110A 1175 11A9; # (씪; 씪; 씪; 씪; 씪; ) HANGUL SYLLABLE SSIGG +C52B;C52B;110A 1175 11AA;C52B;110A 1175 11AA; # (씫; 씫; 씫; 씫; 씫; ) HANGUL SYLLABLE SSIGS +C52C;C52C;110A 1175 11AB;C52C;110A 1175 11AB; # (씬; 씬; 씬; 씬; 씬; ) HANGUL SYLLABLE SSIN +C52D;C52D;110A 1175 11AC;C52D;110A 1175 11AC; # (씭; 씭; 씭; 씭; 씭; ) HANGUL SYLLABLE SSINJ +C52E;C52E;110A 1175 11AD;C52E;110A 1175 11AD; # (씮; 씮; 씮; 씮; 씮; ) HANGUL SYLLABLE SSINH +C52F;C52F;110A 1175 11AE;C52F;110A 1175 11AE; # (씯; 씯; 씯; 씯; 씯; ) HANGUL SYLLABLE SSID +C530;C530;110A 1175 11AF;C530;110A 1175 11AF; # (씰; 씰; 씰; 씰; 씰; ) HANGUL SYLLABLE SSIL +C531;C531;110A 1175 11B0;C531;110A 1175 11B0; # (씱; 씱; 씱; 씱; 씱; ) HANGUL SYLLABLE SSILG +C532;C532;110A 1175 11B1;C532;110A 1175 11B1; # (씲; 씲; 씲; 씲; 씲; ) HANGUL SYLLABLE SSILM +C533;C533;110A 1175 11B2;C533;110A 1175 11B2; # (씳; 씳; 씳; 씳; 씳; ) HANGUL SYLLABLE SSILB +C534;C534;110A 1175 11B3;C534;110A 1175 11B3; # (씴; 씴; 씴; 씴; 씴; ) HANGUL SYLLABLE SSILS +C535;C535;110A 1175 11B4;C535;110A 1175 11B4; # (씵; 씵; 씵; 씵; 씵; ) HANGUL SYLLABLE SSILT +C536;C536;110A 1175 11B5;C536;110A 1175 11B5; # (씶; 씶; 씶; 씶; 씶; ) HANGUL SYLLABLE SSILP +C537;C537;110A 1175 11B6;C537;110A 1175 11B6; # (씷; 씷; 씷; 씷; 씷; ) HANGUL SYLLABLE SSILH +C538;C538;110A 1175 11B7;C538;110A 1175 11B7; # (씸; 씸; 씸; 씸; 씸; ) HANGUL SYLLABLE SSIM +C539;C539;110A 1175 11B8;C539;110A 1175 11B8; # (씹; 씹; 씹; 씹; 씹; ) HANGUL SYLLABLE SSIB +C53A;C53A;110A 1175 11B9;C53A;110A 1175 11B9; # (씺; 씺; 씺; 씺; 씺; ) HANGUL SYLLABLE SSIBS +C53B;C53B;110A 1175 11BA;C53B;110A 1175 11BA; # (씻; 씻; 씻; 씻; 씻; ) HANGUL SYLLABLE SSIS +C53C;C53C;110A 1175 11BB;C53C;110A 1175 11BB; # (씼; 씼; 씼; 씼; 씼; ) HANGUL SYLLABLE SSISS +C53D;C53D;110A 1175 11BC;C53D;110A 1175 11BC; # (씽; 씽; 씽; 씽; 씽; ) HANGUL SYLLABLE SSING +C53E;C53E;110A 1175 11BD;C53E;110A 1175 11BD; # (씾; 씾; 씾; 씾; 씾; ) HANGUL SYLLABLE SSIJ +C53F;C53F;110A 1175 11BE;C53F;110A 1175 11BE; # (씿; 씿; 씿; 씿; 씿; ) HANGUL SYLLABLE SSIC +C540;C540;110A 1175 11BF;C540;110A 1175 11BF; # (앀; 앀; 앀; 앀; 앀; ) HANGUL SYLLABLE SSIK +C541;C541;110A 1175 11C0;C541;110A 1175 11C0; # (앁; 앁; 앁; 앁; 앁; ) HANGUL SYLLABLE SSIT +C542;C542;110A 1175 11C1;C542;110A 1175 11C1; # (앂; 앂; 앂; 앂; 앂; ) HANGUL SYLLABLE SSIP +C543;C543;110A 1175 11C2;C543;110A 1175 11C2; # (앃; 앃; 앃; 앃; 앃; ) HANGUL SYLLABLE SSIH +C544;C544;110B 1161;C544;110B 1161; # (아; 아; 아; 아; 아; ) HANGUL SYLLABLE A +C545;C545;110B 1161 11A8;C545;110B 1161 11A8; # (악; 악; 악; 악; 악; ) HANGUL SYLLABLE AG +C546;C546;110B 1161 11A9;C546;110B 1161 11A9; # (앆; 앆; 앆; 앆; 앆; ) HANGUL SYLLABLE AGG +C547;C547;110B 1161 11AA;C547;110B 1161 11AA; # (앇; 앇; 앇; 앇; 앇; ) HANGUL SYLLABLE AGS +C548;C548;110B 1161 11AB;C548;110B 1161 11AB; # (안; 안; 안; 안; 안; ) HANGUL SYLLABLE AN +C549;C549;110B 1161 11AC;C549;110B 1161 11AC; # (앉; 앉; 앉; 앉; 앉; ) HANGUL SYLLABLE ANJ +C54A;C54A;110B 1161 11AD;C54A;110B 1161 11AD; # (않; 않; 않; 않; 않; ) HANGUL SYLLABLE ANH +C54B;C54B;110B 1161 11AE;C54B;110B 1161 11AE; # (앋; 앋; 앋; 앋; 앋; ) HANGUL SYLLABLE AD +C54C;C54C;110B 1161 11AF;C54C;110B 1161 11AF; # (알; 알; 알; 알; 알; ) HANGUL SYLLABLE AL +C54D;C54D;110B 1161 11B0;C54D;110B 1161 11B0; # (앍; 앍; 앍; 앍; 앍; ) HANGUL SYLLABLE ALG +C54E;C54E;110B 1161 11B1;C54E;110B 1161 11B1; # (앎; 앎; 앎; 앎; 앎; ) HANGUL SYLLABLE ALM +C54F;C54F;110B 1161 11B2;C54F;110B 1161 11B2; # (앏; 앏; 앏; 앏; 앏; ) HANGUL SYLLABLE ALB +C550;C550;110B 1161 11B3;C550;110B 1161 11B3; # (앐; 앐; 앐; 앐; 앐; ) HANGUL SYLLABLE ALS +C551;C551;110B 1161 11B4;C551;110B 1161 11B4; # (앑; 앑; 앑; 앑; 앑; ) HANGUL SYLLABLE ALT +C552;C552;110B 1161 11B5;C552;110B 1161 11B5; # (앒; 앒; 앒; 앒; 앒; ) HANGUL SYLLABLE ALP +C553;C553;110B 1161 11B6;C553;110B 1161 11B6; # (앓; 앓; 앓; 앓; 앓; ) HANGUL SYLLABLE ALH +C554;C554;110B 1161 11B7;C554;110B 1161 11B7; # (암; 암; 암; 암; 암; ) HANGUL SYLLABLE AM +C555;C555;110B 1161 11B8;C555;110B 1161 11B8; # (압; 압; 압; 압; 압; ) HANGUL SYLLABLE AB +C556;C556;110B 1161 11B9;C556;110B 1161 11B9; # (앖; 앖; 앖; 앖; 앖; ) HANGUL SYLLABLE ABS +C557;C557;110B 1161 11BA;C557;110B 1161 11BA; # (앗; 앗; 앗; 앗; 앗; ) HANGUL SYLLABLE AS +C558;C558;110B 1161 11BB;C558;110B 1161 11BB; # (았; 았; 았; 았; 았; ) HANGUL SYLLABLE ASS +C559;C559;110B 1161 11BC;C559;110B 1161 11BC; # (앙; 앙; 앙; 앙; 앙; ) HANGUL SYLLABLE ANG +C55A;C55A;110B 1161 11BD;C55A;110B 1161 11BD; # (앚; 앚; 앚; 앚; 앚; ) HANGUL SYLLABLE AJ +C55B;C55B;110B 1161 11BE;C55B;110B 1161 11BE; # (앛; 앛; 앛; 앛; 앛; ) HANGUL SYLLABLE AC +C55C;C55C;110B 1161 11BF;C55C;110B 1161 11BF; # (앜; 앜; 앜; 앜; 앜; ) HANGUL SYLLABLE AK +C55D;C55D;110B 1161 11C0;C55D;110B 1161 11C0; # (앝; 앝; 앝; 앝; 앝; ) HANGUL SYLLABLE AT +C55E;C55E;110B 1161 11C1;C55E;110B 1161 11C1; # (앞; 앞; 앞; 앞; 앞; ) HANGUL SYLLABLE AP +C55F;C55F;110B 1161 11C2;C55F;110B 1161 11C2; # (앟; 앟; 앟; 앟; 앟; ) HANGUL SYLLABLE AH +C560;C560;110B 1162;C560;110B 1162; # (애; 애; 애; 애; 애; ) HANGUL SYLLABLE AE +C561;C561;110B 1162 11A8;C561;110B 1162 11A8; # (액; 액; 액; 액; 액; ) HANGUL SYLLABLE AEG +C562;C562;110B 1162 11A9;C562;110B 1162 11A9; # (앢; 앢; 앢; 앢; 앢; ) HANGUL SYLLABLE AEGG +C563;C563;110B 1162 11AA;C563;110B 1162 11AA; # (앣; 앣; 앣; 앣; 앣; ) HANGUL SYLLABLE AEGS +C564;C564;110B 1162 11AB;C564;110B 1162 11AB; # (앤; 앤; 앤; 앤; 앤; ) HANGUL SYLLABLE AEN +C565;C565;110B 1162 11AC;C565;110B 1162 11AC; # (앥; 앥; 앥; 앥; 앥; ) HANGUL SYLLABLE AENJ +C566;C566;110B 1162 11AD;C566;110B 1162 11AD; # (앦; 앦; 앦; 앦; 앦; ) HANGUL SYLLABLE AENH +C567;C567;110B 1162 11AE;C567;110B 1162 11AE; # (앧; 앧; 앧; 앧; 앧; ) HANGUL SYLLABLE AED +C568;C568;110B 1162 11AF;C568;110B 1162 11AF; # (앨; 앨; 앨; 앨; 앨; ) HANGUL SYLLABLE AEL +C569;C569;110B 1162 11B0;C569;110B 1162 11B0; # (앩; 앩; 앩; 앩; 앩; ) HANGUL SYLLABLE AELG +C56A;C56A;110B 1162 11B1;C56A;110B 1162 11B1; # (앪; 앪; 앪; 앪; 앪; ) HANGUL SYLLABLE AELM +C56B;C56B;110B 1162 11B2;C56B;110B 1162 11B2; # (앫; 앫; 앫; 앫; 앫; ) HANGUL SYLLABLE AELB +C56C;C56C;110B 1162 11B3;C56C;110B 1162 11B3; # (앬; 앬; 앬; 앬; 앬; ) HANGUL SYLLABLE AELS +C56D;C56D;110B 1162 11B4;C56D;110B 1162 11B4; # (앭; 앭; 앭; 앭; 앭; ) HANGUL SYLLABLE AELT +C56E;C56E;110B 1162 11B5;C56E;110B 1162 11B5; # (앮; 앮; 앮; 앮; 앮; ) HANGUL SYLLABLE AELP +C56F;C56F;110B 1162 11B6;C56F;110B 1162 11B6; # (앯; 앯; 앯; 앯; 앯; ) HANGUL SYLLABLE AELH +C570;C570;110B 1162 11B7;C570;110B 1162 11B7; # (앰; 앰; 앰; 앰; 앰; ) HANGUL SYLLABLE AEM +C571;C571;110B 1162 11B8;C571;110B 1162 11B8; # (앱; 앱; 앱; 앱; 앱; ) HANGUL SYLLABLE AEB +C572;C572;110B 1162 11B9;C572;110B 1162 11B9; # (앲; 앲; 앲; 앲; 앲; ) HANGUL SYLLABLE AEBS +C573;C573;110B 1162 11BA;C573;110B 1162 11BA; # (앳; 앳; 앳; 앳; 앳; ) HANGUL SYLLABLE AES +C574;C574;110B 1162 11BB;C574;110B 1162 11BB; # (앴; 앴; 앴; 앴; 앴; ) HANGUL SYLLABLE AESS +C575;C575;110B 1162 11BC;C575;110B 1162 11BC; # (앵; 앵; 앵; 앵; 앵; ) HANGUL SYLLABLE AENG +C576;C576;110B 1162 11BD;C576;110B 1162 11BD; # (앶; 앶; 앶; 앶; 앶; ) HANGUL SYLLABLE AEJ +C577;C577;110B 1162 11BE;C577;110B 1162 11BE; # (앷; 앷; 앷; 앷; 앷; ) HANGUL SYLLABLE AEC +C578;C578;110B 1162 11BF;C578;110B 1162 11BF; # (앸; 앸; 앸; 앸; 앸; ) HANGUL SYLLABLE AEK +C579;C579;110B 1162 11C0;C579;110B 1162 11C0; # (앹; 앹; 앹; 앹; 앹; ) HANGUL SYLLABLE AET +C57A;C57A;110B 1162 11C1;C57A;110B 1162 11C1; # (앺; 앺; 앺; 앺; 앺; ) HANGUL SYLLABLE AEP +C57B;C57B;110B 1162 11C2;C57B;110B 1162 11C2; # (앻; 앻; 앻; 앻; 앻; ) HANGUL SYLLABLE AEH +C57C;C57C;110B 1163;C57C;110B 1163; # (야; 야; 야; 야; 야; ) HANGUL SYLLABLE YA +C57D;C57D;110B 1163 11A8;C57D;110B 1163 11A8; # (약; 약; 약; 약; 약; ) HANGUL SYLLABLE YAG +C57E;C57E;110B 1163 11A9;C57E;110B 1163 11A9; # (앾; 앾; 앾; 앾; 앾; ) HANGUL SYLLABLE YAGG +C57F;C57F;110B 1163 11AA;C57F;110B 1163 11AA; # (앿; 앿; 앿; 앿; 앿; ) HANGUL SYLLABLE YAGS +C580;C580;110B 1163 11AB;C580;110B 1163 11AB; # (얀; 얀; 얀; 얀; 얀; ) HANGUL SYLLABLE YAN +C581;C581;110B 1163 11AC;C581;110B 1163 11AC; # (얁; 얁; 얁; 얁; 얁; ) HANGUL SYLLABLE YANJ +C582;C582;110B 1163 11AD;C582;110B 1163 11AD; # (얂; 얂; 얂; 얂; 얂; ) HANGUL SYLLABLE YANH +C583;C583;110B 1163 11AE;C583;110B 1163 11AE; # (얃; 얃; 얃; 얃; 얃; ) HANGUL SYLLABLE YAD +C584;C584;110B 1163 11AF;C584;110B 1163 11AF; # (얄; 얄; 얄; 얄; 얄; ) HANGUL SYLLABLE YAL +C585;C585;110B 1163 11B0;C585;110B 1163 11B0; # (얅; 얅; 얅; 얅; 얅; ) HANGUL SYLLABLE YALG +C586;C586;110B 1163 11B1;C586;110B 1163 11B1; # (얆; 얆; 얆; 얆; 얆; ) HANGUL SYLLABLE YALM +C587;C587;110B 1163 11B2;C587;110B 1163 11B2; # (얇; 얇; 얇; 얇; 얇; ) HANGUL SYLLABLE YALB +C588;C588;110B 1163 11B3;C588;110B 1163 11B3; # (얈; 얈; 얈; 얈; 얈; ) HANGUL SYLLABLE YALS +C589;C589;110B 1163 11B4;C589;110B 1163 11B4; # (얉; 얉; 얉; 얉; 얉; ) HANGUL SYLLABLE YALT +C58A;C58A;110B 1163 11B5;C58A;110B 1163 11B5; # (얊; 얊; 얊; 얊; 얊; ) HANGUL SYLLABLE YALP +C58B;C58B;110B 1163 11B6;C58B;110B 1163 11B6; # (얋; 얋; 얋; 얋; 얋; ) HANGUL SYLLABLE YALH +C58C;C58C;110B 1163 11B7;C58C;110B 1163 11B7; # (얌; 얌; 얌; 얌; 얌; ) HANGUL SYLLABLE YAM +C58D;C58D;110B 1163 11B8;C58D;110B 1163 11B8; # (얍; 얍; 얍; 얍; 얍; ) HANGUL SYLLABLE YAB +C58E;C58E;110B 1163 11B9;C58E;110B 1163 11B9; # (얎; 얎; 얎; 얎; 얎; ) HANGUL SYLLABLE YABS +C58F;C58F;110B 1163 11BA;C58F;110B 1163 11BA; # (얏; 얏; 얏; 얏; 얏; ) HANGUL SYLLABLE YAS +C590;C590;110B 1163 11BB;C590;110B 1163 11BB; # (얐; 얐; 얐; 얐; 얐; ) HANGUL SYLLABLE YASS +C591;C591;110B 1163 11BC;C591;110B 1163 11BC; # (양; 양; 양; 양; 양; ) HANGUL SYLLABLE YANG +C592;C592;110B 1163 11BD;C592;110B 1163 11BD; # (얒; 얒; 얒; 얒; 얒; ) HANGUL SYLLABLE YAJ +C593;C593;110B 1163 11BE;C593;110B 1163 11BE; # (얓; 얓; 얓; 얓; 얓; ) HANGUL SYLLABLE YAC +C594;C594;110B 1163 11BF;C594;110B 1163 11BF; # (얔; 얔; 얔; 얔; 얔; ) HANGUL SYLLABLE YAK +C595;C595;110B 1163 11C0;C595;110B 1163 11C0; # (얕; 얕; 얕; 얕; 얕; ) HANGUL SYLLABLE YAT +C596;C596;110B 1163 11C1;C596;110B 1163 11C1; # (얖; 얖; 얖; 얖; 얖; ) HANGUL SYLLABLE YAP +C597;C597;110B 1163 11C2;C597;110B 1163 11C2; # (얗; 얗; 얗; 얗; 얗; ) HANGUL SYLLABLE YAH +C598;C598;110B 1164;C598;110B 1164; # (얘; 얘; 얘; 얘; 얘; ) HANGUL SYLLABLE YAE +C599;C599;110B 1164 11A8;C599;110B 1164 11A8; # (얙; 얙; 얙; 얙; 얙; ) HANGUL SYLLABLE YAEG +C59A;C59A;110B 1164 11A9;C59A;110B 1164 11A9; # (얚; 얚; 얚; 얚; 얚; ) HANGUL SYLLABLE YAEGG +C59B;C59B;110B 1164 11AA;C59B;110B 1164 11AA; # (얛; 얛; 얛; 얛; 얛; ) HANGUL SYLLABLE YAEGS +C59C;C59C;110B 1164 11AB;C59C;110B 1164 11AB; # (얜; 얜; 얜; 얜; 얜; ) HANGUL SYLLABLE YAEN +C59D;C59D;110B 1164 11AC;C59D;110B 1164 11AC; # (얝; 얝; 얝; 얝; 얝; ) HANGUL SYLLABLE YAENJ +C59E;C59E;110B 1164 11AD;C59E;110B 1164 11AD; # (얞; 얞; 얞; 얞; 얞; ) HANGUL SYLLABLE YAENH +C59F;C59F;110B 1164 11AE;C59F;110B 1164 11AE; # (얟; 얟; 얟; 얟; 얟; ) HANGUL SYLLABLE YAED +C5A0;C5A0;110B 1164 11AF;C5A0;110B 1164 11AF; # (얠; 얠; 얠; 얠; 얠; ) HANGUL SYLLABLE YAEL +C5A1;C5A1;110B 1164 11B0;C5A1;110B 1164 11B0; # (얡; 얡; 얡; 얡; 얡; ) HANGUL SYLLABLE YAELG +C5A2;C5A2;110B 1164 11B1;C5A2;110B 1164 11B1; # (얢; 얢; 얢; 얢; 얢; ) HANGUL SYLLABLE YAELM +C5A3;C5A3;110B 1164 11B2;C5A3;110B 1164 11B2; # (얣; 얣; 얣; 얣; 얣; ) HANGUL SYLLABLE YAELB +C5A4;C5A4;110B 1164 11B3;C5A4;110B 1164 11B3; # (얤; 얤; 얤; 얤; 얤; ) HANGUL SYLLABLE YAELS +C5A5;C5A5;110B 1164 11B4;C5A5;110B 1164 11B4; # (얥; 얥; 얥; 얥; 얥; ) HANGUL SYLLABLE YAELT +C5A6;C5A6;110B 1164 11B5;C5A6;110B 1164 11B5; # (얦; 얦; 얦; 얦; 얦; ) HANGUL SYLLABLE YAELP +C5A7;C5A7;110B 1164 11B6;C5A7;110B 1164 11B6; # (얧; 얧; 얧; 얧; 얧; ) HANGUL SYLLABLE YAELH +C5A8;C5A8;110B 1164 11B7;C5A8;110B 1164 11B7; # (얨; 얨; 얨; 얨; 얨; ) HANGUL SYLLABLE YAEM +C5A9;C5A9;110B 1164 11B8;C5A9;110B 1164 11B8; # (얩; 얩; 얩; 얩; 얩; ) HANGUL SYLLABLE YAEB +C5AA;C5AA;110B 1164 11B9;C5AA;110B 1164 11B9; # (얪; 얪; 얪; 얪; 얪; ) HANGUL SYLLABLE YAEBS +C5AB;C5AB;110B 1164 11BA;C5AB;110B 1164 11BA; # (얫; 얫; 얫; 얫; 얫; ) HANGUL SYLLABLE YAES +C5AC;C5AC;110B 1164 11BB;C5AC;110B 1164 11BB; # (얬; 얬; 얬; 얬; 얬; ) HANGUL SYLLABLE YAESS +C5AD;C5AD;110B 1164 11BC;C5AD;110B 1164 11BC; # (얭; 얭; 얭; 얭; 얭; ) HANGUL SYLLABLE YAENG +C5AE;C5AE;110B 1164 11BD;C5AE;110B 1164 11BD; # (얮; 얮; 얮; 얮; 얮; ) HANGUL SYLLABLE YAEJ +C5AF;C5AF;110B 1164 11BE;C5AF;110B 1164 11BE; # (얯; 얯; 얯; 얯; 얯; ) HANGUL SYLLABLE YAEC +C5B0;C5B0;110B 1164 11BF;C5B0;110B 1164 11BF; # (얰; 얰; 얰; 얰; 얰; ) HANGUL SYLLABLE YAEK +C5B1;C5B1;110B 1164 11C0;C5B1;110B 1164 11C0; # (얱; 얱; 얱; 얱; 얱; ) HANGUL SYLLABLE YAET +C5B2;C5B2;110B 1164 11C1;C5B2;110B 1164 11C1; # (얲; 얲; 얲; 얲; 얲; ) HANGUL SYLLABLE YAEP +C5B3;C5B3;110B 1164 11C2;C5B3;110B 1164 11C2; # (얳; 얳; 얳; 얳; 얳; ) HANGUL SYLLABLE YAEH +C5B4;C5B4;110B 1165;C5B4;110B 1165; # (어; 어; 어; 어; 어; ) HANGUL SYLLABLE EO +C5B5;C5B5;110B 1165 11A8;C5B5;110B 1165 11A8; # (억; 억; 억; 억; 억; ) HANGUL SYLLABLE EOG +C5B6;C5B6;110B 1165 11A9;C5B6;110B 1165 11A9; # (얶; 얶; 얶; 얶; 얶; ) HANGUL SYLLABLE EOGG +C5B7;C5B7;110B 1165 11AA;C5B7;110B 1165 11AA; # (얷; 얷; 얷; 얷; 얷; ) HANGUL SYLLABLE EOGS +C5B8;C5B8;110B 1165 11AB;C5B8;110B 1165 11AB; # (언; 언; 언; 언; 언; ) HANGUL SYLLABLE EON +C5B9;C5B9;110B 1165 11AC;C5B9;110B 1165 11AC; # (얹; 얹; 얹; 얹; 얹; ) HANGUL SYLLABLE EONJ +C5BA;C5BA;110B 1165 11AD;C5BA;110B 1165 11AD; # (얺; 얺; 얺; 얺; 얺; ) HANGUL SYLLABLE EONH +C5BB;C5BB;110B 1165 11AE;C5BB;110B 1165 11AE; # (얻; 얻; 얻; 얻; 얻; ) HANGUL SYLLABLE EOD +C5BC;C5BC;110B 1165 11AF;C5BC;110B 1165 11AF; # (얼; 얼; 얼; 얼; 얼; ) HANGUL SYLLABLE EOL +C5BD;C5BD;110B 1165 11B0;C5BD;110B 1165 11B0; # (얽; 얽; 얽; 얽; 얽; ) HANGUL SYLLABLE EOLG +C5BE;C5BE;110B 1165 11B1;C5BE;110B 1165 11B1; # (얾; 얾; 얾; 얾; 얾; ) HANGUL SYLLABLE EOLM +C5BF;C5BF;110B 1165 11B2;C5BF;110B 1165 11B2; # (얿; 얿; 얿; 얿; 얿; ) HANGUL SYLLABLE EOLB +C5C0;C5C0;110B 1165 11B3;C5C0;110B 1165 11B3; # (엀; 엀; 엀; 엀; 엀; ) HANGUL SYLLABLE EOLS +C5C1;C5C1;110B 1165 11B4;C5C1;110B 1165 11B4; # (엁; 엁; 엁; 엁; 엁; ) HANGUL SYLLABLE EOLT +C5C2;C5C2;110B 1165 11B5;C5C2;110B 1165 11B5; # (엂; 엂; 엂; 엂; 엂; ) HANGUL SYLLABLE EOLP +C5C3;C5C3;110B 1165 11B6;C5C3;110B 1165 11B6; # (엃; 엃; 엃; 엃; 엃; ) HANGUL SYLLABLE EOLH +C5C4;C5C4;110B 1165 11B7;C5C4;110B 1165 11B7; # (엄; 엄; 엄; 엄; 엄; ) HANGUL SYLLABLE EOM +C5C5;C5C5;110B 1165 11B8;C5C5;110B 1165 11B8; # (업; 업; 업; 업; 업; ) HANGUL SYLLABLE EOB +C5C6;C5C6;110B 1165 11B9;C5C6;110B 1165 11B9; # (없; 없; 없; 없; 없; ) HANGUL SYLLABLE EOBS +C5C7;C5C7;110B 1165 11BA;C5C7;110B 1165 11BA; # (엇; 엇; 엇; 엇; 엇; ) HANGUL SYLLABLE EOS +C5C8;C5C8;110B 1165 11BB;C5C8;110B 1165 11BB; # (었; 었; 었; 었; 었; ) HANGUL SYLLABLE EOSS +C5C9;C5C9;110B 1165 11BC;C5C9;110B 1165 11BC; # (엉; 엉; 엉; 엉; 엉; ) HANGUL SYLLABLE EONG +C5CA;C5CA;110B 1165 11BD;C5CA;110B 1165 11BD; # (엊; 엊; 엊; 엊; 엊; ) HANGUL SYLLABLE EOJ +C5CB;C5CB;110B 1165 11BE;C5CB;110B 1165 11BE; # (엋; 엋; 엋; 엋; 엋; ) HANGUL SYLLABLE EOC +C5CC;C5CC;110B 1165 11BF;C5CC;110B 1165 11BF; # (엌; 엌; 엌; 엌; 엌; ) HANGUL SYLLABLE EOK +C5CD;C5CD;110B 1165 11C0;C5CD;110B 1165 11C0; # (엍; 엍; 엍; 엍; 엍; ) HANGUL SYLLABLE EOT +C5CE;C5CE;110B 1165 11C1;C5CE;110B 1165 11C1; # (엎; 엎; 엎; 엎; 엎; ) HANGUL SYLLABLE EOP +C5CF;C5CF;110B 1165 11C2;C5CF;110B 1165 11C2; # (엏; 엏; 엏; 엏; 엏; ) HANGUL SYLLABLE EOH +C5D0;C5D0;110B 1166;C5D0;110B 1166; # (에; 에; 에; 에; 에; ) HANGUL SYLLABLE E +C5D1;C5D1;110B 1166 11A8;C5D1;110B 1166 11A8; # (엑; 엑; 엑; 엑; 엑; ) HANGUL SYLLABLE EG +C5D2;C5D2;110B 1166 11A9;C5D2;110B 1166 11A9; # (엒; 엒; 엒; 엒; 엒; ) HANGUL SYLLABLE EGG +C5D3;C5D3;110B 1166 11AA;C5D3;110B 1166 11AA; # (엓; 엓; 엓; 엓; 엓; ) HANGUL SYLLABLE EGS +C5D4;C5D4;110B 1166 11AB;C5D4;110B 1166 11AB; # (엔; 엔; 엔; 엔; 엔; ) HANGUL SYLLABLE EN +C5D5;C5D5;110B 1166 11AC;C5D5;110B 1166 11AC; # (엕; 엕; 엕; 엕; 엕; ) HANGUL SYLLABLE ENJ +C5D6;C5D6;110B 1166 11AD;C5D6;110B 1166 11AD; # (엖; 엖; 엖; 엖; 엖; ) HANGUL SYLLABLE ENH +C5D7;C5D7;110B 1166 11AE;C5D7;110B 1166 11AE; # (엗; 엗; 엗; 엗; 엗; ) HANGUL SYLLABLE ED +C5D8;C5D8;110B 1166 11AF;C5D8;110B 1166 11AF; # (엘; 엘; 엘; 엘; 엘; ) HANGUL SYLLABLE EL +C5D9;C5D9;110B 1166 11B0;C5D9;110B 1166 11B0; # (엙; 엙; 엙; 엙; 엙; ) HANGUL SYLLABLE ELG +C5DA;C5DA;110B 1166 11B1;C5DA;110B 1166 11B1; # (엚; 엚; 엚; 엚; 엚; ) HANGUL SYLLABLE ELM +C5DB;C5DB;110B 1166 11B2;C5DB;110B 1166 11B2; # (엛; 엛; 엛; 엛; 엛; ) HANGUL SYLLABLE ELB +C5DC;C5DC;110B 1166 11B3;C5DC;110B 1166 11B3; # (엜; 엜; 엜; 엜; 엜; ) HANGUL SYLLABLE ELS +C5DD;C5DD;110B 1166 11B4;C5DD;110B 1166 11B4; # (엝; 엝; 엝; 엝; 엝; ) HANGUL SYLLABLE ELT +C5DE;C5DE;110B 1166 11B5;C5DE;110B 1166 11B5; # (엞; 엞; 엞; 엞; 엞; ) HANGUL SYLLABLE ELP +C5DF;C5DF;110B 1166 11B6;C5DF;110B 1166 11B6; # (엟; 엟; 엟; 엟; 엟; ) HANGUL SYLLABLE ELH +C5E0;C5E0;110B 1166 11B7;C5E0;110B 1166 11B7; # (엠; 엠; 엠; 엠; 엠; ) HANGUL SYLLABLE EM +C5E1;C5E1;110B 1166 11B8;C5E1;110B 1166 11B8; # (엡; 엡; 엡; 엡; 엡; ) HANGUL SYLLABLE EB +C5E2;C5E2;110B 1166 11B9;C5E2;110B 1166 11B9; # (엢; 엢; 엢; 엢; 엢; ) HANGUL SYLLABLE EBS +C5E3;C5E3;110B 1166 11BA;C5E3;110B 1166 11BA; # (엣; 엣; 엣; 엣; 엣; ) HANGUL SYLLABLE ES +C5E4;C5E4;110B 1166 11BB;C5E4;110B 1166 11BB; # (엤; 엤; 엤; 엤; 엤; ) HANGUL SYLLABLE ESS +C5E5;C5E5;110B 1166 11BC;C5E5;110B 1166 11BC; # (엥; 엥; 엥; 엥; 엥; ) HANGUL SYLLABLE ENG +C5E6;C5E6;110B 1166 11BD;C5E6;110B 1166 11BD; # (엦; 엦; 엦; 엦; 엦; ) HANGUL SYLLABLE EJ +C5E7;C5E7;110B 1166 11BE;C5E7;110B 1166 11BE; # (엧; 엧; 엧; 엧; 엧; ) HANGUL SYLLABLE EC +C5E8;C5E8;110B 1166 11BF;C5E8;110B 1166 11BF; # (엨; 엨; 엨; 엨; 엨; ) HANGUL SYLLABLE EK +C5E9;C5E9;110B 1166 11C0;C5E9;110B 1166 11C0; # (엩; 엩; 엩; 엩; 엩; ) HANGUL SYLLABLE ET +C5EA;C5EA;110B 1166 11C1;C5EA;110B 1166 11C1; # (엪; 엪; 엪; 엪; 엪; ) HANGUL SYLLABLE EP +C5EB;C5EB;110B 1166 11C2;C5EB;110B 1166 11C2; # (엫; 엫; 엫; 엫; 엫; ) HANGUL SYLLABLE EH +C5EC;C5EC;110B 1167;C5EC;110B 1167; # (여; 여; 여; 여; 여; ) HANGUL SYLLABLE YEO +C5ED;C5ED;110B 1167 11A8;C5ED;110B 1167 11A8; # (역; 역; 역; 역; 역; ) HANGUL SYLLABLE YEOG +C5EE;C5EE;110B 1167 11A9;C5EE;110B 1167 11A9; # (엮; 엮; 엮; 엮; 엮; ) HANGUL SYLLABLE YEOGG +C5EF;C5EF;110B 1167 11AA;C5EF;110B 1167 11AA; # (엯; 엯; 엯; 엯; 엯; ) HANGUL SYLLABLE YEOGS +C5F0;C5F0;110B 1167 11AB;C5F0;110B 1167 11AB; # (연; 연; 연; 연; 연; ) HANGUL SYLLABLE YEON +C5F1;C5F1;110B 1167 11AC;C5F1;110B 1167 11AC; # (엱; 엱; 엱; 엱; 엱; ) HANGUL SYLLABLE YEONJ +C5F2;C5F2;110B 1167 11AD;C5F2;110B 1167 11AD; # (엲; 엲; 엲; 엲; 엲; ) HANGUL SYLLABLE YEONH +C5F3;C5F3;110B 1167 11AE;C5F3;110B 1167 11AE; # (엳; 엳; 엳; 엳; 엳; ) HANGUL SYLLABLE YEOD +C5F4;C5F4;110B 1167 11AF;C5F4;110B 1167 11AF; # (열; 열; 열; 열; 열; ) HANGUL SYLLABLE YEOL +C5F5;C5F5;110B 1167 11B0;C5F5;110B 1167 11B0; # (엵; 엵; 엵; 엵; 엵; ) HANGUL SYLLABLE YEOLG +C5F6;C5F6;110B 1167 11B1;C5F6;110B 1167 11B1; # (엶; 엶; 엶; 엶; 엶; ) HANGUL SYLLABLE YEOLM +C5F7;C5F7;110B 1167 11B2;C5F7;110B 1167 11B2; # (엷; 엷; 엷; 엷; 엷; ) HANGUL SYLLABLE YEOLB +C5F8;C5F8;110B 1167 11B3;C5F8;110B 1167 11B3; # (엸; 엸; 엸; 엸; 엸; ) HANGUL SYLLABLE YEOLS +C5F9;C5F9;110B 1167 11B4;C5F9;110B 1167 11B4; # (엹; 엹; 엹; 엹; 엹; ) HANGUL SYLLABLE YEOLT +C5FA;C5FA;110B 1167 11B5;C5FA;110B 1167 11B5; # (엺; 엺; 엺; 엺; 엺; ) HANGUL SYLLABLE YEOLP +C5FB;C5FB;110B 1167 11B6;C5FB;110B 1167 11B6; # (엻; 엻; 엻; 엻; 엻; ) HANGUL SYLLABLE YEOLH +C5FC;C5FC;110B 1167 11B7;C5FC;110B 1167 11B7; # (염; 염; 염; 염; 염; ) HANGUL SYLLABLE YEOM +C5FD;C5FD;110B 1167 11B8;C5FD;110B 1167 11B8; # (엽; 엽; 엽; 엽; 엽; ) HANGUL SYLLABLE YEOB +C5FE;C5FE;110B 1167 11B9;C5FE;110B 1167 11B9; # (엾; 엾; 엾; 엾; 엾; ) HANGUL SYLLABLE YEOBS +C5FF;C5FF;110B 1167 11BA;C5FF;110B 1167 11BA; # (엿; 엿; 엿; 엿; 엿; ) HANGUL SYLLABLE YEOS +C600;C600;110B 1167 11BB;C600;110B 1167 11BB; # (였; 였; 였; 였; 였; ) HANGUL SYLLABLE YEOSS +C601;C601;110B 1167 11BC;C601;110B 1167 11BC; # (영; 영; 영; 영; 영; ) HANGUL SYLLABLE YEONG +C602;C602;110B 1167 11BD;C602;110B 1167 11BD; # (옂; 옂; 옂; 옂; 옂; ) HANGUL SYLLABLE YEOJ +C603;C603;110B 1167 11BE;C603;110B 1167 11BE; # (옃; 옃; 옃; 옃; 옃; ) HANGUL SYLLABLE YEOC +C604;C604;110B 1167 11BF;C604;110B 1167 11BF; # (옄; 옄; 옄; 옄; 옄; ) HANGUL SYLLABLE YEOK +C605;C605;110B 1167 11C0;C605;110B 1167 11C0; # (옅; 옅; 옅; 옅; 옅; ) HANGUL SYLLABLE YEOT +C606;C606;110B 1167 11C1;C606;110B 1167 11C1; # (옆; 옆; 옆; 옆; 옆; ) HANGUL SYLLABLE YEOP +C607;C607;110B 1167 11C2;C607;110B 1167 11C2; # (옇; 옇; 옇; 옇; 옇; ) HANGUL SYLLABLE YEOH +C608;C608;110B 1168;C608;110B 1168; # (예; 예; 예; 예; 예; ) HANGUL SYLLABLE YE +C609;C609;110B 1168 11A8;C609;110B 1168 11A8; # (옉; 옉; 옉; 옉; 옉; ) HANGUL SYLLABLE YEG +C60A;C60A;110B 1168 11A9;C60A;110B 1168 11A9; # (옊; 옊; 옊; 옊; 옊; ) HANGUL SYLLABLE YEGG +C60B;C60B;110B 1168 11AA;C60B;110B 1168 11AA; # (옋; 옋; 옋; 옋; 옋; ) HANGUL SYLLABLE YEGS +C60C;C60C;110B 1168 11AB;C60C;110B 1168 11AB; # (옌; 옌; 옌; 옌; 옌; ) HANGUL SYLLABLE YEN +C60D;C60D;110B 1168 11AC;C60D;110B 1168 11AC; # (옍; 옍; 옍; 옍; 옍; ) HANGUL SYLLABLE YENJ +C60E;C60E;110B 1168 11AD;C60E;110B 1168 11AD; # (옎; 옎; 옎; 옎; 옎; ) HANGUL SYLLABLE YENH +C60F;C60F;110B 1168 11AE;C60F;110B 1168 11AE; # (옏; 옏; 옏; 옏; 옏; ) HANGUL SYLLABLE YED +C610;C610;110B 1168 11AF;C610;110B 1168 11AF; # (옐; 옐; 옐; 옐; 옐; ) HANGUL SYLLABLE YEL +C611;C611;110B 1168 11B0;C611;110B 1168 11B0; # (옑; 옑; 옑; 옑; 옑; ) HANGUL SYLLABLE YELG +C612;C612;110B 1168 11B1;C612;110B 1168 11B1; # (옒; 옒; 옒; 옒; 옒; ) HANGUL SYLLABLE YELM +C613;C613;110B 1168 11B2;C613;110B 1168 11B2; # (옓; 옓; 옓; 옓; 옓; ) HANGUL SYLLABLE YELB +C614;C614;110B 1168 11B3;C614;110B 1168 11B3; # (옔; 옔; 옔; 옔; 옔; ) HANGUL SYLLABLE YELS +C615;C615;110B 1168 11B4;C615;110B 1168 11B4; # (옕; 옕; 옕; 옕; 옕; ) HANGUL SYLLABLE YELT +C616;C616;110B 1168 11B5;C616;110B 1168 11B5; # (옖; 옖; 옖; 옖; 옖; ) HANGUL SYLLABLE YELP +C617;C617;110B 1168 11B6;C617;110B 1168 11B6; # (옗; 옗; 옗; 옗; 옗; ) HANGUL SYLLABLE YELH +C618;C618;110B 1168 11B7;C618;110B 1168 11B7; # (옘; 옘; 옘; 옘; 옘; ) HANGUL SYLLABLE YEM +C619;C619;110B 1168 11B8;C619;110B 1168 11B8; # (옙; 옙; 옙; 옙; 옙; ) HANGUL SYLLABLE YEB +C61A;C61A;110B 1168 11B9;C61A;110B 1168 11B9; # (옚; 옚; 옚; 옚; 옚; ) HANGUL SYLLABLE YEBS +C61B;C61B;110B 1168 11BA;C61B;110B 1168 11BA; # (옛; 옛; 옛; 옛; 옛; ) HANGUL SYLLABLE YES +C61C;C61C;110B 1168 11BB;C61C;110B 1168 11BB; # (옜; 옜; 옜; 옜; 옜; ) HANGUL SYLLABLE YESS +C61D;C61D;110B 1168 11BC;C61D;110B 1168 11BC; # (옝; 옝; 옝; 옝; 옝; ) HANGUL SYLLABLE YENG +C61E;C61E;110B 1168 11BD;C61E;110B 1168 11BD; # (옞; 옞; 옞; 옞; 옞; ) HANGUL SYLLABLE YEJ +C61F;C61F;110B 1168 11BE;C61F;110B 1168 11BE; # (옟; 옟; 옟; 옟; 옟; ) HANGUL SYLLABLE YEC +C620;C620;110B 1168 11BF;C620;110B 1168 11BF; # (옠; 옠; 옠; 옠; 옠; ) HANGUL SYLLABLE YEK +C621;C621;110B 1168 11C0;C621;110B 1168 11C0; # (옡; 옡; 옡; 옡; 옡; ) HANGUL SYLLABLE YET +C622;C622;110B 1168 11C1;C622;110B 1168 11C1; # (옢; 옢; 옢; 옢; 옢; ) HANGUL SYLLABLE YEP +C623;C623;110B 1168 11C2;C623;110B 1168 11C2; # (옣; 옣; 옣; 옣; 옣; ) HANGUL SYLLABLE YEH +C624;C624;110B 1169;C624;110B 1169; # (오; 오; 오; 오; 오; ) HANGUL SYLLABLE O +C625;C625;110B 1169 11A8;C625;110B 1169 11A8; # (옥; 옥; 옥; 옥; 옥; ) HANGUL SYLLABLE OG +C626;C626;110B 1169 11A9;C626;110B 1169 11A9; # (옦; 옦; 옦; 옦; 옦; ) HANGUL SYLLABLE OGG +C627;C627;110B 1169 11AA;C627;110B 1169 11AA; # (옧; 옧; 옧; 옧; 옧; ) HANGUL SYLLABLE OGS +C628;C628;110B 1169 11AB;C628;110B 1169 11AB; # (온; 온; 온; 온; 온; ) HANGUL SYLLABLE ON +C629;C629;110B 1169 11AC;C629;110B 1169 11AC; # (옩; 옩; 옩; 옩; 옩; ) HANGUL SYLLABLE ONJ +C62A;C62A;110B 1169 11AD;C62A;110B 1169 11AD; # (옪; 옪; 옪; 옪; 옪; ) HANGUL SYLLABLE ONH +C62B;C62B;110B 1169 11AE;C62B;110B 1169 11AE; # (옫; 옫; 옫; 옫; 옫; ) HANGUL SYLLABLE OD +C62C;C62C;110B 1169 11AF;C62C;110B 1169 11AF; # (올; 올; 올; 올; 올; ) HANGUL SYLLABLE OL +C62D;C62D;110B 1169 11B0;C62D;110B 1169 11B0; # (옭; 옭; 옭; 옭; 옭; ) HANGUL SYLLABLE OLG +C62E;C62E;110B 1169 11B1;C62E;110B 1169 11B1; # (옮; 옮; 옮; 옮; 옮; ) HANGUL SYLLABLE OLM +C62F;C62F;110B 1169 11B2;C62F;110B 1169 11B2; # (옯; 옯; 옯; 옯; 옯; ) HANGUL SYLLABLE OLB +C630;C630;110B 1169 11B3;C630;110B 1169 11B3; # (옰; 옰; 옰; 옰; 옰; ) HANGUL SYLLABLE OLS +C631;C631;110B 1169 11B4;C631;110B 1169 11B4; # (옱; 옱; 옱; 옱; 옱; ) HANGUL SYLLABLE OLT +C632;C632;110B 1169 11B5;C632;110B 1169 11B5; # (옲; 옲; 옲; 옲; 옲; ) HANGUL SYLLABLE OLP +C633;C633;110B 1169 11B6;C633;110B 1169 11B6; # (옳; 옳; 옳; 옳; 옳; ) HANGUL SYLLABLE OLH +C634;C634;110B 1169 11B7;C634;110B 1169 11B7; # (옴; 옴; 옴; 옴; 옴; ) HANGUL SYLLABLE OM +C635;C635;110B 1169 11B8;C635;110B 1169 11B8; # (옵; 옵; 옵; 옵; 옵; ) HANGUL SYLLABLE OB +C636;C636;110B 1169 11B9;C636;110B 1169 11B9; # (옶; 옶; 옶; 옶; 옶; ) HANGUL SYLLABLE OBS +C637;C637;110B 1169 11BA;C637;110B 1169 11BA; # (옷; 옷; 옷; 옷; 옷; ) HANGUL SYLLABLE OS +C638;C638;110B 1169 11BB;C638;110B 1169 11BB; # (옸; 옸; 옸; 옸; 옸; ) HANGUL SYLLABLE OSS +C639;C639;110B 1169 11BC;C639;110B 1169 11BC; # (옹; 옹; 옹; 옹; 옹; ) HANGUL SYLLABLE ONG +C63A;C63A;110B 1169 11BD;C63A;110B 1169 11BD; # (옺; 옺; 옺; 옺; 옺; ) HANGUL SYLLABLE OJ +C63B;C63B;110B 1169 11BE;C63B;110B 1169 11BE; # (옻; 옻; 옻; 옻; 옻; ) HANGUL SYLLABLE OC +C63C;C63C;110B 1169 11BF;C63C;110B 1169 11BF; # (옼; 옼; 옼; 옼; 옼; ) HANGUL SYLLABLE OK +C63D;C63D;110B 1169 11C0;C63D;110B 1169 11C0; # (옽; 옽; 옽; 옽; 옽; ) HANGUL SYLLABLE OT +C63E;C63E;110B 1169 11C1;C63E;110B 1169 11C1; # (옾; 옾; 옾; 옾; 옾; ) HANGUL SYLLABLE OP +C63F;C63F;110B 1169 11C2;C63F;110B 1169 11C2; # (옿; 옿; 옿; 옿; 옿; ) HANGUL SYLLABLE OH +C640;C640;110B 116A;C640;110B 116A; # (와; 와; 와; 와; 와; ) HANGUL SYLLABLE WA +C641;C641;110B 116A 11A8;C641;110B 116A 11A8; # (왁; 왁; 왁; 왁; 왁; ) HANGUL SYLLABLE WAG +C642;C642;110B 116A 11A9;C642;110B 116A 11A9; # (왂; 왂; 왂; 왂; 왂; ) HANGUL SYLLABLE WAGG +C643;C643;110B 116A 11AA;C643;110B 116A 11AA; # (왃; 왃; 왃; 왃; 왃; ) HANGUL SYLLABLE WAGS +C644;C644;110B 116A 11AB;C644;110B 116A 11AB; # (완; 완; 완; 완; 완; ) HANGUL SYLLABLE WAN +C645;C645;110B 116A 11AC;C645;110B 116A 11AC; # (왅; 왅; 왅; 왅; 왅; ) HANGUL SYLLABLE WANJ +C646;C646;110B 116A 11AD;C646;110B 116A 11AD; # (왆; 왆; 왆; 왆; 왆; ) HANGUL SYLLABLE WANH +C647;C647;110B 116A 11AE;C647;110B 116A 11AE; # (왇; 왇; 왇; 왇; 왇; ) HANGUL SYLLABLE WAD +C648;C648;110B 116A 11AF;C648;110B 116A 11AF; # (왈; 왈; 왈; 왈; 왈; ) HANGUL SYLLABLE WAL +C649;C649;110B 116A 11B0;C649;110B 116A 11B0; # (왉; 왉; 왉; 왉; 왉; ) HANGUL SYLLABLE WALG +C64A;C64A;110B 116A 11B1;C64A;110B 116A 11B1; # (왊; 왊; 왊; 왊; 왊; ) HANGUL SYLLABLE WALM +C64B;C64B;110B 116A 11B2;C64B;110B 116A 11B2; # (왋; 왋; 왋; 왋; 왋; ) HANGUL SYLLABLE WALB +C64C;C64C;110B 116A 11B3;C64C;110B 116A 11B3; # (왌; 왌; 왌; 왌; 왌; ) HANGUL SYLLABLE WALS +C64D;C64D;110B 116A 11B4;C64D;110B 116A 11B4; # (왍; 왍; 왍; 왍; 왍; ) HANGUL SYLLABLE WALT +C64E;C64E;110B 116A 11B5;C64E;110B 116A 11B5; # (왎; 왎; 왎; 왎; 왎; ) HANGUL SYLLABLE WALP +C64F;C64F;110B 116A 11B6;C64F;110B 116A 11B6; # (왏; 왏; 왏; 왏; 왏; ) HANGUL SYLLABLE WALH +C650;C650;110B 116A 11B7;C650;110B 116A 11B7; # (왐; 왐; 왐; 왐; 왐; ) HANGUL SYLLABLE WAM +C651;C651;110B 116A 11B8;C651;110B 116A 11B8; # (왑; 왑; 왑; 왑; 왑; ) HANGUL SYLLABLE WAB +C652;C652;110B 116A 11B9;C652;110B 116A 11B9; # (왒; 왒; 왒; 왒; 왒; ) HANGUL SYLLABLE WABS +C653;C653;110B 116A 11BA;C653;110B 116A 11BA; # (왓; 왓; 왓; 왓; 왓; ) HANGUL SYLLABLE WAS +C654;C654;110B 116A 11BB;C654;110B 116A 11BB; # (왔; 왔; 왔; 왔; 왔; ) HANGUL SYLLABLE WASS +C655;C655;110B 116A 11BC;C655;110B 116A 11BC; # (왕; 왕; 왕; 왕; 왕; ) HANGUL SYLLABLE WANG +C656;C656;110B 116A 11BD;C656;110B 116A 11BD; # (왖; 왖; 왖; 왖; 왖; ) HANGUL SYLLABLE WAJ +C657;C657;110B 116A 11BE;C657;110B 116A 11BE; # (왗; 왗; 왗; 왗; 왗; ) HANGUL SYLLABLE WAC +C658;C658;110B 116A 11BF;C658;110B 116A 11BF; # (왘; 왘; 왘; 왘; 왘; ) HANGUL SYLLABLE WAK +C659;C659;110B 116A 11C0;C659;110B 116A 11C0; # (왙; 왙; 왙; 왙; 왙; ) HANGUL SYLLABLE WAT +C65A;C65A;110B 116A 11C1;C65A;110B 116A 11C1; # (왚; 왚; 왚; 왚; 왚; ) HANGUL SYLLABLE WAP +C65B;C65B;110B 116A 11C2;C65B;110B 116A 11C2; # (왛; 왛; 왛; 왛; 왛; ) HANGUL SYLLABLE WAH +C65C;C65C;110B 116B;C65C;110B 116B; # (왜; 왜; 왜; 왜; 왜; ) HANGUL SYLLABLE WAE +C65D;C65D;110B 116B 11A8;C65D;110B 116B 11A8; # (왝; 왝; 왝; 왝; 왝; ) HANGUL SYLLABLE WAEG +C65E;C65E;110B 116B 11A9;C65E;110B 116B 11A9; # (왞; 왞; 왞; 왞; 왞; ) HANGUL SYLLABLE WAEGG +C65F;C65F;110B 116B 11AA;C65F;110B 116B 11AA; # (왟; 왟; 왟; 왟; 왟; ) HANGUL SYLLABLE WAEGS +C660;C660;110B 116B 11AB;C660;110B 116B 11AB; # (왠; 왠; 왠; 왠; 왠; ) HANGUL SYLLABLE WAEN +C661;C661;110B 116B 11AC;C661;110B 116B 11AC; # (왡; 왡; 왡; 왡; 왡; ) HANGUL SYLLABLE WAENJ +C662;C662;110B 116B 11AD;C662;110B 116B 11AD; # (왢; 왢; 왢; 왢; 왢; ) HANGUL SYLLABLE WAENH +C663;C663;110B 116B 11AE;C663;110B 116B 11AE; # (왣; 왣; 왣; 왣; 왣; ) HANGUL SYLLABLE WAED +C664;C664;110B 116B 11AF;C664;110B 116B 11AF; # (왤; 왤; 왤; 왤; 왤; ) HANGUL SYLLABLE WAEL +C665;C665;110B 116B 11B0;C665;110B 116B 11B0; # (왥; 왥; 왥; 왥; 왥; ) HANGUL SYLLABLE WAELG +C666;C666;110B 116B 11B1;C666;110B 116B 11B1; # (왦; 왦; 왦; 왦; 왦; ) HANGUL SYLLABLE WAELM +C667;C667;110B 116B 11B2;C667;110B 116B 11B2; # (왧; 왧; 왧; 왧; 왧; ) HANGUL SYLLABLE WAELB +C668;C668;110B 116B 11B3;C668;110B 116B 11B3; # (왨; 왨; 왨; 왨; 왨; ) HANGUL SYLLABLE WAELS +C669;C669;110B 116B 11B4;C669;110B 116B 11B4; # (왩; 왩; 왩; 왩; 왩; ) HANGUL SYLLABLE WAELT +C66A;C66A;110B 116B 11B5;C66A;110B 116B 11B5; # (왪; 왪; 왪; 왪; 왪; ) HANGUL SYLLABLE WAELP +C66B;C66B;110B 116B 11B6;C66B;110B 116B 11B6; # (왫; 왫; 왫; 왫; 왫; ) HANGUL SYLLABLE WAELH +C66C;C66C;110B 116B 11B7;C66C;110B 116B 11B7; # (왬; 왬; 왬; 왬; 왬; ) HANGUL SYLLABLE WAEM +C66D;C66D;110B 116B 11B8;C66D;110B 116B 11B8; # (왭; 왭; 왭; 왭; 왭; ) HANGUL SYLLABLE WAEB +C66E;C66E;110B 116B 11B9;C66E;110B 116B 11B9; # (왮; 왮; 왮; 왮; 왮; ) HANGUL SYLLABLE WAEBS +C66F;C66F;110B 116B 11BA;C66F;110B 116B 11BA; # (왯; 왯; 왯; 왯; 왯; ) HANGUL SYLLABLE WAES +C670;C670;110B 116B 11BB;C670;110B 116B 11BB; # (왰; 왰; 왰; 왰; 왰; ) HANGUL SYLLABLE WAESS +C671;C671;110B 116B 11BC;C671;110B 116B 11BC; # (왱; 왱; 왱; 왱; 왱; ) HANGUL SYLLABLE WAENG +C672;C672;110B 116B 11BD;C672;110B 116B 11BD; # (왲; 왲; 왲; 왲; 왲; ) HANGUL SYLLABLE WAEJ +C673;C673;110B 116B 11BE;C673;110B 116B 11BE; # (왳; 왳; 왳; 왳; 왳; ) HANGUL SYLLABLE WAEC +C674;C674;110B 116B 11BF;C674;110B 116B 11BF; # (왴; 왴; 왴; 왴; 왴; ) HANGUL SYLLABLE WAEK +C675;C675;110B 116B 11C0;C675;110B 116B 11C0; # (왵; 왵; 왵; 왵; 왵; ) HANGUL SYLLABLE WAET +C676;C676;110B 116B 11C1;C676;110B 116B 11C1; # (왶; 왶; 왶; 왶; 왶; ) HANGUL SYLLABLE WAEP +C677;C677;110B 116B 11C2;C677;110B 116B 11C2; # (왷; 왷; 왷; 왷; 왷; ) HANGUL SYLLABLE WAEH +C678;C678;110B 116C;C678;110B 116C; # (외; 외; 외; 외; 외; ) HANGUL SYLLABLE OE +C679;C679;110B 116C 11A8;C679;110B 116C 11A8; # (왹; 왹; 왹; 왹; 왹; ) HANGUL SYLLABLE OEG +C67A;C67A;110B 116C 11A9;C67A;110B 116C 11A9; # (왺; 왺; 왺; 왺; 왺; ) HANGUL SYLLABLE OEGG +C67B;C67B;110B 116C 11AA;C67B;110B 116C 11AA; # (왻; 왻; 왻; 왻; 왻; ) HANGUL SYLLABLE OEGS +C67C;C67C;110B 116C 11AB;C67C;110B 116C 11AB; # (왼; 왼; 왼; 왼; 왼; ) HANGUL SYLLABLE OEN +C67D;C67D;110B 116C 11AC;C67D;110B 116C 11AC; # (왽; 왽; 왽; 왽; 왽; ) HANGUL SYLLABLE OENJ +C67E;C67E;110B 116C 11AD;C67E;110B 116C 11AD; # (왾; 왾; 왾; 왾; 왾; ) HANGUL SYLLABLE OENH +C67F;C67F;110B 116C 11AE;C67F;110B 116C 11AE; # (왿; 왿; 왿; 왿; 왿; ) HANGUL SYLLABLE OED +C680;C680;110B 116C 11AF;C680;110B 116C 11AF; # (욀; 욀; 욀; 욀; 욀; ) HANGUL SYLLABLE OEL +C681;C681;110B 116C 11B0;C681;110B 116C 11B0; # (욁; 욁; 욁; 욁; 욁; ) HANGUL SYLLABLE OELG +C682;C682;110B 116C 11B1;C682;110B 116C 11B1; # (욂; 욂; 욂; 욂; 욂; ) HANGUL SYLLABLE OELM +C683;C683;110B 116C 11B2;C683;110B 116C 11B2; # (욃; 욃; 욃; 욃; 욃; ) HANGUL SYLLABLE OELB +C684;C684;110B 116C 11B3;C684;110B 116C 11B3; # (욄; 욄; 욄; 욄; 욄; ) HANGUL SYLLABLE OELS +C685;C685;110B 116C 11B4;C685;110B 116C 11B4; # (욅; 욅; 욅; 욅; 욅; ) HANGUL SYLLABLE OELT +C686;C686;110B 116C 11B5;C686;110B 116C 11B5; # (욆; 욆; 욆; 욆; 욆; ) HANGUL SYLLABLE OELP +C687;C687;110B 116C 11B6;C687;110B 116C 11B6; # (욇; 욇; 욇; 욇; 욇; ) HANGUL SYLLABLE OELH +C688;C688;110B 116C 11B7;C688;110B 116C 11B7; # (욈; 욈; 욈; 욈; 욈; ) HANGUL SYLLABLE OEM +C689;C689;110B 116C 11B8;C689;110B 116C 11B8; # (욉; 욉; 욉; 욉; 욉; ) HANGUL SYLLABLE OEB +C68A;C68A;110B 116C 11B9;C68A;110B 116C 11B9; # (욊; 욊; 욊; 욊; 욊; ) HANGUL SYLLABLE OEBS +C68B;C68B;110B 116C 11BA;C68B;110B 116C 11BA; # (욋; 욋; 욋; 욋; 욋; ) HANGUL SYLLABLE OES +C68C;C68C;110B 116C 11BB;C68C;110B 116C 11BB; # (욌; 욌; 욌; 욌; 욌; ) HANGUL SYLLABLE OESS +C68D;C68D;110B 116C 11BC;C68D;110B 116C 11BC; # (욍; 욍; 욍; 욍; 욍; ) HANGUL SYLLABLE OENG +C68E;C68E;110B 116C 11BD;C68E;110B 116C 11BD; # (욎; 욎; 욎; 욎; 욎; ) HANGUL SYLLABLE OEJ +C68F;C68F;110B 116C 11BE;C68F;110B 116C 11BE; # (욏; 욏; 욏; 욏; 욏; ) HANGUL SYLLABLE OEC +C690;C690;110B 116C 11BF;C690;110B 116C 11BF; # (욐; 욐; 욐; 욐; 욐; ) HANGUL SYLLABLE OEK +C691;C691;110B 116C 11C0;C691;110B 116C 11C0; # (욑; 욑; 욑; 욑; 욑; ) HANGUL SYLLABLE OET +C692;C692;110B 116C 11C1;C692;110B 116C 11C1; # (욒; 욒; 욒; 욒; 욒; ) HANGUL SYLLABLE OEP +C693;C693;110B 116C 11C2;C693;110B 116C 11C2; # (욓; 욓; 욓; 욓; 욓; ) HANGUL SYLLABLE OEH +C694;C694;110B 116D;C694;110B 116D; # (요; 요; 요; 요; 요; ) HANGUL SYLLABLE YO +C695;C695;110B 116D 11A8;C695;110B 116D 11A8; # (욕; 욕; 욕; 욕; 욕; ) HANGUL SYLLABLE YOG +C696;C696;110B 116D 11A9;C696;110B 116D 11A9; # (욖; 욖; 욖; 욖; 욖; ) HANGUL SYLLABLE YOGG +C697;C697;110B 116D 11AA;C697;110B 116D 11AA; # (욗; 욗; 욗; 욗; 욗; ) HANGUL SYLLABLE YOGS +C698;C698;110B 116D 11AB;C698;110B 116D 11AB; # (욘; 욘; 욘; 욘; 욘; ) HANGUL SYLLABLE YON +C699;C699;110B 116D 11AC;C699;110B 116D 11AC; # (욙; 욙; 욙; 욙; 욙; ) HANGUL SYLLABLE YONJ +C69A;C69A;110B 116D 11AD;C69A;110B 116D 11AD; # (욚; 욚; 욚; 욚; 욚; ) HANGUL SYLLABLE YONH +C69B;C69B;110B 116D 11AE;C69B;110B 116D 11AE; # (욛; 욛; 욛; 욛; 욛; ) HANGUL SYLLABLE YOD +C69C;C69C;110B 116D 11AF;C69C;110B 116D 11AF; # (욜; 욜; 욜; 욜; 욜; ) HANGUL SYLLABLE YOL +C69D;C69D;110B 116D 11B0;C69D;110B 116D 11B0; # (욝; 욝; 욝; 욝; 욝; ) HANGUL SYLLABLE YOLG +C69E;C69E;110B 116D 11B1;C69E;110B 116D 11B1; # (욞; 욞; 욞; 욞; 욞; ) HANGUL SYLLABLE YOLM +C69F;C69F;110B 116D 11B2;C69F;110B 116D 11B2; # (욟; 욟; 욟; 욟; 욟; ) HANGUL SYLLABLE YOLB +C6A0;C6A0;110B 116D 11B3;C6A0;110B 116D 11B3; # (욠; 욠; 욠; 욠; 욠; ) HANGUL SYLLABLE YOLS +C6A1;C6A1;110B 116D 11B4;C6A1;110B 116D 11B4; # (욡; 욡; 욡; 욡; 욡; ) HANGUL SYLLABLE YOLT +C6A2;C6A2;110B 116D 11B5;C6A2;110B 116D 11B5; # (욢; 욢; 욢; 욢; 욢; ) HANGUL SYLLABLE YOLP +C6A3;C6A3;110B 116D 11B6;C6A3;110B 116D 11B6; # (욣; 욣; 욣; 욣; 욣; ) HANGUL SYLLABLE YOLH +C6A4;C6A4;110B 116D 11B7;C6A4;110B 116D 11B7; # (욤; 욤; 욤; 욤; 욤; ) HANGUL SYLLABLE YOM +C6A5;C6A5;110B 116D 11B8;C6A5;110B 116D 11B8; # (욥; 욥; 욥; 욥; 욥; ) HANGUL SYLLABLE YOB +C6A6;C6A6;110B 116D 11B9;C6A6;110B 116D 11B9; # (욦; 욦; 욦; 욦; 욦; ) HANGUL SYLLABLE YOBS +C6A7;C6A7;110B 116D 11BA;C6A7;110B 116D 11BA; # (욧; 욧; 욧; 욧; 욧; ) HANGUL SYLLABLE YOS +C6A8;C6A8;110B 116D 11BB;C6A8;110B 116D 11BB; # (욨; 욨; 욨; 욨; 욨; ) HANGUL SYLLABLE YOSS +C6A9;C6A9;110B 116D 11BC;C6A9;110B 116D 11BC; # (용; 용; 용; 용; 용; ) HANGUL SYLLABLE YONG +C6AA;C6AA;110B 116D 11BD;C6AA;110B 116D 11BD; # (욪; 욪; 욪; 욪; 욪; ) HANGUL SYLLABLE YOJ +C6AB;C6AB;110B 116D 11BE;C6AB;110B 116D 11BE; # (욫; 욫; 욫; 욫; 욫; ) HANGUL SYLLABLE YOC +C6AC;C6AC;110B 116D 11BF;C6AC;110B 116D 11BF; # (욬; 욬; 욬; 욬; 욬; ) HANGUL SYLLABLE YOK +C6AD;C6AD;110B 116D 11C0;C6AD;110B 116D 11C0; # (욭; 욭; 욭; 욭; 욭; ) HANGUL SYLLABLE YOT +C6AE;C6AE;110B 116D 11C1;C6AE;110B 116D 11C1; # (욮; 욮; 욮; 욮; 욮; ) HANGUL SYLLABLE YOP +C6AF;C6AF;110B 116D 11C2;C6AF;110B 116D 11C2; # (욯; 욯; 욯; 욯; 욯; ) HANGUL SYLLABLE YOH +C6B0;C6B0;110B 116E;C6B0;110B 116E; # (우; 우; 우; 우; 우; ) HANGUL SYLLABLE U +C6B1;C6B1;110B 116E 11A8;C6B1;110B 116E 11A8; # (욱; 욱; 욱; 욱; 욱; ) HANGUL SYLLABLE UG +C6B2;C6B2;110B 116E 11A9;C6B2;110B 116E 11A9; # (욲; 욲; 욲; 욲; 욲; ) HANGUL SYLLABLE UGG +C6B3;C6B3;110B 116E 11AA;C6B3;110B 116E 11AA; # (욳; 욳; 욳; 욳; 욳; ) HANGUL SYLLABLE UGS +C6B4;C6B4;110B 116E 11AB;C6B4;110B 116E 11AB; # (운; 운; 운; 운; 운; ) HANGUL SYLLABLE UN +C6B5;C6B5;110B 116E 11AC;C6B5;110B 116E 11AC; # (욵; 욵; 욵; 욵; 욵; ) HANGUL SYLLABLE UNJ +C6B6;C6B6;110B 116E 11AD;C6B6;110B 116E 11AD; # (욶; 욶; 욶; 욶; 욶; ) HANGUL SYLLABLE UNH +C6B7;C6B7;110B 116E 11AE;C6B7;110B 116E 11AE; # (욷; 욷; 욷; 욷; 욷; ) HANGUL SYLLABLE UD +C6B8;C6B8;110B 116E 11AF;C6B8;110B 116E 11AF; # (울; 울; 울; 울; 울; ) HANGUL SYLLABLE UL +C6B9;C6B9;110B 116E 11B0;C6B9;110B 116E 11B0; # (욹; 욹; 욹; 욹; 욹; ) HANGUL SYLLABLE ULG +C6BA;C6BA;110B 116E 11B1;C6BA;110B 116E 11B1; # (욺; 욺; 욺; 욺; 욺; ) HANGUL SYLLABLE ULM +C6BB;C6BB;110B 116E 11B2;C6BB;110B 116E 11B2; # (욻; 욻; 욻; 욻; 욻; ) HANGUL SYLLABLE ULB +C6BC;C6BC;110B 116E 11B3;C6BC;110B 116E 11B3; # (욼; 욼; 욼; 욼; 욼; ) HANGUL SYLLABLE ULS +C6BD;C6BD;110B 116E 11B4;C6BD;110B 116E 11B4; # (욽; 욽; 욽; 욽; 욽; ) HANGUL SYLLABLE ULT +C6BE;C6BE;110B 116E 11B5;C6BE;110B 116E 11B5; # (욾; 욾; 욾; 욾; 욾; ) HANGUL SYLLABLE ULP +C6BF;C6BF;110B 116E 11B6;C6BF;110B 116E 11B6; # (욿; 욿; 욿; 욿; 욿; ) HANGUL SYLLABLE ULH +C6C0;C6C0;110B 116E 11B7;C6C0;110B 116E 11B7; # (움; 움; 움; 움; 움; ) HANGUL SYLLABLE UM +C6C1;C6C1;110B 116E 11B8;C6C1;110B 116E 11B8; # (웁; 웁; 웁; 웁; 웁; ) HANGUL SYLLABLE UB +C6C2;C6C2;110B 116E 11B9;C6C2;110B 116E 11B9; # (웂; 웂; 웂; 웂; 웂; ) HANGUL SYLLABLE UBS +C6C3;C6C3;110B 116E 11BA;C6C3;110B 116E 11BA; # (웃; 웃; 웃; 웃; 웃; ) HANGUL SYLLABLE US +C6C4;C6C4;110B 116E 11BB;C6C4;110B 116E 11BB; # (웄; 웄; 웄; 웄; 웄; ) HANGUL SYLLABLE USS +C6C5;C6C5;110B 116E 11BC;C6C5;110B 116E 11BC; # (웅; 웅; 웅; 웅; 웅; ) HANGUL SYLLABLE UNG +C6C6;C6C6;110B 116E 11BD;C6C6;110B 116E 11BD; # (웆; 웆; 웆; 웆; 웆; ) HANGUL SYLLABLE UJ +C6C7;C6C7;110B 116E 11BE;C6C7;110B 116E 11BE; # (웇; 웇; 웇; 웇; 웇; ) HANGUL SYLLABLE UC +C6C8;C6C8;110B 116E 11BF;C6C8;110B 116E 11BF; # (웈; 웈; 웈; 웈; 웈; ) HANGUL SYLLABLE UK +C6C9;C6C9;110B 116E 11C0;C6C9;110B 116E 11C0; # (웉; 웉; 웉; 웉; 웉; ) HANGUL SYLLABLE UT +C6CA;C6CA;110B 116E 11C1;C6CA;110B 116E 11C1; # (웊; 웊; 웊; 웊; 웊; ) HANGUL SYLLABLE UP +C6CB;C6CB;110B 116E 11C2;C6CB;110B 116E 11C2; # (웋; 웋; 웋; 웋; 웋; ) HANGUL SYLLABLE UH +C6CC;C6CC;110B 116F;C6CC;110B 116F; # (워; 워; 워; 워; 워; ) HANGUL SYLLABLE WEO +C6CD;C6CD;110B 116F 11A8;C6CD;110B 116F 11A8; # (웍; 웍; 웍; 웍; 웍; ) HANGUL SYLLABLE WEOG +C6CE;C6CE;110B 116F 11A9;C6CE;110B 116F 11A9; # (웎; 웎; 웎; 웎; 웎; ) HANGUL SYLLABLE WEOGG +C6CF;C6CF;110B 116F 11AA;C6CF;110B 116F 11AA; # (웏; 웏; 웏; 웏; 웏; ) HANGUL SYLLABLE WEOGS +C6D0;C6D0;110B 116F 11AB;C6D0;110B 116F 11AB; # (원; 원; 원; 원; 원; ) HANGUL SYLLABLE WEON +C6D1;C6D1;110B 116F 11AC;C6D1;110B 116F 11AC; # (웑; 웑; 웑; 웑; 웑; ) HANGUL SYLLABLE WEONJ +C6D2;C6D2;110B 116F 11AD;C6D2;110B 116F 11AD; # (웒; 웒; 웒; 웒; 웒; ) HANGUL SYLLABLE WEONH +C6D3;C6D3;110B 116F 11AE;C6D3;110B 116F 11AE; # (웓; 웓; 웓; 웓; 웓; ) HANGUL SYLLABLE WEOD +C6D4;C6D4;110B 116F 11AF;C6D4;110B 116F 11AF; # (월; 월; 월; 월; 월; ) HANGUL SYLLABLE WEOL +C6D5;C6D5;110B 116F 11B0;C6D5;110B 116F 11B0; # (웕; 웕; 웕; 웕; 웕; ) HANGUL SYLLABLE WEOLG +C6D6;C6D6;110B 116F 11B1;C6D6;110B 116F 11B1; # (웖; 웖; 웖; 웖; 웖; ) HANGUL SYLLABLE WEOLM +C6D7;C6D7;110B 116F 11B2;C6D7;110B 116F 11B2; # (웗; 웗; 웗; 웗; 웗; ) HANGUL SYLLABLE WEOLB +C6D8;C6D8;110B 116F 11B3;C6D8;110B 116F 11B3; # (웘; 웘; 웘; 웘; 웘; ) HANGUL SYLLABLE WEOLS +C6D9;C6D9;110B 116F 11B4;C6D9;110B 116F 11B4; # (웙; 웙; 웙; 웙; 웙; ) HANGUL SYLLABLE WEOLT +C6DA;C6DA;110B 116F 11B5;C6DA;110B 116F 11B5; # (웚; 웚; 웚; 웚; 웚; ) HANGUL SYLLABLE WEOLP +C6DB;C6DB;110B 116F 11B6;C6DB;110B 116F 11B6; # (웛; 웛; 웛; 웛; 웛; ) HANGUL SYLLABLE WEOLH +C6DC;C6DC;110B 116F 11B7;C6DC;110B 116F 11B7; # (웜; 웜; 웜; 웜; 웜; ) HANGUL SYLLABLE WEOM +C6DD;C6DD;110B 116F 11B8;C6DD;110B 116F 11B8; # (웝; 웝; 웝; 웝; 웝; ) HANGUL SYLLABLE WEOB +C6DE;C6DE;110B 116F 11B9;C6DE;110B 116F 11B9; # (웞; 웞; 웞; 웞; 웞; ) HANGUL SYLLABLE WEOBS +C6DF;C6DF;110B 116F 11BA;C6DF;110B 116F 11BA; # (웟; 웟; 웟; 웟; 웟; ) HANGUL SYLLABLE WEOS +C6E0;C6E0;110B 116F 11BB;C6E0;110B 116F 11BB; # (웠; 웠; 웠; 웠; 웠; ) HANGUL SYLLABLE WEOSS +C6E1;C6E1;110B 116F 11BC;C6E1;110B 116F 11BC; # (웡; 웡; 웡; 웡; 웡; ) HANGUL SYLLABLE WEONG +C6E2;C6E2;110B 116F 11BD;C6E2;110B 116F 11BD; # (웢; 웢; 웢; 웢; 웢; ) HANGUL SYLLABLE WEOJ +C6E3;C6E3;110B 116F 11BE;C6E3;110B 116F 11BE; # (웣; 웣; 웣; 웣; 웣; ) HANGUL SYLLABLE WEOC +C6E4;C6E4;110B 116F 11BF;C6E4;110B 116F 11BF; # (웤; 웤; 웤; 웤; 웤; ) HANGUL SYLLABLE WEOK +C6E5;C6E5;110B 116F 11C0;C6E5;110B 116F 11C0; # (웥; 웥; 웥; 웥; 웥; ) HANGUL SYLLABLE WEOT +C6E6;C6E6;110B 116F 11C1;C6E6;110B 116F 11C1; # (웦; 웦; 웦; 웦; 웦; ) HANGUL SYLLABLE WEOP +C6E7;C6E7;110B 116F 11C2;C6E7;110B 116F 11C2; # (웧; 웧; 웧; 웧; 웧; ) HANGUL SYLLABLE WEOH +C6E8;C6E8;110B 1170;C6E8;110B 1170; # (웨; 웨; 웨; 웨; 웨; ) HANGUL SYLLABLE WE +C6E9;C6E9;110B 1170 11A8;C6E9;110B 1170 11A8; # (웩; 웩; 웩; 웩; 웩; ) HANGUL SYLLABLE WEG +C6EA;C6EA;110B 1170 11A9;C6EA;110B 1170 11A9; # (웪; 웪; 웪; 웪; 웪; ) HANGUL SYLLABLE WEGG +C6EB;C6EB;110B 1170 11AA;C6EB;110B 1170 11AA; # (웫; 웫; 웫; 웫; 웫; ) HANGUL SYLLABLE WEGS +C6EC;C6EC;110B 1170 11AB;C6EC;110B 1170 11AB; # (웬; 웬; 웬; 웬; 웬; ) HANGUL SYLLABLE WEN +C6ED;C6ED;110B 1170 11AC;C6ED;110B 1170 11AC; # (웭; 웭; 웭; 웭; 웭; ) HANGUL SYLLABLE WENJ +C6EE;C6EE;110B 1170 11AD;C6EE;110B 1170 11AD; # (웮; 웮; 웮; 웮; 웮; ) HANGUL SYLLABLE WENH +C6EF;C6EF;110B 1170 11AE;C6EF;110B 1170 11AE; # (웯; 웯; 웯; 웯; 웯; ) HANGUL SYLLABLE WED +C6F0;C6F0;110B 1170 11AF;C6F0;110B 1170 11AF; # (웰; 웰; 웰; 웰; 웰; ) HANGUL SYLLABLE WEL +C6F1;C6F1;110B 1170 11B0;C6F1;110B 1170 11B0; # (웱; 웱; 웱; 웱; 웱; ) HANGUL SYLLABLE WELG +C6F2;C6F2;110B 1170 11B1;C6F2;110B 1170 11B1; # (웲; 웲; 웲; 웲; 웲; ) HANGUL SYLLABLE WELM +C6F3;C6F3;110B 1170 11B2;C6F3;110B 1170 11B2; # (웳; 웳; 웳; 웳; 웳; ) HANGUL SYLLABLE WELB +C6F4;C6F4;110B 1170 11B3;C6F4;110B 1170 11B3; # (웴; 웴; 웴; 웴; 웴; ) HANGUL SYLLABLE WELS +C6F5;C6F5;110B 1170 11B4;C6F5;110B 1170 11B4; # (웵; 웵; 웵; 웵; 웵; ) HANGUL SYLLABLE WELT +C6F6;C6F6;110B 1170 11B5;C6F6;110B 1170 11B5; # (웶; 웶; 웶; 웶; 웶; ) HANGUL SYLLABLE WELP +C6F7;C6F7;110B 1170 11B6;C6F7;110B 1170 11B6; # (웷; 웷; 웷; 웷; 웷; ) HANGUL SYLLABLE WELH +C6F8;C6F8;110B 1170 11B7;C6F8;110B 1170 11B7; # (웸; 웸; 웸; 웸; 웸; ) HANGUL SYLLABLE WEM +C6F9;C6F9;110B 1170 11B8;C6F9;110B 1170 11B8; # (웹; 웹; 웹; 웹; 웹; ) HANGUL SYLLABLE WEB +C6FA;C6FA;110B 1170 11B9;C6FA;110B 1170 11B9; # (웺; 웺; 웺; 웺; 웺; ) HANGUL SYLLABLE WEBS +C6FB;C6FB;110B 1170 11BA;C6FB;110B 1170 11BA; # (웻; 웻; 웻; 웻; 웻; ) HANGUL SYLLABLE WES +C6FC;C6FC;110B 1170 11BB;C6FC;110B 1170 11BB; # (웼; 웼; 웼; 웼; 웼; ) HANGUL SYLLABLE WESS +C6FD;C6FD;110B 1170 11BC;C6FD;110B 1170 11BC; # (웽; 웽; 웽; 웽; 웽; ) HANGUL SYLLABLE WENG +C6FE;C6FE;110B 1170 11BD;C6FE;110B 1170 11BD; # (웾; 웾; 웾; 웾; 웾; ) HANGUL SYLLABLE WEJ +C6FF;C6FF;110B 1170 11BE;C6FF;110B 1170 11BE; # (웿; 웿; 웿; 웿; 웿; ) HANGUL SYLLABLE WEC +C700;C700;110B 1170 11BF;C700;110B 1170 11BF; # (윀; 윀; 윀; 윀; 윀; ) HANGUL SYLLABLE WEK +C701;C701;110B 1170 11C0;C701;110B 1170 11C0; # (윁; 윁; 윁; 윁; 윁; ) HANGUL SYLLABLE WET +C702;C702;110B 1170 11C1;C702;110B 1170 11C1; # (윂; 윂; 윂; 윂; 윂; ) HANGUL SYLLABLE WEP +C703;C703;110B 1170 11C2;C703;110B 1170 11C2; # (윃; 윃; 윃; 윃; 윃; ) HANGUL SYLLABLE WEH +C704;C704;110B 1171;C704;110B 1171; # (위; 위; 위; 위; 위; ) HANGUL SYLLABLE WI +C705;C705;110B 1171 11A8;C705;110B 1171 11A8; # (윅; 윅; 윅; 윅; 윅; ) HANGUL SYLLABLE WIG +C706;C706;110B 1171 11A9;C706;110B 1171 11A9; # (윆; 윆; 윆; 윆; 윆; ) HANGUL SYLLABLE WIGG +C707;C707;110B 1171 11AA;C707;110B 1171 11AA; # (윇; 윇; 윇; 윇; 윇; ) HANGUL SYLLABLE WIGS +C708;C708;110B 1171 11AB;C708;110B 1171 11AB; # (윈; 윈; 윈; 윈; 윈; ) HANGUL SYLLABLE WIN +C709;C709;110B 1171 11AC;C709;110B 1171 11AC; # (윉; 윉; 윉; 윉; 윉; ) HANGUL SYLLABLE WINJ +C70A;C70A;110B 1171 11AD;C70A;110B 1171 11AD; # (윊; 윊; 윊; 윊; 윊; ) HANGUL SYLLABLE WINH +C70B;C70B;110B 1171 11AE;C70B;110B 1171 11AE; # (윋; 윋; 윋; 윋; 윋; ) HANGUL SYLLABLE WID +C70C;C70C;110B 1171 11AF;C70C;110B 1171 11AF; # (윌; 윌; 윌; 윌; 윌; ) HANGUL SYLLABLE WIL +C70D;C70D;110B 1171 11B0;C70D;110B 1171 11B0; # (윍; 윍; 윍; 윍; 윍; ) HANGUL SYLLABLE WILG +C70E;C70E;110B 1171 11B1;C70E;110B 1171 11B1; # (윎; 윎; 윎; 윎; 윎; ) HANGUL SYLLABLE WILM +C70F;C70F;110B 1171 11B2;C70F;110B 1171 11B2; # (윏; 윏; 윏; 윏; 윏; ) HANGUL SYLLABLE WILB +C710;C710;110B 1171 11B3;C710;110B 1171 11B3; # (윐; 윐; 윐; 윐; 윐; ) HANGUL SYLLABLE WILS +C711;C711;110B 1171 11B4;C711;110B 1171 11B4; # (윑; 윑; 윑; 윑; 윑; ) HANGUL SYLLABLE WILT +C712;C712;110B 1171 11B5;C712;110B 1171 11B5; # (윒; 윒; 윒; 윒; 윒; ) HANGUL SYLLABLE WILP +C713;C713;110B 1171 11B6;C713;110B 1171 11B6; # (윓; 윓; 윓; 윓; 윓; ) HANGUL SYLLABLE WILH +C714;C714;110B 1171 11B7;C714;110B 1171 11B7; # (윔; 윔; 윔; 윔; 윔; ) HANGUL SYLLABLE WIM +C715;C715;110B 1171 11B8;C715;110B 1171 11B8; # (윕; 윕; 윕; 윕; 윕; ) HANGUL SYLLABLE WIB +C716;C716;110B 1171 11B9;C716;110B 1171 11B9; # (윖; 윖; 윖; 윖; 윖; ) HANGUL SYLLABLE WIBS +C717;C717;110B 1171 11BA;C717;110B 1171 11BA; # (윗; 윗; 윗; 윗; 윗; ) HANGUL SYLLABLE WIS +C718;C718;110B 1171 11BB;C718;110B 1171 11BB; # (윘; 윘; 윘; 윘; 윘; ) HANGUL SYLLABLE WISS +C719;C719;110B 1171 11BC;C719;110B 1171 11BC; # (윙; 윙; 윙; 윙; 윙; ) HANGUL SYLLABLE WING +C71A;C71A;110B 1171 11BD;C71A;110B 1171 11BD; # (윚; 윚; 윚; 윚; 윚; ) HANGUL SYLLABLE WIJ +C71B;C71B;110B 1171 11BE;C71B;110B 1171 11BE; # (윛; 윛; 윛; 윛; 윛; ) HANGUL SYLLABLE WIC +C71C;C71C;110B 1171 11BF;C71C;110B 1171 11BF; # (윜; 윜; 윜; 윜; 윜; ) HANGUL SYLLABLE WIK +C71D;C71D;110B 1171 11C0;C71D;110B 1171 11C0; # (윝; 윝; 윝; 윝; 윝; ) HANGUL SYLLABLE WIT +C71E;C71E;110B 1171 11C1;C71E;110B 1171 11C1; # (윞; 윞; 윞; 윞; 윞; ) HANGUL SYLLABLE WIP +C71F;C71F;110B 1171 11C2;C71F;110B 1171 11C2; # (윟; 윟; 윟; 윟; 윟; ) HANGUL SYLLABLE WIH +C720;C720;110B 1172;C720;110B 1172; # (유; 유; 유; 유; 유; ) HANGUL SYLLABLE YU +C721;C721;110B 1172 11A8;C721;110B 1172 11A8; # (육; 육; 육; 육; 육; ) HANGUL SYLLABLE YUG +C722;C722;110B 1172 11A9;C722;110B 1172 11A9; # (윢; 윢; 윢; 윢; 윢; ) HANGUL SYLLABLE YUGG +C723;C723;110B 1172 11AA;C723;110B 1172 11AA; # (윣; 윣; 윣; 윣; 윣; ) HANGUL SYLLABLE YUGS +C724;C724;110B 1172 11AB;C724;110B 1172 11AB; # (윤; 윤; 윤; 윤; 윤; ) HANGUL SYLLABLE YUN +C725;C725;110B 1172 11AC;C725;110B 1172 11AC; # (윥; 윥; 윥; 윥; 윥; ) HANGUL SYLLABLE YUNJ +C726;C726;110B 1172 11AD;C726;110B 1172 11AD; # (윦; 윦; 윦; 윦; 윦; ) HANGUL SYLLABLE YUNH +C727;C727;110B 1172 11AE;C727;110B 1172 11AE; # (윧; 윧; 윧; 윧; 윧; ) HANGUL SYLLABLE YUD +C728;C728;110B 1172 11AF;C728;110B 1172 11AF; # (율; 율; 율; 율; 율; ) HANGUL SYLLABLE YUL +C729;C729;110B 1172 11B0;C729;110B 1172 11B0; # (윩; 윩; 윩; 윩; 윩; ) HANGUL SYLLABLE YULG +C72A;C72A;110B 1172 11B1;C72A;110B 1172 11B1; # (윪; 윪; 윪; 윪; 윪; ) HANGUL SYLLABLE YULM +C72B;C72B;110B 1172 11B2;C72B;110B 1172 11B2; # (윫; 윫; 윫; 윫; 윫; ) HANGUL SYLLABLE YULB +C72C;C72C;110B 1172 11B3;C72C;110B 1172 11B3; # (윬; 윬; 윬; 윬; 윬; ) HANGUL SYLLABLE YULS +C72D;C72D;110B 1172 11B4;C72D;110B 1172 11B4; # (윭; 윭; 윭; 윭; 윭; ) HANGUL SYLLABLE YULT +C72E;C72E;110B 1172 11B5;C72E;110B 1172 11B5; # (윮; 윮; 윮; 윮; 윮; ) HANGUL SYLLABLE YULP +C72F;C72F;110B 1172 11B6;C72F;110B 1172 11B6; # (윯; 윯; 윯; 윯; 윯; ) HANGUL SYLLABLE YULH +C730;C730;110B 1172 11B7;C730;110B 1172 11B7; # (윰; 윰; 윰; 윰; 윰; ) HANGUL SYLLABLE YUM +C731;C731;110B 1172 11B8;C731;110B 1172 11B8; # (윱; 윱; 윱; 윱; 윱; ) HANGUL SYLLABLE YUB +C732;C732;110B 1172 11B9;C732;110B 1172 11B9; # (윲; 윲; 윲; 윲; 윲; ) HANGUL SYLLABLE YUBS +C733;C733;110B 1172 11BA;C733;110B 1172 11BA; # (윳; 윳; 윳; 윳; 윳; ) HANGUL SYLLABLE YUS +C734;C734;110B 1172 11BB;C734;110B 1172 11BB; # (윴; 윴; 윴; 윴; 윴; ) HANGUL SYLLABLE YUSS +C735;C735;110B 1172 11BC;C735;110B 1172 11BC; # (융; 융; 융; 융; 융; ) HANGUL SYLLABLE YUNG +C736;C736;110B 1172 11BD;C736;110B 1172 11BD; # (윶; 윶; 윶; 윶; 윶; ) HANGUL SYLLABLE YUJ +C737;C737;110B 1172 11BE;C737;110B 1172 11BE; # (윷; 윷; 윷; 윷; 윷; ) HANGUL SYLLABLE YUC +C738;C738;110B 1172 11BF;C738;110B 1172 11BF; # (윸; 윸; 윸; 윸; 윸; ) HANGUL SYLLABLE YUK +C739;C739;110B 1172 11C0;C739;110B 1172 11C0; # (윹; 윹; 윹; 윹; 윹; ) HANGUL SYLLABLE YUT +C73A;C73A;110B 1172 11C1;C73A;110B 1172 11C1; # (윺; 윺; 윺; 윺; 윺; ) HANGUL SYLLABLE YUP +C73B;C73B;110B 1172 11C2;C73B;110B 1172 11C2; # (윻; 윻; 윻; 윻; 윻; ) HANGUL SYLLABLE YUH +C73C;C73C;110B 1173;C73C;110B 1173; # (으; 으; 으; 으; 으; ) HANGUL SYLLABLE EU +C73D;C73D;110B 1173 11A8;C73D;110B 1173 11A8; # (윽; 윽; 윽; 윽; 윽; ) HANGUL SYLLABLE EUG +C73E;C73E;110B 1173 11A9;C73E;110B 1173 11A9; # (윾; 윾; 윾; 윾; 윾; ) HANGUL SYLLABLE EUGG +C73F;C73F;110B 1173 11AA;C73F;110B 1173 11AA; # (윿; 윿; 윿; 윿; 윿; ) HANGUL SYLLABLE EUGS +C740;C740;110B 1173 11AB;C740;110B 1173 11AB; # (은; 은; 은; 은; 은; ) HANGUL SYLLABLE EUN +C741;C741;110B 1173 11AC;C741;110B 1173 11AC; # (읁; 읁; 읁; 읁; 읁; ) HANGUL SYLLABLE EUNJ +C742;C742;110B 1173 11AD;C742;110B 1173 11AD; # (읂; 읂; 읂; 읂; 읂; ) HANGUL SYLLABLE EUNH +C743;C743;110B 1173 11AE;C743;110B 1173 11AE; # (읃; 읃; 읃; 읃; 읃; ) HANGUL SYLLABLE EUD +C744;C744;110B 1173 11AF;C744;110B 1173 11AF; # (을; 을; 을; 을; 을; ) HANGUL SYLLABLE EUL +C745;C745;110B 1173 11B0;C745;110B 1173 11B0; # (읅; 읅; 읅; 읅; 읅; ) HANGUL SYLLABLE EULG +C746;C746;110B 1173 11B1;C746;110B 1173 11B1; # (읆; 읆; 읆; 읆; 읆; ) HANGUL SYLLABLE EULM +C747;C747;110B 1173 11B2;C747;110B 1173 11B2; # (읇; 읇; 읇; 읇; 읇; ) HANGUL SYLLABLE EULB +C748;C748;110B 1173 11B3;C748;110B 1173 11B3; # (읈; 읈; 읈; 읈; 읈; ) HANGUL SYLLABLE EULS +C749;C749;110B 1173 11B4;C749;110B 1173 11B4; # (읉; 읉; 읉; 읉; 읉; ) HANGUL SYLLABLE EULT +C74A;C74A;110B 1173 11B5;C74A;110B 1173 11B5; # (읊; 읊; 읊; 읊; 읊; ) HANGUL SYLLABLE EULP +C74B;C74B;110B 1173 11B6;C74B;110B 1173 11B6; # (읋; 읋; 읋; 읋; 읋; ) HANGUL SYLLABLE EULH +C74C;C74C;110B 1173 11B7;C74C;110B 1173 11B7; # (음; 음; 음; 음; 음; ) HANGUL SYLLABLE EUM +C74D;C74D;110B 1173 11B8;C74D;110B 1173 11B8; # (읍; 읍; 읍; 읍; 읍; ) HANGUL SYLLABLE EUB +C74E;C74E;110B 1173 11B9;C74E;110B 1173 11B9; # (읎; 읎; 읎; 읎; 읎; ) HANGUL SYLLABLE EUBS +C74F;C74F;110B 1173 11BA;C74F;110B 1173 11BA; # (읏; 읏; 읏; 읏; 읏; ) HANGUL SYLLABLE EUS +C750;C750;110B 1173 11BB;C750;110B 1173 11BB; # (읐; 읐; 읐; 읐; 읐; ) HANGUL SYLLABLE EUSS +C751;C751;110B 1173 11BC;C751;110B 1173 11BC; # (응; 응; 응; 응; 응; ) HANGUL SYLLABLE EUNG +C752;C752;110B 1173 11BD;C752;110B 1173 11BD; # (읒; 읒; 읒; 읒; 읒; ) HANGUL SYLLABLE EUJ +C753;C753;110B 1173 11BE;C753;110B 1173 11BE; # (읓; 읓; 읓; 읓; 읓; ) HANGUL SYLLABLE EUC +C754;C754;110B 1173 11BF;C754;110B 1173 11BF; # (읔; 읔; 읔; 읔; 읔; ) HANGUL SYLLABLE EUK +C755;C755;110B 1173 11C0;C755;110B 1173 11C0; # (읕; 읕; 읕; 읕; 읕; ) HANGUL SYLLABLE EUT +C756;C756;110B 1173 11C1;C756;110B 1173 11C1; # (읖; 읖; 읖; 읖; 읖; ) HANGUL SYLLABLE EUP +C757;C757;110B 1173 11C2;C757;110B 1173 11C2; # (읗; 읗; 읗; 읗; 읗; ) HANGUL SYLLABLE EUH +C758;C758;110B 1174;C758;110B 1174; # (의; 의; 의; 의; 의; ) HANGUL SYLLABLE YI +C759;C759;110B 1174 11A8;C759;110B 1174 11A8; # (읙; 읙; 읙; 읙; 읙; ) HANGUL SYLLABLE YIG +C75A;C75A;110B 1174 11A9;C75A;110B 1174 11A9; # (읚; 읚; 읚; 읚; 읚; ) HANGUL SYLLABLE YIGG +C75B;C75B;110B 1174 11AA;C75B;110B 1174 11AA; # (읛; 읛; 읛; 읛; 읛; ) HANGUL SYLLABLE YIGS +C75C;C75C;110B 1174 11AB;C75C;110B 1174 11AB; # (읜; 읜; 읜; 읜; 읜; ) HANGUL SYLLABLE YIN +C75D;C75D;110B 1174 11AC;C75D;110B 1174 11AC; # (읝; 읝; 읝; 읝; 읝; ) HANGUL SYLLABLE YINJ +C75E;C75E;110B 1174 11AD;C75E;110B 1174 11AD; # (읞; 읞; 읞; 읞; 읞; ) HANGUL SYLLABLE YINH +C75F;C75F;110B 1174 11AE;C75F;110B 1174 11AE; # (읟; 읟; 읟; 읟; 읟; ) HANGUL SYLLABLE YID +C760;C760;110B 1174 11AF;C760;110B 1174 11AF; # (읠; 읠; 읠; 읠; 읠; ) HANGUL SYLLABLE YIL +C761;C761;110B 1174 11B0;C761;110B 1174 11B0; # (읡; 읡; 읡; 읡; 읡; ) HANGUL SYLLABLE YILG +C762;C762;110B 1174 11B1;C762;110B 1174 11B1; # (읢; 읢; 읢; 읢; 읢; ) HANGUL SYLLABLE YILM +C763;C763;110B 1174 11B2;C763;110B 1174 11B2; # (읣; 읣; 읣; 읣; 읣; ) HANGUL SYLLABLE YILB +C764;C764;110B 1174 11B3;C764;110B 1174 11B3; # (읤; 읤; 읤; 읤; 읤; ) HANGUL SYLLABLE YILS +C765;C765;110B 1174 11B4;C765;110B 1174 11B4; # (읥; 읥; 읥; 읥; 읥; ) HANGUL SYLLABLE YILT +C766;C766;110B 1174 11B5;C766;110B 1174 11B5; # (읦; 읦; 읦; 읦; 읦; ) HANGUL SYLLABLE YILP +C767;C767;110B 1174 11B6;C767;110B 1174 11B6; # (읧; 읧; 읧; 읧; 읧; ) HANGUL SYLLABLE YILH +C768;C768;110B 1174 11B7;C768;110B 1174 11B7; # (읨; 읨; 읨; 읨; 읨; ) HANGUL SYLLABLE YIM +C769;C769;110B 1174 11B8;C769;110B 1174 11B8; # (읩; 읩; 읩; 읩; 읩; ) HANGUL SYLLABLE YIB +C76A;C76A;110B 1174 11B9;C76A;110B 1174 11B9; # (읪; 읪; 읪; 읪; 읪; ) HANGUL SYLLABLE YIBS +C76B;C76B;110B 1174 11BA;C76B;110B 1174 11BA; # (읫; 읫; 읫; 읫; 읫; ) HANGUL SYLLABLE YIS +C76C;C76C;110B 1174 11BB;C76C;110B 1174 11BB; # (읬; 읬; 읬; 읬; 읬; ) HANGUL SYLLABLE YISS +C76D;C76D;110B 1174 11BC;C76D;110B 1174 11BC; # (읭; 읭; 읭; 읭; 읭; ) HANGUL SYLLABLE YING +C76E;C76E;110B 1174 11BD;C76E;110B 1174 11BD; # (읮; 읮; 읮; 읮; 읮; ) HANGUL SYLLABLE YIJ +C76F;C76F;110B 1174 11BE;C76F;110B 1174 11BE; # (읯; 읯; 읯; 읯; 읯; ) HANGUL SYLLABLE YIC +C770;C770;110B 1174 11BF;C770;110B 1174 11BF; # (읰; 읰; 읰; 읰; 읰; ) HANGUL SYLLABLE YIK +C771;C771;110B 1174 11C0;C771;110B 1174 11C0; # (읱; 읱; 읱; 읱; 읱; ) HANGUL SYLLABLE YIT +C772;C772;110B 1174 11C1;C772;110B 1174 11C1; # (읲; 읲; 읲; 읲; 읲; ) HANGUL SYLLABLE YIP +C773;C773;110B 1174 11C2;C773;110B 1174 11C2; # (읳; 읳; 읳; 읳; 읳; ) HANGUL SYLLABLE YIH +C774;C774;110B 1175;C774;110B 1175; # (이; 이; 이; 이; 이; ) HANGUL SYLLABLE I +C775;C775;110B 1175 11A8;C775;110B 1175 11A8; # (익; 익; 익; 익; 익; ) HANGUL SYLLABLE IG +C776;C776;110B 1175 11A9;C776;110B 1175 11A9; # (읶; 읶; 읶; 읶; 읶; ) HANGUL SYLLABLE IGG +C777;C777;110B 1175 11AA;C777;110B 1175 11AA; # (읷; 읷; 읷; 읷; 읷; ) HANGUL SYLLABLE IGS +C778;C778;110B 1175 11AB;C778;110B 1175 11AB; # (인; 인; 인; 인; 인; ) HANGUL SYLLABLE IN +C779;C779;110B 1175 11AC;C779;110B 1175 11AC; # (읹; 읹; 읹; 읹; 읹; ) HANGUL SYLLABLE INJ +C77A;C77A;110B 1175 11AD;C77A;110B 1175 11AD; # (읺; 읺; 읺; 읺; 읺; ) HANGUL SYLLABLE INH +C77B;C77B;110B 1175 11AE;C77B;110B 1175 11AE; # (읻; 읻; 읻; 읻; 읻; ) HANGUL SYLLABLE ID +C77C;C77C;110B 1175 11AF;C77C;110B 1175 11AF; # (일; 일; 일; 일; 일; ) HANGUL SYLLABLE IL +C77D;C77D;110B 1175 11B0;C77D;110B 1175 11B0; # (읽; 읽; 읽; 읽; 읽; ) HANGUL SYLLABLE ILG +C77E;C77E;110B 1175 11B1;C77E;110B 1175 11B1; # (읾; 읾; 읾; 읾; 읾; ) HANGUL SYLLABLE ILM +C77F;C77F;110B 1175 11B2;C77F;110B 1175 11B2; # (읿; 읿; 읿; 읿; 읿; ) HANGUL SYLLABLE ILB +C780;C780;110B 1175 11B3;C780;110B 1175 11B3; # (잀; 잀; 잀; 잀; 잀; ) HANGUL SYLLABLE ILS +C781;C781;110B 1175 11B4;C781;110B 1175 11B4; # (잁; 잁; 잁; 잁; 잁; ) HANGUL SYLLABLE ILT +C782;C782;110B 1175 11B5;C782;110B 1175 11B5; # (잂; 잂; 잂; 잂; 잂; ) HANGUL SYLLABLE ILP +C783;C783;110B 1175 11B6;C783;110B 1175 11B6; # (잃; 잃; 잃; 잃; 잃; ) HANGUL SYLLABLE ILH +C784;C784;110B 1175 11B7;C784;110B 1175 11B7; # (임; 임; 임; 임; 임; ) HANGUL SYLLABLE IM +C785;C785;110B 1175 11B8;C785;110B 1175 11B8; # (입; 입; 입; 입; 입; ) HANGUL SYLLABLE IB +C786;C786;110B 1175 11B9;C786;110B 1175 11B9; # (잆; 잆; 잆; 잆; 잆; ) HANGUL SYLLABLE IBS +C787;C787;110B 1175 11BA;C787;110B 1175 11BA; # (잇; 잇; 잇; 잇; 잇; ) HANGUL SYLLABLE IS +C788;C788;110B 1175 11BB;C788;110B 1175 11BB; # (있; 있; 있; 있; 있; ) HANGUL SYLLABLE ISS +C789;C789;110B 1175 11BC;C789;110B 1175 11BC; # (잉; 잉; 잉; 잉; 잉; ) HANGUL SYLLABLE ING +C78A;C78A;110B 1175 11BD;C78A;110B 1175 11BD; # (잊; 잊; 잊; 잊; 잊; ) HANGUL SYLLABLE IJ +C78B;C78B;110B 1175 11BE;C78B;110B 1175 11BE; # (잋; 잋; 잋; 잋; 잋; ) HANGUL SYLLABLE IC +C78C;C78C;110B 1175 11BF;C78C;110B 1175 11BF; # (잌; 잌; 잌; 잌; 잌; ) HANGUL SYLLABLE IK +C78D;C78D;110B 1175 11C0;C78D;110B 1175 11C0; # (잍; 잍; 잍; 잍; 잍; ) HANGUL SYLLABLE IT +C78E;C78E;110B 1175 11C1;C78E;110B 1175 11C1; # (잎; 잎; 잎; 잎; 잎; ) HANGUL SYLLABLE IP +C78F;C78F;110B 1175 11C2;C78F;110B 1175 11C2; # (잏; 잏; 잏; 잏; 잏; ) HANGUL SYLLABLE IH +C790;C790;110C 1161;C790;110C 1161; # (자; 자; 자; 자; 자; ) HANGUL SYLLABLE JA +C791;C791;110C 1161 11A8;C791;110C 1161 11A8; # (작; 작; 작; 작; 작; ) HANGUL SYLLABLE JAG +C792;C792;110C 1161 11A9;C792;110C 1161 11A9; # (잒; 잒; 잒; 잒; 잒; ) HANGUL SYLLABLE JAGG +C793;C793;110C 1161 11AA;C793;110C 1161 11AA; # (잓; 잓; 잓; 잓; 잓; ) HANGUL SYLLABLE JAGS +C794;C794;110C 1161 11AB;C794;110C 1161 11AB; # (잔; 잔; 잔; 잔; 잔; ) HANGUL SYLLABLE JAN +C795;C795;110C 1161 11AC;C795;110C 1161 11AC; # (잕; 잕; 잕; 잕; 잕; ) HANGUL SYLLABLE JANJ +C796;C796;110C 1161 11AD;C796;110C 1161 11AD; # (잖; 잖; 잖; 잖; 잖; ) HANGUL SYLLABLE JANH +C797;C797;110C 1161 11AE;C797;110C 1161 11AE; # (잗; 잗; 잗; 잗; 잗; ) HANGUL SYLLABLE JAD +C798;C798;110C 1161 11AF;C798;110C 1161 11AF; # (잘; 잘; 잘; 잘; 잘; ) HANGUL SYLLABLE JAL +C799;C799;110C 1161 11B0;C799;110C 1161 11B0; # (잙; 잙; 잙; 잙; 잙; ) HANGUL SYLLABLE JALG +C79A;C79A;110C 1161 11B1;C79A;110C 1161 11B1; # (잚; 잚; 잚; 잚; 잚; ) HANGUL SYLLABLE JALM +C79B;C79B;110C 1161 11B2;C79B;110C 1161 11B2; # (잛; 잛; 잛; 잛; 잛; ) HANGUL SYLLABLE JALB +C79C;C79C;110C 1161 11B3;C79C;110C 1161 11B3; # (잜; 잜; 잜; 잜; 잜; ) HANGUL SYLLABLE JALS +C79D;C79D;110C 1161 11B4;C79D;110C 1161 11B4; # (잝; 잝; 잝; 잝; 잝; ) HANGUL SYLLABLE JALT +C79E;C79E;110C 1161 11B5;C79E;110C 1161 11B5; # (잞; 잞; 잞; 잞; 잞; ) HANGUL SYLLABLE JALP +C79F;C79F;110C 1161 11B6;C79F;110C 1161 11B6; # (잟; 잟; 잟; 잟; 잟; ) HANGUL SYLLABLE JALH +C7A0;C7A0;110C 1161 11B7;C7A0;110C 1161 11B7; # (잠; 잠; 잠; 잠; 잠; ) HANGUL SYLLABLE JAM +C7A1;C7A1;110C 1161 11B8;C7A1;110C 1161 11B8; # (잡; 잡; 잡; 잡; 잡; ) HANGUL SYLLABLE JAB +C7A2;C7A2;110C 1161 11B9;C7A2;110C 1161 11B9; # (잢; 잢; 잢; 잢; 잢; ) HANGUL SYLLABLE JABS +C7A3;C7A3;110C 1161 11BA;C7A3;110C 1161 11BA; # (잣; 잣; 잣; 잣; 잣; ) HANGUL SYLLABLE JAS +C7A4;C7A4;110C 1161 11BB;C7A4;110C 1161 11BB; # (잤; 잤; 잤; 잤; 잤; ) HANGUL SYLLABLE JASS +C7A5;C7A5;110C 1161 11BC;C7A5;110C 1161 11BC; # (장; 장; 장; 장; 장; ) HANGUL SYLLABLE JANG +C7A6;C7A6;110C 1161 11BD;C7A6;110C 1161 11BD; # (잦; 잦; 잦; 잦; 잦; ) HANGUL SYLLABLE JAJ +C7A7;C7A7;110C 1161 11BE;C7A7;110C 1161 11BE; # (잧; 잧; 잧; 잧; 잧; ) HANGUL SYLLABLE JAC +C7A8;C7A8;110C 1161 11BF;C7A8;110C 1161 11BF; # (잨; 잨; 잨; 잨; 잨; ) HANGUL SYLLABLE JAK +C7A9;C7A9;110C 1161 11C0;C7A9;110C 1161 11C0; # (잩; 잩; 잩; 잩; 잩; ) HANGUL SYLLABLE JAT +C7AA;C7AA;110C 1161 11C1;C7AA;110C 1161 11C1; # (잪; 잪; 잪; 잪; 잪; ) HANGUL SYLLABLE JAP +C7AB;C7AB;110C 1161 11C2;C7AB;110C 1161 11C2; # (잫; 잫; 잫; 잫; 잫; ) HANGUL SYLLABLE JAH +C7AC;C7AC;110C 1162;C7AC;110C 1162; # (재; 재; 재; 재; 재; ) HANGUL SYLLABLE JAE +C7AD;C7AD;110C 1162 11A8;C7AD;110C 1162 11A8; # (잭; 잭; 잭; 잭; 잭; ) HANGUL SYLLABLE JAEG +C7AE;C7AE;110C 1162 11A9;C7AE;110C 1162 11A9; # (잮; 잮; 잮; 잮; 잮; ) HANGUL SYLLABLE JAEGG +C7AF;C7AF;110C 1162 11AA;C7AF;110C 1162 11AA; # (잯; 잯; 잯; 잯; 잯; ) HANGUL SYLLABLE JAEGS +C7B0;C7B0;110C 1162 11AB;C7B0;110C 1162 11AB; # (잰; 잰; 잰; 잰; 잰; ) HANGUL SYLLABLE JAEN +C7B1;C7B1;110C 1162 11AC;C7B1;110C 1162 11AC; # (잱; 잱; 잱; 잱; 잱; ) HANGUL SYLLABLE JAENJ +C7B2;C7B2;110C 1162 11AD;C7B2;110C 1162 11AD; # (잲; 잲; 잲; 잲; 잲; ) HANGUL SYLLABLE JAENH +C7B3;C7B3;110C 1162 11AE;C7B3;110C 1162 11AE; # (잳; 잳; 잳; 잳; 잳; ) HANGUL SYLLABLE JAED +C7B4;C7B4;110C 1162 11AF;C7B4;110C 1162 11AF; # (잴; 잴; 잴; 잴; 잴; ) HANGUL SYLLABLE JAEL +C7B5;C7B5;110C 1162 11B0;C7B5;110C 1162 11B0; # (잵; 잵; 잵; 잵; 잵; ) HANGUL SYLLABLE JAELG +C7B6;C7B6;110C 1162 11B1;C7B6;110C 1162 11B1; # (잶; 잶; 잶; 잶; 잶; ) HANGUL SYLLABLE JAELM +C7B7;C7B7;110C 1162 11B2;C7B7;110C 1162 11B2; # (잷; 잷; 잷; 잷; 잷; ) HANGUL SYLLABLE JAELB +C7B8;C7B8;110C 1162 11B3;C7B8;110C 1162 11B3; # (잸; 잸; 잸; 잸; 잸; ) HANGUL SYLLABLE JAELS +C7B9;C7B9;110C 1162 11B4;C7B9;110C 1162 11B4; # (잹; 잹; 잹; 잹; 잹; ) HANGUL SYLLABLE JAELT +C7BA;C7BA;110C 1162 11B5;C7BA;110C 1162 11B5; # (잺; 잺; 잺; 잺; 잺; ) HANGUL SYLLABLE JAELP +C7BB;C7BB;110C 1162 11B6;C7BB;110C 1162 11B6; # (잻; 잻; 잻; 잻; 잻; ) HANGUL SYLLABLE JAELH +C7BC;C7BC;110C 1162 11B7;C7BC;110C 1162 11B7; # (잼; 잼; 잼; 잼; 잼; ) HANGUL SYLLABLE JAEM +C7BD;C7BD;110C 1162 11B8;C7BD;110C 1162 11B8; # (잽; 잽; 잽; 잽; 잽; ) HANGUL SYLLABLE JAEB +C7BE;C7BE;110C 1162 11B9;C7BE;110C 1162 11B9; # (잾; 잾; 잾; 잾; 잾; ) HANGUL SYLLABLE JAEBS +C7BF;C7BF;110C 1162 11BA;C7BF;110C 1162 11BA; # (잿; 잿; 잿; 잿; 잿; ) HANGUL SYLLABLE JAES +C7C0;C7C0;110C 1162 11BB;C7C0;110C 1162 11BB; # (쟀; 쟀; 쟀; 쟀; 쟀; ) HANGUL SYLLABLE JAESS +C7C1;C7C1;110C 1162 11BC;C7C1;110C 1162 11BC; # (쟁; 쟁; 쟁; 쟁; 쟁; ) HANGUL SYLLABLE JAENG +C7C2;C7C2;110C 1162 11BD;C7C2;110C 1162 11BD; # (쟂; 쟂; 쟂; 쟂; 쟂; ) HANGUL SYLLABLE JAEJ +C7C3;C7C3;110C 1162 11BE;C7C3;110C 1162 11BE; # (쟃; 쟃; 쟃; 쟃; 쟃; ) HANGUL SYLLABLE JAEC +C7C4;C7C4;110C 1162 11BF;C7C4;110C 1162 11BF; # (쟄; 쟄; 쟄; 쟄; 쟄; ) HANGUL SYLLABLE JAEK +C7C5;C7C5;110C 1162 11C0;C7C5;110C 1162 11C0; # (쟅; 쟅; 쟅; 쟅; 쟅; ) HANGUL SYLLABLE JAET +C7C6;C7C6;110C 1162 11C1;C7C6;110C 1162 11C1; # (쟆; 쟆; 쟆; 쟆; 쟆; ) HANGUL SYLLABLE JAEP +C7C7;C7C7;110C 1162 11C2;C7C7;110C 1162 11C2; # (쟇; 쟇; 쟇; 쟇; 쟇; ) HANGUL SYLLABLE JAEH +C7C8;C7C8;110C 1163;C7C8;110C 1163; # (쟈; 쟈; 쟈; 쟈; 쟈; ) HANGUL SYLLABLE JYA +C7C9;C7C9;110C 1163 11A8;C7C9;110C 1163 11A8; # (쟉; 쟉; 쟉; 쟉; 쟉; ) HANGUL SYLLABLE JYAG +C7CA;C7CA;110C 1163 11A9;C7CA;110C 1163 11A9; # (쟊; 쟊; 쟊; 쟊; 쟊; ) HANGUL SYLLABLE JYAGG +C7CB;C7CB;110C 1163 11AA;C7CB;110C 1163 11AA; # (쟋; 쟋; 쟋; 쟋; 쟋; ) HANGUL SYLLABLE JYAGS +C7CC;C7CC;110C 1163 11AB;C7CC;110C 1163 11AB; # (쟌; 쟌; 쟌; 쟌; 쟌; ) HANGUL SYLLABLE JYAN +C7CD;C7CD;110C 1163 11AC;C7CD;110C 1163 11AC; # (쟍; 쟍; 쟍; 쟍; 쟍; ) HANGUL SYLLABLE JYANJ +C7CE;C7CE;110C 1163 11AD;C7CE;110C 1163 11AD; # (쟎; 쟎; 쟎; 쟎; 쟎; ) HANGUL SYLLABLE JYANH +C7CF;C7CF;110C 1163 11AE;C7CF;110C 1163 11AE; # (쟏; 쟏; 쟏; 쟏; 쟏; ) HANGUL SYLLABLE JYAD +C7D0;C7D0;110C 1163 11AF;C7D0;110C 1163 11AF; # (쟐; 쟐; 쟐; 쟐; 쟐; ) HANGUL SYLLABLE JYAL +C7D1;C7D1;110C 1163 11B0;C7D1;110C 1163 11B0; # (쟑; 쟑; 쟑; 쟑; 쟑; ) HANGUL SYLLABLE JYALG +C7D2;C7D2;110C 1163 11B1;C7D2;110C 1163 11B1; # (쟒; 쟒; 쟒; 쟒; 쟒; ) HANGUL SYLLABLE JYALM +C7D3;C7D3;110C 1163 11B2;C7D3;110C 1163 11B2; # (쟓; 쟓; 쟓; 쟓; 쟓; ) HANGUL SYLLABLE JYALB +C7D4;C7D4;110C 1163 11B3;C7D4;110C 1163 11B3; # (쟔; 쟔; 쟔; 쟔; 쟔; ) HANGUL SYLLABLE JYALS +C7D5;C7D5;110C 1163 11B4;C7D5;110C 1163 11B4; # (쟕; 쟕; 쟕; 쟕; 쟕; ) HANGUL SYLLABLE JYALT +C7D6;C7D6;110C 1163 11B5;C7D6;110C 1163 11B5; # (쟖; 쟖; 쟖; 쟖; 쟖; ) HANGUL SYLLABLE JYALP +C7D7;C7D7;110C 1163 11B6;C7D7;110C 1163 11B6; # (쟗; 쟗; 쟗; 쟗; 쟗; ) HANGUL SYLLABLE JYALH +C7D8;C7D8;110C 1163 11B7;C7D8;110C 1163 11B7; # (쟘; 쟘; 쟘; 쟘; 쟘; ) HANGUL SYLLABLE JYAM +C7D9;C7D9;110C 1163 11B8;C7D9;110C 1163 11B8; # (쟙; 쟙; 쟙; 쟙; 쟙; ) HANGUL SYLLABLE JYAB +C7DA;C7DA;110C 1163 11B9;C7DA;110C 1163 11B9; # (쟚; 쟚; 쟚; 쟚; 쟚; ) HANGUL SYLLABLE JYABS +C7DB;C7DB;110C 1163 11BA;C7DB;110C 1163 11BA; # (쟛; 쟛; 쟛; 쟛; 쟛; ) HANGUL SYLLABLE JYAS +C7DC;C7DC;110C 1163 11BB;C7DC;110C 1163 11BB; # (쟜; 쟜; 쟜; 쟜; 쟜; ) HANGUL SYLLABLE JYASS +C7DD;C7DD;110C 1163 11BC;C7DD;110C 1163 11BC; # (쟝; 쟝; 쟝; 쟝; 쟝; ) HANGUL SYLLABLE JYANG +C7DE;C7DE;110C 1163 11BD;C7DE;110C 1163 11BD; # (쟞; 쟞; 쟞; 쟞; 쟞; ) HANGUL SYLLABLE JYAJ +C7DF;C7DF;110C 1163 11BE;C7DF;110C 1163 11BE; # (쟟; 쟟; 쟟; 쟟; 쟟; ) HANGUL SYLLABLE JYAC +C7E0;C7E0;110C 1163 11BF;C7E0;110C 1163 11BF; # (쟠; 쟠; 쟠; 쟠; 쟠; ) HANGUL SYLLABLE JYAK +C7E1;C7E1;110C 1163 11C0;C7E1;110C 1163 11C0; # (쟡; 쟡; 쟡; 쟡; 쟡; ) HANGUL SYLLABLE JYAT +C7E2;C7E2;110C 1163 11C1;C7E2;110C 1163 11C1; # (쟢; 쟢; 쟢; 쟢; 쟢; ) HANGUL SYLLABLE JYAP +C7E3;C7E3;110C 1163 11C2;C7E3;110C 1163 11C2; # (쟣; 쟣; 쟣; 쟣; 쟣; ) HANGUL SYLLABLE JYAH +C7E4;C7E4;110C 1164;C7E4;110C 1164; # (쟤; 쟤; 쟤; 쟤; 쟤; ) HANGUL SYLLABLE JYAE +C7E5;C7E5;110C 1164 11A8;C7E5;110C 1164 11A8; # (쟥; 쟥; 쟥; 쟥; 쟥; ) HANGUL SYLLABLE JYAEG +C7E6;C7E6;110C 1164 11A9;C7E6;110C 1164 11A9; # (쟦; 쟦; 쟦; 쟦; 쟦; ) HANGUL SYLLABLE JYAEGG +C7E7;C7E7;110C 1164 11AA;C7E7;110C 1164 11AA; # (쟧; 쟧; 쟧; 쟧; 쟧; ) HANGUL SYLLABLE JYAEGS +C7E8;C7E8;110C 1164 11AB;C7E8;110C 1164 11AB; # (쟨; 쟨; 쟨; 쟨; 쟨; ) HANGUL SYLLABLE JYAEN +C7E9;C7E9;110C 1164 11AC;C7E9;110C 1164 11AC; # (쟩; 쟩; 쟩; 쟩; 쟩; ) HANGUL SYLLABLE JYAENJ +C7EA;C7EA;110C 1164 11AD;C7EA;110C 1164 11AD; # (쟪; 쟪; 쟪; 쟪; 쟪; ) HANGUL SYLLABLE JYAENH +C7EB;C7EB;110C 1164 11AE;C7EB;110C 1164 11AE; # (쟫; 쟫; 쟫; 쟫; 쟫; ) HANGUL SYLLABLE JYAED +C7EC;C7EC;110C 1164 11AF;C7EC;110C 1164 11AF; # (쟬; 쟬; 쟬; 쟬; 쟬; ) HANGUL SYLLABLE JYAEL +C7ED;C7ED;110C 1164 11B0;C7ED;110C 1164 11B0; # (쟭; 쟭; 쟭; 쟭; 쟭; ) HANGUL SYLLABLE JYAELG +C7EE;C7EE;110C 1164 11B1;C7EE;110C 1164 11B1; # (쟮; 쟮; 쟮; 쟮; 쟮; ) HANGUL SYLLABLE JYAELM +C7EF;C7EF;110C 1164 11B2;C7EF;110C 1164 11B2; # (쟯; 쟯; 쟯; 쟯; 쟯; ) HANGUL SYLLABLE JYAELB +C7F0;C7F0;110C 1164 11B3;C7F0;110C 1164 11B3; # (쟰; 쟰; 쟰; 쟰; 쟰; ) HANGUL SYLLABLE JYAELS +C7F1;C7F1;110C 1164 11B4;C7F1;110C 1164 11B4; # (쟱; 쟱; 쟱; 쟱; 쟱; ) HANGUL SYLLABLE JYAELT +C7F2;C7F2;110C 1164 11B5;C7F2;110C 1164 11B5; # (쟲; 쟲; 쟲; 쟲; 쟲; ) HANGUL SYLLABLE JYAELP +C7F3;C7F3;110C 1164 11B6;C7F3;110C 1164 11B6; # (쟳; 쟳; 쟳; 쟳; 쟳; ) HANGUL SYLLABLE JYAELH +C7F4;C7F4;110C 1164 11B7;C7F4;110C 1164 11B7; # (쟴; 쟴; 쟴; 쟴; 쟴; ) HANGUL SYLLABLE JYAEM +C7F5;C7F5;110C 1164 11B8;C7F5;110C 1164 11B8; # (쟵; 쟵; 쟵; 쟵; 쟵; ) HANGUL SYLLABLE JYAEB +C7F6;C7F6;110C 1164 11B9;C7F6;110C 1164 11B9; # (쟶; 쟶; 쟶; 쟶; 쟶; ) HANGUL SYLLABLE JYAEBS +C7F7;C7F7;110C 1164 11BA;C7F7;110C 1164 11BA; # (쟷; 쟷; 쟷; 쟷; 쟷; ) HANGUL SYLLABLE JYAES +C7F8;C7F8;110C 1164 11BB;C7F8;110C 1164 11BB; # (쟸; 쟸; 쟸; 쟸; 쟸; ) HANGUL SYLLABLE JYAESS +C7F9;C7F9;110C 1164 11BC;C7F9;110C 1164 11BC; # (쟹; 쟹; 쟹; 쟹; 쟹; ) HANGUL SYLLABLE JYAENG +C7FA;C7FA;110C 1164 11BD;C7FA;110C 1164 11BD; # (쟺; 쟺; 쟺; 쟺; 쟺; ) HANGUL SYLLABLE JYAEJ +C7FB;C7FB;110C 1164 11BE;C7FB;110C 1164 11BE; # (쟻; 쟻; 쟻; 쟻; 쟻; ) HANGUL SYLLABLE JYAEC +C7FC;C7FC;110C 1164 11BF;C7FC;110C 1164 11BF; # (쟼; 쟼; 쟼; 쟼; 쟼; ) HANGUL SYLLABLE JYAEK +C7FD;C7FD;110C 1164 11C0;C7FD;110C 1164 11C0; # (쟽; 쟽; 쟽; 쟽; 쟽; ) HANGUL SYLLABLE JYAET +C7FE;C7FE;110C 1164 11C1;C7FE;110C 1164 11C1; # (쟾; 쟾; 쟾; 쟾; 쟾; ) HANGUL SYLLABLE JYAEP +C7FF;C7FF;110C 1164 11C2;C7FF;110C 1164 11C2; # (쟿; 쟿; 쟿; 쟿; 쟿; ) HANGUL SYLLABLE JYAEH +C800;C800;110C 1165;C800;110C 1165; # (저; 저; 저; 저; 저; ) HANGUL SYLLABLE JEO +C801;C801;110C 1165 11A8;C801;110C 1165 11A8; # (적; 적; 적; 적; 적; ) HANGUL SYLLABLE JEOG +C802;C802;110C 1165 11A9;C802;110C 1165 11A9; # (젂; 젂; 젂; 젂; 젂; ) HANGUL SYLLABLE JEOGG +C803;C803;110C 1165 11AA;C803;110C 1165 11AA; # (젃; 젃; 젃; 젃; 젃; ) HANGUL SYLLABLE JEOGS +C804;C804;110C 1165 11AB;C804;110C 1165 11AB; # (전; 전; 전; 전; 전; ) HANGUL SYLLABLE JEON +C805;C805;110C 1165 11AC;C805;110C 1165 11AC; # (젅; 젅; 젅; 젅; 젅; ) HANGUL SYLLABLE JEONJ +C806;C806;110C 1165 11AD;C806;110C 1165 11AD; # (젆; 젆; 젆; 젆; 젆; ) HANGUL SYLLABLE JEONH +C807;C807;110C 1165 11AE;C807;110C 1165 11AE; # (젇; 젇; 젇; 젇; 젇; ) HANGUL SYLLABLE JEOD +C808;C808;110C 1165 11AF;C808;110C 1165 11AF; # (절; 절; 절; 절; 절; ) HANGUL SYLLABLE JEOL +C809;C809;110C 1165 11B0;C809;110C 1165 11B0; # (젉; 젉; 젉; 젉; 젉; ) HANGUL SYLLABLE JEOLG +C80A;C80A;110C 1165 11B1;C80A;110C 1165 11B1; # (젊; 젊; 젊; 젊; 젊; ) HANGUL SYLLABLE JEOLM +C80B;C80B;110C 1165 11B2;C80B;110C 1165 11B2; # (젋; 젋; 젋; 젋; 젋; ) HANGUL SYLLABLE JEOLB +C80C;C80C;110C 1165 11B3;C80C;110C 1165 11B3; # (젌; 젌; 젌; 젌; 젌; ) HANGUL SYLLABLE JEOLS +C80D;C80D;110C 1165 11B4;C80D;110C 1165 11B4; # (젍; 젍; 젍; 젍; 젍; ) HANGUL SYLLABLE JEOLT +C80E;C80E;110C 1165 11B5;C80E;110C 1165 11B5; # (젎; 젎; 젎; 젎; 젎; ) HANGUL SYLLABLE JEOLP +C80F;C80F;110C 1165 11B6;C80F;110C 1165 11B6; # (젏; 젏; 젏; 젏; 젏; ) HANGUL SYLLABLE JEOLH +C810;C810;110C 1165 11B7;C810;110C 1165 11B7; # (점; 점; 점; 점; 점; ) HANGUL SYLLABLE JEOM +C811;C811;110C 1165 11B8;C811;110C 1165 11B8; # (접; 접; 접; 접; 접; ) HANGUL SYLLABLE JEOB +C812;C812;110C 1165 11B9;C812;110C 1165 11B9; # (젒; 젒; 젒; 젒; 젒; ) HANGUL SYLLABLE JEOBS +C813;C813;110C 1165 11BA;C813;110C 1165 11BA; # (젓; 젓; 젓; 젓; 젓; ) HANGUL SYLLABLE JEOS +C814;C814;110C 1165 11BB;C814;110C 1165 11BB; # (젔; 젔; 젔; 젔; 젔; ) HANGUL SYLLABLE JEOSS +C815;C815;110C 1165 11BC;C815;110C 1165 11BC; # (정; 정; 정; 정; 정; ) HANGUL SYLLABLE JEONG +C816;C816;110C 1165 11BD;C816;110C 1165 11BD; # (젖; 젖; 젖; 젖; 젖; ) HANGUL SYLLABLE JEOJ +C817;C817;110C 1165 11BE;C817;110C 1165 11BE; # (젗; 젗; 젗; 젗; 젗; ) HANGUL SYLLABLE JEOC +C818;C818;110C 1165 11BF;C818;110C 1165 11BF; # (젘; 젘; 젘; 젘; 젘; ) HANGUL SYLLABLE JEOK +C819;C819;110C 1165 11C0;C819;110C 1165 11C0; # (젙; 젙; 젙; 젙; 젙; ) HANGUL SYLLABLE JEOT +C81A;C81A;110C 1165 11C1;C81A;110C 1165 11C1; # (젚; 젚; 젚; 젚; 젚; ) HANGUL SYLLABLE JEOP +C81B;C81B;110C 1165 11C2;C81B;110C 1165 11C2; # (젛; 젛; 젛; 젛; 젛; ) HANGUL SYLLABLE JEOH +C81C;C81C;110C 1166;C81C;110C 1166; # (제; 제; 제; 제; 제; ) HANGUL SYLLABLE JE +C81D;C81D;110C 1166 11A8;C81D;110C 1166 11A8; # (젝; 젝; 젝; 젝; 젝; ) HANGUL SYLLABLE JEG +C81E;C81E;110C 1166 11A9;C81E;110C 1166 11A9; # (젞; 젞; 젞; 젞; 젞; ) HANGUL SYLLABLE JEGG +C81F;C81F;110C 1166 11AA;C81F;110C 1166 11AA; # (젟; 젟; 젟; 젟; 젟; ) HANGUL SYLLABLE JEGS +C820;C820;110C 1166 11AB;C820;110C 1166 11AB; # (젠; 젠; 젠; 젠; 젠; ) HANGUL SYLLABLE JEN +C821;C821;110C 1166 11AC;C821;110C 1166 11AC; # (젡; 젡; 젡; 젡; 젡; ) HANGUL SYLLABLE JENJ +C822;C822;110C 1166 11AD;C822;110C 1166 11AD; # (젢; 젢; 젢; 젢; 젢; ) HANGUL SYLLABLE JENH +C823;C823;110C 1166 11AE;C823;110C 1166 11AE; # (젣; 젣; 젣; 젣; 젣; ) HANGUL SYLLABLE JED +C824;C824;110C 1166 11AF;C824;110C 1166 11AF; # (젤; 젤; 젤; 젤; 젤; ) HANGUL SYLLABLE JEL +C825;C825;110C 1166 11B0;C825;110C 1166 11B0; # (젥; 젥; 젥; 젥; 젥; ) HANGUL SYLLABLE JELG +C826;C826;110C 1166 11B1;C826;110C 1166 11B1; # (젦; 젦; 젦; 젦; 젦; ) HANGUL SYLLABLE JELM +C827;C827;110C 1166 11B2;C827;110C 1166 11B2; # (젧; 젧; 젧; 젧; 젧; ) HANGUL SYLLABLE JELB +C828;C828;110C 1166 11B3;C828;110C 1166 11B3; # (젨; 젨; 젨; 젨; 젨; ) HANGUL SYLLABLE JELS +C829;C829;110C 1166 11B4;C829;110C 1166 11B4; # (젩; 젩; 젩; 젩; 젩; ) HANGUL SYLLABLE JELT +C82A;C82A;110C 1166 11B5;C82A;110C 1166 11B5; # (젪; 젪; 젪; 젪; 젪; ) HANGUL SYLLABLE JELP +C82B;C82B;110C 1166 11B6;C82B;110C 1166 11B6; # (젫; 젫; 젫; 젫; 젫; ) HANGUL SYLLABLE JELH +C82C;C82C;110C 1166 11B7;C82C;110C 1166 11B7; # (젬; 젬; 젬; 젬; 젬; ) HANGUL SYLLABLE JEM +C82D;C82D;110C 1166 11B8;C82D;110C 1166 11B8; # (젭; 젭; 젭; 젭; 젭; ) HANGUL SYLLABLE JEB +C82E;C82E;110C 1166 11B9;C82E;110C 1166 11B9; # (젮; 젮; 젮; 젮; 젮; ) HANGUL SYLLABLE JEBS +C82F;C82F;110C 1166 11BA;C82F;110C 1166 11BA; # (젯; 젯; 젯; 젯; 젯; ) HANGUL SYLLABLE JES +C830;C830;110C 1166 11BB;C830;110C 1166 11BB; # (젰; 젰; 젰; 젰; 젰; ) HANGUL SYLLABLE JESS +C831;C831;110C 1166 11BC;C831;110C 1166 11BC; # (젱; 젱; 젱; 젱; 젱; ) HANGUL SYLLABLE JENG +C832;C832;110C 1166 11BD;C832;110C 1166 11BD; # (젲; 젲; 젲; 젲; 젲; ) HANGUL SYLLABLE JEJ +C833;C833;110C 1166 11BE;C833;110C 1166 11BE; # (젳; 젳; 젳; 젳; 젳; ) HANGUL SYLLABLE JEC +C834;C834;110C 1166 11BF;C834;110C 1166 11BF; # (젴; 젴; 젴; 젴; 젴; ) HANGUL SYLLABLE JEK +C835;C835;110C 1166 11C0;C835;110C 1166 11C0; # (젵; 젵; 젵; 젵; 젵; ) HANGUL SYLLABLE JET +C836;C836;110C 1166 11C1;C836;110C 1166 11C1; # (젶; 젶; 젶; 젶; 젶; ) HANGUL SYLLABLE JEP +C837;C837;110C 1166 11C2;C837;110C 1166 11C2; # (젷; 젷; 젷; 젷; 젷; ) HANGUL SYLLABLE JEH +C838;C838;110C 1167;C838;110C 1167; # (져; 져; 져; 져; 져; ) HANGUL SYLLABLE JYEO +C839;C839;110C 1167 11A8;C839;110C 1167 11A8; # (젹; 젹; 젹; 젹; 젹; ) HANGUL SYLLABLE JYEOG +C83A;C83A;110C 1167 11A9;C83A;110C 1167 11A9; # (젺; 젺; 젺; 젺; 젺; ) HANGUL SYLLABLE JYEOGG +C83B;C83B;110C 1167 11AA;C83B;110C 1167 11AA; # (젻; 젻; 젻; 젻; 젻; ) HANGUL SYLLABLE JYEOGS +C83C;C83C;110C 1167 11AB;C83C;110C 1167 11AB; # (젼; 젼; 젼; 젼; 젼; ) HANGUL SYLLABLE JYEON +C83D;C83D;110C 1167 11AC;C83D;110C 1167 11AC; # (젽; 젽; 젽; 젽; 젽; ) HANGUL SYLLABLE JYEONJ +C83E;C83E;110C 1167 11AD;C83E;110C 1167 11AD; # (젾; 젾; 젾; 젾; 젾; ) HANGUL SYLLABLE JYEONH +C83F;C83F;110C 1167 11AE;C83F;110C 1167 11AE; # (젿; 젿; 젿; 젿; 젿; ) HANGUL SYLLABLE JYEOD +C840;C840;110C 1167 11AF;C840;110C 1167 11AF; # (졀; 졀; 졀; 졀; 졀; ) HANGUL SYLLABLE JYEOL +C841;C841;110C 1167 11B0;C841;110C 1167 11B0; # (졁; 졁; 졁; 졁; 졁; ) HANGUL SYLLABLE JYEOLG +C842;C842;110C 1167 11B1;C842;110C 1167 11B1; # (졂; 졂; 졂; 졂; 졂; ) HANGUL SYLLABLE JYEOLM +C843;C843;110C 1167 11B2;C843;110C 1167 11B2; # (졃; 졃; 졃; 졃; 졃; ) HANGUL SYLLABLE JYEOLB +C844;C844;110C 1167 11B3;C844;110C 1167 11B3; # (졄; 졄; 졄; 졄; 졄; ) HANGUL SYLLABLE JYEOLS +C845;C845;110C 1167 11B4;C845;110C 1167 11B4; # (졅; 졅; 졅; 졅; 졅; ) HANGUL SYLLABLE JYEOLT +C846;C846;110C 1167 11B5;C846;110C 1167 11B5; # (졆; 졆; 졆; 졆; 졆; ) HANGUL SYLLABLE JYEOLP +C847;C847;110C 1167 11B6;C847;110C 1167 11B6; # (졇; 졇; 졇; 졇; 졇; ) HANGUL SYLLABLE JYEOLH +C848;C848;110C 1167 11B7;C848;110C 1167 11B7; # (졈; 졈; 졈; 졈; 졈; ) HANGUL SYLLABLE JYEOM +C849;C849;110C 1167 11B8;C849;110C 1167 11B8; # (졉; 졉; 졉; 졉; 졉; ) HANGUL SYLLABLE JYEOB +C84A;C84A;110C 1167 11B9;C84A;110C 1167 11B9; # (졊; 졊; 졊; 졊; 졊; ) HANGUL SYLLABLE JYEOBS +C84B;C84B;110C 1167 11BA;C84B;110C 1167 11BA; # (졋; 졋; 졋; 졋; 졋; ) HANGUL SYLLABLE JYEOS +C84C;C84C;110C 1167 11BB;C84C;110C 1167 11BB; # (졌; 졌; 졌; 졌; 졌; ) HANGUL SYLLABLE JYEOSS +C84D;C84D;110C 1167 11BC;C84D;110C 1167 11BC; # (졍; 졍; 졍; 졍; 졍; ) HANGUL SYLLABLE JYEONG +C84E;C84E;110C 1167 11BD;C84E;110C 1167 11BD; # (졎; 졎; 졎; 졎; 졎; ) HANGUL SYLLABLE JYEOJ +C84F;C84F;110C 1167 11BE;C84F;110C 1167 11BE; # (졏; 졏; 졏; 졏; 졏; ) HANGUL SYLLABLE JYEOC +C850;C850;110C 1167 11BF;C850;110C 1167 11BF; # (졐; 졐; 졐; 졐; 졐; ) HANGUL SYLLABLE JYEOK +C851;C851;110C 1167 11C0;C851;110C 1167 11C0; # (졑; 졑; 졑; 졑; 졑; ) HANGUL SYLLABLE JYEOT +C852;C852;110C 1167 11C1;C852;110C 1167 11C1; # (졒; 졒; 졒; 졒; 졒; ) HANGUL SYLLABLE JYEOP +C853;C853;110C 1167 11C2;C853;110C 1167 11C2; # (졓; 졓; 졓; 졓; 졓; ) HANGUL SYLLABLE JYEOH +C854;C854;110C 1168;C854;110C 1168; # (졔; 졔; 졔; 졔; 졔; ) HANGUL SYLLABLE JYE +C855;C855;110C 1168 11A8;C855;110C 1168 11A8; # (졕; 졕; 졕; 졕; 졕; ) HANGUL SYLLABLE JYEG +C856;C856;110C 1168 11A9;C856;110C 1168 11A9; # (졖; 졖; 졖; 졖; 졖; ) HANGUL SYLLABLE JYEGG +C857;C857;110C 1168 11AA;C857;110C 1168 11AA; # (졗; 졗; 졗; 졗; 졗; ) HANGUL SYLLABLE JYEGS +C858;C858;110C 1168 11AB;C858;110C 1168 11AB; # (졘; 졘; 졘; 졘; 졘; ) HANGUL SYLLABLE JYEN +C859;C859;110C 1168 11AC;C859;110C 1168 11AC; # (졙; 졙; 졙; 졙; 졙; ) HANGUL SYLLABLE JYENJ +C85A;C85A;110C 1168 11AD;C85A;110C 1168 11AD; # (졚; 졚; 졚; 졚; 졚; ) HANGUL SYLLABLE JYENH +C85B;C85B;110C 1168 11AE;C85B;110C 1168 11AE; # (졛; 졛; 졛; 졛; 졛; ) HANGUL SYLLABLE JYED +C85C;C85C;110C 1168 11AF;C85C;110C 1168 11AF; # (졜; 졜; 졜; 졜; 졜; ) HANGUL SYLLABLE JYEL +C85D;C85D;110C 1168 11B0;C85D;110C 1168 11B0; # (졝; 졝; 졝; 졝; 졝; ) HANGUL SYLLABLE JYELG +C85E;C85E;110C 1168 11B1;C85E;110C 1168 11B1; # (졞; 졞; 졞; 졞; 졞; ) HANGUL SYLLABLE JYELM +C85F;C85F;110C 1168 11B2;C85F;110C 1168 11B2; # (졟; 졟; 졟; 졟; 졟; ) HANGUL SYLLABLE JYELB +C860;C860;110C 1168 11B3;C860;110C 1168 11B3; # (졠; 졠; 졠; 졠; 졠; ) HANGUL SYLLABLE JYELS +C861;C861;110C 1168 11B4;C861;110C 1168 11B4; # (졡; 졡; 졡; 졡; 졡; ) HANGUL SYLLABLE JYELT +C862;C862;110C 1168 11B5;C862;110C 1168 11B5; # (졢; 졢; 졢; 졢; 졢; ) HANGUL SYLLABLE JYELP +C863;C863;110C 1168 11B6;C863;110C 1168 11B6; # (졣; 졣; 졣; 졣; 졣; ) HANGUL SYLLABLE JYELH +C864;C864;110C 1168 11B7;C864;110C 1168 11B7; # (졤; 졤; 졤; 졤; 졤; ) HANGUL SYLLABLE JYEM +C865;C865;110C 1168 11B8;C865;110C 1168 11B8; # (졥; 졥; 졥; 졥; 졥; ) HANGUL SYLLABLE JYEB +C866;C866;110C 1168 11B9;C866;110C 1168 11B9; # (졦; 졦; 졦; 졦; 졦; ) HANGUL SYLLABLE JYEBS +C867;C867;110C 1168 11BA;C867;110C 1168 11BA; # (졧; 졧; 졧; 졧; 졧; ) HANGUL SYLLABLE JYES +C868;C868;110C 1168 11BB;C868;110C 1168 11BB; # (졨; 졨; 졨; 졨; 졨; ) HANGUL SYLLABLE JYESS +C869;C869;110C 1168 11BC;C869;110C 1168 11BC; # (졩; 졩; 졩; 졩; 졩; ) HANGUL SYLLABLE JYENG +C86A;C86A;110C 1168 11BD;C86A;110C 1168 11BD; # (졪; 졪; 졪; 졪; 졪; ) HANGUL SYLLABLE JYEJ +C86B;C86B;110C 1168 11BE;C86B;110C 1168 11BE; # (졫; 졫; 졫; 졫; 졫; ) HANGUL SYLLABLE JYEC +C86C;C86C;110C 1168 11BF;C86C;110C 1168 11BF; # (졬; 졬; 졬; 졬; 졬; ) HANGUL SYLLABLE JYEK +C86D;C86D;110C 1168 11C0;C86D;110C 1168 11C0; # (졭; 졭; 졭; 졭; 졭; ) HANGUL SYLLABLE JYET +C86E;C86E;110C 1168 11C1;C86E;110C 1168 11C1; # (졮; 졮; 졮; 졮; 졮; ) HANGUL SYLLABLE JYEP +C86F;C86F;110C 1168 11C2;C86F;110C 1168 11C2; # (졯; 졯; 졯; 졯; 졯; ) HANGUL SYLLABLE JYEH +C870;C870;110C 1169;C870;110C 1169; # (조; 조; 조; 조; 조; ) HANGUL SYLLABLE JO +C871;C871;110C 1169 11A8;C871;110C 1169 11A8; # (족; 족; 족; 족; 족; ) HANGUL SYLLABLE JOG +C872;C872;110C 1169 11A9;C872;110C 1169 11A9; # (졲; 졲; 졲; 졲; 졲; ) HANGUL SYLLABLE JOGG +C873;C873;110C 1169 11AA;C873;110C 1169 11AA; # (졳; 졳; 졳; 졳; 졳; ) HANGUL SYLLABLE JOGS +C874;C874;110C 1169 11AB;C874;110C 1169 11AB; # (존; 존; 존; 존; 존; ) HANGUL SYLLABLE JON +C875;C875;110C 1169 11AC;C875;110C 1169 11AC; # (졵; 졵; 졵; 졵; 졵; ) HANGUL SYLLABLE JONJ +C876;C876;110C 1169 11AD;C876;110C 1169 11AD; # (졶; 졶; 졶; 졶; 졶; ) HANGUL SYLLABLE JONH +C877;C877;110C 1169 11AE;C877;110C 1169 11AE; # (졷; 졷; 졷; 졷; 졷; ) HANGUL SYLLABLE JOD +C878;C878;110C 1169 11AF;C878;110C 1169 11AF; # (졸; 졸; 졸; 졸; 졸; ) HANGUL SYLLABLE JOL +C879;C879;110C 1169 11B0;C879;110C 1169 11B0; # (졹; 졹; 졹; 졹; 졹; ) HANGUL SYLLABLE JOLG +C87A;C87A;110C 1169 11B1;C87A;110C 1169 11B1; # (졺; 졺; 졺; 졺; 졺; ) HANGUL SYLLABLE JOLM +C87B;C87B;110C 1169 11B2;C87B;110C 1169 11B2; # (졻; 졻; 졻; 졻; 졻; ) HANGUL SYLLABLE JOLB +C87C;C87C;110C 1169 11B3;C87C;110C 1169 11B3; # (졼; 졼; 졼; 졼; 졼; ) HANGUL SYLLABLE JOLS +C87D;C87D;110C 1169 11B4;C87D;110C 1169 11B4; # (졽; 졽; 졽; 졽; 졽; ) HANGUL SYLLABLE JOLT +C87E;C87E;110C 1169 11B5;C87E;110C 1169 11B5; # (졾; 졾; 졾; 졾; 졾; ) HANGUL SYLLABLE JOLP +C87F;C87F;110C 1169 11B6;C87F;110C 1169 11B6; # (졿; 졿; 졿; 졿; 졿; ) HANGUL SYLLABLE JOLH +C880;C880;110C 1169 11B7;C880;110C 1169 11B7; # (좀; 좀; 좀; 좀; 좀; ) HANGUL SYLLABLE JOM +C881;C881;110C 1169 11B8;C881;110C 1169 11B8; # (좁; 좁; 좁; 좁; 좁; ) HANGUL SYLLABLE JOB +C882;C882;110C 1169 11B9;C882;110C 1169 11B9; # (좂; 좂; 좂; 좂; 좂; ) HANGUL SYLLABLE JOBS +C883;C883;110C 1169 11BA;C883;110C 1169 11BA; # (좃; 좃; 좃; 좃; 좃; ) HANGUL SYLLABLE JOS +C884;C884;110C 1169 11BB;C884;110C 1169 11BB; # (좄; 좄; 좄; 좄; 좄; ) HANGUL SYLLABLE JOSS +C885;C885;110C 1169 11BC;C885;110C 1169 11BC; # (종; 종; 종; 종; 종; ) HANGUL SYLLABLE JONG +C886;C886;110C 1169 11BD;C886;110C 1169 11BD; # (좆; 좆; 좆; 좆; 좆; ) HANGUL SYLLABLE JOJ +C887;C887;110C 1169 11BE;C887;110C 1169 11BE; # (좇; 좇; 좇; 좇; 좇; ) HANGUL SYLLABLE JOC +C888;C888;110C 1169 11BF;C888;110C 1169 11BF; # (좈; 좈; 좈; 좈; 좈; ) HANGUL SYLLABLE JOK +C889;C889;110C 1169 11C0;C889;110C 1169 11C0; # (좉; 좉; 좉; 좉; 좉; ) HANGUL SYLLABLE JOT +C88A;C88A;110C 1169 11C1;C88A;110C 1169 11C1; # (좊; 좊; 좊; 좊; 좊; ) HANGUL SYLLABLE JOP +C88B;C88B;110C 1169 11C2;C88B;110C 1169 11C2; # (좋; 좋; 좋; 좋; 좋; ) HANGUL SYLLABLE JOH +C88C;C88C;110C 116A;C88C;110C 116A; # (좌; 좌; 좌; 좌; 좌; ) HANGUL SYLLABLE JWA +C88D;C88D;110C 116A 11A8;C88D;110C 116A 11A8; # (좍; 좍; 좍; 좍; 좍; ) HANGUL SYLLABLE JWAG +C88E;C88E;110C 116A 11A9;C88E;110C 116A 11A9; # (좎; 좎; 좎; 좎; 좎; ) HANGUL SYLLABLE JWAGG +C88F;C88F;110C 116A 11AA;C88F;110C 116A 11AA; # (좏; 좏; 좏; 좏; 좏; ) HANGUL SYLLABLE JWAGS +C890;C890;110C 116A 11AB;C890;110C 116A 11AB; # (좐; 좐; 좐; 좐; 좐; ) HANGUL SYLLABLE JWAN +C891;C891;110C 116A 11AC;C891;110C 116A 11AC; # (좑; 좑; 좑; 좑; 좑; ) HANGUL SYLLABLE JWANJ +C892;C892;110C 116A 11AD;C892;110C 116A 11AD; # (좒; 좒; 좒; 좒; 좒; ) HANGUL SYLLABLE JWANH +C893;C893;110C 116A 11AE;C893;110C 116A 11AE; # (좓; 좓; 좓; 좓; 좓; ) HANGUL SYLLABLE JWAD +C894;C894;110C 116A 11AF;C894;110C 116A 11AF; # (좔; 좔; 좔; 좔; 좔; ) HANGUL SYLLABLE JWAL +C895;C895;110C 116A 11B0;C895;110C 116A 11B0; # (좕; 좕; 좕; 좕; 좕; ) HANGUL SYLLABLE JWALG +C896;C896;110C 116A 11B1;C896;110C 116A 11B1; # (좖; 좖; 좖; 좖; 좖; ) HANGUL SYLLABLE JWALM +C897;C897;110C 116A 11B2;C897;110C 116A 11B2; # (좗; 좗; 좗; 좗; 좗; ) HANGUL SYLLABLE JWALB +C898;C898;110C 116A 11B3;C898;110C 116A 11B3; # (좘; 좘; 좘; 좘; 좘; ) HANGUL SYLLABLE JWALS +C899;C899;110C 116A 11B4;C899;110C 116A 11B4; # (좙; 좙; 좙; 좙; 좙; ) HANGUL SYLLABLE JWALT +C89A;C89A;110C 116A 11B5;C89A;110C 116A 11B5; # (좚; 좚; 좚; 좚; 좚; ) HANGUL SYLLABLE JWALP +C89B;C89B;110C 116A 11B6;C89B;110C 116A 11B6; # (좛; 좛; 좛; 좛; 좛; ) HANGUL SYLLABLE JWALH +C89C;C89C;110C 116A 11B7;C89C;110C 116A 11B7; # (좜; 좜; 좜; 좜; 좜; ) HANGUL SYLLABLE JWAM +C89D;C89D;110C 116A 11B8;C89D;110C 116A 11B8; # (좝; 좝; 좝; 좝; 좝; ) HANGUL SYLLABLE JWAB +C89E;C89E;110C 116A 11B9;C89E;110C 116A 11B9; # (좞; 좞; 좞; 좞; 좞; ) HANGUL SYLLABLE JWABS +C89F;C89F;110C 116A 11BA;C89F;110C 116A 11BA; # (좟; 좟; 좟; 좟; 좟; ) HANGUL SYLLABLE JWAS +C8A0;C8A0;110C 116A 11BB;C8A0;110C 116A 11BB; # (좠; 좠; 좠; 좠; 좠; ) HANGUL SYLLABLE JWASS +C8A1;C8A1;110C 116A 11BC;C8A1;110C 116A 11BC; # (좡; 좡; 좡; 좡; 좡; ) HANGUL SYLLABLE JWANG +C8A2;C8A2;110C 116A 11BD;C8A2;110C 116A 11BD; # (좢; 좢; 좢; 좢; 좢; ) HANGUL SYLLABLE JWAJ +C8A3;C8A3;110C 116A 11BE;C8A3;110C 116A 11BE; # (좣; 좣; 좣; 좣; 좣; ) HANGUL SYLLABLE JWAC +C8A4;C8A4;110C 116A 11BF;C8A4;110C 116A 11BF; # (좤; 좤; 좤; 좤; 좤; ) HANGUL SYLLABLE JWAK +C8A5;C8A5;110C 116A 11C0;C8A5;110C 116A 11C0; # (좥; 좥; 좥; 좥; 좥; ) HANGUL SYLLABLE JWAT +C8A6;C8A6;110C 116A 11C1;C8A6;110C 116A 11C1; # (좦; 좦; 좦; 좦; 좦; ) HANGUL SYLLABLE JWAP +C8A7;C8A7;110C 116A 11C2;C8A7;110C 116A 11C2; # (좧; 좧; 좧; 좧; 좧; ) HANGUL SYLLABLE JWAH +C8A8;C8A8;110C 116B;C8A8;110C 116B; # (좨; 좨; 좨; 좨; 좨; ) HANGUL SYLLABLE JWAE +C8A9;C8A9;110C 116B 11A8;C8A9;110C 116B 11A8; # (좩; 좩; 좩; 좩; 좩; ) HANGUL SYLLABLE JWAEG +C8AA;C8AA;110C 116B 11A9;C8AA;110C 116B 11A9; # (좪; 좪; 좪; 좪; 좪; ) HANGUL SYLLABLE JWAEGG +C8AB;C8AB;110C 116B 11AA;C8AB;110C 116B 11AA; # (좫; 좫; 좫; 좫; 좫; ) HANGUL SYLLABLE JWAEGS +C8AC;C8AC;110C 116B 11AB;C8AC;110C 116B 11AB; # (좬; 좬; 좬; 좬; 좬; ) HANGUL SYLLABLE JWAEN +C8AD;C8AD;110C 116B 11AC;C8AD;110C 116B 11AC; # (좭; 좭; 좭; 좭; 좭; ) HANGUL SYLLABLE JWAENJ +C8AE;C8AE;110C 116B 11AD;C8AE;110C 116B 11AD; # (좮; 좮; 좮; 좮; 좮; ) HANGUL SYLLABLE JWAENH +C8AF;C8AF;110C 116B 11AE;C8AF;110C 116B 11AE; # (좯; 좯; 좯; 좯; 좯; ) HANGUL SYLLABLE JWAED +C8B0;C8B0;110C 116B 11AF;C8B0;110C 116B 11AF; # (좰; 좰; 좰; 좰; 좰; ) HANGUL SYLLABLE JWAEL +C8B1;C8B1;110C 116B 11B0;C8B1;110C 116B 11B0; # (좱; 좱; 좱; 좱; 좱; ) HANGUL SYLLABLE JWAELG +C8B2;C8B2;110C 116B 11B1;C8B2;110C 116B 11B1; # (좲; 좲; 좲; 좲; 좲; ) HANGUL SYLLABLE JWAELM +C8B3;C8B3;110C 116B 11B2;C8B3;110C 116B 11B2; # (좳; 좳; 좳; 좳; 좳; ) HANGUL SYLLABLE JWAELB +C8B4;C8B4;110C 116B 11B3;C8B4;110C 116B 11B3; # (좴; 좴; 좴; 좴; 좴; ) HANGUL SYLLABLE JWAELS +C8B5;C8B5;110C 116B 11B4;C8B5;110C 116B 11B4; # (좵; 좵; 좵; 좵; 좵; ) HANGUL SYLLABLE JWAELT +C8B6;C8B6;110C 116B 11B5;C8B6;110C 116B 11B5; # (좶; 좶; 좶; 좶; 좶; ) HANGUL SYLLABLE JWAELP +C8B7;C8B7;110C 116B 11B6;C8B7;110C 116B 11B6; # (좷; 좷; 좷; 좷; 좷; ) HANGUL SYLLABLE JWAELH +C8B8;C8B8;110C 116B 11B7;C8B8;110C 116B 11B7; # (좸; 좸; 좸; 좸; 좸; ) HANGUL SYLLABLE JWAEM +C8B9;C8B9;110C 116B 11B8;C8B9;110C 116B 11B8; # (좹; 좹; 좹; 좹; 좹; ) HANGUL SYLLABLE JWAEB +C8BA;C8BA;110C 116B 11B9;C8BA;110C 116B 11B9; # (좺; 좺; 좺; 좺; 좺; ) HANGUL SYLLABLE JWAEBS +C8BB;C8BB;110C 116B 11BA;C8BB;110C 116B 11BA; # (좻; 좻; 좻; 좻; 좻; ) HANGUL SYLLABLE JWAES +C8BC;C8BC;110C 116B 11BB;C8BC;110C 116B 11BB; # (좼; 좼; 좼; 좼; 좼; ) HANGUL SYLLABLE JWAESS +C8BD;C8BD;110C 116B 11BC;C8BD;110C 116B 11BC; # (좽; 좽; 좽; 좽; 좽; ) HANGUL SYLLABLE JWAENG +C8BE;C8BE;110C 116B 11BD;C8BE;110C 116B 11BD; # (좾; 좾; 좾; 좾; 좾; ) HANGUL SYLLABLE JWAEJ +C8BF;C8BF;110C 116B 11BE;C8BF;110C 116B 11BE; # (좿; 좿; 좿; 좿; 좿; ) HANGUL SYLLABLE JWAEC +C8C0;C8C0;110C 116B 11BF;C8C0;110C 116B 11BF; # (죀; 죀; 죀; 죀; 죀; ) HANGUL SYLLABLE JWAEK +C8C1;C8C1;110C 116B 11C0;C8C1;110C 116B 11C0; # (죁; 죁; 죁; 죁; 죁; ) HANGUL SYLLABLE JWAET +C8C2;C8C2;110C 116B 11C1;C8C2;110C 116B 11C1; # (죂; 죂; 죂; 죂; 죂; ) HANGUL SYLLABLE JWAEP +C8C3;C8C3;110C 116B 11C2;C8C3;110C 116B 11C2; # (죃; 죃; 죃; 죃; 죃; ) HANGUL SYLLABLE JWAEH +C8C4;C8C4;110C 116C;C8C4;110C 116C; # (죄; 죄; 죄; 죄; 죄; ) HANGUL SYLLABLE JOE +C8C5;C8C5;110C 116C 11A8;C8C5;110C 116C 11A8; # (죅; 죅; 죅; 죅; 죅; ) HANGUL SYLLABLE JOEG +C8C6;C8C6;110C 116C 11A9;C8C6;110C 116C 11A9; # (죆; 죆; 죆; 죆; 죆; ) HANGUL SYLLABLE JOEGG +C8C7;C8C7;110C 116C 11AA;C8C7;110C 116C 11AA; # (죇; 죇; 죇; 죇; 죇; ) HANGUL SYLLABLE JOEGS +C8C8;C8C8;110C 116C 11AB;C8C8;110C 116C 11AB; # (죈; 죈; 죈; 죈; 죈; ) HANGUL SYLLABLE JOEN +C8C9;C8C9;110C 116C 11AC;C8C9;110C 116C 11AC; # (죉; 죉; 죉; 죉; 죉; ) HANGUL SYLLABLE JOENJ +C8CA;C8CA;110C 116C 11AD;C8CA;110C 116C 11AD; # (죊; 죊; 죊; 죊; 죊; ) HANGUL SYLLABLE JOENH +C8CB;C8CB;110C 116C 11AE;C8CB;110C 116C 11AE; # (죋; 죋; 죋; 죋; 죋; ) HANGUL SYLLABLE JOED +C8CC;C8CC;110C 116C 11AF;C8CC;110C 116C 11AF; # (죌; 죌; 죌; 죌; 죌; ) HANGUL SYLLABLE JOEL +C8CD;C8CD;110C 116C 11B0;C8CD;110C 116C 11B0; # (죍; 죍; 죍; 죍; 죍; ) HANGUL SYLLABLE JOELG +C8CE;C8CE;110C 116C 11B1;C8CE;110C 116C 11B1; # (죎; 죎; 죎; 죎; 죎; ) HANGUL SYLLABLE JOELM +C8CF;C8CF;110C 116C 11B2;C8CF;110C 116C 11B2; # (죏; 죏; 죏; 죏; 죏; ) HANGUL SYLLABLE JOELB +C8D0;C8D0;110C 116C 11B3;C8D0;110C 116C 11B3; # (죐; 죐; 죐; 죐; 죐; ) HANGUL SYLLABLE JOELS +C8D1;C8D1;110C 116C 11B4;C8D1;110C 116C 11B4; # (죑; 죑; 죑; 죑; 죑; ) HANGUL SYLLABLE JOELT +C8D2;C8D2;110C 116C 11B5;C8D2;110C 116C 11B5; # (죒; 죒; 죒; 죒; 죒; ) HANGUL SYLLABLE JOELP +C8D3;C8D3;110C 116C 11B6;C8D3;110C 116C 11B6; # (죓; 죓; 죓; 죓; 죓; ) HANGUL SYLLABLE JOELH +C8D4;C8D4;110C 116C 11B7;C8D4;110C 116C 11B7; # (죔; 죔; 죔; 죔; 죔; ) HANGUL SYLLABLE JOEM +C8D5;C8D5;110C 116C 11B8;C8D5;110C 116C 11B8; # (죕; 죕; 죕; 죕; 죕; ) HANGUL SYLLABLE JOEB +C8D6;C8D6;110C 116C 11B9;C8D6;110C 116C 11B9; # (죖; 죖; 죖; 죖; 죖; ) HANGUL SYLLABLE JOEBS +C8D7;C8D7;110C 116C 11BA;C8D7;110C 116C 11BA; # (죗; 죗; 죗; 죗; 죗; ) HANGUL SYLLABLE JOES +C8D8;C8D8;110C 116C 11BB;C8D8;110C 116C 11BB; # (죘; 죘; 죘; 죘; 죘; ) HANGUL SYLLABLE JOESS +C8D9;C8D9;110C 116C 11BC;C8D9;110C 116C 11BC; # (죙; 죙; 죙; 죙; 죙; ) HANGUL SYLLABLE JOENG +C8DA;C8DA;110C 116C 11BD;C8DA;110C 116C 11BD; # (죚; 죚; 죚; 죚; 죚; ) HANGUL SYLLABLE JOEJ +C8DB;C8DB;110C 116C 11BE;C8DB;110C 116C 11BE; # (죛; 죛; 죛; 죛; 죛; ) HANGUL SYLLABLE JOEC +C8DC;C8DC;110C 116C 11BF;C8DC;110C 116C 11BF; # (죜; 죜; 죜; 죜; 죜; ) HANGUL SYLLABLE JOEK +C8DD;C8DD;110C 116C 11C0;C8DD;110C 116C 11C0; # (죝; 죝; 죝; 죝; 죝; ) HANGUL SYLLABLE JOET +C8DE;C8DE;110C 116C 11C1;C8DE;110C 116C 11C1; # (죞; 죞; 죞; 죞; 죞; ) HANGUL SYLLABLE JOEP +C8DF;C8DF;110C 116C 11C2;C8DF;110C 116C 11C2; # (죟; 죟; 죟; 죟; 죟; ) HANGUL SYLLABLE JOEH +C8E0;C8E0;110C 116D;C8E0;110C 116D; # (죠; 죠; 죠; 죠; 죠; ) HANGUL SYLLABLE JYO +C8E1;C8E1;110C 116D 11A8;C8E1;110C 116D 11A8; # (죡; 죡; 죡; 죡; 죡; ) HANGUL SYLLABLE JYOG +C8E2;C8E2;110C 116D 11A9;C8E2;110C 116D 11A9; # (죢; 죢; 죢; 죢; 죢; ) HANGUL SYLLABLE JYOGG +C8E3;C8E3;110C 116D 11AA;C8E3;110C 116D 11AA; # (죣; 죣; 죣; 죣; 죣; ) HANGUL SYLLABLE JYOGS +C8E4;C8E4;110C 116D 11AB;C8E4;110C 116D 11AB; # (죤; 죤; 죤; 죤; 죤; ) HANGUL SYLLABLE JYON +C8E5;C8E5;110C 116D 11AC;C8E5;110C 116D 11AC; # (죥; 죥; 죥; 죥; 죥; ) HANGUL SYLLABLE JYONJ +C8E6;C8E6;110C 116D 11AD;C8E6;110C 116D 11AD; # (죦; 죦; 죦; 죦; 죦; ) HANGUL SYLLABLE JYONH +C8E7;C8E7;110C 116D 11AE;C8E7;110C 116D 11AE; # (죧; 죧; 죧; 죧; 죧; ) HANGUL SYLLABLE JYOD +C8E8;C8E8;110C 116D 11AF;C8E8;110C 116D 11AF; # (죨; 죨; 죨; 죨; 죨; ) HANGUL SYLLABLE JYOL +C8E9;C8E9;110C 116D 11B0;C8E9;110C 116D 11B0; # (죩; 죩; 죩; 죩; 죩; ) HANGUL SYLLABLE JYOLG +C8EA;C8EA;110C 116D 11B1;C8EA;110C 116D 11B1; # (죪; 죪; 죪; 죪; 죪; ) HANGUL SYLLABLE JYOLM +C8EB;C8EB;110C 116D 11B2;C8EB;110C 116D 11B2; # (죫; 죫; 죫; 죫; 죫; ) HANGUL SYLLABLE JYOLB +C8EC;C8EC;110C 116D 11B3;C8EC;110C 116D 11B3; # (죬; 죬; 죬; 죬; 죬; ) HANGUL SYLLABLE JYOLS +C8ED;C8ED;110C 116D 11B4;C8ED;110C 116D 11B4; # (죭; 죭; 죭; 죭; 죭; ) HANGUL SYLLABLE JYOLT +C8EE;C8EE;110C 116D 11B5;C8EE;110C 116D 11B5; # (죮; 죮; 죮; 죮; 죮; ) HANGUL SYLLABLE JYOLP +C8EF;C8EF;110C 116D 11B6;C8EF;110C 116D 11B6; # (죯; 죯; 죯; 죯; 죯; ) HANGUL SYLLABLE JYOLH +C8F0;C8F0;110C 116D 11B7;C8F0;110C 116D 11B7; # (죰; 죰; 죰; 죰; 죰; ) HANGUL SYLLABLE JYOM +C8F1;C8F1;110C 116D 11B8;C8F1;110C 116D 11B8; # (죱; 죱; 죱; 죱; 죱; ) HANGUL SYLLABLE JYOB +C8F2;C8F2;110C 116D 11B9;C8F2;110C 116D 11B9; # (죲; 죲; 죲; 죲; 죲; ) HANGUL SYLLABLE JYOBS +C8F3;C8F3;110C 116D 11BA;C8F3;110C 116D 11BA; # (죳; 죳; 죳; 죳; 죳; ) HANGUL SYLLABLE JYOS +C8F4;C8F4;110C 116D 11BB;C8F4;110C 116D 11BB; # (죴; 죴; 죴; 죴; 죴; ) HANGUL SYLLABLE JYOSS +C8F5;C8F5;110C 116D 11BC;C8F5;110C 116D 11BC; # (죵; 죵; 죵; 죵; 죵; ) HANGUL SYLLABLE JYONG +C8F6;C8F6;110C 116D 11BD;C8F6;110C 116D 11BD; # (죶; 죶; 죶; 죶; 죶; ) HANGUL SYLLABLE JYOJ +C8F7;C8F7;110C 116D 11BE;C8F7;110C 116D 11BE; # (죷; 죷; 죷; 죷; 죷; ) HANGUL SYLLABLE JYOC +C8F8;C8F8;110C 116D 11BF;C8F8;110C 116D 11BF; # (죸; 죸; 죸; 죸; 죸; ) HANGUL SYLLABLE JYOK +C8F9;C8F9;110C 116D 11C0;C8F9;110C 116D 11C0; # (죹; 죹; 죹; 죹; 죹; ) HANGUL SYLLABLE JYOT +C8FA;C8FA;110C 116D 11C1;C8FA;110C 116D 11C1; # (죺; 죺; 죺; 죺; 죺; ) HANGUL SYLLABLE JYOP +C8FB;C8FB;110C 116D 11C2;C8FB;110C 116D 11C2; # (죻; 죻; 죻; 죻; 죻; ) HANGUL SYLLABLE JYOH +C8FC;C8FC;110C 116E;C8FC;110C 116E; # (주; 주; 주; 주; 주; ) HANGUL SYLLABLE JU +C8FD;C8FD;110C 116E 11A8;C8FD;110C 116E 11A8; # (죽; 죽; 죽; 죽; 죽; ) HANGUL SYLLABLE JUG +C8FE;C8FE;110C 116E 11A9;C8FE;110C 116E 11A9; # (죾; 죾; 죾; 죾; 죾; ) HANGUL SYLLABLE JUGG +C8FF;C8FF;110C 116E 11AA;C8FF;110C 116E 11AA; # (죿; 죿; 죿; 죿; 죿; ) HANGUL SYLLABLE JUGS +C900;C900;110C 116E 11AB;C900;110C 116E 11AB; # (준; 준; 준; 준; 준; ) HANGUL SYLLABLE JUN +C901;C901;110C 116E 11AC;C901;110C 116E 11AC; # (줁; 줁; 줁; 줁; 줁; ) HANGUL SYLLABLE JUNJ +C902;C902;110C 116E 11AD;C902;110C 116E 11AD; # (줂; 줂; 줂; 줂; 줂; ) HANGUL SYLLABLE JUNH +C903;C903;110C 116E 11AE;C903;110C 116E 11AE; # (줃; 줃; 줃; 줃; 줃; ) HANGUL SYLLABLE JUD +C904;C904;110C 116E 11AF;C904;110C 116E 11AF; # (줄; 줄; 줄; 줄; 줄; ) HANGUL SYLLABLE JUL +C905;C905;110C 116E 11B0;C905;110C 116E 11B0; # (줅; 줅; 줅; 줅; 줅; ) HANGUL SYLLABLE JULG +C906;C906;110C 116E 11B1;C906;110C 116E 11B1; # (줆; 줆; 줆; 줆; 줆; ) HANGUL SYLLABLE JULM +C907;C907;110C 116E 11B2;C907;110C 116E 11B2; # (줇; 줇; 줇; 줇; 줇; ) HANGUL SYLLABLE JULB +C908;C908;110C 116E 11B3;C908;110C 116E 11B3; # (줈; 줈; 줈; 줈; 줈; ) HANGUL SYLLABLE JULS +C909;C909;110C 116E 11B4;C909;110C 116E 11B4; # (줉; 줉; 줉; 줉; 줉; ) HANGUL SYLLABLE JULT +C90A;C90A;110C 116E 11B5;C90A;110C 116E 11B5; # (줊; 줊; 줊; 줊; 줊; ) HANGUL SYLLABLE JULP +C90B;C90B;110C 116E 11B6;C90B;110C 116E 11B6; # (줋; 줋; 줋; 줋; 줋; ) HANGUL SYLLABLE JULH +C90C;C90C;110C 116E 11B7;C90C;110C 116E 11B7; # (줌; 줌; 줌; 줌; 줌; ) HANGUL SYLLABLE JUM +C90D;C90D;110C 116E 11B8;C90D;110C 116E 11B8; # (줍; 줍; 줍; 줍; 줍; ) HANGUL SYLLABLE JUB +C90E;C90E;110C 116E 11B9;C90E;110C 116E 11B9; # (줎; 줎; 줎; 줎; 줎; ) HANGUL SYLLABLE JUBS +C90F;C90F;110C 116E 11BA;C90F;110C 116E 11BA; # (줏; 줏; 줏; 줏; 줏; ) HANGUL SYLLABLE JUS +C910;C910;110C 116E 11BB;C910;110C 116E 11BB; # (줐; 줐; 줐; 줐; 줐; ) HANGUL SYLLABLE JUSS +C911;C911;110C 116E 11BC;C911;110C 116E 11BC; # (중; 중; 중; 중; 중; ) HANGUL SYLLABLE JUNG +C912;C912;110C 116E 11BD;C912;110C 116E 11BD; # (줒; 줒; 줒; 줒; 줒; ) HANGUL SYLLABLE JUJ +C913;C913;110C 116E 11BE;C913;110C 116E 11BE; # (줓; 줓; 줓; 줓; 줓; ) HANGUL SYLLABLE JUC +C914;C914;110C 116E 11BF;C914;110C 116E 11BF; # (줔; 줔; 줔; 줔; 줔; ) HANGUL SYLLABLE JUK +C915;C915;110C 116E 11C0;C915;110C 116E 11C0; # (줕; 줕; 줕; 줕; 줕; ) HANGUL SYLLABLE JUT +C916;C916;110C 116E 11C1;C916;110C 116E 11C1; # (줖; 줖; 줖; 줖; 줖; ) HANGUL SYLLABLE JUP +C917;C917;110C 116E 11C2;C917;110C 116E 11C2; # (줗; 줗; 줗; 줗; 줗; ) HANGUL SYLLABLE JUH +C918;C918;110C 116F;C918;110C 116F; # (줘; 줘; 줘; 줘; 줘; ) HANGUL SYLLABLE JWEO +C919;C919;110C 116F 11A8;C919;110C 116F 11A8; # (줙; 줙; 줙; 줙; 줙; ) HANGUL SYLLABLE JWEOG +C91A;C91A;110C 116F 11A9;C91A;110C 116F 11A9; # (줚; 줚; 줚; 줚; 줚; ) HANGUL SYLLABLE JWEOGG +C91B;C91B;110C 116F 11AA;C91B;110C 116F 11AA; # (줛; 줛; 줛; 줛; 줛; ) HANGUL SYLLABLE JWEOGS +C91C;C91C;110C 116F 11AB;C91C;110C 116F 11AB; # (줜; 줜; 줜; 줜; 줜; ) HANGUL SYLLABLE JWEON +C91D;C91D;110C 116F 11AC;C91D;110C 116F 11AC; # (줝; 줝; 줝; 줝; 줝; ) HANGUL SYLLABLE JWEONJ +C91E;C91E;110C 116F 11AD;C91E;110C 116F 11AD; # (줞; 줞; 줞; 줞; 줞; ) HANGUL SYLLABLE JWEONH +C91F;C91F;110C 116F 11AE;C91F;110C 116F 11AE; # (줟; 줟; 줟; 줟; 줟; ) HANGUL SYLLABLE JWEOD +C920;C920;110C 116F 11AF;C920;110C 116F 11AF; # (줠; 줠; 줠; 줠; 줠; ) HANGUL SYLLABLE JWEOL +C921;C921;110C 116F 11B0;C921;110C 116F 11B0; # (줡; 줡; 줡; 줡; 줡; ) HANGUL SYLLABLE JWEOLG +C922;C922;110C 116F 11B1;C922;110C 116F 11B1; # (줢; 줢; 줢; 줢; 줢; ) HANGUL SYLLABLE JWEOLM +C923;C923;110C 116F 11B2;C923;110C 116F 11B2; # (줣; 줣; 줣; 줣; 줣; ) HANGUL SYLLABLE JWEOLB +C924;C924;110C 116F 11B3;C924;110C 116F 11B3; # (줤; 줤; 줤; 줤; 줤; ) HANGUL SYLLABLE JWEOLS +C925;C925;110C 116F 11B4;C925;110C 116F 11B4; # (줥; 줥; 줥; 줥; 줥; ) HANGUL SYLLABLE JWEOLT +C926;C926;110C 116F 11B5;C926;110C 116F 11B5; # (줦; 줦; 줦; 줦; 줦; ) HANGUL SYLLABLE JWEOLP +C927;C927;110C 116F 11B6;C927;110C 116F 11B6; # (줧; 줧; 줧; 줧; 줧; ) HANGUL SYLLABLE JWEOLH +C928;C928;110C 116F 11B7;C928;110C 116F 11B7; # (줨; 줨; 줨; 줨; 줨; ) HANGUL SYLLABLE JWEOM +C929;C929;110C 116F 11B8;C929;110C 116F 11B8; # (줩; 줩; 줩; 줩; 줩; ) HANGUL SYLLABLE JWEOB +C92A;C92A;110C 116F 11B9;C92A;110C 116F 11B9; # (줪; 줪; 줪; 줪; 줪; ) HANGUL SYLLABLE JWEOBS +C92B;C92B;110C 116F 11BA;C92B;110C 116F 11BA; # (줫; 줫; 줫; 줫; 줫; ) HANGUL SYLLABLE JWEOS +C92C;C92C;110C 116F 11BB;C92C;110C 116F 11BB; # (줬; 줬; 줬; 줬; 줬; ) HANGUL SYLLABLE JWEOSS +C92D;C92D;110C 116F 11BC;C92D;110C 116F 11BC; # (줭; 줭; 줭; 줭; 줭; ) HANGUL SYLLABLE JWEONG +C92E;C92E;110C 116F 11BD;C92E;110C 116F 11BD; # (줮; 줮; 줮; 줮; 줮; ) HANGUL SYLLABLE JWEOJ +C92F;C92F;110C 116F 11BE;C92F;110C 116F 11BE; # (줯; 줯; 줯; 줯; 줯; ) HANGUL SYLLABLE JWEOC +C930;C930;110C 116F 11BF;C930;110C 116F 11BF; # (줰; 줰; 줰; 줰; 줰; ) HANGUL SYLLABLE JWEOK +C931;C931;110C 116F 11C0;C931;110C 116F 11C0; # (줱; 줱; 줱; 줱; 줱; ) HANGUL SYLLABLE JWEOT +C932;C932;110C 116F 11C1;C932;110C 116F 11C1; # (줲; 줲; 줲; 줲; 줲; ) HANGUL SYLLABLE JWEOP +C933;C933;110C 116F 11C2;C933;110C 116F 11C2; # (줳; 줳; 줳; 줳; 줳; ) HANGUL SYLLABLE JWEOH +C934;C934;110C 1170;C934;110C 1170; # (줴; 줴; 줴; 줴; 줴; ) HANGUL SYLLABLE JWE +C935;C935;110C 1170 11A8;C935;110C 1170 11A8; # (줵; 줵; 줵; 줵; 줵; ) HANGUL SYLLABLE JWEG +C936;C936;110C 1170 11A9;C936;110C 1170 11A9; # (줶; 줶; 줶; 줶; 줶; ) HANGUL SYLLABLE JWEGG +C937;C937;110C 1170 11AA;C937;110C 1170 11AA; # (줷; 줷; 줷; 줷; 줷; ) HANGUL SYLLABLE JWEGS +C938;C938;110C 1170 11AB;C938;110C 1170 11AB; # (줸; 줸; 줸; 줸; 줸; ) HANGUL SYLLABLE JWEN +C939;C939;110C 1170 11AC;C939;110C 1170 11AC; # (줹; 줹; 줹; 줹; 줹; ) HANGUL SYLLABLE JWENJ +C93A;C93A;110C 1170 11AD;C93A;110C 1170 11AD; # (줺; 줺; 줺; 줺; 줺; ) HANGUL SYLLABLE JWENH +C93B;C93B;110C 1170 11AE;C93B;110C 1170 11AE; # (줻; 줻; 줻; 줻; 줻; ) HANGUL SYLLABLE JWED +C93C;C93C;110C 1170 11AF;C93C;110C 1170 11AF; # (줼; 줼; 줼; 줼; 줼; ) HANGUL SYLLABLE JWEL +C93D;C93D;110C 1170 11B0;C93D;110C 1170 11B0; # (줽; 줽; 줽; 줽; 줽; ) HANGUL SYLLABLE JWELG +C93E;C93E;110C 1170 11B1;C93E;110C 1170 11B1; # (줾; 줾; 줾; 줾; 줾; ) HANGUL SYLLABLE JWELM +C93F;C93F;110C 1170 11B2;C93F;110C 1170 11B2; # (줿; 줿; 줿; 줿; 줿; ) HANGUL SYLLABLE JWELB +C940;C940;110C 1170 11B3;C940;110C 1170 11B3; # (쥀; 쥀; 쥀; 쥀; 쥀; ) HANGUL SYLLABLE JWELS +C941;C941;110C 1170 11B4;C941;110C 1170 11B4; # (쥁; 쥁; 쥁; 쥁; 쥁; ) HANGUL SYLLABLE JWELT +C942;C942;110C 1170 11B5;C942;110C 1170 11B5; # (쥂; 쥂; 쥂; 쥂; 쥂; ) HANGUL SYLLABLE JWELP +C943;C943;110C 1170 11B6;C943;110C 1170 11B6; # (쥃; 쥃; 쥃; 쥃; 쥃; ) HANGUL SYLLABLE JWELH +C944;C944;110C 1170 11B7;C944;110C 1170 11B7; # (쥄; 쥄; 쥄; 쥄; 쥄; ) HANGUL SYLLABLE JWEM +C945;C945;110C 1170 11B8;C945;110C 1170 11B8; # (쥅; 쥅; 쥅; 쥅; 쥅; ) HANGUL SYLLABLE JWEB +C946;C946;110C 1170 11B9;C946;110C 1170 11B9; # (쥆; 쥆; 쥆; 쥆; 쥆; ) HANGUL SYLLABLE JWEBS +C947;C947;110C 1170 11BA;C947;110C 1170 11BA; # (쥇; 쥇; 쥇; 쥇; 쥇; ) HANGUL SYLLABLE JWES +C948;C948;110C 1170 11BB;C948;110C 1170 11BB; # (쥈; 쥈; 쥈; 쥈; 쥈; ) HANGUL SYLLABLE JWESS +C949;C949;110C 1170 11BC;C949;110C 1170 11BC; # (쥉; 쥉; 쥉; 쥉; 쥉; ) HANGUL SYLLABLE JWENG +C94A;C94A;110C 1170 11BD;C94A;110C 1170 11BD; # (쥊; 쥊; 쥊; 쥊; 쥊; ) HANGUL SYLLABLE JWEJ +C94B;C94B;110C 1170 11BE;C94B;110C 1170 11BE; # (쥋; 쥋; 쥋; 쥋; 쥋; ) HANGUL SYLLABLE JWEC +C94C;C94C;110C 1170 11BF;C94C;110C 1170 11BF; # (쥌; 쥌; 쥌; 쥌; 쥌; ) HANGUL SYLLABLE JWEK +C94D;C94D;110C 1170 11C0;C94D;110C 1170 11C0; # (쥍; 쥍; 쥍; 쥍; 쥍; ) HANGUL SYLLABLE JWET +C94E;C94E;110C 1170 11C1;C94E;110C 1170 11C1; # (쥎; 쥎; 쥎; 쥎; 쥎; ) HANGUL SYLLABLE JWEP +C94F;C94F;110C 1170 11C2;C94F;110C 1170 11C2; # (쥏; 쥏; 쥏; 쥏; 쥏; ) HANGUL SYLLABLE JWEH +C950;C950;110C 1171;C950;110C 1171; # (쥐; 쥐; 쥐; 쥐; 쥐; ) HANGUL SYLLABLE JWI +C951;C951;110C 1171 11A8;C951;110C 1171 11A8; # (쥑; 쥑; 쥑; 쥑; 쥑; ) HANGUL SYLLABLE JWIG +C952;C952;110C 1171 11A9;C952;110C 1171 11A9; # (쥒; 쥒; 쥒; 쥒; 쥒; ) HANGUL SYLLABLE JWIGG +C953;C953;110C 1171 11AA;C953;110C 1171 11AA; # (쥓; 쥓; 쥓; 쥓; 쥓; ) HANGUL SYLLABLE JWIGS +C954;C954;110C 1171 11AB;C954;110C 1171 11AB; # (쥔; 쥔; 쥔; 쥔; 쥔; ) HANGUL SYLLABLE JWIN +C955;C955;110C 1171 11AC;C955;110C 1171 11AC; # (쥕; 쥕; 쥕; 쥕; 쥕; ) HANGUL SYLLABLE JWINJ +C956;C956;110C 1171 11AD;C956;110C 1171 11AD; # (쥖; 쥖; 쥖; 쥖; 쥖; ) HANGUL SYLLABLE JWINH +C957;C957;110C 1171 11AE;C957;110C 1171 11AE; # (쥗; 쥗; 쥗; 쥗; 쥗; ) HANGUL SYLLABLE JWID +C958;C958;110C 1171 11AF;C958;110C 1171 11AF; # (쥘; 쥘; 쥘; 쥘; 쥘; ) HANGUL SYLLABLE JWIL +C959;C959;110C 1171 11B0;C959;110C 1171 11B0; # (쥙; 쥙; 쥙; 쥙; 쥙; ) HANGUL SYLLABLE JWILG +C95A;C95A;110C 1171 11B1;C95A;110C 1171 11B1; # (쥚; 쥚; 쥚; 쥚; 쥚; ) HANGUL SYLLABLE JWILM +C95B;C95B;110C 1171 11B2;C95B;110C 1171 11B2; # (쥛; 쥛; 쥛; 쥛; 쥛; ) HANGUL SYLLABLE JWILB +C95C;C95C;110C 1171 11B3;C95C;110C 1171 11B3; # (쥜; 쥜; 쥜; 쥜; 쥜; ) HANGUL SYLLABLE JWILS +C95D;C95D;110C 1171 11B4;C95D;110C 1171 11B4; # (쥝; 쥝; 쥝; 쥝; 쥝; ) HANGUL SYLLABLE JWILT +C95E;C95E;110C 1171 11B5;C95E;110C 1171 11B5; # (쥞; 쥞; 쥞; 쥞; 쥞; ) HANGUL SYLLABLE JWILP +C95F;C95F;110C 1171 11B6;C95F;110C 1171 11B6; # (쥟; 쥟; 쥟; 쥟; 쥟; ) HANGUL SYLLABLE JWILH +C960;C960;110C 1171 11B7;C960;110C 1171 11B7; # (쥠; 쥠; 쥠; 쥠; 쥠; ) HANGUL SYLLABLE JWIM +C961;C961;110C 1171 11B8;C961;110C 1171 11B8; # (쥡; 쥡; 쥡; 쥡; 쥡; ) HANGUL SYLLABLE JWIB +C962;C962;110C 1171 11B9;C962;110C 1171 11B9; # (쥢; 쥢; 쥢; 쥢; 쥢; ) HANGUL SYLLABLE JWIBS +C963;C963;110C 1171 11BA;C963;110C 1171 11BA; # (쥣; 쥣; 쥣; 쥣; 쥣; ) HANGUL SYLLABLE JWIS +C964;C964;110C 1171 11BB;C964;110C 1171 11BB; # (쥤; 쥤; 쥤; 쥤; 쥤; ) HANGUL SYLLABLE JWISS +C965;C965;110C 1171 11BC;C965;110C 1171 11BC; # (쥥; 쥥; 쥥; 쥥; 쥥; ) HANGUL SYLLABLE JWING +C966;C966;110C 1171 11BD;C966;110C 1171 11BD; # (쥦; 쥦; 쥦; 쥦; 쥦; ) HANGUL SYLLABLE JWIJ +C967;C967;110C 1171 11BE;C967;110C 1171 11BE; # (쥧; 쥧; 쥧; 쥧; 쥧; ) HANGUL SYLLABLE JWIC +C968;C968;110C 1171 11BF;C968;110C 1171 11BF; # (쥨; 쥨; 쥨; 쥨; 쥨; ) HANGUL SYLLABLE JWIK +C969;C969;110C 1171 11C0;C969;110C 1171 11C0; # (쥩; 쥩; 쥩; 쥩; 쥩; ) HANGUL SYLLABLE JWIT +C96A;C96A;110C 1171 11C1;C96A;110C 1171 11C1; # (쥪; 쥪; 쥪; 쥪; 쥪; ) HANGUL SYLLABLE JWIP +C96B;C96B;110C 1171 11C2;C96B;110C 1171 11C2; # (쥫; 쥫; 쥫; 쥫; 쥫; ) HANGUL SYLLABLE JWIH +C96C;C96C;110C 1172;C96C;110C 1172; # (쥬; 쥬; 쥬; 쥬; 쥬; ) HANGUL SYLLABLE JYU +C96D;C96D;110C 1172 11A8;C96D;110C 1172 11A8; # (쥭; 쥭; 쥭; 쥭; 쥭; ) HANGUL SYLLABLE JYUG +C96E;C96E;110C 1172 11A9;C96E;110C 1172 11A9; # (쥮; 쥮; 쥮; 쥮; 쥮; ) HANGUL SYLLABLE JYUGG +C96F;C96F;110C 1172 11AA;C96F;110C 1172 11AA; # (쥯; 쥯; 쥯; 쥯; 쥯; ) HANGUL SYLLABLE JYUGS +C970;C970;110C 1172 11AB;C970;110C 1172 11AB; # (쥰; 쥰; 쥰; 쥰; 쥰; ) HANGUL SYLLABLE JYUN +C971;C971;110C 1172 11AC;C971;110C 1172 11AC; # (쥱; 쥱; 쥱; 쥱; 쥱; ) HANGUL SYLLABLE JYUNJ +C972;C972;110C 1172 11AD;C972;110C 1172 11AD; # (쥲; 쥲; 쥲; 쥲; 쥲; ) HANGUL SYLLABLE JYUNH +C973;C973;110C 1172 11AE;C973;110C 1172 11AE; # (쥳; 쥳; 쥳; 쥳; 쥳; ) HANGUL SYLLABLE JYUD +C974;C974;110C 1172 11AF;C974;110C 1172 11AF; # (쥴; 쥴; 쥴; 쥴; 쥴; ) HANGUL SYLLABLE JYUL +C975;C975;110C 1172 11B0;C975;110C 1172 11B0; # (쥵; 쥵; 쥵; 쥵; 쥵; ) HANGUL SYLLABLE JYULG +C976;C976;110C 1172 11B1;C976;110C 1172 11B1; # (쥶; 쥶; 쥶; 쥶; 쥶; ) HANGUL SYLLABLE JYULM +C977;C977;110C 1172 11B2;C977;110C 1172 11B2; # (쥷; 쥷; 쥷; 쥷; 쥷; ) HANGUL SYLLABLE JYULB +C978;C978;110C 1172 11B3;C978;110C 1172 11B3; # (쥸; 쥸; 쥸; 쥸; 쥸; ) HANGUL SYLLABLE JYULS +C979;C979;110C 1172 11B4;C979;110C 1172 11B4; # (쥹; 쥹; 쥹; 쥹; 쥹; ) HANGUL SYLLABLE JYULT +C97A;C97A;110C 1172 11B5;C97A;110C 1172 11B5; # (쥺; 쥺; 쥺; 쥺; 쥺; ) HANGUL SYLLABLE JYULP +C97B;C97B;110C 1172 11B6;C97B;110C 1172 11B6; # (쥻; 쥻; 쥻; 쥻; 쥻; ) HANGUL SYLLABLE JYULH +C97C;C97C;110C 1172 11B7;C97C;110C 1172 11B7; # (쥼; 쥼; 쥼; 쥼; 쥼; ) HANGUL SYLLABLE JYUM +C97D;C97D;110C 1172 11B8;C97D;110C 1172 11B8; # (쥽; 쥽; 쥽; 쥽; 쥽; ) HANGUL SYLLABLE JYUB +C97E;C97E;110C 1172 11B9;C97E;110C 1172 11B9; # (쥾; 쥾; 쥾; 쥾; 쥾; ) HANGUL SYLLABLE JYUBS +C97F;C97F;110C 1172 11BA;C97F;110C 1172 11BA; # (쥿; 쥿; 쥿; 쥿; 쥿; ) HANGUL SYLLABLE JYUS +C980;C980;110C 1172 11BB;C980;110C 1172 11BB; # (즀; 즀; 즀; 즀; 즀; ) HANGUL SYLLABLE JYUSS +C981;C981;110C 1172 11BC;C981;110C 1172 11BC; # (즁; 즁; 즁; 즁; 즁; ) HANGUL SYLLABLE JYUNG +C982;C982;110C 1172 11BD;C982;110C 1172 11BD; # (즂; 즂; 즂; 즂; 즂; ) HANGUL SYLLABLE JYUJ +C983;C983;110C 1172 11BE;C983;110C 1172 11BE; # (즃; 즃; 즃; 즃; 즃; ) HANGUL SYLLABLE JYUC +C984;C984;110C 1172 11BF;C984;110C 1172 11BF; # (즄; 즄; 즄; 즄; 즄; ) HANGUL SYLLABLE JYUK +C985;C985;110C 1172 11C0;C985;110C 1172 11C0; # (즅; 즅; 즅; 즅; 즅; ) HANGUL SYLLABLE JYUT +C986;C986;110C 1172 11C1;C986;110C 1172 11C1; # (즆; 즆; 즆; 즆; 즆; ) HANGUL SYLLABLE JYUP +C987;C987;110C 1172 11C2;C987;110C 1172 11C2; # (즇; 즇; 즇; 즇; 즇; ) HANGUL SYLLABLE JYUH +C988;C988;110C 1173;C988;110C 1173; # (즈; 즈; 즈; 즈; 즈; ) HANGUL SYLLABLE JEU +C989;C989;110C 1173 11A8;C989;110C 1173 11A8; # (즉; 즉; 즉; 즉; 즉; ) HANGUL SYLLABLE JEUG +C98A;C98A;110C 1173 11A9;C98A;110C 1173 11A9; # (즊; 즊; 즊; 즊; 즊; ) HANGUL SYLLABLE JEUGG +C98B;C98B;110C 1173 11AA;C98B;110C 1173 11AA; # (즋; 즋; 즋; 즋; 즋; ) HANGUL SYLLABLE JEUGS +C98C;C98C;110C 1173 11AB;C98C;110C 1173 11AB; # (즌; 즌; 즌; 즌; 즌; ) HANGUL SYLLABLE JEUN +C98D;C98D;110C 1173 11AC;C98D;110C 1173 11AC; # (즍; 즍; 즍; 즍; 즍; ) HANGUL SYLLABLE JEUNJ +C98E;C98E;110C 1173 11AD;C98E;110C 1173 11AD; # (즎; 즎; 즎; 즎; 즎; ) HANGUL SYLLABLE JEUNH +C98F;C98F;110C 1173 11AE;C98F;110C 1173 11AE; # (즏; 즏; 즏; 즏; 즏; ) HANGUL SYLLABLE JEUD +C990;C990;110C 1173 11AF;C990;110C 1173 11AF; # (즐; 즐; 즐; 즐; 즐; ) HANGUL SYLLABLE JEUL +C991;C991;110C 1173 11B0;C991;110C 1173 11B0; # (즑; 즑; 즑; 즑; 즑; ) HANGUL SYLLABLE JEULG +C992;C992;110C 1173 11B1;C992;110C 1173 11B1; # (즒; 즒; 즒; 즒; 즒; ) HANGUL SYLLABLE JEULM +C993;C993;110C 1173 11B2;C993;110C 1173 11B2; # (즓; 즓; 즓; 즓; 즓; ) HANGUL SYLLABLE JEULB +C994;C994;110C 1173 11B3;C994;110C 1173 11B3; # (즔; 즔; 즔; 즔; 즔; ) HANGUL SYLLABLE JEULS +C995;C995;110C 1173 11B4;C995;110C 1173 11B4; # (즕; 즕; 즕; 즕; 즕; ) HANGUL SYLLABLE JEULT +C996;C996;110C 1173 11B5;C996;110C 1173 11B5; # (즖; 즖; 즖; 즖; 즖; ) HANGUL SYLLABLE JEULP +C997;C997;110C 1173 11B6;C997;110C 1173 11B6; # (즗; 즗; 즗; 즗; 즗; ) HANGUL SYLLABLE JEULH +C998;C998;110C 1173 11B7;C998;110C 1173 11B7; # (즘; 즘; 즘; 즘; 즘; ) HANGUL SYLLABLE JEUM +C999;C999;110C 1173 11B8;C999;110C 1173 11B8; # (즙; 즙; 즙; 즙; 즙; ) HANGUL SYLLABLE JEUB +C99A;C99A;110C 1173 11B9;C99A;110C 1173 11B9; # (즚; 즚; 즚; 즚; 즚; ) HANGUL SYLLABLE JEUBS +C99B;C99B;110C 1173 11BA;C99B;110C 1173 11BA; # (즛; 즛; 즛; 즛; 즛; ) HANGUL SYLLABLE JEUS +C99C;C99C;110C 1173 11BB;C99C;110C 1173 11BB; # (즜; 즜; 즜; 즜; 즜; ) HANGUL SYLLABLE JEUSS +C99D;C99D;110C 1173 11BC;C99D;110C 1173 11BC; # (증; 증; 증; 증; 증; ) HANGUL SYLLABLE JEUNG +C99E;C99E;110C 1173 11BD;C99E;110C 1173 11BD; # (즞; 즞; 즞; 즞; 즞; ) HANGUL SYLLABLE JEUJ +C99F;C99F;110C 1173 11BE;C99F;110C 1173 11BE; # (즟; 즟; 즟; 즟; 즟; ) HANGUL SYLLABLE JEUC +C9A0;C9A0;110C 1173 11BF;C9A0;110C 1173 11BF; # (즠; 즠; 즠; 즠; 즠; ) HANGUL SYLLABLE JEUK +C9A1;C9A1;110C 1173 11C0;C9A1;110C 1173 11C0; # (즡; 즡; 즡; 즡; 즡; ) HANGUL SYLLABLE JEUT +C9A2;C9A2;110C 1173 11C1;C9A2;110C 1173 11C1; # (즢; 즢; 즢; 즢; 즢; ) HANGUL SYLLABLE JEUP +C9A3;C9A3;110C 1173 11C2;C9A3;110C 1173 11C2; # (즣; 즣; 즣; 즣; 즣; ) HANGUL SYLLABLE JEUH +C9A4;C9A4;110C 1174;C9A4;110C 1174; # (즤; 즤; 즤; 즤; 즤; ) HANGUL SYLLABLE JYI +C9A5;C9A5;110C 1174 11A8;C9A5;110C 1174 11A8; # (즥; 즥; 즥; 즥; 즥; ) HANGUL SYLLABLE JYIG +C9A6;C9A6;110C 1174 11A9;C9A6;110C 1174 11A9; # (즦; 즦; 즦; 즦; 즦; ) HANGUL SYLLABLE JYIGG +C9A7;C9A7;110C 1174 11AA;C9A7;110C 1174 11AA; # (즧; 즧; 즧; 즧; 즧; ) HANGUL SYLLABLE JYIGS +C9A8;C9A8;110C 1174 11AB;C9A8;110C 1174 11AB; # (즨; 즨; 즨; 즨; 즨; ) HANGUL SYLLABLE JYIN +C9A9;C9A9;110C 1174 11AC;C9A9;110C 1174 11AC; # (즩; 즩; 즩; 즩; 즩; ) HANGUL SYLLABLE JYINJ +C9AA;C9AA;110C 1174 11AD;C9AA;110C 1174 11AD; # (즪; 즪; 즪; 즪; 즪; ) HANGUL SYLLABLE JYINH +C9AB;C9AB;110C 1174 11AE;C9AB;110C 1174 11AE; # (즫; 즫; 즫; 즫; 즫; ) HANGUL SYLLABLE JYID +C9AC;C9AC;110C 1174 11AF;C9AC;110C 1174 11AF; # (즬; 즬; 즬; 즬; 즬; ) HANGUL SYLLABLE JYIL +C9AD;C9AD;110C 1174 11B0;C9AD;110C 1174 11B0; # (즭; 즭; 즭; 즭; 즭; ) HANGUL SYLLABLE JYILG +C9AE;C9AE;110C 1174 11B1;C9AE;110C 1174 11B1; # (즮; 즮; 즮; 즮; 즮; ) HANGUL SYLLABLE JYILM +C9AF;C9AF;110C 1174 11B2;C9AF;110C 1174 11B2; # (즯; 즯; 즯; 즯; 즯; ) HANGUL SYLLABLE JYILB +C9B0;C9B0;110C 1174 11B3;C9B0;110C 1174 11B3; # (즰; 즰; 즰; 즰; 즰; ) HANGUL SYLLABLE JYILS +C9B1;C9B1;110C 1174 11B4;C9B1;110C 1174 11B4; # (즱; 즱; 즱; 즱; 즱; ) HANGUL SYLLABLE JYILT +C9B2;C9B2;110C 1174 11B5;C9B2;110C 1174 11B5; # (즲; 즲; 즲; 즲; 즲; ) HANGUL SYLLABLE JYILP +C9B3;C9B3;110C 1174 11B6;C9B3;110C 1174 11B6; # (즳; 즳; 즳; 즳; 즳; ) HANGUL SYLLABLE JYILH +C9B4;C9B4;110C 1174 11B7;C9B4;110C 1174 11B7; # (즴; 즴; 즴; 즴; 즴; ) HANGUL SYLLABLE JYIM +C9B5;C9B5;110C 1174 11B8;C9B5;110C 1174 11B8; # (즵; 즵; 즵; 즵; 즵; ) HANGUL SYLLABLE JYIB +C9B6;C9B6;110C 1174 11B9;C9B6;110C 1174 11B9; # (즶; 즶; 즶; 즶; 즶; ) HANGUL SYLLABLE JYIBS +C9B7;C9B7;110C 1174 11BA;C9B7;110C 1174 11BA; # (즷; 즷; 즷; 즷; 즷; ) HANGUL SYLLABLE JYIS +C9B8;C9B8;110C 1174 11BB;C9B8;110C 1174 11BB; # (즸; 즸; 즸; 즸; 즸; ) HANGUL SYLLABLE JYISS +C9B9;C9B9;110C 1174 11BC;C9B9;110C 1174 11BC; # (즹; 즹; 즹; 즹; 즹; ) HANGUL SYLLABLE JYING +C9BA;C9BA;110C 1174 11BD;C9BA;110C 1174 11BD; # (즺; 즺; 즺; 즺; 즺; ) HANGUL SYLLABLE JYIJ +C9BB;C9BB;110C 1174 11BE;C9BB;110C 1174 11BE; # (즻; 즻; 즻; 즻; 즻; ) HANGUL SYLLABLE JYIC +C9BC;C9BC;110C 1174 11BF;C9BC;110C 1174 11BF; # (즼; 즼; 즼; 즼; 즼; ) HANGUL SYLLABLE JYIK +C9BD;C9BD;110C 1174 11C0;C9BD;110C 1174 11C0; # (즽; 즽; 즽; 즽; 즽; ) HANGUL SYLLABLE JYIT +C9BE;C9BE;110C 1174 11C1;C9BE;110C 1174 11C1; # (즾; 즾; 즾; 즾; 즾; ) HANGUL SYLLABLE JYIP +C9BF;C9BF;110C 1174 11C2;C9BF;110C 1174 11C2; # (즿; 즿; 즿; 즿; 즿; ) HANGUL SYLLABLE JYIH +C9C0;C9C0;110C 1175;C9C0;110C 1175; # (지; 지; 지; 지; 지; ) HANGUL SYLLABLE JI +C9C1;C9C1;110C 1175 11A8;C9C1;110C 1175 11A8; # (직; 직; 직; 직; 직; ) HANGUL SYLLABLE JIG +C9C2;C9C2;110C 1175 11A9;C9C2;110C 1175 11A9; # (짂; 짂; 짂; 짂; 짂; ) HANGUL SYLLABLE JIGG +C9C3;C9C3;110C 1175 11AA;C9C3;110C 1175 11AA; # (짃; 짃; 짃; 짃; 짃; ) HANGUL SYLLABLE JIGS +C9C4;C9C4;110C 1175 11AB;C9C4;110C 1175 11AB; # (진; 진; 진; 진; 진; ) HANGUL SYLLABLE JIN +C9C5;C9C5;110C 1175 11AC;C9C5;110C 1175 11AC; # (짅; 짅; 짅; 짅; 짅; ) HANGUL SYLLABLE JINJ +C9C6;C9C6;110C 1175 11AD;C9C6;110C 1175 11AD; # (짆; 짆; 짆; 짆; 짆; ) HANGUL SYLLABLE JINH +C9C7;C9C7;110C 1175 11AE;C9C7;110C 1175 11AE; # (짇; 짇; 짇; 짇; 짇; ) HANGUL SYLLABLE JID +C9C8;C9C8;110C 1175 11AF;C9C8;110C 1175 11AF; # (질; 질; 질; 질; 질; ) HANGUL SYLLABLE JIL +C9C9;C9C9;110C 1175 11B0;C9C9;110C 1175 11B0; # (짉; 짉; 짉; 짉; 짉; ) HANGUL SYLLABLE JILG +C9CA;C9CA;110C 1175 11B1;C9CA;110C 1175 11B1; # (짊; 짊; 짊; 짊; 짊; ) HANGUL SYLLABLE JILM +C9CB;C9CB;110C 1175 11B2;C9CB;110C 1175 11B2; # (짋; 짋; 짋; 짋; 짋; ) HANGUL SYLLABLE JILB +C9CC;C9CC;110C 1175 11B3;C9CC;110C 1175 11B3; # (짌; 짌; 짌; 짌; 짌; ) HANGUL SYLLABLE JILS +C9CD;C9CD;110C 1175 11B4;C9CD;110C 1175 11B4; # (짍; 짍; 짍; 짍; 짍; ) HANGUL SYLLABLE JILT +C9CE;C9CE;110C 1175 11B5;C9CE;110C 1175 11B5; # (짎; 짎; 짎; 짎; 짎; ) HANGUL SYLLABLE JILP +C9CF;C9CF;110C 1175 11B6;C9CF;110C 1175 11B6; # (짏; 짏; 짏; 짏; 짏; ) HANGUL SYLLABLE JILH +C9D0;C9D0;110C 1175 11B7;C9D0;110C 1175 11B7; # (짐; 짐; 짐; 짐; 짐; ) HANGUL SYLLABLE JIM +C9D1;C9D1;110C 1175 11B8;C9D1;110C 1175 11B8; # (집; 집; 집; 집; 집; ) HANGUL SYLLABLE JIB +C9D2;C9D2;110C 1175 11B9;C9D2;110C 1175 11B9; # (짒; 짒; 짒; 짒; 짒; ) HANGUL SYLLABLE JIBS +C9D3;C9D3;110C 1175 11BA;C9D3;110C 1175 11BA; # (짓; 짓; 짓; 짓; 짓; ) HANGUL SYLLABLE JIS +C9D4;C9D4;110C 1175 11BB;C9D4;110C 1175 11BB; # (짔; 짔; 짔; 짔; 짔; ) HANGUL SYLLABLE JISS +C9D5;C9D5;110C 1175 11BC;C9D5;110C 1175 11BC; # (징; 징; 징; 징; 징; ) HANGUL SYLLABLE JING +C9D6;C9D6;110C 1175 11BD;C9D6;110C 1175 11BD; # (짖; 짖; 짖; 짖; 짖; ) HANGUL SYLLABLE JIJ +C9D7;C9D7;110C 1175 11BE;C9D7;110C 1175 11BE; # (짗; 짗; 짗; 짗; 짗; ) HANGUL SYLLABLE JIC +C9D8;C9D8;110C 1175 11BF;C9D8;110C 1175 11BF; # (짘; 짘; 짘; 짘; 짘; ) HANGUL SYLLABLE JIK +C9D9;C9D9;110C 1175 11C0;C9D9;110C 1175 11C0; # (짙; 짙; 짙; 짙; 짙; ) HANGUL SYLLABLE JIT +C9DA;C9DA;110C 1175 11C1;C9DA;110C 1175 11C1; # (짚; 짚; 짚; 짚; 짚; ) HANGUL SYLLABLE JIP +C9DB;C9DB;110C 1175 11C2;C9DB;110C 1175 11C2; # (짛; 짛; 짛; 짛; 짛; ) HANGUL SYLLABLE JIH +C9DC;C9DC;110D 1161;C9DC;110D 1161; # (짜; 짜; 짜; 짜; 짜; ) HANGUL SYLLABLE JJA +C9DD;C9DD;110D 1161 11A8;C9DD;110D 1161 11A8; # (짝; 짝; 짝; 짝; 짝; ) HANGUL SYLLABLE JJAG +C9DE;C9DE;110D 1161 11A9;C9DE;110D 1161 11A9; # (짞; 짞; 짞; 짞; 짞; ) HANGUL SYLLABLE JJAGG +C9DF;C9DF;110D 1161 11AA;C9DF;110D 1161 11AA; # (짟; 짟; 짟; 짟; 짟; ) HANGUL SYLLABLE JJAGS +C9E0;C9E0;110D 1161 11AB;C9E0;110D 1161 11AB; # (짠; 짠; 짠; 짠; 짠; ) HANGUL SYLLABLE JJAN +C9E1;C9E1;110D 1161 11AC;C9E1;110D 1161 11AC; # (짡; 짡; 짡; 짡; 짡; ) HANGUL SYLLABLE JJANJ +C9E2;C9E2;110D 1161 11AD;C9E2;110D 1161 11AD; # (짢; 짢; 짢; 짢; 짢; ) HANGUL SYLLABLE JJANH +C9E3;C9E3;110D 1161 11AE;C9E3;110D 1161 11AE; # (짣; 짣; 짣; 짣; 짣; ) HANGUL SYLLABLE JJAD +C9E4;C9E4;110D 1161 11AF;C9E4;110D 1161 11AF; # (짤; 짤; 짤; 짤; 짤; ) HANGUL SYLLABLE JJAL +C9E5;C9E5;110D 1161 11B0;C9E5;110D 1161 11B0; # (짥; 짥; 짥; 짥; 짥; ) HANGUL SYLLABLE JJALG +C9E6;C9E6;110D 1161 11B1;C9E6;110D 1161 11B1; # (짦; 짦; 짦; 짦; 짦; ) HANGUL SYLLABLE JJALM +C9E7;C9E7;110D 1161 11B2;C9E7;110D 1161 11B2; # (짧; 짧; 짧; 짧; 짧; ) HANGUL SYLLABLE JJALB +C9E8;C9E8;110D 1161 11B3;C9E8;110D 1161 11B3; # (짨; 짨; 짨; 짨; 짨; ) HANGUL SYLLABLE JJALS +C9E9;C9E9;110D 1161 11B4;C9E9;110D 1161 11B4; # (짩; 짩; 짩; 짩; 짩; ) HANGUL SYLLABLE JJALT +C9EA;C9EA;110D 1161 11B5;C9EA;110D 1161 11B5; # (짪; 짪; 짪; 짪; 짪; ) HANGUL SYLLABLE JJALP +C9EB;C9EB;110D 1161 11B6;C9EB;110D 1161 11B6; # (짫; 짫; 짫; 짫; 짫; ) HANGUL SYLLABLE JJALH +C9EC;C9EC;110D 1161 11B7;C9EC;110D 1161 11B7; # (짬; 짬; 짬; 짬; 짬; ) HANGUL SYLLABLE JJAM +C9ED;C9ED;110D 1161 11B8;C9ED;110D 1161 11B8; # (짭; 짭; 짭; 짭; 짭; ) HANGUL SYLLABLE JJAB +C9EE;C9EE;110D 1161 11B9;C9EE;110D 1161 11B9; # (짮; 짮; 짮; 짮; 짮; ) HANGUL SYLLABLE JJABS +C9EF;C9EF;110D 1161 11BA;C9EF;110D 1161 11BA; # (짯; 짯; 짯; 짯; 짯; ) HANGUL SYLLABLE JJAS +C9F0;C9F0;110D 1161 11BB;C9F0;110D 1161 11BB; # (짰; 짰; 짰; 짰; 짰; ) HANGUL SYLLABLE JJASS +C9F1;C9F1;110D 1161 11BC;C9F1;110D 1161 11BC; # (짱; 짱; 짱; 짱; 짱; ) HANGUL SYLLABLE JJANG +C9F2;C9F2;110D 1161 11BD;C9F2;110D 1161 11BD; # (짲; 짲; 짲; 짲; 짲; ) HANGUL SYLLABLE JJAJ +C9F3;C9F3;110D 1161 11BE;C9F3;110D 1161 11BE; # (짳; 짳; 짳; 짳; 짳; ) HANGUL SYLLABLE JJAC +C9F4;C9F4;110D 1161 11BF;C9F4;110D 1161 11BF; # (짴; 짴; 짴; 짴; 짴; ) HANGUL SYLLABLE JJAK +C9F5;C9F5;110D 1161 11C0;C9F5;110D 1161 11C0; # (짵; 짵; 짵; 짵; 짵; ) HANGUL SYLLABLE JJAT +C9F6;C9F6;110D 1161 11C1;C9F6;110D 1161 11C1; # (짶; 짶; 짶; 짶; 짶; ) HANGUL SYLLABLE JJAP +C9F7;C9F7;110D 1161 11C2;C9F7;110D 1161 11C2; # (짷; 짷; 짷; 짷; 짷; ) HANGUL SYLLABLE JJAH +C9F8;C9F8;110D 1162;C9F8;110D 1162; # (째; 째; 째; 째; 째; ) HANGUL SYLLABLE JJAE +C9F9;C9F9;110D 1162 11A8;C9F9;110D 1162 11A8; # (짹; 짹; 짹; 짹; 짹; ) HANGUL SYLLABLE JJAEG +C9FA;C9FA;110D 1162 11A9;C9FA;110D 1162 11A9; # (짺; 짺; 짺; 짺; 짺; ) HANGUL SYLLABLE JJAEGG +C9FB;C9FB;110D 1162 11AA;C9FB;110D 1162 11AA; # (짻; 짻; 짻; 짻; 짻; ) HANGUL SYLLABLE JJAEGS +C9FC;C9FC;110D 1162 11AB;C9FC;110D 1162 11AB; # (짼; 짼; 짼; 짼; 짼; ) HANGUL SYLLABLE JJAEN +C9FD;C9FD;110D 1162 11AC;C9FD;110D 1162 11AC; # (짽; 짽; 짽; 짽; 짽; ) HANGUL SYLLABLE JJAENJ +C9FE;C9FE;110D 1162 11AD;C9FE;110D 1162 11AD; # (짾; 짾; 짾; 짾; 짾; ) HANGUL SYLLABLE JJAENH +C9FF;C9FF;110D 1162 11AE;C9FF;110D 1162 11AE; # (짿; 짿; 짿; 짿; 짿; ) HANGUL SYLLABLE JJAED +CA00;CA00;110D 1162 11AF;CA00;110D 1162 11AF; # (쨀; 쨀; 쨀; 쨀; 쨀; ) HANGUL SYLLABLE JJAEL +CA01;CA01;110D 1162 11B0;CA01;110D 1162 11B0; # (쨁; 쨁; 쨁; 쨁; 쨁; ) HANGUL SYLLABLE JJAELG +CA02;CA02;110D 1162 11B1;CA02;110D 1162 11B1; # (쨂; 쨂; 쨂; 쨂; 쨂; ) HANGUL SYLLABLE JJAELM +CA03;CA03;110D 1162 11B2;CA03;110D 1162 11B2; # (쨃; 쨃; 쨃; 쨃; 쨃; ) HANGUL SYLLABLE JJAELB +CA04;CA04;110D 1162 11B3;CA04;110D 1162 11B3; # (쨄; 쨄; 쨄; 쨄; 쨄; ) HANGUL SYLLABLE JJAELS +CA05;CA05;110D 1162 11B4;CA05;110D 1162 11B4; # (쨅; 쨅; 쨅; 쨅; 쨅; ) HANGUL SYLLABLE JJAELT +CA06;CA06;110D 1162 11B5;CA06;110D 1162 11B5; # (쨆; 쨆; 쨆; 쨆; 쨆; ) HANGUL SYLLABLE JJAELP +CA07;CA07;110D 1162 11B6;CA07;110D 1162 11B6; # (쨇; 쨇; 쨇; 쨇; 쨇; ) HANGUL SYLLABLE JJAELH +CA08;CA08;110D 1162 11B7;CA08;110D 1162 11B7; # (쨈; 쨈; 쨈; 쨈; 쨈; ) HANGUL SYLLABLE JJAEM +CA09;CA09;110D 1162 11B8;CA09;110D 1162 11B8; # (쨉; 쨉; 쨉; 쨉; 쨉; ) HANGUL SYLLABLE JJAEB +CA0A;CA0A;110D 1162 11B9;CA0A;110D 1162 11B9; # (쨊; 쨊; 쨊; 쨊; 쨊; ) HANGUL SYLLABLE JJAEBS +CA0B;CA0B;110D 1162 11BA;CA0B;110D 1162 11BA; # (쨋; 쨋; 쨋; 쨋; 쨋; ) HANGUL SYLLABLE JJAES +CA0C;CA0C;110D 1162 11BB;CA0C;110D 1162 11BB; # (쨌; 쨌; 쨌; 쨌; 쨌; ) HANGUL SYLLABLE JJAESS +CA0D;CA0D;110D 1162 11BC;CA0D;110D 1162 11BC; # (쨍; 쨍; 쨍; 쨍; 쨍; ) HANGUL SYLLABLE JJAENG +CA0E;CA0E;110D 1162 11BD;CA0E;110D 1162 11BD; # (쨎; 쨎; 쨎; 쨎; 쨎; ) HANGUL SYLLABLE JJAEJ +CA0F;CA0F;110D 1162 11BE;CA0F;110D 1162 11BE; # (쨏; 쨏; 쨏; 쨏; 쨏; ) HANGUL SYLLABLE JJAEC +CA10;CA10;110D 1162 11BF;CA10;110D 1162 11BF; # (쨐; 쨐; 쨐; 쨐; 쨐; ) HANGUL SYLLABLE JJAEK +CA11;CA11;110D 1162 11C0;CA11;110D 1162 11C0; # (쨑; 쨑; 쨑; 쨑; 쨑; ) HANGUL SYLLABLE JJAET +CA12;CA12;110D 1162 11C1;CA12;110D 1162 11C1; # (쨒; 쨒; 쨒; 쨒; 쨒; ) HANGUL SYLLABLE JJAEP +CA13;CA13;110D 1162 11C2;CA13;110D 1162 11C2; # (쨓; 쨓; 쨓; 쨓; 쨓; ) HANGUL SYLLABLE JJAEH +CA14;CA14;110D 1163;CA14;110D 1163; # (쨔; 쨔; 쨔; 쨔; 쨔; ) HANGUL SYLLABLE JJYA +CA15;CA15;110D 1163 11A8;CA15;110D 1163 11A8; # (쨕; 쨕; 쨕; 쨕; 쨕; ) HANGUL SYLLABLE JJYAG +CA16;CA16;110D 1163 11A9;CA16;110D 1163 11A9; # (쨖; 쨖; 쨖; 쨖; 쨖; ) HANGUL SYLLABLE JJYAGG +CA17;CA17;110D 1163 11AA;CA17;110D 1163 11AA; # (쨗; 쨗; 쨗; 쨗; 쨗; ) HANGUL SYLLABLE JJYAGS +CA18;CA18;110D 1163 11AB;CA18;110D 1163 11AB; # (쨘; 쨘; 쨘; 쨘; 쨘; ) HANGUL SYLLABLE JJYAN +CA19;CA19;110D 1163 11AC;CA19;110D 1163 11AC; # (쨙; 쨙; 쨙; 쨙; 쨙; ) HANGUL SYLLABLE JJYANJ +CA1A;CA1A;110D 1163 11AD;CA1A;110D 1163 11AD; # (쨚; 쨚; 쨚; 쨚; 쨚; ) HANGUL SYLLABLE JJYANH +CA1B;CA1B;110D 1163 11AE;CA1B;110D 1163 11AE; # (쨛; 쨛; 쨛; 쨛; 쨛; ) HANGUL SYLLABLE JJYAD +CA1C;CA1C;110D 1163 11AF;CA1C;110D 1163 11AF; # (쨜; 쨜; 쨜; 쨜; 쨜; ) HANGUL SYLLABLE JJYAL +CA1D;CA1D;110D 1163 11B0;CA1D;110D 1163 11B0; # (쨝; 쨝; 쨝; 쨝; 쨝; ) HANGUL SYLLABLE JJYALG +CA1E;CA1E;110D 1163 11B1;CA1E;110D 1163 11B1; # (쨞; 쨞; 쨞; 쨞; 쨞; ) HANGUL SYLLABLE JJYALM +CA1F;CA1F;110D 1163 11B2;CA1F;110D 1163 11B2; # (쨟; 쨟; 쨟; 쨟; 쨟; ) HANGUL SYLLABLE JJYALB +CA20;CA20;110D 1163 11B3;CA20;110D 1163 11B3; # (쨠; 쨠; 쨠; 쨠; 쨠; ) HANGUL SYLLABLE JJYALS +CA21;CA21;110D 1163 11B4;CA21;110D 1163 11B4; # (쨡; 쨡; 쨡; 쨡; 쨡; ) HANGUL SYLLABLE JJYALT +CA22;CA22;110D 1163 11B5;CA22;110D 1163 11B5; # (쨢; 쨢; 쨢; 쨢; 쨢; ) HANGUL SYLLABLE JJYALP +CA23;CA23;110D 1163 11B6;CA23;110D 1163 11B6; # (쨣; 쨣; 쨣; 쨣; 쨣; ) HANGUL SYLLABLE JJYALH +CA24;CA24;110D 1163 11B7;CA24;110D 1163 11B7; # (쨤; 쨤; 쨤; 쨤; 쨤; ) HANGUL SYLLABLE JJYAM +CA25;CA25;110D 1163 11B8;CA25;110D 1163 11B8; # (쨥; 쨥; 쨥; 쨥; 쨥; ) HANGUL SYLLABLE JJYAB +CA26;CA26;110D 1163 11B9;CA26;110D 1163 11B9; # (쨦; 쨦; 쨦; 쨦; 쨦; ) HANGUL SYLLABLE JJYABS +CA27;CA27;110D 1163 11BA;CA27;110D 1163 11BA; # (쨧; 쨧; 쨧; 쨧; 쨧; ) HANGUL SYLLABLE JJYAS +CA28;CA28;110D 1163 11BB;CA28;110D 1163 11BB; # (쨨; 쨨; 쨨; 쨨; 쨨; ) HANGUL SYLLABLE JJYASS +CA29;CA29;110D 1163 11BC;CA29;110D 1163 11BC; # (쨩; 쨩; 쨩; 쨩; 쨩; ) HANGUL SYLLABLE JJYANG +CA2A;CA2A;110D 1163 11BD;CA2A;110D 1163 11BD; # (쨪; 쨪; 쨪; 쨪; 쨪; ) HANGUL SYLLABLE JJYAJ +CA2B;CA2B;110D 1163 11BE;CA2B;110D 1163 11BE; # (쨫; 쨫; 쨫; 쨫; 쨫; ) HANGUL SYLLABLE JJYAC +CA2C;CA2C;110D 1163 11BF;CA2C;110D 1163 11BF; # (쨬; 쨬; 쨬; 쨬; 쨬; ) HANGUL SYLLABLE JJYAK +CA2D;CA2D;110D 1163 11C0;CA2D;110D 1163 11C0; # (쨭; 쨭; 쨭; 쨭; 쨭; ) HANGUL SYLLABLE JJYAT +CA2E;CA2E;110D 1163 11C1;CA2E;110D 1163 11C1; # (쨮; 쨮; 쨮; 쨮; 쨮; ) HANGUL SYLLABLE JJYAP +CA2F;CA2F;110D 1163 11C2;CA2F;110D 1163 11C2; # (쨯; 쨯; 쨯; 쨯; 쨯; ) HANGUL SYLLABLE JJYAH +CA30;CA30;110D 1164;CA30;110D 1164; # (쨰; 쨰; 쨰; 쨰; 쨰; ) HANGUL SYLLABLE JJYAE +CA31;CA31;110D 1164 11A8;CA31;110D 1164 11A8; # (쨱; 쨱; 쨱; 쨱; 쨱; ) HANGUL SYLLABLE JJYAEG +CA32;CA32;110D 1164 11A9;CA32;110D 1164 11A9; # (쨲; 쨲; 쨲; 쨲; 쨲; ) HANGUL SYLLABLE JJYAEGG +CA33;CA33;110D 1164 11AA;CA33;110D 1164 11AA; # (쨳; 쨳; 쨳; 쨳; 쨳; ) HANGUL SYLLABLE JJYAEGS +CA34;CA34;110D 1164 11AB;CA34;110D 1164 11AB; # (쨴; 쨴; 쨴; 쨴; 쨴; ) HANGUL SYLLABLE JJYAEN +CA35;CA35;110D 1164 11AC;CA35;110D 1164 11AC; # (쨵; 쨵; 쨵; 쨵; 쨵; ) HANGUL SYLLABLE JJYAENJ +CA36;CA36;110D 1164 11AD;CA36;110D 1164 11AD; # (쨶; 쨶; 쨶; 쨶; 쨶; ) HANGUL SYLLABLE JJYAENH +CA37;CA37;110D 1164 11AE;CA37;110D 1164 11AE; # (쨷; 쨷; 쨷; 쨷; 쨷; ) HANGUL SYLLABLE JJYAED +CA38;CA38;110D 1164 11AF;CA38;110D 1164 11AF; # (쨸; 쨸; 쨸; 쨸; 쨸; ) HANGUL SYLLABLE JJYAEL +CA39;CA39;110D 1164 11B0;CA39;110D 1164 11B0; # (쨹; 쨹; 쨹; 쨹; 쨹; ) HANGUL SYLLABLE JJYAELG +CA3A;CA3A;110D 1164 11B1;CA3A;110D 1164 11B1; # (쨺; 쨺; 쨺; 쨺; 쨺; ) HANGUL SYLLABLE JJYAELM +CA3B;CA3B;110D 1164 11B2;CA3B;110D 1164 11B2; # (쨻; 쨻; 쨻; 쨻; 쨻; ) HANGUL SYLLABLE JJYAELB +CA3C;CA3C;110D 1164 11B3;CA3C;110D 1164 11B3; # (쨼; 쨼; 쨼; 쨼; 쨼; ) HANGUL SYLLABLE JJYAELS +CA3D;CA3D;110D 1164 11B4;CA3D;110D 1164 11B4; # (쨽; 쨽; 쨽; 쨽; 쨽; ) HANGUL SYLLABLE JJYAELT +CA3E;CA3E;110D 1164 11B5;CA3E;110D 1164 11B5; # (쨾; 쨾; 쨾; 쨾; 쨾; ) HANGUL SYLLABLE JJYAELP +CA3F;CA3F;110D 1164 11B6;CA3F;110D 1164 11B6; # (쨿; 쨿; 쨿; 쨿; 쨿; ) HANGUL SYLLABLE JJYAELH +CA40;CA40;110D 1164 11B7;CA40;110D 1164 11B7; # (쩀; 쩀; 쩀; 쩀; 쩀; ) HANGUL SYLLABLE JJYAEM +CA41;CA41;110D 1164 11B8;CA41;110D 1164 11B8; # (쩁; 쩁; 쩁; 쩁; 쩁; ) HANGUL SYLLABLE JJYAEB +CA42;CA42;110D 1164 11B9;CA42;110D 1164 11B9; # (쩂; 쩂; 쩂; 쩂; 쩂; ) HANGUL SYLLABLE JJYAEBS +CA43;CA43;110D 1164 11BA;CA43;110D 1164 11BA; # (쩃; 쩃; 쩃; 쩃; 쩃; ) HANGUL SYLLABLE JJYAES +CA44;CA44;110D 1164 11BB;CA44;110D 1164 11BB; # (쩄; 쩄; 쩄; 쩄; 쩄; ) HANGUL SYLLABLE JJYAESS +CA45;CA45;110D 1164 11BC;CA45;110D 1164 11BC; # (쩅; 쩅; 쩅; 쩅; 쩅; ) HANGUL SYLLABLE JJYAENG +CA46;CA46;110D 1164 11BD;CA46;110D 1164 11BD; # (쩆; 쩆; 쩆; 쩆; 쩆; ) HANGUL SYLLABLE JJYAEJ +CA47;CA47;110D 1164 11BE;CA47;110D 1164 11BE; # (쩇; 쩇; 쩇; 쩇; 쩇; ) HANGUL SYLLABLE JJYAEC +CA48;CA48;110D 1164 11BF;CA48;110D 1164 11BF; # (쩈; 쩈; 쩈; 쩈; 쩈; ) HANGUL SYLLABLE JJYAEK +CA49;CA49;110D 1164 11C0;CA49;110D 1164 11C0; # (쩉; 쩉; 쩉; 쩉; 쩉; ) HANGUL SYLLABLE JJYAET +CA4A;CA4A;110D 1164 11C1;CA4A;110D 1164 11C1; # (쩊; 쩊; 쩊; 쩊; 쩊; ) HANGUL SYLLABLE JJYAEP +CA4B;CA4B;110D 1164 11C2;CA4B;110D 1164 11C2; # (쩋; 쩋; 쩋; 쩋; 쩋; ) HANGUL SYLLABLE JJYAEH +CA4C;CA4C;110D 1165;CA4C;110D 1165; # (쩌; 쩌; 쩌; 쩌; 쩌; ) HANGUL SYLLABLE JJEO +CA4D;CA4D;110D 1165 11A8;CA4D;110D 1165 11A8; # (쩍; 쩍; 쩍; 쩍; 쩍; ) HANGUL SYLLABLE JJEOG +CA4E;CA4E;110D 1165 11A9;CA4E;110D 1165 11A9; # (쩎; 쩎; 쩎; 쩎; 쩎; ) HANGUL SYLLABLE JJEOGG +CA4F;CA4F;110D 1165 11AA;CA4F;110D 1165 11AA; # (쩏; 쩏; 쩏; 쩏; 쩏; ) HANGUL SYLLABLE JJEOGS +CA50;CA50;110D 1165 11AB;CA50;110D 1165 11AB; # (쩐; 쩐; 쩐; 쩐; 쩐; ) HANGUL SYLLABLE JJEON +CA51;CA51;110D 1165 11AC;CA51;110D 1165 11AC; # (쩑; 쩑; 쩑; 쩑; 쩑; ) HANGUL SYLLABLE JJEONJ +CA52;CA52;110D 1165 11AD;CA52;110D 1165 11AD; # (쩒; 쩒; 쩒; 쩒; 쩒; ) HANGUL SYLLABLE JJEONH +CA53;CA53;110D 1165 11AE;CA53;110D 1165 11AE; # (쩓; 쩓; 쩓; 쩓; 쩓; ) HANGUL SYLLABLE JJEOD +CA54;CA54;110D 1165 11AF;CA54;110D 1165 11AF; # (쩔; 쩔; 쩔; 쩔; 쩔; ) HANGUL SYLLABLE JJEOL +CA55;CA55;110D 1165 11B0;CA55;110D 1165 11B0; # (쩕; 쩕; 쩕; 쩕; 쩕; ) HANGUL SYLLABLE JJEOLG +CA56;CA56;110D 1165 11B1;CA56;110D 1165 11B1; # (쩖; 쩖; 쩖; 쩖; 쩖; ) HANGUL SYLLABLE JJEOLM +CA57;CA57;110D 1165 11B2;CA57;110D 1165 11B2; # (쩗; 쩗; 쩗; 쩗; 쩗; ) HANGUL SYLLABLE JJEOLB +CA58;CA58;110D 1165 11B3;CA58;110D 1165 11B3; # (쩘; 쩘; 쩘; 쩘; 쩘; ) HANGUL SYLLABLE JJEOLS +CA59;CA59;110D 1165 11B4;CA59;110D 1165 11B4; # (쩙; 쩙; 쩙; 쩙; 쩙; ) HANGUL SYLLABLE JJEOLT +CA5A;CA5A;110D 1165 11B5;CA5A;110D 1165 11B5; # (쩚; 쩚; 쩚; 쩚; 쩚; ) HANGUL SYLLABLE JJEOLP +CA5B;CA5B;110D 1165 11B6;CA5B;110D 1165 11B6; # (쩛; 쩛; 쩛; 쩛; 쩛; ) HANGUL SYLLABLE JJEOLH +CA5C;CA5C;110D 1165 11B7;CA5C;110D 1165 11B7; # (쩜; 쩜; 쩜; 쩜; 쩜; ) HANGUL SYLLABLE JJEOM +CA5D;CA5D;110D 1165 11B8;CA5D;110D 1165 11B8; # (쩝; 쩝; 쩝; 쩝; 쩝; ) HANGUL SYLLABLE JJEOB +CA5E;CA5E;110D 1165 11B9;CA5E;110D 1165 11B9; # (쩞; 쩞; 쩞; 쩞; 쩞; ) HANGUL SYLLABLE JJEOBS +CA5F;CA5F;110D 1165 11BA;CA5F;110D 1165 11BA; # (쩟; 쩟; 쩟; 쩟; 쩟; ) HANGUL SYLLABLE JJEOS +CA60;CA60;110D 1165 11BB;CA60;110D 1165 11BB; # (쩠; 쩠; 쩠; 쩠; 쩠; ) HANGUL SYLLABLE JJEOSS +CA61;CA61;110D 1165 11BC;CA61;110D 1165 11BC; # (쩡; 쩡; 쩡; 쩡; 쩡; ) HANGUL SYLLABLE JJEONG +CA62;CA62;110D 1165 11BD;CA62;110D 1165 11BD; # (쩢; 쩢; 쩢; 쩢; 쩢; ) HANGUL SYLLABLE JJEOJ +CA63;CA63;110D 1165 11BE;CA63;110D 1165 11BE; # (쩣; 쩣; 쩣; 쩣; 쩣; ) HANGUL SYLLABLE JJEOC +CA64;CA64;110D 1165 11BF;CA64;110D 1165 11BF; # (쩤; 쩤; 쩤; 쩤; 쩤; ) HANGUL SYLLABLE JJEOK +CA65;CA65;110D 1165 11C0;CA65;110D 1165 11C0; # (쩥; 쩥; 쩥; 쩥; 쩥; ) HANGUL SYLLABLE JJEOT +CA66;CA66;110D 1165 11C1;CA66;110D 1165 11C1; # (쩦; 쩦; 쩦; 쩦; 쩦; ) HANGUL SYLLABLE JJEOP +CA67;CA67;110D 1165 11C2;CA67;110D 1165 11C2; # (쩧; 쩧; 쩧; 쩧; 쩧; ) HANGUL SYLLABLE JJEOH +CA68;CA68;110D 1166;CA68;110D 1166; # (쩨; 쩨; 쩨; 쩨; 쩨; ) HANGUL SYLLABLE JJE +CA69;CA69;110D 1166 11A8;CA69;110D 1166 11A8; # (쩩; 쩩; 쩩; 쩩; 쩩; ) HANGUL SYLLABLE JJEG +CA6A;CA6A;110D 1166 11A9;CA6A;110D 1166 11A9; # (쩪; 쩪; 쩪; 쩪; 쩪; ) HANGUL SYLLABLE JJEGG +CA6B;CA6B;110D 1166 11AA;CA6B;110D 1166 11AA; # (쩫; 쩫; 쩫; 쩫; 쩫; ) HANGUL SYLLABLE JJEGS +CA6C;CA6C;110D 1166 11AB;CA6C;110D 1166 11AB; # (쩬; 쩬; 쩬; 쩬; 쩬; ) HANGUL SYLLABLE JJEN +CA6D;CA6D;110D 1166 11AC;CA6D;110D 1166 11AC; # (쩭; 쩭; 쩭; 쩭; 쩭; ) HANGUL SYLLABLE JJENJ +CA6E;CA6E;110D 1166 11AD;CA6E;110D 1166 11AD; # (쩮; 쩮; 쩮; 쩮; 쩮; ) HANGUL SYLLABLE JJENH +CA6F;CA6F;110D 1166 11AE;CA6F;110D 1166 11AE; # (쩯; 쩯; 쩯; 쩯; 쩯; ) HANGUL SYLLABLE JJED +CA70;CA70;110D 1166 11AF;CA70;110D 1166 11AF; # (쩰; 쩰; 쩰; 쩰; 쩰; ) HANGUL SYLLABLE JJEL +CA71;CA71;110D 1166 11B0;CA71;110D 1166 11B0; # (쩱; 쩱; 쩱; 쩱; 쩱; ) HANGUL SYLLABLE JJELG +CA72;CA72;110D 1166 11B1;CA72;110D 1166 11B1; # (쩲; 쩲; 쩲; 쩲; 쩲; ) HANGUL SYLLABLE JJELM +CA73;CA73;110D 1166 11B2;CA73;110D 1166 11B2; # (쩳; 쩳; 쩳; 쩳; 쩳; ) HANGUL SYLLABLE JJELB +CA74;CA74;110D 1166 11B3;CA74;110D 1166 11B3; # (쩴; 쩴; 쩴; 쩴; 쩴; ) HANGUL SYLLABLE JJELS +CA75;CA75;110D 1166 11B4;CA75;110D 1166 11B4; # (쩵; 쩵; 쩵; 쩵; 쩵; ) HANGUL SYLLABLE JJELT +CA76;CA76;110D 1166 11B5;CA76;110D 1166 11B5; # (쩶; 쩶; 쩶; 쩶; 쩶; ) HANGUL SYLLABLE JJELP +CA77;CA77;110D 1166 11B6;CA77;110D 1166 11B6; # (쩷; 쩷; 쩷; 쩷; 쩷; ) HANGUL SYLLABLE JJELH +CA78;CA78;110D 1166 11B7;CA78;110D 1166 11B7; # (쩸; 쩸; 쩸; 쩸; 쩸; ) HANGUL SYLLABLE JJEM +CA79;CA79;110D 1166 11B8;CA79;110D 1166 11B8; # (쩹; 쩹; 쩹; 쩹; 쩹; ) HANGUL SYLLABLE JJEB +CA7A;CA7A;110D 1166 11B9;CA7A;110D 1166 11B9; # (쩺; 쩺; 쩺; 쩺; 쩺; ) HANGUL SYLLABLE JJEBS +CA7B;CA7B;110D 1166 11BA;CA7B;110D 1166 11BA; # (쩻; 쩻; 쩻; 쩻; 쩻; ) HANGUL SYLLABLE JJES +CA7C;CA7C;110D 1166 11BB;CA7C;110D 1166 11BB; # (쩼; 쩼; 쩼; 쩼; 쩼; ) HANGUL SYLLABLE JJESS +CA7D;CA7D;110D 1166 11BC;CA7D;110D 1166 11BC; # (쩽; 쩽; 쩽; 쩽; 쩽; ) HANGUL SYLLABLE JJENG +CA7E;CA7E;110D 1166 11BD;CA7E;110D 1166 11BD; # (쩾; 쩾; 쩾; 쩾; 쩾; ) HANGUL SYLLABLE JJEJ +CA7F;CA7F;110D 1166 11BE;CA7F;110D 1166 11BE; # (쩿; 쩿; 쩿; 쩿; 쩿; ) HANGUL SYLLABLE JJEC +CA80;CA80;110D 1166 11BF;CA80;110D 1166 11BF; # (쪀; 쪀; 쪀; 쪀; 쪀; ) HANGUL SYLLABLE JJEK +CA81;CA81;110D 1166 11C0;CA81;110D 1166 11C0; # (쪁; 쪁; 쪁; 쪁; 쪁; ) HANGUL SYLLABLE JJET +CA82;CA82;110D 1166 11C1;CA82;110D 1166 11C1; # (쪂; 쪂; 쪂; 쪂; 쪂; ) HANGUL SYLLABLE JJEP +CA83;CA83;110D 1166 11C2;CA83;110D 1166 11C2; # (쪃; 쪃; 쪃; 쪃; 쪃; ) HANGUL SYLLABLE JJEH +CA84;CA84;110D 1167;CA84;110D 1167; # (쪄; 쪄; 쪄; 쪄; 쪄; ) HANGUL SYLLABLE JJYEO +CA85;CA85;110D 1167 11A8;CA85;110D 1167 11A8; # (쪅; 쪅; 쪅; 쪅; 쪅; ) HANGUL SYLLABLE JJYEOG +CA86;CA86;110D 1167 11A9;CA86;110D 1167 11A9; # (쪆; 쪆; 쪆; 쪆; 쪆; ) HANGUL SYLLABLE JJYEOGG +CA87;CA87;110D 1167 11AA;CA87;110D 1167 11AA; # (쪇; 쪇; 쪇; 쪇; 쪇; ) HANGUL SYLLABLE JJYEOGS +CA88;CA88;110D 1167 11AB;CA88;110D 1167 11AB; # (쪈; 쪈; 쪈; 쪈; 쪈; ) HANGUL SYLLABLE JJYEON +CA89;CA89;110D 1167 11AC;CA89;110D 1167 11AC; # (쪉; 쪉; 쪉; 쪉; 쪉; ) HANGUL SYLLABLE JJYEONJ +CA8A;CA8A;110D 1167 11AD;CA8A;110D 1167 11AD; # (쪊; 쪊; 쪊; 쪊; 쪊; ) HANGUL SYLLABLE JJYEONH +CA8B;CA8B;110D 1167 11AE;CA8B;110D 1167 11AE; # (쪋; 쪋; 쪋; 쪋; 쪋; ) HANGUL SYLLABLE JJYEOD +CA8C;CA8C;110D 1167 11AF;CA8C;110D 1167 11AF; # (쪌; 쪌; 쪌; 쪌; 쪌; ) HANGUL SYLLABLE JJYEOL +CA8D;CA8D;110D 1167 11B0;CA8D;110D 1167 11B0; # (쪍; 쪍; 쪍; 쪍; 쪍; ) HANGUL SYLLABLE JJYEOLG +CA8E;CA8E;110D 1167 11B1;CA8E;110D 1167 11B1; # (쪎; 쪎; 쪎; 쪎; 쪎; ) HANGUL SYLLABLE JJYEOLM +CA8F;CA8F;110D 1167 11B2;CA8F;110D 1167 11B2; # (쪏; 쪏; 쪏; 쪏; 쪏; ) HANGUL SYLLABLE JJYEOLB +CA90;CA90;110D 1167 11B3;CA90;110D 1167 11B3; # (쪐; 쪐; 쪐; 쪐; 쪐; ) HANGUL SYLLABLE JJYEOLS +CA91;CA91;110D 1167 11B4;CA91;110D 1167 11B4; # (쪑; 쪑; 쪑; 쪑; 쪑; ) HANGUL SYLLABLE JJYEOLT +CA92;CA92;110D 1167 11B5;CA92;110D 1167 11B5; # (쪒; 쪒; 쪒; 쪒; 쪒; ) HANGUL SYLLABLE JJYEOLP +CA93;CA93;110D 1167 11B6;CA93;110D 1167 11B6; # (쪓; 쪓; 쪓; 쪓; 쪓; ) HANGUL SYLLABLE JJYEOLH +CA94;CA94;110D 1167 11B7;CA94;110D 1167 11B7; # (쪔; 쪔; 쪔; 쪔; 쪔; ) HANGUL SYLLABLE JJYEOM +CA95;CA95;110D 1167 11B8;CA95;110D 1167 11B8; # (쪕; 쪕; 쪕; 쪕; 쪕; ) HANGUL SYLLABLE JJYEOB +CA96;CA96;110D 1167 11B9;CA96;110D 1167 11B9; # (쪖; 쪖; 쪖; 쪖; 쪖; ) HANGUL SYLLABLE JJYEOBS +CA97;CA97;110D 1167 11BA;CA97;110D 1167 11BA; # (쪗; 쪗; 쪗; 쪗; 쪗; ) HANGUL SYLLABLE JJYEOS +CA98;CA98;110D 1167 11BB;CA98;110D 1167 11BB; # (쪘; 쪘; 쪘; 쪘; 쪘; ) HANGUL SYLLABLE JJYEOSS +CA99;CA99;110D 1167 11BC;CA99;110D 1167 11BC; # (쪙; 쪙; 쪙; 쪙; 쪙; ) HANGUL SYLLABLE JJYEONG +CA9A;CA9A;110D 1167 11BD;CA9A;110D 1167 11BD; # (쪚; 쪚; 쪚; 쪚; 쪚; ) HANGUL SYLLABLE JJYEOJ +CA9B;CA9B;110D 1167 11BE;CA9B;110D 1167 11BE; # (쪛; 쪛; 쪛; 쪛; 쪛; ) HANGUL SYLLABLE JJYEOC +CA9C;CA9C;110D 1167 11BF;CA9C;110D 1167 11BF; # (쪜; 쪜; 쪜; 쪜; 쪜; ) HANGUL SYLLABLE JJYEOK +CA9D;CA9D;110D 1167 11C0;CA9D;110D 1167 11C0; # (쪝; 쪝; 쪝; 쪝; 쪝; ) HANGUL SYLLABLE JJYEOT +CA9E;CA9E;110D 1167 11C1;CA9E;110D 1167 11C1; # (쪞; 쪞; 쪞; 쪞; 쪞; ) HANGUL SYLLABLE JJYEOP +CA9F;CA9F;110D 1167 11C2;CA9F;110D 1167 11C2; # (쪟; 쪟; 쪟; 쪟; 쪟; ) HANGUL SYLLABLE JJYEOH +CAA0;CAA0;110D 1168;CAA0;110D 1168; # (쪠; 쪠; 쪠; 쪠; 쪠; ) HANGUL SYLLABLE JJYE +CAA1;CAA1;110D 1168 11A8;CAA1;110D 1168 11A8; # (쪡; 쪡; 쪡; 쪡; 쪡; ) HANGUL SYLLABLE JJYEG +CAA2;CAA2;110D 1168 11A9;CAA2;110D 1168 11A9; # (쪢; 쪢; 쪢; 쪢; 쪢; ) HANGUL SYLLABLE JJYEGG +CAA3;CAA3;110D 1168 11AA;CAA3;110D 1168 11AA; # (쪣; 쪣; 쪣; 쪣; 쪣; ) HANGUL SYLLABLE JJYEGS +CAA4;CAA4;110D 1168 11AB;CAA4;110D 1168 11AB; # (쪤; 쪤; 쪤; 쪤; 쪤; ) HANGUL SYLLABLE JJYEN +CAA5;CAA5;110D 1168 11AC;CAA5;110D 1168 11AC; # (쪥; 쪥; 쪥; 쪥; 쪥; ) HANGUL SYLLABLE JJYENJ +CAA6;CAA6;110D 1168 11AD;CAA6;110D 1168 11AD; # (쪦; 쪦; 쪦; 쪦; 쪦; ) HANGUL SYLLABLE JJYENH +CAA7;CAA7;110D 1168 11AE;CAA7;110D 1168 11AE; # (쪧; 쪧; 쪧; 쪧; 쪧; ) HANGUL SYLLABLE JJYED +CAA8;CAA8;110D 1168 11AF;CAA8;110D 1168 11AF; # (쪨; 쪨; 쪨; 쪨; 쪨; ) HANGUL SYLLABLE JJYEL +CAA9;CAA9;110D 1168 11B0;CAA9;110D 1168 11B0; # (쪩; 쪩; 쪩; 쪩; 쪩; ) HANGUL SYLLABLE JJYELG +CAAA;CAAA;110D 1168 11B1;CAAA;110D 1168 11B1; # (쪪; 쪪; 쪪; 쪪; 쪪; ) HANGUL SYLLABLE JJYELM +CAAB;CAAB;110D 1168 11B2;CAAB;110D 1168 11B2; # (쪫; 쪫; 쪫; 쪫; 쪫; ) HANGUL SYLLABLE JJYELB +CAAC;CAAC;110D 1168 11B3;CAAC;110D 1168 11B3; # (쪬; 쪬; 쪬; 쪬; 쪬; ) HANGUL SYLLABLE JJYELS +CAAD;CAAD;110D 1168 11B4;CAAD;110D 1168 11B4; # (쪭; 쪭; 쪭; 쪭; 쪭; ) HANGUL SYLLABLE JJYELT +CAAE;CAAE;110D 1168 11B5;CAAE;110D 1168 11B5; # (쪮; 쪮; 쪮; 쪮; 쪮; ) HANGUL SYLLABLE JJYELP +CAAF;CAAF;110D 1168 11B6;CAAF;110D 1168 11B6; # (쪯; 쪯; 쪯; 쪯; 쪯; ) HANGUL SYLLABLE JJYELH +CAB0;CAB0;110D 1168 11B7;CAB0;110D 1168 11B7; # (쪰; 쪰; 쪰; 쪰; 쪰; ) HANGUL SYLLABLE JJYEM +CAB1;CAB1;110D 1168 11B8;CAB1;110D 1168 11B8; # (쪱; 쪱; 쪱; 쪱; 쪱; ) HANGUL SYLLABLE JJYEB +CAB2;CAB2;110D 1168 11B9;CAB2;110D 1168 11B9; # (쪲; 쪲; 쪲; 쪲; 쪲; ) HANGUL SYLLABLE JJYEBS +CAB3;CAB3;110D 1168 11BA;CAB3;110D 1168 11BA; # (쪳; 쪳; 쪳; 쪳; 쪳; ) HANGUL SYLLABLE JJYES +CAB4;CAB4;110D 1168 11BB;CAB4;110D 1168 11BB; # (쪴; 쪴; 쪴; 쪴; 쪴; ) HANGUL SYLLABLE JJYESS +CAB5;CAB5;110D 1168 11BC;CAB5;110D 1168 11BC; # (쪵; 쪵; 쪵; 쪵; 쪵; ) HANGUL SYLLABLE JJYENG +CAB6;CAB6;110D 1168 11BD;CAB6;110D 1168 11BD; # (쪶; 쪶; 쪶; 쪶; 쪶; ) HANGUL SYLLABLE JJYEJ +CAB7;CAB7;110D 1168 11BE;CAB7;110D 1168 11BE; # (쪷; 쪷; 쪷; 쪷; 쪷; ) HANGUL SYLLABLE JJYEC +CAB8;CAB8;110D 1168 11BF;CAB8;110D 1168 11BF; # (쪸; 쪸; 쪸; 쪸; 쪸; ) HANGUL SYLLABLE JJYEK +CAB9;CAB9;110D 1168 11C0;CAB9;110D 1168 11C0; # (쪹; 쪹; 쪹; 쪹; 쪹; ) HANGUL SYLLABLE JJYET +CABA;CABA;110D 1168 11C1;CABA;110D 1168 11C1; # (쪺; 쪺; 쪺; 쪺; 쪺; ) HANGUL SYLLABLE JJYEP +CABB;CABB;110D 1168 11C2;CABB;110D 1168 11C2; # (쪻; 쪻; 쪻; 쪻; 쪻; ) HANGUL SYLLABLE JJYEH +CABC;CABC;110D 1169;CABC;110D 1169; # (쪼; 쪼; 쪼; 쪼; 쪼; ) HANGUL SYLLABLE JJO +CABD;CABD;110D 1169 11A8;CABD;110D 1169 11A8; # (쪽; 쪽; 쪽; 쪽; 쪽; ) HANGUL SYLLABLE JJOG +CABE;CABE;110D 1169 11A9;CABE;110D 1169 11A9; # (쪾; 쪾; 쪾; 쪾; 쪾; ) HANGUL SYLLABLE JJOGG +CABF;CABF;110D 1169 11AA;CABF;110D 1169 11AA; # (쪿; 쪿; 쪿; 쪿; 쪿; ) HANGUL SYLLABLE JJOGS +CAC0;CAC0;110D 1169 11AB;CAC0;110D 1169 11AB; # (쫀; 쫀; 쫀; 쫀; 쫀; ) HANGUL SYLLABLE JJON +CAC1;CAC1;110D 1169 11AC;CAC1;110D 1169 11AC; # (쫁; 쫁; 쫁; 쫁; 쫁; ) HANGUL SYLLABLE JJONJ +CAC2;CAC2;110D 1169 11AD;CAC2;110D 1169 11AD; # (쫂; 쫂; 쫂; 쫂; 쫂; ) HANGUL SYLLABLE JJONH +CAC3;CAC3;110D 1169 11AE;CAC3;110D 1169 11AE; # (쫃; 쫃; 쫃; 쫃; 쫃; ) HANGUL SYLLABLE JJOD +CAC4;CAC4;110D 1169 11AF;CAC4;110D 1169 11AF; # (쫄; 쫄; 쫄; 쫄; 쫄; ) HANGUL SYLLABLE JJOL +CAC5;CAC5;110D 1169 11B0;CAC5;110D 1169 11B0; # (쫅; 쫅; 쫅; 쫅; 쫅; ) HANGUL SYLLABLE JJOLG +CAC6;CAC6;110D 1169 11B1;CAC6;110D 1169 11B1; # (쫆; 쫆; 쫆; 쫆; 쫆; ) HANGUL SYLLABLE JJOLM +CAC7;CAC7;110D 1169 11B2;CAC7;110D 1169 11B2; # (쫇; 쫇; 쫇; 쫇; 쫇; ) HANGUL SYLLABLE JJOLB +CAC8;CAC8;110D 1169 11B3;CAC8;110D 1169 11B3; # (쫈; 쫈; 쫈; 쫈; 쫈; ) HANGUL SYLLABLE JJOLS +CAC9;CAC9;110D 1169 11B4;CAC9;110D 1169 11B4; # (쫉; 쫉; 쫉; 쫉; 쫉; ) HANGUL SYLLABLE JJOLT +CACA;CACA;110D 1169 11B5;CACA;110D 1169 11B5; # (쫊; 쫊; 쫊; 쫊; 쫊; ) HANGUL SYLLABLE JJOLP +CACB;CACB;110D 1169 11B6;CACB;110D 1169 11B6; # (쫋; 쫋; 쫋; 쫋; 쫋; ) HANGUL SYLLABLE JJOLH +CACC;CACC;110D 1169 11B7;CACC;110D 1169 11B7; # (쫌; 쫌; 쫌; 쫌; 쫌; ) HANGUL SYLLABLE JJOM +CACD;CACD;110D 1169 11B8;CACD;110D 1169 11B8; # (쫍; 쫍; 쫍; 쫍; 쫍; ) HANGUL SYLLABLE JJOB +CACE;CACE;110D 1169 11B9;CACE;110D 1169 11B9; # (쫎; 쫎; 쫎; 쫎; 쫎; ) HANGUL SYLLABLE JJOBS +CACF;CACF;110D 1169 11BA;CACF;110D 1169 11BA; # (쫏; 쫏; 쫏; 쫏; 쫏; ) HANGUL SYLLABLE JJOS +CAD0;CAD0;110D 1169 11BB;CAD0;110D 1169 11BB; # (쫐; 쫐; 쫐; 쫐; 쫐; ) HANGUL SYLLABLE JJOSS +CAD1;CAD1;110D 1169 11BC;CAD1;110D 1169 11BC; # (쫑; 쫑; 쫑; 쫑; 쫑; ) HANGUL SYLLABLE JJONG +CAD2;CAD2;110D 1169 11BD;CAD2;110D 1169 11BD; # (쫒; 쫒; 쫒; 쫒; 쫒; ) HANGUL SYLLABLE JJOJ +CAD3;CAD3;110D 1169 11BE;CAD3;110D 1169 11BE; # (쫓; 쫓; 쫓; 쫓; 쫓; ) HANGUL SYLLABLE JJOC +CAD4;CAD4;110D 1169 11BF;CAD4;110D 1169 11BF; # (쫔; 쫔; 쫔; 쫔; 쫔; ) HANGUL SYLLABLE JJOK +CAD5;CAD5;110D 1169 11C0;CAD5;110D 1169 11C0; # (쫕; 쫕; 쫕; 쫕; 쫕; ) HANGUL SYLLABLE JJOT +CAD6;CAD6;110D 1169 11C1;CAD6;110D 1169 11C1; # (쫖; 쫖; 쫖; 쫖; 쫖; ) HANGUL SYLLABLE JJOP +CAD7;CAD7;110D 1169 11C2;CAD7;110D 1169 11C2; # (쫗; 쫗; 쫗; 쫗; 쫗; ) HANGUL SYLLABLE JJOH +CAD8;CAD8;110D 116A;CAD8;110D 116A; # (쫘; 쫘; 쫘; 쫘; 쫘; ) HANGUL SYLLABLE JJWA +CAD9;CAD9;110D 116A 11A8;CAD9;110D 116A 11A8; # (쫙; 쫙; 쫙; 쫙; 쫙; ) HANGUL SYLLABLE JJWAG +CADA;CADA;110D 116A 11A9;CADA;110D 116A 11A9; # (쫚; 쫚; 쫚; 쫚; 쫚; ) HANGUL SYLLABLE JJWAGG +CADB;CADB;110D 116A 11AA;CADB;110D 116A 11AA; # (쫛; 쫛; 쫛; 쫛; 쫛; ) HANGUL SYLLABLE JJWAGS +CADC;CADC;110D 116A 11AB;CADC;110D 116A 11AB; # (쫜; 쫜; 쫜; 쫜; 쫜; ) HANGUL SYLLABLE JJWAN +CADD;CADD;110D 116A 11AC;CADD;110D 116A 11AC; # (쫝; 쫝; 쫝; 쫝; 쫝; ) HANGUL SYLLABLE JJWANJ +CADE;CADE;110D 116A 11AD;CADE;110D 116A 11AD; # (쫞; 쫞; 쫞; 쫞; 쫞; ) HANGUL SYLLABLE JJWANH +CADF;CADF;110D 116A 11AE;CADF;110D 116A 11AE; # (쫟; 쫟; 쫟; 쫟; 쫟; ) HANGUL SYLLABLE JJWAD +CAE0;CAE0;110D 116A 11AF;CAE0;110D 116A 11AF; # (쫠; 쫠; 쫠; 쫠; 쫠; ) HANGUL SYLLABLE JJWAL +CAE1;CAE1;110D 116A 11B0;CAE1;110D 116A 11B0; # (쫡; 쫡; 쫡; 쫡; 쫡; ) HANGUL SYLLABLE JJWALG +CAE2;CAE2;110D 116A 11B1;CAE2;110D 116A 11B1; # (쫢; 쫢; 쫢; 쫢; 쫢; ) HANGUL SYLLABLE JJWALM +CAE3;CAE3;110D 116A 11B2;CAE3;110D 116A 11B2; # (쫣; 쫣; 쫣; 쫣; 쫣; ) HANGUL SYLLABLE JJWALB +CAE4;CAE4;110D 116A 11B3;CAE4;110D 116A 11B3; # (쫤; 쫤; 쫤; 쫤; 쫤; ) HANGUL SYLLABLE JJWALS +CAE5;CAE5;110D 116A 11B4;CAE5;110D 116A 11B4; # (쫥; 쫥; 쫥; 쫥; 쫥; ) HANGUL SYLLABLE JJWALT +CAE6;CAE6;110D 116A 11B5;CAE6;110D 116A 11B5; # (쫦; 쫦; 쫦; 쫦; 쫦; ) HANGUL SYLLABLE JJWALP +CAE7;CAE7;110D 116A 11B6;CAE7;110D 116A 11B6; # (쫧; 쫧; 쫧; 쫧; 쫧; ) HANGUL SYLLABLE JJWALH +CAE8;CAE8;110D 116A 11B7;CAE8;110D 116A 11B7; # (쫨; 쫨; 쫨; 쫨; 쫨; ) HANGUL SYLLABLE JJWAM +CAE9;CAE9;110D 116A 11B8;CAE9;110D 116A 11B8; # (쫩; 쫩; 쫩; 쫩; 쫩; ) HANGUL SYLLABLE JJWAB +CAEA;CAEA;110D 116A 11B9;CAEA;110D 116A 11B9; # (쫪; 쫪; 쫪; 쫪; 쫪; ) HANGUL SYLLABLE JJWABS +CAEB;CAEB;110D 116A 11BA;CAEB;110D 116A 11BA; # (쫫; 쫫; 쫫; 쫫; 쫫; ) HANGUL SYLLABLE JJWAS +CAEC;CAEC;110D 116A 11BB;CAEC;110D 116A 11BB; # (쫬; 쫬; 쫬; 쫬; 쫬; ) HANGUL SYLLABLE JJWASS +CAED;CAED;110D 116A 11BC;CAED;110D 116A 11BC; # (쫭; 쫭; 쫭; 쫭; 쫭; ) HANGUL SYLLABLE JJWANG +CAEE;CAEE;110D 116A 11BD;CAEE;110D 116A 11BD; # (쫮; 쫮; 쫮; 쫮; 쫮; ) HANGUL SYLLABLE JJWAJ +CAEF;CAEF;110D 116A 11BE;CAEF;110D 116A 11BE; # (쫯; 쫯; 쫯; 쫯; 쫯; ) HANGUL SYLLABLE JJWAC +CAF0;CAF0;110D 116A 11BF;CAF0;110D 116A 11BF; # (쫰; 쫰; 쫰; 쫰; 쫰; ) HANGUL SYLLABLE JJWAK +CAF1;CAF1;110D 116A 11C0;CAF1;110D 116A 11C0; # (쫱; 쫱; 쫱; 쫱; 쫱; ) HANGUL SYLLABLE JJWAT +CAF2;CAF2;110D 116A 11C1;CAF2;110D 116A 11C1; # (쫲; 쫲; 쫲; 쫲; 쫲; ) HANGUL SYLLABLE JJWAP +CAF3;CAF3;110D 116A 11C2;CAF3;110D 116A 11C2; # (쫳; 쫳; 쫳; 쫳; 쫳; ) HANGUL SYLLABLE JJWAH +CAF4;CAF4;110D 116B;CAF4;110D 116B; # (쫴; 쫴; 쫴; 쫴; 쫴; ) HANGUL SYLLABLE JJWAE +CAF5;CAF5;110D 116B 11A8;CAF5;110D 116B 11A8; # (쫵; 쫵; 쫵; 쫵; 쫵; ) HANGUL SYLLABLE JJWAEG +CAF6;CAF6;110D 116B 11A9;CAF6;110D 116B 11A9; # (쫶; 쫶; 쫶; 쫶; 쫶; ) HANGUL SYLLABLE JJWAEGG +CAF7;CAF7;110D 116B 11AA;CAF7;110D 116B 11AA; # (쫷; 쫷; 쫷; 쫷; 쫷; ) HANGUL SYLLABLE JJWAEGS +CAF8;CAF8;110D 116B 11AB;CAF8;110D 116B 11AB; # (쫸; 쫸; 쫸; 쫸; 쫸; ) HANGUL SYLLABLE JJWAEN +CAF9;CAF9;110D 116B 11AC;CAF9;110D 116B 11AC; # (쫹; 쫹; 쫹; 쫹; 쫹; ) HANGUL SYLLABLE JJWAENJ +CAFA;CAFA;110D 116B 11AD;CAFA;110D 116B 11AD; # (쫺; 쫺; 쫺; 쫺; 쫺; ) HANGUL SYLLABLE JJWAENH +CAFB;CAFB;110D 116B 11AE;CAFB;110D 116B 11AE; # (쫻; 쫻; 쫻; 쫻; 쫻; ) HANGUL SYLLABLE JJWAED +CAFC;CAFC;110D 116B 11AF;CAFC;110D 116B 11AF; # (쫼; 쫼; 쫼; 쫼; 쫼; ) HANGUL SYLLABLE JJWAEL +CAFD;CAFD;110D 116B 11B0;CAFD;110D 116B 11B0; # (쫽; 쫽; 쫽; 쫽; 쫽; ) HANGUL SYLLABLE JJWAELG +CAFE;CAFE;110D 116B 11B1;CAFE;110D 116B 11B1; # (쫾; 쫾; 쫾; 쫾; 쫾; ) HANGUL SYLLABLE JJWAELM +CAFF;CAFF;110D 116B 11B2;CAFF;110D 116B 11B2; # (쫿; 쫿; 쫿; 쫿; 쫿; ) HANGUL SYLLABLE JJWAELB +CB00;CB00;110D 116B 11B3;CB00;110D 116B 11B3; # (쬀; 쬀; 쬀; 쬀; 쬀; ) HANGUL SYLLABLE JJWAELS +CB01;CB01;110D 116B 11B4;CB01;110D 116B 11B4; # (쬁; 쬁; 쬁; 쬁; 쬁; ) HANGUL SYLLABLE JJWAELT +CB02;CB02;110D 116B 11B5;CB02;110D 116B 11B5; # (쬂; 쬂; 쬂; 쬂; 쬂; ) HANGUL SYLLABLE JJWAELP +CB03;CB03;110D 116B 11B6;CB03;110D 116B 11B6; # (쬃; 쬃; 쬃; 쬃; 쬃; ) HANGUL SYLLABLE JJWAELH +CB04;CB04;110D 116B 11B7;CB04;110D 116B 11B7; # (쬄; 쬄; 쬄; 쬄; 쬄; ) HANGUL SYLLABLE JJWAEM +CB05;CB05;110D 116B 11B8;CB05;110D 116B 11B8; # (쬅; 쬅; 쬅; 쬅; 쬅; ) HANGUL SYLLABLE JJWAEB +CB06;CB06;110D 116B 11B9;CB06;110D 116B 11B9; # (쬆; 쬆; 쬆; 쬆; 쬆; ) HANGUL SYLLABLE JJWAEBS +CB07;CB07;110D 116B 11BA;CB07;110D 116B 11BA; # (쬇; 쬇; 쬇; 쬇; 쬇; ) HANGUL SYLLABLE JJWAES +CB08;CB08;110D 116B 11BB;CB08;110D 116B 11BB; # (쬈; 쬈; 쬈; 쬈; 쬈; ) HANGUL SYLLABLE JJWAESS +CB09;CB09;110D 116B 11BC;CB09;110D 116B 11BC; # (쬉; 쬉; 쬉; 쬉; 쬉; ) HANGUL SYLLABLE JJWAENG +CB0A;CB0A;110D 116B 11BD;CB0A;110D 116B 11BD; # (쬊; 쬊; 쬊; 쬊; 쬊; ) HANGUL SYLLABLE JJWAEJ +CB0B;CB0B;110D 116B 11BE;CB0B;110D 116B 11BE; # (쬋; 쬋; 쬋; 쬋; 쬋; ) HANGUL SYLLABLE JJWAEC +CB0C;CB0C;110D 116B 11BF;CB0C;110D 116B 11BF; # (쬌; 쬌; 쬌; 쬌; 쬌; ) HANGUL SYLLABLE JJWAEK +CB0D;CB0D;110D 116B 11C0;CB0D;110D 116B 11C0; # (쬍; 쬍; 쬍; 쬍; 쬍; ) HANGUL SYLLABLE JJWAET +CB0E;CB0E;110D 116B 11C1;CB0E;110D 116B 11C1; # (쬎; 쬎; 쬎; 쬎; 쬎; ) HANGUL SYLLABLE JJWAEP +CB0F;CB0F;110D 116B 11C2;CB0F;110D 116B 11C2; # (쬏; 쬏; 쬏; 쬏; 쬏; ) HANGUL SYLLABLE JJWAEH +CB10;CB10;110D 116C;CB10;110D 116C; # (쬐; 쬐; 쬐; 쬐; 쬐; ) HANGUL SYLLABLE JJOE +CB11;CB11;110D 116C 11A8;CB11;110D 116C 11A8; # (쬑; 쬑; 쬑; 쬑; 쬑; ) HANGUL SYLLABLE JJOEG +CB12;CB12;110D 116C 11A9;CB12;110D 116C 11A9; # (쬒; 쬒; 쬒; 쬒; 쬒; ) HANGUL SYLLABLE JJOEGG +CB13;CB13;110D 116C 11AA;CB13;110D 116C 11AA; # (쬓; 쬓; 쬓; 쬓; 쬓; ) HANGUL SYLLABLE JJOEGS +CB14;CB14;110D 116C 11AB;CB14;110D 116C 11AB; # (쬔; 쬔; 쬔; 쬔; 쬔; ) HANGUL SYLLABLE JJOEN +CB15;CB15;110D 116C 11AC;CB15;110D 116C 11AC; # (쬕; 쬕; 쬕; 쬕; 쬕; ) HANGUL SYLLABLE JJOENJ +CB16;CB16;110D 116C 11AD;CB16;110D 116C 11AD; # (쬖; 쬖; 쬖; 쬖; 쬖; ) HANGUL SYLLABLE JJOENH +CB17;CB17;110D 116C 11AE;CB17;110D 116C 11AE; # (쬗; 쬗; 쬗; 쬗; 쬗; ) HANGUL SYLLABLE JJOED +CB18;CB18;110D 116C 11AF;CB18;110D 116C 11AF; # (쬘; 쬘; 쬘; 쬘; 쬘; ) HANGUL SYLLABLE JJOEL +CB19;CB19;110D 116C 11B0;CB19;110D 116C 11B0; # (쬙; 쬙; 쬙; 쬙; 쬙; ) HANGUL SYLLABLE JJOELG +CB1A;CB1A;110D 116C 11B1;CB1A;110D 116C 11B1; # (쬚; 쬚; 쬚; 쬚; 쬚; ) HANGUL SYLLABLE JJOELM +CB1B;CB1B;110D 116C 11B2;CB1B;110D 116C 11B2; # (쬛; 쬛; 쬛; 쬛; 쬛; ) HANGUL SYLLABLE JJOELB +CB1C;CB1C;110D 116C 11B3;CB1C;110D 116C 11B3; # (쬜; 쬜; 쬜; 쬜; 쬜; ) HANGUL SYLLABLE JJOELS +CB1D;CB1D;110D 116C 11B4;CB1D;110D 116C 11B4; # (쬝; 쬝; 쬝; 쬝; 쬝; ) HANGUL SYLLABLE JJOELT +CB1E;CB1E;110D 116C 11B5;CB1E;110D 116C 11B5; # (쬞; 쬞; 쬞; 쬞; 쬞; ) HANGUL SYLLABLE JJOELP +CB1F;CB1F;110D 116C 11B6;CB1F;110D 116C 11B6; # (쬟; 쬟; 쬟; 쬟; 쬟; ) HANGUL SYLLABLE JJOELH +CB20;CB20;110D 116C 11B7;CB20;110D 116C 11B7; # (쬠; 쬠; 쬠; 쬠; 쬠; ) HANGUL SYLLABLE JJOEM +CB21;CB21;110D 116C 11B8;CB21;110D 116C 11B8; # (쬡; 쬡; 쬡; 쬡; 쬡; ) HANGUL SYLLABLE JJOEB +CB22;CB22;110D 116C 11B9;CB22;110D 116C 11B9; # (쬢; 쬢; 쬢; 쬢; 쬢; ) HANGUL SYLLABLE JJOEBS +CB23;CB23;110D 116C 11BA;CB23;110D 116C 11BA; # (쬣; 쬣; 쬣; 쬣; 쬣; ) HANGUL SYLLABLE JJOES +CB24;CB24;110D 116C 11BB;CB24;110D 116C 11BB; # (쬤; 쬤; 쬤; 쬤; 쬤; ) HANGUL SYLLABLE JJOESS +CB25;CB25;110D 116C 11BC;CB25;110D 116C 11BC; # (쬥; 쬥; 쬥; 쬥; 쬥; ) HANGUL SYLLABLE JJOENG +CB26;CB26;110D 116C 11BD;CB26;110D 116C 11BD; # (쬦; 쬦; 쬦; 쬦; 쬦; ) HANGUL SYLLABLE JJOEJ +CB27;CB27;110D 116C 11BE;CB27;110D 116C 11BE; # (쬧; 쬧; 쬧; 쬧; 쬧; ) HANGUL SYLLABLE JJOEC +CB28;CB28;110D 116C 11BF;CB28;110D 116C 11BF; # (쬨; 쬨; 쬨; 쬨; 쬨; ) HANGUL SYLLABLE JJOEK +CB29;CB29;110D 116C 11C0;CB29;110D 116C 11C0; # (쬩; 쬩; 쬩; 쬩; 쬩; ) HANGUL SYLLABLE JJOET +CB2A;CB2A;110D 116C 11C1;CB2A;110D 116C 11C1; # (쬪; 쬪; 쬪; 쬪; 쬪; ) HANGUL SYLLABLE JJOEP +CB2B;CB2B;110D 116C 11C2;CB2B;110D 116C 11C2; # (쬫; 쬫; 쬫; 쬫; 쬫; ) HANGUL SYLLABLE JJOEH +CB2C;CB2C;110D 116D;CB2C;110D 116D; # (쬬; 쬬; 쬬; 쬬; 쬬; ) HANGUL SYLLABLE JJYO +CB2D;CB2D;110D 116D 11A8;CB2D;110D 116D 11A8; # (쬭; 쬭; 쬭; 쬭; 쬭; ) HANGUL SYLLABLE JJYOG +CB2E;CB2E;110D 116D 11A9;CB2E;110D 116D 11A9; # (쬮; 쬮; 쬮; 쬮; 쬮; ) HANGUL SYLLABLE JJYOGG +CB2F;CB2F;110D 116D 11AA;CB2F;110D 116D 11AA; # (쬯; 쬯; 쬯; 쬯; 쬯; ) HANGUL SYLLABLE JJYOGS +CB30;CB30;110D 116D 11AB;CB30;110D 116D 11AB; # (쬰; 쬰; 쬰; 쬰; 쬰; ) HANGUL SYLLABLE JJYON +CB31;CB31;110D 116D 11AC;CB31;110D 116D 11AC; # (쬱; 쬱; 쬱; 쬱; 쬱; ) HANGUL SYLLABLE JJYONJ +CB32;CB32;110D 116D 11AD;CB32;110D 116D 11AD; # (쬲; 쬲; 쬲; 쬲; 쬲; ) HANGUL SYLLABLE JJYONH +CB33;CB33;110D 116D 11AE;CB33;110D 116D 11AE; # (쬳; 쬳; 쬳; 쬳; 쬳; ) HANGUL SYLLABLE JJYOD +CB34;CB34;110D 116D 11AF;CB34;110D 116D 11AF; # (쬴; 쬴; 쬴; 쬴; 쬴; ) HANGUL SYLLABLE JJYOL +CB35;CB35;110D 116D 11B0;CB35;110D 116D 11B0; # (쬵; 쬵; 쬵; 쬵; 쬵; ) HANGUL SYLLABLE JJYOLG +CB36;CB36;110D 116D 11B1;CB36;110D 116D 11B1; # (쬶; 쬶; 쬶; 쬶; 쬶; ) HANGUL SYLLABLE JJYOLM +CB37;CB37;110D 116D 11B2;CB37;110D 116D 11B2; # (쬷; 쬷; 쬷; 쬷; 쬷; ) HANGUL SYLLABLE JJYOLB +CB38;CB38;110D 116D 11B3;CB38;110D 116D 11B3; # (쬸; 쬸; 쬸; 쬸; 쬸; ) HANGUL SYLLABLE JJYOLS +CB39;CB39;110D 116D 11B4;CB39;110D 116D 11B4; # (쬹; 쬹; 쬹; 쬹; 쬹; ) HANGUL SYLLABLE JJYOLT +CB3A;CB3A;110D 116D 11B5;CB3A;110D 116D 11B5; # (쬺; 쬺; 쬺; 쬺; 쬺; ) HANGUL SYLLABLE JJYOLP +CB3B;CB3B;110D 116D 11B6;CB3B;110D 116D 11B6; # (쬻; 쬻; 쬻; 쬻; 쬻; ) HANGUL SYLLABLE JJYOLH +CB3C;CB3C;110D 116D 11B7;CB3C;110D 116D 11B7; # (쬼; 쬼; 쬼; 쬼; 쬼; ) HANGUL SYLLABLE JJYOM +CB3D;CB3D;110D 116D 11B8;CB3D;110D 116D 11B8; # (쬽; 쬽; 쬽; 쬽; 쬽; ) HANGUL SYLLABLE JJYOB +CB3E;CB3E;110D 116D 11B9;CB3E;110D 116D 11B9; # (쬾; 쬾; 쬾; 쬾; 쬾; ) HANGUL SYLLABLE JJYOBS +CB3F;CB3F;110D 116D 11BA;CB3F;110D 116D 11BA; # (쬿; 쬿; 쬿; 쬿; 쬿; ) HANGUL SYLLABLE JJYOS +CB40;CB40;110D 116D 11BB;CB40;110D 116D 11BB; # (쭀; 쭀; 쭀; 쭀; 쭀; ) HANGUL SYLLABLE JJYOSS +CB41;CB41;110D 116D 11BC;CB41;110D 116D 11BC; # (쭁; 쭁; 쭁; 쭁; 쭁; ) HANGUL SYLLABLE JJYONG +CB42;CB42;110D 116D 11BD;CB42;110D 116D 11BD; # (쭂; 쭂; 쭂; 쭂; 쭂; ) HANGUL SYLLABLE JJYOJ +CB43;CB43;110D 116D 11BE;CB43;110D 116D 11BE; # (쭃; 쭃; 쭃; 쭃; 쭃; ) HANGUL SYLLABLE JJYOC +CB44;CB44;110D 116D 11BF;CB44;110D 116D 11BF; # (쭄; 쭄; 쭄; 쭄; 쭄; ) HANGUL SYLLABLE JJYOK +CB45;CB45;110D 116D 11C0;CB45;110D 116D 11C0; # (쭅; 쭅; 쭅; 쭅; 쭅; ) HANGUL SYLLABLE JJYOT +CB46;CB46;110D 116D 11C1;CB46;110D 116D 11C1; # (쭆; 쭆; 쭆; 쭆; 쭆; ) HANGUL SYLLABLE JJYOP +CB47;CB47;110D 116D 11C2;CB47;110D 116D 11C2; # (쭇; 쭇; 쭇; 쭇; 쭇; ) HANGUL SYLLABLE JJYOH +CB48;CB48;110D 116E;CB48;110D 116E; # (쭈; 쭈; 쭈; 쭈; 쭈; ) HANGUL SYLLABLE JJU +CB49;CB49;110D 116E 11A8;CB49;110D 116E 11A8; # (쭉; 쭉; 쭉; 쭉; 쭉; ) HANGUL SYLLABLE JJUG +CB4A;CB4A;110D 116E 11A9;CB4A;110D 116E 11A9; # (쭊; 쭊; 쭊; 쭊; 쭊; ) HANGUL SYLLABLE JJUGG +CB4B;CB4B;110D 116E 11AA;CB4B;110D 116E 11AA; # (쭋; 쭋; 쭋; 쭋; 쭋; ) HANGUL SYLLABLE JJUGS +CB4C;CB4C;110D 116E 11AB;CB4C;110D 116E 11AB; # (쭌; 쭌; 쭌; 쭌; 쭌; ) HANGUL SYLLABLE JJUN +CB4D;CB4D;110D 116E 11AC;CB4D;110D 116E 11AC; # (쭍; 쭍; 쭍; 쭍; 쭍; ) HANGUL SYLLABLE JJUNJ +CB4E;CB4E;110D 116E 11AD;CB4E;110D 116E 11AD; # (쭎; 쭎; 쭎; 쭎; 쭎; ) HANGUL SYLLABLE JJUNH +CB4F;CB4F;110D 116E 11AE;CB4F;110D 116E 11AE; # (쭏; 쭏; 쭏; 쭏; 쭏; ) HANGUL SYLLABLE JJUD +CB50;CB50;110D 116E 11AF;CB50;110D 116E 11AF; # (쭐; 쭐; 쭐; 쭐; 쭐; ) HANGUL SYLLABLE JJUL +CB51;CB51;110D 116E 11B0;CB51;110D 116E 11B0; # (쭑; 쭑; 쭑; 쭑; 쭑; ) HANGUL SYLLABLE JJULG +CB52;CB52;110D 116E 11B1;CB52;110D 116E 11B1; # (쭒; 쭒; 쭒; 쭒; 쭒; ) HANGUL SYLLABLE JJULM +CB53;CB53;110D 116E 11B2;CB53;110D 116E 11B2; # (쭓; 쭓; 쭓; 쭓; 쭓; ) HANGUL SYLLABLE JJULB +CB54;CB54;110D 116E 11B3;CB54;110D 116E 11B3; # (쭔; 쭔; 쭔; 쭔; 쭔; ) HANGUL SYLLABLE JJULS +CB55;CB55;110D 116E 11B4;CB55;110D 116E 11B4; # (쭕; 쭕; 쭕; 쭕; 쭕; ) HANGUL SYLLABLE JJULT +CB56;CB56;110D 116E 11B5;CB56;110D 116E 11B5; # (쭖; 쭖; 쭖; 쭖; 쭖; ) HANGUL SYLLABLE JJULP +CB57;CB57;110D 116E 11B6;CB57;110D 116E 11B6; # (쭗; 쭗; 쭗; 쭗; 쭗; ) HANGUL SYLLABLE JJULH +CB58;CB58;110D 116E 11B7;CB58;110D 116E 11B7; # (쭘; 쭘; 쭘; 쭘; 쭘; ) HANGUL SYLLABLE JJUM +CB59;CB59;110D 116E 11B8;CB59;110D 116E 11B8; # (쭙; 쭙; 쭙; 쭙; 쭙; ) HANGUL SYLLABLE JJUB +CB5A;CB5A;110D 116E 11B9;CB5A;110D 116E 11B9; # (쭚; 쭚; 쭚; 쭚; 쭚; ) HANGUL SYLLABLE JJUBS +CB5B;CB5B;110D 116E 11BA;CB5B;110D 116E 11BA; # (쭛; 쭛; 쭛; 쭛; 쭛; ) HANGUL SYLLABLE JJUS +CB5C;CB5C;110D 116E 11BB;CB5C;110D 116E 11BB; # (쭜; 쭜; 쭜; 쭜; 쭜; ) HANGUL SYLLABLE JJUSS +CB5D;CB5D;110D 116E 11BC;CB5D;110D 116E 11BC; # (쭝; 쭝; 쭝; 쭝; 쭝; ) HANGUL SYLLABLE JJUNG +CB5E;CB5E;110D 116E 11BD;CB5E;110D 116E 11BD; # (쭞; 쭞; 쭞; 쭞; 쭞; ) HANGUL SYLLABLE JJUJ +CB5F;CB5F;110D 116E 11BE;CB5F;110D 116E 11BE; # (쭟; 쭟; 쭟; 쭟; 쭟; ) HANGUL SYLLABLE JJUC +CB60;CB60;110D 116E 11BF;CB60;110D 116E 11BF; # (쭠; 쭠; 쭠; 쭠; 쭠; ) HANGUL SYLLABLE JJUK +CB61;CB61;110D 116E 11C0;CB61;110D 116E 11C0; # (쭡; 쭡; 쭡; 쭡; 쭡; ) HANGUL SYLLABLE JJUT +CB62;CB62;110D 116E 11C1;CB62;110D 116E 11C1; # (쭢; 쭢; 쭢; 쭢; 쭢; ) HANGUL SYLLABLE JJUP +CB63;CB63;110D 116E 11C2;CB63;110D 116E 11C2; # (쭣; 쭣; 쭣; 쭣; 쭣; ) HANGUL SYLLABLE JJUH +CB64;CB64;110D 116F;CB64;110D 116F; # (쭤; 쭤; 쭤; 쭤; 쭤; ) HANGUL SYLLABLE JJWEO +CB65;CB65;110D 116F 11A8;CB65;110D 116F 11A8; # (쭥; 쭥; 쭥; 쭥; 쭥; ) HANGUL SYLLABLE JJWEOG +CB66;CB66;110D 116F 11A9;CB66;110D 116F 11A9; # (쭦; 쭦; 쭦; 쭦; 쭦; ) HANGUL SYLLABLE JJWEOGG +CB67;CB67;110D 116F 11AA;CB67;110D 116F 11AA; # (쭧; 쭧; 쭧; 쭧; 쭧; ) HANGUL SYLLABLE JJWEOGS +CB68;CB68;110D 116F 11AB;CB68;110D 116F 11AB; # (쭨; 쭨; 쭨; 쭨; 쭨; ) HANGUL SYLLABLE JJWEON +CB69;CB69;110D 116F 11AC;CB69;110D 116F 11AC; # (쭩; 쭩; 쭩; 쭩; 쭩; ) HANGUL SYLLABLE JJWEONJ +CB6A;CB6A;110D 116F 11AD;CB6A;110D 116F 11AD; # (쭪; 쭪; 쭪; 쭪; 쭪; ) HANGUL SYLLABLE JJWEONH +CB6B;CB6B;110D 116F 11AE;CB6B;110D 116F 11AE; # (쭫; 쭫; 쭫; 쭫; 쭫; ) HANGUL SYLLABLE JJWEOD +CB6C;CB6C;110D 116F 11AF;CB6C;110D 116F 11AF; # (쭬; 쭬; 쭬; 쭬; 쭬; ) HANGUL SYLLABLE JJWEOL +CB6D;CB6D;110D 116F 11B0;CB6D;110D 116F 11B0; # (쭭; 쭭; 쭭; 쭭; 쭭; ) HANGUL SYLLABLE JJWEOLG +CB6E;CB6E;110D 116F 11B1;CB6E;110D 116F 11B1; # (쭮; 쭮; 쭮; 쭮; 쭮; ) HANGUL SYLLABLE JJWEOLM +CB6F;CB6F;110D 116F 11B2;CB6F;110D 116F 11B2; # (쭯; 쭯; 쭯; 쭯; 쭯; ) HANGUL SYLLABLE JJWEOLB +CB70;CB70;110D 116F 11B3;CB70;110D 116F 11B3; # (쭰; 쭰; 쭰; 쭰; 쭰; ) HANGUL SYLLABLE JJWEOLS +CB71;CB71;110D 116F 11B4;CB71;110D 116F 11B4; # (쭱; 쭱; 쭱; 쭱; 쭱; ) HANGUL SYLLABLE JJWEOLT +CB72;CB72;110D 116F 11B5;CB72;110D 116F 11B5; # (쭲; 쭲; 쭲; 쭲; 쭲; ) HANGUL SYLLABLE JJWEOLP +CB73;CB73;110D 116F 11B6;CB73;110D 116F 11B6; # (쭳; 쭳; 쭳; 쭳; 쭳; ) HANGUL SYLLABLE JJWEOLH +CB74;CB74;110D 116F 11B7;CB74;110D 116F 11B7; # (쭴; 쭴; 쭴; 쭴; 쭴; ) HANGUL SYLLABLE JJWEOM +CB75;CB75;110D 116F 11B8;CB75;110D 116F 11B8; # (쭵; 쭵; 쭵; 쭵; 쭵; ) HANGUL SYLLABLE JJWEOB +CB76;CB76;110D 116F 11B9;CB76;110D 116F 11B9; # (쭶; 쭶; 쭶; 쭶; 쭶; ) HANGUL SYLLABLE JJWEOBS +CB77;CB77;110D 116F 11BA;CB77;110D 116F 11BA; # (쭷; 쭷; 쭷; 쭷; 쭷; ) HANGUL SYLLABLE JJWEOS +CB78;CB78;110D 116F 11BB;CB78;110D 116F 11BB; # (쭸; 쭸; 쭸; 쭸; 쭸; ) HANGUL SYLLABLE JJWEOSS +CB79;CB79;110D 116F 11BC;CB79;110D 116F 11BC; # (쭹; 쭹; 쭹; 쭹; 쭹; ) HANGUL SYLLABLE JJWEONG +CB7A;CB7A;110D 116F 11BD;CB7A;110D 116F 11BD; # (쭺; 쭺; 쭺; 쭺; 쭺; ) HANGUL SYLLABLE JJWEOJ +CB7B;CB7B;110D 116F 11BE;CB7B;110D 116F 11BE; # (쭻; 쭻; 쭻; 쭻; 쭻; ) HANGUL SYLLABLE JJWEOC +CB7C;CB7C;110D 116F 11BF;CB7C;110D 116F 11BF; # (쭼; 쭼; 쭼; 쭼; 쭼; ) HANGUL SYLLABLE JJWEOK +CB7D;CB7D;110D 116F 11C0;CB7D;110D 116F 11C0; # (쭽; 쭽; 쭽; 쭽; 쭽; ) HANGUL SYLLABLE JJWEOT +CB7E;CB7E;110D 116F 11C1;CB7E;110D 116F 11C1; # (쭾; 쭾; 쭾; 쭾; 쭾; ) HANGUL SYLLABLE JJWEOP +CB7F;CB7F;110D 116F 11C2;CB7F;110D 116F 11C2; # (쭿; 쭿; 쭿; 쭿; 쭿; ) HANGUL SYLLABLE JJWEOH +CB80;CB80;110D 1170;CB80;110D 1170; # (쮀; 쮀; 쮀; 쮀; 쮀; ) HANGUL SYLLABLE JJWE +CB81;CB81;110D 1170 11A8;CB81;110D 1170 11A8; # (쮁; 쮁; 쮁; 쮁; 쮁; ) HANGUL SYLLABLE JJWEG +CB82;CB82;110D 1170 11A9;CB82;110D 1170 11A9; # (쮂; 쮂; 쮂; 쮂; 쮂; ) HANGUL SYLLABLE JJWEGG +CB83;CB83;110D 1170 11AA;CB83;110D 1170 11AA; # (쮃; 쮃; 쮃; 쮃; 쮃; ) HANGUL SYLLABLE JJWEGS +CB84;CB84;110D 1170 11AB;CB84;110D 1170 11AB; # (쮄; 쮄; 쮄; 쮄; 쮄; ) HANGUL SYLLABLE JJWEN +CB85;CB85;110D 1170 11AC;CB85;110D 1170 11AC; # (쮅; 쮅; 쮅; 쮅; 쮅; ) HANGUL SYLLABLE JJWENJ +CB86;CB86;110D 1170 11AD;CB86;110D 1170 11AD; # (쮆; 쮆; 쮆; 쮆; 쮆; ) HANGUL SYLLABLE JJWENH +CB87;CB87;110D 1170 11AE;CB87;110D 1170 11AE; # (쮇; 쮇; 쮇; 쮇; 쮇; ) HANGUL SYLLABLE JJWED +CB88;CB88;110D 1170 11AF;CB88;110D 1170 11AF; # (쮈; 쮈; 쮈; 쮈; 쮈; ) HANGUL SYLLABLE JJWEL +CB89;CB89;110D 1170 11B0;CB89;110D 1170 11B0; # (쮉; 쮉; 쮉; 쮉; 쮉; ) HANGUL SYLLABLE JJWELG +CB8A;CB8A;110D 1170 11B1;CB8A;110D 1170 11B1; # (쮊; 쮊; 쮊; 쮊; 쮊; ) HANGUL SYLLABLE JJWELM +CB8B;CB8B;110D 1170 11B2;CB8B;110D 1170 11B2; # (쮋; 쮋; 쮋; 쮋; 쮋; ) HANGUL SYLLABLE JJWELB +CB8C;CB8C;110D 1170 11B3;CB8C;110D 1170 11B3; # (쮌; 쮌; 쮌; 쮌; 쮌; ) HANGUL SYLLABLE JJWELS +CB8D;CB8D;110D 1170 11B4;CB8D;110D 1170 11B4; # (쮍; 쮍; 쮍; 쮍; 쮍; ) HANGUL SYLLABLE JJWELT +CB8E;CB8E;110D 1170 11B5;CB8E;110D 1170 11B5; # (쮎; 쮎; 쮎; 쮎; 쮎; ) HANGUL SYLLABLE JJWELP +CB8F;CB8F;110D 1170 11B6;CB8F;110D 1170 11B6; # (쮏; 쮏; 쮏; 쮏; 쮏; ) HANGUL SYLLABLE JJWELH +CB90;CB90;110D 1170 11B7;CB90;110D 1170 11B7; # (쮐; 쮐; 쮐; 쮐; 쮐; ) HANGUL SYLLABLE JJWEM +CB91;CB91;110D 1170 11B8;CB91;110D 1170 11B8; # (쮑; 쮑; 쮑; 쮑; 쮑; ) HANGUL SYLLABLE JJWEB +CB92;CB92;110D 1170 11B9;CB92;110D 1170 11B9; # (쮒; 쮒; 쮒; 쮒; 쮒; ) HANGUL SYLLABLE JJWEBS +CB93;CB93;110D 1170 11BA;CB93;110D 1170 11BA; # (쮓; 쮓; 쮓; 쮓; 쮓; ) HANGUL SYLLABLE JJWES +CB94;CB94;110D 1170 11BB;CB94;110D 1170 11BB; # (쮔; 쮔; 쮔; 쮔; 쮔; ) HANGUL SYLLABLE JJWESS +CB95;CB95;110D 1170 11BC;CB95;110D 1170 11BC; # (쮕; 쮕; 쮕; 쮕; 쮕; ) HANGUL SYLLABLE JJWENG +CB96;CB96;110D 1170 11BD;CB96;110D 1170 11BD; # (쮖; 쮖; 쮖; 쮖; 쮖; ) HANGUL SYLLABLE JJWEJ +CB97;CB97;110D 1170 11BE;CB97;110D 1170 11BE; # (쮗; 쮗; 쮗; 쮗; 쮗; ) HANGUL SYLLABLE JJWEC +CB98;CB98;110D 1170 11BF;CB98;110D 1170 11BF; # (쮘; 쮘; 쮘; 쮘; 쮘; ) HANGUL SYLLABLE JJWEK +CB99;CB99;110D 1170 11C0;CB99;110D 1170 11C0; # (쮙; 쮙; 쮙; 쮙; 쮙; ) HANGUL SYLLABLE JJWET +CB9A;CB9A;110D 1170 11C1;CB9A;110D 1170 11C1; # (쮚; 쮚; 쮚; 쮚; 쮚; ) HANGUL SYLLABLE JJWEP +CB9B;CB9B;110D 1170 11C2;CB9B;110D 1170 11C2; # (쮛; 쮛; 쮛; 쮛; 쮛; ) HANGUL SYLLABLE JJWEH +CB9C;CB9C;110D 1171;CB9C;110D 1171; # (쮜; 쮜; 쮜; 쮜; 쮜; ) HANGUL SYLLABLE JJWI +CB9D;CB9D;110D 1171 11A8;CB9D;110D 1171 11A8; # (쮝; 쮝; 쮝; 쮝; 쮝; ) HANGUL SYLLABLE JJWIG +CB9E;CB9E;110D 1171 11A9;CB9E;110D 1171 11A9; # (쮞; 쮞; 쮞; 쮞; 쮞; ) HANGUL SYLLABLE JJWIGG +CB9F;CB9F;110D 1171 11AA;CB9F;110D 1171 11AA; # (쮟; 쮟; 쮟; 쮟; 쮟; ) HANGUL SYLLABLE JJWIGS +CBA0;CBA0;110D 1171 11AB;CBA0;110D 1171 11AB; # (쮠; 쮠; 쮠; 쮠; 쮠; ) HANGUL SYLLABLE JJWIN +CBA1;CBA1;110D 1171 11AC;CBA1;110D 1171 11AC; # (쮡; 쮡; 쮡; 쮡; 쮡; ) HANGUL SYLLABLE JJWINJ +CBA2;CBA2;110D 1171 11AD;CBA2;110D 1171 11AD; # (쮢; 쮢; 쮢; 쮢; 쮢; ) HANGUL SYLLABLE JJWINH +CBA3;CBA3;110D 1171 11AE;CBA3;110D 1171 11AE; # (쮣; 쮣; 쮣; 쮣; 쮣; ) HANGUL SYLLABLE JJWID +CBA4;CBA4;110D 1171 11AF;CBA4;110D 1171 11AF; # (쮤; 쮤; 쮤; 쮤; 쮤; ) HANGUL SYLLABLE JJWIL +CBA5;CBA5;110D 1171 11B0;CBA5;110D 1171 11B0; # (쮥; 쮥; 쮥; 쮥; 쮥; ) HANGUL SYLLABLE JJWILG +CBA6;CBA6;110D 1171 11B1;CBA6;110D 1171 11B1; # (쮦; 쮦; 쮦; 쮦; 쮦; ) HANGUL SYLLABLE JJWILM +CBA7;CBA7;110D 1171 11B2;CBA7;110D 1171 11B2; # (쮧; 쮧; 쮧; 쮧; 쮧; ) HANGUL SYLLABLE JJWILB +CBA8;CBA8;110D 1171 11B3;CBA8;110D 1171 11B3; # (쮨; 쮨; 쮨; 쮨; 쮨; ) HANGUL SYLLABLE JJWILS +CBA9;CBA9;110D 1171 11B4;CBA9;110D 1171 11B4; # (쮩; 쮩; 쮩; 쮩; 쮩; ) HANGUL SYLLABLE JJWILT +CBAA;CBAA;110D 1171 11B5;CBAA;110D 1171 11B5; # (쮪; 쮪; 쮪; 쮪; 쮪; ) HANGUL SYLLABLE JJWILP +CBAB;CBAB;110D 1171 11B6;CBAB;110D 1171 11B6; # (쮫; 쮫; 쮫; 쮫; 쮫; ) HANGUL SYLLABLE JJWILH +CBAC;CBAC;110D 1171 11B7;CBAC;110D 1171 11B7; # (쮬; 쮬; 쮬; 쮬; 쮬; ) HANGUL SYLLABLE JJWIM +CBAD;CBAD;110D 1171 11B8;CBAD;110D 1171 11B8; # (쮭; 쮭; 쮭; 쮭; 쮭; ) HANGUL SYLLABLE JJWIB +CBAE;CBAE;110D 1171 11B9;CBAE;110D 1171 11B9; # (쮮; 쮮; 쮮; 쮮; 쮮; ) HANGUL SYLLABLE JJWIBS +CBAF;CBAF;110D 1171 11BA;CBAF;110D 1171 11BA; # (쮯; 쮯; 쮯; 쮯; 쮯; ) HANGUL SYLLABLE JJWIS +CBB0;CBB0;110D 1171 11BB;CBB0;110D 1171 11BB; # (쮰; 쮰; 쮰; 쮰; 쮰; ) HANGUL SYLLABLE JJWISS +CBB1;CBB1;110D 1171 11BC;CBB1;110D 1171 11BC; # (쮱; 쮱; 쮱; 쮱; 쮱; ) HANGUL SYLLABLE JJWING +CBB2;CBB2;110D 1171 11BD;CBB2;110D 1171 11BD; # (쮲; 쮲; 쮲; 쮲; 쮲; ) HANGUL SYLLABLE JJWIJ +CBB3;CBB3;110D 1171 11BE;CBB3;110D 1171 11BE; # (쮳; 쮳; 쮳; 쮳; 쮳; ) HANGUL SYLLABLE JJWIC +CBB4;CBB4;110D 1171 11BF;CBB4;110D 1171 11BF; # (쮴; 쮴; 쮴; 쮴; 쮴; ) HANGUL SYLLABLE JJWIK +CBB5;CBB5;110D 1171 11C0;CBB5;110D 1171 11C0; # (쮵; 쮵; 쮵; 쮵; 쮵; ) HANGUL SYLLABLE JJWIT +CBB6;CBB6;110D 1171 11C1;CBB6;110D 1171 11C1; # (쮶; 쮶; 쮶; 쮶; 쮶; ) HANGUL SYLLABLE JJWIP +CBB7;CBB7;110D 1171 11C2;CBB7;110D 1171 11C2; # (쮷; 쮷; 쮷; 쮷; 쮷; ) HANGUL SYLLABLE JJWIH +CBB8;CBB8;110D 1172;CBB8;110D 1172; # (쮸; 쮸; 쮸; 쮸; 쮸; ) HANGUL SYLLABLE JJYU +CBB9;CBB9;110D 1172 11A8;CBB9;110D 1172 11A8; # (쮹; 쮹; 쮹; 쮹; 쮹; ) HANGUL SYLLABLE JJYUG +CBBA;CBBA;110D 1172 11A9;CBBA;110D 1172 11A9; # (쮺; 쮺; 쮺; 쮺; 쮺; ) HANGUL SYLLABLE JJYUGG +CBBB;CBBB;110D 1172 11AA;CBBB;110D 1172 11AA; # (쮻; 쮻; 쮻; 쮻; 쮻; ) HANGUL SYLLABLE JJYUGS +CBBC;CBBC;110D 1172 11AB;CBBC;110D 1172 11AB; # (쮼; 쮼; 쮼; 쮼; 쮼; ) HANGUL SYLLABLE JJYUN +CBBD;CBBD;110D 1172 11AC;CBBD;110D 1172 11AC; # (쮽; 쮽; 쮽; 쮽; 쮽; ) HANGUL SYLLABLE JJYUNJ +CBBE;CBBE;110D 1172 11AD;CBBE;110D 1172 11AD; # (쮾; 쮾; 쮾; 쮾; 쮾; ) HANGUL SYLLABLE JJYUNH +CBBF;CBBF;110D 1172 11AE;CBBF;110D 1172 11AE; # (쮿; 쮿; 쮿; 쮿; 쮿; ) HANGUL SYLLABLE JJYUD +CBC0;CBC0;110D 1172 11AF;CBC0;110D 1172 11AF; # (쯀; 쯀; 쯀; 쯀; 쯀; ) HANGUL SYLLABLE JJYUL +CBC1;CBC1;110D 1172 11B0;CBC1;110D 1172 11B0; # (쯁; 쯁; 쯁; 쯁; 쯁; ) HANGUL SYLLABLE JJYULG +CBC2;CBC2;110D 1172 11B1;CBC2;110D 1172 11B1; # (쯂; 쯂; 쯂; 쯂; 쯂; ) HANGUL SYLLABLE JJYULM +CBC3;CBC3;110D 1172 11B2;CBC3;110D 1172 11B2; # (쯃; 쯃; 쯃; 쯃; 쯃; ) HANGUL SYLLABLE JJYULB +CBC4;CBC4;110D 1172 11B3;CBC4;110D 1172 11B3; # (쯄; 쯄; 쯄; 쯄; 쯄; ) HANGUL SYLLABLE JJYULS +CBC5;CBC5;110D 1172 11B4;CBC5;110D 1172 11B4; # (쯅; 쯅; 쯅; 쯅; 쯅; ) HANGUL SYLLABLE JJYULT +CBC6;CBC6;110D 1172 11B5;CBC6;110D 1172 11B5; # (쯆; 쯆; 쯆; 쯆; 쯆; ) HANGUL SYLLABLE JJYULP +CBC7;CBC7;110D 1172 11B6;CBC7;110D 1172 11B6; # (쯇; 쯇; 쯇; 쯇; 쯇; ) HANGUL SYLLABLE JJYULH +CBC8;CBC8;110D 1172 11B7;CBC8;110D 1172 11B7; # (쯈; 쯈; 쯈; 쯈; 쯈; ) HANGUL SYLLABLE JJYUM +CBC9;CBC9;110D 1172 11B8;CBC9;110D 1172 11B8; # (쯉; 쯉; 쯉; 쯉; 쯉; ) HANGUL SYLLABLE JJYUB +CBCA;CBCA;110D 1172 11B9;CBCA;110D 1172 11B9; # (쯊; 쯊; 쯊; 쯊; 쯊; ) HANGUL SYLLABLE JJYUBS +CBCB;CBCB;110D 1172 11BA;CBCB;110D 1172 11BA; # (쯋; 쯋; 쯋; 쯋; 쯋; ) HANGUL SYLLABLE JJYUS +CBCC;CBCC;110D 1172 11BB;CBCC;110D 1172 11BB; # (쯌; 쯌; 쯌; 쯌; 쯌; ) HANGUL SYLLABLE JJYUSS +CBCD;CBCD;110D 1172 11BC;CBCD;110D 1172 11BC; # (쯍; 쯍; 쯍; 쯍; 쯍; ) HANGUL SYLLABLE JJYUNG +CBCE;CBCE;110D 1172 11BD;CBCE;110D 1172 11BD; # (쯎; 쯎; 쯎; 쯎; 쯎; ) HANGUL SYLLABLE JJYUJ +CBCF;CBCF;110D 1172 11BE;CBCF;110D 1172 11BE; # (쯏; 쯏; 쯏; 쯏; 쯏; ) HANGUL SYLLABLE JJYUC +CBD0;CBD0;110D 1172 11BF;CBD0;110D 1172 11BF; # (쯐; 쯐; 쯐; 쯐; 쯐; ) HANGUL SYLLABLE JJYUK +CBD1;CBD1;110D 1172 11C0;CBD1;110D 1172 11C0; # (쯑; 쯑; 쯑; 쯑; 쯑; ) HANGUL SYLLABLE JJYUT +CBD2;CBD2;110D 1172 11C1;CBD2;110D 1172 11C1; # (쯒; 쯒; 쯒; 쯒; 쯒; ) HANGUL SYLLABLE JJYUP +CBD3;CBD3;110D 1172 11C2;CBD3;110D 1172 11C2; # (쯓; 쯓; 쯓; 쯓; 쯓; ) HANGUL SYLLABLE JJYUH +CBD4;CBD4;110D 1173;CBD4;110D 1173; # (쯔; 쯔; 쯔; 쯔; 쯔; ) HANGUL SYLLABLE JJEU +CBD5;CBD5;110D 1173 11A8;CBD5;110D 1173 11A8; # (쯕; 쯕; 쯕; 쯕; 쯕; ) HANGUL SYLLABLE JJEUG +CBD6;CBD6;110D 1173 11A9;CBD6;110D 1173 11A9; # (쯖; 쯖; 쯖; 쯖; 쯖; ) HANGUL SYLLABLE JJEUGG +CBD7;CBD7;110D 1173 11AA;CBD7;110D 1173 11AA; # (쯗; 쯗; 쯗; 쯗; 쯗; ) HANGUL SYLLABLE JJEUGS +CBD8;CBD8;110D 1173 11AB;CBD8;110D 1173 11AB; # (쯘; 쯘; 쯘; 쯘; 쯘; ) HANGUL SYLLABLE JJEUN +CBD9;CBD9;110D 1173 11AC;CBD9;110D 1173 11AC; # (쯙; 쯙; 쯙; 쯙; 쯙; ) HANGUL SYLLABLE JJEUNJ +CBDA;CBDA;110D 1173 11AD;CBDA;110D 1173 11AD; # (쯚; 쯚; 쯚; 쯚; 쯚; ) HANGUL SYLLABLE JJEUNH +CBDB;CBDB;110D 1173 11AE;CBDB;110D 1173 11AE; # (쯛; 쯛; 쯛; 쯛; 쯛; ) HANGUL SYLLABLE JJEUD +CBDC;CBDC;110D 1173 11AF;CBDC;110D 1173 11AF; # (쯜; 쯜; 쯜; 쯜; 쯜; ) HANGUL SYLLABLE JJEUL +CBDD;CBDD;110D 1173 11B0;CBDD;110D 1173 11B0; # (쯝; 쯝; 쯝; 쯝; 쯝; ) HANGUL SYLLABLE JJEULG +CBDE;CBDE;110D 1173 11B1;CBDE;110D 1173 11B1; # (쯞; 쯞; 쯞; 쯞; 쯞; ) HANGUL SYLLABLE JJEULM +CBDF;CBDF;110D 1173 11B2;CBDF;110D 1173 11B2; # (쯟; 쯟; 쯟; 쯟; 쯟; ) HANGUL SYLLABLE JJEULB +CBE0;CBE0;110D 1173 11B3;CBE0;110D 1173 11B3; # (쯠; 쯠; 쯠; 쯠; 쯠; ) HANGUL SYLLABLE JJEULS +CBE1;CBE1;110D 1173 11B4;CBE1;110D 1173 11B4; # (쯡; 쯡; 쯡; 쯡; 쯡; ) HANGUL SYLLABLE JJEULT +CBE2;CBE2;110D 1173 11B5;CBE2;110D 1173 11B5; # (쯢; 쯢; 쯢; 쯢; 쯢; ) HANGUL SYLLABLE JJEULP +CBE3;CBE3;110D 1173 11B6;CBE3;110D 1173 11B6; # (쯣; 쯣; 쯣; 쯣; 쯣; ) HANGUL SYLLABLE JJEULH +CBE4;CBE4;110D 1173 11B7;CBE4;110D 1173 11B7; # (쯤; 쯤; 쯤; 쯤; 쯤; ) HANGUL SYLLABLE JJEUM +CBE5;CBE5;110D 1173 11B8;CBE5;110D 1173 11B8; # (쯥; 쯥; 쯥; 쯥; 쯥; ) HANGUL SYLLABLE JJEUB +CBE6;CBE6;110D 1173 11B9;CBE6;110D 1173 11B9; # (쯦; 쯦; 쯦; 쯦; 쯦; ) HANGUL SYLLABLE JJEUBS +CBE7;CBE7;110D 1173 11BA;CBE7;110D 1173 11BA; # (쯧; 쯧; 쯧; 쯧; 쯧; ) HANGUL SYLLABLE JJEUS +CBE8;CBE8;110D 1173 11BB;CBE8;110D 1173 11BB; # (쯨; 쯨; 쯨; 쯨; 쯨; ) HANGUL SYLLABLE JJEUSS +CBE9;CBE9;110D 1173 11BC;CBE9;110D 1173 11BC; # (쯩; 쯩; 쯩; 쯩; 쯩; ) HANGUL SYLLABLE JJEUNG +CBEA;CBEA;110D 1173 11BD;CBEA;110D 1173 11BD; # (쯪; 쯪; 쯪; 쯪; 쯪; ) HANGUL SYLLABLE JJEUJ +CBEB;CBEB;110D 1173 11BE;CBEB;110D 1173 11BE; # (쯫; 쯫; 쯫; 쯫; 쯫; ) HANGUL SYLLABLE JJEUC +CBEC;CBEC;110D 1173 11BF;CBEC;110D 1173 11BF; # (쯬; 쯬; 쯬; 쯬; 쯬; ) HANGUL SYLLABLE JJEUK +CBED;CBED;110D 1173 11C0;CBED;110D 1173 11C0; # (쯭; 쯭; 쯭; 쯭; 쯭; ) HANGUL SYLLABLE JJEUT +CBEE;CBEE;110D 1173 11C1;CBEE;110D 1173 11C1; # (쯮; 쯮; 쯮; 쯮; 쯮; ) HANGUL SYLLABLE JJEUP +CBEF;CBEF;110D 1173 11C2;CBEF;110D 1173 11C2; # (쯯; 쯯; 쯯; 쯯; 쯯; ) HANGUL SYLLABLE JJEUH +CBF0;CBF0;110D 1174;CBF0;110D 1174; # (쯰; 쯰; 쯰; 쯰; 쯰; ) HANGUL SYLLABLE JJYI +CBF1;CBF1;110D 1174 11A8;CBF1;110D 1174 11A8; # (쯱; 쯱; 쯱; 쯱; 쯱; ) HANGUL SYLLABLE JJYIG +CBF2;CBF2;110D 1174 11A9;CBF2;110D 1174 11A9; # (쯲; 쯲; 쯲; 쯲; 쯲; ) HANGUL SYLLABLE JJYIGG +CBF3;CBF3;110D 1174 11AA;CBF3;110D 1174 11AA; # (쯳; 쯳; 쯳; 쯳; 쯳; ) HANGUL SYLLABLE JJYIGS +CBF4;CBF4;110D 1174 11AB;CBF4;110D 1174 11AB; # (쯴; 쯴; 쯴; 쯴; 쯴; ) HANGUL SYLLABLE JJYIN +CBF5;CBF5;110D 1174 11AC;CBF5;110D 1174 11AC; # (쯵; 쯵; 쯵; 쯵; 쯵; ) HANGUL SYLLABLE JJYINJ +CBF6;CBF6;110D 1174 11AD;CBF6;110D 1174 11AD; # (쯶; 쯶; 쯶; 쯶; 쯶; ) HANGUL SYLLABLE JJYINH +CBF7;CBF7;110D 1174 11AE;CBF7;110D 1174 11AE; # (쯷; 쯷; 쯷; 쯷; 쯷; ) HANGUL SYLLABLE JJYID +CBF8;CBF8;110D 1174 11AF;CBF8;110D 1174 11AF; # (쯸; 쯸; 쯸; 쯸; 쯸; ) HANGUL SYLLABLE JJYIL +CBF9;CBF9;110D 1174 11B0;CBF9;110D 1174 11B0; # (쯹; 쯹; 쯹; 쯹; 쯹; ) HANGUL SYLLABLE JJYILG +CBFA;CBFA;110D 1174 11B1;CBFA;110D 1174 11B1; # (쯺; 쯺; 쯺; 쯺; 쯺; ) HANGUL SYLLABLE JJYILM +CBFB;CBFB;110D 1174 11B2;CBFB;110D 1174 11B2; # (쯻; 쯻; 쯻; 쯻; 쯻; ) HANGUL SYLLABLE JJYILB +CBFC;CBFC;110D 1174 11B3;CBFC;110D 1174 11B3; # (쯼; 쯼; 쯼; 쯼; 쯼; ) HANGUL SYLLABLE JJYILS +CBFD;CBFD;110D 1174 11B4;CBFD;110D 1174 11B4; # (쯽; 쯽; 쯽; 쯽; 쯽; ) HANGUL SYLLABLE JJYILT +CBFE;CBFE;110D 1174 11B5;CBFE;110D 1174 11B5; # (쯾; 쯾; 쯾; 쯾; 쯾; ) HANGUL SYLLABLE JJYILP +CBFF;CBFF;110D 1174 11B6;CBFF;110D 1174 11B6; # (쯿; 쯿; 쯿; 쯿; 쯿; ) HANGUL SYLLABLE JJYILH +CC00;CC00;110D 1174 11B7;CC00;110D 1174 11B7; # (찀; 찀; 찀; 찀; 찀; ) HANGUL SYLLABLE JJYIM +CC01;CC01;110D 1174 11B8;CC01;110D 1174 11B8; # (찁; 찁; 찁; 찁; 찁; ) HANGUL SYLLABLE JJYIB +CC02;CC02;110D 1174 11B9;CC02;110D 1174 11B9; # (찂; 찂; 찂; 찂; 찂; ) HANGUL SYLLABLE JJYIBS +CC03;CC03;110D 1174 11BA;CC03;110D 1174 11BA; # (찃; 찃; 찃; 찃; 찃; ) HANGUL SYLLABLE JJYIS +CC04;CC04;110D 1174 11BB;CC04;110D 1174 11BB; # (찄; 찄; 찄; 찄; 찄; ) HANGUL SYLLABLE JJYISS +CC05;CC05;110D 1174 11BC;CC05;110D 1174 11BC; # (찅; 찅; 찅; 찅; 찅; ) HANGUL SYLLABLE JJYING +CC06;CC06;110D 1174 11BD;CC06;110D 1174 11BD; # (찆; 찆; 찆; 찆; 찆; ) HANGUL SYLLABLE JJYIJ +CC07;CC07;110D 1174 11BE;CC07;110D 1174 11BE; # (찇; 찇; 찇; 찇; 찇; ) HANGUL SYLLABLE JJYIC +CC08;CC08;110D 1174 11BF;CC08;110D 1174 11BF; # (찈; 찈; 찈; 찈; 찈; ) HANGUL SYLLABLE JJYIK +CC09;CC09;110D 1174 11C0;CC09;110D 1174 11C0; # (찉; 찉; 찉; 찉; 찉; ) HANGUL SYLLABLE JJYIT +CC0A;CC0A;110D 1174 11C1;CC0A;110D 1174 11C1; # (찊; 찊; 찊; 찊; 찊; ) HANGUL SYLLABLE JJYIP +CC0B;CC0B;110D 1174 11C2;CC0B;110D 1174 11C2; # (찋; 찋; 찋; 찋; 찋; ) HANGUL SYLLABLE JJYIH +CC0C;CC0C;110D 1175;CC0C;110D 1175; # (찌; 찌; 찌; 찌; 찌; ) HANGUL SYLLABLE JJI +CC0D;CC0D;110D 1175 11A8;CC0D;110D 1175 11A8; # (찍; 찍; 찍; 찍; 찍; ) HANGUL SYLLABLE JJIG +CC0E;CC0E;110D 1175 11A9;CC0E;110D 1175 11A9; # (찎; 찎; 찎; 찎; 찎; ) HANGUL SYLLABLE JJIGG +CC0F;CC0F;110D 1175 11AA;CC0F;110D 1175 11AA; # (찏; 찏; 찏; 찏; 찏; ) HANGUL SYLLABLE JJIGS +CC10;CC10;110D 1175 11AB;CC10;110D 1175 11AB; # (찐; 찐; 찐; 찐; 찐; ) HANGUL SYLLABLE JJIN +CC11;CC11;110D 1175 11AC;CC11;110D 1175 11AC; # (찑; 찑; 찑; 찑; 찑; ) HANGUL SYLLABLE JJINJ +CC12;CC12;110D 1175 11AD;CC12;110D 1175 11AD; # (찒; 찒; 찒; 찒; 찒; ) HANGUL SYLLABLE JJINH +CC13;CC13;110D 1175 11AE;CC13;110D 1175 11AE; # (찓; 찓; 찓; 찓; 찓; ) HANGUL SYLLABLE JJID +CC14;CC14;110D 1175 11AF;CC14;110D 1175 11AF; # (찔; 찔; 찔; 찔; 찔; ) HANGUL SYLLABLE JJIL +CC15;CC15;110D 1175 11B0;CC15;110D 1175 11B0; # (찕; 찕; 찕; 찕; 찕; ) HANGUL SYLLABLE JJILG +CC16;CC16;110D 1175 11B1;CC16;110D 1175 11B1; # (찖; 찖; 찖; 찖; 찖; ) HANGUL SYLLABLE JJILM +CC17;CC17;110D 1175 11B2;CC17;110D 1175 11B2; # (찗; 찗; 찗; 찗; 찗; ) HANGUL SYLLABLE JJILB +CC18;CC18;110D 1175 11B3;CC18;110D 1175 11B3; # (찘; 찘; 찘; 찘; 찘; ) HANGUL SYLLABLE JJILS +CC19;CC19;110D 1175 11B4;CC19;110D 1175 11B4; # (찙; 찙; 찙; 찙; 찙; ) HANGUL SYLLABLE JJILT +CC1A;CC1A;110D 1175 11B5;CC1A;110D 1175 11B5; # (찚; 찚; 찚; 찚; 찚; ) HANGUL SYLLABLE JJILP +CC1B;CC1B;110D 1175 11B6;CC1B;110D 1175 11B6; # (찛; 찛; 찛; 찛; 찛; ) HANGUL SYLLABLE JJILH +CC1C;CC1C;110D 1175 11B7;CC1C;110D 1175 11B7; # (찜; 찜; 찜; 찜; 찜; ) HANGUL SYLLABLE JJIM +CC1D;CC1D;110D 1175 11B8;CC1D;110D 1175 11B8; # (찝; 찝; 찝; 찝; 찝; ) HANGUL SYLLABLE JJIB +CC1E;CC1E;110D 1175 11B9;CC1E;110D 1175 11B9; # (찞; 찞; 찞; 찞; 찞; ) HANGUL SYLLABLE JJIBS +CC1F;CC1F;110D 1175 11BA;CC1F;110D 1175 11BA; # (찟; 찟; 찟; 찟; 찟; ) HANGUL SYLLABLE JJIS +CC20;CC20;110D 1175 11BB;CC20;110D 1175 11BB; # (찠; 찠; 찠; 찠; 찠; ) HANGUL SYLLABLE JJISS +CC21;CC21;110D 1175 11BC;CC21;110D 1175 11BC; # (찡; 찡; 찡; 찡; 찡; ) HANGUL SYLLABLE JJING +CC22;CC22;110D 1175 11BD;CC22;110D 1175 11BD; # (찢; 찢; 찢; 찢; 찢; ) HANGUL SYLLABLE JJIJ +CC23;CC23;110D 1175 11BE;CC23;110D 1175 11BE; # (찣; 찣; 찣; 찣; 찣; ) HANGUL SYLLABLE JJIC +CC24;CC24;110D 1175 11BF;CC24;110D 1175 11BF; # (찤; 찤; 찤; 찤; 찤; ) HANGUL SYLLABLE JJIK +CC25;CC25;110D 1175 11C0;CC25;110D 1175 11C0; # (찥; 찥; 찥; 찥; 찥; ) HANGUL SYLLABLE JJIT +CC26;CC26;110D 1175 11C1;CC26;110D 1175 11C1; # (찦; 찦; 찦; 찦; 찦; ) HANGUL SYLLABLE JJIP +CC27;CC27;110D 1175 11C2;CC27;110D 1175 11C2; # (찧; 찧; 찧; 찧; 찧; ) HANGUL SYLLABLE JJIH +CC28;CC28;110E 1161;CC28;110E 1161; # (차; 차; 차; 차; 차; ) HANGUL SYLLABLE CA +CC29;CC29;110E 1161 11A8;CC29;110E 1161 11A8; # (착; 착; 착; 착; 착; ) HANGUL SYLLABLE CAG +CC2A;CC2A;110E 1161 11A9;CC2A;110E 1161 11A9; # (찪; 찪; 찪; 찪; 찪; ) HANGUL SYLLABLE CAGG +CC2B;CC2B;110E 1161 11AA;CC2B;110E 1161 11AA; # (찫; 찫; 찫; 찫; 찫; ) HANGUL SYLLABLE CAGS +CC2C;CC2C;110E 1161 11AB;CC2C;110E 1161 11AB; # (찬; 찬; 찬; 찬; 찬; ) HANGUL SYLLABLE CAN +CC2D;CC2D;110E 1161 11AC;CC2D;110E 1161 11AC; # (찭; 찭; 찭; 찭; 찭; ) HANGUL SYLLABLE CANJ +CC2E;CC2E;110E 1161 11AD;CC2E;110E 1161 11AD; # (찮; 찮; 찮; 찮; 찮; ) HANGUL SYLLABLE CANH +CC2F;CC2F;110E 1161 11AE;CC2F;110E 1161 11AE; # (찯; 찯; 찯; 찯; 찯; ) HANGUL SYLLABLE CAD +CC30;CC30;110E 1161 11AF;CC30;110E 1161 11AF; # (찰; 찰; 찰; 찰; 찰; ) HANGUL SYLLABLE CAL +CC31;CC31;110E 1161 11B0;CC31;110E 1161 11B0; # (찱; 찱; 찱; 찱; 찱; ) HANGUL SYLLABLE CALG +CC32;CC32;110E 1161 11B1;CC32;110E 1161 11B1; # (찲; 찲; 찲; 찲; 찲; ) HANGUL SYLLABLE CALM +CC33;CC33;110E 1161 11B2;CC33;110E 1161 11B2; # (찳; 찳; 찳; 찳; 찳; ) HANGUL SYLLABLE CALB +CC34;CC34;110E 1161 11B3;CC34;110E 1161 11B3; # (찴; 찴; 찴; 찴; 찴; ) HANGUL SYLLABLE CALS +CC35;CC35;110E 1161 11B4;CC35;110E 1161 11B4; # (찵; 찵; 찵; 찵; 찵; ) HANGUL SYLLABLE CALT +CC36;CC36;110E 1161 11B5;CC36;110E 1161 11B5; # (찶; 찶; 찶; 찶; 찶; ) HANGUL SYLLABLE CALP +CC37;CC37;110E 1161 11B6;CC37;110E 1161 11B6; # (찷; 찷; 찷; 찷; 찷; ) HANGUL SYLLABLE CALH +CC38;CC38;110E 1161 11B7;CC38;110E 1161 11B7; # (참; 참; 참; 참; 참; ) HANGUL SYLLABLE CAM +CC39;CC39;110E 1161 11B8;CC39;110E 1161 11B8; # (찹; 찹; 찹; 찹; 찹; ) HANGUL SYLLABLE CAB +CC3A;CC3A;110E 1161 11B9;CC3A;110E 1161 11B9; # (찺; 찺; 찺; 찺; 찺; ) HANGUL SYLLABLE CABS +CC3B;CC3B;110E 1161 11BA;CC3B;110E 1161 11BA; # (찻; 찻; 찻; 찻; 찻; ) HANGUL SYLLABLE CAS +CC3C;CC3C;110E 1161 11BB;CC3C;110E 1161 11BB; # (찼; 찼; 찼; 찼; 찼; ) HANGUL SYLLABLE CASS +CC3D;CC3D;110E 1161 11BC;CC3D;110E 1161 11BC; # (창; 창; 창; 창; 창; ) HANGUL SYLLABLE CANG +CC3E;CC3E;110E 1161 11BD;CC3E;110E 1161 11BD; # (찾; 찾; 찾; 찾; 찾; ) HANGUL SYLLABLE CAJ +CC3F;CC3F;110E 1161 11BE;CC3F;110E 1161 11BE; # (찿; 찿; 찿; 찿; 찿; ) HANGUL SYLLABLE CAC +CC40;CC40;110E 1161 11BF;CC40;110E 1161 11BF; # (챀; 챀; 챀; 챀; 챀; ) HANGUL SYLLABLE CAK +CC41;CC41;110E 1161 11C0;CC41;110E 1161 11C0; # (챁; 챁; 챁; 챁; 챁; ) HANGUL SYLLABLE CAT +CC42;CC42;110E 1161 11C1;CC42;110E 1161 11C1; # (챂; 챂; 챂; 챂; 챂; ) HANGUL SYLLABLE CAP +CC43;CC43;110E 1161 11C2;CC43;110E 1161 11C2; # (챃; 챃; 챃; 챃; 챃; ) HANGUL SYLLABLE CAH +CC44;CC44;110E 1162;CC44;110E 1162; # (채; 채; 채; 채; 채; ) HANGUL SYLLABLE CAE +CC45;CC45;110E 1162 11A8;CC45;110E 1162 11A8; # (책; 책; 책; 책; 책; ) HANGUL SYLLABLE CAEG +CC46;CC46;110E 1162 11A9;CC46;110E 1162 11A9; # (챆; 챆; 챆; 챆; 챆; ) HANGUL SYLLABLE CAEGG +CC47;CC47;110E 1162 11AA;CC47;110E 1162 11AA; # (챇; 챇; 챇; 챇; 챇; ) HANGUL SYLLABLE CAEGS +CC48;CC48;110E 1162 11AB;CC48;110E 1162 11AB; # (챈; 챈; 챈; 챈; 챈; ) HANGUL SYLLABLE CAEN +CC49;CC49;110E 1162 11AC;CC49;110E 1162 11AC; # (챉; 챉; 챉; 챉; 챉; ) HANGUL SYLLABLE CAENJ +CC4A;CC4A;110E 1162 11AD;CC4A;110E 1162 11AD; # (챊; 챊; 챊; 챊; 챊; ) HANGUL SYLLABLE CAENH +CC4B;CC4B;110E 1162 11AE;CC4B;110E 1162 11AE; # (챋; 챋; 챋; 챋; 챋; ) HANGUL SYLLABLE CAED +CC4C;CC4C;110E 1162 11AF;CC4C;110E 1162 11AF; # (챌; 챌; 챌; 챌; 챌; ) HANGUL SYLLABLE CAEL +CC4D;CC4D;110E 1162 11B0;CC4D;110E 1162 11B0; # (챍; 챍; 챍; 챍; 챍; ) HANGUL SYLLABLE CAELG +CC4E;CC4E;110E 1162 11B1;CC4E;110E 1162 11B1; # (챎; 챎; 챎; 챎; 챎; ) HANGUL SYLLABLE CAELM +CC4F;CC4F;110E 1162 11B2;CC4F;110E 1162 11B2; # (챏; 챏; 챏; 챏; 챏; ) HANGUL SYLLABLE CAELB +CC50;CC50;110E 1162 11B3;CC50;110E 1162 11B3; # (챐; 챐; 챐; 챐; 챐; ) HANGUL SYLLABLE CAELS +CC51;CC51;110E 1162 11B4;CC51;110E 1162 11B4; # (챑; 챑; 챑; 챑; 챑; ) HANGUL SYLLABLE CAELT +CC52;CC52;110E 1162 11B5;CC52;110E 1162 11B5; # (챒; 챒; 챒; 챒; 챒; ) HANGUL SYLLABLE CAELP +CC53;CC53;110E 1162 11B6;CC53;110E 1162 11B6; # (챓; 챓; 챓; 챓; 챓; ) HANGUL SYLLABLE CAELH +CC54;CC54;110E 1162 11B7;CC54;110E 1162 11B7; # (챔; 챔; 챔; 챔; 챔; ) HANGUL SYLLABLE CAEM +CC55;CC55;110E 1162 11B8;CC55;110E 1162 11B8; # (챕; 챕; 챕; 챕; 챕; ) HANGUL SYLLABLE CAEB +CC56;CC56;110E 1162 11B9;CC56;110E 1162 11B9; # (챖; 챖; 챖; 챖; 챖; ) HANGUL SYLLABLE CAEBS +CC57;CC57;110E 1162 11BA;CC57;110E 1162 11BA; # (챗; 챗; 챗; 챗; 챗; ) HANGUL SYLLABLE CAES +CC58;CC58;110E 1162 11BB;CC58;110E 1162 11BB; # (챘; 챘; 챘; 챘; 챘; ) HANGUL SYLLABLE CAESS +CC59;CC59;110E 1162 11BC;CC59;110E 1162 11BC; # (챙; 챙; 챙; 챙; 챙; ) HANGUL SYLLABLE CAENG +CC5A;CC5A;110E 1162 11BD;CC5A;110E 1162 11BD; # (챚; 챚; 챚; 챚; 챚; ) HANGUL SYLLABLE CAEJ +CC5B;CC5B;110E 1162 11BE;CC5B;110E 1162 11BE; # (챛; 챛; 챛; 챛; 챛; ) HANGUL SYLLABLE CAEC +CC5C;CC5C;110E 1162 11BF;CC5C;110E 1162 11BF; # (챜; 챜; 챜; 챜; 챜; ) HANGUL SYLLABLE CAEK +CC5D;CC5D;110E 1162 11C0;CC5D;110E 1162 11C0; # (챝; 챝; 챝; 챝; 챝; ) HANGUL SYLLABLE CAET +CC5E;CC5E;110E 1162 11C1;CC5E;110E 1162 11C1; # (챞; 챞; 챞; 챞; 챞; ) HANGUL SYLLABLE CAEP +CC5F;CC5F;110E 1162 11C2;CC5F;110E 1162 11C2; # (챟; 챟; 챟; 챟; 챟; ) HANGUL SYLLABLE CAEH +CC60;CC60;110E 1163;CC60;110E 1163; # (챠; 챠; 챠; 챠; 챠; ) HANGUL SYLLABLE CYA +CC61;CC61;110E 1163 11A8;CC61;110E 1163 11A8; # (챡; 챡; 챡; 챡; 챡; ) HANGUL SYLLABLE CYAG +CC62;CC62;110E 1163 11A9;CC62;110E 1163 11A9; # (챢; 챢; 챢; 챢; 챢; ) HANGUL SYLLABLE CYAGG +CC63;CC63;110E 1163 11AA;CC63;110E 1163 11AA; # (챣; 챣; 챣; 챣; 챣; ) HANGUL SYLLABLE CYAGS +CC64;CC64;110E 1163 11AB;CC64;110E 1163 11AB; # (챤; 챤; 챤; 챤; 챤; ) HANGUL SYLLABLE CYAN +CC65;CC65;110E 1163 11AC;CC65;110E 1163 11AC; # (챥; 챥; 챥; 챥; 챥; ) HANGUL SYLLABLE CYANJ +CC66;CC66;110E 1163 11AD;CC66;110E 1163 11AD; # (챦; 챦; 챦; 챦; 챦; ) HANGUL SYLLABLE CYANH +CC67;CC67;110E 1163 11AE;CC67;110E 1163 11AE; # (챧; 챧; 챧; 챧; 챧; ) HANGUL SYLLABLE CYAD +CC68;CC68;110E 1163 11AF;CC68;110E 1163 11AF; # (챨; 챨; 챨; 챨; 챨; ) HANGUL SYLLABLE CYAL +CC69;CC69;110E 1163 11B0;CC69;110E 1163 11B0; # (챩; 챩; 챩; 챩; 챩; ) HANGUL SYLLABLE CYALG +CC6A;CC6A;110E 1163 11B1;CC6A;110E 1163 11B1; # (챪; 챪; 챪; 챪; 챪; ) HANGUL SYLLABLE CYALM +CC6B;CC6B;110E 1163 11B2;CC6B;110E 1163 11B2; # (챫; 챫; 챫; 챫; 챫; ) HANGUL SYLLABLE CYALB +CC6C;CC6C;110E 1163 11B3;CC6C;110E 1163 11B3; # (챬; 챬; 챬; 챬; 챬; ) HANGUL SYLLABLE CYALS +CC6D;CC6D;110E 1163 11B4;CC6D;110E 1163 11B4; # (챭; 챭; 챭; 챭; 챭; ) HANGUL SYLLABLE CYALT +CC6E;CC6E;110E 1163 11B5;CC6E;110E 1163 11B5; # (챮; 챮; 챮; 챮; 챮; ) HANGUL SYLLABLE CYALP +CC6F;CC6F;110E 1163 11B6;CC6F;110E 1163 11B6; # (챯; 챯; 챯; 챯; 챯; ) HANGUL SYLLABLE CYALH +CC70;CC70;110E 1163 11B7;CC70;110E 1163 11B7; # (챰; 챰; 챰; 챰; 챰; ) HANGUL SYLLABLE CYAM +CC71;CC71;110E 1163 11B8;CC71;110E 1163 11B8; # (챱; 챱; 챱; 챱; 챱; ) HANGUL SYLLABLE CYAB +CC72;CC72;110E 1163 11B9;CC72;110E 1163 11B9; # (챲; 챲; 챲; 챲; 챲; ) HANGUL SYLLABLE CYABS +CC73;CC73;110E 1163 11BA;CC73;110E 1163 11BA; # (챳; 챳; 챳; 챳; 챳; ) HANGUL SYLLABLE CYAS +CC74;CC74;110E 1163 11BB;CC74;110E 1163 11BB; # (챴; 챴; 챴; 챴; 챴; ) HANGUL SYLLABLE CYASS +CC75;CC75;110E 1163 11BC;CC75;110E 1163 11BC; # (챵; 챵; 챵; 챵; 챵; ) HANGUL SYLLABLE CYANG +CC76;CC76;110E 1163 11BD;CC76;110E 1163 11BD; # (챶; 챶; 챶; 챶; 챶; ) HANGUL SYLLABLE CYAJ +CC77;CC77;110E 1163 11BE;CC77;110E 1163 11BE; # (챷; 챷; 챷; 챷; 챷; ) HANGUL SYLLABLE CYAC +CC78;CC78;110E 1163 11BF;CC78;110E 1163 11BF; # (챸; 챸; 챸; 챸; 챸; ) HANGUL SYLLABLE CYAK +CC79;CC79;110E 1163 11C0;CC79;110E 1163 11C0; # (챹; 챹; 챹; 챹; 챹; ) HANGUL SYLLABLE CYAT +CC7A;CC7A;110E 1163 11C1;CC7A;110E 1163 11C1; # (챺; 챺; 챺; 챺; 챺; ) HANGUL SYLLABLE CYAP +CC7B;CC7B;110E 1163 11C2;CC7B;110E 1163 11C2; # (챻; 챻; 챻; 챻; 챻; ) HANGUL SYLLABLE CYAH +CC7C;CC7C;110E 1164;CC7C;110E 1164; # (챼; 챼; 챼; 챼; 챼; ) HANGUL SYLLABLE CYAE +CC7D;CC7D;110E 1164 11A8;CC7D;110E 1164 11A8; # (챽; 챽; 챽; 챽; 챽; ) HANGUL SYLLABLE CYAEG +CC7E;CC7E;110E 1164 11A9;CC7E;110E 1164 11A9; # (챾; 챾; 챾; 챾; 챾; ) HANGUL SYLLABLE CYAEGG +CC7F;CC7F;110E 1164 11AA;CC7F;110E 1164 11AA; # (챿; 챿; 챿; 챿; 챿; ) HANGUL SYLLABLE CYAEGS +CC80;CC80;110E 1164 11AB;CC80;110E 1164 11AB; # (첀; 첀; 첀; 첀; 첀; ) HANGUL SYLLABLE CYAEN +CC81;CC81;110E 1164 11AC;CC81;110E 1164 11AC; # (첁; 첁; 첁; 첁; 첁; ) HANGUL SYLLABLE CYAENJ +CC82;CC82;110E 1164 11AD;CC82;110E 1164 11AD; # (첂; 첂; 첂; 첂; 첂; ) HANGUL SYLLABLE CYAENH +CC83;CC83;110E 1164 11AE;CC83;110E 1164 11AE; # (첃; 첃; 첃; 첃; 첃; ) HANGUL SYLLABLE CYAED +CC84;CC84;110E 1164 11AF;CC84;110E 1164 11AF; # (첄; 첄; 첄; 첄; 첄; ) HANGUL SYLLABLE CYAEL +CC85;CC85;110E 1164 11B0;CC85;110E 1164 11B0; # (첅; 첅; 첅; 첅; 첅; ) HANGUL SYLLABLE CYAELG +CC86;CC86;110E 1164 11B1;CC86;110E 1164 11B1; # (첆; 첆; 첆; 첆; 첆; ) HANGUL SYLLABLE CYAELM +CC87;CC87;110E 1164 11B2;CC87;110E 1164 11B2; # (첇; 첇; 첇; 첇; 첇; ) HANGUL SYLLABLE CYAELB +CC88;CC88;110E 1164 11B3;CC88;110E 1164 11B3; # (첈; 첈; 첈; 첈; 첈; ) HANGUL SYLLABLE CYAELS +CC89;CC89;110E 1164 11B4;CC89;110E 1164 11B4; # (첉; 첉; 첉; 첉; 첉; ) HANGUL SYLLABLE CYAELT +CC8A;CC8A;110E 1164 11B5;CC8A;110E 1164 11B5; # (첊; 첊; 첊; 첊; 첊; ) HANGUL SYLLABLE CYAELP +CC8B;CC8B;110E 1164 11B6;CC8B;110E 1164 11B6; # (첋; 첋; 첋; 첋; 첋; ) HANGUL SYLLABLE CYAELH +CC8C;CC8C;110E 1164 11B7;CC8C;110E 1164 11B7; # (첌; 첌; 첌; 첌; 첌; ) HANGUL SYLLABLE CYAEM +CC8D;CC8D;110E 1164 11B8;CC8D;110E 1164 11B8; # (첍; 첍; 첍; 첍; 첍; ) HANGUL SYLLABLE CYAEB +CC8E;CC8E;110E 1164 11B9;CC8E;110E 1164 11B9; # (첎; 첎; 첎; 첎; 첎; ) HANGUL SYLLABLE CYAEBS +CC8F;CC8F;110E 1164 11BA;CC8F;110E 1164 11BA; # (첏; 첏; 첏; 첏; 첏; ) HANGUL SYLLABLE CYAES +CC90;CC90;110E 1164 11BB;CC90;110E 1164 11BB; # (첐; 첐; 첐; 첐; 첐; ) HANGUL SYLLABLE CYAESS +CC91;CC91;110E 1164 11BC;CC91;110E 1164 11BC; # (첑; 첑; 첑; 첑; 첑; ) HANGUL SYLLABLE CYAENG +CC92;CC92;110E 1164 11BD;CC92;110E 1164 11BD; # (첒; 첒; 첒; 첒; 첒; ) HANGUL SYLLABLE CYAEJ +CC93;CC93;110E 1164 11BE;CC93;110E 1164 11BE; # (첓; 첓; 첓; 첓; 첓; ) HANGUL SYLLABLE CYAEC +CC94;CC94;110E 1164 11BF;CC94;110E 1164 11BF; # (첔; 첔; 첔; 첔; 첔; ) HANGUL SYLLABLE CYAEK +CC95;CC95;110E 1164 11C0;CC95;110E 1164 11C0; # (첕; 첕; 첕; 첕; 첕; ) HANGUL SYLLABLE CYAET +CC96;CC96;110E 1164 11C1;CC96;110E 1164 11C1; # (첖; 첖; 첖; 첖; 첖; ) HANGUL SYLLABLE CYAEP +CC97;CC97;110E 1164 11C2;CC97;110E 1164 11C2; # (첗; 첗; 첗; 첗; 첗; ) HANGUL SYLLABLE CYAEH +CC98;CC98;110E 1165;CC98;110E 1165; # (처; 처; 처; 처; 처; ) HANGUL SYLLABLE CEO +CC99;CC99;110E 1165 11A8;CC99;110E 1165 11A8; # (척; 척; 척; 척; 척; ) HANGUL SYLLABLE CEOG +CC9A;CC9A;110E 1165 11A9;CC9A;110E 1165 11A9; # (첚; 첚; 첚; 첚; 첚; ) HANGUL SYLLABLE CEOGG +CC9B;CC9B;110E 1165 11AA;CC9B;110E 1165 11AA; # (첛; 첛; 첛; 첛; 첛; ) HANGUL SYLLABLE CEOGS +CC9C;CC9C;110E 1165 11AB;CC9C;110E 1165 11AB; # (천; 천; 천; 천; 천; ) HANGUL SYLLABLE CEON +CC9D;CC9D;110E 1165 11AC;CC9D;110E 1165 11AC; # (첝; 첝; 첝; 첝; 첝; ) HANGUL SYLLABLE CEONJ +CC9E;CC9E;110E 1165 11AD;CC9E;110E 1165 11AD; # (첞; 첞; 첞; 첞; 첞; ) HANGUL SYLLABLE CEONH +CC9F;CC9F;110E 1165 11AE;CC9F;110E 1165 11AE; # (첟; 첟; 첟; 첟; 첟; ) HANGUL SYLLABLE CEOD +CCA0;CCA0;110E 1165 11AF;CCA0;110E 1165 11AF; # (철; 철; 철; 철; 철; ) HANGUL SYLLABLE CEOL +CCA1;CCA1;110E 1165 11B0;CCA1;110E 1165 11B0; # (첡; 첡; 첡; 첡; 첡; ) HANGUL SYLLABLE CEOLG +CCA2;CCA2;110E 1165 11B1;CCA2;110E 1165 11B1; # (첢; 첢; 첢; 첢; 첢; ) HANGUL SYLLABLE CEOLM +CCA3;CCA3;110E 1165 11B2;CCA3;110E 1165 11B2; # (첣; 첣; 첣; 첣; 첣; ) HANGUL SYLLABLE CEOLB +CCA4;CCA4;110E 1165 11B3;CCA4;110E 1165 11B3; # (첤; 첤; 첤; 첤; 첤; ) HANGUL SYLLABLE CEOLS +CCA5;CCA5;110E 1165 11B4;CCA5;110E 1165 11B4; # (첥; 첥; 첥; 첥; 첥; ) HANGUL SYLLABLE CEOLT +CCA6;CCA6;110E 1165 11B5;CCA6;110E 1165 11B5; # (첦; 첦; 첦; 첦; 첦; ) HANGUL SYLLABLE CEOLP +CCA7;CCA7;110E 1165 11B6;CCA7;110E 1165 11B6; # (첧; 첧; 첧; 첧; 첧; ) HANGUL SYLLABLE CEOLH +CCA8;CCA8;110E 1165 11B7;CCA8;110E 1165 11B7; # (첨; 첨; 첨; 첨; 첨; ) HANGUL SYLLABLE CEOM +CCA9;CCA9;110E 1165 11B8;CCA9;110E 1165 11B8; # (첩; 첩; 첩; 첩; 첩; ) HANGUL SYLLABLE CEOB +CCAA;CCAA;110E 1165 11B9;CCAA;110E 1165 11B9; # (첪; 첪; 첪; 첪; 첪; ) HANGUL SYLLABLE CEOBS +CCAB;CCAB;110E 1165 11BA;CCAB;110E 1165 11BA; # (첫; 첫; 첫; 첫; 첫; ) HANGUL SYLLABLE CEOS +CCAC;CCAC;110E 1165 11BB;CCAC;110E 1165 11BB; # (첬; 첬; 첬; 첬; 첬; ) HANGUL SYLLABLE CEOSS +CCAD;CCAD;110E 1165 11BC;CCAD;110E 1165 11BC; # (청; 청; 청; 청; 청; ) HANGUL SYLLABLE CEONG +CCAE;CCAE;110E 1165 11BD;CCAE;110E 1165 11BD; # (첮; 첮; 첮; 첮; 첮; ) HANGUL SYLLABLE CEOJ +CCAF;CCAF;110E 1165 11BE;CCAF;110E 1165 11BE; # (첯; 첯; 첯; 첯; 첯; ) HANGUL SYLLABLE CEOC +CCB0;CCB0;110E 1165 11BF;CCB0;110E 1165 11BF; # (첰; 첰; 첰; 첰; 첰; ) HANGUL SYLLABLE CEOK +CCB1;CCB1;110E 1165 11C0;CCB1;110E 1165 11C0; # (첱; 첱; 첱; 첱; 첱; ) HANGUL SYLLABLE CEOT +CCB2;CCB2;110E 1165 11C1;CCB2;110E 1165 11C1; # (첲; 첲; 첲; 첲; 첲; ) HANGUL SYLLABLE CEOP +CCB3;CCB3;110E 1165 11C2;CCB3;110E 1165 11C2; # (첳; 첳; 첳; 첳; 첳; ) HANGUL SYLLABLE CEOH +CCB4;CCB4;110E 1166;CCB4;110E 1166; # (체; 체; 체; 체; 체; ) HANGUL SYLLABLE CE +CCB5;CCB5;110E 1166 11A8;CCB5;110E 1166 11A8; # (첵; 첵; 첵; 첵; 첵; ) HANGUL SYLLABLE CEG +CCB6;CCB6;110E 1166 11A9;CCB6;110E 1166 11A9; # (첶; 첶; 첶; 첶; 첶; ) HANGUL SYLLABLE CEGG +CCB7;CCB7;110E 1166 11AA;CCB7;110E 1166 11AA; # (첷; 첷; 첷; 첷; 첷; ) HANGUL SYLLABLE CEGS +CCB8;CCB8;110E 1166 11AB;CCB8;110E 1166 11AB; # (첸; 첸; 첸; 첸; 첸; ) HANGUL SYLLABLE CEN +CCB9;CCB9;110E 1166 11AC;CCB9;110E 1166 11AC; # (첹; 첹; 첹; 첹; 첹; ) HANGUL SYLLABLE CENJ +CCBA;CCBA;110E 1166 11AD;CCBA;110E 1166 11AD; # (첺; 첺; 첺; 첺; 첺; ) HANGUL SYLLABLE CENH +CCBB;CCBB;110E 1166 11AE;CCBB;110E 1166 11AE; # (첻; 첻; 첻; 첻; 첻; ) HANGUL SYLLABLE CED +CCBC;CCBC;110E 1166 11AF;CCBC;110E 1166 11AF; # (첼; 첼; 첼; 첼; 첼; ) HANGUL SYLLABLE CEL +CCBD;CCBD;110E 1166 11B0;CCBD;110E 1166 11B0; # (첽; 첽; 첽; 첽; 첽; ) HANGUL SYLLABLE CELG +CCBE;CCBE;110E 1166 11B1;CCBE;110E 1166 11B1; # (첾; 첾; 첾; 첾; 첾; ) HANGUL SYLLABLE CELM +CCBF;CCBF;110E 1166 11B2;CCBF;110E 1166 11B2; # (첿; 첿; 첿; 첿; 첿; ) HANGUL SYLLABLE CELB +CCC0;CCC0;110E 1166 11B3;CCC0;110E 1166 11B3; # (쳀; 쳀; 쳀; 쳀; 쳀; ) HANGUL SYLLABLE CELS +CCC1;CCC1;110E 1166 11B4;CCC1;110E 1166 11B4; # (쳁; 쳁; 쳁; 쳁; 쳁; ) HANGUL SYLLABLE CELT +CCC2;CCC2;110E 1166 11B5;CCC2;110E 1166 11B5; # (쳂; 쳂; 쳂; 쳂; 쳂; ) HANGUL SYLLABLE CELP +CCC3;CCC3;110E 1166 11B6;CCC3;110E 1166 11B6; # (쳃; 쳃; 쳃; 쳃; 쳃; ) HANGUL SYLLABLE CELH +CCC4;CCC4;110E 1166 11B7;CCC4;110E 1166 11B7; # (쳄; 쳄; 쳄; 쳄; 쳄; ) HANGUL SYLLABLE CEM +CCC5;CCC5;110E 1166 11B8;CCC5;110E 1166 11B8; # (쳅; 쳅; 쳅; 쳅; 쳅; ) HANGUL SYLLABLE CEB +CCC6;CCC6;110E 1166 11B9;CCC6;110E 1166 11B9; # (쳆; 쳆; 쳆; 쳆; 쳆; ) HANGUL SYLLABLE CEBS +CCC7;CCC7;110E 1166 11BA;CCC7;110E 1166 11BA; # (쳇; 쳇; 쳇; 쳇; 쳇; ) HANGUL SYLLABLE CES +CCC8;CCC8;110E 1166 11BB;CCC8;110E 1166 11BB; # (쳈; 쳈; 쳈; 쳈; 쳈; ) HANGUL SYLLABLE CESS +CCC9;CCC9;110E 1166 11BC;CCC9;110E 1166 11BC; # (쳉; 쳉; 쳉; 쳉; 쳉; ) HANGUL SYLLABLE CENG +CCCA;CCCA;110E 1166 11BD;CCCA;110E 1166 11BD; # (쳊; 쳊; 쳊; 쳊; 쳊; ) HANGUL SYLLABLE CEJ +CCCB;CCCB;110E 1166 11BE;CCCB;110E 1166 11BE; # (쳋; 쳋; 쳋; 쳋; 쳋; ) HANGUL SYLLABLE CEC +CCCC;CCCC;110E 1166 11BF;CCCC;110E 1166 11BF; # (쳌; 쳌; 쳌; 쳌; 쳌; ) HANGUL SYLLABLE CEK +CCCD;CCCD;110E 1166 11C0;CCCD;110E 1166 11C0; # (쳍; 쳍; 쳍; 쳍; 쳍; ) HANGUL SYLLABLE CET +CCCE;CCCE;110E 1166 11C1;CCCE;110E 1166 11C1; # (쳎; 쳎; 쳎; 쳎; 쳎; ) HANGUL SYLLABLE CEP +CCCF;CCCF;110E 1166 11C2;CCCF;110E 1166 11C2; # (쳏; 쳏; 쳏; 쳏; 쳏; ) HANGUL SYLLABLE CEH +CCD0;CCD0;110E 1167;CCD0;110E 1167; # (쳐; 쳐; 쳐; 쳐; 쳐; ) HANGUL SYLLABLE CYEO +CCD1;CCD1;110E 1167 11A8;CCD1;110E 1167 11A8; # (쳑; 쳑; 쳑; 쳑; 쳑; ) HANGUL SYLLABLE CYEOG +CCD2;CCD2;110E 1167 11A9;CCD2;110E 1167 11A9; # (쳒; 쳒; 쳒; 쳒; 쳒; ) HANGUL SYLLABLE CYEOGG +CCD3;CCD3;110E 1167 11AA;CCD3;110E 1167 11AA; # (쳓; 쳓; 쳓; 쳓; 쳓; ) HANGUL SYLLABLE CYEOGS +CCD4;CCD4;110E 1167 11AB;CCD4;110E 1167 11AB; # (쳔; 쳔; 쳔; 쳔; 쳔; ) HANGUL SYLLABLE CYEON +CCD5;CCD5;110E 1167 11AC;CCD5;110E 1167 11AC; # (쳕; 쳕; 쳕; 쳕; 쳕; ) HANGUL SYLLABLE CYEONJ +CCD6;CCD6;110E 1167 11AD;CCD6;110E 1167 11AD; # (쳖; 쳖; 쳖; 쳖; 쳖; ) HANGUL SYLLABLE CYEONH +CCD7;CCD7;110E 1167 11AE;CCD7;110E 1167 11AE; # (쳗; 쳗; 쳗; 쳗; 쳗; ) HANGUL SYLLABLE CYEOD +CCD8;CCD8;110E 1167 11AF;CCD8;110E 1167 11AF; # (쳘; 쳘; 쳘; 쳘; 쳘; ) HANGUL SYLLABLE CYEOL +CCD9;CCD9;110E 1167 11B0;CCD9;110E 1167 11B0; # (쳙; 쳙; 쳙; 쳙; 쳙; ) HANGUL SYLLABLE CYEOLG +CCDA;CCDA;110E 1167 11B1;CCDA;110E 1167 11B1; # (쳚; 쳚; 쳚; 쳚; 쳚; ) HANGUL SYLLABLE CYEOLM +CCDB;CCDB;110E 1167 11B2;CCDB;110E 1167 11B2; # (쳛; 쳛; 쳛; 쳛; 쳛; ) HANGUL SYLLABLE CYEOLB +CCDC;CCDC;110E 1167 11B3;CCDC;110E 1167 11B3; # (쳜; 쳜; 쳜; 쳜; 쳜; ) HANGUL SYLLABLE CYEOLS +CCDD;CCDD;110E 1167 11B4;CCDD;110E 1167 11B4; # (쳝; 쳝; 쳝; 쳝; 쳝; ) HANGUL SYLLABLE CYEOLT +CCDE;CCDE;110E 1167 11B5;CCDE;110E 1167 11B5; # (쳞; 쳞; 쳞; 쳞; 쳞; ) HANGUL SYLLABLE CYEOLP +CCDF;CCDF;110E 1167 11B6;CCDF;110E 1167 11B6; # (쳟; 쳟; 쳟; 쳟; 쳟; ) HANGUL SYLLABLE CYEOLH +CCE0;CCE0;110E 1167 11B7;CCE0;110E 1167 11B7; # (쳠; 쳠; 쳠; 쳠; 쳠; ) HANGUL SYLLABLE CYEOM +CCE1;CCE1;110E 1167 11B8;CCE1;110E 1167 11B8; # (쳡; 쳡; 쳡; 쳡; 쳡; ) HANGUL SYLLABLE CYEOB +CCE2;CCE2;110E 1167 11B9;CCE2;110E 1167 11B9; # (쳢; 쳢; 쳢; 쳢; 쳢; ) HANGUL SYLLABLE CYEOBS +CCE3;CCE3;110E 1167 11BA;CCE3;110E 1167 11BA; # (쳣; 쳣; 쳣; 쳣; 쳣; ) HANGUL SYLLABLE CYEOS +CCE4;CCE4;110E 1167 11BB;CCE4;110E 1167 11BB; # (쳤; 쳤; 쳤; 쳤; 쳤; ) HANGUL SYLLABLE CYEOSS +CCE5;CCE5;110E 1167 11BC;CCE5;110E 1167 11BC; # (쳥; 쳥; 쳥; 쳥; 쳥; ) HANGUL SYLLABLE CYEONG +CCE6;CCE6;110E 1167 11BD;CCE6;110E 1167 11BD; # (쳦; 쳦; 쳦; 쳦; 쳦; ) HANGUL SYLLABLE CYEOJ +CCE7;CCE7;110E 1167 11BE;CCE7;110E 1167 11BE; # (쳧; 쳧; 쳧; 쳧; 쳧; ) HANGUL SYLLABLE CYEOC +CCE8;CCE8;110E 1167 11BF;CCE8;110E 1167 11BF; # (쳨; 쳨; 쳨; 쳨; 쳨; ) HANGUL SYLLABLE CYEOK +CCE9;CCE9;110E 1167 11C0;CCE9;110E 1167 11C0; # (쳩; 쳩; 쳩; 쳩; 쳩; ) HANGUL SYLLABLE CYEOT +CCEA;CCEA;110E 1167 11C1;CCEA;110E 1167 11C1; # (쳪; 쳪; 쳪; 쳪; 쳪; ) HANGUL SYLLABLE CYEOP +CCEB;CCEB;110E 1167 11C2;CCEB;110E 1167 11C2; # (쳫; 쳫; 쳫; 쳫; 쳫; ) HANGUL SYLLABLE CYEOH +CCEC;CCEC;110E 1168;CCEC;110E 1168; # (쳬; 쳬; 쳬; 쳬; 쳬; ) HANGUL SYLLABLE CYE +CCED;CCED;110E 1168 11A8;CCED;110E 1168 11A8; # (쳭; 쳭; 쳭; 쳭; 쳭; ) HANGUL SYLLABLE CYEG +CCEE;CCEE;110E 1168 11A9;CCEE;110E 1168 11A9; # (쳮; 쳮; 쳮; 쳮; 쳮; ) HANGUL SYLLABLE CYEGG +CCEF;CCEF;110E 1168 11AA;CCEF;110E 1168 11AA; # (쳯; 쳯; 쳯; 쳯; 쳯; ) HANGUL SYLLABLE CYEGS +CCF0;CCF0;110E 1168 11AB;CCF0;110E 1168 11AB; # (쳰; 쳰; 쳰; 쳰; 쳰; ) HANGUL SYLLABLE CYEN +CCF1;CCF1;110E 1168 11AC;CCF1;110E 1168 11AC; # (쳱; 쳱; 쳱; 쳱; 쳱; ) HANGUL SYLLABLE CYENJ +CCF2;CCF2;110E 1168 11AD;CCF2;110E 1168 11AD; # (쳲; 쳲; 쳲; 쳲; 쳲; ) HANGUL SYLLABLE CYENH +CCF3;CCF3;110E 1168 11AE;CCF3;110E 1168 11AE; # (쳳; 쳳; 쳳; 쳳; 쳳; ) HANGUL SYLLABLE CYED +CCF4;CCF4;110E 1168 11AF;CCF4;110E 1168 11AF; # (쳴; 쳴; 쳴; 쳴; 쳴; ) HANGUL SYLLABLE CYEL +CCF5;CCF5;110E 1168 11B0;CCF5;110E 1168 11B0; # (쳵; 쳵; 쳵; 쳵; 쳵; ) HANGUL SYLLABLE CYELG +CCF6;CCF6;110E 1168 11B1;CCF6;110E 1168 11B1; # (쳶; 쳶; 쳶; 쳶; 쳶; ) HANGUL SYLLABLE CYELM +CCF7;CCF7;110E 1168 11B2;CCF7;110E 1168 11B2; # (쳷; 쳷; 쳷; 쳷; 쳷; ) HANGUL SYLLABLE CYELB +CCF8;CCF8;110E 1168 11B3;CCF8;110E 1168 11B3; # (쳸; 쳸; 쳸; 쳸; 쳸; ) HANGUL SYLLABLE CYELS +CCF9;CCF9;110E 1168 11B4;CCF9;110E 1168 11B4; # (쳹; 쳹; 쳹; 쳹; 쳹; ) HANGUL SYLLABLE CYELT +CCFA;CCFA;110E 1168 11B5;CCFA;110E 1168 11B5; # (쳺; 쳺; 쳺; 쳺; 쳺; ) HANGUL SYLLABLE CYELP +CCFB;CCFB;110E 1168 11B6;CCFB;110E 1168 11B6; # (쳻; 쳻; 쳻; 쳻; 쳻; ) HANGUL SYLLABLE CYELH +CCFC;CCFC;110E 1168 11B7;CCFC;110E 1168 11B7; # (쳼; 쳼; 쳼; 쳼; 쳼; ) HANGUL SYLLABLE CYEM +CCFD;CCFD;110E 1168 11B8;CCFD;110E 1168 11B8; # (쳽; 쳽; 쳽; 쳽; 쳽; ) HANGUL SYLLABLE CYEB +CCFE;CCFE;110E 1168 11B9;CCFE;110E 1168 11B9; # (쳾; 쳾; 쳾; 쳾; 쳾; ) HANGUL SYLLABLE CYEBS +CCFF;CCFF;110E 1168 11BA;CCFF;110E 1168 11BA; # (쳿; 쳿; 쳿; 쳿; 쳿; ) HANGUL SYLLABLE CYES +CD00;CD00;110E 1168 11BB;CD00;110E 1168 11BB; # (촀; 촀; 촀; 촀; 촀; ) HANGUL SYLLABLE CYESS +CD01;CD01;110E 1168 11BC;CD01;110E 1168 11BC; # (촁; 촁; 촁; 촁; 촁; ) HANGUL SYLLABLE CYENG +CD02;CD02;110E 1168 11BD;CD02;110E 1168 11BD; # (촂; 촂; 촂; 촂; 촂; ) HANGUL SYLLABLE CYEJ +CD03;CD03;110E 1168 11BE;CD03;110E 1168 11BE; # (촃; 촃; 촃; 촃; 촃; ) HANGUL SYLLABLE CYEC +CD04;CD04;110E 1168 11BF;CD04;110E 1168 11BF; # (촄; 촄; 촄; 촄; 촄; ) HANGUL SYLLABLE CYEK +CD05;CD05;110E 1168 11C0;CD05;110E 1168 11C0; # (촅; 촅; 촅; 촅; 촅; ) HANGUL SYLLABLE CYET +CD06;CD06;110E 1168 11C1;CD06;110E 1168 11C1; # (촆; 촆; 촆; 촆; 촆; ) HANGUL SYLLABLE CYEP +CD07;CD07;110E 1168 11C2;CD07;110E 1168 11C2; # (촇; 촇; 촇; 촇; 촇; ) HANGUL SYLLABLE CYEH +CD08;CD08;110E 1169;CD08;110E 1169; # (초; 초; 초; 초; 초; ) HANGUL SYLLABLE CO +CD09;CD09;110E 1169 11A8;CD09;110E 1169 11A8; # (촉; 촉; 촉; 촉; 촉; ) HANGUL SYLLABLE COG +CD0A;CD0A;110E 1169 11A9;CD0A;110E 1169 11A9; # (촊; 촊; 촊; 촊; 촊; ) HANGUL SYLLABLE COGG +CD0B;CD0B;110E 1169 11AA;CD0B;110E 1169 11AA; # (촋; 촋; 촋; 촋; 촋; ) HANGUL SYLLABLE COGS +CD0C;CD0C;110E 1169 11AB;CD0C;110E 1169 11AB; # (촌; 촌; 촌; 촌; 촌; ) HANGUL SYLLABLE CON +CD0D;CD0D;110E 1169 11AC;CD0D;110E 1169 11AC; # (촍; 촍; 촍; 촍; 촍; ) HANGUL SYLLABLE CONJ +CD0E;CD0E;110E 1169 11AD;CD0E;110E 1169 11AD; # (촎; 촎; 촎; 촎; 촎; ) HANGUL SYLLABLE CONH +CD0F;CD0F;110E 1169 11AE;CD0F;110E 1169 11AE; # (촏; 촏; 촏; 촏; 촏; ) HANGUL SYLLABLE COD +CD10;CD10;110E 1169 11AF;CD10;110E 1169 11AF; # (촐; 촐; 촐; 촐; 촐; ) HANGUL SYLLABLE COL +CD11;CD11;110E 1169 11B0;CD11;110E 1169 11B0; # (촑; 촑; 촑; 촑; 촑; ) HANGUL SYLLABLE COLG +CD12;CD12;110E 1169 11B1;CD12;110E 1169 11B1; # (촒; 촒; 촒; 촒; 촒; ) HANGUL SYLLABLE COLM +CD13;CD13;110E 1169 11B2;CD13;110E 1169 11B2; # (촓; 촓; 촓; 촓; 촓; ) HANGUL SYLLABLE COLB +CD14;CD14;110E 1169 11B3;CD14;110E 1169 11B3; # (촔; 촔; 촔; 촔; 촔; ) HANGUL SYLLABLE COLS +CD15;CD15;110E 1169 11B4;CD15;110E 1169 11B4; # (촕; 촕; 촕; 촕; 촕; ) HANGUL SYLLABLE COLT +CD16;CD16;110E 1169 11B5;CD16;110E 1169 11B5; # (촖; 촖; 촖; 촖; 촖; ) HANGUL SYLLABLE COLP +CD17;CD17;110E 1169 11B6;CD17;110E 1169 11B6; # (촗; 촗; 촗; 촗; 촗; ) HANGUL SYLLABLE COLH +CD18;CD18;110E 1169 11B7;CD18;110E 1169 11B7; # (촘; 촘; 촘; 촘; 촘; ) HANGUL SYLLABLE COM +CD19;CD19;110E 1169 11B8;CD19;110E 1169 11B8; # (촙; 촙; 촙; 촙; 촙; ) HANGUL SYLLABLE COB +CD1A;CD1A;110E 1169 11B9;CD1A;110E 1169 11B9; # (촚; 촚; 촚; 촚; 촚; ) HANGUL SYLLABLE COBS +CD1B;CD1B;110E 1169 11BA;CD1B;110E 1169 11BA; # (촛; 촛; 촛; 촛; 촛; ) HANGUL SYLLABLE COS +CD1C;CD1C;110E 1169 11BB;CD1C;110E 1169 11BB; # (촜; 촜; 촜; 촜; 촜; ) HANGUL SYLLABLE COSS +CD1D;CD1D;110E 1169 11BC;CD1D;110E 1169 11BC; # (총; 총; 총; 총; 총; ) HANGUL SYLLABLE CONG +CD1E;CD1E;110E 1169 11BD;CD1E;110E 1169 11BD; # (촞; 촞; 촞; 촞; 촞; ) HANGUL SYLLABLE COJ +CD1F;CD1F;110E 1169 11BE;CD1F;110E 1169 11BE; # (촟; 촟; 촟; 촟; 촟; ) HANGUL SYLLABLE COC +CD20;CD20;110E 1169 11BF;CD20;110E 1169 11BF; # (촠; 촠; 촠; 촠; 촠; ) HANGUL SYLLABLE COK +CD21;CD21;110E 1169 11C0;CD21;110E 1169 11C0; # (촡; 촡; 촡; 촡; 촡; ) HANGUL SYLLABLE COT +CD22;CD22;110E 1169 11C1;CD22;110E 1169 11C1; # (촢; 촢; 촢; 촢; 촢; ) HANGUL SYLLABLE COP +CD23;CD23;110E 1169 11C2;CD23;110E 1169 11C2; # (촣; 촣; 촣; 촣; 촣; ) HANGUL SYLLABLE COH +CD24;CD24;110E 116A;CD24;110E 116A; # (촤; 촤; 촤; 촤; 촤; ) HANGUL SYLLABLE CWA +CD25;CD25;110E 116A 11A8;CD25;110E 116A 11A8; # (촥; 촥; 촥; 촥; 촥; ) HANGUL SYLLABLE CWAG +CD26;CD26;110E 116A 11A9;CD26;110E 116A 11A9; # (촦; 촦; 촦; 촦; 촦; ) HANGUL SYLLABLE CWAGG +CD27;CD27;110E 116A 11AA;CD27;110E 116A 11AA; # (촧; 촧; 촧; 촧; 촧; ) HANGUL SYLLABLE CWAGS +CD28;CD28;110E 116A 11AB;CD28;110E 116A 11AB; # (촨; 촨; 촨; 촨; 촨; ) HANGUL SYLLABLE CWAN +CD29;CD29;110E 116A 11AC;CD29;110E 116A 11AC; # (촩; 촩; 촩; 촩; 촩; ) HANGUL SYLLABLE CWANJ +CD2A;CD2A;110E 116A 11AD;CD2A;110E 116A 11AD; # (촪; 촪; 촪; 촪; 촪; ) HANGUL SYLLABLE CWANH +CD2B;CD2B;110E 116A 11AE;CD2B;110E 116A 11AE; # (촫; 촫; 촫; 촫; 촫; ) HANGUL SYLLABLE CWAD +CD2C;CD2C;110E 116A 11AF;CD2C;110E 116A 11AF; # (촬; 촬; 촬; 촬; 촬; ) HANGUL SYLLABLE CWAL +CD2D;CD2D;110E 116A 11B0;CD2D;110E 116A 11B0; # (촭; 촭; 촭; 촭; 촭; ) HANGUL SYLLABLE CWALG +CD2E;CD2E;110E 116A 11B1;CD2E;110E 116A 11B1; # (촮; 촮; 촮; 촮; 촮; ) HANGUL SYLLABLE CWALM +CD2F;CD2F;110E 116A 11B2;CD2F;110E 116A 11B2; # (촯; 촯; 촯; 촯; 촯; ) HANGUL SYLLABLE CWALB +CD30;CD30;110E 116A 11B3;CD30;110E 116A 11B3; # (촰; 촰; 촰; 촰; 촰; ) HANGUL SYLLABLE CWALS +CD31;CD31;110E 116A 11B4;CD31;110E 116A 11B4; # (촱; 촱; 촱; 촱; 촱; ) HANGUL SYLLABLE CWALT +CD32;CD32;110E 116A 11B5;CD32;110E 116A 11B5; # (촲; 촲; 촲; 촲; 촲; ) HANGUL SYLLABLE CWALP +CD33;CD33;110E 116A 11B6;CD33;110E 116A 11B6; # (촳; 촳; 촳; 촳; 촳; ) HANGUL SYLLABLE CWALH +CD34;CD34;110E 116A 11B7;CD34;110E 116A 11B7; # (촴; 촴; 촴; 촴; 촴; ) HANGUL SYLLABLE CWAM +CD35;CD35;110E 116A 11B8;CD35;110E 116A 11B8; # (촵; 촵; 촵; 촵; 촵; ) HANGUL SYLLABLE CWAB +CD36;CD36;110E 116A 11B9;CD36;110E 116A 11B9; # (촶; 촶; 촶; 촶; 촶; ) HANGUL SYLLABLE CWABS +CD37;CD37;110E 116A 11BA;CD37;110E 116A 11BA; # (촷; 촷; 촷; 촷; 촷; ) HANGUL SYLLABLE CWAS +CD38;CD38;110E 116A 11BB;CD38;110E 116A 11BB; # (촸; 촸; 촸; 촸; 촸; ) HANGUL SYLLABLE CWASS +CD39;CD39;110E 116A 11BC;CD39;110E 116A 11BC; # (촹; 촹; 촹; 촹; 촹; ) HANGUL SYLLABLE CWANG +CD3A;CD3A;110E 116A 11BD;CD3A;110E 116A 11BD; # (촺; 촺; 촺; 촺; 촺; ) HANGUL SYLLABLE CWAJ +CD3B;CD3B;110E 116A 11BE;CD3B;110E 116A 11BE; # (촻; 촻; 촻; 촻; 촻; ) HANGUL SYLLABLE CWAC +CD3C;CD3C;110E 116A 11BF;CD3C;110E 116A 11BF; # (촼; 촼; 촼; 촼; 촼; ) HANGUL SYLLABLE CWAK +CD3D;CD3D;110E 116A 11C0;CD3D;110E 116A 11C0; # (촽; 촽; 촽; 촽; 촽; ) HANGUL SYLLABLE CWAT +CD3E;CD3E;110E 116A 11C1;CD3E;110E 116A 11C1; # (촾; 촾; 촾; 촾; 촾; ) HANGUL SYLLABLE CWAP +CD3F;CD3F;110E 116A 11C2;CD3F;110E 116A 11C2; # (촿; 촿; 촿; 촿; 촿; ) HANGUL SYLLABLE CWAH +CD40;CD40;110E 116B;CD40;110E 116B; # (쵀; 쵀; 쵀; 쵀; 쵀; ) HANGUL SYLLABLE CWAE +CD41;CD41;110E 116B 11A8;CD41;110E 116B 11A8; # (쵁; 쵁; 쵁; 쵁; 쵁; ) HANGUL SYLLABLE CWAEG +CD42;CD42;110E 116B 11A9;CD42;110E 116B 11A9; # (쵂; 쵂; 쵂; 쵂; 쵂; ) HANGUL SYLLABLE CWAEGG +CD43;CD43;110E 116B 11AA;CD43;110E 116B 11AA; # (쵃; 쵃; 쵃; 쵃; 쵃; ) HANGUL SYLLABLE CWAEGS +CD44;CD44;110E 116B 11AB;CD44;110E 116B 11AB; # (쵄; 쵄; 쵄; 쵄; 쵄; ) HANGUL SYLLABLE CWAEN +CD45;CD45;110E 116B 11AC;CD45;110E 116B 11AC; # (쵅; 쵅; 쵅; 쵅; 쵅; ) HANGUL SYLLABLE CWAENJ +CD46;CD46;110E 116B 11AD;CD46;110E 116B 11AD; # (쵆; 쵆; 쵆; 쵆; 쵆; ) HANGUL SYLLABLE CWAENH +CD47;CD47;110E 116B 11AE;CD47;110E 116B 11AE; # (쵇; 쵇; 쵇; 쵇; 쵇; ) HANGUL SYLLABLE CWAED +CD48;CD48;110E 116B 11AF;CD48;110E 116B 11AF; # (쵈; 쵈; 쵈; 쵈; 쵈; ) HANGUL SYLLABLE CWAEL +CD49;CD49;110E 116B 11B0;CD49;110E 116B 11B0; # (쵉; 쵉; 쵉; 쵉; 쵉; ) HANGUL SYLLABLE CWAELG +CD4A;CD4A;110E 116B 11B1;CD4A;110E 116B 11B1; # (쵊; 쵊; 쵊; 쵊; 쵊; ) HANGUL SYLLABLE CWAELM +CD4B;CD4B;110E 116B 11B2;CD4B;110E 116B 11B2; # (쵋; 쵋; 쵋; 쵋; 쵋; ) HANGUL SYLLABLE CWAELB +CD4C;CD4C;110E 116B 11B3;CD4C;110E 116B 11B3; # (쵌; 쵌; 쵌; 쵌; 쵌; ) HANGUL SYLLABLE CWAELS +CD4D;CD4D;110E 116B 11B4;CD4D;110E 116B 11B4; # (쵍; 쵍; 쵍; 쵍; 쵍; ) HANGUL SYLLABLE CWAELT +CD4E;CD4E;110E 116B 11B5;CD4E;110E 116B 11B5; # (쵎; 쵎; 쵎; 쵎; 쵎; ) HANGUL SYLLABLE CWAELP +CD4F;CD4F;110E 116B 11B6;CD4F;110E 116B 11B6; # (쵏; 쵏; 쵏; 쵏; 쵏; ) HANGUL SYLLABLE CWAELH +CD50;CD50;110E 116B 11B7;CD50;110E 116B 11B7; # (쵐; 쵐; 쵐; 쵐; 쵐; ) HANGUL SYLLABLE CWAEM +CD51;CD51;110E 116B 11B8;CD51;110E 116B 11B8; # (쵑; 쵑; 쵑; 쵑; 쵑; ) HANGUL SYLLABLE CWAEB +CD52;CD52;110E 116B 11B9;CD52;110E 116B 11B9; # (쵒; 쵒; 쵒; 쵒; 쵒; ) HANGUL SYLLABLE CWAEBS +CD53;CD53;110E 116B 11BA;CD53;110E 116B 11BA; # (쵓; 쵓; 쵓; 쵓; 쵓; ) HANGUL SYLLABLE CWAES +CD54;CD54;110E 116B 11BB;CD54;110E 116B 11BB; # (쵔; 쵔; 쵔; 쵔; 쵔; ) HANGUL SYLLABLE CWAESS +CD55;CD55;110E 116B 11BC;CD55;110E 116B 11BC; # (쵕; 쵕; 쵕; 쵕; 쵕; ) HANGUL SYLLABLE CWAENG +CD56;CD56;110E 116B 11BD;CD56;110E 116B 11BD; # (쵖; 쵖; 쵖; 쵖; 쵖; ) HANGUL SYLLABLE CWAEJ +CD57;CD57;110E 116B 11BE;CD57;110E 116B 11BE; # (쵗; 쵗; 쵗; 쵗; 쵗; ) HANGUL SYLLABLE CWAEC +CD58;CD58;110E 116B 11BF;CD58;110E 116B 11BF; # (쵘; 쵘; 쵘; 쵘; 쵘; ) HANGUL SYLLABLE CWAEK +CD59;CD59;110E 116B 11C0;CD59;110E 116B 11C0; # (쵙; 쵙; 쵙; 쵙; 쵙; ) HANGUL SYLLABLE CWAET +CD5A;CD5A;110E 116B 11C1;CD5A;110E 116B 11C1; # (쵚; 쵚; 쵚; 쵚; 쵚; ) HANGUL SYLLABLE CWAEP +CD5B;CD5B;110E 116B 11C2;CD5B;110E 116B 11C2; # (쵛; 쵛; 쵛; 쵛; 쵛; ) HANGUL SYLLABLE CWAEH +CD5C;CD5C;110E 116C;CD5C;110E 116C; # (최; 최; 최; 최; 최; ) HANGUL SYLLABLE COE +CD5D;CD5D;110E 116C 11A8;CD5D;110E 116C 11A8; # (쵝; 쵝; 쵝; 쵝; 쵝; ) HANGUL SYLLABLE COEG +CD5E;CD5E;110E 116C 11A9;CD5E;110E 116C 11A9; # (쵞; 쵞; 쵞; 쵞; 쵞; ) HANGUL SYLLABLE COEGG +CD5F;CD5F;110E 116C 11AA;CD5F;110E 116C 11AA; # (쵟; 쵟; 쵟; 쵟; 쵟; ) HANGUL SYLLABLE COEGS +CD60;CD60;110E 116C 11AB;CD60;110E 116C 11AB; # (쵠; 쵠; 쵠; 쵠; 쵠; ) HANGUL SYLLABLE COEN +CD61;CD61;110E 116C 11AC;CD61;110E 116C 11AC; # (쵡; 쵡; 쵡; 쵡; 쵡; ) HANGUL SYLLABLE COENJ +CD62;CD62;110E 116C 11AD;CD62;110E 116C 11AD; # (쵢; 쵢; 쵢; 쵢; 쵢; ) HANGUL SYLLABLE COENH +CD63;CD63;110E 116C 11AE;CD63;110E 116C 11AE; # (쵣; 쵣; 쵣; 쵣; 쵣; ) HANGUL SYLLABLE COED +CD64;CD64;110E 116C 11AF;CD64;110E 116C 11AF; # (쵤; 쵤; 쵤; 쵤; 쵤; ) HANGUL SYLLABLE COEL +CD65;CD65;110E 116C 11B0;CD65;110E 116C 11B0; # (쵥; 쵥; 쵥; 쵥; 쵥; ) HANGUL SYLLABLE COELG +CD66;CD66;110E 116C 11B1;CD66;110E 116C 11B1; # (쵦; 쵦; 쵦; 쵦; 쵦; ) HANGUL SYLLABLE COELM +CD67;CD67;110E 116C 11B2;CD67;110E 116C 11B2; # (쵧; 쵧; 쵧; 쵧; 쵧; ) HANGUL SYLLABLE COELB +CD68;CD68;110E 116C 11B3;CD68;110E 116C 11B3; # (쵨; 쵨; 쵨; 쵨; 쵨; ) HANGUL SYLLABLE COELS +CD69;CD69;110E 116C 11B4;CD69;110E 116C 11B4; # (쵩; 쵩; 쵩; 쵩; 쵩; ) HANGUL SYLLABLE COELT +CD6A;CD6A;110E 116C 11B5;CD6A;110E 116C 11B5; # (쵪; 쵪; 쵪; 쵪; 쵪; ) HANGUL SYLLABLE COELP +CD6B;CD6B;110E 116C 11B6;CD6B;110E 116C 11B6; # (쵫; 쵫; 쵫; 쵫; 쵫; ) HANGUL SYLLABLE COELH +CD6C;CD6C;110E 116C 11B7;CD6C;110E 116C 11B7; # (쵬; 쵬; 쵬; 쵬; 쵬; ) HANGUL SYLLABLE COEM +CD6D;CD6D;110E 116C 11B8;CD6D;110E 116C 11B8; # (쵭; 쵭; 쵭; 쵭; 쵭; ) HANGUL SYLLABLE COEB +CD6E;CD6E;110E 116C 11B9;CD6E;110E 116C 11B9; # (쵮; 쵮; 쵮; 쵮; 쵮; ) HANGUL SYLLABLE COEBS +CD6F;CD6F;110E 116C 11BA;CD6F;110E 116C 11BA; # (쵯; 쵯; 쵯; 쵯; 쵯; ) HANGUL SYLLABLE COES +CD70;CD70;110E 116C 11BB;CD70;110E 116C 11BB; # (쵰; 쵰; 쵰; 쵰; 쵰; ) HANGUL SYLLABLE COESS +CD71;CD71;110E 116C 11BC;CD71;110E 116C 11BC; # (쵱; 쵱; 쵱; 쵱; 쵱; ) HANGUL SYLLABLE COENG +CD72;CD72;110E 116C 11BD;CD72;110E 116C 11BD; # (쵲; 쵲; 쵲; 쵲; 쵲; ) HANGUL SYLLABLE COEJ +CD73;CD73;110E 116C 11BE;CD73;110E 116C 11BE; # (쵳; 쵳; 쵳; 쵳; 쵳; ) HANGUL SYLLABLE COEC +CD74;CD74;110E 116C 11BF;CD74;110E 116C 11BF; # (쵴; 쵴; 쵴; 쵴; 쵴; ) HANGUL SYLLABLE COEK +CD75;CD75;110E 116C 11C0;CD75;110E 116C 11C0; # (쵵; 쵵; 쵵; 쵵; 쵵; ) HANGUL SYLLABLE COET +CD76;CD76;110E 116C 11C1;CD76;110E 116C 11C1; # (쵶; 쵶; 쵶; 쵶; 쵶; ) HANGUL SYLLABLE COEP +CD77;CD77;110E 116C 11C2;CD77;110E 116C 11C2; # (쵷; 쵷; 쵷; 쵷; 쵷; ) HANGUL SYLLABLE COEH +CD78;CD78;110E 116D;CD78;110E 116D; # (쵸; 쵸; 쵸; 쵸; 쵸; ) HANGUL SYLLABLE CYO +CD79;CD79;110E 116D 11A8;CD79;110E 116D 11A8; # (쵹; 쵹; 쵹; 쵹; 쵹; ) HANGUL SYLLABLE CYOG +CD7A;CD7A;110E 116D 11A9;CD7A;110E 116D 11A9; # (쵺; 쵺; 쵺; 쵺; 쵺; ) HANGUL SYLLABLE CYOGG +CD7B;CD7B;110E 116D 11AA;CD7B;110E 116D 11AA; # (쵻; 쵻; 쵻; 쵻; 쵻; ) HANGUL SYLLABLE CYOGS +CD7C;CD7C;110E 116D 11AB;CD7C;110E 116D 11AB; # (쵼; 쵼; 쵼; 쵼; 쵼; ) HANGUL SYLLABLE CYON +CD7D;CD7D;110E 116D 11AC;CD7D;110E 116D 11AC; # (쵽; 쵽; 쵽; 쵽; 쵽; ) HANGUL SYLLABLE CYONJ +CD7E;CD7E;110E 116D 11AD;CD7E;110E 116D 11AD; # (쵾; 쵾; 쵾; 쵾; 쵾; ) HANGUL SYLLABLE CYONH +CD7F;CD7F;110E 116D 11AE;CD7F;110E 116D 11AE; # (쵿; 쵿; 쵿; 쵿; 쵿; ) HANGUL SYLLABLE CYOD +CD80;CD80;110E 116D 11AF;CD80;110E 116D 11AF; # (춀; 춀; 춀; 춀; 춀; ) HANGUL SYLLABLE CYOL +CD81;CD81;110E 116D 11B0;CD81;110E 116D 11B0; # (춁; 춁; 춁; 춁; 춁; ) HANGUL SYLLABLE CYOLG +CD82;CD82;110E 116D 11B1;CD82;110E 116D 11B1; # (춂; 춂; 춂; 춂; 춂; ) HANGUL SYLLABLE CYOLM +CD83;CD83;110E 116D 11B2;CD83;110E 116D 11B2; # (춃; 춃; 춃; 춃; 춃; ) HANGUL SYLLABLE CYOLB +CD84;CD84;110E 116D 11B3;CD84;110E 116D 11B3; # (춄; 춄; 춄; 춄; 춄; ) HANGUL SYLLABLE CYOLS +CD85;CD85;110E 116D 11B4;CD85;110E 116D 11B4; # (춅; 춅; 춅; 춅; 춅; ) HANGUL SYLLABLE CYOLT +CD86;CD86;110E 116D 11B5;CD86;110E 116D 11B5; # (춆; 춆; 춆; 춆; 춆; ) HANGUL SYLLABLE CYOLP +CD87;CD87;110E 116D 11B6;CD87;110E 116D 11B6; # (춇; 춇; 춇; 춇; 춇; ) HANGUL SYLLABLE CYOLH +CD88;CD88;110E 116D 11B7;CD88;110E 116D 11B7; # (춈; 춈; 춈; 춈; 춈; ) HANGUL SYLLABLE CYOM +CD89;CD89;110E 116D 11B8;CD89;110E 116D 11B8; # (춉; 춉; 춉; 춉; 춉; ) HANGUL SYLLABLE CYOB +CD8A;CD8A;110E 116D 11B9;CD8A;110E 116D 11B9; # (춊; 춊; 춊; 춊; 춊; ) HANGUL SYLLABLE CYOBS +CD8B;CD8B;110E 116D 11BA;CD8B;110E 116D 11BA; # (춋; 춋; 춋; 춋; 춋; ) HANGUL SYLLABLE CYOS +CD8C;CD8C;110E 116D 11BB;CD8C;110E 116D 11BB; # (춌; 춌; 춌; 춌; 춌; ) HANGUL SYLLABLE CYOSS +CD8D;CD8D;110E 116D 11BC;CD8D;110E 116D 11BC; # (춍; 춍; 춍; 춍; 춍; ) HANGUL SYLLABLE CYONG +CD8E;CD8E;110E 116D 11BD;CD8E;110E 116D 11BD; # (춎; 춎; 춎; 춎; 춎; ) HANGUL SYLLABLE CYOJ +CD8F;CD8F;110E 116D 11BE;CD8F;110E 116D 11BE; # (춏; 춏; 춏; 춏; 춏; ) HANGUL SYLLABLE CYOC +CD90;CD90;110E 116D 11BF;CD90;110E 116D 11BF; # (춐; 춐; 춐; 춐; 춐; ) HANGUL SYLLABLE CYOK +CD91;CD91;110E 116D 11C0;CD91;110E 116D 11C0; # (춑; 춑; 춑; 춑; 춑; ) HANGUL SYLLABLE CYOT +CD92;CD92;110E 116D 11C1;CD92;110E 116D 11C1; # (춒; 춒; 춒; 춒; 춒; ) HANGUL SYLLABLE CYOP +CD93;CD93;110E 116D 11C2;CD93;110E 116D 11C2; # (춓; 춓; 춓; 춓; 춓; ) HANGUL SYLLABLE CYOH +CD94;CD94;110E 116E;CD94;110E 116E; # (추; 추; 추; 추; 추; ) HANGUL SYLLABLE CU +CD95;CD95;110E 116E 11A8;CD95;110E 116E 11A8; # (축; 축; 축; 축; 축; ) HANGUL SYLLABLE CUG +CD96;CD96;110E 116E 11A9;CD96;110E 116E 11A9; # (춖; 춖; 춖; 춖; 춖; ) HANGUL SYLLABLE CUGG +CD97;CD97;110E 116E 11AA;CD97;110E 116E 11AA; # (춗; 춗; 춗; 춗; 춗; ) HANGUL SYLLABLE CUGS +CD98;CD98;110E 116E 11AB;CD98;110E 116E 11AB; # (춘; 춘; 춘; 춘; 춘; ) HANGUL SYLLABLE CUN +CD99;CD99;110E 116E 11AC;CD99;110E 116E 11AC; # (춙; 춙; 춙; 춙; 춙; ) HANGUL SYLLABLE CUNJ +CD9A;CD9A;110E 116E 11AD;CD9A;110E 116E 11AD; # (춚; 춚; 춚; 춚; 춚; ) HANGUL SYLLABLE CUNH +CD9B;CD9B;110E 116E 11AE;CD9B;110E 116E 11AE; # (춛; 춛; 춛; 춛; 춛; ) HANGUL SYLLABLE CUD +CD9C;CD9C;110E 116E 11AF;CD9C;110E 116E 11AF; # (출; 출; 출; 출; 출; ) HANGUL SYLLABLE CUL +CD9D;CD9D;110E 116E 11B0;CD9D;110E 116E 11B0; # (춝; 춝; 춝; 춝; 춝; ) HANGUL SYLLABLE CULG +CD9E;CD9E;110E 116E 11B1;CD9E;110E 116E 11B1; # (춞; 춞; 춞; 춞; 춞; ) HANGUL SYLLABLE CULM +CD9F;CD9F;110E 116E 11B2;CD9F;110E 116E 11B2; # (춟; 춟; 춟; 춟; 춟; ) HANGUL SYLLABLE CULB +CDA0;CDA0;110E 116E 11B3;CDA0;110E 116E 11B3; # (춠; 춠; 춠; 춠; 춠; ) HANGUL SYLLABLE CULS +CDA1;CDA1;110E 116E 11B4;CDA1;110E 116E 11B4; # (춡; 춡; 춡; 춡; 춡; ) HANGUL SYLLABLE CULT +CDA2;CDA2;110E 116E 11B5;CDA2;110E 116E 11B5; # (춢; 춢; 춢; 춢; 춢; ) HANGUL SYLLABLE CULP +CDA3;CDA3;110E 116E 11B6;CDA3;110E 116E 11B6; # (춣; 춣; 춣; 춣; 춣; ) HANGUL SYLLABLE CULH +CDA4;CDA4;110E 116E 11B7;CDA4;110E 116E 11B7; # (춤; 춤; 춤; 춤; 춤; ) HANGUL SYLLABLE CUM +CDA5;CDA5;110E 116E 11B8;CDA5;110E 116E 11B8; # (춥; 춥; 춥; 춥; 춥; ) HANGUL SYLLABLE CUB +CDA6;CDA6;110E 116E 11B9;CDA6;110E 116E 11B9; # (춦; 춦; 춦; 춦; 춦; ) HANGUL SYLLABLE CUBS +CDA7;CDA7;110E 116E 11BA;CDA7;110E 116E 11BA; # (춧; 춧; 춧; 춧; 춧; ) HANGUL SYLLABLE CUS +CDA8;CDA8;110E 116E 11BB;CDA8;110E 116E 11BB; # (춨; 춨; 춨; 춨; 춨; ) HANGUL SYLLABLE CUSS +CDA9;CDA9;110E 116E 11BC;CDA9;110E 116E 11BC; # (충; 충; 충; 충; 충; ) HANGUL SYLLABLE CUNG +CDAA;CDAA;110E 116E 11BD;CDAA;110E 116E 11BD; # (춪; 춪; 춪; 춪; 춪; ) HANGUL SYLLABLE CUJ +CDAB;CDAB;110E 116E 11BE;CDAB;110E 116E 11BE; # (춫; 춫; 춫; 춫; 춫; ) HANGUL SYLLABLE CUC +CDAC;CDAC;110E 116E 11BF;CDAC;110E 116E 11BF; # (춬; 춬; 춬; 춬; 춬; ) HANGUL SYLLABLE CUK +CDAD;CDAD;110E 116E 11C0;CDAD;110E 116E 11C0; # (춭; 춭; 춭; 춭; 춭; ) HANGUL SYLLABLE CUT +CDAE;CDAE;110E 116E 11C1;CDAE;110E 116E 11C1; # (춮; 춮; 춮; 춮; 춮; ) HANGUL SYLLABLE CUP +CDAF;CDAF;110E 116E 11C2;CDAF;110E 116E 11C2; # (춯; 춯; 춯; 춯; 춯; ) HANGUL SYLLABLE CUH +CDB0;CDB0;110E 116F;CDB0;110E 116F; # (춰; 춰; 춰; 춰; 춰; ) HANGUL SYLLABLE CWEO +CDB1;CDB1;110E 116F 11A8;CDB1;110E 116F 11A8; # (춱; 춱; 춱; 춱; 춱; ) HANGUL SYLLABLE CWEOG +CDB2;CDB2;110E 116F 11A9;CDB2;110E 116F 11A9; # (춲; 춲; 춲; 춲; 춲; ) HANGUL SYLLABLE CWEOGG +CDB3;CDB3;110E 116F 11AA;CDB3;110E 116F 11AA; # (춳; 춳; 춳; 춳; 춳; ) HANGUL SYLLABLE CWEOGS +CDB4;CDB4;110E 116F 11AB;CDB4;110E 116F 11AB; # (춴; 춴; 춴; 춴; 춴; ) HANGUL SYLLABLE CWEON +CDB5;CDB5;110E 116F 11AC;CDB5;110E 116F 11AC; # (춵; 춵; 춵; 춵; 춵; ) HANGUL SYLLABLE CWEONJ +CDB6;CDB6;110E 116F 11AD;CDB6;110E 116F 11AD; # (춶; 춶; 춶; 춶; 춶; ) HANGUL SYLLABLE CWEONH +CDB7;CDB7;110E 116F 11AE;CDB7;110E 116F 11AE; # (춷; 춷; 춷; 춷; 춷; ) HANGUL SYLLABLE CWEOD +CDB8;CDB8;110E 116F 11AF;CDB8;110E 116F 11AF; # (춸; 춸; 춸; 춸; 춸; ) HANGUL SYLLABLE CWEOL +CDB9;CDB9;110E 116F 11B0;CDB9;110E 116F 11B0; # (춹; 춹; 춹; 춹; 춹; ) HANGUL SYLLABLE CWEOLG +CDBA;CDBA;110E 116F 11B1;CDBA;110E 116F 11B1; # (춺; 춺; 춺; 춺; 춺; ) HANGUL SYLLABLE CWEOLM +CDBB;CDBB;110E 116F 11B2;CDBB;110E 116F 11B2; # (춻; 춻; 춻; 춻; 춻; ) HANGUL SYLLABLE CWEOLB +CDBC;CDBC;110E 116F 11B3;CDBC;110E 116F 11B3; # (춼; 춼; 춼; 춼; 춼; ) HANGUL SYLLABLE CWEOLS +CDBD;CDBD;110E 116F 11B4;CDBD;110E 116F 11B4; # (춽; 춽; 춽; 춽; 춽; ) HANGUL SYLLABLE CWEOLT +CDBE;CDBE;110E 116F 11B5;CDBE;110E 116F 11B5; # (춾; 춾; 춾; 춾; 춾; ) HANGUL SYLLABLE CWEOLP +CDBF;CDBF;110E 116F 11B6;CDBF;110E 116F 11B6; # (춿; 춿; 춿; 춿; 춿; ) HANGUL SYLLABLE CWEOLH +CDC0;CDC0;110E 116F 11B7;CDC0;110E 116F 11B7; # (췀; 췀; 췀; 췀; 췀; ) HANGUL SYLLABLE CWEOM +CDC1;CDC1;110E 116F 11B8;CDC1;110E 116F 11B8; # (췁; 췁; 췁; 췁; 췁; ) HANGUL SYLLABLE CWEOB +CDC2;CDC2;110E 116F 11B9;CDC2;110E 116F 11B9; # (췂; 췂; 췂; 췂; 췂; ) HANGUL SYLLABLE CWEOBS +CDC3;CDC3;110E 116F 11BA;CDC3;110E 116F 11BA; # (췃; 췃; 췃; 췃; 췃; ) HANGUL SYLLABLE CWEOS +CDC4;CDC4;110E 116F 11BB;CDC4;110E 116F 11BB; # (췄; 췄; 췄; 췄; 췄; ) HANGUL SYLLABLE CWEOSS +CDC5;CDC5;110E 116F 11BC;CDC5;110E 116F 11BC; # (췅; 췅; 췅; 췅; 췅; ) HANGUL SYLLABLE CWEONG +CDC6;CDC6;110E 116F 11BD;CDC6;110E 116F 11BD; # (췆; 췆; 췆; 췆; 췆; ) HANGUL SYLLABLE CWEOJ +CDC7;CDC7;110E 116F 11BE;CDC7;110E 116F 11BE; # (췇; 췇; 췇; 췇; 췇; ) HANGUL SYLLABLE CWEOC +CDC8;CDC8;110E 116F 11BF;CDC8;110E 116F 11BF; # (췈; 췈; 췈; 췈; 췈; ) HANGUL SYLLABLE CWEOK +CDC9;CDC9;110E 116F 11C0;CDC9;110E 116F 11C0; # (췉; 췉; 췉; 췉; 췉; ) HANGUL SYLLABLE CWEOT +CDCA;CDCA;110E 116F 11C1;CDCA;110E 116F 11C1; # (췊; 췊; 췊; 췊; 췊; ) HANGUL SYLLABLE CWEOP +CDCB;CDCB;110E 116F 11C2;CDCB;110E 116F 11C2; # (췋; 췋; 췋; 췋; 췋; ) HANGUL SYLLABLE CWEOH +CDCC;CDCC;110E 1170;CDCC;110E 1170; # (췌; 췌; 췌; 췌; 췌; ) HANGUL SYLLABLE CWE +CDCD;CDCD;110E 1170 11A8;CDCD;110E 1170 11A8; # (췍; 췍; 췍; 췍; 췍; ) HANGUL SYLLABLE CWEG +CDCE;CDCE;110E 1170 11A9;CDCE;110E 1170 11A9; # (췎; 췎; 췎; 췎; 췎; ) HANGUL SYLLABLE CWEGG +CDCF;CDCF;110E 1170 11AA;CDCF;110E 1170 11AA; # (췏; 췏; 췏; 췏; 췏; ) HANGUL SYLLABLE CWEGS +CDD0;CDD0;110E 1170 11AB;CDD0;110E 1170 11AB; # (췐; 췐; 췐; 췐; 췐; ) HANGUL SYLLABLE CWEN +CDD1;CDD1;110E 1170 11AC;CDD1;110E 1170 11AC; # (췑; 췑; 췑; 췑; 췑; ) HANGUL SYLLABLE CWENJ +CDD2;CDD2;110E 1170 11AD;CDD2;110E 1170 11AD; # (췒; 췒; 췒; 췒; 췒; ) HANGUL SYLLABLE CWENH +CDD3;CDD3;110E 1170 11AE;CDD3;110E 1170 11AE; # (췓; 췓; 췓; 췓; 췓; ) HANGUL SYLLABLE CWED +CDD4;CDD4;110E 1170 11AF;CDD4;110E 1170 11AF; # (췔; 췔; 췔; 췔; 췔; ) HANGUL SYLLABLE CWEL +CDD5;CDD5;110E 1170 11B0;CDD5;110E 1170 11B0; # (췕; 췕; 췕; 췕; 췕; ) HANGUL SYLLABLE CWELG +CDD6;CDD6;110E 1170 11B1;CDD6;110E 1170 11B1; # (췖; 췖; 췖; 췖; 췖; ) HANGUL SYLLABLE CWELM +CDD7;CDD7;110E 1170 11B2;CDD7;110E 1170 11B2; # (췗; 췗; 췗; 췗; 췗; ) HANGUL SYLLABLE CWELB +CDD8;CDD8;110E 1170 11B3;CDD8;110E 1170 11B3; # (췘; 췘; 췘; 췘; 췘; ) HANGUL SYLLABLE CWELS +CDD9;CDD9;110E 1170 11B4;CDD9;110E 1170 11B4; # (췙; 췙; 췙; 췙; 췙; ) HANGUL SYLLABLE CWELT +CDDA;CDDA;110E 1170 11B5;CDDA;110E 1170 11B5; # (췚; 췚; 췚; 췚; 췚; ) HANGUL SYLLABLE CWELP +CDDB;CDDB;110E 1170 11B6;CDDB;110E 1170 11B6; # (췛; 췛; 췛; 췛; 췛; ) HANGUL SYLLABLE CWELH +CDDC;CDDC;110E 1170 11B7;CDDC;110E 1170 11B7; # (췜; 췜; 췜; 췜; 췜; ) HANGUL SYLLABLE CWEM +CDDD;CDDD;110E 1170 11B8;CDDD;110E 1170 11B8; # (췝; 췝; 췝; 췝; 췝; ) HANGUL SYLLABLE CWEB +CDDE;CDDE;110E 1170 11B9;CDDE;110E 1170 11B9; # (췞; 췞; 췞; 췞; 췞; ) HANGUL SYLLABLE CWEBS +CDDF;CDDF;110E 1170 11BA;CDDF;110E 1170 11BA; # (췟; 췟; 췟; 췟; 췟; ) HANGUL SYLLABLE CWES +CDE0;CDE0;110E 1170 11BB;CDE0;110E 1170 11BB; # (췠; 췠; 췠; 췠; 췠; ) HANGUL SYLLABLE CWESS +CDE1;CDE1;110E 1170 11BC;CDE1;110E 1170 11BC; # (췡; 췡; 췡; 췡; 췡; ) HANGUL SYLLABLE CWENG +CDE2;CDE2;110E 1170 11BD;CDE2;110E 1170 11BD; # (췢; 췢; 췢; 췢; 췢; ) HANGUL SYLLABLE CWEJ +CDE3;CDE3;110E 1170 11BE;CDE3;110E 1170 11BE; # (췣; 췣; 췣; 췣; 췣; ) HANGUL SYLLABLE CWEC +CDE4;CDE4;110E 1170 11BF;CDE4;110E 1170 11BF; # (췤; 췤; 췤; 췤; 췤; ) HANGUL SYLLABLE CWEK +CDE5;CDE5;110E 1170 11C0;CDE5;110E 1170 11C0; # (췥; 췥; 췥; 췥; 췥; ) HANGUL SYLLABLE CWET +CDE6;CDE6;110E 1170 11C1;CDE6;110E 1170 11C1; # (췦; 췦; 췦; 췦; 췦; ) HANGUL SYLLABLE CWEP +CDE7;CDE7;110E 1170 11C2;CDE7;110E 1170 11C2; # (췧; 췧; 췧; 췧; 췧; ) HANGUL SYLLABLE CWEH +CDE8;CDE8;110E 1171;CDE8;110E 1171; # (취; 취; 취; 취; 취; ) HANGUL SYLLABLE CWI +CDE9;CDE9;110E 1171 11A8;CDE9;110E 1171 11A8; # (췩; 췩; 췩; 췩; 췩; ) HANGUL SYLLABLE CWIG +CDEA;CDEA;110E 1171 11A9;CDEA;110E 1171 11A9; # (췪; 췪; 췪; 췪; 췪; ) HANGUL SYLLABLE CWIGG +CDEB;CDEB;110E 1171 11AA;CDEB;110E 1171 11AA; # (췫; 췫; 췫; 췫; 췫; ) HANGUL SYLLABLE CWIGS +CDEC;CDEC;110E 1171 11AB;CDEC;110E 1171 11AB; # (췬; 췬; 췬; 췬; 췬; ) HANGUL SYLLABLE CWIN +CDED;CDED;110E 1171 11AC;CDED;110E 1171 11AC; # (췭; 췭; 췭; 췭; 췭; ) HANGUL SYLLABLE CWINJ +CDEE;CDEE;110E 1171 11AD;CDEE;110E 1171 11AD; # (췮; 췮; 췮; 췮; 췮; ) HANGUL SYLLABLE CWINH +CDEF;CDEF;110E 1171 11AE;CDEF;110E 1171 11AE; # (췯; 췯; 췯; 췯; 췯; ) HANGUL SYLLABLE CWID +CDF0;CDF0;110E 1171 11AF;CDF0;110E 1171 11AF; # (췰; 췰; 췰; 췰; 췰; ) HANGUL SYLLABLE CWIL +CDF1;CDF1;110E 1171 11B0;CDF1;110E 1171 11B0; # (췱; 췱; 췱; 췱; 췱; ) HANGUL SYLLABLE CWILG +CDF2;CDF2;110E 1171 11B1;CDF2;110E 1171 11B1; # (췲; 췲; 췲; 췲; 췲; ) HANGUL SYLLABLE CWILM +CDF3;CDF3;110E 1171 11B2;CDF3;110E 1171 11B2; # (췳; 췳; 췳; 췳; 췳; ) HANGUL SYLLABLE CWILB +CDF4;CDF4;110E 1171 11B3;CDF4;110E 1171 11B3; # (췴; 췴; 췴; 췴; 췴; ) HANGUL SYLLABLE CWILS +CDF5;CDF5;110E 1171 11B4;CDF5;110E 1171 11B4; # (췵; 췵; 췵; 췵; 췵; ) HANGUL SYLLABLE CWILT +CDF6;CDF6;110E 1171 11B5;CDF6;110E 1171 11B5; # (췶; 췶; 췶; 췶; 췶; ) HANGUL SYLLABLE CWILP +CDF7;CDF7;110E 1171 11B6;CDF7;110E 1171 11B6; # (췷; 췷; 췷; 췷; 췷; ) HANGUL SYLLABLE CWILH +CDF8;CDF8;110E 1171 11B7;CDF8;110E 1171 11B7; # (췸; 췸; 췸; 췸; 췸; ) HANGUL SYLLABLE CWIM +CDF9;CDF9;110E 1171 11B8;CDF9;110E 1171 11B8; # (췹; 췹; 췹; 췹; 췹; ) HANGUL SYLLABLE CWIB +CDFA;CDFA;110E 1171 11B9;CDFA;110E 1171 11B9; # (췺; 췺; 췺; 췺; 췺; ) HANGUL SYLLABLE CWIBS +CDFB;CDFB;110E 1171 11BA;CDFB;110E 1171 11BA; # (췻; 췻; 췻; 췻; 췻; ) HANGUL SYLLABLE CWIS +CDFC;CDFC;110E 1171 11BB;CDFC;110E 1171 11BB; # (췼; 췼; 췼; 췼; 췼; ) HANGUL SYLLABLE CWISS +CDFD;CDFD;110E 1171 11BC;CDFD;110E 1171 11BC; # (췽; 췽; 췽; 췽; 췽; ) HANGUL SYLLABLE CWING +CDFE;CDFE;110E 1171 11BD;CDFE;110E 1171 11BD; # (췾; 췾; 췾; 췾; 췾; ) HANGUL SYLLABLE CWIJ +CDFF;CDFF;110E 1171 11BE;CDFF;110E 1171 11BE; # (췿; 췿; 췿; 췿; 췿; ) HANGUL SYLLABLE CWIC +CE00;CE00;110E 1171 11BF;CE00;110E 1171 11BF; # (츀; 츀; 츀; 츀; 츀; ) HANGUL SYLLABLE CWIK +CE01;CE01;110E 1171 11C0;CE01;110E 1171 11C0; # (츁; 츁; 츁; 츁; 츁; ) HANGUL SYLLABLE CWIT +CE02;CE02;110E 1171 11C1;CE02;110E 1171 11C1; # (츂; 츂; 츂; 츂; 츂; ) HANGUL SYLLABLE CWIP +CE03;CE03;110E 1171 11C2;CE03;110E 1171 11C2; # (츃; 츃; 츃; 츃; 츃; ) HANGUL SYLLABLE CWIH +CE04;CE04;110E 1172;CE04;110E 1172; # (츄; 츄; 츄; 츄; 츄; ) HANGUL SYLLABLE CYU +CE05;CE05;110E 1172 11A8;CE05;110E 1172 11A8; # (츅; 츅; 츅; 츅; 츅; ) HANGUL SYLLABLE CYUG +CE06;CE06;110E 1172 11A9;CE06;110E 1172 11A9; # (츆; 츆; 츆; 츆; 츆; ) HANGUL SYLLABLE CYUGG +CE07;CE07;110E 1172 11AA;CE07;110E 1172 11AA; # (츇; 츇; 츇; 츇; 츇; ) HANGUL SYLLABLE CYUGS +CE08;CE08;110E 1172 11AB;CE08;110E 1172 11AB; # (츈; 츈; 츈; 츈; 츈; ) HANGUL SYLLABLE CYUN +CE09;CE09;110E 1172 11AC;CE09;110E 1172 11AC; # (츉; 츉; 츉; 츉; 츉; ) HANGUL SYLLABLE CYUNJ +CE0A;CE0A;110E 1172 11AD;CE0A;110E 1172 11AD; # (츊; 츊; 츊; 츊; 츊; ) HANGUL SYLLABLE CYUNH +CE0B;CE0B;110E 1172 11AE;CE0B;110E 1172 11AE; # (츋; 츋; 츋; 츋; 츋; ) HANGUL SYLLABLE CYUD +CE0C;CE0C;110E 1172 11AF;CE0C;110E 1172 11AF; # (츌; 츌; 츌; 츌; 츌; ) HANGUL SYLLABLE CYUL +CE0D;CE0D;110E 1172 11B0;CE0D;110E 1172 11B0; # (츍; 츍; 츍; 츍; 츍; ) HANGUL SYLLABLE CYULG +CE0E;CE0E;110E 1172 11B1;CE0E;110E 1172 11B1; # (츎; 츎; 츎; 츎; 츎; ) HANGUL SYLLABLE CYULM +CE0F;CE0F;110E 1172 11B2;CE0F;110E 1172 11B2; # (츏; 츏; 츏; 츏; 츏; ) HANGUL SYLLABLE CYULB +CE10;CE10;110E 1172 11B3;CE10;110E 1172 11B3; # (츐; 츐; 츐; 츐; 츐; ) HANGUL SYLLABLE CYULS +CE11;CE11;110E 1172 11B4;CE11;110E 1172 11B4; # (츑; 츑; 츑; 츑; 츑; ) HANGUL SYLLABLE CYULT +CE12;CE12;110E 1172 11B5;CE12;110E 1172 11B5; # (츒; 츒; 츒; 츒; 츒; ) HANGUL SYLLABLE CYULP +CE13;CE13;110E 1172 11B6;CE13;110E 1172 11B6; # (츓; 츓; 츓; 츓; 츓; ) HANGUL SYLLABLE CYULH +CE14;CE14;110E 1172 11B7;CE14;110E 1172 11B7; # (츔; 츔; 츔; 츔; 츔; ) HANGUL SYLLABLE CYUM +CE15;CE15;110E 1172 11B8;CE15;110E 1172 11B8; # (츕; 츕; 츕; 츕; 츕; ) HANGUL SYLLABLE CYUB +CE16;CE16;110E 1172 11B9;CE16;110E 1172 11B9; # (츖; 츖; 츖; 츖; 츖; ) HANGUL SYLLABLE CYUBS +CE17;CE17;110E 1172 11BA;CE17;110E 1172 11BA; # (츗; 츗; 츗; 츗; 츗; ) HANGUL SYLLABLE CYUS +CE18;CE18;110E 1172 11BB;CE18;110E 1172 11BB; # (츘; 츘; 츘; 츘; 츘; ) HANGUL SYLLABLE CYUSS +CE19;CE19;110E 1172 11BC;CE19;110E 1172 11BC; # (츙; 츙; 츙; 츙; 츙; ) HANGUL SYLLABLE CYUNG +CE1A;CE1A;110E 1172 11BD;CE1A;110E 1172 11BD; # (츚; 츚; 츚; 츚; 츚; ) HANGUL SYLLABLE CYUJ +CE1B;CE1B;110E 1172 11BE;CE1B;110E 1172 11BE; # (츛; 츛; 츛; 츛; 츛; ) HANGUL SYLLABLE CYUC +CE1C;CE1C;110E 1172 11BF;CE1C;110E 1172 11BF; # (츜; 츜; 츜; 츜; 츜; ) HANGUL SYLLABLE CYUK +CE1D;CE1D;110E 1172 11C0;CE1D;110E 1172 11C0; # (츝; 츝; 츝; 츝; 츝; ) HANGUL SYLLABLE CYUT +CE1E;CE1E;110E 1172 11C1;CE1E;110E 1172 11C1; # (츞; 츞; 츞; 츞; 츞; ) HANGUL SYLLABLE CYUP +CE1F;CE1F;110E 1172 11C2;CE1F;110E 1172 11C2; # (츟; 츟; 츟; 츟; 츟; ) HANGUL SYLLABLE CYUH +CE20;CE20;110E 1173;CE20;110E 1173; # (츠; 츠; 츠; 츠; 츠; ) HANGUL SYLLABLE CEU +CE21;CE21;110E 1173 11A8;CE21;110E 1173 11A8; # (측; 측; 측; 측; 측; ) HANGUL SYLLABLE CEUG +CE22;CE22;110E 1173 11A9;CE22;110E 1173 11A9; # (츢; 츢; 츢; 츢; 츢; ) HANGUL SYLLABLE CEUGG +CE23;CE23;110E 1173 11AA;CE23;110E 1173 11AA; # (츣; 츣; 츣; 츣; 츣; ) HANGUL SYLLABLE CEUGS +CE24;CE24;110E 1173 11AB;CE24;110E 1173 11AB; # (츤; 츤; 츤; 츤; 츤; ) HANGUL SYLLABLE CEUN +CE25;CE25;110E 1173 11AC;CE25;110E 1173 11AC; # (츥; 츥; 츥; 츥; 츥; ) HANGUL SYLLABLE CEUNJ +CE26;CE26;110E 1173 11AD;CE26;110E 1173 11AD; # (츦; 츦; 츦; 츦; 츦; ) HANGUL SYLLABLE CEUNH +CE27;CE27;110E 1173 11AE;CE27;110E 1173 11AE; # (츧; 츧; 츧; 츧; 츧; ) HANGUL SYLLABLE CEUD +CE28;CE28;110E 1173 11AF;CE28;110E 1173 11AF; # (츨; 츨; 츨; 츨; 츨; ) HANGUL SYLLABLE CEUL +CE29;CE29;110E 1173 11B0;CE29;110E 1173 11B0; # (츩; 츩; 츩; 츩; 츩; ) HANGUL SYLLABLE CEULG +CE2A;CE2A;110E 1173 11B1;CE2A;110E 1173 11B1; # (츪; 츪; 츪; 츪; 츪; ) HANGUL SYLLABLE CEULM +CE2B;CE2B;110E 1173 11B2;CE2B;110E 1173 11B2; # (츫; 츫; 츫; 츫; 츫; ) HANGUL SYLLABLE CEULB +CE2C;CE2C;110E 1173 11B3;CE2C;110E 1173 11B3; # (츬; 츬; 츬; 츬; 츬; ) HANGUL SYLLABLE CEULS +CE2D;CE2D;110E 1173 11B4;CE2D;110E 1173 11B4; # (츭; 츭; 츭; 츭; 츭; ) HANGUL SYLLABLE CEULT +CE2E;CE2E;110E 1173 11B5;CE2E;110E 1173 11B5; # (츮; 츮; 츮; 츮; 츮; ) HANGUL SYLLABLE CEULP +CE2F;CE2F;110E 1173 11B6;CE2F;110E 1173 11B6; # (츯; 츯; 츯; 츯; 츯; ) HANGUL SYLLABLE CEULH +CE30;CE30;110E 1173 11B7;CE30;110E 1173 11B7; # (츰; 츰; 츰; 츰; 츰; ) HANGUL SYLLABLE CEUM +CE31;CE31;110E 1173 11B8;CE31;110E 1173 11B8; # (츱; 츱; 츱; 츱; 츱; ) HANGUL SYLLABLE CEUB +CE32;CE32;110E 1173 11B9;CE32;110E 1173 11B9; # (츲; 츲; 츲; 츲; 츲; ) HANGUL SYLLABLE CEUBS +CE33;CE33;110E 1173 11BA;CE33;110E 1173 11BA; # (츳; 츳; 츳; 츳; 츳; ) HANGUL SYLLABLE CEUS +CE34;CE34;110E 1173 11BB;CE34;110E 1173 11BB; # (츴; 츴; 츴; 츴; 츴; ) HANGUL SYLLABLE CEUSS +CE35;CE35;110E 1173 11BC;CE35;110E 1173 11BC; # (층; 층; 층; 층; 층; ) HANGUL SYLLABLE CEUNG +CE36;CE36;110E 1173 11BD;CE36;110E 1173 11BD; # (츶; 츶; 츶; 츶; 츶; ) HANGUL SYLLABLE CEUJ +CE37;CE37;110E 1173 11BE;CE37;110E 1173 11BE; # (츷; 츷; 츷; 츷; 츷; ) HANGUL SYLLABLE CEUC +CE38;CE38;110E 1173 11BF;CE38;110E 1173 11BF; # (츸; 츸; 츸; 츸; 츸; ) HANGUL SYLLABLE CEUK +CE39;CE39;110E 1173 11C0;CE39;110E 1173 11C0; # (츹; 츹; 츹; 츹; 츹; ) HANGUL SYLLABLE CEUT +CE3A;CE3A;110E 1173 11C1;CE3A;110E 1173 11C1; # (츺; 츺; 츺; 츺; 츺; ) HANGUL SYLLABLE CEUP +CE3B;CE3B;110E 1173 11C2;CE3B;110E 1173 11C2; # (츻; 츻; 츻; 츻; 츻; ) HANGUL SYLLABLE CEUH +CE3C;CE3C;110E 1174;CE3C;110E 1174; # (츼; 츼; 츼; 츼; 츼; ) HANGUL SYLLABLE CYI +CE3D;CE3D;110E 1174 11A8;CE3D;110E 1174 11A8; # (츽; 츽; 츽; 츽; 츽; ) HANGUL SYLLABLE CYIG +CE3E;CE3E;110E 1174 11A9;CE3E;110E 1174 11A9; # (츾; 츾; 츾; 츾; 츾; ) HANGUL SYLLABLE CYIGG +CE3F;CE3F;110E 1174 11AA;CE3F;110E 1174 11AA; # (츿; 츿; 츿; 츿; 츿; ) HANGUL SYLLABLE CYIGS +CE40;CE40;110E 1174 11AB;CE40;110E 1174 11AB; # (칀; 칀; 칀; 칀; 칀; ) HANGUL SYLLABLE CYIN +CE41;CE41;110E 1174 11AC;CE41;110E 1174 11AC; # (칁; 칁; 칁; 칁; 칁; ) HANGUL SYLLABLE CYINJ +CE42;CE42;110E 1174 11AD;CE42;110E 1174 11AD; # (칂; 칂; 칂; 칂; 칂; ) HANGUL SYLLABLE CYINH +CE43;CE43;110E 1174 11AE;CE43;110E 1174 11AE; # (칃; 칃; 칃; 칃; 칃; ) HANGUL SYLLABLE CYID +CE44;CE44;110E 1174 11AF;CE44;110E 1174 11AF; # (칄; 칄; 칄; 칄; 칄; ) HANGUL SYLLABLE CYIL +CE45;CE45;110E 1174 11B0;CE45;110E 1174 11B0; # (칅; 칅; 칅; 칅; 칅; ) HANGUL SYLLABLE CYILG +CE46;CE46;110E 1174 11B1;CE46;110E 1174 11B1; # (칆; 칆; 칆; 칆; 칆; ) HANGUL SYLLABLE CYILM +CE47;CE47;110E 1174 11B2;CE47;110E 1174 11B2; # (칇; 칇; 칇; 칇; 칇; ) HANGUL SYLLABLE CYILB +CE48;CE48;110E 1174 11B3;CE48;110E 1174 11B3; # (칈; 칈; 칈; 칈; 칈; ) HANGUL SYLLABLE CYILS +CE49;CE49;110E 1174 11B4;CE49;110E 1174 11B4; # (칉; 칉; 칉; 칉; 칉; ) HANGUL SYLLABLE CYILT +CE4A;CE4A;110E 1174 11B5;CE4A;110E 1174 11B5; # (칊; 칊; 칊; 칊; 칊; ) HANGUL SYLLABLE CYILP +CE4B;CE4B;110E 1174 11B6;CE4B;110E 1174 11B6; # (칋; 칋; 칋; 칋; 칋; ) HANGUL SYLLABLE CYILH +CE4C;CE4C;110E 1174 11B7;CE4C;110E 1174 11B7; # (칌; 칌; 칌; 칌; 칌; ) HANGUL SYLLABLE CYIM +CE4D;CE4D;110E 1174 11B8;CE4D;110E 1174 11B8; # (칍; 칍; 칍; 칍; 칍; ) HANGUL SYLLABLE CYIB +CE4E;CE4E;110E 1174 11B9;CE4E;110E 1174 11B9; # (칎; 칎; 칎; 칎; 칎; ) HANGUL SYLLABLE CYIBS +CE4F;CE4F;110E 1174 11BA;CE4F;110E 1174 11BA; # (칏; 칏; 칏; 칏; 칏; ) HANGUL SYLLABLE CYIS +CE50;CE50;110E 1174 11BB;CE50;110E 1174 11BB; # (칐; 칐; 칐; 칐; 칐; ) HANGUL SYLLABLE CYISS +CE51;CE51;110E 1174 11BC;CE51;110E 1174 11BC; # (칑; 칑; 칑; 칑; 칑; ) HANGUL SYLLABLE CYING +CE52;CE52;110E 1174 11BD;CE52;110E 1174 11BD; # (칒; 칒; 칒; 칒; 칒; ) HANGUL SYLLABLE CYIJ +CE53;CE53;110E 1174 11BE;CE53;110E 1174 11BE; # (칓; 칓; 칓; 칓; 칓; ) HANGUL SYLLABLE CYIC +CE54;CE54;110E 1174 11BF;CE54;110E 1174 11BF; # (칔; 칔; 칔; 칔; 칔; ) HANGUL SYLLABLE CYIK +CE55;CE55;110E 1174 11C0;CE55;110E 1174 11C0; # (칕; 칕; 칕; 칕; 칕; ) HANGUL SYLLABLE CYIT +CE56;CE56;110E 1174 11C1;CE56;110E 1174 11C1; # (칖; 칖; 칖; 칖; 칖; ) HANGUL SYLLABLE CYIP +CE57;CE57;110E 1174 11C2;CE57;110E 1174 11C2; # (칗; 칗; 칗; 칗; 칗; ) HANGUL SYLLABLE CYIH +CE58;CE58;110E 1175;CE58;110E 1175; # (치; 치; 치; 치; 치; ) HANGUL SYLLABLE CI +CE59;CE59;110E 1175 11A8;CE59;110E 1175 11A8; # (칙; 칙; 칙; 칙; 칙; ) HANGUL SYLLABLE CIG +CE5A;CE5A;110E 1175 11A9;CE5A;110E 1175 11A9; # (칚; 칚; 칚; 칚; 칚; ) HANGUL SYLLABLE CIGG +CE5B;CE5B;110E 1175 11AA;CE5B;110E 1175 11AA; # (칛; 칛; 칛; 칛; 칛; ) HANGUL SYLLABLE CIGS +CE5C;CE5C;110E 1175 11AB;CE5C;110E 1175 11AB; # (친; 친; 친; 친; 친; ) HANGUL SYLLABLE CIN +CE5D;CE5D;110E 1175 11AC;CE5D;110E 1175 11AC; # (칝; 칝; 칝; 칝; 칝; ) HANGUL SYLLABLE CINJ +CE5E;CE5E;110E 1175 11AD;CE5E;110E 1175 11AD; # (칞; 칞; 칞; 칞; 칞; ) HANGUL SYLLABLE CINH +CE5F;CE5F;110E 1175 11AE;CE5F;110E 1175 11AE; # (칟; 칟; 칟; 칟; 칟; ) HANGUL SYLLABLE CID +CE60;CE60;110E 1175 11AF;CE60;110E 1175 11AF; # (칠; 칠; 칠; 칠; 칠; ) HANGUL SYLLABLE CIL +CE61;CE61;110E 1175 11B0;CE61;110E 1175 11B0; # (칡; 칡; 칡; 칡; 칡; ) HANGUL SYLLABLE CILG +CE62;CE62;110E 1175 11B1;CE62;110E 1175 11B1; # (칢; 칢; 칢; 칢; 칢; ) HANGUL SYLLABLE CILM +CE63;CE63;110E 1175 11B2;CE63;110E 1175 11B2; # (칣; 칣; 칣; 칣; 칣; ) HANGUL SYLLABLE CILB +CE64;CE64;110E 1175 11B3;CE64;110E 1175 11B3; # (칤; 칤; 칤; 칤; 칤; ) HANGUL SYLLABLE CILS +CE65;CE65;110E 1175 11B4;CE65;110E 1175 11B4; # (칥; 칥; 칥; 칥; 칥; ) HANGUL SYLLABLE CILT +CE66;CE66;110E 1175 11B5;CE66;110E 1175 11B5; # (칦; 칦; 칦; 칦; 칦; ) HANGUL SYLLABLE CILP +CE67;CE67;110E 1175 11B6;CE67;110E 1175 11B6; # (칧; 칧; 칧; 칧; 칧; ) HANGUL SYLLABLE CILH +CE68;CE68;110E 1175 11B7;CE68;110E 1175 11B7; # (침; 침; 침; 침; 침; ) HANGUL SYLLABLE CIM +CE69;CE69;110E 1175 11B8;CE69;110E 1175 11B8; # (칩; 칩; 칩; 칩; 칩; ) HANGUL SYLLABLE CIB +CE6A;CE6A;110E 1175 11B9;CE6A;110E 1175 11B9; # (칪; 칪; 칪; 칪; 칪; ) HANGUL SYLLABLE CIBS +CE6B;CE6B;110E 1175 11BA;CE6B;110E 1175 11BA; # (칫; 칫; 칫; 칫; 칫; ) HANGUL SYLLABLE CIS +CE6C;CE6C;110E 1175 11BB;CE6C;110E 1175 11BB; # (칬; 칬; 칬; 칬; 칬; ) HANGUL SYLLABLE CISS +CE6D;CE6D;110E 1175 11BC;CE6D;110E 1175 11BC; # (칭; 칭; 칭; 칭; 칭; ) HANGUL SYLLABLE CING +CE6E;CE6E;110E 1175 11BD;CE6E;110E 1175 11BD; # (칮; 칮; 칮; 칮; 칮; ) HANGUL SYLLABLE CIJ +CE6F;CE6F;110E 1175 11BE;CE6F;110E 1175 11BE; # (칯; 칯; 칯; 칯; 칯; ) HANGUL SYLLABLE CIC +CE70;CE70;110E 1175 11BF;CE70;110E 1175 11BF; # (칰; 칰; 칰; 칰; 칰; ) HANGUL SYLLABLE CIK +CE71;CE71;110E 1175 11C0;CE71;110E 1175 11C0; # (칱; 칱; 칱; 칱; 칱; ) HANGUL SYLLABLE CIT +CE72;CE72;110E 1175 11C1;CE72;110E 1175 11C1; # (칲; 칲; 칲; 칲; 칲; ) HANGUL SYLLABLE CIP +CE73;CE73;110E 1175 11C2;CE73;110E 1175 11C2; # (칳; 칳; 칳; 칳; 칳; ) HANGUL SYLLABLE CIH +CE74;CE74;110F 1161;CE74;110F 1161; # (카; 카; 카; 카; 카; ) HANGUL SYLLABLE KA +CE75;CE75;110F 1161 11A8;CE75;110F 1161 11A8; # (칵; 칵; 칵; 칵; 칵; ) HANGUL SYLLABLE KAG +CE76;CE76;110F 1161 11A9;CE76;110F 1161 11A9; # (칶; 칶; 칶; 칶; 칶; ) HANGUL SYLLABLE KAGG +CE77;CE77;110F 1161 11AA;CE77;110F 1161 11AA; # (칷; 칷; 칷; 칷; 칷; ) HANGUL SYLLABLE KAGS +CE78;CE78;110F 1161 11AB;CE78;110F 1161 11AB; # (칸; 칸; 칸; 칸; 칸; ) HANGUL SYLLABLE KAN +CE79;CE79;110F 1161 11AC;CE79;110F 1161 11AC; # (칹; 칹; 칹; 칹; 칹; ) HANGUL SYLLABLE KANJ +CE7A;CE7A;110F 1161 11AD;CE7A;110F 1161 11AD; # (칺; 칺; 칺; 칺; 칺; ) HANGUL SYLLABLE KANH +CE7B;CE7B;110F 1161 11AE;CE7B;110F 1161 11AE; # (칻; 칻; 칻; 칻; 칻; ) HANGUL SYLLABLE KAD +CE7C;CE7C;110F 1161 11AF;CE7C;110F 1161 11AF; # (칼; 칼; 칼; 칼; 칼; ) HANGUL SYLLABLE KAL +CE7D;CE7D;110F 1161 11B0;CE7D;110F 1161 11B0; # (칽; 칽; 칽; 칽; 칽; ) HANGUL SYLLABLE KALG +CE7E;CE7E;110F 1161 11B1;CE7E;110F 1161 11B1; # (칾; 칾; 칾; 칾; 칾; ) HANGUL SYLLABLE KALM +CE7F;CE7F;110F 1161 11B2;CE7F;110F 1161 11B2; # (칿; 칿; 칿; 칿; 칿; ) HANGUL SYLLABLE KALB +CE80;CE80;110F 1161 11B3;CE80;110F 1161 11B3; # (캀; 캀; 캀; 캀; 캀; ) HANGUL SYLLABLE KALS +CE81;CE81;110F 1161 11B4;CE81;110F 1161 11B4; # (캁; 캁; 캁; 캁; 캁; ) HANGUL SYLLABLE KALT +CE82;CE82;110F 1161 11B5;CE82;110F 1161 11B5; # (캂; 캂; 캂; 캂; 캂; ) HANGUL SYLLABLE KALP +CE83;CE83;110F 1161 11B6;CE83;110F 1161 11B6; # (캃; 캃; 캃; 캃; 캃; ) HANGUL SYLLABLE KALH +CE84;CE84;110F 1161 11B7;CE84;110F 1161 11B7; # (캄; 캄; 캄; 캄; 캄; ) HANGUL SYLLABLE KAM +CE85;CE85;110F 1161 11B8;CE85;110F 1161 11B8; # (캅; 캅; 캅; 캅; 캅; ) HANGUL SYLLABLE KAB +CE86;CE86;110F 1161 11B9;CE86;110F 1161 11B9; # (캆; 캆; 캆; 캆; 캆; ) HANGUL SYLLABLE KABS +CE87;CE87;110F 1161 11BA;CE87;110F 1161 11BA; # (캇; 캇; 캇; 캇; 캇; ) HANGUL SYLLABLE KAS +CE88;CE88;110F 1161 11BB;CE88;110F 1161 11BB; # (캈; 캈; 캈; 캈; 캈; ) HANGUL SYLLABLE KASS +CE89;CE89;110F 1161 11BC;CE89;110F 1161 11BC; # (캉; 캉; 캉; 캉; 캉; ) HANGUL SYLLABLE KANG +CE8A;CE8A;110F 1161 11BD;CE8A;110F 1161 11BD; # (캊; 캊; 캊; 캊; 캊; ) HANGUL SYLLABLE KAJ +CE8B;CE8B;110F 1161 11BE;CE8B;110F 1161 11BE; # (캋; 캋; 캋; 캋; 캋; ) HANGUL SYLLABLE KAC +CE8C;CE8C;110F 1161 11BF;CE8C;110F 1161 11BF; # (캌; 캌; 캌; 캌; 캌; ) HANGUL SYLLABLE KAK +CE8D;CE8D;110F 1161 11C0;CE8D;110F 1161 11C0; # (캍; 캍; 캍; 캍; 캍; ) HANGUL SYLLABLE KAT +CE8E;CE8E;110F 1161 11C1;CE8E;110F 1161 11C1; # (캎; 캎; 캎; 캎; 캎; ) HANGUL SYLLABLE KAP +CE8F;CE8F;110F 1161 11C2;CE8F;110F 1161 11C2; # (캏; 캏; 캏; 캏; 캏; ) HANGUL SYLLABLE KAH +CE90;CE90;110F 1162;CE90;110F 1162; # (캐; 캐; 캐; 캐; 캐; ) HANGUL SYLLABLE KAE +CE91;CE91;110F 1162 11A8;CE91;110F 1162 11A8; # (캑; 캑; 캑; 캑; 캑; ) HANGUL SYLLABLE KAEG +CE92;CE92;110F 1162 11A9;CE92;110F 1162 11A9; # (캒; 캒; 캒; 캒; 캒; ) HANGUL SYLLABLE KAEGG +CE93;CE93;110F 1162 11AA;CE93;110F 1162 11AA; # (캓; 캓; 캓; 캓; 캓; ) HANGUL SYLLABLE KAEGS +CE94;CE94;110F 1162 11AB;CE94;110F 1162 11AB; # (캔; 캔; 캔; 캔; 캔; ) HANGUL SYLLABLE KAEN +CE95;CE95;110F 1162 11AC;CE95;110F 1162 11AC; # (캕; 캕; 캕; 캕; 캕; ) HANGUL SYLLABLE KAENJ +CE96;CE96;110F 1162 11AD;CE96;110F 1162 11AD; # (캖; 캖; 캖; 캖; 캖; ) HANGUL SYLLABLE KAENH +CE97;CE97;110F 1162 11AE;CE97;110F 1162 11AE; # (캗; 캗; 캗; 캗; 캗; ) HANGUL SYLLABLE KAED +CE98;CE98;110F 1162 11AF;CE98;110F 1162 11AF; # (캘; 캘; 캘; 캘; 캘; ) HANGUL SYLLABLE KAEL +CE99;CE99;110F 1162 11B0;CE99;110F 1162 11B0; # (캙; 캙; 캙; 캙; 캙; ) HANGUL SYLLABLE KAELG +CE9A;CE9A;110F 1162 11B1;CE9A;110F 1162 11B1; # (캚; 캚; 캚; 캚; 캚; ) HANGUL SYLLABLE KAELM +CE9B;CE9B;110F 1162 11B2;CE9B;110F 1162 11B2; # (캛; 캛; 캛; 캛; 캛; ) HANGUL SYLLABLE KAELB +CE9C;CE9C;110F 1162 11B3;CE9C;110F 1162 11B3; # (캜; 캜; 캜; 캜; 캜; ) HANGUL SYLLABLE KAELS +CE9D;CE9D;110F 1162 11B4;CE9D;110F 1162 11B4; # (캝; 캝; 캝; 캝; 캝; ) HANGUL SYLLABLE KAELT +CE9E;CE9E;110F 1162 11B5;CE9E;110F 1162 11B5; # (캞; 캞; 캞; 캞; 캞; ) HANGUL SYLLABLE KAELP +CE9F;CE9F;110F 1162 11B6;CE9F;110F 1162 11B6; # (캟; 캟; 캟; 캟; 캟; ) HANGUL SYLLABLE KAELH +CEA0;CEA0;110F 1162 11B7;CEA0;110F 1162 11B7; # (캠; 캠; 캠; 캠; 캠; ) HANGUL SYLLABLE KAEM +CEA1;CEA1;110F 1162 11B8;CEA1;110F 1162 11B8; # (캡; 캡; 캡; 캡; 캡; ) HANGUL SYLLABLE KAEB +CEA2;CEA2;110F 1162 11B9;CEA2;110F 1162 11B9; # (캢; 캢; 캢; 캢; 캢; ) HANGUL SYLLABLE KAEBS +CEA3;CEA3;110F 1162 11BA;CEA3;110F 1162 11BA; # (캣; 캣; 캣; 캣; 캣; ) HANGUL SYLLABLE KAES +CEA4;CEA4;110F 1162 11BB;CEA4;110F 1162 11BB; # (캤; 캤; 캤; 캤; 캤; ) HANGUL SYLLABLE KAESS +CEA5;CEA5;110F 1162 11BC;CEA5;110F 1162 11BC; # (캥; 캥; 캥; 캥; 캥; ) HANGUL SYLLABLE KAENG +CEA6;CEA6;110F 1162 11BD;CEA6;110F 1162 11BD; # (캦; 캦; 캦; 캦; 캦; ) HANGUL SYLLABLE KAEJ +CEA7;CEA7;110F 1162 11BE;CEA7;110F 1162 11BE; # (캧; 캧; 캧; 캧; 캧; ) HANGUL SYLLABLE KAEC +CEA8;CEA8;110F 1162 11BF;CEA8;110F 1162 11BF; # (캨; 캨; 캨; 캨; 캨; ) HANGUL SYLLABLE KAEK +CEA9;CEA9;110F 1162 11C0;CEA9;110F 1162 11C0; # (캩; 캩; 캩; 캩; 캩; ) HANGUL SYLLABLE KAET +CEAA;CEAA;110F 1162 11C1;CEAA;110F 1162 11C1; # (캪; 캪; 캪; 캪; 캪; ) HANGUL SYLLABLE KAEP +CEAB;CEAB;110F 1162 11C2;CEAB;110F 1162 11C2; # (캫; 캫; 캫; 캫; 캫; ) HANGUL SYLLABLE KAEH +CEAC;CEAC;110F 1163;CEAC;110F 1163; # (캬; 캬; 캬; 캬; 캬; ) HANGUL SYLLABLE KYA +CEAD;CEAD;110F 1163 11A8;CEAD;110F 1163 11A8; # (캭; 캭; 캭; 캭; 캭; ) HANGUL SYLLABLE KYAG +CEAE;CEAE;110F 1163 11A9;CEAE;110F 1163 11A9; # (캮; 캮; 캮; 캮; 캮; ) HANGUL SYLLABLE KYAGG +CEAF;CEAF;110F 1163 11AA;CEAF;110F 1163 11AA; # (캯; 캯; 캯; 캯; 캯; ) HANGUL SYLLABLE KYAGS +CEB0;CEB0;110F 1163 11AB;CEB0;110F 1163 11AB; # (캰; 캰; 캰; 캰; 캰; ) HANGUL SYLLABLE KYAN +CEB1;CEB1;110F 1163 11AC;CEB1;110F 1163 11AC; # (캱; 캱; 캱; 캱; 캱; ) HANGUL SYLLABLE KYANJ +CEB2;CEB2;110F 1163 11AD;CEB2;110F 1163 11AD; # (캲; 캲; 캲; 캲; 캲; ) HANGUL SYLLABLE KYANH +CEB3;CEB3;110F 1163 11AE;CEB3;110F 1163 11AE; # (캳; 캳; 캳; 캳; 캳; ) HANGUL SYLLABLE KYAD +CEB4;CEB4;110F 1163 11AF;CEB4;110F 1163 11AF; # (캴; 캴; 캴; 캴; 캴; ) HANGUL SYLLABLE KYAL +CEB5;CEB5;110F 1163 11B0;CEB5;110F 1163 11B0; # (캵; 캵; 캵; 캵; 캵; ) HANGUL SYLLABLE KYALG +CEB6;CEB6;110F 1163 11B1;CEB6;110F 1163 11B1; # (캶; 캶; 캶; 캶; 캶; ) HANGUL SYLLABLE KYALM +CEB7;CEB7;110F 1163 11B2;CEB7;110F 1163 11B2; # (캷; 캷; 캷; 캷; 캷; ) HANGUL SYLLABLE KYALB +CEB8;CEB8;110F 1163 11B3;CEB8;110F 1163 11B3; # (캸; 캸; 캸; 캸; 캸; ) HANGUL SYLLABLE KYALS +CEB9;CEB9;110F 1163 11B4;CEB9;110F 1163 11B4; # (캹; 캹; 캹; 캹; 캹; ) HANGUL SYLLABLE KYALT +CEBA;CEBA;110F 1163 11B5;CEBA;110F 1163 11B5; # (캺; 캺; 캺; 캺; 캺; ) HANGUL SYLLABLE KYALP +CEBB;CEBB;110F 1163 11B6;CEBB;110F 1163 11B6; # (캻; 캻; 캻; 캻; 캻; ) HANGUL SYLLABLE KYALH +CEBC;CEBC;110F 1163 11B7;CEBC;110F 1163 11B7; # (캼; 캼; 캼; 캼; 캼; ) HANGUL SYLLABLE KYAM +CEBD;CEBD;110F 1163 11B8;CEBD;110F 1163 11B8; # (캽; 캽; 캽; 캽; 캽; ) HANGUL SYLLABLE KYAB +CEBE;CEBE;110F 1163 11B9;CEBE;110F 1163 11B9; # (캾; 캾; 캾; 캾; 캾; ) HANGUL SYLLABLE KYABS +CEBF;CEBF;110F 1163 11BA;CEBF;110F 1163 11BA; # (캿; 캿; 캿; 캿; 캿; ) HANGUL SYLLABLE KYAS +CEC0;CEC0;110F 1163 11BB;CEC0;110F 1163 11BB; # (컀; 컀; 컀; 컀; 컀; ) HANGUL SYLLABLE KYASS +CEC1;CEC1;110F 1163 11BC;CEC1;110F 1163 11BC; # (컁; 컁; 컁; 컁; 컁; ) HANGUL SYLLABLE KYANG +CEC2;CEC2;110F 1163 11BD;CEC2;110F 1163 11BD; # (컂; 컂; 컂; 컂; 컂; ) HANGUL SYLLABLE KYAJ +CEC3;CEC3;110F 1163 11BE;CEC3;110F 1163 11BE; # (컃; 컃; 컃; 컃; 컃; ) HANGUL SYLLABLE KYAC +CEC4;CEC4;110F 1163 11BF;CEC4;110F 1163 11BF; # (컄; 컄; 컄; 컄; 컄; ) HANGUL SYLLABLE KYAK +CEC5;CEC5;110F 1163 11C0;CEC5;110F 1163 11C0; # (컅; 컅; 컅; 컅; 컅; ) HANGUL SYLLABLE KYAT +CEC6;CEC6;110F 1163 11C1;CEC6;110F 1163 11C1; # (컆; 컆; 컆; 컆; 컆; ) HANGUL SYLLABLE KYAP +CEC7;CEC7;110F 1163 11C2;CEC7;110F 1163 11C2; # (컇; 컇; 컇; 컇; 컇; ) HANGUL SYLLABLE KYAH +CEC8;CEC8;110F 1164;CEC8;110F 1164; # (컈; 컈; 컈; 컈; 컈; ) HANGUL SYLLABLE KYAE +CEC9;CEC9;110F 1164 11A8;CEC9;110F 1164 11A8; # (컉; 컉; 컉; 컉; 컉; ) HANGUL SYLLABLE KYAEG +CECA;CECA;110F 1164 11A9;CECA;110F 1164 11A9; # (컊; 컊; 컊; 컊; 컊; ) HANGUL SYLLABLE KYAEGG +CECB;CECB;110F 1164 11AA;CECB;110F 1164 11AA; # (컋; 컋; 컋; 컋; 컋; ) HANGUL SYLLABLE KYAEGS +CECC;CECC;110F 1164 11AB;CECC;110F 1164 11AB; # (컌; 컌; 컌; 컌; 컌; ) HANGUL SYLLABLE KYAEN +CECD;CECD;110F 1164 11AC;CECD;110F 1164 11AC; # (컍; 컍; 컍; 컍; 컍; ) HANGUL SYLLABLE KYAENJ +CECE;CECE;110F 1164 11AD;CECE;110F 1164 11AD; # (컎; 컎; 컎; 컎; 컎; ) HANGUL SYLLABLE KYAENH +CECF;CECF;110F 1164 11AE;CECF;110F 1164 11AE; # (컏; 컏; 컏; 컏; 컏; ) HANGUL SYLLABLE KYAED +CED0;CED0;110F 1164 11AF;CED0;110F 1164 11AF; # (컐; 컐; 컐; 컐; 컐; ) HANGUL SYLLABLE KYAEL +CED1;CED1;110F 1164 11B0;CED1;110F 1164 11B0; # (컑; 컑; 컑; 컑; 컑; ) HANGUL SYLLABLE KYAELG +CED2;CED2;110F 1164 11B1;CED2;110F 1164 11B1; # (컒; 컒; 컒; 컒; 컒; ) HANGUL SYLLABLE KYAELM +CED3;CED3;110F 1164 11B2;CED3;110F 1164 11B2; # (컓; 컓; 컓; 컓; 컓; ) HANGUL SYLLABLE KYAELB +CED4;CED4;110F 1164 11B3;CED4;110F 1164 11B3; # (컔; 컔; 컔; 컔; 컔; ) HANGUL SYLLABLE KYAELS +CED5;CED5;110F 1164 11B4;CED5;110F 1164 11B4; # (컕; 컕; 컕; 컕; 컕; ) HANGUL SYLLABLE KYAELT +CED6;CED6;110F 1164 11B5;CED6;110F 1164 11B5; # (컖; 컖; 컖; 컖; 컖; ) HANGUL SYLLABLE KYAELP +CED7;CED7;110F 1164 11B6;CED7;110F 1164 11B6; # (컗; 컗; 컗; 컗; 컗; ) HANGUL SYLLABLE KYAELH +CED8;CED8;110F 1164 11B7;CED8;110F 1164 11B7; # (컘; 컘; 컘; 컘; 컘; ) HANGUL SYLLABLE KYAEM +CED9;CED9;110F 1164 11B8;CED9;110F 1164 11B8; # (컙; 컙; 컙; 컙; 컙; ) HANGUL SYLLABLE KYAEB +CEDA;CEDA;110F 1164 11B9;CEDA;110F 1164 11B9; # (컚; 컚; 컚; 컚; 컚; ) HANGUL SYLLABLE KYAEBS +CEDB;CEDB;110F 1164 11BA;CEDB;110F 1164 11BA; # (컛; 컛; 컛; 컛; 컛; ) HANGUL SYLLABLE KYAES +CEDC;CEDC;110F 1164 11BB;CEDC;110F 1164 11BB; # (컜; 컜; 컜; 컜; 컜; ) HANGUL SYLLABLE KYAESS +CEDD;CEDD;110F 1164 11BC;CEDD;110F 1164 11BC; # (컝; 컝; 컝; 컝; 컝; ) HANGUL SYLLABLE KYAENG +CEDE;CEDE;110F 1164 11BD;CEDE;110F 1164 11BD; # (컞; 컞; 컞; 컞; 컞; ) HANGUL SYLLABLE KYAEJ +CEDF;CEDF;110F 1164 11BE;CEDF;110F 1164 11BE; # (컟; 컟; 컟; 컟; 컟; ) HANGUL SYLLABLE KYAEC +CEE0;CEE0;110F 1164 11BF;CEE0;110F 1164 11BF; # (컠; 컠; 컠; 컠; 컠; ) HANGUL SYLLABLE KYAEK +CEE1;CEE1;110F 1164 11C0;CEE1;110F 1164 11C0; # (컡; 컡; 컡; 컡; 컡; ) HANGUL SYLLABLE KYAET +CEE2;CEE2;110F 1164 11C1;CEE2;110F 1164 11C1; # (컢; 컢; 컢; 컢; 컢; ) HANGUL SYLLABLE KYAEP +CEE3;CEE3;110F 1164 11C2;CEE3;110F 1164 11C2; # (컣; 컣; 컣; 컣; 컣; ) HANGUL SYLLABLE KYAEH +CEE4;CEE4;110F 1165;CEE4;110F 1165; # (커; 커; 커; 커; 커; ) HANGUL SYLLABLE KEO +CEE5;CEE5;110F 1165 11A8;CEE5;110F 1165 11A8; # (컥; 컥; 컥; 컥; 컥; ) HANGUL SYLLABLE KEOG +CEE6;CEE6;110F 1165 11A9;CEE6;110F 1165 11A9; # (컦; 컦; 컦; 컦; 컦; ) HANGUL SYLLABLE KEOGG +CEE7;CEE7;110F 1165 11AA;CEE7;110F 1165 11AA; # (컧; 컧; 컧; 컧; 컧; ) HANGUL SYLLABLE KEOGS +CEE8;CEE8;110F 1165 11AB;CEE8;110F 1165 11AB; # (컨; 컨; 컨; 컨; 컨; ) HANGUL SYLLABLE KEON +CEE9;CEE9;110F 1165 11AC;CEE9;110F 1165 11AC; # (컩; 컩; 컩; 컩; 컩; ) HANGUL SYLLABLE KEONJ +CEEA;CEEA;110F 1165 11AD;CEEA;110F 1165 11AD; # (컪; 컪; 컪; 컪; 컪; ) HANGUL SYLLABLE KEONH +CEEB;CEEB;110F 1165 11AE;CEEB;110F 1165 11AE; # (컫; 컫; 컫; 컫; 컫; ) HANGUL SYLLABLE KEOD +CEEC;CEEC;110F 1165 11AF;CEEC;110F 1165 11AF; # (컬; 컬; 컬; 컬; 컬; ) HANGUL SYLLABLE KEOL +CEED;CEED;110F 1165 11B0;CEED;110F 1165 11B0; # (컭; 컭; 컭; 컭; 컭; ) HANGUL SYLLABLE KEOLG +CEEE;CEEE;110F 1165 11B1;CEEE;110F 1165 11B1; # (컮; 컮; 컮; 컮; 컮; ) HANGUL SYLLABLE KEOLM +CEEF;CEEF;110F 1165 11B2;CEEF;110F 1165 11B2; # (컯; 컯; 컯; 컯; 컯; ) HANGUL SYLLABLE KEOLB +CEF0;CEF0;110F 1165 11B3;CEF0;110F 1165 11B3; # (컰; 컰; 컰; 컰; 컰; ) HANGUL SYLLABLE KEOLS +CEF1;CEF1;110F 1165 11B4;CEF1;110F 1165 11B4; # (컱; 컱; 컱; 컱; 컱; ) HANGUL SYLLABLE KEOLT +CEF2;CEF2;110F 1165 11B5;CEF2;110F 1165 11B5; # (컲; 컲; 컲; 컲; 컲; ) HANGUL SYLLABLE KEOLP +CEF3;CEF3;110F 1165 11B6;CEF3;110F 1165 11B6; # (컳; 컳; 컳; 컳; 컳; ) HANGUL SYLLABLE KEOLH +CEF4;CEF4;110F 1165 11B7;CEF4;110F 1165 11B7; # (컴; 컴; 컴; 컴; 컴; ) HANGUL SYLLABLE KEOM +CEF5;CEF5;110F 1165 11B8;CEF5;110F 1165 11B8; # (컵; 컵; 컵; 컵; 컵; ) HANGUL SYLLABLE KEOB +CEF6;CEF6;110F 1165 11B9;CEF6;110F 1165 11B9; # (컶; 컶; 컶; 컶; 컶; ) HANGUL SYLLABLE KEOBS +CEF7;CEF7;110F 1165 11BA;CEF7;110F 1165 11BA; # (컷; 컷; 컷; 컷; 컷; ) HANGUL SYLLABLE KEOS +CEF8;CEF8;110F 1165 11BB;CEF8;110F 1165 11BB; # (컸; 컸; 컸; 컸; 컸; ) HANGUL SYLLABLE KEOSS +CEF9;CEF9;110F 1165 11BC;CEF9;110F 1165 11BC; # (컹; 컹; 컹; 컹; 컹; ) HANGUL SYLLABLE KEONG +CEFA;CEFA;110F 1165 11BD;CEFA;110F 1165 11BD; # (컺; 컺; 컺; 컺; 컺; ) HANGUL SYLLABLE KEOJ +CEFB;CEFB;110F 1165 11BE;CEFB;110F 1165 11BE; # (컻; 컻; 컻; 컻; 컻; ) HANGUL SYLLABLE KEOC +CEFC;CEFC;110F 1165 11BF;CEFC;110F 1165 11BF; # (컼; 컼; 컼; 컼; 컼; ) HANGUL SYLLABLE KEOK +CEFD;CEFD;110F 1165 11C0;CEFD;110F 1165 11C0; # (컽; 컽; 컽; 컽; 컽; ) HANGUL SYLLABLE KEOT +CEFE;CEFE;110F 1165 11C1;CEFE;110F 1165 11C1; # (컾; 컾; 컾; 컾; 컾; ) HANGUL SYLLABLE KEOP +CEFF;CEFF;110F 1165 11C2;CEFF;110F 1165 11C2; # (컿; 컿; 컿; 컿; 컿; ) HANGUL SYLLABLE KEOH +CF00;CF00;110F 1166;CF00;110F 1166; # (케; 케; 케; 케; 케; ) HANGUL SYLLABLE KE +CF01;CF01;110F 1166 11A8;CF01;110F 1166 11A8; # (켁; 켁; 켁; 켁; 켁; ) HANGUL SYLLABLE KEG +CF02;CF02;110F 1166 11A9;CF02;110F 1166 11A9; # (켂; 켂; 켂; 켂; 켂; ) HANGUL SYLLABLE KEGG +CF03;CF03;110F 1166 11AA;CF03;110F 1166 11AA; # (켃; 켃; 켃; 켃; 켃; ) HANGUL SYLLABLE KEGS +CF04;CF04;110F 1166 11AB;CF04;110F 1166 11AB; # (켄; 켄; 켄; 켄; 켄; ) HANGUL SYLLABLE KEN +CF05;CF05;110F 1166 11AC;CF05;110F 1166 11AC; # (켅; 켅; 켅; 켅; 켅; ) HANGUL SYLLABLE KENJ +CF06;CF06;110F 1166 11AD;CF06;110F 1166 11AD; # (켆; 켆; 켆; 켆; 켆; ) HANGUL SYLLABLE KENH +CF07;CF07;110F 1166 11AE;CF07;110F 1166 11AE; # (켇; 켇; 켇; 켇; 켇; ) HANGUL SYLLABLE KED +CF08;CF08;110F 1166 11AF;CF08;110F 1166 11AF; # (켈; 켈; 켈; 켈; 켈; ) HANGUL SYLLABLE KEL +CF09;CF09;110F 1166 11B0;CF09;110F 1166 11B0; # (켉; 켉; 켉; 켉; 켉; ) HANGUL SYLLABLE KELG +CF0A;CF0A;110F 1166 11B1;CF0A;110F 1166 11B1; # (켊; 켊; 켊; 켊; 켊; ) HANGUL SYLLABLE KELM +CF0B;CF0B;110F 1166 11B2;CF0B;110F 1166 11B2; # (켋; 켋; 켋; 켋; 켋; ) HANGUL SYLLABLE KELB +CF0C;CF0C;110F 1166 11B3;CF0C;110F 1166 11B3; # (켌; 켌; 켌; 켌; 켌; ) HANGUL SYLLABLE KELS +CF0D;CF0D;110F 1166 11B4;CF0D;110F 1166 11B4; # (켍; 켍; 켍; 켍; 켍; ) HANGUL SYLLABLE KELT +CF0E;CF0E;110F 1166 11B5;CF0E;110F 1166 11B5; # (켎; 켎; 켎; 켎; 켎; ) HANGUL SYLLABLE KELP +CF0F;CF0F;110F 1166 11B6;CF0F;110F 1166 11B6; # (켏; 켏; 켏; 켏; 켏; ) HANGUL SYLLABLE KELH +CF10;CF10;110F 1166 11B7;CF10;110F 1166 11B7; # (켐; 켐; 켐; 켐; 켐; ) HANGUL SYLLABLE KEM +CF11;CF11;110F 1166 11B8;CF11;110F 1166 11B8; # (켑; 켑; 켑; 켑; 켑; ) HANGUL SYLLABLE KEB +CF12;CF12;110F 1166 11B9;CF12;110F 1166 11B9; # (켒; 켒; 켒; 켒; 켒; ) HANGUL SYLLABLE KEBS +CF13;CF13;110F 1166 11BA;CF13;110F 1166 11BA; # (켓; 켓; 켓; 켓; 켓; ) HANGUL SYLLABLE KES +CF14;CF14;110F 1166 11BB;CF14;110F 1166 11BB; # (켔; 켔; 켔; 켔; 켔; ) HANGUL SYLLABLE KESS +CF15;CF15;110F 1166 11BC;CF15;110F 1166 11BC; # (켕; 켕; 켕; 켕; 켕; ) HANGUL SYLLABLE KENG +CF16;CF16;110F 1166 11BD;CF16;110F 1166 11BD; # (켖; 켖; 켖; 켖; 켖; ) HANGUL SYLLABLE KEJ +CF17;CF17;110F 1166 11BE;CF17;110F 1166 11BE; # (켗; 켗; 켗; 켗; 켗; ) HANGUL SYLLABLE KEC +CF18;CF18;110F 1166 11BF;CF18;110F 1166 11BF; # (켘; 켘; 켘; 켘; 켘; ) HANGUL SYLLABLE KEK +CF19;CF19;110F 1166 11C0;CF19;110F 1166 11C0; # (켙; 켙; 켙; 켙; 켙; ) HANGUL SYLLABLE KET +CF1A;CF1A;110F 1166 11C1;CF1A;110F 1166 11C1; # (켚; 켚; 켚; 켚; 켚; ) HANGUL SYLLABLE KEP +CF1B;CF1B;110F 1166 11C2;CF1B;110F 1166 11C2; # (켛; 켛; 켛; 켛; 켛; ) HANGUL SYLLABLE KEH +CF1C;CF1C;110F 1167;CF1C;110F 1167; # (켜; 켜; 켜; 켜; 켜; ) HANGUL SYLLABLE KYEO +CF1D;CF1D;110F 1167 11A8;CF1D;110F 1167 11A8; # (켝; 켝; 켝; 켝; 켝; ) HANGUL SYLLABLE KYEOG +CF1E;CF1E;110F 1167 11A9;CF1E;110F 1167 11A9; # (켞; 켞; 켞; 켞; 켞; ) HANGUL SYLLABLE KYEOGG +CF1F;CF1F;110F 1167 11AA;CF1F;110F 1167 11AA; # (켟; 켟; 켟; 켟; 켟; ) HANGUL SYLLABLE KYEOGS +CF20;CF20;110F 1167 11AB;CF20;110F 1167 11AB; # (켠; 켠; 켠; 켠; 켠; ) HANGUL SYLLABLE KYEON +CF21;CF21;110F 1167 11AC;CF21;110F 1167 11AC; # (켡; 켡; 켡; 켡; 켡; ) HANGUL SYLLABLE KYEONJ +CF22;CF22;110F 1167 11AD;CF22;110F 1167 11AD; # (켢; 켢; 켢; 켢; 켢; ) HANGUL SYLLABLE KYEONH +CF23;CF23;110F 1167 11AE;CF23;110F 1167 11AE; # (켣; 켣; 켣; 켣; 켣; ) HANGUL SYLLABLE KYEOD +CF24;CF24;110F 1167 11AF;CF24;110F 1167 11AF; # (켤; 켤; 켤; 켤; 켤; ) HANGUL SYLLABLE KYEOL +CF25;CF25;110F 1167 11B0;CF25;110F 1167 11B0; # (켥; 켥; 켥; 켥; 켥; ) HANGUL SYLLABLE KYEOLG +CF26;CF26;110F 1167 11B1;CF26;110F 1167 11B1; # (켦; 켦; 켦; 켦; 켦; ) HANGUL SYLLABLE KYEOLM +CF27;CF27;110F 1167 11B2;CF27;110F 1167 11B2; # (켧; 켧; 켧; 켧; 켧; ) HANGUL SYLLABLE KYEOLB +CF28;CF28;110F 1167 11B3;CF28;110F 1167 11B3; # (켨; 켨; 켨; 켨; 켨; ) HANGUL SYLLABLE KYEOLS +CF29;CF29;110F 1167 11B4;CF29;110F 1167 11B4; # (켩; 켩; 켩; 켩; 켩; ) HANGUL SYLLABLE KYEOLT +CF2A;CF2A;110F 1167 11B5;CF2A;110F 1167 11B5; # (켪; 켪; 켪; 켪; 켪; ) HANGUL SYLLABLE KYEOLP +CF2B;CF2B;110F 1167 11B6;CF2B;110F 1167 11B6; # (켫; 켫; 켫; 켫; 켫; ) HANGUL SYLLABLE KYEOLH +CF2C;CF2C;110F 1167 11B7;CF2C;110F 1167 11B7; # (켬; 켬; 켬; 켬; 켬; ) HANGUL SYLLABLE KYEOM +CF2D;CF2D;110F 1167 11B8;CF2D;110F 1167 11B8; # (켭; 켭; 켭; 켭; 켭; ) HANGUL SYLLABLE KYEOB +CF2E;CF2E;110F 1167 11B9;CF2E;110F 1167 11B9; # (켮; 켮; 켮; 켮; 켮; ) HANGUL SYLLABLE KYEOBS +CF2F;CF2F;110F 1167 11BA;CF2F;110F 1167 11BA; # (켯; 켯; 켯; 켯; 켯; ) HANGUL SYLLABLE KYEOS +CF30;CF30;110F 1167 11BB;CF30;110F 1167 11BB; # (켰; 켰; 켰; 켰; 켰; ) HANGUL SYLLABLE KYEOSS +CF31;CF31;110F 1167 11BC;CF31;110F 1167 11BC; # (켱; 켱; 켱; 켱; 켱; ) HANGUL SYLLABLE KYEONG +CF32;CF32;110F 1167 11BD;CF32;110F 1167 11BD; # (켲; 켲; 켲; 켲; 켲; ) HANGUL SYLLABLE KYEOJ +CF33;CF33;110F 1167 11BE;CF33;110F 1167 11BE; # (켳; 켳; 켳; 켳; 켳; ) HANGUL SYLLABLE KYEOC +CF34;CF34;110F 1167 11BF;CF34;110F 1167 11BF; # (켴; 켴; 켴; 켴; 켴; ) HANGUL SYLLABLE KYEOK +CF35;CF35;110F 1167 11C0;CF35;110F 1167 11C0; # (켵; 켵; 켵; 켵; 켵; ) HANGUL SYLLABLE KYEOT +CF36;CF36;110F 1167 11C1;CF36;110F 1167 11C1; # (켶; 켶; 켶; 켶; 켶; ) HANGUL SYLLABLE KYEOP +CF37;CF37;110F 1167 11C2;CF37;110F 1167 11C2; # (켷; 켷; 켷; 켷; 켷; ) HANGUL SYLLABLE KYEOH +CF38;CF38;110F 1168;CF38;110F 1168; # (켸; 켸; 켸; 켸; 켸; ) HANGUL SYLLABLE KYE +CF39;CF39;110F 1168 11A8;CF39;110F 1168 11A8; # (켹; 켹; 켹; 켹; 켹; ) HANGUL SYLLABLE KYEG +CF3A;CF3A;110F 1168 11A9;CF3A;110F 1168 11A9; # (켺; 켺; 켺; 켺; 켺; ) HANGUL SYLLABLE KYEGG +CF3B;CF3B;110F 1168 11AA;CF3B;110F 1168 11AA; # (켻; 켻; 켻; 켻; 켻; ) HANGUL SYLLABLE KYEGS +CF3C;CF3C;110F 1168 11AB;CF3C;110F 1168 11AB; # (켼; 켼; 켼; 켼; 켼; ) HANGUL SYLLABLE KYEN +CF3D;CF3D;110F 1168 11AC;CF3D;110F 1168 11AC; # (켽; 켽; 켽; 켽; 켽; ) HANGUL SYLLABLE KYENJ +CF3E;CF3E;110F 1168 11AD;CF3E;110F 1168 11AD; # (켾; 켾; 켾; 켾; 켾; ) HANGUL SYLLABLE KYENH +CF3F;CF3F;110F 1168 11AE;CF3F;110F 1168 11AE; # (켿; 켿; 켿; 켿; 켿; ) HANGUL SYLLABLE KYED +CF40;CF40;110F 1168 11AF;CF40;110F 1168 11AF; # (콀; 콀; 콀; 콀; 콀; ) HANGUL SYLLABLE KYEL +CF41;CF41;110F 1168 11B0;CF41;110F 1168 11B0; # (콁; 콁; 콁; 콁; 콁; ) HANGUL SYLLABLE KYELG +CF42;CF42;110F 1168 11B1;CF42;110F 1168 11B1; # (콂; 콂; 콂; 콂; 콂; ) HANGUL SYLLABLE KYELM +CF43;CF43;110F 1168 11B2;CF43;110F 1168 11B2; # (콃; 콃; 콃; 콃; 콃; ) HANGUL SYLLABLE KYELB +CF44;CF44;110F 1168 11B3;CF44;110F 1168 11B3; # (콄; 콄; 콄; 콄; 콄; ) HANGUL SYLLABLE KYELS +CF45;CF45;110F 1168 11B4;CF45;110F 1168 11B4; # (콅; 콅; 콅; 콅; 콅; ) HANGUL SYLLABLE KYELT +CF46;CF46;110F 1168 11B5;CF46;110F 1168 11B5; # (콆; 콆; 콆; 콆; 콆; ) HANGUL SYLLABLE KYELP +CF47;CF47;110F 1168 11B6;CF47;110F 1168 11B6; # (콇; 콇; 콇; 콇; 콇; ) HANGUL SYLLABLE KYELH +CF48;CF48;110F 1168 11B7;CF48;110F 1168 11B7; # (콈; 콈; 콈; 콈; 콈; ) HANGUL SYLLABLE KYEM +CF49;CF49;110F 1168 11B8;CF49;110F 1168 11B8; # (콉; 콉; 콉; 콉; 콉; ) HANGUL SYLLABLE KYEB +CF4A;CF4A;110F 1168 11B9;CF4A;110F 1168 11B9; # (콊; 콊; 콊; 콊; 콊; ) HANGUL SYLLABLE KYEBS +CF4B;CF4B;110F 1168 11BA;CF4B;110F 1168 11BA; # (콋; 콋; 콋; 콋; 콋; ) HANGUL SYLLABLE KYES +CF4C;CF4C;110F 1168 11BB;CF4C;110F 1168 11BB; # (콌; 콌; 콌; 콌; 콌; ) HANGUL SYLLABLE KYESS +CF4D;CF4D;110F 1168 11BC;CF4D;110F 1168 11BC; # (콍; 콍; 콍; 콍; 콍; ) HANGUL SYLLABLE KYENG +CF4E;CF4E;110F 1168 11BD;CF4E;110F 1168 11BD; # (콎; 콎; 콎; 콎; 콎; ) HANGUL SYLLABLE KYEJ +CF4F;CF4F;110F 1168 11BE;CF4F;110F 1168 11BE; # (콏; 콏; 콏; 콏; 콏; ) HANGUL SYLLABLE KYEC +CF50;CF50;110F 1168 11BF;CF50;110F 1168 11BF; # (콐; 콐; 콐; 콐; 콐; ) HANGUL SYLLABLE KYEK +CF51;CF51;110F 1168 11C0;CF51;110F 1168 11C0; # (콑; 콑; 콑; 콑; 콑; ) HANGUL SYLLABLE KYET +CF52;CF52;110F 1168 11C1;CF52;110F 1168 11C1; # (콒; 콒; 콒; 콒; 콒; ) HANGUL SYLLABLE KYEP +CF53;CF53;110F 1168 11C2;CF53;110F 1168 11C2; # (콓; 콓; 콓; 콓; 콓; ) HANGUL SYLLABLE KYEH +CF54;CF54;110F 1169;CF54;110F 1169; # (코; 코; 코; 코; 코; ) HANGUL SYLLABLE KO +CF55;CF55;110F 1169 11A8;CF55;110F 1169 11A8; # (콕; 콕; 콕; 콕; 콕; ) HANGUL SYLLABLE KOG +CF56;CF56;110F 1169 11A9;CF56;110F 1169 11A9; # (콖; 콖; 콖; 콖; 콖; ) HANGUL SYLLABLE KOGG +CF57;CF57;110F 1169 11AA;CF57;110F 1169 11AA; # (콗; 콗; 콗; 콗; 콗; ) HANGUL SYLLABLE KOGS +CF58;CF58;110F 1169 11AB;CF58;110F 1169 11AB; # (콘; 콘; 콘; 콘; 콘; ) HANGUL SYLLABLE KON +CF59;CF59;110F 1169 11AC;CF59;110F 1169 11AC; # (콙; 콙; 콙; 콙; 콙; ) HANGUL SYLLABLE KONJ +CF5A;CF5A;110F 1169 11AD;CF5A;110F 1169 11AD; # (콚; 콚; 콚; 콚; 콚; ) HANGUL SYLLABLE KONH +CF5B;CF5B;110F 1169 11AE;CF5B;110F 1169 11AE; # (콛; 콛; 콛; 콛; 콛; ) HANGUL SYLLABLE KOD +CF5C;CF5C;110F 1169 11AF;CF5C;110F 1169 11AF; # (콜; 콜; 콜; 콜; 콜; ) HANGUL SYLLABLE KOL +CF5D;CF5D;110F 1169 11B0;CF5D;110F 1169 11B0; # (콝; 콝; 콝; 콝; 콝; ) HANGUL SYLLABLE KOLG +CF5E;CF5E;110F 1169 11B1;CF5E;110F 1169 11B1; # (콞; 콞; 콞; 콞; 콞; ) HANGUL SYLLABLE KOLM +CF5F;CF5F;110F 1169 11B2;CF5F;110F 1169 11B2; # (콟; 콟; 콟; 콟; 콟; ) HANGUL SYLLABLE KOLB +CF60;CF60;110F 1169 11B3;CF60;110F 1169 11B3; # (콠; 콠; 콠; 콠; 콠; ) HANGUL SYLLABLE KOLS +CF61;CF61;110F 1169 11B4;CF61;110F 1169 11B4; # (콡; 콡; 콡; 콡; 콡; ) HANGUL SYLLABLE KOLT +CF62;CF62;110F 1169 11B5;CF62;110F 1169 11B5; # (콢; 콢; 콢; 콢; 콢; ) HANGUL SYLLABLE KOLP +CF63;CF63;110F 1169 11B6;CF63;110F 1169 11B6; # (콣; 콣; 콣; 콣; 콣; ) HANGUL SYLLABLE KOLH +CF64;CF64;110F 1169 11B7;CF64;110F 1169 11B7; # (콤; 콤; 콤; 콤; 콤; ) HANGUL SYLLABLE KOM +CF65;CF65;110F 1169 11B8;CF65;110F 1169 11B8; # (콥; 콥; 콥; 콥; 콥; ) HANGUL SYLLABLE KOB +CF66;CF66;110F 1169 11B9;CF66;110F 1169 11B9; # (콦; 콦; 콦; 콦; 콦; ) HANGUL SYLLABLE KOBS +CF67;CF67;110F 1169 11BA;CF67;110F 1169 11BA; # (콧; 콧; 콧; 콧; 콧; ) HANGUL SYLLABLE KOS +CF68;CF68;110F 1169 11BB;CF68;110F 1169 11BB; # (콨; 콨; 콨; 콨; 콨; ) HANGUL SYLLABLE KOSS +CF69;CF69;110F 1169 11BC;CF69;110F 1169 11BC; # (콩; 콩; 콩; 콩; 콩; ) HANGUL SYLLABLE KONG +CF6A;CF6A;110F 1169 11BD;CF6A;110F 1169 11BD; # (콪; 콪; 콪; 콪; 콪; ) HANGUL SYLLABLE KOJ +CF6B;CF6B;110F 1169 11BE;CF6B;110F 1169 11BE; # (콫; 콫; 콫; 콫; 콫; ) HANGUL SYLLABLE KOC +CF6C;CF6C;110F 1169 11BF;CF6C;110F 1169 11BF; # (콬; 콬; 콬; 콬; 콬; ) HANGUL SYLLABLE KOK +CF6D;CF6D;110F 1169 11C0;CF6D;110F 1169 11C0; # (콭; 콭; 콭; 콭; 콭; ) HANGUL SYLLABLE KOT +CF6E;CF6E;110F 1169 11C1;CF6E;110F 1169 11C1; # (콮; 콮; 콮; 콮; 콮; ) HANGUL SYLLABLE KOP +CF6F;CF6F;110F 1169 11C2;CF6F;110F 1169 11C2; # (콯; 콯; 콯; 콯; 콯; ) HANGUL SYLLABLE KOH +CF70;CF70;110F 116A;CF70;110F 116A; # (콰; 콰; 콰; 콰; 콰; ) HANGUL SYLLABLE KWA +CF71;CF71;110F 116A 11A8;CF71;110F 116A 11A8; # (콱; 콱; 콱; 콱; 콱; ) HANGUL SYLLABLE KWAG +CF72;CF72;110F 116A 11A9;CF72;110F 116A 11A9; # (콲; 콲; 콲; 콲; 콲; ) HANGUL SYLLABLE KWAGG +CF73;CF73;110F 116A 11AA;CF73;110F 116A 11AA; # (콳; 콳; 콳; 콳; 콳; ) HANGUL SYLLABLE KWAGS +CF74;CF74;110F 116A 11AB;CF74;110F 116A 11AB; # (콴; 콴; 콴; 콴; 콴; ) HANGUL SYLLABLE KWAN +CF75;CF75;110F 116A 11AC;CF75;110F 116A 11AC; # (콵; 콵; 콵; 콵; 콵; ) HANGUL SYLLABLE KWANJ +CF76;CF76;110F 116A 11AD;CF76;110F 116A 11AD; # (콶; 콶; 콶; 콶; 콶; ) HANGUL SYLLABLE KWANH +CF77;CF77;110F 116A 11AE;CF77;110F 116A 11AE; # (콷; 콷; 콷; 콷; 콷; ) HANGUL SYLLABLE KWAD +CF78;CF78;110F 116A 11AF;CF78;110F 116A 11AF; # (콸; 콸; 콸; 콸; 콸; ) HANGUL SYLLABLE KWAL +CF79;CF79;110F 116A 11B0;CF79;110F 116A 11B0; # (콹; 콹; 콹; 콹; 콹; ) HANGUL SYLLABLE KWALG +CF7A;CF7A;110F 116A 11B1;CF7A;110F 116A 11B1; # (콺; 콺; 콺; 콺; 콺; ) HANGUL SYLLABLE KWALM +CF7B;CF7B;110F 116A 11B2;CF7B;110F 116A 11B2; # (콻; 콻; 콻; 콻; 콻; ) HANGUL SYLLABLE KWALB +CF7C;CF7C;110F 116A 11B3;CF7C;110F 116A 11B3; # (콼; 콼; 콼; 콼; 콼; ) HANGUL SYLLABLE KWALS +CF7D;CF7D;110F 116A 11B4;CF7D;110F 116A 11B4; # (콽; 콽; 콽; 콽; 콽; ) HANGUL SYLLABLE KWALT +CF7E;CF7E;110F 116A 11B5;CF7E;110F 116A 11B5; # (콾; 콾; 콾; 콾; 콾; ) HANGUL SYLLABLE KWALP +CF7F;CF7F;110F 116A 11B6;CF7F;110F 116A 11B6; # (콿; 콿; 콿; 콿; 콿; ) HANGUL SYLLABLE KWALH +CF80;CF80;110F 116A 11B7;CF80;110F 116A 11B7; # (쾀; 쾀; 쾀; 쾀; 쾀; ) HANGUL SYLLABLE KWAM +CF81;CF81;110F 116A 11B8;CF81;110F 116A 11B8; # (쾁; 쾁; 쾁; 쾁; 쾁; ) HANGUL SYLLABLE KWAB +CF82;CF82;110F 116A 11B9;CF82;110F 116A 11B9; # (쾂; 쾂; 쾂; 쾂; 쾂; ) HANGUL SYLLABLE KWABS +CF83;CF83;110F 116A 11BA;CF83;110F 116A 11BA; # (쾃; 쾃; 쾃; 쾃; 쾃; ) HANGUL SYLLABLE KWAS +CF84;CF84;110F 116A 11BB;CF84;110F 116A 11BB; # (쾄; 쾄; 쾄; 쾄; 쾄; ) HANGUL SYLLABLE KWASS +CF85;CF85;110F 116A 11BC;CF85;110F 116A 11BC; # (쾅; 쾅; 쾅; 쾅; 쾅; ) HANGUL SYLLABLE KWANG +CF86;CF86;110F 116A 11BD;CF86;110F 116A 11BD; # (쾆; 쾆; 쾆; 쾆; 쾆; ) HANGUL SYLLABLE KWAJ +CF87;CF87;110F 116A 11BE;CF87;110F 116A 11BE; # (쾇; 쾇; 쾇; 쾇; 쾇; ) HANGUL SYLLABLE KWAC +CF88;CF88;110F 116A 11BF;CF88;110F 116A 11BF; # (쾈; 쾈; 쾈; 쾈; 쾈; ) HANGUL SYLLABLE KWAK +CF89;CF89;110F 116A 11C0;CF89;110F 116A 11C0; # (쾉; 쾉; 쾉; 쾉; 쾉; ) HANGUL SYLLABLE KWAT +CF8A;CF8A;110F 116A 11C1;CF8A;110F 116A 11C1; # (쾊; 쾊; 쾊; 쾊; 쾊; ) HANGUL SYLLABLE KWAP +CF8B;CF8B;110F 116A 11C2;CF8B;110F 116A 11C2; # (쾋; 쾋; 쾋; 쾋; 쾋; ) HANGUL SYLLABLE KWAH +CF8C;CF8C;110F 116B;CF8C;110F 116B; # (쾌; 쾌; 쾌; 쾌; 쾌; ) HANGUL SYLLABLE KWAE +CF8D;CF8D;110F 116B 11A8;CF8D;110F 116B 11A8; # (쾍; 쾍; 쾍; 쾍; 쾍; ) HANGUL SYLLABLE KWAEG +CF8E;CF8E;110F 116B 11A9;CF8E;110F 116B 11A9; # (쾎; 쾎; 쾎; 쾎; 쾎; ) HANGUL SYLLABLE KWAEGG +CF8F;CF8F;110F 116B 11AA;CF8F;110F 116B 11AA; # (쾏; 쾏; 쾏; 쾏; 쾏; ) HANGUL SYLLABLE KWAEGS +CF90;CF90;110F 116B 11AB;CF90;110F 116B 11AB; # (쾐; 쾐; 쾐; 쾐; 쾐; ) HANGUL SYLLABLE KWAEN +CF91;CF91;110F 116B 11AC;CF91;110F 116B 11AC; # (쾑; 쾑; 쾑; 쾑; 쾑; ) HANGUL SYLLABLE KWAENJ +CF92;CF92;110F 116B 11AD;CF92;110F 116B 11AD; # (쾒; 쾒; 쾒; 쾒; 쾒; ) HANGUL SYLLABLE KWAENH +CF93;CF93;110F 116B 11AE;CF93;110F 116B 11AE; # (쾓; 쾓; 쾓; 쾓; 쾓; ) HANGUL SYLLABLE KWAED +CF94;CF94;110F 116B 11AF;CF94;110F 116B 11AF; # (쾔; 쾔; 쾔; 쾔; 쾔; ) HANGUL SYLLABLE KWAEL +CF95;CF95;110F 116B 11B0;CF95;110F 116B 11B0; # (쾕; 쾕; 쾕; 쾕; 쾕; ) HANGUL SYLLABLE KWAELG +CF96;CF96;110F 116B 11B1;CF96;110F 116B 11B1; # (쾖; 쾖; 쾖; 쾖; 쾖; ) HANGUL SYLLABLE KWAELM +CF97;CF97;110F 116B 11B2;CF97;110F 116B 11B2; # (쾗; 쾗; 쾗; 쾗; 쾗; ) HANGUL SYLLABLE KWAELB +CF98;CF98;110F 116B 11B3;CF98;110F 116B 11B3; # (쾘; 쾘; 쾘; 쾘; 쾘; ) HANGUL SYLLABLE KWAELS +CF99;CF99;110F 116B 11B4;CF99;110F 116B 11B4; # (쾙; 쾙; 쾙; 쾙; 쾙; ) HANGUL SYLLABLE KWAELT +CF9A;CF9A;110F 116B 11B5;CF9A;110F 116B 11B5; # (쾚; 쾚; 쾚; 쾚; 쾚; ) HANGUL SYLLABLE KWAELP +CF9B;CF9B;110F 116B 11B6;CF9B;110F 116B 11B6; # (쾛; 쾛; 쾛; 쾛; 쾛; ) HANGUL SYLLABLE KWAELH +CF9C;CF9C;110F 116B 11B7;CF9C;110F 116B 11B7; # (쾜; 쾜; 쾜; 쾜; 쾜; ) HANGUL SYLLABLE KWAEM +CF9D;CF9D;110F 116B 11B8;CF9D;110F 116B 11B8; # (쾝; 쾝; 쾝; 쾝; 쾝; ) HANGUL SYLLABLE KWAEB +CF9E;CF9E;110F 116B 11B9;CF9E;110F 116B 11B9; # (쾞; 쾞; 쾞; 쾞; 쾞; ) HANGUL SYLLABLE KWAEBS +CF9F;CF9F;110F 116B 11BA;CF9F;110F 116B 11BA; # (쾟; 쾟; 쾟; 쾟; 쾟; ) HANGUL SYLLABLE KWAES +CFA0;CFA0;110F 116B 11BB;CFA0;110F 116B 11BB; # (쾠; 쾠; 쾠; 쾠; 쾠; ) HANGUL SYLLABLE KWAESS +CFA1;CFA1;110F 116B 11BC;CFA1;110F 116B 11BC; # (쾡; 쾡; 쾡; 쾡; 쾡; ) HANGUL SYLLABLE KWAENG +CFA2;CFA2;110F 116B 11BD;CFA2;110F 116B 11BD; # (쾢; 쾢; 쾢; 쾢; 쾢; ) HANGUL SYLLABLE KWAEJ +CFA3;CFA3;110F 116B 11BE;CFA3;110F 116B 11BE; # (쾣; 쾣; 쾣; 쾣; 쾣; ) HANGUL SYLLABLE KWAEC +CFA4;CFA4;110F 116B 11BF;CFA4;110F 116B 11BF; # (쾤; 쾤; 쾤; 쾤; 쾤; ) HANGUL SYLLABLE KWAEK +CFA5;CFA5;110F 116B 11C0;CFA5;110F 116B 11C0; # (쾥; 쾥; 쾥; 쾥; 쾥; ) HANGUL SYLLABLE KWAET +CFA6;CFA6;110F 116B 11C1;CFA6;110F 116B 11C1; # (쾦; 쾦; 쾦; 쾦; 쾦; ) HANGUL SYLLABLE KWAEP +CFA7;CFA7;110F 116B 11C2;CFA7;110F 116B 11C2; # (쾧; 쾧; 쾧; 쾧; 쾧; ) HANGUL SYLLABLE KWAEH +CFA8;CFA8;110F 116C;CFA8;110F 116C; # (쾨; 쾨; 쾨; 쾨; 쾨; ) HANGUL SYLLABLE KOE +CFA9;CFA9;110F 116C 11A8;CFA9;110F 116C 11A8; # (쾩; 쾩; 쾩; 쾩; 쾩; ) HANGUL SYLLABLE KOEG +CFAA;CFAA;110F 116C 11A9;CFAA;110F 116C 11A9; # (쾪; 쾪; 쾪; 쾪; 쾪; ) HANGUL SYLLABLE KOEGG +CFAB;CFAB;110F 116C 11AA;CFAB;110F 116C 11AA; # (쾫; 쾫; 쾫; 쾫; 쾫; ) HANGUL SYLLABLE KOEGS +CFAC;CFAC;110F 116C 11AB;CFAC;110F 116C 11AB; # (쾬; 쾬; 쾬; 쾬; 쾬; ) HANGUL SYLLABLE KOEN +CFAD;CFAD;110F 116C 11AC;CFAD;110F 116C 11AC; # (쾭; 쾭; 쾭; 쾭; 쾭; ) HANGUL SYLLABLE KOENJ +CFAE;CFAE;110F 116C 11AD;CFAE;110F 116C 11AD; # (쾮; 쾮; 쾮; 쾮; 쾮; ) HANGUL SYLLABLE KOENH +CFAF;CFAF;110F 116C 11AE;CFAF;110F 116C 11AE; # (쾯; 쾯; 쾯; 쾯; 쾯; ) HANGUL SYLLABLE KOED +CFB0;CFB0;110F 116C 11AF;CFB0;110F 116C 11AF; # (쾰; 쾰; 쾰; 쾰; 쾰; ) HANGUL SYLLABLE KOEL +CFB1;CFB1;110F 116C 11B0;CFB1;110F 116C 11B0; # (쾱; 쾱; 쾱; 쾱; 쾱; ) HANGUL SYLLABLE KOELG +CFB2;CFB2;110F 116C 11B1;CFB2;110F 116C 11B1; # (쾲; 쾲; 쾲; 쾲; 쾲; ) HANGUL SYLLABLE KOELM +CFB3;CFB3;110F 116C 11B2;CFB3;110F 116C 11B2; # (쾳; 쾳; 쾳; 쾳; 쾳; ) HANGUL SYLLABLE KOELB +CFB4;CFB4;110F 116C 11B3;CFB4;110F 116C 11B3; # (쾴; 쾴; 쾴; 쾴; 쾴; ) HANGUL SYLLABLE KOELS +CFB5;CFB5;110F 116C 11B4;CFB5;110F 116C 11B4; # (쾵; 쾵; 쾵; 쾵; 쾵; ) HANGUL SYLLABLE KOELT +CFB6;CFB6;110F 116C 11B5;CFB6;110F 116C 11B5; # (쾶; 쾶; 쾶; 쾶; 쾶; ) HANGUL SYLLABLE KOELP +CFB7;CFB7;110F 116C 11B6;CFB7;110F 116C 11B6; # (쾷; 쾷; 쾷; 쾷; 쾷; ) HANGUL SYLLABLE KOELH +CFB8;CFB8;110F 116C 11B7;CFB8;110F 116C 11B7; # (쾸; 쾸; 쾸; 쾸; 쾸; ) HANGUL SYLLABLE KOEM +CFB9;CFB9;110F 116C 11B8;CFB9;110F 116C 11B8; # (쾹; 쾹; 쾹; 쾹; 쾹; ) HANGUL SYLLABLE KOEB +CFBA;CFBA;110F 116C 11B9;CFBA;110F 116C 11B9; # (쾺; 쾺; 쾺; 쾺; 쾺; ) HANGUL SYLLABLE KOEBS +CFBB;CFBB;110F 116C 11BA;CFBB;110F 116C 11BA; # (쾻; 쾻; 쾻; 쾻; 쾻; ) HANGUL SYLLABLE KOES +CFBC;CFBC;110F 116C 11BB;CFBC;110F 116C 11BB; # (쾼; 쾼; 쾼; 쾼; 쾼; ) HANGUL SYLLABLE KOESS +CFBD;CFBD;110F 116C 11BC;CFBD;110F 116C 11BC; # (쾽; 쾽; 쾽; 쾽; 쾽; ) HANGUL SYLLABLE KOENG +CFBE;CFBE;110F 116C 11BD;CFBE;110F 116C 11BD; # (쾾; 쾾; 쾾; 쾾; 쾾; ) HANGUL SYLLABLE KOEJ +CFBF;CFBF;110F 116C 11BE;CFBF;110F 116C 11BE; # (쾿; 쾿; 쾿; 쾿; 쾿; ) HANGUL SYLLABLE KOEC +CFC0;CFC0;110F 116C 11BF;CFC0;110F 116C 11BF; # (쿀; 쿀; 쿀; 쿀; 쿀; ) HANGUL SYLLABLE KOEK +CFC1;CFC1;110F 116C 11C0;CFC1;110F 116C 11C0; # (쿁; 쿁; 쿁; 쿁; 쿁; ) HANGUL SYLLABLE KOET +CFC2;CFC2;110F 116C 11C1;CFC2;110F 116C 11C1; # (쿂; 쿂; 쿂; 쿂; 쿂; ) HANGUL SYLLABLE KOEP +CFC3;CFC3;110F 116C 11C2;CFC3;110F 116C 11C2; # (쿃; 쿃; 쿃; 쿃; 쿃; ) HANGUL SYLLABLE KOEH +CFC4;CFC4;110F 116D;CFC4;110F 116D; # (쿄; 쿄; 쿄; 쿄; 쿄; ) HANGUL SYLLABLE KYO +CFC5;CFC5;110F 116D 11A8;CFC5;110F 116D 11A8; # (쿅; 쿅; 쿅; 쿅; 쿅; ) HANGUL SYLLABLE KYOG +CFC6;CFC6;110F 116D 11A9;CFC6;110F 116D 11A9; # (쿆; 쿆; 쿆; 쿆; 쿆; ) HANGUL SYLLABLE KYOGG +CFC7;CFC7;110F 116D 11AA;CFC7;110F 116D 11AA; # (쿇; 쿇; 쿇; 쿇; 쿇; ) HANGUL SYLLABLE KYOGS +CFC8;CFC8;110F 116D 11AB;CFC8;110F 116D 11AB; # (쿈; 쿈; 쿈; 쿈; 쿈; ) HANGUL SYLLABLE KYON +CFC9;CFC9;110F 116D 11AC;CFC9;110F 116D 11AC; # (쿉; 쿉; 쿉; 쿉; 쿉; ) HANGUL SYLLABLE KYONJ +CFCA;CFCA;110F 116D 11AD;CFCA;110F 116D 11AD; # (쿊; 쿊; 쿊; 쿊; 쿊; ) HANGUL SYLLABLE KYONH +CFCB;CFCB;110F 116D 11AE;CFCB;110F 116D 11AE; # (쿋; 쿋; 쿋; 쿋; 쿋; ) HANGUL SYLLABLE KYOD +CFCC;CFCC;110F 116D 11AF;CFCC;110F 116D 11AF; # (쿌; 쿌; 쿌; 쿌; 쿌; ) HANGUL SYLLABLE KYOL +CFCD;CFCD;110F 116D 11B0;CFCD;110F 116D 11B0; # (쿍; 쿍; 쿍; 쿍; 쿍; ) HANGUL SYLLABLE KYOLG +CFCE;CFCE;110F 116D 11B1;CFCE;110F 116D 11B1; # (쿎; 쿎; 쿎; 쿎; 쿎; ) HANGUL SYLLABLE KYOLM +CFCF;CFCF;110F 116D 11B2;CFCF;110F 116D 11B2; # (쿏; 쿏; 쿏; 쿏; 쿏; ) HANGUL SYLLABLE KYOLB +CFD0;CFD0;110F 116D 11B3;CFD0;110F 116D 11B3; # (쿐; 쿐; 쿐; 쿐; 쿐; ) HANGUL SYLLABLE KYOLS +CFD1;CFD1;110F 116D 11B4;CFD1;110F 116D 11B4; # (쿑; 쿑; 쿑; 쿑; 쿑; ) HANGUL SYLLABLE KYOLT +CFD2;CFD2;110F 116D 11B5;CFD2;110F 116D 11B5; # (쿒; 쿒; 쿒; 쿒; 쿒; ) HANGUL SYLLABLE KYOLP +CFD3;CFD3;110F 116D 11B6;CFD3;110F 116D 11B6; # (쿓; 쿓; 쿓; 쿓; 쿓; ) HANGUL SYLLABLE KYOLH +CFD4;CFD4;110F 116D 11B7;CFD4;110F 116D 11B7; # (쿔; 쿔; 쿔; 쿔; 쿔; ) HANGUL SYLLABLE KYOM +CFD5;CFD5;110F 116D 11B8;CFD5;110F 116D 11B8; # (쿕; 쿕; 쿕; 쿕; 쿕; ) HANGUL SYLLABLE KYOB +CFD6;CFD6;110F 116D 11B9;CFD6;110F 116D 11B9; # (쿖; 쿖; 쿖; 쿖; 쿖; ) HANGUL SYLLABLE KYOBS +CFD7;CFD7;110F 116D 11BA;CFD7;110F 116D 11BA; # (쿗; 쿗; 쿗; 쿗; 쿗; ) HANGUL SYLLABLE KYOS +CFD8;CFD8;110F 116D 11BB;CFD8;110F 116D 11BB; # (쿘; 쿘; 쿘; 쿘; 쿘; ) HANGUL SYLLABLE KYOSS +CFD9;CFD9;110F 116D 11BC;CFD9;110F 116D 11BC; # (쿙; 쿙; 쿙; 쿙; 쿙; ) HANGUL SYLLABLE KYONG +CFDA;CFDA;110F 116D 11BD;CFDA;110F 116D 11BD; # (쿚; 쿚; 쿚; 쿚; 쿚; ) HANGUL SYLLABLE KYOJ +CFDB;CFDB;110F 116D 11BE;CFDB;110F 116D 11BE; # (쿛; 쿛; 쿛; 쿛; 쿛; ) HANGUL SYLLABLE KYOC +CFDC;CFDC;110F 116D 11BF;CFDC;110F 116D 11BF; # (쿜; 쿜; 쿜; 쿜; 쿜; ) HANGUL SYLLABLE KYOK +CFDD;CFDD;110F 116D 11C0;CFDD;110F 116D 11C0; # (쿝; 쿝; 쿝; 쿝; 쿝; ) HANGUL SYLLABLE KYOT +CFDE;CFDE;110F 116D 11C1;CFDE;110F 116D 11C1; # (쿞; 쿞; 쿞; 쿞; 쿞; ) HANGUL SYLLABLE KYOP +CFDF;CFDF;110F 116D 11C2;CFDF;110F 116D 11C2; # (쿟; 쿟; 쿟; 쿟; 쿟; ) HANGUL SYLLABLE KYOH +CFE0;CFE0;110F 116E;CFE0;110F 116E; # (쿠; 쿠; 쿠; 쿠; 쿠; ) HANGUL SYLLABLE KU +CFE1;CFE1;110F 116E 11A8;CFE1;110F 116E 11A8; # (쿡; 쿡; 쿡; 쿡; 쿡; ) HANGUL SYLLABLE KUG +CFE2;CFE2;110F 116E 11A9;CFE2;110F 116E 11A9; # (쿢; 쿢; 쿢; 쿢; 쿢; ) HANGUL SYLLABLE KUGG +CFE3;CFE3;110F 116E 11AA;CFE3;110F 116E 11AA; # (쿣; 쿣; 쿣; 쿣; 쿣; ) HANGUL SYLLABLE KUGS +CFE4;CFE4;110F 116E 11AB;CFE4;110F 116E 11AB; # (쿤; 쿤; 쿤; 쿤; 쿤; ) HANGUL SYLLABLE KUN +CFE5;CFE5;110F 116E 11AC;CFE5;110F 116E 11AC; # (쿥; 쿥; 쿥; 쿥; 쿥; ) HANGUL SYLLABLE KUNJ +CFE6;CFE6;110F 116E 11AD;CFE6;110F 116E 11AD; # (쿦; 쿦; 쿦; 쿦; 쿦; ) HANGUL SYLLABLE KUNH +CFE7;CFE7;110F 116E 11AE;CFE7;110F 116E 11AE; # (쿧; 쿧; 쿧; 쿧; 쿧; ) HANGUL SYLLABLE KUD +CFE8;CFE8;110F 116E 11AF;CFE8;110F 116E 11AF; # (쿨; 쿨; 쿨; 쿨; 쿨; ) HANGUL SYLLABLE KUL +CFE9;CFE9;110F 116E 11B0;CFE9;110F 116E 11B0; # (쿩; 쿩; 쿩; 쿩; 쿩; ) HANGUL SYLLABLE KULG +CFEA;CFEA;110F 116E 11B1;CFEA;110F 116E 11B1; # (쿪; 쿪; 쿪; 쿪; 쿪; ) HANGUL SYLLABLE KULM +CFEB;CFEB;110F 116E 11B2;CFEB;110F 116E 11B2; # (쿫; 쿫; 쿫; 쿫; 쿫; ) HANGUL SYLLABLE KULB +CFEC;CFEC;110F 116E 11B3;CFEC;110F 116E 11B3; # (쿬; 쿬; 쿬; 쿬; 쿬; ) HANGUL SYLLABLE KULS +CFED;CFED;110F 116E 11B4;CFED;110F 116E 11B4; # (쿭; 쿭; 쿭; 쿭; 쿭; ) HANGUL SYLLABLE KULT +CFEE;CFEE;110F 116E 11B5;CFEE;110F 116E 11B5; # (쿮; 쿮; 쿮; 쿮; 쿮; ) HANGUL SYLLABLE KULP +CFEF;CFEF;110F 116E 11B6;CFEF;110F 116E 11B6; # (쿯; 쿯; 쿯; 쿯; 쿯; ) HANGUL SYLLABLE KULH +CFF0;CFF0;110F 116E 11B7;CFF0;110F 116E 11B7; # (쿰; 쿰; 쿰; 쿰; 쿰; ) HANGUL SYLLABLE KUM +CFF1;CFF1;110F 116E 11B8;CFF1;110F 116E 11B8; # (쿱; 쿱; 쿱; 쿱; 쿱; ) HANGUL SYLLABLE KUB +CFF2;CFF2;110F 116E 11B9;CFF2;110F 116E 11B9; # (쿲; 쿲; 쿲; 쿲; 쿲; ) HANGUL SYLLABLE KUBS +CFF3;CFF3;110F 116E 11BA;CFF3;110F 116E 11BA; # (쿳; 쿳; 쿳; 쿳; 쿳; ) HANGUL SYLLABLE KUS +CFF4;CFF4;110F 116E 11BB;CFF4;110F 116E 11BB; # (쿴; 쿴; 쿴; 쿴; 쿴; ) HANGUL SYLLABLE KUSS +CFF5;CFF5;110F 116E 11BC;CFF5;110F 116E 11BC; # (쿵; 쿵; 쿵; 쿵; 쿵; ) HANGUL SYLLABLE KUNG +CFF6;CFF6;110F 116E 11BD;CFF6;110F 116E 11BD; # (쿶; 쿶; 쿶; 쿶; 쿶; ) HANGUL SYLLABLE KUJ +CFF7;CFF7;110F 116E 11BE;CFF7;110F 116E 11BE; # (쿷; 쿷; 쿷; 쿷; 쿷; ) HANGUL SYLLABLE KUC +CFF8;CFF8;110F 116E 11BF;CFF8;110F 116E 11BF; # (쿸; 쿸; 쿸; 쿸; 쿸; ) HANGUL SYLLABLE KUK +CFF9;CFF9;110F 116E 11C0;CFF9;110F 116E 11C0; # (쿹; 쿹; 쿹; 쿹; 쿹; ) HANGUL SYLLABLE KUT +CFFA;CFFA;110F 116E 11C1;CFFA;110F 116E 11C1; # (쿺; 쿺; 쿺; 쿺; 쿺; ) HANGUL SYLLABLE KUP +CFFB;CFFB;110F 116E 11C2;CFFB;110F 116E 11C2; # (쿻; 쿻; 쿻; 쿻; 쿻; ) HANGUL SYLLABLE KUH +CFFC;CFFC;110F 116F;CFFC;110F 116F; # (쿼; 쿼; 쿼; 쿼; 쿼; ) HANGUL SYLLABLE KWEO +CFFD;CFFD;110F 116F 11A8;CFFD;110F 116F 11A8; # (쿽; 쿽; 쿽; 쿽; 쿽; ) HANGUL SYLLABLE KWEOG +CFFE;CFFE;110F 116F 11A9;CFFE;110F 116F 11A9; # (쿾; 쿾; 쿾; 쿾; 쿾; ) HANGUL SYLLABLE KWEOGG +CFFF;CFFF;110F 116F 11AA;CFFF;110F 116F 11AA; # (쿿; 쿿; 쿿; 쿿; 쿿; ) HANGUL SYLLABLE KWEOGS +D000;D000;110F 116F 11AB;D000;110F 116F 11AB; # (퀀; 퀀; 퀀; 퀀; 퀀; ) HANGUL SYLLABLE KWEON +D001;D001;110F 116F 11AC;D001;110F 116F 11AC; # (퀁; 퀁; 퀁; 퀁; 퀁; ) HANGUL SYLLABLE KWEONJ +D002;D002;110F 116F 11AD;D002;110F 116F 11AD; # (퀂; 퀂; 퀂; 퀂; 퀂; ) HANGUL SYLLABLE KWEONH +D003;D003;110F 116F 11AE;D003;110F 116F 11AE; # (퀃; 퀃; 퀃; 퀃; 퀃; ) HANGUL SYLLABLE KWEOD +D004;D004;110F 116F 11AF;D004;110F 116F 11AF; # (퀄; 퀄; 퀄; 퀄; 퀄; ) HANGUL SYLLABLE KWEOL +D005;D005;110F 116F 11B0;D005;110F 116F 11B0; # (퀅; 퀅; 퀅; 퀅; 퀅; ) HANGUL SYLLABLE KWEOLG +D006;D006;110F 116F 11B1;D006;110F 116F 11B1; # (퀆; 퀆; 퀆; 퀆; 퀆; ) HANGUL SYLLABLE KWEOLM +D007;D007;110F 116F 11B2;D007;110F 116F 11B2; # (퀇; 퀇; 퀇; 퀇; 퀇; ) HANGUL SYLLABLE KWEOLB +D008;D008;110F 116F 11B3;D008;110F 116F 11B3; # (퀈; 퀈; 퀈; 퀈; 퀈; ) HANGUL SYLLABLE KWEOLS +D009;D009;110F 116F 11B4;D009;110F 116F 11B4; # (퀉; 퀉; 퀉; 퀉; 퀉; ) HANGUL SYLLABLE KWEOLT +D00A;D00A;110F 116F 11B5;D00A;110F 116F 11B5; # (퀊; 퀊; 퀊; 퀊; 퀊; ) HANGUL SYLLABLE KWEOLP +D00B;D00B;110F 116F 11B6;D00B;110F 116F 11B6; # (퀋; 퀋; 퀋; 퀋; 퀋; ) HANGUL SYLLABLE KWEOLH +D00C;D00C;110F 116F 11B7;D00C;110F 116F 11B7; # (퀌; 퀌; 퀌; 퀌; 퀌; ) HANGUL SYLLABLE KWEOM +D00D;D00D;110F 116F 11B8;D00D;110F 116F 11B8; # (퀍; 퀍; 퀍; 퀍; 퀍; ) HANGUL SYLLABLE KWEOB +D00E;D00E;110F 116F 11B9;D00E;110F 116F 11B9; # (퀎; 퀎; 퀎; 퀎; 퀎; ) HANGUL SYLLABLE KWEOBS +D00F;D00F;110F 116F 11BA;D00F;110F 116F 11BA; # (퀏; 퀏; 퀏; 퀏; 퀏; ) HANGUL SYLLABLE KWEOS +D010;D010;110F 116F 11BB;D010;110F 116F 11BB; # (퀐; 퀐; 퀐; 퀐; 퀐; ) HANGUL SYLLABLE KWEOSS +D011;D011;110F 116F 11BC;D011;110F 116F 11BC; # (퀑; 퀑; 퀑; 퀑; 퀑; ) HANGUL SYLLABLE KWEONG +D012;D012;110F 116F 11BD;D012;110F 116F 11BD; # (퀒; 퀒; 퀒; 퀒; 퀒; ) HANGUL SYLLABLE KWEOJ +D013;D013;110F 116F 11BE;D013;110F 116F 11BE; # (퀓; 퀓; 퀓; 퀓; 퀓; ) HANGUL SYLLABLE KWEOC +D014;D014;110F 116F 11BF;D014;110F 116F 11BF; # (퀔; 퀔; 퀔; 퀔; 퀔; ) HANGUL SYLLABLE KWEOK +D015;D015;110F 116F 11C0;D015;110F 116F 11C0; # (퀕; 퀕; 퀕; 퀕; 퀕; ) HANGUL SYLLABLE KWEOT +D016;D016;110F 116F 11C1;D016;110F 116F 11C1; # (퀖; 퀖; 퀖; 퀖; 퀖; ) HANGUL SYLLABLE KWEOP +D017;D017;110F 116F 11C2;D017;110F 116F 11C2; # (퀗; 퀗; 퀗; 퀗; 퀗; ) HANGUL SYLLABLE KWEOH +D018;D018;110F 1170;D018;110F 1170; # (퀘; 퀘; 퀘; 퀘; 퀘; ) HANGUL SYLLABLE KWE +D019;D019;110F 1170 11A8;D019;110F 1170 11A8; # (퀙; 퀙; 퀙; 퀙; 퀙; ) HANGUL SYLLABLE KWEG +D01A;D01A;110F 1170 11A9;D01A;110F 1170 11A9; # (퀚; 퀚; 퀚; 퀚; 퀚; ) HANGUL SYLLABLE KWEGG +D01B;D01B;110F 1170 11AA;D01B;110F 1170 11AA; # (퀛; 퀛; 퀛; 퀛; 퀛; ) HANGUL SYLLABLE KWEGS +D01C;D01C;110F 1170 11AB;D01C;110F 1170 11AB; # (퀜; 퀜; 퀜; 퀜; 퀜; ) HANGUL SYLLABLE KWEN +D01D;D01D;110F 1170 11AC;D01D;110F 1170 11AC; # (퀝; 퀝; 퀝; 퀝; 퀝; ) HANGUL SYLLABLE KWENJ +D01E;D01E;110F 1170 11AD;D01E;110F 1170 11AD; # (퀞; 퀞; 퀞; 퀞; 퀞; ) HANGUL SYLLABLE KWENH +D01F;D01F;110F 1170 11AE;D01F;110F 1170 11AE; # (퀟; 퀟; 퀟; 퀟; 퀟; ) HANGUL SYLLABLE KWED +D020;D020;110F 1170 11AF;D020;110F 1170 11AF; # (퀠; 퀠; 퀠; 퀠; 퀠; ) HANGUL SYLLABLE KWEL +D021;D021;110F 1170 11B0;D021;110F 1170 11B0; # (퀡; 퀡; 퀡; 퀡; 퀡; ) HANGUL SYLLABLE KWELG +D022;D022;110F 1170 11B1;D022;110F 1170 11B1; # (퀢; 퀢; 퀢; 퀢; 퀢; ) HANGUL SYLLABLE KWELM +D023;D023;110F 1170 11B2;D023;110F 1170 11B2; # (퀣; 퀣; 퀣; 퀣; 퀣; ) HANGUL SYLLABLE KWELB +D024;D024;110F 1170 11B3;D024;110F 1170 11B3; # (퀤; 퀤; 퀤; 퀤; 퀤; ) HANGUL SYLLABLE KWELS +D025;D025;110F 1170 11B4;D025;110F 1170 11B4; # (퀥; 퀥; 퀥; 퀥; 퀥; ) HANGUL SYLLABLE KWELT +D026;D026;110F 1170 11B5;D026;110F 1170 11B5; # (퀦; 퀦; 퀦; 퀦; 퀦; ) HANGUL SYLLABLE KWELP +D027;D027;110F 1170 11B6;D027;110F 1170 11B6; # (퀧; 퀧; 퀧; 퀧; 퀧; ) HANGUL SYLLABLE KWELH +D028;D028;110F 1170 11B7;D028;110F 1170 11B7; # (퀨; 퀨; 퀨; 퀨; 퀨; ) HANGUL SYLLABLE KWEM +D029;D029;110F 1170 11B8;D029;110F 1170 11B8; # (퀩; 퀩; 퀩; 퀩; 퀩; ) HANGUL SYLLABLE KWEB +D02A;D02A;110F 1170 11B9;D02A;110F 1170 11B9; # (퀪; 퀪; 퀪; 퀪; 퀪; ) HANGUL SYLLABLE KWEBS +D02B;D02B;110F 1170 11BA;D02B;110F 1170 11BA; # (퀫; 퀫; 퀫; 퀫; 퀫; ) HANGUL SYLLABLE KWES +D02C;D02C;110F 1170 11BB;D02C;110F 1170 11BB; # (퀬; 퀬; 퀬; 퀬; 퀬; ) HANGUL SYLLABLE KWESS +D02D;D02D;110F 1170 11BC;D02D;110F 1170 11BC; # (퀭; 퀭; 퀭; 퀭; 퀭; ) HANGUL SYLLABLE KWENG +D02E;D02E;110F 1170 11BD;D02E;110F 1170 11BD; # (퀮; 퀮; 퀮; 퀮; 퀮; ) HANGUL SYLLABLE KWEJ +D02F;D02F;110F 1170 11BE;D02F;110F 1170 11BE; # (퀯; 퀯; 퀯; 퀯; 퀯; ) HANGUL SYLLABLE KWEC +D030;D030;110F 1170 11BF;D030;110F 1170 11BF; # (퀰; 퀰; 퀰; 퀰; 퀰; ) HANGUL SYLLABLE KWEK +D031;D031;110F 1170 11C0;D031;110F 1170 11C0; # (퀱; 퀱; 퀱; 퀱; 퀱; ) HANGUL SYLLABLE KWET +D032;D032;110F 1170 11C1;D032;110F 1170 11C1; # (퀲; 퀲; 퀲; 퀲; 퀲; ) HANGUL SYLLABLE KWEP +D033;D033;110F 1170 11C2;D033;110F 1170 11C2; # (퀳; 퀳; 퀳; 퀳; 퀳; ) HANGUL SYLLABLE KWEH +D034;D034;110F 1171;D034;110F 1171; # (퀴; 퀴; 퀴; 퀴; 퀴; ) HANGUL SYLLABLE KWI +D035;D035;110F 1171 11A8;D035;110F 1171 11A8; # (퀵; 퀵; 퀵; 퀵; 퀵; ) HANGUL SYLLABLE KWIG +D036;D036;110F 1171 11A9;D036;110F 1171 11A9; # (퀶; 퀶; 퀶; 퀶; 퀶; ) HANGUL SYLLABLE KWIGG +D037;D037;110F 1171 11AA;D037;110F 1171 11AA; # (퀷; 퀷; 퀷; 퀷; 퀷; ) HANGUL SYLLABLE KWIGS +D038;D038;110F 1171 11AB;D038;110F 1171 11AB; # (퀸; 퀸; 퀸; 퀸; 퀸; ) HANGUL SYLLABLE KWIN +D039;D039;110F 1171 11AC;D039;110F 1171 11AC; # (퀹; 퀹; 퀹; 퀹; 퀹; ) HANGUL SYLLABLE KWINJ +D03A;D03A;110F 1171 11AD;D03A;110F 1171 11AD; # (퀺; 퀺; 퀺; 퀺; 퀺; ) HANGUL SYLLABLE KWINH +D03B;D03B;110F 1171 11AE;D03B;110F 1171 11AE; # (퀻; 퀻; 퀻; 퀻; 퀻; ) HANGUL SYLLABLE KWID +D03C;D03C;110F 1171 11AF;D03C;110F 1171 11AF; # (퀼; 퀼; 퀼; 퀼; 퀼; ) HANGUL SYLLABLE KWIL +D03D;D03D;110F 1171 11B0;D03D;110F 1171 11B0; # (퀽; 퀽; 퀽; 퀽; 퀽; ) HANGUL SYLLABLE KWILG +D03E;D03E;110F 1171 11B1;D03E;110F 1171 11B1; # (퀾; 퀾; 퀾; 퀾; 퀾; ) HANGUL SYLLABLE KWILM +D03F;D03F;110F 1171 11B2;D03F;110F 1171 11B2; # (퀿; 퀿; 퀿; 퀿; 퀿; ) HANGUL SYLLABLE KWILB +D040;D040;110F 1171 11B3;D040;110F 1171 11B3; # (큀; 큀; 큀; 큀; 큀; ) HANGUL SYLLABLE KWILS +D041;D041;110F 1171 11B4;D041;110F 1171 11B4; # (큁; 큁; 큁; 큁; 큁; ) HANGUL SYLLABLE KWILT +D042;D042;110F 1171 11B5;D042;110F 1171 11B5; # (큂; 큂; 큂; 큂; 큂; ) HANGUL SYLLABLE KWILP +D043;D043;110F 1171 11B6;D043;110F 1171 11B6; # (큃; 큃; 큃; 큃; 큃; ) HANGUL SYLLABLE KWILH +D044;D044;110F 1171 11B7;D044;110F 1171 11B7; # (큄; 큄; 큄; 큄; 큄; ) HANGUL SYLLABLE KWIM +D045;D045;110F 1171 11B8;D045;110F 1171 11B8; # (큅; 큅; 큅; 큅; 큅; ) HANGUL SYLLABLE KWIB +D046;D046;110F 1171 11B9;D046;110F 1171 11B9; # (큆; 큆; 큆; 큆; 큆; ) HANGUL SYLLABLE KWIBS +D047;D047;110F 1171 11BA;D047;110F 1171 11BA; # (큇; 큇; 큇; 큇; 큇; ) HANGUL SYLLABLE KWIS +D048;D048;110F 1171 11BB;D048;110F 1171 11BB; # (큈; 큈; 큈; 큈; 큈; ) HANGUL SYLLABLE KWISS +D049;D049;110F 1171 11BC;D049;110F 1171 11BC; # (큉; 큉; 큉; 큉; 큉; ) HANGUL SYLLABLE KWING +D04A;D04A;110F 1171 11BD;D04A;110F 1171 11BD; # (큊; 큊; 큊; 큊; 큊; ) HANGUL SYLLABLE KWIJ +D04B;D04B;110F 1171 11BE;D04B;110F 1171 11BE; # (큋; 큋; 큋; 큋; 큋; ) HANGUL SYLLABLE KWIC +D04C;D04C;110F 1171 11BF;D04C;110F 1171 11BF; # (큌; 큌; 큌; 큌; 큌; ) HANGUL SYLLABLE KWIK +D04D;D04D;110F 1171 11C0;D04D;110F 1171 11C0; # (큍; 큍; 큍; 큍; 큍; ) HANGUL SYLLABLE KWIT +D04E;D04E;110F 1171 11C1;D04E;110F 1171 11C1; # (큎; 큎; 큎; 큎; 큎; ) HANGUL SYLLABLE KWIP +D04F;D04F;110F 1171 11C2;D04F;110F 1171 11C2; # (큏; 큏; 큏; 큏; 큏; ) HANGUL SYLLABLE KWIH +D050;D050;110F 1172;D050;110F 1172; # (큐; 큐; 큐; 큐; 큐; ) HANGUL SYLLABLE KYU +D051;D051;110F 1172 11A8;D051;110F 1172 11A8; # (큑; 큑; 큑; 큑; 큑; ) HANGUL SYLLABLE KYUG +D052;D052;110F 1172 11A9;D052;110F 1172 11A9; # (큒; 큒; 큒; 큒; 큒; ) HANGUL SYLLABLE KYUGG +D053;D053;110F 1172 11AA;D053;110F 1172 11AA; # (큓; 큓; 큓; 큓; 큓; ) HANGUL SYLLABLE KYUGS +D054;D054;110F 1172 11AB;D054;110F 1172 11AB; # (큔; 큔; 큔; 큔; 큔; ) HANGUL SYLLABLE KYUN +D055;D055;110F 1172 11AC;D055;110F 1172 11AC; # (큕; 큕; 큕; 큕; 큕; ) HANGUL SYLLABLE KYUNJ +D056;D056;110F 1172 11AD;D056;110F 1172 11AD; # (큖; 큖; 큖; 큖; 큖; ) HANGUL SYLLABLE KYUNH +D057;D057;110F 1172 11AE;D057;110F 1172 11AE; # (큗; 큗; 큗; 큗; 큗; ) HANGUL SYLLABLE KYUD +D058;D058;110F 1172 11AF;D058;110F 1172 11AF; # (큘; 큘; 큘; 큘; 큘; ) HANGUL SYLLABLE KYUL +D059;D059;110F 1172 11B0;D059;110F 1172 11B0; # (큙; 큙; 큙; 큙; 큙; ) HANGUL SYLLABLE KYULG +D05A;D05A;110F 1172 11B1;D05A;110F 1172 11B1; # (큚; 큚; 큚; 큚; 큚; ) HANGUL SYLLABLE KYULM +D05B;D05B;110F 1172 11B2;D05B;110F 1172 11B2; # (큛; 큛; 큛; 큛; 큛; ) HANGUL SYLLABLE KYULB +D05C;D05C;110F 1172 11B3;D05C;110F 1172 11B3; # (큜; 큜; 큜; 큜; 큜; ) HANGUL SYLLABLE KYULS +D05D;D05D;110F 1172 11B4;D05D;110F 1172 11B4; # (큝; 큝; 큝; 큝; 큝; ) HANGUL SYLLABLE KYULT +D05E;D05E;110F 1172 11B5;D05E;110F 1172 11B5; # (큞; 큞; 큞; 큞; 큞; ) HANGUL SYLLABLE KYULP +D05F;D05F;110F 1172 11B6;D05F;110F 1172 11B6; # (큟; 큟; 큟; 큟; 큟; ) HANGUL SYLLABLE KYULH +D060;D060;110F 1172 11B7;D060;110F 1172 11B7; # (큠; 큠; 큠; 큠; 큠; ) HANGUL SYLLABLE KYUM +D061;D061;110F 1172 11B8;D061;110F 1172 11B8; # (큡; 큡; 큡; 큡; 큡; ) HANGUL SYLLABLE KYUB +D062;D062;110F 1172 11B9;D062;110F 1172 11B9; # (큢; 큢; 큢; 큢; 큢; ) HANGUL SYLLABLE KYUBS +D063;D063;110F 1172 11BA;D063;110F 1172 11BA; # (큣; 큣; 큣; 큣; 큣; ) HANGUL SYLLABLE KYUS +D064;D064;110F 1172 11BB;D064;110F 1172 11BB; # (큤; 큤; 큤; 큤; 큤; ) HANGUL SYLLABLE KYUSS +D065;D065;110F 1172 11BC;D065;110F 1172 11BC; # (큥; 큥; 큥; 큥; 큥; ) HANGUL SYLLABLE KYUNG +D066;D066;110F 1172 11BD;D066;110F 1172 11BD; # (큦; 큦; 큦; 큦; 큦; ) HANGUL SYLLABLE KYUJ +D067;D067;110F 1172 11BE;D067;110F 1172 11BE; # (큧; 큧; 큧; 큧; 큧; ) HANGUL SYLLABLE KYUC +D068;D068;110F 1172 11BF;D068;110F 1172 11BF; # (큨; 큨; 큨; 큨; 큨; ) HANGUL SYLLABLE KYUK +D069;D069;110F 1172 11C0;D069;110F 1172 11C0; # (큩; 큩; 큩; 큩; 큩; ) HANGUL SYLLABLE KYUT +D06A;D06A;110F 1172 11C1;D06A;110F 1172 11C1; # (큪; 큪; 큪; 큪; 큪; ) HANGUL SYLLABLE KYUP +D06B;D06B;110F 1172 11C2;D06B;110F 1172 11C2; # (큫; 큫; 큫; 큫; 큫; ) HANGUL SYLLABLE KYUH +D06C;D06C;110F 1173;D06C;110F 1173; # (크; 크; 크; 크; 크; ) HANGUL SYLLABLE KEU +D06D;D06D;110F 1173 11A8;D06D;110F 1173 11A8; # (큭; 큭; 큭; 큭; 큭; ) HANGUL SYLLABLE KEUG +D06E;D06E;110F 1173 11A9;D06E;110F 1173 11A9; # (큮; 큮; 큮; 큮; 큮; ) HANGUL SYLLABLE KEUGG +D06F;D06F;110F 1173 11AA;D06F;110F 1173 11AA; # (큯; 큯; 큯; 큯; 큯; ) HANGUL SYLLABLE KEUGS +D070;D070;110F 1173 11AB;D070;110F 1173 11AB; # (큰; 큰; 큰; 큰; 큰; ) HANGUL SYLLABLE KEUN +D071;D071;110F 1173 11AC;D071;110F 1173 11AC; # (큱; 큱; 큱; 큱; 큱; ) HANGUL SYLLABLE KEUNJ +D072;D072;110F 1173 11AD;D072;110F 1173 11AD; # (큲; 큲; 큲; 큲; 큲; ) HANGUL SYLLABLE KEUNH +D073;D073;110F 1173 11AE;D073;110F 1173 11AE; # (큳; 큳; 큳; 큳; 큳; ) HANGUL SYLLABLE KEUD +D074;D074;110F 1173 11AF;D074;110F 1173 11AF; # (클; 클; 클; 클; 클; ) HANGUL SYLLABLE KEUL +D075;D075;110F 1173 11B0;D075;110F 1173 11B0; # (큵; 큵; 큵; 큵; 큵; ) HANGUL SYLLABLE KEULG +D076;D076;110F 1173 11B1;D076;110F 1173 11B1; # (큶; 큶; 큶; 큶; 큶; ) HANGUL SYLLABLE KEULM +D077;D077;110F 1173 11B2;D077;110F 1173 11B2; # (큷; 큷; 큷; 큷; 큷; ) HANGUL SYLLABLE KEULB +D078;D078;110F 1173 11B3;D078;110F 1173 11B3; # (큸; 큸; 큸; 큸; 큸; ) HANGUL SYLLABLE KEULS +D079;D079;110F 1173 11B4;D079;110F 1173 11B4; # (큹; 큹; 큹; 큹; 큹; ) HANGUL SYLLABLE KEULT +D07A;D07A;110F 1173 11B5;D07A;110F 1173 11B5; # (큺; 큺; 큺; 큺; 큺; ) HANGUL SYLLABLE KEULP +D07B;D07B;110F 1173 11B6;D07B;110F 1173 11B6; # (큻; 큻; 큻; 큻; 큻; ) HANGUL SYLLABLE KEULH +D07C;D07C;110F 1173 11B7;D07C;110F 1173 11B7; # (큼; 큼; 큼; 큼; 큼; ) HANGUL SYLLABLE KEUM +D07D;D07D;110F 1173 11B8;D07D;110F 1173 11B8; # (큽; 큽; 큽; 큽; 큽; ) HANGUL SYLLABLE KEUB +D07E;D07E;110F 1173 11B9;D07E;110F 1173 11B9; # (큾; 큾; 큾; 큾; 큾; ) HANGUL SYLLABLE KEUBS +D07F;D07F;110F 1173 11BA;D07F;110F 1173 11BA; # (큿; 큿; 큿; 큿; 큿; ) HANGUL SYLLABLE KEUS +D080;D080;110F 1173 11BB;D080;110F 1173 11BB; # (킀; 킀; 킀; 킀; 킀; ) HANGUL SYLLABLE KEUSS +D081;D081;110F 1173 11BC;D081;110F 1173 11BC; # (킁; 킁; 킁; 킁; 킁; ) HANGUL SYLLABLE KEUNG +D082;D082;110F 1173 11BD;D082;110F 1173 11BD; # (킂; 킂; 킂; 킂; 킂; ) HANGUL SYLLABLE KEUJ +D083;D083;110F 1173 11BE;D083;110F 1173 11BE; # (킃; 킃; 킃; 킃; 킃; ) HANGUL SYLLABLE KEUC +D084;D084;110F 1173 11BF;D084;110F 1173 11BF; # (킄; 킄; 킄; 킄; 킄; ) HANGUL SYLLABLE KEUK +D085;D085;110F 1173 11C0;D085;110F 1173 11C0; # (킅; 킅; 킅; 킅; 킅; ) HANGUL SYLLABLE KEUT +D086;D086;110F 1173 11C1;D086;110F 1173 11C1; # (킆; 킆; 킆; 킆; 킆; ) HANGUL SYLLABLE KEUP +D087;D087;110F 1173 11C2;D087;110F 1173 11C2; # (킇; 킇; 킇; 킇; 킇; ) HANGUL SYLLABLE KEUH +D088;D088;110F 1174;D088;110F 1174; # (킈; 킈; 킈; 킈; 킈; ) HANGUL SYLLABLE KYI +D089;D089;110F 1174 11A8;D089;110F 1174 11A8; # (킉; 킉; 킉; 킉; 킉; ) HANGUL SYLLABLE KYIG +D08A;D08A;110F 1174 11A9;D08A;110F 1174 11A9; # (킊; 킊; 킊; 킊; 킊; ) HANGUL SYLLABLE KYIGG +D08B;D08B;110F 1174 11AA;D08B;110F 1174 11AA; # (킋; 킋; 킋; 킋; 킋; ) HANGUL SYLLABLE KYIGS +D08C;D08C;110F 1174 11AB;D08C;110F 1174 11AB; # (킌; 킌; 킌; 킌; 킌; ) HANGUL SYLLABLE KYIN +D08D;D08D;110F 1174 11AC;D08D;110F 1174 11AC; # (킍; 킍; 킍; 킍; 킍; ) HANGUL SYLLABLE KYINJ +D08E;D08E;110F 1174 11AD;D08E;110F 1174 11AD; # (킎; 킎; 킎; 킎; 킎; ) HANGUL SYLLABLE KYINH +D08F;D08F;110F 1174 11AE;D08F;110F 1174 11AE; # (킏; 킏; 킏; 킏; 킏; ) HANGUL SYLLABLE KYID +D090;D090;110F 1174 11AF;D090;110F 1174 11AF; # (킐; 킐; 킐; 킐; 킐; ) HANGUL SYLLABLE KYIL +D091;D091;110F 1174 11B0;D091;110F 1174 11B0; # (킑; 킑; 킑; 킑; 킑; ) HANGUL SYLLABLE KYILG +D092;D092;110F 1174 11B1;D092;110F 1174 11B1; # (킒; 킒; 킒; 킒; 킒; ) HANGUL SYLLABLE KYILM +D093;D093;110F 1174 11B2;D093;110F 1174 11B2; # (킓; 킓; 킓; 킓; 킓; ) HANGUL SYLLABLE KYILB +D094;D094;110F 1174 11B3;D094;110F 1174 11B3; # (킔; 킔; 킔; 킔; 킔; ) HANGUL SYLLABLE KYILS +D095;D095;110F 1174 11B4;D095;110F 1174 11B4; # (킕; 킕; 킕; 킕; 킕; ) HANGUL SYLLABLE KYILT +D096;D096;110F 1174 11B5;D096;110F 1174 11B5; # (킖; 킖; 킖; 킖; 킖; ) HANGUL SYLLABLE KYILP +D097;D097;110F 1174 11B6;D097;110F 1174 11B6; # (킗; 킗; 킗; 킗; 킗; ) HANGUL SYLLABLE KYILH +D098;D098;110F 1174 11B7;D098;110F 1174 11B7; # (킘; 킘; 킘; 킘; 킘; ) HANGUL SYLLABLE KYIM +D099;D099;110F 1174 11B8;D099;110F 1174 11B8; # (킙; 킙; 킙; 킙; 킙; ) HANGUL SYLLABLE KYIB +D09A;D09A;110F 1174 11B9;D09A;110F 1174 11B9; # (킚; 킚; 킚; 킚; 킚; ) HANGUL SYLLABLE KYIBS +D09B;D09B;110F 1174 11BA;D09B;110F 1174 11BA; # (킛; 킛; 킛; 킛; 킛; ) HANGUL SYLLABLE KYIS +D09C;D09C;110F 1174 11BB;D09C;110F 1174 11BB; # (킜; 킜; 킜; 킜; 킜; ) HANGUL SYLLABLE KYISS +D09D;D09D;110F 1174 11BC;D09D;110F 1174 11BC; # (킝; 킝; 킝; 킝; 킝; ) HANGUL SYLLABLE KYING +D09E;D09E;110F 1174 11BD;D09E;110F 1174 11BD; # (킞; 킞; 킞; 킞; 킞; ) HANGUL SYLLABLE KYIJ +D09F;D09F;110F 1174 11BE;D09F;110F 1174 11BE; # (킟; 킟; 킟; 킟; 킟; ) HANGUL SYLLABLE KYIC +D0A0;D0A0;110F 1174 11BF;D0A0;110F 1174 11BF; # (킠; 킠; 킠; 킠; 킠; ) HANGUL SYLLABLE KYIK +D0A1;D0A1;110F 1174 11C0;D0A1;110F 1174 11C0; # (킡; 킡; 킡; 킡; 킡; ) HANGUL SYLLABLE KYIT +D0A2;D0A2;110F 1174 11C1;D0A2;110F 1174 11C1; # (킢; 킢; 킢; 킢; 킢; ) HANGUL SYLLABLE KYIP +D0A3;D0A3;110F 1174 11C2;D0A3;110F 1174 11C2; # (킣; 킣; 킣; 킣; 킣; ) HANGUL SYLLABLE KYIH +D0A4;D0A4;110F 1175;D0A4;110F 1175; # (키; 키; 키; 키; 키; ) HANGUL SYLLABLE KI +D0A5;D0A5;110F 1175 11A8;D0A5;110F 1175 11A8; # (킥; 킥; 킥; 킥; 킥; ) HANGUL SYLLABLE KIG +D0A6;D0A6;110F 1175 11A9;D0A6;110F 1175 11A9; # (킦; 킦; 킦; 킦; 킦; ) HANGUL SYLLABLE KIGG +D0A7;D0A7;110F 1175 11AA;D0A7;110F 1175 11AA; # (킧; 킧; 킧; 킧; 킧; ) HANGUL SYLLABLE KIGS +D0A8;D0A8;110F 1175 11AB;D0A8;110F 1175 11AB; # (킨; 킨; 킨; 킨; 킨; ) HANGUL SYLLABLE KIN +D0A9;D0A9;110F 1175 11AC;D0A9;110F 1175 11AC; # (킩; 킩; 킩; 킩; 킩; ) HANGUL SYLLABLE KINJ +D0AA;D0AA;110F 1175 11AD;D0AA;110F 1175 11AD; # (킪; 킪; 킪; 킪; 킪; ) HANGUL SYLLABLE KINH +D0AB;D0AB;110F 1175 11AE;D0AB;110F 1175 11AE; # (킫; 킫; 킫; 킫; 킫; ) HANGUL SYLLABLE KID +D0AC;D0AC;110F 1175 11AF;D0AC;110F 1175 11AF; # (킬; 킬; 킬; 킬; 킬; ) HANGUL SYLLABLE KIL +D0AD;D0AD;110F 1175 11B0;D0AD;110F 1175 11B0; # (킭; 킭; 킭; 킭; 킭; ) HANGUL SYLLABLE KILG +D0AE;D0AE;110F 1175 11B1;D0AE;110F 1175 11B1; # (킮; 킮; 킮; 킮; 킮; ) HANGUL SYLLABLE KILM +D0AF;D0AF;110F 1175 11B2;D0AF;110F 1175 11B2; # (킯; 킯; 킯; 킯; 킯; ) HANGUL SYLLABLE KILB +D0B0;D0B0;110F 1175 11B3;D0B0;110F 1175 11B3; # (킰; 킰; 킰; 킰; 킰; ) HANGUL SYLLABLE KILS +D0B1;D0B1;110F 1175 11B4;D0B1;110F 1175 11B4; # (킱; 킱; 킱; 킱; 킱; ) HANGUL SYLLABLE KILT +D0B2;D0B2;110F 1175 11B5;D0B2;110F 1175 11B5; # (킲; 킲; 킲; 킲; 킲; ) HANGUL SYLLABLE KILP +D0B3;D0B3;110F 1175 11B6;D0B3;110F 1175 11B6; # (킳; 킳; 킳; 킳; 킳; ) HANGUL SYLLABLE KILH +D0B4;D0B4;110F 1175 11B7;D0B4;110F 1175 11B7; # (킴; 킴; 킴; 킴; 킴; ) HANGUL SYLLABLE KIM +D0B5;D0B5;110F 1175 11B8;D0B5;110F 1175 11B8; # (킵; 킵; 킵; 킵; 킵; ) HANGUL SYLLABLE KIB +D0B6;D0B6;110F 1175 11B9;D0B6;110F 1175 11B9; # (킶; 킶; 킶; 킶; 킶; ) HANGUL SYLLABLE KIBS +D0B7;D0B7;110F 1175 11BA;D0B7;110F 1175 11BA; # (킷; 킷; 킷; 킷; 킷; ) HANGUL SYLLABLE KIS +D0B8;D0B8;110F 1175 11BB;D0B8;110F 1175 11BB; # (킸; 킸; 킸; 킸; 킸; ) HANGUL SYLLABLE KISS +D0B9;D0B9;110F 1175 11BC;D0B9;110F 1175 11BC; # (킹; 킹; 킹; 킹; 킹; ) HANGUL SYLLABLE KING +D0BA;D0BA;110F 1175 11BD;D0BA;110F 1175 11BD; # (킺; 킺; 킺; 킺; 킺; ) HANGUL SYLLABLE KIJ +D0BB;D0BB;110F 1175 11BE;D0BB;110F 1175 11BE; # (킻; 킻; 킻; 킻; 킻; ) HANGUL SYLLABLE KIC +D0BC;D0BC;110F 1175 11BF;D0BC;110F 1175 11BF; # (킼; 킼; 킼; 킼; 킼; ) HANGUL SYLLABLE KIK +D0BD;D0BD;110F 1175 11C0;D0BD;110F 1175 11C0; # (킽; 킽; 킽; 킽; 킽; ) HANGUL SYLLABLE KIT +D0BE;D0BE;110F 1175 11C1;D0BE;110F 1175 11C1; # (킾; 킾; 킾; 킾; 킾; ) HANGUL SYLLABLE KIP +D0BF;D0BF;110F 1175 11C2;D0BF;110F 1175 11C2; # (킿; 킿; 킿; 킿; 킿; ) HANGUL SYLLABLE KIH +D0C0;D0C0;1110 1161;D0C0;1110 1161; # (타; 타; 타; 타; 타; ) HANGUL SYLLABLE TA +D0C1;D0C1;1110 1161 11A8;D0C1;1110 1161 11A8; # (탁; 탁; 탁; 탁; 탁; ) HANGUL SYLLABLE TAG +D0C2;D0C2;1110 1161 11A9;D0C2;1110 1161 11A9; # (탂; 탂; 탂; 탂; 탂; ) HANGUL SYLLABLE TAGG +D0C3;D0C3;1110 1161 11AA;D0C3;1110 1161 11AA; # (탃; 탃; 탃; 탃; 탃; ) HANGUL SYLLABLE TAGS +D0C4;D0C4;1110 1161 11AB;D0C4;1110 1161 11AB; # (탄; 탄; 탄; 탄; 탄; ) HANGUL SYLLABLE TAN +D0C5;D0C5;1110 1161 11AC;D0C5;1110 1161 11AC; # (탅; 탅; 탅; 탅; 탅; ) HANGUL SYLLABLE TANJ +D0C6;D0C6;1110 1161 11AD;D0C6;1110 1161 11AD; # (탆; 탆; 탆; 탆; 탆; ) HANGUL SYLLABLE TANH +D0C7;D0C7;1110 1161 11AE;D0C7;1110 1161 11AE; # (탇; 탇; 탇; 탇; 탇; ) HANGUL SYLLABLE TAD +D0C8;D0C8;1110 1161 11AF;D0C8;1110 1161 11AF; # (탈; 탈; 탈; 탈; 탈; ) HANGUL SYLLABLE TAL +D0C9;D0C9;1110 1161 11B0;D0C9;1110 1161 11B0; # (탉; 탉; 탉; 탉; 탉; ) HANGUL SYLLABLE TALG +D0CA;D0CA;1110 1161 11B1;D0CA;1110 1161 11B1; # (탊; 탊; 탊; 탊; 탊; ) HANGUL SYLLABLE TALM +D0CB;D0CB;1110 1161 11B2;D0CB;1110 1161 11B2; # (탋; 탋; 탋; 탋; 탋; ) HANGUL SYLLABLE TALB +D0CC;D0CC;1110 1161 11B3;D0CC;1110 1161 11B3; # (탌; 탌; 탌; 탌; 탌; ) HANGUL SYLLABLE TALS +D0CD;D0CD;1110 1161 11B4;D0CD;1110 1161 11B4; # (탍; 탍; 탍; 탍; 탍; ) HANGUL SYLLABLE TALT +D0CE;D0CE;1110 1161 11B5;D0CE;1110 1161 11B5; # (탎; 탎; 탎; 탎; 탎; ) HANGUL SYLLABLE TALP +D0CF;D0CF;1110 1161 11B6;D0CF;1110 1161 11B6; # (탏; 탏; 탏; 탏; 탏; ) HANGUL SYLLABLE TALH +D0D0;D0D0;1110 1161 11B7;D0D0;1110 1161 11B7; # (탐; 탐; 탐; 탐; 탐; ) HANGUL SYLLABLE TAM +D0D1;D0D1;1110 1161 11B8;D0D1;1110 1161 11B8; # (탑; 탑; 탑; 탑; 탑; ) HANGUL SYLLABLE TAB +D0D2;D0D2;1110 1161 11B9;D0D2;1110 1161 11B9; # (탒; 탒; 탒; 탒; 탒; ) HANGUL SYLLABLE TABS +D0D3;D0D3;1110 1161 11BA;D0D3;1110 1161 11BA; # (탓; 탓; 탓; 탓; 탓; ) HANGUL SYLLABLE TAS +D0D4;D0D4;1110 1161 11BB;D0D4;1110 1161 11BB; # (탔; 탔; 탔; 탔; 탔; ) HANGUL SYLLABLE TASS +D0D5;D0D5;1110 1161 11BC;D0D5;1110 1161 11BC; # (탕; 탕; 탕; 탕; 탕; ) HANGUL SYLLABLE TANG +D0D6;D0D6;1110 1161 11BD;D0D6;1110 1161 11BD; # (탖; 탖; 탖; 탖; 탖; ) HANGUL SYLLABLE TAJ +D0D7;D0D7;1110 1161 11BE;D0D7;1110 1161 11BE; # (탗; 탗; 탗; 탗; 탗; ) HANGUL SYLLABLE TAC +D0D8;D0D8;1110 1161 11BF;D0D8;1110 1161 11BF; # (탘; 탘; 탘; 탘; 탘; ) HANGUL SYLLABLE TAK +D0D9;D0D9;1110 1161 11C0;D0D9;1110 1161 11C0; # (탙; 탙; 탙; 탙; 탙; ) HANGUL SYLLABLE TAT +D0DA;D0DA;1110 1161 11C1;D0DA;1110 1161 11C1; # (탚; 탚; 탚; 탚; 탚; ) HANGUL SYLLABLE TAP +D0DB;D0DB;1110 1161 11C2;D0DB;1110 1161 11C2; # (탛; 탛; 탛; 탛; 탛; ) HANGUL SYLLABLE TAH +D0DC;D0DC;1110 1162;D0DC;1110 1162; # (태; 태; 태; 태; 태; ) HANGUL SYLLABLE TAE +D0DD;D0DD;1110 1162 11A8;D0DD;1110 1162 11A8; # (택; 택; 택; 택; 택; ) HANGUL SYLLABLE TAEG +D0DE;D0DE;1110 1162 11A9;D0DE;1110 1162 11A9; # (탞; 탞; 탞; 탞; 탞; ) HANGUL SYLLABLE TAEGG +D0DF;D0DF;1110 1162 11AA;D0DF;1110 1162 11AA; # (탟; 탟; 탟; 탟; 탟; ) HANGUL SYLLABLE TAEGS +D0E0;D0E0;1110 1162 11AB;D0E0;1110 1162 11AB; # (탠; 탠; 탠; 탠; 탠; ) HANGUL SYLLABLE TAEN +D0E1;D0E1;1110 1162 11AC;D0E1;1110 1162 11AC; # (탡; 탡; 탡; 탡; 탡; ) HANGUL SYLLABLE TAENJ +D0E2;D0E2;1110 1162 11AD;D0E2;1110 1162 11AD; # (탢; 탢; 탢; 탢; 탢; ) HANGUL SYLLABLE TAENH +D0E3;D0E3;1110 1162 11AE;D0E3;1110 1162 11AE; # (탣; 탣; 탣; 탣; 탣; ) HANGUL SYLLABLE TAED +D0E4;D0E4;1110 1162 11AF;D0E4;1110 1162 11AF; # (탤; 탤; 탤; 탤; 탤; ) HANGUL SYLLABLE TAEL +D0E5;D0E5;1110 1162 11B0;D0E5;1110 1162 11B0; # (탥; 탥; 탥; 탥; 탥; ) HANGUL SYLLABLE TAELG +D0E6;D0E6;1110 1162 11B1;D0E6;1110 1162 11B1; # (탦; 탦; 탦; 탦; 탦; ) HANGUL SYLLABLE TAELM +D0E7;D0E7;1110 1162 11B2;D0E7;1110 1162 11B2; # (탧; 탧; 탧; 탧; 탧; ) HANGUL SYLLABLE TAELB +D0E8;D0E8;1110 1162 11B3;D0E8;1110 1162 11B3; # (탨; 탨; 탨; 탨; 탨; ) HANGUL SYLLABLE TAELS +D0E9;D0E9;1110 1162 11B4;D0E9;1110 1162 11B4; # (탩; 탩; 탩; 탩; 탩; ) HANGUL SYLLABLE TAELT +D0EA;D0EA;1110 1162 11B5;D0EA;1110 1162 11B5; # (탪; 탪; 탪; 탪; 탪; ) HANGUL SYLLABLE TAELP +D0EB;D0EB;1110 1162 11B6;D0EB;1110 1162 11B6; # (탫; 탫; 탫; 탫; 탫; ) HANGUL SYLLABLE TAELH +D0EC;D0EC;1110 1162 11B7;D0EC;1110 1162 11B7; # (탬; 탬; 탬; 탬; 탬; ) HANGUL SYLLABLE TAEM +D0ED;D0ED;1110 1162 11B8;D0ED;1110 1162 11B8; # (탭; 탭; 탭; 탭; 탭; ) HANGUL SYLLABLE TAEB +D0EE;D0EE;1110 1162 11B9;D0EE;1110 1162 11B9; # (탮; 탮; 탮; 탮; 탮; ) HANGUL SYLLABLE TAEBS +D0EF;D0EF;1110 1162 11BA;D0EF;1110 1162 11BA; # (탯; 탯; 탯; 탯; 탯; ) HANGUL SYLLABLE TAES +D0F0;D0F0;1110 1162 11BB;D0F0;1110 1162 11BB; # (탰; 탰; 탰; 탰; 탰; ) HANGUL SYLLABLE TAESS +D0F1;D0F1;1110 1162 11BC;D0F1;1110 1162 11BC; # (탱; 탱; 탱; 탱; 탱; ) HANGUL SYLLABLE TAENG +D0F2;D0F2;1110 1162 11BD;D0F2;1110 1162 11BD; # (탲; 탲; 탲; 탲; 탲; ) HANGUL SYLLABLE TAEJ +D0F3;D0F3;1110 1162 11BE;D0F3;1110 1162 11BE; # (탳; 탳; 탳; 탳; 탳; ) HANGUL SYLLABLE TAEC +D0F4;D0F4;1110 1162 11BF;D0F4;1110 1162 11BF; # (탴; 탴; 탴; 탴; 탴; ) HANGUL SYLLABLE TAEK +D0F5;D0F5;1110 1162 11C0;D0F5;1110 1162 11C0; # (탵; 탵; 탵; 탵; 탵; ) HANGUL SYLLABLE TAET +D0F6;D0F6;1110 1162 11C1;D0F6;1110 1162 11C1; # (탶; 탶; 탶; 탶; 탶; ) HANGUL SYLLABLE TAEP +D0F7;D0F7;1110 1162 11C2;D0F7;1110 1162 11C2; # (탷; 탷; 탷; 탷; 탷; ) HANGUL SYLLABLE TAEH +D0F8;D0F8;1110 1163;D0F8;1110 1163; # (탸; 탸; 탸; 탸; 탸; ) HANGUL SYLLABLE TYA +D0F9;D0F9;1110 1163 11A8;D0F9;1110 1163 11A8; # (탹; 탹; 탹; 탹; 탹; ) HANGUL SYLLABLE TYAG +D0FA;D0FA;1110 1163 11A9;D0FA;1110 1163 11A9; # (탺; 탺; 탺; 탺; 탺; ) HANGUL SYLLABLE TYAGG +D0FB;D0FB;1110 1163 11AA;D0FB;1110 1163 11AA; # (탻; 탻; 탻; 탻; 탻; ) HANGUL SYLLABLE TYAGS +D0FC;D0FC;1110 1163 11AB;D0FC;1110 1163 11AB; # (탼; 탼; 탼; 탼; 탼; ) HANGUL SYLLABLE TYAN +D0FD;D0FD;1110 1163 11AC;D0FD;1110 1163 11AC; # (탽; 탽; 탽; 탽; 탽; ) HANGUL SYLLABLE TYANJ +D0FE;D0FE;1110 1163 11AD;D0FE;1110 1163 11AD; # (탾; 탾; 탾; 탾; 탾; ) HANGUL SYLLABLE TYANH +D0FF;D0FF;1110 1163 11AE;D0FF;1110 1163 11AE; # (탿; 탿; 탿; 탿; 탿; ) HANGUL SYLLABLE TYAD +D100;D100;1110 1163 11AF;D100;1110 1163 11AF; # (턀; 턀; 턀; 턀; 턀; ) HANGUL SYLLABLE TYAL +D101;D101;1110 1163 11B0;D101;1110 1163 11B0; # (턁; 턁; 턁; 턁; 턁; ) HANGUL SYLLABLE TYALG +D102;D102;1110 1163 11B1;D102;1110 1163 11B1; # (턂; 턂; 턂; 턂; 턂; ) HANGUL SYLLABLE TYALM +D103;D103;1110 1163 11B2;D103;1110 1163 11B2; # (턃; 턃; 턃; 턃; 턃; ) HANGUL SYLLABLE TYALB +D104;D104;1110 1163 11B3;D104;1110 1163 11B3; # (턄; 턄; 턄; 턄; 턄; ) HANGUL SYLLABLE TYALS +D105;D105;1110 1163 11B4;D105;1110 1163 11B4; # (턅; 턅; 턅; 턅; 턅; ) HANGUL SYLLABLE TYALT +D106;D106;1110 1163 11B5;D106;1110 1163 11B5; # (턆; 턆; 턆; 턆; 턆; ) HANGUL SYLLABLE TYALP +D107;D107;1110 1163 11B6;D107;1110 1163 11B6; # (턇; 턇; 턇; 턇; 턇; ) HANGUL SYLLABLE TYALH +D108;D108;1110 1163 11B7;D108;1110 1163 11B7; # (턈; 턈; 턈; 턈; 턈; ) HANGUL SYLLABLE TYAM +D109;D109;1110 1163 11B8;D109;1110 1163 11B8; # (턉; 턉; 턉; 턉; 턉; ) HANGUL SYLLABLE TYAB +D10A;D10A;1110 1163 11B9;D10A;1110 1163 11B9; # (턊; 턊; 턊; 턊; 턊; ) HANGUL SYLLABLE TYABS +D10B;D10B;1110 1163 11BA;D10B;1110 1163 11BA; # (턋; 턋; 턋; 턋; 턋; ) HANGUL SYLLABLE TYAS +D10C;D10C;1110 1163 11BB;D10C;1110 1163 11BB; # (턌; 턌; 턌; 턌; 턌; ) HANGUL SYLLABLE TYASS +D10D;D10D;1110 1163 11BC;D10D;1110 1163 11BC; # (턍; 턍; 턍; 턍; 턍; ) HANGUL SYLLABLE TYANG +D10E;D10E;1110 1163 11BD;D10E;1110 1163 11BD; # (턎; 턎; 턎; 턎; 턎; ) HANGUL SYLLABLE TYAJ +D10F;D10F;1110 1163 11BE;D10F;1110 1163 11BE; # (턏; 턏; 턏; 턏; 턏; ) HANGUL SYLLABLE TYAC +D110;D110;1110 1163 11BF;D110;1110 1163 11BF; # (턐; 턐; 턐; 턐; 턐; ) HANGUL SYLLABLE TYAK +D111;D111;1110 1163 11C0;D111;1110 1163 11C0; # (턑; 턑; 턑; 턑; 턑; ) HANGUL SYLLABLE TYAT +D112;D112;1110 1163 11C1;D112;1110 1163 11C1; # (턒; 턒; 턒; 턒; 턒; ) HANGUL SYLLABLE TYAP +D113;D113;1110 1163 11C2;D113;1110 1163 11C2; # (턓; 턓; 턓; 턓; 턓; ) HANGUL SYLLABLE TYAH +D114;D114;1110 1164;D114;1110 1164; # (턔; 턔; 턔; 턔; 턔; ) HANGUL SYLLABLE TYAE +D115;D115;1110 1164 11A8;D115;1110 1164 11A8; # (턕; 턕; 턕; 턕; 턕; ) HANGUL SYLLABLE TYAEG +D116;D116;1110 1164 11A9;D116;1110 1164 11A9; # (턖; 턖; 턖; 턖; 턖; ) HANGUL SYLLABLE TYAEGG +D117;D117;1110 1164 11AA;D117;1110 1164 11AA; # (턗; 턗; 턗; 턗; 턗; ) HANGUL SYLLABLE TYAEGS +D118;D118;1110 1164 11AB;D118;1110 1164 11AB; # (턘; 턘; 턘; 턘; 턘; ) HANGUL SYLLABLE TYAEN +D119;D119;1110 1164 11AC;D119;1110 1164 11AC; # (턙; 턙; 턙; 턙; 턙; ) HANGUL SYLLABLE TYAENJ +D11A;D11A;1110 1164 11AD;D11A;1110 1164 11AD; # (턚; 턚; 턚; 턚; 턚; ) HANGUL SYLLABLE TYAENH +D11B;D11B;1110 1164 11AE;D11B;1110 1164 11AE; # (턛; 턛; 턛; 턛; 턛; ) HANGUL SYLLABLE TYAED +D11C;D11C;1110 1164 11AF;D11C;1110 1164 11AF; # (턜; 턜; 턜; 턜; 턜; ) HANGUL SYLLABLE TYAEL +D11D;D11D;1110 1164 11B0;D11D;1110 1164 11B0; # (턝; 턝; 턝; 턝; 턝; ) HANGUL SYLLABLE TYAELG +D11E;D11E;1110 1164 11B1;D11E;1110 1164 11B1; # (턞; 턞; 턞; 턞; 턞; ) HANGUL SYLLABLE TYAELM +D11F;D11F;1110 1164 11B2;D11F;1110 1164 11B2; # (턟; 턟; 턟; 턟; 턟; ) HANGUL SYLLABLE TYAELB +D120;D120;1110 1164 11B3;D120;1110 1164 11B3; # (턠; 턠; 턠; 턠; 턠; ) HANGUL SYLLABLE TYAELS +D121;D121;1110 1164 11B4;D121;1110 1164 11B4; # (턡; 턡; 턡; 턡; 턡; ) HANGUL SYLLABLE TYAELT +D122;D122;1110 1164 11B5;D122;1110 1164 11B5; # (턢; 턢; 턢; 턢; 턢; ) HANGUL SYLLABLE TYAELP +D123;D123;1110 1164 11B6;D123;1110 1164 11B6; # (턣; 턣; 턣; 턣; 턣; ) HANGUL SYLLABLE TYAELH +D124;D124;1110 1164 11B7;D124;1110 1164 11B7; # (턤; 턤; 턤; 턤; 턤; ) HANGUL SYLLABLE TYAEM +D125;D125;1110 1164 11B8;D125;1110 1164 11B8; # (턥; 턥; 턥; 턥; 턥; ) HANGUL SYLLABLE TYAEB +D126;D126;1110 1164 11B9;D126;1110 1164 11B9; # (턦; 턦; 턦; 턦; 턦; ) HANGUL SYLLABLE TYAEBS +D127;D127;1110 1164 11BA;D127;1110 1164 11BA; # (턧; 턧; 턧; 턧; 턧; ) HANGUL SYLLABLE TYAES +D128;D128;1110 1164 11BB;D128;1110 1164 11BB; # (턨; 턨; 턨; 턨; 턨; ) HANGUL SYLLABLE TYAESS +D129;D129;1110 1164 11BC;D129;1110 1164 11BC; # (턩; 턩; 턩; 턩; 턩; ) HANGUL SYLLABLE TYAENG +D12A;D12A;1110 1164 11BD;D12A;1110 1164 11BD; # (턪; 턪; 턪; 턪; 턪; ) HANGUL SYLLABLE TYAEJ +D12B;D12B;1110 1164 11BE;D12B;1110 1164 11BE; # (턫; 턫; 턫; 턫; 턫; ) HANGUL SYLLABLE TYAEC +D12C;D12C;1110 1164 11BF;D12C;1110 1164 11BF; # (턬; 턬; 턬; 턬; 턬; ) HANGUL SYLLABLE TYAEK +D12D;D12D;1110 1164 11C0;D12D;1110 1164 11C0; # (턭; 턭; 턭; 턭; 턭; ) HANGUL SYLLABLE TYAET +D12E;D12E;1110 1164 11C1;D12E;1110 1164 11C1; # (턮; 턮; 턮; 턮; 턮; ) HANGUL SYLLABLE TYAEP +D12F;D12F;1110 1164 11C2;D12F;1110 1164 11C2; # (턯; 턯; 턯; 턯; 턯; ) HANGUL SYLLABLE TYAEH +D130;D130;1110 1165;D130;1110 1165; # (터; 터; 터; 터; 터; ) HANGUL SYLLABLE TEO +D131;D131;1110 1165 11A8;D131;1110 1165 11A8; # (턱; 턱; 턱; 턱; 턱; ) HANGUL SYLLABLE TEOG +D132;D132;1110 1165 11A9;D132;1110 1165 11A9; # (턲; 턲; 턲; 턲; 턲; ) HANGUL SYLLABLE TEOGG +D133;D133;1110 1165 11AA;D133;1110 1165 11AA; # (턳; 턳; 턳; 턳; 턳; ) HANGUL SYLLABLE TEOGS +D134;D134;1110 1165 11AB;D134;1110 1165 11AB; # (턴; 턴; 턴; 턴; 턴; ) HANGUL SYLLABLE TEON +D135;D135;1110 1165 11AC;D135;1110 1165 11AC; # (턵; 턵; 턵; 턵; 턵; ) HANGUL SYLLABLE TEONJ +D136;D136;1110 1165 11AD;D136;1110 1165 11AD; # (턶; 턶; 턶; 턶; 턶; ) HANGUL SYLLABLE TEONH +D137;D137;1110 1165 11AE;D137;1110 1165 11AE; # (턷; 턷; 턷; 턷; 턷; ) HANGUL SYLLABLE TEOD +D138;D138;1110 1165 11AF;D138;1110 1165 11AF; # (털; 털; 털; 털; 털; ) HANGUL SYLLABLE TEOL +D139;D139;1110 1165 11B0;D139;1110 1165 11B0; # (턹; 턹; 턹; 턹; 턹; ) HANGUL SYLLABLE TEOLG +D13A;D13A;1110 1165 11B1;D13A;1110 1165 11B1; # (턺; 턺; 턺; 턺; 턺; ) HANGUL SYLLABLE TEOLM +D13B;D13B;1110 1165 11B2;D13B;1110 1165 11B2; # (턻; 턻; 턻; 턻; 턻; ) HANGUL SYLLABLE TEOLB +D13C;D13C;1110 1165 11B3;D13C;1110 1165 11B3; # (턼; 턼; 턼; 턼; 턼; ) HANGUL SYLLABLE TEOLS +D13D;D13D;1110 1165 11B4;D13D;1110 1165 11B4; # (턽; 턽; 턽; 턽; 턽; ) HANGUL SYLLABLE TEOLT +D13E;D13E;1110 1165 11B5;D13E;1110 1165 11B5; # (턾; 턾; 턾; 턾; 턾; ) HANGUL SYLLABLE TEOLP +D13F;D13F;1110 1165 11B6;D13F;1110 1165 11B6; # (턿; 턿; 턿; 턿; 턿; ) HANGUL SYLLABLE TEOLH +D140;D140;1110 1165 11B7;D140;1110 1165 11B7; # (텀; 텀; 텀; 텀; 텀; ) HANGUL SYLLABLE TEOM +D141;D141;1110 1165 11B8;D141;1110 1165 11B8; # (텁; 텁; 텁; 텁; 텁; ) HANGUL SYLLABLE TEOB +D142;D142;1110 1165 11B9;D142;1110 1165 11B9; # (텂; 텂; 텂; 텂; 텂; ) HANGUL SYLLABLE TEOBS +D143;D143;1110 1165 11BA;D143;1110 1165 11BA; # (텃; 텃; 텃; 텃; 텃; ) HANGUL SYLLABLE TEOS +D144;D144;1110 1165 11BB;D144;1110 1165 11BB; # (텄; 텄; 텄; 텄; 텄; ) HANGUL SYLLABLE TEOSS +D145;D145;1110 1165 11BC;D145;1110 1165 11BC; # (텅; 텅; 텅; 텅; 텅; ) HANGUL SYLLABLE TEONG +D146;D146;1110 1165 11BD;D146;1110 1165 11BD; # (텆; 텆; 텆; 텆; 텆; ) HANGUL SYLLABLE TEOJ +D147;D147;1110 1165 11BE;D147;1110 1165 11BE; # (텇; 텇; 텇; 텇; 텇; ) HANGUL SYLLABLE TEOC +D148;D148;1110 1165 11BF;D148;1110 1165 11BF; # (텈; 텈; 텈; 텈; 텈; ) HANGUL SYLLABLE TEOK +D149;D149;1110 1165 11C0;D149;1110 1165 11C0; # (텉; 텉; 텉; 텉; 텉; ) HANGUL SYLLABLE TEOT +D14A;D14A;1110 1165 11C1;D14A;1110 1165 11C1; # (텊; 텊; 텊; 텊; 텊; ) HANGUL SYLLABLE TEOP +D14B;D14B;1110 1165 11C2;D14B;1110 1165 11C2; # (텋; 텋; 텋; 텋; 텋; ) HANGUL SYLLABLE TEOH +D14C;D14C;1110 1166;D14C;1110 1166; # (테; 테; 테; 테; 테; ) HANGUL SYLLABLE TE +D14D;D14D;1110 1166 11A8;D14D;1110 1166 11A8; # (텍; 텍; 텍; 텍; 텍; ) HANGUL SYLLABLE TEG +D14E;D14E;1110 1166 11A9;D14E;1110 1166 11A9; # (텎; 텎; 텎; 텎; 텎; ) HANGUL SYLLABLE TEGG +D14F;D14F;1110 1166 11AA;D14F;1110 1166 11AA; # (텏; 텏; 텏; 텏; 텏; ) HANGUL SYLLABLE TEGS +D150;D150;1110 1166 11AB;D150;1110 1166 11AB; # (텐; 텐; 텐; 텐; 텐; ) HANGUL SYLLABLE TEN +D151;D151;1110 1166 11AC;D151;1110 1166 11AC; # (텑; 텑; 텑; 텑; 텑; ) HANGUL SYLLABLE TENJ +D152;D152;1110 1166 11AD;D152;1110 1166 11AD; # (텒; 텒; 텒; 텒; 텒; ) HANGUL SYLLABLE TENH +D153;D153;1110 1166 11AE;D153;1110 1166 11AE; # (텓; 텓; 텓; 텓; 텓; ) HANGUL SYLLABLE TED +D154;D154;1110 1166 11AF;D154;1110 1166 11AF; # (텔; 텔; 텔; 텔; 텔; ) HANGUL SYLLABLE TEL +D155;D155;1110 1166 11B0;D155;1110 1166 11B0; # (텕; 텕; 텕; 텕; 텕; ) HANGUL SYLLABLE TELG +D156;D156;1110 1166 11B1;D156;1110 1166 11B1; # (텖; 텖; 텖; 텖; 텖; ) HANGUL SYLLABLE TELM +D157;D157;1110 1166 11B2;D157;1110 1166 11B2; # (텗; 텗; 텗; 텗; 텗; ) HANGUL SYLLABLE TELB +D158;D158;1110 1166 11B3;D158;1110 1166 11B3; # (텘; 텘; 텘; 텘; 텘; ) HANGUL SYLLABLE TELS +D159;D159;1110 1166 11B4;D159;1110 1166 11B4; # (텙; 텙; 텙; 텙; 텙; ) HANGUL SYLLABLE TELT +D15A;D15A;1110 1166 11B5;D15A;1110 1166 11B5; # (텚; 텚; 텚; 텚; 텚; ) HANGUL SYLLABLE TELP +D15B;D15B;1110 1166 11B6;D15B;1110 1166 11B6; # (텛; 텛; 텛; 텛; 텛; ) HANGUL SYLLABLE TELH +D15C;D15C;1110 1166 11B7;D15C;1110 1166 11B7; # (템; 템; 템; 템; 템; ) HANGUL SYLLABLE TEM +D15D;D15D;1110 1166 11B8;D15D;1110 1166 11B8; # (텝; 텝; 텝; 텝; 텝; ) HANGUL SYLLABLE TEB +D15E;D15E;1110 1166 11B9;D15E;1110 1166 11B9; # (텞; 텞; 텞; 텞; 텞; ) HANGUL SYLLABLE TEBS +D15F;D15F;1110 1166 11BA;D15F;1110 1166 11BA; # (텟; 텟; 텟; 텟; 텟; ) HANGUL SYLLABLE TES +D160;D160;1110 1166 11BB;D160;1110 1166 11BB; # (텠; 텠; 텠; 텠; 텠; ) HANGUL SYLLABLE TESS +D161;D161;1110 1166 11BC;D161;1110 1166 11BC; # (텡; 텡; 텡; 텡; 텡; ) HANGUL SYLLABLE TENG +D162;D162;1110 1166 11BD;D162;1110 1166 11BD; # (텢; 텢; 텢; 텢; 텢; ) HANGUL SYLLABLE TEJ +D163;D163;1110 1166 11BE;D163;1110 1166 11BE; # (텣; 텣; 텣; 텣; 텣; ) HANGUL SYLLABLE TEC +D164;D164;1110 1166 11BF;D164;1110 1166 11BF; # (텤; 텤; 텤; 텤; 텤; ) HANGUL SYLLABLE TEK +D165;D165;1110 1166 11C0;D165;1110 1166 11C0; # (텥; 텥; 텥; 텥; 텥; ) HANGUL SYLLABLE TET +D166;D166;1110 1166 11C1;D166;1110 1166 11C1; # (텦; 텦; 텦; 텦; 텦; ) HANGUL SYLLABLE TEP +D167;D167;1110 1166 11C2;D167;1110 1166 11C2; # (텧; 텧; 텧; 텧; 텧; ) HANGUL SYLLABLE TEH +D168;D168;1110 1167;D168;1110 1167; # (텨; 텨; 텨; 텨; 텨; ) HANGUL SYLLABLE TYEO +D169;D169;1110 1167 11A8;D169;1110 1167 11A8; # (텩; 텩; 텩; 텩; 텩; ) HANGUL SYLLABLE TYEOG +D16A;D16A;1110 1167 11A9;D16A;1110 1167 11A9; # (텪; 텪; 텪; 텪; 텪; ) HANGUL SYLLABLE TYEOGG +D16B;D16B;1110 1167 11AA;D16B;1110 1167 11AA; # (텫; 텫; 텫; 텫; 텫; ) HANGUL SYLLABLE TYEOGS +D16C;D16C;1110 1167 11AB;D16C;1110 1167 11AB; # (텬; 텬; 텬; 텬; 텬; ) HANGUL SYLLABLE TYEON +D16D;D16D;1110 1167 11AC;D16D;1110 1167 11AC; # (텭; 텭; 텭; 텭; 텭; ) HANGUL SYLLABLE TYEONJ +D16E;D16E;1110 1167 11AD;D16E;1110 1167 11AD; # (텮; 텮; 텮; 텮; 텮; ) HANGUL SYLLABLE TYEONH +D16F;D16F;1110 1167 11AE;D16F;1110 1167 11AE; # (텯; 텯; 텯; 텯; 텯; ) HANGUL SYLLABLE TYEOD +D170;D170;1110 1167 11AF;D170;1110 1167 11AF; # (텰; 텰; 텰; 텰; 텰; ) HANGUL SYLLABLE TYEOL +D171;D171;1110 1167 11B0;D171;1110 1167 11B0; # (텱; 텱; 텱; 텱; 텱; ) HANGUL SYLLABLE TYEOLG +D172;D172;1110 1167 11B1;D172;1110 1167 11B1; # (텲; 텲; 텲; 텲; 텲; ) HANGUL SYLLABLE TYEOLM +D173;D173;1110 1167 11B2;D173;1110 1167 11B2; # (텳; 텳; 텳; 텳; 텳; ) HANGUL SYLLABLE TYEOLB +D174;D174;1110 1167 11B3;D174;1110 1167 11B3; # (텴; 텴; 텴; 텴; 텴; ) HANGUL SYLLABLE TYEOLS +D175;D175;1110 1167 11B4;D175;1110 1167 11B4; # (텵; 텵; 텵; 텵; 텵; ) HANGUL SYLLABLE TYEOLT +D176;D176;1110 1167 11B5;D176;1110 1167 11B5; # (텶; 텶; 텶; 텶; 텶; ) HANGUL SYLLABLE TYEOLP +D177;D177;1110 1167 11B6;D177;1110 1167 11B6; # (텷; 텷; 텷; 텷; 텷; ) HANGUL SYLLABLE TYEOLH +D178;D178;1110 1167 11B7;D178;1110 1167 11B7; # (텸; 텸; 텸; 텸; 텸; ) HANGUL SYLLABLE TYEOM +D179;D179;1110 1167 11B8;D179;1110 1167 11B8; # (텹; 텹; 텹; 텹; 텹; ) HANGUL SYLLABLE TYEOB +D17A;D17A;1110 1167 11B9;D17A;1110 1167 11B9; # (텺; 텺; 텺; 텺; 텺; ) HANGUL SYLLABLE TYEOBS +D17B;D17B;1110 1167 11BA;D17B;1110 1167 11BA; # (텻; 텻; 텻; 텻; 텻; ) HANGUL SYLLABLE TYEOS +D17C;D17C;1110 1167 11BB;D17C;1110 1167 11BB; # (텼; 텼; 텼; 텼; 텼; ) HANGUL SYLLABLE TYEOSS +D17D;D17D;1110 1167 11BC;D17D;1110 1167 11BC; # (텽; 텽; 텽; 텽; 텽; ) HANGUL SYLLABLE TYEONG +D17E;D17E;1110 1167 11BD;D17E;1110 1167 11BD; # (텾; 텾; 텾; 텾; 텾; ) HANGUL SYLLABLE TYEOJ +D17F;D17F;1110 1167 11BE;D17F;1110 1167 11BE; # (텿; 텿; 텿; 텿; 텿; ) HANGUL SYLLABLE TYEOC +D180;D180;1110 1167 11BF;D180;1110 1167 11BF; # (톀; 톀; 톀; 톀; 톀; ) HANGUL SYLLABLE TYEOK +D181;D181;1110 1167 11C0;D181;1110 1167 11C0; # (톁; 톁; 톁; 톁; 톁; ) HANGUL SYLLABLE TYEOT +D182;D182;1110 1167 11C1;D182;1110 1167 11C1; # (톂; 톂; 톂; 톂; 톂; ) HANGUL SYLLABLE TYEOP +D183;D183;1110 1167 11C2;D183;1110 1167 11C2; # (톃; 톃; 톃; 톃; 톃; ) HANGUL SYLLABLE TYEOH +D184;D184;1110 1168;D184;1110 1168; # (톄; 톄; 톄; 톄; 톄; ) HANGUL SYLLABLE TYE +D185;D185;1110 1168 11A8;D185;1110 1168 11A8; # (톅; 톅; 톅; 톅; 톅; ) HANGUL SYLLABLE TYEG +D186;D186;1110 1168 11A9;D186;1110 1168 11A9; # (톆; 톆; 톆; 톆; 톆; ) HANGUL SYLLABLE TYEGG +D187;D187;1110 1168 11AA;D187;1110 1168 11AA; # (톇; 톇; 톇; 톇; 톇; ) HANGUL SYLLABLE TYEGS +D188;D188;1110 1168 11AB;D188;1110 1168 11AB; # (톈; 톈; 톈; 톈; 톈; ) HANGUL SYLLABLE TYEN +D189;D189;1110 1168 11AC;D189;1110 1168 11AC; # (톉; 톉; 톉; 톉; 톉; ) HANGUL SYLLABLE TYENJ +D18A;D18A;1110 1168 11AD;D18A;1110 1168 11AD; # (톊; 톊; 톊; 톊; 톊; ) HANGUL SYLLABLE TYENH +D18B;D18B;1110 1168 11AE;D18B;1110 1168 11AE; # (톋; 톋; 톋; 톋; 톋; ) HANGUL SYLLABLE TYED +D18C;D18C;1110 1168 11AF;D18C;1110 1168 11AF; # (톌; 톌; 톌; 톌; 톌; ) HANGUL SYLLABLE TYEL +D18D;D18D;1110 1168 11B0;D18D;1110 1168 11B0; # (톍; 톍; 톍; 톍; 톍; ) HANGUL SYLLABLE TYELG +D18E;D18E;1110 1168 11B1;D18E;1110 1168 11B1; # (톎; 톎; 톎; 톎; 톎; ) HANGUL SYLLABLE TYELM +D18F;D18F;1110 1168 11B2;D18F;1110 1168 11B2; # (톏; 톏; 톏; 톏; 톏; ) HANGUL SYLLABLE TYELB +D190;D190;1110 1168 11B3;D190;1110 1168 11B3; # (톐; 톐; 톐; 톐; 톐; ) HANGUL SYLLABLE TYELS +D191;D191;1110 1168 11B4;D191;1110 1168 11B4; # (톑; 톑; 톑; 톑; 톑; ) HANGUL SYLLABLE TYELT +D192;D192;1110 1168 11B5;D192;1110 1168 11B5; # (톒; 톒; 톒; 톒; 톒; ) HANGUL SYLLABLE TYELP +D193;D193;1110 1168 11B6;D193;1110 1168 11B6; # (톓; 톓; 톓; 톓; 톓; ) HANGUL SYLLABLE TYELH +D194;D194;1110 1168 11B7;D194;1110 1168 11B7; # (톔; 톔; 톔; 톔; 톔; ) HANGUL SYLLABLE TYEM +D195;D195;1110 1168 11B8;D195;1110 1168 11B8; # (톕; 톕; 톕; 톕; 톕; ) HANGUL SYLLABLE TYEB +D196;D196;1110 1168 11B9;D196;1110 1168 11B9; # (톖; 톖; 톖; 톖; 톖; ) HANGUL SYLLABLE TYEBS +D197;D197;1110 1168 11BA;D197;1110 1168 11BA; # (톗; 톗; 톗; 톗; 톗; ) HANGUL SYLLABLE TYES +D198;D198;1110 1168 11BB;D198;1110 1168 11BB; # (톘; 톘; 톘; 톘; 톘; ) HANGUL SYLLABLE TYESS +D199;D199;1110 1168 11BC;D199;1110 1168 11BC; # (톙; 톙; 톙; 톙; 톙; ) HANGUL SYLLABLE TYENG +D19A;D19A;1110 1168 11BD;D19A;1110 1168 11BD; # (톚; 톚; 톚; 톚; 톚; ) HANGUL SYLLABLE TYEJ +D19B;D19B;1110 1168 11BE;D19B;1110 1168 11BE; # (톛; 톛; 톛; 톛; 톛; ) HANGUL SYLLABLE TYEC +D19C;D19C;1110 1168 11BF;D19C;1110 1168 11BF; # (톜; 톜; 톜; 톜; 톜; ) HANGUL SYLLABLE TYEK +D19D;D19D;1110 1168 11C0;D19D;1110 1168 11C0; # (톝; 톝; 톝; 톝; 톝; ) HANGUL SYLLABLE TYET +D19E;D19E;1110 1168 11C1;D19E;1110 1168 11C1; # (톞; 톞; 톞; 톞; 톞; ) HANGUL SYLLABLE TYEP +D19F;D19F;1110 1168 11C2;D19F;1110 1168 11C2; # (톟; 톟; 톟; 톟; 톟; ) HANGUL SYLLABLE TYEH +D1A0;D1A0;1110 1169;D1A0;1110 1169; # (토; 토; 토; 토; 토; ) HANGUL SYLLABLE TO +D1A1;D1A1;1110 1169 11A8;D1A1;1110 1169 11A8; # (톡; 톡; 톡; 톡; 톡; ) HANGUL SYLLABLE TOG +D1A2;D1A2;1110 1169 11A9;D1A2;1110 1169 11A9; # (톢; 톢; 톢; 톢; 톢; ) HANGUL SYLLABLE TOGG +D1A3;D1A3;1110 1169 11AA;D1A3;1110 1169 11AA; # (톣; 톣; 톣; 톣; 톣; ) HANGUL SYLLABLE TOGS +D1A4;D1A4;1110 1169 11AB;D1A4;1110 1169 11AB; # (톤; 톤; 톤; 톤; 톤; ) HANGUL SYLLABLE TON +D1A5;D1A5;1110 1169 11AC;D1A5;1110 1169 11AC; # (톥; 톥; 톥; 톥; 톥; ) HANGUL SYLLABLE TONJ +D1A6;D1A6;1110 1169 11AD;D1A6;1110 1169 11AD; # (톦; 톦; 톦; 톦; 톦; ) HANGUL SYLLABLE TONH +D1A7;D1A7;1110 1169 11AE;D1A7;1110 1169 11AE; # (톧; 톧; 톧; 톧; 톧; ) HANGUL SYLLABLE TOD +D1A8;D1A8;1110 1169 11AF;D1A8;1110 1169 11AF; # (톨; 톨; 톨; 톨; 톨; ) HANGUL SYLLABLE TOL +D1A9;D1A9;1110 1169 11B0;D1A9;1110 1169 11B0; # (톩; 톩; 톩; 톩; 톩; ) HANGUL SYLLABLE TOLG +D1AA;D1AA;1110 1169 11B1;D1AA;1110 1169 11B1; # (톪; 톪; 톪; 톪; 톪; ) HANGUL SYLLABLE TOLM +D1AB;D1AB;1110 1169 11B2;D1AB;1110 1169 11B2; # (톫; 톫; 톫; 톫; 톫; ) HANGUL SYLLABLE TOLB +D1AC;D1AC;1110 1169 11B3;D1AC;1110 1169 11B3; # (톬; 톬; 톬; 톬; 톬; ) HANGUL SYLLABLE TOLS +D1AD;D1AD;1110 1169 11B4;D1AD;1110 1169 11B4; # (톭; 톭; 톭; 톭; 톭; ) HANGUL SYLLABLE TOLT +D1AE;D1AE;1110 1169 11B5;D1AE;1110 1169 11B5; # (톮; 톮; 톮; 톮; 톮; ) HANGUL SYLLABLE TOLP +D1AF;D1AF;1110 1169 11B6;D1AF;1110 1169 11B6; # (톯; 톯; 톯; 톯; 톯; ) HANGUL SYLLABLE TOLH +D1B0;D1B0;1110 1169 11B7;D1B0;1110 1169 11B7; # (톰; 톰; 톰; 톰; 톰; ) HANGUL SYLLABLE TOM +D1B1;D1B1;1110 1169 11B8;D1B1;1110 1169 11B8; # (톱; 톱; 톱; 톱; 톱; ) HANGUL SYLLABLE TOB +D1B2;D1B2;1110 1169 11B9;D1B2;1110 1169 11B9; # (톲; 톲; 톲; 톲; 톲; ) HANGUL SYLLABLE TOBS +D1B3;D1B3;1110 1169 11BA;D1B3;1110 1169 11BA; # (톳; 톳; 톳; 톳; 톳; ) HANGUL SYLLABLE TOS +D1B4;D1B4;1110 1169 11BB;D1B4;1110 1169 11BB; # (톴; 톴; 톴; 톴; 톴; ) HANGUL SYLLABLE TOSS +D1B5;D1B5;1110 1169 11BC;D1B5;1110 1169 11BC; # (통; 통; 통; 통; 통; ) HANGUL SYLLABLE TONG +D1B6;D1B6;1110 1169 11BD;D1B6;1110 1169 11BD; # (톶; 톶; 톶; 톶; 톶; ) HANGUL SYLLABLE TOJ +D1B7;D1B7;1110 1169 11BE;D1B7;1110 1169 11BE; # (톷; 톷; 톷; 톷; 톷; ) HANGUL SYLLABLE TOC +D1B8;D1B8;1110 1169 11BF;D1B8;1110 1169 11BF; # (톸; 톸; 톸; 톸; 톸; ) HANGUL SYLLABLE TOK +D1B9;D1B9;1110 1169 11C0;D1B9;1110 1169 11C0; # (톹; 톹; 톹; 톹; 톹; ) HANGUL SYLLABLE TOT +D1BA;D1BA;1110 1169 11C1;D1BA;1110 1169 11C1; # (톺; 톺; 톺; 톺; 톺; ) HANGUL SYLLABLE TOP +D1BB;D1BB;1110 1169 11C2;D1BB;1110 1169 11C2; # (톻; 톻; 톻; 톻; 톻; ) HANGUL SYLLABLE TOH +D1BC;D1BC;1110 116A;D1BC;1110 116A; # (톼; 톼; 톼; 톼; 톼; ) HANGUL SYLLABLE TWA +D1BD;D1BD;1110 116A 11A8;D1BD;1110 116A 11A8; # (톽; 톽; 톽; 톽; 톽; ) HANGUL SYLLABLE TWAG +D1BE;D1BE;1110 116A 11A9;D1BE;1110 116A 11A9; # (톾; 톾; 톾; 톾; 톾; ) HANGUL SYLLABLE TWAGG +D1BF;D1BF;1110 116A 11AA;D1BF;1110 116A 11AA; # (톿; 톿; 톿; 톿; 톿; ) HANGUL SYLLABLE TWAGS +D1C0;D1C0;1110 116A 11AB;D1C0;1110 116A 11AB; # (퇀; 퇀; 퇀; 퇀; 퇀; ) HANGUL SYLLABLE TWAN +D1C1;D1C1;1110 116A 11AC;D1C1;1110 116A 11AC; # (퇁; 퇁; 퇁; 퇁; 퇁; ) HANGUL SYLLABLE TWANJ +D1C2;D1C2;1110 116A 11AD;D1C2;1110 116A 11AD; # (퇂; 퇂; 퇂; 퇂; 퇂; ) HANGUL SYLLABLE TWANH +D1C3;D1C3;1110 116A 11AE;D1C3;1110 116A 11AE; # (퇃; 퇃; 퇃; 퇃; 퇃; ) HANGUL SYLLABLE TWAD +D1C4;D1C4;1110 116A 11AF;D1C4;1110 116A 11AF; # (퇄; 퇄; 퇄; 퇄; 퇄; ) HANGUL SYLLABLE TWAL +D1C5;D1C5;1110 116A 11B0;D1C5;1110 116A 11B0; # (퇅; 퇅; 퇅; 퇅; 퇅; ) HANGUL SYLLABLE TWALG +D1C6;D1C6;1110 116A 11B1;D1C6;1110 116A 11B1; # (퇆; 퇆; 퇆; 퇆; 퇆; ) HANGUL SYLLABLE TWALM +D1C7;D1C7;1110 116A 11B2;D1C7;1110 116A 11B2; # (퇇; 퇇; 퇇; 퇇; 퇇; ) HANGUL SYLLABLE TWALB +D1C8;D1C8;1110 116A 11B3;D1C8;1110 116A 11B3; # (퇈; 퇈; 퇈; 퇈; 퇈; ) HANGUL SYLLABLE TWALS +D1C9;D1C9;1110 116A 11B4;D1C9;1110 116A 11B4; # (퇉; 퇉; 퇉; 퇉; 퇉; ) HANGUL SYLLABLE TWALT +D1CA;D1CA;1110 116A 11B5;D1CA;1110 116A 11B5; # (퇊; 퇊; 퇊; 퇊; 퇊; ) HANGUL SYLLABLE TWALP +D1CB;D1CB;1110 116A 11B6;D1CB;1110 116A 11B6; # (퇋; 퇋; 퇋; 퇋; 퇋; ) HANGUL SYLLABLE TWALH +D1CC;D1CC;1110 116A 11B7;D1CC;1110 116A 11B7; # (퇌; 퇌; 퇌; 퇌; 퇌; ) HANGUL SYLLABLE TWAM +D1CD;D1CD;1110 116A 11B8;D1CD;1110 116A 11B8; # (퇍; 퇍; 퇍; 퇍; 퇍; ) HANGUL SYLLABLE TWAB +D1CE;D1CE;1110 116A 11B9;D1CE;1110 116A 11B9; # (퇎; 퇎; 퇎; 퇎; 퇎; ) HANGUL SYLLABLE TWABS +D1CF;D1CF;1110 116A 11BA;D1CF;1110 116A 11BA; # (퇏; 퇏; 퇏; 퇏; 퇏; ) HANGUL SYLLABLE TWAS +D1D0;D1D0;1110 116A 11BB;D1D0;1110 116A 11BB; # (퇐; 퇐; 퇐; 퇐; 퇐; ) HANGUL SYLLABLE TWASS +D1D1;D1D1;1110 116A 11BC;D1D1;1110 116A 11BC; # (퇑; 퇑; 퇑; 퇑; 퇑; ) HANGUL SYLLABLE TWANG +D1D2;D1D2;1110 116A 11BD;D1D2;1110 116A 11BD; # (퇒; 퇒; 퇒; 퇒; 퇒; ) HANGUL SYLLABLE TWAJ +D1D3;D1D3;1110 116A 11BE;D1D3;1110 116A 11BE; # (퇓; 퇓; 퇓; 퇓; 퇓; ) HANGUL SYLLABLE TWAC +D1D4;D1D4;1110 116A 11BF;D1D4;1110 116A 11BF; # (퇔; 퇔; 퇔; 퇔; 퇔; ) HANGUL SYLLABLE TWAK +D1D5;D1D5;1110 116A 11C0;D1D5;1110 116A 11C0; # (퇕; 퇕; 퇕; 퇕; 퇕; ) HANGUL SYLLABLE TWAT +D1D6;D1D6;1110 116A 11C1;D1D6;1110 116A 11C1; # (퇖; 퇖; 퇖; 퇖; 퇖; ) HANGUL SYLLABLE TWAP +D1D7;D1D7;1110 116A 11C2;D1D7;1110 116A 11C2; # (퇗; 퇗; 퇗; 퇗; 퇗; ) HANGUL SYLLABLE TWAH +D1D8;D1D8;1110 116B;D1D8;1110 116B; # (퇘; 퇘; 퇘; 퇘; 퇘; ) HANGUL SYLLABLE TWAE +D1D9;D1D9;1110 116B 11A8;D1D9;1110 116B 11A8; # (퇙; 퇙; 퇙; 퇙; 퇙; ) HANGUL SYLLABLE TWAEG +D1DA;D1DA;1110 116B 11A9;D1DA;1110 116B 11A9; # (퇚; 퇚; 퇚; 퇚; 퇚; ) HANGUL SYLLABLE TWAEGG +D1DB;D1DB;1110 116B 11AA;D1DB;1110 116B 11AA; # (퇛; 퇛; 퇛; 퇛; 퇛; ) HANGUL SYLLABLE TWAEGS +D1DC;D1DC;1110 116B 11AB;D1DC;1110 116B 11AB; # (퇜; 퇜; 퇜; 퇜; 퇜; ) HANGUL SYLLABLE TWAEN +D1DD;D1DD;1110 116B 11AC;D1DD;1110 116B 11AC; # (퇝; 퇝; 퇝; 퇝; 퇝; ) HANGUL SYLLABLE TWAENJ +D1DE;D1DE;1110 116B 11AD;D1DE;1110 116B 11AD; # (퇞; 퇞; 퇞; 퇞; 퇞; ) HANGUL SYLLABLE TWAENH +D1DF;D1DF;1110 116B 11AE;D1DF;1110 116B 11AE; # (퇟; 퇟; 퇟; 퇟; 퇟; ) HANGUL SYLLABLE TWAED +D1E0;D1E0;1110 116B 11AF;D1E0;1110 116B 11AF; # (퇠; 퇠; 퇠; 퇠; 퇠; ) HANGUL SYLLABLE TWAEL +D1E1;D1E1;1110 116B 11B0;D1E1;1110 116B 11B0; # (퇡; 퇡; 퇡; 퇡; 퇡; ) HANGUL SYLLABLE TWAELG +D1E2;D1E2;1110 116B 11B1;D1E2;1110 116B 11B1; # (퇢; 퇢; 퇢; 퇢; 퇢; ) HANGUL SYLLABLE TWAELM +D1E3;D1E3;1110 116B 11B2;D1E3;1110 116B 11B2; # (퇣; 퇣; 퇣; 퇣; 퇣; ) HANGUL SYLLABLE TWAELB +D1E4;D1E4;1110 116B 11B3;D1E4;1110 116B 11B3; # (퇤; 퇤; 퇤; 퇤; 퇤; ) HANGUL SYLLABLE TWAELS +D1E5;D1E5;1110 116B 11B4;D1E5;1110 116B 11B4; # (퇥; 퇥; 퇥; 퇥; 퇥; ) HANGUL SYLLABLE TWAELT +D1E6;D1E6;1110 116B 11B5;D1E6;1110 116B 11B5; # (퇦; 퇦; 퇦; 퇦; 퇦; ) HANGUL SYLLABLE TWAELP +D1E7;D1E7;1110 116B 11B6;D1E7;1110 116B 11B6; # (퇧; 퇧; 퇧; 퇧; 퇧; ) HANGUL SYLLABLE TWAELH +D1E8;D1E8;1110 116B 11B7;D1E8;1110 116B 11B7; # (퇨; 퇨; 퇨; 퇨; 퇨; ) HANGUL SYLLABLE TWAEM +D1E9;D1E9;1110 116B 11B8;D1E9;1110 116B 11B8; # (퇩; 퇩; 퇩; 퇩; 퇩; ) HANGUL SYLLABLE TWAEB +D1EA;D1EA;1110 116B 11B9;D1EA;1110 116B 11B9; # (퇪; 퇪; 퇪; 퇪; 퇪; ) HANGUL SYLLABLE TWAEBS +D1EB;D1EB;1110 116B 11BA;D1EB;1110 116B 11BA; # (퇫; 퇫; 퇫; 퇫; 퇫; ) HANGUL SYLLABLE TWAES +D1EC;D1EC;1110 116B 11BB;D1EC;1110 116B 11BB; # (퇬; 퇬; 퇬; 퇬; 퇬; ) HANGUL SYLLABLE TWAESS +D1ED;D1ED;1110 116B 11BC;D1ED;1110 116B 11BC; # (퇭; 퇭; 퇭; 퇭; 퇭; ) HANGUL SYLLABLE TWAENG +D1EE;D1EE;1110 116B 11BD;D1EE;1110 116B 11BD; # (퇮; 퇮; 퇮; 퇮; 퇮; ) HANGUL SYLLABLE TWAEJ +D1EF;D1EF;1110 116B 11BE;D1EF;1110 116B 11BE; # (퇯; 퇯; 퇯; 퇯; 퇯; ) HANGUL SYLLABLE TWAEC +D1F0;D1F0;1110 116B 11BF;D1F0;1110 116B 11BF; # (퇰; 퇰; 퇰; 퇰; 퇰; ) HANGUL SYLLABLE TWAEK +D1F1;D1F1;1110 116B 11C0;D1F1;1110 116B 11C0; # (퇱; 퇱; 퇱; 퇱; 퇱; ) HANGUL SYLLABLE TWAET +D1F2;D1F2;1110 116B 11C1;D1F2;1110 116B 11C1; # (퇲; 퇲; 퇲; 퇲; 퇲; ) HANGUL SYLLABLE TWAEP +D1F3;D1F3;1110 116B 11C2;D1F3;1110 116B 11C2; # (퇳; 퇳; 퇳; 퇳; 퇳; ) HANGUL SYLLABLE TWAEH +D1F4;D1F4;1110 116C;D1F4;1110 116C; # (퇴; 퇴; 퇴; 퇴; 퇴; ) HANGUL SYLLABLE TOE +D1F5;D1F5;1110 116C 11A8;D1F5;1110 116C 11A8; # (퇵; 퇵; 퇵; 퇵; 퇵; ) HANGUL SYLLABLE TOEG +D1F6;D1F6;1110 116C 11A9;D1F6;1110 116C 11A9; # (퇶; 퇶; 퇶; 퇶; 퇶; ) HANGUL SYLLABLE TOEGG +D1F7;D1F7;1110 116C 11AA;D1F7;1110 116C 11AA; # (퇷; 퇷; 퇷; 퇷; 퇷; ) HANGUL SYLLABLE TOEGS +D1F8;D1F8;1110 116C 11AB;D1F8;1110 116C 11AB; # (퇸; 퇸; 퇸; 퇸; 퇸; ) HANGUL SYLLABLE TOEN +D1F9;D1F9;1110 116C 11AC;D1F9;1110 116C 11AC; # (퇹; 퇹; 퇹; 퇹; 퇹; ) HANGUL SYLLABLE TOENJ +D1FA;D1FA;1110 116C 11AD;D1FA;1110 116C 11AD; # (퇺; 퇺; 퇺; 퇺; 퇺; ) HANGUL SYLLABLE TOENH +D1FB;D1FB;1110 116C 11AE;D1FB;1110 116C 11AE; # (퇻; 퇻; 퇻; 퇻; 퇻; ) HANGUL SYLLABLE TOED +D1FC;D1FC;1110 116C 11AF;D1FC;1110 116C 11AF; # (퇼; 퇼; 퇼; 퇼; 퇼; ) HANGUL SYLLABLE TOEL +D1FD;D1FD;1110 116C 11B0;D1FD;1110 116C 11B0; # (퇽; 퇽; 퇽; 퇽; 퇽; ) HANGUL SYLLABLE TOELG +D1FE;D1FE;1110 116C 11B1;D1FE;1110 116C 11B1; # (퇾; 퇾; 퇾; 퇾; 퇾; ) HANGUL SYLLABLE TOELM +D1FF;D1FF;1110 116C 11B2;D1FF;1110 116C 11B2; # (퇿; 퇿; 퇿; 퇿; 퇿; ) HANGUL SYLLABLE TOELB +D200;D200;1110 116C 11B3;D200;1110 116C 11B3; # (툀; 툀; 툀; 툀; 툀; ) HANGUL SYLLABLE TOELS +D201;D201;1110 116C 11B4;D201;1110 116C 11B4; # (툁; 툁; 툁; 툁; 툁; ) HANGUL SYLLABLE TOELT +D202;D202;1110 116C 11B5;D202;1110 116C 11B5; # (툂; 툂; 툂; 툂; 툂; ) HANGUL SYLLABLE TOELP +D203;D203;1110 116C 11B6;D203;1110 116C 11B6; # (툃; 툃; 툃; 툃; 툃; ) HANGUL SYLLABLE TOELH +D204;D204;1110 116C 11B7;D204;1110 116C 11B7; # (툄; 툄; 툄; 툄; 툄; ) HANGUL SYLLABLE TOEM +D205;D205;1110 116C 11B8;D205;1110 116C 11B8; # (툅; 툅; 툅; 툅; 툅; ) HANGUL SYLLABLE TOEB +D206;D206;1110 116C 11B9;D206;1110 116C 11B9; # (툆; 툆; 툆; 툆; 툆; ) HANGUL SYLLABLE TOEBS +D207;D207;1110 116C 11BA;D207;1110 116C 11BA; # (툇; 툇; 툇; 툇; 툇; ) HANGUL SYLLABLE TOES +D208;D208;1110 116C 11BB;D208;1110 116C 11BB; # (툈; 툈; 툈; 툈; 툈; ) HANGUL SYLLABLE TOESS +D209;D209;1110 116C 11BC;D209;1110 116C 11BC; # (툉; 툉; 툉; 툉; 툉; ) HANGUL SYLLABLE TOENG +D20A;D20A;1110 116C 11BD;D20A;1110 116C 11BD; # (툊; 툊; 툊; 툊; 툊; ) HANGUL SYLLABLE TOEJ +D20B;D20B;1110 116C 11BE;D20B;1110 116C 11BE; # (툋; 툋; 툋; 툋; 툋; ) HANGUL SYLLABLE TOEC +D20C;D20C;1110 116C 11BF;D20C;1110 116C 11BF; # (툌; 툌; 툌; 툌; 툌; ) HANGUL SYLLABLE TOEK +D20D;D20D;1110 116C 11C0;D20D;1110 116C 11C0; # (툍; 툍; 툍; 툍; 툍; ) HANGUL SYLLABLE TOET +D20E;D20E;1110 116C 11C1;D20E;1110 116C 11C1; # (툎; 툎; 툎; 툎; 툎; ) HANGUL SYLLABLE TOEP +D20F;D20F;1110 116C 11C2;D20F;1110 116C 11C2; # (툏; 툏; 툏; 툏; 툏; ) HANGUL SYLLABLE TOEH +D210;D210;1110 116D;D210;1110 116D; # (툐; 툐; 툐; 툐; 툐; ) HANGUL SYLLABLE TYO +D211;D211;1110 116D 11A8;D211;1110 116D 11A8; # (툑; 툑; 툑; 툑; 툑; ) HANGUL SYLLABLE TYOG +D212;D212;1110 116D 11A9;D212;1110 116D 11A9; # (툒; 툒; 툒; 툒; 툒; ) HANGUL SYLLABLE TYOGG +D213;D213;1110 116D 11AA;D213;1110 116D 11AA; # (툓; 툓; 툓; 툓; 툓; ) HANGUL SYLLABLE TYOGS +D214;D214;1110 116D 11AB;D214;1110 116D 11AB; # (툔; 툔; 툔; 툔; 툔; ) HANGUL SYLLABLE TYON +D215;D215;1110 116D 11AC;D215;1110 116D 11AC; # (툕; 툕; 툕; 툕; 툕; ) HANGUL SYLLABLE TYONJ +D216;D216;1110 116D 11AD;D216;1110 116D 11AD; # (툖; 툖; 툖; 툖; 툖; ) HANGUL SYLLABLE TYONH +D217;D217;1110 116D 11AE;D217;1110 116D 11AE; # (툗; 툗; 툗; 툗; 툗; ) HANGUL SYLLABLE TYOD +D218;D218;1110 116D 11AF;D218;1110 116D 11AF; # (툘; 툘; 툘; 툘; 툘; ) HANGUL SYLLABLE TYOL +D219;D219;1110 116D 11B0;D219;1110 116D 11B0; # (툙; 툙; 툙; 툙; 툙; ) HANGUL SYLLABLE TYOLG +D21A;D21A;1110 116D 11B1;D21A;1110 116D 11B1; # (툚; 툚; 툚; 툚; 툚; ) HANGUL SYLLABLE TYOLM +D21B;D21B;1110 116D 11B2;D21B;1110 116D 11B2; # (툛; 툛; 툛; 툛; 툛; ) HANGUL SYLLABLE TYOLB +D21C;D21C;1110 116D 11B3;D21C;1110 116D 11B3; # (툜; 툜; 툜; 툜; 툜; ) HANGUL SYLLABLE TYOLS +D21D;D21D;1110 116D 11B4;D21D;1110 116D 11B4; # (툝; 툝; 툝; 툝; 툝; ) HANGUL SYLLABLE TYOLT +D21E;D21E;1110 116D 11B5;D21E;1110 116D 11B5; # (툞; 툞; 툞; 툞; 툞; ) HANGUL SYLLABLE TYOLP +D21F;D21F;1110 116D 11B6;D21F;1110 116D 11B6; # (툟; 툟; 툟; 툟; 툟; ) HANGUL SYLLABLE TYOLH +D220;D220;1110 116D 11B7;D220;1110 116D 11B7; # (툠; 툠; 툠; 툠; 툠; ) HANGUL SYLLABLE TYOM +D221;D221;1110 116D 11B8;D221;1110 116D 11B8; # (툡; 툡; 툡; 툡; 툡; ) HANGUL SYLLABLE TYOB +D222;D222;1110 116D 11B9;D222;1110 116D 11B9; # (툢; 툢; 툢; 툢; 툢; ) HANGUL SYLLABLE TYOBS +D223;D223;1110 116D 11BA;D223;1110 116D 11BA; # (툣; 툣; 툣; 툣; 툣; ) HANGUL SYLLABLE TYOS +D224;D224;1110 116D 11BB;D224;1110 116D 11BB; # (툤; 툤; 툤; 툤; 툤; ) HANGUL SYLLABLE TYOSS +D225;D225;1110 116D 11BC;D225;1110 116D 11BC; # (툥; 툥; 툥; 툥; 툥; ) HANGUL SYLLABLE TYONG +D226;D226;1110 116D 11BD;D226;1110 116D 11BD; # (툦; 툦; 툦; 툦; 툦; ) HANGUL SYLLABLE TYOJ +D227;D227;1110 116D 11BE;D227;1110 116D 11BE; # (툧; 툧; 툧; 툧; 툧; ) HANGUL SYLLABLE TYOC +D228;D228;1110 116D 11BF;D228;1110 116D 11BF; # (툨; 툨; 툨; 툨; 툨; ) HANGUL SYLLABLE TYOK +D229;D229;1110 116D 11C0;D229;1110 116D 11C0; # (툩; 툩; 툩; 툩; 툩; ) HANGUL SYLLABLE TYOT +D22A;D22A;1110 116D 11C1;D22A;1110 116D 11C1; # (툪; 툪; 툪; 툪; 툪; ) HANGUL SYLLABLE TYOP +D22B;D22B;1110 116D 11C2;D22B;1110 116D 11C2; # (툫; 툫; 툫; 툫; 툫; ) HANGUL SYLLABLE TYOH +D22C;D22C;1110 116E;D22C;1110 116E; # (투; 투; 투; 투; 투; ) HANGUL SYLLABLE TU +D22D;D22D;1110 116E 11A8;D22D;1110 116E 11A8; # (툭; 툭; 툭; 툭; 툭; ) HANGUL SYLLABLE TUG +D22E;D22E;1110 116E 11A9;D22E;1110 116E 11A9; # (툮; 툮; 툮; 툮; 툮; ) HANGUL SYLLABLE TUGG +D22F;D22F;1110 116E 11AA;D22F;1110 116E 11AA; # (툯; 툯; 툯; 툯; 툯; ) HANGUL SYLLABLE TUGS +D230;D230;1110 116E 11AB;D230;1110 116E 11AB; # (툰; 툰; 툰; 툰; 툰; ) HANGUL SYLLABLE TUN +D231;D231;1110 116E 11AC;D231;1110 116E 11AC; # (툱; 툱; 툱; 툱; 툱; ) HANGUL SYLLABLE TUNJ +D232;D232;1110 116E 11AD;D232;1110 116E 11AD; # (툲; 툲; 툲; 툲; 툲; ) HANGUL SYLLABLE TUNH +D233;D233;1110 116E 11AE;D233;1110 116E 11AE; # (툳; 툳; 툳; 툳; 툳; ) HANGUL SYLLABLE TUD +D234;D234;1110 116E 11AF;D234;1110 116E 11AF; # (툴; 툴; 툴; 툴; 툴; ) HANGUL SYLLABLE TUL +D235;D235;1110 116E 11B0;D235;1110 116E 11B0; # (툵; 툵; 툵; 툵; 툵; ) HANGUL SYLLABLE TULG +D236;D236;1110 116E 11B1;D236;1110 116E 11B1; # (툶; 툶; 툶; 툶; 툶; ) HANGUL SYLLABLE TULM +D237;D237;1110 116E 11B2;D237;1110 116E 11B2; # (툷; 툷; 툷; 툷; 툷; ) HANGUL SYLLABLE TULB +D238;D238;1110 116E 11B3;D238;1110 116E 11B3; # (툸; 툸; 툸; 툸; 툸; ) HANGUL SYLLABLE TULS +D239;D239;1110 116E 11B4;D239;1110 116E 11B4; # (툹; 툹; 툹; 툹; 툹; ) HANGUL SYLLABLE TULT +D23A;D23A;1110 116E 11B5;D23A;1110 116E 11B5; # (툺; 툺; 툺; 툺; 툺; ) HANGUL SYLLABLE TULP +D23B;D23B;1110 116E 11B6;D23B;1110 116E 11B6; # (툻; 툻; 툻; 툻; 툻; ) HANGUL SYLLABLE TULH +D23C;D23C;1110 116E 11B7;D23C;1110 116E 11B7; # (툼; 툼; 툼; 툼; 툼; ) HANGUL SYLLABLE TUM +D23D;D23D;1110 116E 11B8;D23D;1110 116E 11B8; # (툽; 툽; 툽; 툽; 툽; ) HANGUL SYLLABLE TUB +D23E;D23E;1110 116E 11B9;D23E;1110 116E 11B9; # (툾; 툾; 툾; 툾; 툾; ) HANGUL SYLLABLE TUBS +D23F;D23F;1110 116E 11BA;D23F;1110 116E 11BA; # (툿; 툿; 툿; 툿; 툿; ) HANGUL SYLLABLE TUS +D240;D240;1110 116E 11BB;D240;1110 116E 11BB; # (퉀; 퉀; 퉀; 퉀; 퉀; ) HANGUL SYLLABLE TUSS +D241;D241;1110 116E 11BC;D241;1110 116E 11BC; # (퉁; 퉁; 퉁; 퉁; 퉁; ) HANGUL SYLLABLE TUNG +D242;D242;1110 116E 11BD;D242;1110 116E 11BD; # (퉂; 퉂; 퉂; 퉂; 퉂; ) HANGUL SYLLABLE TUJ +D243;D243;1110 116E 11BE;D243;1110 116E 11BE; # (퉃; 퉃; 퉃; 퉃; 퉃; ) HANGUL SYLLABLE TUC +D244;D244;1110 116E 11BF;D244;1110 116E 11BF; # (퉄; 퉄; 퉄; 퉄; 퉄; ) HANGUL SYLLABLE TUK +D245;D245;1110 116E 11C0;D245;1110 116E 11C0; # (퉅; 퉅; 퉅; 퉅; 퉅; ) HANGUL SYLLABLE TUT +D246;D246;1110 116E 11C1;D246;1110 116E 11C1; # (퉆; 퉆; 퉆; 퉆; 퉆; ) HANGUL SYLLABLE TUP +D247;D247;1110 116E 11C2;D247;1110 116E 11C2; # (퉇; 퉇; 퉇; 퉇; 퉇; ) HANGUL SYLLABLE TUH +D248;D248;1110 116F;D248;1110 116F; # (퉈; 퉈; 퉈; 퉈; 퉈; ) HANGUL SYLLABLE TWEO +D249;D249;1110 116F 11A8;D249;1110 116F 11A8; # (퉉; 퉉; 퉉; 퉉; 퉉; ) HANGUL SYLLABLE TWEOG +D24A;D24A;1110 116F 11A9;D24A;1110 116F 11A9; # (퉊; 퉊; 퉊; 퉊; 퉊; ) HANGUL SYLLABLE TWEOGG +D24B;D24B;1110 116F 11AA;D24B;1110 116F 11AA; # (퉋; 퉋; 퉋; 퉋; 퉋; ) HANGUL SYLLABLE TWEOGS +D24C;D24C;1110 116F 11AB;D24C;1110 116F 11AB; # (퉌; 퉌; 퉌; 퉌; 퉌; ) HANGUL SYLLABLE TWEON +D24D;D24D;1110 116F 11AC;D24D;1110 116F 11AC; # (퉍; 퉍; 퉍; 퉍; 퉍; ) HANGUL SYLLABLE TWEONJ +D24E;D24E;1110 116F 11AD;D24E;1110 116F 11AD; # (퉎; 퉎; 퉎; 퉎; 퉎; ) HANGUL SYLLABLE TWEONH +D24F;D24F;1110 116F 11AE;D24F;1110 116F 11AE; # (퉏; 퉏; 퉏; 퉏; 퉏; ) HANGUL SYLLABLE TWEOD +D250;D250;1110 116F 11AF;D250;1110 116F 11AF; # (퉐; 퉐; 퉐; 퉐; 퉐; ) HANGUL SYLLABLE TWEOL +D251;D251;1110 116F 11B0;D251;1110 116F 11B0; # (퉑; 퉑; 퉑; 퉑; 퉑; ) HANGUL SYLLABLE TWEOLG +D252;D252;1110 116F 11B1;D252;1110 116F 11B1; # (퉒; 퉒; 퉒; 퉒; 퉒; ) HANGUL SYLLABLE TWEOLM +D253;D253;1110 116F 11B2;D253;1110 116F 11B2; # (퉓; 퉓; 퉓; 퉓; 퉓; ) HANGUL SYLLABLE TWEOLB +D254;D254;1110 116F 11B3;D254;1110 116F 11B3; # (퉔; 퉔; 퉔; 퉔; 퉔; ) HANGUL SYLLABLE TWEOLS +D255;D255;1110 116F 11B4;D255;1110 116F 11B4; # (퉕; 퉕; 퉕; 퉕; 퉕; ) HANGUL SYLLABLE TWEOLT +D256;D256;1110 116F 11B5;D256;1110 116F 11B5; # (퉖; 퉖; 퉖; 퉖; 퉖; ) HANGUL SYLLABLE TWEOLP +D257;D257;1110 116F 11B6;D257;1110 116F 11B6; # (퉗; 퉗; 퉗; 퉗; 퉗; ) HANGUL SYLLABLE TWEOLH +D258;D258;1110 116F 11B7;D258;1110 116F 11B7; # (퉘; 퉘; 퉘; 퉘; 퉘; ) HANGUL SYLLABLE TWEOM +D259;D259;1110 116F 11B8;D259;1110 116F 11B8; # (퉙; 퉙; 퉙; 퉙; 퉙; ) HANGUL SYLLABLE TWEOB +D25A;D25A;1110 116F 11B9;D25A;1110 116F 11B9; # (퉚; 퉚; 퉚; 퉚; 퉚; ) HANGUL SYLLABLE TWEOBS +D25B;D25B;1110 116F 11BA;D25B;1110 116F 11BA; # (퉛; 퉛; 퉛; 퉛; 퉛; ) HANGUL SYLLABLE TWEOS +D25C;D25C;1110 116F 11BB;D25C;1110 116F 11BB; # (퉜; 퉜; 퉜; 퉜; 퉜; ) HANGUL SYLLABLE TWEOSS +D25D;D25D;1110 116F 11BC;D25D;1110 116F 11BC; # (퉝; 퉝; 퉝; 퉝; 퉝; ) HANGUL SYLLABLE TWEONG +D25E;D25E;1110 116F 11BD;D25E;1110 116F 11BD; # (퉞; 퉞; 퉞; 퉞; 퉞; ) HANGUL SYLLABLE TWEOJ +D25F;D25F;1110 116F 11BE;D25F;1110 116F 11BE; # (퉟; 퉟; 퉟; 퉟; 퉟; ) HANGUL SYLLABLE TWEOC +D260;D260;1110 116F 11BF;D260;1110 116F 11BF; # (퉠; 퉠; 퉠; 퉠; 퉠; ) HANGUL SYLLABLE TWEOK +D261;D261;1110 116F 11C0;D261;1110 116F 11C0; # (퉡; 퉡; 퉡; 퉡; 퉡; ) HANGUL SYLLABLE TWEOT +D262;D262;1110 116F 11C1;D262;1110 116F 11C1; # (퉢; 퉢; 퉢; 퉢; 퉢; ) HANGUL SYLLABLE TWEOP +D263;D263;1110 116F 11C2;D263;1110 116F 11C2; # (퉣; 퉣; 퉣; 퉣; 퉣; ) HANGUL SYLLABLE TWEOH +D264;D264;1110 1170;D264;1110 1170; # (퉤; 퉤; 퉤; 퉤; 퉤; ) HANGUL SYLLABLE TWE +D265;D265;1110 1170 11A8;D265;1110 1170 11A8; # (퉥; 퉥; 퉥; 퉥; 퉥; ) HANGUL SYLLABLE TWEG +D266;D266;1110 1170 11A9;D266;1110 1170 11A9; # (퉦; 퉦; 퉦; 퉦; 퉦; ) HANGUL SYLLABLE TWEGG +D267;D267;1110 1170 11AA;D267;1110 1170 11AA; # (퉧; 퉧; 퉧; 퉧; 퉧; ) HANGUL SYLLABLE TWEGS +D268;D268;1110 1170 11AB;D268;1110 1170 11AB; # (퉨; 퉨; 퉨; 퉨; 퉨; ) HANGUL SYLLABLE TWEN +D269;D269;1110 1170 11AC;D269;1110 1170 11AC; # (퉩; 퉩; 퉩; 퉩; 퉩; ) HANGUL SYLLABLE TWENJ +D26A;D26A;1110 1170 11AD;D26A;1110 1170 11AD; # (퉪; 퉪; 퉪; 퉪; 퉪; ) HANGUL SYLLABLE TWENH +D26B;D26B;1110 1170 11AE;D26B;1110 1170 11AE; # (퉫; 퉫; 퉫; 퉫; 퉫; ) HANGUL SYLLABLE TWED +D26C;D26C;1110 1170 11AF;D26C;1110 1170 11AF; # (퉬; 퉬; 퉬; 퉬; 퉬; ) HANGUL SYLLABLE TWEL +D26D;D26D;1110 1170 11B0;D26D;1110 1170 11B0; # (퉭; 퉭; 퉭; 퉭; 퉭; ) HANGUL SYLLABLE TWELG +D26E;D26E;1110 1170 11B1;D26E;1110 1170 11B1; # (퉮; 퉮; 퉮; 퉮; 퉮; ) HANGUL SYLLABLE TWELM +D26F;D26F;1110 1170 11B2;D26F;1110 1170 11B2; # (퉯; 퉯; 퉯; 퉯; 퉯; ) HANGUL SYLLABLE TWELB +D270;D270;1110 1170 11B3;D270;1110 1170 11B3; # (퉰; 퉰; 퉰; 퉰; 퉰; ) HANGUL SYLLABLE TWELS +D271;D271;1110 1170 11B4;D271;1110 1170 11B4; # (퉱; 퉱; 퉱; 퉱; 퉱; ) HANGUL SYLLABLE TWELT +D272;D272;1110 1170 11B5;D272;1110 1170 11B5; # (퉲; 퉲; 퉲; 퉲; 퉲; ) HANGUL SYLLABLE TWELP +D273;D273;1110 1170 11B6;D273;1110 1170 11B6; # (퉳; 퉳; 퉳; 퉳; 퉳; ) HANGUL SYLLABLE TWELH +D274;D274;1110 1170 11B7;D274;1110 1170 11B7; # (퉴; 퉴; 퉴; 퉴; 퉴; ) HANGUL SYLLABLE TWEM +D275;D275;1110 1170 11B8;D275;1110 1170 11B8; # (퉵; 퉵; 퉵; 퉵; 퉵; ) HANGUL SYLLABLE TWEB +D276;D276;1110 1170 11B9;D276;1110 1170 11B9; # (퉶; 퉶; 퉶; 퉶; 퉶; ) HANGUL SYLLABLE TWEBS +D277;D277;1110 1170 11BA;D277;1110 1170 11BA; # (퉷; 퉷; 퉷; 퉷; 퉷; ) HANGUL SYLLABLE TWES +D278;D278;1110 1170 11BB;D278;1110 1170 11BB; # (퉸; 퉸; 퉸; 퉸; 퉸; ) HANGUL SYLLABLE TWESS +D279;D279;1110 1170 11BC;D279;1110 1170 11BC; # (퉹; 퉹; 퉹; 퉹; 퉹; ) HANGUL SYLLABLE TWENG +D27A;D27A;1110 1170 11BD;D27A;1110 1170 11BD; # (퉺; 퉺; 퉺; 퉺; 퉺; ) HANGUL SYLLABLE TWEJ +D27B;D27B;1110 1170 11BE;D27B;1110 1170 11BE; # (퉻; 퉻; 퉻; 퉻; 퉻; ) HANGUL SYLLABLE TWEC +D27C;D27C;1110 1170 11BF;D27C;1110 1170 11BF; # (퉼; 퉼; 퉼; 퉼; 퉼; ) HANGUL SYLLABLE TWEK +D27D;D27D;1110 1170 11C0;D27D;1110 1170 11C0; # (퉽; 퉽; 퉽; 퉽; 퉽; ) HANGUL SYLLABLE TWET +D27E;D27E;1110 1170 11C1;D27E;1110 1170 11C1; # (퉾; 퉾; 퉾; 퉾; 퉾; ) HANGUL SYLLABLE TWEP +D27F;D27F;1110 1170 11C2;D27F;1110 1170 11C2; # (퉿; 퉿; 퉿; 퉿; 퉿; ) HANGUL SYLLABLE TWEH +D280;D280;1110 1171;D280;1110 1171; # (튀; 튀; 튀; 튀; 튀; ) HANGUL SYLLABLE TWI +D281;D281;1110 1171 11A8;D281;1110 1171 11A8; # (튁; 튁; 튁; 튁; 튁; ) HANGUL SYLLABLE TWIG +D282;D282;1110 1171 11A9;D282;1110 1171 11A9; # (튂; 튂; 튂; 튂; 튂; ) HANGUL SYLLABLE TWIGG +D283;D283;1110 1171 11AA;D283;1110 1171 11AA; # (튃; 튃; 튃; 튃; 튃; ) HANGUL SYLLABLE TWIGS +D284;D284;1110 1171 11AB;D284;1110 1171 11AB; # (튄; 튄; 튄; 튄; 튄; ) HANGUL SYLLABLE TWIN +D285;D285;1110 1171 11AC;D285;1110 1171 11AC; # (튅; 튅; 튅; 튅; 튅; ) HANGUL SYLLABLE TWINJ +D286;D286;1110 1171 11AD;D286;1110 1171 11AD; # (튆; 튆; 튆; 튆; 튆; ) HANGUL SYLLABLE TWINH +D287;D287;1110 1171 11AE;D287;1110 1171 11AE; # (튇; 튇; 튇; 튇; 튇; ) HANGUL SYLLABLE TWID +D288;D288;1110 1171 11AF;D288;1110 1171 11AF; # (튈; 튈; 튈; 튈; 튈; ) HANGUL SYLLABLE TWIL +D289;D289;1110 1171 11B0;D289;1110 1171 11B0; # (튉; 튉; 튉; 튉; 튉; ) HANGUL SYLLABLE TWILG +D28A;D28A;1110 1171 11B1;D28A;1110 1171 11B1; # (튊; 튊; 튊; 튊; 튊; ) HANGUL SYLLABLE TWILM +D28B;D28B;1110 1171 11B2;D28B;1110 1171 11B2; # (튋; 튋; 튋; 튋; 튋; ) HANGUL SYLLABLE TWILB +D28C;D28C;1110 1171 11B3;D28C;1110 1171 11B3; # (튌; 튌; 튌; 튌; 튌; ) HANGUL SYLLABLE TWILS +D28D;D28D;1110 1171 11B4;D28D;1110 1171 11B4; # (튍; 튍; 튍; 튍; 튍; ) HANGUL SYLLABLE TWILT +D28E;D28E;1110 1171 11B5;D28E;1110 1171 11B5; # (튎; 튎; 튎; 튎; 튎; ) HANGUL SYLLABLE TWILP +D28F;D28F;1110 1171 11B6;D28F;1110 1171 11B6; # (튏; 튏; 튏; 튏; 튏; ) HANGUL SYLLABLE TWILH +D290;D290;1110 1171 11B7;D290;1110 1171 11B7; # (튐; 튐; 튐; 튐; 튐; ) HANGUL SYLLABLE TWIM +D291;D291;1110 1171 11B8;D291;1110 1171 11B8; # (튑; 튑; 튑; 튑; 튑; ) HANGUL SYLLABLE TWIB +D292;D292;1110 1171 11B9;D292;1110 1171 11B9; # (튒; 튒; 튒; 튒; 튒; ) HANGUL SYLLABLE TWIBS +D293;D293;1110 1171 11BA;D293;1110 1171 11BA; # (튓; 튓; 튓; 튓; 튓; ) HANGUL SYLLABLE TWIS +D294;D294;1110 1171 11BB;D294;1110 1171 11BB; # (튔; 튔; 튔; 튔; 튔; ) HANGUL SYLLABLE TWISS +D295;D295;1110 1171 11BC;D295;1110 1171 11BC; # (튕; 튕; 튕; 튕; 튕; ) HANGUL SYLLABLE TWING +D296;D296;1110 1171 11BD;D296;1110 1171 11BD; # (튖; 튖; 튖; 튖; 튖; ) HANGUL SYLLABLE TWIJ +D297;D297;1110 1171 11BE;D297;1110 1171 11BE; # (튗; 튗; 튗; 튗; 튗; ) HANGUL SYLLABLE TWIC +D298;D298;1110 1171 11BF;D298;1110 1171 11BF; # (튘; 튘; 튘; 튘; 튘; ) HANGUL SYLLABLE TWIK +D299;D299;1110 1171 11C0;D299;1110 1171 11C0; # (튙; 튙; 튙; 튙; 튙; ) HANGUL SYLLABLE TWIT +D29A;D29A;1110 1171 11C1;D29A;1110 1171 11C1; # (튚; 튚; 튚; 튚; 튚; ) HANGUL SYLLABLE TWIP +D29B;D29B;1110 1171 11C2;D29B;1110 1171 11C2; # (튛; 튛; 튛; 튛; 튛; ) HANGUL SYLLABLE TWIH +D29C;D29C;1110 1172;D29C;1110 1172; # (튜; 튜; 튜; 튜; 튜; ) HANGUL SYLLABLE TYU +D29D;D29D;1110 1172 11A8;D29D;1110 1172 11A8; # (튝; 튝; 튝; 튝; 튝; ) HANGUL SYLLABLE TYUG +D29E;D29E;1110 1172 11A9;D29E;1110 1172 11A9; # (튞; 튞; 튞; 튞; 튞; ) HANGUL SYLLABLE TYUGG +D29F;D29F;1110 1172 11AA;D29F;1110 1172 11AA; # (튟; 튟; 튟; 튟; 튟; ) HANGUL SYLLABLE TYUGS +D2A0;D2A0;1110 1172 11AB;D2A0;1110 1172 11AB; # (튠; 튠; 튠; 튠; 튠; ) HANGUL SYLLABLE TYUN +D2A1;D2A1;1110 1172 11AC;D2A1;1110 1172 11AC; # (튡; 튡; 튡; 튡; 튡; ) HANGUL SYLLABLE TYUNJ +D2A2;D2A2;1110 1172 11AD;D2A2;1110 1172 11AD; # (튢; 튢; 튢; 튢; 튢; ) HANGUL SYLLABLE TYUNH +D2A3;D2A3;1110 1172 11AE;D2A3;1110 1172 11AE; # (튣; 튣; 튣; 튣; 튣; ) HANGUL SYLLABLE TYUD +D2A4;D2A4;1110 1172 11AF;D2A4;1110 1172 11AF; # (튤; 튤; 튤; 튤; 튤; ) HANGUL SYLLABLE TYUL +D2A5;D2A5;1110 1172 11B0;D2A5;1110 1172 11B0; # (튥; 튥; 튥; 튥; 튥; ) HANGUL SYLLABLE TYULG +D2A6;D2A6;1110 1172 11B1;D2A6;1110 1172 11B1; # (튦; 튦; 튦; 튦; 튦; ) HANGUL SYLLABLE TYULM +D2A7;D2A7;1110 1172 11B2;D2A7;1110 1172 11B2; # (튧; 튧; 튧; 튧; 튧; ) HANGUL SYLLABLE TYULB +D2A8;D2A8;1110 1172 11B3;D2A8;1110 1172 11B3; # (튨; 튨; 튨; 튨; 튨; ) HANGUL SYLLABLE TYULS +D2A9;D2A9;1110 1172 11B4;D2A9;1110 1172 11B4; # (튩; 튩; 튩; 튩; 튩; ) HANGUL SYLLABLE TYULT +D2AA;D2AA;1110 1172 11B5;D2AA;1110 1172 11B5; # (튪; 튪; 튪; 튪; 튪; ) HANGUL SYLLABLE TYULP +D2AB;D2AB;1110 1172 11B6;D2AB;1110 1172 11B6; # (튫; 튫; 튫; 튫; 튫; ) HANGUL SYLLABLE TYULH +D2AC;D2AC;1110 1172 11B7;D2AC;1110 1172 11B7; # (튬; 튬; 튬; 튬; 튬; ) HANGUL SYLLABLE TYUM +D2AD;D2AD;1110 1172 11B8;D2AD;1110 1172 11B8; # (튭; 튭; 튭; 튭; 튭; ) HANGUL SYLLABLE TYUB +D2AE;D2AE;1110 1172 11B9;D2AE;1110 1172 11B9; # (튮; 튮; 튮; 튮; 튮; ) HANGUL SYLLABLE TYUBS +D2AF;D2AF;1110 1172 11BA;D2AF;1110 1172 11BA; # (튯; 튯; 튯; 튯; 튯; ) HANGUL SYLLABLE TYUS +D2B0;D2B0;1110 1172 11BB;D2B0;1110 1172 11BB; # (튰; 튰; 튰; 튰; 튰; ) HANGUL SYLLABLE TYUSS +D2B1;D2B1;1110 1172 11BC;D2B1;1110 1172 11BC; # (튱; 튱; 튱; 튱; 튱; ) HANGUL SYLLABLE TYUNG +D2B2;D2B2;1110 1172 11BD;D2B2;1110 1172 11BD; # (튲; 튲; 튲; 튲; 튲; ) HANGUL SYLLABLE TYUJ +D2B3;D2B3;1110 1172 11BE;D2B3;1110 1172 11BE; # (튳; 튳; 튳; 튳; 튳; ) HANGUL SYLLABLE TYUC +D2B4;D2B4;1110 1172 11BF;D2B4;1110 1172 11BF; # (튴; 튴; 튴; 튴; 튴; ) HANGUL SYLLABLE TYUK +D2B5;D2B5;1110 1172 11C0;D2B5;1110 1172 11C0; # (튵; 튵; 튵; 튵; 튵; ) HANGUL SYLLABLE TYUT +D2B6;D2B6;1110 1172 11C1;D2B6;1110 1172 11C1; # (튶; 튶; 튶; 튶; 튶; ) HANGUL SYLLABLE TYUP +D2B7;D2B7;1110 1172 11C2;D2B7;1110 1172 11C2; # (튷; 튷; 튷; 튷; 튷; ) HANGUL SYLLABLE TYUH +D2B8;D2B8;1110 1173;D2B8;1110 1173; # (트; 트; 트; 트; 트; ) HANGUL SYLLABLE TEU +D2B9;D2B9;1110 1173 11A8;D2B9;1110 1173 11A8; # (특; 특; 특; 특; 특; ) HANGUL SYLLABLE TEUG +D2BA;D2BA;1110 1173 11A9;D2BA;1110 1173 11A9; # (튺; 튺; 튺; 튺; 튺; ) HANGUL SYLLABLE TEUGG +D2BB;D2BB;1110 1173 11AA;D2BB;1110 1173 11AA; # (튻; 튻; 튻; 튻; 튻; ) HANGUL SYLLABLE TEUGS +D2BC;D2BC;1110 1173 11AB;D2BC;1110 1173 11AB; # (튼; 튼; 튼; 튼; 튼; ) HANGUL SYLLABLE TEUN +D2BD;D2BD;1110 1173 11AC;D2BD;1110 1173 11AC; # (튽; 튽; 튽; 튽; 튽; ) HANGUL SYLLABLE TEUNJ +D2BE;D2BE;1110 1173 11AD;D2BE;1110 1173 11AD; # (튾; 튾; 튾; 튾; 튾; ) HANGUL SYLLABLE TEUNH +D2BF;D2BF;1110 1173 11AE;D2BF;1110 1173 11AE; # (튿; 튿; 튿; 튿; 튿; ) HANGUL SYLLABLE TEUD +D2C0;D2C0;1110 1173 11AF;D2C0;1110 1173 11AF; # (틀; 틀; 틀; 틀; 틀; ) HANGUL SYLLABLE TEUL +D2C1;D2C1;1110 1173 11B0;D2C1;1110 1173 11B0; # (틁; 틁; 틁; 틁; 틁; ) HANGUL SYLLABLE TEULG +D2C2;D2C2;1110 1173 11B1;D2C2;1110 1173 11B1; # (틂; 틂; 틂; 틂; 틂; ) HANGUL SYLLABLE TEULM +D2C3;D2C3;1110 1173 11B2;D2C3;1110 1173 11B2; # (틃; 틃; 틃; 틃; 틃; ) HANGUL SYLLABLE TEULB +D2C4;D2C4;1110 1173 11B3;D2C4;1110 1173 11B3; # (틄; 틄; 틄; 틄; 틄; ) HANGUL SYLLABLE TEULS +D2C5;D2C5;1110 1173 11B4;D2C5;1110 1173 11B4; # (틅; 틅; 틅; 틅; 틅; ) HANGUL SYLLABLE TEULT +D2C6;D2C6;1110 1173 11B5;D2C6;1110 1173 11B5; # (틆; 틆; 틆; 틆; 틆; ) HANGUL SYLLABLE TEULP +D2C7;D2C7;1110 1173 11B6;D2C7;1110 1173 11B6; # (틇; 틇; 틇; 틇; 틇; ) HANGUL SYLLABLE TEULH +D2C8;D2C8;1110 1173 11B7;D2C8;1110 1173 11B7; # (틈; 틈; 틈; 틈; 틈; ) HANGUL SYLLABLE TEUM +D2C9;D2C9;1110 1173 11B8;D2C9;1110 1173 11B8; # (틉; 틉; 틉; 틉; 틉; ) HANGUL SYLLABLE TEUB +D2CA;D2CA;1110 1173 11B9;D2CA;1110 1173 11B9; # (틊; 틊; 틊; 틊; 틊; ) HANGUL SYLLABLE TEUBS +D2CB;D2CB;1110 1173 11BA;D2CB;1110 1173 11BA; # (틋; 틋; 틋; 틋; 틋; ) HANGUL SYLLABLE TEUS +D2CC;D2CC;1110 1173 11BB;D2CC;1110 1173 11BB; # (틌; 틌; 틌; 틌; 틌; ) HANGUL SYLLABLE TEUSS +D2CD;D2CD;1110 1173 11BC;D2CD;1110 1173 11BC; # (틍; 틍; 틍; 틍; 틍; ) HANGUL SYLLABLE TEUNG +D2CE;D2CE;1110 1173 11BD;D2CE;1110 1173 11BD; # (틎; 틎; 틎; 틎; 틎; ) HANGUL SYLLABLE TEUJ +D2CF;D2CF;1110 1173 11BE;D2CF;1110 1173 11BE; # (틏; 틏; 틏; 틏; 틏; ) HANGUL SYLLABLE TEUC +D2D0;D2D0;1110 1173 11BF;D2D0;1110 1173 11BF; # (틐; 틐; 틐; 틐; 틐; ) HANGUL SYLLABLE TEUK +D2D1;D2D1;1110 1173 11C0;D2D1;1110 1173 11C0; # (틑; 틑; 틑; 틑; 틑; ) HANGUL SYLLABLE TEUT +D2D2;D2D2;1110 1173 11C1;D2D2;1110 1173 11C1; # (틒; 틒; 틒; 틒; 틒; ) HANGUL SYLLABLE TEUP +D2D3;D2D3;1110 1173 11C2;D2D3;1110 1173 11C2; # (틓; 틓; 틓; 틓; 틓; ) HANGUL SYLLABLE TEUH +D2D4;D2D4;1110 1174;D2D4;1110 1174; # (틔; 틔; 틔; 틔; 틔; ) HANGUL SYLLABLE TYI +D2D5;D2D5;1110 1174 11A8;D2D5;1110 1174 11A8; # (틕; 틕; 틕; 틕; 틕; ) HANGUL SYLLABLE TYIG +D2D6;D2D6;1110 1174 11A9;D2D6;1110 1174 11A9; # (틖; 틖; 틖; 틖; 틖; ) HANGUL SYLLABLE TYIGG +D2D7;D2D7;1110 1174 11AA;D2D7;1110 1174 11AA; # (틗; 틗; 틗; 틗; 틗; ) HANGUL SYLLABLE TYIGS +D2D8;D2D8;1110 1174 11AB;D2D8;1110 1174 11AB; # (틘; 틘; 틘; 틘; 틘; ) HANGUL SYLLABLE TYIN +D2D9;D2D9;1110 1174 11AC;D2D9;1110 1174 11AC; # (틙; 틙; 틙; 틙; 틙; ) HANGUL SYLLABLE TYINJ +D2DA;D2DA;1110 1174 11AD;D2DA;1110 1174 11AD; # (틚; 틚; 틚; 틚; 틚; ) HANGUL SYLLABLE TYINH +D2DB;D2DB;1110 1174 11AE;D2DB;1110 1174 11AE; # (틛; 틛; 틛; 틛; 틛; ) HANGUL SYLLABLE TYID +D2DC;D2DC;1110 1174 11AF;D2DC;1110 1174 11AF; # (틜; 틜; 틜; 틜; 틜; ) HANGUL SYLLABLE TYIL +D2DD;D2DD;1110 1174 11B0;D2DD;1110 1174 11B0; # (틝; 틝; 틝; 틝; 틝; ) HANGUL SYLLABLE TYILG +D2DE;D2DE;1110 1174 11B1;D2DE;1110 1174 11B1; # (틞; 틞; 틞; 틞; 틞; ) HANGUL SYLLABLE TYILM +D2DF;D2DF;1110 1174 11B2;D2DF;1110 1174 11B2; # (틟; 틟; 틟; 틟; 틟; ) HANGUL SYLLABLE TYILB +D2E0;D2E0;1110 1174 11B3;D2E0;1110 1174 11B3; # (틠; 틠; 틠; 틠; 틠; ) HANGUL SYLLABLE TYILS +D2E1;D2E1;1110 1174 11B4;D2E1;1110 1174 11B4; # (틡; 틡; 틡; 틡; 틡; ) HANGUL SYLLABLE TYILT +D2E2;D2E2;1110 1174 11B5;D2E2;1110 1174 11B5; # (틢; 틢; 틢; 틢; 틢; ) HANGUL SYLLABLE TYILP +D2E3;D2E3;1110 1174 11B6;D2E3;1110 1174 11B6; # (틣; 틣; 틣; 틣; 틣; ) HANGUL SYLLABLE TYILH +D2E4;D2E4;1110 1174 11B7;D2E4;1110 1174 11B7; # (틤; 틤; 틤; 틤; 틤; ) HANGUL SYLLABLE TYIM +D2E5;D2E5;1110 1174 11B8;D2E5;1110 1174 11B8; # (틥; 틥; 틥; 틥; 틥; ) HANGUL SYLLABLE TYIB +D2E6;D2E6;1110 1174 11B9;D2E6;1110 1174 11B9; # (틦; 틦; 틦; 틦; 틦; ) HANGUL SYLLABLE TYIBS +D2E7;D2E7;1110 1174 11BA;D2E7;1110 1174 11BA; # (틧; 틧; 틧; 틧; 틧; ) HANGUL SYLLABLE TYIS +D2E8;D2E8;1110 1174 11BB;D2E8;1110 1174 11BB; # (틨; 틨; 틨; 틨; 틨; ) HANGUL SYLLABLE TYISS +D2E9;D2E9;1110 1174 11BC;D2E9;1110 1174 11BC; # (틩; 틩; 틩; 틩; 틩; ) HANGUL SYLLABLE TYING +D2EA;D2EA;1110 1174 11BD;D2EA;1110 1174 11BD; # (틪; 틪; 틪; 틪; 틪; ) HANGUL SYLLABLE TYIJ +D2EB;D2EB;1110 1174 11BE;D2EB;1110 1174 11BE; # (틫; 틫; 틫; 틫; 틫; ) HANGUL SYLLABLE TYIC +D2EC;D2EC;1110 1174 11BF;D2EC;1110 1174 11BF; # (틬; 틬; 틬; 틬; 틬; ) HANGUL SYLLABLE TYIK +D2ED;D2ED;1110 1174 11C0;D2ED;1110 1174 11C0; # (틭; 틭; 틭; 틭; 틭; ) HANGUL SYLLABLE TYIT +D2EE;D2EE;1110 1174 11C1;D2EE;1110 1174 11C1; # (틮; 틮; 틮; 틮; 틮; ) HANGUL SYLLABLE TYIP +D2EF;D2EF;1110 1174 11C2;D2EF;1110 1174 11C2; # (틯; 틯; 틯; 틯; 틯; ) HANGUL SYLLABLE TYIH +D2F0;D2F0;1110 1175;D2F0;1110 1175; # (티; 티; 티; 티; 티; ) HANGUL SYLLABLE TI +D2F1;D2F1;1110 1175 11A8;D2F1;1110 1175 11A8; # (틱; 틱; 틱; 틱; 틱; ) HANGUL SYLLABLE TIG +D2F2;D2F2;1110 1175 11A9;D2F2;1110 1175 11A9; # (틲; 틲; 틲; 틲; 틲; ) HANGUL SYLLABLE TIGG +D2F3;D2F3;1110 1175 11AA;D2F3;1110 1175 11AA; # (틳; 틳; 틳; 틳; 틳; ) HANGUL SYLLABLE TIGS +D2F4;D2F4;1110 1175 11AB;D2F4;1110 1175 11AB; # (틴; 틴; 틴; 틴; 틴; ) HANGUL SYLLABLE TIN +D2F5;D2F5;1110 1175 11AC;D2F5;1110 1175 11AC; # (틵; 틵; 틵; 틵; 틵; ) HANGUL SYLLABLE TINJ +D2F6;D2F6;1110 1175 11AD;D2F6;1110 1175 11AD; # (틶; 틶; 틶; 틶; 틶; ) HANGUL SYLLABLE TINH +D2F7;D2F7;1110 1175 11AE;D2F7;1110 1175 11AE; # (틷; 틷; 틷; 틷; 틷; ) HANGUL SYLLABLE TID +D2F8;D2F8;1110 1175 11AF;D2F8;1110 1175 11AF; # (틸; 틸; 틸; 틸; 틸; ) HANGUL SYLLABLE TIL +D2F9;D2F9;1110 1175 11B0;D2F9;1110 1175 11B0; # (틹; 틹; 틹; 틹; 틹; ) HANGUL SYLLABLE TILG +D2FA;D2FA;1110 1175 11B1;D2FA;1110 1175 11B1; # (틺; 틺; 틺; 틺; 틺; ) HANGUL SYLLABLE TILM +D2FB;D2FB;1110 1175 11B2;D2FB;1110 1175 11B2; # (틻; 틻; 틻; 틻; 틻; ) HANGUL SYLLABLE TILB +D2FC;D2FC;1110 1175 11B3;D2FC;1110 1175 11B3; # (틼; 틼; 틼; 틼; 틼; ) HANGUL SYLLABLE TILS +D2FD;D2FD;1110 1175 11B4;D2FD;1110 1175 11B4; # (틽; 틽; 틽; 틽; 틽; ) HANGUL SYLLABLE TILT +D2FE;D2FE;1110 1175 11B5;D2FE;1110 1175 11B5; # (틾; 틾; 틾; 틾; 틾; ) HANGUL SYLLABLE TILP +D2FF;D2FF;1110 1175 11B6;D2FF;1110 1175 11B6; # (틿; 틿; 틿; 틿; 틿; ) HANGUL SYLLABLE TILH +D300;D300;1110 1175 11B7;D300;1110 1175 11B7; # (팀; 팀; 팀; 팀; 팀; ) HANGUL SYLLABLE TIM +D301;D301;1110 1175 11B8;D301;1110 1175 11B8; # (팁; 팁; 팁; 팁; 팁; ) HANGUL SYLLABLE TIB +D302;D302;1110 1175 11B9;D302;1110 1175 11B9; # (팂; 팂; 팂; 팂; 팂; ) HANGUL SYLLABLE TIBS +D303;D303;1110 1175 11BA;D303;1110 1175 11BA; # (팃; 팃; 팃; 팃; 팃; ) HANGUL SYLLABLE TIS +D304;D304;1110 1175 11BB;D304;1110 1175 11BB; # (팄; 팄; 팄; 팄; 팄; ) HANGUL SYLLABLE TISS +D305;D305;1110 1175 11BC;D305;1110 1175 11BC; # (팅; 팅; 팅; 팅; 팅; ) HANGUL SYLLABLE TING +D306;D306;1110 1175 11BD;D306;1110 1175 11BD; # (팆; 팆; 팆; 팆; 팆; ) HANGUL SYLLABLE TIJ +D307;D307;1110 1175 11BE;D307;1110 1175 11BE; # (팇; 팇; 팇; 팇; 팇; ) HANGUL SYLLABLE TIC +D308;D308;1110 1175 11BF;D308;1110 1175 11BF; # (팈; 팈; 팈; 팈; 팈; ) HANGUL SYLLABLE TIK +D309;D309;1110 1175 11C0;D309;1110 1175 11C0; # (팉; 팉; 팉; 팉; 팉; ) HANGUL SYLLABLE TIT +D30A;D30A;1110 1175 11C1;D30A;1110 1175 11C1; # (팊; 팊; 팊; 팊; 팊; ) HANGUL SYLLABLE TIP +D30B;D30B;1110 1175 11C2;D30B;1110 1175 11C2; # (팋; 팋; 팋; 팋; 팋; ) HANGUL SYLLABLE TIH +D30C;D30C;1111 1161;D30C;1111 1161; # (파; 파; 파; 파; 파; ) HANGUL SYLLABLE PA +D30D;D30D;1111 1161 11A8;D30D;1111 1161 11A8; # (팍; 팍; 팍; 팍; 팍; ) HANGUL SYLLABLE PAG +D30E;D30E;1111 1161 11A9;D30E;1111 1161 11A9; # (팎; 팎; 팎; 팎; 팎; ) HANGUL SYLLABLE PAGG +D30F;D30F;1111 1161 11AA;D30F;1111 1161 11AA; # (팏; 팏; 팏; 팏; 팏; ) HANGUL SYLLABLE PAGS +D310;D310;1111 1161 11AB;D310;1111 1161 11AB; # (판; 판; 판; 판; 판; ) HANGUL SYLLABLE PAN +D311;D311;1111 1161 11AC;D311;1111 1161 11AC; # (팑; 팑; 팑; 팑; 팑; ) HANGUL SYLLABLE PANJ +D312;D312;1111 1161 11AD;D312;1111 1161 11AD; # (팒; 팒; 팒; 팒; 팒; ) HANGUL SYLLABLE PANH +D313;D313;1111 1161 11AE;D313;1111 1161 11AE; # (팓; 팓; 팓; 팓; 팓; ) HANGUL SYLLABLE PAD +D314;D314;1111 1161 11AF;D314;1111 1161 11AF; # (팔; 팔; 팔; 팔; 팔; ) HANGUL SYLLABLE PAL +D315;D315;1111 1161 11B0;D315;1111 1161 11B0; # (팕; 팕; 팕; 팕; 팕; ) HANGUL SYLLABLE PALG +D316;D316;1111 1161 11B1;D316;1111 1161 11B1; # (팖; 팖; 팖; 팖; 팖; ) HANGUL SYLLABLE PALM +D317;D317;1111 1161 11B2;D317;1111 1161 11B2; # (팗; 팗; 팗; 팗; 팗; ) HANGUL SYLLABLE PALB +D318;D318;1111 1161 11B3;D318;1111 1161 11B3; # (팘; 팘; 팘; 팘; 팘; ) HANGUL SYLLABLE PALS +D319;D319;1111 1161 11B4;D319;1111 1161 11B4; # (팙; 팙; 팙; 팙; 팙; ) HANGUL SYLLABLE PALT +D31A;D31A;1111 1161 11B5;D31A;1111 1161 11B5; # (팚; 팚; 팚; 팚; 팚; ) HANGUL SYLLABLE PALP +D31B;D31B;1111 1161 11B6;D31B;1111 1161 11B6; # (팛; 팛; 팛; 팛; 팛; ) HANGUL SYLLABLE PALH +D31C;D31C;1111 1161 11B7;D31C;1111 1161 11B7; # (팜; 팜; 팜; 팜; 팜; ) HANGUL SYLLABLE PAM +D31D;D31D;1111 1161 11B8;D31D;1111 1161 11B8; # (팝; 팝; 팝; 팝; 팝; ) HANGUL SYLLABLE PAB +D31E;D31E;1111 1161 11B9;D31E;1111 1161 11B9; # (팞; 팞; 팞; 팞; 팞; ) HANGUL SYLLABLE PABS +D31F;D31F;1111 1161 11BA;D31F;1111 1161 11BA; # (팟; 팟; 팟; 팟; 팟; ) HANGUL SYLLABLE PAS +D320;D320;1111 1161 11BB;D320;1111 1161 11BB; # (팠; 팠; 팠; 팠; 팠; ) HANGUL SYLLABLE PASS +D321;D321;1111 1161 11BC;D321;1111 1161 11BC; # (팡; 팡; 팡; 팡; 팡; ) HANGUL SYLLABLE PANG +D322;D322;1111 1161 11BD;D322;1111 1161 11BD; # (팢; 팢; 팢; 팢; 팢; ) HANGUL SYLLABLE PAJ +D323;D323;1111 1161 11BE;D323;1111 1161 11BE; # (팣; 팣; 팣; 팣; 팣; ) HANGUL SYLLABLE PAC +D324;D324;1111 1161 11BF;D324;1111 1161 11BF; # (팤; 팤; 팤; 팤; 팤; ) HANGUL SYLLABLE PAK +D325;D325;1111 1161 11C0;D325;1111 1161 11C0; # (팥; 팥; 팥; 팥; 팥; ) HANGUL SYLLABLE PAT +D326;D326;1111 1161 11C1;D326;1111 1161 11C1; # (팦; 팦; 팦; 팦; 팦; ) HANGUL SYLLABLE PAP +D327;D327;1111 1161 11C2;D327;1111 1161 11C2; # (팧; 팧; 팧; 팧; 팧; ) HANGUL SYLLABLE PAH +D328;D328;1111 1162;D328;1111 1162; # (패; 패; 패; 패; 패; ) HANGUL SYLLABLE PAE +D329;D329;1111 1162 11A8;D329;1111 1162 11A8; # (팩; 팩; 팩; 팩; 팩; ) HANGUL SYLLABLE PAEG +D32A;D32A;1111 1162 11A9;D32A;1111 1162 11A9; # (팪; 팪; 팪; 팪; 팪; ) HANGUL SYLLABLE PAEGG +D32B;D32B;1111 1162 11AA;D32B;1111 1162 11AA; # (팫; 팫; 팫; 팫; 팫; ) HANGUL SYLLABLE PAEGS +D32C;D32C;1111 1162 11AB;D32C;1111 1162 11AB; # (팬; 팬; 팬; 팬; 팬; ) HANGUL SYLLABLE PAEN +D32D;D32D;1111 1162 11AC;D32D;1111 1162 11AC; # (팭; 팭; 팭; 팭; 팭; ) HANGUL SYLLABLE PAENJ +D32E;D32E;1111 1162 11AD;D32E;1111 1162 11AD; # (팮; 팮; 팮; 팮; 팮; ) HANGUL SYLLABLE PAENH +D32F;D32F;1111 1162 11AE;D32F;1111 1162 11AE; # (팯; 팯; 팯; 팯; 팯; ) HANGUL SYLLABLE PAED +D330;D330;1111 1162 11AF;D330;1111 1162 11AF; # (팰; 팰; 팰; 팰; 팰; ) HANGUL SYLLABLE PAEL +D331;D331;1111 1162 11B0;D331;1111 1162 11B0; # (팱; 팱; 팱; 팱; 팱; ) HANGUL SYLLABLE PAELG +D332;D332;1111 1162 11B1;D332;1111 1162 11B1; # (팲; 팲; 팲; 팲; 팲; ) HANGUL SYLLABLE PAELM +D333;D333;1111 1162 11B2;D333;1111 1162 11B2; # (팳; 팳; 팳; 팳; 팳; ) HANGUL SYLLABLE PAELB +D334;D334;1111 1162 11B3;D334;1111 1162 11B3; # (팴; 팴; 팴; 팴; 팴; ) HANGUL SYLLABLE PAELS +D335;D335;1111 1162 11B4;D335;1111 1162 11B4; # (팵; 팵; 팵; 팵; 팵; ) HANGUL SYLLABLE PAELT +D336;D336;1111 1162 11B5;D336;1111 1162 11B5; # (팶; 팶; 팶; 팶; 팶; ) HANGUL SYLLABLE PAELP +D337;D337;1111 1162 11B6;D337;1111 1162 11B6; # (팷; 팷; 팷; 팷; 팷; ) HANGUL SYLLABLE PAELH +D338;D338;1111 1162 11B7;D338;1111 1162 11B7; # (팸; 팸; 팸; 팸; 팸; ) HANGUL SYLLABLE PAEM +D339;D339;1111 1162 11B8;D339;1111 1162 11B8; # (팹; 팹; 팹; 팹; 팹; ) HANGUL SYLLABLE PAEB +D33A;D33A;1111 1162 11B9;D33A;1111 1162 11B9; # (팺; 팺; 팺; 팺; 팺; ) HANGUL SYLLABLE PAEBS +D33B;D33B;1111 1162 11BA;D33B;1111 1162 11BA; # (팻; 팻; 팻; 팻; 팻; ) HANGUL SYLLABLE PAES +D33C;D33C;1111 1162 11BB;D33C;1111 1162 11BB; # (팼; 팼; 팼; 팼; 팼; ) HANGUL SYLLABLE PAESS +D33D;D33D;1111 1162 11BC;D33D;1111 1162 11BC; # (팽; 팽; 팽; 팽; 팽; ) HANGUL SYLLABLE PAENG +D33E;D33E;1111 1162 11BD;D33E;1111 1162 11BD; # (팾; 팾; 팾; 팾; 팾; ) HANGUL SYLLABLE PAEJ +D33F;D33F;1111 1162 11BE;D33F;1111 1162 11BE; # (팿; 팿; 팿; 팿; 팿; ) HANGUL SYLLABLE PAEC +D340;D340;1111 1162 11BF;D340;1111 1162 11BF; # (퍀; 퍀; 퍀; 퍀; 퍀; ) HANGUL SYLLABLE PAEK +D341;D341;1111 1162 11C0;D341;1111 1162 11C0; # (퍁; 퍁; 퍁; 퍁; 퍁; ) HANGUL SYLLABLE PAET +D342;D342;1111 1162 11C1;D342;1111 1162 11C1; # (퍂; 퍂; 퍂; 퍂; 퍂; ) HANGUL SYLLABLE PAEP +D343;D343;1111 1162 11C2;D343;1111 1162 11C2; # (퍃; 퍃; 퍃; 퍃; 퍃; ) HANGUL SYLLABLE PAEH +D344;D344;1111 1163;D344;1111 1163; # (퍄; 퍄; 퍄; 퍄; 퍄; ) HANGUL SYLLABLE PYA +D345;D345;1111 1163 11A8;D345;1111 1163 11A8; # (퍅; 퍅; 퍅; 퍅; 퍅; ) HANGUL SYLLABLE PYAG +D346;D346;1111 1163 11A9;D346;1111 1163 11A9; # (퍆; 퍆; 퍆; 퍆; 퍆; ) HANGUL SYLLABLE PYAGG +D347;D347;1111 1163 11AA;D347;1111 1163 11AA; # (퍇; 퍇; 퍇; 퍇; 퍇; ) HANGUL SYLLABLE PYAGS +D348;D348;1111 1163 11AB;D348;1111 1163 11AB; # (퍈; 퍈; 퍈; 퍈; 퍈; ) HANGUL SYLLABLE PYAN +D349;D349;1111 1163 11AC;D349;1111 1163 11AC; # (퍉; 퍉; 퍉; 퍉; 퍉; ) HANGUL SYLLABLE PYANJ +D34A;D34A;1111 1163 11AD;D34A;1111 1163 11AD; # (퍊; 퍊; 퍊; 퍊; 퍊; ) HANGUL SYLLABLE PYANH +D34B;D34B;1111 1163 11AE;D34B;1111 1163 11AE; # (퍋; 퍋; 퍋; 퍋; 퍋; ) HANGUL SYLLABLE PYAD +D34C;D34C;1111 1163 11AF;D34C;1111 1163 11AF; # (퍌; 퍌; 퍌; 퍌; 퍌; ) HANGUL SYLLABLE PYAL +D34D;D34D;1111 1163 11B0;D34D;1111 1163 11B0; # (퍍; 퍍; 퍍; 퍍; 퍍; ) HANGUL SYLLABLE PYALG +D34E;D34E;1111 1163 11B1;D34E;1111 1163 11B1; # (퍎; 퍎; 퍎; 퍎; 퍎; ) HANGUL SYLLABLE PYALM +D34F;D34F;1111 1163 11B2;D34F;1111 1163 11B2; # (퍏; 퍏; 퍏; 퍏; 퍏; ) HANGUL SYLLABLE PYALB +D350;D350;1111 1163 11B3;D350;1111 1163 11B3; # (퍐; 퍐; 퍐; 퍐; 퍐; ) HANGUL SYLLABLE PYALS +D351;D351;1111 1163 11B4;D351;1111 1163 11B4; # (퍑; 퍑; 퍑; 퍑; 퍑; ) HANGUL SYLLABLE PYALT +D352;D352;1111 1163 11B5;D352;1111 1163 11B5; # (퍒; 퍒; 퍒; 퍒; 퍒; ) HANGUL SYLLABLE PYALP +D353;D353;1111 1163 11B6;D353;1111 1163 11B6; # (퍓; 퍓; 퍓; 퍓; 퍓; ) HANGUL SYLLABLE PYALH +D354;D354;1111 1163 11B7;D354;1111 1163 11B7; # (퍔; 퍔; 퍔; 퍔; 퍔; ) HANGUL SYLLABLE PYAM +D355;D355;1111 1163 11B8;D355;1111 1163 11B8; # (퍕; 퍕; 퍕; 퍕; 퍕; ) HANGUL SYLLABLE PYAB +D356;D356;1111 1163 11B9;D356;1111 1163 11B9; # (퍖; 퍖; 퍖; 퍖; 퍖; ) HANGUL SYLLABLE PYABS +D357;D357;1111 1163 11BA;D357;1111 1163 11BA; # (퍗; 퍗; 퍗; 퍗; 퍗; ) HANGUL SYLLABLE PYAS +D358;D358;1111 1163 11BB;D358;1111 1163 11BB; # (퍘; 퍘; 퍘; 퍘; 퍘; ) HANGUL SYLLABLE PYASS +D359;D359;1111 1163 11BC;D359;1111 1163 11BC; # (퍙; 퍙; 퍙; 퍙; 퍙; ) HANGUL SYLLABLE PYANG +D35A;D35A;1111 1163 11BD;D35A;1111 1163 11BD; # (퍚; 퍚; 퍚; 퍚; 퍚; ) HANGUL SYLLABLE PYAJ +D35B;D35B;1111 1163 11BE;D35B;1111 1163 11BE; # (퍛; 퍛; 퍛; 퍛; 퍛; ) HANGUL SYLLABLE PYAC +D35C;D35C;1111 1163 11BF;D35C;1111 1163 11BF; # (퍜; 퍜; 퍜; 퍜; 퍜; ) HANGUL SYLLABLE PYAK +D35D;D35D;1111 1163 11C0;D35D;1111 1163 11C0; # (퍝; 퍝; 퍝; 퍝; 퍝; ) HANGUL SYLLABLE PYAT +D35E;D35E;1111 1163 11C1;D35E;1111 1163 11C1; # (퍞; 퍞; 퍞; 퍞; 퍞; ) HANGUL SYLLABLE PYAP +D35F;D35F;1111 1163 11C2;D35F;1111 1163 11C2; # (퍟; 퍟; 퍟; 퍟; 퍟; ) HANGUL SYLLABLE PYAH +D360;D360;1111 1164;D360;1111 1164; # (퍠; 퍠; 퍠; 퍠; 퍠; ) HANGUL SYLLABLE PYAE +D361;D361;1111 1164 11A8;D361;1111 1164 11A8; # (퍡; 퍡; 퍡; 퍡; 퍡; ) HANGUL SYLLABLE PYAEG +D362;D362;1111 1164 11A9;D362;1111 1164 11A9; # (퍢; 퍢; 퍢; 퍢; 퍢; ) HANGUL SYLLABLE PYAEGG +D363;D363;1111 1164 11AA;D363;1111 1164 11AA; # (퍣; 퍣; 퍣; 퍣; 퍣; ) HANGUL SYLLABLE PYAEGS +D364;D364;1111 1164 11AB;D364;1111 1164 11AB; # (퍤; 퍤; 퍤; 퍤; 퍤; ) HANGUL SYLLABLE PYAEN +D365;D365;1111 1164 11AC;D365;1111 1164 11AC; # (퍥; 퍥; 퍥; 퍥; 퍥; ) HANGUL SYLLABLE PYAENJ +D366;D366;1111 1164 11AD;D366;1111 1164 11AD; # (퍦; 퍦; 퍦; 퍦; 퍦; ) HANGUL SYLLABLE PYAENH +D367;D367;1111 1164 11AE;D367;1111 1164 11AE; # (퍧; 퍧; 퍧; 퍧; 퍧; ) HANGUL SYLLABLE PYAED +D368;D368;1111 1164 11AF;D368;1111 1164 11AF; # (퍨; 퍨; 퍨; 퍨; 퍨; ) HANGUL SYLLABLE PYAEL +D369;D369;1111 1164 11B0;D369;1111 1164 11B0; # (퍩; 퍩; 퍩; 퍩; 퍩; ) HANGUL SYLLABLE PYAELG +D36A;D36A;1111 1164 11B1;D36A;1111 1164 11B1; # (퍪; 퍪; 퍪; 퍪; 퍪; ) HANGUL SYLLABLE PYAELM +D36B;D36B;1111 1164 11B2;D36B;1111 1164 11B2; # (퍫; 퍫; 퍫; 퍫; 퍫; ) HANGUL SYLLABLE PYAELB +D36C;D36C;1111 1164 11B3;D36C;1111 1164 11B3; # (퍬; 퍬; 퍬; 퍬; 퍬; ) HANGUL SYLLABLE PYAELS +D36D;D36D;1111 1164 11B4;D36D;1111 1164 11B4; # (퍭; 퍭; 퍭; 퍭; 퍭; ) HANGUL SYLLABLE PYAELT +D36E;D36E;1111 1164 11B5;D36E;1111 1164 11B5; # (퍮; 퍮; 퍮; 퍮; 퍮; ) HANGUL SYLLABLE PYAELP +D36F;D36F;1111 1164 11B6;D36F;1111 1164 11B6; # (퍯; 퍯; 퍯; 퍯; 퍯; ) HANGUL SYLLABLE PYAELH +D370;D370;1111 1164 11B7;D370;1111 1164 11B7; # (퍰; 퍰; 퍰; 퍰; 퍰; ) HANGUL SYLLABLE PYAEM +D371;D371;1111 1164 11B8;D371;1111 1164 11B8; # (퍱; 퍱; 퍱; 퍱; 퍱; ) HANGUL SYLLABLE PYAEB +D372;D372;1111 1164 11B9;D372;1111 1164 11B9; # (퍲; 퍲; 퍲; 퍲; 퍲; ) HANGUL SYLLABLE PYAEBS +D373;D373;1111 1164 11BA;D373;1111 1164 11BA; # (퍳; 퍳; 퍳; 퍳; 퍳; ) HANGUL SYLLABLE PYAES +D374;D374;1111 1164 11BB;D374;1111 1164 11BB; # (퍴; 퍴; 퍴; 퍴; 퍴; ) HANGUL SYLLABLE PYAESS +D375;D375;1111 1164 11BC;D375;1111 1164 11BC; # (퍵; 퍵; 퍵; 퍵; 퍵; ) HANGUL SYLLABLE PYAENG +D376;D376;1111 1164 11BD;D376;1111 1164 11BD; # (퍶; 퍶; 퍶; 퍶; 퍶; ) HANGUL SYLLABLE PYAEJ +D377;D377;1111 1164 11BE;D377;1111 1164 11BE; # (퍷; 퍷; 퍷; 퍷; 퍷; ) HANGUL SYLLABLE PYAEC +D378;D378;1111 1164 11BF;D378;1111 1164 11BF; # (퍸; 퍸; 퍸; 퍸; 퍸; ) HANGUL SYLLABLE PYAEK +D379;D379;1111 1164 11C0;D379;1111 1164 11C0; # (퍹; 퍹; 퍹; 퍹; 퍹; ) HANGUL SYLLABLE PYAET +D37A;D37A;1111 1164 11C1;D37A;1111 1164 11C1; # (퍺; 퍺; 퍺; 퍺; 퍺; ) HANGUL SYLLABLE PYAEP +D37B;D37B;1111 1164 11C2;D37B;1111 1164 11C2; # (퍻; 퍻; 퍻; 퍻; 퍻; ) HANGUL SYLLABLE PYAEH +D37C;D37C;1111 1165;D37C;1111 1165; # (퍼; 퍼; 퍼; 퍼; 퍼; ) HANGUL SYLLABLE PEO +D37D;D37D;1111 1165 11A8;D37D;1111 1165 11A8; # (퍽; 퍽; 퍽; 퍽; 퍽; ) HANGUL SYLLABLE PEOG +D37E;D37E;1111 1165 11A9;D37E;1111 1165 11A9; # (퍾; 퍾; 퍾; 퍾; 퍾; ) HANGUL SYLLABLE PEOGG +D37F;D37F;1111 1165 11AA;D37F;1111 1165 11AA; # (퍿; 퍿; 퍿; 퍿; 퍿; ) HANGUL SYLLABLE PEOGS +D380;D380;1111 1165 11AB;D380;1111 1165 11AB; # (펀; 펀; 펀; 펀; 펀; ) HANGUL SYLLABLE PEON +D381;D381;1111 1165 11AC;D381;1111 1165 11AC; # (펁; 펁; 펁; 펁; 펁; ) HANGUL SYLLABLE PEONJ +D382;D382;1111 1165 11AD;D382;1111 1165 11AD; # (펂; 펂; 펂; 펂; 펂; ) HANGUL SYLLABLE PEONH +D383;D383;1111 1165 11AE;D383;1111 1165 11AE; # (펃; 펃; 펃; 펃; 펃; ) HANGUL SYLLABLE PEOD +D384;D384;1111 1165 11AF;D384;1111 1165 11AF; # (펄; 펄; 펄; 펄; 펄; ) HANGUL SYLLABLE PEOL +D385;D385;1111 1165 11B0;D385;1111 1165 11B0; # (펅; 펅; 펅; 펅; 펅; ) HANGUL SYLLABLE PEOLG +D386;D386;1111 1165 11B1;D386;1111 1165 11B1; # (펆; 펆; 펆; 펆; 펆; ) HANGUL SYLLABLE PEOLM +D387;D387;1111 1165 11B2;D387;1111 1165 11B2; # (펇; 펇; 펇; 펇; 펇; ) HANGUL SYLLABLE PEOLB +D388;D388;1111 1165 11B3;D388;1111 1165 11B3; # (펈; 펈; 펈; 펈; 펈; ) HANGUL SYLLABLE PEOLS +D389;D389;1111 1165 11B4;D389;1111 1165 11B4; # (펉; 펉; 펉; 펉; 펉; ) HANGUL SYLLABLE PEOLT +D38A;D38A;1111 1165 11B5;D38A;1111 1165 11B5; # (펊; 펊; 펊; 펊; 펊; ) HANGUL SYLLABLE PEOLP +D38B;D38B;1111 1165 11B6;D38B;1111 1165 11B6; # (펋; 펋; 펋; 펋; 펋; ) HANGUL SYLLABLE PEOLH +D38C;D38C;1111 1165 11B7;D38C;1111 1165 11B7; # (펌; 펌; 펌; 펌; 펌; ) HANGUL SYLLABLE PEOM +D38D;D38D;1111 1165 11B8;D38D;1111 1165 11B8; # (펍; 펍; 펍; 펍; 펍; ) HANGUL SYLLABLE PEOB +D38E;D38E;1111 1165 11B9;D38E;1111 1165 11B9; # (펎; 펎; 펎; 펎; 펎; ) HANGUL SYLLABLE PEOBS +D38F;D38F;1111 1165 11BA;D38F;1111 1165 11BA; # (펏; 펏; 펏; 펏; 펏; ) HANGUL SYLLABLE PEOS +D390;D390;1111 1165 11BB;D390;1111 1165 11BB; # (펐; 펐; 펐; 펐; 펐; ) HANGUL SYLLABLE PEOSS +D391;D391;1111 1165 11BC;D391;1111 1165 11BC; # (펑; 펑; 펑; 펑; 펑; ) HANGUL SYLLABLE PEONG +D392;D392;1111 1165 11BD;D392;1111 1165 11BD; # (펒; 펒; 펒; 펒; 펒; ) HANGUL SYLLABLE PEOJ +D393;D393;1111 1165 11BE;D393;1111 1165 11BE; # (펓; 펓; 펓; 펓; 펓; ) HANGUL SYLLABLE PEOC +D394;D394;1111 1165 11BF;D394;1111 1165 11BF; # (펔; 펔; 펔; 펔; 펔; ) HANGUL SYLLABLE PEOK +D395;D395;1111 1165 11C0;D395;1111 1165 11C0; # (펕; 펕; 펕; 펕; 펕; ) HANGUL SYLLABLE PEOT +D396;D396;1111 1165 11C1;D396;1111 1165 11C1; # (펖; 펖; 펖; 펖; 펖; ) HANGUL SYLLABLE PEOP +D397;D397;1111 1165 11C2;D397;1111 1165 11C2; # (펗; 펗; 펗; 펗; 펗; ) HANGUL SYLLABLE PEOH +D398;D398;1111 1166;D398;1111 1166; # (페; 페; 페; 페; 페; ) HANGUL SYLLABLE PE +D399;D399;1111 1166 11A8;D399;1111 1166 11A8; # (펙; 펙; 펙; 펙; 펙; ) HANGUL SYLLABLE PEG +D39A;D39A;1111 1166 11A9;D39A;1111 1166 11A9; # (펚; 펚; 펚; 펚; 펚; ) HANGUL SYLLABLE PEGG +D39B;D39B;1111 1166 11AA;D39B;1111 1166 11AA; # (펛; 펛; 펛; 펛; 펛; ) HANGUL SYLLABLE PEGS +D39C;D39C;1111 1166 11AB;D39C;1111 1166 11AB; # (펜; 펜; 펜; 펜; 펜; ) HANGUL SYLLABLE PEN +D39D;D39D;1111 1166 11AC;D39D;1111 1166 11AC; # (펝; 펝; 펝; 펝; 펝; ) HANGUL SYLLABLE PENJ +D39E;D39E;1111 1166 11AD;D39E;1111 1166 11AD; # (펞; 펞; 펞; 펞; 펞; ) HANGUL SYLLABLE PENH +D39F;D39F;1111 1166 11AE;D39F;1111 1166 11AE; # (펟; 펟; 펟; 펟; 펟; ) HANGUL SYLLABLE PED +D3A0;D3A0;1111 1166 11AF;D3A0;1111 1166 11AF; # (펠; 펠; 펠; 펠; 펠; ) HANGUL SYLLABLE PEL +D3A1;D3A1;1111 1166 11B0;D3A1;1111 1166 11B0; # (펡; 펡; 펡; 펡; 펡; ) HANGUL SYLLABLE PELG +D3A2;D3A2;1111 1166 11B1;D3A2;1111 1166 11B1; # (펢; 펢; 펢; 펢; 펢; ) HANGUL SYLLABLE PELM +D3A3;D3A3;1111 1166 11B2;D3A3;1111 1166 11B2; # (펣; 펣; 펣; 펣; 펣; ) HANGUL SYLLABLE PELB +D3A4;D3A4;1111 1166 11B3;D3A4;1111 1166 11B3; # (펤; 펤; 펤; 펤; 펤; ) HANGUL SYLLABLE PELS +D3A5;D3A5;1111 1166 11B4;D3A5;1111 1166 11B4; # (펥; 펥; 펥; 펥; 펥; ) HANGUL SYLLABLE PELT +D3A6;D3A6;1111 1166 11B5;D3A6;1111 1166 11B5; # (펦; 펦; 펦; 펦; 펦; ) HANGUL SYLLABLE PELP +D3A7;D3A7;1111 1166 11B6;D3A7;1111 1166 11B6; # (펧; 펧; 펧; 펧; 펧; ) HANGUL SYLLABLE PELH +D3A8;D3A8;1111 1166 11B7;D3A8;1111 1166 11B7; # (펨; 펨; 펨; 펨; 펨; ) HANGUL SYLLABLE PEM +D3A9;D3A9;1111 1166 11B8;D3A9;1111 1166 11B8; # (펩; 펩; 펩; 펩; 펩; ) HANGUL SYLLABLE PEB +D3AA;D3AA;1111 1166 11B9;D3AA;1111 1166 11B9; # (펪; 펪; 펪; 펪; 펪; ) HANGUL SYLLABLE PEBS +D3AB;D3AB;1111 1166 11BA;D3AB;1111 1166 11BA; # (펫; 펫; 펫; 펫; 펫; ) HANGUL SYLLABLE PES +D3AC;D3AC;1111 1166 11BB;D3AC;1111 1166 11BB; # (펬; 펬; 펬; 펬; 펬; ) HANGUL SYLLABLE PESS +D3AD;D3AD;1111 1166 11BC;D3AD;1111 1166 11BC; # (펭; 펭; 펭; 펭; 펭; ) HANGUL SYLLABLE PENG +D3AE;D3AE;1111 1166 11BD;D3AE;1111 1166 11BD; # (펮; 펮; 펮; 펮; 펮; ) HANGUL SYLLABLE PEJ +D3AF;D3AF;1111 1166 11BE;D3AF;1111 1166 11BE; # (펯; 펯; 펯; 펯; 펯; ) HANGUL SYLLABLE PEC +D3B0;D3B0;1111 1166 11BF;D3B0;1111 1166 11BF; # (펰; 펰; 펰; 펰; 펰; ) HANGUL SYLLABLE PEK +D3B1;D3B1;1111 1166 11C0;D3B1;1111 1166 11C0; # (펱; 펱; 펱; 펱; 펱; ) HANGUL SYLLABLE PET +D3B2;D3B2;1111 1166 11C1;D3B2;1111 1166 11C1; # (펲; 펲; 펲; 펲; 펲; ) HANGUL SYLLABLE PEP +D3B3;D3B3;1111 1166 11C2;D3B3;1111 1166 11C2; # (펳; 펳; 펳; 펳; 펳; ) HANGUL SYLLABLE PEH +D3B4;D3B4;1111 1167;D3B4;1111 1167; # (펴; 펴; 펴; 펴; 펴; ) HANGUL SYLLABLE PYEO +D3B5;D3B5;1111 1167 11A8;D3B5;1111 1167 11A8; # (펵; 펵; 펵; 펵; 펵; ) HANGUL SYLLABLE PYEOG +D3B6;D3B6;1111 1167 11A9;D3B6;1111 1167 11A9; # (펶; 펶; 펶; 펶; 펶; ) HANGUL SYLLABLE PYEOGG +D3B7;D3B7;1111 1167 11AA;D3B7;1111 1167 11AA; # (펷; 펷; 펷; 펷; 펷; ) HANGUL SYLLABLE PYEOGS +D3B8;D3B8;1111 1167 11AB;D3B8;1111 1167 11AB; # (편; 편; 편; 편; 편; ) HANGUL SYLLABLE PYEON +D3B9;D3B9;1111 1167 11AC;D3B9;1111 1167 11AC; # (펹; 펹; 펹; 펹; 펹; ) HANGUL SYLLABLE PYEONJ +D3BA;D3BA;1111 1167 11AD;D3BA;1111 1167 11AD; # (펺; 펺; 펺; 펺; 펺; ) HANGUL SYLLABLE PYEONH +D3BB;D3BB;1111 1167 11AE;D3BB;1111 1167 11AE; # (펻; 펻; 펻; 펻; 펻; ) HANGUL SYLLABLE PYEOD +D3BC;D3BC;1111 1167 11AF;D3BC;1111 1167 11AF; # (펼; 펼; 펼; 펼; 펼; ) HANGUL SYLLABLE PYEOL +D3BD;D3BD;1111 1167 11B0;D3BD;1111 1167 11B0; # (펽; 펽; 펽; 펽; 펽; ) HANGUL SYLLABLE PYEOLG +D3BE;D3BE;1111 1167 11B1;D3BE;1111 1167 11B1; # (펾; 펾; 펾; 펾; 펾; ) HANGUL SYLLABLE PYEOLM +D3BF;D3BF;1111 1167 11B2;D3BF;1111 1167 11B2; # (펿; 펿; 펿; 펿; 펿; ) HANGUL SYLLABLE PYEOLB +D3C0;D3C0;1111 1167 11B3;D3C0;1111 1167 11B3; # (폀; 폀; 폀; 폀; 폀; ) HANGUL SYLLABLE PYEOLS +D3C1;D3C1;1111 1167 11B4;D3C1;1111 1167 11B4; # (폁; 폁; 폁; 폁; 폁; ) HANGUL SYLLABLE PYEOLT +D3C2;D3C2;1111 1167 11B5;D3C2;1111 1167 11B5; # (폂; 폂; 폂; 폂; 폂; ) HANGUL SYLLABLE PYEOLP +D3C3;D3C3;1111 1167 11B6;D3C3;1111 1167 11B6; # (폃; 폃; 폃; 폃; 폃; ) HANGUL SYLLABLE PYEOLH +D3C4;D3C4;1111 1167 11B7;D3C4;1111 1167 11B7; # (폄; 폄; 폄; 폄; 폄; ) HANGUL SYLLABLE PYEOM +D3C5;D3C5;1111 1167 11B8;D3C5;1111 1167 11B8; # (폅; 폅; 폅; 폅; 폅; ) HANGUL SYLLABLE PYEOB +D3C6;D3C6;1111 1167 11B9;D3C6;1111 1167 11B9; # (폆; 폆; 폆; 폆; 폆; ) HANGUL SYLLABLE PYEOBS +D3C7;D3C7;1111 1167 11BA;D3C7;1111 1167 11BA; # (폇; 폇; 폇; 폇; 폇; ) HANGUL SYLLABLE PYEOS +D3C8;D3C8;1111 1167 11BB;D3C8;1111 1167 11BB; # (폈; 폈; 폈; 폈; 폈; ) HANGUL SYLLABLE PYEOSS +D3C9;D3C9;1111 1167 11BC;D3C9;1111 1167 11BC; # (평; 평; 평; 평; 평; ) HANGUL SYLLABLE PYEONG +D3CA;D3CA;1111 1167 11BD;D3CA;1111 1167 11BD; # (폊; 폊; 폊; 폊; 폊; ) HANGUL SYLLABLE PYEOJ +D3CB;D3CB;1111 1167 11BE;D3CB;1111 1167 11BE; # (폋; 폋; 폋; 폋; 폋; ) HANGUL SYLLABLE PYEOC +D3CC;D3CC;1111 1167 11BF;D3CC;1111 1167 11BF; # (폌; 폌; 폌; 폌; 폌; ) HANGUL SYLLABLE PYEOK +D3CD;D3CD;1111 1167 11C0;D3CD;1111 1167 11C0; # (폍; 폍; 폍; 폍; 폍; ) HANGUL SYLLABLE PYEOT +D3CE;D3CE;1111 1167 11C1;D3CE;1111 1167 11C1; # (폎; 폎; 폎; 폎; 폎; ) HANGUL SYLLABLE PYEOP +D3CF;D3CF;1111 1167 11C2;D3CF;1111 1167 11C2; # (폏; 폏; 폏; 폏; 폏; ) HANGUL SYLLABLE PYEOH +D3D0;D3D0;1111 1168;D3D0;1111 1168; # (폐; 폐; 폐; 폐; 폐; ) HANGUL SYLLABLE PYE +D3D1;D3D1;1111 1168 11A8;D3D1;1111 1168 11A8; # (폑; 폑; 폑; 폑; 폑; ) HANGUL SYLLABLE PYEG +D3D2;D3D2;1111 1168 11A9;D3D2;1111 1168 11A9; # (폒; 폒; 폒; 폒; 폒; ) HANGUL SYLLABLE PYEGG +D3D3;D3D3;1111 1168 11AA;D3D3;1111 1168 11AA; # (폓; 폓; 폓; 폓; 폓; ) HANGUL SYLLABLE PYEGS +D3D4;D3D4;1111 1168 11AB;D3D4;1111 1168 11AB; # (폔; 폔; 폔; 폔; 폔; ) HANGUL SYLLABLE PYEN +D3D5;D3D5;1111 1168 11AC;D3D5;1111 1168 11AC; # (폕; 폕; 폕; 폕; 폕; ) HANGUL SYLLABLE PYENJ +D3D6;D3D6;1111 1168 11AD;D3D6;1111 1168 11AD; # (폖; 폖; 폖; 폖; 폖; ) HANGUL SYLLABLE PYENH +D3D7;D3D7;1111 1168 11AE;D3D7;1111 1168 11AE; # (폗; 폗; 폗; 폗; 폗; ) HANGUL SYLLABLE PYED +D3D8;D3D8;1111 1168 11AF;D3D8;1111 1168 11AF; # (폘; 폘; 폘; 폘; 폘; ) HANGUL SYLLABLE PYEL +D3D9;D3D9;1111 1168 11B0;D3D9;1111 1168 11B0; # (폙; 폙; 폙; 폙; 폙; ) HANGUL SYLLABLE PYELG +D3DA;D3DA;1111 1168 11B1;D3DA;1111 1168 11B1; # (폚; 폚; 폚; 폚; 폚; ) HANGUL SYLLABLE PYELM +D3DB;D3DB;1111 1168 11B2;D3DB;1111 1168 11B2; # (폛; 폛; 폛; 폛; 폛; ) HANGUL SYLLABLE PYELB +D3DC;D3DC;1111 1168 11B3;D3DC;1111 1168 11B3; # (폜; 폜; 폜; 폜; 폜; ) HANGUL SYLLABLE PYELS +D3DD;D3DD;1111 1168 11B4;D3DD;1111 1168 11B4; # (폝; 폝; 폝; 폝; 폝; ) HANGUL SYLLABLE PYELT +D3DE;D3DE;1111 1168 11B5;D3DE;1111 1168 11B5; # (폞; 폞; 폞; 폞; 폞; ) HANGUL SYLLABLE PYELP +D3DF;D3DF;1111 1168 11B6;D3DF;1111 1168 11B6; # (폟; 폟; 폟; 폟; 폟; ) HANGUL SYLLABLE PYELH +D3E0;D3E0;1111 1168 11B7;D3E0;1111 1168 11B7; # (폠; 폠; 폠; 폠; 폠; ) HANGUL SYLLABLE PYEM +D3E1;D3E1;1111 1168 11B8;D3E1;1111 1168 11B8; # (폡; 폡; 폡; 폡; 폡; ) HANGUL SYLLABLE PYEB +D3E2;D3E2;1111 1168 11B9;D3E2;1111 1168 11B9; # (폢; 폢; 폢; 폢; 폢; ) HANGUL SYLLABLE PYEBS +D3E3;D3E3;1111 1168 11BA;D3E3;1111 1168 11BA; # (폣; 폣; 폣; 폣; 폣; ) HANGUL SYLLABLE PYES +D3E4;D3E4;1111 1168 11BB;D3E4;1111 1168 11BB; # (폤; 폤; 폤; 폤; 폤; ) HANGUL SYLLABLE PYESS +D3E5;D3E5;1111 1168 11BC;D3E5;1111 1168 11BC; # (폥; 폥; 폥; 폥; 폥; ) HANGUL SYLLABLE PYENG +D3E6;D3E6;1111 1168 11BD;D3E6;1111 1168 11BD; # (폦; 폦; 폦; 폦; 폦; ) HANGUL SYLLABLE PYEJ +D3E7;D3E7;1111 1168 11BE;D3E7;1111 1168 11BE; # (폧; 폧; 폧; 폧; 폧; ) HANGUL SYLLABLE PYEC +D3E8;D3E8;1111 1168 11BF;D3E8;1111 1168 11BF; # (폨; 폨; 폨; 폨; 폨; ) HANGUL SYLLABLE PYEK +D3E9;D3E9;1111 1168 11C0;D3E9;1111 1168 11C0; # (폩; 폩; 폩; 폩; 폩; ) HANGUL SYLLABLE PYET +D3EA;D3EA;1111 1168 11C1;D3EA;1111 1168 11C1; # (폪; 폪; 폪; 폪; 폪; ) HANGUL SYLLABLE PYEP +D3EB;D3EB;1111 1168 11C2;D3EB;1111 1168 11C2; # (폫; 폫; 폫; 폫; 폫; ) HANGUL SYLLABLE PYEH +D3EC;D3EC;1111 1169;D3EC;1111 1169; # (포; 포; 포; 포; 포; ) HANGUL SYLLABLE PO +D3ED;D3ED;1111 1169 11A8;D3ED;1111 1169 11A8; # (폭; 폭; 폭; 폭; 폭; ) HANGUL SYLLABLE POG +D3EE;D3EE;1111 1169 11A9;D3EE;1111 1169 11A9; # (폮; 폮; 폮; 폮; 폮; ) HANGUL SYLLABLE POGG +D3EF;D3EF;1111 1169 11AA;D3EF;1111 1169 11AA; # (폯; 폯; 폯; 폯; 폯; ) HANGUL SYLLABLE POGS +D3F0;D3F0;1111 1169 11AB;D3F0;1111 1169 11AB; # (폰; 폰; 폰; 폰; 폰; ) HANGUL SYLLABLE PON +D3F1;D3F1;1111 1169 11AC;D3F1;1111 1169 11AC; # (폱; 폱; 폱; 폱; 폱; ) HANGUL SYLLABLE PONJ +D3F2;D3F2;1111 1169 11AD;D3F2;1111 1169 11AD; # (폲; 폲; 폲; 폲; 폲; ) HANGUL SYLLABLE PONH +D3F3;D3F3;1111 1169 11AE;D3F3;1111 1169 11AE; # (폳; 폳; 폳; 폳; 폳; ) HANGUL SYLLABLE POD +D3F4;D3F4;1111 1169 11AF;D3F4;1111 1169 11AF; # (폴; 폴; 폴; 폴; 폴; ) HANGUL SYLLABLE POL +D3F5;D3F5;1111 1169 11B0;D3F5;1111 1169 11B0; # (폵; 폵; 폵; 폵; 폵; ) HANGUL SYLLABLE POLG +D3F6;D3F6;1111 1169 11B1;D3F6;1111 1169 11B1; # (폶; 폶; 폶; 폶; 폶; ) HANGUL SYLLABLE POLM +D3F7;D3F7;1111 1169 11B2;D3F7;1111 1169 11B2; # (폷; 폷; 폷; 폷; 폷; ) HANGUL SYLLABLE POLB +D3F8;D3F8;1111 1169 11B3;D3F8;1111 1169 11B3; # (폸; 폸; 폸; 폸; 폸; ) HANGUL SYLLABLE POLS +D3F9;D3F9;1111 1169 11B4;D3F9;1111 1169 11B4; # (폹; 폹; 폹; 폹; 폹; ) HANGUL SYLLABLE POLT +D3FA;D3FA;1111 1169 11B5;D3FA;1111 1169 11B5; # (폺; 폺; 폺; 폺; 폺; ) HANGUL SYLLABLE POLP +D3FB;D3FB;1111 1169 11B6;D3FB;1111 1169 11B6; # (폻; 폻; 폻; 폻; 폻; ) HANGUL SYLLABLE POLH +D3FC;D3FC;1111 1169 11B7;D3FC;1111 1169 11B7; # (폼; 폼; 폼; 폼; 폼; ) HANGUL SYLLABLE POM +D3FD;D3FD;1111 1169 11B8;D3FD;1111 1169 11B8; # (폽; 폽; 폽; 폽; 폽; ) HANGUL SYLLABLE POB +D3FE;D3FE;1111 1169 11B9;D3FE;1111 1169 11B9; # (폾; 폾; 폾; 폾; 폾; ) HANGUL SYLLABLE POBS +D3FF;D3FF;1111 1169 11BA;D3FF;1111 1169 11BA; # (폿; 폿; 폿; 폿; 폿; ) HANGUL SYLLABLE POS +D400;D400;1111 1169 11BB;D400;1111 1169 11BB; # (퐀; 퐀; 퐀; 퐀; 퐀; ) HANGUL SYLLABLE POSS +D401;D401;1111 1169 11BC;D401;1111 1169 11BC; # (퐁; 퐁; 퐁; 퐁; 퐁; ) HANGUL SYLLABLE PONG +D402;D402;1111 1169 11BD;D402;1111 1169 11BD; # (퐂; 퐂; 퐂; 퐂; 퐂; ) HANGUL SYLLABLE POJ +D403;D403;1111 1169 11BE;D403;1111 1169 11BE; # (퐃; 퐃; 퐃; 퐃; 퐃; ) HANGUL SYLLABLE POC +D404;D404;1111 1169 11BF;D404;1111 1169 11BF; # (퐄; 퐄; 퐄; 퐄; 퐄; ) HANGUL SYLLABLE POK +D405;D405;1111 1169 11C0;D405;1111 1169 11C0; # (퐅; 퐅; 퐅; 퐅; 퐅; ) HANGUL SYLLABLE POT +D406;D406;1111 1169 11C1;D406;1111 1169 11C1; # (퐆; 퐆; 퐆; 퐆; 퐆; ) HANGUL SYLLABLE POP +D407;D407;1111 1169 11C2;D407;1111 1169 11C2; # (퐇; 퐇; 퐇; 퐇; 퐇; ) HANGUL SYLLABLE POH +D408;D408;1111 116A;D408;1111 116A; # (퐈; 퐈; 퐈; 퐈; 퐈; ) HANGUL SYLLABLE PWA +D409;D409;1111 116A 11A8;D409;1111 116A 11A8; # (퐉; 퐉; 퐉; 퐉; 퐉; ) HANGUL SYLLABLE PWAG +D40A;D40A;1111 116A 11A9;D40A;1111 116A 11A9; # (퐊; 퐊; 퐊; 퐊; 퐊; ) HANGUL SYLLABLE PWAGG +D40B;D40B;1111 116A 11AA;D40B;1111 116A 11AA; # (퐋; 퐋; 퐋; 퐋; 퐋; ) HANGUL SYLLABLE PWAGS +D40C;D40C;1111 116A 11AB;D40C;1111 116A 11AB; # (퐌; 퐌; 퐌; 퐌; 퐌; ) HANGUL SYLLABLE PWAN +D40D;D40D;1111 116A 11AC;D40D;1111 116A 11AC; # (퐍; 퐍; 퐍; 퐍; 퐍; ) HANGUL SYLLABLE PWANJ +D40E;D40E;1111 116A 11AD;D40E;1111 116A 11AD; # (퐎; 퐎; 퐎; 퐎; 퐎; ) HANGUL SYLLABLE PWANH +D40F;D40F;1111 116A 11AE;D40F;1111 116A 11AE; # (퐏; 퐏; 퐏; 퐏; 퐏; ) HANGUL SYLLABLE PWAD +D410;D410;1111 116A 11AF;D410;1111 116A 11AF; # (퐐; 퐐; 퐐; 퐐; 퐐; ) HANGUL SYLLABLE PWAL +D411;D411;1111 116A 11B0;D411;1111 116A 11B0; # (퐑; 퐑; 퐑; 퐑; 퐑; ) HANGUL SYLLABLE PWALG +D412;D412;1111 116A 11B1;D412;1111 116A 11B1; # (퐒; 퐒; 퐒; 퐒; 퐒; ) HANGUL SYLLABLE PWALM +D413;D413;1111 116A 11B2;D413;1111 116A 11B2; # (퐓; 퐓; 퐓; 퐓; 퐓; ) HANGUL SYLLABLE PWALB +D414;D414;1111 116A 11B3;D414;1111 116A 11B3; # (퐔; 퐔; 퐔; 퐔; 퐔; ) HANGUL SYLLABLE PWALS +D415;D415;1111 116A 11B4;D415;1111 116A 11B4; # (퐕; 퐕; 퐕; 퐕; 퐕; ) HANGUL SYLLABLE PWALT +D416;D416;1111 116A 11B5;D416;1111 116A 11B5; # (퐖; 퐖; 퐖; 퐖; 퐖; ) HANGUL SYLLABLE PWALP +D417;D417;1111 116A 11B6;D417;1111 116A 11B6; # (퐗; 퐗; 퐗; 퐗; 퐗; ) HANGUL SYLLABLE PWALH +D418;D418;1111 116A 11B7;D418;1111 116A 11B7; # (퐘; 퐘; 퐘; 퐘; 퐘; ) HANGUL SYLLABLE PWAM +D419;D419;1111 116A 11B8;D419;1111 116A 11B8; # (퐙; 퐙; 퐙; 퐙; 퐙; ) HANGUL SYLLABLE PWAB +D41A;D41A;1111 116A 11B9;D41A;1111 116A 11B9; # (퐚; 퐚; 퐚; 퐚; 퐚; ) HANGUL SYLLABLE PWABS +D41B;D41B;1111 116A 11BA;D41B;1111 116A 11BA; # (퐛; 퐛; 퐛; 퐛; 퐛; ) HANGUL SYLLABLE PWAS +D41C;D41C;1111 116A 11BB;D41C;1111 116A 11BB; # (퐜; 퐜; 퐜; 퐜; 퐜; ) HANGUL SYLLABLE PWASS +D41D;D41D;1111 116A 11BC;D41D;1111 116A 11BC; # (퐝; 퐝; 퐝; 퐝; 퐝; ) HANGUL SYLLABLE PWANG +D41E;D41E;1111 116A 11BD;D41E;1111 116A 11BD; # (퐞; 퐞; 퐞; 퐞; 퐞; ) HANGUL SYLLABLE PWAJ +D41F;D41F;1111 116A 11BE;D41F;1111 116A 11BE; # (퐟; 퐟; 퐟; 퐟; 퐟; ) HANGUL SYLLABLE PWAC +D420;D420;1111 116A 11BF;D420;1111 116A 11BF; # (퐠; 퐠; 퐠; 퐠; 퐠; ) HANGUL SYLLABLE PWAK +D421;D421;1111 116A 11C0;D421;1111 116A 11C0; # (퐡; 퐡; 퐡; 퐡; 퐡; ) HANGUL SYLLABLE PWAT +D422;D422;1111 116A 11C1;D422;1111 116A 11C1; # (퐢; 퐢; 퐢; 퐢; 퐢; ) HANGUL SYLLABLE PWAP +D423;D423;1111 116A 11C2;D423;1111 116A 11C2; # (퐣; 퐣; 퐣; 퐣; 퐣; ) HANGUL SYLLABLE PWAH +D424;D424;1111 116B;D424;1111 116B; # (퐤; 퐤; 퐤; 퐤; 퐤; ) HANGUL SYLLABLE PWAE +D425;D425;1111 116B 11A8;D425;1111 116B 11A8; # (퐥; 퐥; 퐥; 퐥; 퐥; ) HANGUL SYLLABLE PWAEG +D426;D426;1111 116B 11A9;D426;1111 116B 11A9; # (퐦; 퐦; 퐦; 퐦; 퐦; ) HANGUL SYLLABLE PWAEGG +D427;D427;1111 116B 11AA;D427;1111 116B 11AA; # (퐧; 퐧; 퐧; 퐧; 퐧; ) HANGUL SYLLABLE PWAEGS +D428;D428;1111 116B 11AB;D428;1111 116B 11AB; # (퐨; 퐨; 퐨; 퐨; 퐨; ) HANGUL SYLLABLE PWAEN +D429;D429;1111 116B 11AC;D429;1111 116B 11AC; # (퐩; 퐩; 퐩; 퐩; 퐩; ) HANGUL SYLLABLE PWAENJ +D42A;D42A;1111 116B 11AD;D42A;1111 116B 11AD; # (퐪; 퐪; 퐪; 퐪; 퐪; ) HANGUL SYLLABLE PWAENH +D42B;D42B;1111 116B 11AE;D42B;1111 116B 11AE; # (퐫; 퐫; 퐫; 퐫; 퐫; ) HANGUL SYLLABLE PWAED +D42C;D42C;1111 116B 11AF;D42C;1111 116B 11AF; # (퐬; 퐬; 퐬; 퐬; 퐬; ) HANGUL SYLLABLE PWAEL +D42D;D42D;1111 116B 11B0;D42D;1111 116B 11B0; # (퐭; 퐭; 퐭; 퐭; 퐭; ) HANGUL SYLLABLE PWAELG +D42E;D42E;1111 116B 11B1;D42E;1111 116B 11B1; # (퐮; 퐮; 퐮; 퐮; 퐮; ) HANGUL SYLLABLE PWAELM +D42F;D42F;1111 116B 11B2;D42F;1111 116B 11B2; # (퐯; 퐯; 퐯; 퐯; 퐯; ) HANGUL SYLLABLE PWAELB +D430;D430;1111 116B 11B3;D430;1111 116B 11B3; # (퐰; 퐰; 퐰; 퐰; 퐰; ) HANGUL SYLLABLE PWAELS +D431;D431;1111 116B 11B4;D431;1111 116B 11B4; # (퐱; 퐱; 퐱; 퐱; 퐱; ) HANGUL SYLLABLE PWAELT +D432;D432;1111 116B 11B5;D432;1111 116B 11B5; # (퐲; 퐲; 퐲; 퐲; 퐲; ) HANGUL SYLLABLE PWAELP +D433;D433;1111 116B 11B6;D433;1111 116B 11B6; # (퐳; 퐳; 퐳; 퐳; 퐳; ) HANGUL SYLLABLE PWAELH +D434;D434;1111 116B 11B7;D434;1111 116B 11B7; # (퐴; 퐴; 퐴; 퐴; 퐴; ) HANGUL SYLLABLE PWAEM +D435;D435;1111 116B 11B8;D435;1111 116B 11B8; # (퐵; 퐵; 퐵; 퐵; 퐵; ) HANGUL SYLLABLE PWAEB +D436;D436;1111 116B 11B9;D436;1111 116B 11B9; # (퐶; 퐶; 퐶; 퐶; 퐶; ) HANGUL SYLLABLE PWAEBS +D437;D437;1111 116B 11BA;D437;1111 116B 11BA; # (퐷; 퐷; 퐷; 퐷; 퐷; ) HANGUL SYLLABLE PWAES +D438;D438;1111 116B 11BB;D438;1111 116B 11BB; # (퐸; 퐸; 퐸; 퐸; 퐸; ) HANGUL SYLLABLE PWAESS +D439;D439;1111 116B 11BC;D439;1111 116B 11BC; # (퐹; 퐹; 퐹; 퐹; 퐹; ) HANGUL SYLLABLE PWAENG +D43A;D43A;1111 116B 11BD;D43A;1111 116B 11BD; # (퐺; 퐺; 퐺; 퐺; 퐺; ) HANGUL SYLLABLE PWAEJ +D43B;D43B;1111 116B 11BE;D43B;1111 116B 11BE; # (퐻; 퐻; 퐻; 퐻; 퐻; ) HANGUL SYLLABLE PWAEC +D43C;D43C;1111 116B 11BF;D43C;1111 116B 11BF; # (퐼; 퐼; 퐼; 퐼; 퐼; ) HANGUL SYLLABLE PWAEK +D43D;D43D;1111 116B 11C0;D43D;1111 116B 11C0; # (퐽; 퐽; 퐽; 퐽; 퐽; ) HANGUL SYLLABLE PWAET +D43E;D43E;1111 116B 11C1;D43E;1111 116B 11C1; # (퐾; 퐾; 퐾; 퐾; 퐾; ) HANGUL SYLLABLE PWAEP +D43F;D43F;1111 116B 11C2;D43F;1111 116B 11C2; # (퐿; 퐿; 퐿; 퐿; 퐿; ) HANGUL SYLLABLE PWAEH +D440;D440;1111 116C;D440;1111 116C; # (푀; 푀; 푀; 푀; 푀; ) HANGUL SYLLABLE POE +D441;D441;1111 116C 11A8;D441;1111 116C 11A8; # (푁; 푁; 푁; 푁; 푁; ) HANGUL SYLLABLE POEG +D442;D442;1111 116C 11A9;D442;1111 116C 11A9; # (푂; 푂; 푂; 푂; 푂; ) HANGUL SYLLABLE POEGG +D443;D443;1111 116C 11AA;D443;1111 116C 11AA; # (푃; 푃; 푃; 푃; 푃; ) HANGUL SYLLABLE POEGS +D444;D444;1111 116C 11AB;D444;1111 116C 11AB; # (푄; 푄; 푄; 푄; 푄; ) HANGUL SYLLABLE POEN +D445;D445;1111 116C 11AC;D445;1111 116C 11AC; # (푅; 푅; 푅; 푅; 푅; ) HANGUL SYLLABLE POENJ +D446;D446;1111 116C 11AD;D446;1111 116C 11AD; # (푆; 푆; 푆; 푆; 푆; ) HANGUL SYLLABLE POENH +D447;D447;1111 116C 11AE;D447;1111 116C 11AE; # (푇; 푇; 푇; 푇; 푇; ) HANGUL SYLLABLE POED +D448;D448;1111 116C 11AF;D448;1111 116C 11AF; # (푈; 푈; 푈; 푈; 푈; ) HANGUL SYLLABLE POEL +D449;D449;1111 116C 11B0;D449;1111 116C 11B0; # (푉; 푉; 푉; 푉; 푉; ) HANGUL SYLLABLE POELG +D44A;D44A;1111 116C 11B1;D44A;1111 116C 11B1; # (푊; 푊; 푊; 푊; 푊; ) HANGUL SYLLABLE POELM +D44B;D44B;1111 116C 11B2;D44B;1111 116C 11B2; # (푋; 푋; 푋; 푋; 푋; ) HANGUL SYLLABLE POELB +D44C;D44C;1111 116C 11B3;D44C;1111 116C 11B3; # (푌; 푌; 푌; 푌; 푌; ) HANGUL SYLLABLE POELS +D44D;D44D;1111 116C 11B4;D44D;1111 116C 11B4; # (푍; 푍; 푍; 푍; 푍; ) HANGUL SYLLABLE POELT +D44E;D44E;1111 116C 11B5;D44E;1111 116C 11B5; # (푎; 푎; 푎; 푎; 푎; ) HANGUL SYLLABLE POELP +D44F;D44F;1111 116C 11B6;D44F;1111 116C 11B6; # (푏; 푏; 푏; 푏; 푏; ) HANGUL SYLLABLE POELH +D450;D450;1111 116C 11B7;D450;1111 116C 11B7; # (푐; 푐; 푐; 푐; 푐; ) HANGUL SYLLABLE POEM +D451;D451;1111 116C 11B8;D451;1111 116C 11B8; # (푑; 푑; 푑; 푑; 푑; ) HANGUL SYLLABLE POEB +D452;D452;1111 116C 11B9;D452;1111 116C 11B9; # (푒; 푒; 푒; 푒; 푒; ) HANGUL SYLLABLE POEBS +D453;D453;1111 116C 11BA;D453;1111 116C 11BA; # (푓; 푓; 푓; 푓; 푓; ) HANGUL SYLLABLE POES +D454;D454;1111 116C 11BB;D454;1111 116C 11BB; # (푔; 푔; 푔; 푔; 푔; ) HANGUL SYLLABLE POESS +D455;D455;1111 116C 11BC;D455;1111 116C 11BC; # (푕; 푕; 푕; 푕; 푕; ) HANGUL SYLLABLE POENG +D456;D456;1111 116C 11BD;D456;1111 116C 11BD; # (푖; 푖; 푖; 푖; 푖; ) HANGUL SYLLABLE POEJ +D457;D457;1111 116C 11BE;D457;1111 116C 11BE; # (푗; 푗; 푗; 푗; 푗; ) HANGUL SYLLABLE POEC +D458;D458;1111 116C 11BF;D458;1111 116C 11BF; # (푘; 푘; 푘; 푘; 푘; ) HANGUL SYLLABLE POEK +D459;D459;1111 116C 11C0;D459;1111 116C 11C0; # (푙; 푙; 푙; 푙; 푙; ) HANGUL SYLLABLE POET +D45A;D45A;1111 116C 11C1;D45A;1111 116C 11C1; # (푚; 푚; 푚; 푚; 푚; ) HANGUL SYLLABLE POEP +D45B;D45B;1111 116C 11C2;D45B;1111 116C 11C2; # (푛; 푛; 푛; 푛; 푛; ) HANGUL SYLLABLE POEH +D45C;D45C;1111 116D;D45C;1111 116D; # (표; 표; 표; 표; 표; ) HANGUL SYLLABLE PYO +D45D;D45D;1111 116D 11A8;D45D;1111 116D 11A8; # (푝; 푝; 푝; 푝; 푝; ) HANGUL SYLLABLE PYOG +D45E;D45E;1111 116D 11A9;D45E;1111 116D 11A9; # (푞; 푞; 푞; 푞; 푞; ) HANGUL SYLLABLE PYOGG +D45F;D45F;1111 116D 11AA;D45F;1111 116D 11AA; # (푟; 푟; 푟; 푟; 푟; ) HANGUL SYLLABLE PYOGS +D460;D460;1111 116D 11AB;D460;1111 116D 11AB; # (푠; 푠; 푠; 푠; 푠; ) HANGUL SYLLABLE PYON +D461;D461;1111 116D 11AC;D461;1111 116D 11AC; # (푡; 푡; 푡; 푡; 푡; ) HANGUL SYLLABLE PYONJ +D462;D462;1111 116D 11AD;D462;1111 116D 11AD; # (푢; 푢; 푢; 푢; 푢; ) HANGUL SYLLABLE PYONH +D463;D463;1111 116D 11AE;D463;1111 116D 11AE; # (푣; 푣; 푣; 푣; 푣; ) HANGUL SYLLABLE PYOD +D464;D464;1111 116D 11AF;D464;1111 116D 11AF; # (푤; 푤; 푤; 푤; 푤; ) HANGUL SYLLABLE PYOL +D465;D465;1111 116D 11B0;D465;1111 116D 11B0; # (푥; 푥; 푥; 푥; 푥; ) HANGUL SYLLABLE PYOLG +D466;D466;1111 116D 11B1;D466;1111 116D 11B1; # (푦; 푦; 푦; 푦; 푦; ) HANGUL SYLLABLE PYOLM +D467;D467;1111 116D 11B2;D467;1111 116D 11B2; # (푧; 푧; 푧; 푧; 푧; ) HANGUL SYLLABLE PYOLB +D468;D468;1111 116D 11B3;D468;1111 116D 11B3; # (푨; 푨; 푨; 푨; 푨; ) HANGUL SYLLABLE PYOLS +D469;D469;1111 116D 11B4;D469;1111 116D 11B4; # (푩; 푩; 푩; 푩; 푩; ) HANGUL SYLLABLE PYOLT +D46A;D46A;1111 116D 11B5;D46A;1111 116D 11B5; # (푪; 푪; 푪; 푪; 푪; ) HANGUL SYLLABLE PYOLP +D46B;D46B;1111 116D 11B6;D46B;1111 116D 11B6; # (푫; 푫; 푫; 푫; 푫; ) HANGUL SYLLABLE PYOLH +D46C;D46C;1111 116D 11B7;D46C;1111 116D 11B7; # (푬; 푬; 푬; 푬; 푬; ) HANGUL SYLLABLE PYOM +D46D;D46D;1111 116D 11B8;D46D;1111 116D 11B8; # (푭; 푭; 푭; 푭; 푭; ) HANGUL SYLLABLE PYOB +D46E;D46E;1111 116D 11B9;D46E;1111 116D 11B9; # (푮; 푮; 푮; 푮; 푮; ) HANGUL SYLLABLE PYOBS +D46F;D46F;1111 116D 11BA;D46F;1111 116D 11BA; # (푯; 푯; 푯; 푯; 푯; ) HANGUL SYLLABLE PYOS +D470;D470;1111 116D 11BB;D470;1111 116D 11BB; # (푰; 푰; 푰; 푰; 푰; ) HANGUL SYLLABLE PYOSS +D471;D471;1111 116D 11BC;D471;1111 116D 11BC; # (푱; 푱; 푱; 푱; 푱; ) HANGUL SYLLABLE PYONG +D472;D472;1111 116D 11BD;D472;1111 116D 11BD; # (푲; 푲; 푲; 푲; 푲; ) HANGUL SYLLABLE PYOJ +D473;D473;1111 116D 11BE;D473;1111 116D 11BE; # (푳; 푳; 푳; 푳; 푳; ) HANGUL SYLLABLE PYOC +D474;D474;1111 116D 11BF;D474;1111 116D 11BF; # (푴; 푴; 푴; 푴; 푴; ) HANGUL SYLLABLE PYOK +D475;D475;1111 116D 11C0;D475;1111 116D 11C0; # (푵; 푵; 푵; 푵; 푵; ) HANGUL SYLLABLE PYOT +D476;D476;1111 116D 11C1;D476;1111 116D 11C1; # (푶; 푶; 푶; 푶; 푶; ) HANGUL SYLLABLE PYOP +D477;D477;1111 116D 11C2;D477;1111 116D 11C2; # (푷; 푷; 푷; 푷; 푷; ) HANGUL SYLLABLE PYOH +D478;D478;1111 116E;D478;1111 116E; # (푸; 푸; 푸; 푸; 푸; ) HANGUL SYLLABLE PU +D479;D479;1111 116E 11A8;D479;1111 116E 11A8; # (푹; 푹; 푹; 푹; 푹; ) HANGUL SYLLABLE PUG +D47A;D47A;1111 116E 11A9;D47A;1111 116E 11A9; # (푺; 푺; 푺; 푺; 푺; ) HANGUL SYLLABLE PUGG +D47B;D47B;1111 116E 11AA;D47B;1111 116E 11AA; # (푻; 푻; 푻; 푻; 푻; ) HANGUL SYLLABLE PUGS +D47C;D47C;1111 116E 11AB;D47C;1111 116E 11AB; # (푼; 푼; 푼; 푼; 푼; ) HANGUL SYLLABLE PUN +D47D;D47D;1111 116E 11AC;D47D;1111 116E 11AC; # (푽; 푽; 푽; 푽; 푽; ) HANGUL SYLLABLE PUNJ +D47E;D47E;1111 116E 11AD;D47E;1111 116E 11AD; # (푾; 푾; 푾; 푾; 푾; ) HANGUL SYLLABLE PUNH +D47F;D47F;1111 116E 11AE;D47F;1111 116E 11AE; # (푿; 푿; 푿; 푿; 푿; ) HANGUL SYLLABLE PUD +D480;D480;1111 116E 11AF;D480;1111 116E 11AF; # (풀; 풀; 풀; 풀; 풀; ) HANGUL SYLLABLE PUL +D481;D481;1111 116E 11B0;D481;1111 116E 11B0; # (풁; 풁; 풁; 풁; 풁; ) HANGUL SYLLABLE PULG +D482;D482;1111 116E 11B1;D482;1111 116E 11B1; # (풂; 풂; 풂; 풂; 풂; ) HANGUL SYLLABLE PULM +D483;D483;1111 116E 11B2;D483;1111 116E 11B2; # (풃; 풃; 풃; 풃; 풃; ) HANGUL SYLLABLE PULB +D484;D484;1111 116E 11B3;D484;1111 116E 11B3; # (풄; 풄; 풄; 풄; 풄; ) HANGUL SYLLABLE PULS +D485;D485;1111 116E 11B4;D485;1111 116E 11B4; # (풅; 풅; 풅; 풅; 풅; ) HANGUL SYLLABLE PULT +D486;D486;1111 116E 11B5;D486;1111 116E 11B5; # (풆; 풆; 풆; 풆; 풆; ) HANGUL SYLLABLE PULP +D487;D487;1111 116E 11B6;D487;1111 116E 11B6; # (풇; 풇; 풇; 풇; 풇; ) HANGUL SYLLABLE PULH +D488;D488;1111 116E 11B7;D488;1111 116E 11B7; # (품; 품; 품; 품; 품; ) HANGUL SYLLABLE PUM +D489;D489;1111 116E 11B8;D489;1111 116E 11B8; # (풉; 풉; 풉; 풉; 풉; ) HANGUL SYLLABLE PUB +D48A;D48A;1111 116E 11B9;D48A;1111 116E 11B9; # (풊; 풊; 풊; 풊; 풊; ) HANGUL SYLLABLE PUBS +D48B;D48B;1111 116E 11BA;D48B;1111 116E 11BA; # (풋; 풋; 풋; 풋; 풋; ) HANGUL SYLLABLE PUS +D48C;D48C;1111 116E 11BB;D48C;1111 116E 11BB; # (풌; 풌; 풌; 풌; 풌; ) HANGUL SYLLABLE PUSS +D48D;D48D;1111 116E 11BC;D48D;1111 116E 11BC; # (풍; 풍; 풍; 풍; 풍; ) HANGUL SYLLABLE PUNG +D48E;D48E;1111 116E 11BD;D48E;1111 116E 11BD; # (풎; 풎; 풎; 풎; 풎; ) HANGUL SYLLABLE PUJ +D48F;D48F;1111 116E 11BE;D48F;1111 116E 11BE; # (풏; 풏; 풏; 풏; 풏; ) HANGUL SYLLABLE PUC +D490;D490;1111 116E 11BF;D490;1111 116E 11BF; # (풐; 풐; 풐; 풐; 풐; ) HANGUL SYLLABLE PUK +D491;D491;1111 116E 11C0;D491;1111 116E 11C0; # (풑; 풑; 풑; 풑; 풑; ) HANGUL SYLLABLE PUT +D492;D492;1111 116E 11C1;D492;1111 116E 11C1; # (풒; 풒; 풒; 풒; 풒; ) HANGUL SYLLABLE PUP +D493;D493;1111 116E 11C2;D493;1111 116E 11C2; # (풓; 풓; 풓; 풓; 풓; ) HANGUL SYLLABLE PUH +D494;D494;1111 116F;D494;1111 116F; # (풔; 풔; 풔; 풔; 풔; ) HANGUL SYLLABLE PWEO +D495;D495;1111 116F 11A8;D495;1111 116F 11A8; # (풕; 풕; 풕; 풕; 풕; ) HANGUL SYLLABLE PWEOG +D496;D496;1111 116F 11A9;D496;1111 116F 11A9; # (풖; 풖; 풖; 풖; 풖; ) HANGUL SYLLABLE PWEOGG +D497;D497;1111 116F 11AA;D497;1111 116F 11AA; # (풗; 풗; 풗; 풗; 풗; ) HANGUL SYLLABLE PWEOGS +D498;D498;1111 116F 11AB;D498;1111 116F 11AB; # (풘; 풘; 풘; 풘; 풘; ) HANGUL SYLLABLE PWEON +D499;D499;1111 116F 11AC;D499;1111 116F 11AC; # (풙; 풙; 풙; 풙; 풙; ) HANGUL SYLLABLE PWEONJ +D49A;D49A;1111 116F 11AD;D49A;1111 116F 11AD; # (풚; 풚; 풚; 풚; 풚; ) HANGUL SYLLABLE PWEONH +D49B;D49B;1111 116F 11AE;D49B;1111 116F 11AE; # (풛; 풛; 풛; 풛; 풛; ) HANGUL SYLLABLE PWEOD +D49C;D49C;1111 116F 11AF;D49C;1111 116F 11AF; # (풜; 풜; 풜; 풜; 풜; ) HANGUL SYLLABLE PWEOL +D49D;D49D;1111 116F 11B0;D49D;1111 116F 11B0; # (풝; 풝; 풝; 풝; 풝; ) HANGUL SYLLABLE PWEOLG +D49E;D49E;1111 116F 11B1;D49E;1111 116F 11B1; # (풞; 풞; 풞; 풞; 풞; ) HANGUL SYLLABLE PWEOLM +D49F;D49F;1111 116F 11B2;D49F;1111 116F 11B2; # (풟; 풟; 풟; 풟; 풟; ) HANGUL SYLLABLE PWEOLB +D4A0;D4A0;1111 116F 11B3;D4A0;1111 116F 11B3; # (풠; 풠; 풠; 풠; 풠; ) HANGUL SYLLABLE PWEOLS +D4A1;D4A1;1111 116F 11B4;D4A1;1111 116F 11B4; # (풡; 풡; 풡; 풡; 풡; ) HANGUL SYLLABLE PWEOLT +D4A2;D4A2;1111 116F 11B5;D4A2;1111 116F 11B5; # (풢; 풢; 풢; 풢; 풢; ) HANGUL SYLLABLE PWEOLP +D4A3;D4A3;1111 116F 11B6;D4A3;1111 116F 11B6; # (풣; 풣; 풣; 풣; 풣; ) HANGUL SYLLABLE PWEOLH +D4A4;D4A4;1111 116F 11B7;D4A4;1111 116F 11B7; # (풤; 풤; 풤; 풤; 풤; ) HANGUL SYLLABLE PWEOM +D4A5;D4A5;1111 116F 11B8;D4A5;1111 116F 11B8; # (풥; 풥; 풥; 풥; 풥; ) HANGUL SYLLABLE PWEOB +D4A6;D4A6;1111 116F 11B9;D4A6;1111 116F 11B9; # (풦; 풦; 풦; 풦; 풦; ) HANGUL SYLLABLE PWEOBS +D4A7;D4A7;1111 116F 11BA;D4A7;1111 116F 11BA; # (풧; 풧; 풧; 풧; 풧; ) HANGUL SYLLABLE PWEOS +D4A8;D4A8;1111 116F 11BB;D4A8;1111 116F 11BB; # (풨; 풨; 풨; 풨; 풨; ) HANGUL SYLLABLE PWEOSS +D4A9;D4A9;1111 116F 11BC;D4A9;1111 116F 11BC; # (풩; 풩; 풩; 풩; 풩; ) HANGUL SYLLABLE PWEONG +D4AA;D4AA;1111 116F 11BD;D4AA;1111 116F 11BD; # (풪; 풪; 풪; 풪; 풪; ) HANGUL SYLLABLE PWEOJ +D4AB;D4AB;1111 116F 11BE;D4AB;1111 116F 11BE; # (풫; 풫; 풫; 풫; 풫; ) HANGUL SYLLABLE PWEOC +D4AC;D4AC;1111 116F 11BF;D4AC;1111 116F 11BF; # (풬; 풬; 풬; 풬; 풬; ) HANGUL SYLLABLE PWEOK +D4AD;D4AD;1111 116F 11C0;D4AD;1111 116F 11C0; # (풭; 풭; 풭; 풭; 풭; ) HANGUL SYLLABLE PWEOT +D4AE;D4AE;1111 116F 11C1;D4AE;1111 116F 11C1; # (풮; 풮; 풮; 풮; 풮; ) HANGUL SYLLABLE PWEOP +D4AF;D4AF;1111 116F 11C2;D4AF;1111 116F 11C2; # (풯; 풯; 풯; 풯; 풯; ) HANGUL SYLLABLE PWEOH +D4B0;D4B0;1111 1170;D4B0;1111 1170; # (풰; 풰; 풰; 풰; 풰; ) HANGUL SYLLABLE PWE +D4B1;D4B1;1111 1170 11A8;D4B1;1111 1170 11A8; # (풱; 풱; 풱; 풱; 풱; ) HANGUL SYLLABLE PWEG +D4B2;D4B2;1111 1170 11A9;D4B2;1111 1170 11A9; # (풲; 풲; 풲; 풲; 풲; ) HANGUL SYLLABLE PWEGG +D4B3;D4B3;1111 1170 11AA;D4B3;1111 1170 11AA; # (풳; 풳; 풳; 풳; 풳; ) HANGUL SYLLABLE PWEGS +D4B4;D4B4;1111 1170 11AB;D4B4;1111 1170 11AB; # (풴; 풴; 풴; 풴; 풴; ) HANGUL SYLLABLE PWEN +D4B5;D4B5;1111 1170 11AC;D4B5;1111 1170 11AC; # (풵; 풵; 풵; 풵; 풵; ) HANGUL SYLLABLE PWENJ +D4B6;D4B6;1111 1170 11AD;D4B6;1111 1170 11AD; # (풶; 풶; 풶; 풶; 풶; ) HANGUL SYLLABLE PWENH +D4B7;D4B7;1111 1170 11AE;D4B7;1111 1170 11AE; # (풷; 풷; 풷; 풷; 풷; ) HANGUL SYLLABLE PWED +D4B8;D4B8;1111 1170 11AF;D4B8;1111 1170 11AF; # (풸; 풸; 풸; 풸; 풸; ) HANGUL SYLLABLE PWEL +D4B9;D4B9;1111 1170 11B0;D4B9;1111 1170 11B0; # (풹; 풹; 풹; 풹; 풹; ) HANGUL SYLLABLE PWELG +D4BA;D4BA;1111 1170 11B1;D4BA;1111 1170 11B1; # (풺; 풺; 풺; 풺; 풺; ) HANGUL SYLLABLE PWELM +D4BB;D4BB;1111 1170 11B2;D4BB;1111 1170 11B2; # (풻; 풻; 풻; 풻; 풻; ) HANGUL SYLLABLE PWELB +D4BC;D4BC;1111 1170 11B3;D4BC;1111 1170 11B3; # (풼; 풼; 풼; 풼; 풼; ) HANGUL SYLLABLE PWELS +D4BD;D4BD;1111 1170 11B4;D4BD;1111 1170 11B4; # (풽; 풽; 풽; 풽; 풽; ) HANGUL SYLLABLE PWELT +D4BE;D4BE;1111 1170 11B5;D4BE;1111 1170 11B5; # (풾; 풾; 풾; 풾; 풾; ) HANGUL SYLLABLE PWELP +D4BF;D4BF;1111 1170 11B6;D4BF;1111 1170 11B6; # (풿; 풿; 풿; 풿; 풿; ) HANGUL SYLLABLE PWELH +D4C0;D4C0;1111 1170 11B7;D4C0;1111 1170 11B7; # (퓀; 퓀; 퓀; 퓀; 퓀; ) HANGUL SYLLABLE PWEM +D4C1;D4C1;1111 1170 11B8;D4C1;1111 1170 11B8; # (퓁; 퓁; 퓁; 퓁; 퓁; ) HANGUL SYLLABLE PWEB +D4C2;D4C2;1111 1170 11B9;D4C2;1111 1170 11B9; # (퓂; 퓂; 퓂; 퓂; 퓂; ) HANGUL SYLLABLE PWEBS +D4C3;D4C3;1111 1170 11BA;D4C3;1111 1170 11BA; # (퓃; 퓃; 퓃; 퓃; 퓃; ) HANGUL SYLLABLE PWES +D4C4;D4C4;1111 1170 11BB;D4C4;1111 1170 11BB; # (퓄; 퓄; 퓄; 퓄; 퓄; ) HANGUL SYLLABLE PWESS +D4C5;D4C5;1111 1170 11BC;D4C5;1111 1170 11BC; # (퓅; 퓅; 퓅; 퓅; 퓅; ) HANGUL SYLLABLE PWENG +D4C6;D4C6;1111 1170 11BD;D4C6;1111 1170 11BD; # (퓆; 퓆; 퓆; 퓆; 퓆; ) HANGUL SYLLABLE PWEJ +D4C7;D4C7;1111 1170 11BE;D4C7;1111 1170 11BE; # (퓇; 퓇; 퓇; 퓇; 퓇; ) HANGUL SYLLABLE PWEC +D4C8;D4C8;1111 1170 11BF;D4C8;1111 1170 11BF; # (퓈; 퓈; 퓈; 퓈; 퓈; ) HANGUL SYLLABLE PWEK +D4C9;D4C9;1111 1170 11C0;D4C9;1111 1170 11C0; # (퓉; 퓉; 퓉; 퓉; 퓉; ) HANGUL SYLLABLE PWET +D4CA;D4CA;1111 1170 11C1;D4CA;1111 1170 11C1; # (퓊; 퓊; 퓊; 퓊; 퓊; ) HANGUL SYLLABLE PWEP +D4CB;D4CB;1111 1170 11C2;D4CB;1111 1170 11C2; # (퓋; 퓋; 퓋; 퓋; 퓋; ) HANGUL SYLLABLE PWEH +D4CC;D4CC;1111 1171;D4CC;1111 1171; # (퓌; 퓌; 퓌; 퓌; 퓌; ) HANGUL SYLLABLE PWI +D4CD;D4CD;1111 1171 11A8;D4CD;1111 1171 11A8; # (퓍; 퓍; 퓍; 퓍; 퓍; ) HANGUL SYLLABLE PWIG +D4CE;D4CE;1111 1171 11A9;D4CE;1111 1171 11A9; # (퓎; 퓎; 퓎; 퓎; 퓎; ) HANGUL SYLLABLE PWIGG +D4CF;D4CF;1111 1171 11AA;D4CF;1111 1171 11AA; # (퓏; 퓏; 퓏; 퓏; 퓏; ) HANGUL SYLLABLE PWIGS +D4D0;D4D0;1111 1171 11AB;D4D0;1111 1171 11AB; # (퓐; 퓐; 퓐; 퓐; 퓐; ) HANGUL SYLLABLE PWIN +D4D1;D4D1;1111 1171 11AC;D4D1;1111 1171 11AC; # (퓑; 퓑; 퓑; 퓑; 퓑; ) HANGUL SYLLABLE PWINJ +D4D2;D4D2;1111 1171 11AD;D4D2;1111 1171 11AD; # (퓒; 퓒; 퓒; 퓒; 퓒; ) HANGUL SYLLABLE PWINH +D4D3;D4D3;1111 1171 11AE;D4D3;1111 1171 11AE; # (퓓; 퓓; 퓓; 퓓; 퓓; ) HANGUL SYLLABLE PWID +D4D4;D4D4;1111 1171 11AF;D4D4;1111 1171 11AF; # (퓔; 퓔; 퓔; 퓔; 퓔; ) HANGUL SYLLABLE PWIL +D4D5;D4D5;1111 1171 11B0;D4D5;1111 1171 11B0; # (퓕; 퓕; 퓕; 퓕; 퓕; ) HANGUL SYLLABLE PWILG +D4D6;D4D6;1111 1171 11B1;D4D6;1111 1171 11B1; # (퓖; 퓖; 퓖; 퓖; 퓖; ) HANGUL SYLLABLE PWILM +D4D7;D4D7;1111 1171 11B2;D4D7;1111 1171 11B2; # (퓗; 퓗; 퓗; 퓗; 퓗; ) HANGUL SYLLABLE PWILB +D4D8;D4D8;1111 1171 11B3;D4D8;1111 1171 11B3; # (퓘; 퓘; 퓘; 퓘; 퓘; ) HANGUL SYLLABLE PWILS +D4D9;D4D9;1111 1171 11B4;D4D9;1111 1171 11B4; # (퓙; 퓙; 퓙; 퓙; 퓙; ) HANGUL SYLLABLE PWILT +D4DA;D4DA;1111 1171 11B5;D4DA;1111 1171 11B5; # (퓚; 퓚; 퓚; 퓚; 퓚; ) HANGUL SYLLABLE PWILP +D4DB;D4DB;1111 1171 11B6;D4DB;1111 1171 11B6; # (퓛; 퓛; 퓛; 퓛; 퓛; ) HANGUL SYLLABLE PWILH +D4DC;D4DC;1111 1171 11B7;D4DC;1111 1171 11B7; # (퓜; 퓜; 퓜; 퓜; 퓜; ) HANGUL SYLLABLE PWIM +D4DD;D4DD;1111 1171 11B8;D4DD;1111 1171 11B8; # (퓝; 퓝; 퓝; 퓝; 퓝; ) HANGUL SYLLABLE PWIB +D4DE;D4DE;1111 1171 11B9;D4DE;1111 1171 11B9; # (퓞; 퓞; 퓞; 퓞; 퓞; ) HANGUL SYLLABLE PWIBS +D4DF;D4DF;1111 1171 11BA;D4DF;1111 1171 11BA; # (퓟; 퓟; 퓟; 퓟; 퓟; ) HANGUL SYLLABLE PWIS +D4E0;D4E0;1111 1171 11BB;D4E0;1111 1171 11BB; # (퓠; 퓠; 퓠; 퓠; 퓠; ) HANGUL SYLLABLE PWISS +D4E1;D4E1;1111 1171 11BC;D4E1;1111 1171 11BC; # (퓡; 퓡; 퓡; 퓡; 퓡; ) HANGUL SYLLABLE PWING +D4E2;D4E2;1111 1171 11BD;D4E2;1111 1171 11BD; # (퓢; 퓢; 퓢; 퓢; 퓢; ) HANGUL SYLLABLE PWIJ +D4E3;D4E3;1111 1171 11BE;D4E3;1111 1171 11BE; # (퓣; 퓣; 퓣; 퓣; 퓣; ) HANGUL SYLLABLE PWIC +D4E4;D4E4;1111 1171 11BF;D4E4;1111 1171 11BF; # (퓤; 퓤; 퓤; 퓤; 퓤; ) HANGUL SYLLABLE PWIK +D4E5;D4E5;1111 1171 11C0;D4E5;1111 1171 11C0; # (퓥; 퓥; 퓥; 퓥; 퓥; ) HANGUL SYLLABLE PWIT +D4E6;D4E6;1111 1171 11C1;D4E6;1111 1171 11C1; # (퓦; 퓦; 퓦; 퓦; 퓦; ) HANGUL SYLLABLE PWIP +D4E7;D4E7;1111 1171 11C2;D4E7;1111 1171 11C2; # (퓧; 퓧; 퓧; 퓧; 퓧; ) HANGUL SYLLABLE PWIH +D4E8;D4E8;1111 1172;D4E8;1111 1172; # (퓨; 퓨; 퓨; 퓨; 퓨; ) HANGUL SYLLABLE PYU +D4E9;D4E9;1111 1172 11A8;D4E9;1111 1172 11A8; # (퓩; 퓩; 퓩; 퓩; 퓩; ) HANGUL SYLLABLE PYUG +D4EA;D4EA;1111 1172 11A9;D4EA;1111 1172 11A9; # (퓪; 퓪; 퓪; 퓪; 퓪; ) HANGUL SYLLABLE PYUGG +D4EB;D4EB;1111 1172 11AA;D4EB;1111 1172 11AA; # (퓫; 퓫; 퓫; 퓫; 퓫; ) HANGUL SYLLABLE PYUGS +D4EC;D4EC;1111 1172 11AB;D4EC;1111 1172 11AB; # (퓬; 퓬; 퓬; 퓬; 퓬; ) HANGUL SYLLABLE PYUN +D4ED;D4ED;1111 1172 11AC;D4ED;1111 1172 11AC; # (퓭; 퓭; 퓭; 퓭; 퓭; ) HANGUL SYLLABLE PYUNJ +D4EE;D4EE;1111 1172 11AD;D4EE;1111 1172 11AD; # (퓮; 퓮; 퓮; 퓮; 퓮; ) HANGUL SYLLABLE PYUNH +D4EF;D4EF;1111 1172 11AE;D4EF;1111 1172 11AE; # (퓯; 퓯; 퓯; 퓯; 퓯; ) HANGUL SYLLABLE PYUD +D4F0;D4F0;1111 1172 11AF;D4F0;1111 1172 11AF; # (퓰; 퓰; 퓰; 퓰; 퓰; ) HANGUL SYLLABLE PYUL +D4F1;D4F1;1111 1172 11B0;D4F1;1111 1172 11B0; # (퓱; 퓱; 퓱; 퓱; 퓱; ) HANGUL SYLLABLE PYULG +D4F2;D4F2;1111 1172 11B1;D4F2;1111 1172 11B1; # (퓲; 퓲; 퓲; 퓲; 퓲; ) HANGUL SYLLABLE PYULM +D4F3;D4F3;1111 1172 11B2;D4F3;1111 1172 11B2; # (퓳; 퓳; 퓳; 퓳; 퓳; ) HANGUL SYLLABLE PYULB +D4F4;D4F4;1111 1172 11B3;D4F4;1111 1172 11B3; # (퓴; 퓴; 퓴; 퓴; 퓴; ) HANGUL SYLLABLE PYULS +D4F5;D4F5;1111 1172 11B4;D4F5;1111 1172 11B4; # (퓵; 퓵; 퓵; 퓵; 퓵; ) HANGUL SYLLABLE PYULT +D4F6;D4F6;1111 1172 11B5;D4F6;1111 1172 11B5; # (퓶; 퓶; 퓶; 퓶; 퓶; ) HANGUL SYLLABLE PYULP +D4F7;D4F7;1111 1172 11B6;D4F7;1111 1172 11B6; # (퓷; 퓷; 퓷; 퓷; 퓷; ) HANGUL SYLLABLE PYULH +D4F8;D4F8;1111 1172 11B7;D4F8;1111 1172 11B7; # (퓸; 퓸; 퓸; 퓸; 퓸; ) HANGUL SYLLABLE PYUM +D4F9;D4F9;1111 1172 11B8;D4F9;1111 1172 11B8; # (퓹; 퓹; 퓹; 퓹; 퓹; ) HANGUL SYLLABLE PYUB +D4FA;D4FA;1111 1172 11B9;D4FA;1111 1172 11B9; # (퓺; 퓺; 퓺; 퓺; 퓺; ) HANGUL SYLLABLE PYUBS +D4FB;D4FB;1111 1172 11BA;D4FB;1111 1172 11BA; # (퓻; 퓻; 퓻; 퓻; 퓻; ) HANGUL SYLLABLE PYUS +D4FC;D4FC;1111 1172 11BB;D4FC;1111 1172 11BB; # (퓼; 퓼; 퓼; 퓼; 퓼; ) HANGUL SYLLABLE PYUSS +D4FD;D4FD;1111 1172 11BC;D4FD;1111 1172 11BC; # (퓽; 퓽; 퓽; 퓽; 퓽; ) HANGUL SYLLABLE PYUNG +D4FE;D4FE;1111 1172 11BD;D4FE;1111 1172 11BD; # (퓾; 퓾; 퓾; 퓾; 퓾; ) HANGUL SYLLABLE PYUJ +D4FF;D4FF;1111 1172 11BE;D4FF;1111 1172 11BE; # (퓿; 퓿; 퓿; 퓿; 퓿; ) HANGUL SYLLABLE PYUC +D500;D500;1111 1172 11BF;D500;1111 1172 11BF; # (픀; 픀; 픀; 픀; 픀; ) HANGUL SYLLABLE PYUK +D501;D501;1111 1172 11C0;D501;1111 1172 11C0; # (픁; 픁; 픁; 픁; 픁; ) HANGUL SYLLABLE PYUT +D502;D502;1111 1172 11C1;D502;1111 1172 11C1; # (픂; 픂; 픂; 픂; 픂; ) HANGUL SYLLABLE PYUP +D503;D503;1111 1172 11C2;D503;1111 1172 11C2; # (픃; 픃; 픃; 픃; 픃; ) HANGUL SYLLABLE PYUH +D504;D504;1111 1173;D504;1111 1173; # (프; 프; 프; 프; 프; ) HANGUL SYLLABLE PEU +D505;D505;1111 1173 11A8;D505;1111 1173 11A8; # (픅; 픅; 픅; 픅; 픅; ) HANGUL SYLLABLE PEUG +D506;D506;1111 1173 11A9;D506;1111 1173 11A9; # (픆; 픆; 픆; 픆; 픆; ) HANGUL SYLLABLE PEUGG +D507;D507;1111 1173 11AA;D507;1111 1173 11AA; # (픇; 픇; 픇; 픇; 픇; ) HANGUL SYLLABLE PEUGS +D508;D508;1111 1173 11AB;D508;1111 1173 11AB; # (픈; 픈; 픈; 픈; 픈; ) HANGUL SYLLABLE PEUN +D509;D509;1111 1173 11AC;D509;1111 1173 11AC; # (픉; 픉; 픉; 픉; 픉; ) HANGUL SYLLABLE PEUNJ +D50A;D50A;1111 1173 11AD;D50A;1111 1173 11AD; # (픊; 픊; 픊; 픊; 픊; ) HANGUL SYLLABLE PEUNH +D50B;D50B;1111 1173 11AE;D50B;1111 1173 11AE; # (픋; 픋; 픋; 픋; 픋; ) HANGUL SYLLABLE PEUD +D50C;D50C;1111 1173 11AF;D50C;1111 1173 11AF; # (플; 플; 플; 플; 플; ) HANGUL SYLLABLE PEUL +D50D;D50D;1111 1173 11B0;D50D;1111 1173 11B0; # (픍; 픍; 픍; 픍; 픍; ) HANGUL SYLLABLE PEULG +D50E;D50E;1111 1173 11B1;D50E;1111 1173 11B1; # (픎; 픎; 픎; 픎; 픎; ) HANGUL SYLLABLE PEULM +D50F;D50F;1111 1173 11B2;D50F;1111 1173 11B2; # (픏; 픏; 픏; 픏; 픏; ) HANGUL SYLLABLE PEULB +D510;D510;1111 1173 11B3;D510;1111 1173 11B3; # (픐; 픐; 픐; 픐; 픐; ) HANGUL SYLLABLE PEULS +D511;D511;1111 1173 11B4;D511;1111 1173 11B4; # (픑; 픑; 픑; 픑; 픑; ) HANGUL SYLLABLE PEULT +D512;D512;1111 1173 11B5;D512;1111 1173 11B5; # (픒; 픒; 픒; 픒; 픒; ) HANGUL SYLLABLE PEULP +D513;D513;1111 1173 11B6;D513;1111 1173 11B6; # (픓; 픓; 픓; 픓; 픓; ) HANGUL SYLLABLE PEULH +D514;D514;1111 1173 11B7;D514;1111 1173 11B7; # (픔; 픔; 픔; 픔; 픔; ) HANGUL SYLLABLE PEUM +D515;D515;1111 1173 11B8;D515;1111 1173 11B8; # (픕; 픕; 픕; 픕; 픕; ) HANGUL SYLLABLE PEUB +D516;D516;1111 1173 11B9;D516;1111 1173 11B9; # (픖; 픖; 픖; 픖; 픖; ) HANGUL SYLLABLE PEUBS +D517;D517;1111 1173 11BA;D517;1111 1173 11BA; # (픗; 픗; 픗; 픗; 픗; ) HANGUL SYLLABLE PEUS +D518;D518;1111 1173 11BB;D518;1111 1173 11BB; # (픘; 픘; 픘; 픘; 픘; ) HANGUL SYLLABLE PEUSS +D519;D519;1111 1173 11BC;D519;1111 1173 11BC; # (픙; 픙; 픙; 픙; 픙; ) HANGUL SYLLABLE PEUNG +D51A;D51A;1111 1173 11BD;D51A;1111 1173 11BD; # (픚; 픚; 픚; 픚; 픚; ) HANGUL SYLLABLE PEUJ +D51B;D51B;1111 1173 11BE;D51B;1111 1173 11BE; # (픛; 픛; 픛; 픛; 픛; ) HANGUL SYLLABLE PEUC +D51C;D51C;1111 1173 11BF;D51C;1111 1173 11BF; # (픜; 픜; 픜; 픜; 픜; ) HANGUL SYLLABLE PEUK +D51D;D51D;1111 1173 11C0;D51D;1111 1173 11C0; # (픝; 픝; 픝; 픝; 픝; ) HANGUL SYLLABLE PEUT +D51E;D51E;1111 1173 11C1;D51E;1111 1173 11C1; # (픞; 픞; 픞; 픞; 픞; ) HANGUL SYLLABLE PEUP +D51F;D51F;1111 1173 11C2;D51F;1111 1173 11C2; # (픟; 픟; 픟; 픟; 픟; ) HANGUL SYLLABLE PEUH +D520;D520;1111 1174;D520;1111 1174; # (픠; 픠; 픠; 픠; 픠; ) HANGUL SYLLABLE PYI +D521;D521;1111 1174 11A8;D521;1111 1174 11A8; # (픡; 픡; 픡; 픡; 픡; ) HANGUL SYLLABLE PYIG +D522;D522;1111 1174 11A9;D522;1111 1174 11A9; # (픢; 픢; 픢; 픢; 픢; ) HANGUL SYLLABLE PYIGG +D523;D523;1111 1174 11AA;D523;1111 1174 11AA; # (픣; 픣; 픣; 픣; 픣; ) HANGUL SYLLABLE PYIGS +D524;D524;1111 1174 11AB;D524;1111 1174 11AB; # (픤; 픤; 픤; 픤; 픤; ) HANGUL SYLLABLE PYIN +D525;D525;1111 1174 11AC;D525;1111 1174 11AC; # (픥; 픥; 픥; 픥; 픥; ) HANGUL SYLLABLE PYINJ +D526;D526;1111 1174 11AD;D526;1111 1174 11AD; # (픦; 픦; 픦; 픦; 픦; ) HANGUL SYLLABLE PYINH +D527;D527;1111 1174 11AE;D527;1111 1174 11AE; # (픧; 픧; 픧; 픧; 픧; ) HANGUL SYLLABLE PYID +D528;D528;1111 1174 11AF;D528;1111 1174 11AF; # (픨; 픨; 픨; 픨; 픨; ) HANGUL SYLLABLE PYIL +D529;D529;1111 1174 11B0;D529;1111 1174 11B0; # (픩; 픩; 픩; 픩; 픩; ) HANGUL SYLLABLE PYILG +D52A;D52A;1111 1174 11B1;D52A;1111 1174 11B1; # (픪; 픪; 픪; 픪; 픪; ) HANGUL SYLLABLE PYILM +D52B;D52B;1111 1174 11B2;D52B;1111 1174 11B2; # (픫; 픫; 픫; 픫; 픫; ) HANGUL SYLLABLE PYILB +D52C;D52C;1111 1174 11B3;D52C;1111 1174 11B3; # (픬; 픬; 픬; 픬; 픬; ) HANGUL SYLLABLE PYILS +D52D;D52D;1111 1174 11B4;D52D;1111 1174 11B4; # (픭; 픭; 픭; 픭; 픭; ) HANGUL SYLLABLE PYILT +D52E;D52E;1111 1174 11B5;D52E;1111 1174 11B5; # (픮; 픮; 픮; 픮; 픮; ) HANGUL SYLLABLE PYILP +D52F;D52F;1111 1174 11B6;D52F;1111 1174 11B6; # (픯; 픯; 픯; 픯; 픯; ) HANGUL SYLLABLE PYILH +D530;D530;1111 1174 11B7;D530;1111 1174 11B7; # (픰; 픰; 픰; 픰; 픰; ) HANGUL SYLLABLE PYIM +D531;D531;1111 1174 11B8;D531;1111 1174 11B8; # (픱; 픱; 픱; 픱; 픱; ) HANGUL SYLLABLE PYIB +D532;D532;1111 1174 11B9;D532;1111 1174 11B9; # (픲; 픲; 픲; 픲; 픲; ) HANGUL SYLLABLE PYIBS +D533;D533;1111 1174 11BA;D533;1111 1174 11BA; # (픳; 픳; 픳; 픳; 픳; ) HANGUL SYLLABLE PYIS +D534;D534;1111 1174 11BB;D534;1111 1174 11BB; # (픴; 픴; 픴; 픴; 픴; ) HANGUL SYLLABLE PYISS +D535;D535;1111 1174 11BC;D535;1111 1174 11BC; # (픵; 픵; 픵; 픵; 픵; ) HANGUL SYLLABLE PYING +D536;D536;1111 1174 11BD;D536;1111 1174 11BD; # (픶; 픶; 픶; 픶; 픶; ) HANGUL SYLLABLE PYIJ +D537;D537;1111 1174 11BE;D537;1111 1174 11BE; # (픷; 픷; 픷; 픷; 픷; ) HANGUL SYLLABLE PYIC +D538;D538;1111 1174 11BF;D538;1111 1174 11BF; # (픸; 픸; 픸; 픸; 픸; ) HANGUL SYLLABLE PYIK +D539;D539;1111 1174 11C0;D539;1111 1174 11C0; # (픹; 픹; 픹; 픹; 픹; ) HANGUL SYLLABLE PYIT +D53A;D53A;1111 1174 11C1;D53A;1111 1174 11C1; # (픺; 픺; 픺; 픺; 픺; ) HANGUL SYLLABLE PYIP +D53B;D53B;1111 1174 11C2;D53B;1111 1174 11C2; # (픻; 픻; 픻; 픻; 픻; ) HANGUL SYLLABLE PYIH +D53C;D53C;1111 1175;D53C;1111 1175; # (피; 피; 피; 피; 피; ) HANGUL SYLLABLE PI +D53D;D53D;1111 1175 11A8;D53D;1111 1175 11A8; # (픽; 픽; 픽; 픽; 픽; ) HANGUL SYLLABLE PIG +D53E;D53E;1111 1175 11A9;D53E;1111 1175 11A9; # (픾; 픾; 픾; 픾; 픾; ) HANGUL SYLLABLE PIGG +D53F;D53F;1111 1175 11AA;D53F;1111 1175 11AA; # (픿; 픿; 픿; 픿; 픿; ) HANGUL SYLLABLE PIGS +D540;D540;1111 1175 11AB;D540;1111 1175 11AB; # (핀; 핀; 핀; 핀; 핀; ) HANGUL SYLLABLE PIN +D541;D541;1111 1175 11AC;D541;1111 1175 11AC; # (핁; 핁; 핁; 핁; 핁; ) HANGUL SYLLABLE PINJ +D542;D542;1111 1175 11AD;D542;1111 1175 11AD; # (핂; 핂; 핂; 핂; 핂; ) HANGUL SYLLABLE PINH +D543;D543;1111 1175 11AE;D543;1111 1175 11AE; # (핃; 핃; 핃; 핃; 핃; ) HANGUL SYLLABLE PID +D544;D544;1111 1175 11AF;D544;1111 1175 11AF; # (필; 필; 필; 필; 필; ) HANGUL SYLLABLE PIL +D545;D545;1111 1175 11B0;D545;1111 1175 11B0; # (핅; 핅; 핅; 핅; 핅; ) HANGUL SYLLABLE PILG +D546;D546;1111 1175 11B1;D546;1111 1175 11B1; # (핆; 핆; 핆; 핆; 핆; ) HANGUL SYLLABLE PILM +D547;D547;1111 1175 11B2;D547;1111 1175 11B2; # (핇; 핇; 핇; 핇; 핇; ) HANGUL SYLLABLE PILB +D548;D548;1111 1175 11B3;D548;1111 1175 11B3; # (핈; 핈; 핈; 핈; 핈; ) HANGUL SYLLABLE PILS +D549;D549;1111 1175 11B4;D549;1111 1175 11B4; # (핉; 핉; 핉; 핉; 핉; ) HANGUL SYLLABLE PILT +D54A;D54A;1111 1175 11B5;D54A;1111 1175 11B5; # (핊; 핊; 핊; 핊; 핊; ) HANGUL SYLLABLE PILP +D54B;D54B;1111 1175 11B6;D54B;1111 1175 11B6; # (핋; 핋; 핋; 핋; 핋; ) HANGUL SYLLABLE PILH +D54C;D54C;1111 1175 11B7;D54C;1111 1175 11B7; # (핌; 핌; 핌; 핌; 핌; ) HANGUL SYLLABLE PIM +D54D;D54D;1111 1175 11B8;D54D;1111 1175 11B8; # (핍; 핍; 핍; 핍; 핍; ) HANGUL SYLLABLE PIB +D54E;D54E;1111 1175 11B9;D54E;1111 1175 11B9; # (핎; 핎; 핎; 핎; 핎; ) HANGUL SYLLABLE PIBS +D54F;D54F;1111 1175 11BA;D54F;1111 1175 11BA; # (핏; 핏; 핏; 핏; 핏; ) HANGUL SYLLABLE PIS +D550;D550;1111 1175 11BB;D550;1111 1175 11BB; # (핐; 핐; 핐; 핐; 핐; ) HANGUL SYLLABLE PISS +D551;D551;1111 1175 11BC;D551;1111 1175 11BC; # (핑; 핑; 핑; 핑; 핑; ) HANGUL SYLLABLE PING +D552;D552;1111 1175 11BD;D552;1111 1175 11BD; # (핒; 핒; 핒; 핒; 핒; ) HANGUL SYLLABLE PIJ +D553;D553;1111 1175 11BE;D553;1111 1175 11BE; # (핓; 핓; 핓; 핓; 핓; ) HANGUL SYLLABLE PIC +D554;D554;1111 1175 11BF;D554;1111 1175 11BF; # (핔; 핔; 핔; 핔; 핔; ) HANGUL SYLLABLE PIK +D555;D555;1111 1175 11C0;D555;1111 1175 11C0; # (핕; 핕; 핕; 핕; 핕; ) HANGUL SYLLABLE PIT +D556;D556;1111 1175 11C1;D556;1111 1175 11C1; # (핖; 핖; 핖; 핖; 핖; ) HANGUL SYLLABLE PIP +D557;D557;1111 1175 11C2;D557;1111 1175 11C2; # (핗; 핗; 핗; 핗; 핗; ) HANGUL SYLLABLE PIH +D558;D558;1112 1161;D558;1112 1161; # (하; 하; 하; 하; 하; ) HANGUL SYLLABLE HA +D559;D559;1112 1161 11A8;D559;1112 1161 11A8; # (학; 학; 학; 학; 학; ) HANGUL SYLLABLE HAG +D55A;D55A;1112 1161 11A9;D55A;1112 1161 11A9; # (핚; 핚; 핚; 핚; 핚; ) HANGUL SYLLABLE HAGG +D55B;D55B;1112 1161 11AA;D55B;1112 1161 11AA; # (핛; 핛; 핛; 핛; 핛; ) HANGUL SYLLABLE HAGS +D55C;D55C;1112 1161 11AB;D55C;1112 1161 11AB; # (한; 한; 한; 한; 한; ) HANGUL SYLLABLE HAN +D55D;D55D;1112 1161 11AC;D55D;1112 1161 11AC; # (핝; 핝; 핝; 핝; 핝; ) HANGUL SYLLABLE HANJ +D55E;D55E;1112 1161 11AD;D55E;1112 1161 11AD; # (핞; 핞; 핞; 핞; 핞; ) HANGUL SYLLABLE HANH +D55F;D55F;1112 1161 11AE;D55F;1112 1161 11AE; # (핟; 핟; 핟; 핟; 핟; ) HANGUL SYLLABLE HAD +D560;D560;1112 1161 11AF;D560;1112 1161 11AF; # (할; 할; 할; 할; 할; ) HANGUL SYLLABLE HAL +D561;D561;1112 1161 11B0;D561;1112 1161 11B0; # (핡; 핡; 핡; 핡; 핡; ) HANGUL SYLLABLE HALG +D562;D562;1112 1161 11B1;D562;1112 1161 11B1; # (핢; 핢; 핢; 핢; 핢; ) HANGUL SYLLABLE HALM +D563;D563;1112 1161 11B2;D563;1112 1161 11B2; # (핣; 핣; 핣; 핣; 핣; ) HANGUL SYLLABLE HALB +D564;D564;1112 1161 11B3;D564;1112 1161 11B3; # (핤; 핤; 핤; 핤; 핤; ) HANGUL SYLLABLE HALS +D565;D565;1112 1161 11B4;D565;1112 1161 11B4; # (핥; 핥; 핥; 핥; 핥; ) HANGUL SYLLABLE HALT +D566;D566;1112 1161 11B5;D566;1112 1161 11B5; # (핦; 핦; 핦; 핦; 핦; ) HANGUL SYLLABLE HALP +D567;D567;1112 1161 11B6;D567;1112 1161 11B6; # (핧; 핧; 핧; 핧; 핧; ) HANGUL SYLLABLE HALH +D568;D568;1112 1161 11B7;D568;1112 1161 11B7; # (함; 함; 함; 함; 함; ) HANGUL SYLLABLE HAM +D569;D569;1112 1161 11B8;D569;1112 1161 11B8; # (합; 합; 합; 합; 합; ) HANGUL SYLLABLE HAB +D56A;D56A;1112 1161 11B9;D56A;1112 1161 11B9; # (핪; 핪; 핪; 핪; 핪; ) HANGUL SYLLABLE HABS +D56B;D56B;1112 1161 11BA;D56B;1112 1161 11BA; # (핫; 핫; 핫; 핫; 핫; ) HANGUL SYLLABLE HAS +D56C;D56C;1112 1161 11BB;D56C;1112 1161 11BB; # (핬; 핬; 핬; 핬; 핬; ) HANGUL SYLLABLE HASS +D56D;D56D;1112 1161 11BC;D56D;1112 1161 11BC; # (항; 항; 항; 항; 항; ) HANGUL SYLLABLE HANG +D56E;D56E;1112 1161 11BD;D56E;1112 1161 11BD; # (핮; 핮; 핮; 핮; 핮; ) HANGUL SYLLABLE HAJ +D56F;D56F;1112 1161 11BE;D56F;1112 1161 11BE; # (핯; 핯; 핯; 핯; 핯; ) HANGUL SYLLABLE HAC +D570;D570;1112 1161 11BF;D570;1112 1161 11BF; # (핰; 핰; 핰; 핰; 핰; ) HANGUL SYLLABLE HAK +D571;D571;1112 1161 11C0;D571;1112 1161 11C0; # (핱; 핱; 핱; 핱; 핱; ) HANGUL SYLLABLE HAT +D572;D572;1112 1161 11C1;D572;1112 1161 11C1; # (핲; 핲; 핲; 핲; 핲; ) HANGUL SYLLABLE HAP +D573;D573;1112 1161 11C2;D573;1112 1161 11C2; # (핳; 핳; 핳; 핳; 핳; ) HANGUL SYLLABLE HAH +D574;D574;1112 1162;D574;1112 1162; # (해; 해; 해; 해; 해; ) HANGUL SYLLABLE HAE +D575;D575;1112 1162 11A8;D575;1112 1162 11A8; # (핵; 핵; 핵; 핵; 핵; ) HANGUL SYLLABLE HAEG +D576;D576;1112 1162 11A9;D576;1112 1162 11A9; # (핶; 핶; 핶; 핶; 핶; ) HANGUL SYLLABLE HAEGG +D577;D577;1112 1162 11AA;D577;1112 1162 11AA; # (핷; 핷; 핷; 핷; 핷; ) HANGUL SYLLABLE HAEGS +D578;D578;1112 1162 11AB;D578;1112 1162 11AB; # (핸; 핸; 핸; 핸; 핸; ) HANGUL SYLLABLE HAEN +D579;D579;1112 1162 11AC;D579;1112 1162 11AC; # (핹; 핹; 핹; 핹; 핹; ) HANGUL SYLLABLE HAENJ +D57A;D57A;1112 1162 11AD;D57A;1112 1162 11AD; # (핺; 핺; 핺; 핺; 핺; ) HANGUL SYLLABLE HAENH +D57B;D57B;1112 1162 11AE;D57B;1112 1162 11AE; # (핻; 핻; 핻; 핻; 핻; ) HANGUL SYLLABLE HAED +D57C;D57C;1112 1162 11AF;D57C;1112 1162 11AF; # (핼; 핼; 핼; 핼; 핼; ) HANGUL SYLLABLE HAEL +D57D;D57D;1112 1162 11B0;D57D;1112 1162 11B0; # (핽; 핽; 핽; 핽; 핽; ) HANGUL SYLLABLE HAELG +D57E;D57E;1112 1162 11B1;D57E;1112 1162 11B1; # (핾; 핾; 핾; 핾; 핾; ) HANGUL SYLLABLE HAELM +D57F;D57F;1112 1162 11B2;D57F;1112 1162 11B2; # (핿; 핿; 핿; 핿; 핿; ) HANGUL SYLLABLE HAELB +D580;D580;1112 1162 11B3;D580;1112 1162 11B3; # (햀; 햀; 햀; 햀; 햀; ) HANGUL SYLLABLE HAELS +D581;D581;1112 1162 11B4;D581;1112 1162 11B4; # (햁; 햁; 햁; 햁; 햁; ) HANGUL SYLLABLE HAELT +D582;D582;1112 1162 11B5;D582;1112 1162 11B5; # (햂; 햂; 햂; 햂; 햂; ) HANGUL SYLLABLE HAELP +D583;D583;1112 1162 11B6;D583;1112 1162 11B6; # (햃; 햃; 햃; 햃; 햃; ) HANGUL SYLLABLE HAELH +D584;D584;1112 1162 11B7;D584;1112 1162 11B7; # (햄; 햄; 햄; 햄; 햄; ) HANGUL SYLLABLE HAEM +D585;D585;1112 1162 11B8;D585;1112 1162 11B8; # (햅; 햅; 햅; 햅; 햅; ) HANGUL SYLLABLE HAEB +D586;D586;1112 1162 11B9;D586;1112 1162 11B9; # (햆; 햆; 햆; 햆; 햆; ) HANGUL SYLLABLE HAEBS +D587;D587;1112 1162 11BA;D587;1112 1162 11BA; # (햇; 햇; 햇; 햇; 햇; ) HANGUL SYLLABLE HAES +D588;D588;1112 1162 11BB;D588;1112 1162 11BB; # (했; 했; 했; 했; 했; ) HANGUL SYLLABLE HAESS +D589;D589;1112 1162 11BC;D589;1112 1162 11BC; # (행; 행; 행; 행; 행; ) HANGUL SYLLABLE HAENG +D58A;D58A;1112 1162 11BD;D58A;1112 1162 11BD; # (햊; 햊; 햊; 햊; 햊; ) HANGUL SYLLABLE HAEJ +D58B;D58B;1112 1162 11BE;D58B;1112 1162 11BE; # (햋; 햋; 햋; 햋; 햋; ) HANGUL SYLLABLE HAEC +D58C;D58C;1112 1162 11BF;D58C;1112 1162 11BF; # (햌; 햌; 햌; 햌; 햌; ) HANGUL SYLLABLE HAEK +D58D;D58D;1112 1162 11C0;D58D;1112 1162 11C0; # (햍; 햍; 햍; 햍; 햍; ) HANGUL SYLLABLE HAET +D58E;D58E;1112 1162 11C1;D58E;1112 1162 11C1; # (햎; 햎; 햎; 햎; 햎; ) HANGUL SYLLABLE HAEP +D58F;D58F;1112 1162 11C2;D58F;1112 1162 11C2; # (햏; 햏; 햏; 햏; 햏; ) HANGUL SYLLABLE HAEH +D590;D590;1112 1163;D590;1112 1163; # (햐; 햐; 햐; 햐; 햐; ) HANGUL SYLLABLE HYA +D591;D591;1112 1163 11A8;D591;1112 1163 11A8; # (햑; 햑; 햑; 햑; 햑; ) HANGUL SYLLABLE HYAG +D592;D592;1112 1163 11A9;D592;1112 1163 11A9; # (햒; 햒; 햒; 햒; 햒; ) HANGUL SYLLABLE HYAGG +D593;D593;1112 1163 11AA;D593;1112 1163 11AA; # (햓; 햓; 햓; 햓; 햓; ) HANGUL SYLLABLE HYAGS +D594;D594;1112 1163 11AB;D594;1112 1163 11AB; # (햔; 햔; 햔; 햔; 햔; ) HANGUL SYLLABLE HYAN +D595;D595;1112 1163 11AC;D595;1112 1163 11AC; # (햕; 햕; 햕; 햕; 햕; ) HANGUL SYLLABLE HYANJ +D596;D596;1112 1163 11AD;D596;1112 1163 11AD; # (햖; 햖; 햖; 햖; 햖; ) HANGUL SYLLABLE HYANH +D597;D597;1112 1163 11AE;D597;1112 1163 11AE; # (햗; 햗; 햗; 햗; 햗; ) HANGUL SYLLABLE HYAD +D598;D598;1112 1163 11AF;D598;1112 1163 11AF; # (햘; 햘; 햘; 햘; 햘; ) HANGUL SYLLABLE HYAL +D599;D599;1112 1163 11B0;D599;1112 1163 11B0; # (햙; 햙; 햙; 햙; 햙; ) HANGUL SYLLABLE HYALG +D59A;D59A;1112 1163 11B1;D59A;1112 1163 11B1; # (햚; 햚; 햚; 햚; 햚; ) HANGUL SYLLABLE HYALM +D59B;D59B;1112 1163 11B2;D59B;1112 1163 11B2; # (햛; 햛; 햛; 햛; 햛; ) HANGUL SYLLABLE HYALB +D59C;D59C;1112 1163 11B3;D59C;1112 1163 11B3; # (햜; 햜; 햜; 햜; 햜; ) HANGUL SYLLABLE HYALS +D59D;D59D;1112 1163 11B4;D59D;1112 1163 11B4; # (햝; 햝; 햝; 햝; 햝; ) HANGUL SYLLABLE HYALT +D59E;D59E;1112 1163 11B5;D59E;1112 1163 11B5; # (햞; 햞; 햞; 햞; 햞; ) HANGUL SYLLABLE HYALP +D59F;D59F;1112 1163 11B6;D59F;1112 1163 11B6; # (햟; 햟; 햟; 햟; 햟; ) HANGUL SYLLABLE HYALH +D5A0;D5A0;1112 1163 11B7;D5A0;1112 1163 11B7; # (햠; 햠; 햠; 햠; 햠; ) HANGUL SYLLABLE HYAM +D5A1;D5A1;1112 1163 11B8;D5A1;1112 1163 11B8; # (햡; 햡; 햡; 햡; 햡; ) HANGUL SYLLABLE HYAB +D5A2;D5A2;1112 1163 11B9;D5A2;1112 1163 11B9; # (햢; 햢; 햢; 햢; 햢; ) HANGUL SYLLABLE HYABS +D5A3;D5A3;1112 1163 11BA;D5A3;1112 1163 11BA; # (햣; 햣; 햣; 햣; 햣; ) HANGUL SYLLABLE HYAS +D5A4;D5A4;1112 1163 11BB;D5A4;1112 1163 11BB; # (햤; 햤; 햤; 햤; 햤; ) HANGUL SYLLABLE HYASS +D5A5;D5A5;1112 1163 11BC;D5A5;1112 1163 11BC; # (향; 향; 향; 향; 향; ) HANGUL SYLLABLE HYANG +D5A6;D5A6;1112 1163 11BD;D5A6;1112 1163 11BD; # (햦; 햦; 햦; 햦; 햦; ) HANGUL SYLLABLE HYAJ +D5A7;D5A7;1112 1163 11BE;D5A7;1112 1163 11BE; # (햧; 햧; 햧; 햧; 햧; ) HANGUL SYLLABLE HYAC +D5A8;D5A8;1112 1163 11BF;D5A8;1112 1163 11BF; # (햨; 햨; 햨; 햨; 햨; ) HANGUL SYLLABLE HYAK +D5A9;D5A9;1112 1163 11C0;D5A9;1112 1163 11C0; # (햩; 햩; 햩; 햩; 햩; ) HANGUL SYLLABLE HYAT +D5AA;D5AA;1112 1163 11C1;D5AA;1112 1163 11C1; # (햪; 햪; 햪; 햪; 햪; ) HANGUL SYLLABLE HYAP +D5AB;D5AB;1112 1163 11C2;D5AB;1112 1163 11C2; # (햫; 햫; 햫; 햫; 햫; ) HANGUL SYLLABLE HYAH +D5AC;D5AC;1112 1164;D5AC;1112 1164; # (햬; 햬; 햬; 햬; 햬; ) HANGUL SYLLABLE HYAE +D5AD;D5AD;1112 1164 11A8;D5AD;1112 1164 11A8; # (햭; 햭; 햭; 햭; 햭; ) HANGUL SYLLABLE HYAEG +D5AE;D5AE;1112 1164 11A9;D5AE;1112 1164 11A9; # (햮; 햮; 햮; 햮; 햮; ) HANGUL SYLLABLE HYAEGG +D5AF;D5AF;1112 1164 11AA;D5AF;1112 1164 11AA; # (햯; 햯; 햯; 햯; 햯; ) HANGUL SYLLABLE HYAEGS +D5B0;D5B0;1112 1164 11AB;D5B0;1112 1164 11AB; # (햰; 햰; 햰; 햰; 햰; ) HANGUL SYLLABLE HYAEN +D5B1;D5B1;1112 1164 11AC;D5B1;1112 1164 11AC; # (햱; 햱; 햱; 햱; 햱; ) HANGUL SYLLABLE HYAENJ +D5B2;D5B2;1112 1164 11AD;D5B2;1112 1164 11AD; # (햲; 햲; 햲; 햲; 햲; ) HANGUL SYLLABLE HYAENH +D5B3;D5B3;1112 1164 11AE;D5B3;1112 1164 11AE; # (햳; 햳; 햳; 햳; 햳; ) HANGUL SYLLABLE HYAED +D5B4;D5B4;1112 1164 11AF;D5B4;1112 1164 11AF; # (햴; 햴; 햴; 햴; 햴; ) HANGUL SYLLABLE HYAEL +D5B5;D5B5;1112 1164 11B0;D5B5;1112 1164 11B0; # (햵; 햵; 햵; 햵; 햵; ) HANGUL SYLLABLE HYAELG +D5B6;D5B6;1112 1164 11B1;D5B6;1112 1164 11B1; # (햶; 햶; 햶; 햶; 햶; ) HANGUL SYLLABLE HYAELM +D5B7;D5B7;1112 1164 11B2;D5B7;1112 1164 11B2; # (햷; 햷; 햷; 햷; 햷; ) HANGUL SYLLABLE HYAELB +D5B8;D5B8;1112 1164 11B3;D5B8;1112 1164 11B3; # (햸; 햸; 햸; 햸; 햸; ) HANGUL SYLLABLE HYAELS +D5B9;D5B9;1112 1164 11B4;D5B9;1112 1164 11B4; # (햹; 햹; 햹; 햹; 햹; ) HANGUL SYLLABLE HYAELT +D5BA;D5BA;1112 1164 11B5;D5BA;1112 1164 11B5; # (햺; 햺; 햺; 햺; 햺; ) HANGUL SYLLABLE HYAELP +D5BB;D5BB;1112 1164 11B6;D5BB;1112 1164 11B6; # (햻; 햻; 햻; 햻; 햻; ) HANGUL SYLLABLE HYAELH +D5BC;D5BC;1112 1164 11B7;D5BC;1112 1164 11B7; # (햼; 햼; 햼; 햼; 햼; ) HANGUL SYLLABLE HYAEM +D5BD;D5BD;1112 1164 11B8;D5BD;1112 1164 11B8; # (햽; 햽; 햽; 햽; 햽; ) HANGUL SYLLABLE HYAEB +D5BE;D5BE;1112 1164 11B9;D5BE;1112 1164 11B9; # (햾; 햾; 햾; 햾; 햾; ) HANGUL SYLLABLE HYAEBS +D5BF;D5BF;1112 1164 11BA;D5BF;1112 1164 11BA; # (햿; 햿; 햿; 햿; 햿; ) HANGUL SYLLABLE HYAES +D5C0;D5C0;1112 1164 11BB;D5C0;1112 1164 11BB; # (헀; 헀; 헀; 헀; 헀; ) HANGUL SYLLABLE HYAESS +D5C1;D5C1;1112 1164 11BC;D5C1;1112 1164 11BC; # (헁; 헁; 헁; 헁; 헁; ) HANGUL SYLLABLE HYAENG +D5C2;D5C2;1112 1164 11BD;D5C2;1112 1164 11BD; # (헂; 헂; 헂; 헂; 헂; ) HANGUL SYLLABLE HYAEJ +D5C3;D5C3;1112 1164 11BE;D5C3;1112 1164 11BE; # (헃; 헃; 헃; 헃; 헃; ) HANGUL SYLLABLE HYAEC +D5C4;D5C4;1112 1164 11BF;D5C4;1112 1164 11BF; # (헄; 헄; 헄; 헄; 헄; ) HANGUL SYLLABLE HYAEK +D5C5;D5C5;1112 1164 11C0;D5C5;1112 1164 11C0; # (헅; 헅; 헅; 헅; 헅; ) HANGUL SYLLABLE HYAET +D5C6;D5C6;1112 1164 11C1;D5C6;1112 1164 11C1; # (헆; 헆; 헆; 헆; 헆; ) HANGUL SYLLABLE HYAEP +D5C7;D5C7;1112 1164 11C2;D5C7;1112 1164 11C2; # (헇; 헇; 헇; 헇; 헇; ) HANGUL SYLLABLE HYAEH +D5C8;D5C8;1112 1165;D5C8;1112 1165; # (허; 허; 허; 허; 허; ) HANGUL SYLLABLE HEO +D5C9;D5C9;1112 1165 11A8;D5C9;1112 1165 11A8; # (헉; 헉; 헉; 헉; 헉; ) HANGUL SYLLABLE HEOG +D5CA;D5CA;1112 1165 11A9;D5CA;1112 1165 11A9; # (헊; 헊; 헊; 헊; 헊; ) HANGUL SYLLABLE HEOGG +D5CB;D5CB;1112 1165 11AA;D5CB;1112 1165 11AA; # (헋; 헋; 헋; 헋; 헋; ) HANGUL SYLLABLE HEOGS +D5CC;D5CC;1112 1165 11AB;D5CC;1112 1165 11AB; # (헌; 헌; 헌; 헌; 헌; ) HANGUL SYLLABLE HEON +D5CD;D5CD;1112 1165 11AC;D5CD;1112 1165 11AC; # (헍; 헍; 헍; 헍; 헍; ) HANGUL SYLLABLE HEONJ +D5CE;D5CE;1112 1165 11AD;D5CE;1112 1165 11AD; # (헎; 헎; 헎; 헎; 헎; ) HANGUL SYLLABLE HEONH +D5CF;D5CF;1112 1165 11AE;D5CF;1112 1165 11AE; # (헏; 헏; 헏; 헏; 헏; ) HANGUL SYLLABLE HEOD +D5D0;D5D0;1112 1165 11AF;D5D0;1112 1165 11AF; # (헐; 헐; 헐; 헐; 헐; ) HANGUL SYLLABLE HEOL +D5D1;D5D1;1112 1165 11B0;D5D1;1112 1165 11B0; # (헑; 헑; 헑; 헑; 헑; ) HANGUL SYLLABLE HEOLG +D5D2;D5D2;1112 1165 11B1;D5D2;1112 1165 11B1; # (헒; 헒; 헒; 헒; 헒; ) HANGUL SYLLABLE HEOLM +D5D3;D5D3;1112 1165 11B2;D5D3;1112 1165 11B2; # (헓; 헓; 헓; 헓; 헓; ) HANGUL SYLLABLE HEOLB +D5D4;D5D4;1112 1165 11B3;D5D4;1112 1165 11B3; # (헔; 헔; 헔; 헔; 헔; ) HANGUL SYLLABLE HEOLS +D5D5;D5D5;1112 1165 11B4;D5D5;1112 1165 11B4; # (헕; 헕; 헕; 헕; 헕; ) HANGUL SYLLABLE HEOLT +D5D6;D5D6;1112 1165 11B5;D5D6;1112 1165 11B5; # (헖; 헖; 헖; 헖; 헖; ) HANGUL SYLLABLE HEOLP +D5D7;D5D7;1112 1165 11B6;D5D7;1112 1165 11B6; # (헗; 헗; 헗; 헗; 헗; ) HANGUL SYLLABLE HEOLH +D5D8;D5D8;1112 1165 11B7;D5D8;1112 1165 11B7; # (험; 험; 험; 험; 험; ) HANGUL SYLLABLE HEOM +D5D9;D5D9;1112 1165 11B8;D5D9;1112 1165 11B8; # (헙; 헙; 헙; 헙; 헙; ) HANGUL SYLLABLE HEOB +D5DA;D5DA;1112 1165 11B9;D5DA;1112 1165 11B9; # (헚; 헚; 헚; 헚; 헚; ) HANGUL SYLLABLE HEOBS +D5DB;D5DB;1112 1165 11BA;D5DB;1112 1165 11BA; # (헛; 헛; 헛; 헛; 헛; ) HANGUL SYLLABLE HEOS +D5DC;D5DC;1112 1165 11BB;D5DC;1112 1165 11BB; # (헜; 헜; 헜; 헜; 헜; ) HANGUL SYLLABLE HEOSS +D5DD;D5DD;1112 1165 11BC;D5DD;1112 1165 11BC; # (헝; 헝; 헝; 헝; 헝; ) HANGUL SYLLABLE HEONG +D5DE;D5DE;1112 1165 11BD;D5DE;1112 1165 11BD; # (헞; 헞; 헞; 헞; 헞; ) HANGUL SYLLABLE HEOJ +D5DF;D5DF;1112 1165 11BE;D5DF;1112 1165 11BE; # (헟; 헟; 헟; 헟; 헟; ) HANGUL SYLLABLE HEOC +D5E0;D5E0;1112 1165 11BF;D5E0;1112 1165 11BF; # (헠; 헠; 헠; 헠; 헠; ) HANGUL SYLLABLE HEOK +D5E1;D5E1;1112 1165 11C0;D5E1;1112 1165 11C0; # (헡; 헡; 헡; 헡; 헡; ) HANGUL SYLLABLE HEOT +D5E2;D5E2;1112 1165 11C1;D5E2;1112 1165 11C1; # (헢; 헢; 헢; 헢; 헢; ) HANGUL SYLLABLE HEOP +D5E3;D5E3;1112 1165 11C2;D5E3;1112 1165 11C2; # (헣; 헣; 헣; 헣; 헣; ) HANGUL SYLLABLE HEOH +D5E4;D5E4;1112 1166;D5E4;1112 1166; # (헤; 헤; 헤; 헤; 헤; ) HANGUL SYLLABLE HE +D5E5;D5E5;1112 1166 11A8;D5E5;1112 1166 11A8; # (헥; 헥; 헥; 헥; 헥; ) HANGUL SYLLABLE HEG +D5E6;D5E6;1112 1166 11A9;D5E6;1112 1166 11A9; # (헦; 헦; 헦; 헦; 헦; ) HANGUL SYLLABLE HEGG +D5E7;D5E7;1112 1166 11AA;D5E7;1112 1166 11AA; # (헧; 헧; 헧; 헧; 헧; ) HANGUL SYLLABLE HEGS +D5E8;D5E8;1112 1166 11AB;D5E8;1112 1166 11AB; # (헨; 헨; 헨; 헨; 헨; ) HANGUL SYLLABLE HEN +D5E9;D5E9;1112 1166 11AC;D5E9;1112 1166 11AC; # (헩; 헩; 헩; 헩; 헩; ) HANGUL SYLLABLE HENJ +D5EA;D5EA;1112 1166 11AD;D5EA;1112 1166 11AD; # (헪; 헪; 헪; 헪; 헪; ) HANGUL SYLLABLE HENH +D5EB;D5EB;1112 1166 11AE;D5EB;1112 1166 11AE; # (헫; 헫; 헫; 헫; 헫; ) HANGUL SYLLABLE HED +D5EC;D5EC;1112 1166 11AF;D5EC;1112 1166 11AF; # (헬; 헬; 헬; 헬; 헬; ) HANGUL SYLLABLE HEL +D5ED;D5ED;1112 1166 11B0;D5ED;1112 1166 11B0; # (헭; 헭; 헭; 헭; 헭; ) HANGUL SYLLABLE HELG +D5EE;D5EE;1112 1166 11B1;D5EE;1112 1166 11B1; # (헮; 헮; 헮; 헮; 헮; ) HANGUL SYLLABLE HELM +D5EF;D5EF;1112 1166 11B2;D5EF;1112 1166 11B2; # (헯; 헯; 헯; 헯; 헯; ) HANGUL SYLLABLE HELB +D5F0;D5F0;1112 1166 11B3;D5F0;1112 1166 11B3; # (헰; 헰; 헰; 헰; 헰; ) HANGUL SYLLABLE HELS +D5F1;D5F1;1112 1166 11B4;D5F1;1112 1166 11B4; # (헱; 헱; 헱; 헱; 헱; ) HANGUL SYLLABLE HELT +D5F2;D5F2;1112 1166 11B5;D5F2;1112 1166 11B5; # (헲; 헲; 헲; 헲; 헲; ) HANGUL SYLLABLE HELP +D5F3;D5F3;1112 1166 11B6;D5F3;1112 1166 11B6; # (헳; 헳; 헳; 헳; 헳; ) HANGUL SYLLABLE HELH +D5F4;D5F4;1112 1166 11B7;D5F4;1112 1166 11B7; # (헴; 헴; 헴; 헴; 헴; ) HANGUL SYLLABLE HEM +D5F5;D5F5;1112 1166 11B8;D5F5;1112 1166 11B8; # (헵; 헵; 헵; 헵; 헵; ) HANGUL SYLLABLE HEB +D5F6;D5F6;1112 1166 11B9;D5F6;1112 1166 11B9; # (헶; 헶; 헶; 헶; 헶; ) HANGUL SYLLABLE HEBS +D5F7;D5F7;1112 1166 11BA;D5F7;1112 1166 11BA; # (헷; 헷; 헷; 헷; 헷; ) HANGUL SYLLABLE HES +D5F8;D5F8;1112 1166 11BB;D5F8;1112 1166 11BB; # (헸; 헸; 헸; 헸; 헸; ) HANGUL SYLLABLE HESS +D5F9;D5F9;1112 1166 11BC;D5F9;1112 1166 11BC; # (헹; 헹; 헹; 헹; 헹; ) HANGUL SYLLABLE HENG +D5FA;D5FA;1112 1166 11BD;D5FA;1112 1166 11BD; # (헺; 헺; 헺; 헺; 헺; ) HANGUL SYLLABLE HEJ +D5FB;D5FB;1112 1166 11BE;D5FB;1112 1166 11BE; # (헻; 헻; 헻; 헻; 헻; ) HANGUL SYLLABLE HEC +D5FC;D5FC;1112 1166 11BF;D5FC;1112 1166 11BF; # (헼; 헼; 헼; 헼; 헼; ) HANGUL SYLLABLE HEK +D5FD;D5FD;1112 1166 11C0;D5FD;1112 1166 11C0; # (헽; 헽; 헽; 헽; 헽; ) HANGUL SYLLABLE HET +D5FE;D5FE;1112 1166 11C1;D5FE;1112 1166 11C1; # (헾; 헾; 헾; 헾; 헾; ) HANGUL SYLLABLE HEP +D5FF;D5FF;1112 1166 11C2;D5FF;1112 1166 11C2; # (헿; 헿; 헿; 헿; 헿; ) HANGUL SYLLABLE HEH +D600;D600;1112 1167;D600;1112 1167; # (혀; 혀; 혀; 혀; 혀; ) HANGUL SYLLABLE HYEO +D601;D601;1112 1167 11A8;D601;1112 1167 11A8; # (혁; 혁; 혁; 혁; 혁; ) HANGUL SYLLABLE HYEOG +D602;D602;1112 1167 11A9;D602;1112 1167 11A9; # (혂; 혂; 혂; 혂; 혂; ) HANGUL SYLLABLE HYEOGG +D603;D603;1112 1167 11AA;D603;1112 1167 11AA; # (혃; 혃; 혃; 혃; 혃; ) HANGUL SYLLABLE HYEOGS +D604;D604;1112 1167 11AB;D604;1112 1167 11AB; # (현; 현; 현; 현; 현; ) HANGUL SYLLABLE HYEON +D605;D605;1112 1167 11AC;D605;1112 1167 11AC; # (혅; 혅; 혅; 혅; 혅; ) HANGUL SYLLABLE HYEONJ +D606;D606;1112 1167 11AD;D606;1112 1167 11AD; # (혆; 혆; 혆; 혆; 혆; ) HANGUL SYLLABLE HYEONH +D607;D607;1112 1167 11AE;D607;1112 1167 11AE; # (혇; 혇; 혇; 혇; 혇; ) HANGUL SYLLABLE HYEOD +D608;D608;1112 1167 11AF;D608;1112 1167 11AF; # (혈; 혈; 혈; 혈; 혈; ) HANGUL SYLLABLE HYEOL +D609;D609;1112 1167 11B0;D609;1112 1167 11B0; # (혉; 혉; 혉; 혉; 혉; ) HANGUL SYLLABLE HYEOLG +D60A;D60A;1112 1167 11B1;D60A;1112 1167 11B1; # (혊; 혊; 혊; 혊; 혊; ) HANGUL SYLLABLE HYEOLM +D60B;D60B;1112 1167 11B2;D60B;1112 1167 11B2; # (혋; 혋; 혋; 혋; 혋; ) HANGUL SYLLABLE HYEOLB +D60C;D60C;1112 1167 11B3;D60C;1112 1167 11B3; # (혌; 혌; 혌; 혌; 혌; ) HANGUL SYLLABLE HYEOLS +D60D;D60D;1112 1167 11B4;D60D;1112 1167 11B4; # (혍; 혍; 혍; 혍; 혍; ) HANGUL SYLLABLE HYEOLT +D60E;D60E;1112 1167 11B5;D60E;1112 1167 11B5; # (혎; 혎; 혎; 혎; 혎; ) HANGUL SYLLABLE HYEOLP +D60F;D60F;1112 1167 11B6;D60F;1112 1167 11B6; # (혏; 혏; 혏; 혏; 혏; ) HANGUL SYLLABLE HYEOLH +D610;D610;1112 1167 11B7;D610;1112 1167 11B7; # (혐; 혐; 혐; 혐; 혐; ) HANGUL SYLLABLE HYEOM +D611;D611;1112 1167 11B8;D611;1112 1167 11B8; # (협; 협; 협; 협; 협; ) HANGUL SYLLABLE HYEOB +D612;D612;1112 1167 11B9;D612;1112 1167 11B9; # (혒; 혒; 혒; 혒; 혒; ) HANGUL SYLLABLE HYEOBS +D613;D613;1112 1167 11BA;D613;1112 1167 11BA; # (혓; 혓; 혓; 혓; 혓; ) HANGUL SYLLABLE HYEOS +D614;D614;1112 1167 11BB;D614;1112 1167 11BB; # (혔; 혔; 혔; 혔; 혔; ) HANGUL SYLLABLE HYEOSS +D615;D615;1112 1167 11BC;D615;1112 1167 11BC; # (형; 형; 형; 형; 형; ) HANGUL SYLLABLE HYEONG +D616;D616;1112 1167 11BD;D616;1112 1167 11BD; # (혖; 혖; 혖; 혖; 혖; ) HANGUL SYLLABLE HYEOJ +D617;D617;1112 1167 11BE;D617;1112 1167 11BE; # (혗; 혗; 혗; 혗; 혗; ) HANGUL SYLLABLE HYEOC +D618;D618;1112 1167 11BF;D618;1112 1167 11BF; # (혘; 혘; 혘; 혘; 혘; ) HANGUL SYLLABLE HYEOK +D619;D619;1112 1167 11C0;D619;1112 1167 11C0; # (혙; 혙; 혙; 혙; 혙; ) HANGUL SYLLABLE HYEOT +D61A;D61A;1112 1167 11C1;D61A;1112 1167 11C1; # (혚; 혚; 혚; 혚; 혚; ) HANGUL SYLLABLE HYEOP +D61B;D61B;1112 1167 11C2;D61B;1112 1167 11C2; # (혛; 혛; 혛; 혛; 혛; ) HANGUL SYLLABLE HYEOH +D61C;D61C;1112 1168;D61C;1112 1168; # (혜; 혜; 혜; 혜; 혜; ) HANGUL SYLLABLE HYE +D61D;D61D;1112 1168 11A8;D61D;1112 1168 11A8; # (혝; 혝; 혝; 혝; 혝; ) HANGUL SYLLABLE HYEG +D61E;D61E;1112 1168 11A9;D61E;1112 1168 11A9; # (혞; 혞; 혞; 혞; 혞; ) HANGUL SYLLABLE HYEGG +D61F;D61F;1112 1168 11AA;D61F;1112 1168 11AA; # (혟; 혟; 혟; 혟; 혟; ) HANGUL SYLLABLE HYEGS +D620;D620;1112 1168 11AB;D620;1112 1168 11AB; # (혠; 혠; 혠; 혠; 혠; ) HANGUL SYLLABLE HYEN +D621;D621;1112 1168 11AC;D621;1112 1168 11AC; # (혡; 혡; 혡; 혡; 혡; ) HANGUL SYLLABLE HYENJ +D622;D622;1112 1168 11AD;D622;1112 1168 11AD; # (혢; 혢; 혢; 혢; 혢; ) HANGUL SYLLABLE HYENH +D623;D623;1112 1168 11AE;D623;1112 1168 11AE; # (혣; 혣; 혣; 혣; 혣; ) HANGUL SYLLABLE HYED +D624;D624;1112 1168 11AF;D624;1112 1168 11AF; # (혤; 혤; 혤; 혤; 혤; ) HANGUL SYLLABLE HYEL +D625;D625;1112 1168 11B0;D625;1112 1168 11B0; # (혥; 혥; 혥; 혥; 혥; ) HANGUL SYLLABLE HYELG +D626;D626;1112 1168 11B1;D626;1112 1168 11B1; # (혦; 혦; 혦; 혦; 혦; ) HANGUL SYLLABLE HYELM +D627;D627;1112 1168 11B2;D627;1112 1168 11B2; # (혧; 혧; 혧; 혧; 혧; ) HANGUL SYLLABLE HYELB +D628;D628;1112 1168 11B3;D628;1112 1168 11B3; # (혨; 혨; 혨; 혨; 혨; ) HANGUL SYLLABLE HYELS +D629;D629;1112 1168 11B4;D629;1112 1168 11B4; # (혩; 혩; 혩; 혩; 혩; ) HANGUL SYLLABLE HYELT +D62A;D62A;1112 1168 11B5;D62A;1112 1168 11B5; # (혪; 혪; 혪; 혪; 혪; ) HANGUL SYLLABLE HYELP +D62B;D62B;1112 1168 11B6;D62B;1112 1168 11B6; # (혫; 혫; 혫; 혫; 혫; ) HANGUL SYLLABLE HYELH +D62C;D62C;1112 1168 11B7;D62C;1112 1168 11B7; # (혬; 혬; 혬; 혬; 혬; ) HANGUL SYLLABLE HYEM +D62D;D62D;1112 1168 11B8;D62D;1112 1168 11B8; # (혭; 혭; 혭; 혭; 혭; ) HANGUL SYLLABLE HYEB +D62E;D62E;1112 1168 11B9;D62E;1112 1168 11B9; # (혮; 혮; 혮; 혮; 혮; ) HANGUL SYLLABLE HYEBS +D62F;D62F;1112 1168 11BA;D62F;1112 1168 11BA; # (혯; 혯; 혯; 혯; 혯; ) HANGUL SYLLABLE HYES +D630;D630;1112 1168 11BB;D630;1112 1168 11BB; # (혰; 혰; 혰; 혰; 혰; ) HANGUL SYLLABLE HYESS +D631;D631;1112 1168 11BC;D631;1112 1168 11BC; # (혱; 혱; 혱; 혱; 혱; ) HANGUL SYLLABLE HYENG +D632;D632;1112 1168 11BD;D632;1112 1168 11BD; # (혲; 혲; 혲; 혲; 혲; ) HANGUL SYLLABLE HYEJ +D633;D633;1112 1168 11BE;D633;1112 1168 11BE; # (혳; 혳; 혳; 혳; 혳; ) HANGUL SYLLABLE HYEC +D634;D634;1112 1168 11BF;D634;1112 1168 11BF; # (혴; 혴; 혴; 혴; 혴; ) HANGUL SYLLABLE HYEK +D635;D635;1112 1168 11C0;D635;1112 1168 11C0; # (혵; 혵; 혵; 혵; 혵; ) HANGUL SYLLABLE HYET +D636;D636;1112 1168 11C1;D636;1112 1168 11C1; # (혶; 혶; 혶; 혶; 혶; ) HANGUL SYLLABLE HYEP +D637;D637;1112 1168 11C2;D637;1112 1168 11C2; # (혷; 혷; 혷; 혷; 혷; ) HANGUL SYLLABLE HYEH +D638;D638;1112 1169;D638;1112 1169; # (호; 호; 호; 호; 호; ) HANGUL SYLLABLE HO +D639;D639;1112 1169 11A8;D639;1112 1169 11A8; # (혹; 혹; 혹; 혹; 혹; ) HANGUL SYLLABLE HOG +D63A;D63A;1112 1169 11A9;D63A;1112 1169 11A9; # (혺; 혺; 혺; 혺; 혺; ) HANGUL SYLLABLE HOGG +D63B;D63B;1112 1169 11AA;D63B;1112 1169 11AA; # (혻; 혻; 혻; 혻; 혻; ) HANGUL SYLLABLE HOGS +D63C;D63C;1112 1169 11AB;D63C;1112 1169 11AB; # (혼; 혼; 혼; 혼; 혼; ) HANGUL SYLLABLE HON +D63D;D63D;1112 1169 11AC;D63D;1112 1169 11AC; # (혽; 혽; 혽; 혽; 혽; ) HANGUL SYLLABLE HONJ +D63E;D63E;1112 1169 11AD;D63E;1112 1169 11AD; # (혾; 혾; 혾; 혾; 혾; ) HANGUL SYLLABLE HONH +D63F;D63F;1112 1169 11AE;D63F;1112 1169 11AE; # (혿; 혿; 혿; 혿; 혿; ) HANGUL SYLLABLE HOD +D640;D640;1112 1169 11AF;D640;1112 1169 11AF; # (홀; 홀; 홀; 홀; 홀; ) HANGUL SYLLABLE HOL +D641;D641;1112 1169 11B0;D641;1112 1169 11B0; # (홁; 홁; 홁; 홁; 홁; ) HANGUL SYLLABLE HOLG +D642;D642;1112 1169 11B1;D642;1112 1169 11B1; # (홂; 홂; 홂; 홂; 홂; ) HANGUL SYLLABLE HOLM +D643;D643;1112 1169 11B2;D643;1112 1169 11B2; # (홃; 홃; 홃; 홃; 홃; ) HANGUL SYLLABLE HOLB +D644;D644;1112 1169 11B3;D644;1112 1169 11B3; # (홄; 홄; 홄; 홄; 홄; ) HANGUL SYLLABLE HOLS +D645;D645;1112 1169 11B4;D645;1112 1169 11B4; # (홅; 홅; 홅; 홅; 홅; ) HANGUL SYLLABLE HOLT +D646;D646;1112 1169 11B5;D646;1112 1169 11B5; # (홆; 홆; 홆; 홆; 홆; ) HANGUL SYLLABLE HOLP +D647;D647;1112 1169 11B6;D647;1112 1169 11B6; # (홇; 홇; 홇; 홇; 홇; ) HANGUL SYLLABLE HOLH +D648;D648;1112 1169 11B7;D648;1112 1169 11B7; # (홈; 홈; 홈; 홈; 홈; ) HANGUL SYLLABLE HOM +D649;D649;1112 1169 11B8;D649;1112 1169 11B8; # (홉; 홉; 홉; 홉; 홉; ) HANGUL SYLLABLE HOB +D64A;D64A;1112 1169 11B9;D64A;1112 1169 11B9; # (홊; 홊; 홊; 홊; 홊; ) HANGUL SYLLABLE HOBS +D64B;D64B;1112 1169 11BA;D64B;1112 1169 11BA; # (홋; 홋; 홋; 홋; 홋; ) HANGUL SYLLABLE HOS +D64C;D64C;1112 1169 11BB;D64C;1112 1169 11BB; # (홌; 홌; 홌; 홌; 홌; ) HANGUL SYLLABLE HOSS +D64D;D64D;1112 1169 11BC;D64D;1112 1169 11BC; # (홍; 홍; 홍; 홍; 홍; ) HANGUL SYLLABLE HONG +D64E;D64E;1112 1169 11BD;D64E;1112 1169 11BD; # (홎; 홎; 홎; 홎; 홎; ) HANGUL SYLLABLE HOJ +D64F;D64F;1112 1169 11BE;D64F;1112 1169 11BE; # (홏; 홏; 홏; 홏; 홏; ) HANGUL SYLLABLE HOC +D650;D650;1112 1169 11BF;D650;1112 1169 11BF; # (홐; 홐; 홐; 홐; 홐; ) HANGUL SYLLABLE HOK +D651;D651;1112 1169 11C0;D651;1112 1169 11C0; # (홑; 홑; 홑; 홑; 홑; ) HANGUL SYLLABLE HOT +D652;D652;1112 1169 11C1;D652;1112 1169 11C1; # (홒; 홒; 홒; 홒; 홒; ) HANGUL SYLLABLE HOP +D653;D653;1112 1169 11C2;D653;1112 1169 11C2; # (홓; 홓; 홓; 홓; 홓; ) HANGUL SYLLABLE HOH +D654;D654;1112 116A;D654;1112 116A; # (화; 화; 화; 화; 화; ) HANGUL SYLLABLE HWA +D655;D655;1112 116A 11A8;D655;1112 116A 11A8; # (확; 확; 확; 확; 확; ) HANGUL SYLLABLE HWAG +D656;D656;1112 116A 11A9;D656;1112 116A 11A9; # (홖; 홖; 홖; 홖; 홖; ) HANGUL SYLLABLE HWAGG +D657;D657;1112 116A 11AA;D657;1112 116A 11AA; # (홗; 홗; 홗; 홗; 홗; ) HANGUL SYLLABLE HWAGS +D658;D658;1112 116A 11AB;D658;1112 116A 11AB; # (환; 환; 환; 환; 환; ) HANGUL SYLLABLE HWAN +D659;D659;1112 116A 11AC;D659;1112 116A 11AC; # (홙; 홙; 홙; 홙; 홙; ) HANGUL SYLLABLE HWANJ +D65A;D65A;1112 116A 11AD;D65A;1112 116A 11AD; # (홚; 홚; 홚; 홚; 홚; ) HANGUL SYLLABLE HWANH +D65B;D65B;1112 116A 11AE;D65B;1112 116A 11AE; # (홛; 홛; 홛; 홛; 홛; ) HANGUL SYLLABLE HWAD +D65C;D65C;1112 116A 11AF;D65C;1112 116A 11AF; # (활; 활; 활; 활; 활; ) HANGUL SYLLABLE HWAL +D65D;D65D;1112 116A 11B0;D65D;1112 116A 11B0; # (홝; 홝; 홝; 홝; 홝; ) HANGUL SYLLABLE HWALG +D65E;D65E;1112 116A 11B1;D65E;1112 116A 11B1; # (홞; 홞; 홞; 홞; 홞; ) HANGUL SYLLABLE HWALM +D65F;D65F;1112 116A 11B2;D65F;1112 116A 11B2; # (홟; 홟; 홟; 홟; 홟; ) HANGUL SYLLABLE HWALB +D660;D660;1112 116A 11B3;D660;1112 116A 11B3; # (홠; 홠; 홠; 홠; 홠; ) HANGUL SYLLABLE HWALS +D661;D661;1112 116A 11B4;D661;1112 116A 11B4; # (홡; 홡; 홡; 홡; 홡; ) HANGUL SYLLABLE HWALT +D662;D662;1112 116A 11B5;D662;1112 116A 11B5; # (홢; 홢; 홢; 홢; 홢; ) HANGUL SYLLABLE HWALP +D663;D663;1112 116A 11B6;D663;1112 116A 11B6; # (홣; 홣; 홣; 홣; 홣; ) HANGUL SYLLABLE HWALH +D664;D664;1112 116A 11B7;D664;1112 116A 11B7; # (홤; 홤; 홤; 홤; 홤; ) HANGUL SYLLABLE HWAM +D665;D665;1112 116A 11B8;D665;1112 116A 11B8; # (홥; 홥; 홥; 홥; 홥; ) HANGUL SYLLABLE HWAB +D666;D666;1112 116A 11B9;D666;1112 116A 11B9; # (홦; 홦; 홦; 홦; 홦; ) HANGUL SYLLABLE HWABS +D667;D667;1112 116A 11BA;D667;1112 116A 11BA; # (홧; 홧; 홧; 홧; 홧; ) HANGUL SYLLABLE HWAS +D668;D668;1112 116A 11BB;D668;1112 116A 11BB; # (홨; 홨; 홨; 홨; 홨; ) HANGUL SYLLABLE HWASS +D669;D669;1112 116A 11BC;D669;1112 116A 11BC; # (황; 황; 황; 황; 황; ) HANGUL SYLLABLE HWANG +D66A;D66A;1112 116A 11BD;D66A;1112 116A 11BD; # (홪; 홪; 홪; 홪; 홪; ) HANGUL SYLLABLE HWAJ +D66B;D66B;1112 116A 11BE;D66B;1112 116A 11BE; # (홫; 홫; 홫; 홫; 홫; ) HANGUL SYLLABLE HWAC +D66C;D66C;1112 116A 11BF;D66C;1112 116A 11BF; # (홬; 홬; 홬; 홬; 홬; ) HANGUL SYLLABLE HWAK +D66D;D66D;1112 116A 11C0;D66D;1112 116A 11C0; # (홭; 홭; 홭; 홭; 홭; ) HANGUL SYLLABLE HWAT +D66E;D66E;1112 116A 11C1;D66E;1112 116A 11C1; # (홮; 홮; 홮; 홮; 홮; ) HANGUL SYLLABLE HWAP +D66F;D66F;1112 116A 11C2;D66F;1112 116A 11C2; # (홯; 홯; 홯; 홯; 홯; ) HANGUL SYLLABLE HWAH +D670;D670;1112 116B;D670;1112 116B; # (홰; 홰; 홰; 홰; 홰; ) HANGUL SYLLABLE HWAE +D671;D671;1112 116B 11A8;D671;1112 116B 11A8; # (홱; 홱; 홱; 홱; 홱; ) HANGUL SYLLABLE HWAEG +D672;D672;1112 116B 11A9;D672;1112 116B 11A9; # (홲; 홲; 홲; 홲; 홲; ) HANGUL SYLLABLE HWAEGG +D673;D673;1112 116B 11AA;D673;1112 116B 11AA; # (홳; 홳; 홳; 홳; 홳; ) HANGUL SYLLABLE HWAEGS +D674;D674;1112 116B 11AB;D674;1112 116B 11AB; # (홴; 홴; 홴; 홴; 홴; ) HANGUL SYLLABLE HWAEN +D675;D675;1112 116B 11AC;D675;1112 116B 11AC; # (홵; 홵; 홵; 홵; 홵; ) HANGUL SYLLABLE HWAENJ +D676;D676;1112 116B 11AD;D676;1112 116B 11AD; # (홶; 홶; 홶; 홶; 홶; ) HANGUL SYLLABLE HWAENH +D677;D677;1112 116B 11AE;D677;1112 116B 11AE; # (홷; 홷; 홷; 홷; 홷; ) HANGUL SYLLABLE HWAED +D678;D678;1112 116B 11AF;D678;1112 116B 11AF; # (홸; 홸; 홸; 홸; 홸; ) HANGUL SYLLABLE HWAEL +D679;D679;1112 116B 11B0;D679;1112 116B 11B0; # (홹; 홹; 홹; 홹; 홹; ) HANGUL SYLLABLE HWAELG +D67A;D67A;1112 116B 11B1;D67A;1112 116B 11B1; # (홺; 홺; 홺; 홺; 홺; ) HANGUL SYLLABLE HWAELM +D67B;D67B;1112 116B 11B2;D67B;1112 116B 11B2; # (홻; 홻; 홻; 홻; 홻; ) HANGUL SYLLABLE HWAELB +D67C;D67C;1112 116B 11B3;D67C;1112 116B 11B3; # (홼; 홼; 홼; 홼; 홼; ) HANGUL SYLLABLE HWAELS +D67D;D67D;1112 116B 11B4;D67D;1112 116B 11B4; # (홽; 홽; 홽; 홽; 홽; ) HANGUL SYLLABLE HWAELT +D67E;D67E;1112 116B 11B5;D67E;1112 116B 11B5; # (홾; 홾; 홾; 홾; 홾; ) HANGUL SYLLABLE HWAELP +D67F;D67F;1112 116B 11B6;D67F;1112 116B 11B6; # (홿; 홿; 홿; 홿; 홿; ) HANGUL SYLLABLE HWAELH +D680;D680;1112 116B 11B7;D680;1112 116B 11B7; # (횀; 횀; 횀; 횀; 횀; ) HANGUL SYLLABLE HWAEM +D681;D681;1112 116B 11B8;D681;1112 116B 11B8; # (횁; 횁; 횁; 횁; 횁; ) HANGUL SYLLABLE HWAEB +D682;D682;1112 116B 11B9;D682;1112 116B 11B9; # (횂; 횂; 횂; 횂; 횂; ) HANGUL SYLLABLE HWAEBS +D683;D683;1112 116B 11BA;D683;1112 116B 11BA; # (횃; 횃; 횃; 횃; 횃; ) HANGUL SYLLABLE HWAES +D684;D684;1112 116B 11BB;D684;1112 116B 11BB; # (횄; 횄; 횄; 횄; 횄; ) HANGUL SYLLABLE HWAESS +D685;D685;1112 116B 11BC;D685;1112 116B 11BC; # (횅; 횅; 횅; 횅; 횅; ) HANGUL SYLLABLE HWAENG +D686;D686;1112 116B 11BD;D686;1112 116B 11BD; # (횆; 횆; 횆; 횆; 횆; ) HANGUL SYLLABLE HWAEJ +D687;D687;1112 116B 11BE;D687;1112 116B 11BE; # (횇; 횇; 횇; 횇; 횇; ) HANGUL SYLLABLE HWAEC +D688;D688;1112 116B 11BF;D688;1112 116B 11BF; # (횈; 횈; 횈; 횈; 횈; ) HANGUL SYLLABLE HWAEK +D689;D689;1112 116B 11C0;D689;1112 116B 11C0; # (횉; 횉; 횉; 횉; 횉; ) HANGUL SYLLABLE HWAET +D68A;D68A;1112 116B 11C1;D68A;1112 116B 11C1; # (횊; 횊; 횊; 횊; 횊; ) HANGUL SYLLABLE HWAEP +D68B;D68B;1112 116B 11C2;D68B;1112 116B 11C2; # (횋; 횋; 횋; 횋; 횋; ) HANGUL SYLLABLE HWAEH +D68C;D68C;1112 116C;D68C;1112 116C; # (회; 회; 회; 회; 회; ) HANGUL SYLLABLE HOE +D68D;D68D;1112 116C 11A8;D68D;1112 116C 11A8; # (획; 획; 획; 획; 획; ) HANGUL SYLLABLE HOEG +D68E;D68E;1112 116C 11A9;D68E;1112 116C 11A9; # (횎; 횎; 횎; 횎; 횎; ) HANGUL SYLLABLE HOEGG +D68F;D68F;1112 116C 11AA;D68F;1112 116C 11AA; # (횏; 횏; 횏; 횏; 횏; ) HANGUL SYLLABLE HOEGS +D690;D690;1112 116C 11AB;D690;1112 116C 11AB; # (횐; 횐; 횐; 횐; 횐; ) HANGUL SYLLABLE HOEN +D691;D691;1112 116C 11AC;D691;1112 116C 11AC; # (횑; 횑; 횑; 횑; 횑; ) HANGUL SYLLABLE HOENJ +D692;D692;1112 116C 11AD;D692;1112 116C 11AD; # (횒; 횒; 횒; 횒; 횒; ) HANGUL SYLLABLE HOENH +D693;D693;1112 116C 11AE;D693;1112 116C 11AE; # (횓; 횓; 횓; 횓; 횓; ) HANGUL SYLLABLE HOED +D694;D694;1112 116C 11AF;D694;1112 116C 11AF; # (횔; 횔; 횔; 횔; 횔; ) HANGUL SYLLABLE HOEL +D695;D695;1112 116C 11B0;D695;1112 116C 11B0; # (횕; 횕; 횕; 횕; 횕; ) HANGUL SYLLABLE HOELG +D696;D696;1112 116C 11B1;D696;1112 116C 11B1; # (횖; 횖; 횖; 횖; 횖; ) HANGUL SYLLABLE HOELM +D697;D697;1112 116C 11B2;D697;1112 116C 11B2; # (횗; 횗; 횗; 횗; 횗; ) HANGUL SYLLABLE HOELB +D698;D698;1112 116C 11B3;D698;1112 116C 11B3; # (횘; 횘; 횘; 횘; 횘; ) HANGUL SYLLABLE HOELS +D699;D699;1112 116C 11B4;D699;1112 116C 11B4; # (횙; 횙; 횙; 횙; 횙; ) HANGUL SYLLABLE HOELT +D69A;D69A;1112 116C 11B5;D69A;1112 116C 11B5; # (횚; 횚; 횚; 횚; 횚; ) HANGUL SYLLABLE HOELP +D69B;D69B;1112 116C 11B6;D69B;1112 116C 11B6; # (횛; 횛; 횛; 횛; 횛; ) HANGUL SYLLABLE HOELH +D69C;D69C;1112 116C 11B7;D69C;1112 116C 11B7; # (횜; 횜; 횜; 횜; 횜; ) HANGUL SYLLABLE HOEM +D69D;D69D;1112 116C 11B8;D69D;1112 116C 11B8; # (횝; 횝; 횝; 횝; 횝; ) HANGUL SYLLABLE HOEB +D69E;D69E;1112 116C 11B9;D69E;1112 116C 11B9; # (횞; 횞; 횞; 횞; 횞; ) HANGUL SYLLABLE HOEBS +D69F;D69F;1112 116C 11BA;D69F;1112 116C 11BA; # (횟; 횟; 횟; 횟; 횟; ) HANGUL SYLLABLE HOES +D6A0;D6A0;1112 116C 11BB;D6A0;1112 116C 11BB; # (횠; 횠; 횠; 횠; 횠; ) HANGUL SYLLABLE HOESS +D6A1;D6A1;1112 116C 11BC;D6A1;1112 116C 11BC; # (횡; 횡; 횡; 횡; 횡; ) HANGUL SYLLABLE HOENG +D6A2;D6A2;1112 116C 11BD;D6A2;1112 116C 11BD; # (횢; 횢; 횢; 횢; 횢; ) HANGUL SYLLABLE HOEJ +D6A3;D6A3;1112 116C 11BE;D6A3;1112 116C 11BE; # (횣; 횣; 횣; 횣; 횣; ) HANGUL SYLLABLE HOEC +D6A4;D6A4;1112 116C 11BF;D6A4;1112 116C 11BF; # (횤; 횤; 횤; 횤; 횤; ) HANGUL SYLLABLE HOEK +D6A5;D6A5;1112 116C 11C0;D6A5;1112 116C 11C0; # (횥; 횥; 횥; 횥; 횥; ) HANGUL SYLLABLE HOET +D6A6;D6A6;1112 116C 11C1;D6A6;1112 116C 11C1; # (횦; 횦; 횦; 횦; 횦; ) HANGUL SYLLABLE HOEP +D6A7;D6A7;1112 116C 11C2;D6A7;1112 116C 11C2; # (횧; 횧; 횧; 횧; 횧; ) HANGUL SYLLABLE HOEH +D6A8;D6A8;1112 116D;D6A8;1112 116D; # (효; 효; 효; 효; 효; ) HANGUL SYLLABLE HYO +D6A9;D6A9;1112 116D 11A8;D6A9;1112 116D 11A8; # (횩; 횩; 횩; 횩; 횩; ) HANGUL SYLLABLE HYOG +D6AA;D6AA;1112 116D 11A9;D6AA;1112 116D 11A9; # (횪; 횪; 횪; 횪; 횪; ) HANGUL SYLLABLE HYOGG +D6AB;D6AB;1112 116D 11AA;D6AB;1112 116D 11AA; # (횫; 횫; 횫; 횫; 횫; ) HANGUL SYLLABLE HYOGS +D6AC;D6AC;1112 116D 11AB;D6AC;1112 116D 11AB; # (횬; 횬; 횬; 횬; 횬; ) HANGUL SYLLABLE HYON +D6AD;D6AD;1112 116D 11AC;D6AD;1112 116D 11AC; # (횭; 횭; 횭; 횭; 횭; ) HANGUL SYLLABLE HYONJ +D6AE;D6AE;1112 116D 11AD;D6AE;1112 116D 11AD; # (횮; 횮; 횮; 횮; 횮; ) HANGUL SYLLABLE HYONH +D6AF;D6AF;1112 116D 11AE;D6AF;1112 116D 11AE; # (횯; 횯; 횯; 횯; 횯; ) HANGUL SYLLABLE HYOD +D6B0;D6B0;1112 116D 11AF;D6B0;1112 116D 11AF; # (횰; 횰; 횰; 횰; 횰; ) HANGUL SYLLABLE HYOL +D6B1;D6B1;1112 116D 11B0;D6B1;1112 116D 11B0; # (횱; 횱; 횱; 횱; 횱; ) HANGUL SYLLABLE HYOLG +D6B2;D6B2;1112 116D 11B1;D6B2;1112 116D 11B1; # (횲; 횲; 횲; 횲; 횲; ) HANGUL SYLLABLE HYOLM +D6B3;D6B3;1112 116D 11B2;D6B3;1112 116D 11B2; # (횳; 횳; 횳; 횳; 횳; ) HANGUL SYLLABLE HYOLB +D6B4;D6B4;1112 116D 11B3;D6B4;1112 116D 11B3; # (횴; 횴; 횴; 횴; 횴; ) HANGUL SYLLABLE HYOLS +D6B5;D6B5;1112 116D 11B4;D6B5;1112 116D 11B4; # (횵; 횵; 횵; 횵; 횵; ) HANGUL SYLLABLE HYOLT +D6B6;D6B6;1112 116D 11B5;D6B6;1112 116D 11B5; # (횶; 횶; 횶; 횶; 횶; ) HANGUL SYLLABLE HYOLP +D6B7;D6B7;1112 116D 11B6;D6B7;1112 116D 11B6; # (횷; 횷; 횷; 횷; 횷; ) HANGUL SYLLABLE HYOLH +D6B8;D6B8;1112 116D 11B7;D6B8;1112 116D 11B7; # (횸; 횸; 횸; 횸; 횸; ) HANGUL SYLLABLE HYOM +D6B9;D6B9;1112 116D 11B8;D6B9;1112 116D 11B8; # (횹; 횹; 횹; 횹; 횹; ) HANGUL SYLLABLE HYOB +D6BA;D6BA;1112 116D 11B9;D6BA;1112 116D 11B9; # (횺; 횺; 횺; 횺; 횺; ) HANGUL SYLLABLE HYOBS +D6BB;D6BB;1112 116D 11BA;D6BB;1112 116D 11BA; # (횻; 횻; 횻; 횻; 횻; ) HANGUL SYLLABLE HYOS +D6BC;D6BC;1112 116D 11BB;D6BC;1112 116D 11BB; # (횼; 횼; 횼; 횼; 횼; ) HANGUL SYLLABLE HYOSS +D6BD;D6BD;1112 116D 11BC;D6BD;1112 116D 11BC; # (횽; 횽; 횽; 횽; 횽; ) HANGUL SYLLABLE HYONG +D6BE;D6BE;1112 116D 11BD;D6BE;1112 116D 11BD; # (횾; 횾; 횾; 횾; 횾; ) HANGUL SYLLABLE HYOJ +D6BF;D6BF;1112 116D 11BE;D6BF;1112 116D 11BE; # (횿; 횿; 횿; 횿; 횿; ) HANGUL SYLLABLE HYOC +D6C0;D6C0;1112 116D 11BF;D6C0;1112 116D 11BF; # (훀; 훀; 훀; 훀; 훀; ) HANGUL SYLLABLE HYOK +D6C1;D6C1;1112 116D 11C0;D6C1;1112 116D 11C0; # (훁; 훁; 훁; 훁; 훁; ) HANGUL SYLLABLE HYOT +D6C2;D6C2;1112 116D 11C1;D6C2;1112 116D 11C1; # (훂; 훂; 훂; 훂; 훂; ) HANGUL SYLLABLE HYOP +D6C3;D6C3;1112 116D 11C2;D6C3;1112 116D 11C2; # (훃; 훃; 훃; 훃; 훃; ) HANGUL SYLLABLE HYOH +D6C4;D6C4;1112 116E;D6C4;1112 116E; # (후; 후; 후; 후; 후; ) HANGUL SYLLABLE HU +D6C5;D6C5;1112 116E 11A8;D6C5;1112 116E 11A8; # (훅; 훅; 훅; 훅; 훅; ) HANGUL SYLLABLE HUG +D6C6;D6C6;1112 116E 11A9;D6C6;1112 116E 11A9; # (훆; 훆; 훆; 훆; 훆; ) HANGUL SYLLABLE HUGG +D6C7;D6C7;1112 116E 11AA;D6C7;1112 116E 11AA; # (훇; 훇; 훇; 훇; 훇; ) HANGUL SYLLABLE HUGS +D6C8;D6C8;1112 116E 11AB;D6C8;1112 116E 11AB; # (훈; 훈; 훈; 훈; 훈; ) HANGUL SYLLABLE HUN +D6C9;D6C9;1112 116E 11AC;D6C9;1112 116E 11AC; # (훉; 훉; 훉; 훉; 훉; ) HANGUL SYLLABLE HUNJ +D6CA;D6CA;1112 116E 11AD;D6CA;1112 116E 11AD; # (훊; 훊; 훊; 훊; 훊; ) HANGUL SYLLABLE HUNH +D6CB;D6CB;1112 116E 11AE;D6CB;1112 116E 11AE; # (훋; 훋; 훋; 훋; 훋; ) HANGUL SYLLABLE HUD +D6CC;D6CC;1112 116E 11AF;D6CC;1112 116E 11AF; # (훌; 훌; 훌; 훌; 훌; ) HANGUL SYLLABLE HUL +D6CD;D6CD;1112 116E 11B0;D6CD;1112 116E 11B0; # (훍; 훍; 훍; 훍; 훍; ) HANGUL SYLLABLE HULG +D6CE;D6CE;1112 116E 11B1;D6CE;1112 116E 11B1; # (훎; 훎; 훎; 훎; 훎; ) HANGUL SYLLABLE HULM +D6CF;D6CF;1112 116E 11B2;D6CF;1112 116E 11B2; # (훏; 훏; 훏; 훏; 훏; ) HANGUL SYLLABLE HULB +D6D0;D6D0;1112 116E 11B3;D6D0;1112 116E 11B3; # (훐; 훐; 훐; 훐; 훐; ) HANGUL SYLLABLE HULS +D6D1;D6D1;1112 116E 11B4;D6D1;1112 116E 11B4; # (훑; 훑; 훑; 훑; 훑; ) HANGUL SYLLABLE HULT +D6D2;D6D2;1112 116E 11B5;D6D2;1112 116E 11B5; # (훒; 훒; 훒; 훒; 훒; ) HANGUL SYLLABLE HULP +D6D3;D6D3;1112 116E 11B6;D6D3;1112 116E 11B6; # (훓; 훓; 훓; 훓; 훓; ) HANGUL SYLLABLE HULH +D6D4;D6D4;1112 116E 11B7;D6D4;1112 116E 11B7; # (훔; 훔; 훔; 훔; 훔; ) HANGUL SYLLABLE HUM +D6D5;D6D5;1112 116E 11B8;D6D5;1112 116E 11B8; # (훕; 훕; 훕; 훕; 훕; ) HANGUL SYLLABLE HUB +D6D6;D6D6;1112 116E 11B9;D6D6;1112 116E 11B9; # (훖; 훖; 훖; 훖; 훖; ) HANGUL SYLLABLE HUBS +D6D7;D6D7;1112 116E 11BA;D6D7;1112 116E 11BA; # (훗; 훗; 훗; 훗; 훗; ) HANGUL SYLLABLE HUS +D6D8;D6D8;1112 116E 11BB;D6D8;1112 116E 11BB; # (훘; 훘; 훘; 훘; 훘; ) HANGUL SYLLABLE HUSS +D6D9;D6D9;1112 116E 11BC;D6D9;1112 116E 11BC; # (훙; 훙; 훙; 훙; 훙; ) HANGUL SYLLABLE HUNG +D6DA;D6DA;1112 116E 11BD;D6DA;1112 116E 11BD; # (훚; 훚; 훚; 훚; 훚; ) HANGUL SYLLABLE HUJ +D6DB;D6DB;1112 116E 11BE;D6DB;1112 116E 11BE; # (훛; 훛; 훛; 훛; 훛; ) HANGUL SYLLABLE HUC +D6DC;D6DC;1112 116E 11BF;D6DC;1112 116E 11BF; # (훜; 훜; 훜; 훜; 훜; ) HANGUL SYLLABLE HUK +D6DD;D6DD;1112 116E 11C0;D6DD;1112 116E 11C0; # (훝; 훝; 훝; 훝; 훝; ) HANGUL SYLLABLE HUT +D6DE;D6DE;1112 116E 11C1;D6DE;1112 116E 11C1; # (훞; 훞; 훞; 훞; 훞; ) HANGUL SYLLABLE HUP +D6DF;D6DF;1112 116E 11C2;D6DF;1112 116E 11C2; # (훟; 훟; 훟; 훟; 훟; ) HANGUL SYLLABLE HUH +D6E0;D6E0;1112 116F;D6E0;1112 116F; # (훠; 훠; 훠; 훠; 훠; ) HANGUL SYLLABLE HWEO +D6E1;D6E1;1112 116F 11A8;D6E1;1112 116F 11A8; # (훡; 훡; 훡; 훡; 훡; ) HANGUL SYLLABLE HWEOG +D6E2;D6E2;1112 116F 11A9;D6E2;1112 116F 11A9; # (훢; 훢; 훢; 훢; 훢; ) HANGUL SYLLABLE HWEOGG +D6E3;D6E3;1112 116F 11AA;D6E3;1112 116F 11AA; # (훣; 훣; 훣; 훣; 훣; ) HANGUL SYLLABLE HWEOGS +D6E4;D6E4;1112 116F 11AB;D6E4;1112 116F 11AB; # (훤; 훤; 훤; 훤; 훤; ) HANGUL SYLLABLE HWEON +D6E5;D6E5;1112 116F 11AC;D6E5;1112 116F 11AC; # (훥; 훥; 훥; 훥; 훥; ) HANGUL SYLLABLE HWEONJ +D6E6;D6E6;1112 116F 11AD;D6E6;1112 116F 11AD; # (훦; 훦; 훦; 훦; 훦; ) HANGUL SYLLABLE HWEONH +D6E7;D6E7;1112 116F 11AE;D6E7;1112 116F 11AE; # (훧; 훧; 훧; 훧; 훧; ) HANGUL SYLLABLE HWEOD +D6E8;D6E8;1112 116F 11AF;D6E8;1112 116F 11AF; # (훨; 훨; 훨; 훨; 훨; ) HANGUL SYLLABLE HWEOL +D6E9;D6E9;1112 116F 11B0;D6E9;1112 116F 11B0; # (훩; 훩; 훩; 훩; 훩; ) HANGUL SYLLABLE HWEOLG +D6EA;D6EA;1112 116F 11B1;D6EA;1112 116F 11B1; # (훪; 훪; 훪; 훪; 훪; ) HANGUL SYLLABLE HWEOLM +D6EB;D6EB;1112 116F 11B2;D6EB;1112 116F 11B2; # (훫; 훫; 훫; 훫; 훫; ) HANGUL SYLLABLE HWEOLB +D6EC;D6EC;1112 116F 11B3;D6EC;1112 116F 11B3; # (훬; 훬; 훬; 훬; 훬; ) HANGUL SYLLABLE HWEOLS +D6ED;D6ED;1112 116F 11B4;D6ED;1112 116F 11B4; # (훭; 훭; 훭; 훭; 훭; ) HANGUL SYLLABLE HWEOLT +D6EE;D6EE;1112 116F 11B5;D6EE;1112 116F 11B5; # (훮; 훮; 훮; 훮; 훮; ) HANGUL SYLLABLE HWEOLP +D6EF;D6EF;1112 116F 11B6;D6EF;1112 116F 11B6; # (훯; 훯; 훯; 훯; 훯; ) HANGUL SYLLABLE HWEOLH +D6F0;D6F0;1112 116F 11B7;D6F0;1112 116F 11B7; # (훰; 훰; 훰; 훰; 훰; ) HANGUL SYLLABLE HWEOM +D6F1;D6F1;1112 116F 11B8;D6F1;1112 116F 11B8; # (훱; 훱; 훱; 훱; 훱; ) HANGUL SYLLABLE HWEOB +D6F2;D6F2;1112 116F 11B9;D6F2;1112 116F 11B9; # (훲; 훲; 훲; 훲; 훲; ) HANGUL SYLLABLE HWEOBS +D6F3;D6F3;1112 116F 11BA;D6F3;1112 116F 11BA; # (훳; 훳; 훳; 훳; 훳; ) HANGUL SYLLABLE HWEOS +D6F4;D6F4;1112 116F 11BB;D6F4;1112 116F 11BB; # (훴; 훴; 훴; 훴; 훴; ) HANGUL SYLLABLE HWEOSS +D6F5;D6F5;1112 116F 11BC;D6F5;1112 116F 11BC; # (훵; 훵; 훵; 훵; 훵; ) HANGUL SYLLABLE HWEONG +D6F6;D6F6;1112 116F 11BD;D6F6;1112 116F 11BD; # (훶; 훶; 훶; 훶; 훶; ) HANGUL SYLLABLE HWEOJ +D6F7;D6F7;1112 116F 11BE;D6F7;1112 116F 11BE; # (훷; 훷; 훷; 훷; 훷; ) HANGUL SYLLABLE HWEOC +D6F8;D6F8;1112 116F 11BF;D6F8;1112 116F 11BF; # (훸; 훸; 훸; 훸; 훸; ) HANGUL SYLLABLE HWEOK +D6F9;D6F9;1112 116F 11C0;D6F9;1112 116F 11C0; # (훹; 훹; 훹; 훹; 훹; ) HANGUL SYLLABLE HWEOT +D6FA;D6FA;1112 116F 11C1;D6FA;1112 116F 11C1; # (훺; 훺; 훺; 훺; 훺; ) HANGUL SYLLABLE HWEOP +D6FB;D6FB;1112 116F 11C2;D6FB;1112 116F 11C2; # (훻; 훻; 훻; 훻; 훻; ) HANGUL SYLLABLE HWEOH +D6FC;D6FC;1112 1170;D6FC;1112 1170; # (훼; 훼; 훼; 훼; 훼; ) HANGUL SYLLABLE HWE +D6FD;D6FD;1112 1170 11A8;D6FD;1112 1170 11A8; # (훽; 훽; 훽; 훽; 훽; ) HANGUL SYLLABLE HWEG +D6FE;D6FE;1112 1170 11A9;D6FE;1112 1170 11A9; # (훾; 훾; 훾; 훾; 훾; ) HANGUL SYLLABLE HWEGG +D6FF;D6FF;1112 1170 11AA;D6FF;1112 1170 11AA; # (훿; 훿; 훿; 훿; 훿; ) HANGUL SYLLABLE HWEGS +D700;D700;1112 1170 11AB;D700;1112 1170 11AB; # (휀; 휀; 휀; 휀; 휀; ) HANGUL SYLLABLE HWEN +D701;D701;1112 1170 11AC;D701;1112 1170 11AC; # (휁; 휁; 휁; 휁; 휁; ) HANGUL SYLLABLE HWENJ +D702;D702;1112 1170 11AD;D702;1112 1170 11AD; # (휂; 휂; 휂; 휂; 휂; ) HANGUL SYLLABLE HWENH +D703;D703;1112 1170 11AE;D703;1112 1170 11AE; # (휃; 휃; 휃; 휃; 휃; ) HANGUL SYLLABLE HWED +D704;D704;1112 1170 11AF;D704;1112 1170 11AF; # (휄; 휄; 휄; 휄; 휄; ) HANGUL SYLLABLE HWEL +D705;D705;1112 1170 11B0;D705;1112 1170 11B0; # (휅; 휅; 휅; 휅; 휅; ) HANGUL SYLLABLE HWELG +D706;D706;1112 1170 11B1;D706;1112 1170 11B1; # (휆; 휆; 휆; 휆; 휆; ) HANGUL SYLLABLE HWELM +D707;D707;1112 1170 11B2;D707;1112 1170 11B2; # (휇; 휇; 휇; 휇; 휇; ) HANGUL SYLLABLE HWELB +D708;D708;1112 1170 11B3;D708;1112 1170 11B3; # (휈; 휈; 휈; 휈; 휈; ) HANGUL SYLLABLE HWELS +D709;D709;1112 1170 11B4;D709;1112 1170 11B4; # (휉; 휉; 휉; 휉; 휉; ) HANGUL SYLLABLE HWELT +D70A;D70A;1112 1170 11B5;D70A;1112 1170 11B5; # (휊; 휊; 휊; 휊; 휊; ) HANGUL SYLLABLE HWELP +D70B;D70B;1112 1170 11B6;D70B;1112 1170 11B6; # (휋; 휋; 휋; 휋; 휋; ) HANGUL SYLLABLE HWELH +D70C;D70C;1112 1170 11B7;D70C;1112 1170 11B7; # (휌; 휌; 휌; 휌; 휌; ) HANGUL SYLLABLE HWEM +D70D;D70D;1112 1170 11B8;D70D;1112 1170 11B8; # (휍; 휍; 휍; 휍; 휍; ) HANGUL SYLLABLE HWEB +D70E;D70E;1112 1170 11B9;D70E;1112 1170 11B9; # (휎; 휎; 휎; 휎; 휎; ) HANGUL SYLLABLE HWEBS +D70F;D70F;1112 1170 11BA;D70F;1112 1170 11BA; # (휏; 휏; 휏; 휏; 휏; ) HANGUL SYLLABLE HWES +D710;D710;1112 1170 11BB;D710;1112 1170 11BB; # (휐; 휐; 휐; 휐; 휐; ) HANGUL SYLLABLE HWESS +D711;D711;1112 1170 11BC;D711;1112 1170 11BC; # (휑; 휑; 휑; 휑; 휑; ) HANGUL SYLLABLE HWENG +D712;D712;1112 1170 11BD;D712;1112 1170 11BD; # (휒; 휒; 휒; 휒; 휒; ) HANGUL SYLLABLE HWEJ +D713;D713;1112 1170 11BE;D713;1112 1170 11BE; # (휓; 휓; 휓; 휓; 휓; ) HANGUL SYLLABLE HWEC +D714;D714;1112 1170 11BF;D714;1112 1170 11BF; # (휔; 휔; 휔; 휔; 휔; ) HANGUL SYLLABLE HWEK +D715;D715;1112 1170 11C0;D715;1112 1170 11C0; # (휕; 휕; 휕; 휕; 휕; ) HANGUL SYLLABLE HWET +D716;D716;1112 1170 11C1;D716;1112 1170 11C1; # (휖; 휖; 휖; 휖; 휖; ) HANGUL SYLLABLE HWEP +D717;D717;1112 1170 11C2;D717;1112 1170 11C2; # (휗; 휗; 휗; 휗; 휗; ) HANGUL SYLLABLE HWEH +D718;D718;1112 1171;D718;1112 1171; # (휘; 휘; 휘; 휘; 휘; ) HANGUL SYLLABLE HWI +D719;D719;1112 1171 11A8;D719;1112 1171 11A8; # (휙; 휙; 휙; 휙; 휙; ) HANGUL SYLLABLE HWIG +D71A;D71A;1112 1171 11A9;D71A;1112 1171 11A9; # (휚; 휚; 휚; 휚; 휚; ) HANGUL SYLLABLE HWIGG +D71B;D71B;1112 1171 11AA;D71B;1112 1171 11AA; # (휛; 휛; 휛; 휛; 휛; ) HANGUL SYLLABLE HWIGS +D71C;D71C;1112 1171 11AB;D71C;1112 1171 11AB; # (휜; 휜; 휜; 휜; 휜; ) HANGUL SYLLABLE HWIN +D71D;D71D;1112 1171 11AC;D71D;1112 1171 11AC; # (휝; 휝; 휝; 휝; 휝; ) HANGUL SYLLABLE HWINJ +D71E;D71E;1112 1171 11AD;D71E;1112 1171 11AD; # (휞; 휞; 휞; 휞; 휞; ) HANGUL SYLLABLE HWINH +D71F;D71F;1112 1171 11AE;D71F;1112 1171 11AE; # (휟; 휟; 휟; 휟; 휟; ) HANGUL SYLLABLE HWID +D720;D720;1112 1171 11AF;D720;1112 1171 11AF; # (휠; 휠; 휠; 휠; 휠; ) HANGUL SYLLABLE HWIL +D721;D721;1112 1171 11B0;D721;1112 1171 11B0; # (휡; 휡; 휡; 휡; 휡; ) HANGUL SYLLABLE HWILG +D722;D722;1112 1171 11B1;D722;1112 1171 11B1; # (휢; 휢; 휢; 휢; 휢; ) HANGUL SYLLABLE HWILM +D723;D723;1112 1171 11B2;D723;1112 1171 11B2; # (휣; 휣; 휣; 휣; 휣; ) HANGUL SYLLABLE HWILB +D724;D724;1112 1171 11B3;D724;1112 1171 11B3; # (휤; 휤; 휤; 휤; 휤; ) HANGUL SYLLABLE HWILS +D725;D725;1112 1171 11B4;D725;1112 1171 11B4; # (휥; 휥; 휥; 휥; 휥; ) HANGUL SYLLABLE HWILT +D726;D726;1112 1171 11B5;D726;1112 1171 11B5; # (휦; 휦; 휦; 휦; 휦; ) HANGUL SYLLABLE HWILP +D727;D727;1112 1171 11B6;D727;1112 1171 11B6; # (휧; 휧; 휧; 휧; 휧; ) HANGUL SYLLABLE HWILH +D728;D728;1112 1171 11B7;D728;1112 1171 11B7; # (휨; 휨; 휨; 휨; 휨; ) HANGUL SYLLABLE HWIM +D729;D729;1112 1171 11B8;D729;1112 1171 11B8; # (휩; 휩; 휩; 휩; 휩; ) HANGUL SYLLABLE HWIB +D72A;D72A;1112 1171 11B9;D72A;1112 1171 11B9; # (휪; 휪; 휪; 휪; 휪; ) HANGUL SYLLABLE HWIBS +D72B;D72B;1112 1171 11BA;D72B;1112 1171 11BA; # (휫; 휫; 휫; 휫; 휫; ) HANGUL SYLLABLE HWIS +D72C;D72C;1112 1171 11BB;D72C;1112 1171 11BB; # (휬; 휬; 휬; 휬; 휬; ) HANGUL SYLLABLE HWISS +D72D;D72D;1112 1171 11BC;D72D;1112 1171 11BC; # (휭; 휭; 휭; 휭; 휭; ) HANGUL SYLLABLE HWING +D72E;D72E;1112 1171 11BD;D72E;1112 1171 11BD; # (휮; 휮; 휮; 휮; 휮; ) HANGUL SYLLABLE HWIJ +D72F;D72F;1112 1171 11BE;D72F;1112 1171 11BE; # (휯; 휯; 휯; 휯; 휯; ) HANGUL SYLLABLE HWIC +D730;D730;1112 1171 11BF;D730;1112 1171 11BF; # (휰; 휰; 휰; 휰; 휰; ) HANGUL SYLLABLE HWIK +D731;D731;1112 1171 11C0;D731;1112 1171 11C0; # (휱; 휱; 휱; 휱; 휱; ) HANGUL SYLLABLE HWIT +D732;D732;1112 1171 11C1;D732;1112 1171 11C1; # (휲; 휲; 휲; 휲; 휲; ) HANGUL SYLLABLE HWIP +D733;D733;1112 1171 11C2;D733;1112 1171 11C2; # (휳; 휳; 휳; 휳; 휳; ) HANGUL SYLLABLE HWIH +D734;D734;1112 1172;D734;1112 1172; # (휴; 휴; 휴; 휴; 휴; ) HANGUL SYLLABLE HYU +D735;D735;1112 1172 11A8;D735;1112 1172 11A8; # (휵; 휵; 휵; 휵; 휵; ) HANGUL SYLLABLE HYUG +D736;D736;1112 1172 11A9;D736;1112 1172 11A9; # (휶; 휶; 휶; 휶; 휶; ) HANGUL SYLLABLE HYUGG +D737;D737;1112 1172 11AA;D737;1112 1172 11AA; # (휷; 휷; 휷; 휷; 휷; ) HANGUL SYLLABLE HYUGS +D738;D738;1112 1172 11AB;D738;1112 1172 11AB; # (휸; 휸; 휸; 휸; 휸; ) HANGUL SYLLABLE HYUN +D739;D739;1112 1172 11AC;D739;1112 1172 11AC; # (휹; 휹; 휹; 휹; 휹; ) HANGUL SYLLABLE HYUNJ +D73A;D73A;1112 1172 11AD;D73A;1112 1172 11AD; # (휺; 휺; 휺; 휺; 휺; ) HANGUL SYLLABLE HYUNH +D73B;D73B;1112 1172 11AE;D73B;1112 1172 11AE; # (휻; 휻; 휻; 휻; 휻; ) HANGUL SYLLABLE HYUD +D73C;D73C;1112 1172 11AF;D73C;1112 1172 11AF; # (휼; 휼; 휼; 휼; 휼; ) HANGUL SYLLABLE HYUL +D73D;D73D;1112 1172 11B0;D73D;1112 1172 11B0; # (휽; 휽; 휽; 휽; 휽; ) HANGUL SYLLABLE HYULG +D73E;D73E;1112 1172 11B1;D73E;1112 1172 11B1; # (휾; 휾; 휾; 휾; 휾; ) HANGUL SYLLABLE HYULM +D73F;D73F;1112 1172 11B2;D73F;1112 1172 11B2; # (휿; 휿; 휿; 휿; 휿; ) HANGUL SYLLABLE HYULB +D740;D740;1112 1172 11B3;D740;1112 1172 11B3; # (흀; 흀; 흀; 흀; 흀; ) HANGUL SYLLABLE HYULS +D741;D741;1112 1172 11B4;D741;1112 1172 11B4; # (흁; 흁; 흁; 흁; 흁; ) HANGUL SYLLABLE HYULT +D742;D742;1112 1172 11B5;D742;1112 1172 11B5; # (흂; 흂; 흂; 흂; 흂; ) HANGUL SYLLABLE HYULP +D743;D743;1112 1172 11B6;D743;1112 1172 11B6; # (흃; 흃; 흃; 흃; 흃; ) HANGUL SYLLABLE HYULH +D744;D744;1112 1172 11B7;D744;1112 1172 11B7; # (흄; 흄; 흄; 흄; 흄; ) HANGUL SYLLABLE HYUM +D745;D745;1112 1172 11B8;D745;1112 1172 11B8; # (흅; 흅; 흅; 흅; 흅; ) HANGUL SYLLABLE HYUB +D746;D746;1112 1172 11B9;D746;1112 1172 11B9; # (흆; 흆; 흆; 흆; 흆; ) HANGUL SYLLABLE HYUBS +D747;D747;1112 1172 11BA;D747;1112 1172 11BA; # (흇; 흇; 흇; 흇; 흇; ) HANGUL SYLLABLE HYUS +D748;D748;1112 1172 11BB;D748;1112 1172 11BB; # (흈; 흈; 흈; 흈; 흈; ) HANGUL SYLLABLE HYUSS +D749;D749;1112 1172 11BC;D749;1112 1172 11BC; # (흉; 흉; 흉; 흉; 흉; ) HANGUL SYLLABLE HYUNG +D74A;D74A;1112 1172 11BD;D74A;1112 1172 11BD; # (흊; 흊; 흊; 흊; 흊; ) HANGUL SYLLABLE HYUJ +D74B;D74B;1112 1172 11BE;D74B;1112 1172 11BE; # (흋; 흋; 흋; 흋; 흋; ) HANGUL SYLLABLE HYUC +D74C;D74C;1112 1172 11BF;D74C;1112 1172 11BF; # (흌; 흌; 흌; 흌; 흌; ) HANGUL SYLLABLE HYUK +D74D;D74D;1112 1172 11C0;D74D;1112 1172 11C0; # (흍; 흍; 흍; 흍; 흍; ) HANGUL SYLLABLE HYUT +D74E;D74E;1112 1172 11C1;D74E;1112 1172 11C1; # (흎; 흎; 흎; 흎; 흎; ) HANGUL SYLLABLE HYUP +D74F;D74F;1112 1172 11C2;D74F;1112 1172 11C2; # (흏; 흏; 흏; 흏; 흏; ) HANGUL SYLLABLE HYUH +D750;D750;1112 1173;D750;1112 1173; # (흐; 흐; 흐; 흐; 흐; ) HANGUL SYLLABLE HEU +D751;D751;1112 1173 11A8;D751;1112 1173 11A8; # (흑; 흑; 흑; 흑; 흑; ) HANGUL SYLLABLE HEUG +D752;D752;1112 1173 11A9;D752;1112 1173 11A9; # (흒; 흒; 흒; 흒; 흒; ) HANGUL SYLLABLE HEUGG +D753;D753;1112 1173 11AA;D753;1112 1173 11AA; # (흓; 흓; 흓; 흓; 흓; ) HANGUL SYLLABLE HEUGS +D754;D754;1112 1173 11AB;D754;1112 1173 11AB; # (흔; 흔; 흔; 흔; 흔; ) HANGUL SYLLABLE HEUN +D755;D755;1112 1173 11AC;D755;1112 1173 11AC; # (흕; 흕; 흕; 흕; 흕; ) HANGUL SYLLABLE HEUNJ +D756;D756;1112 1173 11AD;D756;1112 1173 11AD; # (흖; 흖; 흖; 흖; 흖; ) HANGUL SYLLABLE HEUNH +D757;D757;1112 1173 11AE;D757;1112 1173 11AE; # (흗; 흗; 흗; 흗; 흗; ) HANGUL SYLLABLE HEUD +D758;D758;1112 1173 11AF;D758;1112 1173 11AF; # (흘; 흘; 흘; 흘; 흘; ) HANGUL SYLLABLE HEUL +D759;D759;1112 1173 11B0;D759;1112 1173 11B0; # (흙; 흙; 흙; 흙; 흙; ) HANGUL SYLLABLE HEULG +D75A;D75A;1112 1173 11B1;D75A;1112 1173 11B1; # (흚; 흚; 흚; 흚; 흚; ) HANGUL SYLLABLE HEULM +D75B;D75B;1112 1173 11B2;D75B;1112 1173 11B2; # (흛; 흛; 흛; 흛; 흛; ) HANGUL SYLLABLE HEULB +D75C;D75C;1112 1173 11B3;D75C;1112 1173 11B3; # (흜; 흜; 흜; 흜; 흜; ) HANGUL SYLLABLE HEULS +D75D;D75D;1112 1173 11B4;D75D;1112 1173 11B4; # (흝; 흝; 흝; 흝; 흝; ) HANGUL SYLLABLE HEULT +D75E;D75E;1112 1173 11B5;D75E;1112 1173 11B5; # (흞; 흞; 흞; 흞; 흞; ) HANGUL SYLLABLE HEULP +D75F;D75F;1112 1173 11B6;D75F;1112 1173 11B6; # (흟; 흟; 흟; 흟; 흟; ) HANGUL SYLLABLE HEULH +D760;D760;1112 1173 11B7;D760;1112 1173 11B7; # (흠; 흠; 흠; 흠; 흠; ) HANGUL SYLLABLE HEUM +D761;D761;1112 1173 11B8;D761;1112 1173 11B8; # (흡; 흡; 흡; 흡; 흡; ) HANGUL SYLLABLE HEUB +D762;D762;1112 1173 11B9;D762;1112 1173 11B9; # (흢; 흢; 흢; 흢; 흢; ) HANGUL SYLLABLE HEUBS +D763;D763;1112 1173 11BA;D763;1112 1173 11BA; # (흣; 흣; 흣; 흣; 흣; ) HANGUL SYLLABLE HEUS +D764;D764;1112 1173 11BB;D764;1112 1173 11BB; # (흤; 흤; 흤; 흤; 흤; ) HANGUL SYLLABLE HEUSS +D765;D765;1112 1173 11BC;D765;1112 1173 11BC; # (흥; 흥; 흥; 흥; 흥; ) HANGUL SYLLABLE HEUNG +D766;D766;1112 1173 11BD;D766;1112 1173 11BD; # (흦; 흦; 흦; 흦; 흦; ) HANGUL SYLLABLE HEUJ +D767;D767;1112 1173 11BE;D767;1112 1173 11BE; # (흧; 흧; 흧; 흧; 흧; ) HANGUL SYLLABLE HEUC +D768;D768;1112 1173 11BF;D768;1112 1173 11BF; # (흨; 흨; 흨; 흨; 흨; ) HANGUL SYLLABLE HEUK +D769;D769;1112 1173 11C0;D769;1112 1173 11C0; # (흩; 흩; 흩; 흩; 흩; ) HANGUL SYLLABLE HEUT +D76A;D76A;1112 1173 11C1;D76A;1112 1173 11C1; # (흪; 흪; 흪; 흪; 흪; ) HANGUL SYLLABLE HEUP +D76B;D76B;1112 1173 11C2;D76B;1112 1173 11C2; # (흫; 흫; 흫; 흫; 흫; ) HANGUL SYLLABLE HEUH +D76C;D76C;1112 1174;D76C;1112 1174; # (희; 희; 희; 희; 희; ) HANGUL SYLLABLE HYI +D76D;D76D;1112 1174 11A8;D76D;1112 1174 11A8; # (흭; 흭; 흭; 흭; 흭; ) HANGUL SYLLABLE HYIG +D76E;D76E;1112 1174 11A9;D76E;1112 1174 11A9; # (흮; 흮; 흮; 흮; 흮; ) HANGUL SYLLABLE HYIGG +D76F;D76F;1112 1174 11AA;D76F;1112 1174 11AA; # (흯; 흯; 흯; 흯; 흯; ) HANGUL SYLLABLE HYIGS +D770;D770;1112 1174 11AB;D770;1112 1174 11AB; # (흰; 흰; 흰; 흰; 흰; ) HANGUL SYLLABLE HYIN +D771;D771;1112 1174 11AC;D771;1112 1174 11AC; # (흱; 흱; 흱; 흱; 흱; ) HANGUL SYLLABLE HYINJ +D772;D772;1112 1174 11AD;D772;1112 1174 11AD; # (흲; 흲; 흲; 흲; 흲; ) HANGUL SYLLABLE HYINH +D773;D773;1112 1174 11AE;D773;1112 1174 11AE; # (흳; 흳; 흳; 흳; 흳; ) HANGUL SYLLABLE HYID +D774;D774;1112 1174 11AF;D774;1112 1174 11AF; # (흴; 흴; 흴; 흴; 흴; ) HANGUL SYLLABLE HYIL +D775;D775;1112 1174 11B0;D775;1112 1174 11B0; # (흵; 흵; 흵; 흵; 흵; ) HANGUL SYLLABLE HYILG +D776;D776;1112 1174 11B1;D776;1112 1174 11B1; # (흶; 흶; 흶; 흶; 흶; ) HANGUL SYLLABLE HYILM +D777;D777;1112 1174 11B2;D777;1112 1174 11B2; # (흷; 흷; 흷; 흷; 흷; ) HANGUL SYLLABLE HYILB +D778;D778;1112 1174 11B3;D778;1112 1174 11B3; # (흸; 흸; 흸; 흸; 흸; ) HANGUL SYLLABLE HYILS +D779;D779;1112 1174 11B4;D779;1112 1174 11B4; # (흹; 흹; 흹; 흹; 흹; ) HANGUL SYLLABLE HYILT +D77A;D77A;1112 1174 11B5;D77A;1112 1174 11B5; # (흺; 흺; 흺; 흺; 흺; ) HANGUL SYLLABLE HYILP +D77B;D77B;1112 1174 11B6;D77B;1112 1174 11B6; # (흻; 흻; 흻; 흻; 흻; ) HANGUL SYLLABLE HYILH +D77C;D77C;1112 1174 11B7;D77C;1112 1174 11B7; # (흼; 흼; 흼; 흼; 흼; ) HANGUL SYLLABLE HYIM +D77D;D77D;1112 1174 11B8;D77D;1112 1174 11B8; # (흽; 흽; 흽; 흽; 흽; ) HANGUL SYLLABLE HYIB +D77E;D77E;1112 1174 11B9;D77E;1112 1174 11B9; # (흾; 흾; 흾; 흾; 흾; ) HANGUL SYLLABLE HYIBS +D77F;D77F;1112 1174 11BA;D77F;1112 1174 11BA; # (흿; 흿; 흿; 흿; 흿; ) HANGUL SYLLABLE HYIS +D780;D780;1112 1174 11BB;D780;1112 1174 11BB; # (힀; 힀; 힀; 힀; 힀; ) HANGUL SYLLABLE HYISS +D781;D781;1112 1174 11BC;D781;1112 1174 11BC; # (힁; 힁; 힁; 힁; 힁; ) HANGUL SYLLABLE HYING +D782;D782;1112 1174 11BD;D782;1112 1174 11BD; # (힂; 힂; 힂; 힂; 힂; ) HANGUL SYLLABLE HYIJ +D783;D783;1112 1174 11BE;D783;1112 1174 11BE; # (힃; 힃; 힃; 힃; 힃; ) HANGUL SYLLABLE HYIC +D784;D784;1112 1174 11BF;D784;1112 1174 11BF; # (힄; 힄; 힄; 힄; 힄; ) HANGUL SYLLABLE HYIK +D785;D785;1112 1174 11C0;D785;1112 1174 11C0; # (힅; 힅; 힅; 힅; 힅; ) HANGUL SYLLABLE HYIT +D786;D786;1112 1174 11C1;D786;1112 1174 11C1; # (힆; 힆; 힆; 힆; 힆; ) HANGUL SYLLABLE HYIP +D787;D787;1112 1174 11C2;D787;1112 1174 11C2; # (힇; 힇; 힇; 힇; 힇; ) HANGUL SYLLABLE HYIH +D788;D788;1112 1175;D788;1112 1175; # (히; 히; 히; 히; 히; ) HANGUL SYLLABLE HI +D789;D789;1112 1175 11A8;D789;1112 1175 11A8; # (힉; 힉; 힉; 힉; 힉; ) HANGUL SYLLABLE HIG +D78A;D78A;1112 1175 11A9;D78A;1112 1175 11A9; # (힊; 힊; 힊; 힊; 힊; ) HANGUL SYLLABLE HIGG +D78B;D78B;1112 1175 11AA;D78B;1112 1175 11AA; # (힋; 힋; 힋; 힋; 힋; ) HANGUL SYLLABLE HIGS +D78C;D78C;1112 1175 11AB;D78C;1112 1175 11AB; # (힌; 힌; 힌; 힌; 힌; ) HANGUL SYLLABLE HIN +D78D;D78D;1112 1175 11AC;D78D;1112 1175 11AC; # (힍; 힍; 힍; 힍; 힍; ) HANGUL SYLLABLE HINJ +D78E;D78E;1112 1175 11AD;D78E;1112 1175 11AD; # (힎; 힎; 힎; 힎; 힎; ) HANGUL SYLLABLE HINH +D78F;D78F;1112 1175 11AE;D78F;1112 1175 11AE; # (힏; 힏; 힏; 힏; 힏; ) HANGUL SYLLABLE HID +D790;D790;1112 1175 11AF;D790;1112 1175 11AF; # (힐; 힐; 힐; 힐; 힐; ) HANGUL SYLLABLE HIL +D791;D791;1112 1175 11B0;D791;1112 1175 11B0; # (힑; 힑; 힑; 힑; 힑; ) HANGUL SYLLABLE HILG +D792;D792;1112 1175 11B1;D792;1112 1175 11B1; # (힒; 힒; 힒; 힒; 힒; ) HANGUL SYLLABLE HILM +D793;D793;1112 1175 11B2;D793;1112 1175 11B2; # (힓; 힓; 힓; 힓; 힓; ) HANGUL SYLLABLE HILB +D794;D794;1112 1175 11B3;D794;1112 1175 11B3; # (힔; 힔; 힔; 힔; 힔; ) HANGUL SYLLABLE HILS +D795;D795;1112 1175 11B4;D795;1112 1175 11B4; # (힕; 힕; 힕; 힕; 힕; ) HANGUL SYLLABLE HILT +D796;D796;1112 1175 11B5;D796;1112 1175 11B5; # (힖; 힖; 힖; 힖; 힖; ) HANGUL SYLLABLE HILP +D797;D797;1112 1175 11B6;D797;1112 1175 11B6; # (힗; 힗; 힗; 힗; 힗; ) HANGUL SYLLABLE HILH +D798;D798;1112 1175 11B7;D798;1112 1175 11B7; # (힘; 힘; 힘; 힘; 힘; ) HANGUL SYLLABLE HIM +D799;D799;1112 1175 11B8;D799;1112 1175 11B8; # (힙; 힙; 힙; 힙; 힙; ) HANGUL SYLLABLE HIB +D79A;D79A;1112 1175 11B9;D79A;1112 1175 11B9; # (힚; 힚; 힚; 힚; 힚; ) HANGUL SYLLABLE HIBS +D79B;D79B;1112 1175 11BA;D79B;1112 1175 11BA; # (힛; 힛; 힛; 힛; 힛; ) HANGUL SYLLABLE HIS +D79C;D79C;1112 1175 11BB;D79C;1112 1175 11BB; # (힜; 힜; 힜; 힜; 힜; ) HANGUL SYLLABLE HISS +D79D;D79D;1112 1175 11BC;D79D;1112 1175 11BC; # (힝; 힝; 힝; 힝; 힝; ) HANGUL SYLLABLE HING +D79E;D79E;1112 1175 11BD;D79E;1112 1175 11BD; # (힞; 힞; 힞; 힞; 힞; ) HANGUL SYLLABLE HIJ +D79F;D79F;1112 1175 11BE;D79F;1112 1175 11BE; # (힟; 힟; 힟; 힟; 힟; ) HANGUL SYLLABLE HIC +D7A0;D7A0;1112 1175 11BF;D7A0;1112 1175 11BF; # (힠; 힠; 힠; 힠; 힠; ) HANGUL SYLLABLE HIK +D7A1;D7A1;1112 1175 11C0;D7A1;1112 1175 11C0; # (힡; 힡; 힡; 힡; 힡; ) HANGUL SYLLABLE HIT +D7A2;D7A2;1112 1175 11C1;D7A2;1112 1175 11C1; # (힢; 힢; 힢; 힢; 힢; ) HANGUL SYLLABLE HIP +D7A3;D7A3;1112 1175 11C2;D7A3;1112 1175 11C2; # (힣; 힣; 힣; 힣; 힣; ) HANGUL SYLLABLE HIH +F900;8C48;8C48;8C48;8C48; # (豈; 豈; 豈; 豈; 豈; ) CJK COMPATIBILITY IDEOGRAPH-F900 +F901;66F4;66F4;66F4;66F4; # (更; 更; 更; 更; 更; ) CJK COMPATIBILITY IDEOGRAPH-F901 +F902;8ECA;8ECA;8ECA;8ECA; # (車; 車; 車; 車; 車; ) CJK COMPATIBILITY IDEOGRAPH-F902 +F903;8CC8;8CC8;8CC8;8CC8; # (賈; 賈; 賈; 賈; 賈; ) CJK COMPATIBILITY IDEOGRAPH-F903 +F904;6ED1;6ED1;6ED1;6ED1; # (滑; 滑; 滑; 滑; 滑; ) CJK COMPATIBILITY IDEOGRAPH-F904 +F905;4E32;4E32;4E32;4E32; # (串; 串; 串; 串; 串; ) CJK COMPATIBILITY IDEOGRAPH-F905 +F906;53E5;53E5;53E5;53E5; # (句; 句; 句; 句; 句; ) CJK COMPATIBILITY IDEOGRAPH-F906 +F907;9F9C;9F9C;9F9C;9F9C; # (龜; 龜; 龜; 龜; 龜; ) CJK COMPATIBILITY IDEOGRAPH-F907 +F908;9F9C;9F9C;9F9C;9F9C; # (龜; 龜; 龜; 龜; 龜; ) CJK COMPATIBILITY IDEOGRAPH-F908 +F909;5951;5951;5951;5951; # (契; 契; 契; 契; 契; ) CJK COMPATIBILITY IDEOGRAPH-F909 +F90A;91D1;91D1;91D1;91D1; # (金; 金; 金; 金; 金; ) CJK COMPATIBILITY IDEOGRAPH-F90A +F90B;5587;5587;5587;5587; # (喇; 喇; 喇; 喇; 喇; ) CJK COMPATIBILITY IDEOGRAPH-F90B +F90C;5948;5948;5948;5948; # (奈; 奈; 奈; 奈; 奈; ) CJK COMPATIBILITY IDEOGRAPH-F90C +F90D;61F6;61F6;61F6;61F6; # (懶; 懶; 懶; 懶; 懶; ) CJK COMPATIBILITY IDEOGRAPH-F90D +F90E;7669;7669;7669;7669; # (癩; 癩; 癩; 癩; 癩; ) CJK COMPATIBILITY IDEOGRAPH-F90E +F90F;7F85;7F85;7F85;7F85; # (羅; 羅; 羅; 羅; 羅; ) CJK COMPATIBILITY IDEOGRAPH-F90F +F910;863F;863F;863F;863F; # (蘿; 蘿; 蘿; 蘿; 蘿; ) CJK COMPATIBILITY IDEOGRAPH-F910 +F911;87BA;87BA;87BA;87BA; # (螺; 螺; 螺; 螺; 螺; ) CJK COMPATIBILITY IDEOGRAPH-F911 +F912;88F8;88F8;88F8;88F8; # (裸; 裸; 裸; 裸; 裸; ) CJK COMPATIBILITY IDEOGRAPH-F912 +F913;908F;908F;908F;908F; # (邏; 邏; 邏; 邏; 邏; ) CJK COMPATIBILITY IDEOGRAPH-F913 +F914;6A02;6A02;6A02;6A02; # (樂; 樂; 樂; 樂; 樂; ) CJK COMPATIBILITY IDEOGRAPH-F914 +F915;6D1B;6D1B;6D1B;6D1B; # (洛; 洛; 洛; 洛; 洛; ) CJK COMPATIBILITY IDEOGRAPH-F915 +F916;70D9;70D9;70D9;70D9; # (烙; 烙; 烙; 烙; 烙; ) CJK COMPATIBILITY IDEOGRAPH-F916 +F917;73DE;73DE;73DE;73DE; # (珞; 珞; 珞; 珞; 珞; ) CJK COMPATIBILITY IDEOGRAPH-F917 +F918;843D;843D;843D;843D; # (落; 落; 落; 落; 落; ) CJK COMPATIBILITY IDEOGRAPH-F918 +F919;916A;916A;916A;916A; # (酪; 酪; 酪; 酪; 酪; ) CJK COMPATIBILITY IDEOGRAPH-F919 +F91A;99F1;99F1;99F1;99F1; # (駱; 駱; 駱; 駱; 駱; ) CJK COMPATIBILITY IDEOGRAPH-F91A +F91B;4E82;4E82;4E82;4E82; # (亂; 亂; 亂; 亂; 亂; ) CJK COMPATIBILITY IDEOGRAPH-F91B +F91C;5375;5375;5375;5375; # (卵; 卵; 卵; 卵; 卵; ) CJK COMPATIBILITY IDEOGRAPH-F91C +F91D;6B04;6B04;6B04;6B04; # (欄; 欄; 欄; 欄; 欄; ) CJK COMPATIBILITY IDEOGRAPH-F91D +F91E;721B;721B;721B;721B; # (爛; 爛; 爛; 爛; 爛; ) CJK COMPATIBILITY IDEOGRAPH-F91E +F91F;862D;862D;862D;862D; # (蘭; 蘭; 蘭; 蘭; 蘭; ) CJK COMPATIBILITY IDEOGRAPH-F91F +F920;9E1E;9E1E;9E1E;9E1E; # (鸞; 鸞; 鸞; 鸞; 鸞; ) CJK COMPATIBILITY IDEOGRAPH-F920 +F921;5D50;5D50;5D50;5D50; # (嵐; 嵐; 嵐; 嵐; 嵐; ) CJK COMPATIBILITY IDEOGRAPH-F921 +F922;6FEB;6FEB;6FEB;6FEB; # (濫; 濫; 濫; 濫; 濫; ) CJK COMPATIBILITY IDEOGRAPH-F922 +F923;85CD;85CD;85CD;85CD; # (藍; 藍; 藍; 藍; 藍; ) CJK COMPATIBILITY IDEOGRAPH-F923 +F924;8964;8964;8964;8964; # (襤; 襤; 襤; 襤; 襤; ) CJK COMPATIBILITY IDEOGRAPH-F924 +F925;62C9;62C9;62C9;62C9; # (拉; 拉; 拉; 拉; 拉; ) CJK COMPATIBILITY IDEOGRAPH-F925 +F926;81D8;81D8;81D8;81D8; # (臘; 臘; 臘; 臘; 臘; ) CJK COMPATIBILITY IDEOGRAPH-F926 +F927;881F;881F;881F;881F; # (蠟; 蠟; 蠟; 蠟; 蠟; ) CJK COMPATIBILITY IDEOGRAPH-F927 +F928;5ECA;5ECA;5ECA;5ECA; # (廊; 廊; 廊; 廊; 廊; ) CJK COMPATIBILITY IDEOGRAPH-F928 +F929;6717;6717;6717;6717; # (朗; 朗; 朗; 朗; 朗; ) CJK COMPATIBILITY IDEOGRAPH-F929 +F92A;6D6A;6D6A;6D6A;6D6A; # (浪; 浪; 浪; 浪; 浪; ) CJK COMPATIBILITY IDEOGRAPH-F92A +F92B;72FC;72FC;72FC;72FC; # (狼; 狼; 狼; 狼; 狼; ) CJK COMPATIBILITY IDEOGRAPH-F92B +F92C;90CE;90CE;90CE;90CE; # (郎; 郎; 郎; 郎; 郎; ) CJK COMPATIBILITY IDEOGRAPH-F92C +F92D;4F86;4F86;4F86;4F86; # (來; 來; 來; 來; 來; ) CJK COMPATIBILITY IDEOGRAPH-F92D +F92E;51B7;51B7;51B7;51B7; # (冷; 冷; 冷; 冷; 冷; ) CJK COMPATIBILITY IDEOGRAPH-F92E +F92F;52DE;52DE;52DE;52DE; # (勞; 勞; 勞; 勞; 勞; ) CJK COMPATIBILITY IDEOGRAPH-F92F +F930;64C4;64C4;64C4;64C4; # (擄; 擄; 擄; 擄; 擄; ) CJK COMPATIBILITY IDEOGRAPH-F930 +F931;6AD3;6AD3;6AD3;6AD3; # (櫓; 櫓; 櫓; 櫓; 櫓; ) CJK COMPATIBILITY IDEOGRAPH-F931 +F932;7210;7210;7210;7210; # (爐; 爐; 爐; 爐; 爐; ) CJK COMPATIBILITY IDEOGRAPH-F932 +F933;76E7;76E7;76E7;76E7; # (盧; 盧; 盧; 盧; 盧; ) CJK COMPATIBILITY IDEOGRAPH-F933 +F934;8001;8001;8001;8001; # (老; 老; 老; 老; 老; ) CJK COMPATIBILITY IDEOGRAPH-F934 +F935;8606;8606;8606;8606; # (蘆; 蘆; 蘆; 蘆; 蘆; ) CJK COMPATIBILITY IDEOGRAPH-F935 +F936;865C;865C;865C;865C; # (虜; 虜; 虜; 虜; 虜; ) CJK COMPATIBILITY IDEOGRAPH-F936 +F937;8DEF;8DEF;8DEF;8DEF; # (路; 路; 路; 路; 路; ) CJK COMPATIBILITY IDEOGRAPH-F937 +F938;9732;9732;9732;9732; # (露; 露; 露; 露; 露; ) CJK COMPATIBILITY IDEOGRAPH-F938 +F939;9B6F;9B6F;9B6F;9B6F; # (魯; 魯; 魯; 魯; 魯; ) CJK COMPATIBILITY IDEOGRAPH-F939 +F93A;9DFA;9DFA;9DFA;9DFA; # (鷺; 鷺; 鷺; 鷺; 鷺; ) CJK COMPATIBILITY IDEOGRAPH-F93A +F93B;788C;788C;788C;788C; # (碌; 碌; 碌; 碌; 碌; ) CJK COMPATIBILITY IDEOGRAPH-F93B +F93C;797F;797F;797F;797F; # (祿; 祿; 祿; 祿; 祿; ) CJK COMPATIBILITY IDEOGRAPH-F93C +F93D;7DA0;7DA0;7DA0;7DA0; # (綠; 綠; 綠; 綠; 綠; ) CJK COMPATIBILITY IDEOGRAPH-F93D +F93E;83C9;83C9;83C9;83C9; # (菉; 菉; 菉; 菉; 菉; ) CJK COMPATIBILITY IDEOGRAPH-F93E +F93F;9304;9304;9304;9304; # (錄; 錄; 錄; 錄; 錄; ) CJK COMPATIBILITY IDEOGRAPH-F93F +F940;9E7F;9E7F;9E7F;9E7F; # (鹿; 鹿; 鹿; 鹿; 鹿; ) CJK COMPATIBILITY IDEOGRAPH-F940 +F941;8AD6;8AD6;8AD6;8AD6; # (論; 論; 論; 論; 論; ) CJK COMPATIBILITY IDEOGRAPH-F941 +F942;58DF;58DF;58DF;58DF; # (壟; 壟; 壟; 壟; 壟; ) CJK COMPATIBILITY IDEOGRAPH-F942 +F943;5F04;5F04;5F04;5F04; # (弄; 弄; 弄; 弄; 弄; ) CJK COMPATIBILITY IDEOGRAPH-F943 +F944;7C60;7C60;7C60;7C60; # (籠; 籠; 籠; 籠; 籠; ) CJK COMPATIBILITY IDEOGRAPH-F944 +F945;807E;807E;807E;807E; # (聾; 聾; 聾; 聾; 聾; ) CJK COMPATIBILITY IDEOGRAPH-F945 +F946;7262;7262;7262;7262; # (牢; 牢; 牢; 牢; 牢; ) CJK COMPATIBILITY IDEOGRAPH-F946 +F947;78CA;78CA;78CA;78CA; # (磊; 磊; 磊; 磊; 磊; ) CJK COMPATIBILITY IDEOGRAPH-F947 +F948;8CC2;8CC2;8CC2;8CC2; # (賂; 賂; 賂; 賂; 賂; ) CJK COMPATIBILITY IDEOGRAPH-F948 +F949;96F7;96F7;96F7;96F7; # (雷; 雷; 雷; 雷; 雷; ) CJK COMPATIBILITY IDEOGRAPH-F949 +F94A;58D8;58D8;58D8;58D8; # (壘; 壘; 壘; 壘; 壘; ) CJK COMPATIBILITY IDEOGRAPH-F94A +F94B;5C62;5C62;5C62;5C62; # (屢; 屢; 屢; 屢; 屢; ) CJK COMPATIBILITY IDEOGRAPH-F94B +F94C;6A13;6A13;6A13;6A13; # (樓; 樓; 樓; 樓; 樓; ) CJK COMPATIBILITY IDEOGRAPH-F94C +F94D;6DDA;6DDA;6DDA;6DDA; # (淚; 淚; 淚; 淚; 淚; ) CJK COMPATIBILITY IDEOGRAPH-F94D +F94E;6F0F;6F0F;6F0F;6F0F; # (漏; 漏; 漏; 漏; 漏; ) CJK COMPATIBILITY IDEOGRAPH-F94E +F94F;7D2F;7D2F;7D2F;7D2F; # (累; 累; 累; 累; 累; ) CJK COMPATIBILITY IDEOGRAPH-F94F +F950;7E37;7E37;7E37;7E37; # (縷; 縷; 縷; 縷; 縷; ) CJK COMPATIBILITY IDEOGRAPH-F950 +F951;964B;964B;964B;964B; # (陋; 陋; 陋; 陋; 陋; ) CJK COMPATIBILITY IDEOGRAPH-F951 +F952;52D2;52D2;52D2;52D2; # (勒; 勒; 勒; 勒; 勒; ) CJK COMPATIBILITY IDEOGRAPH-F952 +F953;808B;808B;808B;808B; # (肋; 肋; 肋; 肋; 肋; ) CJK COMPATIBILITY IDEOGRAPH-F953 +F954;51DC;51DC;51DC;51DC; # (凜; 凜; 凜; 凜; 凜; ) CJK COMPATIBILITY IDEOGRAPH-F954 +F955;51CC;51CC;51CC;51CC; # (凌; 凌; 凌; 凌; 凌; ) CJK COMPATIBILITY IDEOGRAPH-F955 +F956;7A1C;7A1C;7A1C;7A1C; # (稜; 稜; 稜; 稜; 稜; ) CJK COMPATIBILITY IDEOGRAPH-F956 +F957;7DBE;7DBE;7DBE;7DBE; # (綾; 綾; 綾; 綾; 綾; ) CJK COMPATIBILITY IDEOGRAPH-F957 +F958;83F1;83F1;83F1;83F1; # (菱; 菱; 菱; 菱; 菱; ) CJK COMPATIBILITY IDEOGRAPH-F958 +F959;9675;9675;9675;9675; # (陵; 陵; 陵; 陵; 陵; ) CJK COMPATIBILITY IDEOGRAPH-F959 +F95A;8B80;8B80;8B80;8B80; # (讀; 讀; 讀; 讀; 讀; ) CJK COMPATIBILITY IDEOGRAPH-F95A +F95B;62CF;62CF;62CF;62CF; # (拏; 拏; 拏; 拏; 拏; ) CJK COMPATIBILITY IDEOGRAPH-F95B +F95C;6A02;6A02;6A02;6A02; # (樂; 樂; 樂; 樂; 樂; ) CJK COMPATIBILITY IDEOGRAPH-F95C +F95D;8AFE;8AFE;8AFE;8AFE; # (諾; 諾; 諾; 諾; 諾; ) CJK COMPATIBILITY IDEOGRAPH-F95D +F95E;4E39;4E39;4E39;4E39; # (丹; 丹; 丹; 丹; 丹; ) CJK COMPATIBILITY IDEOGRAPH-F95E +F95F;5BE7;5BE7;5BE7;5BE7; # (寧; 寧; 寧; 寧; 寧; ) CJK COMPATIBILITY IDEOGRAPH-F95F +F960;6012;6012;6012;6012; # (怒; 怒; 怒; 怒; 怒; ) CJK COMPATIBILITY IDEOGRAPH-F960 +F961;7387;7387;7387;7387; # (率; 率; 率; 率; 率; ) CJK COMPATIBILITY IDEOGRAPH-F961 +F962;7570;7570;7570;7570; # (異; 異; 異; 異; 異; ) CJK COMPATIBILITY IDEOGRAPH-F962 +F963;5317;5317;5317;5317; # (北; 北; 北; 北; 北; ) CJK COMPATIBILITY IDEOGRAPH-F963 +F964;78FB;78FB;78FB;78FB; # (磻; 磻; 磻; 磻; 磻; ) CJK COMPATIBILITY IDEOGRAPH-F964 +F965;4FBF;4FBF;4FBF;4FBF; # (便; 便; 便; 便; 便; ) CJK COMPATIBILITY IDEOGRAPH-F965 +F966;5FA9;5FA9;5FA9;5FA9; # (復; 復; 復; 復; 復; ) CJK COMPATIBILITY IDEOGRAPH-F966 +F967;4E0D;4E0D;4E0D;4E0D; # (不; 不; 不; 不; 不; ) CJK COMPATIBILITY IDEOGRAPH-F967 +F968;6CCC;6CCC;6CCC;6CCC; # (泌; 泌; 泌; 泌; 泌; ) CJK COMPATIBILITY IDEOGRAPH-F968 +F969;6578;6578;6578;6578; # (數; 數; 數; 數; 數; ) CJK COMPATIBILITY IDEOGRAPH-F969 +F96A;7D22;7D22;7D22;7D22; # (索; 索; 索; 索; 索; ) CJK COMPATIBILITY IDEOGRAPH-F96A +F96B;53C3;53C3;53C3;53C3; # (參; 參; 參; 參; 參; ) CJK COMPATIBILITY IDEOGRAPH-F96B +F96C;585E;585E;585E;585E; # (塞; 塞; 塞; 塞; 塞; ) CJK COMPATIBILITY IDEOGRAPH-F96C +F96D;7701;7701;7701;7701; # (省; 省; 省; 省; 省; ) CJK COMPATIBILITY IDEOGRAPH-F96D +F96E;8449;8449;8449;8449; # (葉; 葉; 葉; 葉; 葉; ) CJK COMPATIBILITY IDEOGRAPH-F96E +F96F;8AAA;8AAA;8AAA;8AAA; # (說; 說; 說; 說; 說; ) CJK COMPATIBILITY IDEOGRAPH-F96F +F970;6BBA;6BBA;6BBA;6BBA; # (殺; 殺; 殺; 殺; 殺; ) CJK COMPATIBILITY IDEOGRAPH-F970 +F971;8FB0;8FB0;8FB0;8FB0; # (辰; 辰; 辰; 辰; 辰; ) CJK COMPATIBILITY IDEOGRAPH-F971 +F972;6C88;6C88;6C88;6C88; # (沈; 沈; 沈; 沈; 沈; ) CJK COMPATIBILITY IDEOGRAPH-F972 +F973;62FE;62FE;62FE;62FE; # (拾; 拾; 拾; 拾; 拾; ) CJK COMPATIBILITY IDEOGRAPH-F973 +F974;82E5;82E5;82E5;82E5; # (若; 若; 若; 若; 若; ) CJK COMPATIBILITY IDEOGRAPH-F974 +F975;63A0;63A0;63A0;63A0; # (掠; 掠; 掠; 掠; 掠; ) CJK COMPATIBILITY IDEOGRAPH-F975 +F976;7565;7565;7565;7565; # (略; 略; 略; 略; 略; ) CJK COMPATIBILITY IDEOGRAPH-F976 +F977;4EAE;4EAE;4EAE;4EAE; # (亮; 亮; 亮; 亮; 亮; ) CJK COMPATIBILITY IDEOGRAPH-F977 +F978;5169;5169;5169;5169; # (兩; 兩; 兩; 兩; 兩; ) CJK COMPATIBILITY IDEOGRAPH-F978 +F979;51C9;51C9;51C9;51C9; # (凉; 凉; 凉; 凉; 凉; ) CJK COMPATIBILITY IDEOGRAPH-F979 +F97A;6881;6881;6881;6881; # (梁; 梁; 梁; 梁; 梁; ) CJK COMPATIBILITY IDEOGRAPH-F97A +F97B;7CE7;7CE7;7CE7;7CE7; # (糧; 糧; 糧; 糧; 糧; ) CJK COMPATIBILITY IDEOGRAPH-F97B +F97C;826F;826F;826F;826F; # (良; 良; 良; 良; 良; ) CJK COMPATIBILITY IDEOGRAPH-F97C +F97D;8AD2;8AD2;8AD2;8AD2; # (諒; 諒; 諒; 諒; 諒; ) CJK COMPATIBILITY IDEOGRAPH-F97D +F97E;91CF;91CF;91CF;91CF; # (量; 量; 量; 量; 量; ) CJK COMPATIBILITY IDEOGRAPH-F97E +F97F;52F5;52F5;52F5;52F5; # (勵; 勵; 勵; 勵; 勵; ) CJK COMPATIBILITY IDEOGRAPH-F97F +F980;5442;5442;5442;5442; # (呂; 呂; 呂; 呂; 呂; ) CJK COMPATIBILITY IDEOGRAPH-F980 +F981;5973;5973;5973;5973; # (女; 女; 女; 女; 女; ) CJK COMPATIBILITY IDEOGRAPH-F981 +F982;5EEC;5EEC;5EEC;5EEC; # (廬; 廬; 廬; 廬; 廬; ) CJK COMPATIBILITY IDEOGRAPH-F982 +F983;65C5;65C5;65C5;65C5; # (旅; 旅; 旅; 旅; 旅; ) CJK COMPATIBILITY IDEOGRAPH-F983 +F984;6FFE;6FFE;6FFE;6FFE; # (濾; 濾; 濾; 濾; 濾; ) CJK COMPATIBILITY IDEOGRAPH-F984 +F985;792A;792A;792A;792A; # (礪; 礪; 礪; 礪; 礪; ) CJK COMPATIBILITY IDEOGRAPH-F985 +F986;95AD;95AD;95AD;95AD; # (閭; 閭; 閭; 閭; 閭; ) CJK COMPATIBILITY IDEOGRAPH-F986 +F987;9A6A;9A6A;9A6A;9A6A; # (驪; 驪; 驪; 驪; 驪; ) CJK COMPATIBILITY IDEOGRAPH-F987 +F988;9E97;9E97;9E97;9E97; # (麗; 麗; 麗; 麗; 麗; ) CJK COMPATIBILITY IDEOGRAPH-F988 +F989;9ECE;9ECE;9ECE;9ECE; # (黎; 黎; 黎; 黎; 黎; ) CJK COMPATIBILITY IDEOGRAPH-F989 +F98A;529B;529B;529B;529B; # (力; 力; 力; 力; 力; ) CJK COMPATIBILITY IDEOGRAPH-F98A +F98B;66C6;66C6;66C6;66C6; # (曆; 曆; 曆; 曆; 曆; ) CJK COMPATIBILITY IDEOGRAPH-F98B +F98C;6B77;6B77;6B77;6B77; # (歷; 歷; 歷; 歷; 歷; ) CJK COMPATIBILITY IDEOGRAPH-F98C +F98D;8F62;8F62;8F62;8F62; # (轢; 轢; 轢; 轢; 轢; ) CJK COMPATIBILITY IDEOGRAPH-F98D +F98E;5E74;5E74;5E74;5E74; # (年; 年; 年; 年; 年; ) CJK COMPATIBILITY IDEOGRAPH-F98E +F98F;6190;6190;6190;6190; # (憐; 憐; 憐; 憐; 憐; ) CJK COMPATIBILITY IDEOGRAPH-F98F +F990;6200;6200;6200;6200; # (戀; 戀; 戀; 戀; 戀; ) CJK COMPATIBILITY IDEOGRAPH-F990 +F991;649A;649A;649A;649A; # (撚; 撚; 撚; 撚; 撚; ) CJK COMPATIBILITY IDEOGRAPH-F991 +F992;6F23;6F23;6F23;6F23; # (漣; 漣; 漣; 漣; 漣; ) CJK COMPATIBILITY IDEOGRAPH-F992 +F993;7149;7149;7149;7149; # (煉; 煉; 煉; 煉; 煉; ) CJK COMPATIBILITY IDEOGRAPH-F993 +F994;7489;7489;7489;7489; # (璉; 璉; 璉; 璉; 璉; ) CJK COMPATIBILITY IDEOGRAPH-F994 +F995;79CA;79CA;79CA;79CA; # (秊; 秊; 秊; 秊; 秊; ) CJK COMPATIBILITY IDEOGRAPH-F995 +F996;7DF4;7DF4;7DF4;7DF4; # (練; 練; 練; 練; 練; ) CJK COMPATIBILITY IDEOGRAPH-F996 +F997;806F;806F;806F;806F; # (聯; 聯; 聯; 聯; 聯; ) CJK COMPATIBILITY IDEOGRAPH-F997 +F998;8F26;8F26;8F26;8F26; # (輦; 輦; 輦; 輦; 輦; ) CJK COMPATIBILITY IDEOGRAPH-F998 +F999;84EE;84EE;84EE;84EE; # (蓮; 蓮; 蓮; 蓮; 蓮; ) CJK COMPATIBILITY IDEOGRAPH-F999 +F99A;9023;9023;9023;9023; # (連; 連; 連; 連; 連; ) CJK COMPATIBILITY IDEOGRAPH-F99A +F99B;934A;934A;934A;934A; # (鍊; 鍊; 鍊; 鍊; 鍊; ) CJK COMPATIBILITY IDEOGRAPH-F99B +F99C;5217;5217;5217;5217; # (列; 列; 列; 列; 列; ) CJK COMPATIBILITY IDEOGRAPH-F99C +F99D;52A3;52A3;52A3;52A3; # (劣; 劣; 劣; 劣; 劣; ) CJK COMPATIBILITY IDEOGRAPH-F99D +F99E;54BD;54BD;54BD;54BD; # (咽; 咽; 咽; 咽; 咽; ) CJK COMPATIBILITY IDEOGRAPH-F99E +F99F;70C8;70C8;70C8;70C8; # (烈; 烈; 烈; 烈; 烈; ) CJK COMPATIBILITY IDEOGRAPH-F99F +F9A0;88C2;88C2;88C2;88C2; # (裂; 裂; 裂; 裂; 裂; ) CJK COMPATIBILITY IDEOGRAPH-F9A0 +F9A1;8AAA;8AAA;8AAA;8AAA; # (說; 說; 說; 說; 說; ) CJK COMPATIBILITY IDEOGRAPH-F9A1 +F9A2;5EC9;5EC9;5EC9;5EC9; # (廉; 廉; 廉; 廉; 廉; ) CJK COMPATIBILITY IDEOGRAPH-F9A2 +F9A3;5FF5;5FF5;5FF5;5FF5; # (念; 念; 念; 念; 念; ) CJK COMPATIBILITY IDEOGRAPH-F9A3 +F9A4;637B;637B;637B;637B; # (捻; 捻; 捻; 捻; 捻; ) CJK COMPATIBILITY IDEOGRAPH-F9A4 +F9A5;6BAE;6BAE;6BAE;6BAE; # (殮; 殮; 殮; 殮; 殮; ) CJK COMPATIBILITY IDEOGRAPH-F9A5 +F9A6;7C3E;7C3E;7C3E;7C3E; # (簾; 簾; 簾; 簾; 簾; ) CJK COMPATIBILITY IDEOGRAPH-F9A6 +F9A7;7375;7375;7375;7375; # (獵; 獵; 獵; 獵; 獵; ) CJK COMPATIBILITY IDEOGRAPH-F9A7 +F9A8;4EE4;4EE4;4EE4;4EE4; # (令; 令; 令; 令; 令; ) CJK COMPATIBILITY IDEOGRAPH-F9A8 +F9A9;56F9;56F9;56F9;56F9; # (囹; 囹; 囹; 囹; 囹; ) CJK COMPATIBILITY IDEOGRAPH-F9A9 +F9AA;5BE7;5BE7;5BE7;5BE7; # (寧; 寧; 寧; 寧; 寧; ) CJK COMPATIBILITY IDEOGRAPH-F9AA +F9AB;5DBA;5DBA;5DBA;5DBA; # (嶺; 嶺; 嶺; 嶺; 嶺; ) CJK COMPATIBILITY IDEOGRAPH-F9AB +F9AC;601C;601C;601C;601C; # (怜; 怜; 怜; 怜; 怜; ) CJK COMPATIBILITY IDEOGRAPH-F9AC +F9AD;73B2;73B2;73B2;73B2; # (玲; 玲; 玲; 玲; 玲; ) CJK COMPATIBILITY IDEOGRAPH-F9AD +F9AE;7469;7469;7469;7469; # (瑩; 瑩; 瑩; 瑩; 瑩; ) CJK COMPATIBILITY IDEOGRAPH-F9AE +F9AF;7F9A;7F9A;7F9A;7F9A; # (羚; 羚; 羚; 羚; 羚; ) CJK COMPATIBILITY IDEOGRAPH-F9AF +F9B0;8046;8046;8046;8046; # (聆; 聆; 聆; 聆; 聆; ) CJK COMPATIBILITY IDEOGRAPH-F9B0 +F9B1;9234;9234;9234;9234; # (鈴; 鈴; 鈴; 鈴; 鈴; ) CJK COMPATIBILITY IDEOGRAPH-F9B1 +F9B2;96F6;96F6;96F6;96F6; # (零; 零; 零; 零; 零; ) CJK COMPATIBILITY IDEOGRAPH-F9B2 +F9B3;9748;9748;9748;9748; # (靈; 靈; 靈; 靈; 靈; ) CJK COMPATIBILITY IDEOGRAPH-F9B3 +F9B4;9818;9818;9818;9818; # (領; 領; 領; 領; 領; ) CJK COMPATIBILITY IDEOGRAPH-F9B4 +F9B5;4F8B;4F8B;4F8B;4F8B; # (例; 例; 例; 例; 例; ) CJK COMPATIBILITY IDEOGRAPH-F9B5 +F9B6;79AE;79AE;79AE;79AE; # (禮; 禮; 禮; 禮; 禮; ) CJK COMPATIBILITY IDEOGRAPH-F9B6 +F9B7;91B4;91B4;91B4;91B4; # (醴; 醴; 醴; 醴; 醴; ) CJK COMPATIBILITY IDEOGRAPH-F9B7 +F9B8;96B8;96B8;96B8;96B8; # (隸; 隸; 隸; 隸; 隸; ) CJK COMPATIBILITY IDEOGRAPH-F9B8 +F9B9;60E1;60E1;60E1;60E1; # (惡; 惡; 惡; 惡; 惡; ) CJK COMPATIBILITY IDEOGRAPH-F9B9 +F9BA;4E86;4E86;4E86;4E86; # (了; 了; 了; 了; 了; ) CJK COMPATIBILITY IDEOGRAPH-F9BA +F9BB;50DA;50DA;50DA;50DA; # (僚; 僚; 僚; 僚; 僚; ) CJK COMPATIBILITY IDEOGRAPH-F9BB +F9BC;5BEE;5BEE;5BEE;5BEE; # (寮; 寮; 寮; 寮; 寮; ) CJK COMPATIBILITY IDEOGRAPH-F9BC +F9BD;5C3F;5C3F;5C3F;5C3F; # (尿; 尿; 尿; 尿; 尿; ) CJK COMPATIBILITY IDEOGRAPH-F9BD +F9BE;6599;6599;6599;6599; # (料; 料; 料; 料; 料; ) CJK COMPATIBILITY IDEOGRAPH-F9BE +F9BF;6A02;6A02;6A02;6A02; # (樂; 樂; 樂; 樂; 樂; ) CJK COMPATIBILITY IDEOGRAPH-F9BF +F9C0;71CE;71CE;71CE;71CE; # (燎; 燎; 燎; 燎; 燎; ) CJK COMPATIBILITY IDEOGRAPH-F9C0 +F9C1;7642;7642;7642;7642; # (療; 療; 療; 療; 療; ) CJK COMPATIBILITY IDEOGRAPH-F9C1 +F9C2;84FC;84FC;84FC;84FC; # (蓼; 蓼; 蓼; 蓼; 蓼; ) CJK COMPATIBILITY IDEOGRAPH-F9C2 +F9C3;907C;907C;907C;907C; # (遼; 遼; 遼; 遼; 遼; ) CJK COMPATIBILITY IDEOGRAPH-F9C3 +F9C4;9F8D;9F8D;9F8D;9F8D; # (龍; 龍; 龍; 龍; 龍; ) CJK COMPATIBILITY IDEOGRAPH-F9C4 +F9C5;6688;6688;6688;6688; # (暈; 暈; 暈; 暈; 暈; ) CJK COMPATIBILITY IDEOGRAPH-F9C5 +F9C6;962E;962E;962E;962E; # (阮; 阮; 阮; 阮; 阮; ) CJK COMPATIBILITY IDEOGRAPH-F9C6 +F9C7;5289;5289;5289;5289; # (劉; 劉; 劉; 劉; 劉; ) CJK COMPATIBILITY IDEOGRAPH-F9C7 +F9C8;677B;677B;677B;677B; # (杻; 杻; 杻; 杻; 杻; ) CJK COMPATIBILITY IDEOGRAPH-F9C8 +F9C9;67F3;67F3;67F3;67F3; # (柳; 柳; 柳; 柳; 柳; ) CJK COMPATIBILITY IDEOGRAPH-F9C9 +F9CA;6D41;6D41;6D41;6D41; # (流; 流; 流; 流; 流; ) CJK COMPATIBILITY IDEOGRAPH-F9CA +F9CB;6E9C;6E9C;6E9C;6E9C; # (溜; 溜; 溜; 溜; 溜; ) CJK COMPATIBILITY IDEOGRAPH-F9CB +F9CC;7409;7409;7409;7409; # (琉; 琉; 琉; 琉; 琉; ) CJK COMPATIBILITY IDEOGRAPH-F9CC +F9CD;7559;7559;7559;7559; # (留; 留; 留; 留; 留; ) CJK COMPATIBILITY IDEOGRAPH-F9CD +F9CE;786B;786B;786B;786B; # (硫; 硫; 硫; 硫; 硫; ) CJK COMPATIBILITY IDEOGRAPH-F9CE +F9CF;7D10;7D10;7D10;7D10; # (紐; 紐; 紐; 紐; 紐; ) CJK COMPATIBILITY IDEOGRAPH-F9CF +F9D0;985E;985E;985E;985E; # (類; 類; 類; 類; 類; ) CJK COMPATIBILITY IDEOGRAPH-F9D0 +F9D1;516D;516D;516D;516D; # (六; 六; 六; 六; 六; ) CJK COMPATIBILITY IDEOGRAPH-F9D1 +F9D2;622E;622E;622E;622E; # (戮; 戮; 戮; 戮; 戮; ) CJK COMPATIBILITY IDEOGRAPH-F9D2 +F9D3;9678;9678;9678;9678; # (陸; 陸; 陸; 陸; 陸; ) CJK COMPATIBILITY IDEOGRAPH-F9D3 +F9D4;502B;502B;502B;502B; # (倫; 倫; 倫; 倫; 倫; ) CJK COMPATIBILITY IDEOGRAPH-F9D4 +F9D5;5D19;5D19;5D19;5D19; # (崙; 崙; 崙; 崙; 崙; ) CJK COMPATIBILITY IDEOGRAPH-F9D5 +F9D6;6DEA;6DEA;6DEA;6DEA; # (淪; 淪; 淪; 淪; 淪; ) CJK COMPATIBILITY IDEOGRAPH-F9D6 +F9D7;8F2A;8F2A;8F2A;8F2A; # (輪; 輪; 輪; 輪; 輪; ) CJK COMPATIBILITY IDEOGRAPH-F9D7 +F9D8;5F8B;5F8B;5F8B;5F8B; # (律; 律; 律; 律; 律; ) CJK COMPATIBILITY IDEOGRAPH-F9D8 +F9D9;6144;6144;6144;6144; # (慄; 慄; 慄; 慄; 慄; ) CJK COMPATIBILITY IDEOGRAPH-F9D9 +F9DA;6817;6817;6817;6817; # (栗; 栗; 栗; 栗; 栗; ) CJK COMPATIBILITY IDEOGRAPH-F9DA +F9DB;7387;7387;7387;7387; # (率; 率; 率; 率; 率; ) CJK COMPATIBILITY IDEOGRAPH-F9DB +F9DC;9686;9686;9686;9686; # (隆; 隆; 隆; 隆; 隆; ) CJK COMPATIBILITY IDEOGRAPH-F9DC +F9DD;5229;5229;5229;5229; # (利; 利; 利; 利; 利; ) CJK COMPATIBILITY IDEOGRAPH-F9DD +F9DE;540F;540F;540F;540F; # (吏; 吏; 吏; 吏; 吏; ) CJK COMPATIBILITY IDEOGRAPH-F9DE +F9DF;5C65;5C65;5C65;5C65; # (履; 履; 履; 履; 履; ) CJK COMPATIBILITY IDEOGRAPH-F9DF +F9E0;6613;6613;6613;6613; # (易; 易; 易; 易; 易; ) CJK COMPATIBILITY IDEOGRAPH-F9E0 +F9E1;674E;674E;674E;674E; # (李; 李; 李; 李; 李; ) CJK COMPATIBILITY IDEOGRAPH-F9E1 +F9E2;68A8;68A8;68A8;68A8; # (梨; 梨; 梨; 梨; 梨; ) CJK COMPATIBILITY IDEOGRAPH-F9E2 +F9E3;6CE5;6CE5;6CE5;6CE5; # (泥; 泥; 泥; 泥; 泥; ) CJK COMPATIBILITY IDEOGRAPH-F9E3 +F9E4;7406;7406;7406;7406; # (理; 理; 理; 理; 理; ) CJK COMPATIBILITY IDEOGRAPH-F9E4 +F9E5;75E2;75E2;75E2;75E2; # (痢; 痢; 痢; 痢; 痢; ) CJK COMPATIBILITY IDEOGRAPH-F9E5 +F9E6;7F79;7F79;7F79;7F79; # (罹; 罹; 罹; 罹; 罹; ) CJK COMPATIBILITY IDEOGRAPH-F9E6 +F9E7;88CF;88CF;88CF;88CF; # (裏; 裏; 裏; 裏; 裏; ) CJK COMPATIBILITY IDEOGRAPH-F9E7 +F9E8;88E1;88E1;88E1;88E1; # (裡; 裡; 裡; 裡; 裡; ) CJK COMPATIBILITY IDEOGRAPH-F9E8 +F9E9;91CC;91CC;91CC;91CC; # (里; 里; 里; 里; 里; ) CJK COMPATIBILITY IDEOGRAPH-F9E9 +F9EA;96E2;96E2;96E2;96E2; # (離; 離; 離; 離; 離; ) CJK COMPATIBILITY IDEOGRAPH-F9EA +F9EB;533F;533F;533F;533F; # (匿; 匿; 匿; 匿; 匿; ) CJK COMPATIBILITY IDEOGRAPH-F9EB +F9EC;6EBA;6EBA;6EBA;6EBA; # (溺; 溺; 溺; 溺; 溺; ) CJK COMPATIBILITY IDEOGRAPH-F9EC +F9ED;541D;541D;541D;541D; # (吝; 吝; 吝; 吝; 吝; ) CJK COMPATIBILITY IDEOGRAPH-F9ED +F9EE;71D0;71D0;71D0;71D0; # (燐; 燐; 燐; 燐; 燐; ) CJK COMPATIBILITY IDEOGRAPH-F9EE +F9EF;7498;7498;7498;7498; # (璘; 璘; 璘; 璘; 璘; ) CJK COMPATIBILITY IDEOGRAPH-F9EF +F9F0;85FA;85FA;85FA;85FA; # (藺; 藺; 藺; 藺; 藺; ) CJK COMPATIBILITY IDEOGRAPH-F9F0 +F9F1;96A3;96A3;96A3;96A3; # (隣; 隣; 隣; 隣; 隣; ) CJK COMPATIBILITY IDEOGRAPH-F9F1 +F9F2;9C57;9C57;9C57;9C57; # (鱗; 鱗; 鱗; 鱗; 鱗; ) CJK COMPATIBILITY IDEOGRAPH-F9F2 +F9F3;9E9F;9E9F;9E9F;9E9F; # (麟; 麟; 麟; 麟; 麟; ) CJK COMPATIBILITY IDEOGRAPH-F9F3 +F9F4;6797;6797;6797;6797; # (林; 林; 林; 林; 林; ) CJK COMPATIBILITY IDEOGRAPH-F9F4 +F9F5;6DCB;6DCB;6DCB;6DCB; # (淋; 淋; 淋; 淋; 淋; ) CJK COMPATIBILITY IDEOGRAPH-F9F5 +F9F6;81E8;81E8;81E8;81E8; # (臨; 臨; 臨; 臨; 臨; ) CJK COMPATIBILITY IDEOGRAPH-F9F6 +F9F7;7ACB;7ACB;7ACB;7ACB; # (立; 立; 立; 立; 立; ) CJK COMPATIBILITY IDEOGRAPH-F9F7 +F9F8;7B20;7B20;7B20;7B20; # (笠; 笠; 笠; 笠; 笠; ) CJK COMPATIBILITY IDEOGRAPH-F9F8 +F9F9;7C92;7C92;7C92;7C92; # (粒; 粒; 粒; 粒; 粒; ) CJK COMPATIBILITY IDEOGRAPH-F9F9 +F9FA;72C0;72C0;72C0;72C0; # (狀; 狀; 狀; 狀; 狀; ) CJK COMPATIBILITY IDEOGRAPH-F9FA +F9FB;7099;7099;7099;7099; # (炙; 炙; 炙; 炙; 炙; ) CJK COMPATIBILITY IDEOGRAPH-F9FB +F9FC;8B58;8B58;8B58;8B58; # (識; 識; 識; 識; 識; ) CJK COMPATIBILITY IDEOGRAPH-F9FC +F9FD;4EC0;4EC0;4EC0;4EC0; # (什; 什; 什; 什; 什; ) CJK COMPATIBILITY IDEOGRAPH-F9FD +F9FE;8336;8336;8336;8336; # (茶; 茶; 茶; 茶; 茶; ) CJK COMPATIBILITY IDEOGRAPH-F9FE +F9FF;523A;523A;523A;523A; # (刺; 刺; 刺; 刺; 刺; ) CJK COMPATIBILITY IDEOGRAPH-F9FF +FA00;5207;5207;5207;5207; # (切; 切; 切; 切; 切; ) CJK COMPATIBILITY IDEOGRAPH-FA00 +FA01;5EA6;5EA6;5EA6;5EA6; # (度; 度; 度; 度; 度; ) CJK COMPATIBILITY IDEOGRAPH-FA01 +FA02;62D3;62D3;62D3;62D3; # (拓; 拓; 拓; 拓; 拓; ) CJK COMPATIBILITY IDEOGRAPH-FA02 +FA03;7CD6;7CD6;7CD6;7CD6; # (糖; 糖; 糖; 糖; 糖; ) CJK COMPATIBILITY IDEOGRAPH-FA03 +FA04;5B85;5B85;5B85;5B85; # (宅; 宅; 宅; 宅; 宅; ) CJK COMPATIBILITY IDEOGRAPH-FA04 +FA05;6D1E;6D1E;6D1E;6D1E; # (洞; 洞; 洞; 洞; 洞; ) CJK COMPATIBILITY IDEOGRAPH-FA05 +FA06;66B4;66B4;66B4;66B4; # (暴; 暴; 暴; 暴; 暴; ) CJK COMPATIBILITY IDEOGRAPH-FA06 +FA07;8F3B;8F3B;8F3B;8F3B; # (輻; 輻; 輻; 輻; 輻; ) CJK COMPATIBILITY IDEOGRAPH-FA07 +FA08;884C;884C;884C;884C; # (行; 行; 行; 行; 行; ) CJK COMPATIBILITY IDEOGRAPH-FA08 +FA09;964D;964D;964D;964D; # (降; 降; 降; 降; 降; ) CJK COMPATIBILITY IDEOGRAPH-FA09 +FA0A;898B;898B;898B;898B; # (見; 見; 見; 見; 見; ) CJK COMPATIBILITY IDEOGRAPH-FA0A +FA0B;5ED3;5ED3;5ED3;5ED3; # (廓; 廓; 廓; 廓; 廓; ) CJK COMPATIBILITY IDEOGRAPH-FA0B +FA0C;5140;5140;5140;5140; # (兀; 兀; 兀; 兀; 兀; ) CJK COMPATIBILITY IDEOGRAPH-FA0C +FA0D;55C0;55C0;55C0;55C0; # (嗀; 嗀; 嗀; 嗀; 嗀; ) CJK COMPATIBILITY IDEOGRAPH-FA0D +FA10;585A;585A;585A;585A; # (塚; 塚; 塚; 塚; 塚; ) CJK COMPATIBILITY IDEOGRAPH-FA10 +FA12;6674;6674;6674;6674; # (晴; 晴; 晴; 晴; 晴; ) CJK COMPATIBILITY IDEOGRAPH-FA12 +FA15;51DE;51DE;51DE;51DE; # (凞; 凞; 凞; 凞; 凞; ) CJK COMPATIBILITY IDEOGRAPH-FA15 +FA16;732A;732A;732A;732A; # (猪; 猪; 猪; 猪; 猪; ) CJK COMPATIBILITY IDEOGRAPH-FA16 +FA17;76CA;76CA;76CA;76CA; # (益; 益; 益; 益; 益; ) CJK COMPATIBILITY IDEOGRAPH-FA17 +FA18;793C;793C;793C;793C; # (礼; 礼; 礼; 礼; 礼; ) CJK COMPATIBILITY IDEOGRAPH-FA18 +FA19;795E;795E;795E;795E; # (神; 神; 神; 神; 神; ) CJK COMPATIBILITY IDEOGRAPH-FA19 +FA1A;7965;7965;7965;7965; # (祥; 祥; 祥; 祥; 祥; ) CJK COMPATIBILITY IDEOGRAPH-FA1A +FA1B;798F;798F;798F;798F; # (福; 福; 福; 福; 福; ) CJK COMPATIBILITY IDEOGRAPH-FA1B +FA1C;9756;9756;9756;9756; # (靖; 靖; 靖; 靖; 靖; ) CJK COMPATIBILITY IDEOGRAPH-FA1C +FA1D;7CBE;7CBE;7CBE;7CBE; # (精; 精; 精; 精; 精; ) CJK COMPATIBILITY IDEOGRAPH-FA1D +FA1E;7FBD;7FBD;7FBD;7FBD; # (羽; 羽; 羽; 羽; 羽; ) CJK COMPATIBILITY IDEOGRAPH-FA1E +FA20;8612;8612;8612;8612; # (蘒; 蘒; 蘒; 蘒; 蘒; ) CJK COMPATIBILITY IDEOGRAPH-FA20 +FA22;8AF8;8AF8;8AF8;8AF8; # (諸; 諸; 諸; 諸; 諸; ) CJK COMPATIBILITY IDEOGRAPH-FA22 +FA25;9038;9038;9038;9038; # (逸; 逸; 逸; 逸; 逸; ) CJK COMPATIBILITY IDEOGRAPH-FA25 +FA26;90FD;90FD;90FD;90FD; # (都; 都; 都; 都; 都; ) CJK COMPATIBILITY IDEOGRAPH-FA26 +FA2A;98EF;98EF;98EF;98EF; # (飯; 飯; 飯; 飯; 飯; ) CJK COMPATIBILITY IDEOGRAPH-FA2A +FA2B;98FC;98FC;98FC;98FC; # (飼; 飼; 飼; 飼; 飼; ) CJK COMPATIBILITY IDEOGRAPH-FA2B +FA2C;9928;9928;9928;9928; # (館; 館; 館; 館; 館; ) CJK COMPATIBILITY IDEOGRAPH-FA2C +FA2D;9DB4;9DB4;9DB4;9DB4; # (鶴; 鶴; 鶴; 鶴; 鶴; ) CJK COMPATIBILITY IDEOGRAPH-FA2D +FA2E;90DE;90DE;90DE;90DE; # (郞; 郞; 郞; 郞; 郞; ) CJK COMPATIBILITY IDEOGRAPH-FA2E +FA2F;96B7;96B7;96B7;96B7; # (隷; 隷; 隷; 隷; 隷; ) CJK COMPATIBILITY IDEOGRAPH-FA2F +FA30;4FAE;4FAE;4FAE;4FAE; # (侮; 侮; 侮; 侮; 侮; ) CJK COMPATIBILITY IDEOGRAPH-FA30 +FA31;50E7;50E7;50E7;50E7; # (僧; 僧; 僧; 僧; 僧; ) CJK COMPATIBILITY IDEOGRAPH-FA31 +FA32;514D;514D;514D;514D; # (免; 免; 免; 免; 免; ) CJK COMPATIBILITY IDEOGRAPH-FA32 +FA33;52C9;52C9;52C9;52C9; # (勉; 勉; 勉; 勉; 勉; ) CJK COMPATIBILITY IDEOGRAPH-FA33 +FA34;52E4;52E4;52E4;52E4; # (勤; 勤; 勤; 勤; 勤; ) CJK COMPATIBILITY IDEOGRAPH-FA34 +FA35;5351;5351;5351;5351; # (卑; 卑; 卑; 卑; 卑; ) CJK COMPATIBILITY IDEOGRAPH-FA35 +FA36;559D;559D;559D;559D; # (喝; 喝; 喝; 喝; 喝; ) CJK COMPATIBILITY IDEOGRAPH-FA36 +FA37;5606;5606;5606;5606; # (嘆; 嘆; 嘆; 嘆; 嘆; ) CJK COMPATIBILITY IDEOGRAPH-FA37 +FA38;5668;5668;5668;5668; # (器; 器; 器; 器; 器; ) CJK COMPATIBILITY IDEOGRAPH-FA38 +FA39;5840;5840;5840;5840; # (塀; 塀; 塀; 塀; 塀; ) CJK COMPATIBILITY IDEOGRAPH-FA39 +FA3A;58A8;58A8;58A8;58A8; # (墨; 墨; 墨; 墨; 墨; ) CJK COMPATIBILITY IDEOGRAPH-FA3A +FA3B;5C64;5C64;5C64;5C64; # (層; 層; 層; 層; 層; ) CJK COMPATIBILITY IDEOGRAPH-FA3B +FA3C;5C6E;5C6E;5C6E;5C6E; # (屮; 屮; 屮; 屮; 屮; ) CJK COMPATIBILITY IDEOGRAPH-FA3C +FA3D;6094;6094;6094;6094; # (悔; 悔; 悔; 悔; 悔; ) CJK COMPATIBILITY IDEOGRAPH-FA3D +FA3E;6168;6168;6168;6168; # (慨; 慨; 慨; 慨; 慨; ) CJK COMPATIBILITY IDEOGRAPH-FA3E +FA3F;618E;618E;618E;618E; # (憎; 憎; 憎; 憎; 憎; ) CJK COMPATIBILITY IDEOGRAPH-FA3F +FA40;61F2;61F2;61F2;61F2; # (懲; 懲; 懲; 懲; 懲; ) CJK COMPATIBILITY IDEOGRAPH-FA40 +FA41;654F;654F;654F;654F; # (敏; 敏; 敏; 敏; 敏; ) CJK COMPATIBILITY IDEOGRAPH-FA41 +FA42;65E2;65E2;65E2;65E2; # (既; 既; 既; 既; 既; ) CJK COMPATIBILITY IDEOGRAPH-FA42 +FA43;6691;6691;6691;6691; # (暑; 暑; 暑; 暑; 暑; ) CJK COMPATIBILITY IDEOGRAPH-FA43 +FA44;6885;6885;6885;6885; # (梅; 梅; 梅; 梅; 梅; ) CJK COMPATIBILITY IDEOGRAPH-FA44 +FA45;6D77;6D77;6D77;6D77; # (海; 海; 海; 海; 海; ) CJK COMPATIBILITY IDEOGRAPH-FA45 +FA46;6E1A;6E1A;6E1A;6E1A; # (渚; 渚; 渚; 渚; 渚; ) CJK COMPATIBILITY IDEOGRAPH-FA46 +FA47;6F22;6F22;6F22;6F22; # (漢; 漢; 漢; 漢; 漢; ) CJK COMPATIBILITY IDEOGRAPH-FA47 +FA48;716E;716E;716E;716E; # (煮; 煮; 煮; 煮; 煮; ) CJK COMPATIBILITY IDEOGRAPH-FA48 +FA49;722B;722B;722B;722B; # (爫; 爫; 爫; 爫; 爫; ) CJK COMPATIBILITY IDEOGRAPH-FA49 +FA4A;7422;7422;7422;7422; # (琢; 琢; 琢; 琢; 琢; ) CJK COMPATIBILITY IDEOGRAPH-FA4A +FA4B;7891;7891;7891;7891; # (碑; 碑; 碑; 碑; 碑; ) CJK COMPATIBILITY IDEOGRAPH-FA4B +FA4C;793E;793E;793E;793E; # (社; 社; 社; 社; 社; ) CJK COMPATIBILITY IDEOGRAPH-FA4C +FA4D;7949;7949;7949;7949; # (祉; 祉; 祉; 祉; 祉; ) CJK COMPATIBILITY IDEOGRAPH-FA4D +FA4E;7948;7948;7948;7948; # (祈; 祈; 祈; 祈; 祈; ) CJK COMPATIBILITY IDEOGRAPH-FA4E +FA4F;7950;7950;7950;7950; # (祐; 祐; 祐; 祐; 祐; ) CJK COMPATIBILITY IDEOGRAPH-FA4F +FA50;7956;7956;7956;7956; # (祖; 祖; 祖; 祖; 祖; ) CJK COMPATIBILITY IDEOGRAPH-FA50 +FA51;795D;795D;795D;795D; # (祝; 祝; 祝; 祝; 祝; ) CJK COMPATIBILITY IDEOGRAPH-FA51 +FA52;798D;798D;798D;798D; # (禍; 禍; 禍; 禍; 禍; ) CJK COMPATIBILITY IDEOGRAPH-FA52 +FA53;798E;798E;798E;798E; # (禎; 禎; 禎; 禎; 禎; ) CJK COMPATIBILITY IDEOGRAPH-FA53 +FA54;7A40;7A40;7A40;7A40; # (穀; 穀; 穀; 穀; 穀; ) CJK COMPATIBILITY IDEOGRAPH-FA54 +FA55;7A81;7A81;7A81;7A81; # (突; 突; 突; 突; 突; ) CJK COMPATIBILITY IDEOGRAPH-FA55 +FA56;7BC0;7BC0;7BC0;7BC0; # (節; 節; 節; 節; 節; ) CJK COMPATIBILITY IDEOGRAPH-FA56 +FA57;7DF4;7DF4;7DF4;7DF4; # (練; 練; 練; 練; 練; ) CJK COMPATIBILITY IDEOGRAPH-FA57 +FA58;7E09;7E09;7E09;7E09; # (縉; 縉; 縉; 縉; 縉; ) CJK COMPATIBILITY IDEOGRAPH-FA58 +FA59;7E41;7E41;7E41;7E41; # (繁; 繁; 繁; 繁; 繁; ) CJK COMPATIBILITY IDEOGRAPH-FA59 +FA5A;7F72;7F72;7F72;7F72; # (署; 署; 署; 署; 署; ) CJK COMPATIBILITY IDEOGRAPH-FA5A +FA5B;8005;8005;8005;8005; # (者; 者; 者; 者; 者; ) CJK COMPATIBILITY IDEOGRAPH-FA5B +FA5C;81ED;81ED;81ED;81ED; # (臭; 臭; 臭; 臭; 臭; ) CJK COMPATIBILITY IDEOGRAPH-FA5C +FA5D;8279;8279;8279;8279; # (艹; 艹; 艹; 艹; 艹; ) CJK COMPATIBILITY IDEOGRAPH-FA5D +FA5E;8279;8279;8279;8279; # (艹; 艹; 艹; 艹; 艹; ) CJK COMPATIBILITY IDEOGRAPH-FA5E +FA5F;8457;8457;8457;8457; # (著; 著; 著; 著; 著; ) CJK COMPATIBILITY IDEOGRAPH-FA5F +FA60;8910;8910;8910;8910; # (褐; 褐; 褐; 褐; 褐; ) CJK COMPATIBILITY IDEOGRAPH-FA60 +FA61;8996;8996;8996;8996; # (視; 視; 視; 視; 視; ) CJK COMPATIBILITY IDEOGRAPH-FA61 +FA62;8B01;8B01;8B01;8B01; # (謁; 謁; 謁; 謁; 謁; ) CJK COMPATIBILITY IDEOGRAPH-FA62 +FA63;8B39;8B39;8B39;8B39; # (謹; 謹; 謹; 謹; 謹; ) CJK COMPATIBILITY IDEOGRAPH-FA63 +FA64;8CD3;8CD3;8CD3;8CD3; # (賓; 賓; 賓; 賓; 賓; ) CJK COMPATIBILITY IDEOGRAPH-FA64 +FA65;8D08;8D08;8D08;8D08; # (贈; 贈; 贈; 贈; 贈; ) CJK COMPATIBILITY IDEOGRAPH-FA65 +FA66;8FB6;8FB6;8FB6;8FB6; # (辶; 辶; 辶; 辶; 辶; ) CJK COMPATIBILITY IDEOGRAPH-FA66 +FA67;9038;9038;9038;9038; # (逸; 逸; 逸; 逸; 逸; ) CJK COMPATIBILITY IDEOGRAPH-FA67 +FA68;96E3;96E3;96E3;96E3; # (難; 難; 難; 難; 難; ) CJK COMPATIBILITY IDEOGRAPH-FA68 +FA69;97FF;97FF;97FF;97FF; # (響; 響; 響; 響; 響; ) CJK COMPATIBILITY IDEOGRAPH-FA69 +FA6A;983B;983B;983B;983B; # (頻; 頻; 頻; 頻; 頻; ) CJK COMPATIBILITY IDEOGRAPH-FA6A +FA6B;6075;6075;6075;6075; # (恵; 恵; 恵; 恵; 恵; ) CJK COMPATIBILITY IDEOGRAPH-FA6B +FA6C;242EE;242EE;242EE;242EE; # (𤋮; 𤋮; 𤋮; 𤋮; 𤋮; ) CJK COMPATIBILITY IDEOGRAPH-FA6C +FA6D;8218;8218;8218;8218; # (舘; 舘; 舘; 舘; 舘; ) CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70;4E26;4E26;4E26;4E26; # (並; 並; 並; 並; 並; ) CJK COMPATIBILITY IDEOGRAPH-FA70 +FA71;51B5;51B5;51B5;51B5; # (况; 况; 况; 况; 况; ) CJK COMPATIBILITY IDEOGRAPH-FA71 +FA72;5168;5168;5168;5168; # (全; 全; 全; 全; 全; ) CJK COMPATIBILITY IDEOGRAPH-FA72 +FA73;4F80;4F80;4F80;4F80; # (侀; 侀; 侀; 侀; 侀; ) CJK COMPATIBILITY IDEOGRAPH-FA73 +FA74;5145;5145;5145;5145; # (充; 充; 充; 充; 充; ) CJK COMPATIBILITY IDEOGRAPH-FA74 +FA75;5180;5180;5180;5180; # (冀; 冀; 冀; 冀; 冀; ) CJK COMPATIBILITY IDEOGRAPH-FA75 +FA76;52C7;52C7;52C7;52C7; # (勇; 勇; 勇; 勇; 勇; ) CJK COMPATIBILITY IDEOGRAPH-FA76 +FA77;52FA;52FA;52FA;52FA; # (勺; 勺; 勺; 勺; 勺; ) CJK COMPATIBILITY IDEOGRAPH-FA77 +FA78;559D;559D;559D;559D; # (喝; 喝; 喝; 喝; 喝; ) CJK COMPATIBILITY IDEOGRAPH-FA78 +FA79;5555;5555;5555;5555; # (啕; 啕; 啕; 啕; 啕; ) CJK COMPATIBILITY IDEOGRAPH-FA79 +FA7A;5599;5599;5599;5599; # (喙; 喙; 喙; 喙; 喙; ) CJK COMPATIBILITY IDEOGRAPH-FA7A +FA7B;55E2;55E2;55E2;55E2; # (嗢; 嗢; 嗢; 嗢; 嗢; ) CJK COMPATIBILITY IDEOGRAPH-FA7B +FA7C;585A;585A;585A;585A; # (塚; 塚; 塚; 塚; 塚; ) CJK COMPATIBILITY IDEOGRAPH-FA7C +FA7D;58B3;58B3;58B3;58B3; # (墳; 墳; 墳; 墳; 墳; ) CJK COMPATIBILITY IDEOGRAPH-FA7D +FA7E;5944;5944;5944;5944; # (奄; 奄; 奄; 奄; 奄; ) CJK COMPATIBILITY IDEOGRAPH-FA7E +FA7F;5954;5954;5954;5954; # (奔; 奔; 奔; 奔; 奔; ) CJK COMPATIBILITY IDEOGRAPH-FA7F +FA80;5A62;5A62;5A62;5A62; # (婢; 婢; 婢; 婢; 婢; ) CJK COMPATIBILITY IDEOGRAPH-FA80 +FA81;5B28;5B28;5B28;5B28; # (嬨; 嬨; 嬨; 嬨; 嬨; ) CJK COMPATIBILITY IDEOGRAPH-FA81 +FA82;5ED2;5ED2;5ED2;5ED2; # (廒; 廒; 廒; 廒; 廒; ) CJK COMPATIBILITY IDEOGRAPH-FA82 +FA83;5ED9;5ED9;5ED9;5ED9; # (廙; 廙; 廙; 廙; 廙; ) CJK COMPATIBILITY IDEOGRAPH-FA83 +FA84;5F69;5F69;5F69;5F69; # (彩; 彩; 彩; 彩; 彩; ) CJK COMPATIBILITY IDEOGRAPH-FA84 +FA85;5FAD;5FAD;5FAD;5FAD; # (徭; 徭; 徭; 徭; 徭; ) CJK COMPATIBILITY IDEOGRAPH-FA85 +FA86;60D8;60D8;60D8;60D8; # (惘; 惘; 惘; 惘; 惘; ) CJK COMPATIBILITY IDEOGRAPH-FA86 +FA87;614E;614E;614E;614E; # (慎; 慎; 慎; 慎; 慎; ) CJK COMPATIBILITY IDEOGRAPH-FA87 +FA88;6108;6108;6108;6108; # (愈; 愈; 愈; 愈; 愈; ) CJK COMPATIBILITY IDEOGRAPH-FA88 +FA89;618E;618E;618E;618E; # (憎; 憎; 憎; 憎; 憎; ) CJK COMPATIBILITY IDEOGRAPH-FA89 +FA8A;6160;6160;6160;6160; # (慠; 慠; 慠; 慠; 慠; ) CJK COMPATIBILITY IDEOGRAPH-FA8A +FA8B;61F2;61F2;61F2;61F2; # (懲; 懲; 懲; 懲; 懲; ) CJK COMPATIBILITY IDEOGRAPH-FA8B +FA8C;6234;6234;6234;6234; # (戴; 戴; 戴; 戴; 戴; ) CJK COMPATIBILITY IDEOGRAPH-FA8C +FA8D;63C4;63C4;63C4;63C4; # (揄; 揄; 揄; 揄; 揄; ) CJK COMPATIBILITY IDEOGRAPH-FA8D +FA8E;641C;641C;641C;641C; # (搜; 搜; 搜; 搜; 搜; ) CJK COMPATIBILITY IDEOGRAPH-FA8E +FA8F;6452;6452;6452;6452; # (摒; 摒; 摒; 摒; 摒; ) CJK COMPATIBILITY IDEOGRAPH-FA8F +FA90;6556;6556;6556;6556; # (敖; 敖; 敖; 敖; 敖; ) CJK COMPATIBILITY IDEOGRAPH-FA90 +FA91;6674;6674;6674;6674; # (晴; 晴; 晴; 晴; 晴; ) CJK COMPATIBILITY IDEOGRAPH-FA91 +FA92;6717;6717;6717;6717; # (朗; 朗; 朗; 朗; 朗; ) CJK COMPATIBILITY IDEOGRAPH-FA92 +FA93;671B;671B;671B;671B; # (望; 望; 望; 望; 望; ) CJK COMPATIBILITY IDEOGRAPH-FA93 +FA94;6756;6756;6756;6756; # (杖; 杖; 杖; 杖; 杖; ) CJK COMPATIBILITY IDEOGRAPH-FA94 +FA95;6B79;6B79;6B79;6B79; # (歹; 歹; 歹; 歹; 歹; ) CJK COMPATIBILITY IDEOGRAPH-FA95 +FA96;6BBA;6BBA;6BBA;6BBA; # (殺; 殺; 殺; 殺; 殺; ) CJK COMPATIBILITY IDEOGRAPH-FA96 +FA97;6D41;6D41;6D41;6D41; # (流; 流; 流; 流; 流; ) CJK COMPATIBILITY IDEOGRAPH-FA97 +FA98;6EDB;6EDB;6EDB;6EDB; # (滛; 滛; 滛; 滛; 滛; ) CJK COMPATIBILITY IDEOGRAPH-FA98 +FA99;6ECB;6ECB;6ECB;6ECB; # (滋; 滋; 滋; 滋; 滋; ) CJK COMPATIBILITY IDEOGRAPH-FA99 +FA9A;6F22;6F22;6F22;6F22; # (漢; 漢; 漢; 漢; 漢; ) CJK COMPATIBILITY IDEOGRAPH-FA9A +FA9B;701E;701E;701E;701E; # (瀞; 瀞; 瀞; 瀞; 瀞; ) CJK COMPATIBILITY IDEOGRAPH-FA9B +FA9C;716E;716E;716E;716E; # (煮; 煮; 煮; 煮; 煮; ) CJK COMPATIBILITY IDEOGRAPH-FA9C +FA9D;77A7;77A7;77A7;77A7; # (瞧; 瞧; 瞧; 瞧; 瞧; ) CJK COMPATIBILITY IDEOGRAPH-FA9D +FA9E;7235;7235;7235;7235; # (爵; 爵; 爵; 爵; 爵; ) CJK COMPATIBILITY IDEOGRAPH-FA9E +FA9F;72AF;72AF;72AF;72AF; # (犯; 犯; 犯; 犯; 犯; ) CJK COMPATIBILITY IDEOGRAPH-FA9F +FAA0;732A;732A;732A;732A; # (猪; 猪; 猪; 猪; 猪; ) CJK COMPATIBILITY IDEOGRAPH-FAA0 +FAA1;7471;7471;7471;7471; # (瑱; 瑱; 瑱; 瑱; 瑱; ) CJK COMPATIBILITY IDEOGRAPH-FAA1 +FAA2;7506;7506;7506;7506; # (甆; 甆; 甆; 甆; 甆; ) CJK COMPATIBILITY IDEOGRAPH-FAA2 +FAA3;753B;753B;753B;753B; # (画; 画; 画; 画; 画; ) CJK COMPATIBILITY IDEOGRAPH-FAA3 +FAA4;761D;761D;761D;761D; # (瘝; 瘝; 瘝; 瘝; 瘝; ) CJK COMPATIBILITY IDEOGRAPH-FAA4 +FAA5;761F;761F;761F;761F; # (瘟; 瘟; 瘟; 瘟; 瘟; ) CJK COMPATIBILITY IDEOGRAPH-FAA5 +FAA6;76CA;76CA;76CA;76CA; # (益; 益; 益; 益; 益; ) CJK COMPATIBILITY IDEOGRAPH-FAA6 +FAA7;76DB;76DB;76DB;76DB; # (盛; 盛; 盛; 盛; 盛; ) CJK COMPATIBILITY IDEOGRAPH-FAA7 +FAA8;76F4;76F4;76F4;76F4; # (直; 直; 直; 直; 直; ) CJK COMPATIBILITY IDEOGRAPH-FAA8 +FAA9;774A;774A;774A;774A; # (睊; 睊; 睊; 睊; 睊; ) CJK COMPATIBILITY IDEOGRAPH-FAA9 +FAAA;7740;7740;7740;7740; # (着; 着; 着; 着; 着; ) CJK COMPATIBILITY IDEOGRAPH-FAAA +FAAB;78CC;78CC;78CC;78CC; # (磌; 磌; 磌; 磌; 磌; ) CJK COMPATIBILITY IDEOGRAPH-FAAB +FAAC;7AB1;7AB1;7AB1;7AB1; # (窱; 窱; 窱; 窱; 窱; ) CJK COMPATIBILITY IDEOGRAPH-FAAC +FAAD;7BC0;7BC0;7BC0;7BC0; # (節; 節; 節; 節; 節; ) CJK COMPATIBILITY IDEOGRAPH-FAAD +FAAE;7C7B;7C7B;7C7B;7C7B; # (类; 类; 类; 类; 类; ) CJK COMPATIBILITY IDEOGRAPH-FAAE +FAAF;7D5B;7D5B;7D5B;7D5B; # (絛; 絛; 絛; 絛; 絛; ) CJK COMPATIBILITY IDEOGRAPH-FAAF +FAB0;7DF4;7DF4;7DF4;7DF4; # (練; 練; 練; 練; 練; ) CJK COMPATIBILITY IDEOGRAPH-FAB0 +FAB1;7F3E;7F3E;7F3E;7F3E; # (缾; 缾; 缾; 缾; 缾; ) CJK COMPATIBILITY IDEOGRAPH-FAB1 +FAB2;8005;8005;8005;8005; # (者; 者; 者; 者; 者; ) CJK COMPATIBILITY IDEOGRAPH-FAB2 +FAB3;8352;8352;8352;8352; # (荒; 荒; 荒; 荒; 荒; ) CJK COMPATIBILITY IDEOGRAPH-FAB3 +FAB4;83EF;83EF;83EF;83EF; # (華; 華; 華; 華; 華; ) CJK COMPATIBILITY IDEOGRAPH-FAB4 +FAB5;8779;8779;8779;8779; # (蝹; 蝹; 蝹; 蝹; 蝹; ) CJK COMPATIBILITY IDEOGRAPH-FAB5 +FAB6;8941;8941;8941;8941; # (襁; 襁; 襁; 襁; 襁; ) CJK COMPATIBILITY IDEOGRAPH-FAB6 +FAB7;8986;8986;8986;8986; # (覆; 覆; 覆; 覆; 覆; ) CJK COMPATIBILITY IDEOGRAPH-FAB7 +FAB8;8996;8996;8996;8996; # (視; 視; 視; 視; 視; ) CJK COMPATIBILITY IDEOGRAPH-FAB8 +FAB9;8ABF;8ABF;8ABF;8ABF; # (調; 調; 調; 調; 調; ) CJK COMPATIBILITY IDEOGRAPH-FAB9 +FABA;8AF8;8AF8;8AF8;8AF8; # (諸; 諸; 諸; 諸; 諸; ) CJK COMPATIBILITY IDEOGRAPH-FABA +FABB;8ACB;8ACB;8ACB;8ACB; # (請; 請; 請; 請; 請; ) CJK COMPATIBILITY IDEOGRAPH-FABB +FABC;8B01;8B01;8B01;8B01; # (謁; 謁; 謁; 謁; 謁; ) CJK COMPATIBILITY IDEOGRAPH-FABC +FABD;8AFE;8AFE;8AFE;8AFE; # (諾; 諾; 諾; 諾; 諾; ) CJK COMPATIBILITY IDEOGRAPH-FABD +FABE;8AED;8AED;8AED;8AED; # (諭; 諭; 諭; 諭; 諭; ) CJK COMPATIBILITY IDEOGRAPH-FABE +FABF;8B39;8B39;8B39;8B39; # (謹; 謹; 謹; 謹; 謹; ) CJK COMPATIBILITY IDEOGRAPH-FABF +FAC0;8B8A;8B8A;8B8A;8B8A; # (變; 變; 變; 變; 變; ) CJK COMPATIBILITY IDEOGRAPH-FAC0 +FAC1;8D08;8D08;8D08;8D08; # (贈; 贈; 贈; 贈; 贈; ) CJK COMPATIBILITY IDEOGRAPH-FAC1 +FAC2;8F38;8F38;8F38;8F38; # (輸; 輸; 輸; 輸; 輸; ) CJK COMPATIBILITY IDEOGRAPH-FAC2 +FAC3;9072;9072;9072;9072; # (遲; 遲; 遲; 遲; 遲; ) CJK COMPATIBILITY IDEOGRAPH-FAC3 +FAC4;9199;9199;9199;9199; # (醙; 醙; 醙; 醙; 醙; ) CJK COMPATIBILITY IDEOGRAPH-FAC4 +FAC5;9276;9276;9276;9276; # (鉶; 鉶; 鉶; 鉶; 鉶; ) CJK COMPATIBILITY IDEOGRAPH-FAC5 +FAC6;967C;967C;967C;967C; # (陼; 陼; 陼; 陼; 陼; ) CJK COMPATIBILITY IDEOGRAPH-FAC6 +FAC7;96E3;96E3;96E3;96E3; # (難; 難; 難; 難; 難; ) CJK COMPATIBILITY IDEOGRAPH-FAC7 +FAC8;9756;9756;9756;9756; # (靖; 靖; 靖; 靖; 靖; ) CJK COMPATIBILITY IDEOGRAPH-FAC8 +FAC9;97DB;97DB;97DB;97DB; # (韛; 韛; 韛; 韛; 韛; ) CJK COMPATIBILITY IDEOGRAPH-FAC9 +FACA;97FF;97FF;97FF;97FF; # (響; 響; 響; 響; 響; ) CJK COMPATIBILITY IDEOGRAPH-FACA +FACB;980B;980B;980B;980B; # (頋; 頋; 頋; 頋; 頋; ) CJK COMPATIBILITY IDEOGRAPH-FACB +FACC;983B;983B;983B;983B; # (頻; 頻; 頻; 頻; 頻; ) CJK COMPATIBILITY IDEOGRAPH-FACC +FACD;9B12;9B12;9B12;9B12; # (鬒; 鬒; 鬒; 鬒; 鬒; ) CJK COMPATIBILITY IDEOGRAPH-FACD +FACE;9F9C;9F9C;9F9C;9F9C; # (龜; 龜; 龜; 龜; 龜; ) CJK COMPATIBILITY IDEOGRAPH-FACE +FACF;2284A;2284A;2284A;2284A; # (𢡊; 𢡊; 𢡊; 𢡊; 𢡊; ) CJK COMPATIBILITY IDEOGRAPH-FACF +FAD0;22844;22844;22844;22844; # (𢡄; 𢡄; 𢡄; 𢡄; 𢡄; ) CJK COMPATIBILITY IDEOGRAPH-FAD0 +FAD1;233D5;233D5;233D5;233D5; # (𣏕; 𣏕; 𣏕; 𣏕; 𣏕; ) CJK COMPATIBILITY IDEOGRAPH-FAD1 +FAD2;3B9D;3B9D;3B9D;3B9D; # (㮝; 㮝; 㮝; 㮝; 㮝; ) CJK COMPATIBILITY IDEOGRAPH-FAD2 +FAD3;4018;4018;4018;4018; # (䀘; 䀘; 䀘; 䀘; 䀘; ) CJK COMPATIBILITY IDEOGRAPH-FAD3 +FAD4;4039;4039;4039;4039; # (䀹; 䀹; 䀹; 䀹; 䀹; ) CJK COMPATIBILITY IDEOGRAPH-FAD4 +FAD5;25249;25249;25249;25249; # (𥉉; 𥉉; 𥉉; 𥉉; 𥉉; ) CJK COMPATIBILITY IDEOGRAPH-FAD5 +FAD6;25CD0;25CD0;25CD0;25CD0; # (𥳐; 𥳐; 𥳐; 𥳐; 𥳐; ) CJK COMPATIBILITY IDEOGRAPH-FAD6 +FAD7;27ED3;27ED3;27ED3;27ED3; # (𧻓; 𧻓; 𧻓; 𧻓; 𧻓; ) CJK COMPATIBILITY IDEOGRAPH-FAD7 +FAD8;9F43;9F43;9F43;9F43; # (齃; 齃; 齃; 齃; 齃; ) CJK COMPATIBILITY IDEOGRAPH-FAD8 +FAD9;9F8E;9F8E;9F8E;9F8E; # (龎; 龎; 龎; 龎; 龎; ) CJK COMPATIBILITY IDEOGRAPH-FAD9 +FB00;FB00;FB00;0066 0066;0066 0066; # (ff; ff; ff; ff; ff; ) LATIN SMALL LIGATURE FF +FB01;FB01;FB01;0066 0069;0066 0069; # (fi; fi; fi; fi; fi; ) LATIN SMALL LIGATURE FI +FB02;FB02;FB02;0066 006C;0066 006C; # (fl; fl; fl; fl; fl; ) LATIN SMALL LIGATURE FL +FB03;FB03;FB03;0066 0066 0069;0066 0066 0069; # (ffi; ffi; ffi; ffi; ffi; ) LATIN SMALL LIGATURE FFI +FB04;FB04;FB04;0066 0066 006C;0066 0066 006C; # (ffl; ffl; ffl; ffl; ffl; ) LATIN SMALL LIGATURE FFL +FB05;FB05;FB05;0073 0074;0073 0074; # (ſt; ſt; ſt; st; st; ) LATIN SMALL LIGATURE LONG S T +FB06;FB06;FB06;0073 0074;0073 0074; # (st; st; st; st; st; ) LATIN SMALL LIGATURE ST +FB13;FB13;FB13;0574 0576;0574 0576; # (ﬓ; ﬓ; ﬓ; մն; մն; ) ARMENIAN SMALL LIGATURE MEN NOW +FB14;FB14;FB14;0574 0565;0574 0565; # (ﬔ; ﬔ; ﬔ; մե; մե; ) ARMENIAN SMALL LIGATURE MEN ECH +FB15;FB15;FB15;0574 056B;0574 056B; # (ﬕ; ﬕ; ﬕ; մի; մի; ) ARMENIAN SMALL LIGATURE MEN INI +FB16;FB16;FB16;057E 0576;057E 0576; # (ﬖ; ﬖ; ﬖ; վն; վն; ) ARMENIAN SMALL LIGATURE VEW NOW +FB17;FB17;FB17;0574 056D;0574 056D; # (ﬗ; ﬗ; ﬗ; մխ; մխ; ) ARMENIAN SMALL LIGATURE MEN XEH +FB1D;05D9 05B4;05D9 05B4;05D9 05B4;05D9 05B4; # (יִ; י◌ִ; י◌ִ; י◌ִ; י◌ִ; ) HEBREW LETTER YOD WITH HIRIQ +FB1F;05F2 05B7;05F2 05B7;05F2 05B7;05F2 05B7; # (ײַ; ײ◌ַ; ײ◌ַ; ײ◌ַ; ײ◌ַ; ) HEBREW LIGATURE YIDDISH YOD YOD PATAH +FB20;FB20;FB20;05E2;05E2; # (ﬠ; ﬠ; ﬠ; ע; ע; ) HEBREW LETTER ALTERNATIVE AYIN +FB21;FB21;FB21;05D0;05D0; # (ﬡ; ﬡ; ﬡ; א; א; ) HEBREW LETTER WIDE ALEF +FB22;FB22;FB22;05D3;05D3; # (ﬢ; ﬢ; ﬢ; ד; ד; ) HEBREW LETTER WIDE DALET +FB23;FB23;FB23;05D4;05D4; # (ﬣ; ﬣ; ﬣ; ה; ה; ) HEBREW LETTER WIDE HE +FB24;FB24;FB24;05DB;05DB; # (ﬤ; ﬤ; ﬤ; כ; כ; ) HEBREW LETTER WIDE KAF +FB25;FB25;FB25;05DC;05DC; # (ﬥ; ﬥ; ﬥ; ל; ל; ) HEBREW LETTER WIDE LAMED +FB26;FB26;FB26;05DD;05DD; # (ﬦ; ﬦ; ﬦ; ם; ם; ) HEBREW LETTER WIDE FINAL MEM +FB27;FB27;FB27;05E8;05E8; # (ﬧ; ﬧ; ﬧ; ר; ר; ) HEBREW LETTER WIDE RESH +FB28;FB28;FB28;05EA;05EA; # (ﬨ; ﬨ; ﬨ; ת; ת; ) HEBREW LETTER WIDE TAV +FB29;FB29;FB29;002B;002B; # (﬩; ﬩; ﬩; +; +; ) HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A;05E9 05C1;05E9 05C1;05E9 05C1;05E9 05C1; # (שׁ; ש◌ׁ; ש◌ׁ; ש◌ׁ; ש◌ׁ; ) HEBREW LETTER SHIN WITH SHIN DOT +FB2B;05E9 05C2;05E9 05C2;05E9 05C2;05E9 05C2; # (שׂ; ש◌ׂ; ש◌ׂ; ש◌ׂ; ש◌ׂ; ) HEBREW LETTER SHIN WITH SIN DOT +FB2C;05E9 05BC 05C1;05E9 05BC 05C1;05E9 05BC 05C1;05E9 05BC 05C1; # (שּׁ; ש◌ּ◌ׁ; ש◌ּ◌ׁ; ש◌ּ◌ׁ; ש◌ּ◌ׁ; ) HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +FB2D;05E9 05BC 05C2;05E9 05BC 05C2;05E9 05BC 05C2;05E9 05BC 05C2; # (שּׂ; ש◌ּ◌ׂ; ש◌ּ◌ׂ; ש◌ּ◌ׂ; ש◌ּ◌ׂ; ) HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2E;05D0 05B7;05D0 05B7;05D0 05B7;05D0 05B7; # (אַ; א◌ַ; א◌ַ; א◌ַ; א◌ַ; ) HEBREW LETTER ALEF WITH PATAH +FB2F;05D0 05B8;05D0 05B8;05D0 05B8;05D0 05B8; # (אָ; א◌ָ; א◌ָ; א◌ָ; א◌ָ; ) HEBREW LETTER ALEF WITH QAMATS +FB30;05D0 05BC;05D0 05BC;05D0 05BC;05D0 05BC; # (אּ; א◌ּ; א◌ּ; א◌ּ; א◌ּ; ) HEBREW LETTER ALEF WITH MAPIQ +FB31;05D1 05BC;05D1 05BC;05D1 05BC;05D1 05BC; # (בּ; ב◌ּ; ב◌ּ; ב◌ּ; ב◌ּ; ) HEBREW LETTER BET WITH DAGESH +FB32;05D2 05BC;05D2 05BC;05D2 05BC;05D2 05BC; # (גּ; ג◌ּ; ג◌ּ; ג◌ּ; ג◌ּ; ) HEBREW LETTER GIMEL WITH DAGESH +FB33;05D3 05BC;05D3 05BC;05D3 05BC;05D3 05BC; # (דּ; ד◌ּ; ד◌ּ; ד◌ּ; ד◌ּ; ) HEBREW LETTER DALET WITH DAGESH +FB34;05D4 05BC;05D4 05BC;05D4 05BC;05D4 05BC; # (הּ; ה◌ּ; ה◌ּ; ה◌ּ; ה◌ּ; ) HEBREW LETTER HE WITH MAPIQ +FB35;05D5 05BC;05D5 05BC;05D5 05BC;05D5 05BC; # (וּ; ו◌ּ; ו◌ּ; ו◌ּ; ו◌ּ; ) HEBREW LETTER VAV WITH DAGESH +FB36;05D6 05BC;05D6 05BC;05D6 05BC;05D6 05BC; # (זּ; ז◌ּ; ז◌ּ; ז◌ּ; ז◌ּ; ) HEBREW LETTER ZAYIN WITH DAGESH +FB38;05D8 05BC;05D8 05BC;05D8 05BC;05D8 05BC; # (טּ; ט◌ּ; ט◌ּ; ט◌ּ; ט◌ּ; ) HEBREW LETTER TET WITH DAGESH +FB39;05D9 05BC;05D9 05BC;05D9 05BC;05D9 05BC; # (יּ; י◌ּ; י◌ּ; י◌ּ; י◌ּ; ) HEBREW LETTER YOD WITH DAGESH +FB3A;05DA 05BC;05DA 05BC;05DA 05BC;05DA 05BC; # (ךּ; ך◌ּ; ך◌ּ; ך◌ּ; ך◌ּ; ) HEBREW LETTER FINAL KAF WITH DAGESH +FB3B;05DB 05BC;05DB 05BC;05DB 05BC;05DB 05BC; # (כּ; כ◌ּ; כ◌ּ; כ◌ּ; כ◌ּ; ) HEBREW LETTER KAF WITH DAGESH +FB3C;05DC 05BC;05DC 05BC;05DC 05BC;05DC 05BC; # (לּ; ל◌ּ; ל◌ּ; ל◌ּ; ל◌ּ; ) HEBREW LETTER LAMED WITH DAGESH +FB3E;05DE 05BC;05DE 05BC;05DE 05BC;05DE 05BC; # (מּ; מ◌ּ; מ◌ּ; מ◌ּ; מ◌ּ; ) HEBREW LETTER MEM WITH DAGESH +FB40;05E0 05BC;05E0 05BC;05E0 05BC;05E0 05BC; # (נּ; נ◌ּ; נ◌ּ; נ◌ּ; נ◌ּ; ) HEBREW LETTER NUN WITH DAGESH +FB41;05E1 05BC;05E1 05BC;05E1 05BC;05E1 05BC; # (סּ; ס◌ּ; ס◌ּ; ס◌ּ; ס◌ּ; ) HEBREW LETTER SAMEKH WITH DAGESH +FB43;05E3 05BC;05E3 05BC;05E3 05BC;05E3 05BC; # (ףּ; ף◌ּ; ף◌ּ; ף◌ּ; ף◌ּ; ) HEBREW LETTER FINAL PE WITH DAGESH +FB44;05E4 05BC;05E4 05BC;05E4 05BC;05E4 05BC; # (פּ; פ◌ּ; פ◌ּ; פ◌ּ; פ◌ּ; ) HEBREW LETTER PE WITH DAGESH +FB46;05E6 05BC;05E6 05BC;05E6 05BC;05E6 05BC; # (צּ; צ◌ּ; צ◌ּ; צ◌ּ; צ◌ּ; ) HEBREW LETTER TSADI WITH DAGESH +FB47;05E7 05BC;05E7 05BC;05E7 05BC;05E7 05BC; # (קּ; ק◌ּ; ק◌ּ; ק◌ּ; ק◌ּ; ) HEBREW LETTER QOF WITH DAGESH +FB48;05E8 05BC;05E8 05BC;05E8 05BC;05E8 05BC; # (רּ; ר◌ּ; ר◌ּ; ר◌ּ; ר◌ּ; ) HEBREW LETTER RESH WITH DAGESH +FB49;05E9 05BC;05E9 05BC;05E9 05BC;05E9 05BC; # (שּ; ש◌ּ; ש◌ּ; ש◌ּ; ש◌ּ; ) HEBREW LETTER SHIN WITH DAGESH +FB4A;05EA 05BC;05EA 05BC;05EA 05BC;05EA 05BC; # (תּ; ת◌ּ; ת◌ּ; ת◌ּ; ת◌ּ; ) HEBREW LETTER TAV WITH DAGESH +FB4B;05D5 05B9;05D5 05B9;05D5 05B9;05D5 05B9; # (וֹ; ו◌ֹ; ו◌ֹ; ו◌ֹ; ו◌ֹ; ) HEBREW LETTER VAV WITH HOLAM +FB4C;05D1 05BF;05D1 05BF;05D1 05BF;05D1 05BF; # (בֿ; ב◌ֿ; ב◌ֿ; ב◌ֿ; ב◌ֿ; ) HEBREW LETTER BET WITH RAFE +FB4D;05DB 05BF;05DB 05BF;05DB 05BF;05DB 05BF; # (כֿ; כ◌ֿ; כ◌ֿ; כ◌ֿ; כ◌ֿ; ) HEBREW LETTER KAF WITH RAFE +FB4E;05E4 05BF;05E4 05BF;05E4 05BF;05E4 05BF; # (פֿ; פ◌ֿ; פ◌ֿ; פ◌ֿ; פ◌ֿ; ) HEBREW LETTER PE WITH RAFE +FB4F;FB4F;FB4F;05D0 05DC;05D0 05DC; # (ﭏ; ﭏ; ﭏ; אל; אל; ) HEBREW LIGATURE ALEF LAMED +FB50;FB50;FB50;0671;0671; # (ﭐ; ﭐ; ﭐ; ٱ; ٱ; ) ARABIC LETTER ALEF WASLA ISOLATED FORM +FB51;FB51;FB51;0671;0671; # (ﭑ; ﭑ; ﭑ; ٱ; ٱ; ) ARABIC LETTER ALEF WASLA FINAL FORM +FB52;FB52;FB52;067B;067B; # (ﭒ; ﭒ; ﭒ; ٻ; ٻ; ) ARABIC LETTER BEEH ISOLATED FORM +FB53;FB53;FB53;067B;067B; # (ﭓ; ﭓ; ﭓ; ٻ; ٻ; ) ARABIC LETTER BEEH FINAL FORM +FB54;FB54;FB54;067B;067B; # (ﭔ; ﭔ; ﭔ; ٻ; ٻ; ) ARABIC LETTER BEEH INITIAL FORM +FB55;FB55;FB55;067B;067B; # (ﭕ; ﭕ; ﭕ; ٻ; ٻ; ) ARABIC LETTER BEEH MEDIAL FORM +FB56;FB56;FB56;067E;067E; # (ﭖ; ﭖ; ﭖ; پ; پ; ) ARABIC LETTER PEH ISOLATED FORM +FB57;FB57;FB57;067E;067E; # (ﭗ; ﭗ; ﭗ; پ; پ; ) ARABIC LETTER PEH FINAL FORM +FB58;FB58;FB58;067E;067E; # (ﭘ; ﭘ; ﭘ; پ; پ; ) ARABIC LETTER PEH INITIAL FORM +FB59;FB59;FB59;067E;067E; # (ﭙ; ﭙ; ﭙ; پ; پ; ) ARABIC LETTER PEH MEDIAL FORM +FB5A;FB5A;FB5A;0680;0680; # (ﭚ; ﭚ; ﭚ; ڀ; ڀ; ) ARABIC LETTER BEHEH ISOLATED FORM +FB5B;FB5B;FB5B;0680;0680; # (ﭛ; ﭛ; ﭛ; ڀ; ڀ; ) ARABIC LETTER BEHEH FINAL FORM +FB5C;FB5C;FB5C;0680;0680; # (ﭜ; ﭜ; ﭜ; ڀ; ڀ; ) ARABIC LETTER BEHEH INITIAL FORM +FB5D;FB5D;FB5D;0680;0680; # (ﭝ; ﭝ; ﭝ; ڀ; ڀ; ) ARABIC LETTER BEHEH MEDIAL FORM +FB5E;FB5E;FB5E;067A;067A; # (ﭞ; ﭞ; ﭞ; ٺ; ٺ; ) ARABIC LETTER TTEHEH ISOLATED FORM +FB5F;FB5F;FB5F;067A;067A; # (ﭟ; ﭟ; ﭟ; ٺ; ٺ; ) ARABIC LETTER TTEHEH FINAL FORM +FB60;FB60;FB60;067A;067A; # (ﭠ; ﭠ; ﭠ; ٺ; ٺ; ) ARABIC LETTER TTEHEH INITIAL FORM +FB61;FB61;FB61;067A;067A; # (ﭡ; ﭡ; ﭡ; ٺ; ٺ; ) ARABIC LETTER TTEHEH MEDIAL FORM +FB62;FB62;FB62;067F;067F; # (ﭢ; ﭢ; ﭢ; ٿ; ٿ; ) ARABIC LETTER TEHEH ISOLATED FORM +FB63;FB63;FB63;067F;067F; # (ﭣ; ﭣ; ﭣ; ٿ; ٿ; ) ARABIC LETTER TEHEH FINAL FORM +FB64;FB64;FB64;067F;067F; # (ﭤ; ﭤ; ﭤ; ٿ; ٿ; ) ARABIC LETTER TEHEH INITIAL FORM +FB65;FB65;FB65;067F;067F; # (ﭥ; ﭥ; ﭥ; ٿ; ٿ; ) ARABIC LETTER TEHEH MEDIAL FORM +FB66;FB66;FB66;0679;0679; # (ﭦ; ﭦ; ﭦ; ٹ; ٹ; ) ARABIC LETTER TTEH ISOLATED FORM +FB67;FB67;FB67;0679;0679; # (ﭧ; ﭧ; ﭧ; ٹ; ٹ; ) ARABIC LETTER TTEH FINAL FORM +FB68;FB68;FB68;0679;0679; # (ﭨ; ﭨ; ﭨ; ٹ; ٹ; ) ARABIC LETTER TTEH INITIAL FORM +FB69;FB69;FB69;0679;0679; # (ﭩ; ﭩ; ﭩ; ٹ; ٹ; ) ARABIC LETTER TTEH MEDIAL FORM +FB6A;FB6A;FB6A;06A4;06A4; # (ﭪ; ﭪ; ﭪ; ڤ; ڤ; ) ARABIC LETTER VEH ISOLATED FORM +FB6B;FB6B;FB6B;06A4;06A4; # (ﭫ; ﭫ; ﭫ; ڤ; ڤ; ) ARABIC LETTER VEH FINAL FORM +FB6C;FB6C;FB6C;06A4;06A4; # (ﭬ; ﭬ; ﭬ; ڤ; ڤ; ) ARABIC LETTER VEH INITIAL FORM +FB6D;FB6D;FB6D;06A4;06A4; # (ﭭ; ﭭ; ﭭ; ڤ; ڤ; ) ARABIC LETTER VEH MEDIAL FORM +FB6E;FB6E;FB6E;06A6;06A6; # (ﭮ; ﭮ; ﭮ; ڦ; ڦ; ) ARABIC LETTER PEHEH ISOLATED FORM +FB6F;FB6F;FB6F;06A6;06A6; # (ﭯ; ﭯ; ﭯ; ڦ; ڦ; ) ARABIC LETTER PEHEH FINAL FORM +FB70;FB70;FB70;06A6;06A6; # (ﭰ; ﭰ; ﭰ; ڦ; ڦ; ) ARABIC LETTER PEHEH INITIAL FORM +FB71;FB71;FB71;06A6;06A6; # (ﭱ; ﭱ; ﭱ; ڦ; ڦ; ) ARABIC LETTER PEHEH MEDIAL FORM +FB72;FB72;FB72;0684;0684; # (ﭲ; ﭲ; ﭲ; ڄ; ڄ; ) ARABIC LETTER DYEH ISOLATED FORM +FB73;FB73;FB73;0684;0684; # (ﭳ; ﭳ; ﭳ; ڄ; ڄ; ) ARABIC LETTER DYEH FINAL FORM +FB74;FB74;FB74;0684;0684; # (ﭴ; ﭴ; ﭴ; ڄ; ڄ; ) ARABIC LETTER DYEH INITIAL FORM +FB75;FB75;FB75;0684;0684; # (ﭵ; ﭵ; ﭵ; ڄ; ڄ; ) ARABIC LETTER DYEH MEDIAL FORM +FB76;FB76;FB76;0683;0683; # (ﭶ; ﭶ; ﭶ; ڃ; ڃ; ) ARABIC LETTER NYEH ISOLATED FORM +FB77;FB77;FB77;0683;0683; # (ﭷ; ﭷ; ﭷ; ڃ; ڃ; ) ARABIC LETTER NYEH FINAL FORM +FB78;FB78;FB78;0683;0683; # (ﭸ; ﭸ; ﭸ; ڃ; ڃ; ) ARABIC LETTER NYEH INITIAL FORM +FB79;FB79;FB79;0683;0683; # (ﭹ; ﭹ; ﭹ; ڃ; ڃ; ) ARABIC LETTER NYEH MEDIAL FORM +FB7A;FB7A;FB7A;0686;0686; # (ﭺ; ﭺ; ﭺ; چ; چ; ) ARABIC LETTER TCHEH ISOLATED FORM +FB7B;FB7B;FB7B;0686;0686; # (ﭻ; ﭻ; ﭻ; چ; چ; ) ARABIC LETTER TCHEH FINAL FORM +FB7C;FB7C;FB7C;0686;0686; # (ﭼ; ﭼ; ﭼ; چ; چ; ) ARABIC LETTER TCHEH INITIAL FORM +FB7D;FB7D;FB7D;0686;0686; # (ﭽ; ﭽ; ﭽ; چ; چ; ) ARABIC LETTER TCHEH MEDIAL FORM +FB7E;FB7E;FB7E;0687;0687; # (ﭾ; ﭾ; ﭾ; ڇ; ڇ; ) ARABIC LETTER TCHEHEH ISOLATED FORM +FB7F;FB7F;FB7F;0687;0687; # (ﭿ; ﭿ; ﭿ; ڇ; ڇ; ) ARABIC LETTER TCHEHEH FINAL FORM +FB80;FB80;FB80;0687;0687; # (ﮀ; ﮀ; ﮀ; ڇ; ڇ; ) ARABIC LETTER TCHEHEH INITIAL FORM +FB81;FB81;FB81;0687;0687; # (ﮁ; ﮁ; ﮁ; ڇ; ڇ; ) ARABIC LETTER TCHEHEH MEDIAL FORM +FB82;FB82;FB82;068D;068D; # (ﮂ; ﮂ; ﮂ; ڍ; ڍ; ) ARABIC LETTER DDAHAL ISOLATED FORM +FB83;FB83;FB83;068D;068D; # (ﮃ; ﮃ; ﮃ; ڍ; ڍ; ) ARABIC LETTER DDAHAL FINAL FORM +FB84;FB84;FB84;068C;068C; # (ﮄ; ﮄ; ﮄ; ڌ; ڌ; ) ARABIC LETTER DAHAL ISOLATED FORM +FB85;FB85;FB85;068C;068C; # (ﮅ; ﮅ; ﮅ; ڌ; ڌ; ) ARABIC LETTER DAHAL FINAL FORM +FB86;FB86;FB86;068E;068E; # (ﮆ; ﮆ; ﮆ; ڎ; ڎ; ) ARABIC LETTER DUL ISOLATED FORM +FB87;FB87;FB87;068E;068E; # (ﮇ; ﮇ; ﮇ; ڎ; ڎ; ) ARABIC LETTER DUL FINAL FORM +FB88;FB88;FB88;0688;0688; # (ﮈ; ﮈ; ﮈ; ڈ; ڈ; ) ARABIC LETTER DDAL ISOLATED FORM +FB89;FB89;FB89;0688;0688; # (ﮉ; ﮉ; ﮉ; ڈ; ڈ; ) ARABIC LETTER DDAL FINAL FORM +FB8A;FB8A;FB8A;0698;0698; # (ﮊ; ﮊ; ﮊ; ژ; ژ; ) ARABIC LETTER JEH ISOLATED FORM +FB8B;FB8B;FB8B;0698;0698; # (ﮋ; ﮋ; ﮋ; ژ; ژ; ) ARABIC LETTER JEH FINAL FORM +FB8C;FB8C;FB8C;0691;0691; # (ﮌ; ﮌ; ﮌ; ڑ; ڑ; ) ARABIC LETTER RREH ISOLATED FORM +FB8D;FB8D;FB8D;0691;0691; # (ﮍ; ﮍ; ﮍ; ڑ; ڑ; ) ARABIC LETTER RREH FINAL FORM +FB8E;FB8E;FB8E;06A9;06A9; # (ﮎ; ﮎ; ﮎ; ک; ک; ) ARABIC LETTER KEHEH ISOLATED FORM +FB8F;FB8F;FB8F;06A9;06A9; # (ﮏ; ﮏ; ﮏ; ک; ک; ) ARABIC LETTER KEHEH FINAL FORM +FB90;FB90;FB90;06A9;06A9; # (ﮐ; ﮐ; ﮐ; ک; ک; ) ARABIC LETTER KEHEH INITIAL FORM +FB91;FB91;FB91;06A9;06A9; # (ﮑ; ﮑ; ﮑ; ک; ک; ) ARABIC LETTER KEHEH MEDIAL FORM +FB92;FB92;FB92;06AF;06AF; # (ﮒ; ﮒ; ﮒ; گ; گ; ) ARABIC LETTER GAF ISOLATED FORM +FB93;FB93;FB93;06AF;06AF; # (ﮓ; ﮓ; ﮓ; گ; گ; ) ARABIC LETTER GAF FINAL FORM +FB94;FB94;FB94;06AF;06AF; # (ﮔ; ﮔ; ﮔ; گ; گ; ) ARABIC LETTER GAF INITIAL FORM +FB95;FB95;FB95;06AF;06AF; # (ﮕ; ﮕ; ﮕ; گ; گ; ) ARABIC LETTER GAF MEDIAL FORM +FB96;FB96;FB96;06B3;06B3; # (ﮖ; ﮖ; ﮖ; ڳ; ڳ; ) ARABIC LETTER GUEH ISOLATED FORM +FB97;FB97;FB97;06B3;06B3; # (ﮗ; ﮗ; ﮗ; ڳ; ڳ; ) ARABIC LETTER GUEH FINAL FORM +FB98;FB98;FB98;06B3;06B3; # (ﮘ; ﮘ; ﮘ; ڳ; ڳ; ) ARABIC LETTER GUEH INITIAL FORM +FB99;FB99;FB99;06B3;06B3; # (ﮙ; ﮙ; ﮙ; ڳ; ڳ; ) ARABIC LETTER GUEH MEDIAL FORM +FB9A;FB9A;FB9A;06B1;06B1; # (ﮚ; ﮚ; ﮚ; ڱ; ڱ; ) ARABIC LETTER NGOEH ISOLATED FORM +FB9B;FB9B;FB9B;06B1;06B1; # (ﮛ; ﮛ; ﮛ; ڱ; ڱ; ) ARABIC LETTER NGOEH FINAL FORM +FB9C;FB9C;FB9C;06B1;06B1; # (ﮜ; ﮜ; ﮜ; ڱ; ڱ; ) ARABIC LETTER NGOEH INITIAL FORM +FB9D;FB9D;FB9D;06B1;06B1; # (ﮝ; ﮝ; ﮝ; ڱ; ڱ; ) ARABIC LETTER NGOEH MEDIAL FORM +FB9E;FB9E;FB9E;06BA;06BA; # (ﮞ; ﮞ; ﮞ; ں; ں; ) ARABIC LETTER NOON GHUNNA ISOLATED FORM +FB9F;FB9F;FB9F;06BA;06BA; # (ﮟ; ﮟ; ﮟ; ں; ں; ) ARABIC LETTER NOON GHUNNA FINAL FORM +FBA0;FBA0;FBA0;06BB;06BB; # (ﮠ; ﮠ; ﮠ; ڻ; ڻ; ) ARABIC LETTER RNOON ISOLATED FORM +FBA1;FBA1;FBA1;06BB;06BB; # (ﮡ; ﮡ; ﮡ; ڻ; ڻ; ) ARABIC LETTER RNOON FINAL FORM +FBA2;FBA2;FBA2;06BB;06BB; # (ﮢ; ﮢ; ﮢ; ڻ; ڻ; ) ARABIC LETTER RNOON INITIAL FORM +FBA3;FBA3;FBA3;06BB;06BB; # (ﮣ; ﮣ; ﮣ; ڻ; ڻ; ) ARABIC LETTER RNOON MEDIAL FORM +FBA4;FBA4;FBA4;06C0;06D5 0654; # (ﮤ; ﮤ; ﮤ; ۀ; ە◌ٔ; ) ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM +FBA5;FBA5;FBA5;06C0;06D5 0654; # (ﮥ; ﮥ; ﮥ; ۀ; ە◌ٔ; ) ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +FBA6;FBA6;FBA6;06C1;06C1; # (ﮦ; ﮦ; ﮦ; ہ; ہ; ) ARABIC LETTER HEH GOAL ISOLATED FORM +FBA7;FBA7;FBA7;06C1;06C1; # (ﮧ; ﮧ; ﮧ; ہ; ہ; ) ARABIC LETTER HEH GOAL FINAL FORM +FBA8;FBA8;FBA8;06C1;06C1; # (ﮨ; ﮨ; ﮨ; ہ; ہ; ) ARABIC LETTER HEH GOAL INITIAL FORM +FBA9;FBA9;FBA9;06C1;06C1; # (ﮩ; ﮩ; ﮩ; ہ; ہ; ) ARABIC LETTER HEH GOAL MEDIAL FORM +FBAA;FBAA;FBAA;06BE;06BE; # (ﮪ; ﮪ; ﮪ; ھ; ھ; ) ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM +FBAB;FBAB;FBAB;06BE;06BE; # (ﮫ; ﮫ; ﮫ; ھ; ھ; ) ARABIC LETTER HEH DOACHASHMEE FINAL FORM +FBAC;FBAC;FBAC;06BE;06BE; # (ﮬ; ﮬ; ﮬ; ھ; ھ; ) ARABIC LETTER HEH DOACHASHMEE INITIAL FORM +FBAD;FBAD;FBAD;06BE;06BE; # (ﮭ; ﮭ; ﮭ; ھ; ھ; ) ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +FBAE;FBAE;FBAE;06D2;06D2; # (ﮮ; ﮮ; ﮮ; ے; ے; ) ARABIC LETTER YEH BARREE ISOLATED FORM +FBAF;FBAF;FBAF;06D2;06D2; # (ﮯ; ﮯ; ﮯ; ے; ے; ) ARABIC LETTER YEH BARREE FINAL FORM +FBB0;FBB0;FBB0;06D3;06D2 0654; # (ﮰ; ﮰ; ﮰ; ۓ; ے◌ٔ; ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM +FBB1;FBB1;FBB1;06D3;06D2 0654; # (ﮱ; ﮱ; ﮱ; ۓ; ے◌ٔ; ) ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBD3;FBD3;FBD3;06AD;06AD; # (ﯓ; ﯓ; ﯓ; ڭ; ڭ; ) ARABIC LETTER NG ISOLATED FORM +FBD4;FBD4;FBD4;06AD;06AD; # (ﯔ; ﯔ; ﯔ; ڭ; ڭ; ) ARABIC LETTER NG FINAL FORM +FBD5;FBD5;FBD5;06AD;06AD; # (ﯕ; ﯕ; ﯕ; ڭ; ڭ; ) ARABIC LETTER NG INITIAL FORM +FBD6;FBD6;FBD6;06AD;06AD; # (ﯖ; ﯖ; ﯖ; ڭ; ڭ; ) ARABIC LETTER NG MEDIAL FORM +FBD7;FBD7;FBD7;06C7;06C7; # (ﯗ; ﯗ; ﯗ; ۇ; ۇ; ) ARABIC LETTER U ISOLATED FORM +FBD8;FBD8;FBD8;06C7;06C7; # (ﯘ; ﯘ; ﯘ; ۇ; ۇ; ) ARABIC LETTER U FINAL FORM +FBD9;FBD9;FBD9;06C6;06C6; # (ﯙ; ﯙ; ﯙ; ۆ; ۆ; ) ARABIC LETTER OE ISOLATED FORM +FBDA;FBDA;FBDA;06C6;06C6; # (ﯚ; ﯚ; ﯚ; ۆ; ۆ; ) ARABIC LETTER OE FINAL FORM +FBDB;FBDB;FBDB;06C8;06C8; # (ﯛ; ﯛ; ﯛ; ۈ; ۈ; ) ARABIC LETTER YU ISOLATED FORM +FBDC;FBDC;FBDC;06C8;06C8; # (ﯜ; ﯜ; ﯜ; ۈ; ۈ; ) ARABIC LETTER YU FINAL FORM +FBDD;FBDD;FBDD;06C7 0674;06C7 0674; # (ﯝ; ﯝ; ﯝ; ۇٴ; ۇٴ; ) ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM +FBDE;FBDE;FBDE;06CB;06CB; # (ﯞ; ﯞ; ﯞ; ۋ; ۋ; ) ARABIC LETTER VE ISOLATED FORM +FBDF;FBDF;FBDF;06CB;06CB; # (ﯟ; ﯟ; ﯟ; ۋ; ۋ; ) ARABIC LETTER VE FINAL FORM +FBE0;FBE0;FBE0;06C5;06C5; # (ﯠ; ﯠ; ﯠ; ۅ; ۅ; ) ARABIC LETTER KIRGHIZ OE ISOLATED FORM +FBE1;FBE1;FBE1;06C5;06C5; # (ﯡ; ﯡ; ﯡ; ۅ; ۅ; ) ARABIC LETTER KIRGHIZ OE FINAL FORM +FBE2;FBE2;FBE2;06C9;06C9; # (ﯢ; ﯢ; ﯢ; ۉ; ۉ; ) ARABIC LETTER KIRGHIZ YU ISOLATED FORM +FBE3;FBE3;FBE3;06C9;06C9; # (ﯣ; ﯣ; ﯣ; ۉ; ۉ; ) ARABIC LETTER KIRGHIZ YU FINAL FORM +FBE4;FBE4;FBE4;06D0;06D0; # (ﯤ; ﯤ; ﯤ; ې; ې; ) ARABIC LETTER E ISOLATED FORM +FBE5;FBE5;FBE5;06D0;06D0; # (ﯥ; ﯥ; ﯥ; ې; ې; ) ARABIC LETTER E FINAL FORM +FBE6;FBE6;FBE6;06D0;06D0; # (ﯦ; ﯦ; ﯦ; ې; ې; ) ARABIC LETTER E INITIAL FORM +FBE7;FBE7;FBE7;06D0;06D0; # (ﯧ; ﯧ; ﯧ; ې; ې; ) ARABIC LETTER E MEDIAL FORM +FBE8;FBE8;FBE8;0649;0649; # (ﯨ; ﯨ; ﯨ; ى; ى; ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM +FBE9;FBE9;FBE9;0649;0649; # (ﯩ; ﯩ; ﯩ; ى; ى; ) ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +FBEA;FBEA;FBEA;0626 0627;064A 0654 0627; # (ﯪ; ﯪ; ﯪ; ئا; ي◌ٔا; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM +FBEB;FBEB;FBEB;0626 0627;064A 0654 0627; # (ﯫ; ﯫ; ﯫ; ئا; ي◌ٔا; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +FBEC;FBEC;FBEC;0626 06D5;064A 0654 06D5; # (ﯬ; ﯬ; ﯬ; ئە; ي◌ٔە; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM +FBED;FBED;FBED;0626 06D5;064A 0654 06D5; # (ﯭ; ﯭ; ﯭ; ئە; ي◌ٔە; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +FBEE;FBEE;FBEE;0626 0648;064A 0654 0648; # (ﯮ; ﯮ; ﯮ; ئو; ي◌ٔو; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM +FBEF;FBEF;FBEF;0626 0648;064A 0654 0648; # (ﯯ; ﯯ; ﯯ; ئو; ي◌ٔو; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +FBF0;FBF0;FBF0;0626 06C7;064A 0654 06C7; # (ﯰ; ﯰ; ﯰ; ئۇ; ي◌ٔۇ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM +FBF1;FBF1;FBF1;0626 06C7;064A 0654 06C7; # (ﯱ; ﯱ; ﯱ; ئۇ; ي◌ٔۇ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +FBF2;FBF2;FBF2;0626 06C6;064A 0654 06C6; # (ﯲ; ﯲ; ﯲ; ئۆ; ي◌ٔۆ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM +FBF3;FBF3;FBF3;0626 06C6;064A 0654 06C6; # (ﯳ; ﯳ; ﯳ; ئۆ; ي◌ٔۆ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +FBF4;FBF4;FBF4;0626 06C8;064A 0654 06C8; # (ﯴ; ﯴ; ﯴ; ئۈ; ي◌ٔۈ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM +FBF5;FBF5;FBF5;0626 06C8;064A 0654 06C8; # (ﯵ; ﯵ; ﯵ; ئۈ; ي◌ٔۈ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +FBF6;FBF6;FBF6;0626 06D0;064A 0654 06D0; # (ﯶ; ﯶ; ﯶ; ئې; ي◌ٔې; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM +FBF7;FBF7;FBF7;0626 06D0;064A 0654 06D0; # (ﯷ; ﯷ; ﯷ; ئې; ي◌ٔې; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM +FBF8;FBF8;FBF8;0626 06D0;064A 0654 06D0; # (ﯸ; ﯸ; ﯸ; ئې; ي◌ٔې; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +FBF9;FBF9;FBF9;0626 0649;064A 0654 0649; # (ﯹ; ﯹ; ﯹ; ئى; ي◌ٔى; ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FBFA;FBFA;FBFA;0626 0649;064A 0654 0649; # (ﯺ; ﯺ; ﯺ; ئى; ي◌ٔى; ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FBFB;FBFB;FBFB;0626 0649;064A 0654 0649; # (ﯻ; ﯻ; ﯻ; ئى; ي◌ٔى; ) ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +FBFC;FBFC;FBFC;06CC;06CC; # (ﯼ; ﯼ; ﯼ; ی; ی; ) ARABIC LETTER FARSI YEH ISOLATED FORM +FBFD;FBFD;FBFD;06CC;06CC; # (ﯽ; ﯽ; ﯽ; ی; ی; ) ARABIC LETTER FARSI YEH FINAL FORM +FBFE;FBFE;FBFE;06CC;06CC; # (ﯾ; ﯾ; ﯾ; ی; ی; ) ARABIC LETTER FARSI YEH INITIAL FORM +FBFF;FBFF;FBFF;06CC;06CC; # (ﯿ; ﯿ; ﯿ; ی; ی; ) ARABIC LETTER FARSI YEH MEDIAL FORM +FC00;FC00;FC00;0626 062C;064A 0654 062C; # (ﰀ; ﰀ; ﰀ; ئج; ي◌ٔج; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM +FC01;FC01;FC01;0626 062D;064A 0654 062D; # (ﰁ; ﰁ; ﰁ; ئح; ي◌ٔح; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM +FC02;FC02;FC02;0626 0645;064A 0654 0645; # (ﰂ; ﰂ; ﰂ; ئم; ي◌ٔم; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM +FC03;FC03;FC03;0626 0649;064A 0654 0649; # (ﰃ; ﰃ; ﰃ; ئى; ي◌ٔى; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +FC04;FC04;FC04;0626 064A;064A 0654 064A; # (ﰄ; ﰄ; ﰄ; ئي; ي◌ٔي; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM +FC05;FC05;FC05;0628 062C;0628 062C; # (ﰅ; ﰅ; ﰅ; بج; بج; ) ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM +FC06;FC06;FC06;0628 062D;0628 062D; # (ﰆ; ﰆ; ﰆ; بح; بح; ) ARABIC LIGATURE BEH WITH HAH ISOLATED FORM +FC07;FC07;FC07;0628 062E;0628 062E; # (ﰇ; ﰇ; ﰇ; بخ; بخ; ) ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM +FC08;FC08;FC08;0628 0645;0628 0645; # (ﰈ; ﰈ; ﰈ; بم; بم; ) ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM +FC09;FC09;FC09;0628 0649;0628 0649; # (ﰉ; ﰉ; ﰉ; بى; بى; ) ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM +FC0A;FC0A;FC0A;0628 064A;0628 064A; # (ﰊ; ﰊ; ﰊ; بي; بي; ) ARABIC LIGATURE BEH WITH YEH ISOLATED FORM +FC0B;FC0B;FC0B;062A 062C;062A 062C; # (ﰋ; ﰋ; ﰋ; تج; تج; ) ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM +FC0C;FC0C;FC0C;062A 062D;062A 062D; # (ﰌ; ﰌ; ﰌ; تح; تح; ) ARABIC LIGATURE TEH WITH HAH ISOLATED FORM +FC0D;FC0D;FC0D;062A 062E;062A 062E; # (ﰍ; ﰍ; ﰍ; تخ; تخ; ) ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM +FC0E;FC0E;FC0E;062A 0645;062A 0645; # (ﰎ; ﰎ; ﰎ; تم; تم; ) ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM +FC0F;FC0F;FC0F;062A 0649;062A 0649; # (ﰏ; ﰏ; ﰏ; تى; تى; ) ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM +FC10;FC10;FC10;062A 064A;062A 064A; # (ﰐ; ﰐ; ﰐ; تي; تي; ) ARABIC LIGATURE TEH WITH YEH ISOLATED FORM +FC11;FC11;FC11;062B 062C;062B 062C; # (ﰑ; ﰑ; ﰑ; ثج; ثج; ) ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM +FC12;FC12;FC12;062B 0645;062B 0645; # (ﰒ; ﰒ; ﰒ; ثم; ثم; ) ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM +FC13;FC13;FC13;062B 0649;062B 0649; # (ﰓ; ﰓ; ﰓ; ثى; ثى; ) ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM +FC14;FC14;FC14;062B 064A;062B 064A; # (ﰔ; ﰔ; ﰔ; ثي; ثي; ) ARABIC LIGATURE THEH WITH YEH ISOLATED FORM +FC15;FC15;FC15;062C 062D;062C 062D; # (ﰕ; ﰕ; ﰕ; جح; جح; ) ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM +FC16;FC16;FC16;062C 0645;062C 0645; # (ﰖ; ﰖ; ﰖ; جم; جم; ) ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM +FC17;FC17;FC17;062D 062C;062D 062C; # (ﰗ; ﰗ; ﰗ; حج; حج; ) ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM +FC18;FC18;FC18;062D 0645;062D 0645; # (ﰘ; ﰘ; ﰘ; حم; حم; ) ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM +FC19;FC19;FC19;062E 062C;062E 062C; # (ﰙ; ﰙ; ﰙ; خج; خج; ) ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM +FC1A;FC1A;FC1A;062E 062D;062E 062D; # (ﰚ; ﰚ; ﰚ; خح; خح; ) ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM +FC1B;FC1B;FC1B;062E 0645;062E 0645; # (ﰛ; ﰛ; ﰛ; خم; خم; ) ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM +FC1C;FC1C;FC1C;0633 062C;0633 062C; # (ﰜ; ﰜ; ﰜ; سج; سج; ) ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM +FC1D;FC1D;FC1D;0633 062D;0633 062D; # (ﰝ; ﰝ; ﰝ; سح; سح; ) ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM +FC1E;FC1E;FC1E;0633 062E;0633 062E; # (ﰞ; ﰞ; ﰞ; سخ; سخ; ) ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM +FC1F;FC1F;FC1F;0633 0645;0633 0645; # (ﰟ; ﰟ; ﰟ; سم; سم; ) ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM +FC20;FC20;FC20;0635 062D;0635 062D; # (ﰠ; ﰠ; ﰠ; صح; صح; ) ARABIC LIGATURE SAD WITH HAH ISOLATED FORM +FC21;FC21;FC21;0635 0645;0635 0645; # (ﰡ; ﰡ; ﰡ; صم; صم; ) ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM +FC22;FC22;FC22;0636 062C;0636 062C; # (ﰢ; ﰢ; ﰢ; ضج; ضج; ) ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM +FC23;FC23;FC23;0636 062D;0636 062D; # (ﰣ; ﰣ; ﰣ; ضح; ضح; ) ARABIC LIGATURE DAD WITH HAH ISOLATED FORM +FC24;FC24;FC24;0636 062E;0636 062E; # (ﰤ; ﰤ; ﰤ; ضخ; ضخ; ) ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM +FC25;FC25;FC25;0636 0645;0636 0645; # (ﰥ; ﰥ; ﰥ; ضم; ضم; ) ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM +FC26;FC26;FC26;0637 062D;0637 062D; # (ﰦ; ﰦ; ﰦ; طح; طح; ) ARABIC LIGATURE TAH WITH HAH ISOLATED FORM +FC27;FC27;FC27;0637 0645;0637 0645; # (ﰧ; ﰧ; ﰧ; طم; طم; ) ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM +FC28;FC28;FC28;0638 0645;0638 0645; # (ﰨ; ﰨ; ﰨ; ظم; ظم; ) ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM +FC29;FC29;FC29;0639 062C;0639 062C; # (ﰩ; ﰩ; ﰩ; عج; عج; ) ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM +FC2A;FC2A;FC2A;0639 0645;0639 0645; # (ﰪ; ﰪ; ﰪ; عم; عم; ) ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM +FC2B;FC2B;FC2B;063A 062C;063A 062C; # (ﰫ; ﰫ; ﰫ; غج; غج; ) ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM +FC2C;FC2C;FC2C;063A 0645;063A 0645; # (ﰬ; ﰬ; ﰬ; غم; غم; ) ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM +FC2D;FC2D;FC2D;0641 062C;0641 062C; # (ﰭ; ﰭ; ﰭ; فج; فج; ) ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM +FC2E;FC2E;FC2E;0641 062D;0641 062D; # (ﰮ; ﰮ; ﰮ; فح; فح; ) ARABIC LIGATURE FEH WITH HAH ISOLATED FORM +FC2F;FC2F;FC2F;0641 062E;0641 062E; # (ﰯ; ﰯ; ﰯ; فخ; فخ; ) ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM +FC30;FC30;FC30;0641 0645;0641 0645; # (ﰰ; ﰰ; ﰰ; فم; فم; ) ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM +FC31;FC31;FC31;0641 0649;0641 0649; # (ﰱ; ﰱ; ﰱ; فى; فى; ) ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM +FC32;FC32;FC32;0641 064A;0641 064A; # (ﰲ; ﰲ; ﰲ; في; في; ) ARABIC LIGATURE FEH WITH YEH ISOLATED FORM +FC33;FC33;FC33;0642 062D;0642 062D; # (ﰳ; ﰳ; ﰳ; قح; قح; ) ARABIC LIGATURE QAF WITH HAH ISOLATED FORM +FC34;FC34;FC34;0642 0645;0642 0645; # (ﰴ; ﰴ; ﰴ; قم; قم; ) ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM +FC35;FC35;FC35;0642 0649;0642 0649; # (ﰵ; ﰵ; ﰵ; قى; قى; ) ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM +FC36;FC36;FC36;0642 064A;0642 064A; # (ﰶ; ﰶ; ﰶ; قي; قي; ) ARABIC LIGATURE QAF WITH YEH ISOLATED FORM +FC37;FC37;FC37;0643 0627;0643 0627; # (ﰷ; ﰷ; ﰷ; كا; كا; ) ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM +FC38;FC38;FC38;0643 062C;0643 062C; # (ﰸ; ﰸ; ﰸ; كج; كج; ) ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM +FC39;FC39;FC39;0643 062D;0643 062D; # (ﰹ; ﰹ; ﰹ; كح; كح; ) ARABIC LIGATURE KAF WITH HAH ISOLATED FORM +FC3A;FC3A;FC3A;0643 062E;0643 062E; # (ﰺ; ﰺ; ﰺ; كخ; كخ; ) ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM +FC3B;FC3B;FC3B;0643 0644;0643 0644; # (ﰻ; ﰻ; ﰻ; كل; كل; ) ARABIC LIGATURE KAF WITH LAM ISOLATED FORM +FC3C;FC3C;FC3C;0643 0645;0643 0645; # (ﰼ; ﰼ; ﰼ; كم; كم; ) ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM +FC3D;FC3D;FC3D;0643 0649;0643 0649; # (ﰽ; ﰽ; ﰽ; كى; كى; ) ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM +FC3E;FC3E;FC3E;0643 064A;0643 064A; # (ﰾ; ﰾ; ﰾ; كي; كي; ) ARABIC LIGATURE KAF WITH YEH ISOLATED FORM +FC3F;FC3F;FC3F;0644 062C;0644 062C; # (ﰿ; ﰿ; ﰿ; لج; لج; ) ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM +FC40;FC40;FC40;0644 062D;0644 062D; # (ﱀ; ﱀ; ﱀ; لح; لح; ) ARABIC LIGATURE LAM WITH HAH ISOLATED FORM +FC41;FC41;FC41;0644 062E;0644 062E; # (ﱁ; ﱁ; ﱁ; لخ; لخ; ) ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM +FC42;FC42;FC42;0644 0645;0644 0645; # (ﱂ; ﱂ; ﱂ; لم; لم; ) ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM +FC43;FC43;FC43;0644 0649;0644 0649; # (ﱃ; ﱃ; ﱃ; لى; لى; ) ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM +FC44;FC44;FC44;0644 064A;0644 064A; # (ﱄ; ﱄ; ﱄ; لي; لي; ) ARABIC LIGATURE LAM WITH YEH ISOLATED FORM +FC45;FC45;FC45;0645 062C;0645 062C; # (ﱅ; ﱅ; ﱅ; مج; مج; ) ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM +FC46;FC46;FC46;0645 062D;0645 062D; # (ﱆ; ﱆ; ﱆ; مح; مح; ) ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM +FC47;FC47;FC47;0645 062E;0645 062E; # (ﱇ; ﱇ; ﱇ; مخ; مخ; ) ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM +FC48;FC48;FC48;0645 0645;0645 0645; # (ﱈ; ﱈ; ﱈ; مم; مم; ) ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM +FC49;FC49;FC49;0645 0649;0645 0649; # (ﱉ; ﱉ; ﱉ; مى; مى; ) ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM +FC4A;FC4A;FC4A;0645 064A;0645 064A; # (ﱊ; ﱊ; ﱊ; مي; مي; ) ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM +FC4B;FC4B;FC4B;0646 062C;0646 062C; # (ﱋ; ﱋ; ﱋ; نج; نج; ) ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM +FC4C;FC4C;FC4C;0646 062D;0646 062D; # (ﱌ; ﱌ; ﱌ; نح; نح; ) ARABIC LIGATURE NOON WITH HAH ISOLATED FORM +FC4D;FC4D;FC4D;0646 062E;0646 062E; # (ﱍ; ﱍ; ﱍ; نخ; نخ; ) ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM +FC4E;FC4E;FC4E;0646 0645;0646 0645; # (ﱎ; ﱎ; ﱎ; نم; نم; ) ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM +FC4F;FC4F;FC4F;0646 0649;0646 0649; # (ﱏ; ﱏ; ﱏ; نى; نى; ) ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM +FC50;FC50;FC50;0646 064A;0646 064A; # (ﱐ; ﱐ; ﱐ; ني; ني; ) ARABIC LIGATURE NOON WITH YEH ISOLATED FORM +FC51;FC51;FC51;0647 062C;0647 062C; # (ﱑ; ﱑ; ﱑ; هج; هج; ) ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM +FC52;FC52;FC52;0647 0645;0647 0645; # (ﱒ; ﱒ; ﱒ; هم; هم; ) ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM +FC53;FC53;FC53;0647 0649;0647 0649; # (ﱓ; ﱓ; ﱓ; هى; هى; ) ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM +FC54;FC54;FC54;0647 064A;0647 064A; # (ﱔ; ﱔ; ﱔ; هي; هي; ) ARABIC LIGATURE HEH WITH YEH ISOLATED FORM +FC55;FC55;FC55;064A 062C;064A 062C; # (ﱕ; ﱕ; ﱕ; يج; يج; ) ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM +FC56;FC56;FC56;064A 062D;064A 062D; # (ﱖ; ﱖ; ﱖ; يح; يح; ) ARABIC LIGATURE YEH WITH HAH ISOLATED FORM +FC57;FC57;FC57;064A 062E;064A 062E; # (ﱗ; ﱗ; ﱗ; يخ; يخ; ) ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM +FC58;FC58;FC58;064A 0645;064A 0645; # (ﱘ; ﱘ; ﱘ; يم; يم; ) ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM +FC59;FC59;FC59;064A 0649;064A 0649; # (ﱙ; ﱙ; ﱙ; يى; يى; ) ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM +FC5A;FC5A;FC5A;064A 064A;064A 064A; # (ﱚ; ﱚ; ﱚ; يي; يي; ) ARABIC LIGATURE YEH WITH YEH ISOLATED FORM +FC5B;FC5B;FC5B;0630 0670;0630 0670; # (ﱛ; ﱛ; ﱛ; ذ◌ٰ; ذ◌ٰ; ) ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5C;FC5C;FC5C;0631 0670;0631 0670; # (ﱜ; ﱜ; ﱜ; ر◌ٰ; ر◌ٰ; ) ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5D;FC5D;FC5D;0649 0670;0649 0670; # (ﱝ; ﱝ; ﱝ; ى◌ٰ; ى◌ٰ; ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC5E;FC5E;FC5E;0020 064C 0651;0020 064C 0651; # (ﱞ; ﱞ; ﱞ; ◌ٌ◌ّ; ◌ٌ◌ّ; ) ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM +FC5F;FC5F;FC5F;0020 064D 0651;0020 064D 0651; # (ﱟ; ﱟ; ﱟ; ◌ٍ◌ّ; ◌ٍ◌ّ; ) ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM +FC60;FC60;FC60;0020 064E 0651;0020 064E 0651; # (ﱠ; ﱠ; ﱠ; ◌َ◌ّ; ◌َ◌ّ; ) ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM +FC61;FC61;FC61;0020 064F 0651;0020 064F 0651; # (ﱡ; ﱡ; ﱡ; ◌ُ◌ّ; ◌ُ◌ّ; ) ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM +FC62;FC62;FC62;0020 0650 0651;0020 0650 0651; # (ﱢ; ﱢ; ﱢ; ◌ِ◌ّ; ◌ِ◌ّ; ) ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM +FC63;FC63;FC63;0020 0651 0670;0020 0651 0670; # (ﱣ; ﱣ; ﱣ; ◌ّ◌ٰ; ◌ّ◌ٰ; ) ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM +FC64;FC64;FC64;0626 0631;064A 0654 0631; # (ﱤ; ﱤ; ﱤ; ئر; ي◌ٔر; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM +FC65;FC65;FC65;0626 0632;064A 0654 0632; # (ﱥ; ﱥ; ﱥ; ئز; ي◌ٔز; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM +FC66;FC66;FC66;0626 0645;064A 0654 0645; # (ﱦ; ﱦ; ﱦ; ئم; ي◌ٔم; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM +FC67;FC67;FC67;0626 0646;064A 0654 0646; # (ﱧ; ﱧ; ﱧ; ئن; ي◌ٔن; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM +FC68;FC68;FC68;0626 0649;064A 0654 0649; # (ﱨ; ﱨ; ﱨ; ئى; ي◌ٔى; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +FC69;FC69;FC69;0626 064A;064A 0654 064A; # (ﱩ; ﱩ; ﱩ; ئي; ي◌ٔي; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM +FC6A;FC6A;FC6A;0628 0631;0628 0631; # (ﱪ; ﱪ; ﱪ; بر; بر; ) ARABIC LIGATURE BEH WITH REH FINAL FORM +FC6B;FC6B;FC6B;0628 0632;0628 0632; # (ﱫ; ﱫ; ﱫ; بز; بز; ) ARABIC LIGATURE BEH WITH ZAIN FINAL FORM +FC6C;FC6C;FC6C;0628 0645;0628 0645; # (ﱬ; ﱬ; ﱬ; بم; بم; ) ARABIC LIGATURE BEH WITH MEEM FINAL FORM +FC6D;FC6D;FC6D;0628 0646;0628 0646; # (ﱭ; ﱭ; ﱭ; بن; بن; ) ARABIC LIGATURE BEH WITH NOON FINAL FORM +FC6E;FC6E;FC6E;0628 0649;0628 0649; # (ﱮ; ﱮ; ﱮ; بى; بى; ) ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM +FC6F;FC6F;FC6F;0628 064A;0628 064A; # (ﱯ; ﱯ; ﱯ; بي; بي; ) ARABIC LIGATURE BEH WITH YEH FINAL FORM +FC70;FC70;FC70;062A 0631;062A 0631; # (ﱰ; ﱰ; ﱰ; تر; تر; ) ARABIC LIGATURE TEH WITH REH FINAL FORM +FC71;FC71;FC71;062A 0632;062A 0632; # (ﱱ; ﱱ; ﱱ; تز; تز; ) ARABIC LIGATURE TEH WITH ZAIN FINAL FORM +FC72;FC72;FC72;062A 0645;062A 0645; # (ﱲ; ﱲ; ﱲ; تم; تم; ) ARABIC LIGATURE TEH WITH MEEM FINAL FORM +FC73;FC73;FC73;062A 0646;062A 0646; # (ﱳ; ﱳ; ﱳ; تن; تن; ) ARABIC LIGATURE TEH WITH NOON FINAL FORM +FC74;FC74;FC74;062A 0649;062A 0649; # (ﱴ; ﱴ; ﱴ; تى; تى; ) ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM +FC75;FC75;FC75;062A 064A;062A 064A; # (ﱵ; ﱵ; ﱵ; تي; تي; ) ARABIC LIGATURE TEH WITH YEH FINAL FORM +FC76;FC76;FC76;062B 0631;062B 0631; # (ﱶ; ﱶ; ﱶ; ثر; ثر; ) ARABIC LIGATURE THEH WITH REH FINAL FORM +FC77;FC77;FC77;062B 0632;062B 0632; # (ﱷ; ﱷ; ﱷ; ثز; ثز; ) ARABIC LIGATURE THEH WITH ZAIN FINAL FORM +FC78;FC78;FC78;062B 0645;062B 0645; # (ﱸ; ﱸ; ﱸ; ثم; ثم; ) ARABIC LIGATURE THEH WITH MEEM FINAL FORM +FC79;FC79;FC79;062B 0646;062B 0646; # (ﱹ; ﱹ; ﱹ; ثن; ثن; ) ARABIC LIGATURE THEH WITH NOON FINAL FORM +FC7A;FC7A;FC7A;062B 0649;062B 0649; # (ﱺ; ﱺ; ﱺ; ثى; ثى; ) ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM +FC7B;FC7B;FC7B;062B 064A;062B 064A; # (ﱻ; ﱻ; ﱻ; ثي; ثي; ) ARABIC LIGATURE THEH WITH YEH FINAL FORM +FC7C;FC7C;FC7C;0641 0649;0641 0649; # (ﱼ; ﱼ; ﱼ; فى; فى; ) ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM +FC7D;FC7D;FC7D;0641 064A;0641 064A; # (ﱽ; ﱽ; ﱽ; في; في; ) ARABIC LIGATURE FEH WITH YEH FINAL FORM +FC7E;FC7E;FC7E;0642 0649;0642 0649; # (ﱾ; ﱾ; ﱾ; قى; قى; ) ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM +FC7F;FC7F;FC7F;0642 064A;0642 064A; # (ﱿ; ﱿ; ﱿ; قي; قي; ) ARABIC LIGATURE QAF WITH YEH FINAL FORM +FC80;FC80;FC80;0643 0627;0643 0627; # (ﲀ; ﲀ; ﲀ; كا; كا; ) ARABIC LIGATURE KAF WITH ALEF FINAL FORM +FC81;FC81;FC81;0643 0644;0643 0644; # (ﲁ; ﲁ; ﲁ; كل; كل; ) ARABIC LIGATURE KAF WITH LAM FINAL FORM +FC82;FC82;FC82;0643 0645;0643 0645; # (ﲂ; ﲂ; ﲂ; كم; كم; ) ARABIC LIGATURE KAF WITH MEEM FINAL FORM +FC83;FC83;FC83;0643 0649;0643 0649; # (ﲃ; ﲃ; ﲃ; كى; كى; ) ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM +FC84;FC84;FC84;0643 064A;0643 064A; # (ﲄ; ﲄ; ﲄ; كي; كي; ) ARABIC LIGATURE KAF WITH YEH FINAL FORM +FC85;FC85;FC85;0644 0645;0644 0645; # (ﲅ; ﲅ; ﲅ; لم; لم; ) ARABIC LIGATURE LAM WITH MEEM FINAL FORM +FC86;FC86;FC86;0644 0649;0644 0649; # (ﲆ; ﲆ; ﲆ; لى; لى; ) ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM +FC87;FC87;FC87;0644 064A;0644 064A; # (ﲇ; ﲇ; ﲇ; لي; لي; ) ARABIC LIGATURE LAM WITH YEH FINAL FORM +FC88;FC88;FC88;0645 0627;0645 0627; # (ﲈ; ﲈ; ﲈ; ما; ما; ) ARABIC LIGATURE MEEM WITH ALEF FINAL FORM +FC89;FC89;FC89;0645 0645;0645 0645; # (ﲉ; ﲉ; ﲉ; مم; مم; ) ARABIC LIGATURE MEEM WITH MEEM FINAL FORM +FC8A;FC8A;FC8A;0646 0631;0646 0631; # (ﲊ; ﲊ; ﲊ; نر; نر; ) ARABIC LIGATURE NOON WITH REH FINAL FORM +FC8B;FC8B;FC8B;0646 0632;0646 0632; # (ﲋ; ﲋ; ﲋ; نز; نز; ) ARABIC LIGATURE NOON WITH ZAIN FINAL FORM +FC8C;FC8C;FC8C;0646 0645;0646 0645; # (ﲌ; ﲌ; ﲌ; نم; نم; ) ARABIC LIGATURE NOON WITH MEEM FINAL FORM +FC8D;FC8D;FC8D;0646 0646;0646 0646; # (ﲍ; ﲍ; ﲍ; نن; نن; ) ARABIC LIGATURE NOON WITH NOON FINAL FORM +FC8E;FC8E;FC8E;0646 0649;0646 0649; # (ﲎ; ﲎ; ﲎ; نى; نى; ) ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM +FC8F;FC8F;FC8F;0646 064A;0646 064A; # (ﲏ; ﲏ; ﲏ; ني; ني; ) ARABIC LIGATURE NOON WITH YEH FINAL FORM +FC90;FC90;FC90;0649 0670;0649 0670; # (ﲐ; ﲐ; ﲐ; ى◌ٰ; ى◌ٰ; ) ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM +FC91;FC91;FC91;064A 0631;064A 0631; # (ﲑ; ﲑ; ﲑ; ير; ير; ) ARABIC LIGATURE YEH WITH REH FINAL FORM +FC92;FC92;FC92;064A 0632;064A 0632; # (ﲒ; ﲒ; ﲒ; يز; يز; ) ARABIC LIGATURE YEH WITH ZAIN FINAL FORM +FC93;FC93;FC93;064A 0645;064A 0645; # (ﲓ; ﲓ; ﲓ; يم; يم; ) ARABIC LIGATURE YEH WITH MEEM FINAL FORM +FC94;FC94;FC94;064A 0646;064A 0646; # (ﲔ; ﲔ; ﲔ; ين; ين; ) ARABIC LIGATURE YEH WITH NOON FINAL FORM +FC95;FC95;FC95;064A 0649;064A 0649; # (ﲕ; ﲕ; ﲕ; يى; يى; ) ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM +FC96;FC96;FC96;064A 064A;064A 064A; # (ﲖ; ﲖ; ﲖ; يي; يي; ) ARABIC LIGATURE YEH WITH YEH FINAL FORM +FC97;FC97;FC97;0626 062C;064A 0654 062C; # (ﲗ; ﲗ; ﲗ; ئج; ي◌ٔج; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM +FC98;FC98;FC98;0626 062D;064A 0654 062D; # (ﲘ; ﲘ; ﲘ; ئح; ي◌ٔح; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM +FC99;FC99;FC99;0626 062E;064A 0654 062E; # (ﲙ; ﲙ; ﲙ; ئخ; ي◌ٔخ; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM +FC9A;FC9A;FC9A;0626 0645;064A 0654 0645; # (ﲚ; ﲚ; ﲚ; ئم; ي◌ٔم; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM +FC9B;FC9B;FC9B;0626 0647;064A 0654 0647; # (ﲛ; ﲛ; ﲛ; ئه; ي◌ٔه; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM +FC9C;FC9C;FC9C;0628 062C;0628 062C; # (ﲜ; ﲜ; ﲜ; بج; بج; ) ARABIC LIGATURE BEH WITH JEEM INITIAL FORM +FC9D;FC9D;FC9D;0628 062D;0628 062D; # (ﲝ; ﲝ; ﲝ; بح; بح; ) ARABIC LIGATURE BEH WITH HAH INITIAL FORM +FC9E;FC9E;FC9E;0628 062E;0628 062E; # (ﲞ; ﲞ; ﲞ; بخ; بخ; ) ARABIC LIGATURE BEH WITH KHAH INITIAL FORM +FC9F;FC9F;FC9F;0628 0645;0628 0645; # (ﲟ; ﲟ; ﲟ; بم; بم; ) ARABIC LIGATURE BEH WITH MEEM INITIAL FORM +FCA0;FCA0;FCA0;0628 0647;0628 0647; # (ﲠ; ﲠ; ﲠ; به; به; ) ARABIC LIGATURE BEH WITH HEH INITIAL FORM +FCA1;FCA1;FCA1;062A 062C;062A 062C; # (ﲡ; ﲡ; ﲡ; تج; تج; ) ARABIC LIGATURE TEH WITH JEEM INITIAL FORM +FCA2;FCA2;FCA2;062A 062D;062A 062D; # (ﲢ; ﲢ; ﲢ; تح; تح; ) ARABIC LIGATURE TEH WITH HAH INITIAL FORM +FCA3;FCA3;FCA3;062A 062E;062A 062E; # (ﲣ; ﲣ; ﲣ; تخ; تخ; ) ARABIC LIGATURE TEH WITH KHAH INITIAL FORM +FCA4;FCA4;FCA4;062A 0645;062A 0645; # (ﲤ; ﲤ; ﲤ; تم; تم; ) ARABIC LIGATURE TEH WITH MEEM INITIAL FORM +FCA5;FCA5;FCA5;062A 0647;062A 0647; # (ﲥ; ﲥ; ﲥ; ته; ته; ) ARABIC LIGATURE TEH WITH HEH INITIAL FORM +FCA6;FCA6;FCA6;062B 0645;062B 0645; # (ﲦ; ﲦ; ﲦ; ثم; ثم; ) ARABIC LIGATURE THEH WITH MEEM INITIAL FORM +FCA7;FCA7;FCA7;062C 062D;062C 062D; # (ﲧ; ﲧ; ﲧ; جح; جح; ) ARABIC LIGATURE JEEM WITH HAH INITIAL FORM +FCA8;FCA8;FCA8;062C 0645;062C 0645; # (ﲨ; ﲨ; ﲨ; جم; جم; ) ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM +FCA9;FCA9;FCA9;062D 062C;062D 062C; # (ﲩ; ﲩ; ﲩ; حج; حج; ) ARABIC LIGATURE HAH WITH JEEM INITIAL FORM +FCAA;FCAA;FCAA;062D 0645;062D 0645; # (ﲪ; ﲪ; ﲪ; حم; حم; ) ARABIC LIGATURE HAH WITH MEEM INITIAL FORM +FCAB;FCAB;FCAB;062E 062C;062E 062C; # (ﲫ; ﲫ; ﲫ; خج; خج; ) ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM +FCAC;FCAC;FCAC;062E 0645;062E 0645; # (ﲬ; ﲬ; ﲬ; خم; خم; ) ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM +FCAD;FCAD;FCAD;0633 062C;0633 062C; # (ﲭ; ﲭ; ﲭ; سج; سج; ) ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM +FCAE;FCAE;FCAE;0633 062D;0633 062D; # (ﲮ; ﲮ; ﲮ; سح; سح; ) ARABIC LIGATURE SEEN WITH HAH INITIAL FORM +FCAF;FCAF;FCAF;0633 062E;0633 062E; # (ﲯ; ﲯ; ﲯ; سخ; سخ; ) ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM +FCB0;FCB0;FCB0;0633 0645;0633 0645; # (ﲰ; ﲰ; ﲰ; سم; سم; ) ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM +FCB1;FCB1;FCB1;0635 062D;0635 062D; # (ﲱ; ﲱ; ﲱ; صح; صح; ) ARABIC LIGATURE SAD WITH HAH INITIAL FORM +FCB2;FCB2;FCB2;0635 062E;0635 062E; # (ﲲ; ﲲ; ﲲ; صخ; صخ; ) ARABIC LIGATURE SAD WITH KHAH INITIAL FORM +FCB3;FCB3;FCB3;0635 0645;0635 0645; # (ﲳ; ﲳ; ﲳ; صم; صم; ) ARABIC LIGATURE SAD WITH MEEM INITIAL FORM +FCB4;FCB4;FCB4;0636 062C;0636 062C; # (ﲴ; ﲴ; ﲴ; ضج; ضج; ) ARABIC LIGATURE DAD WITH JEEM INITIAL FORM +FCB5;FCB5;FCB5;0636 062D;0636 062D; # (ﲵ; ﲵ; ﲵ; ضح; ضح; ) ARABIC LIGATURE DAD WITH HAH INITIAL FORM +FCB6;FCB6;FCB6;0636 062E;0636 062E; # (ﲶ; ﲶ; ﲶ; ضخ; ضخ; ) ARABIC LIGATURE DAD WITH KHAH INITIAL FORM +FCB7;FCB7;FCB7;0636 0645;0636 0645; # (ﲷ; ﲷ; ﲷ; ضم; ضم; ) ARABIC LIGATURE DAD WITH MEEM INITIAL FORM +FCB8;FCB8;FCB8;0637 062D;0637 062D; # (ﲸ; ﲸ; ﲸ; طح; طح; ) ARABIC LIGATURE TAH WITH HAH INITIAL FORM +FCB9;FCB9;FCB9;0638 0645;0638 0645; # (ﲹ; ﲹ; ﲹ; ظم; ظم; ) ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM +FCBA;FCBA;FCBA;0639 062C;0639 062C; # (ﲺ; ﲺ; ﲺ; عج; عج; ) ARABIC LIGATURE AIN WITH JEEM INITIAL FORM +FCBB;FCBB;FCBB;0639 0645;0639 0645; # (ﲻ; ﲻ; ﲻ; عم; عم; ) ARABIC LIGATURE AIN WITH MEEM INITIAL FORM +FCBC;FCBC;FCBC;063A 062C;063A 062C; # (ﲼ; ﲼ; ﲼ; غج; غج; ) ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM +FCBD;FCBD;FCBD;063A 0645;063A 0645; # (ﲽ; ﲽ; ﲽ; غم; غم; ) ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM +FCBE;FCBE;FCBE;0641 062C;0641 062C; # (ﲾ; ﲾ; ﲾ; فج; فج; ) ARABIC LIGATURE FEH WITH JEEM INITIAL FORM +FCBF;FCBF;FCBF;0641 062D;0641 062D; # (ﲿ; ﲿ; ﲿ; فح; فح; ) ARABIC LIGATURE FEH WITH HAH INITIAL FORM +FCC0;FCC0;FCC0;0641 062E;0641 062E; # (ﳀ; ﳀ; ﳀ; فخ; فخ; ) ARABIC LIGATURE FEH WITH KHAH INITIAL FORM +FCC1;FCC1;FCC1;0641 0645;0641 0645; # (ﳁ; ﳁ; ﳁ; فم; فم; ) ARABIC LIGATURE FEH WITH MEEM INITIAL FORM +FCC2;FCC2;FCC2;0642 062D;0642 062D; # (ﳂ; ﳂ; ﳂ; قح; قح; ) ARABIC LIGATURE QAF WITH HAH INITIAL FORM +FCC3;FCC3;FCC3;0642 0645;0642 0645; # (ﳃ; ﳃ; ﳃ; قم; قم; ) ARABIC LIGATURE QAF WITH MEEM INITIAL FORM +FCC4;FCC4;FCC4;0643 062C;0643 062C; # (ﳄ; ﳄ; ﳄ; كج; كج; ) ARABIC LIGATURE KAF WITH JEEM INITIAL FORM +FCC5;FCC5;FCC5;0643 062D;0643 062D; # (ﳅ; ﳅ; ﳅ; كح; كح; ) ARABIC LIGATURE KAF WITH HAH INITIAL FORM +FCC6;FCC6;FCC6;0643 062E;0643 062E; # (ﳆ; ﳆ; ﳆ; كخ; كخ; ) ARABIC LIGATURE KAF WITH KHAH INITIAL FORM +FCC7;FCC7;FCC7;0643 0644;0643 0644; # (ﳇ; ﳇ; ﳇ; كل; كل; ) ARABIC LIGATURE KAF WITH LAM INITIAL FORM +FCC8;FCC8;FCC8;0643 0645;0643 0645; # (ﳈ; ﳈ; ﳈ; كم; كم; ) ARABIC LIGATURE KAF WITH MEEM INITIAL FORM +FCC9;FCC9;FCC9;0644 062C;0644 062C; # (ﳉ; ﳉ; ﳉ; لج; لج; ) ARABIC LIGATURE LAM WITH JEEM INITIAL FORM +FCCA;FCCA;FCCA;0644 062D;0644 062D; # (ﳊ; ﳊ; ﳊ; لح; لح; ) ARABIC LIGATURE LAM WITH HAH INITIAL FORM +FCCB;FCCB;FCCB;0644 062E;0644 062E; # (ﳋ; ﳋ; ﳋ; لخ; لخ; ) ARABIC LIGATURE LAM WITH KHAH INITIAL FORM +FCCC;FCCC;FCCC;0644 0645;0644 0645; # (ﳌ; ﳌ; ﳌ; لم; لم; ) ARABIC LIGATURE LAM WITH MEEM INITIAL FORM +FCCD;FCCD;FCCD;0644 0647;0644 0647; # (ﳍ; ﳍ; ﳍ; له; له; ) ARABIC LIGATURE LAM WITH HEH INITIAL FORM +FCCE;FCCE;FCCE;0645 062C;0645 062C; # (ﳎ; ﳎ; ﳎ; مج; مج; ) ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM +FCCF;FCCF;FCCF;0645 062D;0645 062D; # (ﳏ; ﳏ; ﳏ; مح; مح; ) ARABIC LIGATURE MEEM WITH HAH INITIAL FORM +FCD0;FCD0;FCD0;0645 062E;0645 062E; # (ﳐ; ﳐ; ﳐ; مخ; مخ; ) ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM +FCD1;FCD1;FCD1;0645 0645;0645 0645; # (ﳑ; ﳑ; ﳑ; مم; مم; ) ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM +FCD2;FCD2;FCD2;0646 062C;0646 062C; # (ﳒ; ﳒ; ﳒ; نج; نج; ) ARABIC LIGATURE NOON WITH JEEM INITIAL FORM +FCD3;FCD3;FCD3;0646 062D;0646 062D; # (ﳓ; ﳓ; ﳓ; نح; نح; ) ARABIC LIGATURE NOON WITH HAH INITIAL FORM +FCD4;FCD4;FCD4;0646 062E;0646 062E; # (ﳔ; ﳔ; ﳔ; نخ; نخ; ) ARABIC LIGATURE NOON WITH KHAH INITIAL FORM +FCD5;FCD5;FCD5;0646 0645;0646 0645; # (ﳕ; ﳕ; ﳕ; نم; نم; ) ARABIC LIGATURE NOON WITH MEEM INITIAL FORM +FCD6;FCD6;FCD6;0646 0647;0646 0647; # (ﳖ; ﳖ; ﳖ; نه; نه; ) ARABIC LIGATURE NOON WITH HEH INITIAL FORM +FCD7;FCD7;FCD7;0647 062C;0647 062C; # (ﳗ; ﳗ; ﳗ; هج; هج; ) ARABIC LIGATURE HEH WITH JEEM INITIAL FORM +FCD8;FCD8;FCD8;0647 0645;0647 0645; # (ﳘ; ﳘ; ﳘ; هم; هم; ) ARABIC LIGATURE HEH WITH MEEM INITIAL FORM +FCD9;FCD9;FCD9;0647 0670;0647 0670; # (ﳙ; ﳙ; ﳙ; ه◌ٰ; ه◌ٰ; ) ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM +FCDA;FCDA;FCDA;064A 062C;064A 062C; # (ﳚ; ﳚ; ﳚ; يج; يج; ) ARABIC LIGATURE YEH WITH JEEM INITIAL FORM +FCDB;FCDB;FCDB;064A 062D;064A 062D; # (ﳛ; ﳛ; ﳛ; يح; يح; ) ARABIC LIGATURE YEH WITH HAH INITIAL FORM +FCDC;FCDC;FCDC;064A 062E;064A 062E; # (ﳜ; ﳜ; ﳜ; يخ; يخ; ) ARABIC LIGATURE YEH WITH KHAH INITIAL FORM +FCDD;FCDD;FCDD;064A 0645;064A 0645; # (ﳝ; ﳝ; ﳝ; يم; يم; ) ARABIC LIGATURE YEH WITH MEEM INITIAL FORM +FCDE;FCDE;FCDE;064A 0647;064A 0647; # (ﳞ; ﳞ; ﳞ; يه; يه; ) ARABIC LIGATURE YEH WITH HEH INITIAL FORM +FCDF;FCDF;FCDF;0626 0645;064A 0654 0645; # (ﳟ; ﳟ; ﳟ; ئم; ي◌ٔم; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM +FCE0;FCE0;FCE0;0626 0647;064A 0654 0647; # (ﳠ; ﳠ; ﳠ; ئه; ي◌ٔه; ) ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM +FCE1;FCE1;FCE1;0628 0645;0628 0645; # (ﳡ; ﳡ; ﳡ; بم; بم; ) ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM +FCE2;FCE2;FCE2;0628 0647;0628 0647; # (ﳢ; ﳢ; ﳢ; به; به; ) ARABIC LIGATURE BEH WITH HEH MEDIAL FORM +FCE3;FCE3;FCE3;062A 0645;062A 0645; # (ﳣ; ﳣ; ﳣ; تم; تم; ) ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM +FCE4;FCE4;FCE4;062A 0647;062A 0647; # (ﳤ; ﳤ; ﳤ; ته; ته; ) ARABIC LIGATURE TEH WITH HEH MEDIAL FORM +FCE5;FCE5;FCE5;062B 0645;062B 0645; # (ﳥ; ﳥ; ﳥ; ثم; ثم; ) ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM +FCE6;FCE6;FCE6;062B 0647;062B 0647; # (ﳦ; ﳦ; ﳦ; ثه; ثه; ) ARABIC LIGATURE THEH WITH HEH MEDIAL FORM +FCE7;FCE7;FCE7;0633 0645;0633 0645; # (ﳧ; ﳧ; ﳧ; سم; سم; ) ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM +FCE8;FCE8;FCE8;0633 0647;0633 0647; # (ﳨ; ﳨ; ﳨ; سه; سه; ) ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM +FCE9;FCE9;FCE9;0634 0645;0634 0645; # (ﳩ; ﳩ; ﳩ; شم; شم; ) ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM +FCEA;FCEA;FCEA;0634 0647;0634 0647; # (ﳪ; ﳪ; ﳪ; شه; شه; ) ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM +FCEB;FCEB;FCEB;0643 0644;0643 0644; # (ﳫ; ﳫ; ﳫ; كل; كل; ) ARABIC LIGATURE KAF WITH LAM MEDIAL FORM +FCEC;FCEC;FCEC;0643 0645;0643 0645; # (ﳬ; ﳬ; ﳬ; كم; كم; ) ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM +FCED;FCED;FCED;0644 0645;0644 0645; # (ﳭ; ﳭ; ﳭ; لم; لم; ) ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM +FCEE;FCEE;FCEE;0646 0645;0646 0645; # (ﳮ; ﳮ; ﳮ; نم; نم; ) ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM +FCEF;FCEF;FCEF;0646 0647;0646 0647; # (ﳯ; ﳯ; ﳯ; نه; نه; ) ARABIC LIGATURE NOON WITH HEH MEDIAL FORM +FCF0;FCF0;FCF0;064A 0645;064A 0645; # (ﳰ; ﳰ; ﳰ; يم; يم; ) ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM +FCF1;FCF1;FCF1;064A 0647;064A 0647; # (ﳱ; ﳱ; ﳱ; يه; يه; ) ARABIC LIGATURE YEH WITH HEH MEDIAL FORM +FCF2;FCF2;FCF2;0640 064E 0651;0640 064E 0651; # (ﳲ; ﳲ; ﳲ; ـ◌َ◌ّ; ـ◌َ◌ّ; ) ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM +FCF3;FCF3;FCF3;0640 064F 0651;0640 064F 0651; # (ﳳ; ﳳ; ﳳ; ـ◌ُ◌ّ; ـ◌ُ◌ّ; ) ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM +FCF4;FCF4;FCF4;0640 0650 0651;0640 0650 0651; # (ﳴ; ﳴ; ﳴ; ـ◌ِ◌ّ; ـ◌ِ◌ّ; ) ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM +FCF5;FCF5;FCF5;0637 0649;0637 0649; # (ﳵ; ﳵ; ﳵ; طى; طى; ) ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM +FCF6;FCF6;FCF6;0637 064A;0637 064A; # (ﳶ; ﳶ; ﳶ; طي; طي; ) ARABIC LIGATURE TAH WITH YEH ISOLATED FORM +FCF7;FCF7;FCF7;0639 0649;0639 0649; # (ﳷ; ﳷ; ﳷ; عى; عى; ) ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM +FCF8;FCF8;FCF8;0639 064A;0639 064A; # (ﳸ; ﳸ; ﳸ; عي; عي; ) ARABIC LIGATURE AIN WITH YEH ISOLATED FORM +FCF9;FCF9;FCF9;063A 0649;063A 0649; # (ﳹ; ﳹ; ﳹ; غى; غى; ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM +FCFA;FCFA;FCFA;063A 064A;063A 064A; # (ﳺ; ﳺ; ﳺ; غي; غي; ) ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM +FCFB;FCFB;FCFB;0633 0649;0633 0649; # (ﳻ; ﳻ; ﳻ; سى; سى; ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM +FCFC;FCFC;FCFC;0633 064A;0633 064A; # (ﳼ; ﳼ; ﳼ; سي; سي; ) ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM +FCFD;FCFD;FCFD;0634 0649;0634 0649; # (ﳽ; ﳽ; ﳽ; شى; شى; ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM +FCFE;FCFE;FCFE;0634 064A;0634 064A; # (ﳾ; ﳾ; ﳾ; شي; شي; ) ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM +FCFF;FCFF;FCFF;062D 0649;062D 0649; # (ﳿ; ﳿ; ﳿ; حى; حى; ) ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM +FD00;FD00;FD00;062D 064A;062D 064A; # (ﴀ; ﴀ; ﴀ; حي; حي; ) ARABIC LIGATURE HAH WITH YEH ISOLATED FORM +FD01;FD01;FD01;062C 0649;062C 0649; # (ﴁ; ﴁ; ﴁ; جى; جى; ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM +FD02;FD02;FD02;062C 064A;062C 064A; # (ﴂ; ﴂ; ﴂ; جي; جي; ) ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM +FD03;FD03;FD03;062E 0649;062E 0649; # (ﴃ; ﴃ; ﴃ; خى; خى; ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM +FD04;FD04;FD04;062E 064A;062E 064A; # (ﴄ; ﴄ; ﴄ; خي; خي; ) ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM +FD05;FD05;FD05;0635 0649;0635 0649; # (ﴅ; ﴅ; ﴅ; صى; صى; ) ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM +FD06;FD06;FD06;0635 064A;0635 064A; # (ﴆ; ﴆ; ﴆ; صي; صي; ) ARABIC LIGATURE SAD WITH YEH ISOLATED FORM +FD07;FD07;FD07;0636 0649;0636 0649; # (ﴇ; ﴇ; ﴇ; ضى; ضى; ) ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM +FD08;FD08;FD08;0636 064A;0636 064A; # (ﴈ; ﴈ; ﴈ; ضي; ضي; ) ARABIC LIGATURE DAD WITH YEH ISOLATED FORM +FD09;FD09;FD09;0634 062C;0634 062C; # (ﴉ; ﴉ; ﴉ; شج; شج; ) ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM +FD0A;FD0A;FD0A;0634 062D;0634 062D; # (ﴊ; ﴊ; ﴊ; شح; شح; ) ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM +FD0B;FD0B;FD0B;0634 062E;0634 062E; # (ﴋ; ﴋ; ﴋ; شخ; شخ; ) ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM +FD0C;FD0C;FD0C;0634 0645;0634 0645; # (ﴌ; ﴌ; ﴌ; شم; شم; ) ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM +FD0D;FD0D;FD0D;0634 0631;0634 0631; # (ﴍ; ﴍ; ﴍ; شر; شر; ) ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM +FD0E;FD0E;FD0E;0633 0631;0633 0631; # (ﴎ; ﴎ; ﴎ; سر; سر; ) ARABIC LIGATURE SEEN WITH REH ISOLATED FORM +FD0F;FD0F;FD0F;0635 0631;0635 0631; # (ﴏ; ﴏ; ﴏ; صر; صر; ) ARABIC LIGATURE SAD WITH REH ISOLATED FORM +FD10;FD10;FD10;0636 0631;0636 0631; # (ﴐ; ﴐ; ﴐ; ضر; ضر; ) ARABIC LIGATURE DAD WITH REH ISOLATED FORM +FD11;FD11;FD11;0637 0649;0637 0649; # (ﴑ; ﴑ; ﴑ; طى; طى; ) ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM +FD12;FD12;FD12;0637 064A;0637 064A; # (ﴒ; ﴒ; ﴒ; طي; طي; ) ARABIC LIGATURE TAH WITH YEH FINAL FORM +FD13;FD13;FD13;0639 0649;0639 0649; # (ﴓ; ﴓ; ﴓ; عى; عى; ) ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM +FD14;FD14;FD14;0639 064A;0639 064A; # (ﴔ; ﴔ; ﴔ; عي; عي; ) ARABIC LIGATURE AIN WITH YEH FINAL FORM +FD15;FD15;FD15;063A 0649;063A 0649; # (ﴕ; ﴕ; ﴕ; غى; غى; ) ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM +FD16;FD16;FD16;063A 064A;063A 064A; # (ﴖ; ﴖ; ﴖ; غي; غي; ) ARABIC LIGATURE GHAIN WITH YEH FINAL FORM +FD17;FD17;FD17;0633 0649;0633 0649; # (ﴗ; ﴗ; ﴗ; سى; سى; ) ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM +FD18;FD18;FD18;0633 064A;0633 064A; # (ﴘ; ﴘ; ﴘ; سي; سي; ) ARABIC LIGATURE SEEN WITH YEH FINAL FORM +FD19;FD19;FD19;0634 0649;0634 0649; # (ﴙ; ﴙ; ﴙ; شى; شى; ) ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM +FD1A;FD1A;FD1A;0634 064A;0634 064A; # (ﴚ; ﴚ; ﴚ; شي; شي; ) ARABIC LIGATURE SHEEN WITH YEH FINAL FORM +FD1B;FD1B;FD1B;062D 0649;062D 0649; # (ﴛ; ﴛ; ﴛ; حى; حى; ) ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM +FD1C;FD1C;FD1C;062D 064A;062D 064A; # (ﴜ; ﴜ; ﴜ; حي; حي; ) ARABIC LIGATURE HAH WITH YEH FINAL FORM +FD1D;FD1D;FD1D;062C 0649;062C 0649; # (ﴝ; ﴝ; ﴝ; جى; جى; ) ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM +FD1E;FD1E;FD1E;062C 064A;062C 064A; # (ﴞ; ﴞ; ﴞ; جي; جي; ) ARABIC LIGATURE JEEM WITH YEH FINAL FORM +FD1F;FD1F;FD1F;062E 0649;062E 0649; # (ﴟ; ﴟ; ﴟ; خى; خى; ) ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM +FD20;FD20;FD20;062E 064A;062E 064A; # (ﴠ; ﴠ; ﴠ; خي; خي; ) ARABIC LIGATURE KHAH WITH YEH FINAL FORM +FD21;FD21;FD21;0635 0649;0635 0649; # (ﴡ; ﴡ; ﴡ; صى; صى; ) ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM +FD22;FD22;FD22;0635 064A;0635 064A; # (ﴢ; ﴢ; ﴢ; صي; صي; ) ARABIC LIGATURE SAD WITH YEH FINAL FORM +FD23;FD23;FD23;0636 0649;0636 0649; # (ﴣ; ﴣ; ﴣ; ضى; ضى; ) ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM +FD24;FD24;FD24;0636 064A;0636 064A; # (ﴤ; ﴤ; ﴤ; ضي; ضي; ) ARABIC LIGATURE DAD WITH YEH FINAL FORM +FD25;FD25;FD25;0634 062C;0634 062C; # (ﴥ; ﴥ; ﴥ; شج; شج; ) ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM +FD26;FD26;FD26;0634 062D;0634 062D; # (ﴦ; ﴦ; ﴦ; شح; شح; ) ARABIC LIGATURE SHEEN WITH HAH FINAL FORM +FD27;FD27;FD27;0634 062E;0634 062E; # (ﴧ; ﴧ; ﴧ; شخ; شخ; ) ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM +FD28;FD28;FD28;0634 0645;0634 0645; # (ﴨ; ﴨ; ﴨ; شم; شم; ) ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM +FD29;FD29;FD29;0634 0631;0634 0631; # (ﴩ; ﴩ; ﴩ; شر; شر; ) ARABIC LIGATURE SHEEN WITH REH FINAL FORM +FD2A;FD2A;FD2A;0633 0631;0633 0631; # (ﴪ; ﴪ; ﴪ; سر; سر; ) ARABIC LIGATURE SEEN WITH REH FINAL FORM +FD2B;FD2B;FD2B;0635 0631;0635 0631; # (ﴫ; ﴫ; ﴫ; صر; صر; ) ARABIC LIGATURE SAD WITH REH FINAL FORM +FD2C;FD2C;FD2C;0636 0631;0636 0631; # (ﴬ; ﴬ; ﴬ; ضر; ضر; ) ARABIC LIGATURE DAD WITH REH FINAL FORM +FD2D;FD2D;FD2D;0634 062C;0634 062C; # (ﴭ; ﴭ; ﴭ; شج; شج; ) ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM +FD2E;FD2E;FD2E;0634 062D;0634 062D; # (ﴮ; ﴮ; ﴮ; شح; شح; ) ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM +FD2F;FD2F;FD2F;0634 062E;0634 062E; # (ﴯ; ﴯ; ﴯ; شخ; شخ; ) ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM +FD30;FD30;FD30;0634 0645;0634 0645; # (ﴰ; ﴰ; ﴰ; شم; شم; ) ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM +FD31;FD31;FD31;0633 0647;0633 0647; # (ﴱ; ﴱ; ﴱ; سه; سه; ) ARABIC LIGATURE SEEN WITH HEH INITIAL FORM +FD32;FD32;FD32;0634 0647;0634 0647; # (ﴲ; ﴲ; ﴲ; شه; شه; ) ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM +FD33;FD33;FD33;0637 0645;0637 0645; # (ﴳ; ﴳ; ﴳ; طم; طم; ) ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +FD34;FD34;FD34;0633 062C;0633 062C; # (ﴴ; ﴴ; ﴴ; سج; سج; ) ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM +FD35;FD35;FD35;0633 062D;0633 062D; # (ﴵ; ﴵ; ﴵ; سح; سح; ) ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM +FD36;FD36;FD36;0633 062E;0633 062E; # (ﴶ; ﴶ; ﴶ; سخ; سخ; ) ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM +FD37;FD37;FD37;0634 062C;0634 062C; # (ﴷ; ﴷ; ﴷ; شج; شج; ) ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM +FD38;FD38;FD38;0634 062D;0634 062D; # (ﴸ; ﴸ; ﴸ; شح; شح; ) ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM +FD39;FD39;FD39;0634 062E;0634 062E; # (ﴹ; ﴹ; ﴹ; شخ; شخ; ) ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM +FD3A;FD3A;FD3A;0637 0645;0637 0645; # (ﴺ; ﴺ; ﴺ; طم; طم; ) ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM +FD3B;FD3B;FD3B;0638 0645;0638 0645; # (ﴻ; ﴻ; ﴻ; ظم; ظم; ) ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +FD3C;FD3C;FD3C;0627 064B;0627 064B; # (ﴼ; ﴼ; ﴼ; ا◌ً; ا◌ً; ) ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM +FD3D;FD3D;FD3D;0627 064B;0627 064B; # (ﴽ; ﴽ; ﴽ; ا◌ً; ا◌ً; ) ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD50;FD50;FD50;062A 062C 0645;062A 062C 0645; # (ﵐ; ﵐ; ﵐ; تجم; تجم; ) ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +FD51;FD51;FD51;062A 062D 062C;062A 062D 062C; # (ﵑ; ﵑ; ﵑ; تحج; تحج; ) ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM +FD52;FD52;FD52;062A 062D 062C;062A 062D 062C; # (ﵒ; ﵒ; ﵒ; تحج; تحج; ) ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM +FD53;FD53;FD53;062A 062D 0645;062A 062D 0645; # (ﵓ; ﵓ; ﵓ; تحم; تحم; ) ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM +FD54;FD54;FD54;062A 062E 0645;062A 062E 0645; # (ﵔ; ﵔ; ﵔ; تخم; تخم; ) ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM +FD55;FD55;FD55;062A 0645 062C;062A 0645 062C; # (ﵕ; ﵕ; ﵕ; تمج; تمج; ) ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM +FD56;FD56;FD56;062A 0645 062D;062A 0645 062D; # (ﵖ; ﵖ; ﵖ; تمح; تمح; ) ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM +FD57;FD57;FD57;062A 0645 062E;062A 0645 062E; # (ﵗ; ﵗ; ﵗ; تمخ; تمخ; ) ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +FD58;FD58;FD58;062C 0645 062D;062C 0645 062D; # (ﵘ; ﵘ; ﵘ; جمح; جمح; ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM +FD59;FD59;FD59;062C 0645 062D;062C 0645 062D; # (ﵙ; ﵙ; ﵙ; جمح; جمح; ) ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +FD5A;FD5A;FD5A;062D 0645 064A;062D 0645 064A; # (ﵚ; ﵚ; ﵚ; حمي; حمي; ) ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM +FD5B;FD5B;FD5B;062D 0645 0649;062D 0645 0649; # (ﵛ; ﵛ; ﵛ; حمى; حمى; ) ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD5C;FD5C;FD5C;0633 062D 062C;0633 062D 062C; # (ﵜ; ﵜ; ﵜ; سحج; سحج; ) ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM +FD5D;FD5D;FD5D;0633 062C 062D;0633 062C 062D; # (ﵝ; ﵝ; ﵝ; سجح; سجح; ) ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +FD5E;FD5E;FD5E;0633 062C 0649;0633 062C 0649; # (ﵞ; ﵞ; ﵞ; سجى; سجى; ) ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD5F;FD5F;FD5F;0633 0645 062D;0633 0645 062D; # (ﵟ; ﵟ; ﵟ; سمح; سمح; ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM +FD60;FD60;FD60;0633 0645 062D;0633 0645 062D; # (ﵠ; ﵠ; ﵠ; سمح; سمح; ) ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM +FD61;FD61;FD61;0633 0645 062C;0633 0645 062C; # (ﵡ; ﵡ; ﵡ; سمج; سمج; ) ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +FD62;FD62;FD62;0633 0645 0645;0633 0645 0645; # (ﵢ; ﵢ; ﵢ; سمم; سمم; ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM +FD63;FD63;FD63;0633 0645 0645;0633 0645 0645; # (ﵣ; ﵣ; ﵣ; سمم; سمم; ) ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +FD64;FD64;FD64;0635 062D 062D;0635 062D 062D; # (ﵤ; ﵤ; ﵤ; صحح; صحح; ) ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM +FD65;FD65;FD65;0635 062D 062D;0635 062D 062D; # (ﵥ; ﵥ; ﵥ; صحح; صحح; ) ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +FD66;FD66;FD66;0635 0645 0645;0635 0645 0645; # (ﵦ; ﵦ; ﵦ; صمم; صمم; ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM +FD67;FD67;FD67;0634 062D 0645;0634 062D 0645; # (ﵧ; ﵧ; ﵧ; شحم; شحم; ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM +FD68;FD68;FD68;0634 062D 0645;0634 062D 0645; # (ﵨ; ﵨ; ﵨ; شحم; شحم; ) ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +FD69;FD69;FD69;0634 062C 064A;0634 062C 064A; # (ﵩ; ﵩ; ﵩ; شجي; شجي; ) ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM +FD6A;FD6A;FD6A;0634 0645 062E;0634 0645 062E; # (ﵪ; ﵪ; ﵪ; شمخ; شمخ; ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM +FD6B;FD6B;FD6B;0634 0645 062E;0634 0645 062E; # (ﵫ; ﵫ; ﵫ; شمخ; شمخ; ) ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +FD6C;FD6C;FD6C;0634 0645 0645;0634 0645 0645; # (ﵬ; ﵬ; ﵬ; شمم; شمم; ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM +FD6D;FD6D;FD6D;0634 0645 0645;0634 0645 0645; # (ﵭ; ﵭ; ﵭ; شمم; شمم; ) ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +FD6E;FD6E;FD6E;0636 062D 0649;0636 062D 0649; # (ﵮ; ﵮ; ﵮ; ضحى; ضحى; ) ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM +FD6F;FD6F;FD6F;0636 062E 0645;0636 062E 0645; # (ﵯ; ﵯ; ﵯ; ضخم; ضخم; ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM +FD70;FD70;FD70;0636 062E 0645;0636 062E 0645; # (ﵰ; ﵰ; ﵰ; ضخم; ضخم; ) ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +FD71;FD71;FD71;0637 0645 062D;0637 0645 062D; # (ﵱ; ﵱ; ﵱ; طمح; طمح; ) ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM +FD72;FD72;FD72;0637 0645 062D;0637 0645 062D; # (ﵲ; ﵲ; ﵲ; طمح; طمح; ) ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM +FD73;FD73;FD73;0637 0645 0645;0637 0645 0645; # (ﵳ; ﵳ; ﵳ; طمم; طمم; ) ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +FD74;FD74;FD74;0637 0645 064A;0637 0645 064A; # (ﵴ; ﵴ; ﵴ; طمي; طمي; ) ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM +FD75;FD75;FD75;0639 062C 0645;0639 062C 0645; # (ﵵ; ﵵ; ﵵ; عجم; عجم; ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM +FD76;FD76;FD76;0639 0645 0645;0639 0645 0645; # (ﵶ; ﵶ; ﵶ; عمم; عمم; ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM +FD77;FD77;FD77;0639 0645 0645;0639 0645 0645; # (ﵷ; ﵷ; ﵷ; عمم; عمم; ) ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +FD78;FD78;FD78;0639 0645 0649;0639 0645 0649; # (ﵸ; ﵸ; ﵸ; عمى; عمى; ) ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD79;FD79;FD79;063A 0645 0645;063A 0645 0645; # (ﵹ; ﵹ; ﵹ; غمم; غمم; ) ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM +FD7A;FD7A;FD7A;063A 0645 064A;063A 0645 064A; # (ﵺ; ﵺ; ﵺ; غمي; غمي; ) ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM +FD7B;FD7B;FD7B;063A 0645 0649;063A 0645 0649; # (ﵻ; ﵻ; ﵻ; غمى; غمى; ) ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD7C;FD7C;FD7C;0641 062E 0645;0641 062E 0645; # (ﵼ; ﵼ; ﵼ; فخم; فخم; ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM +FD7D;FD7D;FD7D;0641 062E 0645;0641 062E 0645; # (ﵽ; ﵽ; ﵽ; فخم; فخم; ) ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +FD7E;FD7E;FD7E;0642 0645 062D;0642 0645 062D; # (ﵾ; ﵾ; ﵾ; قمح; قمح; ) ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM +FD7F;FD7F;FD7F;0642 0645 0645;0642 0645 0645; # (ﵿ; ﵿ; ﵿ; قمم; قمم; ) ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM +FD80;FD80;FD80;0644 062D 0645;0644 062D 0645; # (ﶀ; ﶀ; ﶀ; لحم; لحم; ) ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM +FD81;FD81;FD81;0644 062D 064A;0644 062D 064A; # (ﶁ; ﶁ; ﶁ; لحي; لحي; ) ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM +FD82;FD82;FD82;0644 062D 0649;0644 062D 0649; # (ﶂ; ﶂ; ﶂ; لحى; لحى; ) ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +FD83;FD83;FD83;0644 062C 062C;0644 062C 062C; # (ﶃ; ﶃ; ﶃ; لجج; لجج; ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM +FD84;FD84;FD84;0644 062C 062C;0644 062C 062C; # (ﶄ; ﶄ; ﶄ; لجج; لجج; ) ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM +FD85;FD85;FD85;0644 062E 0645;0644 062E 0645; # (ﶅ; ﶅ; ﶅ; لخم; لخم; ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM +FD86;FD86;FD86;0644 062E 0645;0644 062E 0645; # (ﶆ; ﶆ; ﶆ; لخم; لخم; ) ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +FD87;FD87;FD87;0644 0645 062D;0644 0645 062D; # (ﶇ; ﶇ; ﶇ; لمح; لمح; ) ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM +FD88;FD88;FD88;0644 0645 062D;0644 0645 062D; # (ﶈ; ﶈ; ﶈ; لمح; لمح; ) ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM +FD89;FD89;FD89;0645 062D 062C;0645 062D 062C; # (ﶉ; ﶉ; ﶉ; محج; محج; ) ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM +FD8A;FD8A;FD8A;0645 062D 0645;0645 062D 0645; # (ﶊ; ﶊ; ﶊ; محم; محم; ) ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +FD8B;FD8B;FD8B;0645 062D 064A;0645 062D 064A; # (ﶋ; ﶋ; ﶋ; محي; محي; ) ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +FD8C;FD8C;FD8C;0645 062C 062D;0645 062C 062D; # (ﶌ; ﶌ; ﶌ; مجح; مجح; ) ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM +FD8D;FD8D;FD8D;0645 062C 0645;0645 062C 0645; # (ﶍ; ﶍ; ﶍ; مجم; مجم; ) ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM +FD8E;FD8E;FD8E;0645 062E 062C;0645 062E 062C; # (ﶎ; ﶎ; ﶎ; مخج; مخج; ) ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM +FD8F;FD8F;FD8F;0645 062E 0645;0645 062E 0645; # (ﶏ; ﶏ; ﶏ; مخم; مخم; ) ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92;FD92;FD92;0645 062C 062E;0645 062C 062E; # (ﶒ; ﶒ; ﶒ; مجخ; مجخ; ) ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM +FD93;FD93;FD93;0647 0645 062C;0647 0645 062C; # (ﶓ; ﶓ; ﶓ; همج; همج; ) ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM +FD94;FD94;FD94;0647 0645 0645;0647 0645 0645; # (ﶔ; ﶔ; ﶔ; همم; همم; ) ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM +FD95;FD95;FD95;0646 062D 0645;0646 062D 0645; # (ﶕ; ﶕ; ﶕ; نحم; نحم; ) ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +FD96;FD96;FD96;0646 062D 0649;0646 062D 0649; # (ﶖ; ﶖ; ﶖ; نحى; نحى; ) ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM +FD97;FD97;FD97;0646 062C 0645;0646 062C 0645; # (ﶗ; ﶗ; ﶗ; نجم; نجم; ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM +FD98;FD98;FD98;0646 062C 0645;0646 062C 0645; # (ﶘ; ﶘ; ﶘ; نجم; نجم; ) ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +FD99;FD99;FD99;0646 062C 0649;0646 062C 0649; # (ﶙ; ﶙ; ﶙ; نجى; نجى; ) ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM +FD9A;FD9A;FD9A;0646 0645 064A;0646 0645 064A; # (ﶚ; ﶚ; ﶚ; نمي; نمي; ) ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM +FD9B;FD9B;FD9B;0646 0645 0649;0646 0645 0649; # (ﶛ; ﶛ; ﶛ; نمى; نمى; ) ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM +FD9C;FD9C;FD9C;064A 0645 0645;064A 0645 0645; # (ﶜ; ﶜ; ﶜ; يمم; يمم; ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM +FD9D;FD9D;FD9D;064A 0645 0645;064A 0645 0645; # (ﶝ; ﶝ; ﶝ; يمم; يمم; ) ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +FD9E;FD9E;FD9E;0628 062E 064A;0628 062E 064A; # (ﶞ; ﶞ; ﶞ; بخي; بخي; ) ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM +FD9F;FD9F;FD9F;062A 062C 064A;062A 062C 064A; # (ﶟ; ﶟ; ﶟ; تجي; تجي; ) ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM +FDA0;FDA0;FDA0;062A 062C 0649;062A 062C 0649; # (ﶠ; ﶠ; ﶠ; تجى; تجى; ) ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM +FDA1;FDA1;FDA1;062A 062E 064A;062A 062E 064A; # (ﶡ; ﶡ; ﶡ; تخي; تخي; ) ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM +FDA2;FDA2;FDA2;062A 062E 0649;062A 062E 0649; # (ﶢ; ﶢ; ﶢ; تخى; تخى; ) ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA3;FDA3;FDA3;062A 0645 064A;062A 0645 064A; # (ﶣ; ﶣ; ﶣ; تمي; تمي; ) ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM +FDA4;FDA4;FDA4;062A 0645 0649;062A 0645 0649; # (ﶤ; ﶤ; ﶤ; تمى; تمى; ) ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA5;FDA5;FDA5;062C 0645 064A;062C 0645 064A; # (ﶥ; ﶥ; ﶥ; جمي; جمي; ) ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM +FDA6;FDA6;FDA6;062C 062D 0649;062C 062D 0649; # (ﶦ; ﶦ; ﶦ; جحى; جحى; ) ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM +FDA7;FDA7;FDA7;062C 0645 0649;062C 0645 0649; # (ﶧ; ﶧ; ﶧ; جمى; جمى; ) ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM +FDA8;FDA8;FDA8;0633 062E 0649;0633 062E 0649; # (ﶨ; ﶨ; ﶨ; سخى; سخى; ) ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM +FDA9;FDA9;FDA9;0635 062D 064A;0635 062D 064A; # (ﶩ; ﶩ; ﶩ; صحي; صحي; ) ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM +FDAA;FDAA;FDAA;0634 062D 064A;0634 062D 064A; # (ﶪ; ﶪ; ﶪ; شحي; شحي; ) ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM +FDAB;FDAB;FDAB;0636 062D 064A;0636 062D 064A; # (ﶫ; ﶫ; ﶫ; ضحي; ضحي; ) ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM +FDAC;FDAC;FDAC;0644 062C 064A;0644 062C 064A; # (ﶬ; ﶬ; ﶬ; لجي; لجي; ) ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM +FDAD;FDAD;FDAD;0644 0645 064A;0644 0645 064A; # (ﶭ; ﶭ; ﶭ; لمي; لمي; ) ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM +FDAE;FDAE;FDAE;064A 062D 064A;064A 062D 064A; # (ﶮ; ﶮ; ﶮ; يحي; يحي; ) ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM +FDAF;FDAF;FDAF;064A 062C 064A;064A 062C 064A; # (ﶯ; ﶯ; ﶯ; يجي; يجي; ) ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM +FDB0;FDB0;FDB0;064A 0645 064A;064A 0645 064A; # (ﶰ; ﶰ; ﶰ; يمي; يمي; ) ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM +FDB1;FDB1;FDB1;0645 0645 064A;0645 0645 064A; # (ﶱ; ﶱ; ﶱ; ممي; ممي; ) ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM +FDB2;FDB2;FDB2;0642 0645 064A;0642 0645 064A; # (ﶲ; ﶲ; ﶲ; قمي; قمي; ) ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM +FDB3;FDB3;FDB3;0646 062D 064A;0646 062D 064A; # (ﶳ; ﶳ; ﶳ; نحي; نحي; ) ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +FDB4;FDB4;FDB4;0642 0645 062D;0642 0645 062D; # (ﶴ; ﶴ; ﶴ; قمح; قمح; ) ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM +FDB5;FDB5;FDB5;0644 062D 0645;0644 062D 0645; # (ﶵ; ﶵ; ﶵ; لحم; لحم; ) ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +FDB6;FDB6;FDB6;0639 0645 064A;0639 0645 064A; # (ﶶ; ﶶ; ﶶ; عمي; عمي; ) ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM +FDB7;FDB7;FDB7;0643 0645 064A;0643 0645 064A; # (ﶷ; ﶷ; ﶷ; كمي; كمي; ) ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +FDB8;FDB8;FDB8;0646 062C 062D;0646 062C 062D; # (ﶸ; ﶸ; ﶸ; نجح; نجح; ) ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +FDB9;FDB9;FDB9;0645 062E 064A;0645 062E 064A; # (ﶹ; ﶹ; ﶹ; مخي; مخي; ) ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +FDBA;FDBA;FDBA;0644 062C 0645;0644 062C 0645; # (ﶺ; ﶺ; ﶺ; لجم; لجم; ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +FDBB;FDBB;FDBB;0643 0645 0645;0643 0645 0645; # (ﶻ; ﶻ; ﶻ; كمم; كمم; ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM +FDBC;FDBC;FDBC;0644 062C 0645;0644 062C 0645; # (ﶼ; ﶼ; ﶼ; لجم; لجم; ) ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM +FDBD;FDBD;FDBD;0646 062C 062D;0646 062C 062D; # (ﶽ; ﶽ; ﶽ; نجح; نجح; ) ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM +FDBE;FDBE;FDBE;062C 062D 064A;062C 062D 064A; # (ﶾ; ﶾ; ﶾ; جحي; جحي; ) ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM +FDBF;FDBF;FDBF;062D 062C 064A;062D 062C 064A; # (ﶿ; ﶿ; ﶿ; حجي; حجي; ) ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM +FDC0;FDC0;FDC0;0645 062C 064A;0645 062C 064A; # (ﷀ; ﷀ; ﷀ; مجي; مجي; ) ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM +FDC1;FDC1;FDC1;0641 0645 064A;0641 0645 064A; # (ﷁ; ﷁ; ﷁ; فمي; فمي; ) ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM +FDC2;FDC2;FDC2;0628 062D 064A;0628 062D 064A; # (ﷂ; ﷂ; ﷂ; بحي; بحي; ) ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +FDC3;FDC3;FDC3;0643 0645 0645;0643 0645 0645; # (ﷃ; ﷃ; ﷃ; كمم; كمم; ) ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM +FDC4;FDC4;FDC4;0639 062C 0645;0639 062C 0645; # (ﷄ; ﷄ; ﷄ; عجم; عجم; ) ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM +FDC5;FDC5;FDC5;0635 0645 0645;0635 0645 0645; # (ﷅ; ﷅ; ﷅ; صمم; صمم; ) ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +FDC6;FDC6;FDC6;0633 062E 064A;0633 062E 064A; # (ﷆ; ﷆ; ﷆ; سخي; سخي; ) ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM +FDC7;FDC7;FDC7;0646 062C 064A;0646 062C 064A; # (ﷇ; ﷇ; ﷇ; نجي; نجي; ) ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDF0;FDF0;FDF0;0635 0644 06D2;0635 0644 06D2; # (ﷰ; ﷰ; ﷰ; صلے; صلے; ) ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF1;FDF1;FDF1;0642 0644 06D2;0642 0644 06D2; # (ﷱ; ﷱ; ﷱ; قلے; قلے; ) ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM +FDF2;FDF2;FDF2;0627 0644 0644 0647;0627 0644 0644 0647; # (ﷲ; ﷲ; ﷲ; الله; الله; ) ARABIC LIGATURE ALLAH ISOLATED FORM +FDF3;FDF3;FDF3;0627 0643 0628 0631;0627 0643 0628 0631; # (ﷳ; ﷳ; ﷳ; اكبر; اكبر; ) ARABIC LIGATURE AKBAR ISOLATED FORM +FDF4;FDF4;FDF4;0645 062D 0645 062F;0645 062D 0645 062F; # (ﷴ; ﷴ; ﷴ; محمد; محمد; ) ARABIC LIGATURE MOHAMMAD ISOLATED FORM +FDF5;FDF5;FDF5;0635 0644 0639 0645;0635 0644 0639 0645; # (ﷵ; ﷵ; ﷵ; صلعم; صلعم; ) ARABIC LIGATURE SALAM ISOLATED FORM +FDF6;FDF6;FDF6;0631 0633 0648 0644;0631 0633 0648 0644; # (ﷶ; ﷶ; ﷶ; رسول; رسول; ) ARABIC LIGATURE RASOUL ISOLATED FORM +FDF7;FDF7;FDF7;0639 0644 064A 0647;0639 0644 064A 0647; # (ﷷ; ﷷ; ﷷ; عليه; عليه; ) ARABIC LIGATURE ALAYHE ISOLATED FORM +FDF8;FDF8;FDF8;0648 0633 0644 0645;0648 0633 0644 0645; # (ﷸ; ﷸ; ﷸ; وسلم; وسلم; ) ARABIC LIGATURE WASALLAM ISOLATED FORM +FDF9;FDF9;FDF9;0635 0644 0649;0635 0644 0649; # (ﷹ; ﷹ; ﷹ; صلى; صلى; ) ARABIC LIGATURE SALLA ISOLATED FORM +FDFA;FDFA;FDFA;0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645; # (ﷺ; ﷺ; ﷺ; صلى الله عليه وسلم; صلى الله عليه وسلم; ) ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM +FDFB;FDFB;FDFB;062C 0644 0020 062C 0644 0627 0644 0647;062C 0644 0020 062C 0644 0627 0644 0647; # (ﷻ; ﷻ; ﷻ; جل جلاله; جل جلاله; ) ARABIC LIGATURE JALLAJALALOUHOU +FDFC;FDFC;FDFC;0631 06CC 0627 0644;0631 06CC 0627 0644; # (﷼; ﷼; ﷼; ریال; ریال; ) RIAL SIGN +FE10;FE10;FE10;002C;002C; # (︐; ︐; ︐; ,; ,; ) PRESENTATION FORM FOR VERTICAL COMMA +FE11;FE11;FE11;3001;3001; # (︑; ︑; ︑; 、; 、; ) PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA +FE12;FE12;FE12;3002;3002; # (︒; ︒; ︒; 。; 。; ) PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE13;FE13;FE13;003A;003A; # (︓; ︓; ︓; :; :; ) PRESENTATION FORM FOR VERTICAL COLON +FE14;FE14;FE14;003B;003B; # (︔; ︔; ︔; ;; ;; ) PRESENTATION FORM FOR VERTICAL SEMICOLON +FE15;FE15;FE15;0021;0021; # (︕; ︕; ︕; !; !; ) PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK +FE16;FE16;FE16;003F;003F; # (︖; ︖; ︖; ?; ?; ) PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17;FE17;FE17;3016;3016; # (︗; ︗; ︗; 〖; 〖; ) PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18;FE18;FE18;3017;3017; # (︘; ︘; ︘; 〗; 〗; ) PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19;FE19;FE19;002E 002E 002E;002E 002E 002E; # (︙; ︙; ︙; ...; ...; ) PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE30;FE30;FE30;002E 002E;002E 002E; # (︰; ︰; ︰; ..; ..; ) PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31;FE31;FE31;2014;2014; # (︱; ︱; ︱; —; —; ) PRESENTATION FORM FOR VERTICAL EM DASH +FE32;FE32;FE32;2013;2013; # (︲; ︲; ︲; –; –; ) PRESENTATION FORM FOR VERTICAL EN DASH +FE33;FE33;FE33;005F;005F; # (︳; ︳; ︳; _; _; ) PRESENTATION FORM FOR VERTICAL LOW LINE +FE34;FE34;FE34;005F;005F; # (︴; ︴; ︴; _; _; ) PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35;FE35;FE35;0028;0028; # (︵; ︵; ︵; (; (; ) PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36;FE36;FE36;0029;0029; # (︶; ︶; ︶; ); ); ) PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37;FE37;FE37;007B;007B; # (︷; ︷; ︷; {; {; ) PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38;FE38;FE38;007D;007D; # (︸; ︸; ︸; }; }; ) PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39;FE39;FE39;3014;3014; # (︹; ︹; ︹; 〔; 〔; ) PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A;FE3A;FE3A;3015;3015; # (︺; ︺; ︺; 〕; 〕; ) PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B;FE3B;FE3B;3010;3010; # (︻; ︻; ︻; 【; 【; ) PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C;FE3C;FE3C;3011;3011; # (︼; ︼; ︼; 】; 】; ) PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D;FE3D;FE3D;300A;300A; # (︽; ︽; ︽; 《; 《; ) PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E;FE3E;FE3E;300B;300B; # (︾; ︾; ︾; 》; 》; ) PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F;FE3F;FE3F;3008;3008; # (︿; ︿; ︿; 〈; 〈; ) PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40;FE40;FE40;3009;3009; # (﹀; ﹀; ﹀; 〉; 〉; ) PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41;FE41;FE41;300C;300C; # (﹁; ﹁; ﹁; 「; 「; ) PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42;FE42;FE42;300D;300D; # (﹂; ﹂; ﹂; 」; 」; ) PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43;FE43;FE43;300E;300E; # (﹃; ﹃; ﹃; 『; 『; ) PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44;FE44;FE44;300F;300F; # (﹄; ﹄; ﹄; 』; 』; ) PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE47;FE47;FE47;005B;005B; # (﹇; ﹇; ﹇; [; [; ) PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48;FE48;FE48;005D;005D; # (﹈; ﹈; ﹈; ]; ]; ) PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49;FE49;FE49;0020 0305;0020 0305; # (﹉; ﹉; ﹉; ◌̅; ◌̅; ) DASHED OVERLINE +FE4A;FE4A;FE4A;0020 0305;0020 0305; # (﹊; ﹊; ﹊; ◌̅; ◌̅; ) CENTRELINE OVERLINE +FE4B;FE4B;FE4B;0020 0305;0020 0305; # (﹋; ﹋; ﹋; ◌̅; ◌̅; ) WAVY OVERLINE +FE4C;FE4C;FE4C;0020 0305;0020 0305; # (﹌; ﹌; ﹌; ◌̅; ◌̅; ) DOUBLE WAVY OVERLINE +FE4D;FE4D;FE4D;005F;005F; # (﹍; ﹍; ﹍; _; _; ) DASHED LOW LINE +FE4E;FE4E;FE4E;005F;005F; # (﹎; ﹎; ﹎; _; _; ) CENTRELINE LOW LINE +FE4F;FE4F;FE4F;005F;005F; # (﹏; ﹏; ﹏; _; _; ) WAVY LOW LINE +FE50;FE50;FE50;002C;002C; # (﹐; ﹐; ﹐; ,; ,; ) SMALL COMMA +FE51;FE51;FE51;3001;3001; # (﹑; ﹑; ﹑; 、; 、; ) SMALL IDEOGRAPHIC COMMA +FE52;FE52;FE52;002E;002E; # (﹒; ﹒; ﹒; .; .; ) SMALL FULL STOP +FE54;FE54;FE54;003B;003B; # (﹔; ﹔; ﹔; ;; ;; ) SMALL SEMICOLON +FE55;FE55;FE55;003A;003A; # (﹕; ﹕; ﹕; :; :; ) SMALL COLON +FE56;FE56;FE56;003F;003F; # (﹖; ﹖; ﹖; ?; ?; ) SMALL QUESTION MARK +FE57;FE57;FE57;0021;0021; # (﹗; ﹗; ﹗; !; !; ) SMALL EXCLAMATION MARK +FE58;FE58;FE58;2014;2014; # (﹘; ﹘; ﹘; —; —; ) SMALL EM DASH +FE59;FE59;FE59;0028;0028; # (﹙; ﹙; ﹙; (; (; ) SMALL LEFT PARENTHESIS +FE5A;FE5A;FE5A;0029;0029; # (﹚; ﹚; ﹚; ); ); ) SMALL RIGHT PARENTHESIS +FE5B;FE5B;FE5B;007B;007B; # (﹛; ﹛; ﹛; {; {; ) SMALL LEFT CURLY BRACKET +FE5C;FE5C;FE5C;007D;007D; # (﹜; ﹜; ﹜; }; }; ) SMALL RIGHT CURLY BRACKET +FE5D;FE5D;FE5D;3014;3014; # (﹝; ﹝; ﹝; 〔; 〔; ) SMALL LEFT TORTOISE SHELL BRACKET +FE5E;FE5E;FE5E;3015;3015; # (﹞; ﹞; ﹞; 〕; 〕; ) SMALL RIGHT TORTOISE SHELL BRACKET +FE5F;FE5F;FE5F;0023;0023; # (﹟; ﹟; ﹟; #; #; ) SMALL NUMBER SIGN +FE60;FE60;FE60;0026;0026; # (﹠; ﹠; ﹠; &; &; ) SMALL AMPERSAND +FE61;FE61;FE61;002A;002A; # (﹡; ﹡; ﹡; *; *; ) SMALL ASTERISK +FE62;FE62;FE62;002B;002B; # (﹢; ﹢; ﹢; +; +; ) SMALL PLUS SIGN +FE63;FE63;FE63;002D;002D; # (﹣; ﹣; ﹣; -; -; ) SMALL HYPHEN-MINUS +FE64;FE64;FE64;003C;003C; # (﹤; ﹤; ﹤; <; <; ) SMALL LESS-THAN SIGN +FE65;FE65;FE65;003E;003E; # (﹥; ﹥; ﹥; >; >; ) SMALL GREATER-THAN SIGN +FE66;FE66;FE66;003D;003D; # (﹦; ﹦; ﹦; =; =; ) SMALL EQUALS SIGN +FE68;FE68;FE68;005C;005C; # (﹨; ﹨; ﹨; \; \; ) SMALL REVERSE SOLIDUS +FE69;FE69;FE69;0024;0024; # (﹩; ﹩; ﹩; $; $; ) SMALL DOLLAR SIGN +FE6A;FE6A;FE6A;0025;0025; # (﹪; ﹪; ﹪; %; %; ) SMALL PERCENT SIGN +FE6B;FE6B;FE6B;0040;0040; # (﹫; ﹫; ﹫; @; @; ) SMALL COMMERCIAL AT +FE70;FE70;FE70;0020 064B;0020 064B; # (ﹰ; ﹰ; ﹰ; ◌ً; ◌ً; ) ARABIC FATHATAN ISOLATED FORM +FE71;FE71;FE71;0640 064B;0640 064B; # (ﹱ; ﹱ; ﹱ; ـ◌ً; ـ◌ً; ) ARABIC TATWEEL WITH FATHATAN ABOVE +FE72;FE72;FE72;0020 064C;0020 064C; # (ﹲ; ﹲ; ﹲ; ◌ٌ; ◌ٌ; ) ARABIC DAMMATAN ISOLATED FORM +FE74;FE74;FE74;0020 064D;0020 064D; # (ﹴ; ﹴ; ﹴ; ◌ٍ; ◌ٍ; ) ARABIC KASRATAN ISOLATED FORM +FE76;FE76;FE76;0020 064E;0020 064E; # (ﹶ; ﹶ; ﹶ; ◌َ; ◌َ; ) ARABIC FATHA ISOLATED FORM +FE77;FE77;FE77;0640 064E;0640 064E; # (ﹷ; ﹷ; ﹷ; ـ◌َ; ـ◌َ; ) ARABIC FATHA MEDIAL FORM +FE78;FE78;FE78;0020 064F;0020 064F; # (ﹸ; ﹸ; ﹸ; ◌ُ; ◌ُ; ) ARABIC DAMMA ISOLATED FORM +FE79;FE79;FE79;0640 064F;0640 064F; # (ﹹ; ﹹ; ﹹ; ـ◌ُ; ـ◌ُ; ) ARABIC DAMMA MEDIAL FORM +FE7A;FE7A;FE7A;0020 0650;0020 0650; # (ﹺ; ﹺ; ﹺ; ◌ِ; ◌ِ; ) ARABIC KASRA ISOLATED FORM +FE7B;FE7B;FE7B;0640 0650;0640 0650; # (ﹻ; ﹻ; ﹻ; ـ◌ِ; ـ◌ِ; ) ARABIC KASRA MEDIAL FORM +FE7C;FE7C;FE7C;0020 0651;0020 0651; # (ﹼ; ﹼ; ﹼ; ◌ّ; ◌ّ; ) ARABIC SHADDA ISOLATED FORM +FE7D;FE7D;FE7D;0640 0651;0640 0651; # (ﹽ; ﹽ; ﹽ; ـ◌ّ; ـ◌ّ; ) ARABIC SHADDA MEDIAL FORM +FE7E;FE7E;FE7E;0020 0652;0020 0652; # (ﹾ; ﹾ; ﹾ; ◌ْ; ◌ْ; ) ARABIC SUKUN ISOLATED FORM +FE7F;FE7F;FE7F;0640 0652;0640 0652; # (ﹿ; ﹿ; ﹿ; ـ◌ْ; ـ◌ْ; ) ARABIC SUKUN MEDIAL FORM +FE80;FE80;FE80;0621;0621; # (ﺀ; ﺀ; ﺀ; ء; ء; ) ARABIC LETTER HAMZA ISOLATED FORM +FE81;FE81;FE81;0622;0627 0653; # (ﺁ; ﺁ; ﺁ; آ; ا◌ٓ; ) ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +FE82;FE82;FE82;0622;0627 0653; # (ﺂ; ﺂ; ﺂ; آ; ا◌ٓ; ) ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +FE83;FE83;FE83;0623;0627 0654; # (ﺃ; ﺃ; ﺃ; أ; ا◌ٔ; ) ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +FE84;FE84;FE84;0623;0627 0654; # (ﺄ; ﺄ; ﺄ; أ; ا◌ٔ; ) ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +FE85;FE85;FE85;0624;0648 0654; # (ﺅ; ﺅ; ﺅ; ؤ; و◌ٔ; ) ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +FE86;FE86;FE86;0624;0648 0654; # (ﺆ; ﺆ; ﺆ; ؤ; و◌ٔ; ) ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +FE87;FE87;FE87;0625;0627 0655; # (ﺇ; ﺇ; ﺇ; إ; ا◌ٕ; ) ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM +FE88;FE88;FE88;0625;0627 0655; # (ﺈ; ﺈ; ﺈ; إ; ا◌ٕ; ) ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +FE89;FE89;FE89;0626;064A 0654; # (ﺉ; ﺉ; ﺉ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM +FE8A;FE8A;FE8A;0626;064A 0654; # (ﺊ; ﺊ; ﺊ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM +FE8B;FE8B;FE8B;0626;064A 0654; # (ﺋ; ﺋ; ﺋ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +FE8C;FE8C;FE8C;0626;064A 0654; # (ﺌ; ﺌ; ﺌ; ئ; ي◌ٔ; ) ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +FE8D;FE8D;FE8D;0627;0627; # (ﺍ; ﺍ; ﺍ; ا; ا; ) ARABIC LETTER ALEF ISOLATED FORM +FE8E;FE8E;FE8E;0627;0627; # (ﺎ; ﺎ; ﺎ; ا; ا; ) ARABIC LETTER ALEF FINAL FORM +FE8F;FE8F;FE8F;0628;0628; # (ﺏ; ﺏ; ﺏ; ب; ب; ) ARABIC LETTER BEH ISOLATED FORM +FE90;FE90;FE90;0628;0628; # (ﺐ; ﺐ; ﺐ; ب; ب; ) ARABIC LETTER BEH FINAL FORM +FE91;FE91;FE91;0628;0628; # (ﺑ; ﺑ; ﺑ; ب; ب; ) ARABIC LETTER BEH INITIAL FORM +FE92;FE92;FE92;0628;0628; # (ﺒ; ﺒ; ﺒ; ب; ب; ) ARABIC LETTER BEH MEDIAL FORM +FE93;FE93;FE93;0629;0629; # (ﺓ; ﺓ; ﺓ; ة; ة; ) ARABIC LETTER TEH MARBUTA ISOLATED FORM +FE94;FE94;FE94;0629;0629; # (ﺔ; ﺔ; ﺔ; ة; ة; ) ARABIC LETTER TEH MARBUTA FINAL FORM +FE95;FE95;FE95;062A;062A; # (ﺕ; ﺕ; ﺕ; ت; ت; ) ARABIC LETTER TEH ISOLATED FORM +FE96;FE96;FE96;062A;062A; # (ﺖ; ﺖ; ﺖ; ت; ت; ) ARABIC LETTER TEH FINAL FORM +FE97;FE97;FE97;062A;062A; # (ﺗ; ﺗ; ﺗ; ت; ت; ) ARABIC LETTER TEH INITIAL FORM +FE98;FE98;FE98;062A;062A; # (ﺘ; ﺘ; ﺘ; ت; ت; ) ARABIC LETTER TEH MEDIAL FORM +FE99;FE99;FE99;062B;062B; # (ﺙ; ﺙ; ﺙ; ث; ث; ) ARABIC LETTER THEH ISOLATED FORM +FE9A;FE9A;FE9A;062B;062B; # (ﺚ; ﺚ; ﺚ; ث; ث; ) ARABIC LETTER THEH FINAL FORM +FE9B;FE9B;FE9B;062B;062B; # (ﺛ; ﺛ; ﺛ; ث; ث; ) ARABIC LETTER THEH INITIAL FORM +FE9C;FE9C;FE9C;062B;062B; # (ﺜ; ﺜ; ﺜ; ث; ث; ) ARABIC LETTER THEH MEDIAL FORM +FE9D;FE9D;FE9D;062C;062C; # (ﺝ; ﺝ; ﺝ; ج; ج; ) ARABIC LETTER JEEM ISOLATED FORM +FE9E;FE9E;FE9E;062C;062C; # (ﺞ; ﺞ; ﺞ; ج; ج; ) ARABIC LETTER JEEM FINAL FORM +FE9F;FE9F;FE9F;062C;062C; # (ﺟ; ﺟ; ﺟ; ج; ج; ) ARABIC LETTER JEEM INITIAL FORM +FEA0;FEA0;FEA0;062C;062C; # (ﺠ; ﺠ; ﺠ; ج; ج; ) ARABIC LETTER JEEM MEDIAL FORM +FEA1;FEA1;FEA1;062D;062D; # (ﺡ; ﺡ; ﺡ; ح; ح; ) ARABIC LETTER HAH ISOLATED FORM +FEA2;FEA2;FEA2;062D;062D; # (ﺢ; ﺢ; ﺢ; ح; ح; ) ARABIC LETTER HAH FINAL FORM +FEA3;FEA3;FEA3;062D;062D; # (ﺣ; ﺣ; ﺣ; ح; ح; ) ARABIC LETTER HAH INITIAL FORM +FEA4;FEA4;FEA4;062D;062D; # (ﺤ; ﺤ; ﺤ; ح; ح; ) ARABIC LETTER HAH MEDIAL FORM +FEA5;FEA5;FEA5;062E;062E; # (ﺥ; ﺥ; ﺥ; خ; خ; ) ARABIC LETTER KHAH ISOLATED FORM +FEA6;FEA6;FEA6;062E;062E; # (ﺦ; ﺦ; ﺦ; خ; خ; ) ARABIC LETTER KHAH FINAL FORM +FEA7;FEA7;FEA7;062E;062E; # (ﺧ; ﺧ; ﺧ; خ; خ; ) ARABIC LETTER KHAH INITIAL FORM +FEA8;FEA8;FEA8;062E;062E; # (ﺨ; ﺨ; ﺨ; خ; خ; ) ARABIC LETTER KHAH MEDIAL FORM +FEA9;FEA9;FEA9;062F;062F; # (ﺩ; ﺩ; ﺩ; د; د; ) ARABIC LETTER DAL ISOLATED FORM +FEAA;FEAA;FEAA;062F;062F; # (ﺪ; ﺪ; ﺪ; د; د; ) ARABIC LETTER DAL FINAL FORM +FEAB;FEAB;FEAB;0630;0630; # (ﺫ; ﺫ; ﺫ; ذ; ذ; ) ARABIC LETTER THAL ISOLATED FORM +FEAC;FEAC;FEAC;0630;0630; # (ﺬ; ﺬ; ﺬ; ذ; ذ; ) ARABIC LETTER THAL FINAL FORM +FEAD;FEAD;FEAD;0631;0631; # (ﺭ; ﺭ; ﺭ; ر; ر; ) ARABIC LETTER REH ISOLATED FORM +FEAE;FEAE;FEAE;0631;0631; # (ﺮ; ﺮ; ﺮ; ر; ر; ) ARABIC LETTER REH FINAL FORM +FEAF;FEAF;FEAF;0632;0632; # (ﺯ; ﺯ; ﺯ; ز; ز; ) ARABIC LETTER ZAIN ISOLATED FORM +FEB0;FEB0;FEB0;0632;0632; # (ﺰ; ﺰ; ﺰ; ز; ز; ) ARABIC LETTER ZAIN FINAL FORM +FEB1;FEB1;FEB1;0633;0633; # (ﺱ; ﺱ; ﺱ; س; س; ) ARABIC LETTER SEEN ISOLATED FORM +FEB2;FEB2;FEB2;0633;0633; # (ﺲ; ﺲ; ﺲ; س; س; ) ARABIC LETTER SEEN FINAL FORM +FEB3;FEB3;FEB3;0633;0633; # (ﺳ; ﺳ; ﺳ; س; س; ) ARABIC LETTER SEEN INITIAL FORM +FEB4;FEB4;FEB4;0633;0633; # (ﺴ; ﺴ; ﺴ; س; س; ) ARABIC LETTER SEEN MEDIAL FORM +FEB5;FEB5;FEB5;0634;0634; # (ﺵ; ﺵ; ﺵ; ش; ش; ) ARABIC LETTER SHEEN ISOLATED FORM +FEB6;FEB6;FEB6;0634;0634; # (ﺶ; ﺶ; ﺶ; ش; ش; ) ARABIC LETTER SHEEN FINAL FORM +FEB7;FEB7;FEB7;0634;0634; # (ﺷ; ﺷ; ﺷ; ش; ش; ) ARABIC LETTER SHEEN INITIAL FORM +FEB8;FEB8;FEB8;0634;0634; # (ﺸ; ﺸ; ﺸ; ش; ش; ) ARABIC LETTER SHEEN MEDIAL FORM +FEB9;FEB9;FEB9;0635;0635; # (ﺹ; ﺹ; ﺹ; ص; ص; ) ARABIC LETTER SAD ISOLATED FORM +FEBA;FEBA;FEBA;0635;0635; # (ﺺ; ﺺ; ﺺ; ص; ص; ) ARABIC LETTER SAD FINAL FORM +FEBB;FEBB;FEBB;0635;0635; # (ﺻ; ﺻ; ﺻ; ص; ص; ) ARABIC LETTER SAD INITIAL FORM +FEBC;FEBC;FEBC;0635;0635; # (ﺼ; ﺼ; ﺼ; ص; ص; ) ARABIC LETTER SAD MEDIAL FORM +FEBD;FEBD;FEBD;0636;0636; # (ﺽ; ﺽ; ﺽ; ض; ض; ) ARABIC LETTER DAD ISOLATED FORM +FEBE;FEBE;FEBE;0636;0636; # (ﺾ; ﺾ; ﺾ; ض; ض; ) ARABIC LETTER DAD FINAL FORM +FEBF;FEBF;FEBF;0636;0636; # (ﺿ; ﺿ; ﺿ; ض; ض; ) ARABIC LETTER DAD INITIAL FORM +FEC0;FEC0;FEC0;0636;0636; # (ﻀ; ﻀ; ﻀ; ض; ض; ) ARABIC LETTER DAD MEDIAL FORM +FEC1;FEC1;FEC1;0637;0637; # (ﻁ; ﻁ; ﻁ; ط; ط; ) ARABIC LETTER TAH ISOLATED FORM +FEC2;FEC2;FEC2;0637;0637; # (ﻂ; ﻂ; ﻂ; ط; ط; ) ARABIC LETTER TAH FINAL FORM +FEC3;FEC3;FEC3;0637;0637; # (ﻃ; ﻃ; ﻃ; ط; ط; ) ARABIC LETTER TAH INITIAL FORM +FEC4;FEC4;FEC4;0637;0637; # (ﻄ; ﻄ; ﻄ; ط; ط; ) ARABIC LETTER TAH MEDIAL FORM +FEC5;FEC5;FEC5;0638;0638; # (ﻅ; ﻅ; ﻅ; ظ; ظ; ) ARABIC LETTER ZAH ISOLATED FORM +FEC6;FEC6;FEC6;0638;0638; # (ﻆ; ﻆ; ﻆ; ظ; ظ; ) ARABIC LETTER ZAH FINAL FORM +FEC7;FEC7;FEC7;0638;0638; # (ﻇ; ﻇ; ﻇ; ظ; ظ; ) ARABIC LETTER ZAH INITIAL FORM +FEC8;FEC8;FEC8;0638;0638; # (ﻈ; ﻈ; ﻈ; ظ; ظ; ) ARABIC LETTER ZAH MEDIAL FORM +FEC9;FEC9;FEC9;0639;0639; # (ﻉ; ﻉ; ﻉ; ع; ع; ) ARABIC LETTER AIN ISOLATED FORM +FECA;FECA;FECA;0639;0639; # (ﻊ; ﻊ; ﻊ; ع; ع; ) ARABIC LETTER AIN FINAL FORM +FECB;FECB;FECB;0639;0639; # (ﻋ; ﻋ; ﻋ; ع; ع; ) ARABIC LETTER AIN INITIAL FORM +FECC;FECC;FECC;0639;0639; # (ﻌ; ﻌ; ﻌ; ع; ع; ) ARABIC LETTER AIN MEDIAL FORM +FECD;FECD;FECD;063A;063A; # (ﻍ; ﻍ; ﻍ; غ; غ; ) ARABIC LETTER GHAIN ISOLATED FORM +FECE;FECE;FECE;063A;063A; # (ﻎ; ﻎ; ﻎ; غ; غ; ) ARABIC LETTER GHAIN FINAL FORM +FECF;FECF;FECF;063A;063A; # (ﻏ; ﻏ; ﻏ; غ; غ; ) ARABIC LETTER GHAIN INITIAL FORM +FED0;FED0;FED0;063A;063A; # (ﻐ; ﻐ; ﻐ; غ; غ; ) ARABIC LETTER GHAIN MEDIAL FORM +FED1;FED1;FED1;0641;0641; # (ﻑ; ﻑ; ﻑ; ف; ف; ) ARABIC LETTER FEH ISOLATED FORM +FED2;FED2;FED2;0641;0641; # (ﻒ; ﻒ; ﻒ; ف; ف; ) ARABIC LETTER FEH FINAL FORM +FED3;FED3;FED3;0641;0641; # (ﻓ; ﻓ; ﻓ; ف; ف; ) ARABIC LETTER FEH INITIAL FORM +FED4;FED4;FED4;0641;0641; # (ﻔ; ﻔ; ﻔ; ف; ف; ) ARABIC LETTER FEH MEDIAL FORM +FED5;FED5;FED5;0642;0642; # (ﻕ; ﻕ; ﻕ; ق; ق; ) ARABIC LETTER QAF ISOLATED FORM +FED6;FED6;FED6;0642;0642; # (ﻖ; ﻖ; ﻖ; ق; ق; ) ARABIC LETTER QAF FINAL FORM +FED7;FED7;FED7;0642;0642; # (ﻗ; ﻗ; ﻗ; ق; ق; ) ARABIC LETTER QAF INITIAL FORM +FED8;FED8;FED8;0642;0642; # (ﻘ; ﻘ; ﻘ; ق; ق; ) ARABIC LETTER QAF MEDIAL FORM +FED9;FED9;FED9;0643;0643; # (ﻙ; ﻙ; ﻙ; ك; ك; ) ARABIC LETTER KAF ISOLATED FORM +FEDA;FEDA;FEDA;0643;0643; # (ﻚ; ﻚ; ﻚ; ك; ك; ) ARABIC LETTER KAF FINAL FORM +FEDB;FEDB;FEDB;0643;0643; # (ﻛ; ﻛ; ﻛ; ك; ك; ) ARABIC LETTER KAF INITIAL FORM +FEDC;FEDC;FEDC;0643;0643; # (ﻜ; ﻜ; ﻜ; ك; ك; ) ARABIC LETTER KAF MEDIAL FORM +FEDD;FEDD;FEDD;0644;0644; # (ﻝ; ﻝ; ﻝ; ل; ل; ) ARABIC LETTER LAM ISOLATED FORM +FEDE;FEDE;FEDE;0644;0644; # (ﻞ; ﻞ; ﻞ; ل; ل; ) ARABIC LETTER LAM FINAL FORM +FEDF;FEDF;FEDF;0644;0644; # (ﻟ; ﻟ; ﻟ; ل; ل; ) ARABIC LETTER LAM INITIAL FORM +FEE0;FEE0;FEE0;0644;0644; # (ﻠ; ﻠ; ﻠ; ل; ل; ) ARABIC LETTER LAM MEDIAL FORM +FEE1;FEE1;FEE1;0645;0645; # (ﻡ; ﻡ; ﻡ; م; م; ) ARABIC LETTER MEEM ISOLATED FORM +FEE2;FEE2;FEE2;0645;0645; # (ﻢ; ﻢ; ﻢ; م; م; ) ARABIC LETTER MEEM FINAL FORM +FEE3;FEE3;FEE3;0645;0645; # (ﻣ; ﻣ; ﻣ; م; م; ) ARABIC LETTER MEEM INITIAL FORM +FEE4;FEE4;FEE4;0645;0645; # (ﻤ; ﻤ; ﻤ; م; م; ) ARABIC LETTER MEEM MEDIAL FORM +FEE5;FEE5;FEE5;0646;0646; # (ﻥ; ﻥ; ﻥ; ن; ن; ) ARABIC LETTER NOON ISOLATED FORM +FEE6;FEE6;FEE6;0646;0646; # (ﻦ; ﻦ; ﻦ; ن; ن; ) ARABIC LETTER NOON FINAL FORM +FEE7;FEE7;FEE7;0646;0646; # (ﻧ; ﻧ; ﻧ; ن; ن; ) ARABIC LETTER NOON INITIAL FORM +FEE8;FEE8;FEE8;0646;0646; # (ﻨ; ﻨ; ﻨ; ن; ن; ) ARABIC LETTER NOON MEDIAL FORM +FEE9;FEE9;FEE9;0647;0647; # (ﻩ; ﻩ; ﻩ; ه; ه; ) ARABIC LETTER HEH ISOLATED FORM +FEEA;FEEA;FEEA;0647;0647; # (ﻪ; ﻪ; ﻪ; ه; ه; ) ARABIC LETTER HEH FINAL FORM +FEEB;FEEB;FEEB;0647;0647; # (ﻫ; ﻫ; ﻫ; ه; ه; ) ARABIC LETTER HEH INITIAL FORM +FEEC;FEEC;FEEC;0647;0647; # (ﻬ; ﻬ; ﻬ; ه; ه; ) ARABIC LETTER HEH MEDIAL FORM +FEED;FEED;FEED;0648;0648; # (ﻭ; ﻭ; ﻭ; و; و; ) ARABIC LETTER WAW ISOLATED FORM +FEEE;FEEE;FEEE;0648;0648; # (ﻮ; ﻮ; ﻮ; و; و; ) ARABIC LETTER WAW FINAL FORM +FEEF;FEEF;FEEF;0649;0649; # (ﻯ; ﻯ; ﻯ; ى; ى; ) ARABIC LETTER ALEF MAKSURA ISOLATED FORM +FEF0;FEF0;FEF0;0649;0649; # (ﻰ; ﻰ; ﻰ; ى; ى; ) ARABIC LETTER ALEF MAKSURA FINAL FORM +FEF1;FEF1;FEF1;064A;064A; # (ﻱ; ﻱ; ﻱ; ي; ي; ) ARABIC LETTER YEH ISOLATED FORM +FEF2;FEF2;FEF2;064A;064A; # (ﻲ; ﻲ; ﻲ; ي; ي; ) ARABIC LETTER YEH FINAL FORM +FEF3;FEF3;FEF3;064A;064A; # (ﻳ; ﻳ; ﻳ; ي; ي; ) ARABIC LETTER YEH INITIAL FORM +FEF4;FEF4;FEF4;064A;064A; # (ﻴ; ﻴ; ﻴ; ي; ي; ) ARABIC LETTER YEH MEDIAL FORM +FEF5;FEF5;FEF5;0644 0622;0644 0627 0653; # (ﻵ; ﻵ; ﻵ; لآ; لا◌ٓ; ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +FEF6;FEF6;FEF6;0644 0622;0644 0627 0653; # (ﻶ; ﻶ; ﻶ; لآ; لا◌ٓ; ) ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +FEF7;FEF7;FEF7;0644 0623;0644 0627 0654; # (ﻷ; ﻷ; ﻷ; لأ; لا◌ٔ; ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +FEF8;FEF8;FEF8;0644 0623;0644 0627 0654; # (ﻸ; ﻸ; ﻸ; لأ; لا◌ٔ; ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +FEF9;FEF9;FEF9;0644 0625;0644 0627 0655; # (ﻹ; ﻹ; ﻹ; لإ; لا◌ٕ; ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +FEFA;FEFA;FEFA;0644 0625;0644 0627 0655; # (ﻺ; ﻺ; ﻺ; لإ; لا◌ٕ; ) ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +FEFB;FEFB;FEFB;0644 0627;0644 0627; # (ﻻ; ﻻ; ﻻ; لا; لا; ) ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +FEFC;FEFC;FEFC;0644 0627;0644 0627; # (ﻼ; ﻼ; ﻼ; لا; لا; ) ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FF01;FF01;FF01;0021;0021; # (!; !; !; !; !; ) FULLWIDTH EXCLAMATION MARK +FF02;FF02;FF02;0022;0022; # ("; "; "; "; "; ) FULLWIDTH QUOTATION MARK +FF03;FF03;FF03;0023;0023; # (#; #; #; #; #; ) FULLWIDTH NUMBER SIGN +FF04;FF04;FF04;0024;0024; # ($; $; $; $; $; ) FULLWIDTH DOLLAR SIGN +FF05;FF05;FF05;0025;0025; # (%; %; %; %; %; ) FULLWIDTH PERCENT SIGN +FF06;FF06;FF06;0026;0026; # (&; &; &; &; &; ) FULLWIDTH AMPERSAND +FF07;FF07;FF07;0027;0027; # ('; '; '; '; '; ) FULLWIDTH APOSTROPHE +FF08;FF08;FF08;0028;0028; # ((; (; (; (; (; ) FULLWIDTH LEFT PARENTHESIS +FF09;FF09;FF09;0029;0029; # (); ); ); ); ); ) FULLWIDTH RIGHT PARENTHESIS +FF0A;FF0A;FF0A;002A;002A; # (*; *; *; *; *; ) FULLWIDTH ASTERISK +FF0B;FF0B;FF0B;002B;002B; # (+; +; +; +; +; ) FULLWIDTH PLUS SIGN +FF0C;FF0C;FF0C;002C;002C; # (,; ,; ,; ,; ,; ) FULLWIDTH COMMA +FF0D;FF0D;FF0D;002D;002D; # (-; -; -; -; -; ) FULLWIDTH HYPHEN-MINUS +FF0E;FF0E;FF0E;002E;002E; # (.; .; .; .; .; ) FULLWIDTH FULL STOP +FF0F;FF0F;FF0F;002F;002F; # (/; /; /; /; /; ) FULLWIDTH SOLIDUS +FF10;FF10;FF10;0030;0030; # (0; 0; 0; 0; 0; ) FULLWIDTH DIGIT ZERO +FF11;FF11;FF11;0031;0031; # (1; 1; 1; 1; 1; ) FULLWIDTH DIGIT ONE +FF12;FF12;FF12;0032;0032; # (2; 2; 2; 2; 2; ) FULLWIDTH DIGIT TWO +FF13;FF13;FF13;0033;0033; # (3; 3; 3; 3; 3; ) FULLWIDTH DIGIT THREE +FF14;FF14;FF14;0034;0034; # (4; 4; 4; 4; 4; ) FULLWIDTH DIGIT FOUR +FF15;FF15;FF15;0035;0035; # (5; 5; 5; 5; 5; ) FULLWIDTH DIGIT FIVE +FF16;FF16;FF16;0036;0036; # (6; 6; 6; 6; 6; ) FULLWIDTH DIGIT SIX +FF17;FF17;FF17;0037;0037; # (7; 7; 7; 7; 7; ) FULLWIDTH DIGIT SEVEN +FF18;FF18;FF18;0038;0038; # (8; 8; 8; 8; 8; ) FULLWIDTH DIGIT EIGHT +FF19;FF19;FF19;0039;0039; # (9; 9; 9; 9; 9; ) FULLWIDTH DIGIT NINE +FF1A;FF1A;FF1A;003A;003A; # (:; :; :; :; :; ) FULLWIDTH COLON +FF1B;FF1B;FF1B;003B;003B; # (;; ;; ;; ;; ;; ) FULLWIDTH SEMICOLON +FF1C;FF1C;FF1C;003C;003C; # (<; <; <; <; <; ) FULLWIDTH LESS-THAN SIGN +FF1D;FF1D;FF1D;003D;003D; # (=; =; =; =; =; ) FULLWIDTH EQUALS SIGN +FF1E;FF1E;FF1E;003E;003E; # (>; >; >; >; >; ) FULLWIDTH GREATER-THAN SIGN +FF1F;FF1F;FF1F;003F;003F; # (?; ?; ?; ?; ?; ) FULLWIDTH QUESTION MARK +FF20;FF20;FF20;0040;0040; # (@; @; @; @; @; ) FULLWIDTH COMMERCIAL AT +FF21;FF21;FF21;0041;0041; # (A; A; A; A; A; ) FULLWIDTH LATIN CAPITAL LETTER A +FF22;FF22;FF22;0042;0042; # (B; B; B; B; B; ) FULLWIDTH LATIN CAPITAL LETTER B +FF23;FF23;FF23;0043;0043; # (C; C; C; C; C; ) FULLWIDTH LATIN CAPITAL LETTER C +FF24;FF24;FF24;0044;0044; # (D; D; D; D; D; ) FULLWIDTH LATIN CAPITAL LETTER D +FF25;FF25;FF25;0045;0045; # (E; E; E; E; E; ) FULLWIDTH LATIN CAPITAL LETTER E +FF26;FF26;FF26;0046;0046; # (F; F; F; F; F; ) FULLWIDTH LATIN CAPITAL LETTER F +FF27;FF27;FF27;0047;0047; # (G; G; G; G; G; ) FULLWIDTH LATIN CAPITAL LETTER G +FF28;FF28;FF28;0048;0048; # (H; H; H; H; H; ) FULLWIDTH LATIN CAPITAL LETTER H +FF29;FF29;FF29;0049;0049; # (I; I; I; I; I; ) FULLWIDTH LATIN CAPITAL LETTER I +FF2A;FF2A;FF2A;004A;004A; # (J; J; J; J; J; ) FULLWIDTH LATIN CAPITAL LETTER J +FF2B;FF2B;FF2B;004B;004B; # (K; K; K; K; K; ) FULLWIDTH LATIN CAPITAL LETTER K +FF2C;FF2C;FF2C;004C;004C; # (L; L; L; L; L; ) FULLWIDTH LATIN CAPITAL LETTER L +FF2D;FF2D;FF2D;004D;004D; # (M; M; M; M; M; ) FULLWIDTH LATIN CAPITAL LETTER M +FF2E;FF2E;FF2E;004E;004E; # (N; N; N; N; N; ) FULLWIDTH LATIN CAPITAL LETTER N +FF2F;FF2F;FF2F;004F;004F; # (O; O; O; O; O; ) FULLWIDTH LATIN CAPITAL LETTER O +FF30;FF30;FF30;0050;0050; # (P; P; P; P; P; ) FULLWIDTH LATIN CAPITAL LETTER P +FF31;FF31;FF31;0051;0051; # (Q; Q; Q; Q; Q; ) FULLWIDTH LATIN CAPITAL LETTER Q +FF32;FF32;FF32;0052;0052; # (R; R; R; R; R; ) FULLWIDTH LATIN CAPITAL LETTER R +FF33;FF33;FF33;0053;0053; # (S; S; S; S; S; ) FULLWIDTH LATIN CAPITAL LETTER S +FF34;FF34;FF34;0054;0054; # (T; T; T; T; T; ) FULLWIDTH LATIN CAPITAL LETTER T +FF35;FF35;FF35;0055;0055; # (U; U; U; U; U; ) FULLWIDTH LATIN CAPITAL LETTER U +FF36;FF36;FF36;0056;0056; # (V; V; V; V; V; ) FULLWIDTH LATIN CAPITAL LETTER V +FF37;FF37;FF37;0057;0057; # (W; W; W; W; W; ) FULLWIDTH LATIN CAPITAL LETTER W +FF38;FF38;FF38;0058;0058; # (X; X; X; X; X; ) FULLWIDTH LATIN CAPITAL LETTER X +FF39;FF39;FF39;0059;0059; # (Y; Y; Y; Y; Y; ) FULLWIDTH LATIN CAPITAL LETTER Y +FF3A;FF3A;FF3A;005A;005A; # (Z; Z; Z; Z; Z; ) FULLWIDTH LATIN CAPITAL LETTER Z +FF3B;FF3B;FF3B;005B;005B; # ([; [; [; [; [; ) FULLWIDTH LEFT SQUARE BRACKET +FF3C;FF3C;FF3C;005C;005C; # (\; \; \; \; \; ) FULLWIDTH REVERSE SOLIDUS +FF3D;FF3D;FF3D;005D;005D; # (]; ]; ]; ]; ]; ) FULLWIDTH RIGHT SQUARE BRACKET +FF3E;FF3E;FF3E;005E;005E; # (^; ^; ^; ^; ^; ) FULLWIDTH CIRCUMFLEX ACCENT +FF3F;FF3F;FF3F;005F;005F; # (_; _; _; _; _; ) FULLWIDTH LOW LINE +FF40;FF40;FF40;0060;0060; # (`; `; `; `; `; ) FULLWIDTH GRAVE ACCENT +FF41;FF41;FF41;0061;0061; # (a; a; a; a; a; ) FULLWIDTH LATIN SMALL LETTER A +FF42;FF42;FF42;0062;0062; # (b; b; b; b; b; ) FULLWIDTH LATIN SMALL LETTER B +FF43;FF43;FF43;0063;0063; # (c; c; c; c; c; ) FULLWIDTH LATIN SMALL LETTER C +FF44;FF44;FF44;0064;0064; # (d; d; d; d; d; ) FULLWIDTH LATIN SMALL LETTER D +FF45;FF45;FF45;0065;0065; # (e; e; e; e; e; ) FULLWIDTH LATIN SMALL LETTER E +FF46;FF46;FF46;0066;0066; # (f; f; f; f; f; ) FULLWIDTH LATIN SMALL LETTER F +FF47;FF47;FF47;0067;0067; # (g; g; g; g; g; ) FULLWIDTH LATIN SMALL LETTER G +FF48;FF48;FF48;0068;0068; # (h; h; h; h; h; ) FULLWIDTH LATIN SMALL LETTER H +FF49;FF49;FF49;0069;0069; # (i; i; i; i; i; ) FULLWIDTH LATIN SMALL LETTER I +FF4A;FF4A;FF4A;006A;006A; # (j; j; j; j; j; ) FULLWIDTH LATIN SMALL LETTER J +FF4B;FF4B;FF4B;006B;006B; # (k; k; k; k; k; ) FULLWIDTH LATIN SMALL LETTER K +FF4C;FF4C;FF4C;006C;006C; # (l; l; l; l; l; ) FULLWIDTH LATIN SMALL LETTER L +FF4D;FF4D;FF4D;006D;006D; # (m; m; m; m; m; ) FULLWIDTH LATIN SMALL LETTER M +FF4E;FF4E;FF4E;006E;006E; # (n; n; n; n; n; ) FULLWIDTH LATIN SMALL LETTER N +FF4F;FF4F;FF4F;006F;006F; # (o; o; o; o; o; ) FULLWIDTH LATIN SMALL LETTER O +FF50;FF50;FF50;0070;0070; # (p; p; p; p; p; ) FULLWIDTH LATIN SMALL LETTER P +FF51;FF51;FF51;0071;0071; # (q; q; q; q; q; ) FULLWIDTH LATIN SMALL LETTER Q +FF52;FF52;FF52;0072;0072; # (r; r; r; r; r; ) FULLWIDTH LATIN SMALL LETTER R +FF53;FF53;FF53;0073;0073; # (s; s; s; s; s; ) FULLWIDTH LATIN SMALL LETTER S +FF54;FF54;FF54;0074;0074; # (t; t; t; t; t; ) FULLWIDTH LATIN SMALL LETTER T +FF55;FF55;FF55;0075;0075; # (u; u; u; u; u; ) FULLWIDTH LATIN SMALL LETTER U +FF56;FF56;FF56;0076;0076; # (v; v; v; v; v; ) FULLWIDTH LATIN SMALL LETTER V +FF57;FF57;FF57;0077;0077; # (w; w; w; w; w; ) FULLWIDTH LATIN SMALL LETTER W +FF58;FF58;FF58;0078;0078; # (x; x; x; x; x; ) FULLWIDTH LATIN SMALL LETTER X +FF59;FF59;FF59;0079;0079; # (y; y; y; y; y; ) FULLWIDTH LATIN SMALL LETTER Y +FF5A;FF5A;FF5A;007A;007A; # (z; z; z; z; z; ) FULLWIDTH LATIN SMALL LETTER Z +FF5B;FF5B;FF5B;007B;007B; # ({; {; {; {; {; ) FULLWIDTH LEFT CURLY BRACKET +FF5C;FF5C;FF5C;007C;007C; # (|; |; |; |; |; ) FULLWIDTH VERTICAL LINE +FF5D;FF5D;FF5D;007D;007D; # (}; }; }; }; }; ) FULLWIDTH RIGHT CURLY BRACKET +FF5E;FF5E;FF5E;007E;007E; # (~; ~; ~; ~; ~; ) FULLWIDTH TILDE +FF5F;FF5F;FF5F;2985;2985; # (⦅; ⦅; ⦅; ⦅; ⦅; ) FULLWIDTH LEFT WHITE PARENTHESIS +FF60;FF60;FF60;2986;2986; # (⦆; ⦆; ⦆; ⦆; ⦆; ) FULLWIDTH RIGHT WHITE PARENTHESIS +FF61;FF61;FF61;3002;3002; # (。; 。; 。; 。; 。; ) HALFWIDTH IDEOGRAPHIC FULL STOP +FF62;FF62;FF62;300C;300C; # (「; 「; 「; 「; 「; ) HALFWIDTH LEFT CORNER BRACKET +FF63;FF63;FF63;300D;300D; # (」; 」; 」; 」; 」; ) HALFWIDTH RIGHT CORNER BRACKET +FF64;FF64;FF64;3001;3001; # (、; 、; 、; 、; 、; ) HALFWIDTH IDEOGRAPHIC COMMA +FF65;FF65;FF65;30FB;30FB; # (・; ・; ・; ・; ・; ) HALFWIDTH KATAKANA MIDDLE DOT +FF66;FF66;FF66;30F2;30F2; # (ヲ; ヲ; ヲ; ヲ; ヲ; ) HALFWIDTH KATAKANA LETTER WO +FF67;FF67;FF67;30A1;30A1; # (ァ; ァ; ァ; ァ; ァ; ) HALFWIDTH KATAKANA LETTER SMALL A +FF68;FF68;FF68;30A3;30A3; # (ィ; ィ; ィ; ィ; ィ; ) HALFWIDTH KATAKANA LETTER SMALL I +FF69;FF69;FF69;30A5;30A5; # (ゥ; ゥ; ゥ; ゥ; ゥ; ) HALFWIDTH KATAKANA LETTER SMALL U +FF6A;FF6A;FF6A;30A7;30A7; # (ェ; ェ; ェ; ェ; ェ; ) HALFWIDTH KATAKANA LETTER SMALL E +FF6B;FF6B;FF6B;30A9;30A9; # (ォ; ォ; ォ; ォ; ォ; ) HALFWIDTH KATAKANA LETTER SMALL O +FF6C;FF6C;FF6C;30E3;30E3; # (ャ; ャ; ャ; ャ; ャ; ) HALFWIDTH KATAKANA LETTER SMALL YA +FF6D;FF6D;FF6D;30E5;30E5; # (ュ; ュ; ュ; ュ; ュ; ) HALFWIDTH KATAKANA LETTER SMALL YU +FF6E;FF6E;FF6E;30E7;30E7; # (ョ; ョ; ョ; ョ; ョ; ) HALFWIDTH KATAKANA LETTER SMALL YO +FF6F;FF6F;FF6F;30C3;30C3; # (ッ; ッ; ッ; ッ; ッ; ) HALFWIDTH KATAKANA LETTER SMALL TU +FF70;FF70;FF70;30FC;30FC; # (ー; ー; ー; ー; ー; ) HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71;FF71;FF71;30A2;30A2; # (ア; ア; ア; ア; ア; ) HALFWIDTH KATAKANA LETTER A +FF72;FF72;FF72;30A4;30A4; # (イ; イ; イ; イ; イ; ) HALFWIDTH KATAKANA LETTER I +FF73;FF73;FF73;30A6;30A6; # (ウ; ウ; ウ; ウ; ウ; ) HALFWIDTH KATAKANA LETTER U +FF74;FF74;FF74;30A8;30A8; # (エ; エ; エ; エ; エ; ) HALFWIDTH KATAKANA LETTER E +FF75;FF75;FF75;30AA;30AA; # (オ; オ; オ; オ; オ; ) HALFWIDTH KATAKANA LETTER O +FF76;FF76;FF76;30AB;30AB; # (カ; カ; カ; カ; カ; ) HALFWIDTH KATAKANA LETTER KA +FF77;FF77;FF77;30AD;30AD; # (キ; キ; キ; キ; キ; ) HALFWIDTH KATAKANA LETTER KI +FF78;FF78;FF78;30AF;30AF; # (ク; ク; ク; ク; ク; ) HALFWIDTH KATAKANA LETTER KU +FF79;FF79;FF79;30B1;30B1; # (ケ; ケ; ケ; ケ; ケ; ) HALFWIDTH KATAKANA LETTER KE +FF7A;FF7A;FF7A;30B3;30B3; # (コ; コ; コ; コ; コ; ) HALFWIDTH KATAKANA LETTER KO +FF7B;FF7B;FF7B;30B5;30B5; # (サ; サ; サ; サ; サ; ) HALFWIDTH KATAKANA LETTER SA +FF7C;FF7C;FF7C;30B7;30B7; # (シ; シ; シ; シ; シ; ) HALFWIDTH KATAKANA LETTER SI +FF7D;FF7D;FF7D;30B9;30B9; # (ス; ス; ス; ス; ス; ) HALFWIDTH KATAKANA LETTER SU +FF7E;FF7E;FF7E;30BB;30BB; # (セ; セ; セ; セ; セ; ) HALFWIDTH KATAKANA LETTER SE +FF7F;FF7F;FF7F;30BD;30BD; # (ソ; ソ; ソ; ソ; ソ; ) HALFWIDTH KATAKANA LETTER SO +FF80;FF80;FF80;30BF;30BF; # (タ; タ; タ; タ; タ; ) HALFWIDTH KATAKANA LETTER TA +FF81;FF81;FF81;30C1;30C1; # (チ; チ; チ; チ; チ; ) HALFWIDTH KATAKANA LETTER TI +FF82;FF82;FF82;30C4;30C4; # (ツ; ツ; ツ; ツ; ツ; ) HALFWIDTH KATAKANA LETTER TU +FF83;FF83;FF83;30C6;30C6; # (テ; テ; テ; テ; テ; ) HALFWIDTH KATAKANA LETTER TE +FF84;FF84;FF84;30C8;30C8; # (ト; ト; ト; ト; ト; ) HALFWIDTH KATAKANA LETTER TO +FF85;FF85;FF85;30CA;30CA; # (ナ; ナ; ナ; ナ; ナ; ) HALFWIDTH KATAKANA LETTER NA +FF86;FF86;FF86;30CB;30CB; # (ニ; ニ; ニ; ニ; ニ; ) HALFWIDTH KATAKANA LETTER NI +FF87;FF87;FF87;30CC;30CC; # (ヌ; ヌ; ヌ; ヌ; ヌ; ) HALFWIDTH KATAKANA LETTER NU +FF88;FF88;FF88;30CD;30CD; # (ネ; ネ; ネ; ネ; ネ; ) HALFWIDTH KATAKANA LETTER NE +FF89;FF89;FF89;30CE;30CE; # (ノ; ノ; ノ; ノ; ノ; ) HALFWIDTH KATAKANA LETTER NO +FF8A;FF8A;FF8A;30CF;30CF; # (ハ; ハ; ハ; ハ; ハ; ) HALFWIDTH KATAKANA LETTER HA +FF8B;FF8B;FF8B;30D2;30D2; # (ヒ; ヒ; ヒ; ヒ; ヒ; ) HALFWIDTH KATAKANA LETTER HI +FF8C;FF8C;FF8C;30D5;30D5; # (フ; フ; フ; フ; フ; ) HALFWIDTH KATAKANA LETTER HU +FF8D;FF8D;FF8D;30D8;30D8; # (ヘ; ヘ; ヘ; ヘ; ヘ; ) HALFWIDTH KATAKANA LETTER HE +FF8E;FF8E;FF8E;30DB;30DB; # (ホ; ホ; ホ; ホ; ホ; ) HALFWIDTH KATAKANA LETTER HO +FF8F;FF8F;FF8F;30DE;30DE; # (マ; マ; マ; マ; マ; ) HALFWIDTH KATAKANA LETTER MA +FF90;FF90;FF90;30DF;30DF; # (ミ; ミ; ミ; ミ; ミ; ) HALFWIDTH KATAKANA LETTER MI +FF91;FF91;FF91;30E0;30E0; # (ム; ム; ム; ム; ム; ) HALFWIDTH KATAKANA LETTER MU +FF92;FF92;FF92;30E1;30E1; # (メ; メ; メ; メ; メ; ) HALFWIDTH KATAKANA LETTER ME +FF93;FF93;FF93;30E2;30E2; # (モ; モ; モ; モ; モ; ) HALFWIDTH KATAKANA LETTER MO +FF94;FF94;FF94;30E4;30E4; # (ヤ; ヤ; ヤ; ヤ; ヤ; ) HALFWIDTH KATAKANA LETTER YA +FF95;FF95;FF95;30E6;30E6; # (ユ; ユ; ユ; ユ; ユ; ) HALFWIDTH KATAKANA LETTER YU +FF96;FF96;FF96;30E8;30E8; # (ヨ; ヨ; ヨ; ヨ; ヨ; ) HALFWIDTH KATAKANA LETTER YO +FF97;FF97;FF97;30E9;30E9; # (ラ; ラ; ラ; ラ; ラ; ) HALFWIDTH KATAKANA LETTER RA +FF98;FF98;FF98;30EA;30EA; # (リ; リ; リ; リ; リ; ) HALFWIDTH KATAKANA LETTER RI +FF99;FF99;FF99;30EB;30EB; # (ル; ル; ル; ル; ル; ) HALFWIDTH KATAKANA LETTER RU +FF9A;FF9A;FF9A;30EC;30EC; # (レ; レ; レ; レ; レ; ) HALFWIDTH KATAKANA LETTER RE +FF9B;FF9B;FF9B;30ED;30ED; # (ロ; ロ; ロ; ロ; ロ; ) HALFWIDTH KATAKANA LETTER RO +FF9C;FF9C;FF9C;30EF;30EF; # (ワ; ワ; ワ; ワ; ワ; ) HALFWIDTH KATAKANA LETTER WA +FF9D;FF9D;FF9D;30F3;30F3; # (ン; ン; ン; ン; ン; ) HALFWIDTH KATAKANA LETTER N +FF9E;FF9E;FF9E;3099;3099; # (゙; ゙; ゙; ◌゙; ◌゙; ) HALFWIDTH KATAKANA VOICED SOUND MARK +FF9F;FF9F;FF9F;309A;309A; # (゚; ゚; ゚; ◌゚; ◌゚; ) HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0;FFA0;FFA0;1160;1160; # (ᅠ; ᅠ; ᅠ; ᅠ; ᅠ; ) HALFWIDTH HANGUL FILLER +FFA1;FFA1;FFA1;1100;1100; # (ᄀ; ᄀ; ᄀ; ᄀ; ᄀ; ) HALFWIDTH HANGUL LETTER KIYEOK +FFA2;FFA2;FFA2;1101;1101; # (ᄁ; ᄁ; ᄁ; ᄁ; ᄁ; ) HALFWIDTH HANGUL LETTER SSANGKIYEOK +FFA3;FFA3;FFA3;11AA;11AA; # (ᆪ; ᆪ; ᆪ; ᆪ; ᆪ; ) HALFWIDTH HANGUL LETTER KIYEOK-SIOS +FFA4;FFA4;FFA4;1102;1102; # (ᄂ; ᄂ; ᄂ; ᄂ; ᄂ; ) HALFWIDTH HANGUL LETTER NIEUN +FFA5;FFA5;FFA5;11AC;11AC; # (ᆬ; ᆬ; ᆬ; ᆬ; ᆬ; ) HALFWIDTH HANGUL LETTER NIEUN-CIEUC +FFA6;FFA6;FFA6;11AD;11AD; # (ᆭ; ᆭ; ᆭ; ᆭ; ᆭ; ) HALFWIDTH HANGUL LETTER NIEUN-HIEUH +FFA7;FFA7;FFA7;1103;1103; # (ᄃ; ᄃ; ᄃ; ᄃ; ᄃ; ) HALFWIDTH HANGUL LETTER TIKEUT +FFA8;FFA8;FFA8;1104;1104; # (ᄄ; ᄄ; ᄄ; ᄄ; ᄄ; ) HALFWIDTH HANGUL LETTER SSANGTIKEUT +FFA9;FFA9;FFA9;1105;1105; # (ᄅ; ᄅ; ᄅ; ᄅ; ᄅ; ) HALFWIDTH HANGUL LETTER RIEUL +FFAA;FFAA;FFAA;11B0;11B0; # (ᆰ; ᆰ; ᆰ; ᆰ; ᆰ; ) HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +FFAB;FFAB;FFAB;11B1;11B1; # (ᆱ; ᆱ; ᆱ; ᆱ; ᆱ; ) HALFWIDTH HANGUL LETTER RIEUL-MIEUM +FFAC;FFAC;FFAC;11B2;11B2; # (ᆲ; ᆲ; ᆲ; ᆲ; ᆲ; ) HALFWIDTH HANGUL LETTER RIEUL-PIEUP +FFAD;FFAD;FFAD;11B3;11B3; # (ᆳ; ᆳ; ᆳ; ᆳ; ᆳ; ) HALFWIDTH HANGUL LETTER RIEUL-SIOS +FFAE;FFAE;FFAE;11B4;11B4; # (ᆴ; ᆴ; ᆴ; ᆴ; ᆴ; ) HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +FFAF;FFAF;FFAF;11B5;11B5; # (ᆵ; ᆵ; ᆵ; ᆵ; ᆵ; ) HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +FFB0;FFB0;FFB0;111A;111A; # (ᄚ; ᄚ; ᄚ; ᄚ; ᄚ; ) HALFWIDTH HANGUL LETTER RIEUL-HIEUH +FFB1;FFB1;FFB1;1106;1106; # (ᄆ; ᄆ; ᄆ; ᄆ; ᄆ; ) HALFWIDTH HANGUL LETTER MIEUM +FFB2;FFB2;FFB2;1107;1107; # (ᄇ; ᄇ; ᄇ; ᄇ; ᄇ; ) HALFWIDTH HANGUL LETTER PIEUP +FFB3;FFB3;FFB3;1108;1108; # (ᄈ; ᄈ; ᄈ; ᄈ; ᄈ; ) HALFWIDTH HANGUL LETTER SSANGPIEUP +FFB4;FFB4;FFB4;1121;1121; # (ᄡ; ᄡ; ᄡ; ᄡ; ᄡ; ) HALFWIDTH HANGUL LETTER PIEUP-SIOS +FFB5;FFB5;FFB5;1109;1109; # (ᄉ; ᄉ; ᄉ; ᄉ; ᄉ; ) HALFWIDTH HANGUL LETTER SIOS +FFB6;FFB6;FFB6;110A;110A; # (ᄊ; ᄊ; ᄊ; ᄊ; ᄊ; ) HALFWIDTH HANGUL LETTER SSANGSIOS +FFB7;FFB7;FFB7;110B;110B; # (ᄋ; ᄋ; ᄋ; ᄋ; ᄋ; ) HALFWIDTH HANGUL LETTER IEUNG +FFB8;FFB8;FFB8;110C;110C; # (ᄌ; ᄌ; ᄌ; ᄌ; ᄌ; ) HALFWIDTH HANGUL LETTER CIEUC +FFB9;FFB9;FFB9;110D;110D; # (ᄍ; ᄍ; ᄍ; ᄍ; ᄍ; ) HALFWIDTH HANGUL LETTER SSANGCIEUC +FFBA;FFBA;FFBA;110E;110E; # (ᄎ; ᄎ; ᄎ; ᄎ; ᄎ; ) HALFWIDTH HANGUL LETTER CHIEUCH +FFBB;FFBB;FFBB;110F;110F; # (ᄏ; ᄏ; ᄏ; ᄏ; ᄏ; ) HALFWIDTH HANGUL LETTER KHIEUKH +FFBC;FFBC;FFBC;1110;1110; # (ᄐ; ᄐ; ᄐ; ᄐ; ᄐ; ) HALFWIDTH HANGUL LETTER THIEUTH +FFBD;FFBD;FFBD;1111;1111; # (ᄑ; ᄑ; ᄑ; ᄑ; ᄑ; ) HALFWIDTH HANGUL LETTER PHIEUPH +FFBE;FFBE;FFBE;1112;1112; # (ᄒ; ᄒ; ᄒ; ᄒ; ᄒ; ) HALFWIDTH HANGUL LETTER HIEUH +FFC2;FFC2;FFC2;1161;1161; # (ᅡ; ᅡ; ᅡ; ᅡ; ᅡ; ) HALFWIDTH HANGUL LETTER A +FFC3;FFC3;FFC3;1162;1162; # (ᅢ; ᅢ; ᅢ; ᅢ; ᅢ; ) HALFWIDTH HANGUL LETTER AE +FFC4;FFC4;FFC4;1163;1163; # (ᅣ; ᅣ; ᅣ; ᅣ; ᅣ; ) HALFWIDTH HANGUL LETTER YA +FFC5;FFC5;FFC5;1164;1164; # (ᅤ; ᅤ; ᅤ; ᅤ; ᅤ; ) HALFWIDTH HANGUL LETTER YAE +FFC6;FFC6;FFC6;1165;1165; # (ᅥ; ᅥ; ᅥ; ᅥ; ᅥ; ) HALFWIDTH HANGUL LETTER EO +FFC7;FFC7;FFC7;1166;1166; # (ᅦ; ᅦ; ᅦ; ᅦ; ᅦ; ) HALFWIDTH HANGUL LETTER E +FFCA;FFCA;FFCA;1167;1167; # (ᅧ; ᅧ; ᅧ; ᅧ; ᅧ; ) HALFWIDTH HANGUL LETTER YEO +FFCB;FFCB;FFCB;1168;1168; # (ᅨ; ᅨ; ᅨ; ᅨ; ᅨ; ) HALFWIDTH HANGUL LETTER YE +FFCC;FFCC;FFCC;1169;1169; # (ᅩ; ᅩ; ᅩ; ᅩ; ᅩ; ) HALFWIDTH HANGUL LETTER O +FFCD;FFCD;FFCD;116A;116A; # (ᅪ; ᅪ; ᅪ; ᅪ; ᅪ; ) HALFWIDTH HANGUL LETTER WA +FFCE;FFCE;FFCE;116B;116B; # (ᅫ; ᅫ; ᅫ; ᅫ; ᅫ; ) HALFWIDTH HANGUL LETTER WAE +FFCF;FFCF;FFCF;116C;116C; # (ᅬ; ᅬ; ᅬ; ᅬ; ᅬ; ) HALFWIDTH HANGUL LETTER OE +FFD2;FFD2;FFD2;116D;116D; # (ᅭ; ᅭ; ᅭ; ᅭ; ᅭ; ) HALFWIDTH HANGUL LETTER YO +FFD3;FFD3;FFD3;116E;116E; # (ᅮ; ᅮ; ᅮ; ᅮ; ᅮ; ) HALFWIDTH HANGUL LETTER U +FFD4;FFD4;FFD4;116F;116F; # (ᅯ; ᅯ; ᅯ; ᅯ; ᅯ; ) HALFWIDTH HANGUL LETTER WEO +FFD5;FFD5;FFD5;1170;1170; # (ᅰ; ᅰ; ᅰ; ᅰ; ᅰ; ) HALFWIDTH HANGUL LETTER WE +FFD6;FFD6;FFD6;1171;1171; # (ᅱ; ᅱ; ᅱ; ᅱ; ᅱ; ) HALFWIDTH HANGUL LETTER WI +FFD7;FFD7;FFD7;1172;1172; # (ᅲ; ᅲ; ᅲ; ᅲ; ᅲ; ) HALFWIDTH HANGUL LETTER YU +FFDA;FFDA;FFDA;1173;1173; # (ᅳ; ᅳ; ᅳ; ᅳ; ᅳ; ) HALFWIDTH HANGUL LETTER EU +FFDB;FFDB;FFDB;1174;1174; # (ᅴ; ᅴ; ᅴ; ᅴ; ᅴ; ) HALFWIDTH HANGUL LETTER YI +FFDC;FFDC;FFDC;1175;1175; # (ᅵ; ᅵ; ᅵ; ᅵ; ᅵ; ) HALFWIDTH HANGUL LETTER I +FFE0;FFE0;FFE0;00A2;00A2; # (¢; ¢; ¢; ¢; ¢; ) FULLWIDTH CENT SIGN +FFE1;FFE1;FFE1;00A3;00A3; # (£; £; £; £; £; ) FULLWIDTH POUND SIGN +FFE2;FFE2;FFE2;00AC;00AC; # (¬; ¬; ¬; ¬; ¬; ) FULLWIDTH NOT SIGN +FFE3;FFE3;FFE3;0020 0304;0020 0304; # ( ̄;  ̄;  ̄; ◌̄; ◌̄; ) FULLWIDTH MACRON +FFE4;FFE4;FFE4;00A6;00A6; # (¦; ¦; ¦; ¦; ¦; ) FULLWIDTH BROKEN BAR +FFE5;FFE5;FFE5;00A5;00A5; # (¥; ¥; ¥; ¥; ¥; ) FULLWIDTH YEN SIGN +FFE6;FFE6;FFE6;20A9;20A9; # (₩; ₩; ₩; ₩; ₩; ) FULLWIDTH WON SIGN +FFE8;FFE8;FFE8;2502;2502; # (│; │; │; │; │; ) HALFWIDTH FORMS LIGHT VERTICAL +FFE9;FFE9;FFE9;2190;2190; # (←; ←; ←; ←; ←; ) HALFWIDTH LEFTWARDS ARROW +FFEA;FFEA;FFEA;2191;2191; # (↑; ↑; ↑; ↑; ↑; ) HALFWIDTH UPWARDS ARROW +FFEB;FFEB;FFEB;2192;2192; # (→; →; →; →; →; ) HALFWIDTH RIGHTWARDS ARROW +FFEC;FFEC;FFEC;2193;2193; # (↓; ↓; ↓; ↓; ↓; ) HALFWIDTH DOWNWARDS ARROW +FFED;FFED;FFED;25A0;25A0; # (■; ■; ■; ■; ■; ) HALFWIDTH BLACK SQUARE +FFEE;FFEE;FFEE;25CB;25CB; # (○; ○; ○; ○; ○; ) HALFWIDTH WHITE CIRCLE +10781;10781;10781;02D0;02D0; # (𐞁; 𐞁; 𐞁; ː; ː; ) MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON +10782;10782;10782;02D1;02D1; # (𐞂; 𐞂; 𐞂; ˑ; ˑ; ) MODIFIER LETTER SUPERSCRIPT HALF TRIANGULAR COLON +10783;10783;10783;00E6;00E6; # (𐞃; 𐞃; 𐞃; æ; æ; ) MODIFIER LETTER SMALL AE +10784;10784;10784;0299;0299; # (𐞄; 𐞄; 𐞄; ʙ; ʙ; ) MODIFIER LETTER SMALL CAPITAL B +10785;10785;10785;0253;0253; # (𐞅; 𐞅; 𐞅; ɓ; ɓ; ) MODIFIER LETTER SMALL B WITH HOOK +10787;10787;10787;02A3;02A3; # (𐞇; 𐞇; 𐞇; ʣ; ʣ; ) MODIFIER LETTER SMALL DZ DIGRAPH +10788;10788;10788;AB66;AB66; # (𐞈; 𐞈; 𐞈; ꭦ; ꭦ; ) MODIFIER LETTER SMALL DZ DIGRAPH WITH RETROFLEX HOOK +10789;10789;10789;02A5;02A5; # (𐞉; 𐞉; 𐞉; ʥ; ʥ; ) MODIFIER LETTER SMALL DZ DIGRAPH WITH CURL +1078A;1078A;1078A;02A4;02A4; # (𐞊; 𐞊; 𐞊; ʤ; ʤ; ) MODIFIER LETTER SMALL DEZH DIGRAPH +1078B;1078B;1078B;0256;0256; # (𐞋; 𐞋; 𐞋; ɖ; ɖ; ) MODIFIER LETTER SMALL D WITH TAIL +1078C;1078C;1078C;0257;0257; # (𐞌; 𐞌; 𐞌; ɗ; ɗ; ) MODIFIER LETTER SMALL D WITH HOOK +1078D;1078D;1078D;1D91;1D91; # (𐞍; 𐞍; 𐞍; ᶑ; ᶑ; ) MODIFIER LETTER SMALL D WITH HOOK AND TAIL +1078E;1078E;1078E;0258;0258; # (𐞎; 𐞎; 𐞎; ɘ; ɘ; ) MODIFIER LETTER SMALL REVERSED E +1078F;1078F;1078F;025E;025E; # (𐞏; 𐞏; 𐞏; ɞ; ɞ; ) MODIFIER LETTER SMALL CLOSED REVERSED OPEN E +10790;10790;10790;02A9;02A9; # (𐞐; 𐞐; 𐞐; ʩ; ʩ; ) MODIFIER LETTER SMALL FENG DIGRAPH +10791;10791;10791;0264;0264; # (𐞑; 𐞑; 𐞑; ɤ; ɤ; ) MODIFIER LETTER SMALL RAMS HORN +10792;10792;10792;0262;0262; # (𐞒; 𐞒; 𐞒; ɢ; ɢ; ) MODIFIER LETTER SMALL CAPITAL G +10793;10793;10793;0260;0260; # (𐞓; 𐞓; 𐞓; ɠ; ɠ; ) MODIFIER LETTER SMALL G WITH HOOK +10794;10794;10794;029B;029B; # (𐞔; 𐞔; 𐞔; ʛ; ʛ; ) MODIFIER LETTER SMALL CAPITAL G WITH HOOK +10795;10795;10795;0127;0127; # (𐞕; 𐞕; 𐞕; ħ; ħ; ) MODIFIER LETTER SMALL H WITH STROKE +10796;10796;10796;029C;029C; # (𐞖; 𐞖; 𐞖; ʜ; ʜ; ) MODIFIER LETTER SMALL CAPITAL H +10797;10797;10797;0267;0267; # (𐞗; 𐞗; 𐞗; ɧ; ɧ; ) MODIFIER LETTER SMALL HENG WITH HOOK +10798;10798;10798;0284;0284; # (𐞘; 𐞘; 𐞘; ʄ; ʄ; ) MODIFIER LETTER SMALL DOTLESS J WITH STROKE AND HOOK +10799;10799;10799;02AA;02AA; # (𐞙; 𐞙; 𐞙; ʪ; ʪ; ) MODIFIER LETTER SMALL LS DIGRAPH +1079A;1079A;1079A;02AB;02AB; # (𐞚; 𐞚; 𐞚; ʫ; ʫ; ) MODIFIER LETTER SMALL LZ DIGRAPH +1079B;1079B;1079B;026C;026C; # (𐞛; 𐞛; 𐞛; ɬ; ɬ; ) MODIFIER LETTER SMALL L WITH BELT +1079C;1079C;1079C;1DF04;1DF04; # (𐞜; 𐞜; 𐞜; 𝼄; 𝼄; ) MODIFIER LETTER SMALL CAPITAL L WITH BELT +1079D;1079D;1079D;A78E;A78E; # (𐞝; 𐞝; 𐞝; ꞎ; ꞎ; ) MODIFIER LETTER SMALL L WITH RETROFLEX HOOK AND BELT +1079E;1079E;1079E;026E;026E; # (𐞞; 𐞞; 𐞞; ɮ; ɮ; ) MODIFIER LETTER SMALL LEZH +1079F;1079F;1079F;1DF05;1DF05; # (𐞟; 𐞟; 𐞟; 𝼅; 𝼅; ) MODIFIER LETTER SMALL LEZH WITH RETROFLEX HOOK +107A0;107A0;107A0;028E;028E; # (𐞠; 𐞠; 𐞠; ʎ; ʎ; ) MODIFIER LETTER SMALL TURNED Y +107A1;107A1;107A1;1DF06;1DF06; # (𐞡; 𐞡; 𐞡; 𝼆; 𝼆; ) MODIFIER LETTER SMALL TURNED Y WITH BELT +107A2;107A2;107A2;00F8;00F8; # (𐞢; 𐞢; 𐞢; ø; ø; ) MODIFIER LETTER SMALL O WITH STROKE +107A3;107A3;107A3;0276;0276; # (𐞣; 𐞣; 𐞣; ɶ; ɶ; ) MODIFIER LETTER SMALL CAPITAL OE +107A4;107A4;107A4;0277;0277; # (𐞤; 𐞤; 𐞤; ɷ; ɷ; ) MODIFIER LETTER SMALL CLOSED OMEGA +107A5;107A5;107A5;0071;0071; # (𐞥; 𐞥; 𐞥; q; q; ) MODIFIER LETTER SMALL Q +107A6;107A6;107A6;027A;027A; # (𐞦; 𐞦; 𐞦; ɺ; ɺ; ) MODIFIER LETTER SMALL TURNED R WITH LONG LEG +107A7;107A7;107A7;1DF08;1DF08; # (𐞧; 𐞧; 𐞧; 𝼈; 𝼈; ) MODIFIER LETTER SMALL TURNED R WITH LONG LEG AND RETROFLEX HOOK +107A8;107A8;107A8;027D;027D; # (𐞨; 𐞨; 𐞨; ɽ; ɽ; ) MODIFIER LETTER SMALL R WITH TAIL +107A9;107A9;107A9;027E;027E; # (𐞩; 𐞩; 𐞩; ɾ; ɾ; ) MODIFIER LETTER SMALL R WITH FISHHOOK +107AA;107AA;107AA;0280;0280; # (𐞪; 𐞪; 𐞪; ʀ; ʀ; ) MODIFIER LETTER SMALL CAPITAL R +107AB;107AB;107AB;02A8;02A8; # (𐞫; 𐞫; 𐞫; ʨ; ʨ; ) MODIFIER LETTER SMALL TC DIGRAPH WITH CURL +107AC;107AC;107AC;02A6;02A6; # (𐞬; 𐞬; 𐞬; ʦ; ʦ; ) MODIFIER LETTER SMALL TS DIGRAPH +107AD;107AD;107AD;AB67;AB67; # (𐞭; 𐞭; 𐞭; ꭧ; ꭧ; ) MODIFIER LETTER SMALL TS DIGRAPH WITH RETROFLEX HOOK +107AE;107AE;107AE;02A7;02A7; # (𐞮; 𐞮; 𐞮; ʧ; ʧ; ) MODIFIER LETTER SMALL TESH DIGRAPH +107AF;107AF;107AF;0288;0288; # (𐞯; 𐞯; 𐞯; ʈ; ʈ; ) MODIFIER LETTER SMALL T WITH RETROFLEX HOOK +107B0;107B0;107B0;2C71;2C71; # (𐞰; 𐞰; 𐞰; ⱱ; ⱱ; ) MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2;107B2;107B2;028F;028F; # (𐞲; 𐞲; 𐞲; ʏ; ʏ; ) MODIFIER LETTER SMALL CAPITAL Y +107B3;107B3;107B3;02A1;02A1; # (𐞳; 𐞳; 𐞳; ʡ; ʡ; ) MODIFIER LETTER GLOTTAL STOP WITH STROKE +107B4;107B4;107B4;02A2;02A2; # (𐞴; 𐞴; 𐞴; ʢ; ʢ; ) MODIFIER LETTER REVERSED GLOTTAL STOP WITH STROKE +107B5;107B5;107B5;0298;0298; # (𐞵; 𐞵; 𐞵; ʘ; ʘ; ) MODIFIER LETTER BILABIAL CLICK +107B6;107B6;107B6;01C0;01C0; # (𐞶; 𐞶; 𐞶; ǀ; ǀ; ) MODIFIER LETTER DENTAL CLICK +107B7;107B7;107B7;01C1;01C1; # (𐞷; 𐞷; 𐞷; ǁ; ǁ; ) MODIFIER LETTER LATERAL CLICK +107B8;107B8;107B8;01C2;01C2; # (𐞸; 𐞸; 𐞸; ǂ; ǂ; ) MODIFIER LETTER ALVEOLAR CLICK +107B9;107B9;107B9;1DF0A;1DF0A; # (𐞹; 𐞹; 𐞹; 𝼊; 𝼊; ) MODIFIER LETTER RETROFLEX CLICK WITH RETROFLEX HOOK +107BA;107BA;107BA;1DF1E;1DF1E; # (𐞺; 𐞺; 𐞺; 𝼞; 𝼞; ) MODIFIER LETTER SMALL S WITH CURL +1109A;1109A;11099 110BA;1109A;11099 110BA; # (𑂚; 𑂚; 𑂙◌𑂺; 𑂚; 𑂙◌𑂺; ) KAITHI LETTER DDDHA +1109C;1109C;1109B 110BA;1109C;1109B 110BA; # (𑂜; 𑂜; 𑂛◌𑂺; 𑂜; 𑂛◌𑂺; ) KAITHI LETTER RHA +110AB;110AB;110A5 110BA;110AB;110A5 110BA; # (𑂫; 𑂫; 𑂥◌𑂺; 𑂫; 𑂥◌𑂺; ) KAITHI LETTER VA +1112E;1112E;11131 11127;1112E;11131 11127; # (◌𑄮; ◌𑄮; ◌𑄱◌𑄧; ◌𑄮; ◌𑄱◌𑄧; ) CHAKMA VOWEL SIGN O +1112F;1112F;11132 11127;1112F;11132 11127; # (◌𑄯; ◌𑄯; ◌𑄲◌𑄧; ◌𑄯; ◌𑄲◌𑄧; ) CHAKMA VOWEL SIGN AU +1134B;1134B;11347 1133E;1134B;11347 1133E; # (𑍋; 𑍋; 𑍋; 𑍋; 𑍋; ) GRANTHA VOWEL SIGN OO +1134C;1134C;11347 11357;1134C;11347 11357; # (𑍌; 𑍌; 𑍌; 𑍌; 𑍌; ) GRANTHA VOWEL SIGN AU +114BB;114BB;114B9 114BA;114BB;114B9 114BA; # (𑒻; 𑒻; 𑒹◌𑒺; 𑒻; 𑒹◌𑒺; ) TIRHUTA VOWEL SIGN AI +114BC;114BC;114B9 114B0;114BC;114B9 114B0; # (𑒼; 𑒼; 𑒼; 𑒼; 𑒼; ) TIRHUTA VOWEL SIGN O +114BE;114BE;114B9 114BD;114BE;114B9 114BD; # (𑒾; 𑒾; 𑒾; 𑒾; 𑒾; ) TIRHUTA VOWEL SIGN AU +115BA;115BA;115B8 115AF;115BA;115B8 115AF; # (𑖺; 𑖺; 𑖺; 𑖺; 𑖺; ) SIDDHAM VOWEL SIGN O +115BB;115BB;115B9 115AF;115BB;115B9 115AF; # (𑖻; 𑖻; 𑖻; 𑖻; 𑖻; ) SIDDHAM VOWEL SIGN AU +11938;11938;11935 11930;11938;11935 11930; # (𑤸; 𑤸; 𑤸; 𑤸; 𑤸; ) DIVES AKURU VOWEL SIGN O +1D15E;1D157 1D165;1D157 1D165;1D157 1D165;1D157 1D165; # (𝅗𝅥; 𝅗𝅥; 𝅗𝅥; 𝅗𝅥; 𝅗𝅥; ) MUSICAL SYMBOL HALF NOTE +1D15F;1D158 1D165;1D158 1D165;1D158 1D165;1D158 1D165; # (𝅘𝅥; 𝅘𝅥; 𝅘𝅥; 𝅘𝅥; 𝅘𝅥; ) MUSICAL SYMBOL QUARTER NOTE +1D160;1D158 1D165 1D16E;1D158 1D165 1D16E;1D158 1D165 1D16E;1D158 1D165 1D16E; # (𝅘𝅥𝅮; 𝅘𝅥𝅮; 𝅘𝅥𝅮; 𝅘𝅥𝅮; 𝅘𝅥𝅮; ) MUSICAL SYMBOL EIGHTH NOTE +1D161;1D158 1D165 1D16F;1D158 1D165 1D16F;1D158 1D165 1D16F;1D158 1D165 1D16F; # (𝅘𝅥𝅯; 𝅘𝅥𝅯; 𝅘𝅥𝅯; 𝅘𝅥𝅯; 𝅘𝅥𝅯; ) MUSICAL SYMBOL SIXTEENTH NOTE +1D162;1D158 1D165 1D170;1D158 1D165 1D170;1D158 1D165 1D170;1D158 1D165 1D170; # (𝅘𝅥𝅰; 𝅘𝅥𝅰; 𝅘𝅥𝅰; 𝅘𝅥𝅰; 𝅘𝅥𝅰; ) MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163;1D158 1D165 1D171;1D158 1D165 1D171;1D158 1D165 1D171;1D158 1D165 1D171; # (𝅘𝅥𝅱; 𝅘𝅥𝅱; 𝅘𝅥𝅱; 𝅘𝅥𝅱; 𝅘𝅥𝅱; ) MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164;1D158 1D165 1D172;1D158 1D165 1D172;1D158 1D165 1D172;1D158 1D165 1D172; # (𝅘𝅥𝅲; 𝅘𝅥𝅲; 𝅘𝅥𝅲; 𝅘𝅥𝅲; 𝅘𝅥𝅲; ) MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D1BB;1D1B9 1D165;1D1B9 1D165;1D1B9 1D165;1D1B9 1D165; # (𝆹𝅥; 𝆹𝅥; 𝆹𝅥; 𝆹𝅥; 𝆹𝅥; ) MUSICAL SYMBOL MINIMA +1D1BC;1D1BA 1D165;1D1BA 1D165;1D1BA 1D165;1D1BA 1D165; # (𝆺𝅥; 𝆺𝅥; 𝆺𝅥; 𝆺𝅥; 𝆺𝅥; ) MUSICAL SYMBOL MINIMA BLACK +1D1BD;1D1B9 1D165 1D16E;1D1B9 1D165 1D16E;1D1B9 1D165 1D16E;1D1B9 1D165 1D16E; # (𝆹𝅥𝅮; 𝆹𝅥𝅮; 𝆹𝅥𝅮; 𝆹𝅥𝅮; 𝆹𝅥𝅮; ) MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE;1D1BA 1D165 1D16E;1D1BA 1D165 1D16E;1D1BA 1D165 1D16E;1D1BA 1D165 1D16E; # (𝆺𝅥𝅮; 𝆺𝅥𝅮; 𝆺𝅥𝅮; 𝆺𝅥𝅮; 𝆺𝅥𝅮; ) MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF;1D1B9 1D165 1D16F;1D1B9 1D165 1D16F;1D1B9 1D165 1D16F;1D1B9 1D165 1D16F; # (𝆹𝅥𝅯; 𝆹𝅥𝅯; 𝆹𝅥𝅯; 𝆹𝅥𝅯; 𝆹𝅥𝅯; ) MUSICAL SYMBOL FUSA WHITE +1D1C0;1D1BA 1D165 1D16F;1D1BA 1D165 1D16F;1D1BA 1D165 1D16F;1D1BA 1D165 1D16F; # (𝆺𝅥𝅯; 𝆺𝅥𝅯; 𝆺𝅥𝅯; 𝆺𝅥𝅯; 𝆺𝅥𝅯; ) MUSICAL SYMBOL FUSA BLACK +1D400;1D400;1D400;0041;0041; # (𝐀; 𝐀; 𝐀; A; A; ) MATHEMATICAL BOLD CAPITAL A +1D401;1D401;1D401;0042;0042; # (𝐁; 𝐁; 𝐁; B; B; ) MATHEMATICAL BOLD CAPITAL B +1D402;1D402;1D402;0043;0043; # (𝐂; 𝐂; 𝐂; C; C; ) MATHEMATICAL BOLD CAPITAL C +1D403;1D403;1D403;0044;0044; # (𝐃; 𝐃; 𝐃; D; D; ) MATHEMATICAL BOLD CAPITAL D +1D404;1D404;1D404;0045;0045; # (𝐄; 𝐄; 𝐄; E; E; ) MATHEMATICAL BOLD CAPITAL E +1D405;1D405;1D405;0046;0046; # (𝐅; 𝐅; 𝐅; F; F; ) MATHEMATICAL BOLD CAPITAL F +1D406;1D406;1D406;0047;0047; # (𝐆; 𝐆; 𝐆; G; G; ) MATHEMATICAL BOLD CAPITAL G +1D407;1D407;1D407;0048;0048; # (𝐇; 𝐇; 𝐇; H; H; ) MATHEMATICAL BOLD CAPITAL H +1D408;1D408;1D408;0049;0049; # (𝐈; 𝐈; 𝐈; I; I; ) MATHEMATICAL BOLD CAPITAL I +1D409;1D409;1D409;004A;004A; # (𝐉; 𝐉; 𝐉; J; J; ) MATHEMATICAL BOLD CAPITAL J +1D40A;1D40A;1D40A;004B;004B; # (𝐊; 𝐊; 𝐊; K; K; ) MATHEMATICAL BOLD CAPITAL K +1D40B;1D40B;1D40B;004C;004C; # (𝐋; 𝐋; 𝐋; L; L; ) MATHEMATICAL BOLD CAPITAL L +1D40C;1D40C;1D40C;004D;004D; # (𝐌; 𝐌; 𝐌; M; M; ) MATHEMATICAL BOLD CAPITAL M +1D40D;1D40D;1D40D;004E;004E; # (𝐍; 𝐍; 𝐍; N; N; ) MATHEMATICAL BOLD CAPITAL N +1D40E;1D40E;1D40E;004F;004F; # (𝐎; 𝐎; 𝐎; O; O; ) MATHEMATICAL BOLD CAPITAL O +1D40F;1D40F;1D40F;0050;0050; # (𝐏; 𝐏; 𝐏; P; P; ) MATHEMATICAL BOLD CAPITAL P +1D410;1D410;1D410;0051;0051; # (𝐐; 𝐐; 𝐐; Q; Q; ) MATHEMATICAL BOLD CAPITAL Q +1D411;1D411;1D411;0052;0052; # (𝐑; 𝐑; 𝐑; R; R; ) MATHEMATICAL BOLD CAPITAL R +1D412;1D412;1D412;0053;0053; # (𝐒; 𝐒; 𝐒; S; S; ) MATHEMATICAL BOLD CAPITAL S +1D413;1D413;1D413;0054;0054; # (𝐓; 𝐓; 𝐓; T; T; ) MATHEMATICAL BOLD CAPITAL T +1D414;1D414;1D414;0055;0055; # (𝐔; 𝐔; 𝐔; U; U; ) MATHEMATICAL BOLD CAPITAL U +1D415;1D415;1D415;0056;0056; # (𝐕; 𝐕; 𝐕; V; V; ) MATHEMATICAL BOLD CAPITAL V +1D416;1D416;1D416;0057;0057; # (𝐖; 𝐖; 𝐖; W; W; ) MATHEMATICAL BOLD CAPITAL W +1D417;1D417;1D417;0058;0058; # (𝐗; 𝐗; 𝐗; X; X; ) MATHEMATICAL BOLD CAPITAL X +1D418;1D418;1D418;0059;0059; # (𝐘; 𝐘; 𝐘; Y; Y; ) MATHEMATICAL BOLD CAPITAL Y +1D419;1D419;1D419;005A;005A; # (𝐙; 𝐙; 𝐙; Z; Z; ) MATHEMATICAL BOLD CAPITAL Z +1D41A;1D41A;1D41A;0061;0061; # (𝐚; 𝐚; 𝐚; a; a; ) MATHEMATICAL BOLD SMALL A +1D41B;1D41B;1D41B;0062;0062; # (𝐛; 𝐛; 𝐛; b; b; ) MATHEMATICAL BOLD SMALL B +1D41C;1D41C;1D41C;0063;0063; # (𝐜; 𝐜; 𝐜; c; c; ) MATHEMATICAL BOLD SMALL C +1D41D;1D41D;1D41D;0064;0064; # (𝐝; 𝐝; 𝐝; d; d; ) MATHEMATICAL BOLD SMALL D +1D41E;1D41E;1D41E;0065;0065; # (𝐞; 𝐞; 𝐞; e; e; ) MATHEMATICAL BOLD SMALL E +1D41F;1D41F;1D41F;0066;0066; # (𝐟; 𝐟; 𝐟; f; f; ) MATHEMATICAL BOLD SMALL F +1D420;1D420;1D420;0067;0067; # (𝐠; 𝐠; 𝐠; g; g; ) MATHEMATICAL BOLD SMALL G +1D421;1D421;1D421;0068;0068; # (𝐡; 𝐡; 𝐡; h; h; ) MATHEMATICAL BOLD SMALL H +1D422;1D422;1D422;0069;0069; # (𝐢; 𝐢; 𝐢; i; i; ) MATHEMATICAL BOLD SMALL I +1D423;1D423;1D423;006A;006A; # (𝐣; 𝐣; 𝐣; j; j; ) MATHEMATICAL BOLD SMALL J +1D424;1D424;1D424;006B;006B; # (𝐤; 𝐤; 𝐤; k; k; ) MATHEMATICAL BOLD SMALL K +1D425;1D425;1D425;006C;006C; # (𝐥; 𝐥; 𝐥; l; l; ) MATHEMATICAL BOLD SMALL L +1D426;1D426;1D426;006D;006D; # (𝐦; 𝐦; 𝐦; m; m; ) MATHEMATICAL BOLD SMALL M +1D427;1D427;1D427;006E;006E; # (𝐧; 𝐧; 𝐧; n; n; ) MATHEMATICAL BOLD SMALL N +1D428;1D428;1D428;006F;006F; # (𝐨; 𝐨; 𝐨; o; o; ) MATHEMATICAL BOLD SMALL O +1D429;1D429;1D429;0070;0070; # (𝐩; 𝐩; 𝐩; p; p; ) MATHEMATICAL BOLD SMALL P +1D42A;1D42A;1D42A;0071;0071; # (𝐪; 𝐪; 𝐪; q; q; ) MATHEMATICAL BOLD SMALL Q +1D42B;1D42B;1D42B;0072;0072; # (𝐫; 𝐫; 𝐫; r; r; ) MATHEMATICAL BOLD SMALL R +1D42C;1D42C;1D42C;0073;0073; # (𝐬; 𝐬; 𝐬; s; s; ) MATHEMATICAL BOLD SMALL S +1D42D;1D42D;1D42D;0074;0074; # (𝐭; 𝐭; 𝐭; t; t; ) MATHEMATICAL BOLD SMALL T +1D42E;1D42E;1D42E;0075;0075; # (𝐮; 𝐮; 𝐮; u; u; ) MATHEMATICAL BOLD SMALL U +1D42F;1D42F;1D42F;0076;0076; # (𝐯; 𝐯; 𝐯; v; v; ) MATHEMATICAL BOLD SMALL V +1D430;1D430;1D430;0077;0077; # (𝐰; 𝐰; 𝐰; w; w; ) MATHEMATICAL BOLD SMALL W +1D431;1D431;1D431;0078;0078; # (𝐱; 𝐱; 𝐱; x; x; ) MATHEMATICAL BOLD SMALL X +1D432;1D432;1D432;0079;0079; # (𝐲; 𝐲; 𝐲; y; y; ) MATHEMATICAL BOLD SMALL Y +1D433;1D433;1D433;007A;007A; # (𝐳; 𝐳; 𝐳; z; z; ) MATHEMATICAL BOLD SMALL Z +1D434;1D434;1D434;0041;0041; # (𝐴; 𝐴; 𝐴; A; A; ) MATHEMATICAL ITALIC CAPITAL A +1D435;1D435;1D435;0042;0042; # (𝐵; 𝐵; 𝐵; B; B; ) MATHEMATICAL ITALIC CAPITAL B +1D436;1D436;1D436;0043;0043; # (𝐶; 𝐶; 𝐶; C; C; ) MATHEMATICAL ITALIC CAPITAL C +1D437;1D437;1D437;0044;0044; # (𝐷; 𝐷; 𝐷; D; D; ) MATHEMATICAL ITALIC CAPITAL D +1D438;1D438;1D438;0045;0045; # (𝐸; 𝐸; 𝐸; E; E; ) MATHEMATICAL ITALIC CAPITAL E +1D439;1D439;1D439;0046;0046; # (𝐹; 𝐹; 𝐹; F; F; ) MATHEMATICAL ITALIC CAPITAL F +1D43A;1D43A;1D43A;0047;0047; # (𝐺; 𝐺; 𝐺; G; G; ) MATHEMATICAL ITALIC CAPITAL G +1D43B;1D43B;1D43B;0048;0048; # (𝐻; 𝐻; 𝐻; H; H; ) MATHEMATICAL ITALIC CAPITAL H +1D43C;1D43C;1D43C;0049;0049; # (𝐼; 𝐼; 𝐼; I; I; ) MATHEMATICAL ITALIC CAPITAL I +1D43D;1D43D;1D43D;004A;004A; # (𝐽; 𝐽; 𝐽; J; J; ) MATHEMATICAL ITALIC CAPITAL J +1D43E;1D43E;1D43E;004B;004B; # (𝐾; 𝐾; 𝐾; K; K; ) MATHEMATICAL ITALIC CAPITAL K +1D43F;1D43F;1D43F;004C;004C; # (𝐿; 𝐿; 𝐿; L; L; ) MATHEMATICAL ITALIC CAPITAL L +1D440;1D440;1D440;004D;004D; # (𝑀; 𝑀; 𝑀; M; M; ) MATHEMATICAL ITALIC CAPITAL M +1D441;1D441;1D441;004E;004E; # (𝑁; 𝑁; 𝑁; N; N; ) MATHEMATICAL ITALIC CAPITAL N +1D442;1D442;1D442;004F;004F; # (𝑂; 𝑂; 𝑂; O; O; ) MATHEMATICAL ITALIC CAPITAL O +1D443;1D443;1D443;0050;0050; # (𝑃; 𝑃; 𝑃; P; P; ) MATHEMATICAL ITALIC CAPITAL P +1D444;1D444;1D444;0051;0051; # (𝑄; 𝑄; 𝑄; Q; Q; ) MATHEMATICAL ITALIC CAPITAL Q +1D445;1D445;1D445;0052;0052; # (𝑅; 𝑅; 𝑅; R; R; ) MATHEMATICAL ITALIC CAPITAL R +1D446;1D446;1D446;0053;0053; # (𝑆; 𝑆; 𝑆; S; S; ) MATHEMATICAL ITALIC CAPITAL S +1D447;1D447;1D447;0054;0054; # (𝑇; 𝑇; 𝑇; T; T; ) MATHEMATICAL ITALIC CAPITAL T +1D448;1D448;1D448;0055;0055; # (𝑈; 𝑈; 𝑈; U; U; ) MATHEMATICAL ITALIC CAPITAL U +1D449;1D449;1D449;0056;0056; # (𝑉; 𝑉; 𝑉; V; V; ) MATHEMATICAL ITALIC CAPITAL V +1D44A;1D44A;1D44A;0057;0057; # (𝑊; 𝑊; 𝑊; W; W; ) MATHEMATICAL ITALIC CAPITAL W +1D44B;1D44B;1D44B;0058;0058; # (𝑋; 𝑋; 𝑋; X; X; ) MATHEMATICAL ITALIC CAPITAL X +1D44C;1D44C;1D44C;0059;0059; # (𝑌; 𝑌; 𝑌; Y; Y; ) MATHEMATICAL ITALIC CAPITAL Y +1D44D;1D44D;1D44D;005A;005A; # (𝑍; 𝑍; 𝑍; Z; Z; ) MATHEMATICAL ITALIC CAPITAL Z +1D44E;1D44E;1D44E;0061;0061; # (𝑎; 𝑎; 𝑎; a; a; ) MATHEMATICAL ITALIC SMALL A +1D44F;1D44F;1D44F;0062;0062; # (𝑏; 𝑏; 𝑏; b; b; ) MATHEMATICAL ITALIC SMALL B +1D450;1D450;1D450;0063;0063; # (𝑐; 𝑐; 𝑐; c; c; ) MATHEMATICAL ITALIC SMALL C +1D451;1D451;1D451;0064;0064; # (𝑑; 𝑑; 𝑑; d; d; ) MATHEMATICAL ITALIC SMALL D +1D452;1D452;1D452;0065;0065; # (𝑒; 𝑒; 𝑒; e; e; ) MATHEMATICAL ITALIC SMALL E +1D453;1D453;1D453;0066;0066; # (𝑓; 𝑓; 𝑓; f; f; ) MATHEMATICAL ITALIC SMALL F +1D454;1D454;1D454;0067;0067; # (𝑔; 𝑔; 𝑔; g; g; ) MATHEMATICAL ITALIC SMALL G +1D456;1D456;1D456;0069;0069; # (𝑖; 𝑖; 𝑖; i; i; ) MATHEMATICAL ITALIC SMALL I +1D457;1D457;1D457;006A;006A; # (𝑗; 𝑗; 𝑗; j; j; ) MATHEMATICAL ITALIC SMALL J +1D458;1D458;1D458;006B;006B; # (𝑘; 𝑘; 𝑘; k; k; ) MATHEMATICAL ITALIC SMALL K +1D459;1D459;1D459;006C;006C; # (𝑙; 𝑙; 𝑙; l; l; ) MATHEMATICAL ITALIC SMALL L +1D45A;1D45A;1D45A;006D;006D; # (𝑚; 𝑚; 𝑚; m; m; ) MATHEMATICAL ITALIC SMALL M +1D45B;1D45B;1D45B;006E;006E; # (𝑛; 𝑛; 𝑛; n; n; ) MATHEMATICAL ITALIC SMALL N +1D45C;1D45C;1D45C;006F;006F; # (𝑜; 𝑜; 𝑜; o; o; ) MATHEMATICAL ITALIC SMALL O +1D45D;1D45D;1D45D;0070;0070; # (𝑝; 𝑝; 𝑝; p; p; ) MATHEMATICAL ITALIC SMALL P +1D45E;1D45E;1D45E;0071;0071; # (𝑞; 𝑞; 𝑞; q; q; ) MATHEMATICAL ITALIC SMALL Q +1D45F;1D45F;1D45F;0072;0072; # (𝑟; 𝑟; 𝑟; r; r; ) MATHEMATICAL ITALIC SMALL R +1D460;1D460;1D460;0073;0073; # (𝑠; 𝑠; 𝑠; s; s; ) MATHEMATICAL ITALIC SMALL S +1D461;1D461;1D461;0074;0074; # (𝑡; 𝑡; 𝑡; t; t; ) MATHEMATICAL ITALIC SMALL T +1D462;1D462;1D462;0075;0075; # (𝑢; 𝑢; 𝑢; u; u; ) MATHEMATICAL ITALIC SMALL U +1D463;1D463;1D463;0076;0076; # (𝑣; 𝑣; 𝑣; v; v; ) MATHEMATICAL ITALIC SMALL V +1D464;1D464;1D464;0077;0077; # (𝑤; 𝑤; 𝑤; w; w; ) MATHEMATICAL ITALIC SMALL W +1D465;1D465;1D465;0078;0078; # (𝑥; 𝑥; 𝑥; x; x; ) MATHEMATICAL ITALIC SMALL X +1D466;1D466;1D466;0079;0079; # (𝑦; 𝑦; 𝑦; y; y; ) MATHEMATICAL ITALIC SMALL Y +1D467;1D467;1D467;007A;007A; # (𝑧; 𝑧; 𝑧; z; z; ) MATHEMATICAL ITALIC SMALL Z +1D468;1D468;1D468;0041;0041; # (𝑨; 𝑨; 𝑨; A; A; ) MATHEMATICAL BOLD ITALIC CAPITAL A +1D469;1D469;1D469;0042;0042; # (𝑩; 𝑩; 𝑩; B; B; ) MATHEMATICAL BOLD ITALIC CAPITAL B +1D46A;1D46A;1D46A;0043;0043; # (𝑪; 𝑪; 𝑪; C; C; ) MATHEMATICAL BOLD ITALIC CAPITAL C +1D46B;1D46B;1D46B;0044;0044; # (𝑫; 𝑫; 𝑫; D; D; ) MATHEMATICAL BOLD ITALIC CAPITAL D +1D46C;1D46C;1D46C;0045;0045; # (𝑬; 𝑬; 𝑬; E; E; ) MATHEMATICAL BOLD ITALIC CAPITAL E +1D46D;1D46D;1D46D;0046;0046; # (𝑭; 𝑭; 𝑭; F; F; ) MATHEMATICAL BOLD ITALIC CAPITAL F +1D46E;1D46E;1D46E;0047;0047; # (𝑮; 𝑮; 𝑮; G; G; ) MATHEMATICAL BOLD ITALIC CAPITAL G +1D46F;1D46F;1D46F;0048;0048; # (𝑯; 𝑯; 𝑯; H; H; ) MATHEMATICAL BOLD ITALIC CAPITAL H +1D470;1D470;1D470;0049;0049; # (𝑰; 𝑰; 𝑰; I; I; ) MATHEMATICAL BOLD ITALIC CAPITAL I +1D471;1D471;1D471;004A;004A; # (𝑱; 𝑱; 𝑱; J; J; ) MATHEMATICAL BOLD ITALIC CAPITAL J +1D472;1D472;1D472;004B;004B; # (𝑲; 𝑲; 𝑲; K; K; ) MATHEMATICAL BOLD ITALIC CAPITAL K +1D473;1D473;1D473;004C;004C; # (𝑳; 𝑳; 𝑳; L; L; ) MATHEMATICAL BOLD ITALIC CAPITAL L +1D474;1D474;1D474;004D;004D; # (𝑴; 𝑴; 𝑴; M; M; ) MATHEMATICAL BOLD ITALIC CAPITAL M +1D475;1D475;1D475;004E;004E; # (𝑵; 𝑵; 𝑵; N; N; ) MATHEMATICAL BOLD ITALIC CAPITAL N +1D476;1D476;1D476;004F;004F; # (𝑶; 𝑶; 𝑶; O; O; ) MATHEMATICAL BOLD ITALIC CAPITAL O +1D477;1D477;1D477;0050;0050; # (𝑷; 𝑷; 𝑷; P; P; ) MATHEMATICAL BOLD ITALIC CAPITAL P +1D478;1D478;1D478;0051;0051; # (𝑸; 𝑸; 𝑸; Q; Q; ) MATHEMATICAL BOLD ITALIC CAPITAL Q +1D479;1D479;1D479;0052;0052; # (𝑹; 𝑹; 𝑹; R; R; ) MATHEMATICAL BOLD ITALIC CAPITAL R +1D47A;1D47A;1D47A;0053;0053; # (𝑺; 𝑺; 𝑺; S; S; ) MATHEMATICAL BOLD ITALIC CAPITAL S +1D47B;1D47B;1D47B;0054;0054; # (𝑻; 𝑻; 𝑻; T; T; ) MATHEMATICAL BOLD ITALIC CAPITAL T +1D47C;1D47C;1D47C;0055;0055; # (𝑼; 𝑼; 𝑼; U; U; ) MATHEMATICAL BOLD ITALIC CAPITAL U +1D47D;1D47D;1D47D;0056;0056; # (𝑽; 𝑽; 𝑽; V; V; ) MATHEMATICAL BOLD ITALIC CAPITAL V +1D47E;1D47E;1D47E;0057;0057; # (𝑾; 𝑾; 𝑾; W; W; ) MATHEMATICAL BOLD ITALIC CAPITAL W +1D47F;1D47F;1D47F;0058;0058; # (𝑿; 𝑿; 𝑿; X; X; ) MATHEMATICAL BOLD ITALIC CAPITAL X +1D480;1D480;1D480;0059;0059; # (𝒀; 𝒀; 𝒀; Y; Y; ) MATHEMATICAL BOLD ITALIC CAPITAL Y +1D481;1D481;1D481;005A;005A; # (𝒁; 𝒁; 𝒁; Z; Z; ) MATHEMATICAL BOLD ITALIC CAPITAL Z +1D482;1D482;1D482;0061;0061; # (𝒂; 𝒂; 𝒂; a; a; ) MATHEMATICAL BOLD ITALIC SMALL A +1D483;1D483;1D483;0062;0062; # (𝒃; 𝒃; 𝒃; b; b; ) MATHEMATICAL BOLD ITALIC SMALL B +1D484;1D484;1D484;0063;0063; # (𝒄; 𝒄; 𝒄; c; c; ) MATHEMATICAL BOLD ITALIC SMALL C +1D485;1D485;1D485;0064;0064; # (𝒅; 𝒅; 𝒅; d; d; ) MATHEMATICAL BOLD ITALIC SMALL D +1D486;1D486;1D486;0065;0065; # (𝒆; 𝒆; 𝒆; e; e; ) MATHEMATICAL BOLD ITALIC SMALL E +1D487;1D487;1D487;0066;0066; # (𝒇; 𝒇; 𝒇; f; f; ) MATHEMATICAL BOLD ITALIC SMALL F +1D488;1D488;1D488;0067;0067; # (𝒈; 𝒈; 𝒈; g; g; ) MATHEMATICAL BOLD ITALIC SMALL G +1D489;1D489;1D489;0068;0068; # (𝒉; 𝒉; 𝒉; h; h; ) MATHEMATICAL BOLD ITALIC SMALL H +1D48A;1D48A;1D48A;0069;0069; # (𝒊; 𝒊; 𝒊; i; i; ) MATHEMATICAL BOLD ITALIC SMALL I +1D48B;1D48B;1D48B;006A;006A; # (𝒋; 𝒋; 𝒋; j; j; ) MATHEMATICAL BOLD ITALIC SMALL J +1D48C;1D48C;1D48C;006B;006B; # (𝒌; 𝒌; 𝒌; k; k; ) MATHEMATICAL BOLD ITALIC SMALL K +1D48D;1D48D;1D48D;006C;006C; # (𝒍; 𝒍; 𝒍; l; l; ) MATHEMATICAL BOLD ITALIC SMALL L +1D48E;1D48E;1D48E;006D;006D; # (𝒎; 𝒎; 𝒎; m; m; ) MATHEMATICAL BOLD ITALIC SMALL M +1D48F;1D48F;1D48F;006E;006E; # (𝒏; 𝒏; 𝒏; n; n; ) MATHEMATICAL BOLD ITALIC SMALL N +1D490;1D490;1D490;006F;006F; # (𝒐; 𝒐; 𝒐; o; o; ) MATHEMATICAL BOLD ITALIC SMALL O +1D491;1D491;1D491;0070;0070; # (𝒑; 𝒑; 𝒑; p; p; ) MATHEMATICAL BOLD ITALIC SMALL P +1D492;1D492;1D492;0071;0071; # (𝒒; 𝒒; 𝒒; q; q; ) MATHEMATICAL BOLD ITALIC SMALL Q +1D493;1D493;1D493;0072;0072; # (𝒓; 𝒓; 𝒓; r; r; ) MATHEMATICAL BOLD ITALIC SMALL R +1D494;1D494;1D494;0073;0073; # (𝒔; 𝒔; 𝒔; s; s; ) MATHEMATICAL BOLD ITALIC SMALL S +1D495;1D495;1D495;0074;0074; # (𝒕; 𝒕; 𝒕; t; t; ) MATHEMATICAL BOLD ITALIC SMALL T +1D496;1D496;1D496;0075;0075; # (𝒖; 𝒖; 𝒖; u; u; ) MATHEMATICAL BOLD ITALIC SMALL U +1D497;1D497;1D497;0076;0076; # (𝒗; 𝒗; 𝒗; v; v; ) MATHEMATICAL BOLD ITALIC SMALL V +1D498;1D498;1D498;0077;0077; # (𝒘; 𝒘; 𝒘; w; w; ) MATHEMATICAL BOLD ITALIC SMALL W +1D499;1D499;1D499;0078;0078; # (𝒙; 𝒙; 𝒙; x; x; ) MATHEMATICAL BOLD ITALIC SMALL X +1D49A;1D49A;1D49A;0079;0079; # (𝒚; 𝒚; 𝒚; y; y; ) MATHEMATICAL BOLD ITALIC SMALL Y +1D49B;1D49B;1D49B;007A;007A; # (𝒛; 𝒛; 𝒛; z; z; ) MATHEMATICAL BOLD ITALIC SMALL Z +1D49C;1D49C;1D49C;0041;0041; # (𝒜; 𝒜; 𝒜; A; A; ) MATHEMATICAL SCRIPT CAPITAL A +1D49E;1D49E;1D49E;0043;0043; # (𝒞; 𝒞; 𝒞; C; C; ) MATHEMATICAL SCRIPT CAPITAL C +1D49F;1D49F;1D49F;0044;0044; # (𝒟; 𝒟; 𝒟; D; D; ) MATHEMATICAL SCRIPT CAPITAL D +1D4A2;1D4A2;1D4A2;0047;0047; # (𝒢; 𝒢; 𝒢; G; G; ) MATHEMATICAL SCRIPT CAPITAL G +1D4A5;1D4A5;1D4A5;004A;004A; # (𝒥; 𝒥; 𝒥; J; J; ) MATHEMATICAL SCRIPT CAPITAL J +1D4A6;1D4A6;1D4A6;004B;004B; # (𝒦; 𝒦; 𝒦; K; K; ) MATHEMATICAL SCRIPT CAPITAL K +1D4A9;1D4A9;1D4A9;004E;004E; # (𝒩; 𝒩; 𝒩; N; N; ) MATHEMATICAL SCRIPT CAPITAL N +1D4AA;1D4AA;1D4AA;004F;004F; # (𝒪; 𝒪; 𝒪; O; O; ) MATHEMATICAL SCRIPT CAPITAL O +1D4AB;1D4AB;1D4AB;0050;0050; # (𝒫; 𝒫; 𝒫; P; P; ) MATHEMATICAL SCRIPT CAPITAL P +1D4AC;1D4AC;1D4AC;0051;0051; # (𝒬; 𝒬; 𝒬; Q; Q; ) MATHEMATICAL SCRIPT CAPITAL Q +1D4AE;1D4AE;1D4AE;0053;0053; # (𝒮; 𝒮; 𝒮; S; S; ) MATHEMATICAL SCRIPT CAPITAL S +1D4AF;1D4AF;1D4AF;0054;0054; # (𝒯; 𝒯; 𝒯; T; T; ) MATHEMATICAL SCRIPT CAPITAL T +1D4B0;1D4B0;1D4B0;0055;0055; # (𝒰; 𝒰; 𝒰; U; U; ) MATHEMATICAL SCRIPT CAPITAL U +1D4B1;1D4B1;1D4B1;0056;0056; # (𝒱; 𝒱; 𝒱; V; V; ) MATHEMATICAL SCRIPT CAPITAL V +1D4B2;1D4B2;1D4B2;0057;0057; # (𝒲; 𝒲; 𝒲; W; W; ) MATHEMATICAL SCRIPT CAPITAL W +1D4B3;1D4B3;1D4B3;0058;0058; # (𝒳; 𝒳; 𝒳; X; X; ) MATHEMATICAL SCRIPT CAPITAL X +1D4B4;1D4B4;1D4B4;0059;0059; # (𝒴; 𝒴; 𝒴; Y; Y; ) MATHEMATICAL SCRIPT CAPITAL Y +1D4B5;1D4B5;1D4B5;005A;005A; # (𝒵; 𝒵; 𝒵; Z; Z; ) MATHEMATICAL SCRIPT CAPITAL Z +1D4B6;1D4B6;1D4B6;0061;0061; # (𝒶; 𝒶; 𝒶; a; a; ) MATHEMATICAL SCRIPT SMALL A +1D4B7;1D4B7;1D4B7;0062;0062; # (𝒷; 𝒷; 𝒷; b; b; ) MATHEMATICAL SCRIPT SMALL B +1D4B8;1D4B8;1D4B8;0063;0063; # (𝒸; 𝒸; 𝒸; c; c; ) MATHEMATICAL SCRIPT SMALL C +1D4B9;1D4B9;1D4B9;0064;0064; # (𝒹; 𝒹; 𝒹; d; d; ) MATHEMATICAL SCRIPT SMALL D +1D4BB;1D4BB;1D4BB;0066;0066; # (𝒻; 𝒻; 𝒻; f; f; ) MATHEMATICAL SCRIPT SMALL F +1D4BD;1D4BD;1D4BD;0068;0068; # (𝒽; 𝒽; 𝒽; h; h; ) MATHEMATICAL SCRIPT SMALL H +1D4BE;1D4BE;1D4BE;0069;0069; # (𝒾; 𝒾; 𝒾; i; i; ) MATHEMATICAL SCRIPT SMALL I +1D4BF;1D4BF;1D4BF;006A;006A; # (𝒿; 𝒿; 𝒿; j; j; ) MATHEMATICAL SCRIPT SMALL J +1D4C0;1D4C0;1D4C0;006B;006B; # (𝓀; 𝓀; 𝓀; k; k; ) MATHEMATICAL SCRIPT SMALL K +1D4C1;1D4C1;1D4C1;006C;006C; # (𝓁; 𝓁; 𝓁; l; l; ) MATHEMATICAL SCRIPT SMALL L +1D4C2;1D4C2;1D4C2;006D;006D; # (𝓂; 𝓂; 𝓂; m; m; ) MATHEMATICAL SCRIPT SMALL M +1D4C3;1D4C3;1D4C3;006E;006E; # (𝓃; 𝓃; 𝓃; n; n; ) MATHEMATICAL SCRIPT SMALL N +1D4C5;1D4C5;1D4C5;0070;0070; # (𝓅; 𝓅; 𝓅; p; p; ) MATHEMATICAL SCRIPT SMALL P +1D4C6;1D4C6;1D4C6;0071;0071; # (𝓆; 𝓆; 𝓆; q; q; ) MATHEMATICAL SCRIPT SMALL Q +1D4C7;1D4C7;1D4C7;0072;0072; # (𝓇; 𝓇; 𝓇; r; r; ) MATHEMATICAL SCRIPT SMALL R +1D4C8;1D4C8;1D4C8;0073;0073; # (𝓈; 𝓈; 𝓈; s; s; ) MATHEMATICAL SCRIPT SMALL S +1D4C9;1D4C9;1D4C9;0074;0074; # (𝓉; 𝓉; 𝓉; t; t; ) MATHEMATICAL SCRIPT SMALL T +1D4CA;1D4CA;1D4CA;0075;0075; # (𝓊; 𝓊; 𝓊; u; u; ) MATHEMATICAL SCRIPT SMALL U +1D4CB;1D4CB;1D4CB;0076;0076; # (𝓋; 𝓋; 𝓋; v; v; ) MATHEMATICAL SCRIPT SMALL V +1D4CC;1D4CC;1D4CC;0077;0077; # (𝓌; 𝓌; 𝓌; w; w; ) MATHEMATICAL SCRIPT SMALL W +1D4CD;1D4CD;1D4CD;0078;0078; # (𝓍; 𝓍; 𝓍; x; x; ) MATHEMATICAL SCRIPT SMALL X +1D4CE;1D4CE;1D4CE;0079;0079; # (𝓎; 𝓎; 𝓎; y; y; ) MATHEMATICAL SCRIPT SMALL Y +1D4CF;1D4CF;1D4CF;007A;007A; # (𝓏; 𝓏; 𝓏; z; z; ) MATHEMATICAL SCRIPT SMALL Z +1D4D0;1D4D0;1D4D0;0041;0041; # (𝓐; 𝓐; 𝓐; A; A; ) MATHEMATICAL BOLD SCRIPT CAPITAL A +1D4D1;1D4D1;1D4D1;0042;0042; # (𝓑; 𝓑; 𝓑; B; B; ) MATHEMATICAL BOLD SCRIPT CAPITAL B +1D4D2;1D4D2;1D4D2;0043;0043; # (𝓒; 𝓒; 𝓒; C; C; ) MATHEMATICAL BOLD SCRIPT CAPITAL C +1D4D3;1D4D3;1D4D3;0044;0044; # (𝓓; 𝓓; 𝓓; D; D; ) MATHEMATICAL BOLD SCRIPT CAPITAL D +1D4D4;1D4D4;1D4D4;0045;0045; # (𝓔; 𝓔; 𝓔; E; E; ) MATHEMATICAL BOLD SCRIPT CAPITAL E +1D4D5;1D4D5;1D4D5;0046;0046; # (𝓕; 𝓕; 𝓕; F; F; ) MATHEMATICAL BOLD SCRIPT CAPITAL F +1D4D6;1D4D6;1D4D6;0047;0047; # (𝓖; 𝓖; 𝓖; G; G; ) MATHEMATICAL BOLD SCRIPT CAPITAL G +1D4D7;1D4D7;1D4D7;0048;0048; # (𝓗; 𝓗; 𝓗; H; H; ) MATHEMATICAL BOLD SCRIPT CAPITAL H +1D4D8;1D4D8;1D4D8;0049;0049; # (𝓘; 𝓘; 𝓘; I; I; ) MATHEMATICAL BOLD SCRIPT CAPITAL I +1D4D9;1D4D9;1D4D9;004A;004A; # (𝓙; 𝓙; 𝓙; J; J; ) MATHEMATICAL BOLD SCRIPT CAPITAL J +1D4DA;1D4DA;1D4DA;004B;004B; # (𝓚; 𝓚; 𝓚; K; K; ) MATHEMATICAL BOLD SCRIPT CAPITAL K +1D4DB;1D4DB;1D4DB;004C;004C; # (𝓛; 𝓛; 𝓛; L; L; ) MATHEMATICAL BOLD SCRIPT CAPITAL L +1D4DC;1D4DC;1D4DC;004D;004D; # (𝓜; 𝓜; 𝓜; M; M; ) MATHEMATICAL BOLD SCRIPT CAPITAL M +1D4DD;1D4DD;1D4DD;004E;004E; # (𝓝; 𝓝; 𝓝; N; N; ) MATHEMATICAL BOLD SCRIPT CAPITAL N +1D4DE;1D4DE;1D4DE;004F;004F; # (𝓞; 𝓞; 𝓞; O; O; ) MATHEMATICAL BOLD SCRIPT CAPITAL O +1D4DF;1D4DF;1D4DF;0050;0050; # (𝓟; 𝓟; 𝓟; P; P; ) MATHEMATICAL BOLD SCRIPT CAPITAL P +1D4E0;1D4E0;1D4E0;0051;0051; # (𝓠; 𝓠; 𝓠; Q; Q; ) MATHEMATICAL BOLD SCRIPT CAPITAL Q +1D4E1;1D4E1;1D4E1;0052;0052; # (𝓡; 𝓡; 𝓡; R; R; ) MATHEMATICAL BOLD SCRIPT CAPITAL R +1D4E2;1D4E2;1D4E2;0053;0053; # (𝓢; 𝓢; 𝓢; S; S; ) MATHEMATICAL BOLD SCRIPT CAPITAL S +1D4E3;1D4E3;1D4E3;0054;0054; # (𝓣; 𝓣; 𝓣; T; T; ) MATHEMATICAL BOLD SCRIPT CAPITAL T +1D4E4;1D4E4;1D4E4;0055;0055; # (𝓤; 𝓤; 𝓤; U; U; ) MATHEMATICAL BOLD SCRIPT CAPITAL U +1D4E5;1D4E5;1D4E5;0056;0056; # (𝓥; 𝓥; 𝓥; V; V; ) MATHEMATICAL BOLD SCRIPT CAPITAL V +1D4E6;1D4E6;1D4E6;0057;0057; # (𝓦; 𝓦; 𝓦; W; W; ) MATHEMATICAL BOLD SCRIPT CAPITAL W +1D4E7;1D4E7;1D4E7;0058;0058; # (𝓧; 𝓧; 𝓧; X; X; ) MATHEMATICAL BOLD SCRIPT CAPITAL X +1D4E8;1D4E8;1D4E8;0059;0059; # (𝓨; 𝓨; 𝓨; Y; Y; ) MATHEMATICAL BOLD SCRIPT CAPITAL Y +1D4E9;1D4E9;1D4E9;005A;005A; # (𝓩; 𝓩; 𝓩; Z; Z; ) MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D4EA;1D4EA;1D4EA;0061;0061; # (𝓪; 𝓪; 𝓪; a; a; ) MATHEMATICAL BOLD SCRIPT SMALL A +1D4EB;1D4EB;1D4EB;0062;0062; # (𝓫; 𝓫; 𝓫; b; b; ) MATHEMATICAL BOLD SCRIPT SMALL B +1D4EC;1D4EC;1D4EC;0063;0063; # (𝓬; 𝓬; 𝓬; c; c; ) MATHEMATICAL BOLD SCRIPT SMALL C +1D4ED;1D4ED;1D4ED;0064;0064; # (𝓭; 𝓭; 𝓭; d; d; ) MATHEMATICAL BOLD SCRIPT SMALL D +1D4EE;1D4EE;1D4EE;0065;0065; # (𝓮; 𝓮; 𝓮; e; e; ) MATHEMATICAL BOLD SCRIPT SMALL E +1D4EF;1D4EF;1D4EF;0066;0066; # (𝓯; 𝓯; 𝓯; f; f; ) MATHEMATICAL BOLD SCRIPT SMALL F +1D4F0;1D4F0;1D4F0;0067;0067; # (𝓰; 𝓰; 𝓰; g; g; ) MATHEMATICAL BOLD SCRIPT SMALL G +1D4F1;1D4F1;1D4F1;0068;0068; # (𝓱; 𝓱; 𝓱; h; h; ) MATHEMATICAL BOLD SCRIPT SMALL H +1D4F2;1D4F2;1D4F2;0069;0069; # (𝓲; 𝓲; 𝓲; i; i; ) MATHEMATICAL BOLD SCRIPT SMALL I +1D4F3;1D4F3;1D4F3;006A;006A; # (𝓳; 𝓳; 𝓳; j; j; ) MATHEMATICAL BOLD SCRIPT SMALL J +1D4F4;1D4F4;1D4F4;006B;006B; # (𝓴; 𝓴; 𝓴; k; k; ) MATHEMATICAL BOLD SCRIPT SMALL K +1D4F5;1D4F5;1D4F5;006C;006C; # (𝓵; 𝓵; 𝓵; l; l; ) MATHEMATICAL BOLD SCRIPT SMALL L +1D4F6;1D4F6;1D4F6;006D;006D; # (𝓶; 𝓶; 𝓶; m; m; ) MATHEMATICAL BOLD SCRIPT SMALL M +1D4F7;1D4F7;1D4F7;006E;006E; # (𝓷; 𝓷; 𝓷; n; n; ) MATHEMATICAL BOLD SCRIPT SMALL N +1D4F8;1D4F8;1D4F8;006F;006F; # (𝓸; 𝓸; 𝓸; o; o; ) MATHEMATICAL BOLD SCRIPT SMALL O +1D4F9;1D4F9;1D4F9;0070;0070; # (𝓹; 𝓹; 𝓹; p; p; ) MATHEMATICAL BOLD SCRIPT SMALL P +1D4FA;1D4FA;1D4FA;0071;0071; # (𝓺; 𝓺; 𝓺; q; q; ) MATHEMATICAL BOLD SCRIPT SMALL Q +1D4FB;1D4FB;1D4FB;0072;0072; # (𝓻; 𝓻; 𝓻; r; r; ) MATHEMATICAL BOLD SCRIPT SMALL R +1D4FC;1D4FC;1D4FC;0073;0073; # (𝓼; 𝓼; 𝓼; s; s; ) MATHEMATICAL BOLD SCRIPT SMALL S +1D4FD;1D4FD;1D4FD;0074;0074; # (𝓽; 𝓽; 𝓽; t; t; ) MATHEMATICAL BOLD SCRIPT SMALL T +1D4FE;1D4FE;1D4FE;0075;0075; # (𝓾; 𝓾; 𝓾; u; u; ) MATHEMATICAL BOLD SCRIPT SMALL U +1D4FF;1D4FF;1D4FF;0076;0076; # (𝓿; 𝓿; 𝓿; v; v; ) MATHEMATICAL BOLD SCRIPT SMALL V +1D500;1D500;1D500;0077;0077; # (𝔀; 𝔀; 𝔀; w; w; ) MATHEMATICAL BOLD SCRIPT SMALL W +1D501;1D501;1D501;0078;0078; # (𝔁; 𝔁; 𝔁; x; x; ) MATHEMATICAL BOLD SCRIPT SMALL X +1D502;1D502;1D502;0079;0079; # (𝔂; 𝔂; 𝔂; y; y; ) MATHEMATICAL BOLD SCRIPT SMALL Y +1D503;1D503;1D503;007A;007A; # (𝔃; 𝔃; 𝔃; z; z; ) MATHEMATICAL BOLD SCRIPT SMALL Z +1D504;1D504;1D504;0041;0041; # (𝔄; 𝔄; 𝔄; A; A; ) MATHEMATICAL FRAKTUR CAPITAL A +1D505;1D505;1D505;0042;0042; # (𝔅; 𝔅; 𝔅; B; B; ) MATHEMATICAL FRAKTUR CAPITAL B +1D507;1D507;1D507;0044;0044; # (𝔇; 𝔇; 𝔇; D; D; ) MATHEMATICAL FRAKTUR CAPITAL D +1D508;1D508;1D508;0045;0045; # (𝔈; 𝔈; 𝔈; E; E; ) MATHEMATICAL FRAKTUR CAPITAL E +1D509;1D509;1D509;0046;0046; # (𝔉; 𝔉; 𝔉; F; F; ) MATHEMATICAL FRAKTUR CAPITAL F +1D50A;1D50A;1D50A;0047;0047; # (𝔊; 𝔊; 𝔊; G; G; ) MATHEMATICAL FRAKTUR CAPITAL G +1D50D;1D50D;1D50D;004A;004A; # (𝔍; 𝔍; 𝔍; J; J; ) MATHEMATICAL FRAKTUR CAPITAL J +1D50E;1D50E;1D50E;004B;004B; # (𝔎; 𝔎; 𝔎; K; K; ) MATHEMATICAL FRAKTUR CAPITAL K +1D50F;1D50F;1D50F;004C;004C; # (𝔏; 𝔏; 𝔏; L; L; ) MATHEMATICAL FRAKTUR CAPITAL L +1D510;1D510;1D510;004D;004D; # (𝔐; 𝔐; 𝔐; M; M; ) MATHEMATICAL FRAKTUR CAPITAL M +1D511;1D511;1D511;004E;004E; # (𝔑; 𝔑; 𝔑; N; N; ) MATHEMATICAL FRAKTUR CAPITAL N +1D512;1D512;1D512;004F;004F; # (𝔒; 𝔒; 𝔒; O; O; ) MATHEMATICAL FRAKTUR CAPITAL O +1D513;1D513;1D513;0050;0050; # (𝔓; 𝔓; 𝔓; P; P; ) MATHEMATICAL FRAKTUR CAPITAL P +1D514;1D514;1D514;0051;0051; # (𝔔; 𝔔; 𝔔; Q; Q; ) MATHEMATICAL FRAKTUR CAPITAL Q +1D516;1D516;1D516;0053;0053; # (𝔖; 𝔖; 𝔖; S; S; ) MATHEMATICAL FRAKTUR CAPITAL S +1D517;1D517;1D517;0054;0054; # (𝔗; 𝔗; 𝔗; T; T; ) MATHEMATICAL FRAKTUR CAPITAL T +1D518;1D518;1D518;0055;0055; # (𝔘; 𝔘; 𝔘; U; U; ) MATHEMATICAL FRAKTUR CAPITAL U +1D519;1D519;1D519;0056;0056; # (𝔙; 𝔙; 𝔙; V; V; ) MATHEMATICAL FRAKTUR CAPITAL V +1D51A;1D51A;1D51A;0057;0057; # (𝔚; 𝔚; 𝔚; W; W; ) MATHEMATICAL FRAKTUR CAPITAL W +1D51B;1D51B;1D51B;0058;0058; # (𝔛; 𝔛; 𝔛; X; X; ) MATHEMATICAL FRAKTUR CAPITAL X +1D51C;1D51C;1D51C;0059;0059; # (𝔜; 𝔜; 𝔜; Y; Y; ) MATHEMATICAL FRAKTUR CAPITAL Y +1D51E;1D51E;1D51E;0061;0061; # (𝔞; 𝔞; 𝔞; a; a; ) MATHEMATICAL FRAKTUR SMALL A +1D51F;1D51F;1D51F;0062;0062; # (𝔟; 𝔟; 𝔟; b; b; ) MATHEMATICAL FRAKTUR SMALL B +1D520;1D520;1D520;0063;0063; # (𝔠; 𝔠; 𝔠; c; c; ) MATHEMATICAL FRAKTUR SMALL C +1D521;1D521;1D521;0064;0064; # (𝔡; 𝔡; 𝔡; d; d; ) MATHEMATICAL FRAKTUR SMALL D +1D522;1D522;1D522;0065;0065; # (𝔢; 𝔢; 𝔢; e; e; ) MATHEMATICAL FRAKTUR SMALL E +1D523;1D523;1D523;0066;0066; # (𝔣; 𝔣; 𝔣; f; f; ) MATHEMATICAL FRAKTUR SMALL F +1D524;1D524;1D524;0067;0067; # (𝔤; 𝔤; 𝔤; g; g; ) MATHEMATICAL FRAKTUR SMALL G +1D525;1D525;1D525;0068;0068; # (𝔥; 𝔥; 𝔥; h; h; ) MATHEMATICAL FRAKTUR SMALL H +1D526;1D526;1D526;0069;0069; # (𝔦; 𝔦; 𝔦; i; i; ) MATHEMATICAL FRAKTUR SMALL I +1D527;1D527;1D527;006A;006A; # (𝔧; 𝔧; 𝔧; j; j; ) MATHEMATICAL FRAKTUR SMALL J +1D528;1D528;1D528;006B;006B; # (𝔨; 𝔨; 𝔨; k; k; ) MATHEMATICAL FRAKTUR SMALL K +1D529;1D529;1D529;006C;006C; # (𝔩; 𝔩; 𝔩; l; l; ) MATHEMATICAL FRAKTUR SMALL L +1D52A;1D52A;1D52A;006D;006D; # (𝔪; 𝔪; 𝔪; m; m; ) MATHEMATICAL FRAKTUR SMALL M +1D52B;1D52B;1D52B;006E;006E; # (𝔫; 𝔫; 𝔫; n; n; ) MATHEMATICAL FRAKTUR SMALL N +1D52C;1D52C;1D52C;006F;006F; # (𝔬; 𝔬; 𝔬; o; o; ) MATHEMATICAL FRAKTUR SMALL O +1D52D;1D52D;1D52D;0070;0070; # (𝔭; 𝔭; 𝔭; p; p; ) MATHEMATICAL FRAKTUR SMALL P +1D52E;1D52E;1D52E;0071;0071; # (𝔮; 𝔮; 𝔮; q; q; ) MATHEMATICAL FRAKTUR SMALL Q +1D52F;1D52F;1D52F;0072;0072; # (𝔯; 𝔯; 𝔯; r; r; ) MATHEMATICAL FRAKTUR SMALL R +1D530;1D530;1D530;0073;0073; # (𝔰; 𝔰; 𝔰; s; s; ) MATHEMATICAL FRAKTUR SMALL S +1D531;1D531;1D531;0074;0074; # (𝔱; 𝔱; 𝔱; t; t; ) MATHEMATICAL FRAKTUR SMALL T +1D532;1D532;1D532;0075;0075; # (𝔲; 𝔲; 𝔲; u; u; ) MATHEMATICAL FRAKTUR SMALL U +1D533;1D533;1D533;0076;0076; # (𝔳; 𝔳; 𝔳; v; v; ) MATHEMATICAL FRAKTUR SMALL V +1D534;1D534;1D534;0077;0077; # (𝔴; 𝔴; 𝔴; w; w; ) MATHEMATICAL FRAKTUR SMALL W +1D535;1D535;1D535;0078;0078; # (𝔵; 𝔵; 𝔵; x; x; ) MATHEMATICAL FRAKTUR SMALL X +1D536;1D536;1D536;0079;0079; # (𝔶; 𝔶; 𝔶; y; y; ) MATHEMATICAL FRAKTUR SMALL Y +1D537;1D537;1D537;007A;007A; # (𝔷; 𝔷; 𝔷; z; z; ) MATHEMATICAL FRAKTUR SMALL Z +1D538;1D538;1D538;0041;0041; # (𝔸; 𝔸; 𝔸; A; A; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL A +1D539;1D539;1D539;0042;0042; # (𝔹; 𝔹; 𝔹; B; B; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B;1D53B;1D53B;0044;0044; # (𝔻; 𝔻; 𝔻; D; D; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL D +1D53C;1D53C;1D53C;0045;0045; # (𝔼; 𝔼; 𝔼; E; E; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL E +1D53D;1D53D;1D53D;0046;0046; # (𝔽; 𝔽; 𝔽; F; F; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL F +1D53E;1D53E;1D53E;0047;0047; # (𝔾; 𝔾; 𝔾; G; G; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540;1D540;1D540;0049;0049; # (𝕀; 𝕀; 𝕀; I; I; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL I +1D541;1D541;1D541;004A;004A; # (𝕁; 𝕁; 𝕁; J; J; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL J +1D542;1D542;1D542;004B;004B; # (𝕂; 𝕂; 𝕂; K; K; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL K +1D543;1D543;1D543;004C;004C; # (𝕃; 𝕃; 𝕃; L; L; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL L +1D544;1D544;1D544;004D;004D; # (𝕄; 𝕄; 𝕄; M; M; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546;1D546;1D546;004F;004F; # (𝕆; 𝕆; 𝕆; O; O; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A;1D54A;1D54A;0053;0053; # (𝕊; 𝕊; 𝕊; S; S; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL S +1D54B;1D54B;1D54B;0054;0054; # (𝕋; 𝕋; 𝕋; T; T; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL T +1D54C;1D54C;1D54C;0055;0055; # (𝕌; 𝕌; 𝕌; U; U; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL U +1D54D;1D54D;1D54D;0056;0056; # (𝕍; 𝕍; 𝕍; V; V; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL V +1D54E;1D54E;1D54E;0057;0057; # (𝕎; 𝕎; 𝕎; W; W; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL W +1D54F;1D54F;1D54F;0058;0058; # (𝕏; 𝕏; 𝕏; X; X; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL X +1D550;1D550;1D550;0059;0059; # (𝕐; 𝕐; 𝕐; Y; Y; ) MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552;1D552;1D552;0061;0061; # (𝕒; 𝕒; 𝕒; a; a; ) MATHEMATICAL DOUBLE-STRUCK SMALL A +1D553;1D553;1D553;0062;0062; # (𝕓; 𝕓; 𝕓; b; b; ) MATHEMATICAL DOUBLE-STRUCK SMALL B +1D554;1D554;1D554;0063;0063; # (𝕔; 𝕔; 𝕔; c; c; ) MATHEMATICAL DOUBLE-STRUCK SMALL C +1D555;1D555;1D555;0064;0064; # (𝕕; 𝕕; 𝕕; d; d; ) MATHEMATICAL DOUBLE-STRUCK SMALL D +1D556;1D556;1D556;0065;0065; # (𝕖; 𝕖; 𝕖; e; e; ) MATHEMATICAL DOUBLE-STRUCK SMALL E +1D557;1D557;1D557;0066;0066; # (𝕗; 𝕗; 𝕗; f; f; ) MATHEMATICAL DOUBLE-STRUCK SMALL F +1D558;1D558;1D558;0067;0067; # (𝕘; 𝕘; 𝕘; g; g; ) MATHEMATICAL DOUBLE-STRUCK SMALL G +1D559;1D559;1D559;0068;0068; # (𝕙; 𝕙; 𝕙; h; h; ) MATHEMATICAL DOUBLE-STRUCK SMALL H +1D55A;1D55A;1D55A;0069;0069; # (𝕚; 𝕚; 𝕚; i; i; ) MATHEMATICAL DOUBLE-STRUCK SMALL I +1D55B;1D55B;1D55B;006A;006A; # (𝕛; 𝕛; 𝕛; j; j; ) MATHEMATICAL DOUBLE-STRUCK SMALL J +1D55C;1D55C;1D55C;006B;006B; # (𝕜; 𝕜; 𝕜; k; k; ) MATHEMATICAL DOUBLE-STRUCK SMALL K +1D55D;1D55D;1D55D;006C;006C; # (𝕝; 𝕝; 𝕝; l; l; ) MATHEMATICAL DOUBLE-STRUCK SMALL L +1D55E;1D55E;1D55E;006D;006D; # (𝕞; 𝕞; 𝕞; m; m; ) MATHEMATICAL DOUBLE-STRUCK SMALL M +1D55F;1D55F;1D55F;006E;006E; # (𝕟; 𝕟; 𝕟; n; n; ) MATHEMATICAL DOUBLE-STRUCK SMALL N +1D560;1D560;1D560;006F;006F; # (𝕠; 𝕠; 𝕠; o; o; ) MATHEMATICAL DOUBLE-STRUCK SMALL O +1D561;1D561;1D561;0070;0070; # (𝕡; 𝕡; 𝕡; p; p; ) MATHEMATICAL DOUBLE-STRUCK SMALL P +1D562;1D562;1D562;0071;0071; # (𝕢; 𝕢; 𝕢; q; q; ) MATHEMATICAL DOUBLE-STRUCK SMALL Q +1D563;1D563;1D563;0072;0072; # (𝕣; 𝕣; 𝕣; r; r; ) MATHEMATICAL DOUBLE-STRUCK SMALL R +1D564;1D564;1D564;0073;0073; # (𝕤; 𝕤; 𝕤; s; s; ) MATHEMATICAL DOUBLE-STRUCK SMALL S +1D565;1D565;1D565;0074;0074; # (𝕥; 𝕥; 𝕥; t; t; ) MATHEMATICAL DOUBLE-STRUCK SMALL T +1D566;1D566;1D566;0075;0075; # (𝕦; 𝕦; 𝕦; u; u; ) MATHEMATICAL DOUBLE-STRUCK SMALL U +1D567;1D567;1D567;0076;0076; # (𝕧; 𝕧; 𝕧; v; v; ) MATHEMATICAL DOUBLE-STRUCK SMALL V +1D568;1D568;1D568;0077;0077; # (𝕨; 𝕨; 𝕨; w; w; ) MATHEMATICAL DOUBLE-STRUCK SMALL W +1D569;1D569;1D569;0078;0078; # (𝕩; 𝕩; 𝕩; x; x; ) MATHEMATICAL DOUBLE-STRUCK SMALL X +1D56A;1D56A;1D56A;0079;0079; # (𝕪; 𝕪; 𝕪; y; y; ) MATHEMATICAL DOUBLE-STRUCK SMALL Y +1D56B;1D56B;1D56B;007A;007A; # (𝕫; 𝕫; 𝕫; z; z; ) MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D56C;1D56C;1D56C;0041;0041; # (𝕬; 𝕬; 𝕬; A; A; ) MATHEMATICAL BOLD FRAKTUR CAPITAL A +1D56D;1D56D;1D56D;0042;0042; # (𝕭; 𝕭; 𝕭; B; B; ) MATHEMATICAL BOLD FRAKTUR CAPITAL B +1D56E;1D56E;1D56E;0043;0043; # (𝕮; 𝕮; 𝕮; C; C; ) MATHEMATICAL BOLD FRAKTUR CAPITAL C +1D56F;1D56F;1D56F;0044;0044; # (𝕯; 𝕯; 𝕯; D; D; ) MATHEMATICAL BOLD FRAKTUR CAPITAL D +1D570;1D570;1D570;0045;0045; # (𝕰; 𝕰; 𝕰; E; E; ) MATHEMATICAL BOLD FRAKTUR CAPITAL E +1D571;1D571;1D571;0046;0046; # (𝕱; 𝕱; 𝕱; F; F; ) MATHEMATICAL BOLD FRAKTUR CAPITAL F +1D572;1D572;1D572;0047;0047; # (𝕲; 𝕲; 𝕲; G; G; ) MATHEMATICAL BOLD FRAKTUR CAPITAL G +1D573;1D573;1D573;0048;0048; # (𝕳; 𝕳; 𝕳; H; H; ) MATHEMATICAL BOLD FRAKTUR CAPITAL H +1D574;1D574;1D574;0049;0049; # (𝕴; 𝕴; 𝕴; I; I; ) MATHEMATICAL BOLD FRAKTUR CAPITAL I +1D575;1D575;1D575;004A;004A; # (𝕵; 𝕵; 𝕵; J; J; ) MATHEMATICAL BOLD FRAKTUR CAPITAL J +1D576;1D576;1D576;004B;004B; # (𝕶; 𝕶; 𝕶; K; K; ) MATHEMATICAL BOLD FRAKTUR CAPITAL K +1D577;1D577;1D577;004C;004C; # (𝕷; 𝕷; 𝕷; L; L; ) MATHEMATICAL BOLD FRAKTUR CAPITAL L +1D578;1D578;1D578;004D;004D; # (𝕸; 𝕸; 𝕸; M; M; ) MATHEMATICAL BOLD FRAKTUR CAPITAL M +1D579;1D579;1D579;004E;004E; # (𝕹; 𝕹; 𝕹; N; N; ) MATHEMATICAL BOLD FRAKTUR CAPITAL N +1D57A;1D57A;1D57A;004F;004F; # (𝕺; 𝕺; 𝕺; O; O; ) MATHEMATICAL BOLD FRAKTUR CAPITAL O +1D57B;1D57B;1D57B;0050;0050; # (𝕻; 𝕻; 𝕻; P; P; ) MATHEMATICAL BOLD FRAKTUR CAPITAL P +1D57C;1D57C;1D57C;0051;0051; # (𝕼; 𝕼; 𝕼; Q; Q; ) MATHEMATICAL BOLD FRAKTUR CAPITAL Q +1D57D;1D57D;1D57D;0052;0052; # (𝕽; 𝕽; 𝕽; R; R; ) MATHEMATICAL BOLD FRAKTUR CAPITAL R +1D57E;1D57E;1D57E;0053;0053; # (𝕾; 𝕾; 𝕾; S; S; ) MATHEMATICAL BOLD FRAKTUR CAPITAL S +1D57F;1D57F;1D57F;0054;0054; # (𝕿; 𝕿; 𝕿; T; T; ) MATHEMATICAL BOLD FRAKTUR CAPITAL T +1D580;1D580;1D580;0055;0055; # (𝖀; 𝖀; 𝖀; U; U; ) MATHEMATICAL BOLD FRAKTUR CAPITAL U +1D581;1D581;1D581;0056;0056; # (𝖁; 𝖁; 𝖁; V; V; ) MATHEMATICAL BOLD FRAKTUR CAPITAL V +1D582;1D582;1D582;0057;0057; # (𝖂; 𝖂; 𝖂; W; W; ) MATHEMATICAL BOLD FRAKTUR CAPITAL W +1D583;1D583;1D583;0058;0058; # (𝖃; 𝖃; 𝖃; X; X; ) MATHEMATICAL BOLD FRAKTUR CAPITAL X +1D584;1D584;1D584;0059;0059; # (𝖄; 𝖄; 𝖄; Y; Y; ) MATHEMATICAL BOLD FRAKTUR CAPITAL Y +1D585;1D585;1D585;005A;005A; # (𝖅; 𝖅; 𝖅; Z; Z; ) MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D586;1D586;1D586;0061;0061; # (𝖆; 𝖆; 𝖆; a; a; ) MATHEMATICAL BOLD FRAKTUR SMALL A +1D587;1D587;1D587;0062;0062; # (𝖇; 𝖇; 𝖇; b; b; ) MATHEMATICAL BOLD FRAKTUR SMALL B +1D588;1D588;1D588;0063;0063; # (𝖈; 𝖈; 𝖈; c; c; ) MATHEMATICAL BOLD FRAKTUR SMALL C +1D589;1D589;1D589;0064;0064; # (𝖉; 𝖉; 𝖉; d; d; ) MATHEMATICAL BOLD FRAKTUR SMALL D +1D58A;1D58A;1D58A;0065;0065; # (𝖊; 𝖊; 𝖊; e; e; ) MATHEMATICAL BOLD FRAKTUR SMALL E +1D58B;1D58B;1D58B;0066;0066; # (𝖋; 𝖋; 𝖋; f; f; ) MATHEMATICAL BOLD FRAKTUR SMALL F +1D58C;1D58C;1D58C;0067;0067; # (𝖌; 𝖌; 𝖌; g; g; ) MATHEMATICAL BOLD FRAKTUR SMALL G +1D58D;1D58D;1D58D;0068;0068; # (𝖍; 𝖍; 𝖍; h; h; ) MATHEMATICAL BOLD FRAKTUR SMALL H +1D58E;1D58E;1D58E;0069;0069; # (𝖎; 𝖎; 𝖎; i; i; ) MATHEMATICAL BOLD FRAKTUR SMALL I +1D58F;1D58F;1D58F;006A;006A; # (𝖏; 𝖏; 𝖏; j; j; ) MATHEMATICAL BOLD FRAKTUR SMALL J +1D590;1D590;1D590;006B;006B; # (𝖐; 𝖐; 𝖐; k; k; ) MATHEMATICAL BOLD FRAKTUR SMALL K +1D591;1D591;1D591;006C;006C; # (𝖑; 𝖑; 𝖑; l; l; ) MATHEMATICAL BOLD FRAKTUR SMALL L +1D592;1D592;1D592;006D;006D; # (𝖒; 𝖒; 𝖒; m; m; ) MATHEMATICAL BOLD FRAKTUR SMALL M +1D593;1D593;1D593;006E;006E; # (𝖓; 𝖓; 𝖓; n; n; ) MATHEMATICAL BOLD FRAKTUR SMALL N +1D594;1D594;1D594;006F;006F; # (𝖔; 𝖔; 𝖔; o; o; ) MATHEMATICAL BOLD FRAKTUR SMALL O +1D595;1D595;1D595;0070;0070; # (𝖕; 𝖕; 𝖕; p; p; ) MATHEMATICAL BOLD FRAKTUR SMALL P +1D596;1D596;1D596;0071;0071; # (𝖖; 𝖖; 𝖖; q; q; ) MATHEMATICAL BOLD FRAKTUR SMALL Q +1D597;1D597;1D597;0072;0072; # (𝖗; 𝖗; 𝖗; r; r; ) MATHEMATICAL BOLD FRAKTUR SMALL R +1D598;1D598;1D598;0073;0073; # (𝖘; 𝖘; 𝖘; s; s; ) MATHEMATICAL BOLD FRAKTUR SMALL S +1D599;1D599;1D599;0074;0074; # (𝖙; 𝖙; 𝖙; t; t; ) MATHEMATICAL BOLD FRAKTUR SMALL T +1D59A;1D59A;1D59A;0075;0075; # (𝖚; 𝖚; 𝖚; u; u; ) MATHEMATICAL BOLD FRAKTUR SMALL U +1D59B;1D59B;1D59B;0076;0076; # (𝖛; 𝖛; 𝖛; v; v; ) MATHEMATICAL BOLD FRAKTUR SMALL V +1D59C;1D59C;1D59C;0077;0077; # (𝖜; 𝖜; 𝖜; w; w; ) MATHEMATICAL BOLD FRAKTUR SMALL W +1D59D;1D59D;1D59D;0078;0078; # (𝖝; 𝖝; 𝖝; x; x; ) MATHEMATICAL BOLD FRAKTUR SMALL X +1D59E;1D59E;1D59E;0079;0079; # (𝖞; 𝖞; 𝖞; y; y; ) MATHEMATICAL BOLD FRAKTUR SMALL Y +1D59F;1D59F;1D59F;007A;007A; # (𝖟; 𝖟; 𝖟; z; z; ) MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5A0;1D5A0;1D5A0;0041;0041; # (𝖠; 𝖠; 𝖠; A; A; ) MATHEMATICAL SANS-SERIF CAPITAL A +1D5A1;1D5A1;1D5A1;0042;0042; # (𝖡; 𝖡; 𝖡; B; B; ) MATHEMATICAL SANS-SERIF CAPITAL B +1D5A2;1D5A2;1D5A2;0043;0043; # (𝖢; 𝖢; 𝖢; C; C; ) MATHEMATICAL SANS-SERIF CAPITAL C +1D5A3;1D5A3;1D5A3;0044;0044; # (𝖣; 𝖣; 𝖣; D; D; ) MATHEMATICAL SANS-SERIF CAPITAL D +1D5A4;1D5A4;1D5A4;0045;0045; # (𝖤; 𝖤; 𝖤; E; E; ) MATHEMATICAL SANS-SERIF CAPITAL E +1D5A5;1D5A5;1D5A5;0046;0046; # (𝖥; 𝖥; 𝖥; F; F; ) MATHEMATICAL SANS-SERIF CAPITAL F +1D5A6;1D5A6;1D5A6;0047;0047; # (𝖦; 𝖦; 𝖦; G; G; ) MATHEMATICAL SANS-SERIF CAPITAL G +1D5A7;1D5A7;1D5A7;0048;0048; # (𝖧; 𝖧; 𝖧; H; H; ) MATHEMATICAL SANS-SERIF CAPITAL H +1D5A8;1D5A8;1D5A8;0049;0049; # (𝖨; 𝖨; 𝖨; I; I; ) MATHEMATICAL SANS-SERIF CAPITAL I +1D5A9;1D5A9;1D5A9;004A;004A; # (𝖩; 𝖩; 𝖩; J; J; ) MATHEMATICAL SANS-SERIF CAPITAL J +1D5AA;1D5AA;1D5AA;004B;004B; # (𝖪; 𝖪; 𝖪; K; K; ) MATHEMATICAL SANS-SERIF CAPITAL K +1D5AB;1D5AB;1D5AB;004C;004C; # (𝖫; 𝖫; 𝖫; L; L; ) MATHEMATICAL SANS-SERIF CAPITAL L +1D5AC;1D5AC;1D5AC;004D;004D; # (𝖬; 𝖬; 𝖬; M; M; ) MATHEMATICAL SANS-SERIF CAPITAL M +1D5AD;1D5AD;1D5AD;004E;004E; # (𝖭; 𝖭; 𝖭; N; N; ) MATHEMATICAL SANS-SERIF CAPITAL N +1D5AE;1D5AE;1D5AE;004F;004F; # (𝖮; 𝖮; 𝖮; O; O; ) MATHEMATICAL SANS-SERIF CAPITAL O +1D5AF;1D5AF;1D5AF;0050;0050; # (𝖯; 𝖯; 𝖯; P; P; ) MATHEMATICAL SANS-SERIF CAPITAL P +1D5B0;1D5B0;1D5B0;0051;0051; # (𝖰; 𝖰; 𝖰; Q; Q; ) MATHEMATICAL SANS-SERIF CAPITAL Q +1D5B1;1D5B1;1D5B1;0052;0052; # (𝖱; 𝖱; 𝖱; R; R; ) MATHEMATICAL SANS-SERIF CAPITAL R +1D5B2;1D5B2;1D5B2;0053;0053; # (𝖲; 𝖲; 𝖲; S; S; ) MATHEMATICAL SANS-SERIF CAPITAL S +1D5B3;1D5B3;1D5B3;0054;0054; # (𝖳; 𝖳; 𝖳; T; T; ) MATHEMATICAL SANS-SERIF CAPITAL T +1D5B4;1D5B4;1D5B4;0055;0055; # (𝖴; 𝖴; 𝖴; U; U; ) MATHEMATICAL SANS-SERIF CAPITAL U +1D5B5;1D5B5;1D5B5;0056;0056; # (𝖵; 𝖵; 𝖵; V; V; ) MATHEMATICAL SANS-SERIF CAPITAL V +1D5B6;1D5B6;1D5B6;0057;0057; # (𝖶; 𝖶; 𝖶; W; W; ) MATHEMATICAL SANS-SERIF CAPITAL W +1D5B7;1D5B7;1D5B7;0058;0058; # (𝖷; 𝖷; 𝖷; X; X; ) MATHEMATICAL SANS-SERIF CAPITAL X +1D5B8;1D5B8;1D5B8;0059;0059; # (𝖸; 𝖸; 𝖸; Y; Y; ) MATHEMATICAL SANS-SERIF CAPITAL Y +1D5B9;1D5B9;1D5B9;005A;005A; # (𝖹; 𝖹; 𝖹; Z; Z; ) MATHEMATICAL SANS-SERIF CAPITAL Z +1D5BA;1D5BA;1D5BA;0061;0061; # (𝖺; 𝖺; 𝖺; a; a; ) MATHEMATICAL SANS-SERIF SMALL A +1D5BB;1D5BB;1D5BB;0062;0062; # (𝖻; 𝖻; 𝖻; b; b; ) MATHEMATICAL SANS-SERIF SMALL B +1D5BC;1D5BC;1D5BC;0063;0063; # (𝖼; 𝖼; 𝖼; c; c; ) MATHEMATICAL SANS-SERIF SMALL C +1D5BD;1D5BD;1D5BD;0064;0064; # (𝖽; 𝖽; 𝖽; d; d; ) MATHEMATICAL SANS-SERIF SMALL D +1D5BE;1D5BE;1D5BE;0065;0065; # (𝖾; 𝖾; 𝖾; e; e; ) MATHEMATICAL SANS-SERIF SMALL E +1D5BF;1D5BF;1D5BF;0066;0066; # (𝖿; 𝖿; 𝖿; f; f; ) MATHEMATICAL SANS-SERIF SMALL F +1D5C0;1D5C0;1D5C0;0067;0067; # (𝗀; 𝗀; 𝗀; g; g; ) MATHEMATICAL SANS-SERIF SMALL G +1D5C1;1D5C1;1D5C1;0068;0068; # (𝗁; 𝗁; 𝗁; h; h; ) MATHEMATICAL SANS-SERIF SMALL H +1D5C2;1D5C2;1D5C2;0069;0069; # (𝗂; 𝗂; 𝗂; i; i; ) MATHEMATICAL SANS-SERIF SMALL I +1D5C3;1D5C3;1D5C3;006A;006A; # (𝗃; 𝗃; 𝗃; j; j; ) MATHEMATICAL SANS-SERIF SMALL J +1D5C4;1D5C4;1D5C4;006B;006B; # (𝗄; 𝗄; 𝗄; k; k; ) MATHEMATICAL SANS-SERIF SMALL K +1D5C5;1D5C5;1D5C5;006C;006C; # (𝗅; 𝗅; 𝗅; l; l; ) MATHEMATICAL SANS-SERIF SMALL L +1D5C6;1D5C6;1D5C6;006D;006D; # (𝗆; 𝗆; 𝗆; m; m; ) MATHEMATICAL SANS-SERIF SMALL M +1D5C7;1D5C7;1D5C7;006E;006E; # (𝗇; 𝗇; 𝗇; n; n; ) MATHEMATICAL SANS-SERIF SMALL N +1D5C8;1D5C8;1D5C8;006F;006F; # (𝗈; 𝗈; 𝗈; o; o; ) MATHEMATICAL SANS-SERIF SMALL O +1D5C9;1D5C9;1D5C9;0070;0070; # (𝗉; 𝗉; 𝗉; p; p; ) MATHEMATICAL SANS-SERIF SMALL P +1D5CA;1D5CA;1D5CA;0071;0071; # (𝗊; 𝗊; 𝗊; q; q; ) MATHEMATICAL SANS-SERIF SMALL Q +1D5CB;1D5CB;1D5CB;0072;0072; # (𝗋; 𝗋; 𝗋; r; r; ) MATHEMATICAL SANS-SERIF SMALL R +1D5CC;1D5CC;1D5CC;0073;0073; # (𝗌; 𝗌; 𝗌; s; s; ) MATHEMATICAL SANS-SERIF SMALL S +1D5CD;1D5CD;1D5CD;0074;0074; # (𝗍; 𝗍; 𝗍; t; t; ) MATHEMATICAL SANS-SERIF SMALL T +1D5CE;1D5CE;1D5CE;0075;0075; # (𝗎; 𝗎; 𝗎; u; u; ) MATHEMATICAL SANS-SERIF SMALL U +1D5CF;1D5CF;1D5CF;0076;0076; # (𝗏; 𝗏; 𝗏; v; v; ) MATHEMATICAL SANS-SERIF SMALL V +1D5D0;1D5D0;1D5D0;0077;0077; # (𝗐; 𝗐; 𝗐; w; w; ) MATHEMATICAL SANS-SERIF SMALL W +1D5D1;1D5D1;1D5D1;0078;0078; # (𝗑; 𝗑; 𝗑; x; x; ) MATHEMATICAL SANS-SERIF SMALL X +1D5D2;1D5D2;1D5D2;0079;0079; # (𝗒; 𝗒; 𝗒; y; y; ) MATHEMATICAL SANS-SERIF SMALL Y +1D5D3;1D5D3;1D5D3;007A;007A; # (𝗓; 𝗓; 𝗓; z; z; ) MATHEMATICAL SANS-SERIF SMALL Z +1D5D4;1D5D4;1D5D4;0041;0041; # (𝗔; 𝗔; 𝗔; A; A; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL A +1D5D5;1D5D5;1D5D5;0042;0042; # (𝗕; 𝗕; 𝗕; B; B; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL B +1D5D6;1D5D6;1D5D6;0043;0043; # (𝗖; 𝗖; 𝗖; C; C; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL C +1D5D7;1D5D7;1D5D7;0044;0044; # (𝗗; 𝗗; 𝗗; D; D; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL D +1D5D8;1D5D8;1D5D8;0045;0045; # (𝗘; 𝗘; 𝗘; E; E; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL E +1D5D9;1D5D9;1D5D9;0046;0046; # (𝗙; 𝗙; 𝗙; F; F; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL F +1D5DA;1D5DA;1D5DA;0047;0047; # (𝗚; 𝗚; 𝗚; G; G; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL G +1D5DB;1D5DB;1D5DB;0048;0048; # (𝗛; 𝗛; 𝗛; H; H; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL H +1D5DC;1D5DC;1D5DC;0049;0049; # (𝗜; 𝗜; 𝗜; I; I; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL I +1D5DD;1D5DD;1D5DD;004A;004A; # (𝗝; 𝗝; 𝗝; J; J; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL J +1D5DE;1D5DE;1D5DE;004B;004B; # (𝗞; 𝗞; 𝗞; K; K; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL K +1D5DF;1D5DF;1D5DF;004C;004C; # (𝗟; 𝗟; 𝗟; L; L; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL L +1D5E0;1D5E0;1D5E0;004D;004D; # (𝗠; 𝗠; 𝗠; M; M; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL M +1D5E1;1D5E1;1D5E1;004E;004E; # (𝗡; 𝗡; 𝗡; N; N; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL N +1D5E2;1D5E2;1D5E2;004F;004F; # (𝗢; 𝗢; 𝗢; O; O; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL O +1D5E3;1D5E3;1D5E3;0050;0050; # (𝗣; 𝗣; 𝗣; P; P; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL P +1D5E4;1D5E4;1D5E4;0051;0051; # (𝗤; 𝗤; 𝗤; Q; Q; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Q +1D5E5;1D5E5;1D5E5;0052;0052; # (𝗥; 𝗥; 𝗥; R; R; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL R +1D5E6;1D5E6;1D5E6;0053;0053; # (𝗦; 𝗦; 𝗦; S; S; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL S +1D5E7;1D5E7;1D5E7;0054;0054; # (𝗧; 𝗧; 𝗧; T; T; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL T +1D5E8;1D5E8;1D5E8;0055;0055; # (𝗨; 𝗨; 𝗨; U; U; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL U +1D5E9;1D5E9;1D5E9;0056;0056; # (𝗩; 𝗩; 𝗩; V; V; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL V +1D5EA;1D5EA;1D5EA;0057;0057; # (𝗪; 𝗪; 𝗪; W; W; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL W +1D5EB;1D5EB;1D5EB;0058;0058; # (𝗫; 𝗫; 𝗫; X; X; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL X +1D5EC;1D5EC;1D5EC;0059;0059; # (𝗬; 𝗬; 𝗬; Y; Y; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Y +1D5ED;1D5ED;1D5ED;005A;005A; # (𝗭; 𝗭; 𝗭; Z; Z; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D5EE;1D5EE;1D5EE;0061;0061; # (𝗮; 𝗮; 𝗮; a; a; ) MATHEMATICAL SANS-SERIF BOLD SMALL A +1D5EF;1D5EF;1D5EF;0062;0062; # (𝗯; 𝗯; 𝗯; b; b; ) MATHEMATICAL SANS-SERIF BOLD SMALL B +1D5F0;1D5F0;1D5F0;0063;0063; # (𝗰; 𝗰; 𝗰; c; c; ) MATHEMATICAL SANS-SERIF BOLD SMALL C +1D5F1;1D5F1;1D5F1;0064;0064; # (𝗱; 𝗱; 𝗱; d; d; ) MATHEMATICAL SANS-SERIF BOLD SMALL D +1D5F2;1D5F2;1D5F2;0065;0065; # (𝗲; 𝗲; 𝗲; e; e; ) MATHEMATICAL SANS-SERIF BOLD SMALL E +1D5F3;1D5F3;1D5F3;0066;0066; # (𝗳; 𝗳; 𝗳; f; f; ) MATHEMATICAL SANS-SERIF BOLD SMALL F +1D5F4;1D5F4;1D5F4;0067;0067; # (𝗴; 𝗴; 𝗴; g; g; ) MATHEMATICAL SANS-SERIF BOLD SMALL G +1D5F5;1D5F5;1D5F5;0068;0068; # (𝗵; 𝗵; 𝗵; h; h; ) MATHEMATICAL SANS-SERIF BOLD SMALL H +1D5F6;1D5F6;1D5F6;0069;0069; # (𝗶; 𝗶; 𝗶; i; i; ) MATHEMATICAL SANS-SERIF BOLD SMALL I +1D5F7;1D5F7;1D5F7;006A;006A; # (𝗷; 𝗷; 𝗷; j; j; ) MATHEMATICAL SANS-SERIF BOLD SMALL J +1D5F8;1D5F8;1D5F8;006B;006B; # (𝗸; 𝗸; 𝗸; k; k; ) MATHEMATICAL SANS-SERIF BOLD SMALL K +1D5F9;1D5F9;1D5F9;006C;006C; # (𝗹; 𝗹; 𝗹; l; l; ) MATHEMATICAL SANS-SERIF BOLD SMALL L +1D5FA;1D5FA;1D5FA;006D;006D; # (𝗺; 𝗺; 𝗺; m; m; ) MATHEMATICAL SANS-SERIF BOLD SMALL M +1D5FB;1D5FB;1D5FB;006E;006E; # (𝗻; 𝗻; 𝗻; n; n; ) MATHEMATICAL SANS-SERIF BOLD SMALL N +1D5FC;1D5FC;1D5FC;006F;006F; # (𝗼; 𝗼; 𝗼; o; o; ) MATHEMATICAL SANS-SERIF BOLD SMALL O +1D5FD;1D5FD;1D5FD;0070;0070; # (𝗽; 𝗽; 𝗽; p; p; ) MATHEMATICAL SANS-SERIF BOLD SMALL P +1D5FE;1D5FE;1D5FE;0071;0071; # (𝗾; 𝗾; 𝗾; q; q; ) MATHEMATICAL SANS-SERIF BOLD SMALL Q +1D5FF;1D5FF;1D5FF;0072;0072; # (𝗿; 𝗿; 𝗿; r; r; ) MATHEMATICAL SANS-SERIF BOLD SMALL R +1D600;1D600;1D600;0073;0073; # (𝘀; 𝘀; 𝘀; s; s; ) MATHEMATICAL SANS-SERIF BOLD SMALL S +1D601;1D601;1D601;0074;0074; # (𝘁; 𝘁; 𝘁; t; t; ) MATHEMATICAL SANS-SERIF BOLD SMALL T +1D602;1D602;1D602;0075;0075; # (𝘂; 𝘂; 𝘂; u; u; ) MATHEMATICAL SANS-SERIF BOLD SMALL U +1D603;1D603;1D603;0076;0076; # (𝘃; 𝘃; 𝘃; v; v; ) MATHEMATICAL SANS-SERIF BOLD SMALL V +1D604;1D604;1D604;0077;0077; # (𝘄; 𝘄; 𝘄; w; w; ) MATHEMATICAL SANS-SERIF BOLD SMALL W +1D605;1D605;1D605;0078;0078; # (𝘅; 𝘅; 𝘅; x; x; ) MATHEMATICAL SANS-SERIF BOLD SMALL X +1D606;1D606;1D606;0079;0079; # (𝘆; 𝘆; 𝘆; y; y; ) MATHEMATICAL SANS-SERIF BOLD SMALL Y +1D607;1D607;1D607;007A;007A; # (𝘇; 𝘇; 𝘇; z; z; ) MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D608;1D608;1D608;0041;0041; # (𝘈; 𝘈; 𝘈; A; A; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL A +1D609;1D609;1D609;0042;0042; # (𝘉; 𝘉; 𝘉; B; B; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL B +1D60A;1D60A;1D60A;0043;0043; # (𝘊; 𝘊; 𝘊; C; C; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL C +1D60B;1D60B;1D60B;0044;0044; # (𝘋; 𝘋; 𝘋; D; D; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL D +1D60C;1D60C;1D60C;0045;0045; # (𝘌; 𝘌; 𝘌; E; E; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL E +1D60D;1D60D;1D60D;0046;0046; # (𝘍; 𝘍; 𝘍; F; F; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL F +1D60E;1D60E;1D60E;0047;0047; # (𝘎; 𝘎; 𝘎; G; G; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL G +1D60F;1D60F;1D60F;0048;0048; # (𝘏; 𝘏; 𝘏; H; H; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL H +1D610;1D610;1D610;0049;0049; # (𝘐; 𝘐; 𝘐; I; I; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL I +1D611;1D611;1D611;004A;004A; # (𝘑; 𝘑; 𝘑; J; J; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL J +1D612;1D612;1D612;004B;004B; # (𝘒; 𝘒; 𝘒; K; K; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL K +1D613;1D613;1D613;004C;004C; # (𝘓; 𝘓; 𝘓; L; L; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL L +1D614;1D614;1D614;004D;004D; # (𝘔; 𝘔; 𝘔; M; M; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL M +1D615;1D615;1D615;004E;004E; # (𝘕; 𝘕; 𝘕; N; N; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL N +1D616;1D616;1D616;004F;004F; # (𝘖; 𝘖; 𝘖; O; O; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL O +1D617;1D617;1D617;0050;0050; # (𝘗; 𝘗; 𝘗; P; P; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL P +1D618;1D618;1D618;0051;0051; # (𝘘; 𝘘; 𝘘; Q; Q; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q +1D619;1D619;1D619;0052;0052; # (𝘙; 𝘙; 𝘙; R; R; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL R +1D61A;1D61A;1D61A;0053;0053; # (𝘚; 𝘚; 𝘚; S; S; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL S +1D61B;1D61B;1D61B;0054;0054; # (𝘛; 𝘛; 𝘛; T; T; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL T +1D61C;1D61C;1D61C;0055;0055; # (𝘜; 𝘜; 𝘜; U; U; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL U +1D61D;1D61D;1D61D;0056;0056; # (𝘝; 𝘝; 𝘝; V; V; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL V +1D61E;1D61E;1D61E;0057;0057; # (𝘞; 𝘞; 𝘞; W; W; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL W +1D61F;1D61F;1D61F;0058;0058; # (𝘟; 𝘟; 𝘟; X; X; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL X +1D620;1D620;1D620;0059;0059; # (𝘠; 𝘠; 𝘠; Y; Y; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y +1D621;1D621;1D621;005A;005A; # (𝘡; 𝘡; 𝘡; Z; Z; ) MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D622;1D622;1D622;0061;0061; # (𝘢; 𝘢; 𝘢; a; a; ) MATHEMATICAL SANS-SERIF ITALIC SMALL A +1D623;1D623;1D623;0062;0062; # (𝘣; 𝘣; 𝘣; b; b; ) MATHEMATICAL SANS-SERIF ITALIC SMALL B +1D624;1D624;1D624;0063;0063; # (𝘤; 𝘤; 𝘤; c; c; ) MATHEMATICAL SANS-SERIF ITALIC SMALL C +1D625;1D625;1D625;0064;0064; # (𝘥; 𝘥; 𝘥; d; d; ) MATHEMATICAL SANS-SERIF ITALIC SMALL D +1D626;1D626;1D626;0065;0065; # (𝘦; 𝘦; 𝘦; e; e; ) MATHEMATICAL SANS-SERIF ITALIC SMALL E +1D627;1D627;1D627;0066;0066; # (𝘧; 𝘧; 𝘧; f; f; ) MATHEMATICAL SANS-SERIF ITALIC SMALL F +1D628;1D628;1D628;0067;0067; # (𝘨; 𝘨; 𝘨; g; g; ) MATHEMATICAL SANS-SERIF ITALIC SMALL G +1D629;1D629;1D629;0068;0068; # (𝘩; 𝘩; 𝘩; h; h; ) MATHEMATICAL SANS-SERIF ITALIC SMALL H +1D62A;1D62A;1D62A;0069;0069; # (𝘪; 𝘪; 𝘪; i; i; ) MATHEMATICAL SANS-SERIF ITALIC SMALL I +1D62B;1D62B;1D62B;006A;006A; # (𝘫; 𝘫; 𝘫; j; j; ) MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D62C;1D62C;1D62C;006B;006B; # (𝘬; 𝘬; 𝘬; k; k; ) MATHEMATICAL SANS-SERIF ITALIC SMALL K +1D62D;1D62D;1D62D;006C;006C; # (𝘭; 𝘭; 𝘭; l; l; ) MATHEMATICAL SANS-SERIF ITALIC SMALL L +1D62E;1D62E;1D62E;006D;006D; # (𝘮; 𝘮; 𝘮; m; m; ) MATHEMATICAL SANS-SERIF ITALIC SMALL M +1D62F;1D62F;1D62F;006E;006E; # (𝘯; 𝘯; 𝘯; n; n; ) MATHEMATICAL SANS-SERIF ITALIC SMALL N +1D630;1D630;1D630;006F;006F; # (𝘰; 𝘰; 𝘰; o; o; ) MATHEMATICAL SANS-SERIF ITALIC SMALL O +1D631;1D631;1D631;0070;0070; # (𝘱; 𝘱; 𝘱; p; p; ) MATHEMATICAL SANS-SERIF ITALIC SMALL P +1D632;1D632;1D632;0071;0071; # (𝘲; 𝘲; 𝘲; q; q; ) MATHEMATICAL SANS-SERIF ITALIC SMALL Q +1D633;1D633;1D633;0072;0072; # (𝘳; 𝘳; 𝘳; r; r; ) MATHEMATICAL SANS-SERIF ITALIC SMALL R +1D634;1D634;1D634;0073;0073; # (𝘴; 𝘴; 𝘴; s; s; ) MATHEMATICAL SANS-SERIF ITALIC SMALL S +1D635;1D635;1D635;0074;0074; # (𝘵; 𝘵; 𝘵; t; t; ) MATHEMATICAL SANS-SERIF ITALIC SMALL T +1D636;1D636;1D636;0075;0075; # (𝘶; 𝘶; 𝘶; u; u; ) MATHEMATICAL SANS-SERIF ITALIC SMALL U +1D637;1D637;1D637;0076;0076; # (𝘷; 𝘷; 𝘷; v; v; ) MATHEMATICAL SANS-SERIF ITALIC SMALL V +1D638;1D638;1D638;0077;0077; # (𝘸; 𝘸; 𝘸; w; w; ) MATHEMATICAL SANS-SERIF ITALIC SMALL W +1D639;1D639;1D639;0078;0078; # (𝘹; 𝘹; 𝘹; x; x; ) MATHEMATICAL SANS-SERIF ITALIC SMALL X +1D63A;1D63A;1D63A;0079;0079; # (𝘺; 𝘺; 𝘺; y; y; ) MATHEMATICAL SANS-SERIF ITALIC SMALL Y +1D63B;1D63B;1D63B;007A;007A; # (𝘻; 𝘻; 𝘻; z; z; ) MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D63C;1D63C;1D63C;0041;0041; # (𝘼; 𝘼; 𝘼; A; A; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A +1D63D;1D63D;1D63D;0042;0042; # (𝘽; 𝘽; 𝘽; B; B; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B +1D63E;1D63E;1D63E;0043;0043; # (𝘾; 𝘾; 𝘾; C; C; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C +1D63F;1D63F;1D63F;0044;0044; # (𝘿; 𝘿; 𝘿; D; D; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D +1D640;1D640;1D640;0045;0045; # (𝙀; 𝙀; 𝙀; E; E; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E +1D641;1D641;1D641;0046;0046; # (𝙁; 𝙁; 𝙁; F; F; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F +1D642;1D642;1D642;0047;0047; # (𝙂; 𝙂; 𝙂; G; G; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G +1D643;1D643;1D643;0048;0048; # (𝙃; 𝙃; 𝙃; H; H; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H +1D644;1D644;1D644;0049;0049; # (𝙄; 𝙄; 𝙄; I; I; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I +1D645;1D645;1D645;004A;004A; # (𝙅; 𝙅; 𝙅; J; J; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J +1D646;1D646;1D646;004B;004B; # (𝙆; 𝙆; 𝙆; K; K; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K +1D647;1D647;1D647;004C;004C; # (𝙇; 𝙇; 𝙇; L; L; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L +1D648;1D648;1D648;004D;004D; # (𝙈; 𝙈; 𝙈; M; M; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M +1D649;1D649;1D649;004E;004E; # (𝙉; 𝙉; 𝙉; N; N; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N +1D64A;1D64A;1D64A;004F;004F; # (𝙊; 𝙊; 𝙊; O; O; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O +1D64B;1D64B;1D64B;0050;0050; # (𝙋; 𝙋; 𝙋; P; P; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P +1D64C;1D64C;1D64C;0051;0051; # (𝙌; 𝙌; 𝙌; Q; Q; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q +1D64D;1D64D;1D64D;0052;0052; # (𝙍; 𝙍; 𝙍; R; R; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R +1D64E;1D64E;1D64E;0053;0053; # (𝙎; 𝙎; 𝙎; S; S; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S +1D64F;1D64F;1D64F;0054;0054; # (𝙏; 𝙏; 𝙏; T; T; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T +1D650;1D650;1D650;0055;0055; # (𝙐; 𝙐; 𝙐; U; U; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U +1D651;1D651;1D651;0056;0056; # (𝙑; 𝙑; 𝙑; V; V; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V +1D652;1D652;1D652;0057;0057; # (𝙒; 𝙒; 𝙒; W; W; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W +1D653;1D653;1D653;0058;0058; # (𝙓; 𝙓; 𝙓; X; X; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X +1D654;1D654;1D654;0059;0059; # (𝙔; 𝙔; 𝙔; Y; Y; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y +1D655;1D655;1D655;005A;005A; # (𝙕; 𝙕; 𝙕; Z; Z; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D656;1D656;1D656;0061;0061; # (𝙖; 𝙖; 𝙖; a; a; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A +1D657;1D657;1D657;0062;0062; # (𝙗; 𝙗; 𝙗; b; b; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B +1D658;1D658;1D658;0063;0063; # (𝙘; 𝙘; 𝙘; c; c; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C +1D659;1D659;1D659;0064;0064; # (𝙙; 𝙙; 𝙙; d; d; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D +1D65A;1D65A;1D65A;0065;0065; # (𝙚; 𝙚; 𝙚; e; e; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E +1D65B;1D65B;1D65B;0066;0066; # (𝙛; 𝙛; 𝙛; f; f; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F +1D65C;1D65C;1D65C;0067;0067; # (𝙜; 𝙜; 𝙜; g; g; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G +1D65D;1D65D;1D65D;0068;0068; # (𝙝; 𝙝; 𝙝; h; h; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H +1D65E;1D65E;1D65E;0069;0069; # (𝙞; 𝙞; 𝙞; i; i; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I +1D65F;1D65F;1D65F;006A;006A; # (𝙟; 𝙟; 𝙟; j; j; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D660;1D660;1D660;006B;006B; # (𝙠; 𝙠; 𝙠; k; k; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K +1D661;1D661;1D661;006C;006C; # (𝙡; 𝙡; 𝙡; l; l; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L +1D662;1D662;1D662;006D;006D; # (𝙢; 𝙢; 𝙢; m; m; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M +1D663;1D663;1D663;006E;006E; # (𝙣; 𝙣; 𝙣; n; n; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N +1D664;1D664;1D664;006F;006F; # (𝙤; 𝙤; 𝙤; o; o; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O +1D665;1D665;1D665;0070;0070; # (𝙥; 𝙥; 𝙥; p; p; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P +1D666;1D666;1D666;0071;0071; # (𝙦; 𝙦; 𝙦; q; q; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q +1D667;1D667;1D667;0072;0072; # (𝙧; 𝙧; 𝙧; r; r; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R +1D668;1D668;1D668;0073;0073; # (𝙨; 𝙨; 𝙨; s; s; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S +1D669;1D669;1D669;0074;0074; # (𝙩; 𝙩; 𝙩; t; t; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T +1D66A;1D66A;1D66A;0075;0075; # (𝙪; 𝙪; 𝙪; u; u; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U +1D66B;1D66B;1D66B;0076;0076; # (𝙫; 𝙫; 𝙫; v; v; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V +1D66C;1D66C;1D66C;0077;0077; # (𝙬; 𝙬; 𝙬; w; w; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W +1D66D;1D66D;1D66D;0078;0078; # (𝙭; 𝙭; 𝙭; x; x; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X +1D66E;1D66E;1D66E;0079;0079; # (𝙮; 𝙮; 𝙮; y; y; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y +1D66F;1D66F;1D66F;007A;007A; # (𝙯; 𝙯; 𝙯; z; z; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D670;1D670;1D670;0041;0041; # (𝙰; 𝙰; 𝙰; A; A; ) MATHEMATICAL MONOSPACE CAPITAL A +1D671;1D671;1D671;0042;0042; # (𝙱; 𝙱; 𝙱; B; B; ) MATHEMATICAL MONOSPACE CAPITAL B +1D672;1D672;1D672;0043;0043; # (𝙲; 𝙲; 𝙲; C; C; ) MATHEMATICAL MONOSPACE CAPITAL C +1D673;1D673;1D673;0044;0044; # (𝙳; 𝙳; 𝙳; D; D; ) MATHEMATICAL MONOSPACE CAPITAL D +1D674;1D674;1D674;0045;0045; # (𝙴; 𝙴; 𝙴; E; E; ) MATHEMATICAL MONOSPACE CAPITAL E +1D675;1D675;1D675;0046;0046; # (𝙵; 𝙵; 𝙵; F; F; ) MATHEMATICAL MONOSPACE CAPITAL F +1D676;1D676;1D676;0047;0047; # (𝙶; 𝙶; 𝙶; G; G; ) MATHEMATICAL MONOSPACE CAPITAL G +1D677;1D677;1D677;0048;0048; # (𝙷; 𝙷; 𝙷; H; H; ) MATHEMATICAL MONOSPACE CAPITAL H +1D678;1D678;1D678;0049;0049; # (𝙸; 𝙸; 𝙸; I; I; ) MATHEMATICAL MONOSPACE CAPITAL I +1D679;1D679;1D679;004A;004A; # (𝙹; 𝙹; 𝙹; J; J; ) MATHEMATICAL MONOSPACE CAPITAL J +1D67A;1D67A;1D67A;004B;004B; # (𝙺; 𝙺; 𝙺; K; K; ) MATHEMATICAL MONOSPACE CAPITAL K +1D67B;1D67B;1D67B;004C;004C; # (𝙻; 𝙻; 𝙻; L; L; ) MATHEMATICAL MONOSPACE CAPITAL L +1D67C;1D67C;1D67C;004D;004D; # (𝙼; 𝙼; 𝙼; M; M; ) MATHEMATICAL MONOSPACE CAPITAL M +1D67D;1D67D;1D67D;004E;004E; # (𝙽; 𝙽; 𝙽; N; N; ) MATHEMATICAL MONOSPACE CAPITAL N +1D67E;1D67E;1D67E;004F;004F; # (𝙾; 𝙾; 𝙾; O; O; ) MATHEMATICAL MONOSPACE CAPITAL O +1D67F;1D67F;1D67F;0050;0050; # (𝙿; 𝙿; 𝙿; P; P; ) MATHEMATICAL MONOSPACE CAPITAL P +1D680;1D680;1D680;0051;0051; # (𝚀; 𝚀; 𝚀; Q; Q; ) MATHEMATICAL MONOSPACE CAPITAL Q +1D681;1D681;1D681;0052;0052; # (𝚁; 𝚁; 𝚁; R; R; ) MATHEMATICAL MONOSPACE CAPITAL R +1D682;1D682;1D682;0053;0053; # (𝚂; 𝚂; 𝚂; S; S; ) MATHEMATICAL MONOSPACE CAPITAL S +1D683;1D683;1D683;0054;0054; # (𝚃; 𝚃; 𝚃; T; T; ) MATHEMATICAL MONOSPACE CAPITAL T +1D684;1D684;1D684;0055;0055; # (𝚄; 𝚄; 𝚄; U; U; ) MATHEMATICAL MONOSPACE CAPITAL U +1D685;1D685;1D685;0056;0056; # (𝚅; 𝚅; 𝚅; V; V; ) MATHEMATICAL MONOSPACE CAPITAL V +1D686;1D686;1D686;0057;0057; # (𝚆; 𝚆; 𝚆; W; W; ) MATHEMATICAL MONOSPACE CAPITAL W +1D687;1D687;1D687;0058;0058; # (𝚇; 𝚇; 𝚇; X; X; ) MATHEMATICAL MONOSPACE CAPITAL X +1D688;1D688;1D688;0059;0059; # (𝚈; 𝚈; 𝚈; Y; Y; ) MATHEMATICAL MONOSPACE CAPITAL Y +1D689;1D689;1D689;005A;005A; # (𝚉; 𝚉; 𝚉; Z; Z; ) MATHEMATICAL MONOSPACE CAPITAL Z +1D68A;1D68A;1D68A;0061;0061; # (𝚊; 𝚊; 𝚊; a; a; ) MATHEMATICAL MONOSPACE SMALL A +1D68B;1D68B;1D68B;0062;0062; # (𝚋; 𝚋; 𝚋; b; b; ) MATHEMATICAL MONOSPACE SMALL B +1D68C;1D68C;1D68C;0063;0063; # (𝚌; 𝚌; 𝚌; c; c; ) MATHEMATICAL MONOSPACE SMALL C +1D68D;1D68D;1D68D;0064;0064; # (𝚍; 𝚍; 𝚍; d; d; ) MATHEMATICAL MONOSPACE SMALL D +1D68E;1D68E;1D68E;0065;0065; # (𝚎; 𝚎; 𝚎; e; e; ) MATHEMATICAL MONOSPACE SMALL E +1D68F;1D68F;1D68F;0066;0066; # (𝚏; 𝚏; 𝚏; f; f; ) MATHEMATICAL MONOSPACE SMALL F +1D690;1D690;1D690;0067;0067; # (𝚐; 𝚐; 𝚐; g; g; ) MATHEMATICAL MONOSPACE SMALL G +1D691;1D691;1D691;0068;0068; # (𝚑; 𝚑; 𝚑; h; h; ) MATHEMATICAL MONOSPACE SMALL H +1D692;1D692;1D692;0069;0069; # (𝚒; 𝚒; 𝚒; i; i; ) MATHEMATICAL MONOSPACE SMALL I +1D693;1D693;1D693;006A;006A; # (𝚓; 𝚓; 𝚓; j; j; ) MATHEMATICAL MONOSPACE SMALL J +1D694;1D694;1D694;006B;006B; # (𝚔; 𝚔; 𝚔; k; k; ) MATHEMATICAL MONOSPACE SMALL K +1D695;1D695;1D695;006C;006C; # (𝚕; 𝚕; 𝚕; l; l; ) MATHEMATICAL MONOSPACE SMALL L +1D696;1D696;1D696;006D;006D; # (𝚖; 𝚖; 𝚖; m; m; ) MATHEMATICAL MONOSPACE SMALL M +1D697;1D697;1D697;006E;006E; # (𝚗; 𝚗; 𝚗; n; n; ) MATHEMATICAL MONOSPACE SMALL N +1D698;1D698;1D698;006F;006F; # (𝚘; 𝚘; 𝚘; o; o; ) MATHEMATICAL MONOSPACE SMALL O +1D699;1D699;1D699;0070;0070; # (𝚙; 𝚙; 𝚙; p; p; ) MATHEMATICAL MONOSPACE SMALL P +1D69A;1D69A;1D69A;0071;0071; # (𝚚; 𝚚; 𝚚; q; q; ) MATHEMATICAL MONOSPACE SMALL Q +1D69B;1D69B;1D69B;0072;0072; # (𝚛; 𝚛; 𝚛; r; r; ) MATHEMATICAL MONOSPACE SMALL R +1D69C;1D69C;1D69C;0073;0073; # (𝚜; 𝚜; 𝚜; s; s; ) MATHEMATICAL MONOSPACE SMALL S +1D69D;1D69D;1D69D;0074;0074; # (𝚝; 𝚝; 𝚝; t; t; ) MATHEMATICAL MONOSPACE SMALL T +1D69E;1D69E;1D69E;0075;0075; # (𝚞; 𝚞; 𝚞; u; u; ) MATHEMATICAL MONOSPACE SMALL U +1D69F;1D69F;1D69F;0076;0076; # (𝚟; 𝚟; 𝚟; v; v; ) MATHEMATICAL MONOSPACE SMALL V +1D6A0;1D6A0;1D6A0;0077;0077; # (𝚠; 𝚠; 𝚠; w; w; ) MATHEMATICAL MONOSPACE SMALL W +1D6A1;1D6A1;1D6A1;0078;0078; # (𝚡; 𝚡; 𝚡; x; x; ) MATHEMATICAL MONOSPACE SMALL X +1D6A2;1D6A2;1D6A2;0079;0079; # (𝚢; 𝚢; 𝚢; y; y; ) MATHEMATICAL MONOSPACE SMALL Y +1D6A3;1D6A3;1D6A3;007A;007A; # (𝚣; 𝚣; 𝚣; z; z; ) MATHEMATICAL MONOSPACE SMALL Z +1D6A4;1D6A4;1D6A4;0131;0131; # (𝚤; 𝚤; 𝚤; ı; ı; ) MATHEMATICAL ITALIC SMALL DOTLESS I +1D6A5;1D6A5;1D6A5;0237;0237; # (𝚥; 𝚥; 𝚥; ȷ; ȷ; ) MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8;1D6A8;1D6A8;0391;0391; # (𝚨; 𝚨; 𝚨; Α; Α; ) MATHEMATICAL BOLD CAPITAL ALPHA +1D6A9;1D6A9;1D6A9;0392;0392; # (𝚩; 𝚩; 𝚩; Β; Β; ) MATHEMATICAL BOLD CAPITAL BETA +1D6AA;1D6AA;1D6AA;0393;0393; # (𝚪; 𝚪; 𝚪; Γ; Γ; ) MATHEMATICAL BOLD CAPITAL GAMMA +1D6AB;1D6AB;1D6AB;0394;0394; # (𝚫; 𝚫; 𝚫; Δ; Δ; ) MATHEMATICAL BOLD CAPITAL DELTA +1D6AC;1D6AC;1D6AC;0395;0395; # (𝚬; 𝚬; 𝚬; Ε; Ε; ) MATHEMATICAL BOLD CAPITAL EPSILON +1D6AD;1D6AD;1D6AD;0396;0396; # (𝚭; 𝚭; 𝚭; Ζ; Ζ; ) MATHEMATICAL BOLD CAPITAL ZETA +1D6AE;1D6AE;1D6AE;0397;0397; # (𝚮; 𝚮; 𝚮; Η; Η; ) MATHEMATICAL BOLD CAPITAL ETA +1D6AF;1D6AF;1D6AF;0398;0398; # (𝚯; 𝚯; 𝚯; Θ; Θ; ) MATHEMATICAL BOLD CAPITAL THETA +1D6B0;1D6B0;1D6B0;0399;0399; # (𝚰; 𝚰; 𝚰; Ι; Ι; ) MATHEMATICAL BOLD CAPITAL IOTA +1D6B1;1D6B1;1D6B1;039A;039A; # (𝚱; 𝚱; 𝚱; Κ; Κ; ) MATHEMATICAL BOLD CAPITAL KAPPA +1D6B2;1D6B2;1D6B2;039B;039B; # (𝚲; 𝚲; 𝚲; Λ; Λ; ) MATHEMATICAL BOLD CAPITAL LAMDA +1D6B3;1D6B3;1D6B3;039C;039C; # (𝚳; 𝚳; 𝚳; Μ; Μ; ) MATHEMATICAL BOLD CAPITAL MU +1D6B4;1D6B4;1D6B4;039D;039D; # (𝚴; 𝚴; 𝚴; Ν; Ν; ) MATHEMATICAL BOLD CAPITAL NU +1D6B5;1D6B5;1D6B5;039E;039E; # (𝚵; 𝚵; 𝚵; Ξ; Ξ; ) MATHEMATICAL BOLD CAPITAL XI +1D6B6;1D6B6;1D6B6;039F;039F; # (𝚶; 𝚶; 𝚶; Ο; Ο; ) MATHEMATICAL BOLD CAPITAL OMICRON +1D6B7;1D6B7;1D6B7;03A0;03A0; # (𝚷; 𝚷; 𝚷; Π; Π; ) MATHEMATICAL BOLD CAPITAL PI +1D6B8;1D6B8;1D6B8;03A1;03A1; # (𝚸; 𝚸; 𝚸; Ρ; Ρ; ) MATHEMATICAL BOLD CAPITAL RHO +1D6B9;1D6B9;1D6B9;0398;0398; # (𝚹; 𝚹; 𝚹; Θ; Θ; ) MATHEMATICAL BOLD CAPITAL THETA SYMBOL +1D6BA;1D6BA;1D6BA;03A3;03A3; # (𝚺; 𝚺; 𝚺; Σ; Σ; ) MATHEMATICAL BOLD CAPITAL SIGMA +1D6BB;1D6BB;1D6BB;03A4;03A4; # (𝚻; 𝚻; 𝚻; Τ; Τ; ) MATHEMATICAL BOLD CAPITAL TAU +1D6BC;1D6BC;1D6BC;03A5;03A5; # (𝚼; 𝚼; 𝚼; Υ; Υ; ) MATHEMATICAL BOLD CAPITAL UPSILON +1D6BD;1D6BD;1D6BD;03A6;03A6; # (𝚽; 𝚽; 𝚽; Φ; Φ; ) MATHEMATICAL BOLD CAPITAL PHI +1D6BE;1D6BE;1D6BE;03A7;03A7; # (𝚾; 𝚾; 𝚾; Χ; Χ; ) MATHEMATICAL BOLD CAPITAL CHI +1D6BF;1D6BF;1D6BF;03A8;03A8; # (𝚿; 𝚿; 𝚿; Ψ; Ψ; ) MATHEMATICAL BOLD CAPITAL PSI +1D6C0;1D6C0;1D6C0;03A9;03A9; # (𝛀; 𝛀; 𝛀; Ω; Ω; ) MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1;1D6C1;1D6C1;2207;2207; # (𝛁; 𝛁; 𝛁; ∇; ∇; ) MATHEMATICAL BOLD NABLA +1D6C2;1D6C2;1D6C2;03B1;03B1; # (𝛂; 𝛂; 𝛂; α; α; ) MATHEMATICAL BOLD SMALL ALPHA +1D6C3;1D6C3;1D6C3;03B2;03B2; # (𝛃; 𝛃; 𝛃; β; β; ) MATHEMATICAL BOLD SMALL BETA +1D6C4;1D6C4;1D6C4;03B3;03B3; # (𝛄; 𝛄; 𝛄; γ; γ; ) MATHEMATICAL BOLD SMALL GAMMA +1D6C5;1D6C5;1D6C5;03B4;03B4; # (𝛅; 𝛅; 𝛅; δ; δ; ) MATHEMATICAL BOLD SMALL DELTA +1D6C6;1D6C6;1D6C6;03B5;03B5; # (𝛆; 𝛆; 𝛆; ε; ε; ) MATHEMATICAL BOLD SMALL EPSILON +1D6C7;1D6C7;1D6C7;03B6;03B6; # (𝛇; 𝛇; 𝛇; ζ; ζ; ) MATHEMATICAL BOLD SMALL ZETA +1D6C8;1D6C8;1D6C8;03B7;03B7; # (𝛈; 𝛈; 𝛈; η; η; ) MATHEMATICAL BOLD SMALL ETA +1D6C9;1D6C9;1D6C9;03B8;03B8; # (𝛉; 𝛉; 𝛉; θ; θ; ) MATHEMATICAL BOLD SMALL THETA +1D6CA;1D6CA;1D6CA;03B9;03B9; # (𝛊; 𝛊; 𝛊; ι; ι; ) MATHEMATICAL BOLD SMALL IOTA +1D6CB;1D6CB;1D6CB;03BA;03BA; # (𝛋; 𝛋; 𝛋; κ; κ; ) MATHEMATICAL BOLD SMALL KAPPA +1D6CC;1D6CC;1D6CC;03BB;03BB; # (𝛌; 𝛌; 𝛌; λ; λ; ) MATHEMATICAL BOLD SMALL LAMDA +1D6CD;1D6CD;1D6CD;03BC;03BC; # (𝛍; 𝛍; 𝛍; μ; μ; ) MATHEMATICAL BOLD SMALL MU +1D6CE;1D6CE;1D6CE;03BD;03BD; # (𝛎; 𝛎; 𝛎; ν; ν; ) MATHEMATICAL BOLD SMALL NU +1D6CF;1D6CF;1D6CF;03BE;03BE; # (𝛏; 𝛏; 𝛏; ξ; ξ; ) MATHEMATICAL BOLD SMALL XI +1D6D0;1D6D0;1D6D0;03BF;03BF; # (𝛐; 𝛐; 𝛐; ο; ο; ) MATHEMATICAL BOLD SMALL OMICRON +1D6D1;1D6D1;1D6D1;03C0;03C0; # (𝛑; 𝛑; 𝛑; π; π; ) MATHEMATICAL BOLD SMALL PI +1D6D2;1D6D2;1D6D2;03C1;03C1; # (𝛒; 𝛒; 𝛒; ρ; ρ; ) MATHEMATICAL BOLD SMALL RHO +1D6D3;1D6D3;1D6D3;03C2;03C2; # (𝛓; 𝛓; 𝛓; ς; ς; ) MATHEMATICAL BOLD SMALL FINAL SIGMA +1D6D4;1D6D4;1D6D4;03C3;03C3; # (𝛔; 𝛔; 𝛔; σ; σ; ) MATHEMATICAL BOLD SMALL SIGMA +1D6D5;1D6D5;1D6D5;03C4;03C4; # (𝛕; 𝛕; 𝛕; τ; τ; ) MATHEMATICAL BOLD SMALL TAU +1D6D6;1D6D6;1D6D6;03C5;03C5; # (𝛖; 𝛖; 𝛖; υ; υ; ) MATHEMATICAL BOLD SMALL UPSILON +1D6D7;1D6D7;1D6D7;03C6;03C6; # (𝛗; 𝛗; 𝛗; φ; φ; ) MATHEMATICAL BOLD SMALL PHI +1D6D8;1D6D8;1D6D8;03C7;03C7; # (𝛘; 𝛘; 𝛘; χ; χ; ) MATHEMATICAL BOLD SMALL CHI +1D6D9;1D6D9;1D6D9;03C8;03C8; # (𝛙; 𝛙; 𝛙; ψ; ψ; ) MATHEMATICAL BOLD SMALL PSI +1D6DA;1D6DA;1D6DA;03C9;03C9; # (𝛚; 𝛚; 𝛚; ω; ω; ) MATHEMATICAL BOLD SMALL OMEGA +1D6DB;1D6DB;1D6DB;2202;2202; # (𝛛; 𝛛; 𝛛; ∂; ∂; ) MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC;1D6DC;1D6DC;03B5;03B5; # (𝛜; 𝛜; 𝛜; ε; ε; ) MATHEMATICAL BOLD EPSILON SYMBOL +1D6DD;1D6DD;1D6DD;03B8;03B8; # (𝛝; 𝛝; 𝛝; θ; θ; ) MATHEMATICAL BOLD THETA SYMBOL +1D6DE;1D6DE;1D6DE;03BA;03BA; # (𝛞; 𝛞; 𝛞; κ; κ; ) MATHEMATICAL BOLD KAPPA SYMBOL +1D6DF;1D6DF;1D6DF;03C6;03C6; # (𝛟; 𝛟; 𝛟; φ; φ; ) MATHEMATICAL BOLD PHI SYMBOL +1D6E0;1D6E0;1D6E0;03C1;03C1; # (𝛠; 𝛠; 𝛠; ρ; ρ; ) MATHEMATICAL BOLD RHO SYMBOL +1D6E1;1D6E1;1D6E1;03C0;03C0; # (𝛡; 𝛡; 𝛡; π; π; ) MATHEMATICAL BOLD PI SYMBOL +1D6E2;1D6E2;1D6E2;0391;0391; # (𝛢; 𝛢; 𝛢; Α; Α; ) MATHEMATICAL ITALIC CAPITAL ALPHA +1D6E3;1D6E3;1D6E3;0392;0392; # (𝛣; 𝛣; 𝛣; Β; Β; ) MATHEMATICAL ITALIC CAPITAL BETA +1D6E4;1D6E4;1D6E4;0393;0393; # (𝛤; 𝛤; 𝛤; Γ; Γ; ) MATHEMATICAL ITALIC CAPITAL GAMMA +1D6E5;1D6E5;1D6E5;0394;0394; # (𝛥; 𝛥; 𝛥; Δ; Δ; ) MATHEMATICAL ITALIC CAPITAL DELTA +1D6E6;1D6E6;1D6E6;0395;0395; # (𝛦; 𝛦; 𝛦; Ε; Ε; ) MATHEMATICAL ITALIC CAPITAL EPSILON +1D6E7;1D6E7;1D6E7;0396;0396; # (𝛧; 𝛧; 𝛧; Ζ; Ζ; ) MATHEMATICAL ITALIC CAPITAL ZETA +1D6E8;1D6E8;1D6E8;0397;0397; # (𝛨; 𝛨; 𝛨; Η; Η; ) MATHEMATICAL ITALIC CAPITAL ETA +1D6E9;1D6E9;1D6E9;0398;0398; # (𝛩; 𝛩; 𝛩; Θ; Θ; ) MATHEMATICAL ITALIC CAPITAL THETA +1D6EA;1D6EA;1D6EA;0399;0399; # (𝛪; 𝛪; 𝛪; Ι; Ι; ) MATHEMATICAL ITALIC CAPITAL IOTA +1D6EB;1D6EB;1D6EB;039A;039A; # (𝛫; 𝛫; 𝛫; Κ; Κ; ) MATHEMATICAL ITALIC CAPITAL KAPPA +1D6EC;1D6EC;1D6EC;039B;039B; # (𝛬; 𝛬; 𝛬; Λ; Λ; ) MATHEMATICAL ITALIC CAPITAL LAMDA +1D6ED;1D6ED;1D6ED;039C;039C; # (𝛭; 𝛭; 𝛭; Μ; Μ; ) MATHEMATICAL ITALIC CAPITAL MU +1D6EE;1D6EE;1D6EE;039D;039D; # (𝛮; 𝛮; 𝛮; Ν; Ν; ) MATHEMATICAL ITALIC CAPITAL NU +1D6EF;1D6EF;1D6EF;039E;039E; # (𝛯; 𝛯; 𝛯; Ξ; Ξ; ) MATHEMATICAL ITALIC CAPITAL XI +1D6F0;1D6F0;1D6F0;039F;039F; # (𝛰; 𝛰; 𝛰; Ο; Ο; ) MATHEMATICAL ITALIC CAPITAL OMICRON +1D6F1;1D6F1;1D6F1;03A0;03A0; # (𝛱; 𝛱; 𝛱; Π; Π; ) MATHEMATICAL ITALIC CAPITAL PI +1D6F2;1D6F2;1D6F2;03A1;03A1; # (𝛲; 𝛲; 𝛲; Ρ; Ρ; ) MATHEMATICAL ITALIC CAPITAL RHO +1D6F3;1D6F3;1D6F3;0398;0398; # (𝛳; 𝛳; 𝛳; Θ; Θ; ) MATHEMATICAL ITALIC CAPITAL THETA SYMBOL +1D6F4;1D6F4;1D6F4;03A3;03A3; # (𝛴; 𝛴; 𝛴; Σ; Σ; ) MATHEMATICAL ITALIC CAPITAL SIGMA +1D6F5;1D6F5;1D6F5;03A4;03A4; # (𝛵; 𝛵; 𝛵; Τ; Τ; ) MATHEMATICAL ITALIC CAPITAL TAU +1D6F6;1D6F6;1D6F6;03A5;03A5; # (𝛶; 𝛶; 𝛶; Υ; Υ; ) MATHEMATICAL ITALIC CAPITAL UPSILON +1D6F7;1D6F7;1D6F7;03A6;03A6; # (𝛷; 𝛷; 𝛷; Φ; Φ; ) MATHEMATICAL ITALIC CAPITAL PHI +1D6F8;1D6F8;1D6F8;03A7;03A7; # (𝛸; 𝛸; 𝛸; Χ; Χ; ) MATHEMATICAL ITALIC CAPITAL CHI +1D6F9;1D6F9;1D6F9;03A8;03A8; # (𝛹; 𝛹; 𝛹; Ψ; Ψ; ) MATHEMATICAL ITALIC CAPITAL PSI +1D6FA;1D6FA;1D6FA;03A9;03A9; # (𝛺; 𝛺; 𝛺; Ω; Ω; ) MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB;1D6FB;1D6FB;2207;2207; # (𝛻; 𝛻; 𝛻; ∇; ∇; ) MATHEMATICAL ITALIC NABLA +1D6FC;1D6FC;1D6FC;03B1;03B1; # (𝛼; 𝛼; 𝛼; α; α; ) MATHEMATICAL ITALIC SMALL ALPHA +1D6FD;1D6FD;1D6FD;03B2;03B2; # (𝛽; 𝛽; 𝛽; β; β; ) MATHEMATICAL ITALIC SMALL BETA +1D6FE;1D6FE;1D6FE;03B3;03B3; # (𝛾; 𝛾; 𝛾; γ; γ; ) MATHEMATICAL ITALIC SMALL GAMMA +1D6FF;1D6FF;1D6FF;03B4;03B4; # (𝛿; 𝛿; 𝛿; δ; δ; ) MATHEMATICAL ITALIC SMALL DELTA +1D700;1D700;1D700;03B5;03B5; # (𝜀; 𝜀; 𝜀; ε; ε; ) MATHEMATICAL ITALIC SMALL EPSILON +1D701;1D701;1D701;03B6;03B6; # (𝜁; 𝜁; 𝜁; ζ; ζ; ) MATHEMATICAL ITALIC SMALL ZETA +1D702;1D702;1D702;03B7;03B7; # (𝜂; 𝜂; 𝜂; η; η; ) MATHEMATICAL ITALIC SMALL ETA +1D703;1D703;1D703;03B8;03B8; # (𝜃; 𝜃; 𝜃; θ; θ; ) MATHEMATICAL ITALIC SMALL THETA +1D704;1D704;1D704;03B9;03B9; # (𝜄; 𝜄; 𝜄; ι; ι; ) MATHEMATICAL ITALIC SMALL IOTA +1D705;1D705;1D705;03BA;03BA; # (𝜅; 𝜅; 𝜅; κ; κ; ) MATHEMATICAL ITALIC SMALL KAPPA +1D706;1D706;1D706;03BB;03BB; # (𝜆; 𝜆; 𝜆; λ; λ; ) MATHEMATICAL ITALIC SMALL LAMDA +1D707;1D707;1D707;03BC;03BC; # (𝜇; 𝜇; 𝜇; μ; μ; ) MATHEMATICAL ITALIC SMALL MU +1D708;1D708;1D708;03BD;03BD; # (𝜈; 𝜈; 𝜈; ν; ν; ) MATHEMATICAL ITALIC SMALL NU +1D709;1D709;1D709;03BE;03BE; # (𝜉; 𝜉; 𝜉; ξ; ξ; ) MATHEMATICAL ITALIC SMALL XI +1D70A;1D70A;1D70A;03BF;03BF; # (𝜊; 𝜊; 𝜊; ο; ο; ) MATHEMATICAL ITALIC SMALL OMICRON +1D70B;1D70B;1D70B;03C0;03C0; # (𝜋; 𝜋; 𝜋; π; π; ) MATHEMATICAL ITALIC SMALL PI +1D70C;1D70C;1D70C;03C1;03C1; # (𝜌; 𝜌; 𝜌; ρ; ρ; ) MATHEMATICAL ITALIC SMALL RHO +1D70D;1D70D;1D70D;03C2;03C2; # (𝜍; 𝜍; 𝜍; ς; ς; ) MATHEMATICAL ITALIC SMALL FINAL SIGMA +1D70E;1D70E;1D70E;03C3;03C3; # (𝜎; 𝜎; 𝜎; σ; σ; ) MATHEMATICAL ITALIC SMALL SIGMA +1D70F;1D70F;1D70F;03C4;03C4; # (𝜏; 𝜏; 𝜏; τ; τ; ) MATHEMATICAL ITALIC SMALL TAU +1D710;1D710;1D710;03C5;03C5; # (𝜐; 𝜐; 𝜐; υ; υ; ) MATHEMATICAL ITALIC SMALL UPSILON +1D711;1D711;1D711;03C6;03C6; # (𝜑; 𝜑; 𝜑; φ; φ; ) MATHEMATICAL ITALIC SMALL PHI +1D712;1D712;1D712;03C7;03C7; # (𝜒; 𝜒; 𝜒; χ; χ; ) MATHEMATICAL ITALIC SMALL CHI +1D713;1D713;1D713;03C8;03C8; # (𝜓; 𝜓; 𝜓; ψ; ψ; ) MATHEMATICAL ITALIC SMALL PSI +1D714;1D714;1D714;03C9;03C9; # (𝜔; 𝜔; 𝜔; ω; ω; ) MATHEMATICAL ITALIC SMALL OMEGA +1D715;1D715;1D715;2202;2202; # (𝜕; 𝜕; 𝜕; ∂; ∂; ) MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716;1D716;1D716;03B5;03B5; # (𝜖; 𝜖; 𝜖; ε; ε; ) MATHEMATICAL ITALIC EPSILON SYMBOL +1D717;1D717;1D717;03B8;03B8; # (𝜗; 𝜗; 𝜗; θ; θ; ) MATHEMATICAL ITALIC THETA SYMBOL +1D718;1D718;1D718;03BA;03BA; # (𝜘; 𝜘; 𝜘; κ; κ; ) MATHEMATICAL ITALIC KAPPA SYMBOL +1D719;1D719;1D719;03C6;03C6; # (𝜙; 𝜙; 𝜙; φ; φ; ) MATHEMATICAL ITALIC PHI SYMBOL +1D71A;1D71A;1D71A;03C1;03C1; # (𝜚; 𝜚; 𝜚; ρ; ρ; ) MATHEMATICAL ITALIC RHO SYMBOL +1D71B;1D71B;1D71B;03C0;03C0; # (𝜛; 𝜛; 𝜛; π; π; ) MATHEMATICAL ITALIC PI SYMBOL +1D71C;1D71C;1D71C;0391;0391; # (𝜜; 𝜜; 𝜜; Α; Α; ) MATHEMATICAL BOLD ITALIC CAPITAL ALPHA +1D71D;1D71D;1D71D;0392;0392; # (𝜝; 𝜝; 𝜝; Β; Β; ) MATHEMATICAL BOLD ITALIC CAPITAL BETA +1D71E;1D71E;1D71E;0393;0393; # (𝜞; 𝜞; 𝜞; Γ; Γ; ) MATHEMATICAL BOLD ITALIC CAPITAL GAMMA +1D71F;1D71F;1D71F;0394;0394; # (𝜟; 𝜟; 𝜟; Δ; Δ; ) MATHEMATICAL BOLD ITALIC CAPITAL DELTA +1D720;1D720;1D720;0395;0395; # (𝜠; 𝜠; 𝜠; Ε; Ε; ) MATHEMATICAL BOLD ITALIC CAPITAL EPSILON +1D721;1D721;1D721;0396;0396; # (𝜡; 𝜡; 𝜡; Ζ; Ζ; ) MATHEMATICAL BOLD ITALIC CAPITAL ZETA +1D722;1D722;1D722;0397;0397; # (𝜢; 𝜢; 𝜢; Η; Η; ) MATHEMATICAL BOLD ITALIC CAPITAL ETA +1D723;1D723;1D723;0398;0398; # (𝜣; 𝜣; 𝜣; Θ; Θ; ) MATHEMATICAL BOLD ITALIC CAPITAL THETA +1D724;1D724;1D724;0399;0399; # (𝜤; 𝜤; 𝜤; Ι; Ι; ) MATHEMATICAL BOLD ITALIC CAPITAL IOTA +1D725;1D725;1D725;039A;039A; # (𝜥; 𝜥; 𝜥; Κ; Κ; ) MATHEMATICAL BOLD ITALIC CAPITAL KAPPA +1D726;1D726;1D726;039B;039B; # (𝜦; 𝜦; 𝜦; Λ; Λ; ) MATHEMATICAL BOLD ITALIC CAPITAL LAMDA +1D727;1D727;1D727;039C;039C; # (𝜧; 𝜧; 𝜧; Μ; Μ; ) MATHEMATICAL BOLD ITALIC CAPITAL MU +1D728;1D728;1D728;039D;039D; # (𝜨; 𝜨; 𝜨; Ν; Ν; ) MATHEMATICAL BOLD ITALIC CAPITAL NU +1D729;1D729;1D729;039E;039E; # (𝜩; 𝜩; 𝜩; Ξ; Ξ; ) MATHEMATICAL BOLD ITALIC CAPITAL XI +1D72A;1D72A;1D72A;039F;039F; # (𝜪; 𝜪; 𝜪; Ο; Ο; ) MATHEMATICAL BOLD ITALIC CAPITAL OMICRON +1D72B;1D72B;1D72B;03A0;03A0; # (𝜫; 𝜫; 𝜫; Π; Π; ) MATHEMATICAL BOLD ITALIC CAPITAL PI +1D72C;1D72C;1D72C;03A1;03A1; # (𝜬; 𝜬; 𝜬; Ρ; Ρ; ) MATHEMATICAL BOLD ITALIC CAPITAL RHO +1D72D;1D72D;1D72D;0398;0398; # (𝜭; 𝜭; 𝜭; Θ; Θ; ) MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL +1D72E;1D72E;1D72E;03A3;03A3; # (𝜮; 𝜮; 𝜮; Σ; Σ; ) MATHEMATICAL BOLD ITALIC CAPITAL SIGMA +1D72F;1D72F;1D72F;03A4;03A4; # (𝜯; 𝜯; 𝜯; Τ; Τ; ) MATHEMATICAL BOLD ITALIC CAPITAL TAU +1D730;1D730;1D730;03A5;03A5; # (𝜰; 𝜰; 𝜰; Υ; Υ; ) MATHEMATICAL BOLD ITALIC CAPITAL UPSILON +1D731;1D731;1D731;03A6;03A6; # (𝜱; 𝜱; 𝜱; Φ; Φ; ) MATHEMATICAL BOLD ITALIC CAPITAL PHI +1D732;1D732;1D732;03A7;03A7; # (𝜲; 𝜲; 𝜲; Χ; Χ; ) MATHEMATICAL BOLD ITALIC CAPITAL CHI +1D733;1D733;1D733;03A8;03A8; # (𝜳; 𝜳; 𝜳; Ψ; Ψ; ) MATHEMATICAL BOLD ITALIC CAPITAL PSI +1D734;1D734;1D734;03A9;03A9; # (𝜴; 𝜴; 𝜴; Ω; Ω; ) MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735;1D735;1D735;2207;2207; # (𝜵; 𝜵; 𝜵; ∇; ∇; ) MATHEMATICAL BOLD ITALIC NABLA +1D736;1D736;1D736;03B1;03B1; # (𝜶; 𝜶; 𝜶; α; α; ) MATHEMATICAL BOLD ITALIC SMALL ALPHA +1D737;1D737;1D737;03B2;03B2; # (𝜷; 𝜷; 𝜷; β; β; ) MATHEMATICAL BOLD ITALIC SMALL BETA +1D738;1D738;1D738;03B3;03B3; # (𝜸; 𝜸; 𝜸; γ; γ; ) MATHEMATICAL BOLD ITALIC SMALL GAMMA +1D739;1D739;1D739;03B4;03B4; # (𝜹; 𝜹; 𝜹; δ; δ; ) MATHEMATICAL BOLD ITALIC SMALL DELTA +1D73A;1D73A;1D73A;03B5;03B5; # (𝜺; 𝜺; 𝜺; ε; ε; ) MATHEMATICAL BOLD ITALIC SMALL EPSILON +1D73B;1D73B;1D73B;03B6;03B6; # (𝜻; 𝜻; 𝜻; ζ; ζ; ) MATHEMATICAL BOLD ITALIC SMALL ZETA +1D73C;1D73C;1D73C;03B7;03B7; # (𝜼; 𝜼; 𝜼; η; η; ) MATHEMATICAL BOLD ITALIC SMALL ETA +1D73D;1D73D;1D73D;03B8;03B8; # (𝜽; 𝜽; 𝜽; θ; θ; ) MATHEMATICAL BOLD ITALIC SMALL THETA +1D73E;1D73E;1D73E;03B9;03B9; # (𝜾; 𝜾; 𝜾; ι; ι; ) MATHEMATICAL BOLD ITALIC SMALL IOTA +1D73F;1D73F;1D73F;03BA;03BA; # (𝜿; 𝜿; 𝜿; κ; κ; ) MATHEMATICAL BOLD ITALIC SMALL KAPPA +1D740;1D740;1D740;03BB;03BB; # (𝝀; 𝝀; 𝝀; λ; λ; ) MATHEMATICAL BOLD ITALIC SMALL LAMDA +1D741;1D741;1D741;03BC;03BC; # (𝝁; 𝝁; 𝝁; μ; μ; ) MATHEMATICAL BOLD ITALIC SMALL MU +1D742;1D742;1D742;03BD;03BD; # (𝝂; 𝝂; 𝝂; ν; ν; ) MATHEMATICAL BOLD ITALIC SMALL NU +1D743;1D743;1D743;03BE;03BE; # (𝝃; 𝝃; 𝝃; ξ; ξ; ) MATHEMATICAL BOLD ITALIC SMALL XI +1D744;1D744;1D744;03BF;03BF; # (𝝄; 𝝄; 𝝄; ο; ο; ) MATHEMATICAL BOLD ITALIC SMALL OMICRON +1D745;1D745;1D745;03C0;03C0; # (𝝅; 𝝅; 𝝅; π; π; ) MATHEMATICAL BOLD ITALIC SMALL PI +1D746;1D746;1D746;03C1;03C1; # (𝝆; 𝝆; 𝝆; ρ; ρ; ) MATHEMATICAL BOLD ITALIC SMALL RHO +1D747;1D747;1D747;03C2;03C2; # (𝝇; 𝝇; 𝝇; ς; ς; ) MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA +1D748;1D748;1D748;03C3;03C3; # (𝝈; 𝝈; 𝝈; σ; σ; ) MATHEMATICAL BOLD ITALIC SMALL SIGMA +1D749;1D749;1D749;03C4;03C4; # (𝝉; 𝝉; 𝝉; τ; τ; ) MATHEMATICAL BOLD ITALIC SMALL TAU +1D74A;1D74A;1D74A;03C5;03C5; # (𝝊; 𝝊; 𝝊; υ; υ; ) MATHEMATICAL BOLD ITALIC SMALL UPSILON +1D74B;1D74B;1D74B;03C6;03C6; # (𝝋; 𝝋; 𝝋; φ; φ; ) MATHEMATICAL BOLD ITALIC SMALL PHI +1D74C;1D74C;1D74C;03C7;03C7; # (𝝌; 𝝌; 𝝌; χ; χ; ) MATHEMATICAL BOLD ITALIC SMALL CHI +1D74D;1D74D;1D74D;03C8;03C8; # (𝝍; 𝝍; 𝝍; ψ; ψ; ) MATHEMATICAL BOLD ITALIC SMALL PSI +1D74E;1D74E;1D74E;03C9;03C9; # (𝝎; 𝝎; 𝝎; ω; ω; ) MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F;1D74F;1D74F;2202;2202; # (𝝏; 𝝏; 𝝏; ∂; ∂; ) MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750;1D750;1D750;03B5;03B5; # (𝝐; 𝝐; 𝝐; ε; ε; ) MATHEMATICAL BOLD ITALIC EPSILON SYMBOL +1D751;1D751;1D751;03B8;03B8; # (𝝑; 𝝑; 𝝑; θ; θ; ) MATHEMATICAL BOLD ITALIC THETA SYMBOL +1D752;1D752;1D752;03BA;03BA; # (𝝒; 𝝒; 𝝒; κ; κ; ) MATHEMATICAL BOLD ITALIC KAPPA SYMBOL +1D753;1D753;1D753;03C6;03C6; # (𝝓; 𝝓; 𝝓; φ; φ; ) MATHEMATICAL BOLD ITALIC PHI SYMBOL +1D754;1D754;1D754;03C1;03C1; # (𝝔; 𝝔; 𝝔; ρ; ρ; ) MATHEMATICAL BOLD ITALIC RHO SYMBOL +1D755;1D755;1D755;03C0;03C0; # (𝝕; 𝝕; 𝝕; π; π; ) MATHEMATICAL BOLD ITALIC PI SYMBOL +1D756;1D756;1D756;0391;0391; # (𝝖; 𝝖; 𝝖; Α; Α; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA +1D757;1D757;1D757;0392;0392; # (𝝗; 𝝗; 𝝗; Β; Β; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA +1D758;1D758;1D758;0393;0393; # (𝝘; 𝝘; 𝝘; Γ; Γ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA +1D759;1D759;1D759;0394;0394; # (𝝙; 𝝙; 𝝙; Δ; Δ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA +1D75A;1D75A;1D75A;0395;0395; # (𝝚; 𝝚; 𝝚; Ε; Ε; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON +1D75B;1D75B;1D75B;0396;0396; # (𝝛; 𝝛; 𝝛; Ζ; Ζ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA +1D75C;1D75C;1D75C;0397;0397; # (𝝜; 𝝜; 𝝜; Η; Η; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA +1D75D;1D75D;1D75D;0398;0398; # (𝝝; 𝝝; 𝝝; Θ; Θ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA +1D75E;1D75E;1D75E;0399;0399; # (𝝞; 𝝞; 𝝞; Ι; Ι; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA +1D75F;1D75F;1D75F;039A;039A; # (𝝟; 𝝟; 𝝟; Κ; Κ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA +1D760;1D760;1D760;039B;039B; # (𝝠; 𝝠; 𝝠; Λ; Λ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA +1D761;1D761;1D761;039C;039C; # (𝝡; 𝝡; 𝝡; Μ; Μ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL MU +1D762;1D762;1D762;039D;039D; # (𝝢; 𝝢; 𝝢; Ν; Ν; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL NU +1D763;1D763;1D763;039E;039E; # (𝝣; 𝝣; 𝝣; Ξ; Ξ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL XI +1D764;1D764;1D764;039F;039F; # (𝝤; 𝝤; 𝝤; Ο; Ο; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON +1D765;1D765;1D765;03A0;03A0; # (𝝥; 𝝥; 𝝥; Π; Π; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PI +1D766;1D766;1D766;03A1;03A1; # (𝝦; 𝝦; 𝝦; Ρ; Ρ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO +1D767;1D767;1D767;0398;0398; # (𝝧; 𝝧; 𝝧; Θ; Θ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL +1D768;1D768;1D768;03A3;03A3; # (𝝨; 𝝨; 𝝨; Σ; Σ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA +1D769;1D769;1D769;03A4;03A4; # (𝝩; 𝝩; 𝝩; Τ; Τ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU +1D76A;1D76A;1D76A;03A5;03A5; # (𝝪; 𝝪; 𝝪; Υ; Υ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON +1D76B;1D76B;1D76B;03A6;03A6; # (𝝫; 𝝫; 𝝫; Φ; Φ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI +1D76C;1D76C;1D76C;03A7;03A7; # (𝝬; 𝝬; 𝝬; Χ; Χ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI +1D76D;1D76D;1D76D;03A8;03A8; # (𝝭; 𝝭; 𝝭; Ψ; Ψ; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI +1D76E;1D76E;1D76E;03A9;03A9; # (𝝮; 𝝮; 𝝮; Ω; Ω; ) MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F;1D76F;1D76F;2207;2207; # (𝝯; 𝝯; 𝝯; ∇; ∇; ) MATHEMATICAL SANS-SERIF BOLD NABLA +1D770;1D770;1D770;03B1;03B1; # (𝝰; 𝝰; 𝝰; α; α; ) MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA +1D771;1D771;1D771;03B2;03B2; # (𝝱; 𝝱; 𝝱; β; β; ) MATHEMATICAL SANS-SERIF BOLD SMALL BETA +1D772;1D772;1D772;03B3;03B3; # (𝝲; 𝝲; 𝝲; γ; γ; ) MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA +1D773;1D773;1D773;03B4;03B4; # (𝝳; 𝝳; 𝝳; δ; δ; ) MATHEMATICAL SANS-SERIF BOLD SMALL DELTA +1D774;1D774;1D774;03B5;03B5; # (𝝴; 𝝴; 𝝴; ε; ε; ) MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON +1D775;1D775;1D775;03B6;03B6; # (𝝵; 𝝵; 𝝵; ζ; ζ; ) MATHEMATICAL SANS-SERIF BOLD SMALL ZETA +1D776;1D776;1D776;03B7;03B7; # (𝝶; 𝝶; 𝝶; η; η; ) MATHEMATICAL SANS-SERIF BOLD SMALL ETA +1D777;1D777;1D777;03B8;03B8; # (𝝷; 𝝷; 𝝷; θ; θ; ) MATHEMATICAL SANS-SERIF BOLD SMALL THETA +1D778;1D778;1D778;03B9;03B9; # (𝝸; 𝝸; 𝝸; ι; ι; ) MATHEMATICAL SANS-SERIF BOLD SMALL IOTA +1D779;1D779;1D779;03BA;03BA; # (𝝹; 𝝹; 𝝹; κ; κ; ) MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA +1D77A;1D77A;1D77A;03BB;03BB; # (𝝺; 𝝺; 𝝺; λ; λ; ) MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA +1D77B;1D77B;1D77B;03BC;03BC; # (𝝻; 𝝻; 𝝻; μ; μ; ) MATHEMATICAL SANS-SERIF BOLD SMALL MU +1D77C;1D77C;1D77C;03BD;03BD; # (𝝼; 𝝼; 𝝼; ν; ν; ) MATHEMATICAL SANS-SERIF BOLD SMALL NU +1D77D;1D77D;1D77D;03BE;03BE; # (𝝽; 𝝽; 𝝽; ξ; ξ; ) MATHEMATICAL SANS-SERIF BOLD SMALL XI +1D77E;1D77E;1D77E;03BF;03BF; # (𝝾; 𝝾; 𝝾; ο; ο; ) MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON +1D77F;1D77F;1D77F;03C0;03C0; # (𝝿; 𝝿; 𝝿; π; π; ) MATHEMATICAL SANS-SERIF BOLD SMALL PI +1D780;1D780;1D780;03C1;03C1; # (𝞀; 𝞀; 𝞀; ρ; ρ; ) MATHEMATICAL SANS-SERIF BOLD SMALL RHO +1D781;1D781;1D781;03C2;03C2; # (𝞁; 𝞁; 𝞁; ς; ς; ) MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA +1D782;1D782;1D782;03C3;03C3; # (𝞂; 𝞂; 𝞂; σ; σ; ) MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA +1D783;1D783;1D783;03C4;03C4; # (𝞃; 𝞃; 𝞃; τ; τ; ) MATHEMATICAL SANS-SERIF BOLD SMALL TAU +1D784;1D784;1D784;03C5;03C5; # (𝞄; 𝞄; 𝞄; υ; υ; ) MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON +1D785;1D785;1D785;03C6;03C6; # (𝞅; 𝞅; 𝞅; φ; φ; ) MATHEMATICAL SANS-SERIF BOLD SMALL PHI +1D786;1D786;1D786;03C7;03C7; # (𝞆; 𝞆; 𝞆; χ; χ; ) MATHEMATICAL SANS-SERIF BOLD SMALL CHI +1D787;1D787;1D787;03C8;03C8; # (𝞇; 𝞇; 𝞇; ψ; ψ; ) MATHEMATICAL SANS-SERIF BOLD SMALL PSI +1D788;1D788;1D788;03C9;03C9; # (𝞈; 𝞈; 𝞈; ω; ω; ) MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789;1D789;1D789;2202;2202; # (𝞉; 𝞉; 𝞉; ∂; ∂; ) MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A;1D78A;1D78A;03B5;03B5; # (𝞊; 𝞊; 𝞊; ε; ε; ) MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL +1D78B;1D78B;1D78B;03B8;03B8; # (𝞋; 𝞋; 𝞋; θ; θ; ) MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL +1D78C;1D78C;1D78C;03BA;03BA; # (𝞌; 𝞌; 𝞌; κ; κ; ) MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL +1D78D;1D78D;1D78D;03C6;03C6; # (𝞍; 𝞍; 𝞍; φ; φ; ) MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL +1D78E;1D78E;1D78E;03C1;03C1; # (𝞎; 𝞎; 𝞎; ρ; ρ; ) MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL +1D78F;1D78F;1D78F;03C0;03C0; # (𝞏; 𝞏; 𝞏; π; π; ) MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D790;1D790;1D790;0391;0391; # (𝞐; 𝞐; 𝞐; Α; Α; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA +1D791;1D791;1D791;0392;0392; # (𝞑; 𝞑; 𝞑; Β; Β; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA +1D792;1D792;1D792;0393;0393; # (𝞒; 𝞒; 𝞒; Γ; Γ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA +1D793;1D793;1D793;0394;0394; # (𝞓; 𝞓; 𝞓; Δ; Δ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA +1D794;1D794;1D794;0395;0395; # (𝞔; 𝞔; 𝞔; Ε; Ε; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON +1D795;1D795;1D795;0396;0396; # (𝞕; 𝞕; 𝞕; Ζ; Ζ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA +1D796;1D796;1D796;0397;0397; # (𝞖; 𝞖; 𝞖; Η; Η; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA +1D797;1D797;1D797;0398;0398; # (𝞗; 𝞗; 𝞗; Θ; Θ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA +1D798;1D798;1D798;0399;0399; # (𝞘; 𝞘; 𝞘; Ι; Ι; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA +1D799;1D799;1D799;039A;039A; # (𝞙; 𝞙; 𝞙; Κ; Κ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA +1D79A;1D79A;1D79A;039B;039B; # (𝞚; 𝞚; 𝞚; Λ; Λ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA +1D79B;1D79B;1D79B;039C;039C; # (𝞛; 𝞛; 𝞛; Μ; Μ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU +1D79C;1D79C;1D79C;039D;039D; # (𝞜; 𝞜; 𝞜; Ν; Ν; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU +1D79D;1D79D;1D79D;039E;039E; # (𝞝; 𝞝; 𝞝; Ξ; Ξ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI +1D79E;1D79E;1D79E;039F;039F; # (𝞞; 𝞞; 𝞞; Ο; Ο; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON +1D79F;1D79F;1D79F;03A0;03A0; # (𝞟; 𝞟; 𝞟; Π; Π; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI +1D7A0;1D7A0;1D7A0;03A1;03A1; # (𝞠; 𝞠; 𝞠; Ρ; Ρ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO +1D7A1;1D7A1;1D7A1;0398;0398; # (𝞡; 𝞡; 𝞡; Θ; Θ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL +1D7A2;1D7A2;1D7A2;03A3;03A3; # (𝞢; 𝞢; 𝞢; Σ; Σ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA +1D7A3;1D7A3;1D7A3;03A4;03A4; # (𝞣; 𝞣; 𝞣; Τ; Τ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU +1D7A4;1D7A4;1D7A4;03A5;03A5; # (𝞤; 𝞤; 𝞤; Υ; Υ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON +1D7A5;1D7A5;1D7A5;03A6;03A6; # (𝞥; 𝞥; 𝞥; Φ; Φ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI +1D7A6;1D7A6;1D7A6;03A7;03A7; # (𝞦; 𝞦; 𝞦; Χ; Χ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI +1D7A7;1D7A7;1D7A7;03A8;03A8; # (𝞧; 𝞧; 𝞧; Ψ; Ψ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI +1D7A8;1D7A8;1D7A8;03A9;03A9; # (𝞨; 𝞨; 𝞨; Ω; Ω; ) MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9;1D7A9;1D7A9;2207;2207; # (𝞩; 𝞩; 𝞩; ∇; ∇; ) MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA;1D7AA;1D7AA;03B1;03B1; # (𝞪; 𝞪; 𝞪; α; α; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA +1D7AB;1D7AB;1D7AB;03B2;03B2; # (𝞫; 𝞫; 𝞫; β; β; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA +1D7AC;1D7AC;1D7AC;03B3;03B3; # (𝞬; 𝞬; 𝞬; γ; γ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA +1D7AD;1D7AD;1D7AD;03B4;03B4; # (𝞭; 𝞭; 𝞭; δ; δ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA +1D7AE;1D7AE;1D7AE;03B5;03B5; # (𝞮; 𝞮; 𝞮; ε; ε; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON +1D7AF;1D7AF;1D7AF;03B6;03B6; # (𝞯; 𝞯; 𝞯; ζ; ζ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA +1D7B0;1D7B0;1D7B0;03B7;03B7; # (𝞰; 𝞰; 𝞰; η; η; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA +1D7B1;1D7B1;1D7B1;03B8;03B8; # (𝞱; 𝞱; 𝞱; θ; θ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA +1D7B2;1D7B2;1D7B2;03B9;03B9; # (𝞲; 𝞲; 𝞲; ι; ι; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA +1D7B3;1D7B3;1D7B3;03BA;03BA; # (𝞳; 𝞳; 𝞳; κ; κ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA +1D7B4;1D7B4;1D7B4;03BB;03BB; # (𝞴; 𝞴; 𝞴; λ; λ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA +1D7B5;1D7B5;1D7B5;03BC;03BC; # (𝞵; 𝞵; 𝞵; μ; μ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU +1D7B6;1D7B6;1D7B6;03BD;03BD; # (𝞶; 𝞶; 𝞶; ν; ν; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU +1D7B7;1D7B7;1D7B7;03BE;03BE; # (𝞷; 𝞷; 𝞷; ξ; ξ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI +1D7B8;1D7B8;1D7B8;03BF;03BF; # (𝞸; 𝞸; 𝞸; ο; ο; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON +1D7B9;1D7B9;1D7B9;03C0;03C0; # (𝞹; 𝞹; 𝞹; π; π; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI +1D7BA;1D7BA;1D7BA;03C1;03C1; # (𝞺; 𝞺; 𝞺; ρ; ρ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO +1D7BB;1D7BB;1D7BB;03C2;03C2; # (𝞻; 𝞻; 𝞻; ς; ς; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA +1D7BC;1D7BC;1D7BC;03C3;03C3; # (𝞼; 𝞼; 𝞼; σ; σ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA +1D7BD;1D7BD;1D7BD;03C4;03C4; # (𝞽; 𝞽; 𝞽; τ; τ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU +1D7BE;1D7BE;1D7BE;03C5;03C5; # (𝞾; 𝞾; 𝞾; υ; υ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON +1D7BF;1D7BF;1D7BF;03C6;03C6; # (𝞿; 𝞿; 𝞿; φ; φ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI +1D7C0;1D7C0;1D7C0;03C7;03C7; # (𝟀; 𝟀; 𝟀; χ; χ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI +1D7C1;1D7C1;1D7C1;03C8;03C8; # (𝟁; 𝟁; 𝟁; ψ; ψ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI +1D7C2;1D7C2;1D7C2;03C9;03C9; # (𝟂; 𝟂; 𝟂; ω; ω; ) MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3;1D7C3;1D7C3;2202;2202; # (𝟃; 𝟃; 𝟃; ∂; ∂; ) MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4;1D7C4;1D7C4;03B5;03B5; # (𝟄; 𝟄; 𝟄; ε; ε; ) MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL +1D7C5;1D7C5;1D7C5;03B8;03B8; # (𝟅; 𝟅; 𝟅; θ; θ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL +1D7C6;1D7C6;1D7C6;03BA;03BA; # (𝟆; 𝟆; 𝟆; κ; κ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL +1D7C7;1D7C7;1D7C7;03C6;03C6; # (𝟇; 𝟇; 𝟇; φ; φ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL +1D7C8;1D7C8;1D7C8;03C1;03C1; # (𝟈; 𝟈; 𝟈; ρ; ρ; ) MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL +1D7C9;1D7C9;1D7C9;03C0;03C0; # (𝟉; 𝟉; 𝟉; π; π; ) MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CA;1D7CA;1D7CA;03DC;03DC; # (𝟊; 𝟊; 𝟊; Ϝ; Ϝ; ) MATHEMATICAL BOLD CAPITAL DIGAMMA +1D7CB;1D7CB;1D7CB;03DD;03DD; # (𝟋; 𝟋; 𝟋; ϝ; ϝ; ) MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE;1D7CE;1D7CE;0030;0030; # (𝟎; 𝟎; 𝟎; 0; 0; ) MATHEMATICAL BOLD DIGIT ZERO +1D7CF;1D7CF;1D7CF;0031;0031; # (𝟏; 𝟏; 𝟏; 1; 1; ) MATHEMATICAL BOLD DIGIT ONE +1D7D0;1D7D0;1D7D0;0032;0032; # (𝟐; 𝟐; 𝟐; 2; 2; ) MATHEMATICAL BOLD DIGIT TWO +1D7D1;1D7D1;1D7D1;0033;0033; # (𝟑; 𝟑; 𝟑; 3; 3; ) MATHEMATICAL BOLD DIGIT THREE +1D7D2;1D7D2;1D7D2;0034;0034; # (𝟒; 𝟒; 𝟒; 4; 4; ) MATHEMATICAL BOLD DIGIT FOUR +1D7D3;1D7D3;1D7D3;0035;0035; # (𝟓; 𝟓; 𝟓; 5; 5; ) MATHEMATICAL BOLD DIGIT FIVE +1D7D4;1D7D4;1D7D4;0036;0036; # (𝟔; 𝟔; 𝟔; 6; 6; ) MATHEMATICAL BOLD DIGIT SIX +1D7D5;1D7D5;1D7D5;0037;0037; # (𝟕; 𝟕; 𝟕; 7; 7; ) MATHEMATICAL BOLD DIGIT SEVEN +1D7D6;1D7D6;1D7D6;0038;0038; # (𝟖; 𝟖; 𝟖; 8; 8; ) MATHEMATICAL BOLD DIGIT EIGHT +1D7D7;1D7D7;1D7D7;0039;0039; # (𝟗; 𝟗; 𝟗; 9; 9; ) MATHEMATICAL BOLD DIGIT NINE +1D7D8;1D7D8;1D7D8;0030;0030; # (𝟘; 𝟘; 𝟘; 0; 0; ) MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7D9;1D7D9;1D7D9;0031;0031; # (𝟙; 𝟙; 𝟙; 1; 1; ) MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7DA;1D7DA;1D7DA;0032;0032; # (𝟚; 𝟚; 𝟚; 2; 2; ) MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7DB;1D7DB;1D7DB;0033;0033; # (𝟛; 𝟛; 𝟛; 3; 3; ) MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7DC;1D7DC;1D7DC;0034;0034; # (𝟜; 𝟜; 𝟜; 4; 4; ) MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7DD;1D7DD;1D7DD;0035;0035; # (𝟝; 𝟝; 𝟝; 5; 5; ) MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7DE;1D7DE;1D7DE;0036;0036; # (𝟞; 𝟞; 𝟞; 6; 6; ) MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7DF;1D7DF;1D7DF;0037;0037; # (𝟟; 𝟟; 𝟟; 7; 7; ) MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E0;1D7E0;1D7E0;0038;0038; # (𝟠; 𝟠; 𝟠; 8; 8; ) MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7E1;1D7E1;1D7E1;0039;0039; # (𝟡; 𝟡; 𝟡; 9; 9; ) MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7E2;1D7E2;1D7E2;0030;0030; # (𝟢; 𝟢; 𝟢; 0; 0; ) MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7E3;1D7E3;1D7E3;0031;0031; # (𝟣; 𝟣; 𝟣; 1; 1; ) MATHEMATICAL SANS-SERIF DIGIT ONE +1D7E4;1D7E4;1D7E4;0032;0032; # (𝟤; 𝟤; 𝟤; 2; 2; ) MATHEMATICAL SANS-SERIF DIGIT TWO +1D7E5;1D7E5;1D7E5;0033;0033; # (𝟥; 𝟥; 𝟥; 3; 3; ) MATHEMATICAL SANS-SERIF DIGIT THREE +1D7E6;1D7E6;1D7E6;0034;0034; # (𝟦; 𝟦; 𝟦; 4; 4; ) MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7E7;1D7E7;1D7E7;0035;0035; # (𝟧; 𝟧; 𝟧; 5; 5; ) MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7E8;1D7E8;1D7E8;0036;0036; # (𝟨; 𝟨; 𝟨; 6; 6; ) MATHEMATICAL SANS-SERIF DIGIT SIX +1D7E9;1D7E9;1D7E9;0037;0037; # (𝟩; 𝟩; 𝟩; 7; 7; ) MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7EA;1D7EA;1D7EA;0038;0038; # (𝟪; 𝟪; 𝟪; 8; 8; ) MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7EB;1D7EB;1D7EB;0039;0039; # (𝟫; 𝟫; 𝟫; 9; 9; ) MATHEMATICAL SANS-SERIF DIGIT NINE +1D7EC;1D7EC;1D7EC;0030;0030; # (𝟬; 𝟬; 𝟬; 0; 0; ) MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7ED;1D7ED;1D7ED;0031;0031; # (𝟭; 𝟭; 𝟭; 1; 1; ) MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7EE;1D7EE;1D7EE;0032;0032; # (𝟮; 𝟮; 𝟮; 2; 2; ) MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7EF;1D7EF;1D7EF;0033;0033; # (𝟯; 𝟯; 𝟯; 3; 3; ) MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F0;1D7F0;1D7F0;0034;0034; # (𝟰; 𝟰; 𝟰; 4; 4; ) MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7F1;1D7F1;1D7F1;0035;0035; # (𝟱; 𝟱; 𝟱; 5; 5; ) MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7F2;1D7F2;1D7F2;0036;0036; # (𝟲; 𝟲; 𝟲; 6; 6; ) MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7F3;1D7F3;1D7F3;0037;0037; # (𝟳; 𝟳; 𝟳; 7; 7; ) MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7F4;1D7F4;1D7F4;0038;0038; # (𝟴; 𝟴; 𝟴; 8; 8; ) MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7F5;1D7F5;1D7F5;0039;0039; # (𝟵; 𝟵; 𝟵; 9; 9; ) MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7F6;1D7F6;1D7F6;0030;0030; # (𝟶; 𝟶; 𝟶; 0; 0; ) MATHEMATICAL MONOSPACE DIGIT ZERO +1D7F7;1D7F7;1D7F7;0031;0031; # (𝟷; 𝟷; 𝟷; 1; 1; ) MATHEMATICAL MONOSPACE DIGIT ONE +1D7F8;1D7F8;1D7F8;0032;0032; # (𝟸; 𝟸; 𝟸; 2; 2; ) MATHEMATICAL MONOSPACE DIGIT TWO +1D7F9;1D7F9;1D7F9;0033;0033; # (𝟹; 𝟹; 𝟹; 3; 3; ) MATHEMATICAL MONOSPACE DIGIT THREE +1D7FA;1D7FA;1D7FA;0034;0034; # (𝟺; 𝟺; 𝟺; 4; 4; ) MATHEMATICAL MONOSPACE DIGIT FOUR +1D7FB;1D7FB;1D7FB;0035;0035; # (𝟻; 𝟻; 𝟻; 5; 5; ) MATHEMATICAL MONOSPACE DIGIT FIVE +1D7FC;1D7FC;1D7FC;0036;0036; # (𝟼; 𝟼; 𝟼; 6; 6; ) MATHEMATICAL MONOSPACE DIGIT SIX +1D7FD;1D7FD;1D7FD;0037;0037; # (𝟽; 𝟽; 𝟽; 7; 7; ) MATHEMATICAL MONOSPACE DIGIT SEVEN +1D7FE;1D7FE;1D7FE;0038;0038; # (𝟾; 𝟾; 𝟾; 8; 8; ) MATHEMATICAL MONOSPACE DIGIT EIGHT +1D7FF;1D7FF;1D7FF;0039;0039; # (𝟿; 𝟿; 𝟿; 9; 9; ) MATHEMATICAL MONOSPACE DIGIT NINE +1E030;1E030;1E030;0430;0430; # (𞀰; 𞀰; 𞀰; а; а; ) MODIFIER LETTER CYRILLIC SMALL A +1E031;1E031;1E031;0431;0431; # (𞀱; 𞀱; 𞀱; б; б; ) MODIFIER LETTER CYRILLIC SMALL BE +1E032;1E032;1E032;0432;0432; # (𞀲; 𞀲; 𞀲; в; в; ) MODIFIER LETTER CYRILLIC SMALL VE +1E033;1E033;1E033;0433;0433; # (𞀳; 𞀳; 𞀳; г; г; ) MODIFIER LETTER CYRILLIC SMALL GHE +1E034;1E034;1E034;0434;0434; # (𞀴; 𞀴; 𞀴; д; д; ) MODIFIER LETTER CYRILLIC SMALL DE +1E035;1E035;1E035;0435;0435; # (𞀵; 𞀵; 𞀵; е; е; ) MODIFIER LETTER CYRILLIC SMALL IE +1E036;1E036;1E036;0436;0436; # (𞀶; 𞀶; 𞀶; ж; ж; ) MODIFIER LETTER CYRILLIC SMALL ZHE +1E037;1E037;1E037;0437;0437; # (𞀷; 𞀷; 𞀷; з; з; ) MODIFIER LETTER CYRILLIC SMALL ZE +1E038;1E038;1E038;0438;0438; # (𞀸; 𞀸; 𞀸; и; и; ) MODIFIER LETTER CYRILLIC SMALL I +1E039;1E039;1E039;043A;043A; # (𞀹; 𞀹; 𞀹; к; к; ) MODIFIER LETTER CYRILLIC SMALL KA +1E03A;1E03A;1E03A;043B;043B; # (𞀺; 𞀺; 𞀺; л; л; ) MODIFIER LETTER CYRILLIC SMALL EL +1E03B;1E03B;1E03B;043C;043C; # (𞀻; 𞀻; 𞀻; м; м; ) MODIFIER LETTER CYRILLIC SMALL EM +1E03C;1E03C;1E03C;043E;043E; # (𞀼; 𞀼; 𞀼; о; о; ) MODIFIER LETTER CYRILLIC SMALL O +1E03D;1E03D;1E03D;043F;043F; # (𞀽; 𞀽; 𞀽; п; п; ) MODIFIER LETTER CYRILLIC SMALL PE +1E03E;1E03E;1E03E;0440;0440; # (𞀾; 𞀾; 𞀾; р; р; ) MODIFIER LETTER CYRILLIC SMALL ER +1E03F;1E03F;1E03F;0441;0441; # (𞀿; 𞀿; 𞀿; с; с; ) MODIFIER LETTER CYRILLIC SMALL ES +1E040;1E040;1E040;0442;0442; # (𞁀; 𞁀; 𞁀; т; т; ) MODIFIER LETTER CYRILLIC SMALL TE +1E041;1E041;1E041;0443;0443; # (𞁁; 𞁁; 𞁁; у; у; ) MODIFIER LETTER CYRILLIC SMALL U +1E042;1E042;1E042;0444;0444; # (𞁂; 𞁂; 𞁂; ф; ф; ) MODIFIER LETTER CYRILLIC SMALL EF +1E043;1E043;1E043;0445;0445; # (𞁃; 𞁃; 𞁃; х; х; ) MODIFIER LETTER CYRILLIC SMALL HA +1E044;1E044;1E044;0446;0446; # (𞁄; 𞁄; 𞁄; ц; ц; ) MODIFIER LETTER CYRILLIC SMALL TSE +1E045;1E045;1E045;0447;0447; # (𞁅; 𞁅; 𞁅; ч; ч; ) MODIFIER LETTER CYRILLIC SMALL CHE +1E046;1E046;1E046;0448;0448; # (𞁆; 𞁆; 𞁆; ш; ш; ) MODIFIER LETTER CYRILLIC SMALL SHA +1E047;1E047;1E047;044B;044B; # (𞁇; 𞁇; 𞁇; ы; ы; ) MODIFIER LETTER CYRILLIC SMALL YERU +1E048;1E048;1E048;044D;044D; # (𞁈; 𞁈; 𞁈; э; э; ) MODIFIER LETTER CYRILLIC SMALL E +1E049;1E049;1E049;044E;044E; # (𞁉; 𞁉; 𞁉; ю; ю; ) MODIFIER LETTER CYRILLIC SMALL YU +1E04A;1E04A;1E04A;A689;A689; # (𞁊; 𞁊; 𞁊; ꚉ; ꚉ; ) MODIFIER LETTER CYRILLIC SMALL DZZE +1E04B;1E04B;1E04B;04D9;04D9; # (𞁋; 𞁋; 𞁋; ә; ә; ) MODIFIER LETTER CYRILLIC SMALL SCHWA +1E04C;1E04C;1E04C;0456;0456; # (𞁌; 𞁌; 𞁌; і; і; ) MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I +1E04D;1E04D;1E04D;0458;0458; # (𞁍; 𞁍; 𞁍; ј; ј; ) MODIFIER LETTER CYRILLIC SMALL JE +1E04E;1E04E;1E04E;04E9;04E9; # (𞁎; 𞁎; 𞁎; ө; ө; ) MODIFIER LETTER CYRILLIC SMALL BARRED O +1E04F;1E04F;1E04F;04AF;04AF; # (𞁏; 𞁏; 𞁏; ү; ү; ) MODIFIER LETTER CYRILLIC SMALL STRAIGHT U +1E050;1E050;1E050;04CF;04CF; # (𞁐; 𞁐; 𞁐; ӏ; ӏ; ) MODIFIER LETTER CYRILLIC SMALL PALOCHKA +1E051;1E051;1E051;0430;0430; # (𞁑; 𞁑; 𞁑; а; а; ) CYRILLIC SUBSCRIPT SMALL LETTER A +1E052;1E052;1E052;0431;0431; # (𞁒; 𞁒; 𞁒; б; б; ) CYRILLIC SUBSCRIPT SMALL LETTER BE +1E053;1E053;1E053;0432;0432; # (𞁓; 𞁓; 𞁓; в; в; ) CYRILLIC SUBSCRIPT SMALL LETTER VE +1E054;1E054;1E054;0433;0433; # (𞁔; 𞁔; 𞁔; г; г; ) CYRILLIC SUBSCRIPT SMALL LETTER GHE +1E055;1E055;1E055;0434;0434; # (𞁕; 𞁕; 𞁕; д; д; ) CYRILLIC SUBSCRIPT SMALL LETTER DE +1E056;1E056;1E056;0435;0435; # (𞁖; 𞁖; 𞁖; е; е; ) CYRILLIC SUBSCRIPT SMALL LETTER IE +1E057;1E057;1E057;0436;0436; # (𞁗; 𞁗; 𞁗; ж; ж; ) CYRILLIC SUBSCRIPT SMALL LETTER ZHE +1E058;1E058;1E058;0437;0437; # (𞁘; 𞁘; 𞁘; з; з; ) CYRILLIC SUBSCRIPT SMALL LETTER ZE +1E059;1E059;1E059;0438;0438; # (𞁙; 𞁙; 𞁙; и; и; ) CYRILLIC SUBSCRIPT SMALL LETTER I +1E05A;1E05A;1E05A;043A;043A; # (𞁚; 𞁚; 𞁚; к; к; ) CYRILLIC SUBSCRIPT SMALL LETTER KA +1E05B;1E05B;1E05B;043B;043B; # (𞁛; 𞁛; 𞁛; л; л; ) CYRILLIC SUBSCRIPT SMALL LETTER EL +1E05C;1E05C;1E05C;043E;043E; # (𞁜; 𞁜; 𞁜; о; о; ) CYRILLIC SUBSCRIPT SMALL LETTER O +1E05D;1E05D;1E05D;043F;043F; # (𞁝; 𞁝; 𞁝; п; п; ) CYRILLIC SUBSCRIPT SMALL LETTER PE +1E05E;1E05E;1E05E;0441;0441; # (𞁞; 𞁞; 𞁞; с; с; ) CYRILLIC SUBSCRIPT SMALL LETTER ES +1E05F;1E05F;1E05F;0443;0443; # (𞁟; 𞁟; 𞁟; у; у; ) CYRILLIC SUBSCRIPT SMALL LETTER U +1E060;1E060;1E060;0444;0444; # (𞁠; 𞁠; 𞁠; ф; ф; ) CYRILLIC SUBSCRIPT SMALL LETTER EF +1E061;1E061;1E061;0445;0445; # (𞁡; 𞁡; 𞁡; х; х; ) CYRILLIC SUBSCRIPT SMALL LETTER HA +1E062;1E062;1E062;0446;0446; # (𞁢; 𞁢; 𞁢; ц; ц; ) CYRILLIC SUBSCRIPT SMALL LETTER TSE +1E063;1E063;1E063;0447;0447; # (𞁣; 𞁣; 𞁣; ч; ч; ) CYRILLIC SUBSCRIPT SMALL LETTER CHE +1E064;1E064;1E064;0448;0448; # (𞁤; 𞁤; 𞁤; ш; ш; ) CYRILLIC SUBSCRIPT SMALL LETTER SHA +1E065;1E065;1E065;044A;044A; # (𞁥; 𞁥; 𞁥; ъ; ъ; ) CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN +1E066;1E066;1E066;044B;044B; # (𞁦; 𞁦; 𞁦; ы; ы; ) CYRILLIC SUBSCRIPT SMALL LETTER YERU +1E067;1E067;1E067;0491;0491; # (𞁧; 𞁧; 𞁧; ґ; ґ; ) CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN +1E068;1E068;1E068;0456;0456; # (𞁨; 𞁨; 𞁨; і; і; ) CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I +1E069;1E069;1E069;0455;0455; # (𞁩; 𞁩; 𞁩; ѕ; ѕ; ) CYRILLIC SUBSCRIPT SMALL LETTER DZE +1E06A;1E06A;1E06A;045F;045F; # (𞁪; 𞁪; 𞁪; џ; џ; ) CYRILLIC SUBSCRIPT SMALL LETTER DZHE +1E06B;1E06B;1E06B;04AB;04AB; # (𞁫; 𞁫; 𞁫; ҫ; ҫ; ) MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER +1E06C;1E06C;1E06C;A651;A651; # (𞁬; 𞁬; 𞁬; ꙑ; ꙑ; ) MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER +1E06D;1E06D;1E06D;04B1;04B1; # (𞁭; 𞁭; 𞁭; ұ; ұ; ) MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1EE00;1EE00;1EE00;0627;0627; # (𞸀; 𞸀; 𞸀; ا; ا; ) ARABIC MATHEMATICAL ALEF +1EE01;1EE01;1EE01;0628;0628; # (𞸁; 𞸁; 𞸁; ب; ب; ) ARABIC MATHEMATICAL BEH +1EE02;1EE02;1EE02;062C;062C; # (𞸂; 𞸂; 𞸂; ج; ج; ) ARABIC MATHEMATICAL JEEM +1EE03;1EE03;1EE03;062F;062F; # (𞸃; 𞸃; 𞸃; د; د; ) ARABIC MATHEMATICAL DAL +1EE05;1EE05;1EE05;0648;0648; # (𞸅; 𞸅; 𞸅; و; و; ) ARABIC MATHEMATICAL WAW +1EE06;1EE06;1EE06;0632;0632; # (𞸆; 𞸆; 𞸆; ز; ز; ) ARABIC MATHEMATICAL ZAIN +1EE07;1EE07;1EE07;062D;062D; # (𞸇; 𞸇; 𞸇; ح; ح; ) ARABIC MATHEMATICAL HAH +1EE08;1EE08;1EE08;0637;0637; # (𞸈; 𞸈; 𞸈; ط; ط; ) ARABIC MATHEMATICAL TAH +1EE09;1EE09;1EE09;064A;064A; # (𞸉; 𞸉; 𞸉; ي; ي; ) ARABIC MATHEMATICAL YEH +1EE0A;1EE0A;1EE0A;0643;0643; # (𞸊; 𞸊; 𞸊; ك; ك; ) ARABIC MATHEMATICAL KAF +1EE0B;1EE0B;1EE0B;0644;0644; # (𞸋; 𞸋; 𞸋; ل; ل; ) ARABIC MATHEMATICAL LAM +1EE0C;1EE0C;1EE0C;0645;0645; # (𞸌; 𞸌; 𞸌; م; م; ) ARABIC MATHEMATICAL MEEM +1EE0D;1EE0D;1EE0D;0646;0646; # (𞸍; 𞸍; 𞸍; ن; ن; ) ARABIC MATHEMATICAL NOON +1EE0E;1EE0E;1EE0E;0633;0633; # (𞸎; 𞸎; 𞸎; س; س; ) ARABIC MATHEMATICAL SEEN +1EE0F;1EE0F;1EE0F;0639;0639; # (𞸏; 𞸏; 𞸏; ع; ع; ) ARABIC MATHEMATICAL AIN +1EE10;1EE10;1EE10;0641;0641; # (𞸐; 𞸐; 𞸐; ف; ف; ) ARABIC MATHEMATICAL FEH +1EE11;1EE11;1EE11;0635;0635; # (𞸑; 𞸑; 𞸑; ص; ص; ) ARABIC MATHEMATICAL SAD +1EE12;1EE12;1EE12;0642;0642; # (𞸒; 𞸒; 𞸒; ق; ق; ) ARABIC MATHEMATICAL QAF +1EE13;1EE13;1EE13;0631;0631; # (𞸓; 𞸓; 𞸓; ر; ر; ) ARABIC MATHEMATICAL REH +1EE14;1EE14;1EE14;0634;0634; # (𞸔; 𞸔; 𞸔; ش; ش; ) ARABIC MATHEMATICAL SHEEN +1EE15;1EE15;1EE15;062A;062A; # (𞸕; 𞸕; 𞸕; ت; ت; ) ARABIC MATHEMATICAL TEH +1EE16;1EE16;1EE16;062B;062B; # (𞸖; 𞸖; 𞸖; ث; ث; ) ARABIC MATHEMATICAL THEH +1EE17;1EE17;1EE17;062E;062E; # (𞸗; 𞸗; 𞸗; خ; خ; ) ARABIC MATHEMATICAL KHAH +1EE18;1EE18;1EE18;0630;0630; # (𞸘; 𞸘; 𞸘; ذ; ذ; ) ARABIC MATHEMATICAL THAL +1EE19;1EE19;1EE19;0636;0636; # (𞸙; 𞸙; 𞸙; ض; ض; ) ARABIC MATHEMATICAL DAD +1EE1A;1EE1A;1EE1A;0638;0638; # (𞸚; 𞸚; 𞸚; ظ; ظ; ) ARABIC MATHEMATICAL ZAH +1EE1B;1EE1B;1EE1B;063A;063A; # (𞸛; 𞸛; 𞸛; غ; غ; ) ARABIC MATHEMATICAL GHAIN +1EE1C;1EE1C;1EE1C;066E;066E; # (𞸜; 𞸜; 𞸜; ٮ; ٮ; ) ARABIC MATHEMATICAL DOTLESS BEH +1EE1D;1EE1D;1EE1D;06BA;06BA; # (𞸝; 𞸝; 𞸝; ں; ں; ) ARABIC MATHEMATICAL DOTLESS NOON +1EE1E;1EE1E;1EE1E;06A1;06A1; # (𞸞; 𞸞; 𞸞; ڡ; ڡ; ) ARABIC MATHEMATICAL DOTLESS FEH +1EE1F;1EE1F;1EE1F;066F;066F; # (𞸟; 𞸟; 𞸟; ٯ; ٯ; ) ARABIC MATHEMATICAL DOTLESS QAF +1EE21;1EE21;1EE21;0628;0628; # (𞸡; 𞸡; 𞸡; ب; ب; ) ARABIC MATHEMATICAL INITIAL BEH +1EE22;1EE22;1EE22;062C;062C; # (𞸢; 𞸢; 𞸢; ج; ج; ) ARABIC MATHEMATICAL INITIAL JEEM +1EE24;1EE24;1EE24;0647;0647; # (𞸤; 𞸤; 𞸤; ه; ه; ) ARABIC MATHEMATICAL INITIAL HEH +1EE27;1EE27;1EE27;062D;062D; # (𞸧; 𞸧; 𞸧; ح; ح; ) ARABIC MATHEMATICAL INITIAL HAH +1EE29;1EE29;1EE29;064A;064A; # (𞸩; 𞸩; 𞸩; ي; ي; ) ARABIC MATHEMATICAL INITIAL YEH +1EE2A;1EE2A;1EE2A;0643;0643; # (𞸪; 𞸪; 𞸪; ك; ك; ) ARABIC MATHEMATICAL INITIAL KAF +1EE2B;1EE2B;1EE2B;0644;0644; # (𞸫; 𞸫; 𞸫; ل; ل; ) ARABIC MATHEMATICAL INITIAL LAM +1EE2C;1EE2C;1EE2C;0645;0645; # (𞸬; 𞸬; 𞸬; م; م; ) ARABIC MATHEMATICAL INITIAL MEEM +1EE2D;1EE2D;1EE2D;0646;0646; # (𞸭; 𞸭; 𞸭; ن; ن; ) ARABIC MATHEMATICAL INITIAL NOON +1EE2E;1EE2E;1EE2E;0633;0633; # (𞸮; 𞸮; 𞸮; س; س; ) ARABIC MATHEMATICAL INITIAL SEEN +1EE2F;1EE2F;1EE2F;0639;0639; # (𞸯; 𞸯; 𞸯; ع; ع; ) ARABIC MATHEMATICAL INITIAL AIN +1EE30;1EE30;1EE30;0641;0641; # (𞸰; 𞸰; 𞸰; ف; ف; ) ARABIC MATHEMATICAL INITIAL FEH +1EE31;1EE31;1EE31;0635;0635; # (𞸱; 𞸱; 𞸱; ص; ص; ) ARABIC MATHEMATICAL INITIAL SAD +1EE32;1EE32;1EE32;0642;0642; # (𞸲; 𞸲; 𞸲; ق; ق; ) ARABIC MATHEMATICAL INITIAL QAF +1EE34;1EE34;1EE34;0634;0634; # (𞸴; 𞸴; 𞸴; ش; ش; ) ARABIC MATHEMATICAL INITIAL SHEEN +1EE35;1EE35;1EE35;062A;062A; # (𞸵; 𞸵; 𞸵; ت; ت; ) ARABIC MATHEMATICAL INITIAL TEH +1EE36;1EE36;1EE36;062B;062B; # (𞸶; 𞸶; 𞸶; ث; ث; ) ARABIC MATHEMATICAL INITIAL THEH +1EE37;1EE37;1EE37;062E;062E; # (𞸷; 𞸷; 𞸷; خ; خ; ) ARABIC MATHEMATICAL INITIAL KHAH +1EE39;1EE39;1EE39;0636;0636; # (𞸹; 𞸹; 𞸹; ض; ض; ) ARABIC MATHEMATICAL INITIAL DAD +1EE3B;1EE3B;1EE3B;063A;063A; # (𞸻; 𞸻; 𞸻; غ; غ; ) ARABIC MATHEMATICAL INITIAL GHAIN +1EE42;1EE42;1EE42;062C;062C; # (𞹂; 𞹂; 𞹂; ج; ج; ) ARABIC MATHEMATICAL TAILED JEEM +1EE47;1EE47;1EE47;062D;062D; # (𞹇; 𞹇; 𞹇; ح; ح; ) ARABIC MATHEMATICAL TAILED HAH +1EE49;1EE49;1EE49;064A;064A; # (𞹉; 𞹉; 𞹉; ي; ي; ) ARABIC MATHEMATICAL TAILED YEH +1EE4B;1EE4B;1EE4B;0644;0644; # (𞹋; 𞹋; 𞹋; ل; ل; ) ARABIC MATHEMATICAL TAILED LAM +1EE4D;1EE4D;1EE4D;0646;0646; # (𞹍; 𞹍; 𞹍; ن; ن; ) ARABIC MATHEMATICAL TAILED NOON +1EE4E;1EE4E;1EE4E;0633;0633; # (𞹎; 𞹎; 𞹎; س; س; ) ARABIC MATHEMATICAL TAILED SEEN +1EE4F;1EE4F;1EE4F;0639;0639; # (𞹏; 𞹏; 𞹏; ع; ع; ) ARABIC MATHEMATICAL TAILED AIN +1EE51;1EE51;1EE51;0635;0635; # (𞹑; 𞹑; 𞹑; ص; ص; ) ARABIC MATHEMATICAL TAILED SAD +1EE52;1EE52;1EE52;0642;0642; # (𞹒; 𞹒; 𞹒; ق; ق; ) ARABIC MATHEMATICAL TAILED QAF +1EE54;1EE54;1EE54;0634;0634; # (𞹔; 𞹔; 𞹔; ش; ش; ) ARABIC MATHEMATICAL TAILED SHEEN +1EE57;1EE57;1EE57;062E;062E; # (𞹗; 𞹗; 𞹗; خ; خ; ) ARABIC MATHEMATICAL TAILED KHAH +1EE59;1EE59;1EE59;0636;0636; # (𞹙; 𞹙; 𞹙; ض; ض; ) ARABIC MATHEMATICAL TAILED DAD +1EE5B;1EE5B;1EE5B;063A;063A; # (𞹛; 𞹛; 𞹛; غ; غ; ) ARABIC MATHEMATICAL TAILED GHAIN +1EE5D;1EE5D;1EE5D;06BA;06BA; # (𞹝; 𞹝; 𞹝; ں; ں; ) ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F;1EE5F;1EE5F;066F;066F; # (𞹟; 𞹟; 𞹟; ٯ; ٯ; ) ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61;1EE61;1EE61;0628;0628; # (𞹡; 𞹡; 𞹡; ب; ب; ) ARABIC MATHEMATICAL STRETCHED BEH +1EE62;1EE62;1EE62;062C;062C; # (𞹢; 𞹢; 𞹢; ج; ج; ) ARABIC MATHEMATICAL STRETCHED JEEM +1EE64;1EE64;1EE64;0647;0647; # (𞹤; 𞹤; 𞹤; ه; ه; ) ARABIC MATHEMATICAL STRETCHED HEH +1EE67;1EE67;1EE67;062D;062D; # (𞹧; 𞹧; 𞹧; ح; ح; ) ARABIC MATHEMATICAL STRETCHED HAH +1EE68;1EE68;1EE68;0637;0637; # (𞹨; 𞹨; 𞹨; ط; ط; ) ARABIC MATHEMATICAL STRETCHED TAH +1EE69;1EE69;1EE69;064A;064A; # (𞹩; 𞹩; 𞹩; ي; ي; ) ARABIC MATHEMATICAL STRETCHED YEH +1EE6A;1EE6A;1EE6A;0643;0643; # (𞹪; 𞹪; 𞹪; ك; ك; ) ARABIC MATHEMATICAL STRETCHED KAF +1EE6C;1EE6C;1EE6C;0645;0645; # (𞹬; 𞹬; 𞹬; م; م; ) ARABIC MATHEMATICAL STRETCHED MEEM +1EE6D;1EE6D;1EE6D;0646;0646; # (𞹭; 𞹭; 𞹭; ن; ن; ) ARABIC MATHEMATICAL STRETCHED NOON +1EE6E;1EE6E;1EE6E;0633;0633; # (𞹮; 𞹮; 𞹮; س; س; ) ARABIC MATHEMATICAL STRETCHED SEEN +1EE6F;1EE6F;1EE6F;0639;0639; # (𞹯; 𞹯; 𞹯; ع; ع; ) ARABIC MATHEMATICAL STRETCHED AIN +1EE70;1EE70;1EE70;0641;0641; # (𞹰; 𞹰; 𞹰; ف; ف; ) ARABIC MATHEMATICAL STRETCHED FEH +1EE71;1EE71;1EE71;0635;0635; # (𞹱; 𞹱; 𞹱; ص; ص; ) ARABIC MATHEMATICAL STRETCHED SAD +1EE72;1EE72;1EE72;0642;0642; # (𞹲; 𞹲; 𞹲; ق; ق; ) ARABIC MATHEMATICAL STRETCHED QAF +1EE74;1EE74;1EE74;0634;0634; # (𞹴; 𞹴; 𞹴; ش; ش; ) ARABIC MATHEMATICAL STRETCHED SHEEN +1EE75;1EE75;1EE75;062A;062A; # (𞹵; 𞹵; 𞹵; ت; ت; ) ARABIC MATHEMATICAL STRETCHED TEH +1EE76;1EE76;1EE76;062B;062B; # (𞹶; 𞹶; 𞹶; ث; ث; ) ARABIC MATHEMATICAL STRETCHED THEH +1EE77;1EE77;1EE77;062E;062E; # (𞹷; 𞹷; 𞹷; خ; خ; ) ARABIC MATHEMATICAL STRETCHED KHAH +1EE79;1EE79;1EE79;0636;0636; # (𞹹; 𞹹; 𞹹; ض; ض; ) ARABIC MATHEMATICAL STRETCHED DAD +1EE7A;1EE7A;1EE7A;0638;0638; # (𞹺; 𞹺; 𞹺; ظ; ظ; ) ARABIC MATHEMATICAL STRETCHED ZAH +1EE7B;1EE7B;1EE7B;063A;063A; # (𞹻; 𞹻; 𞹻; غ; غ; ) ARABIC MATHEMATICAL STRETCHED GHAIN +1EE7C;1EE7C;1EE7C;066E;066E; # (𞹼; 𞹼; 𞹼; ٮ; ٮ; ) ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E;1EE7E;1EE7E;06A1;06A1; # (𞹾; 𞹾; 𞹾; ڡ; ڡ; ) ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80;1EE80;1EE80;0627;0627; # (𞺀; 𞺀; 𞺀; ا; ا; ) ARABIC MATHEMATICAL LOOPED ALEF +1EE81;1EE81;1EE81;0628;0628; # (𞺁; 𞺁; 𞺁; ب; ب; ) ARABIC MATHEMATICAL LOOPED BEH +1EE82;1EE82;1EE82;062C;062C; # (𞺂; 𞺂; 𞺂; ج; ج; ) ARABIC MATHEMATICAL LOOPED JEEM +1EE83;1EE83;1EE83;062F;062F; # (𞺃; 𞺃; 𞺃; د; د; ) ARABIC MATHEMATICAL LOOPED DAL +1EE84;1EE84;1EE84;0647;0647; # (𞺄; 𞺄; 𞺄; ه; ه; ) ARABIC MATHEMATICAL LOOPED HEH +1EE85;1EE85;1EE85;0648;0648; # (𞺅; 𞺅; 𞺅; و; و; ) ARABIC MATHEMATICAL LOOPED WAW +1EE86;1EE86;1EE86;0632;0632; # (𞺆; 𞺆; 𞺆; ز; ز; ) ARABIC MATHEMATICAL LOOPED ZAIN +1EE87;1EE87;1EE87;062D;062D; # (𞺇; 𞺇; 𞺇; ح; ح; ) ARABIC MATHEMATICAL LOOPED HAH +1EE88;1EE88;1EE88;0637;0637; # (𞺈; 𞺈; 𞺈; ط; ط; ) ARABIC MATHEMATICAL LOOPED TAH +1EE89;1EE89;1EE89;064A;064A; # (𞺉; 𞺉; 𞺉; ي; ي; ) ARABIC MATHEMATICAL LOOPED YEH +1EE8B;1EE8B;1EE8B;0644;0644; # (𞺋; 𞺋; 𞺋; ل; ل; ) ARABIC MATHEMATICAL LOOPED LAM +1EE8C;1EE8C;1EE8C;0645;0645; # (𞺌; 𞺌; 𞺌; م; م; ) ARABIC MATHEMATICAL LOOPED MEEM +1EE8D;1EE8D;1EE8D;0646;0646; # (𞺍; 𞺍; 𞺍; ن; ن; ) ARABIC MATHEMATICAL LOOPED NOON +1EE8E;1EE8E;1EE8E;0633;0633; # (𞺎; 𞺎; 𞺎; س; س; ) ARABIC MATHEMATICAL LOOPED SEEN +1EE8F;1EE8F;1EE8F;0639;0639; # (𞺏; 𞺏; 𞺏; ع; ع; ) ARABIC MATHEMATICAL LOOPED AIN +1EE90;1EE90;1EE90;0641;0641; # (𞺐; 𞺐; 𞺐; ف; ف; ) ARABIC MATHEMATICAL LOOPED FEH +1EE91;1EE91;1EE91;0635;0635; # (𞺑; 𞺑; 𞺑; ص; ص; ) ARABIC MATHEMATICAL LOOPED SAD +1EE92;1EE92;1EE92;0642;0642; # (𞺒; 𞺒; 𞺒; ق; ق; ) ARABIC MATHEMATICAL LOOPED QAF +1EE93;1EE93;1EE93;0631;0631; # (𞺓; 𞺓; 𞺓; ر; ر; ) ARABIC MATHEMATICAL LOOPED REH +1EE94;1EE94;1EE94;0634;0634; # (𞺔; 𞺔; 𞺔; ش; ش; ) ARABIC MATHEMATICAL LOOPED SHEEN +1EE95;1EE95;1EE95;062A;062A; # (𞺕; 𞺕; 𞺕; ت; ت; ) ARABIC MATHEMATICAL LOOPED TEH +1EE96;1EE96;1EE96;062B;062B; # (𞺖; 𞺖; 𞺖; ث; ث; ) ARABIC MATHEMATICAL LOOPED THEH +1EE97;1EE97;1EE97;062E;062E; # (𞺗; 𞺗; 𞺗; خ; خ; ) ARABIC MATHEMATICAL LOOPED KHAH +1EE98;1EE98;1EE98;0630;0630; # (𞺘; 𞺘; 𞺘; ذ; ذ; ) ARABIC MATHEMATICAL LOOPED THAL +1EE99;1EE99;1EE99;0636;0636; # (𞺙; 𞺙; 𞺙; ض; ض; ) ARABIC MATHEMATICAL LOOPED DAD +1EE9A;1EE9A;1EE9A;0638;0638; # (𞺚; 𞺚; 𞺚; ظ; ظ; ) ARABIC MATHEMATICAL LOOPED ZAH +1EE9B;1EE9B;1EE9B;063A;063A; # (𞺛; 𞺛; 𞺛; غ; غ; ) ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1;1EEA1;1EEA1;0628;0628; # (𞺡; 𞺡; 𞺡; ب; ب; ) ARABIC MATHEMATICAL DOUBLE-STRUCK BEH +1EEA2;1EEA2;1EEA2;062C;062C; # (𞺢; 𞺢; 𞺢; ج; ج; ) ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM +1EEA3;1EEA3;1EEA3;062F;062F; # (𞺣; 𞺣; 𞺣; د; د; ) ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5;1EEA5;1EEA5;0648;0648; # (𞺥; 𞺥; 𞺥; و; و; ) ARABIC MATHEMATICAL DOUBLE-STRUCK WAW +1EEA6;1EEA6;1EEA6;0632;0632; # (𞺦; 𞺦; 𞺦; ز; ز; ) ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN +1EEA7;1EEA7;1EEA7;062D;062D; # (𞺧; 𞺧; 𞺧; ح; ح; ) ARABIC MATHEMATICAL DOUBLE-STRUCK HAH +1EEA8;1EEA8;1EEA8;0637;0637; # (𞺨; 𞺨; 𞺨; ط; ط; ) ARABIC MATHEMATICAL DOUBLE-STRUCK TAH +1EEA9;1EEA9;1EEA9;064A;064A; # (𞺩; 𞺩; 𞺩; ي; ي; ) ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB;1EEAB;1EEAB;0644;0644; # (𞺫; 𞺫; 𞺫; ل; ل; ) ARABIC MATHEMATICAL DOUBLE-STRUCK LAM +1EEAC;1EEAC;1EEAC;0645;0645; # (𞺬; 𞺬; 𞺬; م; م; ) ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM +1EEAD;1EEAD;1EEAD;0646;0646; # (𞺭; 𞺭; 𞺭; ن; ن; ) ARABIC MATHEMATICAL DOUBLE-STRUCK NOON +1EEAE;1EEAE;1EEAE;0633;0633; # (𞺮; 𞺮; 𞺮; س; س; ) ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN +1EEAF;1EEAF;1EEAF;0639;0639; # (𞺯; 𞺯; 𞺯; ع; ع; ) ARABIC MATHEMATICAL DOUBLE-STRUCK AIN +1EEB0;1EEB0;1EEB0;0641;0641; # (𞺰; 𞺰; 𞺰; ف; ف; ) ARABIC MATHEMATICAL DOUBLE-STRUCK FEH +1EEB1;1EEB1;1EEB1;0635;0635; # (𞺱; 𞺱; 𞺱; ص; ص; ) ARABIC MATHEMATICAL DOUBLE-STRUCK SAD +1EEB2;1EEB2;1EEB2;0642;0642; # (𞺲; 𞺲; 𞺲; ق; ق; ) ARABIC MATHEMATICAL DOUBLE-STRUCK QAF +1EEB3;1EEB3;1EEB3;0631;0631; # (𞺳; 𞺳; 𞺳; ر; ر; ) ARABIC MATHEMATICAL DOUBLE-STRUCK REH +1EEB4;1EEB4;1EEB4;0634;0634; # (𞺴; 𞺴; 𞺴; ش; ش; ) ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN +1EEB5;1EEB5;1EEB5;062A;062A; # (𞺵; 𞺵; 𞺵; ت; ت; ) ARABIC MATHEMATICAL DOUBLE-STRUCK TEH +1EEB6;1EEB6;1EEB6;062B;062B; # (𞺶; 𞺶; 𞺶; ث; ث; ) ARABIC MATHEMATICAL DOUBLE-STRUCK THEH +1EEB7;1EEB7;1EEB7;062E;062E; # (𞺷; 𞺷; 𞺷; خ; خ; ) ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH +1EEB8;1EEB8;1EEB8;0630;0630; # (𞺸; 𞺸; 𞺸; ذ; ذ; ) ARABIC MATHEMATICAL DOUBLE-STRUCK THAL +1EEB9;1EEB9;1EEB9;0636;0636; # (𞺹; 𞺹; 𞺹; ض; ض; ) ARABIC MATHEMATICAL DOUBLE-STRUCK DAD +1EEBA;1EEBA;1EEBA;0638;0638; # (𞺺; 𞺺; 𞺺; ظ; ظ; ) ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH +1EEBB;1EEBB;1EEBB;063A;063A; # (𞺻; 𞺻; 𞺻; غ; غ; ) ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1F100;1F100;1F100;0030 002E;0030 002E; # (🄀; 🄀; 🄀; 0.; 0.; ) DIGIT ZERO FULL STOP +1F101;1F101;1F101;0030 002C;0030 002C; # (🄁; 🄁; 🄁; 0,; 0,; ) DIGIT ZERO COMMA +1F102;1F102;1F102;0031 002C;0031 002C; # (🄂; 🄂; 🄂; 1,; 1,; ) DIGIT ONE COMMA +1F103;1F103;1F103;0032 002C;0032 002C; # (🄃; 🄃; 🄃; 2,; 2,; ) DIGIT TWO COMMA +1F104;1F104;1F104;0033 002C;0033 002C; # (🄄; 🄄; 🄄; 3,; 3,; ) DIGIT THREE COMMA +1F105;1F105;1F105;0034 002C;0034 002C; # (🄅; 🄅; 🄅; 4,; 4,; ) DIGIT FOUR COMMA +1F106;1F106;1F106;0035 002C;0035 002C; # (🄆; 🄆; 🄆; 5,; 5,; ) DIGIT FIVE COMMA +1F107;1F107;1F107;0036 002C;0036 002C; # (🄇; 🄇; 🄇; 6,; 6,; ) DIGIT SIX COMMA +1F108;1F108;1F108;0037 002C;0037 002C; # (🄈; 🄈; 🄈; 7,; 7,; ) DIGIT SEVEN COMMA +1F109;1F109;1F109;0038 002C;0038 002C; # (🄉; 🄉; 🄉; 8,; 8,; ) DIGIT EIGHT COMMA +1F10A;1F10A;1F10A;0039 002C;0039 002C; # (🄊; 🄊; 🄊; 9,; 9,; ) DIGIT NINE COMMA +1F110;1F110;1F110;0028 0041 0029;0028 0041 0029; # (🄐; 🄐; 🄐; (A); (A); ) PARENTHESIZED LATIN CAPITAL LETTER A +1F111;1F111;1F111;0028 0042 0029;0028 0042 0029; # (🄑; 🄑; 🄑; (B); (B); ) PARENTHESIZED LATIN CAPITAL LETTER B +1F112;1F112;1F112;0028 0043 0029;0028 0043 0029; # (🄒; 🄒; 🄒; (C); (C); ) PARENTHESIZED LATIN CAPITAL LETTER C +1F113;1F113;1F113;0028 0044 0029;0028 0044 0029; # (🄓; 🄓; 🄓; (D); (D); ) PARENTHESIZED LATIN CAPITAL LETTER D +1F114;1F114;1F114;0028 0045 0029;0028 0045 0029; # (🄔; 🄔; 🄔; (E); (E); ) PARENTHESIZED LATIN CAPITAL LETTER E +1F115;1F115;1F115;0028 0046 0029;0028 0046 0029; # (🄕; 🄕; 🄕; (F); (F); ) PARENTHESIZED LATIN CAPITAL LETTER F +1F116;1F116;1F116;0028 0047 0029;0028 0047 0029; # (🄖; 🄖; 🄖; (G); (G); ) PARENTHESIZED LATIN CAPITAL LETTER G +1F117;1F117;1F117;0028 0048 0029;0028 0048 0029; # (🄗; 🄗; 🄗; (H); (H); ) PARENTHESIZED LATIN CAPITAL LETTER H +1F118;1F118;1F118;0028 0049 0029;0028 0049 0029; # (🄘; 🄘; 🄘; (I); (I); ) PARENTHESIZED LATIN CAPITAL LETTER I +1F119;1F119;1F119;0028 004A 0029;0028 004A 0029; # (🄙; 🄙; 🄙; (J); (J); ) PARENTHESIZED LATIN CAPITAL LETTER J +1F11A;1F11A;1F11A;0028 004B 0029;0028 004B 0029; # (🄚; 🄚; 🄚; (K); (K); ) PARENTHESIZED LATIN CAPITAL LETTER K +1F11B;1F11B;1F11B;0028 004C 0029;0028 004C 0029; # (🄛; 🄛; 🄛; (L); (L); ) PARENTHESIZED LATIN CAPITAL LETTER L +1F11C;1F11C;1F11C;0028 004D 0029;0028 004D 0029; # (🄜; 🄜; 🄜; (M); (M); ) PARENTHESIZED LATIN CAPITAL LETTER M +1F11D;1F11D;1F11D;0028 004E 0029;0028 004E 0029; # (🄝; 🄝; 🄝; (N); (N); ) PARENTHESIZED LATIN CAPITAL LETTER N +1F11E;1F11E;1F11E;0028 004F 0029;0028 004F 0029; # (🄞; 🄞; 🄞; (O); (O); ) PARENTHESIZED LATIN CAPITAL LETTER O +1F11F;1F11F;1F11F;0028 0050 0029;0028 0050 0029; # (🄟; 🄟; 🄟; (P); (P); ) PARENTHESIZED LATIN CAPITAL LETTER P +1F120;1F120;1F120;0028 0051 0029;0028 0051 0029; # (🄠; 🄠; 🄠; (Q); (Q); ) PARENTHESIZED LATIN CAPITAL LETTER Q +1F121;1F121;1F121;0028 0052 0029;0028 0052 0029; # (🄡; 🄡; 🄡; (R); (R); ) PARENTHESIZED LATIN CAPITAL LETTER R +1F122;1F122;1F122;0028 0053 0029;0028 0053 0029; # (🄢; 🄢; 🄢; (S); (S); ) PARENTHESIZED LATIN CAPITAL LETTER S +1F123;1F123;1F123;0028 0054 0029;0028 0054 0029; # (🄣; 🄣; 🄣; (T); (T); ) PARENTHESIZED LATIN CAPITAL LETTER T +1F124;1F124;1F124;0028 0055 0029;0028 0055 0029; # (🄤; 🄤; 🄤; (U); (U); ) PARENTHESIZED LATIN CAPITAL LETTER U +1F125;1F125;1F125;0028 0056 0029;0028 0056 0029; # (🄥; 🄥; 🄥; (V); (V); ) PARENTHESIZED LATIN CAPITAL LETTER V +1F126;1F126;1F126;0028 0057 0029;0028 0057 0029; # (🄦; 🄦; 🄦; (W); (W); ) PARENTHESIZED LATIN CAPITAL LETTER W +1F127;1F127;1F127;0028 0058 0029;0028 0058 0029; # (🄧; 🄧; 🄧; (X); (X); ) PARENTHESIZED LATIN CAPITAL LETTER X +1F128;1F128;1F128;0028 0059 0029;0028 0059 0029; # (🄨; 🄨; 🄨; (Y); (Y); ) PARENTHESIZED LATIN CAPITAL LETTER Y +1F129;1F129;1F129;0028 005A 0029;0028 005A 0029; # (🄩; 🄩; 🄩; (Z); (Z); ) PARENTHESIZED LATIN CAPITAL LETTER Z +1F12A;1F12A;1F12A;3014 0053 3015;3014 0053 3015; # (🄪; 🄪; 🄪; 〔S〕; 〔S〕; ) TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S +1F12B;1F12B;1F12B;0043;0043; # (🄫; 🄫; 🄫; C; C; ) CIRCLED ITALIC LATIN CAPITAL LETTER C +1F12C;1F12C;1F12C;0052;0052; # (🄬; 🄬; 🄬; R; R; ) CIRCLED ITALIC LATIN CAPITAL LETTER R +1F12D;1F12D;1F12D;0043 0044;0043 0044; # (🄭; 🄭; 🄭; CD; CD; ) CIRCLED CD +1F12E;1F12E;1F12E;0057 005A;0057 005A; # (🄮; 🄮; 🄮; WZ; WZ; ) CIRCLED WZ +1F130;1F130;1F130;0041;0041; # (🄰; 🄰; 🄰; A; A; ) SQUARED LATIN CAPITAL LETTER A +1F131;1F131;1F131;0042;0042; # (🄱; 🄱; 🄱; B; B; ) SQUARED LATIN CAPITAL LETTER B +1F132;1F132;1F132;0043;0043; # (🄲; 🄲; 🄲; C; C; ) SQUARED LATIN CAPITAL LETTER C +1F133;1F133;1F133;0044;0044; # (🄳; 🄳; 🄳; D; D; ) SQUARED LATIN CAPITAL LETTER D +1F134;1F134;1F134;0045;0045; # (🄴; 🄴; 🄴; E; E; ) SQUARED LATIN CAPITAL LETTER E +1F135;1F135;1F135;0046;0046; # (🄵; 🄵; 🄵; F; F; ) SQUARED LATIN CAPITAL LETTER F +1F136;1F136;1F136;0047;0047; # (🄶; 🄶; 🄶; G; G; ) SQUARED LATIN CAPITAL LETTER G +1F137;1F137;1F137;0048;0048; # (🄷; 🄷; 🄷; H; H; ) SQUARED LATIN CAPITAL LETTER H +1F138;1F138;1F138;0049;0049; # (🄸; 🄸; 🄸; I; I; ) SQUARED LATIN CAPITAL LETTER I +1F139;1F139;1F139;004A;004A; # (🄹; 🄹; 🄹; J; J; ) SQUARED LATIN CAPITAL LETTER J +1F13A;1F13A;1F13A;004B;004B; # (🄺; 🄺; 🄺; K; K; ) SQUARED LATIN CAPITAL LETTER K +1F13B;1F13B;1F13B;004C;004C; # (🄻; 🄻; 🄻; L; L; ) SQUARED LATIN CAPITAL LETTER L +1F13C;1F13C;1F13C;004D;004D; # (🄼; 🄼; 🄼; M; M; ) SQUARED LATIN CAPITAL LETTER M +1F13D;1F13D;1F13D;004E;004E; # (🄽; 🄽; 🄽; N; N; ) SQUARED LATIN CAPITAL LETTER N +1F13E;1F13E;1F13E;004F;004F; # (🄾; 🄾; 🄾; O; O; ) SQUARED LATIN CAPITAL LETTER O +1F13F;1F13F;1F13F;0050;0050; # (🄿; 🄿; 🄿; P; P; ) SQUARED LATIN CAPITAL LETTER P +1F140;1F140;1F140;0051;0051; # (🅀; 🅀; 🅀; Q; Q; ) SQUARED LATIN CAPITAL LETTER Q +1F141;1F141;1F141;0052;0052; # (🅁; 🅁; 🅁; R; R; ) SQUARED LATIN CAPITAL LETTER R +1F142;1F142;1F142;0053;0053; # (🅂; 🅂; 🅂; S; S; ) SQUARED LATIN CAPITAL LETTER S +1F143;1F143;1F143;0054;0054; # (🅃; 🅃; 🅃; T; T; ) SQUARED LATIN CAPITAL LETTER T +1F144;1F144;1F144;0055;0055; # (🅄; 🅄; 🅄; U; U; ) SQUARED LATIN CAPITAL LETTER U +1F145;1F145;1F145;0056;0056; # (🅅; 🅅; 🅅; V; V; ) SQUARED LATIN CAPITAL LETTER V +1F146;1F146;1F146;0057;0057; # (🅆; 🅆; 🅆; W; W; ) SQUARED LATIN CAPITAL LETTER W +1F147;1F147;1F147;0058;0058; # (🅇; 🅇; 🅇; X; X; ) SQUARED LATIN CAPITAL LETTER X +1F148;1F148;1F148;0059;0059; # (🅈; 🅈; 🅈; Y; Y; ) SQUARED LATIN CAPITAL LETTER Y +1F149;1F149;1F149;005A;005A; # (🅉; 🅉; 🅉; Z; Z; ) SQUARED LATIN CAPITAL LETTER Z +1F14A;1F14A;1F14A;0048 0056;0048 0056; # (🅊; 🅊; 🅊; HV; HV; ) SQUARED HV +1F14B;1F14B;1F14B;004D 0056;004D 0056; # (🅋; 🅋; 🅋; MV; MV; ) SQUARED MV +1F14C;1F14C;1F14C;0053 0044;0053 0044; # (🅌; 🅌; 🅌; SD; SD; ) SQUARED SD +1F14D;1F14D;1F14D;0053 0053;0053 0053; # (🅍; 🅍; 🅍; SS; SS; ) SQUARED SS +1F14E;1F14E;1F14E;0050 0050 0056;0050 0050 0056; # (🅎; 🅎; 🅎; PPV; PPV; ) SQUARED PPV +1F14F;1F14F;1F14F;0057 0043;0057 0043; # (🅏; 🅏; 🅏; WC; WC; ) SQUARED WC +1F16A;1F16A;1F16A;004D 0043;004D 0043; # (🅪; 🅪; 🅪; MC; MC; ) RAISED MC SIGN +1F16B;1F16B;1F16B;004D 0044;004D 0044; # (🅫; 🅫; 🅫; MD; MD; ) RAISED MD SIGN +1F16C;1F16C;1F16C;004D 0052;004D 0052; # (🅬; 🅬; 🅬; MR; MR; ) RAISED MR SIGN +1F190;1F190;1F190;0044 004A;0044 004A; # (🆐; 🆐; 🆐; DJ; DJ; ) SQUARE DJ +1F200;1F200;1F200;307B 304B;307B 304B; # (🈀; 🈀; 🈀; ほか; ほか; ) SQUARE HIRAGANA HOKA +1F201;1F201;1F201;30B3 30B3;30B3 30B3; # (🈁; 🈁; 🈁; ココ; ココ; ) SQUARED KATAKANA KOKO +1F202;1F202;1F202;30B5;30B5; # (🈂; 🈂; 🈂; サ; サ; ) SQUARED KATAKANA SA +1F210;1F210;1F210;624B;624B; # (🈐; 🈐; 🈐; 手; 手; ) SQUARED CJK UNIFIED IDEOGRAPH-624B +1F211;1F211;1F211;5B57;5B57; # (🈑; 🈑; 🈑; 字; 字; ) SQUARED CJK UNIFIED IDEOGRAPH-5B57 +1F212;1F212;1F212;53CC;53CC; # (🈒; 🈒; 🈒; 双; 双; ) SQUARED CJK UNIFIED IDEOGRAPH-53CC +1F213;1F213;1F213;30C7;30C6 3099; # (🈓; 🈓; 🈓; デ; テ◌゙; ) SQUARED KATAKANA DE +1F214;1F214;1F214;4E8C;4E8C; # (🈔; 🈔; 🈔; 二; 二; ) SQUARED CJK UNIFIED IDEOGRAPH-4E8C +1F215;1F215;1F215;591A;591A; # (🈕; 🈕; 🈕; 多; 多; ) SQUARED CJK UNIFIED IDEOGRAPH-591A +1F216;1F216;1F216;89E3;89E3; # (🈖; 🈖; 🈖; 解; 解; ) SQUARED CJK UNIFIED IDEOGRAPH-89E3 +1F217;1F217;1F217;5929;5929; # (🈗; 🈗; 🈗; 天; 天; ) SQUARED CJK UNIFIED IDEOGRAPH-5929 +1F218;1F218;1F218;4EA4;4EA4; # (🈘; 🈘; 🈘; 交; 交; ) SQUARED CJK UNIFIED IDEOGRAPH-4EA4 +1F219;1F219;1F219;6620;6620; # (🈙; 🈙; 🈙; 映; 映; ) SQUARED CJK UNIFIED IDEOGRAPH-6620 +1F21A;1F21A;1F21A;7121;7121; # (🈚; 🈚; 🈚; 無; 無; ) SQUARED CJK UNIFIED IDEOGRAPH-7121 +1F21B;1F21B;1F21B;6599;6599; # (🈛; 🈛; 🈛; 料; 料; ) SQUARED CJK UNIFIED IDEOGRAPH-6599 +1F21C;1F21C;1F21C;524D;524D; # (🈜; 🈜; 🈜; 前; 前; ) SQUARED CJK UNIFIED IDEOGRAPH-524D +1F21D;1F21D;1F21D;5F8C;5F8C; # (🈝; 🈝; 🈝; 後; 後; ) SQUARED CJK UNIFIED IDEOGRAPH-5F8C +1F21E;1F21E;1F21E;518D;518D; # (🈞; 🈞; 🈞; 再; 再; ) SQUARED CJK UNIFIED IDEOGRAPH-518D +1F21F;1F21F;1F21F;65B0;65B0; # (🈟; 🈟; 🈟; 新; 新; ) SQUARED CJK UNIFIED IDEOGRAPH-65B0 +1F220;1F220;1F220;521D;521D; # (🈠; 🈠; 🈠; 初; 初; ) SQUARED CJK UNIFIED IDEOGRAPH-521D +1F221;1F221;1F221;7D42;7D42; # (🈡; 🈡; 🈡; 終; 終; ) SQUARED CJK UNIFIED IDEOGRAPH-7D42 +1F222;1F222;1F222;751F;751F; # (🈢; 🈢; 🈢; 生; 生; ) SQUARED CJK UNIFIED IDEOGRAPH-751F +1F223;1F223;1F223;8CA9;8CA9; # (🈣; 🈣; 🈣; 販; 販; ) SQUARED CJK UNIFIED IDEOGRAPH-8CA9 +1F224;1F224;1F224;58F0;58F0; # (🈤; 🈤; 🈤; 声; 声; ) SQUARED CJK UNIFIED IDEOGRAPH-58F0 +1F225;1F225;1F225;5439;5439; # (🈥; 🈥; 🈥; 吹; 吹; ) SQUARED CJK UNIFIED IDEOGRAPH-5439 +1F226;1F226;1F226;6F14;6F14; # (🈦; 🈦; 🈦; 演; 演; ) SQUARED CJK UNIFIED IDEOGRAPH-6F14 +1F227;1F227;1F227;6295;6295; # (🈧; 🈧; 🈧; 投; 投; ) SQUARED CJK UNIFIED IDEOGRAPH-6295 +1F228;1F228;1F228;6355;6355; # (🈨; 🈨; 🈨; 捕; 捕; ) SQUARED CJK UNIFIED IDEOGRAPH-6355 +1F229;1F229;1F229;4E00;4E00; # (🈩; 🈩; 🈩; 一; 一; ) SQUARED CJK UNIFIED IDEOGRAPH-4E00 +1F22A;1F22A;1F22A;4E09;4E09; # (🈪; 🈪; 🈪; 三; 三; ) SQUARED CJK UNIFIED IDEOGRAPH-4E09 +1F22B;1F22B;1F22B;904A;904A; # (🈫; 🈫; 🈫; 遊; 遊; ) SQUARED CJK UNIFIED IDEOGRAPH-904A +1F22C;1F22C;1F22C;5DE6;5DE6; # (🈬; 🈬; 🈬; 左; 左; ) SQUARED CJK UNIFIED IDEOGRAPH-5DE6 +1F22D;1F22D;1F22D;4E2D;4E2D; # (🈭; 🈭; 🈭; 中; 中; ) SQUARED CJK UNIFIED IDEOGRAPH-4E2D +1F22E;1F22E;1F22E;53F3;53F3; # (🈮; 🈮; 🈮; 右; 右; ) SQUARED CJK UNIFIED IDEOGRAPH-53F3 +1F22F;1F22F;1F22F;6307;6307; # (🈯; 🈯; 🈯; 指; 指; ) SQUARED CJK UNIFIED IDEOGRAPH-6307 +1F230;1F230;1F230;8D70;8D70; # (🈰; 🈰; 🈰; 走; 走; ) SQUARED CJK UNIFIED IDEOGRAPH-8D70 +1F231;1F231;1F231;6253;6253; # (🈱; 🈱; 🈱; 打; 打; ) SQUARED CJK UNIFIED IDEOGRAPH-6253 +1F232;1F232;1F232;7981;7981; # (🈲; 🈲; 🈲; 禁; 禁; ) SQUARED CJK UNIFIED IDEOGRAPH-7981 +1F233;1F233;1F233;7A7A;7A7A; # (🈳; 🈳; 🈳; 空; 空; ) SQUARED CJK UNIFIED IDEOGRAPH-7A7A +1F234;1F234;1F234;5408;5408; # (🈴; 🈴; 🈴; 合; 合; ) SQUARED CJK UNIFIED IDEOGRAPH-5408 +1F235;1F235;1F235;6E80;6E80; # (🈵; 🈵; 🈵; 満; 満; ) SQUARED CJK UNIFIED IDEOGRAPH-6E80 +1F236;1F236;1F236;6709;6709; # (🈶; 🈶; 🈶; 有; 有; ) SQUARED CJK UNIFIED IDEOGRAPH-6709 +1F237;1F237;1F237;6708;6708; # (🈷; 🈷; 🈷; 月; 月; ) SQUARED CJK UNIFIED IDEOGRAPH-6708 +1F238;1F238;1F238;7533;7533; # (🈸; 🈸; 🈸; 申; 申; ) SQUARED CJK UNIFIED IDEOGRAPH-7533 +1F239;1F239;1F239;5272;5272; # (🈹; 🈹; 🈹; 割; 割; ) SQUARED CJK UNIFIED IDEOGRAPH-5272 +1F23A;1F23A;1F23A;55B6;55B6; # (🈺; 🈺; 🈺; 営; 営; ) SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F23B;1F23B;1F23B;914D;914D; # (🈻; 🈻; 🈻; 配; 配; ) SQUARED CJK UNIFIED IDEOGRAPH-914D +1F240;1F240;1F240;3014 672C 3015;3014 672C 3015; # (🉀; 🉀; 🉀; 〔本〕; 〔本〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C +1F241;1F241;1F241;3014 4E09 3015;3014 4E09 3015; # (🉁; 🉁; 🉁; 〔三〕; 〔三〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 +1F242;1F242;1F242;3014 4E8C 3015;3014 4E8C 3015; # (🉂; 🉂; 🉂; 〔二〕; 〔二〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C +1F243;1F243;1F243;3014 5B89 3015;3014 5B89 3015; # (🉃; 🉃; 🉃; 〔安〕; 〔安〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 +1F244;1F244;1F244;3014 70B9 3015;3014 70B9 3015; # (🉄; 🉄; 🉄; 〔点〕; 〔点〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 +1F245;1F245;1F245;3014 6253 3015;3014 6253 3015; # (🉅; 🉅; 🉅; 〔打〕; 〔打〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 +1F246;1F246;1F246;3014 76D7 3015;3014 76D7 3015; # (🉆; 🉆; 🉆; 〔盗〕; 〔盗〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 +1F247;1F247;1F247;3014 52DD 3015;3014 52DD 3015; # (🉇; 🉇; 🉇; 〔勝〕; 〔勝〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD +1F248;1F248;1F248;3014 6557 3015;3014 6557 3015; # (🉈; 🉈; 🉈; 〔敗〕; 〔敗〕; ) TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F250;1F250;1F250;5F97;5F97; # (🉐; 🉐; 🉐; 得; 得; ) CIRCLED IDEOGRAPH ADVANTAGE +1F251;1F251;1F251;53EF;53EF; # (🉑; 🉑; 🉑; 可; 可; ) CIRCLED IDEOGRAPH ACCEPT +1FBF0;1FBF0;1FBF0;0030;0030; # (🯰; 🯰; 🯰; 0; 0; ) SEGMENTED DIGIT ZERO +1FBF1;1FBF1;1FBF1;0031;0031; # (🯱; 🯱; 🯱; 1; 1; ) SEGMENTED DIGIT ONE +1FBF2;1FBF2;1FBF2;0032;0032; # (🯲; 🯲; 🯲; 2; 2; ) SEGMENTED DIGIT TWO +1FBF3;1FBF3;1FBF3;0033;0033; # (🯳; 🯳; 🯳; 3; 3; ) SEGMENTED DIGIT THREE +1FBF4;1FBF4;1FBF4;0034;0034; # (🯴; 🯴; 🯴; 4; 4; ) SEGMENTED DIGIT FOUR +1FBF5;1FBF5;1FBF5;0035;0035; # (🯵; 🯵; 🯵; 5; 5; ) SEGMENTED DIGIT FIVE +1FBF6;1FBF6;1FBF6;0036;0036; # (🯶; 🯶; 🯶; 6; 6; ) SEGMENTED DIGIT SIX +1FBF7;1FBF7;1FBF7;0037;0037; # (🯷; 🯷; 🯷; 7; 7; ) SEGMENTED DIGIT SEVEN +1FBF8;1FBF8;1FBF8;0038;0038; # (🯸; 🯸; 🯸; 8; 8; ) SEGMENTED DIGIT EIGHT +1FBF9;1FBF9;1FBF9;0039;0039; # (🯹; 🯹; 🯹; 9; 9; ) SEGMENTED DIGIT NINE +2F800;4E3D;4E3D;4E3D;4E3D; # (丽; 丽; 丽; 丽; 丽; ) CJK COMPATIBILITY IDEOGRAPH-2F800 +2F801;4E38;4E38;4E38;4E38; # (丸; 丸; 丸; 丸; 丸; ) CJK COMPATIBILITY IDEOGRAPH-2F801 +2F802;4E41;4E41;4E41;4E41; # (乁; 乁; 乁; 乁; 乁; ) CJK COMPATIBILITY IDEOGRAPH-2F802 +2F803;20122;20122;20122;20122; # (𠄢; 𠄢; 𠄢; 𠄢; 𠄢; ) CJK COMPATIBILITY IDEOGRAPH-2F803 +2F804;4F60;4F60;4F60;4F60; # (你; 你; 你; 你; 你; ) CJK COMPATIBILITY IDEOGRAPH-2F804 +2F805;4FAE;4FAE;4FAE;4FAE; # (侮; 侮; 侮; 侮; 侮; ) CJK COMPATIBILITY IDEOGRAPH-2F805 +2F806;4FBB;4FBB;4FBB;4FBB; # (侻; 侻; 侻; 侻; 侻; ) CJK COMPATIBILITY IDEOGRAPH-2F806 +2F807;5002;5002;5002;5002; # (倂; 倂; 倂; 倂; 倂; ) CJK COMPATIBILITY IDEOGRAPH-2F807 +2F808;507A;507A;507A;507A; # (偺; 偺; 偺; 偺; 偺; ) CJK COMPATIBILITY IDEOGRAPH-2F808 +2F809;5099;5099;5099;5099; # (備; 備; 備; 備; 備; ) CJK COMPATIBILITY IDEOGRAPH-2F809 +2F80A;50E7;50E7;50E7;50E7; # (僧; 僧; 僧; 僧; 僧; ) CJK COMPATIBILITY IDEOGRAPH-2F80A +2F80B;50CF;50CF;50CF;50CF; # (像; 像; 像; 像; 像; ) CJK COMPATIBILITY IDEOGRAPH-2F80B +2F80C;349E;349E;349E;349E; # (㒞; 㒞; 㒞; 㒞; 㒞; ) CJK COMPATIBILITY IDEOGRAPH-2F80C +2F80D;2063A;2063A;2063A;2063A; # (𠘺; 𠘺; 𠘺; 𠘺; 𠘺; ) CJK COMPATIBILITY IDEOGRAPH-2F80D +2F80E;514D;514D;514D;514D; # (免; 免; 免; 免; 免; ) CJK COMPATIBILITY IDEOGRAPH-2F80E +2F80F;5154;5154;5154;5154; # (兔; 兔; 兔; 兔; 兔; ) CJK COMPATIBILITY IDEOGRAPH-2F80F +2F810;5164;5164;5164;5164; # (兤; 兤; 兤; 兤; 兤; ) CJK COMPATIBILITY IDEOGRAPH-2F810 +2F811;5177;5177;5177;5177; # (具; 具; 具; 具; 具; ) CJK COMPATIBILITY IDEOGRAPH-2F811 +2F812;2051C;2051C;2051C;2051C; # (𠔜; 𠔜; 𠔜; 𠔜; 𠔜; ) CJK COMPATIBILITY IDEOGRAPH-2F812 +2F813;34B9;34B9;34B9;34B9; # (㒹; 㒹; 㒹; 㒹; 㒹; ) CJK COMPATIBILITY IDEOGRAPH-2F813 +2F814;5167;5167;5167;5167; # (內; 內; 內; 內; 內; ) CJK COMPATIBILITY IDEOGRAPH-2F814 +2F815;518D;518D;518D;518D; # (再; 再; 再; 再; 再; ) CJK COMPATIBILITY IDEOGRAPH-2F815 +2F816;2054B;2054B;2054B;2054B; # (𠕋; 𠕋; 𠕋; 𠕋; 𠕋; ) CJK COMPATIBILITY IDEOGRAPH-2F816 +2F817;5197;5197;5197;5197; # (冗; 冗; 冗; 冗; 冗; ) CJK COMPATIBILITY IDEOGRAPH-2F817 +2F818;51A4;51A4;51A4;51A4; # (冤; 冤; 冤; 冤; 冤; ) CJK COMPATIBILITY IDEOGRAPH-2F818 +2F819;4ECC;4ECC;4ECC;4ECC; # (仌; 仌; 仌; 仌; 仌; ) CJK COMPATIBILITY IDEOGRAPH-2F819 +2F81A;51AC;51AC;51AC;51AC; # (冬; 冬; 冬; 冬; 冬; ) CJK COMPATIBILITY IDEOGRAPH-2F81A +2F81B;51B5;51B5;51B5;51B5; # (况; 况; 况; 况; 况; ) CJK COMPATIBILITY IDEOGRAPH-2F81B +2F81C;291DF;291DF;291DF;291DF; # (𩇟; 𩇟; 𩇟; 𩇟; 𩇟; ) CJK COMPATIBILITY IDEOGRAPH-2F81C +2F81D;51F5;51F5;51F5;51F5; # (凵; 凵; 凵; 凵; 凵; ) CJK COMPATIBILITY IDEOGRAPH-2F81D +2F81E;5203;5203;5203;5203; # (刃; 刃; 刃; 刃; 刃; ) CJK COMPATIBILITY IDEOGRAPH-2F81E +2F81F;34DF;34DF;34DF;34DF; # (㓟; 㓟; 㓟; 㓟; 㓟; ) CJK COMPATIBILITY IDEOGRAPH-2F81F +2F820;523B;523B;523B;523B; # (刻; 刻; 刻; 刻; 刻; ) CJK COMPATIBILITY IDEOGRAPH-2F820 +2F821;5246;5246;5246;5246; # (剆; 剆; 剆; 剆; 剆; ) CJK COMPATIBILITY IDEOGRAPH-2F821 +2F822;5272;5272;5272;5272; # (割; 割; 割; 割; 割; ) CJK COMPATIBILITY IDEOGRAPH-2F822 +2F823;5277;5277;5277;5277; # (剷; 剷; 剷; 剷; 剷; ) CJK COMPATIBILITY IDEOGRAPH-2F823 +2F824;3515;3515;3515;3515; # (㔕; 㔕; 㔕; 㔕; 㔕; ) CJK COMPATIBILITY IDEOGRAPH-2F824 +2F825;52C7;52C7;52C7;52C7; # (勇; 勇; 勇; 勇; 勇; ) CJK COMPATIBILITY IDEOGRAPH-2F825 +2F826;52C9;52C9;52C9;52C9; # (勉; 勉; 勉; 勉; 勉; ) CJK COMPATIBILITY IDEOGRAPH-2F826 +2F827;52E4;52E4;52E4;52E4; # (勤; 勤; 勤; 勤; 勤; ) CJK COMPATIBILITY IDEOGRAPH-2F827 +2F828;52FA;52FA;52FA;52FA; # (勺; 勺; 勺; 勺; 勺; ) CJK COMPATIBILITY IDEOGRAPH-2F828 +2F829;5305;5305;5305;5305; # (包; 包; 包; 包; 包; ) CJK COMPATIBILITY IDEOGRAPH-2F829 +2F82A;5306;5306;5306;5306; # (匆; 匆; 匆; 匆; 匆; ) CJK COMPATIBILITY IDEOGRAPH-2F82A +2F82B;5317;5317;5317;5317; # (北; 北; 北; 北; 北; ) CJK COMPATIBILITY IDEOGRAPH-2F82B +2F82C;5349;5349;5349;5349; # (卉; 卉; 卉; 卉; 卉; ) CJK COMPATIBILITY IDEOGRAPH-2F82C +2F82D;5351;5351;5351;5351; # (卑; 卑; 卑; 卑; 卑; ) CJK COMPATIBILITY IDEOGRAPH-2F82D +2F82E;535A;535A;535A;535A; # (博; 博; 博; 博; 博; ) CJK COMPATIBILITY IDEOGRAPH-2F82E +2F82F;5373;5373;5373;5373; # (即; 即; 即; 即; 即; ) CJK COMPATIBILITY IDEOGRAPH-2F82F +2F830;537D;537D;537D;537D; # (卽; 卽; 卽; 卽; 卽; ) CJK COMPATIBILITY IDEOGRAPH-2F830 +2F831;537F;537F;537F;537F; # (卿; 卿; 卿; 卿; 卿; ) CJK COMPATIBILITY IDEOGRAPH-2F831 +2F832;537F;537F;537F;537F; # (卿; 卿; 卿; 卿; 卿; ) CJK COMPATIBILITY IDEOGRAPH-2F832 +2F833;537F;537F;537F;537F; # (卿; 卿; 卿; 卿; 卿; ) CJK COMPATIBILITY IDEOGRAPH-2F833 +2F834;20A2C;20A2C;20A2C;20A2C; # (𠨬; 𠨬; 𠨬; 𠨬; 𠨬; ) CJK COMPATIBILITY IDEOGRAPH-2F834 +2F835;7070;7070;7070;7070; # (灰; 灰; 灰; 灰; 灰; ) CJK COMPATIBILITY IDEOGRAPH-2F835 +2F836;53CA;53CA;53CA;53CA; # (及; 及; 及; 及; 及; ) CJK COMPATIBILITY IDEOGRAPH-2F836 +2F837;53DF;53DF;53DF;53DF; # (叟; 叟; 叟; 叟; 叟; ) CJK COMPATIBILITY IDEOGRAPH-2F837 +2F838;20B63;20B63;20B63;20B63; # (𠭣; 𠭣; 𠭣; 𠭣; 𠭣; ) CJK COMPATIBILITY IDEOGRAPH-2F838 +2F839;53EB;53EB;53EB;53EB; # (叫; 叫; 叫; 叫; 叫; ) CJK COMPATIBILITY IDEOGRAPH-2F839 +2F83A;53F1;53F1;53F1;53F1; # (叱; 叱; 叱; 叱; 叱; ) CJK COMPATIBILITY IDEOGRAPH-2F83A +2F83B;5406;5406;5406;5406; # (吆; 吆; 吆; 吆; 吆; ) CJK COMPATIBILITY IDEOGRAPH-2F83B +2F83C;549E;549E;549E;549E; # (咞; 咞; 咞; 咞; 咞; ) CJK COMPATIBILITY IDEOGRAPH-2F83C +2F83D;5438;5438;5438;5438; # (吸; 吸; 吸; 吸; 吸; ) CJK COMPATIBILITY IDEOGRAPH-2F83D +2F83E;5448;5448;5448;5448; # (呈; 呈; 呈; 呈; 呈; ) CJK COMPATIBILITY IDEOGRAPH-2F83E +2F83F;5468;5468;5468;5468; # (周; 周; 周; 周; 周; ) CJK COMPATIBILITY IDEOGRAPH-2F83F +2F840;54A2;54A2;54A2;54A2; # (咢; 咢; 咢; 咢; 咢; ) CJK COMPATIBILITY IDEOGRAPH-2F840 +2F841;54F6;54F6;54F6;54F6; # (哶; 哶; 哶; 哶; 哶; ) CJK COMPATIBILITY IDEOGRAPH-2F841 +2F842;5510;5510;5510;5510; # (唐; 唐; 唐; 唐; 唐; ) CJK COMPATIBILITY IDEOGRAPH-2F842 +2F843;5553;5553;5553;5553; # (啓; 啓; 啓; 啓; 啓; ) CJK COMPATIBILITY IDEOGRAPH-2F843 +2F844;5563;5563;5563;5563; # (啣; 啣; 啣; 啣; 啣; ) CJK COMPATIBILITY IDEOGRAPH-2F844 +2F845;5584;5584;5584;5584; # (善; 善; 善; 善; 善; ) CJK COMPATIBILITY IDEOGRAPH-2F845 +2F846;5584;5584;5584;5584; # (善; 善; 善; 善; 善; ) CJK COMPATIBILITY IDEOGRAPH-2F846 +2F847;5599;5599;5599;5599; # (喙; 喙; 喙; 喙; 喙; ) CJK COMPATIBILITY IDEOGRAPH-2F847 +2F848;55AB;55AB;55AB;55AB; # (喫; 喫; 喫; 喫; 喫; ) CJK COMPATIBILITY IDEOGRAPH-2F848 +2F849;55B3;55B3;55B3;55B3; # (喳; 喳; 喳; 喳; 喳; ) CJK COMPATIBILITY IDEOGRAPH-2F849 +2F84A;55C2;55C2;55C2;55C2; # (嗂; 嗂; 嗂; 嗂; 嗂; ) CJK COMPATIBILITY IDEOGRAPH-2F84A +2F84B;5716;5716;5716;5716; # (圖; 圖; 圖; 圖; 圖; ) CJK COMPATIBILITY IDEOGRAPH-2F84B +2F84C;5606;5606;5606;5606; # (嘆; 嘆; 嘆; 嘆; 嘆; ) CJK COMPATIBILITY IDEOGRAPH-2F84C +2F84D;5717;5717;5717;5717; # (圗; 圗; 圗; 圗; 圗; ) CJK COMPATIBILITY IDEOGRAPH-2F84D +2F84E;5651;5651;5651;5651; # (噑; 噑; 噑; 噑; 噑; ) CJK COMPATIBILITY IDEOGRAPH-2F84E +2F84F;5674;5674;5674;5674; # (噴; 噴; 噴; 噴; 噴; ) CJK COMPATIBILITY IDEOGRAPH-2F84F +2F850;5207;5207;5207;5207; # (切; 切; 切; 切; 切; ) CJK COMPATIBILITY IDEOGRAPH-2F850 +2F851;58EE;58EE;58EE;58EE; # (壮; 壮; 壮; 壮; 壮; ) CJK COMPATIBILITY IDEOGRAPH-2F851 +2F852;57CE;57CE;57CE;57CE; # (城; 城; 城; 城; 城; ) CJK COMPATIBILITY IDEOGRAPH-2F852 +2F853;57F4;57F4;57F4;57F4; # (埴; 埴; 埴; 埴; 埴; ) CJK COMPATIBILITY IDEOGRAPH-2F853 +2F854;580D;580D;580D;580D; # (堍; 堍; 堍; 堍; 堍; ) CJK COMPATIBILITY IDEOGRAPH-2F854 +2F855;578B;578B;578B;578B; # (型; 型; 型; 型; 型; ) CJK COMPATIBILITY IDEOGRAPH-2F855 +2F856;5832;5832;5832;5832; # (堲; 堲; 堲; 堲; 堲; ) CJK COMPATIBILITY IDEOGRAPH-2F856 +2F857;5831;5831;5831;5831; # (報; 報; 報; 報; 報; ) CJK COMPATIBILITY IDEOGRAPH-2F857 +2F858;58AC;58AC;58AC;58AC; # (墬; 墬; 墬; 墬; 墬; ) CJK COMPATIBILITY IDEOGRAPH-2F858 +2F859;214E4;214E4;214E4;214E4; # (𡓤; 𡓤; 𡓤; 𡓤; 𡓤; ) CJK COMPATIBILITY IDEOGRAPH-2F859 +2F85A;58F2;58F2;58F2;58F2; # (売; 売; 売; 売; 売; ) CJK COMPATIBILITY IDEOGRAPH-2F85A +2F85B;58F7;58F7;58F7;58F7; # (壷; 壷; 壷; 壷; 壷; ) CJK COMPATIBILITY IDEOGRAPH-2F85B +2F85C;5906;5906;5906;5906; # (夆; 夆; 夆; 夆; 夆; ) CJK COMPATIBILITY IDEOGRAPH-2F85C +2F85D;591A;591A;591A;591A; # (多; 多; 多; 多; 多; ) CJK COMPATIBILITY IDEOGRAPH-2F85D +2F85E;5922;5922;5922;5922; # (夢; 夢; 夢; 夢; 夢; ) CJK COMPATIBILITY IDEOGRAPH-2F85E +2F85F;5962;5962;5962;5962; # (奢; 奢; 奢; 奢; 奢; ) CJK COMPATIBILITY IDEOGRAPH-2F85F +2F860;216A8;216A8;216A8;216A8; # (𡚨; 𡚨; 𡚨; 𡚨; 𡚨; ) CJK COMPATIBILITY IDEOGRAPH-2F860 +2F861;216EA;216EA;216EA;216EA; # (𡛪; 𡛪; 𡛪; 𡛪; 𡛪; ) CJK COMPATIBILITY IDEOGRAPH-2F861 +2F862;59EC;59EC;59EC;59EC; # (姬; 姬; 姬; 姬; 姬; ) CJK COMPATIBILITY IDEOGRAPH-2F862 +2F863;5A1B;5A1B;5A1B;5A1B; # (娛; 娛; 娛; 娛; 娛; ) CJK COMPATIBILITY IDEOGRAPH-2F863 +2F864;5A27;5A27;5A27;5A27; # (娧; 娧; 娧; 娧; 娧; ) CJK COMPATIBILITY IDEOGRAPH-2F864 +2F865;59D8;59D8;59D8;59D8; # (姘; 姘; 姘; 姘; 姘; ) CJK COMPATIBILITY IDEOGRAPH-2F865 +2F866;5A66;5A66;5A66;5A66; # (婦; 婦; 婦; 婦; 婦; ) CJK COMPATIBILITY IDEOGRAPH-2F866 +2F867;36EE;36EE;36EE;36EE; # (㛮; 㛮; 㛮; 㛮; 㛮; ) CJK COMPATIBILITY IDEOGRAPH-2F867 +2F868;36FC;36FC;36FC;36FC; # (㛼; 㛼; 㛼; 㛼; 㛼; ) CJK COMPATIBILITY IDEOGRAPH-2F868 +2F869;5B08;5B08;5B08;5B08; # (嬈; 嬈; 嬈; 嬈; 嬈; ) CJK COMPATIBILITY IDEOGRAPH-2F869 +2F86A;5B3E;5B3E;5B3E;5B3E; # (嬾; 嬾; 嬾; 嬾; 嬾; ) CJK COMPATIBILITY IDEOGRAPH-2F86A +2F86B;5B3E;5B3E;5B3E;5B3E; # (嬾; 嬾; 嬾; 嬾; 嬾; ) CJK COMPATIBILITY IDEOGRAPH-2F86B +2F86C;219C8;219C8;219C8;219C8; # (𡧈; 𡧈; 𡧈; 𡧈; 𡧈; ) CJK COMPATIBILITY IDEOGRAPH-2F86C +2F86D;5BC3;5BC3;5BC3;5BC3; # (寃; 寃; 寃; 寃; 寃; ) CJK COMPATIBILITY IDEOGRAPH-2F86D +2F86E;5BD8;5BD8;5BD8;5BD8; # (寘; 寘; 寘; 寘; 寘; ) CJK COMPATIBILITY IDEOGRAPH-2F86E +2F86F;5BE7;5BE7;5BE7;5BE7; # (寧; 寧; 寧; 寧; 寧; ) CJK COMPATIBILITY IDEOGRAPH-2F86F +2F870;5BF3;5BF3;5BF3;5BF3; # (寳; 寳; 寳; 寳; 寳; ) CJK COMPATIBILITY IDEOGRAPH-2F870 +2F871;21B18;21B18;21B18;21B18; # (𡬘; 𡬘; 𡬘; 𡬘; 𡬘; ) CJK COMPATIBILITY IDEOGRAPH-2F871 +2F872;5BFF;5BFF;5BFF;5BFF; # (寿; 寿; 寿; 寿; 寿; ) CJK COMPATIBILITY IDEOGRAPH-2F872 +2F873;5C06;5C06;5C06;5C06; # (将; 将; 将; 将; 将; ) CJK COMPATIBILITY IDEOGRAPH-2F873 +2F874;5F53;5F53;5F53;5F53; # (当; 当; 当; 当; 当; ) CJK COMPATIBILITY IDEOGRAPH-2F874 +2F875;5C22;5C22;5C22;5C22; # (尢; 尢; 尢; 尢; 尢; ) CJK COMPATIBILITY IDEOGRAPH-2F875 +2F876;3781;3781;3781;3781; # (㞁; 㞁; 㞁; 㞁; 㞁; ) CJK COMPATIBILITY IDEOGRAPH-2F876 +2F877;5C60;5C60;5C60;5C60; # (屠; 屠; 屠; 屠; 屠; ) CJK COMPATIBILITY IDEOGRAPH-2F877 +2F878;5C6E;5C6E;5C6E;5C6E; # (屮; 屮; 屮; 屮; 屮; ) CJK COMPATIBILITY IDEOGRAPH-2F878 +2F879;5CC0;5CC0;5CC0;5CC0; # (峀; 峀; 峀; 峀; 峀; ) CJK COMPATIBILITY IDEOGRAPH-2F879 +2F87A;5C8D;5C8D;5C8D;5C8D; # (岍; 岍; 岍; 岍; 岍; ) CJK COMPATIBILITY IDEOGRAPH-2F87A +2F87B;21DE4;21DE4;21DE4;21DE4; # (𡷤; 𡷤; 𡷤; 𡷤; 𡷤; ) CJK COMPATIBILITY IDEOGRAPH-2F87B +2F87C;5D43;5D43;5D43;5D43; # (嵃; 嵃; 嵃; 嵃; 嵃; ) CJK COMPATIBILITY IDEOGRAPH-2F87C +2F87D;21DE6;21DE6;21DE6;21DE6; # (𡷦; 𡷦; 𡷦; 𡷦; 𡷦; ) CJK COMPATIBILITY IDEOGRAPH-2F87D +2F87E;5D6E;5D6E;5D6E;5D6E; # (嵮; 嵮; 嵮; 嵮; 嵮; ) CJK COMPATIBILITY IDEOGRAPH-2F87E +2F87F;5D6B;5D6B;5D6B;5D6B; # (嵫; 嵫; 嵫; 嵫; 嵫; ) CJK COMPATIBILITY IDEOGRAPH-2F87F +2F880;5D7C;5D7C;5D7C;5D7C; # (嵼; 嵼; 嵼; 嵼; 嵼; ) CJK COMPATIBILITY IDEOGRAPH-2F880 +2F881;5DE1;5DE1;5DE1;5DE1; # (巡; 巡; 巡; 巡; 巡; ) CJK COMPATIBILITY IDEOGRAPH-2F881 +2F882;5DE2;5DE2;5DE2;5DE2; # (巢; 巢; 巢; 巢; 巢; ) CJK COMPATIBILITY IDEOGRAPH-2F882 +2F883;382F;382F;382F;382F; # (㠯; 㠯; 㠯; 㠯; 㠯; ) CJK COMPATIBILITY IDEOGRAPH-2F883 +2F884;5DFD;5DFD;5DFD;5DFD; # (巽; 巽; 巽; 巽; 巽; ) CJK COMPATIBILITY IDEOGRAPH-2F884 +2F885;5E28;5E28;5E28;5E28; # (帨; 帨; 帨; 帨; 帨; ) CJK COMPATIBILITY IDEOGRAPH-2F885 +2F886;5E3D;5E3D;5E3D;5E3D; # (帽; 帽; 帽; 帽; 帽; ) CJK COMPATIBILITY IDEOGRAPH-2F886 +2F887;5E69;5E69;5E69;5E69; # (幩; 幩; 幩; 幩; 幩; ) CJK COMPATIBILITY IDEOGRAPH-2F887 +2F888;3862;3862;3862;3862; # (㡢; 㡢; 㡢; 㡢; 㡢; ) CJK COMPATIBILITY IDEOGRAPH-2F888 +2F889;22183;22183;22183;22183; # (𢆃; 𢆃; 𢆃; 𢆃; 𢆃; ) CJK COMPATIBILITY IDEOGRAPH-2F889 +2F88A;387C;387C;387C;387C; # (㡼; 㡼; 㡼; 㡼; 㡼; ) CJK COMPATIBILITY IDEOGRAPH-2F88A +2F88B;5EB0;5EB0;5EB0;5EB0; # (庰; 庰; 庰; 庰; 庰; ) CJK COMPATIBILITY IDEOGRAPH-2F88B +2F88C;5EB3;5EB3;5EB3;5EB3; # (庳; 庳; 庳; 庳; 庳; ) CJK COMPATIBILITY IDEOGRAPH-2F88C +2F88D;5EB6;5EB6;5EB6;5EB6; # (庶; 庶; 庶; 庶; 庶; ) CJK COMPATIBILITY IDEOGRAPH-2F88D +2F88E;5ECA;5ECA;5ECA;5ECA; # (廊; 廊; 廊; 廊; 廊; ) CJK COMPATIBILITY IDEOGRAPH-2F88E +2F88F;2A392;2A392;2A392;2A392; # (𪎒; 𪎒; 𪎒; 𪎒; 𪎒; ) CJK COMPATIBILITY IDEOGRAPH-2F88F +2F890;5EFE;5EFE;5EFE;5EFE; # (廾; 廾; 廾; 廾; 廾; ) CJK COMPATIBILITY IDEOGRAPH-2F890 +2F891;22331;22331;22331;22331; # (𢌱; 𢌱; 𢌱; 𢌱; 𢌱; ) CJK COMPATIBILITY IDEOGRAPH-2F891 +2F892;22331;22331;22331;22331; # (𢌱; 𢌱; 𢌱; 𢌱; 𢌱; ) CJK COMPATIBILITY IDEOGRAPH-2F892 +2F893;8201;8201;8201;8201; # (舁; 舁; 舁; 舁; 舁; ) CJK COMPATIBILITY IDEOGRAPH-2F893 +2F894;5F22;5F22;5F22;5F22; # (弢; 弢; 弢; 弢; 弢; ) CJK COMPATIBILITY IDEOGRAPH-2F894 +2F895;5F22;5F22;5F22;5F22; # (弢; 弢; 弢; 弢; 弢; ) CJK COMPATIBILITY IDEOGRAPH-2F895 +2F896;38C7;38C7;38C7;38C7; # (㣇; 㣇; 㣇; 㣇; 㣇; ) CJK COMPATIBILITY IDEOGRAPH-2F896 +2F897;232B8;232B8;232B8;232B8; # (𣊸; 𣊸; 𣊸; 𣊸; 𣊸; ) CJK COMPATIBILITY IDEOGRAPH-2F897 +2F898;261DA;261DA;261DA;261DA; # (𦇚; 𦇚; 𦇚; 𦇚; 𦇚; ) CJK COMPATIBILITY IDEOGRAPH-2F898 +2F899;5F62;5F62;5F62;5F62; # (形; 形; 形; 形; 形; ) CJK COMPATIBILITY IDEOGRAPH-2F899 +2F89A;5F6B;5F6B;5F6B;5F6B; # (彫; 彫; 彫; 彫; 彫; ) CJK COMPATIBILITY IDEOGRAPH-2F89A +2F89B;38E3;38E3;38E3;38E3; # (㣣; 㣣; 㣣; 㣣; 㣣; ) CJK COMPATIBILITY IDEOGRAPH-2F89B +2F89C;5F9A;5F9A;5F9A;5F9A; # (徚; 徚; 徚; 徚; 徚; ) CJK COMPATIBILITY IDEOGRAPH-2F89C +2F89D;5FCD;5FCD;5FCD;5FCD; # (忍; 忍; 忍; 忍; 忍; ) CJK COMPATIBILITY IDEOGRAPH-2F89D +2F89E;5FD7;5FD7;5FD7;5FD7; # (志; 志; 志; 志; 志; ) CJK COMPATIBILITY IDEOGRAPH-2F89E +2F89F;5FF9;5FF9;5FF9;5FF9; # (忹; 忹; 忹; 忹; 忹; ) CJK COMPATIBILITY IDEOGRAPH-2F89F +2F8A0;6081;6081;6081;6081; # (悁; 悁; 悁; 悁; 悁; ) CJK COMPATIBILITY IDEOGRAPH-2F8A0 +2F8A1;393A;393A;393A;393A; # (㤺; 㤺; 㤺; 㤺; 㤺; ) CJK COMPATIBILITY IDEOGRAPH-2F8A1 +2F8A2;391C;391C;391C;391C; # (㤜; 㤜; 㤜; 㤜; 㤜; ) CJK COMPATIBILITY IDEOGRAPH-2F8A2 +2F8A3;6094;6094;6094;6094; # (悔; 悔; 悔; 悔; 悔; ) CJK COMPATIBILITY IDEOGRAPH-2F8A3 +2F8A4;226D4;226D4;226D4;226D4; # (𢛔; 𢛔; 𢛔; 𢛔; 𢛔; ) CJK COMPATIBILITY IDEOGRAPH-2F8A4 +2F8A5;60C7;60C7;60C7;60C7; # (惇; 惇; 惇; 惇; 惇; ) CJK COMPATIBILITY IDEOGRAPH-2F8A5 +2F8A6;6148;6148;6148;6148; # (慈; 慈; 慈; 慈; 慈; ) CJK COMPATIBILITY IDEOGRAPH-2F8A6 +2F8A7;614C;614C;614C;614C; # (慌; 慌; 慌; 慌; 慌; ) CJK COMPATIBILITY IDEOGRAPH-2F8A7 +2F8A8;614E;614E;614E;614E; # (慎; 慎; 慎; 慎; 慎; ) CJK COMPATIBILITY IDEOGRAPH-2F8A8 +2F8A9;614C;614C;614C;614C; # (慌; 慌; 慌; 慌; 慌; ) CJK COMPATIBILITY IDEOGRAPH-2F8A9 +2F8AA;617A;617A;617A;617A; # (慺; 慺; 慺; 慺; 慺; ) CJK COMPATIBILITY IDEOGRAPH-2F8AA +2F8AB;618E;618E;618E;618E; # (憎; 憎; 憎; 憎; 憎; ) CJK COMPATIBILITY IDEOGRAPH-2F8AB +2F8AC;61B2;61B2;61B2;61B2; # (憲; 憲; 憲; 憲; 憲; ) CJK COMPATIBILITY IDEOGRAPH-2F8AC +2F8AD;61A4;61A4;61A4;61A4; # (憤; 憤; 憤; 憤; 憤; ) CJK COMPATIBILITY IDEOGRAPH-2F8AD +2F8AE;61AF;61AF;61AF;61AF; # (憯; 憯; 憯; 憯; 憯; ) CJK COMPATIBILITY IDEOGRAPH-2F8AE +2F8AF;61DE;61DE;61DE;61DE; # (懞; 懞; 懞; 懞; 懞; ) CJK COMPATIBILITY IDEOGRAPH-2F8AF +2F8B0;61F2;61F2;61F2;61F2; # (懲; 懲; 懲; 懲; 懲; ) CJK COMPATIBILITY IDEOGRAPH-2F8B0 +2F8B1;61F6;61F6;61F6;61F6; # (懶; 懶; 懶; 懶; 懶; ) CJK COMPATIBILITY IDEOGRAPH-2F8B1 +2F8B2;6210;6210;6210;6210; # (成; 成; 成; 成; 成; ) CJK COMPATIBILITY IDEOGRAPH-2F8B2 +2F8B3;621B;621B;621B;621B; # (戛; 戛; 戛; 戛; 戛; ) CJK COMPATIBILITY IDEOGRAPH-2F8B3 +2F8B4;625D;625D;625D;625D; # (扝; 扝; 扝; 扝; 扝; ) CJK COMPATIBILITY IDEOGRAPH-2F8B4 +2F8B5;62B1;62B1;62B1;62B1; # (抱; 抱; 抱; 抱; 抱; ) CJK COMPATIBILITY IDEOGRAPH-2F8B5 +2F8B6;62D4;62D4;62D4;62D4; # (拔; 拔; 拔; 拔; 拔; ) CJK COMPATIBILITY IDEOGRAPH-2F8B6 +2F8B7;6350;6350;6350;6350; # (捐; 捐; 捐; 捐; 捐; ) CJK COMPATIBILITY IDEOGRAPH-2F8B7 +2F8B8;22B0C;22B0C;22B0C;22B0C; # (𢬌; 𢬌; 𢬌; 𢬌; 𢬌; ) CJK COMPATIBILITY IDEOGRAPH-2F8B8 +2F8B9;633D;633D;633D;633D; # (挽; 挽; 挽; 挽; 挽; ) CJK COMPATIBILITY IDEOGRAPH-2F8B9 +2F8BA;62FC;62FC;62FC;62FC; # (拼; 拼; 拼; 拼; 拼; ) CJK COMPATIBILITY IDEOGRAPH-2F8BA +2F8BB;6368;6368;6368;6368; # (捨; 捨; 捨; 捨; 捨; ) CJK COMPATIBILITY IDEOGRAPH-2F8BB +2F8BC;6383;6383;6383;6383; # (掃; 掃; 掃; 掃; 掃; ) CJK COMPATIBILITY IDEOGRAPH-2F8BC +2F8BD;63E4;63E4;63E4;63E4; # (揤; 揤; 揤; 揤; 揤; ) CJK COMPATIBILITY IDEOGRAPH-2F8BD +2F8BE;22BF1;22BF1;22BF1;22BF1; # (𢯱; 𢯱; 𢯱; 𢯱; 𢯱; ) CJK COMPATIBILITY IDEOGRAPH-2F8BE +2F8BF;6422;6422;6422;6422; # (搢; 搢; 搢; 搢; 搢; ) CJK COMPATIBILITY IDEOGRAPH-2F8BF +2F8C0;63C5;63C5;63C5;63C5; # (揅; 揅; 揅; 揅; 揅; ) CJK COMPATIBILITY IDEOGRAPH-2F8C0 +2F8C1;63A9;63A9;63A9;63A9; # (掩; 掩; 掩; 掩; 掩; ) CJK COMPATIBILITY IDEOGRAPH-2F8C1 +2F8C2;3A2E;3A2E;3A2E;3A2E; # (㨮; 㨮; 㨮; 㨮; 㨮; ) CJK COMPATIBILITY IDEOGRAPH-2F8C2 +2F8C3;6469;6469;6469;6469; # (摩; 摩; 摩; 摩; 摩; ) CJK COMPATIBILITY IDEOGRAPH-2F8C3 +2F8C4;647E;647E;647E;647E; # (摾; 摾; 摾; 摾; 摾; ) CJK COMPATIBILITY IDEOGRAPH-2F8C4 +2F8C5;649D;649D;649D;649D; # (撝; 撝; 撝; 撝; 撝; ) CJK COMPATIBILITY IDEOGRAPH-2F8C5 +2F8C6;6477;6477;6477;6477; # (摷; 摷; 摷; 摷; 摷; ) CJK COMPATIBILITY IDEOGRAPH-2F8C6 +2F8C7;3A6C;3A6C;3A6C;3A6C; # (㩬; 㩬; 㩬; 㩬; 㩬; ) CJK COMPATIBILITY IDEOGRAPH-2F8C7 +2F8C8;654F;654F;654F;654F; # (敏; 敏; 敏; 敏; 敏; ) CJK COMPATIBILITY IDEOGRAPH-2F8C8 +2F8C9;656C;656C;656C;656C; # (敬; 敬; 敬; 敬; 敬; ) CJK COMPATIBILITY IDEOGRAPH-2F8C9 +2F8CA;2300A;2300A;2300A;2300A; # (𣀊; 𣀊; 𣀊; 𣀊; 𣀊; ) CJK COMPATIBILITY IDEOGRAPH-2F8CA +2F8CB;65E3;65E3;65E3;65E3; # (旣; 旣; 旣; 旣; 旣; ) CJK COMPATIBILITY IDEOGRAPH-2F8CB +2F8CC;66F8;66F8;66F8;66F8; # (書; 書; 書; 書; 書; ) CJK COMPATIBILITY IDEOGRAPH-2F8CC +2F8CD;6649;6649;6649;6649; # (晉; 晉; 晉; 晉; 晉; ) CJK COMPATIBILITY IDEOGRAPH-2F8CD +2F8CE;3B19;3B19;3B19;3B19; # (㬙; 㬙; 㬙; 㬙; 㬙; ) CJK COMPATIBILITY IDEOGRAPH-2F8CE +2F8CF;6691;6691;6691;6691; # (暑; 暑; 暑; 暑; 暑; ) CJK COMPATIBILITY IDEOGRAPH-2F8CF +2F8D0;3B08;3B08;3B08;3B08; # (㬈; 㬈; 㬈; 㬈; 㬈; ) CJK COMPATIBILITY IDEOGRAPH-2F8D0 +2F8D1;3AE4;3AE4;3AE4;3AE4; # (㫤; 㫤; 㫤; 㫤; 㫤; ) CJK COMPATIBILITY IDEOGRAPH-2F8D1 +2F8D2;5192;5192;5192;5192; # (冒; 冒; 冒; 冒; 冒; ) CJK COMPATIBILITY IDEOGRAPH-2F8D2 +2F8D3;5195;5195;5195;5195; # (冕; 冕; 冕; 冕; 冕; ) CJK COMPATIBILITY IDEOGRAPH-2F8D3 +2F8D4;6700;6700;6700;6700; # (最; 最; 最; 最; 最; ) CJK COMPATIBILITY IDEOGRAPH-2F8D4 +2F8D5;669C;669C;669C;669C; # (暜; 暜; 暜; 暜; 暜; ) CJK COMPATIBILITY IDEOGRAPH-2F8D5 +2F8D6;80AD;80AD;80AD;80AD; # (肭; 肭; 肭; 肭; 肭; ) CJK COMPATIBILITY IDEOGRAPH-2F8D6 +2F8D7;43D9;43D9;43D9;43D9; # (䏙; 䏙; 䏙; 䏙; 䏙; ) CJK COMPATIBILITY IDEOGRAPH-2F8D7 +2F8D8;6717;6717;6717;6717; # (朗; 朗; 朗; 朗; 朗; ) CJK COMPATIBILITY IDEOGRAPH-2F8D8 +2F8D9;671B;671B;671B;671B; # (望; 望; 望; 望; 望; ) CJK COMPATIBILITY IDEOGRAPH-2F8D9 +2F8DA;6721;6721;6721;6721; # (朡; 朡; 朡; 朡; 朡; ) CJK COMPATIBILITY IDEOGRAPH-2F8DA +2F8DB;675E;675E;675E;675E; # (杞; 杞; 杞; 杞; 杞; ) CJK COMPATIBILITY IDEOGRAPH-2F8DB +2F8DC;6753;6753;6753;6753; # (杓; 杓; 杓; 杓; 杓; ) CJK COMPATIBILITY IDEOGRAPH-2F8DC +2F8DD;233C3;233C3;233C3;233C3; # (𣏃; 𣏃; 𣏃; 𣏃; 𣏃; ) CJK COMPATIBILITY IDEOGRAPH-2F8DD +2F8DE;3B49;3B49;3B49;3B49; # (㭉; 㭉; 㭉; 㭉; 㭉; ) CJK COMPATIBILITY IDEOGRAPH-2F8DE +2F8DF;67FA;67FA;67FA;67FA; # (柺; 柺; 柺; 柺; 柺; ) CJK COMPATIBILITY IDEOGRAPH-2F8DF +2F8E0;6785;6785;6785;6785; # (枅; 枅; 枅; 枅; 枅; ) CJK COMPATIBILITY IDEOGRAPH-2F8E0 +2F8E1;6852;6852;6852;6852; # (桒; 桒; 桒; 桒; 桒; ) CJK COMPATIBILITY IDEOGRAPH-2F8E1 +2F8E2;6885;6885;6885;6885; # (梅; 梅; 梅; 梅; 梅; ) CJK COMPATIBILITY IDEOGRAPH-2F8E2 +2F8E3;2346D;2346D;2346D;2346D; # (𣑭; 𣑭; 𣑭; 𣑭; 𣑭; ) CJK COMPATIBILITY IDEOGRAPH-2F8E3 +2F8E4;688E;688E;688E;688E; # (梎; 梎; 梎; 梎; 梎; ) CJK COMPATIBILITY IDEOGRAPH-2F8E4 +2F8E5;681F;681F;681F;681F; # (栟; 栟; 栟; 栟; 栟; ) CJK COMPATIBILITY IDEOGRAPH-2F8E5 +2F8E6;6914;6914;6914;6914; # (椔; 椔; 椔; 椔; 椔; ) CJK COMPATIBILITY IDEOGRAPH-2F8E6 +2F8E7;3B9D;3B9D;3B9D;3B9D; # (㮝; 㮝; 㮝; 㮝; 㮝; ) CJK COMPATIBILITY IDEOGRAPH-2F8E7 +2F8E8;6942;6942;6942;6942; # (楂; 楂; 楂; 楂; 楂; ) CJK COMPATIBILITY IDEOGRAPH-2F8E8 +2F8E9;69A3;69A3;69A3;69A3; # (榣; 榣; 榣; 榣; 榣; ) CJK COMPATIBILITY IDEOGRAPH-2F8E9 +2F8EA;69EA;69EA;69EA;69EA; # (槪; 槪; 槪; 槪; 槪; ) CJK COMPATIBILITY IDEOGRAPH-2F8EA +2F8EB;6AA8;6AA8;6AA8;6AA8; # (檨; 檨; 檨; 檨; 檨; ) CJK COMPATIBILITY IDEOGRAPH-2F8EB +2F8EC;236A3;236A3;236A3;236A3; # (𣚣; 𣚣; 𣚣; 𣚣; 𣚣; ) CJK COMPATIBILITY IDEOGRAPH-2F8EC +2F8ED;6ADB;6ADB;6ADB;6ADB; # (櫛; 櫛; 櫛; 櫛; 櫛; ) CJK COMPATIBILITY IDEOGRAPH-2F8ED +2F8EE;3C18;3C18;3C18;3C18; # (㰘; 㰘; 㰘; 㰘; 㰘; ) CJK COMPATIBILITY IDEOGRAPH-2F8EE +2F8EF;6B21;6B21;6B21;6B21; # (次; 次; 次; 次; 次; ) CJK COMPATIBILITY IDEOGRAPH-2F8EF +2F8F0;238A7;238A7;238A7;238A7; # (𣢧; 𣢧; 𣢧; 𣢧; 𣢧; ) CJK COMPATIBILITY IDEOGRAPH-2F8F0 +2F8F1;6B54;6B54;6B54;6B54; # (歔; 歔; 歔; 歔; 歔; ) CJK COMPATIBILITY IDEOGRAPH-2F8F1 +2F8F2;3C4E;3C4E;3C4E;3C4E; # (㱎; 㱎; 㱎; 㱎; 㱎; ) CJK COMPATIBILITY IDEOGRAPH-2F8F2 +2F8F3;6B72;6B72;6B72;6B72; # (歲; 歲; 歲; 歲; 歲; ) CJK COMPATIBILITY IDEOGRAPH-2F8F3 +2F8F4;6B9F;6B9F;6B9F;6B9F; # (殟; 殟; 殟; 殟; 殟; ) CJK COMPATIBILITY IDEOGRAPH-2F8F4 +2F8F5;6BBA;6BBA;6BBA;6BBA; # (殺; 殺; 殺; 殺; 殺; ) CJK COMPATIBILITY IDEOGRAPH-2F8F5 +2F8F6;6BBB;6BBB;6BBB;6BBB; # (殻; 殻; 殻; 殻; 殻; ) CJK COMPATIBILITY IDEOGRAPH-2F8F6 +2F8F7;23A8D;23A8D;23A8D;23A8D; # (𣪍; 𣪍; 𣪍; 𣪍; 𣪍; ) CJK COMPATIBILITY IDEOGRAPH-2F8F7 +2F8F8;21D0B;21D0B;21D0B;21D0B; # (𡴋; 𡴋; 𡴋; 𡴋; 𡴋; ) CJK COMPATIBILITY IDEOGRAPH-2F8F8 +2F8F9;23AFA;23AFA;23AFA;23AFA; # (𣫺; 𣫺; 𣫺; 𣫺; 𣫺; ) CJK COMPATIBILITY IDEOGRAPH-2F8F9 +2F8FA;6C4E;6C4E;6C4E;6C4E; # (汎; 汎; 汎; 汎; 汎; ) CJK COMPATIBILITY IDEOGRAPH-2F8FA +2F8FB;23CBC;23CBC;23CBC;23CBC; # (𣲼; 𣲼; 𣲼; 𣲼; 𣲼; ) CJK COMPATIBILITY IDEOGRAPH-2F8FB +2F8FC;6CBF;6CBF;6CBF;6CBF; # (沿; 沿; 沿; 沿; 沿; ) CJK COMPATIBILITY IDEOGRAPH-2F8FC +2F8FD;6CCD;6CCD;6CCD;6CCD; # (泍; 泍; 泍; 泍; 泍; ) CJK COMPATIBILITY IDEOGRAPH-2F8FD +2F8FE;6C67;6C67;6C67;6C67; # (汧; 汧; 汧; 汧; 汧; ) CJK COMPATIBILITY IDEOGRAPH-2F8FE +2F8FF;6D16;6D16;6D16;6D16; # (洖; 洖; 洖; 洖; 洖; ) CJK COMPATIBILITY IDEOGRAPH-2F8FF +2F900;6D3E;6D3E;6D3E;6D3E; # (派; 派; 派; 派; 派; ) CJK COMPATIBILITY IDEOGRAPH-2F900 +2F901;6D77;6D77;6D77;6D77; # (海; 海; 海; 海; 海; ) CJK COMPATIBILITY IDEOGRAPH-2F901 +2F902;6D41;6D41;6D41;6D41; # (流; 流; 流; 流; 流; ) CJK COMPATIBILITY IDEOGRAPH-2F902 +2F903;6D69;6D69;6D69;6D69; # (浩; 浩; 浩; 浩; 浩; ) CJK COMPATIBILITY IDEOGRAPH-2F903 +2F904;6D78;6D78;6D78;6D78; # (浸; 浸; 浸; 浸; 浸; ) CJK COMPATIBILITY IDEOGRAPH-2F904 +2F905;6D85;6D85;6D85;6D85; # (涅; 涅; 涅; 涅; 涅; ) CJK COMPATIBILITY IDEOGRAPH-2F905 +2F906;23D1E;23D1E;23D1E;23D1E; # (𣴞; 𣴞; 𣴞; 𣴞; 𣴞; ) CJK COMPATIBILITY IDEOGRAPH-2F906 +2F907;6D34;6D34;6D34;6D34; # (洴; 洴; 洴; 洴; 洴; ) CJK COMPATIBILITY IDEOGRAPH-2F907 +2F908;6E2F;6E2F;6E2F;6E2F; # (港; 港; 港; 港; 港; ) CJK COMPATIBILITY IDEOGRAPH-2F908 +2F909;6E6E;6E6E;6E6E;6E6E; # (湮; 湮; 湮; 湮; 湮; ) CJK COMPATIBILITY IDEOGRAPH-2F909 +2F90A;3D33;3D33;3D33;3D33; # (㴳; 㴳; 㴳; 㴳; 㴳; ) CJK COMPATIBILITY IDEOGRAPH-2F90A +2F90B;6ECB;6ECB;6ECB;6ECB; # (滋; 滋; 滋; 滋; 滋; ) CJK COMPATIBILITY IDEOGRAPH-2F90B +2F90C;6EC7;6EC7;6EC7;6EC7; # (滇; 滇; 滇; 滇; 滇; ) CJK COMPATIBILITY IDEOGRAPH-2F90C +2F90D;23ED1;23ED1;23ED1;23ED1; # (𣻑; 𣻑; 𣻑; 𣻑; 𣻑; ) CJK COMPATIBILITY IDEOGRAPH-2F90D +2F90E;6DF9;6DF9;6DF9;6DF9; # (淹; 淹; 淹; 淹; 淹; ) CJK COMPATIBILITY IDEOGRAPH-2F90E +2F90F;6F6E;6F6E;6F6E;6F6E; # (潮; 潮; 潮; 潮; 潮; ) CJK COMPATIBILITY IDEOGRAPH-2F90F +2F910;23F5E;23F5E;23F5E;23F5E; # (𣽞; 𣽞; 𣽞; 𣽞; 𣽞; ) CJK COMPATIBILITY IDEOGRAPH-2F910 +2F911;23F8E;23F8E;23F8E;23F8E; # (𣾎; 𣾎; 𣾎; 𣾎; 𣾎; ) CJK COMPATIBILITY IDEOGRAPH-2F911 +2F912;6FC6;6FC6;6FC6;6FC6; # (濆; 濆; 濆; 濆; 濆; ) CJK COMPATIBILITY IDEOGRAPH-2F912 +2F913;7039;7039;7039;7039; # (瀹; 瀹; 瀹; 瀹; 瀹; ) CJK COMPATIBILITY IDEOGRAPH-2F913 +2F914;701E;701E;701E;701E; # (瀞; 瀞; 瀞; 瀞; 瀞; ) CJK COMPATIBILITY IDEOGRAPH-2F914 +2F915;701B;701B;701B;701B; # (瀛; 瀛; 瀛; 瀛; 瀛; ) CJK COMPATIBILITY IDEOGRAPH-2F915 +2F916;3D96;3D96;3D96;3D96; # (㶖; 㶖; 㶖; 㶖; 㶖; ) CJK COMPATIBILITY IDEOGRAPH-2F916 +2F917;704A;704A;704A;704A; # (灊; 灊; 灊; 灊; 灊; ) CJK COMPATIBILITY IDEOGRAPH-2F917 +2F918;707D;707D;707D;707D; # (災; 災; 災; 災; 災; ) CJK COMPATIBILITY IDEOGRAPH-2F918 +2F919;7077;7077;7077;7077; # (灷; 灷; 灷; 灷; 灷; ) CJK COMPATIBILITY IDEOGRAPH-2F919 +2F91A;70AD;70AD;70AD;70AD; # (炭; 炭; 炭; 炭; 炭; ) CJK COMPATIBILITY IDEOGRAPH-2F91A +2F91B;20525;20525;20525;20525; # (𠔥; 𠔥; 𠔥; 𠔥; 𠔥; ) CJK COMPATIBILITY IDEOGRAPH-2F91B +2F91C;7145;7145;7145;7145; # (煅; 煅; 煅; 煅; 煅; ) CJK COMPATIBILITY IDEOGRAPH-2F91C +2F91D;24263;24263;24263;24263; # (𤉣; 𤉣; 𤉣; 𤉣; 𤉣; ) CJK COMPATIBILITY IDEOGRAPH-2F91D +2F91E;719C;719C;719C;719C; # (熜; 熜; 熜; 熜; 熜; ) CJK COMPATIBILITY IDEOGRAPH-2F91E +2F91F;243AB;243AB;243AB;243AB; # (𤎫; 𤎫; 𤎫; 𤎫; 𤎫; ) CJK COMPATIBILITY IDEOGRAPH-2F91F +2F920;7228;7228;7228;7228; # (爨; 爨; 爨; 爨; 爨; ) CJK COMPATIBILITY IDEOGRAPH-2F920 +2F921;7235;7235;7235;7235; # (爵; 爵; 爵; 爵; 爵; ) CJK COMPATIBILITY IDEOGRAPH-2F921 +2F922;7250;7250;7250;7250; # (牐; 牐; 牐; 牐; 牐; ) CJK COMPATIBILITY IDEOGRAPH-2F922 +2F923;24608;24608;24608;24608; # (𤘈; 𤘈; 𤘈; 𤘈; 𤘈; ) CJK COMPATIBILITY IDEOGRAPH-2F923 +2F924;7280;7280;7280;7280; # (犀; 犀; 犀; 犀; 犀; ) CJK COMPATIBILITY IDEOGRAPH-2F924 +2F925;7295;7295;7295;7295; # (犕; 犕; 犕; 犕; 犕; ) CJK COMPATIBILITY IDEOGRAPH-2F925 +2F926;24735;24735;24735;24735; # (𤜵; 𤜵; 𤜵; 𤜵; 𤜵; ) CJK COMPATIBILITY IDEOGRAPH-2F926 +2F927;24814;24814;24814;24814; # (𤠔; 𤠔; 𤠔; 𤠔; 𤠔; ) CJK COMPATIBILITY IDEOGRAPH-2F927 +2F928;737A;737A;737A;737A; # (獺; 獺; 獺; 獺; 獺; ) CJK COMPATIBILITY IDEOGRAPH-2F928 +2F929;738B;738B;738B;738B; # (王; 王; 王; 王; 王; ) CJK COMPATIBILITY IDEOGRAPH-2F929 +2F92A;3EAC;3EAC;3EAC;3EAC; # (㺬; 㺬; 㺬; 㺬; 㺬; ) CJK COMPATIBILITY IDEOGRAPH-2F92A +2F92B;73A5;73A5;73A5;73A5; # (玥; 玥; 玥; 玥; 玥; ) CJK COMPATIBILITY IDEOGRAPH-2F92B +2F92C;3EB8;3EB8;3EB8;3EB8; # (㺸; 㺸; 㺸; 㺸; 㺸; ) CJK COMPATIBILITY IDEOGRAPH-2F92C +2F92D;3EB8;3EB8;3EB8;3EB8; # (㺸; 㺸; 㺸; 㺸; 㺸; ) CJK COMPATIBILITY IDEOGRAPH-2F92D +2F92E;7447;7447;7447;7447; # (瑇; 瑇; 瑇; 瑇; 瑇; ) CJK COMPATIBILITY IDEOGRAPH-2F92E +2F92F;745C;745C;745C;745C; # (瑜; 瑜; 瑜; 瑜; 瑜; ) CJK COMPATIBILITY IDEOGRAPH-2F92F +2F930;7471;7471;7471;7471; # (瑱; 瑱; 瑱; 瑱; 瑱; ) CJK COMPATIBILITY IDEOGRAPH-2F930 +2F931;7485;7485;7485;7485; # (璅; 璅; 璅; 璅; 璅; ) CJK COMPATIBILITY IDEOGRAPH-2F931 +2F932;74CA;74CA;74CA;74CA; # (瓊; 瓊; 瓊; 瓊; 瓊; ) CJK COMPATIBILITY IDEOGRAPH-2F932 +2F933;3F1B;3F1B;3F1B;3F1B; # (㼛; 㼛; 㼛; 㼛; 㼛; ) CJK COMPATIBILITY IDEOGRAPH-2F933 +2F934;7524;7524;7524;7524; # (甤; 甤; 甤; 甤; 甤; ) CJK COMPATIBILITY IDEOGRAPH-2F934 +2F935;24C36;24C36;24C36;24C36; # (𤰶; 𤰶; 𤰶; 𤰶; 𤰶; ) CJK COMPATIBILITY IDEOGRAPH-2F935 +2F936;753E;753E;753E;753E; # (甾; 甾; 甾; 甾; 甾; ) CJK COMPATIBILITY IDEOGRAPH-2F936 +2F937;24C92;24C92;24C92;24C92; # (𤲒; 𤲒; 𤲒; 𤲒; 𤲒; ) CJK COMPATIBILITY IDEOGRAPH-2F937 +2F938;7570;7570;7570;7570; # (異; 異; 異; 異; 異; ) CJK COMPATIBILITY IDEOGRAPH-2F938 +2F939;2219F;2219F;2219F;2219F; # (𢆟; 𢆟; 𢆟; 𢆟; 𢆟; ) CJK COMPATIBILITY IDEOGRAPH-2F939 +2F93A;7610;7610;7610;7610; # (瘐; 瘐; 瘐; 瘐; 瘐; ) CJK COMPATIBILITY IDEOGRAPH-2F93A +2F93B;24FA1;24FA1;24FA1;24FA1; # (𤾡; 𤾡; 𤾡; 𤾡; 𤾡; ) CJK COMPATIBILITY IDEOGRAPH-2F93B +2F93C;24FB8;24FB8;24FB8;24FB8; # (𤾸; 𤾸; 𤾸; 𤾸; 𤾸; ) CJK COMPATIBILITY IDEOGRAPH-2F93C +2F93D;25044;25044;25044;25044; # (𥁄; 𥁄; 𥁄; 𥁄; 𥁄; ) CJK COMPATIBILITY IDEOGRAPH-2F93D +2F93E;3FFC;3FFC;3FFC;3FFC; # (㿼; 㿼; 㿼; 㿼; 㿼; ) CJK COMPATIBILITY IDEOGRAPH-2F93E +2F93F;4008;4008;4008;4008; # (䀈; 䀈; 䀈; 䀈; 䀈; ) CJK COMPATIBILITY IDEOGRAPH-2F93F +2F940;76F4;76F4;76F4;76F4; # (直; 直; 直; 直; 直; ) CJK COMPATIBILITY IDEOGRAPH-2F940 +2F941;250F3;250F3;250F3;250F3; # (𥃳; 𥃳; 𥃳; 𥃳; 𥃳; ) CJK COMPATIBILITY IDEOGRAPH-2F941 +2F942;250F2;250F2;250F2;250F2; # (𥃲; 𥃲; 𥃲; 𥃲; 𥃲; ) CJK COMPATIBILITY IDEOGRAPH-2F942 +2F943;25119;25119;25119;25119; # (𥄙; 𥄙; 𥄙; 𥄙; 𥄙; ) CJK COMPATIBILITY IDEOGRAPH-2F943 +2F944;25133;25133;25133;25133; # (𥄳; 𥄳; 𥄳; 𥄳; 𥄳; ) CJK COMPATIBILITY IDEOGRAPH-2F944 +2F945;771E;771E;771E;771E; # (眞; 眞; 眞; 眞; 眞; ) CJK COMPATIBILITY IDEOGRAPH-2F945 +2F946;771F;771F;771F;771F; # (真; 真; 真; 真; 真; ) CJK COMPATIBILITY IDEOGRAPH-2F946 +2F947;771F;771F;771F;771F; # (真; 真; 真; 真; 真; ) CJK COMPATIBILITY IDEOGRAPH-2F947 +2F948;774A;774A;774A;774A; # (睊; 睊; 睊; 睊; 睊; ) CJK COMPATIBILITY IDEOGRAPH-2F948 +2F949;4039;4039;4039;4039; # (䀹; 䀹; 䀹; 䀹; 䀹; ) CJK COMPATIBILITY IDEOGRAPH-2F949 +2F94A;778B;778B;778B;778B; # (瞋; 瞋; 瞋; 瞋; 瞋; ) CJK COMPATIBILITY IDEOGRAPH-2F94A +2F94B;4046;4046;4046;4046; # (䁆; 䁆; 䁆; 䁆; 䁆; ) CJK COMPATIBILITY IDEOGRAPH-2F94B +2F94C;4096;4096;4096;4096; # (䂖; 䂖; 䂖; 䂖; 䂖; ) CJK COMPATIBILITY IDEOGRAPH-2F94C +2F94D;2541D;2541D;2541D;2541D; # (𥐝; 𥐝; 𥐝; 𥐝; 𥐝; ) CJK COMPATIBILITY IDEOGRAPH-2F94D +2F94E;784E;784E;784E;784E; # (硎; 硎; 硎; 硎; 硎; ) CJK COMPATIBILITY IDEOGRAPH-2F94E +2F94F;788C;788C;788C;788C; # (碌; 碌; 碌; 碌; 碌; ) CJK COMPATIBILITY IDEOGRAPH-2F94F +2F950;78CC;78CC;78CC;78CC; # (磌; 磌; 磌; 磌; 磌; ) CJK COMPATIBILITY IDEOGRAPH-2F950 +2F951;40E3;40E3;40E3;40E3; # (䃣; 䃣; 䃣; 䃣; 䃣; ) CJK COMPATIBILITY IDEOGRAPH-2F951 +2F952;25626;25626;25626;25626; # (𥘦; 𥘦; 𥘦; 𥘦; 𥘦; ) CJK COMPATIBILITY IDEOGRAPH-2F952 +2F953;7956;7956;7956;7956; # (祖; 祖; 祖; 祖; 祖; ) CJK COMPATIBILITY IDEOGRAPH-2F953 +2F954;2569A;2569A;2569A;2569A; # (𥚚; 𥚚; 𥚚; 𥚚; 𥚚; ) CJK COMPATIBILITY IDEOGRAPH-2F954 +2F955;256C5;256C5;256C5;256C5; # (𥛅; 𥛅; 𥛅; 𥛅; 𥛅; ) CJK COMPATIBILITY IDEOGRAPH-2F955 +2F956;798F;798F;798F;798F; # (福; 福; 福; 福; 福; ) CJK COMPATIBILITY IDEOGRAPH-2F956 +2F957;79EB;79EB;79EB;79EB; # (秫; 秫; 秫; 秫; 秫; ) CJK COMPATIBILITY IDEOGRAPH-2F957 +2F958;412F;412F;412F;412F; # (䄯; 䄯; 䄯; 䄯; 䄯; ) CJK COMPATIBILITY IDEOGRAPH-2F958 +2F959;7A40;7A40;7A40;7A40; # (穀; 穀; 穀; 穀; 穀; ) CJK COMPATIBILITY IDEOGRAPH-2F959 +2F95A;7A4A;7A4A;7A4A;7A4A; # (穊; 穊; 穊; 穊; 穊; ) CJK COMPATIBILITY IDEOGRAPH-2F95A +2F95B;7A4F;7A4F;7A4F;7A4F; # (穏; 穏; 穏; 穏; 穏; ) CJK COMPATIBILITY IDEOGRAPH-2F95B +2F95C;2597C;2597C;2597C;2597C; # (𥥼; 𥥼; 𥥼; 𥥼; 𥥼; ) CJK COMPATIBILITY IDEOGRAPH-2F95C +2F95D;25AA7;25AA7;25AA7;25AA7; # (𥪧; 𥪧; 𥪧; 𥪧; 𥪧; ) CJK COMPATIBILITY IDEOGRAPH-2F95D +2F95E;25AA7;25AA7;25AA7;25AA7; # (𥪧; 𥪧; 𥪧; 𥪧; 𥪧; ) CJK COMPATIBILITY IDEOGRAPH-2F95E +2F95F;7AEE;7AEE;7AEE;7AEE; # (竮; 竮; 竮; 竮; 竮; ) CJK COMPATIBILITY IDEOGRAPH-2F95F +2F960;4202;4202;4202;4202; # (䈂; 䈂; 䈂; 䈂; 䈂; ) CJK COMPATIBILITY IDEOGRAPH-2F960 +2F961;25BAB;25BAB;25BAB;25BAB; # (𥮫; 𥮫; 𥮫; 𥮫; 𥮫; ) CJK COMPATIBILITY IDEOGRAPH-2F961 +2F962;7BC6;7BC6;7BC6;7BC6; # (篆; 篆; 篆; 篆; 篆; ) CJK COMPATIBILITY IDEOGRAPH-2F962 +2F963;7BC9;7BC9;7BC9;7BC9; # (築; 築; 築; 築; 築; ) CJK COMPATIBILITY IDEOGRAPH-2F963 +2F964;4227;4227;4227;4227; # (䈧; 䈧; 䈧; 䈧; 䈧; ) CJK COMPATIBILITY IDEOGRAPH-2F964 +2F965;25C80;25C80;25C80;25C80; # (𥲀; 𥲀; 𥲀; 𥲀; 𥲀; ) CJK COMPATIBILITY IDEOGRAPH-2F965 +2F966;7CD2;7CD2;7CD2;7CD2; # (糒; 糒; 糒; 糒; 糒; ) CJK COMPATIBILITY IDEOGRAPH-2F966 +2F967;42A0;42A0;42A0;42A0; # (䊠; 䊠; 䊠; 䊠; 䊠; ) CJK COMPATIBILITY IDEOGRAPH-2F967 +2F968;7CE8;7CE8;7CE8;7CE8; # (糨; 糨; 糨; 糨; 糨; ) CJK COMPATIBILITY IDEOGRAPH-2F968 +2F969;7CE3;7CE3;7CE3;7CE3; # (糣; 糣; 糣; 糣; 糣; ) CJK COMPATIBILITY IDEOGRAPH-2F969 +2F96A;7D00;7D00;7D00;7D00; # (紀; 紀; 紀; 紀; 紀; ) CJK COMPATIBILITY IDEOGRAPH-2F96A +2F96B;25F86;25F86;25F86;25F86; # (𥾆; 𥾆; 𥾆; 𥾆; 𥾆; ) CJK COMPATIBILITY IDEOGRAPH-2F96B +2F96C;7D63;7D63;7D63;7D63; # (絣; 絣; 絣; 絣; 絣; ) CJK COMPATIBILITY IDEOGRAPH-2F96C +2F96D;4301;4301;4301;4301; # (䌁; 䌁; 䌁; 䌁; 䌁; ) CJK COMPATIBILITY IDEOGRAPH-2F96D +2F96E;7DC7;7DC7;7DC7;7DC7; # (緇; 緇; 緇; 緇; 緇; ) CJK COMPATIBILITY IDEOGRAPH-2F96E +2F96F;7E02;7E02;7E02;7E02; # (縂; 縂; 縂; 縂; 縂; ) CJK COMPATIBILITY IDEOGRAPH-2F96F +2F970;7E45;7E45;7E45;7E45; # (繅; 繅; 繅; 繅; 繅; ) CJK COMPATIBILITY IDEOGRAPH-2F970 +2F971;4334;4334;4334;4334; # (䌴; 䌴; 䌴; 䌴; 䌴; ) CJK COMPATIBILITY IDEOGRAPH-2F971 +2F972;26228;26228;26228;26228; # (𦈨; 𦈨; 𦈨; 𦈨; 𦈨; ) CJK COMPATIBILITY IDEOGRAPH-2F972 +2F973;26247;26247;26247;26247; # (𦉇; 𦉇; 𦉇; 𦉇; 𦉇; ) CJK COMPATIBILITY IDEOGRAPH-2F973 +2F974;4359;4359;4359;4359; # (䍙; 䍙; 䍙; 䍙; 䍙; ) CJK COMPATIBILITY IDEOGRAPH-2F974 +2F975;262D9;262D9;262D9;262D9; # (𦋙; 𦋙; 𦋙; 𦋙; 𦋙; ) CJK COMPATIBILITY IDEOGRAPH-2F975 +2F976;7F7A;7F7A;7F7A;7F7A; # (罺; 罺; 罺; 罺; 罺; ) CJK COMPATIBILITY IDEOGRAPH-2F976 +2F977;2633E;2633E;2633E;2633E; # (𦌾; 𦌾; 𦌾; 𦌾; 𦌾; ) CJK COMPATIBILITY IDEOGRAPH-2F977 +2F978;7F95;7F95;7F95;7F95; # (羕; 羕; 羕; 羕; 羕; ) CJK COMPATIBILITY IDEOGRAPH-2F978 +2F979;7FFA;7FFA;7FFA;7FFA; # (翺; 翺; 翺; 翺; 翺; ) CJK COMPATIBILITY IDEOGRAPH-2F979 +2F97A;8005;8005;8005;8005; # (者; 者; 者; 者; 者; ) CJK COMPATIBILITY IDEOGRAPH-2F97A +2F97B;264DA;264DA;264DA;264DA; # (𦓚; 𦓚; 𦓚; 𦓚; 𦓚; ) CJK COMPATIBILITY IDEOGRAPH-2F97B +2F97C;26523;26523;26523;26523; # (𦔣; 𦔣; 𦔣; 𦔣; 𦔣; ) CJK COMPATIBILITY IDEOGRAPH-2F97C +2F97D;8060;8060;8060;8060; # (聠; 聠; 聠; 聠; 聠; ) CJK COMPATIBILITY IDEOGRAPH-2F97D +2F97E;265A8;265A8;265A8;265A8; # (𦖨; 𦖨; 𦖨; 𦖨; 𦖨; ) CJK COMPATIBILITY IDEOGRAPH-2F97E +2F97F;8070;8070;8070;8070; # (聰; 聰; 聰; 聰; 聰; ) CJK COMPATIBILITY IDEOGRAPH-2F97F +2F980;2335F;2335F;2335F;2335F; # (𣍟; 𣍟; 𣍟; 𣍟; 𣍟; ) CJK COMPATIBILITY IDEOGRAPH-2F980 +2F981;43D5;43D5;43D5;43D5; # (䏕; 䏕; 䏕; 䏕; 䏕; ) CJK COMPATIBILITY IDEOGRAPH-2F981 +2F982;80B2;80B2;80B2;80B2; # (育; 育; 育; 育; 育; ) CJK COMPATIBILITY IDEOGRAPH-2F982 +2F983;8103;8103;8103;8103; # (脃; 脃; 脃; 脃; 脃; ) CJK COMPATIBILITY IDEOGRAPH-2F983 +2F984;440B;440B;440B;440B; # (䐋; 䐋; 䐋; 䐋; 䐋; ) CJK COMPATIBILITY IDEOGRAPH-2F984 +2F985;813E;813E;813E;813E; # (脾; 脾; 脾; 脾; 脾; ) CJK COMPATIBILITY IDEOGRAPH-2F985 +2F986;5AB5;5AB5;5AB5;5AB5; # (媵; 媵; 媵; 媵; 媵; ) CJK COMPATIBILITY IDEOGRAPH-2F986 +2F987;267A7;267A7;267A7;267A7; # (𦞧; 𦞧; 𦞧; 𦞧; 𦞧; ) CJK COMPATIBILITY IDEOGRAPH-2F987 +2F988;267B5;267B5;267B5;267B5; # (𦞵; 𦞵; 𦞵; 𦞵; 𦞵; ) CJK COMPATIBILITY IDEOGRAPH-2F988 +2F989;23393;23393;23393;23393; # (𣎓; 𣎓; 𣎓; 𣎓; 𣎓; ) CJK COMPATIBILITY IDEOGRAPH-2F989 +2F98A;2339C;2339C;2339C;2339C; # (𣎜; 𣎜; 𣎜; 𣎜; 𣎜; ) CJK COMPATIBILITY IDEOGRAPH-2F98A +2F98B;8201;8201;8201;8201; # (舁; 舁; 舁; 舁; 舁; ) CJK COMPATIBILITY IDEOGRAPH-2F98B +2F98C;8204;8204;8204;8204; # (舄; 舄; 舄; 舄; 舄; ) CJK COMPATIBILITY IDEOGRAPH-2F98C +2F98D;8F9E;8F9E;8F9E;8F9E; # (辞; 辞; 辞; 辞; 辞; ) CJK COMPATIBILITY IDEOGRAPH-2F98D +2F98E;446B;446B;446B;446B; # (䑫; 䑫; 䑫; 䑫; 䑫; ) CJK COMPATIBILITY IDEOGRAPH-2F98E +2F98F;8291;8291;8291;8291; # (芑; 芑; 芑; 芑; 芑; ) CJK COMPATIBILITY IDEOGRAPH-2F98F +2F990;828B;828B;828B;828B; # (芋; 芋; 芋; 芋; 芋; ) CJK COMPATIBILITY IDEOGRAPH-2F990 +2F991;829D;829D;829D;829D; # (芝; 芝; 芝; 芝; 芝; ) CJK COMPATIBILITY IDEOGRAPH-2F991 +2F992;52B3;52B3;52B3;52B3; # (劳; 劳; 劳; 劳; 劳; ) CJK COMPATIBILITY IDEOGRAPH-2F992 +2F993;82B1;82B1;82B1;82B1; # (花; 花; 花; 花; 花; ) CJK COMPATIBILITY IDEOGRAPH-2F993 +2F994;82B3;82B3;82B3;82B3; # (芳; 芳; 芳; 芳; 芳; ) CJK COMPATIBILITY IDEOGRAPH-2F994 +2F995;82BD;82BD;82BD;82BD; # (芽; 芽; 芽; 芽; 芽; ) CJK COMPATIBILITY IDEOGRAPH-2F995 +2F996;82E6;82E6;82E6;82E6; # (苦; 苦; 苦; 苦; 苦; ) CJK COMPATIBILITY IDEOGRAPH-2F996 +2F997;26B3C;26B3C;26B3C;26B3C; # (𦬼; 𦬼; 𦬼; 𦬼; 𦬼; ) CJK COMPATIBILITY IDEOGRAPH-2F997 +2F998;82E5;82E5;82E5;82E5; # (若; 若; 若; 若; 若; ) CJK COMPATIBILITY IDEOGRAPH-2F998 +2F999;831D;831D;831D;831D; # (茝; 茝; 茝; 茝; 茝; ) CJK COMPATIBILITY IDEOGRAPH-2F999 +2F99A;8363;8363;8363;8363; # (荣; 荣; 荣; 荣; 荣; ) CJK COMPATIBILITY IDEOGRAPH-2F99A +2F99B;83AD;83AD;83AD;83AD; # (莭; 莭; 莭; 莭; 莭; ) CJK COMPATIBILITY IDEOGRAPH-2F99B +2F99C;8323;8323;8323;8323; # (茣; 茣; 茣; 茣; 茣; ) CJK COMPATIBILITY IDEOGRAPH-2F99C +2F99D;83BD;83BD;83BD;83BD; # (莽; 莽; 莽; 莽; 莽; ) CJK COMPATIBILITY IDEOGRAPH-2F99D +2F99E;83E7;83E7;83E7;83E7; # (菧; 菧; 菧; 菧; 菧; ) CJK COMPATIBILITY IDEOGRAPH-2F99E +2F99F;8457;8457;8457;8457; # (著; 著; 著; 著; 著; ) CJK COMPATIBILITY IDEOGRAPH-2F99F +2F9A0;8353;8353;8353;8353; # (荓; 荓; 荓; 荓; 荓; ) CJK COMPATIBILITY IDEOGRAPH-2F9A0 +2F9A1;83CA;83CA;83CA;83CA; # (菊; 菊; 菊; 菊; 菊; ) CJK COMPATIBILITY IDEOGRAPH-2F9A1 +2F9A2;83CC;83CC;83CC;83CC; # (菌; 菌; 菌; 菌; 菌; ) CJK COMPATIBILITY IDEOGRAPH-2F9A2 +2F9A3;83DC;83DC;83DC;83DC; # (菜; 菜; 菜; 菜; 菜; ) CJK COMPATIBILITY IDEOGRAPH-2F9A3 +2F9A4;26C36;26C36;26C36;26C36; # (𦰶; 𦰶; 𦰶; 𦰶; 𦰶; ) CJK COMPATIBILITY IDEOGRAPH-2F9A4 +2F9A5;26D6B;26D6B;26D6B;26D6B; # (𦵫; 𦵫; 𦵫; 𦵫; 𦵫; ) CJK COMPATIBILITY IDEOGRAPH-2F9A5 +2F9A6;26CD5;26CD5;26CD5;26CD5; # (𦳕; 𦳕; 𦳕; 𦳕; 𦳕; ) CJK COMPATIBILITY IDEOGRAPH-2F9A6 +2F9A7;452B;452B;452B;452B; # (䔫; 䔫; 䔫; 䔫; 䔫; ) CJK COMPATIBILITY IDEOGRAPH-2F9A7 +2F9A8;84F1;84F1;84F1;84F1; # (蓱; 蓱; 蓱; 蓱; 蓱; ) CJK COMPATIBILITY IDEOGRAPH-2F9A8 +2F9A9;84F3;84F3;84F3;84F3; # (蓳; 蓳; 蓳; 蓳; 蓳; ) CJK COMPATIBILITY IDEOGRAPH-2F9A9 +2F9AA;8516;8516;8516;8516; # (蔖; 蔖; 蔖; 蔖; 蔖; ) CJK COMPATIBILITY IDEOGRAPH-2F9AA +2F9AB;273CA;273CA;273CA;273CA; # (𧏊; 𧏊; 𧏊; 𧏊; 𧏊; ) CJK COMPATIBILITY IDEOGRAPH-2F9AB +2F9AC;8564;8564;8564;8564; # (蕤; 蕤; 蕤; 蕤; 蕤; ) CJK COMPATIBILITY IDEOGRAPH-2F9AC +2F9AD;26F2C;26F2C;26F2C;26F2C; # (𦼬; 𦼬; 𦼬; 𦼬; 𦼬; ) CJK COMPATIBILITY IDEOGRAPH-2F9AD +2F9AE;455D;455D;455D;455D; # (䕝; 䕝; 䕝; 䕝; 䕝; ) CJK COMPATIBILITY IDEOGRAPH-2F9AE +2F9AF;4561;4561;4561;4561; # (䕡; 䕡; 䕡; 䕡; 䕡; ) CJK COMPATIBILITY IDEOGRAPH-2F9AF +2F9B0;26FB1;26FB1;26FB1;26FB1; # (𦾱; 𦾱; 𦾱; 𦾱; 𦾱; ) CJK COMPATIBILITY IDEOGRAPH-2F9B0 +2F9B1;270D2;270D2;270D2;270D2; # (𧃒; 𧃒; 𧃒; 𧃒; 𧃒; ) CJK COMPATIBILITY IDEOGRAPH-2F9B1 +2F9B2;456B;456B;456B;456B; # (䕫; 䕫; 䕫; 䕫; 䕫; ) CJK COMPATIBILITY IDEOGRAPH-2F9B2 +2F9B3;8650;8650;8650;8650; # (虐; 虐; 虐; 虐; 虐; ) CJK COMPATIBILITY IDEOGRAPH-2F9B3 +2F9B4;865C;865C;865C;865C; # (虜; 虜; 虜; 虜; 虜; ) CJK COMPATIBILITY IDEOGRAPH-2F9B4 +2F9B5;8667;8667;8667;8667; # (虧; 虧; 虧; 虧; 虧; ) CJK COMPATIBILITY IDEOGRAPH-2F9B5 +2F9B6;8669;8669;8669;8669; # (虩; 虩; 虩; 虩; 虩; ) CJK COMPATIBILITY IDEOGRAPH-2F9B6 +2F9B7;86A9;86A9;86A9;86A9; # (蚩; 蚩; 蚩; 蚩; 蚩; ) CJK COMPATIBILITY IDEOGRAPH-2F9B7 +2F9B8;8688;8688;8688;8688; # (蚈; 蚈; 蚈; 蚈; 蚈; ) CJK COMPATIBILITY IDEOGRAPH-2F9B8 +2F9B9;870E;870E;870E;870E; # (蜎; 蜎; 蜎; 蜎; 蜎; ) CJK COMPATIBILITY IDEOGRAPH-2F9B9 +2F9BA;86E2;86E2;86E2;86E2; # (蛢; 蛢; 蛢; 蛢; 蛢; ) CJK COMPATIBILITY IDEOGRAPH-2F9BA +2F9BB;8779;8779;8779;8779; # (蝹; 蝹; 蝹; 蝹; 蝹; ) CJK COMPATIBILITY IDEOGRAPH-2F9BB +2F9BC;8728;8728;8728;8728; # (蜨; 蜨; 蜨; 蜨; 蜨; ) CJK COMPATIBILITY IDEOGRAPH-2F9BC +2F9BD;876B;876B;876B;876B; # (蝫; 蝫; 蝫; 蝫; 蝫; ) CJK COMPATIBILITY IDEOGRAPH-2F9BD +2F9BE;8786;8786;8786;8786; # (螆; 螆; 螆; 螆; 螆; ) CJK COMPATIBILITY IDEOGRAPH-2F9BE +2F9BF;45D7;45D7;45D7;45D7; # (䗗; 䗗; 䗗; 䗗; 䗗; ) CJK COMPATIBILITY IDEOGRAPH-2F9BF +2F9C0;87E1;87E1;87E1;87E1; # (蟡; 蟡; 蟡; 蟡; 蟡; ) CJK COMPATIBILITY IDEOGRAPH-2F9C0 +2F9C1;8801;8801;8801;8801; # (蠁; 蠁; 蠁; 蠁; 蠁; ) CJK COMPATIBILITY IDEOGRAPH-2F9C1 +2F9C2;45F9;45F9;45F9;45F9; # (䗹; 䗹; 䗹; 䗹; 䗹; ) CJK COMPATIBILITY IDEOGRAPH-2F9C2 +2F9C3;8860;8860;8860;8860; # (衠; 衠; 衠; 衠; 衠; ) CJK COMPATIBILITY IDEOGRAPH-2F9C3 +2F9C4;8863;8863;8863;8863; # (衣; 衣; 衣; 衣; 衣; ) CJK COMPATIBILITY IDEOGRAPH-2F9C4 +2F9C5;27667;27667;27667;27667; # (𧙧; 𧙧; 𧙧; 𧙧; 𧙧; ) CJK COMPATIBILITY IDEOGRAPH-2F9C5 +2F9C6;88D7;88D7;88D7;88D7; # (裗; 裗; 裗; 裗; 裗; ) CJK COMPATIBILITY IDEOGRAPH-2F9C6 +2F9C7;88DE;88DE;88DE;88DE; # (裞; 裞; 裞; 裞; 裞; ) CJK COMPATIBILITY IDEOGRAPH-2F9C7 +2F9C8;4635;4635;4635;4635; # (䘵; 䘵; 䘵; 䘵; 䘵; ) CJK COMPATIBILITY IDEOGRAPH-2F9C8 +2F9C9;88FA;88FA;88FA;88FA; # (裺; 裺; 裺; 裺; 裺; ) CJK COMPATIBILITY IDEOGRAPH-2F9C9 +2F9CA;34BB;34BB;34BB;34BB; # (㒻; 㒻; 㒻; 㒻; 㒻; ) CJK COMPATIBILITY IDEOGRAPH-2F9CA +2F9CB;278AE;278AE;278AE;278AE; # (𧢮; 𧢮; 𧢮; 𧢮; 𧢮; ) CJK COMPATIBILITY IDEOGRAPH-2F9CB +2F9CC;27966;27966;27966;27966; # (𧥦; 𧥦; 𧥦; 𧥦; 𧥦; ) CJK COMPATIBILITY IDEOGRAPH-2F9CC +2F9CD;46BE;46BE;46BE;46BE; # (䚾; 䚾; 䚾; 䚾; 䚾; ) CJK COMPATIBILITY IDEOGRAPH-2F9CD +2F9CE;46C7;46C7;46C7;46C7; # (䛇; 䛇; 䛇; 䛇; 䛇; ) CJK COMPATIBILITY IDEOGRAPH-2F9CE +2F9CF;8AA0;8AA0;8AA0;8AA0; # (誠; 誠; 誠; 誠; 誠; ) CJK COMPATIBILITY IDEOGRAPH-2F9CF +2F9D0;8AED;8AED;8AED;8AED; # (諭; 諭; 諭; 諭; 諭; ) CJK COMPATIBILITY IDEOGRAPH-2F9D0 +2F9D1;8B8A;8B8A;8B8A;8B8A; # (變; 變; 變; 變; 變; ) CJK COMPATIBILITY IDEOGRAPH-2F9D1 +2F9D2;8C55;8C55;8C55;8C55; # (豕; 豕; 豕; 豕; 豕; ) CJK COMPATIBILITY IDEOGRAPH-2F9D2 +2F9D3;27CA8;27CA8;27CA8;27CA8; # (𧲨; 𧲨; 𧲨; 𧲨; 𧲨; ) CJK COMPATIBILITY IDEOGRAPH-2F9D3 +2F9D4;8CAB;8CAB;8CAB;8CAB; # (貫; 貫; 貫; 貫; 貫; ) CJK COMPATIBILITY IDEOGRAPH-2F9D4 +2F9D5;8CC1;8CC1;8CC1;8CC1; # (賁; 賁; 賁; 賁; 賁; ) CJK COMPATIBILITY IDEOGRAPH-2F9D5 +2F9D6;8D1B;8D1B;8D1B;8D1B; # (贛; 贛; 贛; 贛; 贛; ) CJK COMPATIBILITY IDEOGRAPH-2F9D6 +2F9D7;8D77;8D77;8D77;8D77; # (起; 起; 起; 起; 起; ) CJK COMPATIBILITY IDEOGRAPH-2F9D7 +2F9D8;27F2F;27F2F;27F2F;27F2F; # (𧼯; 𧼯; 𧼯; 𧼯; 𧼯; ) CJK COMPATIBILITY IDEOGRAPH-2F9D8 +2F9D9;20804;20804;20804;20804; # (𠠄; 𠠄; 𠠄; 𠠄; 𠠄; ) CJK COMPATIBILITY IDEOGRAPH-2F9D9 +2F9DA;8DCB;8DCB;8DCB;8DCB; # (跋; 跋; 跋; 跋; 跋; ) CJK COMPATIBILITY IDEOGRAPH-2F9DA +2F9DB;8DBC;8DBC;8DBC;8DBC; # (趼; 趼; 趼; 趼; 趼; ) CJK COMPATIBILITY IDEOGRAPH-2F9DB +2F9DC;8DF0;8DF0;8DF0;8DF0; # (跰; 跰; 跰; 跰; 跰; ) CJK COMPATIBILITY IDEOGRAPH-2F9DC +2F9DD;208DE;208DE;208DE;208DE; # (𠣞; 𠣞; 𠣞; 𠣞; 𠣞; ) CJK COMPATIBILITY IDEOGRAPH-2F9DD +2F9DE;8ED4;8ED4;8ED4;8ED4; # (軔; 軔; 軔; 軔; 軔; ) CJK COMPATIBILITY IDEOGRAPH-2F9DE +2F9DF;8F38;8F38;8F38;8F38; # (輸; 輸; 輸; 輸; 輸; ) CJK COMPATIBILITY IDEOGRAPH-2F9DF +2F9E0;285D2;285D2;285D2;285D2; # (𨗒; 𨗒; 𨗒; 𨗒; 𨗒; ) CJK COMPATIBILITY IDEOGRAPH-2F9E0 +2F9E1;285ED;285ED;285ED;285ED; # (𨗭; 𨗭; 𨗭; 𨗭; 𨗭; ) CJK COMPATIBILITY IDEOGRAPH-2F9E1 +2F9E2;9094;9094;9094;9094; # (邔; 邔; 邔; 邔; 邔; ) CJK COMPATIBILITY IDEOGRAPH-2F9E2 +2F9E3;90F1;90F1;90F1;90F1; # (郱; 郱; 郱; 郱; 郱; ) CJK COMPATIBILITY IDEOGRAPH-2F9E3 +2F9E4;9111;9111;9111;9111; # (鄑; 鄑; 鄑; 鄑; 鄑; ) CJK COMPATIBILITY IDEOGRAPH-2F9E4 +2F9E5;2872E;2872E;2872E;2872E; # (𨜮; 𨜮; 𨜮; 𨜮; 𨜮; ) CJK COMPATIBILITY IDEOGRAPH-2F9E5 +2F9E6;911B;911B;911B;911B; # (鄛; 鄛; 鄛; 鄛; 鄛; ) CJK COMPATIBILITY IDEOGRAPH-2F9E6 +2F9E7;9238;9238;9238;9238; # (鈸; 鈸; 鈸; 鈸; 鈸; ) CJK COMPATIBILITY IDEOGRAPH-2F9E7 +2F9E8;92D7;92D7;92D7;92D7; # (鋗; 鋗; 鋗; 鋗; 鋗; ) CJK COMPATIBILITY IDEOGRAPH-2F9E8 +2F9E9;92D8;92D8;92D8;92D8; # (鋘; 鋘; 鋘; 鋘; 鋘; ) CJK COMPATIBILITY IDEOGRAPH-2F9E9 +2F9EA;927C;927C;927C;927C; # (鉼; 鉼; 鉼; 鉼; 鉼; ) CJK COMPATIBILITY IDEOGRAPH-2F9EA +2F9EB;93F9;93F9;93F9;93F9; # (鏹; 鏹; 鏹; 鏹; 鏹; ) CJK COMPATIBILITY IDEOGRAPH-2F9EB +2F9EC;9415;9415;9415;9415; # (鐕; 鐕; 鐕; 鐕; 鐕; ) CJK COMPATIBILITY IDEOGRAPH-2F9EC +2F9ED;28BFA;28BFA;28BFA;28BFA; # (𨯺; 𨯺; 𨯺; 𨯺; 𨯺; ) CJK COMPATIBILITY IDEOGRAPH-2F9ED +2F9EE;958B;958B;958B;958B; # (開; 開; 開; 開; 開; ) CJK COMPATIBILITY IDEOGRAPH-2F9EE +2F9EF;4995;4995;4995;4995; # (䦕; 䦕; 䦕; 䦕; 䦕; ) CJK COMPATIBILITY IDEOGRAPH-2F9EF +2F9F0;95B7;95B7;95B7;95B7; # (閷; 閷; 閷; 閷; 閷; ) CJK COMPATIBILITY IDEOGRAPH-2F9F0 +2F9F1;28D77;28D77;28D77;28D77; # (𨵷; 𨵷; 𨵷; 𨵷; 𨵷; ) CJK COMPATIBILITY IDEOGRAPH-2F9F1 +2F9F2;49E6;49E6;49E6;49E6; # (䧦; 䧦; 䧦; 䧦; 䧦; ) CJK COMPATIBILITY IDEOGRAPH-2F9F2 +2F9F3;96C3;96C3;96C3;96C3; # (雃; 雃; 雃; 雃; 雃; ) CJK COMPATIBILITY IDEOGRAPH-2F9F3 +2F9F4;5DB2;5DB2;5DB2;5DB2; # (嶲; 嶲; 嶲; 嶲; 嶲; ) CJK COMPATIBILITY IDEOGRAPH-2F9F4 +2F9F5;9723;9723;9723;9723; # (霣; 霣; 霣; 霣; 霣; ) CJK COMPATIBILITY IDEOGRAPH-2F9F5 +2F9F6;29145;29145;29145;29145; # (𩅅; 𩅅; 𩅅; 𩅅; 𩅅; ) CJK COMPATIBILITY IDEOGRAPH-2F9F6 +2F9F7;2921A;2921A;2921A;2921A; # (𩈚; 𩈚; 𩈚; 𩈚; 𩈚; ) CJK COMPATIBILITY IDEOGRAPH-2F9F7 +2F9F8;4A6E;4A6E;4A6E;4A6E; # (䩮; 䩮; 䩮; 䩮; 䩮; ) CJK COMPATIBILITY IDEOGRAPH-2F9F8 +2F9F9;4A76;4A76;4A76;4A76; # (䩶; 䩶; 䩶; 䩶; 䩶; ) CJK COMPATIBILITY IDEOGRAPH-2F9F9 +2F9FA;97E0;97E0;97E0;97E0; # (韠; 韠; 韠; 韠; 韠; ) CJK COMPATIBILITY IDEOGRAPH-2F9FA +2F9FB;2940A;2940A;2940A;2940A; # (𩐊; 𩐊; 𩐊; 𩐊; 𩐊; ) CJK COMPATIBILITY IDEOGRAPH-2F9FB +2F9FC;4AB2;4AB2;4AB2;4AB2; # (䪲; 䪲; 䪲; 䪲; 䪲; ) CJK COMPATIBILITY IDEOGRAPH-2F9FC +2F9FD;29496;29496;29496;29496; # (𩒖; 𩒖; 𩒖; 𩒖; 𩒖; ) CJK COMPATIBILITY IDEOGRAPH-2F9FD +2F9FE;980B;980B;980B;980B; # (頋; 頋; 頋; 頋; 頋; ) CJK COMPATIBILITY IDEOGRAPH-2F9FE +2F9FF;980B;980B;980B;980B; # (頋; 頋; 頋; 頋; 頋; ) CJK COMPATIBILITY IDEOGRAPH-2F9FF +2FA00;9829;9829;9829;9829; # (頩; 頩; 頩; 頩; 頩; ) CJK COMPATIBILITY IDEOGRAPH-2FA00 +2FA01;295B6;295B6;295B6;295B6; # (𩖶; 𩖶; 𩖶; 𩖶; 𩖶; ) CJK COMPATIBILITY IDEOGRAPH-2FA01 +2FA02;98E2;98E2;98E2;98E2; # (飢; 飢; 飢; 飢; 飢; ) CJK COMPATIBILITY IDEOGRAPH-2FA02 +2FA03;4B33;4B33;4B33;4B33; # (䬳; 䬳; 䬳; 䬳; 䬳; ) CJK COMPATIBILITY IDEOGRAPH-2FA03 +2FA04;9929;9929;9929;9929; # (餩; 餩; 餩; 餩; 餩; ) CJK COMPATIBILITY IDEOGRAPH-2FA04 +2FA05;99A7;99A7;99A7;99A7; # (馧; 馧; 馧; 馧; 馧; ) CJK COMPATIBILITY IDEOGRAPH-2FA05 +2FA06;99C2;99C2;99C2;99C2; # (駂; 駂; 駂; 駂; 駂; ) CJK COMPATIBILITY IDEOGRAPH-2FA06 +2FA07;99FE;99FE;99FE;99FE; # (駾; 駾; 駾; 駾; 駾; ) CJK COMPATIBILITY IDEOGRAPH-2FA07 +2FA08;4BCE;4BCE;4BCE;4BCE; # (䯎; 䯎; 䯎; 䯎; 䯎; ) CJK COMPATIBILITY IDEOGRAPH-2FA08 +2FA09;29B30;29B30;29B30;29B30; # (𩬰; 𩬰; 𩬰; 𩬰; 𩬰; ) CJK COMPATIBILITY IDEOGRAPH-2FA09 +2FA0A;9B12;9B12;9B12;9B12; # (鬒; 鬒; 鬒; 鬒; 鬒; ) CJK COMPATIBILITY IDEOGRAPH-2FA0A +2FA0B;9C40;9C40;9C40;9C40; # (鱀; 鱀; 鱀; 鱀; 鱀; ) CJK COMPATIBILITY IDEOGRAPH-2FA0B +2FA0C;9CFD;9CFD;9CFD;9CFD; # (鳽; 鳽; 鳽; 鳽; 鳽; ) CJK COMPATIBILITY IDEOGRAPH-2FA0C +2FA0D;4CCE;4CCE;4CCE;4CCE; # (䳎; 䳎; 䳎; 䳎; 䳎; ) CJK COMPATIBILITY IDEOGRAPH-2FA0D +2FA0E;4CED;4CED;4CED;4CED; # (䳭; 䳭; 䳭; 䳭; 䳭; ) CJK COMPATIBILITY IDEOGRAPH-2FA0E +2FA0F;9D67;9D67;9D67;9D67; # (鵧; 鵧; 鵧; 鵧; 鵧; ) CJK COMPATIBILITY IDEOGRAPH-2FA0F +2FA10;2A0CE;2A0CE;2A0CE;2A0CE; # (𪃎; 𪃎; 𪃎; 𪃎; 𪃎; ) CJK COMPATIBILITY IDEOGRAPH-2FA10 +2FA11;4CF8;4CF8;4CF8;4CF8; # (䳸; 䳸; 䳸; 䳸; 䳸; ) CJK COMPATIBILITY IDEOGRAPH-2FA11 +2FA12;2A105;2A105;2A105;2A105; # (𪄅; 𪄅; 𪄅; 𪄅; 𪄅; ) CJK COMPATIBILITY IDEOGRAPH-2FA12 +2FA13;2A20E;2A20E;2A20E;2A20E; # (𪈎; 𪈎; 𪈎; 𪈎; 𪈎; ) CJK COMPATIBILITY IDEOGRAPH-2FA13 +2FA14;2A291;2A291;2A291;2A291; # (𪊑; 𪊑; 𪊑; 𪊑; 𪊑; ) CJK COMPATIBILITY IDEOGRAPH-2FA14 +2FA15;9EBB;9EBB;9EBB;9EBB; # (麻; 麻; 麻; 麻; 麻; ) CJK COMPATIBILITY IDEOGRAPH-2FA15 +2FA16;4D56;4D56;4D56;4D56; # (䵖; 䵖; 䵖; 䵖; 䵖; ) CJK COMPATIBILITY IDEOGRAPH-2FA16 +2FA17;9EF9;9EF9;9EF9;9EF9; # (黹; 黹; 黹; 黹; 黹; ) CJK COMPATIBILITY IDEOGRAPH-2FA17 +2FA18;9EFE;9EFE;9EFE;9EFE; # (黾; 黾; 黾; 黾; 黾; ) CJK COMPATIBILITY IDEOGRAPH-2FA18 +2FA19;9F05;9F05;9F05;9F05; # (鼅; 鼅; 鼅; 鼅; 鼅; ) CJK COMPATIBILITY IDEOGRAPH-2FA19 +2FA1A;9F0F;9F0F;9F0F;9F0F; # (鼏; 鼏; 鼏; 鼏; 鼏; ) CJK COMPATIBILITY IDEOGRAPH-2FA1A +2FA1B;9F16;9F16;9F16;9F16; # (鼖; 鼖; 鼖; 鼖; 鼖; ) CJK COMPATIBILITY IDEOGRAPH-2FA1B +2FA1C;9F3B;9F3B;9F3B;9F3B; # (鼻; 鼻; 鼻; 鼻; 鼻; ) CJK COMPATIBILITY IDEOGRAPH-2FA1C +2FA1D;2A600;2A600;2A600;2A600; # (𪘀; 𪘀; 𪘀; 𪘀; 𪘀; ) CJK COMPATIBILITY IDEOGRAPH-2FA1D +# +@Part2 # Canonical Order Test +# +0061 0315 0300 05AE 0300 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062; # (a◌̕◌̀◌֮◌̀b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 0300 0315 0300 05AE 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062; # (a◌̀◌̕◌̀◌֮b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0301 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062; # (a◌̕◌̀◌֮◌́b; à◌֮◌́◌̕b; a◌֮◌̀◌́◌̕b; à◌֮◌́◌̕b; a◌֮◌̀◌́◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ACUTE ACCENT, LATIN SMALL LETTER B +0061 0301 0315 0300 05AE 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062; # (a◌́◌̕◌̀◌֮b; á◌֮◌̀◌̕b; a◌֮◌́◌̀◌̕b; á◌֮◌̀◌̕b; a◌֮◌́◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ACUTE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0302 0062;00E0 05AE 0302 0315 0062;0061 05AE 0300 0302 0315 0062;00E0 05AE 0302 0315 0062;0061 05AE 0300 0302 0315 0062; # (a◌̕◌̀◌֮◌̂b; à◌֮◌̂◌̕b; a◌֮◌̀◌̂◌̕b; à◌֮◌̂◌̕b; a◌֮◌̀◌̂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CIRCUMFLEX ACCENT, LATIN SMALL LETTER B +0061 0302 0315 0300 05AE 0062;1EA7 05AE 0315 0062;0061 05AE 0302 0300 0315 0062;1EA7 05AE 0315 0062;0061 05AE 0302 0300 0315 0062; # (a◌̂◌̕◌̀◌֮b; ầ◌֮◌̕b; a◌֮◌̂◌̀◌̕b; ầ◌֮◌̕b; a◌֮◌̂◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CIRCUMFLEX ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0303 0062;00E0 05AE 0303 0315 0062;0061 05AE 0300 0303 0315 0062;00E0 05AE 0303 0315 0062;0061 05AE 0300 0303 0315 0062; # (a◌̕◌̀◌֮◌̃b; à◌֮◌̃◌̕b; a◌֮◌̀◌̃◌̕b; à◌֮◌̃◌̕b; a◌֮◌̀◌̃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING TILDE, LATIN SMALL LETTER B +0061 0303 0315 0300 05AE 0062;00E3 05AE 0300 0315 0062;0061 05AE 0303 0300 0315 0062;00E3 05AE 0300 0315 0062;0061 05AE 0303 0300 0315 0062; # (a◌̃◌̕◌̀◌֮b; ã◌֮◌̀◌̕b; a◌֮◌̃◌̀◌̕b; ã◌֮◌̀◌̕b; a◌֮◌̃◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING TILDE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0304 0062;00E0 05AE 0304 0315 0062;0061 05AE 0300 0304 0315 0062;00E0 05AE 0304 0315 0062;0061 05AE 0300 0304 0315 0062; # (a◌̕◌̀◌֮◌̄b; à◌֮◌̄◌̕b; a◌֮◌̀◌̄◌̕b; à◌֮◌̄◌̕b; a◌֮◌̀◌̄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING MACRON, LATIN SMALL LETTER B +0061 0304 0315 0300 05AE 0062;0101 05AE 0300 0315 0062;0061 05AE 0304 0300 0315 0062;0101 05AE 0300 0315 0062;0061 05AE 0304 0300 0315 0062; # (a◌̄◌̕◌̀◌֮b; ā◌֮◌̀◌̕b; a◌֮◌̄◌̀◌̕b; ā◌֮◌̀◌̕b; a◌֮◌̄◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING MACRON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0305 0062;00E0 05AE 0305 0315 0062;0061 05AE 0300 0305 0315 0062;00E0 05AE 0305 0315 0062;0061 05AE 0300 0305 0315 0062; # (a◌̕◌̀◌֮◌̅b; à◌֮◌̅◌̕b; a◌֮◌̀◌̅◌̕b; à◌֮◌̅◌̕b; a◌֮◌̀◌̅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING OVERLINE, LATIN SMALL LETTER B +0061 0305 0315 0300 05AE 0062;0061 05AE 0305 0300 0315 0062;0061 05AE 0305 0300 0315 0062;0061 05AE 0305 0300 0315 0062;0061 05AE 0305 0300 0315 0062; # (a◌̅◌̕◌̀◌֮b; a◌֮◌̅◌̀◌̕b; a◌֮◌̅◌̀◌̕b; a◌֮◌̅◌̀◌̕b; a◌֮◌̅◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING OVERLINE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0306 0062;00E0 05AE 0306 0315 0062;0061 05AE 0300 0306 0315 0062;00E0 05AE 0306 0315 0062;0061 05AE 0300 0306 0315 0062; # (a◌̕◌̀◌֮◌̆b; à◌֮◌̆◌̕b; a◌֮◌̀◌̆◌̕b; à◌֮◌̆◌̕b; a◌֮◌̀◌̆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING BREVE, LATIN SMALL LETTER B +0061 0306 0315 0300 05AE 0062;1EB1 05AE 0315 0062;0061 05AE 0306 0300 0315 0062;1EB1 05AE 0315 0062;0061 05AE 0306 0300 0315 0062; # (a◌̆◌̕◌̀◌֮b; ằ◌֮◌̕b; a◌֮◌̆◌̀◌̕b; ằ◌֮◌̕b; a◌֮◌̆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING BREVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0307 0062;00E0 05AE 0307 0315 0062;0061 05AE 0300 0307 0315 0062;00E0 05AE 0307 0315 0062;0061 05AE 0300 0307 0315 0062; # (a◌̕◌̀◌֮◌̇b; à◌֮◌̇◌̕b; a◌֮◌̀◌̇◌̕b; à◌֮◌̇◌̕b; a◌֮◌̀◌̇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOT ABOVE, LATIN SMALL LETTER B +0061 0307 0315 0300 05AE 0062;0227 05AE 0300 0315 0062;0061 05AE 0307 0300 0315 0062;0227 05AE 0300 0315 0062;0061 05AE 0307 0300 0315 0062; # (a◌̇◌̕◌̀◌֮b; ȧ◌֮◌̀◌̕b; a◌֮◌̇◌̀◌̕b; ȧ◌֮◌̀◌̕b; a◌֮◌̇◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0308 0062;00E0 05AE 0308 0315 0062;0061 05AE 0300 0308 0315 0062;00E0 05AE 0308 0315 0062;0061 05AE 0300 0308 0315 0062; # (a◌̕◌̀◌֮◌̈b; à◌֮◌̈◌̕b; a◌֮◌̀◌̈◌̕b; à◌֮◌̈◌̕b; a◌֮◌̀◌̈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DIAERESIS, LATIN SMALL LETTER B +0061 0308 0315 0300 05AE 0062;00E4 05AE 0300 0315 0062;0061 05AE 0308 0300 0315 0062;00E4 05AE 0300 0315 0062;0061 05AE 0308 0300 0315 0062; # (a◌̈◌̕◌̀◌֮b; ä◌֮◌̀◌̕b; a◌֮◌̈◌̀◌̕b; ä◌֮◌̀◌̕b; a◌֮◌̈◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DIAERESIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0309 0062;00E0 05AE 0309 0315 0062;0061 05AE 0300 0309 0315 0062;00E0 05AE 0309 0315 0062;0061 05AE 0300 0309 0315 0062; # (a◌̕◌̀◌֮◌̉b; à◌֮◌̉◌̕b; a◌֮◌̀◌̉◌̕b; à◌֮◌̉◌̕b; a◌֮◌̀◌̉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING HOOK ABOVE, LATIN SMALL LETTER B +0061 0309 0315 0300 05AE 0062;1EA3 05AE 0300 0315 0062;0061 05AE 0309 0300 0315 0062;1EA3 05AE 0300 0315 0062;0061 05AE 0309 0300 0315 0062; # (a◌̉◌̕◌̀◌֮b; ả◌֮◌̀◌̕b; a◌֮◌̉◌̀◌̕b; ả◌֮◌̀◌̕b; a◌֮◌̉◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING HOOK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030A 0062;00E0 05AE 030A 0315 0062;0061 05AE 0300 030A 0315 0062;00E0 05AE 030A 0315 0062;0061 05AE 0300 030A 0315 0062; # (a◌̕◌̀◌֮◌̊b; à◌֮◌̊◌̕b; a◌֮◌̀◌̊◌̕b; à◌֮◌̊◌̕b; a◌֮◌̀◌̊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RING ABOVE, LATIN SMALL LETTER B +0061 030A 0315 0300 05AE 0062;00E5 05AE 0300 0315 0062;0061 05AE 030A 0300 0315 0062;00E5 05AE 0300 0315 0062;0061 05AE 030A 0300 0315 0062; # (a◌̊◌̕◌̀◌֮b; å◌֮◌̀◌̕b; a◌֮◌̊◌̀◌̕b; å◌֮◌̀◌̕b; a◌֮◌̊◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RING ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030B 0062;00E0 05AE 030B 0315 0062;0061 05AE 0300 030B 0315 0062;00E0 05AE 030B 0315 0062;0061 05AE 0300 030B 0315 0062; # (a◌̕◌̀◌֮◌̋b; à◌֮◌̋◌̕b; a◌֮◌̀◌̋◌̕b; à◌֮◌̋◌̕b; a◌֮◌̀◌̋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE ACUTE ACCENT, LATIN SMALL LETTER B +0061 030B 0315 0300 05AE 0062;0061 05AE 030B 0300 0315 0062;0061 05AE 030B 0300 0315 0062;0061 05AE 030B 0300 0315 0062;0061 05AE 030B 0300 0315 0062; # (a◌̋◌̕◌̀◌֮b; a◌֮◌̋◌̀◌̕b; a◌֮◌̋◌̀◌̕b; a◌֮◌̋◌̀◌̕b; a◌֮◌̋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE ACUTE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030C 0062;00E0 05AE 030C 0315 0062;0061 05AE 0300 030C 0315 0062;00E0 05AE 030C 0315 0062;0061 05AE 0300 030C 0315 0062; # (a◌̕◌̀◌֮◌̌b; à◌֮◌̌◌̕b; a◌֮◌̀◌̌◌̕b; à◌֮◌̌◌̕b; a◌֮◌̀◌̌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CARON, LATIN SMALL LETTER B +0061 030C 0315 0300 05AE 0062;01CE 05AE 0300 0315 0062;0061 05AE 030C 0300 0315 0062;01CE 05AE 0300 0315 0062;0061 05AE 030C 0300 0315 0062; # (a◌̌◌̕◌̀◌֮b; ǎ◌֮◌̀◌̕b; a◌֮◌̌◌̀◌̕b; ǎ◌֮◌̀◌̕b; a◌֮◌̌◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CARON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030D 0062;00E0 05AE 030D 0315 0062;0061 05AE 0300 030D 0315 0062;00E0 05AE 030D 0315 0062;0061 05AE 0300 030D 0315 0062; # (a◌̕◌̀◌֮◌̍b; à◌֮◌̍◌̕b; a◌֮◌̀◌̍◌̕b; à◌֮◌̍◌̕b; a◌֮◌̀◌̍◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING VERTICAL LINE ABOVE, LATIN SMALL LETTER B +0061 030D 0315 0300 05AE 0062;0061 05AE 030D 0300 0315 0062;0061 05AE 030D 0300 0315 0062;0061 05AE 030D 0300 0315 0062;0061 05AE 030D 0300 0315 0062; # (a◌̍◌̕◌̀◌֮b; a◌֮◌̍◌̀◌̕b; a◌֮◌̍◌̀◌̕b; a◌֮◌̍◌̀◌̕b; a◌֮◌̍◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING VERTICAL LINE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030E 0062;00E0 05AE 030E 0315 0062;0061 05AE 0300 030E 0315 0062;00E0 05AE 030E 0315 0062;0061 05AE 0300 030E 0315 0062; # (a◌̕◌̀◌֮◌̎b; à◌֮◌̎◌̕b; a◌֮◌̀◌̎◌̕b; à◌֮◌̎◌̕b; a◌֮◌̀◌̎◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE VERTICAL LINE ABOVE, LATIN SMALL LETTER B +0061 030E 0315 0300 05AE 0062;0061 05AE 030E 0300 0315 0062;0061 05AE 030E 0300 0315 0062;0061 05AE 030E 0300 0315 0062;0061 05AE 030E 0300 0315 0062; # (a◌̎◌̕◌̀◌֮b; a◌֮◌̎◌̀◌̕b; a◌֮◌̎◌̀◌̕b; a◌֮◌̎◌̀◌̕b; a◌֮◌̎◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE VERTICAL LINE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 030F 0062;00E0 05AE 030F 0315 0062;0061 05AE 0300 030F 0315 0062;00E0 05AE 030F 0315 0062;0061 05AE 0300 030F 0315 0062; # (a◌̕◌̀◌֮◌̏b; à◌֮◌̏◌̕b; a◌֮◌̀◌̏◌̕b; à◌֮◌̏◌̕b; a◌֮◌̀◌̏◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE GRAVE ACCENT, LATIN SMALL LETTER B +0061 030F 0315 0300 05AE 0062;0201 05AE 0300 0315 0062;0061 05AE 030F 0300 0315 0062;0201 05AE 0300 0315 0062;0061 05AE 030F 0300 0315 0062; # (a◌̏◌̕◌̀◌֮b; ȁ◌֮◌̀◌̕b; a◌֮◌̏◌̀◌̕b; ȁ◌֮◌̀◌̕b; a◌֮◌̏◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0310 0062;00E0 05AE 0310 0315 0062;0061 05AE 0300 0310 0315 0062;00E0 05AE 0310 0315 0062;0061 05AE 0300 0310 0315 0062; # (a◌̕◌̀◌֮◌̐b; à◌֮◌̐◌̕b; a◌֮◌̀◌̐◌̕b; à◌֮◌̐◌̕b; a◌֮◌̀◌̐◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CANDRABINDU, LATIN SMALL LETTER B +0061 0310 0315 0300 05AE 0062;0061 05AE 0310 0300 0315 0062;0061 05AE 0310 0300 0315 0062;0061 05AE 0310 0300 0315 0062;0061 05AE 0310 0300 0315 0062; # (a◌̐◌̕◌̀◌֮b; a◌֮◌̐◌̀◌̕b; a◌֮◌̐◌̀◌̕b; a◌֮◌̐◌̀◌̕b; a◌֮◌̐◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CANDRABINDU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0311 0062;00E0 05AE 0311 0315 0062;0061 05AE 0300 0311 0315 0062;00E0 05AE 0311 0315 0062;0061 05AE 0300 0311 0315 0062; # (a◌̕◌̀◌֮◌̑b; à◌֮◌̑◌̕b; a◌֮◌̀◌̑◌̕b; à◌֮◌̑◌̕b; a◌֮◌̀◌̑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING INVERTED BREVE, LATIN SMALL LETTER B +0061 0311 0315 0300 05AE 0062;0203 05AE 0300 0315 0062;0061 05AE 0311 0300 0315 0062;0203 05AE 0300 0315 0062;0061 05AE 0311 0300 0315 0062; # (a◌̑◌̕◌̀◌֮b; ȃ◌֮◌̀◌̕b; a◌֮◌̑◌̀◌̕b; ȃ◌֮◌̀◌̕b; a◌֮◌̑◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING INVERTED BREVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0312 0062;00E0 05AE 0312 0315 0062;0061 05AE 0300 0312 0315 0062;00E0 05AE 0312 0315 0062;0061 05AE 0300 0312 0315 0062; # (a◌̕◌̀◌֮◌̒b; à◌֮◌̒◌̕b; a◌֮◌̀◌̒◌̕b; à◌֮◌̒◌̕b; a◌֮◌̀◌̒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING TURNED COMMA ABOVE, LATIN SMALL LETTER B +0061 0312 0315 0300 05AE 0062;0061 05AE 0312 0300 0315 0062;0061 05AE 0312 0300 0315 0062;0061 05AE 0312 0300 0315 0062;0061 05AE 0312 0300 0315 0062; # (a◌̒◌̕◌̀◌֮b; a◌֮◌̒◌̀◌̕b; a◌֮◌̒◌̀◌̕b; a◌֮◌̒◌̀◌̕b; a◌֮◌̒◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING TURNED COMMA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0313 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062; # (a◌̕◌̀◌֮◌̓b; à◌֮◌̓◌̕b; a◌֮◌̀◌̓◌̕b; à◌֮◌̓◌̕b; a◌֮◌̀◌̓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING COMMA ABOVE, LATIN SMALL LETTER B +0061 0313 0315 0300 05AE 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062; # (a◌̓◌̕◌̀◌֮b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0314 0062;00E0 05AE 0314 0315 0062;0061 05AE 0300 0314 0315 0062;00E0 05AE 0314 0315 0062;0061 05AE 0300 0314 0315 0062; # (a◌̕◌̀◌֮◌̔b; à◌֮◌̔◌̕b; a◌֮◌̀◌̔◌̕b; à◌֮◌̔◌̕b; a◌֮◌̀◌̔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING REVERSED COMMA ABOVE, LATIN SMALL LETTER B +0061 0314 0315 0300 05AE 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062; # (a◌̔◌̕◌̀◌֮b; a◌֮◌̔◌̀◌̕b; a◌֮◌̔◌̀◌̕b; a◌֮◌̔◌̀◌̕b; a◌֮◌̔◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING REVERSED COMMA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 035C 0315 0300 0315 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062; # (a◌͜◌̕◌̀◌̕b; à◌̕◌̕◌͜b; a◌̀◌̕◌̕◌͜b; à◌̕◌̕◌͜b; a◌̀◌̕◌̕◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, LATIN SMALL LETTER B +0061 0315 035C 0315 0300 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062; # (a◌̕◌͜◌̕◌̀b; à◌̕◌̕◌͜b; a◌̀◌̕◌̕◌͜b; à◌̕◌̕◌͜b; a◌̀◌̕◌̕◌͜b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0316 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062; # (a◌֚◌̖◌᷺◌̖b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B +0061 0316 059A 0316 1DFA 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062; # (a◌̖◌֚◌̖◌᷺b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0317 0062;0061 1DFA 0316 0317 059A 0062;0061 1DFA 0316 0317 059A 0062;0061 1DFA 0316 0317 059A 0062;0061 1DFA 0316 0317 059A 0062; # (a◌֚◌̖◌᷺◌̗b; a◌᷺◌̖◌̗◌֚b; a◌᷺◌̖◌̗◌֚b; a◌᷺◌̖◌̗◌֚b; a◌᷺◌̖◌̗◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING ACUTE ACCENT BELOW, LATIN SMALL LETTER B +0061 0317 059A 0316 1DFA 0062;0061 1DFA 0317 0316 059A 0062;0061 1DFA 0317 0316 059A 0062;0061 1DFA 0317 0316 059A 0062;0061 1DFA 0317 0316 059A 0062; # (a◌̗◌֚◌̖◌᷺b; a◌᷺◌̗◌̖◌֚b; a◌᷺◌̗◌̖◌֚b; a◌᷺◌̗◌̖◌֚b; a◌᷺◌̗◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ACUTE ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0318 0062;0061 1DFA 0316 0318 059A 0062;0061 1DFA 0316 0318 059A 0062;0061 1DFA 0316 0318 059A 0062;0061 1DFA 0316 0318 059A 0062; # (a◌֚◌̖◌᷺◌̘b; a◌᷺◌̖◌̘◌֚b; a◌᷺◌̖◌̘◌֚b; a◌᷺◌̖◌̘◌֚b; a◌᷺◌̖◌̘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT TACK BELOW, LATIN SMALL LETTER B +0061 0318 059A 0316 1DFA 0062;0061 1DFA 0318 0316 059A 0062;0061 1DFA 0318 0316 059A 0062;0061 1DFA 0318 0316 059A 0062;0061 1DFA 0318 0316 059A 0062; # (a◌̘◌֚◌̖◌᷺b; a◌᷺◌̘◌̖◌֚b; a◌᷺◌̘◌̖◌֚b; a◌᷺◌̘◌̖◌֚b; a◌᷺◌̘◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0319 0062;0061 1DFA 0316 0319 059A 0062;0061 1DFA 0316 0319 059A 0062;0061 1DFA 0316 0319 059A 0062;0061 1DFA 0316 0319 059A 0062; # (a◌֚◌̖◌᷺◌̙b; a◌᷺◌̖◌̙◌֚b; a◌᷺◌̖◌̙◌֚b; a◌᷺◌̖◌̙◌֚b; a◌᷺◌̖◌̙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT TACK BELOW, LATIN SMALL LETTER B +0061 0319 059A 0316 1DFA 0062;0061 1DFA 0319 0316 059A 0062;0061 1DFA 0319 0316 059A 0062;0061 1DFA 0319 0316 059A 0062;0061 1DFA 0319 0316 059A 0062; # (a◌̙◌֚◌̖◌᷺b; a◌᷺◌̙◌̖◌֚b; a◌᷺◌̙◌̖◌֚b; a◌᷺◌̙◌̖◌֚b; a◌᷺◌̙◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 035C 0315 0300 031A 0062;00E0 0315 031A 035C 0062;0061 0300 0315 031A 035C 0062;00E0 0315 031A 035C 0062;0061 0300 0315 031A 035C 0062; # (a◌͜◌̕◌̀◌̚b; à◌̕◌̚◌͜b; a◌̀◌̕◌̚◌͜b; à◌̕◌̚◌͜b; a◌̀◌̕◌̚◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, COMBINING LEFT ANGLE ABOVE, LATIN SMALL LETTER B +0061 031A 035C 0315 0300 0062;00E0 031A 0315 035C 0062;0061 0300 031A 0315 035C 0062;00E0 031A 0315 035C 0062;0061 0300 031A 0315 035C 0062; # (a◌̚◌͜◌̕◌̀b; à◌̚◌̕◌͜b; a◌̀◌̚◌̕◌͜b; à◌̚◌̕◌͜b; a◌̀◌̚◌̕◌͜b; ) LATIN SMALL LETTER A, COMBINING LEFT ANGLE ABOVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 1DFA 031B 1DCE 031B 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062; # (a◌᷺◌̛◌᷎◌̛b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, COMBINING HORN, LATIN SMALL LETTER B +0061 031B 1DFA 031B 1DCE 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062; # (a◌̛◌᷺◌̛◌᷎b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; ) LATIN SMALL LETTER A, COMBINING HORN, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B +0061 059A 0316 1DFA 031C 0062;0061 1DFA 0316 031C 059A 0062;0061 1DFA 0316 031C 059A 0062;0061 1DFA 0316 031C 059A 0062;0061 1DFA 0316 031C 059A 0062; # (a◌֚◌̖◌᷺◌̜b; a◌᷺◌̖◌̜◌֚b; a◌᷺◌̖◌̜◌֚b; a◌᷺◌̖◌̜◌֚b; a◌᷺◌̖◌̜◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT HALF RING BELOW, LATIN SMALL LETTER B +0061 031C 059A 0316 1DFA 0062;0061 1DFA 031C 0316 059A 0062;0061 1DFA 031C 0316 059A 0062;0061 1DFA 031C 0316 059A 0062;0061 1DFA 031C 0316 059A 0062; # (a◌̜◌֚◌̖◌᷺b; a◌᷺◌̜◌̖◌֚b; a◌᷺◌̜◌̖◌֚b; a◌᷺◌̜◌̖◌֚b; a◌᷺◌̜◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT HALF RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 031D 0062;0061 1DFA 0316 031D 059A 0062;0061 1DFA 0316 031D 059A 0062;0061 1DFA 0316 031D 059A 0062;0061 1DFA 0316 031D 059A 0062; # (a◌֚◌̖◌᷺◌̝b; a◌᷺◌̖◌̝◌֚b; a◌᷺◌̖◌̝◌֚b; a◌᷺◌̖◌̝◌֚b; a◌᷺◌̖◌̝◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING UP TACK BELOW, LATIN SMALL LETTER B +0061 031D 059A 0316 1DFA 0062;0061 1DFA 031D 0316 059A 0062;0061 1DFA 031D 0316 059A 0062;0061 1DFA 031D 0316 059A 0062;0061 1DFA 031D 0316 059A 0062; # (a◌̝◌֚◌̖◌᷺b; a◌᷺◌̝◌̖◌֚b; a◌᷺◌̝◌̖◌֚b; a◌᷺◌̝◌̖◌֚b; a◌᷺◌̝◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING UP TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 031E 0062;0061 1DFA 0316 031E 059A 0062;0061 1DFA 0316 031E 059A 0062;0061 1DFA 0316 031E 059A 0062;0061 1DFA 0316 031E 059A 0062; # (a◌֚◌̖◌᷺◌̞b; a◌᷺◌̖◌̞◌֚b; a◌᷺◌̖◌̞◌֚b; a◌᷺◌̖◌̞◌֚b; a◌᷺◌̖◌̞◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOWN TACK BELOW, LATIN SMALL LETTER B +0061 031E 059A 0316 1DFA 0062;0061 1DFA 031E 0316 059A 0062;0061 1DFA 031E 0316 059A 0062;0061 1DFA 031E 0316 059A 0062;0061 1DFA 031E 0316 059A 0062; # (a◌̞◌֚◌̖◌᷺b; a◌᷺◌̞◌̖◌֚b; a◌᷺◌̞◌̖◌֚b; a◌᷺◌̞◌̖◌֚b; a◌᷺◌̞◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOWN TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 031F 0062;0061 1DFA 0316 031F 059A 0062;0061 1DFA 0316 031F 059A 0062;0061 1DFA 0316 031F 059A 0062;0061 1DFA 0316 031F 059A 0062; # (a◌֚◌̖◌᷺◌̟b; a◌᷺◌̖◌̟◌֚b; a◌᷺◌̖◌̟◌֚b; a◌᷺◌̖◌̟◌֚b; a◌᷺◌̖◌̟◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING PLUS SIGN BELOW, LATIN SMALL LETTER B +0061 031F 059A 0316 1DFA 0062;0061 1DFA 031F 0316 059A 0062;0061 1DFA 031F 0316 059A 0062;0061 1DFA 031F 0316 059A 0062;0061 1DFA 031F 0316 059A 0062; # (a◌̟◌֚◌̖◌᷺b; a◌᷺◌̟◌̖◌֚b; a◌᷺◌̟◌̖◌֚b; a◌᷺◌̟◌̖◌֚b; a◌᷺◌̟◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING PLUS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0320 0062;0061 1DFA 0316 0320 059A 0062;0061 1DFA 0316 0320 059A 0062;0061 1DFA 0316 0320 059A 0062;0061 1DFA 0316 0320 059A 0062; # (a◌֚◌̖◌᷺◌̠b; a◌᷺◌̖◌̠◌֚b; a◌᷺◌̖◌̠◌֚b; a◌᷺◌̖◌̠◌֚b; a◌᷺◌̖◌̠◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING MINUS SIGN BELOW, LATIN SMALL LETTER B +0061 0320 059A 0316 1DFA 0062;0061 1DFA 0320 0316 059A 0062;0061 1DFA 0320 0316 059A 0062;0061 1DFA 0320 0316 059A 0062;0061 1DFA 0320 0316 059A 0062; # (a◌̠◌֚◌̖◌᷺b; a◌᷺◌̠◌̖◌֚b; a◌᷺◌̠◌̖◌֚b; a◌᷺◌̠◌̖◌֚b; a◌᷺◌̠◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MINUS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 1DCE 0321 0F74 0321 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062; # (a◌᷎◌̡◌ུ◌̡b; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 0321 1DCE 0321 0F74 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062; # (a◌̡◌᷎◌̡◌ུb; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING PALATALIZED HOOK BELOW, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 1DCE 0321 0F74 0322 0062;0061 0F74 0321 0322 1DCE 0062;0061 0F74 0321 0322 1DCE 0062;0061 0F74 0321 0322 1DCE 0062;0061 0F74 0321 0322 1DCE 0062; # (a◌᷎◌̡◌ུ◌̢b; a◌ུ◌̡◌̢◌᷎b; a◌ུ◌̡◌̢◌᷎b; a◌ུ◌̡◌̢◌᷎b; a◌ུ◌̡◌̢◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING RETROFLEX HOOK BELOW, LATIN SMALL LETTER B +0061 0322 1DCE 0321 0F74 0062;0061 0F74 0322 0321 1DCE 0062;0061 0F74 0322 0321 1DCE 0062;0061 0F74 0322 0321 1DCE 0062;0061 0F74 0322 0321 1DCE 0062; # (a◌̢◌᷎◌̡◌ུb; a◌ུ◌̢◌̡◌᷎b; a◌ུ◌̢◌̡◌᷎b; a◌ུ◌̢◌̡◌᷎b; a◌ུ◌̢◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING RETROFLEX HOOK BELOW, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0323 0062;0061 1DFA 0316 0323 059A 0062;0061 1DFA 0316 0323 059A 0062;0061 1DFA 0316 0323 059A 0062;0061 1DFA 0316 0323 059A 0062; # (a◌֚◌̖◌᷺◌̣b; a◌᷺◌̖◌̣◌֚b; a◌᷺◌̖◌̣◌֚b; a◌᷺◌̖◌̣◌֚b; a◌᷺◌̖◌̣◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOT BELOW, LATIN SMALL LETTER B +0061 0323 059A 0316 1DFA 0062;1EA1 1DFA 0316 059A 0062;0061 1DFA 0323 0316 059A 0062;1EA1 1DFA 0316 059A 0062;0061 1DFA 0323 0316 059A 0062; # (a◌̣◌֚◌̖◌᷺b; ạ◌᷺◌̖◌֚b; a◌᷺◌̣◌̖◌֚b; ạ◌᷺◌̖◌֚b; a◌᷺◌̣◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0324 0062;0061 1DFA 0316 0324 059A 0062;0061 1DFA 0316 0324 059A 0062;0061 1DFA 0316 0324 059A 0062;0061 1DFA 0316 0324 059A 0062; # (a◌֚◌̖◌᷺◌̤b; a◌᷺◌̖◌̤◌֚b; a◌᷺◌̖◌̤◌֚b; a◌᷺◌̖◌̤◌֚b; a◌᷺◌̖◌̤◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DIAERESIS BELOW, LATIN SMALL LETTER B +0061 0324 059A 0316 1DFA 0062;0061 1DFA 0324 0316 059A 0062;0061 1DFA 0324 0316 059A 0062;0061 1DFA 0324 0316 059A 0062;0061 1DFA 0324 0316 059A 0062; # (a◌̤◌֚◌̖◌᷺b; a◌᷺◌̤◌̖◌֚b; a◌᷺◌̤◌̖◌֚b; a◌᷺◌̤◌̖◌֚b; a◌᷺◌̤◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DIAERESIS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0325 0062;0061 1DFA 0316 0325 059A 0062;0061 1DFA 0316 0325 059A 0062;0061 1DFA 0316 0325 059A 0062;0061 1DFA 0316 0325 059A 0062; # (a◌֚◌̖◌᷺◌̥b; a◌᷺◌̖◌̥◌֚b; a◌᷺◌̖◌̥◌֚b; a◌᷺◌̖◌̥◌֚b; a◌᷺◌̖◌̥◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RING BELOW, LATIN SMALL LETTER B +0061 0325 059A 0316 1DFA 0062;1E01 1DFA 0316 059A 0062;0061 1DFA 0325 0316 059A 0062;1E01 1DFA 0316 059A 0062;0061 1DFA 0325 0316 059A 0062; # (a◌̥◌֚◌̖◌᷺b; ḁ◌᷺◌̖◌֚b; a◌᷺◌̥◌̖◌֚b; ḁ◌᷺◌̖◌֚b; a◌᷺◌̥◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0326 0062;0061 1DFA 0316 0326 059A 0062;0061 1DFA 0316 0326 059A 0062;0061 1DFA 0316 0326 059A 0062;0061 1DFA 0316 0326 059A 0062; # (a◌֚◌̖◌᷺◌̦b; a◌᷺◌̖◌̦◌֚b; a◌᷺◌̖◌̦◌֚b; a◌᷺◌̖◌̦◌֚b; a◌᷺◌̖◌̦◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING COMMA BELOW, LATIN SMALL LETTER B +0061 0326 059A 0316 1DFA 0062;0061 1DFA 0326 0316 059A 0062;0061 1DFA 0326 0316 059A 0062;0061 1DFA 0326 0316 059A 0062;0061 1DFA 0326 0316 059A 0062; # (a◌̦◌֚◌̖◌᷺b; a◌᷺◌̦◌̖◌֚b; a◌᷺◌̦◌̖◌֚b; a◌᷺◌̦◌̖◌֚b; a◌᷺◌̦◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING COMMA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 1DCE 0321 0F74 0327 0062;0061 0F74 0321 0327 1DCE 0062;0061 0F74 0321 0327 1DCE 0062;0061 0F74 0321 0327 1DCE 0062;0061 0F74 0321 0327 1DCE 0062; # (a◌᷎◌̡◌ུ◌̧b; a◌ུ◌̡◌̧◌᷎b; a◌ུ◌̡◌̧◌᷎b; a◌ུ◌̡◌̧◌᷎b; a◌ུ◌̡◌̧◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING CEDILLA, LATIN SMALL LETTER B +0061 0327 1DCE 0321 0F74 0062;0061 0F74 0327 0321 1DCE 0062;0061 0F74 0327 0321 1DCE 0062;0061 0F74 0327 0321 1DCE 0062;0061 0F74 0327 0321 1DCE 0062; # (a◌̧◌᷎◌̡◌ུb; a◌ུ◌̧◌̡◌᷎b; a◌ུ◌̧◌̡◌᷎b; a◌ུ◌̧◌̡◌᷎b; a◌ུ◌̧◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING CEDILLA, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 1DCE 0321 0F74 0328 0062;0061 0F74 0321 0328 1DCE 0062;0061 0F74 0321 0328 1DCE 0062;0061 0F74 0321 0328 1DCE 0062;0061 0F74 0321 0328 1DCE 0062; # (a◌᷎◌̡◌ུ◌̨b; a◌ུ◌̡◌̨◌᷎b; a◌ུ◌̡◌̨◌᷎b; a◌ུ◌̡◌̨◌᷎b; a◌ུ◌̡◌̨◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING OGONEK, LATIN SMALL LETTER B +0061 0328 1DCE 0321 0F74 0062;0105 0F74 0321 1DCE 0062;0061 0F74 0328 0321 1DCE 0062;0105 0F74 0321 1DCE 0062;0061 0F74 0328 0321 1DCE 0062; # (a◌̨◌᷎◌̡◌ུb; ą◌ུ◌̡◌᷎b; a◌ུ◌̨◌̡◌᷎b; ą◌ུ◌̡◌᷎b; a◌ུ◌̨◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0329 0062;0061 1DFA 0316 0329 059A 0062;0061 1DFA 0316 0329 059A 0062;0061 1DFA 0316 0329 059A 0062;0061 1DFA 0316 0329 059A 0062; # (a◌֚◌̖◌᷺◌̩b; a◌᷺◌̖◌̩◌֚b; a◌᷺◌̖◌̩◌֚b; a◌᷺◌̖◌̩◌֚b; a◌᷺◌̖◌̩◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING VERTICAL LINE BELOW, LATIN SMALL LETTER B +0061 0329 059A 0316 1DFA 0062;0061 1DFA 0329 0316 059A 0062;0061 1DFA 0329 0316 059A 0062;0061 1DFA 0329 0316 059A 0062;0061 1DFA 0329 0316 059A 0062; # (a◌̩◌֚◌̖◌᷺b; a◌᷺◌̩◌̖◌֚b; a◌᷺◌̩◌̖◌֚b; a◌᷺◌̩◌̖◌֚b; a◌᷺◌̩◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING VERTICAL LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 032A 0062;0061 1DFA 0316 032A 059A 0062;0061 1DFA 0316 032A 059A 0062;0061 1DFA 0316 032A 059A 0062;0061 1DFA 0316 032A 059A 0062; # (a◌֚◌̖◌᷺◌̪b; a◌᷺◌̖◌̪◌֚b; a◌᷺◌̖◌̪◌֚b; a◌᷺◌̖◌̪◌֚b; a◌᷺◌̖◌̪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING BRIDGE BELOW, LATIN SMALL LETTER B +0061 032A 059A 0316 1DFA 0062;0061 1DFA 032A 0316 059A 0062;0061 1DFA 032A 0316 059A 0062;0061 1DFA 032A 0316 059A 0062;0061 1DFA 032A 0316 059A 0062; # (a◌̪◌֚◌̖◌᷺b; a◌᷺◌̪◌̖◌֚b; a◌᷺◌̪◌̖◌֚b; a◌᷺◌̪◌̖◌֚b; a◌᷺◌̪◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 032B 0062;0061 1DFA 0316 032B 059A 0062;0061 1DFA 0316 032B 059A 0062;0061 1DFA 0316 032B 059A 0062;0061 1DFA 0316 032B 059A 0062; # (a◌֚◌̖◌᷺◌̫b; a◌᷺◌̖◌̫◌֚b; a◌᷺◌̖◌̫◌֚b; a◌᷺◌̖◌̫◌֚b; a◌᷺◌̖◌̫◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING INVERTED DOUBLE ARCH BELOW, LATIN SMALL LETTER B +0061 032B 059A 0316 1DFA 0062;0061 1DFA 032B 0316 059A 0062;0061 1DFA 032B 0316 059A 0062;0061 1DFA 032B 0316 059A 0062;0061 1DFA 032B 0316 059A 0062; # (a◌̫◌֚◌̖◌᷺b; a◌᷺◌̫◌̖◌֚b; a◌᷺◌̫◌̖◌֚b; a◌᷺◌̫◌̖◌֚b; a◌᷺◌̫◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED DOUBLE ARCH BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 032C 0062;0061 1DFA 0316 032C 059A 0062;0061 1DFA 0316 032C 059A 0062;0061 1DFA 0316 032C 059A 0062;0061 1DFA 0316 032C 059A 0062; # (a◌֚◌̖◌᷺◌̬b; a◌᷺◌̖◌̬◌֚b; a◌᷺◌̖◌̬◌֚b; a◌᷺◌̖◌̬◌֚b; a◌᷺◌̖◌̬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING CARON BELOW, LATIN SMALL LETTER B +0061 032C 059A 0316 1DFA 0062;0061 1DFA 032C 0316 059A 0062;0061 1DFA 032C 0316 059A 0062;0061 1DFA 032C 0316 059A 0062;0061 1DFA 032C 0316 059A 0062; # (a◌̬◌֚◌̖◌᷺b; a◌᷺◌̬◌̖◌֚b; a◌᷺◌̬◌̖◌֚b; a◌᷺◌̬◌̖◌֚b; a◌᷺◌̬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CARON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 032D 0062;0061 1DFA 0316 032D 059A 0062;0061 1DFA 0316 032D 059A 0062;0061 1DFA 0316 032D 059A 0062;0061 1DFA 0316 032D 059A 0062; # (a◌֚◌̖◌᷺◌̭b; a◌᷺◌̖◌̭◌֚b; a◌᷺◌̖◌̭◌֚b; a◌᷺◌̖◌̭◌֚b; a◌᷺◌̖◌̭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING CIRCUMFLEX ACCENT BELOW, LATIN SMALL LETTER B +0061 032D 059A 0316 1DFA 0062;0061 1DFA 032D 0316 059A 0062;0061 1DFA 032D 0316 059A 0062;0061 1DFA 032D 0316 059A 0062;0061 1DFA 032D 0316 059A 0062; # (a◌̭◌֚◌̖◌᷺b; a◌᷺◌̭◌̖◌֚b; a◌᷺◌̭◌̖◌֚b; a◌᷺◌̭◌̖◌֚b; a◌᷺◌̭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CIRCUMFLEX ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 032E 0062;0061 1DFA 0316 032E 059A 0062;0061 1DFA 0316 032E 059A 0062;0061 1DFA 0316 032E 059A 0062;0061 1DFA 0316 032E 059A 0062; # (a◌֚◌̖◌᷺◌̮b; a◌᷺◌̖◌̮◌֚b; a◌᷺◌̖◌̮◌֚b; a◌᷺◌̖◌̮◌֚b; a◌᷺◌̖◌̮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING BREVE BELOW, LATIN SMALL LETTER B +0061 032E 059A 0316 1DFA 0062;0061 1DFA 032E 0316 059A 0062;0061 1DFA 032E 0316 059A 0062;0061 1DFA 032E 0316 059A 0062;0061 1DFA 032E 0316 059A 0062; # (a◌̮◌֚◌̖◌᷺b; a◌᷺◌̮◌̖◌֚b; a◌᷺◌̮◌̖◌֚b; a◌᷺◌̮◌̖◌֚b; a◌᷺◌̮◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING BREVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 032F 0062;0061 1DFA 0316 032F 059A 0062;0061 1DFA 0316 032F 059A 0062;0061 1DFA 0316 032F 059A 0062;0061 1DFA 0316 032F 059A 0062; # (a◌֚◌̖◌᷺◌̯b; a◌᷺◌̖◌̯◌֚b; a◌᷺◌̖◌̯◌֚b; a◌᷺◌̖◌̯◌֚b; a◌᷺◌̖◌̯◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING INVERTED BREVE BELOW, LATIN SMALL LETTER B +0061 032F 059A 0316 1DFA 0062;0061 1DFA 032F 0316 059A 0062;0061 1DFA 032F 0316 059A 0062;0061 1DFA 032F 0316 059A 0062;0061 1DFA 032F 0316 059A 0062; # (a◌̯◌֚◌̖◌᷺b; a◌᷺◌̯◌̖◌֚b; a◌᷺◌̯◌̖◌֚b; a◌᷺◌̯◌̖◌֚b; a◌᷺◌̯◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED BREVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0330 0062;0061 1DFA 0316 0330 059A 0062;0061 1DFA 0316 0330 059A 0062;0061 1DFA 0316 0330 059A 0062;0061 1DFA 0316 0330 059A 0062; # (a◌֚◌̖◌᷺◌̰b; a◌᷺◌̖◌̰◌֚b; a◌᷺◌̖◌̰◌֚b; a◌᷺◌̖◌̰◌֚b; a◌᷺◌̖◌̰◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING TILDE BELOW, LATIN SMALL LETTER B +0061 0330 059A 0316 1DFA 0062;0061 1DFA 0330 0316 059A 0062;0061 1DFA 0330 0316 059A 0062;0061 1DFA 0330 0316 059A 0062;0061 1DFA 0330 0316 059A 0062; # (a◌̰◌֚◌̖◌᷺b; a◌᷺◌̰◌̖◌֚b; a◌᷺◌̰◌̖◌֚b; a◌᷺◌̰◌̖◌֚b; a◌᷺◌̰◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TILDE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0331 0062;0061 1DFA 0316 0331 059A 0062;0061 1DFA 0316 0331 059A 0062;0061 1DFA 0316 0331 059A 0062;0061 1DFA 0316 0331 059A 0062; # (a◌֚◌̖◌᷺◌̱b; a◌᷺◌̖◌̱◌֚b; a◌᷺◌̖◌̱◌֚b; a◌᷺◌̖◌̱◌֚b; a◌᷺◌̖◌̱◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING MACRON BELOW, LATIN SMALL LETTER B +0061 0331 059A 0316 1DFA 0062;0061 1DFA 0331 0316 059A 0062;0061 1DFA 0331 0316 059A 0062;0061 1DFA 0331 0316 059A 0062;0061 1DFA 0331 0316 059A 0062; # (a◌̱◌֚◌̖◌᷺b; a◌᷺◌̱◌̖◌֚b; a◌᷺◌̱◌̖◌֚b; a◌᷺◌̱◌̖◌֚b; a◌᷺◌̱◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0332 0062;0061 1DFA 0316 0332 059A 0062;0061 1DFA 0316 0332 059A 0062;0061 1DFA 0316 0332 059A 0062;0061 1DFA 0316 0332 059A 0062; # (a◌֚◌̖◌᷺◌̲b; a◌᷺◌̖◌̲◌֚b; a◌᷺◌̖◌̲◌֚b; a◌᷺◌̖◌̲◌֚b; a◌᷺◌̖◌̲◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LOW LINE, LATIN SMALL LETTER B +0061 0332 059A 0316 1DFA 0062;0061 1DFA 0332 0316 059A 0062;0061 1DFA 0332 0316 059A 0062;0061 1DFA 0332 0316 059A 0062;0061 1DFA 0332 0316 059A 0062; # (a◌̲◌֚◌̖◌᷺b; a◌᷺◌̲◌̖◌֚b; a◌᷺◌̲◌̖◌֚b; a◌᷺◌̲◌̖◌֚b; a◌᷺◌̲◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LOW LINE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0333 0062;0061 1DFA 0316 0333 059A 0062;0061 1DFA 0316 0333 059A 0062;0061 1DFA 0316 0333 059A 0062;0061 1DFA 0316 0333 059A 0062; # (a◌֚◌̖◌᷺◌̳b; a◌᷺◌̖◌̳◌֚b; a◌᷺◌̖◌̳◌֚b; a◌᷺◌̖◌̳◌֚b; a◌᷺◌̖◌̳◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOUBLE LOW LINE, LATIN SMALL LETTER B +0061 0333 059A 0316 1DFA 0062;0061 1DFA 0333 0316 059A 0062;0061 1DFA 0333 0316 059A 0062;0061 1DFA 0333 0316 059A 0062;0061 1DFA 0333 0316 059A 0062; # (a◌̳◌֚◌̖◌᷺b; a◌᷺◌̳◌̖◌֚b; a◌᷺◌̳◌̖◌֚b; a◌᷺◌̳◌̖◌֚b; a◌᷺◌̳◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE LOW LINE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 16FF0 0334 0334 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062; # (a𖿰◌̴◌̴b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 0334 16FF0 0334 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062; # (a◌̴𖿰◌̴b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING TILDE OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 0335 0062;0061 0334 0335 16FF0 0062;0061 0334 0335 16FF0 0062;0061 0334 0335 16FF0 0062;0061 0334 0335 16FF0 0062; # (a𖿰◌̴◌̵b; a◌̴◌̵𖿰b; a◌̴◌̵𖿰b; a◌̴◌̵𖿰b; a◌̴◌̵𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING SHORT STROKE OVERLAY, LATIN SMALL LETTER B +0061 0335 16FF0 0334 0062;0061 0335 0334 16FF0 0062;0061 0335 0334 16FF0 0062;0061 0335 0334 16FF0 0062;0061 0335 0334 16FF0 0062; # (a◌̵𖿰◌̴b; a◌̵◌̴𖿰b; a◌̵◌̴𖿰b; a◌̵◌̴𖿰b; a◌̵◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING SHORT STROKE OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 0336 0062;0061 0334 0336 16FF0 0062;0061 0334 0336 16FF0 0062;0061 0334 0336 16FF0 0062;0061 0334 0336 16FF0 0062; # (a𖿰◌̴◌̶b; a◌̴◌̶𖿰b; a◌̴◌̶𖿰b; a◌̴◌̶𖿰b; a◌̴◌̶𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING LONG STROKE OVERLAY, LATIN SMALL LETTER B +0061 0336 16FF0 0334 0062;0061 0336 0334 16FF0 0062;0061 0336 0334 16FF0 0062;0061 0336 0334 16FF0 0062;0061 0336 0334 16FF0 0062; # (a◌̶𖿰◌̴b; a◌̶◌̴𖿰b; a◌̶◌̴𖿰b; a◌̶◌̴𖿰b; a◌̶◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING LONG STROKE OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 0337 0062;0061 0334 0337 16FF0 0062;0061 0334 0337 16FF0 0062;0061 0334 0337 16FF0 0062;0061 0334 0337 16FF0 0062; # (a𖿰◌̴◌̷b; a◌̴◌̷𖿰b; a◌̴◌̷𖿰b; a◌̴◌̷𖿰b; a◌̴◌̷𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING SHORT SOLIDUS OVERLAY, LATIN SMALL LETTER B +0061 0337 16FF0 0334 0062;0061 0337 0334 16FF0 0062;0061 0337 0334 16FF0 0062;0061 0337 0334 16FF0 0062;0061 0337 0334 16FF0 0062; # (a◌̷𖿰◌̴b; a◌̷◌̴𖿰b; a◌̷◌̴𖿰b; a◌̷◌̴𖿰b; a◌̷◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING SHORT SOLIDUS OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 0338 0062;0061 0334 0338 16FF0 0062;0061 0334 0338 16FF0 0062;0061 0334 0338 16FF0 0062;0061 0334 0338 16FF0 0062; # (a𖿰◌̴◌̸b; a◌̴◌̸𖿰b; a◌̴◌̸𖿰b; a◌̴◌̸𖿰b; a◌̴◌̸𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING LONG SOLIDUS OVERLAY, LATIN SMALL LETTER B +0061 0338 16FF0 0334 0062;0061 0338 0334 16FF0 0062;0061 0338 0334 16FF0 0062;0061 0338 0334 16FF0 0062;0061 0338 0334 16FF0 0062; # (a◌̸𖿰◌̴b; a◌̸◌̴𖿰b; a◌̸◌̴𖿰b; a◌̸◌̴𖿰b; a◌̸◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING LONG SOLIDUS OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0339 0062;0061 1DFA 0316 0339 059A 0062;0061 1DFA 0316 0339 059A 0062;0061 1DFA 0316 0339 059A 0062;0061 1DFA 0316 0339 059A 0062; # (a◌֚◌̖◌᷺◌̹b; a◌᷺◌̖◌̹◌֚b; a◌᷺◌̖◌̹◌֚b; a◌᷺◌̖◌̹◌֚b; a◌᷺◌̖◌̹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT HALF RING BELOW, LATIN SMALL LETTER B +0061 0339 059A 0316 1DFA 0062;0061 1DFA 0339 0316 059A 0062;0061 1DFA 0339 0316 059A 0062;0061 1DFA 0339 0316 059A 0062;0061 1DFA 0339 0316 059A 0062; # (a◌̹◌֚◌̖◌᷺b; a◌᷺◌̹◌̖◌֚b; a◌᷺◌̹◌̖◌֚b; a◌᷺◌̹◌̖◌֚b; a◌᷺◌̹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT HALF RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 033A 0062;0061 1DFA 0316 033A 059A 0062;0061 1DFA 0316 033A 059A 0062;0061 1DFA 0316 033A 059A 0062;0061 1DFA 0316 033A 059A 0062; # (a◌֚◌̖◌᷺◌̺b; a◌᷺◌̖◌̺◌֚b; a◌᷺◌̖◌̺◌֚b; a◌᷺◌̖◌̺◌֚b; a◌᷺◌̖◌̺◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING INVERTED BRIDGE BELOW, LATIN SMALL LETTER B +0061 033A 059A 0316 1DFA 0062;0061 1DFA 033A 0316 059A 0062;0061 1DFA 033A 0316 059A 0062;0061 1DFA 033A 0316 059A 0062;0061 1DFA 033A 0316 059A 0062; # (a◌̺◌֚◌̖◌᷺b; a◌᷺◌̺◌̖◌֚b; a◌᷺◌̺◌̖◌֚b; a◌᷺◌̺◌̖◌֚b; a◌᷺◌̺◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 033B 0062;0061 1DFA 0316 033B 059A 0062;0061 1DFA 0316 033B 059A 0062;0061 1DFA 0316 033B 059A 0062;0061 1DFA 0316 033B 059A 0062; # (a◌֚◌̖◌᷺◌̻b; a◌᷺◌̖◌̻◌֚b; a◌᷺◌̖◌̻◌֚b; a◌᷺◌̖◌̻◌֚b; a◌᷺◌̖◌̻◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING SQUARE BELOW, LATIN SMALL LETTER B +0061 033B 059A 0316 1DFA 0062;0061 1DFA 033B 0316 059A 0062;0061 1DFA 033B 0316 059A 0062;0061 1DFA 033B 0316 059A 0062;0061 1DFA 033B 0316 059A 0062; # (a◌̻◌֚◌̖◌᷺b; a◌᷺◌̻◌̖◌֚b; a◌᷺◌̻◌̖◌֚b; a◌᷺◌̻◌̖◌֚b; a◌᷺◌̻◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SQUARE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 033C 0062;0061 1DFA 0316 033C 059A 0062;0061 1DFA 0316 033C 059A 0062;0061 1DFA 0316 033C 059A 0062;0061 1DFA 0316 033C 059A 0062; # (a◌֚◌̖◌᷺◌̼b; a◌᷺◌̖◌̼◌֚b; a◌᷺◌̖◌̼◌֚b; a◌᷺◌̖◌̼◌֚b; a◌᷺◌̖◌̼◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING SEAGULL BELOW, LATIN SMALL LETTER B +0061 033C 059A 0316 1DFA 0062;0061 1DFA 033C 0316 059A 0062;0061 1DFA 033C 0316 059A 0062;0061 1DFA 033C 0316 059A 0062;0061 1DFA 033C 0316 059A 0062; # (a◌̼◌֚◌̖◌᷺b; a◌᷺◌̼◌̖◌֚b; a◌᷺◌̼◌̖◌֚b; a◌᷺◌̼◌̖◌֚b; a◌᷺◌̼◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SEAGULL BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 033D 0062;00E0 05AE 033D 0315 0062;0061 05AE 0300 033D 0315 0062;00E0 05AE 033D 0315 0062;0061 05AE 0300 033D 0315 0062; # (a◌̕◌̀◌֮◌̽b; à◌֮◌̽◌̕b; a◌֮◌̀◌̽◌̕b; à◌֮◌̽◌̕b; a◌֮◌̀◌̽◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING X ABOVE, LATIN SMALL LETTER B +0061 033D 0315 0300 05AE 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062; # (a◌̽◌̕◌̀◌֮b; a◌֮◌̽◌̀◌̕b; a◌֮◌̽◌̀◌̕b; a◌֮◌̽◌̀◌̕b; a◌֮◌̽◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING X ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 033E 0062;00E0 05AE 033E 0315 0062;0061 05AE 0300 033E 0315 0062;00E0 05AE 033E 0315 0062;0061 05AE 0300 033E 0315 0062; # (a◌̕◌̀◌֮◌̾b; à◌֮◌̾◌̕b; a◌֮◌̀◌̾◌̕b; à◌֮◌̾◌̕b; a◌֮◌̀◌̾◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING VERTICAL TILDE, LATIN SMALL LETTER B +0061 033E 0315 0300 05AE 0062;0061 05AE 033E 0300 0315 0062;0061 05AE 033E 0300 0315 0062;0061 05AE 033E 0300 0315 0062;0061 05AE 033E 0300 0315 0062; # (a◌̾◌̕◌̀◌֮b; a◌֮◌̾◌̀◌̕b; a◌֮◌̾◌̀◌̕b; a◌֮◌̾◌̀◌̕b; a◌֮◌̾◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING VERTICAL TILDE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 033F 0062;00E0 05AE 033F 0315 0062;0061 05AE 0300 033F 0315 0062;00E0 05AE 033F 0315 0062;0061 05AE 0300 033F 0315 0062; # (a◌̕◌̀◌֮◌̿b; à◌֮◌̿◌̕b; a◌֮◌̀◌̿◌̕b; à◌֮◌̿◌̕b; a◌֮◌̀◌̿◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE OVERLINE, LATIN SMALL LETTER B +0061 033F 0315 0300 05AE 0062;0061 05AE 033F 0300 0315 0062;0061 05AE 033F 0300 0315 0062;0061 05AE 033F 0300 0315 0062;0061 05AE 033F 0300 0315 0062; # (a◌̿◌̕◌̀◌֮b; a◌֮◌̿◌̀◌̕b; a◌֮◌̿◌̀◌̕b; a◌֮◌̿◌̀◌̕b; a◌֮◌̿◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE OVERLINE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0340 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062; # (a◌̕◌̀◌֮◌̀b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRAVE TONE MARK, LATIN SMALL LETTER B +0061 0340 0315 0300 05AE 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062;00E0 05AE 0300 0315 0062;0061 05AE 0300 0300 0315 0062; # (a◌̀◌̕◌̀◌֮b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; à◌֮◌̀◌̕b; a◌֮◌̀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRAVE TONE MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0341 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062;00E0 05AE 0301 0315 0062;0061 05AE 0300 0301 0315 0062; # (a◌̕◌̀◌֮◌́b; à◌֮◌́◌̕b; a◌֮◌̀◌́◌̕b; à◌֮◌́◌̕b; a◌֮◌̀◌́◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ACUTE TONE MARK, LATIN SMALL LETTER B +0061 0341 0315 0300 05AE 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062;00E1 05AE 0300 0315 0062;0061 05AE 0301 0300 0315 0062; # (a◌́◌̕◌̀◌֮b; á◌֮◌̀◌̕b; a◌֮◌́◌̀◌̕b; á◌֮◌̀◌̕b; a◌֮◌́◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ACUTE TONE MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0342 0062;00E0 05AE 0342 0315 0062;0061 05AE 0300 0342 0315 0062;00E0 05AE 0342 0315 0062;0061 05AE 0300 0342 0315 0062; # (a◌̕◌̀◌֮◌͂b; à◌֮◌͂◌̕b; a◌֮◌̀◌͂◌̕b; à◌֮◌͂◌̕b; a◌֮◌̀◌͂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GREEK PERISPOMENI, LATIN SMALL LETTER B +0061 0342 0315 0300 05AE 0062;0061 05AE 0342 0300 0315 0062;0061 05AE 0342 0300 0315 0062;0061 05AE 0342 0300 0315 0062;0061 05AE 0342 0300 0315 0062; # (a◌͂◌̕◌̀◌֮b; a◌֮◌͂◌̀◌̕b; a◌֮◌͂◌̀◌̕b; a◌֮◌͂◌̀◌̕b; a◌֮◌͂◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK PERISPOMENI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0343 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062;00E0 05AE 0313 0315 0062;0061 05AE 0300 0313 0315 0062; # (a◌̕◌̀◌֮◌̓b; à◌֮◌̓◌̕b; a◌֮◌̀◌̓◌̕b; à◌֮◌̓◌̕b; a◌֮◌̀◌̓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GREEK KORONIS, LATIN SMALL LETTER B +0061 0343 0315 0300 05AE 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062;0061 05AE 0313 0300 0315 0062; # (a◌̓◌̕◌̀◌֮b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; a◌֮◌̓◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK KORONIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0344 0062;00E0 05AE 0308 0301 0315 0062;0061 05AE 0300 0308 0301 0315 0062;00E0 05AE 0308 0301 0315 0062;0061 05AE 0300 0308 0301 0315 0062; # (a◌̕◌̀◌֮◌̈́b; à◌֮◌̈◌́◌̕b; a◌֮◌̀◌̈◌́◌̕b; à◌֮◌̈◌́◌̕b; a◌֮◌̀◌̈◌́◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GREEK DIALYTIKA TONOS, LATIN SMALL LETTER B +0061 0344 0315 0300 05AE 0062;00E4 05AE 0301 0300 0315 0062;0061 05AE 0308 0301 0300 0315 0062;00E4 05AE 0301 0300 0315 0062;0061 05AE 0308 0301 0300 0315 0062; # (a◌̈́◌̕◌̀◌֮b; ä◌֮◌́◌̀◌̕b; a◌֮◌̈◌́◌̀◌̕b; ä◌֮◌́◌̀◌̕b; a◌֮◌̈◌́◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK DIALYTIKA TONOS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0345 035D 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062; # (a◌ͅ◌͝◌ͅb; a◌͝◌ͅ◌ͅb; a◌͝◌ͅ◌ͅb; a◌͝◌ͅ◌ͅb; a◌͝◌ͅ◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING GREEK YPOGEGRAMMENI, LATIN SMALL LETTER B +0061 0345 0345 035D 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062; # (a◌ͅ◌ͅ◌͝b; a◌͝◌ͅ◌ͅb; a◌͝◌ͅ◌ͅb; a◌͝◌ͅ◌ͅb; a◌͝◌ͅ◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, LATIN SMALL LETTER B +0061 0315 0300 05AE 0346 0062;00E0 05AE 0346 0315 0062;0061 05AE 0300 0346 0315 0062;00E0 05AE 0346 0315 0062;0061 05AE 0300 0346 0315 0062; # (a◌̕◌̀◌֮◌͆b; à◌֮◌͆◌̕b; a◌֮◌̀◌͆◌̕b; à◌֮◌͆◌̕b; a◌֮◌̀◌͆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING BRIDGE ABOVE, LATIN SMALL LETTER B +0061 0346 0315 0300 05AE 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062; # (a◌͆◌̕◌̀◌֮b; a◌֮◌͆◌̀◌̕b; a◌֮◌͆◌̀◌̕b; a◌֮◌͆◌̀◌̕b; a◌֮◌͆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING BRIDGE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0347 0062;0061 1DFA 0316 0347 059A 0062;0061 1DFA 0316 0347 059A 0062;0061 1DFA 0316 0347 059A 0062;0061 1DFA 0316 0347 059A 0062; # (a◌֚◌̖◌᷺◌͇b; a◌᷺◌̖◌͇◌֚b; a◌᷺◌̖◌͇◌֚b; a◌᷺◌̖◌͇◌֚b; a◌᷺◌̖◌͇◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING EQUALS SIGN BELOW, LATIN SMALL LETTER B +0061 0347 059A 0316 1DFA 0062;0061 1DFA 0347 0316 059A 0062;0061 1DFA 0347 0316 059A 0062;0061 1DFA 0347 0316 059A 0062;0061 1DFA 0347 0316 059A 0062; # (a◌͇◌֚◌̖◌᷺b; a◌᷺◌͇◌̖◌֚b; a◌᷺◌͇◌̖◌֚b; a◌᷺◌͇◌̖◌֚b; a◌᷺◌͇◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING EQUALS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0348 0062;0061 1DFA 0316 0348 059A 0062;0061 1DFA 0316 0348 059A 0062;0061 1DFA 0316 0348 059A 0062;0061 1DFA 0316 0348 059A 0062; # (a◌֚◌̖◌᷺◌͈b; a◌᷺◌̖◌͈◌֚b; a◌᷺◌̖◌͈◌֚b; a◌᷺◌̖◌͈◌֚b; a◌᷺◌̖◌͈◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOUBLE VERTICAL LINE BELOW, LATIN SMALL LETTER B +0061 0348 059A 0316 1DFA 0062;0061 1DFA 0348 0316 059A 0062;0061 1DFA 0348 0316 059A 0062;0061 1DFA 0348 0316 059A 0062;0061 1DFA 0348 0316 059A 0062; # (a◌͈◌֚◌̖◌᷺b; a◌᷺◌͈◌̖◌֚b; a◌᷺◌͈◌̖◌֚b; a◌᷺◌͈◌̖◌֚b; a◌᷺◌͈◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE VERTICAL LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0349 0062;0061 1DFA 0316 0349 059A 0062;0061 1DFA 0316 0349 059A 0062;0061 1DFA 0316 0349 059A 0062;0061 1DFA 0316 0349 059A 0062; # (a◌֚◌̖◌᷺◌͉b; a◌᷺◌̖◌͉◌֚b; a◌᷺◌̖◌͉◌֚b; a◌᷺◌̖◌͉◌֚b; a◌᷺◌̖◌͉◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT ANGLE BELOW, LATIN SMALL LETTER B +0061 0349 059A 0316 1DFA 0062;0061 1DFA 0349 0316 059A 0062;0061 1DFA 0349 0316 059A 0062;0061 1DFA 0349 0316 059A 0062;0061 1DFA 0349 0316 059A 0062; # (a◌͉◌֚◌̖◌᷺b; a◌᷺◌͉◌̖◌֚b; a◌᷺◌͉◌̖◌֚b; a◌᷺◌͉◌̖◌֚b; a◌᷺◌͉◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT ANGLE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 034A 0062;00E0 05AE 034A 0315 0062;0061 05AE 0300 034A 0315 0062;00E0 05AE 034A 0315 0062;0061 05AE 0300 034A 0315 0062; # (a◌̕◌̀◌֮◌͊b; à◌֮◌͊◌̕b; a◌֮◌̀◌͊◌̕b; à◌֮◌͊◌̕b; a◌֮◌̀◌͊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING NOT TILDE ABOVE, LATIN SMALL LETTER B +0061 034A 0315 0300 05AE 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062; # (a◌͊◌̕◌̀◌֮b; a◌֮◌͊◌̀◌̕b; a◌֮◌͊◌̀◌̕b; a◌֮◌͊◌̀◌̕b; a◌֮◌͊◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING NOT TILDE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 034B 0062;00E0 05AE 034B 0315 0062;0061 05AE 0300 034B 0315 0062;00E0 05AE 034B 0315 0062;0061 05AE 0300 034B 0315 0062; # (a◌̕◌̀◌֮◌͋b; à◌֮◌͋◌̕b; a◌֮◌̀◌͋◌̕b; à◌֮◌͋◌̕b; a◌֮◌̀◌͋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING HOMOTHETIC ABOVE, LATIN SMALL LETTER B +0061 034B 0315 0300 05AE 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062; # (a◌͋◌̕◌̀◌֮b; a◌֮◌͋◌̀◌̕b; a◌֮◌͋◌̀◌̕b; a◌֮◌͋◌̀◌̕b; a◌֮◌͋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING HOMOTHETIC ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 034C 0062;00E0 05AE 034C 0315 0062;0061 05AE 0300 034C 0315 0062;00E0 05AE 034C 0315 0062;0061 05AE 0300 034C 0315 0062; # (a◌̕◌̀◌֮◌͌b; à◌֮◌͌◌̕b; a◌֮◌̀◌͌◌̕b; à◌֮◌͌◌̕b; a◌֮◌̀◌͌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ALMOST EQUAL TO ABOVE, LATIN SMALL LETTER B +0061 034C 0315 0300 05AE 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062; # (a◌͌◌̕◌̀◌֮b; a◌֮◌͌◌̀◌̕b; a◌֮◌͌◌̀◌̕b; a◌֮◌͌◌̀◌̕b; a◌֮◌͌◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ALMOST EQUAL TO ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 034D 0062;0061 1DFA 0316 034D 059A 0062;0061 1DFA 0316 034D 059A 0062;0061 1DFA 0316 034D 059A 0062;0061 1DFA 0316 034D 059A 0062; # (a◌֚◌̖◌᷺◌͍b; a◌᷺◌̖◌͍◌֚b; a◌᷺◌̖◌͍◌֚b; a◌᷺◌̖◌͍◌֚b; a◌᷺◌̖◌͍◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT RIGHT ARROW BELOW, LATIN SMALL LETTER B +0061 034D 059A 0316 1DFA 0062;0061 1DFA 034D 0316 059A 0062;0061 1DFA 034D 0316 059A 0062;0061 1DFA 034D 0316 059A 0062;0061 1DFA 034D 0316 059A 0062; # (a◌͍◌֚◌̖◌᷺b; a◌᷺◌͍◌̖◌֚b; a◌᷺◌͍◌̖◌֚b; a◌᷺◌͍◌̖◌֚b; a◌᷺◌͍◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT RIGHT ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 034E 0062;0061 1DFA 0316 034E 059A 0062;0061 1DFA 0316 034E 059A 0062;0061 1DFA 0316 034E 059A 0062;0061 1DFA 0316 034E 059A 0062; # (a◌֚◌̖◌᷺◌͎b; a◌᷺◌̖◌͎◌֚b; a◌᷺◌̖◌͎◌֚b; a◌᷺◌̖◌͎◌֚b; a◌᷺◌̖◌͎◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING UPWARDS ARROW BELOW, LATIN SMALL LETTER B +0061 034E 059A 0316 1DFA 0062;0061 1DFA 034E 0316 059A 0062;0061 1DFA 034E 0316 059A 0062;0061 1DFA 034E 0316 059A 0062;0061 1DFA 034E 0316 059A 0062; # (a◌͎◌֚◌̖◌᷺b; a◌᷺◌͎◌̖◌֚b; a◌᷺◌͎◌̖◌֚b; a◌᷺◌͎◌̖◌֚b; a◌᷺◌͎◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING UPWARDS ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0350 0062;00E0 05AE 0350 0315 0062;0061 05AE 0300 0350 0315 0062;00E0 05AE 0350 0315 0062;0061 05AE 0300 0350 0315 0062; # (a◌̕◌̀◌֮◌͐b; à◌֮◌͐◌̕b; a◌֮◌̀◌͐◌̕b; à◌֮◌͐◌̕b; a◌֮◌̀◌͐◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT ARROWHEAD ABOVE, LATIN SMALL LETTER B +0061 0350 0315 0300 05AE 0062;0061 05AE 0350 0300 0315 0062;0061 05AE 0350 0300 0315 0062;0061 05AE 0350 0300 0315 0062;0061 05AE 0350 0300 0315 0062; # (a◌͐◌̕◌̀◌֮b; a◌֮◌͐◌̀◌̕b; a◌֮◌͐◌̀◌̕b; a◌֮◌͐◌̀◌̕b; a◌֮◌͐◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0351 0062;00E0 05AE 0351 0315 0062;0061 05AE 0300 0351 0315 0062;00E0 05AE 0351 0315 0062;0061 05AE 0300 0351 0315 0062; # (a◌̕◌̀◌֮◌͑b; à◌֮◌͑◌̕b; a◌֮◌̀◌͑◌̕b; à◌֮◌͑◌̕b; a◌֮◌̀◌͑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT HALF RING ABOVE, LATIN SMALL LETTER B +0061 0351 0315 0300 05AE 0062;0061 05AE 0351 0300 0315 0062;0061 05AE 0351 0300 0315 0062;0061 05AE 0351 0300 0315 0062;0061 05AE 0351 0300 0315 0062; # (a◌͑◌̕◌̀◌֮b; a◌֮◌͑◌̀◌̕b; a◌֮◌͑◌̀◌̕b; a◌֮◌͑◌̀◌̕b; a◌֮◌͑◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT HALF RING ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0352 0062;00E0 05AE 0352 0315 0062;0061 05AE 0300 0352 0315 0062;00E0 05AE 0352 0315 0062;0061 05AE 0300 0352 0315 0062; # (a◌̕◌̀◌֮◌͒b; à◌֮◌͒◌̕b; a◌֮◌̀◌͒◌̕b; à◌֮◌͒◌̕b; a◌֮◌̀◌͒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING FERMATA, LATIN SMALL LETTER B +0061 0352 0315 0300 05AE 0062;0061 05AE 0352 0300 0315 0062;0061 05AE 0352 0300 0315 0062;0061 05AE 0352 0300 0315 0062;0061 05AE 0352 0300 0315 0062; # (a◌͒◌̕◌̀◌֮b; a◌֮◌͒◌̀◌̕b; a◌֮◌͒◌̀◌̕b; a◌֮◌͒◌̀◌̕b; a◌֮◌͒◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING FERMATA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0353 0062;0061 1DFA 0316 0353 059A 0062;0061 1DFA 0316 0353 059A 0062;0061 1DFA 0316 0353 059A 0062;0061 1DFA 0316 0353 059A 0062; # (a◌֚◌̖◌᷺◌͓b; a◌᷺◌̖◌͓◌֚b; a◌᷺◌̖◌͓◌֚b; a◌᷺◌̖◌͓◌֚b; a◌᷺◌̖◌͓◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING X BELOW, LATIN SMALL LETTER B +0061 0353 059A 0316 1DFA 0062;0061 1DFA 0353 0316 059A 0062;0061 1DFA 0353 0316 059A 0062;0061 1DFA 0353 0316 059A 0062;0061 1DFA 0353 0316 059A 0062; # (a◌͓◌֚◌̖◌᷺b; a◌᷺◌͓◌̖◌֚b; a◌᷺◌͓◌̖◌֚b; a◌᷺◌͓◌̖◌֚b; a◌᷺◌͓◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING X BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0354 0062;0061 1DFA 0316 0354 059A 0062;0061 1DFA 0316 0354 059A 0062;0061 1DFA 0316 0354 059A 0062;0061 1DFA 0316 0354 059A 0062; # (a◌֚◌̖◌᷺◌͔b; a◌᷺◌̖◌͔◌֚b; a◌᷺◌̖◌͔◌֚b; a◌᷺◌̖◌͔◌֚b; a◌᷺◌̖◌͔◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT ARROWHEAD BELOW, LATIN SMALL LETTER B +0061 0354 059A 0316 1DFA 0062;0061 1DFA 0354 0316 059A 0062;0061 1DFA 0354 0316 059A 0062;0061 1DFA 0354 0316 059A 0062;0061 1DFA 0354 0316 059A 0062; # (a◌͔◌֚◌̖◌᷺b; a◌᷺◌͔◌̖◌֚b; a◌᷺◌͔◌̖◌֚b; a◌᷺◌͔◌̖◌֚b; a◌᷺◌͔◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0355 0062;0061 1DFA 0316 0355 059A 0062;0061 1DFA 0316 0355 059A 0062;0061 1DFA 0316 0355 059A 0062;0061 1DFA 0316 0355 059A 0062; # (a◌֚◌̖◌᷺◌͕b; a◌᷺◌̖◌͕◌֚b; a◌᷺◌̖◌͕◌֚b; a◌᷺◌̖◌͕◌֚b; a◌᷺◌̖◌͕◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT ARROWHEAD BELOW, LATIN SMALL LETTER B +0061 0355 059A 0316 1DFA 0062;0061 1DFA 0355 0316 059A 0062;0061 1DFA 0355 0316 059A 0062;0061 1DFA 0355 0316 059A 0062;0061 1DFA 0355 0316 059A 0062; # (a◌͕◌֚◌̖◌᷺b; a◌᷺◌͕◌̖◌֚b; a◌᷺◌͕◌̖◌֚b; a◌᷺◌͕◌̖◌֚b; a◌᷺◌͕◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0356 0062;0061 1DFA 0316 0356 059A 0062;0061 1DFA 0316 0356 059A 0062;0061 1DFA 0316 0356 059A 0062;0061 1DFA 0316 0356 059A 0062; # (a◌֚◌̖◌᷺◌͖b; a◌᷺◌̖◌͖◌֚b; a◌᷺◌̖◌͖◌֚b; a◌᷺◌̖◌͖◌֚b; a◌᷺◌̖◌͖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW, LATIN SMALL LETTER B +0061 0356 059A 0316 1DFA 0062;0061 1DFA 0356 0316 059A 0062;0061 1DFA 0356 0316 059A 0062;0061 1DFA 0356 0316 059A 0062;0061 1DFA 0356 0316 059A 0062; # (a◌͖◌֚◌̖◌᷺b; a◌᷺◌͖◌̖◌֚b; a◌᷺◌͖◌̖◌֚b; a◌᷺◌͖◌̖◌֚b; a◌᷺◌͖◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0357 0062;00E0 05AE 0357 0315 0062;0061 05AE 0300 0357 0315 0062;00E0 05AE 0357 0315 0062;0061 05AE 0300 0357 0315 0062; # (a◌̕◌̀◌֮◌͗b; à◌֮◌͗◌̕b; a◌֮◌̀◌͗◌̕b; à◌֮◌͗◌̕b; a◌֮◌̀◌͗◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT HALF RING ABOVE, LATIN SMALL LETTER B +0061 0357 0315 0300 05AE 0062;0061 05AE 0357 0300 0315 0062;0061 05AE 0357 0300 0315 0062;0061 05AE 0357 0300 0315 0062;0061 05AE 0357 0300 0315 0062; # (a◌͗◌̕◌̀◌֮b; a◌֮◌͗◌̀◌̕b; a◌֮◌͗◌̀◌̕b; a◌֮◌͗◌̀◌̕b; a◌֮◌͗◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RIGHT HALF RING ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 035C 0315 0300 0358 0062;00E0 0315 0358 035C 0062;0061 0300 0315 0358 035C 0062;00E0 0315 0358 035C 0062;0061 0300 0315 0358 035C 0062; # (a◌͜◌̕◌̀◌͘b; à◌̕◌͘◌͜b; a◌̀◌̕◌͘◌͜b; à◌̕◌͘◌͜b; a◌̀◌̕◌͘◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, COMBINING DOT ABOVE RIGHT, LATIN SMALL LETTER B +0061 0358 035C 0315 0300 0062;00E0 0358 0315 035C 0062;0061 0300 0358 0315 035C 0062;00E0 0358 0315 035C 0062;0061 0300 0358 0315 035C 0062; # (a◌͘◌͜◌̕◌̀b; à◌͘◌̕◌͜b; a◌̀◌͘◌̕◌͜b; à◌͘◌̕◌͜b; a◌̀◌͘◌̕◌͜b; ) LATIN SMALL LETTER A, COMBINING DOT ABOVE RIGHT, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0359 0062;0061 1DFA 0316 0359 059A 0062;0061 1DFA 0316 0359 059A 0062;0061 1DFA 0316 0359 059A 0062;0061 1DFA 0316 0359 059A 0062; # (a◌֚◌̖◌᷺◌͙b; a◌᷺◌̖◌͙◌֚b; a◌᷺◌̖◌͙◌֚b; a◌᷺◌̖◌͙◌֚b; a◌᷺◌̖◌͙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING ASTERISK BELOW, LATIN SMALL LETTER B +0061 0359 059A 0316 1DFA 0062;0061 1DFA 0359 0316 059A 0062;0061 1DFA 0359 0316 059A 0062;0061 1DFA 0359 0316 059A 0062;0061 1DFA 0359 0316 059A 0062; # (a◌͙◌֚◌̖◌᷺b; a◌᷺◌͙◌̖◌֚b; a◌᷺◌͙◌̖◌֚b; a◌᷺◌͙◌̖◌֚b; a◌᷺◌͙◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ASTERISK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 035A 0062;0061 1DFA 0316 035A 059A 0062;0061 1DFA 0316 035A 059A 0062;0061 1DFA 0316 035A 059A 0062;0061 1DFA 0316 035A 059A 0062; # (a◌֚◌̖◌᷺◌͚b; a◌᷺◌̖◌͚◌֚b; a◌᷺◌̖◌͚◌֚b; a◌᷺◌̖◌͚◌֚b; a◌᷺◌̖◌͚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOUBLE RING BELOW, LATIN SMALL LETTER B +0061 035A 059A 0316 1DFA 0062;0061 1DFA 035A 0316 059A 0062;0061 1DFA 035A 0316 059A 0062;0061 1DFA 035A 0316 059A 0062;0061 1DFA 035A 0316 059A 0062; # (a◌͚◌֚◌̖◌᷺b; a◌᷺◌͚◌̖◌֚b; a◌᷺◌͚◌̖◌֚b; a◌᷺◌͚◌̖◌֚b; a◌᷺◌͚◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 035B 0062;00E0 05AE 035B 0315 0062;0061 05AE 0300 035B 0315 0062;00E0 05AE 035B 0315 0062;0061 05AE 0300 035B 0315 0062; # (a◌̕◌̀◌֮◌͛b; à◌֮◌͛◌̕b; a◌֮◌̀◌͛◌̕b; à◌֮◌͛◌̕b; a◌֮◌̀◌͛◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ZIGZAG ABOVE, LATIN SMALL LETTER B +0061 035B 0315 0300 05AE 0062;0061 05AE 035B 0300 0315 0062;0061 05AE 035B 0300 0315 0062;0061 05AE 035B 0300 0315 0062;0061 05AE 035B 0300 0315 0062; # (a◌͛◌̕◌̀◌֮b; a◌֮◌͛◌̀◌̕b; a◌֮◌͛◌̀◌̕b; a◌֮◌͛◌̀◌̕b; a◌֮◌͛◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ZIGZAG ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 035D 035C 0315 035C 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062; # (a◌͝◌͜◌̕◌͜b; a◌̕◌͜◌͜◌͝b; a◌̕◌͜◌͜◌͝b; a◌̕◌͜◌͜◌͝b; a◌̕◌͜◌͜◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE BREVE BELOW, LATIN SMALL LETTER B +0061 035C 035D 035C 0315 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062; # (a◌͜◌͝◌͜◌̕b; a◌̕◌͜◌͜◌͝b; a◌̕◌͜◌͜◌͝b; a◌̕◌͜◌͜◌͝b; a◌̕◌͜◌͜◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, LATIN SMALL LETTER B +0061 0345 035D 035C 035D 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062; # (a◌ͅ◌͝◌͜◌͝b; a◌͜◌͝◌͝◌ͅb; a◌͜◌͝◌͝◌ͅb; a◌͜◌͝◌͝◌ͅb; a◌͜◌͝◌͝◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING DOUBLE BREVE, LATIN SMALL LETTER B +0061 035D 0345 035D 035C 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062;0061 035C 035D 035D 0345 0062; # (a◌͝◌ͅ◌͝◌͜b; a◌͜◌͝◌͝◌ͅb; a◌͜◌͝◌͝◌ͅb; a◌͜◌͝◌͝◌ͅb; a◌͜◌͝◌͝◌ͅb; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, LATIN SMALL LETTER B +0061 0345 035D 035C 035E 0062;0061 035C 035D 035E 0345 0062;0061 035C 035D 035E 0345 0062;0061 035C 035D 035E 0345 0062;0061 035C 035D 035E 0345 0062; # (a◌ͅ◌͝◌͜◌͞b; a◌͜◌͝◌͞◌ͅb; a◌͜◌͝◌͞◌ͅb; a◌͜◌͝◌͞◌ͅb; a◌͜◌͝◌͞◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING DOUBLE MACRON, LATIN SMALL LETTER B +0061 035E 0345 035D 035C 0062;0061 035C 035E 035D 0345 0062;0061 035C 035E 035D 0345 0062;0061 035C 035E 035D 0345 0062;0061 035C 035E 035D 0345 0062; # (a◌͞◌ͅ◌͝◌͜b; a◌͜◌͞◌͝◌ͅb; a◌͜◌͞◌͝◌ͅb; a◌͜◌͞◌͝◌ͅb; a◌͜◌͞◌͝◌ͅb; ) LATIN SMALL LETTER A, COMBINING DOUBLE MACRON, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, LATIN SMALL LETTER B +0061 035D 035C 0315 035F 0062;0061 0315 035C 035F 035D 0062;0061 0315 035C 035F 035D 0062;0061 0315 035C 035F 035D 0062;0061 0315 035C 035F 035D 0062; # (a◌͝◌͜◌̕◌͟b; a◌̕◌͜◌͟◌͝b; a◌̕◌͜◌͟◌͝b; a◌̕◌͜◌͟◌͝b; a◌̕◌͜◌͟◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE MACRON BELOW, LATIN SMALL LETTER B +0061 035F 035D 035C 0315 0062;0061 0315 035F 035C 035D 0062;0061 0315 035F 035C 035D 0062;0061 0315 035F 035C 035D 0062;0061 0315 035F 035C 035D 0062; # (a◌͟◌͝◌͜◌̕b; a◌̕◌͟◌͜◌͝b; a◌̕◌͟◌͜◌͝b; a◌̕◌͟◌͜◌͝b; a◌̕◌͟◌͜◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE MACRON BELOW, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, LATIN SMALL LETTER B +0061 0345 035D 035C 0360 0062;0061 035C 035D 0360 0345 0062;0061 035C 035D 0360 0345 0062;0061 035C 035D 0360 0345 0062;0061 035C 035D 0360 0345 0062; # (a◌ͅ◌͝◌͜◌͠b; a◌͜◌͝◌͠◌ͅb; a◌͜◌͝◌͠◌ͅb; a◌͜◌͝◌͠◌ͅb; a◌͜◌͝◌͠◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING DOUBLE TILDE, LATIN SMALL LETTER B +0061 0360 0345 035D 035C 0062;0061 035C 0360 035D 0345 0062;0061 035C 0360 035D 0345 0062;0061 035C 0360 035D 0345 0062;0061 035C 0360 035D 0345 0062; # (a◌͠◌ͅ◌͝◌͜b; a◌͜◌͠◌͝◌ͅb; a◌͜◌͠◌͝◌ͅb; a◌͜◌͠◌͝◌ͅb; a◌͜◌͠◌͝◌ͅb; ) LATIN SMALL LETTER A, COMBINING DOUBLE TILDE, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, LATIN SMALL LETTER B +0061 0345 035D 035C 0361 0062;0061 035C 035D 0361 0345 0062;0061 035C 035D 0361 0345 0062;0061 035C 035D 0361 0345 0062;0061 035C 035D 0361 0345 0062; # (a◌ͅ◌͝◌͜◌͡b; a◌͜◌͝◌͡◌ͅb; a◌͜◌͝◌͡◌ͅb; a◌͜◌͝◌͡◌ͅb; a◌͜◌͝◌͡◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING DOUBLE INVERTED BREVE, LATIN SMALL LETTER B +0061 0361 0345 035D 035C 0062;0061 035C 0361 035D 0345 0062;0061 035C 0361 035D 0345 0062;0061 035C 0361 035D 0345 0062;0061 035C 0361 035D 0345 0062; # (a◌͡◌ͅ◌͝◌͜b; a◌͜◌͡◌͝◌ͅb; a◌͜◌͡◌͝◌ͅb; a◌͜◌͡◌͝◌ͅb; a◌͜◌͡◌͝◌ͅb; ) LATIN SMALL LETTER A, COMBINING DOUBLE INVERTED BREVE, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, LATIN SMALL LETTER B +0061 035D 035C 0315 0362 0062;0061 0315 035C 0362 035D 0062;0061 0315 035C 0362 035D 0062;0061 0315 035C 0362 035D 0062;0061 0315 035C 0362 035D 0062; # (a◌͝◌͜◌̕◌͢b; a◌̕◌͜◌͢◌͝b; a◌̕◌͜◌͢◌͝b; a◌̕◌͜◌͢◌͝b; a◌̕◌͜◌͢◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, LATIN SMALL LETTER B +0061 0362 035D 035C 0315 0062;0061 0315 0362 035C 035D 0062;0061 0315 0362 035C 035D 0062;0061 0315 0362 035C 035D 0062;0061 0315 0362 035C 035D 0062; # (a◌͢◌͝◌͜◌̕b; a◌̕◌͢◌͜◌͝b; a◌̕◌͢◌͜◌͝b; a◌̕◌͢◌͜◌͝b; a◌̕◌͢◌͜◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE RIGHTWARDS ARROW BELOW, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0363 0062;00E0 05AE 0363 0315 0062;0061 05AE 0300 0363 0315 0062;00E0 05AE 0363 0315 0062;0061 05AE 0300 0363 0315 0062; # (a◌̕◌̀◌֮◌ͣb; à◌֮◌ͣ◌̕b; a◌֮◌̀◌ͣ◌̕b; à◌֮◌ͣ◌̕b; a◌֮◌̀◌ͣ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER A, LATIN SMALL LETTER B +0061 0363 0315 0300 05AE 0062;0061 05AE 0363 0300 0315 0062;0061 05AE 0363 0300 0315 0062;0061 05AE 0363 0300 0315 0062;0061 05AE 0363 0300 0315 0062; # (a◌ͣ◌̕◌̀◌֮b; a◌֮◌ͣ◌̀◌̕b; a◌֮◌ͣ◌̀◌̕b; a◌֮◌ͣ◌̀◌̕b; a◌֮◌ͣ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0364 0062;00E0 05AE 0364 0315 0062;0061 05AE 0300 0364 0315 0062;00E0 05AE 0364 0315 0062;0061 05AE 0300 0364 0315 0062; # (a◌̕◌̀◌֮◌ͤb; à◌֮◌ͤ◌̕b; a◌֮◌̀◌ͤ◌̕b; à◌֮◌ͤ◌̕b; a◌֮◌̀◌ͤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER E, LATIN SMALL LETTER B +0061 0364 0315 0300 05AE 0062;0061 05AE 0364 0300 0315 0062;0061 05AE 0364 0300 0315 0062;0061 05AE 0364 0300 0315 0062;0061 05AE 0364 0300 0315 0062; # (a◌ͤ◌̕◌̀◌֮b; a◌֮◌ͤ◌̀◌̕b; a◌֮◌ͤ◌̀◌̕b; a◌֮◌ͤ◌̀◌̕b; a◌֮◌ͤ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER E, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0365 0062;00E0 05AE 0365 0315 0062;0061 05AE 0300 0365 0315 0062;00E0 05AE 0365 0315 0062;0061 05AE 0300 0365 0315 0062; # (a◌̕◌̀◌֮◌ͥb; à◌֮◌ͥ◌̕b; a◌֮◌̀◌ͥ◌̕b; à◌֮◌ͥ◌̕b; a◌֮◌̀◌ͥ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER I, LATIN SMALL LETTER B +0061 0365 0315 0300 05AE 0062;0061 05AE 0365 0300 0315 0062;0061 05AE 0365 0300 0315 0062;0061 05AE 0365 0300 0315 0062;0061 05AE 0365 0300 0315 0062; # (a◌ͥ◌̕◌̀◌֮b; a◌֮◌ͥ◌̀◌̕b; a◌֮◌ͥ◌̀◌̕b; a◌֮◌ͥ◌̀◌̕b; a◌֮◌ͥ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0366 0062;00E0 05AE 0366 0315 0062;0061 05AE 0300 0366 0315 0062;00E0 05AE 0366 0315 0062;0061 05AE 0300 0366 0315 0062; # (a◌̕◌̀◌֮◌ͦb; à◌֮◌ͦ◌̕b; a◌֮◌̀◌ͦ◌̕b; à◌֮◌ͦ◌̕b; a◌֮◌̀◌ͦ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER O, LATIN SMALL LETTER B +0061 0366 0315 0300 05AE 0062;0061 05AE 0366 0300 0315 0062;0061 05AE 0366 0300 0315 0062;0061 05AE 0366 0300 0315 0062;0061 05AE 0366 0300 0315 0062; # (a◌ͦ◌̕◌̀◌֮b; a◌֮◌ͦ◌̀◌̕b; a◌֮◌ͦ◌̀◌̕b; a◌֮◌ͦ◌̀◌̕b; a◌֮◌ͦ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER O, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0367 0062;00E0 05AE 0367 0315 0062;0061 05AE 0300 0367 0315 0062;00E0 05AE 0367 0315 0062;0061 05AE 0300 0367 0315 0062; # (a◌̕◌̀◌֮◌ͧb; à◌֮◌ͧ◌̕b; a◌֮◌̀◌ͧ◌̕b; à◌֮◌ͧ◌̕b; a◌֮◌̀◌ͧ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER U, LATIN SMALL LETTER B +0061 0367 0315 0300 05AE 0062;0061 05AE 0367 0300 0315 0062;0061 05AE 0367 0300 0315 0062;0061 05AE 0367 0300 0315 0062;0061 05AE 0367 0300 0315 0062; # (a◌ͧ◌̕◌̀◌֮b; a◌֮◌ͧ◌̀◌̕b; a◌֮◌ͧ◌̀◌̕b; a◌֮◌ͧ◌̀◌̕b; a◌֮◌ͧ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER U, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0368 0062;00E0 05AE 0368 0315 0062;0061 05AE 0300 0368 0315 0062;00E0 05AE 0368 0315 0062;0061 05AE 0300 0368 0315 0062; # (a◌̕◌̀◌֮◌ͨb; à◌֮◌ͨ◌̕b; a◌֮◌̀◌ͨ◌̕b; à◌֮◌ͨ◌̕b; a◌֮◌̀◌ͨ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER C, LATIN SMALL LETTER B +0061 0368 0315 0300 05AE 0062;0061 05AE 0368 0300 0315 0062;0061 05AE 0368 0300 0315 0062;0061 05AE 0368 0300 0315 0062;0061 05AE 0368 0300 0315 0062; # (a◌ͨ◌̕◌̀◌֮b; a◌֮◌ͨ◌̀◌̕b; a◌֮◌ͨ◌̀◌̕b; a◌֮◌ͨ◌̀◌̕b; a◌֮◌ͨ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER C, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0369 0062;00E0 05AE 0369 0315 0062;0061 05AE 0300 0369 0315 0062;00E0 05AE 0369 0315 0062;0061 05AE 0300 0369 0315 0062; # (a◌̕◌̀◌֮◌ͩb; à◌֮◌ͩ◌̕b; a◌֮◌̀◌ͩ◌̕b; à◌֮◌ͩ◌̕b; a◌֮◌̀◌ͩ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER D, LATIN SMALL LETTER B +0061 0369 0315 0300 05AE 0062;0061 05AE 0369 0300 0315 0062;0061 05AE 0369 0300 0315 0062;0061 05AE 0369 0300 0315 0062;0061 05AE 0369 0300 0315 0062; # (a◌ͩ◌̕◌̀◌֮b; a◌֮◌ͩ◌̀◌̕b; a◌֮◌ͩ◌̀◌̕b; a◌֮◌ͩ◌̀◌̕b; a◌֮◌ͩ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER D, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036A 0062;00E0 05AE 036A 0315 0062;0061 05AE 0300 036A 0315 0062;00E0 05AE 036A 0315 0062;0061 05AE 0300 036A 0315 0062; # (a◌̕◌̀◌֮◌ͪb; à◌֮◌ͪ◌̕b; a◌֮◌̀◌ͪ◌̕b; à◌֮◌ͪ◌̕b; a◌֮◌̀◌ͪ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER H, LATIN SMALL LETTER B +0061 036A 0315 0300 05AE 0062;0061 05AE 036A 0300 0315 0062;0061 05AE 036A 0300 0315 0062;0061 05AE 036A 0300 0315 0062;0061 05AE 036A 0300 0315 0062; # (a◌ͪ◌̕◌̀◌֮b; a◌֮◌ͪ◌̀◌̕b; a◌֮◌ͪ◌̀◌̕b; a◌֮◌ͪ◌̀◌̕b; a◌֮◌ͪ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER H, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036B 0062;00E0 05AE 036B 0315 0062;0061 05AE 0300 036B 0315 0062;00E0 05AE 036B 0315 0062;0061 05AE 0300 036B 0315 0062; # (a◌̕◌̀◌֮◌ͫb; à◌֮◌ͫ◌̕b; a◌֮◌̀◌ͫ◌̕b; à◌֮◌ͫ◌̕b; a◌֮◌̀◌ͫ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER M, LATIN SMALL LETTER B +0061 036B 0315 0300 05AE 0062;0061 05AE 036B 0300 0315 0062;0061 05AE 036B 0300 0315 0062;0061 05AE 036B 0300 0315 0062;0061 05AE 036B 0300 0315 0062; # (a◌ͫ◌̕◌̀◌֮b; a◌֮◌ͫ◌̀◌̕b; a◌֮◌ͫ◌̀◌̕b; a◌֮◌ͫ◌̀◌̕b; a◌֮◌ͫ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER M, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036C 0062;00E0 05AE 036C 0315 0062;0061 05AE 0300 036C 0315 0062;00E0 05AE 036C 0315 0062;0061 05AE 0300 036C 0315 0062; # (a◌̕◌̀◌֮◌ͬb; à◌֮◌ͬ◌̕b; a◌֮◌̀◌ͬ◌̕b; à◌֮◌ͬ◌̕b; a◌֮◌̀◌ͬ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER R, LATIN SMALL LETTER B +0061 036C 0315 0300 05AE 0062;0061 05AE 036C 0300 0315 0062;0061 05AE 036C 0300 0315 0062;0061 05AE 036C 0300 0315 0062;0061 05AE 036C 0300 0315 0062; # (a◌ͬ◌̕◌̀◌֮b; a◌֮◌ͬ◌̀◌̕b; a◌֮◌ͬ◌̀◌̕b; a◌֮◌ͬ◌̀◌̕b; a◌֮◌ͬ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER R, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036D 0062;00E0 05AE 036D 0315 0062;0061 05AE 0300 036D 0315 0062;00E0 05AE 036D 0315 0062;0061 05AE 0300 036D 0315 0062; # (a◌̕◌̀◌֮◌ͭb; à◌֮◌ͭ◌̕b; a◌֮◌̀◌ͭ◌̕b; à◌֮◌ͭ◌̕b; a◌֮◌̀◌ͭ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER T, LATIN SMALL LETTER B +0061 036D 0315 0300 05AE 0062;0061 05AE 036D 0300 0315 0062;0061 05AE 036D 0300 0315 0062;0061 05AE 036D 0300 0315 0062;0061 05AE 036D 0300 0315 0062; # (a◌ͭ◌̕◌̀◌֮b; a◌֮◌ͭ◌̀◌̕b; a◌֮◌ͭ◌̀◌̕b; a◌֮◌ͭ◌̀◌̕b; a◌֮◌ͭ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER T, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036E 0062;00E0 05AE 036E 0315 0062;0061 05AE 0300 036E 0315 0062;00E0 05AE 036E 0315 0062;0061 05AE 0300 036E 0315 0062; # (a◌̕◌̀◌֮◌ͮb; à◌֮◌ͮ◌̕b; a◌֮◌̀◌ͮ◌̕b; à◌֮◌ͮ◌̕b; a◌֮◌̀◌ͮ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER V, LATIN SMALL LETTER B +0061 036E 0315 0300 05AE 0062;0061 05AE 036E 0300 0315 0062;0061 05AE 036E 0300 0315 0062;0061 05AE 036E 0300 0315 0062;0061 05AE 036E 0300 0315 0062; # (a◌ͮ◌̕◌̀◌֮b; a◌֮◌ͮ◌̀◌̕b; a◌֮◌ͮ◌̀◌̕b; a◌֮◌ͮ◌̀◌̕b; a◌֮◌ͮ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER V, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 036F 0062;00E0 05AE 036F 0315 0062;0061 05AE 0300 036F 0315 0062;00E0 05AE 036F 0315 0062;0061 05AE 0300 036F 0315 0062; # (a◌̕◌̀◌֮◌ͯb; à◌֮◌ͯ◌̕b; a◌֮◌̀◌ͯ◌̕b; à◌֮◌ͯ◌̕b; a◌֮◌̀◌ͯ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER X, LATIN SMALL LETTER B +0061 036F 0315 0300 05AE 0062;0061 05AE 036F 0300 0315 0062;0061 05AE 036F 0300 0315 0062;0061 05AE 036F 0300 0315 0062;0061 05AE 036F 0300 0315 0062; # (a◌ͯ◌̕◌̀◌֮b; a◌֮◌ͯ◌̀◌̕b; a◌֮◌ͯ◌̀◌̕b; a◌֮◌ͯ◌̀◌̕b; a◌֮◌ͯ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER X, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0483 0062;00E0 05AE 0483 0315 0062;0061 05AE 0300 0483 0315 0062;00E0 05AE 0483 0315 0062;0061 05AE 0300 0483 0315 0062; # (a◌̕◌̀◌֮◌҃b; à◌֮◌҃◌̕b; a◌֮◌̀◌҃◌̕b; à◌֮◌҃◌̕b; a◌֮◌̀◌҃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC TITLO, LATIN SMALL LETTER B +0061 0483 0315 0300 05AE 0062;0061 05AE 0483 0300 0315 0062;0061 05AE 0483 0300 0315 0062;0061 05AE 0483 0300 0315 0062;0061 05AE 0483 0300 0315 0062; # (a◌҃◌̕◌̀◌֮b; a◌֮◌҃◌̀◌̕b; a◌֮◌҃◌̀◌̕b; a◌֮◌҃◌̀◌̕b; a◌֮◌҃◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC TITLO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0484 0062;00E0 05AE 0484 0315 0062;0061 05AE 0300 0484 0315 0062;00E0 05AE 0484 0315 0062;0061 05AE 0300 0484 0315 0062; # (a◌̕◌̀◌֮◌҄b; à◌֮◌҄◌̕b; a◌֮◌̀◌҄◌̕b; à◌֮◌҄◌̕b; a◌֮◌̀◌҄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC PALATALIZATION, LATIN SMALL LETTER B +0061 0484 0315 0300 05AE 0062;0061 05AE 0484 0300 0315 0062;0061 05AE 0484 0300 0315 0062;0061 05AE 0484 0300 0315 0062;0061 05AE 0484 0300 0315 0062; # (a◌҄◌̕◌̀◌֮b; a◌֮◌҄◌̀◌̕b; a◌֮◌҄◌̀◌̕b; a◌֮◌҄◌̀◌̕b; a◌֮◌҄◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC PALATALIZATION, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0485 0062;00E0 05AE 0485 0315 0062;0061 05AE 0300 0485 0315 0062;00E0 05AE 0485 0315 0062;0061 05AE 0300 0485 0315 0062; # (a◌̕◌̀◌֮◌҅b; à◌֮◌҅◌̕b; a◌֮◌̀◌҅◌̕b; à◌֮◌҅◌̕b; a◌֮◌̀◌҅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC DASIA PNEUMATA, LATIN SMALL LETTER B +0061 0485 0315 0300 05AE 0062;0061 05AE 0485 0300 0315 0062;0061 05AE 0485 0300 0315 0062;0061 05AE 0485 0300 0315 0062;0061 05AE 0485 0300 0315 0062; # (a◌҅◌̕◌̀◌֮b; a◌֮◌҅◌̀◌̕b; a◌֮◌҅◌̀◌̕b; a◌֮◌҅◌̀◌̕b; a◌֮◌҅◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC DASIA PNEUMATA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0486 0062;00E0 05AE 0486 0315 0062;0061 05AE 0300 0486 0315 0062;00E0 05AE 0486 0315 0062;0061 05AE 0300 0486 0315 0062; # (a◌̕◌̀◌֮◌҆b; à◌֮◌҆◌̕b; a◌֮◌̀◌҆◌̕b; à◌֮◌҆◌̕b; a◌֮◌̀◌҆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC PSILI PNEUMATA, LATIN SMALL LETTER B +0061 0486 0315 0300 05AE 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062; # (a◌҆◌̕◌̀◌֮b; a◌֮◌҆◌̀◌̕b; a◌֮◌҆◌̀◌̕b; a◌֮◌҆◌̀◌̕b; a◌֮◌҆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC PSILI PNEUMATA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0487 0062;00E0 05AE 0487 0315 0062;0061 05AE 0300 0487 0315 0062;00E0 05AE 0487 0315 0062;0061 05AE 0300 0487 0315 0062; # (a◌̕◌̀◌֮◌҇b; à◌֮◌҇◌̕b; a◌֮◌̀◌҇◌̕b; à◌֮◌҇◌̕b; a◌֮◌̀◌҇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC POKRYTIE, LATIN SMALL LETTER B +0061 0487 0315 0300 05AE 0062;0061 05AE 0487 0300 0315 0062;0061 05AE 0487 0300 0315 0062;0061 05AE 0487 0300 0315 0062;0061 05AE 0487 0300 0315 0062; # (a◌҇◌̕◌̀◌֮b; a◌֮◌҇◌̀◌̕b; a◌֮◌҇◌̀◌̕b; a◌֮◌҇◌̀◌̕b; a◌֮◌҇◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC POKRYTIE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0591 0062;0061 1DFA 0316 0591 059A 0062;0061 1DFA 0316 0591 059A 0062;0061 1DFA 0316 0591 059A 0062;0061 1DFA 0316 0591 059A 0062; # (a◌֚◌̖◌᷺◌֑b; a◌᷺◌̖◌֑◌֚b; a◌᷺◌̖◌֑◌֚b; a◌᷺◌̖◌֑◌֚b; a◌᷺◌̖◌֑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT ETNAHTA, LATIN SMALL LETTER B +0061 0591 059A 0316 1DFA 0062;0061 1DFA 0591 0316 059A 0062;0061 1DFA 0591 0316 059A 0062;0061 1DFA 0591 0316 059A 0062;0061 1DFA 0591 0316 059A 0062; # (a◌֑◌֚◌̖◌᷺b; a◌᷺◌֑◌̖◌֚b; a◌᷺◌֑◌̖◌֚b; a◌᷺◌֑◌̖◌֚b; a◌᷺◌֑◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT ETNAHTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0592 0062;00E0 05AE 0592 0315 0062;0061 05AE 0300 0592 0315 0062;00E0 05AE 0592 0315 0062;0061 05AE 0300 0592 0315 0062; # (a◌̕◌̀◌֮◌֒b; à◌֮◌֒◌̕b; a◌֮◌̀◌֒◌̕b; à◌֮◌֒◌̕b; a◌֮◌̀◌֒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT SEGOL, LATIN SMALL LETTER B +0061 0592 0315 0300 05AE 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062; # (a◌֒◌̕◌̀◌֮b; a◌֮◌֒◌̀◌̕b; a◌֮◌֒◌̀◌̕b; a◌֮◌֒◌̀◌̕b; a◌֮◌֒◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT SEGOL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0593 0062;00E0 05AE 0593 0315 0062;0061 05AE 0300 0593 0315 0062;00E0 05AE 0593 0315 0062;0061 05AE 0300 0593 0315 0062; # (a◌̕◌̀◌֮◌֓b; à◌֮◌֓◌̕b; a◌֮◌̀◌֓◌̕b; à◌֮◌֓◌̕b; a◌֮◌̀◌֓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT SHALSHELET, LATIN SMALL LETTER B +0061 0593 0315 0300 05AE 0062;0061 05AE 0593 0300 0315 0062;0061 05AE 0593 0300 0315 0062;0061 05AE 0593 0300 0315 0062;0061 05AE 0593 0300 0315 0062; # (a◌֓◌̕◌̀◌֮b; a◌֮◌֓◌̀◌̕b; a◌֮◌֓◌̀◌̕b; a◌֮◌֓◌̀◌̕b; a◌֮◌֓◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT SHALSHELET, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0594 0062;00E0 05AE 0594 0315 0062;0061 05AE 0300 0594 0315 0062;00E0 05AE 0594 0315 0062;0061 05AE 0300 0594 0315 0062; # (a◌̕◌̀◌֮◌֔b; à◌֮◌֔◌̕b; a◌֮◌̀◌֔◌̕b; à◌֮◌֔◌̕b; a◌֮◌̀◌֔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ZAQEF QATAN, LATIN SMALL LETTER B +0061 0594 0315 0300 05AE 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062; # (a◌֔◌̕◌̀◌֮b; a◌֮◌֔◌̀◌̕b; a◌֮◌֔◌̀◌̕b; a◌֮◌֔◌̀◌̕b; a◌֮◌֔◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZAQEF QATAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0595 0062;00E0 05AE 0595 0315 0062;0061 05AE 0300 0595 0315 0062;00E0 05AE 0595 0315 0062;0061 05AE 0300 0595 0315 0062; # (a◌̕◌̀◌֮◌֕b; à◌֮◌֕◌̕b; a◌֮◌̀◌֕◌̕b; à◌֮◌֕◌̕b; a◌֮◌̀◌֕◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ZAQEF GADOL, LATIN SMALL LETTER B +0061 0595 0315 0300 05AE 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062; # (a◌֕◌̕◌̀◌֮b; a◌֮◌֕◌̀◌̕b; a◌֮◌֕◌̀◌̕b; a◌֮◌֕◌̀◌̕b; a◌֮◌֕◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZAQEF GADOL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0596 0062;0061 1DFA 0316 0596 059A 0062;0061 1DFA 0316 0596 059A 0062;0061 1DFA 0316 0596 059A 0062;0061 1DFA 0316 0596 059A 0062; # (a◌֚◌̖◌᷺◌֖b; a◌᷺◌̖◌֖◌֚b; a◌᷺◌̖◌֖◌֚b; a◌᷺◌̖◌֖◌֚b; a◌᷺◌̖◌֖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT TIPEHA, LATIN SMALL LETTER B +0061 0596 059A 0316 1DFA 0062;0061 1DFA 0596 0316 059A 0062;0061 1DFA 0596 0316 059A 0062;0061 1DFA 0596 0316 059A 0062;0061 1DFA 0596 0316 059A 0062; # (a◌֖◌֚◌̖◌᷺b; a◌᷺◌֖◌̖◌֚b; a◌᷺◌֖◌̖◌֚b; a◌᷺◌֖◌̖◌֚b; a◌᷺◌֖◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT TIPEHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0597 0062;00E0 05AE 0597 0315 0062;0061 05AE 0300 0597 0315 0062;00E0 05AE 0597 0315 0062;0061 05AE 0300 0597 0315 0062; # (a◌̕◌̀◌֮◌֗b; à◌֮◌֗◌̕b; a◌֮◌̀◌֗◌̕b; à◌֮◌֗◌̕b; a◌֮◌̀◌֗◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT REVIA, LATIN SMALL LETTER B +0061 0597 0315 0300 05AE 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062; # (a◌֗◌̕◌̀◌֮b; a◌֮◌֗◌̀◌̕b; a◌֮◌֗◌̀◌̕b; a◌֮◌֗◌̀◌̕b; a◌֮◌֗◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT REVIA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0598 0062;00E0 05AE 0598 0315 0062;0061 05AE 0300 0598 0315 0062;00E0 05AE 0598 0315 0062;0061 05AE 0300 0598 0315 0062; # (a◌̕◌̀◌֮◌֘b; à◌֮◌֘◌̕b; a◌֮◌̀◌֘◌̕b; à◌֮◌֘◌̕b; a◌֮◌̀◌֘◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ZARQA, LATIN SMALL LETTER B +0061 0598 0315 0300 05AE 0062;0061 05AE 0598 0300 0315 0062;0061 05AE 0598 0300 0315 0062;0061 05AE 0598 0300 0315 0062;0061 05AE 0598 0300 0315 0062; # (a◌֘◌̕◌̀◌֮b; a◌֮◌֘◌̀◌̕b; a◌֮◌֘◌̀◌̕b; a◌֮◌֘◌̀◌̕b; a◌֮◌֘◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZARQA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0599 0062;00E0 05AE 0599 0315 0062;0061 05AE 0300 0599 0315 0062;00E0 05AE 0599 0315 0062;0061 05AE 0300 0599 0315 0062; # (a◌̕◌̀◌֮◌֙b; à◌֮◌֙◌̕b; a◌֮◌̀◌֙◌̕b; à◌֮◌֙◌̕b; a◌֮◌̀◌֙◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT PASHTA, LATIN SMALL LETTER B +0061 0599 0315 0300 05AE 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062; # (a◌֙◌̕◌̀◌֮b; a◌֮◌֙◌̀◌̕b; a◌֮◌֙◌̀◌̕b; a◌֮◌֙◌̀◌̕b; a◌֮◌֙◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT PASHTA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 302E 059A 0316 059A 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062; # (a〮◌֚◌̖◌֚b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; ) LATIN SMALL LETTER A, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, HEBREW ACCENT YETIV, LATIN SMALL LETTER B +0061 059A 302E 059A 0316 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062; # (a◌֚〮◌֚◌̖b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B +0061 059A 0316 1DFA 059B 0062;0061 1DFA 0316 059B 059A 0062;0061 1DFA 0316 059B 059A 0062;0061 1DFA 0316 059B 059A 0062;0061 1DFA 0316 059B 059A 0062; # (a◌֚◌̖◌᷺◌֛b; a◌᷺◌̖◌֛◌֚b; a◌᷺◌̖◌֛◌֚b; a◌᷺◌̖◌֛◌֚b; a◌᷺◌̖◌֛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT TEVIR, LATIN SMALL LETTER B +0061 059B 059A 0316 1DFA 0062;0061 1DFA 059B 0316 059A 0062;0061 1DFA 059B 0316 059A 0062;0061 1DFA 059B 0316 059A 0062;0061 1DFA 059B 0316 059A 0062; # (a◌֛◌֚◌̖◌᷺b; a◌᷺◌֛◌̖◌֚b; a◌᷺◌֛◌̖◌֚b; a◌᷺◌֛◌̖◌֚b; a◌᷺◌֛◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT TEVIR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 059C 0062;00E0 05AE 059C 0315 0062;0061 05AE 0300 059C 0315 0062;00E0 05AE 059C 0315 0062;0061 05AE 0300 059C 0315 0062; # (a◌̕◌̀◌֮◌֜b; à◌֮◌֜◌̕b; a◌֮◌̀◌֜◌̕b; à◌֮◌֜◌̕b; a◌֮◌̀◌֜◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT GERESH, LATIN SMALL LETTER B +0061 059C 0315 0300 05AE 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062; # (a◌֜◌̕◌̀◌֮b; a◌֮◌֜◌̀◌̕b; a◌֮◌֜◌̀◌̕b; a◌֮◌֜◌̀◌̕b; a◌֮◌֜◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT GERESH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 059D 0062;00E0 05AE 059D 0315 0062;0061 05AE 0300 059D 0315 0062;00E0 05AE 059D 0315 0062;0061 05AE 0300 059D 0315 0062; # (a◌̕◌̀◌֮◌֝b; à◌֮◌֝◌̕b; a◌֮◌̀◌֝◌̕b; à◌֮◌֝◌̕b; a◌֮◌̀◌֝◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT GERESH MUQDAM, LATIN SMALL LETTER B +0061 059D 0315 0300 05AE 0062;0061 05AE 059D 0300 0315 0062;0061 05AE 059D 0300 0315 0062;0061 05AE 059D 0300 0315 0062;0061 05AE 059D 0300 0315 0062; # (a◌֝◌̕◌̀◌֮b; a◌֮◌֝◌̀◌̕b; a◌֮◌֝◌̀◌̕b; a◌֮◌֝◌̀◌̕b; a◌֮◌֝◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT GERESH MUQDAM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 059E 0062;00E0 05AE 059E 0315 0062;0061 05AE 0300 059E 0315 0062;00E0 05AE 059E 0315 0062;0061 05AE 0300 059E 0315 0062; # (a◌̕◌̀◌֮◌֞b; à◌֮◌֞◌̕b; a◌֮◌̀◌֞◌̕b; à◌֮◌֞◌̕b; a◌֮◌̀◌֞◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT GERSHAYIM, LATIN SMALL LETTER B +0061 059E 0315 0300 05AE 0062;0061 05AE 059E 0300 0315 0062;0061 05AE 059E 0300 0315 0062;0061 05AE 059E 0300 0315 0062;0061 05AE 059E 0300 0315 0062; # (a◌֞◌̕◌̀◌֮b; a◌֮◌֞◌̀◌̕b; a◌֮◌֞◌̀◌̕b; a◌֮◌֞◌̀◌̕b; a◌֮◌֞◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT GERSHAYIM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 059F 0062;00E0 05AE 059F 0315 0062;0061 05AE 0300 059F 0315 0062;00E0 05AE 059F 0315 0062;0061 05AE 0300 059F 0315 0062; # (a◌̕◌̀◌֮◌֟b; à◌֮◌֟◌̕b; a◌֮◌̀◌֟◌̕b; à◌֮◌֟◌̕b; a◌֮◌̀◌֟◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT QARNEY PARA, LATIN SMALL LETTER B +0061 059F 0315 0300 05AE 0062;0061 05AE 059F 0300 0315 0062;0061 05AE 059F 0300 0315 0062;0061 05AE 059F 0300 0315 0062;0061 05AE 059F 0300 0315 0062; # (a◌֟◌̕◌̀◌֮b; a◌֮◌֟◌̀◌̕b; a◌֮◌֟◌̀◌̕b; a◌֮◌֟◌̀◌̕b; a◌֮◌֟◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT QARNEY PARA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 05A0 0062;00E0 05AE 05A0 0315 0062;0061 05AE 0300 05A0 0315 0062;00E0 05AE 05A0 0315 0062;0061 05AE 0300 05A0 0315 0062; # (a◌̕◌̀◌֮◌֠b; à◌֮◌֠◌̕b; a◌֮◌̀◌֠◌̕b; à◌֮◌֠◌̕b; a◌֮◌̀◌֠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT TELISHA GEDOLA, LATIN SMALL LETTER B +0061 05A0 0315 0300 05AE 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062; # (a◌֠◌̕◌̀◌֮b; a◌֮◌֠◌̀◌̕b; a◌֮◌֠◌̀◌̕b; a◌֮◌֠◌̀◌̕b; a◌֮◌֠◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT TELISHA GEDOLA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 05A1 0062;00E0 05AE 05A1 0315 0062;0061 05AE 0300 05A1 0315 0062;00E0 05AE 05A1 0315 0062;0061 05AE 0300 05A1 0315 0062; # (a◌̕◌̀◌֮◌֡b; à◌֮◌֡◌̕b; a◌֮◌̀◌֡◌̕b; à◌֮◌֡◌̕b; a◌֮◌̀◌֡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT PAZER, LATIN SMALL LETTER B +0061 05A1 0315 0300 05AE 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062; # (a◌֡◌̕◌̀◌֮b; a◌֮◌֡◌̀◌̕b; a◌֮◌֡◌̀◌̕b; a◌֮◌֡◌̀◌̕b; a◌֮◌֡◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT PAZER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 05A2 0062;0061 1DFA 0316 05A2 059A 0062;0061 1DFA 0316 05A2 059A 0062;0061 1DFA 0316 05A2 059A 0062;0061 1DFA 0316 05A2 059A 0062; # (a◌֚◌̖◌᷺◌֢b; a◌᷺◌̖◌֢◌֚b; a◌᷺◌̖◌֢◌֚b; a◌᷺◌̖◌֢◌֚b; a◌᷺◌̖◌֢◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT ATNAH HAFUKH, LATIN SMALL LETTER B +0061 05A2 059A 0316 1DFA 0062;0061 1DFA 05A2 0316 059A 0062;0061 1DFA 05A2 0316 059A 0062;0061 1DFA 05A2 0316 059A 0062;0061 1DFA 05A2 0316 059A 0062; # (a◌֢◌֚◌̖◌᷺b; a◌᷺◌֢◌̖◌֚b; a◌᷺◌֢◌̖◌֚b; a◌᷺◌֢◌̖◌֚b; a◌᷺◌֢◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT ATNAH HAFUKH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 05A3 0062;0061 1DFA 0316 05A3 059A 0062;0061 1DFA 0316 05A3 059A 0062;0061 1DFA 0316 05A3 059A 0062;0061 1DFA 0316 05A3 059A 0062; # (a◌֚◌̖◌᷺◌֣b; a◌᷺◌̖◌֣◌֚b; a◌᷺◌̖◌֣◌֚b; a◌᷺◌̖◌֣◌֚b; a◌᷺◌̖◌֣◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT MUNAH, LATIN SMALL LETTER B +0061 05A3 059A 0316 1DFA 0062;0061 1DFA 05A3 0316 059A 0062;0061 1DFA 05A3 0316 059A 0062;0061 1DFA 05A3 0316 059A 0062;0061 1DFA 05A3 0316 059A 0062; # (a◌֣◌֚◌̖◌᷺b; a◌᷺◌֣◌̖◌֚b; a◌᷺◌֣◌̖◌֚b; a◌᷺◌֣◌̖◌֚b; a◌᷺◌֣◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MUNAH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 05A4 0062;0061 1DFA 0316 05A4 059A 0062;0061 1DFA 0316 05A4 059A 0062;0061 1DFA 0316 05A4 059A 0062;0061 1DFA 0316 05A4 059A 0062; # (a◌֚◌̖◌᷺◌֤b; a◌᷺◌̖◌֤◌֚b; a◌᷺◌̖◌֤◌֚b; a◌᷺◌̖◌֤◌֚b; a◌᷺◌̖◌֤◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT MAHAPAKH, LATIN SMALL LETTER B +0061 05A4 059A 0316 1DFA 0062;0061 1DFA 05A4 0316 059A 0062;0061 1DFA 05A4 0316 059A 0062;0061 1DFA 05A4 0316 059A 0062;0061 1DFA 05A4 0316 059A 0062; # (a◌֤◌֚◌̖◌᷺b; a◌᷺◌֤◌̖◌֚b; a◌᷺◌֤◌̖◌֚b; a◌᷺◌֤◌̖◌֚b; a◌᷺◌֤◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MAHAPAKH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 05A5 0062;0061 1DFA 0316 05A5 059A 0062;0061 1DFA 0316 05A5 059A 0062;0061 1DFA 0316 05A5 059A 0062;0061 1DFA 0316 05A5 059A 0062; # (a◌֚◌̖◌᷺◌֥b; a◌᷺◌̖◌֥◌֚b; a◌᷺◌̖◌֥◌֚b; a◌᷺◌̖◌֥◌֚b; a◌᷺◌̖◌֥◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT MERKHA, LATIN SMALL LETTER B +0061 05A5 059A 0316 1DFA 0062;0061 1DFA 05A5 0316 059A 0062;0061 1DFA 05A5 0316 059A 0062;0061 1DFA 05A5 0316 059A 0062;0061 1DFA 05A5 0316 059A 0062; # (a◌֥◌֚◌̖◌᷺b; a◌᷺◌֥◌̖◌֚b; a◌᷺◌֥◌̖◌֚b; a◌᷺◌֥◌̖◌֚b; a◌᷺◌֥◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MERKHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 05A6 0062;0061 1DFA 0316 05A6 059A 0062;0061 1DFA 0316 05A6 059A 0062;0061 1DFA 0316 05A6 059A 0062;0061 1DFA 0316 05A6 059A 0062; # (a◌֚◌̖◌᷺◌֦b; a◌᷺◌̖◌֦◌֚b; a◌᷺◌̖◌֦◌֚b; a◌᷺◌̖◌֦◌֚b; a◌᷺◌̖◌֦◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT MERKHA KEFULA, LATIN SMALL LETTER B +0061 05A6 059A 0316 1DFA 0062;0061 1DFA 05A6 0316 059A 0062;0061 1DFA 05A6 0316 059A 0062;0061 1DFA 05A6 0316 059A 0062;0061 1DFA 05A6 0316 059A 0062; # (a◌֦◌֚◌̖◌᷺b; a◌᷺◌֦◌̖◌֚b; a◌᷺◌֦◌̖◌֚b; a◌᷺◌֦◌̖◌֚b; a◌᷺◌֦◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MERKHA KEFULA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 05A7 0062;0061 1DFA 0316 05A7 059A 0062;0061 1DFA 0316 05A7 059A 0062;0061 1DFA 0316 05A7 059A 0062;0061 1DFA 0316 05A7 059A 0062; # (a◌֚◌̖◌᷺◌֧b; a◌᷺◌̖◌֧◌֚b; a◌᷺◌̖◌֧◌֚b; a◌᷺◌̖◌֧◌֚b; a◌᷺◌̖◌֧◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT DARGA, LATIN SMALL LETTER B +0061 05A7 059A 0316 1DFA 0062;0061 1DFA 05A7 0316 059A 0062;0061 1DFA 05A7 0316 059A 0062;0061 1DFA 05A7 0316 059A 0062;0061 1DFA 05A7 0316 059A 0062; # (a◌֧◌֚◌̖◌᷺b; a◌᷺◌֧◌̖◌֚b; a◌᷺◌֧◌̖◌֚b; a◌᷺◌֧◌̖◌֚b; a◌᷺◌֧◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT DARGA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 05A8 0062;00E0 05AE 05A8 0315 0062;0061 05AE 0300 05A8 0315 0062;00E0 05AE 05A8 0315 0062;0061 05AE 0300 05A8 0315 0062; # (a◌̕◌̀◌֮◌֨b; à◌֮◌֨◌̕b; a◌֮◌̀◌֨◌̕b; à◌֮◌֨◌̕b; a◌֮◌̀◌֨◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT QADMA, LATIN SMALL LETTER B +0061 05A8 0315 0300 05AE 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062; # (a◌֨◌̕◌̀◌֮b; a◌֮◌֨◌̀◌̕b; a◌֮◌֨◌̀◌̕b; a◌֮◌֨◌̀◌̕b; a◌֮◌֨◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT QADMA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 05A9 0062;00E0 05AE 05A9 0315 0062;0061 05AE 0300 05A9 0315 0062;00E0 05AE 05A9 0315 0062;0061 05AE 0300 05A9 0315 0062; # (a◌̕◌̀◌֮◌֩b; à◌֮◌֩◌̕b; a◌֮◌̀◌֩◌̕b; à◌֮◌֩◌̕b; a◌֮◌̀◌֩◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT TELISHA QETANA, LATIN SMALL LETTER B +0061 05A9 0315 0300 05AE 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062; # (a◌֩◌̕◌̀◌֮b; a◌֮◌֩◌̀◌̕b; a◌֮◌֩◌̀◌̕b; a◌֮◌֩◌̀◌̕b; a◌֮◌֩◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT TELISHA QETANA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 05AA 0062;0061 1DFA 0316 05AA 059A 0062;0061 1DFA 0316 05AA 059A 0062;0061 1DFA 0316 05AA 059A 0062;0061 1DFA 0316 05AA 059A 0062; # (a◌֚◌̖◌᷺◌֪b; a◌᷺◌̖◌֪◌֚b; a◌᷺◌̖◌֪◌֚b; a◌᷺◌̖◌֪◌֚b; a◌᷺◌̖◌֪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT YERAH BEN YOMO, LATIN SMALL LETTER B +0061 05AA 059A 0316 1DFA 0062;0061 1DFA 05AA 0316 059A 0062;0061 1DFA 05AA 0316 059A 0062;0061 1DFA 05AA 0316 059A 0062;0061 1DFA 05AA 0316 059A 0062; # (a◌֪◌֚◌̖◌᷺b; a◌᷺◌֪◌̖◌֚b; a◌᷺◌֪◌̖◌֚b; a◌᷺◌֪◌̖◌֚b; a◌᷺◌֪◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YERAH BEN YOMO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 05AB 0062;00E0 05AE 05AB 0315 0062;0061 05AE 0300 05AB 0315 0062;00E0 05AE 05AB 0315 0062;0061 05AE 0300 05AB 0315 0062; # (a◌̕◌̀◌֮◌֫b; à◌֮◌֫◌̕b; a◌֮◌̀◌֫◌̕b; à◌֮◌֫◌̕b; a◌֮◌̀◌֫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT OLE, LATIN SMALL LETTER B +0061 05AB 0315 0300 05AE 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062; # (a◌֫◌̕◌̀◌֮b; a◌֮◌֫◌̀◌̕b; a◌֮◌֫◌̀◌̕b; a◌֮◌֫◌̀◌̕b; a◌֮◌֫◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT OLE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 05AC 0062;00E0 05AE 05AC 0315 0062;0061 05AE 0300 05AC 0315 0062;00E0 05AE 05AC 0315 0062;0061 05AE 0300 05AC 0315 0062; # (a◌̕◌̀◌֮◌֬b; à◌֮◌֬◌̕b; a◌֮◌̀◌֬◌̕b; à◌֮◌֬◌̕b; a◌֮◌̀◌֬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ILUY, LATIN SMALL LETTER B +0061 05AC 0315 0300 05AE 0062;0061 05AE 05AC 0300 0315 0062;0061 05AE 05AC 0300 0315 0062;0061 05AE 05AC 0300 0315 0062;0061 05AE 05AC 0300 0315 0062; # (a◌֬◌̕◌̀◌֮b; a◌֮◌֬◌̀◌̕b; a◌֮◌֬◌̀◌̕b; a◌֮◌֬◌̀◌̕b; a◌֮◌֬◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT ILUY, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 302E 059A 0316 05AD 0062;0061 0316 059A 05AD 302E 0062;0061 0316 059A 05AD 302E 0062;0061 0316 059A 05AD 302E 0062;0061 0316 059A 05AD 302E 0062; # (a〮◌֚◌̖◌֭b; a◌̖◌֚◌֭〮b; a◌̖◌֚◌֭〮b; a◌̖◌֚◌֭〮b; a◌̖◌֚◌֭〮b; ) LATIN SMALL LETTER A, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, HEBREW ACCENT DEHI, LATIN SMALL LETTER B +0061 05AD 302E 059A 0316 0062;0061 0316 05AD 059A 302E 0062;0061 0316 05AD 059A 302E 0062;0061 0316 05AD 059A 302E 0062;0061 0316 05AD 059A 302E 0062; # (a◌֭〮◌֚◌̖b; a◌̖◌֭◌֚〮b; a◌̖◌֭◌֚〮b; a◌̖◌֭◌֚〮b; a◌̖◌֭◌֚〮b; ) LATIN SMALL LETTER A, HEBREW ACCENT DEHI, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B +0061 0300 05AE 1D16D 05AE 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062; # (a◌̀◌𝅭֮◌֮b; à𝅭◌֮◌֮b; a𝅭◌֮◌֮◌̀b; à𝅭◌֮◌֮b; a𝅭◌֮◌֮◌̀b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05AE 0300 05AE 1D16D 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062;00E0 1D16D 05AE 05AE 0062;0061 1D16D 05AE 05AE 0300 0062; # (a◌֮◌̀◌𝅭֮b; à𝅭◌֮◌֮b; a𝅭◌֮◌֮◌̀b; à𝅭◌֮◌֮b; a𝅭◌֮◌֮◌̀b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZINOR, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 0315 0300 05AE 05AF 0062;00E0 05AE 05AF 0315 0062;0061 05AE 0300 05AF 0315 0062;00E0 05AE 05AF 0315 0062;0061 05AE 0300 05AF 0315 0062; # (a◌̕◌̀◌֮◌֯b; à◌֮◌֯◌̕b; a◌֮◌̀◌֯◌̕b; à◌֮◌֯◌̕b; a◌֮◌̀◌֯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW MARK MASORA CIRCLE, LATIN SMALL LETTER B +0061 05AF 0315 0300 05AE 0062;0061 05AE 05AF 0300 0315 0062;0061 05AE 05AF 0300 0315 0062;0061 05AE 05AF 0300 0315 0062;0061 05AE 05AF 0300 0315 0062; # (a◌֯◌̕◌̀◌֮b; a◌֮◌֯◌̀◌̕b; a◌֮◌֯◌̀◌̕b; a◌֮◌֯◌̀◌̕b; a◌֮◌֯◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW MARK MASORA CIRCLE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B1 05B0 094D 05B0 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062; # (a◌ֱ◌ְ◌्◌ְb; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF SEGOL, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, HEBREW POINT SHEVA, LATIN SMALL LETTER B +0061 05B0 05B1 05B0 094D 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062;0061 094D 05B0 05B0 05B1 0062; # (a◌ְ◌ֱ◌ְ◌्b; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; a◌्◌ְ◌ְ◌ֱb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, HEBREW POINT HATAF SEGOL, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, LATIN SMALL LETTER B +0061 05B2 05B1 05B0 05B1 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062; # (a◌ֲ◌ֱ◌ְ◌ֱb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF SEGOL, HEBREW POINT SHEVA, HEBREW POINT HATAF SEGOL, LATIN SMALL LETTER B +0061 05B1 05B2 05B1 05B0 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062;0061 05B0 05B1 05B1 05B2 0062; # (a◌ֱ◌ֲ◌ֱ◌ְb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; a◌ְ◌ֱ◌ֱ◌ֲb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF SEGOL, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF SEGOL, HEBREW POINT SHEVA, LATIN SMALL LETTER B +0061 05B3 05B2 05B1 05B2 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062; # (a◌ֳ◌ֲ◌ֱ◌ֲb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF QAMATS, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF SEGOL, HEBREW POINT HATAF PATAH, LATIN SMALL LETTER B +0061 05B2 05B3 05B2 05B1 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062;0061 05B1 05B2 05B2 05B3 0062; # (a◌ֲ◌ֳ◌ֲ◌ֱb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; a◌ֱ◌ֲ◌ֲ◌ֳb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF QAMATS, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF SEGOL, LATIN SMALL LETTER B +0061 05B4 05B3 05B2 05B3 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062; # (a◌ִ◌ֳ◌ֲ◌ֳb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; ) LATIN SMALL LETTER A, HEBREW POINT HIRIQ, HEBREW POINT HATAF QAMATS, HEBREW POINT HATAF PATAH, HEBREW POINT HATAF QAMATS, LATIN SMALL LETTER B +0061 05B3 05B4 05B3 05B2 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062;0061 05B2 05B3 05B3 05B4 0062; # (a◌ֳ◌ִ◌ֳ◌ֲb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; a◌ֲ◌ֳ◌ֳ◌ִb; ) LATIN SMALL LETTER A, HEBREW POINT HATAF QAMATS, HEBREW POINT HIRIQ, HEBREW POINT HATAF QAMATS, HEBREW POINT HATAF PATAH, LATIN SMALL LETTER B +0061 05B5 05B4 05B3 05B4 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062; # (a◌ֵ◌ִ◌ֳ◌ִb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; ) LATIN SMALL LETTER A, HEBREW POINT TSERE, HEBREW POINT HIRIQ, HEBREW POINT HATAF QAMATS, HEBREW POINT HIRIQ, LATIN SMALL LETTER B +0061 05B4 05B5 05B4 05B3 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062;0061 05B3 05B4 05B4 05B5 0062; # (a◌ִ◌ֵ◌ִ◌ֳb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; a◌ֳ◌ִ◌ִ◌ֵb; ) LATIN SMALL LETTER A, HEBREW POINT HIRIQ, HEBREW POINT TSERE, HEBREW POINT HIRIQ, HEBREW POINT HATAF QAMATS, LATIN SMALL LETTER B +0061 05B6 05B5 05B4 05B5 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062; # (a◌ֶ◌ֵ◌ִ◌ֵb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; ) LATIN SMALL LETTER A, HEBREW POINT SEGOL, HEBREW POINT TSERE, HEBREW POINT HIRIQ, HEBREW POINT TSERE, LATIN SMALL LETTER B +0061 05B5 05B6 05B5 05B4 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062;0061 05B4 05B5 05B5 05B6 0062; # (a◌ֵ◌ֶ◌ֵ◌ִb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; a◌ִ◌ֵ◌ֵ◌ֶb; ) LATIN SMALL LETTER A, HEBREW POINT TSERE, HEBREW POINT SEGOL, HEBREW POINT TSERE, HEBREW POINT HIRIQ, LATIN SMALL LETTER B +0061 05B7 05B6 05B5 05B6 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062; # (a◌ַ◌ֶ◌ֵ◌ֶb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; ) LATIN SMALL LETTER A, HEBREW POINT PATAH, HEBREW POINT SEGOL, HEBREW POINT TSERE, HEBREW POINT SEGOL, LATIN SMALL LETTER B +0061 05B6 05B7 05B6 05B5 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062;0061 05B5 05B6 05B6 05B7 0062; # (a◌ֶ◌ַ◌ֶ◌ֵb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; a◌ֵ◌ֶ◌ֶ◌ַb; ) LATIN SMALL LETTER A, HEBREW POINT SEGOL, HEBREW POINT PATAH, HEBREW POINT SEGOL, HEBREW POINT TSERE, LATIN SMALL LETTER B +0061 05B8 05B7 05B6 05B7 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062; # (a◌ָ◌ַ◌ֶ◌ַb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; ) LATIN SMALL LETTER A, HEBREW POINT QAMATS, HEBREW POINT PATAH, HEBREW POINT SEGOL, HEBREW POINT PATAH, LATIN SMALL LETTER B +0061 05B7 05B8 05B7 05B6 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062;0061 05B6 05B7 05B7 05B8 0062; # (a◌ַ◌ָ◌ַ◌ֶb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; a◌ֶ◌ַ◌ַ◌ָb; ) LATIN SMALL LETTER A, HEBREW POINT PATAH, HEBREW POINT QAMATS, HEBREW POINT PATAH, HEBREW POINT SEGOL, LATIN SMALL LETTER B +0061 05B9 05B8 05B7 05B8 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062; # (a◌ֹ◌ָ◌ַ◌ָb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; ) LATIN SMALL LETTER A, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT PATAH, HEBREW POINT QAMATS, LATIN SMALL LETTER B +0061 05B8 05B9 05B8 05B7 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062;0061 05B7 05B8 05B8 05B9 0062; # (a◌ָ◌ֹ◌ָ◌ַb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; a◌ַ◌ָ◌ָ◌ֹb; ) LATIN SMALL LETTER A, HEBREW POINT QAMATS, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT PATAH, LATIN SMALL LETTER B +0061 05BB 05B9 05B8 05B9 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062; # (a◌ֻ◌ֹ◌ָ◌ֹb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; ) LATIN SMALL LETTER A, HEBREW POINT QUBUTS, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT HOLAM, LATIN SMALL LETTER B +0061 05B9 05BB 05B9 05B8 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062;0061 05B8 05B9 05B9 05BB 0062; # (a◌ֹ◌ֻ◌ֹ◌ָb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; a◌ָ◌ֹ◌ֹ◌ֻb; ) LATIN SMALL LETTER A, HEBREW POINT HOLAM, HEBREW POINT QUBUTS, HEBREW POINT HOLAM, HEBREW POINT QAMATS, LATIN SMALL LETTER B +0061 05BB 05B9 05B8 05BA 0062;0061 05B8 05B9 05BA 05BB 0062;0061 05B8 05B9 05BA 05BB 0062;0061 05B8 05B9 05BA 05BB 0062;0061 05B8 05B9 05BA 05BB 0062; # (a◌ֻ◌ֹ◌ָ◌ֺb; a◌ָ◌ֹ◌ֺ◌ֻb; a◌ָ◌ֹ◌ֺ◌ֻb; a◌ָ◌ֹ◌ֺ◌ֻb; a◌ָ◌ֹ◌ֺ◌ֻb; ) LATIN SMALL LETTER A, HEBREW POINT QUBUTS, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT HOLAM HASER FOR VAV, LATIN SMALL LETTER B +0061 05BA 05BB 05B9 05B8 0062;0061 05B8 05BA 05B9 05BB 0062;0061 05B8 05BA 05B9 05BB 0062;0061 05B8 05BA 05B9 05BB 0062;0061 05B8 05BA 05B9 05BB 0062; # (a◌ֺ◌ֻ◌ֹ◌ָb; a◌ָ◌ֺ◌ֹ◌ֻb; a◌ָ◌ֺ◌ֹ◌ֻb; a◌ָ◌ֺ◌ֹ◌ֻb; a◌ָ◌ֺ◌ֹ◌ֻb; ) LATIN SMALL LETTER A, HEBREW POINT HOLAM HASER FOR VAV, HEBREW POINT QUBUTS, HEBREW POINT HOLAM, HEBREW POINT QAMATS, LATIN SMALL LETTER B +0061 05BC 05BB 05B9 05BB 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062; # (a◌ּ◌ֻ◌ֹ◌ֻb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; ) LATIN SMALL LETTER A, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT QUBUTS, HEBREW POINT HOLAM, HEBREW POINT QUBUTS, LATIN SMALL LETTER B +0061 05BB 05BC 05BB 05B9 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062;0061 05B9 05BB 05BB 05BC 0062; # (a◌ֻ◌ּ◌ֻ◌ֹb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; a◌ֹ◌ֻ◌ֻ◌ּb; ) LATIN SMALL LETTER A, HEBREW POINT QUBUTS, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT QUBUTS, HEBREW POINT HOLAM, LATIN SMALL LETTER B +0061 05BD 05BC 05BB 05BC 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062; # (a◌ֽ◌ּ◌ֻ◌ּb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; ) LATIN SMALL LETTER A, HEBREW POINT METEG, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT QUBUTS, HEBREW POINT DAGESH OR MAPIQ, LATIN SMALL LETTER B +0061 05BC 05BD 05BC 05BB 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062;0061 05BB 05BC 05BC 05BD 0062; # (a◌ּ◌ֽ◌ּ◌ֻb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; a◌ֻ◌ּ◌ּ◌ֽb; ) LATIN SMALL LETTER A, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT METEG, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT QUBUTS, LATIN SMALL LETTER B +0061 05BF 05BD 05BC 05BD 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062; # (a◌ֿ◌ֽ◌ּ◌ֽb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; ) LATIN SMALL LETTER A, HEBREW POINT RAFE, HEBREW POINT METEG, HEBREW POINT DAGESH OR MAPIQ, HEBREW POINT METEG, LATIN SMALL LETTER B +0061 05BD 05BF 05BD 05BC 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062;0061 05BC 05BD 05BD 05BF 0062; # (a◌ֽ◌ֿ◌ֽ◌ּb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; a◌ּ◌ֽ◌ֽ◌ֿb; ) LATIN SMALL LETTER A, HEBREW POINT METEG, HEBREW POINT RAFE, HEBREW POINT METEG, HEBREW POINT DAGESH OR MAPIQ, LATIN SMALL LETTER B +0061 05C1 05BF 05BD 05BF 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062; # (a◌ׁ◌ֿ◌ֽ◌ֿb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; ) LATIN SMALL LETTER A, HEBREW POINT SHIN DOT, HEBREW POINT RAFE, HEBREW POINT METEG, HEBREW POINT RAFE, LATIN SMALL LETTER B +0061 05BF 05C1 05BF 05BD 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062;0061 05BD 05BF 05BF 05C1 0062; # (a◌ֿ◌ׁ◌ֿ◌ֽb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; a◌ֽ◌ֿ◌ֿ◌ׁb; ) LATIN SMALL LETTER A, HEBREW POINT RAFE, HEBREW POINT SHIN DOT, HEBREW POINT RAFE, HEBREW POINT METEG, LATIN SMALL LETTER B +0061 05C2 05C1 05BF 05C1 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062; # (a◌ׂ◌ׁ◌ֿ◌ׁb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; ) LATIN SMALL LETTER A, HEBREW POINT SIN DOT, HEBREW POINT SHIN DOT, HEBREW POINT RAFE, HEBREW POINT SHIN DOT, LATIN SMALL LETTER B +0061 05C1 05C2 05C1 05BF 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062;0061 05BF 05C1 05C1 05C2 0062; # (a◌ׁ◌ׂ◌ׁ◌ֿb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; a◌ֿ◌ׁ◌ׁ◌ׂb; ) LATIN SMALL LETTER A, HEBREW POINT SHIN DOT, HEBREW POINT SIN DOT, HEBREW POINT SHIN DOT, HEBREW POINT RAFE, LATIN SMALL LETTER B +0061 FB1E 05C2 05C1 05C2 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062; # (a◌ﬞ◌ׂ◌ׁ◌ׂb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; ) LATIN SMALL LETTER A, HEBREW POINT JUDEO-SPANISH VARIKA, HEBREW POINT SIN DOT, HEBREW POINT SHIN DOT, HEBREW POINT SIN DOT, LATIN SMALL LETTER B +0061 05C2 FB1E 05C2 05C1 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062; # (a◌ׂ◌ﬞ◌ׂ◌ׁb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; a◌ׁ◌ׂ◌ׂ◌ﬞb; ) LATIN SMALL LETTER A, HEBREW POINT SIN DOT, HEBREW POINT JUDEO-SPANISH VARIKA, HEBREW POINT SIN DOT, HEBREW POINT SHIN DOT, LATIN SMALL LETTER B +0061 0315 0300 05AE 05C4 0062;00E0 05AE 05C4 0315 0062;0061 05AE 0300 05C4 0315 0062;00E0 05AE 05C4 0315 0062;0061 05AE 0300 05C4 0315 0062; # (a◌̕◌̀◌֮◌ׄb; à◌֮◌ׄ◌̕b; a◌֮◌̀◌ׄ◌̕b; à◌֮◌ׄ◌̕b; a◌֮◌̀◌ׄ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW MARK UPPER DOT, LATIN SMALL LETTER B +0061 05C4 0315 0300 05AE 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062; # (a◌ׄ◌̕◌̀◌֮b; a◌֮◌ׄ◌̀◌̕b; a◌֮◌ׄ◌̀◌̕b; a◌֮◌ׄ◌̀◌̕b; a◌֮◌ׄ◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW MARK UPPER DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 05C5 0062;0061 1DFA 0316 05C5 059A 0062;0061 1DFA 0316 05C5 059A 0062;0061 1DFA 0316 05C5 059A 0062;0061 1DFA 0316 05C5 059A 0062; # (a◌֚◌̖◌᷺◌ׅb; a◌᷺◌̖◌ׅ◌֚b; a◌᷺◌̖◌ׅ◌֚b; a◌᷺◌̖◌ׅ◌֚b; a◌᷺◌̖◌ׅ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW MARK LOWER DOT, LATIN SMALL LETTER B +0061 05C5 059A 0316 1DFA 0062;0061 1DFA 05C5 0316 059A 0062;0061 1DFA 05C5 0316 059A 0062;0061 1DFA 05C5 0316 059A 0062;0061 1DFA 05C5 0316 059A 0062; # (a◌ׅ◌֚◌̖◌᷺b; a◌᷺◌ׅ◌̖◌֚b; a◌᷺◌ׅ◌̖◌֚b; a◌᷺◌ׅ◌̖◌֚b; a◌᷺◌ׅ◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW MARK LOWER DOT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 05B9 05B8 05B7 05C7 0062;0061 05B7 05B8 05C7 05B9 0062;0061 05B7 05B8 05C7 05B9 0062;0061 05B7 05B8 05C7 05B9 0062;0061 05B7 05B8 05C7 05B9 0062; # (a◌ֹ◌ָ◌ַ◌ׇb; a◌ַ◌ָ◌ׇ◌ֹb; a◌ַ◌ָ◌ׇ◌ֹb; a◌ַ◌ָ◌ׇ◌ֹb; a◌ַ◌ָ◌ׇ◌ֹb; ) LATIN SMALL LETTER A, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT PATAH, HEBREW POINT QAMATS QATAN, LATIN SMALL LETTER B +0061 05C7 05B9 05B8 05B7 0062;0061 05B7 05C7 05B8 05B9 0062;0061 05B7 05C7 05B8 05B9 0062;0061 05B7 05C7 05B8 05B9 0062;0061 05B7 05C7 05B8 05B9 0062; # (a◌ׇ◌ֹ◌ָ◌ַb; a◌ַ◌ׇ◌ָ◌ֹb; a◌ַ◌ׇ◌ָ◌ֹb; a◌ַ◌ׇ◌ָ◌ֹb; a◌ַ◌ׇ◌ָ◌ֹb; ) LATIN SMALL LETTER A, HEBREW POINT QAMATS QATAN, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT PATAH, LATIN SMALL LETTER B +0061 0315 0300 05AE 0610 0062;00E0 05AE 0610 0315 0062;0061 05AE 0300 0610 0315 0062;00E0 05AE 0610 0315 0062;0061 05AE 0300 0610 0315 0062; # (a◌̕◌̀◌֮◌ؐb; à◌֮◌ؐ◌̕b; a◌֮◌̀◌ؐ◌̕b; à◌֮◌ؐ◌̕b; a◌֮◌̀◌ؐ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM, LATIN SMALL LETTER B +0061 0610 0315 0300 05AE 0062;0061 05AE 0610 0300 0315 0062;0061 05AE 0610 0300 0315 0062;0061 05AE 0610 0300 0315 0062;0061 05AE 0610 0300 0315 0062; # (a◌ؐ◌̕◌̀◌֮b; a◌֮◌ؐ◌̀◌̕b; a◌֮◌ؐ◌̀◌̕b; a◌֮◌ؐ◌̀◌̕b; a◌֮◌ؐ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0611 0062;00E0 05AE 0611 0315 0062;0061 05AE 0300 0611 0315 0062;00E0 05AE 0611 0315 0062;0061 05AE 0300 0611 0315 0062; # (a◌̕◌̀◌֮◌ؑb; à◌֮◌ؑ◌̕b; a◌֮◌̀◌ؑ◌̕b; à◌֮◌ؑ◌̕b; a◌֮◌̀◌ؑ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SIGN ALAYHE ASSALLAM, LATIN SMALL LETTER B +0061 0611 0315 0300 05AE 0062;0061 05AE 0611 0300 0315 0062;0061 05AE 0611 0300 0315 0062;0061 05AE 0611 0300 0315 0062;0061 05AE 0611 0300 0315 0062; # (a◌ؑ◌̕◌̀◌֮b; a◌֮◌ؑ◌̀◌̕b; a◌֮◌ؑ◌̀◌̕b; a◌֮◌ؑ◌̀◌̕b; a◌֮◌ؑ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SIGN ALAYHE ASSALLAM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0612 0062;00E0 05AE 0612 0315 0062;0061 05AE 0300 0612 0315 0062;00E0 05AE 0612 0315 0062;0061 05AE 0300 0612 0315 0062; # (a◌̕◌̀◌֮◌ؒb; à◌֮◌ؒ◌̕b; a◌֮◌̀◌ؒ◌̕b; à◌֮◌ؒ◌̕b; a◌֮◌̀◌ؒ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SIGN RAHMATULLAH ALAYHE, LATIN SMALL LETTER B +0061 0612 0315 0300 05AE 0062;0061 05AE 0612 0300 0315 0062;0061 05AE 0612 0300 0315 0062;0061 05AE 0612 0300 0315 0062;0061 05AE 0612 0300 0315 0062; # (a◌ؒ◌̕◌̀◌֮b; a◌֮◌ؒ◌̀◌̕b; a◌֮◌ؒ◌̀◌̕b; a◌֮◌ؒ◌̀◌̕b; a◌֮◌ؒ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SIGN RAHMATULLAH ALAYHE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0613 0062;00E0 05AE 0613 0315 0062;0061 05AE 0300 0613 0315 0062;00E0 05AE 0613 0315 0062;0061 05AE 0300 0613 0315 0062; # (a◌̕◌̀◌֮◌ؓb; à◌֮◌ؓ◌̕b; a◌֮◌̀◌ؓ◌̕b; à◌֮◌ؓ◌̕b; a◌֮◌̀◌ؓ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SIGN RADI ALLAHOU ANHU, LATIN SMALL LETTER B +0061 0613 0315 0300 05AE 0062;0061 05AE 0613 0300 0315 0062;0061 05AE 0613 0300 0315 0062;0061 05AE 0613 0300 0315 0062;0061 05AE 0613 0300 0315 0062; # (a◌ؓ◌̕◌̀◌֮b; a◌֮◌ؓ◌̀◌̕b; a◌֮◌ؓ◌̀◌̕b; a◌֮◌ؓ◌̀◌̕b; a◌֮◌ؓ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SIGN RADI ALLAHOU ANHU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0614 0062;00E0 05AE 0614 0315 0062;0061 05AE 0300 0614 0315 0062;00E0 05AE 0614 0315 0062;0061 05AE 0300 0614 0315 0062; # (a◌̕◌̀◌֮◌ؔb; à◌֮◌ؔ◌̕b; a◌֮◌̀◌ؔ◌̕b; à◌֮◌ؔ◌̕b; a◌֮◌̀◌ؔ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SIGN TAKHALLUS, LATIN SMALL LETTER B +0061 0614 0315 0300 05AE 0062;0061 05AE 0614 0300 0315 0062;0061 05AE 0614 0300 0315 0062;0061 05AE 0614 0300 0315 0062;0061 05AE 0614 0300 0315 0062; # (a◌ؔ◌̕◌̀◌֮b; a◌֮◌ؔ◌̀◌̕b; a◌֮◌ؔ◌̀◌̕b; a◌֮◌ؔ◌̀◌̕b; a◌֮◌ؔ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SIGN TAKHALLUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0615 0062;00E0 05AE 0615 0315 0062;0061 05AE 0300 0615 0315 0062;00E0 05AE 0615 0315 0062;0061 05AE 0300 0615 0315 0062; # (a◌̕◌̀◌֮◌ؕb; à◌֮◌ؕ◌̕b; a◌֮◌̀◌ؕ◌̕b; à◌֮◌ؕ◌̕b; a◌֮◌̀◌ؕ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH TAH, LATIN SMALL LETTER B +0061 0615 0315 0300 05AE 0062;0061 05AE 0615 0300 0315 0062;0061 05AE 0615 0300 0315 0062;0061 05AE 0615 0300 0315 0062;0061 05AE 0615 0300 0315 0062; # (a◌ؕ◌̕◌̀◌֮b; a◌֮◌ؕ◌̀◌̕b; a◌֮◌ؕ◌̀◌̕b; a◌֮◌ؕ◌̀◌̕b; a◌֮◌ؕ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH TAH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0616 0062;00E0 05AE 0616 0315 0062;0061 05AE 0300 0616 0315 0062;00E0 05AE 0616 0315 0062;0061 05AE 0300 0616 0315 0062; # (a◌̕◌̀◌֮◌ؖb; à◌֮◌ؖ◌̕b; a◌֮◌̀◌ؖ◌̕b; à◌֮◌ؖ◌̕b; a◌֮◌̀◌ؖ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH, LATIN SMALL LETTER B +0061 0616 0315 0300 05AE 0062;0061 05AE 0616 0300 0315 0062;0061 05AE 0616 0300 0315 0062;0061 05AE 0616 0300 0315 0062;0061 05AE 0616 0300 0315 0062; # (a◌ؖ◌̕◌̀◌֮b; a◌֮◌ؖ◌̀◌̕b; a◌֮◌ؖ◌̀◌̕b; a◌֮◌ؖ◌̀◌̕b; a◌֮◌ؖ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0617 0062;00E0 05AE 0617 0315 0062;0061 05AE 0300 0617 0315 0062;00E0 05AE 0617 0315 0062;0061 05AE 0300 0617 0315 0062; # (a◌̕◌̀◌֮◌ؗb; à◌֮◌ؗ◌̕b; a◌֮◌̀◌ؗ◌̕b; à◌֮◌ؗ◌̕b; a◌֮◌̀◌ؗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH ZAIN, LATIN SMALL LETTER B +0061 0617 0315 0300 05AE 0062;0061 05AE 0617 0300 0315 0062;0061 05AE 0617 0300 0315 0062;0061 05AE 0617 0300 0315 0062;0061 05AE 0617 0300 0315 0062; # (a◌ؗ◌̕◌̀◌֮b; a◌֮◌ؗ◌̀◌̕b; a◌֮◌ؗ◌̀◌̕b; a◌֮◌ؗ◌̀◌̕b; a◌֮◌ؗ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH ZAIN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0619 0618 064D 0618 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062; # (a◌ؙ◌ؘ◌ٍ◌ؘb; a◌ٍ◌ؘ◌ؘ◌ؙb; a◌ٍ◌ؘ◌ؘ◌ؙb; a◌ٍ◌ؘ◌ؘ◌ؙb; a◌ٍ◌ؘ◌ؘ◌ؙb; ) LATIN SMALL LETTER A, ARABIC SMALL DAMMA, ARABIC SMALL FATHA, ARABIC KASRATAN, ARABIC SMALL FATHA, LATIN SMALL LETTER B +0061 0618 0619 0618 064D 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062;0061 064D 0618 0618 0619 0062; # (a◌ؘ◌ؙ◌ؘ◌ٍb; a◌ٍ◌ؘ◌ؘ◌ؙb; a◌ٍ◌ؘ◌ؘ◌ؙb; a◌ٍ◌ؘ◌ؘ◌ؙb; a◌ٍ◌ؘ◌ؘ◌ؙb; ) LATIN SMALL LETTER A, ARABIC SMALL FATHA, ARABIC SMALL DAMMA, ARABIC SMALL FATHA, ARABIC KASRATAN, LATIN SMALL LETTER B +0061 061A 0619 0618 0619 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062; # (a◌ؚ◌ؙ◌ؘ◌ؙb; a◌ؘ◌ؙ◌ؙ◌ؚb; a◌ؘ◌ؙ◌ؙ◌ؚb; a◌ؘ◌ؙ◌ؙ◌ؚb; a◌ؘ◌ؙ◌ؙ◌ؚb; ) LATIN SMALL LETTER A, ARABIC SMALL KASRA, ARABIC SMALL DAMMA, ARABIC SMALL FATHA, ARABIC SMALL DAMMA, LATIN SMALL LETTER B +0061 0619 061A 0619 0618 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062;0061 0618 0619 0619 061A 0062; # (a◌ؙ◌ؚ◌ؙ◌ؘb; a◌ؘ◌ؙ◌ؙ◌ؚb; a◌ؘ◌ؙ◌ؙ◌ؚb; a◌ؘ◌ؙ◌ؙ◌ؚb; a◌ؘ◌ؙ◌ؙ◌ؚb; ) LATIN SMALL LETTER A, ARABIC SMALL DAMMA, ARABIC SMALL KASRA, ARABIC SMALL DAMMA, ARABIC SMALL FATHA, LATIN SMALL LETTER B +0061 0651 061A 0619 061A 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062; # (a◌ّ◌ؚ◌ؙ◌ؚb; a◌ؙ◌ؚ◌ؚ◌ّb; a◌ؙ◌ؚ◌ؚ◌ّb; a◌ؙ◌ؚ◌ؚ◌ّb; a◌ؙ◌ؚ◌ؚ◌ّb; ) LATIN SMALL LETTER A, ARABIC SHADDA, ARABIC SMALL KASRA, ARABIC SMALL DAMMA, ARABIC SMALL KASRA, LATIN SMALL LETTER B +0061 061A 0651 061A 0619 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062;0061 0619 061A 061A 0651 0062; # (a◌ؚ◌ّ◌ؚ◌ؙb; a◌ؙ◌ؚ◌ؚ◌ّb; a◌ؙ◌ؚ◌ؚ◌ّb; a◌ؙ◌ؚ◌ؚ◌ّb; a◌ؙ◌ؚ◌ؚ◌ّb; ) LATIN SMALL LETTER A, ARABIC SMALL KASRA, ARABIC SHADDA, ARABIC SMALL KASRA, ARABIC SMALL DAMMA, LATIN SMALL LETTER B +0061 064C 064B FB1E 064B 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062; # (a◌ٌ◌ً◌ﬞ◌ًb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; ) LATIN SMALL LETTER A, ARABIC DAMMATAN, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, ARABIC FATHATAN, LATIN SMALL LETTER B +0061 064B 064C 064B FB1E 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062;0061 FB1E 064B 064B 064C 0062; # (a◌ً◌ٌ◌ً◌ﬞb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; a◌ﬞ◌ً◌ً◌ٌb; ) LATIN SMALL LETTER A, ARABIC FATHATAN, ARABIC DAMMATAN, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, LATIN SMALL LETTER B +0061 064D 064C 064B 064C 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062; # (a◌ٍ◌ٌ◌ً◌ٌb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; ) LATIN SMALL LETTER A, ARABIC KASRATAN, ARABIC DAMMATAN, ARABIC FATHATAN, ARABIC DAMMATAN, LATIN SMALL LETTER B +0061 064C 064D 064C 064B 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062;0061 064B 064C 064C 064D 0062; # (a◌ٌ◌ٍ◌ٌ◌ًb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; a◌ً◌ٌ◌ٌ◌ٍb; ) LATIN SMALL LETTER A, ARABIC DAMMATAN, ARABIC KASRATAN, ARABIC DAMMATAN, ARABIC FATHATAN, LATIN SMALL LETTER B +0061 0618 064D 064C 064D 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062; # (a◌ؘ◌ٍ◌ٌ◌ٍb; a◌ٌ◌ٍ◌ٍ◌ؘb; a◌ٌ◌ٍ◌ٍ◌ؘb; a◌ٌ◌ٍ◌ٍ◌ؘb; a◌ٌ◌ٍ◌ٍ◌ؘb; ) LATIN SMALL LETTER A, ARABIC SMALL FATHA, ARABIC KASRATAN, ARABIC DAMMATAN, ARABIC KASRATAN, LATIN SMALL LETTER B +0061 064D 0618 064D 064C 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062;0061 064C 064D 064D 0618 0062; # (a◌ٍ◌ؘ◌ٍ◌ٌb; a◌ٌ◌ٍ◌ٍ◌ؘb; a◌ٌ◌ٍ◌ٍ◌ؘb; a◌ٌ◌ٍ◌ٍ◌ؘb; a◌ٌ◌ٍ◌ٍ◌ؘb; ) LATIN SMALL LETTER A, ARABIC KASRATAN, ARABIC SMALL FATHA, ARABIC KASRATAN, ARABIC DAMMATAN, LATIN SMALL LETTER B +0061 0619 0618 064D 064E 0062;0061 064D 0618 064E 0619 0062;0061 064D 0618 064E 0619 0062;0061 064D 0618 064E 0619 0062;0061 064D 0618 064E 0619 0062; # (a◌ؙ◌ؘ◌ٍ◌َb; a◌ٍ◌ؘ◌َ◌ؙb; a◌ٍ◌ؘ◌َ◌ؙb; a◌ٍ◌ؘ◌َ◌ؙb; a◌ٍ◌ؘ◌َ◌ؙb; ) LATIN SMALL LETTER A, ARABIC SMALL DAMMA, ARABIC SMALL FATHA, ARABIC KASRATAN, ARABIC FATHA, LATIN SMALL LETTER B +0061 064E 0619 0618 064D 0062;0061 064D 064E 0618 0619 0062;0061 064D 064E 0618 0619 0062;0061 064D 064E 0618 0619 0062;0061 064D 064E 0618 0619 0062; # (a◌َ◌ؙ◌ؘ◌ٍb; a◌ٍ◌َ◌ؘ◌ؙb; a◌ٍ◌َ◌ؘ◌ؙb; a◌ٍ◌َ◌ؘ◌ؙb; a◌ٍ◌َ◌ؘ◌ؙb; ) LATIN SMALL LETTER A, ARABIC FATHA, ARABIC SMALL DAMMA, ARABIC SMALL FATHA, ARABIC KASRATAN, LATIN SMALL LETTER B +0061 061A 0619 0618 064F 0062;0061 0618 0619 064F 061A 0062;0061 0618 0619 064F 061A 0062;0061 0618 0619 064F 061A 0062;0061 0618 0619 064F 061A 0062; # (a◌ؚ◌ؙ◌ؘ◌ُb; a◌ؘ◌ؙ◌ُ◌ؚb; a◌ؘ◌ؙ◌ُ◌ؚb; a◌ؘ◌ؙ◌ُ◌ؚb; a◌ؘ◌ؙ◌ُ◌ؚb; ) LATIN SMALL LETTER A, ARABIC SMALL KASRA, ARABIC SMALL DAMMA, ARABIC SMALL FATHA, ARABIC DAMMA, LATIN SMALL LETTER B +0061 064F 061A 0619 0618 0062;0061 0618 064F 0619 061A 0062;0061 0618 064F 0619 061A 0062;0061 0618 064F 0619 061A 0062;0061 0618 064F 0619 061A 0062; # (a◌ُ◌ؚ◌ؙ◌ؘb; a◌ؘ◌ُ◌ؙ◌ؚb; a◌ؘ◌ُ◌ؙ◌ؚb; a◌ؘ◌ُ◌ؙ◌ؚb; a◌ؘ◌ُ◌ؙ◌ؚb; ) LATIN SMALL LETTER A, ARABIC DAMMA, ARABIC SMALL KASRA, ARABIC SMALL DAMMA, ARABIC SMALL FATHA, LATIN SMALL LETTER B +0061 0651 061A 0619 0650 0062;0061 0619 061A 0650 0651 0062;0061 0619 061A 0650 0651 0062;0061 0619 061A 0650 0651 0062;0061 0619 061A 0650 0651 0062; # (a◌ّ◌ؚ◌ؙ◌ِb; a◌ؙ◌ؚ◌ِ◌ّb; a◌ؙ◌ؚ◌ِ◌ّb; a◌ؙ◌ؚ◌ِ◌ّb; a◌ؙ◌ؚ◌ِ◌ّb; ) LATIN SMALL LETTER A, ARABIC SHADDA, ARABIC SMALL KASRA, ARABIC SMALL DAMMA, ARABIC KASRA, LATIN SMALL LETTER B +0061 0650 0651 061A 0619 0062;0061 0619 0650 061A 0651 0062;0061 0619 0650 061A 0651 0062;0061 0619 0650 061A 0651 0062;0061 0619 0650 061A 0651 0062; # (a◌ِ◌ّ◌ؚ◌ؙb; a◌ؙ◌ِ◌ؚ◌ّb; a◌ؙ◌ِ◌ؚ◌ّb; a◌ؙ◌ِ◌ؚ◌ّb; a◌ؙ◌ِ◌ؚ◌ّb; ) LATIN SMALL LETTER A, ARABIC KASRA, ARABIC SHADDA, ARABIC SMALL KASRA, ARABIC SMALL DAMMA, LATIN SMALL LETTER B +0061 0652 0651 061A 0651 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062; # (a◌ْ◌ّ◌ؚ◌ّb; a◌ؚ◌ّ◌ّ◌ْb; a◌ؚ◌ّ◌ّ◌ْb; a◌ؚ◌ّ◌ّ◌ْb; a◌ؚ◌ّ◌ّ◌ْb; ) LATIN SMALL LETTER A, ARABIC SUKUN, ARABIC SHADDA, ARABIC SMALL KASRA, ARABIC SHADDA, LATIN SMALL LETTER B +0061 0651 0652 0651 061A 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062;0061 061A 0651 0651 0652 0062; # (a◌ّ◌ْ◌ّ◌ؚb; a◌ؚ◌ّ◌ّ◌ْb; a◌ؚ◌ّ◌ّ◌ْb; a◌ؚ◌ّ◌ّ◌ْb; a◌ؚ◌ّ◌ّ◌ْb; ) LATIN SMALL LETTER A, ARABIC SHADDA, ARABIC SUKUN, ARABIC SHADDA, ARABIC SMALL KASRA, LATIN SMALL LETTER B +0061 0670 0652 0651 0652 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062; # (a◌ٰ◌ْ◌ّ◌ْb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; ) LATIN SMALL LETTER A, ARABIC LETTER SUPERSCRIPT ALEF, ARABIC SUKUN, ARABIC SHADDA, ARABIC SUKUN, LATIN SMALL LETTER B +0061 0652 0670 0652 0651 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062;0061 0651 0652 0652 0670 0062; # (a◌ْ◌ٰ◌ْ◌ّb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; a◌ّ◌ْ◌ْ◌ٰb; ) LATIN SMALL LETTER A, ARABIC SUKUN, ARABIC LETTER SUPERSCRIPT ALEF, ARABIC SUKUN, ARABIC SHADDA, LATIN SMALL LETTER B +0061 0315 0300 05AE 0653 0062;00E0 05AE 0653 0315 0062;0061 05AE 0300 0653 0315 0062;00E0 05AE 0653 0315 0062;0061 05AE 0300 0653 0315 0062; # (a◌̕◌̀◌֮◌ٓb; à◌֮◌ٓ◌̕b; a◌֮◌̀◌ٓ◌̕b; à◌֮◌ٓ◌̕b; a◌֮◌̀◌ٓ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC MADDAH ABOVE, LATIN SMALL LETTER B +0061 0653 0315 0300 05AE 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062; # (a◌ٓ◌̕◌̀◌֮b; a◌֮◌ٓ◌̀◌̕b; a◌֮◌ٓ◌̀◌̕b; a◌֮◌ٓ◌̀◌̕b; a◌֮◌ٓ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC MADDAH ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0654 0062;00E0 05AE 0654 0315 0062;0061 05AE 0300 0654 0315 0062;00E0 05AE 0654 0315 0062;0061 05AE 0300 0654 0315 0062; # (a◌̕◌̀◌֮◌ٔb; à◌֮◌ٔ◌̕b; a◌֮◌̀◌ٔ◌̕b; à◌֮◌ٔ◌̕b; a◌֮◌̀◌ٔ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC HAMZA ABOVE, LATIN SMALL LETTER B +0061 0654 0315 0300 05AE 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062; # (a◌ٔ◌̕◌̀◌֮b; a◌֮◌ٔ◌̀◌̕b; a◌֮◌ٔ◌̀◌̕b; a◌֮◌ٔ◌̀◌̕b; a◌֮◌ٔ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC HAMZA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0655 0062;0061 1DFA 0316 0655 059A 0062;0061 1DFA 0316 0655 059A 0062;0061 1DFA 0316 0655 059A 0062;0061 1DFA 0316 0655 059A 0062; # (a◌֚◌̖◌᷺◌ٕb; a◌᷺◌̖◌ٕ◌֚b; a◌᷺◌̖◌ٕ◌֚b; a◌᷺◌̖◌ٕ◌֚b; a◌᷺◌̖◌ٕ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC HAMZA BELOW, LATIN SMALL LETTER B +0061 0655 059A 0316 1DFA 0062;0061 1DFA 0655 0316 059A 0062;0061 1DFA 0655 0316 059A 0062;0061 1DFA 0655 0316 059A 0062;0061 1DFA 0655 0316 059A 0062; # (a◌ٕ◌֚◌̖◌᷺b; a◌᷺◌ٕ◌̖◌֚b; a◌᷺◌ٕ◌̖◌֚b; a◌᷺◌ٕ◌̖◌֚b; a◌᷺◌ٕ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC HAMZA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0656 0062;0061 1DFA 0316 0656 059A 0062;0061 1DFA 0316 0656 059A 0062;0061 1DFA 0316 0656 059A 0062;0061 1DFA 0316 0656 059A 0062; # (a◌֚◌̖◌᷺◌ٖb; a◌᷺◌̖◌ٖ◌֚b; a◌᷺◌̖◌ٖ◌֚b; a◌᷺◌̖◌ٖ◌֚b; a◌᷺◌̖◌ٖ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SUBSCRIPT ALEF, LATIN SMALL LETTER B +0061 0656 059A 0316 1DFA 0062;0061 1DFA 0656 0316 059A 0062;0061 1DFA 0656 0316 059A 0062;0061 1DFA 0656 0316 059A 0062;0061 1DFA 0656 0316 059A 0062; # (a◌ٖ◌֚◌̖◌᷺b; a◌᷺◌ٖ◌̖◌֚b; a◌᷺◌ٖ◌̖◌֚b; a◌᷺◌ٖ◌̖◌֚b; a◌᷺◌ٖ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SUBSCRIPT ALEF, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0657 0062;00E0 05AE 0657 0315 0062;0061 05AE 0300 0657 0315 0062;00E0 05AE 0657 0315 0062;0061 05AE 0300 0657 0315 0062; # (a◌̕◌̀◌֮◌ٗb; à◌֮◌ٗ◌̕b; a◌֮◌̀◌ٗ◌̕b; à◌֮◌ٗ◌̕b; a◌֮◌̀◌ٗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC INVERTED DAMMA, LATIN SMALL LETTER B +0061 0657 0315 0300 05AE 0062;0061 05AE 0657 0300 0315 0062;0061 05AE 0657 0300 0315 0062;0061 05AE 0657 0300 0315 0062;0061 05AE 0657 0300 0315 0062; # (a◌ٗ◌̕◌̀◌֮b; a◌֮◌ٗ◌̀◌̕b; a◌֮◌ٗ◌̀◌̕b; a◌֮◌ٗ◌̀◌̕b; a◌֮◌ٗ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC INVERTED DAMMA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0658 0062;00E0 05AE 0658 0315 0062;0061 05AE 0300 0658 0315 0062;00E0 05AE 0658 0315 0062;0061 05AE 0300 0658 0315 0062; # (a◌̕◌̀◌֮◌٘b; à◌֮◌٘◌̕b; a◌֮◌̀◌٘◌̕b; à◌֮◌٘◌̕b; a◌֮◌̀◌٘◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC MARK NOON GHUNNA, LATIN SMALL LETTER B +0061 0658 0315 0300 05AE 0062;0061 05AE 0658 0300 0315 0062;0061 05AE 0658 0300 0315 0062;0061 05AE 0658 0300 0315 0062;0061 05AE 0658 0300 0315 0062; # (a◌٘◌̕◌̀◌֮b; a◌֮◌٘◌̀◌̕b; a◌֮◌٘◌̀◌̕b; a◌֮◌٘◌̀◌̕b; a◌֮◌٘◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC MARK NOON GHUNNA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0659 0062;00E0 05AE 0659 0315 0062;0061 05AE 0300 0659 0315 0062;00E0 05AE 0659 0315 0062;0061 05AE 0300 0659 0315 0062; # (a◌̕◌̀◌֮◌ٙb; à◌֮◌ٙ◌̕b; a◌֮◌̀◌ٙ◌̕b; à◌֮◌ٙ◌̕b; a◌֮◌̀◌ٙ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC ZWARAKAY, LATIN SMALL LETTER B +0061 0659 0315 0300 05AE 0062;0061 05AE 0659 0300 0315 0062;0061 05AE 0659 0300 0315 0062;0061 05AE 0659 0300 0315 0062;0061 05AE 0659 0300 0315 0062; # (a◌ٙ◌̕◌̀◌֮b; a◌֮◌ٙ◌̀◌̕b; a◌֮◌ٙ◌̀◌̕b; a◌֮◌ٙ◌̀◌̕b; a◌֮◌ٙ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC ZWARAKAY, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 065A 0062;00E0 05AE 065A 0315 0062;0061 05AE 0300 065A 0315 0062;00E0 05AE 065A 0315 0062;0061 05AE 0300 065A 0315 0062; # (a◌̕◌̀◌֮◌ٚb; à◌֮◌ٚ◌̕b; a◌֮◌̀◌ٚ◌̕b; à◌֮◌ٚ◌̕b; a◌֮◌̀◌ٚ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC VOWEL SIGN SMALL V ABOVE, LATIN SMALL LETTER B +0061 065A 0315 0300 05AE 0062;0061 05AE 065A 0300 0315 0062;0061 05AE 065A 0300 0315 0062;0061 05AE 065A 0300 0315 0062;0061 05AE 065A 0300 0315 0062; # (a◌ٚ◌̕◌̀◌֮b; a◌֮◌ٚ◌̀◌̕b; a◌֮◌ٚ◌̀◌̕b; a◌֮◌ٚ◌̀◌̕b; a◌֮◌ٚ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC VOWEL SIGN SMALL V ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 065B 0062;00E0 05AE 065B 0315 0062;0061 05AE 0300 065B 0315 0062;00E0 05AE 065B 0315 0062;0061 05AE 0300 065B 0315 0062; # (a◌̕◌̀◌֮◌ٛb; à◌֮◌ٛ◌̕b; a◌֮◌̀◌ٛ◌̕b; à◌֮◌ٛ◌̕b; a◌֮◌̀◌ٛ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC VOWEL SIGN INVERTED SMALL V ABOVE, LATIN SMALL LETTER B +0061 065B 0315 0300 05AE 0062;0061 05AE 065B 0300 0315 0062;0061 05AE 065B 0300 0315 0062;0061 05AE 065B 0300 0315 0062;0061 05AE 065B 0300 0315 0062; # (a◌ٛ◌̕◌̀◌֮b; a◌֮◌ٛ◌̀◌̕b; a◌֮◌ٛ◌̀◌̕b; a◌֮◌ٛ◌̀◌̕b; a◌֮◌ٛ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC VOWEL SIGN INVERTED SMALL V ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 065C 0062;0061 1DFA 0316 065C 059A 0062;0061 1DFA 0316 065C 059A 0062;0061 1DFA 0316 065C 059A 0062;0061 1DFA 0316 065C 059A 0062; # (a◌֚◌̖◌᷺◌ٜb; a◌᷺◌̖◌ٜ◌֚b; a◌᷺◌̖◌ٜ◌֚b; a◌᷺◌̖◌ٜ◌֚b; a◌᷺◌̖◌ٜ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC VOWEL SIGN DOT BELOW, LATIN SMALL LETTER B +0061 065C 059A 0316 1DFA 0062;0061 1DFA 065C 0316 059A 0062;0061 1DFA 065C 0316 059A 0062;0061 1DFA 065C 0316 059A 0062;0061 1DFA 065C 0316 059A 0062; # (a◌ٜ◌֚◌̖◌᷺b; a◌᷺◌ٜ◌̖◌֚b; a◌᷺◌ٜ◌̖◌֚b; a◌᷺◌ٜ◌̖◌֚b; a◌᷺◌ٜ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC VOWEL SIGN DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 065D 0062;00E0 05AE 065D 0315 0062;0061 05AE 0300 065D 0315 0062;00E0 05AE 065D 0315 0062;0061 05AE 0300 065D 0315 0062; # (a◌̕◌̀◌֮◌ٝb; à◌֮◌ٝ◌̕b; a◌֮◌̀◌ٝ◌̕b; à◌֮◌ٝ◌̕b; a◌֮◌̀◌ٝ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC REVERSED DAMMA, LATIN SMALL LETTER B +0061 065D 0315 0300 05AE 0062;0061 05AE 065D 0300 0315 0062;0061 05AE 065D 0300 0315 0062;0061 05AE 065D 0300 0315 0062;0061 05AE 065D 0300 0315 0062; # (a◌ٝ◌̕◌̀◌֮b; a◌֮◌ٝ◌̀◌̕b; a◌֮◌ٝ◌̀◌̕b; a◌֮◌ٝ◌̀◌̕b; a◌֮◌ٝ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC REVERSED DAMMA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 065E 0062;00E0 05AE 065E 0315 0062;0061 05AE 0300 065E 0315 0062;00E0 05AE 065E 0315 0062;0061 05AE 0300 065E 0315 0062; # (a◌̕◌̀◌֮◌ٞb; à◌֮◌ٞ◌̕b; a◌֮◌̀◌ٞ◌̕b; à◌֮◌ٞ◌̕b; a◌֮◌̀◌ٞ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC FATHA WITH TWO DOTS, LATIN SMALL LETTER B +0061 065E 0315 0300 05AE 0062;0061 05AE 065E 0300 0315 0062;0061 05AE 065E 0300 0315 0062;0061 05AE 065E 0300 0315 0062;0061 05AE 065E 0300 0315 0062; # (a◌ٞ◌̕◌̀◌֮b; a◌֮◌ٞ◌̀◌̕b; a◌֮◌ٞ◌̀◌̕b; a◌֮◌ٞ◌̀◌̕b; a◌֮◌ٞ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC FATHA WITH TWO DOTS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 065F 0062;0061 1DFA 0316 065F 059A 0062;0061 1DFA 0316 065F 059A 0062;0061 1DFA 0316 065F 059A 0062;0061 1DFA 0316 065F 059A 0062; # (a◌֚◌̖◌᷺◌ٟb; a◌᷺◌̖◌ٟ◌֚b; a◌᷺◌̖◌ٟ◌֚b; a◌᷺◌̖◌ٟ◌֚b; a◌᷺◌̖◌ٟ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC WAVY HAMZA BELOW, LATIN SMALL LETTER B +0061 065F 059A 0316 1DFA 0062;0061 1DFA 065F 0316 059A 0062;0061 1DFA 065F 0316 059A 0062;0061 1DFA 065F 0316 059A 0062;0061 1DFA 065F 0316 059A 0062; # (a◌ٟ◌֚◌̖◌᷺b; a◌᷺◌ٟ◌̖◌֚b; a◌᷺◌ٟ◌̖◌֚b; a◌᷺◌ٟ◌̖◌֚b; a◌᷺◌ٟ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC WAVY HAMZA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0711 0670 0652 0670 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062; # (a◌ܑ◌ٰ◌ْ◌ٰb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; ) LATIN SMALL LETTER A, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, ARABIC SUKUN, ARABIC LETTER SUPERSCRIPT ALEF, LATIN SMALL LETTER B +0061 0670 0711 0670 0652 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062; # (a◌ٰ◌ܑ◌ٰ◌ْb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; ) LATIN SMALL LETTER A, ARABIC LETTER SUPERSCRIPT ALEF, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, ARABIC SUKUN, LATIN SMALL LETTER B +0061 0315 0300 05AE 06D6 0062;00E0 05AE 06D6 0315 0062;0061 05AE 0300 06D6 0315 0062;00E0 05AE 06D6 0315 0062;0061 05AE 0300 06D6 0315 0062; # (a◌̕◌̀◌֮◌ۖb; à◌֮◌ۖ◌̕b; a◌֮◌̀◌ۖ◌̕b; à◌֮◌ۖ◌̕b; a◌֮◌̀◌ۖ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA, LATIN SMALL LETTER B +0061 06D6 0315 0300 05AE 0062;0061 05AE 06D6 0300 0315 0062;0061 05AE 06D6 0300 0315 0062;0061 05AE 06D6 0300 0315 0062;0061 05AE 06D6 0300 0315 0062; # (a◌ۖ◌̕◌̀◌֮b; a◌֮◌ۖ◌̀◌̕b; a◌֮◌ۖ◌̀◌̕b; a◌֮◌ۖ◌̀◌̕b; a◌֮◌ۖ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06D7 0062;00E0 05AE 06D7 0315 0062;0061 05AE 0300 06D7 0315 0062;00E0 05AE 06D7 0315 0062;0061 05AE 0300 06D7 0315 0062; # (a◌̕◌̀◌֮◌ۗb; à◌֮◌ۗ◌̕b; a◌֮◌̀◌ۗ◌̕b; à◌֮◌ۗ◌̕b; a◌֮◌̀◌ۗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA, LATIN SMALL LETTER B +0061 06D7 0315 0300 05AE 0062;0061 05AE 06D7 0300 0315 0062;0061 05AE 06D7 0300 0315 0062;0061 05AE 06D7 0300 0315 0062;0061 05AE 06D7 0300 0315 0062; # (a◌ۗ◌̕◌̀◌֮b; a◌֮◌ۗ◌̀◌̕b; a◌֮◌ۗ◌̀◌̕b; a◌֮◌ۗ◌̀◌̕b; a◌֮◌ۗ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06D8 0062;00E0 05AE 06D8 0315 0062;0061 05AE 0300 06D8 0315 0062;00E0 05AE 06D8 0315 0062;0061 05AE 0300 06D8 0315 0062; # (a◌̕◌̀◌֮◌ۘb; à◌֮◌ۘ◌̕b; a◌֮◌̀◌ۘ◌̕b; à◌֮◌ۘ◌̕b; a◌֮◌̀◌ۘ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH MEEM INITIAL FORM, LATIN SMALL LETTER B +0061 06D8 0315 0300 05AE 0062;0061 05AE 06D8 0300 0315 0062;0061 05AE 06D8 0300 0315 0062;0061 05AE 06D8 0300 0315 0062;0061 05AE 06D8 0300 0315 0062; # (a◌ۘ◌̕◌̀◌֮b; a◌֮◌ۘ◌̀◌̕b; a◌֮◌ۘ◌̀◌̕b; a◌֮◌ۘ◌̀◌̕b; a◌֮◌ۘ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH MEEM INITIAL FORM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06D9 0062;00E0 05AE 06D9 0315 0062;0061 05AE 0300 06D9 0315 0062;00E0 05AE 06D9 0315 0062;0061 05AE 0300 06D9 0315 0062; # (a◌̕◌̀◌֮◌ۙb; à◌֮◌ۙ◌̕b; a◌֮◌̀◌ۙ◌̕b; à◌֮◌ۙ◌̕b; a◌֮◌̀◌ۙ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH LAM ALEF, LATIN SMALL LETTER B +0061 06D9 0315 0300 05AE 0062;0061 05AE 06D9 0300 0315 0062;0061 05AE 06D9 0300 0315 0062;0061 05AE 06D9 0300 0315 0062;0061 05AE 06D9 0300 0315 0062; # (a◌ۙ◌̕◌̀◌֮b; a◌֮◌ۙ◌̀◌̕b; a◌֮◌ۙ◌̀◌̕b; a◌֮◌ۙ◌̀◌̕b; a◌֮◌ۙ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH LAM ALEF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06DA 0062;00E0 05AE 06DA 0315 0062;0061 05AE 0300 06DA 0315 0062;00E0 05AE 06DA 0315 0062;0061 05AE 0300 06DA 0315 0062; # (a◌̕◌̀◌֮◌ۚb; à◌֮◌ۚ◌̕b; a◌֮◌̀◌ۚ◌̕b; à◌֮◌ۚ◌̕b; a◌֮◌̀◌ۚ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH JEEM, LATIN SMALL LETTER B +0061 06DA 0315 0300 05AE 0062;0061 05AE 06DA 0300 0315 0062;0061 05AE 06DA 0300 0315 0062;0061 05AE 06DA 0300 0315 0062;0061 05AE 06DA 0300 0315 0062; # (a◌ۚ◌̕◌̀◌֮b; a◌֮◌ۚ◌̀◌̕b; a◌֮◌ۚ◌̀◌̕b; a◌֮◌ۚ◌̀◌̕b; a◌֮◌ۚ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH JEEM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06DB 0062;00E0 05AE 06DB 0315 0062;0061 05AE 0300 06DB 0315 0062;00E0 05AE 06DB 0315 0062;0061 05AE 0300 06DB 0315 0062; # (a◌̕◌̀◌֮◌ۛb; à◌֮◌ۛ◌̕b; a◌֮◌̀◌ۛ◌̕b; à◌֮◌ۛ◌̕b; a◌֮◌̀◌ۛ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH THREE DOTS, LATIN SMALL LETTER B +0061 06DB 0315 0300 05AE 0062;0061 05AE 06DB 0300 0315 0062;0061 05AE 06DB 0300 0315 0062;0061 05AE 06DB 0300 0315 0062;0061 05AE 06DB 0300 0315 0062; # (a◌ۛ◌̕◌̀◌֮b; a◌֮◌ۛ◌̀◌̕b; a◌֮◌ۛ◌̀◌̕b; a◌֮◌ۛ◌̀◌̕b; a◌֮◌ۛ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH THREE DOTS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06DC 0062;00E0 05AE 06DC 0315 0062;0061 05AE 0300 06DC 0315 0062;00E0 05AE 06DC 0315 0062;0061 05AE 0300 06DC 0315 0062; # (a◌̕◌̀◌֮◌ۜb; à◌֮◌ۜ◌̕b; a◌֮◌̀◌ۜ◌̕b; à◌֮◌ۜ◌̕b; a◌֮◌̀◌ۜ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH SEEN, LATIN SMALL LETTER B +0061 06DC 0315 0300 05AE 0062;0061 05AE 06DC 0300 0315 0062;0061 05AE 06DC 0300 0315 0062;0061 05AE 06DC 0300 0315 0062;0061 05AE 06DC 0300 0315 0062; # (a◌ۜ◌̕◌̀◌֮b; a◌֮◌ۜ◌̀◌̕b; a◌֮◌ۜ◌̀◌̕b; a◌֮◌ۜ◌̀◌̕b; a◌֮◌ۜ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH SEEN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06DF 0062;00E0 05AE 06DF 0315 0062;0061 05AE 0300 06DF 0315 0062;00E0 05AE 06DF 0315 0062;0061 05AE 0300 06DF 0315 0062; # (a◌̕◌̀◌֮◌۟b; à◌֮◌۟◌̕b; a◌֮◌̀◌۟◌̕b; à◌֮◌۟◌̕b; a◌֮◌̀◌۟◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH ROUNDED ZERO, LATIN SMALL LETTER B +0061 06DF 0315 0300 05AE 0062;0061 05AE 06DF 0300 0315 0062;0061 05AE 06DF 0300 0315 0062;0061 05AE 06DF 0300 0315 0062;0061 05AE 06DF 0300 0315 0062; # (a◌۟◌̕◌̀◌֮b; a◌֮◌۟◌̀◌̕b; a◌֮◌۟◌̀◌̕b; a◌֮◌۟◌̀◌̕b; a◌֮◌۟◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH ROUNDED ZERO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E0 0062;00E0 05AE 06E0 0315 0062;0061 05AE 0300 06E0 0315 0062;00E0 05AE 06E0 0315 0062;0061 05AE 0300 06E0 0315 0062; # (a◌̕◌̀◌֮◌۠b; à◌֮◌۠◌̕b; a◌֮◌̀◌۠◌̕b; à◌֮◌۠◌̕b; a◌֮◌̀◌۠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO, LATIN SMALL LETTER B +0061 06E0 0315 0300 05AE 0062;0061 05AE 06E0 0300 0315 0062;0061 05AE 06E0 0300 0315 0062;0061 05AE 06E0 0300 0315 0062;0061 05AE 06E0 0300 0315 0062; # (a◌۠◌̕◌̀◌֮b; a◌֮◌۠◌̀◌̕b; a◌֮◌۠◌̀◌̕b; a◌֮◌۠◌̀◌̕b; a◌֮◌۠◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E1 0062;00E0 05AE 06E1 0315 0062;0061 05AE 0300 06E1 0315 0062;00E0 05AE 06E1 0315 0062;0061 05AE 0300 06E1 0315 0062; # (a◌̕◌̀◌֮◌ۡb; à◌֮◌ۡ◌̕b; a◌֮◌̀◌ۡ◌̕b; à◌֮◌ۡ◌̕b; a◌֮◌̀◌ۡ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH DOTLESS HEAD OF KHAH, LATIN SMALL LETTER B +0061 06E1 0315 0300 05AE 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062; # (a◌ۡ◌̕◌̀◌֮b; a◌֮◌ۡ◌̀◌̕b; a◌֮◌ۡ◌̀◌̕b; a◌֮◌ۡ◌̀◌̕b; a◌֮◌ۡ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH DOTLESS HEAD OF KHAH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E2 0062;00E0 05AE 06E2 0315 0062;0061 05AE 0300 06E2 0315 0062;00E0 05AE 06E2 0315 0062;0061 05AE 0300 06E2 0315 0062; # (a◌̕◌̀◌֮◌ۢb; à◌֮◌ۢ◌̕b; a◌֮◌̀◌ۢ◌̕b; à◌֮◌ۢ◌̕b; a◌֮◌̀◌ۢ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH MEEM ISOLATED FORM, LATIN SMALL LETTER B +0061 06E2 0315 0300 05AE 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062; # (a◌ۢ◌̕◌̀◌֮b; a◌֮◌ۢ◌̀◌̕b; a◌֮◌ۢ◌̀◌̕b; a◌֮◌ۢ◌̀◌̕b; a◌֮◌ۢ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH MEEM ISOLATED FORM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 06E3 0062;0061 1DFA 0316 06E3 059A 0062;0061 1DFA 0316 06E3 059A 0062;0061 1DFA 0316 06E3 059A 0062;0061 1DFA 0316 06E3 059A 0062; # (a◌֚◌̖◌᷺◌ۣb; a◌᷺◌̖◌ۣ◌֚b; a◌᷺◌̖◌ۣ◌֚b; a◌᷺◌̖◌ۣ◌֚b; a◌᷺◌̖◌ۣ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW SEEN, LATIN SMALL LETTER B +0061 06E3 059A 0316 1DFA 0062;0061 1DFA 06E3 0316 059A 0062;0061 1DFA 06E3 0316 059A 0062;0061 1DFA 06E3 0316 059A 0062;0061 1DFA 06E3 0316 059A 0062; # (a◌ۣ◌֚◌̖◌᷺b; a◌᷺◌ۣ◌̖◌֚b; a◌᷺◌ۣ◌̖◌֚b; a◌᷺◌ۣ◌̖◌֚b; a◌᷺◌ۣ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW SEEN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E4 0062;00E0 05AE 06E4 0315 0062;0061 05AE 0300 06E4 0315 0062;00E0 05AE 06E4 0315 0062;0061 05AE 0300 06E4 0315 0062; # (a◌̕◌̀◌֮◌ۤb; à◌֮◌ۤ◌̕b; a◌֮◌̀◌ۤ◌̕b; à◌֮◌ۤ◌̕b; a◌֮◌̀◌ۤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH MADDA, LATIN SMALL LETTER B +0061 06E4 0315 0300 05AE 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062; # (a◌ۤ◌̕◌̀◌֮b; a◌֮◌ۤ◌̀◌̕b; a◌֮◌ۤ◌̀◌̕b; a◌֮◌ۤ◌̀◌̕b; a◌֮◌ۤ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH MADDA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E7 0062;00E0 05AE 06E7 0315 0062;0061 05AE 0300 06E7 0315 0062;00E0 05AE 06E7 0315 0062;0061 05AE 0300 06E7 0315 0062; # (a◌̕◌̀◌֮◌ۧb; à◌֮◌ۧ◌̕b; a◌֮◌̀◌ۧ◌̕b; à◌֮◌ۧ◌̕b; a◌֮◌̀◌ۧ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH YEH, LATIN SMALL LETTER B +0061 06E7 0315 0300 05AE 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062; # (a◌ۧ◌̕◌̀◌֮b; a◌֮◌ۧ◌̀◌̕b; a◌֮◌ۧ◌̀◌̕b; a◌֮◌ۧ◌̀◌̕b; a◌֮◌ۧ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH YEH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06E8 0062;00E0 05AE 06E8 0315 0062;0061 05AE 0300 06E8 0315 0062;00E0 05AE 06E8 0315 0062;0061 05AE 0300 06E8 0315 0062; # (a◌̕◌̀◌֮◌ۨb; à◌֮◌ۨ◌̕b; a◌֮◌̀◌ۨ◌̕b; à◌֮◌ۨ◌̕b; a◌֮◌̀◌ۨ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH NOON, LATIN SMALL LETTER B +0061 06E8 0315 0300 05AE 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062; # (a◌ۨ◌̕◌̀◌֮b; a◌֮◌ۨ◌̀◌̕b; a◌֮◌ۨ◌̀◌̕b; a◌֮◌ۨ◌̀◌̕b; a◌֮◌ۨ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH NOON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 06EA 0062;0061 1DFA 0316 06EA 059A 0062;0061 1DFA 0316 06EA 059A 0062;0061 1DFA 0316 06EA 059A 0062;0061 1DFA 0316 06EA 059A 0062; # (a◌֚◌̖◌᷺◌۪b; a◌᷺◌̖◌۪◌֚b; a◌᷺◌̖◌۪◌֚b; a◌᷺◌̖◌۪◌֚b; a◌᷺◌̖◌۪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC EMPTY CENTRE LOW STOP, LATIN SMALL LETTER B +0061 06EA 059A 0316 1DFA 0062;0061 1DFA 06EA 0316 059A 0062;0061 1DFA 06EA 0316 059A 0062;0061 1DFA 06EA 0316 059A 0062;0061 1DFA 06EA 0316 059A 0062; # (a◌۪◌֚◌̖◌᷺b; a◌᷺◌۪◌̖◌֚b; a◌᷺◌۪◌̖◌֚b; a◌᷺◌۪◌̖◌֚b; a◌᷺◌۪◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC EMPTY CENTRE LOW STOP, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 06EB 0062;00E0 05AE 06EB 0315 0062;0061 05AE 0300 06EB 0315 0062;00E0 05AE 06EB 0315 0062;0061 05AE 0300 06EB 0315 0062; # (a◌̕◌̀◌֮◌۫b; à◌֮◌۫◌̕b; a◌֮◌̀◌۫◌̕b; à◌֮◌۫◌̕b; a◌֮◌̀◌۫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC EMPTY CENTRE HIGH STOP, LATIN SMALL LETTER B +0061 06EB 0315 0300 05AE 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062; # (a◌۫◌̕◌̀◌֮b; a◌֮◌۫◌̀◌̕b; a◌֮◌۫◌̀◌̕b; a◌֮◌۫◌̀◌̕b; a◌֮◌۫◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC EMPTY CENTRE HIGH STOP, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 06EC 0062;00E0 05AE 06EC 0315 0062;0061 05AE 0300 06EC 0315 0062;00E0 05AE 06EC 0315 0062;0061 05AE 0300 06EC 0315 0062; # (a◌̕◌̀◌֮◌۬b; à◌֮◌۬◌̕b; a◌֮◌̀◌۬◌̕b; à◌֮◌۬◌̕b; a◌֮◌̀◌۬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE, LATIN SMALL LETTER B +0061 06EC 0315 0300 05AE 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062; # (a◌۬◌̕◌̀◌֮b; a◌֮◌۬◌̀◌̕b; a◌֮◌۬◌̀◌̕b; a◌֮◌۬◌̀◌̕b; a◌֮◌۬◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 06ED 0062;0061 1DFA 0316 06ED 059A 0062;0061 1DFA 0316 06ED 059A 0062;0061 1DFA 0316 06ED 059A 0062;0061 1DFA 0316 06ED 059A 0062; # (a◌֚◌̖◌᷺◌ۭb; a◌᷺◌̖◌ۭ◌֚b; a◌᷺◌̖◌ۭ◌֚b; a◌᷺◌̖◌ۭ◌֚b; a◌᷺◌̖◌ۭ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW MEEM, LATIN SMALL LETTER B +0061 06ED 059A 0316 1DFA 0062;0061 1DFA 06ED 0316 059A 0062;0061 1DFA 06ED 0316 059A 0062;0061 1DFA 06ED 0316 059A 0062;0061 1DFA 06ED 0316 059A 0062; # (a◌ۭ◌֚◌̖◌᷺b; a◌᷺◌ۭ◌̖◌֚b; a◌᷺◌ۭ◌̖◌֚b; a◌᷺◌ۭ◌̖◌֚b; a◌᷺◌ۭ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW MEEM, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0C55 0711 0670 0711 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062; # (a◌ౕ◌ܑ◌ٰ◌ܑb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; ) LATIN SMALL LETTER A, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, SYRIAC LETTER SUPERSCRIPT ALAPH, LATIN SMALL LETTER B +0061 0711 0C55 0711 0670 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062; # (a◌ܑ◌ౕ◌ܑ◌ٰb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; ) LATIN SMALL LETTER A, SYRIAC LETTER SUPERSCRIPT ALAPH, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, LATIN SMALL LETTER B +0061 0315 0300 05AE 0730 0062;00E0 05AE 0730 0315 0062;0061 05AE 0300 0730 0315 0062;00E0 05AE 0730 0315 0062;0061 05AE 0300 0730 0315 0062; # (a◌̕◌̀◌֮◌ܰb; à◌֮◌ܰ◌̕b; a◌֮◌̀◌ܰ◌̕b; à◌֮◌ܰ◌̕b; a◌֮◌̀◌ܰ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC PTHAHA ABOVE, LATIN SMALL LETTER B +0061 0730 0315 0300 05AE 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062; # (a◌ܰ◌̕◌̀◌֮b; a◌֮◌ܰ◌̀◌̕b; a◌֮◌ܰ◌̀◌̕b; a◌֮◌ܰ◌̀◌̕b; a◌֮◌ܰ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC PTHAHA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0731 0062;0061 1DFA 0316 0731 059A 0062;0061 1DFA 0316 0731 059A 0062;0061 1DFA 0316 0731 059A 0062;0061 1DFA 0316 0731 059A 0062; # (a◌֚◌̖◌᷺◌ܱb; a◌᷺◌̖◌ܱ◌֚b; a◌᷺◌̖◌ܱ◌֚b; a◌᷺◌̖◌ܱ◌֚b; a◌᷺◌̖◌ܱ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC PTHAHA BELOW, LATIN SMALL LETTER B +0061 0731 059A 0316 1DFA 0062;0061 1DFA 0731 0316 059A 0062;0061 1DFA 0731 0316 059A 0062;0061 1DFA 0731 0316 059A 0062;0061 1DFA 0731 0316 059A 0062; # (a◌ܱ◌֚◌̖◌᷺b; a◌᷺◌ܱ◌̖◌֚b; a◌᷺◌ܱ◌̖◌֚b; a◌᷺◌ܱ◌̖◌֚b; a◌᷺◌ܱ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC PTHAHA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0732 0062;00E0 05AE 0732 0315 0062;0061 05AE 0300 0732 0315 0062;00E0 05AE 0732 0315 0062;0061 05AE 0300 0732 0315 0062; # (a◌̕◌̀◌֮◌ܲb; à◌֮◌ܲ◌̕b; a◌֮◌̀◌ܲ◌̕b; à◌֮◌ܲ◌̕b; a◌֮◌̀◌ܲ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC PTHAHA DOTTED, LATIN SMALL LETTER B +0061 0732 0315 0300 05AE 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062; # (a◌ܲ◌̕◌̀◌֮b; a◌֮◌ܲ◌̀◌̕b; a◌֮◌ܲ◌̀◌̕b; a◌֮◌ܲ◌̀◌̕b; a◌֮◌ܲ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC PTHAHA DOTTED, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0733 0062;00E0 05AE 0733 0315 0062;0061 05AE 0300 0733 0315 0062;00E0 05AE 0733 0315 0062;0061 05AE 0300 0733 0315 0062; # (a◌̕◌̀◌֮◌ܳb; à◌֮◌ܳ◌̕b; a◌֮◌̀◌ܳ◌̕b; à◌֮◌ܳ◌̕b; a◌֮◌̀◌ܳ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC ZQAPHA ABOVE, LATIN SMALL LETTER B +0061 0733 0315 0300 05AE 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062; # (a◌ܳ◌̕◌̀◌֮b; a◌֮◌ܳ◌̀◌̕b; a◌֮◌ܳ◌̀◌̕b; a◌֮◌ܳ◌̀◌̕b; a◌֮◌ܳ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC ZQAPHA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0734 0062;0061 1DFA 0316 0734 059A 0062;0061 1DFA 0316 0734 059A 0062;0061 1DFA 0316 0734 059A 0062;0061 1DFA 0316 0734 059A 0062; # (a◌֚◌̖◌᷺◌ܴb; a◌᷺◌̖◌ܴ◌֚b; a◌᷺◌̖◌ܴ◌֚b; a◌᷺◌̖◌ܴ◌֚b; a◌᷺◌̖◌ܴ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC ZQAPHA BELOW, LATIN SMALL LETTER B +0061 0734 059A 0316 1DFA 0062;0061 1DFA 0734 0316 059A 0062;0061 1DFA 0734 0316 059A 0062;0061 1DFA 0734 0316 059A 0062;0061 1DFA 0734 0316 059A 0062; # (a◌ܴ◌֚◌̖◌᷺b; a◌᷺◌ܴ◌̖◌֚b; a◌᷺◌ܴ◌̖◌֚b; a◌᷺◌ܴ◌̖◌֚b; a◌᷺◌ܴ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC ZQAPHA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0735 0062;00E0 05AE 0735 0315 0062;0061 05AE 0300 0735 0315 0062;00E0 05AE 0735 0315 0062;0061 05AE 0300 0735 0315 0062; # (a◌̕◌̀◌֮◌ܵb; à◌֮◌ܵ◌̕b; a◌֮◌̀◌ܵ◌̕b; à◌֮◌ܵ◌̕b; a◌֮◌̀◌ܵ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC ZQAPHA DOTTED, LATIN SMALL LETTER B +0061 0735 0315 0300 05AE 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062; # (a◌ܵ◌̕◌̀◌֮b; a◌֮◌ܵ◌̀◌̕b; a◌֮◌ܵ◌̀◌̕b; a◌֮◌ܵ◌̀◌̕b; a◌֮◌ܵ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC ZQAPHA DOTTED, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0736 0062;00E0 05AE 0736 0315 0062;0061 05AE 0300 0736 0315 0062;00E0 05AE 0736 0315 0062;0061 05AE 0300 0736 0315 0062; # (a◌̕◌̀◌֮◌ܶb; à◌֮◌ܶ◌̕b; a◌֮◌̀◌ܶ◌̕b; à◌֮◌ܶ◌̕b; a◌֮◌̀◌ܶ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC RBASA ABOVE, LATIN SMALL LETTER B +0061 0736 0315 0300 05AE 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062; # (a◌ܶ◌̕◌̀◌֮b; a◌֮◌ܶ◌̀◌̕b; a◌֮◌ܶ◌̀◌̕b; a◌֮◌ܶ◌̀◌̕b; a◌֮◌ܶ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC RBASA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0737 0062;0061 1DFA 0316 0737 059A 0062;0061 1DFA 0316 0737 059A 0062;0061 1DFA 0316 0737 059A 0062;0061 1DFA 0316 0737 059A 0062; # (a◌֚◌̖◌᷺◌ܷb; a◌᷺◌̖◌ܷ◌֚b; a◌᷺◌̖◌ܷ◌֚b; a◌᷺◌̖◌ܷ◌֚b; a◌᷺◌̖◌ܷ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC RBASA BELOW, LATIN SMALL LETTER B +0061 0737 059A 0316 1DFA 0062;0061 1DFA 0737 0316 059A 0062;0061 1DFA 0737 0316 059A 0062;0061 1DFA 0737 0316 059A 0062;0061 1DFA 0737 0316 059A 0062; # (a◌ܷ◌֚◌̖◌᷺b; a◌᷺◌ܷ◌̖◌֚b; a◌᷺◌ܷ◌̖◌֚b; a◌᷺◌ܷ◌̖◌֚b; a◌᷺◌ܷ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC RBASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0738 0062;0061 1DFA 0316 0738 059A 0062;0061 1DFA 0316 0738 059A 0062;0061 1DFA 0316 0738 059A 0062;0061 1DFA 0316 0738 059A 0062; # (a◌֚◌̖◌᷺◌ܸb; a◌᷺◌̖◌ܸ◌֚b; a◌᷺◌̖◌ܸ◌֚b; a◌᷺◌̖◌ܸ◌֚b; a◌᷺◌̖◌ܸ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC DOTTED ZLAMA HORIZONTAL, LATIN SMALL LETTER B +0061 0738 059A 0316 1DFA 0062;0061 1DFA 0738 0316 059A 0062;0061 1DFA 0738 0316 059A 0062;0061 1DFA 0738 0316 059A 0062;0061 1DFA 0738 0316 059A 0062; # (a◌ܸ◌֚◌̖◌᷺b; a◌᷺◌ܸ◌̖◌֚b; a◌᷺◌ܸ◌̖◌֚b; a◌᷺◌ܸ◌̖◌֚b; a◌᷺◌ܸ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC DOTTED ZLAMA HORIZONTAL, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0739 0062;0061 1DFA 0316 0739 059A 0062;0061 1DFA 0316 0739 059A 0062;0061 1DFA 0316 0739 059A 0062;0061 1DFA 0316 0739 059A 0062; # (a◌֚◌̖◌᷺◌ܹb; a◌᷺◌̖◌ܹ◌֚b; a◌᷺◌̖◌ܹ◌֚b; a◌᷺◌̖◌ܹ◌֚b; a◌᷺◌̖◌ܹ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC DOTTED ZLAMA ANGULAR, LATIN SMALL LETTER B +0061 0739 059A 0316 1DFA 0062;0061 1DFA 0739 0316 059A 0062;0061 1DFA 0739 0316 059A 0062;0061 1DFA 0739 0316 059A 0062;0061 1DFA 0739 0316 059A 0062; # (a◌ܹ◌֚◌̖◌᷺b; a◌᷺◌ܹ◌̖◌֚b; a◌᷺◌ܹ◌̖◌֚b; a◌᷺◌ܹ◌̖◌֚b; a◌᷺◌ܹ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC DOTTED ZLAMA ANGULAR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 073A 0062;00E0 05AE 073A 0315 0062;0061 05AE 0300 073A 0315 0062;00E0 05AE 073A 0315 0062;0061 05AE 0300 073A 0315 0062; # (a◌̕◌̀◌֮◌ܺb; à◌֮◌ܺ◌̕b; a◌֮◌̀◌ܺ◌̕b; à◌֮◌ܺ◌̕b; a◌֮◌̀◌ܺ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC HBASA ABOVE, LATIN SMALL LETTER B +0061 073A 0315 0300 05AE 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062; # (a◌ܺ◌̕◌̀◌֮b; a◌֮◌ܺ◌̀◌̕b; a◌֮◌ܺ◌̀◌̕b; a◌֮◌ܺ◌̀◌̕b; a◌֮◌ܺ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC HBASA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 073B 0062;0061 1DFA 0316 073B 059A 0062;0061 1DFA 0316 073B 059A 0062;0061 1DFA 0316 073B 059A 0062;0061 1DFA 0316 073B 059A 0062; # (a◌֚◌̖◌᷺◌ܻb; a◌᷺◌̖◌ܻ◌֚b; a◌᷺◌̖◌ܻ◌֚b; a◌᷺◌̖◌ܻ◌֚b; a◌᷺◌̖◌ܻ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC HBASA BELOW, LATIN SMALL LETTER B +0061 073B 059A 0316 1DFA 0062;0061 1DFA 073B 0316 059A 0062;0061 1DFA 073B 0316 059A 0062;0061 1DFA 073B 0316 059A 0062;0061 1DFA 073B 0316 059A 0062; # (a◌ܻ◌֚◌̖◌᷺b; a◌᷺◌ܻ◌̖◌֚b; a◌᷺◌ܻ◌̖◌֚b; a◌᷺◌ܻ◌̖◌֚b; a◌᷺◌ܻ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC HBASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 073C 0062;0061 1DFA 0316 073C 059A 0062;0061 1DFA 0316 073C 059A 0062;0061 1DFA 0316 073C 059A 0062;0061 1DFA 0316 073C 059A 0062; # (a◌֚◌̖◌᷺◌ܼb; a◌᷺◌̖◌ܼ◌֚b; a◌᷺◌̖◌ܼ◌֚b; a◌᷺◌̖◌ܼ◌֚b; a◌᷺◌̖◌ܼ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC HBASA-ESASA DOTTED, LATIN SMALL LETTER B +0061 073C 059A 0316 1DFA 0062;0061 1DFA 073C 0316 059A 0062;0061 1DFA 073C 0316 059A 0062;0061 1DFA 073C 0316 059A 0062;0061 1DFA 073C 0316 059A 0062; # (a◌ܼ◌֚◌̖◌᷺b; a◌᷺◌ܼ◌̖◌֚b; a◌᷺◌ܼ◌̖◌֚b; a◌᷺◌ܼ◌̖◌֚b; a◌᷺◌ܼ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC HBASA-ESASA DOTTED, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 073D 0062;00E0 05AE 073D 0315 0062;0061 05AE 0300 073D 0315 0062;00E0 05AE 073D 0315 0062;0061 05AE 0300 073D 0315 0062; # (a◌̕◌̀◌֮◌ܽb; à◌֮◌ܽ◌̕b; a◌֮◌̀◌ܽ◌̕b; à◌֮◌ܽ◌̕b; a◌֮◌̀◌ܽ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC ESASA ABOVE, LATIN SMALL LETTER B +0061 073D 0315 0300 05AE 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062; # (a◌ܽ◌̕◌̀◌֮b; a◌֮◌ܽ◌̀◌̕b; a◌֮◌ܽ◌̀◌̕b; a◌֮◌ܽ◌̀◌̕b; a◌֮◌ܽ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC ESASA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 073E 0062;0061 1DFA 0316 073E 059A 0062;0061 1DFA 0316 073E 059A 0062;0061 1DFA 0316 073E 059A 0062;0061 1DFA 0316 073E 059A 0062; # (a◌֚◌̖◌᷺◌ܾb; a◌᷺◌̖◌ܾ◌֚b; a◌᷺◌̖◌ܾ◌֚b; a◌᷺◌̖◌ܾ◌֚b; a◌᷺◌̖◌ܾ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC ESASA BELOW, LATIN SMALL LETTER B +0061 073E 059A 0316 1DFA 0062;0061 1DFA 073E 0316 059A 0062;0061 1DFA 073E 0316 059A 0062;0061 1DFA 073E 0316 059A 0062;0061 1DFA 073E 0316 059A 0062; # (a◌ܾ◌֚◌̖◌᷺b; a◌᷺◌ܾ◌̖◌֚b; a◌᷺◌ܾ◌̖◌֚b; a◌᷺◌ܾ◌̖◌֚b; a◌᷺◌ܾ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC ESASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 073F 0062;00E0 05AE 073F 0315 0062;0061 05AE 0300 073F 0315 0062;00E0 05AE 073F 0315 0062;0061 05AE 0300 073F 0315 0062; # (a◌̕◌̀◌֮◌ܿb; à◌֮◌ܿ◌̕b; a◌֮◌̀◌ܿ◌̕b; à◌֮◌ܿ◌̕b; a◌֮◌̀◌ܿ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC RWAHA, LATIN SMALL LETTER B +0061 073F 0315 0300 05AE 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062; # (a◌ܿ◌̕◌̀◌֮b; a◌֮◌ܿ◌̀◌̕b; a◌֮◌ܿ◌̀◌̕b; a◌֮◌ܿ◌̀◌̕b; a◌֮◌ܿ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC RWAHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0740 0062;00E0 05AE 0740 0315 0062;0061 05AE 0300 0740 0315 0062;00E0 05AE 0740 0315 0062;0061 05AE 0300 0740 0315 0062; # (a◌̕◌̀◌֮◌݀b; à◌֮◌݀◌̕b; a◌֮◌̀◌݀◌̕b; à◌֮◌݀◌̕b; a◌֮◌̀◌݀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC FEMININE DOT, LATIN SMALL LETTER B +0061 0740 0315 0300 05AE 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062; # (a◌݀◌̕◌̀◌֮b; a◌֮◌݀◌̀◌̕b; a◌֮◌݀◌̀◌̕b; a◌֮◌݀◌̀◌̕b; a◌֮◌݀◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC FEMININE DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0741 0062;00E0 05AE 0741 0315 0062;0061 05AE 0300 0741 0315 0062;00E0 05AE 0741 0315 0062;0061 05AE 0300 0741 0315 0062; # (a◌̕◌̀◌֮◌݁b; à◌֮◌݁◌̕b; a◌֮◌̀◌݁◌̕b; à◌֮◌݁◌̕b; a◌֮◌̀◌݁◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC QUSHSHAYA, LATIN SMALL LETTER B +0061 0741 0315 0300 05AE 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062; # (a◌݁◌̕◌̀◌֮b; a◌֮◌݁◌̀◌̕b; a◌֮◌݁◌̀◌̕b; a◌֮◌݁◌̀◌̕b; a◌֮◌݁◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC QUSHSHAYA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0742 0062;0061 1DFA 0316 0742 059A 0062;0061 1DFA 0316 0742 059A 0062;0061 1DFA 0316 0742 059A 0062;0061 1DFA 0316 0742 059A 0062; # (a◌֚◌̖◌᷺◌݂b; a◌᷺◌̖◌݂◌֚b; a◌᷺◌̖◌݂◌֚b; a◌᷺◌̖◌݂◌֚b; a◌᷺◌̖◌݂◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC RUKKAKHA, LATIN SMALL LETTER B +0061 0742 059A 0316 1DFA 0062;0061 1DFA 0742 0316 059A 0062;0061 1DFA 0742 0316 059A 0062;0061 1DFA 0742 0316 059A 0062;0061 1DFA 0742 0316 059A 0062; # (a◌݂◌֚◌̖◌᷺b; a◌᷺◌݂◌̖◌֚b; a◌᷺◌݂◌̖◌֚b; a◌᷺◌݂◌̖◌֚b; a◌᷺◌݂◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC RUKKAKHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0743 0062;00E0 05AE 0743 0315 0062;0061 05AE 0300 0743 0315 0062;00E0 05AE 0743 0315 0062;0061 05AE 0300 0743 0315 0062; # (a◌̕◌̀◌֮◌݃b; à◌֮◌݃◌̕b; a◌֮◌̀◌݃◌̕b; à◌֮◌݃◌̕b; a◌֮◌̀◌݃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC TWO VERTICAL DOTS ABOVE, LATIN SMALL LETTER B +0061 0743 0315 0300 05AE 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062; # (a◌݃◌̕◌̀◌֮b; a◌֮◌݃◌̀◌̕b; a◌֮◌݃◌̀◌̕b; a◌֮◌݃◌̀◌̕b; a◌֮◌݃◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC TWO VERTICAL DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0744 0062;0061 1DFA 0316 0744 059A 0062;0061 1DFA 0316 0744 059A 0062;0061 1DFA 0316 0744 059A 0062;0061 1DFA 0316 0744 059A 0062; # (a◌֚◌̖◌᷺◌݄b; a◌᷺◌̖◌݄◌֚b; a◌᷺◌̖◌݄◌֚b; a◌᷺◌̖◌݄◌֚b; a◌᷺◌̖◌݄◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC TWO VERTICAL DOTS BELOW, LATIN SMALL LETTER B +0061 0744 059A 0316 1DFA 0062;0061 1DFA 0744 0316 059A 0062;0061 1DFA 0744 0316 059A 0062;0061 1DFA 0744 0316 059A 0062;0061 1DFA 0744 0316 059A 0062; # (a◌݄◌֚◌̖◌᷺b; a◌᷺◌݄◌̖◌֚b; a◌᷺◌݄◌̖◌֚b; a◌᷺◌݄◌̖◌֚b; a◌᷺◌݄◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC TWO VERTICAL DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0745 0062;00E0 05AE 0745 0315 0062;0061 05AE 0300 0745 0315 0062;00E0 05AE 0745 0315 0062;0061 05AE 0300 0745 0315 0062; # (a◌̕◌̀◌֮◌݅b; à◌֮◌݅◌̕b; a◌֮◌̀◌݅◌̕b; à◌֮◌݅◌̕b; a◌֮◌̀◌݅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC THREE DOTS ABOVE, LATIN SMALL LETTER B +0061 0745 0315 0300 05AE 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062; # (a◌݅◌̕◌̀◌֮b; a◌֮◌݅◌̀◌̕b; a◌֮◌݅◌̀◌̕b; a◌֮◌݅◌̀◌̕b; a◌֮◌݅◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC THREE DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0746 0062;0061 1DFA 0316 0746 059A 0062;0061 1DFA 0316 0746 059A 0062;0061 1DFA 0316 0746 059A 0062;0061 1DFA 0316 0746 059A 0062; # (a◌֚◌̖◌᷺◌݆b; a◌᷺◌̖◌݆◌֚b; a◌᷺◌̖◌݆◌֚b; a◌᷺◌̖◌݆◌֚b; a◌᷺◌̖◌݆◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC THREE DOTS BELOW, LATIN SMALL LETTER B +0061 0746 059A 0316 1DFA 0062;0061 1DFA 0746 0316 059A 0062;0061 1DFA 0746 0316 059A 0062;0061 1DFA 0746 0316 059A 0062;0061 1DFA 0746 0316 059A 0062; # (a◌݆◌֚◌̖◌᷺b; a◌᷺◌݆◌̖◌֚b; a◌᷺◌݆◌̖◌֚b; a◌᷺◌݆◌̖◌֚b; a◌᷺◌݆◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC THREE DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0747 0062;00E0 05AE 0747 0315 0062;0061 05AE 0300 0747 0315 0062;00E0 05AE 0747 0315 0062;0061 05AE 0300 0747 0315 0062; # (a◌̕◌̀◌֮◌݇b; à◌֮◌݇◌̕b; a◌֮◌̀◌݇◌̕b; à◌֮◌݇◌̕b; a◌֮◌̀◌݇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC OBLIQUE LINE ABOVE, LATIN SMALL LETTER B +0061 0747 0315 0300 05AE 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062; # (a◌݇◌̕◌̀◌֮b; a◌֮◌݇◌̀◌̕b; a◌֮◌݇◌̀◌̕b; a◌֮◌݇◌̀◌̕b; a◌֮◌݇◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC OBLIQUE LINE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0748 0062;0061 1DFA 0316 0748 059A 0062;0061 1DFA 0316 0748 059A 0062;0061 1DFA 0316 0748 059A 0062;0061 1DFA 0316 0748 059A 0062; # (a◌֚◌̖◌᷺◌݈b; a◌᷺◌̖◌݈◌֚b; a◌᷺◌̖◌݈◌֚b; a◌᷺◌̖◌݈◌֚b; a◌᷺◌̖◌݈◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC OBLIQUE LINE BELOW, LATIN SMALL LETTER B +0061 0748 059A 0316 1DFA 0062;0061 1DFA 0748 0316 059A 0062;0061 1DFA 0748 0316 059A 0062;0061 1DFA 0748 0316 059A 0062;0061 1DFA 0748 0316 059A 0062; # (a◌݈◌֚◌̖◌᷺b; a◌᷺◌݈◌̖◌֚b; a◌᷺◌݈◌̖◌֚b; a◌᷺◌݈◌̖◌֚b; a◌᷺◌݈◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC OBLIQUE LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0749 0062;00E0 05AE 0749 0315 0062;0061 05AE 0300 0749 0315 0062;00E0 05AE 0749 0315 0062;0061 05AE 0300 0749 0315 0062; # (a◌̕◌̀◌֮◌݉b; à◌֮◌݉◌̕b; a◌֮◌̀◌݉◌̕b; à◌֮◌݉◌̕b; a◌֮◌̀◌݉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC MUSIC, LATIN SMALL LETTER B +0061 0749 0315 0300 05AE 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062; # (a◌݉◌̕◌̀◌֮b; a◌֮◌݉◌̀◌̕b; a◌֮◌݉◌̀◌̕b; a◌֮◌݉◌̀◌̕b; a◌֮◌݉◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC MUSIC, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 074A 0062;00E0 05AE 074A 0315 0062;0061 05AE 0300 074A 0315 0062;00E0 05AE 074A 0315 0062;0061 05AE 0300 074A 0315 0062; # (a◌̕◌̀◌֮◌݊b; à◌֮◌݊◌̕b; a◌֮◌̀◌݊◌̕b; à◌֮◌݊◌̕b; a◌֮◌̀◌݊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC BARREKH, LATIN SMALL LETTER B +0061 074A 0315 0300 05AE 0062;0061 05AE 074A 0300 0315 0062;0061 05AE 074A 0300 0315 0062;0061 05AE 074A 0300 0315 0062;0061 05AE 074A 0300 0315 0062; # (a◌݊◌̕◌̀◌֮b; a◌֮◌݊◌̀◌̕b; a◌֮◌݊◌̀◌̕b; a◌֮◌݊◌̀◌̕b; a◌֮◌݊◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC BARREKH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 07EB 0062;00E0 05AE 07EB 0315 0062;0061 05AE 0300 07EB 0315 0062;00E0 05AE 07EB 0315 0062;0061 05AE 0300 07EB 0315 0062; # (a◌̕◌̀◌֮◌߫b; à◌֮◌߫◌̕b; a◌֮◌̀◌߫◌̕b; à◌֮◌߫◌̕b; a◌֮◌̀◌߫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING SHORT HIGH TONE, LATIN SMALL LETTER B +0061 07EB 0315 0300 05AE 0062;0061 05AE 07EB 0300 0315 0062;0061 05AE 07EB 0300 0315 0062;0061 05AE 07EB 0300 0315 0062;0061 05AE 07EB 0300 0315 0062; # (a◌߫◌̕◌̀◌֮b; a◌֮◌߫◌̀◌̕b; a◌֮◌߫◌̀◌̕b; a◌֮◌߫◌̀◌̕b; a◌֮◌߫◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING SHORT HIGH TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 07EC 0062;00E0 05AE 07EC 0315 0062;0061 05AE 0300 07EC 0315 0062;00E0 05AE 07EC 0315 0062;0061 05AE 0300 07EC 0315 0062; # (a◌̕◌̀◌֮◌߬b; à◌֮◌߬◌̕b; a◌֮◌̀◌߬◌̕b; à◌֮◌߬◌̕b; a◌֮◌̀◌߬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING SHORT LOW TONE, LATIN SMALL LETTER B +0061 07EC 0315 0300 05AE 0062;0061 05AE 07EC 0300 0315 0062;0061 05AE 07EC 0300 0315 0062;0061 05AE 07EC 0300 0315 0062;0061 05AE 07EC 0300 0315 0062; # (a◌߬◌̕◌̀◌֮b; a◌֮◌߬◌̀◌̕b; a◌֮◌߬◌̀◌̕b; a◌֮◌߬◌̀◌̕b; a◌֮◌߬◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING SHORT LOW TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 07ED 0062;00E0 05AE 07ED 0315 0062;0061 05AE 0300 07ED 0315 0062;00E0 05AE 07ED 0315 0062;0061 05AE 0300 07ED 0315 0062; # (a◌̕◌̀◌֮◌߭b; à◌֮◌߭◌̕b; a◌֮◌̀◌߭◌̕b; à◌֮◌߭◌̕b; a◌֮◌̀◌߭◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING SHORT RISING TONE, LATIN SMALL LETTER B +0061 07ED 0315 0300 05AE 0062;0061 05AE 07ED 0300 0315 0062;0061 05AE 07ED 0300 0315 0062;0061 05AE 07ED 0300 0315 0062;0061 05AE 07ED 0300 0315 0062; # (a◌߭◌̕◌̀◌֮b; a◌֮◌߭◌̀◌̕b; a◌֮◌߭◌̀◌̕b; a◌֮◌߭◌̀◌̕b; a◌֮◌߭◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING SHORT RISING TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 07EE 0062;00E0 05AE 07EE 0315 0062;0061 05AE 0300 07EE 0315 0062;00E0 05AE 07EE 0315 0062;0061 05AE 0300 07EE 0315 0062; # (a◌̕◌̀◌֮◌߮b; à◌֮◌߮◌̕b; a◌֮◌̀◌߮◌̕b; à◌֮◌߮◌̕b; a◌֮◌̀◌߮◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING LONG DESCENDING TONE, LATIN SMALL LETTER B +0061 07EE 0315 0300 05AE 0062;0061 05AE 07EE 0300 0315 0062;0061 05AE 07EE 0300 0315 0062;0061 05AE 07EE 0300 0315 0062;0061 05AE 07EE 0300 0315 0062; # (a◌߮◌̕◌̀◌֮b; a◌֮◌߮◌̀◌̕b; a◌֮◌߮◌̀◌̕b; a◌֮◌߮◌̀◌̕b; a◌֮◌߮◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING LONG DESCENDING TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 07EF 0062;00E0 05AE 07EF 0315 0062;0061 05AE 0300 07EF 0315 0062;00E0 05AE 07EF 0315 0062;0061 05AE 0300 07EF 0315 0062; # (a◌̕◌̀◌֮◌߯b; à◌֮◌߯◌̕b; a◌֮◌̀◌߯◌̕b; à◌֮◌߯◌̕b; a◌֮◌̀◌߯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING LONG HIGH TONE, LATIN SMALL LETTER B +0061 07EF 0315 0300 05AE 0062;0061 05AE 07EF 0300 0315 0062;0061 05AE 07EF 0300 0315 0062;0061 05AE 07EF 0300 0315 0062;0061 05AE 07EF 0300 0315 0062; # (a◌߯◌̕◌̀◌֮b; a◌֮◌߯◌̀◌̕b; a◌֮◌߯◌̀◌̕b; a◌֮◌߯◌̀◌̕b; a◌֮◌߯◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING LONG HIGH TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 07F0 0062;00E0 05AE 07F0 0315 0062;0061 05AE 0300 07F0 0315 0062;00E0 05AE 07F0 0315 0062;0061 05AE 0300 07F0 0315 0062; # (a◌̕◌̀◌֮◌߰b; à◌֮◌߰◌̕b; a◌֮◌̀◌߰◌̕b; à◌֮◌߰◌̕b; a◌֮◌̀◌߰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING LONG LOW TONE, LATIN SMALL LETTER B +0061 07F0 0315 0300 05AE 0062;0061 05AE 07F0 0300 0315 0062;0061 05AE 07F0 0300 0315 0062;0061 05AE 07F0 0300 0315 0062;0061 05AE 07F0 0300 0315 0062; # (a◌߰◌̕◌̀◌֮b; a◌֮◌߰◌̀◌̕b; a◌֮◌߰◌̀◌̕b; a◌֮◌߰◌̀◌̕b; a◌֮◌߰◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING LONG LOW TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 07F1 0062;00E0 05AE 07F1 0315 0062;0061 05AE 0300 07F1 0315 0062;00E0 05AE 07F1 0315 0062;0061 05AE 0300 07F1 0315 0062; # (a◌̕◌̀◌֮◌߱b; à◌֮◌߱◌̕b; a◌֮◌̀◌߱◌̕b; à◌֮◌߱◌̕b; a◌֮◌̀◌߱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING LONG RISING TONE, LATIN SMALL LETTER B +0061 07F1 0315 0300 05AE 0062;0061 05AE 07F1 0300 0315 0062;0061 05AE 07F1 0300 0315 0062;0061 05AE 07F1 0300 0315 0062;0061 05AE 07F1 0300 0315 0062; # (a◌߱◌̕◌̀◌֮b; a◌֮◌߱◌̀◌̕b; a◌֮◌߱◌̀◌̕b; a◌֮◌߱◌̀◌̕b; a◌֮◌߱◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING LONG RISING TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 07F2 0062;0061 1DFA 0316 07F2 059A 0062;0061 1DFA 0316 07F2 059A 0062;0061 1DFA 0316 07F2 059A 0062;0061 1DFA 0316 07F2 059A 0062; # (a◌֚◌̖◌᷺◌߲b; a◌᷺◌̖◌߲◌֚b; a◌᷺◌̖◌߲◌֚b; a◌᷺◌̖◌߲◌֚b; a◌᷺◌̖◌߲◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, NKO COMBINING NASALIZATION MARK, LATIN SMALL LETTER B +0061 07F2 059A 0316 1DFA 0062;0061 1DFA 07F2 0316 059A 0062;0061 1DFA 07F2 0316 059A 0062;0061 1DFA 07F2 0316 059A 0062;0061 1DFA 07F2 0316 059A 0062; # (a◌߲◌֚◌̖◌᷺b; a◌᷺◌߲◌̖◌֚b; a◌᷺◌߲◌̖◌֚b; a◌᷺◌߲◌̖◌֚b; a◌᷺◌߲◌̖◌֚b; ) LATIN SMALL LETTER A, NKO COMBINING NASALIZATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 07F3 0062;00E0 05AE 07F3 0315 0062;0061 05AE 0300 07F3 0315 0062;00E0 05AE 07F3 0315 0062;0061 05AE 0300 07F3 0315 0062; # (a◌̕◌̀◌֮◌߳b; à◌֮◌߳◌̕b; a◌֮◌̀◌߳◌̕b; à◌֮◌߳◌̕b; a◌֮◌̀◌߳◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING DOUBLE DOT ABOVE, LATIN SMALL LETTER B +0061 07F3 0315 0300 05AE 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062; # (a◌߳◌̕◌̀◌֮b; a◌֮◌߳◌̀◌̕b; a◌֮◌߳◌̀◌̕b; a◌֮◌߳◌̀◌̕b; a◌֮◌߳◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING DOUBLE DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 07FD 0062;0061 1DFA 0316 07FD 059A 0062;0061 1DFA 0316 07FD 059A 0062;0061 1DFA 0316 07FD 059A 0062;0061 1DFA 0316 07FD 059A 0062; # (a◌֚◌̖◌᷺◌߽b; a◌᷺◌̖◌߽◌֚b; a◌᷺◌̖◌߽◌֚b; a◌᷺◌̖◌߽◌֚b; a◌᷺◌̖◌߽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, NKO DANTAYALAN, LATIN SMALL LETTER B +0061 07FD 059A 0316 1DFA 0062;0061 1DFA 07FD 0316 059A 0062;0061 1DFA 07FD 0316 059A 0062;0061 1DFA 07FD 0316 059A 0062;0061 1DFA 07FD 0316 059A 0062; # (a◌߽◌֚◌̖◌᷺b; a◌᷺◌߽◌̖◌֚b; a◌᷺◌߽◌̖◌֚b; a◌᷺◌߽◌̖◌֚b; a◌᷺◌߽◌̖◌֚b; ) LATIN SMALL LETTER A, NKO DANTAYALAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0816 0062;00E0 05AE 0816 0315 0062;0061 05AE 0300 0816 0315 0062;00E0 05AE 0816 0315 0062;0061 05AE 0300 0816 0315 0062; # (a◌̕◌̀◌֮◌ࠖb; à◌֮◌ࠖ◌̕b; a◌֮◌̀◌ࠖ◌̕b; à◌֮◌ࠖ◌̕b; a◌֮◌̀◌ࠖ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK IN, LATIN SMALL LETTER B +0061 0816 0315 0300 05AE 0062;0061 05AE 0816 0300 0315 0062;0061 05AE 0816 0300 0315 0062;0061 05AE 0816 0300 0315 0062;0061 05AE 0816 0300 0315 0062; # (a◌ࠖ◌̕◌̀◌֮b; a◌֮◌ࠖ◌̀◌̕b; a◌֮◌ࠖ◌̀◌̕b; a◌֮◌ࠖ◌̀◌̕b; a◌֮◌ࠖ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN MARK IN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0817 0062;00E0 05AE 0817 0315 0062;0061 05AE 0300 0817 0315 0062;00E0 05AE 0817 0315 0062;0061 05AE 0300 0817 0315 0062; # (a◌̕◌̀◌֮◌ࠗb; à◌֮◌ࠗ◌̕b; a◌֮◌̀◌ࠗ◌̕b; à◌֮◌ࠗ◌̕b; a◌֮◌̀◌ࠗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK IN-ALAF, LATIN SMALL LETTER B +0061 0817 0315 0300 05AE 0062;0061 05AE 0817 0300 0315 0062;0061 05AE 0817 0300 0315 0062;0061 05AE 0817 0300 0315 0062;0061 05AE 0817 0300 0315 0062; # (a◌ࠗ◌̕◌̀◌֮b; a◌֮◌ࠗ◌̀◌̕b; a◌֮◌ࠗ◌̀◌̕b; a◌֮◌ࠗ◌̀◌̕b; a◌֮◌ࠗ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN MARK IN-ALAF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0818 0062;00E0 05AE 0818 0315 0062;0061 05AE 0300 0818 0315 0062;00E0 05AE 0818 0315 0062;0061 05AE 0300 0818 0315 0062; # (a◌̕◌̀◌֮◌࠘b; à◌֮◌࠘◌̕b; a◌֮◌̀◌࠘◌̕b; à◌֮◌࠘◌̕b; a◌֮◌̀◌࠘◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK OCCLUSION, LATIN SMALL LETTER B +0061 0818 0315 0300 05AE 0062;0061 05AE 0818 0300 0315 0062;0061 05AE 0818 0300 0315 0062;0061 05AE 0818 0300 0315 0062;0061 05AE 0818 0300 0315 0062; # (a◌࠘◌̕◌̀◌֮b; a◌֮◌࠘◌̀◌̕b; a◌֮◌࠘◌̀◌̕b; a◌֮◌࠘◌̀◌̕b; a◌֮◌࠘◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN MARK OCCLUSION, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0819 0062;00E0 05AE 0819 0315 0062;0061 05AE 0300 0819 0315 0062;00E0 05AE 0819 0315 0062;0061 05AE 0300 0819 0315 0062; # (a◌̕◌̀◌֮◌࠙b; à◌֮◌࠙◌̕b; a◌֮◌̀◌࠙◌̕b; à◌֮◌࠙◌̕b; a◌֮◌̀◌࠙◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK DAGESH, LATIN SMALL LETTER B +0061 0819 0315 0300 05AE 0062;0061 05AE 0819 0300 0315 0062;0061 05AE 0819 0300 0315 0062;0061 05AE 0819 0300 0315 0062;0061 05AE 0819 0300 0315 0062; # (a◌࠙◌̕◌̀◌֮b; a◌֮◌࠙◌̀◌̕b; a◌֮◌࠙◌̀◌̕b; a◌֮◌࠙◌̀◌̕b; a◌֮◌࠙◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN MARK DAGESH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 081B 0062;00E0 05AE 081B 0315 0062;0061 05AE 0300 081B 0315 0062;00E0 05AE 081B 0315 0062;0061 05AE 0300 081B 0315 0062; # (a◌̕◌̀◌֮◌ࠛb; à◌֮◌ࠛ◌̕b; a◌֮◌̀◌ࠛ◌̕b; à◌֮◌ࠛ◌̕b; a◌֮◌̀◌ࠛ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK EPENTHETIC YUT, LATIN SMALL LETTER B +0061 081B 0315 0300 05AE 0062;0061 05AE 081B 0300 0315 0062;0061 05AE 081B 0300 0315 0062;0061 05AE 081B 0300 0315 0062;0061 05AE 081B 0300 0315 0062; # (a◌ࠛ◌̕◌̀◌֮b; a◌֮◌ࠛ◌̀◌̕b; a◌֮◌ࠛ◌̀◌̕b; a◌֮◌ࠛ◌̀◌̕b; a◌֮◌ࠛ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN MARK EPENTHETIC YUT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 081C 0062;00E0 05AE 081C 0315 0062;0061 05AE 0300 081C 0315 0062;00E0 05AE 081C 0315 0062;0061 05AE 0300 081C 0315 0062; # (a◌̕◌̀◌֮◌ࠜb; à◌֮◌ࠜ◌̕b; a◌֮◌̀◌ࠜ◌̕b; à◌֮◌ࠜ◌̕b; a◌֮◌̀◌ࠜ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN LONG E, LATIN SMALL LETTER B +0061 081C 0315 0300 05AE 0062;0061 05AE 081C 0300 0315 0062;0061 05AE 081C 0300 0315 0062;0061 05AE 081C 0300 0315 0062;0061 05AE 081C 0300 0315 0062; # (a◌ࠜ◌̕◌̀◌֮b; a◌֮◌ࠜ◌̀◌̕b; a◌֮◌ࠜ◌̀◌̕b; a◌֮◌ࠜ◌̀◌̕b; a◌֮◌ࠜ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN LONG E, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 081D 0062;00E0 05AE 081D 0315 0062;0061 05AE 0300 081D 0315 0062;00E0 05AE 081D 0315 0062;0061 05AE 0300 081D 0315 0062; # (a◌̕◌̀◌֮◌ࠝb; à◌֮◌ࠝ◌̕b; a◌֮◌̀◌ࠝ◌̕b; à◌֮◌ࠝ◌̕b; a◌֮◌̀◌ࠝ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN E, LATIN SMALL LETTER B +0061 081D 0315 0300 05AE 0062;0061 05AE 081D 0300 0315 0062;0061 05AE 081D 0300 0315 0062;0061 05AE 081D 0300 0315 0062;0061 05AE 081D 0300 0315 0062; # (a◌ࠝ◌̕◌̀◌֮b; a◌֮◌ࠝ◌̀◌̕b; a◌֮◌ࠝ◌̀◌̕b; a◌֮◌ࠝ◌̀◌̕b; a◌֮◌ࠝ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN E, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 081E 0062;00E0 05AE 081E 0315 0062;0061 05AE 0300 081E 0315 0062;00E0 05AE 081E 0315 0062;0061 05AE 0300 081E 0315 0062; # (a◌̕◌̀◌֮◌ࠞb; à◌֮◌ࠞ◌̕b; a◌֮◌̀◌ࠞ◌̕b; à◌֮◌ࠞ◌̕b; a◌֮◌̀◌ࠞ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN OVERLONG AA, LATIN SMALL LETTER B +0061 081E 0315 0300 05AE 0062;0061 05AE 081E 0300 0315 0062;0061 05AE 081E 0300 0315 0062;0061 05AE 081E 0300 0315 0062;0061 05AE 081E 0300 0315 0062; # (a◌ࠞ◌̕◌̀◌֮b; a◌֮◌ࠞ◌̀◌̕b; a◌֮◌ࠞ◌̀◌̕b; a◌֮◌ࠞ◌̀◌̕b; a◌֮◌ࠞ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN OVERLONG AA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 081F 0062;00E0 05AE 081F 0315 0062;0061 05AE 0300 081F 0315 0062;00E0 05AE 081F 0315 0062;0061 05AE 0300 081F 0315 0062; # (a◌̕◌̀◌֮◌ࠟb; à◌֮◌ࠟ◌̕b; a◌֮◌̀◌ࠟ◌̕b; à◌֮◌ࠟ◌̕b; a◌֮◌̀◌ࠟ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN LONG AA, LATIN SMALL LETTER B +0061 081F 0315 0300 05AE 0062;0061 05AE 081F 0300 0315 0062;0061 05AE 081F 0300 0315 0062;0061 05AE 081F 0300 0315 0062;0061 05AE 081F 0300 0315 0062; # (a◌ࠟ◌̕◌̀◌֮b; a◌֮◌ࠟ◌̀◌̕b; a◌֮◌ࠟ◌̀◌̕b; a◌֮◌ࠟ◌̀◌̕b; a◌֮◌ࠟ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN LONG AA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0820 0062;00E0 05AE 0820 0315 0062;0061 05AE 0300 0820 0315 0062;00E0 05AE 0820 0315 0062;0061 05AE 0300 0820 0315 0062; # (a◌̕◌̀◌֮◌ࠠb; à◌֮◌ࠠ◌̕b; a◌֮◌̀◌ࠠ◌̕b; à◌֮◌ࠠ◌̕b; a◌֮◌̀◌ࠠ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0820 0315 0300 05AE 0062;0061 05AE 0820 0300 0315 0062;0061 05AE 0820 0300 0315 0062;0061 05AE 0820 0300 0315 0062;0061 05AE 0820 0300 0315 0062; # (a◌ࠠ◌̕◌̀◌֮b; a◌֮◌ࠠ◌̀◌̕b; a◌֮◌ࠠ◌̀◌̕b; a◌֮◌ࠠ◌̀◌̕b; a◌֮◌ࠠ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN AA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0821 0062;00E0 05AE 0821 0315 0062;0061 05AE 0300 0821 0315 0062;00E0 05AE 0821 0315 0062;0061 05AE 0300 0821 0315 0062; # (a◌̕◌̀◌֮◌ࠡb; à◌֮◌ࠡ◌̕b; a◌֮◌̀◌ࠡ◌̕b; à◌֮◌ࠡ◌̕b; a◌֮◌̀◌ࠡ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN OVERLONG A, LATIN SMALL LETTER B +0061 0821 0315 0300 05AE 0062;0061 05AE 0821 0300 0315 0062;0061 05AE 0821 0300 0315 0062;0061 05AE 0821 0300 0315 0062;0061 05AE 0821 0300 0315 0062; # (a◌ࠡ◌̕◌̀◌֮b; a◌֮◌ࠡ◌̀◌̕b; a◌֮◌ࠡ◌̀◌̕b; a◌֮◌ࠡ◌̀◌̕b; a◌֮◌ࠡ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN OVERLONG A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0822 0062;00E0 05AE 0822 0315 0062;0061 05AE 0300 0822 0315 0062;00E0 05AE 0822 0315 0062;0061 05AE 0300 0822 0315 0062; # (a◌̕◌̀◌֮◌ࠢb; à◌֮◌ࠢ◌̕b; a◌֮◌̀◌ࠢ◌̕b; à◌֮◌ࠢ◌̕b; a◌֮◌̀◌ࠢ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN LONG A, LATIN SMALL LETTER B +0061 0822 0315 0300 05AE 0062;0061 05AE 0822 0300 0315 0062;0061 05AE 0822 0300 0315 0062;0061 05AE 0822 0300 0315 0062;0061 05AE 0822 0300 0315 0062; # (a◌ࠢ◌̕◌̀◌֮b; a◌֮◌ࠢ◌̀◌̕b; a◌֮◌ࠢ◌̀◌̕b; a◌֮◌ࠢ◌̀◌̕b; a◌֮◌ࠢ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN LONG A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0823 0062;00E0 05AE 0823 0315 0062;0061 05AE 0300 0823 0315 0062;00E0 05AE 0823 0315 0062;0061 05AE 0300 0823 0315 0062; # (a◌̕◌̀◌֮◌ࠣb; à◌֮◌ࠣ◌̕b; a◌֮◌̀◌ࠣ◌̕b; à◌֮◌ࠣ◌̕b; a◌֮◌̀◌ࠣ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN A, LATIN SMALL LETTER B +0061 0823 0315 0300 05AE 0062;0061 05AE 0823 0300 0315 0062;0061 05AE 0823 0300 0315 0062;0061 05AE 0823 0300 0315 0062;0061 05AE 0823 0300 0315 0062; # (a◌ࠣ◌̕◌̀◌֮b; a◌֮◌ࠣ◌̀◌̕b; a◌֮◌ࠣ◌̀◌̕b; a◌֮◌ࠣ◌̀◌̕b; a◌֮◌ࠣ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0825 0062;00E0 05AE 0825 0315 0062;0061 05AE 0300 0825 0315 0062;00E0 05AE 0825 0315 0062;0061 05AE 0300 0825 0315 0062; # (a◌̕◌̀◌֮◌ࠥb; à◌֮◌ࠥ◌̕b; a◌֮◌̀◌ࠥ◌̕b; à◌֮◌ࠥ◌̕b; a◌֮◌̀◌ࠥ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN SHORT A, LATIN SMALL LETTER B +0061 0825 0315 0300 05AE 0062;0061 05AE 0825 0300 0315 0062;0061 05AE 0825 0300 0315 0062;0061 05AE 0825 0300 0315 0062;0061 05AE 0825 0300 0315 0062; # (a◌ࠥ◌̕◌̀◌֮b; a◌֮◌ࠥ◌̀◌̕b; a◌֮◌ࠥ◌̀◌̕b; a◌֮◌ࠥ◌̀◌̕b; a◌֮◌ࠥ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN SHORT A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0826 0062;00E0 05AE 0826 0315 0062;0061 05AE 0300 0826 0315 0062;00E0 05AE 0826 0315 0062;0061 05AE 0300 0826 0315 0062; # (a◌̕◌̀◌֮◌ࠦb; à◌֮◌ࠦ◌̕b; a◌֮◌̀◌ࠦ◌̕b; à◌֮◌ࠦ◌̕b; a◌֮◌̀◌ࠦ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN LONG U, LATIN SMALL LETTER B +0061 0826 0315 0300 05AE 0062;0061 05AE 0826 0300 0315 0062;0061 05AE 0826 0300 0315 0062;0061 05AE 0826 0300 0315 0062;0061 05AE 0826 0300 0315 0062; # (a◌ࠦ◌̕◌̀◌֮b; a◌֮◌ࠦ◌̀◌̕b; a◌֮◌ࠦ◌̀◌̕b; a◌֮◌ࠦ◌̀◌̕b; a◌֮◌ࠦ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN LONG U, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0827 0062;00E0 05AE 0827 0315 0062;0061 05AE 0300 0827 0315 0062;00E0 05AE 0827 0315 0062;0061 05AE 0300 0827 0315 0062; # (a◌̕◌̀◌֮◌ࠧb; à◌֮◌ࠧ◌̕b; a◌֮◌̀◌ࠧ◌̕b; à◌֮◌ࠧ◌̕b; a◌֮◌̀◌ࠧ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 0827 0315 0300 05AE 0062;0061 05AE 0827 0300 0315 0062;0061 05AE 0827 0300 0315 0062;0061 05AE 0827 0300 0315 0062;0061 05AE 0827 0300 0315 0062; # (a◌ࠧ◌̕◌̀◌֮b; a◌֮◌ࠧ◌̀◌̕b; a◌֮◌ࠧ◌̀◌̕b; a◌֮◌ࠧ◌̀◌̕b; a◌֮◌ࠧ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN U, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0829 0062;00E0 05AE 0829 0315 0062;0061 05AE 0300 0829 0315 0062;00E0 05AE 0829 0315 0062;0061 05AE 0300 0829 0315 0062; # (a◌̕◌̀◌֮◌ࠩb; à◌֮◌ࠩ◌̕b; a◌֮◌̀◌ࠩ◌̕b; à◌֮◌ࠩ◌̕b; a◌֮◌̀◌ࠩ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN LONG I, LATIN SMALL LETTER B +0061 0829 0315 0300 05AE 0062;0061 05AE 0829 0300 0315 0062;0061 05AE 0829 0300 0315 0062;0061 05AE 0829 0300 0315 0062;0061 05AE 0829 0300 0315 0062; # (a◌ࠩ◌̕◌̀◌֮b; a◌֮◌ࠩ◌̀◌̕b; a◌֮◌ࠩ◌̀◌̕b; a◌֮◌ࠩ◌̀◌̕b; a◌֮◌ࠩ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN LONG I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 082A 0062;00E0 05AE 082A 0315 0062;0061 05AE 0300 082A 0315 0062;00E0 05AE 082A 0315 0062;0061 05AE 0300 082A 0315 0062; # (a◌̕◌̀◌֮◌ࠪb; à◌֮◌ࠪ◌̕b; a◌֮◌̀◌ࠪ◌̕b; à◌֮◌ࠪ◌̕b; a◌֮◌̀◌ࠪ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN I, LATIN SMALL LETTER B +0061 082A 0315 0300 05AE 0062;0061 05AE 082A 0300 0315 0062;0061 05AE 082A 0300 0315 0062;0061 05AE 082A 0300 0315 0062;0061 05AE 082A 0300 0315 0062; # (a◌ࠪ◌̕◌̀◌֮b; a◌֮◌ࠪ◌̀◌̕b; a◌֮◌ࠪ◌̀◌̕b; a◌֮◌ࠪ◌̀◌̕b; a◌֮◌ࠪ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 082B 0062;00E0 05AE 082B 0315 0062;0061 05AE 0300 082B 0315 0062;00E0 05AE 082B 0315 0062;0061 05AE 0300 082B 0315 0062; # (a◌̕◌̀◌֮◌ࠫb; à◌֮◌ࠫ◌̕b; a◌֮◌̀◌ࠫ◌̕b; à◌֮◌ࠫ◌̕b; a◌֮◌̀◌ࠫ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN O, LATIN SMALL LETTER B +0061 082B 0315 0300 05AE 0062;0061 05AE 082B 0300 0315 0062;0061 05AE 082B 0300 0315 0062;0061 05AE 082B 0300 0315 0062;0061 05AE 082B 0300 0315 0062; # (a◌ࠫ◌̕◌̀◌֮b; a◌֮◌ࠫ◌̀◌̕b; a◌֮◌ࠫ◌̀◌̕b; a◌֮◌ࠫ◌̀◌̕b; a◌֮◌ࠫ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN O, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 082C 0062;00E0 05AE 082C 0315 0062;0061 05AE 0300 082C 0315 0062;00E0 05AE 082C 0315 0062;0061 05AE 0300 082C 0315 0062; # (a◌̕◌̀◌֮◌ࠬb; à◌֮◌ࠬ◌̕b; a◌֮◌̀◌ࠬ◌̕b; à◌֮◌ࠬ◌̕b; a◌֮◌̀◌ࠬ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN VOWEL SIGN SUKUN, LATIN SMALL LETTER B +0061 082C 0315 0300 05AE 0062;0061 05AE 082C 0300 0315 0062;0061 05AE 082C 0300 0315 0062;0061 05AE 082C 0300 0315 0062;0061 05AE 082C 0300 0315 0062; # (a◌ࠬ◌̕◌̀◌֮b; a◌֮◌ࠬ◌̀◌̕b; a◌֮◌ࠬ◌̀◌̕b; a◌֮◌ࠬ◌̀◌̕b; a◌֮◌ࠬ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN SUKUN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 082D 0062;00E0 05AE 082D 0315 0062;0061 05AE 0300 082D 0315 0062;00E0 05AE 082D 0315 0062;0061 05AE 0300 082D 0315 0062; # (a◌̕◌̀◌֮◌࠭b; à◌֮◌࠭◌̕b; a◌֮◌̀◌࠭◌̕b; à◌֮◌࠭◌̕b; a◌֮◌̀◌࠭◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK NEQUDAA, LATIN SMALL LETTER B +0061 082D 0315 0300 05AE 0062;0061 05AE 082D 0300 0315 0062;0061 05AE 082D 0300 0315 0062;0061 05AE 082D 0300 0315 0062;0061 05AE 082D 0300 0315 0062; # (a◌࠭◌̕◌̀◌֮b; a◌֮◌࠭◌̀◌̕b; a◌֮◌࠭◌̀◌̕b; a◌֮◌࠭◌̀◌̕b; a◌֮◌࠭◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN MARK NEQUDAA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0859 0062;0061 1DFA 0316 0859 059A 0062;0061 1DFA 0316 0859 059A 0062;0061 1DFA 0316 0859 059A 0062;0061 1DFA 0316 0859 059A 0062; # (a◌֚◌̖◌᷺◌࡙b; a◌᷺◌̖◌࡙◌֚b; a◌᷺◌̖◌࡙◌֚b; a◌᷺◌̖◌࡙◌֚b; a◌᷺◌̖◌࡙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MANDAIC AFFRICATION MARK, LATIN SMALL LETTER B +0061 0859 059A 0316 1DFA 0062;0061 1DFA 0859 0316 059A 0062;0061 1DFA 0859 0316 059A 0062;0061 1DFA 0859 0316 059A 0062;0061 1DFA 0859 0316 059A 0062; # (a◌࡙◌֚◌̖◌᷺b; a◌᷺◌࡙◌̖◌֚b; a◌᷺◌࡙◌̖◌֚b; a◌᷺◌࡙◌̖◌֚b; a◌᷺◌࡙◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC AFFRICATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 085A 0062;0061 1DFA 0316 085A 059A 0062;0061 1DFA 0316 085A 059A 0062;0061 1DFA 0316 085A 059A 0062;0061 1DFA 0316 085A 059A 0062; # (a◌֚◌̖◌᷺◌࡚b; a◌᷺◌̖◌࡚◌֚b; a◌᷺◌̖◌࡚◌֚b; a◌᷺◌̖◌࡚◌֚b; a◌᷺◌̖◌࡚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MANDAIC VOCALIZATION MARK, LATIN SMALL LETTER B +0061 085A 059A 0316 1DFA 0062;0061 1DFA 085A 0316 059A 0062;0061 1DFA 085A 0316 059A 0062;0061 1DFA 085A 0316 059A 0062;0061 1DFA 085A 0316 059A 0062; # (a◌࡚◌֚◌̖◌᷺b; a◌᷺◌࡚◌̖◌֚b; a◌᷺◌࡚◌̖◌֚b; a◌᷺◌࡚◌̖◌֚b; a◌᷺◌࡚◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC VOCALIZATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 085B 0062;0061 1DFA 0316 085B 059A 0062;0061 1DFA 0316 085B 059A 0062;0061 1DFA 0316 085B 059A 0062;0061 1DFA 0316 085B 059A 0062; # (a◌֚◌̖◌᷺◌࡛b; a◌᷺◌̖◌࡛◌֚b; a◌᷺◌̖◌࡛◌֚b; a◌᷺◌̖◌࡛◌֚b; a◌᷺◌̖◌࡛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MANDAIC GEMINATION MARK, LATIN SMALL LETTER B +0061 085B 059A 0316 1DFA 0062;0061 1DFA 085B 0316 059A 0062;0061 1DFA 085B 0316 059A 0062;0061 1DFA 085B 0316 059A 0062;0061 1DFA 085B 0316 059A 0062; # (a◌࡛◌֚◌̖◌᷺b; a◌᷺◌࡛◌̖◌֚b; a◌᷺◌࡛◌̖◌֚b; a◌᷺◌࡛◌̖◌֚b; a◌᷺◌࡛◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC GEMINATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0898 0062;00E0 05AE 0898 0315 0062;0061 05AE 0300 0898 0315 0062;00E0 05AE 0898 0315 0062;0061 05AE 0300 0898 0315 0062; # (a◌̕◌̀◌֮◌࢘b; à◌֮◌࢘◌̕b; a◌֮◌̀◌࢘◌̕b; à◌֮◌࢘◌̕b; a◌֮◌̀◌࢘◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD AL-JUZ, LATIN SMALL LETTER B +0061 0898 0315 0300 05AE 0062;0061 05AE 0898 0300 0315 0062;0061 05AE 0898 0300 0315 0062;0061 05AE 0898 0300 0315 0062;0061 05AE 0898 0300 0315 0062; # (a◌࢘◌̕◌̀◌֮b; a◌֮◌࢘◌̀◌̕b; a◌֮◌࢘◌̀◌̕b; a◌֮◌࢘◌̀◌̕b; a◌֮◌࢘◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD AL-JUZ, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0899 0062;0061 1DFA 0316 0899 059A 0062;0061 1DFA 0316 0899 059A 0062;0061 1DFA 0316 0899 059A 0062;0061 1DFA 0316 0899 059A 0062; # (a◌֚◌̖◌᷺◌࢙b; a◌᷺◌̖◌࢙◌֚b; a◌᷺◌̖◌࢙◌֚b; a◌᷺◌̖◌࢙◌֚b; a◌᷺◌̖◌࢙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD ISHMAAM, LATIN SMALL LETTER B +0061 0899 059A 0316 1DFA 0062;0061 1DFA 0899 0316 059A 0062;0061 1DFA 0899 0316 059A 0062;0061 1DFA 0899 0316 059A 0062;0061 1DFA 0899 0316 059A 0062; # (a◌࢙◌֚◌̖◌᷺b; a◌᷺◌࢙◌̖◌֚b; a◌᷺◌࢙◌̖◌֚b; a◌᷺◌࢙◌̖◌֚b; a◌᷺◌࢙◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD ISHMAAM, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 089A 0062;0061 1DFA 0316 089A 059A 0062;0061 1DFA 0316 089A 059A 0062;0061 1DFA 0316 089A 059A 0062;0061 1DFA 0316 089A 059A 0062; # (a◌֚◌̖◌᷺◌࢚b; a◌᷺◌̖◌࢚◌֚b; a◌᷺◌̖◌࢚◌֚b; a◌᷺◌̖◌࢚◌֚b; a◌᷺◌̖◌࢚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD IMAALA, LATIN SMALL LETTER B +0061 089A 059A 0316 1DFA 0062;0061 1DFA 089A 0316 059A 0062;0061 1DFA 089A 0316 059A 0062;0061 1DFA 089A 0316 059A 0062;0061 1DFA 089A 0316 059A 0062; # (a◌࢚◌֚◌̖◌᷺b; a◌᷺◌࢚◌̖◌֚b; a◌᷺◌࢚◌̖◌֚b; a◌᷺◌࢚◌̖◌֚b; a◌᷺◌࢚◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD IMAALA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 089B 0062;0061 1DFA 0316 089B 059A 0062;0061 1DFA 0316 089B 059A 0062;0061 1DFA 0316 089B 059A 0062;0061 1DFA 0316 089B 059A 0062; # (a◌֚◌̖◌᷺◌࢛b; a◌᷺◌̖◌࢛◌֚b; a◌᷺◌̖◌࢛◌֚b; a◌᷺◌̖◌࢛◌֚b; a◌᷺◌̖◌࢛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD TASHEEL, LATIN SMALL LETTER B +0061 089B 059A 0316 1DFA 0062;0061 1DFA 089B 0316 059A 0062;0061 1DFA 089B 0316 059A 0062;0061 1DFA 089B 0316 059A 0062;0061 1DFA 089B 0316 059A 0062; # (a◌࢛◌֚◌̖◌᷺b; a◌᷺◌࢛◌̖◌֚b; a◌᷺◌࢛◌̖◌֚b; a◌᷺◌࢛◌̖◌֚b; a◌᷺◌࢛◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD TASHEEL, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 089C 0062;00E0 05AE 089C 0315 0062;0061 05AE 0300 089C 0315 0062;00E0 05AE 089C 0315 0062;0061 05AE 0300 089C 0315 0062; # (a◌̕◌̀◌֮◌࢜b; à◌֮◌࢜◌̕b; a◌֮◌̀◌࢜◌̕b; à◌֮◌࢜◌̕b; a◌֮◌̀◌࢜◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC MADDA WAAJIB, LATIN SMALL LETTER B +0061 089C 0315 0300 05AE 0062;0061 05AE 089C 0300 0315 0062;0061 05AE 089C 0300 0315 0062;0061 05AE 089C 0300 0315 0062;0061 05AE 089C 0300 0315 0062; # (a◌࢜◌̕◌̀◌֮b; a◌֮◌࢜◌̀◌̕b; a◌֮◌࢜◌̀◌̕b; a◌֮◌࢜◌̀◌̕b; a◌֮◌࢜◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC MADDA WAAJIB, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 089D 0062;00E0 05AE 089D 0315 0062;0061 05AE 0300 089D 0315 0062;00E0 05AE 089D 0315 0062;0061 05AE 0300 089D 0315 0062; # (a◌̕◌̀◌֮◌࢝b; à◌֮◌࢝◌̕b; a◌֮◌̀◌࢝◌̕b; à◌֮◌࢝◌̕b; a◌֮◌̀◌࢝◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SUPERSCRIPT ALEF MOKHASSAS, LATIN SMALL LETTER B +0061 089D 0315 0300 05AE 0062;0061 05AE 089D 0300 0315 0062;0061 05AE 089D 0300 0315 0062;0061 05AE 089D 0300 0315 0062;0061 05AE 089D 0300 0315 0062; # (a◌࢝◌̕◌̀◌֮b; a◌֮◌࢝◌̀◌̕b; a◌֮◌࢝◌̀◌̕b; a◌֮◌࢝◌̀◌̕b; a◌֮◌࢝◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SUPERSCRIPT ALEF MOKHASSAS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 089E 0062;00E0 05AE 089E 0315 0062;0061 05AE 0300 089E 0315 0062;00E0 05AE 089E 0315 0062;0061 05AE 0300 089E 0315 0062; # (a◌̕◌̀◌֮◌࢞b; à◌֮◌࢞◌̕b; a◌֮◌̀◌࢞◌̕b; à◌֮◌࢞◌̕b; a◌֮◌̀◌࢞◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC DOUBLED MADDA, LATIN SMALL LETTER B +0061 089E 0315 0300 05AE 0062;0061 05AE 089E 0300 0315 0062;0061 05AE 089E 0300 0315 0062;0061 05AE 089E 0300 0315 0062;0061 05AE 089E 0300 0315 0062; # (a◌࢞◌̕◌̀◌֮b; a◌֮◌࢞◌̀◌̕b; a◌֮◌࢞◌̀◌̕b; a◌֮◌࢞◌̀◌̕b; a◌֮◌࢞◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC DOUBLED MADDA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 089F 0062;00E0 05AE 089F 0315 0062;0061 05AE 0300 089F 0315 0062;00E0 05AE 089F 0315 0062;0061 05AE 0300 089F 0315 0062; # (a◌̕◌̀◌֮◌࢟b; à◌֮◌࢟◌̕b; a◌֮◌̀◌࢟◌̕b; à◌֮◌࢟◌̕b; a◌֮◌̀◌࢟◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC HALF MADDA OVER MADDA, LATIN SMALL LETTER B +0061 089F 0315 0300 05AE 0062;0061 05AE 089F 0300 0315 0062;0061 05AE 089F 0300 0315 0062;0061 05AE 089F 0300 0315 0062;0061 05AE 089F 0300 0315 0062; # (a◌࢟◌̕◌̀◌֮b; a◌֮◌࢟◌̀◌̕b; a◌֮◌࢟◌̀◌̕b; a◌֮◌࢟◌̀◌̕b; a◌֮◌࢟◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC HALF MADDA OVER MADDA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08CA 0062;00E0 05AE 08CA 0315 0062;0061 05AE 0300 08CA 0315 0062;00E0 05AE 08CA 0315 0062;0061 05AE 0300 08CA 0315 0062; # (a◌̕◌̀◌֮◌࣊b; à◌֮◌࣊◌̕b; a◌֮◌̀◌࣊◌̕b; à◌֮◌࣊◌̕b; a◌֮◌̀◌࣊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH FARSI YEH, LATIN SMALL LETTER B +0061 08CA 0315 0300 05AE 0062;0061 05AE 08CA 0300 0315 0062;0061 05AE 08CA 0300 0315 0062;0061 05AE 08CA 0300 0315 0062;0061 05AE 08CA 0300 0315 0062; # (a◌࣊◌̕◌̀◌֮b; a◌֮◌࣊◌̀◌̕b; a◌֮◌࣊◌̀◌̕b; a◌֮◌࣊◌̀◌̕b; a◌֮◌࣊◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH FARSI YEH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08CB 0062;00E0 05AE 08CB 0315 0062;0061 05AE 0300 08CB 0315 0062;00E0 05AE 08CB 0315 0062;0061 05AE 0300 08CB 0315 0062; # (a◌̕◌̀◌֮◌࣋b; à◌֮◌࣋◌̕b; a◌֮◌̀◌࣋◌̕b; à◌֮◌࣋◌̕b; a◌֮◌̀◌࣋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW, LATIN SMALL LETTER B +0061 08CB 0315 0300 05AE 0062;0061 05AE 08CB 0300 0315 0062;0061 05AE 08CB 0300 0315 0062;0061 05AE 08CB 0300 0315 0062;0061 05AE 08CB 0300 0315 0062; # (a◌࣋◌̕◌̀◌֮b; a◌֮◌࣋◌̀◌̕b; a◌֮◌࣋◌̀◌̕b; a◌֮◌࣋◌̀◌̕b; a◌֮◌࣋◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08CC 0062;00E0 05AE 08CC 0315 0062;0061 05AE 0300 08CC 0315 0062;00E0 05AE 08CC 0315 0062;0061 05AE 0300 08CC 0315 0062; # (a◌̕◌̀◌֮◌࣌b; à◌֮◌࣌◌̕b; a◌֮◌̀◌࣌◌̕b; à◌֮◌࣌◌̕b; a◌֮◌̀◌࣌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD SAH, LATIN SMALL LETTER B +0061 08CC 0315 0300 05AE 0062;0061 05AE 08CC 0300 0315 0062;0061 05AE 08CC 0300 0315 0062;0061 05AE 08CC 0300 0315 0062;0061 05AE 08CC 0300 0315 0062; # (a◌࣌◌̕◌̀◌֮b; a◌֮◌࣌◌̀◌̕b; a◌֮◌࣌◌̀◌̕b; a◌֮◌࣌◌̀◌̕b; a◌֮◌࣌◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD SAH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08CD 0062;00E0 05AE 08CD 0315 0062;0061 05AE 0300 08CD 0315 0062;00E0 05AE 08CD 0315 0062;0061 05AE 0300 08CD 0315 0062; # (a◌̕◌̀◌֮◌࣍b; à◌֮◌࣍◌̕b; a◌֮◌̀◌࣍◌̕b; à◌֮◌࣍◌̕b; a◌֮◌̀◌࣍◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH ZAH, LATIN SMALL LETTER B +0061 08CD 0315 0300 05AE 0062;0061 05AE 08CD 0300 0315 0062;0061 05AE 08CD 0300 0315 0062;0061 05AE 08CD 0300 0315 0062;0061 05AE 08CD 0300 0315 0062; # (a◌࣍◌̕◌̀◌֮b; a◌֮◌࣍◌̀◌̕b; a◌֮◌࣍◌̀◌̕b; a◌֮◌࣍◌̀◌̕b; a◌֮◌࣍◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH ZAH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08CE 0062;00E0 05AE 08CE 0315 0062;0061 05AE 0300 08CE 0315 0062;00E0 05AE 08CE 0315 0062;0061 05AE 0300 08CE 0315 0062; # (a◌̕◌̀◌֮◌࣎b; à◌֮◌࣎◌̕b; a◌֮◌̀◌࣎◌̕b; à◌֮◌࣎◌̕b; a◌֮◌̀◌࣎◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC LARGE ROUND DOT ABOVE, LATIN SMALL LETTER B +0061 08CE 0315 0300 05AE 0062;0061 05AE 08CE 0300 0315 0062;0061 05AE 08CE 0300 0315 0062;0061 05AE 08CE 0300 0315 0062;0061 05AE 08CE 0300 0315 0062; # (a◌࣎◌̕◌̀◌֮b; a◌֮◌࣎◌̀◌̕b; a◌֮◌࣎◌̀◌̕b; a◌֮◌࣎◌̀◌̕b; a◌֮◌࣎◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC LARGE ROUND DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08CF 0062;0061 1DFA 0316 08CF 059A 0062;0061 1DFA 0316 08CF 059A 0062;0061 1DFA 0316 08CF 059A 0062;0061 1DFA 0316 08CF 059A 0062; # (a◌֚◌̖◌᷺◌࣏b; a◌᷺◌̖◌࣏◌֚b; a◌᷺◌̖◌࣏◌֚b; a◌᷺◌̖◌࣏◌֚b; a◌᷺◌̖◌࣏◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC LARGE ROUND DOT BELOW, LATIN SMALL LETTER B +0061 08CF 059A 0316 1DFA 0062;0061 1DFA 08CF 0316 059A 0062;0061 1DFA 08CF 0316 059A 0062;0061 1DFA 08CF 0316 059A 0062;0061 1DFA 08CF 0316 059A 0062; # (a◌࣏◌֚◌̖◌᷺b; a◌᷺◌࣏◌̖◌֚b; a◌᷺◌࣏◌̖◌֚b; a◌᷺◌࣏◌̖◌֚b; a◌᷺◌࣏◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC LARGE ROUND DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08D0 0062;0061 1DFA 0316 08D0 059A 0062;0061 1DFA 0316 08D0 059A 0062;0061 1DFA 0316 08D0 059A 0062;0061 1DFA 0316 08D0 059A 0062; # (a◌֚◌̖◌᷺◌࣐b; a◌᷺◌̖◌࣐◌֚b; a◌᷺◌̖◌࣐◌֚b; a◌᷺◌̖◌࣐◌֚b; a◌᷺◌̖◌࣐◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SUKUN BELOW, LATIN SMALL LETTER B +0061 08D0 059A 0316 1DFA 0062;0061 1DFA 08D0 0316 059A 0062;0061 1DFA 08D0 0316 059A 0062;0061 1DFA 08D0 0316 059A 0062;0061 1DFA 08D0 0316 059A 0062; # (a◌࣐◌֚◌̖◌᷺b; a◌᷺◌࣐◌̖◌֚b; a◌᷺◌࣐◌̖◌֚b; a◌᷺◌࣐◌̖◌֚b; a◌᷺◌࣐◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SUKUN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08D1 0062;0061 1DFA 0316 08D1 059A 0062;0061 1DFA 0316 08D1 059A 0062;0061 1DFA 0316 08D1 059A 0062;0061 1DFA 0316 08D1 059A 0062; # (a◌֚◌̖◌᷺◌࣑b; a◌᷺◌̖◌࣑◌֚b; a◌᷺◌̖◌࣑◌֚b; a◌᷺◌̖◌࣑◌֚b; a◌᷺◌̖◌࣑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC LARGE CIRCLE BELOW, LATIN SMALL LETTER B +0061 08D1 059A 0316 1DFA 0062;0061 1DFA 08D1 0316 059A 0062;0061 1DFA 08D1 0316 059A 0062;0061 1DFA 08D1 0316 059A 0062;0061 1DFA 08D1 0316 059A 0062; # (a◌࣑◌֚◌̖◌᷺b; a◌᷺◌࣑◌̖◌֚b; a◌᷺◌࣑◌̖◌֚b; a◌᷺◌࣑◌̖◌֚b; a◌᷺◌࣑◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC LARGE CIRCLE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08D2 0062;0061 1DFA 0316 08D2 059A 0062;0061 1DFA 0316 08D2 059A 0062;0061 1DFA 0316 08D2 059A 0062;0061 1DFA 0316 08D2 059A 0062; # (a◌֚◌̖◌᷺◌࣒b; a◌᷺◌̖◌࣒◌֚b; a◌᷺◌̖◌࣒◌֚b; a◌᷺◌̖◌࣒◌֚b; a◌᷺◌̖◌࣒◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW, LATIN SMALL LETTER B +0061 08D2 059A 0316 1DFA 0062;0061 1DFA 08D2 0316 059A 0062;0061 1DFA 08D2 0316 059A 0062;0061 1DFA 08D2 0316 059A 0062;0061 1DFA 08D2 0316 059A 0062; # (a◌࣒◌֚◌̖◌᷺b; a◌᷺◌࣒◌̖◌֚b; a◌᷺◌࣒◌̖◌֚b; a◌᷺◌࣒◌̖◌֚b; a◌᷺◌࣒◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08D3 0062;0061 1DFA 0316 08D3 059A 0062;0061 1DFA 0316 08D3 059A 0062;0061 1DFA 0316 08D3 059A 0062;0061 1DFA 0316 08D3 059A 0062; # (a◌֚◌̖◌᷺◌࣓b; a◌᷺◌̖◌࣓◌֚b; a◌᷺◌̖◌࣓◌֚b; a◌᷺◌̖◌࣓◌֚b; a◌᷺◌̖◌࣓◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WAW, LATIN SMALL LETTER B +0061 08D3 059A 0316 1DFA 0062;0061 1DFA 08D3 0316 059A 0062;0061 1DFA 08D3 0316 059A 0062;0061 1DFA 08D3 0316 059A 0062;0061 1DFA 08D3 0316 059A 0062; # (a◌࣓◌֚◌̖◌᷺b; a◌᷺◌࣓◌̖◌֚b; a◌᷺◌࣓◌̖◌֚b; a◌᷺◌࣓◌̖◌֚b; a◌᷺◌࣓◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WAW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D4 0062;00E0 05AE 08D4 0315 0062;0061 05AE 0300 08D4 0315 0062;00E0 05AE 08D4 0315 0062;0061 05AE 0300 08D4 0315 0062; # (a◌̕◌̀◌֮◌ࣔb; à◌֮◌ࣔ◌̕b; a◌֮◌̀◌ࣔ◌̕b; à◌֮◌ࣔ◌̕b; a◌֮◌̀◌ࣔ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD AR-RUB, LATIN SMALL LETTER B +0061 08D4 0315 0300 05AE 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062; # (a◌ࣔ◌̕◌̀◌֮b; a◌֮◌ࣔ◌̀◌̕b; a◌֮◌ࣔ◌̀◌̕b; a◌֮◌ࣔ◌̀◌̕b; a◌֮◌ࣔ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD AR-RUB, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D5 0062;00E0 05AE 08D5 0315 0062;0061 05AE 0300 08D5 0315 0062;00E0 05AE 08D5 0315 0062;0061 05AE 0300 08D5 0315 0062; # (a◌̕◌̀◌֮◌ࣕb; à◌֮◌ࣕ◌̕b; a◌֮◌̀◌ࣕ◌̕b; à◌֮◌ࣕ◌̕b; a◌֮◌̀◌ࣕ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH SAD, LATIN SMALL LETTER B +0061 08D5 0315 0300 05AE 0062;0061 05AE 08D5 0300 0315 0062;0061 05AE 08D5 0300 0315 0062;0061 05AE 08D5 0300 0315 0062;0061 05AE 08D5 0300 0315 0062; # (a◌ࣕ◌̕◌̀◌֮b; a◌֮◌ࣕ◌̀◌̕b; a◌֮◌ࣕ◌̀◌̕b; a◌֮◌ࣕ◌̀◌̕b; a◌֮◌ࣕ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH SAD, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D6 0062;00E0 05AE 08D6 0315 0062;0061 05AE 0300 08D6 0315 0062;00E0 05AE 08D6 0315 0062;0061 05AE 0300 08D6 0315 0062; # (a◌̕◌̀◌֮◌ࣖb; à◌֮◌ࣖ◌̕b; a◌֮◌̀◌ࣖ◌̕b; à◌֮◌ࣖ◌̕b; a◌֮◌̀◌ࣖ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH AIN, LATIN SMALL LETTER B +0061 08D6 0315 0300 05AE 0062;0061 05AE 08D6 0300 0315 0062;0061 05AE 08D6 0300 0315 0062;0061 05AE 08D6 0300 0315 0062;0061 05AE 08D6 0300 0315 0062; # (a◌ࣖ◌̕◌̀◌֮b; a◌֮◌ࣖ◌̀◌̕b; a◌֮◌ࣖ◌̀◌̕b; a◌֮◌ࣖ◌̀◌̕b; a◌֮◌ࣖ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH AIN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D7 0062;00E0 05AE 08D7 0315 0062;0061 05AE 0300 08D7 0315 0062;00E0 05AE 08D7 0315 0062;0061 05AE 0300 08D7 0315 0062; # (a◌̕◌̀◌֮◌ࣗb; à◌֮◌ࣗ◌̕b; a◌֮◌̀◌ࣗ◌̕b; à◌֮◌ࣗ◌̕b; a◌֮◌̀◌ࣗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH QAF, LATIN SMALL LETTER B +0061 08D7 0315 0300 05AE 0062;0061 05AE 08D7 0300 0315 0062;0061 05AE 08D7 0300 0315 0062;0061 05AE 08D7 0300 0315 0062;0061 05AE 08D7 0300 0315 0062; # (a◌ࣗ◌̕◌̀◌֮b; a◌֮◌ࣗ◌̀◌̕b; a◌֮◌ࣗ◌̀◌̕b; a◌֮◌ࣗ◌̀◌̕b; a◌֮◌ࣗ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH QAF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D8 0062;00E0 05AE 08D8 0315 0062;0061 05AE 0300 08D8 0315 0062;00E0 05AE 08D8 0315 0062;0061 05AE 0300 08D8 0315 0062; # (a◌̕◌̀◌֮◌ࣘb; à◌֮◌ࣘ◌̕b; a◌֮◌̀◌ࣘ◌̕b; à◌֮◌ࣘ◌̕b; a◌֮◌̀◌ࣘ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH NOON WITH KASRA, LATIN SMALL LETTER B +0061 08D8 0315 0300 05AE 0062;0061 05AE 08D8 0300 0315 0062;0061 05AE 08D8 0300 0315 0062;0061 05AE 08D8 0300 0315 0062;0061 05AE 08D8 0300 0315 0062; # (a◌ࣘ◌̕◌̀◌֮b; a◌֮◌ࣘ◌̀◌̕b; a◌֮◌ࣘ◌̀◌̕b; a◌֮◌ࣘ◌̀◌̕b; a◌֮◌ࣘ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH NOON WITH KASRA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08D9 0062;00E0 05AE 08D9 0315 0062;0061 05AE 0300 08D9 0315 0062;00E0 05AE 08D9 0315 0062;0061 05AE 0300 08D9 0315 0062; # (a◌̕◌̀◌֮◌ࣙb; à◌֮◌ࣙ◌̕b; a◌֮◌̀◌ࣙ◌̕b; à◌֮◌ࣙ◌̕b; a◌֮◌̀◌ࣙ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL LOW NOON WITH KASRA, LATIN SMALL LETTER B +0061 08D9 0315 0300 05AE 0062;0061 05AE 08D9 0300 0315 0062;0061 05AE 08D9 0300 0315 0062;0061 05AE 08D9 0300 0315 0062;0061 05AE 08D9 0300 0315 0062; # (a◌ࣙ◌̕◌̀◌֮b; a◌֮◌ࣙ◌̀◌̕b; a◌֮◌ࣙ◌̀◌̕b; a◌֮◌ࣙ◌̀◌̕b; a◌֮◌ࣙ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW NOON WITH KASRA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DA 0062;00E0 05AE 08DA 0315 0062;0061 05AE 0300 08DA 0315 0062;00E0 05AE 08DA 0315 0062;0061 05AE 0300 08DA 0315 0062; # (a◌̕◌̀◌֮◌ࣚb; à◌֮◌ࣚ◌̕b; a◌֮◌̀◌ࣚ◌̕b; à◌֮◌ࣚ◌̕b; a◌֮◌̀◌ࣚ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD ATH-THALATHA, LATIN SMALL LETTER B +0061 08DA 0315 0300 05AE 0062;0061 05AE 08DA 0300 0315 0062;0061 05AE 08DA 0300 0315 0062;0061 05AE 08DA 0300 0315 0062;0061 05AE 08DA 0300 0315 0062; # (a◌ࣚ◌̕◌̀◌֮b; a◌֮◌ࣚ◌̀◌̕b; a◌֮◌ࣚ◌̀◌̕b; a◌֮◌ࣚ◌̀◌̕b; a◌֮◌ࣚ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD ATH-THALATHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DB 0062;00E0 05AE 08DB 0315 0062;0061 05AE 0300 08DB 0315 0062;00E0 05AE 08DB 0315 0062;0061 05AE 0300 08DB 0315 0062; # (a◌̕◌̀◌֮◌ࣛb; à◌֮◌ࣛ◌̕b; a◌֮◌̀◌ࣛ◌̕b; à◌֮◌ࣛ◌̕b; a◌֮◌̀◌ࣛ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD AS-SAJDA, LATIN SMALL LETTER B +0061 08DB 0315 0300 05AE 0062;0061 05AE 08DB 0300 0315 0062;0061 05AE 08DB 0300 0315 0062;0061 05AE 08DB 0300 0315 0062;0061 05AE 08DB 0300 0315 0062; # (a◌ࣛ◌̕◌̀◌֮b; a◌֮◌ࣛ◌̀◌̕b; a◌֮◌ࣛ◌̀◌̕b; a◌֮◌ࣛ◌̀◌̕b; a◌֮◌ࣛ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD AS-SAJDA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DC 0062;00E0 05AE 08DC 0315 0062;0061 05AE 0300 08DC 0315 0062;00E0 05AE 08DC 0315 0062;0061 05AE 0300 08DC 0315 0062; # (a◌̕◌̀◌֮◌ࣜb; à◌֮◌ࣜ◌̕b; a◌֮◌̀◌ࣜ◌̕b; à◌֮◌ࣜ◌̕b; a◌֮◌̀◌ࣜ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD AN-NISF, LATIN SMALL LETTER B +0061 08DC 0315 0300 05AE 0062;0061 05AE 08DC 0300 0315 0062;0061 05AE 08DC 0300 0315 0062;0061 05AE 08DC 0300 0315 0062;0061 05AE 08DC 0300 0315 0062; # (a◌ࣜ◌̕◌̀◌֮b; a◌֮◌ࣜ◌̀◌̕b; a◌֮◌ࣜ◌̀◌̕b; a◌֮◌ࣜ◌̀◌̕b; a◌֮◌ࣜ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD AN-NISF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DD 0062;00E0 05AE 08DD 0315 0062;0061 05AE 0300 08DD 0315 0062;00E0 05AE 08DD 0315 0062;0061 05AE 0300 08DD 0315 0062; # (a◌̕◌̀◌֮◌ࣝb; à◌֮◌ࣝ◌̕b; a◌֮◌̀◌ࣝ◌̕b; à◌֮◌ࣝ◌̕b; a◌֮◌̀◌ࣝ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD SAKTA, LATIN SMALL LETTER B +0061 08DD 0315 0300 05AE 0062;0061 05AE 08DD 0300 0315 0062;0061 05AE 08DD 0300 0315 0062;0061 05AE 08DD 0300 0315 0062;0061 05AE 08DD 0300 0315 0062; # (a◌ࣝ◌̕◌̀◌֮b; a◌֮◌ࣝ◌̀◌̕b; a◌֮◌ࣝ◌̀◌̕b; a◌֮◌ࣝ◌̀◌̕b; a◌֮◌ࣝ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD SAKTA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DE 0062;00E0 05AE 08DE 0315 0062;0061 05AE 0300 08DE 0315 0062;00E0 05AE 08DE 0315 0062;0061 05AE 0300 08DE 0315 0062; # (a◌̕◌̀◌֮◌ࣞb; à◌֮◌ࣞ◌̕b; a◌֮◌̀◌ࣞ◌̕b; à◌֮◌ࣞ◌̕b; a◌֮◌̀◌ࣞ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD QIF, LATIN SMALL LETTER B +0061 08DE 0315 0300 05AE 0062;0061 05AE 08DE 0300 0315 0062;0061 05AE 08DE 0300 0315 0062;0061 05AE 08DE 0300 0315 0062;0061 05AE 08DE 0300 0315 0062; # (a◌ࣞ◌̕◌̀◌֮b; a◌֮◌ࣞ◌̀◌̕b; a◌֮◌ࣞ◌̀◌̕b; a◌֮◌ࣞ◌̀◌̕b; a◌֮◌ࣞ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD QIF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08DF 0062;00E0 05AE 08DF 0315 0062;0061 05AE 0300 08DF 0315 0062;00E0 05AE 08DF 0315 0062;0061 05AE 0300 08DF 0315 0062; # (a◌̕◌̀◌֮◌ࣟb; à◌֮◌ࣟ◌̕b; a◌֮◌̀◌ࣟ◌̕b; à◌֮◌ࣟ◌̕b; a◌֮◌̀◌ࣟ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD WAQFA, LATIN SMALL LETTER B +0061 08DF 0315 0300 05AE 0062;0061 05AE 08DF 0300 0315 0062;0061 05AE 08DF 0300 0315 0062;0061 05AE 08DF 0300 0315 0062;0061 05AE 08DF 0300 0315 0062; # (a◌ࣟ◌̕◌̀◌֮b; a◌֮◌ࣟ◌̀◌̕b; a◌֮◌ࣟ◌̀◌̕b; a◌֮◌ࣟ◌̀◌̕b; a◌֮◌ࣟ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD WAQFA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08E0 0062;00E0 05AE 08E0 0315 0062;0061 05AE 0300 08E0 0315 0062;00E0 05AE 08E0 0315 0062;0061 05AE 0300 08E0 0315 0062; # (a◌̕◌̀◌֮◌࣠b; à◌֮◌࣠◌̕b; a◌֮◌̀◌࣠◌̕b; à◌֮◌࣠◌̕b; a◌֮◌̀◌࣠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH FOOTNOTE MARKER, LATIN SMALL LETTER B +0061 08E0 0315 0300 05AE 0062;0061 05AE 08E0 0300 0315 0062;0061 05AE 08E0 0300 0315 0062;0061 05AE 08E0 0300 0315 0062;0061 05AE 08E0 0300 0315 0062; # (a◌࣠◌̕◌̀◌֮b; a◌֮◌࣠◌̀◌̕b; a◌֮◌࣠◌̀◌̕b; a◌֮◌࣠◌̀◌̕b; a◌֮◌࣠◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH FOOTNOTE MARKER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08E1 0062;00E0 05AE 08E1 0315 0062;0061 05AE 0300 08E1 0315 0062;00E0 05AE 08E1 0315 0062;0061 05AE 0300 08E1 0315 0062; # (a◌̕◌̀◌֮◌࣡b; à◌֮◌࣡◌̕b; a◌֮◌̀◌࣡◌̕b; à◌֮◌࣡◌̕b; a◌֮◌̀◌࣡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH SIGN SAFHA, LATIN SMALL LETTER B +0061 08E1 0315 0300 05AE 0062;0061 05AE 08E1 0300 0315 0062;0061 05AE 08E1 0300 0315 0062;0061 05AE 08E1 0300 0315 0062;0061 05AE 08E1 0300 0315 0062; # (a◌࣡◌̕◌̀◌֮b; a◌֮◌࣡◌̀◌̕b; a◌֮◌࣡◌̀◌̕b; a◌֮◌࣡◌̀◌̕b; a◌֮◌࣡◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH SIGN SAFHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08E3 0062;0061 1DFA 0316 08E3 059A 0062;0061 1DFA 0316 08E3 059A 0062;0061 1DFA 0316 08E3 059A 0062;0061 1DFA 0316 08E3 059A 0062; # (a◌֚◌̖◌᷺◌ࣣb; a◌᷺◌̖◌ࣣ◌֚b; a◌᷺◌̖◌ࣣ◌֚b; a◌᷺◌̖◌ࣣ◌֚b; a◌᷺◌̖◌ࣣ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC TURNED DAMMA BELOW, LATIN SMALL LETTER B +0061 08E3 059A 0316 1DFA 0062;0061 1DFA 08E3 0316 059A 0062;0061 1DFA 08E3 0316 059A 0062;0061 1DFA 08E3 0316 059A 0062;0061 1DFA 08E3 0316 059A 0062; # (a◌ࣣ◌֚◌̖◌᷺b; a◌᷺◌ࣣ◌̖◌֚b; a◌᷺◌ࣣ◌̖◌֚b; a◌᷺◌ࣣ◌̖◌֚b; a◌᷺◌ࣣ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TURNED DAMMA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 08E4 0062;00E0 05AE 08E4 0315 0062;0061 05AE 0300 08E4 0315 0062;00E0 05AE 08E4 0315 0062;0061 05AE 0300 08E4 0315 0062; # (a◌̕◌̀◌֮◌ࣤb; à◌֮◌ࣤ◌̕b; a◌֮◌̀◌ࣤ◌̕b; à◌֮◌ࣤ◌̕b; a◌֮◌̀◌ࣤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY FATHA, LATIN SMALL LETTER B +0061 08E4 0315 0300 05AE 0062;0061 05AE 08E4 0300 0315 0062;0061 05AE 08E4 0300 0315 0062;0061 05AE 08E4 0300 0315 0062;0061 05AE 08E4 0300 0315 0062; # (a◌ࣤ◌̕◌̀◌֮b; a◌֮◌ࣤ◌̀◌̕b; a◌֮◌ࣤ◌̀◌̕b; a◌֮◌ࣤ◌̀◌̕b; a◌֮◌ࣤ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC CURLY FATHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08E5 0062;00E0 05AE 08E5 0315 0062;0061 05AE 0300 08E5 0315 0062;00E0 05AE 08E5 0315 0062;0061 05AE 0300 08E5 0315 0062; # (a◌̕◌̀◌֮◌ࣥb; à◌֮◌ࣥ◌̕b; a◌֮◌̀◌ࣥ◌̕b; à◌֮◌ࣥ◌̕b; a◌֮◌̀◌ࣥ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY DAMMA, LATIN SMALL LETTER B +0061 08E5 0315 0300 05AE 0062;0061 05AE 08E5 0300 0315 0062;0061 05AE 08E5 0300 0315 0062;0061 05AE 08E5 0300 0315 0062;0061 05AE 08E5 0300 0315 0062; # (a◌ࣥ◌̕◌̀◌֮b; a◌֮◌ࣥ◌̀◌̕b; a◌֮◌ࣥ◌̀◌̕b; a◌֮◌ࣥ◌̀◌̕b; a◌֮◌ࣥ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC CURLY DAMMA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08E6 0062;0061 1DFA 0316 08E6 059A 0062;0061 1DFA 0316 08E6 059A 0062;0061 1DFA 0316 08E6 059A 0062;0061 1DFA 0316 08E6 059A 0062; # (a◌֚◌̖◌᷺◌ࣦb; a◌᷺◌̖◌ࣦ◌֚b; a◌᷺◌̖◌ࣦ◌֚b; a◌᷺◌̖◌ࣦ◌֚b; a◌᷺◌̖◌ࣦ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC CURLY KASRA, LATIN SMALL LETTER B +0061 08E6 059A 0316 1DFA 0062;0061 1DFA 08E6 0316 059A 0062;0061 1DFA 08E6 0316 059A 0062;0061 1DFA 08E6 0316 059A 0062;0061 1DFA 08E6 0316 059A 0062; # (a◌ࣦ◌֚◌̖◌᷺b; a◌᷺◌ࣦ◌̖◌֚b; a◌᷺◌ࣦ◌̖◌֚b; a◌᷺◌ࣦ◌̖◌֚b; a◌᷺◌ࣦ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC CURLY KASRA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 08E7 0062;00E0 05AE 08E7 0315 0062;0061 05AE 0300 08E7 0315 0062;00E0 05AE 08E7 0315 0062;0061 05AE 0300 08E7 0315 0062; # (a◌̕◌̀◌֮◌ࣧb; à◌֮◌ࣧ◌̕b; a◌֮◌̀◌ࣧ◌̕b; à◌֮◌ࣧ◌̕b; a◌֮◌̀◌ࣧ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY FATHATAN, LATIN SMALL LETTER B +0061 08E7 0315 0300 05AE 0062;0061 05AE 08E7 0300 0315 0062;0061 05AE 08E7 0300 0315 0062;0061 05AE 08E7 0300 0315 0062;0061 05AE 08E7 0300 0315 0062; # (a◌ࣧ◌̕◌̀◌֮b; a◌֮◌ࣧ◌̀◌̕b; a◌֮◌ࣧ◌̀◌̕b; a◌֮◌ࣧ◌̀◌̕b; a◌֮◌ࣧ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC CURLY FATHATAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08E8 0062;00E0 05AE 08E8 0315 0062;0061 05AE 0300 08E8 0315 0062;00E0 05AE 08E8 0315 0062;0061 05AE 0300 08E8 0315 0062; # (a◌̕◌̀◌֮◌ࣨb; à◌֮◌ࣨ◌̕b; a◌֮◌̀◌ࣨ◌̕b; à◌֮◌ࣨ◌̕b; a◌֮◌̀◌ࣨ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY DAMMATAN, LATIN SMALL LETTER B +0061 08E8 0315 0300 05AE 0062;0061 05AE 08E8 0300 0315 0062;0061 05AE 08E8 0300 0315 0062;0061 05AE 08E8 0300 0315 0062;0061 05AE 08E8 0300 0315 0062; # (a◌ࣨ◌̕◌̀◌֮b; a◌֮◌ࣨ◌̀◌̕b; a◌֮◌ࣨ◌̀◌̕b; a◌֮◌ࣨ◌̀◌̕b; a◌֮◌ࣨ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC CURLY DAMMATAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08E9 0062;0061 1DFA 0316 08E9 059A 0062;0061 1DFA 0316 08E9 059A 0062;0061 1DFA 0316 08E9 059A 0062;0061 1DFA 0316 08E9 059A 0062; # (a◌֚◌̖◌᷺◌ࣩb; a◌᷺◌̖◌ࣩ◌֚b; a◌᷺◌̖◌ࣩ◌֚b; a◌᷺◌̖◌ࣩ◌֚b; a◌᷺◌̖◌ࣩ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC CURLY KASRATAN, LATIN SMALL LETTER B +0061 08E9 059A 0316 1DFA 0062;0061 1DFA 08E9 0316 059A 0062;0061 1DFA 08E9 0316 059A 0062;0061 1DFA 08E9 0316 059A 0062;0061 1DFA 08E9 0316 059A 0062; # (a◌ࣩ◌֚◌̖◌᷺b; a◌᷺◌ࣩ◌̖◌֚b; a◌᷺◌ࣩ◌̖◌֚b; a◌᷺◌ࣩ◌̖◌֚b; a◌᷺◌ࣩ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC CURLY KASRATAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 08EA 0062;00E0 05AE 08EA 0315 0062;0061 05AE 0300 08EA 0315 0062;00E0 05AE 08EA 0315 0062;0061 05AE 0300 08EA 0315 0062; # (a◌̕◌̀◌֮◌࣪b; à◌֮◌࣪◌̕b; a◌֮◌̀◌࣪◌̕b; à◌֮◌࣪◌̕b; a◌֮◌̀◌࣪◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC TONE ONE DOT ABOVE, LATIN SMALL LETTER B +0061 08EA 0315 0300 05AE 0062;0061 05AE 08EA 0300 0315 0062;0061 05AE 08EA 0300 0315 0062;0061 05AE 08EA 0300 0315 0062;0061 05AE 08EA 0300 0315 0062; # (a◌࣪◌̕◌̀◌֮b; a◌֮◌࣪◌̀◌̕b; a◌֮◌࣪◌̀◌̕b; a◌֮◌࣪◌̀◌̕b; a◌֮◌࣪◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC TONE ONE DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08EB 0062;00E0 05AE 08EB 0315 0062;0061 05AE 0300 08EB 0315 0062;00E0 05AE 08EB 0315 0062;0061 05AE 0300 08EB 0315 0062; # (a◌̕◌̀◌֮◌࣫b; à◌֮◌࣫◌̕b; a◌֮◌̀◌࣫◌̕b; à◌֮◌࣫◌̕b; a◌֮◌̀◌࣫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC TONE TWO DOTS ABOVE, LATIN SMALL LETTER B +0061 08EB 0315 0300 05AE 0062;0061 05AE 08EB 0300 0315 0062;0061 05AE 08EB 0300 0315 0062;0061 05AE 08EB 0300 0315 0062;0061 05AE 08EB 0300 0315 0062; # (a◌࣫◌̕◌̀◌֮b; a◌֮◌࣫◌̀◌̕b; a◌֮◌࣫◌̀◌̕b; a◌֮◌࣫◌̀◌̕b; a◌֮◌࣫◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC TONE TWO DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08EC 0062;00E0 05AE 08EC 0315 0062;0061 05AE 0300 08EC 0315 0062;00E0 05AE 08EC 0315 0062;0061 05AE 0300 08EC 0315 0062; # (a◌̕◌̀◌֮◌࣬b; à◌֮◌࣬◌̕b; a◌֮◌̀◌࣬◌̕b; à◌֮◌࣬◌̕b; a◌֮◌̀◌࣬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC TONE LOOP ABOVE, LATIN SMALL LETTER B +0061 08EC 0315 0300 05AE 0062;0061 05AE 08EC 0300 0315 0062;0061 05AE 08EC 0300 0315 0062;0061 05AE 08EC 0300 0315 0062;0061 05AE 08EC 0300 0315 0062; # (a◌࣬◌̕◌̀◌֮b; a◌֮◌࣬◌̀◌̕b; a◌֮◌࣬◌̀◌̕b; a◌֮◌࣬◌̀◌̕b; a◌֮◌࣬◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC TONE LOOP ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08ED 0062;0061 1DFA 0316 08ED 059A 0062;0061 1DFA 0316 08ED 059A 0062;0061 1DFA 0316 08ED 059A 0062;0061 1DFA 0316 08ED 059A 0062; # (a◌֚◌̖◌᷺◌࣭b; a◌᷺◌̖◌࣭◌֚b; a◌᷺◌̖◌࣭◌֚b; a◌᷺◌̖◌࣭◌֚b; a◌᷺◌̖◌࣭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC TONE ONE DOT BELOW, LATIN SMALL LETTER B +0061 08ED 059A 0316 1DFA 0062;0061 1DFA 08ED 0316 059A 0062;0061 1DFA 08ED 0316 059A 0062;0061 1DFA 08ED 0316 059A 0062;0061 1DFA 08ED 0316 059A 0062; # (a◌࣭◌֚◌̖◌᷺b; a◌᷺◌࣭◌̖◌֚b; a◌᷺◌࣭◌̖◌֚b; a◌᷺◌࣭◌̖◌֚b; a◌᷺◌࣭◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TONE ONE DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08EE 0062;0061 1DFA 0316 08EE 059A 0062;0061 1DFA 0316 08EE 059A 0062;0061 1DFA 0316 08EE 059A 0062;0061 1DFA 0316 08EE 059A 0062; # (a◌֚◌̖◌᷺◌࣮b; a◌᷺◌̖◌࣮◌֚b; a◌᷺◌̖◌࣮◌֚b; a◌᷺◌̖◌࣮◌֚b; a◌᷺◌̖◌࣮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC TONE TWO DOTS BELOW, LATIN SMALL LETTER B +0061 08EE 059A 0316 1DFA 0062;0061 1DFA 08EE 0316 059A 0062;0061 1DFA 08EE 0316 059A 0062;0061 1DFA 08EE 0316 059A 0062;0061 1DFA 08EE 0316 059A 0062; # (a◌࣮◌֚◌̖◌᷺b; a◌᷺◌࣮◌̖◌֚b; a◌᷺◌࣮◌̖◌֚b; a◌᷺◌࣮◌̖◌֚b; a◌᷺◌࣮◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TONE TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08EF 0062;0061 1DFA 0316 08EF 059A 0062;0061 1DFA 0316 08EF 059A 0062;0061 1DFA 0316 08EF 059A 0062;0061 1DFA 0316 08EF 059A 0062; # (a◌֚◌̖◌᷺◌࣯b; a◌᷺◌̖◌࣯◌֚b; a◌᷺◌̖◌࣯◌֚b; a◌᷺◌̖◌࣯◌֚b; a◌᷺◌̖◌࣯◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC TONE LOOP BELOW, LATIN SMALL LETTER B +0061 08EF 059A 0316 1DFA 0062;0061 1DFA 08EF 0316 059A 0062;0061 1DFA 08EF 0316 059A 0062;0061 1DFA 08EF 0316 059A 0062;0061 1DFA 08EF 0316 059A 0062; # (a◌࣯◌֚◌̖◌᷺b; a◌᷺◌࣯◌̖◌֚b; a◌᷺◌࣯◌̖◌֚b; a◌᷺◌࣯◌̖◌֚b; a◌᷺◌࣯◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TONE LOOP BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 064C 064B FB1E 08F0 0062;0061 FB1E 064B 08F0 064C 0062;0061 FB1E 064B 08F0 064C 0062;0061 FB1E 064B 08F0 064C 0062;0061 FB1E 064B 08F0 064C 0062; # (a◌ٌ◌ً◌ﬞ◌ࣰb; a◌ﬞ◌ً◌ࣰ◌ٌb; a◌ﬞ◌ً◌ࣰ◌ٌb; a◌ﬞ◌ً◌ࣰ◌ٌb; a◌ﬞ◌ً◌ࣰ◌ٌb; ) LATIN SMALL LETTER A, ARABIC DAMMATAN, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, ARABIC OPEN FATHATAN, LATIN SMALL LETTER B +0061 08F0 064C 064B FB1E 0062;0061 FB1E 08F0 064B 064C 0062;0061 FB1E 08F0 064B 064C 0062;0061 FB1E 08F0 064B 064C 0062;0061 FB1E 08F0 064B 064C 0062; # (a◌ࣰ◌ٌ◌ً◌ﬞb; a◌ﬞ◌ࣰ◌ً◌ٌb; a◌ﬞ◌ࣰ◌ً◌ٌb; a◌ﬞ◌ࣰ◌ً◌ٌb; a◌ﬞ◌ࣰ◌ً◌ٌb; ) LATIN SMALL LETTER A, ARABIC OPEN FATHATAN, ARABIC DAMMATAN, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, LATIN SMALL LETTER B +0061 064D 064C 064B 08F1 0062;0061 064B 064C 08F1 064D 0062;0061 064B 064C 08F1 064D 0062;0061 064B 064C 08F1 064D 0062;0061 064B 064C 08F1 064D 0062; # (a◌ٍ◌ٌ◌ً◌ࣱb; a◌ً◌ٌ◌ࣱ◌ٍb; a◌ً◌ٌ◌ࣱ◌ٍb; a◌ً◌ٌ◌ࣱ◌ٍb; a◌ً◌ٌ◌ࣱ◌ٍb; ) LATIN SMALL LETTER A, ARABIC KASRATAN, ARABIC DAMMATAN, ARABIC FATHATAN, ARABIC OPEN DAMMATAN, LATIN SMALL LETTER B +0061 08F1 064D 064C 064B 0062;0061 064B 08F1 064C 064D 0062;0061 064B 08F1 064C 064D 0062;0061 064B 08F1 064C 064D 0062;0061 064B 08F1 064C 064D 0062; # (a◌ࣱ◌ٍ◌ٌ◌ًb; a◌ً◌ࣱ◌ٌ◌ٍb; a◌ً◌ࣱ◌ٌ◌ٍb; a◌ً◌ࣱ◌ٌ◌ٍb; a◌ً◌ࣱ◌ٌ◌ٍb; ) LATIN SMALL LETTER A, ARABIC OPEN DAMMATAN, ARABIC KASRATAN, ARABIC DAMMATAN, ARABIC FATHATAN, LATIN SMALL LETTER B +0061 0618 064D 064C 08F2 0062;0061 064C 064D 08F2 0618 0062;0061 064C 064D 08F2 0618 0062;0061 064C 064D 08F2 0618 0062;0061 064C 064D 08F2 0618 0062; # (a◌ؘ◌ٍ◌ٌ◌ࣲb; a◌ٌ◌ٍ◌ࣲ◌ؘb; a◌ٌ◌ٍ◌ࣲ◌ؘb; a◌ٌ◌ٍ◌ࣲ◌ؘb; a◌ٌ◌ٍ◌ࣲ◌ؘb; ) LATIN SMALL LETTER A, ARABIC SMALL FATHA, ARABIC KASRATAN, ARABIC DAMMATAN, ARABIC OPEN KASRATAN, LATIN SMALL LETTER B +0061 08F2 0618 064D 064C 0062;0061 064C 08F2 064D 0618 0062;0061 064C 08F2 064D 0618 0062;0061 064C 08F2 064D 0618 0062;0061 064C 08F2 064D 0618 0062; # (a◌ࣲ◌ؘ◌ٍ◌ٌb; a◌ٌ◌ࣲ◌ٍ◌ؘb; a◌ٌ◌ࣲ◌ٍ◌ؘb; a◌ٌ◌ࣲ◌ٍ◌ؘb; a◌ٌ◌ࣲ◌ٍ◌ؘb; ) LATIN SMALL LETTER A, ARABIC OPEN KASRATAN, ARABIC SMALL FATHA, ARABIC KASRATAN, ARABIC DAMMATAN, LATIN SMALL LETTER B +0061 0315 0300 05AE 08F3 0062;00E0 05AE 08F3 0315 0062;0061 05AE 0300 08F3 0315 0062;00E0 05AE 08F3 0315 0062;0061 05AE 0300 08F3 0315 0062; # (a◌̕◌̀◌֮◌ࣳb; à◌֮◌ࣳ◌̕b; a◌֮◌̀◌ࣳ◌̕b; à◌֮◌ࣳ◌̕b; a◌֮◌̀◌ࣳ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WAW, LATIN SMALL LETTER B +0061 08F3 0315 0300 05AE 0062;0061 05AE 08F3 0300 0315 0062;0061 05AE 08F3 0300 0315 0062;0061 05AE 08F3 0300 0315 0062;0061 05AE 08F3 0300 0315 0062; # (a◌ࣳ◌̕◌̀◌֮b; a◌֮◌ࣳ◌̀◌̕b; a◌֮◌ࣳ◌̀◌̕b; a◌֮◌ࣳ◌̀◌̕b; a◌֮◌ࣳ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WAW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08F4 0062;00E0 05AE 08F4 0315 0062;0061 05AE 0300 08F4 0315 0062;00E0 05AE 08F4 0315 0062;0061 05AE 0300 08F4 0315 0062; # (a◌̕◌̀◌֮◌ࣴb; à◌֮◌ࣴ◌̕b; a◌֮◌̀◌ࣴ◌̕b; à◌֮◌ࣴ◌̕b; a◌֮◌̀◌ࣴ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC FATHA WITH RING, LATIN SMALL LETTER B +0061 08F4 0315 0300 05AE 0062;0061 05AE 08F4 0300 0315 0062;0061 05AE 08F4 0300 0315 0062;0061 05AE 08F4 0300 0315 0062;0061 05AE 08F4 0300 0315 0062; # (a◌ࣴ◌̕◌̀◌֮b; a◌֮◌ࣴ◌̀◌̕b; a◌֮◌ࣴ◌̀◌̕b; a◌֮◌ࣴ◌̀◌̕b; a◌֮◌ࣴ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC FATHA WITH RING, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08F5 0062;00E0 05AE 08F5 0315 0062;0061 05AE 0300 08F5 0315 0062;00E0 05AE 08F5 0315 0062;0061 05AE 0300 08F5 0315 0062; # (a◌̕◌̀◌֮◌ࣵb; à◌֮◌ࣵ◌̕b; a◌֮◌̀◌ࣵ◌̕b; à◌֮◌ࣵ◌̕b; a◌֮◌̀◌ࣵ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC FATHA WITH DOT ABOVE, LATIN SMALL LETTER B +0061 08F5 0315 0300 05AE 0062;0061 05AE 08F5 0300 0315 0062;0061 05AE 08F5 0300 0315 0062;0061 05AE 08F5 0300 0315 0062;0061 05AE 08F5 0300 0315 0062; # (a◌ࣵ◌̕◌̀◌֮b; a◌֮◌ࣵ◌̀◌̕b; a◌֮◌ࣵ◌̀◌̕b; a◌֮◌ࣵ◌̀◌̕b; a◌֮◌ࣵ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC FATHA WITH DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08F6 0062;0061 1DFA 0316 08F6 059A 0062;0061 1DFA 0316 08F6 059A 0062;0061 1DFA 0316 08F6 059A 0062;0061 1DFA 0316 08F6 059A 0062; # (a◌֚◌̖◌᷺◌ࣶb; a◌᷺◌̖◌ࣶ◌֚b; a◌᷺◌̖◌ࣶ◌֚b; a◌᷺◌̖◌ࣶ◌֚b; a◌᷺◌̖◌ࣶ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC KASRA WITH DOT BELOW, LATIN SMALL LETTER B +0061 08F6 059A 0316 1DFA 0062;0061 1DFA 08F6 0316 059A 0062;0061 1DFA 08F6 0316 059A 0062;0061 1DFA 08F6 0316 059A 0062;0061 1DFA 08F6 0316 059A 0062; # (a◌ࣶ◌֚◌̖◌᷺b; a◌᷺◌ࣶ◌̖◌֚b; a◌᷺◌ࣶ◌̖◌֚b; a◌᷺◌ࣶ◌̖◌֚b; a◌᷺◌ࣶ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC KASRA WITH DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 08F7 0062;00E0 05AE 08F7 0315 0062;0061 05AE 0300 08F7 0315 0062;00E0 05AE 08F7 0315 0062;0061 05AE 0300 08F7 0315 0062; # (a◌̕◌̀◌֮◌ࣷb; à◌֮◌ࣷ◌̕b; a◌֮◌̀◌ࣷ◌̕b; à◌֮◌ࣷ◌̕b; a◌֮◌̀◌ࣷ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC LEFT ARROWHEAD ABOVE, LATIN SMALL LETTER B +0061 08F7 0315 0300 05AE 0062;0061 05AE 08F7 0300 0315 0062;0061 05AE 08F7 0300 0315 0062;0061 05AE 08F7 0300 0315 0062;0061 05AE 08F7 0300 0315 0062; # (a◌ࣷ◌̕◌̀◌֮b; a◌֮◌ࣷ◌̀◌̕b; a◌֮◌ࣷ◌̀◌̕b; a◌֮◌ࣷ◌̀◌̕b; a◌֮◌ࣷ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC LEFT ARROWHEAD ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08F8 0062;00E0 05AE 08F8 0315 0062;0061 05AE 0300 08F8 0315 0062;00E0 05AE 08F8 0315 0062;0061 05AE 0300 08F8 0315 0062; # (a◌̕◌̀◌֮◌ࣸb; à◌֮◌ࣸ◌̕b; a◌֮◌̀◌ࣸ◌̕b; à◌֮◌ࣸ◌̕b; a◌֮◌̀◌ࣸ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC RIGHT ARROWHEAD ABOVE, LATIN SMALL LETTER B +0061 08F8 0315 0300 05AE 0062;0061 05AE 08F8 0300 0315 0062;0061 05AE 08F8 0300 0315 0062;0061 05AE 08F8 0300 0315 0062;0061 05AE 08F8 0300 0315 0062; # (a◌ࣸ◌̕◌̀◌֮b; a◌֮◌ࣸ◌̀◌̕b; a◌֮◌ࣸ◌̀◌̕b; a◌֮◌ࣸ◌̀◌̕b; a◌֮◌ࣸ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC RIGHT ARROWHEAD ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08F9 0062;0061 1DFA 0316 08F9 059A 0062;0061 1DFA 0316 08F9 059A 0062;0061 1DFA 0316 08F9 059A 0062;0061 1DFA 0316 08F9 059A 0062; # (a◌֚◌̖◌᷺◌ࣹb; a◌᷺◌̖◌ࣹ◌֚b; a◌᷺◌̖◌ࣹ◌֚b; a◌᷺◌̖◌ࣹ◌֚b; a◌᷺◌̖◌ࣹ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC LEFT ARROWHEAD BELOW, LATIN SMALL LETTER B +0061 08F9 059A 0316 1DFA 0062;0061 1DFA 08F9 0316 059A 0062;0061 1DFA 08F9 0316 059A 0062;0061 1DFA 08F9 0316 059A 0062;0061 1DFA 08F9 0316 059A 0062; # (a◌ࣹ◌֚◌̖◌᷺b; a◌᷺◌ࣹ◌̖◌֚b; a◌᷺◌ࣹ◌̖◌֚b; a◌᷺◌ࣹ◌̖◌֚b; a◌᷺◌ࣹ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC LEFT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 08FA 0062;0061 1DFA 0316 08FA 059A 0062;0061 1DFA 0316 08FA 059A 0062;0061 1DFA 0316 08FA 059A 0062;0061 1DFA 0316 08FA 059A 0062; # (a◌֚◌̖◌᷺◌ࣺb; a◌᷺◌̖◌ࣺ◌֚b; a◌᷺◌̖◌ࣺ◌֚b; a◌᷺◌̖◌ࣺ◌֚b; a◌᷺◌̖◌ࣺ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC RIGHT ARROWHEAD BELOW, LATIN SMALL LETTER B +0061 08FA 059A 0316 1DFA 0062;0061 1DFA 08FA 0316 059A 0062;0061 1DFA 08FA 0316 059A 0062;0061 1DFA 08FA 0316 059A 0062;0061 1DFA 08FA 0316 059A 0062; # (a◌ࣺ◌֚◌̖◌᷺b; a◌᷺◌ࣺ◌̖◌֚b; a◌᷺◌ࣺ◌̖◌֚b; a◌᷺◌ࣺ◌̖◌֚b; a◌᷺◌ࣺ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC RIGHT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 08FB 0062;00E0 05AE 08FB 0315 0062;0061 05AE 0300 08FB 0315 0062;00E0 05AE 08FB 0315 0062;0061 05AE 0300 08FB 0315 0062; # (a◌̕◌̀◌֮◌ࣻb; à◌֮◌ࣻ◌̕b; a◌֮◌̀◌ࣻ◌̕b; à◌֮◌ࣻ◌̕b; a◌֮◌̀◌ࣻ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC DOUBLE RIGHT ARROWHEAD ABOVE, LATIN SMALL LETTER B +0061 08FB 0315 0300 05AE 0062;0061 05AE 08FB 0300 0315 0062;0061 05AE 08FB 0300 0315 0062;0061 05AE 08FB 0300 0315 0062;0061 05AE 08FB 0300 0315 0062; # (a◌ࣻ◌̕◌̀◌֮b; a◌֮◌ࣻ◌̀◌̕b; a◌֮◌ࣻ◌̀◌̕b; a◌֮◌ࣻ◌̀◌̕b; a◌֮◌ࣻ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC DOUBLE RIGHT ARROWHEAD ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08FC 0062;00E0 05AE 08FC 0315 0062;0061 05AE 0300 08FC 0315 0062;00E0 05AE 08FC 0315 0062;0061 05AE 0300 08FC 0315 0062; # (a◌̕◌̀◌֮◌ࣼb; à◌֮◌ࣼ◌̕b; a◌֮◌̀◌ࣼ◌̕b; à◌֮◌ࣼ◌̕b; a◌֮◌̀◌ࣼ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT, LATIN SMALL LETTER B +0061 08FC 0315 0300 05AE 0062;0061 05AE 08FC 0300 0315 0062;0061 05AE 08FC 0300 0315 0062;0061 05AE 08FC 0300 0315 0062;0061 05AE 08FC 0300 0315 0062; # (a◌ࣼ◌̕◌̀◌֮b; a◌֮◌ࣼ◌̀◌̕b; a◌֮◌ࣼ◌̀◌̕b; a◌֮◌ࣼ◌̀◌̕b; a◌֮◌ࣼ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08FD 0062;00E0 05AE 08FD 0315 0062;0061 05AE 0300 08FD 0315 0062;00E0 05AE 08FD 0315 0062;0061 05AE 0300 08FD 0315 0062; # (a◌̕◌̀◌֮◌ࣽb; à◌֮◌ࣽ◌̕b; a◌֮◌̀◌ࣽ◌̕b; à◌֮◌ࣽ◌̕b; a◌֮◌̀◌ࣽ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC RIGHT ARROWHEAD ABOVE WITH DOT, LATIN SMALL LETTER B +0061 08FD 0315 0300 05AE 0062;0061 05AE 08FD 0300 0315 0062;0061 05AE 08FD 0300 0315 0062;0061 05AE 08FD 0300 0315 0062;0061 05AE 08FD 0300 0315 0062; # (a◌ࣽ◌̕◌̀◌֮b; a◌֮◌ࣽ◌̀◌̕b; a◌֮◌ࣽ◌̀◌̕b; a◌֮◌ࣽ◌̀◌̕b; a◌֮◌ࣽ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC RIGHT ARROWHEAD ABOVE WITH DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08FE 0062;00E0 05AE 08FE 0315 0062;0061 05AE 0300 08FE 0315 0062;00E0 05AE 08FE 0315 0062;0061 05AE 0300 08FE 0315 0062; # (a◌̕◌̀◌֮◌ࣾb; à◌֮◌ࣾ◌̕b; a◌֮◌̀◌ࣾ◌̕b; à◌֮◌ࣾ◌̕b; a◌֮◌̀◌ࣾ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC DAMMA WITH DOT, LATIN SMALL LETTER B +0061 08FE 0315 0300 05AE 0062;0061 05AE 08FE 0300 0315 0062;0061 05AE 08FE 0300 0315 0062;0061 05AE 08FE 0300 0315 0062;0061 05AE 08FE 0300 0315 0062; # (a◌ࣾ◌̕◌̀◌֮b; a◌֮◌ࣾ◌̀◌̕b; a◌֮◌ࣾ◌̀◌̕b; a◌֮◌ࣾ◌̀◌̕b; a◌֮◌ࣾ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC DAMMA WITH DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 08FF 0062;00E0 05AE 08FF 0315 0062;0061 05AE 0300 08FF 0315 0062;00E0 05AE 08FF 0315 0062;0061 05AE 0300 08FF 0315 0062; # (a◌̕◌̀◌֮◌ࣿb; à◌֮◌ࣿ◌̕b; a◌֮◌̀◌ࣿ◌̕b; à◌֮◌ࣿ◌̕b; a◌֮◌̀◌ࣿ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC MARK SIDEWAYS NOON GHUNNA, LATIN SMALL LETTER B +0061 08FF 0315 0300 05AE 0062;0061 05AE 08FF 0300 0315 0062;0061 05AE 08FF 0300 0315 0062;0061 05AE 08FF 0300 0315 0062;0061 05AE 08FF 0300 0315 0062; # (a◌ࣿ◌̕◌̀◌֮b; a◌֮◌ࣿ◌̀◌̕b; a◌֮◌ࣿ◌̀◌̕b; a◌֮◌ࣿ◌̀◌̕b; a◌֮◌ࣿ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC MARK SIDEWAYS NOON GHUNNA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 3099 093C 16FF0 093C 0062;0061 16FF0 093C 093C 3099 0062;0061 16FF0 093C 093C 3099 0062;0061 16FF0 093C 093C 3099 0062;0061 16FF0 093C 093C 3099 0062; # (a◌゙◌𖿰़◌़b; a𖿰◌़◌़◌゙b; a𖿰◌़◌़◌゙b; a𖿰◌़◌़◌゙b; a𖿰◌़◌़◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, DEVANAGARI SIGN NUKTA, LATIN SMALL LETTER B +0061 093C 3099 093C 16FF0 0062;0061 16FF0 093C 093C 3099 0062;0061 16FF0 093C 093C 3099 0062;0061 16FF0 093C 093C 3099 0062;0061 16FF0 093C 093C 3099 0062; # (a◌़◌゙◌𖿰़b; a𖿰◌़◌़◌゙b; a𖿰◌़◌़◌゙b; a𖿰◌़◌़◌゙b; a𖿰◌़◌़◌゙b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 094D 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062; # (a◌ְ◌्◌゙◌्b; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN VIRAMA, LATIN SMALL LETTER B +0061 094D 05B0 094D 3099 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062; # (a◌्◌ְ◌्◌゙b; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; a◌゙◌्◌्◌ְb; ) LATIN SMALL LETTER A, DEVANAGARI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0951 0062;00E0 05AE 0951 0315 0062;0061 05AE 0300 0951 0315 0062;00E0 05AE 0951 0315 0062;0061 05AE 0300 0951 0315 0062; # (a◌̕◌̀◌֮◌॑b; à◌֮◌॑◌̕b; a◌֮◌̀◌॑◌̕b; à◌֮◌॑◌̕b; a◌֮◌̀◌॑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, DEVANAGARI STRESS SIGN UDATTA, LATIN SMALL LETTER B +0061 0951 0315 0300 05AE 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062; # (a◌॑◌̕◌̀◌֮b; a◌֮◌॑◌̀◌̕b; a◌֮◌॑◌̀◌̕b; a◌֮◌॑◌̀◌̕b; a◌֮◌॑◌̀◌̕b; ) LATIN SMALL LETTER A, DEVANAGARI STRESS SIGN UDATTA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0952 0062;0061 1DFA 0316 0952 059A 0062;0061 1DFA 0316 0952 059A 0062;0061 1DFA 0316 0952 059A 0062;0061 1DFA 0316 0952 059A 0062; # (a◌֚◌̖◌᷺◌॒b; a◌᷺◌̖◌॒◌֚b; a◌᷺◌̖◌॒◌֚b; a◌᷺◌̖◌॒◌֚b; a◌᷺◌̖◌॒◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, DEVANAGARI STRESS SIGN ANUDATTA, LATIN SMALL LETTER B +0061 0952 059A 0316 1DFA 0062;0061 1DFA 0952 0316 059A 0062;0061 1DFA 0952 0316 059A 0062;0061 1DFA 0952 0316 059A 0062;0061 1DFA 0952 0316 059A 0062; # (a◌॒◌֚◌̖◌᷺b; a◌᷺◌॒◌̖◌֚b; a◌᷺◌॒◌̖◌֚b; a◌᷺◌॒◌̖◌֚b; a◌᷺◌॒◌̖◌֚b; ) LATIN SMALL LETTER A, DEVANAGARI STRESS SIGN ANUDATTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 0953 0062;00E0 05AE 0953 0315 0062;0061 05AE 0300 0953 0315 0062;00E0 05AE 0953 0315 0062;0061 05AE 0300 0953 0315 0062; # (a◌̕◌̀◌֮◌॓b; à◌֮◌॓◌̕b; a◌֮◌̀◌॓◌̕b; à◌֮◌॓◌̕b; a◌֮◌̀◌॓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, DEVANAGARI GRAVE ACCENT, LATIN SMALL LETTER B +0061 0953 0315 0300 05AE 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062; # (a◌॓◌̕◌̀◌֮b; a◌֮◌॓◌̀◌̕b; a◌֮◌॓◌̀◌̕b; a◌֮◌॓◌̀◌̕b; a◌֮◌॓◌̀◌̕b; ) LATIN SMALL LETTER A, DEVANAGARI GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0954 0062;00E0 05AE 0954 0315 0062;0061 05AE 0300 0954 0315 0062;00E0 05AE 0954 0315 0062;0061 05AE 0300 0954 0315 0062; # (a◌̕◌̀◌֮◌॔b; à◌֮◌॔◌̕b; a◌֮◌̀◌॔◌̕b; à◌֮◌॔◌̕b; a◌֮◌̀◌॔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, DEVANAGARI ACUTE ACCENT, LATIN SMALL LETTER B +0061 0954 0315 0300 05AE 0062;0061 05AE 0954 0300 0315 0062;0061 05AE 0954 0300 0315 0062;0061 05AE 0954 0300 0315 0062;0061 05AE 0954 0300 0315 0062; # (a◌॔◌̕◌̀◌֮b; a◌֮◌॔◌̀◌̕b; a◌֮◌॔◌̀◌̕b; a◌֮◌॔◌̀◌̕b; a◌֮◌॔◌̀◌̕b; ) LATIN SMALL LETTER A, DEVANAGARI ACUTE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 3099 093C 16FF0 09BC 0062;0061 16FF0 093C 09BC 3099 0062;0061 16FF0 093C 09BC 3099 0062;0061 16FF0 093C 09BC 3099 0062;0061 16FF0 093C 09BC 3099 0062; # (a◌゙◌𖿰़◌়b; a𖿰◌़◌়◌゙b; a𖿰◌़◌়◌゙b; a𖿰◌़◌়◌゙b; a𖿰◌़◌়◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, BENGALI SIGN NUKTA, LATIN SMALL LETTER B +0061 09BC 3099 093C 16FF0 0062;0061 16FF0 09BC 093C 3099 0062;0061 16FF0 09BC 093C 3099 0062;0061 16FF0 09BC 093C 3099 0062;0061 16FF0 09BC 093C 3099 0062; # (a◌়◌゙◌𖿰़b; a𖿰◌়◌़◌゙b; a𖿰◌়◌़◌゙b; a𖿰◌়◌़◌゙b; a𖿰◌়◌़◌゙b; ) LATIN SMALL LETTER A, BENGALI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 09CD 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062;0061 3099 094D 09CD 05B0 0062; # (a◌ְ◌्◌゙◌্b; a◌゙◌्◌্◌ְb; a◌゙◌्◌্◌ְb; a◌゙◌्◌্◌ְb; a◌゙◌्◌্◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BENGALI SIGN VIRAMA, LATIN SMALL LETTER B +0061 09CD 05B0 094D 3099 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062;0061 3099 09CD 094D 05B0 0062; # (a◌্◌ְ◌्◌゙b; a◌゙◌্◌्◌ְb; a◌゙◌্◌्◌ְb; a◌゙◌্◌्◌ְb; a◌゙◌্◌्◌ְb; ) LATIN SMALL LETTER A, BENGALI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 09FE 0062;00E0 05AE 09FE 0315 0062;0061 05AE 0300 09FE 0315 0062;00E0 05AE 09FE 0315 0062;0061 05AE 0300 09FE 0315 0062; # (a◌̕◌̀◌֮◌৾b; à◌֮◌৾◌̕b; a◌֮◌̀◌৾◌̕b; à◌֮◌৾◌̕b; a◌֮◌̀◌৾◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BENGALI SANDHI MARK, LATIN SMALL LETTER B +0061 09FE 0315 0300 05AE 0062;0061 05AE 09FE 0300 0315 0062;0061 05AE 09FE 0300 0315 0062;0061 05AE 09FE 0300 0315 0062;0061 05AE 09FE 0300 0315 0062; # (a◌৾◌̕◌̀◌֮b; a◌֮◌৾◌̀◌̕b; a◌֮◌৾◌̀◌̕b; a◌֮◌৾◌̀◌̕b; a◌֮◌৾◌̀◌̕b; ) LATIN SMALL LETTER A, BENGALI SANDHI MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 3099 093C 16FF0 0A3C 0062;0061 16FF0 093C 0A3C 3099 0062;0061 16FF0 093C 0A3C 3099 0062;0061 16FF0 093C 0A3C 3099 0062;0061 16FF0 093C 0A3C 3099 0062; # (a◌゙◌𖿰़◌਼b; a𖿰◌़◌਼◌゙b; a𖿰◌़◌਼◌゙b; a𖿰◌़◌਼◌゙b; a𖿰◌़◌਼◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, GURMUKHI SIGN NUKTA, LATIN SMALL LETTER B +0061 0A3C 3099 093C 16FF0 0062;0061 16FF0 0A3C 093C 3099 0062;0061 16FF0 0A3C 093C 3099 0062;0061 16FF0 0A3C 093C 3099 0062;0061 16FF0 0A3C 093C 3099 0062; # (a◌਼◌゙◌𖿰़b; a𖿰◌਼◌़◌゙b; a𖿰◌਼◌़◌゙b; a𖿰◌਼◌़◌゙b; a𖿰◌਼◌़◌゙b; ) LATIN SMALL LETTER A, GURMUKHI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 0A4D 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062;0061 3099 094D 0A4D 05B0 0062; # (a◌ְ◌्◌゙◌੍b; a◌゙◌्◌੍◌ְb; a◌゙◌्◌੍◌ְb; a◌゙◌्◌੍◌ְb; a◌゙◌्◌੍◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, GURMUKHI SIGN VIRAMA, LATIN SMALL LETTER B +0061 0A4D 05B0 094D 3099 0062;0061 3099 0A4D 094D 05B0 0062;0061 3099 0A4D 094D 05B0 0062;0061 3099 0A4D 094D 05B0 0062;0061 3099 0A4D 094D 05B0 0062; # (a◌੍◌ְ◌्◌゙b; a◌゙◌੍◌्◌ְb; a◌゙◌੍◌्◌ְb; a◌゙◌੍◌्◌ְb; a◌゙◌੍◌्◌ְb; ) LATIN SMALL LETTER A, GURMUKHI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 0ABC 0062;0061 16FF0 093C 0ABC 3099 0062;0061 16FF0 093C 0ABC 3099 0062;0061 16FF0 093C 0ABC 3099 0062;0061 16FF0 093C 0ABC 3099 0062; # (a◌゙◌𖿰़◌઼b; a𖿰◌़◌઼◌゙b; a𖿰◌़◌઼◌゙b; a𖿰◌़◌઼◌゙b; a𖿰◌़◌઼◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, GUJARATI SIGN NUKTA, LATIN SMALL LETTER B +0061 0ABC 3099 093C 16FF0 0062;0061 16FF0 0ABC 093C 3099 0062;0061 16FF0 0ABC 093C 3099 0062;0061 16FF0 0ABC 093C 3099 0062;0061 16FF0 0ABC 093C 3099 0062; # (a◌઼◌゙◌𖿰़b; a𖿰◌઼◌़◌゙b; a𖿰◌઼◌़◌゙b; a𖿰◌઼◌़◌゙b; a𖿰◌઼◌़◌゙b; ) LATIN SMALL LETTER A, GUJARATI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 0ACD 0062;0061 3099 094D 0ACD 05B0 0062;0061 3099 094D 0ACD 05B0 0062;0061 3099 094D 0ACD 05B0 0062;0061 3099 094D 0ACD 05B0 0062; # (a◌ְ◌्◌゙◌્b; a◌゙◌्◌્◌ְb; a◌゙◌्◌્◌ְb; a◌゙◌्◌્◌ְb; a◌゙◌्◌્◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, GUJARATI SIGN VIRAMA, LATIN SMALL LETTER B +0061 0ACD 05B0 094D 3099 0062;0061 3099 0ACD 094D 05B0 0062;0061 3099 0ACD 094D 05B0 0062;0061 3099 0ACD 094D 05B0 0062;0061 3099 0ACD 094D 05B0 0062; # (a◌્◌ְ◌्◌゙b; a◌゙◌્◌्◌ְb; a◌゙◌્◌्◌ְb; a◌゙◌્◌्◌ְb; a◌゙◌્◌्◌ְb; ) LATIN SMALL LETTER A, GUJARATI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 0B3C 0062;0061 16FF0 093C 0B3C 3099 0062;0061 16FF0 093C 0B3C 3099 0062;0061 16FF0 093C 0B3C 3099 0062;0061 16FF0 093C 0B3C 3099 0062; # (a◌゙◌𖿰़◌଼b; a𖿰◌़◌଼◌゙b; a𖿰◌़◌଼◌゙b; a𖿰◌़◌଼◌゙b; a𖿰◌़◌଼◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, ORIYA SIGN NUKTA, LATIN SMALL LETTER B +0061 0B3C 3099 093C 16FF0 0062;0061 16FF0 0B3C 093C 3099 0062;0061 16FF0 0B3C 093C 3099 0062;0061 16FF0 0B3C 093C 3099 0062;0061 16FF0 0B3C 093C 3099 0062; # (a◌଼◌゙◌𖿰़b; a𖿰◌଼◌़◌゙b; a𖿰◌଼◌़◌゙b; a𖿰◌଼◌़◌゙b; a𖿰◌଼◌़◌゙b; ) LATIN SMALL LETTER A, ORIYA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 0B4D 0062;0061 3099 094D 0B4D 05B0 0062;0061 3099 094D 0B4D 05B0 0062;0061 3099 094D 0B4D 05B0 0062;0061 3099 094D 0B4D 05B0 0062; # (a◌ְ◌्◌゙◌୍b; a◌゙◌्◌୍◌ְb; a◌゙◌्◌୍◌ְb; a◌゙◌्◌୍◌ְb; a◌゙◌्◌୍◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, ORIYA SIGN VIRAMA, LATIN SMALL LETTER B +0061 0B4D 05B0 094D 3099 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062; # (a◌୍◌ְ◌्◌゙b; a◌゙◌୍◌्◌ְb; a◌゙◌୍◌्◌ְb; a◌゙◌୍◌्◌ְb; a◌゙◌୍◌्◌ְb; ) LATIN SMALL LETTER A, ORIYA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0BCD 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062; # (a◌ְ◌्◌゙◌்b; a◌゙◌्◌்◌ְb; a◌゙◌्◌்◌ְb; a◌゙◌्◌்◌ְb; a◌゙◌्◌்◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAMIL SIGN VIRAMA, LATIN SMALL LETTER B +0061 0BCD 05B0 094D 3099 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062; # (a◌்◌ְ◌्◌゙b; a◌゙◌்◌्◌ְb; a◌゙◌்◌्◌ְb; a◌゙◌்◌्◌ְb; a◌゙◌்◌्◌ְb; ) LATIN SMALL LETTER A, TAMIL SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 0C3C 0062;0061 16FF0 093C 0C3C 3099 0062;0061 16FF0 093C 0C3C 3099 0062;0061 16FF0 093C 0C3C 3099 0062;0061 16FF0 093C 0C3C 3099 0062; # (a◌゙◌𖿰़◌఼b; a𖿰◌़◌఼◌゙b; a𖿰◌़◌఼◌゙b; a𖿰◌़◌఼◌゙b; a𖿰◌़◌఼◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, TELUGU SIGN NUKTA, LATIN SMALL LETTER B +0061 0C3C 3099 093C 16FF0 0062;0061 16FF0 0C3C 093C 3099 0062;0061 16FF0 0C3C 093C 3099 0062;0061 16FF0 0C3C 093C 3099 0062;0061 16FF0 0C3C 093C 3099 0062; # (a◌఼◌゙◌𖿰़b; a𖿰◌఼◌़◌゙b; a𖿰◌఼◌़◌゙b; a𖿰◌఼◌़◌゙b; a𖿰◌఼◌़◌゙b; ) LATIN SMALL LETTER A, TELUGU SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 0C4D 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062; # (a◌ְ◌्◌゙◌్b; a◌゙◌्◌్◌ְb; a◌゙◌्◌్◌ְb; a◌゙◌्◌్◌ְb; a◌゙◌्◌్◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TELUGU SIGN VIRAMA, LATIN SMALL LETTER B +0061 0C4D 05B0 094D 3099 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062; # (a◌్◌ְ◌्◌゙b; a◌゙◌్◌्◌ְb; a◌゙◌్◌्◌ְb; a◌゙◌్◌्◌ְb; a◌゙◌్◌्◌ְb; ) LATIN SMALL LETTER A, TELUGU SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0C56 0C55 0711 0C55 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062; # (a◌ౖ◌ౕ◌ܑ◌ౕb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; ) LATIN SMALL LETTER A, TELUGU AI LENGTH MARK, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, TELUGU LENGTH MARK, LATIN SMALL LETTER B +0061 0C55 0C56 0C55 0711 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062; # (a◌ౕ◌ౖ◌ౕ◌ܑb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; ) LATIN SMALL LETTER A, TELUGU LENGTH MARK, TELUGU AI LENGTH MARK, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, LATIN SMALL LETTER B +0061 0E38 0C56 0C55 0C56 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062; # (a◌ุ◌ౖ◌ౕ◌ౖb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; ) LATIN SMALL LETTER A, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, TELUGU LENGTH MARK, TELUGU AI LENGTH MARK, LATIN SMALL LETTER B +0061 0C56 0E38 0C56 0C55 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062;0061 0C55 0C56 0C56 0E38 0062; # (a◌ౖ◌ุ◌ౖ◌ౕb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; a◌ౕ◌ౖ◌ౖ◌ุb; ) LATIN SMALL LETTER A, TELUGU AI LENGTH MARK, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, TELUGU LENGTH MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 0CBC 0062;0061 16FF0 093C 0CBC 3099 0062;0061 16FF0 093C 0CBC 3099 0062;0061 16FF0 093C 0CBC 3099 0062;0061 16FF0 093C 0CBC 3099 0062; # (a◌゙◌𖿰़◌಼b; a𖿰◌़◌಼◌゙b; a𖿰◌़◌಼◌゙b; a𖿰◌़◌಼◌゙b; a𖿰◌़◌಼◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, KANNADA SIGN NUKTA, LATIN SMALL LETTER B +0061 0CBC 3099 093C 16FF0 0062;0061 16FF0 0CBC 093C 3099 0062;0061 16FF0 0CBC 093C 3099 0062;0061 16FF0 0CBC 093C 3099 0062;0061 16FF0 0CBC 093C 3099 0062; # (a◌಼◌゙◌𖿰़b; a𖿰◌಼◌़◌゙b; a𖿰◌಼◌़◌゙b; a𖿰◌಼◌़◌゙b; a𖿰◌಼◌़◌゙b; ) LATIN SMALL LETTER A, KANNADA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 0CCD 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062;0061 3099 094D 0CCD 05B0 0062; # (a◌ְ◌्◌゙◌್b; a◌゙◌्◌್◌ְb; a◌゙◌्◌್◌ְb; a◌゙◌्◌್◌ְb; a◌゙◌्◌್◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KANNADA SIGN VIRAMA, LATIN SMALL LETTER B +0061 0CCD 05B0 094D 3099 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062;0061 3099 0CCD 094D 05B0 0062; # (a◌್◌ְ◌्◌゙b; a◌゙◌್◌्◌ְb; a◌゙◌್◌्◌ְb; a◌゙◌್◌्◌ְb; a◌゙◌್◌्◌ְb; ) LATIN SMALL LETTER A, KANNADA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0D3B 0062;0061 3099 094D 0D3B 05B0 0062;0061 3099 094D 0D3B 05B0 0062;0061 3099 094D 0D3B 05B0 0062;0061 3099 094D 0D3B 05B0 0062; # (a◌ְ◌्◌゙◌഻b; a◌゙◌्◌഻◌ְb; a◌゙◌्◌഻◌ְb; a◌゙◌्◌഻◌ְb; a◌゙◌्◌഻◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MALAYALAM SIGN VERTICAL BAR VIRAMA, LATIN SMALL LETTER B +0061 0D3B 05B0 094D 3099 0062;0061 3099 0D3B 094D 05B0 0062;0061 3099 0D3B 094D 05B0 0062;0061 3099 0D3B 094D 05B0 0062;0061 3099 0D3B 094D 05B0 0062; # (a◌഻◌ְ◌्◌゙b; a◌゙◌഻◌्◌ְb; a◌゙◌഻◌्◌ְb; a◌゙◌഻◌्◌ְb; a◌゙◌഻◌्◌ְb; ) LATIN SMALL LETTER A, MALAYALAM SIGN VERTICAL BAR VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0D3C 0062;0061 3099 094D 0D3C 05B0 0062;0061 3099 094D 0D3C 05B0 0062;0061 3099 094D 0D3C 05B0 0062;0061 3099 094D 0D3C 05B0 0062; # (a◌ְ◌्◌゙◌഼b; a◌゙◌्◌഼◌ְb; a◌゙◌्◌഼◌ְb; a◌゙◌्◌഼◌ְb; a◌゙◌्◌഼◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MALAYALAM SIGN CIRCULAR VIRAMA, LATIN SMALL LETTER B +0061 0D3C 05B0 094D 3099 0062;0061 3099 0D3C 094D 05B0 0062;0061 3099 0D3C 094D 05B0 0062;0061 3099 0D3C 094D 05B0 0062;0061 3099 0D3C 094D 05B0 0062; # (a◌഼◌ְ◌्◌゙b; a◌゙◌഼◌्◌ְb; a◌゙◌഼◌्◌ְb; a◌゙◌഼◌्◌ְb; a◌゙◌഼◌्◌ְb; ) LATIN SMALL LETTER A, MALAYALAM SIGN CIRCULAR VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0D4D 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062;0061 3099 094D 0D4D 05B0 0062; # (a◌ְ◌्◌゙◌്b; a◌゙◌्◌്◌ְb; a◌゙◌्◌്◌ְb; a◌゙◌्◌്◌ְb; a◌゙◌्◌്◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MALAYALAM SIGN VIRAMA, LATIN SMALL LETTER B +0061 0D4D 05B0 094D 3099 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062;0061 3099 0D4D 094D 05B0 0062; # (a◌്◌ְ◌्◌゙b; a◌゙◌്◌्◌ְb; a◌゙◌്◌्◌ְb; a◌゙◌്◌्◌ְb; a◌゙◌്◌्◌ְb; ) LATIN SMALL LETTER A, MALAYALAM SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0DCA 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062;0061 3099 094D 0DCA 05B0 0062; # (a◌ְ◌्◌゙◌්b; a◌゙◌्◌්◌ְb; a◌゙◌्◌්◌ְb; a◌゙◌्◌්◌ְb; a◌゙◌्◌්◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SINHALA SIGN AL-LAKUNA, LATIN SMALL LETTER B +0061 0DCA 05B0 094D 3099 0062;0061 3099 0DCA 094D 05B0 0062;0061 3099 0DCA 094D 05B0 0062;0061 3099 0DCA 094D 05B0 0062;0061 3099 0DCA 094D 05B0 0062; # (a◌්◌ְ◌्◌゙b; a◌゙◌්◌्◌ְb; a◌゙◌්◌्◌ְb; a◌゙◌්◌्◌ְb; a◌゙◌්◌्◌ְb; ) LATIN SMALL LETTER A, SINHALA SIGN AL-LAKUNA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0E48 0E38 0C56 0E38 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062; # (a◌่◌ุ◌ౖ◌ุb; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; ) LATIN SMALL LETTER A, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, THAI CHARACTER SARA U, LATIN SMALL LETTER B +0061 0E38 0E48 0E38 0C56 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062;0061 0C56 0E38 0E38 0E48 0062; # (a◌ุ◌่◌ุ◌ౖb; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; a◌ౖ◌ุ◌ุ◌่b; ) LATIN SMALL LETTER A, THAI CHARACTER SARA U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, LATIN SMALL LETTER B +0061 0E48 0E38 0C56 0E39 0062;0061 0C56 0E38 0E39 0E48 0062;0061 0C56 0E38 0E39 0E48 0062;0061 0C56 0E38 0E39 0E48 0062;0061 0C56 0E38 0E39 0E48 0062; # (a◌่◌ุ◌ౖ◌ูb; a◌ౖ◌ุ◌ู◌่b; a◌ౖ◌ุ◌ู◌่b; a◌ౖ◌ุ◌ู◌่b; a◌ౖ◌ุ◌ู◌่b; ) LATIN SMALL LETTER A, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, THAI CHARACTER SARA UU, LATIN SMALL LETTER B +0061 0E39 0E48 0E38 0C56 0062;0061 0C56 0E39 0E38 0E48 0062;0061 0C56 0E39 0E38 0E48 0062;0061 0C56 0E39 0E38 0E48 0062;0061 0C56 0E39 0E38 0E48 0062; # (a◌ู◌่◌ุ◌ౖb; a◌ౖ◌ู◌ุ◌่b; a◌ౖ◌ู◌ุ◌่b; a◌ౖ◌ู◌ุ◌่b; a◌ౖ◌ู◌ุ◌่b; ) LATIN SMALL LETTER A, THAI CHARACTER SARA UU, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, TELUGU AI LENGTH MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0E3A 0062;0061 3099 094D 0E3A 05B0 0062;0061 3099 094D 0E3A 05B0 0062;0061 3099 094D 0E3A 05B0 0062;0061 3099 094D 0E3A 05B0 0062; # (a◌ְ◌्◌゙◌ฺb; a◌゙◌्◌ฺ◌ְb; a◌゙◌्◌ฺ◌ְb; a◌゙◌्◌ฺ◌ְb; a◌゙◌्◌ฺ◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, THAI CHARACTER PHINTHU, LATIN SMALL LETTER B +0061 0E3A 05B0 094D 3099 0062;0061 3099 0E3A 094D 05B0 0062;0061 3099 0E3A 094D 05B0 0062;0061 3099 0E3A 094D 05B0 0062;0061 3099 0E3A 094D 05B0 0062; # (a◌ฺ◌ְ◌्◌゙b; a◌゙◌ฺ◌्◌ְb; a◌゙◌ฺ◌्◌ְb; a◌゙◌ฺ◌्◌ְb; a◌゙◌ฺ◌्◌ְb; ) LATIN SMALL LETTER A, THAI CHARACTER PHINTHU, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0EB8 0E48 0E38 0E48 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062; # (a◌ຸ◌่◌ุ◌่b; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; ) LATIN SMALL LETTER A, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, THAI CHARACTER MAI EK, LATIN SMALL LETTER B +0061 0E48 0EB8 0E48 0E38 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062;0061 0E38 0E48 0E48 0EB8 0062; # (a◌่◌ຸ◌่◌ุb; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; a◌ุ◌่◌่◌ຸb; ) LATIN SMALL LETTER A, THAI CHARACTER MAI EK, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, LATIN SMALL LETTER B +0061 0EB8 0E48 0E38 0E49 0062;0061 0E38 0E48 0E49 0EB8 0062;0061 0E38 0E48 0E49 0EB8 0062;0061 0E38 0E48 0E49 0EB8 0062;0061 0E38 0E48 0E49 0EB8 0062; # (a◌ຸ◌่◌ุ◌้b; a◌ุ◌่◌้◌ຸb; a◌ุ◌่◌้◌ຸb; a◌ุ◌่◌้◌ຸb; a◌ุ◌่◌้◌ຸb; ) LATIN SMALL LETTER A, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, THAI CHARACTER MAI THO, LATIN SMALL LETTER B +0061 0E49 0EB8 0E48 0E38 0062;0061 0E38 0E49 0E48 0EB8 0062;0061 0E38 0E49 0E48 0EB8 0062;0061 0E38 0E49 0E48 0EB8 0062;0061 0E38 0E49 0E48 0EB8 0062; # (a◌้◌ຸ◌่◌ุb; a◌ุ◌้◌่◌ຸb; a◌ุ◌้◌่◌ຸb; a◌ุ◌้◌่◌ຸb; a◌ุ◌้◌่◌ຸb; ) LATIN SMALL LETTER A, THAI CHARACTER MAI THO, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, LATIN SMALL LETTER B +0061 0EB8 0E48 0E38 0E4A 0062;0061 0E38 0E48 0E4A 0EB8 0062;0061 0E38 0E48 0E4A 0EB8 0062;0061 0E38 0E48 0E4A 0EB8 0062;0061 0E38 0E48 0E4A 0EB8 0062; # (a◌ຸ◌่◌ุ◌๊b; a◌ุ◌่◌๊◌ຸb; a◌ุ◌่◌๊◌ຸb; a◌ุ◌่◌๊◌ຸb; a◌ุ◌่◌๊◌ຸb; ) LATIN SMALL LETTER A, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, THAI CHARACTER MAI TRI, LATIN SMALL LETTER B +0061 0E4A 0EB8 0E48 0E38 0062;0061 0E38 0E4A 0E48 0EB8 0062;0061 0E38 0E4A 0E48 0EB8 0062;0061 0E38 0E4A 0E48 0EB8 0062;0061 0E38 0E4A 0E48 0EB8 0062; # (a◌๊◌ຸ◌่◌ุb; a◌ุ◌๊◌่◌ຸb; a◌ุ◌๊◌่◌ຸb; a◌ุ◌๊◌่◌ຸb; a◌ุ◌๊◌่◌ຸb; ) LATIN SMALL LETTER A, THAI CHARACTER MAI TRI, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, LATIN SMALL LETTER B +0061 0EB8 0E48 0E38 0E4B 0062;0061 0E38 0E48 0E4B 0EB8 0062;0061 0E38 0E48 0E4B 0EB8 0062;0061 0E38 0E48 0E4B 0EB8 0062;0061 0E38 0E48 0E4B 0EB8 0062; # (a◌ຸ◌่◌ุ◌๋b; a◌ุ◌่◌๋◌ຸb; a◌ุ◌่◌๋◌ຸb; a◌ุ◌่◌๋◌ຸb; a◌ุ◌่◌๋◌ຸb; ) LATIN SMALL LETTER A, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, THAI CHARACTER MAI CHATTAWA, LATIN SMALL LETTER B +0061 0E4B 0EB8 0E48 0E38 0062;0061 0E38 0E4B 0E48 0EB8 0062;0061 0E38 0E4B 0E48 0EB8 0062;0061 0E38 0E4B 0E48 0EB8 0062;0061 0E38 0E4B 0E48 0EB8 0062; # (a◌๋◌ຸ◌่◌ุb; a◌ุ◌๋◌่◌ຸb; a◌ุ◌๋◌่◌ຸb; a◌ุ◌๋◌่◌ຸb; a◌ุ◌๋◌่◌ຸb; ) LATIN SMALL LETTER A, THAI CHARACTER MAI CHATTAWA, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, THAI CHARACTER SARA U, LATIN SMALL LETTER B +0061 0EC8 0EB8 0E48 0EB8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062; # (a◌່◌ຸ◌่◌ຸb; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; ) LATIN SMALL LETTER A, LAO TONE MAI EK, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B +0061 0EB8 0EC8 0EB8 0E48 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062;0061 0E48 0EB8 0EB8 0EC8 0062; # (a◌ຸ◌່◌ຸ◌่b; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; a◌่◌ຸ◌ຸ◌່b; ) LATIN SMALL LETTER A, LAO VOWEL SIGN U, LAO TONE MAI EK, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, LATIN SMALL LETTER B +0061 0EC8 0EB8 0E48 0EB9 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062;0061 0E48 0EB8 0EB9 0EC8 0062; # (a◌່◌ຸ◌่◌ູb; a◌่◌ຸ◌ູ◌່b; a◌่◌ຸ◌ູ◌່b; a◌่◌ຸ◌ູ◌່b; a◌่◌ຸ◌ູ◌່b; ) LATIN SMALL LETTER A, LAO TONE MAI EK, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, LAO VOWEL SIGN UU, LATIN SMALL LETTER B +0061 0EB9 0EC8 0EB8 0E48 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062;0061 0E48 0EB9 0EB8 0EC8 0062; # (a◌ູ◌່◌ຸ◌่b; a◌่◌ູ◌ຸ◌່b; a◌่◌ູ◌ຸ◌່b; a◌่◌ູ◌ຸ◌່b; a◌่◌ູ◌ຸ◌່b; ) LATIN SMALL LETTER A, LAO VOWEL SIGN UU, LAO TONE MAI EK, LAO VOWEL SIGN U, THAI CHARACTER MAI EK, LATIN SMALL LETTER B +0061 05B0 094D 3099 0EBA 0062;0061 3099 094D 0EBA 05B0 0062;0061 3099 094D 0EBA 05B0 0062;0061 3099 094D 0EBA 05B0 0062;0061 3099 094D 0EBA 05B0 0062; # (a◌ְ◌्◌゙◌຺b; a◌゙◌्◌຺◌ְb; a◌゙◌्◌຺◌ְb; a◌゙◌्◌຺◌ְb; a◌゙◌्◌຺◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LAO SIGN PALI VIRAMA, LATIN SMALL LETTER B +0061 0EBA 05B0 094D 3099 0062;0061 3099 0EBA 094D 05B0 0062;0061 3099 0EBA 094D 05B0 0062;0061 3099 0EBA 094D 05B0 0062;0061 3099 0EBA 094D 05B0 0062; # (a◌຺◌ְ◌्◌゙b; a◌゙◌຺◌्◌ְb; a◌゙◌຺◌्◌ְb; a◌゙◌຺◌्◌ְb; a◌゙◌຺◌्◌ְb; ) LATIN SMALL LETTER A, LAO SIGN PALI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0F71 0EC8 0EB8 0EC8 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062; # (a◌ཱ◌່◌ຸ◌່b; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LAO TONE MAI EK, LATIN SMALL LETTER B +0061 0EC8 0F71 0EC8 0EB8 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062;0061 0EB8 0EC8 0EC8 0F71 0062; # (a◌່◌ཱ◌່◌ຸb; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; a◌ຸ◌່◌່◌ཱb; ) LATIN SMALL LETTER A, LAO TONE MAI EK, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B +0061 0F71 0EC8 0EB8 0EC9 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062;0061 0EB8 0EC8 0EC9 0F71 0062; # (a◌ཱ◌່◌ຸ◌້b; a◌ຸ◌່◌້◌ཱb; a◌ຸ◌່◌້◌ཱb; a◌ຸ◌່◌້◌ཱb; a◌ຸ◌່◌້◌ཱb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LAO TONE MAI THO, LATIN SMALL LETTER B +0061 0EC9 0F71 0EC8 0EB8 0062;0061 0EB8 0EC9 0EC8 0F71 0062;0061 0EB8 0EC9 0EC8 0F71 0062;0061 0EB8 0EC9 0EC8 0F71 0062;0061 0EB8 0EC9 0EC8 0F71 0062; # (a◌້◌ཱ◌່◌ຸb; a◌ຸ◌້◌່◌ཱb; a◌ຸ◌້◌່◌ཱb; a◌ຸ◌້◌່◌ཱb; a◌ຸ◌້◌່◌ཱb; ) LATIN SMALL LETTER A, LAO TONE MAI THO, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B +0061 0F71 0EC8 0EB8 0ECA 0062;0061 0EB8 0EC8 0ECA 0F71 0062;0061 0EB8 0EC8 0ECA 0F71 0062;0061 0EB8 0EC8 0ECA 0F71 0062;0061 0EB8 0EC8 0ECA 0F71 0062; # (a◌ཱ◌່◌ຸ◌໊b; a◌ຸ◌່◌໊◌ཱb; a◌ຸ◌່◌໊◌ཱb; a◌ຸ◌່◌໊◌ཱb; a◌ຸ◌່◌໊◌ཱb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LAO TONE MAI TI, LATIN SMALL LETTER B +0061 0ECA 0F71 0EC8 0EB8 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062; # (a◌໊◌ཱ◌່◌ຸb; a◌ຸ◌໊◌່◌ཱb; a◌ຸ◌໊◌່◌ཱb; a◌ຸ◌໊◌່◌ཱb; a◌ຸ◌໊◌່◌ཱb; ) LATIN SMALL LETTER A, LAO TONE MAI TI, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B +0061 0F71 0EC8 0EB8 0ECB 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062; # (a◌ཱ◌່◌ຸ◌໋b; a◌ຸ◌່◌໋◌ཱb; a◌ຸ◌່◌໋◌ཱb; a◌ຸ◌່◌໋◌ཱb; a◌ຸ◌່◌໋◌ཱb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LAO TONE MAI CATAWA, LATIN SMALL LETTER B +0061 0ECB 0F71 0EC8 0EB8 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062; # (a◌໋◌ཱ◌່◌ຸb; a◌ຸ◌໋◌່◌ཱb; a◌ຸ◌໋◌່◌ཱb; a◌ຸ◌໋◌່◌ཱb; a◌ຸ◌໋◌່◌ཱb; ) LATIN SMALL LETTER A, LAO TONE MAI CATAWA, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0F18 0062;0061 1DFA 0316 0F18 059A 0062;0061 1DFA 0316 0F18 059A 0062;0061 1DFA 0316 0F18 059A 0062;0061 1DFA 0316 0F18 059A 0062; # (a◌֚◌̖◌᷺◌༘b; a◌᷺◌̖◌༘◌֚b; a◌᷺◌̖◌༘◌֚b; a◌᷺◌̖◌༘◌֚b; a◌᷺◌̖◌༘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TIBETAN ASTROLOGICAL SIGN -KHYUD PA, LATIN SMALL LETTER B +0061 0F18 059A 0316 1DFA 0062;0061 1DFA 0F18 0316 059A 0062;0061 1DFA 0F18 0316 059A 0062;0061 1DFA 0F18 0316 059A 0062;0061 1DFA 0F18 0316 059A 0062; # (a◌༘◌֚◌̖◌᷺b; a◌᷺◌༘◌̖◌֚b; a◌᷺◌༘◌̖◌֚b; a◌᷺◌༘◌̖◌֚b; a◌᷺◌༘◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN ASTROLOGICAL SIGN -KHYUD PA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0F19 0062;0061 1DFA 0316 0F19 059A 0062;0061 1DFA 0316 0F19 059A 0062;0061 1DFA 0316 0F19 059A 0062;0061 1DFA 0316 0F19 059A 0062; # (a◌֚◌̖◌᷺◌༙b; a◌᷺◌̖◌༙◌֚b; a◌᷺◌̖◌༙◌֚b; a◌᷺◌̖◌༙◌֚b; a◌᷺◌̖◌༙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS, LATIN SMALL LETTER B +0061 0F19 059A 0316 1DFA 0062;0061 1DFA 0F19 0316 059A 0062;0061 1DFA 0F19 0316 059A 0062;0061 1DFA 0F19 0316 059A 0062;0061 1DFA 0F19 0316 059A 0062; # (a◌༙◌֚◌̖◌᷺b; a◌᷺◌༙◌̖◌֚b; a◌᷺◌༙◌̖◌֚b; a◌᷺◌༙◌̖◌֚b; a◌᷺◌༙◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0F35 0062;0061 1DFA 0316 0F35 059A 0062;0061 1DFA 0316 0F35 059A 0062;0061 1DFA 0316 0F35 059A 0062;0061 1DFA 0316 0F35 059A 0062; # (a◌֚◌̖◌᷺◌༵b; a◌᷺◌̖◌༵◌֚b; a◌᷺◌̖◌༵◌֚b; a◌᷺◌̖◌༵◌֚b; a◌᷺◌̖◌༵◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TIBETAN MARK NGAS BZUNG NYI ZLA, LATIN SMALL LETTER B +0061 0F35 059A 0316 1DFA 0062;0061 1DFA 0F35 0316 059A 0062;0061 1DFA 0F35 0316 059A 0062;0061 1DFA 0F35 0316 059A 0062;0061 1DFA 0F35 0316 059A 0062; # (a◌༵◌֚◌̖◌᷺b; a◌᷺◌༵◌̖◌֚b; a◌᷺◌༵◌̖◌֚b; a◌᷺◌༵◌̖◌֚b; a◌᷺◌༵◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN MARK NGAS BZUNG NYI ZLA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0F37 0062;0061 1DFA 0316 0F37 059A 0062;0061 1DFA 0316 0F37 059A 0062;0061 1DFA 0316 0F37 059A 0062;0061 1DFA 0316 0F37 059A 0062; # (a◌֚◌̖◌᷺◌༷b; a◌᷺◌̖◌༷◌֚b; a◌᷺◌̖◌༷◌֚b; a◌᷺◌̖◌༷◌֚b; a◌᷺◌̖◌༷◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TIBETAN MARK NGAS BZUNG SGOR RTAGS, LATIN SMALL LETTER B +0061 0F37 059A 0316 1DFA 0062;0061 1DFA 0F37 0316 059A 0062;0061 1DFA 0F37 0316 059A 0062;0061 1DFA 0F37 0316 059A 0062;0061 1DFA 0F37 0316 059A 0062; # (a◌༷◌֚◌̖◌᷺b; a◌᷺◌༷◌̖◌֚b; a◌᷺◌༷◌̖◌֚b; a◌᷺◌༷◌̖◌֚b; a◌᷺◌༷◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN MARK NGAS BZUNG SGOR RTAGS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 1DFA 031B 1DCE 0F39 0062;0061 1DCE 031B 0F39 1DFA 0062;0061 1DCE 031B 0F39 1DFA 0062;0061 1DCE 031B 0F39 1DFA 0062;0061 1DCE 031B 0F39 1DFA 0062; # (a◌᷺◌̛◌᷎◌༹b; a◌᷎◌̛◌༹◌᷺b; a◌᷎◌̛◌༹◌᷺b; a◌᷎◌̛◌༹◌᷺b; a◌᷎◌̛◌༹◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, TIBETAN MARK TSA -PHRU, LATIN SMALL LETTER B +0061 0F39 1DFA 031B 1DCE 0062;0061 1DCE 0F39 031B 1DFA 0062;0061 1DCE 0F39 031B 1DFA 0062;0061 1DCE 0F39 031B 1DFA 0062;0061 1DCE 0F39 031B 1DFA 0062; # (a◌༹◌᷺◌̛◌᷎b; a◌᷎◌༹◌̛◌᷺b; a◌᷎◌༹◌̛◌᷺b; a◌᷎◌༹◌̛◌᷺b; a◌᷎◌༹◌̛◌᷺b; ) LATIN SMALL LETTER A, TIBETAN MARK TSA -PHRU, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B +0061 0F72 0F71 0EC8 0F71 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062; # (a◌ི◌ཱ◌່◌ཱb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0F71 0F72 0F71 0EC8 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062; # (a◌ཱ◌ི◌ཱ◌່b; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F72 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062; # (a◌ུ◌ི◌ཱ◌ིb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN I, LATIN SMALL LETTER B +0061 0F72 0F74 0F72 0F71 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062; # (a◌ི◌ུ◌ི◌ཱb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0321 0F74 0F72 0F74 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062; # (a◌̡◌ུ◌ི◌ུb; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; ) LATIN SMALL LETTER A, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 0F74 0321 0F74 0F72 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062;0061 0F72 0F74 0F74 0321 0062; # (a◌ུ◌̡◌ུ◌ིb; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; a◌ི◌ུ◌ུ◌̡b; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F7A 0062;0061 0F71 0F72 0F7A 0F74 0062;0061 0F71 0F72 0F7A 0F74 0062;0061 0F71 0F72 0F7A 0F74 0062;0061 0F71 0F72 0F7A 0F74 0062; # (a◌ུ◌ི◌ཱ◌ེb; a◌ཱ◌ི◌ེ◌ུb; a◌ཱ◌ི◌ེ◌ུb; a◌ཱ◌ི◌ེ◌ུb; a◌ཱ◌ི◌ེ◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN E, LATIN SMALL LETTER B +0061 0F7A 0F74 0F72 0F71 0062;0061 0F71 0F7A 0F72 0F74 0062;0061 0F71 0F7A 0F72 0F74 0062;0061 0F71 0F7A 0F72 0F74 0062;0061 0F71 0F7A 0F72 0F74 0062; # (a◌ེ◌ུ◌ི◌ཱb; a◌ཱ◌ེ◌ི◌ུb; a◌ཱ◌ེ◌ི◌ུb; a◌ཱ◌ེ◌ི◌ུb; a◌ཱ◌ེ◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN E, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F7B 0062;0061 0F71 0F72 0F7B 0F74 0062;0061 0F71 0F72 0F7B 0F74 0062;0061 0F71 0F72 0F7B 0F74 0062;0061 0F71 0F72 0F7B 0F74 0062; # (a◌ུ◌ི◌ཱ◌ཻb; a◌ཱ◌ི◌ཻ◌ུb; a◌ཱ◌ི◌ཻ◌ུb; a◌ཱ◌ི◌ཻ◌ུb; a◌ཱ◌ི◌ཻ◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN EE, LATIN SMALL LETTER B +0061 0F7B 0F74 0F72 0F71 0062;0061 0F71 0F7B 0F72 0F74 0062;0061 0F71 0F7B 0F72 0F74 0062;0061 0F71 0F7B 0F72 0F74 0062;0061 0F71 0F7B 0F72 0F74 0062; # (a◌ཻ◌ུ◌ི◌ཱb; a◌ཱ◌ཻ◌ི◌ུb; a◌ཱ◌ཻ◌ི◌ུb; a◌ཱ◌ཻ◌ི◌ུb; a◌ཱ◌ཻ◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN EE, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F7C 0062;0061 0F71 0F72 0F7C 0F74 0062;0061 0F71 0F72 0F7C 0F74 0062;0061 0F71 0F72 0F7C 0F74 0062;0061 0F71 0F72 0F7C 0F74 0062; # (a◌ུ◌ི◌ཱ◌ོb; a◌ཱ◌ི◌ོ◌ུb; a◌ཱ◌ི◌ོ◌ུb; a◌ཱ◌ི◌ོ◌ུb; a◌ཱ◌ི◌ོ◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN O, LATIN SMALL LETTER B +0061 0F7C 0F74 0F72 0F71 0062;0061 0F71 0F7C 0F72 0F74 0062;0061 0F71 0F7C 0F72 0F74 0062;0061 0F71 0F7C 0F72 0F74 0062;0061 0F71 0F7C 0F72 0F74 0062; # (a◌ོ◌ུ◌ི◌ཱb; a◌ཱ◌ོ◌ི◌ུb; a◌ཱ◌ོ◌ི◌ུb; a◌ཱ◌ོ◌ི◌ུb; a◌ཱ◌ོ◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN O, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F7D 0062;0061 0F71 0F72 0F7D 0F74 0062;0061 0F71 0F72 0F7D 0F74 0062;0061 0F71 0F72 0F7D 0F74 0062;0061 0F71 0F72 0F7D 0F74 0062; # (a◌ུ◌ི◌ཱ◌ཽb; a◌ཱ◌ི◌ཽ◌ུb; a◌ཱ◌ི◌ཽ◌ུb; a◌ཱ◌ི◌ཽ◌ུb; a◌ཱ◌ི◌ཽ◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN OO, LATIN SMALL LETTER B +0061 0F7D 0F74 0F72 0F71 0062;0061 0F71 0F7D 0F72 0F74 0062;0061 0F71 0F7D 0F72 0F74 0062;0061 0F71 0F7D 0F72 0F74 0062;0061 0F71 0F7D 0F72 0F74 0062; # (a◌ཽ◌ུ◌ི◌ཱb; a◌ཱ◌ཽ◌ི◌ུb; a◌ཱ◌ཽ◌ི◌ུb; a◌ཱ◌ཽ◌ི◌ུb; a◌ཱ◌ཽ◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN OO, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0F74 0F72 0F71 0F80 0062;0061 0F71 0F72 0F80 0F74 0062;0061 0F71 0F72 0F80 0F74 0062;0061 0F71 0F72 0F80 0F74 0062;0061 0F71 0F72 0F80 0F74 0062; # (a◌ུ◌ི◌ཱ◌ྀb; a◌ཱ◌ི◌ྀ◌ུb; a◌ཱ◌ི◌ྀ◌ུb; a◌ཱ◌ི◌ྀ◌ུb; a◌ཱ◌ི◌ྀ◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN REVERSED I, LATIN SMALL LETTER B +0061 0F80 0F74 0F72 0F71 0062;0061 0F71 0F80 0F72 0F74 0062;0061 0F71 0F80 0F72 0F74 0062;0061 0F71 0F80 0F72 0F74 0062;0061 0F71 0F80 0F72 0F74 0062; # (a◌ྀ◌ུ◌ི◌ཱb; a◌ཱ◌ྀ◌ི◌ུb; a◌ཱ◌ྀ◌ི◌ུb; a◌ཱ◌ྀ◌ི◌ུb; a◌ཱ◌ྀ◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN REVERSED I, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B +0061 0315 0300 05AE 0F82 0062;00E0 05AE 0F82 0315 0062;0061 05AE 0300 0F82 0315 0062;00E0 05AE 0F82 0315 0062;0061 05AE 0300 0F82 0315 0062; # (a◌̕◌̀◌֮◌ྂb; à◌֮◌ྂ◌̕b; a◌֮◌̀◌ྂ◌̕b; à◌֮◌ྂ◌̕b; a◌֮◌̀◌ྂ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TIBETAN SIGN NYI ZLA NAA DA, LATIN SMALL LETTER B +0061 0F82 0315 0300 05AE 0062;0061 05AE 0F82 0300 0315 0062;0061 05AE 0F82 0300 0315 0062;0061 05AE 0F82 0300 0315 0062;0061 05AE 0F82 0300 0315 0062; # (a◌ྂ◌̕◌̀◌֮b; a◌֮◌ྂ◌̀◌̕b; a◌֮◌ྂ◌̀◌̕b; a◌֮◌ྂ◌̀◌̕b; a◌֮◌ྂ◌̀◌̕b; ) LATIN SMALL LETTER A, TIBETAN SIGN NYI ZLA NAA DA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0F83 0062;00E0 05AE 0F83 0315 0062;0061 05AE 0300 0F83 0315 0062;00E0 05AE 0F83 0315 0062;0061 05AE 0300 0F83 0315 0062; # (a◌̕◌̀◌֮◌ྃb; à◌֮◌ྃ◌̕b; a◌֮◌̀◌ྃ◌̕b; à◌֮◌ྃ◌̕b; a◌֮◌̀◌ྃ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TIBETAN SIGN SNA LDAN, LATIN SMALL LETTER B +0061 0F83 0315 0300 05AE 0062;0061 05AE 0F83 0300 0315 0062;0061 05AE 0F83 0300 0315 0062;0061 05AE 0F83 0300 0315 0062;0061 05AE 0F83 0300 0315 0062; # (a◌ྃ◌̕◌̀◌֮b; a◌֮◌ྃ◌̀◌̕b; a◌֮◌ྃ◌̀◌̕b; a◌֮◌ྃ◌̀◌̕b; a◌֮◌ྃ◌̀◌̕b; ) LATIN SMALL LETTER A, TIBETAN SIGN SNA LDAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 0F84 0062;0061 3099 094D 0F84 05B0 0062;0061 3099 094D 0F84 05B0 0062;0061 3099 094D 0F84 05B0 0062;0061 3099 094D 0F84 05B0 0062; # (a◌ְ◌्◌゙◌྄b; a◌゙◌्◌྄◌ְb; a◌゙◌्◌྄◌ְb; a◌゙◌्◌྄◌ְb; a◌゙◌्◌྄◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TIBETAN MARK HALANTA, LATIN SMALL LETTER B +0061 0F84 05B0 094D 3099 0062;0061 3099 0F84 094D 05B0 0062;0061 3099 0F84 094D 05B0 0062;0061 3099 0F84 094D 05B0 0062;0061 3099 0F84 094D 05B0 0062; # (a◌྄◌ְ◌्◌゙b; a◌゙◌྄◌्◌ְb; a◌゙◌྄◌्◌ְb; a◌゙◌྄◌्◌ְb; a◌゙◌྄◌्◌ְb; ) LATIN SMALL LETTER A, TIBETAN MARK HALANTA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 0F86 0062;00E0 05AE 0F86 0315 0062;0061 05AE 0300 0F86 0315 0062;00E0 05AE 0F86 0315 0062;0061 05AE 0300 0F86 0315 0062; # (a◌̕◌̀◌֮◌྆b; à◌֮◌྆◌̕b; a◌֮◌̀◌྆◌̕b; à◌֮◌྆◌̕b; a◌֮◌̀◌྆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TIBETAN SIGN LCI RTAGS, LATIN SMALL LETTER B +0061 0F86 0315 0300 05AE 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062; # (a◌྆◌̕◌̀◌֮b; a◌֮◌྆◌̀◌̕b; a◌֮◌྆◌̀◌̕b; a◌֮◌྆◌̀◌̕b; a◌֮◌྆◌̀◌̕b; ) LATIN SMALL LETTER A, TIBETAN SIGN LCI RTAGS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 0F87 0062;00E0 05AE 0F87 0315 0062;0061 05AE 0300 0F87 0315 0062;00E0 05AE 0F87 0315 0062;0061 05AE 0300 0F87 0315 0062; # (a◌̕◌̀◌֮◌྇b; à◌֮◌྇◌̕b; a◌֮◌̀◌྇◌̕b; à◌֮◌྇◌̕b; a◌֮◌̀◌྇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TIBETAN SIGN YANG RTAGS, LATIN SMALL LETTER B +0061 0F87 0315 0300 05AE 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062; # (a◌྇◌̕◌̀◌֮b; a◌֮◌྇◌̀◌̕b; a◌֮◌྇◌̀◌̕b; a◌֮◌྇◌̀◌̕b; a◌֮◌྇◌̀◌̕b; ) LATIN SMALL LETTER A, TIBETAN SIGN YANG RTAGS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 0FC6 0062;0061 1DFA 0316 0FC6 059A 0062;0061 1DFA 0316 0FC6 059A 0062;0061 1DFA 0316 0FC6 059A 0062;0061 1DFA 0316 0FC6 059A 0062; # (a◌֚◌̖◌᷺◌࿆b; a◌᷺◌̖◌࿆◌֚b; a◌᷺◌̖◌࿆◌֚b; a◌᷺◌̖◌࿆◌֚b; a◌᷺◌̖◌࿆◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TIBETAN SYMBOL PADMA GDAN, LATIN SMALL LETTER B +0061 0FC6 059A 0316 1DFA 0062;0061 1DFA 0FC6 0316 059A 0062;0061 1DFA 0FC6 0316 059A 0062;0061 1DFA 0FC6 0316 059A 0062;0061 1DFA 0FC6 0316 059A 0062; # (a◌࿆◌֚◌̖◌᷺b; a◌᷺◌࿆◌̖◌֚b; a◌᷺◌࿆◌̖◌֚b; a◌᷺◌࿆◌̖◌֚b; a◌᷺◌࿆◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN SYMBOL PADMA GDAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 3099 093C 16FF0 1037 0062;0061 16FF0 093C 1037 3099 0062;0061 16FF0 093C 1037 3099 0062;0061 16FF0 093C 1037 3099 0062;0061 16FF0 093C 1037 3099 0062; # (a◌゙◌𖿰़◌့b; a𖿰◌़◌့◌゙b; a𖿰◌़◌့◌゙b; a𖿰◌़◌့◌゙b; a𖿰◌़◌့◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, MYANMAR SIGN DOT BELOW, LATIN SMALL LETTER B +0061 1037 3099 093C 16FF0 0062;0061 16FF0 1037 093C 3099 0062;0061 16FF0 1037 093C 3099 0062;0061 16FF0 1037 093C 3099 0062;0061 16FF0 1037 093C 3099 0062; # (a◌့◌゙◌𖿰़b; a𖿰◌့◌़◌゙b; a𖿰◌့◌़◌゙b; a𖿰◌့◌़◌゙b; a𖿰◌့◌़◌゙b; ) LATIN SMALL LETTER A, MYANMAR SIGN DOT BELOW, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 1039 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062; # (a◌ְ◌्◌゙◌္b; a◌゙◌्◌္◌ְb; a◌゙◌्◌္◌ְb; a◌゙◌्◌္◌ְb; a◌゙◌्◌္◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MYANMAR SIGN VIRAMA, LATIN SMALL LETTER B +0061 1039 05B0 094D 3099 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062; # (a◌္◌ְ◌्◌゙b; a◌゙◌္◌्◌ְb; a◌゙◌္◌्◌ְb; a◌゙◌္◌्◌ְb; a◌゙◌္◌्◌ְb; ) LATIN SMALL LETTER A, MYANMAR SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 103A 0062;0061 3099 094D 103A 05B0 0062;0061 3099 094D 103A 05B0 0062;0061 3099 094D 103A 05B0 0062;0061 3099 094D 103A 05B0 0062; # (a◌ְ◌्◌゙◌်b; a◌゙◌्◌်◌ְb; a◌゙◌्◌်◌ְb; a◌゙◌्◌်◌ְb; a◌゙◌्◌်◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MYANMAR SIGN ASAT, LATIN SMALL LETTER B +0061 103A 05B0 094D 3099 0062;0061 3099 103A 094D 05B0 0062;0061 3099 103A 094D 05B0 0062;0061 3099 103A 094D 05B0 0062;0061 3099 103A 094D 05B0 0062; # (a◌်◌ְ◌्◌゙b; a◌゙◌်◌्◌ְb; a◌゙◌်◌्◌ְb; a◌゙◌်◌्◌ְb; a◌゙◌်◌्◌ְb; ) LATIN SMALL LETTER A, MYANMAR SIGN ASAT, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 059A 0316 1DFA 108D 0062;0061 1DFA 0316 108D 059A 0062;0061 1DFA 0316 108D 059A 0062;0061 1DFA 0316 108D 059A 0062;0061 1DFA 0316 108D 059A 0062; # (a◌֚◌̖◌᷺◌ႍb; a◌᷺◌̖◌ႍ◌֚b; a◌᷺◌̖◌ႍ◌֚b; a◌᷺◌̖◌ႍ◌֚b; a◌᷺◌̖◌ႍ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE, LATIN SMALL LETTER B +0061 108D 059A 0316 1DFA 0062;0061 1DFA 108D 0316 059A 0062;0061 1DFA 108D 0316 059A 0062;0061 1DFA 108D 0316 059A 0062;0061 1DFA 108D 0316 059A 0062; # (a◌ႍ◌֚◌̖◌᷺b; a◌᷺◌ႍ◌̖◌֚b; a◌᷺◌ႍ◌̖◌֚b; a◌᷺◌ႍ◌̖◌֚b; a◌᷺◌ႍ◌̖◌֚b; ) LATIN SMALL LETTER A, MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 135D 0062;00E0 05AE 135D 0315 0062;0061 05AE 0300 135D 0315 0062;00E0 05AE 135D 0315 0062;0061 05AE 0300 135D 0315 0062; # (a◌̕◌̀◌֮◌፝b; à◌֮◌፝◌̕b; a◌֮◌̀◌፝◌̕b; à◌֮◌፝◌̕b; a◌֮◌̀◌፝◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK, LATIN SMALL LETTER B +0061 135D 0315 0300 05AE 0062;0061 05AE 135D 0300 0315 0062;0061 05AE 135D 0300 0315 0062;0061 05AE 135D 0300 0315 0062;0061 05AE 135D 0300 0315 0062; # (a◌፝◌̕◌̀◌֮b; a◌֮◌፝◌̀◌̕b; a◌֮◌፝◌̀◌̕b; a◌֮◌፝◌̀◌̕b; a◌֮◌፝◌̀◌̕b; ) LATIN SMALL LETTER A, ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 135E 0062;00E0 05AE 135E 0315 0062;0061 05AE 0300 135E 0315 0062;00E0 05AE 135E 0315 0062;0061 05AE 0300 135E 0315 0062; # (a◌̕◌̀◌֮◌፞b; à◌֮◌፞◌̕b; a◌֮◌̀◌፞◌̕b; à◌֮◌፞◌̕b; a◌֮◌̀◌፞◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ETHIOPIC COMBINING VOWEL LENGTH MARK, LATIN SMALL LETTER B +0061 135E 0315 0300 05AE 0062;0061 05AE 135E 0300 0315 0062;0061 05AE 135E 0300 0315 0062;0061 05AE 135E 0300 0315 0062;0061 05AE 135E 0300 0315 0062; # (a◌፞◌̕◌̀◌֮b; a◌֮◌፞◌̀◌̕b; a◌֮◌፞◌̀◌̕b; a◌֮◌፞◌̀◌̕b; a◌֮◌፞◌̀◌̕b; ) LATIN SMALL LETTER A, ETHIOPIC COMBINING VOWEL LENGTH MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 135F 0062;00E0 05AE 135F 0315 0062;0061 05AE 0300 135F 0315 0062;00E0 05AE 135F 0315 0062;0061 05AE 0300 135F 0315 0062; # (a◌̕◌̀◌֮◌፟b; à◌֮◌፟◌̕b; a◌֮◌̀◌፟◌̕b; à◌֮◌፟◌̕b; a◌֮◌̀◌፟◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ETHIOPIC COMBINING GEMINATION MARK, LATIN SMALL LETTER B +0061 135F 0315 0300 05AE 0062;0061 05AE 135F 0300 0315 0062;0061 05AE 135F 0300 0315 0062;0061 05AE 135F 0300 0315 0062;0061 05AE 135F 0300 0315 0062; # (a◌፟◌̕◌̀◌֮b; a◌֮◌፟◌̀◌̕b; a◌֮◌፟◌̀◌̕b; a◌֮◌፟◌̀◌̕b; a◌֮◌፟◌̀◌̕b; ) LATIN SMALL LETTER A, ETHIOPIC COMBINING GEMINATION MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 1714 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062; # (a◌ְ◌्◌゙◌᜔b; a◌゙◌्◌᜔◌ְb; a◌゙◌्◌᜔◌ְb; a◌゙◌्◌᜔◌ְb; a◌゙◌्◌᜔◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAGALOG SIGN VIRAMA, LATIN SMALL LETTER B +0061 1714 05B0 094D 3099 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062; # (a◌᜔◌ְ◌्◌゙b; a◌゙◌᜔◌्◌ְb; a◌゙◌᜔◌्◌ְb; a◌゙◌᜔◌्◌ְb; a◌゙◌᜔◌्◌ְb; ) LATIN SMALL LETTER A, TAGALOG SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 1715 0062;0061 3099 094D 1715 05B0 0062;0061 3099 094D 1715 05B0 0062;0061 3099 094D 1715 05B0 0062;0061 3099 094D 1715 05B0 0062; # (a◌ְ◌्◌゙᜕b; a◌゙◌्᜕◌ְb; a◌゙◌्᜕◌ְb; a◌゙◌्᜕◌ְb; a◌゙◌्᜕◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAGALOG SIGN PAMUDPOD, LATIN SMALL LETTER B +0061 1715 05B0 094D 3099 0062;0061 3099 1715 094D 05B0 0062;0061 3099 1715 094D 05B0 0062;0061 3099 1715 094D 05B0 0062;0061 3099 1715 094D 05B0 0062; # (a᜕◌ְ◌्◌゙b; a◌゙᜕◌्◌ְb; a◌゙᜕◌्◌ְb; a◌゙᜕◌्◌ְb; a◌゙᜕◌्◌ְb; ) LATIN SMALL LETTER A, TAGALOG SIGN PAMUDPOD, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 1734 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062; # (a◌ְ◌्◌゙᜴b; a◌゙◌्᜴◌ְb; a◌゙◌्᜴◌ְb; a◌゙◌्᜴◌ְb; a◌゙◌्᜴◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, HANUNOO SIGN PAMUDPOD, LATIN SMALL LETTER B +0061 1734 05B0 094D 3099 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062; # (a᜴◌ְ◌्◌゙b; a◌゙᜴◌्◌ְb; a◌゙᜴◌्◌ְb; a◌゙᜴◌्◌ְb; a◌゙᜴◌्◌ְb; ) LATIN SMALL LETTER A, HANUNOO SIGN PAMUDPOD, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 17D2 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062; # (a◌ְ◌्◌゙◌្b; a◌゙◌्◌្◌ְb; a◌゙◌्◌្◌ְb; a◌゙◌्◌្◌ְb; a◌゙◌्◌្◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KHMER SIGN COENG, LATIN SMALL LETTER B +0061 17D2 05B0 094D 3099 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062; # (a◌្◌ְ◌्◌゙b; a◌゙◌្◌्◌ְb; a◌゙◌្◌्◌ְb; a◌゙◌្◌्◌ְb; a◌゙◌្◌्◌ְb; ) LATIN SMALL LETTER A, KHMER SIGN COENG, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 17DD 0062;00E0 05AE 17DD 0315 0062;0061 05AE 0300 17DD 0315 0062;00E0 05AE 17DD 0315 0062;0061 05AE 0300 17DD 0315 0062; # (a◌̕◌̀◌֮◌៝b; à◌֮◌៝◌̕b; a◌֮◌̀◌៝◌̕b; à◌֮◌៝◌̕b; a◌֮◌̀◌៝◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, KHMER SIGN ATTHACAN, LATIN SMALL LETTER B +0061 17DD 0315 0300 05AE 0062;0061 05AE 17DD 0300 0315 0062;0061 05AE 17DD 0300 0315 0062;0061 05AE 17DD 0300 0315 0062;0061 05AE 17DD 0300 0315 0062; # (a◌៝◌̕◌̀◌֮b; a◌֮◌៝◌̀◌̕b; a◌֮◌៝◌̀◌̕b; a◌֮◌៝◌̀◌̕b; a◌֮◌៝◌̀◌̕b; ) LATIN SMALL LETTER A, KHMER SIGN ATTHACAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0300 05AE 1D16D 18A9 0062;00E0 1D16D 05AE 18A9 0062;0061 1D16D 05AE 18A9 0300 0062;00E0 1D16D 05AE 18A9 0062;0061 1D16D 05AE 18A9 0300 0062; # (a◌̀◌𝅭֮◌ᢩb; à𝅭◌֮◌ᢩb; a𝅭◌֮◌ᢩ◌̀b; à𝅭◌֮◌ᢩb; a𝅭◌֮◌ᢩ◌̀b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, MONGOLIAN LETTER ALI GALI DAGALGA, LATIN SMALL LETTER B +0061 18A9 0300 05AE 1D16D 0062;00E0 1D16D 18A9 05AE 0062;0061 1D16D 18A9 05AE 0300 0062;00E0 1D16D 18A9 05AE 0062;0061 1D16D 18A9 05AE 0300 0062; # (a◌ᢩ◌̀◌𝅭֮b; à𝅭◌ᢩ◌֮b; a𝅭◌ᢩ◌֮◌̀b; à𝅭◌ᢩ◌֮b; a𝅭◌ᢩ◌֮◌̀b; ) LATIN SMALL LETTER A, MONGOLIAN LETTER ALI GALI DAGALGA, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 302E 059A 0316 1939 0062;0061 0316 059A 1939 302E 0062;0061 0316 059A 1939 302E 0062;0061 0316 059A 1939 302E 0062;0061 0316 059A 1939 302E 0062; # (a〮◌֚◌̖◌᤹b; a◌̖◌֚◌᤹〮b; a◌̖◌֚◌᤹〮b; a◌̖◌֚◌᤹〮b; a◌̖◌֚◌᤹〮b; ) LATIN SMALL LETTER A, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, LIMBU SIGN MUKPHRENG, LATIN SMALL LETTER B +0061 1939 302E 059A 0316 0062;0061 0316 1939 059A 302E 0062;0061 0316 1939 059A 302E 0062;0061 0316 1939 059A 302E 0062;0061 0316 1939 059A 302E 0062; # (a◌᤹〮◌֚◌̖b; a◌̖◌᤹◌֚〮b; a◌̖◌᤹◌֚〮b; a◌̖◌᤹◌֚〮b; a◌̖◌᤹◌֚〮b; ) LATIN SMALL LETTER A, LIMBU SIGN MUKPHRENG, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B +0061 0315 0300 05AE 193A 0062;00E0 05AE 193A 0315 0062;0061 05AE 0300 193A 0315 0062;00E0 05AE 193A 0315 0062;0061 05AE 0300 193A 0315 0062; # (a◌̕◌̀◌֮◌᤺b; à◌֮◌᤺◌̕b; a◌֮◌̀◌᤺◌̕b; à◌֮◌᤺◌̕b; a◌֮◌̀◌᤺◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LIMBU SIGN KEMPHRENG, LATIN SMALL LETTER B +0061 193A 0315 0300 05AE 0062;0061 05AE 193A 0300 0315 0062;0061 05AE 193A 0300 0315 0062;0061 05AE 193A 0300 0315 0062;0061 05AE 193A 0300 0315 0062; # (a◌᤺◌̕◌̀◌֮b; a◌֮◌᤺◌̀◌̕b; a◌֮◌᤺◌̀◌̕b; a◌֮◌᤺◌̀◌̕b; a◌֮◌᤺◌̀◌̕b; ) LATIN SMALL LETTER A, LIMBU SIGN KEMPHRENG, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 193B 0062;0061 1DFA 0316 193B 059A 0062;0061 1DFA 0316 193B 059A 0062;0061 1DFA 0316 193B 059A 0062;0061 1DFA 0316 193B 059A 0062; # (a◌֚◌̖◌᷺◌᤻b; a◌᷺◌̖◌᤻◌֚b; a◌᷺◌̖◌᤻◌֚b; a◌᷺◌̖◌᤻◌֚b; a◌᷺◌̖◌᤻◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LIMBU SIGN SA-I, LATIN SMALL LETTER B +0061 193B 059A 0316 1DFA 0062;0061 1DFA 193B 0316 059A 0062;0061 1DFA 193B 0316 059A 0062;0061 1DFA 193B 0316 059A 0062;0061 1DFA 193B 0316 059A 0062; # (a◌᤻◌֚◌̖◌᷺b; a◌᷺◌᤻◌̖◌֚b; a◌᷺◌᤻◌̖◌֚b; a◌᷺◌᤻◌̖◌֚b; a◌᷺◌᤻◌̖◌֚b; ) LATIN SMALL LETTER A, LIMBU SIGN SA-I, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1A17 0062;00E0 05AE 1A17 0315 0062;0061 05AE 0300 1A17 0315 0062;00E0 05AE 1A17 0315 0062;0061 05AE 0300 1A17 0315 0062; # (a◌̕◌̀◌֮◌ᨗb; à◌֮◌ᨗ◌̕b; a◌֮◌̀◌ᨗ◌̕b; à◌֮◌ᨗ◌̕b; a◌֮◌̀◌ᨗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BUGINESE VOWEL SIGN I, LATIN SMALL LETTER B +0061 1A17 0315 0300 05AE 0062;0061 05AE 1A17 0300 0315 0062;0061 05AE 1A17 0300 0315 0062;0061 05AE 1A17 0300 0315 0062;0061 05AE 1A17 0300 0315 0062; # (a◌ᨗ◌̕◌̀◌֮b; a◌֮◌ᨗ◌̀◌̕b; a◌֮◌ᨗ◌̀◌̕b; a◌֮◌ᨗ◌̀◌̕b; a◌֮◌ᨗ◌̀◌̕b; ) LATIN SMALL LETTER A, BUGINESE VOWEL SIGN I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1A18 0062;0061 1DFA 0316 1A18 059A 0062;0061 1DFA 0316 1A18 059A 0062;0061 1DFA 0316 1A18 059A 0062;0061 1DFA 0316 1A18 059A 0062; # (a◌֚◌̖◌᷺◌ᨘb; a◌᷺◌̖◌ᨘ◌֚b; a◌᷺◌̖◌ᨘ◌֚b; a◌᷺◌̖◌ᨘ◌֚b; a◌᷺◌̖◌ᨘ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, BUGINESE VOWEL SIGN U, LATIN SMALL LETTER B +0061 1A18 059A 0316 1DFA 0062;0061 1DFA 1A18 0316 059A 0062;0061 1DFA 1A18 0316 059A 0062;0061 1DFA 1A18 0316 059A 0062;0061 1DFA 1A18 0316 059A 0062; # (a◌ᨘ◌֚◌̖◌᷺b; a◌᷺◌ᨘ◌̖◌֚b; a◌᷺◌ᨘ◌̖◌֚b; a◌᷺◌ᨘ◌̖◌֚b; a◌᷺◌ᨘ◌̖◌֚b; ) LATIN SMALL LETTER A, BUGINESE VOWEL SIGN U, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 05B0 094D 3099 1A60 0062;0061 3099 094D 1A60 05B0 0062;0061 3099 094D 1A60 05B0 0062;0061 3099 094D 1A60 05B0 0062;0061 3099 094D 1A60 05B0 0062; # (a◌ְ◌्◌゙◌᩠b; a◌゙◌्◌᩠◌ְb; a◌゙◌्◌᩠◌ְb; a◌゙◌्◌᩠◌ְb; a◌゙◌्◌᩠◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAI THAM SIGN SAKOT, LATIN SMALL LETTER B +0061 1A60 05B0 094D 3099 0062;0061 3099 1A60 094D 05B0 0062;0061 3099 1A60 094D 05B0 0062;0061 3099 1A60 094D 05B0 0062;0061 3099 1A60 094D 05B0 0062; # (a◌᩠◌ְ◌्◌゙b; a◌゙◌᩠◌्◌ְb; a◌゙◌᩠◌्◌ְb; a◌゙◌᩠◌्◌ְb; a◌゙◌᩠◌्◌ְb; ) LATIN SMALL LETTER A, TAI THAM SIGN SAKOT, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 1A75 0062;00E0 05AE 1A75 0315 0062;0061 05AE 0300 1A75 0315 0062;00E0 05AE 1A75 0315 0062;0061 05AE 0300 1A75 0315 0062; # (a◌̕◌̀◌֮◌᩵b; à◌֮◌᩵◌̕b; a◌֮◌̀◌᩵◌̕b; à◌֮◌᩵◌̕b; a◌֮◌̀◌᩵◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI THAM SIGN TONE-1, LATIN SMALL LETTER B +0061 1A75 0315 0300 05AE 0062;0061 05AE 1A75 0300 0315 0062;0061 05AE 1A75 0300 0315 0062;0061 05AE 1A75 0300 0315 0062;0061 05AE 1A75 0300 0315 0062; # (a◌᩵◌̕◌̀◌֮b; a◌֮◌᩵◌̀◌̕b; a◌֮◌᩵◌̀◌̕b; a◌֮◌᩵◌̀◌̕b; a◌֮◌᩵◌̀◌̕b; ) LATIN SMALL LETTER A, TAI THAM SIGN TONE-1, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1A76 0062;00E0 05AE 1A76 0315 0062;0061 05AE 0300 1A76 0315 0062;00E0 05AE 1A76 0315 0062;0061 05AE 0300 1A76 0315 0062; # (a◌̕◌̀◌֮◌᩶b; à◌֮◌᩶◌̕b; a◌֮◌̀◌᩶◌̕b; à◌֮◌᩶◌̕b; a◌֮◌̀◌᩶◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI THAM SIGN TONE-2, LATIN SMALL LETTER B +0061 1A76 0315 0300 05AE 0062;0061 05AE 1A76 0300 0315 0062;0061 05AE 1A76 0300 0315 0062;0061 05AE 1A76 0300 0315 0062;0061 05AE 1A76 0300 0315 0062; # (a◌᩶◌̕◌̀◌֮b; a◌֮◌᩶◌̀◌̕b; a◌֮◌᩶◌̀◌̕b; a◌֮◌᩶◌̀◌̕b; a◌֮◌᩶◌̀◌̕b; ) LATIN SMALL LETTER A, TAI THAM SIGN TONE-2, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1A77 0062;00E0 05AE 1A77 0315 0062;0061 05AE 0300 1A77 0315 0062;00E0 05AE 1A77 0315 0062;0061 05AE 0300 1A77 0315 0062; # (a◌̕◌̀◌֮◌᩷b; à◌֮◌᩷◌̕b; a◌֮◌̀◌᩷◌̕b; à◌֮◌᩷◌̕b; a◌֮◌̀◌᩷◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI THAM SIGN KHUEN TONE-3, LATIN SMALL LETTER B +0061 1A77 0315 0300 05AE 0062;0061 05AE 1A77 0300 0315 0062;0061 05AE 1A77 0300 0315 0062;0061 05AE 1A77 0300 0315 0062;0061 05AE 1A77 0300 0315 0062; # (a◌᩷◌̕◌̀◌֮b; a◌֮◌᩷◌̀◌̕b; a◌֮◌᩷◌̀◌̕b; a◌֮◌᩷◌̀◌̕b; a◌֮◌᩷◌̀◌̕b; ) LATIN SMALL LETTER A, TAI THAM SIGN KHUEN TONE-3, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1A78 0062;00E0 05AE 1A78 0315 0062;0061 05AE 0300 1A78 0315 0062;00E0 05AE 1A78 0315 0062;0061 05AE 0300 1A78 0315 0062; # (a◌̕◌̀◌֮◌᩸b; à◌֮◌᩸◌̕b; a◌֮◌̀◌᩸◌̕b; à◌֮◌᩸◌̕b; a◌֮◌̀◌᩸◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI THAM SIGN KHUEN TONE-4, LATIN SMALL LETTER B +0061 1A78 0315 0300 05AE 0062;0061 05AE 1A78 0300 0315 0062;0061 05AE 1A78 0300 0315 0062;0061 05AE 1A78 0300 0315 0062;0061 05AE 1A78 0300 0315 0062; # (a◌᩸◌̕◌̀◌֮b; a◌֮◌᩸◌̀◌̕b; a◌֮◌᩸◌̀◌̕b; a◌֮◌᩸◌̀◌̕b; a◌֮◌᩸◌̀◌̕b; ) LATIN SMALL LETTER A, TAI THAM SIGN KHUEN TONE-4, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1A79 0062;00E0 05AE 1A79 0315 0062;0061 05AE 0300 1A79 0315 0062;00E0 05AE 1A79 0315 0062;0061 05AE 0300 1A79 0315 0062; # (a◌̕◌̀◌֮◌᩹b; à◌֮◌᩹◌̕b; a◌֮◌̀◌᩹◌̕b; à◌֮◌᩹◌̕b; a◌֮◌̀◌᩹◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI THAM SIGN KHUEN TONE-5, LATIN SMALL LETTER B +0061 1A79 0315 0300 05AE 0062;0061 05AE 1A79 0300 0315 0062;0061 05AE 1A79 0300 0315 0062;0061 05AE 1A79 0300 0315 0062;0061 05AE 1A79 0300 0315 0062; # (a◌᩹◌̕◌̀◌֮b; a◌֮◌᩹◌̀◌̕b; a◌֮◌᩹◌̀◌̕b; a◌֮◌᩹◌̀◌̕b; a◌֮◌᩹◌̀◌̕b; ) LATIN SMALL LETTER A, TAI THAM SIGN KHUEN TONE-5, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1A7A 0062;00E0 05AE 1A7A 0315 0062;0061 05AE 0300 1A7A 0315 0062;00E0 05AE 1A7A 0315 0062;0061 05AE 0300 1A7A 0315 0062; # (a◌̕◌̀◌֮◌᩺b; à◌֮◌᩺◌̕b; a◌֮◌̀◌᩺◌̕b; à◌֮◌᩺◌̕b; a◌֮◌̀◌᩺◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI THAM SIGN RA HAAM, LATIN SMALL LETTER B +0061 1A7A 0315 0300 05AE 0062;0061 05AE 1A7A 0300 0315 0062;0061 05AE 1A7A 0300 0315 0062;0061 05AE 1A7A 0300 0315 0062;0061 05AE 1A7A 0300 0315 0062; # (a◌᩺◌̕◌̀◌֮b; a◌֮◌᩺◌̀◌̕b; a◌֮◌᩺◌̀◌̕b; a◌֮◌᩺◌̀◌̕b; a◌֮◌᩺◌̀◌̕b; ) LATIN SMALL LETTER A, TAI THAM SIGN RA HAAM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1A7B 0062;00E0 05AE 1A7B 0315 0062;0061 05AE 0300 1A7B 0315 0062;00E0 05AE 1A7B 0315 0062;0061 05AE 0300 1A7B 0315 0062; # (a◌̕◌̀◌֮◌᩻b; à◌֮◌᩻◌̕b; a◌֮◌̀◌᩻◌̕b; à◌֮◌᩻◌̕b; a◌֮◌̀◌᩻◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI THAM SIGN MAI SAM, LATIN SMALL LETTER B +0061 1A7B 0315 0300 05AE 0062;0061 05AE 1A7B 0300 0315 0062;0061 05AE 1A7B 0300 0315 0062;0061 05AE 1A7B 0300 0315 0062;0061 05AE 1A7B 0300 0315 0062; # (a◌᩻◌̕◌̀◌֮b; a◌֮◌᩻◌̀◌̕b; a◌֮◌᩻◌̀◌̕b; a◌֮◌᩻◌̀◌̕b; a◌֮◌᩻◌̀◌̕b; ) LATIN SMALL LETTER A, TAI THAM SIGN MAI SAM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1A7C 0062;00E0 05AE 1A7C 0315 0062;0061 05AE 0300 1A7C 0315 0062;00E0 05AE 1A7C 0315 0062;0061 05AE 0300 1A7C 0315 0062; # (a◌̕◌̀◌֮◌᩼b; à◌֮◌᩼◌̕b; a◌֮◌̀◌᩼◌̕b; à◌֮◌᩼◌̕b; a◌֮◌̀◌᩼◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI THAM SIGN KHUEN-LUE KARAN, LATIN SMALL LETTER B +0061 1A7C 0315 0300 05AE 0062;0061 05AE 1A7C 0300 0315 0062;0061 05AE 1A7C 0300 0315 0062;0061 05AE 1A7C 0300 0315 0062;0061 05AE 1A7C 0300 0315 0062; # (a◌᩼◌̕◌̀◌֮b; a◌֮◌᩼◌̀◌̕b; a◌֮◌᩼◌̀◌̕b; a◌֮◌᩼◌̀◌̕b; a◌֮◌᩼◌̀◌̕b; ) LATIN SMALL LETTER A, TAI THAM SIGN KHUEN-LUE KARAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1A7F 0062;0061 1DFA 0316 1A7F 059A 0062;0061 1DFA 0316 1A7F 059A 0062;0061 1DFA 0316 1A7F 059A 0062;0061 1DFA 0316 1A7F 059A 0062; # (a◌֚◌̖◌᷺◌᩿b; a◌᷺◌̖◌᩿◌֚b; a◌᷺◌̖◌᩿◌֚b; a◌᷺◌̖◌᩿◌֚b; a◌᷺◌̖◌᩿◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TAI THAM COMBINING CRYPTOGRAMMIC DOT, LATIN SMALL LETTER B +0061 1A7F 059A 0316 1DFA 0062;0061 1DFA 1A7F 0316 059A 0062;0061 1DFA 1A7F 0316 059A 0062;0061 1DFA 1A7F 0316 059A 0062;0061 1DFA 1A7F 0316 059A 0062; # (a◌᩿◌֚◌̖◌᷺b; a◌᷺◌᩿◌̖◌֚b; a◌᷺◌᩿◌̖◌֚b; a◌᷺◌᩿◌̖◌֚b; a◌᷺◌᩿◌̖◌֚b; ) LATIN SMALL LETTER A, TAI THAM COMBINING CRYPTOGRAMMIC DOT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AB0 0062;00E0 05AE 1AB0 0315 0062;0061 05AE 0300 1AB0 0315 0062;00E0 05AE 1AB0 0315 0062;0061 05AE 0300 1AB0 0315 0062; # (a◌̕◌̀◌֮◌᪰b; à◌֮◌᪰◌̕b; a◌֮◌̀◌᪰◌̕b; à◌֮◌᪰◌̕b; a◌֮◌̀◌᪰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLED CIRCUMFLEX ACCENT, LATIN SMALL LETTER B +0061 1AB0 0315 0300 05AE 0062;0061 05AE 1AB0 0300 0315 0062;0061 05AE 1AB0 0300 0315 0062;0061 05AE 1AB0 0300 0315 0062;0061 05AE 1AB0 0300 0315 0062; # (a◌᪰◌̕◌̀◌֮b; a◌֮◌᪰◌̀◌̕b; a◌֮◌᪰◌̀◌̕b; a◌֮◌᪰◌̀◌̕b; a◌֮◌᪰◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLED CIRCUMFLEX ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AB1 0062;00E0 05AE 1AB1 0315 0062;0061 05AE 0300 1AB1 0315 0062;00E0 05AE 1AB1 0315 0062;0061 05AE 0300 1AB1 0315 0062; # (a◌̕◌̀◌֮◌᪱b; à◌֮◌᪱◌̕b; a◌֮◌̀◌᪱◌̕b; à◌֮◌᪱◌̕b; a◌֮◌̀◌᪱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DIAERESIS-RING, LATIN SMALL LETTER B +0061 1AB1 0315 0300 05AE 0062;0061 05AE 1AB1 0300 0315 0062;0061 05AE 1AB1 0300 0315 0062;0061 05AE 1AB1 0300 0315 0062;0061 05AE 1AB1 0300 0315 0062; # (a◌᪱◌̕◌̀◌֮b; a◌֮◌᪱◌̀◌̕b; a◌֮◌᪱◌̀◌̕b; a◌֮◌᪱◌̀◌̕b; a◌֮◌᪱◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DIAERESIS-RING, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AB2 0062;00E0 05AE 1AB2 0315 0062;0061 05AE 0300 1AB2 0315 0062;00E0 05AE 1AB2 0315 0062;0061 05AE 0300 1AB2 0315 0062; # (a◌̕◌̀◌֮◌᪲b; à◌֮◌᪲◌̕b; a◌֮◌̀◌᪲◌̕b; à◌֮◌᪲◌̕b; a◌֮◌̀◌᪲◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING INFINITY, LATIN SMALL LETTER B +0061 1AB2 0315 0300 05AE 0062;0061 05AE 1AB2 0300 0315 0062;0061 05AE 1AB2 0300 0315 0062;0061 05AE 1AB2 0300 0315 0062;0061 05AE 1AB2 0300 0315 0062; # (a◌᪲◌̕◌̀◌֮b; a◌֮◌᪲◌̀◌̕b; a◌֮◌᪲◌̀◌̕b; a◌֮◌᪲◌̀◌̕b; a◌֮◌᪲◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING INFINITY, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AB3 0062;00E0 05AE 1AB3 0315 0062;0061 05AE 0300 1AB3 0315 0062;00E0 05AE 1AB3 0315 0062;0061 05AE 0300 1AB3 0315 0062; # (a◌̕◌̀◌֮◌᪳b; à◌֮◌᪳◌̕b; a◌֮◌̀◌᪳◌̕b; à◌֮◌᪳◌̕b; a◌֮◌̀◌᪳◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOWNWARDS ARROW, LATIN SMALL LETTER B +0061 1AB3 0315 0300 05AE 0062;0061 05AE 1AB3 0300 0315 0062;0061 05AE 1AB3 0300 0315 0062;0061 05AE 1AB3 0300 0315 0062;0061 05AE 1AB3 0300 0315 0062; # (a◌᪳◌̕◌̀◌֮b; a◌֮◌᪳◌̀◌̕b; a◌֮◌᪳◌̀◌̕b; a◌֮◌᪳◌̀◌̕b; a◌֮◌᪳◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOWNWARDS ARROW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AB4 0062;00E0 05AE 1AB4 0315 0062;0061 05AE 0300 1AB4 0315 0062;00E0 05AE 1AB4 0315 0062;0061 05AE 0300 1AB4 0315 0062; # (a◌̕◌̀◌֮◌᪴b; à◌֮◌᪴◌̕b; a◌֮◌̀◌᪴◌̕b; à◌֮◌᪴◌̕b; a◌֮◌̀◌᪴◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING TRIPLE DOT, LATIN SMALL LETTER B +0061 1AB4 0315 0300 05AE 0062;0061 05AE 1AB4 0300 0315 0062;0061 05AE 1AB4 0300 0315 0062;0061 05AE 1AB4 0300 0315 0062;0061 05AE 1AB4 0300 0315 0062; # (a◌᪴◌̕◌̀◌֮b; a◌֮◌᪴◌̀◌̕b; a◌֮◌᪴◌̀◌̕b; a◌֮◌᪴◌̀◌̕b; a◌֮◌᪴◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING TRIPLE DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1AB5 0062;0061 1DFA 0316 1AB5 059A 0062;0061 1DFA 0316 1AB5 059A 0062;0061 1DFA 0316 1AB5 059A 0062;0061 1DFA 0316 1AB5 059A 0062; # (a◌֚◌̖◌᷺◌᪵b; a◌᷺◌̖◌᪵◌֚b; a◌᷺◌̖◌᪵◌֚b; a◌᷺◌̖◌᪵◌֚b; a◌᷺◌̖◌᪵◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING X-X BELOW, LATIN SMALL LETTER B +0061 1AB5 059A 0316 1DFA 0062;0061 1DFA 1AB5 0316 059A 0062;0061 1DFA 1AB5 0316 059A 0062;0061 1DFA 1AB5 0316 059A 0062;0061 1DFA 1AB5 0316 059A 0062; # (a◌᪵◌֚◌̖◌᷺b; a◌᷺◌᪵◌̖◌֚b; a◌᷺◌᪵◌̖◌֚b; a◌᷺◌᪵◌̖◌֚b; a◌᷺◌᪵◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING X-X BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1AB6 0062;0061 1DFA 0316 1AB6 059A 0062;0061 1DFA 0316 1AB6 059A 0062;0061 1DFA 0316 1AB6 059A 0062;0061 1DFA 0316 1AB6 059A 0062; # (a◌֚◌̖◌᷺◌᪶b; a◌᷺◌̖◌᪶◌֚b; a◌᷺◌̖◌᪶◌֚b; a◌᷺◌̖◌᪶◌֚b; a◌᷺◌̖◌᪶◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING WIGGLY LINE BELOW, LATIN SMALL LETTER B +0061 1AB6 059A 0316 1DFA 0062;0061 1DFA 1AB6 0316 059A 0062;0061 1DFA 1AB6 0316 059A 0062;0061 1DFA 1AB6 0316 059A 0062;0061 1DFA 1AB6 0316 059A 0062; # (a◌᪶◌֚◌̖◌᷺b; a◌᷺◌᪶◌̖◌֚b; a◌᷺◌᪶◌̖◌֚b; a◌᷺◌᪶◌̖◌֚b; a◌᷺◌᪶◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING WIGGLY LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1AB7 0062;0061 1DFA 0316 1AB7 059A 0062;0061 1DFA 0316 1AB7 059A 0062;0061 1DFA 0316 1AB7 059A 0062;0061 1DFA 0316 1AB7 059A 0062; # (a◌֚◌̖◌᷺◌᪷b; a◌᷺◌̖◌᪷◌֚b; a◌᷺◌̖◌᪷◌֚b; a◌᷺◌̖◌᪷◌֚b; a◌᷺◌̖◌᪷◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING OPEN MARK BELOW, LATIN SMALL LETTER B +0061 1AB7 059A 0316 1DFA 0062;0061 1DFA 1AB7 0316 059A 0062;0061 1DFA 1AB7 0316 059A 0062;0061 1DFA 1AB7 0316 059A 0062;0061 1DFA 1AB7 0316 059A 0062; # (a◌᪷◌֚◌̖◌᷺b; a◌᷺◌᪷◌̖◌֚b; a◌᷺◌᪷◌̖◌֚b; a◌᷺◌᪷◌̖◌֚b; a◌᷺◌᪷◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING OPEN MARK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1AB8 0062;0061 1DFA 0316 1AB8 059A 0062;0061 1DFA 0316 1AB8 059A 0062;0061 1DFA 0316 1AB8 059A 0062;0061 1DFA 0316 1AB8 059A 0062; # (a◌֚◌̖◌᷺◌᪸b; a◌᷺◌̖◌᪸◌֚b; a◌᷺◌̖◌᪸◌֚b; a◌᷺◌̖◌᪸◌֚b; a◌᷺◌̖◌᪸◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOUBLE OPEN MARK BELOW, LATIN SMALL LETTER B +0061 1AB8 059A 0316 1DFA 0062;0061 1DFA 1AB8 0316 059A 0062;0061 1DFA 1AB8 0316 059A 0062;0061 1DFA 1AB8 0316 059A 0062;0061 1DFA 1AB8 0316 059A 0062; # (a◌᪸◌֚◌̖◌᷺b; a◌᷺◌᪸◌̖◌֚b; a◌᷺◌᪸◌̖◌֚b; a◌᷺◌᪸◌̖◌֚b; a◌᷺◌᪸◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE OPEN MARK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1AB9 0062;0061 1DFA 0316 1AB9 059A 0062;0061 1DFA 0316 1AB9 059A 0062;0061 1DFA 0316 1AB9 059A 0062;0061 1DFA 0316 1AB9 059A 0062; # (a◌֚◌̖◌᷺◌᪹b; a◌᷺◌̖◌᪹◌֚b; a◌᷺◌̖◌᪹◌֚b; a◌᷺◌̖◌᪹◌֚b; a◌᷺◌̖◌᪹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LIGHT CENTRALIZATION STROKE BELOW, LATIN SMALL LETTER B +0061 1AB9 059A 0316 1DFA 0062;0061 1DFA 1AB9 0316 059A 0062;0061 1DFA 1AB9 0316 059A 0062;0061 1DFA 1AB9 0316 059A 0062;0061 1DFA 1AB9 0316 059A 0062; # (a◌᪹◌֚◌̖◌᷺b; a◌᷺◌᪹◌̖◌֚b; a◌᷺◌᪹◌̖◌֚b; a◌᷺◌᪹◌̖◌֚b; a◌᷺◌᪹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LIGHT CENTRALIZATION STROKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1ABA 0062;0061 1DFA 0316 1ABA 059A 0062;0061 1DFA 0316 1ABA 059A 0062;0061 1DFA 0316 1ABA 059A 0062;0061 1DFA 0316 1ABA 059A 0062; # (a◌֚◌̖◌᷺◌᪺b; a◌᷺◌̖◌᪺◌֚b; a◌᷺◌̖◌᪺◌֚b; a◌᷺◌̖◌᪺◌֚b; a◌᷺◌̖◌᪺◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING STRONG CENTRALIZATION STROKE BELOW, LATIN SMALL LETTER B +0061 1ABA 059A 0316 1DFA 0062;0061 1DFA 1ABA 0316 059A 0062;0061 1DFA 1ABA 0316 059A 0062;0061 1DFA 1ABA 0316 059A 0062;0061 1DFA 1ABA 0316 059A 0062; # (a◌᪺◌֚◌̖◌᷺b; a◌᷺◌᪺◌̖◌֚b; a◌᷺◌᪺◌̖◌֚b; a◌᷺◌᪺◌̖◌֚b; a◌᷺◌᪺◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING STRONG CENTRALIZATION STROKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1ABB 0062;00E0 05AE 1ABB 0315 0062;0061 05AE 0300 1ABB 0315 0062;00E0 05AE 1ABB 0315 0062;0061 05AE 0300 1ABB 0315 0062; # (a◌̕◌̀◌֮◌᪻b; à◌֮◌᪻◌̕b; a◌֮◌̀◌᪻◌̕b; à◌֮◌᪻◌̕b; a◌֮◌̀◌᪻◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING PARENTHESES ABOVE, LATIN SMALL LETTER B +0061 1ABB 0315 0300 05AE 0062;0061 05AE 1ABB 0300 0315 0062;0061 05AE 1ABB 0300 0315 0062;0061 05AE 1ABB 0300 0315 0062;0061 05AE 1ABB 0300 0315 0062; # (a◌᪻◌̕◌̀◌֮b; a◌֮◌᪻◌̀◌̕b; a◌֮◌᪻◌̀◌̕b; a◌֮◌᪻◌̀◌̕b; a◌֮◌᪻◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING PARENTHESES ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1ABC 0062;00E0 05AE 1ABC 0315 0062;0061 05AE 0300 1ABC 0315 0062;00E0 05AE 1ABC 0315 0062;0061 05AE 0300 1ABC 0315 0062; # (a◌̕◌̀◌֮◌᪼b; à◌֮◌᪼◌̕b; a◌֮◌̀◌᪼◌̕b; à◌֮◌᪼◌̕b; a◌֮◌̀◌᪼◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE PARENTHESES ABOVE, LATIN SMALL LETTER B +0061 1ABC 0315 0300 05AE 0062;0061 05AE 1ABC 0300 0315 0062;0061 05AE 1ABC 0300 0315 0062;0061 05AE 1ABC 0300 0315 0062;0061 05AE 1ABC 0300 0315 0062; # (a◌᪼◌̕◌̀◌֮b; a◌֮◌᪼◌̀◌̕b; a◌֮◌᪼◌̀◌̕b; a◌֮◌᪼◌̀◌̕b; a◌֮◌᪼◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE PARENTHESES ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1ABD 0062;0061 1DFA 0316 1ABD 059A 0062;0061 1DFA 0316 1ABD 059A 0062;0061 1DFA 0316 1ABD 059A 0062;0061 1DFA 0316 1ABD 059A 0062; # (a◌֚◌̖◌᷺◌᪽b; a◌᷺◌̖◌᪽◌֚b; a◌᷺◌̖◌᪽◌֚b; a◌᷺◌̖◌᪽◌֚b; a◌᷺◌̖◌᪽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING PARENTHESES BELOW, LATIN SMALL LETTER B +0061 1ABD 059A 0316 1DFA 0062;0061 1DFA 1ABD 0316 059A 0062;0061 1DFA 1ABD 0316 059A 0062;0061 1DFA 1ABD 0316 059A 0062;0061 1DFA 1ABD 0316 059A 0062; # (a◌᪽◌֚◌̖◌᷺b; a◌᷺◌᪽◌̖◌֚b; a◌᷺◌᪽◌̖◌֚b; a◌᷺◌᪽◌̖◌֚b; a◌᷺◌᪽◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING PARENTHESES BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1ABF 0062;0061 1DFA 0316 1ABF 059A 0062;0061 1DFA 0316 1ABF 059A 0062;0061 1DFA 0316 1ABF 059A 0062;0061 1DFA 0316 1ABF 059A 0062; # (a◌֚◌̖◌᷺◌ᪿb; a◌᷺◌̖◌ᪿ◌֚b; a◌᷺◌̖◌ᪿ◌֚b; a◌᷺◌̖◌ᪿ◌֚b; a◌᷺◌̖◌ᪿ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LATIN SMALL LETTER W BELOW, LATIN SMALL LETTER B +0061 1ABF 059A 0316 1DFA 0062;0061 1DFA 1ABF 0316 059A 0062;0061 1DFA 1ABF 0316 059A 0062;0061 1DFA 1ABF 0316 059A 0062;0061 1DFA 1ABF 0316 059A 0062; # (a◌ᪿ◌֚◌̖◌᷺b; a◌᷺◌ᪿ◌̖◌֚b; a◌᷺◌ᪿ◌̖◌֚b; a◌᷺◌ᪿ◌̖◌֚b; a◌᷺◌ᪿ◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER W BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1AC0 0062;0061 1DFA 0316 1AC0 059A 0062;0061 1DFA 0316 1AC0 059A 0062;0061 1DFA 0316 1AC0 059A 0062;0061 1DFA 0316 1AC0 059A 0062; # (a◌֚◌̖◌᷺◌ᫀb; a◌᷺◌̖◌ᫀ◌֚b; a◌᷺◌̖◌ᫀ◌֚b; a◌᷺◌̖◌ᫀ◌֚b; a◌᷺◌̖◌ᫀ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LATIN SMALL LETTER TURNED W BELOW, LATIN SMALL LETTER B +0061 1AC0 059A 0316 1DFA 0062;0061 1DFA 1AC0 0316 059A 0062;0061 1DFA 1AC0 0316 059A 0062;0061 1DFA 1AC0 0316 059A 0062;0061 1DFA 1AC0 0316 059A 0062; # (a◌ᫀ◌֚◌̖◌᷺b; a◌᷺◌ᫀ◌̖◌֚b; a◌᷺◌ᫀ◌̖◌֚b; a◌᷺◌ᫀ◌̖◌֚b; a◌᷺◌ᫀ◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER TURNED W BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AC1 0062;00E0 05AE 1AC1 0315 0062;0061 05AE 0300 1AC1 0315 0062;00E0 05AE 1AC1 0315 0062;0061 05AE 0300 1AC1 0315 0062; # (a◌̕◌̀◌֮◌᫁b; à◌֮◌᫁◌̕b; a◌֮◌̀◌᫁◌̕b; à◌֮◌᫁◌̕b; a◌֮◌̀◌᫁◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT PARENTHESIS ABOVE LEFT, LATIN SMALL LETTER B +0061 1AC1 0315 0300 05AE 0062;0061 05AE 1AC1 0300 0315 0062;0061 05AE 1AC1 0300 0315 0062;0061 05AE 1AC1 0300 0315 0062;0061 05AE 1AC1 0300 0315 0062; # (a◌᫁◌̕◌̀◌֮b; a◌֮◌᫁◌̀◌̕b; a◌֮◌᫁◌̀◌̕b; a◌֮◌᫁◌̀◌̕b; a◌֮◌᫁◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT PARENTHESIS ABOVE LEFT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AC2 0062;00E0 05AE 1AC2 0315 0062;0061 05AE 0300 1AC2 0315 0062;00E0 05AE 1AC2 0315 0062;0061 05AE 0300 1AC2 0315 0062; # (a◌̕◌̀◌֮◌᫂b; à◌֮◌᫂◌̕b; a◌֮◌̀◌᫂◌̕b; à◌֮◌᫂◌̕b; a◌֮◌̀◌᫂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT PARENTHESIS ABOVE RIGHT, LATIN SMALL LETTER B +0061 1AC2 0315 0300 05AE 0062;0061 05AE 1AC2 0300 0315 0062;0061 05AE 1AC2 0300 0315 0062;0061 05AE 1AC2 0300 0315 0062;0061 05AE 1AC2 0300 0315 0062; # (a◌᫂◌̕◌̀◌֮b; a◌֮◌᫂◌̀◌̕b; a◌֮◌᫂◌̀◌̕b; a◌֮◌᫂◌̀◌̕b; a◌֮◌᫂◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RIGHT PARENTHESIS ABOVE RIGHT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1AC3 0062;0061 1DFA 0316 1AC3 059A 0062;0061 1DFA 0316 1AC3 059A 0062;0061 1DFA 0316 1AC3 059A 0062;0061 1DFA 0316 1AC3 059A 0062; # (a◌֚◌̖◌᷺◌᫃b; a◌᷺◌̖◌᫃◌֚b; a◌᷺◌̖◌᫃◌֚b; a◌᷺◌̖◌᫃◌֚b; a◌᷺◌̖◌᫃◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT PARENTHESIS BELOW LEFT, LATIN SMALL LETTER B +0061 1AC3 059A 0316 1DFA 0062;0061 1DFA 1AC3 0316 059A 0062;0061 1DFA 1AC3 0316 059A 0062;0061 1DFA 1AC3 0316 059A 0062;0061 1DFA 1AC3 0316 059A 0062; # (a◌᫃◌֚◌̖◌᷺b; a◌᷺◌᫃◌̖◌֚b; a◌᷺◌᫃◌̖◌֚b; a◌᷺◌᫃◌̖◌֚b; a◌᷺◌᫃◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT PARENTHESIS BELOW LEFT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1AC4 0062;0061 1DFA 0316 1AC4 059A 0062;0061 1DFA 0316 1AC4 059A 0062;0061 1DFA 0316 1AC4 059A 0062;0061 1DFA 0316 1AC4 059A 0062; # (a◌֚◌̖◌᷺◌᫄b; a◌᷺◌̖◌᫄◌֚b; a◌᷺◌̖◌᫄◌֚b; a◌᷺◌̖◌᫄◌֚b; a◌᷺◌̖◌᫄◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT PARENTHESIS BELOW RIGHT, LATIN SMALL LETTER B +0061 1AC4 059A 0316 1DFA 0062;0061 1DFA 1AC4 0316 059A 0062;0061 1DFA 1AC4 0316 059A 0062;0061 1DFA 1AC4 0316 059A 0062;0061 1DFA 1AC4 0316 059A 0062; # (a◌᫄◌֚◌̖◌᷺b; a◌᷺◌᫄◌̖◌֚b; a◌᷺◌᫄◌̖◌֚b; a◌᷺◌᫄◌̖◌֚b; a◌᷺◌᫄◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT PARENTHESIS BELOW RIGHT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AC5 0062;00E0 05AE 1AC5 0315 0062;0061 05AE 0300 1AC5 0315 0062;00E0 05AE 1AC5 0315 0062;0061 05AE 0300 1AC5 0315 0062; # (a◌̕◌̀◌֮◌᫅b; à◌֮◌᫅◌̕b; a◌֮◌̀◌᫅◌̕b; à◌֮◌᫅◌̕b; a◌֮◌̀◌᫅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING SQUARE BRACKETS ABOVE, LATIN SMALL LETTER B +0061 1AC5 0315 0300 05AE 0062;0061 05AE 1AC5 0300 0315 0062;0061 05AE 1AC5 0300 0315 0062;0061 05AE 1AC5 0300 0315 0062;0061 05AE 1AC5 0300 0315 0062; # (a◌᫅◌̕◌̀◌֮b; a◌֮◌᫅◌̀◌̕b; a◌֮◌᫅◌̀◌̕b; a◌֮◌᫅◌̀◌̕b; a◌֮◌᫅◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING SQUARE BRACKETS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AC6 0062;00E0 05AE 1AC6 0315 0062;0061 05AE 0300 1AC6 0315 0062;00E0 05AE 1AC6 0315 0062;0061 05AE 0300 1AC6 0315 0062; # (a◌̕◌̀◌֮◌᫆b; à◌֮◌᫆◌̕b; a◌֮◌̀◌᫆◌̕b; à◌֮◌᫆◌̕b; a◌֮◌̀◌᫆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING NUMBER SIGN ABOVE, LATIN SMALL LETTER B +0061 1AC6 0315 0300 05AE 0062;0061 05AE 1AC6 0300 0315 0062;0061 05AE 1AC6 0300 0315 0062;0061 05AE 1AC6 0300 0315 0062;0061 05AE 1AC6 0300 0315 0062; # (a◌᫆◌̕◌̀◌֮b; a◌֮◌᫆◌̀◌̕b; a◌֮◌᫆◌̀◌̕b; a◌֮◌᫆◌̀◌̕b; a◌֮◌᫆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING NUMBER SIGN ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AC7 0062;00E0 05AE 1AC7 0315 0062;0061 05AE 0300 1AC7 0315 0062;00E0 05AE 1AC7 0315 0062;0061 05AE 0300 1AC7 0315 0062; # (a◌̕◌̀◌֮◌᫇b; à◌֮◌᫇◌̕b; a◌֮◌̀◌᫇◌̕b; à◌֮◌᫇◌̕b; a◌֮◌̀◌᫇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING INVERTED DOUBLE ARCH ABOVE, LATIN SMALL LETTER B +0061 1AC7 0315 0300 05AE 0062;0061 05AE 1AC7 0300 0315 0062;0061 05AE 1AC7 0300 0315 0062;0061 05AE 1AC7 0300 0315 0062;0061 05AE 1AC7 0300 0315 0062; # (a◌᫇◌̕◌̀◌֮b; a◌֮◌᫇◌̀◌̕b; a◌֮◌᫇◌̀◌̕b; a◌֮◌᫇◌̀◌̕b; a◌֮◌᫇◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING INVERTED DOUBLE ARCH ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AC8 0062;00E0 05AE 1AC8 0315 0062;0061 05AE 0300 1AC8 0315 0062;00E0 05AE 1AC8 0315 0062;0061 05AE 0300 1AC8 0315 0062; # (a◌̕◌̀◌֮◌᫈b; à◌֮◌᫈◌̕b; a◌֮◌̀◌᫈◌̕b; à◌֮◌᫈◌̕b; a◌֮◌̀◌᫈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING PLUS SIGN ABOVE, LATIN SMALL LETTER B +0061 1AC8 0315 0300 05AE 0062;0061 05AE 1AC8 0300 0315 0062;0061 05AE 1AC8 0300 0315 0062;0061 05AE 1AC8 0300 0315 0062;0061 05AE 1AC8 0300 0315 0062; # (a◌᫈◌̕◌̀◌֮b; a◌֮◌᫈◌̀◌̕b; a◌֮◌᫈◌̀◌̕b; a◌֮◌᫈◌̀◌̕b; a◌֮◌᫈◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING PLUS SIGN ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1AC9 0062;00E0 05AE 1AC9 0315 0062;0061 05AE 0300 1AC9 0315 0062;00E0 05AE 1AC9 0315 0062;0061 05AE 0300 1AC9 0315 0062; # (a◌̕◌̀◌֮◌᫉b; à◌֮◌᫉◌̕b; a◌֮◌̀◌᫉◌̕b; à◌֮◌᫉◌̕b; a◌֮◌̀◌᫉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE PLUS SIGN ABOVE, LATIN SMALL LETTER B +0061 1AC9 0315 0300 05AE 0062;0061 05AE 1AC9 0300 0315 0062;0061 05AE 1AC9 0300 0315 0062;0061 05AE 1AC9 0300 0315 0062;0061 05AE 1AC9 0300 0315 0062; # (a◌᫉◌̕◌̀◌֮b; a◌֮◌᫉◌̀◌̕b; a◌֮◌᫉◌̀◌̕b; a◌֮◌᫉◌̀◌̕b; a◌֮◌᫉◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE PLUS SIGN ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1ACA 0062;0061 1DFA 0316 1ACA 059A 0062;0061 1DFA 0316 1ACA 059A 0062;0061 1DFA 0316 1ACA 059A 0062;0061 1DFA 0316 1ACA 059A 0062; # (a◌֚◌̖◌᷺◌᫊b; a◌᷺◌̖◌᫊◌֚b; a◌᷺◌̖◌᫊◌֚b; a◌᷺◌̖◌᫊◌֚b; a◌᷺◌̖◌᫊◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOUBLE PLUS SIGN BELOW, LATIN SMALL LETTER B +0061 1ACA 059A 0316 1DFA 0062;0061 1DFA 1ACA 0316 059A 0062;0061 1DFA 1ACA 0316 059A 0062;0061 1DFA 1ACA 0316 059A 0062;0061 1DFA 1ACA 0316 059A 0062; # (a◌᫊◌֚◌̖◌᷺b; a◌᷺◌᫊◌̖◌֚b; a◌᷺◌᫊◌̖◌֚b; a◌᷺◌᫊◌̖◌֚b; a◌᷺◌᫊◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE PLUS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1ACB 0062;00E0 05AE 1ACB 0315 0062;0061 05AE 0300 1ACB 0315 0062;00E0 05AE 1ACB 0315 0062;0061 05AE 0300 1ACB 0315 0062; # (a◌̕◌̀◌֮◌᫋b; à◌֮◌᫋◌̕b; a◌֮◌̀◌᫋◌̕b; à◌֮◌᫋◌̕b; a◌֮◌̀◌᫋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING TRIPLE ACUTE ACCENT, LATIN SMALL LETTER B +0061 1ACB 0315 0300 05AE 0062;0061 05AE 1ACB 0300 0315 0062;0061 05AE 1ACB 0300 0315 0062;0061 05AE 1ACB 0300 0315 0062;0061 05AE 1ACB 0300 0315 0062; # (a◌᫋◌̕◌̀◌֮b; a◌֮◌᫋◌̀◌̕b; a◌֮◌᫋◌̀◌̕b; a◌֮◌᫋◌̀◌̕b; a◌֮◌᫋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING TRIPLE ACUTE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1ACC 0062;00E0 05AE 1ACC 0315 0062;0061 05AE 0300 1ACC 0315 0062;00E0 05AE 1ACC 0315 0062;0061 05AE 0300 1ACC 0315 0062; # (a◌̕◌̀◌֮◌ᫌb; à◌֮◌ᫌ◌̕b; a◌֮◌̀◌ᫌ◌̕b; à◌֮◌ᫌ◌̕b; a◌֮◌̀◌ᫌ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER INSULAR G, LATIN SMALL LETTER B +0061 1ACC 0315 0300 05AE 0062;0061 05AE 1ACC 0300 0315 0062;0061 05AE 1ACC 0300 0315 0062;0061 05AE 1ACC 0300 0315 0062;0061 05AE 1ACC 0300 0315 0062; # (a◌ᫌ◌̕◌̀◌֮b; a◌֮◌ᫌ◌̀◌̕b; a◌֮◌ᫌ◌̀◌̕b; a◌֮◌ᫌ◌̀◌̕b; a◌֮◌ᫌ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER INSULAR G, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1ACD 0062;00E0 05AE 1ACD 0315 0062;0061 05AE 0300 1ACD 0315 0062;00E0 05AE 1ACD 0315 0062;0061 05AE 0300 1ACD 0315 0062; # (a◌̕◌̀◌֮◌ᫍb; à◌֮◌ᫍ◌̕b; a◌֮◌̀◌ᫍ◌̕b; à◌֮◌ᫍ◌̕b; a◌֮◌̀◌ᫍ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER INSULAR R, LATIN SMALL LETTER B +0061 1ACD 0315 0300 05AE 0062;0061 05AE 1ACD 0300 0315 0062;0061 05AE 1ACD 0300 0315 0062;0061 05AE 1ACD 0300 0315 0062;0061 05AE 1ACD 0300 0315 0062; # (a◌ᫍ◌̕◌̀◌֮b; a◌֮◌ᫍ◌̀◌̕b; a◌֮◌ᫍ◌̀◌̕b; a◌֮◌ᫍ◌̀◌̕b; a◌֮◌ᫍ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER INSULAR R, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1ACE 0062;00E0 05AE 1ACE 0315 0062;0061 05AE 0300 1ACE 0315 0062;00E0 05AE 1ACE 0315 0062;0061 05AE 0300 1ACE 0315 0062; # (a◌̕◌̀◌֮◌ᫎb; à◌֮◌ᫎ◌̕b; a◌֮◌̀◌ᫎ◌̕b; à◌֮◌ᫎ◌̕b; a◌֮◌̀◌ᫎ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER INSULAR T, LATIN SMALL LETTER B +0061 1ACE 0315 0300 05AE 0062;0061 05AE 1ACE 0300 0315 0062;0061 05AE 1ACE 0300 0315 0062;0061 05AE 1ACE 0300 0315 0062;0061 05AE 1ACE 0300 0315 0062; # (a◌ᫎ◌̕◌̀◌֮b; a◌֮◌ᫎ◌̀◌̕b; a◌֮◌ᫎ◌̀◌̕b; a◌֮◌ᫎ◌̀◌̕b; a◌֮◌ᫎ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER INSULAR T, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 3099 093C 16FF0 1B34 0062;0061 16FF0 093C 1B34 3099 0062;0061 16FF0 093C 1B34 3099 0062;0061 16FF0 093C 1B34 3099 0062;0061 16FF0 093C 1B34 3099 0062; # (a◌゙◌𖿰़◌᬴b; a𖿰◌़◌᬴◌゙b; a𖿰◌़◌᬴◌゙b; a𖿰◌़◌᬴◌゙b; a𖿰◌़◌᬴◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, BALINESE SIGN REREKAN, LATIN SMALL LETTER B +0061 1B34 3099 093C 16FF0 0062;0061 16FF0 1B34 093C 3099 0062;0061 16FF0 1B34 093C 3099 0062;0061 16FF0 1B34 093C 3099 0062;0061 16FF0 1B34 093C 3099 0062; # (a◌᬴◌゙◌𖿰़b; a𖿰◌᬴◌़◌゙b; a𖿰◌᬴◌़◌゙b; a𖿰◌᬴◌़◌゙b; a𖿰◌᬴◌़◌゙b; ) LATIN SMALL LETTER A, BALINESE SIGN REREKAN, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 1B44 0062;0061 3099 094D 1B44 05B0 0062;0061 3099 094D 1B44 05B0 0062;0061 3099 094D 1B44 05B0 0062;0061 3099 094D 1B44 05B0 0062; # (a◌ְ◌्◌゙᭄b; a◌゙◌्᭄◌ְb; a◌゙◌्᭄◌ְb; a◌゙◌्᭄◌ְb; a◌゙◌्᭄◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BALINESE ADEG ADEG, LATIN SMALL LETTER B +0061 1B44 05B0 094D 3099 0062;0061 3099 1B44 094D 05B0 0062;0061 3099 1B44 094D 05B0 0062;0061 3099 1B44 094D 05B0 0062;0061 3099 1B44 094D 05B0 0062; # (a᭄◌ְ◌्◌゙b; a◌゙᭄◌्◌ְb; a◌゙᭄◌्◌ְb; a◌゙᭄◌्◌ְb; a◌゙᭄◌्◌ְb; ) LATIN SMALL LETTER A, BALINESE ADEG ADEG, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 1B6B 0062;00E0 05AE 1B6B 0315 0062;0061 05AE 0300 1B6B 0315 0062;00E0 05AE 1B6B 0315 0062;0061 05AE 0300 1B6B 0315 0062; # (a◌̕◌̀◌֮◌᭫b; à◌֮◌᭫◌̕b; a◌֮◌̀◌᭫◌̕b; à◌֮◌᭫◌̕b; a◌֮◌̀◌᭫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING TEGEH, LATIN SMALL LETTER B +0061 1B6B 0315 0300 05AE 0062;0061 05AE 1B6B 0300 0315 0062;0061 05AE 1B6B 0300 0315 0062;0061 05AE 1B6B 0300 0315 0062;0061 05AE 1B6B 0300 0315 0062; # (a◌᭫◌̕◌̀◌֮b; a◌֮◌᭫◌̀◌̕b; a◌֮◌᭫◌̀◌̕b; a◌֮◌᭫◌̀◌̕b; a◌֮◌᭫◌̀◌̕b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING TEGEH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1B6C 0062;0061 1DFA 0316 1B6C 059A 0062;0061 1DFA 0316 1B6C 059A 0062;0061 1DFA 0316 1B6C 059A 0062;0061 1DFA 0316 1B6C 059A 0062; # (a◌֚◌̖◌᷺◌᭬b; a◌᷺◌̖◌᭬◌֚b; a◌᷺◌̖◌᭬◌֚b; a◌᷺◌̖◌᭬◌֚b; a◌᷺◌̖◌᭬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, BALINESE MUSICAL SYMBOL COMBINING ENDEP, LATIN SMALL LETTER B +0061 1B6C 059A 0316 1DFA 0062;0061 1DFA 1B6C 0316 059A 0062;0061 1DFA 1B6C 0316 059A 0062;0061 1DFA 1B6C 0316 059A 0062;0061 1DFA 1B6C 0316 059A 0062; # (a◌᭬◌֚◌̖◌᷺b; a◌᷺◌᭬◌̖◌֚b; a◌᷺◌᭬◌̖◌֚b; a◌᷺◌᭬◌̖◌֚b; a◌᷺◌᭬◌̖◌֚b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING ENDEP, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1B6D 0062;00E0 05AE 1B6D 0315 0062;0061 05AE 0300 1B6D 0315 0062;00E0 05AE 1B6D 0315 0062;0061 05AE 0300 1B6D 0315 0062; # (a◌̕◌̀◌֮◌᭭b; à◌֮◌᭭◌̕b; a◌֮◌̀◌᭭◌̕b; à◌֮◌᭭◌̕b; a◌֮◌̀◌᭭◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING KEMPUL, LATIN SMALL LETTER B +0061 1B6D 0315 0300 05AE 0062;0061 05AE 1B6D 0300 0315 0062;0061 05AE 1B6D 0300 0315 0062;0061 05AE 1B6D 0300 0315 0062;0061 05AE 1B6D 0300 0315 0062; # (a◌᭭◌̕◌̀◌֮b; a◌֮◌᭭◌̀◌̕b; a◌֮◌᭭◌̀◌̕b; a◌֮◌᭭◌̀◌̕b; a◌֮◌᭭◌̀◌̕b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING KEMPUL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1B6E 0062;00E0 05AE 1B6E 0315 0062;0061 05AE 0300 1B6E 0315 0062;00E0 05AE 1B6E 0315 0062;0061 05AE 0300 1B6E 0315 0062; # (a◌̕◌̀◌֮◌᭮b; à◌֮◌᭮◌̕b; a◌֮◌̀◌᭮◌̕b; à◌֮◌᭮◌̕b; a◌֮◌̀◌᭮◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING KEMPLI, LATIN SMALL LETTER B +0061 1B6E 0315 0300 05AE 0062;0061 05AE 1B6E 0300 0315 0062;0061 05AE 1B6E 0300 0315 0062;0061 05AE 1B6E 0300 0315 0062;0061 05AE 1B6E 0300 0315 0062; # (a◌᭮◌̕◌̀◌֮b; a◌֮◌᭮◌̀◌̕b; a◌֮◌᭮◌̀◌̕b; a◌֮◌᭮◌̀◌̕b; a◌֮◌᭮◌̀◌̕b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING KEMPLI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1B6F 0062;00E0 05AE 1B6F 0315 0062;0061 05AE 0300 1B6F 0315 0062;00E0 05AE 1B6F 0315 0062;0061 05AE 0300 1B6F 0315 0062; # (a◌̕◌̀◌֮◌᭯b; à◌֮◌᭯◌̕b; a◌֮◌̀◌᭯◌̕b; à◌֮◌᭯◌̕b; a◌֮◌̀◌᭯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING JEGOGAN, LATIN SMALL LETTER B +0061 1B6F 0315 0300 05AE 0062;0061 05AE 1B6F 0300 0315 0062;0061 05AE 1B6F 0300 0315 0062;0061 05AE 1B6F 0300 0315 0062;0061 05AE 1B6F 0300 0315 0062; # (a◌᭯◌̕◌̀◌֮b; a◌֮◌᭯◌̀◌̕b; a◌֮◌᭯◌̀◌̕b; a◌֮◌᭯◌̀◌̕b; a◌֮◌᭯◌̀◌̕b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING JEGOGAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1B70 0062;00E0 05AE 1B70 0315 0062;0061 05AE 0300 1B70 0315 0062;00E0 05AE 1B70 0315 0062;0061 05AE 0300 1B70 0315 0062; # (a◌̕◌̀◌֮◌᭰b; à◌֮◌᭰◌̕b; a◌֮◌̀◌᭰◌̕b; à◌֮◌᭰◌̕b; a◌֮◌̀◌᭰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN, LATIN SMALL LETTER B +0061 1B70 0315 0300 05AE 0062;0061 05AE 1B70 0300 0315 0062;0061 05AE 1B70 0300 0315 0062;0061 05AE 1B70 0300 0315 0062;0061 05AE 1B70 0300 0315 0062; # (a◌᭰◌̕◌̀◌֮b; a◌֮◌᭰◌̀◌̕b; a◌֮◌᭰◌̀◌̕b; a◌֮◌᭰◌̀◌̕b; a◌֮◌᭰◌̀◌̕b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1B71 0062;00E0 05AE 1B71 0315 0062;0061 05AE 0300 1B71 0315 0062;00E0 05AE 1B71 0315 0062;0061 05AE 0300 1B71 0315 0062; # (a◌̕◌̀◌֮◌᭱b; à◌֮◌᭱◌̕b; a◌֮◌̀◌᭱◌̕b; à◌֮◌᭱◌̕b; a◌֮◌̀◌᭱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN, LATIN SMALL LETTER B +0061 1B71 0315 0300 05AE 0062;0061 05AE 1B71 0300 0315 0062;0061 05AE 1B71 0300 0315 0062;0061 05AE 1B71 0300 0315 0062;0061 05AE 1B71 0300 0315 0062; # (a◌᭱◌̕◌̀◌֮b; a◌֮◌᭱◌̀◌̕b; a◌֮◌᭱◌̀◌̕b; a◌֮◌᭱◌̀◌̕b; a◌֮◌᭱◌̀◌̕b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1B72 0062;00E0 05AE 1B72 0315 0062;0061 05AE 0300 1B72 0315 0062;00E0 05AE 1B72 0315 0062;0061 05AE 0300 1B72 0315 0062; # (a◌̕◌̀◌֮◌᭲b; à◌֮◌᭲◌̕b; a◌֮◌̀◌᭲◌̕b; à◌֮◌᭲◌̕b; a◌֮◌̀◌᭲◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING BENDE, LATIN SMALL LETTER B +0061 1B72 0315 0300 05AE 0062;0061 05AE 1B72 0300 0315 0062;0061 05AE 1B72 0300 0315 0062;0061 05AE 1B72 0300 0315 0062;0061 05AE 1B72 0300 0315 0062; # (a◌᭲◌̕◌̀◌֮b; a◌֮◌᭲◌̀◌̕b; a◌֮◌᭲◌̀◌̕b; a◌֮◌᭲◌̀◌̕b; a◌֮◌᭲◌̀◌̕b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING BENDE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1B73 0062;00E0 05AE 1B73 0315 0062;0061 05AE 0300 1B73 0315 0062;00E0 05AE 1B73 0315 0062;0061 05AE 0300 1B73 0315 0062; # (a◌̕◌̀◌֮◌᭳b; à◌֮◌᭳◌̕b; a◌֮◌̀◌᭳◌̕b; à◌֮◌᭳◌̕b; a◌֮◌̀◌᭳◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING GONG, LATIN SMALL LETTER B +0061 1B73 0315 0300 05AE 0062;0061 05AE 1B73 0300 0315 0062;0061 05AE 1B73 0300 0315 0062;0061 05AE 1B73 0300 0315 0062;0061 05AE 1B73 0300 0315 0062; # (a◌᭳◌̕◌̀◌֮b; a◌֮◌᭳◌̀◌̕b; a◌֮◌᭳◌̀◌̕b; a◌֮◌᭳◌̀◌̕b; a◌֮◌᭳◌̀◌̕b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING GONG, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 1BAA 0062;0061 3099 094D 1BAA 05B0 0062;0061 3099 094D 1BAA 05B0 0062;0061 3099 094D 1BAA 05B0 0062;0061 3099 094D 1BAA 05B0 0062; # (a◌ְ◌्◌゙᮪b; a◌゙◌्᮪◌ְb; a◌゙◌्᮪◌ְb; a◌゙◌्᮪◌ְb; a◌゙◌्᮪◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SUNDANESE SIGN PAMAAEH, LATIN SMALL LETTER B +0061 1BAA 05B0 094D 3099 0062;0061 3099 1BAA 094D 05B0 0062;0061 3099 1BAA 094D 05B0 0062;0061 3099 1BAA 094D 05B0 0062;0061 3099 1BAA 094D 05B0 0062; # (a᮪◌ְ◌्◌゙b; a◌゙᮪◌्◌ְb; a◌゙᮪◌्◌ְb; a◌゙᮪◌्◌ְb; a◌゙᮪◌्◌ְb; ) LATIN SMALL LETTER A, SUNDANESE SIGN PAMAAEH, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 1BAB 0062;0061 3099 094D 1BAB 05B0 0062;0061 3099 094D 1BAB 05B0 0062;0061 3099 094D 1BAB 05B0 0062;0061 3099 094D 1BAB 05B0 0062; # (a◌ְ◌्◌゙◌᮫b; a◌゙◌्◌᮫◌ְb; a◌゙◌्◌᮫◌ְb; a◌゙◌्◌᮫◌ְb; a◌゙◌्◌᮫◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SUNDANESE SIGN VIRAMA, LATIN SMALL LETTER B +0061 1BAB 05B0 094D 3099 0062;0061 3099 1BAB 094D 05B0 0062;0061 3099 1BAB 094D 05B0 0062;0061 3099 1BAB 094D 05B0 0062;0061 3099 1BAB 094D 05B0 0062; # (a◌᮫◌ְ◌्◌゙b; a◌゙◌᮫◌्◌ְb; a◌゙◌᮫◌्◌ְb; a◌゙◌᮫◌्◌ְb; a◌゙◌᮫◌्◌ְb; ) LATIN SMALL LETTER A, SUNDANESE SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 1BE6 0062;0061 16FF0 093C 1BE6 3099 0062;0061 16FF0 093C 1BE6 3099 0062;0061 16FF0 093C 1BE6 3099 0062;0061 16FF0 093C 1BE6 3099 0062; # (a◌゙◌𖿰़◌᯦b; a𖿰◌़◌᯦◌゙b; a𖿰◌़◌᯦◌゙b; a𖿰◌़◌᯦◌゙b; a𖿰◌़◌᯦◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, BATAK SIGN TOMPI, LATIN SMALL LETTER B +0061 1BE6 3099 093C 16FF0 0062;0061 16FF0 1BE6 093C 3099 0062;0061 16FF0 1BE6 093C 3099 0062;0061 16FF0 1BE6 093C 3099 0062;0061 16FF0 1BE6 093C 3099 0062; # (a◌᯦◌゙◌𖿰़b; a𖿰◌᯦◌़◌゙b; a𖿰◌᯦◌़◌゙b; a𖿰◌᯦◌़◌゙b; a𖿰◌᯦◌़◌゙b; ) LATIN SMALL LETTER A, BATAK SIGN TOMPI, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 1BF2 0062;0061 3099 094D 1BF2 05B0 0062;0061 3099 094D 1BF2 05B0 0062;0061 3099 094D 1BF2 05B0 0062;0061 3099 094D 1BF2 05B0 0062; # (a◌ְ◌्◌゙᯲b; a◌゙◌्᯲◌ְb; a◌゙◌्᯲◌ְb; a◌゙◌्᯲◌ְb; a◌゙◌्᯲◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BATAK PANGOLAT, LATIN SMALL LETTER B +0061 1BF2 05B0 094D 3099 0062;0061 3099 1BF2 094D 05B0 0062;0061 3099 1BF2 094D 05B0 0062;0061 3099 1BF2 094D 05B0 0062;0061 3099 1BF2 094D 05B0 0062; # (a᯲◌ְ◌्◌゙b; a◌゙᯲◌्◌ְb; a◌゙᯲◌्◌ְb; a◌゙᯲◌्◌ְb; a◌゙᯲◌्◌ְb; ) LATIN SMALL LETTER A, BATAK PANGOLAT, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 1BF3 0062;0061 3099 094D 1BF3 05B0 0062;0061 3099 094D 1BF3 05B0 0062;0061 3099 094D 1BF3 05B0 0062;0061 3099 094D 1BF3 05B0 0062; # (a◌ְ◌्◌゙᯳b; a◌゙◌्᯳◌ְb; a◌゙◌्᯳◌ְb; a◌゙◌्᯳◌ְb; a◌゙◌्᯳◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BATAK PANONGONAN, LATIN SMALL LETTER B +0061 1BF3 05B0 094D 3099 0062;0061 3099 1BF3 094D 05B0 0062;0061 3099 1BF3 094D 05B0 0062;0061 3099 1BF3 094D 05B0 0062;0061 3099 1BF3 094D 05B0 0062; # (a᯳◌ְ◌्◌゙b; a◌゙᯳◌्◌ְb; a◌゙᯳◌्◌ְb; a◌゙᯳◌्◌ְb; a◌゙᯳◌्◌ְb; ) LATIN SMALL LETTER A, BATAK PANONGONAN, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 1C37 0062;0061 16FF0 093C 1C37 3099 0062;0061 16FF0 093C 1C37 3099 0062;0061 16FF0 093C 1C37 3099 0062;0061 16FF0 093C 1C37 3099 0062; # (a◌゙◌𖿰़◌᰷b; a𖿰◌़◌᰷◌゙b; a𖿰◌़◌᰷◌゙b; a𖿰◌़◌᰷◌゙b; a𖿰◌़◌᰷◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LEPCHA SIGN NUKTA, LATIN SMALL LETTER B +0061 1C37 3099 093C 16FF0 0062;0061 16FF0 1C37 093C 3099 0062;0061 16FF0 1C37 093C 3099 0062;0061 16FF0 1C37 093C 3099 0062;0061 16FF0 1C37 093C 3099 0062; # (a◌᰷◌゙◌𖿰़b; a𖿰◌᰷◌़◌゙b; a𖿰◌᰷◌़◌゙b; a𖿰◌᰷◌़◌゙b; a𖿰◌᰷◌़◌゙b; ) LATIN SMALL LETTER A, LEPCHA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 0315 0300 05AE 1CD0 0062;00E0 05AE 1CD0 0315 0062;0061 05AE 0300 1CD0 0315 0062;00E0 05AE 1CD0 0315 0062;0061 05AE 0300 1CD0 0315 0062; # (a◌̕◌̀◌֮◌᳐b; à◌֮◌᳐◌̕b; a◌֮◌̀◌᳐◌̕b; à◌֮◌᳐◌̕b; a◌֮◌̀◌᳐◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE KARSHANA, LATIN SMALL LETTER B +0061 1CD0 0315 0300 05AE 0062;0061 05AE 1CD0 0300 0315 0062;0061 05AE 1CD0 0300 0315 0062;0061 05AE 1CD0 0300 0315 0062;0061 05AE 1CD0 0300 0315 0062; # (a◌᳐◌̕◌̀◌֮b; a◌֮◌᳐◌̀◌̕b; a◌֮◌᳐◌̀◌̕b; a◌֮◌᳐◌̀◌̕b; a◌֮◌᳐◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE KARSHANA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1CD1 0062;00E0 05AE 1CD1 0315 0062;0061 05AE 0300 1CD1 0315 0062;00E0 05AE 1CD1 0315 0062;0061 05AE 0300 1CD1 0315 0062; # (a◌̕◌̀◌֮◌᳑b; à◌֮◌᳑◌̕b; a◌֮◌̀◌᳑◌̕b; à◌֮◌᳑◌̕b; a◌֮◌̀◌᳑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE SHARA, LATIN SMALL LETTER B +0061 1CD1 0315 0300 05AE 0062;0061 05AE 1CD1 0300 0315 0062;0061 05AE 1CD1 0300 0315 0062;0061 05AE 1CD1 0300 0315 0062;0061 05AE 1CD1 0300 0315 0062; # (a◌᳑◌̕◌̀◌֮b; a◌֮◌᳑◌̀◌̕b; a◌֮◌᳑◌̀◌̕b; a◌֮◌᳑◌̀◌̕b; a◌֮◌᳑◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE SHARA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1CD2 0062;00E0 05AE 1CD2 0315 0062;0061 05AE 0300 1CD2 0315 0062;00E0 05AE 1CD2 0315 0062;0061 05AE 0300 1CD2 0315 0062; # (a◌̕◌̀◌֮◌᳒b; à◌֮◌᳒◌̕b; a◌֮◌̀◌᳒◌̕b; à◌֮◌᳒◌̕b; a◌֮◌̀◌᳒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE PRENKHA, LATIN SMALL LETTER B +0061 1CD2 0315 0300 05AE 0062;0061 05AE 1CD2 0300 0315 0062;0061 05AE 1CD2 0300 0315 0062;0061 05AE 1CD2 0300 0315 0062;0061 05AE 1CD2 0300 0315 0062; # (a◌᳒◌̕◌̀◌֮b; a◌֮◌᳒◌̀◌̕b; a◌֮◌᳒◌̀◌̕b; a◌֮◌᳒◌̀◌̕b; a◌֮◌᳒◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE PRENKHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 16FF0 0334 1CD4 0062;0061 0334 1CD4 16FF0 0062;0061 0334 1CD4 16FF0 0062;0061 0334 1CD4 16FF0 0062;0061 0334 1CD4 16FF0 0062; # (a𖿰◌̴◌᳔b; a◌̴◌᳔𖿰b; a◌̴◌᳔𖿰b; a◌̴◌᳔𖿰b; a◌̴◌᳔𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN YAJURVEDIC MIDLINE SVARITA, LATIN SMALL LETTER B +0061 1CD4 16FF0 0334 0062;0061 1CD4 0334 16FF0 0062;0061 1CD4 0334 16FF0 0062;0061 1CD4 0334 16FF0 0062;0061 1CD4 0334 16FF0 0062; # (a◌᳔𖿰◌̴b; a◌᳔◌̴𖿰b; a◌᳔◌̴𖿰b; a◌᳔◌̴𖿰b; a◌᳔◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN YAJURVEDIC MIDLINE SVARITA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1CD5 0062;0061 1DFA 0316 1CD5 059A 0062;0061 1DFA 0316 1CD5 059A 0062;0061 1DFA 0316 1CD5 059A 0062;0061 1DFA 0316 1CD5 059A 0062; # (a◌֚◌̖◌᷺◌᳕b; a◌᷺◌̖◌᳕◌֚b; a◌᷺◌̖◌᳕◌֚b; a◌᷺◌̖◌᳕◌֚b; a◌᷺◌̖◌᳕◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA, LATIN SMALL LETTER B +0061 1CD5 059A 0316 1DFA 0062;0061 1DFA 1CD5 0316 059A 0062;0061 1DFA 1CD5 0316 059A 0062;0061 1DFA 1CD5 0316 059A 0062;0061 1DFA 1CD5 0316 059A 0062; # (a◌᳕◌֚◌̖◌᷺b; a◌᷺◌᳕◌̖◌֚b; a◌᷺◌᳕◌̖◌֚b; a◌᷺◌᳕◌̖◌֚b; a◌᷺◌᳕◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1CD6 0062;0061 1DFA 0316 1CD6 059A 0062;0061 1DFA 0316 1CD6 059A 0062;0061 1DFA 0316 1CD6 059A 0062;0061 1DFA 0316 1CD6 059A 0062; # (a◌֚◌̖◌᷺◌᳖b; a◌᷺◌̖◌᳖◌֚b; a◌᷺◌̖◌᳖◌֚b; a◌᷺◌̖◌᳖◌֚b; a◌᷺◌̖◌᳖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA, LATIN SMALL LETTER B +0061 1CD6 059A 0316 1DFA 0062;0061 1DFA 1CD6 0316 059A 0062;0061 1DFA 1CD6 0316 059A 0062;0061 1DFA 1CD6 0316 059A 0062;0061 1DFA 1CD6 0316 059A 0062; # (a◌᳖◌֚◌̖◌᷺b; a◌᷺◌᳖◌̖◌֚b; a◌᷺◌᳖◌̖◌֚b; a◌᷺◌᳖◌̖◌֚b; a◌᷺◌᳖◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1CD7 0062;0061 1DFA 0316 1CD7 059A 0062;0061 1DFA 0316 1CD7 059A 0062;0061 1DFA 0316 1CD7 059A 0062;0061 1DFA 0316 1CD7 059A 0062; # (a◌֚◌̖◌᷺◌᳗b; a◌᷺◌̖◌᳗◌֚b; a◌᷺◌̖◌᳗◌֚b; a◌᷺◌̖◌᳗◌֚b; a◌᷺◌̖◌᳗◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA, LATIN SMALL LETTER B +0061 1CD7 059A 0316 1DFA 0062;0061 1DFA 1CD7 0316 059A 0062;0061 1DFA 1CD7 0316 059A 0062;0061 1DFA 1CD7 0316 059A 0062;0061 1DFA 1CD7 0316 059A 0062; # (a◌᳗◌֚◌̖◌᷺b; a◌᷺◌᳗◌̖◌֚b; a◌᷺◌᳗◌̖◌֚b; a◌᷺◌᳗◌̖◌֚b; a◌᷺◌᳗◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1CD8 0062;0061 1DFA 0316 1CD8 059A 0062;0061 1DFA 0316 1CD8 059A 0062;0061 1DFA 0316 1CD8 059A 0062;0061 1DFA 0316 1CD8 059A 0062; # (a◌֚◌̖◌᷺◌᳘b; a◌᷺◌̖◌᳘◌֚b; a◌᷺◌̖◌᳘◌֚b; a◌᷺◌̖◌᳘◌֚b; a◌᷺◌̖◌᳘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE CANDRA BELOW, LATIN SMALL LETTER B +0061 1CD8 059A 0316 1DFA 0062;0061 1DFA 1CD8 0316 059A 0062;0061 1DFA 1CD8 0316 059A 0062;0061 1DFA 1CD8 0316 059A 0062;0061 1DFA 1CD8 0316 059A 0062; # (a◌᳘◌֚◌̖◌᷺b; a◌᷺◌᳘◌̖◌֚b; a◌᷺◌᳘◌̖◌֚b; a◌᷺◌᳘◌̖◌֚b; a◌᷺◌᳘◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE CANDRA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1CD9 0062;0061 1DFA 0316 1CD9 059A 0062;0061 1DFA 0316 1CD9 059A 0062;0061 1DFA 0316 1CD9 059A 0062;0061 1DFA 0316 1CD9 059A 0062; # (a◌֚◌̖◌᷺◌᳙b; a◌᷺◌̖◌᳙◌֚b; a◌᷺◌̖◌᳙◌֚b; a◌᷺◌̖◌᳙◌֚b; a◌᷺◌̖◌᳙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER, LATIN SMALL LETTER B +0061 1CD9 059A 0316 1DFA 0062;0061 1DFA 1CD9 0316 059A 0062;0061 1DFA 1CD9 0316 059A 0062;0061 1DFA 1CD9 0316 059A 0062;0061 1DFA 1CD9 0316 059A 0062; # (a◌᳙◌֚◌̖◌᷺b; a◌᷺◌᳙◌̖◌֚b; a◌᷺◌᳙◌̖◌֚b; a◌᷺◌᳙◌̖◌֚b; a◌᷺◌᳙◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1CDA 0062;00E0 05AE 1CDA 0315 0062;0061 05AE 0300 1CDA 0315 0062;00E0 05AE 1CDA 0315 0062;0061 05AE 0300 1CDA 0315 0062; # (a◌̕◌̀◌֮◌᳚b; à◌֮◌᳚◌̕b; a◌֮◌̀◌᳚◌̕b; à◌֮◌᳚◌̕b; a◌֮◌̀◌᳚◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE DOUBLE SVARITA, LATIN SMALL LETTER B +0061 1CDA 0315 0300 05AE 0062;0061 05AE 1CDA 0300 0315 0062;0061 05AE 1CDA 0300 0315 0062;0061 05AE 1CDA 0300 0315 0062;0061 05AE 1CDA 0300 0315 0062; # (a◌᳚◌̕◌̀◌֮b; a◌֮◌᳚◌̀◌̕b; a◌֮◌᳚◌̀◌̕b; a◌֮◌᳚◌̀◌̕b; a◌֮◌᳚◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE DOUBLE SVARITA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1CDB 0062;00E0 05AE 1CDB 0315 0062;0061 05AE 0300 1CDB 0315 0062;00E0 05AE 1CDB 0315 0062;0061 05AE 0300 1CDB 0315 0062; # (a◌̕◌̀◌֮◌᳛b; à◌֮◌᳛◌̕b; a◌֮◌̀◌᳛◌̕b; à◌֮◌᳛◌̕b; a◌֮◌̀◌᳛◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE TRIPLE SVARITA, LATIN SMALL LETTER B +0061 1CDB 0315 0300 05AE 0062;0061 05AE 1CDB 0300 0315 0062;0061 05AE 1CDB 0300 0315 0062;0061 05AE 1CDB 0300 0315 0062;0061 05AE 1CDB 0300 0315 0062; # (a◌᳛◌̕◌̀◌֮b; a◌֮◌᳛◌̀◌̕b; a◌֮◌᳛◌̀◌̕b; a◌֮◌᳛◌̀◌̕b; a◌֮◌᳛◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE TRIPLE SVARITA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1CDC 0062;0061 1DFA 0316 1CDC 059A 0062;0061 1DFA 0316 1CDC 059A 0062;0061 1DFA 0316 1CDC 059A 0062;0061 1DFA 0316 1CDC 059A 0062; # (a◌֚◌̖◌᷺◌᳜b; a◌᷺◌̖◌᳜◌֚b; a◌᷺◌̖◌᳜◌֚b; a◌᷺◌̖◌᳜◌֚b; a◌᷺◌̖◌᳜◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE KATHAKA ANUDATTA, LATIN SMALL LETTER B +0061 1CDC 059A 0316 1DFA 0062;0061 1DFA 1CDC 0316 059A 0062;0061 1DFA 1CDC 0316 059A 0062;0061 1DFA 1CDC 0316 059A 0062;0061 1DFA 1CDC 0316 059A 0062; # (a◌᳜◌֚◌̖◌᷺b; a◌᷺◌᳜◌̖◌֚b; a◌᷺◌᳜◌̖◌֚b; a◌᷺◌᳜◌̖◌֚b; a◌᷺◌᳜◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE KATHAKA ANUDATTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1CDD 0062;0061 1DFA 0316 1CDD 059A 0062;0061 1DFA 0316 1CDD 059A 0062;0061 1DFA 0316 1CDD 059A 0062;0061 1DFA 0316 1CDD 059A 0062; # (a◌֚◌̖◌᷺◌᳝b; a◌᷺◌̖◌᳝◌֚b; a◌᷺◌̖◌᳝◌֚b; a◌᷺◌̖◌᳝◌֚b; a◌᷺◌̖◌᳝◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE DOT BELOW, LATIN SMALL LETTER B +0061 1CDD 059A 0316 1DFA 0062;0061 1DFA 1CDD 0316 059A 0062;0061 1DFA 1CDD 0316 059A 0062;0061 1DFA 1CDD 0316 059A 0062;0061 1DFA 1CDD 0316 059A 0062; # (a◌᳝◌֚◌̖◌᷺b; a◌᷺◌᳝◌̖◌֚b; a◌᷺◌᳝◌̖◌֚b; a◌᷺◌᳝◌̖◌֚b; a◌᷺◌᳝◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1CDE 0062;0061 1DFA 0316 1CDE 059A 0062;0061 1DFA 0316 1CDE 059A 0062;0061 1DFA 0316 1CDE 059A 0062;0061 1DFA 0316 1CDE 059A 0062; # (a◌֚◌̖◌᷺◌᳞b; a◌᷺◌̖◌᳞◌֚b; a◌᷺◌̖◌᳞◌֚b; a◌᷺◌̖◌᳞◌֚b; a◌᷺◌̖◌᳞◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE TWO DOTS BELOW, LATIN SMALL LETTER B +0061 1CDE 059A 0316 1DFA 0062;0061 1DFA 1CDE 0316 059A 0062;0061 1DFA 1CDE 0316 059A 0062;0061 1DFA 1CDE 0316 059A 0062;0061 1DFA 1CDE 0316 059A 0062; # (a◌᳞◌֚◌̖◌᷺b; a◌᷺◌᳞◌̖◌֚b; a◌᷺◌᳞◌̖◌֚b; a◌᷺◌᳞◌̖◌֚b; a◌᷺◌᳞◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1CDF 0062;0061 1DFA 0316 1CDF 059A 0062;0061 1DFA 0316 1CDF 059A 0062;0061 1DFA 0316 1CDF 059A 0062;0061 1DFA 0316 1CDF 059A 0062; # (a◌֚◌̖◌᷺◌᳟b; a◌᷺◌̖◌᳟◌֚b; a◌᷺◌̖◌᳟◌֚b; a◌᷺◌̖◌᳟◌֚b; a◌᷺◌̖◌᳟◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE THREE DOTS BELOW, LATIN SMALL LETTER B +0061 1CDF 059A 0316 1DFA 0062;0061 1DFA 1CDF 0316 059A 0062;0061 1DFA 1CDF 0316 059A 0062;0061 1DFA 1CDF 0316 059A 0062;0061 1DFA 1CDF 0316 059A 0062; # (a◌᳟◌֚◌̖◌᷺b; a◌᷺◌᳟◌̖◌֚b; a◌᷺◌᳟◌̖◌֚b; a◌᷺◌᳟◌̖◌֚b; a◌᷺◌᳟◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE THREE DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1CE0 0062;00E0 05AE 1CE0 0315 0062;0061 05AE 0300 1CE0 0315 0062;00E0 05AE 1CE0 0315 0062;0061 05AE 0300 1CE0 0315 0062; # (a◌̕◌̀◌֮◌᳠b; à◌֮◌᳠◌̕b; a◌֮◌̀◌᳠◌̕b; à◌֮◌᳠◌̕b; a◌֮◌̀◌᳠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA, LATIN SMALL LETTER B +0061 1CE0 0315 0300 05AE 0062;0061 05AE 1CE0 0300 0315 0062;0061 05AE 1CE0 0300 0315 0062;0061 05AE 1CE0 0300 0315 0062;0061 05AE 1CE0 0300 0315 0062; # (a◌᳠◌̕◌̀◌֮b; a◌֮◌᳠◌̀◌̕b; a◌֮◌᳠◌̀◌̕b; a◌֮◌᳠◌̀◌̕b; a◌֮◌᳠◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 16FF0 0334 1CE2 0062;0061 0334 1CE2 16FF0 0062;0061 0334 1CE2 16FF0 0062;0061 0334 1CE2 16FF0 0062;0061 0334 1CE2 16FF0 0062; # (a𖿰◌̴◌᳢b; a◌̴◌᳢𖿰b; a◌̴◌᳢𖿰b; a◌̴◌᳢𖿰b; a◌̴◌᳢𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN VISARGA SVARITA, LATIN SMALL LETTER B +0061 1CE2 16FF0 0334 0062;0061 1CE2 0334 16FF0 0062;0061 1CE2 0334 16FF0 0062;0061 1CE2 0334 16FF0 0062;0061 1CE2 0334 16FF0 0062; # (a◌᳢𖿰◌̴b; a◌᳢◌̴𖿰b; a◌᳢◌̴𖿰b; a◌᳢◌̴𖿰b; a◌᳢◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN VISARGA SVARITA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 1CE3 0062;0061 0334 1CE3 16FF0 0062;0061 0334 1CE3 16FF0 0062;0061 0334 1CE3 16FF0 0062;0061 0334 1CE3 16FF0 0062; # (a𖿰◌̴◌᳣b; a◌̴◌᳣𖿰b; a◌̴◌᳣𖿰b; a◌̴◌᳣𖿰b; a◌̴◌᳣𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN VISARGA UDATTA, LATIN SMALL LETTER B +0061 1CE3 16FF0 0334 0062;0061 1CE3 0334 16FF0 0062;0061 1CE3 0334 16FF0 0062;0061 1CE3 0334 16FF0 0062;0061 1CE3 0334 16FF0 0062; # (a◌᳣𖿰◌̴b; a◌᳣◌̴𖿰b; a◌᳣◌̴𖿰b; a◌᳣◌̴𖿰b; a◌᳣◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN VISARGA UDATTA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 1CE4 0062;0061 0334 1CE4 16FF0 0062;0061 0334 1CE4 16FF0 0062;0061 0334 1CE4 16FF0 0062;0061 0334 1CE4 16FF0 0062; # (a𖿰◌̴◌᳤b; a◌̴◌᳤𖿰b; a◌̴◌᳤𖿰b; a◌̴◌᳤𖿰b; a◌̴◌᳤𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN REVERSED VISARGA UDATTA, LATIN SMALL LETTER B +0061 1CE4 16FF0 0334 0062;0061 1CE4 0334 16FF0 0062;0061 1CE4 0334 16FF0 0062;0061 1CE4 0334 16FF0 0062;0061 1CE4 0334 16FF0 0062; # (a◌᳤𖿰◌̴b; a◌᳤◌̴𖿰b; a◌᳤◌̴𖿰b; a◌᳤◌̴𖿰b; a◌᳤◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN REVERSED VISARGA UDATTA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 1CE5 0062;0061 0334 1CE5 16FF0 0062;0061 0334 1CE5 16FF0 0062;0061 0334 1CE5 16FF0 0062;0061 0334 1CE5 16FF0 0062; # (a𖿰◌̴◌᳥b; a◌̴◌᳥𖿰b; a◌̴◌᳥𖿰b; a◌̴◌᳥𖿰b; a◌̴◌᳥𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN VISARGA ANUDATTA, LATIN SMALL LETTER B +0061 1CE5 16FF0 0334 0062;0061 1CE5 0334 16FF0 0062;0061 1CE5 0334 16FF0 0062;0061 1CE5 0334 16FF0 0062;0061 1CE5 0334 16FF0 0062; # (a◌᳥𖿰◌̴b; a◌᳥◌̴𖿰b; a◌᳥◌̴𖿰b; a◌᳥◌̴𖿰b; a◌᳥◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN VISARGA ANUDATTA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 1CE6 0062;0061 0334 1CE6 16FF0 0062;0061 0334 1CE6 16FF0 0062;0061 0334 1CE6 16FF0 0062;0061 0334 1CE6 16FF0 0062; # (a𖿰◌̴◌᳦b; a◌̴◌᳦𖿰b; a◌̴◌᳦𖿰b; a◌̴◌᳦𖿰b; a◌̴◌᳦𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN REVERSED VISARGA ANUDATTA, LATIN SMALL LETTER B +0061 1CE6 16FF0 0334 0062;0061 1CE6 0334 16FF0 0062;0061 1CE6 0334 16FF0 0062;0061 1CE6 0334 16FF0 0062;0061 1CE6 0334 16FF0 0062; # (a◌᳦𖿰◌̴b; a◌᳦◌̴𖿰b; a◌᳦◌̴𖿰b; a◌᳦◌̴𖿰b; a◌᳦◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN REVERSED VISARGA ANUDATTA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 1CE7 0062;0061 0334 1CE7 16FF0 0062;0061 0334 1CE7 16FF0 0062;0061 0334 1CE7 16FF0 0062;0061 0334 1CE7 16FF0 0062; # (a𖿰◌̴◌᳧b; a◌̴◌᳧𖿰b; a◌̴◌᳧𖿰b; a◌̴◌᳧𖿰b; a◌̴◌᳧𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN VISARGA UDATTA WITH TAIL, LATIN SMALL LETTER B +0061 1CE7 16FF0 0334 0062;0061 1CE7 0334 16FF0 0062;0061 1CE7 0334 16FF0 0062;0061 1CE7 0334 16FF0 0062;0061 1CE7 0334 16FF0 0062; # (a◌᳧𖿰◌̴b; a◌᳧◌̴𖿰b; a◌᳧◌̴𖿰b; a◌᳧◌̴𖿰b; a◌᳧◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN VISARGA UDATTA WITH TAIL, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 1CE8 0062;0061 0334 1CE8 16FF0 0062;0061 0334 1CE8 16FF0 0062;0061 0334 1CE8 16FF0 0062;0061 0334 1CE8 16FF0 0062; # (a𖿰◌̴◌᳨b; a◌̴◌᳨𖿰b; a◌̴◌᳨𖿰b; a◌̴◌᳨𖿰b; a◌̴◌᳨𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN VISARGA ANUDATTA WITH TAIL, LATIN SMALL LETTER B +0061 1CE8 16FF0 0334 0062;0061 1CE8 0334 16FF0 0062;0061 1CE8 0334 16FF0 0062;0061 1CE8 0334 16FF0 0062;0061 1CE8 0334 16FF0 0062; # (a◌᳨𖿰◌̴b; a◌᳨◌̴𖿰b; a◌᳨◌̴𖿰b; a◌᳨◌̴𖿰b; a◌᳨◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN VISARGA ANUDATTA WITH TAIL, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1CED 0062;0061 1DFA 0316 1CED 059A 0062;0061 1DFA 0316 1CED 059A 0062;0061 1DFA 0316 1CED 059A 0062;0061 1DFA 0316 1CED 059A 0062; # (a◌֚◌̖◌᷺◌᳭b; a◌᷺◌̖◌᳭◌֚b; a◌᷺◌̖◌᳭◌֚b; a◌᷺◌̖◌᳭◌֚b; a◌᷺◌̖◌᳭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC SIGN TIRYAK, LATIN SMALL LETTER B +0061 1CED 059A 0316 1DFA 0062;0061 1DFA 1CED 0316 059A 0062;0061 1DFA 1CED 0316 059A 0062;0061 1DFA 1CED 0316 059A 0062;0061 1DFA 1CED 0316 059A 0062; # (a◌᳭◌֚◌̖◌᷺b; a◌᷺◌᳭◌̖◌֚b; a◌᷺◌᳭◌̖◌֚b; a◌᷺◌᳭◌̖◌֚b; a◌᷺◌᳭◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC SIGN TIRYAK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1CF4 0062;00E0 05AE 1CF4 0315 0062;0061 05AE 0300 1CF4 0315 0062;00E0 05AE 1CF4 0315 0062;0061 05AE 0300 1CF4 0315 0062; # (a◌̕◌̀◌֮◌᳴b; à◌֮◌᳴◌̕b; a◌֮◌̀◌᳴◌̕b; à◌֮◌᳴◌̕b; a◌֮◌̀◌᳴◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE CANDRA ABOVE, LATIN SMALL LETTER B +0061 1CF4 0315 0300 05AE 0062;0061 05AE 1CF4 0300 0315 0062;0061 05AE 1CF4 0300 0315 0062;0061 05AE 1CF4 0300 0315 0062;0061 05AE 1CF4 0300 0315 0062; # (a◌᳴◌̕◌̀◌֮b; a◌֮◌᳴◌̀◌̕b; a◌֮◌᳴◌̀◌̕b; a◌֮◌᳴◌̀◌̕b; a◌֮◌᳴◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE CANDRA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1CF8 0062;00E0 05AE 1CF8 0315 0062;0061 05AE 0300 1CF8 0315 0062;00E0 05AE 1CF8 0315 0062;0061 05AE 0300 1CF8 0315 0062; # (a◌̕◌̀◌֮◌᳸b; à◌֮◌᳸◌̕b; a◌֮◌̀◌᳸◌̕b; à◌֮◌᳸◌̕b; a◌֮◌̀◌᳸◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE RING ABOVE, LATIN SMALL LETTER B +0061 1CF8 0315 0300 05AE 0062;0061 05AE 1CF8 0300 0315 0062;0061 05AE 1CF8 0300 0315 0062;0061 05AE 1CF8 0300 0315 0062;0061 05AE 1CF8 0300 0315 0062; # (a◌᳸◌̕◌̀◌֮b; a◌֮◌᳸◌̀◌̕b; a◌֮◌᳸◌̀◌̕b; a◌֮◌᳸◌̀◌̕b; a◌֮◌᳸◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE RING ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1CF9 0062;00E0 05AE 1CF9 0315 0062;0061 05AE 0300 1CF9 0315 0062;00E0 05AE 1CF9 0315 0062;0061 05AE 0300 1CF9 0315 0062; # (a◌̕◌̀◌֮◌᳹b; à◌֮◌᳹◌̕b; a◌֮◌̀◌᳹◌̕b; à◌֮◌᳹◌̕b; a◌֮◌̀◌᳹◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE DOUBLE RING ABOVE, LATIN SMALL LETTER B +0061 1CF9 0315 0300 05AE 0062;0061 05AE 1CF9 0300 0315 0062;0061 05AE 1CF9 0300 0315 0062;0061 05AE 1CF9 0300 0315 0062;0061 05AE 1CF9 0300 0315 0062; # (a◌᳹◌̕◌̀◌֮b; a◌֮◌᳹◌̀◌̕b; a◌֮◌᳹◌̀◌̕b; a◌֮◌᳹◌̀◌̕b; a◌֮◌᳹◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE DOUBLE RING ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DC0 0062;00E0 05AE 1DC0 0315 0062;0061 05AE 0300 1DC0 0315 0062;00E0 05AE 1DC0 0315 0062;0061 05AE 0300 1DC0 0315 0062; # (a◌̕◌̀◌֮◌᷀b; à◌֮◌᷀◌̕b; a◌֮◌̀◌᷀◌̕b; à◌֮◌᷀◌̕b; a◌֮◌̀◌᷀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOTTED GRAVE ACCENT, LATIN SMALL LETTER B +0061 1DC0 0315 0300 05AE 0062;0061 05AE 1DC0 0300 0315 0062;0061 05AE 1DC0 0300 0315 0062;0061 05AE 1DC0 0300 0315 0062;0061 05AE 1DC0 0300 0315 0062; # (a◌᷀◌̕◌̀◌֮b; a◌֮◌᷀◌̀◌̕b; a◌֮◌᷀◌̀◌̕b; a◌֮◌᷀◌̀◌̕b; a◌֮◌᷀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOTTED GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DC1 0062;00E0 05AE 1DC1 0315 0062;0061 05AE 0300 1DC1 0315 0062;00E0 05AE 1DC1 0315 0062;0061 05AE 0300 1DC1 0315 0062; # (a◌̕◌̀◌֮◌᷁b; à◌֮◌᷁◌̕b; a◌֮◌̀◌᷁◌̕b; à◌֮◌᷁◌̕b; a◌֮◌̀◌᷁◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOTTED ACUTE ACCENT, LATIN SMALL LETTER B +0061 1DC1 0315 0300 05AE 0062;0061 05AE 1DC1 0300 0315 0062;0061 05AE 1DC1 0300 0315 0062;0061 05AE 1DC1 0300 0315 0062;0061 05AE 1DC1 0300 0315 0062; # (a◌᷁◌̕◌̀◌֮b; a◌֮◌᷁◌̀◌̕b; a◌֮◌᷁◌̀◌̕b; a◌֮◌᷁◌̀◌̕b; a◌֮◌᷁◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOTTED ACUTE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1DC2 0062;0061 1DFA 0316 1DC2 059A 0062;0061 1DFA 0316 1DC2 059A 0062;0061 1DFA 0316 1DC2 059A 0062;0061 1DFA 0316 1DC2 059A 0062; # (a◌֚◌̖◌᷺◌᷂b; a◌᷺◌̖◌᷂◌֚b; a◌᷺◌̖◌᷂◌֚b; a◌᷺◌̖◌᷂◌֚b; a◌᷺◌̖◌᷂◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING SNAKE BELOW, LATIN SMALL LETTER B +0061 1DC2 059A 0316 1DFA 0062;0061 1DFA 1DC2 0316 059A 0062;0061 1DFA 1DC2 0316 059A 0062;0061 1DFA 1DC2 0316 059A 0062;0061 1DFA 1DC2 0316 059A 0062; # (a◌᷂◌֚◌̖◌᷺b; a◌᷺◌᷂◌̖◌֚b; a◌᷺◌᷂◌̖◌֚b; a◌᷺◌᷂◌̖◌֚b; a◌᷺◌᷂◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SNAKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DC3 0062;00E0 05AE 1DC3 0315 0062;0061 05AE 0300 1DC3 0315 0062;00E0 05AE 1DC3 0315 0062;0061 05AE 0300 1DC3 0315 0062; # (a◌̕◌̀◌֮◌᷃b; à◌֮◌᷃◌̕b; a◌֮◌̀◌᷃◌̕b; à◌֮◌᷃◌̕b; a◌֮◌̀◌᷃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING SUSPENSION MARK, LATIN SMALL LETTER B +0061 1DC3 0315 0300 05AE 0062;0061 05AE 1DC3 0300 0315 0062;0061 05AE 1DC3 0300 0315 0062;0061 05AE 1DC3 0300 0315 0062;0061 05AE 1DC3 0300 0315 0062; # (a◌᷃◌̕◌̀◌֮b; a◌֮◌᷃◌̀◌̕b; a◌֮◌᷃◌̀◌̕b; a◌֮◌᷃◌̀◌̕b; a◌֮◌᷃◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING SUSPENSION MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DC4 0062;00E0 05AE 1DC4 0315 0062;0061 05AE 0300 1DC4 0315 0062;00E0 05AE 1DC4 0315 0062;0061 05AE 0300 1DC4 0315 0062; # (a◌̕◌̀◌֮◌᷄b; à◌֮◌᷄◌̕b; a◌֮◌̀◌᷄◌̕b; à◌֮◌᷄◌̕b; a◌֮◌̀◌᷄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING MACRON-ACUTE, LATIN SMALL LETTER B +0061 1DC4 0315 0300 05AE 0062;0061 05AE 1DC4 0300 0315 0062;0061 05AE 1DC4 0300 0315 0062;0061 05AE 1DC4 0300 0315 0062;0061 05AE 1DC4 0300 0315 0062; # (a◌᷄◌̕◌̀◌֮b; a◌֮◌᷄◌̀◌̕b; a◌֮◌᷄◌̀◌̕b; a◌֮◌᷄◌̀◌̕b; a◌֮◌᷄◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING MACRON-ACUTE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DC5 0062;00E0 05AE 1DC5 0315 0062;0061 05AE 0300 1DC5 0315 0062;00E0 05AE 1DC5 0315 0062;0061 05AE 0300 1DC5 0315 0062; # (a◌̕◌̀◌֮◌᷅b; à◌֮◌᷅◌̕b; a◌֮◌̀◌᷅◌̕b; à◌֮◌᷅◌̕b; a◌֮◌̀◌᷅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRAVE-MACRON, LATIN SMALL LETTER B +0061 1DC5 0315 0300 05AE 0062;0061 05AE 1DC5 0300 0315 0062;0061 05AE 1DC5 0300 0315 0062;0061 05AE 1DC5 0300 0315 0062;0061 05AE 1DC5 0300 0315 0062; # (a◌᷅◌̕◌̀◌֮b; a◌֮◌᷅◌̀◌̕b; a◌֮◌᷅◌̀◌̕b; a◌֮◌᷅◌̀◌̕b; a◌֮◌᷅◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRAVE-MACRON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DC6 0062;00E0 05AE 1DC6 0315 0062;0061 05AE 0300 1DC6 0315 0062;00E0 05AE 1DC6 0315 0062;0061 05AE 0300 1DC6 0315 0062; # (a◌̕◌̀◌֮◌᷆b; à◌֮◌᷆◌̕b; a◌֮◌̀◌᷆◌̕b; à◌֮◌᷆◌̕b; a◌֮◌̀◌᷆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING MACRON-GRAVE, LATIN SMALL LETTER B +0061 1DC6 0315 0300 05AE 0062;0061 05AE 1DC6 0300 0315 0062;0061 05AE 1DC6 0300 0315 0062;0061 05AE 1DC6 0300 0315 0062;0061 05AE 1DC6 0300 0315 0062; # (a◌᷆◌̕◌̀◌֮b; a◌֮◌᷆◌̀◌̕b; a◌֮◌᷆◌̀◌̕b; a◌֮◌᷆◌̀◌̕b; a◌֮◌᷆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING MACRON-GRAVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DC7 0062;00E0 05AE 1DC7 0315 0062;0061 05AE 0300 1DC7 0315 0062;00E0 05AE 1DC7 0315 0062;0061 05AE 0300 1DC7 0315 0062; # (a◌̕◌̀◌֮◌᷇b; à◌֮◌᷇◌̕b; a◌֮◌̀◌᷇◌̕b; à◌֮◌᷇◌̕b; a◌֮◌̀◌᷇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ACUTE-MACRON, LATIN SMALL LETTER B +0061 1DC7 0315 0300 05AE 0062;0061 05AE 1DC7 0300 0315 0062;0061 05AE 1DC7 0300 0315 0062;0061 05AE 1DC7 0300 0315 0062;0061 05AE 1DC7 0300 0315 0062; # (a◌᷇◌̕◌̀◌֮b; a◌֮◌᷇◌̀◌̕b; a◌֮◌᷇◌̀◌̕b; a◌֮◌᷇◌̀◌̕b; a◌֮◌᷇◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ACUTE-MACRON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DC8 0062;00E0 05AE 1DC8 0315 0062;0061 05AE 0300 1DC8 0315 0062;00E0 05AE 1DC8 0315 0062;0061 05AE 0300 1DC8 0315 0062; # (a◌̕◌̀◌֮◌᷈b; à◌֮◌᷈◌̕b; a◌֮◌̀◌᷈◌̕b; à◌֮◌᷈◌̕b; a◌֮◌̀◌᷈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRAVE-ACUTE-GRAVE, LATIN SMALL LETTER B +0061 1DC8 0315 0300 05AE 0062;0061 05AE 1DC8 0300 0315 0062;0061 05AE 1DC8 0300 0315 0062;0061 05AE 1DC8 0300 0315 0062;0061 05AE 1DC8 0300 0315 0062; # (a◌᷈◌̕◌̀◌֮b; a◌֮◌᷈◌̀◌̕b; a◌֮◌᷈◌̀◌̕b; a◌֮◌᷈◌̀◌̕b; a◌֮◌᷈◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRAVE-ACUTE-GRAVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DC9 0062;00E0 05AE 1DC9 0315 0062;0061 05AE 0300 1DC9 0315 0062;00E0 05AE 1DC9 0315 0062;0061 05AE 0300 1DC9 0315 0062; # (a◌̕◌̀◌֮◌᷉b; à◌֮◌᷉◌̕b; a◌֮◌̀◌᷉◌̕b; à◌֮◌᷉◌̕b; a◌֮◌̀◌᷉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ACUTE-GRAVE-ACUTE, LATIN SMALL LETTER B +0061 1DC9 0315 0300 05AE 0062;0061 05AE 1DC9 0300 0315 0062;0061 05AE 1DC9 0300 0315 0062;0061 05AE 1DC9 0300 0315 0062;0061 05AE 1DC9 0300 0315 0062; # (a◌᷉◌̕◌̀◌֮b; a◌֮◌᷉◌̀◌̕b; a◌֮◌᷉◌̀◌̕b; a◌֮◌᷉◌̀◌̕b; a◌֮◌᷉◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ACUTE-GRAVE-ACUTE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1DCA 0062;0061 1DFA 0316 1DCA 059A 0062;0061 1DFA 0316 1DCA 059A 0062;0061 1DFA 0316 1DCA 059A 0062;0061 1DFA 0316 1DCA 059A 0062; # (a◌֚◌̖◌᷺◌᷊b; a◌᷺◌̖◌᷊◌֚b; a◌᷺◌̖◌᷊◌֚b; a◌᷺◌̖◌᷊◌֚b; a◌᷺◌̖◌᷊◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LATIN SMALL LETTER R BELOW, LATIN SMALL LETTER B +0061 1DCA 059A 0316 1DFA 0062;0061 1DFA 1DCA 0316 059A 0062;0061 1DFA 1DCA 0316 059A 0062;0061 1DFA 1DCA 0316 059A 0062;0061 1DFA 1DCA 0316 059A 0062; # (a◌᷊◌֚◌̖◌᷺b; a◌᷺◌᷊◌̖◌֚b; a◌᷺◌᷊◌̖◌֚b; a◌᷺◌᷊◌̖◌֚b; a◌᷺◌᷊◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER R BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DCB 0062;00E0 05AE 1DCB 0315 0062;0061 05AE 0300 1DCB 0315 0062;00E0 05AE 1DCB 0315 0062;0061 05AE 0300 1DCB 0315 0062; # (a◌̕◌̀◌֮◌᷋b; à◌֮◌᷋◌̕b; a◌֮◌̀◌᷋◌̕b; à◌֮◌᷋◌̕b; a◌֮◌̀◌᷋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING BREVE-MACRON, LATIN SMALL LETTER B +0061 1DCB 0315 0300 05AE 0062;0061 05AE 1DCB 0300 0315 0062;0061 05AE 1DCB 0300 0315 0062;0061 05AE 1DCB 0300 0315 0062;0061 05AE 1DCB 0300 0315 0062; # (a◌᷋◌̕◌̀◌֮b; a◌֮◌᷋◌̀◌̕b; a◌֮◌᷋◌̀◌̕b; a◌֮◌᷋◌̀◌̕b; a◌֮◌᷋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING BREVE-MACRON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DCC 0062;00E0 05AE 1DCC 0315 0062;0061 05AE 0300 1DCC 0315 0062;00E0 05AE 1DCC 0315 0062;0061 05AE 0300 1DCC 0315 0062; # (a◌̕◌̀◌֮◌᷌b; à◌֮◌᷌◌̕b; a◌֮◌̀◌᷌◌̕b; à◌֮◌᷌◌̕b; a◌֮◌̀◌᷌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING MACRON-BREVE, LATIN SMALL LETTER B +0061 1DCC 0315 0300 05AE 0062;0061 05AE 1DCC 0300 0315 0062;0061 05AE 1DCC 0300 0315 0062;0061 05AE 1DCC 0300 0315 0062;0061 05AE 1DCC 0300 0315 0062; # (a◌᷌◌̕◌̀◌֮b; a◌֮◌᷌◌̀◌̕b; a◌֮◌᷌◌̀◌̕b; a◌֮◌᷌◌̀◌̕b; a◌֮◌᷌◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING MACRON-BREVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0345 035D 035C 1DCD 0062;0061 035C 035D 1DCD 0345 0062;0061 035C 035D 1DCD 0345 0062;0061 035C 035D 1DCD 0345 0062;0061 035C 035D 1DCD 0345 0062; # (a◌ͅ◌͝◌͜◌᷍b; a◌͜◌͝◌᷍◌ͅb; a◌͜◌͝◌᷍◌ͅb; a◌͜◌͝◌᷍◌ͅb; a◌͜◌͝◌᷍◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING DOUBLE CIRCUMFLEX ABOVE, LATIN SMALL LETTER B +0061 1DCD 0345 035D 035C 0062;0061 035C 1DCD 035D 0345 0062;0061 035C 1DCD 035D 0345 0062;0061 035C 1DCD 035D 0345 0062;0061 035C 1DCD 035D 0345 0062; # (a◌᷍◌ͅ◌͝◌͜b; a◌͜◌᷍◌͝◌ͅb; a◌͜◌᷍◌͝◌ͅb; a◌͜◌᷍◌͝◌ͅb; a◌͜◌᷍◌͝◌ͅb; ) LATIN SMALL LETTER A, COMBINING DOUBLE CIRCUMFLEX ABOVE, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, LATIN SMALL LETTER B +0061 031B 1DCE 0321 1DCE 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062; # (a◌̛◌᷎◌̡◌᷎b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; ) LATIN SMALL LETTER A, COMBINING HORN, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B +0061 1DCE 031B 1DCE 0321 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062; # (a◌᷎◌̛◌᷎◌̡b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING HORN, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1DCF 0062;0061 1DFA 0316 1DCF 059A 0062;0061 1DFA 0316 1DCF 059A 0062;0061 1DFA 0316 1DCF 059A 0062;0061 1DFA 0316 1DCF 059A 0062; # (a◌֚◌̖◌᷺◌᷏b; a◌᷺◌̖◌᷏◌֚b; a◌᷺◌̖◌᷏◌֚b; a◌᷺◌̖◌᷏◌֚b; a◌᷺◌̖◌᷏◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING ZIGZAG BELOW, LATIN SMALL LETTER B +0061 1DCF 059A 0316 1DFA 0062;0061 1DFA 1DCF 0316 059A 0062;0061 1DFA 1DCF 0316 059A 0062;0061 1DFA 1DCF 0316 059A 0062;0061 1DFA 1DCF 0316 059A 0062; # (a◌᷏◌֚◌̖◌᷺b; a◌᷺◌᷏◌̖◌֚b; a◌᷺◌᷏◌̖◌֚b; a◌᷺◌᷏◌̖◌֚b; a◌᷺◌᷏◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ZIGZAG BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 1DCE 0321 0F74 1DD0 0062;0061 0F74 0321 1DD0 1DCE 0062;0061 0F74 0321 1DD0 1DCE 0062;0061 0F74 0321 1DD0 1DCE 0062;0061 0F74 0321 1DD0 1DCE 0062; # (a◌᷎◌̡◌ུ◌᷐b; a◌ུ◌̡◌᷐◌᷎b; a◌ུ◌̡◌᷐◌᷎b; a◌ུ◌̡◌᷐◌᷎b; a◌ུ◌̡◌᷐◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING IS BELOW, LATIN SMALL LETTER B +0061 1DD0 1DCE 0321 0F74 0062;0061 0F74 1DD0 0321 1DCE 0062;0061 0F74 1DD0 0321 1DCE 0062;0061 0F74 1DD0 0321 1DCE 0062;0061 0F74 1DD0 0321 1DCE 0062; # (a◌᷐◌᷎◌̡◌ུb; a◌ུ◌᷐◌̡◌᷎b; a◌ུ◌᷐◌̡◌᷎b; a◌ུ◌᷐◌̡◌᷎b; a◌ུ◌᷐◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING IS BELOW, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DD1 0062;00E0 05AE 1DD1 0315 0062;0061 05AE 0300 1DD1 0315 0062;00E0 05AE 1DD1 0315 0062;0061 05AE 0300 1DD1 0315 0062; # (a◌̕◌̀◌֮◌᷑b; à◌֮◌᷑◌̕b; a◌֮◌̀◌᷑◌̕b; à◌֮◌᷑◌̕b; a◌֮◌̀◌᷑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING UR ABOVE, LATIN SMALL LETTER B +0061 1DD1 0315 0300 05AE 0062;0061 05AE 1DD1 0300 0315 0062;0061 05AE 1DD1 0300 0315 0062;0061 05AE 1DD1 0300 0315 0062;0061 05AE 1DD1 0300 0315 0062; # (a◌᷑◌̕◌̀◌֮b; a◌֮◌᷑◌̀◌̕b; a◌֮◌᷑◌̀◌̕b; a◌֮◌᷑◌̀◌̕b; a◌֮◌᷑◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING UR ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DD2 0062;00E0 05AE 1DD2 0315 0062;0061 05AE 0300 1DD2 0315 0062;00E0 05AE 1DD2 0315 0062;0061 05AE 0300 1DD2 0315 0062; # (a◌̕◌̀◌֮◌᷒b; à◌֮◌᷒◌̕b; a◌֮◌̀◌᷒◌̕b; à◌֮◌᷒◌̕b; a◌֮◌̀◌᷒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING US ABOVE, LATIN SMALL LETTER B +0061 1DD2 0315 0300 05AE 0062;0061 05AE 1DD2 0300 0315 0062;0061 05AE 1DD2 0300 0315 0062;0061 05AE 1DD2 0300 0315 0062;0061 05AE 1DD2 0300 0315 0062; # (a◌᷒◌̕◌̀◌֮b; a◌֮◌᷒◌̀◌̕b; a◌֮◌᷒◌̀◌̕b; a◌֮◌᷒◌̀◌̕b; a◌֮◌᷒◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING US ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DD3 0062;00E0 05AE 1DD3 0315 0062;0061 05AE 0300 1DD3 0315 0062;00E0 05AE 1DD3 0315 0062;0061 05AE 0300 1DD3 0315 0062; # (a◌̕◌̀◌֮◌ᷓb; à◌֮◌ᷓ◌̕b; a◌֮◌̀◌ᷓ◌̕b; à◌֮◌ᷓ◌̕b; a◌֮◌̀◌ᷓ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE, LATIN SMALL LETTER B +0061 1DD3 0315 0300 05AE 0062;0061 05AE 1DD3 0300 0315 0062;0061 05AE 1DD3 0300 0315 0062;0061 05AE 1DD3 0300 0315 0062;0061 05AE 1DD3 0300 0315 0062; # (a◌ᷓ◌̕◌̀◌֮b; a◌֮◌ᷓ◌̀◌̕b; a◌֮◌ᷓ◌̀◌̕b; a◌֮◌ᷓ◌̀◌̕b; a◌֮◌ᷓ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DD4 0062;00E0 05AE 1DD4 0315 0062;0061 05AE 0300 1DD4 0315 0062;00E0 05AE 1DD4 0315 0062;0061 05AE 0300 1DD4 0315 0062; # (a◌̕◌̀◌֮◌ᷔb; à◌֮◌ᷔ◌̕b; a◌֮◌̀◌ᷔ◌̕b; à◌֮◌ᷔ◌̕b; a◌֮◌̀◌ᷔ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER AE, LATIN SMALL LETTER B +0061 1DD4 0315 0300 05AE 0062;0061 05AE 1DD4 0300 0315 0062;0061 05AE 1DD4 0300 0315 0062;0061 05AE 1DD4 0300 0315 0062;0061 05AE 1DD4 0300 0315 0062; # (a◌ᷔ◌̕◌̀◌֮b; a◌֮◌ᷔ◌̀◌̕b; a◌֮◌ᷔ◌̀◌̕b; a◌֮◌ᷔ◌̀◌̕b; a◌֮◌ᷔ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER AE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DD5 0062;00E0 05AE 1DD5 0315 0062;0061 05AE 0300 1DD5 0315 0062;00E0 05AE 1DD5 0315 0062;0061 05AE 0300 1DD5 0315 0062; # (a◌̕◌̀◌֮◌ᷕb; à◌֮◌ᷕ◌̕b; a◌֮◌̀◌ᷕ◌̕b; à◌֮◌ᷕ◌̕b; a◌֮◌̀◌ᷕ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER AO, LATIN SMALL LETTER B +0061 1DD5 0315 0300 05AE 0062;0061 05AE 1DD5 0300 0315 0062;0061 05AE 1DD5 0300 0315 0062;0061 05AE 1DD5 0300 0315 0062;0061 05AE 1DD5 0300 0315 0062; # (a◌ᷕ◌̕◌̀◌֮b; a◌֮◌ᷕ◌̀◌̕b; a◌֮◌ᷕ◌̀◌̕b; a◌֮◌ᷕ◌̀◌̕b; a◌֮◌ᷕ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER AO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DD6 0062;00E0 05AE 1DD6 0315 0062;0061 05AE 0300 1DD6 0315 0062;00E0 05AE 1DD6 0315 0062;0061 05AE 0300 1DD6 0315 0062; # (a◌̕◌̀◌֮◌ᷖb; à◌֮◌ᷖ◌̕b; a◌֮◌̀◌ᷖ◌̕b; à◌֮◌ᷖ◌̕b; a◌֮◌̀◌ᷖ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER AV, LATIN SMALL LETTER B +0061 1DD6 0315 0300 05AE 0062;0061 05AE 1DD6 0300 0315 0062;0061 05AE 1DD6 0300 0315 0062;0061 05AE 1DD6 0300 0315 0062;0061 05AE 1DD6 0300 0315 0062; # (a◌ᷖ◌̕◌̀◌֮b; a◌֮◌ᷖ◌̀◌̕b; a◌֮◌ᷖ◌̀◌̕b; a◌֮◌ᷖ◌̀◌̕b; a◌֮◌ᷖ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER AV, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DD7 0062;00E0 05AE 1DD7 0315 0062;0061 05AE 0300 1DD7 0315 0062;00E0 05AE 1DD7 0315 0062;0061 05AE 0300 1DD7 0315 0062; # (a◌̕◌̀◌֮◌ᷗb; à◌֮◌ᷗ◌̕b; a◌֮◌̀◌ᷗ◌̕b; à◌֮◌ᷗ◌̕b; a◌֮◌̀◌ᷗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER C CEDILLA, LATIN SMALL LETTER B +0061 1DD7 0315 0300 05AE 0062;0061 05AE 1DD7 0300 0315 0062;0061 05AE 1DD7 0300 0315 0062;0061 05AE 1DD7 0300 0315 0062;0061 05AE 1DD7 0300 0315 0062; # (a◌ᷗ◌̕◌̀◌֮b; a◌֮◌ᷗ◌̀◌̕b; a◌֮◌ᷗ◌̀◌̕b; a◌֮◌ᷗ◌̀◌̕b; a◌֮◌ᷗ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER C CEDILLA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DD8 0062;00E0 05AE 1DD8 0315 0062;0061 05AE 0300 1DD8 0315 0062;00E0 05AE 1DD8 0315 0062;0061 05AE 0300 1DD8 0315 0062; # (a◌̕◌̀◌֮◌ᷘb; à◌֮◌ᷘ◌̕b; a◌֮◌̀◌ᷘ◌̕b; à◌֮◌ᷘ◌̕b; a◌֮◌̀◌ᷘ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER INSULAR D, LATIN SMALL LETTER B +0061 1DD8 0315 0300 05AE 0062;0061 05AE 1DD8 0300 0315 0062;0061 05AE 1DD8 0300 0315 0062;0061 05AE 1DD8 0300 0315 0062;0061 05AE 1DD8 0300 0315 0062; # (a◌ᷘ◌̕◌̀◌֮b; a◌֮◌ᷘ◌̀◌̕b; a◌֮◌ᷘ◌̀◌̕b; a◌֮◌ᷘ◌̀◌̕b; a◌֮◌ᷘ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER INSULAR D, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DD9 0062;00E0 05AE 1DD9 0315 0062;0061 05AE 0300 1DD9 0315 0062;00E0 05AE 1DD9 0315 0062;0061 05AE 0300 1DD9 0315 0062; # (a◌̕◌̀◌֮◌ᷙb; à◌֮◌ᷙ◌̕b; a◌֮◌̀◌ᷙ◌̕b; à◌֮◌ᷙ◌̕b; a◌֮◌̀◌ᷙ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER ETH, LATIN SMALL LETTER B +0061 1DD9 0315 0300 05AE 0062;0061 05AE 1DD9 0300 0315 0062;0061 05AE 1DD9 0300 0315 0062;0061 05AE 1DD9 0300 0315 0062;0061 05AE 1DD9 0300 0315 0062; # (a◌ᷙ◌̕◌̀◌֮b; a◌֮◌ᷙ◌̀◌̕b; a◌֮◌ᷙ◌̀◌̕b; a◌֮◌ᷙ◌̀◌̕b; a◌֮◌ᷙ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER ETH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DDA 0062;00E0 05AE 1DDA 0315 0062;0061 05AE 0300 1DDA 0315 0062;00E0 05AE 1DDA 0315 0062;0061 05AE 0300 1DDA 0315 0062; # (a◌̕◌̀◌֮◌ᷚb; à◌֮◌ᷚ◌̕b; a◌֮◌̀◌ᷚ◌̕b; à◌֮◌ᷚ◌̕b; a◌֮◌̀◌ᷚ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER G, LATIN SMALL LETTER B +0061 1DDA 0315 0300 05AE 0062;0061 05AE 1DDA 0300 0315 0062;0061 05AE 1DDA 0300 0315 0062;0061 05AE 1DDA 0300 0315 0062;0061 05AE 1DDA 0300 0315 0062; # (a◌ᷚ◌̕◌̀◌֮b; a◌֮◌ᷚ◌̀◌̕b; a◌֮◌ᷚ◌̀◌̕b; a◌֮◌ᷚ◌̀◌̕b; a◌֮◌ᷚ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER G, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DDB 0062;00E0 05AE 1DDB 0315 0062;0061 05AE 0300 1DDB 0315 0062;00E0 05AE 1DDB 0315 0062;0061 05AE 0300 1DDB 0315 0062; # (a◌̕◌̀◌֮◌ᷛb; à◌֮◌ᷛ◌̕b; a◌֮◌̀◌ᷛ◌̕b; à◌֮◌ᷛ◌̕b; a◌֮◌̀◌ᷛ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN LETTER SMALL CAPITAL G, LATIN SMALL LETTER B +0061 1DDB 0315 0300 05AE 0062;0061 05AE 1DDB 0300 0315 0062;0061 05AE 1DDB 0300 0315 0062;0061 05AE 1DDB 0300 0315 0062;0061 05AE 1DDB 0300 0315 0062; # (a◌ᷛ◌̕◌̀◌֮b; a◌֮◌ᷛ◌̀◌̕b; a◌֮◌ᷛ◌̀◌̕b; a◌֮◌ᷛ◌̀◌̕b; a◌֮◌ᷛ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN LETTER SMALL CAPITAL G, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DDC 0062;00E0 05AE 1DDC 0315 0062;0061 05AE 0300 1DDC 0315 0062;00E0 05AE 1DDC 0315 0062;0061 05AE 0300 1DDC 0315 0062; # (a◌̕◌̀◌֮◌ᷜb; à◌֮◌ᷜ◌̕b; a◌֮◌̀◌ᷜ◌̕b; à◌֮◌ᷜ◌̕b; a◌֮◌̀◌ᷜ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER K, LATIN SMALL LETTER B +0061 1DDC 0315 0300 05AE 0062;0061 05AE 1DDC 0300 0315 0062;0061 05AE 1DDC 0300 0315 0062;0061 05AE 1DDC 0300 0315 0062;0061 05AE 1DDC 0300 0315 0062; # (a◌ᷜ◌̕◌̀◌֮b; a◌֮◌ᷜ◌̀◌̕b; a◌֮◌ᷜ◌̀◌̕b; a◌֮◌ᷜ◌̀◌̕b; a◌֮◌ᷜ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER K, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DDD 0062;00E0 05AE 1DDD 0315 0062;0061 05AE 0300 1DDD 0315 0062;00E0 05AE 1DDD 0315 0062;0061 05AE 0300 1DDD 0315 0062; # (a◌̕◌̀◌֮◌ᷝb; à◌֮◌ᷝ◌̕b; a◌֮◌̀◌ᷝ◌̕b; à◌֮◌ᷝ◌̕b; a◌֮◌̀◌ᷝ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER L, LATIN SMALL LETTER B +0061 1DDD 0315 0300 05AE 0062;0061 05AE 1DDD 0300 0315 0062;0061 05AE 1DDD 0300 0315 0062;0061 05AE 1DDD 0300 0315 0062;0061 05AE 1DDD 0300 0315 0062; # (a◌ᷝ◌̕◌̀◌֮b; a◌֮◌ᷝ◌̀◌̕b; a◌֮◌ᷝ◌̀◌̕b; a◌֮◌ᷝ◌̀◌̕b; a◌֮◌ᷝ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER L, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DDE 0062;00E0 05AE 1DDE 0315 0062;0061 05AE 0300 1DDE 0315 0062;00E0 05AE 1DDE 0315 0062;0061 05AE 0300 1DDE 0315 0062; # (a◌̕◌̀◌֮◌ᷞb; à◌֮◌ᷞ◌̕b; a◌֮◌̀◌ᷞ◌̕b; à◌֮◌ᷞ◌̕b; a◌֮◌̀◌ᷞ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN LETTER SMALL CAPITAL L, LATIN SMALL LETTER B +0061 1DDE 0315 0300 05AE 0062;0061 05AE 1DDE 0300 0315 0062;0061 05AE 1DDE 0300 0315 0062;0061 05AE 1DDE 0300 0315 0062;0061 05AE 1DDE 0300 0315 0062; # (a◌ᷞ◌̕◌̀◌֮b; a◌֮◌ᷞ◌̀◌̕b; a◌֮◌ᷞ◌̀◌̕b; a◌֮◌ᷞ◌̀◌̕b; a◌֮◌ᷞ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN LETTER SMALL CAPITAL L, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DDF 0062;00E0 05AE 1DDF 0315 0062;0061 05AE 0300 1DDF 0315 0062;00E0 05AE 1DDF 0315 0062;0061 05AE 0300 1DDF 0315 0062; # (a◌̕◌̀◌֮◌ᷟb; à◌֮◌ᷟ◌̕b; a◌֮◌̀◌ᷟ◌̕b; à◌֮◌ᷟ◌̕b; a◌֮◌̀◌ᷟ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN LETTER SMALL CAPITAL M, LATIN SMALL LETTER B +0061 1DDF 0315 0300 05AE 0062;0061 05AE 1DDF 0300 0315 0062;0061 05AE 1DDF 0300 0315 0062;0061 05AE 1DDF 0300 0315 0062;0061 05AE 1DDF 0300 0315 0062; # (a◌ᷟ◌̕◌̀◌֮b; a◌֮◌ᷟ◌̀◌̕b; a◌֮◌ᷟ◌̀◌̕b; a◌֮◌ᷟ◌̀◌̕b; a◌֮◌ᷟ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN LETTER SMALL CAPITAL M, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DE0 0062;00E0 05AE 1DE0 0315 0062;0061 05AE 0300 1DE0 0315 0062;00E0 05AE 1DE0 0315 0062;0061 05AE 0300 1DE0 0315 0062; # (a◌̕◌̀◌֮◌ᷠb; à◌֮◌ᷠ◌̕b; a◌֮◌̀◌ᷠ◌̕b; à◌֮◌ᷠ◌̕b; a◌֮◌̀◌ᷠ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER N, LATIN SMALL LETTER B +0061 1DE0 0315 0300 05AE 0062;0061 05AE 1DE0 0300 0315 0062;0061 05AE 1DE0 0300 0315 0062;0061 05AE 1DE0 0300 0315 0062;0061 05AE 1DE0 0300 0315 0062; # (a◌ᷠ◌̕◌̀◌֮b; a◌֮◌ᷠ◌̀◌̕b; a◌֮◌ᷠ◌̀◌̕b; a◌֮◌ᷠ◌̀◌̕b; a◌֮◌ᷠ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER N, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DE1 0062;00E0 05AE 1DE1 0315 0062;0061 05AE 0300 1DE1 0315 0062;00E0 05AE 1DE1 0315 0062;0061 05AE 0300 1DE1 0315 0062; # (a◌̕◌̀◌֮◌ᷡb; à◌֮◌ᷡ◌̕b; a◌֮◌̀◌ᷡ◌̕b; à◌֮◌ᷡ◌̕b; a◌֮◌̀◌ᷡ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN LETTER SMALL CAPITAL N, LATIN SMALL LETTER B +0061 1DE1 0315 0300 05AE 0062;0061 05AE 1DE1 0300 0315 0062;0061 05AE 1DE1 0300 0315 0062;0061 05AE 1DE1 0300 0315 0062;0061 05AE 1DE1 0300 0315 0062; # (a◌ᷡ◌̕◌̀◌֮b; a◌֮◌ᷡ◌̀◌̕b; a◌֮◌ᷡ◌̀◌̕b; a◌֮◌ᷡ◌̀◌̕b; a◌֮◌ᷡ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN LETTER SMALL CAPITAL N, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DE2 0062;00E0 05AE 1DE2 0315 0062;0061 05AE 0300 1DE2 0315 0062;00E0 05AE 1DE2 0315 0062;0061 05AE 0300 1DE2 0315 0062; # (a◌̕◌̀◌֮◌ᷢb; à◌֮◌ᷢ◌̕b; a◌֮◌̀◌ᷢ◌̕b; à◌֮◌ᷢ◌̕b; a◌֮◌̀◌ᷢ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN LETTER SMALL CAPITAL R, LATIN SMALL LETTER B +0061 1DE2 0315 0300 05AE 0062;0061 05AE 1DE2 0300 0315 0062;0061 05AE 1DE2 0300 0315 0062;0061 05AE 1DE2 0300 0315 0062;0061 05AE 1DE2 0300 0315 0062; # (a◌ᷢ◌̕◌̀◌֮b; a◌֮◌ᷢ◌̀◌̕b; a◌֮◌ᷢ◌̀◌̕b; a◌֮◌ᷢ◌̀◌̕b; a◌֮◌ᷢ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN LETTER SMALL CAPITAL R, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DE3 0062;00E0 05AE 1DE3 0315 0062;0061 05AE 0300 1DE3 0315 0062;00E0 05AE 1DE3 0315 0062;0061 05AE 0300 1DE3 0315 0062; # (a◌̕◌̀◌֮◌ᷣb; à◌֮◌ᷣ◌̕b; a◌֮◌̀◌ᷣ◌̕b; à◌֮◌ᷣ◌̕b; a◌֮◌̀◌ᷣ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER R ROTUNDA, LATIN SMALL LETTER B +0061 1DE3 0315 0300 05AE 0062;0061 05AE 1DE3 0300 0315 0062;0061 05AE 1DE3 0300 0315 0062;0061 05AE 1DE3 0300 0315 0062;0061 05AE 1DE3 0300 0315 0062; # (a◌ᷣ◌̕◌̀◌֮b; a◌֮◌ᷣ◌̀◌̕b; a◌֮◌ᷣ◌̀◌̕b; a◌֮◌ᷣ◌̀◌̕b; a◌֮◌ᷣ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER R ROTUNDA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DE4 0062;00E0 05AE 1DE4 0315 0062;0061 05AE 0300 1DE4 0315 0062;00E0 05AE 1DE4 0315 0062;0061 05AE 0300 1DE4 0315 0062; # (a◌̕◌̀◌֮◌ᷤb; à◌֮◌ᷤ◌̕b; a◌֮◌̀◌ᷤ◌̕b; à◌֮◌ᷤ◌̕b; a◌֮◌̀◌ᷤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER S, LATIN SMALL LETTER B +0061 1DE4 0315 0300 05AE 0062;0061 05AE 1DE4 0300 0315 0062;0061 05AE 1DE4 0300 0315 0062;0061 05AE 1DE4 0300 0315 0062;0061 05AE 1DE4 0300 0315 0062; # (a◌ᷤ◌̕◌̀◌֮b; a◌֮◌ᷤ◌̀◌̕b; a◌֮◌ᷤ◌̀◌̕b; a◌֮◌ᷤ◌̀◌̕b; a◌֮◌ᷤ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER S, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DE5 0062;00E0 05AE 1DE5 0315 0062;0061 05AE 0300 1DE5 0315 0062;00E0 05AE 1DE5 0315 0062;0061 05AE 0300 1DE5 0315 0062; # (a◌̕◌̀◌֮◌ᷥb; à◌֮◌ᷥ◌̕b; a◌֮◌̀◌ᷥ◌̕b; à◌֮◌ᷥ◌̕b; a◌֮◌̀◌ᷥ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER LONG S, LATIN SMALL LETTER B +0061 1DE5 0315 0300 05AE 0062;0061 05AE 1DE5 0300 0315 0062;0061 05AE 1DE5 0300 0315 0062;0061 05AE 1DE5 0300 0315 0062;0061 05AE 1DE5 0300 0315 0062; # (a◌ᷥ◌̕◌̀◌֮b; a◌֮◌ᷥ◌̀◌̕b; a◌֮◌ᷥ◌̀◌̕b; a◌֮◌ᷥ◌̀◌̕b; a◌֮◌ᷥ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER LONG S, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DE6 0062;00E0 05AE 1DE6 0315 0062;0061 05AE 0300 1DE6 0315 0062;00E0 05AE 1DE6 0315 0062;0061 05AE 0300 1DE6 0315 0062; # (a◌̕◌̀◌֮◌ᷦb; à◌֮◌ᷦ◌̕b; a◌֮◌̀◌ᷦ◌̕b; à◌֮◌ᷦ◌̕b; a◌֮◌̀◌ᷦ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER Z, LATIN SMALL LETTER B +0061 1DE6 0315 0300 05AE 0062;0061 05AE 1DE6 0300 0315 0062;0061 05AE 1DE6 0300 0315 0062;0061 05AE 1DE6 0300 0315 0062;0061 05AE 1DE6 0300 0315 0062; # (a◌ᷦ◌̕◌̀◌֮b; a◌֮◌ᷦ◌̀◌̕b; a◌֮◌ᷦ◌̀◌̕b; a◌֮◌ᷦ◌̀◌̕b; a◌֮◌ᷦ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER Z, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DE7 0062;00E0 05AE 1DE7 0315 0062;0061 05AE 0300 1DE7 0315 0062;00E0 05AE 1DE7 0315 0062;0061 05AE 0300 1DE7 0315 0062; # (a◌̕◌̀◌֮◌ᷧb; à◌֮◌ᷧ◌̕b; a◌֮◌̀◌ᷧ◌̕b; à◌֮◌ᷧ◌̕b; a◌֮◌̀◌ᷧ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER ALPHA, LATIN SMALL LETTER B +0061 1DE7 0315 0300 05AE 0062;0061 05AE 1DE7 0300 0315 0062;0061 05AE 1DE7 0300 0315 0062;0061 05AE 1DE7 0300 0315 0062;0061 05AE 1DE7 0300 0315 0062; # (a◌ᷧ◌̕◌̀◌֮b; a◌֮◌ᷧ◌̀◌̕b; a◌֮◌ᷧ◌̀◌̕b; a◌֮◌ᷧ◌̀◌̕b; a◌֮◌ᷧ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER ALPHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DE8 0062;00E0 05AE 1DE8 0315 0062;0061 05AE 0300 1DE8 0315 0062;00E0 05AE 1DE8 0315 0062;0061 05AE 0300 1DE8 0315 0062; # (a◌̕◌̀◌֮◌ᷨb; à◌֮◌ᷨ◌̕b; a◌֮◌̀◌ᷨ◌̕b; à◌֮◌ᷨ◌̕b; a◌֮◌̀◌ᷨ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER B, LATIN SMALL LETTER B +0061 1DE8 0315 0300 05AE 0062;0061 05AE 1DE8 0300 0315 0062;0061 05AE 1DE8 0300 0315 0062;0061 05AE 1DE8 0300 0315 0062;0061 05AE 1DE8 0300 0315 0062; # (a◌ᷨ◌̕◌̀◌֮b; a◌֮◌ᷨ◌̀◌̕b; a◌֮◌ᷨ◌̀◌̕b; a◌֮◌ᷨ◌̀◌̕b; a◌֮◌ᷨ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER B, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DE9 0062;00E0 05AE 1DE9 0315 0062;0061 05AE 0300 1DE9 0315 0062;00E0 05AE 1DE9 0315 0062;0061 05AE 0300 1DE9 0315 0062; # (a◌̕◌̀◌֮◌ᷩb; à◌֮◌ᷩ◌̕b; a◌֮◌̀◌ᷩ◌̕b; à◌֮◌ᷩ◌̕b; a◌֮◌̀◌ᷩ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER BETA, LATIN SMALL LETTER B +0061 1DE9 0315 0300 05AE 0062;0061 05AE 1DE9 0300 0315 0062;0061 05AE 1DE9 0300 0315 0062;0061 05AE 1DE9 0300 0315 0062;0061 05AE 1DE9 0300 0315 0062; # (a◌ᷩ◌̕◌̀◌֮b; a◌֮◌ᷩ◌̀◌̕b; a◌֮◌ᷩ◌̀◌̕b; a◌֮◌ᷩ◌̀◌̕b; a◌֮◌ᷩ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER BETA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DEA 0062;00E0 05AE 1DEA 0315 0062;0061 05AE 0300 1DEA 0315 0062;00E0 05AE 1DEA 0315 0062;0061 05AE 0300 1DEA 0315 0062; # (a◌̕◌̀◌֮◌ᷪb; à◌֮◌ᷪ◌̕b; a◌֮◌̀◌ᷪ◌̕b; à◌֮◌ᷪ◌̕b; a◌֮◌̀◌ᷪ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER SCHWA, LATIN SMALL LETTER B +0061 1DEA 0315 0300 05AE 0062;0061 05AE 1DEA 0300 0315 0062;0061 05AE 1DEA 0300 0315 0062;0061 05AE 1DEA 0300 0315 0062;0061 05AE 1DEA 0300 0315 0062; # (a◌ᷪ◌̕◌̀◌֮b; a◌֮◌ᷪ◌̀◌̕b; a◌֮◌ᷪ◌̀◌̕b; a◌֮◌ᷪ◌̀◌̕b; a◌֮◌ᷪ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER SCHWA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DEB 0062;00E0 05AE 1DEB 0315 0062;0061 05AE 0300 1DEB 0315 0062;00E0 05AE 1DEB 0315 0062;0061 05AE 0300 1DEB 0315 0062; # (a◌̕◌̀◌֮◌ᷫb; à◌֮◌ᷫ◌̕b; a◌֮◌̀◌ᷫ◌̕b; à◌֮◌ᷫ◌̕b; a◌֮◌̀◌ᷫ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER F, LATIN SMALL LETTER B +0061 1DEB 0315 0300 05AE 0062;0061 05AE 1DEB 0300 0315 0062;0061 05AE 1DEB 0300 0315 0062;0061 05AE 1DEB 0300 0315 0062;0061 05AE 1DEB 0300 0315 0062; # (a◌ᷫ◌̕◌̀◌֮b; a◌֮◌ᷫ◌̀◌̕b; a◌֮◌ᷫ◌̀◌̕b; a◌֮◌ᷫ◌̀◌̕b; a◌֮◌ᷫ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER F, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DEC 0062;00E0 05AE 1DEC 0315 0062;0061 05AE 0300 1DEC 0315 0062;00E0 05AE 1DEC 0315 0062;0061 05AE 0300 1DEC 0315 0062; # (a◌̕◌̀◌֮◌ᷬb; à◌֮◌ᷬ◌̕b; a◌֮◌̀◌ᷬ◌̕b; à◌֮◌ᷬ◌̕b; a◌֮◌̀◌ᷬ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE, LATIN SMALL LETTER B +0061 1DEC 0315 0300 05AE 0062;0061 05AE 1DEC 0300 0315 0062;0061 05AE 1DEC 0300 0315 0062;0061 05AE 1DEC 0300 0315 0062;0061 05AE 1DEC 0300 0315 0062; # (a◌ᷬ◌̕◌̀◌֮b; a◌֮◌ᷬ◌̀◌̕b; a◌֮◌ᷬ◌̀◌̕b; a◌֮◌ᷬ◌̀◌̕b; a◌֮◌ᷬ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DED 0062;00E0 05AE 1DED 0315 0062;0061 05AE 0300 1DED 0315 0062;00E0 05AE 1DED 0315 0062;0061 05AE 0300 1DED 0315 0062; # (a◌̕◌̀◌֮◌ᷭb; à◌֮◌ᷭ◌̕b; a◌֮◌̀◌ᷭ◌̕b; à◌֮◌ᷭ◌̕b; a◌֮◌̀◌ᷭ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE, LATIN SMALL LETTER B +0061 1DED 0315 0300 05AE 0062;0061 05AE 1DED 0300 0315 0062;0061 05AE 1DED 0300 0315 0062;0061 05AE 1DED 0300 0315 0062;0061 05AE 1DED 0300 0315 0062; # (a◌ᷭ◌̕◌̀◌֮b; a◌֮◌ᷭ◌̀◌̕b; a◌֮◌ᷭ◌̀◌̕b; a◌֮◌ᷭ◌̀◌̕b; a◌֮◌ᷭ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DEE 0062;00E0 05AE 1DEE 0315 0062;0061 05AE 0300 1DEE 0315 0062;00E0 05AE 1DEE 0315 0062;0061 05AE 0300 1DEE 0315 0062; # (a◌̕◌̀◌֮◌ᷮb; à◌֮◌ᷮ◌̕b; a◌֮◌̀◌ᷮ◌̕b; à◌֮◌ᷮ◌̕b; a◌֮◌̀◌ᷮ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER P, LATIN SMALL LETTER B +0061 1DEE 0315 0300 05AE 0062;0061 05AE 1DEE 0300 0315 0062;0061 05AE 1DEE 0300 0315 0062;0061 05AE 1DEE 0300 0315 0062;0061 05AE 1DEE 0300 0315 0062; # (a◌ᷮ◌̕◌̀◌֮b; a◌֮◌ᷮ◌̀◌̕b; a◌֮◌ᷮ◌̀◌̕b; a◌֮◌ᷮ◌̀◌̕b; a◌֮◌ᷮ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER P, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DEF 0062;00E0 05AE 1DEF 0315 0062;0061 05AE 0300 1DEF 0315 0062;00E0 05AE 1DEF 0315 0062;0061 05AE 0300 1DEF 0315 0062; # (a◌̕◌̀◌֮◌ᷯb; à◌֮◌ᷯ◌̕b; a◌֮◌̀◌ᷯ◌̕b; à◌֮◌ᷯ◌̕b; a◌֮◌̀◌ᷯ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER ESH, LATIN SMALL LETTER B +0061 1DEF 0315 0300 05AE 0062;0061 05AE 1DEF 0300 0315 0062;0061 05AE 1DEF 0300 0315 0062;0061 05AE 1DEF 0300 0315 0062;0061 05AE 1DEF 0300 0315 0062; # (a◌ᷯ◌̕◌̀◌֮b; a◌֮◌ᷯ◌̀◌̕b; a◌֮◌ᷯ◌̀◌̕b; a◌֮◌ᷯ◌̀◌̕b; a◌֮◌ᷯ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER ESH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DF0 0062;00E0 05AE 1DF0 0315 0062;0061 05AE 0300 1DF0 0315 0062;00E0 05AE 1DF0 0315 0062;0061 05AE 0300 1DF0 0315 0062; # (a◌̕◌̀◌֮◌ᷰb; à◌֮◌ᷰ◌̕b; a◌֮◌̀◌ᷰ◌̕b; à◌֮◌ᷰ◌̕b; a◌֮◌̀◌ᷰ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE, LATIN SMALL LETTER B +0061 1DF0 0315 0300 05AE 0062;0061 05AE 1DF0 0300 0315 0062;0061 05AE 1DF0 0300 0315 0062;0061 05AE 1DF0 0300 0315 0062;0061 05AE 1DF0 0300 0315 0062; # (a◌ᷰ◌̕◌̀◌֮b; a◌֮◌ᷰ◌̀◌̕b; a◌֮◌ᷰ◌̀◌̕b; a◌֮◌ᷰ◌̀◌̕b; a◌֮◌ᷰ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DF1 0062;00E0 05AE 1DF1 0315 0062;0061 05AE 0300 1DF1 0315 0062;00E0 05AE 1DF1 0315 0062;0061 05AE 0300 1DF1 0315 0062; # (a◌̕◌̀◌֮◌ᷱb; à◌֮◌ᷱ◌̕b; a◌֮◌̀◌ᷱ◌̕b; à◌֮◌ᷱ◌̕b; a◌֮◌̀◌ᷱ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER W, LATIN SMALL LETTER B +0061 1DF1 0315 0300 05AE 0062;0061 05AE 1DF1 0300 0315 0062;0061 05AE 1DF1 0300 0315 0062;0061 05AE 1DF1 0300 0315 0062;0061 05AE 1DF1 0300 0315 0062; # (a◌ᷱ◌̕◌̀◌֮b; a◌֮◌ᷱ◌̀◌̕b; a◌֮◌ᷱ◌̀◌̕b; a◌֮◌ᷱ◌̀◌̕b; a◌֮◌ᷱ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER W, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DF2 0062;00E0 05AE 1DF2 0315 0062;0061 05AE 0300 1DF2 0315 0062;00E0 05AE 1DF2 0315 0062;0061 05AE 0300 1DF2 0315 0062; # (a◌̕◌̀◌֮◌ᷲb; à◌֮◌ᷲ◌̕b; a◌֮◌̀◌ᷲ◌̕b; à◌֮◌ᷲ◌̕b; a◌֮◌̀◌ᷲ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER A WITH DIAERESIS, LATIN SMALL LETTER B +0061 1DF2 0315 0300 05AE 0062;0061 05AE 1DF2 0300 0315 0062;0061 05AE 1DF2 0300 0315 0062;0061 05AE 1DF2 0300 0315 0062;0061 05AE 1DF2 0300 0315 0062; # (a◌ᷲ◌̕◌̀◌֮b; a◌֮◌ᷲ◌̀◌̕b; a◌֮◌ᷲ◌̀◌̕b; a◌֮◌ᷲ◌̀◌̕b; a◌֮◌ᷲ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER A WITH DIAERESIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DF3 0062;00E0 05AE 1DF3 0315 0062;0061 05AE 0300 1DF3 0315 0062;00E0 05AE 1DF3 0315 0062;0061 05AE 0300 1DF3 0315 0062; # (a◌̕◌̀◌֮◌ᷳb; à◌֮◌ᷳ◌̕b; a◌֮◌̀◌ᷳ◌̕b; à◌֮◌ᷳ◌̕b; a◌֮◌̀◌ᷳ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER O WITH DIAERESIS, LATIN SMALL LETTER B +0061 1DF3 0315 0300 05AE 0062;0061 05AE 1DF3 0300 0315 0062;0061 05AE 1DF3 0300 0315 0062;0061 05AE 1DF3 0300 0315 0062;0061 05AE 1DF3 0300 0315 0062; # (a◌ᷳ◌̕◌̀◌֮b; a◌֮◌ᷳ◌̀◌̕b; a◌֮◌ᷳ◌̀◌̕b; a◌֮◌ᷳ◌̀◌̕b; a◌֮◌ᷳ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER O WITH DIAERESIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DF4 0062;00E0 05AE 1DF4 0315 0062;0061 05AE 0300 1DF4 0315 0062;00E0 05AE 1DF4 0315 0062;0061 05AE 0300 1DF4 0315 0062; # (a◌̕◌̀◌֮◌ᷴb; à◌֮◌ᷴ◌̕b; a◌֮◌̀◌ᷴ◌̕b; à◌֮◌ᷴ◌̕b; a◌֮◌̀◌ᷴ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER U WITH DIAERESIS, LATIN SMALL LETTER B +0061 1DF4 0315 0300 05AE 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062;0061 05AE 1DF4 0300 0315 0062; # (a◌ᷴ◌̕◌̀◌֮b; a◌֮◌ᷴ◌̀◌̕b; a◌֮◌ᷴ◌̀◌̕b; a◌֮◌ᷴ◌̀◌̕b; a◌֮◌ᷴ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER U WITH DIAERESIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DF5 0062;00E0 05AE 1DF5 0315 0062;0061 05AE 0300 1DF5 0315 0062;00E0 05AE 1DF5 0315 0062;0061 05AE 0300 1DF5 0315 0062; # (a◌̕◌̀◌֮◌᷵b; à◌֮◌᷵◌̕b; a◌֮◌̀◌᷵◌̕b; à◌֮◌᷵◌̕b; a◌֮◌̀◌᷵◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING UP TACK ABOVE, LATIN SMALL LETTER B +0061 1DF5 0315 0300 05AE 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062;0061 05AE 1DF5 0300 0315 0062; # (a◌᷵◌̕◌̀◌֮b; a◌֮◌᷵◌̀◌̕b; a◌֮◌᷵◌̀◌̕b; a◌֮◌᷵◌̀◌̕b; a◌֮◌᷵◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING UP TACK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 035C 0315 0300 1DF6 0062;00E0 0315 1DF6 035C 0062;0061 0300 0315 1DF6 035C 0062;00E0 0315 1DF6 035C 0062;0061 0300 0315 1DF6 035C 0062; # (a◌͜◌̕◌̀◌᷶b; à◌̕◌᷶◌͜b; a◌̀◌̕◌᷶◌͜b; à◌̕◌᷶◌͜b; a◌̀◌̕◌᷶◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, COMBINING KAVYKA ABOVE RIGHT, LATIN SMALL LETTER B +0061 1DF6 035C 0315 0300 0062;00E0 1DF6 0315 035C 0062;0061 0300 1DF6 0315 035C 0062;00E0 1DF6 0315 035C 0062;0061 0300 1DF6 0315 035C 0062; # (a◌᷶◌͜◌̕◌̀b; à◌᷶◌̕◌͜b; a◌̀◌᷶◌̕◌͜b; à◌᷶◌̕◌͜b; a◌̀◌᷶◌̕◌͜b; ) LATIN SMALL LETTER A, COMBINING KAVYKA ABOVE RIGHT, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 0300 05AE 1D16D 1DF7 0062;00E0 1D16D 05AE 1DF7 0062;0061 1D16D 05AE 1DF7 0300 0062;00E0 1D16D 05AE 1DF7 0062;0061 1D16D 05AE 1DF7 0300 0062; # (a◌̀◌𝅭֮◌᷷b; à𝅭◌֮◌᷷b; a𝅭◌֮◌᷷◌̀b; à𝅭◌֮◌᷷b; a𝅭◌֮◌᷷◌̀b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, COMBINING KAVYKA ABOVE LEFT, LATIN SMALL LETTER B +0061 1DF7 0300 05AE 1D16D 0062;00E0 1D16D 1DF7 05AE 0062;0061 1D16D 1DF7 05AE 0300 0062;00E0 1D16D 1DF7 05AE 0062;0061 1D16D 1DF7 05AE 0300 0062; # (a◌᷷◌̀◌𝅭֮b; à𝅭◌᷷◌֮b; a𝅭◌᷷◌֮◌̀b; à𝅭◌᷷◌֮b; a𝅭◌᷷◌֮◌̀b; ) LATIN SMALL LETTER A, COMBINING KAVYKA ABOVE LEFT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 0300 05AE 1D16D 1DF8 0062;00E0 1D16D 05AE 1DF8 0062;0061 1D16D 05AE 1DF8 0300 0062;00E0 1D16D 05AE 1DF8 0062;0061 1D16D 05AE 1DF8 0300 0062; # (a◌̀◌𝅭֮◌᷸b; à𝅭◌֮◌᷸b; a𝅭◌֮◌᷸◌̀b; à𝅭◌֮◌᷸b; a𝅭◌֮◌᷸◌̀b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, COMBINING DOT ABOVE LEFT, LATIN SMALL LETTER B +0061 1DF8 0300 05AE 1D16D 0062;00E0 1D16D 1DF8 05AE 0062;0061 1D16D 1DF8 05AE 0300 0062;00E0 1D16D 1DF8 05AE 0062;0061 1D16D 1DF8 05AE 0300 0062; # (a◌᷸◌̀◌𝅭֮b; à𝅭◌᷸◌֮b; a𝅭◌᷸◌֮◌̀b; à𝅭◌᷸◌֮b; a𝅭◌᷸◌֮◌̀b; ) LATIN SMALL LETTER A, COMBINING DOT ABOVE LEFT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1DF9 0062;0061 1DFA 0316 1DF9 059A 0062;0061 1DFA 0316 1DF9 059A 0062;0061 1DFA 0316 1DF9 059A 0062;0061 1DFA 0316 1DF9 059A 0062; # (a◌֚◌̖◌᷺◌᷹b; a◌᷺◌̖◌᷹◌֚b; a◌᷺◌̖◌᷹◌֚b; a◌᷺◌̖◌᷹◌֚b; a◌᷺◌̖◌᷹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING WIDE INVERTED BRIDGE BELOW, LATIN SMALL LETTER B +0061 1DF9 059A 0316 1DFA 0062;0061 1DFA 1DF9 0316 059A 0062;0061 1DFA 1DF9 0316 059A 0062;0061 1DFA 1DF9 0316 059A 0062;0061 1DFA 1DF9 0316 059A 0062; # (a◌᷹◌֚◌̖◌᷺b; a◌᷺◌᷹◌̖◌֚b; a◌᷺◌᷹◌̖◌֚b; a◌᷺◌᷹◌̖◌֚b; a◌᷺◌᷹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING WIDE INVERTED BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0316 1DFA 031B 1DFA 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062; # (a◌̖◌᷺◌̛◌᷺b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 1DFA 0316 1DFA 031B 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062; # (a◌᷺◌̖◌᷺◌̛b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING HORN, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DFB 0062;00E0 05AE 1DFB 0315 0062;0061 05AE 0300 1DFB 0315 0062;00E0 05AE 1DFB 0315 0062;0061 05AE 0300 1DFB 0315 0062; # (a◌̕◌̀◌֮◌᷻b; à◌֮◌᷻◌̕b; a◌֮◌̀◌᷻◌̕b; à◌֮◌᷻◌̕b; a◌֮◌̀◌᷻◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DELETION MARK, LATIN SMALL LETTER B +0061 1DFB 0315 0300 05AE 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062; # (a◌᷻◌̕◌̀◌֮b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DELETION MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 035D 035C 0315 1DFC 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062; # (a◌͝◌͜◌̕◌᷼b; a◌̕◌͜◌᷼◌͝b; a◌̕◌͜◌᷼◌͝b; a◌̕◌͜◌᷼◌͝b; a◌̕◌͜◌᷼◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE INVERTED BREVE BELOW, LATIN SMALL LETTER B +0061 1DFC 035D 035C 0315 0062;0061 0315 1DFC 035C 035D 0062;0061 0315 1DFC 035C 035D 0062;0061 0315 1DFC 035C 035D 0062;0061 0315 1DFC 035C 035D 0062; # (a◌᷼◌͝◌͜◌̕b; a◌̕◌᷼◌͜◌͝b; a◌̕◌᷼◌͜◌͝b; a◌̕◌᷼◌͜◌͝b; a◌̕◌᷼◌͜◌͝b; ) LATIN SMALL LETTER A, COMBINING DOUBLE INVERTED BREVE BELOW, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1DFD 0062;0061 1DFA 0316 1DFD 059A 0062;0061 1DFA 0316 1DFD 059A 0062;0061 1DFA 0316 1DFD 059A 0062;0061 1DFA 0316 1DFD 059A 0062; # (a◌֚◌̖◌᷺◌᷽b; a◌᷺◌̖◌᷽◌֚b; a◌᷺◌̖◌᷽◌֚b; a◌᷺◌̖◌᷽◌֚b; a◌᷺◌̖◌᷽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING ALMOST EQUAL TO BELOW, LATIN SMALL LETTER B +0061 1DFD 059A 0316 1DFA 0062;0061 1DFA 1DFD 0316 059A 0062;0061 1DFA 1DFD 0316 059A 0062;0061 1DFA 1DFD 0316 059A 0062;0061 1DFA 1DFD 0316 059A 0062; # (a◌᷽◌֚◌̖◌᷺b; a◌᷺◌᷽◌̖◌֚b; a◌᷺◌᷽◌̖◌֚b; a◌᷺◌᷽◌̖◌֚b; a◌᷺◌᷽◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ALMOST EQUAL TO BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1DFE 0062;00E0 05AE 1DFE 0315 0062;0061 05AE 0300 1DFE 0315 0062;00E0 05AE 1DFE 0315 0062;0061 05AE 0300 1DFE 0315 0062; # (a◌̕◌̀◌֮◌᷾b; à◌֮◌᷾◌̕b; a◌֮◌̀◌᷾◌̕b; à◌֮◌᷾◌̕b; a◌֮◌̀◌᷾◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT ARROWHEAD ABOVE, LATIN SMALL LETTER B +0061 1DFE 0315 0300 05AE 0062;0061 05AE 1DFE 0300 0315 0062;0061 05AE 1DFE 0300 0315 0062;0061 05AE 1DFE 0300 0315 0062;0061 05AE 1DFE 0300 0315 0062; # (a◌᷾◌̕◌̀◌֮b; a◌֮◌᷾◌̀◌̕b; a◌֮◌᷾◌̀◌̕b; a◌֮◌᷾◌̀◌̕b; a◌֮◌᷾◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT ARROWHEAD ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1DFF 0062;0061 1DFA 0316 1DFF 059A 0062;0061 1DFA 0316 1DFF 059A 0062;0061 1DFA 0316 1DFF 059A 0062;0061 1DFA 0316 1DFF 059A 0062; # (a◌֚◌̖◌᷺◌᷿b; a◌᷺◌̖◌᷿◌֚b; a◌᷺◌̖◌᷿◌֚b; a◌᷺◌̖◌᷿◌֚b; a◌᷺◌̖◌᷿◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW, LATIN SMALL LETTER B +0061 1DFF 059A 0316 1DFA 0062;0061 1DFA 1DFF 0316 059A 0062;0061 1DFA 1DFF 0316 059A 0062;0061 1DFA 1DFF 0316 059A 0062;0061 1DFA 1DFF 0316 059A 0062; # (a◌᷿◌֚◌̖◌᷺b; a◌᷺◌᷿◌̖◌֚b; a◌᷺◌᷿◌̖◌֚b; a◌᷺◌᷿◌̖◌֚b; a◌᷺◌᷿◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D0 0062;00E0 05AE 20D0 0315 0062;0061 05AE 0300 20D0 0315 0062;00E0 05AE 20D0 0315 0062;0061 05AE 0300 20D0 0315 0062; # (a◌̕◌̀◌֮◌⃐b; à◌֮◌⃐◌̕b; a◌֮◌̀◌⃐◌̕b; à◌֮◌⃐◌̕b; a◌֮◌̀◌⃐◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT HARPOON ABOVE, LATIN SMALL LETTER B +0061 20D0 0315 0300 05AE 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062; # (a◌⃐◌̕◌̀◌֮b; a◌֮◌⃐◌̀◌̕b; a◌֮◌⃐◌̀◌̕b; a◌֮◌⃐◌̀◌̕b; a◌֮◌⃐◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT HARPOON ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D1 0062;00E0 05AE 20D1 0315 0062;0061 05AE 0300 20D1 0315 0062;00E0 05AE 20D1 0315 0062;0061 05AE 0300 20D1 0315 0062; # (a◌̕◌̀◌֮◌⃑b; à◌֮◌⃑◌̕b; a◌֮◌̀◌⃑◌̕b; à◌֮◌⃑◌̕b; a◌֮◌̀◌⃑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT HARPOON ABOVE, LATIN SMALL LETTER B +0061 20D1 0315 0300 05AE 0062;0061 05AE 20D1 0300 0315 0062;0061 05AE 20D1 0300 0315 0062;0061 05AE 20D1 0300 0315 0062;0061 05AE 20D1 0300 0315 0062; # (a◌⃑◌̕◌̀◌֮b; a◌֮◌⃑◌̀◌̕b; a◌֮◌⃑◌̀◌̕b; a◌֮◌⃑◌̀◌̕b; a◌֮◌⃑◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RIGHT HARPOON ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 16FF0 0334 20D2 0062;0061 0334 20D2 16FF0 0062;0061 0334 20D2 16FF0 0062;0061 0334 20D2 16FF0 0062;0061 0334 20D2 16FF0 0062; # (a𖿰◌̴◌⃒b; a◌̴◌⃒𖿰b; a◌̴◌⃒𖿰b; a◌̴◌⃒𖿰b; a◌̴◌⃒𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING LONG VERTICAL LINE OVERLAY, LATIN SMALL LETTER B +0061 20D2 16FF0 0334 0062;0061 20D2 0334 16FF0 0062;0061 20D2 0334 16FF0 0062;0061 20D2 0334 16FF0 0062;0061 20D2 0334 16FF0 0062; # (a◌⃒𖿰◌̴b; a◌⃒◌̴𖿰b; a◌⃒◌̴𖿰b; a◌⃒◌̴𖿰b; a◌⃒◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING LONG VERTICAL LINE OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 20D3 0062;0061 0334 20D3 16FF0 0062;0061 0334 20D3 16FF0 0062;0061 0334 20D3 16FF0 0062;0061 0334 20D3 16FF0 0062; # (a𖿰◌̴◌⃓b; a◌̴◌⃓𖿰b; a◌̴◌⃓𖿰b; a◌̴◌⃓𖿰b; a◌̴◌⃓𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING SHORT VERTICAL LINE OVERLAY, LATIN SMALL LETTER B +0061 20D3 16FF0 0334 0062;0061 20D3 0334 16FF0 0062;0061 20D3 0334 16FF0 0062;0061 20D3 0334 16FF0 0062;0061 20D3 0334 16FF0 0062; # (a◌⃓𖿰◌̴b; a◌⃓◌̴𖿰b; a◌⃓◌̴𖿰b; a◌⃓◌̴𖿰b; a◌⃓◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING SHORT VERTICAL LINE OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D4 0062;00E0 05AE 20D4 0315 0062;0061 05AE 0300 20D4 0315 0062;00E0 05AE 20D4 0315 0062;0061 05AE 0300 20D4 0315 0062; # (a◌̕◌̀◌֮◌⃔b; à◌֮◌⃔◌̕b; a◌֮◌̀◌⃔◌̕b; à◌֮◌⃔◌̕b; a◌֮◌̀◌⃔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ANTICLOCKWISE ARROW ABOVE, LATIN SMALL LETTER B +0061 20D4 0315 0300 05AE 0062;0061 05AE 20D4 0300 0315 0062;0061 05AE 20D4 0300 0315 0062;0061 05AE 20D4 0300 0315 0062;0061 05AE 20D4 0300 0315 0062; # (a◌⃔◌̕◌̀◌֮b; a◌֮◌⃔◌̀◌̕b; a◌֮◌⃔◌̀◌̕b; a◌֮◌⃔◌̀◌̕b; a◌֮◌⃔◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ANTICLOCKWISE ARROW ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D5 0062;00E0 05AE 20D5 0315 0062;0061 05AE 0300 20D5 0315 0062;00E0 05AE 20D5 0315 0062;0061 05AE 0300 20D5 0315 0062; # (a◌̕◌̀◌֮◌⃕b; à◌֮◌⃕◌̕b; a◌֮◌̀◌⃕◌̕b; à◌֮◌⃕◌̕b; a◌֮◌̀◌⃕◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CLOCKWISE ARROW ABOVE, LATIN SMALL LETTER B +0061 20D5 0315 0300 05AE 0062;0061 05AE 20D5 0300 0315 0062;0061 05AE 20D5 0300 0315 0062;0061 05AE 20D5 0300 0315 0062;0061 05AE 20D5 0300 0315 0062; # (a◌⃕◌̕◌̀◌֮b; a◌֮◌⃕◌̀◌̕b; a◌֮◌⃕◌̀◌̕b; a◌֮◌⃕◌̀◌̕b; a◌֮◌⃕◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CLOCKWISE ARROW ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D6 0062;00E0 05AE 20D6 0315 0062;0061 05AE 0300 20D6 0315 0062;00E0 05AE 20D6 0315 0062;0061 05AE 0300 20D6 0315 0062; # (a◌̕◌̀◌֮◌⃖b; à◌֮◌⃖◌̕b; a◌֮◌̀◌⃖◌̕b; à◌֮◌⃖◌̕b; a◌֮◌̀◌⃖◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT ARROW ABOVE, LATIN SMALL LETTER B +0061 20D6 0315 0300 05AE 0062;0061 05AE 20D6 0300 0315 0062;0061 05AE 20D6 0300 0315 0062;0061 05AE 20D6 0300 0315 0062;0061 05AE 20D6 0300 0315 0062; # (a◌⃖◌̕◌̀◌֮b; a◌֮◌⃖◌̀◌̕b; a◌֮◌⃖◌̀◌̕b; a◌֮◌⃖◌̀◌̕b; a◌֮◌⃖◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT ARROW ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20D7 0062;00E0 05AE 20D7 0315 0062;0061 05AE 0300 20D7 0315 0062;00E0 05AE 20D7 0315 0062;0061 05AE 0300 20D7 0315 0062; # (a◌̕◌̀◌֮◌⃗b; à◌֮◌⃗◌̕b; a◌֮◌̀◌⃗◌̕b; à◌֮◌⃗◌̕b; a◌֮◌̀◌⃗◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT ARROW ABOVE, LATIN SMALL LETTER B +0061 20D7 0315 0300 05AE 0062;0061 05AE 20D7 0300 0315 0062;0061 05AE 20D7 0300 0315 0062;0061 05AE 20D7 0300 0315 0062;0061 05AE 20D7 0300 0315 0062; # (a◌⃗◌̕◌̀◌֮b; a◌֮◌⃗◌̀◌̕b; a◌֮◌⃗◌̀◌̕b; a◌֮◌⃗◌̀◌̕b; a◌֮◌⃗◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROW ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 16FF0 0334 20D8 0062;0061 0334 20D8 16FF0 0062;0061 0334 20D8 16FF0 0062;0061 0334 20D8 16FF0 0062;0061 0334 20D8 16FF0 0062; # (a𖿰◌̴◌⃘b; a◌̴◌⃘𖿰b; a◌̴◌⃘𖿰b; a◌̴◌⃘𖿰b; a◌̴◌⃘𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING RING OVERLAY, LATIN SMALL LETTER B +0061 20D8 16FF0 0334 0062;0061 20D8 0334 16FF0 0062;0061 20D8 0334 16FF0 0062;0061 20D8 0334 16FF0 0062;0061 20D8 0334 16FF0 0062; # (a◌⃘𖿰◌̴b; a◌⃘◌̴𖿰b; a◌⃘◌̴𖿰b; a◌⃘◌̴𖿰b; a◌⃘◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING RING OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 20D9 0062;0061 0334 20D9 16FF0 0062;0061 0334 20D9 16FF0 0062;0061 0334 20D9 16FF0 0062;0061 0334 20D9 16FF0 0062; # (a𖿰◌̴◌⃙b; a◌̴◌⃙𖿰b; a◌̴◌⃙𖿰b; a◌̴◌⃙𖿰b; a◌̴◌⃙𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING CLOCKWISE RING OVERLAY, LATIN SMALL LETTER B +0061 20D9 16FF0 0334 0062;0061 20D9 0334 16FF0 0062;0061 20D9 0334 16FF0 0062;0061 20D9 0334 16FF0 0062;0061 20D9 0334 16FF0 0062; # (a◌⃙𖿰◌̴b; a◌⃙◌̴𖿰b; a◌⃙◌̴𖿰b; a◌⃙◌̴𖿰b; a◌⃙◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING CLOCKWISE RING OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 20DA 0062;0061 0334 20DA 16FF0 0062;0061 0334 20DA 16FF0 0062;0061 0334 20DA 16FF0 0062;0061 0334 20DA 16FF0 0062; # (a𖿰◌̴◌⃚b; a◌̴◌⃚𖿰b; a◌̴◌⃚𖿰b; a◌̴◌⃚𖿰b; a◌̴◌⃚𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING ANTICLOCKWISE RING OVERLAY, LATIN SMALL LETTER B +0061 20DA 16FF0 0334 0062;0061 20DA 0334 16FF0 0062;0061 20DA 0334 16FF0 0062;0061 20DA 0334 16FF0 0062;0061 20DA 0334 16FF0 0062; # (a◌⃚𖿰◌̴b; a◌⃚◌̴𖿰b; a◌⃚◌̴𖿰b; a◌⃚◌̴𖿰b; a◌⃚◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING ANTICLOCKWISE RING OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 0315 0300 05AE 20DB 0062;00E0 05AE 20DB 0315 0062;0061 05AE 0300 20DB 0315 0062;00E0 05AE 20DB 0315 0062;0061 05AE 0300 20DB 0315 0062; # (a◌̕◌̀◌֮◌⃛b; à◌֮◌⃛◌̕b; a◌֮◌̀◌⃛◌̕b; à◌֮◌⃛◌̕b; a◌֮◌̀◌⃛◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING THREE DOTS ABOVE, LATIN SMALL LETTER B +0061 20DB 0315 0300 05AE 0062;0061 05AE 20DB 0300 0315 0062;0061 05AE 20DB 0300 0315 0062;0061 05AE 20DB 0300 0315 0062;0061 05AE 20DB 0300 0315 0062; # (a◌⃛◌̕◌̀◌֮b; a◌֮◌⃛◌̀◌̕b; a◌֮◌⃛◌̀◌̕b; a◌֮◌⃛◌̀◌̕b; a◌֮◌⃛◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING THREE DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20DC 0062;00E0 05AE 20DC 0315 0062;0061 05AE 0300 20DC 0315 0062;00E0 05AE 20DC 0315 0062;0061 05AE 0300 20DC 0315 0062; # (a◌̕◌̀◌֮◌⃜b; à◌֮◌⃜◌̕b; a◌֮◌̀◌⃜◌̕b; à◌֮◌⃜◌̕b; a◌֮◌̀◌⃜◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING FOUR DOTS ABOVE, LATIN SMALL LETTER B +0061 20DC 0315 0300 05AE 0062;0061 05AE 20DC 0300 0315 0062;0061 05AE 20DC 0300 0315 0062;0061 05AE 20DC 0300 0315 0062;0061 05AE 20DC 0300 0315 0062; # (a◌⃜◌̕◌̀◌֮b; a◌֮◌⃜◌̀◌̕b; a◌֮◌⃜◌̀◌̕b; a◌֮◌⃜◌̀◌̕b; a◌֮◌⃜◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING FOUR DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 20E1 0062;00E0 05AE 20E1 0315 0062;0061 05AE 0300 20E1 0315 0062;00E0 05AE 20E1 0315 0062;0061 05AE 0300 20E1 0315 0062; # (a◌̕◌̀◌֮◌⃡b; à◌֮◌⃡◌̕b; a◌֮◌̀◌⃡◌̕b; à◌֮◌⃡◌̕b; a◌֮◌̀◌⃡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT RIGHT ARROW ABOVE, LATIN SMALL LETTER B +0061 20E1 0315 0300 05AE 0062;0061 05AE 20E1 0300 0315 0062;0061 05AE 20E1 0300 0315 0062;0061 05AE 20E1 0300 0315 0062;0061 05AE 20E1 0300 0315 0062; # (a◌⃡◌̕◌̀◌֮b; a◌֮◌⃡◌̀◌̕b; a◌֮◌⃡◌̀◌̕b; a◌֮◌⃡◌̀◌̕b; a◌֮◌⃡◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT RIGHT ARROW ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 16FF0 0334 20E5 0062;0061 0334 20E5 16FF0 0062;0061 0334 20E5 16FF0 0062;0061 0334 20E5 16FF0 0062;0061 0334 20E5 16FF0 0062; # (a𖿰◌̴◌⃥b; a◌̴◌⃥𖿰b; a◌̴◌⃥𖿰b; a◌̴◌⃥𖿰b; a◌̴◌⃥𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING REVERSE SOLIDUS OVERLAY, LATIN SMALL LETTER B +0061 20E5 16FF0 0334 0062;0061 20E5 0334 16FF0 0062;0061 20E5 0334 16FF0 0062;0061 20E5 0334 16FF0 0062;0061 20E5 0334 16FF0 0062; # (a◌⃥𖿰◌̴b; a◌⃥◌̴𖿰b; a◌⃥◌̴𖿰b; a◌⃥◌̴𖿰b; a◌⃥◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING REVERSE SOLIDUS OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 20E6 0062;0061 0334 20E6 16FF0 0062;0061 0334 20E6 16FF0 0062;0061 0334 20E6 16FF0 0062;0061 0334 20E6 16FF0 0062; # (a𖿰◌̴◌⃦b; a◌̴◌⃦𖿰b; a◌̴◌⃦𖿰b; a◌̴◌⃦𖿰b; a◌̴◌⃦𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING DOUBLE VERTICAL STROKE OVERLAY, LATIN SMALL LETTER B +0061 20E6 16FF0 0334 0062;0061 20E6 0334 16FF0 0062;0061 20E6 0334 16FF0 0062;0061 20E6 0334 16FF0 0062;0061 20E6 0334 16FF0 0062; # (a◌⃦𖿰◌̴b; a◌⃦◌̴𖿰b; a◌⃦◌̴𖿰b; a◌⃦◌̴𖿰b; a◌⃦◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING DOUBLE VERTICAL STROKE OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 0315 0300 05AE 20E7 0062;00E0 05AE 20E7 0315 0062;0061 05AE 0300 20E7 0315 0062;00E0 05AE 20E7 0315 0062;0061 05AE 0300 20E7 0315 0062; # (a◌̕◌̀◌֮◌⃧b; à◌֮◌⃧◌̕b; a◌֮◌̀◌⃧◌̕b; à◌֮◌⃧◌̕b; a◌֮◌̀◌⃧◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ANNUITY SYMBOL, LATIN SMALL LETTER B +0061 20E7 0315 0300 05AE 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062; # (a◌⃧◌̕◌̀◌֮b; a◌֮◌⃧◌̀◌̕b; a◌֮◌⃧◌̀◌̕b; a◌֮◌⃧◌̀◌̕b; a◌֮◌⃧◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ANNUITY SYMBOL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 20E8 0062;0061 1DFA 0316 20E8 059A 0062;0061 1DFA 0316 20E8 059A 0062;0061 1DFA 0316 20E8 059A 0062;0061 1DFA 0316 20E8 059A 0062; # (a◌֚◌̖◌᷺◌⃨b; a◌᷺◌̖◌⃨◌֚b; a◌᷺◌̖◌⃨◌֚b; a◌᷺◌̖◌⃨◌֚b; a◌᷺◌̖◌⃨◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING TRIPLE UNDERDOT, LATIN SMALL LETTER B +0061 20E8 059A 0316 1DFA 0062;0061 1DFA 20E8 0316 059A 0062;0061 1DFA 20E8 0316 059A 0062;0061 1DFA 20E8 0316 059A 0062;0061 1DFA 20E8 0316 059A 0062; # (a◌⃨◌֚◌̖◌᷺b; a◌᷺◌⃨◌̖◌֚b; a◌᷺◌⃨◌̖◌֚b; a◌᷺◌⃨◌̖◌֚b; a◌᷺◌⃨◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TRIPLE UNDERDOT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 20E9 0062;00E0 05AE 20E9 0315 0062;0061 05AE 0300 20E9 0315 0062;00E0 05AE 20E9 0315 0062;0061 05AE 0300 20E9 0315 0062; # (a◌̕◌̀◌֮◌⃩b; à◌֮◌⃩◌̕b; a◌֮◌̀◌⃩◌̕b; à◌֮◌⃩◌̕b; a◌֮◌̀◌⃩◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING WIDE BRIDGE ABOVE, LATIN SMALL LETTER B +0061 20E9 0315 0300 05AE 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062; # (a◌⃩◌̕◌̀◌֮b; a◌֮◌⃩◌̀◌̕b; a◌֮◌⃩◌̀◌̕b; a◌֮◌⃩◌̀◌̕b; a◌֮◌⃩◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING WIDE BRIDGE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 16FF0 0334 20EA 0062;0061 0334 20EA 16FF0 0062;0061 0334 20EA 16FF0 0062;0061 0334 20EA 16FF0 0062;0061 0334 20EA 16FF0 0062; # (a𖿰◌̴◌⃪b; a◌̴◌⃪𖿰b; a◌̴◌⃪𖿰b; a◌̴◌⃪𖿰b; a◌̴◌⃪𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING LEFTWARDS ARROW OVERLAY, LATIN SMALL LETTER B +0061 20EA 16FF0 0334 0062;0061 20EA 0334 16FF0 0062;0061 20EA 0334 16FF0 0062;0061 20EA 0334 16FF0 0062;0061 20EA 0334 16FF0 0062; # (a◌⃪𖿰◌̴b; a◌⃪◌̴𖿰b; a◌⃪◌̴𖿰b; a◌⃪◌̴𖿰b; a◌⃪◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING LEFTWARDS ARROW OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 20EB 0062;0061 0334 20EB 16FF0 0062;0061 0334 20EB 16FF0 0062;0061 0334 20EB 16FF0 0062;0061 0334 20EB 16FF0 0062; # (a𖿰◌̴◌⃫b; a◌̴◌⃫𖿰b; a◌̴◌⃫𖿰b; a◌̴◌⃫𖿰b; a◌̴◌⃫𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING LONG DOUBLE SOLIDUS OVERLAY, LATIN SMALL LETTER B +0061 20EB 16FF0 0334 0062;0061 20EB 0334 16FF0 0062;0061 20EB 0334 16FF0 0062;0061 20EB 0334 16FF0 0062;0061 20EB 0334 16FF0 0062; # (a◌⃫𖿰◌̴b; a◌⃫◌̴𖿰b; a◌⃫◌̴𖿰b; a◌⃫◌̴𖿰b; a◌⃫◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING LONG DOUBLE SOLIDUS OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 059A 0316 1DFA 20EC 0062;0061 1DFA 0316 20EC 059A 0062;0061 1DFA 0316 20EC 059A 0062;0061 1DFA 0316 20EC 059A 0062;0061 1DFA 0316 20EC 059A 0062; # (a◌֚◌̖◌᷺◌⃬b; a◌᷺◌̖◌⃬◌֚b; a◌᷺◌̖◌⃬◌֚b; a◌᷺◌̖◌⃬◌֚b; a◌᷺◌̖◌⃬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS, LATIN SMALL LETTER B +0061 20EC 059A 0316 1DFA 0062;0061 1DFA 20EC 0316 059A 0062;0061 1DFA 20EC 0316 059A 0062;0061 1DFA 20EC 0316 059A 0062;0061 1DFA 20EC 0316 059A 0062; # (a◌⃬◌֚◌̖◌᷺b; a◌᷺◌⃬◌̖◌֚b; a◌᷺◌⃬◌̖◌֚b; a◌᷺◌⃬◌̖◌֚b; a◌᷺◌⃬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 20ED 0062;0061 1DFA 0316 20ED 059A 0062;0061 1DFA 0316 20ED 059A 0062;0061 1DFA 0316 20ED 059A 0062;0061 1DFA 0316 20ED 059A 0062; # (a◌֚◌̖◌᷺◌⃭b; a◌᷺◌̖◌⃭◌֚b; a◌᷺◌̖◌⃭◌֚b; a◌᷺◌̖◌⃭◌֚b; a◌᷺◌̖◌⃭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS, LATIN SMALL LETTER B +0061 20ED 059A 0316 1DFA 0062;0061 1DFA 20ED 0316 059A 0062;0061 1DFA 20ED 0316 059A 0062;0061 1DFA 20ED 0316 059A 0062;0061 1DFA 20ED 0316 059A 0062; # (a◌⃭◌֚◌̖◌᷺b; a◌᷺◌⃭◌̖◌֚b; a◌᷺◌⃭◌̖◌֚b; a◌᷺◌⃭◌̖◌֚b; a◌᷺◌⃭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 20EE 0062;0061 1DFA 0316 20EE 059A 0062;0061 1DFA 0316 20EE 059A 0062;0061 1DFA 0316 20EE 059A 0062;0061 1DFA 0316 20EE 059A 0062; # (a◌֚◌̖◌᷺◌⃮b; a◌᷺◌̖◌⃮◌֚b; a◌᷺◌̖◌⃮◌֚b; a◌᷺◌̖◌⃮◌֚b; a◌᷺◌̖◌⃮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT ARROW BELOW, LATIN SMALL LETTER B +0061 20EE 059A 0316 1DFA 0062;0061 1DFA 20EE 0316 059A 0062;0061 1DFA 20EE 0316 059A 0062;0061 1DFA 20EE 0316 059A 0062;0061 1DFA 20EE 0316 059A 0062; # (a◌⃮◌֚◌̖◌᷺b; a◌᷺◌⃮◌̖◌֚b; a◌᷺◌⃮◌̖◌֚b; a◌᷺◌⃮◌̖◌֚b; a◌᷺◌⃮◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 20EF 0062;0061 1DFA 0316 20EF 059A 0062;0061 1DFA 0316 20EF 059A 0062;0061 1DFA 0316 20EF 059A 0062;0061 1DFA 0316 20EF 059A 0062; # (a◌֚◌̖◌᷺◌⃯b; a◌᷺◌̖◌⃯◌֚b; a◌᷺◌̖◌⃯◌֚b; a◌᷺◌̖◌⃯◌֚b; a◌᷺◌̖◌⃯◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT ARROW BELOW, LATIN SMALL LETTER B +0061 20EF 059A 0316 1DFA 0062;0061 1DFA 20EF 0316 059A 0062;0061 1DFA 20EF 0316 059A 0062;0061 1DFA 20EF 0316 059A 0062;0061 1DFA 20EF 0316 059A 0062; # (a◌⃯◌֚◌̖◌᷺b; a◌᷺◌⃯◌̖◌֚b; a◌᷺◌⃯◌̖◌֚b; a◌᷺◌⃯◌̖◌֚b; a◌᷺◌⃯◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 20F0 0062;00E0 05AE 20F0 0315 0062;0061 05AE 0300 20F0 0315 0062;00E0 05AE 20F0 0315 0062;0061 05AE 0300 20F0 0315 0062; # (a◌̕◌̀◌֮◌⃰b; à◌֮◌⃰◌̕b; a◌֮◌̀◌⃰◌̕b; à◌֮◌⃰◌̕b; a◌֮◌̀◌⃰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ASTERISK ABOVE, LATIN SMALL LETTER B +0061 20F0 0315 0300 05AE 0062;0061 05AE 20F0 0300 0315 0062;0061 05AE 20F0 0300 0315 0062;0061 05AE 20F0 0300 0315 0062;0061 05AE 20F0 0300 0315 0062; # (a◌⃰◌̕◌̀◌֮b; a◌֮◌⃰◌̀◌̕b; a◌֮◌⃰◌̀◌̕b; a◌֮◌⃰◌̀◌̕b; a◌֮◌⃰◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ASTERISK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2CEF 0062;00E0 05AE 2CEF 0315 0062;0061 05AE 0300 2CEF 0315 0062;00E0 05AE 2CEF 0315 0062;0061 05AE 0300 2CEF 0315 0062; # (a◌̕◌̀◌֮◌⳯b; à◌֮◌⳯◌̕b; a◌֮◌̀◌⳯◌̕b; à◌֮◌⳯◌̕b; a◌֮◌̀◌⳯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COPTIC COMBINING NI ABOVE, LATIN SMALL LETTER B +0061 2CEF 0315 0300 05AE 0062;0061 05AE 2CEF 0300 0315 0062;0061 05AE 2CEF 0300 0315 0062;0061 05AE 2CEF 0300 0315 0062;0061 05AE 2CEF 0300 0315 0062; # (a◌⳯◌̕◌̀◌֮b; a◌֮◌⳯◌̀◌̕b; a◌֮◌⳯◌̀◌̕b; a◌֮◌⳯◌̀◌̕b; a◌֮◌⳯◌̀◌̕b; ) LATIN SMALL LETTER A, COPTIC COMBINING NI ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2CF0 0062;00E0 05AE 2CF0 0315 0062;0061 05AE 0300 2CF0 0315 0062;00E0 05AE 2CF0 0315 0062;0061 05AE 0300 2CF0 0315 0062; # (a◌̕◌̀◌֮◌⳰b; à◌֮◌⳰◌̕b; a◌֮◌̀◌⳰◌̕b; à◌֮◌⳰◌̕b; a◌֮◌̀◌⳰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COPTIC COMBINING SPIRITUS ASPER, LATIN SMALL LETTER B +0061 2CF0 0315 0300 05AE 0062;0061 05AE 2CF0 0300 0315 0062;0061 05AE 2CF0 0300 0315 0062;0061 05AE 2CF0 0300 0315 0062;0061 05AE 2CF0 0300 0315 0062; # (a◌⳰◌̕◌̀◌֮b; a◌֮◌⳰◌̀◌̕b; a◌֮◌⳰◌̀◌̕b; a◌֮◌⳰◌̀◌̕b; a◌֮◌⳰◌̀◌̕b; ) LATIN SMALL LETTER A, COPTIC COMBINING SPIRITUS ASPER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2CF1 0062;00E0 05AE 2CF1 0315 0062;0061 05AE 0300 2CF1 0315 0062;00E0 05AE 2CF1 0315 0062;0061 05AE 0300 2CF1 0315 0062; # (a◌̕◌̀◌֮◌⳱b; à◌֮◌⳱◌̕b; a◌֮◌̀◌⳱◌̕b; à◌֮◌⳱◌̕b; a◌֮◌̀◌⳱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COPTIC COMBINING SPIRITUS LENIS, LATIN SMALL LETTER B +0061 2CF1 0315 0300 05AE 0062;0061 05AE 2CF1 0300 0315 0062;0061 05AE 2CF1 0300 0315 0062;0061 05AE 2CF1 0300 0315 0062;0061 05AE 2CF1 0300 0315 0062; # (a◌⳱◌̕◌̀◌֮b; a◌֮◌⳱◌̀◌̕b; a◌֮◌⳱◌̀◌̕b; a◌֮◌⳱◌̀◌̕b; a◌֮◌⳱◌̀◌̕b; ) LATIN SMALL LETTER A, COPTIC COMBINING SPIRITUS LENIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 2D7F 0062;0061 3099 094D 2D7F 05B0 0062;0061 3099 094D 2D7F 05B0 0062;0061 3099 094D 2D7F 05B0 0062;0061 3099 094D 2D7F 05B0 0062; # (a◌ְ◌्◌゙◌⵿b; a◌゙◌्◌⵿◌ְb; a◌゙◌्◌⵿◌ְb; a◌゙◌्◌⵿◌ְb; a◌゙◌्◌⵿◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TIFINAGH CONSONANT JOINER, LATIN SMALL LETTER B +0061 2D7F 05B0 094D 3099 0062;0061 3099 2D7F 094D 05B0 0062;0061 3099 2D7F 094D 05B0 0062;0061 3099 2D7F 094D 05B0 0062;0061 3099 2D7F 094D 05B0 0062; # (a◌⵿◌ְ◌्◌゙b; a◌゙◌⵿◌्◌ְb; a◌゙◌⵿◌्◌ְb; a◌゙◌⵿◌्◌ְb; a◌゙◌⵿◌्◌ְb; ) LATIN SMALL LETTER A, TIFINAGH CONSONANT JOINER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DE0 0062;00E0 05AE 2DE0 0315 0062;0061 05AE 0300 2DE0 0315 0062;00E0 05AE 2DE0 0315 0062;0061 05AE 0300 2DE0 0315 0062; # (a◌̕◌̀◌֮◌ⷠb; à◌֮◌ⷠ◌̕b; a◌֮◌̀◌ⷠ◌̕b; à◌֮◌ⷠ◌̕b; a◌֮◌̀◌ⷠ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER BE, LATIN SMALL LETTER B +0061 2DE0 0315 0300 05AE 0062;0061 05AE 2DE0 0300 0315 0062;0061 05AE 2DE0 0300 0315 0062;0061 05AE 2DE0 0300 0315 0062;0061 05AE 2DE0 0300 0315 0062; # (a◌ⷠ◌̕◌̀◌֮b; a◌֮◌ⷠ◌̀◌̕b; a◌֮◌ⷠ◌̀◌̕b; a◌֮◌ⷠ◌̀◌̕b; a◌֮◌ⷠ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER BE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DE1 0062;00E0 05AE 2DE1 0315 0062;0061 05AE 0300 2DE1 0315 0062;00E0 05AE 2DE1 0315 0062;0061 05AE 0300 2DE1 0315 0062; # (a◌̕◌̀◌֮◌ⷡb; à◌֮◌ⷡ◌̕b; a◌֮◌̀◌ⷡ◌̕b; à◌֮◌ⷡ◌̕b; a◌֮◌̀◌ⷡ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER VE, LATIN SMALL LETTER B +0061 2DE1 0315 0300 05AE 0062;0061 05AE 2DE1 0300 0315 0062;0061 05AE 2DE1 0300 0315 0062;0061 05AE 2DE1 0300 0315 0062;0061 05AE 2DE1 0300 0315 0062; # (a◌ⷡ◌̕◌̀◌֮b; a◌֮◌ⷡ◌̀◌̕b; a◌֮◌ⷡ◌̀◌̕b; a◌֮◌ⷡ◌̀◌̕b; a◌֮◌ⷡ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER VE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DE2 0062;00E0 05AE 2DE2 0315 0062;0061 05AE 0300 2DE2 0315 0062;00E0 05AE 2DE2 0315 0062;0061 05AE 0300 2DE2 0315 0062; # (a◌̕◌̀◌֮◌ⷢb; à◌֮◌ⷢ◌̕b; a◌֮◌̀◌ⷢ◌̕b; à◌֮◌ⷢ◌̕b; a◌֮◌̀◌ⷢ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER GHE, LATIN SMALL LETTER B +0061 2DE2 0315 0300 05AE 0062;0061 05AE 2DE2 0300 0315 0062;0061 05AE 2DE2 0300 0315 0062;0061 05AE 2DE2 0300 0315 0062;0061 05AE 2DE2 0300 0315 0062; # (a◌ⷢ◌̕◌̀◌֮b; a◌֮◌ⷢ◌̀◌̕b; a◌֮◌ⷢ◌̀◌̕b; a◌֮◌ⷢ◌̀◌̕b; a◌֮◌ⷢ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER GHE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DE3 0062;00E0 05AE 2DE3 0315 0062;0061 05AE 0300 2DE3 0315 0062;00E0 05AE 2DE3 0315 0062;0061 05AE 0300 2DE3 0315 0062; # (a◌̕◌̀◌֮◌ⷣb; à◌֮◌ⷣ◌̕b; a◌֮◌̀◌ⷣ◌̕b; à◌֮◌ⷣ◌̕b; a◌֮◌̀◌ⷣ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER DE, LATIN SMALL LETTER B +0061 2DE3 0315 0300 05AE 0062;0061 05AE 2DE3 0300 0315 0062;0061 05AE 2DE3 0300 0315 0062;0061 05AE 2DE3 0300 0315 0062;0061 05AE 2DE3 0300 0315 0062; # (a◌ⷣ◌̕◌̀◌֮b; a◌֮◌ⷣ◌̀◌̕b; a◌֮◌ⷣ◌̀◌̕b; a◌֮◌ⷣ◌̀◌̕b; a◌֮◌ⷣ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER DE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DE4 0062;00E0 05AE 2DE4 0315 0062;0061 05AE 0300 2DE4 0315 0062;00E0 05AE 2DE4 0315 0062;0061 05AE 0300 2DE4 0315 0062; # (a◌̕◌̀◌֮◌ⷤb; à◌֮◌ⷤ◌̕b; a◌֮◌̀◌ⷤ◌̕b; à◌֮◌ⷤ◌̕b; a◌֮◌̀◌ⷤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER ZHE, LATIN SMALL LETTER B +0061 2DE4 0315 0300 05AE 0062;0061 05AE 2DE4 0300 0315 0062;0061 05AE 2DE4 0300 0315 0062;0061 05AE 2DE4 0300 0315 0062;0061 05AE 2DE4 0300 0315 0062; # (a◌ⷤ◌̕◌̀◌֮b; a◌֮◌ⷤ◌̀◌̕b; a◌֮◌ⷤ◌̀◌̕b; a◌֮◌ⷤ◌̀◌̕b; a◌֮◌ⷤ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER ZHE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DE5 0062;00E0 05AE 2DE5 0315 0062;0061 05AE 0300 2DE5 0315 0062;00E0 05AE 2DE5 0315 0062;0061 05AE 0300 2DE5 0315 0062; # (a◌̕◌̀◌֮◌ⷥb; à◌֮◌ⷥ◌̕b; a◌֮◌̀◌ⷥ◌̕b; à◌֮◌ⷥ◌̕b; a◌֮◌̀◌ⷥ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER ZE, LATIN SMALL LETTER B +0061 2DE5 0315 0300 05AE 0062;0061 05AE 2DE5 0300 0315 0062;0061 05AE 2DE5 0300 0315 0062;0061 05AE 2DE5 0300 0315 0062;0061 05AE 2DE5 0300 0315 0062; # (a◌ⷥ◌̕◌̀◌֮b; a◌֮◌ⷥ◌̀◌̕b; a◌֮◌ⷥ◌̀◌̕b; a◌֮◌ⷥ◌̀◌̕b; a◌֮◌ⷥ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER ZE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DE6 0062;00E0 05AE 2DE6 0315 0062;0061 05AE 0300 2DE6 0315 0062;00E0 05AE 2DE6 0315 0062;0061 05AE 0300 2DE6 0315 0062; # (a◌̕◌̀◌֮◌ⷦb; à◌֮◌ⷦ◌̕b; a◌֮◌̀◌ⷦ◌̕b; à◌֮◌ⷦ◌̕b; a◌֮◌̀◌ⷦ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER KA, LATIN SMALL LETTER B +0061 2DE6 0315 0300 05AE 0062;0061 05AE 2DE6 0300 0315 0062;0061 05AE 2DE6 0300 0315 0062;0061 05AE 2DE6 0300 0315 0062;0061 05AE 2DE6 0300 0315 0062; # (a◌ⷦ◌̕◌̀◌֮b; a◌֮◌ⷦ◌̀◌̕b; a◌֮◌ⷦ◌̀◌̕b; a◌֮◌ⷦ◌̀◌̕b; a◌֮◌ⷦ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER KA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DE7 0062;00E0 05AE 2DE7 0315 0062;0061 05AE 0300 2DE7 0315 0062;00E0 05AE 2DE7 0315 0062;0061 05AE 0300 2DE7 0315 0062; # (a◌̕◌̀◌֮◌ⷧb; à◌֮◌ⷧ◌̕b; a◌֮◌̀◌ⷧ◌̕b; à◌֮◌ⷧ◌̕b; a◌֮◌̀◌ⷧ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER EL, LATIN SMALL LETTER B +0061 2DE7 0315 0300 05AE 0062;0061 05AE 2DE7 0300 0315 0062;0061 05AE 2DE7 0300 0315 0062;0061 05AE 2DE7 0300 0315 0062;0061 05AE 2DE7 0300 0315 0062; # (a◌ⷧ◌̕◌̀◌֮b; a◌֮◌ⷧ◌̀◌̕b; a◌֮◌ⷧ◌̀◌̕b; a◌֮◌ⷧ◌̀◌̕b; a◌֮◌ⷧ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER EL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DE8 0062;00E0 05AE 2DE8 0315 0062;0061 05AE 0300 2DE8 0315 0062;00E0 05AE 2DE8 0315 0062;0061 05AE 0300 2DE8 0315 0062; # (a◌̕◌̀◌֮◌ⷨb; à◌֮◌ⷨ◌̕b; a◌֮◌̀◌ⷨ◌̕b; à◌֮◌ⷨ◌̕b; a◌֮◌̀◌ⷨ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER EM, LATIN SMALL LETTER B +0061 2DE8 0315 0300 05AE 0062;0061 05AE 2DE8 0300 0315 0062;0061 05AE 2DE8 0300 0315 0062;0061 05AE 2DE8 0300 0315 0062;0061 05AE 2DE8 0300 0315 0062; # (a◌ⷨ◌̕◌̀◌֮b; a◌֮◌ⷨ◌̀◌̕b; a◌֮◌ⷨ◌̀◌̕b; a◌֮◌ⷨ◌̀◌̕b; a◌֮◌ⷨ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER EM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DE9 0062;00E0 05AE 2DE9 0315 0062;0061 05AE 0300 2DE9 0315 0062;00E0 05AE 2DE9 0315 0062;0061 05AE 0300 2DE9 0315 0062; # (a◌̕◌̀◌֮◌ⷩb; à◌֮◌ⷩ◌̕b; a◌֮◌̀◌ⷩ◌̕b; à◌֮◌ⷩ◌̕b; a◌֮◌̀◌ⷩ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER EN, LATIN SMALL LETTER B +0061 2DE9 0315 0300 05AE 0062;0061 05AE 2DE9 0300 0315 0062;0061 05AE 2DE9 0300 0315 0062;0061 05AE 2DE9 0300 0315 0062;0061 05AE 2DE9 0300 0315 0062; # (a◌ⷩ◌̕◌̀◌֮b; a◌֮◌ⷩ◌̀◌̕b; a◌֮◌ⷩ◌̀◌̕b; a◌֮◌ⷩ◌̀◌̕b; a◌֮◌ⷩ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER EN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DEA 0062;00E0 05AE 2DEA 0315 0062;0061 05AE 0300 2DEA 0315 0062;00E0 05AE 2DEA 0315 0062;0061 05AE 0300 2DEA 0315 0062; # (a◌̕◌̀◌֮◌ⷪb; à◌֮◌ⷪ◌̕b; a◌֮◌̀◌ⷪ◌̕b; à◌֮◌ⷪ◌̕b; a◌֮◌̀◌ⷪ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER O, LATIN SMALL LETTER B +0061 2DEA 0315 0300 05AE 0062;0061 05AE 2DEA 0300 0315 0062;0061 05AE 2DEA 0300 0315 0062;0061 05AE 2DEA 0300 0315 0062;0061 05AE 2DEA 0300 0315 0062; # (a◌ⷪ◌̕◌̀◌֮b; a◌֮◌ⷪ◌̀◌̕b; a◌֮◌ⷪ◌̀◌̕b; a◌֮◌ⷪ◌̀◌̕b; a◌֮◌ⷪ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER O, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DEB 0062;00E0 05AE 2DEB 0315 0062;0061 05AE 0300 2DEB 0315 0062;00E0 05AE 2DEB 0315 0062;0061 05AE 0300 2DEB 0315 0062; # (a◌̕◌̀◌֮◌ⷫb; à◌֮◌ⷫ◌̕b; a◌֮◌̀◌ⷫ◌̕b; à◌֮◌ⷫ◌̕b; a◌֮◌̀◌ⷫ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER PE, LATIN SMALL LETTER B +0061 2DEB 0315 0300 05AE 0062;0061 05AE 2DEB 0300 0315 0062;0061 05AE 2DEB 0300 0315 0062;0061 05AE 2DEB 0300 0315 0062;0061 05AE 2DEB 0300 0315 0062; # (a◌ⷫ◌̕◌̀◌֮b; a◌֮◌ⷫ◌̀◌̕b; a◌֮◌ⷫ◌̀◌̕b; a◌֮◌ⷫ◌̀◌̕b; a◌֮◌ⷫ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER PE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DEC 0062;00E0 05AE 2DEC 0315 0062;0061 05AE 0300 2DEC 0315 0062;00E0 05AE 2DEC 0315 0062;0061 05AE 0300 2DEC 0315 0062; # (a◌̕◌̀◌֮◌ⷬb; à◌֮◌ⷬ◌̕b; a◌֮◌̀◌ⷬ◌̕b; à◌֮◌ⷬ◌̕b; a◌֮◌̀◌ⷬ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER ER, LATIN SMALL LETTER B +0061 2DEC 0315 0300 05AE 0062;0061 05AE 2DEC 0300 0315 0062;0061 05AE 2DEC 0300 0315 0062;0061 05AE 2DEC 0300 0315 0062;0061 05AE 2DEC 0300 0315 0062; # (a◌ⷬ◌̕◌̀◌֮b; a◌֮◌ⷬ◌̀◌̕b; a◌֮◌ⷬ◌̀◌̕b; a◌֮◌ⷬ◌̀◌̕b; a◌֮◌ⷬ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER ER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DED 0062;00E0 05AE 2DED 0315 0062;0061 05AE 0300 2DED 0315 0062;00E0 05AE 2DED 0315 0062;0061 05AE 0300 2DED 0315 0062; # (a◌̕◌̀◌֮◌ⷭb; à◌֮◌ⷭ◌̕b; a◌֮◌̀◌ⷭ◌̕b; à◌֮◌ⷭ◌̕b; a◌֮◌̀◌ⷭ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER ES, LATIN SMALL LETTER B +0061 2DED 0315 0300 05AE 0062;0061 05AE 2DED 0300 0315 0062;0061 05AE 2DED 0300 0315 0062;0061 05AE 2DED 0300 0315 0062;0061 05AE 2DED 0300 0315 0062; # (a◌ⷭ◌̕◌̀◌֮b; a◌֮◌ⷭ◌̀◌̕b; a◌֮◌ⷭ◌̀◌̕b; a◌֮◌ⷭ◌̀◌̕b; a◌֮◌ⷭ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER ES, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DEE 0062;00E0 05AE 2DEE 0315 0062;0061 05AE 0300 2DEE 0315 0062;00E0 05AE 2DEE 0315 0062;0061 05AE 0300 2DEE 0315 0062; # (a◌̕◌̀◌֮◌ⷮb; à◌֮◌ⷮ◌̕b; a◌֮◌̀◌ⷮ◌̕b; à◌֮◌ⷮ◌̕b; a◌֮◌̀◌ⷮ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER TE, LATIN SMALL LETTER B +0061 2DEE 0315 0300 05AE 0062;0061 05AE 2DEE 0300 0315 0062;0061 05AE 2DEE 0300 0315 0062;0061 05AE 2DEE 0300 0315 0062;0061 05AE 2DEE 0300 0315 0062; # (a◌ⷮ◌̕◌̀◌֮b; a◌֮◌ⷮ◌̀◌̕b; a◌֮◌ⷮ◌̀◌̕b; a◌֮◌ⷮ◌̀◌̕b; a◌֮◌ⷮ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER TE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DEF 0062;00E0 05AE 2DEF 0315 0062;0061 05AE 0300 2DEF 0315 0062;00E0 05AE 2DEF 0315 0062;0061 05AE 0300 2DEF 0315 0062; # (a◌̕◌̀◌֮◌ⷯb; à◌֮◌ⷯ◌̕b; a◌֮◌̀◌ⷯ◌̕b; à◌֮◌ⷯ◌̕b; a◌֮◌̀◌ⷯ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER HA, LATIN SMALL LETTER B +0061 2DEF 0315 0300 05AE 0062;0061 05AE 2DEF 0300 0315 0062;0061 05AE 2DEF 0300 0315 0062;0061 05AE 2DEF 0300 0315 0062;0061 05AE 2DEF 0300 0315 0062; # (a◌ⷯ◌̕◌̀◌֮b; a◌֮◌ⷯ◌̀◌̕b; a◌֮◌ⷯ◌̀◌̕b; a◌֮◌ⷯ◌̀◌̕b; a◌֮◌ⷯ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER HA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DF0 0062;00E0 05AE 2DF0 0315 0062;0061 05AE 0300 2DF0 0315 0062;00E0 05AE 2DF0 0315 0062;0061 05AE 0300 2DF0 0315 0062; # (a◌̕◌̀◌֮◌ⷰb; à◌֮◌ⷰ◌̕b; a◌֮◌̀◌ⷰ◌̕b; à◌֮◌ⷰ◌̕b; a◌֮◌̀◌ⷰ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER TSE, LATIN SMALL LETTER B +0061 2DF0 0315 0300 05AE 0062;0061 05AE 2DF0 0300 0315 0062;0061 05AE 2DF0 0300 0315 0062;0061 05AE 2DF0 0300 0315 0062;0061 05AE 2DF0 0300 0315 0062; # (a◌ⷰ◌̕◌̀◌֮b; a◌֮◌ⷰ◌̀◌̕b; a◌֮◌ⷰ◌̀◌̕b; a◌֮◌ⷰ◌̀◌̕b; a◌֮◌ⷰ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER TSE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DF1 0062;00E0 05AE 2DF1 0315 0062;0061 05AE 0300 2DF1 0315 0062;00E0 05AE 2DF1 0315 0062;0061 05AE 0300 2DF1 0315 0062; # (a◌̕◌̀◌֮◌ⷱb; à◌֮◌ⷱ◌̕b; a◌֮◌̀◌ⷱ◌̕b; à◌֮◌ⷱ◌̕b; a◌֮◌̀◌ⷱ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER CHE, LATIN SMALL LETTER B +0061 2DF1 0315 0300 05AE 0062;0061 05AE 2DF1 0300 0315 0062;0061 05AE 2DF1 0300 0315 0062;0061 05AE 2DF1 0300 0315 0062;0061 05AE 2DF1 0300 0315 0062; # (a◌ⷱ◌̕◌̀◌֮b; a◌֮◌ⷱ◌̀◌̕b; a◌֮◌ⷱ◌̀◌̕b; a◌֮◌ⷱ◌̀◌̕b; a◌֮◌ⷱ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER CHE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DF2 0062;00E0 05AE 2DF2 0315 0062;0061 05AE 0300 2DF2 0315 0062;00E0 05AE 2DF2 0315 0062;0061 05AE 0300 2DF2 0315 0062; # (a◌̕◌̀◌֮◌ⷲb; à◌֮◌ⷲ◌̕b; a◌֮◌̀◌ⷲ◌̕b; à◌֮◌ⷲ◌̕b; a◌֮◌̀◌ⷲ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER SHA, LATIN SMALL LETTER B +0061 2DF2 0315 0300 05AE 0062;0061 05AE 2DF2 0300 0315 0062;0061 05AE 2DF2 0300 0315 0062;0061 05AE 2DF2 0300 0315 0062;0061 05AE 2DF2 0300 0315 0062; # (a◌ⷲ◌̕◌̀◌֮b; a◌֮◌ⷲ◌̀◌̕b; a◌֮◌ⷲ◌̀◌̕b; a◌֮◌ⷲ◌̀◌̕b; a◌֮◌ⷲ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER SHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DF3 0062;00E0 05AE 2DF3 0315 0062;0061 05AE 0300 2DF3 0315 0062;00E0 05AE 2DF3 0315 0062;0061 05AE 0300 2DF3 0315 0062; # (a◌̕◌̀◌֮◌ⷳb; à◌֮◌ⷳ◌̕b; a◌֮◌̀◌ⷳ◌̕b; à◌֮◌ⷳ◌̕b; a◌֮◌̀◌ⷳ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER SHCHA, LATIN SMALL LETTER B +0061 2DF3 0315 0300 05AE 0062;0061 05AE 2DF3 0300 0315 0062;0061 05AE 2DF3 0300 0315 0062;0061 05AE 2DF3 0300 0315 0062;0061 05AE 2DF3 0300 0315 0062; # (a◌ⷳ◌̕◌̀◌֮b; a◌֮◌ⷳ◌̀◌̕b; a◌֮◌ⷳ◌̀◌̕b; a◌֮◌ⷳ◌̀◌̕b; a◌֮◌ⷳ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER SHCHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DF4 0062;00E0 05AE 2DF4 0315 0062;0061 05AE 0300 2DF4 0315 0062;00E0 05AE 2DF4 0315 0062;0061 05AE 0300 2DF4 0315 0062; # (a◌̕◌̀◌֮◌ⷴb; à◌֮◌ⷴ◌̕b; a◌֮◌̀◌ⷴ◌̕b; à◌֮◌ⷴ◌̕b; a◌֮◌̀◌ⷴ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER FITA, LATIN SMALL LETTER B +0061 2DF4 0315 0300 05AE 0062;0061 05AE 2DF4 0300 0315 0062;0061 05AE 2DF4 0300 0315 0062;0061 05AE 2DF4 0300 0315 0062;0061 05AE 2DF4 0300 0315 0062; # (a◌ⷴ◌̕◌̀◌֮b; a◌֮◌ⷴ◌̀◌̕b; a◌֮◌ⷴ◌̀◌̕b; a◌֮◌ⷴ◌̀◌̕b; a◌֮◌ⷴ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER FITA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DF5 0062;00E0 05AE 2DF5 0315 0062;0061 05AE 0300 2DF5 0315 0062;00E0 05AE 2DF5 0315 0062;0061 05AE 0300 2DF5 0315 0062; # (a◌̕◌̀◌֮◌ⷵb; à◌֮◌ⷵ◌̕b; a◌֮◌̀◌ⷵ◌̕b; à◌֮◌ⷵ◌̕b; a◌֮◌̀◌ⷵ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER ES-TE, LATIN SMALL LETTER B +0061 2DF5 0315 0300 05AE 0062;0061 05AE 2DF5 0300 0315 0062;0061 05AE 2DF5 0300 0315 0062;0061 05AE 2DF5 0300 0315 0062;0061 05AE 2DF5 0300 0315 0062; # (a◌ⷵ◌̕◌̀◌֮b; a◌֮◌ⷵ◌̀◌̕b; a◌֮◌ⷵ◌̀◌̕b; a◌֮◌ⷵ◌̀◌̕b; a◌֮◌ⷵ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER ES-TE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DF6 0062;00E0 05AE 2DF6 0315 0062;0061 05AE 0300 2DF6 0315 0062;00E0 05AE 2DF6 0315 0062;0061 05AE 0300 2DF6 0315 0062; # (a◌̕◌̀◌֮◌ⷶb; à◌֮◌ⷶ◌̕b; a◌֮◌̀◌ⷶ◌̕b; à◌֮◌ⷶ◌̕b; a◌֮◌̀◌ⷶ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER A, LATIN SMALL LETTER B +0061 2DF6 0315 0300 05AE 0062;0061 05AE 2DF6 0300 0315 0062;0061 05AE 2DF6 0300 0315 0062;0061 05AE 2DF6 0300 0315 0062;0061 05AE 2DF6 0300 0315 0062; # (a◌ⷶ◌̕◌̀◌֮b; a◌֮◌ⷶ◌̀◌̕b; a◌֮◌ⷶ◌̀◌̕b; a◌֮◌ⷶ◌̀◌̕b; a◌֮◌ⷶ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DF7 0062;00E0 05AE 2DF7 0315 0062;0061 05AE 0300 2DF7 0315 0062;00E0 05AE 2DF7 0315 0062;0061 05AE 0300 2DF7 0315 0062; # (a◌̕◌̀◌֮◌ⷷb; à◌֮◌ⷷ◌̕b; a◌֮◌̀◌ⷷ◌̕b; à◌֮◌ⷷ◌̕b; a◌֮◌̀◌ⷷ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER IE, LATIN SMALL LETTER B +0061 2DF7 0315 0300 05AE 0062;0061 05AE 2DF7 0300 0315 0062;0061 05AE 2DF7 0300 0315 0062;0061 05AE 2DF7 0300 0315 0062;0061 05AE 2DF7 0300 0315 0062; # (a◌ⷷ◌̕◌̀◌֮b; a◌֮◌ⷷ◌̀◌̕b; a◌֮◌ⷷ◌̀◌̕b; a◌֮◌ⷷ◌̀◌̕b; a◌֮◌ⷷ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER IE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DF8 0062;00E0 05AE 2DF8 0315 0062;0061 05AE 0300 2DF8 0315 0062;00E0 05AE 2DF8 0315 0062;0061 05AE 0300 2DF8 0315 0062; # (a◌̕◌̀◌֮◌ⷸb; à◌֮◌ⷸ◌̕b; a◌֮◌̀◌ⷸ◌̕b; à◌֮◌ⷸ◌̕b; a◌֮◌̀◌ⷸ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER DJERV, LATIN SMALL LETTER B +0061 2DF8 0315 0300 05AE 0062;0061 05AE 2DF8 0300 0315 0062;0061 05AE 2DF8 0300 0315 0062;0061 05AE 2DF8 0300 0315 0062;0061 05AE 2DF8 0300 0315 0062; # (a◌ⷸ◌̕◌̀◌֮b; a◌֮◌ⷸ◌̀◌̕b; a◌֮◌ⷸ◌̀◌̕b; a◌֮◌ⷸ◌̀◌̕b; a◌֮◌ⷸ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER DJERV, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DF9 0062;00E0 05AE 2DF9 0315 0062;0061 05AE 0300 2DF9 0315 0062;00E0 05AE 2DF9 0315 0062;0061 05AE 0300 2DF9 0315 0062; # (a◌̕◌̀◌֮◌ⷹb; à◌֮◌ⷹ◌̕b; a◌֮◌̀◌ⷹ◌̕b; à◌֮◌ⷹ◌̕b; a◌֮◌̀◌ⷹ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER MONOGRAPH UK, LATIN SMALL LETTER B +0061 2DF9 0315 0300 05AE 0062;0061 05AE 2DF9 0300 0315 0062;0061 05AE 2DF9 0300 0315 0062;0061 05AE 2DF9 0300 0315 0062;0061 05AE 2DF9 0300 0315 0062; # (a◌ⷹ◌̕◌̀◌֮b; a◌֮◌ⷹ◌̀◌̕b; a◌֮◌ⷹ◌̀◌̕b; a◌֮◌ⷹ◌̀◌̕b; a◌֮◌ⷹ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER MONOGRAPH UK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DFA 0062;00E0 05AE 2DFA 0315 0062;0061 05AE 0300 2DFA 0315 0062;00E0 05AE 2DFA 0315 0062;0061 05AE 0300 2DFA 0315 0062; # (a◌̕◌̀◌֮◌ⷺb; à◌֮◌ⷺ◌̕b; a◌֮◌̀◌ⷺ◌̕b; à◌֮◌ⷺ◌̕b; a◌֮◌̀◌ⷺ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER YAT, LATIN SMALL LETTER B +0061 2DFA 0315 0300 05AE 0062;0061 05AE 2DFA 0300 0315 0062;0061 05AE 2DFA 0300 0315 0062;0061 05AE 2DFA 0300 0315 0062;0061 05AE 2DFA 0300 0315 0062; # (a◌ⷺ◌̕◌̀◌֮b; a◌֮◌ⷺ◌̀◌̕b; a◌֮◌ⷺ◌̀◌̕b; a◌֮◌ⷺ◌̀◌̕b; a◌֮◌ⷺ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER YAT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DFB 0062;00E0 05AE 2DFB 0315 0062;0061 05AE 0300 2DFB 0315 0062;00E0 05AE 2DFB 0315 0062;0061 05AE 0300 2DFB 0315 0062; # (a◌̕◌̀◌֮◌ⷻb; à◌֮◌ⷻ◌̕b; a◌֮◌̀◌ⷻ◌̕b; à◌֮◌ⷻ◌̕b; a◌֮◌̀◌ⷻ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER YU, LATIN SMALL LETTER B +0061 2DFB 0315 0300 05AE 0062;0061 05AE 2DFB 0300 0315 0062;0061 05AE 2DFB 0300 0315 0062;0061 05AE 2DFB 0300 0315 0062;0061 05AE 2DFB 0300 0315 0062; # (a◌ⷻ◌̕◌̀◌֮b; a◌֮◌ⷻ◌̀◌̕b; a◌֮◌ⷻ◌̀◌̕b; a◌֮◌ⷻ◌̀◌̕b; a◌֮◌ⷻ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER YU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DFC 0062;00E0 05AE 2DFC 0315 0062;0061 05AE 0300 2DFC 0315 0062;00E0 05AE 2DFC 0315 0062;0061 05AE 0300 2DFC 0315 0062; # (a◌̕◌̀◌֮◌ⷼb; à◌֮◌ⷼ◌̕b; a◌֮◌̀◌ⷼ◌̕b; à◌֮◌ⷼ◌̕b; a◌֮◌̀◌ⷼ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER IOTIFIED A, LATIN SMALL LETTER B +0061 2DFC 0315 0300 05AE 0062;0061 05AE 2DFC 0300 0315 0062;0061 05AE 2DFC 0300 0315 0062;0061 05AE 2DFC 0300 0315 0062;0061 05AE 2DFC 0300 0315 0062; # (a◌ⷼ◌̕◌̀◌֮b; a◌֮◌ⷼ◌̀◌̕b; a◌֮◌ⷼ◌̀◌̕b; a◌֮◌ⷼ◌̀◌̕b; a◌֮◌ⷼ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER IOTIFIED A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DFD 0062;00E0 05AE 2DFD 0315 0062;0061 05AE 0300 2DFD 0315 0062;00E0 05AE 2DFD 0315 0062;0061 05AE 0300 2DFD 0315 0062; # (a◌̕◌̀◌֮◌ⷽb; à◌֮◌ⷽ◌̕b; a◌֮◌̀◌ⷽ◌̕b; à◌֮◌ⷽ◌̕b; a◌֮◌̀◌ⷽ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER LITTLE YUS, LATIN SMALL LETTER B +0061 2DFD 0315 0300 05AE 0062;0061 05AE 2DFD 0300 0315 0062;0061 05AE 2DFD 0300 0315 0062;0061 05AE 2DFD 0300 0315 0062;0061 05AE 2DFD 0300 0315 0062; # (a◌ⷽ◌̕◌̀◌֮b; a◌֮◌ⷽ◌̀◌̕b; a◌֮◌ⷽ◌̀◌̕b; a◌֮◌ⷽ◌̀◌̕b; a◌֮◌ⷽ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER LITTLE YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DFE 0062;00E0 05AE 2DFE 0315 0062;0061 05AE 0300 2DFE 0315 0062;00E0 05AE 2DFE 0315 0062;0061 05AE 0300 2DFE 0315 0062; # (a◌̕◌̀◌֮◌ⷾb; à◌֮◌ⷾ◌̕b; a◌֮◌̀◌ⷾ◌̕b; à◌֮◌ⷾ◌̕b; a◌֮◌̀◌ⷾ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER BIG YUS, LATIN SMALL LETTER B +0061 2DFE 0315 0300 05AE 0062;0061 05AE 2DFE 0300 0315 0062;0061 05AE 2DFE 0300 0315 0062;0061 05AE 2DFE 0300 0315 0062;0061 05AE 2DFE 0300 0315 0062; # (a◌ⷾ◌̕◌̀◌֮b; a◌֮◌ⷾ◌̀◌̕b; a◌֮◌ⷾ◌̀◌̕b; a◌֮◌ⷾ◌̀◌̕b; a◌֮◌ⷾ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER BIG YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 2DFF 0062;00E0 05AE 2DFF 0315 0062;0061 05AE 0300 2DFF 0315 0062;00E0 05AE 2DFF 0315 0062;0061 05AE 0300 2DFF 0315 0062; # (a◌̕◌̀◌֮◌ⷿb; à◌֮◌ⷿ◌̕b; a◌֮◌̀◌ⷿ◌̕b; à◌֮◌ⷿ◌̕b; a◌֮◌̀◌ⷿ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER IOTIFIED BIG YUS, LATIN SMALL LETTER B +0061 2DFF 0315 0300 05AE 0062;0061 05AE 2DFF 0300 0315 0062;0061 05AE 2DFF 0300 0315 0062;0061 05AE 2DFF 0300 0315 0062;0061 05AE 2DFF 0300 0315 0062; # (a◌ⷿ◌̕◌̀◌֮b; a◌֮◌ⷿ◌̀◌̕b; a◌֮◌ⷿ◌̀◌̕b; a◌֮◌ⷿ◌̀◌̕b; a◌֮◌ⷿ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER IOTIFIED BIG YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0316 1DFA 031B 302A 0062;0061 031B 1DFA 302A 0316 0062;0061 031B 1DFA 302A 0316 0062;0061 031B 1DFA 302A 0316 0062;0061 031B 1DFA 302A 0316 0062; # (a◌̖◌᷺◌̛◌〪b; a◌̛◌᷺◌〪◌̖b; a◌̛◌᷺◌〪◌̖b; a◌̛◌᷺◌〪◌̖b; a◌̛◌᷺◌〪◌̖b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING HORN, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B +0061 302A 0316 1DFA 031B 0062;0061 031B 302A 1DFA 0316 0062;0061 031B 302A 1DFA 0316 0062;0061 031B 302A 1DFA 0316 0062;0061 031B 302A 1DFA 0316 0062; # (a◌〪◌̖◌᷺◌̛b; a◌̛◌〪◌᷺◌̖b; a◌̛◌〪◌᷺◌̖b; a◌̛◌〪◌᷺◌̖b; a◌̛◌〪◌᷺◌̖b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING HORN, LATIN SMALL LETTER B +0061 0300 05AE 1D16D 302B 0062;00E0 1D16D 05AE 302B 0062;0061 1D16D 05AE 302B 0300 0062;00E0 1D16D 05AE 302B 0062;0061 1D16D 05AE 302B 0300 0062; # (a◌̀◌𝅭֮◌〫b; à𝅭◌֮◌〫b; a𝅭◌֮◌〫◌̀b; à𝅭◌֮◌〫b; a𝅭◌֮◌〫◌̀b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, IDEOGRAPHIC RISING TONE MARK, LATIN SMALL LETTER B +0061 302B 0300 05AE 1D16D 0062;00E0 1D16D 302B 05AE 0062;0061 1D16D 302B 05AE 0300 0062;00E0 1D16D 302B 05AE 0062;0061 1D16D 302B 05AE 0300 0062; # (a◌〫◌̀◌𝅭֮b; à𝅭◌〫◌֮b; a𝅭◌〫◌֮◌̀b; à𝅭◌〫◌֮b; a𝅭◌〫◌֮◌̀b; ) LATIN SMALL LETTER A, IDEOGRAPHIC RISING TONE MARK, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 035C 0315 0300 302C 0062;00E0 0315 302C 035C 0062;0061 0300 0315 302C 035C 0062;00E0 0315 302C 035C 0062;0061 0300 0315 302C 035C 0062; # (a◌͜◌̕◌̀◌〬b; à◌̕◌〬◌͜b; a◌̀◌̕◌〬◌͜b; à◌̕◌〬◌͜b; a◌̀◌̕◌〬◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, IDEOGRAPHIC DEPARTING TONE MARK, LATIN SMALL LETTER B +0061 302C 035C 0315 0300 0062;00E0 302C 0315 035C 0062;0061 0300 302C 0315 035C 0062;00E0 302C 0315 035C 0062;0061 0300 302C 0315 035C 0062; # (a◌〬◌͜◌̕◌̀b; à◌〬◌̕◌͜b; a◌̀◌〬◌̕◌͜b; à◌〬◌̕◌͜b; a◌̀◌〬◌̕◌͜b; ) LATIN SMALL LETTER A, IDEOGRAPHIC DEPARTING TONE MARK, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 302E 059A 0316 302D 0062;0061 0316 059A 302D 302E 0062;0061 0316 059A 302D 302E 0062;0061 0316 059A 302D 302E 0062;0061 0316 059A 302D 302E 0062; # (a〮◌֚◌̖◌〭b; a◌̖◌֚◌〭〮b; a◌̖◌֚◌〭〮b; a◌̖◌֚◌〭〮b; a◌̖◌֚◌〭〮b; ) LATIN SMALL LETTER A, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC ENTERING TONE MARK, LATIN SMALL LETTER B +0061 302D 302E 059A 0316 0062;0061 0316 302D 059A 302E 0062;0061 0316 302D 059A 302E 0062;0061 0316 302D 059A 302E 0062;0061 0316 302D 059A 302E 0062; # (a◌〭〮◌֚◌̖b; a◌̖◌〭◌֚〮b; a◌̖◌〭◌֚〮b; a◌̖◌〭◌֚〮b; a◌̖◌〭◌֚〮b; ) LATIN SMALL LETTER A, IDEOGRAPHIC ENTERING TONE MARK, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B +0061 1D16D 302E 059A 302E 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062; # (a〮𝅭◌֚〮b; a◌֚〮〮𝅭b; a◌֚〮〮𝅭b; a◌֚〮〮𝅭b; a◌֚〮〮𝅭b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, HANGUL SINGLE DOT TONE MARK, LATIN SMALL LETTER B +0061 302E 1D16D 302E 059A 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062;0061 059A 302E 302E 1D16D 0062; # (a〮〮𝅭◌֚b; a◌֚〮〮𝅭b; a◌֚〮〮𝅭b; a◌֚〮〮𝅭b; a◌֚〮〮𝅭b; ) LATIN SMALL LETTER A, HANGUL SINGLE DOT TONE MARK, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, LATIN SMALL LETTER B +0061 1D16D 302E 059A 302F 0062;0061 059A 302E 302F 1D16D 0062;0061 059A 302E 302F 1D16D 0062;0061 059A 302E 302F 1D16D 0062;0061 059A 302E 302F 1D16D 0062; # (a〮𝅭◌֚〯b; a◌֚〮〯𝅭b; a◌֚〮〯𝅭b; a◌֚〮〯𝅭b; a◌֚〮〯𝅭b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, HANGUL DOUBLE DOT TONE MARK, LATIN SMALL LETTER B +0061 302F 1D16D 302E 059A 0062;0061 059A 302F 302E 1D16D 0062;0061 059A 302F 302E 1D16D 0062;0061 059A 302F 302E 1D16D 0062;0061 059A 302F 302E 1D16D 0062; # (a〯〮𝅭◌֚b; a◌֚〯〮𝅭b; a◌֚〯〮𝅭b; a◌֚〯〮𝅭b; a◌֚〯〮𝅭b; ) LATIN SMALL LETTER A, HANGUL DOUBLE DOT TONE MARK, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, LATIN SMALL LETTER B +0061 094D 3099 093C 3099 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062; # (a◌्◌゙◌़◌゙b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 094D 3099 093C 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062;0061 093C 3099 3099 094D 0062; # (a◌゙◌्◌゙◌़b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; a◌़◌゙◌゙◌्b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, LATIN SMALL LETTER B +0061 094D 3099 093C 309A 0062;0061 093C 3099 309A 094D 0062;0061 093C 3099 309A 094D 0062;0061 093C 3099 309A 094D 0062;0061 093C 3099 309A 094D 0062; # (a◌्◌゙◌़◌゚b; a◌़◌゙◌゚◌्b; a◌़◌゙◌゚◌्b; a◌़◌゙◌゚◌्b; a◌़◌゙◌゚◌्b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, LATIN SMALL LETTER B +0061 309A 094D 3099 093C 0062;0061 093C 309A 3099 094D 0062;0061 093C 309A 3099 094D 0062;0061 093C 309A 3099 094D 0062;0061 093C 309A 3099 094D 0062; # (a◌゚◌्◌゙◌़b; a◌़◌゚◌゙◌्b; a◌़◌゚◌゙◌्b; a◌़◌゚◌゙◌्b; a◌़◌゚◌゙◌्b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, LATIN SMALL LETTER B +0061 0315 0300 05AE A66F 0062;00E0 05AE A66F 0315 0062;0061 05AE 0300 A66F 0315 0062;00E0 05AE A66F 0315 0062;0061 05AE 0300 A66F 0315 0062; # (a◌̕◌̀◌֮◌꙯b; à◌֮◌꙯◌̕b; a◌֮◌̀◌꙯◌̕b; à◌֮◌꙯◌̕b; a◌֮◌̀◌꙯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC VZMET, LATIN SMALL LETTER B +0061 A66F 0315 0300 05AE 0062;0061 05AE A66F 0300 0315 0062;0061 05AE A66F 0300 0315 0062;0061 05AE A66F 0300 0315 0062;0061 05AE A66F 0300 0315 0062; # (a◌꙯◌̕◌̀◌֮b; a◌֮◌꙯◌̀◌̕b; a◌֮◌꙯◌̀◌̕b; a◌֮◌꙯◌̀◌̕b; a◌֮◌꙯◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC VZMET, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A674 0062;00E0 05AE A674 0315 0062;0061 05AE 0300 A674 0315 0062;00E0 05AE A674 0315 0062;0061 05AE 0300 A674 0315 0062; # (a◌̕◌̀◌֮◌ꙴb; à◌֮◌ꙴ◌̕b; a◌֮◌̀◌ꙴ◌̕b; à◌֮◌ꙴ◌̕b; a◌֮◌̀◌ꙴ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER UKRAINIAN IE, LATIN SMALL LETTER B +0061 A674 0315 0300 05AE 0062;0061 05AE A674 0300 0315 0062;0061 05AE A674 0300 0315 0062;0061 05AE A674 0300 0315 0062;0061 05AE A674 0300 0315 0062; # (a◌ꙴ◌̕◌̀◌֮b; a◌֮◌ꙴ◌̀◌̕b; a◌֮◌ꙴ◌̀◌̕b; a◌֮◌ꙴ◌̀◌̕b; a◌֮◌ꙴ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER UKRAINIAN IE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A675 0062;00E0 05AE A675 0315 0062;0061 05AE 0300 A675 0315 0062;00E0 05AE A675 0315 0062;0061 05AE 0300 A675 0315 0062; # (a◌̕◌̀◌֮◌ꙵb; à◌֮◌ꙵ◌̕b; a◌֮◌̀◌ꙵ◌̕b; à◌֮◌ꙵ◌̕b; a◌֮◌̀◌ꙵ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER I, LATIN SMALL LETTER B +0061 A675 0315 0300 05AE 0062;0061 05AE A675 0300 0315 0062;0061 05AE A675 0300 0315 0062;0061 05AE A675 0300 0315 0062;0061 05AE A675 0300 0315 0062; # (a◌ꙵ◌̕◌̀◌֮b; a◌֮◌ꙵ◌̀◌̕b; a◌֮◌ꙵ◌̀◌̕b; a◌֮◌ꙵ◌̀◌̕b; a◌֮◌ꙵ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A676 0062;00E0 05AE A676 0315 0062;0061 05AE 0300 A676 0315 0062;00E0 05AE A676 0315 0062;0061 05AE 0300 A676 0315 0062; # (a◌̕◌̀◌֮◌ꙶb; à◌֮◌ꙶ◌̕b; a◌֮◌̀◌ꙶ◌̕b; à◌֮◌ꙶ◌̕b; a◌֮◌̀◌ꙶ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER YI, LATIN SMALL LETTER B +0061 A676 0315 0300 05AE 0062;0061 05AE A676 0300 0315 0062;0061 05AE A676 0300 0315 0062;0061 05AE A676 0300 0315 0062;0061 05AE A676 0300 0315 0062; # (a◌ꙶ◌̕◌̀◌֮b; a◌֮◌ꙶ◌̀◌̕b; a◌֮◌ꙶ◌̀◌̕b; a◌֮◌ꙶ◌̀◌̕b; a◌֮◌ꙶ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER YI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A677 0062;00E0 05AE A677 0315 0062;0061 05AE 0300 A677 0315 0062;00E0 05AE A677 0315 0062;0061 05AE 0300 A677 0315 0062; # (a◌̕◌̀◌֮◌ꙷb; à◌֮◌ꙷ◌̕b; a◌֮◌̀◌ꙷ◌̕b; à◌֮◌ꙷ◌̕b; a◌֮◌̀◌ꙷ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER U, LATIN SMALL LETTER B +0061 A677 0315 0300 05AE 0062;0061 05AE A677 0300 0315 0062;0061 05AE A677 0300 0315 0062;0061 05AE A677 0300 0315 0062;0061 05AE A677 0300 0315 0062; # (a◌ꙷ◌̕◌̀◌֮b; a◌֮◌ꙷ◌̀◌̕b; a◌֮◌ꙷ◌̀◌̕b; a◌֮◌ꙷ◌̀◌̕b; a◌֮◌ꙷ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER U, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A678 0062;00E0 05AE A678 0315 0062;0061 05AE 0300 A678 0315 0062;00E0 05AE A678 0315 0062;0061 05AE 0300 A678 0315 0062; # (a◌̕◌̀◌֮◌ꙸb; à◌֮◌ꙸ◌̕b; a◌֮◌̀◌ꙸ◌̕b; à◌֮◌ꙸ◌̕b; a◌֮◌̀◌ꙸ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER HARD SIGN, LATIN SMALL LETTER B +0061 A678 0315 0300 05AE 0062;0061 05AE A678 0300 0315 0062;0061 05AE A678 0300 0315 0062;0061 05AE A678 0300 0315 0062;0061 05AE A678 0300 0315 0062; # (a◌ꙸ◌̕◌̀◌֮b; a◌֮◌ꙸ◌̀◌̕b; a◌֮◌ꙸ◌̀◌̕b; a◌֮◌ꙸ◌̀◌̕b; a◌֮◌ꙸ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER HARD SIGN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A679 0062;00E0 05AE A679 0315 0062;0061 05AE 0300 A679 0315 0062;00E0 05AE A679 0315 0062;0061 05AE 0300 A679 0315 0062; # (a◌̕◌̀◌֮◌ꙹb; à◌֮◌ꙹ◌̕b; a◌֮◌̀◌ꙹ◌̕b; à◌֮◌ꙹ◌̕b; a◌֮◌̀◌ꙹ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER YERU, LATIN SMALL LETTER B +0061 A679 0315 0300 05AE 0062;0061 05AE A679 0300 0315 0062;0061 05AE A679 0300 0315 0062;0061 05AE A679 0300 0315 0062;0061 05AE A679 0300 0315 0062; # (a◌ꙹ◌̕◌̀◌֮b; a◌֮◌ꙹ◌̀◌̕b; a◌֮◌ꙹ◌̀◌̕b; a◌֮◌ꙹ◌̀◌̕b; a◌֮◌ꙹ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER YERU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A67A 0062;00E0 05AE A67A 0315 0062;0061 05AE 0300 A67A 0315 0062;00E0 05AE A67A 0315 0062;0061 05AE 0300 A67A 0315 0062; # (a◌̕◌̀◌֮◌ꙺb; à◌֮◌ꙺ◌̕b; a◌֮◌̀◌ꙺ◌̕b; à◌֮◌ꙺ◌̕b; a◌֮◌̀◌ꙺ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER SOFT SIGN, LATIN SMALL LETTER B +0061 A67A 0315 0300 05AE 0062;0061 05AE A67A 0300 0315 0062;0061 05AE A67A 0300 0315 0062;0061 05AE A67A 0300 0315 0062;0061 05AE A67A 0300 0315 0062; # (a◌ꙺ◌̕◌̀◌֮b; a◌֮◌ꙺ◌̀◌̕b; a◌֮◌ꙺ◌̀◌̕b; a◌֮◌ꙺ◌̀◌̕b; a◌֮◌ꙺ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER SOFT SIGN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A67B 0062;00E0 05AE A67B 0315 0062;0061 05AE 0300 A67B 0315 0062;00E0 05AE A67B 0315 0062;0061 05AE 0300 A67B 0315 0062; # (a◌̕◌̀◌֮◌ꙻb; à◌֮◌ꙻ◌̕b; a◌֮◌̀◌ꙻ◌̕b; à◌֮◌ꙻ◌̕b; a◌֮◌̀◌ꙻ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER OMEGA, LATIN SMALL LETTER B +0061 A67B 0315 0300 05AE 0062;0061 05AE A67B 0300 0315 0062;0061 05AE A67B 0300 0315 0062;0061 05AE A67B 0300 0315 0062;0061 05AE A67B 0300 0315 0062; # (a◌ꙻ◌̕◌̀◌֮b; a◌֮◌ꙻ◌̀◌̕b; a◌֮◌ꙻ◌̀◌̕b; a◌֮◌ꙻ◌̀◌̕b; a◌֮◌ꙻ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER OMEGA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A67C 0062;00E0 05AE A67C 0315 0062;0061 05AE 0300 A67C 0315 0062;00E0 05AE A67C 0315 0062;0061 05AE 0300 A67C 0315 0062; # (a◌̕◌̀◌֮◌꙼b; à◌֮◌꙼◌̕b; a◌֮◌̀◌꙼◌̕b; à◌֮◌꙼◌̕b; a◌֮◌̀◌꙼◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC KAVYKA, LATIN SMALL LETTER B +0061 A67C 0315 0300 05AE 0062;0061 05AE A67C 0300 0315 0062;0061 05AE A67C 0300 0315 0062;0061 05AE A67C 0300 0315 0062;0061 05AE A67C 0300 0315 0062; # (a◌꙼◌̕◌̀◌֮b; a◌֮◌꙼◌̀◌̕b; a◌֮◌꙼◌̀◌̕b; a◌֮◌꙼◌̀◌̕b; a◌֮◌꙼◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC KAVYKA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A67D 0062;00E0 05AE A67D 0315 0062;0061 05AE 0300 A67D 0315 0062;00E0 05AE A67D 0315 0062;0061 05AE 0300 A67D 0315 0062; # (a◌̕◌̀◌֮◌꙽b; à◌֮◌꙽◌̕b; a◌֮◌̀◌꙽◌̕b; à◌֮◌꙽◌̕b; a◌֮◌̀◌꙽◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC PAYEROK, LATIN SMALL LETTER B +0061 A67D 0315 0300 05AE 0062;0061 05AE A67D 0300 0315 0062;0061 05AE A67D 0300 0315 0062;0061 05AE A67D 0300 0315 0062;0061 05AE A67D 0300 0315 0062; # (a◌꙽◌̕◌̀◌֮b; a◌֮◌꙽◌̀◌̕b; a◌֮◌꙽◌̀◌̕b; a◌֮◌꙽◌̀◌̕b; a◌֮◌꙽◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC PAYEROK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A69E 0062;00E0 05AE A69E 0315 0062;0061 05AE 0300 A69E 0315 0062;00E0 05AE A69E 0315 0062;0061 05AE 0300 A69E 0315 0062; # (a◌̕◌̀◌֮◌ꚞb; à◌֮◌ꚞ◌̕b; a◌֮◌̀◌ꚞ◌̕b; à◌֮◌ꚞ◌̕b; a◌֮◌̀◌ꚞ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER EF, LATIN SMALL LETTER B +0061 A69E 0315 0300 05AE 0062;0061 05AE A69E 0300 0315 0062;0061 05AE A69E 0300 0315 0062;0061 05AE A69E 0300 0315 0062;0061 05AE A69E 0300 0315 0062; # (a◌ꚞ◌̕◌̀◌֮b; a◌֮◌ꚞ◌̀◌̕b; a◌֮◌ꚞ◌̀◌̕b; a◌֮◌ꚞ◌̀◌̕b; a◌֮◌ꚞ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER EF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A69F 0062;00E0 05AE A69F 0315 0062;0061 05AE 0300 A69F 0315 0062;00E0 05AE A69F 0315 0062;0061 05AE 0300 A69F 0315 0062; # (a◌̕◌̀◌֮◌ꚟb; à◌֮◌ꚟ◌̕b; a◌֮◌̀◌ꚟ◌̕b; à◌֮◌ꚟ◌̕b; a◌֮◌̀◌ꚟ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER IOTIFIED E, LATIN SMALL LETTER B +0061 A69F 0315 0300 05AE 0062;0061 05AE A69F 0300 0315 0062;0061 05AE A69F 0300 0315 0062;0061 05AE A69F 0300 0315 0062;0061 05AE A69F 0300 0315 0062; # (a◌ꚟ◌̕◌̀◌֮b; a◌֮◌ꚟ◌̀◌̕b; a◌֮◌ꚟ◌̀◌̕b; a◌֮◌ꚟ◌̀◌̕b; a◌֮◌ꚟ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER IOTIFIED E, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A6F0 0062;00E0 05AE A6F0 0315 0062;0061 05AE 0300 A6F0 0315 0062;00E0 05AE A6F0 0315 0062;0061 05AE 0300 A6F0 0315 0062; # (a◌̕◌̀◌֮◌꛰b; à◌֮◌꛰◌̕b; a◌֮◌̀◌꛰◌̕b; à◌֮◌꛰◌̕b; a◌֮◌̀◌꛰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BAMUM COMBINING MARK KOQNDON, LATIN SMALL LETTER B +0061 A6F0 0315 0300 05AE 0062;0061 05AE A6F0 0300 0315 0062;0061 05AE A6F0 0300 0315 0062;0061 05AE A6F0 0300 0315 0062;0061 05AE A6F0 0300 0315 0062; # (a◌꛰◌̕◌̀◌֮b; a◌֮◌꛰◌̀◌̕b; a◌֮◌꛰◌̀◌̕b; a◌֮◌꛰◌̀◌̕b; a◌֮◌꛰◌̀◌̕b; ) LATIN SMALL LETTER A, BAMUM COMBINING MARK KOQNDON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A6F1 0062;00E0 05AE A6F1 0315 0062;0061 05AE 0300 A6F1 0315 0062;00E0 05AE A6F1 0315 0062;0061 05AE 0300 A6F1 0315 0062; # (a◌̕◌̀◌֮◌꛱b; à◌֮◌꛱◌̕b; a◌֮◌̀◌꛱◌̕b; à◌֮◌꛱◌̕b; a◌֮◌̀◌꛱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BAMUM COMBINING MARK TUKWENTIS, LATIN SMALL LETTER B +0061 A6F1 0315 0300 05AE 0062;0061 05AE A6F1 0300 0315 0062;0061 05AE A6F1 0300 0315 0062;0061 05AE A6F1 0300 0315 0062;0061 05AE A6F1 0300 0315 0062; # (a◌꛱◌̕◌̀◌֮b; a◌֮◌꛱◌̀◌̕b; a◌֮◌꛱◌̀◌̕b; a◌֮◌꛱◌̀◌̕b; a◌֮◌꛱◌̀◌̕b; ) LATIN SMALL LETTER A, BAMUM COMBINING MARK TUKWENTIS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 A806 0062;0061 3099 094D A806 05B0 0062;0061 3099 094D A806 05B0 0062;0061 3099 094D A806 05B0 0062;0061 3099 094D A806 05B0 0062; # (a◌ְ◌्◌゙◌꠆b; a◌゙◌्◌꠆◌ְb; a◌゙◌्◌꠆◌ְb; a◌゙◌्◌꠆◌ְb; a◌゙◌्◌꠆◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SYLOTI NAGRI SIGN HASANTA, LATIN SMALL LETTER B +0061 A806 05B0 094D 3099 0062;0061 3099 A806 094D 05B0 0062;0061 3099 A806 094D 05B0 0062;0061 3099 A806 094D 05B0 0062;0061 3099 A806 094D 05B0 0062; # (a◌꠆◌ְ◌्◌゙b; a◌゙◌꠆◌्◌ְb; a◌゙◌꠆◌्◌ְb; a◌゙◌꠆◌्◌ְb; a◌゙◌꠆◌्◌ְb; ) LATIN SMALL LETTER A, SYLOTI NAGRI SIGN HASANTA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 A82C 0062;0061 3099 094D A82C 05B0 0062;0061 3099 094D A82C 05B0 0062;0061 3099 094D A82C 05B0 0062;0061 3099 094D A82C 05B0 0062; # (a◌ְ◌्◌゙◌꠬b; a◌゙◌्◌꠬◌ְb; a◌゙◌्◌꠬◌ְb; a◌゙◌्◌꠬◌ְb; a◌゙◌्◌꠬◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SYLOTI NAGRI SIGN ALTERNATE HASANTA, LATIN SMALL LETTER B +0061 A82C 05B0 094D 3099 0062;0061 3099 A82C 094D 05B0 0062;0061 3099 A82C 094D 05B0 0062;0061 3099 A82C 094D 05B0 0062;0061 3099 A82C 094D 05B0 0062; # (a◌꠬◌ְ◌्◌゙b; a◌゙◌꠬◌्◌ְb; a◌゙◌꠬◌्◌ְb; a◌゙◌꠬◌्◌ְb; a◌゙◌꠬◌्◌ְb; ) LATIN SMALL LETTER A, SYLOTI NAGRI SIGN ALTERNATE HASANTA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 A8C4 0062;0061 3099 094D A8C4 05B0 0062;0061 3099 094D A8C4 05B0 0062;0061 3099 094D A8C4 05B0 0062;0061 3099 094D A8C4 05B0 0062; # (a◌ְ◌्◌゙◌꣄b; a◌゙◌्◌꣄◌ְb; a◌゙◌्◌꣄◌ְb; a◌゙◌्◌꣄◌ְb; a◌゙◌्◌꣄◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SAURASHTRA SIGN VIRAMA, LATIN SMALL LETTER B +0061 A8C4 05B0 094D 3099 0062;0061 3099 A8C4 094D 05B0 0062;0061 3099 A8C4 094D 05B0 0062;0061 3099 A8C4 094D 05B0 0062;0061 3099 A8C4 094D 05B0 0062; # (a◌꣄◌ְ◌्◌゙b; a◌゙◌꣄◌्◌ְb; a◌゙◌꣄◌्◌ְb; a◌゙◌꣄◌्◌ְb; a◌゙◌꣄◌्◌ְb; ) LATIN SMALL LETTER A, SAURASHTRA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE A8E0 0062;00E0 05AE A8E0 0315 0062;0061 05AE 0300 A8E0 0315 0062;00E0 05AE A8E0 0315 0062;0061 05AE 0300 A8E0 0315 0062; # (a◌̕◌̀◌֮◌꣠b; à◌֮◌꣠◌̕b; a◌֮◌̀◌꣠◌̕b; à◌֮◌꣠◌̕b; a◌֮◌̀◌꣠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI DIGIT ZERO, LATIN SMALL LETTER B +0061 A8E0 0315 0300 05AE 0062;0061 05AE A8E0 0300 0315 0062;0061 05AE A8E0 0300 0315 0062;0061 05AE A8E0 0300 0315 0062;0061 05AE A8E0 0300 0315 0062; # (a◌꣠◌̕◌̀◌֮b; a◌֮◌꣠◌̀◌̕b; a◌֮◌꣠◌̀◌̕b; a◌֮◌꣠◌̀◌̕b; a◌֮◌꣠◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI DIGIT ZERO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8E1 0062;00E0 05AE A8E1 0315 0062;0061 05AE 0300 A8E1 0315 0062;00E0 05AE A8E1 0315 0062;0061 05AE 0300 A8E1 0315 0062; # (a◌̕◌̀◌֮◌꣡b; à◌֮◌꣡◌̕b; a◌֮◌̀◌꣡◌̕b; à◌֮◌꣡◌̕b; a◌֮◌̀◌꣡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI DIGIT ONE, LATIN SMALL LETTER B +0061 A8E1 0315 0300 05AE 0062;0061 05AE A8E1 0300 0315 0062;0061 05AE A8E1 0300 0315 0062;0061 05AE A8E1 0300 0315 0062;0061 05AE A8E1 0300 0315 0062; # (a◌꣡◌̕◌̀◌֮b; a◌֮◌꣡◌̀◌̕b; a◌֮◌꣡◌̀◌̕b; a◌֮◌꣡◌̀◌̕b; a◌֮◌꣡◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI DIGIT ONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8E2 0062;00E0 05AE A8E2 0315 0062;0061 05AE 0300 A8E2 0315 0062;00E0 05AE A8E2 0315 0062;0061 05AE 0300 A8E2 0315 0062; # (a◌̕◌̀◌֮◌꣢b; à◌֮◌꣢◌̕b; a◌֮◌̀◌꣢◌̕b; à◌֮◌꣢◌̕b; a◌֮◌̀◌꣢◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI DIGIT TWO, LATIN SMALL LETTER B +0061 A8E2 0315 0300 05AE 0062;0061 05AE A8E2 0300 0315 0062;0061 05AE A8E2 0300 0315 0062;0061 05AE A8E2 0300 0315 0062;0061 05AE A8E2 0300 0315 0062; # (a◌꣢◌̕◌̀◌֮b; a◌֮◌꣢◌̀◌̕b; a◌֮◌꣢◌̀◌̕b; a◌֮◌꣢◌̀◌̕b; a◌֮◌꣢◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI DIGIT TWO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8E3 0062;00E0 05AE A8E3 0315 0062;0061 05AE 0300 A8E3 0315 0062;00E0 05AE A8E3 0315 0062;0061 05AE 0300 A8E3 0315 0062; # (a◌̕◌̀◌֮◌꣣b; à◌֮◌꣣◌̕b; a◌֮◌̀◌꣣◌̕b; à◌֮◌꣣◌̕b; a◌֮◌̀◌꣣◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI DIGIT THREE, LATIN SMALL LETTER B +0061 A8E3 0315 0300 05AE 0062;0061 05AE A8E3 0300 0315 0062;0061 05AE A8E3 0300 0315 0062;0061 05AE A8E3 0300 0315 0062;0061 05AE A8E3 0300 0315 0062; # (a◌꣣◌̕◌̀◌֮b; a◌֮◌꣣◌̀◌̕b; a◌֮◌꣣◌̀◌̕b; a◌֮◌꣣◌̀◌̕b; a◌֮◌꣣◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI DIGIT THREE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8E4 0062;00E0 05AE A8E4 0315 0062;0061 05AE 0300 A8E4 0315 0062;00E0 05AE A8E4 0315 0062;0061 05AE 0300 A8E4 0315 0062; # (a◌̕◌̀◌֮◌꣤b; à◌֮◌꣤◌̕b; a◌֮◌̀◌꣤◌̕b; à◌֮◌꣤◌̕b; a◌֮◌̀◌꣤◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI DIGIT FOUR, LATIN SMALL LETTER B +0061 A8E4 0315 0300 05AE 0062;0061 05AE A8E4 0300 0315 0062;0061 05AE A8E4 0300 0315 0062;0061 05AE A8E4 0300 0315 0062;0061 05AE A8E4 0300 0315 0062; # (a◌꣤◌̕◌̀◌֮b; a◌֮◌꣤◌̀◌̕b; a◌֮◌꣤◌̀◌̕b; a◌֮◌꣤◌̀◌̕b; a◌֮◌꣤◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI DIGIT FOUR, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8E5 0062;00E0 05AE A8E5 0315 0062;0061 05AE 0300 A8E5 0315 0062;00E0 05AE A8E5 0315 0062;0061 05AE 0300 A8E5 0315 0062; # (a◌̕◌̀◌֮◌꣥b; à◌֮◌꣥◌̕b; a◌֮◌̀◌꣥◌̕b; à◌֮◌꣥◌̕b; a◌֮◌̀◌꣥◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI DIGIT FIVE, LATIN SMALL LETTER B +0061 A8E5 0315 0300 05AE 0062;0061 05AE A8E5 0300 0315 0062;0061 05AE A8E5 0300 0315 0062;0061 05AE A8E5 0300 0315 0062;0061 05AE A8E5 0300 0315 0062; # (a◌꣥◌̕◌̀◌֮b; a◌֮◌꣥◌̀◌̕b; a◌֮◌꣥◌̀◌̕b; a◌֮◌꣥◌̀◌̕b; a◌֮◌꣥◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI DIGIT FIVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8E6 0062;00E0 05AE A8E6 0315 0062;0061 05AE 0300 A8E6 0315 0062;00E0 05AE A8E6 0315 0062;0061 05AE 0300 A8E6 0315 0062; # (a◌̕◌̀◌֮◌꣦b; à◌֮◌꣦◌̕b; a◌֮◌̀◌꣦◌̕b; à◌֮◌꣦◌̕b; a◌֮◌̀◌꣦◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI DIGIT SIX, LATIN SMALL LETTER B +0061 A8E6 0315 0300 05AE 0062;0061 05AE A8E6 0300 0315 0062;0061 05AE A8E6 0300 0315 0062;0061 05AE A8E6 0300 0315 0062;0061 05AE A8E6 0300 0315 0062; # (a◌꣦◌̕◌̀◌֮b; a◌֮◌꣦◌̀◌̕b; a◌֮◌꣦◌̀◌̕b; a◌֮◌꣦◌̀◌̕b; a◌֮◌꣦◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI DIGIT SIX, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8E7 0062;00E0 05AE A8E7 0315 0062;0061 05AE 0300 A8E7 0315 0062;00E0 05AE A8E7 0315 0062;0061 05AE 0300 A8E7 0315 0062; # (a◌̕◌̀◌֮◌꣧b; à◌֮◌꣧◌̕b; a◌֮◌̀◌꣧◌̕b; à◌֮◌꣧◌̕b; a◌֮◌̀◌꣧◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI DIGIT SEVEN, LATIN SMALL LETTER B +0061 A8E7 0315 0300 05AE 0062;0061 05AE A8E7 0300 0315 0062;0061 05AE A8E7 0300 0315 0062;0061 05AE A8E7 0300 0315 0062;0061 05AE A8E7 0300 0315 0062; # (a◌꣧◌̕◌̀◌֮b; a◌֮◌꣧◌̀◌̕b; a◌֮◌꣧◌̀◌̕b; a◌֮◌꣧◌̀◌̕b; a◌֮◌꣧◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI DIGIT SEVEN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8E8 0062;00E0 05AE A8E8 0315 0062;0061 05AE 0300 A8E8 0315 0062;00E0 05AE A8E8 0315 0062;0061 05AE 0300 A8E8 0315 0062; # (a◌̕◌̀◌֮◌꣨b; à◌֮◌꣨◌̕b; a◌֮◌̀◌꣨◌̕b; à◌֮◌꣨◌̕b; a◌֮◌̀◌꣨◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI DIGIT EIGHT, LATIN SMALL LETTER B +0061 A8E8 0315 0300 05AE 0062;0061 05AE A8E8 0300 0315 0062;0061 05AE A8E8 0300 0315 0062;0061 05AE A8E8 0300 0315 0062;0061 05AE A8E8 0300 0315 0062; # (a◌꣨◌̕◌̀◌֮b; a◌֮◌꣨◌̀◌̕b; a◌֮◌꣨◌̀◌̕b; a◌֮◌꣨◌̀◌̕b; a◌֮◌꣨◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI DIGIT EIGHT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8E9 0062;00E0 05AE A8E9 0315 0062;0061 05AE 0300 A8E9 0315 0062;00E0 05AE A8E9 0315 0062;0061 05AE 0300 A8E9 0315 0062; # (a◌̕◌̀◌֮◌꣩b; à◌֮◌꣩◌̕b; a◌֮◌̀◌꣩◌̕b; à◌֮◌꣩◌̕b; a◌֮◌̀◌꣩◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI DIGIT NINE, LATIN SMALL LETTER B +0061 A8E9 0315 0300 05AE 0062;0061 05AE A8E9 0300 0315 0062;0061 05AE A8E9 0300 0315 0062;0061 05AE A8E9 0300 0315 0062;0061 05AE A8E9 0300 0315 0062; # (a◌꣩◌̕◌̀◌֮b; a◌֮◌꣩◌̀◌̕b; a◌֮◌꣩◌̀◌̕b; a◌֮◌꣩◌̀◌̕b; a◌֮◌꣩◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI DIGIT NINE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8EA 0062;00E0 05AE A8EA 0315 0062;0061 05AE 0300 A8EA 0315 0062;00E0 05AE A8EA 0315 0062;0061 05AE 0300 A8EA 0315 0062; # (a◌̕◌̀◌֮◌꣪b; à◌֮◌꣪◌̕b; a◌֮◌̀◌꣪◌̕b; à◌֮◌꣪◌̕b; a◌֮◌̀◌꣪◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI LETTER A, LATIN SMALL LETTER B +0061 A8EA 0315 0300 05AE 0062;0061 05AE A8EA 0300 0315 0062;0061 05AE A8EA 0300 0315 0062;0061 05AE A8EA 0300 0315 0062;0061 05AE A8EA 0300 0315 0062; # (a◌꣪◌̕◌̀◌֮b; a◌֮◌꣪◌̀◌̕b; a◌֮◌꣪◌̀◌̕b; a◌֮◌꣪◌̀◌̕b; a◌֮◌꣪◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8EB 0062;00E0 05AE A8EB 0315 0062;0061 05AE 0300 A8EB 0315 0062;00E0 05AE A8EB 0315 0062;0061 05AE 0300 A8EB 0315 0062; # (a◌̕◌̀◌֮◌꣫b; à◌֮◌꣫◌̕b; a◌֮◌̀◌꣫◌̕b; à◌֮◌꣫◌̕b; a◌֮◌̀◌꣫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI LETTER U, LATIN SMALL LETTER B +0061 A8EB 0315 0300 05AE 0062;0061 05AE A8EB 0300 0315 0062;0061 05AE A8EB 0300 0315 0062;0061 05AE A8EB 0300 0315 0062;0061 05AE A8EB 0300 0315 0062; # (a◌꣫◌̕◌̀◌֮b; a◌֮◌꣫◌̀◌̕b; a◌֮◌꣫◌̀◌̕b; a◌֮◌꣫◌̀◌̕b; a◌֮◌꣫◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI LETTER U, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8EC 0062;00E0 05AE A8EC 0315 0062;0061 05AE 0300 A8EC 0315 0062;00E0 05AE A8EC 0315 0062;0061 05AE 0300 A8EC 0315 0062; # (a◌̕◌̀◌֮◌꣬b; à◌֮◌꣬◌̕b; a◌֮◌̀◌꣬◌̕b; à◌֮◌꣬◌̕b; a◌֮◌̀◌꣬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI LETTER KA, LATIN SMALL LETTER B +0061 A8EC 0315 0300 05AE 0062;0061 05AE A8EC 0300 0315 0062;0061 05AE A8EC 0300 0315 0062;0061 05AE A8EC 0300 0315 0062;0061 05AE A8EC 0300 0315 0062; # (a◌꣬◌̕◌̀◌֮b; a◌֮◌꣬◌̀◌̕b; a◌֮◌꣬◌̀◌̕b; a◌֮◌꣬◌̀◌̕b; a◌֮◌꣬◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI LETTER KA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8ED 0062;00E0 05AE A8ED 0315 0062;0061 05AE 0300 A8ED 0315 0062;00E0 05AE A8ED 0315 0062;0061 05AE 0300 A8ED 0315 0062; # (a◌̕◌̀◌֮◌꣭b; à◌֮◌꣭◌̕b; a◌֮◌̀◌꣭◌̕b; à◌֮◌꣭◌̕b; a◌֮◌̀◌꣭◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI LETTER NA, LATIN SMALL LETTER B +0061 A8ED 0315 0300 05AE 0062;0061 05AE A8ED 0300 0315 0062;0061 05AE A8ED 0300 0315 0062;0061 05AE A8ED 0300 0315 0062;0061 05AE A8ED 0300 0315 0062; # (a◌꣭◌̕◌̀◌֮b; a◌֮◌꣭◌̀◌̕b; a◌֮◌꣭◌̀◌̕b; a◌֮◌꣭◌̀◌̕b; a◌֮◌꣭◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI LETTER NA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8EE 0062;00E0 05AE A8EE 0315 0062;0061 05AE 0300 A8EE 0315 0062;00E0 05AE A8EE 0315 0062;0061 05AE 0300 A8EE 0315 0062; # (a◌̕◌̀◌֮◌꣮b; à◌֮◌꣮◌̕b; a◌֮◌̀◌꣮◌̕b; à◌֮◌꣮◌̕b; a◌֮◌̀◌꣮◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI LETTER PA, LATIN SMALL LETTER B +0061 A8EE 0315 0300 05AE 0062;0061 05AE A8EE 0300 0315 0062;0061 05AE A8EE 0300 0315 0062;0061 05AE A8EE 0300 0315 0062;0061 05AE A8EE 0300 0315 0062; # (a◌꣮◌̕◌̀◌֮b; a◌֮◌꣮◌̀◌̕b; a◌֮◌꣮◌̀◌̕b; a◌֮◌꣮◌̀◌̕b; a◌֮◌꣮◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI LETTER PA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8EF 0062;00E0 05AE A8EF 0315 0062;0061 05AE 0300 A8EF 0315 0062;00E0 05AE A8EF 0315 0062;0061 05AE 0300 A8EF 0315 0062; # (a◌̕◌̀◌֮◌꣯b; à◌֮◌꣯◌̕b; a◌֮◌̀◌꣯◌̕b; à◌֮◌꣯◌̕b; a◌֮◌̀◌꣯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI LETTER RA, LATIN SMALL LETTER B +0061 A8EF 0315 0300 05AE 0062;0061 05AE A8EF 0300 0315 0062;0061 05AE A8EF 0300 0315 0062;0061 05AE A8EF 0300 0315 0062;0061 05AE A8EF 0300 0315 0062; # (a◌꣯◌̕◌̀◌֮b; a◌֮◌꣯◌̀◌̕b; a◌֮◌꣯◌̀◌̕b; a◌֮◌꣯◌̀◌̕b; a◌֮◌꣯◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI LETTER RA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8F0 0062;00E0 05AE A8F0 0315 0062;0061 05AE 0300 A8F0 0315 0062;00E0 05AE A8F0 0315 0062;0061 05AE 0300 A8F0 0315 0062; # (a◌̕◌̀◌֮◌꣰b; à◌֮◌꣰◌̕b; a◌֮◌̀◌꣰◌̕b; à◌֮◌꣰◌̕b; a◌֮◌̀◌꣰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI LETTER VI, LATIN SMALL LETTER B +0061 A8F0 0315 0300 05AE 0062;0061 05AE A8F0 0300 0315 0062;0061 05AE A8F0 0300 0315 0062;0061 05AE A8F0 0300 0315 0062;0061 05AE A8F0 0300 0315 0062; # (a◌꣰◌̕◌̀◌֮b; a◌֮◌꣰◌̀◌̕b; a◌֮◌꣰◌̀◌̕b; a◌֮◌꣰◌̀◌̕b; a◌֮◌꣰◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI LETTER VI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE A8F1 0062;00E0 05AE A8F1 0315 0062;0061 05AE 0300 A8F1 0315 0062;00E0 05AE A8F1 0315 0062;0061 05AE 0300 A8F1 0315 0062; # (a◌̕◌̀◌֮◌꣱b; à◌֮◌꣱◌̕b; a◌֮◌̀◌꣱◌̕b; à◌֮◌꣱◌̕b; a◌֮◌̀◌꣱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI SIGN AVAGRAHA, LATIN SMALL LETTER B +0061 A8F1 0315 0300 05AE 0062;0061 05AE A8F1 0300 0315 0062;0061 05AE A8F1 0300 0315 0062;0061 05AE A8F1 0300 0315 0062;0061 05AE A8F1 0300 0315 0062; # (a◌꣱◌̕◌̀◌֮b; a◌֮◌꣱◌̀◌̕b; a◌֮◌꣱◌̀◌̕b; a◌֮◌꣱◌̀◌̕b; a◌֮◌꣱◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI SIGN AVAGRAHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA A92B 0062;0061 1DFA 0316 A92B 059A 0062;0061 1DFA 0316 A92B 059A 0062;0061 1DFA 0316 A92B 059A 0062;0061 1DFA 0316 A92B 059A 0062; # (a◌֚◌̖◌᷺◌꤫b; a◌᷺◌̖◌꤫◌֚b; a◌᷺◌̖◌꤫◌֚b; a◌᷺◌̖◌꤫◌֚b; a◌᷺◌̖◌꤫◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, KAYAH LI TONE PLOPHU, LATIN SMALL LETTER B +0061 A92B 059A 0316 1DFA 0062;0061 1DFA A92B 0316 059A 0062;0061 1DFA A92B 0316 059A 0062;0061 1DFA A92B 0316 059A 0062;0061 1DFA A92B 0316 059A 0062; # (a◌꤫◌֚◌̖◌᷺b; a◌᷺◌꤫◌̖◌֚b; a◌᷺◌꤫◌̖◌֚b; a◌᷺◌꤫◌̖◌֚b; a◌᷺◌꤫◌̖◌֚b; ) LATIN SMALL LETTER A, KAYAH LI TONE PLOPHU, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA A92C 0062;0061 1DFA 0316 A92C 059A 0062;0061 1DFA 0316 A92C 059A 0062;0061 1DFA 0316 A92C 059A 0062;0061 1DFA 0316 A92C 059A 0062; # (a◌֚◌̖◌᷺◌꤬b; a◌᷺◌̖◌꤬◌֚b; a◌᷺◌̖◌꤬◌֚b; a◌᷺◌̖◌꤬◌֚b; a◌᷺◌̖◌꤬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, KAYAH LI TONE CALYA, LATIN SMALL LETTER B +0061 A92C 059A 0316 1DFA 0062;0061 1DFA A92C 0316 059A 0062;0061 1DFA A92C 0316 059A 0062;0061 1DFA A92C 0316 059A 0062;0061 1DFA A92C 0316 059A 0062; # (a◌꤬◌֚◌̖◌᷺b; a◌᷺◌꤬◌̖◌֚b; a◌᷺◌꤬◌̖◌֚b; a◌᷺◌꤬◌̖◌֚b; a◌᷺◌꤬◌̖◌֚b; ) LATIN SMALL LETTER A, KAYAH LI TONE CALYA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA A92D 0062;0061 1DFA 0316 A92D 059A 0062;0061 1DFA 0316 A92D 059A 0062;0061 1DFA 0316 A92D 059A 0062;0061 1DFA 0316 A92D 059A 0062; # (a◌֚◌̖◌᷺◌꤭b; a◌᷺◌̖◌꤭◌֚b; a◌᷺◌̖◌꤭◌֚b; a◌᷺◌̖◌꤭◌֚b; a◌᷺◌̖◌꤭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, KAYAH LI TONE CALYA PLOPHU, LATIN SMALL LETTER B +0061 A92D 059A 0316 1DFA 0062;0061 1DFA A92D 0316 059A 0062;0061 1DFA A92D 0316 059A 0062;0061 1DFA A92D 0316 059A 0062;0061 1DFA A92D 0316 059A 0062; # (a◌꤭◌֚◌̖◌᷺b; a◌᷺◌꤭◌̖◌֚b; a◌᷺◌꤭◌̖◌֚b; a◌᷺◌꤭◌̖◌֚b; a◌᷺◌꤭◌̖◌֚b; ) LATIN SMALL LETTER A, KAYAH LI TONE CALYA PLOPHU, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 05B0 094D 3099 A953 0062;0061 3099 094D A953 05B0 0062;0061 3099 094D A953 05B0 0062;0061 3099 094D A953 05B0 0062;0061 3099 094D A953 05B0 0062; # (a◌ְ◌्◌゙꥓b; a◌゙◌्꥓◌ְb; a◌゙◌्꥓◌ְb; a◌゙◌्꥓◌ְb; a◌゙◌्꥓◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, REJANG VIRAMA, LATIN SMALL LETTER B +0061 A953 05B0 094D 3099 0062;0061 3099 A953 094D 05B0 0062;0061 3099 A953 094D 05B0 0062;0061 3099 A953 094D 05B0 0062;0061 3099 A953 094D 05B0 0062; # (a꥓◌ְ◌्◌゙b; a◌゙꥓◌्◌ְb; a◌゙꥓◌्◌ְb; a◌゙꥓◌्◌ְb; a◌゙꥓◌्◌ְb; ) LATIN SMALL LETTER A, REJANG VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 A9B3 0062;0061 16FF0 093C A9B3 3099 0062;0061 16FF0 093C A9B3 3099 0062;0061 16FF0 093C A9B3 3099 0062;0061 16FF0 093C A9B3 3099 0062; # (a◌゙◌𖿰़◌꦳b; a𖿰◌़◌꦳◌゙b; a𖿰◌़◌꦳◌゙b; a𖿰◌़◌꦳◌゙b; a𖿰◌़◌꦳◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, JAVANESE SIGN CECAK TELU, LATIN SMALL LETTER B +0061 A9B3 3099 093C 16FF0 0062;0061 16FF0 A9B3 093C 3099 0062;0061 16FF0 A9B3 093C 3099 0062;0061 16FF0 A9B3 093C 3099 0062;0061 16FF0 A9B3 093C 3099 0062; # (a◌꦳◌゙◌𖿰़b; a𖿰◌꦳◌़◌゙b; a𖿰◌꦳◌़◌゙b; a𖿰◌꦳◌़◌゙b; a𖿰◌꦳◌़◌゙b; ) LATIN SMALL LETTER A, JAVANESE SIGN CECAK TELU, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 A9C0 0062;0061 3099 094D A9C0 05B0 0062;0061 3099 094D A9C0 05B0 0062;0061 3099 094D A9C0 05B0 0062;0061 3099 094D A9C0 05B0 0062; # (a◌ְ◌्◌゙꧀b; a◌゙◌्꧀◌ְb; a◌゙◌्꧀◌ְb; a◌゙◌्꧀◌ְb; a◌゙◌्꧀◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, JAVANESE PANGKON, LATIN SMALL LETTER B +0061 A9C0 05B0 094D 3099 0062;0061 3099 A9C0 094D 05B0 0062;0061 3099 A9C0 094D 05B0 0062;0061 3099 A9C0 094D 05B0 0062;0061 3099 A9C0 094D 05B0 0062; # (a꧀◌ְ◌्◌゙b; a◌゙꧀◌्◌ְb; a◌゙꧀◌्◌ְb; a◌゙꧀◌्◌ְb; a◌゙꧀◌्◌ְb; ) LATIN SMALL LETTER A, JAVANESE PANGKON, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE AAB0 0062;00E0 05AE AAB0 0315 0062;0061 05AE 0300 AAB0 0315 0062;00E0 05AE AAB0 0315 0062;0061 05AE 0300 AAB0 0315 0062; # (a◌̕◌̀◌֮◌ꪰb; à◌֮◌ꪰ◌̕b; a◌֮◌̀◌ꪰ◌̕b; à◌֮◌ꪰ◌̕b; a◌֮◌̀◌ꪰ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET MAI KANG, LATIN SMALL LETTER B +0061 AAB0 0315 0300 05AE 0062;0061 05AE AAB0 0300 0315 0062;0061 05AE AAB0 0300 0315 0062;0061 05AE AAB0 0300 0315 0062;0061 05AE AAB0 0300 0315 0062; # (a◌ꪰ◌̕◌̀◌֮b; a◌֮◌ꪰ◌̀◌̕b; a◌֮◌ꪰ◌̀◌̕b; a◌֮◌ꪰ◌̀◌̕b; a◌֮◌ꪰ◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET MAI KANG, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE AAB2 0062;00E0 05AE AAB2 0315 0062;0061 05AE 0300 AAB2 0315 0062;00E0 05AE AAB2 0315 0062;0061 05AE 0300 AAB2 0315 0062; # (a◌̕◌̀◌֮◌ꪲb; à◌֮◌ꪲ◌̕b; a◌֮◌̀◌ꪲ◌̕b; à◌֮◌ꪲ◌̕b; a◌֮◌̀◌ꪲ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET VOWEL I, LATIN SMALL LETTER B +0061 AAB2 0315 0300 05AE 0062;0061 05AE AAB2 0300 0315 0062;0061 05AE AAB2 0300 0315 0062;0061 05AE AAB2 0300 0315 0062;0061 05AE AAB2 0300 0315 0062; # (a◌ꪲ◌̕◌̀◌֮b; a◌֮◌ꪲ◌̀◌̕b; a◌֮◌ꪲ◌̀◌̕b; a◌֮◌ꪲ◌̀◌̕b; a◌֮◌ꪲ◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET VOWEL I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE AAB3 0062;00E0 05AE AAB3 0315 0062;0061 05AE 0300 AAB3 0315 0062;00E0 05AE AAB3 0315 0062;0061 05AE 0300 AAB3 0315 0062; # (a◌̕◌̀◌֮◌ꪳb; à◌֮◌ꪳ◌̕b; a◌֮◌̀◌ꪳ◌̕b; à◌֮◌ꪳ◌̕b; a◌֮◌̀◌ꪳ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET VOWEL UE, LATIN SMALL LETTER B +0061 AAB3 0315 0300 05AE 0062;0061 05AE AAB3 0300 0315 0062;0061 05AE AAB3 0300 0315 0062;0061 05AE AAB3 0300 0315 0062;0061 05AE AAB3 0300 0315 0062; # (a◌ꪳ◌̕◌̀◌֮b; a◌֮◌ꪳ◌̀◌̕b; a◌֮◌ꪳ◌̀◌̕b; a◌֮◌ꪳ◌̀◌̕b; a◌֮◌ꪳ◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET VOWEL UE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA AAB4 0062;0061 1DFA 0316 AAB4 059A 0062;0061 1DFA 0316 AAB4 059A 0062;0061 1DFA 0316 AAB4 059A 0062;0061 1DFA 0316 AAB4 059A 0062; # (a◌֚◌̖◌᷺◌ꪴb; a◌᷺◌̖◌ꪴ◌֚b; a◌᷺◌̖◌ꪴ◌֚b; a◌᷺◌̖◌ꪴ◌֚b; a◌᷺◌̖◌ꪴ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TAI VIET VOWEL U, LATIN SMALL LETTER B +0061 AAB4 059A 0316 1DFA 0062;0061 1DFA AAB4 0316 059A 0062;0061 1DFA AAB4 0316 059A 0062;0061 1DFA AAB4 0316 059A 0062;0061 1DFA AAB4 0316 059A 0062; # (a◌ꪴ◌֚◌̖◌᷺b; a◌᷺◌ꪴ◌̖◌֚b; a◌᷺◌ꪴ◌̖◌֚b; a◌᷺◌ꪴ◌̖◌֚b; a◌᷺◌ꪴ◌̖◌֚b; ) LATIN SMALL LETTER A, TAI VIET VOWEL U, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE AAB7 0062;00E0 05AE AAB7 0315 0062;0061 05AE 0300 AAB7 0315 0062;00E0 05AE AAB7 0315 0062;0061 05AE 0300 AAB7 0315 0062; # (a◌̕◌̀◌֮◌ꪷb; à◌֮◌ꪷ◌̕b; a◌֮◌̀◌ꪷ◌̕b; à◌֮◌ꪷ◌̕b; a◌֮◌̀◌ꪷ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET MAI KHIT, LATIN SMALL LETTER B +0061 AAB7 0315 0300 05AE 0062;0061 05AE AAB7 0300 0315 0062;0061 05AE AAB7 0300 0315 0062;0061 05AE AAB7 0300 0315 0062;0061 05AE AAB7 0300 0315 0062; # (a◌ꪷ◌̕◌̀◌֮b; a◌֮◌ꪷ◌̀◌̕b; a◌֮◌ꪷ◌̀◌̕b; a◌֮◌ꪷ◌̀◌̕b; a◌֮◌ꪷ◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET MAI KHIT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE AAB8 0062;00E0 05AE AAB8 0315 0062;0061 05AE 0300 AAB8 0315 0062;00E0 05AE AAB8 0315 0062;0061 05AE 0300 AAB8 0315 0062; # (a◌̕◌̀◌֮◌ꪸb; à◌֮◌ꪸ◌̕b; a◌֮◌̀◌ꪸ◌̕b; à◌֮◌ꪸ◌̕b; a◌֮◌̀◌ꪸ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET VOWEL IA, LATIN SMALL LETTER B +0061 AAB8 0315 0300 05AE 0062;0061 05AE AAB8 0300 0315 0062;0061 05AE AAB8 0300 0315 0062;0061 05AE AAB8 0300 0315 0062;0061 05AE AAB8 0300 0315 0062; # (a◌ꪸ◌̕◌̀◌֮b; a◌֮◌ꪸ◌̀◌̕b; a◌֮◌ꪸ◌̀◌̕b; a◌֮◌ꪸ◌̀◌̕b; a◌֮◌ꪸ◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET VOWEL IA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE AABE 0062;00E0 05AE AABE 0315 0062;0061 05AE 0300 AABE 0315 0062;00E0 05AE AABE 0315 0062;0061 05AE 0300 AABE 0315 0062; # (a◌̕◌̀◌֮◌ꪾb; à◌֮◌ꪾ◌̕b; a◌֮◌̀◌ꪾ◌̕b; à◌֮◌ꪾ◌̕b; a◌֮◌̀◌ꪾ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET VOWEL AM, LATIN SMALL LETTER B +0061 AABE 0315 0300 05AE 0062;0061 05AE AABE 0300 0315 0062;0061 05AE AABE 0300 0315 0062;0061 05AE AABE 0300 0315 0062;0061 05AE AABE 0300 0315 0062; # (a◌ꪾ◌̕◌̀◌֮b; a◌֮◌ꪾ◌̀◌̕b; a◌֮◌ꪾ◌̀◌̕b; a◌֮◌ꪾ◌̀◌̕b; a◌֮◌ꪾ◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET VOWEL AM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE AABF 0062;00E0 05AE AABF 0315 0062;0061 05AE 0300 AABF 0315 0062;00E0 05AE AABF 0315 0062;0061 05AE 0300 AABF 0315 0062; # (a◌̕◌̀◌֮◌꪿b; à◌֮◌꪿◌̕b; a◌֮◌̀◌꪿◌̕b; à◌֮◌꪿◌̕b; a◌֮◌̀◌꪿◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET TONE MAI EK, LATIN SMALL LETTER B +0061 AABF 0315 0300 05AE 0062;0061 05AE AABF 0300 0315 0062;0061 05AE AABF 0300 0315 0062;0061 05AE AABF 0300 0315 0062;0061 05AE AABF 0300 0315 0062; # (a◌꪿◌̕◌̀◌֮b; a◌֮◌꪿◌̀◌̕b; a◌֮◌꪿◌̀◌̕b; a◌֮◌꪿◌̀◌̕b; a◌֮◌꪿◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET TONE MAI EK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE AAC1 0062;00E0 05AE AAC1 0315 0062;0061 05AE 0300 AAC1 0315 0062;00E0 05AE AAC1 0315 0062;0061 05AE 0300 AAC1 0315 0062; # (a◌̕◌̀◌֮◌꫁b; à◌֮◌꫁◌̕b; a◌֮◌̀◌꫁◌̕b; à◌֮◌꫁◌̕b; a◌֮◌̀◌꫁◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET TONE MAI THO, LATIN SMALL LETTER B +0061 AAC1 0315 0300 05AE 0062;0061 05AE AAC1 0300 0315 0062;0061 05AE AAC1 0300 0315 0062;0061 05AE AAC1 0300 0315 0062;0061 05AE AAC1 0300 0315 0062; # (a◌꫁◌̕◌̀◌֮b; a◌֮◌꫁◌̀◌̕b; a◌֮◌꫁◌̀◌̕b; a◌֮◌꫁◌̀◌̕b; a◌֮◌꫁◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET TONE MAI THO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 AAF6 0062;0061 3099 094D AAF6 05B0 0062;0061 3099 094D AAF6 05B0 0062;0061 3099 094D AAF6 05B0 0062;0061 3099 094D AAF6 05B0 0062; # (a◌ְ◌्◌゙◌꫶b; a◌゙◌्◌꫶◌ְb; a◌゙◌्◌꫶◌ְb; a◌゙◌्◌꫶◌ְb; a◌゙◌्◌꫶◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MEETEI MAYEK VIRAMA, LATIN SMALL LETTER B +0061 AAF6 05B0 094D 3099 0062;0061 3099 AAF6 094D 05B0 0062;0061 3099 AAF6 094D 05B0 0062;0061 3099 AAF6 094D 05B0 0062;0061 3099 AAF6 094D 05B0 0062; # (a◌꫶◌ְ◌्◌゙b; a◌゙◌꫶◌्◌ְb; a◌゙◌꫶◌्◌ְb; a◌゙◌꫶◌्◌ְb; a◌゙◌꫶◌्◌ְb; ) LATIN SMALL LETTER A, MEETEI MAYEK VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 ABED 0062;0061 3099 094D ABED 05B0 0062;0061 3099 094D ABED 05B0 0062;0061 3099 094D ABED 05B0 0062;0061 3099 094D ABED 05B0 0062; # (a◌ְ◌्◌゙◌꯭b; a◌゙◌्◌꯭◌ְb; a◌゙◌्◌꯭◌ְb; a◌゙◌्◌꯭◌ְb; a◌゙◌्◌꯭◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MEETEI MAYEK APUN IYEK, LATIN SMALL LETTER B +0061 ABED 05B0 094D 3099 0062;0061 3099 ABED 094D 05B0 0062;0061 3099 ABED 094D 05B0 0062;0061 3099 ABED 094D 05B0 0062;0061 3099 ABED 094D 05B0 0062; # (a◌꯭◌ְ◌्◌゙b; a◌゙◌꯭◌्◌ְb; a◌゙◌꯭◌्◌ְb; a◌゙◌꯭◌्◌ְb; a◌゙◌꯭◌्◌ְb; ) LATIN SMALL LETTER A, MEETEI MAYEK APUN IYEK, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 064B FB1E 05C2 FB1E 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062; # (a◌ً◌ﬞ◌ׂ◌ﬞb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; ) LATIN SMALL LETTER A, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, HEBREW POINT SIN DOT, HEBREW POINT JUDEO-SPANISH VARIKA, LATIN SMALL LETTER B +0061 FB1E 064B FB1E 05C2 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062;0061 05C2 FB1E FB1E 064B 0062; # (a◌ﬞ◌ً◌ﬞ◌ׂb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; a◌ׂ◌ﬞ◌ﬞ◌ًb; ) LATIN SMALL LETTER A, HEBREW POINT JUDEO-SPANISH VARIKA, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, HEBREW POINT SIN DOT, LATIN SMALL LETTER B +0061 0315 0300 05AE FE20 0062;00E0 05AE FE20 0315 0062;0061 05AE 0300 FE20 0315 0062;00E0 05AE FE20 0315 0062;0061 05AE 0300 FE20 0315 0062; # (a◌̕◌̀◌֮◌︠b; à◌֮◌︠◌̕b; a◌֮◌̀◌︠◌̕b; à◌֮◌︠◌̕b; a◌֮◌̀◌︠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LIGATURE LEFT HALF, LATIN SMALL LETTER B +0061 FE20 0315 0300 05AE 0062;0061 05AE FE20 0300 0315 0062;0061 05AE FE20 0300 0315 0062;0061 05AE FE20 0300 0315 0062;0061 05AE FE20 0300 0315 0062; # (a◌︠◌̕◌̀◌֮b; a◌֮◌︠◌̀◌̕b; a◌֮◌︠◌̀◌̕b; a◌֮◌︠◌̀◌̕b; a◌֮◌︠◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LIGATURE LEFT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE21 0062;00E0 05AE FE21 0315 0062;0061 05AE 0300 FE21 0315 0062;00E0 05AE FE21 0315 0062;0061 05AE 0300 FE21 0315 0062; # (a◌̕◌̀◌֮◌︡b; à◌֮◌︡◌̕b; a◌֮◌̀◌︡◌̕b; à◌֮◌︡◌̕b; a◌֮◌̀◌︡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LIGATURE RIGHT HALF, LATIN SMALL LETTER B +0061 FE21 0315 0300 05AE 0062;0061 05AE FE21 0300 0315 0062;0061 05AE FE21 0300 0315 0062;0061 05AE FE21 0300 0315 0062;0061 05AE FE21 0300 0315 0062; # (a◌︡◌̕◌̀◌֮b; a◌֮◌︡◌̀◌̕b; a◌֮◌︡◌̀◌̕b; a◌֮◌︡◌̀◌̕b; a◌֮◌︡◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LIGATURE RIGHT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE22 0062;00E0 05AE FE22 0315 0062;0061 05AE 0300 FE22 0315 0062;00E0 05AE FE22 0315 0062;0061 05AE 0300 FE22 0315 0062; # (a◌̕◌̀◌֮◌︢b; à◌֮◌︢◌̕b; a◌֮◌̀◌︢◌̕b; à◌֮◌︢◌̕b; a◌֮◌̀◌︢◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE TILDE LEFT HALF, LATIN SMALL LETTER B +0061 FE22 0315 0300 05AE 0062;0061 05AE FE22 0300 0315 0062;0061 05AE FE22 0300 0315 0062;0061 05AE FE22 0300 0315 0062;0061 05AE FE22 0300 0315 0062; # (a◌︢◌̕◌̀◌֮b; a◌֮◌︢◌̀◌̕b; a◌֮◌︢◌̀◌̕b; a◌֮◌︢◌̀◌̕b; a◌֮◌︢◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE TILDE LEFT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE23 0062;00E0 05AE FE23 0315 0062;0061 05AE 0300 FE23 0315 0062;00E0 05AE FE23 0315 0062;0061 05AE 0300 FE23 0315 0062; # (a◌̕◌̀◌֮◌︣b; à◌֮◌︣◌̕b; a◌֮◌̀◌︣◌̕b; à◌֮◌︣◌̕b; a◌֮◌̀◌︣◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE TILDE RIGHT HALF, LATIN SMALL LETTER B +0061 FE23 0315 0300 05AE 0062;0061 05AE FE23 0300 0315 0062;0061 05AE FE23 0300 0315 0062;0061 05AE FE23 0300 0315 0062;0061 05AE FE23 0300 0315 0062; # (a◌︣◌̕◌̀◌֮b; a◌֮◌︣◌̀◌̕b; a◌֮◌︣◌̀◌̕b; a◌֮◌︣◌̀◌̕b; a◌֮◌︣◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE TILDE RIGHT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE24 0062;00E0 05AE FE24 0315 0062;0061 05AE 0300 FE24 0315 0062;00E0 05AE FE24 0315 0062;0061 05AE 0300 FE24 0315 0062; # (a◌̕◌̀◌֮◌︤b; à◌֮◌︤◌̕b; a◌֮◌̀◌︤◌̕b; à◌֮◌︤◌̕b; a◌֮◌̀◌︤◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING MACRON LEFT HALF, LATIN SMALL LETTER B +0061 FE24 0315 0300 05AE 0062;0061 05AE FE24 0300 0315 0062;0061 05AE FE24 0300 0315 0062;0061 05AE FE24 0300 0315 0062;0061 05AE FE24 0300 0315 0062; # (a◌︤◌̕◌̀◌֮b; a◌֮◌︤◌̀◌̕b; a◌֮◌︤◌̀◌̕b; a◌֮◌︤◌̀◌̕b; a◌֮◌︤◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING MACRON LEFT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE25 0062;00E0 05AE FE25 0315 0062;0061 05AE 0300 FE25 0315 0062;00E0 05AE FE25 0315 0062;0061 05AE 0300 FE25 0315 0062; # (a◌̕◌̀◌֮◌︥b; à◌֮◌︥◌̕b; a◌֮◌̀◌︥◌̕b; à◌֮◌︥◌̕b; a◌֮◌̀◌︥◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING MACRON RIGHT HALF, LATIN SMALL LETTER B +0061 FE25 0315 0300 05AE 0062;0061 05AE FE25 0300 0315 0062;0061 05AE FE25 0300 0315 0062;0061 05AE FE25 0300 0315 0062;0061 05AE FE25 0300 0315 0062; # (a◌︥◌̕◌̀◌֮b; a◌֮◌︥◌̀◌̕b; a◌֮◌︥◌̀◌̕b; a◌֮◌︥◌̀◌̕b; a◌֮◌︥◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING MACRON RIGHT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE26 0062;00E0 05AE FE26 0315 0062;0061 05AE 0300 FE26 0315 0062;00E0 05AE FE26 0315 0062;0061 05AE 0300 FE26 0315 0062; # (a◌̕◌̀◌֮◌︦b; à◌֮◌︦◌̕b; a◌֮◌̀◌︦◌̕b; à◌֮◌︦◌̕b; a◌֮◌̀◌︦◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CONJOINING MACRON, LATIN SMALL LETTER B +0061 FE26 0315 0300 05AE 0062;0061 05AE FE26 0300 0315 0062;0061 05AE FE26 0300 0315 0062;0061 05AE FE26 0300 0315 0062;0061 05AE FE26 0300 0315 0062; # (a◌︦◌̕◌̀◌֮b; a◌֮◌︦◌̀◌̕b; a◌֮◌︦◌̀◌̕b; a◌֮◌︦◌̀◌̕b; a◌֮◌︦◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CONJOINING MACRON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA FE27 0062;0061 1DFA 0316 FE27 059A 0062;0061 1DFA 0316 FE27 059A 0062;0061 1DFA 0316 FE27 059A 0062;0061 1DFA 0316 FE27 059A 0062; # (a◌֚◌̖◌᷺◌︧b; a◌᷺◌̖◌︧◌֚b; a◌᷺◌̖◌︧◌֚b; a◌᷺◌̖◌︧◌֚b; a◌᷺◌̖◌︧◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LIGATURE LEFT HALF BELOW, LATIN SMALL LETTER B +0061 FE27 059A 0316 1DFA 0062;0061 1DFA FE27 0316 059A 0062;0061 1DFA FE27 0316 059A 0062;0061 1DFA FE27 0316 059A 0062;0061 1DFA FE27 0316 059A 0062; # (a◌︧◌֚◌̖◌᷺b; a◌᷺◌︧◌̖◌֚b; a◌᷺◌︧◌̖◌֚b; a◌᷺◌︧◌̖◌֚b; a◌᷺◌︧◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LIGATURE LEFT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA FE28 0062;0061 1DFA 0316 FE28 059A 0062;0061 1DFA 0316 FE28 059A 0062;0061 1DFA 0316 FE28 059A 0062;0061 1DFA 0316 FE28 059A 0062; # (a◌֚◌̖◌᷺◌︨b; a◌᷺◌̖◌︨◌֚b; a◌᷺◌̖◌︨◌֚b; a◌᷺◌̖◌︨◌֚b; a◌᷺◌̖◌︨◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LIGATURE RIGHT HALF BELOW, LATIN SMALL LETTER B +0061 FE28 059A 0316 1DFA 0062;0061 1DFA FE28 0316 059A 0062;0061 1DFA FE28 0316 059A 0062;0061 1DFA FE28 0316 059A 0062;0061 1DFA FE28 0316 059A 0062; # (a◌︨◌֚◌̖◌᷺b; a◌᷺◌︨◌̖◌֚b; a◌᷺◌︨◌̖◌֚b; a◌᷺◌︨◌̖◌֚b; a◌᷺◌︨◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LIGATURE RIGHT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA FE29 0062;0061 1DFA 0316 FE29 059A 0062;0061 1DFA 0316 FE29 059A 0062;0061 1DFA 0316 FE29 059A 0062;0061 1DFA 0316 FE29 059A 0062; # (a◌֚◌̖◌᷺◌︩b; a◌᷺◌̖◌︩◌֚b; a◌᷺◌̖◌︩◌֚b; a◌᷺◌̖◌︩◌֚b; a◌᷺◌̖◌︩◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING TILDE LEFT HALF BELOW, LATIN SMALL LETTER B +0061 FE29 059A 0316 1DFA 0062;0061 1DFA FE29 0316 059A 0062;0061 1DFA FE29 0316 059A 0062;0061 1DFA FE29 0316 059A 0062;0061 1DFA FE29 0316 059A 0062; # (a◌︩◌֚◌̖◌᷺b; a◌᷺◌︩◌̖◌֚b; a◌᷺◌︩◌̖◌֚b; a◌᷺◌︩◌̖◌֚b; a◌᷺◌︩◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TILDE LEFT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA FE2A 0062;0061 1DFA 0316 FE2A 059A 0062;0061 1DFA 0316 FE2A 059A 0062;0061 1DFA 0316 FE2A 059A 0062;0061 1DFA 0316 FE2A 059A 0062; # (a◌֚◌̖◌᷺◌︪b; a◌᷺◌̖◌︪◌֚b; a◌᷺◌̖◌︪◌֚b; a◌᷺◌̖◌︪◌֚b; a◌᷺◌̖◌︪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING TILDE RIGHT HALF BELOW, LATIN SMALL LETTER B +0061 FE2A 059A 0316 1DFA 0062;0061 1DFA FE2A 0316 059A 0062;0061 1DFA FE2A 0316 059A 0062;0061 1DFA FE2A 0316 059A 0062;0061 1DFA FE2A 0316 059A 0062; # (a◌︪◌֚◌̖◌᷺b; a◌᷺◌︪◌̖◌֚b; a◌᷺◌︪◌̖◌֚b; a◌᷺◌︪◌̖◌֚b; a◌᷺◌︪◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TILDE RIGHT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA FE2B 0062;0061 1DFA 0316 FE2B 059A 0062;0061 1DFA 0316 FE2B 059A 0062;0061 1DFA 0316 FE2B 059A 0062;0061 1DFA 0316 FE2B 059A 0062; # (a◌֚◌̖◌᷺◌︫b; a◌᷺◌̖◌︫◌֚b; a◌᷺◌̖◌︫◌֚b; a◌᷺◌̖◌︫◌֚b; a◌᷺◌̖◌︫◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING MACRON LEFT HALF BELOW, LATIN SMALL LETTER B +0061 FE2B 059A 0316 1DFA 0062;0061 1DFA FE2B 0316 059A 0062;0061 1DFA FE2B 0316 059A 0062;0061 1DFA FE2B 0316 059A 0062;0061 1DFA FE2B 0316 059A 0062; # (a◌︫◌֚◌̖◌᷺b; a◌᷺◌︫◌̖◌֚b; a◌᷺◌︫◌̖◌֚b; a◌᷺◌︫◌̖◌֚b; a◌᷺◌︫◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON LEFT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA FE2C 0062;0061 1DFA 0316 FE2C 059A 0062;0061 1DFA 0316 FE2C 059A 0062;0061 1DFA 0316 FE2C 059A 0062;0061 1DFA 0316 FE2C 059A 0062; # (a◌֚◌̖◌᷺◌︬b; a◌᷺◌̖◌︬◌֚b; a◌᷺◌̖◌︬◌֚b; a◌᷺◌̖◌︬◌֚b; a◌᷺◌̖◌︬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING MACRON RIGHT HALF BELOW, LATIN SMALL LETTER B +0061 FE2C 059A 0316 1DFA 0062;0061 1DFA FE2C 0316 059A 0062;0061 1DFA FE2C 0316 059A 0062;0061 1DFA FE2C 0316 059A 0062;0061 1DFA FE2C 0316 059A 0062; # (a◌︬◌֚◌̖◌᷺b; a◌᷺◌︬◌̖◌֚b; a◌᷺◌︬◌̖◌֚b; a◌᷺◌︬◌̖◌֚b; a◌᷺◌︬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON RIGHT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA FE2D 0062;0061 1DFA 0316 FE2D 059A 0062;0061 1DFA 0316 FE2D 059A 0062;0061 1DFA 0316 FE2D 059A 0062;0061 1DFA 0316 FE2D 059A 0062; # (a◌֚◌̖◌᷺◌︭b; a◌᷺◌̖◌︭◌֚b; a◌᷺◌̖◌︭◌֚b; a◌᷺◌̖◌︭◌֚b; a◌᷺◌̖◌︭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING CONJOINING MACRON BELOW, LATIN SMALL LETTER B +0061 FE2D 059A 0316 1DFA 0062;0061 1DFA FE2D 0316 059A 0062;0061 1DFA FE2D 0316 059A 0062;0061 1DFA FE2D 0316 059A 0062;0061 1DFA FE2D 0316 059A 0062; # (a◌︭◌֚◌̖◌᷺b; a◌᷺◌︭◌̖◌֚b; a◌᷺◌︭◌̖◌֚b; a◌᷺◌︭◌̖◌֚b; a◌᷺◌︭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CONJOINING MACRON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE FE2E 0062;00E0 05AE FE2E 0315 0062;0061 05AE 0300 FE2E 0315 0062;00E0 05AE FE2E 0315 0062;0061 05AE 0300 FE2E 0315 0062; # (a◌̕◌̀◌֮◌︮b; à◌֮◌︮◌̕b; a◌֮◌̀◌︮◌̕b; à◌֮◌︮◌̕b; a◌֮◌̀◌︮◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC TITLO LEFT HALF, LATIN SMALL LETTER B +0061 FE2E 0315 0300 05AE 0062;0061 05AE FE2E 0300 0315 0062;0061 05AE FE2E 0300 0315 0062;0061 05AE FE2E 0300 0315 0062;0061 05AE FE2E 0300 0315 0062; # (a◌︮◌̕◌̀◌֮b; a◌֮◌︮◌̀◌̕b; a◌֮◌︮◌̀◌̕b; a◌֮◌︮◌̀◌̕b; a◌֮◌︮◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC TITLO LEFT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE FE2F 0062;00E0 05AE FE2F 0315 0062;0061 05AE 0300 FE2F 0315 0062;00E0 05AE FE2F 0315 0062;0061 05AE 0300 FE2F 0315 0062; # (a◌̕◌̀◌֮◌︯b; à◌֮◌︯◌̕b; a◌֮◌̀◌︯◌̕b; à◌֮◌︯◌̕b; a◌֮◌̀◌︯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC TITLO RIGHT HALF, LATIN SMALL LETTER B +0061 FE2F 0315 0300 05AE 0062;0061 05AE FE2F 0300 0315 0062;0061 05AE FE2F 0300 0315 0062;0061 05AE FE2F 0300 0315 0062;0061 05AE FE2F 0300 0315 0062; # (a◌︯◌̕◌̀◌֮b; a◌֮◌︯◌̀◌̕b; a◌֮◌︯◌̀◌̕b; a◌֮◌︯◌̀◌̕b; a◌֮◌︯◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC TITLO RIGHT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 101FD 0062;0061 1DFA 0316 101FD 059A 0062;0061 1DFA 0316 101FD 059A 0062;0061 1DFA 0316 101FD 059A 0062;0061 1DFA 0316 101FD 059A 0062; # (a◌֚◌̖◌᷺◌𐇽b; a◌᷺◌̖◌𐇽◌֚b; a◌᷺◌̖◌𐇽◌֚b; a◌᷺◌̖◌𐇽◌֚b; a◌᷺◌̖◌𐇽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, LATIN SMALL LETTER B +0061 101FD 059A 0316 1DFA 0062;0061 1DFA 101FD 0316 059A 0062;0061 1DFA 101FD 0316 059A 0062;0061 1DFA 101FD 0316 059A 0062;0061 1DFA 101FD 0316 059A 0062; # (a◌𐇽◌֚◌̖◌᷺b; a◌᷺◌𐇽◌̖◌֚b; a◌᷺◌𐇽◌̖◌֚b; a◌᷺◌𐇽◌̖◌֚b; a◌᷺◌𐇽◌̖◌֚b; ) LATIN SMALL LETTER A, PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 102E0 0062;0061 1DFA 0316 102E0 059A 0062;0061 1DFA 0316 102E0 059A 0062;0061 1DFA 0316 102E0 059A 0062;0061 1DFA 0316 102E0 059A 0062; # (a◌֚◌̖◌᷺◌𐋠b; a◌᷺◌̖◌𐋠◌֚b; a◌᷺◌̖◌𐋠◌֚b; a◌᷺◌̖◌𐋠◌֚b; a◌᷺◌̖◌𐋠◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COPTIC EPACT THOUSANDS MARK, LATIN SMALL LETTER B +0061 102E0 059A 0316 1DFA 0062;0061 1DFA 102E0 0316 059A 0062;0061 1DFA 102E0 0316 059A 0062;0061 1DFA 102E0 0316 059A 0062;0061 1DFA 102E0 0316 059A 0062; # (a◌𐋠◌֚◌̖◌᷺b; a◌᷺◌𐋠◌̖◌֚b; a◌᷺◌𐋠◌̖◌֚b; a◌᷺◌𐋠◌̖◌֚b; a◌᷺◌𐋠◌̖◌֚b; ) LATIN SMALL LETTER A, COPTIC EPACT THOUSANDS MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 10376 0062;00E0 05AE 10376 0315 0062;0061 05AE 0300 10376 0315 0062;00E0 05AE 10376 0315 0062;0061 05AE 0300 10376 0315 0062; # (a◌̕◌̀◌֮◌𐍶b; à◌֮◌𐍶◌̕b; a◌֮◌̀◌𐍶◌̕b; à◌֮◌𐍶◌̕b; a◌֮◌̀◌𐍶◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING OLD PERMIC LETTER AN, LATIN SMALL LETTER B +0061 10376 0315 0300 05AE 0062;0061 05AE 10376 0300 0315 0062;0061 05AE 10376 0300 0315 0062;0061 05AE 10376 0300 0315 0062;0061 05AE 10376 0300 0315 0062; # (a◌𐍶◌̕◌̀◌֮b; a◌֮◌𐍶◌̀◌̕b; a◌֮◌𐍶◌̀◌̕b; a◌֮◌𐍶◌̀◌̕b; a◌֮◌𐍶◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING OLD PERMIC LETTER AN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10377 0062;00E0 05AE 10377 0315 0062;0061 05AE 0300 10377 0315 0062;00E0 05AE 10377 0315 0062;0061 05AE 0300 10377 0315 0062; # (a◌̕◌̀◌֮◌𐍷b; à◌֮◌𐍷◌̕b; a◌֮◌̀◌𐍷◌̕b; à◌֮◌𐍷◌̕b; a◌֮◌̀◌𐍷◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING OLD PERMIC LETTER DOI, LATIN SMALL LETTER B +0061 10377 0315 0300 05AE 0062;0061 05AE 10377 0300 0315 0062;0061 05AE 10377 0300 0315 0062;0061 05AE 10377 0300 0315 0062;0061 05AE 10377 0300 0315 0062; # (a◌𐍷◌̕◌̀◌֮b; a◌֮◌𐍷◌̀◌̕b; a◌֮◌𐍷◌̀◌̕b; a◌֮◌𐍷◌̀◌̕b; a◌֮◌𐍷◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING OLD PERMIC LETTER DOI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10378 0062;00E0 05AE 10378 0315 0062;0061 05AE 0300 10378 0315 0062;00E0 05AE 10378 0315 0062;0061 05AE 0300 10378 0315 0062; # (a◌̕◌̀◌֮◌𐍸b; à◌֮◌𐍸◌̕b; a◌֮◌̀◌𐍸◌̕b; à◌֮◌𐍸◌̕b; a◌֮◌̀◌𐍸◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING OLD PERMIC LETTER ZATA, LATIN SMALL LETTER B +0061 10378 0315 0300 05AE 0062;0061 05AE 10378 0300 0315 0062;0061 05AE 10378 0300 0315 0062;0061 05AE 10378 0300 0315 0062;0061 05AE 10378 0300 0315 0062; # (a◌𐍸◌̕◌̀◌֮b; a◌֮◌𐍸◌̀◌̕b; a◌֮◌𐍸◌̀◌̕b; a◌֮◌𐍸◌̀◌̕b; a◌֮◌𐍸◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING OLD PERMIC LETTER ZATA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10379 0062;00E0 05AE 10379 0315 0062;0061 05AE 0300 10379 0315 0062;00E0 05AE 10379 0315 0062;0061 05AE 0300 10379 0315 0062; # (a◌̕◌̀◌֮◌𐍹b; à◌֮◌𐍹◌̕b; a◌֮◌̀◌𐍹◌̕b; à◌֮◌𐍹◌̕b; a◌֮◌̀◌𐍹◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING OLD PERMIC LETTER NENOE, LATIN SMALL LETTER B +0061 10379 0315 0300 05AE 0062;0061 05AE 10379 0300 0315 0062;0061 05AE 10379 0300 0315 0062;0061 05AE 10379 0300 0315 0062;0061 05AE 10379 0300 0315 0062; # (a◌𐍹◌̕◌̀◌֮b; a◌֮◌𐍹◌̀◌̕b; a◌֮◌𐍹◌̀◌̕b; a◌֮◌𐍹◌̀◌̕b; a◌֮◌𐍹◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING OLD PERMIC LETTER NENOE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1037A 0062;00E0 05AE 1037A 0315 0062;0061 05AE 0300 1037A 0315 0062;00E0 05AE 1037A 0315 0062;0061 05AE 0300 1037A 0315 0062; # (a◌̕◌̀◌֮◌𐍺b; à◌֮◌𐍺◌̕b; a◌֮◌̀◌𐍺◌̕b; à◌֮◌𐍺◌̕b; a◌֮◌̀◌𐍺◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING OLD PERMIC LETTER SII, LATIN SMALL LETTER B +0061 1037A 0315 0300 05AE 0062;0061 05AE 1037A 0300 0315 0062;0061 05AE 1037A 0300 0315 0062;0061 05AE 1037A 0300 0315 0062;0061 05AE 1037A 0300 0315 0062; # (a◌𐍺◌̕◌̀◌֮b; a◌֮◌𐍺◌̀◌̕b; a◌֮◌𐍺◌̀◌̕b; a◌֮◌𐍺◌̀◌̕b; a◌֮◌𐍺◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING OLD PERMIC LETTER SII, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10A0D 0062;0061 1DFA 0316 10A0D 059A 0062;0061 1DFA 0316 10A0D 059A 0062;0061 1DFA 0316 10A0D 059A 0062;0061 1DFA 0316 10A0D 059A 0062; # (a◌֚◌̖◌᷺◌𐨍b; a◌᷺◌̖◌𐨍◌֚b; a◌᷺◌̖◌𐨍◌֚b; a◌᷺◌̖◌𐨍◌֚b; a◌᷺◌̖◌𐨍◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, KHAROSHTHI SIGN DOUBLE RING BELOW, LATIN SMALL LETTER B +0061 10A0D 059A 0316 1DFA 0062;0061 1DFA 10A0D 0316 059A 0062;0061 1DFA 10A0D 0316 059A 0062;0061 1DFA 10A0D 0316 059A 0062;0061 1DFA 10A0D 0316 059A 0062; # (a◌𐨍◌֚◌̖◌᷺b; a◌᷺◌𐨍◌̖◌֚b; a◌᷺◌𐨍◌̖◌֚b; a◌᷺◌𐨍◌̖◌֚b; a◌᷺◌𐨍◌̖◌֚b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN DOUBLE RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 10A0F 0062;00E0 05AE 10A0F 0315 0062;0061 05AE 0300 10A0F 0315 0062;00E0 05AE 10A0F 0315 0062;0061 05AE 0300 10A0F 0315 0062; # (a◌̕◌̀◌֮◌𐨏b; à◌֮◌𐨏◌̕b; a◌֮◌̀◌𐨏◌̕b; à◌֮◌𐨏◌̕b; a◌֮◌̀◌𐨏◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, KHAROSHTHI SIGN VISARGA, LATIN SMALL LETTER B +0061 10A0F 0315 0300 05AE 0062;0061 05AE 10A0F 0300 0315 0062;0061 05AE 10A0F 0300 0315 0062;0061 05AE 10A0F 0300 0315 0062;0061 05AE 10A0F 0300 0315 0062; # (a◌𐨏◌̕◌̀◌֮b; a◌֮◌𐨏◌̀◌̕b; a◌֮◌𐨏◌̀◌̕b; a◌֮◌𐨏◌̀◌̕b; a◌֮◌𐨏◌̀◌̕b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN VISARGA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10A38 0062;00E0 05AE 10A38 0315 0062;0061 05AE 0300 10A38 0315 0062;00E0 05AE 10A38 0315 0062;0061 05AE 0300 10A38 0315 0062; # (a◌̕◌̀◌֮◌𐨸b; à◌֮◌𐨸◌̕b; a◌֮◌̀◌𐨸◌̕b; à◌֮◌𐨸◌̕b; a◌֮◌̀◌𐨸◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, KHAROSHTHI SIGN BAR ABOVE, LATIN SMALL LETTER B +0061 10A38 0315 0300 05AE 0062;0061 05AE 10A38 0300 0315 0062;0061 05AE 10A38 0300 0315 0062;0061 05AE 10A38 0300 0315 0062;0061 05AE 10A38 0300 0315 0062; # (a◌𐨸◌̕◌̀◌֮b; a◌֮◌𐨸◌̀◌̕b; a◌֮◌𐨸◌̀◌̕b; a◌֮◌𐨸◌̀◌̕b; a◌֮◌𐨸◌̀◌̕b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN BAR ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 16FF0 0334 10A39 0062;0061 0334 10A39 16FF0 0062;0061 0334 10A39 16FF0 0062;0061 0334 10A39 16FF0 0062;0061 0334 10A39 16FF0 0062; # (a𖿰◌̴◌𐨹b; a◌̴◌𐨹𖿰b; a◌̴◌𐨹𖿰b; a◌̴◌𐨹𖿰b; a◌̴◌𐨹𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, KHAROSHTHI SIGN CAUDA, LATIN SMALL LETTER B +0061 10A39 16FF0 0334 0062;0061 10A39 0334 16FF0 0062;0061 10A39 0334 16FF0 0062;0061 10A39 0334 16FF0 0062;0061 10A39 0334 16FF0 0062; # (a◌𐨹𖿰◌̴b; a◌𐨹◌̴𖿰b; a◌𐨹◌̴𖿰b; a◌𐨹◌̴𖿰b; a◌𐨹◌̴𖿰b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN CAUDA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10A3A 0062;0061 1DFA 0316 10A3A 059A 0062;0061 1DFA 0316 10A3A 059A 0062;0061 1DFA 0316 10A3A 059A 0062;0061 1DFA 0316 10A3A 059A 0062; # (a◌֚◌̖◌᷺◌𐨺b; a◌᷺◌̖◌𐨺◌֚b; a◌᷺◌̖◌𐨺◌֚b; a◌᷺◌̖◌𐨺◌֚b; a◌᷺◌̖◌𐨺◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, KHAROSHTHI SIGN DOT BELOW, LATIN SMALL LETTER B +0061 10A3A 059A 0316 1DFA 0062;0061 1DFA 10A3A 0316 059A 0062;0061 1DFA 10A3A 0316 059A 0062;0061 1DFA 10A3A 0316 059A 0062;0061 1DFA 10A3A 0316 059A 0062; # (a◌𐨺◌֚◌̖◌᷺b; a◌᷺◌𐨺◌̖◌֚b; a◌᷺◌𐨺◌̖◌֚b; a◌᷺◌𐨺◌̖◌֚b; a◌᷺◌𐨺◌̖◌֚b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 05B0 094D 3099 10A3F 0062;0061 3099 094D 10A3F 05B0 0062;0061 3099 094D 10A3F 05B0 0062;0061 3099 094D 10A3F 05B0 0062;0061 3099 094D 10A3F 05B0 0062; # (a◌ְ◌्◌゙◌𐨿b; a◌゙◌्◌𐨿◌ְb; a◌゙◌्◌𐨿◌ְb; a◌゙◌्◌𐨿◌ְb; a◌゙◌्◌𐨿◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KHAROSHTHI VIRAMA, LATIN SMALL LETTER B +0061 10A3F 05B0 094D 3099 0062;0061 3099 10A3F 094D 05B0 0062;0061 3099 10A3F 094D 05B0 0062;0061 3099 10A3F 094D 05B0 0062;0061 3099 10A3F 094D 05B0 0062; # (a◌𐨿◌ְ◌्◌゙b; a◌゙◌𐨿◌्◌ְb; a◌゙◌𐨿◌्◌ְb; a◌゙◌𐨿◌्◌ְb; a◌゙◌𐨿◌्◌ְb; ) LATIN SMALL LETTER A, KHAROSHTHI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 10AE5 0062;00E0 05AE 10AE5 0315 0062;0061 05AE 0300 10AE5 0315 0062;00E0 05AE 10AE5 0315 0062;0061 05AE 0300 10AE5 0315 0062; # (a◌̕◌̀◌֮◌𐫥b; à◌֮◌𐫥◌̕b; a◌֮◌̀◌𐫥◌̕b; à◌֮◌𐫥◌̕b; a◌֮◌̀◌𐫥◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MANICHAEAN ABBREVIATION MARK ABOVE, LATIN SMALL LETTER B +0061 10AE5 0315 0300 05AE 0062;0061 05AE 10AE5 0300 0315 0062;0061 05AE 10AE5 0300 0315 0062;0061 05AE 10AE5 0300 0315 0062;0061 05AE 10AE5 0300 0315 0062; # (a◌𐫥◌̕◌̀◌֮b; a◌֮◌𐫥◌̀◌̕b; a◌֮◌𐫥◌̀◌̕b; a◌֮◌𐫥◌̀◌̕b; a◌֮◌𐫥◌̀◌̕b; ) LATIN SMALL LETTER A, MANICHAEAN ABBREVIATION MARK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10AE6 0062;0061 1DFA 0316 10AE6 059A 0062;0061 1DFA 0316 10AE6 059A 0062;0061 1DFA 0316 10AE6 059A 0062;0061 1DFA 0316 10AE6 059A 0062; # (a◌֚◌̖◌᷺◌𐫦b; a◌᷺◌̖◌𐫦◌֚b; a◌᷺◌̖◌𐫦◌֚b; a◌᷺◌̖◌𐫦◌֚b; a◌᷺◌̖◌𐫦◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MANICHAEAN ABBREVIATION MARK BELOW, LATIN SMALL LETTER B +0061 10AE6 059A 0316 1DFA 0062;0061 1DFA 10AE6 0316 059A 0062;0061 1DFA 10AE6 0316 059A 0062;0061 1DFA 10AE6 0316 059A 0062;0061 1DFA 10AE6 0316 059A 0062; # (a◌𐫦◌֚◌̖◌᷺b; a◌᷺◌𐫦◌̖◌֚b; a◌᷺◌𐫦◌̖◌֚b; a◌᷺◌𐫦◌̖◌֚b; a◌᷺◌𐫦◌̖◌֚b; ) LATIN SMALL LETTER A, MANICHAEAN ABBREVIATION MARK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 10D24 0062;00E0 05AE 10D24 0315 0062;0061 05AE 0300 10D24 0315 0062;00E0 05AE 10D24 0315 0062;0061 05AE 0300 10D24 0315 0062; # (a◌̕◌̀◌֮◌𐴤b; à◌֮◌𐴤◌̕b; a◌֮◌̀◌𐴤◌̕b; à◌֮◌𐴤◌̕b; a◌֮◌̀◌𐴤◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HANIFI ROHINGYA SIGN HARBAHAY, LATIN SMALL LETTER B +0061 10D24 0315 0300 05AE 0062;0061 05AE 10D24 0300 0315 0062;0061 05AE 10D24 0300 0315 0062;0061 05AE 10D24 0300 0315 0062;0061 05AE 10D24 0300 0315 0062; # (a◌𐴤◌̕◌̀◌֮b; a◌֮◌𐴤◌̀◌̕b; a◌֮◌𐴤◌̀◌̕b; a◌֮◌𐴤◌̀◌̕b; a◌֮◌𐴤◌̀◌̕b; ) LATIN SMALL LETTER A, HANIFI ROHINGYA SIGN HARBAHAY, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10D25 0062;00E0 05AE 10D25 0315 0062;0061 05AE 0300 10D25 0315 0062;00E0 05AE 10D25 0315 0062;0061 05AE 0300 10D25 0315 0062; # (a◌̕◌̀◌֮◌𐴥b; à◌֮◌𐴥◌̕b; a◌֮◌̀◌𐴥◌̕b; à◌֮◌𐴥◌̕b; a◌֮◌̀◌𐴥◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HANIFI ROHINGYA SIGN TAHALA, LATIN SMALL LETTER B +0061 10D25 0315 0300 05AE 0062;0061 05AE 10D25 0300 0315 0062;0061 05AE 10D25 0300 0315 0062;0061 05AE 10D25 0300 0315 0062;0061 05AE 10D25 0300 0315 0062; # (a◌𐴥◌̕◌̀◌֮b; a◌֮◌𐴥◌̀◌̕b; a◌֮◌𐴥◌̀◌̕b; a◌֮◌𐴥◌̀◌̕b; a◌֮◌𐴥◌̀◌̕b; ) LATIN SMALL LETTER A, HANIFI ROHINGYA SIGN TAHALA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10D26 0062;00E0 05AE 10D26 0315 0062;0061 05AE 0300 10D26 0315 0062;00E0 05AE 10D26 0315 0062;0061 05AE 0300 10D26 0315 0062; # (a◌̕◌̀◌֮◌𐴦b; à◌֮◌𐴦◌̕b; a◌֮◌̀◌𐴦◌̕b; à◌֮◌𐴦◌̕b; a◌֮◌̀◌𐴦◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HANIFI ROHINGYA SIGN TANA, LATIN SMALL LETTER B +0061 10D26 0315 0300 05AE 0062;0061 05AE 10D26 0300 0315 0062;0061 05AE 10D26 0300 0315 0062;0061 05AE 10D26 0300 0315 0062;0061 05AE 10D26 0300 0315 0062; # (a◌𐴦◌̕◌̀◌֮b; a◌֮◌𐴦◌̀◌̕b; a◌֮◌𐴦◌̀◌̕b; a◌֮◌𐴦◌̀◌̕b; a◌֮◌𐴦◌̀◌̕b; ) LATIN SMALL LETTER A, HANIFI ROHINGYA SIGN TANA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10D27 0062;00E0 05AE 10D27 0315 0062;0061 05AE 0300 10D27 0315 0062;00E0 05AE 10D27 0315 0062;0061 05AE 0300 10D27 0315 0062; # (a◌̕◌̀◌֮◌𐴧b; à◌֮◌𐴧◌̕b; a◌֮◌̀◌𐴧◌̕b; à◌֮◌𐴧◌̕b; a◌֮◌̀◌𐴧◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HANIFI ROHINGYA SIGN TASSI, LATIN SMALL LETTER B +0061 10D27 0315 0300 05AE 0062;0061 05AE 10D27 0300 0315 0062;0061 05AE 10D27 0300 0315 0062;0061 05AE 10D27 0300 0315 0062;0061 05AE 10D27 0300 0315 0062; # (a◌𐴧◌̕◌̀◌֮b; a◌֮◌𐴧◌̀◌̕b; a◌֮◌𐴧◌̀◌̕b; a◌֮◌𐴧◌̀◌̕b; a◌֮◌𐴧◌̀◌̕b; ) LATIN SMALL LETTER A, HANIFI ROHINGYA SIGN TASSI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10EAB 0062;00E0 05AE 10EAB 0315 0062;0061 05AE 0300 10EAB 0315 0062;00E0 05AE 10EAB 0315 0062;0061 05AE 0300 10EAB 0315 0062; # (a◌̕◌̀◌֮◌𐺫b; à◌֮◌𐺫◌̕b; a◌֮◌̀◌𐺫◌̕b; à◌֮◌𐺫◌̕b; a◌֮◌̀◌𐺫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, YEZIDI COMBINING HAMZA MARK, LATIN SMALL LETTER B +0061 10EAB 0315 0300 05AE 0062;0061 05AE 10EAB 0300 0315 0062;0061 05AE 10EAB 0300 0315 0062;0061 05AE 10EAB 0300 0315 0062;0061 05AE 10EAB 0300 0315 0062; # (a◌𐺫◌̕◌̀◌֮b; a◌֮◌𐺫◌̀◌̕b; a◌֮◌𐺫◌̀◌̕b; a◌֮◌𐺫◌̀◌̕b; a◌֮◌𐺫◌̀◌̕b; ) LATIN SMALL LETTER A, YEZIDI COMBINING HAMZA MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10EAC 0062;00E0 05AE 10EAC 0315 0062;0061 05AE 0300 10EAC 0315 0062;00E0 05AE 10EAC 0315 0062;0061 05AE 0300 10EAC 0315 0062; # (a◌̕◌̀◌֮◌𐺬b; à◌֮◌𐺬◌̕b; a◌֮◌̀◌𐺬◌̕b; à◌֮◌𐺬◌̕b; a◌֮◌̀◌𐺬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, YEZIDI COMBINING MADDA MARK, LATIN SMALL LETTER B +0061 10EAC 0315 0300 05AE 0062;0061 05AE 10EAC 0300 0315 0062;0061 05AE 10EAC 0300 0315 0062;0061 05AE 10EAC 0300 0315 0062;0061 05AE 10EAC 0300 0315 0062; # (a◌𐺬◌̕◌̀◌֮b; a◌֮◌𐺬◌̀◌̕b; a◌֮◌𐺬◌̀◌̕b; a◌֮◌𐺬◌̀◌̕b; a◌֮◌𐺬◌̀◌̕b; ) LATIN SMALL LETTER A, YEZIDI COMBINING MADDA MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10EFD 0062;0061 1DFA 0316 10EFD 059A 0062;0061 1DFA 0316 10EFD 059A 0062;0061 1DFA 0316 10EFD 059A 0062;0061 1DFA 0316 10EFD 059A 0062; # (a◌֚◌̖◌᷺◌𐻽b; a◌᷺◌̖◌𐻽◌֚b; a◌᷺◌̖◌𐻽◌֚b; a◌᷺◌̖◌𐻽◌֚b; a◌᷺◌̖◌𐻽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD SAKTA, LATIN SMALL LETTER B +0061 10EFD 059A 0316 1DFA 0062;0061 1DFA 10EFD 0316 059A 0062;0061 1DFA 10EFD 0316 059A 0062;0061 1DFA 10EFD 0316 059A 0062;0061 1DFA 10EFD 0316 059A 0062; # (a◌𐻽◌֚◌̖◌᷺b; a◌᷺◌𐻽◌̖◌֚b; a◌᷺◌𐻽◌̖◌֚b; a◌᷺◌𐻽◌̖◌֚b; a◌᷺◌𐻽◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD SAKTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10EFE 0062;0061 1DFA 0316 10EFE 059A 0062;0061 1DFA 0316 10EFE 059A 0062;0061 1DFA 0316 10EFE 059A 0062;0061 1DFA 0316 10EFE 059A 0062; # (a◌֚◌̖◌᷺◌𐻾b; a◌᷺◌̖◌𐻾◌֚b; a◌᷺◌̖◌𐻾◌֚b; a◌᷺◌̖◌𐻾◌֚b; a◌᷺◌̖◌𐻾◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD QASR, LATIN SMALL LETTER B +0061 10EFE 059A 0316 1DFA 0062;0061 1DFA 10EFE 0316 059A 0062;0061 1DFA 10EFE 0316 059A 0062;0061 1DFA 10EFE 0316 059A 0062;0061 1DFA 10EFE 0316 059A 0062; # (a◌𐻾◌֚◌̖◌᷺b; a◌᷺◌𐻾◌̖◌֚b; a◌᷺◌𐻾◌̖◌֚b; a◌᷺◌𐻾◌̖◌֚b; a◌᷺◌𐻾◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD QASR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10EFF 0062;0061 1DFA 0316 10EFF 059A 0062;0061 1DFA 0316 10EFF 059A 0062;0061 1DFA 0316 10EFF 059A 0062;0061 1DFA 0316 10EFF 059A 0062; # (a◌֚◌̖◌᷺◌𐻿b; a◌᷺◌̖◌𐻿◌֚b; a◌᷺◌̖◌𐻿◌֚b; a◌᷺◌̖◌𐻿◌֚b; a◌᷺◌̖◌𐻿◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD MADDA, LATIN SMALL LETTER B +0061 10EFF 059A 0316 1DFA 0062;0061 1DFA 10EFF 0316 059A 0062;0061 1DFA 10EFF 0316 059A 0062;0061 1DFA 10EFF 0316 059A 0062;0061 1DFA 10EFF 0316 059A 0062; # (a◌𐻿◌֚◌̖◌᷺b; a◌᷺◌𐻿◌̖◌֚b; a◌᷺◌𐻿◌̖◌֚b; a◌᷺◌𐻿◌̖◌֚b; a◌᷺◌𐻿◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD MADDA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10F46 0062;0061 1DFA 0316 10F46 059A 0062;0061 1DFA 0316 10F46 059A 0062;0061 1DFA 0316 10F46 059A 0062;0061 1DFA 0316 10F46 059A 0062; # (a◌֚◌̖◌᷺◌𐽆b; a◌᷺◌̖◌𐽆◌֚b; a◌᷺◌̖◌𐽆◌֚b; a◌᷺◌̖◌𐽆◌֚b; a◌᷺◌̖◌𐽆◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING DOT BELOW, LATIN SMALL LETTER B +0061 10F46 059A 0316 1DFA 0062;0061 1DFA 10F46 0316 059A 0062;0061 1DFA 10F46 0316 059A 0062;0061 1DFA 10F46 0316 059A 0062;0061 1DFA 10F46 0316 059A 0062; # (a◌𐽆◌֚◌̖◌᷺b; a◌᷺◌𐽆◌̖◌֚b; a◌᷺◌𐽆◌̖◌֚b; a◌᷺◌𐽆◌̖◌֚b; a◌᷺◌𐽆◌̖◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10F47 0062;0061 1DFA 0316 10F47 059A 0062;0061 1DFA 0316 10F47 059A 0062;0061 1DFA 0316 10F47 059A 0062;0061 1DFA 0316 10F47 059A 0062; # (a◌֚◌̖◌᷺◌𐽇b; a◌᷺◌̖◌𐽇◌֚b; a◌᷺◌̖◌𐽇◌֚b; a◌᷺◌̖◌𐽇◌֚b; a◌᷺◌̖◌𐽇◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING TWO DOTS BELOW, LATIN SMALL LETTER B +0061 10F47 059A 0316 1DFA 0062;0061 1DFA 10F47 0316 059A 0062;0061 1DFA 10F47 0316 059A 0062;0061 1DFA 10F47 0316 059A 0062;0061 1DFA 10F47 0316 059A 0062; # (a◌𐽇◌֚◌̖◌᷺b; a◌᷺◌𐽇◌̖◌֚b; a◌᷺◌𐽇◌̖◌֚b; a◌᷺◌𐽇◌̖◌֚b; a◌᷺◌𐽇◌̖◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 10F48 0062;00E0 05AE 10F48 0315 0062;0061 05AE 0300 10F48 0315 0062;00E0 05AE 10F48 0315 0062;0061 05AE 0300 10F48 0315 0062; # (a◌̕◌̀◌֮◌𐽈b; à◌֮◌𐽈◌̕b; a◌֮◌̀◌𐽈◌̕b; à◌֮◌𐽈◌̕b; a◌֮◌̀◌𐽈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING DOT ABOVE, LATIN SMALL LETTER B +0061 10F48 0315 0300 05AE 0062;0061 05AE 10F48 0300 0315 0062;0061 05AE 10F48 0300 0315 0062;0061 05AE 10F48 0300 0315 0062;0061 05AE 10F48 0300 0315 0062; # (a◌𐽈◌̕◌̀◌֮b; a◌֮◌𐽈◌̀◌̕b; a◌֮◌𐽈◌̀◌̕b; a◌֮◌𐽈◌̀◌̕b; a◌֮◌𐽈◌̀◌̕b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10F49 0062;00E0 05AE 10F49 0315 0062;0061 05AE 0300 10F49 0315 0062;00E0 05AE 10F49 0315 0062;0061 05AE 0300 10F49 0315 0062; # (a◌̕◌̀◌֮◌𐽉b; à◌֮◌𐽉◌̕b; a◌֮◌̀◌𐽉◌̕b; à◌֮◌𐽉◌̕b; a◌֮◌̀◌𐽉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING TWO DOTS ABOVE, LATIN SMALL LETTER B +0061 10F49 0315 0300 05AE 0062;0061 05AE 10F49 0300 0315 0062;0061 05AE 10F49 0300 0315 0062;0061 05AE 10F49 0300 0315 0062;0061 05AE 10F49 0300 0315 0062; # (a◌𐽉◌̕◌̀◌֮b; a◌֮◌𐽉◌̀◌̕b; a◌֮◌𐽉◌̀◌̕b; a◌֮◌𐽉◌̀◌̕b; a◌֮◌𐽉◌̀◌̕b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING TWO DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 10F4A 0062;00E0 05AE 10F4A 0315 0062;0061 05AE 0300 10F4A 0315 0062;00E0 05AE 10F4A 0315 0062;0061 05AE 0300 10F4A 0315 0062; # (a◌̕◌̀◌֮◌𐽊b; à◌֮◌𐽊◌̕b; a◌֮◌̀◌𐽊◌̕b; à◌֮◌𐽊◌̕b; a◌֮◌̀◌𐽊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING CURVE ABOVE, LATIN SMALL LETTER B +0061 10F4A 0315 0300 05AE 0062;0061 05AE 10F4A 0300 0315 0062;0061 05AE 10F4A 0300 0315 0062;0061 05AE 10F4A 0300 0315 0062;0061 05AE 10F4A 0300 0315 0062; # (a◌𐽊◌̕◌̀◌֮b; a◌֮◌𐽊◌̀◌̕b; a◌֮◌𐽊◌̀◌̕b; a◌֮◌𐽊◌̀◌̕b; a◌֮◌𐽊◌̀◌̕b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING CURVE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10F4B 0062;0061 1DFA 0316 10F4B 059A 0062;0061 1DFA 0316 10F4B 059A 0062;0061 1DFA 0316 10F4B 059A 0062;0061 1DFA 0316 10F4B 059A 0062; # (a◌֚◌̖◌᷺◌𐽋b; a◌᷺◌̖◌𐽋◌֚b; a◌᷺◌̖◌𐽋◌֚b; a◌᷺◌̖◌𐽋◌֚b; a◌᷺◌̖◌𐽋◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING CURVE BELOW, LATIN SMALL LETTER B +0061 10F4B 059A 0316 1DFA 0062;0061 1DFA 10F4B 0316 059A 0062;0061 1DFA 10F4B 0316 059A 0062;0061 1DFA 10F4B 0316 059A 0062;0061 1DFA 10F4B 0316 059A 0062; # (a◌𐽋◌֚◌̖◌᷺b; a◌᷺◌𐽋◌̖◌֚b; a◌᷺◌𐽋◌̖◌֚b; a◌᷺◌𐽋◌̖◌֚b; a◌᷺◌𐽋◌̖◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING CURVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 10F4C 0062;00E0 05AE 10F4C 0315 0062;0061 05AE 0300 10F4C 0315 0062;00E0 05AE 10F4C 0315 0062;0061 05AE 0300 10F4C 0315 0062; # (a◌̕◌̀◌֮◌𐽌b; à◌֮◌𐽌◌̕b; a◌֮◌̀◌𐽌◌̕b; à◌֮◌𐽌◌̕b; a◌֮◌̀◌𐽌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING HOOK ABOVE, LATIN SMALL LETTER B +0061 10F4C 0315 0300 05AE 0062;0061 05AE 10F4C 0300 0315 0062;0061 05AE 10F4C 0300 0315 0062;0061 05AE 10F4C 0300 0315 0062;0061 05AE 10F4C 0300 0315 0062; # (a◌𐽌◌̕◌̀◌֮b; a◌֮◌𐽌◌̀◌̕b; a◌֮◌𐽌◌̀◌̕b; a◌֮◌𐽌◌̀◌̕b; a◌֮◌𐽌◌̀◌̕b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING HOOK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10F4D 0062;0061 1DFA 0316 10F4D 059A 0062;0061 1DFA 0316 10F4D 059A 0062;0061 1DFA 0316 10F4D 059A 0062;0061 1DFA 0316 10F4D 059A 0062; # (a◌֚◌̖◌᷺◌𐽍b; a◌᷺◌̖◌𐽍◌֚b; a◌᷺◌̖◌𐽍◌֚b; a◌᷺◌̖◌𐽍◌֚b; a◌᷺◌̖◌𐽍◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING HOOK BELOW, LATIN SMALL LETTER B +0061 10F4D 059A 0316 1DFA 0062;0061 1DFA 10F4D 0316 059A 0062;0061 1DFA 10F4D 0316 059A 0062;0061 1DFA 10F4D 0316 059A 0062;0061 1DFA 10F4D 0316 059A 0062; # (a◌𐽍◌֚◌̖◌᷺b; a◌᷺◌𐽍◌̖◌֚b; a◌᷺◌𐽍◌̖◌֚b; a◌᷺◌𐽍◌̖◌֚b; a◌᷺◌𐽍◌̖◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING HOOK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10F4E 0062;0061 1DFA 0316 10F4E 059A 0062;0061 1DFA 0316 10F4E 059A 0062;0061 1DFA 0316 10F4E 059A 0062;0061 1DFA 0316 10F4E 059A 0062; # (a◌֚◌̖◌᷺◌𐽎b; a◌᷺◌̖◌𐽎◌֚b; a◌᷺◌̖◌𐽎◌֚b; a◌᷺◌̖◌𐽎◌֚b; a◌᷺◌̖◌𐽎◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING LONG HOOK BELOW, LATIN SMALL LETTER B +0061 10F4E 059A 0316 1DFA 0062;0061 1DFA 10F4E 0316 059A 0062;0061 1DFA 10F4E 0316 059A 0062;0061 1DFA 10F4E 0316 059A 0062;0061 1DFA 10F4E 0316 059A 0062; # (a◌𐽎◌֚◌̖◌᷺b; a◌᷺◌𐽎◌̖◌֚b; a◌᷺◌𐽎◌̖◌֚b; a◌᷺◌𐽎◌̖◌֚b; a◌᷺◌𐽎◌̖◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING LONG HOOK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10F4F 0062;0061 1DFA 0316 10F4F 059A 0062;0061 1DFA 0316 10F4F 059A 0062;0061 1DFA 0316 10F4F 059A 0062;0061 1DFA 0316 10F4F 059A 0062; # (a◌֚◌̖◌᷺◌𐽏b; a◌᷺◌̖◌𐽏◌֚b; a◌᷺◌̖◌𐽏◌֚b; a◌᷺◌̖◌𐽏◌֚b; a◌᷺◌̖◌𐽏◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING RESH BELOW, LATIN SMALL LETTER B +0061 10F4F 059A 0316 1DFA 0062;0061 1DFA 10F4F 0316 059A 0062;0061 1DFA 10F4F 0316 059A 0062;0061 1DFA 10F4F 0316 059A 0062;0061 1DFA 10F4F 0316 059A 0062; # (a◌𐽏◌֚◌̖◌᷺b; a◌᷺◌𐽏◌̖◌֚b; a◌᷺◌𐽏◌̖◌֚b; a◌᷺◌𐽏◌̖◌֚b; a◌᷺◌𐽏◌̖◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING RESH BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10F50 0062;0061 1DFA 0316 10F50 059A 0062;0061 1DFA 0316 10F50 059A 0062;0061 1DFA 0316 10F50 059A 0062;0061 1DFA 0316 10F50 059A 0062; # (a◌֚◌̖◌᷺◌𐽐b; a◌᷺◌̖◌𐽐◌֚b; a◌᷺◌̖◌𐽐◌֚b; a◌᷺◌̖◌𐽐◌֚b; a◌᷺◌̖◌𐽐◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING STROKE BELOW, LATIN SMALL LETTER B +0061 10F50 059A 0316 1DFA 0062;0061 1DFA 10F50 0316 059A 0062;0061 1DFA 10F50 0316 059A 0062;0061 1DFA 10F50 0316 059A 0062;0061 1DFA 10F50 0316 059A 0062; # (a◌𐽐◌֚◌̖◌᷺b; a◌᷺◌𐽐◌̖◌֚b; a◌᷺◌𐽐◌̖◌֚b; a◌᷺◌𐽐◌̖◌֚b; a◌᷺◌𐽐◌̖◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING STROKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 10F82 0062;00E0 05AE 10F82 0315 0062;0061 05AE 0300 10F82 0315 0062;00E0 05AE 10F82 0315 0062;0061 05AE 0300 10F82 0315 0062; # (a◌̕◌̀◌֮◌𐾂b; à◌֮◌𐾂◌̕b; a◌֮◌̀◌𐾂◌̕b; à◌֮◌𐾂◌̕b; a◌֮◌̀◌𐾂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, OLD UYGHUR COMBINING DOT ABOVE, LATIN SMALL LETTER B +0061 10F82 0315 0300 05AE 0062;0061 05AE 10F82 0300 0315 0062;0061 05AE 10F82 0300 0315 0062;0061 05AE 10F82 0300 0315 0062;0061 05AE 10F82 0300 0315 0062; # (a◌𐾂◌̕◌̀◌֮b; a◌֮◌𐾂◌̀◌̕b; a◌֮◌𐾂◌̀◌̕b; a◌֮◌𐾂◌̀◌̕b; a◌֮◌𐾂◌̀◌̕b; ) LATIN SMALL LETTER A, OLD UYGHUR COMBINING DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10F83 0062;0061 1DFA 0316 10F83 059A 0062;0061 1DFA 0316 10F83 059A 0062;0061 1DFA 0316 10F83 059A 0062;0061 1DFA 0316 10F83 059A 0062; # (a◌֚◌̖◌᷺◌𐾃b; a◌᷺◌̖◌𐾃◌֚b; a◌᷺◌̖◌𐾃◌֚b; a◌᷺◌̖◌𐾃◌֚b; a◌᷺◌̖◌𐾃◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, OLD UYGHUR COMBINING DOT BELOW, LATIN SMALL LETTER B +0061 10F83 059A 0316 1DFA 0062;0061 1DFA 10F83 0316 059A 0062;0061 1DFA 10F83 0316 059A 0062;0061 1DFA 10F83 0316 059A 0062;0061 1DFA 10F83 0316 059A 0062; # (a◌𐾃◌֚◌̖◌᷺b; a◌᷺◌𐾃◌̖◌֚b; a◌᷺◌𐾃◌̖◌֚b; a◌᷺◌𐾃◌̖◌֚b; a◌᷺◌𐾃◌̖◌֚b; ) LATIN SMALL LETTER A, OLD UYGHUR COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 10F84 0062;00E0 05AE 10F84 0315 0062;0061 05AE 0300 10F84 0315 0062;00E0 05AE 10F84 0315 0062;0061 05AE 0300 10F84 0315 0062; # (a◌̕◌̀◌֮◌𐾄b; à◌֮◌𐾄◌̕b; a◌֮◌̀◌𐾄◌̕b; à◌֮◌𐾄◌̕b; a◌֮◌̀◌𐾄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, OLD UYGHUR COMBINING TWO DOTS ABOVE, LATIN SMALL LETTER B +0061 10F84 0315 0300 05AE 0062;0061 05AE 10F84 0300 0315 0062;0061 05AE 10F84 0300 0315 0062;0061 05AE 10F84 0300 0315 0062;0061 05AE 10F84 0300 0315 0062; # (a◌𐾄◌̕◌̀◌֮b; a◌֮◌𐾄◌̀◌̕b; a◌֮◌𐾄◌̀◌̕b; a◌֮◌𐾄◌̀◌̕b; a◌֮◌𐾄◌̀◌̕b; ) LATIN SMALL LETTER A, OLD UYGHUR COMBINING TWO DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 10F85 0062;0061 1DFA 0316 10F85 059A 0062;0061 1DFA 0316 10F85 059A 0062;0061 1DFA 0316 10F85 059A 0062;0061 1DFA 0316 10F85 059A 0062; # (a◌֚◌̖◌᷺◌𐾅b; a◌᷺◌̖◌𐾅◌֚b; a◌᷺◌̖◌𐾅◌֚b; a◌᷺◌̖◌𐾅◌֚b; a◌᷺◌̖◌𐾅◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, OLD UYGHUR COMBINING TWO DOTS BELOW, LATIN SMALL LETTER B +0061 10F85 059A 0316 1DFA 0062;0061 1DFA 10F85 0316 059A 0062;0061 1DFA 10F85 0316 059A 0062;0061 1DFA 10F85 0316 059A 0062;0061 1DFA 10F85 0316 059A 0062; # (a◌𐾅◌֚◌̖◌᷺b; a◌᷺◌𐾅◌̖◌֚b; a◌᷺◌𐾅◌̖◌֚b; a◌᷺◌𐾅◌̖◌֚b; a◌᷺◌𐾅◌̖◌֚b; ) LATIN SMALL LETTER A, OLD UYGHUR COMBINING TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 05B0 094D 3099 11046 0062;0061 3099 094D 11046 05B0 0062;0061 3099 094D 11046 05B0 0062;0061 3099 094D 11046 05B0 0062;0061 3099 094D 11046 05B0 0062; # (a◌ְ◌्◌゙◌𑁆b; a◌゙◌्◌𑁆◌ְb; a◌゙◌्◌𑁆◌ְb; a◌゙◌्◌𑁆◌ְb; a◌゙◌्◌𑁆◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BRAHMI VIRAMA, LATIN SMALL LETTER B +0061 11046 05B0 094D 3099 0062;0061 3099 11046 094D 05B0 0062;0061 3099 11046 094D 05B0 0062;0061 3099 11046 094D 05B0 0062;0061 3099 11046 094D 05B0 0062; # (a◌𑁆◌ְ◌्◌゙b; a◌゙◌𑁆◌्◌ְb; a◌゙◌𑁆◌्◌ְb; a◌゙◌𑁆◌्◌ְb; a◌゙◌𑁆◌्◌ְb; ) LATIN SMALL LETTER A, BRAHMI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11070 0062;0061 3099 094D 11070 05B0 0062;0061 3099 094D 11070 05B0 0062;0061 3099 094D 11070 05B0 0062;0061 3099 094D 11070 05B0 0062; # (a◌ְ◌्◌゙◌𑁰b; a◌゙◌्◌𑁰◌ְb; a◌゙◌्◌𑁰◌ְb; a◌゙◌्◌𑁰◌ְb; a◌゙◌्◌𑁰◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BRAHMI SIGN OLD TAMIL VIRAMA, LATIN SMALL LETTER B +0061 11070 05B0 094D 3099 0062;0061 3099 11070 094D 05B0 0062;0061 3099 11070 094D 05B0 0062;0061 3099 11070 094D 05B0 0062;0061 3099 11070 094D 05B0 0062; # (a◌𑁰◌ְ◌्◌゙b; a◌゙◌𑁰◌्◌ְb; a◌゙◌𑁰◌्◌ְb; a◌゙◌𑁰◌्◌ְb; a◌゙◌𑁰◌्◌ְb; ) LATIN SMALL LETTER A, BRAHMI SIGN OLD TAMIL VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 1107F 0062;0061 3099 094D 1107F 05B0 0062;0061 3099 094D 1107F 05B0 0062;0061 3099 094D 1107F 05B0 0062;0061 3099 094D 1107F 05B0 0062; # (a◌ְ◌्◌゙◌𑁿b; a◌゙◌्◌𑁿◌ְb; a◌゙◌्◌𑁿◌ְb; a◌゙◌्◌𑁿◌ְb; a◌゙◌्◌𑁿◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BRAHMI NUMBER JOINER, LATIN SMALL LETTER B +0061 1107F 05B0 094D 3099 0062;0061 3099 1107F 094D 05B0 0062;0061 3099 1107F 094D 05B0 0062;0061 3099 1107F 094D 05B0 0062;0061 3099 1107F 094D 05B0 0062; # (a◌𑁿◌ְ◌्◌゙b; a◌゙◌𑁿◌्◌ְb; a◌゙◌𑁿◌्◌ְb; a◌゙◌𑁿◌्◌ְb; a◌゙◌𑁿◌्◌ְb; ) LATIN SMALL LETTER A, BRAHMI NUMBER JOINER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 110B9 0062;0061 3099 094D 110B9 05B0 0062;0061 3099 094D 110B9 05B0 0062;0061 3099 094D 110B9 05B0 0062;0061 3099 094D 110B9 05B0 0062; # (a◌ְ◌्◌゙◌𑂹b; a◌゙◌्◌𑂹◌ְb; a◌゙◌्◌𑂹◌ְb; a◌゙◌्◌𑂹◌ְb; a◌゙◌्◌𑂹◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KAITHI SIGN VIRAMA, LATIN SMALL LETTER B +0061 110B9 05B0 094D 3099 0062;0061 3099 110B9 094D 05B0 0062;0061 3099 110B9 094D 05B0 0062;0061 3099 110B9 094D 05B0 0062;0061 3099 110B9 094D 05B0 0062; # (a◌𑂹◌ְ◌्◌゙b; a◌゙◌𑂹◌्◌ְb; a◌゙◌𑂹◌्◌ְb; a◌゙◌𑂹◌्◌ְb; a◌゙◌𑂹◌्◌ְb; ) LATIN SMALL LETTER A, KAITHI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 110BA 0062;0061 16FF0 093C 110BA 3099 0062;0061 16FF0 093C 110BA 3099 0062;0061 16FF0 093C 110BA 3099 0062;0061 16FF0 093C 110BA 3099 0062; # (a◌゙◌𖿰़◌𑂺b; a𖿰◌़◌𑂺◌゙b; a𖿰◌़◌𑂺◌゙b; a𖿰◌़◌𑂺◌゙b; a𖿰◌़◌𑂺◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, KAITHI SIGN NUKTA, LATIN SMALL LETTER B +0061 110BA 3099 093C 16FF0 0062;0061 16FF0 110BA 093C 3099 0062;0061 16FF0 110BA 093C 3099 0062;0061 16FF0 110BA 093C 3099 0062;0061 16FF0 110BA 093C 3099 0062; # (a◌𑂺◌゙◌𖿰़b; a𖿰◌𑂺◌़◌゙b; a𖿰◌𑂺◌़◌゙b; a𖿰◌𑂺◌़◌゙b; a𖿰◌𑂺◌़◌゙b; ) LATIN SMALL LETTER A, KAITHI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 0315 0300 05AE 11100 0062;00E0 05AE 11100 0315 0062;0061 05AE 0300 11100 0315 0062;00E0 05AE 11100 0315 0062;0061 05AE 0300 11100 0315 0062; # (a◌̕◌̀◌֮◌𑄀b; à◌֮◌𑄀◌̕b; a◌֮◌̀◌𑄀◌̕b; à◌֮◌𑄀◌̕b; a◌֮◌̀◌𑄀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, CHAKMA SIGN CANDRABINDU, LATIN SMALL LETTER B +0061 11100 0315 0300 05AE 0062;0061 05AE 11100 0300 0315 0062;0061 05AE 11100 0300 0315 0062;0061 05AE 11100 0300 0315 0062;0061 05AE 11100 0300 0315 0062; # (a◌𑄀◌̕◌̀◌֮b; a◌֮◌𑄀◌̀◌̕b; a◌֮◌𑄀◌̀◌̕b; a◌֮◌𑄀◌̀◌̕b; a◌֮◌𑄀◌̀◌̕b; ) LATIN SMALL LETTER A, CHAKMA SIGN CANDRABINDU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 11101 0062;00E0 05AE 11101 0315 0062;0061 05AE 0300 11101 0315 0062;00E0 05AE 11101 0315 0062;0061 05AE 0300 11101 0315 0062; # (a◌̕◌̀◌֮◌𑄁b; à◌֮◌𑄁◌̕b; a◌֮◌̀◌𑄁◌̕b; à◌֮◌𑄁◌̕b; a◌֮◌̀◌𑄁◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, CHAKMA SIGN ANUSVARA, LATIN SMALL LETTER B +0061 11101 0315 0300 05AE 0062;0061 05AE 11101 0300 0315 0062;0061 05AE 11101 0300 0315 0062;0061 05AE 11101 0300 0315 0062;0061 05AE 11101 0300 0315 0062; # (a◌𑄁◌̕◌̀◌֮b; a◌֮◌𑄁◌̀◌̕b; a◌֮◌𑄁◌̀◌̕b; a◌֮◌𑄁◌̀◌̕b; a◌֮◌𑄁◌̀◌̕b; ) LATIN SMALL LETTER A, CHAKMA SIGN ANUSVARA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 11102 0062;00E0 05AE 11102 0315 0062;0061 05AE 0300 11102 0315 0062;00E0 05AE 11102 0315 0062;0061 05AE 0300 11102 0315 0062; # (a◌̕◌̀◌֮◌𑄂b; à◌֮◌𑄂◌̕b; a◌֮◌̀◌𑄂◌̕b; à◌֮◌𑄂◌̕b; a◌֮◌̀◌𑄂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, CHAKMA SIGN VISARGA, LATIN SMALL LETTER B +0061 11102 0315 0300 05AE 0062;0061 05AE 11102 0300 0315 0062;0061 05AE 11102 0300 0315 0062;0061 05AE 11102 0300 0315 0062;0061 05AE 11102 0300 0315 0062; # (a◌𑄂◌̕◌̀◌֮b; a◌֮◌𑄂◌̀◌̕b; a◌֮◌𑄂◌̀◌̕b; a◌֮◌𑄂◌̀◌̕b; a◌֮◌𑄂◌̀◌̕b; ) LATIN SMALL LETTER A, CHAKMA SIGN VISARGA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 11133 0062;0061 3099 094D 11133 05B0 0062;0061 3099 094D 11133 05B0 0062;0061 3099 094D 11133 05B0 0062;0061 3099 094D 11133 05B0 0062; # (a◌ְ◌्◌゙◌𑄳b; a◌゙◌्◌𑄳◌ְb; a◌゙◌्◌𑄳◌ְb; a◌゙◌्◌𑄳◌ְb; a◌゙◌्◌𑄳◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, CHAKMA VIRAMA, LATIN SMALL LETTER B +0061 11133 05B0 094D 3099 0062;0061 3099 11133 094D 05B0 0062;0061 3099 11133 094D 05B0 0062;0061 3099 11133 094D 05B0 0062;0061 3099 11133 094D 05B0 0062; # (a◌𑄳◌ְ◌्◌゙b; a◌゙◌𑄳◌्◌ְb; a◌゙◌𑄳◌्◌ְb; a◌゙◌𑄳◌्◌ְb; a◌゙◌𑄳◌्◌ְb; ) LATIN SMALL LETTER A, CHAKMA VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11134 0062;0061 3099 094D 11134 05B0 0062;0061 3099 094D 11134 05B0 0062;0061 3099 094D 11134 05B0 0062;0061 3099 094D 11134 05B0 0062; # (a◌ְ◌्◌゙◌𑄴b; a◌゙◌्◌𑄴◌ְb; a◌゙◌्◌𑄴◌ְb; a◌゙◌्◌𑄴◌ְb; a◌゙◌्◌𑄴◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, CHAKMA MAAYYAA, LATIN SMALL LETTER B +0061 11134 05B0 094D 3099 0062;0061 3099 11134 094D 05B0 0062;0061 3099 11134 094D 05B0 0062;0061 3099 11134 094D 05B0 0062;0061 3099 11134 094D 05B0 0062; # (a◌𑄴◌ְ◌्◌゙b; a◌゙◌𑄴◌्◌ְb; a◌゙◌𑄴◌्◌ְb; a◌゙◌𑄴◌्◌ְb; a◌゙◌𑄴◌्◌ְb; ) LATIN SMALL LETTER A, CHAKMA MAAYYAA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 11173 0062;0061 16FF0 093C 11173 3099 0062;0061 16FF0 093C 11173 3099 0062;0061 16FF0 093C 11173 3099 0062;0061 16FF0 093C 11173 3099 0062; # (a◌゙◌𖿰़◌𑅳b; a𖿰◌़◌𑅳◌゙b; a𖿰◌़◌𑅳◌゙b; a𖿰◌़◌𑅳◌゙b; a𖿰◌़◌𑅳◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, MAHAJANI SIGN NUKTA, LATIN SMALL LETTER B +0061 11173 3099 093C 16FF0 0062;0061 16FF0 11173 093C 3099 0062;0061 16FF0 11173 093C 3099 0062;0061 16FF0 11173 093C 3099 0062;0061 16FF0 11173 093C 3099 0062; # (a◌𑅳◌゙◌𖿰़b; a𖿰◌𑅳◌़◌゙b; a𖿰◌𑅳◌़◌゙b; a𖿰◌𑅳◌़◌゙b; a𖿰◌𑅳◌़◌゙b; ) LATIN SMALL LETTER A, MAHAJANI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 111C0 0062;0061 3099 094D 111C0 05B0 0062;0061 3099 094D 111C0 05B0 0062;0061 3099 094D 111C0 05B0 0062;0061 3099 094D 111C0 05B0 0062; # (a◌ְ◌्◌゙𑇀b; a◌゙◌्𑇀◌ְb; a◌゙◌्𑇀◌ְb; a◌゙◌्𑇀◌ְb; a◌゙◌्𑇀◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SHARADA SIGN VIRAMA, LATIN SMALL LETTER B +0061 111C0 05B0 094D 3099 0062;0061 3099 111C0 094D 05B0 0062;0061 3099 111C0 094D 05B0 0062;0061 3099 111C0 094D 05B0 0062;0061 3099 111C0 094D 05B0 0062; # (a𑇀◌ְ◌्◌゙b; a◌゙𑇀◌्◌ְb; a◌゙𑇀◌्◌ְb; a◌゙𑇀◌्◌ְb; a◌゙𑇀◌्◌ְb; ) LATIN SMALL LETTER A, SHARADA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 111CA 0062;0061 16FF0 093C 111CA 3099 0062;0061 16FF0 093C 111CA 3099 0062;0061 16FF0 093C 111CA 3099 0062;0061 16FF0 093C 111CA 3099 0062; # (a◌゙◌𖿰़◌𑇊b; a𖿰◌़◌𑇊◌゙b; a𖿰◌़◌𑇊◌゙b; a𖿰◌़◌𑇊◌゙b; a𖿰◌़◌𑇊◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, SHARADA SIGN NUKTA, LATIN SMALL LETTER B +0061 111CA 3099 093C 16FF0 0062;0061 16FF0 111CA 093C 3099 0062;0061 16FF0 111CA 093C 3099 0062;0061 16FF0 111CA 093C 3099 0062;0061 16FF0 111CA 093C 3099 0062; # (a◌𑇊◌゙◌𖿰़b; a𖿰◌𑇊◌़◌゙b; a𖿰◌𑇊◌़◌゙b; a𖿰◌𑇊◌़◌゙b; a𖿰◌𑇊◌़◌゙b; ) LATIN SMALL LETTER A, SHARADA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 11235 0062;0061 3099 094D 11235 05B0 0062;0061 3099 094D 11235 05B0 0062;0061 3099 094D 11235 05B0 0062;0061 3099 094D 11235 05B0 0062; # (a◌ְ◌्◌゙𑈵b; a◌゙◌्𑈵◌ְb; a◌゙◌्𑈵◌ְb; a◌゙◌्𑈵◌ְb; a◌゙◌्𑈵◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KHOJKI SIGN VIRAMA, LATIN SMALL LETTER B +0061 11235 05B0 094D 3099 0062;0061 3099 11235 094D 05B0 0062;0061 3099 11235 094D 05B0 0062;0061 3099 11235 094D 05B0 0062;0061 3099 11235 094D 05B0 0062; # (a𑈵◌ְ◌्◌゙b; a◌゙𑈵◌्◌ְb; a◌゙𑈵◌्◌ְb; a◌゙𑈵◌्◌ְb; a◌゙𑈵◌्◌ְb; ) LATIN SMALL LETTER A, KHOJKI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 11236 0062;0061 16FF0 093C 11236 3099 0062;0061 16FF0 093C 11236 3099 0062;0061 16FF0 093C 11236 3099 0062;0061 16FF0 093C 11236 3099 0062; # (a◌゙◌𖿰़◌𑈶b; a𖿰◌़◌𑈶◌゙b; a𖿰◌़◌𑈶◌゙b; a𖿰◌़◌𑈶◌゙b; a𖿰◌़◌𑈶◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, KHOJKI SIGN NUKTA, LATIN SMALL LETTER B +0061 11236 3099 093C 16FF0 0062;0061 16FF0 11236 093C 3099 0062;0061 16FF0 11236 093C 3099 0062;0061 16FF0 11236 093C 3099 0062;0061 16FF0 11236 093C 3099 0062; # (a◌𑈶◌゙◌𖿰़b; a𖿰◌𑈶◌़◌゙b; a𖿰◌𑈶◌़◌゙b; a𖿰◌𑈶◌़◌゙b; a𖿰◌𑈶◌़◌゙b; ) LATIN SMALL LETTER A, KHOJKI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 3099 093C 16FF0 112E9 0062;0061 16FF0 093C 112E9 3099 0062;0061 16FF0 093C 112E9 3099 0062;0061 16FF0 093C 112E9 3099 0062;0061 16FF0 093C 112E9 3099 0062; # (a◌゙◌𖿰़◌𑋩b; a𖿰◌़◌𑋩◌゙b; a𖿰◌़◌𑋩◌゙b; a𖿰◌़◌𑋩◌゙b; a𖿰◌़◌𑋩◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, KHUDAWADI SIGN NUKTA, LATIN SMALL LETTER B +0061 112E9 3099 093C 16FF0 0062;0061 16FF0 112E9 093C 3099 0062;0061 16FF0 112E9 093C 3099 0062;0061 16FF0 112E9 093C 3099 0062;0061 16FF0 112E9 093C 3099 0062; # (a◌𑋩◌゙◌𖿰़b; a𖿰◌𑋩◌़◌゙b; a𖿰◌𑋩◌़◌゙b; a𖿰◌𑋩◌़◌゙b; a𖿰◌𑋩◌़◌゙b; ) LATIN SMALL LETTER A, KHUDAWADI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 112EA 0062;0061 3099 094D 112EA 05B0 0062;0061 3099 094D 112EA 05B0 0062;0061 3099 094D 112EA 05B0 0062;0061 3099 094D 112EA 05B0 0062; # (a◌ְ◌्◌゙◌𑋪b; a◌゙◌्◌𑋪◌ְb; a◌゙◌्◌𑋪◌ְb; a◌゙◌्◌𑋪◌ְb; a◌゙◌्◌𑋪◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KHUDAWADI SIGN VIRAMA, LATIN SMALL LETTER B +0061 112EA 05B0 094D 3099 0062;0061 3099 112EA 094D 05B0 0062;0061 3099 112EA 094D 05B0 0062;0061 3099 112EA 094D 05B0 0062;0061 3099 112EA 094D 05B0 0062; # (a◌𑋪◌ְ◌्◌゙b; a◌゙◌𑋪◌्◌ְb; a◌゙◌𑋪◌्◌ְb; a◌゙◌𑋪◌्◌ְb; a◌゙◌𑋪◌्◌ְb; ) LATIN SMALL LETTER A, KHUDAWADI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 1133B 0062;0061 16FF0 093C 1133B 3099 0062;0061 16FF0 093C 1133B 3099 0062;0061 16FF0 093C 1133B 3099 0062;0061 16FF0 093C 1133B 3099 0062; # (a◌゙◌𖿰़◌𑌻b; a𖿰◌़◌𑌻◌゙b; a𖿰◌़◌𑌻◌゙b; a𖿰◌़◌𑌻◌゙b; a𖿰◌़◌𑌻◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING BINDU BELOW, LATIN SMALL LETTER B +0061 1133B 3099 093C 16FF0 0062;0061 16FF0 1133B 093C 3099 0062;0061 16FF0 1133B 093C 3099 0062;0061 16FF0 1133B 093C 3099 0062;0061 16FF0 1133B 093C 3099 0062; # (a◌𑌻◌゙◌𖿰़b; a𖿰◌𑌻◌़◌゙b; a𖿰◌𑌻◌़◌゙b; a𖿰◌𑌻◌़◌゙b; a𖿰◌𑌻◌़◌゙b; ) LATIN SMALL LETTER A, COMBINING BINDU BELOW, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 3099 093C 16FF0 1133C 0062;0061 16FF0 093C 1133C 3099 0062;0061 16FF0 093C 1133C 3099 0062;0061 16FF0 093C 1133C 3099 0062;0061 16FF0 093C 1133C 3099 0062; # (a◌゙◌𖿰़◌𑌼b; a𖿰◌़◌𑌼◌゙b; a𖿰◌़◌𑌼◌゙b; a𖿰◌़◌𑌼◌゙b; a𖿰◌़◌𑌼◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, GRANTHA SIGN NUKTA, LATIN SMALL LETTER B +0061 1133C 3099 093C 16FF0 0062;0061 16FF0 1133C 093C 3099 0062;0061 16FF0 1133C 093C 3099 0062;0061 16FF0 1133C 093C 3099 0062;0061 16FF0 1133C 093C 3099 0062; # (a◌𑌼◌゙◌𖿰़b; a𖿰◌𑌼◌़◌゙b; a𖿰◌𑌼◌़◌゙b; a𖿰◌𑌼◌़◌゙b; a𖿰◌𑌼◌़◌゙b; ) LATIN SMALL LETTER A, GRANTHA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 1134D 0062;0061 3099 094D 1134D 05B0 0062;0061 3099 094D 1134D 05B0 0062;0061 3099 094D 1134D 05B0 0062;0061 3099 094D 1134D 05B0 0062; # (a◌ְ◌्◌゙𑍍b; a◌゙◌्𑍍◌ְb; a◌゙◌्𑍍◌ְb; a◌゙◌्𑍍◌ְb; a◌゙◌्𑍍◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, GRANTHA SIGN VIRAMA, LATIN SMALL LETTER B +0061 1134D 05B0 094D 3099 0062;0061 3099 1134D 094D 05B0 0062;0061 3099 1134D 094D 05B0 0062;0061 3099 1134D 094D 05B0 0062;0061 3099 1134D 094D 05B0 0062; # (a𑍍◌ְ◌्◌゙b; a◌゙𑍍◌्◌ְb; a◌゙𑍍◌्◌ְb; a◌゙𑍍◌्◌ְb; a◌゙𑍍◌्◌ְb; ) LATIN SMALL LETTER A, GRANTHA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 0315 0300 05AE 11366 0062;00E0 05AE 11366 0315 0062;0061 05AE 0300 11366 0315 0062;00E0 05AE 11366 0315 0062;0061 05AE 0300 11366 0315 0062; # (a◌̕◌̀◌֮◌𑍦b; à◌֮◌𑍦◌̕b; a◌֮◌̀◌𑍦◌̕b; à◌֮◌𑍦◌̕b; a◌֮◌̀◌𑍦◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA DIGIT ZERO, LATIN SMALL LETTER B +0061 11366 0315 0300 05AE 0062;0061 05AE 11366 0300 0315 0062;0061 05AE 11366 0300 0315 0062;0061 05AE 11366 0300 0315 0062;0061 05AE 11366 0300 0315 0062; # (a◌𑍦◌̕◌̀◌֮b; a◌֮◌𑍦◌̀◌̕b; a◌֮◌𑍦◌̀◌̕b; a◌֮◌𑍦◌̀◌̕b; a◌֮◌𑍦◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA DIGIT ZERO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 11367 0062;00E0 05AE 11367 0315 0062;0061 05AE 0300 11367 0315 0062;00E0 05AE 11367 0315 0062;0061 05AE 0300 11367 0315 0062; # (a◌̕◌̀◌֮◌𑍧b; à◌֮◌𑍧◌̕b; a◌֮◌̀◌𑍧◌̕b; à◌֮◌𑍧◌̕b; a◌֮◌̀◌𑍧◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA DIGIT ONE, LATIN SMALL LETTER B +0061 11367 0315 0300 05AE 0062;0061 05AE 11367 0300 0315 0062;0061 05AE 11367 0300 0315 0062;0061 05AE 11367 0300 0315 0062;0061 05AE 11367 0300 0315 0062; # (a◌𑍧◌̕◌̀◌֮b; a◌֮◌𑍧◌̀◌̕b; a◌֮◌𑍧◌̀◌̕b; a◌֮◌𑍧◌̀◌̕b; a◌֮◌𑍧◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA DIGIT ONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 11368 0062;00E0 05AE 11368 0315 0062;0061 05AE 0300 11368 0315 0062;00E0 05AE 11368 0315 0062;0061 05AE 0300 11368 0315 0062; # (a◌̕◌̀◌֮◌𑍨b; à◌֮◌𑍨◌̕b; a◌֮◌̀◌𑍨◌̕b; à◌֮◌𑍨◌̕b; a◌֮◌̀◌𑍨◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA DIGIT TWO, LATIN SMALL LETTER B +0061 11368 0315 0300 05AE 0062;0061 05AE 11368 0300 0315 0062;0061 05AE 11368 0300 0315 0062;0061 05AE 11368 0300 0315 0062;0061 05AE 11368 0300 0315 0062; # (a◌𑍨◌̕◌̀◌֮b; a◌֮◌𑍨◌̀◌̕b; a◌֮◌𑍨◌̀◌̕b; a◌֮◌𑍨◌̀◌̕b; a◌֮◌𑍨◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA DIGIT TWO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 11369 0062;00E0 05AE 11369 0315 0062;0061 05AE 0300 11369 0315 0062;00E0 05AE 11369 0315 0062;0061 05AE 0300 11369 0315 0062; # (a◌̕◌̀◌֮◌𑍩b; à◌֮◌𑍩◌̕b; a◌֮◌̀◌𑍩◌̕b; à◌֮◌𑍩◌̕b; a◌֮◌̀◌𑍩◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA DIGIT THREE, LATIN SMALL LETTER B +0061 11369 0315 0300 05AE 0062;0061 05AE 11369 0300 0315 0062;0061 05AE 11369 0300 0315 0062;0061 05AE 11369 0300 0315 0062;0061 05AE 11369 0300 0315 0062; # (a◌𑍩◌̕◌̀◌֮b; a◌֮◌𑍩◌̀◌̕b; a◌֮◌𑍩◌̀◌̕b; a◌֮◌𑍩◌̀◌̕b; a◌֮◌𑍩◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA DIGIT THREE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1136A 0062;00E0 05AE 1136A 0315 0062;0061 05AE 0300 1136A 0315 0062;00E0 05AE 1136A 0315 0062;0061 05AE 0300 1136A 0315 0062; # (a◌̕◌̀◌֮◌𑍪b; à◌֮◌𑍪◌̕b; a◌֮◌̀◌𑍪◌̕b; à◌֮◌𑍪◌̕b; a◌֮◌̀◌𑍪◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA DIGIT FOUR, LATIN SMALL LETTER B +0061 1136A 0315 0300 05AE 0062;0061 05AE 1136A 0300 0315 0062;0061 05AE 1136A 0300 0315 0062;0061 05AE 1136A 0300 0315 0062;0061 05AE 1136A 0300 0315 0062; # (a◌𑍪◌̕◌̀◌֮b; a◌֮◌𑍪◌̀◌̕b; a◌֮◌𑍪◌̀◌̕b; a◌֮◌𑍪◌̀◌̕b; a◌֮◌𑍪◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA DIGIT FOUR, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1136B 0062;00E0 05AE 1136B 0315 0062;0061 05AE 0300 1136B 0315 0062;00E0 05AE 1136B 0315 0062;0061 05AE 0300 1136B 0315 0062; # (a◌̕◌̀◌֮◌𑍫b; à◌֮◌𑍫◌̕b; a◌֮◌̀◌𑍫◌̕b; à◌֮◌𑍫◌̕b; a◌֮◌̀◌𑍫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA DIGIT FIVE, LATIN SMALL LETTER B +0061 1136B 0315 0300 05AE 0062;0061 05AE 1136B 0300 0315 0062;0061 05AE 1136B 0300 0315 0062;0061 05AE 1136B 0300 0315 0062;0061 05AE 1136B 0300 0315 0062; # (a◌𑍫◌̕◌̀◌֮b; a◌֮◌𑍫◌̀◌̕b; a◌֮◌𑍫◌̀◌̕b; a◌֮◌𑍫◌̀◌̕b; a◌֮◌𑍫◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA DIGIT FIVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1136C 0062;00E0 05AE 1136C 0315 0062;0061 05AE 0300 1136C 0315 0062;00E0 05AE 1136C 0315 0062;0061 05AE 0300 1136C 0315 0062; # (a◌̕◌̀◌֮◌𑍬b; à◌֮◌𑍬◌̕b; a◌֮◌̀◌𑍬◌̕b; à◌֮◌𑍬◌̕b; a◌֮◌̀◌𑍬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA DIGIT SIX, LATIN SMALL LETTER B +0061 1136C 0315 0300 05AE 0062;0061 05AE 1136C 0300 0315 0062;0061 05AE 1136C 0300 0315 0062;0061 05AE 1136C 0300 0315 0062;0061 05AE 1136C 0300 0315 0062; # (a◌𑍬◌̕◌̀◌֮b; a◌֮◌𑍬◌̀◌̕b; a◌֮◌𑍬◌̀◌̕b; a◌֮◌𑍬◌̀◌̕b; a◌֮◌𑍬◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA DIGIT SIX, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 11370 0062;00E0 05AE 11370 0315 0062;0061 05AE 0300 11370 0315 0062;00E0 05AE 11370 0315 0062;0061 05AE 0300 11370 0315 0062; # (a◌̕◌̀◌֮◌𑍰b; à◌֮◌𑍰◌̕b; a◌֮◌̀◌𑍰◌̕b; à◌֮◌𑍰◌̕b; a◌֮◌̀◌𑍰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA LETTER A, LATIN SMALL LETTER B +0061 11370 0315 0300 05AE 0062;0061 05AE 11370 0300 0315 0062;0061 05AE 11370 0300 0315 0062;0061 05AE 11370 0300 0315 0062;0061 05AE 11370 0300 0315 0062; # (a◌𑍰◌̕◌̀◌֮b; a◌֮◌𑍰◌̀◌̕b; a◌֮◌𑍰◌̀◌̕b; a◌֮◌𑍰◌̀◌̕b; a◌֮◌𑍰◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 11371 0062;00E0 05AE 11371 0315 0062;0061 05AE 0300 11371 0315 0062;00E0 05AE 11371 0315 0062;0061 05AE 0300 11371 0315 0062; # (a◌̕◌̀◌֮◌𑍱b; à◌֮◌𑍱◌̕b; a◌֮◌̀◌𑍱◌̕b; à◌֮◌𑍱◌̕b; a◌֮◌̀◌𑍱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA LETTER KA, LATIN SMALL LETTER B +0061 11371 0315 0300 05AE 0062;0061 05AE 11371 0300 0315 0062;0061 05AE 11371 0300 0315 0062;0061 05AE 11371 0300 0315 0062;0061 05AE 11371 0300 0315 0062; # (a◌𑍱◌̕◌̀◌֮b; a◌֮◌𑍱◌̀◌̕b; a◌֮◌𑍱◌̀◌̕b; a◌֮◌𑍱◌̀◌̕b; a◌֮◌𑍱◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA LETTER KA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 11372 0062;00E0 05AE 11372 0315 0062;0061 05AE 0300 11372 0315 0062;00E0 05AE 11372 0315 0062;0061 05AE 0300 11372 0315 0062; # (a◌̕◌̀◌֮◌𑍲b; à◌֮◌𑍲◌̕b; a◌֮◌̀◌𑍲◌̕b; à◌֮◌𑍲◌̕b; a◌֮◌̀◌𑍲◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA LETTER NA, LATIN SMALL LETTER B +0061 11372 0315 0300 05AE 0062;0061 05AE 11372 0300 0315 0062;0061 05AE 11372 0300 0315 0062;0061 05AE 11372 0300 0315 0062;0061 05AE 11372 0300 0315 0062; # (a◌𑍲◌̕◌̀◌֮b; a◌֮◌𑍲◌̀◌̕b; a◌֮◌𑍲◌̀◌̕b; a◌֮◌𑍲◌̀◌̕b; a◌֮◌𑍲◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA LETTER NA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 11373 0062;00E0 05AE 11373 0315 0062;0061 05AE 0300 11373 0315 0062;00E0 05AE 11373 0315 0062;0061 05AE 0300 11373 0315 0062; # (a◌̕◌̀◌֮◌𑍳b; à◌֮◌𑍳◌̕b; a◌֮◌̀◌𑍳◌̕b; à◌֮◌𑍳◌̕b; a◌֮◌̀◌𑍳◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA LETTER VI, LATIN SMALL LETTER B +0061 11373 0315 0300 05AE 0062;0061 05AE 11373 0300 0315 0062;0061 05AE 11373 0300 0315 0062;0061 05AE 11373 0300 0315 0062;0061 05AE 11373 0300 0315 0062; # (a◌𑍳◌̕◌̀◌֮b; a◌֮◌𑍳◌̀◌̕b; a◌֮◌𑍳◌̀◌̕b; a◌֮◌𑍳◌̀◌̕b; a◌֮◌𑍳◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA LETTER VI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 11374 0062;00E0 05AE 11374 0315 0062;0061 05AE 0300 11374 0315 0062;00E0 05AE 11374 0315 0062;0061 05AE 0300 11374 0315 0062; # (a◌̕◌̀◌֮◌𑍴b; à◌֮◌𑍴◌̕b; a◌֮◌̀◌𑍴◌̕b; à◌֮◌𑍴◌̕b; a◌֮◌̀◌𑍴◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GRANTHA LETTER PA, LATIN SMALL LETTER B +0061 11374 0315 0300 05AE 0062;0061 05AE 11374 0300 0315 0062;0061 05AE 11374 0300 0315 0062;0061 05AE 11374 0300 0315 0062;0061 05AE 11374 0300 0315 0062; # (a◌𑍴◌̕◌̀◌֮b; a◌֮◌𑍴◌̀◌̕b; a◌֮◌𑍴◌̀◌̕b; a◌֮◌𑍴◌̀◌̕b; a◌֮◌𑍴◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRANTHA LETTER PA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 11442 0062;0061 3099 094D 11442 05B0 0062;0061 3099 094D 11442 05B0 0062;0061 3099 094D 11442 05B0 0062;0061 3099 094D 11442 05B0 0062; # (a◌ְ◌्◌゙◌𑑂b; a◌゙◌्◌𑑂◌ְb; a◌゙◌्◌𑑂◌ְb; a◌゙◌्◌𑑂◌ְb; a◌゙◌्◌𑑂◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, NEWA SIGN VIRAMA, LATIN SMALL LETTER B +0061 11442 05B0 094D 3099 0062;0061 3099 11442 094D 05B0 0062;0061 3099 11442 094D 05B0 0062;0061 3099 11442 094D 05B0 0062;0061 3099 11442 094D 05B0 0062; # (a◌𑑂◌ְ◌्◌゙b; a◌゙◌𑑂◌्◌ְb; a◌゙◌𑑂◌्◌ְb; a◌゙◌𑑂◌्◌ְb; a◌゙◌𑑂◌्◌ְb; ) LATIN SMALL LETTER A, NEWA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 11446 0062;0061 16FF0 093C 11446 3099 0062;0061 16FF0 093C 11446 3099 0062;0061 16FF0 093C 11446 3099 0062;0061 16FF0 093C 11446 3099 0062; # (a◌゙◌𖿰़◌𑑆b; a𖿰◌़◌𑑆◌゙b; a𖿰◌़◌𑑆◌゙b; a𖿰◌़◌𑑆◌゙b; a𖿰◌़◌𑑆◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, NEWA SIGN NUKTA, LATIN SMALL LETTER B +0061 11446 3099 093C 16FF0 0062;0061 16FF0 11446 093C 3099 0062;0061 16FF0 11446 093C 3099 0062;0061 16FF0 11446 093C 3099 0062;0061 16FF0 11446 093C 3099 0062; # (a◌𑑆◌゙◌𖿰़b; a𖿰◌𑑆◌़◌゙b; a𖿰◌𑑆◌़◌゙b; a𖿰◌𑑆◌़◌゙b; a𖿰◌𑑆◌़◌゙b; ) LATIN SMALL LETTER A, NEWA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 0315 0300 05AE 1145E 0062;00E0 05AE 1145E 0315 0062;0061 05AE 0300 1145E 0315 0062;00E0 05AE 1145E 0315 0062;0061 05AE 0300 1145E 0315 0062; # (a◌̕◌̀◌֮◌𑑞b; à◌֮◌𑑞◌̕b; a◌֮◌̀◌𑑞◌̕b; à◌֮◌𑑞◌̕b; a◌֮◌̀◌𑑞◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NEWA SANDHI MARK, LATIN SMALL LETTER B +0061 1145E 0315 0300 05AE 0062;0061 05AE 1145E 0300 0315 0062;0061 05AE 1145E 0300 0315 0062;0061 05AE 1145E 0300 0315 0062;0061 05AE 1145E 0300 0315 0062; # (a◌𑑞◌̕◌̀◌֮b; a◌֮◌𑑞◌̀◌̕b; a◌֮◌𑑞◌̀◌̕b; a◌֮◌𑑞◌̀◌̕b; a◌֮◌𑑞◌̀◌̕b; ) LATIN SMALL LETTER A, NEWA SANDHI MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 05B0 094D 3099 114C2 0062;0061 3099 094D 114C2 05B0 0062;0061 3099 094D 114C2 05B0 0062;0061 3099 094D 114C2 05B0 0062;0061 3099 094D 114C2 05B0 0062; # (a◌ְ◌्◌゙◌𑓂b; a◌゙◌्◌𑓂◌ְb; a◌゙◌्◌𑓂◌ְb; a◌゙◌्◌𑓂◌ְb; a◌゙◌्◌𑓂◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TIRHUTA SIGN VIRAMA, LATIN SMALL LETTER B +0061 114C2 05B0 094D 3099 0062;0061 3099 114C2 094D 05B0 0062;0061 3099 114C2 094D 05B0 0062;0061 3099 114C2 094D 05B0 0062;0061 3099 114C2 094D 05B0 0062; # (a◌𑓂◌ְ◌्◌゙b; a◌゙◌𑓂◌्◌ְb; a◌゙◌𑓂◌्◌ְb; a◌゙◌𑓂◌्◌ְb; a◌゙◌𑓂◌्◌ְb; ) LATIN SMALL LETTER A, TIRHUTA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 114C3 0062;0061 16FF0 093C 114C3 3099 0062;0061 16FF0 093C 114C3 3099 0062;0061 16FF0 093C 114C3 3099 0062;0061 16FF0 093C 114C3 3099 0062; # (a◌゙◌𖿰़◌𑓃b; a𖿰◌़◌𑓃◌゙b; a𖿰◌़◌𑓃◌゙b; a𖿰◌़◌𑓃◌゙b; a𖿰◌़◌𑓃◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, TIRHUTA SIGN NUKTA, LATIN SMALL LETTER B +0061 114C3 3099 093C 16FF0 0062;0061 16FF0 114C3 093C 3099 0062;0061 16FF0 114C3 093C 3099 0062;0061 16FF0 114C3 093C 3099 0062;0061 16FF0 114C3 093C 3099 0062; # (a◌𑓃◌゙◌𖿰़b; a𖿰◌𑓃◌़◌゙b; a𖿰◌𑓃◌़◌゙b; a𖿰◌𑓃◌़◌゙b; a𖿰◌𑓃◌़◌゙b; ) LATIN SMALL LETTER A, TIRHUTA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 115BF 0062;0061 3099 094D 115BF 05B0 0062;0061 3099 094D 115BF 05B0 0062;0061 3099 094D 115BF 05B0 0062;0061 3099 094D 115BF 05B0 0062; # (a◌ְ◌्◌゙◌𑖿b; a◌゙◌्◌𑖿◌ְb; a◌゙◌्◌𑖿◌ְb; a◌゙◌्◌𑖿◌ְb; a◌゙◌्◌𑖿◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SIDDHAM SIGN VIRAMA, LATIN SMALL LETTER B +0061 115BF 05B0 094D 3099 0062;0061 3099 115BF 094D 05B0 0062;0061 3099 115BF 094D 05B0 0062;0061 3099 115BF 094D 05B0 0062;0061 3099 115BF 094D 05B0 0062; # (a◌𑖿◌ְ◌्◌゙b; a◌゙◌𑖿◌्◌ְb; a◌゙◌𑖿◌्◌ְb; a◌゙◌𑖿◌्◌ְb; a◌゙◌𑖿◌्◌ְb; ) LATIN SMALL LETTER A, SIDDHAM SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 115C0 0062;0061 16FF0 093C 115C0 3099 0062;0061 16FF0 093C 115C0 3099 0062;0061 16FF0 093C 115C0 3099 0062;0061 16FF0 093C 115C0 3099 0062; # (a◌゙◌𖿰़◌𑗀b; a𖿰◌़◌𑗀◌゙b; a𖿰◌़◌𑗀◌゙b; a𖿰◌़◌𑗀◌゙b; a𖿰◌़◌𑗀◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, SIDDHAM SIGN NUKTA, LATIN SMALL LETTER B +0061 115C0 3099 093C 16FF0 0062;0061 16FF0 115C0 093C 3099 0062;0061 16FF0 115C0 093C 3099 0062;0061 16FF0 115C0 093C 3099 0062;0061 16FF0 115C0 093C 3099 0062; # (a◌𑗀◌゙◌𖿰़b; a𖿰◌𑗀◌़◌゙b; a𖿰◌𑗀◌़◌゙b; a𖿰◌𑗀◌़◌゙b; a𖿰◌𑗀◌़◌゙b; ) LATIN SMALL LETTER A, SIDDHAM SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 1163F 0062;0061 3099 094D 1163F 05B0 0062;0061 3099 094D 1163F 05B0 0062;0061 3099 094D 1163F 05B0 0062;0061 3099 094D 1163F 05B0 0062; # (a◌ְ◌्◌゙◌𑘿b; a◌゙◌्◌𑘿◌ְb; a◌゙◌्◌𑘿◌ְb; a◌゙◌्◌𑘿◌ְb; a◌゙◌्◌𑘿◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MODI SIGN VIRAMA, LATIN SMALL LETTER B +0061 1163F 05B0 094D 3099 0062;0061 3099 1163F 094D 05B0 0062;0061 3099 1163F 094D 05B0 0062;0061 3099 1163F 094D 05B0 0062;0061 3099 1163F 094D 05B0 0062; # (a◌𑘿◌ְ◌्◌゙b; a◌゙◌𑘿◌्◌ְb; a◌゙◌𑘿◌्◌ְb; a◌゙◌𑘿◌्◌ְb; a◌゙◌𑘿◌्◌ְb; ) LATIN SMALL LETTER A, MODI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 116B6 0062;0061 3099 094D 116B6 05B0 0062;0061 3099 094D 116B6 05B0 0062;0061 3099 094D 116B6 05B0 0062;0061 3099 094D 116B6 05B0 0062; # (a◌ְ◌्◌゙𑚶b; a◌゙◌्𑚶◌ְb; a◌゙◌्𑚶◌ְb; a◌゙◌्𑚶◌ְb; a◌゙◌्𑚶◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAKRI SIGN VIRAMA, LATIN SMALL LETTER B +0061 116B6 05B0 094D 3099 0062;0061 3099 116B6 094D 05B0 0062;0061 3099 116B6 094D 05B0 0062;0061 3099 116B6 094D 05B0 0062;0061 3099 116B6 094D 05B0 0062; # (a𑚶◌ְ◌्◌゙b; a◌゙𑚶◌्◌ְb; a◌゙𑚶◌्◌ְb; a◌゙𑚶◌्◌ְb; a◌゙𑚶◌्◌ְb; ) LATIN SMALL LETTER A, TAKRI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 116B7 0062;0061 16FF0 093C 116B7 3099 0062;0061 16FF0 093C 116B7 3099 0062;0061 16FF0 093C 116B7 3099 0062;0061 16FF0 093C 116B7 3099 0062; # (a◌゙◌𖿰़◌𑚷b; a𖿰◌़◌𑚷◌゙b; a𖿰◌़◌𑚷◌゙b; a𖿰◌़◌𑚷◌゙b; a𖿰◌़◌𑚷◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, TAKRI SIGN NUKTA, LATIN SMALL LETTER B +0061 116B7 3099 093C 16FF0 0062;0061 16FF0 116B7 093C 3099 0062;0061 16FF0 116B7 093C 3099 0062;0061 16FF0 116B7 093C 3099 0062;0061 16FF0 116B7 093C 3099 0062; # (a◌𑚷◌゙◌𖿰़b; a𖿰◌𑚷◌़◌゙b; a𖿰◌𑚷◌़◌゙b; a𖿰◌𑚷◌़◌゙b; a𖿰◌𑚷◌़◌゙b; ) LATIN SMALL LETTER A, TAKRI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 1172B 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062;0061 3099 094D 1172B 05B0 0062; # (a◌ְ◌्◌゙◌𑜫b; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; a◌゙◌्◌𑜫◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, AHOM SIGN KILLER, LATIN SMALL LETTER B +0061 1172B 05B0 094D 3099 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062;0061 3099 1172B 094D 05B0 0062; # (a◌𑜫◌ְ◌्◌゙b; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; a◌゙◌𑜫◌्◌ְb; ) LATIN SMALL LETTER A, AHOM SIGN KILLER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11839 0062;0061 3099 094D 11839 05B0 0062;0061 3099 094D 11839 05B0 0062;0061 3099 094D 11839 05B0 0062;0061 3099 094D 11839 05B0 0062; # (a◌ְ◌्◌゙◌𑠹b; a◌゙◌्◌𑠹◌ְb; a◌゙◌्◌𑠹◌ְb; a◌゙◌्◌𑠹◌ְb; a◌゙◌्◌𑠹◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DOGRA SIGN VIRAMA, LATIN SMALL LETTER B +0061 11839 05B0 094D 3099 0062;0061 3099 11839 094D 05B0 0062;0061 3099 11839 094D 05B0 0062;0061 3099 11839 094D 05B0 0062;0061 3099 11839 094D 05B0 0062; # (a◌𑠹◌ְ◌्◌゙b; a◌゙◌𑠹◌्◌ְb; a◌゙◌𑠹◌्◌ְb; a◌゙◌𑠹◌्◌ְb; a◌゙◌𑠹◌्◌ְb; ) LATIN SMALL LETTER A, DOGRA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 1183A 0062;0061 16FF0 093C 1183A 3099 0062;0061 16FF0 093C 1183A 3099 0062;0061 16FF0 093C 1183A 3099 0062;0061 16FF0 093C 1183A 3099 0062; # (a◌゙◌𖿰़◌𑠺b; a𖿰◌़◌𑠺◌゙b; a𖿰◌़◌𑠺◌゙b; a𖿰◌़◌𑠺◌゙b; a𖿰◌़◌𑠺◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, DOGRA SIGN NUKTA, LATIN SMALL LETTER B +0061 1183A 3099 093C 16FF0 0062;0061 16FF0 1183A 093C 3099 0062;0061 16FF0 1183A 093C 3099 0062;0061 16FF0 1183A 093C 3099 0062;0061 16FF0 1183A 093C 3099 0062; # (a◌𑠺◌゙◌𖿰़b; a𖿰◌𑠺◌़◌゙b; a𖿰◌𑠺◌़◌゙b; a𖿰◌𑠺◌़◌゙b; a𖿰◌𑠺◌़◌゙b; ) LATIN SMALL LETTER A, DOGRA SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 1193D 0062;0061 3099 094D 1193D 05B0 0062;0061 3099 094D 1193D 05B0 0062;0061 3099 094D 1193D 05B0 0062;0061 3099 094D 1193D 05B0 0062; # (a◌ְ◌्◌゙𑤽b; a◌゙◌्𑤽◌ְb; a◌゙◌्𑤽◌ְb; a◌゙◌्𑤽◌ְb; a◌゙◌्𑤽◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DIVES AKURU SIGN HALANTA, LATIN SMALL LETTER B +0061 1193D 05B0 094D 3099 0062;0061 3099 1193D 094D 05B0 0062;0061 3099 1193D 094D 05B0 0062;0061 3099 1193D 094D 05B0 0062;0061 3099 1193D 094D 05B0 0062; # (a𑤽◌ְ◌्◌゙b; a◌゙𑤽◌्◌ְb; a◌゙𑤽◌्◌ְb; a◌゙𑤽◌्◌ְb; a◌゙𑤽◌्◌ְb; ) LATIN SMALL LETTER A, DIVES AKURU SIGN HALANTA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 1193E 0062;0061 3099 094D 1193E 05B0 0062;0061 3099 094D 1193E 05B0 0062;0061 3099 094D 1193E 05B0 0062;0061 3099 094D 1193E 05B0 0062; # (a◌ְ◌्◌゙◌𑤾b; a◌゙◌्◌𑤾◌ְb; a◌゙◌्◌𑤾◌ְb; a◌゙◌्◌𑤾◌ְb; a◌゙◌्◌𑤾◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DIVES AKURU VIRAMA, LATIN SMALL LETTER B +0061 1193E 05B0 094D 3099 0062;0061 3099 1193E 094D 05B0 0062;0061 3099 1193E 094D 05B0 0062;0061 3099 1193E 094D 05B0 0062;0061 3099 1193E 094D 05B0 0062; # (a◌𑤾◌ְ◌्◌゙b; a◌゙◌𑤾◌्◌ְb; a◌゙◌𑤾◌्◌ְb; a◌゙◌𑤾◌्◌ְb; a◌゙◌𑤾◌्◌ְb; ) LATIN SMALL LETTER A, DIVES AKURU VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 11943 0062;0061 16FF0 093C 11943 3099 0062;0061 16FF0 093C 11943 3099 0062;0061 16FF0 093C 11943 3099 0062;0061 16FF0 093C 11943 3099 0062; # (a◌゙◌𖿰़◌𑥃b; a𖿰◌़◌𑥃◌゙b; a𖿰◌़◌𑥃◌゙b; a𖿰◌़◌𑥃◌゙b; a𖿰◌़◌𑥃◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, DIVES AKURU SIGN NUKTA, LATIN SMALL LETTER B +0061 11943 3099 093C 16FF0 0062;0061 16FF0 11943 093C 3099 0062;0061 16FF0 11943 093C 3099 0062;0061 16FF0 11943 093C 3099 0062;0061 16FF0 11943 093C 3099 0062; # (a◌𑥃◌゙◌𖿰़b; a𖿰◌𑥃◌़◌゙b; a𖿰◌𑥃◌़◌゙b; a𖿰◌𑥃◌़◌゙b; a𖿰◌𑥃◌़◌゙b; ) LATIN SMALL LETTER A, DIVES AKURU SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 119E0 0062;0061 3099 094D 119E0 05B0 0062;0061 3099 094D 119E0 05B0 0062;0061 3099 094D 119E0 05B0 0062;0061 3099 094D 119E0 05B0 0062; # (a◌ְ◌्◌゙◌𑧠b; a◌゙◌्◌𑧠◌ְb; a◌゙◌्◌𑧠◌ְb; a◌゙◌्◌𑧠◌ְb; a◌゙◌्◌𑧠◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, NANDINAGARI SIGN VIRAMA, LATIN SMALL LETTER B +0061 119E0 05B0 094D 3099 0062;0061 3099 119E0 094D 05B0 0062;0061 3099 119E0 094D 05B0 0062;0061 3099 119E0 094D 05B0 0062;0061 3099 119E0 094D 05B0 0062; # (a◌𑧠◌ְ◌्◌゙b; a◌゙◌𑧠◌्◌ְb; a◌゙◌𑧠◌्◌ְb; a◌゙◌𑧠◌्◌ְb; a◌゙◌𑧠◌्◌ְb; ) LATIN SMALL LETTER A, NANDINAGARI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11A34 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062;0061 3099 094D 11A34 05B0 0062; # (a◌ְ◌्◌゙◌𑨴b; a◌゙◌्◌𑨴◌ְb; a◌゙◌्◌𑨴◌ְb; a◌゙◌्◌𑨴◌ְb; a◌゙◌्◌𑨴◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, ZANABAZAR SQUARE SIGN VIRAMA, LATIN SMALL LETTER B +0061 11A34 05B0 094D 3099 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062;0061 3099 11A34 094D 05B0 0062; # (a◌𑨴◌ְ◌्◌゙b; a◌゙◌𑨴◌्◌ְb; a◌゙◌𑨴◌्◌ְb; a◌゙◌𑨴◌्◌ְb; a◌゙◌𑨴◌्◌ְb; ) LATIN SMALL LETTER A, ZANABAZAR SQUARE SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11A47 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062;0061 3099 094D 11A47 05B0 0062; # (a◌ְ◌्◌゙◌𑩇b; a◌゙◌्◌𑩇◌ְb; a◌゙◌्◌𑩇◌ְb; a◌゙◌्◌𑩇◌ְb; a◌゙◌्◌𑩇◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, ZANABAZAR SQUARE SUBJOINER, LATIN SMALL LETTER B +0061 11A47 05B0 094D 3099 0062;0061 3099 11A47 094D 05B0 0062;0061 3099 11A47 094D 05B0 0062;0061 3099 11A47 094D 05B0 0062;0061 3099 11A47 094D 05B0 0062; # (a◌𑩇◌ְ◌्◌゙b; a◌゙◌𑩇◌्◌ְb; a◌゙◌𑩇◌्◌ְb; a◌゙◌𑩇◌्◌ְb; a◌゙◌𑩇◌्◌ְb; ) LATIN SMALL LETTER A, ZANABAZAR SQUARE SUBJOINER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11A99 0062;0061 3099 094D 11A99 05B0 0062;0061 3099 094D 11A99 05B0 0062;0061 3099 094D 11A99 05B0 0062;0061 3099 094D 11A99 05B0 0062; # (a◌ְ◌्◌゙◌𑪙b; a◌゙◌्◌𑪙◌ְb; a◌゙◌्◌𑪙◌ְb; a◌゙◌्◌𑪙◌ְb; a◌゙◌्◌𑪙◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, SOYOMBO SUBJOINER, LATIN SMALL LETTER B +0061 11A99 05B0 094D 3099 0062;0061 3099 11A99 094D 05B0 0062;0061 3099 11A99 094D 05B0 0062;0061 3099 11A99 094D 05B0 0062;0061 3099 11A99 094D 05B0 0062; # (a◌𑪙◌ְ◌्◌゙b; a◌゙◌𑪙◌्◌ְb; a◌゙◌𑪙◌्◌ְb; a◌゙◌𑪙◌्◌ְb; a◌゙◌𑪙◌्◌ְb; ) LATIN SMALL LETTER A, SOYOMBO SUBJOINER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11C3F 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062;0061 3099 094D 11C3F 05B0 0062; # (a◌ְ◌्◌゙◌𑰿b; a◌゙◌्◌𑰿◌ְb; a◌゙◌्◌𑰿◌ְb; a◌゙◌्◌𑰿◌ְb; a◌゙◌्◌𑰿◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BHAIKSUKI SIGN VIRAMA, LATIN SMALL LETTER B +0061 11C3F 05B0 094D 3099 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062;0061 3099 11C3F 094D 05B0 0062; # (a◌𑰿◌ְ◌्◌゙b; a◌゙◌𑰿◌्◌ְb; a◌゙◌𑰿◌्◌ְb; a◌゙◌𑰿◌्◌ְb; a◌゙◌𑰿◌्◌ְb; ) LATIN SMALL LETTER A, BHAIKSUKI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 3099 093C 16FF0 11D42 0062;0061 16FF0 093C 11D42 3099 0062;0061 16FF0 093C 11D42 3099 0062;0061 16FF0 093C 11D42 3099 0062;0061 16FF0 093C 11D42 3099 0062; # (a◌゙◌𖿰़◌𑵂b; a𖿰◌़◌𑵂◌゙b; a𖿰◌़◌𑵂◌゙b; a𖿰◌़◌𑵂◌゙b; a𖿰◌़◌𑵂◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, MASARAM GONDI SIGN NUKTA, LATIN SMALL LETTER B +0061 11D42 3099 093C 16FF0 0062;0061 16FF0 11D42 093C 3099 0062;0061 16FF0 11D42 093C 3099 0062;0061 16FF0 11D42 093C 3099 0062;0061 16FF0 11D42 093C 3099 0062; # (a◌𑵂◌゙◌𖿰़b; a𖿰◌𑵂◌़◌゙b; a𖿰◌𑵂◌़◌゙b; a𖿰◌𑵂◌़◌゙b; a𖿰◌𑵂◌़◌゙b; ) LATIN SMALL LETTER A, MASARAM GONDI SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 05B0 094D 3099 11D44 0062;0061 3099 094D 11D44 05B0 0062;0061 3099 094D 11D44 05B0 0062;0061 3099 094D 11D44 05B0 0062;0061 3099 094D 11D44 05B0 0062; # (a◌ְ◌्◌゙◌𑵄b; a◌゙◌्◌𑵄◌ְb; a◌゙◌्◌𑵄◌ְb; a◌゙◌्◌𑵄◌ְb; a◌゙◌्◌𑵄◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MASARAM GONDI SIGN HALANTA, LATIN SMALL LETTER B +0061 11D44 05B0 094D 3099 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062;0061 3099 11D44 094D 05B0 0062; # (a◌𑵄◌ְ◌्◌゙b; a◌゙◌𑵄◌्◌ְb; a◌゙◌𑵄◌्◌ְb; a◌゙◌𑵄◌्◌ְb; a◌゙◌𑵄◌्◌ְb; ) LATIN SMALL LETTER A, MASARAM GONDI SIGN HALANTA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11D45 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062;0061 3099 094D 11D45 05B0 0062; # (a◌ְ◌्◌゙◌𑵅b; a◌゙◌्◌𑵅◌ְb; a◌゙◌्◌𑵅◌ְb; a◌゙◌्◌𑵅◌ְb; a◌゙◌्◌𑵅◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MASARAM GONDI VIRAMA, LATIN SMALL LETTER B +0061 11D45 05B0 094D 3099 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062;0061 3099 11D45 094D 05B0 0062; # (a◌𑵅◌ְ◌्◌゙b; a◌゙◌𑵅◌्◌ְb; a◌゙◌𑵅◌्◌ְb; a◌゙◌𑵅◌्◌ְb; a◌゙◌𑵅◌्◌ְb; ) LATIN SMALL LETTER A, MASARAM GONDI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11D97 0062;0061 3099 094D 11D97 05B0 0062;0061 3099 094D 11D97 05B0 0062;0061 3099 094D 11D97 05B0 0062;0061 3099 094D 11D97 05B0 0062; # (a◌ְ◌्◌゙◌𑶗b; a◌゙◌्◌𑶗◌ְb; a◌゙◌्◌𑶗◌ְb; a◌゙◌्◌𑶗◌ְb; a◌゙◌्◌𑶗◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, GUNJALA GONDI VIRAMA, LATIN SMALL LETTER B +0061 11D97 05B0 094D 3099 0062;0061 3099 11D97 094D 05B0 0062;0061 3099 11D97 094D 05B0 0062;0061 3099 11D97 094D 05B0 0062;0061 3099 11D97 094D 05B0 0062; # (a◌𑶗◌ְ◌्◌゙b; a◌゙◌𑶗◌्◌ְb; a◌゙◌𑶗◌्◌ְb; a◌゙◌𑶗◌्◌ְb; a◌゙◌𑶗◌्◌ְb; ) LATIN SMALL LETTER A, GUNJALA GONDI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11F41 0062;0061 3099 094D 11F41 05B0 0062;0061 3099 094D 11F41 05B0 0062;0061 3099 094D 11F41 05B0 0062;0061 3099 094D 11F41 05B0 0062; # (a◌ְ◌्◌゙𑽁b; a◌゙◌्𑽁◌ְb; a◌゙◌्𑽁◌ְb; a◌゙◌्𑽁◌ְb; a◌゙◌्𑽁◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KAWI SIGN KILLER, LATIN SMALL LETTER B +0061 11F41 05B0 094D 3099 0062;0061 3099 11F41 094D 05B0 0062;0061 3099 11F41 094D 05B0 0062;0061 3099 11F41 094D 05B0 0062;0061 3099 11F41 094D 05B0 0062; # (a𑽁◌ְ◌्◌゙b; a◌゙𑽁◌्◌ְb; a◌゙𑽁◌्◌ְb; a◌゙𑽁◌्◌ְb; a◌゙𑽁◌्◌ְb; ) LATIN SMALL LETTER A, KAWI SIGN KILLER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 05B0 094D 3099 11F42 0062;0061 3099 094D 11F42 05B0 0062;0061 3099 094D 11F42 05B0 0062;0061 3099 094D 11F42 05B0 0062;0061 3099 094D 11F42 05B0 0062; # (a◌ְ◌्◌゙◌𑽂b; a◌゙◌्◌𑽂◌ְb; a◌゙◌्◌𑽂◌ְb; a◌゙◌्◌𑽂◌ְb; a◌゙◌्◌𑽂◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KAWI CONJOINER, LATIN SMALL LETTER B +0061 11F42 05B0 094D 3099 0062;0061 3099 11F42 094D 05B0 0062;0061 3099 11F42 094D 05B0 0062;0061 3099 11F42 094D 05B0 0062;0061 3099 11F42 094D 05B0 0062; # (a◌𑽂◌ְ◌्◌゙b; a◌゙◌𑽂◌्◌ְb; a◌゙◌𑽂◌्◌ְb; a◌゙◌𑽂◌्◌ְb; a◌゙◌𑽂◌्◌ְb; ) LATIN SMALL LETTER A, KAWI CONJOINER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B +0061 16FF0 0334 16AF0 0062;0061 0334 16AF0 16FF0 0062;0061 0334 16AF0 16FF0 0062;0061 0334 16AF0 16FF0 0062;0061 0334 16AF0 16FF0 0062; # (a𖿰◌̴◌𖫰b; a◌̴◌𖫰𖿰b; a◌̴◌𖫰𖿰b; a◌̴◌𖫰𖿰b; a◌̴◌𖫰𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING HIGH TONE, LATIN SMALL LETTER B +0061 16AF0 16FF0 0334 0062;0061 16AF0 0334 16FF0 0062;0061 16AF0 0334 16FF0 0062;0061 16AF0 0334 16FF0 0062;0061 16AF0 0334 16FF0 0062; # (a◌𖫰𖿰◌̴b; a◌𖫰◌̴𖿰b; a◌𖫰◌̴𖿰b; a◌𖫰◌̴𖿰b; a◌𖫰◌̴𖿰b; ) LATIN SMALL LETTER A, BASSA VAH COMBINING HIGH TONE, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 16AF1 0062;0061 0334 16AF1 16FF0 0062;0061 0334 16AF1 16FF0 0062;0061 0334 16AF1 16FF0 0062;0061 0334 16AF1 16FF0 0062; # (a𖿰◌̴◌𖫱b; a◌̴◌𖫱𖿰b; a◌̴◌𖫱𖿰b; a◌̴◌𖫱𖿰b; a◌̴◌𖫱𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING LOW TONE, LATIN SMALL LETTER B +0061 16AF1 16FF0 0334 0062;0061 16AF1 0334 16FF0 0062;0061 16AF1 0334 16FF0 0062;0061 16AF1 0334 16FF0 0062;0061 16AF1 0334 16FF0 0062; # (a◌𖫱𖿰◌̴b; a◌𖫱◌̴𖿰b; a◌𖫱◌̴𖿰b; a◌𖫱◌̴𖿰b; a◌𖫱◌̴𖿰b; ) LATIN SMALL LETTER A, BASSA VAH COMBINING LOW TONE, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 16AF2 0062;0061 0334 16AF2 16FF0 0062;0061 0334 16AF2 16FF0 0062;0061 0334 16AF2 16FF0 0062;0061 0334 16AF2 16FF0 0062; # (a𖿰◌̴◌𖫲b; a◌̴◌𖫲𖿰b; a◌̴◌𖫲𖿰b; a◌̴◌𖫲𖿰b; a◌̴◌𖫲𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING MID TONE, LATIN SMALL LETTER B +0061 16AF2 16FF0 0334 0062;0061 16AF2 0334 16FF0 0062;0061 16AF2 0334 16FF0 0062;0061 16AF2 0334 16FF0 0062;0061 16AF2 0334 16FF0 0062; # (a◌𖫲𖿰◌̴b; a◌𖫲◌̴𖿰b; a◌𖫲◌̴𖿰b; a◌𖫲◌̴𖿰b; a◌𖫲◌̴𖿰b; ) LATIN SMALL LETTER A, BASSA VAH COMBINING MID TONE, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 16AF3 0062;0061 0334 16AF3 16FF0 0062;0061 0334 16AF3 16FF0 0062;0061 0334 16AF3 16FF0 0062;0061 0334 16AF3 16FF0 0062; # (a𖿰◌̴◌𖫳b; a◌̴◌𖫳𖿰b; a◌̴◌𖫳𖿰b; a◌̴◌𖫳𖿰b; a◌̴◌𖫳𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING LOW-MID TONE, LATIN SMALL LETTER B +0061 16AF3 16FF0 0334 0062;0061 16AF3 0334 16FF0 0062;0061 16AF3 0334 16FF0 0062;0061 16AF3 0334 16FF0 0062;0061 16AF3 0334 16FF0 0062; # (a◌𖫳𖿰◌̴b; a◌𖫳◌̴𖿰b; a◌𖫳◌̴𖿰b; a◌𖫳◌̴𖿰b; a◌𖫳◌̴𖿰b; ) LATIN SMALL LETTER A, BASSA VAH COMBINING LOW-MID TONE, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 16AF4 0062;0061 0334 16AF4 16FF0 0062;0061 0334 16AF4 16FF0 0062;0061 0334 16AF4 16FF0 0062;0061 0334 16AF4 16FF0 0062; # (a𖿰◌̴◌𖫴b; a◌̴◌𖫴𖿰b; a◌̴◌𖫴𖿰b; a◌̴◌𖫴𖿰b; a◌̴◌𖫴𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, BASSA VAH COMBINING HIGH-LOW TONE, LATIN SMALL LETTER B +0061 16AF4 16FF0 0334 0062;0061 16AF4 0334 16FF0 0062;0061 16AF4 0334 16FF0 0062;0061 16AF4 0334 16FF0 0062;0061 16AF4 0334 16FF0 0062; # (a◌𖫴𖿰◌̴b; a◌𖫴◌̴𖿰b; a◌𖫴◌̴𖿰b; a◌𖫴◌̴𖿰b; a◌𖫴◌̴𖿰b; ) LATIN SMALL LETTER A, BASSA VAH COMBINING HIGH-LOW TONE, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 0315 0300 05AE 16B30 0062;00E0 05AE 16B30 0315 0062;0061 05AE 0300 16B30 0315 0062;00E0 05AE 16B30 0315 0062;0061 05AE 0300 16B30 0315 0062; # (a◌̕◌̀◌֮◌𖬰b; à◌֮◌𖬰◌̕b; a◌֮◌̀◌𖬰◌̕b; à◌֮◌𖬰◌̕b; a◌֮◌̀◌𖬰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, PAHAWH HMONG MARK CIM TUB, LATIN SMALL LETTER B +0061 16B30 0315 0300 05AE 0062;0061 05AE 16B30 0300 0315 0062;0061 05AE 16B30 0300 0315 0062;0061 05AE 16B30 0300 0315 0062;0061 05AE 16B30 0300 0315 0062; # (a◌𖬰◌̕◌̀◌֮b; a◌֮◌𖬰◌̀◌̕b; a◌֮◌𖬰◌̀◌̕b; a◌֮◌𖬰◌̀◌̕b; a◌֮◌𖬰◌̀◌̕b; ) LATIN SMALL LETTER A, PAHAWH HMONG MARK CIM TUB, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 16B31 0062;00E0 05AE 16B31 0315 0062;0061 05AE 0300 16B31 0315 0062;00E0 05AE 16B31 0315 0062;0061 05AE 0300 16B31 0315 0062; # (a◌̕◌̀◌֮◌𖬱b; à◌֮◌𖬱◌̕b; a◌֮◌̀◌𖬱◌̕b; à◌֮◌𖬱◌̕b; a◌֮◌̀◌𖬱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, PAHAWH HMONG MARK CIM SO, LATIN SMALL LETTER B +0061 16B31 0315 0300 05AE 0062;0061 05AE 16B31 0300 0315 0062;0061 05AE 16B31 0300 0315 0062;0061 05AE 16B31 0300 0315 0062;0061 05AE 16B31 0300 0315 0062; # (a◌𖬱◌̕◌̀◌֮b; a◌֮◌𖬱◌̀◌̕b; a◌֮◌𖬱◌̀◌̕b; a◌֮◌𖬱◌̀◌̕b; a◌֮◌𖬱◌̀◌̕b; ) LATIN SMALL LETTER A, PAHAWH HMONG MARK CIM SO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 16B32 0062;00E0 05AE 16B32 0315 0062;0061 05AE 0300 16B32 0315 0062;00E0 05AE 16B32 0315 0062;0061 05AE 0300 16B32 0315 0062; # (a◌̕◌̀◌֮◌𖬲b; à◌֮◌𖬲◌̕b; a◌֮◌̀◌𖬲◌̕b; à◌֮◌𖬲◌̕b; a◌֮◌̀◌𖬲◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, PAHAWH HMONG MARK CIM KES, LATIN SMALL LETTER B +0061 16B32 0315 0300 05AE 0062;0061 05AE 16B32 0300 0315 0062;0061 05AE 16B32 0300 0315 0062;0061 05AE 16B32 0300 0315 0062;0061 05AE 16B32 0300 0315 0062; # (a◌𖬲◌̕◌̀◌֮b; a◌֮◌𖬲◌̀◌̕b; a◌֮◌𖬲◌̀◌̕b; a◌֮◌𖬲◌̀◌̕b; a◌֮◌𖬲◌̀◌̕b; ) LATIN SMALL LETTER A, PAHAWH HMONG MARK CIM KES, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 16B33 0062;00E0 05AE 16B33 0315 0062;0061 05AE 0300 16B33 0315 0062;00E0 05AE 16B33 0315 0062;0061 05AE 0300 16B33 0315 0062; # (a◌̕◌̀◌֮◌𖬳b; à◌֮◌𖬳◌̕b; a◌֮◌̀◌𖬳◌̕b; à◌֮◌𖬳◌̕b; a◌֮◌̀◌𖬳◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, PAHAWH HMONG MARK CIM KHAV, LATIN SMALL LETTER B +0061 16B33 0315 0300 05AE 0062;0061 05AE 16B33 0300 0315 0062;0061 05AE 16B33 0300 0315 0062;0061 05AE 16B33 0300 0315 0062;0061 05AE 16B33 0300 0315 0062; # (a◌𖬳◌̕◌̀◌֮b; a◌֮◌𖬳◌̀◌̕b; a◌֮◌𖬳◌̀◌̕b; a◌֮◌𖬳◌̀◌̕b; a◌֮◌𖬳◌̀◌̕b; ) LATIN SMALL LETTER A, PAHAWH HMONG MARK CIM KHAV, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 16B34 0062;00E0 05AE 16B34 0315 0062;0061 05AE 0300 16B34 0315 0062;00E0 05AE 16B34 0315 0062;0061 05AE 0300 16B34 0315 0062; # (a◌̕◌̀◌֮◌𖬴b; à◌֮◌𖬴◌̕b; a◌֮◌̀◌𖬴◌̕b; à◌֮◌𖬴◌̕b; a◌֮◌̀◌𖬴◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, PAHAWH HMONG MARK CIM SUAM, LATIN SMALL LETTER B +0061 16B34 0315 0300 05AE 0062;0061 05AE 16B34 0300 0315 0062;0061 05AE 16B34 0300 0315 0062;0061 05AE 16B34 0300 0315 0062;0061 05AE 16B34 0300 0315 0062; # (a◌𖬴◌̕◌̀◌֮b; a◌֮◌𖬴◌̀◌̕b; a◌֮◌𖬴◌̀◌̕b; a◌֮◌𖬴◌̀◌̕b; a◌֮◌𖬴◌̀◌̕b; ) LATIN SMALL LETTER A, PAHAWH HMONG MARK CIM SUAM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 16B35 0062;00E0 05AE 16B35 0315 0062;0061 05AE 0300 16B35 0315 0062;00E0 05AE 16B35 0315 0062;0061 05AE 0300 16B35 0315 0062; # (a◌̕◌̀◌֮◌𖬵b; à◌֮◌𖬵◌̕b; a◌֮◌̀◌𖬵◌̕b; à◌֮◌𖬵◌̕b; a◌֮◌̀◌𖬵◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, PAHAWH HMONG MARK CIM HOM, LATIN SMALL LETTER B +0061 16B35 0315 0300 05AE 0062;0061 05AE 16B35 0300 0315 0062;0061 05AE 16B35 0300 0315 0062;0061 05AE 16B35 0300 0315 0062;0061 05AE 16B35 0300 0315 0062; # (a◌𖬵◌̕◌̀◌֮b; a◌֮◌𖬵◌̀◌̕b; a◌֮◌𖬵◌̀◌̕b; a◌֮◌𖬵◌̀◌̕b; a◌֮◌𖬵◌̀◌̕b; ) LATIN SMALL LETTER A, PAHAWH HMONG MARK CIM HOM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 16B36 0062;00E0 05AE 16B36 0315 0062;0061 05AE 0300 16B36 0315 0062;00E0 05AE 16B36 0315 0062;0061 05AE 0300 16B36 0315 0062; # (a◌̕◌̀◌֮◌𖬶b; à◌֮◌𖬶◌̕b; a◌֮◌̀◌𖬶◌̕b; à◌֮◌𖬶◌̕b; a◌֮◌̀◌𖬶◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, PAHAWH HMONG MARK CIM TAUM, LATIN SMALL LETTER B +0061 16B36 0315 0300 05AE 0062;0061 05AE 16B36 0300 0315 0062;0061 05AE 16B36 0300 0315 0062;0061 05AE 16B36 0300 0315 0062;0061 05AE 16B36 0300 0315 0062; # (a◌𖬶◌̕◌̀◌֮b; a◌֮◌𖬶◌̀◌̕b; a◌֮◌𖬶◌̀◌̕b; a◌֮◌𖬶◌̀◌̕b; a◌֮◌𖬶◌̀◌̕b; ) LATIN SMALL LETTER A, PAHAWH HMONG MARK CIM TAUM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 093C 16FF0 0334 16FF0 0062;0061 0334 16FF0 16FF0 093C 0062;0061 0334 16FF0 16FF0 093C 0062;0061 0334 16FF0 16FF0 093C 0062;0061 0334 16FF0 16FF0 093C 0062; # (a◌𖿰़◌̴𖿰b; a◌̴𖿰𖿰◌़b; a◌̴𖿰𖿰◌़b; a◌̴𖿰𖿰◌़b; a◌̴𖿰𖿰◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +0061 16FF0 093C 16FF0 0334 0062;0061 0334 16FF0 16FF0 093C 0062;0061 0334 16FF0 16FF0 093C 0062;0061 0334 16FF0 16FF0 093C 0062;0061 0334 16FF0 16FF0 093C 0062; # (a𖿰◌𖿰़◌̴b; a◌̴𖿰𖿰◌़b; a◌̴𖿰𖿰◌़b; a◌̴𖿰𖿰◌़b; a◌̴𖿰𖿰◌़b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 093C 16FF0 0334 16FF1 0062;0061 0334 16FF0 16FF1 093C 0062;0061 0334 16FF0 16FF1 093C 0062;0061 0334 16FF0 16FF1 093C 0062;0061 0334 16FF0 16FF1 093C 0062; # (a◌𖿰़◌̴𖿱b; a◌̴𖿰𖿱◌़b; a◌̴𖿰𖿱◌़b; a◌̴𖿰𖿱◌़b; a◌̴𖿰𖿱◌़b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VIETNAMESE ALTERNATE READING MARK NHAY, LATIN SMALL LETTER B +0061 16FF1 093C 16FF0 0334 0062;0061 0334 16FF1 16FF0 093C 0062;0061 0334 16FF1 16FF0 093C 0062;0061 0334 16FF1 16FF0 093C 0062;0061 0334 16FF1 16FF0 093C 0062; # (a𖿱◌𖿰़◌̴b; a◌̴𖿱𖿰◌़b; a◌̴𖿱𖿰◌़b; a◌̴𖿱𖿰◌़b; a◌̴𖿱𖿰◌़b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK NHAY, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 1BC9E 0062;0061 0334 1BC9E 16FF0 0062;0061 0334 1BC9E 16FF0 0062;0061 0334 1BC9E 16FF0 0062;0061 0334 1BC9E 16FF0 0062; # (a𖿰◌̴◌𛲞b; a◌̴◌𛲞𖿰b; a◌̴◌𛲞𖿰b; a◌̴◌𛲞𖿰b; a◌̴◌𛲞𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, DUPLOYAN DOUBLE MARK, LATIN SMALL LETTER B +0061 1BC9E 16FF0 0334 0062;0061 1BC9E 0334 16FF0 0062;0061 1BC9E 0334 16FF0 0062;0061 1BC9E 0334 16FF0 0062;0061 1BC9E 0334 16FF0 0062; # (a◌𛲞𖿰◌̴b; a◌𛲞◌̴𖿰b; a◌𛲞◌̴𖿰b; a◌𛲞◌̴𖿰b; a◌𛲞◌̴𖿰b; ) LATIN SMALL LETTER A, DUPLOYAN DOUBLE MARK, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 1DFA 031B 1DCE 1D165 0062;0061 1DCE 031B 1D165 1DFA 0062;0061 1DCE 031B 1D165 1DFA 0062;0061 1DCE 031B 1D165 1DFA 0062;0061 1DCE 031B 1D165 1DFA 0062; # (a◌᷺◌̛◌᷎𝅥b; a◌᷎◌̛𝅥◌᷺b; a◌᷎◌̛𝅥◌᷺b; a◌᷎◌̛𝅥◌᷺b; a◌᷎◌̛𝅥◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING STEM, LATIN SMALL LETTER B +0061 1D165 1DFA 031B 1DCE 0062;0061 1DCE 1D165 031B 1DFA 0062;0061 1DCE 1D165 031B 1DFA 0062;0061 1DCE 1D165 031B 1DFA 0062;0061 1DCE 1D165 031B 1DFA 0062; # (a𝅥◌᷺◌̛◌᷎b; a◌᷎𝅥◌̛◌᷺b; a◌᷎𝅥◌̛◌᷺b; a◌᷎𝅥◌̛◌᷺b; a◌᷎𝅥◌̛◌᷺b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STEM, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B +0061 1DFA 031B 1DCE 1D166 0062;0061 1DCE 031B 1D166 1DFA 0062;0061 1DCE 031B 1D166 1DFA 0062;0061 1DCE 031B 1D166 1DFA 0062;0061 1DCE 031B 1D166 1DFA 0062; # (a◌᷺◌̛◌᷎𝅦b; a◌᷎◌̛𝅦◌᷺b; a◌᷎◌̛𝅦◌᷺b; a◌᷎◌̛𝅦◌᷺b; a◌᷎◌̛𝅦◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING SPRECHGESANG STEM, LATIN SMALL LETTER B +0061 1D166 1DFA 031B 1DCE 0062;0061 1DCE 1D166 031B 1DFA 0062;0061 1DCE 1D166 031B 1DFA 0062;0061 1DCE 1D166 031B 1DFA 0062;0061 1DCE 1D166 031B 1DFA 0062; # (a𝅦◌᷺◌̛◌᷎b; a◌᷎𝅦◌̛◌᷺b; a◌᷎𝅦◌̛◌᷺b; a◌᷎𝅦◌̛◌᷺b; a◌᷎𝅦◌̛◌᷺b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING SPRECHGESANG STEM, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B +0061 16FF0 0334 1D167 0062;0061 0334 1D167 16FF0 0062;0061 0334 1D167 16FF0 0062;0061 0334 1D167 16FF0 0062;0061 0334 1D167 16FF0 0062; # (a𖿰◌̴◌𝅧b; a◌̴◌𝅧𖿰b; a◌̴◌𝅧𖿰b; a◌̴◌𝅧𖿰b; a◌̴◌𝅧𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, MUSICAL SYMBOL COMBINING TREMOLO-1, LATIN SMALL LETTER B +0061 1D167 16FF0 0334 0062;0061 1D167 0334 16FF0 0062;0061 1D167 0334 16FF0 0062;0061 1D167 0334 16FF0 0062;0061 1D167 0334 16FF0 0062; # (a◌𝅧𖿰◌̴b; a◌𝅧◌̴𖿰b; a◌𝅧◌̴𖿰b; a◌𝅧◌̴𖿰b; a◌𝅧◌̴𖿰b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TREMOLO-1, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 1D168 0062;0061 0334 1D168 16FF0 0062;0061 0334 1D168 16FF0 0062;0061 0334 1D168 16FF0 0062;0061 0334 1D168 16FF0 0062; # (a𖿰◌̴◌𝅨b; a◌̴◌𝅨𖿰b; a◌̴◌𝅨𖿰b; a◌̴◌𝅨𖿰b; a◌̴◌𝅨𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, MUSICAL SYMBOL COMBINING TREMOLO-2, LATIN SMALL LETTER B +0061 1D168 16FF0 0334 0062;0061 1D168 0334 16FF0 0062;0061 1D168 0334 16FF0 0062;0061 1D168 0334 16FF0 0062;0061 1D168 0334 16FF0 0062; # (a◌𝅨𖿰◌̴b; a◌𝅨◌̴𖿰b; a◌𝅨◌̴𖿰b; a◌𝅨◌̴𖿰b; a◌𝅨◌̴𖿰b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TREMOLO-2, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 16FF0 0334 1D169 0062;0061 0334 1D169 16FF0 0062;0061 0334 1D169 16FF0 0062;0061 0334 1D169 16FF0 0062;0061 0334 1D169 16FF0 0062; # (a𖿰◌̴◌𝅩b; a◌̴◌𝅩𖿰b; a◌̴◌𝅩𖿰b; a◌̴◌𝅩𖿰b; a◌̴◌𝅩𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, MUSICAL SYMBOL COMBINING TREMOLO-3, LATIN SMALL LETTER B +0061 1D169 16FF0 0334 0062;0061 1D169 0334 16FF0 0062;0061 1D169 0334 16FF0 0062;0061 1D169 0334 16FF0 0062;0061 1D169 0334 16FF0 0062; # (a◌𝅩𖿰◌̴b; a◌𝅩◌̴𖿰b; a◌𝅩◌̴𖿰b; a◌𝅩◌̴𖿰b; a◌𝅩◌̴𖿰b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TREMOLO-3, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B +0061 05AE 1D16D 302E 1D16D 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062; # (a◌〮𝅭𝅭֮b; a〮𝅭𝅭◌֮b; a〮𝅭𝅭◌֮b; a〮𝅭𝅭◌֮b; a〮𝅭𝅭◌֮b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B +0061 1D16D 05AE 1D16D 302E 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062; # (a𝅭◌〮𝅭֮b; a〮𝅭𝅭◌֮b; a〮𝅭𝅭◌֮b; a〮𝅭𝅭◌֮b; a〮𝅭𝅭◌֮b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, LATIN SMALL LETTER B +0061 1DFA 031B 1DCE 1D16E 0062;0061 1DCE 031B 1D16E 1DFA 0062;0061 1DCE 031B 1D16E 1DFA 0062;0061 1DCE 031B 1D16E 1DFA 0062;0061 1DCE 031B 1D16E 1DFA 0062; # (a◌᷺◌̛◌᷎𝅮b; a◌᷎◌̛𝅮◌᷺b; a◌᷎◌̛𝅮◌᷺b; a◌᷎◌̛𝅮◌᷺b; a◌᷎◌̛𝅮◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-1, LATIN SMALL LETTER B +0061 1D16E 1DFA 031B 1DCE 0062;0061 1DCE 1D16E 031B 1DFA 0062;0061 1DCE 1D16E 031B 1DFA 0062;0061 1DCE 1D16E 031B 1DFA 0062;0061 1DCE 1D16E 031B 1DFA 0062; # (a𝅮◌᷺◌̛◌᷎b; a◌᷎𝅮◌̛◌᷺b; a◌᷎𝅮◌̛◌᷺b; a◌᷎𝅮◌̛◌᷺b; a◌᷎𝅮◌̛◌᷺b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-1, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B +0061 1DFA 031B 1DCE 1D16F 0062;0061 1DCE 031B 1D16F 1DFA 0062;0061 1DCE 031B 1D16F 1DFA 0062;0061 1DCE 031B 1D16F 1DFA 0062;0061 1DCE 031B 1D16F 1DFA 0062; # (a◌᷺◌̛◌᷎𝅯b; a◌᷎◌̛𝅯◌᷺b; a◌᷎◌̛𝅯◌᷺b; a◌᷎◌̛𝅯◌᷺b; a◌᷎◌̛𝅯◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-2, LATIN SMALL LETTER B +0061 1D16F 1DFA 031B 1DCE 0062;0061 1DCE 1D16F 031B 1DFA 0062;0061 1DCE 1D16F 031B 1DFA 0062;0061 1DCE 1D16F 031B 1DFA 0062;0061 1DCE 1D16F 031B 1DFA 0062; # (a𝅯◌᷺◌̛◌᷎b; a◌᷎𝅯◌̛◌᷺b; a◌᷎𝅯◌̛◌᷺b; a◌᷎𝅯◌̛◌᷺b; a◌᷎𝅯◌̛◌᷺b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-2, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B +0061 1DFA 031B 1DCE 1D170 0062;0061 1DCE 031B 1D170 1DFA 0062;0061 1DCE 031B 1D170 1DFA 0062;0061 1DCE 031B 1D170 1DFA 0062;0061 1DCE 031B 1D170 1DFA 0062; # (a◌᷺◌̛◌᷎𝅰b; a◌᷎◌̛𝅰◌᷺b; a◌᷎◌̛𝅰◌᷺b; a◌᷎◌̛𝅰◌᷺b; a◌᷎◌̛𝅰◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-3, LATIN SMALL LETTER B +0061 1D170 1DFA 031B 1DCE 0062;0061 1DCE 1D170 031B 1DFA 0062;0061 1DCE 1D170 031B 1DFA 0062;0061 1DCE 1D170 031B 1DFA 0062;0061 1DCE 1D170 031B 1DFA 0062; # (a𝅰◌᷺◌̛◌᷎b; a◌᷎𝅰◌̛◌᷺b; a◌᷎𝅰◌̛◌᷺b; a◌᷎𝅰◌̛◌᷺b; a◌᷎𝅰◌̛◌᷺b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-3, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B +0061 1DFA 031B 1DCE 1D171 0062;0061 1DCE 031B 1D171 1DFA 0062;0061 1DCE 031B 1D171 1DFA 0062;0061 1DCE 031B 1D171 1DFA 0062;0061 1DCE 031B 1D171 1DFA 0062; # (a◌᷺◌̛◌᷎𝅱b; a◌᷎◌̛𝅱◌᷺b; a◌᷎◌̛𝅱◌᷺b; a◌᷎◌̛𝅱◌᷺b; a◌᷎◌̛𝅱◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-4, LATIN SMALL LETTER B +0061 1D171 1DFA 031B 1DCE 0062;0061 1DCE 1D171 031B 1DFA 0062;0061 1DCE 1D171 031B 1DFA 0062;0061 1DCE 1D171 031B 1DFA 0062;0061 1DCE 1D171 031B 1DFA 0062; # (a𝅱◌᷺◌̛◌᷎b; a◌᷎𝅱◌̛◌᷺b; a◌᷎𝅱◌̛◌᷺b; a◌᷎𝅱◌̛◌᷺b; a◌᷎𝅱◌̛◌᷺b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-4, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B +0061 1DFA 031B 1DCE 1D172 0062;0061 1DCE 031B 1D172 1DFA 0062;0061 1DCE 031B 1D172 1DFA 0062;0061 1DCE 031B 1D172 1DFA 0062;0061 1DCE 031B 1D172 1DFA 0062; # (a◌᷺◌̛◌᷎𝅲b; a◌᷎◌̛𝅲◌᷺b; a◌᷎◌̛𝅲◌᷺b; a◌᷎◌̛𝅲◌᷺b; a◌᷎◌̛𝅲◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-5, LATIN SMALL LETTER B +0061 1D172 1DFA 031B 1DCE 0062;0061 1DCE 1D172 031B 1DFA 0062;0061 1DCE 1D172 031B 1DFA 0062;0061 1DCE 1D172 031B 1DFA 0062;0061 1DCE 1D172 031B 1DFA 0062; # (a𝅲◌᷺◌̛◌᷎b; a◌᷎𝅲◌̛◌᷺b; a◌᷎𝅲◌̛◌᷺b; a◌᷎𝅲◌̛◌᷺b; a◌᷎𝅲◌̛◌᷺b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-5, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1D17B 0062;0061 1DFA 0316 1D17B 059A 0062;0061 1DFA 0316 1D17B 059A 0062;0061 1DFA 0316 1D17B 059A 0062;0061 1DFA 0316 1D17B 059A 0062; # (a◌֚◌̖◌᷺◌𝅻b; a◌᷺◌̖◌𝅻◌֚b; a◌᷺◌̖◌𝅻◌֚b; a◌᷺◌̖◌𝅻◌֚b; a◌᷺◌̖◌𝅻◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING ACCENT, LATIN SMALL LETTER B +0061 1D17B 059A 0316 1DFA 0062;0061 1DFA 1D17B 0316 059A 0062;0061 1DFA 1D17B 0316 059A 0062;0061 1DFA 1D17B 0316 059A 0062;0061 1DFA 1D17B 0316 059A 0062; # (a◌𝅻◌֚◌̖◌᷺b; a◌᷺◌𝅻◌̖◌֚b; a◌᷺◌𝅻◌̖◌֚b; a◌᷺◌𝅻◌̖◌֚b; a◌᷺◌𝅻◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING ACCENT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1D17C 0062;0061 1DFA 0316 1D17C 059A 0062;0061 1DFA 0316 1D17C 059A 0062;0061 1DFA 0316 1D17C 059A 0062;0061 1DFA 0316 1D17C 059A 0062; # (a◌֚◌̖◌᷺◌𝅼b; a◌᷺◌̖◌𝅼◌֚b; a◌᷺◌̖◌𝅼◌֚b; a◌᷺◌̖◌𝅼◌֚b; a◌᷺◌̖◌𝅼◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING STACCATO, LATIN SMALL LETTER B +0061 1D17C 059A 0316 1DFA 0062;0061 1DFA 1D17C 0316 059A 0062;0061 1DFA 1D17C 0316 059A 0062;0061 1DFA 1D17C 0316 059A 0062;0061 1DFA 1D17C 0316 059A 0062; # (a◌𝅼◌֚◌̖◌᷺b; a◌᷺◌𝅼◌̖◌֚b; a◌᷺◌𝅼◌̖◌֚b; a◌᷺◌𝅼◌̖◌֚b; a◌᷺◌𝅼◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1D17D 0062;0061 1DFA 0316 1D17D 059A 0062;0061 1DFA 0316 1D17D 059A 0062;0061 1DFA 0316 1D17D 059A 0062;0061 1DFA 0316 1D17D 059A 0062; # (a◌֚◌̖◌᷺◌𝅽b; a◌᷺◌̖◌𝅽◌֚b; a◌᷺◌̖◌𝅽◌֚b; a◌᷺◌̖◌𝅽◌֚b; a◌᷺◌̖◌𝅽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING TENUTO, LATIN SMALL LETTER B +0061 1D17D 059A 0316 1DFA 0062;0061 1DFA 1D17D 0316 059A 0062;0061 1DFA 1D17D 0316 059A 0062;0061 1DFA 1D17D 0316 059A 0062;0061 1DFA 1D17D 0316 059A 0062; # (a◌𝅽◌֚◌̖◌᷺b; a◌᷺◌𝅽◌̖◌֚b; a◌᷺◌𝅽◌̖◌֚b; a◌᷺◌𝅽◌̖◌֚b; a◌᷺◌𝅽◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TENUTO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1D17E 0062;0061 1DFA 0316 1D17E 059A 0062;0061 1DFA 0316 1D17E 059A 0062;0061 1DFA 0316 1D17E 059A 0062;0061 1DFA 0316 1D17E 059A 0062; # (a◌֚◌̖◌᷺◌𝅾b; a◌᷺◌̖◌𝅾◌֚b; a◌᷺◌̖◌𝅾◌֚b; a◌᷺◌̖◌𝅾◌֚b; a◌᷺◌̖◌𝅾◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING STACCATISSIMO, LATIN SMALL LETTER B +0061 1D17E 059A 0316 1DFA 0062;0061 1DFA 1D17E 0316 059A 0062;0061 1DFA 1D17E 0316 059A 0062;0061 1DFA 1D17E 0316 059A 0062;0061 1DFA 1D17E 0316 059A 0062; # (a◌𝅾◌֚◌̖◌᷺b; a◌᷺◌𝅾◌̖◌֚b; a◌᷺◌𝅾◌̖◌֚b; a◌᷺◌𝅾◌̖◌֚b; a◌᷺◌𝅾◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STACCATISSIMO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1D17F 0062;0061 1DFA 0316 1D17F 059A 0062;0061 1DFA 0316 1D17F 059A 0062;0061 1DFA 0316 1D17F 059A 0062;0061 1DFA 0316 1D17F 059A 0062; # (a◌֚◌̖◌᷺◌𝅿b; a◌᷺◌̖◌𝅿◌֚b; a◌᷺◌̖◌𝅿◌֚b; a◌᷺◌̖◌𝅿◌֚b; a◌᷺◌̖◌𝅿◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING MARCATO, LATIN SMALL LETTER B +0061 1D17F 059A 0316 1DFA 0062;0061 1DFA 1D17F 0316 059A 0062;0061 1DFA 1D17F 0316 059A 0062;0061 1DFA 1D17F 0316 059A 0062;0061 1DFA 1D17F 0316 059A 0062; # (a◌𝅿◌֚◌̖◌᷺b; a◌᷺◌𝅿◌̖◌֚b; a◌᷺◌𝅿◌̖◌֚b; a◌᷺◌𝅿◌̖◌֚b; a◌᷺◌𝅿◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING MARCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1D180 0062;0061 1DFA 0316 1D180 059A 0062;0061 1DFA 0316 1D180 059A 0062;0061 1DFA 0316 1D180 059A 0062;0061 1DFA 0316 1D180 059A 0062; # (a◌֚◌̖◌᷺◌𝆀b; a◌᷺◌̖◌𝆀◌֚b; a◌᷺◌̖◌𝆀◌֚b; a◌᷺◌̖◌𝆀◌֚b; a◌᷺◌̖◌𝆀◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING MARCATO-STACCATO, LATIN SMALL LETTER B +0061 1D180 059A 0316 1DFA 0062;0061 1DFA 1D180 0316 059A 0062;0061 1DFA 1D180 0316 059A 0062;0061 1DFA 1D180 0316 059A 0062;0061 1DFA 1D180 0316 059A 0062; # (a◌𝆀◌֚◌̖◌᷺b; a◌᷺◌𝆀◌̖◌֚b; a◌᷺◌𝆀◌̖◌֚b; a◌᷺◌𝆀◌̖◌֚b; a◌᷺◌𝆀◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING MARCATO-STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1D181 0062;0061 1DFA 0316 1D181 059A 0062;0061 1DFA 0316 1D181 059A 0062;0061 1DFA 0316 1D181 059A 0062;0061 1DFA 0316 1D181 059A 0062; # (a◌֚◌̖◌᷺◌𝆁b; a◌᷺◌̖◌𝆁◌֚b; a◌᷺◌̖◌𝆁◌֚b; a◌᷺◌̖◌𝆁◌֚b; a◌᷺◌̖◌𝆁◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING ACCENT-STACCATO, LATIN SMALL LETTER B +0061 1D181 059A 0316 1DFA 0062;0061 1DFA 1D181 0316 059A 0062;0061 1DFA 1D181 0316 059A 0062;0061 1DFA 1D181 0316 059A 0062;0061 1DFA 1D181 0316 059A 0062; # (a◌𝆁◌֚◌̖◌᷺b; a◌᷺◌𝆁◌̖◌֚b; a◌᷺◌𝆁◌̖◌֚b; a◌᷺◌𝆁◌̖◌֚b; a◌᷺◌𝆁◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING ACCENT-STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1D182 0062;0061 1DFA 0316 1D182 059A 0062;0061 1DFA 0316 1D182 059A 0062;0061 1DFA 0316 1D182 059A 0062;0061 1DFA 0316 1D182 059A 0062; # (a◌֚◌̖◌᷺◌𝆂b; a◌᷺◌̖◌𝆂◌֚b; a◌᷺◌̖◌𝆂◌֚b; a◌᷺◌̖◌𝆂◌֚b; a◌᷺◌̖◌𝆂◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING LOURE, LATIN SMALL LETTER B +0061 1D182 059A 0316 1DFA 0062;0061 1DFA 1D182 0316 059A 0062;0061 1DFA 1D182 0316 059A 0062;0061 1DFA 1D182 0316 059A 0062;0061 1DFA 1D182 0316 059A 0062; # (a◌𝆂◌֚◌̖◌᷺b; a◌᷺◌𝆂◌̖◌֚b; a◌᷺◌𝆂◌̖◌֚b; a◌᷺◌𝆂◌̖◌֚b; a◌᷺◌𝆂◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING LOURE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D185 0062;00E0 05AE 1D185 0315 0062;0061 05AE 0300 1D185 0315 0062;00E0 05AE 1D185 0315 0062;0061 05AE 0300 1D185 0315 0062; # (a◌̕◌̀◌֮◌𝆅b; à◌֮◌𝆅◌̕b; a◌֮◌̀◌𝆅◌̕b; à◌֮◌𝆅◌̕b; a◌֮◌̀◌𝆅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING DOIT, LATIN SMALL LETTER B +0061 1D185 0315 0300 05AE 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062; # (a◌𝆅◌̕◌̀◌֮b; a◌֮◌𝆅◌̀◌̕b; a◌֮◌𝆅◌̀◌̕b; a◌֮◌𝆅◌̀◌̕b; a◌֮◌𝆅◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING DOIT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D186 0062;00E0 05AE 1D186 0315 0062;0061 05AE 0300 1D186 0315 0062;00E0 05AE 1D186 0315 0062;0061 05AE 0300 1D186 0315 0062; # (a◌̕◌̀◌֮◌𝆆b; à◌֮◌𝆆◌̕b; a◌֮◌̀◌𝆆◌̕b; à◌֮◌𝆆◌̕b; a◌֮◌̀◌𝆆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING RIP, LATIN SMALL LETTER B +0061 1D186 0315 0300 05AE 0062;0061 05AE 1D186 0300 0315 0062;0061 05AE 1D186 0300 0315 0062;0061 05AE 1D186 0300 0315 0062;0061 05AE 1D186 0300 0315 0062; # (a◌𝆆◌̕◌̀◌֮b; a◌֮◌𝆆◌̀◌̕b; a◌֮◌𝆆◌̀◌̕b; a◌֮◌𝆆◌̀◌̕b; a◌֮◌𝆆◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING RIP, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D187 0062;00E0 05AE 1D187 0315 0062;0061 05AE 0300 1D187 0315 0062;00E0 05AE 1D187 0315 0062;0061 05AE 0300 1D187 0315 0062; # (a◌̕◌̀◌֮◌𝆇b; à◌֮◌𝆇◌̕b; a◌֮◌̀◌𝆇◌̕b; à◌֮◌𝆇◌̕b; a◌֮◌̀◌𝆇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING FLIP, LATIN SMALL LETTER B +0061 1D187 0315 0300 05AE 0062;0061 05AE 1D187 0300 0315 0062;0061 05AE 1D187 0300 0315 0062;0061 05AE 1D187 0300 0315 0062;0061 05AE 1D187 0300 0315 0062; # (a◌𝆇◌̕◌̀◌֮b; a◌֮◌𝆇◌̀◌̕b; a◌֮◌𝆇◌̀◌̕b; a◌֮◌𝆇◌̀◌̕b; a◌֮◌𝆇◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLIP, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D188 0062;00E0 05AE 1D188 0315 0062;0061 05AE 0300 1D188 0315 0062;00E0 05AE 1D188 0315 0062;0061 05AE 0300 1D188 0315 0062; # (a◌̕◌̀◌֮◌𝆈b; à◌֮◌𝆈◌̕b; a◌֮◌̀◌𝆈◌̕b; à◌֮◌𝆈◌̕b; a◌֮◌̀◌𝆈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING SMEAR, LATIN SMALL LETTER B +0061 1D188 0315 0300 05AE 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062; # (a◌𝆈◌̕◌̀◌֮b; a◌֮◌𝆈◌̀◌̕b; a◌֮◌𝆈◌̀◌̕b; a◌֮◌𝆈◌̀◌̕b; a◌֮◌𝆈◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING SMEAR, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D189 0062;00E0 05AE 1D189 0315 0062;0061 05AE 0300 1D189 0315 0062;00E0 05AE 1D189 0315 0062;0061 05AE 0300 1D189 0315 0062; # (a◌̕◌̀◌֮◌𝆉b; à◌֮◌𝆉◌̕b; a◌֮◌̀◌𝆉◌̕b; à◌֮◌𝆉◌̕b; a◌֮◌̀◌𝆉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING BEND, LATIN SMALL LETTER B +0061 1D189 0315 0300 05AE 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062; # (a◌𝆉◌̕◌̀◌֮b; a◌֮◌𝆉◌̀◌̕b; a◌֮◌𝆉◌̀◌̕b; a◌֮◌𝆉◌̀◌̕b; a◌֮◌𝆉◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING BEND, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1D18A 0062;0061 1DFA 0316 1D18A 059A 0062;0061 1DFA 0316 1D18A 059A 0062;0061 1DFA 0316 1D18A 059A 0062;0061 1DFA 0316 1D18A 059A 0062; # (a◌֚◌̖◌᷺◌𝆊b; a◌᷺◌̖◌𝆊◌֚b; a◌᷺◌̖◌𝆊◌֚b; a◌᷺◌̖◌𝆊◌֚b; a◌᷺◌̖◌𝆊◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING DOUBLE TONGUE, LATIN SMALL LETTER B +0061 1D18A 059A 0316 1DFA 0062;0061 1DFA 1D18A 0316 059A 0062;0061 1DFA 1D18A 0316 059A 0062;0061 1DFA 1D18A 0316 059A 0062;0061 1DFA 1D18A 0316 059A 0062; # (a◌𝆊◌֚◌̖◌᷺b; a◌᷺◌𝆊◌̖◌֚b; a◌᷺◌𝆊◌̖◌֚b; a◌᷺◌𝆊◌̖◌֚b; a◌᷺◌𝆊◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING DOUBLE TONGUE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1D18B 0062;0061 1DFA 0316 1D18B 059A 0062;0061 1DFA 0316 1D18B 059A 0062;0061 1DFA 0316 1D18B 059A 0062;0061 1DFA 0316 1D18B 059A 0062; # (a◌֚◌̖◌᷺◌𝆋b; a◌᷺◌̖◌𝆋◌֚b; a◌᷺◌̖◌𝆋◌֚b; a◌᷺◌̖◌𝆋◌֚b; a◌᷺◌̖◌𝆋◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING TRIPLE TONGUE, LATIN SMALL LETTER B +0061 1D18B 059A 0316 1DFA 0062;0061 1DFA 1D18B 0316 059A 0062;0061 1DFA 1D18B 0316 059A 0062;0061 1DFA 1D18B 0316 059A 0062;0061 1DFA 1D18B 0316 059A 0062; # (a◌𝆋◌֚◌̖◌᷺b; a◌᷺◌𝆋◌̖◌֚b; a◌᷺◌𝆋◌̖◌֚b; a◌᷺◌𝆋◌̖◌֚b; a◌᷺◌𝆋◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TRIPLE TONGUE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D1AA 0062;00E0 05AE 1D1AA 0315 0062;0061 05AE 0300 1D1AA 0315 0062;00E0 05AE 1D1AA 0315 0062;0061 05AE 0300 1D1AA 0315 0062; # (a◌̕◌̀◌֮◌𝆪b; à◌֮◌𝆪◌̕b; a◌֮◌̀◌𝆪◌̕b; à◌֮◌𝆪◌̕b; a◌֮◌̀◌𝆪◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING DOWN BOW, LATIN SMALL LETTER B +0061 1D1AA 0315 0300 05AE 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062; # (a◌𝆪◌̕◌̀◌֮b; a◌֮◌𝆪◌̀◌̕b; a◌֮◌𝆪◌̀◌̕b; a◌֮◌𝆪◌̀◌̕b; a◌֮◌𝆪◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING DOWN BOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D1AB 0062;00E0 05AE 1D1AB 0315 0062;0061 05AE 0300 1D1AB 0315 0062;00E0 05AE 1D1AB 0315 0062;0061 05AE 0300 1D1AB 0315 0062; # (a◌̕◌̀◌֮◌𝆫b; à◌֮◌𝆫◌̕b; a◌֮◌̀◌𝆫◌̕b; à◌֮◌𝆫◌̕b; a◌֮◌̀◌𝆫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING UP BOW, LATIN SMALL LETTER B +0061 1D1AB 0315 0300 05AE 0062;0061 05AE 1D1AB 0300 0315 0062;0061 05AE 1D1AB 0300 0315 0062;0061 05AE 1D1AB 0300 0315 0062;0061 05AE 1D1AB 0300 0315 0062; # (a◌𝆫◌̕◌̀◌֮b; a◌֮◌𝆫◌̀◌̕b; a◌֮◌𝆫◌̀◌̕b; a◌֮◌𝆫◌̀◌̕b; a◌֮◌𝆫◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING UP BOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D1AC 0062;00E0 05AE 1D1AC 0315 0062;0061 05AE 0300 1D1AC 0315 0062;00E0 05AE 1D1AC 0315 0062;0061 05AE 0300 1D1AC 0315 0062; # (a◌̕◌̀◌֮◌𝆬b; à◌֮◌𝆬◌̕b; a◌֮◌̀◌𝆬◌̕b; à◌֮◌𝆬◌̕b; a◌֮◌̀◌𝆬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING HARMONIC, LATIN SMALL LETTER B +0061 1D1AC 0315 0300 05AE 0062;0061 05AE 1D1AC 0300 0315 0062;0061 05AE 1D1AC 0300 0315 0062;0061 05AE 1D1AC 0300 0315 0062;0061 05AE 1D1AC 0300 0315 0062; # (a◌𝆬◌̕◌̀◌֮b; a◌֮◌𝆬◌̀◌̕b; a◌֮◌𝆬◌̀◌̕b; a◌֮◌𝆬◌̀◌̕b; a◌֮◌𝆬◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING HARMONIC, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D1AD 0062;00E0 05AE 1D1AD 0315 0062;0061 05AE 0300 1D1AD 0315 0062;00E0 05AE 1D1AD 0315 0062;0061 05AE 0300 1D1AD 0315 0062; # (a◌̕◌̀◌֮◌𝆭b; à◌֮◌𝆭◌̕b; a◌֮◌̀◌𝆭◌̕b; à◌֮◌𝆭◌̕b; a◌֮◌̀◌𝆭◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING SNAP PIZZICATO, LATIN SMALL LETTER B +0061 1D1AD 0315 0300 05AE 0062;0061 05AE 1D1AD 0300 0315 0062;0061 05AE 1D1AD 0300 0315 0062;0061 05AE 1D1AD 0300 0315 0062;0061 05AE 1D1AD 0300 0315 0062; # (a◌𝆭◌̕◌̀◌֮b; a◌֮◌𝆭◌̀◌̕b; a◌֮◌𝆭◌̀◌̕b; a◌֮◌𝆭◌̀◌̕b; a◌֮◌𝆭◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING SNAP PIZZICATO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D242 0062;00E0 05AE 1D242 0315 0062;0061 05AE 0300 1D242 0315 0062;00E0 05AE 1D242 0315 0062;0061 05AE 0300 1D242 0315 0062; # (a◌̕◌̀◌֮◌𝉂b; à◌֮◌𝉂◌̕b; a◌֮◌̀◌𝉂◌̕b; à◌֮◌𝉂◌̕b; a◌֮◌̀◌𝉂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GREEK MUSICAL TRISEME, LATIN SMALL LETTER B +0061 1D242 0315 0300 05AE 0062;0061 05AE 1D242 0300 0315 0062;0061 05AE 1D242 0300 0315 0062;0061 05AE 1D242 0300 0315 0062;0061 05AE 1D242 0300 0315 0062; # (a◌𝉂◌̕◌̀◌֮b; a◌֮◌𝉂◌̀◌̕b; a◌֮◌𝉂◌̀◌̕b; a◌֮◌𝉂◌̀◌̕b; a◌֮◌𝉂◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK MUSICAL TRISEME, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D243 0062;00E0 05AE 1D243 0315 0062;0061 05AE 0300 1D243 0315 0062;00E0 05AE 1D243 0315 0062;0061 05AE 0300 1D243 0315 0062; # (a◌̕◌̀◌֮◌𝉃b; à◌֮◌𝉃◌̕b; a◌֮◌̀◌𝉃◌̕b; à◌֮◌𝉃◌̕b; a◌֮◌̀◌𝉃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GREEK MUSICAL TETRASEME, LATIN SMALL LETTER B +0061 1D243 0315 0300 05AE 0062;0061 05AE 1D243 0300 0315 0062;0061 05AE 1D243 0300 0315 0062;0061 05AE 1D243 0300 0315 0062;0061 05AE 1D243 0300 0315 0062; # (a◌𝉃◌̕◌̀◌֮b; a◌֮◌𝉃◌̀◌̕b; a◌֮◌𝉃◌̀◌̕b; a◌֮◌𝉃◌̀◌̕b; a◌֮◌𝉃◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK MUSICAL TETRASEME, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1D244 0062;00E0 05AE 1D244 0315 0062;0061 05AE 0300 1D244 0315 0062;00E0 05AE 1D244 0315 0062;0061 05AE 0300 1D244 0315 0062; # (a◌̕◌̀◌֮◌𝉄b; à◌֮◌𝉄◌̕b; a◌֮◌̀◌𝉄◌̕b; à◌֮◌𝉄◌̕b; a◌֮◌̀◌𝉄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GREEK MUSICAL PENTASEME, LATIN SMALL LETTER B +0061 1D244 0315 0300 05AE 0062;0061 05AE 1D244 0300 0315 0062;0061 05AE 1D244 0300 0315 0062;0061 05AE 1D244 0300 0315 0062;0061 05AE 1D244 0300 0315 0062; # (a◌𝉄◌̕◌̀◌֮b; a◌֮◌𝉄◌̀◌̕b; a◌֮◌𝉄◌̀◌̕b; a◌֮◌𝉄◌̀◌̕b; a◌֮◌𝉄◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GREEK MUSICAL PENTASEME, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E000 0062;00E0 05AE 1E000 0315 0062;0061 05AE 0300 1E000 0315 0062;00E0 05AE 1E000 0315 0062;0061 05AE 0300 1E000 0315 0062; # (a◌̕◌̀◌֮◌𞀀b; à◌֮◌𞀀◌̕b; a◌֮◌̀◌𞀀◌̕b; à◌֮◌𞀀◌̕b; a◌֮◌̀◌𞀀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER AZU, LATIN SMALL LETTER B +0061 1E000 0315 0300 05AE 0062;0061 05AE 1E000 0300 0315 0062;0061 05AE 1E000 0300 0315 0062;0061 05AE 1E000 0300 0315 0062;0061 05AE 1E000 0300 0315 0062; # (a◌𞀀◌̕◌̀◌֮b; a◌֮◌𞀀◌̀◌̕b; a◌֮◌𞀀◌̀◌̕b; a◌֮◌𞀀◌̀◌̕b; a◌֮◌𞀀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER AZU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E001 0062;00E0 05AE 1E001 0315 0062;0061 05AE 0300 1E001 0315 0062;00E0 05AE 1E001 0315 0062;0061 05AE 0300 1E001 0315 0062; # (a◌̕◌̀◌֮◌𞀁b; à◌֮◌𞀁◌̕b; a◌֮◌̀◌𞀁◌̕b; à◌֮◌𞀁◌̕b; a◌֮◌̀◌𞀁◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER BUKY, LATIN SMALL LETTER B +0061 1E001 0315 0300 05AE 0062;0061 05AE 1E001 0300 0315 0062;0061 05AE 1E001 0300 0315 0062;0061 05AE 1E001 0300 0315 0062;0061 05AE 1E001 0300 0315 0062; # (a◌𞀁◌̕◌̀◌֮b; a◌֮◌𞀁◌̀◌̕b; a◌֮◌𞀁◌̀◌̕b; a◌֮◌𞀁◌̀◌̕b; a◌֮◌𞀁◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER BUKY, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E002 0062;00E0 05AE 1E002 0315 0062;0061 05AE 0300 1E002 0315 0062;00E0 05AE 1E002 0315 0062;0061 05AE 0300 1E002 0315 0062; # (a◌̕◌̀◌֮◌𞀂b; à◌֮◌𞀂◌̕b; a◌֮◌̀◌𞀂◌̕b; à◌֮◌𞀂◌̕b; a◌֮◌̀◌𞀂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER VEDE, LATIN SMALL LETTER B +0061 1E002 0315 0300 05AE 0062;0061 05AE 1E002 0300 0315 0062;0061 05AE 1E002 0300 0315 0062;0061 05AE 1E002 0300 0315 0062;0061 05AE 1E002 0300 0315 0062; # (a◌𞀂◌̕◌̀◌֮b; a◌֮◌𞀂◌̀◌̕b; a◌֮◌𞀂◌̀◌̕b; a◌֮◌𞀂◌̀◌̕b; a◌֮◌𞀂◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER VEDE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E003 0062;00E0 05AE 1E003 0315 0062;0061 05AE 0300 1E003 0315 0062;00E0 05AE 1E003 0315 0062;0061 05AE 0300 1E003 0315 0062; # (a◌̕◌̀◌֮◌𞀃b; à◌֮◌𞀃◌̕b; a◌֮◌̀◌𞀃◌̕b; à◌֮◌𞀃◌̕b; a◌֮◌̀◌𞀃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER GLAGOLI, LATIN SMALL LETTER B +0061 1E003 0315 0300 05AE 0062;0061 05AE 1E003 0300 0315 0062;0061 05AE 1E003 0300 0315 0062;0061 05AE 1E003 0300 0315 0062;0061 05AE 1E003 0300 0315 0062; # (a◌𞀃◌̕◌̀◌֮b; a◌֮◌𞀃◌̀◌̕b; a◌֮◌𞀃◌̀◌̕b; a◌֮◌𞀃◌̀◌̕b; a◌֮◌𞀃◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER GLAGOLI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E004 0062;00E0 05AE 1E004 0315 0062;0061 05AE 0300 1E004 0315 0062;00E0 05AE 1E004 0315 0062;0061 05AE 0300 1E004 0315 0062; # (a◌̕◌̀◌֮◌𞀄b; à◌֮◌𞀄◌̕b; a◌֮◌̀◌𞀄◌̕b; à◌֮◌𞀄◌̕b; a◌֮◌̀◌𞀄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER DOBRO, LATIN SMALL LETTER B +0061 1E004 0315 0300 05AE 0062;0061 05AE 1E004 0300 0315 0062;0061 05AE 1E004 0300 0315 0062;0061 05AE 1E004 0300 0315 0062;0061 05AE 1E004 0300 0315 0062; # (a◌𞀄◌̕◌̀◌֮b; a◌֮◌𞀄◌̀◌̕b; a◌֮◌𞀄◌̀◌̕b; a◌֮◌𞀄◌̀◌̕b; a◌֮◌𞀄◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER DOBRO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E005 0062;00E0 05AE 1E005 0315 0062;0061 05AE 0300 1E005 0315 0062;00E0 05AE 1E005 0315 0062;0061 05AE 0300 1E005 0315 0062; # (a◌̕◌̀◌֮◌𞀅b; à◌֮◌𞀅◌̕b; a◌֮◌̀◌𞀅◌̕b; à◌֮◌𞀅◌̕b; a◌֮◌̀◌𞀅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YESTU, LATIN SMALL LETTER B +0061 1E005 0315 0300 05AE 0062;0061 05AE 1E005 0300 0315 0062;0061 05AE 1E005 0300 0315 0062;0061 05AE 1E005 0300 0315 0062;0061 05AE 1E005 0300 0315 0062; # (a◌𞀅◌̕◌̀◌֮b; a◌֮◌𞀅◌̀◌̕b; a◌֮◌𞀅◌̀◌̕b; a◌֮◌𞀅◌̀◌̕b; a◌֮◌𞀅◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YESTU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E006 0062;00E0 05AE 1E006 0315 0062;0061 05AE 0300 1E006 0315 0062;00E0 05AE 1E006 0315 0062;0061 05AE 0300 1E006 0315 0062; # (a◌̕◌̀◌֮◌𞀆b; à◌֮◌𞀆◌̕b; a◌֮◌̀◌𞀆◌̕b; à◌֮◌𞀆◌̕b; a◌֮◌̀◌𞀆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER ZHIVETE, LATIN SMALL LETTER B +0061 1E006 0315 0300 05AE 0062;0061 05AE 1E006 0300 0315 0062;0061 05AE 1E006 0300 0315 0062;0061 05AE 1E006 0300 0315 0062;0061 05AE 1E006 0300 0315 0062; # (a◌𞀆◌̕◌̀◌֮b; a◌֮◌𞀆◌̀◌̕b; a◌֮◌𞀆◌̀◌̕b; a◌֮◌𞀆◌̀◌̕b; a◌֮◌𞀆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER ZHIVETE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E008 0062;00E0 05AE 1E008 0315 0062;0061 05AE 0300 1E008 0315 0062;00E0 05AE 1E008 0315 0062;0061 05AE 0300 1E008 0315 0062; # (a◌̕◌̀◌֮◌𞀈b; à◌֮◌𞀈◌̕b; a◌֮◌̀◌𞀈◌̕b; à◌֮◌𞀈◌̕b; a◌֮◌̀◌𞀈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER ZEMLJA, LATIN SMALL LETTER B +0061 1E008 0315 0300 05AE 0062;0061 05AE 1E008 0300 0315 0062;0061 05AE 1E008 0300 0315 0062;0061 05AE 1E008 0300 0315 0062;0061 05AE 1E008 0300 0315 0062; # (a◌𞀈◌̕◌̀◌֮b; a◌֮◌𞀈◌̀◌̕b; a◌֮◌𞀈◌̀◌̕b; a◌֮◌𞀈◌̀◌̕b; a◌֮◌𞀈◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER ZEMLJA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E009 0062;00E0 05AE 1E009 0315 0062;0061 05AE 0300 1E009 0315 0062;00E0 05AE 1E009 0315 0062;0061 05AE 0300 1E009 0315 0062; # (a◌̕◌̀◌֮◌𞀉b; à◌֮◌𞀉◌̕b; a◌֮◌̀◌𞀉◌̕b; à◌֮◌𞀉◌̕b; a◌֮◌̀◌𞀉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER IZHE, LATIN SMALL LETTER B +0061 1E009 0315 0300 05AE 0062;0061 05AE 1E009 0300 0315 0062;0061 05AE 1E009 0300 0315 0062;0061 05AE 1E009 0300 0315 0062;0061 05AE 1E009 0300 0315 0062; # (a◌𞀉◌̕◌̀◌֮b; a◌֮◌𞀉◌̀◌̕b; a◌֮◌𞀉◌̀◌̕b; a◌֮◌𞀉◌̀◌̕b; a◌֮◌𞀉◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER IZHE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00A 0062;00E0 05AE 1E00A 0315 0062;0061 05AE 0300 1E00A 0315 0062;00E0 05AE 1E00A 0315 0062;0061 05AE 0300 1E00A 0315 0062; # (a◌̕◌̀◌֮◌𞀊b; à◌֮◌𞀊◌̕b; a◌֮◌̀◌𞀊◌̕b; à◌֮◌𞀊◌̕b; a◌֮◌̀◌𞀊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER INITIAL IZHE, LATIN SMALL LETTER B +0061 1E00A 0315 0300 05AE 0062;0061 05AE 1E00A 0300 0315 0062;0061 05AE 1E00A 0300 0315 0062;0061 05AE 1E00A 0300 0315 0062;0061 05AE 1E00A 0300 0315 0062; # (a◌𞀊◌̕◌̀◌֮b; a◌֮◌𞀊◌̀◌̕b; a◌֮◌𞀊◌̀◌̕b; a◌֮◌𞀊◌̀◌̕b; a◌֮◌𞀊◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER INITIAL IZHE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00B 0062;00E0 05AE 1E00B 0315 0062;0061 05AE 0300 1E00B 0315 0062;00E0 05AE 1E00B 0315 0062;0061 05AE 0300 1E00B 0315 0062; # (a◌̕◌̀◌֮◌𞀋b; à◌֮◌𞀋◌̕b; a◌֮◌̀◌𞀋◌̕b; à◌֮◌𞀋◌̕b; a◌֮◌̀◌𞀋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER I, LATIN SMALL LETTER B +0061 1E00B 0315 0300 05AE 0062;0061 05AE 1E00B 0300 0315 0062;0061 05AE 1E00B 0300 0315 0062;0061 05AE 1E00B 0300 0315 0062;0061 05AE 1E00B 0300 0315 0062; # (a◌𞀋◌̕◌̀◌֮b; a◌֮◌𞀋◌̀◌̕b; a◌֮◌𞀋◌̀◌̕b; a◌֮◌𞀋◌̀◌̕b; a◌֮◌𞀋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00C 0062;00E0 05AE 1E00C 0315 0062;0061 05AE 0300 1E00C 0315 0062;00E0 05AE 1E00C 0315 0062;0061 05AE 0300 1E00C 0315 0062; # (a◌̕◌̀◌֮◌𞀌b; à◌֮◌𞀌◌̕b; a◌֮◌̀◌𞀌◌̕b; à◌֮◌𞀌◌̕b; a◌֮◌̀◌𞀌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER DJERVI, LATIN SMALL LETTER B +0061 1E00C 0315 0300 05AE 0062;0061 05AE 1E00C 0300 0315 0062;0061 05AE 1E00C 0300 0315 0062;0061 05AE 1E00C 0300 0315 0062;0061 05AE 1E00C 0300 0315 0062; # (a◌𞀌◌̕◌̀◌֮b; a◌֮◌𞀌◌̀◌̕b; a◌֮◌𞀌◌̀◌̕b; a◌֮◌𞀌◌̀◌̕b; a◌֮◌𞀌◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER DJERVI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00D 0062;00E0 05AE 1E00D 0315 0062;0061 05AE 0300 1E00D 0315 0062;00E0 05AE 1E00D 0315 0062;0061 05AE 0300 1E00D 0315 0062; # (a◌̕◌̀◌֮◌𞀍b; à◌֮◌𞀍◌̕b; a◌֮◌̀◌𞀍◌̕b; à◌֮◌𞀍◌̕b; a◌֮◌̀◌𞀍◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER KAKO, LATIN SMALL LETTER B +0061 1E00D 0315 0300 05AE 0062;0061 05AE 1E00D 0300 0315 0062;0061 05AE 1E00D 0300 0315 0062;0061 05AE 1E00D 0300 0315 0062;0061 05AE 1E00D 0300 0315 0062; # (a◌𞀍◌̕◌̀◌֮b; a◌֮◌𞀍◌̀◌̕b; a◌֮◌𞀍◌̀◌̕b; a◌֮◌𞀍◌̀◌̕b; a◌֮◌𞀍◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER KAKO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00E 0062;00E0 05AE 1E00E 0315 0062;0061 05AE 0300 1E00E 0315 0062;00E0 05AE 1E00E 0315 0062;0061 05AE 0300 1E00E 0315 0062; # (a◌̕◌̀◌֮◌𞀎b; à◌֮◌𞀎◌̕b; a◌֮◌̀◌𞀎◌̕b; à◌֮◌𞀎◌̕b; a◌֮◌̀◌𞀎◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER LJUDIJE, LATIN SMALL LETTER B +0061 1E00E 0315 0300 05AE 0062;0061 05AE 1E00E 0300 0315 0062;0061 05AE 1E00E 0300 0315 0062;0061 05AE 1E00E 0300 0315 0062;0061 05AE 1E00E 0300 0315 0062; # (a◌𞀎◌̕◌̀◌֮b; a◌֮◌𞀎◌̀◌̕b; a◌֮◌𞀎◌̀◌̕b; a◌֮◌𞀎◌̀◌̕b; a◌֮◌𞀎◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER LJUDIJE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E00F 0062;00E0 05AE 1E00F 0315 0062;0061 05AE 0300 1E00F 0315 0062;00E0 05AE 1E00F 0315 0062;0061 05AE 0300 1E00F 0315 0062; # (a◌̕◌̀◌֮◌𞀏b; à◌֮◌𞀏◌̕b; a◌֮◌̀◌𞀏◌̕b; à◌֮◌𞀏◌̕b; a◌֮◌̀◌𞀏◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER MYSLITE, LATIN SMALL LETTER B +0061 1E00F 0315 0300 05AE 0062;0061 05AE 1E00F 0300 0315 0062;0061 05AE 1E00F 0300 0315 0062;0061 05AE 1E00F 0300 0315 0062;0061 05AE 1E00F 0300 0315 0062; # (a◌𞀏◌̕◌̀◌֮b; a◌֮◌𞀏◌̀◌̕b; a◌֮◌𞀏◌̀◌̕b; a◌֮◌𞀏◌̀◌̕b; a◌֮◌𞀏◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER MYSLITE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E010 0062;00E0 05AE 1E010 0315 0062;0061 05AE 0300 1E010 0315 0062;00E0 05AE 1E010 0315 0062;0061 05AE 0300 1E010 0315 0062; # (a◌̕◌̀◌֮◌𞀐b; à◌֮◌𞀐◌̕b; a◌֮◌̀◌𞀐◌̕b; à◌֮◌𞀐◌̕b; a◌֮◌̀◌𞀐◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER NASHI, LATIN SMALL LETTER B +0061 1E010 0315 0300 05AE 0062;0061 05AE 1E010 0300 0315 0062;0061 05AE 1E010 0300 0315 0062;0061 05AE 1E010 0300 0315 0062;0061 05AE 1E010 0300 0315 0062; # (a◌𞀐◌̕◌̀◌֮b; a◌֮◌𞀐◌̀◌̕b; a◌֮◌𞀐◌̀◌̕b; a◌֮◌𞀐◌̀◌̕b; a◌֮◌𞀐◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER NASHI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E011 0062;00E0 05AE 1E011 0315 0062;0061 05AE 0300 1E011 0315 0062;00E0 05AE 1E011 0315 0062;0061 05AE 0300 1E011 0315 0062; # (a◌̕◌̀◌֮◌𞀑b; à◌֮◌𞀑◌̕b; a◌֮◌̀◌𞀑◌̕b; à◌֮◌𞀑◌̕b; a◌֮◌̀◌𞀑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER ONU, LATIN SMALL LETTER B +0061 1E011 0315 0300 05AE 0062;0061 05AE 1E011 0300 0315 0062;0061 05AE 1E011 0300 0315 0062;0061 05AE 1E011 0300 0315 0062;0061 05AE 1E011 0300 0315 0062; # (a◌𞀑◌̕◌̀◌֮b; a◌֮◌𞀑◌̀◌̕b; a◌֮◌𞀑◌̀◌̕b; a◌֮◌𞀑◌̀◌̕b; a◌֮◌𞀑◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER ONU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E012 0062;00E0 05AE 1E012 0315 0062;0061 05AE 0300 1E012 0315 0062;00E0 05AE 1E012 0315 0062;0061 05AE 0300 1E012 0315 0062; # (a◌̕◌̀◌֮◌𞀒b; à◌֮◌𞀒◌̕b; a◌֮◌̀◌𞀒◌̕b; à◌֮◌𞀒◌̕b; a◌֮◌̀◌𞀒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER POKOJI, LATIN SMALL LETTER B +0061 1E012 0315 0300 05AE 0062;0061 05AE 1E012 0300 0315 0062;0061 05AE 1E012 0300 0315 0062;0061 05AE 1E012 0300 0315 0062;0061 05AE 1E012 0300 0315 0062; # (a◌𞀒◌̕◌̀◌֮b; a◌֮◌𞀒◌̀◌̕b; a◌֮◌𞀒◌̀◌̕b; a◌֮◌𞀒◌̀◌̕b; a◌֮◌𞀒◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER POKOJI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E013 0062;00E0 05AE 1E013 0315 0062;0061 05AE 0300 1E013 0315 0062;00E0 05AE 1E013 0315 0062;0061 05AE 0300 1E013 0315 0062; # (a◌̕◌̀◌֮◌𞀓b; à◌֮◌𞀓◌̕b; a◌֮◌̀◌𞀓◌̕b; à◌֮◌𞀓◌̕b; a◌֮◌̀◌𞀓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER RITSI, LATIN SMALL LETTER B +0061 1E013 0315 0300 05AE 0062;0061 05AE 1E013 0300 0315 0062;0061 05AE 1E013 0300 0315 0062;0061 05AE 1E013 0300 0315 0062;0061 05AE 1E013 0300 0315 0062; # (a◌𞀓◌̕◌̀◌֮b; a◌֮◌𞀓◌̀◌̕b; a◌֮◌𞀓◌̀◌̕b; a◌֮◌𞀓◌̀◌̕b; a◌֮◌𞀓◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER RITSI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E014 0062;00E0 05AE 1E014 0315 0062;0061 05AE 0300 1E014 0315 0062;00E0 05AE 1E014 0315 0062;0061 05AE 0300 1E014 0315 0062; # (a◌̕◌̀◌֮◌𞀔b; à◌֮◌𞀔◌̕b; a◌֮◌̀◌𞀔◌̕b; à◌֮◌𞀔◌̕b; a◌֮◌̀◌𞀔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER SLOVO, LATIN SMALL LETTER B +0061 1E014 0315 0300 05AE 0062;0061 05AE 1E014 0300 0315 0062;0061 05AE 1E014 0300 0315 0062;0061 05AE 1E014 0300 0315 0062;0061 05AE 1E014 0300 0315 0062; # (a◌𞀔◌̕◌̀◌֮b; a◌֮◌𞀔◌̀◌̕b; a◌֮◌𞀔◌̀◌̕b; a◌֮◌𞀔◌̀◌̕b; a◌֮◌𞀔◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER SLOVO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E015 0062;00E0 05AE 1E015 0315 0062;0061 05AE 0300 1E015 0315 0062;00E0 05AE 1E015 0315 0062;0061 05AE 0300 1E015 0315 0062; # (a◌̕◌̀◌֮◌𞀕b; à◌֮◌𞀕◌̕b; a◌֮◌̀◌𞀕◌̕b; à◌֮◌𞀕◌̕b; a◌֮◌̀◌𞀕◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER TVRIDO, LATIN SMALL LETTER B +0061 1E015 0315 0300 05AE 0062;0061 05AE 1E015 0300 0315 0062;0061 05AE 1E015 0300 0315 0062;0061 05AE 1E015 0300 0315 0062;0061 05AE 1E015 0300 0315 0062; # (a◌𞀕◌̕◌̀◌֮b; a◌֮◌𞀕◌̀◌̕b; a◌֮◌𞀕◌̀◌̕b; a◌֮◌𞀕◌̀◌̕b; a◌֮◌𞀕◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER TVRIDO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E016 0062;00E0 05AE 1E016 0315 0062;0061 05AE 0300 1E016 0315 0062;00E0 05AE 1E016 0315 0062;0061 05AE 0300 1E016 0315 0062; # (a◌̕◌̀◌֮◌𞀖b; à◌֮◌𞀖◌̕b; a◌֮◌̀◌𞀖◌̕b; à◌֮◌𞀖◌̕b; a◌֮◌̀◌𞀖◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER UKU, LATIN SMALL LETTER B +0061 1E016 0315 0300 05AE 0062;0061 05AE 1E016 0300 0315 0062;0061 05AE 1E016 0300 0315 0062;0061 05AE 1E016 0300 0315 0062;0061 05AE 1E016 0300 0315 0062; # (a◌𞀖◌̕◌̀◌֮b; a◌֮◌𞀖◌̀◌̕b; a◌֮◌𞀖◌̀◌̕b; a◌֮◌𞀖◌̀◌̕b; a◌֮◌𞀖◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER UKU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E017 0062;00E0 05AE 1E017 0315 0062;0061 05AE 0300 1E017 0315 0062;00E0 05AE 1E017 0315 0062;0061 05AE 0300 1E017 0315 0062; # (a◌̕◌̀◌֮◌𞀗b; à◌֮◌𞀗◌̕b; a◌֮◌̀◌𞀗◌̕b; à◌֮◌𞀗◌̕b; a◌֮◌̀◌𞀗◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER FRITU, LATIN SMALL LETTER B +0061 1E017 0315 0300 05AE 0062;0061 05AE 1E017 0300 0315 0062;0061 05AE 1E017 0300 0315 0062;0061 05AE 1E017 0300 0315 0062;0061 05AE 1E017 0300 0315 0062; # (a◌𞀗◌̕◌̀◌֮b; a◌֮◌𞀗◌̀◌̕b; a◌֮◌𞀗◌̀◌̕b; a◌֮◌𞀗◌̀◌̕b; a◌֮◌𞀗◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER FRITU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E018 0062;00E0 05AE 1E018 0315 0062;0061 05AE 0300 1E018 0315 0062;00E0 05AE 1E018 0315 0062;0061 05AE 0300 1E018 0315 0062; # (a◌̕◌̀◌֮◌𞀘b; à◌֮◌𞀘◌̕b; a◌֮◌̀◌𞀘◌̕b; à◌֮◌𞀘◌̕b; a◌֮◌̀◌𞀘◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER HERU, LATIN SMALL LETTER B +0061 1E018 0315 0300 05AE 0062;0061 05AE 1E018 0300 0315 0062;0061 05AE 1E018 0300 0315 0062;0061 05AE 1E018 0300 0315 0062;0061 05AE 1E018 0300 0315 0062; # (a◌𞀘◌̕◌̀◌֮b; a◌֮◌𞀘◌̀◌̕b; a◌֮◌𞀘◌̀◌̕b; a◌֮◌𞀘◌̀◌̕b; a◌֮◌𞀘◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER HERU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E01B 0062;00E0 05AE 1E01B 0315 0062;0061 05AE 0300 1E01B 0315 0062;00E0 05AE 1E01B 0315 0062;0061 05AE 0300 1E01B 0315 0062; # (a◌̕◌̀◌֮◌𞀛b; à◌֮◌𞀛◌̕b; a◌֮◌̀◌𞀛◌̕b; à◌֮◌𞀛◌̕b; a◌֮◌̀◌𞀛◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER SHTA, LATIN SMALL LETTER B +0061 1E01B 0315 0300 05AE 0062;0061 05AE 1E01B 0300 0315 0062;0061 05AE 1E01B 0300 0315 0062;0061 05AE 1E01B 0300 0315 0062;0061 05AE 1E01B 0300 0315 0062; # (a◌𞀛◌̕◌̀◌֮b; a◌֮◌𞀛◌̀◌̕b; a◌֮◌𞀛◌̀◌̕b; a◌֮◌𞀛◌̀◌̕b; a◌֮◌𞀛◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER SHTA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E01C 0062;00E0 05AE 1E01C 0315 0062;0061 05AE 0300 1E01C 0315 0062;00E0 05AE 1E01C 0315 0062;0061 05AE 0300 1E01C 0315 0062; # (a◌̕◌̀◌֮◌𞀜b; à◌֮◌𞀜◌̕b; a◌֮◌̀◌𞀜◌̕b; à◌֮◌𞀜◌̕b; a◌֮◌̀◌𞀜◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER TSI, LATIN SMALL LETTER B +0061 1E01C 0315 0300 05AE 0062;0061 05AE 1E01C 0300 0315 0062;0061 05AE 1E01C 0300 0315 0062;0061 05AE 1E01C 0300 0315 0062;0061 05AE 1E01C 0300 0315 0062; # (a◌𞀜◌̕◌̀◌֮b; a◌֮◌𞀜◌̀◌̕b; a◌֮◌𞀜◌̀◌̕b; a◌֮◌𞀜◌̀◌̕b; a◌֮◌𞀜◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER TSI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E01D 0062;00E0 05AE 1E01D 0315 0062;0061 05AE 0300 1E01D 0315 0062;00E0 05AE 1E01D 0315 0062;0061 05AE 0300 1E01D 0315 0062; # (a◌̕◌̀◌֮◌𞀝b; à◌֮◌𞀝◌̕b; a◌֮◌̀◌𞀝◌̕b; à◌֮◌𞀝◌̕b; a◌֮◌̀◌𞀝◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER CHRIVI, LATIN SMALL LETTER B +0061 1E01D 0315 0300 05AE 0062;0061 05AE 1E01D 0300 0315 0062;0061 05AE 1E01D 0300 0315 0062;0061 05AE 1E01D 0300 0315 0062;0061 05AE 1E01D 0300 0315 0062; # (a◌𞀝◌̕◌̀◌֮b; a◌֮◌𞀝◌̀◌̕b; a◌֮◌𞀝◌̀◌̕b; a◌֮◌𞀝◌̀◌̕b; a◌֮◌𞀝◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER CHRIVI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E01E 0062;00E0 05AE 1E01E 0315 0062;0061 05AE 0300 1E01E 0315 0062;00E0 05AE 1E01E 0315 0062;0061 05AE 0300 1E01E 0315 0062; # (a◌̕◌̀◌֮◌𞀞b; à◌֮◌𞀞◌̕b; a◌֮◌̀◌𞀞◌̕b; à◌֮◌𞀞◌̕b; a◌֮◌̀◌𞀞◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER SHA, LATIN SMALL LETTER B +0061 1E01E 0315 0300 05AE 0062;0061 05AE 1E01E 0300 0315 0062;0061 05AE 1E01E 0300 0315 0062;0061 05AE 1E01E 0300 0315 0062;0061 05AE 1E01E 0300 0315 0062; # (a◌𞀞◌̕◌̀◌֮b; a◌֮◌𞀞◌̀◌̕b; a◌֮◌𞀞◌̀◌̕b; a◌֮◌𞀞◌̀◌̕b; a◌֮◌𞀞◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER SHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E01F 0062;00E0 05AE 1E01F 0315 0062;0061 05AE 0300 1E01F 0315 0062;00E0 05AE 1E01F 0315 0062;0061 05AE 0300 1E01F 0315 0062; # (a◌̕◌̀◌֮◌𞀟b; à◌֮◌𞀟◌̕b; a◌֮◌̀◌𞀟◌̕b; à◌֮◌𞀟◌̕b; a◌֮◌̀◌𞀟◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YERU, LATIN SMALL LETTER B +0061 1E01F 0315 0300 05AE 0062;0061 05AE 1E01F 0300 0315 0062;0061 05AE 1E01F 0300 0315 0062;0061 05AE 1E01F 0300 0315 0062;0061 05AE 1E01F 0300 0315 0062; # (a◌𞀟◌̕◌̀◌֮b; a◌֮◌𞀟◌̀◌̕b; a◌֮◌𞀟◌̀◌̕b; a◌֮◌𞀟◌̀◌̕b; a◌֮◌𞀟◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YERU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E020 0062;00E0 05AE 1E020 0315 0062;0061 05AE 0300 1E020 0315 0062;00E0 05AE 1E020 0315 0062;0061 05AE 0300 1E020 0315 0062; # (a◌̕◌̀◌֮◌𞀠b; à◌֮◌𞀠◌̕b; a◌֮◌̀◌𞀠◌̕b; à◌֮◌𞀠◌̕b; a◌֮◌̀◌𞀠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YERI, LATIN SMALL LETTER B +0061 1E020 0315 0300 05AE 0062;0061 05AE 1E020 0300 0315 0062;0061 05AE 1E020 0300 0315 0062;0061 05AE 1E020 0300 0315 0062;0061 05AE 1E020 0300 0315 0062; # (a◌𞀠◌̕◌̀◌֮b; a◌֮◌𞀠◌̀◌̕b; a◌֮◌𞀠◌̀◌̕b; a◌֮◌𞀠◌̀◌̕b; a◌֮◌𞀠◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YERI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E021 0062;00E0 05AE 1E021 0315 0062;0061 05AE 0300 1E021 0315 0062;00E0 05AE 1E021 0315 0062;0061 05AE 0300 1E021 0315 0062; # (a◌̕◌̀◌֮◌𞀡b; à◌֮◌𞀡◌̕b; a◌֮◌̀◌𞀡◌̕b; à◌֮◌𞀡◌̕b; a◌֮◌̀◌𞀡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YATI, LATIN SMALL LETTER B +0061 1E021 0315 0300 05AE 0062;0061 05AE 1E021 0300 0315 0062;0061 05AE 1E021 0300 0315 0062;0061 05AE 1E021 0300 0315 0062;0061 05AE 1E021 0300 0315 0062; # (a◌𞀡◌̕◌̀◌֮b; a◌֮◌𞀡◌̀◌̕b; a◌֮◌𞀡◌̀◌̕b; a◌֮◌𞀡◌̀◌̕b; a◌֮◌𞀡◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YATI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E023 0062;00E0 05AE 1E023 0315 0062;0061 05AE 0300 1E023 0315 0062;00E0 05AE 1E023 0315 0062;0061 05AE 0300 1E023 0315 0062; # (a◌̕◌̀◌֮◌𞀣b; à◌֮◌𞀣◌̕b; a◌֮◌̀◌𞀣◌̕b; à◌֮◌𞀣◌̕b; a◌֮◌̀◌𞀣◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YU, LATIN SMALL LETTER B +0061 1E023 0315 0300 05AE 0062;0061 05AE 1E023 0300 0315 0062;0061 05AE 1E023 0300 0315 0062;0061 05AE 1E023 0300 0315 0062;0061 05AE 1E023 0300 0315 0062; # (a◌𞀣◌̕◌̀◌֮b; a◌֮◌𞀣◌̀◌̕b; a◌֮◌𞀣◌̀◌̕b; a◌֮◌𞀣◌̀◌̕b; a◌֮◌𞀣◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YU, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E024 0062;00E0 05AE 1E024 0315 0062;0061 05AE 0300 1E024 0315 0062;00E0 05AE 1E024 0315 0062;0061 05AE 0300 1E024 0315 0062; # (a◌̕◌̀◌֮◌𞀤b; à◌֮◌𞀤◌̕b; a◌֮◌̀◌𞀤◌̕b; à◌֮◌𞀤◌̕b; a◌֮◌̀◌𞀤◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER SMALL YUS, LATIN SMALL LETTER B +0061 1E024 0315 0300 05AE 0062;0061 05AE 1E024 0300 0315 0062;0061 05AE 1E024 0300 0315 0062;0061 05AE 1E024 0300 0315 0062;0061 05AE 1E024 0300 0315 0062; # (a◌𞀤◌̕◌̀◌֮b; a◌֮◌𞀤◌̀◌̕b; a◌֮◌𞀤◌̀◌̕b; a◌֮◌𞀤◌̀◌̕b; a◌֮◌𞀤◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER SMALL YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E026 0062;00E0 05AE 1E026 0315 0062;0061 05AE 0300 1E026 0315 0062;00E0 05AE 1E026 0315 0062;0061 05AE 0300 1E026 0315 0062; # (a◌̕◌̀◌֮◌𞀦b; à◌֮◌𞀦◌̕b; a◌֮◌̀◌𞀦◌̕b; à◌֮◌𞀦◌̕b; a◌֮◌̀◌𞀦◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER YO, LATIN SMALL LETTER B +0061 1E026 0315 0300 05AE 0062;0061 05AE 1E026 0300 0315 0062;0061 05AE 1E026 0300 0315 0062;0061 05AE 1E026 0300 0315 0062;0061 05AE 1E026 0300 0315 0062; # (a◌𞀦◌̕◌̀◌֮b; a◌֮◌𞀦◌̀◌̕b; a◌֮◌𞀦◌̀◌̕b; a◌֮◌𞀦◌̀◌̕b; a◌֮◌𞀦◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER YO, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E027 0062;00E0 05AE 1E027 0315 0062;0061 05AE 0300 1E027 0315 0062;00E0 05AE 1E027 0315 0062;0061 05AE 0300 1E027 0315 0062; # (a◌̕◌̀◌֮◌𞀧b; à◌֮◌𞀧◌̕b; a◌֮◌̀◌𞀧◌̕b; à◌֮◌𞀧◌̕b; a◌֮◌̀◌𞀧◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS, LATIN SMALL LETTER B +0061 1E027 0315 0300 05AE 0062;0061 05AE 1E027 0300 0315 0062;0061 05AE 1E027 0300 0315 0062;0061 05AE 1E027 0300 0315 0062;0061 05AE 1E027 0300 0315 0062; # (a◌𞀧◌̕◌̀◌֮b; a◌֮◌𞀧◌̀◌̕b; a◌֮◌𞀧◌̀◌̕b; a◌֮◌𞀧◌̀◌̕b; a◌֮◌𞀧◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E028 0062;00E0 05AE 1E028 0315 0062;0061 05AE 0300 1E028 0315 0062;00E0 05AE 1E028 0315 0062;0061 05AE 0300 1E028 0315 0062; # (a◌̕◌̀◌֮◌𞀨b; à◌֮◌𞀨◌̕b; a◌֮◌̀◌𞀨◌̕b; à◌֮◌𞀨◌̕b; a◌֮◌̀◌𞀨◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER BIG YUS, LATIN SMALL LETTER B +0061 1E028 0315 0300 05AE 0062;0061 05AE 1E028 0300 0315 0062;0061 05AE 1E028 0300 0315 0062;0061 05AE 1E028 0300 0315 0062;0061 05AE 1E028 0300 0315 0062; # (a◌𞀨◌̕◌̀◌֮b; a◌֮◌𞀨◌̀◌̕b; a◌֮◌𞀨◌̀◌̕b; a◌֮◌𞀨◌̀◌̕b; a◌֮◌𞀨◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER BIG YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E029 0062;00E0 05AE 1E029 0315 0062;0061 05AE 0300 1E029 0315 0062;00E0 05AE 1E029 0315 0062;0061 05AE 0300 1E029 0315 0062; # (a◌̕◌̀◌֮◌𞀩b; à◌֮◌𞀩◌̕b; a◌֮◌̀◌𞀩◌̕b; à◌֮◌𞀩◌̕b; a◌֮◌̀◌𞀩◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER IOTATED BIG YUS, LATIN SMALL LETTER B +0061 1E029 0315 0300 05AE 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062;0061 05AE 1E029 0300 0315 0062; # (a◌𞀩◌̕◌̀◌֮b; a◌֮◌𞀩◌̀◌̕b; a◌֮◌𞀩◌̀◌̕b; a◌֮◌𞀩◌̀◌̕b; a◌֮◌𞀩◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER IOTATED BIG YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E02A 0062;00E0 05AE 1E02A 0315 0062;0061 05AE 0300 1E02A 0315 0062;00E0 05AE 1E02A 0315 0062;0061 05AE 0300 1E02A 0315 0062; # (a◌̕◌̀◌֮◌𞀪b; à◌֮◌𞀪◌̕b; a◌֮◌̀◌𞀪◌̕b; à◌֮◌𞀪◌̕b; a◌֮◌̀◌𞀪◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING GLAGOLITIC LETTER FITA, LATIN SMALL LETTER B +0061 1E02A 0315 0300 05AE 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062;0061 05AE 1E02A 0300 0315 0062; # (a◌𞀪◌̕◌̀◌֮b; a◌֮◌𞀪◌̀◌̕b; a◌֮◌𞀪◌̀◌̕b; a◌֮◌𞀪◌̀◌̕b; a◌֮◌𞀪◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GLAGOLITIC LETTER FITA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E08F 0062;00E0 05AE 1E08F 0315 0062;0061 05AE 0300 1E08F 0315 0062;00E0 05AE 1E08F 0315 0062;0061 05AE 0300 1E08F 0315 0062; # (a◌̕◌̀◌֮◌𞂏b; à◌֮◌𞂏◌̕b; a◌֮◌̀◌𞂏◌̕b; à◌֮◌𞂏◌̕b; a◌֮◌̀◌𞂏◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I, LATIN SMALL LETTER B +0061 1E08F 0315 0300 05AE 0062;0061 05AE 1E08F 0300 0315 0062;0061 05AE 1E08F 0300 0315 0062;0061 05AE 1E08F 0300 0315 0062;0061 05AE 1E08F 0300 0315 0062; # (a◌𞂏◌̕◌̀◌֮b; a◌֮◌𞂏◌̀◌̕b; a◌֮◌𞂏◌̀◌̕b; a◌֮◌𞂏◌̀◌̕b; a◌֮◌𞂏◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E130 0062;00E0 05AE 1E130 0315 0062;0061 05AE 0300 1E130 0315 0062;00E0 05AE 1E130 0315 0062;0061 05AE 0300 1E130 0315 0062; # (a◌̕◌̀◌֮◌𞄰b; à◌֮◌𞄰◌̕b; a◌֮◌̀◌𞄰◌̕b; à◌֮◌𞄰◌̕b; a◌֮◌̀◌𞄰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NYIAKENG PUACHUE HMONG TONE-B, LATIN SMALL LETTER B +0061 1E130 0315 0300 05AE 0062;0061 05AE 1E130 0300 0315 0062;0061 05AE 1E130 0300 0315 0062;0061 05AE 1E130 0300 0315 0062;0061 05AE 1E130 0300 0315 0062; # (a◌𞄰◌̕◌̀◌֮b; a◌֮◌𞄰◌̀◌̕b; a◌֮◌𞄰◌̀◌̕b; a◌֮◌𞄰◌̀◌̕b; a◌֮◌𞄰◌̀◌̕b; ) LATIN SMALL LETTER A, NYIAKENG PUACHUE HMONG TONE-B, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E131 0062;00E0 05AE 1E131 0315 0062;0061 05AE 0300 1E131 0315 0062;00E0 05AE 1E131 0315 0062;0061 05AE 0300 1E131 0315 0062; # (a◌̕◌̀◌֮◌𞄱b; à◌֮◌𞄱◌̕b; a◌֮◌̀◌𞄱◌̕b; à◌֮◌𞄱◌̕b; a◌֮◌̀◌𞄱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NYIAKENG PUACHUE HMONG TONE-M, LATIN SMALL LETTER B +0061 1E131 0315 0300 05AE 0062;0061 05AE 1E131 0300 0315 0062;0061 05AE 1E131 0300 0315 0062;0061 05AE 1E131 0300 0315 0062;0061 05AE 1E131 0300 0315 0062; # (a◌𞄱◌̕◌̀◌֮b; a◌֮◌𞄱◌̀◌̕b; a◌֮◌𞄱◌̀◌̕b; a◌֮◌𞄱◌̀◌̕b; a◌֮◌𞄱◌̀◌̕b; ) LATIN SMALL LETTER A, NYIAKENG PUACHUE HMONG TONE-M, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E132 0062;00E0 05AE 1E132 0315 0062;0061 05AE 0300 1E132 0315 0062;00E0 05AE 1E132 0315 0062;0061 05AE 0300 1E132 0315 0062; # (a◌̕◌̀◌֮◌𞄲b; à◌֮◌𞄲◌̕b; a◌֮◌̀◌𞄲◌̕b; à◌֮◌𞄲◌̕b; a◌֮◌̀◌𞄲◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NYIAKENG PUACHUE HMONG TONE-J, LATIN SMALL LETTER B +0061 1E132 0315 0300 05AE 0062;0061 05AE 1E132 0300 0315 0062;0061 05AE 1E132 0300 0315 0062;0061 05AE 1E132 0300 0315 0062;0061 05AE 1E132 0300 0315 0062; # (a◌𞄲◌̕◌̀◌֮b; a◌֮◌𞄲◌̀◌̕b; a◌֮◌𞄲◌̀◌̕b; a◌֮◌𞄲◌̀◌̕b; a◌֮◌𞄲◌̀◌̕b; ) LATIN SMALL LETTER A, NYIAKENG PUACHUE HMONG TONE-J, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E133 0062;00E0 05AE 1E133 0315 0062;0061 05AE 0300 1E133 0315 0062;00E0 05AE 1E133 0315 0062;0061 05AE 0300 1E133 0315 0062; # (a◌̕◌̀◌֮◌𞄳b; à◌֮◌𞄳◌̕b; a◌֮◌̀◌𞄳◌̕b; à◌֮◌𞄳◌̕b; a◌֮◌̀◌𞄳◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NYIAKENG PUACHUE HMONG TONE-V, LATIN SMALL LETTER B +0061 1E133 0315 0300 05AE 0062;0061 05AE 1E133 0300 0315 0062;0061 05AE 1E133 0300 0315 0062;0061 05AE 1E133 0300 0315 0062;0061 05AE 1E133 0300 0315 0062; # (a◌𞄳◌̕◌̀◌֮b; a◌֮◌𞄳◌̀◌̕b; a◌֮◌𞄳◌̀◌̕b; a◌֮◌𞄳◌̀◌̕b; a◌֮◌𞄳◌̀◌̕b; ) LATIN SMALL LETTER A, NYIAKENG PUACHUE HMONG TONE-V, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E134 0062;00E0 05AE 1E134 0315 0062;0061 05AE 0300 1E134 0315 0062;00E0 05AE 1E134 0315 0062;0061 05AE 0300 1E134 0315 0062; # (a◌̕◌̀◌֮◌𞄴b; à◌֮◌𞄴◌̕b; a◌֮◌̀◌𞄴◌̕b; à◌֮◌𞄴◌̕b; a◌֮◌̀◌𞄴◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NYIAKENG PUACHUE HMONG TONE-S, LATIN SMALL LETTER B +0061 1E134 0315 0300 05AE 0062;0061 05AE 1E134 0300 0315 0062;0061 05AE 1E134 0300 0315 0062;0061 05AE 1E134 0300 0315 0062;0061 05AE 1E134 0300 0315 0062; # (a◌𞄴◌̕◌̀◌֮b; a◌֮◌𞄴◌̀◌̕b; a◌֮◌𞄴◌̀◌̕b; a◌֮◌𞄴◌̀◌̕b; a◌֮◌𞄴◌̀◌̕b; ) LATIN SMALL LETTER A, NYIAKENG PUACHUE HMONG TONE-S, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E135 0062;00E0 05AE 1E135 0315 0062;0061 05AE 0300 1E135 0315 0062;00E0 05AE 1E135 0315 0062;0061 05AE 0300 1E135 0315 0062; # (a◌̕◌̀◌֮◌𞄵b; à◌֮◌𞄵◌̕b; a◌֮◌̀◌𞄵◌̕b; à◌֮◌𞄵◌̕b; a◌֮◌̀◌𞄵◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NYIAKENG PUACHUE HMONG TONE-G, LATIN SMALL LETTER B +0061 1E135 0315 0300 05AE 0062;0061 05AE 1E135 0300 0315 0062;0061 05AE 1E135 0300 0315 0062;0061 05AE 1E135 0300 0315 0062;0061 05AE 1E135 0300 0315 0062; # (a◌𞄵◌̕◌̀◌֮b; a◌֮◌𞄵◌̀◌̕b; a◌֮◌𞄵◌̀◌̕b; a◌֮◌𞄵◌̀◌̕b; a◌֮◌𞄵◌̀◌̕b; ) LATIN SMALL LETTER A, NYIAKENG PUACHUE HMONG TONE-G, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E136 0062;00E0 05AE 1E136 0315 0062;0061 05AE 0300 1E136 0315 0062;00E0 05AE 1E136 0315 0062;0061 05AE 0300 1E136 0315 0062; # (a◌̕◌̀◌֮◌𞄶b; à◌֮◌𞄶◌̕b; a◌֮◌̀◌𞄶◌̕b; à◌֮◌𞄶◌̕b; a◌֮◌̀◌𞄶◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NYIAKENG PUACHUE HMONG TONE-D, LATIN SMALL LETTER B +0061 1E136 0315 0300 05AE 0062;0061 05AE 1E136 0300 0315 0062;0061 05AE 1E136 0300 0315 0062;0061 05AE 1E136 0300 0315 0062;0061 05AE 1E136 0300 0315 0062; # (a◌𞄶◌̕◌̀◌֮b; a◌֮◌𞄶◌̀◌̕b; a◌֮◌𞄶◌̀◌̕b; a◌֮◌𞄶◌̀◌̕b; a◌֮◌𞄶◌̀◌̕b; ) LATIN SMALL LETTER A, NYIAKENG PUACHUE HMONG TONE-D, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E2AE 0062;00E0 05AE 1E2AE 0315 0062;0061 05AE 0300 1E2AE 0315 0062;00E0 05AE 1E2AE 0315 0062;0061 05AE 0300 1E2AE 0315 0062; # (a◌̕◌̀◌֮◌𞊮b; à◌֮◌𞊮◌̕b; a◌֮◌̀◌𞊮◌̕b; à◌֮◌𞊮◌̕b; a◌֮◌̀◌𞊮◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TOTO SIGN RISING TONE, LATIN SMALL LETTER B +0061 1E2AE 0315 0300 05AE 0062;0061 05AE 1E2AE 0300 0315 0062;0061 05AE 1E2AE 0300 0315 0062;0061 05AE 1E2AE 0300 0315 0062;0061 05AE 1E2AE 0300 0315 0062; # (a◌𞊮◌̕◌̀◌֮b; a◌֮◌𞊮◌̀◌̕b; a◌֮◌𞊮◌̀◌̕b; a◌֮◌𞊮◌̀◌̕b; a◌֮◌𞊮◌̀◌̕b; ) LATIN SMALL LETTER A, TOTO SIGN RISING TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E2EC 0062;00E0 05AE 1E2EC 0315 0062;0061 05AE 0300 1E2EC 0315 0062;00E0 05AE 1E2EC 0315 0062;0061 05AE 0300 1E2EC 0315 0062; # (a◌̕◌̀◌֮◌𞋬b; à◌֮◌𞋬◌̕b; a◌֮◌̀◌𞋬◌̕b; à◌֮◌𞋬◌̕b; a◌֮◌̀◌𞋬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, WANCHO TONE TUP, LATIN SMALL LETTER B +0061 1E2EC 0315 0300 05AE 0062;0061 05AE 1E2EC 0300 0315 0062;0061 05AE 1E2EC 0300 0315 0062;0061 05AE 1E2EC 0300 0315 0062;0061 05AE 1E2EC 0300 0315 0062; # (a◌𞋬◌̕◌̀◌֮b; a◌֮◌𞋬◌̀◌̕b; a◌֮◌𞋬◌̀◌̕b; a◌֮◌𞋬◌̀◌̕b; a◌֮◌𞋬◌̀◌̕b; ) LATIN SMALL LETTER A, WANCHO TONE TUP, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E2ED 0062;00E0 05AE 1E2ED 0315 0062;0061 05AE 0300 1E2ED 0315 0062;00E0 05AE 1E2ED 0315 0062;0061 05AE 0300 1E2ED 0315 0062; # (a◌̕◌̀◌֮◌𞋭b; à◌֮◌𞋭◌̕b; a◌֮◌̀◌𞋭◌̕b; à◌֮◌𞋭◌̕b; a◌֮◌̀◌𞋭◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, WANCHO TONE TUPNI, LATIN SMALL LETTER B +0061 1E2ED 0315 0300 05AE 0062;0061 05AE 1E2ED 0300 0315 0062;0061 05AE 1E2ED 0300 0315 0062;0061 05AE 1E2ED 0300 0315 0062;0061 05AE 1E2ED 0300 0315 0062; # (a◌𞋭◌̕◌̀◌֮b; a◌֮◌𞋭◌̀◌̕b; a◌֮◌𞋭◌̀◌̕b; a◌֮◌𞋭◌̀◌̕b; a◌֮◌𞋭◌̀◌̕b; ) LATIN SMALL LETTER A, WANCHO TONE TUPNI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E2EE 0062;00E0 05AE 1E2EE 0315 0062;0061 05AE 0300 1E2EE 0315 0062;00E0 05AE 1E2EE 0315 0062;0061 05AE 0300 1E2EE 0315 0062; # (a◌̕◌̀◌֮◌𞋮b; à◌֮◌𞋮◌̕b; a◌֮◌̀◌𞋮◌̕b; à◌֮◌𞋮◌̕b; a◌֮◌̀◌𞋮◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, WANCHO TONE KOI, LATIN SMALL LETTER B +0061 1E2EE 0315 0300 05AE 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062; # (a◌𞋮◌̕◌̀◌֮b; a◌֮◌𞋮◌̀◌̕b; a◌֮◌𞋮◌̀◌̕b; a◌֮◌𞋮◌̀◌̕b; a◌֮◌𞋮◌̀◌̕b; ) LATIN SMALL LETTER A, WANCHO TONE KOI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E2EF 0062;00E0 05AE 1E2EF 0315 0062;0061 05AE 0300 1E2EF 0315 0062;00E0 05AE 1E2EF 0315 0062;0061 05AE 0300 1E2EF 0315 0062; # (a◌̕◌̀◌֮◌𞋯b; à◌֮◌𞋯◌̕b; a◌֮◌̀◌𞋯◌̕b; à◌֮◌𞋯◌̕b; a◌֮◌̀◌𞋯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, WANCHO TONE KOINI, LATIN SMALL LETTER B +0061 1E2EF 0315 0300 05AE 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062; # (a◌𞋯◌̕◌̀◌֮b; a◌֮◌𞋯◌̀◌̕b; a◌֮◌𞋯◌̀◌̕b; a◌֮◌𞋯◌̀◌̕b; a◌֮◌𞋯◌̀◌̕b; ) LATIN SMALL LETTER A, WANCHO TONE KOINI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 035C 0315 0300 1E4EC 0062;00E0 0315 1E4EC 035C 0062;0061 0300 0315 1E4EC 035C 0062;00E0 0315 1E4EC 035C 0062;0061 0300 0315 1E4EC 035C 0062; # (a◌͜◌̕◌̀◌𞓬b; à◌̕◌𞓬◌͜b; a◌̀◌̕◌𞓬◌͜b; à◌̕◌𞓬◌͜b; a◌̀◌̕◌𞓬◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, NAG MUNDARI SIGN MUHOR, LATIN SMALL LETTER B +0061 1E4EC 035C 0315 0300 0062;00E0 1E4EC 0315 035C 0062;0061 0300 1E4EC 0315 035C 0062;00E0 1E4EC 0315 035C 0062;0061 0300 1E4EC 0315 035C 0062; # (a◌𞓬◌͜◌̕◌̀b; à◌𞓬◌̕◌͜b; a◌̀◌𞓬◌̕◌͜b; à◌𞓬◌̕◌͜b; a◌̀◌𞓬◌̕◌͜b; ) LATIN SMALL LETTER A, NAG MUNDARI SIGN MUHOR, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 035C 0315 0300 1E4ED 0062;00E0 0315 1E4ED 035C 0062;0061 0300 0315 1E4ED 035C 0062;00E0 0315 1E4ED 035C 0062;0061 0300 0315 1E4ED 035C 0062; # (a◌͜◌̕◌̀◌𞓭b; à◌̕◌𞓭◌͜b; a◌̀◌̕◌𞓭◌͜b; à◌̕◌𞓭◌͜b; a◌̀◌̕◌𞓭◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, NAG MUNDARI SIGN TOYOR, LATIN SMALL LETTER B +0061 1E4ED 035C 0315 0300 0062;00E0 1E4ED 0315 035C 0062;0061 0300 1E4ED 0315 035C 0062;00E0 1E4ED 0315 035C 0062;0061 0300 1E4ED 0315 035C 0062; # (a◌𞓭◌͜◌̕◌̀b; à◌𞓭◌̕◌͜b; a◌̀◌𞓭◌̕◌͜b; à◌𞓭◌̕◌͜b; a◌̀◌𞓭◌̕◌͜b; ) LATIN SMALL LETTER A, NAG MUNDARI SIGN TOYOR, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1E4EE 0062;0061 1DFA 0316 1E4EE 059A 0062;0061 1DFA 0316 1E4EE 059A 0062;0061 1DFA 0316 1E4EE 059A 0062;0061 1DFA 0316 1E4EE 059A 0062; # (a◌֚◌̖◌᷺◌𞓮b; a◌᷺◌̖◌𞓮◌֚b; a◌᷺◌̖◌𞓮◌֚b; a◌᷺◌̖◌𞓮◌֚b; a◌᷺◌̖◌𞓮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, NAG MUNDARI SIGN IKIR, LATIN SMALL LETTER B +0061 1E4EE 059A 0316 1DFA 0062;0061 1DFA 1E4EE 0316 059A 0062;0061 1DFA 1E4EE 0316 059A 0062;0061 1DFA 1E4EE 0316 059A 0062;0061 1DFA 1E4EE 0316 059A 0062; # (a◌𞓮◌֚◌̖◌᷺b; a◌᷺◌𞓮◌̖◌֚b; a◌᷺◌𞓮◌̖◌֚b; a◌᷺◌𞓮◌̖◌֚b; a◌᷺◌𞓮◌̖◌֚b; ) LATIN SMALL LETTER A, NAG MUNDARI SIGN IKIR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E4EF 0062;00E0 05AE 1E4EF 0315 0062;0061 05AE 0300 1E4EF 0315 0062;00E0 05AE 1E4EF 0315 0062;0061 05AE 0300 1E4EF 0315 0062; # (a◌̕◌̀◌֮◌𞓯b; à◌֮◌𞓯◌̕b; a◌֮◌̀◌𞓯◌̕b; à◌֮◌𞓯◌̕b; a◌֮◌̀◌𞓯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NAG MUNDARI SIGN SUTUH, LATIN SMALL LETTER B +0061 1E4EF 0315 0300 05AE 0062;0061 05AE 1E4EF 0300 0315 0062;0061 05AE 1E4EF 0300 0315 0062;0061 05AE 1E4EF 0300 0315 0062;0061 05AE 1E4EF 0300 0315 0062; # (a◌𞓯◌̕◌̀◌֮b; a◌֮◌𞓯◌̀◌̕b; a◌֮◌𞓯◌̀◌̕b; a◌֮◌𞓯◌̀◌̕b; a◌֮◌𞓯◌̀◌̕b; ) LATIN SMALL LETTER A, NAG MUNDARI SIGN SUTUH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1E8D0 0062;0061 1DFA 0316 1E8D0 059A 0062;0061 1DFA 0316 1E8D0 059A 0062;0061 1DFA 0316 1E8D0 059A 0062;0061 1DFA 0316 1E8D0 059A 0062; # (a◌֚◌̖◌᷺◌𞣐b; a◌᷺◌̖◌𞣐◌֚b; a◌᷺◌̖◌𞣐◌֚b; a◌᷺◌̖◌𞣐◌֚b; a◌᷺◌̖◌𞣐◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER TEENS, LATIN SMALL LETTER B +0061 1E8D0 059A 0316 1DFA 0062;0061 1DFA 1E8D0 0316 059A 0062;0061 1DFA 1E8D0 0316 059A 0062;0061 1DFA 1E8D0 0316 059A 0062;0061 1DFA 1E8D0 0316 059A 0062; # (a◌𞣐◌֚◌̖◌᷺b; a◌᷺◌𞣐◌̖◌֚b; a◌᷺◌𞣐◌̖◌֚b; a◌᷺◌𞣐◌̖◌֚b; a◌᷺◌𞣐◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TEENS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1E8D1 0062;0061 1DFA 0316 1E8D1 059A 0062;0061 1DFA 0316 1E8D1 059A 0062;0061 1DFA 0316 1E8D1 059A 0062;0061 1DFA 0316 1E8D1 059A 0062; # (a◌֚◌̖◌᷺◌𞣑b; a◌᷺◌̖◌𞣑◌֚b; a◌᷺◌̖◌𞣑◌֚b; a◌᷺◌̖◌𞣑◌֚b; a◌᷺◌̖◌𞣑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER TENS, LATIN SMALL LETTER B +0061 1E8D1 059A 0316 1DFA 0062;0061 1DFA 1E8D1 0316 059A 0062;0061 1DFA 1E8D1 0316 059A 0062;0061 1DFA 1E8D1 0316 059A 0062;0061 1DFA 1E8D1 0316 059A 0062; # (a◌𞣑◌֚◌̖◌᷺b; a◌᷺◌𞣑◌̖◌֚b; a◌᷺◌𞣑◌̖◌֚b; a◌᷺◌𞣑◌̖◌֚b; a◌᷺◌𞣑◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TENS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1E8D2 0062;0061 1DFA 0316 1E8D2 059A 0062;0061 1DFA 0316 1E8D2 059A 0062;0061 1DFA 0316 1E8D2 059A 0062;0061 1DFA 0316 1E8D2 059A 0062; # (a◌֚◌̖◌᷺◌𞣒b; a◌᷺◌̖◌𞣒◌֚b; a◌᷺◌̖◌𞣒◌֚b; a◌᷺◌̖◌𞣒◌֚b; a◌᷺◌̖◌𞣒◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER HUNDREDS, LATIN SMALL LETTER B +0061 1E8D2 059A 0316 1DFA 0062;0061 1DFA 1E8D2 0316 059A 0062;0061 1DFA 1E8D2 0316 059A 0062;0061 1DFA 1E8D2 0316 059A 0062;0061 1DFA 1E8D2 0316 059A 0062; # (a◌𞣒◌֚◌̖◌᷺b; a◌᷺◌𞣒◌̖◌֚b; a◌᷺◌𞣒◌̖◌֚b; a◌᷺◌𞣒◌̖◌֚b; a◌᷺◌𞣒◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER HUNDREDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1E8D3 0062;0061 1DFA 0316 1E8D3 059A 0062;0061 1DFA 0316 1E8D3 059A 0062;0061 1DFA 0316 1E8D3 059A 0062;0061 1DFA 0316 1E8D3 059A 0062; # (a◌֚◌̖◌᷺◌𞣓b; a◌᷺◌̖◌𞣓◌֚b; a◌᷺◌̖◌𞣓◌֚b; a◌᷺◌̖◌𞣓◌֚b; a◌᷺◌̖◌𞣓◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER THOUSANDS, LATIN SMALL LETTER B +0061 1E8D3 059A 0316 1DFA 0062;0061 1DFA 1E8D3 0316 059A 0062;0061 1DFA 1E8D3 0316 059A 0062;0061 1DFA 1E8D3 0316 059A 0062;0061 1DFA 1E8D3 0316 059A 0062; # (a◌𞣓◌֚◌̖◌᷺b; a◌᷺◌𞣓◌̖◌֚b; a◌᷺◌𞣓◌̖◌֚b; a◌᷺◌𞣓◌̖◌֚b; a◌᷺◌𞣓◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER THOUSANDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1E8D4 0062;0061 1DFA 0316 1E8D4 059A 0062;0061 1DFA 0316 1E8D4 059A 0062;0061 1DFA 0316 1E8D4 059A 0062;0061 1DFA 0316 1E8D4 059A 0062; # (a◌֚◌̖◌᷺◌𞣔b; a◌᷺◌̖◌𞣔◌֚b; a◌᷺◌̖◌𞣔◌֚b; a◌᷺◌̖◌𞣔◌֚b; a◌᷺◌̖◌𞣔◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS, LATIN SMALL LETTER B +0061 1E8D4 059A 0316 1DFA 0062;0061 1DFA 1E8D4 0316 059A 0062;0061 1DFA 1E8D4 0316 059A 0062;0061 1DFA 1E8D4 0316 059A 0062;0061 1DFA 1E8D4 0316 059A 0062; # (a◌𞣔◌֚◌̖◌᷺b; a◌᷺◌𞣔◌̖◌֚b; a◌᷺◌𞣔◌̖◌֚b; a◌᷺◌𞣔◌̖◌֚b; a◌᷺◌𞣔◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1E8D5 0062;0061 1DFA 0316 1E8D5 059A 0062;0061 1DFA 0316 1E8D5 059A 0062;0061 1DFA 0316 1E8D5 059A 0062;0061 1DFA 0316 1E8D5 059A 0062; # (a◌֚◌̖◌᷺◌𞣕b; a◌᷺◌̖◌𞣕◌֚b; a◌᷺◌̖◌𞣕◌֚b; a◌᷺◌̖◌𞣕◌֚b; a◌᷺◌̖◌𞣕◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS, LATIN SMALL LETTER B +0061 1E8D5 059A 0316 1DFA 0062;0061 1DFA 1E8D5 0316 059A 0062;0061 1DFA 1E8D5 0316 059A 0062;0061 1DFA 1E8D5 0316 059A 0062;0061 1DFA 1E8D5 0316 059A 0062; # (a◌𞣕◌֚◌̖◌᷺b; a◌᷺◌𞣕◌̖◌֚b; a◌᷺◌𞣕◌̖◌֚b; a◌᷺◌𞣕◌̖◌֚b; a◌᷺◌𞣕◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 059A 0316 1DFA 1E8D6 0062;0061 1DFA 0316 1E8D6 059A 0062;0061 1DFA 0316 1E8D6 059A 0062;0061 1DFA 0316 1E8D6 059A 0062;0061 1DFA 0316 1E8D6 059A 0062; # (a◌֚◌̖◌᷺◌𞣖b; a◌᷺◌̖◌𞣖◌֚b; a◌᷺◌̖◌𞣖◌֚b; a◌᷺◌̖◌𞣖◌֚b; a◌᷺◌̖◌𞣖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER MILLIONS, LATIN SMALL LETTER B +0061 1E8D6 059A 0316 1DFA 0062;0061 1DFA 1E8D6 0316 059A 0062;0061 1DFA 1E8D6 0316 059A 0062;0061 1DFA 1E8D6 0316 059A 0062;0061 1DFA 1E8D6 0316 059A 0062; # (a◌𞣖◌֚◌̖◌᷺b; a◌᷺◌𞣖◌̖◌֚b; a◌᷺◌𞣖◌̖◌֚b; a◌᷺◌𞣖◌̖◌֚b; a◌᷺◌𞣖◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER MILLIONS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E944 0062;00E0 05AE 1E944 0315 0062;0061 05AE 0300 1E944 0315 0062;00E0 05AE 1E944 0315 0062;0061 05AE 0300 1E944 0315 0062; # (a◌̕◌̀◌֮◌𞥄b; à◌֮◌𞥄◌̕b; a◌֮◌̀◌𞥄◌̕b; à◌֮◌𞥄◌̕b; a◌֮◌̀◌𞥄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM ALIF LENGTHENER, LATIN SMALL LETTER B +0061 1E944 0315 0300 05AE 0062;0061 05AE 1E944 0300 0315 0062;0061 05AE 1E944 0300 0315 0062;0061 05AE 1E944 0300 0315 0062;0061 05AE 1E944 0300 0315 0062; # (a◌𞥄◌̕◌̀◌֮b; a◌֮◌𞥄◌̀◌̕b; a◌֮◌𞥄◌̀◌̕b; a◌֮◌𞥄◌̀◌̕b; a◌֮◌𞥄◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM ALIF LENGTHENER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E945 0062;00E0 05AE 1E945 0315 0062;0061 05AE 0300 1E945 0315 0062;00E0 05AE 1E945 0315 0062;0061 05AE 0300 1E945 0315 0062; # (a◌̕◌̀◌֮◌𞥅b; à◌֮◌𞥅◌̕b; a◌֮◌̀◌𞥅◌̕b; à◌֮◌𞥅◌̕b; a◌֮◌̀◌𞥅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM VOWEL LENGTHENER, LATIN SMALL LETTER B +0061 1E945 0315 0300 05AE 0062;0061 05AE 1E945 0300 0315 0062;0061 05AE 1E945 0300 0315 0062;0061 05AE 1E945 0300 0315 0062;0061 05AE 1E945 0300 0315 0062; # (a◌𞥅◌̕◌̀◌֮b; a◌֮◌𞥅◌̀◌̕b; a◌֮◌𞥅◌̀◌̕b; a◌֮◌𞥅◌̀◌̕b; a◌֮◌𞥅◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM VOWEL LENGTHENER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E946 0062;00E0 05AE 1E946 0315 0062;0061 05AE 0300 1E946 0315 0062;00E0 05AE 1E946 0315 0062;0061 05AE 0300 1E946 0315 0062; # (a◌̕◌̀◌֮◌𞥆b; à◌֮◌𞥆◌̕b; a◌֮◌̀◌𞥆◌̕b; à◌֮◌𞥆◌̕b; a◌֮◌̀◌𞥆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM GEMINATION MARK, LATIN SMALL LETTER B +0061 1E946 0315 0300 05AE 0062;0061 05AE 1E946 0300 0315 0062;0061 05AE 1E946 0300 0315 0062;0061 05AE 1E946 0300 0315 0062;0061 05AE 1E946 0300 0315 0062; # (a◌𞥆◌̕◌̀◌֮b; a◌֮◌𞥆◌̀◌̕b; a◌֮◌𞥆◌̀◌̕b; a◌֮◌𞥆◌̀◌̕b; a◌֮◌𞥆◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM GEMINATION MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E947 0062;00E0 05AE 1E947 0315 0062;0061 05AE 0300 1E947 0315 0062;00E0 05AE 1E947 0315 0062;0061 05AE 0300 1E947 0315 0062; # (a◌̕◌̀◌֮◌𞥇b; à◌֮◌𞥇◌̕b; a◌֮◌̀◌𞥇◌̕b; à◌֮◌𞥇◌̕b; a◌֮◌̀◌𞥇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM HAMZA, LATIN SMALL LETTER B +0061 1E947 0315 0300 05AE 0062;0061 05AE 1E947 0300 0315 0062;0061 05AE 1E947 0300 0315 0062;0061 05AE 1E947 0300 0315 0062;0061 05AE 1E947 0300 0315 0062; # (a◌𞥇◌̕◌̀◌֮b; a◌֮◌𞥇◌̀◌̕b; a◌֮◌𞥇◌̀◌̕b; a◌֮◌𞥇◌̀◌̕b; a◌֮◌𞥇◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM HAMZA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E948 0062;00E0 05AE 1E948 0315 0062;0061 05AE 0300 1E948 0315 0062;00E0 05AE 1E948 0315 0062;0061 05AE 0300 1E948 0315 0062; # (a◌̕◌̀◌֮◌𞥈b; à◌֮◌𞥈◌̕b; a◌֮◌̀◌𞥈◌̕b; à◌֮◌𞥈◌̕b; a◌֮◌̀◌𞥈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM CONSONANT MODIFIER, LATIN SMALL LETTER B +0061 1E948 0315 0300 05AE 0062;0061 05AE 1E948 0300 0315 0062;0061 05AE 1E948 0300 0315 0062;0061 05AE 1E948 0300 0315 0062;0061 05AE 1E948 0300 0315 0062; # (a◌𞥈◌̕◌̀◌֮b; a◌֮◌𞥈◌̀◌̕b; a◌֮◌𞥈◌̀◌̕b; a◌֮◌𞥈◌̀◌̕b; a◌֮◌𞥈◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM CONSONANT MODIFIER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 0315 0300 05AE 1E949 0062;00E0 05AE 1E949 0315 0062;0061 05AE 0300 1E949 0315 0062;00E0 05AE 1E949 0315 0062;0061 05AE 0300 1E949 0315 0062; # (a◌̕◌̀◌֮◌𞥉b; à◌֮◌𞥉◌̕b; a◌֮◌̀◌𞥉◌̕b; à◌֮◌𞥉◌̕b; a◌֮◌̀◌𞥉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM GEMINATE CONSONANT MODIFIER, LATIN SMALL LETTER B +0061 1E949 0315 0300 05AE 0062;0061 05AE 1E949 0300 0315 0062;0061 05AE 1E949 0300 0315 0062;0061 05AE 1E949 0300 0315 0062;0061 05AE 1E949 0300 0315 0062; # (a◌𞥉◌̕◌̀◌֮b; a◌֮◌𞥉◌̀◌̕b; a◌֮◌𞥉◌̀◌̕b; a◌֮◌𞥉◌̀◌̕b; a◌֮◌𞥉◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM GEMINATE CONSONANT MODIFIER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B +0061 3099 093C 16FF0 1E94A 0062;0061 16FF0 093C 1E94A 3099 0062;0061 16FF0 093C 1E94A 3099 0062;0061 16FF0 093C 1E94A 3099 0062;0061 16FF0 093C 1E94A 3099 0062; # (a◌゙◌𖿰़◌𞥊b; a𖿰◌़◌𞥊◌゙b; a𖿰◌़◌𞥊◌゙b; a𖿰◌़◌𞥊◌゙b; a𖿰◌़◌𞥊◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, ADLAM NUKTA, LATIN SMALL LETTER B +0061 1E94A 3099 093C 16FF0 0062;0061 16FF0 1E94A 093C 3099 0062;0061 16FF0 1E94A 093C 3099 0062;0061 16FF0 1E94A 093C 3099 0062;0061 16FF0 1E94A 093C 3099 0062; # (a◌𞥊◌゙◌𖿰़b; a𖿰◌𞥊◌़◌゙b; a𖿰◌𞥊◌़◌゙b; a𖿰◌𞥊◌़◌゙b; a𖿰◌𞥊◌़◌゙b; ) LATIN SMALL LETTER A, ADLAM NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B +# +@Part3 # PRI #29 Test +# +09C7 0334 09BE;09C7 0334 09BE;09C7 0334 09BE;09C7 0334 09BE;09C7 0334 09BE; # (ে◌̴া; ে◌̴া; ে◌̴া; ে◌̴া; ে◌̴া; ) BENGALI VOWEL SIGN E, COMBINING TILDE OVERLAY, BENGALI VOWEL SIGN AA +09C7 0334 09D7;09C7 0334 09D7;09C7 0334 09D7;09C7 0334 09D7;09C7 0334 09D7; # (ে◌̴ৗ; ে◌̴ৗ; ে◌̴ৗ; ে◌̴ৗ; ে◌̴ৗ; ) BENGALI VOWEL SIGN E, COMBINING TILDE OVERLAY, BENGALI AU LENGTH MARK +0B47 0334 0B3E;0B47 0334 0B3E;0B47 0334 0B3E;0B47 0334 0B3E;0B47 0334 0B3E; # (େ◌̴ା; େ◌̴ା; େ◌̴ା; େ◌̴ା; େ◌̴ା; ) ORIYA VOWEL SIGN E, COMBINING TILDE OVERLAY, ORIYA VOWEL SIGN AA +0B47 0334 0B56;0B47 0334 0B56;0B47 0334 0B56;0B47 0334 0B56;0B47 0334 0B56; # (େ◌̴◌ୖ; େ◌̴◌ୖ; େ◌̴◌ୖ; େ◌̴◌ୖ; େ◌̴◌ୖ; ) ORIYA VOWEL SIGN E, COMBINING TILDE OVERLAY, ORIYA AI LENGTH MARK +0B47 0334 0B57;0B47 0334 0B57;0B47 0334 0B57;0B47 0334 0B57;0B47 0334 0B57; # (େ◌̴ୗ; େ◌̴ୗ; େ◌̴ୗ; େ◌̴ୗ; େ◌̴ୗ; ) ORIYA VOWEL SIGN E, COMBINING TILDE OVERLAY, ORIYA AU LENGTH MARK +0B92 0334 0BD7;0B92 0334 0BD7;0B92 0334 0BD7;0B92 0334 0BD7;0B92 0334 0BD7; # (ஒ◌̴ௗ; ஒ◌̴ௗ; ஒ◌̴ௗ; ஒ◌̴ௗ; ஒ◌̴ௗ; ) TAMIL LETTER O, COMBINING TILDE OVERLAY, TAMIL AU LENGTH MARK +0BC6 0334 0BBE;0BC6 0334 0BBE;0BC6 0334 0BBE;0BC6 0334 0BBE;0BC6 0334 0BBE; # (ெ◌̴ா; ெ◌̴ா; ெ◌̴ா; ெ◌̴ா; ெ◌̴ா; ) TAMIL VOWEL SIGN E, COMBINING TILDE OVERLAY, TAMIL VOWEL SIGN AA +0BC6 0334 0BD7;0BC6 0334 0BD7;0BC6 0334 0BD7;0BC6 0334 0BD7;0BC6 0334 0BD7; # (ெ◌̴ௗ; ெ◌̴ௗ; ெ◌̴ௗ; ெ◌̴ௗ; ெ◌̴ௗ; ) TAMIL VOWEL SIGN E, COMBINING TILDE OVERLAY, TAMIL AU LENGTH MARK +0BC7 0334 0BBE;0BC7 0334 0BBE;0BC7 0334 0BBE;0BC7 0334 0BBE;0BC7 0334 0BBE; # (ே◌̴ா; ே◌̴ா; ே◌̴ா; ே◌̴ா; ே◌̴ா; ) TAMIL VOWEL SIGN EE, COMBINING TILDE OVERLAY, TAMIL VOWEL SIGN AA +0CBF 0334 0CD5;0CBF 0334 0CD5;0CBF 0334 0CD5;0CBF 0334 0CD5;0CBF 0334 0CD5; # (◌ಿ◌̴ೕ; ◌ಿ◌̴ೕ; ◌ಿ◌̴ೕ; ◌ಿ◌̴ೕ; ◌ಿ◌̴ೕ; ) KANNADA VOWEL SIGN I, COMBINING TILDE OVERLAY, KANNADA LENGTH MARK +0CC6 0334 0CC2;0CC6 0334 0CC2;0CC6 0334 0CC2;0CC6 0334 0CC2;0CC6 0334 0CC2; # (◌ೆ◌̴ೂ; ◌ೆ◌̴ೂ; ◌ೆ◌̴ೂ; ◌ೆ◌̴ೂ; ◌ೆ◌̴ೂ; ) KANNADA VOWEL SIGN E, COMBINING TILDE OVERLAY, KANNADA VOWEL SIGN UU +0CC6 0334 0CD5;0CC6 0334 0CD5;0CC6 0334 0CD5;0CC6 0334 0CD5;0CC6 0334 0CD5; # (◌ೆ◌̴ೕ; ◌ೆ◌̴ೕ; ◌ೆ◌̴ೕ; ◌ೆ◌̴ೕ; ◌ೆ◌̴ೕ; ) KANNADA VOWEL SIGN E, COMBINING TILDE OVERLAY, KANNADA LENGTH MARK +0CC6 0334 0CD6;0CC6 0334 0CD6;0CC6 0334 0CD6;0CC6 0334 0CD6;0CC6 0334 0CD6; # (◌ೆ◌̴ೖ; ◌ೆ◌̴ೖ; ◌ೆ◌̴ೖ; ◌ೆ◌̴ೖ; ◌ೆ◌̴ೖ; ) KANNADA VOWEL SIGN E, COMBINING TILDE OVERLAY, KANNADA AI LENGTH MARK +0CCA 0334 0CD5;0CCA 0334 0CD5;0CC6 0CC2 0334 0CD5;0CCA 0334 0CD5;0CC6 0CC2 0334 0CD5; # (ೊ◌̴ೕ; ೊ◌̴ೕ; ◌ೊ◌̴ೕ; ೊ◌̴ೕ; ◌ೊ◌̴ೕ; ) KANNADA VOWEL SIGN O, COMBINING TILDE OVERLAY, KANNADA LENGTH MARK +0D46 0334 0D3E;0D46 0334 0D3E;0D46 0334 0D3E;0D46 0334 0D3E;0D46 0334 0D3E; # (െ◌̴ാ; െ◌̴ാ; െ◌̴ാ; െ◌̴ാ; െ◌̴ാ; ) MALAYALAM VOWEL SIGN E, COMBINING TILDE OVERLAY, MALAYALAM VOWEL SIGN AA +0D46 0334 0D57;0D46 0334 0D57;0D46 0334 0D57;0D46 0334 0D57;0D46 0334 0D57; # (െ◌̴ൗ; െ◌̴ൗ; െ◌̴ൗ; െ◌̴ൗ; െ◌̴ൗ; ) MALAYALAM VOWEL SIGN E, COMBINING TILDE OVERLAY, MALAYALAM AU LENGTH MARK +0D47 0334 0D3E;0D47 0334 0D3E;0D47 0334 0D3E;0D47 0334 0D3E;0D47 0334 0D3E; # (േ◌̴ാ; േ◌̴ാ; േ◌̴ാ; േ◌̴ാ; േ◌̴ാ; ) MALAYALAM VOWEL SIGN EE, COMBINING TILDE OVERLAY, MALAYALAM VOWEL SIGN AA +0DD9 0334 0DCF;0DD9 0334 0DCF;0DD9 0334 0DCF;0DD9 0334 0DCF;0DD9 0334 0DCF; # (ෙ◌̴ා; ෙ◌̴ා; ෙ◌̴ා; ෙ◌̴ා; ෙ◌̴ා; ) SINHALA VOWEL SIGN KOMBUVA, COMBINING TILDE OVERLAY, SINHALA VOWEL SIGN AELA-PILLA +0DD9 0334 0DDF;0DD9 0334 0DDF;0DD9 0334 0DDF;0DD9 0334 0DDF;0DD9 0334 0DDF; # (ෙ◌̴ෟ; ෙ◌̴ෟ; ෙ◌̴ෟ; ෙ◌̴ෟ; ෙ◌̴ෟ; ) SINHALA VOWEL SIGN KOMBUVA, COMBINING TILDE OVERLAY, SINHALA VOWEL SIGN GAYANUKITTA +0F40 0334 0FB5;0F40 0334 0FB5;0F40 0334 0FB5;0F40 0334 0FB5;0F40 0334 0FB5; # (ཀ◌̴◌ྵ; ཀ◌̴◌ྵ; ཀ◌̴◌ྵ; ཀ◌̴◌ྵ; ཀ◌̴◌ྵ; ) TIBETAN LETTER KA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER SSA +0F42 0334 0FB7;0F42 0334 0FB7;0F42 0334 0FB7;0F42 0334 0FB7;0F42 0334 0FB7; # (ག◌̴◌ྷ; ག◌̴◌ྷ; ག◌̴◌ྷ; ག◌̴◌ྷ; ག◌̴◌ྷ; ) TIBETAN LETTER GA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER HA +0F4C 0334 0FB7;0F4C 0334 0FB7;0F4C 0334 0FB7;0F4C 0334 0FB7;0F4C 0334 0FB7; # (ཌ◌̴◌ྷ; ཌ◌̴◌ྷ; ཌ◌̴◌ྷ; ཌ◌̴◌ྷ; ཌ◌̴◌ྷ; ) TIBETAN LETTER DDA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER HA +0F51 0334 0FB7;0F51 0334 0FB7;0F51 0334 0FB7;0F51 0334 0FB7;0F51 0334 0FB7; # (ད◌̴◌ྷ; ད◌̴◌ྷ; ད◌̴◌ྷ; ད◌̴◌ྷ; ད◌̴◌ྷ; ) TIBETAN LETTER DA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER HA +0F56 0334 0FB7;0F56 0334 0FB7;0F56 0334 0FB7;0F56 0334 0FB7;0F56 0334 0FB7; # (བ◌̴◌ྷ; བ◌̴◌ྷ; བ◌̴◌ྷ; བ◌̴◌ྷ; བ◌̴◌ྷ; ) TIBETAN LETTER BA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER HA +0F5B 0334 0FB7;0F5B 0334 0FB7;0F5B 0334 0FB7;0F5B 0334 0FB7;0F5B 0334 0FB7; # (ཛ◌̴◌ྷ; ཛ◌̴◌ྷ; ཛ◌̴◌ྷ; ཛ◌̴◌ྷ; ཛ◌̴◌ྷ; ) TIBETAN LETTER DZA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER HA +0F90 0334 0FB5;0F90 0334 0FB5;0F90 0334 0FB5;0F90 0334 0FB5;0F90 0334 0FB5; # (◌ྐ◌̴◌ྵ; ◌ྐ◌̴◌ྵ; ◌ྐ◌̴◌ྵ; ◌ྐ◌̴◌ྵ; ◌ྐ◌̴◌ྵ; ) TIBETAN SUBJOINED LETTER KA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER SSA +0F92 0334 0FB7;0F92 0334 0FB7;0F92 0334 0FB7;0F92 0334 0FB7;0F92 0334 0FB7; # (◌ྒ◌̴◌ྷ; ◌ྒ◌̴◌ྷ; ◌ྒ◌̴◌ྷ; ◌ྒ◌̴◌ྷ; ◌ྒ◌̴◌ྷ; ) TIBETAN SUBJOINED LETTER GA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER HA +0F9C 0334 0FB7;0F9C 0334 0FB7;0F9C 0334 0FB7;0F9C 0334 0FB7;0F9C 0334 0FB7; # (◌ྜ◌̴◌ྷ; ◌ྜ◌̴◌ྷ; ◌ྜ◌̴◌ྷ; ◌ྜ◌̴◌ྷ; ◌ྜ◌̴◌ྷ; ) TIBETAN SUBJOINED LETTER DDA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER HA +0FA1 0334 0FB7;0FA1 0334 0FB7;0FA1 0334 0FB7;0FA1 0334 0FB7;0FA1 0334 0FB7; # (◌ྡ◌̴◌ྷ; ◌ྡ◌̴◌ྷ; ◌ྡ◌̴◌ྷ; ◌ྡ◌̴◌ྷ; ◌ྡ◌̴◌ྷ; ) TIBETAN SUBJOINED LETTER DA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER HA +0FA6 0334 0FB7;0FA6 0334 0FB7;0FA6 0334 0FB7;0FA6 0334 0FB7;0FA6 0334 0FB7; # (◌ྦ◌̴◌ྷ; ◌ྦ◌̴◌ྷ; ◌ྦ◌̴◌ྷ; ◌ྦ◌̴◌ྷ; ◌ྦ◌̴◌ྷ; ) TIBETAN SUBJOINED LETTER BA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER HA +0FAB 0334 0FB7;0FAB 0334 0FB7;0FAB 0334 0FB7;0FAB 0334 0FB7;0FAB 0334 0FB7; # (◌ྫ◌̴◌ྷ; ◌ྫ◌̴◌ྷ; ◌ྫ◌̴◌ྷ; ◌ྫ◌̴◌ྷ; ◌ྫ◌̴◌ྷ; ) TIBETAN SUBJOINED LETTER DZA, COMBINING TILDE OVERLAY, TIBETAN SUBJOINED LETTER HA +1025 0334 102E;1025 0334 102E;1025 0334 102E;1025 0334 102E;1025 0334 102E; # (ဥ◌̴◌ီ; ဥ◌̴◌ီ; ဥ◌̴◌ီ; ဥ◌̴◌ီ; ဥ◌̴◌ီ; ) MYANMAR LETTER U, COMBINING TILDE OVERLAY, MYANMAR VOWEL SIGN II +1100 0334 1161;1100 0334 1161;1100 0334 1161;1100 0334 1161;1100 0334 1161; # (ᄀ◌̴ᅡ; ᄀ◌̴ᅡ; ᄀ◌̴ᅡ; ᄀ◌̴ᅡ; ᄀ◌̴ᅡ; ) HANGUL CHOSEONG KIYEOK, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG A +1100 0334 116E;1100 0334 116E;1100 0334 116E;1100 0334 116E;1100 0334 116E; # (ᄀ◌̴ᅮ; ᄀ◌̴ᅮ; ᄀ◌̴ᅮ; ᄀ◌̴ᅮ; ᄀ◌̴ᅮ; ) HANGUL CHOSEONG KIYEOK, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG U +1101 0334 1166;1101 0334 1166;1101 0334 1166;1101 0334 1166;1101 0334 1166; # (ᄁ◌̴ᅦ; ᄁ◌̴ᅦ; ᄁ◌̴ᅦ; ᄁ◌̴ᅦ; ᄁ◌̴ᅦ; ) HANGUL CHOSEONG SSANGKIYEOK, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG E +1101 0334 1173;1101 0334 1173;1101 0334 1173;1101 0334 1173;1101 0334 1173; # (ᄁ◌̴ᅳ; ᄁ◌̴ᅳ; ᄁ◌̴ᅳ; ᄁ◌̴ᅳ; ᄁ◌̴ᅳ; ) HANGUL CHOSEONG SSANGKIYEOK, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG EU +1102 0334 116B;1102 0334 116B;1102 0334 116B;1102 0334 116B;1102 0334 116B; # (ᄂ◌̴ᅫ; ᄂ◌̴ᅫ; ᄂ◌̴ᅫ; ᄂ◌̴ᅫ; ᄂ◌̴ᅫ; ) HANGUL CHOSEONG NIEUN, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG WAE +1103 0334 1163;1103 0334 1163;1103 0334 1163;1103 0334 1163;1103 0334 1163; # (ᄃ◌̴ᅣ; ᄃ◌̴ᅣ; ᄃ◌̴ᅣ; ᄃ◌̴ᅣ; ᄃ◌̴ᅣ; ) HANGUL CHOSEONG TIKEUT, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG YA +1103 0334 1170;1103 0334 1170;1103 0334 1170;1103 0334 1170;1103 0334 1170; # (ᄃ◌̴ᅰ; ᄃ◌̴ᅰ; ᄃ◌̴ᅰ; ᄃ◌̴ᅰ; ᄃ◌̴ᅰ; ) HANGUL CHOSEONG TIKEUT, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG WE +1104 0334 1168;1104 0334 1168;1104 0334 1168;1104 0334 1168;1104 0334 1168; # (ᄄ◌̴ᅨ; ᄄ◌̴ᅨ; ᄄ◌̴ᅨ; ᄄ◌̴ᅨ; ᄄ◌̴ᅨ; ) HANGUL CHOSEONG SSANGTIKEUT, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG YE +1104 0334 1175;1104 0334 1175;1104 0334 1175;1104 0334 1175;1104 0334 1175; # (ᄄ◌̴ᅵ; ᄄ◌̴ᅵ; ᄄ◌̴ᅵ; ᄄ◌̴ᅵ; ᄄ◌̴ᅵ; ) HANGUL CHOSEONG SSANGTIKEUT, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG I +1105 0334 116D;1105 0334 116D;1105 0334 116D;1105 0334 116D;1105 0334 116D; # (ᄅ◌̴ᅭ; ᄅ◌̴ᅭ; ᄅ◌̴ᅭ; ᄅ◌̴ᅭ; ᄅ◌̴ᅭ; ) HANGUL CHOSEONG RIEUL, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG YO +1106 0334 1165;1106 0334 1165;1106 0334 1165;1106 0334 1165;1106 0334 1165; # (ᄆ◌̴ᅥ; ᄆ◌̴ᅥ; ᄆ◌̴ᅥ; ᄆ◌̴ᅥ; ᄆ◌̴ᅥ; ) HANGUL CHOSEONG MIEUM, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG EO +1106 0334 1172;1106 0334 1172;1106 0334 1172;1106 0334 1172;1106 0334 1172; # (ᄆ◌̴ᅲ; ᄆ◌̴ᅲ; ᄆ◌̴ᅲ; ᄆ◌̴ᅲ; ᄆ◌̴ᅲ; ) HANGUL CHOSEONG MIEUM, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG YU +1107 0334 116A;1107 0334 116A;1107 0334 116A;1107 0334 116A;1107 0334 116A; # (ᄇ◌̴ᅪ; ᄇ◌̴ᅪ; ᄇ◌̴ᅪ; ᄇ◌̴ᅪ; ᄇ◌̴ᅪ; ) HANGUL CHOSEONG PIEUP, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG WA +1108 0334 1162;1108 0334 1162;1108 0334 1162;1108 0334 1162;1108 0334 1162; # (ᄈ◌̴ᅢ; ᄈ◌̴ᅢ; ᄈ◌̴ᅢ; ᄈ◌̴ᅢ; ᄈ◌̴ᅢ; ) HANGUL CHOSEONG SSANGPIEUP, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG AE +1108 0334 116F;1108 0334 116F;1108 0334 116F;1108 0334 116F;1108 0334 116F; # (ᄈ◌̴ᅯ; ᄈ◌̴ᅯ; ᄈ◌̴ᅯ; ᄈ◌̴ᅯ; ᄈ◌̴ᅯ; ) HANGUL CHOSEONG SSANGPIEUP, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG WEO +1109 0334 1167;1109 0334 1167;1109 0334 1167;1109 0334 1167;1109 0334 1167; # (ᄉ◌̴ᅧ; ᄉ◌̴ᅧ; ᄉ◌̴ᅧ; ᄉ◌̴ᅧ; ᄉ◌̴ᅧ; ) HANGUL CHOSEONG SIOS, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG YEO +1109 0334 1174;1109 0334 1174;1109 0334 1174;1109 0334 1174;1109 0334 1174; # (ᄉ◌̴ᅴ; ᄉ◌̴ᅴ; ᄉ◌̴ᅴ; ᄉ◌̴ᅴ; ᄉ◌̴ᅴ; ) HANGUL CHOSEONG SIOS, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG YI +110A 0334 116C;110A 0334 116C;110A 0334 116C;110A 0334 116C;110A 0334 116C; # (ᄊ◌̴ᅬ; ᄊ◌̴ᅬ; ᄊ◌̴ᅬ; ᄊ◌̴ᅬ; ᄊ◌̴ᅬ; ) HANGUL CHOSEONG SSANGSIOS, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG OE +110B 0334 1164;110B 0334 1164;110B 0334 1164;110B 0334 1164;110B 0334 1164; # (ᄋ◌̴ᅤ; ᄋ◌̴ᅤ; ᄋ◌̴ᅤ; ᄋ◌̴ᅤ; ᄋ◌̴ᅤ; ) HANGUL CHOSEONG IEUNG, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG YAE +110B 0334 1171;110B 0334 1171;110B 0334 1171;110B 0334 1171;110B 0334 1171; # (ᄋ◌̴ᅱ; ᄋ◌̴ᅱ; ᄋ◌̴ᅱ; ᄋ◌̴ᅱ; ᄋ◌̴ᅱ; ) HANGUL CHOSEONG IEUNG, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG WI +110C 0334 1169;110C 0334 1169;110C 0334 1169;110C 0334 1169;110C 0334 1169; # (ᄌ◌̴ᅩ; ᄌ◌̴ᅩ; ᄌ◌̴ᅩ; ᄌ◌̴ᅩ; ᄌ◌̴ᅩ; ) HANGUL CHOSEONG CIEUC, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG O +110D 0334 1161;110D 0334 1161;110D 0334 1161;110D 0334 1161;110D 0334 1161; # (ᄍ◌̴ᅡ; ᄍ◌̴ᅡ; ᄍ◌̴ᅡ; ᄍ◌̴ᅡ; ᄍ◌̴ᅡ; ) HANGUL CHOSEONG SSANGCIEUC, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG A +110D 0334 116E;110D 0334 116E;110D 0334 116E;110D 0334 116E;110D 0334 116E; # (ᄍ◌̴ᅮ; ᄍ◌̴ᅮ; ᄍ◌̴ᅮ; ᄍ◌̴ᅮ; ᄍ◌̴ᅮ; ) HANGUL CHOSEONG SSANGCIEUC, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG U +110E 0334 1166;110E 0334 1166;110E 0334 1166;110E 0334 1166;110E 0334 1166; # (ᄎ◌̴ᅦ; ᄎ◌̴ᅦ; ᄎ◌̴ᅦ; ᄎ◌̴ᅦ; ᄎ◌̴ᅦ; ) HANGUL CHOSEONG CHIEUCH, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG E +110E 0334 1173;110E 0334 1173;110E 0334 1173;110E 0334 1173;110E 0334 1173; # (ᄎ◌̴ᅳ; ᄎ◌̴ᅳ; ᄎ◌̴ᅳ; ᄎ◌̴ᅳ; ᄎ◌̴ᅳ; ) HANGUL CHOSEONG CHIEUCH, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG EU +110F 0334 116B;110F 0334 116B;110F 0334 116B;110F 0334 116B;110F 0334 116B; # (ᄏ◌̴ᅫ; ᄏ◌̴ᅫ; ᄏ◌̴ᅫ; ᄏ◌̴ᅫ; ᄏ◌̴ᅫ; ) HANGUL CHOSEONG KHIEUKH, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG WAE +1110 0334 1163;1110 0334 1163;1110 0334 1163;1110 0334 1163;1110 0334 1163; # (ᄐ◌̴ᅣ; ᄐ◌̴ᅣ; ᄐ◌̴ᅣ; ᄐ◌̴ᅣ; ᄐ◌̴ᅣ; ) HANGUL CHOSEONG THIEUTH, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG YA +1110 0334 1170;1110 0334 1170;1110 0334 1170;1110 0334 1170;1110 0334 1170; # (ᄐ◌̴ᅰ; ᄐ◌̴ᅰ; ᄐ◌̴ᅰ; ᄐ◌̴ᅰ; ᄐ◌̴ᅰ; ) HANGUL CHOSEONG THIEUTH, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG WE +1111 0334 1168;1111 0334 1168;1111 0334 1168;1111 0334 1168;1111 0334 1168; # (ᄑ◌̴ᅨ; ᄑ◌̴ᅨ; ᄑ◌̴ᅨ; ᄑ◌̴ᅨ; ᄑ◌̴ᅨ; ) HANGUL CHOSEONG PHIEUPH, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG YE +1111 0334 1175;1111 0334 1175;1111 0334 1175;1111 0334 1175;1111 0334 1175; # (ᄑ◌̴ᅵ; ᄑ◌̴ᅵ; ᄑ◌̴ᅵ; ᄑ◌̴ᅵ; ᄑ◌̴ᅵ; ) HANGUL CHOSEONG PHIEUPH, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG I +1112 0334 116D;1112 0334 116D;1112 0334 116D;1112 0334 116D;1112 0334 116D; # (ᄒ◌̴ᅭ; ᄒ◌̴ᅭ; ᄒ◌̴ᅭ; ᄒ◌̴ᅭ; ᄒ◌̴ᅭ; ) HANGUL CHOSEONG HIEUH, COMBINING TILDE OVERLAY, HANGUL JUNGSEONG YO +1B05 0334 1B35;1B05 0334 1B35;1B05 0334 1B35;1B05 0334 1B35;1B05 0334 1B35; # (ᬅ◌̴ᬵ; ᬅ◌̴ᬵ; ᬅ◌̴ᬵ; ᬅ◌̴ᬵ; ᬅ◌̴ᬵ; ) BALINESE LETTER AKARA, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +1B07 0334 1B35;1B07 0334 1B35;1B07 0334 1B35;1B07 0334 1B35;1B07 0334 1B35; # (ᬇ◌̴ᬵ; ᬇ◌̴ᬵ; ᬇ◌̴ᬵ; ᬇ◌̴ᬵ; ᬇ◌̴ᬵ; ) BALINESE LETTER IKARA, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +1B09 0334 1B35;1B09 0334 1B35;1B09 0334 1B35;1B09 0334 1B35;1B09 0334 1B35; # (ᬉ◌̴ᬵ; ᬉ◌̴ᬵ; ᬉ◌̴ᬵ; ᬉ◌̴ᬵ; ᬉ◌̴ᬵ; ) BALINESE LETTER UKARA, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +1B0B 0334 1B35;1B0B 0334 1B35;1B0B 0334 1B35;1B0B 0334 1B35;1B0B 0334 1B35; # (ᬋ◌̴ᬵ; ᬋ◌̴ᬵ; ᬋ◌̴ᬵ; ᬋ◌̴ᬵ; ᬋ◌̴ᬵ; ) BALINESE LETTER RA REPA, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +1B0D 0334 1B35;1B0D 0334 1B35;1B0D 0334 1B35;1B0D 0334 1B35;1B0D 0334 1B35; # (ᬍ◌̴ᬵ; ᬍ◌̴ᬵ; ᬍ◌̴ᬵ; ᬍ◌̴ᬵ; ᬍ◌̴ᬵ; ) BALINESE LETTER LA LENGA, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +1B11 0334 1B35;1B11 0334 1B35;1B11 0334 1B35;1B11 0334 1B35;1B11 0334 1B35; # (ᬑ◌̴ᬵ; ᬑ◌̴ᬵ; ᬑ◌̴ᬵ; ᬑ◌̴ᬵ; ᬑ◌̴ᬵ; ) BALINESE LETTER OKARA, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +1B3A 0334 1B35;1B3A 0334 1B35;1B3A 0334 1B35;1B3A 0334 1B35;1B3A 0334 1B35; # (◌ᬺ◌̴ᬵ; ◌ᬺ◌̴ᬵ; ◌ᬺ◌̴ᬵ; ◌ᬺ◌̴ᬵ; ◌ᬺ◌̴ᬵ; ) BALINESE VOWEL SIGN RA REPA, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +1B3C 0334 1B35;1B3C 0334 1B35;1B3C 0334 1B35;1B3C 0334 1B35;1B3C 0334 1B35; # (◌ᬼ◌̴ᬵ; ◌ᬼ◌̴ᬵ; ◌ᬼ◌̴ᬵ; ◌ᬼ◌̴ᬵ; ◌ᬼ◌̴ᬵ; ) BALINESE VOWEL SIGN LA LENGA, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +1B3E 0334 1B35;1B3E 0334 1B35;1B3E 0334 1B35;1B3E 0334 1B35;1B3E 0334 1B35; # (ᬾ◌̴ᬵ; ᬾ◌̴ᬵ; ᬾ◌̴ᬵ; ᬾ◌̴ᬵ; ᬾ◌̴ᬵ; ) BALINESE VOWEL SIGN TALING, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +1B3F 0334 1B35;1B3F 0334 1B35;1B3F 0334 1B35;1B3F 0334 1B35;1B3F 0334 1B35; # (ᬿ◌̴ᬵ; ᬿ◌̴ᬵ; ᬿ◌̴ᬵ; ᬿ◌̴ᬵ; ᬿ◌̴ᬵ; ) BALINESE VOWEL SIGN TALING REPA, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +1B42 0334 1B35;1B42 0334 1B35;1B42 0334 1B35;1B42 0334 1B35;1B42 0334 1B35; # (◌ᭂ◌̴ᬵ; ◌ᭂ◌̴ᬵ; ◌ᭂ◌̴ᬵ; ◌ᭂ◌̴ᬵ; ◌ᭂ◌̴ᬵ; ) BALINESE VOWEL SIGN PEPET, COMBINING TILDE OVERLAY, BALINESE VOWEL SIGN TEDUNG +AC54 0334 11AE;AC54 0334 11AE;1100 1164 0334 11AE;AC54 0334 11AE;1100 1164 0334 11AE; # (걔◌̴ᆮ; 걔◌̴ᆮ; 걔◌̴ᆮ; 걔◌̴ᆮ; 걔◌̴ᆮ; ) HANGUL SYLLABLE GYAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +ACA8 0334 11B5;ACA8 0334 11B5;1100 1167 0334 11B5;ACA8 0334 11B5;1100 1167 0334 11B5; # (겨◌̴ᆵ; 겨◌̴ᆵ; 겨◌̴ᆵ; 겨◌̴ᆵ; 겨◌̴ᆵ; ) HANGUL SYLLABLE GYEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +ACFC 0334 11BC;ACFC 0334 11BC;1100 116A 0334 11BC;ACFC 0334 11BC;1100 116A 0334 11BC; # (과◌̴ᆼ; 과◌̴ᆼ; 과◌̴ᆼ; 과◌̴ᆼ; 과◌̴ᆼ; ) HANGUL SYLLABLE GWA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +ADC0 0334 11AE;ADC0 0334 11AE;1100 1171 0334 11AE;ADC0 0334 11AE;1100 1171 0334 11AE; # (귀◌̴ᆮ; 귀◌̴ᆮ; 귀◌̴ᆮ; 귀◌̴ᆮ; 귀◌̴ᆮ; ) HANGUL SYLLABLE GWI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +AE14 0334 11B5;AE14 0334 11B5;1100 1174 0334 11B5;AE14 0334 11B5;1100 1174 0334 11B5; # (긔◌̴ᆵ; 긔◌̴ᆵ; 긔◌̴ᆵ; 긔◌̴ᆵ; 긔◌̴ᆵ; ) HANGUL SYLLABLE GYI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +AE68 0334 11BC;AE68 0334 11BC;1101 1162 0334 11BC;AE68 0334 11BC;1101 1162 0334 11BC; # (깨◌̴ᆼ; 깨◌̴ᆼ; 깨◌̴ᆼ; 깨◌̴ᆼ; 깨◌̴ᆼ; ) HANGUL SYLLABLE GGAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +AF2C 0334 11AE;AF2C 0334 11AE;1101 1169 0334 11AE;AF2C 0334 11AE;1101 1169 0334 11AE; # (꼬◌̴ᆮ; 꼬◌̴ᆮ; 꼬◌̴ᆮ; 꼬◌̴ᆮ; 꼬◌̴ᆮ; ) HANGUL SYLLABLE GGO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +AF80 0334 11B5;AF80 0334 11B5;1101 116C 0334 11B5;AF80 0334 11B5;1101 116C 0334 11B5; # (꾀◌̴ᆵ; 꾀◌̴ᆵ; 꾀◌̴ᆵ; 꾀◌̴ᆵ; 꾀◌̴ᆵ; ) HANGUL SYLLABLE GGOE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +AFD4 0334 11BC;AFD4 0334 11BC;1101 116F 0334 11BC;AFD4 0334 11BC;1101 116F 0334 11BC; # (꿔◌̴ᆼ; 꿔◌̴ᆼ; 꿔◌̴ᆼ; 꿔◌̴ᆼ; 꿔◌̴ᆼ; ) HANGUL SYLLABLE GGWEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +B098 0334 11AE;B098 0334 11AE;1102 1161 0334 11AE;B098 0334 11AE;1102 1161 0334 11AE; # (나◌̴ᆮ; 나◌̴ᆮ; 나◌̴ᆮ; 나◌̴ᆮ; 나◌̴ᆮ; ) HANGUL SYLLABLE NA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +B0EC 0334 11B5;B0EC 0334 11B5;1102 1164 0334 11B5;B0EC 0334 11B5;1102 1164 0334 11B5; # (냬◌̴ᆵ; 냬◌̴ᆵ; 냬◌̴ᆵ; 냬◌̴ᆵ; 냬◌̴ᆵ; ) HANGUL SYLLABLE NYAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +B140 0334 11BC;B140 0334 11BC;1102 1167 0334 11BC;B140 0334 11BC;1102 1167 0334 11BC; # (녀◌̴ᆼ; 녀◌̴ᆼ; 녀◌̴ᆼ; 녀◌̴ᆼ; 녀◌̴ᆼ; ) HANGUL SYLLABLE NYEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +B204 0334 11AE;B204 0334 11AE;1102 116E 0334 11AE;B204 0334 11AE;1102 116E 0334 11AE; # (누◌̴ᆮ; 누◌̴ᆮ; 누◌̴ᆮ; 누◌̴ᆮ; 누◌̴ᆮ; ) HANGUL SYLLABLE NU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +B258 0334 11B5;B258 0334 11B5;1102 1171 0334 11B5;B258 0334 11B5;1102 1171 0334 11B5; # (뉘◌̴ᆵ; 뉘◌̴ᆵ; 뉘◌̴ᆵ; 뉘◌̴ᆵ; 뉘◌̴ᆵ; ) HANGUL SYLLABLE NWI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +B2AC 0334 11BC;B2AC 0334 11BC;1102 1174 0334 11BC;B2AC 0334 11BC;1102 1174 0334 11BC; # (늬◌̴ᆼ; 늬◌̴ᆼ; 늬◌̴ᆼ; 늬◌̴ᆼ; 늬◌̴ᆼ; ) HANGUL SYLLABLE NYI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +B370 0334 11AE;B370 0334 11AE;1103 1166 0334 11AE;B370 0334 11AE;1103 1166 0334 11AE; # (데◌̴ᆮ; 데◌̴ᆮ; 데◌̴ᆮ; 데◌̴ᆮ; 데◌̴ᆮ; ) HANGUL SYLLABLE DE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +B3C4 0334 11B5;B3C4 0334 11B5;1103 1169 0334 11B5;B3C4 0334 11B5;1103 1169 0334 11B5; # (도◌̴ᆵ; 도◌̴ᆵ; 도◌̴ᆵ; 도◌̴ᆵ; 도◌̴ᆵ; ) HANGUL SYLLABLE DO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +B418 0334 11BC;B418 0334 11BC;1103 116C 0334 11BC;B418 0334 11BC;1103 116C 0334 11BC; # (되◌̴ᆼ; 되◌̴ᆼ; 되◌̴ᆼ; 되◌̴ᆼ; 되◌̴ᆼ; ) HANGUL SYLLABLE DOE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +B4DC 0334 11AE;B4DC 0334 11AE;1103 1173 0334 11AE;B4DC 0334 11AE;1103 1173 0334 11AE; # (드◌̴ᆮ; 드◌̴ᆮ; 드◌̴ᆮ; 드◌̴ᆮ; 드◌̴ᆮ; ) HANGUL SYLLABLE DEU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +B530 0334 11B5;B530 0334 11B5;1104 1161 0334 11B5;B530 0334 11B5;1104 1161 0334 11B5; # (따◌̴ᆵ; 따◌̴ᆵ; 따◌̴ᆵ; 따◌̴ᆵ; 따◌̴ᆵ; ) HANGUL SYLLABLE DDA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +B584 0334 11BC;B584 0334 11BC;1104 1164 0334 11BC;B584 0334 11BC;1104 1164 0334 11BC; # (떄◌̴ᆼ; 떄◌̴ᆼ; 떄◌̴ᆼ; 떄◌̴ᆼ; 떄◌̴ᆼ; ) HANGUL SYLLABLE DDYAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +B648 0334 11AE;B648 0334 11AE;1104 116B 0334 11AE;B648 0334 11AE;1104 116B 0334 11AE; # (뙈◌̴ᆮ; 뙈◌̴ᆮ; 뙈◌̴ᆮ; 뙈◌̴ᆮ; 뙈◌̴ᆮ; ) HANGUL SYLLABLE DDWAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +B69C 0334 11B5;B69C 0334 11B5;1104 116E 0334 11B5;B69C 0334 11B5;1104 116E 0334 11B5; # (뚜◌̴ᆵ; 뚜◌̴ᆵ; 뚜◌̴ᆵ; 뚜◌̴ᆵ; 뚜◌̴ᆵ; ) HANGUL SYLLABLE DDU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +B6F0 0334 11BC;B6F0 0334 11BC;1104 1171 0334 11BC;B6F0 0334 11BC;1104 1171 0334 11BC; # (뛰◌̴ᆼ; 뛰◌̴ᆼ; 뛰◌̴ᆼ; 뛰◌̴ᆼ; 뛰◌̴ᆼ; ) HANGUL SYLLABLE DDWI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +B7B4 0334 11AE;B7B4 0334 11AE;1105 1163 0334 11AE;B7B4 0334 11AE;1105 1163 0334 11AE; # (랴◌̴ᆮ; 랴◌̴ᆮ; 랴◌̴ᆮ; 랴◌̴ᆮ; 랴◌̴ᆮ; ) HANGUL SYLLABLE RYA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +B808 0334 11B5;B808 0334 11B5;1105 1166 0334 11B5;B808 0334 11B5;1105 1166 0334 11B5; # (레◌̴ᆵ; 레◌̴ᆵ; 레◌̴ᆵ; 레◌̴ᆵ; 레◌̴ᆵ; ) HANGUL SYLLABLE RE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +B85C 0334 11BC;B85C 0334 11BC;1105 1169 0334 11BC;B85C 0334 11BC;1105 1169 0334 11BC; # (로◌̴ᆼ; 로◌̴ᆼ; 로◌̴ᆼ; 로◌̴ᆼ; 로◌̴ᆼ; ) HANGUL SYLLABLE RO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +B920 0334 11AE;B920 0334 11AE;1105 1170 0334 11AE;B920 0334 11AE;1105 1170 0334 11AE; # (뤠◌̴ᆮ; 뤠◌̴ᆮ; 뤠◌̴ᆮ; 뤠◌̴ᆮ; 뤠◌̴ᆮ; ) HANGUL SYLLABLE RWE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +B974 0334 11B5;B974 0334 11B5;1105 1173 0334 11B5;B974 0334 11B5;1105 1173 0334 11B5; # (르◌̴ᆵ; 르◌̴ᆵ; 르◌̴ᆵ; 르◌̴ᆵ; 르◌̴ᆵ; ) HANGUL SYLLABLE REU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +B9C8 0334 11BC;B9C8 0334 11BC;1106 1161 0334 11BC;B9C8 0334 11BC;1106 1161 0334 11BC; # (마◌̴ᆼ; 마◌̴ᆼ; 마◌̴ᆼ; 마◌̴ᆼ; 마◌̴ᆼ; ) HANGUL SYLLABLE MA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +BA8C 0334 11AE;BA8C 0334 11AE;1106 1168 0334 11AE;BA8C 0334 11AE;1106 1168 0334 11AE; # (몌◌̴ᆮ; 몌◌̴ᆮ; 몌◌̴ᆮ; 몌◌̴ᆮ; 몌◌̴ᆮ; ) HANGUL SYLLABLE MYE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +BAE0 0334 11B5;BAE0 0334 11B5;1106 116B 0334 11B5;BAE0 0334 11B5;1106 116B 0334 11B5; # (뫠◌̴ᆵ; 뫠◌̴ᆵ; 뫠◌̴ᆵ; 뫠◌̴ᆵ; 뫠◌̴ᆵ; ) HANGUL SYLLABLE MWAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +BB34 0334 11BC;BB34 0334 11BC;1106 116E 0334 11BC;BB34 0334 11BC;1106 116E 0334 11BC; # (무◌̴ᆼ; 무◌̴ᆼ; 무◌̴ᆼ; 무◌̴ᆼ; 무◌̴ᆼ; ) HANGUL SYLLABLE MU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +BBF8 0334 11AE;BBF8 0334 11AE;1106 1175 0334 11AE;BBF8 0334 11AE;1106 1175 0334 11AE; # (미◌̴ᆮ; 미◌̴ᆮ; 미◌̴ᆮ; 미◌̴ᆮ; 미◌̴ᆮ; ) HANGUL SYLLABLE MI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +BC4C 0334 11B5;BC4C 0334 11B5;1107 1163 0334 11B5;BC4C 0334 11B5;1107 1163 0334 11B5; # (뱌◌̴ᆵ; 뱌◌̴ᆵ; 뱌◌̴ᆵ; 뱌◌̴ᆵ; 뱌◌̴ᆵ; ) HANGUL SYLLABLE BYA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +BCA0 0334 11BC;BCA0 0334 11BC;1107 1166 0334 11BC;BCA0 0334 11BC;1107 1166 0334 11BC; # (베◌̴ᆼ; 베◌̴ᆼ; 베◌̴ᆼ; 베◌̴ᆼ; 베◌̴ᆼ; ) HANGUL SYLLABLE BE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +BD64 0334 11AE;BD64 0334 11AE;1107 116D 0334 11AE;BD64 0334 11AE;1107 116D 0334 11AE; # (뵤◌̴ᆮ; 뵤◌̴ᆮ; 뵤◌̴ᆮ; 뵤◌̴ᆮ; 뵤◌̴ᆮ; ) HANGUL SYLLABLE BYO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +BDB8 0334 11B5;BDB8 0334 11B5;1107 1170 0334 11B5;BDB8 0334 11B5;1107 1170 0334 11B5; # (붸◌̴ᆵ; 붸◌̴ᆵ; 붸◌̴ᆵ; 붸◌̴ᆵ; 붸◌̴ᆵ; ) HANGUL SYLLABLE BWE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +BE0C 0334 11BC;BE0C 0334 11BC;1107 1173 0334 11BC;BE0C 0334 11BC;1107 1173 0334 11BC; # (브◌̴ᆼ; 브◌̴ᆼ; 브◌̴ᆼ; 브◌̴ᆼ; 브◌̴ᆼ; ) HANGUL SYLLABLE BEU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +BED0 0334 11AE;BED0 0334 11AE;1108 1165 0334 11AE;BED0 0334 11AE;1108 1165 0334 11AE; # (뻐◌̴ᆮ; 뻐◌̴ᆮ; 뻐◌̴ᆮ; 뻐◌̴ᆮ; 뻐◌̴ᆮ; ) HANGUL SYLLABLE BBEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +BF24 0334 11B5;BF24 0334 11B5;1108 1168 0334 11B5;BF24 0334 11B5;1108 1168 0334 11B5; # (뼤◌̴ᆵ; 뼤◌̴ᆵ; 뼤◌̴ᆵ; 뼤◌̴ᆵ; 뼤◌̴ᆵ; ) HANGUL SYLLABLE BBYE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +BF78 0334 11BC;BF78 0334 11BC;1108 116B 0334 11BC;BF78 0334 11BC;1108 116B 0334 11BC; # (뽸◌̴ᆼ; 뽸◌̴ᆼ; 뽸◌̴ᆼ; 뽸◌̴ᆼ; 뽸◌̴ᆼ; ) HANGUL SYLLABLE BBWAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +C03C 0334 11AE;C03C 0334 11AE;1108 1172 0334 11AE;C03C 0334 11AE;1108 1172 0334 11AE; # (쀼◌̴ᆮ; 쀼◌̴ᆮ; 쀼◌̴ᆮ; 쀼◌̴ᆮ; 쀼◌̴ᆮ; ) HANGUL SYLLABLE BBYU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +C090 0334 11B5;C090 0334 11B5;1108 1175 0334 11B5;C090 0334 11B5;1108 1175 0334 11B5; # (삐◌̴ᆵ; 삐◌̴ᆵ; 삐◌̴ᆵ; 삐◌̴ᆵ; 삐◌̴ᆵ; ) HANGUL SYLLABLE BBI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +C0E4 0334 11BC;C0E4 0334 11BC;1109 1163 0334 11BC;C0E4 0334 11BC;1109 1163 0334 11BC; # (샤◌̴ᆼ; 샤◌̴ᆼ; 샤◌̴ᆼ; 샤◌̴ᆼ; 샤◌̴ᆼ; ) HANGUL SYLLABLE SYA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +C1A8 0334 11AE;C1A8 0334 11AE;1109 116A 0334 11AE;C1A8 0334 11AE;1109 116A 0334 11AE; # (솨◌̴ᆮ; 솨◌̴ᆮ; 솨◌̴ᆮ; 솨◌̴ᆮ; 솨◌̴ᆮ; ) HANGUL SYLLABLE SWA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +C1FC 0334 11B5;C1FC 0334 11B5;1109 116D 0334 11B5;C1FC 0334 11B5;1109 116D 0334 11B5; # (쇼◌̴ᆵ; 쇼◌̴ᆵ; 쇼◌̴ᆵ; 쇼◌̴ᆵ; 쇼◌̴ᆵ; ) HANGUL SYLLABLE SYO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +C250 0334 11BC;C250 0334 11BC;1109 1170 0334 11BC;C250 0334 11BC;1109 1170 0334 11BC; # (쉐◌̴ᆼ; 쉐◌̴ᆼ; 쉐◌̴ᆼ; 쉐◌̴ᆼ; 쉐◌̴ᆼ; ) HANGUL SYLLABLE SWE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +C314 0334 11AE;C314 0334 11AE;110A 1162 0334 11AE;C314 0334 11AE;110A 1162 0334 11AE; # (쌔◌̴ᆮ; 쌔◌̴ᆮ; 쌔◌̴ᆮ; 쌔◌̴ᆮ; 쌔◌̴ᆮ; ) HANGUL SYLLABLE SSAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +C368 0334 11B5;C368 0334 11B5;110A 1165 0334 11B5;C368 0334 11B5;110A 1165 0334 11B5; # (써◌̴ᆵ; 써◌̴ᆵ; 써◌̴ᆵ; 써◌̴ᆵ; 써◌̴ᆵ; ) HANGUL SYLLABLE SSEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +C3BC 0334 11BC;C3BC 0334 11BC;110A 1168 0334 11BC;C3BC 0334 11BC;110A 1168 0334 11BC; # (쎼◌̴ᆼ; 쎼◌̴ᆼ; 쎼◌̴ᆼ; 쎼◌̴ᆼ; 쎼◌̴ᆼ; ) HANGUL SYLLABLE SSYE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +C480 0334 11AE;C480 0334 11AE;110A 116F 0334 11AE;C480 0334 11AE;110A 116F 0334 11AE; # (쒀◌̴ᆮ; 쒀◌̴ᆮ; 쒀◌̴ᆮ; 쒀◌̴ᆮ; 쒀◌̴ᆮ; ) HANGUL SYLLABLE SSWEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +C4D4 0334 11B5;C4D4 0334 11B5;110A 1172 0334 11B5;C4D4 0334 11B5;110A 1172 0334 11B5; # (쓔◌̴ᆵ; 쓔◌̴ᆵ; 쓔◌̴ᆵ; 쓔◌̴ᆵ; 쓔◌̴ᆵ; ) HANGUL SYLLABLE SSYU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +C528 0334 11BC;C528 0334 11BC;110A 1175 0334 11BC;C528 0334 11BC;110A 1175 0334 11BC; # (씨◌̴ᆼ; 씨◌̴ᆼ; 씨◌̴ᆼ; 씨◌̴ᆼ; 씨◌̴ᆼ; ) HANGUL SYLLABLE SSI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +C5EC 0334 11AE;C5EC 0334 11AE;110B 1167 0334 11AE;C5EC 0334 11AE;110B 1167 0334 11AE; # (여◌̴ᆮ; 여◌̴ᆮ; 여◌̴ᆮ; 여◌̴ᆮ; 여◌̴ᆮ; ) HANGUL SYLLABLE YEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +C640 0334 11B5;C640 0334 11B5;110B 116A 0334 11B5;C640 0334 11B5;110B 116A 0334 11B5; # (와◌̴ᆵ; 와◌̴ᆵ; 와◌̴ᆵ; 와◌̴ᆵ; 와◌̴ᆵ; ) HANGUL SYLLABLE WA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +C694 0334 11BC;C694 0334 11BC;110B 116D 0334 11BC;C694 0334 11BC;110B 116D 0334 11BC; # (요◌̴ᆼ; 요◌̴ᆼ; 요◌̴ᆼ; 요◌̴ᆼ; 요◌̴ᆼ; ) HANGUL SYLLABLE YO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +C758 0334 11AE;C758 0334 11AE;110B 1174 0334 11AE;C758 0334 11AE;110B 1174 0334 11AE; # (의◌̴ᆮ; 의◌̴ᆮ; 의◌̴ᆮ; 의◌̴ᆮ; 의◌̴ᆮ; ) HANGUL SYLLABLE YI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +C7AC 0334 11B5;C7AC 0334 11B5;110C 1162 0334 11B5;C7AC 0334 11B5;110C 1162 0334 11B5; # (재◌̴ᆵ; 재◌̴ᆵ; 재◌̴ᆵ; 재◌̴ᆵ; 재◌̴ᆵ; ) HANGUL SYLLABLE JAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +C800 0334 11BC;C800 0334 11BC;110C 1165 0334 11BC;C800 0334 11BC;110C 1165 0334 11BC; # (저◌̴ᆼ; 저◌̴ᆼ; 저◌̴ᆼ; 저◌̴ᆼ; 저◌̴ᆼ; ) HANGUL SYLLABLE JEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +C8C4 0334 11AE;C8C4 0334 11AE;110C 116C 0334 11AE;C8C4 0334 11AE;110C 116C 0334 11AE; # (죄◌̴ᆮ; 죄◌̴ᆮ; 죄◌̴ᆮ; 죄◌̴ᆮ; 죄◌̴ᆮ; ) HANGUL SYLLABLE JOE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +C918 0334 11B5;C918 0334 11B5;110C 116F 0334 11B5;C918 0334 11B5;110C 116F 0334 11B5; # (줘◌̴ᆵ; 줘◌̴ᆵ; 줘◌̴ᆵ; 줘◌̴ᆵ; 줘◌̴ᆵ; ) HANGUL SYLLABLE JWEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +C96C 0334 11BC;C96C 0334 11BC;110C 1172 0334 11BC;C96C 0334 11BC;110C 1172 0334 11BC; # (쥬◌̴ᆼ; 쥬◌̴ᆼ; 쥬◌̴ᆼ; 쥬◌̴ᆼ; 쥬◌̴ᆼ; ) HANGUL SYLLABLE JYU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +CA30 0334 11AE;CA30 0334 11AE;110D 1164 0334 11AE;CA30 0334 11AE;110D 1164 0334 11AE; # (쨰◌̴ᆮ; 쨰◌̴ᆮ; 쨰◌̴ᆮ; 쨰◌̴ᆮ; 쨰◌̴ᆮ; ) HANGUL SYLLABLE JJYAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +CA84 0334 11B5;CA84 0334 11B5;110D 1167 0334 11B5;CA84 0334 11B5;110D 1167 0334 11B5; # (쪄◌̴ᆵ; 쪄◌̴ᆵ; 쪄◌̴ᆵ; 쪄◌̴ᆵ; 쪄◌̴ᆵ; ) HANGUL SYLLABLE JJYEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +CAD8 0334 11BC;CAD8 0334 11BC;110D 116A 0334 11BC;CAD8 0334 11BC;110D 116A 0334 11BC; # (쫘◌̴ᆼ; 쫘◌̴ᆼ; 쫘◌̴ᆼ; 쫘◌̴ᆼ; 쫘◌̴ᆼ; ) HANGUL SYLLABLE JJWA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +CB9C 0334 11AE;CB9C 0334 11AE;110D 1171 0334 11AE;CB9C 0334 11AE;110D 1171 0334 11AE; # (쮜◌̴ᆮ; 쮜◌̴ᆮ; 쮜◌̴ᆮ; 쮜◌̴ᆮ; 쮜◌̴ᆮ; ) HANGUL SYLLABLE JJWI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +CBF0 0334 11B5;CBF0 0334 11B5;110D 1174 0334 11B5;CBF0 0334 11B5;110D 1174 0334 11B5; # (쯰◌̴ᆵ; 쯰◌̴ᆵ; 쯰◌̴ᆵ; 쯰◌̴ᆵ; 쯰◌̴ᆵ; ) HANGUL SYLLABLE JJYI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +CC44 0334 11BC;CC44 0334 11BC;110E 1162 0334 11BC;CC44 0334 11BC;110E 1162 0334 11BC; # (채◌̴ᆼ; 채◌̴ᆼ; 채◌̴ᆼ; 채◌̴ᆼ; 채◌̴ᆼ; ) HANGUL SYLLABLE CAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +CD08 0334 11AE;CD08 0334 11AE;110E 1169 0334 11AE;CD08 0334 11AE;110E 1169 0334 11AE; # (초◌̴ᆮ; 초◌̴ᆮ; 초◌̴ᆮ; 초◌̴ᆮ; 초◌̴ᆮ; ) HANGUL SYLLABLE CO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +CD5C 0334 11B5;CD5C 0334 11B5;110E 116C 0334 11B5;CD5C 0334 11B5;110E 116C 0334 11B5; # (최◌̴ᆵ; 최◌̴ᆵ; 최◌̴ᆵ; 최◌̴ᆵ; 최◌̴ᆵ; ) HANGUL SYLLABLE COE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +CDB0 0334 11BC;CDB0 0334 11BC;110E 116F 0334 11BC;CDB0 0334 11BC;110E 116F 0334 11BC; # (춰◌̴ᆼ; 춰◌̴ᆼ; 춰◌̴ᆼ; 춰◌̴ᆼ; 춰◌̴ᆼ; ) HANGUL SYLLABLE CWEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +CE74 0334 11AE;CE74 0334 11AE;110F 1161 0334 11AE;CE74 0334 11AE;110F 1161 0334 11AE; # (카◌̴ᆮ; 카◌̴ᆮ; 카◌̴ᆮ; 카◌̴ᆮ; 카◌̴ᆮ; ) HANGUL SYLLABLE KA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +CEC8 0334 11B5;CEC8 0334 11B5;110F 1164 0334 11B5;CEC8 0334 11B5;110F 1164 0334 11B5; # (컈◌̴ᆵ; 컈◌̴ᆵ; 컈◌̴ᆵ; 컈◌̴ᆵ; 컈◌̴ᆵ; ) HANGUL SYLLABLE KYAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +CF1C 0334 11BC;CF1C 0334 11BC;110F 1167 0334 11BC;CF1C 0334 11BC;110F 1167 0334 11BC; # (켜◌̴ᆼ; 켜◌̴ᆼ; 켜◌̴ᆼ; 켜◌̴ᆼ; 켜◌̴ᆼ; ) HANGUL SYLLABLE KYEO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +CFE0 0334 11AE;CFE0 0334 11AE;110F 116E 0334 11AE;CFE0 0334 11AE;110F 116E 0334 11AE; # (쿠◌̴ᆮ; 쿠◌̴ᆮ; 쿠◌̴ᆮ; 쿠◌̴ᆮ; 쿠◌̴ᆮ; ) HANGUL SYLLABLE KU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +D034 0334 11B5;D034 0334 11B5;110F 1171 0334 11B5;D034 0334 11B5;110F 1171 0334 11B5; # (퀴◌̴ᆵ; 퀴◌̴ᆵ; 퀴◌̴ᆵ; 퀴◌̴ᆵ; 퀴◌̴ᆵ; ) HANGUL SYLLABLE KWI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +D088 0334 11BC;D088 0334 11BC;110F 1174 0334 11BC;D088 0334 11BC;110F 1174 0334 11BC; # (킈◌̴ᆼ; 킈◌̴ᆼ; 킈◌̴ᆼ; 킈◌̴ᆼ; 킈◌̴ᆼ; ) HANGUL SYLLABLE KYI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +D14C 0334 11AE;D14C 0334 11AE;1110 1166 0334 11AE;D14C 0334 11AE;1110 1166 0334 11AE; # (테◌̴ᆮ; 테◌̴ᆮ; 테◌̴ᆮ; 테◌̴ᆮ; 테◌̴ᆮ; ) HANGUL SYLLABLE TE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +D1A0 0334 11B5;D1A0 0334 11B5;1110 1169 0334 11B5;D1A0 0334 11B5;1110 1169 0334 11B5; # (토◌̴ᆵ; 토◌̴ᆵ; 토◌̴ᆵ; 토◌̴ᆵ; 토◌̴ᆵ; ) HANGUL SYLLABLE TO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +D1F4 0334 11BC;D1F4 0334 11BC;1110 116C 0334 11BC;D1F4 0334 11BC;1110 116C 0334 11BC; # (퇴◌̴ᆼ; 퇴◌̴ᆼ; 퇴◌̴ᆼ; 퇴◌̴ᆼ; 퇴◌̴ᆼ; ) HANGUL SYLLABLE TOE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +D2B8 0334 11AE;D2B8 0334 11AE;1110 1173 0334 11AE;D2B8 0334 11AE;1110 1173 0334 11AE; # (트◌̴ᆮ; 트◌̴ᆮ; 트◌̴ᆮ; 트◌̴ᆮ; 트◌̴ᆮ; ) HANGUL SYLLABLE TEU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +D30C 0334 11B5;D30C 0334 11B5;1111 1161 0334 11B5;D30C 0334 11B5;1111 1161 0334 11B5; # (파◌̴ᆵ; 파◌̴ᆵ; 파◌̴ᆵ; 파◌̴ᆵ; 파◌̴ᆵ; ) HANGUL SYLLABLE PA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +D360 0334 11BC;D360 0334 11BC;1111 1164 0334 11BC;D360 0334 11BC;1111 1164 0334 11BC; # (퍠◌̴ᆼ; 퍠◌̴ᆼ; 퍠◌̴ᆼ; 퍠◌̴ᆼ; 퍠◌̴ᆼ; ) HANGUL SYLLABLE PYAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +D424 0334 11AE;D424 0334 11AE;1111 116B 0334 11AE;D424 0334 11AE;1111 116B 0334 11AE; # (퐤◌̴ᆮ; 퐤◌̴ᆮ; 퐤◌̴ᆮ; 퐤◌̴ᆮ; 퐤◌̴ᆮ; ) HANGUL SYLLABLE PWAE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +D478 0334 11B5;D478 0334 11B5;1111 116E 0334 11B5;D478 0334 11B5;1111 116E 0334 11B5; # (푸◌̴ᆵ; 푸◌̴ᆵ; 푸◌̴ᆵ; 푸◌̴ᆵ; 푸◌̴ᆵ; ) HANGUL SYLLABLE PU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +D4CC 0334 11BC;D4CC 0334 11BC;1111 1171 0334 11BC;D4CC 0334 11BC;1111 1171 0334 11BC; # (퓌◌̴ᆼ; 퓌◌̴ᆼ; 퓌◌̴ᆼ; 퓌◌̴ᆼ; 퓌◌̴ᆼ; ) HANGUL SYLLABLE PWI, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +D590 0334 11AE;D590 0334 11AE;1112 1163 0334 11AE;D590 0334 11AE;1112 1163 0334 11AE; # (햐◌̴ᆮ; 햐◌̴ᆮ; 햐◌̴ᆮ; 햐◌̴ᆮ; 햐◌̴ᆮ; ) HANGUL SYLLABLE HYA, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +D5E4 0334 11B5;D5E4 0334 11B5;1112 1166 0334 11B5;D5E4 0334 11B5;1112 1166 0334 11B5; # (헤◌̴ᆵ; 헤◌̴ᆵ; 헤◌̴ᆵ; 헤◌̴ᆵ; 헤◌̴ᆵ; ) HANGUL SYLLABLE HE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +D638 0334 11BC;D638 0334 11BC;1112 1169 0334 11BC;D638 0334 11BC;1112 1169 0334 11BC; # (호◌̴ᆼ; 호◌̴ᆼ; 호◌̴ᆼ; 호◌̴ᆼ; 호◌̴ᆼ; ) HANGUL SYLLABLE HO, COMBINING TILDE OVERLAY, HANGUL JONGSEONG IEUNG +D6FC 0334 11AE;D6FC 0334 11AE;1112 1170 0334 11AE;D6FC 0334 11AE;1112 1170 0334 11AE; # (훼◌̴ᆮ; 훼◌̴ᆮ; 훼◌̴ᆮ; 훼◌̴ᆮ; 훼◌̴ᆮ; ) HANGUL SYLLABLE HWE, COMBINING TILDE OVERLAY, HANGUL JONGSEONG TIKEUT +D750 0334 11B5;D750 0334 11B5;1112 1173 0334 11B5;D750 0334 11B5;1112 1173 0334 11B5; # (흐◌̴ᆵ; 흐◌̴ᆵ; 흐◌̴ᆵ; 흐◌̴ᆵ; 흐◌̴ᆵ; ) HANGUL SYLLABLE HEU, COMBINING TILDE OVERLAY, HANGUL JONGSEONG RIEUL-PHIEUPH +11131 0334 11127;11131 0334 11127;11131 0334 11127;11131 0334 11127;11131 0334 11127; # (◌𑄱◌̴◌𑄧; ◌𑄱◌̴◌𑄧; ◌𑄱◌̴◌𑄧; ◌𑄱◌̴◌𑄧; ◌𑄱◌̴◌𑄧; ) CHAKMA O MARK, COMBINING TILDE OVERLAY, CHAKMA VOWEL SIGN A +11132 0334 11127;11132 0334 11127;11132 0334 11127;11132 0334 11127;11132 0334 11127; # (◌𑄲◌̴◌𑄧; ◌𑄲◌̴◌𑄧; ◌𑄲◌̴◌𑄧; ◌𑄲◌̴◌𑄧; ◌𑄲◌̴◌𑄧; ) CHAKMA AU MARK, COMBINING TILDE OVERLAY, CHAKMA VOWEL SIGN A +11347 0334 1133E;11347 0334 1133E;11347 0334 1133E;11347 0334 1133E;11347 0334 1133E; # (𑍇◌̴𑌾; 𑍇◌̴𑌾; 𑍇◌̴𑌾; 𑍇◌̴𑌾; 𑍇◌̴𑌾; ) GRANTHA VOWEL SIGN EE, COMBINING TILDE OVERLAY, GRANTHA VOWEL SIGN AA +11347 0334 11357;11347 0334 11357;11347 0334 11357;11347 0334 11357;11347 0334 11357; # (𑍇◌̴𑍗; 𑍇◌̴𑍗; 𑍇◌̴𑍗; 𑍇◌̴𑍗; 𑍇◌̴𑍗; ) GRANTHA VOWEL SIGN EE, COMBINING TILDE OVERLAY, GRANTHA AU LENGTH MARK +114B9 0334 114B0;114B9 0334 114B0;114B9 0334 114B0;114B9 0334 114B0;114B9 0334 114B0; # (𑒹◌̴𑒰; 𑒹◌̴𑒰; 𑒹◌̴𑒰; 𑒹◌̴𑒰; 𑒹◌̴𑒰; ) TIRHUTA VOWEL SIGN E, COMBINING TILDE OVERLAY, TIRHUTA VOWEL SIGN AA +114B9 0334 114BA;114B9 0334 114BA;114B9 0334 114BA;114B9 0334 114BA;114B9 0334 114BA; # (𑒹◌̴◌𑒺; 𑒹◌̴◌𑒺; 𑒹◌̴◌𑒺; 𑒹◌̴◌𑒺; 𑒹◌̴◌𑒺; ) TIRHUTA VOWEL SIGN E, COMBINING TILDE OVERLAY, TIRHUTA VOWEL SIGN SHORT E +114B9 0334 114BD;114B9 0334 114BD;114B9 0334 114BD;114B9 0334 114BD;114B9 0334 114BD; # (𑒹◌̴𑒽; 𑒹◌̴𑒽; 𑒹◌̴𑒽; 𑒹◌̴𑒽; 𑒹◌̴𑒽; ) TIRHUTA VOWEL SIGN E, COMBINING TILDE OVERLAY, TIRHUTA VOWEL SIGN SHORT O +115B8 0334 115AF;115B8 0334 115AF;115B8 0334 115AF;115B8 0334 115AF;115B8 0334 115AF; # (𑖸◌̴𑖯; 𑖸◌̴𑖯; 𑖸◌̴𑖯; 𑖸◌̴𑖯; 𑖸◌̴𑖯; ) SIDDHAM VOWEL SIGN E, COMBINING TILDE OVERLAY, SIDDHAM VOWEL SIGN AA +115B9 0334 115AF;115B9 0334 115AF;115B9 0334 115AF;115B9 0334 115AF;115B9 0334 115AF; # (𑖹◌̴𑖯; 𑖹◌̴𑖯; 𑖹◌̴𑖯; 𑖹◌̴𑖯; 𑖹◌̴𑖯; ) SIDDHAM VOWEL SIGN AI, COMBINING TILDE OVERLAY, SIDDHAM VOWEL SIGN AA +11935 0334 11930;11935 0334 11930;11935 0334 11930;11935 0334 11930;11935 0334 11930; # (𑤵◌̴𑤰; 𑤵◌̴𑤰; 𑤵◌̴𑤰; 𑤵◌̴𑤰; 𑤵◌̴𑤰; ) DIVES AKURU VOWEL SIGN E, COMBINING TILDE OVERLAY, DIVES AKURU VOWEL SIGN AA +# +# EOF Index: gnu/usr.bin/perl/lib/unicore/NormalizationCorrections.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/NormalizationCorrections.txt,v diff -u -p -a -u -p -r1.6 NormalizationCorrections.txt --- gnu/usr.bin/perl/lib/unicore/NormalizationCorrections.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/NormalizationCorrections.txt 21 Feb 2024 15:47:02 -0000 @@ -1,10 +1,10 @@ -# NormalizationCorrections-14.0.0.txt -# Date: 2021-03-16, 22:07:00 GMT [KW, LI] -# © 2021 Unicode®, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# NormalizationCorrections-15.0.0.txt +# Date: 2022-05-03, 18:53:00 GMT [KW, LI] +# © 2022 Unicode®, Inc. +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # This file is a normative contributory data file in the # Unicode Character Database. Index: gnu/usr.bin/perl/lib/unicore/PropList.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/PropList.txt,v diff -u -p -a -u -p -r1.6 PropList.txt --- gnu/usr.bin/perl/lib/unicore/PropList.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/PropList.txt 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# PropList-14.0.0.txt -# Date: 2021-08-12, 23:13:05 GMT -# © 2021 Unicode®, Inc. +# PropList-15.0.0.txt +# Date: 2022-08-05, 22:17:16 GMT +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # ================================================ @@ -215,6 +215,7 @@ FF64 ; Terminal_Punctuation # P 11C41..11C43 ; Terminal_Punctuation # Po [3] BHAIKSUKI DANDA..BHAIKSUKI WORD SEPARATOR 11C71 ; Terminal_Punctuation # Po MARCHEN MARK SHAD 11EF7..11EF8 ; Terminal_Punctuation # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F43..11F44 ; Terminal_Punctuation # Po [2] KAWI DANDA..KAWI DOUBLE DANDA 12470..12474 ; Terminal_Punctuation # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON 16A6E..16A6F ; Terminal_Punctuation # Po [2] MRO DANDA..MRO DOUBLE DANDA 16AF5 ; Terminal_Punctuation # Po BASSA VAH FULL STOP @@ -224,7 +225,7 @@ FF64 ; Terminal_Punctuation # P 1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON -# Total code points: 276 +# Total code points: 278 # ================================================ @@ -507,6 +508,7 @@ FF41..FF46 ; Hex_Digit # L& [6] FUL 0BD7 ; Other_Alphabetic # Mc TAMIL AU LENGTH MARK 0C00 ; Other_Alphabetic # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE 0C01..0C03 ; Other_Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; Other_Alphabetic # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE 0C3E..0C40 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II 0C41..0C44 ; Other_Alphabetic # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR 0C46..0C48 ; Other_Alphabetic # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI @@ -524,6 +526,7 @@ FF41..FF46 ; Hex_Digit # L& [6] FUL 0CCC ; Other_Alphabetic # Mn KANNADA VOWEL SIGN AU 0CD5..0CD6 ; Other_Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK 0CE2..0CE3 ; Other_Alphabetic # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CF3 ; Other_Alphabetic # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT 0D00..0D01 ; Other_Alphabetic # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D02..0D03 ; Other_Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D3E..0D40 ; Other_Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II @@ -548,7 +551,7 @@ FF41..FF46 ; Hex_Digit # L& [6] FUL 0ECD ; Other_Alphabetic # Mn LAO NIGGAHITA 0F71..0F7E ; Other_Alphabetic # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO 0F7F ; Other_Alphabetic # Mc TIBETAN SIGN RNAM BCAD -0F80..0F81 ; Other_Alphabetic # Mn [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II +0F80..0F83 ; Other_Alphabetic # Mn [4] TIBETAN VOWEL SIGN REVERSED I..TIBETAN SIGN SNA LDAN 0F8D..0F97 ; Other_Alphabetic # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA 0F99..0FBC ; Other_Alphabetic # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA 102B..102C ; Other_Alphabetic # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA @@ -692,6 +695,7 @@ FB1E ; Other_Alphabetic # Mn 11002 ; Other_Alphabetic # Mc BRAHMI SIGN VISARGA 11038..11045 ; Other_Alphabetic # Mn [14] BRAHMI VOWEL SIGN AA..BRAHMI VOWEL SIGN AU 11073..11074 ; Other_Alphabetic # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O +11080..11081 ; Other_Alphabetic # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA 11082 ; Other_Alphabetic # Mc KAITHI SIGN VISARGA 110B0..110B2 ; Other_Alphabetic # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II 110B3..110B6 ; Other_Alphabetic # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI @@ -715,6 +719,7 @@ FB1E ; Other_Alphabetic # Mn 11234 ; Other_Alphabetic # Mn KHOJKI SIGN ANUSVARA 11237 ; Other_Alphabetic # Mn KHOJKI SIGN SHADDA 1123E ; Other_Alphabetic # Mn KHOJKI SIGN SUKUN +11241 ; Other_Alphabetic # Mn KHOJKI VOWEL SIGN VOCALIC R 112DF ; Other_Alphabetic # Mn KHUDAWADI SIGN ANUSVARA 112E0..112E2 ; Other_Alphabetic # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II 112E3..112E8 ; Other_Alphabetic # Mn [6] KHUDAWADI VOWEL SIGN U..KHUDAWADI VOWEL SIGN AU @@ -807,6 +812,12 @@ FB1E ; Other_Alphabetic # Mn 11D96 ; Other_Alphabetic # Mc GUNJALA GONDI SIGN VISARGA 11EF3..11EF4 ; Other_Alphabetic # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U 11EF5..11EF6 ; Other_Alphabetic # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11F00..11F01 ; Other_Alphabetic # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F03 ; Other_Alphabetic # Mc KAWI SIGN VISARGA +11F34..11F35 ; Other_Alphabetic # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; Other_Alphabetic # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; Other_Alphabetic # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; Other_Alphabetic # Mn KAWI VOWEL SIGN EU 16F4F ; Other_Alphabetic # Mn MIAO SIGN CONSONANT MODIFIER BAR 16F51..16F87 ; Other_Alphabetic # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI 16F8F..16F92 ; Other_Alphabetic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW @@ -817,12 +828,13 @@ FB1E ; Other_Alphabetic # Mn 1E01B..1E021 ; Other_Alphabetic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI 1E023..1E024 ; Other_Alphabetic # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS 1E026..1E02A ; Other_Alphabetic # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E08F ; Other_Alphabetic # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 1E947 ; Other_Alphabetic # Mn ADLAM HAMZA 1F130..1F149 ; Other_Alphabetic # So [26] SQUARED LATIN CAPITAL LETTER A..SQUARED LATIN CAPITAL LETTER Z 1F150..1F169 ; Other_Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1F170..1F189 ; Other_Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z -# Total code points: 1404 +# Total code points: 1425 # ================================================ @@ -840,14 +852,15 @@ FA70..FAD9 ; Ideographic # Lo [106] C 18D00..18D08 ; Ideographic # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB 20000..2A6DF ; Ideographic # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B738 ; Ideographic # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 +2A700..2B739 ; Ideographic # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 2B740..2B81D ; Ideographic # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Ideographic # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; Ideographic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D 30000..3134A ; Ideographic # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; Ideographic # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 101661 +# Total code points: 105854 # ================================================ @@ -1028,6 +1041,7 @@ FFE3 ; Diacritic # Sk FUL 10AE5..10AE6 ; Diacritic # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW 10D22..10D23 ; Diacritic # Lo [2] HANIFI ROHINGYA MARK SAKIN..HANIFI ROHINGYA MARK NA KHONNA 10D24..10D27 ; Diacritic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10EFD..10EFF ; Diacritic # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA 10F46..10F50 ; Diacritic # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW 10F82..10F85 ; Diacritic # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW 11046 ; Diacritic # Mn BRAHMI VIRAMA @@ -1064,6 +1078,7 @@ FFE3 ; Diacritic # Sk FUL 11D42 ; Diacritic # Mn MASARAM GONDI SIGN NUKTA 11D44..11D45 ; Diacritic # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA 11D97 ; Diacritic # Mn GUNJALA GONDI VIRAMA +13447..13455 ; Diacritic # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED 16AF0..16AF4 ; Diacritic # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 16B30..16B36 ; Diacritic # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 16F8F..16F92 ; Diacritic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW @@ -1079,6 +1094,7 @@ FFE3 ; Diacritic # Sk FUL 1D17B..1D182 ; Diacritic # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE 1D185..1D18B ; Diacritic # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE 1D1AA..1D1AD ; Diacritic # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1E030..1E06D ; Diacritic # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE 1E130..1E136 ; Diacritic # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D 1E2AE ; Diacritic # Mn TOTO SIGN RISING TONE 1E2EC..1E2EF ; Diacritic # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI @@ -1086,7 +1102,7 @@ FFE3 ; Diacritic # Sk FUL 1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK 1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA -# Total code points: 1064 +# Total code points: 1144 # ================================================ @@ -1135,6 +1151,7 @@ FF70 ; Extender # Lm HALF 02E0..02E4 ; Other_Lowercase # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP 0345 ; Other_Lowercase # Mn COMBINING GREEK YPOGEGRAMMENI 037A ; Other_Lowercase # Lm GREEK YPOGEGRAMMENI +10FC ; Other_Lowercase # Lm MODIFIER LETTER GEORGIAN NAR 1D2C..1D6A ; Other_Lowercase # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI 1D78 ; Other_Lowercase # Lm MODIFIER LETTER CYRILLIC EN 1D9B..1DBF ; Other_Lowercase # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA @@ -1146,14 +1163,17 @@ FF70 ; Extender # Lm HALF 2C7C..2C7D ; Other_Lowercase # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V A69C..A69D ; Other_Lowercase # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN A770 ; Other_Lowercase # Lm MODIFIER LETTER US +A7F2..A7F4 ; Other_Lowercase # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q A7F8..A7F9 ; Other_Lowercase # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE AB5C..AB5F ; Other_Lowercase # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB69 ; Other_Lowercase # Lm MODIFIER LETTER SMALL TURNED W 10780 ; Other_Lowercase # Lm MODIFIER LETTER SMALL CAPITAL AA 10783..10785 ; Other_Lowercase # Lm [3] MODIFIER LETTER SMALL AE..MODIFIER LETTER SMALL B WITH HOOK 10787..107B0 ; Other_Lowercase # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK 107B2..107BA ; Other_Lowercase # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +1E030..1E06D ; Other_Lowercase # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE -# Total code points: 244 +# Total code points: 311 # ================================================ @@ -1251,13 +1271,14 @@ FA21 ; Unified_Ideograph # Lo FA23..FA24 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24 FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29 20000..2A6DF ; Unified_Ideograph # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF -2A700..2B738 ; Unified_Ideograph # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738 +2A700..2B739 ; Unified_Ideograph # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 2B740..2B81D ; Unified_Ideograph # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D 2B820..2CEA1 ; Unified_Ideograph # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 2CEB0..2EBE0 ; Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 30000..3134A ; Unified_Ideograph # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; Unified_Ideograph # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF -# Total code points: 92865 +# Total code points: 97058 # ================================================ @@ -1323,8 +1344,10 @@ E0001 ; Deprecated # Cf LA 1D65E..1D65F ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J 1D692..1D693 ; Soft_Dotted # L& [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J 1DF1A ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK +1E04C..1E04D ; Soft_Dotted # Lm [2] MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I..MODIFIER LETTER CYRILLIC SMALL JE +1E068 ; Soft_Dotted # Lm CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I -# Total code points: 47 +# Total code points: 50 # ================================================ @@ -1430,6 +1453,7 @@ FF61 ; Sentence_Terminal # Po 11A9B..11A9C ; Sentence_Terminal # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD 11C41..11C42 ; Sentence_Terminal # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA 11EF7..11EF8 ; Sentence_Terminal # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F43..11F44 ; Sentence_Terminal # Po [2] KAWI DANDA..KAWI DOUBLE DANDA 16A6E..16A6F ; Sentence_Terminal # Po [2] MRO DANDA..MRO DOUBLE DANDA 16AF5 ; Sentence_Terminal # Po BASSA VAH FULL STOP 16B37..16B38 ; Sentence_Terminal # Po [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB @@ -1438,7 +1462,7 @@ FF61 ; Sentence_Terminal # Po 1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP 1DA88 ; Sentence_Terminal # Po SIGNWRITING FULL STOP -# Total code points: 152 +# Total code points: 154 # ================================================ Index: gnu/usr.bin/perl/lib/unicore/PropValueAliases.txt =================================================================== RCS file: /home/afresh1/OpenBSD-perl/OP/cvs/src/gnu/usr.bin/perl/lib/unicore/PropValueAliases.txt,v diff -u -p -a -u -p -r1.6 PropValueAliases.txt --- gnu/usr.bin/perl/lib/unicore/PropValueAliases.txt 15 Feb 2023 01:36:34 -0000 1.6 +++ gnu/usr.bin/perl/lib/unicore/PropValueAliases.txt 21 Feb 2024 15:47:02 -0000 @@ -1,11 +1,11 @@ -# PropertyValueAliases-14.0.0.txt -# Date: 2021-05-10, 21:08:53 GMT -# © 2021 Unicode®, Inc. +# PropertyValueAliases-15.0.0.txt +# Date: 2022-08-05, 23:42:17 GMT +# © 2022 Unicode®, Inc. # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html +# For terms of use, see https://www.unicode.org/terms_of_use.html # # Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see https://www.unicode.org/reports/tr44/ # # This file contains aliases for property values used in the UCD. # These names can be used for XML formats of UCD data, for regular-expression @@ -90,6 +90,7 @@ age; 12.0 ; age; 12.1 ; V12_1 age; 13.0 ; V13_0 age; 14.0 ; V14_0 +age; 15.0 ; V15_0 age; NA ; Unassigned # Alphabetic (Alpha) @@ -135,7 +136,6 @@ Bidi_M; Y ; # Bidi_Mirroring_Glyph (bmg) -# @missing: 0000..10FFFF; Bidi_Mirroring_Glyph; # Bidi_Paired_Bracket (bpb) @@ -162,6 +162,7 @@ blk; Ancient_Symbols ; blk; Arabic ; Arabic blk; Arabic_Ext_A ; Arabic_Extended_A blk; Arabic_Ext_B ; Arabic_Extended_B +blk; Arabic_Ext_C ; Arabic_Extended_C blk; Arabic_Math ; Arabic_Mathematical_Alphabetic_Symbols blk; Arabic_PF_A ; Arabic_Presentation_Forms_A ; Arabic_Presentation_Forms-A blk; Arabic_PF_B ; Arabic_Presentation_Forms_B @@ -206,6 +207,7 @@ blk; CJK_Ext_D ; blk; CJK_Ext_E ; CJK_Unified_Ideographs_Extension_E blk; CJK_Ext_F ; CJK_Unified_Ideographs_Extension_F blk; CJK_Ext_G ; CJK_Unified_Ideographs_Extension_G +blk; CJK_Ext_H ; CJK_Unified_Ideographs_Extension_H blk; CJK_Radicals_Sup ; CJK_Radicals_Supplement blk; CJK_Strokes ; CJK_Strokes blk; CJK_Symbols ; CJK_Symbols_And_Punctuation @@ -223,10 +225,12 @@ blk; Cyrillic ; blk; Cyrillic_Ext_A ; Cyrillic_Extended_A blk; Cyrillic_Ext_B ; Cyrillic_Extended_B blk; Cyrillic_Ext_C ; Cyrillic_Extended_C +blk; Cyrillic_Ext_D ; Cyrillic_Extended_D blk; Cyrillic_Sup ; Cyrillic_Supplement ; Cyrillic_Supplementary blk; Deseret ; Deseret blk; Devanagari ; Devanagari blk; Devanagari_Ext ; Devanagari_Extended +blk; Devanagari_Ext_A ; Devanagari_Extended_A blk; Diacriticals ; Combining_Diacritical_Marks blk; Diacriticals_Ext ; Combining_Diacritical_Marks_Extended blk; Diacriticals_For_Symbols ; Combining_Diacritical_Marks_For_Symbols; Combining_Marks_For_Symbols @@ -288,6 +292,7 @@ blk; Jamo_Ext_A ; blk; Jamo_Ext_B ; Hangul_Jamo_Extended_B blk; Javanese ; Javanese blk; Kaithi ; Kaithi +blk; Kaktovik_Numerals ; Kaktovik_Numerals blk; Kana_Ext_A ; Kana_Extended_A blk; Kana_Ext_B ; Kana_Extended_B blk; Kana_Sup ; Kana_Supplement @@ -296,6 +301,7 @@ blk; Kangxi ; blk; Kannada ; Kannada blk; Katakana ; Katakana blk; Katakana_Ext ; Katakana_Phonetic_Extensions +blk; Kawi ; Kawi blk; Kayah_Li ; Kayah_Li blk; Kharoshthi ; Kharoshthi blk; Khitan_Small_Script ; Khitan_Small_Script @@ -360,6 +366,7 @@ blk; Myanmar ; blk; Myanmar_Ext_A ; Myanmar_Extended_A blk; Myanmar_Ext_B ; Myanmar_Extended_B blk; Nabataean ; Nabataean +blk; Nag_Mundari ; Nag_Mundari blk; Nandinagari ; Nandinagari blk; NB ; No_Block blk; New_Tai_Lue ; New_Tai_Lue @@ -663,7 +670,6 @@ EPres; Y ; # Equivalent_Unified_Ideograph (EqUIdeo) -# @missing: 0000..10FFFF; Equivalent_Unified_Ideograph; # Expands_On_NFC (XO_NFC) @@ -1143,7 +1149,6 @@ NFD_QC; Y ; # NFKC_Casefold (NFKC_CF) -# @missing: 0000..10FFFF; NFKC_Casefold; # NFKC_Quick_Check (NFKC_QC) @@ -1313,6 +1318,7 @@ sc ; Ital ; sc ; Java ; Javanese sc ; Kali ; Kayah_Li sc ; Kana ; Katakana +sc ; Kawi ; Kawi sc ; Khar ; Kharoshthi sc ; Khmr ; Khmer sc ; Khoj ; Khojki @@ -1345,6 +1351,7 @@ sc ; Mroo ; sc ; Mtei ; Meetei_Mayek sc ; Mult ; Multani sc ; Mymr ; Myanmar +sc ; Nagm ; Nag_Mundari sc ; Nand ; Nandinagari sc ; Narb ; Old_North_Arabian sc ; Nbat ; Nabataean @@ -1418,7 +1425,6 @@ sc ; Zzzz ; # Script_Extensions (scx) -# @missing: 0000..10FFFF; Script_Extensions;